From 9b4d2c0fae12ac14e7ca3a25f9cd37f75f98d45d Mon Sep 17 00:00:00 2001 From: Bernd Zeimetz Date: Sat, 2 Feb 2019 18:33:20 +0100 Subject: Import viking_1.7.orig.tar.xz [dgit import orig viking_1.7.orig.tar.xz] --- ABOUT-NLS | 1068 + AUTHORS | 14 + COPYING | 340 + ChangeLog | 6759 ++++++ ChangeLog.0 | 1939 ++ HACKING | 89 + INSTALL | 368 + Makefile.am | 46 + Makefile.in | 903 + NEWS | 997 + README | 4 + README.md | 73 + TODO | 534 + aclocal.m4 | 2344 ++ compile | 348 + config.guess | 1480 ++ config.rpath | 666 + config.sub | 1801 ++ configure | 14858 +++++++++++++ configure.ac | 635 + data/Makefile.am | 10 + data/Makefile.in | 564 + data/datasources.xml | 8 + data/external_tools.xml | 18 + data/goto_tools.xml | 41 + data/latlontz.txt | 23328 ++++++++++++++++++++ data/maps.xml | 152 + data/routing.xml | 28 + depcomp | 791 + doc/GPSMAPPER | 13 + doc/Makefile.am | 5 + doc/Makefile.in | 682 + doc/examples/Makefile.am | 1 + doc/examples/Makefile.in | 499 + doc/examples/datasources.xml | 53 + doc/examples/external_tools.xml | 31 + doc/examples/goto_tools.xml | 26 + doc/examples/maps.xml | 81 + doc/reference/Makefile.am | 88 + doc/reference/Makefile.in | 894 + doc/reference/README | 24 + gnome-doc-utils.make | 706 + gtk-doc.make | 321 + help/C/attribution.xml | 126 + help/C/commandline.xml | 171 + help/C/figures/Aggregate_statistics.png | Bin 0 -> 35813 bytes help/C/figures/DEM_file_info_dialog.png | Bin 0 -> 20322 bytes help/C/figures/LayersTracksList.png | Bin 0 -> 91676 bytes help/C/figures/LayersTracksStatistics.png | Bin 0 -> 33593 bytes help/C/figures/Maps_download_region_dialog.png | Bin 0 -> 19363 bytes help/C/figures/Track_elevation_graph.png | Bin 0 -> 40044 bytes help/C/figures/Track_properties.png | Bin 0 -> 34931 bytes help/C/figures/Track_statistics.png | Bin 0 -> 64142 bytes help/C/figures/Trackpoint_edit_dialog.png | Bin 0 -> 46249 bytes help/C/figures/Viking-OSM-CycleMap-ManyTracks.jpg | Bin 0 -> 192961 bytes help/C/figures/WaypointsList.png | Bin 0 -> 43349 bytes help/C/figures/addtr_18.png | Bin 0 -> 341 bytes help/C/figures/addwp_18.png | Bin 0 -> 404 bytes help/C/figures/customize_toolbar_dialog.png | Bin 0 -> 54075 bytes help/C/figures/demdl_18.png | Bin 0 -> 685 bytes help/C/figures/edtr_18.png | Bin 0 -> 444 bytes help/C/figures/edwp_18.png | Bin 0 -> 425 bytes help/C/figures/geomove_18.png | Bin 0 -> 497 bytes help/C/figures/geozoom_18.png | Bin 0 -> 568 bytes help/C/figures/map_tile_info_dialog.png | Bin 0 -> 19396 bytes help/C/figures/mapdl_18.png | Bin 0 -> 497 bytes help/C/figures/mover_22.png | Bin 0 -> 235 bytes help/C/figures/properties_degree.png | Bin 0 -> 4109 bytes help/C/figures/properties_units.png | Bin 0 -> 5833 bytes help/C/figures/route_finder_18.png | Bin 0 -> 565 bytes help/C/figures/ruler_18.png | Bin 0 -> 416 bytes help/C/figures/select_18.png | Bin 0 -> 244 bytes help/C/figures/showpic_18.png | Bin 0 -> 430 bytes help/C/figures/trw_statusbar.png | Bin 0 -> 6913 bytes help/C/figures/vik_new_route_18.png | Bin 0 -> 343 bytes help/C/figures/zoom_18.png | Bin 0 -> 359 bytes help/C/figures/zoom_status_popup.png | Bin 0 -> 11947 bytes help/C/georef_layer.xml | 68 + help/C/legal.xml | 73 + help/C/mapnik_rendering_layer.xml | 105 + help/C/recommends.xml | 46 + help/C/viking.xml | 3977 ++++ help/Makefile.am | 73 + help/Makefile.in | 1257 ++ help/viking.omf.in | 10 + help/viking.xml.in | 732 + install-sh | 518 + intltool-extract.in | 0 intltool-merge.in | 0 intltool-update.in | 0 m4/expat.m4 | 45 + m4/gettext.m4 | 381 + m4/iconv.m4 | 180 + m4/intlmacosx.m4 | 51 + m4/lib-ld.m4 | 110 + m4/lib-link.m4 | 709 + m4/lib-prefix.m4 | 185 + m4/libcurl.m4 | 239 + m4/nls.m4 | 31 + m4/po.m4 | 449 + m4/progtest.m4 | 92 + mingw-viking.spec | 113 + mingw-viking.spec.in | 113 + mingw64-viking.spec | 112 + mingw64-viking.spec.in | 112 + missing | 215 + mkinstalldirs | 162 + po/ChangeLog | 492 + po/LINGUAS | 34 + po/Makefile.in.in | 221 + po/POTFILES.in | 75 + po/ast.po | 6124 +++++ po/ca.po | 6076 +++++ po/cs.po | 6279 ++++++ po/da.po | 6083 +++++ po/de.po | 6270 ++++++ po/el.po | 6085 +++++ po/en_GB.po | 6074 +++++ po/es.po | 6159 ++++++ po/eu.po | 6326 ++++++ po/fi.po | 6176 ++++++ po/fr.po | 6242 ++++++ po/he.po | 6071 +++++ po/hu.po | 6151 ++++++ po/id.po | 6089 +++++ po/it.po | 6183 ++++++ po/ja.po | 6077 +++++ po/jv.po | 6071 +++++ po/ko.po | 6070 +++++ po/ku.po | 6071 +++++ po/lt.po | 6147 ++++++ po/lv.po | 6072 +++++ po/nb.po | 6091 +++++ po/nl.po | 6120 +++++ po/pl.po | 6107 +++++ po/pt_BR.po | 6154 ++++++ po/ru.po | 6325 ++++++ po/sk.po | 6084 +++++ po/sl.po | 6101 +++++ po/sv.po | 6115 +++++ po/tr.po | 6097 +++++ po/uk.po | 6076 +++++ po/zh_CN.po | 6214 ++++++ po/zh_TW.po | 6085 +++++ src/Makefile.am | 259 + src/Makefile.in | 1705 ++ src/acquire.c | 560 + src/acquire.h | 198 + src/authors.h | 17 + src/babel.c | 742 + src/babel.h | 131 + src/babel_ui.c | 185 + src/babel_ui.h | 41 + src/background.c | 422 + src/background.h | 56 + src/bbox.h | 44 + src/bing.c | 51 + src/bing.h | 28 + src/bingmapsource.c | 551 + src/bingmapsource.h | 55 + src/bluemarble.c | 48 + src/bluemarble.h | 28 + src/clipboard.c | 525 + src/clipboard.h | 43 + src/compression.c | 231 + src/compression.h | 37 + src/config.h | 327 + src/config.h.in | 326 + src/coords.c | 304 + src/coords.h | 90 + src/curl_download.c | 328 + src/curl_download.h | 65 + src/datasource_bfilter.c | 309 + src/datasource_file.c | 197 + src/datasource_gc.c | 271 + src/datasource_geojson.c | 171 + src/datasource_geotag.c | 187 + src/datasource_gps.c | 767 + src/datasource_gps.h | 45 + src/datasource_osm.c | 131 + src/datasource_osm_my_traces.c | 720 + src/datasource_routing.c | 148 + src/datasource_url.c | 168 + src/datasource_wikipedia.c | 68 + src/datasources.h | 50 + src/degrees_converters.c | 210 + src/degrees_converters.h | 42 + src/dem.c | 617 + src/dem.h | 84 + src/dems.c | 281 + src/dems.h | 52 + src/dialog.c | 783 + src/dialog.h | 74 + src/dir.c | 136 + src/dir.h | 37 + src/docbook2documenters.xsl | 41 + src/documenters.h | 10 + src/download.c | 508 + src/download.h | 103 + src/expedia.c | 206 + src/expedia.h | 36 + src/file.c | 920 + src/file.h | 72 + src/file_magic.c | 80 + src/file_magic.h | 34 + src/fileutils.c | 192 + src/fileutils.h | 38 + src/garminsymbols.c | 471 + src/garminsymbols.h | 39 + src/geojson.c | 188 + src/geojson.h | 38 + src/geonames.c | 44 + src/geonames.h | 27 + src/geonamessearch.c | 497 + src/geonamessearch.h | 33 + src/geotag_exif.c | 906 + src/geotag_exif.h | 51 + src/globals.c | 432 + src/globals.h | 273 + src/google.c | 88 + src/google.h | 28 + src/googlesearch.c | 171 + src/googlesearch.h | 58 + src/gpsmapper.c | 150 + src/gpsmapper.h | 33 + src/gpspoint.c | 836 + src/gpspoint.h | 34 + src/gpx.c | 1361 ++ src/gpx.h | 49 + src/icons/Makefile.am | 309 + src/icons/Makefile.in | 923 + src/icons/addtr_18.png | Bin 0 -> 341 bytes src/icons/addwp_18.png | Bin 0 -> 404 bytes src/icons/bing_maps.png | Bin 0 -> 4295 bytes src/icons/cursor_addtr.png | Bin 0 -> 762 bytes src/icons/cursor_addwp.png | Bin 0 -> 791 bytes src/icons/cursor_demdl.png | Bin 0 -> 958 bytes src/icons/cursor_edtr.png | Bin 0 -> 706 bytes src/icons/cursor_edwp.png | Bin 0 -> 822 bytes src/icons/cursor_geomove.png | Bin 0 -> 783 bytes src/icons/cursor_geozoom.png | Bin 0 -> 860 bytes src/icons/cursor_mapdl.png | Bin 0 -> 780 bytes src/icons/cursor_new_route.png | Bin 0 -> 747 bytes src/icons/cursor_route_finder.png | Bin 0 -> 1042 bytes src/icons/cursor_ruler.png | Bin 0 -> 713 bytes src/icons/cursor_showpic.png | Bin 0 -> 803 bytes src/icons/cursor_splitter.png | Bin 0 -> 7032 bytes src/icons/cursor_zoom.png | Bin 0 -> 941 bytes src/icons/demdl_18.png | Bin 0 -> 685 bytes src/icons/edtr_18.png | Bin 0 -> 444 bytes src/icons/edwp_18.png | Bin 0 -> 425 bytes src/icons/geomove_18.png | Bin 0 -> 497 bytes src/icons/geozoom_18.png | Bin 0 -> 568 bytes src/icons/icons.c | 261 + src/icons/icons.h | 260 + src/icons/mapdl_18.png | Bin 0 -> 497 bytes src/icons/mover_22.png | Bin 0 -> 235 bytes src/icons/route_finder_18.png | Bin 0 -> 565 bytes src/icons/ruler_18.png | Bin 0 -> 416 bytes src/icons/select_18.png | Bin 0 -> 244 bytes src/icons/showpic_18.png | Bin 0 -> 430 bytes src/icons/splitter_18.png | Bin 0 -> 254 bytes src/icons/thumbnails.png | Bin 0 -> 981 bytes src/icons/vik_new_route_18.png | Bin 0 -> 343 bytes src/icons/vikaggregatelayer.png | Bin 0 -> 645 bytes src/icons/vikcoordlayer.png | Bin 0 -> 763 bytes src/icons/vikdemlayer.png | Bin 0 -> 229 bytes src/icons/vikgeoreflayer.png | Bin 0 -> 622 bytes src/icons/vikgpslayer.png | Bin 0 -> 168 bytes src/icons/viking.png | Bin 0 -> 4401 bytes src/icons/vikmapniklayer.png | Bin 0 -> 1264 bytes src/icons/vikmapslayer.png | Bin 0 -> 412 bytes src/icons/viktrwlayer.png | Bin 0 -> 473 bytes src/icons/viktrwlayer_external.png | Bin 0 -> 372 bytes src/icons/viktrwlayer_external_nowrite.png | Bin 0 -> 280 bytes src/icons/wp_1st_aid.png | Bin 0 -> 154 bytes src/icons/wp_1st_aid_large.png | Bin 0 -> 232 bytes src/icons/wp_airplane.png | Bin 0 -> 124 bytes src/icons/wp_airplane_large.png | Bin 0 -> 400 bytes src/icons/wp_amuse_pk_large.png | Bin 0 -> 440 bytes src/icons/wp_anchor.png | Bin 0 -> 337 bytes src/icons/wp_anchor_large.png | Bin 0 -> 425 bytes src/icons/wp_animal_tracks_large.png | Bin 0 -> 1108 bytes src/icons/wp_atv_large.png | Bin 0 -> 1163 bytes src/icons/wp_ball.png | Bin 0 -> 150 bytes src/icons/wp_ball_large.png | Bin 0 -> 364 bytes src/icons/wp_beach.png | Bin 0 -> 141 bytes src/icons/wp_beach_large.png | Bin 0 -> 455 bytes src/icons/wp_bell.png | Bin 0 -> 150 bytes src/icons/wp_bell_large.png | Bin 0 -> 320 bytes src/icons/wp_big_game_large.png | Bin 0 -> 1220 bytes src/icons/wp_bike_trail_large.png | Bin 0 -> 514 bytes src/icons/wp_blind_large.png | Bin 0 -> 997 bytes src/icons/wp_block_blue_large.png | Bin 0 -> 575 bytes src/icons/wp_block_green_large.png | Bin 0 -> 658 bytes src/icons/wp_block_red_large.png | Bin 0 -> 560 bytes src/icons/wp_blood_trail_large.png | Bin 0 -> 1397 bytes src/icons/wp_boat_ramp.png | Bin 0 -> 180 bytes src/icons/wp_boat_ramp_large.png | Bin 0 -> 652 bytes src/icons/wp_bowling_large.png | Bin 0 -> 447 bytes src/icons/wp_bridge.png | Bin 0 -> 189 bytes src/icons/wp_bridge_large.png | Bin 0 -> 507 bytes src/icons/wp_building.png | Bin 0 -> 153 bytes src/icons/wp_building_large.png | Bin 0 -> 698 bytes src/icons/wp_buoy_ambr.png | Bin 0 -> 167 bytes src/icons/wp_buoy_ambr_large.png | Bin 0 -> 444 bytes src/icons/wp_buoy_blck.png | Bin 0 -> 158 bytes src/icons/wp_buoy_blck_large.png | Bin 0 -> 453 bytes src/icons/wp_buoy_blue.png | Bin 0 -> 171 bytes src/icons/wp_buoy_blue_large.png | Bin 0 -> 452 bytes src/icons/wp_buoy_grn.png | Bin 0 -> 166 bytes src/icons/wp_buoy_grn_large.png | Bin 0 -> 335 bytes src/icons/wp_buoy_grn_red.png | Bin 0 -> 172 bytes src/icons/wp_buoy_grn_red_large.png | Bin 0 -> 395 bytes src/icons/wp_buoy_grn_wht.png | Bin 0 -> 170 bytes src/icons/wp_buoy_grn_wht_large.png | Bin 0 -> 358 bytes src/icons/wp_buoy_orng.png | Bin 0 -> 177 bytes src/icons/wp_buoy_orng_large.png | Bin 0 -> 433 bytes src/icons/wp_buoy_red.png | Bin 0 -> 168 bytes src/icons/wp_buoy_red_grn.png | Bin 0 -> 168 bytes src/icons/wp_buoy_red_grn_large.png | Bin 0 -> 387 bytes src/icons/wp_buoy_red_large.png | Bin 0 -> 390 bytes src/icons/wp_buoy_red_wht.png | Bin 0 -> 168 bytes src/icons/wp_buoy_red_wht_large.png | Bin 0 -> 366 bytes src/icons/wp_buoy_violet.png | Bin 0 -> 170 bytes src/icons/wp_buoy_violet_large.png | Bin 0 -> 488 bytes src/icons/wp_buoy_wht.png | Bin 0 -> 169 bytes src/icons/wp_buoy_wht_grn.png | Bin 0 -> 173 bytes src/icons/wp_buoy_wht_grn_large.png | Bin 0 -> 383 bytes src/icons/wp_buoy_wht_large.png | Bin 0 -> 319 bytes src/icons/wp_buoy_wht_red.png | Bin 0 -> 172 bytes src/icons/wp_buoy_wht_red_large.png | Bin 0 -> 410 bytes src/icons/wp_camp.png | Bin 0 -> 474 bytes src/icons/wp_camp_large.png | Bin 0 -> 481 bytes src/icons/wp_cap_cty.png | Bin 0 -> 269 bytes src/icons/wp_car.png | Bin 0 -> 391 bytes src/icons/wp_car_large.png | Bin 0 -> 511 bytes src/icons/wp_car_rental_large.png | Bin 0 -> 486 bytes src/icons/wp_car_repair_large.png | Bin 0 -> 496 bytes src/icons/wp_cemetery.png | Bin 0 -> 162 bytes src/icons/wp_cemetery_large.png | Bin 0 -> 359 bytes src/icons/wp_church.png | Bin 0 -> 157 bytes src/icons/wp_church_large.png | Bin 0 -> 429 bytes src/icons/wp_civil_large.png | Bin 0 -> 520 bytes src/icons/wp_controlled.png | Bin 0 -> 157 bytes src/icons/wp_controlled_large.png | Bin 0 -> 251 bytes src/icons/wp_conv_store_large.png | Bin 0 -> 397 bytes src/icons/wp_cover_large.png | Bin 0 -> 1426 bytes src/icons/wp_covey_large.png | Bin 0 -> 854 bytes src/icons/wp_crossing_large.png | Bin 0 -> 479 bytes src/icons/wp_dam.png | Bin 0 -> 120 bytes src/icons/wp_dam_large.png | Bin 0 -> 456 bytes src/icons/wp_danger.png | Bin 0 -> 148 bytes src/icons/wp_danger_large.png | Bin 0 -> 264 bytes src/icons/wp_deer.png | Bin 0 -> 437 bytes src/icons/wp_deer_large.png | Bin 0 -> 332 bytes src/icons/wp_diamond_grn.png | Bin 0 -> 143 bytes src/icons/wp_diamond_red.png | Bin 0 -> 144 bytes src/icons/wp_dive1.png | Bin 0 -> 142 bytes src/icons/wp_dive1_large.png | Bin 0 -> 243 bytes src/icons/wp_dive2.png | Bin 0 -> 136 bytes src/icons/wp_dive2_large.png | Bin 0 -> 423 bytes src/icons/wp_dollar.png | Bin 0 -> 512 bytes src/icons/wp_dollar_large.png | Bin 0 -> 322 bytes src/icons/wp_dot.png | Bin 0 -> 106 bytes src/icons/wp_drinking_wtr.png | Bin 0 -> 149 bytes src/icons/wp_drinking_wtr_large.png | Bin 0 -> 333 bytes src/icons/wp_exit_large.png | Bin 0 -> 640 bytes src/icons/wp_fastfood_large.png | Bin 0 -> 464 bytes src/icons/wp_fhs_facility_large.png | Bin 0 -> 683 bytes src/icons/wp_fish.png | Bin 0 -> 148 bytes src/icons/wp_fish_large.png | Bin 0 -> 399 bytes src/icons/wp_fitness_large.png | Bin 0 -> 397 bytes src/icons/wp_flag.png | Bin 0 -> 297 bytes src/icons/wp_flag_blue_large.png | Bin 0 -> 482 bytes src/icons/wp_flag_green_large.png | Bin 0 -> 368 bytes src/icons/wp_flag_red_large.png | Bin 0 -> 381 bytes src/icons/wp_food_source_large.png | Bin 0 -> 1314 bytes src/icons/wp_forest.png | Bin 0 -> 329 bytes src/icons/wp_forest_large.png | Bin 0 -> 328 bytes src/icons/wp_fuel.png | Bin 0 -> 146 bytes src/icons/wp_fuel_large.png | Bin 0 -> 404 bytes src/icons/wp_furbearer_large.png | Bin 0 -> 1705 bytes src/icons/wp_geocache.png | Bin 0 -> 557 bytes src/icons/wp_geocache_fnd.png | Bin 0 -> 587 bytes src/icons/wp_geocache_fnd_large.png | Bin 0 -> 593 bytes src/icons/wp_geocache_large.png | Bin 0 -> 506 bytes src/icons/wp_glider_large.png | Bin 0 -> 313 bytes src/icons/wp_golf.png | Bin 0 -> 263 bytes src/icons/wp_golf_large.png | Bin 0 -> 308 bytes src/icons/wp_grnd_trans_large.png | Bin 0 -> 423 bytes src/icons/wp_helipad_large.png | Bin 0 -> 461 bytes src/icons/wp_horn.png | Bin 0 -> 185 bytes src/icons/wp_horn_large.png | Bin 0 -> 283 bytes src/icons/wp_house.png | Bin 0 -> 360 bytes src/icons/wp_house_large.png | Bin 0 -> 733 bytes src/icons/wp_ice_skating.png | Bin 0 -> 406 bytes src/icons/wp_ice_skating_large.png | Bin 0 -> 565 bytes src/icons/wp_info.png | Bin 0 -> 146 bytes src/icons/wp_info_large.png | Bin 0 -> 505 bytes src/icons/wp_knife.png | Bin 0 -> 129 bytes src/icons/wp_knife_large.png | Bin 0 -> 639 bytes src/icons/wp_light.png | Bin 0 -> 155 bytes src/icons/wp_light_large.png | Bin 0 -> 281 bytes src/icons/wp_lodge_large.png | Bin 0 -> 419 bytes src/icons/wp_lodging_large.png | Bin 0 -> 371 bytes src/icons/wp_lrg_cty.png | Bin 0 -> 265 bytes src/icons/wp_lrg_cty_large.png | Bin 0 -> 281 bytes src/icons/wp_med_cty.png | Bin 0 -> 256 bytes src/icons/wp_med_cty_large.png | Bin 0 -> 250 bytes src/icons/wp_military.png | Bin 0 -> 166 bytes src/icons/wp_mine.png | Bin 0 -> 147 bytes src/icons/wp_mine_large.png | Bin 0 -> 402 bytes src/icons/wp_mob.png | Bin 0 -> 143 bytes src/icons/wp_mob_large.png | Bin 0 -> 241 bytes src/icons/wp_movie_large.png | Bin 0 -> 439 bytes src/icons/wp_mug.png | Bin 0 -> 157 bytes src/icons/wp_mug_large.png | Bin 0 -> 473 bytes src/icons/wp_museum_large.png | Bin 0 -> 342 bytes src/icons/wp_null.png | Bin 0 -> 77 bytes src/icons/wp_oil_field_large.png | Bin 0 -> 245 bytes src/icons/wp_parachute_large.png | Bin 0 -> 353 bytes src/icons/wp_park.png | Bin 0 -> 167 bytes src/icons/wp_park_large.png | Bin 0 -> 316 bytes src/icons/wp_parking.png | Bin 0 -> 403 bytes src/icons/wp_parking_large.png | Bin 0 -> 414 bytes src/icons/wp_pharmacy_large.png | Bin 0 -> 375 bytes src/icons/wp_phone.png | Bin 0 -> 150 bytes src/icons/wp_phone_large.png | Bin 0 -> 571 bytes src/icons/wp_picnic.png | Bin 0 -> 119 bytes src/icons/wp_picnic_large.png | Bin 0 -> 379 bytes src/icons/wp_pin_blue_large.png | Bin 0 -> 484 bytes src/icons/wp_pin_green_large.png | Bin 0 -> 372 bytes src/icons/wp_pin_red_large.png | Bin 0 -> 429 bytes src/icons/wp_pizza_large.png | Bin 0 -> 397 bytes src/icons/wp_police_large.png | Bin 0 -> 397 bytes src/icons/wp_post_ofc_large.png | Bin 0 -> 437 bytes src/icons/wp_rbcn.png | Bin 0 -> 148 bytes src/icons/wp_rbcn_large.png | Bin 0 -> 384 bytes src/icons/wp_restricted.png | Bin 0 -> 150 bytes src/icons/wp_restricted_large.png | Bin 0 -> 255 bytes src/icons/wp_restroom.png | Bin 0 -> 142 bytes src/icons/wp_restroom_large.png | Bin 0 -> 593 bytes src/icons/wp_rv_park.png | Bin 0 -> 153 bytes src/icons/wp_rv_park_large.png | Bin 0 -> 371 bytes src/icons/wp_scenic.png | Bin 0 -> 142 bytes src/icons/wp_scenic_large.png | Bin 0 -> 454 bytes src/icons/wp_school.png | Bin 0 -> 157 bytes src/icons/wp_school_large.png | Bin 0 -> 442 bytes src/icons/wp_shopping_large.png | Bin 0 -> 483 bytes src/icons/wp_short_tower_large.png | Bin 0 -> 304 bytes src/icons/wp_shower.png | Bin 0 -> 135 bytes src/icons/wp_shower_large.png | Bin 0 -> 512 bytes src/icons/wp_ski_resort_large.png | Bin 0 -> 697 bytes src/icons/wp_skiing.png | Bin 0 -> 138 bytes src/icons/wp_skiing_large.png | Bin 0 -> 487 bytes src/icons/wp_skull.png | Bin 0 -> 169 bytes src/icons/wp_skull_large.png | Bin 0 -> 461 bytes src/icons/wp_small_game_large.png | Bin 0 -> 1321 bytes src/icons/wp_sml_cty.png | Bin 0 -> 211 bytes src/icons/wp_sml_cty_large.png | Bin 0 -> 220 bytes src/icons/wp_square_grn.png | Bin 0 -> 106 bytes src/icons/wp_square_red.png | Bin 0 -> 109 bytes src/icons/wp_stadium_large.png | Bin 0 -> 279 bytes src/icons/wp_store_large.png | Bin 0 -> 301 bytes src/icons/wp_summit.png | Bin 0 -> 310 bytes src/icons/wp_summit_large.png | Bin 0 -> 306 bytes src/icons/wp_swimming.png | Bin 0 -> 117 bytes src/icons/wp_swimming_large.png | Bin 0 -> 443 bytes src/icons/wp_tall_tower_large.png | Bin 0 -> 306 bytes src/icons/wp_theater_large.png | Bin 0 -> 496 bytes src/icons/wp_toll_booth_large.png | Bin 0 -> 319 bytes src/icons/wp_trail_head_large.png | Bin 0 -> 651 bytes src/icons/wp_tree_stand_large.png | Bin 0 -> 1111 bytes src/icons/wp_treed_quarry_large.png | Bin 0 -> 1084 bytes src/icons/wp_truck_large.png | Bin 0 -> 880 bytes src/icons/wp_truck_stop_large.png | Bin 0 -> 366 bytes src/icons/wp_tunnel.png | Bin 0 -> 168 bytes src/icons/wp_tunnel_large.png | Bin 0 -> 445 bytes src/icons/wp_ultralight_large.png | Bin 0 -> 354 bytes src/icons/wp_upland_game_large.png | Bin 0 -> 1201 bytes src/icons/wp_water_source_large.png | Bin 0 -> 979 bytes src/icons/wp_waterfowl_large.png | Bin 0 -> 1123 bytes src/icons/wp_wbuoy.png | Bin 0 -> 150 bytes src/icons/wp_wbuoy_large.png | Bin 0 -> 253 bytes src/icons/wp_weigh_station_large.png | Bin 0 -> 343 bytes src/icons/wp_wpt_dot.png | Bin 0 -> 422 bytes src/icons/wp_wreck.png | Bin 0 -> 151 bytes src/icons/wp_wreck_large.png | Bin 0 -> 331 bytes src/icons/wp_wrecker_large.png | Bin 0 -> 371 bytes src/icons/wp_zoo_large.png | Bin 0 -> 451 bytes src/icons/zoom_18.png | Bin 0 -> 359 bytes src/jpg.c | 103 + src/jpg.h | 35 + src/kmz.c | 496 + src/kmz.h | 37 + src/libgeoclue.c | 119 + src/libgeoclue.h | 39 + src/libjpeg/jpeg-data.c | 485 + src/libjpeg/jpeg-data.h | 92 + src/libjpeg/jpeg-marker.c | 122 + src/libjpeg/jpeg-marker.h | 103 + src/main.c | 299 + src/map_ids.h | 54 + src/mapcache.c | 338 + src/mapcache.h | 48 + src/mapcoord.h | 40 + src/mapnik_interface.cpp | 330 + src/mapnik_interface.h | 56 + src/maputils.c | 156 + src/maputils.h | 47 + src/md5_hash.c | 61 + src/md5_hash.h | 32 + src/menu.xml.h | 132 + src/metatile.c | 191 + src/metatile.h | 28 + src/misc/fpconv-license.txt | 22 + src/misc/fpconv.c | 359 + src/misc/fpconv.h | 34 + src/misc/gtkhtml-private.h | 32 + src/misc/gtkhtml.c | 193 + src/misc/kdtree.c | 836 + src/misc/kdtree.h | 129 + src/misc/powers.h | 87 + src/misc/strtod.c | 158 + src/misc/strtod.h | 22 + src/modules.c | 303 + src/modules.h | 29 + src/osm-traces.c | 830 + src/osm-traces.h | 45 + src/osm.c | 225 + src/osm.h | 27 + src/preferences.c | 320 + src/preferences.h | 61 + src/print-preview.c | 590 + src/print-preview.h | 91 + src/print.c | 674 + src/print.h | 35 + src/settings.c | 294 + src/settings.h | 58 + src/srtm_continent.c | 2960 +++ src/terraserver.c | 38 + src/terraserver.h | 36 + src/terraservermapsource.c | 287 + src/terraservermapsource.h | 55 + src/thumbnails.c | 323 + src/thumbnails.h | 41 + src/toolbar.c | 1203 + src/toolbar.h | 80 + src/toolbar.xml.h | 51 + src/ui_util.c | 342 + src/ui_util.h | 50 + src/uibuilder.c | 630 + src/uibuilder.h | 211 + src/util.c | 341 + src/util.h | 81 + src/vik_compat.c | 44 + src/vik_compat.h | 53 + src/vikaggregatelayer.c | 1029 + src/vikaggregatelayer.h | 74 + src/vikcoord.c | 227 + src/vikcoord.h | 68 + src/vikcoordlayer.c | 412 + src/vikcoordlayer.h | 47 + src/vikdatetime_edit_dialog.c | 138 + src/vikdatetime_edit_dialog.h | 35 + src/vikdemlayer.c | 1313 ++ src/vikdemlayer.h | 47 + src/vikenumtypes.c | 37 + src/vikenumtypes.c.template | 40 + src/vikenumtypes.h | 18 + src/vikenumtypes.h.template | 28 + src/vikexttool.c | 185 + src/vikexttool.h | 62 + src/vikexttool_datasources.c | 89 + src/vikexttool_datasources.h | 40 + src/vikexttools.c | 119 + src/vikexttools.h | 39 + src/vikfileentry.c | 191 + src/vikfileentry.h | 66 + src/vikfilelist.c | 231 + src/vikfilelist.h | 54 + src/vikgeoreflayer.c | 1207 + src/vikgeoreflayer.h | 56 + src/vikgobjectbuilder.c | 256 + src/vikgobjectbuilder.h | 57 + src/vikgoto.c | 534 + src/vikgoto.h | 40 + src/vikgototool.c | 319 + src/vikgototool.h | 73 + src/vikgotoxmltool.c | 590 + src/vikgotoxmltool.h | 59 + src/vikgpslayer.c | 2088 ++ src/vikgpslayer.h | 78 + src/viking.desktop.in | 12 + src/viking.h | 68 + src/viklayer.c | 705 + src/viklayer.h | 331 + src/viklayer_defaults.c | 418 + src/viklayer_defaults.h | 42 + src/viklayerspanel.c | 1025 + src/viklayerspanel.h | 82 + src/vikmapniklayer.c | 1161 + src/vikmapniklayer.h | 47 + src/vikmapslayer.c | 2580 +++ src/vikmapslayer.h | 75 + src/vikmapslayer_compat.c | 39 + src/vikmapslayer_compat.h | 48 + src/vikmapsource.c | 503 + src/vikmapsource.h | 115 + src/vikmapsourcedefault.c | 604 + src/vikmapsourcedefault.h | 62 + src/vikmaptype.c | 210 + src/vikmaptype.h | 55 + src/vikradiogroup.c | 163 + src/vikradiogroup.h | 54 + src/vikrouting.c | 336 + src/vikrouting.h | 57 + src/vikroutingengine.c | 347 + src/vikroutingengine.h | 75 + src/vikroutingwebengine.c | 624 + src/vikroutingwebengine.h | 54 + src/vikslippymapsource.c | 651 + src/vikslippymapsource.h | 57 + src/vikstatus.c | 199 + src/vikstatus.h | 65 + src/viktmsmapsource.c | 574 + src/viktmsmapsource.h | 55 + src/viktrack.c | 2014 ++ src/viktrack.h | 177 + src/viktreeview.c | 927 + src/viktreeview.h | 105 + src/viktrwlayer.c | 11860 ++++++++++ src/viktrwlayer.h | 185 + src/viktrwlayer_analysis.c | 669 + src/viktrwlayer_analysis.h | 41 + src/viktrwlayer_export.c | 324 + src/viktrwlayer_export.h | 40 + src/viktrwlayer_geotag.c | 767 + src/viktrwlayer_geotag.h | 39 + src/viktrwlayer_propwin.c | 3749 ++++ src/viktrwlayer_propwin.h | 51 + src/viktrwlayer_tpwin.c | 626 + src/viktrwlayer_tpwin.h | 66 + src/viktrwlayer_tracklist.c | 756 + src/viktrwlayer_tracklist.h | 38 + src/viktrwlayer_waypointlist.c | 721 + src/viktrwlayer_waypointlist.h | 38 + src/viktrwlayer_wpwin.c | 458 + src/viktrwlayer_wpwin.h | 40 + src/vikutils.c | 1001 + src/vikutils.h | 58 + src/vikviewport.c | 1763 ++ src/vikviewport.h | 192 + src/vikwaypoint.c | 292 + src/vikwaypoint.h | 85 + src/vikwebtool.c | 104 + src/vikwebtool.h | 61 + src/vikwebtool_datasource.c | 529 + src/vikwebtool_datasource.h | 63 + src/vikwebtoolbounds.c | 199 + src/vikwebtoolbounds.h | 58 + src/vikwebtoolcenter.c | 217 + src/vikwebtoolcenter.h | 60 + src/vikwebtoolformat.c | 300 + src/vikwebtoolformat.h | 62 + src/vikwindow.c | 5296 +++++ src/vikwindow.h | 113 + src/vikwmscmapsource.c | 582 + src/vikwmscmapsource.h | 55 + test-driver | 148 + test/Makefile.am | 114 + test/Makefile.in | 1267 ++ test/README | 7 + test/SF#022.gpx | 16 + test/Stonehenge.jpg | Bin 0 -> 272539 bytes test/ViewFromCribyn-Wales-GPS.jpg | Bin 0 -> 251754 bytes test/check_babel.sh | 5 + test/check_decimal_output.sh | 38 + test/check_degrees_conversions.sh | 38 + test/check_geotag.sh | 49 + test/check_gpx.sh | 16 + test/check_md5_hash.sh | 13 + test/check_metatile.sh | 13 + test/degrees_converter.c | 26 + test/geotag_read.c | 21 + test/geotag_write.c | 27 + test/gpx2gpx.c | 33 + test/metatile_example/13/0/0/250/220/0.meta | Bin 0 -> 491849 bytes test/test_babel.c | 36 + test/test_coord_conversion.c | 76 + test/test_decimal_output.c | 29 + test/test_md5_hash.c | 24 + test/test_metatile.c | 88 + test/test_time.c | 47 + test/test_vikgotoxmltool.c | 49 + tools/Makefile.am | 7 + tools/Makefile.in | 508 + tools/README | 40 + tools/geo-html2gpx | 2191 ++ tools/geo-nearest | 2406 ++ tools/googledirections | 4 + tools/images2waypoints.pl | 376 + tools/viking-cache.py | 482 + viking.spec | 92 + viking.spec.in | 92 + windows/Makefile.am | 10 + windows/Makefile.in | 689 + windows/README.txt | 121 + windows/configure_and_make.bat | 12 + windows/installer-mingw.sh | 160 + windows/installer.bat | 156 + windows/installer/FileAssociation.nsh | 190 + windows/installer/Makefile.am | 7 + windows/installer/Makefile.in | 684 + windows/installer/langmacros.nsh | 72 + windows/installer/pixmaps/Makefile.am | 4 + windows/installer/pixmaps/Makefile.in | 502 + windows/installer/pixmaps/viking_icon.ico | Bin 0 -> 29926 bytes windows/installer/pixmaps/viking_icon.rc | 1 + windows/installer/translations/Makefile.am | 5 + windows/installer/translations/Makefile.in | 503 + windows/installer/translations/english.nsh | 47 + windows/installer/translations/french.nsh | 44 + windows/installer/translations/spanish.nsh | 43 + windows/installer/viking-installer.nsi | 585 + windows/make.bat | 13 + windows/prepare.bat | 618 + 728 files changed, 384904 insertions(+) create mode 100644 ABOUT-NLS create mode 100644 AUTHORS create mode 100644 COPYING create mode 100644 ChangeLog create mode 100644 ChangeLog.0 create mode 100644 HACKING create mode 100644 INSTALL create mode 100644 Makefile.am create mode 100644 Makefile.in create mode 100644 NEWS create mode 100644 README create mode 100644 README.md create mode 100644 TODO create mode 100644 aclocal.m4 create mode 100755 compile create mode 100755 config.guess create mode 100755 config.rpath create mode 100755 config.sub create mode 100755 configure create mode 100644 configure.ac create mode 100644 data/Makefile.am create mode 100644 data/Makefile.in create mode 100644 data/datasources.xml create mode 100644 data/external_tools.xml create mode 100644 data/goto_tools.xml create mode 100644 data/latlontz.txt create mode 100644 data/maps.xml create mode 100644 data/routing.xml create mode 100755 depcomp create mode 100644 doc/GPSMAPPER create mode 100644 doc/Makefile.am create mode 100644 doc/Makefile.in create mode 100644 doc/examples/Makefile.am create mode 100644 doc/examples/Makefile.in create mode 100644 doc/examples/datasources.xml create mode 100644 doc/examples/external_tools.xml create mode 100644 doc/examples/goto_tools.xml create mode 100644 doc/examples/maps.xml create mode 100644 doc/reference/Makefile.am create mode 100644 doc/reference/Makefile.in create mode 100644 doc/reference/README create mode 100644 gnome-doc-utils.make create mode 100644 gtk-doc.make create mode 100644 help/C/attribution.xml create mode 100644 help/C/commandline.xml create mode 100644 help/C/figures/Aggregate_statistics.png create mode 100644 help/C/figures/DEM_file_info_dialog.png create mode 100644 help/C/figures/LayersTracksList.png create mode 100644 help/C/figures/LayersTracksStatistics.png create mode 100644 help/C/figures/Maps_download_region_dialog.png create mode 100644 help/C/figures/Track_elevation_graph.png create mode 100644 help/C/figures/Track_properties.png create mode 100644 help/C/figures/Track_statistics.png create mode 100644 help/C/figures/Trackpoint_edit_dialog.png create mode 100644 help/C/figures/Viking-OSM-CycleMap-ManyTracks.jpg create mode 100644 help/C/figures/WaypointsList.png create mode 100644 help/C/figures/addtr_18.png create mode 100644 help/C/figures/addwp_18.png create mode 100644 help/C/figures/customize_toolbar_dialog.png create mode 100644 help/C/figures/demdl_18.png create mode 100644 help/C/figures/edtr_18.png create mode 100644 help/C/figures/edwp_18.png create mode 100644 help/C/figures/geomove_18.png create mode 100644 help/C/figures/geozoom_18.png create mode 100644 help/C/figures/map_tile_info_dialog.png create mode 100644 help/C/figures/mapdl_18.png create mode 100644 help/C/figures/mover_22.png create mode 100644 help/C/figures/properties_degree.png create mode 100644 help/C/figures/properties_units.png create mode 100644 help/C/figures/route_finder_18.png create mode 100644 help/C/figures/ruler_18.png create mode 100644 help/C/figures/select_18.png create mode 100644 help/C/figures/showpic_18.png create mode 100644 help/C/figures/trw_statusbar.png create mode 100644 help/C/figures/vik_new_route_18.png create mode 100644 help/C/figures/zoom_18.png create mode 100644 help/C/figures/zoom_status_popup.png create mode 100644 help/C/georef_layer.xml create mode 100644 help/C/legal.xml create mode 100644 help/C/mapnik_rendering_layer.xml create mode 100644 help/C/recommends.xml create mode 100644 help/C/viking.xml create mode 100644 help/Makefile.am create mode 100644 help/Makefile.in create mode 100644 help/viking.omf.in create mode 100644 help/viking.xml.in create mode 100755 install-sh create mode 100644 intltool-extract.in create mode 100644 intltool-merge.in create mode 100644 intltool-update.in create mode 100644 m4/expat.m4 create mode 100644 m4/gettext.m4 create mode 100644 m4/iconv.m4 create mode 100644 m4/intlmacosx.m4 create mode 100644 m4/lib-ld.m4 create mode 100644 m4/lib-link.m4 create mode 100644 m4/lib-prefix.m4 create mode 100644 m4/libcurl.m4 create mode 100644 m4/nls.m4 create mode 100644 m4/po.m4 create mode 100644 m4/progtest.m4 create mode 100644 mingw-viking.spec create mode 100644 mingw-viking.spec.in create mode 100644 mingw64-viking.spec create mode 100644 mingw64-viking.spec.in create mode 100755 missing create mode 100755 mkinstalldirs create mode 100644 po/ChangeLog create mode 100644 po/LINGUAS create mode 100644 po/Makefile.in.in create mode 100644 po/POTFILES.in create mode 100644 po/ast.po create mode 100644 po/ca.po create mode 100644 po/cs.po create mode 100644 po/da.po create mode 100644 po/de.po create mode 100644 po/el.po create mode 100644 po/en_GB.po create mode 100644 po/es.po create mode 100644 po/eu.po create mode 100644 po/fi.po create mode 100644 po/fr.po create mode 100644 po/he.po create mode 100644 po/hu.po create mode 100644 po/id.po create mode 100644 po/it.po create mode 100644 po/ja.po create mode 100644 po/jv.po create mode 100644 po/ko.po create mode 100644 po/ku.po create mode 100644 po/lt.po create mode 100644 po/lv.po create mode 100644 po/nb.po create mode 100644 po/nl.po create mode 100644 po/pl.po create mode 100644 po/pt_BR.po create mode 100644 po/ru.po create mode 100644 po/sk.po create mode 100644 po/sl.po create mode 100644 po/sv.po create mode 100644 po/tr.po create mode 100644 po/uk.po create mode 100644 po/zh_CN.po create mode 100644 po/zh_TW.po create mode 100644 src/Makefile.am create mode 100644 src/Makefile.in create mode 100644 src/acquire.c create mode 100644 src/acquire.h create mode 100644 src/authors.h create mode 100644 src/babel.c create mode 100644 src/babel.h create mode 100644 src/babel_ui.c create mode 100644 src/babel_ui.h create mode 100644 src/background.c create mode 100644 src/background.h create mode 100644 src/bbox.h create mode 100644 src/bing.c create mode 100644 src/bing.h create mode 100644 src/bingmapsource.c create mode 100644 src/bingmapsource.h create mode 100644 src/bluemarble.c create mode 100644 src/bluemarble.h create mode 100644 src/clipboard.c create mode 100644 src/clipboard.h create mode 100644 src/compression.c create mode 100644 src/compression.h create mode 100644 src/config.h create mode 100644 src/config.h.in create mode 100644 src/coords.c create mode 100644 src/coords.h create mode 100644 src/curl_download.c create mode 100644 src/curl_download.h create mode 100644 src/datasource_bfilter.c create mode 100644 src/datasource_file.c create mode 100644 src/datasource_gc.c create mode 100644 src/datasource_geojson.c create mode 100644 src/datasource_geotag.c create mode 100644 src/datasource_gps.c create mode 100644 src/datasource_gps.h create mode 100644 src/datasource_osm.c create mode 100644 src/datasource_osm_my_traces.c create mode 100644 src/datasource_routing.c create mode 100644 src/datasource_url.c create mode 100644 src/datasource_wikipedia.c create mode 100644 src/datasources.h create mode 100644 src/degrees_converters.c create mode 100644 src/degrees_converters.h create mode 100644 src/dem.c create mode 100644 src/dem.h create mode 100644 src/dems.c create mode 100644 src/dems.h create mode 100644 src/dialog.c create mode 100644 src/dialog.h create mode 100644 src/dir.c create mode 100644 src/dir.h create mode 100644 src/docbook2documenters.xsl create mode 100644 src/documenters.h create mode 100644 src/download.c create mode 100644 src/download.h create mode 100644 src/expedia.c create mode 100644 src/expedia.h create mode 100644 src/file.c create mode 100644 src/file.h create mode 100644 src/file_magic.c create mode 100644 src/file_magic.h create mode 100644 src/fileutils.c create mode 100644 src/fileutils.h create mode 100644 src/garminsymbols.c create mode 100644 src/garminsymbols.h create mode 100644 src/geojson.c create mode 100644 src/geojson.h create mode 100644 src/geonames.c create mode 100644 src/geonames.h create mode 100644 src/geonamessearch.c create mode 100644 src/geonamessearch.h create mode 100644 src/geotag_exif.c create mode 100644 src/geotag_exif.h create mode 100644 src/globals.c create mode 100644 src/globals.h create mode 100644 src/google.c create mode 100644 src/google.h create mode 100644 src/googlesearch.c create mode 100644 src/googlesearch.h create mode 100644 src/gpsmapper.c create mode 100644 src/gpsmapper.h create mode 100644 src/gpspoint.c create mode 100644 src/gpspoint.h create mode 100644 src/gpx.c create mode 100644 src/gpx.h create mode 100644 src/icons/Makefile.am create mode 100644 src/icons/Makefile.in create mode 100644 src/icons/addtr_18.png create mode 100644 src/icons/addwp_18.png create mode 100644 src/icons/bing_maps.png create mode 100644 src/icons/cursor_addtr.png create mode 100644 src/icons/cursor_addwp.png create mode 100644 src/icons/cursor_demdl.png create mode 100644 src/icons/cursor_edtr.png create mode 100644 src/icons/cursor_edwp.png create mode 100644 src/icons/cursor_geomove.png create mode 100644 src/icons/cursor_geozoom.png create mode 100644 src/icons/cursor_mapdl.png create mode 100644 src/icons/cursor_new_route.png create mode 100644 src/icons/cursor_route_finder.png create mode 100644 src/icons/cursor_ruler.png create mode 100644 src/icons/cursor_showpic.png create mode 100644 src/icons/cursor_splitter.png create mode 100644 src/icons/cursor_zoom.png create mode 100644 src/icons/demdl_18.png create mode 100644 src/icons/edtr_18.png create mode 100644 src/icons/edwp_18.png create mode 100644 src/icons/geomove_18.png create mode 100644 src/icons/geozoom_18.png create mode 100644 src/icons/icons.c create mode 100644 src/icons/icons.h create mode 100644 src/icons/mapdl_18.png create mode 100644 src/icons/mover_22.png create mode 100644 src/icons/route_finder_18.png create mode 100644 src/icons/ruler_18.png create mode 100644 src/icons/select_18.png create mode 100644 src/icons/showpic_18.png create mode 100644 src/icons/splitter_18.png create mode 100644 src/icons/thumbnails.png create mode 100644 src/icons/vik_new_route_18.png create mode 100644 src/icons/vikaggregatelayer.png create mode 100644 src/icons/vikcoordlayer.png create mode 100644 src/icons/vikdemlayer.png create mode 100644 src/icons/vikgeoreflayer.png create mode 100644 src/icons/vikgpslayer.png create mode 100644 src/icons/viking.png create mode 100644 src/icons/vikmapniklayer.png create mode 100644 src/icons/vikmapslayer.png create mode 100644 src/icons/viktrwlayer.png create mode 100644 src/icons/viktrwlayer_external.png create mode 100644 src/icons/viktrwlayer_external_nowrite.png create mode 100644 src/icons/wp_1st_aid.png create mode 100644 src/icons/wp_1st_aid_large.png create mode 100644 src/icons/wp_airplane.png create mode 100644 src/icons/wp_airplane_large.png create mode 100644 src/icons/wp_amuse_pk_large.png create mode 100644 src/icons/wp_anchor.png create mode 100644 src/icons/wp_anchor_large.png create mode 100644 src/icons/wp_animal_tracks_large.png create mode 100644 src/icons/wp_atv_large.png create mode 100644 src/icons/wp_ball.png create mode 100644 src/icons/wp_ball_large.png create mode 100644 src/icons/wp_beach.png create mode 100644 src/icons/wp_beach_large.png create mode 100644 src/icons/wp_bell.png create mode 100644 src/icons/wp_bell_large.png create mode 100644 src/icons/wp_big_game_large.png create mode 100644 src/icons/wp_bike_trail_large.png create mode 100644 src/icons/wp_blind_large.png create mode 100644 src/icons/wp_block_blue_large.png create mode 100644 src/icons/wp_block_green_large.png create mode 100644 src/icons/wp_block_red_large.png create mode 100644 src/icons/wp_blood_trail_large.png create mode 100644 src/icons/wp_boat_ramp.png create mode 100644 src/icons/wp_boat_ramp_large.png create mode 100644 src/icons/wp_bowling_large.png create mode 100644 src/icons/wp_bridge.png create mode 100644 src/icons/wp_bridge_large.png create mode 100644 src/icons/wp_building.png create mode 100644 src/icons/wp_building_large.png create mode 100644 src/icons/wp_buoy_ambr.png create mode 100644 src/icons/wp_buoy_ambr_large.png create mode 100644 src/icons/wp_buoy_blck.png create mode 100644 src/icons/wp_buoy_blck_large.png create mode 100644 src/icons/wp_buoy_blue.png create mode 100644 src/icons/wp_buoy_blue_large.png create mode 100644 src/icons/wp_buoy_grn.png create mode 100644 src/icons/wp_buoy_grn_large.png create mode 100644 src/icons/wp_buoy_grn_red.png create mode 100644 src/icons/wp_buoy_grn_red_large.png create mode 100644 src/icons/wp_buoy_grn_wht.png create mode 100644 src/icons/wp_buoy_grn_wht_large.png create mode 100644 src/icons/wp_buoy_orng.png create mode 100644 src/icons/wp_buoy_orng_large.png create mode 100644 src/icons/wp_buoy_red.png create mode 100644 src/icons/wp_buoy_red_grn.png create mode 100644 src/icons/wp_buoy_red_grn_large.png create mode 100644 src/icons/wp_buoy_red_large.png create mode 100644 src/icons/wp_buoy_red_wht.png create mode 100644 src/icons/wp_buoy_red_wht_large.png create mode 100644 src/icons/wp_buoy_violet.png create mode 100644 src/icons/wp_buoy_violet_large.png create mode 100644 src/icons/wp_buoy_wht.png create mode 100644 src/icons/wp_buoy_wht_grn.png create mode 100644 src/icons/wp_buoy_wht_grn_large.png create mode 100644 src/icons/wp_buoy_wht_large.png create mode 100644 src/icons/wp_buoy_wht_red.png create mode 100644 src/icons/wp_buoy_wht_red_large.png create mode 100644 src/icons/wp_camp.png create mode 100644 src/icons/wp_camp_large.png create mode 100644 src/icons/wp_cap_cty.png create mode 100644 src/icons/wp_car.png create mode 100644 src/icons/wp_car_large.png create mode 100644 src/icons/wp_car_rental_large.png create mode 100644 src/icons/wp_car_repair_large.png create mode 100644 src/icons/wp_cemetery.png create mode 100644 src/icons/wp_cemetery_large.png create mode 100644 src/icons/wp_church.png create mode 100644 src/icons/wp_church_large.png create mode 100644 src/icons/wp_civil_large.png create mode 100644 src/icons/wp_controlled.png create mode 100644 src/icons/wp_controlled_large.png create mode 100644 src/icons/wp_conv_store_large.png create mode 100644 src/icons/wp_cover_large.png create mode 100644 src/icons/wp_covey_large.png create mode 100644 src/icons/wp_crossing_large.png create mode 100644 src/icons/wp_dam.png create mode 100644 src/icons/wp_dam_large.png create mode 100644 src/icons/wp_danger.png create mode 100644 src/icons/wp_danger_large.png create mode 100644 src/icons/wp_deer.png create mode 100644 src/icons/wp_deer_large.png create mode 100644 src/icons/wp_diamond_grn.png create mode 100644 src/icons/wp_diamond_red.png create mode 100644 src/icons/wp_dive1.png create mode 100644 src/icons/wp_dive1_large.png create mode 100644 src/icons/wp_dive2.png create mode 100644 src/icons/wp_dive2_large.png create mode 100644 src/icons/wp_dollar.png create mode 100644 src/icons/wp_dollar_large.png create mode 100644 src/icons/wp_dot.png create mode 100644 src/icons/wp_drinking_wtr.png create mode 100644 src/icons/wp_drinking_wtr_large.png create mode 100644 src/icons/wp_exit_large.png create mode 100644 src/icons/wp_fastfood_large.png create mode 100644 src/icons/wp_fhs_facility_large.png create mode 100644 src/icons/wp_fish.png create mode 100644 src/icons/wp_fish_large.png create mode 100644 src/icons/wp_fitness_large.png create mode 100644 src/icons/wp_flag.png create mode 100644 src/icons/wp_flag_blue_large.png create mode 100644 src/icons/wp_flag_green_large.png create mode 100644 src/icons/wp_flag_red_large.png create mode 100644 src/icons/wp_food_source_large.png create mode 100644 src/icons/wp_forest.png create mode 100644 src/icons/wp_forest_large.png create mode 100644 src/icons/wp_fuel.png create mode 100644 src/icons/wp_fuel_large.png create mode 100644 src/icons/wp_furbearer_large.png create mode 100644 src/icons/wp_geocache.png create mode 100644 src/icons/wp_geocache_fnd.png create mode 100644 src/icons/wp_geocache_fnd_large.png create mode 100644 src/icons/wp_geocache_large.png create mode 100644 src/icons/wp_glider_large.png create mode 100644 src/icons/wp_golf.png create mode 100644 src/icons/wp_golf_large.png create mode 100644 src/icons/wp_grnd_trans_large.png create mode 100644 src/icons/wp_helipad_large.png create mode 100644 src/icons/wp_horn.png create mode 100644 src/icons/wp_horn_large.png create mode 100644 src/icons/wp_house.png create mode 100644 src/icons/wp_house_large.png create mode 100644 src/icons/wp_ice_skating.png create mode 100644 src/icons/wp_ice_skating_large.png create mode 100644 src/icons/wp_info.png create mode 100644 src/icons/wp_info_large.png create mode 100644 src/icons/wp_knife.png create mode 100644 src/icons/wp_knife_large.png create mode 100644 src/icons/wp_light.png create mode 100644 src/icons/wp_light_large.png create mode 100644 src/icons/wp_lodge_large.png create mode 100644 src/icons/wp_lodging_large.png create mode 100644 src/icons/wp_lrg_cty.png create mode 100644 src/icons/wp_lrg_cty_large.png create mode 100644 src/icons/wp_med_cty.png create mode 100644 src/icons/wp_med_cty_large.png create mode 100644 src/icons/wp_military.png create mode 100644 src/icons/wp_mine.png create mode 100644 src/icons/wp_mine_large.png create mode 100644 src/icons/wp_mob.png create mode 100644 src/icons/wp_mob_large.png create mode 100644 src/icons/wp_movie_large.png create mode 100644 src/icons/wp_mug.png create mode 100644 src/icons/wp_mug_large.png create mode 100644 src/icons/wp_museum_large.png create mode 100644 src/icons/wp_null.png create mode 100644 src/icons/wp_oil_field_large.png create mode 100644 src/icons/wp_parachute_large.png create mode 100644 src/icons/wp_park.png create mode 100644 src/icons/wp_park_large.png create mode 100644 src/icons/wp_parking.png create mode 100644 src/icons/wp_parking_large.png create mode 100644 src/icons/wp_pharmacy_large.png create mode 100644 src/icons/wp_phone.png create mode 100644 src/icons/wp_phone_large.png create mode 100644 src/icons/wp_picnic.png create mode 100644 src/icons/wp_picnic_large.png create mode 100644 src/icons/wp_pin_blue_large.png create mode 100644 src/icons/wp_pin_green_large.png create mode 100644 src/icons/wp_pin_red_large.png create mode 100644 src/icons/wp_pizza_large.png create mode 100644 src/icons/wp_police_large.png create mode 100644 src/icons/wp_post_ofc_large.png create mode 100644 src/icons/wp_rbcn.png create mode 100644 src/icons/wp_rbcn_large.png create mode 100644 src/icons/wp_restricted.png create mode 100644 src/icons/wp_restricted_large.png create mode 100644 src/icons/wp_restroom.png create mode 100644 src/icons/wp_restroom_large.png create mode 100644 src/icons/wp_rv_park.png create mode 100644 src/icons/wp_rv_park_large.png create mode 100644 src/icons/wp_scenic.png create mode 100644 src/icons/wp_scenic_large.png create mode 100644 src/icons/wp_school.png create mode 100644 src/icons/wp_school_large.png create mode 100644 src/icons/wp_shopping_large.png create mode 100644 src/icons/wp_short_tower_large.png create mode 100644 src/icons/wp_shower.png create mode 100644 src/icons/wp_shower_large.png create mode 100644 src/icons/wp_ski_resort_large.png create mode 100644 src/icons/wp_skiing.png create mode 100644 src/icons/wp_skiing_large.png create mode 100644 src/icons/wp_skull.png create mode 100644 src/icons/wp_skull_large.png create mode 100644 src/icons/wp_small_game_large.png create mode 100644 src/icons/wp_sml_cty.png create mode 100644 src/icons/wp_sml_cty_large.png create mode 100644 src/icons/wp_square_grn.png create mode 100644 src/icons/wp_square_red.png create mode 100644 src/icons/wp_stadium_large.png create mode 100644 src/icons/wp_store_large.png create mode 100644 src/icons/wp_summit.png create mode 100644 src/icons/wp_summit_large.png create mode 100644 src/icons/wp_swimming.png create mode 100644 src/icons/wp_swimming_large.png create mode 100644 src/icons/wp_tall_tower_large.png create mode 100644 src/icons/wp_theater_large.png create mode 100644 src/icons/wp_toll_booth_large.png create mode 100644 src/icons/wp_trail_head_large.png create mode 100644 src/icons/wp_tree_stand_large.png create mode 100644 src/icons/wp_treed_quarry_large.png create mode 100644 src/icons/wp_truck_large.png create mode 100644 src/icons/wp_truck_stop_large.png create mode 100644 src/icons/wp_tunnel.png create mode 100644 src/icons/wp_tunnel_large.png create mode 100644 src/icons/wp_ultralight_large.png create mode 100644 src/icons/wp_upland_game_large.png create mode 100644 src/icons/wp_water_source_large.png create mode 100644 src/icons/wp_waterfowl_large.png create mode 100644 src/icons/wp_wbuoy.png create mode 100644 src/icons/wp_wbuoy_large.png create mode 100644 src/icons/wp_weigh_station_large.png create mode 100644 src/icons/wp_wpt_dot.png create mode 100644 src/icons/wp_wreck.png create mode 100644 src/icons/wp_wreck_large.png create mode 100644 src/icons/wp_wrecker_large.png create mode 100644 src/icons/wp_zoo_large.png create mode 100644 src/icons/zoom_18.png create mode 100644 src/jpg.c create mode 100644 src/jpg.h create mode 100644 src/kmz.c create mode 100644 src/kmz.h create mode 100644 src/libgeoclue.c create mode 100644 src/libgeoclue.h create mode 100644 src/libjpeg/jpeg-data.c create mode 100644 src/libjpeg/jpeg-data.h create mode 100644 src/libjpeg/jpeg-marker.c create mode 100644 src/libjpeg/jpeg-marker.h create mode 100644 src/main.c create mode 100644 src/map_ids.h create mode 100644 src/mapcache.c create mode 100644 src/mapcache.h create mode 100644 src/mapcoord.h create mode 100644 src/mapnik_interface.cpp create mode 100644 src/mapnik_interface.h create mode 100644 src/maputils.c create mode 100644 src/maputils.h create mode 100644 src/md5_hash.c create mode 100644 src/md5_hash.h create mode 100644 src/menu.xml.h create mode 100644 src/metatile.c create mode 100644 src/metatile.h create mode 100644 src/misc/fpconv-license.txt create mode 100644 src/misc/fpconv.c create mode 100644 src/misc/fpconv.h create mode 100644 src/misc/gtkhtml-private.h create mode 100644 src/misc/gtkhtml.c create mode 100644 src/misc/kdtree.c create mode 100644 src/misc/kdtree.h create mode 100644 src/misc/powers.h create mode 100644 src/misc/strtod.c create mode 100644 src/misc/strtod.h create mode 100644 src/modules.c create mode 100644 src/modules.h create mode 100644 src/osm-traces.c create mode 100644 src/osm-traces.h create mode 100644 src/osm.c create mode 100644 src/osm.h create mode 100644 src/preferences.c create mode 100644 src/preferences.h create mode 100644 src/print-preview.c create mode 100644 src/print-preview.h create mode 100644 src/print.c create mode 100644 src/print.h create mode 100644 src/settings.c create mode 100644 src/settings.h create mode 100644 src/srtm_continent.c create mode 100644 src/terraserver.c create mode 100644 src/terraserver.h create mode 100644 src/terraservermapsource.c create mode 100644 src/terraservermapsource.h create mode 100644 src/thumbnails.c create mode 100644 src/thumbnails.h create mode 100644 src/toolbar.c create mode 100644 src/toolbar.h create mode 100644 src/toolbar.xml.h create mode 100644 src/ui_util.c create mode 100644 src/ui_util.h create mode 100644 src/uibuilder.c create mode 100644 src/uibuilder.h create mode 100644 src/util.c create mode 100644 src/util.h create mode 100644 src/vik_compat.c create mode 100644 src/vik_compat.h create mode 100644 src/vikaggregatelayer.c create mode 100644 src/vikaggregatelayer.h create mode 100644 src/vikcoord.c create mode 100644 src/vikcoord.h create mode 100644 src/vikcoordlayer.c create mode 100644 src/vikcoordlayer.h create mode 100644 src/vikdatetime_edit_dialog.c create mode 100644 src/vikdatetime_edit_dialog.h create mode 100644 src/vikdemlayer.c create mode 100644 src/vikdemlayer.h create mode 100644 src/vikenumtypes.c create mode 100644 src/vikenumtypes.c.template create mode 100644 src/vikenumtypes.h create mode 100644 src/vikenumtypes.h.template create mode 100644 src/vikexttool.c create mode 100644 src/vikexttool.h create mode 100644 src/vikexttool_datasources.c create mode 100644 src/vikexttool_datasources.h create mode 100644 src/vikexttools.c create mode 100644 src/vikexttools.h create mode 100644 src/vikfileentry.c create mode 100644 src/vikfileentry.h create mode 100644 src/vikfilelist.c create mode 100644 src/vikfilelist.h create mode 100644 src/vikgeoreflayer.c create mode 100644 src/vikgeoreflayer.h create mode 100644 src/vikgobjectbuilder.c create mode 100644 src/vikgobjectbuilder.h create mode 100644 src/vikgoto.c create mode 100644 src/vikgoto.h create mode 100644 src/vikgototool.c create mode 100644 src/vikgototool.h create mode 100644 src/vikgotoxmltool.c create mode 100644 src/vikgotoxmltool.h create mode 100644 src/vikgpslayer.c create mode 100644 src/vikgpslayer.h create mode 100644 src/viking.desktop.in create mode 100644 src/viking.h create mode 100644 src/viklayer.c create mode 100644 src/viklayer.h create mode 100644 src/viklayer_defaults.c create mode 100644 src/viklayer_defaults.h create mode 100644 src/viklayerspanel.c create mode 100644 src/viklayerspanel.h create mode 100644 src/vikmapniklayer.c create mode 100644 src/vikmapniklayer.h create mode 100644 src/vikmapslayer.c create mode 100644 src/vikmapslayer.h create mode 100644 src/vikmapslayer_compat.c create mode 100644 src/vikmapslayer_compat.h create mode 100644 src/vikmapsource.c create mode 100644 src/vikmapsource.h create mode 100644 src/vikmapsourcedefault.c create mode 100644 src/vikmapsourcedefault.h create mode 100644 src/vikmaptype.c create mode 100644 src/vikmaptype.h create mode 100644 src/vikradiogroup.c create mode 100644 src/vikradiogroup.h create mode 100644 src/vikrouting.c create mode 100644 src/vikrouting.h create mode 100644 src/vikroutingengine.c create mode 100644 src/vikroutingengine.h create mode 100644 src/vikroutingwebengine.c create mode 100644 src/vikroutingwebengine.h create mode 100644 src/vikslippymapsource.c create mode 100644 src/vikslippymapsource.h create mode 100644 src/vikstatus.c create mode 100644 src/vikstatus.h create mode 100644 src/viktmsmapsource.c create mode 100644 src/viktmsmapsource.h create mode 100644 src/viktrack.c create mode 100644 src/viktrack.h create mode 100644 src/viktreeview.c create mode 100644 src/viktreeview.h create mode 100644 src/viktrwlayer.c create mode 100644 src/viktrwlayer.h create mode 100644 src/viktrwlayer_analysis.c create mode 100644 src/viktrwlayer_analysis.h create mode 100644 src/viktrwlayer_export.c create mode 100644 src/viktrwlayer_export.h create mode 100644 src/viktrwlayer_geotag.c create mode 100644 src/viktrwlayer_geotag.h create mode 100644 src/viktrwlayer_propwin.c create mode 100644 src/viktrwlayer_propwin.h create mode 100644 src/viktrwlayer_tpwin.c create mode 100644 src/viktrwlayer_tpwin.h create mode 100644 src/viktrwlayer_tracklist.c create mode 100644 src/viktrwlayer_tracklist.h create mode 100644 src/viktrwlayer_waypointlist.c create mode 100644 src/viktrwlayer_waypointlist.h create mode 100644 src/viktrwlayer_wpwin.c create mode 100644 src/viktrwlayer_wpwin.h create mode 100644 src/vikutils.c create mode 100644 src/vikutils.h create mode 100644 src/vikviewport.c create mode 100644 src/vikviewport.h create mode 100644 src/vikwaypoint.c create mode 100644 src/vikwaypoint.h create mode 100644 src/vikwebtool.c create mode 100644 src/vikwebtool.h create mode 100644 src/vikwebtool_datasource.c create mode 100644 src/vikwebtool_datasource.h create mode 100644 src/vikwebtoolbounds.c create mode 100644 src/vikwebtoolbounds.h create mode 100644 src/vikwebtoolcenter.c create mode 100644 src/vikwebtoolcenter.h create mode 100644 src/vikwebtoolformat.c create mode 100644 src/vikwebtoolformat.h create mode 100644 src/vikwindow.c create mode 100644 src/vikwindow.h create mode 100644 src/vikwmscmapsource.c create mode 100644 src/vikwmscmapsource.h create mode 100755 test-driver create mode 100644 test/Makefile.am create mode 100644 test/Makefile.in create mode 100644 test/README create mode 100644 test/SF#022.gpx create mode 100644 test/Stonehenge.jpg create mode 100644 test/ViewFromCribyn-Wales-GPS.jpg create mode 100755 test/check_babel.sh create mode 100755 test/check_decimal_output.sh create mode 100755 test/check_degrees_conversions.sh create mode 100755 test/check_geotag.sh create mode 100755 test/check_gpx.sh create mode 100755 test/check_md5_hash.sh create mode 100755 test/check_metatile.sh create mode 100644 test/degrees_converter.c create mode 100644 test/geotag_read.c create mode 100644 test/geotag_write.c create mode 100644 test/gpx2gpx.c create mode 100644 test/metatile_example/13/0/0/250/220/0.meta create mode 100644 test/test_babel.c create mode 100644 test/test_coord_conversion.c create mode 100644 test/test_decimal_output.c create mode 100644 test/test_md5_hash.c create mode 100644 test/test_metatile.c create mode 100644 test/test_time.c create mode 100644 test/test_vikgotoxmltool.c create mode 100644 tools/Makefile.am create mode 100644 tools/Makefile.in create mode 100644 tools/README create mode 100755 tools/geo-html2gpx create mode 100755 tools/geo-nearest create mode 100755 tools/googledirections create mode 100755 tools/images2waypoints.pl create mode 100755 tools/viking-cache.py create mode 100644 viking.spec create mode 100644 viking.spec.in create mode 100644 windows/Makefile.am create mode 100644 windows/Makefile.in create mode 100644 windows/README.txt create mode 100644 windows/configure_and_make.bat create mode 100755 windows/installer-mingw.sh create mode 100644 windows/installer.bat create mode 100644 windows/installer/FileAssociation.nsh create mode 100644 windows/installer/Makefile.am create mode 100644 windows/installer/Makefile.in create mode 100644 windows/installer/langmacros.nsh create mode 100644 windows/installer/pixmaps/Makefile.am create mode 100644 windows/installer/pixmaps/Makefile.in create mode 100644 windows/installer/pixmaps/viking_icon.ico create mode 100644 windows/installer/pixmaps/viking_icon.rc create mode 100644 windows/installer/translations/Makefile.am create mode 100644 windows/installer/translations/Makefile.in create mode 100644 windows/installer/translations/english.nsh create mode 100644 windows/installer/translations/french.nsh create mode 100644 windows/installer/translations/spanish.nsh create mode 100644 windows/installer/viking-installer.nsi create mode 100644 windows/make.bat create mode 100644 windows/prepare.bat diff --git a/ABOUT-NLS b/ABOUT-NLS new file mode 100644 index 0000000..83bc72e --- /dev/null +++ b/ABOUT-NLS @@ -0,0 +1,1068 @@ +1 Notes on the Free Translation Project +*************************************** + +Free software is going international! The Free Translation Project is +a way to get maintainers of free software, translators, and users all +together, so that free software will gradually become able to speak many +languages. A few packages already provide translations for their +messages. + + If you found this `ABOUT-NLS' file inside a distribution, you may +assume that the distributed package does use GNU `gettext' internally, +itself available at your nearest GNU archive site. But you do _not_ +need to install GNU `gettext' prior to configuring, installing or using +this package with messages translated. + + Installers will find here some useful hints. These notes also +explain how users should proceed for getting the programs to use the +available translations. They tell how people wanting to contribute and +work on translations can contact the appropriate team. + + When reporting bugs in the `intl/' directory or bugs which may be +related to internationalization, you should tell about the version of +`gettext' which is used. The information can be found in the +`intl/VERSION' file, in internationalized packages. + +1.1 Quick configuration advice +============================== + +If you want to exploit the full power of internationalization, you +should configure it using + + ./configure --with-included-gettext + +to force usage of internationalizing routines provided within this +package, despite the existence of internationalizing capabilities in the +operating system where this package is being installed. So far, only +the `gettext' implementation in the GNU C library version 2 provides as +many features (such as locale alias, message inheritance, automatic +charset conversion or plural form handling) as the implementation here. +It is also not possible to offer this additional functionality on top +of a `catgets' implementation. Future versions of GNU `gettext' will +very likely convey even more functionality. So it might be a good idea +to change to GNU `gettext' as soon as possible. + + So you need _not_ provide this option if you are using GNU libc 2 or +you have installed a recent copy of the GNU gettext package with the +included `libintl'. + +1.2 INSTALL Matters +=================== + +Some packages are "localizable" when properly installed; the programs +they contain can be made to speak your own native language. Most such +packages use GNU `gettext'. Other packages have their own ways to +internationalization, predating GNU `gettext'. + + By default, this package will be installed to allow translation of +messages. It will automatically detect whether the system already +provides the GNU `gettext' functions. If not, the included GNU +`gettext' library will be used. This library is wholly contained +within this package, usually in the `intl/' subdirectory, so prior +installation of the GNU `gettext' package is _not_ required. +Installers may use special options at configuration time for changing +the default behaviour. The commands: + + ./configure --with-included-gettext + ./configure --disable-nls + +will, respectively, bypass any pre-existing `gettext' to use the +internationalizing routines provided within this package, or else, +_totally_ disable translation of messages. + + When you already have GNU `gettext' installed on your system and run +configure without an option for your new package, `configure' will +probably detect the previously built and installed `libintl.a' file and +will decide to use this. This might not be desirable. You should use +the more recent version of the GNU `gettext' library. I.e. if the file +`intl/VERSION' shows that the library which comes with this package is +more recent, you should use + + ./configure --with-included-gettext + +to prevent auto-detection. + + The configuration process will not test for the `catgets' function +and therefore it will not be used. The reason is that even an +emulation of `gettext' on top of `catgets' could not provide all the +extensions of the GNU `gettext' library. + + Internationalized packages usually have many `po/LL.po' files, where +LL gives an ISO 639 two-letter code identifying the language. Unless +translations have been forbidden at `configure' time by using the +`--disable-nls' switch, all available translations are installed +together with the package. However, the environment variable `LINGUAS' +may be set, prior to configuration, to limit the installed set. +`LINGUAS' should then contain a space separated list of two-letter +codes, stating which languages are allowed. + +1.3 Using This Package +====================== + +As a user, if your language has been installed for this package, you +only have to set the `LANG' environment variable to the appropriate +`LL_CC' combination. If you happen to have the `LC_ALL' or some other +`LC_xxx' environment variables set, you should unset them before +setting `LANG', otherwise the setting of `LANG' will not have the +desired effect. Here `LL' is an ISO 639 two-letter language code, and +`CC' is an ISO 3166 two-letter country code. For example, let's +suppose that you speak German and live in Germany. At the shell +prompt, merely execute `setenv LANG de_DE' (in `csh'), +`export LANG; LANG=de_DE' (in `sh') or `export LANG=de_DE' (in `bash'). +This can be done from your `.login' or `.profile' file, once and for +all. + + You might think that the country code specification is redundant. +But in fact, some languages have dialects in different countries. For +example, `de_AT' is used for Austria, and `pt_BR' for Brazil. The +country code serves to distinguish the dialects. + + The locale naming convention of `LL_CC', with `LL' denoting the +language and `CC' denoting the country, is the one use on systems based +on GNU libc. On other systems, some variations of this scheme are +used, such as `LL' or `LL_CC.ENCODING'. You can get the list of +locales supported by your system for your language by running the +command `locale -a | grep '^LL''. + + Not all programs have translations for all languages. By default, an +English message is shown in place of a nonexistent translation. If you +understand other languages, you can set up a priority list of languages. +This is done through a different environment variable, called +`LANGUAGE'. GNU `gettext' gives preference to `LANGUAGE' over `LANG' +for the purpose of message handling, but you still need to have `LANG' +set to the primary language; this is required by other parts of the +system libraries. For example, some Swedish users who would rather +read translations in German than English for when Swedish is not +available, set `LANGUAGE' to `sv:de' while leaving `LANG' to `sv_SE'. + + Special advice for Norwegian users: The language code for Norwegian +bokma*l changed from `no' to `nb' recently (in 2003). During the +transition period, while some message catalogs for this language are +installed under `nb' and some older ones under `no', it's recommended +for Norwegian users to set `LANGUAGE' to `nb:no' so that both newer and +older translations are used. + + In the `LANGUAGE' environment variable, but not in the `LANG' +environment variable, `LL_CC' combinations can be abbreviated as `LL' +to denote the language's main dialect. For example, `de' is equivalent +to `de_DE' (German as spoken in Germany), and `pt' to `pt_PT' +(Portuguese as spoken in Portugal) in this context. + +1.4 Translating Teams +===================== + +For the Free Translation Project to be a success, we need interested +people who like their own language and write it well, and who are also +able to synergize with other translators speaking the same language. +Each translation team has its own mailing list. The up-to-date list of +teams can be found at the Free Translation Project's homepage, +`http://translationproject.org/', in the "Teams" area. + + If you'd like to volunteer to _work_ at translating messages, you +should become a member of the translating team for your own language. +The subscribing address is _not_ the same as the list itself, it has +`-request' appended. For example, speakers of Swedish can send a +message to `sv-request@li.org', having this message body: + + subscribe + + Keep in mind that team members are expected to participate +_actively_ in translations, or at solving translational difficulties, +rather than merely lurking around. If your team does not exist yet and +you want to start one, or if you are unsure about what to do or how to +get started, please write to `coordinator@translationproject.org' to +reach the coordinator for all translator teams. + + The English team is special. It works at improving and uniformizing +the terminology in use. Proven linguistic skills are praised more than +programming skills, here. + +1.5 Available Packages +====================== + +Languages are not equally supported in all packages. The following +matrix shows the current state of internationalization, as of November +2007. The matrix shows, in regard of each package, for which languages +PO files have been submitted to translation coordination, with a +translation percentage of at least 50%. + + Ready PO files af am ar az be bg bs ca cs cy da de el en en_GB eo + +----------------------------------------------------+ + Compendium | [] [] [] [] | + a2ps | [] [] [] [] [] | + aegis | () | + ant-phone | () | + anubis | [] | + ap-utils | | + aspell | [] [] [] [] [] | + bash | [] | + bfd | | + bibshelf | [] | + binutils | | + bison | [] [] | + bison-runtime | [] | + bluez-pin | [] [] [] [] [] | + cflow | [] | + clisp | [] [] [] | + console-tools | [] [] | + coreutils | [] [] [] [] | + cpio | | + cpplib | [] [] [] | + cryptonit | [] | + dialog | | + diffutils | [] [] [] [] [] [] | + doodle | [] | + e2fsprogs | [] [] | + enscript | [] [] [] [] | + fetchmail | [] [] () [] [] | + findutils | [] | + findutils_stable | [] [] [] | + flex | [] [] [] | + fslint | | + gas | | + gawk | [] [] [] | + gcal | [] | + gcc | [] | + gettext-examples | [] [] [] [] [] | + gettext-runtime | [] [] [] [] [] | + gettext-tools | [] [] | + gip | [] | + gliv | [] [] | + glunarclock | [] | + gmult | [] [] | + gnubiff | () | + gnucash | [] [] () () [] | + gnuedu | | + gnulib | [] | + gnunet | | + gnunet-gtk | | + gnutls | [] | + gpe-aerial | [] [] | + gpe-beam | [] [] | + gpe-calendar | | + gpe-clock | [] [] | + gpe-conf | [] [] | + gpe-contacts | | + gpe-edit | [] | + gpe-filemanager | | + gpe-go | [] | + gpe-login | [] [] | + gpe-ownerinfo | [] [] | + gpe-package | | + gpe-sketchbook | [] [] | + gpe-su | [] [] | + gpe-taskmanager | [] [] | + gpe-timesheet | [] | + gpe-today | [] [] | + gpe-todo | | + gphoto2 | [] [] [] [] | + gprof | [] [] | + gpsdrive | | + gramadoir | [] [] | + grep | [] [] | + gretl | () | + gsasl | | + gss | | + gst-plugins-bad | [] [] | + gst-plugins-base | [] [] | + gst-plugins-good | [] [] [] | + gst-plugins-ugly | [] [] | + gstreamer | [] [] [] [] [] [] [] | + gtick | () | + gtkam | [] [] [] [] | + gtkorphan | [] [] | + gtkspell | [] [] [] [] | + gutenprint | [] | + hello | [] [] [] [] [] | + herrie | [] | + hylafax | | + idutils | [] [] | + indent | [] [] [] [] | + iso_15924 | | + iso_3166 | [] [] [] [] [] [] [] [] [] [] [] | + iso_3166_2 | | + iso_4217 | [] [] [] | + iso_639 | [] [] [] [] | + jpilot | [] | + jtag | | + jwhois | | + kbd | [] [] [] [] | + keytouch | [] [] | + keytouch-editor | [] | + keytouch-keyboa... | [] | + latrine | () | + ld | [] | + leafpad | [] [] [] [] [] | + libc | [] [] [] [] | + libexif | [] | + libextractor | [] | + libgpewidget | [] [] [] | + libgpg-error | [] | + libgphoto2 | [] [] | + libgphoto2_port | [] [] | + libgsasl | | + libiconv | [] [] | + libidn | [] [] [] | + lifelines | [] () | + lilypond | [] | + lingoteach | | + lprng | | + lynx | [] [] [] [] | + m4 | [] [] [] [] | + mailfromd | | + mailutils | [] | + make | [] [] | + man-db | [] [] [] | + minicom | [] [] [] | + nano | [] [] [] | + opcodes | [] | + parted | [] [] | + pilot-qof | | + popt | [] [] [] | + psmisc | [] | + pwdutils | | + qof | | + radius | [] | + recode | [] [] [] [] [] [] | + rpm | [] | + screem | | + scrollkeeper | [] [] [] [] [] [] [] [] | + sed | [] [] [] | + shared-mime-info | [] [] [] [] () [] [] [] | + sharutils | [] [] [] [] [] [] | + shishi | | + skencil | [] () | + solfege | | + soundtracker | [] [] | + sp | [] | + system-tools-ba... | [] [] [] [] [] [] [] [] [] | + tar | [] [] | + texinfo | [] [] [] | + tin | () () | + tuxpaint | [] [] [] [] [] [] | + unicode-han-tra... | | + unicode-transla... | | + util-linux | [] [] [] [] | + util-linux-ng | [] [] [] [] | + vorbis-tools | [] | + wastesedge | () | + wdiff | [] [] [] [] | + wget | [] [] [] | + xchat | [] [] [] [] [] [] [] | + xkeyboard-config | [] | + xpad | [] [] [] | + +----------------------------------------------------+ + af am ar az be bg bs ca cs cy da de el en en_GB eo + 6 0 2 1 8 26 2 40 48 2 56 88 15 1 15 18 + + es et eu fa fi fr ga gl gu he hi hr hu id is it + +--------------------------------------------------+ + Compendium | [] [] [] [] [] | + a2ps | [] [] [] () | + aegis | | + ant-phone | [] | + anubis | [] | + ap-utils | [] [] | + aspell | [] [] [] | + bash | [] | + bfd | [] [] | + bibshelf | [] [] [] | + binutils | [] [] [] | + bison | [] [] [] [] [] [] | + bison-runtime | [] [] [] [] [] | + bluez-pin | [] [] [] [] [] | + cflow | [] | + clisp | [] [] | + console-tools | | + coreutils | [] [] [] [] [] [] | + cpio | [] [] [] | + cpplib | [] [] | + cryptonit | [] | + dialog | [] [] [] | + diffutils | [] [] [] [] [] [] [] [] [] | + doodle | [] [] | + e2fsprogs | [] [] [] | + enscript | [] [] [] | + fetchmail | [] | + findutils | [] [] [] | + findutils_stable | [] [] [] [] | + flex | [] [] [] | + fslint | | + gas | [] [] | + gawk | [] [] [] [] () | + gcal | [] [] | + gcc | [] | + gettext-examples | [] [] [] [] [] [] [] | + gettext-runtime | [] [] [] [] [] [] | + gettext-tools | [] [] [] [] | + gip | [] [] [] [] | + gliv | () | + glunarclock | [] [] [] | + gmult | [] [] [] | + gnubiff | () () | + gnucash | () () () | + gnuedu | [] | + gnulib | [] [] [] | + gnunet | | + gnunet-gtk | | + gnutls | | + gpe-aerial | [] [] | + gpe-beam | [] [] | + gpe-calendar | | + gpe-clock | [] [] [] [] | + gpe-conf | [] | + gpe-contacts | [] [] | + gpe-edit | [] [] [] [] | + gpe-filemanager | [] | + gpe-go | [] [] [] | + gpe-login | [] [] [] | + gpe-ownerinfo | [] [] [] [] [] | + gpe-package | [] | + gpe-sketchbook | [] [] | + gpe-su | [] [] [] [] | + gpe-taskmanager | [] [] [] | + gpe-timesheet | [] [] [] [] | + gpe-today | [] [] [] [] | + gpe-todo | [] | + gphoto2 | [] [] [] [] [] | + gprof | [] [] [] [] [] | + gpsdrive | [] | + gramadoir | [] [] | + grep | [] [] [] | + gretl | [] [] [] () | + gsasl | [] [] | + gss | [] [] | + gst-plugins-bad | [] [] [] [] | + gst-plugins-base | [] [] [] [] | + gst-plugins-good | [] [] [] [] [] | + gst-plugins-ugly | [] [] [] [] | + gstreamer | [] [] [] | + gtick | [] [] [] | + gtkam | [] [] [] [] | + gtkorphan | [] [] | + gtkspell | [] [] [] [] [] [] [] | + gutenprint | [] | + hello | [] [] [] [] [] [] [] [] [] [] [] [] [] | + herrie | [] | + hylafax | | + idutils | [] [] [] [] [] | + indent | [] [] [] [] [] [] [] [] [] [] | + iso_15924 | [] | + iso_3166 | [] [] [] [] [] [] [] [] [] [] [] [] [] | + iso_3166_2 | [] | + iso_4217 | [] [] [] [] [] [] | + iso_639 | [] [] [] [] [] [] | + jpilot | [] [] | + jtag | [] | + jwhois | [] [] [] [] [] | + kbd | [] [] | + keytouch | [] [] [] | + keytouch-editor | [] | + keytouch-keyboa... | [] [] | + latrine | [] [] | + ld | [] [] [] [] | + leafpad | [] [] [] [] [] [] | + libc | [] [] [] [] [] | + libexif | [] | + libextractor | [] | + libgpewidget | [] [] [] [] [] | + libgpg-error | [] | + libgphoto2 | [] [] [] | + libgphoto2_port | [] [] | + libgsasl | [] [] | + libiconv | [] [] [] | + libidn | [] [] | + lifelines | () | + lilypond | [] [] [] | + lingoteach | [] [] [] | + lprng | | + lynx | [] [] [] | + m4 | [] [] [] [] | + mailfromd | | + mailutils | [] [] | + make | [] [] [] [] [] [] [] [] | + man-db | [] | + minicom | [] [] [] [] | + nano | [] [] [] [] [] [] [] | + opcodes | [] [] [] [] | + parted | [] [] [] | + pilot-qof | | + popt | [] [] [] [] | + psmisc | [] [] | + pwdutils | | + qof | [] | + radius | [] [] | + recode | [] [] [] [] [] [] [] [] | + rpm | [] [] | + screem | | + scrollkeeper | [] [] [] | + sed | [] [] [] [] [] | + shared-mime-info | [] [] [] [] [] [] | + sharutils | [] [] [] [] [] [] [] [] | + shishi | [] | + skencil | [] [] | + solfege | [] | + soundtracker | [] [] [] | + sp | [] | + system-tools-ba... | [] [] [] [] [] [] [] [] [] | + tar | [] [] [] [] [] | + texinfo | [] [] [] | + tin | [] () | + tuxpaint | [] [] | + unicode-han-tra... | | + unicode-transla... | [] [] | + util-linux | [] [] [] [] [] [] [] | + util-linux-ng | [] [] [] [] [] [] [] | + vorbis-tools | | + wastesedge | () | + wdiff | [] [] [] [] [] [] [] [] | + wget | [] [] [] [] [] [] [] [] | + xchat | [] [] [] [] [] [] [] | + xkeyboard-config | [] [] [] [] | + xpad | [] [] [] | + +--------------------------------------------------+ + es et eu fa fi fr ga gl gu he hi hr hu id is it + 85 22 14 2 48 101 61 12 2 8 2 6 53 29 1 52 + + ja ka ko ku ky lg lt lv mk mn ms mt nb ne nl nn + +--------------------------------------------------+ + Compendium | [] | + a2ps | () [] [] | + aegis | () | + ant-phone | [] | + anubis | [] [] [] | + ap-utils | [] | + aspell | [] [] | + bash | [] | + bfd | | + bibshelf | [] | + binutils | | + bison | [] [] [] | + bison-runtime | [] [] [] | + bluez-pin | [] [] [] | + cflow | | + clisp | [] | + console-tools | | + coreutils | [] | + cpio | [] | + cpplib | [] | + cryptonit | [] | + dialog | [] [] | + diffutils | [] [] [] | + doodle | | + e2fsprogs | [] | + enscript | [] | + fetchmail | [] [] | + findutils | [] | + findutils_stable | [] | + flex | [] [] | + fslint | | + gas | | + gawk | [] [] | + gcal | | + gcc | | + gettext-examples | [] [] [] | + gettext-runtime | [] [] [] | + gettext-tools | [] [] | + gip | [] [] | + gliv | [] | + glunarclock | [] [] | + gmult | [] [] [] | + gnubiff | | + gnucash | () () () | + gnuedu | | + gnulib | [] [] | + gnunet | | + gnunet-gtk | | + gnutls | [] | + gpe-aerial | [] | + gpe-beam | [] | + gpe-calendar | [] | + gpe-clock | [] [] [] | + gpe-conf | [] [] [] | + gpe-contacts | [] | + gpe-edit | [] [] [] | + gpe-filemanager | [] [] | + gpe-go | [] [] [] | + gpe-login | [] [] [] | + gpe-ownerinfo | [] [] | + gpe-package | [] [] | + gpe-sketchbook | [] [] | + gpe-su | [] [] [] | + gpe-taskmanager | [] [] [] [] | + gpe-timesheet | [] | + gpe-today | [] [] | + gpe-todo | [] | + gphoto2 | [] [] | + gprof | [] | + gpsdrive | [] | + gramadoir | () | + grep | [] [] | + gretl | | + gsasl | [] | + gss | | + gst-plugins-bad | [] | + gst-plugins-base | [] | + gst-plugins-good | [] | + gst-plugins-ugly | [] | + gstreamer | [] | + gtick | [] | + gtkam | [] [] | + gtkorphan | [] | + gtkspell | [] [] | + gutenprint | [] | + hello | [] [] [] [] [] [] [] | + herrie | [] | + hylafax | | + idutils | [] | + indent | [] [] | + iso_15924 | [] | + iso_3166 | [] [] [] [] [] [] [] [] | + iso_3166_2 | [] | + iso_4217 | [] [] [] | + iso_639 | [] [] [] [] | + jpilot | () () | + jtag | | + jwhois | [] | + kbd | [] | + keytouch | [] | + keytouch-editor | [] | + keytouch-keyboa... | | + latrine | [] | + ld | | + leafpad | [] [] | + libc | [] [] [] | + libexif | | + libextractor | | + libgpewidget | [] | + libgpg-error | | + libgphoto2 | [] | + libgphoto2_port | [] | + libgsasl | [] | + libiconv | [] | + libidn | [] [] | + lifelines | [] | + lilypond | [] | + lingoteach | [] | + lprng | | + lynx | [] [] | + m4 | [] [] | + mailfromd | | + mailutils | | + make | [] [] [] | + man-db | | + minicom | [] | + nano | [] [] [] | + opcodes | [] | + parted | [] [] | + pilot-qof | | + popt | [] [] [] | + psmisc | [] [] [] | + pwdutils | | + qof | | + radius | | + recode | [] | + rpm | [] [] | + screem | [] | + scrollkeeper | [] [] [] [] | + sed | [] [] | + shared-mime-info | [] [] [] [] [] [] [] | + sharutils | [] [] | + shishi | | + skencil | | + solfege | () () | + soundtracker | | + sp | () | + system-tools-ba... | [] [] [] [] | + tar | [] [] [] | + texinfo | [] [] | + tin | | + tuxpaint | () [] [] | + unicode-han-tra... | | + unicode-transla... | | + util-linux | [] [] | + util-linux-ng | [] [] | + vorbis-tools | | + wastesedge | [] | + wdiff | [] [] | + wget | [] [] | + xchat | [] [] [] [] | + xkeyboard-config | [] [] [] | + xpad | [] [] [] | + +--------------------------------------------------+ + ja ka ko ku ky lg lt lv mk mn ms mt nb ne nl nn + 51 2 25 3 2 0 6 0 2 2 20 0 11 1 103 6 + + or pa pl pt pt_BR rm ro ru rw sk sl sq sr sv ta + +--------------------------------------------------+ + Compendium | [] [] [] [] [] | + a2ps | () [] [] [] [] [] [] | + aegis | () () | + ant-phone | [] [] | + anubis | [] [] [] | + ap-utils | () | + aspell | [] [] [] | + bash | [] [] | + bfd | | + bibshelf | [] | + binutils | [] [] | + bison | [] [] [] [] [] | + bison-runtime | [] [] [] [] [] | + bluez-pin | [] [] [] [] [] [] [] [] [] | + cflow | [] | + clisp | [] | + console-tools | [] | + coreutils | [] [] [] [] | + cpio | [] [] [] | + cpplib | [] | + cryptonit | [] [] | + dialog | [] | + diffutils | [] [] [] [] [] [] | + doodle | [] [] | + e2fsprogs | [] [] | + enscript | [] [] [] [] [] | + fetchmail | [] [] [] | + findutils | [] [] [] | + findutils_stable | [] [] [] [] [] [] | + flex | [] [] [] [] [] | + fslint | [] | + gas | | + gawk | [] [] [] [] | + gcal | [] | + gcc | [] [] | + gettext-examples | [] [] [] [] [] [] [] [] | + gettext-runtime | [] [] [] [] [] [] [] [] | + gettext-tools | [] [] [] [] [] [] [] | + gip | [] [] [] [] | + gliv | [] [] [] [] [] [] | + glunarclock | [] [] [] [] [] [] | + gmult | [] [] [] [] | + gnubiff | () [] | + gnucash | () [] | + gnuedu | | + gnulib | [] [] [] | + gnunet | | + gnunet-gtk | [] | + gnutls | [] [] | + gpe-aerial | [] [] [] [] [] [] [] | + gpe-beam | [] [] [] [] [] [] [] | + gpe-calendar | [] [] [] [] | + gpe-clock | [] [] [] [] [] [] [] [] | + gpe-conf | [] [] [] [] [] [] [] | + gpe-contacts | [] [] [] [] [] | + gpe-edit | [] [] [] [] [] [] [] [] [] | + gpe-filemanager | [] [] | + gpe-go | [] [] [] [] [] [] [] [] | + gpe-login | [] [] [] [] [] [] [] [] | + gpe-ownerinfo | [] [] [] [] [] [] [] [] | + gpe-package | [] [] | + gpe-sketchbook | [] [] [] [] [] [] [] [] | + gpe-su | [] [] [] [] [] [] [] [] | + gpe-taskmanager | [] [] [] [] [] [] [] [] | + gpe-timesheet | [] [] [] [] [] [] [] [] | + gpe-today | [] [] [] [] [] [] [] [] | + gpe-todo | [] [] [] [] | + gphoto2 | [] [] [] [] [] [] | + gprof | [] [] [] | + gpsdrive | [] [] | + gramadoir | [] [] | + grep | [] [] [] [] | + gretl | [] [] [] | + gsasl | [] [] [] | + gss | [] [] [] [] | + gst-plugins-bad | [] [] [] | + gst-plugins-base | [] [] | + gst-plugins-good | [] [] | + gst-plugins-ugly | [] [] [] | + gstreamer | [] [] [] [] | + gtick | [] | + gtkam | [] [] [] [] [] | + gtkorphan | [] | + gtkspell | [] [] [] [] [] [] [] [] | + gutenprint | [] | + hello | [] [] [] [] [] [] [] [] | + herrie | [] [] [] | + hylafax | | + idutils | [] [] [] [] [] | + indent | [] [] [] [] [] [] [] | + iso_15924 | | + iso_3166 | [] [] [] [] [] [] [] [] [] [] [] [] [] | + iso_3166_2 | | + iso_4217 | [] [] [] [] [] [] [] | + iso_639 | [] [] [] [] [] [] [] | + jpilot | | + jtag | [] | + jwhois | [] [] [] [] | + kbd | [] [] [] | + keytouch | [] | + keytouch-editor | [] | + keytouch-keyboa... | [] | + latrine | | + ld | [] | + leafpad | [] [] [] [] [] [] | + libc | [] [] [] [] | + libexif | [] [] | + libextractor | [] [] | + libgpewidget | [] [] [] [] [] [] [] [] | + libgpg-error | [] [] [] | + libgphoto2 | [] | + libgphoto2_port | [] [] [] | + libgsasl | [] [] [] [] | + libiconv | [] [] [] | + libidn | [] [] () | + lifelines | [] [] | + lilypond | | + lingoteach | [] | + lprng | [] | + lynx | [] [] [] | + m4 | [] [] [] [] [] | + mailfromd | [] | + mailutils | [] [] [] | + make | [] [] [] [] | + man-db | [] [] [] [] | + minicom | [] [] [] [] [] | + nano | [] [] [] [] | + opcodes | [] [] | + parted | [] | + pilot-qof | | + popt | [] [] [] [] | + psmisc | [] [] | + pwdutils | [] [] | + qof | [] [] | + radius | [] [] | + recode | [] [] [] [] [] [] [] | + rpm | [] [] [] [] | + screem | | + scrollkeeper | [] [] [] [] [] [] [] | + sed | [] [] [] [] [] [] [] [] [] | + shared-mime-info | [] [] [] [] [] [] | + sharutils | [] [] [] [] | + shishi | [] | + skencil | [] [] [] | + solfege | [] | + soundtracker | [] [] | + sp | | + system-tools-ba... | [] [] [] [] [] [] [] [] [] | + tar | [] [] [] [] | + texinfo | [] [] [] [] | + tin | () | + tuxpaint | [] [] [] [] [] [] | + unicode-han-tra... | | + unicode-transla... | | + util-linux | [] [] [] [] | + util-linux-ng | [] [] [] [] | + vorbis-tools | [] | + wastesedge | | + wdiff | [] [] [] [] [] [] [] | + wget | [] [] [] [] | + xchat | [] [] [] [] [] [] [] | + xkeyboard-config | [] [] [] | + xpad | [] [] [] | + +--------------------------------------------------+ + or pa pl pt pt_BR rm ro ru rw sk sl sq sr sv ta + 0 5 77 31 53 4 58 72 3 45 46 9 45 122 3 + + tg th tk tr uk ven vi wa xh zh_CN zh_HK zh_TW zu + +---------------------------------------------------+ + Compendium | [] [] [] [] | 19 + a2ps | [] [] [] | 19 + aegis | [] | 1 + ant-phone | [] [] | 6 + anubis | [] [] [] | 11 + ap-utils | () [] | 4 + aspell | [] [] [] | 16 + bash | [] | 6 + bfd | | 2 + bibshelf | [] | 7 + binutils | [] [] [] [] | 9 + bison | [] [] [] [] | 20 + bison-runtime | [] [] [] [] | 18 + bluez-pin | [] [] [] [] [] [] | 28 + cflow | [] [] | 5 + clisp | | 9 + console-tools | [] [] | 5 + coreutils | [] [] [] | 18 + cpio | [] [] [] [] | 11 + cpplib | [] [] [] [] [] | 12 + cryptonit | [] | 6 + dialog | [] [] [] | 9 + diffutils | [] [] [] [] [] | 29 + doodle | [] | 6 + e2fsprogs | [] [] | 10 + enscript | [] [] [] | 16 + fetchmail | [] [] | 12 + findutils | [] [] [] | 11 + findutils_stable | [] [] [] [] | 18 + flex | [] [] | 15 + fslint | [] | 2 + gas | [] | 3 + gawk | [] [] [] | 16 + gcal | [] | 5 + gcc | [] [] [] | 7 + gettext-examples | [] [] [] [] [] [] | 29 + gettext-runtime | [] [] [] [] [] [] | 28 + gettext-tools | [] [] [] [] [] | 20 + gip | [] [] | 13 + gliv | [] [] | 11 + glunarclock | [] [] [] | 15 + gmult | [] [] [] [] | 16 + gnubiff | [] | 2 + gnucash | () [] | 5 + gnuedu | [] | 2 + gnulib | [] | 10 + gnunet | | 0 + gnunet-gtk | [] [] | 3 + gnutls | | 4 + gpe-aerial | [] [] | 14 + gpe-beam | [] [] | 14 + gpe-calendar | [] [] | 7 + gpe-clock | [] [] [] [] | 21 + gpe-conf | [] [] [] | 16 + gpe-contacts | [] [] | 10 + gpe-edit | [] [] [] [] [] | 22 + gpe-filemanager | [] [] | 7 + gpe-go | [] [] [] [] | 19 + gpe-login | [] [] [] [] [] | 21 + gpe-ownerinfo | [] [] [] [] | 21 + gpe-package | [] | 6 + gpe-sketchbook | [] [] | 16 + gpe-su | [] [] [] [] | 21 + gpe-taskmanager | [] [] [] [] | 21 + gpe-timesheet | [] [] [] [] | 18 + gpe-today | [] [] [] [] [] | 21 + gpe-todo | [] [] | 8 + gphoto2 | [] [] [] [] | 21 + gprof | [] [] | 13 + gpsdrive | [] | 5 + gramadoir | [] | 7 + grep | [] | 12 + gretl | | 6 + gsasl | [] [] [] | 9 + gss | [] | 7 + gst-plugins-bad | [] [] [] | 13 + gst-plugins-base | [] [] | 11 + gst-plugins-good | [] [] [] [] [] | 16 + gst-plugins-ugly | [] [] [] | 13 + gstreamer | [] [] [] | 18 + gtick | [] [] | 7 + gtkam | [] | 16 + gtkorphan | [] | 7 + gtkspell | [] [] [] [] [] [] | 27 + gutenprint | | 4 + hello | [] [] [] [] [] | 38 + herrie | [] [] | 8 + hylafax | | 0 + idutils | [] [] | 15 + indent | [] [] [] [] [] | 28 + iso_15924 | [] [] | 4 + iso_3166 | [] [] [] [] [] [] [] [] [] | 54 + iso_3166_2 | [] [] | 4 + iso_4217 | [] [] [] [] [] | 24 + iso_639 | [] [] [] [] [] | 26 + jpilot | [] [] [] [] | 7 + jtag | [] | 3 + jwhois | [] [] [] | 13 + kbd | [] [] [] | 13 + keytouch | [] | 8 + keytouch-editor | [] | 5 + keytouch-keyboa... | [] | 5 + latrine | [] [] | 5 + ld | [] [] [] [] | 10 + leafpad | [] [] [] [] [] | 24 + libc | [] [] [] | 19 + libexif | [] | 5 + libextractor | [] | 5 + libgpewidget | [] [] [] | 20 + libgpg-error | [] | 6 + libgphoto2 | [] [] | 9 + libgphoto2_port | [] [] [] | 11 + libgsasl | [] | 8 + libiconv | [] [] | 11 + libidn | [] [] | 11 + lifelines | | 4 + lilypond | [] | 6 + lingoteach | [] | 6 + lprng | [] | 2 + lynx | [] [] [] | 15 + m4 | [] [] [] | 18 + mailfromd | [] [] | 3 + mailutils | [] [] | 8 + make | [] [] [] | 20 + man-db | [] | 9 + minicom | [] | 14 + nano | [] [] [] | 20 + opcodes | [] [] | 10 + parted | [] [] [] | 11 + pilot-qof | [] | 1 + popt | [] [] [] [] | 18 + psmisc | [] [] | 10 + pwdutils | [] | 3 + qof | [] | 4 + radius | [] [] | 7 + recode | [] [] [] | 25 + rpm | [] [] [] [] | 13 + screem | [] | 2 + scrollkeeper | [] [] [] [] | 26 + sed | [] [] [] [] | 23 + shared-mime-info | [] [] [] | 29 + sharutils | [] [] [] | 23 + shishi | [] | 3 + skencil | [] | 7 + solfege | [] | 3 + soundtracker | [] [] | 9 + sp | [] | 3 + system-tools-ba... | [] [] [] [] [] [] [] | 38 + tar | [] [] [] | 17 + texinfo | [] [] [] | 15 + tin | | 1 + tuxpaint | [] [] [] | 19 + unicode-han-tra... | | 0 + unicode-transla... | | 2 + util-linux | [] [] [] | 20 + util-linux-ng | [] [] [] | 20 + vorbis-tools | [] [] | 4 + wastesedge | | 1 + wdiff | [] [] | 23 + wget | [] [] [] | 20 + xchat | [] [] [] [] | 29 + xkeyboard-config | [] [] [] | 14 + xpad | [] [] [] | 15 + +---------------------------------------------------+ + 76 teams tg th tk tr uk ven vi wa xh zh_CN zh_HK zh_TW zu + 163 domains 0 3 1 74 51 0 143 21 1 57 7 45 0 2036 + + Some counters in the preceding matrix are higher than the number of +visible blocks let us expect. This is because a few extra PO files are +used for implementing regional variants of languages, or language +dialects. + + For a PO file in the matrix above to be effective, the package to +which it applies should also have been internationalized and +distributed as such by its maintainer. There might be an observable +lag between the mere existence a PO file and its wide availability in a +distribution. + + If November 2007 seems to be old, you may fetch a more recent copy +of this `ABOUT-NLS' file on most GNU archive sites. The most +up-to-date matrix with full percentage details can be found at +`http://translationproject.org/extra/matrix.html'. + +1.6 Using `gettext' in new packages +=================================== + +If you are writing a freely available program and want to +internationalize it you are welcome to use GNU `gettext' in your +package. Of course you have to respect the GNU Library General Public +License which covers the use of the GNU `gettext' library. This means +in particular that even non-free programs can use `libintl' as a shared +library, whereas only free software can use `libintl' as a static +library or use modified versions of `libintl'. + + Once the sources are changed appropriately and the setup can handle +the use of `gettext' the only thing missing are the translations. The +Free Translation Project is also available for packages which are not +developed inside the GNU project. Therefore the information given above +applies also for every other Free Software Project. Contact +`coordinator@translationproject.org' to make the `.pot' files available +to the translation teams. + diff --git a/AUTHORS b/AUTHORS new file mode 100644 index 0000000..7e51fe0 --- /dev/null +++ b/AUTHORS @@ -0,0 +1,14 @@ +Author: +Evan Battaglia ** Concept and main design/coding + +Contributors: +Alex Foobarian ** DND, icons, various other features/bugfixes +Bernd Zeimetz ** Debian packaging +Guilhem Bonnefille ** Autotools and releases +Jocelyn Jaubert ** Track Properties dialog improves +Mark Coulter ** Waypoint symbols +Mathieu Albinet ** Windows port +Quy Tonthat ** Many improves +Robert Norris ** Many improves + +Few other bugfixes/minor patches from various contributors. See ChangeLog for details. diff --git a/COPYING b/COPYING new file mode 100644 index 0000000..eeb586b --- /dev/null +++ b/COPYING @@ -0,0 +1,340 @@ + GNU GENERAL PUBLIC LICENSE + Version 2, June 1991 + + Copyright (C) 1989, 1991 Free Software Foundation, Inc. + 59 Temple Place, Suite 330, Boston, MA 02111-1307 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 Library 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) 19yy + + 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., 59 Temple Place, Suite 330, Boston, MA 02111-1307 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) 19yy 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 Library General +Public License instead of this License. diff --git a/ChangeLog b/ChangeLog new file mode 100644 index 0000000..b2c353c --- /dev/null +++ b/ChangeLog @@ -0,0 +1,6759 @@ + +2019-01-21 +Rob Norris : + * Releasing Viking 1.7 + * Force .po files update + * Import Launchpad translation updates + * Revert "Force .po files update" + +2019-01-18 +Matthew Hague : + * Change of search to present a list of results + +2018-12-16 +Rob Norris : + * Add Calendar display for Tracks + * Fix webtoolformat for point formats + +2018-12-10 +Rob Norris : + * [QA] Should be using unsigned variable type + * Ensure using an MBTiles file as a map default works. + * Ensure on (re)opening MBTiles the map gets drawn. + * [QA] Make explicit this function call result is not used + * Github #63: Allow automatic location lookup on demand. + * Github #63: Allow configuration of GeoClue accuracy request level + * Better processing of tracks with missing elevation data on the first trackpoint. + +2018-12-04 +Rob Norris : + * SF Bugs#154: Remember to commit test program + * [WINDOWS] Mention file used for 64bit build + * SF Bugs#154: Ensure GPX output values are XSD:Decimal + * Fix crash in copying between instances of Viking + * [QA] Actually use error message + * New property of TRW layer should be performed only when a display is available + * [QA] More standard use of #include directive for own files + +2018-11-20 +Rob Norris : + * [DOC] Extra blank lines for markdown text + +2018-11-18 +Rob Norris : + * Ensure curl cleanup is called after all curl usage + * Use HTTPS for OSM trackpoint downloads + * Convert thumbnail image cache from a custom list to a hash table. + +2018-11-12 +Rob Norris : + * Repair broken travis ubuntu builds + add cosmic + * Github Issue #62: Address Endianness Issue with OSM Metatiles + +2018-10-26 +Rob Norris : + * [QA] Fix unintended change to GPL copyright notice text. + * [QA] Remove unnecessary g_free() statement. + * Default to KMZ file type filter on Import from KMZ dialog. + * Improve georef xmpp calculation for large areas. + +2018-10-17 +Rob Norris : + * [QA] Prevent some potential critical warnings in Georef layer drawing + * Fix memory leak in Georef layer + * Auto suggest a filename in exporting to a KMZ file. + * Support multiple images in reading KMZ files. + +2018-10-15 +Rob Norris : + * Support KMZ files with 'Document' xml namespace + * SF Bugs#151: Compatibility with GPSD API v7.[Part 3] + +2018-10-08 +Rob Norris : + * SF Bugs#151: Compatibility with GPSD API v7.[Part 2] + +2018-10-07 +Rob Norris : + * Use libzip in travis build. + * [QA] Lengths can not be negative: part 2. + +2018-10-06 +Rob Norris : + * Prevent compiler warnings about potential uninitialised variables. + * Better scoping of functions when building without libzip + * Improved usage of g_debug() + * [DOC] Prevent some warnings in man page generation + * Fix logic condition in UTM drawing + * Fix elevation range readouts can be imprecise. + * [DOC] Add figure and words for Aggregate Statistics. + * Add calculation of Eddington number to Statistics + * [QA] Remove unused parameter + * [QA] Lengths can not be negative + * [QA] Some white space fixups + * Github Issue #59: Allow build of documentation on more systems + +2018-09-27 +Rob Norris : + * SF Features#148: Allow better resizing of Trackpoint Edit dialog + * Improved .spec file to install help and man files + * Tidy up messed up merge of OAuth + +2018-09-25 +Rob Norris : + * SF Bugs#152: Fix repeatedly showing the license dialog + * Fix handling actual URLs in GPX Waypoint links + * Distribute the new README.md file + * Make explicit the default enum value. + * Generally prefer g_new0() over g_new() + +2018-09-24 +Rob Norris : + * Merge pull request #58 from sikmir/fix-open-mbtiles + +2018-09-18 +Nikolay Korotkiy : + * Fix opening MBTiles file + +2018-09-13 +Rob Norris : + * Merge pull request #53 from yourealwaysbe/edit-tools-shift + +2018-09-08 +yourealwaysbe : + * Merge branch 'master' into edit-tools-shift + +2018-09-08 +Matthew Hague : + * Crosshair cursor for track/route edit split-join + * Add key_release to VikToolInterface + * Add splitter tool + +2018-09-05 +Rob Norris : + * Don't remove default map layer on loading a recent GPX file + * Fix debug output to use the correct variable + * Waypoint position could have changed by altering lat/lon manually + * SF Bugs#151: Compatibility with GPSD API v7 + * OSM Notes has moved to https + * [QA] Remove extraneous brackets + +2018-09-01 +Matthew Hague : + * Enhance track/route new to track/route edit + +2018-08-27 +Rob Norris : + * Ignore unknown actions in toolbar customization. + * Load GPX & KML files to the selected layer on demand + * Fix busy cursor getting stuck on + * Unsensitize some menu entries when not relevant + * Add function to delete duplicate waypoints. + * Merge pull request #54 from yourealwaysbe/route-finder-segments + +2018-08-26 +Matthew Hague : + * Prevent route finder creating new segments + +2018-08-25 +Rob Norris : + * [QA] Better policy not to modify parameter + * Make Ctrl+Delete delete the selected item. + * Enable string lists to expand vertically with dialog resize + * Remove hard coded widget size request for file lists + * High Resolution Display Support + * Merge pull request #51 from guyou/improve-doc + * Fix automake build, as it needs a 'README' file. + * Convert README into Markdown format. + * A setting to control opening file behaviour. + +2018-08-24 +Rob Norris : + * Protect against accessing out of bounds data in copying TRW layers + +2018-08-22 +Guilhem Bonnefille : + * Add missing trailing dot in sentences + * DOC: use variablelist for contextual enumeration + * DOC: use variablelist for graphical options enumeration + +2018-08-21 +Rob Norris : + * Add Build Status to README + * Merge pull request #49 from guyou/patch-1 + +2018-08-21 +Guilhem Bonnefille : + * Do not redownload sources + +2018-08-20 +Guilhem Bonnefille : + * Update .travis.yml + +2018-08-18 +Rob Norris : + * Fix travis builds + * Enable use of clear function for most entry textboxes. + * OAuth 1.0 support for OpenStreetMap usage + * Add preferences lookup + * Allow method to close preferences dialog + * Function to get a VikWindow + * Improved way to access existing parameters + * Allow downloading via curl into memory rather than having to write to a file. + +2018-08-16 +Rob Norris : + * Really fix copying TRW layers to ensure all data is copied. + +2018-08-13 +Rob Norris : + * [QA] Improve a variable name & a comment + * [QA] Prevent compiler warning + * Fix memory leak in setting track/route new names + * Fix copying TRW layers to ensure all data is copied. + * [QA] More explicit statement about ignoring the returned value + * Extend allowed fixed zoom levels for a map view + +2018-07-08 +Rob Norris : + * [DOC] Minor update on the Windows build guide + * Github Issue #46: Better use of realpath() + * No need to get the list of trw layers twice in a search by date + * Prevent crashing on malformed .vik files + * Fix reading Author name in GPX1.1 files + * Support SOURCE_DATE_EPOCH in date usage + +2018-06-29 +Rob Norris : + * Merge pull request #42 from yourealwaysbe/external-layers + +2018-06-28 +Rob Norris : + * Default OSM Nominatim Search address to use https + * Github Issue #45: Fix OSM GPX Upload For Change to HTTPS + +2018-06-06 +Matthew Hague : + * Add external GPX layers + * Expose choose_file for vikfileentry + +2018-05-28 +Matthew Hague : + * Change track timestamp ordering to fall back on name + * Add file save dialog to uibuilder + +2018-05-18 +Rob Norris : + * Merge pull request #43 from krichter722/travis-trusty-comment + +2018-05-17 +Karl-Philipp Richter : + * .travis.yml: Clarify restrictions for Ubuntu 14.04 + +2018-05-14 +Rob Norris : + * [WINDOWS] Windows 32bit build on OpenSUSE no Longer functional. + * SF Bugs#149: [WINDOWS] HTTPS workaround. + +2018-05-13 +Rob Norris : + * [WINDOWS] Enable use of client GPSD DLL (libgps.dll) + * Need to redraw after track segment merge. + * Merge pull request #41 from krichter722/travis + +2018-05-13 +Karl-Philipp Richter : + * added initial .travis.yml + +2018-05-12 +Rob Norris : + * Merging tracks into a route isn't sensible + * Fix combining routes having more than one segment + * SF Bugs#148: Fix reversing manually created tracks & routes + * More action items button icons. + * Fix test program geotag_write for updated function interface. + * [QA] Explicitly mark these functions for ignoring returned values. + * Enable control of showing side panel buttons + * Fix some small memory leaks. + * [WINDOWS] Text string for GPSBabel is now version 1.5.4 + * [WINDOWS] Use UTF8 mode on installer translation files + * [WINDOWS] NSIS plugin location has changed + +2018-04-08 +Rob Norris : + * SF Features#140: Allow Escape Button to return to default tool + * SF Features#140: Allow configuration of the default window tool + * Save to GPS Device Auto GPX Simplification + * Improved GPX write to disk reliability on Linux + * Rename directory win32 -> windows as it now 64bit compatible. + +2018-04-02 +Rob Norris : + * Support Garmin Hunter waypoint symbols + * [DOC] Ensure man page covers routing.xml extension file + * [DOC] Mention url-ll-lat-first routing option + * [DOC] Cookie file has not been used for long time + +2018-03-05 +Rob Norris : + * Merge branch 'WaypointDirection' + * Allow tolerance in comparing waypoint vs geotag position. + * Allow positional comparison with some tolerance + * When geotagging set the time of waypoint. + * Add option to set waypoint image direction automatically when geotagging images. + * Add function to get the angle of one coordinate from another. + * Save waypoint image direction in .vik files + * Add function to convert double to a string with specified format + * Write support for EXIF GPS Image Direction + * Basic read GPSImgDirection support from image files. + +2018-03-05 +Sebastien Bocahu : + * Add support for Brouter routing service + +2018-03-03 +Rob Norris : + * Better use of a_dialog functions + * [DOC] Better section title + * Store information about the original GPX creator + +2018-02-18 +Rob Norris : + * Allow configurable 'creator' value in writing GPX files + +2018-02-12 +Rob Norris : + * Ensure better GPX specification output + +2018-02-10 +Rob Norris : + * Use enumeration rather than fixed numbers + * Remove definition of non existent function. + +2018-02-04 +Rob Norris : + * [DOC] List dependencies better (many are optional) + * Allow 'Apply' for layer properties. + * Make loading lots of GPX files much faster + * [QA] Explicitly ignore some return values + * Fix gpx2gpx.c for latest function changes + +2018-02-04 +danfos : + * Remove debug printf + +2018-02-04 +Rob Norris : + * Tests for timegm() usage + * GeoClue support to get the initial location + * [WINDOWS] Update to GPSBabel 1.5.4 + * Use correct initial table size + * Improve speed of opening large .vik files + * Fix issue with geotag location/time processing. + +2018-01-20 +Rob Norris : + * [DOC] Improve XML validation + +2017-10-31 +Rob Norris : + * DEM Availability by area + * Use LatLonBBox type with DEMs + * Use LatLonBBox type more for viewport areas + * bbox uses glib types + * Don't load files into invisible layers + * Fix loading DEMs from files. + +2017-10-01 +danfos : + * Clip improvements, previous code was not working correct for long distances. + * Improve/simplify vik_viewport_compute_bearing + * OSM can use both email and username (GitHub Issue #25) + * Allow also negative easting and northing values + * Make Ctrl-F open the Search Location window + +2017-10-01 +Rob Norris : + * Fix memory leaks with ruler usage. + * Improve function comment + * Fix correct parameter usage in babel shell command + * Remove unnecessary track name copy. + * Fix correct type usage for wpt_sym name preference + * Force .po files update + * Prevent compiler warning + * Remove unintentional carriage return in a string + +2017-10-01 +Davide Del Vento : + * Option to use pace for speeds + +2017-08-24 +Rob Norris : + * Some spelling fixes in a comment + * Fix memory leak in freeing Waypoints. + * Fix small memory leak. + +2017-08-21 +Rob Norris : + * Merge pull request #32 from davidedelvento/installnotes + +2017-08-04 +Davide Del Vento : + * More dependencies needed, specified in the README + +2017-06-29 +Rob Norris : + * Fix memory leak on re-downloading 'bad' map image tiles. + * gpsbabel filters must come after the input file type+name. + * Remove definition of a non existant function + +2017-06-08 +Rob Norris : + * Ensure maximum altitude is shown in track properties. + * SF Bugs#146: Fix showing elevation gain/loss in track properties. + +2017-05-20 +Rob Norris : + * SF Bugs#144: Fix Export to World File + * Some explicit setting of dirpath values to NULL. + * SF Bugs#138: Fix handling of tags in GPX files. + * Embed GtkHTML 4.10.0 URI functions + * Fix relative file path loading for DEM files. + * Functions to convert potentially relative filenames to absolute filenames. + * Make a newly loaded file layer more accessible in the layers panel + +2017-05-14 +Guilhem Bonnefille : + * Add 4UMaps example + * Add OpenTopoMap example + * Adding Waymarked Trails layers as example + +2017-04-29 +Rob Norris : + * [DOC] Switch from ordered list to a itemitized list. + * Automatically remove suspicious first points of GPX Tracks. + * Remove unnecessary include statement + * Ensure string value is copied. + * Some test programs should call more uninit functions. + * Rework layer set parameters so it should be more easily extendable. + +2017-04-14 +Rob Norris : + * Remove unnecessary defines and undefs + * Remove non existent function. + * Shift pure glib code from file.c to fileutils.c to simplify dependencies. + +2017-04-04 +Rob Norris : + * XDG_CACHE_HOME compliant thumbnail usage + * Have a non blank tooltip for empty aggregrate layers + * [DOC] Mention XML configuration can override internal defaults. + * Make each tool contain it's own icon definition. + * Ensure consistent use of internal names in building the UI + +2017-03-31 +Rob Norris : + * Use configurable apikey for OSM Cyclemap tiles. + * Fix comment in AC DEFINE + * Remove unused define + +2017-03-28 +Rob Norris : + * Actually use the calculated scale factor in the viewport + * [DOC] Mention map tilesize configuration. + * Improve function comments as these don't return anything + * Fix small memory leak when downloading bzip files. + +2017-03-17 +Rob Norris : + * Menu option to (re)open an MBTiles file. + * Shift include of gpsmapper.h to the only place that uses it + * Add OSM GPS Tiles in default data config + * Remove old tests that no longer useful + * Put vikutils.h into viking.h + * Tidy up type usage + * Disable download menu options for non-downloadable maps + +2017-03-13 +Rob Norris : + * Enable compile time option for Mapbox access token. + * Enable compile time option for geonames username + * Use our standard yes/no dialog box and enable i18n of the string. + * Tidy TrackWaypoint post read & verify thumbnails functions + * Fix gps layer not showing items after file load. + * Really empty GPS realtime layers. + * Prevent Gtk Warnings in deleting all TrackWaypoint items + * Fix spelling in gpsd retry warning print out + * More consistent variable names in gps layer + * Compatibility for latest GEXIV2 0.10.4 + * Trap some errors reported by gpsbabel + * Threading rewrite to remove use of unsupported cross platform threading update of the GUI. + * Improve GPS layer tooltip to include GPSD connection details. + * Add option to auto connect to GPSD rather than having to manually control + +2017-02-27 +Rob Norris : + * Fix Waypoint name suggestion after delete all waypoints + * Fix GTK warnings in Waypoint window + * [DOC] Notes about using the URL field in map configs + * More strings marked for i18n + * Fix URL display of Map tiles + * Improve hostname/uri usage + * Fix GPX file loading in a previously selected layer. + +2017-02-25 +Rob Norris : + * Add Church as a Wikipedia waypoint feature type. + +2017-02-25 +huobos : + * Some more variables need marking for i18n + * More Chinese translations + * Make more text translatable + * Replace remaining gettext calls with '_' + * Improved method for Wikipedia i18n URL + +2017-01-24 +Rob Norris : + * Merge pull request #20 from huobos/zh_CN + +2017-01-24 +huobos : + * zh_CN translation + +2017-01-22 +Rob Norris : + * Info message to remind user of the version in use. + * Ensure correct capitalization of the program name + * Improved feedback/feature availability when no direction routing engines are available. + * Add function to return counts of available routing engines. + * Add YOURS online routing. + * Remove as OSRM routing option as it no longer supports GPX output. + * [DOC] Add details about routing format option + * Allow specifying an alternative URL base location for acquiring DEM SRTM files. + * Use https DEM download site by default + * Allow redirects when attempting to download DEM files. + * Simplify DEM base URL to be one value rather than separate components. + * Prevent compiler warnings - rework as vtl variable type has changed. + +2017-01-21 +Rob Norris : + * Merge pull request #19 from huobos/typo + * Merge pull request #17 from huobos/gpx + +2017-01-20 +huobos : + * Fix typo word Polygonized + * Open files in selected layer + +2017-01-14 +Rob Norris : + * Fix small memory leak. + * Fix small memory leak + * Enable understanding pasted text strings with tabs. + * Fix some spelling mistakes. + * Fix small memory leak. + * Shell test should be '=' rather than '==' for maximum portability. + * Clarify only Bing Aerial Map available. + * Fix small memory leak - free dirpath in all circumstances. + * Fix spelling + * Fix toggling visibility of the menu. + * Support Lodge symbol + * [DOC] Use macro for GPSBabel references + * [DOC] Use URL links to programs + +2016-08-16 +Rob Norris : + * Fix some missing nautical miles output. + * Fix issue in display of maximum speed when there is no speed. + +2016-08-11 +Rob Norris : + * Only call gps_close() after a successful gps_open(). + * Replace defunct IP to location lookup service. + * Github #15: Relicense files marked GPL2 only to GPL2+. + * Explicitly license my small test code+script files as Creative Commons CCO + * SF Bugs#135: Fix OSM Maps shown by default at Maximum Zoom. + +2016-08-09 +Rob Norris : + * SF Bugs#133: Remove the auto added map when opening the first .vik file from the GUI. + * Add aggregate layer functions to return number of layers and to delete a specified child layer. + * Disable more functionality that doesn't work if gpsbabel is not available. + * Fix recent commit: 4dc72a1d407b81853d0093871cff45ef1f47d1b8 + +2016-08-08 +Rob Norris : + * Improved usage of g_stat() + * [DOC] Remove note on GPSBabel Google Direction routes which no longer work. + * [DOC] Stellarium release 0.15.0 has fixed this bug. + * SF Bugs#134: Replaced discontinued MapQuest tile service with rate limited Mapbox Outdoors service. + * Fix crash if a map configuration has no hostname or URL defined. + * Be more explicit that the return value of g_printf() is ignored. + +2016-06-25 +Rob Norris : + * Remove unused function. + * Replace internal uri_escape() function with a glib version. + * Load the startup file first so that subsequent files are loaded on top. + * SF Bugs#132: Fix to correctly open GPX files in Windows via double click. + * [WINDOWS] Extra files needed for theming to work + * Merge pull request #14 from apre/master + +2016-06-23 +apre : + * add debian build-dependencies in readme + +2016-05-03 +Rob Norris : + * Use the correct definition. + * Fix to return the correct hash table pointer. + * Fix to use the correct GC index for drawing track stops. + +2016-05-02 +Rob Norris : + * SF Bugs#130: Fix GeoRef layer alpha value change to 255 is ignored until restart + * Better type to remove compiler warning + * Second fix to e778b260c460c218a8efa27c178219cccf731452 to correct elevation output in GPX files. + * Improve babel debug output + +2016-04-25 +Rob Norris : + * Fix e778b260c460c218a8efa27c178219cccf731452 - missed commit of this file. + * Return function value is ignored in this case. + * Notice gps_stream() errors from gpsd + * Fix small memory leak as this regex should be freed after use. + * Use existing variable rather than explicit name. + * Fix incorrect directory in this README.txt + * Minor update for a perl tool. + * Reduce compiler warnings on Windows. + * Check that the test_babel program runs + * Simple test for basic GPX read->write conformance. + * SF Bugs#22: Fix changing coordinates when saving and exporting + * Ensure some test programs run properly. + * Remove use of function local static variables for code simplicity. + * Don't write unnecessary GPX metadata tags for empty fields. + +2016-04-23 +Rob Norris : + * Prefer default TrackWaypoint layers to be in LatLon mode. + +2016-04-10 +Rob Norris : + * Merge pull request #13 from JojoBoulix/reproducible + +2016-04-10 +JojoBoulix : + * Fixed order headers inclusion in icons.c + +2016-04-09 +Rob Norris : + * Remove use of unnecessary pointer to pointer variables. + * Enable clearing spinbox entries on some numerical input boxes. + * Enable a clear icon on entry boxes used for search like input. + +2016-02-12 +Rob Norris : + * More sensible new name allocation. + * Remove own copy of MD5 hash code and use a library implementation (libnettle) + * [WINDOWS] Enable Windows 64bit cross build + +2016-02-11 +Rob Norris : + * Extra output in case of SQL prepare statement failure. + * Increase line reading length + * Support GPX 'type' field on Waypoints, Tracks and Routes. + * Support GPX src field on Waypoints, Tracks and Routes. + * Don't close track property dialog on return keypress on entry fields. + +2016-01-30 +Rob Norris : + * vikcoord does not depend on GTK + * [QA] Another use of GStatBuf + * [QA] This function should be static + * Import Launchpad translation updates - French Update. + * Retain DOP values when saving to .vik files + +2016-01-29 +Rob Norris : + * [QA] Improve types as string lengths are never negative. + * Prevent writing broken .vik files with multi line strings. + * SF Bugs#128: Fix Crash when loading broken .vik file + * [QA] Enable all warnings on test code + * [QA] Consistent usage of g_stat() GStatBuf parameter type + * Fix crash if a route requested by the route finder is empty. + * [QA] Remove unused variable. + * Enable activating waypoint search when pressing return in the entry field. + * In the location search, only enable the OK button when there is some text to search with. + +2016-01-17 +Rob Norris : + * Enable handling compressed files when acquiring from an URL datasource. + * Fix definition and usage of datasource download file options. + * Remove curl cookie file as it's read only - so never actually used anymore. + * Fix maintaining a transparent background when an alpha value is applied to a pixbuf. + * Remove the now unused viewport alpha pixbuf and gdk pixbuf compositing method. + * Apply alpha setting to the waypoint image pixbuf before storing in the image cache. + * [QA] Reusable function for freeing the waypoint image cache. + * [QA] Remove unused variable. + * Ensure compressed download files are processed. + * [QA] Better value type usage, even if these values are not actually used. + +2015-12-24 +Rob Norris : + * Text output using AC_MSG_NOTICE rather than echo statements. + * [WINDOWS] Build with libgexiv2 + +2015-12-21 +Rob Norris : + * Ignore help/viking.xml as it's now auto-generated. + * [WINDOWS] Cross build + * Make generation of the copyright year in the code automatic. + +2015-12-19 +Rob Norris : + * Don't remove project name if one decides not to delete all layers. + +2015-12-15 +Rob Norris : + * Mention use of libexpat + * [QA] Rename DownloadMapOptions --> DownloadFileOptions + * AC_OUTPUT doesn't need to take any arguments + * viking-cache.py tool: Enable converting from OSM cache layout to mbtiles. + * viking-cache.py tool: Rework into simple elif statements. + * viking-cache.py tool: Allow specifying zoom limits in creating mbtiles file + * Allow copying positions as well from the waypoint list dialog. + * Allow configuration of the date format displayed on Track and Waypoint lists. + * Add tooltip for a more readable hours:minutes display rather than just total minutes in the track statistics tab. + * Add display of the without gaps track time. + * Extend function to get optionally get duration of a track without including gaps between segments. + * Save bfilter values used for subsequent reuse in a session. + * Add settings to override bfilter simplify and compress default values. + * [QA] Extra output for failing date/timezone string generation. + * Add capability to manually define parameters for GPSBabel filter command. + * Merge branch 'KMZ-Maps' + +2015-12-14 +Rob Norris : + * [DOC] KMZ Map help + * KMZ file of OSM Mapnik rendering of Stonehenge area, zoom level 15. + * [WINDOWS] Installer and build notes for using libzip.dll + * Allow internal check_magic function to work on various lengths as specified. + * Enable importing a map from a KMZ file. + * Allow creating GeoRef layers from a specified pixbuf and area. + * Make the find best zoom level function reusable. + * Add utility function to write a temporary file from a byte buffer. + * Enable KMZ Map file generation for Custom Map support on Garmin devices. + * Fix routes not saved in GPX when tracks are made invisible. + +2015-12-12 +Rob Norris : + * SF Bugs#103: Fix TrackWaypoint layer items may not be displayed when pasted + * Enable Catalan and Turkish translations. + * Auto generate the date for man pages. + * Restore opening of JPG files. + +2015-12-07 +Rob Norris : + * [QA] Tidy trw_layer_draw_point_names() + * SF Bugs#127: Fix initial display of Waypoint sort order. + +2015-12-04 +Rob Norris : + * Fix map layer widget sensitivity dependent on map type. + * Merge pull request #8 from swegener/etag-in-xattr + * Merge pull request #3 from Shura0/point_names + +2015-11-29 +Sven Wegener : + * download: Move setting of etag and convert_file + * download: Store ETAG in extended attributes + +2015-11-24 +Rob Norris : + * Releasing Viking 1.6.1 + * Shift the reference scale to be generated from the centre of the display. + * Update viking.doap file + +2015-11-17 +Rob Norris : + * [DOC] Words about various operations from the File menu not previously mentioned. + +2015-11-15 +Rob Norris : + * Ensure calculation of the waypoint bounds even when the layer is not currently visible. + +2015-11-14 +Rob Norris : + * Better reporting of failing to load any latlontz.txt file. + * CID#34578: Remove logically dead code. + * CID#132266: Fix potential dereference null return value + * [QA] Clang-Analyzer: Don't store values that aren't subsequently used. + * [QA] Clang-Analyzer - remove duplicate line + * Ensure removing temporary file when it contains no wikipedia places. + * [QA] Explicitly ignore return values when removing temporary generated files + * [QA] CID#34606+CID#34607: Time of check time of use (TOCTOU) issues. + * Ensure memory is freed if errors are encountered in acquiring My OSM traces + * CID#34579: Fix logically dead code. + * Coverity: Prevent deference after null checks + * CID#34561+CID#34569: Check return values + * CID#34586: Avoid potential explicit null deferenced + * CID#34612: Fix incorrect break statement location. + * CID#132255: Fix stray semicolon introduced by recent commit. + * CID#34592: Explicit handling of potential truncation of integer value + * Coverity: Fix deference after null checks + * CID#34600+CID#34601: Fix deference before null checks + * [QA] CID#34594: Remove unsigned compared against 0 (as it has no effect) + +2015-11-10 +Rob Norris : + * Document previous translation updates + * Import Launchpad translation updates + * Include HACKING file in distribution. + +2015-11-08 +Rob Norris : + * Fix Georef mpp from coords. + * Make OSM services the default by including these modules first. + * Simplify filter actually uses the unsigned integer value. + * Fix Google maps positional web link. + * [QA] Fix issue spotted with cppcheck 1.70 + * Remove unused northernHemisphere variable + * [QA] Output console message if g_mkdir_with_parents() is unsuccessful. + * CID#34603: Protection in copying into fixed size buffer + * CID#34584+CID#34583: Prevent deference after null check + * CID#34611+CID#34611: Prevent use of uninitialized scalar variables + * [QA] CID#34576: Remove logically dead code + * [QA] CID#34575: Remove logically dead code. + * [QA] CID#34543: Adjust curl_get_etag_func to use pointer to structure rather than the raw address. + * CID#131392: Avoid potential null pointer dereference + * CID#34574: Fix freeing the appropriate variable. + * [QA] Generally print warnings to the console for low level file operations (since they don't normally go wrong) + * [QA] CID#34547: Path value is checked so not worried about function return value. + * [QA] Coverity: Unchecked return value from library + * Fix track tooltips minutes value should be rounded. + * CID#101113: Result not floating point + * [QA] CID#101114+CID#101115: Result not floating point + * [QA] CID#131384: Check function return value. + * [QA] CID#131386: Check function result + * [QA] CID#131385+CID#131387: Be more explicit that we don't care about the result of this function call. + * [QA] CID#131393: Missing break in switch + * [QA] CID#131394: Check result of g_fopen() + * [QA] CID#131401+CID131400 - Improve printf arg types. + * [QA] CID#131402: Fix resource leak in handling metatile errors. + * Fix creating waypoints from JPGs when using gexiv2 + +2015-09-25 +Szymon Bigos : + * SF Bugs#126: Fix crash in gdk_rgb_convert_0888 due to using deallocated memory. + +2015-09-25 +Rob Norris : + * Disable Search and Routing with Google as they no longer support the APIs Viking used. + * Fix availability of Geotag consistency checks when using gexiv2 + +2015-09-24 +Rob Norris : + * Remove --with-search configure options since they are not used. + +2015-09-22 +Rob Norris : + * Improve place search failure message to say if it is a service level issue. + +2015-09-21 +Rob Norris : + * Protect against possible out of bounds array access. + +2015-09-15 +Rob Norris : + * [QA] Coverity 'Uninitialized pointer read' CID#34608 + CID#34609. + * [QA] Coverity 'Buffer not null terminated' issues CID#34544 + CID#34545 + +2015-09-13 +Rob Norris : + * Fix DEM height points on track graphs when height units is in feet and non-zero minimum height. + * [DOC] Improved introduction. + +2015-09-12 +Rob Norris : + * Only perform man page generation when scrollkeeper is also installed. + * [QA] Remove repeated statements in configure.ac + * Fix mapnik preferences initialisation to not crash if preferences are not available. + * Enable reference documentation generation by disabling optional components. + +2015-09-12 +Guilhem Bonnefille : + * Reactivate doc subtree + +2015-09-10 +Rob Norris : + * Ensure thumbnails are created when opening JPG files. + +2015-09-02 +Guilhem Bonnefille : + * Insert parameter for Viking's version in viking.xml + +2015-08-31 +Roman Lebedev : + * Fix 2 heap-buffer-overflows in trw_layer_download_map_along_track_cb() + * Fix heap-buffer-overflow on Layers -> New GPS Layer + +2015-08-31 +Rob Norris : + * SF Bugs#121: Additional race condition crash protection. + +2015-08-31 +Szymon Bigos : + * SF Bugs#121: Fix crash when invalidating previously acquired tiles. + +2015-08-30 +Guilhem Bonnefille : + * QA: extract effective code from g_assert + * DOC: Fix typo + +2015-08-29 +Guilhem Bonnefille : + * DOC: fixed typo + +2015-08-22 +Guilhem Bonnefille : + * Fixed typo on the bzip2 option's name in configure + +2015-07-29 +Rob Norris : + * [QA] Extra info on magic usage. + * [QA] Extra info when using bzip2. + * SF BugsZZ#123: Fix bzip2 decompression on Windows. + +2015-07-16 +Loic Pefferkorn : + * Fix Geocaches acquiring with latest geo-* software + +2015-07-11 +Rob Norris : + * Mapnik3 support. + * More correct menu icon + +2015-07-10 +Rob Norris : + * Don't attempt download if temporary file can't be opened. + * [QA] Fix spelling in a comment and add function comment + +2015-07-08 +Alexander Zaitsev : + * Optimization + +2015-07-08 +Rob Norris : + * Ensure layer visibility is retained when copying layers. + +2015-07-07 +Rob Norris : + * SF Bugs#121: Provisional fix + * [WINDOWS] Fix reading zip files on Windows due to compiler alignment defaults changing. + * Read zip files contents which are stored with no compression. + * [QA] Protection from large malloc failures + +2015-07-07 +Alexander Zaitsev : + * trackpoint labels + +2015-07-05 +Rob Norris : + * Fix logic for comparing timestamps + * [QA] Use correct type in sizeof function for memory allocation. + +2015-05-31 +Rob Norris : + * Don't retain GTK Dialogs in memory. + * Re-fix SF Features #82. Simplify usage of restoring the last used directory. + * [QA] Don't need copy this string. + * [QA] Use map ids + * SF Bugs#122: Fix memory cache confusion with multiple "On Disk OSM Tile Format" maps + +2015-05-04 +Rob Norris : + * Prevent Gtk-Critical warnings after viewing the Track property dialog. + * Support all values of GPS Mode fixType. + +2015-05-03 +Rob Norris : + * [QA] Fix typo in (an unused) macro definition. + +2015-05-03 +Matthew Hague : + * keep alpha channel on mapnik rendering, scale alpha to alpha of mapnik layer + +2015-05-02 +Rob Norris : + * SF Bugs#120: Fix Track drawing bug across the 180th Meridian. + * Red Hat Bugzilla – Bug 1210403: Only download and process one Bing attribution list. + * Simplify debug output of loaded Bing attributions. + * [QA] Make function names more unique to simplify use of debugger breakpoints. + +2015-04-28 +Rob Norris : + * Make simple GPSBabel filter options use the updated acquire framework options. + * Rework Acquire framework process function options for maintainability and understanding. + +2015-04-21 +Rob Norris : + * Fix stability of some 32 bit builds. + +2015-04-18 +Rob Norris : + * Fix tracks and routes not displayed when downloaded via the GPS Layer. + +2015-04-17 +Rob Norris : + * Fix availability of the Google routing direction engine + * Prevent crashing on direction requests when no engine is available. + * [QA] Rename routing engine function as it gives URLs + +2015-04-16 +Rob Norris : + * Fix display of map tile source information when it has extended characters. + * [WINDOWS] Remove usage of 'filter with' functions as these don't work in Windows. + * [WINDOWS] Fix a missing \ in a potential gpsbabel location. + * Update Help to wiki conversion method as the wiki is now in Markdown. + * datasources.xml file should be packaged + +2015-04-04 +Rob Norris : + * Fix warning in a test program. + * [DOC] Update copyright year + +2015-03-29 +Rob Norris : + * Fix potential broken builds. + * Releasing Viking 1.6 + * Fix new test programs to work under 'make distcheck' + * Fix renamed file + * [DOC] Improve formal docbook compliance. + * Add more files that have i18n. + * Debian #746815: Fix loading image thumbnails when some Unicode chars in the pathname + * [QA] White space fixes + * Detect gdk_pixbuf_save failures in thumbnail generation + * Debian #761966: Remove an incorrect accelerator in the German translation. + * Document previous translation updates + * Import Launchpad translation updates + +2015-03-28 +Rob Norris : + * [DOC] Interpolate Times + * Prevent potential infinite speeds in interpolating time function. + +2015-03-28 +Christian Müller : + * Interpolate timestamps of a track between first and last trackpoint + +2015-03-28 +Rob Norris : + * Extend TrackWaypoint layer tooltip to include the total length of routes. + * Fix mislabelled distance markers when using Nautical Miles. + * [QA] Fix (an unused) function parameter type. + * Enable a method to copy the time in the Trackpoint and Waypoint Edit dialogs. + * Enable invoking Web Tools via right click menus on selected layers or points. + * [QA] Prevent a Gtk-Critical warning. + +2015-03-27 +Rob Norris : + * [QA] Update comment regarding GPSBabel version for Overpass API query result handling. + +2015-03-19 +Christian Müller : + * Improve layout of the Edit Trackpoint dialog. + +2015-03-18 +Rob Norris : + * Fix initialization so that preferences aren't accessed too early. + * Fix toolbar preference types + +2015-03-17 +Rob Norris : + * Fix changed Wikimedia Toolserver GeoHack URL + * Add built in support for OSM Query requests. + * [QA] Normalize OSM URL. + * [QA] Improve tool_edit_trackpoint_click() comments + * Add advanced setting to create TrackWaypoint layers without asking for details. + +2015-03-16 +Rob Norris : + * Fix enable selecting trackpoints/routepoints via Edit Trackpoint tool when the other kind is invisible. + * SF Bugs#118: Fix route point selection via the Edit Trackpoint tool. + * Allow re-sizing the width of the layers panel to smaller than the initial value. + +2015-03-09 +Rob Norris : + * SF Bugs#117: Confirm capability with GPSD_API_MAJOR_VERSION=6 (gpsd 3.12 / libgps.so.22) + +2015-03-08 +Rob Norris : + * [WINDOWS] Update to GPSBabel 1.5.2 + * [WINDOWS] Enable faster building by using all available CPUs. + * Use the correct variable name! + +2015-03-06 +Rob Norris : + * [QA] Force integer type in calls to abs() as x,y in GdkEventButton are doubles. + * [QA] Use labs() instead of abs() in comparison of timestamps to avoid truncation issues + * [QA] Fix clang warning: format string is not a string literal + * Fix building when geotagging is disabled. + +2015-02-24 +Rob Norris : + * SF Features#122: Export Track, Route and Waypoint Lists as text. + * White space fixes. + * [QA] List display of maximum track height could be a negative value. + * Merge branch 'TimeSort' + +2015-02-22 +Rob Norris : + * Improve date treeview storage consistency by updating TRW layer when sublayers are deleted. + * Add ability to sort Aggregate layers and sublayers of Tracks and Waypoints by date. + * Refactor getting first timestamp for VikTrwlayers (and sublayers) into reuse-able functions. + * Refactor sublayer sort to use a common function. + * Fix uniquify tracks to use the appropriate sort order. + * Remove 'has_visibile_column' from treeview as it's always true. + * Merge branch 'MapnikRenderingLayer' + +2015-02-12 +Rob Norris : + * Test file zoom out so it's more obvious the location. + +2015-02-10 +Rob Norris : + * [DOC] Add some words about Advanced Prefrences. + * Display attribution on Mapnik Renderings. + * Enable displaying of Mapnik configuration extra parameters. + * Separate thread pool for Mapnik rendering defaulting to just 1 task. + * World Countries test data and configuration for Mapnik Rendering. + * Mapnik library needs full filename for the configuration file. + +2015-01-31 +Rob Norris : + * [DOC] Document the Mapnik Rendering Layer capability. + * [QA] Minor document correction. + * Fix displaying refreshed map tiles. + * Add mapnik rendering tile info. + * Allow the Mapnik rendering buffer size to be altered via the config file. + * Extend map cache data to hold extra data associated with the pixbuf. + +2015-01-27 +Rob Norris : + * Add method to force re-running carto for a Mapnik Rendering Layer. + * Mapnik Layer tool. + * [QA] Prevent some Gtk-CRITICAL messages about values out of range. + * [WINDOWS] Explore compiling against mapnik with g++ - but ultimately disable it. + * Enable using an optional file cache for Mapnik Renderings. + * Add Refresh to consider reloading a Mapnik Rendering configuration. + * Use threading with Mapnik Renderings layer. + * Pass Mapnik loading errors around and display in the GUI. + * Add GUI About Mapnik information. + * Carto CSS support to generate Mapnik XML. + * Create a mapnik interface object so each Mapnik Layer will render using a separate mapnik::map + * A Mapnik Rendering layer + * Split background threads into two pools. + * Simple function to add a file into the GTK+ Recent list. + * Add Inverse TMS to Spherical Mercator VikCoord conversion (top left corner) + * Shift Inverse TMS MapCoord <=> Spherical Mercator VikCoord functions for global access. + * Add ability to remove the map cache for a single map type. + * Add function to get number of processors. + * Add XML as file entry filter option. + * [DOC] Add command line synopsis from the man page into the help. + * Allow starting Viking with command line parameters to set position, zoom and map type. + * Add functions to allow getting the default and setting the map layer type. + * [QA] Fix vik_maps_layer_get_map_type() and improve return type. + * [QA] Use map ids. + * Rework Map Tile information output to use new multi line dialog. + * Add a dialog to display several separate lines of text. + * Fix drawing of copied MBTiles map layers. + * [QA] Write boolean check in a more standard manner. + * [QA] Fix spelling mistakes and note that the INSTALL file is for Unix like systems. + * Allow various variable text output to be selectable so the user can copy the information. + * Add a function to enable creating a selectable label. + * [QA] Fix incorrect comment. + * Enable opening an external Astronomy program at the specific date & time of a trackpoint or waypoint. + * Slightly more configurable support for RedNotebook. + * Add 'Education' back into the Desktop Specification. + +2014-12-16 +Rob Norris : + * Release some resources on program exit. + * Correct Bing Aerial map name and allow for i18n. + * Shift Map Ids into a central location for ease of knowing what is in use. + +2014-12-14 +Rob Norris : + * Show maps layer tile grid lines in extreme debug mode + * Shift GTK+ compatibility definitions into vik_compat.h + * Extend zoom menus to cater for the highest zoom levels. + * Prevent compiler warnings with GLIB version 2.32 or later. + * SF Features#129: Advanced Maps Layer drawing configuration. + * Fix potential crashes from long running threads in a removed window. + * Remove configure check for strdup() as it is not used. + * SF Bugs#116: Fix erroneous usage of abs(). Use fabs() instead. + * Fix stdout/stderr variable usage. + * Improve potential statusbar message of a selected trackpoint. + * Fix display of calculated speed for the statusbar message. + * Remove not very helpful debug message since it can generate large volumes of messages. + * Support showing a climb (vertical speed) value in the statusbar. + * [QA] Minor function rename for consistency + * Shift build configurable bits into modules.c + * [WINDOWS] Tidy up Windows build + * SF Bugs#112: Enable using libgexiv2 for writing geotag image data to void XMP data loss. + +2014-11-16 +Rob Norris : + * SF Features#124: Enable modifier key to enable panning in select tool mode. + * Merge branch 'GeoRefImprove' + * [DOC] Update GeoRef Layer documentation for the latest capabilities. + * [DOC] Shift GeoRef layer help into a separate file. + * Add alpha capability to GeoRef images. + * Move function to apply an alpha value to be reuse-able. + * GeoRef Layer improvement to offer entering coordinates in Lat/Lon. + +2014-11-05 +Rob Norris : + * By default automatically attempt to read the associated world file of a new georef image. + * Refactor world file reading to be more reuseable and improved comments. + * Extend file entry to enable running a callback on entry accepted. + +2014-11-04 +Rob Norris : + * GeoRefLayer is always created before the properties dialog is called. + * Remove unnecessary restriction on GeoRef layer needing to be in UTM Mode. + * SF Bugs#113: Fix waypoints can be accidentally moved on (re)selection by the select tool + +2014-11-02 +Rob Norris : + * [QA] Fix compiler warning from previous commit + * SF Bugs#115: Fix application hanging on degrees input ending in a comma. + +2014-10-29 +Rob Norris : + * Some geotagging tests. + * SF Features#125: Don't export unchecked items when exporting GPX files. + * SF Bugs#114: Fix Shortcut keys get reset next start + * Use test_metatile as a test program. + * [QA] Prevent depreciated warnings from test programs. + * Fix memory leak in saving Geotag EXIF information. + * Fix memory leak in display of the preferences window. + * Fix crashing on invoking the Customize Toolbar from the preferences dialog. + * [DOC] Toolbar customization. + +2014-10-17 +Rob Norris : + * Bump requirements to match the code. + * Fix for non portable GNU only strcasestr() function. + +2014-10-16 +Rob Norris : + * [DOC] Wiki Help URL change. + * [DOC] Fix some strict docbook validation issues. + * [DOC] Recommended programs + +2014-10-15 +Rob Norris : + * [WINDOWS] Various install improvements. + * [WINDOWS] Must accept GPL2 license before installing. + * [WINDOWS] .vik file registration is automatic, .gpx is optional + * [WINDOWS] Enable optional install of GPSBabel 1.5.1 + * [WINDOWS] Toolbar default to be similar to previous non optional setting. + * [WINDOWS] Update to use libcurl 7.34.0 + * [WINDOWS] Update to compile with GCC4.8.1 + * [WINDOWS] Fix path in installer generation + * [WINDOWS] For some reason the compiler under Windows doesn't like variables such as 'stdout' or 'stderr' + * [DOC] Some words about GPX export options. + * [WINDOWS] Default locations for GPSBabel + * Only enable Google routing when GPSBabel is available. + * Allow specifying the location for GPSBabel via a preference. + * Update README to reflect current capabilities and fix changed Git URL. + * Ensure waypoint bounds are recalculated when a waypoint is deleted. + * Add TIFF as an image file type that gets listed in the applied filter. + * [DOC] Add manual section about the command line options. + +2014-10-14 +Rob Norris : + * 'extreme' debug mode (i.e. -Vd) to not remove downloaded temporary files. + * Make "utils.h" commonly available in "viking.h" + * Add simple amenity POI datasource for immediate use and an extended example. + * [DOC] Help for the extended datasource. + * Add i18n and activate on return key in the entry in web datasource. + +2014-10-13 +Matthew Hague : + * added help for the extended datasource stuff + * removed a grab_focus that wasn't working + * fixed a memory leak in babel.c + * added map to datasources so that last string is remembered by datasource not one for all + * added save previous user input string and input label options to datasource search with user string + +2014-09-30 +Matthew Hague : + * added search capability to datasources.xml, undocumented so far + * added capability of adding babel filter args to external datasources + +2014-09-28 +Matthew Hague : + * gps babel filters must be applied between the input and output options (separate from other options that must be passed first), implemented version of a_babel_convert_from and a_babel_convert_from_url to handle this properly + +2014-09-24 +Rob Norris : + * Merge branch 'MapsExtendedConfiguration' + +2014-09-15 +Rob Norris : + * Extend TMS and WMSC maps to handle Zoom and Area extents. + * Add and use capability of defined area by min/max lat/lons for map types. + +2014-09-13 +Rob Norris : + * [DOC] Improve Map Layer documentation including properties of the map layer. + * [DOC] Remove references to defunct Terraserver maps. + * Add OSM Metatiles as a Map Type so one can read metatiles directly from disk. + * Read OSM Metatile capability and basic test with single example metatile. + * [QA] Explain some more map configuration options. + * SF Features#121: Support reading alternative forms of tile image names. + * Improve tile info dialog message to print out the filename even when cache file is not on disk. + * [WINDOWS] Add cache tool script into Windows distribution build. + * Add and use capability of defined individual map types zoom minimum and maximum levels. + * Enable Cache conversion in the Python tool viking-cache.py + * Change tool to require specifying the mode of operation. + * More reliable file processing in creating an mbtiles file. + * Python 3 compatibility. + * Rename viking cache tool in preparation for more than just mbtiles usage. + * Enable importing from an mbtiles file to Viking cache via the python tool. + * [QA] Rename mode to id. + * Add map name property which is used in the directory path of the cache storage. + * Default map caches for new users to use the OSM layout scheme. + * Enable Map Cache layout control per map. + * Add capability to save layer defaults from outside the layer defaults code. + * Fix up toolbar/menu toggle button alignment when loading from Viking files. + * Fix broken generated toolbar UI file definition. + +2014-09-12 +Rob Norris : + * Merge commit 'ToolbarConfig' + +2014-09-06 +Rob Norris : + * [QA] Prevent warning from test_coord_conversion.c and ignore test outputs + * [QA] Ignore test_babel build output + * [QA] Tidy test_babel.c to compile without warnings and a hint on usage. + * More accurate description for the .spec file. + * [QA] Fix spelling mistake. + * Fix incorrect map id variable saved for remembering licenses shown. + * [QA] Add warning if file rename fails. + +2014-08-21 +Rob Norris : + * Add debug output view of the Back/Forward positions. + +2014-08-04 +Rob Norris : + * Integrate toolbar code to be used with Viking windows. + * Extend toolbar code for usage with Viking. + * [QA] Use VIK_VIEWPORT_DRAWMODE values in GtkRadioActionEntry mode_entries[] + * Give all action entries with an icon a tooltip. + * Add capability to use a button callback within UI builder. + * Add Gtk+ utility functions from Geany 1.24.1 + * Add glib utility functions from Geany 1.24.1 + * Add toolbar code from Geany 1.24.1 + * [QA] Shift Gtk dependent utility functions into separate file. + +2014-08-03 +Rob Norris : + * Fix commit SHA:e8518759e6c64fac28783cf190b82705dc4bbb87 + * [QA] Remove very old unused code from vikmapslayer.c + +2014-08-01 +Rob Norris : + * Save and use the position of the horizontal pane when restoring the window layout. + * [QA] Better to claim key board event handled for F5 & Ctrl+F5 usage. + * SF Bugs#109: Ctrl+Keypad+/- to Zoom In/Out respectively. + * [QA] Use glib functions for the format in reporting the size of a file and the map cache. + +2014-07-20 +Rob Norris : + * Prevention of crashing in mapcache when tmp variable is NULL. + * [QA] Fix up overzealous variable renaming. + +2014-07-13 +Rob Norris : + * [QA] Window's build - better use of environment variable. + * Enable i18n on 'Routing' preferences tab name. + * Add capability to define the URL format for web links. + * Add link to HERE Maps. + * Add map cache information to be accessible from the GUI only in debug mode. + * [QA] Rename and correct some map cache variables usage for better understanding. + * Prevent crashing when queue_tail is NULL. + * Fix zoom type definition in map cache. + +2014-06-14 +Rob Norris : + * [DOC] Expand keys used for panning the map. + * Add trackpoint message output option value of the distance to the end of the track. + +2014-06-09 +Rob Norris : + * [QA] Distance units not used here. + * SF Features#120: Add Nautical Miles preference for distance units. + +2014-06-07 +Rob Norris : + * Add methods to open Waypoint URLs in comments & descriptions from the Properties dialog. + +2014-06-05 +Rob Norris : + * [QA] Move Waypoint dialog code into its own file. + * [QA] Use a library function to get the number of items in a string array. + * Merge branch 'TimeDisplay' + * [DOC] Time Display option. + * SF Features#95 - Part 2: TimeZone lookup based on an object's position. + * Create timezone lookup file derived from geonames.org + * Add kdtree C code version 0.5.6 from https://code.google.com/p/kdtree/ + * SF Features#95 - Part 1: Allow and use configuration of an alternative time display. + * [DOC] Include source link for strtod.c + * Fix test file: OSMarender Map is long defunct. Use Maqquest. + * If a route or track creation is cancelled with the Escape key with just the initial point, assume it's not really wanted and delete it. + * Add and use preference in whether a name is requested when creating a new track or route. + +2014-06-01 +Rob Norris : + * Allow import of file format with *any* readable components as supported by GPSBabel. + * Fix jump to today's date in search if Viking has been running over a day. + +2014-05-27 +Rob Norris : + * SF Bugs#106: Fix incorrect location on opening .vik file saved in different locale. + * [DOC] Attribution of Sanos strtod.c + * strtod.c from Sanos Operating System Kernel 1.3.4 (http://www.jbox.dk/sanos) + * Fix pasting of text in DMS format to resolve to the correct location. + * [DOC] Add attributions to meet binary distribution requirements. + * [DOC] Bump Docbook Version to 4.5 in the Help. + +2014-05-15 +Rob Norris : + * Enable copying the centre location of the viewport via Ctrl+h + * Add alternative bearing readout as raw lat/lon double values. + * Fix waypoints may not be drawn when created by paste of a text location. + +2014-05-10 +Rob Norris : + * [DOC] GPSBabel Filter: Compress Tracks + * Allow compressing tracks using the GPSBabel simplify crosstrack feature. + +2014-05-08 +Rob Norris : + * Fix zoom level tile reporting for an MBTiles map. + * Save track property show DEM & speed settings between dialog invocations. + * Optionally show DEM values on Elevation/Speed graph. + +2014-05-03 +Rob Norris : + * [QA] Use cross platform directory separator + +2014-05-02 +Rob Norris : + * Update external_tools configurations. + * Enable Windows installation to search for and use deployed extension configuration files. + +2014-04-25 +Rob Norris : + * Allow setting timestamps on trackpoints and waypoints that previously had none. + * SF Features#100: Allow 'easy' changing of the time of trackpoints & waypoints. + * SF Features#100: Allow changing of the time of trackpoints. + * Ensure track bounds are initialized correctly during track creation. + * Improve ordering of date/time output on time graphs. + +2014-04-11 +Rob Norris : + * [QA] Remove unused parameter + +2014-04-10 +Rob Norris : + * Remove temporary files used asynchronously on program exit. + * Enable importing from GeoJSON files via the usage of the program 'togpx'. + * Enable exporting to GeoJSON file via the program togeojson. + +2014-04-08 +Rob Norris : + * Use a common way to create temporary GPX files. + * [QA] Limit scope of includes of vikutils header. + * Geoname services now require an username account to access free services. + * [DOC] Update Help for current built in Maps list. + * Rationalise acquire mode to have more obvious behaviour. + * Convert some console warnings to get reported to the GUI in the statusbar. + * [QA] Correct and improve enumeration usage for export file types. + * Ensure tools directory is really included in the build output. + +2014-04-04 +Rob Norris : + * Add the miscellaneous 'tools' scripts into the build output. + +2014-04-03 +Rob Norris : + * Fix googledirections script. + * Fix slightly incorrect DEM point drawing on the track property display after recent code changes. + +2014-03-27 +Rob Norris : + * Show distance axis grids on distance graphs. + * SF Features#91: Part 2. Show time axis grids on time graphs. + +2014-03-26 +Rob Norris : + * Create and use a function to return the duration of a track. + * [QA] Refactoring track properties window. + * SF Features#91: Part 1. Display Clock Date/Time of the blob on the time graphs. + * Remove unnecessary subdomain in some OSM tileserver hostnames. + * Refix Merging tracks by time. + +2014-03-22 +Rob Norris : + * Remove no longer available map services. + * Remove default usage of Terraserver maps as they are no longer available. + * Completely remove SPOTMaps as this service is no longer available. + * Optimize tooltip message generation, remove unnecessary track iterations. + * Allow clearing and copying of the information message in the statusbar. + * Report download failures in the statusbar. + * Fix crashing on double clicks - properly initialize variable. + +2014-03-20 +Rob Norris : + * Refactor time from start track property label update + +2014-03-16 +Rob Norris : + * Flow up error states from routing so the GUI can display the failing result. + * Notes on how to use git2changelog.sh + +2014-03-15 +Rob Norris : + * [WINDOWS] Ensure an icon is embedded in the executable. + * Yet more files to ignore from output of the build process. + * [WINDOWS] More reliable rebuilds. + * [WINDOWS] Fix opening URLs in Windows build only. + +2014-02-23 +Rob Norris : + * SF Bugs#105: Fix Display of Lines (Clipping) at High Zoom Levels. + * Fix building on Windows as Viking only supports GLIB 2.24 ATM. + +2014-02-10 +Rob Norris : + * Add a tooltip for Aggregate Layers to say how many layers they contain. + * Remove built in OpenStreetBugs datasource as this service is being phased out. + +2014-02-08 +Rob Norris : + * Add support for reading waypoint specific URL fields in GPX1.0 files. + * Isolate Viking specific code in otherwise reusable code. + * Shift code around to reduce dependencies required for DEM access. + * Don't store regenerated INSTALL file in git. + * Fix DEM layer URL reference output. + * Remove mistaken need to change directory. + +2014-02-05 +Rob Norris : + * Merge branch 'ImprovedRouteFinder' + * Improve routing function return types to simple TRUE / FALSE for success or failure indication. + +2014-02-05 +Matthew Hague : + * Updated documentation for the improved route finding tool + * Improve the Route Finder Tool + * Extend Routing functions for UI reuse. + * Fix vik_track_cut_back_to_double_point(). + +2014-01-02 +Rob Norris : + * [QA] Remove unused parameter. + * [QA] Rename variables to avoid shadowing global variables. + * [QA] Add default cases for all switch statements. + * [QA] Add explicit missing field initializers. + * Extend Waypoint properties with some EXIF Geotag (read only) information. + * Add a function to return the position from a file with EXIF GPS information. + * Use the last selected date when initializing the date search. + +2014-01-01 +Rob Norris : + * Add a preference to control the number of recent files made available. + * Enable JPG files as a primary supported type. + * [QA] Rename function + * Fix autodownload tiles when scrolling. Was broken by a recent commit. + +2013-12-09 +Rob Norris : + * Enable zooming in/out in jumps of 3 levels by pressing shift key at the same time with the zoom tool. + * Enable double clicking as an optional way to control zooming in pan mode. + +2013-12-07 +Rob Norris : + * Fix right click on a selected waypoint image starts to move it. + * [DOC] Mention the new maps switch-xy property. + * Add an example of using ArcGIS Server with use of the "switch-xy" property + * Enable boolean map configuration 'switch-xy' property to swap X,Y parts of the URL. + * Remove repeating of built in types in data files. + * External tools don't use ids + * Shift Search by Date into a sub menu. + * Explicitly use subdir-objects in automake init to prevent large warning with automake-1.14 + * Skip etag files in mbtile converter tool + * Tidy up Makefile.am spacings + +2013-12-05 +Guilhem Bonnefille : + * Fix autogen.sh in order to install needed files + +2013-11-25 +Rob Norris : + * [QA] Remove unused parameter + * [QA] Tools are enabled per active layer + * Fix excluding own self track when creating lists of other tracks. + +2013-11-20 +Rob Norris : + * RedNotebook 1.7.3+ integration to open the diary program on a specific date. + +2013-11-18 +Rob Norris : + * [QA] Remove redundant GTK checks for > 2.10, since we need 2.16. + * Fix needing to calculate bounds of *both* tracks when a track is split via the marker. + * Fix another compiler warning from the Export via GPSBabel work + +2013-11-16 +Rob Norris : + * Enable a history of requested positions. + * Really enable C99 mode. + * Fix vik_track_get_length_to_trackpoint() so with the first track point it returns zero, not the entire track length! + * Fix highlight draw to cope with cut layers. + * Fix another compiler warning from the Export via GPSBabel work + * Ensure highlight for a single track or waypoint is always shown on top. + * Add function to work out the visibility of an item considering all the items ancestor's visibilities. + +2013-11-15 +Rob Norris : + * Fix compiler warnings from Export via GPSBabel work + +2013-11-14 +Rob Norris : + * Support using multiple Viking files with relative paths. + * [QA] Use actual type rather than a gpointer + +2013-11-05 +Guilhem Bonnefille : + * Fix previous fix + * Fix error handling at autogen.sh + +2013-11-04 +Guilhem Bonnefille : + * SF Feature#49: Export via GPSBabel + * Extract a UI module for babel + * Extract trw export module + * Refactoring: introduce a function for better encapsulation + +2013-11-01 +Rob Norris : + * More files to ignore from output of the build process. + +2013-11-01 +Guilhem Bonnefille : + * Sometimes gnome-autogen.sh does not support the most recent automake versions. + +2013-10-31 +Rob Norris : + * Fix crashing when copying layers with null strings as parameters. + +2013-10-30 +Rob Norris : + * Fix opening files on command line in different directories. + * Use TRW Metadata in generating default values for some OSM Trace upload fields. + * Basic support of some GPX Metadata values common to GPX1.0 and GPX1.1 + +2013-10-27 +Rob Norris : + * Make comparing timestamps of tracks more available. + +2013-10-26 +Rob Norris : + * Enable a search item by date feature from an Aggregate Layer level. + * Open picture associated with a waypoint on double click by the select tool. + * Update to allow C99 mode + * Update to at least Gtk2.16. + * Refactor: update OSM track upload + +2013-10-25 +Rob Norris : + * Merge branch 'Refactor' + +2013-10-24 +Rob Norris : + * [QA] Remove unnecessary g_critical() + * [QA] Remove compiler warning when building for Windows + * Refactor: Create and use functions to access track start or end trackpoints. + * Refactor: TrackWaypoint sublayer menu callback functions. + * Refactor: TrackWaypoint layer menu callback functions. + * Tidy update signal handler in VikAggregate Layer. + * Improve update signal handler usage in GPS Layer. + * Remove never used GPS layer drag drop request function. + * Only the TrackWaypoint layer should handle it's internal callback type. + * Refactor: passed around map layer menu values + * Refactor: passed around aggregate menu values + * Move man files from doc to help directory so they will be included in the output from make distcheck. + * Update spec file + * [QA] Remove build references to things that don't exist anymore. + * SF Bugs #104: Fix GStatBuf not available on Glib < 2.26 + * Fix the display of speed in statusbar output. + +2013-10-22 +Guilhem Bonnefille : + * QA: factorize trw_layer_acquire* functions + +2013-10-19 +Guilhem Bonnefille : + * Fix translatable string with variable argument + * Fix 'export_to_common' dialog + * Fix configure error message + +2013-10-16 +Rob Norris : + * Merge branch 'MBTilesRead' + * [WINDOWS] More reliable rebuilds. + * [WINDOWS] Build with SQLite DLL 3.8.0.2 + * [QA] Fix typo + grammar in a comment + * Allow creating a File Chooser dialog with optional file filters. + * Expand mapcache hash to include a hash of the map filename (if there is one). + * Directly support reading from MBTile files using libsqlite3. + * Enable widget sensitivity in the layer properties to be controlled. + +2013-10-13 +Rob Norris : + * Releasing Viking 1.5 + * Remove OSM web link layer options so you now get what ever is the OSM default. + * Add beginnings of Slovak translation. + * Add Translation for Basque + * Document previous translation updates + * Import Launchpad translation updates + +2013-10-13 +Guilhem Bonnefille : + * Fix "figure" element in documentation + * Fix simple typo in documentation + * Fix missing declaration in po/POTFILES.in + +2013-10-10 +Rob Norris : + * Fix crashing if attempting to Extend a Route via the Route Finder when the route has no points. + * SF Support Requests#21: Make default print size full page. + +2013-10-06 +Guilhem Bonnefille : + * Fix: replace home made macro by GLib one + * Fix: include file.h in file.c + +2013-10-05 +Guilhem Bonnefille : + * Fix export dialog title + +2013-10-04 +Rob Norris : + * SF Features#116: Add an Acquire From URL option. + +2013-10-03 +Guilhem Bonnefille : + * Fix gpsbabel capabilities parsing + * QA: minor refactor to reduce code + +2013-10-02 +Rob Norris : + * SF Features#116: Add an Acquire From URL option. + * Fix not moving the viewport to the data when using TrackWaypoint->Acquire methods. + * Fix the default value for getting the GPS Protocol in acquire. + +2013-09-29 +Rob Norris : + * Add tooltip to help align the name in TrackWaypoint->Acquire menu to the File->Acquire menu + +2013-09-28 +Rob Norris : + * [DOC] Mention ability to set a waypoint's altitude from DEM data. + * Fix incorrectly updating files during geotagging that are read only. + * Update libjpeg utilities from exif command line tool to version 0.6.21 + * SF Features#115: Part 2. Update working directory when loading images for geotagging + * SF Features#115: Part 1. Add the ability to Geotag multiple images against a Waypoint. + * [QA] Fix not showing new waypoints after geotagging due to not setting waypoint bounds. + * Only allow JPGs in the file selector for Geotagging. + * Fix broken map layer property tooltip. + * Add support for OSM Humanitarian (HOT) Style Map. + * [QA] These functions should be static to match the definition + +2013-09-27 +Rob Norris : + * Show Map License information for each map type only once. + +2013-09-21 +Rob Norris : + * Ensure consistent view of waypoint changes. + * Support Waypoint timestamps in .vik files. + +2013-09-18 +Rob Norris : + * [QA] Use specific type + +2013-09-14 +Rob Norris : + * Always open new .vik file in current window when no .vik file is loaded. + * [DOC] Images for the Track properties - since this has changed for version 1.5 + * Allow some redirects for routing web sites by default. + * Improve item list dialogs to handle long text values better. + +2013-09-13 +Rob Norris : + * Always create a menu separator for waypoints as now there is always at least the transform menu option + +2013-09-11 +Rob Norris : + * Fix opening files with spaces in them when using the drag and drop mechanism + * [DOC] Update help with text and images for multi-layer TrackWaypoint lists and statistics dialogs. + * Merge branch 'WaypointsList' + * Use Waypoint list dialog from Aggregate Layer menus. + * Use Waypoint list dialog in TrackWaypoint layer menus. + * Add Waypoint List dialog. + * Expose functions for reuse and promote types. + * [QA] Update year values. + * [DOC] Transform menu help + * [DOC] Maps download region including image of the dialog + * [DOC] Improve Trackpoint edit dialog description and add example image. + * [DOC] Selected trackpoint operations: inserting and deleting in Track/Route menu. + * Actually make intended debug messages print only in debug instead of warnings. + * SF Features#76: Fix Trackpoint copying after the introduction of trackpoint naming. + * SF Features#53: Part2: Keep the size and zoom options next to each other in the Image Generation dialog. + +2013-09-10 +Rob Norris : + * Add some safety checks and don't add the pixbuf into the cache if it's invalid. + * In the Goto Lat/Lon dialog, allow the return key to accept the entry values. + * [QA] Include your own header file. + * [QA] Fixup if statement intention. + * [QA] Shift Viking dependent functions in 'util' to 'vikutils' + * SF Features#76: Add ability to handle and name trackpoints. + * [QA] Fix some clang compiler warnings. + +2013-09-05 +Rob Norris : + * Expand list of potentially used libraries. + * [DOC] Add help for DEM File Information dialog + * [DOC] Improve help for map tile information + * Ignore new output from autotools build system. + * Enable compiling with older glib versions (a function used is 2.32+ only) + * [WINDOWS] Installer improvement + * [WINDOWS] Need to specify magic database location. + * [WINDOWS] Add libmagic DLL 5.03 for Windows build. + * [WINDOWS] Add use of libbz2 (bzip2) 1.0.6 DLL for Windows build + +2013-09-02 +Rob Norris : + * Fix files missing for translation + +2013-08-30 +Rob Norris : + * [QA] Use the common map_utils_mpp_to_zoom function + +2013-08-29 +Rob Norris : + * Merge branch 'TrackList' + * [QA] Remove unused function parameter + * Add Track list output from aggregate layers. + * Add track list capability to the track sublayer container. + * Add Track List dialog. + * Functions for reuse and promote a type. + * Refactor track and layer list creation code for better reuse. + +2013-08-28 +Rob Norris : + * Fix spelling of visible. + * Remove compiler warning on 32bit systems. + * Fix statusbar info format message to not display '(null)' repeatedly at the end. + * Enable inserting a trackpoint before or after the selected trackpoint from the TrackWaypoint layer menu. + * Enable direct deletion of a selected trackpoint from the TrackWaypoint layer menu. + * Maintain trackpoint selected when moving it. + * [QA] Function should use a constant name parameter + * [QA] Function should use a constant name parameter + * Fix coord layer copying so the copied one is actually drawn. + * Fix crashing when attempting to download maps along a track when multiple maps are enabled. + * [QA] Remove unused function + * [QA] Remove an unused function parameter. + * Add option to the cache-mbtile tool to avoid optimizing the database. + +2013-08-27 +Guilhem Bonnefille : + * Fix missing question mark + +2013-08-26 +Rob Norris : + * Merge branch 'StatusBarInfoControl' + * Merge branch 'TrackLabelling' + * Merge branch 'TransformUtils' + * Merge branch 'DownloadDecompression' + +2013-07-24 +Rob Norris : + * Add 'Transform' abilities to set DEM information for Waypoints. + * Refactor to use the new function to get the waypoint height. + * Add function to set waypoint height from DEM information. + * Add an option to anonymize track timestamps on upload to OSM Traces. + * Make the anonymize timestamp method available in the GUI. + * Add function to anonymize timestamps of a track. + * Make the downloading SRTM error visible in the GUI. + * Add warning of when trying to apply DEM data, but no DEM layers are available. + * Improve options for applying DEM Data to a track/route. + * Make the track/route elevation smoothing methods available in the GUI. + * Add methods to smooth missing elevation data from tracks (or routes). + * Create and use new menu level 'Transform' for some track/route operations. + +2013-07-23 +Guilhem Bonnefille : + * Check size of route before refining it + * Add function to refine a route with routing service + * [DOC] Tag some contextual restrictions as 'note' + * Fix: use g_list dedicated function instead of own code + +2013-07-20 +Rob Norris : + * Enable optional opening of the track properties dialog on the statistics tab + * Move all editable properties of a track/route to a dedicated tab. + * Split TrackWaypoint layer tracks properties into an 'Advanced' section. + * [DOC] New settings value + * Add ability to draw track names and distance labels on the viewport. + * Add helper function distance_in_preferred_units() + * Add function to get a trackpoint by distance along a track. + +2013-07-18 +Rob Norris : + * [DOC] Document options for the Trackpoint message format codes. + * SF Features#113: Allow distance from track start to be shown in the Statusbar. + * SF Features#111: Add Optional Statusbar update in GPS Realtime Tracking mode. + * Enable following GPS realtime tracking even when no heading (course) is available. + * Add a common method to produce an information message string about a Trackpoint. + * Add a function to find out the distance along a track to a particular trackpoint. + * Quick hack method to enable display of compiled in libraries (albeit in the wrong section of 'Artists') in the About dialog. + * Support opening compressed files downloaded for the My OSM Traces feature. + * Unzip comment + * Start to make compression code more reuseable. + * Fix menu use of named own Icons since the icons were renamed some time ago. + +2013-07-15 +Rob Norris : + * [QA] Fix memory leak in drawing new tracks/routes. + * [QA] Fix memory leak in sorting layers. + * [QA] Fix name memory leaks in TrackWaypoint operations. + * [QA] Fix misc small memory leaks. + * [QA] Fix several memory leaks on program closure. + * [QA] Fix memory leak on deleting TrackWaypoint layers. + * [QA] Fix new tracks not shown after split called from the Track Properties dialog. + * [QA] Fix large memory leak on viewing Track Properties. + * [QA] Fix incorrect iterator usage. + * [QA] Fix memory leaks in usage of the clipboard. + * [QA] Fix memory leaks on reading in Viking files. + * [QA] Fix memory leak in treeview tooltips and selection. + * [QA] Fix large memory leak when removing DEM layers. + +2013-07-10 +Guilhem Bonnefille : + * QA: replace direct access to GtkWidget->window member by function call + +2013-07-09 +Rob Norris : + * Add view of course and speed properties of trackpoints. + * Enable control of create_label_vbox spacing and padding. + * Fix some interpolated values of a trackpoint on insertion between points. + +2013-07-07 +Rob Norris : + * Use the busy cursor during downloads of My OSM Traces. + * Fix handling failed downloads with the My OSM Traces method. + * SF Bugs#101: Fix Acquire from Google Directions. + * Refactor Track property grid drawing into a common function. + * SF Bugs#100: Fix Crash on viewing Track Properties with extreme gradients. + * Add ability to use a conversion function between the displayed widget contents and the value stored internally. + * SF Bugs#97: Fix missing redownload settings of some maps in the example config + * SF Bugs#99: Increase limit for Map IDs + * [QA] Fix issue spotted with cppcheck 1.59 + * SF Features#114: Increase the time limit for the Tile Age and use days in the GUI. + +2013-07-02 +Rob Norris : + * More reliable waypoint symbol resetting on preferences change. + * Fix name search using Google. + * Fix some layer sorting issues. + * [QA] Fix some issues spotted with cppcheck 1.59 + * Make dialog shifting a bit more reliable. + * Use already calculated bounding box for 'maxmin' calculations. + +2013-06-29 +Rob Norris : + * Add statistics for all tracks within a single TRW layer. + * Enable all tracks statistics analysis for all TRW Layers within an Aggregate layer. + * Add Multiple Tracks Statistical analysis dialog. + * Add functions to return sublayer visibility. + * [DOC] Fix some incorrect docbook markup. + * Merge branch 'LayerSort' + +2013-06-23 +Guilhem Bonnefille : + * Fix documentation minor typo + * Generalize Acquire Directions + * [QA] minor doc improvment + +2013-06-22 +Guilhem Bonnefille : + * [QA] More minor code improving + * [QA] Add type checking + * [QA] Add minor comment + * Add a builder for a routing engine selector + * Expose a function to iterate on all registered engines + * [QA] Use more explicit funcion name + * [DOC] fix ref doc + +2013-06-13 +Rob Norris : + * Remove now unused alphabetical sort functions as they have been superseded. + * [DOC] This internal setting no longer exists. + * Enable TrackWaypoint sublayer alphabetical sort options. + * Enable Alphabetical sorting of layers within Aggregate layers + * Enable fast and GUI controllable alphabetical sorting of treeview layers. + * Merge branch 'InternalSettings+StartupPreferences' + * [DOC] Some words about the new Startup preferences options. + * [DOC] Some words about the viking.ini file + * Add option to control whether a periodic version check should be performed. + * Map data license does not need to be shown every time for the default map. + * On the very first startup, ask whether internet related options should default to on. + * Enable detection of when Viking is run for the very first time. + * Enable an optional automatic IP to location startup mode - mainly for new users to get going more easily. + * Enable Startup Method option to choose between using the home position, last position or loading a specified file. + * Add a startup option to load a default map (as defined by layer default for the map layer). + * Add preference to control whether the auto window settings should be used. + * Start Startup preferences + * Use settings to allow configuration of max background threads. + * Use settings to maintain the track properties dialog size between invocations. + * Use settings to allow configuration of hardcoded map display performance values. + * Use settings to save and restore Geotag values. + * Use settings to save and restore the Goto Provider selected. + * Use settings for OSM Traces visibility value. + * Save and restore the generate image values using the settings mechanism. + * [QA] Tidy up general preferences into single array + * Use settings to store GPS values for reuse. + * Alphabetized TrackWaypoint layer ordering is now a configurable run time setting. + * Use settings to store Window layout states + * First iteration of internal settings + +2013-06-12 +Rob Norris : + * Fix track not displayed from realtime GPS tracking. + +2013-06-11 +Rob Norris : + * Add a simple file properties dialog to show some details for a Viking file: + * Fix usage of default maps cache directory when it does not end in a separator. + +2013-06-09 +Guilhem Bonnefille : + * [DOC] Add documentation on new public routing function + * [QA] minor revision on cast operators + +2013-06-03 +Rob Norris : + * [QA] Fix incorrect comment + +2013-06-02 +Guilhem Bonnefille : + * QA: Add glib.h + * Ensure all buildable types are registered + +2013-06-01 +Guilhem Bonnefille : + * Fix doc: Replace simple quotes by DocBook tags + +2013-06-01 +Rob Norris : + * Add Show/Hide all Layers within an Aggregate Layer. + * SF#3314896: Show/Hide All Tracks (Routes+Waypoints too) of a Layer. + +2013-05-31 +Rob Norris : + * [QA] Fix missing G_BEGIN/END_DECLS + * Automated check for the latest version. ATM only on Windows systems. + * Enable getting Viking Version as a number from a string to enable comparisons. + +2013-05-29 +Rob Norris : + * SF#3613971: Remove Geofabrik's OpenStreetMap WMS, as it is not for public use. + * SF#3613971: Remove Geofabrik's OpenStreetMap WMS, as it is not for public use. + +2013-05-27 +Guilhem Bonnefille : + * Fix GLib macros typo + * QA: factorize GObject cast operations (datasource_osm_my_traces.c) + * QA: factorize GObject cast operations (datasource_osm.c) + * QA: factorize GObject cast operations (datasource_google.c) + * QA: factorize GObject cast operations (datasource_geotag.c) + * QA: factorize GObject cast operations (datasource_gc.c) + * QA: factorize GObject cast operations (datasource_file.c) + +2013-05-25 +Rob Norris : + * [QA] Revise direct access for '->vbox' to use gtk_dialog_get_content_area() instead. + * Add ability to Download Maps for a defined region over several Zoom levels. + * Don't silently fail on attempting to split to a track. + * Fix selection of trackpoint via Edit Trackpoint button. + +2013-05-24 +Guilhem Bonnefille : + * Routing: refactor + * Routing: suppress Google + * Routing: suppress OSRM specific code + * Generalize routing engine + +2013-05-23 +Rob Norris : + * [QA] Prevent Gtk-Critical warnings on trying to use NULL strings on file entry widgets. + * Fix Drag and Drop file loading on Windows. + * Prevent gcc 4.7.3 compiler warnings for new routing code. + * Support new versions of depreciated g_thread_* functions for glib 2.32 + * Allow opening of files via Drag and Drop onto the Viewport. + * Fix background thread statusbar update instability. + * Fix location of gdk_threads_enter() to be before first window creation. + * Allow Bing Map source URL to be set via the configuration XML file. + +2013-05-23 +Guilhem Bonnefille : + * Doc: improve reference documentation + * QA: add a NULL check + * DOC: add classname tags + +2013-05-22 +Guilhem Bonnefille : + * Fix vik_routing_register: replace existing engine + * Remove uneeded (and wrong) finalize functions + * Update AC_INIT macro call + +2013-05-20 +Guilhem Bonnefille : + * Fix compilation warning + * Allow to use full URL as download parameter + +2013-05-16 +Guilhem Bonnefille : + * Add OSRM routing engine + * Generalize route finder + * Add a fixed combobox for string parameter + +2013-05-05 +Rob Norris : + * Oops! Remember to commit new files for DatasourceRemoteFile feature. + +2013-05-04 +Rob Norris : + * SF#3601584: Fix minimum vertical size for the track properties dialog. + +2013-05-03 +Rob Norris : + * Merge branch 'DatasourceRemoteFile' + * Add support for acquiring OpenStreetMap Notes as GPX files. + * [DOC] Explain datasources.xml usage. + * Add a new webtool datasource to allow acquiring data from URLs that return a file. + * Rework mpp_to_zoom() to return the actual zoom level and handle all Viking zoom levels. + * [DOC] Promote Extending Viking to the top level section in the manual. + * [DOC] Ids are not necessary in these configuration files. + * Make mpp_to_zoom() a generic function + * Prepare for dynamic VikDataSourceInterface creation/deletion. + * Make window related values available on acquire initialisation. + * Ensure string is long enough for potential dates. + +2013-05-01 +Rob Norris : + * Simpler and better use of time display for tracks. + * Simpler and better use of time display for trackpoints. + * Add display of Waypoint time property (only when waypoint has a time). + +2013-04-30 +Rob Norris : + * Add time property to Waypoints since it's in the GPX1.0 standard. + +2013-04-29 +Rob Norris : + * Fix waypoints may not be shown if drag copied between layers. + * Enable changing name of an existing waypoint in the Waypoint Properties dialog. + * Correct tooltip message for paste behaviour + * Scope to include additional menu items for an Aggregate Layer. + * Add simple dialog to show DEM file information. + +2013-04-27 +Guilhem Bonnefille : + * Relicensing source code from GPLv3+ to GPLv2+ + +2013-04-27 +Rob Norris : + * Prevent cut/copy/paste options appearing in the popup menu from the '+' layer button. + * [QA] Remove spurious commented out code. + * Waive copyright on my accessory scripts to build Viking on Windows. + * Remove shell script as route capabilities are now in Viking. + * [QA] Protection from trying to use small values in the zoom combo box. + * Fix incorrect setting to lowest zoom value when clicking away from the statusbar zoom menu. + * [QA] Improve create zoom menu to use G_N_ELEMENTS to know array bounds. + +2013-04-27 +Guilhem Bonnefille : + * Relicensing source code from GPLv3+ to GPLv2+ + +2013-04-26 +Guilhem Bonnefille : + * Geocaching: fix geotools call when locale is not C + +2013-04-22 +Rob Norris : + * Fix may crash on exporting to GPX. Caused by recent commit. + * Set the generate image file filter according to the file type selected. + +2013-04-20 +Rob Norris : + * Fix a_vik_gpx_export_wpt_sym_name internal type + * Really fix showing map timestamps on Windows on the map tile info dialog. + +2013-04-17 +Rob Norris : + * Add 'Creation' sort option for saving GPX tracks. + * SF#3387591: Improve keyboard copy+paste behaviour when the editing a layer name in the treeview. + * SF#3608417: Add Preference option to control the display of the track creation distance tooltip. + * Reduce wasted space in the Preferences dialog if there are lots of tabs. + * SF#2998555: Control of saving Absolute vs Relative Paths in .vik files + * Add 'Advanced' preferences tab. + * Make more portable .vik file, as don't save the map cache directory if it's the map cache default directory. + * SF#3028797: Remember last directory used when saving / opening main files. + +2013-04-16 +Michael Klein : + * SF#3610708: Fix Failing to Load DEM files on Big Endian Systems. + +2013-04-14 +Guilhem Bonnefille : + * [DOC] Minor improve + +2013-04-10 +Rob Norris : + * Import Launchpad translation updates for Asturian language + +2013-04-10 +Wolfgang Goetz : + * Fix Double defined msgid's in po-files. + +2013-04-10 +Rob Norris : + * Merge branch 'GTK+-Updates' + * Create own marshal_VOID__POINTER_POINTER function. + * Don't use deprecated Gtk Type Objects - use G Type Objects instead. + * [QA] Remove old checks for minimum GTK+2.10, since we require 2.14. + * If using GTK+2.24 or later don't use depreciated about dialog features as not needed any more. + * Rework combo boxes to work with GTK+2.24 or earlier. + * gtk_marshal_VOID__POINTER_UINT depreciated, use g_cclosure_marshal_VOID__UINT_POINTER instead. + * Use GTK+2.18 functions if available. + * Improved usage of GTK+2.14 features for URIs. + * Minimum GTK+2.14 required for the build. + * [QA] Better use of VikLayerTypeEnum rather than gints + * Merge branch 'i18n-launchpad' into master + * Update translations for layers menu popup which no longer have to start with '/' + * Remove usage of depreciated GtkItemFactory. + * Position Trackpoint Edit and Waypoint dialogs to not obscure the selected point. + * When adding layers insert 'Base' layers (i.e Maps/GeoRef/DEM) below the selected layer. + * Add 'Export All' functionality to convert all TrackWaypoint layers into individual GPX or KML files. + +2013-04-09 +Rob Norris : + * Enable opening background jobs window from the status bar by clicking on the items field. + * When loading unnamed items in a gpx file improve the default name. + * Fix using .vik files with 'unusual' track or waypoint names + * Fix waypoint selection when the waypoint has an image but the images are not being displayed. + +2013-04-08 +Rob Norris : + * Releasing 1.4.1 + * Don't need specify full path for cmd.exe in using wine + * Use a busy cursor when exporting to a file. + +2013-04-07 +Rob Norris : + * Enable a busy cursor when loading and saving files as that may take some time. + * Improve Goto place search UI usage so one can start typing and then press return to instigate it. + +2013-03-29 +Rob Norris : + * Fix unintentional renames if drag dropping within the same layer + +2013-03-24 +Rob Norris : + * SF#3608411: Part 2 - Avoid creating command window on Viking start-up. + * Fix showing map timestamps on Windows on the map tile info dialog. + * Merge branch 'WaypointSymbolImprovements' + * Maintain support of old waypoint symbol names with new hashed lookup method. + * Add preference to support writing Waypoint symbol names in Title or lower case. + * Add an example viking file with all the supported waypoint symbols in use. + * Add 'helipad' waypoint symbol. + * Add 'exit' waypoint symbol. + * Amend ground transport icon colour to differentiate between it and the school symbol. + * Fix incorrect GPSBabel/Garmin symbol names. + +2013-03-23 +Rob Norris : + * Document previous translation updates + * Import Launchpad translation updates + +2013-03-21 +Rob Norris : + * Maintain waypoint symbol .vik file compatibility with older Viking releases. + +2013-03-21 +Sven Eckelmann : + * Fix GPX symbol names for Garmin Oregon 450 + +2013-03-21 +Rob Norris : + * [QA] Tidy up Coordlayer function definitions. + * Fix layer defaults fix, which breaks setting the layer defaults. + +2013-03-20 +Rob Norris : + * Fix compiling geocaches to work with updated VikLayerParam definition. + * SF#3608411: Part 1 - Avoid warning about unbuffer on Windows Systems. + * SF#3608264: Improve Statusbar Location Info Maybe Truncated + +2013-03-17 +Rob Norris : + * Prevent inputting empty names for layers and sublayers via the layers panel. + * SF#3608311: Fix crash caused by renaming blank sublayer names + * Correct spelling of map layer. + * [QA] Move file related function into file.c and rename for general reuse + * [QA] Better for vik_track reverse to worry about trackpoints. + * Merge branch 'Optimize' + * GeoRef layer draw: only scale the image when the image will be drawn on the viewport. + +2013-03-14 +Rob Norris : + * Optimize: Calculate associated icon of a waypoint only on change. + * Optimize: Only create waypoint font size string when actual setting is changed. + * Speed up item selection by restricting search within bounding box limits. + * Make vik_viewport_coord_to_screen() calculation faster. + * Only attempt to draw waypoints when they are in the screens bounding box. + +2013-03-13 +Rob Norris : + * Store track bounding box and only attempt to draw it if some part of it is visible on screen. + +2013-03-13 +Wolfgang Goetz : + * Be less strigent in loading Geotagged images without optional GPS tags + +2013-03-13 +Rob Norris : + * [QA] Consistent use of *_layer_draw parameter types. + * [QA] Tidy up DEM layer function definitions. + * [QA] These GeoRef layer functions should be static. + * Convert GeoRef failed image loading message into a GUI message. + * GeoRef Layer only works in UTM Projection Mode. + * Fix tooltip of GeoRef northing / easting values. + * Improve defaults for the GeoRef layer using the current view to suggest some values. + +2013-03-09 +Rob Norris : + * Remove blank entry on the Tools->Webtools menu list. + * Change map image interpolation to a more precise one. + * Prevent the program grinding to a halt if trying to deal with thousands of tiles + * Prevent requests for downloading tiles at Zoom Level 19 and above for most map types + * Extend map scales down to support 1/32 zoom level. + +2013-03-07 +Rob Norris : + * Fix use of scaled tile image when tile image not present. + +2013-03-06 +Rob Norris : + * Add Wikimedia Toolserver GeoHack as a webtool. + +2013-03-05 +Rob Norris : + * [QA] Add missing include as this header uses an externally defined type DownloadMapOptions. + * [QA] Function should have only local scope. + * Enable updating the treeview to allow setting a blank waypoint symbol. + * Merge pull request #2 from gdt/maxzoom + * Merge pull request #1 from gdt/whitespace-README + +2013-03-04 +Greg Troxel : + * Allow zoom to 1/32. + * Wrap long lines. + +2013-03-03 +Rob Norris : + * Merge branch 'LayerDefaultValues' + * Now layer property defaults are available, improve some layer defaults. + * Fix usage of layer defaults when file has been manually editted and entries have been removed. + * [DOC] Layer property defaults. + * Improve the Waypoint tooltip to display the description if there is no comment. + * Remove unnecessary include statements. + * Fix datasource acquiring waypoints from geotag images. + * Create and use a function to detect when a TrackWaypoint layer is empty. + * [QA] Use vik_track function to append trackpoints from another track + * [QA] Simplify vik_track_steal_and_append_trackpoints() + * Remove direct access for '->style' and replace with gtk_widget_get_style() + * Don't use deprecated GtkObject - use GObject instead. + * gtk_object_sink() has been deprecated since GTK version 2.10, use g_object_ref_sink() instead. + * Replace G_CONST_RETURN with 'const' + * [QA] Remove unused variable in VikWindow. + +2013-02-26 +Rob Norris : + * Better copying of limited sized string. + * [DOC] Update the TODO file to say that it's old and superseded by the wiki. + * Updated geo-* scripts to version released on 2013/02/18 + * Fix compilation with --enable-geocaches option. + +2013-02-23 +Greg Troxel : + * help/Makefile.am: explicitly list figures. + +2013-02-17 +Rob Norris : + * Revise Layer Default icon. + +2013-02-16 +Rob Norris : + * Add default values for layers. + * [QA] Refactor general string processing to avoid pointer arithmetic. + * [QA] Simplify setting the colour in coordinate layer. + * [QA] Move preferences_load_parse_param() to be a general function + * [QA] Move VikLayerTypedParamData from preferences into viklayer header + * [QA] Promote layer_type_from_string to be a global function. + * [QA] Enumerate and use VikLayerWidgetType + * [QA] Enumerate and use VikLayerParamType + * [QA] Better usage of enumeration type to identify layers. + * [QA] Initialization of TrackWaypoint layer data in related part. + * Enable some layers to be created without needing a viewport. + * Releasing 1.4.0.1 + +2013-02-16 +Mathieu Albinet : + * Windows: Add .vik file extension association option in the installer + +2013-02-11 +Rob Norris : + * Releasing Viking 1.4.0 + * Document previous translation updates + * Import Launchpad translation updates + * [DOC] Add an example screenshot of Viking. + * [DOC] Update map download tool text. + * Fix copy and paste typo in a Windows script. + * Fix crashing if creating a DEM layer with no files. + +2013-02-09 +Rob Norris : + * Fix usage of GDateTime functionality which is only in GLIB 2.26 and newer. + * Fix crash when cancelling an 'Acquire' in progress thread task. + * Need more files for Windows packaging. + * Fix potential unnecessary exit in trying to handle spawning of external command. + * Restore help files to being part of the source distribution. + * Remove checking of unused headers and functions. + * Remove useless include. + +2013-02-04 +Cristian Klein : + * Fix: crash when dealing with non-compressed DEM files + +2013-02-04 +Rob Norris : + * Include Windows scripts in the source distribution. + +2013-02-03 +Rob Norris : + * Windows: Script full generation of Windows build from scratch for version 1.4. + +2013-01-31 +Rob Norris : + * Improve Windows installer script. + * Make the Spanish version of the Windows Installer actually selectable. + * Fix Windows installer script to run on a real Windows system. + * Add Windows installer files to be included in a 'make dist' source distribution + * [DOC] Minor corrections + * [DOC] Remove really old file + * Remember to add support of Finnish translation + +2013-01-30 +Rob Norris : + * Merge branch 'i18n-launchpad' + * Define Windows build version in the Installer script. + * Windows build installation steps in installer.bat script file. + * [QA] Remember Exif library removal on Windows deinstall. + * Document previous translation updates + * Import Launchpad translation updates from 1.3 + +2013-01-28 +Rob Norris : + * Add simple dialog to show map tile information. + * Ensure tracks coloured according to the draw mode. + +2013-01-26 +Guilhem Bonnefille : + * Remove zoom combobox in toolbar + * Add a zoom selector on status bar + +2013-01-26 +Rob Norris : + * Add file version to .vik files. + * Ensure when creating tracks they are allocated a colour. + * Rework TrackWaypoint layer option to draw 'All Tracks Black' into 'All Tracks Same Color'. + * Add map layer option to only download missing tiles. + * [QA] Remove unneeded include. + * [QA] Better variable naming + * Maintain script output of TrackWaypoint layer format. + * [QA] Reduce warnings when compiling with Clang. + * [QA] Actually use results from IS_VIK_* calls. + * Add more files to ignore, when building on Windows + +2013-01-23 +Rob Norris : + * Merge branch 'MyOSMTraces' + * [DOC] Add My OSM Traces help. + * Add marker to indicate whether my tracks from OSM starts within the current viewport. + * Add Acquiring 'My' OSM Traces as a datasource. + * [DOC] Top layer can no longer be renamed. + * [DOC] Fix internal doc reference. + +2013-01-21 +Guilhem Bonnefille : + * [QA] Apply naming convention to GType macros (vikviewport) + +2013-01-20 +Guilhem Bonnefille : + * [QA] Replace some coef with more explicit function + * [QA] Convert DEG2RAD and RAD2DEG to macro functions + +2013-01-20 +Rob Norris : + * [QA] Tidy up vikgoto header usage. + * [QA] datasource_geotag tidy ups + fix copyright + * [QA] Prefer g_strdup() over strdup(). Also gives clean cppcheck 1.57 run. + * [QA] Adjust test and move variable declaration to give clean a cppcheck 1.57 run + +2013-01-19 +Rob Norris : + * [DOC] Add further TrackWaypoint detail. + * [DOC] Promote individual layers into top level sections. + * [DOC] Improve Acquire help wording and links to TrackWaypoint layer. + * [DOC] Fix internal document linking when used with Yelp. + * Add TrackWaypoint layer Delete menu options for routes. + * Merge branch 'WikipediaPointsRework' + * [DOC] Update Wikipedia Waypoints to be from the Acquire menu level. + * Fix geonamessearch to handle not being able to map a file to memory. + * Use Wikipedia featue type to generate a suitable waypoint icon + * Use elevation values in creating waypoints from Wikipedia. + * Allow for getting more Wikipedia Waypoints (up to 20). + * All translated versions to select appropriate language Wikipedia articles. + * Allow the columns to be sortable in the Wikipedia Waypoints that are available. + * Decide the 'feature' type is more useful than seeing the country code. + * Add getting Wikipedia Waypoints via the File->Acquire menu method. + * Fix geonames country pattern + * Simplify getting bounds for wikipedia waypoints by reusing existing function. + * Save Wikipedia Waypoint links in a simple format as the waypoint comment. + * Remove useless 'selected' check box on Wikipedia points creation method. + * Move 'Add Wikipedia Waypoints' into the Acquire Menu in the TrackWaypoint Layer. + +2013-01-18 +Rob Norris : + * Simplify layer update redraw in determining the gtk update method. + * Fix: Improve internal redrawing method for layer panel updates. + * Store the main thread value so comparisons can be made to determine the gdk update method + * Allow acquiring an URL with a username/password authenticated download. + * Allow downloading with authentication via curl + * Allow an acquire datasource method to *not* have to use a threading mechanism. + +2013-01-17 +Guilhem Bonnefille : + * Fix screenshot included in previous commit + * Add bearing information while creating route/track + +2013-01-16 +Rob Norris : + * Avoid CRITICAL warnings when updating a waypoint. Check the symbol value is something before attempting to use it. + * Fix routes display in different coordinate views. + * Allow attempting to open a URL in a waypoint comment or description. + * [QA] Mark some GPS layer strings for translation. + +2013-01-14 +Guilhem Bonnefille : + * [QA] Factor the way to compute window's name + +2013-01-12 +Rob Norris : + * [QA] Use specific type GHashTable *, instead of generic gpointer. + * Optimise: get reference to VikWindow only once per TrackWaypoint layer drawing update. + * [QA] Better variable name usage following the change from name to an id. + * [QA] Add specific enumeration for route finder tool + * Change TrackWaypoint properties that are radiogroups into combo boxes for compactness of displayed dialog. + * Add tooltips for Preferences and Layer Parameters. + * [QA] Tidy up preferences.c + * [QA] Remove unused viewport variables. + * [QA] Remove unneeded include statement. + +2013-01-09 +Guilhem Bonnefille : + * Avoid gpsbabel conversion on OSM traces + * Allow to download and acquire a GPX without gpsbabel + * [DOC] Improve aquire's reference documentation + * Simplify acquire feature + * [DOC] Improve babel's reference documentation + +2013-01-07 +Guilhem Bonnefille : + * [DOC] Reformat viktrack's reference documentation + * [DOC] Format acquire's reference documentation + +2013-01-07 +Rob Norris : + * The vikgoto should not be calling display updates. + * Factor download to a temporary file into a single reused function. + * The geonamesearch should not be calling display updates. + * Remove of temporary file after processing Geonames Wikipedia information. + +2013-01-06 +Rob Norris : + * Fix an acquire callback type usage. + * Allow sorting on the column of the select from list dialog. + * [QA] Fixup go to Geocache Webpage + * [QA] Make more local functions static. + * [QA] Improve header usage + * [QA] Prevent potential clash of accelerator + +2013-01-05 +Rob Norris : + * Merge branch 'GPX-Route+Icons+Colour' + * Fix Google Route Finding usage as a route type. + * Maintain track properties when splitting a track. + * [DOC] Help improvement - mention automatic view on file load. + * [DOC] Amend help for addition of Routes capability. + * [DOC] Amend and tidy man page for addition of Routes capability. + * [DOC] Remove old doc. Use the User Manual instead. + * Enable display of GPS Device on GPS Upload. + * Add a sample route GPX file. Useful for testing. + * SF#2692629: Allow control of GPX file saving track order + * Improve contrast between default track colours. + * Rewrite TrackWaypoint layer copy/paste to use GbyteArray rather than using a temporary GPX file. + * Simplify internals of layer copy and paste for waypoints and tracks. + * SF#2564997: Enable specific track colours in default draw by track mode. + * Fix odd issue with waypoint symbol not getting set on copy. + * Display waypoint symbols in the layers panel tree view. + * Fix allocation of tree iterator as it may be used some point in time in the future. + * Enable setting the icon on a viktreeview item. + * Replace 'Add Track' tool with 'Create Route' tool. + * Improve warning message, no creating is happening here. + * Now allowed same track names so an overwrite warning is not necessary any more. + * Add ability to append other type of track or route to a route or track. + * Enable converting a track to a route, or a route to a track via the TrackWaypoint layer menu. + * Add support for GPX routes - as a new sublayer type of the now less accurately named TrackWaypoint layer + * Add paste menu option in the sublayer menu container for Tracks and Waypoints. + * Add method to return the type of Viking data held in the clipboard + * Add options to start making a new track and finishing it from the TrackWaypoint layer menus + * Add new 'New' submenu for the TrackWaypoint layer + * Move TrackWaypoint layer menu view sublayer options into a submenu + * Enable tooltip for track and waypoint sublayer containers. + * Make sublayer containers for track and waypoint sublayers only visible in the layers panel when they actually contain something + * Fix combo box zoom level selection calculation. + * [QA] Better internal variable name in track drawing + * [QA] Make a local function static. + +2013-01-04 +Guilhem Bonnefille : + * Restore Google Directions feature + +2013-01-03 +Guilhem Bonnefille : + * [QA] Remove uneeded const modifier + * Use local variable instead of multiple GCast + +2012-12-30 +Guilhem Bonnefille : + * [QA] Add ifdef macro for Google Directions related + * Add debug message tracing name of temporary files + * [QA] Replace g_mapped_file_free + * [QA] Remove uneeded compatibility + * [I18N] Mark translatable string + +2012-12-13 +Guilhem Bonnefille : + * [QA] Remove unusable constructor + * [QA] Extract utility function from viktrwlayer + +2012-12-11 +Guilhem Bonnefille : + * [QA] Use dedicated macro for creating abstract type + +2012-12-07 +Guilhem Bonnefille : + * [QA] Replace code by GObject macro (viklayer) + * [QA] Replace code by GObject macro (viklayerspanel) + * [QA] Replace code by GObject macro (viktreeview) + * [QA] Replace code by GObject macro (vikgotoxmltool) + * [QA] Replace code by GObject macro (vikviewport) + * [QA] Replace code by GObject macro (vikwebtoolcenter) + * [QA] Replace code by GObject macro (vikwebtoolbounds) + * [QA] Replace code by GObject macro (vikwebtool) + * [QA] Replace code by GObject macro (vikgototool) + * [QA] Replace code by GObject macro (vikexttool) + * [QA] Replace code by GObject macro (googlesearch) + * [QA] Replace specific code by GObject macro + +2012-12-06 +Guilhem Bonnefille : + * [DOC] Add keycap tagging over Ctrl shortcuts + +2012-12-05 +Guilhem Bonnefille : + * [DOC] Add reference documentation to VikStatusbar + +2012-12-02 +Guilhem Bonnefille : + * Fix tooltip setting + * Add tooltip to new zoom level combo + +2012-11-30 +Rob Norris : + * Ensure when opening multiple .vik files they are each loaded into a new window. + * Remove unnecessary pass_along variables usage. + * Tidy up: remove unused parameter in select track or waypoint functions + * Allow configuration of trackpoint size and direction arrow size drawing. + * Add the capability to draw a directional arrow on tracks. + * SF#2783468: Show UTM location in statusbar when in UTM mode. + * Change the save to image to only use tile supported zoom levels. + * Add a zoom combo box into the toolbar + +2012-11-24 +Rob Norris : + * [DOC] Add version and source to the man page. + +2012-11-17 +Rob Norris : + * [I8N] Maintain .vik file compatibilty with translated layer names. + +2012-11-16 +Rob Norris : + * Better integer type usage + * Add G_BEGIN_DECLS and G_END_DECLS to most header files. + * Add missing G_END_DECLS to header files. + * Add missing define for a header file + * [DOC] Add information about file types and window level operations to the user manual. + * [DOC] Fixup help on mouse clicks. + * Fix build for optional use of libX11 + +2012-11-12 +Rob Norris : + * Tidy up: Remove used function. + * Never willingly abort, remove exit() statements. + +2012-11-11 +Rob Norris : + * Merge branch 'HelpUpdates' + * [DOC] New Upload to GPS methods detail. + * [DOC] Illustrate help for all the tools with the associated icon. + * Improve feedback if there is some problem in opening the help. + * [DOC] Reminder on how to generate the PDF help + * Remove unused script + * [DOC] Example on how to convert help output for the Wiki + * [DOC] Map Cache Information + * [DOC] There's more Howto's now. + * [DOC] Add GPS Real Time Howto + * [DOC] Extend Geotagging Help + * [DOC] Improve Getting Started Help + * [DOC] Misc tidy ups in help + * Add configuration to generate help in HTML format + * Add copyright of Rob Norris in documentation and update the year + * Remove document which relates to using a bespoke version of Viking. + * Remove unnecessary .*config files. + * Remove old and unused gpsd pixmap + +2012-11-09 +Rob Norris : + * Allow a simple Waypoint text size to be set per layer. + * Use default system font in manually created layouts. + * Tidy some functions to use the VikTrack type properly + * Add file filter for Viking type files in the save as function. + * When downloading maps along a track always display the maps when available! + * Add support of GPX comments and descriptions for tracks and waypoints. + * Add simple user feedback about the image generation process. + * Add basic image type file filters of JPG and PNG when saving to an image file. + * Rework draw_to_image_file() methods to ask for filename later in the process. + * SF#2831256: Allow generation of large pixel sized images. + * Correct spelling of map cache. + * Bump up default map cache size to 128MB and allow setting to 1GB. + * Add acquire from file into the TrackWaypoint menu options. + +2012-11-04 +Rob Norris : + * Fixup and simplify GPX saving tracks in timestamp order. + +2012-11-02 +Rob Norris : + * Merge branch 'TrackWaypoint-GPS-Up' + +2012-10-27 +Rob Norris : + * SF#356778: Download Map Tiles using F5 + * [DOC] Some help detail about keyboard shortcuts. + * Minor tidy ups. + * SF#3575828: Ensure new track drawing uses track property line thickness + +2012-10-25 +Stanislav Brabec : + * New Desktop Menu Specification[1] finally has appropriate Category for map applications: Maps + +2012-10-21 +Rob Norris : + * Ensures the highlight gets drawn around waypoint image when waypoint is near the screen edge + * Another bit of Google Directions needs ifdef disabling + +2012-10-19 +Rob Norris : + * Allow GPS Upload from any selected TrackWaypoint layer or individual track. + * Expose methods to get details about options from the GPS datasource selection GUI. + * Only create dialog in GPS communication layer if we're going to do some transferring + * Add option to turn off GPS device in GPS Layer communication. + * On all GPS Uploads/Downloads always update progress status with 'Status: Working...' + * Fix opening GPX files with own internal "hidden" markers on waypoints. + * Enable option to not write invisible tracks or waypoints in GPX file and don't write them on GPSBabel convert to method. + * Allow uploading a single track via the GPS layer interface. + * Expose the GPS device communication in the GPS layer for reuse. + * Make GPS layer use dynamic list of GPS devices as supported by GPSBabel. + * Allow passing just a track into a_babel_convert_to() for uploading to a GPS Device + * Correct layer read definition + enable reporting of issues from gpspoint parts in .vik files + * Add basic warning message if an issue has been detected in loading a .vik file. + * Tidy up variable names + * Improve optional build of documentation components + * Limit the size of GPS Babel 'friendly' labels since they can be really long. + +2012-10-13 +Rob Norris : + * [DOC] Amend help to detail new merge, split and delete points track operations. + * Merge branch 'TrackMergeSplitImprovements' + +2012-10-09 +Rob Norris : + * Add some protection against crazy elevation numbers that cause viewing a track's properties to crash + * Detail on how to regenerate reference help + * [I8N] Mark vikaggregatelayer.c for translation + * [I8N] Mark file vikwaypoint.c for translation. + * Fix memory leak detected by cppcheck 1.56 + * Tidy ups to keep cppcheck 1.56 happy. + * Prevent obscure crash on key press when layer is not selected but create track tool is enabled + * Never use g_error() as it aborts the program. Use g_critical() instead. + * Add python tool to convert a Viking tile cache into a MapBox MBTiles format file. + * Rework a_file_load() to always load .vik files in preference to other kinds and other clean ups. + * Suggest default filename with .vik file extension when saving a new file. + +2012-10-05 +Rob Norris : + * Revert Stonehenge.jpg back to the previous version *without* GPS information. + +2012-10-01 +Rob Norris : + * Use the signalling method to the update statusbar from OSM traces background thread. + * Allow statusbar update signal method to specify which part of the statusbar to update. + * Move window code that is unnecessarily in main.c to vikwindow.c + +2012-09-28 +Rob Norris : + * Fix crashing due to GUI updates from the background thread on GPS Upload. + * Fix CPU usage going to 100% when statusbar items update is called. + +2012-09-23 +Rob Norris : + * git ignore the generated PDF manual. + * Releasing version 1.3.2 + * Fix 'make distcheck' to have a clean run. + * Prevent compiler warning. + +2012-09-21 +Rob Norris : + * Minor code tidy up to match staticness of function definitions. + * Fix non slippy maps from complaining about lack of function definition. + * Remove Direction Finding from the Help as direction finding via Google services has been disabled. + +2012-09-20 +Rob Norris : + * Disable direction finding via Google services as they no longer support KML output. + * Fix usage of vvp in gpslayer in uploading TRW layer data. + * Ignore built viking.exe file under Windows. + * Fix DEM icon usage following internal rename. + * git ignore output from make dist + * git ignore files generated in the data directory + * Remove old and unused src/.depend file + * Reduce warnings when compiling on Windows + * Update ‘gdk_pixbuf_ref’ deprecated functions to the g_object_ref equivalents + * Ensure correct selection of track or waypoint following name usage rework. + * Add a background block to the track drawing distance to make the text easier to read. + * Use gdk_draw_layout() rather than gdk_draw_string() in track distance drawing + * Fix flickering map background when creating a new track and panning the map with the mouse. + * Rework the create track drawing with a specific GC on which to draw the next potential point. + * Fix for Debian#685817: Statusbar Update From Thread Instability + * Fix openwindow internal type to match actual usage. + * [Geotagging] Improve detection of image files having GPS information. + * Fix GPSBabel Dynamic Device List generation on Windows Systems. + * Add zoom by bounds capability when using the zoom tool and holding the SHIFT key and left click to select the zoom in area. + * Enable zoom tool to recenter the display on the clicked position when the CTRL key is held at the same time. + * More intuitive zoom actions involving the mouse to retain the location under the pointer within the viewport bounds. + +2012-09-06 +Rob Norris : + * [Geotagging] Update RPM spec for new dependency. + * Improve feedback for handling erroneous GPX. + * [Geotagging] Fix SF#3564795: Crashing when attempting to create waypoints from EXIF images without enough GPS information. + * Prevent crashing when attempting to import with GPSBabel a file and not specifying the file type (due to a malformed (null) result of the GPSBabel file types list). + * Prevent crashing when attempting to acquire data with a malformed (null) result of the known GPS devices list. + +2012-09-04 +Guilhem Bonnefille : + * Fix lack of feedback when reading erroneous GPX + +2012-08-27 +Guilhem Bonnefille : + * [MAPS] Add OpenSeaMap source + +2012-08-27 +Guido Scholz : + * Fix usage of directory "doc/reference" missing even it is used in configure.ac. Automake hangs here if called with autoreconf. + * Clean gnome-doc-utils.make in target "dist-clean" + * Further tab fixes in Makefiles + * Remove doubled defined "XP" in src/Makefile.am (conplained by automake) + * Fix the missing tabulator + * Fix an incompatible make file rule (using "%"); this is complained by automake. + * Enhance the "make dist" target wrapping the package also in a tar.bz2 as well as a zip package + +2012-08-27 +Rob Norris : + * Ensure the pan toolbar button is activated by default to match the default tool mode. + +2012-08-26 +Rob Norris : + * Enable merging segments of a track from the Track->Combine submenu. + * Add function to merge segments of a track. + * Fix implicit ordering of Trackpoint property dialog buttons. + * Tidy up: simpler and better use of trackpoint free methods in TRW Layer. + * Fix potential loss of track segment in vik_track_remove_dup_points() + * Enable deletion of track points with the same timestamp from the Track -> Delete Points submenu. + * Add functions to count and delete track points with the same timestamp. + * Add new 'Delete Points' track submenu and allow deleting duplicate track points. + * Update vik_track_remove_dup_points() to return the number of points deleted + +2012-08-25 +Rob Norris : + * Add Track Split by Segments into Track menu options. + * Consistent use of unique_sublayer_name function when creating new tracks via all split operations. + * Internal reorganization of unique_sublayer_name function for reuse + * Make splitting a track consistant in that it never asks the user the name of the new tracks. + * Remove joining tracks via the Track Point dialog as it was a 'weird hack'. + * Move View Track menu option above submenu options. + * Add new append track command to join tracks not caring about the whether they have timestamps. + * Move track merge options into a new submenu called 'Combine' + * Add track split at trackpoint as an option to the menus. + * Rework track split at trackpoint into a function for later reuse + * Move split track menu options into a new submenu + * Fix merge track by times for using the internal track id properly. + * Fix display of track edit dialog values when invoked via Track Edit dialog. + +2012-08-12 +Rob Norris : + * Fix split track at trackpoint for using the internal track id properly. + +2012-08-09 +Guido Scholz : + * Fix the untranslated "top layer" context menu. Signed-off-by: Rob Norris + * Fix radio button labels not translated in dialog windows. + +2012-08-08 +Rob Norris : + * Add and use keyboard accelerator shortcuts to be able to create the most likely used layers. + +2012-08-07 +Rob Norris : + * Add keyboard accelerator marker for layers used in menus. + * [I18N] Ensure all layer names are marked for translation + +2012-08-06 +Rob Norris : + * Rework Tool interface for give better control for Tool menu labels and tooltips. + * Add some keyboard shortcuts to the help. + +2012-08-05 +Rob Norris : + * Fix header as vik_trw_layer_get_waypoint is required again. + +2012-08-04 +Rob Norris : + * Rework Track Draw by Velocity into Draw by Speed with a simple traffic light colouring scheme. + * For tooltips use plain text so that comments with HTML markup or similar are shown in a literal fashion rather than causing parsing failures. + * Add simple direct on disk access map type to tiles ideally pregenerated in the OSM tile layout format. + * Geotagging: add option to overwrite existing waypoints. + * Fixup making the track name a property of the track. + +2012-07-19 +Mathieu Albinet : + * Windows: Really fix opening pictures + +2012-07-19 +Rob Norris : + * Remove create_realtime_trackpoint call in cleanup which can crash. + * Fix crashing when deleting a GPS layer which has started a realtime tracking. + * Add missing function declaration in dir.h + +2012-07-10 +Rob Norris : + * When uploading to a GPS device, maintain the unique names of tracks and waypoints. + * Expose ability to uniquify both tracks and waypoints names in a TRW layer. + * Add method to uniquify waypoint names in a TRW layer and give the option to use it within the delete selection of waypoints ability. + * Add method to uniquify track names in a TRW layer and give the option to use it within the delete selection of tracks ability. + * Make the track name a property of the track. + * Make the waypoint name a property of the waypoint. + +2012-06-28 +Rob Norris : + * Fix potential crashing when using multiple maps on especially 64bit systems. + * Fix crashing when displayed map copyright(s) is longer than the internal buffer. + * Remove incorrect comment + * Fix crash in Show Picture functionality on Window's Systems. + +2012-06-10 +Rob Norris : + * Fix intended preferences group. + * Fix typo + * Add missing parameter terminator. + +2012-06-02 +Fernando Arbeiza : + * Add a Gradient Graph to the Track properties display + +2012-05-10 +Evan Battaglia : + * Add CalTopo 7.5" (24k) USGS Topos! + +2012-05-10 +Guilhem Bonnefille : + * Add support for many extensions' configuration + +2012-05-08 +Guilhem Bonnefille : + * [LEGAL] Bump copyright's year + +2012-05-07 +Guilhem Bonnefille : + * Fix printing of DEBUG message since glib 2.32 + +2012-05-05 +Guilhem Bonnefille : + * [DOC] Declare VikWebtoolBounds in documentation + +2012-05-03 +Guilhem Bonnefille : + * [DOC] Improve build options for gtk-doc framework + * [DOC] Minor improve on internal documentation + * [BUILD] Remove explicit add of -lexif + +2012-04-22 +Guilhem Bonnefille : + * Releasing viking 1.3 + * Merge branch 'i18n-launchpad' + * Document previous translation updates + * Import Launchpad updates + * Merge tag 'viking-1.2.2' + * [DOC] Fix DocBook syntax in user manual + * [I18N] Fix POTFILES with new files + +2012-04-11 +Rob Norris : + * Be consistent in that track and waypoint list dialogs are always sorted alphabetically. + * Fix build when --disable-alphabetized-trw is specified + +2012-04-09 +Rob Norris : + * [DOC] Update current built in map types. + * [DOC] Add more detailed help about the available preferences. + * Credit tile supplier Andy Allan for OSM Cyclemap tiles. + * Add OSM Transport map as a built in map option. + * Tidy map examples. + * Remove Tiles@home support as the service has stopped. + +2012-04-03 +Rob Norris : + * Add supported MIME types to the desktop file specification. + * Reduce warnings from the build due to slightly misformed libcurl.m4 macros. + +2012-02-11 +Rob Norris : + * Fix Track Properties graph blob marker drawn at wrong elevation when elevation graphs have different min/max heights. + +2012-02-04 +Rob Norris : + * Example script that can be used to upload a track as a route to a predefined GPS device. + * [DOC] Update auto generated INSTALL file to latest version. + * cleanup: Remove unused and out of date 'viking-remote' script and related files. + * cleanup: Remove *very* old documentation and don't bother distributing any of it which is all old. + * Out of date file GEOCODED-PHOTOS has been removed + +2012-01-29 +Rob Norris : + * Reduce scope of a variable. + +2012-01-20 +Rob Norris : + * Display the average moving speed for a track in the track properties. + * Add function to return an average moving speed for a track. + * Add ability to open a TrackWaypoint layer with another external program (default merkaartor). + * Add ability to open a TrackWaypoint layer with an external program (default JOSM). + +2012-01-19 +Rob Norris : + * Better memory cleanup on unint. + * Update HACKING information for contribution recommendations. + +2012-01-18 +Rob Norris : + * Add an image without GPS Information and the associated tracklog sample for testing purposes. (Location Stonehenge in England). + * Add an image with GPS Information for testing purposes. (Location Brecon Beacons in Wales). + * Fix small memory leak in geotagging images processing. + * Correct format for an include statement of a C standard library. + * Fix compiler warning. + +2012-01-17 +Rob Norris : + * Allow TrackWaypoint layer creation without a viewport. + * Restore compilation of test program gpx2gpx. + +2012-01-15 +Rob Norris : + * Reduce scope of wikipedia_submenu variable, as it's not used if VIK_CONFIF_GEONAMES is not enabled. + +2012-01-07 +Rob Norris : + * Fix error identified by cppcheck 1.52. + * Fix error identified by cppcheck 1.52. + * Fix error identified by cppcheck 1.52. + * Fix error identified by cppcheck 1.52. + * Fix error identified by cppcheck 1.52. + * Fix error identified by cppcheck 1.52. + * Fix potential GdkPixbuf-CRITICAL warning in thumbnail creation. + +2011-12-22 +Rob Norris : + * Use map default: OSM MapQuest tileserver. + * Add map OSM MapQuest tileserver as a built-in type. + +2011-12-19 +Rob Norris : + * Merge branch 'Geotagging' + * Merge branch 'ExternalOptions' + * Fix Track Properties graph DEM points drawn at wrong elevation when lowest elevation is not zero. + +2011-12-18 +Rob Norris : + * Tidy up static preference values. + * Use an intermediary program which will invoke the system's default for opening images. + * Add and use a preference for the associated image viewer program. + * Add and use KML File Export units option. + * Add second group of global preferences, called 'Export/External' + +2011-12-11 +Rob Norris : + * Make geotag processing run in the background. + * [DOC] Add help for Geotagging. Remove old documentation. + * [DOC] Mention Bing maps and some more Tools. + * Add files for internationalization. + * Add ability to geotag images interpolating times against tracks. + * Make jpeg-data build against glib i18n instead of own i18n version. + * Add libjpeg utilities from exif command line tool version 0.6.20 + * Acquire Geotag Images via TRW Layer + * Ensure vtl created in acquire operation runs post read stage. + * EXIF read implementation for geotagged images (libexif). + * Rationalize babel function parameter ordering. + * Add new process stage for acquire methods. + * Ensure track stop is drawn before trackpoint. + * Ensure track stops are always drawn if required. + +2011-12-11 +Greg Troxel : + * Add comments. + +2011-12-11 +Greg Troxel : + * Omit drawops when point == last point. + +2011-12-11 +Rob Norris : + * Restore "New layer" button (with "+" icon) function. + * Code cleanup. Remove very old GTK support for <2.6 since 2.12 is needed for building. + * Enable reversing a track from the track menu. + * Fix: Improve internal redrawing method. + * Fix opening of external web sites via center method when the zoom level is less than 1 mpp. + * Enable internationalization and simpilify 'Global' preferences text into less specific 'General' term. + +2011-12-04 +Rob Norris : + * Fix crashing on opening a file via recent menu after a .vik file is opened. + * Display compact message on the statusbar for the selected trackpoint or waypoint. (SF#3314888) + +2011-11-16 +Rob Norris : + * Enable multiple selection and deletion of entries from vikfilelist. + * Do not use preset Google cookie when we don't even use google maps (images) anymore. + * Acquire: Maintain default to Garmin devices (assumed most popular/numerous device) + * Scale waypoint icons to give large or small icons as necessary. + * Add Yahoo! Maps webtool link. + * Fix too easy to accidently move a waypoint with an image with the select tool - must use shift key. + * Fix Join Tracks functionality - Part2. + * Ensure waypoint image size always initialized. + * Fix can not immediately select another layer if currently selected layer's visibility changes. + * Improve trackpoint edit dialog window sizing when the trackname is very long. + * Merge branch 'GPSD-API-v5' + +2011-11-13 +Rob Norris : + * Improve libgps test with the consistently available function: gps_close + * Merge branch 'master' into GPSD-API-v5 + +2011-11-03 +Guilhem Bonnefille : + * Releasing version 1.2.2 + +2011-11-03 +Hanno Boeck : + * Fix compilation with curl 7.21.7 (SF#3376584) + +2011-11-03 +Rob Norris : + * Increase default tile age check to 7 days. + +2011-10-29 +Rob Norris : + * Remember last track and waypoint request type on GPS acquire dialog. + * Add control of GPS upload/download of components tracks and waypoints. + * 'Import files with GPSBabel' help update. + * Fix : + * Restore distance and times between trackpoints shown on the trackpoint edit window. + * Fix crashing on opening multiple files after a .vik file is opened. + * Fix potential crashes if check_file_magic_vik function is used incorrectly. + * Add Acquire OSM option into the Track/Waypoint layer operations. + * Solution for SF#2766266 - Give user feedback about OSM uploads (success/failure). + +2011-10-21 +Guilhem Bonnefille : + * Remove duplicate redraw + * Fix: send VLP's update signal when adding a layer + +2011-10-17 +Guilhem Bonnefille : + * Add Windows' path to configuration files + +2011-10-14 +Rob Norris : + * Fix: Don't abort program when attempting webtool center with different x & y factors. + +2011-10-08 +Roberto Camarero : + * Spanish translation of the win32 installer + +2011-10-02 +Rob Norris : + * Add used geo-* scripts as they are public domain. + * Continue geocaching.com support via third party tools. + * Show Geocache configure status. + * Show elevation gain/loss on track creation 'tooltip' (as per SF#2838561 request), when such data is available. + * Automatically attempt to set elevation data from the DEM layer whilst a track is being created. + * When creating a track, display the total distance of track (via a tooltip like text) on the main display. + * TrackWaypoint Layer Interface function code tidy. + * Improve trackpoint or waypoint edit selection. + * Fix Join Tracks functionality. + * Make tile age parameter jump by 1 minute steps in preferences setup. + * Add keyboard accelerator 'N' for New Layer in Aggregate Menu. + * Remove unused function definition. + * Fix SF#3408170: Selected Track Thickness is Always 1px + * Use more icons for menu entries. + +2011-10-01 +Guilhem Bonnefille : + * Allow to import any file known by gpsbabel + +2011-09-20 +Rob Norris : + * Merge branch 'WindowsInstaller' + +2011-09-16 +Rob Norris : + * Fix tracks not shown over map when map layer is dragged to the end of the treeview list. + * Add some file open filters to ease file selection. + * Increase default tile age check to 7 days. + * Show error message earlier if in incompatible print image directory coord mode. + * Fix spelling + * Refuse to load unsupported file types. + * Restore broken GPS power off command. + +2011-09-11 +Guilhem Bonnefille : + * Add support for any device known by gpsbabel + * Dynamically adapt viking to gpsbabel's file formats + * factorize gpsbabel command line + +2011-09-11 +Rob Norris : + * Fix: SF#3042692 - Tiles May Get Deleted During Offline Usage. + * Fix some tracks elevation profile may display no altitude, despite all altitudes available in the track. + * Use more icons for menu entries. + +2011-09-10 +Rob Norris : + * Add experimental support for GPSD_API_MAJOR_VERSION 5. + * Rework gpsd interface for conditional compiling using GPSD_API_MAJOR_VERSION. + * Add Acquire options into the Track/Waypoint layer operations. + +2011-09-10 +Mathieu Albinet : + * Add Windows Installer (NSIS) + +2011-09-07 +Guilhem Bonnefille : + * [DOC] Document viking's dependencies + +2011-09-01 +Guilhem Bonnefille : + * Fix SF#3387590: Top Layer cannot be renamed + +2011-08-26 +Guilhem Bonnefille : + * Oups: clean code + * [QA] Factorize code + +2011-08-25 +Guilhem Bonnefille : + * Minor fix: declare static internal functions + +2011-08-23 +Guilhem Bonnefille : + * Fix typo + +2011-08-21 +Guilhem Bonnefille : + * Add ability to acquire GPS traces stored on OSM + * Extend OSM to OpenStreetMap + +2011-08-20 +Rob Norris : + * Enable merging tracks without timestamps to other tracks that do not have timestamps. (SF#2886231) + * Prevent track merge by time requests when there are no other suitable tracks. + * Remove DEM data source 'None' as it does nothing. + * Enable copying layer/sublayer names as plain text, so that it can be pasted into external text handling applications. + * When exporting a TrackWaypoint layer as a GPX file, automatically append '.gpx' to the suggested filename. + * Enable getting of the statusbar from the window. + * Enumerate use of and simplify the internals of the statusbar. This enables control of the size of the first element of the statusbar. + +2011-08-19 +Guilhem Bonnefille : + * [DOC] Fix layer related structure of documentation + * [DOC] Improve reference documentation for babel.c + +2011-07-25 +Hanno Boeck : + * Fix compilation with curl 7.21.7 (SF#3376584) + +2011-07-15 +Rob Norris : + * Improve track name when split from Track Properties window. + +2011-07-14 +Rob Norris : + * Better safety checking to prevent crash due to null variable reference in use of the current waypoint. + +2011-07-13 +Rob Norris : + * Better safety checking to prevent crash due to null variable reference in use of the current trackpoint. + * When loading from the recent file menu, only open a new window if a Viking file. + * On creating a new waypoint always attempt to auto set the altitude if DEM data is available. + * Enable the escape key to remove/reset the ruler tool. + * Enable keypress processing for vik windows tools. + +2011-07-02 +Guilhem Bonnefille : + * Document utility functions + +2011-06-27 +Rob Norris : + * Oops, remember to remove reference to deleted icon. + +2011-06-25 +Rob Norris : + * Internal tidy: replace magic scissor variables/references with route finder. + * Improve the associated icon, remove the scissor effort and use something to try to suggest the idea of a list of directions to get somewhere for 'Route Finding'. + * Replace 'Magic Scissors' by a more accurate name - 'Route Finder'. + * Improve altitude track property display by adding another grid size chunk value. + * Enable internationalization of the OSM Traces preferences text. + +2011-06-22 +Rob Norris : + * Fix compiler warnings generated with gcc4.6 in viktrwlayer_propwin.c + * Fix compiler warnings generated with gcc4.6 in viktrwlayer.c + * Fix compiler warnings generated with gcc4.6 in viktreeview.c + * Fix compiler warnings generated with gcc4.6 in viktmsmapsource.c + * Fix compiler warnings generated with gcc4.6 in vikgpslayer.c + * Fix compiler warnings generated with gcc4.6 in print.c + * Fix compiler warnings generated with gcc4.6 in file.c + +2011-06-16 +Rob Norris : + * Releasing viking 1.2.1 + +2011-06-14 +Rob Norris : + * Support proper MAC OS file locations. + * Fix incorrect track property line marker positioning when the track has gaps. + * Fix track property point marker drawing error - sometimes draws dot marker too low. + +2011-05-29 +Guilhem Bonnefille : + * Releasing viking 1.2 + * Fix translations: addbing mapsource.c + +2011-05-24 +Guilhem Bonnefille : + * Merge branch 'i18n-launchpad' into viking-1.2.rc1 + +2011-05-22 +Rob Norris : + * Better safety checking to prevent crash due to null variable reference in use of the current trackpoint. + * Remove unecessary treeview item selection. + +2011-05-21 +Sven Wegener : + * Fix etag handling + * Add zoom level 0.5 to map layer + +2011-05-21 +Guilhem Bonnefille : + * [DOC] Add links to access Viking's source code + +2011-05-16 +Guilhem Bonnefille : + * Fix: generate doc/reference/Makefile when needed + * Improve configure script when error occurs + * Document previous translation updates + * Import Launchpad updates + +2011-05-10 +Rob Norris : + * Rename file to prevent any case-insensitive issues. + * Improve README to mention OSM. + +2011-04-07 +Rob Norris : + * Add getting the users confirmation when deleting (emptying) data from the GPS layer. + * Enable keypad delete to remove layers in the layers panel. + * Enable deleting multiple tracks or waypoints within a layer by selecting them from a list. + * Add getting the users confirmation when deleting an individual track or waypoint. + * Add the ability to delete all waypoints or tracks in the layer. + * Add getting the users confirmation when deleting a layer. + * Start a new 'Tracks' treeview menu, similar to the 'new' Waypoints treeview menu. + * Add operations on waypoints into the 'new' Waypoints treeview menu. + * Prevent unnecessary internal track creation/deletion when splitting a track by time request doesn't actually alter the number of tracks. + * Fix Track -> Split by Timestamp such that newly created tracks are ordered correctly. + +2011-04-06 +Rob Norris : + * Add new graph type Speed/Distance in the track properties window. + * Tidy up draw_elevations and draw_vt functions. + * Add new graph type Elevation/Time in the track properties window. + * Remove unnecessary calculation in make_speed_map in viktrack.c + * Add new graph type Distance/Time in the track properties window. + * Update source code copyright on viktrwlayer_propwin.c + * Remove pointless storage of vlp in track properties window. + * Improve Track Properties speed/time drawing to display in nice human friendly whole number scaled units. + * Improve Track Properties elevation drawing to display in nice human friendly whole number scaled units. + * On the Track Properties Window draw an always updating indicator of where the readings are taken from. + * Track Properties Window internal tidy: Maintain minimum/maximum altitudes/speeds for reuse. + * Enable controls of drawing DEM data and GPS speeds on the Track Properties Window. + * Track Properties Window internal tidy: Enable DEM and GPS speeds to be optionally drawn on the elevation profile. + * Add keyboard accelerators for the Track Properties Window. + * Add ability to resize the Track Properties window. + * Track Properties internal refactor: rename function to reflect what it really does. + * On the Track Properties Window, also show the elevation or speed for the current track position as indicated by the mouse pointer. + * Track Properties internal refactor: make getting percentage along a track via distance or time into separate functions for further reuse. + * Track Properties Window internal tidy: individual profile sizes for each window. + * Track Properties Window internal tidy: maintain graph profile arrays for reuse by update and future functions. + * Fix sensitivity of the track properties window split marker to be disabled when the track marker is not drawn. + * Restructure the graph drawing functions to only handle a single aspect of functionality. (create or update) + * Rename function minmax_alt to minmax_array, and refactor for optional altitude test. + * Fix crashing due to incorrect usage of libcurl - SF#3206628. + +2011-03-31 +Rob Norris : + * Add support for kml files. + * Add ... where necessary to track & waypoint menu entries. + * Enable vik_layers_panel_get_all_layers_of_type to optionally return only visible layers. + * Enable Open Waypoint Image via right click menu entry. + * Use ability to select a waypoint given the thumbnail image size. + * Add ability to open the trackpoint edit dialog via the viewport right click menu when a trackpoint is selected. + * Add ability to move selected trackpoint or waypoint by the mouse within the select tool. + * Add a new select tool at the window level to enable/disbale item selection of the a track or a waypoint. + * Enable getting the treeview from the layerspanel. + * Enable to unselect treeview item + * Define an interface function to show the viewport menu on the selected item (track or waypoint). + * Store name of individual track or waypoint for later selection usage. + * Need to store the containing trw layer for later usage of selected track(s) or waypoint(s) operations. + * Add Select Request layer interface and use within the track/waypoint layer to select an item. + * Add internal track right click menu variable. + * On selection of layers panel item, automatically ensure it is fully shown. + * Tidy up track/waypoint sublayer callbacks to only use the layers panel if it available. + * Add viewport to sublayer add menu items callback. + * Make the highlight colour configurable and use as appropriate for the selected track/waypoint drawing. + * Add track and waypoint highlight for the selected layer or individual item. + * Add the storage and retrieval of any kind of track or waypoint selected item (either an individual item, list (i.e. a sublayer) or layer) at the window level. + * Add the ability to return the layers_panel from the window. + * Add viewport property to control the display of the track / waypoint item highlight. + * Add backup support for launching URLs with Mac OS based browsers. + * Add backup support for launching URLs with Google Chrome based browsers. + * Fix non-void function should return a value. + * Fix compiler warning for Bing use of dynamic copyright. + * Fix compiler warning for dynamic copyright. + * Improve git ignore for reference documentation generation. + * Fix reference documentation generation - some systems need explicit mention of libz. + * gtk_object_sink has been deprecated since gtk version 2.10, use g_object_ref_sink() instead. + +2011-03-27 +Guilhem Bonnefille : + * Add support for Bing maps + * Add support for dynamic copyright + * Add map's logo support + +2011-03-26 +Guilhem Bonnefille : + * Document VikViewport + * Document Map Source hierarchie + * Improve documentation of background.c + * Add support for reference documentation + +2011-03-17 +Rob Norris : + * Generate a trackwaypoint layer update on the finish creatiing of the thumbnails so the images are shown. + +2011-03-16 +Rob Norris : + * Fix displaying of 'Waypoints' treeview menu. + * Enable the tree view panel to be more usefully resized smaller than the text names. + +2011-03-14 +Guilhem Bonnefille : + * Improve HACKING documentation + +2011-03-11 +Mathieu Albinet : + * Windows : Open help pdf file when when clicked on Help->help + +2011-03-03 +Rob Norris : + * Fix vik_aggregate_layer_get_all_layers_of_type for track/waypoint layer types, since these may also be stored under GPS layers. + +2011-03-02 +Guilhem Bonnefille : + * Add autoconf HAVE macros + +2011-02-28 +Rob Norris : + * Improve previous fix: background calling code should control return value + * [DOC] Split By Number of Points + * Add Track->Split by Number of Points (as per SF#2847587 request). + * Add a new dialog to return positive number. + +2011-02-22 +Guilhem Bonnefille : + * Fix: background calling code should control return value + * Fix: enforce background feature + +2011-02-17 +Rob Norris : + * Rework the a_dialog_new_waypoint function + * Fix compiler warnings from gcc 4.5.4 + +2011-02-17 +Milan Jurik : + * SF#3178554: Fix Sun Studio build + +2011-02-15 +Rob Norris : + * Prevent map license from being displayed more than necessary. + +2011-02-13 +Rob Norris : + * Remove dulipcate icon reference. + * Correct several babel.h function return types. + * SF#2844872: Suggest name for the new track when splitting the track via the trackpoint edit dialog. + +2011-02-10 +Guilhem Bonnefille : + * Reduce GObject cast + +2011-02-08 +Guilhem Bonnefille : + * Releasing viking 1.1 + * Fix typo in translation + * Merge branch 'i18n' + * Merge branch 'i18n-launchpad' into i18n + * Document previous translation updates + * Import Launchpad updates + +2011-02-07 +Guilhem Bonnefille : + * [DOC] Add MapQuest Nominating search service in examples + +2011-02-06 +Guilhem Bonnefille : + * Fix dangerous code + +2011-02-04 +Rob Norris : + * Fix trackpoint edit altitude sensitivity to be re-enabled after it has been disabled. + +2011-01-29 +Guilhem Bonnefille : + * Merge branch 'i18n-launchpad' + * Add Javanese translation + +2011-01-29 +Rob Norris : + * Use define for conversion of meters->miles units. + +2011-01-28 +Guilhem Bonnefille : + * Document previous translation updates + * Import Launchpad updates + +2011-01-28 +Rob Norris : + * Add and use defines for conversion of meters<->miles units. + * Adjust colour of last auto track colour to not clash with default create track colour. + * Tidy up: Rename a dialog function as it's used to get a yes or no value. + * Add menu icons for the maps layer menu. + +2011-01-27 +Rob Norris : + * Add myself (Rob Norris) as someone you can blame in the doap file. + * Improve project description in the spec file. + +2011-01-24 +Rob Norris : + * Fix variable spelling part2. + +2011-01-23 +Rob Norris : + * Fix spelling + +2011-01-21 +Rob Norris : + * Make the selection list in Merge With Other Tracks sorted alphabetically. + * Add sort list by name function. Will be useful for track and waypoint list ordering. + * Fix incorrect cut/copy of sublayers when accessed via the layers panel buttons. + * Prevent Gtk-CRITICAL **: gtk_list_store_get_path: assertion `iter->stamp == GTK_LIST_STORE (tree_model)->stamp' message. + * Fix the List Dialog so that it does not become taller than the screen when there are lots of entries. + * Tidy Up:Improve a_dialog_select_from_list function. + +2011-01-16 +Rob Norris : + * [DOC] Mark ready for 1.1 release. Update help manual version to 0.2. + * [DOC] Add layer information for Aggregates, Coords and GeoRefs in help. + * [DOC] Add Maps layer help information. + * [DOC] Add overall layer information and promote each layer to be a top level section in help. + * [DOC] Add DEM layer help information. + * [DOC] Mention waypoint properties in help information. + * [DOC] Update GPS layer help information. + * [DOC] Update track operations help information. + * [DOC] Update waypoint operations help information. + * [DOC] Update Tools help section + * [DOC] Update TrackWaypoint layer menu help Information + * Improve positioning of the menu separator on waypoint menus. + +2011-01-14 +Rob Norris : + * Remove unecessary print statement. + * Prevent Gtk-CRITICAL assertion when the application is closed with a Track Property window on display. + * Prevent Gtk-CRITICAL assertion when the application is closed whilst loading DEMs. + * Fix some compiler warnings in viktrwlayer.c when configured to build with --disable-alphabetized-trw + +2011-01-12 +Rob Norris : + * Fix Resource leak detected by cppcheck 1.46 + +2011-01-07 +Rob Norris : + * Add GeoRef layer tooltip to show the file name in use. + * Add GPS Layer tooltip to say the protocol (aka device manufacturer) type. + * TrackWaypoint Layer tooltip featuring summaries for tracks and waypoints. + * Add maps layer tooltip to show the map name(type). + * Add DEM layer tooltip to show the number of DEM files in use. + * Add Track and waypoint sublayer tooltip information. + * Add treeview use and display of layers tooltip. + * Add Layer Tooltip callback definition + * Add sublayer tooltip callback definition. + +2011-01-07 +Guilhem Bonnefille : + * Fix typo + +2011-01-07 +Rob Norris : + * When getting data via the GPS layer automatically set the view to see it, unless the realtime tracking mode is on. + * On acquiring data from sources (inc. GPS) automatically set the view to see it. Except for GeoCaches; as it's likely you're requesting data for the current area, so no point in trying to change the view. + * On opening GPX files automatically view all the data. + * Add 'View All Tracks' option to the panel Layer menu options, which sets the view (center & zoom) to see all the tracks of that layer. + * Add 'View Waypoints' option to the TrackWaypoint layer menu options, which sets the view (center & zoom) to see all the Waypoints. + * Add 'View Track' option to the Track sublayer menu options, which sets the view (center & zoom) to see the track. + * Add 'View Layer' option to the TrackWaypoint Layer menu options, which sets the view (center & zoom) to see the entire layer. + * Add the ability to 'autozoom' to view an area specified by maximum and minimum lat/longs for a TrackWaypoint layer. + +2011-01-07 +Guilhem Bonnefille : + * Remove the hability to hide copyright + +2011-01-07 +Robert Norris : + * Create a new 'Show' submenu entry + +2011-01-04 +Rob Norris : + * Improve curl usage as should call cleanup on application exit. + * Add copyright and license properties for NASA BlueMarble data. + * Fix compiler warning in curl_download.c + +2010-12-23 +Guilhem Bonnefille : + * Fix dangerous static declaration + * Fix compiler warning in vikmapslayer.c + +2010-12-23 +Rob Norris : + * Fix compiler warning in vikwindow.c - use correct const typing. + * Fix compiler warnings - correct Widget / Window type. + +2010-12-19 +Guilhem Bonnefille : + * Fix memory leak when generating image file + * Fix Spotmaps license + +2010-12-16 +Rob Norris : + * Add background thread loading of DEM files. + * Add Track->Goto Highest and Lowest points features. + * Tidy intended logic in if statement. + * Add Track->Goto Maximum Speed feature. + * Rework Track->Goto menu options. + +2010-12-15 +Guilhem Bonnefille : + * Add support for the TMS interface provided by SPOTMaps + * Fix: Improve XML reading error reporting + +2010-12-14 +Guilhem Bonnefille : + * Add license related properties + +2010-12-11 +Guilhem Bonnefille : + * Add copyright property + +2010-12-09 +Guilhem Bonnefille : + * Add undeclared translations + +2010-12-05 +Rob Norris : + * Fix compiler warnings in osm.c + * Improve key binding for Mercator Mode -> ctrl+m + * Fix compiler warning in vikmapslayer.c + +2010-12-03 +Rob Norris : + * Fix Waypoint & Track visibility issues. + +2010-11-30 +Guilhem Bonnefille : + * Add documentation for generic TMS map source + +2010-11-30 +Rob Norris : + * Fix SF#3104028: Default Color Background is incorrectly saved as black into a new .vik file. + * Improve key bindings for ModeLatLon. + * Set git to ignore test_coord_conversion program + +2010-11-29 +Rob Norris : + * Set git to ignore autogenerated documenters.h + +2010-11-28 +Guilhem Bonnefille : + * Add OSM WMS Server + * Add support for WMS-C + * Add support for more standard TMS + +2010-11-27 +Guilhem Bonnefille : + * Move-up download methods + * Add LatLon projection + +2010-11-27 +Rob Norris : + * Better safety checking code + +2010-11-26 +Guilhem Bonnefille : + * Fix some translated strings + +2010-11-25 +Rob Norris : + * Add support for Locosys devices via GPSBabel's navilink device protocol. + * Add support for DeLorme devices via GPSBabel's delbin device protocol. + * Add the ability to insert a trackpoint into a track via the Edit Trackpoint dialog. + * Add internal function to insert a trackpoint after the currently selected trackpoint. + +2010-11-25 +Guilhem Bonnefille : + * Add license notice to new file + +2010-11-24 +Guilhem Bonnefille : + * Replace macros by enum + * Simplify previous commit + +2010-11-22 +Rob Norris : + * Enable individual track to GPX export via the Track sublayer menu. + +2010-11-21 +Rob Norris : + * Set 'OK' default for autogenerated dialogs. + * Set 'OK' default for find waypoint dialog. + * Set 'OK' default for download along track dialog. + * Set 'OK' defaults for new track, custom zoom & split time dialogs. + * Set 'Cancel' default for merge track dialog. User needs to select items first. + * Set 'OK' default for the new waypoint dialog. + * Set 'OK' default for goto dialogs. + * Set 'OK' default for the Save to Image dialog. + * Set 'OK' default for the track properties dialog. + * Set 'OK' default for the GPS layer dialog. + * Set 'OK' defaults for goto dialogs. + * Set 'Cancel' default for the Geo Ref dialog, as user should really specify a map file first. + * Set 'Cancel' default for the OSM upload dialog. + * Set defaults for geonamesearch dialogs. + * Set 'OK' default for the background jobs dialog. + * Set 'OK' defaults for acquire dialogs. + * Add a perl script to auto generate basic Viking .vik files for directories containing images. + +2010-11-19 +Rob Norris : + * Enable control of the visibility of the menubar [including keyboard shortcut - F4]. Also enable panic key 'Escape' to restore menubar if hidden and no tool uses it. + * Enable control of the visibility of the toolbar [including keyboard shortcut - F3]. + * Make use of the vikwindow toolbar variable. + * Enable control of the visibility of the statusbar [including keyboard shortcut - F12]. + +2010-11-17 +Guilhem Bonnefille : + * Releasing viking 1.0 + * Remove duplicates msgid + * Merge branch 'i18n-launchpad' into master + * Auto-update PO translation files + +2010-11-14 +Guilhem Bonnefille : + * Document previous translation updates + * Import Launchpad updates + +2010-11-11 +Guilhem Bonnefille : + * Add minimal translator-credits in About dialog + * Use $(top_srcdir) to locate AUTHORS file + * Add documenters to About dialog + +2010-11-10 +Guilhem Bonnefille : + * Add copyright notice to maintainer's scripts + +2010-11-09 +Guilhem Bonnefille : + * Improve copyright holders + +2010-11-07 +Guilhem Bonnefille : + * Add copyright to srtm_continent.c + * Add origin comment + +2010-11-07 +Rob Norris : + * Add copyright for geonamessearch.h and correct for geonamessearch.c + * Add copyright for files vikgoto.h & vikgotoxmltool.h + +2010-11-07 +Guilhem Bonnefille : + * Fix copyright for googlesearch.[ch] + +2010-11-07 +Rob Norris : + * Add copyright for files preferences.c & preferences.h + * Add copyright for dems.c & dems.h + * Add copyright for datasources.h. + +2010-11-07 +Guilhem Bonnefille : + * Correct DocBook usage + +2010-11-07 +Rob Norris : + * Various improvements and tidy ups. + +2010-11-03 +Guilhem Bonnefille : + * Deprecated: only include gtk/gtk.h + * Improve depreaction options + +2010-11-02 +Guilhem Bonnefille : + * Add built-in map sources in example file + +2010-11-02 +Rob Norris : + * Fix extend track using magic scissors. + +2010-11-01 +Guilhem Bonnefille : + * Merge branch 'master' into i18n-launchpad + * Document previous translation updates + +2010-10-23 +Guilhem Bonnefille : + * Import Launchpad updates + +2010-10-20 +Sven Wegener : + * Fix autodownloading while panning + +2010-10-19 +Rob Norris : + * Prevent crashes when downloading Expedia Maps. + +2010-10-16 +Rob Norris : + * Fix Debian #599048: Segmentation fault when using gpsbabel + * Fix dem_gradient_colors allocation. + +2010-10-13 +Guilhem Bonnefille : + * Fix commit 1c6a6010661da96fd105ec42ad2f048df79fabbd + +2010-10-12 +Rob Norris : + * Fix compiler warnings in preferences.c + +2010-10-12 +Guilhem Bonnefille : + * Fix: enforce defensive code + * Releasing viking 0.9.96 + +2010-10-11 +Guilhem Bonnefille : + * Fix unecessary change in string + * Free memory + * Add defensive code + * Increase buffer length + +2010-10-11 +Jon Burgess : + * Fix memcheck error + +2010-10-11 +Guilhem Bonnefille : + * Merge remote branch 'jocelyn/etag' + * Disable autodownloading when dragging the map + +2010-10-10 +Robert Norris : + * Fix: Uninitialized color value being used + +2010-10-10 +Guilhem Bonnefille : + * Avoid uninitialized color value usage + * Defensive code + +2010-10-08 +Rob Norris : + * Add new menu entry in GPS Layer to delete the realtime information. + * Ensure GPS realtime information deleted when GPS Layer -->Empty All is called. + * Fix SF#3009431: Prevent Crash in Real Time Tracking GPS Mode & Autodownload Maps. + * Fix display of rounded speed units scale markers in the speed profile. + +2010-10-08 +Guilhem Bonnefille : + * Revert "Make more portable .vik file, as don't save the map cache directory if it's the map cache default directory." + * Merge remote branch 'rnorris/LayerMenuKeyboardAccelerators' + +2010-10-01 +Rob Norris : + * Make more portable .vik file, as don't save the map cache directory if it's the map cache default directory. + * Remove specific user's map cache directory from test Terraserver.vik file, so that anyone can use it. + * Prevent zoom factor string displaying unnecessary .0s when it's a whole number. + +2010-10-01 +Jon Burgess : + * Prevent access to undefined data when fgets() returns NULL + +2010-10-01 +Rob Norris : + * Improve Track Properties speed profile display for low speed difference (e.g. walking) tracks. + * Use speed units in display of Track/Waypoint layer draw by velocity config values, but maintain units as metres per second when read from/saved to files. + +2010-10-01 +Guilhem Bonnefille : + * Fix arithmetic macro definition + +2010-10-01 +Rob Norris : + * Add and use defines for conversion of speed units. + +2010-10-01 +Guilhem Bonnefille : + * Fix arithmetic macro definition + +2010-09-29 +Rob Norris : + * Add keyboard accelerators for as many as possible View Menu entries. + * Remove duplicated line of code in trackpoint drawing. + * Fix small memory leak when downloading DEM data via the tool method. + +2010-09-26 +Rob Norris : + * DEM layer properties tidy up. + +2010-09-25 +Guilhem Bonnefille : + * Add a new debug message + * Simplify zoom status when xmpp and ympp are equal + * Fix minor source code typo + * Fix arithmetic macro definition + +2010-09-24 +Rob Norris : + * Improve grammar/usage for conversion macro function to convert meters into feet. Also prepend these macros with VIK_ as better practice. + +2010-09-19 +Guilhem Bonnefille : + * Use constant for 'feet in meter' + +2010-09-19 +Rob Norris : + * Use height units in the altitude readout for the cursor position on the status bar. + * Use height units in display of DEM min / max elevation values, but maintain units as metres when read from/saved to files. + * Extend set/get param interface to have knowledge of what type of operation it is - i.e. is it related to file i/o or display/cut/copy usage. + +2010-09-19 +Guilhem Bonnefille : + * Fix cycle map URL + * Fix GType macro usage + +2010-09-19 +Rob Norris : + * Add keyboard accelerator for the Filter extension to the Track/Waypoint layer menu. + * Add keyboard accelerators for the Waypoints sublayer menu. + * Add keyboard accelerators for the Tracks sublayer menu and improve the text casing. + * Add keyboard accelerators for the Track/Waypoints layer menu and improve the text casing. + * Add keyboard accelerators for the Maps tools menu and improve the text casing. + * Add keyboard accelerators for the Maps layer menu and improve the text casing. + * Add keyboard accelerators for the GPS layer menu and improve text casing. + * Add keyboard accelerators for the GeoRef layer menu. + +2010-09-18 +Rob Norris : + * Fix compiler warning in file.c + * Fix compiler warnings in vikgobjectbuilder.c + * Fix compiler warnings in vikwindow.c + * Fix compiler warnings in vikmaptype.c + * Fix compiler warning in download.c + * Fix compiler warning in degrees_converters.c + * Fix compiler warnings in babel.c + * Prevent getting stuck in a near infinite loop when using Coord layer, UTM mode and zoomed out to see the whole world. + * Fix Track Draw by Velocity mode, so that individual track points are coloured (as was the intention). + +2010-09-18 +Guilhem Bonnefille : + * Add a message to explain why feature does nothing + * Fix previous commit + +2010-09-18 +Rob Norris : + * Prevent lock up in attempt to download maps along a track in UTM mode. + +2010-09-17 +Guilhem Bonnefille : + * Use the standard "Reload" verb + +2010-09-17 +Jocelyn Jaubert : + * Clarify text on map layer menu + +2010-09-17 +Rob Norris : + * Launchpad Bug #445374: Prevent crash when downloading maps along a track, with Terraserver maps when in Mercator mode. + +2010-09-15 +Jocelyn Jaubert : + * Simplify code on download action to do when map file is not present + * Fix bug where older file was removed when network not present + +2010-09-15 +Guilhem Bonnefille : + * Fix a minor missing include + +2010-09-14 +Guilhem Bonnefille : + * Comment VikSlippyMapSource + +2010-09-14 +Greg Troxel : + * Fix bashisms. + +2010-09-14 +Jon Burgess : + * Add explicit linking against libz and libm + +2010-09-14 +Guilhem Bonnefille : + * Fix: warning 'draw-mode' message does not display + +2010-09-13 +Guilhem Bonnefille : + * Fix incorrect limitation on source map id + +2010-09-11 +Guilhem Bonnefille : + * Add warning when requested GObject type is unknown + * [TEST] Add Terraserver viking file + +2010-09-11 +Rob Norris : + * Prevent viewport tool selection/edit of trackpoint or waypoint when the layer or sublayer is invisible. + +2010-09-07 +Guilhem Bonnefille : + * Releasing viking 0.9.95 + * Merge branch 'i18n-launchpad' + * Restore as many translations as possible + +2010-09-06 +Guilhem Bonnefille : + * Document previous translation updates + * Import Launchpad updates + +2010-09-05 +Benjamin Wagner : + * Invalid number of arguments in call to a_http_download_get_u + +2010-09-05 +Rob Norris : + * Prevent crash when cut of a GPS track/waypoint layer is attempted via the layers buttons. + * Prevent DEM layer colour indexing going negative and can crash on gradient view. + * Add some function short cut key definitions to control showing of the center mark and scale viewport features. + * Fix DEM layer to show default sea level. + +2010-08-24 +Rob Norris : + * [DOC] Minor update. + * [DOC] Replace Google with OSM capability in man pages. + +2010-08-17 +Rob Norris : + * When manually creating a track, automatically give it a default name. + * Fix track background thickness being able to set back to zero. + * [DOC] Tidy Up: First Pass + * [DOC] Add contributors from the Wiki(s) history. + +2010-08-16 +Sven Wegener : + * Fix internal tile locking + +2010-08-16 +Guilhem Bonnefille : + * Fix debug message + +2010-08-16 +Rob Norris : + * Fix top layer not drawn after made invisible and then back to being visible. + * Fix impaired (drawcentermark setting bodged) vik file if saved with the top layer visibility turned off. + +2010-08-12 +Guilhem Bonnefille : + * Fix syntax errors in help manual + +2010-07-18 +Jocelyn Jaubert : + * Rename supports_if_modified_since to supports_download_only_new as it also contains etag support + * Remove debug printf for etag + * Write and read etag values from a file that is stored in the same directory than the image + * Check if file is old enough for options check_file_server_time and use_etag + * Leave download() function as soon as we know that we don't want to check server for a more recent file + * Enable etag - need to use options from DownloadMapOptions + * Get and send etag values to server if file_options allows it + * Add use_etag in vikslippymapsource, and enable it on OSM mapnik maps only + * Add use_etag to struct DownloadMapOptions + * Add etag to struct DownloadFileOptions + * Move time_condition to scruct DownloadFileOptions - this is to add the etag value + * Rename struct DownloadOptions to DownloadMapOptions + * Fix map drag and drop to show the correct whole map + +2010-07-18 +Rob Norris : + * Fix "Go to UTM" dialog title. + * Fix first opening of a file which has spaces (or other interesting characters) via the recent files menu. + +2010-07-02 +Rob Norris : + * Better dialog name when searching for a waypoint. + * Improvements for test programs. + +2010-06-24 +Rob Norris : + * Fix unnamed_tracks / unnamed_waypoints misuse. + * Prevent "Gtk-WARNING **: GtkSpinButton: setting an adjustment with non-zero page size is deprecated" messages. + +2010-06-17 +Greg Troxel : + * Change max cache time to 1 week. + +2010-06-11 +Guilhem Bonnefille : + * Releasing viking 0.9.94 + +2010-06-08 +Guilhem Bonnefille : + * Fix POTFILES with new source file + * Merge branch 'i18n-launchpad' + * Document previous translation updates + * Import Launchpad updates + +2010-06-06 +Guilhem Bonnefille : + * Fix OMF category + +2010-06-06 +Rob Norris : + * Fix Filter->Simplify All Tracks default. + * Add knots as a speed unit option. + +2010-05-27 +Guilhem Bonnefille : + * [DOC] Fix Gnome's menu entry category for viking + +2010-05-26 +Guilhem Bonnefille : + * Minor improves on gitchangelog script + * [DOC] Update README and INSTALL files + * [DOC] Fix erroneous warning + +2010-05-25 +Rob Norris : + * Fix compiler warning. + +2010-05-25 +Guilhem Bonnefille : + * Merge branch 'help' + * [DOC] Correct tagging + * Merge commit 'viking-0.9.93' into help + * [DOC] Document Default maplayer directory property + * [DOC] Document tile's age property + * [DOC] Introduce properties related to units + +2010-05-20 +Guilhem Bonnefille : + * Add Robert Norris as active contributor + * Add Viking's contributors as copyright holders + +2010-05-19 +Rob Norris : + * Detect USB Garmin eTrex HCx Legend devices (and maybe others). + * On GPS data acquire, only create a layer if it contains something. + * Auto use of /dev/ttyUSB type device if available on Unix systems. + * Add ability to turn off Garmin GPS after transfer. + +2010-05-19 +Guilhem Bonnefille : + * Add a 'home' default location preference. + +2010-05-19 +Rob Norris : + * Add ability to changes preferences outside of the preferences.c file. + +2010-05-19 +Mathieu Albinet : + * Fix #2977752 : win-gtk: osm tiles don't show up + +2010-05-19 +Robert Norris : + * Fix Track -> View Google Directions URL + +2010-05-18 +Robert Norris : + * NLS Maps API: Historic map of Great Britain + +2010-05-18 +Guilhem Bonnefille : + * Fix function's return value + * Fix compilation warnings + +2010-05-02 +Robert Norris : + * Better Preferences Dialog Title + +2010-05-02 +Simon Munton : + * Fix #2988574: Can't save files opened via recent file menu + +2010-05-02 +Rob Norris : + * Change GUI related command line parameter for Waypoint symbol size into run time preference. + +2010-04-29 +Robert Norris : + * Support All Zoom Levels in Zoom Menu + +2010-04-27 +Robert Norris : + * More Menu Improvements + * More Menu Improvements + * Remove unecessary '\' from the View Menu + +2010-04-27 +Mark Coulter : + * Fix #2991657: Terraserver downloads fail + +2010-04-21 +Mark Coulter : + * Fix geocaching + +2010-04-11 +Guilhem Bonnefille : + * Releasing viking 0.9.93 + * Merge branch 'i18n-launchpad' + * Fix old po/Changelog entry + * Document previous translation updates + * Fix the way to extract Translators + * Import Launchpad updates + * Fix: set a default filename while exporting + +2010-04-03 +Guilhem Bonnefille : + * Allow overriding map source + +2010-04-02 +Guilhem Bonnefille : + * [DOC] Fix: Viking's sources are hosted by Git now + +2010-03-27 +Robert Norris : + * Clean git status + +2010-03-24 +Guilhem Bonnefille : + * Merge commit 'viking-0.9.92' into help + * Documenting extension files + * Document external tools + +2010-03-23 +Rob Norris : + * Further variable type corrections. + * Make GPS layer cut/copy available from popup menu. + * Minor Improvements. + * Fix GPS layer copy. + * Fix Track/Waypoint Layer Paste on 64bit systems. + +2010-03-21 +Guilhem Bonnefille : + * Fix FILES section of manpage. + +2010-03-20 +Guilhem Bonnefille : + * Document new files in viking's manpage + +2010-03-18 +Rob Norris : + * Fix: First Track not Black in Draw All Tracks Black Mode. + +2010-03-15 +Jocelyn Jaubert : + * Add a debug printf for map display + * Increase possible smaller zoom + * Add negative scales so that we can have bigger zoom on maps + * Allow images from bigger and smaller zoom to be selected if current zoom has no image Merge logic for smaller zoom with current zoom + +2010-03-15 +Guilhem Bonnefille : + * Rleasing viking 0.9.92 + * Merge branch 'i18n-launchpad' + * Document previous import + * Import translations from launchpad + +2010-03-13 +Guilhem Bonnefille : + * Merge commit 'viking-0.9.91' into help + * Merge remote branch 'rnorris/unitPref' + +2010-03-13 +Gerhard Killesreiter : + * Fix: Correctly rotate thumbnail images + +2010-03-10 +Guilhem Bonnefille : + * Memorize previously selected go-to service + +2010-03-09 +Guilhem Bonnefille : + * Fix #2958601: Support for non ascii characters in "Go-to" search + +2010-03-07 +Rob Norris : + * Minor tidy up. + * Better scale when zoomed close in and in miles distance mode. + * Add and use preference for height units. + * Add and use preference for speed units. + * Add and use preference for distance units. + +2010-02-16 +Guilhem Bonnefille : + * Use a preference to set the tiles age + +2010-02-15 +Guilhem Bonnefille : + * Fix error handling in go-to feature + +2010-02-14 +Jocelyn Jaubert : + * New preference for default maplayer cache + +2010-02-08 +David Rasmus Piegdon : + * Improve DEM-Layer + +2010-02-08 +Guilhem Bonnefille : + * Remove OpenAerial + +2010-02-06 +Guilhem Bonnefille : + * Realising viking 0.9.91 + +2010-02-05 +Guilhem Bonnefille : + * Update POTFILES + * Merge branch 'master' into i18n-launchpad + * Declare new languages + * Document previous import + * Import translation from launchpad + +2010-02-05 +Mike Ryan : + * Fix #2946287: open a recent file + +2010-02-03 +Mike Ryan : + * cache the scaled pixbuf in the vikgeoreflayer struct if the newly-scaled width and height are the same, do not waste CPU rescaling the pixbuf + * scale the georef layer based on current viewport rescales the image for every repaint, even if the mpp hasn't changed + * fix some confusing indentation and bracing + +2010-02-02 +Robert Norris : + * Fix #2881916: rename a track with c&p + +2010-02-01 +Jocelyn Jaubert : + * Add missing ) in string + +2010-02-01 +Mike Ryan : + * add GIO dependency and header for GFile + +2010-02-01 +Guilhem Bonnefille : + * Portability: use GLib function g_utime if possible + +2010-01-24 +Sven Wegener : + * Update mtime of up-to-date tiles + * Allow reuse of curl connection objects + +2010-01-24 +Guilhem Bonnefille : + * Use combobox to select map type + +2010-01-14 +Guilhem Bonnefille : + * Add compatibility to previous GPS device setting + * Fix #2766373: Use a string as device path + +2010-01-13 +Guilhem Bonnefille : + * Merge branch 'new-maps' + +2010-01-12 +Guilhem Bonnefille : + * Recode DownloadOptions as properties to VikSlippyMapSource + +2010-01-11 +Sven Wegener : + * Change default map type to OSM + * Fix "Moving Map Method" cannot be disabled + +2010-01-11 +Guilhem Bonnefille : + * Fix #2880741: replace gps_open with gps_open_r + * Fix #2921899: uses conditional macro to support two versions of libgps + +2010-01-11 +Bernd Zeimetz : + * Make Viking compatible with libgps >= 2.90 + +2010-01-02 +Guilhem Bonnefille : + * Include configuration examples in distribution + * Add configuration file for go-to search engines + +2010-01-01 +Guilhem Bonnefille : + * Refactor goto feature to allow multiple search engines + * Add Name finder search engine + * Add Nominatim search engine + * Add XPATH related attribute support + +2009-12-17 +Guilhem Bonnefille : + * Add a unit test for VikGotoXmlTool + * Add support for XML attribute based lat/lon values + * Refactoring: move download code to vikgototool + * Fix warnings + +2009-12-16 +Guilhem Bonnefille : + * Use a configure option to set the age of tiles before checking them online + +2009-12-14 +Guilhem Bonnefille : + * Replace "search" substring by "goto" + * Fix URL formatting issue + * Remove unused code + * Fix URL formatting issue + * Use only the first result + * Fix error messages + +2009-12-09 +Guilhem Bonnefille : + * Fix typo + * Remove old code + * Create the geonames search as an VikXmlSearchTool + +2009-12-08 +Guilhem Bonnefille : + * Parse XML for XPath like path + * Add copyright + +2009-12-06 +Guilhem Bonnefille : + * Add generic XML earch code + * Move common last search code to viksearch.c + * Use a more expressive icon for "Go to" features + +2009-12-03 +Guilhem Bonnefille : + * Fix typo + * Move GoogleSearch to new framework + +2009-11-26 +Guilhem Bonnefille : + * GObjectify search dialog + +2009-11-05 +Guilhem Bonnefille : + * Fix #2801874: keep second part of a splitted track visible + * Unecessary code + * Fix #2838556: emit warning when gpsbabel is not found in PATH + +2009-11-05 +Stanislav Brabec : + * Use motion hints to make map motion more responsive in slow environment. + +2009-10-24 +Guilhem Bonnefille : + * Tiles must be older than a specified age before checking server + * Use an internal thread concurrency model + * Try to download newer tiles when autodownload is set and server supports such check + * The "Download new" option must be available via download tool + * Add support for recently used files + +2009-10-20 +Guilhem Bonnefille : + * Distribute old version of ChangeLog + * Add HACKING info + +2009-10-19 +Gleb Smirnoff : + * suppress gtk warning + +2009-10-18 +Gleb Smirnoff : + * remove declaration of non-existent function + +2009-10-17 +Gleb Smirnoff : + * keeping OSM password safe + +2009-10-12 +Guilhem Bonnefille : + * Declare new translations + +2009-10-02 +Guilhem Bonnefille : + * Mark translatable strings + +2009-09-30 +Bernd Zeimetz : + * Fix bashism in test script. + +2009-09-30 +David Rasmus Piegdon : + * Add DEM Gradient + +2009-09-29 +Guilhem Bonnefille : + * Merge branch 'fix-osm-api-0.6' + * Update translatable strings + +2009-09-29 +Gleb Smirnoff : + * finish OSM 0.6 API support + +2009-09-29 +Guilhem Bonnefille : + * Add configure option to track deprecated feature + +2009-09-27 +Guilhem Bonnefille : + * Refactoring: use a GObject model to implement MapSource hierarchy tree + * Refactoring: keep a single definition for keys of global preferences + * Add info for GeoRef Map's parameters + * Import User Manual from wiki + * Add DOAP file + * Move src/.gitignore to main .gitignore + * Add menu item for help contents + * Setup build rules for help system + * Replace autogen.sh + +2009-09-22 +Stanislav Brabec : + * Get rid deprecated GtkTooltips API. + +2009-09-22 +Stanislav Brabec : + * Added tooltips for layer panel buttons. + +2009-09-21 +Guilhem Bonnefille : + * Merge commit 'viking-0.9.9' into gobjectify-map-type + +2009-09-20 +Jocelyn Jaubert : + * ftp response code for success is 226 + * Add option to download only maps that are more recent on server + * Remove defines used for preferences + * Move defines for preference to globals.h + +2009-09-19 +Guilhem Bonnefille : + * Merge branch 'interpolation' + +2009-09-18 +Guilhem Bonnefille : + * Refactoring: merge a_check_html_file and a_check_kml_file + +2009-09-18 +Harry G McGavran Jr : + * Fix magic scissors + +2009-09-09 +Guilhem Bonnefille : + * Releasing viking 0.9.9 + * Add maintainer script to help releasing process + * Document previous import + * Import translations from launchpad + +2009-08-28 +Jocelyn Jaubert : + * Change interpolation to a faster one + * Use less precise images when wanted image is not present + +2009-08-20 +Guilhem Bonnefille : + * Update translations from launchpad + +2009-08-18 +Guilhem Bonnefille : + * Auto-Generation of ChangeLog file + * Add a script to compute po/ChangeLog fragment + * Update administrative file + * Import current Launchpad translations + +2009-08-18 +Tal : + * Fix #2163652: GPX file with byte order mark not parsed + +2009-08-18 +Guilhem Bonnefille : + * Add src/mapcache.c as source file containing translatable strings + +2009-07-28 +Guilhem Bonnefille : + * Fix #2766609: Don't use gpsd_units() + +2009-07-28 +Jocelyn Jaubert : + * Add missing (VikLayerFuncPostRead) in structs VikLayerInterface + +2009-07-26 +Herm : + * Fix #2812856: Change SRTM URL + +2009-07-26 +Guilhem Bonnefille : + * Fix #2818818: unset langage preset while opening external Google + * Fix copyright in --version output + +2009-07-25 +Herm : + * Fix SRTM Server change + +2009-07-24 +Guilhem Bonnefille : + * Add configuration file for map sources + * Merge branch 'gobjectify-map-type' into gobject-builder + * Manage memory of private fields + * Fill in the interface + * Move label + +2009-07-22 +Jocelyn Jaubert : + * Fix memory leaks found with cppcheck + +2009-07-21 +Jocelyn Jaubert : + * Fix warning in call to MD5Update() in function md5_hash() + +2009-07-19 +Guilhem Bonnefille : + * Add configuration file for external tools + * Remove dead code + * Create the GObject builder + +2009-07-19 +Jocelyn Jaubert : + * Add .gitignore + +2009-07-19 +Guilhem Bonnefille : + * Value of property is the content of the property XML element + +2009-07-18 +Guilhem Bonnefille : + * Expose VikSlippyMapSource's private fields as properties + * Expose TerraserverMapSource's type as property + * Expose VikMapSourceDefault's private fields as properties + * GObjectify VikViewportDrawMode enum + * Store test example for GValue + * Use GtkBuilder to convert string to expected value's GType + +2009-07-16 +Guilhem Bonnefille : + * Proof of concept + +2009-07-15 +Guilhem Bonnefille : + * Style fix + * Merge 'viking-0.9.8' + +2009-07-14 +Guilhem Bonnefille : + * Merge 'viking-0.9.7' + * Set VikMapSourceDefault properties + * Remove dependencies to gob2 + * Replace terraserver-map-type.gob by raw implementation + * Merge vikslippymapsourceabstract and slippy-map-type + * Finish to remove Google + * Remove Google's map tiles + * Remove old Google stuff + +2009-06-19 +Guilhem Bonnefille : + * Complete 376c917751b680fd238cd85511bab4ed26727c0f + * Document previous patches from Jonas Norling + +2009-06-19 +Jonas Norling : + * Don't crash when jobs are cancelled via the background jobs dialog. + * Join common code in zoom in and zoom out cases. + * Filter out irrelevant modifiers. + +2009-06-02 +Guilhem Bonnefille : + * Upgrade OSM-traces support to 0.6 API + +2009-05-22 +Guilhem Bonnefille : + * Document previous patches + * Fix previous patch + +2009-05-22 +Tal B : + * use default values VIK_DEFAULT_DOP, VIK_DEFAULT_ALTITUDE + * remove _VikTrackpoint.extended field. + * Document when field in _VikTrackpoint are considered unavailable. + * gpx_write_trackpoint(): + * vdop, hdop, pdop, nsats and fix_mode values were not shown + * hdop,vdop,pdop,nsat + +2009-05-22 +Guilhem Bonnefille : + * Remove unused (and buggy) feature + +2009-05-22 +Jocelyn Jaubert : + * Fix #570956: change saved_width to 1 + +2009-05-09 +Guilhem Bonnefille : + * Document previous merge + * Merge improvement of map cache made by Jocelyn Jaubert + +2009-05-09 +Tal : + * Replace g_strtod by g_ascii_strtod + +2009-05-06 +Jocelyn Jaubert : + * Add a viking parameter for mapcache memory size + * Move VIK_CONFIG_MAPCACHE_SIZE to a variable + * Add menu option to flush mapcache, and reduce viking memory footprint + * Add a_mapcache_flush() to completely flush the mapcache + +2009-05-06 +Guilhem Bonnefille : + * Add a TODO + * Document previous merge + * Merge 'thread-pool' features from Jocelyn Jaubert + +2009-05-06 +Jocelyn Jaubert : + * Stop all curl downloads on quit + +2009-04-25 +Jocelyn Jaubert : + * Wait for all threads to finish before exiting viking + * Replace g_thread by g_thread_pool + +2009-04-17 +Lixus Zoran : + * Example file: OpenStreetMap + +2009-04-17 +Guilhem Bonnefille : + * Avoid crash + +2009-04-15 +Guilhem Bonnefille : + * Fix build problem + +2009-04-13 +Jocelyn Jaubert : + * Show path used for map directory in options even when using default one + +2009-04-13 +Guilhem Bonnefille : + * Change dependencies checking + +2009-04-04 +Jocelyn Jaubert : + * Add missing include glib/gprintf.h + +2009-04-04 +Guilhem Bonnefille : + * Document previous patch + +2009-04-04 +Jocelyn Jaubert : + * Fix bug #2481237: Maps directory file chooser should look for directory + +2009-04-04 +Guilhem Bonnefille : + * Document previous patch + +2009-04-04 +Jocelyn Jaubert : + * libcurl update: replace deprecated CURLOPT_FILE by CURLOPT_WRITEDATA + +2009-04-04 +Guilhem Bonnefille : + * Documenting previous patch + +2009-04-04 +Jocelyn Jaubert : + * Include full libcurl version in user agent + +2009-03-27 +Guilhem Bonnefille : + * Add vik prefix + * Rename slippy-map-type-abstract as slippymapsourceabstract + * Replace old-vik-map-type by vikmaptype + * Replace vik-map-type-default by vikmapsourcedefault + * Replace vik-map-type by vikmapsource + * Document new hierarchie + * Add compatibility facilities + * Declare built sources + * Insert a level of abstraction in map type hierarchie + * Remove Google + * Update design + +2009-03-27 +(null) <(null)>: + * Add UML design + * Typo + * Inherit GoogleMapType from SlippyMapTypeAbstract + * Insert slippy map type + * Add Google Kh map type + * QA: cleanning unused stuff + * Cleanning code + * Finalize Terraserver migration + * Extract BlueMarble and OpenAerial form OSM module + * Make osm-map-type running + * Make google-map-type running + * Start using GoogleMapType GObject + * Replace VikMapsLayer_MapType by VikMapType + * Correct google gobject + * Declare built sources + * Add Terraserver + * Add OSM + * Create Google map type + * Initial GoogleMaps implementation based on gob2 + * Allow compilation + * Initial VikMapType class + * QA: un-needed external reference + * Portability + * QA: homogeneous way of doing stuff + +2009-02-13 +Guilhem Bonnefille : + * Release 0.9.8 + * Update translations for 0.9.8 + +2009-02-02 +Guilhem Bonnefille : + * Release 0.9.8 + +2009-01-31 +Guilhem Bonnefille : + * Finish to remove Google + +2009-01-22 +Guilhem Bonnefille : + * Document previous patch + +2009-01-22 +Mathieu Albinet : + * Fix loading a world file + +2009-01-22 +Guilhem Bonnefille : + * Enforce memory free + +2009-01-22 +Robert Norris : + * Fix some memory leaks. + +2009-01-18 +Guilhem Bonnefille : + * Document previous commits + * Allow to select between Google and Geonames for searching method + * Add conditional compilation for geonames + +2009-01-18 +Hein Ragas : + * Documenting previous patches from Hein Ragas + * Geonames et Wikipedia search + * Better GeoNames.org implementation + * a patch to use GeoNames.org instead of Google for the 'Go to'-functionality. + +2009-01-15 +Mathieu Albinet : + * Windows port + +2008-12-20 +Guilhem Bonnefille : + * Remove Google's map-tiles + +2008-12-18 +Guilhem Bonnefille : + * Remove old Google stuff + * Add configuration options for OpenAerial and BlueMarble + +2008-12-13 +Guilhem Bonnefille : + * News feature: external tools + * QA: improve portability + +2008-12-06 +Quy Tonthat : + * Clicking on "vivisble" tick of a layer no longer makes the layer selected. + +2008-12-03 +Hein Ragas : + * GPX export: sort track by time. (By Hein Ragas). + +2008-11-21 +Quy Tonthat : + * Fix bugs that caused magic scissors not working. + * Merging track: Merge with more than one tracks at a time. + +2008-11-18 +Quy Tonthat : + * Merging track. Few safegards, enhance and bug fixes. + +2008-11-18 +Hein Ragas : + * Merging track by name. As submitted by Hein Ragas + +2008-11-13 +Quy Tonthat : + * No longer provide support for google satellite maps. + +2008-10-31 +Quy Tonthat : + * Change Title of Waypoint Properties dialog to "Waypoint Properties" + +2008-10-30 +Quy Tonthat : + * Change how waypoint names are displayed. + * Make sure we won't pick up unwanted _pixmap.h files + * Larger waypoint symbols + +2008-10-28 +Quy Tonthat : + * Waypoint icons are now compatible with GPS. + +2008-10-22 +Quy Tonthat : + * Fix compatibility problem for windows. + +2008-10-20 +Quy Tonthat : + * New server for OSM cycle map + +2008-10-14 +Evan Battaglia : + * minor fix in gcget. + * Update gcget to adapt to changes at geocaching.com + +2008-10-13 +Quy Tonthat : + * Make warning messages a bit more informative. + * g_timeout_add_seconds() did not exist until glib 2.14 + * gps realtime tracking: retry on connection to gpsd. + +2008-10-12 +Jon Burgess : + * fix curl error buffer usage + * fix missing status return in spawn_command_line_async() + * fix implicit declaration of maps_layer_default_dir() + +2008-10-12 +Guilhem Bonnefille : + * Typo + * Release 0.9.7 + +2008-10-12 +Robert Norris : + * Fix some more compiler warnings + +2008-10-12 +Guilhem Bonnefille : + * Rename test files + +2008-10-12 +Jon Burgess : + * Properties of some tracks show as NaN + +2008-10-10 +Quy Tonthat : + * Realtime tracking: Add new moving map method. + * gps realtime tracking: fixed segfault. + +2008-09-30 +Stanislav Brabec : + * Fix icon target dir + * Improve viking.desktop + * Fix missing files in po/POTFILES.in + * Rename icon: viking_icon.png -> viking.png + +2008-09-30 +Guilhem Bonnefille : + * Note TODO + * Document Fix #1947260 + +2008-09-21 +Quy Tonthat : + * Change "Zoom To" short cut to avoid conflict with "Zoom Tool". + +2008-09-16 +Guilhem Bonnefille : + * Typos + * Update translations + * Update translations from launchpad + +2008-09-06 +Quy Tonthat : + * Fix parallel build (make -j8) on multi-processor machines. Based on a patch from sbrabec. + +2008-09-03 +Guilhem Bonnefille : + * QA: cleanning unused stuff + * QA: un-needed external reference + * Portability + * QA: homogeneous way of doing stuff + +2008-09-01 +Guilhem Bonnefille : + * Fix #1947260: correct a corrupted escape + +2008-09-01 +Quy Tonthat : + * Google search adapting changes from Google. + +2008-08-31 +Quy Tonthat : + * Fix crashes when creating new layers. + +2008-08-30 +Guilhem Bonnefille : + * Typo: removing trailing double-colon on ChangeLog + * Removing critical message + * QA: removing specific GtkCellRenderer + * Documenting previous patch + I18N updates + +2008-08-30 +Armin Moser : + * added a menu entry to extend an existing track using magic scissors + +2008-08-30 +Guilhem Bonnefille : + * Documenting previous patch + +2008-08-30 +Armin Moser : + * osm cycle layer support + +2008-08-30 +Guilhem Bonnefille : + * Fix typo + * Document previous patch and fix typo + +2008-08-30 +anonymous <>: + * Patch #2009666: OpenAerialMap + +2008-08-30 +Guilhem Bonnefille : + * QA: avoid segfault + * Replace GTK_STOCK_GO_FORWARD with GTK_STOCK_JUMP_TO + * Document previous fix and add data to reproduce problem + * QA + * Synchronise vikwindow.c and menu.xml around mode handling + +2008-08-30 +Robert Norris : + * Fix 1952523 + +2008-08-29 +Guilhem Bonnefille : + * Relocate current data field + * Textual properties go in a dedicated tab + +2008-08-25 +Guilhem Bonnefille : + * Typo + * QA: use standard function instead of viking specific + * Add preferences to select how degrees are displayed + +2008-08-24 +Guilhem Bonnefille : + * Update layer after modifying properties + * QA: Unused code + * Add documentation and test file for previous patch + +2008-08-24 +Mathieu Albinet : + * Color picker button for the Coordlayer properties dialog + +2008-08-23 +Guilhem Bonnefille : + * Acting (Cut, Copy, Paste) when nothing selected is not critical + * QA: more generic way of computing size of an array + * Add tooltips to some actions + * Documenting previous patch + +2008-08-23 +Mathieu Albinet : + * Layers panel UI improvements + +2008-08-22 +Guilhem Bonnefille : + * Homogeneous icons management. + * Replace some g_warning by g_debug + * Add email support in about dialog + * Replace specific about dialog by GtkAboutDialog + * Add dependencies between built sources and Makefile.am + +2008-08-17 +Guilhem Bonnefille : + * Use the new widget to hide OSM's password + * Add a password entry widget + * Create preferences for OSM traces module + +2008-08-16 +Guilhem Bonnefille : + * Ensure that confirmation dialog is over file selector + +2008-08-13 +Quy Tonthat : + * Fixed Google map download problem. + +2008-07-31 +Guilhem Bonnefille : + * Releasing 0.9.6 + * Remove unecessary directive + +2008-07-28 +Quy Tonthat : + * Fix gcget command line to accomodate negative coords. + +2008-07-22 +Quy Tonthat : + * Google maps no longer worked due to changes by Google. Problems now fixed. + +2008-07-22 +Guilhem Bonnefille : + * Releasing 0.9.5 + * Delete duplicates + * Add directives to clean + * Automatic update + * Update AUTHORS list + * Fix suggested by Jocelyn + * Document recent activities + * Automatic update + * Update from Launchpad + +2008-07-19 +Guilhem Bonnefille : + * Automatically disable man pages generation + +2008-07-18 +Guilhem Bonnefille : + * Convert and install man pages + +2008-07-15 +Guilhem Bonnefille : + * Better integration of .desktop file + * Comment + +2008-07-15 +Quy Tonthat : + * Add viking.desktop file + +2008-07-14 +Guilhem Bonnefille : + * Documenting recent patch + * QA: Remove some more warnings + +2008-07-14 +Robert Norris : + * Compiler warning fixes + +2008-07-14 +Guilhem Bonnefille : + * Package new languages + * Translation update (automatic) + +2008-07-09 +Guilhem Bonnefille : + * Update translations + +2008-07-01 +Quy Tonthat : + * Track properties: split track at marker. + +2008-06-29 +Quy Tonthat : + * Track Properties: Keep markers of the graphs in sync with each other. + +2008-06-29 +Mathieu Albinet : + * Windows port: fallback temporary file + * Windows port: typo in util.c + +2008-06-24 +Quy Tonthat : + * Track graph marker now works again. + +2008-06-21 +Quy Tonthat : + * Fix google version number. + +2008-06-15 +Quy Tonthat : + * Mark release 0.9.4.20080614 in ChangeLog + +2008-06-14 +Mathieu Albinet : + * Windows port: use as many directories as POSIX version + * Windows: home dir define via GLib + * Recursive mkdir: use dedicated GLib function + * strtod -> g_strtod + * Windows port: add serial port + * Windows port: calling gpsbabel from windows + +2008-06-09 +Mathieu Albinet : + * Windows port: redefine LOCALEDIR + +2008-06-05 +Quy Tonthat : + * Do not convert waypoint names to uppercase. Make them case insensitive. + +2008-06-03 +Mathieu Albinet : + * Portability: remove "/dev/null" reference + +2008-05-09 +Jon Burgess : + * Fix compilation issue + +2008-05-08 +Mathieu Albinet : + * Portability: use of g_ascii_dtostr to format google url + +2008-05-08 +Guilhem Bonnefille : + * Improve error handling + I18N + +2008-05-08 +Mathieu Albinet : + * Portability: replace mmap functions by g_mapped_file* + * Windows port: rename interface to source_interface + +2008-05-08 +Guilhem Bonnefille : + * Update man page + * Storing manpages + +2008-05-02 +Guilhem Bonnefille : + * Moving manpage upstream + * Moving manpage upstream + +2008-05-01 +Guilhem Bonnefille : + * Add file content checking process + * Use a more generic error message + * Improve error handling + +2008-05-01 +Mathieu Albinet : + * Remove dependency to wget + +2008-05-01 +Guilhem Bonnefille : + * Adding --debug and --verbose command line option + +2008-04-27 +Guilhem Bonnefille : + * Portability: conditional sys/wait.h + * Cosmetic change + * Cosmetic change + +2008-04-27 +Mathieu Albinet : + * Fix pipe leaks + * Portability: provide our own curl WRITE function + +2008-04-22 +Robert Norris : + * Fix for implicit declaration of function 'g_fopen' + * Fix: Initalize tv_usec field + +2008-04-21 +Guilhem Bonnefille : + * Read/Write ISO date in GLib's way + * Add a GPX non regression utility + +2008-04-19 +Tim Scofield : + * Fix: typo + +2008-04-15 +Guilhem Bonnefille : + * M_PI already defined + +2008-04-12 +Mathieu Albinet : + * Portability: remove dirname needs with g_mkdir_with_parents + * Portability: replace deprecated bzero function by memset + * Portability: use Glib function related to stdio.h + * Portability: replace mkdir by g_mkdir + * Portability: reduce unistd.h dependency + +2008-04-12 +Evan Battaglia : + * add copyright in dem files + * Add chinese translation from Zhang Jun + +2008-04-01 +Guilhem Bonnefille : + * Revert "Declare the need of C99 compliant compiler" + +2008-03-30 +Mathieu Albinet : + * Replace GtkFileSelection by GtkFileChooser + +2008-03-25 +Guilhem Bonnefille : + * Declare the need of C99 compliant compiler + * Update authors list + +2008-03-24 +Guilhem Bonnefille : + * Make all icons in a single .o + +2008-03-16 +Guilhem Bonnefille : + * Store cursor info directly into tool struct + +2008-03-15 +Guilhem Bonnefille : + * Pan tool (as default) + * Extract pan related codes + * Fix: [ 1839948 ] Maximize/Restore changes current cursor + * Comment typo + +2008-02-27 +Guilhem Bonnefille : + * Typo + * Improve form to simplify automatic extractions + +2008-02-25 +Guilhem Bonnefille : + * Releasing 0.9.4 + * Add missing file + * Remove debug trace + * Rename func a_array_to_glist to str_array_to_glist (due to current interface) + +2008-02-25 +Robert Norris : + * Fix some compiler warnings (SF#1888407) + * Fix 1881475 autogen can generate broken configure file + +2008-02-25 +Guilhem Bonnefille : + * Documenting previous commit + +2008-02-24 +Guilhem Bonnefille : + * Correct OSM URL + +2008-02-21 +Quy Tonthat : + * viking.spec: Correct license, required packages and local. + +2008-02-20 +Guilhem Bonnefille : + * Update translations + * State of LaunchPad contributions + * Update french translation + * Typo + * Update french translation + * Typo + * Update French translation + * Update from fresh .pot file + * Update French translation + * Correct famous sentence + * Remove trailing '\n' in g_message calls + +2008-02-16 +Guilhem Bonnefille : + * Update french translation + * Marking translatable string in main.c + * Documenting Jocelyn's patches + * Patch fr translation + * I18N improvement + +2008-01-25 +Alex Foobarian : + * Sort out the viewport header file a bit for better readability and in preparation for a cairo branch. + +2008-01-22 +Alex Foobarian : + * fix a crash bug in the merge-by-time function + +2008-01-18 +Quy Tonthat : + * Added mutex to protect map pixbuf cache from being corrupted. + +2008-01-17 +Quy Tonthat : + * Fix a crash bug in mapcache reported by Jocelyn + +2008-01-15 +Christoph Eckert : + * bugfix (thanks Christoph Eckert) + +2008-01-12 +Guilhem Bonnefille : + * Fix: remove unused + * Fix: remove warnings + +2008-01-04 +Alex Foobarian : + * Adjusted v-t drawing + +2007-12-27 +Evan Battaglia : + * Bugfix for preferences + * DEBUG option for gcget. + * gcget-perl + * fix remove duplicates gpsbabel filter. full screen mode. + * one bugfix for gcget. there may be another bug out there. + +2007-12-27 +Oddgeir Kvien : + * Add GpxWritingOptions to control GPX file writing + * Add default values to ele and time fields (due to OSM) + +2007-12-23 +Evan Battaglia : + * Don't scare off users from trying geocache support. + +2007-12-22 +Guilhem Bonnefille : + * Update french plural form + +2007-12-22 +Evan Battaglia : + * preferences / geocaching update + +2007-12-21 +Jocelyn Jaubert : + * Update French translation + +2007-12-21 +Christoph Eckert : + * Update source for OSM/Osmarender tiles + +2007-12-21 +Evan Battaglia : + * Preferences: include the file. oops. + * Preferences!!!! Make way for the Geocachers. + +2007-12-19 +Quy Tonthat : + * Revert a previous change that disabled realtime tracking if libgps does not exist. + +2007-12-17 +Jocelyn Jaubert : + * Use specific gettext call for plural form + +2007-12-17 +Guilhem Bonnefille : + * Fix contribution dates + +2007-12-17 +Evan Battaglia : + * "Highest unused" (not really) waypoint number as deafult name for waypoint. + * Sort waypoints in GPX output + +2007-12-15 +Guilhem Bonnefille : + * Fix: ensure config.h is included conditionnaly + +2007-12-15 +Jocelyn Jaubert : + * Update french translation + * Mark many strings translatable + +2007-12-15 +Guilhem Bonnefille : + * Fix: if libgps is missing, Realtime GPS Tracking is disabled + * Fix compilation under HURD (missing MAXPATHLEN macro) + +2007-12-15 +Jocelyn Jaubert : + * Make menu entries translatable + +2007-12-13 +Guilhem Bonnefille : + * First french translation (incomplete) + * Marking translatable strings. + +2007-12-12 +Guilhem Bonnefille : + * Fix bug: "config.status: error: cannot find input file: Makefile.in" + * Fix warning: underquoted definition of AM_WITH_EXPAT + +2007-12-10 +Quy Tonthat : + * Now that autogen.sh runs configure, "make full" should not. + * Fix autogen.sh to remove the assumption that version 1.9 of automake is available on all systems. + +2007-12-08 +Evan Battaglia : + * disable printing & let viking compile for gtk < 2.10.0 + * Google terrain maps. + * BlueMarble tile + +2007-12-01 +Guilhem Bonnefille : + * Renaming AC_PROG_INTLTOOL (deprecated) with IT_PROG_INTLTOOL + +2007-11-27 +Guilhem Bonnefille : + * Use a list of possible browsers. + * Forgot incremental rebuild + +2007-11-26 +Guilhem Bonnefille : + * I18N: Adding minimal stuff + * I18N: Using standard autogen.sh + +2007-11-19 +Quy Tonthat : + * Fix a bug that can potentially cause segfault. + * Improve track graphs. Some tracks looked too flat. + +2007-11-13 +Evan Battaglia : + * add another missing file + * adding forgotten uibulder code... + +2007-11-10 +Evan Battaglia : + * gctrackbyarc script + * Filters filters oh my + +2007-11-07 +Quy Tonthat : + * New feature: map printing. + +2007-10-31 +Quy Tonthat : + * Fix bug that caused Old Google maps not being disabled by default. + +2007-10-24 +Quy Tonthat : + * Fix "incompatible pointer type" warnings. + * Make elev graph show better graph for low altitude tracks. + * Fix a bug that caused crashes when displaying elev graph for some track. + +2007-10-22 +Bernd Zeimetz : + * Fixing the implicit declaration completely, thanks to dann frazier Debian #447662 + * Fixing another implicit declaration. + * Missing declaration. Thanks to Bernd Zeimetz + +2007-10-21 +Guilhem Bonnefille : + * Releasing 0.9.3 + * Add "version" option + +2007-10-20 +Evan Battaglia : + * Fixing minor typo which caused crashes for me recently, unknown why it didn't crash before + +2007-10-20 +Quy Tonthat : + * Added track name to title of properties dialog. + * Diasable buttons on Track Properties Dialog when not needed. + * Draw position marker on track elev/speed graphs at mouse click + * Track Properties Dialog no longer blocks interaction of the main window. + +2007-10-17 +Evan Battaglia : + * Minor bugfix (one_zone is 0 for non-UTM projections) + +2007-10-16 +Evan Battaglia : + * Fix Google parsing. Should probably change default number to "2.61" too. + +2007-10-15 +Quy Tonthat : + * Cosmetic changes and cleanup + * Interpolating DEM data. + * Interpolating DEM data. + * Add more room to the top of altitude-distance graph. + +2007-10-15 +Evan Battaglia : + * fix plotting of DEM data on elevation graph + +2007-10-12 +Evan Battaglia : + * Fix tool keypresses to work only when Viewport has focus. + +2007-10-12 +Quy Tonthat : + * Make use of DEM elevation data and GPS speed data for track graphs. + +2007-10-12 +Evan Battaglia : + * keypress framework for tools, Esc & Backspace + +2007-10-11 +Guilhem Bonnefille : + * Upgrading to API 0.5 of OSM + +2007-10-11 +Quy Tonthat : + * Added new fields to trackpoints for data from GPS in realtime mode. + +2007-10-10 +Quy Tonthat : + * Make Realtime Tracking a feature that can be disabled at configure time. + +2007-10-10 +Evan Battaglia : + * Use $BROWSER environment variable (for viewing geocache pages) + +2007-10-09 +Guilhem Bonnefille : + * libgps is no more mandatory + +2007-10-09 +Evan Battaglia : + * Implement g_hash_table_remove_all in file.c too (for early glib versions) + * Preview adding a trackpoint by drawing a line when moving mouse + +2007-10-09 +Guilhem Bonnefille : + * Relax dependencies about glib + +2007-10-09 +Evan Battaglia : + * Color current track red with dashed lines. (Better feedback) + * Ctrl-shift-scroll to zoom like google, scroll to zoom w/o changing center + +2007-10-09 +Quy Tonthat : + * Fix a crash bug caused by operation on variable inside a macro. + +2007-10-08 +Quy Tonthat : + * Fix compiling breakage caused by missing icon file from the list. + +2007-10-07 +Evan Battaglia : + * Experimental "begin track" tool + * Extend track + * Undo Magic Scissors by right clicking. + * Remove debug line from last commit + * Cursors! + * Scroll zoom keeps cursor over same spot on map + +2007-10-07 +Quy Tonthat : + * Track Properties: now displays track distance/time instead of "Selected Time". + +2007-10-06 +Quy Tonthat : + * The "Selected Time" on track properties dialog is now correct. + * Correctly calculate position when click on speed-time graph. + * Pop a message when failed to connect to gpsd. + * Fix bugs that caused odd display of date/time on track properties dialog. + +2007-10-05 +Quy Tonthat : + * Be more selective in collecting realtime trackpoints. + * Fix a segfault caused by (mistakenly) adding a new layer to gps layer. + +2007-10-04 +Quy Tonthat : + * Improvements for GPS layer's "Realtime tracking". + +2007-10-03 +Evan Battaglia : + * Removing GPSDLayer (functionality now in gpslayer) + +2007-10-02 +Quy Tonthat : + * Cleanup and cosmetic changes. + * Fix half-drawn problem for gps layer + * Add realtime tracking to GPS layer. + +2007-10-01 +Quy Tonthat : + * Fix crashes caused by emitting update too early at layer creation. + * Disable half-drawn update mode when the center is moved. + +2007-09-28 +Quy Tonthat : + * ChangeLog entry + * Fix a long lasting bug that causes track property not working properly. + +2007-09-28 +Evan Battaglia : + * Half-drawn hack + * Draw arrow in Gpsdlayer DEM Layer -- minimum elevation + +2007-09-26 +Evan Battaglia : + * gpsdlayer -- gps_close() the connection. + +2007-09-25 +Quy Tonthat : + * SRTM download now works for regions outside North_America too. + +2007-09-24 +Evan Battaglia : + * Experimental VikGpsdLayer + +2007-09-23 +Evan Battaglia : + * Magic Scissors goodies + * Add Magic Scissors icon (from GIMP) + * Remove unused vik_layer_copy code + * Fix crashes on using wrong tools + * Serialize string lists / fix DEM Layer copy/paste + * * Pan Accelerators (Ctrl+Left, etc) * Ctrl-Scroll and Ctrl-Shift-Scroll to pan, kind of like Gimp. * Add a RADIOGROUP_STATIC properties factory type to make it easy for new layers. Uses an array list (like before) instead of a GList. * DEM US 10m (dem24k) source! Option in DEM Layer & ./configure * (copying & pasting DEM layers is broken, will fix later) + * Download&import SRTM 90m data (more work needed) Fix right-click geocache->goto geocaching.com web page + +2007-09-18 +Guilhem Bonnefille : + * Refactoring: really minor change + * Refactoring: minor changes + +2007-09-18 +Evan Battaglia : + * Saner vikfilelist.c -- allow multiple selections when adding DEM files + * Fix optional geocaching -- include config.h to compile + * Update ChangeLog + * Draw lines for file existence at very-zoomed out levels + +2007-09-09 +Guilhem Bonnefille : + * Removing unused files (*.png.h). + * Fix #1789550: define MAX macro if not defined on ALL systems + * g_*ify a path building + +2007-09-08 +Quy Tonthat : + * Automatically fetching google version numbers. + +2007-09-07 +Guilhem Bonnefille : + * Fix #1789550: mkdtemp usage is conditioned + * QA: remove a warning + * g_*ify maps_layer_default_dir function and code related to maps cache + * g_*ify a_get_viking_dir function + +2007-09-06 +Guilhem Bonnefille : + * Adding command line option framework. + +2007-09-05 +Quy Tonthat : + * Fix a bug that causes crashes when using "Maps Download" tool. + * Make viking's default start location somewhere more likely has maps. + +2007-09-04 +Guilhem Bonnefille : + * Releasing 0.9.2 + * QA: removing warning + +2007-09-03 +Guilhem Bonnefille : + * Hide Expedia view mode when expedia is not built in. + * Do not warn about drawmode inconsistency while reading file. + * Do not warn about drawmode inconsistency while reading file. + * Use $EMAIL to initialise email field for OSM upload. + * Refactoring: retrieve the VikWindow from the VikViewport via its GtkWidget nature + * Preset filename when exporting a TrwLayer. + * QA: strong type the second argument of the *_post_read functions. + * Fix: crash when "applying" a map layer property dialog + +2007-09-02 +Guilhem Bonnefille : + * Releasing 0.9.1 + +2007-09-01 +Guilhem Bonnefille : + * Disable Expedia map layer by default (as it is not working) + +2007-08-30 +Bernd Zeimetz : + * Add redirect support (for Expedia map layer) + +2007-08-30 +Guilhem Bonnefille : + * Add ability to upload a single track + * QA: Remove warnings + +2007-08-28 +Guilhem Bonnefille : + * Check current drawmode after creating a new MapsLayer + * QA: testing NULL before *free is not necessary + * Refactoring: compute drawmode name by getting menu entry label + * Allow to retrieve VikWindow from VikViewport + +2007-08-24 +Quy Tonthat : + * Give more instructive message for attempting to download maps in wrong mapmode + * Better checking to detect downloaded text instead of images + * New google version number + +2007-08-22 +Guilhem Bonnefille : + * Adding the ability to upload to OSM. + +2007-08-20 +Guilhem Bonnefille : + * Small target to easy multi-branch developer's work + * libcurl is a requirement + +2007-08-20 +Quy Tonthat : + * Fix bug in Google search that caused viking jump to wrong location when Google can not find the match. + +2007-08-19 +Quy Tonthat : + * Fix bugs that cause crashes on layers copy/paste/delete. + +2007-08-15 +Guilhem Bonnefille : + * Group "Export Layer" entries in a submenu + +2007-08-15 +Quy Tonthat : + * Clean up and get rid of compiler warnings. + * Old google modes are now disabled by default. + +2007-08-14 +Quy Tonthat : + * Fix bug in creating temporary HOME when HOME is not set. + +2007-08-14 +Guilhem Bonnefille : + * Adding "name" accessor + +2007-08-08 +Quy Tonthat : + * Make Google Map default map type. + +2007-08-04 +Guilhem Bonnefille : + * Refactoring + +2007-08-01 +Quy Tonthat : + * Read hgt.zip files directly. Process correctly 1 arc sec hgt(.zip) files + +2007-07-27 +Quy Tonthat : + * Plug file descriptor leak + +2007-07-26 +Quy Tonthat : + * Display altitude at the cursor position, on status bar. + +2007-07-25 +Quy Tonthat : + * New google version number + +2007-07-24 +Quy Tonthat : + * Disable Geocaches Acquire. + +2007-07-17 +Guilhem Bonnefille : + * Adding copyright + * Solving a regression But Viking don't compile without libcurl, even with this modification + +2007-07-17 +Quy Tonthat : + * Clean up (my) degug messages + +2007-07-16 +Bernd Zeimetz : + * moving trunk/debian into the pkg-deb directory, adding tags/branches dirs + +2007-07-14 +Guilhem Bonnefille : + * Converting printf calls + +2007-07-13 +Guilhem Bonnefille : + * Releasing 0.9 + * Declaring vikdemlayer_pixmap.h to automake + * Removing Reid from AUTHORS file. + * Revert "Add debian subdirectory to automaked tarball" + * Declaring new icon for Debian package + +2007-07-13 +Quy Tonthat : + * ChangeLog entry + * Eliminate the needs of entering DEM files for every single track/waypoint layer. + +2007-07-07 +Quy Tonthat : + * Fixed typo. + +2007-07-06 +Evan Battaglia : + * DEM: fix vertical units + * Fix invalid elevation + * Merge DEM branch + +2007-07-04 +Quy Tonthat : + * ChangeLog entry + * Bug fix: View Mode displayed wrong setting on startup. + +2007-07-03 +Quy Tonthat : + * ChangeLog entry + * Fixed bugs that caused "draw_scale" and "draw_centermark" not consistent. + +2007-07-02 +Quy Tonthat : + * ChangeLog entry + * Fix bugs that caused crashes on gps download/upload. + +2007-07-01 +Quy Tonthat : + * ChangeLog entry + * Make "Save Image" and "Save Image Directory" dialogs reusable. + +2007-06-28 +Quy Tonthat : + * Really using the new icon. + +2007-06-27 +Guilhem Bonnefille : + * Using the new icon + +2007-06-27 +Mark Coulter : + * Added Viking icon provided by Mark Coulter + +2007-06-24 +Guilhem Bonnefille : + * Refreshing INSTALL + * Removing old (and no more functional) Makefile + * Add debian subdirectory to automaked tarball + +2007-06-24 +Ralf Meyer : + * Merging with Ralf debianization + +2007-06-23 +Guilhem Bonnefille : + * Unused variable + * Add include to avoid implicit declaration + * Initialisation to avoid warning + * Explicit donw-casting + * Correct declaration + * Unused variables + * Correct some erroneous declarations + * Use g_mkdir instead of native mkdir + * Use g_free as free function + * Add requested sentinel and correct gdk_pixbuf_save call + * Declare usage of math.h include + * Suppress warning about backslashed newline at end of line + * Dynamic version in User-Agent + * Add referer to DownloadOptions + +2007-06-23 +Tim Scofield : + * Minor change to avoid SEGFAULT on x86_64 + +2007-06-23 +Guilhem Bonnefille : + * Adding a DownloadOptions type. + +2007-06-20 +Quy Tonthat : + * ChangeLog + * Google Search: fixed to work with new Google output. + +2007-06-19 +Guilhem Bonnefille : + * Moving acinclude.m4 as expat.m4 + * File forgotten on commit trunk@289 + +2007-06-19 +Quy Tonthat : + * Fix a wild pointer bug that can cause crashes. + * Fix bugs that causes "drawcentermark" not recognised when reading from files. + +2007-06-18 +Guilhem Bonnefille : + * Declaring curl_download_init function. + * Copying libcurl.m4 + +2007-06-18 +Quy Tonthat : + * Release 0.1.3-20070618 + * Download maps along track: maps between far apart trackpoints. + * Download maps along a track. + * New Google version numbers. + * Add User-Agent to http request header. + * Make the center mark look a bit better. + * Add center mark which can be turn on/off in View menu. + * Make the scale more visible on dark maps. + * Added cookies to google requests. + * New google version number + +2007-06-13 +Ralf Meyer : + * Adding an icon for the entry menu (Debian package only) + +2007-06-13 +Guilhem Bonnefille : + * Correct the man pages generation + * Adding an icon + +2007-06-08 +Quy Tonthat : + * ChangLog entries + * Fix a bug that causes segfault on trackpoint properties dialog. + +2007-06-01 +Quy Tonthat : + * Bacported Evan's magic scissors from DEM branch. + * Fix a segfault on track properties dialog. + +2007-05-31 +Quy Tonthat : + * ChangeLog entry. + * Use google maps search string as comment for new immediately created waypoint. + * Add Google Maps search to toolbar. + * Google Maps search: code clean up. + * Go to location using Google Maps search. + * Cosmetic changes: fix compiler warnings. + +2007-05-26 +Mark Coulter : + * Many new waypoint symbols created by Mark Coulter. + +2007-05-26 +Quy Tonthat : + * viking 0.1.3.20070526 + * ChangeLog entries + * Fix intermittent problem of map redraw. + * Handle cases that only need redraw (without downloading). + +2007-05-24 +Guilhem Bonnefille : + * Removing generated files + * Adding man pages + +2007-05-24 +Quy Tonthat : + * Make window dimensions easier to be changed. + * Small touches on the look. + * Maps layer: Improve performance for map autodownload. + +2007-05-23 +Quy Tonthat : + * ChangeLog entries + * Put Google Directions dialogs at the center of viking window. + * Google Directions now remembers previous query (from/to entries). + * ChangeLog Entries + * Gpslayer: New menu items to remove all tracks and waypoints in GPS folders. + +2007-05-22 +Quy Tonthat : + * Add "Save and Exit" to File menu. + * Disable temporarily prompt for saving on exit. + +2007-05-21 +Quy Tonthat : + * ChangeLog entry + * Save function for GPS layer (part 2: read) + * Save function for GPS layer (part 1: write only) + +2007-05-20 +Alex Foobarian : + * edit waypoint fix + +2007-05-19 +Quy Tonthat : + * ChangeLog entry for autodownload fixes + * osm now reports download error status. + * Terraserver now reports download error status. + * Expedia now reports download error status. + * Stop autodownload from running forever on map downloading errors. + +2007-05-18 +Quy Tonthat : + * Add curl-devel to spec file + +2007-05-17 +Quy Tonthat : + * ChangeLog entry + * Check for non-displayable data after downloading map. + * ChangeLog entry + * Map tool: Left click can now refresh display of map tiles. + +2007-05-17 +Guilhem Bonnefille : + * Releasing 0.1.3 + +2007-05-17 +Quy Tonthat : + * Fix problems in map downloading caused by unreliable error detection. + +2007-05-14 +Quy Tonthat : + * Changelog entry for the last commit + * Fix bug that causes crash on viking exit. + +2007-05-13 +Evan Battaglia : + * Remove the old tile from cache BEFORE redrawing. + * Fix "corrupted tile" problem -- was really just that incomplete tiles were being drawn & subsequently taken into memory cache. We should really add a "clear memory cache" menu item too. + +2007-05-11 +Evan Battaglia : + * Fix stupid segfault bug in main.c (open file) + * Now when we refresh tiles it will remove them from the memory cache like it was supposed to. + +2007-05-09 +Quy Tonthat : + * New google version number + +2007-05-08 +Guilhem Bonnefille : + * Refreshing tiles + +2007-05-04 +Guilhem Bonnefille : + * Declaring Debianization + * Added watch configuration files for other Debian packager + * Removing Debian maintainer script examples + * Adding menu entry inside the Debian package + * Removing unused file for Viking's Debian package + * Correct copyright holder in Debian package + * Update Debian package documentation + * Initial dh_make debianization + +2007-04-29 +Guilhem Bonnefille : + * Declaring Reid's patch + * Applying Reid's patch + +2007-04-28 +Guilhem Bonnefille : + * Allows to enable/disable OpenStreetMap module + * Adding Maplint OpenStreetMap layer + +2007-04-23 +Guilhem Bonnefille : + * New module for OpenStreetMap sources. + * Updating Changelog for libcurl adition + +2007-04-21 +Evan Battaglia : + * Slippy maps + * slippy maps + +2007-04-16 +Guilhem Bonnefille : + * Add libcurl + * Moving up cache management + * Introducing download module + * Unused function + +2007-04-04 +Quy Tonthat : + * Fixed Google Directions + * New google version number + +2007-02-20 +Quy Tonthat : + * GPS layer dialog is now displayed at the center of the Viking main window + +2007-02-19 +Quy Tonthat : + * New Google version numbers + +2007-02-15 +Quy Tonthat : + * Added viking.spec.in (by Michael A Peters). Made autoconf be aware of the new file + * Added viking.spec.in (by Michael A Peters). Made autoconf be aware of the new file + +2007-02-14 +Guilhem Bonnefille : + * Preparing 0.1.2 + * Cleanup + +2007-02-13 +Guilhem Bonnefille : + * About dialog filled with AUTHORS file + * Preparing 0.1.2: update contributors lists + * Update ChangeLog for my recent modifications + * Add (current) version and URL in about dialog + * Remove URL and version from title + +2007-02-06 +Quy Tonthat : + * Fix bug that causes crashes when click at the right of the track graph. + +2007-02-06 +Jocelyn Jaubert : + * Patch from Jocelyn Jaubert. Add time position to Track Poperties + +2007-02-05 +Quy Tonthat : + * Corrected main window title and viking website + * New google version numbers + * Cosmetic changes + +2007-02-04 +Quy Tonthat : + * Simplify tools enable/disable codes + +2007-02-01 +Quy Tonthat : + * Disable/enable tools according to what layer is active + +2007-01-28 +Guilhem Bonnefille : + * Work done by Quy + +2007-01-27 +Quy Tonthat : + * Display map sections while downloading + +2007-01-25 +Quy Tonthat : + * Fixed bugs that caused crashes on creating new map layer or new track/waypoint layer + +2007-01-23 +Quy Tonthat : + * Updated google tranparent version number + * Merged branch modular (r146:173) to trunk + +2007-01-18 +Guilhem Bonnefille : + * Content moved to the Wiki + * Update + +2007-01-05 +Quy Tonthat : + * Bug fix: main menu edit->delete and edit->cut did not work with waypoints and tracks. + +2007-01-04 +Quy Tonthat : + * Added 'Copy' and 'Cut' to popup menus for waypoint and track + +2007-01-03 +Quy Tonthat : + * Remove assumption aggregate is the only type of layers that has child layers. Gpslayer does too. + +2007-01-02 +Quy Tonthat : + * menu selection for layer instances. + * Layers now can have their say on what pop up menu items they want. + +2007-01-01 +Quy Tonthat : + * gpslayer: code cleanup + +2007-01-01 +Guilhem Bonnefille : + * Make all .h self sufficient + +2007-01-01 +Quy Tonthat : + * gpslayer: fix bug that caused crash when click \'Cancel\' on layer creating dialog + +2006-12-31 +Quy Tonthat : + * Added gpslayer + +2006-12-26 +Guilhem Bonnefille : + * Improve ChangeLog for next test release + * Fix a google version number change + +2006-12-17 +Alex Foobarian : + * + +2006-12-07 +Alex Foobarian : + * fix array overflow + +2006-12-05 +Alex Foobarian : + * + +2006-12-04 +Alex Foobarian : + * about dialog + +2006-11-30 +Alex Foobarian : + * + +2006-11-29 +Guilhem Bonnefille : + * Makefile and Makefile.in are generated files and should be ignored by SVN + +2006-11-29 +Alex Foobarian : + * + +2006-11-12 +Guilhem Bonnefille : + * Add explicit dependency to expat library + +2006-10-31 +Alex Foobarian : + * visual feedback when moving waypoints + +2006-10-30 +Alex Foobarian : + * + * fix toolbar icons in recent gtk + +2006-10-28 +Alex Foobarian : + * ticket 1577378: make viking compile with older gtk + * ignore png_h files + * fixing icons + * fixing icons + * modified mime types for png files + * + +2006-10-26 +Alex Foobarian : + * *** empty log message *** + * *** empty log message *** + * google version seems to be required in europe + +2006-10-23 +Guilhem Bonnefille : + * Improve the ChangeLog for the 2006-10-23 release + * Improve Makefile for a "make distcheck" support + +2006-10-23 +Alex Foobarian : + * toolbox tool improvements + +2006-08-15 +Guilhem Bonnefille : + * Adding implicit DMS->dec conversion in dialogs + * Adding implicit DMS->dec conversion in dialogs + +2006-07-26 +Guilhem Bonnefille : + * add dec -> DDD conversion + * add dec -> DMM conversion + * refactor dms conversions + +2006-07-24 +Reid Priedhorsky : + * Adding the path for GoogleMaps from Reid Priedhorsky + +2006-07-22 +Guilhem Bonnefille : + * Adding degrees conversion functions (DDD/DMM/DMS) + +2006-07-06 +Evan Battaglia : + * Upgrade Google Maps -- Europe + +2006-06-11 +Guilhem Bonnefille : + * Preparing 0.1.1 + +2006-05-26 +Guilhem Bonnefille : + * Bootstraping from CVS + +2006-05-25 +Alex Foobarian : + * added a setup dialog for acquire from gps + +2006-05-12 +Alex Foobarian : + * small fixes in acquire from gps code + +2006-05-08 +Guilhem Bonnefille : + * Bootstraping from CVS + +2006-05-06 +Guilhem Bonnefille : + * moving generated config.h to src to allow 'make dist' + * bug #1479244: FreeBSD port + +2005-12-04 +Evan Battaglia : + * More data source fixes + * Data sources existence checks and other fixes + +2005-11-26 +Evan Battaglia : + * Geocaching.com (via gcget) data source + * Data sources update + * Google import adds to currently-existing layer + +2005-11-25 +Evan Battaglia : + * Data sources core structure, google directions + +2005-11-24 +Evan Battaglia : + * Getting ready for Google directions import + * Locale-independent output for gpsmapper.c and gpspoint.c + +2005-11-23 +Guilhem Bonnefille : + * Better GPX export + +2005-11-21 +Alex Foobarian : + * *** empty log message *** + * fixed v-t diagram crash bug + * fixed a v-t diagram crash bug + +2005-11-19 +Evan Battaglia : + * Alex's GPSBabel acquire code + +2005-11-18 +Alex Foobarian : + * *** empty log message *** + * copy/paste of individual track- and waypoints- between processes now works + +2005-11-17 +Alex Foobarian : + * finished layer marshalling support + * fix sprintf warning + * Fix Makefile.am + +2005-11-16 +Alex Foobarian : + * Added layer marshalling support; for now trw and map layers are implemented. + * Retooled clipboard to support interprocess pasting; only full layers work between processes for now. + * fix implicit declaration warning + * Commenting out converter.[ch] until the files are in CVS; otherwise the build is broken. + +2005-10-28 +Guilhem Bonnefille : + * Adding --with-mapcache to configure + +2005-10-18 +Guilhem Bonnefille : + * Changing my email + +2005-10-18 +Alex Foobarian : + * fix ruler declination in UTM mode + +2005-10-17 +Guilhem Bonnefille : + * Relocating icons.h in order to better handle its prodution + +2005-10-16 +Evan Battaglia : + * Minor SList/List confusion fix + * Some work on zoom-in overflow bugs + * Fix bgitemcount + * Fix ruler to show angle, distance when off-screen + +2005-10-14 +Alex Foobarian : + * sanity check pasted lat/lon coordinate + +2005-10-13 +Alex Foobarian : + * Drag and drop whole track/waypoint lists + * fixed dnd crash when moving to same spot, and when moving from in front of target + +2005-10-12 +Alex Foobarian : + * coord layer drawing for lat/lon + * draw ruler only when idle + * deadlock fix + +2005-10-11 +Alex Foobarian : + * Draw a compass and bearing while using the ruler + +2005-10-09 +Alex Foobarian : + * fix pasting Google Maps links + +2005-10-08 +Evan Battaglia : + * Fix DISCONNECT_UPDATE_SIGNAL failed assertion + +2005-10-07 +Alex Foobarian : + * Added ruler drawing to the ruler tool + +2005-10-06 +Alex Foobarian : + * More wp icons added + * Added support for pasting lat/lon coordinates as waypoints + +2005-10-06 +Evan Battaglia : + * Name resolution for pasting wps&tracks + +2005-10-05 +Evan Battaglia : + * Alex's �bercool clipboard patch + +2005-10-01 +Evan Battaglia : + * Remove USGS + * Remove USGS + * Option as to whether to show scale + * Update TODO + * Update AUTHORS + * Alex's optional symbols patch; Fix geocaching .loc symbols + * Remove icons.h (generated) + * make symbols work for geocaching .loc + +2005-09-30 +Alex Foobarian : + * fixed name collisions during track/wp DND + * added GPX symbols + * Updated DND to insert layers at the point of the drop, instead of front of list + * added a DnD method to layer interface, and updated treeview DnD to use it + +2005-09-30 +Guilhem Bonnefille : + * Generated files should not appears on CVS + * Added ato-tools support for src/icons + +2005-09-29 +Evan Battaglia : + * Fix saving bug I introduced earlier; update TODO + +2005-09-29 +Alex Foobarian : + * fix warnings and remove some debug output + * Added wp symbol support; added scale ruler + +2005-09-29 +Evan Battaglia : + * trying to get g_dtostr to work + * Update TODO + * Forgot to add icons.h + * all icons inline + * menu.xml -> menu.xml.h + +2005-09-28 +Guilhem Bonnefille : + * Handle doc subdirectory + * Use configure.ac version + * Substitution of CFLAGS by AM_CFLAGS + +2005-09-28 +Evan Battaglia : + * Update TODO file + * Guilhem's autotools update + * strtod -> g_strtod + * Alex's DND & Toolbar patch + +2005-09-17 +Evan Battaglia : + * Update TODO/Changelog + * Update TODO/ChangeLog + * Stops and elevation plotting options and fixxes + * Update TODO/ChangeLog + * GPX write, clickable v-vs-t diagram + * Tools that may or may not be helpful/fun + * Read Geocaching .loc (about time) + +2005-09-16 +Evan Battaglia : + * Initial GPX support, experimental 3-d plotting, bugfixes, oh myg + +2005-09-15 +Evan Battaglia : + * Fix layer editable/checkbox bug due to stupid GTK's closures + * Elevation map click and bugfixes + * Fix USGS support + +2005-09-13 +Evan Battaglia : + * Guilhem's autotools support/alphabetized trw option + * Fixes to Alex's last patch + +2005-09-13 +Alex Foobarian : + * Alex Foobarian's v-vs-t and elevation map patch + +2005-09-07 +Evan Battaglia : + * Update INSTALL file + * Add dummy NEWS file + * Guilhem's Autotools support + +2005-09-07 +Alex Foobarian : + * Alex Foobarian's track profile patch + * Alex Foobarian's track duration patch + +2005-09-05 +Evan Battaglia : + * Delete from cache when updating image. + +2005-09-04 +Evan Battaglia : + * Fix mapcache stuff + +2005-09-03 +Alex Foobarian : + * Alex Foobarian's track split/merge patch + +2005-09-01 +Evan Battaglia : + * Initial revision + +2005-09-01 +(no author) <(no author)@02d69b8e-d120-0410-893f-fe71a3b6e39e>: + * New repository initialized by cvs2svn. diff --git a/ChangeLog.0 b/ChangeLog.0 new file mode 100644 index 0000000..f235e12 --- /dev/null +++ b/ChangeLog.0 @@ -0,0 +1,1939 @@ +2009-07-28 +Guilhem Bonnefille : + * Fix #2766609: Don't use gpsd_units() + +2009-07-26 +Herm : + * Fix #2812856: Change SRTM URL + +2009-07-26 +Guilhem Bonnefille : + * Fix #2818818: unset langage preset while opening external Google + +2009-06-19 +Jonas Norling + * Filters out irrelevant modifiers when using the scroll wheel + * Minor refactoring of the zooming code + * Fix #2796985: Crash when cancelling background job + +2009-06-02 +Guilhem Bonnefille : + * Upgrade OSM-traces support to 0.6 API + +2009-05-22 +Tal : + * Add hdop,vdop,pdop,nsat support in GPX + +2009-05-22 +Jocelyn Jaubert : + * Fix #570956: change saved_width to 1 + +2009-05-09 +Jocelyn Jaubert : + * Allow to flush memory consumed by map cache + * Add a preference to change the map cache size + +2009-05-09 +Tal : + * Replace g_strtod by g_ascii_strtod + +2009-05-06 +Jocelyn Jaubert : + * Add a thread pool for downloading + +2009-04-04 +Jocelyn Jaubert : + * Include full libcurl version in user agent + * replace deprecated CURLOPT_FILE by CURLOPT_WRITEDATA + * Fix bug #2481237: Maps directory file chooser should look for directory + +2009-02-08 +Guilhem Bonnefille : + * Update translations + * Release 0.9.8 + +2009-01-22 +Mathieu Albinet : + * Fix loading of world map file + +2009-01-22 +Rob Norris : + * Fix 2249398: Fix some memory leaks + +2009-01-18 +Guilhem Bonnefille : + * configure.ac: allow to enable/disable geonames and select the search method + +2009-01-18 +Hein Ragas : + * Add GeoNames support (both for search and for POI import from Geonames+Wikipedia) + +2009-01-15 +Mathieu Albinet : + * Windows port: avoid "\\" in URL + +2008-12-20 +Guilhem Bonnefille : + * Remove Google's map tiles + +2008-12-17 +Guilhem Bonnefille : + * Remove old Google stuff + +2008-12-13 +Guilhem Bonnefille : + * Add external tools framework + * Add OpenStreetMap and Google web tools + +2008-12-07 +Quy Tonthat : + * Clicking on "vivisble" tick no longer makes the layer selected. + +2008-12-03 +Hein Ragas + * GPX export: sort track by time. Some application can make use + of this feature when reading gpx files. + +2008-11-22 +Quy Tonthat : + * Merging tracks by name. Users can now select more than one tracks to + merge with. + * Fix bugs that caused magic scissors not working. + +2008-11-19 +Quy Tonthat : + * Merging tracks by name. As submitted by Hein Ragas + * Merging tracks by name. Tracks can only be merged if they have + timestamps. Make sure users won't cause damage to themselves by + merging tracks without timestamps. Also a few bug fixes and + optimisation. + +2008-11-13 +Quy Tonthat : + * Viking no longer support Google satellite maps due to requests + from Google. + +2008-10-31 +Quy Tonthat : + * Tittle waypoint properties dialog as "Waypoint Properties" + not "Create". + +2008-10-30 +Quy Tonthat : + * Add larger size waypoint symbols (icons) that look similar to + the ones used in Garmin GPS. + * The larger symbols are now used by default. To switch back to the + old smaller icons, use command line option "-s" or "--small_waypoint". + * Waypoint Property Dialog: The combo box "symbol" (used for selecting + waypoint symbol) now has tooltip that shows the name of the selected + symbol. + * src/icons/Makefile.am: Make sure we won't pick up unwanted _pixmap.h + files + * Waypoint names are now displayed at the top of waypoint symbol + and no longer overlap symbols. + +2008-10-28 +Quy Tonthat : + * Waypoint symbols: Use Garmin waypoit names so that waypoint has + proper symbols on GPS after upload (and on Viking after download). + Old viking files still works the way they did. + +2008-10-22 +Quy Tonthat : + * Fix compatibility problem for windows caused by + g_shell_parse_argv() + +2008-10-20 +Quy Tonthat : + * New server for OSM cycle map. + +2008-10-13 +Quy Tonthat : + * GPS realtime tracking: Keep retrying when fail to connect + to gpsd, either because gpsd is not (yet) running or gpsd + disconnect (eg. gps unplugged). + +2008-10-12 +Jon Burgess : + * fix implicit declaration of maps_layer_default_dir() + * fix missing status return in spawn_command_line_async() + * fix curl error buffer usage + +2008-10-12 +Guilhem Bonnefille : + * Release 0.9.7 + +2008-10-12 +Rob Norris : + * Fix 2161310: Fix some more compiler warnings + +2008-10-12 +Jon Burgess : + * Fix 2134452: Properties of some tracks show as NaN + +2008-10-11 +Quy Tonthat : + * Fix segfault in realtime tracking. + * Add new moving map method for realtime tracking. + +2008-09-30 +Stanislav Brabec : + * Rename icon: viking_icon.png -> viking.png + * Fix missing files in po/POTFILES.in + * src/viking.desktop.in: add GenericName and revise Categories + * viking.spec.in, src/icons/Makefile.am: Fix icon target dir + +2008-09-22 +Quy Tonthat : + * Change "Zoom To" short cut to avoid conflict with "Zoom Tool". + +2008-09-16 +Guilhem Bonnefille : + * Update translations + +2008-09-07 +Quy Tonthat : + * fix parallel build (make -j8) on multi-processor machines. Based + on a patch from sbrabec. Thanks. + +2008-09-03 +Guilhem Bonnefille : + * QA: cleanning old stuff + +2008-09-01 +Guilhem Bonnefille : + * Fix #1947260: correct a corrupted escape + +2008-09-01 +Quy Tonthat : + * Google search adapting changes from Google. + +2008-09-01 +Quy Tonthat : + * Fixed crashes when creating new layers. + +2008-08-30 +Guilhem Bonnefille : + * QA: removing specific GtkCellRenderer + +2008-08-30 +Armin Moser : + * add osm cycle layer support + * add a menu entry to extend an existing track using magic scissors + +2008-08-30 +anonymous: + * Patch #2009666: OpenAerialMap + +2008-08-30 +Rob Norris : + * Fix #1952523: mode_button assertion loading old datafile + +2008-08-25 +Guilhem Bonnefille : + * Add preferences to select how degrees are displayed + +2008-08-24 +Guilhem Bonnefille : + * Fix: update layer after applying properties + +2008-06-24 +Mathieu Albinet : + * Color picker button for the Coordlayer properties dialog + +2008-08-23 +Guilhem Bonnefille : + * Cut/Copy/Paste empty selection is not critical + +2008-06-23 +Mathieu Albinet : + * Layers panel UI improvements + +2008-08-22 +Guilhem Bonnefille : + * Replace specific about dialog by GtkAboutDialog + * Replace some g_warning by g_debug + * Homogeneous icons management. + +2008-08-17 +Guilhem Bonnefille : + * Add preferences to store OSM login/password + * Add a password entry widget + +2008-08-16 +Guilhem Bonnefille : + * Ensure that confirmation dialog is over file selector + +2008-08-13 +Quy Tonthat : + * Fixed google map download problem. + +2008-07-31 +Guilhem Bonnefille : + * Release Viking 0.9.6 + * Fix unecessary (and probably) Makefile.am directive + +2008-07-28 +Quy Tonthat : + * Fix gcget command line to accomodate negative coords. + +2008-07-22 +Quy Tonthat : + * Google maps no longer worked due to changes made by Google. + The Problems now fixed. + +2008-07-21 +Guilhem Bonnefille : + * Release Viking 0.9.5 + +2008-07-18 +Guilhem Bonnefille : + * Install man pages + * Update translations + +2008-07-15 +Quy Tonthat : + * Added viking.desktop + +2008-07-13 +Rob Norris : + * Fix #1947456: Compiler warning fixes + +2008-07-09 +Guilhem Bonnefille : + * Update translations + +2008-07-02 +Quy Tonthat : + * Track properties: split track at marker. + +2008-06-30 +Quy Tonthat : + * Track properties: Keep markers of the graphs in sync with each + other. + +2008-06-29 +Guilhem Bonnefille : + * Windows port: fallback temporary file + +2008-06-29 +Mathieu Albinet : + * Windows port: typo in util.c + +2008-06-24 +Quy Tonthat : + * Track graph marker now works again. + +2008-06-22 +Quy Tonthat : + * Fix google version number. + +2008-06-15 +Quy Tonthat : + * RELEASE: Test release 0.9.4.20080614 (by Guilhem) + +2008-06-09 +Mathieu Albinet : + * Windows port: redefine LOCALEDIR + +2008-06-06 +Quy Tonthat : + * viking no longer converts waypoint names to uppercase. Waypoint names + are now case insensitive. + +2008-06-02 +Mathieu Albinet : + * Portability: remove "/dev/null" use + +2008-05-08 +Mathieu Albinet : + * Windows port: rename interface to source_interface + * Portability: replace mmap functions by g_mapped_file* + * Portability: use of g_ascii_dtostr to format google url + +2008-05-02 +Guilhem Bonnefille : + * Update man page + +2008-05-01 +Guilhem Bonnefille : + * Add file content checking process + +2008-05-01 +Mathieu Albinet : + * Remove dependency to wget + +2008-05-01 +Guilhem Bonnefille : + * Adding --debug and --verbose command line option + +2008-04-26 +Guilhem Bonnefille : + * Fix pipe leaks + +2008-04-26 +Mathieu Albinet : + * Portability: provide our own curl WRITE function + +2008-04-22 +Robert Norris : + * Fix: Initalize tv_usec field. + * Fix for implicit declaration of function 'g_fopen' + +2008-04-21 +Guilhem Bonnefille : + * Bug #1915121: add an utility to reproduce (test/gpx2gpx) + * Fix #1915121: use GLib functions to handle ISO8601 dates + +2008-04-16 +Tim Scofield : + * Fix: typo false -> FALSE + +2008-04-12 +Mathieu Albinet : + * M_PI already defined + +2008-04-12 +Guilhem Bonnefille : +Mathieu Albinet : + * Portability: reduce unistd.h dependency + * Portability: replace mkdir by g_mkdir + * Portability: replace deprecated bzero function by memset + * Portability: remove dirname needs with g_mkdir_with_parents + +2008-03-27 +Mathieu Albinet : + * Replace GtkFileSelection by GtkFileChooser + +2008-03-24 +Guilhem Bonnefille : + * Merge icons in a single binary object + +2008-03-15 +Guilhem Bonnefille : + * Fix: [ 1839948 ] Maximize/Restore changes current cursor + * Add panning tool as default + +2008-02-25 +Guilhem Bonnefille : + * po/ChangeLog: needed file for distribution + +2008-02-25 +Rob Norris : + * Fix: autogen can generate broken configure file (SF#1881475) + * Fix some compiler warnings (SF#1888407) + +2008-02-24 +Guilhem Bonnefille : + * Change OSM's tiles URL + +2008-02-22 +Michael A. Peters : + * viking.spec: Correct license, required packages and local. + +2008-02-20 +Guilhem Bonnefille : + * Update translations + +2008-02-16 +Guilhem Bonnefille : + * main.c: I18N improvements + * French translation update + +2008-02-16 +Jocelyn Jaubert : + * I18N improvements + * French translation update + (both submitted the 2008-01-12 on mailing-list) + +2008-01-22 +Alex Foobarian : + * Fix a crash bug in merge-by-time reported by Evan + +2008-01-18 +Quy Tonthat : + * Fix a crash bug in mapcache reported by Jocelyn + * Added mutex to protect mapcache from being corrupted by threads. + +2008-01-04 +Alex Foobarian : + * Tuned the v-t diagram drawing + +2007-12-27 +Evan Battaglia : + * Minor fixes/debugging to gcget. Add gcget-perl + * Full screen mode. + * Bugfix for prefernces -- don't cut off last character of password + +2007-12-27 +Guilhem Bonnefille : + * Add GpxWritingOptions to control GPX file writing + +2007-12-23 +Oddgeir Kvien : + * Add default values to ele and time fields (due to OSM) + +2007-12-21 +Evan Battaglia : + * Preferences groups/tabs + * Fix gcget to accept username and password. Pass this in to gcget. + * Oops! Reading preferences from the file wasn't working. Fixed. + +2007-12-21 +Jocelyn Jaubert : + * Update French translation + +2007-12-21 +Christoph Eckert : + * Update source for OSM/Osmarender tiles + +2007-12-20 +Evan Battaglia : + * Preferences in ~/.viking/viking.prefs, this will soon allow geocaching support to go mainstream, (hopefully) + +2007-12-20 +Quy Tonthat : + * Revert a previous change that disabled realtime tracking if libgps + does not exist. + +2007-12-17 +Jocelyn Jaubert : + * Use specific gettext call for plural form + +2007-12-16 +Evan Battaglia : + * Sort waypoints in GPX output. + * Use the "next unused" (not really) waypoint number as default. + +2007-12-15 +Guilhem Bonnefille : + * Fix compilation under HURD (missing MAXPATHLEN macro) + * Fix: if libgps is missing, Realtime GPS Tracking is disabled + +2007-12-15 +Jocelyn Jaubert : + * Make menu entries translatable + * Mark many strings translatable + * Update french translation + +2007-12-12 +Guilhem Bonnefille : + * Marking translatable strings + * First french translation (incomplete) + +2007-12-12 +Guilhem Bonnefille : + * Fix warning: underquoted definition of AM_WITH_EXPAT + * Fix bug: "config.status: error: cannot find input file: Makefile.in" + +2007-12-07 +Quy Tonthat : + * Fix autogen.sh to remove the assumption that version 1.9 of automake + is available on all systems. + * Now that autogen.sh runs configure, "make full" should not. + +2007-12-07 +Evan Battaglia : + * BlueMarble tiles: http://mike.teczno.com/notes/blue-marble-tiles.html + * Google Terrain maps + * Disable printing to make Viking compile for GTK < 2.10 + +2007-11-27 +Guilhem Bonnefille : + * util.c: Use a list of possible browsers. + +2007-11-20 +Quy Tonthat : + * Fix a bug that can potentially cause segfault. + +2007-11-19 +Quy Tonthat : + * Improve track graphs. Some tracks looked too flat. + +2007-11-09 +Evan Battaglia : + * GPSBabel filter work I've been sitting on for a while now. + * Draw circle for downloading geocaches. Constrain by maximum distance. + +2007-11-08 +Quy Tonthat : + * Printing support + +2007-11-01 +Quy Tonthat : + * Fix bug that caused Old Google maps not being disabled by default. + +2007-10-24 +Quy Tonthat : + * Fix crashes on elev graph for some tracks. + * Make low alt tracks look more visible on elev graph. + * Fix "incompatible pointer type" warnings. + +2007-10-23 +Quy Tonthat : + * Missing declaration. Thanks to Bernd Zeimetz + +2007-10-20 +Guilhem Bonnefille : + * Releasing 0.9.3 + +2007-10-20 +Evan Battaglia : + * Fixing minor typo in vikdemlayer.c which could cause crashes + +2007-10-20 +Quy Tonthat : + * Track Properties Dialog no longer blocks interaction of the main + window. + * Draw position marker on track elev/speed graphs at mouse click. + * Diasable buttons on Track Properties Dialog when not needed. + * Display track name on title of track property dialog. Now that + viking allows multiple dialogs displayed simultaneously. + +2007-10-17 +Evan Battaglia : + * Fix problem with extraneous waypoints being plotted (wrap around problem). May still be problems in UTM mode. + +2007-10-16 +Evan Battaglia : + * Fix Google version parsing. Google no longer uses '=' and '&' but hex equivalents to describe the URI. Not sure if this will last :/ + +2007-10-16 +Quy Tonthat : + * Interpolating DEM data in 3 different methods. Track data, + elevation-distance graph and elevation info on status bar now make use + of interpolation. + +2007-10-15 +Quy Tonthat : + * Add more room to the top of elevation-distance graph. + +2007-10-14 +Evan Battaglia : + * Fix plotting of DEM elevation data (subtract min altitude) + +2007-10-12 +Evan Battaglia : + * Fix Esc and Backspace to work only when VikViewport has focus. + * VikViewport grabs focus on click or release events, or when a + tool move event returns VIK_LAYER_TOOL_ACK_GRAB_FOCUS. + +2007-10-12 +Quy Tonthat : + * Make use of DEM elevation data and GPS speed for track graphs. + +2007-10-11 +Evan Battaglia + * Key press framework for tools. Esc to stop track. Backspace to end track. + +2007-10-11 +Guilhem Bonnefille : + * Upgrading to API 0.5 of OSM + +2007-10-11 +Quy Tonthat : + * Make Realtime Tracking a feature that can be disabled at configure + time. Do not quietly disable it beacause libgps is not available + at compiling time. + * Extra data from GPS in realtime mode are now stored in trackpoints. + +2007-10-10 +Quy Tonthat : + * Fix a crash bug caused by operation on variable inside a macro. + +2007-10-09 +Evan Battaglia : + * Ctrl-shift-scroll to zoom like Google. Just scroll zooms like before. + * Show currently edited track in red-dashed line. This makes it easier + to tell if we've ended the track. + * When using new track tool, draw a line before making a point to + preview the new point. + * Use $BROWSER environment variable (for viewing geocache pages) + +2007-10-08 +Quy Tonthat : + * Fix compiling breakage caused by missing icon file from the list. + +2007-10-07 +Guilhem Bonnefille : + * libgps is no more mandatory + +2007-10-07 +Evan Battaglia : + * Scroll zoom keeps cursor over same spot on map (like Google, QLandKarte) + * Cursors for tools. + * Undo magic scissors by right-clicking. + * Extend a track by right-clicking on it. + * Experiment: "Begin track" tool + +2007-10-07 +Quy Tonthat : + * Correctly calculate position (based on time instead of distance) + when clicking on speed-time graph. + * Added km/h to speed entries of the track properties dialog. + * The "Selected Time" on track properties dialog is now correct. + * Track Properties: now displays track distance/time instead of + "Selected Time". + +2007-10-06 +Quy Tonthat : + * Fix bugs that caused odd display of time on track properties dialog. + * Pop a message when failed to connect to gpsd. + +2007-10-05 +Quy Tonthat : + * Fix a segfault caused by (mistakenly) adding a new layer to gps + layer. + * Be more selective in collecting realtime trackpoints. + +2007-10-04 +Quy Tonthat : + * Improvements for GPS layer's "realtime tracking". + +2007-10-02 +Quy Tonthat : + * Fix crashes caused by emitting update too early at layer creation. + * Add realtime tracking to GPS layer. + * fix half-drawn problems for GPS layer. + +2007-10-01 +Guilhem Bonnefille : + * Relax dependencies about glib by implementing + g_hash_table_remove_all ourselves (Evan's patch) + +2007-10-01 +Quy Tonthat : + * Disable half-drawn update when the center is moved. Avoid using + static "trigger" in viklayer.c which causes problems when viking + has more than one windows. + +2007-09-28 +Quy Tonthat : + * Fix bug that caused Elevation graph not working properly with some + tracks. + +2007-09-27 +Evan Battaglia : + * GPSD Layer -- draw an arrow. + * Minimum elevation for DEM layer. + * Half-drawn hack to only draw layers on top of the one that has + recently changed. A must for realtime GPS. + +2007-09-25 +Quy Tonthat : + * SRTM download now works for regions outside North_America too. + +2007-09-23 +Evan Battaglia : + * Fix copy & pasting DEM layers -- new serializing string list code. + * Don't crash if using tool on wrong type of layer / no layer. + Although I really want to know what happened to "use the top visible layer", + and return TRUE if the tool "accepts" the use... + editing lots of TRWLayers was way easier that way... + * Remove unused vik_layer_copy() code + * Add Magic Scissors icon (from GIMP) + * Add comment when making a Google Route. + * Continue a magic scissors route by holding down control. Continue the comment too. + * Right-click a route created by google route (multiple or single) to see the Google directions web page which created it. Useful for creating a route w/ Viking, then seeing the verbal directions (left here, right there) + * Experimental GPSD support (VikGpsdLayer) + +2007-09-22 +Evan Battaglia : + * Pan Accelerators (Ctrl+Left, etc) + * Ctrl-Scroll and Ctrl-Shift-Scroll to pan, kind of like Gimp. + * Add a RADIOGROUP_STATIC properties factory type to make it easy + for new layers. Uses an array list (like before) + instead of a GList. + * DEM US 10m (dem24k) source! Option in DEM Layer & ./configure + * (copying & pasting DEM layers is broken, will fix later) + +2007-09-21 +Evan Battaglia : + * Fix right-click on geocache to work with new geocache names. + * Download & import SRTM 90m DEM data (still working on US 10m) + +2007-09-17 +Evan Battaglia : + * Draw lines to show file existence for MapsLayer for very zoomed out maps. It's faster that actually showing the maps but still gets slow at a certain level. + +2007-09-09 +Guilhem Bonnefille : + * Removing unused files (*.png.h). + +2007-09-08 +Guilhem Bonnefille : + * Fix #1789550: define MAX macro if not defined on ALL systems + +2007-09-08 +Quy Tonthat : + * AUtomatically fetching google version number. + +2007-09-07 +Guilhem Bonnefille : + * Fix #1789550: mkdtemp usage is conditioned, so it is possible + to build viking on system not offering such feature. + +2007-09-06 +Guilhem Bonnefille : + * Adding command line option framework. + +2007-09-06 +Quy Tonthat : + * Make viking's default start location somewhere more likely has maps. + * Fix crash when using "Maps Download" tools right after viking is + started (without a viking file). + +2007-09-05 +Quy Tonthat : + * Viking 0.9.2 (By Guilhem Bonnefille ) + +2007-09-03 +Guilhem Bonnefille : + * Fix: crash when "applying" a map layer property dialog. + * QA: strong type the second argument of the *_post_read functions. + * Preset filename when exporting a TrwLayer. + * Refactoring: retrieve the VikWindow from the VikViewport via its + GtkWidget nature. + * Use $EMAIL to initialise email field for OSM upload. + * Do not warn about drawmode inconsistency while reading file. + * Hide Expedia view mode when expedia is not built in. + +2007-09-01 +Guilhem Bonnefille : + * Disable Expedia map layer by default (as it is not working). + +2007-08-30 +Bernd Zeimetz : + * Add redirect support (for Expedia map layer). + +2007-08-30 +Guilhem Bonnefille : + * Add ability to upload a single track. + +2007-08-28 +Guilhem Bonnefille : + * Check current drawmode after creating a new MapsLayer. + +2007-08-25 +Quy Tonthat : + * New google version number. + * Better checking to detect downloaded text instead of images. + * Give more instructive message for attempting to download maps in + wrong mapmode. + +2007-08-20 +Guilhem Bonnefille : + * libcurl is a requirement + +2007-08-20 +Quy Tonthat : + * Fix bugs that cause crashes on layers copy/paste/delete. + * Fix bug in Google search that caused viking jump to wrong location + when Google can not find the match. + +2007-08-16 +Guilhem Bonnefille : + * Group "Export Layer..." entries in a sub-menu. + +2007-08-16 +Quy Tonthat : + * Clean up and eliminate compiler warning. + +2007-08-15 +Quy Tonthat : + * Fix bug in creating temporary HOME when HOME is not set. + * Added --enable-old-google to configure script. Old google modes are + now disabled by default. + * Default mode for new maps is Google Maps. + +2007-08-09 +Quy Tonthat : + * Make Google Map default map type. + +2007-08-02 +Quy Tonthat : + * DEM module can now read hgt.zip files directly (no need to unzip + them). + * DEM module can now process 1 arc sec hgt(.zip) files (mainly for USA + regions). + +2007-07-27 +Quy Tonthat : + * Plug filedescriptor leak in dem.c + +2007-07-26 +Quy Tonthat : + * Display on status bar altitude at cursor using data from DEM layer(s). + +2007-07-25 +Quy Tonthat : + * New google version numbers. + +2007-07-24 +Quy Tonthat : + * Disable GeoCache Acquire since it nolonger works. Can be enabled + again using configure --enable-geocaches. + +2007-07-18 +Quy Tonthat : + * Remove (my) debug messages which are no longer needed. + +2007-07-15 +Quy Tonthat : + * Missing a few changes here. + * release 0.9 (by Guilhem) + +2007-07-13 +Quy Tonthat : + * Eliminate the needs of entering DEM files for every single + track/waypoint layer. + +2007-07-07 +Quy Tonthat : + * Fixed typo in Makefile.am + +2007-07-06 +Evan Battaglia : + * Merge DEM Branch + +2007-07-04 +Quy Tonthat : + * Bug fix: View Mode displayed wrong setting on start up + +2007-07-03 +Quy Tonthat : + * Fixed bugs that caused draw_scale and draw_centermark status not being + consistent among View menu, viewport and loaded files. + +2007-07-02 +Evan Battaglia : + * DEM Branch: Trying to fix/cleanup various DEM things + * DEM Branch: Support for SRTM 3 arcsecond _global_ DEM data from http://www2.jpl.nasa.gov/srtm/ + +2007-07-02 +Quy Tonthat : + * Fixed bugs that caused crashes during GPS upload/download. + +2007-07-01 +Quy Tonthat : + * Make "Save Image" and "Save Image Directory" dialogs reusable. + +2007-06-24 +Guilhem Bonnefille : + * Merging with Ralf's work around debianization + * INSTALL: refreshed + +2007-06-23 +Guilhem Bonnefille : + * Minor change to avoid SEGFAULT on x86_64 + * Add DownloadOptions type to specify referer per map source + +2007-06-19 +Quy Tonthat : + * Fix bugs that causes "drawcentermark" not recognised when reading + from files. + * Fix a wild pointer bug that can cause crashes + +2007-06-18 +Guilhem Bonnefille : + * Copying libcurl.m4 as it is needed everywhere + +2007-06-18 +Quy Tonthat : + * New google version numbers. + * Make scale more visible. + * Add center mark which can be turn on/off in View menu. + * Viking now uses cookies for http requests. Some server(s) is quite + picky about this. (With great help from Lixus ) + * Download maps along a track. Right click on a track layer, select map + type and zoom level, viking will do the rest. + * release 0.1.3-20070618 + +2007-06-13 +Guilhem Bonnefille : + * Adding an icon (suggested by Ralf Meyer ) + +2007-06-8 +Quy Tonthat : + * Fix a bug that causes segfault when viewing properties of a + waypoint. + +2007-06-1 +Quy Tonthat : + * Fix a bug that causes segfault when viewing properties of a track + that has only one trackpoint with elevation information. + * Backport Evan's magic scissors from DEM branch. + +2007-05-31 +Quy Tonthat : + * Add Google Maps search to View menu and Toolbar + * Waypoint created right after the search will pick up the search + string as comment. (Use TrackWaypoint Layer menu, not toolbar, to + create waypoint). + +2007-05-26 +Mark Coulter : + * new waypoint symbols. + +2007-05-26 +Quy Tonthat : + * Fix intermittent problem of map redraw. + * Mapslayer: Fixed bugs that cause in some cases, map display can not + be refreshed without downloading. + +2007-05-24 +Ralf Meyer : + * Adding man pages. + +2007-05-24 +Quy Tonthat : + * Maps layer: Improve performance for map autodownload. + * Make dimensions easier to be found and changed to suit own tastes. + * Small touches on the look. + +2007-05-23 +Quy Tonthat : + * New GPS layer menu items: "empty upload", "empty download", "empty + all" + * acquire->Google Directions now record and display previous queries + fo "From"/"To" entries. + * Position Google Directions dialogs at the center of Viking window. + +2007-05-22 +Quy Tonthat : + * GPS layer track and waypoint data can now be saved. + * Disable prompt for save before exit. + * Add "Save and Exit" to File menu. + +2007-05-20 +Evan Battaglia : + * DEM Branch + +2007-05-20 +Quy Tonthat : + * Stop autodownload from running forever on map downloading errors. + +2007-05-18 +Quy Tonthat : + * Add curl-devel to spec file. + * Map tool: Left click can now refresh display of map tiles. + * Check for non-displayable data after downloading map. + +2007-05-17 +Quy Tonthat : + * Fix problems in map downloading caused by unreliable error + detection. + * Release 0.1.3 + +2007-05-15 +Quy Tonthat : + * Fixed bugs that can cause segfault on exit. The problem was caused +by mapslayer's weak_ref not being unref'ed in some cases. + +2007-05-13 +Evan Battaglia : + * Fix problem of "bad" tiles showing up when downloading. The problem was loading of incomplete tiles. Fixed this by first downloading to a temporary file, then moving when complete. + +2007-05-11 +Evan Battaglia : + * Fix removal of redownloaded tiles from memory cache. + * Fix a stupid segfault in main.c (opening new files) + +2007-05-09 +Quy Tonthat : + * New Google version numbers. + +2007-05-08 +Guilhem Bonnefille : + * New "Refresh onscreen tiles" menu entry + +2007-05-04 +Guilhem Bonnefille : + * debian/: debianization + +2007-04-29 +Reid Priedhorsky : + * libusb support + +2007-04-28 +Guilhem Bonnefille : + * OpenSourceMap slippy maps (in osm.c) -- Maplink tiles + * Add configuration option for OpenStreetMap sources + +2007-04-23 +Guilhem Bonnefille : + * OpenSourceMap slippy maps (in osm.c) -- Osmarender and Mapnik + +2007-04-21 +Evan Battaglia : + * OpenSourceMap slippy maps (in google.c) -- identical to google maps except zoom numbering + +2007-04-16 +Guilhem Bonnefille : + * Adding libcurl support + +2007-04-04 +Quy Tonthat : + * New Google version number. + * Fixed Google Directions + +2007-02-20 +Quy Tonthat : + * GPS layer dialog now displayed at the center of the Viking main + window. + +2007-02-19 +Quy Tonthat : + * New Google version numbers. + +2007-02-15 +Quy Tonthat : + * Made viking.spec.in out of Michael's viking.spec + * Added viking.spec.in to autoconf files. + +2007-02-15 +Michael A. Peters : + * Added viking.spec + +2007-02-14 +Guilhem Bonnefille : + * NEWS, configure.ac: preparing 0.1.2 + +2007-02-13 +Guilhem Bonnefille : + * src/vikwindow.c: remove URL and version number from window title + * src/dialog.c: add URL and use dynamic information for version + * AUTHORS, src/dialog.c: update contributors list + * AUTHORS, src/dialog.c, src/Makefile.am: About dialog filled with + AUTHORS file + +2007-02-07 +Quy Tonthat : + * Fix bug that causes crashes when click at the right side (outside) + of the track graph area in the Track Poperties window. + +2007-02-06 +Jocelyn Jaubert : + * Add new information to Track Properties. Postion in time will be + tracked and display when moving mouse cursor around the track graph. + +2007-02-06 +Quy Tonthat : + * New google version numbers. + * correct main window title and viking website. + +2007-02-05 +Quy Tonthat : + * Cosmetic changes. + +2007-02-04 +Quy Tonthat : + * Simplify tools enable/disable codes. + +2007-02-01 +Quy Tonthat : + * Only tools that work with current active layer are enable, + others are disable (fade out and does nothing when clicked on). + +2007-01-27 +Quy Tonthat : + * Display map sections while downloading (bug 1303429) + +2007-01-25 +Quy Tonthat : + * Fixed bugs that caused crashes on creating new map layer or + new track/waypoint layer. + +2007-01-24 +Quy Tonthat : + * Updated google tranparent version number. + * Made it more convenient to update google version numbers. + +2007-01-23 +Quy Tonthat : + * Merged branch modular to trunk. + +2007-01-05 +Quy Tonthat : + * Bug fix: main menu edit->delete and edit->cut did not work with + waypoints and tracks. + +2007-01-04 +Quy Tonthat : + * Added "Copy" and "Cut" to popup menus for track and waypoint (on the + layer panel). + +2007-01-03 +Quy Tonthat : + * bug fix: crash on inserting aggregate layer if the selected layer's + parent is not an aggregate layer. + * bug fix: crash when delete a child layer whose parent is not + an aggregiate layer (eg gpslayer) + * Menu item selection for layer instances. + +2007-01-02 +Quy Tonthat : + * gpslayer: Unexpose interface functions. + * Layers now can have their say on what pop up menu items they want. + +2007-01-02 +Guilhem Bonnefille : + * Add ability to disable Terraserver stuff + * Add ability to disable Expedia stuff + +2007-01-01 +Quy Tonthat : + * gpslayer: fix bugs that causes crashes when click "Cancel" on layer + creation dialog. + +2007-01-01 +Guilhem Bonnefille : + * Make all .h self sufficient + * Add ability to disable Google stuff + +2006-12-31 +Quy Tonthat : + * Added gps layer + +2007-01-02 +Guilhem Bonnefille : + * Add ability to disable Terraserver stuff + * Add ability to disable Expedia stuff + +2007-01-01 +Guilhem Bonnefille : + * Make all .h self sufficient + * Add ability to disable Google stuff + +2006-12-26 +Quy Tonthat : + * Fix a google version number change (at least in Australia). + +2006-12-07 +Quy Tonthat : + * Fix an array overflow bug in Map Layer Properties + +2006-12-04 +Alex Foobarian : + * Added an "About" dialog + +2006-11-30 +Alex Foobarian : + * Added Quy Tonthat's patch to fix a bug in Track Properties + +2006-11-29 +Alex Foobarian : + * Added patch by Quy Tonthat to fix a crash bug + +2006-11-12 +Guilhem Bonnefille : + * Add expat explicit dependency + +2006-10-31 +Alex Foobarian : + * Visual feedback for moving waypoints + +2006-10-30 +Alex Foobarian : + * Created standard Edit menu + * Implemented Cut for trackpoints and waypoints + * When moving trackpoints, we now draw one under the cursor for visual feedback + +2006-10-26 +Alex Foobarian : + * Cleared up the drawing modes and map type descriptions + * Updated google version string to make it work in Europe + * Added Cut/Copy/Paste shortcuts to right-click menus + * Compacted the track properties dialog + +2006-10-23 +Alex Foobarian : + * Introduced a toolbar tool interface, converted existing tools to use it + * As a result, ruler drawing bugs are gone + * Sped up ruler drawing by increasing the redraw priority + +2006-08-15 +Guilhem Bonnefille : + * Add implicit DMS->DDD conversions in waypoints dialogs + +2006-07-26 +Guilhem Bonnefille : + * src/degrees_converters.c, src/degrees_converters.h, + test/degrees_converter.c: add dec -> DDD conversion + * src/degrees_converters.c, src/degrees_converters.h, + test/degrees_converter.c: add dec -> DMM conversion + * src/degrees_converters.c: refactor dms conversions + +2006-07-24 +Guilhem Bonnefille : + * Add patch for GoogleMaps from Reid Priedhorsky + +2006-07-22 +Guilhem Bonnefille : + * Makefile.am, configure.ac, src/Makefile.am, + src/degrees_converters.c, src/degrees_converters.h, + test/Makefile.am, test/check_degrees_conversions.sh, + test/degrees_converter.c: Adding degrees conversion functions + (DDD/DMM/DMS) + +2006-07-06 +Evan Battaglia : + * ChangeLog, src/google.c: Upgrade Google Maps -- Europe + +2006-07-01 +Evan Battaglia : + * Upgrade Google Maps version (yay Europe!) + +2006-06-11 +Guilhem Bonnefille : + * NEWS, configure.ac: Preparing 0.1.1 + +2006-05-25 +Alex Foobarian : + * Cleaned up the data source interface + * Added a setup dialog to the GPS data source, with protocol type and serial port location + +2006-05-12 +Alex Foobarian : + * Small fixes in Acquire from GPS code + +2006-05-08 +Guilhem Bonnefille : + * autogen.sh: simpler method to start from CVS + +2005-12-03 +Evan Battaglia : + * Data sources -- check for existence of necessary things + +2005-11-25 +Evan Battaglia : + * Created "data sources" structure to easily add new data sources via GPS babel. + It's ugly now and there's a lot to be done, but I think 79-line datasources_google.c + shows the power of the approach. + * Data sources: Google & Geocaches + +2005-11-23 +Guilhem Bonnefille : + * src/gpx.c (gpx_dtostr): add better GPX export +Evan Battaglia : + * dtostr -> coords.c; use in gpsmapper.c and gpspoint.c (locale-independent output) + +2005-11-21 +Alex Foobarian : + * Fixed v-t diagram crash bug + +2005-11-19 +Alex Foobarian : + * GPSBabel acquire code + +2005-11-18 +Alex Foobarian : + * Copy/paste of individual track- and way-points updated to work between processes. + +2005-11-17 +Alex Foobarian : + * Copy/paste between viking processes + * Layer marshalling support + +2005-10-28 +Guilhem Bonnefille : + * configure.ac: Adding --with-mapcache configure option + * src/config.h: Removed because no more used (generated) + +2005-10-18 +Alex Foobarian : + * Fix ruler declination in UTM mode + +2005-10-17 +Guilhem Bonnefille : + * src/icons/Makefile.am: assumes the creation of icons.h + * src/garminsymbols.c, src/vikwindow.c: icons.h re-located + * src/Makefile.am: no more icons.h production + +2005-10-16 +Evan Battaglia : + * Fix ruler: show angle, distance even when compass off-screen. + * Fix bgitemcount. Background items status bar "should" be accurate now. + +2005-10-13 +Alex Foobarian : + * Drag and drop whole track/waypoint lists + +2005-10-12 +Alex Foobarian : + * Coord layer drawing for lat/lon based projections + +2005-10-11 +Alex Foobarian : + * Draw a compass when using a ruler + +2005-10-07 +Alex Foobarian : + * Added ruler drawing to the ruler tool + +2005-10-06 +Alex Foobarian : + * Added support for pasting coordinates in lat/lon format + +2005-10-05 +Alex Foobarian : + * Change clipboard so as to use GTKClipboard. Prepare for support for pasting coordinates, etc. +Evan Battaglia : + * When pasting waypoints and tracks, do name resolution (add #2, etc) + +2005-10-01 +Evan Battaglia : + * make symbols work for geocaching .loc files (and case-insensitive symbol names) + * Option as to whether or not to show unit scale (esp for exporting images) + +2005-09-30 +Guilhem Bonnefille : + * configure.ac, src/Makefile.am (SUBDIRS): added auto-tools support for src/icons +Alex Foobarian : + * Added a drag_drop_request method to layer interface, updated DnD to use it + * Updated DND to insert layers at the point of the drop, instead of front of list + * Added wp symbol support to gpx + * Fixed name collisions during track/wp DND + * Layer-wide option as to whether to show waypoint symbols + +2005-09-29 +Alex Foobarian : + * Added support for waypoint symbols (changing, loading, saving), and a small number of icons. + * Added a scale ruler + * Changed panning to show less "garbage" in exposed areas + +2005-09-28 +Evan: + * menu.xml & icons inline + +2005-09-27 +Alex Foobarian : + * GtkUIManager/Toolbar + * DND in the LayersPanel +Evan: + * strtod -> g_strtod (i18n glitch) + +2005-09-25 +Guilhem Bonnefille : + * src/globals.h (VIKING_VERSION): uses the PACKAGE_VERSION macro + * Makefile.am (EXTRA_DIST): handles viking-remote + * src/Makefile.am (AM_CFLAGS): substitution of CFLAGS by AM_CFLAGS + * doc/Makefile.am, doc/dev/Makefile.am: new files + * Makefile.am (SUBDIRS): handles doc directory + * configure.ac: handles doc and doc/dev directories + +2005-09-16 +Alex Foobarian : fix to v-vs-t (better drawing) +Evan: * GPX fixes + * So Geocaching .LOC _isn't_ GPX?!?!? Oh well, it's XML... + * GPX write, click v-vs-t diagram + * Option to show stops in TRWLayer options, and stop_length + * Elevation plotting relative to min and max elevation in track. + * Option to do elevation plotting, and controlling relative height + +2005-09-15 + * 4+ hours later and voila, GPX read support + * Fixes in propwin if track doesn't have certain data, say so. + +2005-09-14 +Me (Evan) again: + * Fix USGS support + * Click on the elevation map to go there, so you can see where a mountain-top is etc. + * Don't crash on track properties of an empty track. + +2005-09-13 +Guilhem Bonnefille : + * bootstrap: new file to bootstrap auto-tools + * src/config.h (VIK_CONFIG_ALPHABETIZED_TRW): no more set via this file + * Makefile.am (bin_SCRIPTS): viking-remote added + * configure.ac: --enable-alphabetized-trw option added + +Evan Battaglia : + * Experimental altitude funky plotting I'm working on + +2005-09-12 +Alex Foobarian 's changes +* disable stops, for now (I forgot about those...) +* Track elevation graph: minimum altitude difference for less jagged curves +* Track elevation graph: gray background, blue foreground +* Track elevation graph: lines to clearly show absolute elevation +* New velocity-vs-time graph & calculating function +* Notebook to hold this new graph with track elevation graph +My (Evan's) changes: +* Fix above v-vs-t patch to not crash on tracks without timestamp. +* Not show v-vs-t graph and/or elevation map if the necessary data isn't there. +Guilhem Bonnefille 's changes + * bootstrap: new file to bootstrap auto-tools + * src/config.h (VIK_CONFIG_ALPHABETIZED_TRW): no more set via this file + * Makefile.am (bin_SCRIPTS): viking-remote added + * configure.ac: --enable-alphabetized-trw option added + +2005-09-07 +Autotools support by Guilhem Bonnefille. + +2005-09-06 +Added Alex Foobarian's track duration patch. +Added Alex Foobarian's track profile patch. +Added Alex Foobarian's elevation map fix. + +2005-09-04 +Map cache fix: if only one map can fit / one map is bigger than cache size, then that's OK. +Delete from cache when updating image. + +2005-08-18 +Map cache size based on memory usage, not number of images. Some flaws to be worked out still in this. + +2005-08-16 +Accepted USGS maps support from Clark McKines. Pretty slick, I'll have to take a look at it. + +2005-08-02 +Quite easily added support for Mercator projection & Google Mercator maps (regular, transparent etc) +Chaned waypoint types a little bit (size of waypoint) + +2005-07-31 +Hopefully fixed background.c item # count +Fixed KH Maps (v=2) + +2005-06-20 +A little research & added KH Maps support. + +2005-06-19 +Fixed right-click waypoint edit -> crash bug, hopefully. +Fixed "everyone lives in zone 11" assumption for vikgeoreflayer.c; still monozone though ... +Made it so when you paste or add a new layer, it pastes it before the selected layer, not to the top. +Fixed the bug where pasting a map layer messed up the name. +Made dragging middle mouse button pan. Removed pan tool. Thanks Reid for the idea. +Made different options for drawing waypoint dots. Not very good but we can make better-looking ones later. +Side view of tracks la Garmin MapSource, nice ... +Fixed Google street maps simply by changing "v=.1" to "v=.3" ; the newest version of gmaps is completely different, I'm unsure how long this will work for. + +2005-05-05 +Experimenting with stops + +2005-05-01 +Fixed cheap ruler bug (use ruler, change draw mode, use ruler, crash). That's really not good... but hey, it _is_ alpha software. + +2005-04-24 +Added "how many maps currently downloading" status bar hack + +2005-03-11 +What the heck? Viking-remote didn't work? Fixing --/- stuff. Also fixing hang if can't open. Did this by putting gdk_threads_enter() before file opening in main.c. +Update viking-remote to work _right_ with maps, also geo://GC1234/ works, nice... + +2005-03-08 +Uffda, I forgot Oggdeir's gpsmapper.c patch. +Also fixed Windows compiling. + +2005-02-28 +Fixed Windows compiling, hopefully. +Removed TopoZone support per topozone.com request. + +2005-02-27 +Instituted a really nice background downloading system with a separate system, works like a charm. +Fixed (hopefully) a bug where a download failed the filename wasn't deleted, leaving an empty file. +Misc cleanups/testing surrounding downloading. +Autodownload +Fix other stuff, including moving a waypoint (delete while moving -> crash) + +2005-02-26 +X and Y zoom levels for maps so factors don't have to be equal. +Fixed maps zoomed out, added an combo box for it by adding a combo box in viklayer.c, fixed maptype to use map id and not internal array index +Changed VikTrwLayer properties dialog to add an image tab, fixed GtkTable layout so as not to stretch out stuff in the y direction. +Fixed /var/cache/maps stuff +Safety for maps zoomed out +Fixed mapzoom for cases where factors aren't equal +Got the basic download in background code on, now just minor nicities +Got the genius idea that someone might want to open up more than one file at one time ;) + +2005-02-25 +No time tonight, gotta get some sleep. Did work on hooking up Google Maps with GPSBabel's module into viking with a wget & a sed command. Totally awesome. +Also, added support for the highest google zoom level which I didn't know existed. + +2005-02-23 +I'm not really supposed to be working on this ... but it get's addictive, so close to a release... +Added back alpha support. It works for all map types now. Mostly useless for other types, unless you want to see tracks under your map, since you can't show more than one non-Terraserver map at the same time. +Started work on maps for different zoom levels. You can do all different maps at all different zoom levels, even zoom in. Don't zoom in with expedia maps though, it could create a 2000px x 3000px size image or so, and cache up to 10,000 of those. Yeah. + +2005-02-22 +Made it easier to use all these maps -- switching between them, correct zoom levels, etc. +Expedia for Europe (thanks GPSDrive people again) +Kit Transue's UTM zone patch is back in for the new MapLayer. This marks the first time I have seen cross-UTM zone Topozone maps. Interestingly enough it seems that they patch the maps together. Viking messes this up a little bit but in general it works fairly well. I'm still amazed it's possible ;) +Minor cleanups etc. + +2005-02-21 +Tons of work today, too much to list really. Basicly I threw away VikMapLayer and started over. This one's nice, really easy to add new types. Google, Expedia, and Terraserver maps are now functioning, but the layer isn't completed yet, many things such as alpha, download in the background, etc. aren't quite there yet. +Topozone support, heh ;) Of course none of these maps can be used together. Especially since scaling isn't done yet. I'm also going to have to create some handy ways to switch between layers. + +2005-02-20 +Finally got the brilliant notion that a GSList isn't the smartest way to do memory map caching. In fact it's probably one of the stupidest. Increased speed (when all maps loaded) by 30x or so by using a GHashTable shared between layers. How much of the slowdown was accumulated somehow since 0.0.8 is unknown. +New map caching file naming scheme. Hierarchial directory structure for faster lookup. +Tweaked the above memory caching scheme to use a linked list in conjunction with a hashtable to allow for a maximum size limit to the cache. Currently you have to edit the file to set this upper limit. And it's in tiles -- doesn't matter the size of the tiles. +Added some code in http.c of all places to make 2 directories above if they don't exist (new caching filename scheme) + +2005-02-19 +Fixed params[3] -> params[2] l1738 to fix click image +Fixed delete a waypoint->crash bug +Fixed TOPLAYER_FROM_WIDGET() error on right click wp -> properties (no VLP to use this on; use FROM_LAYER()) + +2005-02-18 +Wow, Haven't worked on this in a while... +Sorry, just adding a hack to allow me use mapzoom at 0.25 quality. + +2005-02-02 +Changed pan, a little bit, to move the map. Not good enough though, it leaves behind stuff now. Couldn't get it to not flicker, and run at a decent speed. + +2005-01-29 +Fixed waypoint pango drawing. +Compatibility layer for GtkColorButton to use an entry for GTK 2.2 +Move Waypoints by dragging +Snap to WP (shift-) for TP & WP moving. Snap to TP (ctrl-) for WP moving and still TP moving. +Select WP on the side when editing (if the layer is selected that is) + +2005-01-28 +Changed over to Pango, finally. Just experimentally so far, though; gotta cement it and fix it over. +Changed the properties/parameters system to allow tabs (groups) in properties boxes. +Tracks & waypoints now alphabetized! Three cheers! I can't believe how relatively easy that was. Two new functions in viktreewview.c and two more lines of code in viktrwlayer.c, I thought it was going to be hard for some reason... +Added a GtkColorButton thing for layer properties. This officially boosts the minimum requirements to GTK+ 2.4. This shouldn't be too much of a problem since 2.6 is out already. +Settable waypoint background & text colors. Different ones for different layers is incredibly snazzy. +Settable track bg color. Also fix some switch/case stuff... forgot to break... +So you can do plain transparent (no WP background) by choosing white and selecting color translucency... Not exactly clear. But wow, these colors are looking really awesome. + +2005-01-23 +Expedia maps working now. Don't *exactly* match up on the top and bottom sides, but I'm not sure I can get much better. Good enough. More fixes, added autodownload (thought that was already in here? maybe only in my topozone version). +Fixes, lots of small stuff -- e.g. a bug I introduced where it wasn't getting the correct utm zone for terraserver maps when downloading. +Fixed a weird GTK bug where updating the coord mode menu radio button would change the coord mode. See only_updating_coord_mode_ui +Implemented "invisble auto-downloads". Thought up a new way of doing downloads -- a queue and only one other process -- but probably won't implement that for a while. +Wow, auto-download + street maps is really neat! + +2005-01-22 +Working on implementing Expedia maps .. Lots of stuff, had to change HTTP to hande forwarding, that took a while just to test. Had to restructure some vikmaplayer code to know about expedia maps and download differently. LOTS more to go however. It now downloads maps, but that's about it. Lots of work to go. +OK, now it cuts off the sides (ads) and stuff. Snazzy. I made a test "draw" function but it isn't working perfectly yet. It is working and piecing together maps though. They look OK pieced together but street names are messed up at borders sometimes to I'm going to make the pieces bigger. +Did I mention it draws the maps in the wrong places? + +2005-01-21 +Many little things tonight: +Much cleaner way of doing alpha/bleach. Slightly less functionality (can't do bleach and alpha) but cleaner and should be faster. +Made it so it saves coordinate mode in the .vik file. +Made it so you can change the background. Saves this to the .vik file. +White background under tracks. Inefficient but it works. + +2005-01-20 +Added support for Urban Areas color photograph maps from TerraServer. +Just a note: TopoZone isn't going to work. I had added support for it in my own prviate version, and used it happily for areas where TerraServer was messed up. But one day it didn't work. They changed their site so it's hard (if not impossible) to get to the image directly. I could always do indirect, though ... + +2005-01-17 +Made it so you can change modes +Optimized a little tiny bit, drawing still slow +GREATLY Improved UTM drawing speed by remember zone width in VikViewport. I think kit meant to do that, there was a zonie_width item in VikViewport; it went unused. +Re-instituted UTM ce1, cn2, etc. checks that went out the door when multiple zones became available. It now does these checks only if UTM is used and there is one zone. Performance is now comparable to 0.0.5 speeds. +Fixed minor UTM 2 zones bug I (apparently) introduced above where some things are on zoom. + +2005-01-16 +Added "Visit Geocache Webpage" right-click waypoint option. Not very useful until I can click on waypoints, though. + +2005-01-15 +Started massive UTM -> VikCoord abstraction project +Wow. +Biggest. Change. Ever. +Worked on it about 5 hours. It seems to be going excellent! Most UTM's have been made into VikCoord's, except for some things like VikCoordLayer which I simply disabled. I just plugged in the Lat/Lon coord to screen code and it works! Now I have to work out all the bugs, add a change coordinate / conversion system, and fix a lot of stuff. WOO HOO!!! +Update: added coord_to_screen and screen_to_coord for Lat/Lon. works FLAWLESSLY!!! AWESOME!!! + +--- viking 0.0.8 --- + +2004-12-25 +Added UTM zone glue-together by Kit Transue +Fixed various things regarding this patch (distance, lines, etc.) +Packages & uploaded changes + +2004-11-27 +Back, but not really ... +Added a fix by Peter Jones (gpspoint.c glitch) +Added CYGWIN/Makefile fixes by Alex Stohr + +--- viking 0.0.8 --- + +2004-04-13 +Back from a 3-day GPS data gathering mission. +Fixed bug wherein track GC's weren't getting updated when line_thickness was updated. +Only waypoints and trackpoints if they're in the right UTM zone. +Use g_spawn_command_line_async for showing pictures; support for Windows for this too. +Rather drastically changed background.c so as not to use pthread's detach() and cancel() functions which are strangely absent in gthread. +Changed background.c to gthread. +Auto-switch UTM if you go too far. +Draw little star on tracks if it was cut off due to UTM zones. +Show human-readable time in trackpoint window. +Fix trackpoint window so as to not show time of '0' if the TP has no timestamp. +I didn't want to take this long with 0.0.8. 0.0.7 was released in just 27 days but 0.0.8 took 50. Oh well, I'll have to work doubly hard for 0.0.9. Here is Viking 0.0.8 all. Enjoy. + +2004-04-09 +Prevent loading partially-downloaded file by first writing to a temp file and them writing that data to the image file. +g_error_free () where neccessary. +Changed "Map Download All" to clearer, more direct and generic code. +Very easily used this code to make downloading lots of maps with the "map download" tool. Just drag over the square you want to download. +Added map size parameter. Had to change viklayer.[ch], add an extra_widget_data field in the param struct and change viklayer.c to support different uint values for options + +2004-04-08 +Some experimental work with maps at a different zoom level (e.g. 4mpp maps viewed at 16mpp) + +2004-04-04 +Load thumbs in a background thread. Thumbs show up as soon as they are loaded and you redraw. +Cleanup function for maps so incomplete map downloads will be deleted, woo hoo! +Snap to TP for edit TP and new track. Hold down control. +Added Max Speed, Average Speed, Average Dist Between Trackpoints in track property window. +Added "Diff Speed" in TPWin so you can tell speed between one trackpoint to the next. + +2004-04-03 +Put maps in a background thread while updating the UI, but you can still use viking. I have to duplicate all necessary data passed to the thread (what threads to download and where) in case that layer is deleted. I still have to a couple things (actually canceling the download operation) but it works very nicely, I can download lots of maps at the same time! It feels very liberating... +Right click to redownload a map. Regretably some messed up maps have been showing up with the above method, it's a big mystery how exactly... +Did a little test: disconnected my Internet connection and tried to download a map. Viking hanged for 22 seconds. I consider that acceptable, for now at least. + +2004-04-02 +Fixed trw_layer_new_track_gcs getting called twice -- post_read link and in vik_trw_layer_create +Just got finished loading thumbnails in the background. Aye, what a bother. But it works nice. (However once I got it to crash with an Xlib async error? Sigh, that's not good...) + +2004-03-31 +Added support for clicking images to show it, using eog -- this currently cannot be changed. (!) + +2004-03-23 +Fix crash on export code (Mike Davison) +Use $VIKING_MAPS for default map directory if available (Mike Davison) + +2004-03-08 +Move image to use when alpha drawing to VikViewport. That simplifies a lot. +Little changes, here and there. Lots of options for images. + +2004-03-07 +More work on dynamic Properties boxes, it will make adding new options _so_ much easier... +A lot of work on this. Wow, Viking is getting big. And ugly. +Also fixed a bug similar to another old bug -- forgot to copy waypoint image filename when a waypoint is copied. +You can now choose the image size, via the new dynamic properties box. + +2004-03-06 +Fixed a dumb bug that prevented you from opening GPSPoint files after Viking files. +Working on dynamic Properties boxes, getting nowhere fast... + +2004-03-05 +Wrote a tiny bit of code to further shrink and cache thumbnails. + +2004-02-29 +background.c to use pthread to run stuff in the background (think -- downloading maps) and give a dialog to cancel (d'uh!) +The ability to use pthread opens up a lot of possibilities about how to handle map downloads. For instance, you could have a little dialog where you have different groups of maps downloading. Lots of possibilities, I just have to think about how I want to implement them. + +2004-02-28 +Lately I've been working on a GUI tool written in Python to link up pictures and track logs to figure out where a picture was taken. That's my excuse, anyways, for not working on Viking. +Thought a little bit about how I'm going to do pictures in Viking. Looked over ROX-Filer's thumbnailing code. +Added a bit of picture thumbnail code. You can now see photos in Viking. + +--- viking 0.0.7 --- + +2004-02-22 +Fixed edit TP, then rename track -> updates current_tp_track_name glitch. +Took quite a bit of time to change the way tools work. Instead of returning TRUE to redraw, tools return TRUE if they "accept" the tool call. If they don't, then it will look for another layer that will accept the tool call. That way you can edit trackpoints on different layers. It's nice, actually. +Fixed "edit layer name, then move it" bug the crept in somehow. It wasn't in 0.0.5-pre4, but I don't see any differences in the code, oh well, fixed it this time. +One month and almost 4000 LOC later... Viking 0.0.7 "Gonna Move Those Mountains Aside" + +2004-02-21 +Fixed track join deleting problem mentioned yesterday by keeping track of individual GtkTreeIter's for all tracks in a hash_table. Whenever a track is added/realized it's iter is added to the hash. Actually a rather pleasant (and fairly easy) solution. This simplifies deleting tracks in other places too, since we now don't need to know the iter. +Very easily made it so that when you edit a trackpoint it selects the appropriate track in the layers panel. Press Shift+10 for fast deleting. Evidently the tracks list must be expanded. +Fixed last_tpl (VikTrwLayer) / cur_tp (VikTrwLayerTpwin) confusion. +Changed split up track to change current tp to first of new track rather than last of old. +For some reason I felt I needed to add a thing in track properties which would count the number of duplicate TPs (same coords, one after the other) and make a button to remove them. +You can now change latitude, longitude, and altitude of each TP in the track window. Good for setting exact location rather then moving. +Added _real_ transparency support. I've tried before, but this time it actually wasn't hard it all. It was harder adding the UI stuff and layer attribute and all that. Anyway it might be a tad slow wise but it looks FANTASTIC! +Fixed open and save dialogs (including VikFileEntry, but excluding render to image and export as gps* dialogs) so that the dialogs are not deleted and created each time but the same one is used. This means that it will stay in the same directory. +How does a release tomorrow sound? + +2004-02-20 +Can't seem to find the time for Viking these days. Today I managed to get a little work in. +I did manage to add support for moving trackpoints. It's awesome. You just choose the edit TP tool, select a TP, and drag it. +After experimenting with arcs (arrows) for TPs (it didn't work), I changed track drawing to draw a triangle for the startpoint and a circle for the endpoint. +OK, So you can now join tracks (kind of ugly solution, but that was how it worked out), but the really ugly part is that it won't show up as deleted in the layers panel, and to make it do that, I need the track's layers panel Iter which I don't have from the tpwin. I sense major hackage ahead. + +2004-02-16 +Thursday through Sunday was another "data gathering mission". I also though up a _lot_ of great ideas for Viking. Now I just have to find the time to implement them all. +Today I added support in file.c for opening from stdin, aka "-". I also changed the magic number determining code to use ungetc() rather than rewind() so it will work correctly with stdin. +Not part of viking, but I wrote a quickie viking-remote script. + +2004-02-10 +Gotta get back to work. Sigh. Saturday and Sunday I went on a "data gathering mission", so there's my excuse. Yesterday I was away hacking on gpsbabel to support gpspoint (Viking) files. +Fixing little tiny things, like making the tpwin not close when you delete a waypoint, fixing little mistakes in trwlayer, graying buttons, etc. +Added little things to tpwin -- forward, previous, diff, makind diff work for delete button, etc. +Added a_coord_utm_diff for tpwin diff & ruler tool & track length +Added a_dialog_create_vbox_label function, converted vik_trw_layer_tpwin_new() +Added track length, tp count, segment count in properties box +Fixed if try to rename waypoint or track to one that already exists, crash bug (had to uppercase user input) +Added split up into segments. Had to change a_dialog_new_track, do above change, and a million other things. Sigh. +Fixed split up segments so it first makes a copy, then deletes the old copy. That way if the track was on the clipboard you can paste to get the original track again. Nifty eh? +Added reverse track. +That's all folks. I'm a-goin to bed. + +2004-02-06 +Just got through fixing the hardest-to-track-bug I've ever tackled. Viking would crash when I copied a +pasted a layer in a certain file, but it seemed fairly random and gdb's backtraces were no help because +it was crashing on totally unrelated things (free'ing memory twice does weird things). I finally narrowed +it down to do a certain sequence to give me the warning: viking in free() chunk already freed, etc. Then +I used step (starting from vik_trw_layer_free) to determine exactly where it was free'ing something +twice. It was the waypoint comment. I noticed comments were different from the original waypoint (on the +original layer that had been copied) so I tried stepping thru vik_waypoint_copy to see whether the +waypoint was being copied correctly. It was then when I something wrong. I had assigned one waypoint to +another, then called the function vik_waypoint_set_comment(), which, upon seeing that the comment of this +new waypoint was not null, proceeded to free it, whilst the old waypoint still carried that comment +pointer around. The ironic part is one line of code (new_wp->comment = NULL;) fixed everything. + +Well, glad to get that out of the way. Now I can proceed to work on new stuff. + +I also made sure to delete the trackpoint window if the track gets deleted. +The long-awaited SPLIT UP TRACK is finally in Viking. Goodie. + +2004-02-03 +Set up signals for VikLayer. Constructed a super-cool yet slightly-slow chain of signals using VikAggregateLayer. It's wacky. +All my hard internal work has finally payed off. I just added code for deleting trackpoints. It works, the signal is given to update and all is good. Yay. + +2004-02-02 +Back to work. I hit a snag and had to switch VikLayer to a GObject to give off signals for updating for the track editing tool. + +2004-01-30 +Very very small amount of code to report export image write errors to stderr. +Some various work on track editing: + Made another file/class viktrwlayer_tpwin.c + Added labels to show info when you click a trackpoint + Made it draw a big TP for the current TP +I don't know why it's not in this ChangeLog, but some experimental Track[point] "editing" (realling finding) support was already there: the tool, the code for finding the nearest TP, and a line of code showing a dialog with the buttons which would be useful (I obviously did some planning.) +Oh, Also, cut and paste waypoints support has been in for quite a while, before September, I'd say, somehow that escaped this log. +Anywho, the road looks clear as to how to procede with respect to track editing: make sure to reset current_tp if track is deleted, add on features, etc. + +2004-01-29 +Added a little thing to tell you how much are the map(s) will cover. +FINALLY fixed coord layer so it shows ALL necessary coord lines (it actually checks your zoom level now!!!) + +2004-01-28 +Slowly added "Generate directory of Images" support. +Fixed pan tool. + +2004-01-27 +You can now choose the name of the image to export to, choose the zoom level, and choose to get everything in the current viewing window. +Also took 15 minutes to add a pan tool. +Also made it remember your choices of width and height and image format for draw to image file. + +2004-01-26 +I'm celebrating Australia Day by working on the Vik for the first time in ... My fingers don't go up that high, anyway. +Adding code for exporting to image. + +2003-9-22 +Took a short two month break. Hehe. +Finally got around to checking whether server returns "200". Sometimes terraserver has erras. + +--- viking 0.0.5 -- + +2003-7-15 +Simplified vikfileentry.c by using gtk_dialog_run +Loading from World files +Saving to World files + +2003-7-14 +Map Layer -- default cache directory ~/.viking-maps (on UNIX) or C:\VIKING-MAPS (on Windows). This way people don't have to worry at all about cache directories, they can just use the default and it will automatically be created. +Create default cache directory if it doesn't exist. Automatically add file separator on cache directory name. +Don't write cache directory name to Viking file if it is default; if no directory use default (that way people can share files without having to worry about someone elses cache directory) +Readability/Naming: InitGcs -> PostRead + +2003-7-11 +More work on GeorefLayer. It's now pretty much working. +Made vikfileentry.c, changed vikgeoreflayer and vikmaplayer to use it. + +2003-7-10 +Changed zoom to two variables -- xmpp and ympp and implemented necessary changes in the layers. +Added a "Goto Any Zoom" kind of dialog/function. +Changed status bar a tad to reflect this. +Started some work (mainly UI/semantics/program interface) on GeorefLayer. Will make it actually do something later. + +2003-7-09 +Changed zoom limit from 32 mpp to 512 mpp. +Changed zoom to a double to allow any zoom level. + +2003-7-07 +Sorry ... "Real Life" (tm) has been taking up a lot of time lately. Anyway today I managed to implement track visibility in Viking GPS files. + +2003-6-27 +Don't show an empty menu for a sublayer if it doesn't add anything to the empty menu +Little bugfixes + +2003-6-26 +Put all file stuff in one file. +Removed old binary fileformat support. 3 days of work deleted in no time. +Track -> VikTrack, Waypoint -> VikWaypoint, Trackpoint -> VikTrackpoint, vikwaypoint.c, viktrack.c +Comment support, comment support for gpsmapper export +Comment for gpspoint, backslashed quotes, etc. in comment in gpspoint.c. Lot of work... I could easily backslash track/wp name, but they usually dont have quotes in +OK, I've been programming for over 4 hours. Break time. +OK, back to work. Comment support complete, I've also added altitude output support for gpspoint. +Switched various button order around in dialog.c to comply with HIG +Track undo support. Double-click to end, right click to undo. Crazy day, huh? + +2003-6-25 +Support for reading map and trackwaypoint layers. Also support for trackwaypoint data (in GPSPoint format) +Whew! Write support is complete! Man, that's a lot of work. Now I just gotta iron out any wrinkles (such as getting rid of old file format support) + +2003-6-24 +Half hour's worth of coding has made copying and pasting TrackWaypoint layers a reality. +Started working on FF2. TODO: implement individual layer getters/setters functions, write support +I've done an incredible amount of work today. +Mission: By the weekend I must have FF2 support out the door. + +2003-6-23 +Created Viking 0.0.5 branch. +Started work on copy & paste layers. With just two hours or so worth of code, you can now cut, copy and paste coord and map layers and aggregate layers made up of these. +You can even copy and paste between windows. +Next up -- trackwaypoint layers, then we're off to copying items. +Onward -- 0.0.5! + +--- viking 0.0.4 --- + +2003-6-23 +Viking 0.0.4 "Lame Duck Release" +Alright, I haven't been doing anything for the last two days. Guess I'll just release what I have... + +2003-6-20 +Added GpsMapper export support to make it easy to make Garmin maps. +Made it so you can now rename tracks. +Implemented map fade into white (alpha)! This should help distinguish tracks while still seeing maps. + +2003-6-19 +Fixed a map caching problem that occurs when you lower the size of the memory cache (it won't really be lowered). +Started experimenting with map semi-transparency. It's pretty cool. + +2003-6-18 +HIG document compliance (Open, New, Close, modified flag, etc.) I probably won't be making a "Exit" menu item, because that is the dumbest and most confusing aspect of the HIG. +Tearoff item for tools. +Made a_file_basename and replaced all places where I previously just copied and pasted the code. +Fixed _another_ "forgot to initialize" bug (layer.realized) +Simplified interface by having one Open menu item for opening any type of file and an Append menu item to do the same +In doing this, "./viking my.vik my2.vik my.gps my2.gps" etc. now works (concatenates into an unamed file.) +Removed "Properties" from Aggregate Layer popup, and added info message when running "Properties" from the Layers menu on an Aggregate +Provided a info message that tells the user the Top Layer cannot be deleted. + +2003-6-17: +Added error message for failed writes, fixed various bugs such as not free()ing any of the layers on exit (!) +Also fixed some crashes such as when you try to export a trw layer and you can't write to it. +Fixed button order in model dialogs to comply with GNOME HIG. +Added a "Delete All Layers" item from the menu. Change menu names a little bit. +Added "Save" support (current filename) +Started thinking about HIG compliance in the way of documents. Will probably get rid of delete all layers and add new, open (in new window) + +2003-6-16: +Added VikTrwLayer serialization support, added "open" and "save" dialog boxes. +Added error messages for failed reads, etc. + +2003-6-15: +More serialization work. The basics are now working, I have to add VikTrwlayer, maybe add some things in to make +it less vulnerable to crashes and really big mallocs(), and maintain compatibility between versions. + +2003-6-14: +Got some more sample data for Viking via motorcycle riding ;) + +2003-6-13: +Fixed serious glitch that crashes on creating a new track. +Fixed viking crash that happens when a new track is being created, then deleted. +Designed file format & started on serialization of layers. +Moved Layer Icon loading stuff to VikTreeview, as poor designed as it sounds, to get ready for Serialization code. + +2003-6-12: +Viking 0.0.3, first public release diff --git a/HACKING b/HACKING new file mode 100644 index 0000000..fb73cba --- /dev/null +++ b/HACKING @@ -0,0 +1,89 @@ +This file is meant to summarize the Viking development policies. + +#### +#### Also check information in the Wiki: +#### http://sourceforge.net/apps/mediawiki/viking/index.php?title=Main_Page +#### + +Clean commits +============= + +Commits/patches should be as fine-grained as possible (and no finer). Every +distinct change should be in its own commit and every commit should be a +meaningful change on its own. + +Preferred Code Contribution Methods +=================================== + +Since the project uses git for source control, patches that utilize git (especially for patch sets) are preferred in this order: +* Commits pushed to a publically accessible git host (e.g. GitHub, Gitorious, etc...) + - This enables commits to be easily managed such as pulling, merging or cherry-picking +* Email git diffs to the dev mailing list - use 'git format-patch' method +* Plain diffs can be emailed to the dev mailing list and/or stored in the SourceForge Patch Tracker for Viking. + +Coding style +============ + +Naming: +A "module" is a .c file. + +Functions starting with "vik_" operate on an object/structure with the +module name (see layer.c for an example). Functions starting with +"a_" do not, these modules may have static variables. Both are +followed by the module name. Unless of course the function is static, +in which case it may be called anything. + +All (well, practically all) global constants and macros start with +"VIK_" and then the module name. + +Coding Checks +============= + +Code should compile with the minimum number of warnings (ideally none). + +Code should pass static analysis with defaults for 'cppcheck' (http://sourceforge.net/projects/cppcheck/) with no errors. + +ATM there is one deliberate error in vikgpslayer.c designed to prevent building if the code encounters a GPSD version we don't handle. Something like: +[vikgpslayer.c:1479]: (error) Invalid number of character ({) when these macros are defined: 'GPSD_API_MAJOR_VERSION;VIK_CONFIG_REALTIME_GPS_TRACKING'. +This can be 'hidden' via cppcheck --suppress syntax. + +Technical notices +================= + +In order to activate reference documentation, you have to specify the +following configure command line: +$ ./configure --enable-gtk-doc --enable-gtk-doc-html + +Then, cd to doc/reference and launch make command. + +--- + +The layers panel holds all the layers. Layers connect to the layers +panel via what I call "interfaces" which are really just a structure +of function pointers and pointers to other bits such as +icons. viklayer.c switches between the layers like +polymorhpism. Anything specific to the layer should (in theory) be +found solely in that layer's source file. + +There are some ugly hacks in here, like the layers panel holding the +viewport and each layer holding the viewport and a +GtkTreeIter. Unfortunately it was the only way I could figure out to +do some things. It would be _much_ easier with a object-oriented +language. + +--- + +"xmpp" and "ympp" are really misnomers, as they only represent the +Meters Per Pixel in UTM mode. Otherwise they are an artificial zooming +system. In expedia mode it represents the "Alti", in Google mode it +represents 2^(scale), e.g. 2^0 = 1, 2^8 = 256. + +--- +Implementing a MapSource + +VikMapSource is the "interface", the really base class of the +MapSource tree. In order to implement a MapSource, you have to prefer +to derive from VikMapSourceDefault, a less abstract class, adding a +property based implementation for some aspects of the VikMapSource +interface. Then, you have to provide implementation for +coord_to_mapcoord, mapcoord_to_center_coord and download methods. diff --git a/INSTALL b/INSTALL new file mode 100644 index 0000000..8865734 --- /dev/null +++ b/INSTALL @@ -0,0 +1,368 @@ +Installation Instructions +************************* + + Copyright (C) 1994-1996, 1999-2002, 2004-2016 Free Software +Foundation, Inc. + + Copying and distribution of this file, with or without modification, +are permitted in any medium without royalty provided the copyright +notice and this notice are preserved. This file is offered as-is, +without warranty of any kind. + +Basic Installation +================== + + Briefly, the shell command './configure && make && make install' +should configure, build, and install this package. The following +more-detailed instructions are generic; see the 'README' file for +instructions specific to this package. Some packages provide this +'INSTALL' file but do not implement all of the features documented +below. The lack of an optional feature in a given package is not +necessarily a bug. More recommendations for GNU packages can be found +in *note Makefile Conventions: (standards)Makefile Conventions. + + The 'configure' shell script attempts to guess correct values for +various system-dependent variables used during compilation. It uses +those values to create a 'Makefile' in each directory of the package. +It may also create one or more '.h' files containing system-dependent +definitions. Finally, it creates a shell script 'config.status' that +you can run in the future to recreate the current configuration, and a +file 'config.log' containing compiler output (useful mainly for +debugging 'configure'). + + It can also use an optional file (typically called 'config.cache' and +enabled with '--cache-file=config.cache' or simply '-C') that saves the +results of its tests to speed up reconfiguring. Caching is disabled by +default to prevent problems with accidental use of stale cache files. + + If you need to do unusual things to compile the package, please try +to figure out how 'configure' could check whether to do them, and mail +diffs or instructions to the address given in the 'README' so they can +be considered for the next release. If you are using the cache, and at +some point 'config.cache' contains results you don't want to keep, you +may remove or edit it. + + The file 'configure.ac' (or 'configure.in') is used to create +'configure' by a program called 'autoconf'. You need 'configure.ac' if +you want to change it or regenerate 'configure' using a newer version of +'autoconf'. + + The simplest way to compile this package is: + + 1. 'cd' to the directory containing the package's source code and type + './configure' to configure the package for your system. + + Running 'configure' might take a while. While running, it prints + some messages telling which features it is checking for. + + 2. Type 'make' to compile the package. + + 3. Optionally, type 'make check' to run any self-tests that come with + the package, generally using the just-built uninstalled binaries. + + 4. Type 'make install' to install the programs and any data files and + documentation. When installing into a prefix owned by root, it is + recommended that the package be configured and built as a regular + user, and only the 'make install' phase executed with root + privileges. + + 5. Optionally, type 'make installcheck' to repeat any self-tests, but + this time using the binaries in their final installed location. + This target does not install anything. Running this target as a + regular user, particularly if the prior 'make install' required + root privileges, verifies that the installation completed + correctly. + + 6. You can remove the program binaries and object files from the + source code directory by typing 'make clean'. To also remove the + files that 'configure' created (so you can compile the package for + a different kind of computer), type 'make distclean'. There is + also a 'make maintainer-clean' target, but that is intended mainly + for the package's developers. If you use it, you may have to get + all sorts of other programs in order to regenerate files that came + with the distribution. + + 7. Often, you can also type 'make uninstall' to remove the installed + files again. In practice, not all packages have tested that + uninstallation works correctly, even though it is required by the + GNU Coding Standards. + + 8. Some packages, particularly those that use Automake, provide 'make + distcheck', which can by used by developers to test that all other + targets like 'make install' and 'make uninstall' work correctly. + This target is generally not run by end users. + +Compilers and Options +===================== + + Some systems require unusual options for compilation or linking that +the 'configure' script does not know about. Run './configure --help' +for details on some of the pertinent environment variables. + + You can give 'configure' initial values for configuration parameters +by setting variables in the command line or in the environment. Here is +an example: + + ./configure CC=c99 CFLAGS=-g LIBS=-lposix + + *Note Defining Variables::, for more details. + +Compiling For Multiple Architectures +==================================== + + You can compile the package for more than one kind of computer at the +same time, by placing the object files for each architecture in their +own directory. To do this, you can use GNU 'make'. 'cd' to the +directory where you want the object files and executables to go and run +the 'configure' script. 'configure' automatically checks for the source +code in the directory that 'configure' is in and in '..'. This is known +as a "VPATH" build. + + With a non-GNU 'make', it is safer to compile the package for one +architecture at a time in the source code directory. After you have +installed the package for one architecture, use 'make distclean' before +reconfiguring for another architecture. + + On MacOS X 10.5 and later systems, you can create libraries and +executables that work on multiple system types--known as "fat" or +"universal" binaries--by specifying multiple '-arch' options to the +compiler but only a single '-arch' option to the preprocessor. Like +this: + + ./configure CC="gcc -arch i386 -arch x86_64 -arch ppc -arch ppc64" \ + CXX="g++ -arch i386 -arch x86_64 -arch ppc -arch ppc64" \ + CPP="gcc -E" CXXCPP="g++ -E" + + This is not guaranteed to produce working output in all cases, you +may have to build one architecture at a time and combine the results +using the 'lipo' tool if you have problems. + +Installation Names +================== + + By default, 'make install' installs the package's commands under +'/usr/local/bin', include files under '/usr/local/include', etc. You +can specify an installation prefix other than '/usr/local' by giving +'configure' the option '--prefix=PREFIX', where PREFIX must be an +absolute file name. + + You can specify separate installation prefixes for +architecture-specific files and architecture-independent files. If you +pass the option '--exec-prefix=PREFIX' to 'configure', the package uses +PREFIX as the prefix for installing programs and libraries. +Documentation and other data files still use the regular prefix. + + In addition, if you use an unusual directory layout you can give +options like '--bindir=DIR' to specify different values for particular +kinds of files. Run 'configure --help' for a list of the directories +you can set and what kinds of files go in them. In general, the default +for these options is expressed in terms of '${prefix}', so that +specifying just '--prefix' will affect all of the other directory +specifications that were not explicitly provided. + + The most portable way to affect installation locations is to pass the +correct locations to 'configure'; however, many packages provide one or +both of the following shortcuts of passing variable assignments to the +'make install' command line to change installation locations without +having to reconfigure or recompile. + + The first method involves providing an override variable for each +affected directory. For example, 'make install +prefix=/alternate/directory' will choose an alternate location for all +directory configuration variables that were expressed in terms of +'${prefix}'. Any directories that were specified during 'configure', +but not in terms of '${prefix}', must each be overridden at install time +for the entire installation to be relocated. The approach of makefile +variable overrides for each directory variable is required by the GNU +Coding Standards, and ideally causes no recompilation. However, some +platforms have known limitations with the semantics of shared libraries +that end up requiring recompilation when using this method, particularly +noticeable in packages that use GNU Libtool. + + The second method involves providing the 'DESTDIR' variable. For +example, 'make install DESTDIR=/alternate/directory' will prepend +'/alternate/directory' before all installation names. The approach of +'DESTDIR' overrides is not required by the GNU Coding Standards, and +does not work on platforms that have drive letters. On the other hand, +it does better at avoiding recompilation issues, and works well even +when some directory options were not specified in terms of '${prefix}' +at 'configure' time. + +Optional Features +================= + + If the package supports it, you can cause programs to be installed +with an extra prefix or suffix on their names by giving 'configure' the +option '--program-prefix=PREFIX' or '--program-suffix=SUFFIX'. + + Some packages pay attention to '--enable-FEATURE' options to +'configure', where FEATURE indicates an optional part of the package. +They may also pay attention to '--with-PACKAGE' options, where PACKAGE +is something like 'gnu-as' or 'x' (for the X Window System). The +'README' should mention any '--enable-' and '--with-' options that the +package recognizes. + + For packages that use the X Window System, 'configure' can usually +find the X include and library files automatically, but if it doesn't, +you can use the 'configure' options '--x-includes=DIR' and +'--x-libraries=DIR' to specify their locations. + + Some packages offer the ability to configure how verbose the +execution of 'make' will be. For these packages, running './configure +--enable-silent-rules' sets the default to minimal output, which can be +overridden with 'make V=1'; while running './configure +--disable-silent-rules' sets the default to verbose, which can be +overridden with 'make V=0'. + +Particular systems +================== + + On HP-UX, the default C compiler is not ANSI C compatible. If GNU CC +is not installed, it is recommended to use the following options in +order to use an ANSI C compiler: + + ./configure CC="cc -Ae -D_XOPEN_SOURCE=500" + +and if that doesn't work, install pre-built binaries of GCC for HP-UX. + + HP-UX 'make' updates targets which have the same time stamps as their +prerequisites, which makes it generally unusable when shipped generated +files such as 'configure' are involved. Use GNU 'make' instead. + + On OSF/1 a.k.a. Tru64, some versions of the default C compiler cannot +parse its '' header file. The option '-nodtk' can be used as a +workaround. If GNU CC is not installed, it is therefore recommended to +try + + ./configure CC="cc" + +and if that doesn't work, try + + ./configure CC="cc -nodtk" + + On Solaris, don't put '/usr/ucb' early in your 'PATH'. This +directory contains several dysfunctional programs; working variants of +these programs are available in '/usr/bin'. So, if you need '/usr/ucb' +in your 'PATH', put it _after_ '/usr/bin'. + + On Haiku, software installed for all users goes in '/boot/common', +not '/usr/local'. It is recommended to use the following options: + + ./configure --prefix=/boot/common + +Specifying the System Type +========================== + + There may be some features 'configure' cannot figure out +automatically, but needs to determine by the type of machine the package +will run on. Usually, assuming the package is built to be run on the +_same_ architectures, 'configure' can figure that out, but if it prints +a message saying it cannot guess the machine type, give it the +'--build=TYPE' option. TYPE can either be a short name for the system +type, such as 'sun4', or a canonical name which has the form: + + CPU-COMPANY-SYSTEM + +where SYSTEM can have one of these forms: + + OS + KERNEL-OS + + See the file 'config.sub' for the possible values of each field. If +'config.sub' isn't included in this package, then this package doesn't +need to know the machine type. + + If you are _building_ compiler tools for cross-compiling, you should +use the option '--target=TYPE' to select the type of system they will +produce code for. + + If you want to _use_ a cross compiler, that generates code for a +platform different from the build platform, you should specify the +"host" platform (i.e., that on which the generated programs will +eventually be run) with '--host=TYPE'. + +Sharing Defaults +================ + + If you want to set default values for 'configure' scripts to share, +you can create a site shell script called 'config.site' that gives +default values for variables like 'CC', 'cache_file', and 'prefix'. +'configure' looks for 'PREFIX/share/config.site' if it exists, then +'PREFIX/etc/config.site' if it exists. Or, you can set the +'CONFIG_SITE' environment variable to the location of the site script. +A warning: not all 'configure' scripts look for a site script. + +Defining Variables +================== + + Variables not defined in a site shell script can be set in the +environment passed to 'configure'. However, some packages may run +configure again during the build, and the customized values of these +variables may be lost. In order to avoid this problem, you should set +them in the 'configure' command line, using 'VAR=value'. For example: + + ./configure CC=/usr/local2/bin/gcc + +causes the specified 'gcc' to be used as the C compiler (unless it is +overridden in the site shell script). + +Unfortunately, this technique does not work for 'CONFIG_SHELL' due to an +Autoconf limitation. Until the limitation is lifted, you can use this +workaround: + + CONFIG_SHELL=/bin/bash ./configure CONFIG_SHELL=/bin/bash + +'configure' Invocation +====================== + + 'configure' recognizes the following options to control how it +operates. + +'--help' +'-h' + Print a summary of all of the options to 'configure', and exit. + +'--help=short' +'--help=recursive' + Print a summary of the options unique to this package's + 'configure', and exit. The 'short' variant lists options used only + in the top level, while the 'recursive' variant lists options also + present in any nested packages. + +'--version' +'-V' + Print the version of Autoconf used to generate the 'configure' + script, and exit. + +'--cache-file=FILE' + Enable the cache: use and save the results of the tests in FILE, + traditionally 'config.cache'. FILE defaults to '/dev/null' to + disable caching. + +'--config-cache' +'-C' + Alias for '--cache-file=config.cache'. + +'--quiet' +'--silent' +'-q' + Do not print messages saying which checks are being made. To + suppress all normal output, redirect it to '/dev/null' (any error + messages will still be shown). + +'--srcdir=DIR' + Look for the package's source code in directory DIR. Usually + 'configure' can determine that directory automatically. + +'--prefix=DIR' + Use DIR as the installation prefix. *note Installation Names:: for + more details, including other options available for fine-tuning the + installation locations. + +'--no-create' +'-n' + Run the configure checks, but stop before creating any output + files. + +'configure' also accepts some other, not widely useful, options. Run +'configure --help' for more details. diff --git a/Makefile.am b/Makefile.am new file mode 100644 index 0000000..e59a6b3 --- /dev/null +++ b/Makefile.am @@ -0,0 +1,46 @@ +SUBDIRS = src test data po windows help tools doc + +INTLTOOL = \ + intltool-extract.in \ + intltool-merge.in \ + intltool-update.in + +full: + ./autogen.sh + make + +EXTRA_DIST = \ + README.md \ + HACKING \ + gnome-doc-utils.make \ + ChangeLog.0 \ + viking.spec \ + mingw-viking.spec \ + mingw64-viking.spec \ + $(INTLTOOL) + +.PHONY: generate-changelog +generate-changelog: + if test -d $(top_srcdir)/.git; then \ + cd $(top_srcdir) ; sh $(top_srcdir)/maintainer/git2changelog.sh > $(distdir)/c-l; \ + mv $(distdir)/c-l $(distdir)/ChangeLog; \ + fi + +dist-hook: viking.spec generate-changelog + cp $(top_builddir)/viking.spec $(distdir) + +MAINTAINERCLEANFILES = \ + gnome-doc-utils.make + +DISTCLEANFILES = \ + intltool-extract \ + intltool-merge \ + intltool-update + +ACLOCAL_AMFLAGS = -I m4 + +DISTCHECK_CONFIGURE_FLAGS = \ + --disable-scrollkeeper + +# Ignore gtk theme cache files on distcheck +distuninstallcheck_listfiles = find . -type f -print | grep -v 'icon-theme.cache' diff --git a/Makefile.in b/Makefile.in new file mode 100644 index 0000000..9e31212 --- /dev/null +++ b/Makefile.in @@ -0,0 +1,903 @@ +# Makefile.in generated by automake 1.16.1 from Makefile.am. +# @configure_input@ + +# Copyright (C) 1994-2018 Free Software Foundation, Inc. + +# This Makefile.in is free software; the Free Software Foundation +# gives unlimited permission to copy and/or distribute it, +# with or without modifications, as long as this notice is preserved. + +# This program is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY, to the extent permitted by law; without +# even the implied warranty of MERCHANTABILITY or FITNESS FOR A +# PARTICULAR PURPOSE. + +@SET_MAKE@ +VPATH = @srcdir@ +am__is_gnu_make = { \ + if test -z '$(MAKELEVEL)'; then \ + false; \ + elif test -n '$(MAKE_HOST)'; then \ + true; \ + elif test -n '$(MAKE_VERSION)' && test -n '$(CURDIR)'; then \ + true; \ + else \ + false; \ + fi; \ +} +am__make_running_with_option = \ + case $${target_option-} in \ + ?) ;; \ + *) echo "am__make_running_with_option: internal error: invalid" \ + "target option '$${target_option-}' specified" >&2; \ + exit 1;; \ + esac; \ + has_opt=no; \ + sane_makeflags=$$MAKEFLAGS; \ + if $(am__is_gnu_make); then \ + sane_makeflags=$$MFLAGS; \ + else \ + case $$MAKEFLAGS in \ + *\\[\ \ ]*) \ + bs=\\; \ + sane_makeflags=`printf '%s\n' "$$MAKEFLAGS" \ + | sed "s/$$bs$$bs[$$bs $$bs ]*//g"`;; \ + esac; \ + fi; \ + skip_next=no; \ + strip_trailopt () \ + { \ + flg=`printf '%s\n' "$$flg" | sed "s/$$1.*$$//"`; \ + }; \ + for flg in $$sane_makeflags; do \ + test $$skip_next = yes && { skip_next=no; continue; }; \ + case $$flg in \ + *=*|--*) continue;; \ + -*I) strip_trailopt 'I'; skip_next=yes;; \ + -*I?*) strip_trailopt 'I';; \ + -*O) strip_trailopt 'O'; skip_next=yes;; \ + -*O?*) strip_trailopt 'O';; \ + -*l) strip_trailopt 'l'; skip_next=yes;; \ + -*l?*) strip_trailopt 'l';; \ + -[dEDm]) skip_next=yes;; \ + -[JT]) skip_next=yes;; \ + esac; \ + case $$flg in \ + *$$target_option*) has_opt=yes; break;; \ + esac; \ + done; \ + test $$has_opt = yes +am__make_dryrun = (target_option=n; $(am__make_running_with_option)) +am__make_keepgoing = (target_option=k; $(am__make_running_with_option)) +pkgdatadir = $(datadir)/@PACKAGE@ +pkgincludedir = $(includedir)/@PACKAGE@ +pkglibdir = $(libdir)/@PACKAGE@ +pkglibexecdir = $(libexecdir)/@PACKAGE@ +am__cd = CDPATH="$${ZSH_VERSION+.}$(PATH_SEPARATOR)" && cd +install_sh_DATA = $(install_sh) -c -m 644 +install_sh_PROGRAM = $(install_sh) -c +install_sh_SCRIPT = $(install_sh) -c +INSTALL_HEADER = $(INSTALL_DATA) +transform = $(program_transform_name) +NORMAL_INSTALL = : +PRE_INSTALL = : +POST_INSTALL = : +NORMAL_UNINSTALL = : +PRE_UNINSTALL = : +POST_UNINSTALL = : +build_triplet = @build@ +host_triplet = @host@ +target_triplet = @target@ +subdir = . +ACLOCAL_M4 = $(top_srcdir)/aclocal.m4 +am__aclocal_m4_deps = $(top_srcdir)/m4/expat.m4 \ + $(top_srcdir)/m4/gettext.m4 $(top_srcdir)/m4/iconv.m4 \ + $(top_srcdir)/m4/intlmacosx.m4 $(top_srcdir)/m4/lib-ld.m4 \ + $(top_srcdir)/m4/lib-link.m4 $(top_srcdir)/m4/lib-prefix.m4 \ + $(top_srcdir)/m4/libcurl.m4 $(top_srcdir)/m4/nls.m4 \ + $(top_srcdir)/m4/po.m4 $(top_srcdir)/m4/progtest.m4 \ + $(top_srcdir)/configure.ac +am__configure_deps = $(am__aclocal_m4_deps) $(CONFIGURE_DEPENDENCIES) \ + $(ACLOCAL_M4) +DIST_COMMON = $(srcdir)/Makefile.am $(top_srcdir)/configure \ + $(am__configure_deps) $(am__DIST_COMMON) +am__CONFIG_DISTCLEAN_FILES = config.status config.cache config.log \ + configure.lineno config.status.lineno +mkinstalldirs = $(SHELL) $(top_srcdir)/mkinstalldirs +CONFIG_HEADER = $(top_builddir)/src/config.h +CONFIG_CLEAN_FILES = viking.spec mingw-viking.spec mingw64-viking.spec +CONFIG_CLEAN_VPATH_FILES = +AM_V_P = $(am__v_P_@AM_V@) +am__v_P_ = $(am__v_P_@AM_DEFAULT_V@) +am__v_P_0 = false +am__v_P_1 = : +AM_V_GEN = $(am__v_GEN_@AM_V@) +am__v_GEN_ = $(am__v_GEN_@AM_DEFAULT_V@) +am__v_GEN_0 = @echo " GEN " $@; +am__v_GEN_1 = +AM_V_at = $(am__v_at_@AM_V@) +am__v_at_ = $(am__v_at_@AM_DEFAULT_V@) +am__v_at_0 = @ +am__v_at_1 = +SOURCES = +DIST_SOURCES = +RECURSIVE_TARGETS = all-recursive check-recursive cscopelist-recursive \ + ctags-recursive dvi-recursive html-recursive info-recursive \ + install-data-recursive install-dvi-recursive \ + install-exec-recursive install-html-recursive \ + install-info-recursive install-pdf-recursive \ + install-ps-recursive install-recursive installcheck-recursive \ + installdirs-recursive pdf-recursive ps-recursive \ + tags-recursive uninstall-recursive +am__can_run_installinfo = \ + case $$AM_UPDATE_INFO_DIR in \ + n|no|NO) false;; \ + *) (install-info --version) >/dev/null 2>&1;; \ + esac +RECURSIVE_CLEAN_TARGETS = mostlyclean-recursive clean-recursive \ + distclean-recursive maintainer-clean-recursive +am__recursive_targets = \ + $(RECURSIVE_TARGETS) \ + $(RECURSIVE_CLEAN_TARGETS) \ + $(am__extra_recursive_targets) +AM_RECURSIVE_TARGETS = $(am__recursive_targets:-recursive=) TAGS CTAGS \ + cscope distdir distdir-am dist dist-all distcheck +am__tagged_files = $(HEADERS) $(SOURCES) $(TAGS_FILES) $(LISP) +# Read a list of newline-separated strings from the standard input, +# and print each of them once, without duplicates. Input order is +# *not* preserved. +am__uniquify_input = $(AWK) '\ + BEGIN { nonempty = 0; } \ + { items[$$0] = 1; nonempty = 1; } \ + END { if (nonempty) { for (i in items) print i; }; } \ +' +# Make sure the list of sources is unique. This is necessary because, +# e.g., the same source file might be shared among _SOURCES variables +# for different programs/libraries. +am__define_uniq_tagged_files = \ + list='$(am__tagged_files)'; \ + unique=`for i in $$list; do \ + if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \ + done | $(am__uniquify_input)` +ETAGS = etags +CTAGS = ctags +CSCOPE = cscope +DIST_SUBDIRS = $(SUBDIRS) +am__DIST_COMMON = $(srcdir)/Makefile.in $(srcdir)/mingw-viking.spec.in \ + $(srcdir)/mingw64-viking.spec.in $(srcdir)/viking.spec.in \ + ABOUT-NLS AUTHORS COPYING ChangeLog INSTALL NEWS README TODO \ + compile config.guess config.rpath config.sub depcomp \ + install-sh missing mkinstalldirs +DISTFILES = $(DIST_COMMON) $(DIST_SOURCES) $(TEXINFOS) $(EXTRA_DIST) +distdir = $(PACKAGE)-$(VERSION) +top_distdir = $(distdir) +am__remove_distdir = \ + if test -d "$(distdir)"; then \ + find "$(distdir)" -type d ! -perm -200 -exec chmod u+w {} ';' \ + && rm -rf "$(distdir)" \ + || { sleep 5 && rm -rf "$(distdir)"; }; \ + else :; fi +am__post_remove_distdir = $(am__remove_distdir) +am__relativize = \ + dir0=`pwd`; \ + sed_first='s,^\([^/]*\)/.*$$,\1,'; \ + sed_rest='s,^[^/]*/*,,'; \ + sed_last='s,^.*/\([^/]*\)$$,\1,'; \ + sed_butlast='s,/*[^/]*$$,,'; \ + while test -n "$$dir1"; do \ + first=`echo "$$dir1" | sed -e "$$sed_first"`; \ + if test "$$first" != "."; then \ + if test "$$first" = ".."; then \ + dir2=`echo "$$dir0" | sed -e "$$sed_last"`/"$$dir2"; \ + dir0=`echo "$$dir0" | sed -e "$$sed_butlast"`; \ + else \ + first2=`echo "$$dir2" | sed -e "$$sed_first"`; \ + if test "$$first2" = "$$first"; then \ + dir2=`echo "$$dir2" | sed -e "$$sed_rest"`; \ + else \ + dir2="../$$dir2"; \ + fi; \ + dir0="$$dir0"/"$$first"; \ + fi; \ + fi; \ + dir1=`echo "$$dir1" | sed -e "$$sed_rest"`; \ + done; \ + reldir="$$dir2" +DIST_ARCHIVES = $(distdir).tar.gz $(distdir).tar.bz2 $(distdir).zip +GZIP_ENV = --best +DIST_TARGETS = dist-bzip2 dist-gzip dist-zip +am__distuninstallcheck_listfiles = $(distuninstallcheck_listfiles) \ + | sed 's|^\./|$(prefix)/|' | grep -v '$(infodir)/dir$$' +distcleancheck_listfiles = find . -type f -print +ACLOCAL = @ACLOCAL@ +ACLOCAL_AMFLAGS = -I m4 +ALL_LINGUAS = @ALL_LINGUAS@ +AMTAR = @AMTAR@ +AM_DEFAULT_VERBOSITY = @AM_DEFAULT_VERBOSITY@ +AUTOCONF = @AUTOCONF@ +AUTOHEADER = @AUTOHEADER@ +AUTOMAKE = @AUTOMAKE@ +AWK = @AWK@ +CATALOGS = @CATALOGS@ +CATOBJEXT = @CATOBJEXT@ +CC = @CC@ +CCDEPMODE = @CCDEPMODE@ +CFLAGS = @CFLAGS@ +CONFIG_STATUS_DEPENDENCIES = @CONFIG_STATUS_DEPENDENCIES@ +CPP = @CPP@ +CPPFLAGS = @CPPFLAGS@ +CXX = @CXX@ +CXXCPP = @CXXCPP@ +CXXDEPMODE = @CXXDEPMODE@ +CXXFLAGS = @CXXFLAGS@ +CYGPATH_W = @CYGPATH_W@ +DATADIRNAME = @DATADIRNAME@ +DB2MAN_XSL = @DB2MAN_XSL@ +DEFS = @DEFS@ +DEPDIR = @DEPDIR@ +DISTCHECK_CONFIGURE_FLAGS = \ + --disable-scrollkeeper + +DOC_USER_FORMATS = @DOC_USER_FORMATS@ +ECHO_C = @ECHO_C@ +ECHO_N = @ECHO_N@ +ECHO_T = @ECHO_T@ +EGREP = @EGREP@ +EXEEXT = @EXEEXT@ +EXPAT_CFLAGS = @EXPAT_CFLAGS@ +EXPAT_LIBS = @EXPAT_LIBS@ +GDK_PIXBUF_CSOURCE = @GDK_PIXBUF_CSOURCE@ +GETTEXT_MACRO_VERSION = @GETTEXT_MACRO_VERSION@ +GETTEXT_PACKAGE = @GETTEXT_PACKAGE@ +GLIB_MKENUMS = @GLIB_MKENUMS@ +GMOFILES = @GMOFILES@ +GMSGFMT = @GMSGFMT@ +GMSGFMT_015 = @GMSGFMT_015@ +GREP = @GREP@ +GTKDOC_CHECK = @GTKDOC_CHECK@ +GTKDOC_CHECK_PATH = @GTKDOC_CHECK_PATH@ +GTKDOC_DEPS_CFLAGS = @GTKDOC_DEPS_CFLAGS@ +GTKDOC_DEPS_LIBS = @GTKDOC_DEPS_LIBS@ +GTKDOC_MKPDF = @GTKDOC_MKPDF@ +GTKDOC_REBASE = @GTKDOC_REBASE@ +HAVE_SCROLLKEEPER = @HAVE_SCROLLKEEPER@ +HELP_DIR = @HELP_DIR@ +HTML_DIR = @HTML_DIR@ +INSTALL = @INSTALL@ +INSTALL_DATA = @INSTALL_DATA@ +INSTALL_PROGRAM = @INSTALL_PROGRAM@ +INSTALL_SCRIPT = @INSTALL_SCRIPT@ +INSTALL_STRIP_PROGRAM = @INSTALL_STRIP_PROGRAM@ +INSTOBJEXT = @INSTOBJEXT@ +INTLLIBS = @INTLLIBS@ +INTLTOOL_EXTRACT = @INTLTOOL_EXTRACT@ +INTLTOOL_MERGE = @INTLTOOL_MERGE@ +INTLTOOL_PERL = @INTLTOOL_PERL@ +INTLTOOL_UPDATE = @INTLTOOL_UPDATE@ +INTLTOOL_V_MERGE = @INTLTOOL_V_MERGE@ +INTLTOOL_V_MERGE_OPTIONS = @INTLTOOL_V_MERGE_OPTIONS@ +INTLTOOL__v_MERGE_ = @INTLTOOL__v_MERGE_@ +INTLTOOL__v_MERGE_0 = @INTLTOOL__v_MERGE_0@ +INTL_MACOSX_LIBS = @INTL_MACOSX_LIBS@ +ISODATE = @ISODATE@ +LDFLAGS = @LDFLAGS@ +LIBCURL = @LIBCURL@ +LIBCURL_CPPFLAGS = @LIBCURL_CPPFLAGS@ +LIBGEOCLUE_CFLAGS = @LIBGEOCLUE_CFLAGS@ +LIBGEOCLUE_LIBS = @LIBGEOCLUE_LIBS@ +LIBICONV = @LIBICONV@ +LIBINTL = @LIBINTL@ +LIBOBJS = @LIBOBJS@ +LIBS = @LIBS@ +LIBZIP_CFLAGS = @LIBZIP_CFLAGS@ +LIBZIP_LIBS = @LIBZIP_LIBS@ +LN_S = @LN_S@ +LTLIBICONV = @LTLIBICONV@ +LTLIBINTL = @LTLIBINTL@ +LTLIBOBJS = @LTLIBOBJS@ +MAKEINFO = @MAKEINFO@ +MKDIR_P = @MKDIR_P@ +MKINSTALLDIRS = @MKINSTALLDIRS@ +MSGFMT = @MSGFMT@ +MSGFMT_015 = @MSGFMT_015@ +MSGFMT_OPTS = @MSGFMT_OPTS@ +MSGMERGE = @MSGMERGE@ +OBJEXT = @OBJEXT@ +OMF_DIR = @OMF_DIR@ +PACKAGE = @PACKAGE@ +PACKAGE_BUGREPORT = @PACKAGE_BUGREPORT@ +PACKAGE_CFLAGS = @PACKAGE_CFLAGS@ +PACKAGE_LIBS = @PACKAGE_LIBS@ +PACKAGE_NAME = @PACKAGE_NAME@ +PACKAGE_STRING = @PACKAGE_STRING@ +PACKAGE_TARNAME = @PACKAGE_TARNAME@ +PACKAGE_URL = @PACKAGE_URL@ +PACKAGE_VERSION = @PACKAGE_VERSION@ +PATH_SEPARATOR = @PATH_SEPARATOR@ +PKG_CONFIG = @PKG_CONFIG@ +PKG_CONFIG_LIBDIR = @PKG_CONFIG_LIBDIR@ +PKG_CONFIG_PATH = @PKG_CONFIG_PATH@ +POFILES = @POFILES@ +POSUB = @POSUB@ +PO_IN_DATADIR_FALSE = @PO_IN_DATADIR_FALSE@ +PO_IN_DATADIR_TRUE = @PO_IN_DATADIR_TRUE@ +RANLIB = @RANLIB@ +SET_MAKE = @SET_MAKE@ +SHELL = @SHELL@ +STRIP = @STRIP@ +USE_NLS = @USE_NLS@ +VERSION = @VERSION@ +XGETTEXT = @XGETTEXT@ +XGETTEXT_015 = @XGETTEXT_015@ +XGETTEXT_EXTRA_OPTIONS = @XGETTEXT_EXTRA_OPTIONS@ +XP = @XP@ +_libcurl_config = @_libcurl_config@ +abs_builddir = @abs_builddir@ +abs_srcdir = @abs_srcdir@ +abs_top_builddir = @abs_top_builddir@ +abs_top_srcdir = @abs_top_srcdir@ +ac_ct_CC = @ac_ct_CC@ +ac_ct_CXX = @ac_ct_CXX@ +am__include = @am__include@ +am__leading_dot = @am__leading_dot@ +am__quote = @am__quote@ +am__tar = @am__tar@ +am__untar = @am__untar@ +bindir = @bindir@ +build = @build@ +build_alias = @build_alias@ +build_cpu = @build_cpu@ +build_os = @build_os@ +build_vendor = @build_vendor@ +builddir = @builddir@ +datadir = @datadir@ +datarootdir = @datarootdir@ +docdir = @docdir@ +dvidir = @dvidir@ +exec_prefix = @exec_prefix@ +host = @host@ +host_alias = @host_alias@ +host_cpu = @host_cpu@ +host_os = @host_os@ +host_vendor = @host_vendor@ +htmldir = @htmldir@ +includedir = @includedir@ +infodir = @infodir@ +install_sh = @install_sh@ +intltool__v_merge_options_ = @intltool__v_merge_options_@ +intltool__v_merge_options_0 = @intltool__v_merge_options_0@ +libdir = @libdir@ +libexecdir = @libexecdir@ +localedir = @localedir@ +localstatedir = @localstatedir@ +mandir = @mandir@ +mkdir_p = @mkdir_p@ +oldincludedir = @oldincludedir@ +pdfdir = @pdfdir@ +prefix = @prefix@ +program_transform_name = @program_transform_name@ +psdir = @psdir@ +runstatedir = @runstatedir@ +sbindir = @sbindir@ +sharedstatedir = @sharedstatedir@ +srcdir = @srcdir@ +sysconfdir = @sysconfdir@ +target = @target@ +target_alias = @target_alias@ +target_cpu = @target_cpu@ +target_os = @target_os@ +target_vendor = @target_vendor@ +top_build_prefix = @top_build_prefix@ +top_builddir = @top_builddir@ +top_srcdir = @top_srcdir@ +SUBDIRS = src test data po windows help tools doc +INTLTOOL = \ + intltool-extract.in \ + intltool-merge.in \ + intltool-update.in + +EXTRA_DIST = \ + README.md \ + HACKING \ + gnome-doc-utils.make \ + ChangeLog.0 \ + viking.spec \ + mingw-viking.spec \ + mingw64-viking.spec \ + $(INTLTOOL) + +MAINTAINERCLEANFILES = \ + gnome-doc-utils.make + +DISTCLEANFILES = \ + intltool-extract \ + intltool-merge \ + intltool-update + + +# Ignore gtk theme cache files on distcheck +distuninstallcheck_listfiles = find . -type f -print | grep -v 'icon-theme.cache' +all: all-recursive + +.SUFFIXES: +am--refresh: Makefile + @: +$(srcdir)/Makefile.in: $(srcdir)/Makefile.am $(am__configure_deps) + @for dep in $?; do \ + case '$(am__configure_deps)' in \ + *$$dep*) \ + echo ' cd $(srcdir) && $(AUTOMAKE) --gnu'; \ + $(am__cd) $(srcdir) && $(AUTOMAKE) --gnu \ + && exit 0; \ + exit 1;; \ + esac; \ + done; \ + echo ' cd $(top_srcdir) && $(AUTOMAKE) --gnu Makefile'; \ + $(am__cd) $(top_srcdir) && \ + $(AUTOMAKE) --gnu Makefile +Makefile: $(srcdir)/Makefile.in $(top_builddir)/config.status + @case '$?' in \ + *config.status*) \ + echo ' $(SHELL) ./config.status'; \ + $(SHELL) ./config.status;; \ + *) \ + echo ' cd $(top_builddir) && $(SHELL) ./config.status $@ $(am__maybe_remake_depfiles)'; \ + cd $(top_builddir) && $(SHELL) ./config.status $@ $(am__maybe_remake_depfiles);; \ + esac; + +$(top_builddir)/config.status: $(top_srcdir)/configure $(CONFIG_STATUS_DEPENDENCIES) + $(SHELL) ./config.status --recheck + +$(top_srcdir)/configure: $(am__configure_deps) + $(am__cd) $(srcdir) && $(AUTOCONF) +$(ACLOCAL_M4): $(am__aclocal_m4_deps) + $(am__cd) $(srcdir) && $(ACLOCAL) $(ACLOCAL_AMFLAGS) +$(am__aclocal_m4_deps): +viking.spec: $(top_builddir)/config.status $(srcdir)/viking.spec.in + cd $(top_builddir) && $(SHELL) ./config.status $@ +mingw-viking.spec: $(top_builddir)/config.status $(srcdir)/mingw-viking.spec.in + cd $(top_builddir) && $(SHELL) ./config.status $@ +mingw64-viking.spec: $(top_builddir)/config.status $(srcdir)/mingw64-viking.spec.in + cd $(top_builddir) && $(SHELL) ./config.status $@ + +# This directory's subdirectories are mostly independent; you can cd +# into them and run 'make' without going through this Makefile. +# To change the values of 'make' variables: instead of editing Makefiles, +# (1) if the variable is set in 'config.status', edit 'config.status' +# (which will cause the Makefiles to be regenerated when you run 'make'); +# (2) otherwise, pass the desired values on the 'make' command line. +$(am__recursive_targets): + @fail=; \ + if $(am__make_keepgoing); then \ + failcom='fail=yes'; \ + else \ + failcom='exit 1'; \ + fi; \ + dot_seen=no; \ + target=`echo $@ | sed s/-recursive//`; \ + case "$@" in \ + distclean-* | maintainer-clean-*) list='$(DIST_SUBDIRS)' ;; \ + *) list='$(SUBDIRS)' ;; \ + esac; \ + for subdir in $$list; do \ + echo "Making $$target in $$subdir"; \ + if test "$$subdir" = "."; then \ + dot_seen=yes; \ + local_target="$$target-am"; \ + else \ + local_target="$$target"; \ + fi; \ + ($(am__cd) $$subdir && $(MAKE) $(AM_MAKEFLAGS) $$local_target) \ + || eval $$failcom; \ + done; \ + if test "$$dot_seen" = "no"; then \ + $(MAKE) $(AM_MAKEFLAGS) "$$target-am" || exit 1; \ + fi; test -z "$$fail" + +ID: $(am__tagged_files) + $(am__define_uniq_tagged_files); mkid -fID $$unique +tags: tags-recursive +TAGS: tags + +tags-am: $(TAGS_DEPENDENCIES) $(am__tagged_files) + set x; \ + here=`pwd`; \ + if ($(ETAGS) --etags-include --version) >/dev/null 2>&1; then \ + include_option=--etags-include; \ + empty_fix=.; \ + else \ + include_option=--include; \ + empty_fix=; \ + fi; \ + list='$(SUBDIRS)'; for subdir in $$list; do \ + if test "$$subdir" = .; then :; else \ + test ! -f $$subdir/TAGS || \ + set "$$@" "$$include_option=$$here/$$subdir/TAGS"; \ + fi; \ + done; \ + $(am__define_uniq_tagged_files); \ + shift; \ + if test -z "$(ETAGS_ARGS)$$*$$unique"; then :; else \ + test -n "$$unique" || unique=$$empty_fix; \ + if test $$# -gt 0; then \ + $(ETAGS) $(ETAGSFLAGS) $(AM_ETAGSFLAGS) $(ETAGS_ARGS) \ + "$$@" $$unique; \ + else \ + $(ETAGS) $(ETAGSFLAGS) $(AM_ETAGSFLAGS) $(ETAGS_ARGS) \ + $$unique; \ + fi; \ + fi +ctags: ctags-recursive + +CTAGS: ctags +ctags-am: $(TAGS_DEPENDENCIES) $(am__tagged_files) + $(am__define_uniq_tagged_files); \ + test -z "$(CTAGS_ARGS)$$unique" \ + || $(CTAGS) $(CTAGSFLAGS) $(AM_CTAGSFLAGS) $(CTAGS_ARGS) \ + $$unique + +GTAGS: + here=`$(am__cd) $(top_builddir) && pwd` \ + && $(am__cd) $(top_srcdir) \ + && gtags -i $(GTAGS_ARGS) "$$here" +cscope: cscope.files + test ! -s cscope.files \ + || $(CSCOPE) -b -q $(AM_CSCOPEFLAGS) $(CSCOPEFLAGS) -i cscope.files $(CSCOPE_ARGS) +clean-cscope: + -rm -f cscope.files +cscope.files: clean-cscope cscopelist +cscopelist: cscopelist-recursive + +cscopelist-am: $(am__tagged_files) + list='$(am__tagged_files)'; \ + case "$(srcdir)" in \ + [\\/]* | ?:[\\/]*) sdir="$(srcdir)" ;; \ + *) sdir=$(subdir)/$(srcdir) ;; \ + esac; \ + for i in $$list; do \ + if test -f "$$i"; then \ + echo "$(subdir)/$$i"; \ + else \ + echo "$$sdir/$$i"; \ + fi; \ + done >> $(top_builddir)/cscope.files + +distclean-tags: + -rm -f TAGS ID GTAGS GRTAGS GSYMS GPATH tags + -rm -f cscope.out cscope.in.out cscope.po.out cscope.files + +distdir: $(BUILT_SOURCES) + $(MAKE) $(AM_MAKEFLAGS) distdir-am + +distdir-am: $(DISTFILES) + $(am__remove_distdir) + test -d "$(distdir)" || mkdir "$(distdir)" + @srcdirstrip=`echo "$(srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \ + topsrcdirstrip=`echo "$(top_srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \ + list='$(DISTFILES)'; \ + dist_files=`for file in $$list; do echo $$file; done | \ + sed -e "s|^$$srcdirstrip/||;t" \ + -e "s|^$$topsrcdirstrip/|$(top_builddir)/|;t"`; \ + case $$dist_files in \ + */*) $(MKDIR_P) `echo "$$dist_files" | \ + sed '/\//!d;s|^|$(distdir)/|;s,/[^/]*$$,,' | \ + sort -u` ;; \ + esac; \ + for file in $$dist_files; do \ + if test -f $$file || test -d $$file; then d=.; else d=$(srcdir); fi; \ + if test -d $$d/$$file; then \ + dir=`echo "/$$file" | sed -e 's,/[^/]*$$,,'`; \ + if test -d "$(distdir)/$$file"; then \ + find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \ + fi; \ + if test -d $(srcdir)/$$file && test $$d != $(srcdir); then \ + cp -fpR $(srcdir)/$$file "$(distdir)$$dir" || exit 1; \ + find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \ + fi; \ + cp -fpR $$d/$$file "$(distdir)$$dir" || exit 1; \ + else \ + test -f "$(distdir)/$$file" \ + || cp -p $$d/$$file "$(distdir)/$$file" \ + || exit 1; \ + fi; \ + done + @list='$(DIST_SUBDIRS)'; for subdir in $$list; do \ + if test "$$subdir" = .; then :; else \ + $(am__make_dryrun) \ + || test -d "$(distdir)/$$subdir" \ + || $(MKDIR_P) "$(distdir)/$$subdir" \ + || exit 1; \ + dir1=$$subdir; dir2="$(distdir)/$$subdir"; \ + $(am__relativize); \ + new_distdir=$$reldir; \ + dir1=$$subdir; dir2="$(top_distdir)"; \ + $(am__relativize); \ + new_top_distdir=$$reldir; \ + echo " (cd $$subdir && $(MAKE) $(AM_MAKEFLAGS) top_distdir="$$new_top_distdir" distdir="$$new_distdir" \\"; \ + echo " am__remove_distdir=: am__skip_length_check=: am__skip_mode_fix=: distdir)"; \ + ($(am__cd) $$subdir && \ + $(MAKE) $(AM_MAKEFLAGS) \ + top_distdir="$$new_top_distdir" \ + distdir="$$new_distdir" \ + am__remove_distdir=: \ + am__skip_length_check=: \ + am__skip_mode_fix=: \ + distdir) \ + || exit 1; \ + fi; \ + done + $(MAKE) $(AM_MAKEFLAGS) \ + top_distdir="$(top_distdir)" distdir="$(distdir)" \ + dist-hook + -test -n "$(am__skip_mode_fix)" \ + || find "$(distdir)" -type d ! -perm -755 \ + -exec chmod u+rwx,go+rx {} \; -o \ + ! -type d ! -perm -444 -links 1 -exec chmod a+r {} \; -o \ + ! -type d ! -perm -400 -exec chmod a+r {} \; -o \ + ! -type d ! -perm -444 -exec $(install_sh) -c -m a+r {} {} \; \ + || chmod -R a+r "$(distdir)" +dist-gzip: distdir + tardir=$(distdir) && $(am__tar) | eval GZIP= gzip $(GZIP_ENV) -c >$(distdir).tar.gz + $(am__post_remove_distdir) +dist-bzip2: distdir + tardir=$(distdir) && $(am__tar) | BZIP2=$${BZIP2--9} bzip2 -c >$(distdir).tar.bz2 + $(am__post_remove_distdir) + +dist-lzip: distdir + tardir=$(distdir) && $(am__tar) | lzip -c $${LZIP_OPT--9} >$(distdir).tar.lz + $(am__post_remove_distdir) + +dist-xz: distdir + tardir=$(distdir) && $(am__tar) | XZ_OPT=$${XZ_OPT--e} xz -c >$(distdir).tar.xz + $(am__post_remove_distdir) + +dist-tarZ: distdir + @echo WARNING: "Support for distribution archives compressed with" \ + "legacy program 'compress' is deprecated." >&2 + @echo WARNING: "It will be removed altogether in Automake 2.0" >&2 + tardir=$(distdir) && $(am__tar) | compress -c >$(distdir).tar.Z + $(am__post_remove_distdir) + +dist-shar: distdir + @echo WARNING: "Support for shar distribution archives is" \ + "deprecated." >&2 + @echo WARNING: "It will be removed altogether in Automake 2.0" >&2 + shar $(distdir) | eval GZIP= gzip $(GZIP_ENV) -c >$(distdir).shar.gz + $(am__post_remove_distdir) +dist-zip: distdir + -rm -f $(distdir).zip + zip -rq $(distdir).zip $(distdir) + $(am__post_remove_distdir) + +dist dist-all: + $(MAKE) $(AM_MAKEFLAGS) $(DIST_TARGETS) am__post_remove_distdir='@:' + $(am__post_remove_distdir) + +# This target untars the dist file and tries a VPATH configuration. Then +# it guarantees that the distribution is self-contained by making another +# tarfile. +distcheck: dist + case '$(DIST_ARCHIVES)' in \ + *.tar.gz*) \ + eval GZIP= gzip $(GZIP_ENV) -dc $(distdir).tar.gz | $(am__untar) ;;\ + *.tar.bz2*) \ + bzip2 -dc $(distdir).tar.bz2 | $(am__untar) ;;\ + *.tar.lz*) \ + lzip -dc $(distdir).tar.lz | $(am__untar) ;;\ + *.tar.xz*) \ + xz -dc $(distdir).tar.xz | $(am__untar) ;;\ + *.tar.Z*) \ + uncompress -c $(distdir).tar.Z | $(am__untar) ;;\ + *.shar.gz*) \ + eval GZIP= gzip $(GZIP_ENV) -dc $(distdir).shar.gz | unshar ;;\ + *.zip*) \ + unzip $(distdir).zip ;;\ + esac + chmod -R a-w $(distdir) + chmod u+w $(distdir) + mkdir $(distdir)/_build $(distdir)/_build/sub $(distdir)/_inst + chmod a-w $(distdir) + test -d $(distdir)/_build || exit 0; \ + dc_install_base=`$(am__cd) $(distdir)/_inst && pwd | sed -e 's,^[^:\\/]:[\\/],/,'` \ + && dc_destdir="$${TMPDIR-/tmp}/am-dc-$$$$/" \ + && am__cwd=`pwd` \ + && $(am__cd) $(distdir)/_build/sub \ + && ../../configure \ + $(AM_DISTCHECK_CONFIGURE_FLAGS) \ + $(DISTCHECK_CONFIGURE_FLAGS) \ + --srcdir=../.. --prefix="$$dc_install_base" \ + && $(MAKE) $(AM_MAKEFLAGS) \ + && $(MAKE) $(AM_MAKEFLAGS) dvi \ + && $(MAKE) $(AM_MAKEFLAGS) check \ + && $(MAKE) $(AM_MAKEFLAGS) install \ + && $(MAKE) $(AM_MAKEFLAGS) installcheck \ + && $(MAKE) $(AM_MAKEFLAGS) uninstall \ + && $(MAKE) $(AM_MAKEFLAGS) distuninstallcheck_dir="$$dc_install_base" \ + distuninstallcheck \ + && chmod -R a-w "$$dc_install_base" \ + && ({ \ + (cd ../.. && umask 077 && mkdir "$$dc_destdir") \ + && $(MAKE) $(AM_MAKEFLAGS) DESTDIR="$$dc_destdir" install \ + && $(MAKE) $(AM_MAKEFLAGS) DESTDIR="$$dc_destdir" uninstall \ + && $(MAKE) $(AM_MAKEFLAGS) DESTDIR="$$dc_destdir" \ + distuninstallcheck_dir="$$dc_destdir" distuninstallcheck; \ + } || { rm -rf "$$dc_destdir"; exit 1; }) \ + && rm -rf "$$dc_destdir" \ + && $(MAKE) $(AM_MAKEFLAGS) dist \ + && rm -rf $(DIST_ARCHIVES) \ + && $(MAKE) $(AM_MAKEFLAGS) distcleancheck \ + && cd "$$am__cwd" \ + || exit 1 + $(am__post_remove_distdir) + @(echo "$(distdir) archives ready for distribution: "; \ + list='$(DIST_ARCHIVES)'; for i in $$list; do echo $$i; done) | \ + sed -e 1h -e 1s/./=/g -e 1p -e 1x -e '$$p' -e '$$x' +distuninstallcheck: + @test -n '$(distuninstallcheck_dir)' || { \ + echo 'ERROR: trying to run $@ with an empty' \ + '$$(distuninstallcheck_dir)' >&2; \ + exit 1; \ + }; \ + $(am__cd) '$(distuninstallcheck_dir)' || { \ + echo 'ERROR: cannot chdir into $(distuninstallcheck_dir)' >&2; \ + exit 1; \ + }; \ + test `$(am__distuninstallcheck_listfiles) | wc -l` -eq 0 \ + || { echo "ERROR: files left after uninstall:" ; \ + if test -n "$(DESTDIR)"; then \ + echo " (check DESTDIR support)"; \ + fi ; \ + $(distuninstallcheck_listfiles) ; \ + exit 1; } >&2 +distcleancheck: distclean + @if test '$(srcdir)' = . ; then \ + echo "ERROR: distcleancheck can only run from a VPATH build" ; \ + exit 1 ; \ + fi + @test `$(distcleancheck_listfiles) | wc -l` -eq 0 \ + || { echo "ERROR: files left in build directory after distclean:" ; \ + $(distcleancheck_listfiles) ; \ + exit 1; } >&2 +check-am: all-am +check: check-recursive +all-am: Makefile +installdirs: installdirs-recursive +installdirs-am: +install: install-recursive +install-exec: install-exec-recursive +install-data: install-data-recursive +uninstall: uninstall-recursive + +install-am: all-am + @$(MAKE) $(AM_MAKEFLAGS) install-exec-am install-data-am + +installcheck: installcheck-recursive +install-strip: + if test -z '$(STRIP)'; then \ + $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \ + install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \ + install; \ + else \ + $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \ + install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \ + "INSTALL_PROGRAM_ENV=STRIPPROG='$(STRIP)'" install; \ + fi +mostlyclean-generic: + +clean-generic: + +distclean-generic: + -test -z "$(CONFIG_CLEAN_FILES)" || rm -f $(CONFIG_CLEAN_FILES) + -test . = "$(srcdir)" || test -z "$(CONFIG_CLEAN_VPATH_FILES)" || rm -f $(CONFIG_CLEAN_VPATH_FILES) + -test -z "$(DISTCLEANFILES)" || rm -f $(DISTCLEANFILES) + +maintainer-clean-generic: + @echo "This command is intended for maintainers to use" + @echo "it deletes files that may require special tools to rebuild." + -test -z "$(MAINTAINERCLEANFILES)" || rm -f $(MAINTAINERCLEANFILES) +clean: clean-recursive + +clean-am: clean-generic mostlyclean-am + +distclean: distclean-recursive + -rm -f $(am__CONFIG_DISTCLEAN_FILES) + -rm -f Makefile +distclean-am: clean-am distclean-generic distclean-tags + +dvi: dvi-recursive + +dvi-am: + +html: html-recursive + +html-am: + +info: info-recursive + +info-am: + +install-data-am: + +install-dvi: install-dvi-recursive + +install-dvi-am: + +install-exec-am: + +install-html: install-html-recursive + +install-html-am: + +install-info: install-info-recursive + +install-info-am: + +install-man: + +install-pdf: install-pdf-recursive + +install-pdf-am: + +install-ps: install-ps-recursive + +install-ps-am: + +installcheck-am: + +maintainer-clean: maintainer-clean-recursive + -rm -f $(am__CONFIG_DISTCLEAN_FILES) + -rm -rf $(top_srcdir)/autom4te.cache + -rm -f Makefile +maintainer-clean-am: distclean-am maintainer-clean-generic + +mostlyclean: mostlyclean-recursive + +mostlyclean-am: mostlyclean-generic + +pdf: pdf-recursive + +pdf-am: + +ps: ps-recursive + +ps-am: + +uninstall-am: + +.MAKE: $(am__recursive_targets) install-am install-strip + +.PHONY: $(am__recursive_targets) CTAGS GTAGS TAGS all all-am \ + am--refresh check check-am clean clean-cscope clean-generic \ + cscope cscopelist-am ctags ctags-am dist dist-all dist-bzip2 \ + dist-gzip dist-hook dist-lzip dist-shar dist-tarZ dist-xz \ + dist-zip distcheck distclean distclean-generic distclean-tags \ + distcleancheck distdir distuninstallcheck dvi dvi-am html \ + html-am info info-am install install-am install-data \ + install-data-am install-dvi install-dvi-am install-exec \ + install-exec-am install-html install-html-am install-info \ + install-info-am install-man install-pdf install-pdf-am \ + install-ps install-ps-am install-strip installcheck \ + installcheck-am installdirs installdirs-am maintainer-clean \ + maintainer-clean-generic mostlyclean mostlyclean-generic pdf \ + pdf-am ps ps-am tags tags-am uninstall uninstall-am + +.PRECIOUS: Makefile + + +full: + ./autogen.sh + make + +.PHONY: generate-changelog +generate-changelog: + if test -d $(top_srcdir)/.git; then \ + cd $(top_srcdir) ; sh $(top_srcdir)/maintainer/git2changelog.sh > $(distdir)/c-l; \ + mv $(distdir)/c-l $(distdir)/ChangeLog; \ + fi + +dist-hook: viking.spec generate-changelog + cp $(top_builddir)/viking.spec $(distdir) + +# Tell versions [3.59,3.63) of GNU make to not export all variables. +# Otherwise a system limit (for SysV at least) may be exceeded. +.NOEXPORT: diff --git a/NEWS b/NEWS new file mode 100644 index 0000000..4007443 --- /dev/null +++ b/NEWS @@ -0,0 +1,997 @@ +Viking 1.7 (2019-01-21) +New features since 1.6.2 +* KMZ Map File Support +* Apply Button for Layer Properties +* Support More GPX Fields +* Updated Default Map: Mapbox Outdoors +* GeoClue Support for Automatic Location +* Faster GPX File Loading +* Waypoint / EXIF GPS Image Direction Support +* Support More Garmin Waypoint Symbols +* Support Garmin Device GPX Point Limits +* Windows GPSD Client +* Support 'External' GPX File Layers in .vik Files +* Usage of HTTPS addresses +* Support OAuth for OSM +* Support High Resolution Displays +* Track+Route Split+Join Tools +* Calculation of Eddington Number +* Calendar Display +* Can Select a Result from the Online Search Results +* Reproducible Builds +* 64bit Windows Build only +* Travis Build + CI +* Consistent Licensing of GPL2+ +* Many Internal Improvements + Fixes + +Fixes since 1.6.2 +* SF Bugs#154: Ensure GPX output values are XSD:Decimal +* SF Bugs#151: Compatibility with GPSD API v7 +* SF Bugs#152: Fix repeatedly showing the license dialog +* SF Bugs#148: Fix reversing manually created tracks & routes +* SF Bugs#146: Fix showing elevation gain/loss in track properties. +* SF Bugs#144: Fix Export to World File +* SF Bugs#138: Fix handling of tags in GPX files. +* SF Bugs#135: Fix OSM Maps shown by default at Maximum Zoom. +* SF Bugs#133: Remove the auto added map when opening the first .vik file from the GUI. +* SF Bugs#134: Replaced discontinued MapQuest tile service with rate limited Mapbox Outdoors service. +* SF Bugs#132: Fix to correctly open GPX files in Windows via double click. +* SF Bugs#130: Fix GeoRef layer alpha value change to 255 is ignored until restart +* SF Bugs#22: Fix changing coordinates when saving and exporting +* SF Bugs#128: Fix Crash when loading broken .vik file + +Viking 1.6.2 (2015-12-21) +Bug Fix Release +* Don't remove project name if one decides not to delete all layers. +* Fix routes not saved in GPX when tracks are made invisible. +* SF Bugs#103: Fix TrackWaypoint layer items may not be displayed when pasted +* Enable Catalan and Turkish translations. +* Restore opening of JPG files. +* SF Bugs#127: Fix initial display of Waypoint sort order. +* Fix map layer widget sensitivity dependent on map type. + +Viking 1.6.1 (2015-11-24) +Bug Fix Release + updated translations +* Several fixes and many code improvements from Coverity scans +* Fix heap-buffer-overflows +* Mapnik3 support. +** C++ standard required is now C++11 +* Reactivate building of the reference documentation +* SF Bugs#126: Fix crash in gdk_rgb_convert_0888 due to using deallocated memory. +* SF Bugs#121: Fix crash when invalidating previously acquired tiles. +* SF Bugs#123: Fix bzip2 decompression on Windows. +* SF Bugs#122: Fix memory cache confusion with multiple "On Disk OSM Tile Format" maps +* SF Bugs#120: Fix Track drawing bug across the 180th Meridian. +* Red Hat Bugzilla – Bug 1210403: Only download and process one Bing attribution list. +* Fix Geocaches acquiring with latest geo-* software +* Import latest Launchpad translation updates +* Many other small fixes - see the ChangeLog for the full details. + +Viking 1.6 (2015-03-29) +New features since 1.5.1 +* Mapnik Rendering Layer (not available in Windows build ATM) - with preprocessor CartoCSS option. +** Build system dependency on C++. Source dependency on libmapnik-dev. +* Export files via GPSBabel +* Extended GPSBabel filtering support - Enables limited/simple OSM Overpass API support. +* Support reading of MBTiles files. +* Support reading of OSM Metatiles. +* Configurable Toolbar +* Configurable Menu keys +* Various time related features: +** Edit trackpoint and waypoint times. +** Sort layers by time. +** Preference option 'World' to display time values based on the position (i.e. in the local timezone) of the track or waypoint. +** Show time axis values on time graphs +** Quick search of tracks by date +** Open external programs Rednotebook or Stellarium at the specific time (and place) of a point. +* Improved route finder UI usage +* GeoJSON support via external programs 'togpx' and 'togeojson' +* New default Map Cache layout to be more compatible with standard OSM/TMS structure. +** Also python tool available to migrate cache layouts +* Support GPX Metadata values common to GPX1.0 and GPX1.1 +* Extended map type configuration options (zoom levels + area extents limits) +* Build compatibility with GPSD 3.12 +* Allow starting Viking with command line parameters to set position, zoom and map type. +** --latitude +** --longitude +** --zoom +** --map +** eg: $> viking --latitude 51.4 --longitude -1.3 --zoom 12 --map 13 +* Improved Windows install information and options +* Export Track, Route and Waypoint Lists as text. +* Many internal improvements, fixes, more translations and various other small improvements. + +Fixes since 1.5.1 +* SF Bugs#104: Fix GStatBuf not available on Glib < 2.26 +* SF Bugs#105: Fix Display of Lines (Clipping) at High Zoom Levels. +* SF Bugs#106: Fix incorrect location on opening .vik file saved in different locale. +* SF Bugs#109: Ctrl+Keypad+/- to Zoom In/Out respectively. +* SF Bugs#112: Enable using libgexiv2 for writing geotag image data to void XMP data loss. +** Thus default source dependency on libgexiv2-dev +** Not available in Windows build ATM +* SF Bugs#113: Fix waypoints can be accidentally moved on (re)selection by the select tool +* SF Bugs#114: Fix Shortcut keys get reset next start +* SF Bugs#115: Fix application hanging on degrees input ending in a comma. +* SF Bugs#118: Fix route point selection via the Edit Trackpoint tool. +* Debian #761966: Remove an incorrect accelerator in the German translation. +* Debian #746815: Fix loading image thumbnails when some Unicode chars in the pathname + +Viking 1.5 (2013-10-13) +New features since 1.4.2 +* Startup preferences for ease of use. +* Multi layer/track statistics. +* Multi layer/track or waypoint detailed lists. +* Control sorting of layers and quick show/hide all options. +* Configurable layer defaults. +* Optimizations when loading and drawing large numbers of tracks. +* Allow higher zoom levels up to 1/32 (OSM z22 equivalent but maps only requested up to z19). +* Retain internal options across sessions. +* Selectable online router service provider (now including OSRM) +* 'Via' points online route refining. +* Download a file directly from an URL. +* Datasource acquiring files from URLs related to the current view. +* Support timestamps (read only) in waypoints. +* Support naming trackpoints. +* Request downloading a region of maps over multiple zoom levels. +* Support Compressed My OSM Traces files (requires libbz2 and libmagic). +* Support opening files drag and drop on to the viewport. +* Support relative paths in Viking files. +* Add support for OSM Humanitarian (HOT) Style Map. +* Advanced preferences. +* Optional track labelling on the viewport. +* Translations for the Basque language. +* Improved Help Manual. +* Many internal improvements. + +Fixes since 1.4.2 +* Fix crashing if attempting to Extend a Route via the Route Finder when the route has no points. + +Viking 1.4.2.0 (2013-07-26) +Bug Fix Release +* Fix menu use of named own Icons since the icons were renamed some time ago. +* [QA] Fix memory leak in drawing new tracks/routes. +* [QA] Fix memory leak on deleting TrackWaypoint layers. +* [QA] Fix large memory leak on viewing Track Properties. +* [QA] Fix incorrect iterator usage. +* [QA] Fix memory leaks on reading in Viking files. +* [QA] Fix memory leak in treeview tooltips and selection. +* [QA] Fix large memory leak when removing DEM layers. +* Fix some interpolated values of a trackpoint on insertion between points. +* Fix handling failed downloads with the My OSM Traces method. +* SF Bugs#101: Fix Acquire from Google Directions. +* Fix name search using Google. +* SF Bugs#100: Fix Crash on viewing Track Properties with extreme gradients. +* SF Bugs#97: Fix missing redownload settings of some maps in the example config +* SF Bugs#99: Increase limit for Map IDs +* Automated check for the latest version. ATM only on Windows systems. +* Enable getting Viking Version as a number from a string to enable comparisons. +* SF#3613971: Remove Geofabrik's OpenStreetMap WMS, as it is not for public use. +* Don't silently fail on attempting to split to a track. +* Fix background thread statusbar update instability. +* Fix location of gdk_threads_enter() to be before first window creation. +* Allow Bing Map source URL to be set via the configuration XML file. +* SF#3610708: Fix Failing to Load DEM files on Big Endian Systems. +* Fix incorrect setting to lowest zoom value when clicking away from the statusbar zoom menu. +* [QA] Improve create zoom menu to use G_N_ELEMENTS to know array bounds. + +Viking 1.4.1.0 (2013-04-08) +Bug Fix Release + updated translations +* Import Launchpad translation updates [Mainly for large Czech update] +* Fix using .vik files with 'unusual' track or waypoint names +* Fix waypoint selection when the waypoint has an image but the images are not being displayed. +* Fix showing map timestamps on Windows on the map tile info dialog. +* SF#3608411: Part 2 - Avoid creating command window on Viking start-up. +* SF#3608411: Part 1 - Avoid warning about unbuffer on Windows Systems. +* SF#3608264: Improve Statusbar Location Info Maybe Truncated +* Prevent inputting empty names for layers and sublayers via the layers panel. +* SF#3608311: Fix crash caused by renaming blank sublayer names +* Be less strigent in loading Geotagged images without optional GPS tags +* Fix use of scaled tile image when tile image not present. +* Enable updating the treeview to allow setting a blank waypoint symbol. +* Improve the Waypoint tooltip to display the description if there is no comment. +* Fix datasource acquiring waypoints from geotag images. +* Updated geo-* scripts to version released on 2013/02/18 +* Fix compilation with --enable-geocaches option. +* help/Makefile.am: explicitly list figures. + +Viking 1.4.0.1 (2013-02-16) +Windows Only Release. +* Windows: Add .vik file extension association option in the installer + +Viking 1.4 (2013-02-11) +New features since 1.3.2 +* Support for GPX Route type including transfer to/from GPS Devices. +** Replaced 'Add Track' tool with 'Create Route' tool. (NB There still is the Create Track tool) +* Support for GPX 'Description' for tracks, waypoints and routes. +* Add ability to Acquire My OSM Traces and ability to choose any subset of the available traces. +* GPS Upload from a track. +* Enable giving a track a specific colour (drawn in default draw by track mode). +* Enable drawing all tracks in a specific colour (no longer is Black the only option). +* Allow option of drawing a direction arrow when drawing a track. +* Allow configuration of trackpoint size and direction arrow size. +* Display Waypoint Icons in the layers panel treeview. +* Restored Route Finding via Google Services. [Was disabled in 1.3.2 due to change in formats supported] +* Only display sublayer container when there are sublayers. +* Display map tile source and cached file information in a dialog for a position. +* Quick zoom level change from the statusbar by clicking on the zoom level to select another level. +* In the Zoom Tool mode: can select an area to zoom in on (via holding shift key + drag mouse). +* Mouse Zooming in/out maintains the position focus on the mouse pointer location. +** (Use the keys Ctrl+Shift and mouse zoom to maintain the centered map location). +* Improvements in Acquiring Wikipedia Points (allow more points, sortable columns, URL and feature type). +* Allow opening a URL on a waypoint which has a URL for a comment or description. +* Re-organized TrackWaypoint Layer menus to group functionality together better with New, View, Combine, Split, Delete, Acquire and Upload submenus. +* Gradient Graph view on the Track Properties. +* Allow same named TrackWaypoint sublayer items. i.e. can now have 2 (or more) waypoints with the same name. +* Add support of a Map type for a local On Disk OSM Tile Format. +* Revised Draw Track by Speed mode with a simple traffic light colouring scheme to represent slow/average/fast speeds. +* Enable deletion of track points with the same timestamp. +* Ability to merge segments of a track. +* Allow generation of large pixel sized images. +* Rework image generation to ask for file name first and then only allow supported map zoom levels. +* Allow control of waypoint text size on the viewport display. +* Allow control of GPX file saving track order (either Alphabetical or By Time via global preference). +* Keyboard shortcuts to create layers and enable some tools. +* Show the bearing and the step distance of the next point when creating a track or route. +* Improved feedback in reading erroneous files. +* Improved Help Manual. +* More translation texts including a Finnish version. +* Scripts to support the creation of the Windows Executable Installer. +* Add a python tool to convert the Viking tile cache into a MapBox MBTiles format file. +* Many internal improvements. + +Fixes since 1.3.2 +* Don't accidently overwrite GPX and KML files in the Viking file type. +* Use the default desktop font for waypoint viewport display text. +* Ensure when opening multiple .vik files they are each loaded into a new window. +* Show UTM location in statusbar when in UTM mode. +* Fix: crash when dealing with non-compressed DEM files + +Viking 1.3.2 (2012-09-23) +Bug Fix Release including: +* Removed Route Finder Tool as Google Direction service interface has disabled the method Viking interfaced with it. +* Fix for Debian#685817: Statusbar Update From Thread Instability +* Fix SF#3564795: Crashing when attempting to create waypoints from EXIF images without enough GPS information. +* Fix drawing of next potential trackpoint on Windows Systems. +* Fix GPSBabel Dynamic Device List generation on Windows Systems. +* Fix crashing when displayed map copyright(s) is longer than the internal buffer. +* Fix crashing when deleting a GPS layer which has started a realtime tracking. +* Fix printing of DEBUG message since glib 2.32 + +Viking 1.3.1 (2012-06-26) +Bug Fix for Windows Systems Release: +* Fix crash in Show Picture functionality on Window's Systems. + +Viking 1.3 (2012-04-22) +New features since 1.2.2 +* Be consistent in that track and waypoint list dialogs are always sorted alphabetically. +* Add OSM Transport map as a built in map option. +* Add supported MIME types to the desktop file specification. +* Add example script that can be used to upload a track as a route to a predefined GPS device. +* Display the average moving speed for a track in the track properties. +* Add ability to open a TrackWaypoint layer with another external program (default merkaartor). +* Add ability to open a TrackWaypoint layer with an external program (default JOSM). +* Use map default: OSM MapQuest tileserver. +* Add and use a preference for the associated image viewer program. +* Add and use KML File Export units option. +* Add ability to geotag images interpolating times against tracks. +* Acquire Geotag Images via TRW Layer +* Ensure vtl created in acquire operation runs post read stage. +* EXIF read implementation for geotagged images (libexif). +* Add new process stage for acquire methods. +* Enable reversing a track from the track menu. +* Display compact message on the statusbar for the selected trackpoint or waypoint. (SF#3314888) +* Enable multiple selection and deletion. +* Scale waypoint icons to give large or small icons as necessary. +* Add Yahoo! Maps webtool link. +* Extend webtools with a bounds version for the URL which takes four string parameters. +* Add webtool for Bing maps. +* Add Acquire OSM option into the Track/Waypoint layer operations. +* Add used geo-* scripts as they are public domain. +* Continue geocaching.com support via third party tools. +* Show elevation gain/loss on track creation 'tooltip' (as per SF#2838561 request), when such data is available. +* Automatically attempt to set elevation data from the DEM layer whilst a track is being created. +* When creating a track, display the total distance of track (via a tooltip like text) on the main display. +* Allow to import any file known by gpsbabel +* Add support for any device known by gpsbabel +* Add experimental support for GPSD_API_MAJOR_VERSION 5. +* Add ability to acquire GPS traces stored on OSM +* Enable copying layer/sublayer names as plain text, so that it can be pasted into external text handling applications. +* Enable getting of the statusbar from the window. +* On creating a new waypoint always attempt to auto set the altitude if DEM data is available. +* Enable the escape key to remove/reset the ruler tool. + +Fixes since 1.2.2 +* Remove Tiles@home support as the service has stopped. +* cleanup: Remove unused and out of date 'viking-remote' script and related files. +* cleanup: Remove *very* old documentation and don't bother distributing any of it which is all old. +* Fix Track Properties graph blob marker drawn at wrong elevation when elevation graphs have different min/max heights. +* Fix Track Properties graph DEM points drawn at wrong elevation when lowest elevation is not zero. +* Use an intermediary program which will invoke the system's default for opening images. +* Fix opening of external web sites via center method when the zoom level is less than 1 mpp. +* Fix crashing on opening a file via recent menu after a .vik file is opened. +* Fix too easy to accidently move a waypoint with an image with the select tool - must use shift key. +* Fix can not immediately select another layer if currently selected layer's visibility changes. +* Fix compilation with curl 7.21.7 (SF#3376584) +* Improve libgps test with the consistently available function: gps_close +* Fix help +* [DOC] Split By Number of Points +* Add Track->Split by Number of Points (as per SF#2847587 request). +* Add a new dialog to return positive number. +* SF#2844872: Suggest name for the new track when splitting the track via the trackpoint edit dialog. + +Fixes since 1.1 +* Better safety checking to prevent crash due to null variable reference in use of the current trackpoint. +* Fix: Reduce GObject cast +* Fix etag handling +* Fix: generate doc/reference/Makefile when needed +* Fix Track -> Split by Timestamp such that newly created tracks are ordered correctly. +* Fix sensitivity of the track properties window split marker to be disabled when the track marker is not drawn. +* Fix crashing due to incorrect usage of libcurl - SF#3206628. +* Fix non-void function should return a value. +* Fix reference documentation generation - some systems need explicit mention of libz. +* Fix displaying of 'Waypoints' treeview menu. +* Fix vik_aggregate_layer_get_all_layers_of_type for track/waypoint layer types, since these may also be stored under GPS layers. +* Improve previous fix: background calling code should control return value +* Fix: background calling code should control return value +* Fix: enforce background feature +* Fix compiler warnings from gcc 4.5.4 +* SF#3178554: Fix Sun Studio build +* gtk_object_sink has been deprecated since gtk version 2.10, use g_object_ref_sink() instead. + +Viking 1.1 (2011-02-08) +New features since 1.0 +* [DOC] Add MapQuest Nominating search service in examples +* Adjust colour of last auto track colour to not clash with default create track colour. +* Add menu icons for the maps layer menu. +* Make the selection list in Merge With Other Tracks sorted alphabetically. +* Add sort list by name function. Will be useful for track and waypoint list ordering. +* [DOC] Mark ready for 1.1 release. Update help manual version to 0.2. +* [DOC] Add layer information for Aggregates, Coords and GeoRefs in help. +* [DOC] Add Maps layer help information. +* [DOC] Add overall layer information and promote each layer to be a top level section in help. +* [DOC] Add DEM layer help information. +* [DOC] Mention waypoint properties in help information. +* [DOC] Update GPS layer help information. +* [DOC] Update track operations help information. +* [DOC] Update waypoint operations help information. +* [DOC] Update Tools help section +* [DOC] Update TrackWaypoint layer menu help Information +* Improve positioning of the menu separator on waypoint menus. +* Add GeoRef layer tooltip to show the file name in use. +* Add GPS Layer tooltip to say the protocol (aka device manufacturer) type. +* TrackWaypoint Layer tooltip featuring summaries for tracks and waypoints. +* Add maps layer tooltip to show the map name(type). +* Add DEM layer tooltip to show the number of DEM files in use. +* Add Track and waypoint sublayer tooltip information. +* Add treeview use and display of layers tooltip. +* Add Layer Tooltip callback definition +* Add sublayer tooltip callback definition. +* When getting data via the GPS layer automatically set the view to see it, unless the realtime tracking mode is on. +* On acquiring data from sources (inc. GPS) automatically set the view to see it. Except for GeoCaches; as it's likely you're requesting data for the current area, so no point in trying to change the view. +* On opening GPX files automatically view all the data. +* Add 'View All Tracks' option to the panel Layer menu options, which sets the view (center & zoom) to see all the tracks of that layer. +* Add 'View Waypoints' option to the TrackWaypoint layer menu options, which sets the view (center & zoom) to see all the Waypoints. +* Add 'View Track' option to the Track sublayer menu options, which sets the view (center & zoom) to see the track. +* Add 'View Layer' option to the TrackWaypoint Layer menu options, which sets the view (center & zoom) to see the entire layer. +* Add the ability to 'autozoom' to view an area specified by maximum and minimum lat/longs for a TrackWaypoint layer. +* Create a new 'Show' submenu entry +* Improve curl usage as should call cleanup on application exit. +* Add copyright and license properties for NASA BlueMarble data. +* Add background thread loading of DEM files. +* Add Track->Goto Highest and Lowest points features. +* Add Track->Goto Maximum Speed feature. +* Rework Track->Goto menu options. +* Add support for the TMS interface provided by SPOTMaps +* Add license related properties +* Add copyright property +* Improve key binding for Mercator Mode -> ctrl+m +* Add documentation for generic TMS map source +* Improve key bindings for ModeLatLon. +* Add OSM WMS Server +* Add support for WMS-C +* Add support for more standard TMS +* Move-up download methods +* Add LatLon projection +* Better safety checking code +* Add support for Locosys devices via GPSBabel's navilink device protocol. +* Add support for DeLorme devices via GPSBabel's delbin device protocol. +* Add the ability to insert a trackpoint into a track via the Edit Trackpoint dialog. +* Add internal function to insert a trackpoint after the currently selected trackpoint. +* Add license notice to new file +* Enable individual track to GPX export via the Track sublayer menu. +* Set default action on dialogs. +* Add a perl script to auto generate basic Viking .vik files for directories containing images. +* Enable control of the visibility of the menubar [including keyboard shortcut - F4]. Also enable panic key 'Escape' to restore menubar if hidden and no tool uses it. +* Enable control of the visibility of the toolbar [including keyboard shortcut - F3]. +* Make use of the vikwindow toolbar variable. +* Enable control of the visibility of the statusbar [including keyboard shortcut - F12]. + +Fixes since 1.0 +* Prevent Gtk-CRITICAL assertion when the application is closed with a Track Property window on display. +* Prevent Gtk-CRITICAL assertion when the application is closed whilst loading DEMs. +* Fix trackpoint edit altitude sensitivity to be re-enabled after it has been disabled. +* Fix incorrect cut/copy of sublayers when accessed via the layers panel buttons. +* Fix the List Dialog so that it does not become taller than the screen when there are lots of entries. +* Fix some compiler warnings in viktrwlayer.c when configured to build with --disable-alphabetized-trw +* Fix Resource leak detected by cppcheck 1.46 +* Fix compiler warning in curl_download.c +* Fix compiler warning in vikmapslayer.c +* Fix compiler warning in vikwindow.c - use correct const typing. +* Fix compiler warnings - correct Widget / Window type. +* Fix memory leak when generating image file +* Fix: Improve XML reading error reporting +* Fix compiler warnings in osm.c +* Fix compiler warning in vikmapslayer.c +* Fix Waypoint & Track visibility issues. +* Fix SF#3104028: Default Color Background is incorrectly saved as black into a new .vik file. + +Viking 1.0 (2010-11-14) +New features since 0.9.96 +* Add minimal translator-credits in About dialog +* Add documenters to About dialog + +Fixes since 0.9.96 +* Improve copyright holders +* Prevent crashes when downloading Expedia Maps. +* Fix extend track using magic scissors. +* Fix autodownloading while panning +* Fix Debian #599048: Segmentation fault when using gpsbabel +* Fix dem_gradient_colors allocation. +* Fix compiler warnings in preferences.c + +Viking 0.9.96 (2010-10-11) +New features since 0.9.95 +* Use ETag to detect fresh tiles on servers +* Add new menu entry in GPS Layer to delete the realtime information. +* Ensure GPS realtime information deleted when GPS Layer -->Empty All is called. +* Prevent zoom factor string displaying unnecessary .0s when it's a whole number. +* Improve Track Properties speed profile display for low speed difference (e.g. walking) tracks. +* Use speed units in display of Track/Waypoint layer draw by velocity config values, but maintain units as metres per second when read from/saved to files. +* Add keyboard accelerators for as many as possible View Menu entries. +* Simplify zoom status when xmpp and ympp are equal +* Use height units in the altitude readout for the cursor position on the status bar. +* Use height units in display of DEM min / max elevation values, but maintain units as metres when read from/saved to files. + +Fixes since 0.9.95 +* Fix many memory leaks +* DEM layer properties tidy up. +* Prevent getting stuck in a near infinite loop when using Coord layer, UTM mode and zoomed out to see the whole world. +* Prevent lock up in attempt to download maps along a track in UTM mode. +* Launchpad Bug #445374: Prevent crash when downloading maps along a track, with Terraserver maps when in Mercator mode. +* Add explicit linking against libz and libm +* Fix SF#3009431: Prevent Crash in Real Time Tracking GPS Mode & Autodownload Maps. +* Fix display of rounded speed units scale markers in the speed profile. +* Fix cycle map URL +* Fix compiler warnings +* Fix Track Draw by Velocity mode, so that individual track points are coloured (as was the intention). +* Fix bug where older file was removed when network not present +* Fix: warning 'draw-mode' message does not display +* Fix incorrect limitation on source map id + +Viking 0.9.95 (2010-09-07) +New features since 0.9.94 +* Add some function short cut key definitions to control showing of the center mark and scale viewport features. +* [DOC] Replace Google with OSM capability in man pages. +* When manually creating a track, automatically give it a default name. +* [DOC] Add contributors from the Wiki(s) history. +* Better dialog name when searching for a waypoint. +* Change max cache time to 1 week. + +Fixes since 0.9.94 +* Prevent "Gtk-WARNING **: GtkSpinButton: setting an adjustment with non-zero page size is deprecated" messages. +* Invalid number of arguments in call to a_http_download_get_u +* Prevent crash when cut of a GPS track/waypoint layer is attempted via the layers buttons. +* Prevent DEM layer colour indexing going negative and can crash on gradient view. +* Fix DEM layer to show default sea level. +* Fix track background thickness being able to set back to zero. +* Fix internal tile locking +* Fix top layer not drawn after made invisible and then back to being visible. +* Fix impaired (drawcentermark setting bodged) vik file if saved with the top layer visibility turned off. +* Fix syntax errors in help manual +* Fix map drag and drop to show the correct whole map +* Fix "Go to UTM" dialog title. +* Fix first opening of a file which has spaces (or other interesting characters) via the recent files menu. +* Fix unnamed_tracks / unnamed_waypoints misuse. + +Viking 0.9.94 (2010-06-10) +New features since 0.9.93 +* Add knots as a speed unit option. +* Detect USB Garmin eTrex HCx Legend devices (and maybe others). +* Auto use of /dev/ttyUSB type device if available on Unix systems. +* Add ability to turn off Garmin GPS after transfer. +* Add a 'home' default location preference. +* Add ability to changes preferences outside of the preferences.c file. +* NLS Maps API: Historic map of Great Britain +* Change GUI related command line parameter for Waypoint symbol size into run time preference. +* Support All Zoom Levels in Zoom Menu +* [DOC] Import User Manual from wiki +* Add menu item for help contents + +Fixes since 0.9.93 +* Add Viking's contributors as copyright holders +* Remove unecessary '\' from the View Menu +* Better Preferences Dialog Title +* More Menu Improvements +* Replace autogen.sh +* On GPS data acquire, only create a layer if it contains something. +* Fix POTFILES with new source file +* Fix OMF category +* Fix Filter->Simplify All Tracks default. +* [DOC] Fix Gnome's menu entry category for viking +* [DOC] Fix erroneous warning +* Fix compiler warning. +* Fix #2977752: win-gtk: osm tiles don't show up +* Fix Track -> View Google Directions URL +* Fix function's return value +* Fix compilation warnings +* Fix #2988574: Can't save files opened via recent file menu +* Fix #2991657: Terraserver downloads fail +* Fix geocaching + +Viking 0.9.93 (2010-04-11) +New features since 0.9.92 +* Allow overriding map source +* Make GPS layer cut/copy available from popup menu. +* [DOC] Document new files in viking's manpage +* Increase possible smaller zoom +* Add negative scales so that we can have bigger zoom on maps +* Allow images from bigger and smaller zoom to be selected if current zoom has no image + +Fixes since 0.9.92 +* Fix: set a default filename while exporting +* [DOC] Fix: Viking's sources are hosted by Git now +* Further variable type corrections. +* Fix GPS layer copy. +* Fix Track/Waypoint Layer Paste on 64bit systems. +* [DOC] Fix FILES section of manpage. +* Fix: First Track not Black in Draw All Tracks Black Mode. + +Viking 0.9.92 (2010-03-15) +New features since 0.9.91 +* Memorize previously selected go-to service. +* Better scale when zoomed close in and in miles distance mode. +* Add and use preference for height units. +* Add and use preference for speed units. +* Add and use preference for distance units. +* Use a preference to set the tiles age. +* New preference for default maplayer cache. +* Improve DEM-Layer. +* Remove OpenAerial support. +* Translation updates. + +Fixes since 0.9.91 +* Fix: Correctly rotate thumbnail images +* Fix #2958601: Support for non ascii characters in "Go-to" search +* Fix error handling in go-to feature + +Viking 0.9.91 (2010-02-06) +New features since 0.9.9 +* Interpolation for maps: use less precise images when wanted image is not present +* GObjectify maps +** Add compatibility facilities +* GObjectify go-to/search feature +** Add Name finder search engine +** Add Nominatim search engine +** Add Geonames search engine +** Add generic XML search code +* Add configuration file for map sources, goto and external tool + (See examples in distribution) +* Add option to download only maps that are more recent on server +** Try to download newer tiles when autodownload is set and server supports such check +** Tiles must be older than a specified age before checking server +* Add support for recently used files +* Add DEM Gradient +* Add DOAP file + +Fixes since 0.9.9 +* Fix: add GIO dependency and header for GFile +* Fix #2946287: open a recent file +* fix some confusing indentation and bracing +* Fix #2881916: rename a track with c&p +* Fix #2766373: Use a string as device path +* Fix "Moving Map Method" cannot be disabled +* Fix #2880741: replace gps_open with gps_open_r +* Fix #2921899: uses conditional macro to support two versions of libgps +* Fix warnings +* Fix URL formatting issue +* Fix error messages +* Fix #2801874: keep second part of a splitted track visible +* Fix #2838556: emit warning when gpsbabel is not found in PATH +* Fix bashism in test script. +* Merge branch 'fix-osm-api-0.6' +* Fix magic scissors +* Get rid deprecated GtkTooltips API. +* Add configure option to track deprecated feature +* Use motion hints to make map motion more responsive in slow environment. +* Viking compatible with libgps >= 2.90 +* finish OSM 0.6 API support +* Optimise bandwidth usage +* keeping OSM password safe + +Viking 0.9.9 (2009-09-09) +New features since 0.9.8 +* Filter out irrelevant key-modifiers. +* Upgrade OSM-traces support to 0.6 API +* Manage hdop,vdop,pdop,nsat +* Remove unused (and buggy) feature +* Document previous merge +* Improvement of map cache +* Add a viking parameter for mapcache memory size +* Add menu option to flush mapcache, and reduce viking memory footprint +* Use thread-pool to manage download +* Show path used for map directory in options even when using default one +* Include full libcurl version in user agent + +Fixes since 0.9.8 +* Don't crash when jobs are cancelled via the background jobs dialog. +* Fix #2163652: GPX file with byte order mark not parsed +* Fix #2766609: Don't use gpsd_units() +* Fix #2812856: Change SRTM URL +* Fix #2818818: unset langage preset while opening external Google +* Fix copyright in --version output +* Fix SRTM Server change +* Fix memory leaks found with cppcheck +* Fix warning in call to MD5Update() in function md5_hash() +* Fix previous patch +* vdop, hdop, pdop, nsats and fix_mode values were not shown +* Fix #570956: change saved_width to 1 +* Fix build problem +* Fix bug #2481237: Maps directory file chooser should look for directory + +Viking 0.9.8 (2009-01-31) +New features since 0.9.7 +* Add GeoNames support (both for search and for POI import from Geonames+Wikipedia) +* Remove Google's map tiles. +* Add external tools framework. +* Add OpenStreetMap and Google web tools. +* Clicking on "visible" tick no longer makes the layer selected. +* GPX export: sort track by time. +* Merging tracks by name. +* Tittle waypoint properties dialog as "Waypoint Properties". +* Add larger size waypoint symbols (icons). +* Waypoint names are now displayed at the top of waypoint symbol. +* Waypoint symbols: Use Garmin waypoint. +* New server for OSM cycle map. + +Fixes since 0.9.7 +* Fix loading of world map file. +* Fix 2249398: Fix some memory leaks. +* Fix bugs that caused magic scissors not working. +* Fix compatibility problem for windows. +* Fix implicit declaration of maps_layer_default_dir(). +* Fix missing status return in spawn_command_line_async(). +* Fix curl error buffer usage. +* GPS realtime tracking: Keep retrying when fail to connect. +* Windows port: avoid "\\" in URL. + +Viking 0.9.7 (2008-10-12) +New features since 0.9.6 +* Add new moving map method for realtime tracking. +* Rename icon: viking_icon.png -> viking.png +* src/viking.desktop.in: add GenericName and revise Categories +* Change "Zoom To" short cut to avoid conflict with "Zoom Tool". +* Update translations +* Google search adapting changes from Google. +* add osm cycle layer support +* add a menu entry to extend an existing track using magic scissors +* Patch #2009666: OpenAerialMap +* Add preferences to select how degrees are displayed +* Color picker button for the Coordlayer properties dialog +* Cut/Copy/Paste empty selection is not critical +* Layers panel UI improvements +* Homogeneous icons management. +* Add preferences to store OSM login/password +* Add a password entry widget +* Ensure that confirmation dialog is over file selector + +Fixes since 0.9.6 +* Fix 2161310: Fix some more compiler warnings +* Fix 2134452: Properties of some tracks show as NaN +* QA: cleanning old stuff +* Fix segfault in realtime tracking. +* Fix missing files in po/POTFILES.in +* viking.spec.in, src/icons/Makefile.am: Fix icon target dir +* fix parallel build (make -j8) on multi-processor machines. +* Fix #1947260: correct a corrupted escape +* Fixed crashes when creating new layers. +* Fix #1952523: mode_button assertion loading old datafile +* Fix: update layer after applying properties +* Fixed google map download problem. +* Replace specific About dialog by GtkAboutDialog +* Replace some g_warning by g_debug + +Viking 0.9.6 (2008-07-31) +Fixes since 0.9.5 + +* Fix Google maps' URL +* Fix gcget command line to accomodate negative coords +* Fix unecessary viking.desktop + +Viking 0.9.5 (2008-07-21) +New features since 0.9.4 + +* Add panning tool as default. +* Replace GtkFileSelection by GtkFileChooser. +* No longer converts waypoint names to uppercase. Waypoint names are now case insensitive. +* Windows port updated. +* Track properties: Keep markers of the graphs in sync with each other. +* Track properties: split track at marker. +* New translations: el, it, ja, lt, nb, nl, pl, zh_CN, zh_TW +* Added viking.desktop +* Added --debug and --verbose command line options. +* Updated man pages. + +Fixes since 0.9.4 + +* Fix #1839948: Maximize/Restore changes current cursor. +* Bug #1915121: add an utility to reproduce (test/gpx2gpx). +* Fix #1915121: use GLib functions to handle ISO8601 dates. +* Fix pipe leaks. +* Remove dependency to wget. +* Fix google version number. +* Track graph marker now works again. +* Fix #1947456: Compiler warning fixes + + +Viking 0.9.4 (2008-02-25) +New features since 0.9.3 + +* Make elev graph show better graph for low altitude tracks. +* Printing support +* Draw circle for downloading geocaches. +* Improve track graphs. Some tracks looked too flat. +* Internationalization (I18N) +* Localization (L10N): Czech, Danish, German, Spanish, French, Brazilian Portuguese, Swedish +* Use a list of possible browsers. +* New map source: BlueMarble tiles (http://mike.teczno.com/notes/blue-marble-tiles.html) +* New map source: Google Terrain +* Use the "next unused" (not really) waypoint number as default. +* Sort waypoints in GPX output. +* Preferences support in ~/.viking/viking.prefs +* Update source for OSM/Osmarender tiles +* Full screen mode. +* Tuned the v-t diagram drawing + +Fixes since 0.9.3 + +* Many fixes around compilation warnings +* Fix a bug that caused crashes when displaying elev graph for some track. +* Fix bug that caused Old Google maps not being disabled by default. +* Fix a bug that can potentially cause segfault. +* Fix compilation under HURD (missing MAXPATHLEN macro) +* Fix: ensure config.h is included conditionnaly +* Fix a crash bug in mapcache +* Fix a crash bug in merge-by-time + +Viking 0.9.3 (2007-10-21) +New features since 0.9.2 + +* Half-drawn redraw for faster refreshing display of viewport (Maps, tracks, waypoints...) +* Allow multiple selections when adding DEM files. +* (Semi) auto downloading and importing for SRTM 90m DEM file (worldwide). +* Indicating areas which have DEM file download but not imported. +* "Minimum elevation" is now configurable for DEM layer. It can be used together with the existing "Max Elev" to make DEM display more distinguish colors for a particular area of interest. +* Interpolating DEM data. +* Add realtime tracking to GPS layer with track recording. +* Trackpoints acquired in realtime mode store extra information of speed, course, fix mode and number of satellites. +* Track properties dialog no longer blocks user interaction on main window. Using multiple track dialogs (simultaneously for different tracks) is now allowed. +* Make use of DEM elevation data and GPS speed data for track graphs (Properties Dialog). +* Track Properties: now displays track distance/time instead of "Selected Time". +* Marker for selected position on track graphs. +* Various enhancement to improve usability of track dialog. +* Mouse cursor is now changed accordingly to tool currently in used. +* Magic Scissors (Automatically drawing track between points) can now be undone using right click, and extended via Ctrl-click. +* Shortcuts for panning: Ctrl-arrow key, and Shift-scroll and Ctrl-scroll. +* Extend track. +* Ctrl-shift-scroll to zoom like google, scroll to zoom w/o changing center. +* Preview adding a trackpoint by drawing a line when moving mouse. +* Esc key used to stop track edition. +* Backspace key used to remove last added point. +* Use $BROWSER environment variable (for viewing geocache pages). +* Automatically fetching google version numbers. +* Upgrading to API 0.5 of OSM. + +Fixes since 0.9.2 + +* Fix: Make viking's default start location somewhere more likely has maps. +* Fix: bug that causes crashes when using "Maps Download" tool. +* Fix: Adding command line option framework (--help & --version). +* Fix #1789550: mkdtemp usage is conditioned. +* Fix #1789550: define MAX macro if not defined on ALL systems. +* Fix: optional geocaching -- include config.h to compile. +* Fix: DEM Layer copy/paste. +* Fix: crashes on using wrong tools. +* Fix: bugs that caused odd display of date/time on track properties dialog. +* Fix: Correctly calculate position when click on speed-time graph. +* Fix: Relax dependencies about glib. +* Fix: Upgrading to API 0.5 of OSM. +* Fix: plotting of DEM data on elevation graph. + +Viking 0.9.2 (2007-09-04) +New features since 0.9.1 + +* Use $EMAIL to initialise email field for OSM upload. +* Preset filename when exporting a TrwLayer. + +Fixes since 0.9.1 + +* Fix: crash when "applying" a map layer property dialog. +* Fix: Do not warn about drawmode inconsistency while reading file. +* Fix: Hide Expedia view mode when expedia is not built in. + +Viking 0.9.1 (2007-09-02) +New features since 0.9 + +* Upload data (TrackWaypoint layer or single track) to OpenStreetMap. +* Group "Export Layer..." entries in a sub-menu. +* Added --enable-old-google to configure script. Old google modes are now disabled by default. +* Default mode for new maps is Google Maps. +* DEM module can now read hgt.zip files directly (no need to unzip them). +* DEM module can now process 1 arc sec hgt(.zip) files (mainly for USA regions). +* Display on status bar altitude at cursor using data from DEM layer(s). + +Fixes since 0.9 + +* Add redirect support. +* Some improves to introduce the drawmode notion. +* Better checking to detect downloaded text instead of images. +* New google version number. +* libcurl is a requirement. +* Fix bugs that cause crashes on layers copy/paste/delete. +* Fix bug in Google search that caused viking jump to wrong location when Google can not find the match. +* Clean up and eliminate compiler warning. +* Fix bug in creating temporary HOME when HOME is not set. +* Disable GeoCache Acquire since it no longer works. Can be enabled again using configure --enable-geocaches. +* Disable expedia map layer by default since it no longer works. Can be enabled again using configure --enable-expedia. + +Viking 0.9 (2007-07-13) +New Features since 0.1.3 + + * DEM data -- DEMLayer & applying data to tracks & waypoints + * Make "Save Image" and "Save Image Directory" dialogs reusable + * Add viking icon + * Download maps along track + * Add User-Agent to http request header + * Add cookies support (for google requests) + * Add center mark which can be turn on/off in View menu + * Make the scale more visible on dark maps + * Add magic scissors feature + * Add Google Maps search feature + * Many new waypoint symbols + * Add man pages + * Improve performance for map autodownload + * Google Directions now remembers previous query (from/to entries) + * New menu items to remove all tracks and waypoints in GPS folders + * Add "Save and Exit" to File menu + * Save function for GPS layer + * Map tool: Left click can now refresh display of map tiles + +Fixes since 0.1.3 + + * View Mode displayed wrong setting on startup + * crashes on gps download/upload + * SEGFAULT on x86_64 + * segfault on trackpoint properties dialog + * intermittent problem of map redraw + * Stop autodownload from running forever on map downloading errors + * Check for non-displayable data after downloading map + +Viking 0.1.3 (2007-05-17) +- New "Refresh onscreen tiles" entry menu +- Default .spec file for building RPM packages +- Default debian/ subtree for building Debian packages +- Usage of the libcurl library +- Three new map sources from OpenStreetMap +- Better usage of libusb +- Google source map improved +- GUI improves + +Viking 0.1.2 (2007-02-13) +- direct access to GPS device: GPS layer +- position inputs accept DDD/DMM/DMS formats (ex: 3.5, 3\B030.0, 3\B030'0.00) +- time position in Track Poperties +- tool (menu entries and buttons) are enabled/disabled following context +- standard 'Edit' menu (with 'Copy', 'Cut', 'Paste' and 'Delete' actions) +- 'Edit' popup menus for waypoint and track +- new configure options: + * --disable-google + * --disable-terraserver + * --disable-expedia +- visual feedback when moving waypoints +- map sections are displayed while downloading +- cosmetics changes (window title, viking's URL in files, 'About' dialog...) +- some improves in source code +- lot of fixes + +Viking 0.1.1 (2006-06-11) +- more map sources such as google +- drag and drop of layers and way/trackpoints +- copy/paste between vikings +- "smart" copy which can parse a lat/lon from web pages like geocaching, emails, etc. +- graphs of altitude/velocity +- newer gtk with toolbar icons +- experimental "acquire" features: from GPS, from Google directions, from Geocaching +- gpx support + +Viking 0.1.0 (2005-02-27) +- new map layer which supports Google, Expedia, and Topozone maps in addition to the three types of Terraserver maps, +- lots of other fixes, +- visualization options, +- miscellaneous goodies. diff --git a/README b/README new file mode 100644 index 0000000..13ff82a --- /dev/null +++ b/README @@ -0,0 +1,4 @@ +This file is just to please some automake setting + +See README.md file for the actual information + diff --git a/README.md b/README.md new file mode 100644 index 0000000..7eb70cc --- /dev/null +++ b/README.md @@ -0,0 +1,73 @@ +# Viking [![Build Status](https://travis-ci.org/viking-gps/viking.svg?branch=master)](https://travis-ci.org/viking-gps/viking) + + +Viking is a free/open source program to manage GPS data. You can +import, plot and create tracks, routes and waypoints, show OSM +and other maps, generate maps (using Mapnik), +see real-time GPS position, Geotag Images, +control items, upload/download OSM Traces and more. +It is written mainly in C with some C++ and uses the GTK+2 toolkit. + +Website: http://viking.sf.net/ + + +## Obtaining Viking + +You can download tarball of latest released version at +https://sourceforge.net/projects/viking/files + +You can also retrieve the latest development version on the official +Git repository: + + $ git clone git://git.code.sf.net/p/viking/code viking + +## Installing Viking + +### Dependencies + +On Debian Sid, following packages must be installed before building: + + # sudo apt install gtk-doc-tools gnome-doc-utils libpng-dev libgtk-3-dev libicu-dev + +The following packages are needed (they are included by default in Debian Sid, but not in other distributions). They must be installed too: + + $ sudo apt-get install libcurl4-gnutls-dev libgtk2.0-dev + +The following packages are also used, but they can each be disabled with configure options, if desired: + + $ sudo apt-get install libsqlite3-dev nettle-dev libmapnik-dev libgeoclue-2-dev libgexiv2-dev libgps-dev libmagic-dev libbz2-dev libzip-dev liboauth-dev + +Further packages are required if you want to generate man and help page documentation: + + $ sudo apt-get install docbook-xsl rarian-compat + +### Actual Build + +If you downloaded Viking from Git, you have to: + + $ ./autogen.sh + +Next, or if you downloaded a tarball, you have to: + + $ ./configure + $ make + +Check output of "./configure --help" for configuration options. In +particular, it is possible to disable some features, like +--disable-google in order to disable any Google stuff. + +If you wish to install Viking, you have to (as root): + + # make install + +For detailed explanation on the install on Unix like systems, +see the INSTALL file. + +### Examples + +See test/ subdirectory for examples. + +## Documentation + +See doc/ and help/ subdirectories for documentation. +You can also access user manual via Help menu entry. diff --git a/TODO b/TODO new file mode 100644 index 0000000..30f0171 --- /dev/null +++ b/TODO @@ -0,0 +1,534 @@ +=============================== + FOR HISTORICAL REFERENCE ONLY +=============================== + +This file hasn't been touched since early 2007 (other than this update!) + +Most of the TODOs/ideas are now maintained in the Wiki and/or feature requests in the SourceForge tracker. + +It also contains some historical implementation data for changes made in the 0.0.X series in 2003+2004, + before the public source code version tracking started (2005 onwards in svn and then git). + +-------------------------------- + + +FEATURE FREEZE!!! +-------------- +BEFORE RELEASE: + fix KH maps download + clipping -- OK as is? + fix SEGFAULT when clicking too far right on elevation diagram + google maps download stops (try auto-download), extra processes in background doing nothing + GPSBABEL!!! + * existence check sed, wget, etc. + * Smooth over rough edges / ugliness / crashes +------------------ + * Filter a TRW layer: simplify paths, get out waypoints inside a path, etc. + * geocaches: all on screen / radius + * error if gcget isn't functioning correctly + * Google address -> WP + +FEATURES: + Paste GPX files into Viking -> TRW Layer + Paste TRW layers into text editor -> GPX + Undo function + Map licensing issues (?) + DND between VikWindows + arrows to show track direction + Select multiple items (waypoints, etc) in layers panel (???) + Merge layers easier ("Merge down" la Gimp) + Output to gc2visor + Selections (select waypoints, tracks in an area) + +EASY FIXES: + "click to go there" elevation map: average out, not nearest trackpoint. + Ruler: calculate degrees by spherical geometry formula ('zoom in too much' bug -- coord_to_screen out of range of double) + for UTM: rotate compass for declination. + + +----------------------------------------- + +RATHER HARD FIXES, SHOULD BE DONE BUT NOT MANDATORY FOR RELEASE: + tracks have their own colors, etc. + replace HTTP code!!! + relative photo pathnames (relative to GPS data file) + Optimizations (compare to 0.0.5) + SETTABLE OPTIONS: map cache size, alphabetized waypoints/tracks, picture viewer, webbrowser + Speed up waypoint drawing; option for faster drawing. + what if try to REDOWLOAD while RE/DOWNLOADing? + Redraw when becomes available, somehow? Also, show maps in progress a different color. + map loading/memory caching in the background? (for zoom out) + WHITE UNDER TRACKS! DONE FASTER! CLEAN THIS UP! + +FEATURE WISHLIST (i.e. unlikely to get done): + selections (select area of waypoints, trackpoints, etc) + elevation plotting is not so pretty if you're moving north, as it overlays stuff uglily. discussion? + bicycle runs your track (animation) that tilts depending on slope + hover over pic + Better annotation for tracks, etc. Fields, etc. + Filled polygons + New UI: "Track Tool" => just analyze/pick out, right click or button to edit + right click to do new track + or "Track/Waypoint Tool" + I18N (das mundo ne parle pas agglika) + Vector/TIGER maps!!! (use Cairo/Roadster code?) + +MISC FIXES (i.e. will never get done): + Reid's 23, including waypoints, GPX/XML Viking files. + modular plotting styles? just an idea... + optimize Lat/Lon performance with its own CE1, CE2 etc. + make ce1, cn2 etc for lat/lon & utm; maybe get out the checking code in vik_viewport (see draw_rectange for instance) + Progressive Loading (GdkPixbufLoader) + CACHING WHOLE CHUNKS? (USEFUL FOR MAP ZOOM TOO!) RELOAD BUTTON? + * instead of using "emit"s in tools, do this: + * "add-only" return value -- only redraw this layer and layers above it. + OR maybe even more advanced -- only redraw certain portions of screen. + what about ALPHA??? uh oh... + "always redraw" return value -- if layer is visible or not -- e.g. goto wp + "redraw if visible" return value + settable defaults for layers (sigh...) OR at least config.h stuff + + +-------------------------------- + +0.0.9 / 0.1.0 + SELECTIONS (?) + * square & track-based + * select everything in, everything out + * download maps in + WAYPOINTS + * pango for text; text background with settable colors & options + * move & edit waypoints!!! auto-select for that + * maybe an option to turn on auto-select: off, on, only for same layer (default) + MAPS + * some of the above optimizations + MERGE TRW + * auto-rename dupes + * delete dupes by name + * delete dupes by location; name & location + TRACKS + * track editing -- everything on that idea sheet on my desk. + * insert into track + * show list of pics in one location + * maybe track-by-elevation + MISC + * alphabetize waypoints & tracks + * d&d layers (not worth it?) + FIXES + * crazhy-crazhy auto-switch UTM? + * figure out save image in background stuff, sigh... + * "widget properties set value param data" + -> check if has properties params + -> in layer_prop_fact: hold value's check if changed. + -> return TRUE only if value affects look + -> beautify dynamic properties boxes (checkboxes please?) + -> groups + -> maybe get rid of post_read (use set_param to update gc's -- but maybe not...) + * TODOs & FIXMEs + * due <= 2004-6-12 (1 yr after 0.0.3) + +DONE: + * do alpha _right_ (to see what I mean, try drawing a transparent PNG) +----------------------- + +POSSIBLE MAP OPTIMIZATIONS: +save conglomerates of shrunken images [to disk]? +static cache.c shared between everything -- SHARE MAP CACHES BETWEEN LAYERS AND WINDOWS!!! +background loading thread +load zoomed out images into conglomerates + -or- +Sort images by some sort of checksum (maybe sum of all digits) into 10 groups +makes finding cached image 10 times faster +if we somehow know we're not going to have enough room to store all maps for 1 redraw in cache, don't cache at all. +better cache management -- maybe every map in memory? +--> cache should fit more small maps than big ones!!! + maybe number for cache_size, keep track of it manuall, calculate from shrinkfactor? <-- good idea +pixmap (not pixbuf) cache? +vikmaplayer.c:520, don't run g_slist_length who-knows-howmany times (only noticable when shrinking cache) +stat images to make sure the size isn't zero (vs. trying to load them). then show errors for bad ones (?) +don't lookup IP each time (?) + +------------------------------ + + + Then, focus on Lat/Lon and mapquest maps. (????) + Then, focus on Lat/Lon and mapquest maps. + +0.0.9 "260 million maps... I can't hear you at all" release: +finalize pthread/map download UI. +export to image fix bug +viking running -> use this thread ( good luckers !!! ) +merge trw layers + +0.1.0 "where we're going, we don't need roads" release (concept idea): +Select a waypoint, delete to delete it, real tools, a toolbar, etc. +Drag and drop layers +alphabetatize waypoints & tracks +"area selections" -- select tool -> select waypoints in/outside area, download maps in area, etc. etc. + +-/-/-/-/-/-/-/-/-/-/-/-/-/-/-/-/-/-/-/-/-/-/-/-/-/ + +0.1.0: the "fixes, patches, improvements, and goodies" release + "Where we're going, we don't need roads..." + + * move a_dialog_new_track to viktrwlayer.c. Clean up VikTrwLayer, separating into several more-managable functions. + * get rids of pass_along, layer_and_vlp junk, just use update signal and track_iters (maybe make waypoint_iters) (?) + * TODO longones + * general cleanups, what you have time for (vik_trackpoint_free etc, draw_track, etc.) + * do we really have to have all those global funcs in vik_trw_layer ? +right click->new track here, new waypoint here. general TRWEdit tool with popup on vikviewport, it can be done. +general edit->delete to delete whatever is selected. ugly stuff ahead. +show human-readable timestamp +toolbar/toolbox, tool opts win (for tpwin) like in gimp (?) +Maybe fix "private" ref_count in clipboard.c (?) +clean up viktrwlayer.c, call track_realize() when adding track with add_track(), del dup. code, esp. in track_draw +move/edit by click for wp? +toolbar/toolbox, tool opts win (for tpwin) like in gimp (?) +only draw if in UTM zone !!! +Track color-by-elevation ( go all over an area, make tracks thicker/zoom out to create DEM color map ?! ) +maps zoomed out +Thing to download lotsa maps (script or builtin -- ?) +Merge layers (what a say we have 2 layers, one with wp's, one with tracks) + merge: auto rename (everything begins with "layer name: ") + right click agg -> merge trw children -> super trw + or multiple slect/copy & paste +picture layer, thumbnails and all... +move to gpsbabel default altitude, reflect it everywhere, include viking-remote +gpspoint.c -- use new easy gpsbabel code, abc, 123. + +hard things to think about that need to be done sometime (mainly hard/impossible): +1) map downloader process / map download queue +2) if viking already running, use that process. cut and paste will work much better. + +EVERYTHING ABOVE THIS LINE SHOULD BE IN 0.1.0! 0.2.0 WILL FOCUS ON LAT/LON AND STREET MAPS + +----- + +0.2.0 +* Plot as lat/lon + For mapquest & georef maps: vikviewport "mode" to draw in (utm or straightened lat/lon), check before drawing, convert for TP, etc. +* full georef support, release minnesota/manganese +* mapquest maps +* smart drawing -- determine if line segment passes thru area, fancy math... +* map downloading manager, smarter ways -- e.g. "download maps within polygon" +* maybe a gpsbabel plug-in +* topos zoomed out if it didn't make it into 0.1.0 +* maybe better wp drawing +* wp's alphabetically (good luckers) or at least when loading +* wp editing +* direct gps support + +0.3.0 (still here?) +* new viking -> not new process +* wp icons +* routes +* improve direct manipulation +* bugfixes +* smart labeling so we can see 2 wp's (nearly) in the same place +* UTM zones (?) + +1.0 +* DEM maps +* mapsource files +* anything else possible, plausible and desirable. +* lots and lots of docs +* UI cleanups + +Uses: +* planning +* viewing -- showing places/tracks on topo or street maps or scanned maps +* map download & printing -- your own, TOPO-thomas guides or city thomas guies +* adding coord lines to scanning maps -- print 'em out or see where they are +* editing tracks +* managing & organizing data +* creating maps and gps maps + +SCALING: +* maybe downn scaling of higher-quality topos to accommodate odd zoom resolutions. this would also be useful for downloading _only_ high + quality topos, or zooming out and seeing what topos we are missing, or downloading LOTS more topos at once (w/ download all on screen) + again, we will have to see how good GTK scaling is. +* maybe scaling of weird-scale (georeferenced) maps + +Other +* georeferenced raster layer: + Optional: + - fix off-by-one-pixel bug (probably corner stuff) (?) + - utm zones (?) + - tool (maybe BUTTON 4,5 thing), and maybe a better zoom tool. but for release it's OK. + +ROTATION/MESSED UP MAPS: +* Track/Waypoint Plotting as Lat/Lon (or artificial rotation, maybe preferred) for those kind of maps + and/or rotation of maps (not as good) +* maybe option "draw as lat long -- UTM center +- 1000 or something to find degrees/pixel (or use some other formula a la odu) +* or just rotation in screen_to_utm and utm_to_screen +* "anchoring down" one part of a georeferenced map for rotation and scaling. + +* fix coord layer, it is SO horribly broken for high zoom levels. + +* Investigate "chunk already freed" +* investigate if layer type doesnt have icon wont start bug +* Cleanups and fixes until 0.0.5-final: +* at least two of these things + * Merge TRW Layers + * copy and paste items + * MapBlast + +These Cleanups: + +-> These Cleanups +maybe "max size" thing for each param +--> maybe address within layer (struct offset) so wwe can just do away with set_param (in most cases). put stuff in realize or after_read +cleanup interface <---- IMPORTANT + +-> cleanups below + +-> sometime: + has_altitude or NO_ALTITUDE -> 999999 + +-> 0.0.6 + +C*L*E*A*N*U*P*S + +dialog.c -> misc.c, viktrwlayer.c +export a layer from the file menu, some how. Export Layer -> choose layer. or Export Selected Layer (disabled as need be +--- +*MAYBE* + +RGN type and other type in something of its own, not name. +that way, we can use the same file for waypoints to gps and for maps. + +solutions to this problem: +File->Properties: + Position: + Save current position + Save this position: + UTM/LATLON ZOOM + Save no position + +------- +------- +------- +------- + +(fixes + cleanups + scaling + rotation + ruler widgets (?) + topos & orthos in one (?) + copy&past items + merge layers) = 0.0.6 + +then 0.0.7, 0.0.8, 0.0.9 focus + +things before "major" release: +direct manipulation (major feature/use) +use current viking (maybe) + +to second "major" release: +libgpspoint2 and/or gpsd (show current pos) +map ui (rough edge) +analyzing stuff better, exact analyzing. + +to 1.0 +UTM ZONE!!! + +> Although almost all of these are on your todo list I thought I would add my thoughts. +> +> 1. Being able to choose the map units. The metric system still baffles +> some of us. +> 2. Modular set up for map sources. The urls tend to change/disapear +> when companies get bought up by micro$oft (mapblast). The ability to +> import/export georefrenced maps. +> 3. Manipulations of track data...distance, altitude etc. +> 4. Export/printing of maps. +> 5. Eyecandy. Colors and symbols for tracks, waypoints and routes. Shade +> topo maps with DEM data. + +file format + hig compliance + bug fixes + MAYBE track undo = 0.0.4 +FF2 + ruler widget + topos&orthos in one +comment field + bugfixes = 0.0.5 +if viking already running, use that process. + copy and paste layers + merge layers + + copy and paste items + bugfixes = 0.0.6 +Direct manipulation, WYSIWYG moving + track connecting + etc = 0.0.7 +track segment selection, deletion, track point deletion (create two segments or skip point) + + waypoint symbols + bugfixes = 0.0.8 +toolbar + layer properties boxes changes, etc. + misc = 0.0.9 +routes + misc + code cleanups = 0.0.10 +map download ui + code cleanups + bugfixes = 0.0.11 +other goodies, fixes, break release = 0.0.12 +misc, etc. fixes, cleanups = 0.0.14 +autotools, I18n + etc. = 0.0.15 +fixes = 0.1.0 + +(NOT IMPORTANT. FF2 will come.) +functions write_utm, read_utm to save space +sizeof(Waypoint) != sizeof(components)! try to save disk space +len of layer for each layer so older versions can skip over new layers +Make it so if layertype >= vik_layer_num_types, skip layer. (in aggregatelayer.c) +Use magic numbers, and lengths to better prevent version messing ups (len of layer data, if extra, + rest skip, if not enough, ignore, etc.) 9in layer file themselves) +--- + +Viking 0.1.0 "It's been a long road..." + +> 0.1.0: anylyzing speed and time, libgpspoint, misc goodies +> 0.2.0: garmap layers, utm zones, etc. + +0.0.4 "Lame Duck Tape" +-------------------- +0.0.6 "Where we're going, we don't need roads..." +-------------------- +--Definitely: +UNDO DELETE LAYER!!! Or ask, maybe? For now, ask: later, maybe an undo "stack of commands" where things at the bottom of the stack are done only as new things push them down? +more "Forgive the user" kind of stuff. + +FIXES: + Acceptable chars in dialog.c & gpspoint.c + file check if it's a directory for load & save. + +Route support! + +Toolbar +Do something similar with tools. layer_tools func in interface, then a tools structure, array, or add2menu func. humm + +Track Colors -- PROBABLY. + +viktrwlayer_dialog.c -- we MUST do this one. + No, even better Idea. framework where properties are stored as RESOURCES for each type of layer. + Each type of layer defines it's own resources and the viking layer dialog builder picks it up and draws the dialog. + Comments? Format? Fields? + Type: check, double/spin (including range, and all other params), string, double/entry, int/entry + And then subdivisions (tabs) of that. Track drawing, track colors, waypoints. or Drawing, Colors, ... + +fix layers_menu_add_layers + I've made a mess of the add menu stuff. The add submeny is bad. + maybe a itemfactory thing in layer interface (for now, it's OK... but...) at the very least a serializedicon thing in + interface so I don't have to serialize it every time... draining resources. + + -- what if i have one menu with the icons and everything already made, and both vlp and wikwindow adds that? no, then i + could't have custom callback data. what if all layer types' itemfactory items were modeled as "Add Layer/TRW Layer" Then + I'd have an add layer menu in each? + -- think about it. + + +MAYBE: + MOVE A WAYPOINT + Waypoint Symbols, get started. symbols.c where i have a Name->ID mapping, then an ID->icon mapping. Get Started on Icons. + Merge 2 TRW Layer + Better CoordLayer. + Fix Some Bugs, Clean up Some Code. + Bulk Map Downloader (maybe another project) + renaming waypoints -- overwriting + + +And There's Your Release. + +Other Ideas: +fix editing / move bug (ideas?) +copy & paste individual tracks & waypoints +tracks & waypoint ordering (?!) +don't forget about track SEGMENTs !!! (shoot for 0.0.5; should be in by 0.0.6) +vik_trw_layernew_track like waypoint. or maybe not (need starting point?) +I18N -- at least fake ( all strs _() ized) +HIG compliance... +maybe export all visible trw's (nah, merge) +select waypoint; break up a track +Coordlayer color chooser +Coordlayer: UTM +trw_layer centerize: randompoints & average +maybe in item_add get visible and name from the layer / track / whatever itself. +ALSO, maybe chane set_name to update_name. +show tracks and waypoints (dynamic stuff)!! Copying between layers! YEAH + +do some TODOs + +--------------------------------------- +| 0.0.5 | +--------------------------------------- +| "Not all those who wander are lost" | +--------------------------------------- +Track & Waypoint sorting +Convert to GLIB Gobjects for layers +I18N +AutoTools +Track Colors +select waypoints; select trackpoints; selet track segments; measuring track & segment length; analyzing trackpoint altitude +& time by selecting it; color by altitude/ +Copy & Paste Layer (see below) +legend (length) + +copying between layers: sublayer_add_menu_items () -> copy -> static pointer for layers panel, or whole process. +two ways of doing it: layer2copy & sublayer2copy, or general purpose "cliboard" var. on paste, layer / aggregate layer figures it out. +I vote for "layer2copy" and "sublayer2copy". That way, each layer can check if it can paste the sublayer and paste layer will always be there. +then you need a duplicate function for each thing you want to copy. shouldn't be too bad. + + +~-~-~-~-~-~-~-~ +0.0.6 "Where no man has gone before" +--------------- +Map Download Background Thread +LibGpsPoint +Settabl eFonts +UTM zones +Waypoint Symbols +Edit Timestamps +show different fields on side: altitude, time, etc. sort by these. maybe a layer edit dialog box. + +------ +0.1.0 +------ +Garmap Layer! + + +Other: +-------------- +waypoint symbols +make your own timestamp +CACHE MAP SERVER IP; RETURN ERROR FOR WHY DOESNT WORK +MAP DOWNLOAD PROGERESS (!) +more g_asserts ... lots more +UTM zones, aye... + +---------------------------------------- +======================================== +++++++++++++++++++++++++++++++++++++++++ +fix tracks thing: STILL BUGS ! and clean up function maybe? +start noplace, when open file start in middle of there +clarification of new / open ( add to or what? maybe add to in layer; merge layer stuff ) +status bar: don't overlap stuff + +i18n!!! + +coordlayer -- ticks only +tick marks or lines for utm lines so you can tell where you are (TickLayer) + +Intelligent Map Caching: knows which way you're going ... just something to think about. + +Download all maps + +routes +choosable gcs including background +Maybe each track has it's own GC? Just a thought. +Tools, explore etc. tools menu. tools window / bar +save stuff +status bar for track info, etc. + ++TODO from otu ... + +glist for routes (pointer directly to string used in ghashtable key? possible?) and tracks. + +"Viking -- can you handle the power?" +"Viking -- where do you want to go today?" +"Viking -- where have you been today?" +"Viking -- where did you go today?" + +"Vikingis Conqueris" + +"The Viking Conquereth" +Viking 0.0.1pre15 + +Viking "the fake GIS" +Viking "the wannabee GIS" +Viking "CasiGIS" + +Viking QuasiGIS (tm) + +GPX support, loc.gz +So Many Possibilities... + +OTU can do Viking can't: + * routes + * instant GPS location (sorta) diff --git a/aclocal.m4 b/aclocal.m4 new file mode 100644 index 0000000..1904c0c --- /dev/null +++ b/aclocal.m4 @@ -0,0 +1,2344 @@ +# generated automatically by aclocal 1.16.1 -*- Autoconf -*- + +# Copyright (C) 1996-2018 Free Software Foundation, Inc. + +# This file is free software; the Free Software Foundation +# gives unlimited permission to copy and/or distribute it, +# with or without modifications, as long as this notice is preserved. + +# This program is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY, to the extent permitted by law; without +# even the implied warranty of MERCHANTABILITY or FITNESS FOR A +# PARTICULAR PURPOSE. + +m4_ifndef([AC_CONFIG_MACRO_DIRS], [m4_defun([_AM_CONFIG_MACRO_DIRS], [])m4_defun([AC_CONFIG_MACRO_DIRS], [_AM_CONFIG_MACRO_DIRS($@)])]) +m4_ifndef([AC_AUTOCONF_VERSION], + [m4_copy([m4_PACKAGE_VERSION], [AC_AUTOCONF_VERSION])])dnl +m4_if(m4_defn([AC_AUTOCONF_VERSION]), [2.69],, +[m4_warning([this file was generated for autoconf 2.69. +You have another version of autoconf. It may work, but is not guaranteed to. +If you have problems, you may need to regenerate the build system entirely. +To do so, use the procedure documented by the package, typically 'autoreconf'.])]) + +# Copyright (C) 1995-2002 Free Software Foundation, Inc. +# Copyright (C) 2001-2003,2004 Red Hat, Inc. +# +# This file is free software, distributed under the terms of the GNU +# General Public License. As a special exception to the GNU General +# Public License, this file may be distributed as part of a program +# that contains a configuration script generated by Autoconf, under +# the same distribution terms as the rest of that program. +# +# This file can be copied and used freely without restrictions. It can +# be used in projects which are not available under the GNU Public License +# but which still want to provide support for the GNU gettext functionality. +# +# Macro to add for using GNU gettext. +# Ulrich Drepper , 1995, 1996 +# +# Modified to never use included libintl. +# Owen Taylor , 12/15/1998 +# +# Major rework to remove unused code +# Owen Taylor , 12/11/2002 +# +# Added better handling of ALL_LINGUAS from GNU gettext version +# written by Bruno Haible, Owen Taylor 5/30/3002 +# +# Modified to require ngettext +# Matthias Clasen 08/06/2004 + +# Increment this whenever this file is changed. +#serial 1 + +# We need this here as well, since someone might use autoconf-2.5x +# to configure GLib then an older version to configure a package +# using AM_GLIB_GNU_GETTEXT +AC_PREREQ(2.53) + +dnl +dnl We go to great lengths to make sure that aclocal won't +dnl try to pull in the installed version of these macros +dnl when running aclocal in the glib directory. +dnl +m4_copy([AC_DEFUN],[glib_DEFUN]) +m4_copy([AC_REQUIRE],[glib_REQUIRE]) +dnl +dnl At the end, if we're not within glib, we'll define the public +dnl definitions in terms of our private definitions. +dnl + +# GLIB_LC_MESSAGES +#-------------------- +glib_DEFUN([GLIB_LC_MESSAGES], + [AC_CHECK_HEADERS([locale.h]) + if test $ac_cv_header_locale_h = yes; then + AC_CACHE_CHECK([for LC_MESSAGES], am_cv_val_LC_MESSAGES, + [AC_TRY_LINK([#include ], [return LC_MESSAGES], + am_cv_val_LC_MESSAGES=yes, am_cv_val_LC_MESSAGES=no)]) + if test $am_cv_val_LC_MESSAGES = yes; then + AC_DEFINE(HAVE_LC_MESSAGES, 1, + [Define if your file defines LC_MESSAGES.]) + fi + fi]) + +# GLIB_PATH_PROG_WITH_TEST +#---------------------------- +dnl GLIB_PATH_PROG_WITH_TEST(VARIABLE, PROG-TO-CHECK-FOR, +dnl TEST-PERFORMED-ON-FOUND_PROGRAM [, VALUE-IF-NOT-FOUND [, PATH]]) +glib_DEFUN([GLIB_PATH_PROG_WITH_TEST], +[# Extract the first word of "$2", so it can be a program name with args. +set dummy $2; ac_word=[$]2 +AC_MSG_CHECKING([for $ac_word]) +AC_CACHE_VAL(ac_cv_path_$1, +[case "[$]$1" in + /*) + ac_cv_path_$1="[$]$1" # Let the user override the test with a path. + ;; + *) + IFS="${IFS= }"; ac_save_ifs="$IFS"; IFS="${IFS}:" + for ac_dir in ifelse([$5], , $PATH, [$5]); do + test -z "$ac_dir" && ac_dir=. + if test -f $ac_dir/$ac_word; then + if [$3]; then + ac_cv_path_$1="$ac_dir/$ac_word" + break + fi + fi + done + IFS="$ac_save_ifs" +dnl If no 4th arg is given, leave the cache variable unset, +dnl so AC_PATH_PROGS will keep looking. +ifelse([$4], , , [ test -z "[$]ac_cv_path_$1" && ac_cv_path_$1="$4" +])dnl + ;; +esac])dnl +$1="$ac_cv_path_$1" +if test ifelse([$4], , [-n "[$]$1"], ["[$]$1" != "$4"]); then + AC_MSG_RESULT([$]$1) +else + AC_MSG_RESULT(no) +fi +AC_SUBST($1)dnl +]) + +dnl Checks for special options needed on Mac OS X. +dnl Defines INTL_MACOSX_LIBS. +dnl +dnl Copied from intlmacosx.m4 in gettext, GPL. +dnl Copyright (C) 2004-2013 Free Software Foundation, Inc. +glib_DEFUN([glib_gt_INTL_MACOSX], +[ + dnl Check for API introduced in Mac OS X 10.2. + AC_CACHE_CHECK([for CFPreferencesCopyAppValue], + [gt_cv_func_CFPreferencesCopyAppValue], + [gt_save_LIBS="$LIBS" + LIBS="$LIBS -Wl,-framework -Wl,CoreFoundation" + AC_LINK_IFELSE( + [AC_LANG_PROGRAM( + [[#include ]], + [[CFPreferencesCopyAppValue(NULL, NULL)]])], + [gt_cv_func_CFPreferencesCopyAppValue=yes], + [gt_cv_func_CFPreferencesCopyAppValue=no]) + LIBS="$gt_save_LIBS"]) + if test $gt_cv_func_CFPreferencesCopyAppValue = yes; then + AC_DEFINE([HAVE_CFPREFERENCESCOPYAPPVALUE], [1], + [Define to 1 if you have the Mac OS X function CFPreferencesCopyAppValue in the CoreFoundation framework.]) + fi + dnl Check for API introduced in Mac OS X 10.3. + AC_CACHE_CHECK([for CFLocaleCopyCurrent], [gt_cv_func_CFLocaleCopyCurrent], + [gt_save_LIBS="$LIBS" + LIBS="$LIBS -Wl,-framework -Wl,CoreFoundation" + AC_LINK_IFELSE( + [AC_LANG_PROGRAM( + [[#include ]], + [[CFLocaleCopyCurrent();]])], + [gt_cv_func_CFLocaleCopyCurrent=yes], + [gt_cv_func_CFLocaleCopyCurrent=no]) + LIBS="$gt_save_LIBS"]) + if test $gt_cv_func_CFLocaleCopyCurrent = yes; then + AC_DEFINE([HAVE_CFLOCALECOPYCURRENT], [1], + [Define to 1 if you have the Mac OS X function CFLocaleCopyCurrent in the CoreFoundation framework.]) + fi + INTL_MACOSX_LIBS= + if test $gt_cv_func_CFPreferencesCopyAppValue = yes || test $gt_cv_func_CFLocaleCopyCurrent = yes; then + INTL_MACOSX_LIBS="-Wl,-framework -Wl,CoreFoundation" + fi + AC_SUBST([INTL_MACOSX_LIBS]) +]) + +# GLIB_WITH_NLS +#----------------- +glib_DEFUN([GLIB_WITH_NLS], + dnl NLS is obligatory + [USE_NLS=yes + AC_SUBST(USE_NLS) + + gt_cv_have_gettext=no + + CATOBJEXT=NONE + XGETTEXT=: + INTLLIBS= + + glib_gt_INTL_MACOSX + + AC_CHECK_HEADER(libintl.h, + [gt_cv_func_dgettext_libintl="no" + libintl_extra_libs="" + + # + # First check in libc + # + AC_CACHE_CHECK([for ngettext in libc], gt_cv_func_ngettext_libc, + [AC_TRY_LINK([ +#include +], + [return !ngettext ("","", 1)], + gt_cv_func_ngettext_libc=yes, + gt_cv_func_ngettext_libc=no) + ]) + + if test "$gt_cv_func_ngettext_libc" = "yes" ; then + AC_CACHE_CHECK([for dgettext in libc], gt_cv_func_dgettext_libc, + [AC_TRY_LINK([ +#include +], + [return !dgettext ("","")], + gt_cv_func_dgettext_libc=yes, + gt_cv_func_dgettext_libc=no) + ]) + fi + + if test "$gt_cv_func_ngettext_libc" = "yes" ; then + AC_CHECK_FUNCS(bind_textdomain_codeset) + fi + + # + # If we don't have everything we want, check in libintl + # + if test "$gt_cv_func_dgettext_libc" != "yes" \ + || test "$gt_cv_func_ngettext_libc" != "yes" \ + || test "$ac_cv_func_bind_textdomain_codeset" != "yes" ; then + + AC_CHECK_LIB(intl, bindtextdomain, + [AC_CHECK_LIB(intl, ngettext, + [AC_CHECK_LIB(intl, dgettext, + gt_cv_func_dgettext_libintl=yes)])]) + + if test "$gt_cv_func_dgettext_libintl" != "yes" ; then + AC_MSG_CHECKING([if -liconv is needed to use gettext]) + AC_MSG_RESULT([]) + AC_CHECK_LIB(intl, ngettext, + [AC_CHECK_LIB(intl, dcgettext, + [gt_cv_func_dgettext_libintl=yes + libintl_extra_libs=-liconv], + :,-liconv)], + :,-liconv) + fi + + # + # If we found libintl, then check in it for bind_textdomain_codeset(); + # we'll prefer libc if neither have bind_textdomain_codeset(), + # and both have dgettext and ngettext + # + if test "$gt_cv_func_dgettext_libintl" = "yes" ; then + glib_save_LIBS="$LIBS" + LIBS="$LIBS -lintl $libintl_extra_libs" + unset ac_cv_func_bind_textdomain_codeset + AC_CHECK_FUNCS(bind_textdomain_codeset) + LIBS="$glib_save_LIBS" + + if test "$ac_cv_func_bind_textdomain_codeset" = "yes" ; then + gt_cv_func_dgettext_libc=no + else + if test "$gt_cv_func_dgettext_libc" = "yes" \ + && test "$gt_cv_func_ngettext_libc" = "yes"; then + gt_cv_func_dgettext_libintl=no + fi + fi + fi + fi + + if test "$gt_cv_func_dgettext_libc" = "yes" \ + || test "$gt_cv_func_dgettext_libintl" = "yes"; then + gt_cv_have_gettext=yes + fi + + if test "$gt_cv_func_dgettext_libintl" = "yes"; then + INTLLIBS="-lintl $libintl_extra_libs $INTL_MACOSX_LIBS" + fi + + if test "$gt_cv_have_gettext" = "yes"; then + AC_DEFINE(HAVE_GETTEXT,1, + [Define if the GNU gettext() function is already present or preinstalled.]) + GLIB_PATH_PROG_WITH_TEST(MSGFMT, msgfmt, + [test -z "`$ac_dir/$ac_word -h 2>&1 | grep 'dv '`"], no)dnl + if test "$MSGFMT" != "no"; then + glib_save_LIBS="$LIBS" + LIBS="$LIBS $INTLLIBS" + AC_CHECK_FUNCS(dcgettext) + MSGFMT_OPTS= + AC_MSG_CHECKING([if msgfmt accepts -c]) + GLIB_RUN_PROG([$MSGFMT -c -o /dev/null],[ +msgid "" +msgstr "" +"Content-Type: text/plain; charset=UTF-8\n" +"Project-Id-Version: test 1.0\n" +"PO-Revision-Date: 2007-02-15 12:01+0100\n" +"Last-Translator: test \n" +"Language-Team: C \n" +"MIME-Version: 1.0\n" +"Content-Transfer-Encoding: 8bit\n" +], [MSGFMT_OPTS=-c; AC_MSG_RESULT([yes])], [AC_MSG_RESULT([no])]) + AC_SUBST(MSGFMT_OPTS) + AC_PATH_PROG(GMSGFMT, gmsgfmt, $MSGFMT) + GLIB_PATH_PROG_WITH_TEST(XGETTEXT, xgettext, + [test -z "`$ac_dir/$ac_word -h 2>&1 | grep '(HELP)'`"], :) + AC_TRY_LINK(, [extern int _nl_msg_cat_cntr; + return _nl_msg_cat_cntr], + [CATOBJEXT=.gmo + DATADIRNAME=share], + [case $host in + *-*-solaris*) + dnl On Solaris, if bind_textdomain_codeset is in libc, + dnl GNU format message catalog is always supported, + dnl since both are added to the libc all together. + dnl Hence, we'd like to go with DATADIRNAME=share and + dnl and CATOBJEXT=.gmo in this case. + AC_CHECK_FUNC(bind_textdomain_codeset, + [CATOBJEXT=.gmo + DATADIRNAME=share], + [CATOBJEXT=.mo + DATADIRNAME=lib]) + ;; + *-*-openbsd*) + CATOBJEXT=.mo + DATADIRNAME=share + ;; + *) + CATOBJEXT=.mo + DATADIRNAME=lib + ;; + esac]) + LIBS="$glib_save_LIBS" + INSTOBJEXT=.mo + else + gt_cv_have_gettext=no + fi + fi + ]) + + if test "$gt_cv_have_gettext" = "yes" ; then + AC_DEFINE(ENABLE_NLS, 1, + [always defined to indicate that i18n is enabled]) + fi + + dnl Test whether we really found GNU xgettext. + if test "$XGETTEXT" != ":"; then + dnl If it is not GNU xgettext we define it as : so that the + dnl Makefiles still can work. + if $XGETTEXT --omit-header /dev/null 2> /dev/null; then + : ; + else + AC_MSG_RESULT( + [found xgettext program is not GNU xgettext; ignore it]) + XGETTEXT=":" + fi + fi + + # We need to process the po/ directory. + POSUB=po + + AC_OUTPUT_COMMANDS( + [case "$CONFIG_FILES" in *po/Makefile.in*) + sed -e "/POTFILES =/r po/POTFILES" po/Makefile.in > po/Makefile + esac]) + + dnl These rules are solely for the distribution goal. While doing this + dnl we only have to keep exactly one list of the available catalogs + dnl in configure.ac. + for lang in $ALL_LINGUAS; do + GMOFILES="$GMOFILES $lang.gmo" + POFILES="$POFILES $lang.po" + done + + dnl Make all variables we use known to autoconf. + AC_SUBST(CATALOGS) + AC_SUBST(CATOBJEXT) + AC_SUBST(DATADIRNAME) + AC_SUBST(GMOFILES) + AC_SUBST(INSTOBJEXT) + AC_SUBST(INTLLIBS) + AC_SUBST(PO_IN_DATADIR_TRUE) + AC_SUBST(PO_IN_DATADIR_FALSE) + AC_SUBST(POFILES) + AC_SUBST(POSUB) + ]) + +# AM_GLIB_GNU_GETTEXT +# ------------------- +# Do checks necessary for use of gettext. If a suitable implementation +# of gettext is found in either in libintl or in the C library, +# it will set INTLLIBS to the libraries needed for use of gettext +# and AC_DEFINE() HAVE_GETTEXT and ENABLE_NLS. (The shell variable +# gt_cv_have_gettext will be set to "yes".) It will also call AC_SUBST() +# on various variables needed by the Makefile.in.in installed by +# glib-gettextize. +dnl +AU_DEFUN([GLIB_GNU_GETTEXT], + [AC_REQUIRE([AC_PROG_CC])dnl + + GLIB_LC_MESSAGES + GLIB_WITH_NLS + + if test "$gt_cv_have_gettext" = "yes"; then + if test "x$ALL_LINGUAS" = "x"; then + LINGUAS= + else + AC_MSG_CHECKING(for catalogs to be installed) + NEW_LINGUAS= + for presentlang in $ALL_LINGUAS; do + useit=no + if test "%UNSET%" != "${LINGUAS-%UNSET%}"; then + desiredlanguages="$LINGUAS" + else + desiredlanguages="$ALL_LINGUAS" + fi + for desiredlang in $desiredlanguages; do + # Use the presentlang catalog if desiredlang is + # a. equal to presentlang, or + # b. a variant of presentlang (because in this case, + # presentlang can be used as a fallback for messages + # which are not translated in the desiredlang catalog). + case "$desiredlang" in + "$presentlang"*) useit=yes;; + esac + done + if test $useit = yes; then + NEW_LINGUAS="$NEW_LINGUAS $presentlang" + fi + done + LINGUAS=$NEW_LINGUAS + AC_MSG_RESULT($LINGUAS) + fi + + dnl Construct list of names of catalog files to be constructed. + if test -n "$LINGUAS"; then + for lang in $LINGUAS; do CATALOGS="$CATALOGS $lang$CATOBJEXT"; done + fi + fi + + dnl If the AC_CONFIG_AUX_DIR macro for autoconf is used we possibly + dnl find the mkinstalldirs script in another subdir but ($top_srcdir). + dnl Try to locate is. + MKINSTALLDIRS= + if test -n "$ac_aux_dir"; then + MKINSTALLDIRS="$ac_aux_dir/mkinstalldirs" + fi + if test -z "$MKINSTALLDIRS"; then + MKINSTALLDIRS="\$(top_srcdir)/mkinstalldirs" + fi + AC_SUBST(MKINSTALLDIRS) + + dnl Generate list of files to be processed by xgettext which will + dnl be included in po/Makefile. + test -d po || mkdir po + if test "x$srcdir" != "x."; then + if test "x`echo $srcdir | sed 's@/.*@@'`" = "x"; then + posrcprefix="$srcdir/" + else + posrcprefix="../$srcdir/" + fi + else + posrcprefix="../" + fi + rm -f po/POTFILES + sed -e "/^#/d" -e "/^\$/d" -e "s,.*, $posrcprefix& \\\\," -e "\$s/\(.*\) \\\\/\1/" \ + < $srcdir/po/POTFILES.in > po/POTFILES + ], + [[$0: This macro is deprecated. You should use upstream gettext instead.]]) + +# AM_GLIB_DEFINE_LOCALEDIR(VARIABLE) +# ------------------------------- +# Define VARIABLE to the location where catalog files will +# be installed by po/Makefile. +glib_DEFUN([GLIB_DEFINE_LOCALEDIR], +[glib_REQUIRE([GLIB_GNU_GETTEXT])dnl +glib_save_prefix="$prefix" +glib_save_exec_prefix="$exec_prefix" +glib_save_datarootdir="$datarootdir" +test "x$prefix" = xNONE && prefix=$ac_default_prefix +test "x$exec_prefix" = xNONE && exec_prefix=$prefix +datarootdir=`eval echo "${datarootdir}"` +if test "x$CATOBJEXT" = "x.mo" ; then + localedir=`eval echo "${libdir}/locale"` +else + localedir=`eval echo "${datadir}/locale"` +fi +prefix="$glib_save_prefix" +exec_prefix="$glib_save_exec_prefix" +datarootdir="$glib_save_datarootdir" +AC_DEFINE_UNQUOTED($1, "$localedir", + [Define the location where the catalogs will be installed]) +]) + +dnl +dnl Now the definitions that aclocal will find +dnl +ifdef(glib_configure_ac,[],[ +AC_DEFUN([AM_GLIB_GNU_GETTEXT],[GLIB_GNU_GETTEXT($@)]) +AC_DEFUN([AM_GLIB_DEFINE_LOCALEDIR],[GLIB_DEFINE_LOCALEDIR($@)]) +])dnl + +# GLIB_RUN_PROG(PROGRAM, TEST-FILE, [ACTION-IF-PASS], [ACTION-IF-FAIL]) +# +# Create a temporary file with TEST-FILE as its contents and pass the +# file name to PROGRAM. Perform ACTION-IF-PASS if PROGRAM exits with +# 0 and perform ACTION-IF-FAIL for any other exit status. +AC_DEFUN([GLIB_RUN_PROG], +[cat >conftest.foo <<_ACEOF +$2 +_ACEOF +if AC_RUN_LOG([$1 conftest.foo]); then + m4_ifval([$3], [$3], [:]) +m4_ifvaln([$4], [else $4])dnl +echo "$as_me: failed input was:" >&AS_MESSAGE_LOG_FD +sed 's/^/| /' conftest.foo >&AS_MESSAGE_LOG_FD +fi]) + + +dnl Do not call GNOME_DOC_DEFINES directly. It is split out from +dnl GNOME_DOC_INIT to allow gnome-doc-utils to bootstrap off itself. +AC_DEFUN([GNOME_DOC_DEFINES], +[ +AC_ARG_WITH([help-dir], + AC_HELP_STRING([--with-help-dir=DIR], [path to help docs]),, + [with_help_dir='${datadir}/gnome/help']) +HELP_DIR="$with_help_dir" +AC_SUBST(HELP_DIR) + +AC_ARG_WITH([omf-dir], + AC_HELP_STRING([--with-omf-dir=DIR], [path to OMF files]),, + [with_omf_dir='${datadir}/omf']) +OMF_DIR="$with_omf_dir" +AC_SUBST(OMF_DIR) + +AC_ARG_WITH([help-formats], + AC_HELP_STRING([--with-help-formats=FORMATS], [list of formats]),, + [with_help_formats='']) +DOC_USER_FORMATS="$with_help_formats" +AC_SUBST(DOC_USER_FORMATS) + +AC_ARG_ENABLE([scrollkeeper], + [AC_HELP_STRING([--disable-scrollkeeper], + [do not make updates to the scrollkeeper database])],, + enable_scrollkeeper=yes) +AM_CONDITIONAL([ENABLE_SK],[test "$gdu_cv_have_gdu" = "yes" -a "$enable_scrollkeeper" = "yes"]) + +dnl disable scrollkeeper automatically for distcheck +DISTCHECK_CONFIGURE_FLAGS="--disable-scrollkeeper $DISTCHECK_CONFIGURE_FLAGS" +AC_SUBST(DISTCHECK_CONFIGURE_FLAGS) + +AM_CONDITIONAL([HAVE_GNOME_DOC_UTILS],[test "$gdu_cv_have_gdu" = "yes"]) +]) + +# GNOME_DOC_INIT ([MINIMUM-VERSION],[ACTION-IF-FOUND],[ACTION-IF-NOT-FOUND]) +# +AC_DEFUN([GNOME_DOC_INIT], +[AC_REQUIRE([AC_PROG_LN_S])dnl + +if test -z "$AM_DEFAULT_VERBOSITY"; then + AM_DEFAULT_VERBOSITY=1 +fi +AC_SUBST([AM_DEFAULT_VERBOSITY]) + +ifelse([$1],,[gdu_cv_version_required=0.3.2],[gdu_cv_version_required=$1]) + +AC_MSG_CHECKING([gnome-doc-utils >= $gdu_cv_version_required]) +PKG_CHECK_EXISTS([gnome-doc-utils >= $gdu_cv_version_required], + [gdu_cv_have_gdu=yes],[gdu_cv_have_gdu=no]) + +if test "$gdu_cv_have_gdu" = "yes"; then + AC_MSG_RESULT([yes]) + ifelse([$2],,[:],[$2]) +else + AC_MSG_RESULT([no]) + ifelse([$3],,[AC_MSG_ERROR([gnome-doc-utils >= $gdu_cv_version_required not found])],[$3]) +fi + +GNOME_DOC_DEFINES +]) + +# -*- mode: autoconf -*- +# +# gtk-doc.m4 - configure macro to check for gtk-doc +# Copyright (C) 2003 James Henstridge +# 2007-2017 Stefan Sauer +# +# 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 3 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, see . +# +# As a special exception, the above copyright owner gives unlimited +# permission to copy, distribute and modify the configure scripts that +# are the output of Autoconf when processing the Macro. You need not +# follow the terms of the GNU General Public License when using or +# distributing such scripts, even though portions of the text of the +# Macro appear in them. The GNU General Public License (GPL) does govern +# all other use of the material that constitutes the Autoconf Macro. + +# serial 2 + +dnl Usage: +dnl GTK_DOC_CHECK([minimum-gtk-doc-version]) +AC_DEFUN([GTK_DOC_CHECK], +[ + AC_REQUIRE([PKG_PROG_PKG_CONFIG]) + AC_BEFORE([AC_PROG_LIBTOOL],[$0])dnl setup libtool first + AC_BEFORE([AM_PROG_LIBTOOL],[$0])dnl setup libtool first + + ifelse([$1],[],[gtk_doc_requires="gtk-doc"],[gtk_doc_requires="gtk-doc >= $1"]) + AC_MSG_CHECKING([for gtk-doc]) + PKG_CHECK_EXISTS([$gtk_doc_requires],[have_gtk_doc=yes],[have_gtk_doc=no]) + AC_MSG_RESULT($have_gtk_doc) + + if test "$have_gtk_doc" = "no"; then + AC_MSG_WARN([ + You will not be able to create source packages with 'make dist' + because $gtk_doc_requires is not found.]) + fi + + dnl check for tools we added during development + dnl Use AC_CHECK_PROG to avoid the check target using an absolute path that + dnl may not be writable by the user. Currently, automake requires that the + dnl test name must end in '.test'. + dnl https://bugzilla.gnome.org/show_bug.cgi?id=701638 + AC_CHECK_PROG([GTKDOC_CHECK],[gtkdoc-check],[gtkdoc-check.test]) + AC_PATH_PROG([GTKDOC_CHECK_PATH],[gtkdoc-check]) + AC_PATH_PROGS([GTKDOC_REBASE],[gtkdoc-rebase],[true]) + AC_PATH_PROG([GTKDOC_MKPDF],[gtkdoc-mkpdf]) + + dnl for overriding the documentation installation directory + AC_ARG_WITH([html-dir], + AS_HELP_STRING([--with-html-dir=PATH], [path to installed docs]),, + [with_html_dir='${datadir}/gtk-doc/html']) + HTML_DIR="$with_html_dir" + AC_SUBST([HTML_DIR]) + + dnl enable/disable documentation building + AC_ARG_ENABLE([gtk-doc], + AS_HELP_STRING([--enable-gtk-doc], + [use gtk-doc to build documentation [[default=no]]]),, + [enable_gtk_doc=no]) + + AC_MSG_CHECKING([whether to build gtk-doc documentation]) + AC_MSG_RESULT($enable_gtk_doc) + + if test "x$enable_gtk_doc" = "xyes" && test "$have_gtk_doc" = "no"; then + AC_MSG_ERROR([ + You must have $gtk_doc_requires installed to build documentation for + $PACKAGE_NAME. Please install gtk-doc or disable building the + documentation by adding '--disable-gtk-doc' to '[$]0'.]) + fi + + dnl don't check for glib if we build glib + if test "x$PACKAGE_NAME" != "xglib"; then + dnl don't fail if someone does not have glib + PKG_CHECK_MODULES(GTKDOC_DEPS, glib-2.0 >= 2.10.0 gobject-2.0 >= 2.10.0,,[:]) + fi + + dnl enable/disable output formats + AC_ARG_ENABLE([gtk-doc-html], + AS_HELP_STRING([--enable-gtk-doc-html], + [build documentation in html format [[default=yes]]]),, + [enable_gtk_doc_html=yes]) + AC_ARG_ENABLE([gtk-doc-pdf], + AS_HELP_STRING([--enable-gtk-doc-pdf], + [build documentation in pdf format [[default=no]]]),, + [enable_gtk_doc_pdf=no]) + + if test -z "$GTKDOC_MKPDF"; then + enable_gtk_doc_pdf=no + fi + + if test -z "$AM_DEFAULT_VERBOSITY"; then + AM_DEFAULT_VERBOSITY=1 + fi + AC_SUBST([AM_DEFAULT_VERBOSITY]) + + AM_CONDITIONAL([HAVE_GTK_DOC], [test x$have_gtk_doc = xyes]) + AM_CONDITIONAL([ENABLE_GTK_DOC], [test x$enable_gtk_doc = xyes]) + AM_CONDITIONAL([GTK_DOC_BUILD_HTML], [test x$enable_gtk_doc_html = xyes]) + AM_CONDITIONAL([GTK_DOC_BUILD_PDF], [test x$enable_gtk_doc_pdf = xyes]) + AM_CONDITIONAL([GTK_DOC_USE_LIBTOOL], [test -n "$LIBTOOL"]) + AM_CONDITIONAL([GTK_DOC_USE_REBASE], [test -n "$GTKDOC_REBASE"]) +]) + + +dnl IT_PROG_INTLTOOL([MINIMUM-VERSION], [no-xml]) +# serial 42 IT_PROG_INTLTOOL +AC_DEFUN([IT_PROG_INTLTOOL], [ +AC_PREREQ([2.50])dnl +AC_REQUIRE([AM_NLS])dnl + +case "$am__api_version" in + 1.[01234]) + AC_MSG_ERROR([Automake 1.5 or newer is required to use intltool]) + ;; + *) + ;; +esac + +INTLTOOL_REQUIRED_VERSION_AS_INT=`echo $1 | awk -F. '{ print $ 1 * 1000 + $ 2 * 100 + $ 3; }'` +INTLTOOL_APPLIED_VERSION=`intltool-update --version | head -1 | cut -d" " -f3` +INTLTOOL_APPLIED_VERSION_AS_INT=`echo $INTLTOOL_APPLIED_VERSION | awk -F. '{ print $ 1 * 1000 + $ 2 * 100 + $ 3; }'` +if test -n "$1"; then + AC_MSG_CHECKING([for intltool >= $1]) + AC_MSG_RESULT([$INTLTOOL_APPLIED_VERSION found]) + test "$INTLTOOL_APPLIED_VERSION_AS_INT" -ge "$INTLTOOL_REQUIRED_VERSION_AS_INT" || + AC_MSG_ERROR([Your intltool is too old. You need intltool $1 or later.]) +fi + +AC_PATH_PROG(INTLTOOL_UPDATE, [intltool-update]) +AC_PATH_PROG(INTLTOOL_MERGE, [intltool-merge]) +AC_PATH_PROG(INTLTOOL_EXTRACT, [intltool-extract]) +if test -z "$INTLTOOL_UPDATE" -o -z "$INTLTOOL_MERGE" -o -z "$INTLTOOL_EXTRACT"; then + AC_MSG_ERROR([The intltool scripts were not found. Please install intltool.]) +fi + +if test -z "$AM_DEFAULT_VERBOSITY"; then + AM_DEFAULT_VERBOSITY=1 +fi +AC_SUBST([AM_DEFAULT_VERBOSITY]) + +INTLTOOL_V_MERGE='$(INTLTOOL__v_MERGE_$(V))' +INTLTOOL__v_MERGE_='$(INTLTOOL__v_MERGE_$(AM_DEFAULT_VERBOSITY))' +INTLTOOL__v_MERGE_0='@echo " ITMRG " [$]@;' +AC_SUBST(INTLTOOL_V_MERGE) +AC_SUBST(INTLTOOL__v_MERGE_) +AC_SUBST(INTLTOOL__v_MERGE_0) + +INTLTOOL_V_MERGE_OPTIONS='$(intltool__v_merge_options_$(V))' +intltool__v_merge_options_='$(intltool__v_merge_options_$(AM_DEFAULT_VERBOSITY))' +intltool__v_merge_options_0='-q' +AC_SUBST(INTLTOOL_V_MERGE_OPTIONS) +AC_SUBST(intltool__v_merge_options_) +AC_SUBST(intltool__v_merge_options_0) + + INTLTOOL_DESKTOP_RULE='%.desktop: %.desktop.in $(INTLTOOL_MERGE) $(wildcard $(top_srcdir)/po/*.po) ; $(INTLTOOL_V_MERGE)LC_ALL=C $(INTLTOOL_MERGE) $(INTLTOOL_V_MERGE_OPTIONS) -d -u -c $(top_builddir)/po/.intltool-merge-cache $(top_srcdir)/po $< [$]@' +INTLTOOL_DIRECTORY_RULE='%.directory: %.directory.in $(INTLTOOL_MERGE) $(wildcard $(top_srcdir)/po/*.po) ; $(INTLTOOL_V_MERGE)LC_ALL=C $(INTLTOOL_MERGE) $(INTLTOOL_V_MERGE_OPTIONS) -d -u -c $(top_builddir)/po/.intltool-merge-cache $(top_srcdir)/po $< [$]@' + INTLTOOL_KEYS_RULE='%.keys: %.keys.in $(INTLTOOL_MERGE) $(wildcard $(top_srcdir)/po/*.po) ; $(INTLTOOL_V_MERGE)LC_ALL=C $(INTLTOOL_MERGE) $(INTLTOOL_V_MERGE_OPTIONS) -k -u -c $(top_builddir)/po/.intltool-merge-cache $(top_srcdir)/po $< [$]@' + INTLTOOL_PROP_RULE='%.prop: %.prop.in $(INTLTOOL_MERGE) $(wildcard $(top_srcdir)/po/*.po) ; $(INTLTOOL_V_MERGE)LC_ALL=C $(INTLTOOL_MERGE) $(INTLTOOL_V_MERGE_OPTIONS) -d -u -c $(top_builddir)/po/.intltool-merge-cache $(top_srcdir)/po $< [$]@' + INTLTOOL_OAF_RULE='%.oaf: %.oaf.in $(INTLTOOL_MERGE) $(wildcard $(top_srcdir)/po/*.po) ; $(INTLTOOL_V_MERGE)LC_ALL=C $(INTLTOOL_MERGE) $(INTLTOOL_V_MERGE_OPTIONS) -o -p $(top_srcdir)/po $< [$]@' + INTLTOOL_PONG_RULE='%.pong: %.pong.in $(INTLTOOL_MERGE) $(wildcard $(top_srcdir)/po/*.po) ; $(INTLTOOL_V_MERGE)LC_ALL=C $(INTLTOOL_MERGE) $(INTLTOOL_V_MERGE_OPTIONS) -x -u -c $(top_builddir)/po/.intltool-merge-cache $(top_srcdir)/po $< [$]@' + INTLTOOL_SERVER_RULE='%.server: %.server.in $(INTLTOOL_MERGE) $(wildcard $(top_srcdir)/po/*.po) ; $(INTLTOOL_V_MERGE)LC_ALL=C $(INTLTOOL_MERGE) $(INTLTOOL_V_MERGE_OPTIONS) -o -u -c $(top_builddir)/po/.intltool-merge-cache $(top_srcdir)/po $< [$]@' + INTLTOOL_SHEET_RULE='%.sheet: %.sheet.in $(INTLTOOL_MERGE) $(wildcard $(top_srcdir)/po/*.po) ; $(INTLTOOL_V_MERGE)LC_ALL=C $(INTLTOOL_MERGE) $(INTLTOOL_V_MERGE_OPTIONS) -x -u -c $(top_builddir)/po/.intltool-merge-cache $(top_srcdir)/po $< [$]@' +INTLTOOL_SOUNDLIST_RULE='%.soundlist: %.soundlist.in $(INTLTOOL_MERGE) $(wildcard $(top_srcdir)/po/*.po) ; $(INTLTOOL_V_MERGE)LC_ALL=C $(INTLTOOL_MERGE) $(INTLTOOL_V_MERGE_OPTIONS) -d -u -c $(top_builddir)/po/.intltool-merge-cache $(top_srcdir)/po $< [$]@' + INTLTOOL_UI_RULE='%.ui: %.ui.in $(INTLTOOL_MERGE) $(wildcard $(top_srcdir)/po/*.po) ; $(INTLTOOL_V_MERGE)LC_ALL=C $(INTLTOOL_MERGE) $(INTLTOOL_V_MERGE_OPTIONS) -x -u -c $(top_builddir)/po/.intltool-merge-cache $(top_srcdir)/po $< [$]@' + INTLTOOL_XML_RULE='%.xml: %.xml.in $(INTLTOOL_MERGE) $(wildcard $(top_srcdir)/po/*.po) ; $(INTLTOOL_V_MERGE)LC_ALL=C $(INTLTOOL_MERGE) $(INTLTOOL_V_MERGE_OPTIONS) -x -u -c $(top_builddir)/po/.intltool-merge-cache $(top_srcdir)/po $< [$]@' +if test "$INTLTOOL_APPLIED_VERSION_AS_INT" -ge 5000; then + INTLTOOL_XML_NOMERGE_RULE='%.xml: %.xml.in $(INTLTOOL_MERGE) ; $(INTLTOOL_V_MERGE)LC_ALL=C $(INTLTOOL_MERGE) $(INTLTOOL_V_MERGE_OPTIONS) -x -u --no-translations $< [$]@' +else + INTLTOOL_XML_NOMERGE_RULE='%.xml: %.xml.in $(INTLTOOL_MERGE) ; $(INTLTOOL_V_MERGE)_it_tmp_dir=tmp.intltool.[$][$]RANDOM && mkdir [$][$]_it_tmp_dir && LC_ALL=C $(INTLTOOL_MERGE) $(INTLTOOL_V_MERGE_OPTIONS) -x -u [$][$]_it_tmp_dir $< [$]@ && rmdir [$][$]_it_tmp_dir' +fi + INTLTOOL_XAM_RULE='%.xam: %.xml.in $(INTLTOOL_MERGE) $(wildcard $(top_srcdir)/po/*.po) ; $(INTLTOOL_V_MERGE)LC_ALL=C $(INTLTOOL_MERGE) $(INTLTOOL_V_MERGE_OPTIONS) -x -u -c $(top_builddir)/po/.intltool-merge-cache $(top_srcdir)/po $< [$]@' + INTLTOOL_KBD_RULE='%.kbd: %.kbd.in $(INTLTOOL_MERGE) $(wildcard $(top_srcdir)/po/*.po) ; $(INTLTOOL_V_MERGE)LC_ALL=C $(INTLTOOL_MERGE) $(INTLTOOL_V_MERGE_OPTIONS) -x -u -m -c $(top_builddir)/po/.intltool-merge-cache $(top_srcdir)/po $< [$]@' + INTLTOOL_CAVES_RULE='%.caves: %.caves.in $(INTLTOOL_MERGE) $(wildcard $(top_srcdir)/po/*.po) ; $(INTLTOOL_V_MERGE)LC_ALL=C $(INTLTOOL_MERGE) $(INTLTOOL_V_MERGE_OPTIONS) -d -u -c $(top_builddir)/po/.intltool-merge-cache $(top_srcdir)/po $< [$]@' + INTLTOOL_SCHEMAS_RULE='%.schemas: %.schemas.in $(INTLTOOL_MERGE) $(wildcard $(top_srcdir)/po/*.po) ; $(INTLTOOL_V_MERGE)LC_ALL=C $(INTLTOOL_MERGE) $(INTLTOOL_V_MERGE_OPTIONS) -s -u -c $(top_builddir)/po/.intltool-merge-cache $(top_srcdir)/po $< [$]@' + INTLTOOL_THEME_RULE='%.theme: %.theme.in $(INTLTOOL_MERGE) $(wildcard $(top_srcdir)/po/*.po) ; $(INTLTOOL_V_MERGE)LC_ALL=C $(INTLTOOL_MERGE) $(INTLTOOL_V_MERGE_OPTIONS) -d -u -c $(top_builddir)/po/.intltool-merge-cache $(top_srcdir)/po $< [$]@' + INTLTOOL_SERVICE_RULE='%.service: %.service.in $(INTLTOOL_MERGE) $(wildcard $(top_srcdir)/po/*.po) ; $(INTLTOOL_V_MERGE)LC_ALL=C $(INTLTOOL_MERGE) $(INTLTOOL_V_MERGE_OPTIONS) -d -u -c $(top_builddir)/po/.intltool-merge-cache $(top_srcdir)/po $< [$]@' + INTLTOOL_POLICY_RULE='%.policy: %.policy.in $(INTLTOOL_MERGE) $(wildcard $(top_srcdir)/po/*.po) ; $(INTLTOOL_V_MERGE)LC_ALL=C $(INTLTOOL_MERGE) $(INTLTOOL_V_MERGE_OPTIONS) -x -u -c $(top_builddir)/po/.intltool-merge-cache $(top_srcdir)/po $< [$]@' + +_IT_SUBST(INTLTOOL_DESKTOP_RULE) +_IT_SUBST(INTLTOOL_DIRECTORY_RULE) +_IT_SUBST(INTLTOOL_KEYS_RULE) +_IT_SUBST(INTLTOOL_PROP_RULE) +_IT_SUBST(INTLTOOL_OAF_RULE) +_IT_SUBST(INTLTOOL_PONG_RULE) +_IT_SUBST(INTLTOOL_SERVER_RULE) +_IT_SUBST(INTLTOOL_SHEET_RULE) +_IT_SUBST(INTLTOOL_SOUNDLIST_RULE) +_IT_SUBST(INTLTOOL_UI_RULE) +_IT_SUBST(INTLTOOL_XAM_RULE) +_IT_SUBST(INTLTOOL_KBD_RULE) +_IT_SUBST(INTLTOOL_XML_RULE) +_IT_SUBST(INTLTOOL_XML_NOMERGE_RULE) +_IT_SUBST(INTLTOOL_CAVES_RULE) +_IT_SUBST(INTLTOOL_SCHEMAS_RULE) +_IT_SUBST(INTLTOOL_THEME_RULE) +_IT_SUBST(INTLTOOL_SERVICE_RULE) +_IT_SUBST(INTLTOOL_POLICY_RULE) + +# Check the gettext tools to make sure they are GNU +AC_PATH_PROG(XGETTEXT, xgettext) +AC_PATH_PROG(MSGMERGE, msgmerge) +AC_PATH_PROG(MSGFMT, msgfmt) +AC_PATH_PROG(GMSGFMT, gmsgfmt, $MSGFMT) +if test -z "$XGETTEXT" -o -z "$MSGMERGE" -o -z "$MSGFMT"; then + AC_MSG_ERROR([GNU gettext tools not found; required for intltool]) +fi +xgversion="`$XGETTEXT --version|grep '(GNU ' 2> /dev/null`" +mmversion="`$MSGMERGE --version|grep '(GNU ' 2> /dev/null`" +mfversion="`$MSGFMT --version|grep '(GNU ' 2> /dev/null`" +if test -z "$xgversion" -o -z "$mmversion" -o -z "$mfversion"; then + AC_MSG_ERROR([GNU gettext tools not found; required for intltool]) +fi + +AC_PATH_PROG(INTLTOOL_PERL, perl) +if test -z "$INTLTOOL_PERL"; then + AC_MSG_ERROR([perl not found]) +fi +AC_MSG_CHECKING([for perl >= 5.8.1]) +$INTLTOOL_PERL -e "use 5.8.1;" > /dev/null 2>&1 +if test $? -ne 0; then + AC_MSG_ERROR([perl 5.8.1 is required for intltool]) +else + IT_PERL_VERSION=`$INTLTOOL_PERL -e "printf '%vd', $^V"` + AC_MSG_RESULT([$IT_PERL_VERSION]) +fi +if test "x$2" != "xno-xml"; then + AC_MSG_CHECKING([for XML::Parser]) + if `$INTLTOOL_PERL -e "require XML::Parser" 2>/dev/null`; then + AC_MSG_RESULT([ok]) + else + AC_MSG_ERROR([XML::Parser perl module is required for intltool]) + fi +fi + +# Substitute ALL_LINGUAS so we can use it in po/Makefile +AC_SUBST(ALL_LINGUAS) + +IT_PO_SUBDIR([po]) + +]) + + +# IT_PO_SUBDIR(DIRNAME) +# --------------------- +# All po subdirs have to be declared with this macro; the subdir "po" is +# declared by IT_PROG_INTLTOOL. +# +AC_DEFUN([IT_PO_SUBDIR], +[AC_PREREQ([2.53])dnl We use ac_top_srcdir inside AC_CONFIG_COMMANDS. +dnl +dnl The following CONFIG_COMMANDS should be executed at the very end +dnl of config.status. +AC_CONFIG_COMMANDS_PRE([ + AC_CONFIG_COMMANDS([$1/stamp-it], [ + if [ ! grep "^# INTLTOOL_MAKEFILE$" "$1/Makefile.in" > /dev/null ]; then + AC_MSG_ERROR([$1/Makefile.in.in was not created by intltoolize.]) + fi + rm -f "$1/stamp-it" "$1/stamp-it.tmp" "$1/POTFILES" "$1/Makefile.tmp" + >"$1/stamp-it.tmp" + [sed '/^#/d + s/^[[].*] *// + /^[ ]*$/d + '"s|^| $ac_top_srcdir/|" \ + "$srcdir/$1/POTFILES.in" | sed '$!s/$/ \\/' >"$1/POTFILES" + ] + [sed '/^POTFILES =/,/[^\\]$/ { + /^POTFILES =/!d + r $1/POTFILES + } + ' "$1/Makefile.in" >"$1/Makefile"] + rm -f "$1/Makefile.tmp" + mv "$1/stamp-it.tmp" "$1/stamp-it" + ]) +])dnl +]) + +# _IT_SUBST(VARIABLE) +# ------------------- +# Abstract macro to do either _AM_SUBST_NOTMAKE or AC_SUBST +# +AC_DEFUN([_IT_SUBST], +[ +AC_SUBST([$1]) +m4_ifdef([_AM_SUBST_NOTMAKE], [_AM_SUBST_NOTMAKE([$1])]) +] +) + +# deprecated macros +AU_ALIAS([AC_PROG_INTLTOOL], [IT_PROG_INTLTOOL]) +# A hint is needed for aclocal from Automake <= 1.9.4: +# AC_DEFUN([AC_PROG_INTLTOOL], ...) + + +dnl pkg.m4 - Macros to locate and utilise pkg-config. -*- Autoconf -*- +dnl serial 11 (pkg-config-0.29) +dnl +dnl Copyright © 2004 Scott James Remnant . +dnl Copyright © 2012-2015 Dan Nicholson +dnl +dnl This program is free software; you can redistribute it and/or modify +dnl it under the terms of the GNU General Public License as published by +dnl the Free Software Foundation; either version 2 of the License, or +dnl (at your option) any later version. +dnl +dnl This program is distributed in the hope that it will be useful, but +dnl WITHOUT ANY WARRANTY; without even the implied warranty of +dnl MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU +dnl General Public License for more details. +dnl +dnl You should have received a copy of the GNU General Public License +dnl along with this program; if not, write to the Free Software +dnl Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA +dnl 02111-1307, USA. +dnl +dnl As a special exception to the GNU General Public License, if you +dnl distribute this file as part of a program that contains a +dnl configuration script generated by Autoconf, you may include it under +dnl the same distribution terms that you use for the rest of that +dnl program. + +dnl PKG_PREREQ(MIN-VERSION) +dnl ----------------------- +dnl Since: 0.29 +dnl +dnl Verify that the version of the pkg-config macros are at least +dnl MIN-VERSION. Unlike PKG_PROG_PKG_CONFIG, which checks the user's +dnl installed version of pkg-config, this checks the developer's version +dnl of pkg.m4 when generating configure. +dnl +dnl To ensure that this macro is defined, also add: +dnl m4_ifndef([PKG_PREREQ], +dnl [m4_fatal([must install pkg-config 0.29 or later before running autoconf/autogen])]) +dnl +dnl See the "Since" comment for each macro you use to see what version +dnl of the macros you require. +m4_defun([PKG_PREREQ], +[m4_define([PKG_MACROS_VERSION], [0.29]) +m4_if(m4_version_compare(PKG_MACROS_VERSION, [$1]), -1, + [m4_fatal([pkg.m4 version $1 or higher is required but ]PKG_MACROS_VERSION[ found])]) +])dnl PKG_PREREQ + +dnl PKG_PROG_PKG_CONFIG([MIN-VERSION]) +dnl ---------------------------------- +dnl Since: 0.16 +dnl +dnl Search for the pkg-config tool and set the PKG_CONFIG variable to +dnl first found in the path. Checks that the version of pkg-config found +dnl is at least MIN-VERSION. If MIN-VERSION is not specified, 0.9.0 is +dnl used since that's the first version where most current features of +dnl pkg-config existed. +AC_DEFUN([PKG_PROG_PKG_CONFIG], +[m4_pattern_forbid([^_?PKG_[A-Z_]+$]) +m4_pattern_allow([^PKG_CONFIG(_(PATH|LIBDIR|SYSROOT_DIR|ALLOW_SYSTEM_(CFLAGS|LIBS)))?$]) +m4_pattern_allow([^PKG_CONFIG_(DISABLE_UNINSTALLED|TOP_BUILD_DIR|DEBUG_SPEW)$]) +AC_ARG_VAR([PKG_CONFIG], [path to pkg-config utility]) +AC_ARG_VAR([PKG_CONFIG_PATH], [directories to add to pkg-config's search path]) +AC_ARG_VAR([PKG_CONFIG_LIBDIR], [path overriding pkg-config's built-in search path]) + +if test "x$ac_cv_env_PKG_CONFIG_set" != "xset"; then + AC_PATH_TOOL([PKG_CONFIG], [pkg-config]) +fi +if test -n "$PKG_CONFIG"; then + _pkg_min_version=m4_default([$1], [0.9.0]) + AC_MSG_CHECKING([pkg-config is at least version $_pkg_min_version]) + if $PKG_CONFIG --atleast-pkgconfig-version $_pkg_min_version; then + AC_MSG_RESULT([yes]) + else + AC_MSG_RESULT([no]) + PKG_CONFIG="" + fi +fi[]dnl +])dnl PKG_PROG_PKG_CONFIG + +dnl PKG_CHECK_EXISTS(MODULES, [ACTION-IF-FOUND], [ACTION-IF-NOT-FOUND]) +dnl ------------------------------------------------------------------- +dnl Since: 0.18 +dnl +dnl Check to see whether a particular set of modules exists. Similar to +dnl PKG_CHECK_MODULES(), but does not set variables or print errors. +dnl +dnl Please remember that m4 expands AC_REQUIRE([PKG_PROG_PKG_CONFIG]) +dnl only at the first occurence in configure.ac, so if the first place +dnl it's called might be skipped (such as if it is within an "if", you +dnl have to call PKG_CHECK_EXISTS manually +AC_DEFUN([PKG_CHECK_EXISTS], +[AC_REQUIRE([PKG_PROG_PKG_CONFIG])dnl +if test -n "$PKG_CONFIG" && \ + AC_RUN_LOG([$PKG_CONFIG --exists --print-errors "$1"]); then + m4_default([$2], [:]) +m4_ifvaln([$3], [else + $3])dnl +fi]) + +dnl _PKG_CONFIG([VARIABLE], [COMMAND], [MODULES]) +dnl --------------------------------------------- +dnl Internal wrapper calling pkg-config via PKG_CONFIG and setting +dnl pkg_failed based on the result. +m4_define([_PKG_CONFIG], +[if test -n "$$1"; then + pkg_cv_[]$1="$$1" + elif test -n "$PKG_CONFIG"; then + PKG_CHECK_EXISTS([$3], + [pkg_cv_[]$1=`$PKG_CONFIG --[]$2 "$3" 2>/dev/null` + test "x$?" != "x0" && pkg_failed=yes ], + [pkg_failed=yes]) + else + pkg_failed=untried +fi[]dnl +])dnl _PKG_CONFIG + +dnl _PKG_SHORT_ERRORS_SUPPORTED +dnl --------------------------- +dnl Internal check to see if pkg-config supports short errors. +AC_DEFUN([_PKG_SHORT_ERRORS_SUPPORTED], +[AC_REQUIRE([PKG_PROG_PKG_CONFIG]) +if $PKG_CONFIG --atleast-pkgconfig-version 0.20; then + _pkg_short_errors_supported=yes +else + _pkg_short_errors_supported=no +fi[]dnl +])dnl _PKG_SHORT_ERRORS_SUPPORTED + + +dnl PKG_CHECK_MODULES(VARIABLE-PREFIX, MODULES, [ACTION-IF-FOUND], +dnl [ACTION-IF-NOT-FOUND]) +dnl -------------------------------------------------------------- +dnl Since: 0.4.0 +dnl +dnl Note that if there is a possibility the first call to +dnl PKG_CHECK_MODULES might not happen, you should be sure to include an +dnl explicit call to PKG_PROG_PKG_CONFIG in your configure.ac +AC_DEFUN([PKG_CHECK_MODULES], +[AC_REQUIRE([PKG_PROG_PKG_CONFIG])dnl +AC_ARG_VAR([$1][_CFLAGS], [C compiler flags for $1, overriding pkg-config])dnl +AC_ARG_VAR([$1][_LIBS], [linker flags for $1, overriding pkg-config])dnl + +pkg_failed=no +AC_MSG_CHECKING([for $1]) + +_PKG_CONFIG([$1][_CFLAGS], [cflags], [$2]) +_PKG_CONFIG([$1][_LIBS], [libs], [$2]) + +m4_define([_PKG_TEXT], [Alternatively, you may set the environment variables $1[]_CFLAGS +and $1[]_LIBS to avoid the need to call pkg-config. +See the pkg-config man page for more details.]) + +if test $pkg_failed = yes; then + AC_MSG_RESULT([no]) + _PKG_SHORT_ERRORS_SUPPORTED + if test $_pkg_short_errors_supported = yes; then + $1[]_PKG_ERRORS=`$PKG_CONFIG --short-errors --print-errors --cflags --libs "$2" 2>&1` + else + $1[]_PKG_ERRORS=`$PKG_CONFIG --print-errors --cflags --libs "$2" 2>&1` + fi + # Put the nasty error message in config.log where it belongs + echo "$$1[]_PKG_ERRORS" >&AS_MESSAGE_LOG_FD + + m4_default([$4], [AC_MSG_ERROR( +[Package requirements ($2) were not met: + +$$1_PKG_ERRORS + +Consider adjusting the PKG_CONFIG_PATH environment variable if you +installed software in a non-standard prefix. + +_PKG_TEXT])[]dnl + ]) +elif test $pkg_failed = untried; then + AC_MSG_RESULT([no]) + m4_default([$4], [AC_MSG_FAILURE( +[The pkg-config script could not be found or is too old. Make sure it +is in your PATH or set the PKG_CONFIG environment variable to the full +path to pkg-config. + +_PKG_TEXT + +To get pkg-config, see .])[]dnl + ]) +else + $1[]_CFLAGS=$pkg_cv_[]$1[]_CFLAGS + $1[]_LIBS=$pkg_cv_[]$1[]_LIBS + AC_MSG_RESULT([yes]) + $3 +fi[]dnl +])dnl PKG_CHECK_MODULES + + +dnl PKG_CHECK_MODULES_STATIC(VARIABLE-PREFIX, MODULES, [ACTION-IF-FOUND], +dnl [ACTION-IF-NOT-FOUND]) +dnl --------------------------------------------------------------------- +dnl Since: 0.29 +dnl +dnl Checks for existence of MODULES and gathers its build flags with +dnl static libraries enabled. Sets VARIABLE-PREFIX_CFLAGS from --cflags +dnl and VARIABLE-PREFIX_LIBS from --libs. +dnl +dnl Note that if there is a possibility the first call to +dnl PKG_CHECK_MODULES_STATIC might not happen, you should be sure to +dnl include an explicit call to PKG_PROG_PKG_CONFIG in your +dnl configure.ac. +AC_DEFUN([PKG_CHECK_MODULES_STATIC], +[AC_REQUIRE([PKG_PROG_PKG_CONFIG])dnl +_save_PKG_CONFIG=$PKG_CONFIG +PKG_CONFIG="$PKG_CONFIG --static" +PKG_CHECK_MODULES($@) +PKG_CONFIG=$_save_PKG_CONFIG[]dnl +])dnl PKG_CHECK_MODULES_STATIC + + +dnl PKG_INSTALLDIR([DIRECTORY]) +dnl ------------------------- +dnl Since: 0.27 +dnl +dnl Substitutes the variable pkgconfigdir as the location where a module +dnl should install pkg-config .pc files. By default the directory is +dnl $libdir/pkgconfig, but the default can be changed by passing +dnl DIRECTORY. The user can override through the --with-pkgconfigdir +dnl parameter. +AC_DEFUN([PKG_INSTALLDIR], +[m4_pushdef([pkg_default], [m4_default([$1], ['${libdir}/pkgconfig'])]) +m4_pushdef([pkg_description], + [pkg-config installation directory @<:@]pkg_default[@:>@]) +AC_ARG_WITH([pkgconfigdir], + [AS_HELP_STRING([--with-pkgconfigdir], pkg_description)],, + [with_pkgconfigdir=]pkg_default) +AC_SUBST([pkgconfigdir], [$with_pkgconfigdir]) +m4_popdef([pkg_default]) +m4_popdef([pkg_description]) +])dnl PKG_INSTALLDIR + + +dnl PKG_NOARCH_INSTALLDIR([DIRECTORY]) +dnl -------------------------------- +dnl Since: 0.27 +dnl +dnl Substitutes the variable noarch_pkgconfigdir as the location where a +dnl module should install arch-independent pkg-config .pc files. By +dnl default the directory is $datadir/pkgconfig, but the default can be +dnl changed by passing DIRECTORY. The user can override through the +dnl --with-noarch-pkgconfigdir parameter. +AC_DEFUN([PKG_NOARCH_INSTALLDIR], +[m4_pushdef([pkg_default], [m4_default([$1], ['${datadir}/pkgconfig'])]) +m4_pushdef([pkg_description], + [pkg-config arch-independent installation directory @<:@]pkg_default[@:>@]) +AC_ARG_WITH([noarch-pkgconfigdir], + [AS_HELP_STRING([--with-noarch-pkgconfigdir], pkg_description)],, + [with_noarch_pkgconfigdir=]pkg_default) +AC_SUBST([noarch_pkgconfigdir], [$with_noarch_pkgconfigdir]) +m4_popdef([pkg_default]) +m4_popdef([pkg_description]) +])dnl PKG_NOARCH_INSTALLDIR + + +dnl PKG_CHECK_VAR(VARIABLE, MODULE, CONFIG-VARIABLE, +dnl [ACTION-IF-FOUND], [ACTION-IF-NOT-FOUND]) +dnl ------------------------------------------- +dnl Since: 0.28 +dnl +dnl Retrieves the value of the pkg-config variable for the given module. +AC_DEFUN([PKG_CHECK_VAR], +[AC_REQUIRE([PKG_PROG_PKG_CONFIG])dnl +AC_ARG_VAR([$1], [value of $3 for $2, overriding pkg-config])dnl + +_PKG_CONFIG([$1], [variable="][$3]["], [$2]) +AS_VAR_COPY([$1], [pkg_cv_][$1]) + +AS_VAR_IF([$1], [""], [$5], [$4])dnl +])dnl PKG_CHECK_VAR + +# Copyright (C) 2002-2018 Free Software Foundation, Inc. +# +# This file is free software; the Free Software Foundation +# gives unlimited permission to copy and/or distribute it, +# with or without modifications, as long as this notice is preserved. + +# AM_AUTOMAKE_VERSION(VERSION) +# ---------------------------- +# Automake X.Y traces this macro to ensure aclocal.m4 has been +# generated from the m4 files accompanying Automake X.Y. +# (This private macro should not be called outside this file.) +AC_DEFUN([AM_AUTOMAKE_VERSION], +[am__api_version='1.16' +dnl Some users find AM_AUTOMAKE_VERSION and mistake it for a way to +dnl require some minimum version. Point them to the right macro. +m4_if([$1], [1.16.1], [], + [AC_FATAL([Do not call $0, use AM_INIT_AUTOMAKE([$1]).])])dnl +]) + +# _AM_AUTOCONF_VERSION(VERSION) +# ----------------------------- +# aclocal traces this macro to find the Autoconf version. +# This is a private macro too. Using m4_define simplifies +# the logic in aclocal, which can simply ignore this definition. +m4_define([_AM_AUTOCONF_VERSION], []) + +# AM_SET_CURRENT_AUTOMAKE_VERSION +# ------------------------------- +# Call AM_AUTOMAKE_VERSION and AM_AUTOMAKE_VERSION so they can be traced. +# This function is AC_REQUIREd by AM_INIT_AUTOMAKE. +AC_DEFUN([AM_SET_CURRENT_AUTOMAKE_VERSION], +[AM_AUTOMAKE_VERSION([1.16.1])dnl +m4_ifndef([AC_AUTOCONF_VERSION], + [m4_copy([m4_PACKAGE_VERSION], [AC_AUTOCONF_VERSION])])dnl +_AM_AUTOCONF_VERSION(m4_defn([AC_AUTOCONF_VERSION]))]) + +# AM_AUX_DIR_EXPAND -*- Autoconf -*- + +# Copyright (C) 2001-2018 Free Software Foundation, Inc. +# +# This file is free software; the Free Software Foundation +# gives unlimited permission to copy and/or distribute it, +# with or without modifications, as long as this notice is preserved. + +# For projects using AC_CONFIG_AUX_DIR([foo]), Autoconf sets +# $ac_aux_dir to '$srcdir/foo'. In other projects, it is set to +# '$srcdir', '$srcdir/..', or '$srcdir/../..'. +# +# Of course, Automake must honor this variable whenever it calls a +# tool from the auxiliary directory. The problem is that $srcdir (and +# therefore $ac_aux_dir as well) can be either absolute or relative, +# depending on how configure is run. This is pretty annoying, since +# it makes $ac_aux_dir quite unusable in subdirectories: in the top +# source directory, any form will work fine, but in subdirectories a +# relative path needs to be adjusted first. +# +# $ac_aux_dir/missing +# fails when called from a subdirectory if $ac_aux_dir is relative +# $top_srcdir/$ac_aux_dir/missing +# fails if $ac_aux_dir is absolute, +# fails when called from a subdirectory in a VPATH build with +# a relative $ac_aux_dir +# +# The reason of the latter failure is that $top_srcdir and $ac_aux_dir +# are both prefixed by $srcdir. In an in-source build this is usually +# harmless because $srcdir is '.', but things will broke when you +# start a VPATH build or use an absolute $srcdir. +# +# So we could use something similar to $top_srcdir/$ac_aux_dir/missing, +# iff we strip the leading $srcdir from $ac_aux_dir. That would be: +# am_aux_dir='\$(top_srcdir)/'`expr "$ac_aux_dir" : "$srcdir//*\(.*\)"` +# and then we would define $MISSING as +# MISSING="\${SHELL} $am_aux_dir/missing" +# This will work as long as MISSING is not called from configure, because +# unfortunately $(top_srcdir) has no meaning in configure. +# However there are other variables, like CC, which are often used in +# configure, and could therefore not use this "fixed" $ac_aux_dir. +# +# Another solution, used here, is to always expand $ac_aux_dir to an +# absolute PATH. The drawback is that using absolute paths prevent a +# configured tree to be moved without reconfiguration. + +AC_DEFUN([AM_AUX_DIR_EXPAND], +[AC_REQUIRE([AC_CONFIG_AUX_DIR_DEFAULT])dnl +# Expand $ac_aux_dir to an absolute path. +am_aux_dir=`cd "$ac_aux_dir" && pwd` +]) + +# AM_COND_IF -*- Autoconf -*- + +# Copyright (C) 2008-2018 Free Software Foundation, Inc. +# +# This file is free software; the Free Software Foundation +# gives unlimited permission to copy and/or distribute it, +# with or without modifications, as long as this notice is preserved. + +# _AM_COND_IF +# _AM_COND_ELSE +# _AM_COND_ENDIF +# -------------- +# These macros are only used for tracing. +m4_define([_AM_COND_IF]) +m4_define([_AM_COND_ELSE]) +m4_define([_AM_COND_ENDIF]) + +# AM_COND_IF(COND, [IF-TRUE], [IF-FALSE]) +# --------------------------------------- +# If the shell condition COND is true, execute IF-TRUE, otherwise execute +# IF-FALSE. Allow automake to learn about conditional instantiating macros +# (the AC_CONFIG_FOOS). +AC_DEFUN([AM_COND_IF], +[m4_ifndef([_AM_COND_VALUE_$1], + [m4_fatal([$0: no such condition "$1"])])dnl +_AM_COND_IF([$1])dnl +if test -z "$$1_TRUE"; then : + m4_n([$2])[]dnl +m4_ifval([$3], +[_AM_COND_ELSE([$1])dnl +else + $3 +])dnl +_AM_COND_ENDIF([$1])dnl +fi[]dnl +]) + +# AM_CONDITIONAL -*- Autoconf -*- + +# Copyright (C) 1997-2018 Free Software Foundation, Inc. +# +# This file is free software; the Free Software Foundation +# gives unlimited permission to copy and/or distribute it, +# with or without modifications, as long as this notice is preserved. + +# AM_CONDITIONAL(NAME, SHELL-CONDITION) +# ------------------------------------- +# Define a conditional. +AC_DEFUN([AM_CONDITIONAL], +[AC_PREREQ([2.52])dnl + m4_if([$1], [TRUE], [AC_FATAL([$0: invalid condition: $1])], + [$1], [FALSE], [AC_FATAL([$0: invalid condition: $1])])dnl +AC_SUBST([$1_TRUE])dnl +AC_SUBST([$1_FALSE])dnl +_AM_SUBST_NOTMAKE([$1_TRUE])dnl +_AM_SUBST_NOTMAKE([$1_FALSE])dnl +m4_define([_AM_COND_VALUE_$1], [$2])dnl +if $2; then + $1_TRUE= + $1_FALSE='#' +else + $1_TRUE='#' + $1_FALSE= +fi +AC_CONFIG_COMMANDS_PRE( +[if test -z "${$1_TRUE}" && test -z "${$1_FALSE}"; then + AC_MSG_ERROR([[conditional "$1" was never defined. +Usually this means the macro was only invoked conditionally.]]) +fi])]) + +# Copyright (C) 1999-2018 Free Software Foundation, Inc. +# +# This file is free software; the Free Software Foundation +# gives unlimited permission to copy and/or distribute it, +# with or without modifications, as long as this notice is preserved. + + +# There are a few dirty hacks below to avoid letting 'AC_PROG_CC' be +# written in clear, in which case automake, when reading aclocal.m4, +# will think it sees a *use*, and therefore will trigger all it's +# C support machinery. Also note that it means that autoscan, seeing +# CC etc. in the Makefile, will ask for an AC_PROG_CC use... + + +# _AM_DEPENDENCIES(NAME) +# ---------------------- +# See how the compiler implements dependency checking. +# NAME is "CC", "CXX", "OBJC", "OBJCXX", "UPC", or "GJC". +# We try a few techniques and use that to set a single cache variable. +# +# We don't AC_REQUIRE the corresponding AC_PROG_CC since the latter was +# modified to invoke _AM_DEPENDENCIES(CC); we would have a circular +# dependency, and given that the user is not expected to run this macro, +# just rely on AC_PROG_CC. +AC_DEFUN([_AM_DEPENDENCIES], +[AC_REQUIRE([AM_SET_DEPDIR])dnl +AC_REQUIRE([AM_OUTPUT_DEPENDENCY_COMMANDS])dnl +AC_REQUIRE([AM_MAKE_INCLUDE])dnl +AC_REQUIRE([AM_DEP_TRACK])dnl + +m4_if([$1], [CC], [depcc="$CC" am_compiler_list=], + [$1], [CXX], [depcc="$CXX" am_compiler_list=], + [$1], [OBJC], [depcc="$OBJC" am_compiler_list='gcc3 gcc'], + [$1], [OBJCXX], [depcc="$OBJCXX" am_compiler_list='gcc3 gcc'], + [$1], [UPC], [depcc="$UPC" am_compiler_list=], + [$1], [GCJ], [depcc="$GCJ" am_compiler_list='gcc3 gcc'], + [depcc="$$1" am_compiler_list=]) + +AC_CACHE_CHECK([dependency style of $depcc], + [am_cv_$1_dependencies_compiler_type], +[if test -z "$AMDEP_TRUE" && test -f "$am_depcomp"; then + # We make a subdir and do the tests there. Otherwise we can end up + # making bogus files that we don't know about and never remove. For + # instance it was reported that on HP-UX the gcc test will end up + # making a dummy file named 'D' -- because '-MD' means "put the output + # in D". + rm -rf conftest.dir + mkdir conftest.dir + # Copy depcomp to subdir because otherwise we won't find it if we're + # using a relative directory. + cp "$am_depcomp" conftest.dir + cd conftest.dir + # We will build objects and dependencies in a subdirectory because + # it helps to detect inapplicable dependency modes. For instance + # both Tru64's cc and ICC support -MD to output dependencies as a + # side effect of compilation, but ICC will put the dependencies in + # the current directory while Tru64 will put them in the object + # directory. + mkdir sub + + am_cv_$1_dependencies_compiler_type=none + if test "$am_compiler_list" = ""; then + am_compiler_list=`sed -n ['s/^#*\([a-zA-Z0-9]*\))$/\1/p'] < ./depcomp` + fi + am__universal=false + m4_case([$1], [CC], + [case " $depcc " in #( + *\ -arch\ *\ -arch\ *) am__universal=true ;; + esac], + [CXX], + [case " $depcc " in #( + *\ -arch\ *\ -arch\ *) am__universal=true ;; + esac]) + + for depmode in $am_compiler_list; do + # Setup a source with many dependencies, because some compilers + # like to wrap large dependency lists on column 80 (with \), and + # we should not choose a depcomp mode which is confused by this. + # + # We need to recreate these files for each test, as the compiler may + # overwrite some of them when testing with obscure command lines. + # This happens at least with the AIX C compiler. + : > sub/conftest.c + for i in 1 2 3 4 5 6; do + echo '#include "conftst'$i'.h"' >> sub/conftest.c + # Using ": > sub/conftst$i.h" creates only sub/conftst1.h with + # Solaris 10 /bin/sh. + echo '/* dummy */' > sub/conftst$i.h + done + echo "${am__include} ${am__quote}sub/conftest.Po${am__quote}" > confmf + + # We check with '-c' and '-o' for the sake of the "dashmstdout" + # mode. It turns out that the SunPro C++ compiler does not properly + # handle '-M -o', and we need to detect this. Also, some Intel + # versions had trouble with output in subdirs. + am__obj=sub/conftest.${OBJEXT-o} + am__minus_obj="-o $am__obj" + case $depmode in + gcc) + # This depmode causes a compiler race in universal mode. + test "$am__universal" = false || continue + ;; + nosideeffect) + # After this tag, mechanisms are not by side-effect, so they'll + # only be used when explicitly requested. + if test "x$enable_dependency_tracking" = xyes; then + continue + else + break + fi + ;; + msvc7 | msvc7msys | msvisualcpp | msvcmsys) + # This compiler won't grok '-c -o', but also, the minuso test has + # not run yet. These depmodes are late enough in the game, and + # so weak that their functioning should not be impacted. + am__obj=conftest.${OBJEXT-o} + am__minus_obj= + ;; + none) break ;; + esac + if depmode=$depmode \ + source=sub/conftest.c object=$am__obj \ + depfile=sub/conftest.Po tmpdepfile=sub/conftest.TPo \ + $SHELL ./depcomp $depcc -c $am__minus_obj sub/conftest.c \ + >/dev/null 2>conftest.err && + grep sub/conftst1.h sub/conftest.Po > /dev/null 2>&1 && + grep sub/conftst6.h sub/conftest.Po > /dev/null 2>&1 && + grep $am__obj sub/conftest.Po > /dev/null 2>&1 && + ${MAKE-make} -s -f confmf > /dev/null 2>&1; then + # icc doesn't choke on unknown options, it will just issue warnings + # or remarks (even with -Werror). So we grep stderr for any message + # that says an option was ignored or not supported. + # When given -MP, icc 7.0 and 7.1 complain thusly: + # icc: Command line warning: ignoring option '-M'; no argument required + # The diagnosis changed in icc 8.0: + # icc: Command line remark: option '-MP' not supported + if (grep 'ignoring option' conftest.err || + grep 'not supported' conftest.err) >/dev/null 2>&1; then :; else + am_cv_$1_dependencies_compiler_type=$depmode + break + fi + fi + done + + cd .. + rm -rf conftest.dir +else + am_cv_$1_dependencies_compiler_type=none +fi +]) +AC_SUBST([$1DEPMODE], [depmode=$am_cv_$1_dependencies_compiler_type]) +AM_CONDITIONAL([am__fastdep$1], [ + test "x$enable_dependency_tracking" != xno \ + && test "$am_cv_$1_dependencies_compiler_type" = gcc3]) +]) + + +# AM_SET_DEPDIR +# ------------- +# Choose a directory name for dependency files. +# This macro is AC_REQUIREd in _AM_DEPENDENCIES. +AC_DEFUN([AM_SET_DEPDIR], +[AC_REQUIRE([AM_SET_LEADING_DOT])dnl +AC_SUBST([DEPDIR], ["${am__leading_dot}deps"])dnl +]) + + +# AM_DEP_TRACK +# ------------ +AC_DEFUN([AM_DEP_TRACK], +[AC_ARG_ENABLE([dependency-tracking], [dnl +AS_HELP_STRING( + [--enable-dependency-tracking], + [do not reject slow dependency extractors]) +AS_HELP_STRING( + [--disable-dependency-tracking], + [speeds up one-time build])]) +if test "x$enable_dependency_tracking" != xno; then + am_depcomp="$ac_aux_dir/depcomp" + AMDEPBACKSLASH='\' + am__nodep='_no' +fi +AM_CONDITIONAL([AMDEP], [test "x$enable_dependency_tracking" != xno]) +AC_SUBST([AMDEPBACKSLASH])dnl +_AM_SUBST_NOTMAKE([AMDEPBACKSLASH])dnl +AC_SUBST([am__nodep])dnl +_AM_SUBST_NOTMAKE([am__nodep])dnl +]) + +# Generate code to set up dependency tracking. -*- Autoconf -*- + +# Copyright (C) 1999-2018 Free Software Foundation, Inc. +# +# This file is free software; the Free Software Foundation +# gives unlimited permission to copy and/or distribute it, +# with or without modifications, as long as this notice is preserved. + +# _AM_OUTPUT_DEPENDENCY_COMMANDS +# ------------------------------ +AC_DEFUN([_AM_OUTPUT_DEPENDENCY_COMMANDS], +[{ + # Older Autoconf quotes --file arguments for eval, but not when files + # are listed without --file. Let's play safe and only enable the eval + # if we detect the quoting. + # TODO: see whether this extra hack can be removed once we start + # requiring Autoconf 2.70 or later. + AS_CASE([$CONFIG_FILES], + [*\'*], [eval set x "$CONFIG_FILES"], + [*], [set x $CONFIG_FILES]) + shift + # Used to flag and report bootstrapping failures. + am_rc=0 + for am_mf + do + # Strip MF so we end up with the name of the file. + am_mf=`AS_ECHO(["$am_mf"]) | sed -e 's/:.*$//'` + # Check whether this is an Automake generated Makefile which includes + # dependency-tracking related rules and includes. + # Grep'ing the whole file directly is not great: AIX grep has a line + # limit of 2048, but all sed's we know have understand at least 4000. + sed -n 's,^am--depfiles:.*,X,p' "$am_mf" | grep X >/dev/null 2>&1 \ + || continue + am_dirpart=`AS_DIRNAME(["$am_mf"])` + am_filepart=`AS_BASENAME(["$am_mf"])` + AM_RUN_LOG([cd "$am_dirpart" \ + && sed -e '/# am--include-marker/d' "$am_filepart" \ + | $MAKE -f - am--depfiles]) || am_rc=$? + done + if test $am_rc -ne 0; then + AC_MSG_FAILURE([Something went wrong bootstrapping makefile fragments + for automatic dependency tracking. Try re-running configure with the + '--disable-dependency-tracking' option to at least be able to build + the package (albeit without support for automatic dependency tracking).]) + fi + AS_UNSET([am_dirpart]) + AS_UNSET([am_filepart]) + AS_UNSET([am_mf]) + AS_UNSET([am_rc]) + rm -f conftest-deps.mk +} +])# _AM_OUTPUT_DEPENDENCY_COMMANDS + + +# AM_OUTPUT_DEPENDENCY_COMMANDS +# ----------------------------- +# This macro should only be invoked once -- use via AC_REQUIRE. +# +# This code is only required when automatic dependency tracking is enabled. +# This creates each '.Po' and '.Plo' makefile fragment that we'll need in +# order to bootstrap the dependency handling code. +AC_DEFUN([AM_OUTPUT_DEPENDENCY_COMMANDS], +[AC_CONFIG_COMMANDS([depfiles], + [test x"$AMDEP_TRUE" != x"" || _AM_OUTPUT_DEPENDENCY_COMMANDS], + [AMDEP_TRUE="$AMDEP_TRUE" MAKE="${MAKE-make}"])]) + +# Do all the work for Automake. -*- Autoconf -*- + +# Copyright (C) 1996-2018 Free Software Foundation, Inc. +# +# This file is free software; the Free Software Foundation +# gives unlimited permission to copy and/or distribute it, +# with or without modifications, as long as this notice is preserved. + +# This macro actually does too much. Some checks are only needed if +# your package does certain things. But this isn't really a big deal. + +dnl Redefine AC_PROG_CC to automatically invoke _AM_PROG_CC_C_O. +m4_define([AC_PROG_CC], +m4_defn([AC_PROG_CC]) +[_AM_PROG_CC_C_O +]) + +# AM_INIT_AUTOMAKE(PACKAGE, VERSION, [NO-DEFINE]) +# AM_INIT_AUTOMAKE([OPTIONS]) +# ----------------------------------------------- +# The call with PACKAGE and VERSION arguments is the old style +# call (pre autoconf-2.50), which is being phased out. PACKAGE +# and VERSION should now be passed to AC_INIT and removed from +# the call to AM_INIT_AUTOMAKE. +# We support both call styles for the transition. After +# the next Automake release, Autoconf can make the AC_INIT +# arguments mandatory, and then we can depend on a new Autoconf +# release and drop the old call support. +AC_DEFUN([AM_INIT_AUTOMAKE], +[AC_PREREQ([2.65])dnl +dnl Autoconf wants to disallow AM_ names. We explicitly allow +dnl the ones we care about. +m4_pattern_allow([^AM_[A-Z]+FLAGS$])dnl +AC_REQUIRE([AM_SET_CURRENT_AUTOMAKE_VERSION])dnl +AC_REQUIRE([AC_PROG_INSTALL])dnl +if test "`cd $srcdir && pwd`" != "`pwd`"; then + # Use -I$(srcdir) only when $(srcdir) != ., so that make's output + # is not polluted with repeated "-I." + AC_SUBST([am__isrc], [' -I$(srcdir)'])_AM_SUBST_NOTMAKE([am__isrc])dnl + # test to see if srcdir already configured + if test -f $srcdir/config.status; then + AC_MSG_ERROR([source directory already configured; run "make distclean" there first]) + fi +fi + +# test whether we have cygpath +if test -z "$CYGPATH_W"; then + if (cygpath --version) >/dev/null 2>/dev/null; then + CYGPATH_W='cygpath -w' + else + CYGPATH_W=echo + fi +fi +AC_SUBST([CYGPATH_W]) + +# Define the identity of the package. +dnl Distinguish between old-style and new-style calls. +m4_ifval([$2], +[AC_DIAGNOSE([obsolete], + [$0: two- and three-arguments forms are deprecated.]) +m4_ifval([$3], [_AM_SET_OPTION([no-define])])dnl + AC_SUBST([PACKAGE], [$1])dnl + AC_SUBST([VERSION], [$2])], +[_AM_SET_OPTIONS([$1])dnl +dnl Diagnose old-style AC_INIT with new-style AM_AUTOMAKE_INIT. +m4_if( + m4_ifdef([AC_PACKAGE_NAME], [ok]):m4_ifdef([AC_PACKAGE_VERSION], [ok]), + [ok:ok],, + [m4_fatal([AC_INIT should be called with package and version arguments])])dnl + AC_SUBST([PACKAGE], ['AC_PACKAGE_TARNAME'])dnl + AC_SUBST([VERSION], ['AC_PACKAGE_VERSION'])])dnl + +_AM_IF_OPTION([no-define],, +[AC_DEFINE_UNQUOTED([PACKAGE], ["$PACKAGE"], [Name of package]) + AC_DEFINE_UNQUOTED([VERSION], ["$VERSION"], [Version number of package])])dnl + +# Some tools Automake needs. +AC_REQUIRE([AM_SANITY_CHECK])dnl +AC_REQUIRE([AC_ARG_PROGRAM])dnl +AM_MISSING_PROG([ACLOCAL], [aclocal-${am__api_version}]) +AM_MISSING_PROG([AUTOCONF], [autoconf]) +AM_MISSING_PROG([AUTOMAKE], [automake-${am__api_version}]) +AM_MISSING_PROG([AUTOHEADER], [autoheader]) +AM_MISSING_PROG([MAKEINFO], [makeinfo]) +AC_REQUIRE([AM_PROG_INSTALL_SH])dnl +AC_REQUIRE([AM_PROG_INSTALL_STRIP])dnl +AC_REQUIRE([AC_PROG_MKDIR_P])dnl +# For better backward compatibility. To be removed once Automake 1.9.x +# dies out for good. For more background, see: +# +# +AC_SUBST([mkdir_p], ['$(MKDIR_P)']) +# We need awk for the "check" target (and possibly the TAP driver). The +# system "awk" is bad on some platforms. +AC_REQUIRE([AC_PROG_AWK])dnl +AC_REQUIRE([AC_PROG_MAKE_SET])dnl +AC_REQUIRE([AM_SET_LEADING_DOT])dnl +_AM_IF_OPTION([tar-ustar], [_AM_PROG_TAR([ustar])], + [_AM_IF_OPTION([tar-pax], [_AM_PROG_TAR([pax])], + [_AM_PROG_TAR([v7])])]) +_AM_IF_OPTION([no-dependencies],, +[AC_PROVIDE_IFELSE([AC_PROG_CC], + [_AM_DEPENDENCIES([CC])], + [m4_define([AC_PROG_CC], + m4_defn([AC_PROG_CC])[_AM_DEPENDENCIES([CC])])])dnl +AC_PROVIDE_IFELSE([AC_PROG_CXX], + [_AM_DEPENDENCIES([CXX])], + [m4_define([AC_PROG_CXX], + m4_defn([AC_PROG_CXX])[_AM_DEPENDENCIES([CXX])])])dnl +AC_PROVIDE_IFELSE([AC_PROG_OBJC], + [_AM_DEPENDENCIES([OBJC])], + [m4_define([AC_PROG_OBJC], + m4_defn([AC_PROG_OBJC])[_AM_DEPENDENCIES([OBJC])])])dnl +AC_PROVIDE_IFELSE([AC_PROG_OBJCXX], + [_AM_DEPENDENCIES([OBJCXX])], + [m4_define([AC_PROG_OBJCXX], + m4_defn([AC_PROG_OBJCXX])[_AM_DEPENDENCIES([OBJCXX])])])dnl +]) +AC_REQUIRE([AM_SILENT_RULES])dnl +dnl The testsuite driver may need to know about EXEEXT, so add the +dnl 'am__EXEEXT' conditional if _AM_COMPILER_EXEEXT was seen. This +dnl macro is hooked onto _AC_COMPILER_EXEEXT early, see below. +AC_CONFIG_COMMANDS_PRE(dnl +[m4_provide_if([_AM_COMPILER_EXEEXT], + [AM_CONDITIONAL([am__EXEEXT], [test -n "$EXEEXT"])])])dnl + +# POSIX will say in a future version that running "rm -f" with no argument +# is OK; and we want to be able to make that assumption in our Makefile +# recipes. So use an aggressive probe to check that the usage we want is +# actually supported "in the wild" to an acceptable degree. +# See automake bug#10828. +# To make any issue more visible, cause the running configure to be aborted +# by default if the 'rm' program in use doesn't match our expectations; the +# user can still override this though. +if rm -f && rm -fr && rm -rf; then : OK; else + cat >&2 <<'END' +Oops! + +Your 'rm' program seems unable to run without file operands specified +on the command line, even when the '-f' option is present. This is contrary +to the behaviour of most rm programs out there, and not conforming with +the upcoming POSIX standard: + +Please tell bug-automake@gnu.org about your system, including the value +of your $PATH and any error possibly output before this message. This +can help us improve future automake versions. + +END + if test x"$ACCEPT_INFERIOR_RM_PROGRAM" = x"yes"; then + echo 'Configuration will proceed anyway, since you have set the' >&2 + echo 'ACCEPT_INFERIOR_RM_PROGRAM variable to "yes"' >&2 + echo >&2 + else + cat >&2 <<'END' +Aborting the configuration process, to ensure you take notice of the issue. + +You can download and install GNU coreutils to get an 'rm' implementation +that behaves properly: . + +If you want to complete the configuration process using your problematic +'rm' anyway, export the environment variable ACCEPT_INFERIOR_RM_PROGRAM +to "yes", and re-run configure. + +END + AC_MSG_ERROR([Your 'rm' program is bad, sorry.]) + fi +fi +dnl The trailing newline in this macro's definition is deliberate, for +dnl backward compatibility and to allow trailing 'dnl'-style comments +dnl after the AM_INIT_AUTOMAKE invocation. See automake bug#16841. +]) + +dnl Hook into '_AC_COMPILER_EXEEXT' early to learn its expansion. Do not +dnl add the conditional right here, as _AC_COMPILER_EXEEXT may be further +dnl mangled by Autoconf and run in a shell conditional statement. +m4_define([_AC_COMPILER_EXEEXT], +m4_defn([_AC_COMPILER_EXEEXT])[m4_provide([_AM_COMPILER_EXEEXT])]) + +# When config.status generates a header, we must update the stamp-h file. +# This file resides in the same directory as the config header +# that is generated. The stamp files are numbered to have different names. + +# Autoconf calls _AC_AM_CONFIG_HEADER_HOOK (when defined) in the +# loop where config.status creates the headers, so we can generate +# our stamp files there. +AC_DEFUN([_AC_AM_CONFIG_HEADER_HOOK], +[# Compute $1's index in $config_headers. +_am_arg=$1 +_am_stamp_count=1 +for _am_header in $config_headers :; do + case $_am_header in + $_am_arg | $_am_arg:* ) + break ;; + * ) + _am_stamp_count=`expr $_am_stamp_count + 1` ;; + esac +done +echo "timestamp for $_am_arg" >`AS_DIRNAME(["$_am_arg"])`/stamp-h[]$_am_stamp_count]) + +# Copyright (C) 2001-2018 Free Software Foundation, Inc. +# +# This file is free software; the Free Software Foundation +# gives unlimited permission to copy and/or distribute it, +# with or without modifications, as long as this notice is preserved. + +# AM_PROG_INSTALL_SH +# ------------------ +# Define $install_sh. +AC_DEFUN([AM_PROG_INSTALL_SH], +[AC_REQUIRE([AM_AUX_DIR_EXPAND])dnl +if test x"${install_sh+set}" != xset; then + case $am_aux_dir in + *\ * | *\ *) + install_sh="\${SHELL} '$am_aux_dir/install-sh'" ;; + *) + install_sh="\${SHELL} $am_aux_dir/install-sh" + esac +fi +AC_SUBST([install_sh])]) + +# Copyright (C) 2003-2018 Free Software Foundation, Inc. +# +# This file is free software; the Free Software Foundation +# gives unlimited permission to copy and/or distribute it, +# with or without modifications, as long as this notice is preserved. + +# Check whether the underlying file-system supports filenames +# with a leading dot. For instance MS-DOS doesn't. +AC_DEFUN([AM_SET_LEADING_DOT], +[rm -rf .tst 2>/dev/null +mkdir .tst 2>/dev/null +if test -d .tst; then + am__leading_dot=. +else + am__leading_dot=_ +fi +rmdir .tst 2>/dev/null +AC_SUBST([am__leading_dot])]) + +# Check to see how 'make' treats includes. -*- Autoconf -*- + +# Copyright (C) 2001-2018 Free Software Foundation, Inc. +# +# This file is free software; the Free Software Foundation +# gives unlimited permission to copy and/or distribute it, +# with or without modifications, as long as this notice is preserved. + +# AM_MAKE_INCLUDE() +# ----------------- +# Check whether make has an 'include' directive that can support all +# the idioms we need for our automatic dependency tracking code. +AC_DEFUN([AM_MAKE_INCLUDE], +[AC_MSG_CHECKING([whether ${MAKE-make} supports the include directive]) +cat > confinc.mk << 'END' +am__doit: + @echo this is the am__doit target >confinc.out +.PHONY: am__doit +END +am__include="#" +am__quote= +# BSD make does it like this. +echo '.include "confinc.mk" # ignored' > confmf.BSD +# Other make implementations (GNU, Solaris 10, AIX) do it like this. +echo 'include confinc.mk # ignored' > confmf.GNU +_am_result=no +for s in GNU BSD; do + AM_RUN_LOG([${MAKE-make} -f confmf.$s && cat confinc.out]) + AS_CASE([$?:`cat confinc.out 2>/dev/null`], + ['0:this is the am__doit target'], + [AS_CASE([$s], + [BSD], [am__include='.include' am__quote='"'], + [am__include='include' am__quote=''])]) + if test "$am__include" != "#"; then + _am_result="yes ($s style)" + break + fi +done +rm -f confinc.* confmf.* +AC_MSG_RESULT([${_am_result}]) +AC_SUBST([am__include])]) +AC_SUBST([am__quote])]) + +# Fake the existence of programs that GNU maintainers use. -*- Autoconf -*- + +# Copyright (C) 1997-2018 Free Software Foundation, Inc. +# +# This file is free software; the Free Software Foundation +# gives unlimited permission to copy and/or distribute it, +# with or without modifications, as long as this notice is preserved. + +# AM_MISSING_PROG(NAME, PROGRAM) +# ------------------------------ +AC_DEFUN([AM_MISSING_PROG], +[AC_REQUIRE([AM_MISSING_HAS_RUN]) +$1=${$1-"${am_missing_run}$2"} +AC_SUBST($1)]) + +# AM_MISSING_HAS_RUN +# ------------------ +# Define MISSING if not defined so far and test if it is modern enough. +# If it is, set am_missing_run to use it, otherwise, to nothing. +AC_DEFUN([AM_MISSING_HAS_RUN], +[AC_REQUIRE([AM_AUX_DIR_EXPAND])dnl +AC_REQUIRE_AUX_FILE([missing])dnl +if test x"${MISSING+set}" != xset; then + case $am_aux_dir in + *\ * | *\ *) + MISSING="\${SHELL} \"$am_aux_dir/missing\"" ;; + *) + MISSING="\${SHELL} $am_aux_dir/missing" ;; + esac +fi +# Use eval to expand $SHELL +if eval "$MISSING --is-lightweight"; then + am_missing_run="$MISSING " +else + am_missing_run= + AC_MSG_WARN(['missing' script is too old or missing]) +fi +]) + +# Copyright (C) 2003-2018 Free Software Foundation, Inc. +# +# This file is free software; the Free Software Foundation +# gives unlimited permission to copy and/or distribute it, +# with or without modifications, as long as this notice is preserved. + +# AM_PROG_MKDIR_P +# --------------- +# Check for 'mkdir -p'. +AC_DEFUN([AM_PROG_MKDIR_P], +[AC_PREREQ([2.60])dnl +AC_REQUIRE([AC_PROG_MKDIR_P])dnl +dnl FIXME we are no longer going to remove this! adjust warning +dnl FIXME message accordingly. +AC_DIAGNOSE([obsolete], +[$0: this macro is deprecated, and will soon be removed. +You should use the Autoconf-provided 'AC][_PROG_MKDIR_P' macro instead, +and use '$(MKDIR_P)' instead of '$(mkdir_p)'in your Makefile.am files.]) +dnl Automake 1.8 to 1.9.6 used to define mkdir_p. We now use MKDIR_P, +dnl while keeping a definition of mkdir_p for backward compatibility. +dnl @MKDIR_P@ is magic: AC_OUTPUT adjusts its value for each Makefile. +dnl However we cannot define mkdir_p as $(MKDIR_P) for the sake of +dnl Makefile.ins that do not define MKDIR_P, so we do our own +dnl adjustment using top_builddir (which is defined more often than +dnl MKDIR_P). +AC_SUBST([mkdir_p], ["$MKDIR_P"])dnl +case $mkdir_p in + [[\\/$]]* | ?:[[\\/]]*) ;; + */*) mkdir_p="\$(top_builddir)/$mkdir_p" ;; +esac +]) + +# Helper functions for option handling. -*- Autoconf -*- + +# Copyright (C) 2001-2018 Free Software Foundation, Inc. +# +# This file is free software; the Free Software Foundation +# gives unlimited permission to copy and/or distribute it, +# with or without modifications, as long as this notice is preserved. + +# _AM_MANGLE_OPTION(NAME) +# ----------------------- +AC_DEFUN([_AM_MANGLE_OPTION], +[[_AM_OPTION_]m4_bpatsubst($1, [[^a-zA-Z0-9_]], [_])]) + +# _AM_SET_OPTION(NAME) +# -------------------- +# Set option NAME. Presently that only means defining a flag for this option. +AC_DEFUN([_AM_SET_OPTION], +[m4_define(_AM_MANGLE_OPTION([$1]), [1])]) + +# _AM_SET_OPTIONS(OPTIONS) +# ------------------------ +# OPTIONS is a space-separated list of Automake options. +AC_DEFUN([_AM_SET_OPTIONS], +[m4_foreach_w([_AM_Option], [$1], [_AM_SET_OPTION(_AM_Option)])]) + +# _AM_IF_OPTION(OPTION, IF-SET, [IF-NOT-SET]) +# ------------------------------------------- +# Execute IF-SET if OPTION is set, IF-NOT-SET otherwise. +AC_DEFUN([_AM_IF_OPTION], +[m4_ifset(_AM_MANGLE_OPTION([$1]), [$2], [$3])]) + +# Copyright (C) 1999-2018 Free Software Foundation, Inc. +# +# This file is free software; the Free Software Foundation +# gives unlimited permission to copy and/or distribute it, +# with or without modifications, as long as this notice is preserved. + +# _AM_PROG_CC_C_O +# --------------- +# Like AC_PROG_CC_C_O, but changed for automake. We rewrite AC_PROG_CC +# to automatically call this. +AC_DEFUN([_AM_PROG_CC_C_O], +[AC_REQUIRE([AM_AUX_DIR_EXPAND])dnl +AC_REQUIRE_AUX_FILE([compile])dnl +AC_LANG_PUSH([C])dnl +AC_CACHE_CHECK( + [whether $CC understands -c and -o together], + [am_cv_prog_cc_c_o], + [AC_LANG_CONFTEST([AC_LANG_PROGRAM([])]) + # Make sure it works both with $CC and with simple cc. + # Following AC_PROG_CC_C_O, we do the test twice because some + # compilers refuse to overwrite an existing .o file with -o, + # though they will create one. + am_cv_prog_cc_c_o=yes + for am_i in 1 2; do + if AM_RUN_LOG([$CC -c conftest.$ac_ext -o conftest2.$ac_objext]) \ + && test -f conftest2.$ac_objext; then + : OK + else + am_cv_prog_cc_c_o=no + break + fi + done + rm -f core conftest* + unset am_i]) +if test "$am_cv_prog_cc_c_o" != yes; then + # Losing compiler, so override with the script. + # FIXME: It is wrong to rewrite CC. + # But if we don't then we get into trouble of one sort or another. + # A longer-term fix would be to have automake use am__CC in this case, + # and then we could set am__CC="\$(top_srcdir)/compile \$(CC)" + CC="$am_aux_dir/compile $CC" +fi +AC_LANG_POP([C])]) + +# For backward compatibility. +AC_DEFUN_ONCE([AM_PROG_CC_C_O], [AC_REQUIRE([AC_PROG_CC])]) + +# Copyright (C) 2001-2018 Free Software Foundation, Inc. +# +# This file is free software; the Free Software Foundation +# gives unlimited permission to copy and/or distribute it, +# with or without modifications, as long as this notice is preserved. + +# AM_RUN_LOG(COMMAND) +# ------------------- +# Run COMMAND, save the exit status in ac_status, and log it. +# (This has been adapted from Autoconf's _AC_RUN_LOG macro.) +AC_DEFUN([AM_RUN_LOG], +[{ echo "$as_me:$LINENO: $1" >&AS_MESSAGE_LOG_FD + ($1) >&AS_MESSAGE_LOG_FD 2>&AS_MESSAGE_LOG_FD + ac_status=$? + echo "$as_me:$LINENO: \$? = $ac_status" >&AS_MESSAGE_LOG_FD + (exit $ac_status); }]) + +# Check to make sure that the build environment is sane. -*- Autoconf -*- + +# Copyright (C) 1996-2018 Free Software Foundation, Inc. +# +# This file is free software; the Free Software Foundation +# gives unlimited permission to copy and/or distribute it, +# with or without modifications, as long as this notice is preserved. + +# AM_SANITY_CHECK +# --------------- +AC_DEFUN([AM_SANITY_CHECK], +[AC_MSG_CHECKING([whether build environment is sane]) +# Reject unsafe characters in $srcdir or the absolute working directory +# name. Accept space and tab only in the latter. +am_lf=' +' +case `pwd` in + *[[\\\"\#\$\&\'\`$am_lf]]*) + AC_MSG_ERROR([unsafe absolute working directory name]);; +esac +case $srcdir in + *[[\\\"\#\$\&\'\`$am_lf\ \ ]]*) + AC_MSG_ERROR([unsafe srcdir value: '$srcdir']);; +esac + +# Do 'set' in a subshell so we don't clobber the current shell's +# arguments. Must try -L first in case configure is actually a +# symlink; some systems play weird games with the mod time of symlinks +# (eg FreeBSD returns the mod time of the symlink's containing +# directory). +if ( + am_has_slept=no + for am_try in 1 2; do + echo "timestamp, slept: $am_has_slept" > conftest.file + set X `ls -Lt "$srcdir/configure" conftest.file 2> /dev/null` + if test "$[*]" = "X"; then + # -L didn't work. + set X `ls -t "$srcdir/configure" conftest.file` + fi + if test "$[*]" != "X $srcdir/configure conftest.file" \ + && test "$[*]" != "X conftest.file $srcdir/configure"; then + + # If neither matched, then we have a broken ls. This can happen + # if, for instance, CONFIG_SHELL is bash and it inherits a + # broken ls alias from the environment. This has actually + # happened. Such a system could not be considered "sane". + AC_MSG_ERROR([ls -t appears to fail. Make sure there is not a broken + alias in your environment]) + fi + if test "$[2]" = conftest.file || test $am_try -eq 2; then + break + fi + # Just in case. + sleep 1 + am_has_slept=yes + done + test "$[2]" = conftest.file + ) +then + # Ok. + : +else + AC_MSG_ERROR([newly created file is older than distributed files! +Check your system clock]) +fi +AC_MSG_RESULT([yes]) +# If we didn't sleep, we still need to ensure time stamps of config.status and +# generated files are strictly newer. +am_sleep_pid= +if grep 'slept: no' conftest.file >/dev/null 2>&1; then + ( sleep 1 ) & + am_sleep_pid=$! +fi +AC_CONFIG_COMMANDS_PRE( + [AC_MSG_CHECKING([that generated files are newer than configure]) + if test -n "$am_sleep_pid"; then + # Hide warnings about reused PIDs. + wait $am_sleep_pid 2>/dev/null + fi + AC_MSG_RESULT([done])]) +rm -f conftest.file +]) + +# Copyright (C) 2009-2018 Free Software Foundation, Inc. +# +# This file is free software; the Free Software Foundation +# gives unlimited permission to copy and/or distribute it, +# with or without modifications, as long as this notice is preserved. + +# AM_SILENT_RULES([DEFAULT]) +# -------------------------- +# Enable less verbose build rules; with the default set to DEFAULT +# ("yes" being less verbose, "no" or empty being verbose). +AC_DEFUN([AM_SILENT_RULES], +[AC_ARG_ENABLE([silent-rules], [dnl +AS_HELP_STRING( + [--enable-silent-rules], + [less verbose build output (undo: "make V=1")]) +AS_HELP_STRING( + [--disable-silent-rules], + [verbose build output (undo: "make V=0")])dnl +]) +case $enable_silent_rules in @%:@ ((( + yes) AM_DEFAULT_VERBOSITY=0;; + no) AM_DEFAULT_VERBOSITY=1;; + *) AM_DEFAULT_VERBOSITY=m4_if([$1], [yes], [0], [1]);; +esac +dnl +dnl A few 'make' implementations (e.g., NonStop OS and NextStep) +dnl do not support nested variable expansions. +dnl See automake bug#9928 and bug#10237. +am_make=${MAKE-make} +AC_CACHE_CHECK([whether $am_make supports nested variables], + [am_cv_make_support_nested_variables], + [if AS_ECHO([['TRUE=$(BAR$(V)) +BAR0=false +BAR1=true +V=1 +am__doit: + @$(TRUE) +.PHONY: am__doit']]) | $am_make -f - >/dev/null 2>&1; then + am_cv_make_support_nested_variables=yes +else + am_cv_make_support_nested_variables=no +fi]) +if test $am_cv_make_support_nested_variables = yes; then + dnl Using '$V' instead of '$(V)' breaks IRIX make. + AM_V='$(V)' + AM_DEFAULT_V='$(AM_DEFAULT_VERBOSITY)' +else + AM_V=$AM_DEFAULT_VERBOSITY + AM_DEFAULT_V=$AM_DEFAULT_VERBOSITY +fi +AC_SUBST([AM_V])dnl +AM_SUBST_NOTMAKE([AM_V])dnl +AC_SUBST([AM_DEFAULT_V])dnl +AM_SUBST_NOTMAKE([AM_DEFAULT_V])dnl +AC_SUBST([AM_DEFAULT_VERBOSITY])dnl +AM_BACKSLASH='\' +AC_SUBST([AM_BACKSLASH])dnl +_AM_SUBST_NOTMAKE([AM_BACKSLASH])dnl +]) + +# Copyright (C) 2001-2018 Free Software Foundation, Inc. +# +# This file is free software; the Free Software Foundation +# gives unlimited permission to copy and/or distribute it, +# with or without modifications, as long as this notice is preserved. + +# AM_PROG_INSTALL_STRIP +# --------------------- +# One issue with vendor 'install' (even GNU) is that you can't +# specify the program used to strip binaries. This is especially +# annoying in cross-compiling environments, where the build's strip +# is unlikely to handle the host's binaries. +# Fortunately install-sh will honor a STRIPPROG variable, so we +# always use install-sh in "make install-strip", and initialize +# STRIPPROG with the value of the STRIP variable (set by the user). +AC_DEFUN([AM_PROG_INSTALL_STRIP], +[AC_REQUIRE([AM_PROG_INSTALL_SH])dnl +# Installed binaries are usually stripped using 'strip' when the user +# run "make install-strip". However 'strip' might not be the right +# tool to use in cross-compilation environments, therefore Automake +# will honor the 'STRIP' environment variable to overrule this program. +dnl Don't test for $cross_compiling = yes, because it might be 'maybe'. +if test "$cross_compiling" != no; then + AC_CHECK_TOOL([STRIP], [strip], :) +fi +INSTALL_STRIP_PROGRAM="\$(install_sh) -c -s" +AC_SUBST([INSTALL_STRIP_PROGRAM])]) + +# Copyright (C) 2006-2018 Free Software Foundation, Inc. +# +# This file is free software; the Free Software Foundation +# gives unlimited permission to copy and/or distribute it, +# with or without modifications, as long as this notice is preserved. + +# _AM_SUBST_NOTMAKE(VARIABLE) +# --------------------------- +# Prevent Automake from outputting VARIABLE = @VARIABLE@ in Makefile.in. +# This macro is traced by Automake. +AC_DEFUN([_AM_SUBST_NOTMAKE]) + +# AM_SUBST_NOTMAKE(VARIABLE) +# -------------------------- +# Public sister of _AM_SUBST_NOTMAKE. +AC_DEFUN([AM_SUBST_NOTMAKE], [_AM_SUBST_NOTMAKE($@)]) + +# Check how to create a tarball. -*- Autoconf -*- + +# Copyright (C) 2004-2018 Free Software Foundation, Inc. +# +# This file is free software; the Free Software Foundation +# gives unlimited permission to copy and/or distribute it, +# with or without modifications, as long as this notice is preserved. + +# _AM_PROG_TAR(FORMAT) +# -------------------- +# Check how to create a tarball in format FORMAT. +# FORMAT should be one of 'v7', 'ustar', or 'pax'. +# +# Substitute a variable $(am__tar) that is a command +# writing to stdout a FORMAT-tarball containing the directory +# $tardir. +# tardir=directory && $(am__tar) > result.tar +# +# Substitute a variable $(am__untar) that extract such +# a tarball read from stdin. +# $(am__untar) < result.tar +# +AC_DEFUN([_AM_PROG_TAR], +[# Always define AMTAR for backward compatibility. Yes, it's still used +# in the wild :-( We should find a proper way to deprecate it ... +AC_SUBST([AMTAR], ['$${TAR-tar}']) + +# We'll loop over all known methods to create a tar archive until one works. +_am_tools='gnutar m4_if([$1], [ustar], [plaintar]) pax cpio none' + +m4_if([$1], [v7], + [am__tar='$${TAR-tar} chof - "$$tardir"' am__untar='$${TAR-tar} xf -'], + + [m4_case([$1], + [ustar], + [# The POSIX 1988 'ustar' format is defined with fixed-size fields. + # There is notably a 21 bits limit for the UID and the GID. In fact, + # the 'pax' utility can hang on bigger UID/GID (see automake bug#8343 + # and bug#13588). + am_max_uid=2097151 # 2^21 - 1 + am_max_gid=$am_max_uid + # The $UID and $GID variables are not portable, so we need to resort + # to the POSIX-mandated id(1) utility. Errors in the 'id' calls + # below are definitely unexpected, so allow the users to see them + # (that is, avoid stderr redirection). + am_uid=`id -u || echo unknown` + am_gid=`id -g || echo unknown` + AC_MSG_CHECKING([whether UID '$am_uid' is supported by ustar format]) + if test $am_uid -le $am_max_uid; then + AC_MSG_RESULT([yes]) + else + AC_MSG_RESULT([no]) + _am_tools=none + fi + AC_MSG_CHECKING([whether GID '$am_gid' is supported by ustar format]) + if test $am_gid -le $am_max_gid; then + AC_MSG_RESULT([yes]) + else + AC_MSG_RESULT([no]) + _am_tools=none + fi], + + [pax], + [], + + [m4_fatal([Unknown tar format])]) + + AC_MSG_CHECKING([how to create a $1 tar archive]) + + # Go ahead even if we have the value already cached. We do so because we + # need to set the values for the 'am__tar' and 'am__untar' variables. + _am_tools=${am_cv_prog_tar_$1-$_am_tools} + + for _am_tool in $_am_tools; do + case $_am_tool in + gnutar) + for _am_tar in tar gnutar gtar; do + AM_RUN_LOG([$_am_tar --version]) && break + done + am__tar="$_am_tar --format=m4_if([$1], [pax], [posix], [$1]) -chf - "'"$$tardir"' + am__tar_="$_am_tar --format=m4_if([$1], [pax], [posix], [$1]) -chf - "'"$tardir"' + am__untar="$_am_tar -xf -" + ;; + plaintar) + # Must skip GNU tar: if it does not support --format= it doesn't create + # ustar tarball either. + (tar --version) >/dev/null 2>&1 && continue + am__tar='tar chf - "$$tardir"' + am__tar_='tar chf - "$tardir"' + am__untar='tar xf -' + ;; + pax) + am__tar='pax -L -x $1 -w "$$tardir"' + am__tar_='pax -L -x $1 -w "$tardir"' + am__untar='pax -r' + ;; + cpio) + am__tar='find "$$tardir" -print | cpio -o -H $1 -L' + am__tar_='find "$tardir" -print | cpio -o -H $1 -L' + am__untar='cpio -i -H $1 -d' + ;; + none) + am__tar=false + am__tar_=false + am__untar=false + ;; + esac + + # If the value was cached, stop now. We just wanted to have am__tar + # and am__untar set. + test -n "${am_cv_prog_tar_$1}" && break + + # tar/untar a dummy directory, and stop if the command works. + rm -rf conftest.dir + mkdir conftest.dir + echo GrepMe > conftest.dir/file + AM_RUN_LOG([tardir=conftest.dir && eval $am__tar_ >conftest.tar]) + rm -rf conftest.dir + if test -s conftest.tar; then + AM_RUN_LOG([$am__untar /dev/null 2>&1 && break + fi + done + rm -rf conftest.dir + + AC_CACHE_VAL([am_cv_prog_tar_$1], [am_cv_prog_tar_$1=$_am_tool]) + AC_MSG_RESULT([$am_cv_prog_tar_$1])]) + +AC_SUBST([am__tar]) +AC_SUBST([am__untar]) +]) # _AM_PROG_TAR + +m4_include([m4/expat.m4]) +m4_include([m4/gettext.m4]) +m4_include([m4/iconv.m4]) +m4_include([m4/intlmacosx.m4]) +m4_include([m4/lib-ld.m4]) +m4_include([m4/lib-link.m4]) +m4_include([m4/lib-prefix.m4]) +m4_include([m4/libcurl.m4]) +m4_include([m4/nls.m4]) +m4_include([m4/po.m4]) +m4_include([m4/progtest.m4]) diff --git a/compile b/compile new file mode 100755 index 0000000..99e5052 --- /dev/null +++ b/compile @@ -0,0 +1,348 @@ +#! /bin/sh +# Wrapper for compilers which do not understand '-c -o'. + +scriptversion=2018-03-07.03; # UTC + +# Copyright (C) 1999-2018 Free Software Foundation, Inc. +# Written by Tom Tromey . +# +# 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, 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, see . + +# As a special exception to the GNU General Public License, if you +# distribute this file as part of a program that contains a +# configuration script generated by Autoconf, you may include it under +# the same distribution terms that you use for the rest of that program. + +# This file is maintained in Automake, please report +# bugs to or send patches to +# . + +nl=' +' + +# We need space, tab and new line, in precisely that order. Quoting is +# there to prevent tools from complaining about whitespace usage. +IFS=" "" $nl" + +file_conv= + +# func_file_conv build_file lazy +# Convert a $build file to $host form and store it in $file +# Currently only supports Windows hosts. If the determined conversion +# type is listed in (the comma separated) LAZY, no conversion will +# take place. +func_file_conv () +{ + file=$1 + case $file in + / | /[!/]*) # absolute file, and not a UNC file + if test -z "$file_conv"; then + # lazily determine how to convert abs files + case `uname -s` in + MINGW*) + file_conv=mingw + ;; + CYGWIN*) + file_conv=cygwin + ;; + *) + file_conv=wine + ;; + esac + fi + case $file_conv/,$2, in + *,$file_conv,*) + ;; + mingw/*) + file=`cmd //C echo "$file " | sed -e 's/"\(.*\) " *$/\1/'` + ;; + cygwin/*) + file=`cygpath -m "$file" || echo "$file"` + ;; + wine/*) + file=`winepath -w "$file" || echo "$file"` + ;; + esac + ;; + esac +} + +# func_cl_dashL linkdir +# Make cl look for libraries in LINKDIR +func_cl_dashL () +{ + func_file_conv "$1" + if test -z "$lib_path"; then + lib_path=$file + else + lib_path="$lib_path;$file" + fi + linker_opts="$linker_opts -LIBPATH:$file" +} + +# func_cl_dashl library +# Do a library search-path lookup for cl +func_cl_dashl () +{ + lib=$1 + found=no + save_IFS=$IFS + IFS=';' + for dir in $lib_path $LIB + do + IFS=$save_IFS + if $shared && test -f "$dir/$lib.dll.lib"; then + found=yes + lib=$dir/$lib.dll.lib + break + fi + if test -f "$dir/$lib.lib"; then + found=yes + lib=$dir/$lib.lib + break + fi + if test -f "$dir/lib$lib.a"; then + found=yes + lib=$dir/lib$lib.a + break + fi + done + IFS=$save_IFS + + if test "$found" != yes; then + lib=$lib.lib + fi +} + +# func_cl_wrapper cl arg... +# Adjust compile command to suit cl +func_cl_wrapper () +{ + # Assume a capable shell + lib_path= + shared=: + linker_opts= + for arg + do + if test -n "$eat"; then + eat= + else + case $1 in + -o) + # configure might choose to run compile as 'compile cc -o foo foo.c'. + eat=1 + case $2 in + *.o | *.[oO][bB][jJ]) + func_file_conv "$2" + set x "$@" -Fo"$file" + shift + ;; + *) + func_file_conv "$2" + set x "$@" -Fe"$file" + shift + ;; + esac + ;; + -I) + eat=1 + func_file_conv "$2" mingw + set x "$@" -I"$file" + shift + ;; + -I*) + func_file_conv "${1#-I}" mingw + set x "$@" -I"$file" + shift + ;; + -l) + eat=1 + func_cl_dashl "$2" + set x "$@" "$lib" + shift + ;; + -l*) + func_cl_dashl "${1#-l}" + set x "$@" "$lib" + shift + ;; + -L) + eat=1 + func_cl_dashL "$2" + ;; + -L*) + func_cl_dashL "${1#-L}" + ;; + -static) + shared=false + ;; + -Wl,*) + arg=${1#-Wl,} + save_ifs="$IFS"; IFS=',' + for flag in $arg; do + IFS="$save_ifs" + linker_opts="$linker_opts $flag" + done + IFS="$save_ifs" + ;; + -Xlinker) + eat=1 + linker_opts="$linker_opts $2" + ;; + -*) + set x "$@" "$1" + shift + ;; + *.cc | *.CC | *.cxx | *.CXX | *.[cC]++) + func_file_conv "$1" + set x "$@" -Tp"$file" + shift + ;; + *.c | *.cpp | *.CPP | *.lib | *.LIB | *.Lib | *.OBJ | *.obj | *.[oO]) + func_file_conv "$1" mingw + set x "$@" "$file" + shift + ;; + *) + set x "$@" "$1" + shift + ;; + esac + fi + shift + done + if test -n "$linker_opts"; then + linker_opts="-link$linker_opts" + fi + exec "$@" $linker_opts + exit 1 +} + +eat= + +case $1 in + '') + echo "$0: No command. Try '$0 --help' for more information." 1>&2 + exit 1; + ;; + -h | --h*) + cat <<\EOF +Usage: compile [--help] [--version] PROGRAM [ARGS] + +Wrapper for compilers which do not understand '-c -o'. +Remove '-o dest.o' from ARGS, run PROGRAM with the remaining +arguments, and rename the output as expected. + +If you are trying to build a whole package this is not the +right script to run: please start by reading the file 'INSTALL'. + +Report bugs to . +EOF + exit $? + ;; + -v | --v*) + echo "compile $scriptversion" + exit $? + ;; + cl | *[/\\]cl | cl.exe | *[/\\]cl.exe | \ + icl | *[/\\]icl | icl.exe | *[/\\]icl.exe ) + func_cl_wrapper "$@" # Doesn't return... + ;; +esac + +ofile= +cfile= + +for arg +do + if test -n "$eat"; then + eat= + else + case $1 in + -o) + # configure might choose to run compile as 'compile cc -o foo foo.c'. + # So we strip '-o arg' only if arg is an object. + eat=1 + case $2 in + *.o | *.obj) + ofile=$2 + ;; + *) + set x "$@" -o "$2" + shift + ;; + esac + ;; + *.c) + cfile=$1 + set x "$@" "$1" + shift + ;; + *) + set x "$@" "$1" + shift + ;; + esac + fi + shift +done + +if test -z "$ofile" || test -z "$cfile"; then + # If no '-o' option was seen then we might have been invoked from a + # pattern rule where we don't need one. That is ok -- this is a + # normal compilation that the losing compiler can handle. If no + # '.c' file was seen then we are probably linking. That is also + # ok. + exec "$@" +fi + +# Name of file we expect compiler to create. +cofile=`echo "$cfile" | sed 's|^.*[\\/]||; s|^[a-zA-Z]:||; s/\.c$/.o/'` + +# Create the lock directory. +# Note: use '[/\\:.-]' here to ensure that we don't use the same name +# that we are using for the .o file. Also, base the name on the expected +# object file name, since that is what matters with a parallel build. +lockdir=`echo "$cofile" | sed -e 's|[/\\:.-]|_|g'`.d +while true; do + if mkdir "$lockdir" >/dev/null 2>&1; then + break + fi + sleep 1 +done +# FIXME: race condition here if user kills between mkdir and trap. +trap "rmdir '$lockdir'; exit 1" 1 2 15 + +# Run the compile. +"$@" +ret=$? + +if test -f "$cofile"; then + test "$cofile" = "$ofile" || mv "$cofile" "$ofile" +elif test -f "${cofile}bj"; then + test "${cofile}bj" = "$ofile" || mv "${cofile}bj" "$ofile" +fi + +rmdir "$lockdir" +exit $ret + +# Local Variables: +# mode: shell-script +# sh-indentation: 2 +# eval: (add-hook 'before-save-hook 'time-stamp) +# time-stamp-start: "scriptversion=" +# time-stamp-format: "%:y-%02m-%02d.%02H" +# time-stamp-time-zone: "UTC0" +# time-stamp-end: "; # UTC" +# End: diff --git a/config.guess b/config.guess new file mode 100755 index 0000000..f50dcdb --- /dev/null +++ b/config.guess @@ -0,0 +1,1480 @@ +#! /bin/sh +# Attempt to guess a canonical system name. +# Copyright 1992-2018 Free Software Foundation, Inc. + +timestamp='2018-02-24' + +# This file 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 3 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, see . +# +# As a special exception to the GNU General Public License, if you +# distribute this file as part of a program that contains a +# configuration script generated by Autoconf, you may include it under +# the same distribution terms that you use for the rest of that +# program. This Exception is an additional permission under section 7 +# of the GNU General Public License, version 3 ("GPLv3"). +# +# Originally written by Per Bothner; maintained since 2000 by Ben Elliston. +# +# You can get the latest version of this script from: +# https://git.savannah.gnu.org/gitweb/?p=config.git;a=blob_plain;f=config.guess +# +# Please send patches to . + + +me=`echo "$0" | sed -e 's,.*/,,'` + +usage="\ +Usage: $0 [OPTION] + +Output the configuration name of the system \`$me' is run on. + +Options: + -h, --help print this help, then exit + -t, --time-stamp print date of last modification, then exit + -v, --version print version number, then exit + +Report bugs and patches to ." + +version="\ +GNU config.guess ($timestamp) + +Originally written by Per Bothner. +Copyright 1992-2018 Free Software Foundation, Inc. + +This is free software; see the source for copying conditions. There is NO +warranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE." + +help=" +Try \`$me --help' for more information." + +# Parse command line +while test $# -gt 0 ; do + case $1 in + --time-stamp | --time* | -t ) + echo "$timestamp" ; exit ;; + --version | -v ) + echo "$version" ; exit ;; + --help | --h* | -h ) + echo "$usage"; exit ;; + -- ) # Stop option processing + shift; break ;; + - ) # Use stdin as input. + break ;; + -* ) + echo "$me: invalid option $1$help" >&2 + exit 1 ;; + * ) + break ;; + esac +done + +if test $# != 0; then + echo "$me: too many arguments$help" >&2 + exit 1 +fi + +trap 'exit 1' 1 2 15 + +# CC_FOR_BUILD -- compiler used by this script. Note that the use of a +# compiler to aid in system detection is discouraged as it requires +# temporary files to be created and, as you can see below, it is a +# headache to deal with in a portable fashion. + +# Historically, `CC_FOR_BUILD' used to be named `HOST_CC'. We still +# use `HOST_CC' if defined, but it is deprecated. + +# Portable tmp directory creation inspired by the Autoconf team. + +set_cc_for_build=' +trap "exitcode=\$?; (rm -f \$tmpfiles 2>/dev/null; rmdir \$tmp 2>/dev/null) && exit \$exitcode" 0 ; +trap "rm -f \$tmpfiles 2>/dev/null; rmdir \$tmp 2>/dev/null; exit 1" 1 2 13 15 ; +: ${TMPDIR=/tmp} ; + { tmp=`(umask 077 && mktemp -d "$TMPDIR/cgXXXXXX") 2>/dev/null` && test -n "$tmp" && test -d "$tmp" ; } || + { test -n "$RANDOM" && tmp=$TMPDIR/cg$$-$RANDOM && (umask 077 && mkdir $tmp) ; } || + { tmp=$TMPDIR/cg-$$ && (umask 077 && mkdir $tmp) && echo "Warning: creating insecure temp directory" >&2 ; } || + { echo "$me: cannot create a temporary directory in $TMPDIR" >&2 ; exit 1 ; } ; +dummy=$tmp/dummy ; +tmpfiles="$dummy.c $dummy.o $dummy.rel $dummy" ; +case $CC_FOR_BUILD,$HOST_CC,$CC in + ,,) echo "int x;" > "$dummy.c" ; + for c in cc gcc c89 c99 ; do + if ($c -c -o "$dummy.o" "$dummy.c") >/dev/null 2>&1 ; then + CC_FOR_BUILD="$c"; break ; + fi ; + done ; + if test x"$CC_FOR_BUILD" = x ; then + CC_FOR_BUILD=no_compiler_found ; + fi + ;; + ,,*) CC_FOR_BUILD=$CC ;; + ,*,*) CC_FOR_BUILD=$HOST_CC ;; +esac ; set_cc_for_build= ;' + +# This is needed to find uname on a Pyramid OSx when run in the BSD universe. +# (ghazi@noc.rutgers.edu 1994-08-24) +if (test -f /.attbin/uname) >/dev/null 2>&1 ; then + PATH=$PATH:/.attbin ; export PATH +fi + +UNAME_MACHINE=`(uname -m) 2>/dev/null` || UNAME_MACHINE=unknown +UNAME_RELEASE=`(uname -r) 2>/dev/null` || UNAME_RELEASE=unknown +UNAME_SYSTEM=`(uname -s) 2>/dev/null` || UNAME_SYSTEM=unknown +UNAME_VERSION=`(uname -v) 2>/dev/null` || UNAME_VERSION=unknown + +case "$UNAME_SYSTEM" in +Linux|GNU|GNU/*) + # If the system lacks a compiler, then just pick glibc. + # We could probably try harder. + LIBC=gnu + + eval "$set_cc_for_build" + cat <<-EOF > "$dummy.c" + #include + #if defined(__UCLIBC__) + LIBC=uclibc + #elif defined(__dietlibc__) + LIBC=dietlibc + #else + LIBC=gnu + #endif + EOF + eval "`$CC_FOR_BUILD -E "$dummy.c" 2>/dev/null | grep '^LIBC' | sed 's, ,,g'`" + + # If ldd exists, use it to detect musl libc. + if command -v ldd >/dev/null && \ + ldd --version 2>&1 | grep -q ^musl + then + LIBC=musl + fi + ;; +esac + +# Note: order is significant - the case branches are not exclusive. + +case "$UNAME_MACHINE:$UNAME_SYSTEM:$UNAME_RELEASE:$UNAME_VERSION" in + *:NetBSD:*:*) + # NetBSD (nbsd) targets should (where applicable) match one or + # more of the tuples: *-*-netbsdelf*, *-*-netbsdaout*, + # *-*-netbsdecoff* and *-*-netbsd*. For targets that recently + # switched to ELF, *-*-netbsd* would select the old + # object file format. This provides both forward + # compatibility and a consistent mechanism for selecting the + # object file format. + # + # Note: NetBSD doesn't particularly care about the vendor + # portion of the name. We always set it to "unknown". + sysctl="sysctl -n hw.machine_arch" + UNAME_MACHINE_ARCH=`(uname -p 2>/dev/null || \ + "/sbin/$sysctl" 2>/dev/null || \ + "/usr/sbin/$sysctl" 2>/dev/null || \ + echo unknown)` + case "$UNAME_MACHINE_ARCH" in + armeb) machine=armeb-unknown ;; + arm*) machine=arm-unknown ;; + sh3el) machine=shl-unknown ;; + sh3eb) machine=sh-unknown ;; + sh5el) machine=sh5le-unknown ;; + earmv*) + arch=`echo "$UNAME_MACHINE_ARCH" | sed -e 's,^e\(armv[0-9]\).*$,\1,'` + endian=`echo "$UNAME_MACHINE_ARCH" | sed -ne 's,^.*\(eb\)$,\1,p'` + machine="${arch}${endian}"-unknown + ;; + *) machine="$UNAME_MACHINE_ARCH"-unknown ;; + esac + # The Operating System including object format, if it has switched + # to ELF recently (or will in the future) and ABI. + case "$UNAME_MACHINE_ARCH" in + earm*) + os=netbsdelf + ;; + arm*|i386|m68k|ns32k|sh3*|sparc|vax) + eval "$set_cc_for_build" + if echo __ELF__ | $CC_FOR_BUILD -E - 2>/dev/null \ + | grep -q __ELF__ + then + # Once all utilities can be ECOFF (netbsdecoff) or a.out (netbsdaout). + # Return netbsd for either. FIX? + os=netbsd + else + os=netbsdelf + fi + ;; + *) + os=netbsd + ;; + esac + # Determine ABI tags. + case "$UNAME_MACHINE_ARCH" in + earm*) + expr='s/^earmv[0-9]/-eabi/;s/eb$//' + abi=`echo "$UNAME_MACHINE_ARCH" | sed -e "$expr"` + ;; + esac + # The OS release + # Debian GNU/NetBSD machines have a different userland, and + # thus, need a distinct triplet. However, they do not need + # kernel version information, so it can be replaced with a + # suitable tag, in the style of linux-gnu. + case "$UNAME_VERSION" in + Debian*) + release='-gnu' + ;; + *) + release=`echo "$UNAME_RELEASE" | sed -e 's/[-_].*//' | cut -d. -f1,2` + ;; + esac + # Since CPU_TYPE-MANUFACTURER-KERNEL-OPERATING_SYSTEM: + # contains redundant information, the shorter form: + # CPU_TYPE-MANUFACTURER-OPERATING_SYSTEM is used. + echo "$machine-${os}${release}${abi}" + exit ;; + *:Bitrig:*:*) + UNAME_MACHINE_ARCH=`arch | sed 's/Bitrig.//'` + echo "$UNAME_MACHINE_ARCH"-unknown-bitrig"$UNAME_RELEASE" + exit ;; + *:OpenBSD:*:*) + UNAME_MACHINE_ARCH=`arch | sed 's/OpenBSD.//'` + echo "$UNAME_MACHINE_ARCH"-unknown-openbsd"$UNAME_RELEASE" + exit ;; + *:LibertyBSD:*:*) + UNAME_MACHINE_ARCH=`arch | sed 's/^.*BSD\.//'` + echo "$UNAME_MACHINE_ARCH"-unknown-libertybsd"$UNAME_RELEASE" + exit ;; + *:MidnightBSD:*:*) + echo "$UNAME_MACHINE"-unknown-midnightbsd"$UNAME_RELEASE" + exit ;; + *:ekkoBSD:*:*) + echo "$UNAME_MACHINE"-unknown-ekkobsd"$UNAME_RELEASE" + exit ;; + *:SolidBSD:*:*) + echo "$UNAME_MACHINE"-unknown-solidbsd"$UNAME_RELEASE" + exit ;; + macppc:MirBSD:*:*) + echo powerpc-unknown-mirbsd"$UNAME_RELEASE" + exit ;; + *:MirBSD:*:*) + echo "$UNAME_MACHINE"-unknown-mirbsd"$UNAME_RELEASE" + exit ;; + *:Sortix:*:*) + echo "$UNAME_MACHINE"-unknown-sortix + exit ;; + *:Redox:*:*) + echo "$UNAME_MACHINE"-unknown-redox + exit ;; + mips:OSF1:*.*) + echo mips-dec-osf1 + exit ;; + alpha:OSF1:*:*) + case $UNAME_RELEASE in + *4.0) + UNAME_RELEASE=`/usr/sbin/sizer -v | awk '{print $3}'` + ;; + *5.*) + UNAME_RELEASE=`/usr/sbin/sizer -v | awk '{print $4}'` + ;; + esac + # According to Compaq, /usr/sbin/psrinfo has been available on + # OSF/1 and Tru64 systems produced since 1995. I hope that + # covers most systems running today. This code pipes the CPU + # types through head -n 1, so we only detect the type of CPU 0. + ALPHA_CPU_TYPE=`/usr/sbin/psrinfo -v | sed -n -e 's/^ The alpha \(.*\) processor.*$/\1/p' | head -n 1` + case "$ALPHA_CPU_TYPE" in + "EV4 (21064)") + UNAME_MACHINE=alpha ;; + "EV4.5 (21064)") + UNAME_MACHINE=alpha ;; + "LCA4 (21066/21068)") + UNAME_MACHINE=alpha ;; + "EV5 (21164)") + UNAME_MACHINE=alphaev5 ;; + "EV5.6 (21164A)") + UNAME_MACHINE=alphaev56 ;; + "EV5.6 (21164PC)") + UNAME_MACHINE=alphapca56 ;; + "EV5.7 (21164PC)") + UNAME_MACHINE=alphapca57 ;; + "EV6 (21264)") + UNAME_MACHINE=alphaev6 ;; + "EV6.7 (21264A)") + UNAME_MACHINE=alphaev67 ;; + "EV6.8CB (21264C)") + UNAME_MACHINE=alphaev68 ;; + "EV6.8AL (21264B)") + UNAME_MACHINE=alphaev68 ;; + "EV6.8CX (21264D)") + UNAME_MACHINE=alphaev68 ;; + "EV6.9A (21264/EV69A)") + UNAME_MACHINE=alphaev69 ;; + "EV7 (21364)") + UNAME_MACHINE=alphaev7 ;; + "EV7.9 (21364A)") + UNAME_MACHINE=alphaev79 ;; + esac + # A Pn.n version is a patched version. + # A Vn.n version is a released version. + # A Tn.n version is a released field test version. + # A Xn.n version is an unreleased experimental baselevel. + # 1.2 uses "1.2" for uname -r. + echo "$UNAME_MACHINE"-dec-osf"`echo "$UNAME_RELEASE" | sed -e 's/^[PVTX]//' | tr ABCDEFGHIJKLMNOPQRSTUVWXYZ abcdefghijklmnopqrstuvwxyz`" + # Reset EXIT trap before exiting to avoid spurious non-zero exit code. + exitcode=$? + trap '' 0 + exit $exitcode ;; + Amiga*:UNIX_System_V:4.0:*) + echo m68k-unknown-sysv4 + exit ;; + *:[Aa]miga[Oo][Ss]:*:*) + echo "$UNAME_MACHINE"-unknown-amigaos + exit ;; + *:[Mm]orph[Oo][Ss]:*:*) + echo "$UNAME_MACHINE"-unknown-morphos + exit ;; + *:OS/390:*:*) + echo i370-ibm-openedition + exit ;; + *:z/VM:*:*) + echo s390-ibm-zvmoe + exit ;; + *:OS400:*:*) + echo powerpc-ibm-os400 + exit ;; + arm:RISC*:1.[012]*:*|arm:riscix:1.[012]*:*) + echo arm-acorn-riscix"$UNAME_RELEASE" + exit ;; + arm*:riscos:*:*|arm*:RISCOS:*:*) + echo arm-unknown-riscos + exit ;; + SR2?01:HI-UX/MPP:*:* | SR8000:HI-UX/MPP:*:*) + echo hppa1.1-hitachi-hiuxmpp + exit ;; + Pyramid*:OSx*:*:* | MIS*:OSx*:*:* | MIS*:SMP_DC-OSx*:*:*) + # akee@wpdis03.wpafb.af.mil (Earle F. Ake) contributed MIS and NILE. + if test "`(/bin/universe) 2>/dev/null`" = att ; then + echo pyramid-pyramid-sysv3 + else + echo pyramid-pyramid-bsd + fi + exit ;; + NILE*:*:*:dcosx) + echo pyramid-pyramid-svr4 + exit ;; + DRS?6000:unix:4.0:6*) + echo sparc-icl-nx6 + exit ;; + DRS?6000:UNIX_SV:4.2*:7* | DRS?6000:isis:4.2*:7*) + case `/usr/bin/uname -p` in + sparc) echo sparc-icl-nx7; exit ;; + esac ;; + s390x:SunOS:*:*) + echo "$UNAME_MACHINE"-ibm-solaris2"`echo "$UNAME_RELEASE" | sed -e 's/[^.]*//'`" + exit ;; + sun4H:SunOS:5.*:*) + echo sparc-hal-solaris2"`echo "$UNAME_RELEASE"|sed -e 's/[^.]*//'`" + exit ;; + sun4*:SunOS:5.*:* | tadpole*:SunOS:5.*:*) + echo sparc-sun-solaris2"`echo "$UNAME_RELEASE" | sed -e 's/[^.]*//'`" + exit ;; + i86pc:AuroraUX:5.*:* | i86xen:AuroraUX:5.*:*) + echo i386-pc-auroraux"$UNAME_RELEASE" + exit ;; + i86pc:SunOS:5.*:* | i86xen:SunOS:5.*:*) + eval "$set_cc_for_build" + SUN_ARCH=i386 + # If there is a compiler, see if it is configured for 64-bit objects. + # Note that the Sun cc does not turn __LP64__ into 1 like gcc does. + # This test works for both compilers. + if [ "$CC_FOR_BUILD" != no_compiler_found ]; then + if (echo '#ifdef __amd64'; echo IS_64BIT_ARCH; echo '#endif') | \ + (CCOPTS="" $CC_FOR_BUILD -E - 2>/dev/null) | \ + grep IS_64BIT_ARCH >/dev/null + then + SUN_ARCH=x86_64 + fi + fi + echo "$SUN_ARCH"-pc-solaris2"`echo "$UNAME_RELEASE"|sed -e 's/[^.]*//'`" + exit ;; + sun4*:SunOS:6*:*) + # According to config.sub, this is the proper way to canonicalize + # SunOS6. Hard to guess exactly what SunOS6 will be like, but + # it's likely to be more like Solaris than SunOS4. + echo sparc-sun-solaris3"`echo "$UNAME_RELEASE"|sed -e 's/[^.]*//'`" + exit ;; + sun4*:SunOS:*:*) + case "`/usr/bin/arch -k`" in + Series*|S4*) + UNAME_RELEASE=`uname -v` + ;; + esac + # Japanese Language versions have a version number like `4.1.3-JL'. + echo sparc-sun-sunos"`echo "$UNAME_RELEASE"|sed -e 's/-/_/'`" + exit ;; + sun3*:SunOS:*:*) + echo m68k-sun-sunos"$UNAME_RELEASE" + exit ;; + sun*:*:4.2BSD:*) + UNAME_RELEASE=`(sed 1q /etc/motd | awk '{print substr($5,1,3)}') 2>/dev/null` + test "x$UNAME_RELEASE" = x && UNAME_RELEASE=3 + case "`/bin/arch`" in + sun3) + echo m68k-sun-sunos"$UNAME_RELEASE" + ;; + sun4) + echo sparc-sun-sunos"$UNAME_RELEASE" + ;; + esac + exit ;; + aushp:SunOS:*:*) + echo sparc-auspex-sunos"$UNAME_RELEASE" + exit ;; + # The situation for MiNT is a little confusing. The machine name + # can be virtually everything (everything which is not + # "atarist" or "atariste" at least should have a processor + # > m68000). The system name ranges from "MiNT" over "FreeMiNT" + # to the lowercase version "mint" (or "freemint"). Finally + # the system name "TOS" denotes a system which is actually not + # MiNT. But MiNT is downward compatible to TOS, so this should + # be no problem. + atarist[e]:*MiNT:*:* | atarist[e]:*mint:*:* | atarist[e]:*TOS:*:*) + echo m68k-atari-mint"$UNAME_RELEASE" + exit ;; + atari*:*MiNT:*:* | atari*:*mint:*:* | atarist[e]:*TOS:*:*) + echo m68k-atari-mint"$UNAME_RELEASE" + exit ;; + *falcon*:*MiNT:*:* | *falcon*:*mint:*:* | *falcon*:*TOS:*:*) + echo m68k-atari-mint"$UNAME_RELEASE" + exit ;; + milan*:*MiNT:*:* | milan*:*mint:*:* | *milan*:*TOS:*:*) + echo m68k-milan-mint"$UNAME_RELEASE" + exit ;; + hades*:*MiNT:*:* | hades*:*mint:*:* | *hades*:*TOS:*:*) + echo m68k-hades-mint"$UNAME_RELEASE" + exit ;; + *:*MiNT:*:* | *:*mint:*:* | *:*TOS:*:*) + echo m68k-unknown-mint"$UNAME_RELEASE" + exit ;; + m68k:machten:*:*) + echo m68k-apple-machten"$UNAME_RELEASE" + exit ;; + powerpc:machten:*:*) + echo powerpc-apple-machten"$UNAME_RELEASE" + exit ;; + RISC*:Mach:*:*) + echo mips-dec-mach_bsd4.3 + exit ;; + RISC*:ULTRIX:*:*) + echo mips-dec-ultrix"$UNAME_RELEASE" + exit ;; + VAX*:ULTRIX*:*:*) + echo vax-dec-ultrix"$UNAME_RELEASE" + exit ;; + 2020:CLIX:*:* | 2430:CLIX:*:*) + echo clipper-intergraph-clix"$UNAME_RELEASE" + exit ;; + mips:*:*:UMIPS | mips:*:*:RISCos) + eval "$set_cc_for_build" + sed 's/^ //' << EOF > "$dummy.c" +#ifdef __cplusplus +#include /* for printf() prototype */ + int main (int argc, char *argv[]) { +#else + int main (argc, argv) int argc; char *argv[]; { +#endif + #if defined (host_mips) && defined (MIPSEB) + #if defined (SYSTYPE_SYSV) + printf ("mips-mips-riscos%ssysv\\n", argv[1]); exit (0); + #endif + #if defined (SYSTYPE_SVR4) + printf ("mips-mips-riscos%ssvr4\\n", argv[1]); exit (0); + #endif + #if defined (SYSTYPE_BSD43) || defined(SYSTYPE_BSD) + printf ("mips-mips-riscos%sbsd\\n", argv[1]); exit (0); + #endif + #endif + exit (-1); + } +EOF + $CC_FOR_BUILD -o "$dummy" "$dummy.c" && + dummyarg=`echo "$UNAME_RELEASE" | sed -n 's/\([0-9]*\).*/\1/p'` && + SYSTEM_NAME=`"$dummy" "$dummyarg"` && + { echo "$SYSTEM_NAME"; exit; } + echo mips-mips-riscos"$UNAME_RELEASE" + exit ;; + Motorola:PowerMAX_OS:*:*) + echo powerpc-motorola-powermax + exit ;; + Motorola:*:4.3:PL8-*) + echo powerpc-harris-powermax + exit ;; + Night_Hawk:*:*:PowerMAX_OS | Synergy:PowerMAX_OS:*:*) + echo powerpc-harris-powermax + exit ;; + Night_Hawk:Power_UNIX:*:*) + echo powerpc-harris-powerunix + exit ;; + m88k:CX/UX:7*:*) + echo m88k-harris-cxux7 + exit ;; + m88k:*:4*:R4*) + echo m88k-motorola-sysv4 + exit ;; + m88k:*:3*:R3*) + echo m88k-motorola-sysv3 + exit ;; + AViiON:dgux:*:*) + # DG/UX returns AViiON for all architectures + UNAME_PROCESSOR=`/usr/bin/uname -p` + if [ "$UNAME_PROCESSOR" = mc88100 ] || [ "$UNAME_PROCESSOR" = mc88110 ] + then + if [ "$TARGET_BINARY_INTERFACE"x = m88kdguxelfx ] || \ + [ "$TARGET_BINARY_INTERFACE"x = x ] + then + echo m88k-dg-dgux"$UNAME_RELEASE" + else + echo m88k-dg-dguxbcs"$UNAME_RELEASE" + fi + else + echo i586-dg-dgux"$UNAME_RELEASE" + fi + exit ;; + M88*:DolphinOS:*:*) # DolphinOS (SVR3) + echo m88k-dolphin-sysv3 + exit ;; + M88*:*:R3*:*) + # Delta 88k system running SVR3 + echo m88k-motorola-sysv3 + exit ;; + XD88*:*:*:*) # Tektronix XD88 system running UTekV (SVR3) + echo m88k-tektronix-sysv3 + exit ;; + Tek43[0-9][0-9]:UTek:*:*) # Tektronix 4300 system running UTek (BSD) + echo m68k-tektronix-bsd + exit ;; + *:IRIX*:*:*) + echo mips-sgi-irix"`echo "$UNAME_RELEASE"|sed -e 's/-/_/g'`" + exit ;; + ????????:AIX?:[12].1:2) # AIX 2.2.1 or AIX 2.1.1 is RT/PC AIX. + echo romp-ibm-aix # uname -m gives an 8 hex-code CPU id + exit ;; # Note that: echo "'`uname -s`'" gives 'AIX ' + i*86:AIX:*:*) + echo i386-ibm-aix + exit ;; + ia64:AIX:*:*) + if [ -x /usr/bin/oslevel ] ; then + IBM_REV=`/usr/bin/oslevel` + else + IBM_REV="$UNAME_VERSION.$UNAME_RELEASE" + fi + echo "$UNAME_MACHINE"-ibm-aix"$IBM_REV" + exit ;; + *:AIX:2:3) + if grep bos325 /usr/include/stdio.h >/dev/null 2>&1; then + eval "$set_cc_for_build" + sed 's/^ //' << EOF > "$dummy.c" + #include + + main() + { + if (!__power_pc()) + exit(1); + puts("powerpc-ibm-aix3.2.5"); + exit(0); + } +EOF + if $CC_FOR_BUILD -o "$dummy" "$dummy.c" && SYSTEM_NAME=`"$dummy"` + then + echo "$SYSTEM_NAME" + else + echo rs6000-ibm-aix3.2.5 + fi + elif grep bos324 /usr/include/stdio.h >/dev/null 2>&1; then + echo rs6000-ibm-aix3.2.4 + else + echo rs6000-ibm-aix3.2 + fi + exit ;; + *:AIX:*:[4567]) + IBM_CPU_ID=`/usr/sbin/lsdev -C -c processor -S available | sed 1q | awk '{ print $1 }'` + if /usr/sbin/lsattr -El "$IBM_CPU_ID" | grep ' POWER' >/dev/null 2>&1; then + IBM_ARCH=rs6000 + else + IBM_ARCH=powerpc + fi + if [ -x /usr/bin/lslpp ] ; then + IBM_REV=`/usr/bin/lslpp -Lqc bos.rte.libc | + awk -F: '{ print $3 }' | sed s/[0-9]*$/0/` + else + IBM_REV="$UNAME_VERSION.$UNAME_RELEASE" + fi + echo "$IBM_ARCH"-ibm-aix"$IBM_REV" + exit ;; + *:AIX:*:*) + echo rs6000-ibm-aix + exit ;; + ibmrt:4.4BSD:*|romp-ibm:4.4BSD:*) + echo romp-ibm-bsd4.4 + exit ;; + ibmrt:*BSD:*|romp-ibm:BSD:*) # covers RT/PC BSD and + echo romp-ibm-bsd"$UNAME_RELEASE" # 4.3 with uname added to + exit ;; # report: romp-ibm BSD 4.3 + *:BOSX:*:*) + echo rs6000-bull-bosx + exit ;; + DPX/2?00:B.O.S.:*:*) + echo m68k-bull-sysv3 + exit ;; + 9000/[34]??:4.3bsd:1.*:*) + echo m68k-hp-bsd + exit ;; + hp300:4.4BSD:*:* | 9000/[34]??:4.3bsd:2.*:*) + echo m68k-hp-bsd4.4 + exit ;; + 9000/[34678]??:HP-UX:*:*) + HPUX_REV=`echo "$UNAME_RELEASE"|sed -e 's/[^.]*.[0B]*//'` + case "$UNAME_MACHINE" in + 9000/31?) HP_ARCH=m68000 ;; + 9000/[34]??) HP_ARCH=m68k ;; + 9000/[678][0-9][0-9]) + if [ -x /usr/bin/getconf ]; then + sc_cpu_version=`/usr/bin/getconf SC_CPU_VERSION 2>/dev/null` + sc_kernel_bits=`/usr/bin/getconf SC_KERNEL_BITS 2>/dev/null` + case "$sc_cpu_version" in + 523) HP_ARCH=hppa1.0 ;; # CPU_PA_RISC1_0 + 528) HP_ARCH=hppa1.1 ;; # CPU_PA_RISC1_1 + 532) # CPU_PA_RISC2_0 + case "$sc_kernel_bits" in + 32) HP_ARCH=hppa2.0n ;; + 64) HP_ARCH=hppa2.0w ;; + '') HP_ARCH=hppa2.0 ;; # HP-UX 10.20 + esac ;; + esac + fi + if [ "$HP_ARCH" = "" ]; then + eval "$set_cc_for_build" + sed 's/^ //' << EOF > "$dummy.c" + + #define _HPUX_SOURCE + #include + #include + + int main () + { + #if defined(_SC_KERNEL_BITS) + long bits = sysconf(_SC_KERNEL_BITS); + #endif + long cpu = sysconf (_SC_CPU_VERSION); + + switch (cpu) + { + case CPU_PA_RISC1_0: puts ("hppa1.0"); break; + case CPU_PA_RISC1_1: puts ("hppa1.1"); break; + case CPU_PA_RISC2_0: + #if defined(_SC_KERNEL_BITS) + switch (bits) + { + case 64: puts ("hppa2.0w"); break; + case 32: puts ("hppa2.0n"); break; + default: puts ("hppa2.0"); break; + } break; + #else /* !defined(_SC_KERNEL_BITS) */ + puts ("hppa2.0"); break; + #endif + default: puts ("hppa1.0"); break; + } + exit (0); + } +EOF + (CCOPTS="" $CC_FOR_BUILD -o "$dummy" "$dummy.c" 2>/dev/null) && HP_ARCH=`"$dummy"` + test -z "$HP_ARCH" && HP_ARCH=hppa + fi ;; + esac + if [ "$HP_ARCH" = hppa2.0w ] + then + eval "$set_cc_for_build" + + # hppa2.0w-hp-hpux* has a 64-bit kernel and a compiler generating + # 32-bit code. hppa64-hp-hpux* has the same kernel and a compiler + # generating 64-bit code. GNU and HP use different nomenclature: + # + # $ CC_FOR_BUILD=cc ./config.guess + # => hppa2.0w-hp-hpux11.23 + # $ CC_FOR_BUILD="cc +DA2.0w" ./config.guess + # => hppa64-hp-hpux11.23 + + if echo __LP64__ | (CCOPTS="" $CC_FOR_BUILD -E - 2>/dev/null) | + grep -q __LP64__ + then + HP_ARCH=hppa2.0w + else + HP_ARCH=hppa64 + fi + fi + echo "$HP_ARCH"-hp-hpux"$HPUX_REV" + exit ;; + ia64:HP-UX:*:*) + HPUX_REV=`echo "$UNAME_RELEASE"|sed -e 's/[^.]*.[0B]*//'` + echo ia64-hp-hpux"$HPUX_REV" + exit ;; + 3050*:HI-UX:*:*) + eval "$set_cc_for_build" + sed 's/^ //' << EOF > "$dummy.c" + #include + int + main () + { + long cpu = sysconf (_SC_CPU_VERSION); + /* The order matters, because CPU_IS_HP_MC68K erroneously returns + true for CPU_PA_RISC1_0. CPU_IS_PA_RISC returns correct + results, however. */ + if (CPU_IS_PA_RISC (cpu)) + { + switch (cpu) + { + case CPU_PA_RISC1_0: puts ("hppa1.0-hitachi-hiuxwe2"); break; + case CPU_PA_RISC1_1: puts ("hppa1.1-hitachi-hiuxwe2"); break; + case CPU_PA_RISC2_0: puts ("hppa2.0-hitachi-hiuxwe2"); break; + default: puts ("hppa-hitachi-hiuxwe2"); break; + } + } + else if (CPU_IS_HP_MC68K (cpu)) + puts ("m68k-hitachi-hiuxwe2"); + else puts ("unknown-hitachi-hiuxwe2"); + exit (0); + } +EOF + $CC_FOR_BUILD -o "$dummy" "$dummy.c" && SYSTEM_NAME=`"$dummy"` && + { echo "$SYSTEM_NAME"; exit; } + echo unknown-hitachi-hiuxwe2 + exit ;; + 9000/7??:4.3bsd:*:* | 9000/8?[79]:4.3bsd:*:*) + echo hppa1.1-hp-bsd + exit ;; + 9000/8??:4.3bsd:*:*) + echo hppa1.0-hp-bsd + exit ;; + *9??*:MPE/iX:*:* | *3000*:MPE/iX:*:*) + echo hppa1.0-hp-mpeix + exit ;; + hp7??:OSF1:*:* | hp8?[79]:OSF1:*:*) + echo hppa1.1-hp-osf + exit ;; + hp8??:OSF1:*:*) + echo hppa1.0-hp-osf + exit ;; + i*86:OSF1:*:*) + if [ -x /usr/sbin/sysversion ] ; then + echo "$UNAME_MACHINE"-unknown-osf1mk + else + echo "$UNAME_MACHINE"-unknown-osf1 + fi + exit ;; + parisc*:Lites*:*:*) + echo hppa1.1-hp-lites + exit ;; + C1*:ConvexOS:*:* | convex:ConvexOS:C1*:*) + echo c1-convex-bsd + exit ;; + C2*:ConvexOS:*:* | convex:ConvexOS:C2*:*) + if getsysinfo -f scalar_acc + then echo c32-convex-bsd + else echo c2-convex-bsd + fi + exit ;; + C34*:ConvexOS:*:* | convex:ConvexOS:C34*:*) + echo c34-convex-bsd + exit ;; + C38*:ConvexOS:*:* | convex:ConvexOS:C38*:*) + echo c38-convex-bsd + exit ;; + C4*:ConvexOS:*:* | convex:ConvexOS:C4*:*) + echo c4-convex-bsd + exit ;; + CRAY*Y-MP:*:*:*) + echo ymp-cray-unicos"$UNAME_RELEASE" | sed -e 's/\.[^.]*$/.X/' + exit ;; + CRAY*[A-Z]90:*:*:*) + echo "$UNAME_MACHINE"-cray-unicos"$UNAME_RELEASE" \ + | sed -e 's/CRAY.*\([A-Z]90\)/\1/' \ + -e y/ABCDEFGHIJKLMNOPQRSTUVWXYZ/abcdefghijklmnopqrstuvwxyz/ \ + -e 's/\.[^.]*$/.X/' + exit ;; + CRAY*TS:*:*:*) + echo t90-cray-unicos"$UNAME_RELEASE" | sed -e 's/\.[^.]*$/.X/' + exit ;; + CRAY*T3E:*:*:*) + echo alphaev5-cray-unicosmk"$UNAME_RELEASE" | sed -e 's/\.[^.]*$/.X/' + exit ;; + CRAY*SV1:*:*:*) + echo sv1-cray-unicos"$UNAME_RELEASE" | sed -e 's/\.[^.]*$/.X/' + exit ;; + *:UNICOS/mp:*:*) + echo craynv-cray-unicosmp"$UNAME_RELEASE" | sed -e 's/\.[^.]*$/.X/' + exit ;; + F30[01]:UNIX_System_V:*:* | F700:UNIX_System_V:*:*) + FUJITSU_PROC=`uname -m | tr ABCDEFGHIJKLMNOPQRSTUVWXYZ abcdefghijklmnopqrstuvwxyz` + FUJITSU_SYS=`uname -p | tr ABCDEFGHIJKLMNOPQRSTUVWXYZ abcdefghijklmnopqrstuvwxyz | sed -e 's/\///'` + FUJITSU_REL=`echo "$UNAME_RELEASE" | sed -e 's/ /_/'` + echo "${FUJITSU_PROC}-fujitsu-${FUJITSU_SYS}${FUJITSU_REL}" + exit ;; + 5000:UNIX_System_V:4.*:*) + FUJITSU_SYS=`uname -p | tr ABCDEFGHIJKLMNOPQRSTUVWXYZ abcdefghijklmnopqrstuvwxyz | sed -e 's/\///'` + FUJITSU_REL=`echo "$UNAME_RELEASE" | tr ABCDEFGHIJKLMNOPQRSTUVWXYZ abcdefghijklmnopqrstuvwxyz | sed -e 's/ /_/'` + echo "sparc-fujitsu-${FUJITSU_SYS}${FUJITSU_REL}" + exit ;; + i*86:BSD/386:*:* | i*86:BSD/OS:*:* | *:Ascend\ Embedded/OS:*:*) + echo "$UNAME_MACHINE"-pc-bsdi"$UNAME_RELEASE" + exit ;; + sparc*:BSD/OS:*:*) + echo sparc-unknown-bsdi"$UNAME_RELEASE" + exit ;; + *:BSD/OS:*:*) + echo "$UNAME_MACHINE"-unknown-bsdi"$UNAME_RELEASE" + exit ;; + *:FreeBSD:*:*) + UNAME_PROCESSOR=`/usr/bin/uname -p` + case "$UNAME_PROCESSOR" in + amd64) + UNAME_PROCESSOR=x86_64 ;; + i386) + UNAME_PROCESSOR=i586 ;; + esac + echo "$UNAME_PROCESSOR"-unknown-freebsd"`echo "$UNAME_RELEASE"|sed -e 's/[-(].*//'`" + exit ;; + i*:CYGWIN*:*) + echo "$UNAME_MACHINE"-pc-cygwin + exit ;; + *:MINGW64*:*) + echo "$UNAME_MACHINE"-pc-mingw64 + exit ;; + *:MINGW*:*) + echo "$UNAME_MACHINE"-pc-mingw32 + exit ;; + *:MSYS*:*) + echo "$UNAME_MACHINE"-pc-msys + exit ;; + i*:PW*:*) + echo "$UNAME_MACHINE"-pc-pw32 + exit ;; + *:Interix*:*) + case "$UNAME_MACHINE" in + x86) + echo i586-pc-interix"$UNAME_RELEASE" + exit ;; + authenticamd | genuineintel | EM64T) + echo x86_64-unknown-interix"$UNAME_RELEASE" + exit ;; + IA64) + echo ia64-unknown-interix"$UNAME_RELEASE" + exit ;; + esac ;; + i*:UWIN*:*) + echo "$UNAME_MACHINE"-pc-uwin + exit ;; + amd64:CYGWIN*:*:* | x86_64:CYGWIN*:*:*) + echo x86_64-unknown-cygwin + exit ;; + prep*:SunOS:5.*:*) + echo powerpcle-unknown-solaris2"`echo "$UNAME_RELEASE"|sed -e 's/[^.]*//'`" + exit ;; + *:GNU:*:*) + # the GNU system + echo "`echo "$UNAME_MACHINE"|sed -e 's,[-/].*$,,'`-unknown-$LIBC`echo "$UNAME_RELEASE"|sed -e 's,/.*$,,'`" + exit ;; + *:GNU/*:*:*) + # other systems with GNU libc and userland + echo "$UNAME_MACHINE-unknown-`echo "$UNAME_SYSTEM" | sed 's,^[^/]*/,,' | tr "[:upper:]" "[:lower:]"``echo "$UNAME_RELEASE"|sed -e 's/[-(].*//'`-$LIBC" + exit ;; + i*86:Minix:*:*) + echo "$UNAME_MACHINE"-pc-minix + exit ;; + aarch64:Linux:*:*) + echo "$UNAME_MACHINE"-unknown-linux-"$LIBC" + exit ;; + aarch64_be:Linux:*:*) + UNAME_MACHINE=aarch64_be + echo "$UNAME_MACHINE"-unknown-linux-"$LIBC" + exit ;; + alpha:Linux:*:*) + case `sed -n '/^cpu model/s/^.*: \(.*\)/\1/p' < /proc/cpuinfo` in + EV5) UNAME_MACHINE=alphaev5 ;; + EV56) UNAME_MACHINE=alphaev56 ;; + PCA56) UNAME_MACHINE=alphapca56 ;; + PCA57) UNAME_MACHINE=alphapca56 ;; + EV6) UNAME_MACHINE=alphaev6 ;; + EV67) UNAME_MACHINE=alphaev67 ;; + EV68*) UNAME_MACHINE=alphaev68 ;; + esac + objdump --private-headers /bin/sh | grep -q ld.so.1 + if test "$?" = 0 ; then LIBC=gnulibc1 ; fi + echo "$UNAME_MACHINE"-unknown-linux-"$LIBC" + exit ;; + arc:Linux:*:* | arceb:Linux:*:*) + echo "$UNAME_MACHINE"-unknown-linux-"$LIBC" + exit ;; + arm*:Linux:*:*) + eval "$set_cc_for_build" + if echo __ARM_EABI__ | $CC_FOR_BUILD -E - 2>/dev/null \ + | grep -q __ARM_EABI__ + then + echo "$UNAME_MACHINE"-unknown-linux-"$LIBC" + else + if echo __ARM_PCS_VFP | $CC_FOR_BUILD -E - 2>/dev/null \ + | grep -q __ARM_PCS_VFP + then + echo "$UNAME_MACHINE"-unknown-linux-"$LIBC"eabi + else + echo "$UNAME_MACHINE"-unknown-linux-"$LIBC"eabihf + fi + fi + exit ;; + avr32*:Linux:*:*) + echo "$UNAME_MACHINE"-unknown-linux-"$LIBC" + exit ;; + cris:Linux:*:*) + echo "$UNAME_MACHINE"-axis-linux-"$LIBC" + exit ;; + crisv32:Linux:*:*) + echo "$UNAME_MACHINE"-axis-linux-"$LIBC" + exit ;; + e2k:Linux:*:*) + echo "$UNAME_MACHINE"-unknown-linux-"$LIBC" + exit ;; + frv:Linux:*:*) + echo "$UNAME_MACHINE"-unknown-linux-"$LIBC" + exit ;; + hexagon:Linux:*:*) + echo "$UNAME_MACHINE"-unknown-linux-"$LIBC" + exit ;; + i*86:Linux:*:*) + echo "$UNAME_MACHINE"-pc-linux-"$LIBC" + exit ;; + ia64:Linux:*:*) + echo "$UNAME_MACHINE"-unknown-linux-"$LIBC" + exit ;; + k1om:Linux:*:*) + echo "$UNAME_MACHINE"-unknown-linux-"$LIBC" + exit ;; + m32r*:Linux:*:*) + echo "$UNAME_MACHINE"-unknown-linux-"$LIBC" + exit ;; + m68*:Linux:*:*) + echo "$UNAME_MACHINE"-unknown-linux-"$LIBC" + exit ;; + mips:Linux:*:* | mips64:Linux:*:*) + eval "$set_cc_for_build" + sed 's/^ //' << EOF > "$dummy.c" + #undef CPU + #undef ${UNAME_MACHINE} + #undef ${UNAME_MACHINE}el + #if defined(__MIPSEL__) || defined(__MIPSEL) || defined(_MIPSEL) || defined(MIPSEL) + CPU=${UNAME_MACHINE}el + #else + #if defined(__MIPSEB__) || defined(__MIPSEB) || defined(_MIPSEB) || defined(MIPSEB) + CPU=${UNAME_MACHINE} + #else + CPU= + #endif + #endif +EOF + eval "`$CC_FOR_BUILD -E "$dummy.c" 2>/dev/null | grep '^CPU'`" + test "x$CPU" != x && { echo "$CPU-unknown-linux-$LIBC"; exit; } + ;; + mips64el:Linux:*:*) + echo "$UNAME_MACHINE"-unknown-linux-"$LIBC" + exit ;; + openrisc*:Linux:*:*) + echo or1k-unknown-linux-"$LIBC" + exit ;; + or32:Linux:*:* | or1k*:Linux:*:*) + echo "$UNAME_MACHINE"-unknown-linux-"$LIBC" + exit ;; + padre:Linux:*:*) + echo sparc-unknown-linux-"$LIBC" + exit ;; + parisc64:Linux:*:* | hppa64:Linux:*:*) + echo hppa64-unknown-linux-"$LIBC" + exit ;; + parisc:Linux:*:* | hppa:Linux:*:*) + # Look for CPU level + case `grep '^cpu[^a-z]*:' /proc/cpuinfo 2>/dev/null | cut -d' ' -f2` in + PA7*) echo hppa1.1-unknown-linux-"$LIBC" ;; + PA8*) echo hppa2.0-unknown-linux-"$LIBC" ;; + *) echo hppa-unknown-linux-"$LIBC" ;; + esac + exit ;; + ppc64:Linux:*:*) + echo powerpc64-unknown-linux-"$LIBC" + exit ;; + ppc:Linux:*:*) + echo powerpc-unknown-linux-"$LIBC" + exit ;; + ppc64le:Linux:*:*) + echo powerpc64le-unknown-linux-"$LIBC" + exit ;; + ppcle:Linux:*:*) + echo powerpcle-unknown-linux-"$LIBC" + exit ;; + riscv32:Linux:*:* | riscv64:Linux:*:*) + echo "$UNAME_MACHINE"-unknown-linux-"$LIBC" + exit ;; + s390:Linux:*:* | s390x:Linux:*:*) + echo "$UNAME_MACHINE"-ibm-linux-"$LIBC" + exit ;; + sh64*:Linux:*:*) + echo "$UNAME_MACHINE"-unknown-linux-"$LIBC" + exit ;; + sh*:Linux:*:*) + echo "$UNAME_MACHINE"-unknown-linux-"$LIBC" + exit ;; + sparc:Linux:*:* | sparc64:Linux:*:*) + echo "$UNAME_MACHINE"-unknown-linux-"$LIBC" + exit ;; + tile*:Linux:*:*) + echo "$UNAME_MACHINE"-unknown-linux-"$LIBC" + exit ;; + vax:Linux:*:*) + echo "$UNAME_MACHINE"-dec-linux-"$LIBC" + exit ;; + x86_64:Linux:*:*) + if objdump -f /bin/sh | grep -q elf32-x86-64; then + echo "$UNAME_MACHINE"-pc-linux-"$LIBC"x32 + else + echo "$UNAME_MACHINE"-pc-linux-"$LIBC" + fi + exit ;; + xtensa*:Linux:*:*) + echo "$UNAME_MACHINE"-unknown-linux-"$LIBC" + exit ;; + i*86:DYNIX/ptx:4*:*) + # ptx 4.0 does uname -s correctly, with DYNIX/ptx in there. + # earlier versions are messed up and put the nodename in both + # sysname and nodename. + echo i386-sequent-sysv4 + exit ;; + i*86:UNIX_SV:4.2MP:2.*) + # Unixware is an offshoot of SVR4, but it has its own version + # number series starting with 2... + # I am not positive that other SVR4 systems won't match this, + # I just have to hope. -- rms. + # Use sysv4.2uw... so that sysv4* matches it. + echo "$UNAME_MACHINE"-pc-sysv4.2uw"$UNAME_VERSION" + exit ;; + i*86:OS/2:*:*) + # If we were able to find `uname', then EMX Unix compatibility + # is probably installed. + echo "$UNAME_MACHINE"-pc-os2-emx + exit ;; + i*86:XTS-300:*:STOP) + echo "$UNAME_MACHINE"-unknown-stop + exit ;; + i*86:atheos:*:*) + echo "$UNAME_MACHINE"-unknown-atheos + exit ;; + i*86:syllable:*:*) + echo "$UNAME_MACHINE"-pc-syllable + exit ;; + i*86:LynxOS:2.*:* | i*86:LynxOS:3.[01]*:* | i*86:LynxOS:4.[02]*:*) + echo i386-unknown-lynxos"$UNAME_RELEASE" + exit ;; + i*86:*DOS:*:*) + echo "$UNAME_MACHINE"-pc-msdosdjgpp + exit ;; + i*86:*:4.*:*) + UNAME_REL=`echo "$UNAME_RELEASE" | sed 's/\/MP$//'` + if grep Novell /usr/include/link.h >/dev/null 2>/dev/null; then + echo "$UNAME_MACHINE"-univel-sysv"$UNAME_REL" + else + echo "$UNAME_MACHINE"-pc-sysv"$UNAME_REL" + fi + exit ;; + i*86:*:5:[678]*) + # UnixWare 7.x, OpenUNIX and OpenServer 6. + case `/bin/uname -X | grep "^Machine"` in + *486*) UNAME_MACHINE=i486 ;; + *Pentium) UNAME_MACHINE=i586 ;; + *Pent*|*Celeron) UNAME_MACHINE=i686 ;; + esac + echo "$UNAME_MACHINE-unknown-sysv${UNAME_RELEASE}${UNAME_SYSTEM}{$UNAME_VERSION}" + exit ;; + i*86:*:3.2:*) + if test -f /usr/options/cb.name; then + UNAME_REL=`sed -n 's/.*Version //p' /dev/null >/dev/null ; then + UNAME_REL=`(/bin/uname -X|grep Release|sed -e 's/.*= //')` + (/bin/uname -X|grep i80486 >/dev/null) && UNAME_MACHINE=i486 + (/bin/uname -X|grep '^Machine.*Pentium' >/dev/null) \ + && UNAME_MACHINE=i586 + (/bin/uname -X|grep '^Machine.*Pent *II' >/dev/null) \ + && UNAME_MACHINE=i686 + (/bin/uname -X|grep '^Machine.*Pentium Pro' >/dev/null) \ + && UNAME_MACHINE=i686 + echo "$UNAME_MACHINE"-pc-sco"$UNAME_REL" + else + echo "$UNAME_MACHINE"-pc-sysv32 + fi + exit ;; + pc:*:*:*) + # Left here for compatibility: + # uname -m prints for DJGPP always 'pc', but it prints nothing about + # the processor, so we play safe by assuming i586. + # Note: whatever this is, it MUST be the same as what config.sub + # prints for the "djgpp" host, or else GDB configure will decide that + # this is a cross-build. + echo i586-pc-msdosdjgpp + exit ;; + Intel:Mach:3*:*) + echo i386-pc-mach3 + exit ;; + paragon:*:*:*) + echo i860-intel-osf1 + exit ;; + i860:*:4.*:*) # i860-SVR4 + if grep Stardent /usr/include/sys/uadmin.h >/dev/null 2>&1 ; then + echo i860-stardent-sysv"$UNAME_RELEASE" # Stardent Vistra i860-SVR4 + else # Add other i860-SVR4 vendors below as they are discovered. + echo i860-unknown-sysv"$UNAME_RELEASE" # Unknown i860-SVR4 + fi + exit ;; + mini*:CTIX:SYS*5:*) + # "miniframe" + echo m68010-convergent-sysv + exit ;; + mc68k:UNIX:SYSTEM5:3.51m) + echo m68k-convergent-sysv + exit ;; + M680?0:D-NIX:5.3:*) + echo m68k-diab-dnix + exit ;; + M68*:*:R3V[5678]*:*) + test -r /sysV68 && { echo 'm68k-motorola-sysv'; exit; } ;; + 3[345]??:*:4.0:3.0 | 3[34]??A:*:4.0:3.0 | 3[34]??,*:*:4.0:3.0 | 3[34]??/*:*:4.0:3.0 | 4400:*:4.0:3.0 | 4850:*:4.0:3.0 | SKA40:*:4.0:3.0 | SDS2:*:4.0:3.0 | SHG2:*:4.0:3.0 | S7501*:*:4.0:3.0) + OS_REL='' + test -r /etc/.relid \ + && OS_REL=.`sed -n 's/[^ ]* [^ ]* \([0-9][0-9]\).*/\1/p' < /etc/.relid` + /bin/uname -p 2>/dev/null | grep 86 >/dev/null \ + && { echo i486-ncr-sysv4.3"$OS_REL"; exit; } + /bin/uname -p 2>/dev/null | /bin/grep entium >/dev/null \ + && { echo i586-ncr-sysv4.3"$OS_REL"; exit; } ;; + 3[34]??:*:4.0:* | 3[34]??,*:*:4.0:*) + /bin/uname -p 2>/dev/null | grep 86 >/dev/null \ + && { echo i486-ncr-sysv4; exit; } ;; + NCR*:*:4.2:* | MPRAS*:*:4.2:*) + OS_REL='.3' + test -r /etc/.relid \ + && OS_REL=.`sed -n 's/[^ ]* [^ ]* \([0-9][0-9]\).*/\1/p' < /etc/.relid` + /bin/uname -p 2>/dev/null | grep 86 >/dev/null \ + && { echo i486-ncr-sysv4.3"$OS_REL"; exit; } + /bin/uname -p 2>/dev/null | /bin/grep entium >/dev/null \ + && { echo i586-ncr-sysv4.3"$OS_REL"; exit; } + /bin/uname -p 2>/dev/null | /bin/grep pteron >/dev/null \ + && { echo i586-ncr-sysv4.3"$OS_REL"; exit; } ;; + m68*:LynxOS:2.*:* | m68*:LynxOS:3.0*:*) + echo m68k-unknown-lynxos"$UNAME_RELEASE" + exit ;; + mc68030:UNIX_System_V:4.*:*) + echo m68k-atari-sysv4 + exit ;; + TSUNAMI:LynxOS:2.*:*) + echo sparc-unknown-lynxos"$UNAME_RELEASE" + exit ;; + rs6000:LynxOS:2.*:*) + echo rs6000-unknown-lynxos"$UNAME_RELEASE" + exit ;; + PowerPC:LynxOS:2.*:* | PowerPC:LynxOS:3.[01]*:* | PowerPC:LynxOS:4.[02]*:*) + echo powerpc-unknown-lynxos"$UNAME_RELEASE" + exit ;; + SM[BE]S:UNIX_SV:*:*) + echo mips-dde-sysv"$UNAME_RELEASE" + exit ;; + RM*:ReliantUNIX-*:*:*) + echo mips-sni-sysv4 + exit ;; + RM*:SINIX-*:*:*) + echo mips-sni-sysv4 + exit ;; + *:SINIX-*:*:*) + if uname -p 2>/dev/null >/dev/null ; then + UNAME_MACHINE=`(uname -p) 2>/dev/null` + echo "$UNAME_MACHINE"-sni-sysv4 + else + echo ns32k-sni-sysv + fi + exit ;; + PENTIUM:*:4.0*:*) # Unisys `ClearPath HMP IX 4000' SVR4/MP effort + # says + echo i586-unisys-sysv4 + exit ;; + *:UNIX_System_V:4*:FTX*) + # From Gerald Hewes . + # How about differentiating between stratus architectures? -djm + echo hppa1.1-stratus-sysv4 + exit ;; + *:*:*:FTX*) + # From seanf@swdc.stratus.com. + echo i860-stratus-sysv4 + exit ;; + i*86:VOS:*:*) + # From Paul.Green@stratus.com. + echo "$UNAME_MACHINE"-stratus-vos + exit ;; + *:VOS:*:*) + # From Paul.Green@stratus.com. + echo hppa1.1-stratus-vos + exit ;; + mc68*:A/UX:*:*) + echo m68k-apple-aux"$UNAME_RELEASE" + exit ;; + news*:NEWS-OS:6*:*) + echo mips-sony-newsos6 + exit ;; + R[34]000:*System_V*:*:* | R4000:UNIX_SYSV:*:* | R*000:UNIX_SV:*:*) + if [ -d /usr/nec ]; then + echo mips-nec-sysv"$UNAME_RELEASE" + else + echo mips-unknown-sysv"$UNAME_RELEASE" + fi + exit ;; + BeBox:BeOS:*:*) # BeOS running on hardware made by Be, PPC only. + echo powerpc-be-beos + exit ;; + BeMac:BeOS:*:*) # BeOS running on Mac or Mac clone, PPC only. + echo powerpc-apple-beos + exit ;; + BePC:BeOS:*:*) # BeOS running on Intel PC compatible. + echo i586-pc-beos + exit ;; + BePC:Haiku:*:*) # Haiku running on Intel PC compatible. + echo i586-pc-haiku + exit ;; + x86_64:Haiku:*:*) + echo x86_64-unknown-haiku + exit ;; + SX-4:SUPER-UX:*:*) + echo sx4-nec-superux"$UNAME_RELEASE" + exit ;; + SX-5:SUPER-UX:*:*) + echo sx5-nec-superux"$UNAME_RELEASE" + exit ;; + SX-6:SUPER-UX:*:*) + echo sx6-nec-superux"$UNAME_RELEASE" + exit ;; + SX-7:SUPER-UX:*:*) + echo sx7-nec-superux"$UNAME_RELEASE" + exit ;; + SX-8:SUPER-UX:*:*) + echo sx8-nec-superux"$UNAME_RELEASE" + exit ;; + SX-8R:SUPER-UX:*:*) + echo sx8r-nec-superux"$UNAME_RELEASE" + exit ;; + SX-ACE:SUPER-UX:*:*) + echo sxace-nec-superux"$UNAME_RELEASE" + exit ;; + Power*:Rhapsody:*:*) + echo powerpc-apple-rhapsody"$UNAME_RELEASE" + exit ;; + *:Rhapsody:*:*) + echo "$UNAME_MACHINE"-apple-rhapsody"$UNAME_RELEASE" + exit ;; + *:Darwin:*:*) + UNAME_PROCESSOR=`uname -p` || UNAME_PROCESSOR=unknown + eval "$set_cc_for_build" + if test "$UNAME_PROCESSOR" = unknown ; then + UNAME_PROCESSOR=powerpc + fi + if test "`echo "$UNAME_RELEASE" | sed -e 's/\..*//'`" -le 10 ; then + if [ "$CC_FOR_BUILD" != no_compiler_found ]; then + if (echo '#ifdef __LP64__'; echo IS_64BIT_ARCH; echo '#endif') | \ + (CCOPTS="" $CC_FOR_BUILD -E - 2>/dev/null) | \ + grep IS_64BIT_ARCH >/dev/null + then + case $UNAME_PROCESSOR in + i386) UNAME_PROCESSOR=x86_64 ;; + powerpc) UNAME_PROCESSOR=powerpc64 ;; + esac + fi + # On 10.4-10.6 one might compile for PowerPC via gcc -arch ppc + if (echo '#ifdef __POWERPC__'; echo IS_PPC; echo '#endif') | \ + (CCOPTS="" $CC_FOR_BUILD -E - 2>/dev/null) | \ + grep IS_PPC >/dev/null + then + UNAME_PROCESSOR=powerpc + fi + fi + elif test "$UNAME_PROCESSOR" = i386 ; then + # Avoid executing cc on OS X 10.9, as it ships with a stub + # that puts up a graphical alert prompting to install + # developer tools. Any system running Mac OS X 10.7 or + # later (Darwin 11 and later) is required to have a 64-bit + # processor. This is not true of the ARM version of Darwin + # that Apple uses in portable devices. + UNAME_PROCESSOR=x86_64 + fi + echo "$UNAME_PROCESSOR"-apple-darwin"$UNAME_RELEASE" + exit ;; + *:procnto*:*:* | *:QNX:[0123456789]*:*) + UNAME_PROCESSOR=`uname -p` + if test "$UNAME_PROCESSOR" = x86; then + UNAME_PROCESSOR=i386 + UNAME_MACHINE=pc + fi + echo "$UNAME_PROCESSOR"-"$UNAME_MACHINE"-nto-qnx"$UNAME_RELEASE" + exit ;; + *:QNX:*:4*) + echo i386-pc-qnx + exit ;; + NEO-*:NONSTOP_KERNEL:*:*) + echo neo-tandem-nsk"$UNAME_RELEASE" + exit ;; + NSE-*:NONSTOP_KERNEL:*:*) + echo nse-tandem-nsk"$UNAME_RELEASE" + exit ;; + NSR-*:NONSTOP_KERNEL:*:*) + echo nsr-tandem-nsk"$UNAME_RELEASE" + exit ;; + NSV-*:NONSTOP_KERNEL:*:*) + echo nsv-tandem-nsk"$UNAME_RELEASE" + exit ;; + NSX-*:NONSTOP_KERNEL:*:*) + echo nsx-tandem-nsk"$UNAME_RELEASE" + exit ;; + *:NonStop-UX:*:*) + echo mips-compaq-nonstopux + exit ;; + BS2000:POSIX*:*:*) + echo bs2000-siemens-sysv + exit ;; + DS/*:UNIX_System_V:*:*) + echo "$UNAME_MACHINE"-"$UNAME_SYSTEM"-"$UNAME_RELEASE" + exit ;; + *:Plan9:*:*) + # "uname -m" is not consistent, so use $cputype instead. 386 + # is converted to i386 for consistency with other x86 + # operating systems. + if test "$cputype" = 386; then + UNAME_MACHINE=i386 + else + UNAME_MACHINE="$cputype" + fi + echo "$UNAME_MACHINE"-unknown-plan9 + exit ;; + *:TOPS-10:*:*) + echo pdp10-unknown-tops10 + exit ;; + *:TENEX:*:*) + echo pdp10-unknown-tenex + exit ;; + KS10:TOPS-20:*:* | KL10:TOPS-20:*:* | TYPE4:TOPS-20:*:*) + echo pdp10-dec-tops20 + exit ;; + XKL-1:TOPS-20:*:* | TYPE5:TOPS-20:*:*) + echo pdp10-xkl-tops20 + exit ;; + *:TOPS-20:*:*) + echo pdp10-unknown-tops20 + exit ;; + *:ITS:*:*) + echo pdp10-unknown-its + exit ;; + SEI:*:*:SEIUX) + echo mips-sei-seiux"$UNAME_RELEASE" + exit ;; + *:DragonFly:*:*) + echo "$UNAME_MACHINE"-unknown-dragonfly"`echo "$UNAME_RELEASE"|sed -e 's/[-(].*//'`" + exit ;; + *:*VMS:*:*) + UNAME_MACHINE=`(uname -p) 2>/dev/null` + case "$UNAME_MACHINE" in + A*) echo alpha-dec-vms ; exit ;; + I*) echo ia64-dec-vms ; exit ;; + V*) echo vax-dec-vms ; exit ;; + esac ;; + *:XENIX:*:SysV) + echo i386-pc-xenix + exit ;; + i*86:skyos:*:*) + echo "$UNAME_MACHINE"-pc-skyos"`echo "$UNAME_RELEASE" | sed -e 's/ .*$//'`" + exit ;; + i*86:rdos:*:*) + echo "$UNAME_MACHINE"-pc-rdos + exit ;; + i*86:AROS:*:*) + echo "$UNAME_MACHINE"-pc-aros + exit ;; + x86_64:VMkernel:*:*) + echo "$UNAME_MACHINE"-unknown-esx + exit ;; + amd64:Isilon\ OneFS:*:*) + echo x86_64-unknown-onefs + exit ;; +esac + +echo "$0: unable to guess system type" >&2 + +case "$UNAME_MACHINE:$UNAME_SYSTEM" in + mips:Linux | mips64:Linux) + # If we got here on MIPS GNU/Linux, output extra information. + cat >&2 <&2 </dev/null || echo unknown` +uname -r = `(uname -r) 2>/dev/null || echo unknown` +uname -s = `(uname -s) 2>/dev/null || echo unknown` +uname -v = `(uname -v) 2>/dev/null || echo unknown` + +/usr/bin/uname -p = `(/usr/bin/uname -p) 2>/dev/null` +/bin/uname -X = `(/bin/uname -X) 2>/dev/null` + +hostinfo = `(hostinfo) 2>/dev/null` +/bin/universe = `(/bin/universe) 2>/dev/null` +/usr/bin/arch -k = `(/usr/bin/arch -k) 2>/dev/null` +/bin/arch = `(/bin/arch) 2>/dev/null` +/usr/bin/oslevel = `(/usr/bin/oslevel) 2>/dev/null` +/usr/convex/getsysinfo = `(/usr/convex/getsysinfo) 2>/dev/null` + +UNAME_MACHINE = "$UNAME_MACHINE" +UNAME_RELEASE = "$UNAME_RELEASE" +UNAME_SYSTEM = "$UNAME_SYSTEM" +UNAME_VERSION = "$UNAME_VERSION" +EOF + +exit 1 + +# Local variables: +# eval: (add-hook 'write-file-functions 'time-stamp) +# time-stamp-start: "timestamp='" +# time-stamp-format: "%:y-%02m-%02d" +# time-stamp-end: "'" +# End: diff --git a/config.rpath b/config.rpath new file mode 100755 index 0000000..c547c68 --- /dev/null +++ b/config.rpath @@ -0,0 +1,666 @@ +#! /bin/sh +# Output a system dependent set of variables, describing how to set the +# run time search path of shared libraries in an executable. +# +# Copyright 1996-2007 Free Software Foundation, Inc. +# Taken from GNU libtool, 2001 +# Originally by Gordon Matzigkeit , 1996 +# +# This file is free software; the Free Software Foundation gives +# unlimited permission to copy and/or distribute it, with or without +# modifications, as long as this notice is preserved. +# +# The first argument passed to this file is the canonical host specification, +# CPU_TYPE-MANUFACTURER-OPERATING_SYSTEM +# or +# CPU_TYPE-MANUFACTURER-KERNEL-OPERATING_SYSTEM +# The environment variables CC, GCC, LDFLAGS, LD, with_gnu_ld +# should be set by the caller. +# +# The set of defined variables is at the end of this script. + +# Known limitations: +# - On IRIX 6.5 with CC="cc", the run time search patch must not be longer +# than 256 bytes, otherwise the compiler driver will dump core. The only +# known workaround is to choose shorter directory names for the build +# directory and/or the installation directory. + +# All known linkers require a `.a' archive for static linking (except MSVC, +# which needs '.lib'). +libext=a +shrext=.so + +host="$1" +host_cpu=`echo "$host" | sed 's/^\([^-]*\)-\([^-]*\)-\(.*\)$/\1/'` +host_vendor=`echo "$host" | sed 's/^\([^-]*\)-\([^-]*\)-\(.*\)$/\2/'` +host_os=`echo "$host" | sed 's/^\([^-]*\)-\([^-]*\)-\(.*\)$/\3/'` + +# Code taken from libtool.m4's _LT_CC_BASENAME. + +for cc_temp in $CC""; do + case $cc_temp in + compile | *[\\/]compile | ccache | *[\\/]ccache ) ;; + distcc | *[\\/]distcc | purify | *[\\/]purify ) ;; + \-*) ;; + *) break;; + esac +done +cc_basename=`echo "$cc_temp" | sed -e 's%^.*/%%'` + +# Code taken from libtool.m4's AC_LIBTOOL_PROG_COMPILER_PIC. + +wl= +if test "$GCC" = yes; then + wl='-Wl,' +else + case "$host_os" in + aix*) + wl='-Wl,' + ;; + darwin*) + case $cc_basename in + xlc*) + wl='-Wl,' + ;; + esac + ;; + mingw* | cygwin* | pw32* | os2*) + ;; + hpux9* | hpux10* | hpux11*) + wl='-Wl,' + ;; + irix5* | irix6* | nonstopux*) + wl='-Wl,' + ;; + newsos6) + ;; + linux* | k*bsd*-gnu) + case $cc_basename in + icc* | ecc*) + wl='-Wl,' + ;; + pgcc | pgf77 | pgf90) + wl='-Wl,' + ;; + ccc*) + wl='-Wl,' + ;; + como) + wl='-lopt=' + ;; + *) + case `$CC -V 2>&1 | sed 5q` in + *Sun\ C*) + wl='-Wl,' + ;; + esac + ;; + esac + ;; + osf3* | osf4* | osf5*) + wl='-Wl,' + ;; + rdos*) + ;; + solaris*) + wl='-Wl,' + ;; + sunos4*) + wl='-Qoption ld ' + ;; + sysv4 | sysv4.2uw2* | sysv4.3*) + wl='-Wl,' + ;; + sysv4*MP*) + ;; + sysv5* | unixware* | sco3.2v5* | sco5v6* | OpenUNIX*) + wl='-Wl,' + ;; + unicos*) + wl='-Wl,' + ;; + uts4*) + ;; + esac +fi + +# Code taken from libtool.m4's AC_LIBTOOL_PROG_LD_SHLIBS. + +hardcode_libdir_flag_spec= +hardcode_libdir_separator= +hardcode_direct=no +hardcode_minus_L=no + +case "$host_os" in + cygwin* | mingw* | pw32*) + # FIXME: the MSVC++ port hasn't been tested in a loooong time + # When not using gcc, we currently assume that we are using + # Microsoft Visual C++. + if test "$GCC" != yes; then + with_gnu_ld=no + fi + ;; + interix*) + # we just hope/assume this is gcc and not c89 (= MSVC++) + with_gnu_ld=yes + ;; + openbsd*) + with_gnu_ld=no + ;; +esac + +ld_shlibs=yes +if test "$with_gnu_ld" = yes; then + # Set some defaults for GNU ld with shared library support. These + # are reset later if shared libraries are not supported. Putting them + # here allows them to be overridden if necessary. + # Unlike libtool, we use -rpath here, not --rpath, since the documented + # option of GNU ld is called -rpath, not --rpath. + hardcode_libdir_flag_spec='${wl}-rpath ${wl}$libdir' + case "$host_os" in + aix3* | aix4* | aix5*) + # On AIX/PPC, the GNU linker is very broken + if test "$host_cpu" != ia64; then + ld_shlibs=no + fi + ;; + amigaos*) + hardcode_libdir_flag_spec='-L$libdir' + hardcode_minus_L=yes + # Samuel A. Falvo II reports + # that the semantics of dynamic libraries on AmigaOS, at least up + # to version 4, is to share data among multiple programs linked + # with the same dynamic library. Since this doesn't match the + # behavior of shared libraries on other platforms, we cannot use + # them. + ld_shlibs=no + ;; + beos*) + if $LD --help 2>&1 | grep ': supported targets:.* elf' > /dev/null; then + : + else + ld_shlibs=no + fi + ;; + cygwin* | mingw* | pw32*) + # hardcode_libdir_flag_spec is actually meaningless, as there is + # no search path for DLLs. + hardcode_libdir_flag_spec='-L$libdir' + if $LD --help 2>&1 | grep 'auto-import' > /dev/null; then + : + else + ld_shlibs=no + fi + ;; + interix[3-9]*) + hardcode_direct=no + hardcode_libdir_flag_spec='${wl}-rpath,$libdir' + ;; + gnu* | linux* | k*bsd*-gnu) + if $LD --help 2>&1 | grep ': supported targets:.* elf' > /dev/null; then + : + else + ld_shlibs=no + fi + ;; + netbsd*) + ;; + solaris*) + if $LD -v 2>&1 | grep 'BFD 2\.8' > /dev/null; then + ld_shlibs=no + elif $LD --help 2>&1 | grep ': supported targets:.* elf' > /dev/null; then + : + else + ld_shlibs=no + fi + ;; + sysv5* | sco3.2v5* | sco5v6* | unixware* | OpenUNIX*) + case `$LD -v 2>&1` in + *\ [01].* | *\ 2.[0-9].* | *\ 2.1[0-5].*) + ld_shlibs=no + ;; + *) + if $LD --help 2>&1 | grep ': supported targets:.* elf' > /dev/null; then + hardcode_libdir_flag_spec='`test -z "$SCOABSPATH" && echo ${wl}-rpath,$libdir`' + else + ld_shlibs=no + fi + ;; + esac + ;; + sunos4*) + hardcode_direct=yes + ;; + *) + if $LD --help 2>&1 | grep ': supported targets:.* elf' > /dev/null; then + : + else + ld_shlibs=no + fi + ;; + esac + if test "$ld_shlibs" = no; then + hardcode_libdir_flag_spec= + fi +else + case "$host_os" in + aix3*) + # Note: this linker hardcodes the directories in LIBPATH if there + # are no directories specified by -L. + hardcode_minus_L=yes + if test "$GCC" = yes; then + # Neither direct hardcoding nor static linking is supported with a + # broken collect2. + hardcode_direct=unsupported + fi + ;; + aix4* | aix5*) + if test "$host_cpu" = ia64; then + # On IA64, the linker does run time linking by default, so we don't + # have to do anything special. + aix_use_runtimelinking=no + else + aix_use_runtimelinking=no + # Test if we are trying to use run time linking or normal + # AIX style linking. If -brtl is somewhere in LDFLAGS, we + # need to do runtime linking. + case $host_os in aix4.[23]|aix4.[23].*|aix5*) + for ld_flag in $LDFLAGS; do + if (test $ld_flag = "-brtl" || test $ld_flag = "-Wl,-brtl"); then + aix_use_runtimelinking=yes + break + fi + done + ;; + esac + fi + hardcode_direct=yes + hardcode_libdir_separator=':' + if test "$GCC" = yes; then + case $host_os in aix4.[012]|aix4.[012].*) + collect2name=`${CC} -print-prog-name=collect2` + if test -f "$collect2name" && \ + strings "$collect2name" | grep resolve_lib_name >/dev/null + then + # We have reworked collect2 + : + else + # We have old collect2 + hardcode_direct=unsupported + hardcode_minus_L=yes + hardcode_libdir_flag_spec='-L$libdir' + hardcode_libdir_separator= + fi + ;; + esac + fi + # Begin _LT_AC_SYS_LIBPATH_AIX. + echo 'int main () { return 0; }' > conftest.c + ${CC} ${LDFLAGS} conftest.c -o conftest + aix_libpath=`dump -H conftest 2>/dev/null | sed -n -e '/Import File Strings/,/^$/ { /^0/ { s/^0 *\(.*\)$/\1/; p; } +}'` + if test -z "$aix_libpath"; then + aix_libpath=`dump -HX64 conftest 2>/dev/null | sed -n -e '/Import File Strings/,/^$/ { /^0/ { s/^0 *\(.*\)$/\1/; p; } +}'` + fi + if test -z "$aix_libpath"; then + aix_libpath="/usr/lib:/lib" + fi + rm -f conftest.c conftest + # End _LT_AC_SYS_LIBPATH_AIX. + if test "$aix_use_runtimelinking" = yes; then + hardcode_libdir_flag_spec='${wl}-blibpath:$libdir:'"$aix_libpath" + else + if test "$host_cpu" = ia64; then + hardcode_libdir_flag_spec='${wl}-R $libdir:/usr/lib:/lib' + else + hardcode_libdir_flag_spec='${wl}-blibpath:$libdir:'"$aix_libpath" + fi + fi + ;; + amigaos*) + hardcode_libdir_flag_spec='-L$libdir' + hardcode_minus_L=yes + # see comment about different semantics on the GNU ld section + ld_shlibs=no + ;; + bsdi[45]*) + ;; + cygwin* | mingw* | pw32*) + # When not using gcc, we currently assume that we are using + # Microsoft Visual C++. + # hardcode_libdir_flag_spec is actually meaningless, as there is + # no search path for DLLs. + hardcode_libdir_flag_spec=' ' + libext=lib + ;; + darwin* | rhapsody*) + hardcode_direct=no + if test "$GCC" = yes ; then + : + else + case $cc_basename in + xlc*) + ;; + *) + ld_shlibs=no + ;; + esac + fi + ;; + dgux*) + hardcode_libdir_flag_spec='-L$libdir' + ;; + freebsd1*) + ld_shlibs=no + ;; + freebsd2.2*) + hardcode_libdir_flag_spec='-R$libdir' + hardcode_direct=yes + ;; + freebsd2*) + hardcode_direct=yes + hardcode_minus_L=yes + ;; + freebsd* | dragonfly*) + hardcode_libdir_flag_spec='-R$libdir' + hardcode_direct=yes + ;; + hpux9*) + hardcode_libdir_flag_spec='${wl}+b ${wl}$libdir' + hardcode_libdir_separator=: + hardcode_direct=yes + # hardcode_minus_L: Not really in the search PATH, + # but as the default location of the library. + hardcode_minus_L=yes + ;; + hpux10*) + if test "$with_gnu_ld" = no; then + hardcode_libdir_flag_spec='${wl}+b ${wl}$libdir' + hardcode_libdir_separator=: + hardcode_direct=yes + # hardcode_minus_L: Not really in the search PATH, + # but as the default location of the library. + hardcode_minus_L=yes + fi + ;; + hpux11*) + if test "$with_gnu_ld" = no; then + hardcode_libdir_flag_spec='${wl}+b ${wl}$libdir' + hardcode_libdir_separator=: + case $host_cpu in + hppa*64*|ia64*) + hardcode_direct=no + ;; + *) + hardcode_direct=yes + # hardcode_minus_L: Not really in the search PATH, + # but as the default location of the library. + hardcode_minus_L=yes + ;; + esac + fi + ;; + irix5* | irix6* | nonstopux*) + hardcode_libdir_flag_spec='${wl}-rpath ${wl}$libdir' + hardcode_libdir_separator=: + ;; + netbsd*) + hardcode_libdir_flag_spec='-R$libdir' + hardcode_direct=yes + ;; + newsos6) + hardcode_direct=yes + hardcode_libdir_flag_spec='${wl}-rpath ${wl}$libdir' + hardcode_libdir_separator=: + ;; + openbsd*) + if test -f /usr/libexec/ld.so; then + hardcode_direct=yes + if test -z "`echo __ELF__ | $CC -E - | grep __ELF__`" || test "$host_os-$host_cpu" = "openbsd2.8-powerpc"; then + hardcode_libdir_flag_spec='${wl}-rpath,$libdir' + else + case "$host_os" in + openbsd[01].* | openbsd2.[0-7] | openbsd2.[0-7].*) + hardcode_libdir_flag_spec='-R$libdir' + ;; + *) + hardcode_libdir_flag_spec='${wl}-rpath,$libdir' + ;; + esac + fi + else + ld_shlibs=no + fi + ;; + os2*) + hardcode_libdir_flag_spec='-L$libdir' + hardcode_minus_L=yes + ;; + osf3*) + hardcode_libdir_flag_spec='${wl}-rpath ${wl}$libdir' + hardcode_libdir_separator=: + ;; + osf4* | osf5*) + if test "$GCC" = yes; then + hardcode_libdir_flag_spec='${wl}-rpath ${wl}$libdir' + else + # Both cc and cxx compiler support -rpath directly + hardcode_libdir_flag_spec='-rpath $libdir' + fi + hardcode_libdir_separator=: + ;; + solaris*) + hardcode_libdir_flag_spec='-R$libdir' + ;; + sunos4*) + hardcode_libdir_flag_spec='-L$libdir' + hardcode_direct=yes + hardcode_minus_L=yes + ;; + sysv4) + case $host_vendor in + sni) + hardcode_direct=yes # is this really true??? + ;; + siemens) + hardcode_direct=no + ;; + motorola) + hardcode_direct=no #Motorola manual says yes, but my tests say they lie + ;; + esac + ;; + sysv4.3*) + ;; + sysv4*MP*) + if test -d /usr/nec; then + ld_shlibs=yes + fi + ;; + sysv4*uw2* | sysv5OpenUNIX* | sysv5UnixWare7.[01].[10]* | unixware7* | sco3.2v5.0.[024]*) + ;; + sysv5* | sco3.2v5* | sco5v6*) + hardcode_libdir_flag_spec='`test -z "$SCOABSPATH" && echo ${wl}-R,$libdir`' + hardcode_libdir_separator=':' + ;; + uts4*) + hardcode_libdir_flag_spec='-L$libdir' + ;; + *) + ld_shlibs=no + ;; + esac +fi + +# Check dynamic linker characteristics +# Code taken from libtool.m4's AC_LIBTOOL_SYS_DYNAMIC_LINKER. +# Unlike libtool.m4, here we don't care about _all_ names of the library, but +# only about the one the linker finds when passed -lNAME. This is the last +# element of library_names_spec in libtool.m4, or possibly two of them if the +# linker has special search rules. +library_names_spec= # the last element of library_names_spec in libtool.m4 +libname_spec='lib$name' +case "$host_os" in + aix3*) + library_names_spec='$libname.a' + ;; + aix4* | aix5*) + library_names_spec='$libname$shrext' + ;; + amigaos*) + library_names_spec='$libname.a' + ;; + beos*) + library_names_spec='$libname$shrext' + ;; + bsdi[45]*) + library_names_spec='$libname$shrext' + ;; + cygwin* | mingw* | pw32*) + shrext=.dll + library_names_spec='$libname.dll.a $libname.lib' + ;; + darwin* | rhapsody*) + shrext=.dylib + library_names_spec='$libname$shrext' + ;; + dgux*) + library_names_spec='$libname$shrext' + ;; + freebsd1*) + ;; + freebsd* | dragonfly*) + case "$host_os" in + freebsd[123]*) + library_names_spec='$libname$shrext$versuffix' ;; + *) + library_names_spec='$libname$shrext' ;; + esac + ;; + gnu*) + library_names_spec='$libname$shrext' + ;; + hpux9* | hpux10* | hpux11*) + case $host_cpu in + ia64*) + shrext=.so + ;; + hppa*64*) + shrext=.sl + ;; + *) + shrext=.sl + ;; + esac + library_names_spec='$libname$shrext' + ;; + interix[3-9]*) + library_names_spec='$libname$shrext' + ;; + irix5* | irix6* | nonstopux*) + library_names_spec='$libname$shrext' + case "$host_os" in + irix5* | nonstopux*) + libsuff= shlibsuff= + ;; + *) + case $LD in + *-32|*"-32 "|*-melf32bsmip|*"-melf32bsmip ") libsuff= shlibsuff= ;; + *-n32|*"-n32 "|*-melf32bmipn32|*"-melf32bmipn32 ") libsuff=32 shlibsuff=N32 ;; + *-64|*"-64 "|*-melf64bmip|*"-melf64bmip ") libsuff=64 shlibsuff=64 ;; + *) libsuff= shlibsuff= ;; + esac + ;; + esac + ;; + linux*oldld* | linux*aout* | linux*coff*) + ;; + linux* | k*bsd*-gnu) + library_names_spec='$libname$shrext' + ;; + knetbsd*-gnu) + library_names_spec='$libname$shrext' + ;; + netbsd*) + library_names_spec='$libname$shrext' + ;; + newsos6) + library_names_spec='$libname$shrext' + ;; + nto-qnx*) + library_names_spec='$libname$shrext' + ;; + openbsd*) + library_names_spec='$libname$shrext$versuffix' + ;; + os2*) + libname_spec='$name' + shrext=.dll + library_names_spec='$libname.a' + ;; + osf3* | osf4* | osf5*) + library_names_spec='$libname$shrext' + ;; + rdos*) + ;; + solaris*) + library_names_spec='$libname$shrext' + ;; + sunos4*) + library_names_spec='$libname$shrext$versuffix' + ;; + sysv4 | sysv4.3*) + library_names_spec='$libname$shrext' + ;; + sysv4*MP*) + library_names_spec='$libname$shrext' + ;; + sysv5* | sco3.2v5* | sco5v6* | unixware* | OpenUNIX* | sysv4*uw2*) + library_names_spec='$libname$shrext' + ;; + uts4*) + library_names_spec='$libname$shrext' + ;; +esac + +sed_quote_subst='s/\(["`$\\]\)/\\\1/g' +escaped_wl=`echo "X$wl" | sed -e 's/^X//' -e "$sed_quote_subst"` +shlibext=`echo "$shrext" | sed -e 's,^\.,,'` +escaped_libname_spec=`echo "X$libname_spec" | sed -e 's/^X//' -e "$sed_quote_subst"` +escaped_library_names_spec=`echo "X$library_names_spec" | sed -e 's/^X//' -e "$sed_quote_subst"` +escaped_hardcode_libdir_flag_spec=`echo "X$hardcode_libdir_flag_spec" | sed -e 's/^X//' -e "$sed_quote_subst"` + +LC_ALL=C sed -e 's/^\([a-zA-Z0-9_]*\)=/acl_cv_\1=/' <. +# +# As a special exception to the GNU General Public License, if you +# distribute this file as part of a program that contains a +# configuration script generated by Autoconf, you may include it under +# the same distribution terms that you use for the rest of that +# program. This Exception is an additional permission under section 7 +# of the GNU General Public License, version 3 ("GPLv3"). + + +# Please send patches to . +# +# Configuration subroutine to validate and canonicalize a configuration type. +# Supply the specified configuration type as an argument. +# If it is invalid, we print an error message on stderr and exit with code 1. +# Otherwise, we print the canonical config type on stdout and succeed. + +# You can get the latest version of this script from: +# https://git.savannah.gnu.org/gitweb/?p=config.git;a=blob_plain;f=config.sub + +# This file is supposed to be the same for all GNU packages +# and recognize all the CPU types, system types and aliases +# that are meaningful with *any* GNU software. +# Each package is responsible for reporting which valid configurations +# it does not support. The user should be able to distinguish +# a failure to support a valid configuration from a meaningless +# configuration. + +# The goal of this file is to map all the various variations of a given +# machine specification into a single specification in the form: +# CPU_TYPE-MANUFACTURER-OPERATING_SYSTEM +# or in some cases, the newer four-part form: +# CPU_TYPE-MANUFACTURER-KERNEL-OPERATING_SYSTEM +# It is wrong to echo any other type of specification. + +me=`echo "$0" | sed -e 's,.*/,,'` + +usage="\ +Usage: $0 [OPTION] CPU-MFR-OPSYS or ALIAS + +Canonicalize a configuration name. + +Options: + -h, --help print this help, then exit + -t, --time-stamp print date of last modification, then exit + -v, --version print version number, then exit + +Report bugs and patches to ." + +version="\ +GNU config.sub ($timestamp) + +Copyright 1992-2018 Free Software Foundation, Inc. + +This is free software; see the source for copying conditions. There is NO +warranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE." + +help=" +Try \`$me --help' for more information." + +# Parse command line +while test $# -gt 0 ; do + case $1 in + --time-stamp | --time* | -t ) + echo "$timestamp" ; exit ;; + --version | -v ) + echo "$version" ; exit ;; + --help | --h* | -h ) + echo "$usage"; exit ;; + -- ) # Stop option processing + shift; break ;; + - ) # Use stdin as input. + break ;; + -* ) + echo "$me: invalid option $1$help" + exit 1 ;; + + *local*) + # First pass through any local machine types. + echo "$1" + exit ;; + + * ) + break ;; + esac +done + +case $# in + 0) echo "$me: missing argument$help" >&2 + exit 1;; + 1) ;; + *) echo "$me: too many arguments$help" >&2 + exit 1;; +esac + +# Separate what the user gave into CPU-COMPANY and OS or KERNEL-OS (if any). +# Here we must recognize all the valid KERNEL-OS combinations. +maybe_os=`echo "$1" | sed 's/^\(.*\)-\([^-]*-[^-]*\)$/\2/'` +case $maybe_os in + nto-qnx* | linux-gnu* | linux-android* | linux-dietlibc | linux-newlib* | \ + linux-musl* | linux-uclibc* | uclinux-uclibc* | uclinux-gnu* | kfreebsd*-gnu* | \ + knetbsd*-gnu* | netbsd*-gnu* | netbsd*-eabi* | \ + kopensolaris*-gnu* | cloudabi*-eabi* | \ + storm-chaos* | os2-emx* | rtmk-nova*) + os=-$maybe_os + basic_machine=`echo "$1" | sed 's/^\(.*\)-\([^-]*-[^-]*\)$/\1/'` + ;; + android-linux) + os=-linux-android + basic_machine=`echo "$1" | sed 's/^\(.*\)-\([^-]*-[^-]*\)$/\1/'`-unknown + ;; + *) + basic_machine=`echo "$1" | sed 's/-[^-]*$//'` + if [ "$basic_machine" != "$1" ] + then os=`echo "$1" | sed 's/.*-/-/'` + else os=; fi + ;; +esac + +### Let's recognize common machines as not being operating systems so +### that things like config.sub decstation-3100 work. We also +### recognize some manufacturers as not being operating systems, so we +### can provide default operating systems below. +case $os in + -sun*os*) + # Prevent following clause from handling this invalid input. + ;; + -dec* | -mips* | -sequent* | -encore* | -pc532* | -sgi* | -sony* | \ + -att* | -7300* | -3300* | -delta* | -motorola* | -sun[234]* | \ + -unicom* | -ibm* | -next | -hp | -isi* | -apollo | -altos* | \ + -convergent* | -ncr* | -news | -32* | -3600* | -3100* | -hitachi* |\ + -c[123]* | -convex* | -sun | -crds | -omron* | -dg | -ultra | -tti* | \ + -harris | -dolphin | -highlevel | -gould | -cbm | -ns | -masscomp | \ + -apple | -axis | -knuth | -cray | -microblaze*) + os= + basic_machine=$1 + ;; + -bluegene*) + os=-cnk + ;; + -sim | -cisco | -oki | -wec | -winbond) + os= + basic_machine=$1 + ;; + -scout) + ;; + -wrs) + os=-vxworks + basic_machine=$1 + ;; + -chorusos*) + os=-chorusos + basic_machine=$1 + ;; + -chorusrdb) + os=-chorusrdb + basic_machine=$1 + ;; + -hiux*) + os=-hiuxwe2 + ;; + -sco6) + os=-sco5v6 + basic_machine=`echo "$1" | sed -e 's/86-.*/86-pc/'` + ;; + -sco5) + os=-sco3.2v5 + basic_machine=`echo "$1" | sed -e 's/86-.*/86-pc/'` + ;; + -sco4) + os=-sco3.2v4 + basic_machine=`echo "$1" | sed -e 's/86-.*/86-pc/'` + ;; + -sco3.2.[4-9]*) + os=`echo $os | sed -e 's/sco3.2./sco3.2v/'` + basic_machine=`echo "$1" | sed -e 's/86-.*/86-pc/'` + ;; + -sco3.2v[4-9]*) + # Don't forget version if it is 3.2v4 or newer. + basic_machine=`echo "$1" | sed -e 's/86-.*/86-pc/'` + ;; + -sco5v6*) + # Don't forget version if it is 3.2v4 or newer. + basic_machine=`echo "$1" | sed -e 's/86-.*/86-pc/'` + ;; + -sco*) + os=-sco3.2v2 + basic_machine=`echo "$1" | sed -e 's/86-.*/86-pc/'` + ;; + -udk*) + basic_machine=`echo "$1" | sed -e 's/86-.*/86-pc/'` + ;; + -isc) + os=-isc2.2 + basic_machine=`echo "$1" | sed -e 's/86-.*/86-pc/'` + ;; + -clix*) + basic_machine=clipper-intergraph + ;; + -isc*) + basic_machine=`echo "$1" | sed -e 's/86-.*/86-pc/'` + ;; + -lynx*178) + os=-lynxos178 + ;; + -lynx*5) + os=-lynxos5 + ;; + -lynx*) + os=-lynxos + ;; + -ptx*) + basic_machine=`echo "$1" | sed -e 's/86-.*/86-sequent/'` + ;; + -psos*) + os=-psos + ;; + -mint | -mint[0-9]*) + basic_machine=m68k-atari + os=-mint + ;; +esac + +# Decode aliases for certain CPU-COMPANY combinations. +case $basic_machine in + # Recognize the basic CPU types without company name. + # Some are omitted here because they have special meanings below. + 1750a | 580 \ + | a29k \ + | aarch64 | aarch64_be \ + | alpha | alphaev[4-8] | alphaev56 | alphaev6[78] | alphapca5[67] \ + | alpha64 | alpha64ev[4-8] | alpha64ev56 | alpha64ev6[78] | alpha64pca5[67] \ + | am33_2.0 \ + | arc | arceb \ + | arm | arm[bl]e | arme[lb] | armv[2-8] | armv[3-8][lb] | armv7[arm] \ + | avr | avr32 \ + | ba \ + | be32 | be64 \ + | bfin \ + | c4x | c8051 | clipper \ + | d10v | d30v | dlx | dsp16xx \ + | e2k | epiphany \ + | fido | fr30 | frv | ft32 \ + | h8300 | h8500 | hppa | hppa1.[01] | hppa2.0 | hppa2.0[nw] | hppa64 \ + | hexagon \ + | i370 | i860 | i960 | ia16 | ia64 \ + | ip2k | iq2000 \ + | k1om \ + | le32 | le64 \ + | lm32 \ + | m32c | m32r | m32rle | m68000 | m68k | m88k \ + | maxq | mb | microblaze | microblazeel | mcore | mep | metag \ + | mips | mipsbe | mipseb | mipsel | mipsle \ + | mips16 \ + | mips64 | mips64el \ + | mips64octeon | mips64octeonel \ + | mips64orion | mips64orionel \ + | mips64r5900 | mips64r5900el \ + | mips64vr | mips64vrel \ + | mips64vr4100 | mips64vr4100el \ + | mips64vr4300 | mips64vr4300el \ + | mips64vr5000 | mips64vr5000el \ + | mips64vr5900 | mips64vr5900el \ + | mipsisa32 | mipsisa32el \ + | mipsisa32r2 | mipsisa32r2el \ + | mipsisa32r6 | mipsisa32r6el \ + | mipsisa64 | mipsisa64el \ + | mipsisa64r2 | mipsisa64r2el \ + | mipsisa64r6 | mipsisa64r6el \ + | mipsisa64sb1 | mipsisa64sb1el \ + | mipsisa64sr71k | mipsisa64sr71kel \ + | mipsr5900 | mipsr5900el \ + | mipstx39 | mipstx39el \ + | mn10200 | mn10300 \ + | moxie \ + | mt \ + | msp430 \ + | nds32 | nds32le | nds32be \ + | nios | nios2 | nios2eb | nios2el \ + | ns16k | ns32k \ + | open8 | or1k | or1knd | or32 \ + | pdp10 | pj | pjl \ + | powerpc | powerpc64 | powerpc64le | powerpcle \ + | pru \ + | pyramid \ + | riscv32 | riscv64 \ + | rl78 | rx \ + | score \ + | sh | sh[1234] | sh[24]a | sh[24]aeb | sh[23]e | sh[234]eb | sheb | shbe | shle | sh[1234]le | sh3ele \ + | sh64 | sh64le \ + | sparc | sparc64 | sparc64b | sparc64v | sparc86x | sparclet | sparclite \ + | sparcv8 | sparcv9 | sparcv9b | sparcv9v \ + | spu \ + | tahoe | tic4x | tic54x | tic55x | tic6x | tic80 | tron \ + | ubicom32 \ + | v850 | v850e | v850e1 | v850e2 | v850es | v850e2v3 \ + | visium \ + | wasm32 \ + | x86 | xc16x | xstormy16 | xtensa \ + | z8k | z80) + basic_machine=$basic_machine-unknown + ;; + c54x) + basic_machine=tic54x-unknown + ;; + c55x) + basic_machine=tic55x-unknown + ;; + c6x) + basic_machine=tic6x-unknown + ;; + leon|leon[3-9]) + basic_machine=sparc-$basic_machine + ;; + m6811 | m68hc11 | m6812 | m68hc12 | m68hcs12x | nvptx | picochip) + basic_machine=$basic_machine-unknown + os=-none + ;; + m88110 | m680[12346]0 | m683?2 | m68360 | m5200 | v70 | w65) + ;; + ms1) + basic_machine=mt-unknown + ;; + + strongarm | thumb | xscale) + basic_machine=arm-unknown + ;; + xgate) + basic_machine=$basic_machine-unknown + os=-none + ;; + xscaleeb) + basic_machine=armeb-unknown + ;; + + xscaleel) + basic_machine=armel-unknown + ;; + + # We use `pc' rather than `unknown' + # because (1) that's what they normally are, and + # (2) the word "unknown" tends to confuse beginning users. + i*86 | x86_64) + basic_machine=$basic_machine-pc + ;; + # Object if more than one company name word. + *-*-*) + echo Invalid configuration \`"$1"\': machine \`"$basic_machine"\' not recognized 1>&2 + exit 1 + ;; + # Recognize the basic CPU types with company name. + 580-* \ + | a29k-* \ + | aarch64-* | aarch64_be-* \ + | alpha-* | alphaev[4-8]-* | alphaev56-* | alphaev6[78]-* \ + | alpha64-* | alpha64ev[4-8]-* | alpha64ev56-* | alpha64ev6[78]-* \ + | alphapca5[67]-* | alpha64pca5[67]-* | arc-* | arceb-* \ + | arm-* | armbe-* | armle-* | armeb-* | armv*-* \ + | avr-* | avr32-* \ + | ba-* \ + | be32-* | be64-* \ + | bfin-* | bs2000-* \ + | c[123]* | c30-* | [cjt]90-* | c4x-* \ + | c8051-* | clipper-* | craynv-* | cydra-* \ + | d10v-* | d30v-* | dlx-* \ + | e2k-* | elxsi-* \ + | f30[01]-* | f700-* | fido-* | fr30-* | frv-* | fx80-* \ + | h8300-* | h8500-* \ + | hppa-* | hppa1.[01]-* | hppa2.0-* | hppa2.0[nw]-* | hppa64-* \ + | hexagon-* \ + | i*86-* | i860-* | i960-* | ia16-* | ia64-* \ + | ip2k-* | iq2000-* \ + | k1om-* \ + | le32-* | le64-* \ + | lm32-* \ + | m32c-* | m32r-* | m32rle-* \ + | m68000-* | m680[012346]0-* | m68360-* | m683?2-* | m68k-* \ + | m88110-* | m88k-* | maxq-* | mcore-* | metag-* \ + | microblaze-* | microblazeel-* \ + | mips-* | mipsbe-* | mipseb-* | mipsel-* | mipsle-* \ + | mips16-* \ + | mips64-* | mips64el-* \ + | mips64octeon-* | mips64octeonel-* \ + | mips64orion-* | mips64orionel-* \ + | mips64r5900-* | mips64r5900el-* \ + | mips64vr-* | mips64vrel-* \ + | mips64vr4100-* | mips64vr4100el-* \ + | mips64vr4300-* | mips64vr4300el-* \ + | mips64vr5000-* | mips64vr5000el-* \ + | mips64vr5900-* | mips64vr5900el-* \ + | mipsisa32-* | mipsisa32el-* \ + | mipsisa32r2-* | mipsisa32r2el-* \ + | mipsisa32r6-* | mipsisa32r6el-* \ + | mipsisa64-* | mipsisa64el-* \ + | mipsisa64r2-* | mipsisa64r2el-* \ + | mipsisa64r6-* | mipsisa64r6el-* \ + | mipsisa64sb1-* | mipsisa64sb1el-* \ + | mipsisa64sr71k-* | mipsisa64sr71kel-* \ + | mipsr5900-* | mipsr5900el-* \ + | mipstx39-* | mipstx39el-* \ + | mmix-* \ + | mt-* \ + | msp430-* \ + | nds32-* | nds32le-* | nds32be-* \ + | nios-* | nios2-* | nios2eb-* | nios2el-* \ + | none-* | np1-* | ns16k-* | ns32k-* \ + | open8-* \ + | or1k*-* \ + | orion-* \ + | pdp10-* | pdp11-* | pj-* | pjl-* | pn-* | power-* \ + | powerpc-* | powerpc64-* | powerpc64le-* | powerpcle-* \ + | pru-* \ + | pyramid-* \ + | riscv32-* | riscv64-* \ + | rl78-* | romp-* | rs6000-* | rx-* \ + | sh-* | sh[1234]-* | sh[24]a-* | sh[24]aeb-* | sh[23]e-* | sh[34]eb-* | sheb-* | shbe-* \ + | shle-* | sh[1234]le-* | sh3ele-* | sh64-* | sh64le-* \ + | sparc-* | sparc64-* | sparc64b-* | sparc64v-* | sparc86x-* | sparclet-* \ + | sparclite-* \ + | sparcv8-* | sparcv9-* | sparcv9b-* | sparcv9v-* | sv1-* | sx*-* \ + | tahoe-* \ + | tic30-* | tic4x-* | tic54x-* | tic55x-* | tic6x-* | tic80-* \ + | tile*-* \ + | tron-* \ + | ubicom32-* \ + | v850-* | v850e-* | v850e1-* | v850es-* | v850e2-* | v850e2v3-* \ + | vax-* \ + | visium-* \ + | wasm32-* \ + | we32k-* \ + | x86-* | x86_64-* | xc16x-* | xps100-* \ + | xstormy16-* | xtensa*-* \ + | ymp-* \ + | z8k-* | z80-*) + ;; + # Recognize the basic CPU types without company name, with glob match. + xtensa*) + basic_machine=$basic_machine-unknown + ;; + # Recognize the various machine names and aliases which stand + # for a CPU type and a company and sometimes even an OS. + 386bsd) + basic_machine=i386-pc + os=-bsd + ;; + 3b1 | 7300 | 7300-att | att-7300 | pc7300 | safari | unixpc) + basic_machine=m68000-att + ;; + 3b*) + basic_machine=we32k-att + ;; + a29khif) + basic_machine=a29k-amd + os=-udi + ;; + abacus) + basic_machine=abacus-unknown + ;; + adobe68k) + basic_machine=m68010-adobe + os=-scout + ;; + alliant | fx80) + basic_machine=fx80-alliant + ;; + altos | altos3068) + basic_machine=m68k-altos + ;; + am29k) + basic_machine=a29k-none + os=-bsd + ;; + amd64) + basic_machine=x86_64-pc + ;; + amd64-*) + basic_machine=x86_64-`echo "$basic_machine" | sed 's/^[^-]*-//'` + ;; + amdahl) + basic_machine=580-amdahl + os=-sysv + ;; + amiga | amiga-*) + basic_machine=m68k-unknown + ;; + amigaos | amigados) + basic_machine=m68k-unknown + os=-amigaos + ;; + amigaunix | amix) + basic_machine=m68k-unknown + os=-sysv4 + ;; + apollo68) + basic_machine=m68k-apollo + os=-sysv + ;; + apollo68bsd) + basic_machine=m68k-apollo + os=-bsd + ;; + aros) + basic_machine=i386-pc + os=-aros + ;; + asmjs) + basic_machine=asmjs-unknown + ;; + aux) + basic_machine=m68k-apple + os=-aux + ;; + balance) + basic_machine=ns32k-sequent + os=-dynix + ;; + blackfin) + basic_machine=bfin-unknown + os=-linux + ;; + blackfin-*) + basic_machine=bfin-`echo "$basic_machine" | sed 's/^[^-]*-//'` + os=-linux + ;; + bluegene*) + basic_machine=powerpc-ibm + os=-cnk + ;; + c54x-*) + basic_machine=tic54x-`echo "$basic_machine" | sed 's/^[^-]*-//'` + ;; + c55x-*) + basic_machine=tic55x-`echo "$basic_machine" | sed 's/^[^-]*-//'` + ;; + c6x-*) + basic_machine=tic6x-`echo "$basic_machine" | sed 's/^[^-]*-//'` + ;; + c90) + basic_machine=c90-cray + os=-unicos + ;; + cegcc) + basic_machine=arm-unknown + os=-cegcc + ;; + convex-c1) + basic_machine=c1-convex + os=-bsd + ;; + convex-c2) + basic_machine=c2-convex + os=-bsd + ;; + convex-c32) + basic_machine=c32-convex + os=-bsd + ;; + convex-c34) + basic_machine=c34-convex + os=-bsd + ;; + convex-c38) + basic_machine=c38-convex + os=-bsd + ;; + cray | j90) + basic_machine=j90-cray + os=-unicos + ;; + craynv) + basic_machine=craynv-cray + os=-unicosmp + ;; + cr16 | cr16-*) + basic_machine=cr16-unknown + os=-elf + ;; + crds | unos) + basic_machine=m68k-crds + ;; + crisv32 | crisv32-* | etraxfs*) + basic_machine=crisv32-axis + ;; + cris | cris-* | etrax*) + basic_machine=cris-axis + ;; + crx) + basic_machine=crx-unknown + os=-elf + ;; + da30 | da30-*) + basic_machine=m68k-da30 + ;; + decstation | decstation-3100 | pmax | pmax-* | pmin | dec3100 | decstatn) + basic_machine=mips-dec + ;; + decsystem10* | dec10*) + basic_machine=pdp10-dec + os=-tops10 + ;; + decsystem20* | dec20*) + basic_machine=pdp10-dec + os=-tops20 + ;; + delta | 3300 | motorola-3300 | motorola-delta \ + | 3300-motorola | delta-motorola) + basic_machine=m68k-motorola + ;; + delta88) + basic_machine=m88k-motorola + os=-sysv3 + ;; + dicos) + basic_machine=i686-pc + os=-dicos + ;; + djgpp) + basic_machine=i586-pc + os=-msdosdjgpp + ;; + dpx20 | dpx20-*) + basic_machine=rs6000-bull + os=-bosx + ;; + dpx2*) + basic_machine=m68k-bull + os=-sysv3 + ;; + e500v[12]) + basic_machine=powerpc-unknown + os=$os"spe" + ;; + e500v[12]-*) + basic_machine=powerpc-`echo "$basic_machine" | sed 's/^[^-]*-//'` + os=$os"spe" + ;; + ebmon29k) + basic_machine=a29k-amd + os=-ebmon + ;; + elxsi) + basic_machine=elxsi-elxsi + os=-bsd + ;; + encore | umax | mmax) + basic_machine=ns32k-encore + ;; + es1800 | OSE68k | ose68k | ose | OSE) + basic_machine=m68k-ericsson + os=-ose + ;; + fx2800) + basic_machine=i860-alliant + ;; + genix) + basic_machine=ns32k-ns + ;; + gmicro) + basic_machine=tron-gmicro + os=-sysv + ;; + go32) + basic_machine=i386-pc + os=-go32 + ;; + h3050r* | hiux*) + basic_machine=hppa1.1-hitachi + os=-hiuxwe2 + ;; + h8300hms) + basic_machine=h8300-hitachi + os=-hms + ;; + h8300xray) + basic_machine=h8300-hitachi + os=-xray + ;; + h8500hms) + basic_machine=h8500-hitachi + os=-hms + ;; + harris) + basic_machine=m88k-harris + os=-sysv3 + ;; + hp300-*) + basic_machine=m68k-hp + ;; + hp300bsd) + basic_machine=m68k-hp + os=-bsd + ;; + hp300hpux) + basic_machine=m68k-hp + os=-hpux + ;; + hp3k9[0-9][0-9] | hp9[0-9][0-9]) + basic_machine=hppa1.0-hp + ;; + hp9k2[0-9][0-9] | hp9k31[0-9]) + basic_machine=m68000-hp + ;; + hp9k3[2-9][0-9]) + basic_machine=m68k-hp + ;; + hp9k6[0-9][0-9] | hp6[0-9][0-9]) + basic_machine=hppa1.0-hp + ;; + hp9k7[0-79][0-9] | hp7[0-79][0-9]) + basic_machine=hppa1.1-hp + ;; + hp9k78[0-9] | hp78[0-9]) + # FIXME: really hppa2.0-hp + basic_machine=hppa1.1-hp + ;; + hp9k8[67]1 | hp8[67]1 | hp9k80[24] | hp80[24] | hp9k8[78]9 | hp8[78]9 | hp9k893 | hp893) + # FIXME: really hppa2.0-hp + basic_machine=hppa1.1-hp + ;; + hp9k8[0-9][13679] | hp8[0-9][13679]) + basic_machine=hppa1.1-hp + ;; + hp9k8[0-9][0-9] | hp8[0-9][0-9]) + basic_machine=hppa1.0-hp + ;; + hppaosf) + basic_machine=hppa1.1-hp + os=-osf + ;; + hppro) + basic_machine=hppa1.1-hp + os=-proelf + ;; + i370-ibm* | ibm*) + basic_machine=i370-ibm + ;; + i*86v32) + basic_machine=`echo "$1" | sed -e 's/86.*/86-pc/'` + os=-sysv32 + ;; + i*86v4*) + basic_machine=`echo "$1" | sed -e 's/86.*/86-pc/'` + os=-sysv4 + ;; + i*86v) + basic_machine=`echo "$1" | sed -e 's/86.*/86-pc/'` + os=-sysv + ;; + i*86sol2) + basic_machine=`echo "$1" | sed -e 's/86.*/86-pc/'` + os=-solaris2 + ;; + i386mach) + basic_machine=i386-mach + os=-mach + ;; + vsta) + basic_machine=i386-unknown + os=-vsta + ;; + iris | iris4d) + basic_machine=mips-sgi + case $os in + -irix*) + ;; + *) + os=-irix4 + ;; + esac + ;; + isi68 | isi) + basic_machine=m68k-isi + os=-sysv + ;; + leon-*|leon[3-9]-*) + basic_machine=sparc-`echo "$basic_machine" | sed 's/-.*//'` + ;; + m68knommu) + basic_machine=m68k-unknown + os=-linux + ;; + m68knommu-*) + basic_machine=m68k-`echo "$basic_machine" | sed 's/^[^-]*-//'` + os=-linux + ;; + magnum | m3230) + basic_machine=mips-mips + os=-sysv + ;; + merlin) + basic_machine=ns32k-utek + os=-sysv + ;; + microblaze*) + basic_machine=microblaze-xilinx + ;; + mingw64) + basic_machine=x86_64-pc + os=-mingw64 + ;; + mingw32) + basic_machine=i686-pc + os=-mingw32 + ;; + mingw32ce) + basic_machine=arm-unknown + os=-mingw32ce + ;; + miniframe) + basic_machine=m68000-convergent + ;; + *mint | -mint[0-9]* | *MiNT | *MiNT[0-9]*) + basic_machine=m68k-atari + os=-mint + ;; + mips3*-*) + basic_machine=`echo "$basic_machine" | sed -e 's/mips3/mips64/'` + ;; + mips3*) + basic_machine=`echo "$basic_machine" | sed -e 's/mips3/mips64/'`-unknown + ;; + monitor) + basic_machine=m68k-rom68k + os=-coff + ;; + morphos) + basic_machine=powerpc-unknown + os=-morphos + ;; + moxiebox) + basic_machine=moxie-unknown + os=-moxiebox + ;; + msdos) + basic_machine=i386-pc + os=-msdos + ;; + ms1-*) + basic_machine=`echo "$basic_machine" | sed -e 's/ms1-/mt-/'` + ;; + msys) + basic_machine=i686-pc + os=-msys + ;; + mvs) + basic_machine=i370-ibm + os=-mvs + ;; + nacl) + basic_machine=le32-unknown + os=-nacl + ;; + ncr3000) + basic_machine=i486-ncr + os=-sysv4 + ;; + netbsd386) + basic_machine=i386-unknown + os=-netbsd + ;; + netwinder) + basic_machine=armv4l-rebel + os=-linux + ;; + news | news700 | news800 | news900) + basic_machine=m68k-sony + os=-newsos + ;; + news1000) + basic_machine=m68030-sony + os=-newsos + ;; + news-3600 | risc-news) + basic_machine=mips-sony + os=-newsos + ;; + necv70) + basic_machine=v70-nec + os=-sysv + ;; + next | m*-next) + basic_machine=m68k-next + case $os in + -nextstep* ) + ;; + -ns2*) + os=-nextstep2 + ;; + *) + os=-nextstep3 + ;; + esac + ;; + nh3000) + basic_machine=m68k-harris + os=-cxux + ;; + nh[45]000) + basic_machine=m88k-harris + os=-cxux + ;; + nindy960) + basic_machine=i960-intel + os=-nindy + ;; + mon960) + basic_machine=i960-intel + os=-mon960 + ;; + nonstopux) + basic_machine=mips-compaq + os=-nonstopux + ;; + np1) + basic_machine=np1-gould + ;; + neo-tandem) + basic_machine=neo-tandem + ;; + nse-tandem) + basic_machine=nse-tandem + ;; + nsr-tandem) + basic_machine=nsr-tandem + ;; + nsv-tandem) + basic_machine=nsv-tandem + ;; + nsx-tandem) + basic_machine=nsx-tandem + ;; + op50n-* | op60c-*) + basic_machine=hppa1.1-oki + os=-proelf + ;; + openrisc | openrisc-*) + basic_machine=or32-unknown + ;; + os400) + basic_machine=powerpc-ibm + os=-os400 + ;; + OSE68000 | ose68000) + basic_machine=m68000-ericsson + os=-ose + ;; + os68k) + basic_machine=m68k-none + os=-os68k + ;; + pa-hitachi) + basic_machine=hppa1.1-hitachi + os=-hiuxwe2 + ;; + paragon) + basic_machine=i860-intel + os=-osf + ;; + parisc) + basic_machine=hppa-unknown + os=-linux + ;; + parisc-*) + basic_machine=hppa-`echo "$basic_machine" | sed 's/^[^-]*-//'` + os=-linux + ;; + pbd) + basic_machine=sparc-tti + ;; + pbb) + basic_machine=m68k-tti + ;; + pc532 | pc532-*) + basic_machine=ns32k-pc532 + ;; + pc98) + basic_machine=i386-pc + ;; + pc98-*) + basic_machine=i386-`echo "$basic_machine" | sed 's/^[^-]*-//'` + ;; + pentium | p5 | k5 | k6 | nexgen | viac3) + basic_machine=i586-pc + ;; + pentiumpro | p6 | 6x86 | athlon | athlon_*) + basic_machine=i686-pc + ;; + pentiumii | pentium2 | pentiumiii | pentium3) + basic_machine=i686-pc + ;; + pentium4) + basic_machine=i786-pc + ;; + pentium-* | p5-* | k5-* | k6-* | nexgen-* | viac3-*) + basic_machine=i586-`echo "$basic_machine" | sed 's/^[^-]*-//'` + ;; + pentiumpro-* | p6-* | 6x86-* | athlon-*) + basic_machine=i686-`echo "$basic_machine" | sed 's/^[^-]*-//'` + ;; + pentiumii-* | pentium2-* | pentiumiii-* | pentium3-*) + basic_machine=i686-`echo "$basic_machine" | sed 's/^[^-]*-//'` + ;; + pentium4-*) + basic_machine=i786-`echo "$basic_machine" | sed 's/^[^-]*-//'` + ;; + pn) + basic_machine=pn-gould + ;; + power) basic_machine=power-ibm + ;; + ppc | ppcbe) basic_machine=powerpc-unknown + ;; + ppc-* | ppcbe-*) + basic_machine=powerpc-`echo "$basic_machine" | sed 's/^[^-]*-//'` + ;; + ppcle | powerpclittle) + basic_machine=powerpcle-unknown + ;; + ppcle-* | powerpclittle-*) + basic_machine=powerpcle-`echo "$basic_machine" | sed 's/^[^-]*-//'` + ;; + ppc64) basic_machine=powerpc64-unknown + ;; + ppc64-*) basic_machine=powerpc64-`echo "$basic_machine" | sed 's/^[^-]*-//'` + ;; + ppc64le | powerpc64little) + basic_machine=powerpc64le-unknown + ;; + ppc64le-* | powerpc64little-*) + basic_machine=powerpc64le-`echo "$basic_machine" | sed 's/^[^-]*-//'` + ;; + ps2) + basic_machine=i386-ibm + ;; + pw32) + basic_machine=i586-unknown + os=-pw32 + ;; + rdos | rdos64) + basic_machine=x86_64-pc + os=-rdos + ;; + rdos32) + basic_machine=i386-pc + os=-rdos + ;; + rom68k) + basic_machine=m68k-rom68k + os=-coff + ;; + rm[46]00) + basic_machine=mips-siemens + ;; + rtpc | rtpc-*) + basic_machine=romp-ibm + ;; + s390 | s390-*) + basic_machine=s390-ibm + ;; + s390x | s390x-*) + basic_machine=s390x-ibm + ;; + sa29200) + basic_machine=a29k-amd + os=-udi + ;; + sb1) + basic_machine=mipsisa64sb1-unknown + ;; + sb1el) + basic_machine=mipsisa64sb1el-unknown + ;; + sde) + basic_machine=mipsisa32-sde + os=-elf + ;; + sei) + basic_machine=mips-sei + os=-seiux + ;; + sequent) + basic_machine=i386-sequent + ;; + sh5el) + basic_machine=sh5le-unknown + ;; + simso-wrs) + basic_machine=sparclite-wrs + os=-vxworks + ;; + sps7) + basic_machine=m68k-bull + os=-sysv2 + ;; + spur) + basic_machine=spur-unknown + ;; + st2000) + basic_machine=m68k-tandem + ;; + stratus) + basic_machine=i860-stratus + os=-sysv4 + ;; + strongarm-* | thumb-*) + basic_machine=arm-`echo "$basic_machine" | sed 's/^[^-]*-//'` + ;; + sun2) + basic_machine=m68000-sun + ;; + sun2os3) + basic_machine=m68000-sun + os=-sunos3 + ;; + sun2os4) + basic_machine=m68000-sun + os=-sunos4 + ;; + sun3os3) + basic_machine=m68k-sun + os=-sunos3 + ;; + sun3os4) + basic_machine=m68k-sun + os=-sunos4 + ;; + sun4os3) + basic_machine=sparc-sun + os=-sunos3 + ;; + sun4os4) + basic_machine=sparc-sun + os=-sunos4 + ;; + sun4sol2) + basic_machine=sparc-sun + os=-solaris2 + ;; + sun3 | sun3-*) + basic_machine=m68k-sun + ;; + sun4) + basic_machine=sparc-sun + ;; + sun386 | sun386i | roadrunner) + basic_machine=i386-sun + ;; + sv1) + basic_machine=sv1-cray + os=-unicos + ;; + symmetry) + basic_machine=i386-sequent + os=-dynix + ;; + t3e) + basic_machine=alphaev5-cray + os=-unicos + ;; + t90) + basic_machine=t90-cray + os=-unicos + ;; + tile*) + basic_machine=$basic_machine-unknown + os=-linux-gnu + ;; + tx39) + basic_machine=mipstx39-unknown + ;; + tx39el) + basic_machine=mipstx39el-unknown + ;; + toad1) + basic_machine=pdp10-xkl + os=-tops20 + ;; + tower | tower-32) + basic_machine=m68k-ncr + ;; + tpf) + basic_machine=s390x-ibm + os=-tpf + ;; + udi29k) + basic_machine=a29k-amd + os=-udi + ;; + ultra3) + basic_machine=a29k-nyu + os=-sym1 + ;; + v810 | necv810) + basic_machine=v810-nec + os=-none + ;; + vaxv) + basic_machine=vax-dec + os=-sysv + ;; + vms) + basic_machine=vax-dec + os=-vms + ;; + vpp*|vx|vx-*) + basic_machine=f301-fujitsu + ;; + vxworks960) + basic_machine=i960-wrs + os=-vxworks + ;; + vxworks68) + basic_machine=m68k-wrs + os=-vxworks + ;; + vxworks29k) + basic_machine=a29k-wrs + os=-vxworks + ;; + w65*) + basic_machine=w65-wdc + os=-none + ;; + w89k-*) + basic_machine=hppa1.1-winbond + os=-proelf + ;; + x64) + basic_machine=x86_64-pc + ;; + xbox) + basic_machine=i686-pc + os=-mingw32 + ;; + xps | xps100) + basic_machine=xps100-honeywell + ;; + xscale-* | xscalee[bl]-*) + basic_machine=`echo "$basic_machine" | sed 's/^xscale/arm/'` + ;; + ymp) + basic_machine=ymp-cray + os=-unicos + ;; + none) + basic_machine=none-none + os=-none + ;; + +# Here we handle the default manufacturer of certain CPU types. It is in +# some cases the only manufacturer, in others, it is the most popular. + w89k) + basic_machine=hppa1.1-winbond + ;; + op50n) + basic_machine=hppa1.1-oki + ;; + op60c) + basic_machine=hppa1.1-oki + ;; + romp) + basic_machine=romp-ibm + ;; + mmix) + basic_machine=mmix-knuth + ;; + rs6000) + basic_machine=rs6000-ibm + ;; + vax) + basic_machine=vax-dec + ;; + pdp11) + basic_machine=pdp11-dec + ;; + we32k) + basic_machine=we32k-att + ;; + sh[1234] | sh[24]a | sh[24]aeb | sh[34]eb | sh[1234]le | sh[23]ele) + basic_machine=sh-unknown + ;; + cydra) + basic_machine=cydra-cydrome + ;; + orion) + basic_machine=orion-highlevel + ;; + orion105) + basic_machine=clipper-highlevel + ;; + mac | mpw | mac-mpw) + basic_machine=m68k-apple + ;; + pmac | pmac-mpw) + basic_machine=powerpc-apple + ;; + *-unknown) + # Make sure to match an already-canonicalized machine name. + ;; + *) + echo Invalid configuration \`"$1"\': machine \`"$basic_machine"\' not recognized 1>&2 + exit 1 + ;; +esac + +# Here we canonicalize certain aliases for manufacturers. +case $basic_machine in + *-digital*) + basic_machine=`echo "$basic_machine" | sed 's/digital.*/dec/'` + ;; + *-commodore*) + basic_machine=`echo "$basic_machine" | sed 's/commodore.*/cbm/'` + ;; + *) + ;; +esac + +# Decode manufacturer-specific aliases for certain operating systems. + +if [ x"$os" != x"" ] +then +case $os in + # First match some system type aliases that might get confused + # with valid system types. + # -solaris* is a basic system type, with this one exception. + -auroraux) + os=-auroraux + ;; + -solaris1 | -solaris1.*) + os=`echo $os | sed -e 's|solaris1|sunos4|'` + ;; + -solaris) + os=-solaris2 + ;; + -unixware*) + os=-sysv4.2uw + ;; + -gnu/linux*) + os=`echo $os | sed -e 's|gnu/linux|linux-gnu|'` + ;; + # es1800 is here to avoid being matched by es* (a different OS) + -es1800*) + os=-ose + ;; + # Now accept the basic system types. + # The portable systems comes first. + # Each alternative MUST end in a * to match a version number. + # -sysv* is not here because it comes later, after sysvr4. + -gnu* | -bsd* | -mach* | -minix* | -genix* | -ultrix* | -irix* \ + | -*vms* | -sco* | -esix* | -isc* | -aix* | -cnk* | -sunos | -sunos[34]*\ + | -hpux* | -unos* | -osf* | -luna* | -dgux* | -auroraux* | -solaris* \ + | -sym* | -kopensolaris* | -plan9* \ + | -amigaos* | -amigados* | -msdos* | -newsos* | -unicos* | -aof* \ + | -aos* | -aros* | -cloudabi* | -sortix* \ + | -nindy* | -vxsim* | -vxworks* | -ebmon* | -hms* | -mvs* \ + | -clix* | -riscos* | -uniplus* | -iris* | -rtu* | -xenix* \ + | -hiux* | -knetbsd* | -mirbsd* | -netbsd* \ + | -bitrig* | -openbsd* | -solidbsd* | -libertybsd* \ + | -ekkobsd* | -kfreebsd* | -freebsd* | -riscix* | -lynxos* \ + | -bosx* | -nextstep* | -cxux* | -aout* | -elf* | -oabi* \ + | -ptx* | -coff* | -ecoff* | -winnt* | -domain* | -vsta* \ + | -udi* | -eabi* | -lites* | -ieee* | -go32* | -aux* \ + | -chorusos* | -chorusrdb* | -cegcc* | -glidix* \ + | -cygwin* | -msys* | -pe* | -psos* | -moss* | -proelf* | -rtems* \ + | -midipix* | -mingw32* | -mingw64* | -linux-gnu* | -linux-android* \ + | -linux-newlib* | -linux-musl* | -linux-uclibc* \ + | -uxpv* | -beos* | -mpeix* | -udk* | -moxiebox* \ + | -interix* | -uwin* | -mks* | -rhapsody* | -darwin* \ + | -openstep* | -oskit* | -conix* | -pw32* | -nonstopux* \ + | -storm-chaos* | -tops10* | -tenex* | -tops20* | -its* \ + | -os2* | -vos* | -palmos* | -uclinux* | -nucleus* \ + | -morphos* | -superux* | -rtmk* | -windiss* \ + | -powermax* | -dnix* | -nx6 | -nx7 | -sei* | -dragonfly* \ + | -skyos* | -haiku* | -rdos* | -toppers* | -drops* | -es* \ + | -onefs* | -tirtos* | -phoenix* | -fuchsia* | -redox* | -bme* \ + | -midnightbsd*) + # Remember, each alternative MUST END IN *, to match a version number. + ;; + -qnx*) + case $basic_machine in + x86-* | i*86-*) + ;; + *) + os=-nto$os + ;; + esac + ;; + -nto-qnx*) + ;; + -nto*) + os=`echo $os | sed -e 's|nto|nto-qnx|'` + ;; + -sim | -xray | -os68k* | -v88r* \ + | -windows* | -osx | -abug | -netware* | -os9* \ + | -macos* | -mpw* | -magic* | -mmixware* | -mon960* | -lnews*) + ;; + -mac*) + os=`echo "$os" | sed -e 's|mac|macos|'` + ;; + -linux-dietlibc) + os=-linux-dietlibc + ;; + -linux*) + os=`echo $os | sed -e 's|linux|linux-gnu|'` + ;; + -sunos5*) + os=`echo "$os" | sed -e 's|sunos5|solaris2|'` + ;; + -sunos6*) + os=`echo "$os" | sed -e 's|sunos6|solaris3|'` + ;; + -opened*) + os=-openedition + ;; + -os400*) + os=-os400 + ;; + -wince*) + os=-wince + ;; + -utek*) + os=-bsd + ;; + -dynix*) + os=-bsd + ;; + -acis*) + os=-aos + ;; + -atheos*) + os=-atheos + ;; + -syllable*) + os=-syllable + ;; + -386bsd) + os=-bsd + ;; + -ctix* | -uts*) + os=-sysv + ;; + -nova*) + os=-rtmk-nova + ;; + -ns2) + os=-nextstep2 + ;; + -nsk*) + os=-nsk + ;; + # Preserve the version number of sinix5. + -sinix5.*) + os=`echo $os | sed -e 's|sinix|sysv|'` + ;; + -sinix*) + os=-sysv4 + ;; + -tpf*) + os=-tpf + ;; + -triton*) + os=-sysv3 + ;; + -oss*) + os=-sysv3 + ;; + -svr4*) + os=-sysv4 + ;; + -svr3) + os=-sysv3 + ;; + -sysvr4) + os=-sysv4 + ;; + # This must come after -sysvr4. + -sysv*) + ;; + -ose*) + os=-ose + ;; + -*mint | -mint[0-9]* | -*MiNT | -MiNT[0-9]*) + os=-mint + ;; + -zvmoe) + os=-zvmoe + ;; + -dicos*) + os=-dicos + ;; + -pikeos*) + # Until real need of OS specific support for + # particular features comes up, bare metal + # configurations are quite functional. + case $basic_machine in + arm*) + os=-eabi + ;; + *) + os=-elf + ;; + esac + ;; + -nacl*) + ;; + -ios) + ;; + -none) + ;; + *) + # Get rid of the `-' at the beginning of $os. + os=`echo $os | sed 's/[^-]*-//'` + echo Invalid configuration \`"$1"\': system \`"$os"\' not recognized 1>&2 + exit 1 + ;; +esac +else + +# Here we handle the default operating systems that come with various machines. +# The value should be what the vendor currently ships out the door with their +# machine or put another way, the most popular os provided with the machine. + +# Note that if you're going to try to match "-MANUFACTURER" here (say, +# "-sun"), then you have to tell the case statement up towards the top +# that MANUFACTURER isn't an operating system. Otherwise, code above +# will signal an error saying that MANUFACTURER isn't an operating +# system, and we'll never get to this point. + +case $basic_machine in + score-*) + os=-elf + ;; + spu-*) + os=-elf + ;; + *-acorn) + os=-riscix1.2 + ;; + arm*-rebel) + os=-linux + ;; + arm*-semi) + os=-aout + ;; + c4x-* | tic4x-*) + os=-coff + ;; + c8051-*) + os=-elf + ;; + hexagon-*) + os=-elf + ;; + tic54x-*) + os=-coff + ;; + tic55x-*) + os=-coff + ;; + tic6x-*) + os=-coff + ;; + # This must come before the *-dec entry. + pdp10-*) + os=-tops20 + ;; + pdp11-*) + os=-none + ;; + *-dec | vax-*) + os=-ultrix4.2 + ;; + m68*-apollo) + os=-domain + ;; + i386-sun) + os=-sunos4.0.2 + ;; + m68000-sun) + os=-sunos3 + ;; + m68*-cisco) + os=-aout + ;; + mep-*) + os=-elf + ;; + mips*-cisco) + os=-elf + ;; + mips*-*) + os=-elf + ;; + or32-*) + os=-coff + ;; + *-tti) # must be before sparc entry or we get the wrong os. + os=-sysv3 + ;; + sparc-* | *-sun) + os=-sunos4.1.1 + ;; + pru-*) + os=-elf + ;; + *-be) + os=-beos + ;; + *-ibm) + os=-aix + ;; + *-knuth) + os=-mmixware + ;; + *-wec) + os=-proelf + ;; + *-winbond) + os=-proelf + ;; + *-oki) + os=-proelf + ;; + *-hp) + os=-hpux + ;; + *-hitachi) + os=-hiux + ;; + i860-* | *-att | *-ncr | *-altos | *-motorola | *-convergent) + os=-sysv + ;; + *-cbm) + os=-amigaos + ;; + *-dg) + os=-dgux + ;; + *-dolphin) + os=-sysv3 + ;; + m68k-ccur) + os=-rtu + ;; + m88k-omron*) + os=-luna + ;; + *-next) + os=-nextstep + ;; + *-sequent) + os=-ptx + ;; + *-crds) + os=-unos + ;; + *-ns) + os=-genix + ;; + i370-*) + os=-mvs + ;; + *-gould) + os=-sysv + ;; + *-highlevel) + os=-bsd + ;; + *-encore) + os=-bsd + ;; + *-sgi) + os=-irix + ;; + *-siemens) + os=-sysv4 + ;; + *-masscomp) + os=-rtu + ;; + f30[01]-fujitsu | f700-fujitsu) + os=-uxpv + ;; + *-rom68k) + os=-coff + ;; + *-*bug) + os=-coff + ;; + *-apple) + os=-macos + ;; + *-atari*) + os=-mint + ;; + *) + os=-none + ;; +esac +fi + +# Here we handle the case where we know the os, and the CPU type, but not the +# manufacturer. We pick the logical manufacturer. +vendor=unknown +case $basic_machine in + *-unknown) + case $os in + -riscix*) + vendor=acorn + ;; + -sunos*) + vendor=sun + ;; + -cnk*|-aix*) + vendor=ibm + ;; + -beos*) + vendor=be + ;; + -hpux*) + vendor=hp + ;; + -mpeix*) + vendor=hp + ;; + -hiux*) + vendor=hitachi + ;; + -unos*) + vendor=crds + ;; + -dgux*) + vendor=dg + ;; + -luna*) + vendor=omron + ;; + -genix*) + vendor=ns + ;; + -mvs* | -opened*) + vendor=ibm + ;; + -os400*) + vendor=ibm + ;; + -ptx*) + vendor=sequent + ;; + -tpf*) + vendor=ibm + ;; + -vxsim* | -vxworks* | -windiss*) + vendor=wrs + ;; + -aux*) + vendor=apple + ;; + -hms*) + vendor=hitachi + ;; + -mpw* | -macos*) + vendor=apple + ;; + -*mint | -mint[0-9]* | -*MiNT | -MiNT[0-9]*) + vendor=atari + ;; + -vos*) + vendor=stratus + ;; + esac + basic_machine=`echo "$basic_machine" | sed "s/unknown/$vendor/"` + ;; +esac + +echo "$basic_machine$os" +exit + +# Local variables: +# eval: (add-hook 'write-file-functions 'time-stamp) +# time-stamp-start: "timestamp='" +# time-stamp-format: "%:y-%02m-%02d" +# time-stamp-end: "'" +# End: diff --git a/configure b/configure new file mode 100755 index 0000000..3bd9a2d --- /dev/null +++ b/configure @@ -0,0 +1,14858 @@ +#! /bin/sh +# Guess values for system-dependent variables and create Makefiles. +# Generated by GNU Autoconf 2.69 for viking 1.7. +# +# +# Copyright (C) 1992-1996, 1998-2012 Free Software Foundation, Inc. +# +# +# This configure script is free software; the Free Software Foundation +# gives unlimited permission to copy, distribute and modify it. +## -------------------- ## +## M4sh Initialization. ## +## -------------------- ## + +# Be more Bourne compatible +DUALCASE=1; export DUALCASE # for MKS sh +if test -n "${ZSH_VERSION+set}" && (emulate sh) >/dev/null 2>&1; then : + emulate sh + NULLCMD=: + # Pre-4.2 versions of Zsh do word splitting on ${1+"$@"}, which + # is contrary to our usage. Disable this feature. + alias -g '${1+"$@"}'='"$@"' + setopt NO_GLOB_SUBST +else + case `(set -o) 2>/dev/null` in #( + *posix*) : + set -o posix ;; #( + *) : + ;; +esac +fi + + +as_nl=' +' +export as_nl +# Printing a long string crashes Solaris 7 /usr/bin/printf. +as_echo='\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\' +as_echo=$as_echo$as_echo$as_echo$as_echo$as_echo +as_echo=$as_echo$as_echo$as_echo$as_echo$as_echo$as_echo +# Prefer a ksh shell builtin over an external printf program on Solaris, +# but without wasting forks for bash or zsh. +if test -z "$BASH_VERSION$ZSH_VERSION" \ + && (test "X`print -r -- $as_echo`" = "X$as_echo") 2>/dev/null; then + as_echo='print -r --' + as_echo_n='print -rn --' +elif (test "X`printf %s $as_echo`" = "X$as_echo") 2>/dev/null; then + as_echo='printf %s\n' + as_echo_n='printf %s' +else + if test "X`(/usr/ucb/echo -n -n $as_echo) 2>/dev/null`" = "X-n $as_echo"; then + as_echo_body='eval /usr/ucb/echo -n "$1$as_nl"' + as_echo_n='/usr/ucb/echo -n' + else + as_echo_body='eval expr "X$1" : "X\\(.*\\)"' + as_echo_n_body='eval + arg=$1; + case $arg in #( + *"$as_nl"*) + expr "X$arg" : "X\\(.*\\)$as_nl"; + arg=`expr "X$arg" : ".*$as_nl\\(.*\\)"`;; + esac; + expr "X$arg" : "X\\(.*\\)" | tr -d "$as_nl" + ' + export as_echo_n_body + as_echo_n='sh -c $as_echo_n_body as_echo' + fi + export as_echo_body + as_echo='sh -c $as_echo_body as_echo' +fi + +# The user is always right. +if test "${PATH_SEPARATOR+set}" != set; then + PATH_SEPARATOR=: + (PATH='/bin;/bin'; FPATH=$PATH; sh -c :) >/dev/null 2>&1 && { + (PATH='/bin:/bin'; FPATH=$PATH; sh -c :) >/dev/null 2>&1 || + PATH_SEPARATOR=';' + } +fi + + +# IFS +# We need space, tab and new line, in precisely that order. Quoting is +# there to prevent editors from complaining about space-tab. +# (If _AS_PATH_WALK were called with IFS unset, it would disable word +# splitting by setting IFS to empty value.) +IFS=" "" $as_nl" + +# Find who we are. Look in the path if we contain no directory separator. +as_myself= +case $0 in #(( + *[\\/]* ) as_myself=$0 ;; + *) as_save_IFS=$IFS; IFS=$PATH_SEPARATOR +for as_dir in $PATH +do + IFS=$as_save_IFS + test -z "$as_dir" && as_dir=. + test -r "$as_dir/$0" && as_myself=$as_dir/$0 && break + done +IFS=$as_save_IFS + + ;; +esac +# We did not find ourselves, most probably we were run as `sh COMMAND' +# in which case we are not to be found in the path. +if test "x$as_myself" = x; then + as_myself=$0 +fi +if test ! -f "$as_myself"; then + $as_echo "$as_myself: error: cannot find myself; rerun with an absolute file name" >&2 + exit 1 +fi + +# Unset variables that we do not need and which cause bugs (e.g. in +# pre-3.0 UWIN ksh). But do not cause bugs in bash 2.01; the "|| exit 1" +# suppresses any "Segmentation fault" message there. '((' could +# trigger a bug in pdksh 5.2.14. +for as_var in BASH_ENV ENV MAIL MAILPATH +do eval test x\${$as_var+set} = xset \ + && ( (unset $as_var) || exit 1) >/dev/null 2>&1 && unset $as_var || : +done +PS1='$ ' +PS2='> ' +PS4='+ ' + +# NLS nuisances. +LC_ALL=C +export LC_ALL +LANGUAGE=C +export LANGUAGE + +# CDPATH. +(unset CDPATH) >/dev/null 2>&1 && unset CDPATH + +# Use a proper internal environment variable to ensure we don't fall + # into an infinite loop, continuously re-executing ourselves. + if test x"${_as_can_reexec}" != xno && test "x$CONFIG_SHELL" != x; then + _as_can_reexec=no; export _as_can_reexec; + # We cannot yet assume a decent shell, so we have to provide a +# neutralization value for shells without unset; and this also +# works around shells that cannot unset nonexistent variables. +# Preserve -v and -x to the replacement shell. +BASH_ENV=/dev/null +ENV=/dev/null +(unset BASH_ENV) >/dev/null 2>&1 && unset BASH_ENV ENV +case $- in # (((( + *v*x* | *x*v* ) as_opts=-vx ;; + *v* ) as_opts=-v ;; + *x* ) as_opts=-x ;; + * ) as_opts= ;; +esac +exec $CONFIG_SHELL $as_opts "$as_myself" ${1+"$@"} +# Admittedly, this is quite paranoid, since all the known shells bail +# out after a failed `exec'. +$as_echo "$0: could not re-execute with $CONFIG_SHELL" >&2 +as_fn_exit 255 + fi + # We don't want this to propagate to other subprocesses. + { _as_can_reexec=; unset _as_can_reexec;} +if test "x$CONFIG_SHELL" = x; then + as_bourne_compatible="if test -n \"\${ZSH_VERSION+set}\" && (emulate sh) >/dev/null 2>&1; then : + emulate sh + NULLCMD=: + # Pre-4.2 versions of Zsh do word splitting on \${1+\"\$@\"}, which + # is contrary to our usage. Disable this feature. + alias -g '\${1+\"\$@\"}'='\"\$@\"' + setopt NO_GLOB_SUBST +else + case \`(set -o) 2>/dev/null\` in #( + *posix*) : + set -o posix ;; #( + *) : + ;; +esac +fi +" + as_required="as_fn_return () { (exit \$1); } +as_fn_success () { as_fn_return 0; } +as_fn_failure () { as_fn_return 1; } +as_fn_ret_success () { return 0; } +as_fn_ret_failure () { return 1; } + +exitcode=0 +as_fn_success || { exitcode=1; echo as_fn_success failed.; } +as_fn_failure && { exitcode=1; echo as_fn_failure succeeded.; } +as_fn_ret_success || { exitcode=1; echo as_fn_ret_success failed.; } +as_fn_ret_failure && { exitcode=1; echo as_fn_ret_failure succeeded.; } +if ( set x; as_fn_ret_success y && test x = \"\$1\" ); then : + +else + exitcode=1; echo positional parameters were not saved. +fi +test x\$exitcode = x0 || exit 1 +test -x / || exit 1" + as_suggested=" as_lineno_1=";as_suggested=$as_suggested$LINENO;as_suggested=$as_suggested" as_lineno_1a=\$LINENO + as_lineno_2=";as_suggested=$as_suggested$LINENO;as_suggested=$as_suggested" as_lineno_2a=\$LINENO + eval 'test \"x\$as_lineno_1'\$as_run'\" != \"x\$as_lineno_2'\$as_run'\" && + test \"x\`expr \$as_lineno_1'\$as_run' + 1\`\" = \"x\$as_lineno_2'\$as_run'\"' || exit 1 +test \$(( 1 + 1 )) = 2 || exit 1" + if (eval "$as_required") 2>/dev/null; then : + as_have_required=yes +else + as_have_required=no +fi + if test x$as_have_required = xyes && (eval "$as_suggested") 2>/dev/null; then : + +else + as_save_IFS=$IFS; IFS=$PATH_SEPARATOR +as_found=false +for as_dir in /bin$PATH_SEPARATOR/usr/bin$PATH_SEPARATOR$PATH +do + IFS=$as_save_IFS + test -z "$as_dir" && as_dir=. + as_found=: + case $as_dir in #( + /*) + for as_base in sh bash ksh sh5; do + # Try only shells that exist, to save several forks. + as_shell=$as_dir/$as_base + if { test -f "$as_shell" || test -f "$as_shell.exe"; } && + { $as_echo "$as_bourne_compatible""$as_required" | as_run=a "$as_shell"; } 2>/dev/null; then : + CONFIG_SHELL=$as_shell as_have_required=yes + if { $as_echo "$as_bourne_compatible""$as_suggested" | as_run=a "$as_shell"; } 2>/dev/null; then : + break 2 +fi +fi + done;; + esac + as_found=false +done +$as_found || { if { test -f "$SHELL" || test -f "$SHELL.exe"; } && + { $as_echo "$as_bourne_compatible""$as_required" | as_run=a "$SHELL"; } 2>/dev/null; then : + CONFIG_SHELL=$SHELL as_have_required=yes +fi; } +IFS=$as_save_IFS + + + if test "x$CONFIG_SHELL" != x; then : + export CONFIG_SHELL + # We cannot yet assume a decent shell, so we have to provide a +# neutralization value for shells without unset; and this also +# works around shells that cannot unset nonexistent variables. +# Preserve -v and -x to the replacement shell. +BASH_ENV=/dev/null +ENV=/dev/null +(unset BASH_ENV) >/dev/null 2>&1 && unset BASH_ENV ENV +case $- in # (((( + *v*x* | *x*v* ) as_opts=-vx ;; + *v* ) as_opts=-v ;; + *x* ) as_opts=-x ;; + * ) as_opts= ;; +esac +exec $CONFIG_SHELL $as_opts "$as_myself" ${1+"$@"} +# Admittedly, this is quite paranoid, since all the known shells bail +# out after a failed `exec'. +$as_echo "$0: could not re-execute with $CONFIG_SHELL" >&2 +exit 255 +fi + + if test x$as_have_required = xno; then : + $as_echo "$0: This script requires a shell more modern than all" + $as_echo "$0: the shells that I found on your system." + if test x${ZSH_VERSION+set} = xset ; then + $as_echo "$0: In particular, zsh $ZSH_VERSION has bugs and should" + $as_echo "$0: be upgraded to zsh 4.3.4 or later." + else + $as_echo "$0: Please tell bug-autoconf@gnu.org about your system, +$0: including any error possibly output before this +$0: message. Then install a modern shell, or manually run +$0: the script under such a shell if you do have one." + fi + exit 1 +fi +fi +fi +SHELL=${CONFIG_SHELL-/bin/sh} +export SHELL +# Unset more variables known to interfere with behavior of common tools. +CLICOLOR_FORCE= GREP_OPTIONS= +unset CLICOLOR_FORCE GREP_OPTIONS + +## --------------------- ## +## M4sh Shell Functions. ## +## --------------------- ## +# as_fn_unset VAR +# --------------- +# Portably unset VAR. +as_fn_unset () +{ + { eval $1=; unset $1;} +} +as_unset=as_fn_unset + +# as_fn_set_status STATUS +# ----------------------- +# Set $? to STATUS, without forking. +as_fn_set_status () +{ + return $1 +} # as_fn_set_status + +# as_fn_exit STATUS +# ----------------- +# Exit the shell with STATUS, even in a "trap 0" or "set -e" context. +as_fn_exit () +{ + set +e + as_fn_set_status $1 + exit $1 +} # as_fn_exit + +# as_fn_mkdir_p +# ------------- +# Create "$as_dir" as a directory, including parents if necessary. +as_fn_mkdir_p () +{ + + case $as_dir in #( + -*) as_dir=./$as_dir;; + esac + test -d "$as_dir" || eval $as_mkdir_p || { + as_dirs= + while :; do + case $as_dir in #( + *\'*) as_qdir=`$as_echo "$as_dir" | sed "s/'/'\\\\\\\\''/g"`;; #'( + *) as_qdir=$as_dir;; + esac + as_dirs="'$as_qdir' $as_dirs" + as_dir=`$as_dirname -- "$as_dir" || +$as_expr X"$as_dir" : 'X\(.*[^/]\)//*[^/][^/]*/*$' \| \ + X"$as_dir" : 'X\(//\)[^/]' \| \ + X"$as_dir" : 'X\(//\)$' \| \ + X"$as_dir" : 'X\(/\)' \| . 2>/dev/null || +$as_echo X"$as_dir" | + sed '/^X\(.*[^/]\)\/\/*[^/][^/]*\/*$/{ + s//\1/ + q + } + /^X\(\/\/\)[^/].*/{ + s//\1/ + q + } + /^X\(\/\/\)$/{ + s//\1/ + q + } + /^X\(\/\).*/{ + s//\1/ + q + } + s/.*/./; q'` + test -d "$as_dir" && break + done + test -z "$as_dirs" || eval "mkdir $as_dirs" + } || test -d "$as_dir" || as_fn_error $? "cannot create directory $as_dir" + + +} # as_fn_mkdir_p + +# as_fn_executable_p FILE +# ----------------------- +# Test if FILE is an executable regular file. +as_fn_executable_p () +{ + test -f "$1" && test -x "$1" +} # as_fn_executable_p +# as_fn_append VAR VALUE +# ---------------------- +# Append the text in VALUE to the end of the definition contained in VAR. Take +# advantage of any shell optimizations that allow amortized linear growth over +# repeated appends, instead of the typical quadratic growth present in naive +# implementations. +if (eval "as_var=1; as_var+=2; test x\$as_var = x12") 2>/dev/null; then : + eval 'as_fn_append () + { + eval $1+=\$2 + }' +else + as_fn_append () + { + eval $1=\$$1\$2 + } +fi # as_fn_append + +# as_fn_arith ARG... +# ------------------ +# Perform arithmetic evaluation on the ARGs, and store the result in the +# global $as_val. Take advantage of shells that can avoid forks. The arguments +# must be portable across $(()) and expr. +if (eval "test \$(( 1 + 1 )) = 2") 2>/dev/null; then : + eval 'as_fn_arith () + { + as_val=$(( $* )) + }' +else + as_fn_arith () + { + as_val=`expr "$@" || test $? -eq 1` + } +fi # as_fn_arith + + +# as_fn_error STATUS ERROR [LINENO LOG_FD] +# ---------------------------------------- +# Output "`basename $0`: error: ERROR" to stderr. If LINENO and LOG_FD are +# provided, also output the error to LOG_FD, referencing LINENO. Then exit the +# script with STATUS, using 1 if that was 0. +as_fn_error () +{ + as_status=$1; test $as_status -eq 0 && as_status=1 + if test "$4"; then + as_lineno=${as_lineno-"$3"} as_lineno_stack=as_lineno_stack=$as_lineno_stack + $as_echo "$as_me:${as_lineno-$LINENO}: error: $2" >&$4 + fi + $as_echo "$as_me: error: $2" >&2 + as_fn_exit $as_status +} # as_fn_error + +if expr a : '\(a\)' >/dev/null 2>&1 && + test "X`expr 00001 : '.*\(...\)'`" = X001; then + as_expr=expr +else + as_expr=false +fi + +if (basename -- /) >/dev/null 2>&1 && test "X`basename -- / 2>&1`" = "X/"; then + as_basename=basename +else + as_basename=false +fi + +if (as_dir=`dirname -- /` && test "X$as_dir" = X/) >/dev/null 2>&1; then + as_dirname=dirname +else + as_dirname=false +fi + +as_me=`$as_basename -- "$0" || +$as_expr X/"$0" : '.*/\([^/][^/]*\)/*$' \| \ + X"$0" : 'X\(//\)$' \| \ + X"$0" : 'X\(/\)' \| . 2>/dev/null || +$as_echo X/"$0" | + sed '/^.*\/\([^/][^/]*\)\/*$/{ + s//\1/ + q + } + /^X\/\(\/\/\)$/{ + s//\1/ + q + } + /^X\/\(\/\).*/{ + s//\1/ + q + } + s/.*/./; q'` + +# Avoid depending upon Character Ranges. +as_cr_letters='abcdefghijklmnopqrstuvwxyz' +as_cr_LETTERS='ABCDEFGHIJKLMNOPQRSTUVWXYZ' +as_cr_Letters=$as_cr_letters$as_cr_LETTERS +as_cr_digits='0123456789' +as_cr_alnum=$as_cr_Letters$as_cr_digits + + + as_lineno_1=$LINENO as_lineno_1a=$LINENO + as_lineno_2=$LINENO as_lineno_2a=$LINENO + eval 'test "x$as_lineno_1'$as_run'" != "x$as_lineno_2'$as_run'" && + test "x`expr $as_lineno_1'$as_run' + 1`" = "x$as_lineno_2'$as_run'"' || { + # Blame Lee E. McMahon (1931-1989) for sed's syntax. :-) + sed -n ' + p + /[$]LINENO/= + ' <$as_myself | + sed ' + s/[$]LINENO.*/&-/ + t lineno + b + :lineno + N + :loop + s/[$]LINENO\([^'$as_cr_alnum'_].*\n\)\(.*\)/\2\1\2/ + t loop + s/-\n.*// + ' >$as_me.lineno && + chmod +x "$as_me.lineno" || + { $as_echo "$as_me: error: cannot create $as_me.lineno; rerun with a POSIX shell" >&2; as_fn_exit 1; } + + # If we had to re-execute with $CONFIG_SHELL, we're ensured to have + # already done that, so ensure we don't try to do so again and fall + # in an infinite loop. This has already happened in practice. + _as_can_reexec=no; export _as_can_reexec + # Don't try to exec as it changes $[0], causing all sort of problems + # (the dirname of $[0] is not the place where we might find the + # original and so on. Autoconf is especially sensitive to this). + . "./$as_me.lineno" + # Exit status is that of the last command. + exit +} + +ECHO_C= ECHO_N= ECHO_T= +case `echo -n x` in #((((( +-n*) + case `echo 'xy\c'` in + *c*) ECHO_T=' ';; # ECHO_T is single tab character. + xy) ECHO_C='\c';; + *) echo `echo ksh88 bug on AIX 6.1` > /dev/null + ECHO_T=' ';; + esac;; +*) + ECHO_N='-n';; +esac + +rm -f conf$$ conf$$.exe conf$$.file +if test -d conf$$.dir; then + rm -f conf$$.dir/conf$$.file +else + rm -f conf$$.dir + mkdir conf$$.dir 2>/dev/null +fi +if (echo >conf$$.file) 2>/dev/null; then + if ln -s conf$$.file conf$$ 2>/dev/null; then + as_ln_s='ln -s' + # ... but there are two gotchas: + # 1) On MSYS, both `ln -s file dir' and `ln file dir' fail. + # 2) DJGPP < 2.04 has no symlinks; `ln -s' creates a wrapper executable. + # In both cases, we have to default to `cp -pR'. + ln -s conf$$.file conf$$.dir 2>/dev/null && test ! -f conf$$.exe || + as_ln_s='cp -pR' + elif ln conf$$.file conf$$ 2>/dev/null; then + as_ln_s=ln + else + as_ln_s='cp -pR' + fi +else + as_ln_s='cp -pR' +fi +rm -f conf$$ conf$$.exe conf$$.dir/conf$$.file conf$$.file +rmdir conf$$.dir 2>/dev/null + +if mkdir -p . 2>/dev/null; then + as_mkdir_p='mkdir -p "$as_dir"' +else + test -d ./-p && rmdir ./-p + as_mkdir_p=false +fi + +as_test_x='test -x' +as_executable_p=as_fn_executable_p + +# Sed expression to map a string onto a valid CPP name. +as_tr_cpp="eval sed 'y%*$as_cr_letters%P$as_cr_LETTERS%;s%[^_$as_cr_alnum]%_%g'" + +# Sed expression to map a string onto a valid variable name. +as_tr_sh="eval sed 'y%*+%pp%;s%[^_$as_cr_alnum]%_%g'" + + +test -n "$DJDIR" || exec 7<&0 &1 + +# Name of the host. +# hostname on some systems (SVR3.2, old GNU/Linux) returns a bogus exit status, +# so uname gets run too. +ac_hostname=`(hostname || uname -n) 2>/dev/null | sed 1q` + +# +# Initializations. +# +ac_default_prefix=/usr/local +ac_clean_files= +ac_config_libobj_dir=. +LIBOBJS= +cross_compiling=no +subdirs= +MFLAGS= +MAKEFLAGS= + +# Identity of this package. +PACKAGE_NAME='viking' +PACKAGE_TARNAME='viking' +PACKAGE_VERSION='1.7' +PACKAGE_STRING='viking 1.7' +PACKAGE_BUGREPORT='' +PACKAGE_URL='http://viking.sf.net/' + +# Factoring default headers for most tests. +ac_includes_default="\ +#include +#ifdef HAVE_SYS_TYPES_H +# include +#endif +#ifdef HAVE_SYS_STAT_H +# include +#endif +#ifdef STDC_HEADERS +# include +# include +#else +# ifdef HAVE_STDLIB_H +# include +# endif +#endif +#ifdef HAVE_STRING_H +# if !defined STDC_HEADERS && defined HAVE_MEMORY_H +# include +# endif +# include +#endif +#ifdef HAVE_STRINGS_H +# include +#endif +#ifdef HAVE_INTTYPES_H +# include +#endif +#ifdef HAVE_STDINT_H +# include +#endif +#ifdef HAVE_UNISTD_H +# include +#endif" + +gt_needs= +ac_subst_vars='am__EXEEXT_FALSE +am__EXEEXT_TRUE +LTLIBOBJS +LIBOBJS +ISODATE +GEN_MANPAGES_FALSE +GEN_MANPAGES_TRUE +HAVE_SCROLLKEEPER +HAVE_XSLTPROC_FALSE +HAVE_XSLTPROC_TRUE +XP +DB2MAN_XSL +MAPNIK_FALSE +MAPNIK_TRUE +CXXCPP +am__fastdepCXX_FALSE +am__fastdepCXX_TRUE +CXXDEPMODE +ac_ct_CXX +CXXFLAGS +CXX +MD5_HASH_FALSE +MD5_HASH_TRUE +ZIP_FALSE +ZIP_TRUE +LIBZIP_LIBS +LIBZIP_CFLAGS +SQLITE_FALSE +SQLITE_TRUE +MAGIC_FALSE +MAGIC_TRUE +BZIP2_FALSE +BZIP2_TRUE +REALTIME_GPS_TRACKING_FALSE +REALTIME_GPS_TRACKING_TRUE +OAUTH_FALSE +OAUTH_TRUE +DEM24K_FALSE +DEM24K_TRUE +LIBEXIF_FALSE +LIBEXIF_TRUE +GEXIV2_FALSE +GEXIV2_TRUE +GEOTAG_FALSE +GEOTAG_TRUE +GEOCLUE_FALSE +GEOCLUE_TRUE +LIBGEOCLUE_LIBS +LIBGEOCLUE_CFLAGS +GEOCACHES_FALSE +GEOCACHES_TRUE +GEONAMES_FALSE +GEONAMES_TRUE +BLUEMARBLE_FALSE +BLUEMARBLE_TRUE +OPENSTREETMAP_FALSE +OPENSTREETMAP_TRUE +EXPEDIA_FALSE +EXPEDIA_TRUE +TERRASERVER_FALSE +TERRASERVER_TRUE +GOOGLE_FALSE +GOOGLE_TRUE +BING_FALSE +BING_TRUE +HAVE_GNOME_DOC_UTILS_FALSE +HAVE_GNOME_DOC_UTILS_TRUE +DISTCHECK_CONFIGURE_FLAGS +ENABLE_SK_FALSE +ENABLE_SK_TRUE +DOC_USER_FORMATS +OMF_DIR +HELP_DIR +LN_S +PACKAGE_LIBS +PACKAGE_CFLAGS +GDK_PIXBUF_CSOURCE +LIBCURL +LIBCURL_CPPFLAGS +_libcurl_config +EXPAT_LIBS +EXPAT_CFLAGS +EXPAT_INSTALLED_FALSE +EXPAT_INSTALLED_TRUE +WINDOWS_FALSE +WINDOWS_TRUE +ACLOCAL_AMFLAGS +CONFIG_STATUS_DEPENDENCIES +ALL_LINGUAS +INTLTOOL_PERL +INTLTOOL_POLICY_RULE +INTLTOOL_SERVICE_RULE +INTLTOOL_THEME_RULE +INTLTOOL_SCHEMAS_RULE +INTLTOOL_CAVES_RULE +INTLTOOL_XML_NOMERGE_RULE +INTLTOOL_XML_RULE +INTLTOOL_KBD_RULE +INTLTOOL_XAM_RULE +INTLTOOL_UI_RULE +INTLTOOL_SOUNDLIST_RULE +INTLTOOL_SHEET_RULE +INTLTOOL_SERVER_RULE +INTLTOOL_PONG_RULE +INTLTOOL_OAF_RULE +INTLTOOL_PROP_RULE +INTLTOOL_KEYS_RULE +INTLTOOL_DIRECTORY_RULE +INTLTOOL_DESKTOP_RULE +intltool__v_merge_options_0 +intltool__v_merge_options_ +INTLTOOL_V_MERGE_OPTIONS +INTLTOOL__v_MERGE_0 +INTLTOOL__v_MERGE_ +INTLTOOL_V_MERGE +INTLTOOL_EXTRACT +INTLTOOL_MERGE +INTLTOOL_UPDATE +LTLIBINTL +LIBINTL +LTLIBICONV +LIBICONV +XGETTEXT_EXTRA_OPTIONS +MSGMERGE +XGETTEXT_015 +GMSGFMT_015 +MSGFMT_015 +GETTEXT_MACRO_VERSION +MKINSTALLDIRS +POSUB +POFILES +PO_IN_DATADIR_FALSE +PO_IN_DATADIR_TRUE +INTLLIBS +INSTOBJEXT +GMOFILES +DATADIRNAME +CATOBJEXT +CATALOGS +XGETTEXT +GMSGFMT +MSGFMT_OPTS +MSGFMT +INTL_MACOSX_LIBS +USE_NLS +EGREP +GREP +CPP +GETTEXT_PACKAGE +GLIB_MKENUMS +RANLIB +am__fastdepCC_FALSE +am__fastdepCC_TRUE +CCDEPMODE +am__nodep +AMDEPBACKSLASH +AMDEP_FALSE +AMDEP_TRUE +am__include +DEPDIR +OBJEXT +EXEEXT +ac_ct_CC +CPPFLAGS +LDFLAGS +CFLAGS +CC +GTK_DOC_USE_REBASE_FALSE +GTK_DOC_USE_REBASE_TRUE +GTK_DOC_USE_LIBTOOL_FALSE +GTK_DOC_USE_LIBTOOL_TRUE +GTK_DOC_BUILD_PDF_FALSE +GTK_DOC_BUILD_PDF_TRUE +GTK_DOC_BUILD_HTML_FALSE +GTK_DOC_BUILD_HTML_TRUE +ENABLE_GTK_DOC_FALSE +ENABLE_GTK_DOC_TRUE +HAVE_GTK_DOC_FALSE +HAVE_GTK_DOC_TRUE +GTKDOC_DEPS_LIBS +GTKDOC_DEPS_CFLAGS +HTML_DIR +GTKDOC_MKPDF +GTKDOC_REBASE +GTKDOC_CHECK_PATH +GTKDOC_CHECK +PKG_CONFIG_LIBDIR +PKG_CONFIG_PATH +PKG_CONFIG +AM_BACKSLASH +AM_DEFAULT_VERBOSITY +AM_DEFAULT_V +AM_V +am__untar +am__tar +AMTAR +am__leading_dot +SET_MAKE +AWK +mkdir_p +MKDIR_P +INSTALL_STRIP_PROGRAM +STRIP +install_sh +MAKEINFO +AUTOHEADER +AUTOMAKE +AUTOCONF +ACLOCAL +VERSION +PACKAGE +CYGPATH_W +am__isrc +INSTALL_DATA +INSTALL_SCRIPT +INSTALL_PROGRAM +target_os +target_vendor +target_cpu +target +host_os +host_vendor +host_cpu +host +build_os +build_vendor +build_cpu +build +target_alias +host_alias +build_alias +LIBS +ECHO_T +ECHO_N +ECHO_C +DEFS +mandir +localedir +libdir +psdir +pdfdir +dvidir +htmldir +infodir +docdir +oldincludedir +includedir +runstatedir +localstatedir +sharedstatedir +sysconfdir +datadir +datarootdir +libexecdir +sbindir +bindir +program_transform_name +prefix +exec_prefix +PACKAGE_URL +PACKAGE_BUGREPORT +PACKAGE_STRING +PACKAGE_VERSION +PACKAGE_TARNAME +PACKAGE_NAME +PATH_SEPARATOR +SHELL +am__quote' +ac_subst_files='' +ac_user_opts=' +enable_option_checking +enable_silent_rules +with_html_dir +enable_gtk_doc +enable_gtk_doc_html +enable_gtk_doc_pdf +enable_dependency_tracking +enable_nls +with_gnu_ld +enable_rpath +with_libiconv_prefix +with_libintl_prefix +enable_windows +with_expat +with_libcurl +with_help_dir +with_omf_dir +with_help_formats +enable_scrollkeeper +enable_deprecations +enable_bing +enable_google +enable_terraserver +enable_expedia +enable_openstreetmap +enable_bluemarble +enable_geonames +enable_geocaches +enable_geoclue +with_libexif +enable_geotag +enable_dem24k +enable_oauth +enable_realtime_gps_tracking +enable_bzip2 +enable_magic +enable_mbtiles +enable_zip +enable_nettle +enable_mapnik +with_mapbox_access_token +with_thunderforest_apikey +with_geonames_username +with_mapcache +with_tileage +' + ac_precious_vars='build_alias +host_alias +target_alias +PKG_CONFIG +PKG_CONFIG_PATH +PKG_CONFIG_LIBDIR +GTKDOC_DEPS_CFLAGS +GTKDOC_DEPS_LIBS +CC +CFLAGS +LDFLAGS +LIBS +CPPFLAGS +CPP +PACKAGE_CFLAGS +PACKAGE_LIBS +LIBGEOCLUE_CFLAGS +LIBGEOCLUE_LIBS +LIBZIP_CFLAGS +LIBZIP_LIBS +CXX +CXXFLAGS +CCC +CXXCPP' + + +# Initialize some variables set by options. +ac_init_help= +ac_init_version=false +ac_unrecognized_opts= +ac_unrecognized_sep= +# The variables have the same names as the options, with +# dashes changed to underlines. +cache_file=/dev/null +exec_prefix=NONE +no_create= +no_recursion= +prefix=NONE +program_prefix=NONE +program_suffix=NONE +program_transform_name=s,x,x, +silent= +site= +srcdir= +verbose= +x_includes=NONE +x_libraries=NONE + +# Installation directory options. +# These are left unexpanded so users can "make install exec_prefix=/foo" +# and all the variables that are supposed to be based on exec_prefix +# by default will actually change. +# Use braces instead of parens because sh, perl, etc. also accept them. +# (The list follows the same order as the GNU Coding Standards.) +bindir='${exec_prefix}/bin' +sbindir='${exec_prefix}/sbin' +libexecdir='${exec_prefix}/libexec' +datarootdir='${prefix}/share' +datadir='${datarootdir}' +sysconfdir='${prefix}/etc' +sharedstatedir='${prefix}/com' +localstatedir='${prefix}/var' +runstatedir='${localstatedir}/run' +includedir='${prefix}/include' +oldincludedir='/usr/include' +docdir='${datarootdir}/doc/${PACKAGE_TARNAME}' +infodir='${datarootdir}/info' +htmldir='${docdir}' +dvidir='${docdir}' +pdfdir='${docdir}' +psdir='${docdir}' +libdir='${exec_prefix}/lib' +localedir='${datarootdir}/locale' +mandir='${datarootdir}/man' + +ac_prev= +ac_dashdash= +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=`expr "X$ac_option" : '[^=]*=\(.*\)'` ;; + *=) ac_optarg= ;; + *) ac_optarg=yes ;; + esac + + # Accept the important Cygnus configure options, so we can diagnose typos. + + case $ac_dashdash$ac_option in + --) + ac_dashdash=yes ;; + + -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_alias ;; + -build=* | --build=* | --buil=* | --bui=* | --bu=*) + build_alias=$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 ;; + + --config-cache | -C) + cache_file=config.cache ;; + + -datadir | --datadir | --datadi | --datad) + ac_prev=datadir ;; + -datadir=* | --datadir=* | --datadi=* | --datad=*) + datadir=$ac_optarg ;; + + -datarootdir | --datarootdir | --datarootdi | --datarootd | --dataroot \ + | --dataroo | --dataro | --datar) + ac_prev=datarootdir ;; + -datarootdir=* | --datarootdir=* | --datarootdi=* | --datarootd=* \ + | --dataroot=* | --dataroo=* | --dataro=* | --datar=*) + datarootdir=$ac_optarg ;; + + -disable-* | --disable-*) + ac_useropt=`expr "x$ac_option" : 'x-*disable-\(.*\)'` + # Reject names that are not valid shell variable names. + expr "x$ac_useropt" : ".*[^-+._$as_cr_alnum]" >/dev/null && + as_fn_error $? "invalid feature name: $ac_useropt" + ac_useropt_orig=$ac_useropt + ac_useropt=`$as_echo "$ac_useropt" | sed 's/[-+.]/_/g'` + case $ac_user_opts in + *" +"enable_$ac_useropt" +"*) ;; + *) ac_unrecognized_opts="$ac_unrecognized_opts$ac_unrecognized_sep--disable-$ac_useropt_orig" + ac_unrecognized_sep=', ';; + esac + eval enable_$ac_useropt=no ;; + + -docdir | --docdir | --docdi | --doc | --do) + ac_prev=docdir ;; + -docdir=* | --docdir=* | --docdi=* | --doc=* | --do=*) + docdir=$ac_optarg ;; + + -dvidir | --dvidir | --dvidi | --dvid | --dvi | --dv) + ac_prev=dvidir ;; + -dvidir=* | --dvidir=* | --dvidi=* | --dvid=* | --dvi=* | --dv=*) + dvidir=$ac_optarg ;; + + -enable-* | --enable-*) + ac_useropt=`expr "x$ac_option" : 'x-*enable-\([^=]*\)'` + # Reject names that are not valid shell variable names. + expr "x$ac_useropt" : ".*[^-+._$as_cr_alnum]" >/dev/null && + as_fn_error $? "invalid feature name: $ac_useropt" + ac_useropt_orig=$ac_useropt + ac_useropt=`$as_echo "$ac_useropt" | sed 's/[-+.]/_/g'` + case $ac_user_opts in + *" +"enable_$ac_useropt" +"*) ;; + *) ac_unrecognized_opts="$ac_unrecognized_opts$ac_unrecognized_sep--enable-$ac_useropt_orig" + ac_unrecognized_sep=', ';; + esac + eval enable_$ac_useropt=\$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 | -h) + ac_init_help=long ;; + -help=r* | --help=r* | --hel=r* | --he=r* | -hr*) + ac_init_help=recursive ;; + -help=s* | --help=s* | --hel=s* | --he=s* | -hs*) + ac_init_help=short ;; + + -host | --host | --hos | --ho) + ac_prev=host_alias ;; + -host=* | --host=* | --hos=* | --ho=*) + host_alias=$ac_optarg ;; + + -htmldir | --htmldir | --htmldi | --htmld | --html | --htm | --ht) + ac_prev=htmldir ;; + -htmldir=* | --htmldir=* | --htmldi=* | --htmld=* | --html=* | --htm=* \ + | --ht=*) + htmldir=$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 ;; + + -localedir | --localedir | --localedi | --localed | --locale) + ac_prev=localedir ;; + -localedir=* | --localedir=* | --localedi=* | --localed=* | --locale=*) + localedir=$ac_optarg ;; + + -localstatedir | --localstatedir | --localstatedi | --localstated \ + | --localstate | --localstat | --localsta | --localst | --locals) + ac_prev=localstatedir ;; + -localstatedir=* | --localstatedir=* | --localstatedi=* | --localstated=* \ + | --localstate=* | --localstat=* | --localsta=* | --localst=* | --locals=*) + 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 | -n) + 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 ;; + + -pdfdir | --pdfdir | --pdfdi | --pdfd | --pdf | --pd) + ac_prev=pdfdir ;; + -pdfdir=* | --pdfdir=* | --pdfdi=* | --pdfd=* | --pdf=* | --pd=*) + pdfdir=$ac_optarg ;; + + -psdir | --psdir | --psdi | --psd | --ps) + ac_prev=psdir ;; + -psdir=* | --psdir=* | --psdi=* | --psd=* | --ps=*) + psdir=$ac_optarg ;; + + -q | -quiet | --quiet | --quie | --qui | --qu | --q \ + | -silent | --silent | --silen | --sile | --sil) + silent=yes ;; + + -runstatedir | --runstatedir | --runstatedi | --runstated \ + | --runstate | --runstat | --runsta | --runst | --runs \ + | --run | --ru | --r) + ac_prev=runstatedir ;; + -runstatedir=* | --runstatedir=* | --runstatedi=* | --runstated=* \ + | --runstate=* | --runstat=* | --runsta=* | --runst=* | --runs=* \ + | --run=* | --ru=* | --r=*) + runstatedir=$ac_optarg ;; + + -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_alias ;; + -target=* | --target=* | --targe=* | --targ=* | --tar=* | --ta=* | --t=*) + target_alias=$ac_optarg ;; + + -v | -verbose | --verbose | --verbos | --verbo | --verb) + verbose=yes ;; + + -version | --version | --versio | --versi | --vers | -V) + ac_init_version=: ;; + + -with-* | --with-*) + ac_useropt=`expr "x$ac_option" : 'x-*with-\([^=]*\)'` + # Reject names that are not valid shell variable names. + expr "x$ac_useropt" : ".*[^-+._$as_cr_alnum]" >/dev/null && + as_fn_error $? "invalid package name: $ac_useropt" + ac_useropt_orig=$ac_useropt + ac_useropt=`$as_echo "$ac_useropt" | sed 's/[-+.]/_/g'` + case $ac_user_opts in + *" +"with_$ac_useropt" +"*) ;; + *) ac_unrecognized_opts="$ac_unrecognized_opts$ac_unrecognized_sep--with-$ac_useropt_orig" + ac_unrecognized_sep=', ';; + esac + eval with_$ac_useropt=\$ac_optarg ;; + + -without-* | --without-*) + ac_useropt=`expr "x$ac_option" : 'x-*without-\(.*\)'` + # Reject names that are not valid shell variable names. + expr "x$ac_useropt" : ".*[^-+._$as_cr_alnum]" >/dev/null && + as_fn_error $? "invalid package name: $ac_useropt" + ac_useropt_orig=$ac_useropt + ac_useropt=`$as_echo "$ac_useropt" | sed 's/[-+.]/_/g'` + case $ac_user_opts in + *" +"with_$ac_useropt" +"*) ;; + *) ac_unrecognized_opts="$ac_unrecognized_opts$ac_unrecognized_sep--without-$ac_useropt_orig" + ac_unrecognized_sep=', ';; + esac + eval with_$ac_useropt=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 ;; + + -*) as_fn_error $? "unrecognized option: \`$ac_option' +Try \`$0 --help' for more information" + ;; + + *=*) + ac_envvar=`expr "x$ac_option" : 'x\([^=]*\)='` + # Reject names that are not valid shell variable names. + case $ac_envvar in #( + '' | [0-9]* | *[!_$as_cr_alnum]* ) + as_fn_error $? "invalid variable name: \`$ac_envvar'" ;; + esac + eval $ac_envvar=\$ac_optarg + export $ac_envvar ;; + + *) + # FIXME: should be removed in autoconf 3.0. + $as_echo "$as_me: WARNING: you should use --build, --host, --target" >&2 + expr "x$ac_option" : ".*[^-._$as_cr_alnum]" >/dev/null && + $as_echo "$as_me: WARNING: invalid host type: $ac_option" >&2 + : "${build_alias=$ac_option} ${host_alias=$ac_option} ${target_alias=$ac_option}" + ;; + + esac +done + +if test -n "$ac_prev"; then + ac_option=--`echo $ac_prev | sed 's/_/-/g'` + as_fn_error $? "missing argument to $ac_option" +fi + +if test -n "$ac_unrecognized_opts"; then + case $enable_option_checking in + no) ;; + fatal) as_fn_error $? "unrecognized options: $ac_unrecognized_opts" ;; + *) $as_echo "$as_me: WARNING: unrecognized options: $ac_unrecognized_opts" >&2 ;; + esac +fi + +# Check all directory arguments for consistency. +for ac_var in exec_prefix prefix bindir sbindir libexecdir datarootdir \ + datadir sysconfdir sharedstatedir localstatedir includedir \ + oldincludedir docdir infodir htmldir dvidir pdfdir psdir \ + libdir localedir mandir runstatedir +do + eval ac_val=\$$ac_var + # Remove trailing slashes. + case $ac_val in + */ ) + ac_val=`expr "X$ac_val" : 'X\(.*[^/]\)' \| "X$ac_val" : 'X\(.*\)'` + eval $ac_var=\$ac_val;; + esac + # Be sure to have absolute directory names. + case $ac_val in + [\\/$]* | ?:[\\/]* ) continue;; + NONE | '' ) case $ac_var in *prefix ) continue;; esac;; + esac + as_fn_error $? "expected an absolute directory name for --$ac_var: $ac_val" +done + +# There might be people who depend on the old broken behavior: `$host' +# used to hold the argument of --host etc. +# FIXME: To remove some day. +build=$build_alias +host=$host_alias +target=$target_alias + +# FIXME: To remove some day. +if test "x$host_alias" != x; then + if test "x$build_alias" = x; then + cross_compiling=maybe + elif test "x$build_alias" != "x$host_alias"; then + cross_compiling=yes + fi +fi + +ac_tool_prefix= +test -n "$host_alias" && ac_tool_prefix=$host_alias- + +test "$silent" = yes && exec 6>/dev/null + + +ac_pwd=`pwd` && test -n "$ac_pwd" && +ac_ls_di=`ls -di .` && +ac_pwd_ls_di=`cd "$ac_pwd" && ls -di .` || + as_fn_error $? "working directory cannot be determined" +test "X$ac_ls_di" = "X$ac_pwd_ls_di" || + as_fn_error $? "pwd does not report name of working directory" + + +# 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 the parent directory. + ac_confdir=`$as_dirname -- "$as_myself" || +$as_expr X"$as_myself" : 'X\(.*[^/]\)//*[^/][^/]*/*$' \| \ + X"$as_myself" : 'X\(//\)[^/]' \| \ + X"$as_myself" : 'X\(//\)$' \| \ + X"$as_myself" : 'X\(/\)' \| . 2>/dev/null || +$as_echo X"$as_myself" | + sed '/^X\(.*[^/]\)\/\/*[^/][^/]*\/*$/{ + s//\1/ + q + } + /^X\(\/\/\)[^/].*/{ + s//\1/ + q + } + /^X\(\/\/\)$/{ + s//\1/ + q + } + /^X\(\/\).*/{ + s//\1/ + q + } + s/.*/./; q'` + 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 + test "$ac_srcdir_defaulted" = yes && srcdir="$ac_confdir or .." + as_fn_error $? "cannot find sources ($ac_unique_file) in $srcdir" +fi +ac_msg="sources are in $srcdir, but \`cd $srcdir' does not work" +ac_abs_confdir=`( + cd "$srcdir" && test -r "./$ac_unique_file" || as_fn_error $? "$ac_msg" + pwd)` +# When building in place, set srcdir=. +if test "$ac_abs_confdir" = "$ac_pwd"; then + srcdir=. +fi +# Remove unnecessary trailing slashes from srcdir. +# Double slashes in file names in object file debugging info +# mess up M-x gdb in Emacs. +case $srcdir in +*/) srcdir=`expr "X$srcdir" : 'X\(.*[^/]\)' \| "X$srcdir" : 'X\(.*\)'`;; +esac +for ac_var in $ac_precious_vars; do + eval ac_env_${ac_var}_set=\${${ac_var}+set} + eval ac_env_${ac_var}_value=\$${ac_var} + eval ac_cv_env_${ac_var}_set=\${${ac_var}+set} + eval ac_cv_env_${ac_var}_value=\$${ac_var} +done + +# +# Report the --help message. +# +if test "$ac_init_help" = "long"; then + # 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 <<_ACEOF +\`configure' configures viking 1.7 to adapt to many kinds of systems. + +Usage: $0 [OPTION]... [VAR=VALUE]... + +To assign environment variables (e.g., CC, CFLAGS...), specify them as +VAR=VALUE. See below for descriptions of some of the useful variables. + +Defaults for the options are specified in brackets. + +Configuration: + -h, --help display this help and exit + --help=short display options specific to this package + --help=recursive display the short help of all the included packages + -V, --version display version information and exit + -q, --quiet, --silent do not print \`checking ...' messages + --cache-file=FILE cache test results in FILE [disabled] + -C, --config-cache alias for \`--cache-file=config.cache' + -n, --no-create do not create output files + --srcdir=DIR find the sources in DIR [configure dir or \`..'] + +Installation directories: + --prefix=PREFIX install architecture-independent files in PREFIX + [$ac_default_prefix] + --exec-prefix=EPREFIX install architecture-dependent files in EPREFIX + [PREFIX] + +By default, \`make install' will install all the files in +\`$ac_default_prefix/bin', \`$ac_default_prefix/lib' etc. You can specify +an installation prefix other than \`$ac_default_prefix' using \`--prefix', +for instance \`--prefix=\$HOME'. + +For better control, use the options below. + +Fine tuning of the installation directories: + --bindir=DIR user executables [EPREFIX/bin] + --sbindir=DIR system admin executables [EPREFIX/sbin] + --libexecdir=DIR program executables [EPREFIX/libexec] + --sysconfdir=DIR read-only single-machine data [PREFIX/etc] + --sharedstatedir=DIR modifiable architecture-independent data [PREFIX/com] + --localstatedir=DIR modifiable single-machine data [PREFIX/var] + --runstatedir=DIR modifiable per-process data [LOCALSTATEDIR/run] + --libdir=DIR object code libraries [EPREFIX/lib] + --includedir=DIR C header files [PREFIX/include] + --oldincludedir=DIR C header files for non-gcc [/usr/include] + --datarootdir=DIR read-only arch.-independent data root [PREFIX/share] + --datadir=DIR read-only architecture-independent data [DATAROOTDIR] + --infodir=DIR info documentation [DATAROOTDIR/info] + --localedir=DIR locale-dependent data [DATAROOTDIR/locale] + --mandir=DIR man documentation [DATAROOTDIR/man] + --docdir=DIR documentation root [DATAROOTDIR/doc/viking] + --htmldir=DIR html documentation [DOCDIR] + --dvidir=DIR dvi documentation [DOCDIR] + --pdfdir=DIR pdf documentation [DOCDIR] + --psdir=DIR ps documentation [DOCDIR] +_ACEOF + + cat <<\_ACEOF + +Program names: + --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 + +System types: + --build=BUILD configure for building on BUILD [guessed] + --host=HOST cross-compile to build programs to run on HOST [BUILD] + --target=TARGET configure for building compilers for TARGET [HOST] +_ACEOF +fi + +if test -n "$ac_init_help"; then + case $ac_init_help in + short | recursive ) echo "Configuration of viking 1.7:";; + esac + cat <<\_ACEOF + +Optional Features: + --disable-option-checking ignore unrecognized --enable/--with options + --disable-FEATURE do not include FEATURE (same as --enable-FEATURE=no) + --enable-FEATURE[=ARG] include FEATURE [ARG=yes] + --enable-silent-rules less verbose build output (undo: "make V=1") + --disable-silent-rules verbose build output (undo: "make V=0") + --enable-gtk-doc use gtk-doc to build documentation [[default=no]] + --enable-gtk-doc-html build documentation in html format [[default=yes]] + --enable-gtk-doc-pdf build documentation in pdf format [[default=no]] + --enable-dependency-tracking + do not reject slow dependency extractors + --disable-dependency-tracking + speeds up one-time build + --disable-nls do not use Native Language Support + --disable-rpath do not hardcode runtime library paths + --enable-windows Perform specific Windows build steps (default is no) + --disable-scrollkeeper do not make updates to the scrollkeeper database + --enable-deprecations warn about deprecated usages [default=no] + --enable-bing enable Bing stuff (default is enable) + --enable-google enable Google stuff (default is enable) + --enable-terraserver enable Terraserver stuff (default is disabled as the + tileserver is no longer available) + --enable-expedia enable Expedia stuff (default is disable) + --enable-openstreetmap enable OpenStreetMap stuff (default is enable) + --enable-bluemarble enable BlueMarble stuff (default is enable) + --enable-geonames enable Geonames stuff (default is enable) + --enable-geocaches enable Geocaches Acquire (default is disable). + --enable-geoclue enable GeoClue support (default is enable). + --enable-geotag enable Geotag Support (default is enable). + --enable-dem24k enable USGS 24k DEM (default is disable) download + source. Requires dem24k.pl script in path. + --enable-oauth enable OAuth Support (default is enable). + --enable-realtime-gps-tracking + enable realtime GPS tracking (default is enable) + --enable-bzip2 enable bzip2 Support (default is enable). + --enable-magic enable File Magic support via libmagic (default is + enable). + --enable-mbtiles enable MBTiles support via libsqlite3 (default is + enable). + --enable-zip enable zip support (default is enable). + --enable-nettle enable MD5 Hash support (default is enable) + --enable-mapnik enable Mapnik (default is enable) + +Optional Packages: + --with-PACKAGE[=ARG] use PACKAGE [ARG=yes] + --without-PACKAGE do not use PACKAGE (same as --with-PACKAGE=no) + --with-html-dir=PATH path to installed docs + --with-gnu-ld assume the C compiler uses GNU ld default=no + --with-libiconv-prefix[=DIR] search for libiconv in DIR/include and DIR/lib + --without-libiconv-prefix don't search for libiconv in includedir and libdir + --with-libintl-prefix[=DIR] search for libintl in DIR/include and DIR/lib + --without-libintl-prefix don't search for libintl in includedir and libdir + --with-expat=PREFIX Use system Expat library + --with-libcurl=DIR look for the curl library in DIR + --with-help-dir=DIR path to help docs + --with-omf-dir=DIR path to OMF files + --with-help-formats=FORMATS + list of formats + --with-libexif Force usage of libexif instead of libgexiv2 + --with-mapbox_access_token + Access token for MapBox tiles. Please register your + own if you're going to distribute the package, as + requests are limited per token. + --with-thunderforest_apikey + API Key for Thunderforest (OSM Cyclemap) tiles. + Please register your own if you're going to + distribute the package, as requests are limited per + key. + --with-geonames_username + Username for the GeoNames webservice. Please + register your own if you're going to distribute the + package, as requests are limited per username. + --with-mapcache specify the size of the map cache in MB (default is + 128) + --with-tileage specify the age of a tile before checking it + (default is 7 days) + +Some influential environment variables: + PKG_CONFIG path to pkg-config utility + PKG_CONFIG_PATH + directories to add to pkg-config's search path + PKG_CONFIG_LIBDIR + path overriding pkg-config's built-in search path + GTKDOC_DEPS_CFLAGS + C compiler flags for GTKDOC_DEPS, overriding pkg-config + GTKDOC_DEPS_LIBS + linker flags for GTKDOC_DEPS, overriding pkg-config + CC C compiler command + CFLAGS C compiler flags + LDFLAGS linker flags, e.g. -L if you have libraries in a + nonstandard directory + LIBS libraries to pass to the linker, e.g. -l + CPPFLAGS (Objective) C/C++ preprocessor flags, e.g. -I if + you have headers in a nonstandard directory + CPP C preprocessor + PACKAGE_CFLAGS + C compiler flags for PACKAGE, overriding pkg-config + PACKAGE_LIBS + linker flags for PACKAGE, overriding pkg-config + LIBGEOCLUE_CFLAGS + C compiler flags for LIBGEOCLUE, overriding pkg-config + LIBGEOCLUE_LIBS + linker flags for LIBGEOCLUE, overriding pkg-config + LIBZIP_CFLAGS + C compiler flags for LIBZIP, overriding pkg-config + LIBZIP_LIBS linker flags for LIBZIP, overriding pkg-config + CXX C++ compiler command + CXXFLAGS C++ compiler flags + CXXCPP C++ preprocessor + +Use these variables to override the choices made by `configure' or to help +it to find libraries and programs with nonstandard names/locations. + +Report bugs to the package provider. +viking home page: . +_ACEOF +ac_status=$? +fi + +if test "$ac_init_help" = "recursive"; then + # If there are subdirs, report their specific --help. + for ac_dir in : $ac_subdirs_all; do test "x$ac_dir" = x: && continue + test -d "$ac_dir" || + { cd "$srcdir" && ac_pwd=`pwd` && srcdir=. && test -d "$ac_dir"; } || + continue + ac_builddir=. + +case "$ac_dir" in +.) ac_dir_suffix= ac_top_builddir_sub=. ac_top_build_prefix= ;; +*) + ac_dir_suffix=/`$as_echo "$ac_dir" | sed 's|^\.[\\/]||'` + # A ".." for each directory in $ac_dir_suffix. + ac_top_builddir_sub=`$as_echo "$ac_dir_suffix" | sed 's|/[^\\/]*|/..|g;s|/||'` + case $ac_top_builddir_sub in + "") ac_top_builddir_sub=. ac_top_build_prefix= ;; + *) ac_top_build_prefix=$ac_top_builddir_sub/ ;; + esac ;; +esac +ac_abs_top_builddir=$ac_pwd +ac_abs_builddir=$ac_pwd$ac_dir_suffix +# for backward compatibility: +ac_top_builddir=$ac_top_build_prefix + +case $srcdir in + .) # We are building in place. + ac_srcdir=. + ac_top_srcdir=$ac_top_builddir_sub + ac_abs_top_srcdir=$ac_pwd ;; + [\\/]* | ?:[\\/]* ) # Absolute name. + ac_srcdir=$srcdir$ac_dir_suffix; + ac_top_srcdir=$srcdir + ac_abs_top_srcdir=$srcdir ;; + *) # Relative name. + ac_srcdir=$ac_top_build_prefix$srcdir$ac_dir_suffix + ac_top_srcdir=$ac_top_build_prefix$srcdir + ac_abs_top_srcdir=$ac_pwd/$srcdir ;; +esac +ac_abs_srcdir=$ac_abs_top_srcdir$ac_dir_suffix + + cd "$ac_dir" || { ac_status=$?; continue; } + # Check for guested configure. + if test -f "$ac_srcdir/configure.gnu"; then + echo && + $SHELL "$ac_srcdir/configure.gnu" --help=recursive + elif test -f "$ac_srcdir/configure"; then + echo && + $SHELL "$ac_srcdir/configure" --help=recursive + else + $as_echo "$as_me: WARNING: no configuration information is in $ac_dir" >&2 + fi || ac_status=$? + cd "$ac_pwd" || { ac_status=$?; break; } + done +fi + +test -n "$ac_init_help" && exit $ac_status +if $ac_init_version; then + cat <<\_ACEOF +viking configure 1.7 +generated by GNU Autoconf 2.69 + +Copyright (C) 2012 Free Software Foundation, Inc. +This configure script is free software; the Free Software Foundation +gives unlimited permission to copy, distribute and modify it. +_ACEOF + exit +fi + +## ------------------------ ## +## Autoconf initialization. ## +## ------------------------ ## + +# ac_fn_c_try_compile LINENO +# -------------------------- +# Try to compile conftest.$ac_ext, and return whether this succeeded. +ac_fn_c_try_compile () +{ + as_lineno=${as_lineno-"$1"} as_lineno_stack=as_lineno_stack=$as_lineno_stack + rm -f conftest.$ac_objext + if { { ac_try="$ac_compile" +case "(($ac_try" in + *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; + *) ac_try_echo=$ac_try;; +esac +eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\"" +$as_echo "$ac_try_echo"; } >&5 + (eval "$ac_compile") 2>conftest.err + ac_status=$? + if test -s conftest.err; then + grep -v '^ *+' conftest.err >conftest.er1 + cat conftest.er1 >&5 + mv -f conftest.er1 conftest.err + fi + $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 + test $ac_status = 0; } && { + test -z "$ac_c_werror_flag" || + test ! -s conftest.err + } && test -s conftest.$ac_objext; then : + ac_retval=0 +else + $as_echo "$as_me: failed program was:" >&5 +sed 's/^/| /' conftest.$ac_ext >&5 + + ac_retval=1 +fi + eval $as_lineno_stack; ${as_lineno_stack:+:} unset as_lineno + as_fn_set_status $ac_retval + +} # ac_fn_c_try_compile + +# ac_fn_c_try_cpp LINENO +# ---------------------- +# Try to preprocess conftest.$ac_ext, and return whether this succeeded. +ac_fn_c_try_cpp () +{ + as_lineno=${as_lineno-"$1"} as_lineno_stack=as_lineno_stack=$as_lineno_stack + if { { ac_try="$ac_cpp conftest.$ac_ext" +case "(($ac_try" in + *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; + *) ac_try_echo=$ac_try;; +esac +eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\"" +$as_echo "$ac_try_echo"; } >&5 + (eval "$ac_cpp conftest.$ac_ext") 2>conftest.err + ac_status=$? + if test -s conftest.err; then + grep -v '^ *+' conftest.err >conftest.er1 + cat conftest.er1 >&5 + mv -f conftest.er1 conftest.err + fi + $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 + test $ac_status = 0; } > conftest.i && { + test -z "$ac_c_preproc_warn_flag$ac_c_werror_flag" || + test ! -s conftest.err + }; then : + ac_retval=0 +else + $as_echo "$as_me: failed program was:" >&5 +sed 's/^/| /' conftest.$ac_ext >&5 + + ac_retval=1 +fi + eval $as_lineno_stack; ${as_lineno_stack:+:} unset as_lineno + as_fn_set_status $ac_retval + +} # ac_fn_c_try_cpp + +# ac_fn_c_check_header_mongrel LINENO HEADER VAR INCLUDES +# ------------------------------------------------------- +# Tests whether HEADER exists, giving a warning if it cannot be compiled using +# the include files in INCLUDES and setting the cache variable VAR +# accordingly. +ac_fn_c_check_header_mongrel () +{ + as_lineno=${as_lineno-"$1"} as_lineno_stack=as_lineno_stack=$as_lineno_stack + if eval \${$3+:} false; then : + { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $2" >&5 +$as_echo_n "checking for $2... " >&6; } +if eval \${$3+:} false; then : + $as_echo_n "(cached) " >&6 +fi +eval ac_res=\$$3 + { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_res" >&5 +$as_echo "$ac_res" >&6; } +else + # Is the header compilable? +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking $2 usability" >&5 +$as_echo_n "checking $2 usability... " >&6; } +cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ +$4 +#include <$2> +_ACEOF +if ac_fn_c_try_compile "$LINENO"; then : + ac_header_compiler=yes +else + ac_header_compiler=no +fi +rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_header_compiler" >&5 +$as_echo "$ac_header_compiler" >&6; } + +# Is the header present? +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking $2 presence" >&5 +$as_echo_n "checking $2 presence... " >&6; } +cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ +#include <$2> +_ACEOF +if ac_fn_c_try_cpp "$LINENO"; then : + ac_header_preproc=yes +else + ac_header_preproc=no +fi +rm -f conftest.err conftest.i conftest.$ac_ext +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_header_preproc" >&5 +$as_echo "$ac_header_preproc" >&6; } + +# So? What about this header? +case $ac_header_compiler:$ac_header_preproc:$ac_c_preproc_warn_flag in #(( + yes:no: ) + { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: $2: accepted by the compiler, rejected by the preprocessor!" >&5 +$as_echo "$as_me: WARNING: $2: accepted by the compiler, rejected by the preprocessor!" >&2;} + { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: $2: proceeding with the compiler's result" >&5 +$as_echo "$as_me: WARNING: $2: proceeding with the compiler's result" >&2;} + ;; + no:yes:* ) + { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: $2: present but cannot be compiled" >&5 +$as_echo "$as_me: WARNING: $2: present but cannot be compiled" >&2;} + { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: $2: check for missing prerequisite headers?" >&5 +$as_echo "$as_me: WARNING: $2: check for missing prerequisite headers?" >&2;} + { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: $2: see the Autoconf documentation" >&5 +$as_echo "$as_me: WARNING: $2: see the Autoconf documentation" >&2;} + { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: $2: section \"Present But Cannot Be Compiled\"" >&5 +$as_echo "$as_me: WARNING: $2: section \"Present But Cannot Be Compiled\"" >&2;} + { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: $2: proceeding with the compiler's result" >&5 +$as_echo "$as_me: WARNING: $2: proceeding with the compiler's result" >&2;} + ;; +esac + { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $2" >&5 +$as_echo_n "checking for $2... " >&6; } +if eval \${$3+:} false; then : + $as_echo_n "(cached) " >&6 +else + eval "$3=\$ac_header_compiler" +fi +eval ac_res=\$$3 + { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_res" >&5 +$as_echo "$ac_res" >&6; } +fi + eval $as_lineno_stack; ${as_lineno_stack:+:} unset as_lineno + +} # ac_fn_c_check_header_mongrel + +# ac_fn_c_try_run LINENO +# ---------------------- +# Try to link conftest.$ac_ext, and return whether this succeeded. Assumes +# that executables *can* be run. +ac_fn_c_try_run () +{ + as_lineno=${as_lineno-"$1"} as_lineno_stack=as_lineno_stack=$as_lineno_stack + if { { ac_try="$ac_link" +case "(($ac_try" in + *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; + *) ac_try_echo=$ac_try;; +esac +eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\"" +$as_echo "$ac_try_echo"; } >&5 + (eval "$ac_link") 2>&5 + ac_status=$? + $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 + test $ac_status = 0; } && { ac_try='./conftest$ac_exeext' + { { case "(($ac_try" in + *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; + *) ac_try_echo=$ac_try;; +esac +eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\"" +$as_echo "$ac_try_echo"; } >&5 + (eval "$ac_try") 2>&5 + ac_status=$? + $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 + test $ac_status = 0; }; }; then : + ac_retval=0 +else + $as_echo "$as_me: program exited with status $ac_status" >&5 + $as_echo "$as_me: failed program was:" >&5 +sed 's/^/| /' conftest.$ac_ext >&5 + + ac_retval=$ac_status +fi + rm -rf conftest.dSYM conftest_ipa8_conftest.oo + eval $as_lineno_stack; ${as_lineno_stack:+:} unset as_lineno + as_fn_set_status $ac_retval + +} # ac_fn_c_try_run + +# ac_fn_c_check_header_compile LINENO HEADER VAR INCLUDES +# ------------------------------------------------------- +# Tests whether HEADER exists and can be compiled using the include files in +# INCLUDES, setting the cache variable VAR accordingly. +ac_fn_c_check_header_compile () +{ + as_lineno=${as_lineno-"$1"} as_lineno_stack=as_lineno_stack=$as_lineno_stack + { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $2" >&5 +$as_echo_n "checking for $2... " >&6; } +if eval \${$3+:} false; then : + $as_echo_n "(cached) " >&6 +else + cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ +$4 +#include <$2> +_ACEOF +if ac_fn_c_try_compile "$LINENO"; then : + eval "$3=yes" +else + eval "$3=no" +fi +rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext +fi +eval ac_res=\$$3 + { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_res" >&5 +$as_echo "$ac_res" >&6; } + eval $as_lineno_stack; ${as_lineno_stack:+:} unset as_lineno + +} # ac_fn_c_check_header_compile + +# ac_fn_c_try_link LINENO +# ----------------------- +# Try to link conftest.$ac_ext, and return whether this succeeded. +ac_fn_c_try_link () +{ + as_lineno=${as_lineno-"$1"} as_lineno_stack=as_lineno_stack=$as_lineno_stack + rm -f conftest.$ac_objext conftest$ac_exeext + if { { ac_try="$ac_link" +case "(($ac_try" in + *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; + *) ac_try_echo=$ac_try;; +esac +eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\"" +$as_echo "$ac_try_echo"; } >&5 + (eval "$ac_link") 2>conftest.err + ac_status=$? + if test -s conftest.err; then + grep -v '^ *+' conftest.err >conftest.er1 + cat conftest.er1 >&5 + mv -f conftest.er1 conftest.err + fi + $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 + test $ac_status = 0; } && { + test -z "$ac_c_werror_flag" || + test ! -s conftest.err + } && test -s conftest$ac_exeext && { + test "$cross_compiling" = yes || + test -x conftest$ac_exeext + }; then : + ac_retval=0 +else + $as_echo "$as_me: failed program was:" >&5 +sed 's/^/| /' conftest.$ac_ext >&5 + + ac_retval=1 +fi + # Delete the IPA/IPO (Inter Procedural Analysis/Optimization) information + # created by the PGI compiler (conftest_ipa8_conftest.oo), as it would + # interfere with the next link command; also delete a directory that is + # left behind by Apple's compiler. We do this before executing the actions. + rm -rf conftest.dSYM conftest_ipa8_conftest.oo + eval $as_lineno_stack; ${as_lineno_stack:+:} unset as_lineno + as_fn_set_status $ac_retval + +} # ac_fn_c_try_link + +# ac_fn_c_check_func LINENO FUNC VAR +# ---------------------------------- +# Tests whether FUNC exists, setting the cache variable VAR accordingly +ac_fn_c_check_func () +{ + as_lineno=${as_lineno-"$1"} as_lineno_stack=as_lineno_stack=$as_lineno_stack + { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $2" >&5 +$as_echo_n "checking for $2... " >&6; } +if eval \${$3+:} false; then : + $as_echo_n "(cached) " >&6 +else + cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ +/* Define $2 to an innocuous variant, in case declares $2. + For example, HP-UX 11i declares gettimeofday. */ +#define $2 innocuous_$2 + +/* System header to define __stub macros and hopefully few prototypes, + which can conflict with char $2 (); below. + Prefer to if __STDC__ is defined, since + exists even on freestanding compilers. */ + +#ifdef __STDC__ +# include +#else +# include +#endif + +#undef $2 + +/* Override any GCC internal prototype to avoid an error. + Use char because int might match the return type of a GCC + builtin and then its argument prototype would still apply. */ +#ifdef __cplusplus +extern "C" +#endif +char $2 (); +/* The GNU C library defines this for functions which it implements + to always fail with ENOSYS. Some functions are actually named + something starting with __ and the normal name is an alias. */ +#if defined __stub_$2 || defined __stub___$2 +choke me +#endif + +int +main () +{ +return $2 (); + ; + return 0; +} +_ACEOF +if ac_fn_c_try_link "$LINENO"; then : + eval "$3=yes" +else + eval "$3=no" +fi +rm -f core conftest.err conftest.$ac_objext \ + conftest$ac_exeext conftest.$ac_ext +fi +eval ac_res=\$$3 + { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_res" >&5 +$as_echo "$ac_res" >&6; } + eval $as_lineno_stack; ${as_lineno_stack:+:} unset as_lineno + +} # ac_fn_c_check_func + +# ac_fn_c_check_type LINENO TYPE VAR INCLUDES +# ------------------------------------------- +# Tests whether TYPE exists after having included INCLUDES, setting cache +# variable VAR accordingly. +ac_fn_c_check_type () +{ + as_lineno=${as_lineno-"$1"} as_lineno_stack=as_lineno_stack=$as_lineno_stack + { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $2" >&5 +$as_echo_n "checking for $2... " >&6; } +if eval \${$3+:} false; then : + $as_echo_n "(cached) " >&6 +else + eval "$3=no" + cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ +$4 +int +main () +{ +if (sizeof ($2)) + return 0; + ; + return 0; +} +_ACEOF +if ac_fn_c_try_compile "$LINENO"; then : + cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ +$4 +int +main () +{ +if (sizeof (($2))) + return 0; + ; + return 0; +} +_ACEOF +if ac_fn_c_try_compile "$LINENO"; then : + +else + eval "$3=yes" +fi +rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext +fi +rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext +fi +eval ac_res=\$$3 + { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_res" >&5 +$as_echo "$ac_res" >&6; } + eval $as_lineno_stack; ${as_lineno_stack:+:} unset as_lineno + +} # ac_fn_c_check_type + +# ac_fn_cxx_try_compile LINENO +# ---------------------------- +# Try to compile conftest.$ac_ext, and return whether this succeeded. +ac_fn_cxx_try_compile () +{ + as_lineno=${as_lineno-"$1"} as_lineno_stack=as_lineno_stack=$as_lineno_stack + rm -f conftest.$ac_objext + if { { ac_try="$ac_compile" +case "(($ac_try" in + *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; + *) ac_try_echo=$ac_try;; +esac +eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\"" +$as_echo "$ac_try_echo"; } >&5 + (eval "$ac_compile") 2>conftest.err + ac_status=$? + if test -s conftest.err; then + grep -v '^ *+' conftest.err >conftest.er1 + cat conftest.er1 >&5 + mv -f conftest.er1 conftest.err + fi + $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 + test $ac_status = 0; } && { + test -z "$ac_cxx_werror_flag" || + test ! -s conftest.err + } && test -s conftest.$ac_objext; then : + ac_retval=0 +else + $as_echo "$as_me: failed program was:" >&5 +sed 's/^/| /' conftest.$ac_ext >&5 + + ac_retval=1 +fi + eval $as_lineno_stack; ${as_lineno_stack:+:} unset as_lineno + as_fn_set_status $ac_retval + +} # ac_fn_cxx_try_compile + +# ac_fn_cxx_try_cpp LINENO +# ------------------------ +# Try to preprocess conftest.$ac_ext, and return whether this succeeded. +ac_fn_cxx_try_cpp () +{ + as_lineno=${as_lineno-"$1"} as_lineno_stack=as_lineno_stack=$as_lineno_stack + if { { ac_try="$ac_cpp conftest.$ac_ext" +case "(($ac_try" in + *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; + *) ac_try_echo=$ac_try;; +esac +eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\"" +$as_echo "$ac_try_echo"; } >&5 + (eval "$ac_cpp conftest.$ac_ext") 2>conftest.err + ac_status=$? + if test -s conftest.err; then + grep -v '^ *+' conftest.err >conftest.er1 + cat conftest.er1 >&5 + mv -f conftest.er1 conftest.err + fi + $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 + test $ac_status = 0; } > conftest.i && { + test -z "$ac_cxx_preproc_warn_flag$ac_cxx_werror_flag" || + test ! -s conftest.err + }; then : + ac_retval=0 +else + $as_echo "$as_me: failed program was:" >&5 +sed 's/^/| /' conftest.$ac_ext >&5 + + ac_retval=1 +fi + eval $as_lineno_stack; ${as_lineno_stack:+:} unset as_lineno + as_fn_set_status $ac_retval + +} # ac_fn_cxx_try_cpp + +# ac_fn_cxx_check_header_mongrel LINENO HEADER VAR INCLUDES +# --------------------------------------------------------- +# Tests whether HEADER exists, giving a warning if it cannot be compiled using +# the include files in INCLUDES and setting the cache variable VAR +# accordingly. +ac_fn_cxx_check_header_mongrel () +{ + as_lineno=${as_lineno-"$1"} as_lineno_stack=as_lineno_stack=$as_lineno_stack + if eval \${$3+:} false; then : + { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $2" >&5 +$as_echo_n "checking for $2... " >&6; } +if eval \${$3+:} false; then : + $as_echo_n "(cached) " >&6 +fi +eval ac_res=\$$3 + { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_res" >&5 +$as_echo "$ac_res" >&6; } +else + # Is the header compilable? +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking $2 usability" >&5 +$as_echo_n "checking $2 usability... " >&6; } +cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ +$4 +#include <$2> +_ACEOF +if ac_fn_cxx_try_compile "$LINENO"; then : + ac_header_compiler=yes +else + ac_header_compiler=no +fi +rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_header_compiler" >&5 +$as_echo "$ac_header_compiler" >&6; } + +# Is the header present? +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking $2 presence" >&5 +$as_echo_n "checking $2 presence... " >&6; } +cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ +#include <$2> +_ACEOF +if ac_fn_cxx_try_cpp "$LINENO"; then : + ac_header_preproc=yes +else + ac_header_preproc=no +fi +rm -f conftest.err conftest.i conftest.$ac_ext +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_header_preproc" >&5 +$as_echo "$ac_header_preproc" >&6; } + +# So? What about this header? +case $ac_header_compiler:$ac_header_preproc:$ac_cxx_preproc_warn_flag in #(( + yes:no: ) + { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: $2: accepted by the compiler, rejected by the preprocessor!" >&5 +$as_echo "$as_me: WARNING: $2: accepted by the compiler, rejected by the preprocessor!" >&2;} + { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: $2: proceeding with the compiler's result" >&5 +$as_echo "$as_me: WARNING: $2: proceeding with the compiler's result" >&2;} + ;; + no:yes:* ) + { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: $2: present but cannot be compiled" >&5 +$as_echo "$as_me: WARNING: $2: present but cannot be compiled" >&2;} + { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: $2: check for missing prerequisite headers?" >&5 +$as_echo "$as_me: WARNING: $2: check for missing prerequisite headers?" >&2;} + { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: $2: see the Autoconf documentation" >&5 +$as_echo "$as_me: WARNING: $2: see the Autoconf documentation" >&2;} + { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: $2: section \"Present But Cannot Be Compiled\"" >&5 +$as_echo "$as_me: WARNING: $2: section \"Present But Cannot Be Compiled\"" >&2;} + { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: $2: proceeding with the compiler's result" >&5 +$as_echo "$as_me: WARNING: $2: proceeding with the compiler's result" >&2;} + ;; +esac + { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $2" >&5 +$as_echo_n "checking for $2... " >&6; } +if eval \${$3+:} false; then : + $as_echo_n "(cached) " >&6 +else + eval "$3=\$ac_header_compiler" +fi +eval ac_res=\$$3 + { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_res" >&5 +$as_echo "$ac_res" >&6; } +fi + eval $as_lineno_stack; ${as_lineno_stack:+:} unset as_lineno + +} # ac_fn_cxx_check_header_mongrel + +# ac_fn_cxx_try_link LINENO +# ------------------------- +# Try to link conftest.$ac_ext, and return whether this succeeded. +ac_fn_cxx_try_link () +{ + as_lineno=${as_lineno-"$1"} as_lineno_stack=as_lineno_stack=$as_lineno_stack + rm -f conftest.$ac_objext conftest$ac_exeext + if { { ac_try="$ac_link" +case "(($ac_try" in + *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; + *) ac_try_echo=$ac_try;; +esac +eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\"" +$as_echo "$ac_try_echo"; } >&5 + (eval "$ac_link") 2>conftest.err + ac_status=$? + if test -s conftest.err; then + grep -v '^ *+' conftest.err >conftest.er1 + cat conftest.er1 >&5 + mv -f conftest.er1 conftest.err + fi + $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 + test $ac_status = 0; } && { + test -z "$ac_cxx_werror_flag" || + test ! -s conftest.err + } && test -s conftest$ac_exeext && { + test "$cross_compiling" = yes || + test -x conftest$ac_exeext + }; then : + ac_retval=0 +else + $as_echo "$as_me: failed program was:" >&5 +sed 's/^/| /' conftest.$ac_ext >&5 + + ac_retval=1 +fi + # Delete the IPA/IPO (Inter Procedural Analysis/Optimization) information + # created by the PGI compiler (conftest_ipa8_conftest.oo), as it would + # interfere with the next link command; also delete a directory that is + # left behind by Apple's compiler. We do this before executing the actions. + rm -rf conftest.dSYM conftest_ipa8_conftest.oo + eval $as_lineno_stack; ${as_lineno_stack:+:} unset as_lineno + as_fn_set_status $ac_retval + +} # ac_fn_cxx_try_link +cat >config.log <<_ACEOF +This file contains any messages produced by compilers while +running configure, to aid debugging if configure makes a mistake. + +It was created by viking $as_me 1.7, which was +generated by GNU Autoconf 2.69. Invocation command line was + + $ $0 $@ + +_ACEOF +exec 5>>config.log +{ +cat <<_ASUNAME +## --------- ## +## Platform. ## +## --------- ## + +hostname = `(hostname || uname -n) 2>/dev/null | sed 1q` +uname -m = `(uname -m) 2>/dev/null || echo unknown` +uname -r = `(uname -r) 2>/dev/null || echo unknown` +uname -s = `(uname -s) 2>/dev/null || echo unknown` +uname -v = `(uname -v) 2>/dev/null || echo unknown` + +/usr/bin/uname -p = `(/usr/bin/uname -p) 2>/dev/null || echo unknown` +/bin/uname -X = `(/bin/uname -X) 2>/dev/null || echo unknown` + +/bin/arch = `(/bin/arch) 2>/dev/null || echo unknown` +/usr/bin/arch -k = `(/usr/bin/arch -k) 2>/dev/null || echo unknown` +/usr/convex/getsysinfo = `(/usr/convex/getsysinfo) 2>/dev/null || echo unknown` +/usr/bin/hostinfo = `(/usr/bin/hostinfo) 2>/dev/null || echo unknown` +/bin/machine = `(/bin/machine) 2>/dev/null || echo unknown` +/usr/bin/oslevel = `(/usr/bin/oslevel) 2>/dev/null || echo unknown` +/bin/universe = `(/bin/universe) 2>/dev/null || echo unknown` + +_ASUNAME + +as_save_IFS=$IFS; IFS=$PATH_SEPARATOR +for as_dir in $PATH +do + IFS=$as_save_IFS + test -z "$as_dir" && as_dir=. + $as_echo "PATH: $as_dir" + done +IFS=$as_save_IFS + +} >&5 + +cat >&5 <<_ACEOF + + +## ----------- ## +## Core tests. ## +## ----------- ## + +_ACEOF + + +# Keep a trace of the command line. +# Strip out --no-create and --no-recursion so they do not pile up. +# Strip out --silent because we don't want to record it for future runs. +# Also quote any args containing shell meta-characters. +# Make two passes to allow for proper duplicate-argument suppression. +ac_configure_args= +ac_configure_args0= +ac_configure_args1= +ac_must_keep_next=false +for ac_pass in 1 2 +do + for ac_arg + do + case $ac_arg in + -no-create | --no-c* | -n | -no-recursion | --no-r*) continue ;; + -q | -quiet | --quiet | --quie | --qui | --qu | --q \ + | -silent | --silent | --silen | --sile | --sil) + continue ;; + *\'*) + ac_arg=`$as_echo "$ac_arg" | sed "s/'/'\\\\\\\\''/g"` ;; + esac + case $ac_pass in + 1) as_fn_append ac_configure_args0 " '$ac_arg'" ;; + 2) + as_fn_append ac_configure_args1 " '$ac_arg'" + if test $ac_must_keep_next = true; then + ac_must_keep_next=false # Got value, back to normal. + else + case $ac_arg in + *=* | --config-cache | -C | -disable-* | --disable-* \ + | -enable-* | --enable-* | -gas | --g* | -nfp | --nf* \ + | -q | -quiet | --q* | -silent | --sil* | -v | -verb* \ + | -with-* | --with-* | -without-* | --without-* | --x) + case "$ac_configure_args0 " in + "$ac_configure_args1"*" '$ac_arg' "* ) continue ;; + esac + ;; + -* ) ac_must_keep_next=true ;; + esac + fi + as_fn_append ac_configure_args " '$ac_arg'" + ;; + esac + done +done +{ ac_configure_args0=; unset ac_configure_args0;} +{ ac_configure_args1=; unset ac_configure_args1;} + +# When interrupted or exit'd, cleanup temporary files, and complete +# config.log. We remove comments because anyway the quotes in there +# would cause problems or look ugly. +# WARNING: Use '\'' to represent an apostrophe within the trap. +# WARNING: Do not start the trap code with a newline, due to a FreeBSD 4.0 bug. +trap 'exit_status=$? + # Save into config.log some information that might help in debugging. + { + echo + + $as_echo "## ---------------- ## +## Cache variables. ## +## ---------------- ##" + echo + # The following way of writing the cache mishandles newlines in values, +( + for ac_var in `(set) 2>&1 | sed -n '\''s/^\([a-zA-Z_][a-zA-Z0-9_]*\)=.*/\1/p'\''`; do + eval ac_val=\$$ac_var + case $ac_val in #( + *${as_nl}*) + case $ac_var in #( + *_cv_*) { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: cache variable $ac_var contains a newline" >&5 +$as_echo "$as_me: WARNING: cache variable $ac_var contains a newline" >&2;} ;; + esac + case $ac_var in #( + _ | IFS | as_nl) ;; #( + BASH_ARGV | BASH_SOURCE) eval $ac_var= ;; #( + *) { eval $ac_var=; unset $ac_var;} ;; + esac ;; + esac + done + (set) 2>&1 | + case $as_nl`(ac_space='\'' '\''; set) 2>&1` in #( + *${as_nl}ac_space=\ *) + sed -n \ + "s/'\''/'\''\\\\'\'''\''/g; + s/^\\([_$as_cr_alnum]*_cv_[_$as_cr_alnum]*\\)=\\(.*\\)/\\1='\''\\2'\''/p" + ;; #( + *) + sed -n "/^[_$as_cr_alnum]*_cv_[_$as_cr_alnum]*=/p" + ;; + esac | + sort +) + echo + + $as_echo "## ----------------- ## +## Output variables. ## +## ----------------- ##" + echo + for ac_var in $ac_subst_vars + do + eval ac_val=\$$ac_var + case $ac_val in + *\'\''*) ac_val=`$as_echo "$ac_val" | sed "s/'\''/'\''\\\\\\\\'\'''\''/g"`;; + esac + $as_echo "$ac_var='\''$ac_val'\''" + done | sort + echo + + if test -n "$ac_subst_files"; then + $as_echo "## ------------------- ## +## File substitutions. ## +## ------------------- ##" + echo + for ac_var in $ac_subst_files + do + eval ac_val=\$$ac_var + case $ac_val in + *\'\''*) ac_val=`$as_echo "$ac_val" | sed "s/'\''/'\''\\\\\\\\'\'''\''/g"`;; + esac + $as_echo "$ac_var='\''$ac_val'\''" + done | sort + echo + fi + + if test -s confdefs.h; then + $as_echo "## ----------- ## +## confdefs.h. ## +## ----------- ##" + echo + cat confdefs.h + echo + fi + test "$ac_signal" != 0 && + $as_echo "$as_me: caught signal $ac_signal" + $as_echo "$as_me: exit $exit_status" + } >&5 + rm -f core *.core core.conftest.* && + rm -f -r conftest* confdefs* conf$$* $ac_clean_files && + exit $exit_status +' 0 +for ac_signal in 1 2 13 15; do + trap 'ac_signal='$ac_signal'; as_fn_exit 1' $ac_signal +done +ac_signal=0 + +# confdefs.h avoids OS command line length limits that DEFS can exceed. +rm -f -r conftest* confdefs.h + +$as_echo "/* confdefs.h */" > confdefs.h + +# Predefined preprocessor variables. + +cat >>confdefs.h <<_ACEOF +#define PACKAGE_NAME "$PACKAGE_NAME" +_ACEOF + +cat >>confdefs.h <<_ACEOF +#define PACKAGE_TARNAME "$PACKAGE_TARNAME" +_ACEOF + +cat >>confdefs.h <<_ACEOF +#define PACKAGE_VERSION "$PACKAGE_VERSION" +_ACEOF + +cat >>confdefs.h <<_ACEOF +#define PACKAGE_STRING "$PACKAGE_STRING" +_ACEOF + +cat >>confdefs.h <<_ACEOF +#define PACKAGE_BUGREPORT "$PACKAGE_BUGREPORT" +_ACEOF + +cat >>confdefs.h <<_ACEOF +#define PACKAGE_URL "$PACKAGE_URL" +_ACEOF + + +# Let the site file select an alternate cache file if it wants to. +# Prefer an explicitly selected file to automatically selected ones. +ac_site_file1=NONE +ac_site_file2=NONE +if test -n "$CONFIG_SITE"; then + # We do not want a PATH search for config.site. + case $CONFIG_SITE in #(( + -*) ac_site_file1=./$CONFIG_SITE;; + */*) ac_site_file1=$CONFIG_SITE;; + *) ac_site_file1=./$CONFIG_SITE;; + esac +elif test "x$prefix" != xNONE; then + ac_site_file1=$prefix/share/config.site + ac_site_file2=$prefix/etc/config.site +else + ac_site_file1=$ac_default_prefix/share/config.site + ac_site_file2=$ac_default_prefix/etc/config.site +fi +for ac_site_file in "$ac_site_file1" "$ac_site_file2" +do + test "x$ac_site_file" = xNONE && continue + if test /dev/null != "$ac_site_file" && test -r "$ac_site_file"; then + { $as_echo "$as_me:${as_lineno-$LINENO}: loading site script $ac_site_file" >&5 +$as_echo "$as_me: loading site script $ac_site_file" >&6;} + sed 's/^/| /' "$ac_site_file" >&5 + . "$ac_site_file" \ + || { { $as_echo "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5 +$as_echo "$as_me: error: in \`$ac_pwd':" >&2;} +as_fn_error $? "failed to load site script $ac_site_file +See \`config.log' for more details" "$LINENO" 5; } + fi +done + +if test -r "$cache_file"; then + # Some versions of bash will fail to source /dev/null (special files + # actually), so we avoid doing that. DJGPP emulates it as a regular file. + if test /dev/null != "$cache_file" && test -f "$cache_file"; then + { $as_echo "$as_me:${as_lineno-$LINENO}: loading cache $cache_file" >&5 +$as_echo "$as_me: loading cache $cache_file" >&6;} + case $cache_file in + [\\/]* | ?:[\\/]* ) . "$cache_file";; + *) . "./$cache_file";; + esac + fi +else + { $as_echo "$as_me:${as_lineno-$LINENO}: creating cache $cache_file" >&5 +$as_echo "$as_me: creating cache $cache_file" >&6;} + >$cache_file +fi + +gt_needs="$gt_needs " +# Check that the precious variables saved in the cache have kept the same +# value. +ac_cache_corrupted=false +for ac_var in $ac_precious_vars; do + eval ac_old_set=\$ac_cv_env_${ac_var}_set + eval ac_new_set=\$ac_env_${ac_var}_set + eval ac_old_val=\$ac_cv_env_${ac_var}_value + eval ac_new_val=\$ac_env_${ac_var}_value + case $ac_old_set,$ac_new_set in + set,) + { $as_echo "$as_me:${as_lineno-$LINENO}: error: \`$ac_var' was set to \`$ac_old_val' in the previous run" >&5 +$as_echo "$as_me: error: \`$ac_var' was set to \`$ac_old_val' in the previous run" >&2;} + ac_cache_corrupted=: ;; + ,set) + { $as_echo "$as_me:${as_lineno-$LINENO}: error: \`$ac_var' was not set in the previous run" >&5 +$as_echo "$as_me: error: \`$ac_var' was not set in the previous run" >&2;} + ac_cache_corrupted=: ;; + ,);; + *) + if test "x$ac_old_val" != "x$ac_new_val"; then + # differences in whitespace do not lead to failure. + ac_old_val_w=`echo x $ac_old_val` + ac_new_val_w=`echo x $ac_new_val` + if test "$ac_old_val_w" != "$ac_new_val_w"; then + { $as_echo "$as_me:${as_lineno-$LINENO}: error: \`$ac_var' has changed since the previous run:" >&5 +$as_echo "$as_me: error: \`$ac_var' has changed since the previous run:" >&2;} + ac_cache_corrupted=: + else + { $as_echo "$as_me:${as_lineno-$LINENO}: warning: ignoring whitespace changes in \`$ac_var' since the previous run:" >&5 +$as_echo "$as_me: warning: ignoring whitespace changes in \`$ac_var' since the previous run:" >&2;} + eval $ac_var=\$ac_old_val + fi + { $as_echo "$as_me:${as_lineno-$LINENO}: former value: \`$ac_old_val'" >&5 +$as_echo "$as_me: former value: \`$ac_old_val'" >&2;} + { $as_echo "$as_me:${as_lineno-$LINENO}: current value: \`$ac_new_val'" >&5 +$as_echo "$as_me: current value: \`$ac_new_val'" >&2;} + fi;; + esac + # Pass precious variables to config.status. + if test "$ac_new_set" = set; then + case $ac_new_val in + *\'*) ac_arg=$ac_var=`$as_echo "$ac_new_val" | sed "s/'/'\\\\\\\\''/g"` ;; + *) ac_arg=$ac_var=$ac_new_val ;; + esac + case " $ac_configure_args " in + *" '$ac_arg' "*) ;; # Avoid dups. Use of quotes ensures accuracy. + *) as_fn_append ac_configure_args " '$ac_arg'" ;; + esac + fi +done +if $ac_cache_corrupted; then + { $as_echo "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5 +$as_echo "$as_me: error: in \`$ac_pwd':" >&2;} + { $as_echo "$as_me:${as_lineno-$LINENO}: error: changes in the environment can compromise the build" >&5 +$as_echo "$as_me: error: changes in the environment can compromise the build" >&2;} + as_fn_error $? "run \`make distclean' and/or \`rm $cache_file' and start over" "$LINENO" 5 +fi +## -------------------- ## +## Main body of script. ## +## -------------------- ## + +ac_ext=c +ac_cpp='$CPP $CPPFLAGS' +ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5' +ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' +ac_compiler_gnu=$ac_cv_c_compiler_gnu + + + +ac_aux_dir= +for ac_dir in "$srcdir" "$srcdir/.." "$srcdir/../.."; do + if test -f "$ac_dir/install-sh"; then + ac_aux_dir=$ac_dir + ac_install_sh="$ac_aux_dir/install-sh -c" + break + elif test -f "$ac_dir/install.sh"; then + ac_aux_dir=$ac_dir + ac_install_sh="$ac_aux_dir/install.sh -c" + break + elif test -f "$ac_dir/shtool"; then + ac_aux_dir=$ac_dir + ac_install_sh="$ac_aux_dir/shtool install -c" + break + fi +done +if test -z "$ac_aux_dir"; then + as_fn_error $? "cannot find install-sh, install.sh, or shtool in \"$srcdir\" \"$srcdir/..\" \"$srcdir/../..\"" "$LINENO" 5 +fi + +# These three variables are undocumented and unsupported, +# and are intended to be withdrawn in a future Autoconf release. +# They can cause serious problems if a builder's source tree is in a directory +# whose full name contains unusual characters. +ac_config_guess="$SHELL $ac_aux_dir/config.guess" # Please don't use this var. +ac_config_sub="$SHELL $ac_aux_dir/config.sub" # Please don't use this var. +ac_configure="$SHELL $ac_aux_dir/configure" # Please don't use this var. + + +# Make sure we can run config.sub. +$SHELL "$ac_aux_dir/config.sub" sun4 >/dev/null 2>&1 || + as_fn_error $? "cannot run $SHELL $ac_aux_dir/config.sub" "$LINENO" 5 + +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking build system type" >&5 +$as_echo_n "checking build system type... " >&6; } +if ${ac_cv_build+:} false; then : + $as_echo_n "(cached) " >&6 +else + ac_build_alias=$build_alias +test "x$ac_build_alias" = x && + ac_build_alias=`$SHELL "$ac_aux_dir/config.guess"` +test "x$ac_build_alias" = x && + as_fn_error $? "cannot guess build type; you must specify one" "$LINENO" 5 +ac_cv_build=`$SHELL "$ac_aux_dir/config.sub" $ac_build_alias` || + as_fn_error $? "$SHELL $ac_aux_dir/config.sub $ac_build_alias failed" "$LINENO" 5 + +fi +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_build" >&5 +$as_echo "$ac_cv_build" >&6; } +case $ac_cv_build in +*-*-*) ;; +*) as_fn_error $? "invalid value of canonical build" "$LINENO" 5;; +esac +build=$ac_cv_build +ac_save_IFS=$IFS; IFS='-' +set x $ac_cv_build +shift +build_cpu=$1 +build_vendor=$2 +shift; shift +# Remember, the first character of IFS is used to create $*, +# except with old shells: +build_os=$* +IFS=$ac_save_IFS +case $build_os in *\ *) build_os=`echo "$build_os" | sed 's/ /-/g'`;; esac + + +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking host system type" >&5 +$as_echo_n "checking host system type... " >&6; } +if ${ac_cv_host+:} false; then : + $as_echo_n "(cached) " >&6 +else + if test "x$host_alias" = x; then + ac_cv_host=$ac_cv_build +else + ac_cv_host=`$SHELL "$ac_aux_dir/config.sub" $host_alias` || + as_fn_error $? "$SHELL $ac_aux_dir/config.sub $host_alias failed" "$LINENO" 5 +fi + +fi +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_host" >&5 +$as_echo "$ac_cv_host" >&6; } +case $ac_cv_host in +*-*-*) ;; +*) as_fn_error $? "invalid value of canonical host" "$LINENO" 5;; +esac +host=$ac_cv_host +ac_save_IFS=$IFS; IFS='-' +set x $ac_cv_host +shift +host_cpu=$1 +host_vendor=$2 +shift; shift +# Remember, the first character of IFS is used to create $*, +# except with old shells: +host_os=$* +IFS=$ac_save_IFS +case $host_os in *\ *) host_os=`echo "$host_os" | sed 's/ /-/g'`;; esac + + +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking target system type" >&5 +$as_echo_n "checking target system type... " >&6; } +if ${ac_cv_target+:} false; then : + $as_echo_n "(cached) " >&6 +else + if test "x$target_alias" = x; then + ac_cv_target=$ac_cv_host +else + ac_cv_target=`$SHELL "$ac_aux_dir/config.sub" $target_alias` || + as_fn_error $? "$SHELL $ac_aux_dir/config.sub $target_alias failed" "$LINENO" 5 +fi + +fi +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_target" >&5 +$as_echo "$ac_cv_target" >&6; } +case $ac_cv_target in +*-*-*) ;; +*) as_fn_error $? "invalid value of canonical target" "$LINENO" 5;; +esac +target=$ac_cv_target +ac_save_IFS=$IFS; IFS='-' +set x $ac_cv_target +shift +target_cpu=$1 +target_vendor=$2 +shift; shift +# Remember, the first character of IFS is used to create $*, +# except with old shells: +target_os=$* +IFS=$ac_save_IFS +case $target_os in *\ *) target_os=`echo "$target_os" | sed 's/ /-/g'`;; esac + + +# The aliases save the names the user supplied, while $host etc. +# will get canonicalized. +test -n "$target_alias" && + test "$program_prefix$program_suffix$program_transform_name" = \ + NONENONEs,x,x, && + program_prefix=${target_alias}- + +am__api_version='1.16' + +# Find a good install program. We prefer a C program (faster), +# so one script is as good as another. But avoid the broken or +# incompatible versions: +# SysV /etc/install, /usr/sbin/install +# SunOS /usr/etc/install +# IRIX /sbin/install +# AIX /bin/install +# AmigaOS /C/install, which installs bootblocks on floppy discs +# AIX 4 /usr/bin/installbsd, which doesn't work without a -g flag +# AFS /usr/afsws/bin/install, which mishandles nonexistent args +# SVR4 /usr/ucb/install, which tries to use the nonexistent group "staff" +# OS/2's system install, which has a completely different semantic +# ./install, which can be erroneously created by make from ./install.sh. +# Reject install programs that cannot install multiple files. +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for a BSD-compatible install" >&5 +$as_echo_n "checking for a BSD-compatible install... " >&6; } +if test -z "$INSTALL"; then +if ${ac_cv_path_install+:} false; then : + $as_echo_n "(cached) " >&6 +else + as_save_IFS=$IFS; IFS=$PATH_SEPARATOR +for as_dir in $PATH +do + IFS=$as_save_IFS + test -z "$as_dir" && as_dir=. + # Account for people who put trailing slashes in PATH elements. +case $as_dir/ in #(( + ./ | .// | /[cC]/* | \ + /etc/* | /usr/sbin/* | /usr/etc/* | /sbin/* | /usr/afsws/bin/* | \ + ?:[\\/]os2[\\/]install[\\/]* | ?:[\\/]OS2[\\/]INSTALL[\\/]* | \ + /usr/ucb/* ) ;; + *) + # OSF1 and SCO ODT 3.0 have their own names for install. + # Don't use installbsd from OSF since it installs stuff as root + # by default. + for ac_prog in ginstall scoinst install; do + for ac_exec_ext in '' $ac_executable_extensions; do + if as_fn_executable_p "$as_dir/$ac_prog$ac_exec_ext"; then + if test $ac_prog = install && + grep dspmsg "$as_dir/$ac_prog$ac_exec_ext" >/dev/null 2>&1; then + # AIX install. It has an incompatible calling convention. + : + elif test $ac_prog = install && + grep pwplus "$as_dir/$ac_prog$ac_exec_ext" >/dev/null 2>&1; then + # program-specific install script used by HP pwplus--don't use. + : + else + rm -rf conftest.one conftest.two conftest.dir + echo one > conftest.one + echo two > conftest.two + mkdir conftest.dir + if "$as_dir/$ac_prog$ac_exec_ext" -c conftest.one conftest.two "`pwd`/conftest.dir" && + test -s conftest.one && test -s conftest.two && + test -s conftest.dir/conftest.one && + test -s conftest.dir/conftest.two + then + ac_cv_path_install="$as_dir/$ac_prog$ac_exec_ext -c" + break 3 + fi + fi + fi + done + done + ;; +esac + + done +IFS=$as_save_IFS + +rm -rf conftest.one conftest.two conftest.dir + +fi + if test "${ac_cv_path_install+set}" = set; then + INSTALL=$ac_cv_path_install + else + # As a last resort, use the slow shell script. Don't cache a + # value for INSTALL within a source directory, because that will + # break other packages using the cache if that directory is + # removed, or if the value is a relative name. + INSTALL=$ac_install_sh + fi +fi +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $INSTALL" >&5 +$as_echo "$INSTALL" >&6; } + +# Use test -z because SunOS4 sh mishandles braces in ${var-val}. +# It thinks the first close brace ends the variable substitution. +test -z "$INSTALL_PROGRAM" && INSTALL_PROGRAM='${INSTALL}' + +test -z "$INSTALL_SCRIPT" && INSTALL_SCRIPT='${INSTALL}' + +test -z "$INSTALL_DATA" && INSTALL_DATA='${INSTALL} -m 644' + +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking whether build environment is sane" >&5 +$as_echo_n "checking whether build environment is sane... " >&6; } +# Reject unsafe characters in $srcdir or the absolute working directory +# name. Accept space and tab only in the latter. +am_lf=' +' +case `pwd` in + *[\\\"\#\$\&\'\`$am_lf]*) + as_fn_error $? "unsafe absolute working directory name" "$LINENO" 5;; +esac +case $srcdir in + *[\\\"\#\$\&\'\`$am_lf\ \ ]*) + as_fn_error $? "unsafe srcdir value: '$srcdir'" "$LINENO" 5;; +esac + +# Do 'set' in a subshell so we don't clobber the current shell's +# arguments. Must try -L first in case configure is actually a +# symlink; some systems play weird games with the mod time of symlinks +# (eg FreeBSD returns the mod time of the symlink's containing +# directory). +if ( + am_has_slept=no + for am_try in 1 2; do + echo "timestamp, slept: $am_has_slept" > conftest.file + set X `ls -Lt "$srcdir/configure" conftest.file 2> /dev/null` + if test "$*" = "X"; then + # -L didn't work. + set X `ls -t "$srcdir/configure" conftest.file` + fi + if test "$*" != "X $srcdir/configure conftest.file" \ + && test "$*" != "X conftest.file $srcdir/configure"; then + + # If neither matched, then we have a broken ls. This can happen + # if, for instance, CONFIG_SHELL is bash and it inherits a + # broken ls alias from the environment. This has actually + # happened. Such a system could not be considered "sane". + as_fn_error $? "ls -t appears to fail. Make sure there is not a broken + alias in your environment" "$LINENO" 5 + fi + if test "$2" = conftest.file || test $am_try -eq 2; then + break + fi + # Just in case. + sleep 1 + am_has_slept=yes + done + test "$2" = conftest.file + ) +then + # Ok. + : +else + as_fn_error $? "newly created file is older than distributed files! +Check your system clock" "$LINENO" 5 +fi +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5 +$as_echo "yes" >&6; } +# If we didn't sleep, we still need to ensure time stamps of config.status and +# generated files are strictly newer. +am_sleep_pid= +if grep 'slept: no' conftest.file >/dev/null 2>&1; then + ( sleep 1 ) & + am_sleep_pid=$! +fi + +rm -f conftest.file + +test "$program_prefix" != NONE && + program_transform_name="s&^&$program_prefix&;$program_transform_name" +# Use a double $ so make ignores it. +test "$program_suffix" != NONE && + program_transform_name="s&\$&$program_suffix&;$program_transform_name" +# Double any \ or $. +# By default was `s,x,x', remove it if useless. +ac_script='s/[\\$]/&&/g;s/;s,x,x,$//' +program_transform_name=`$as_echo "$program_transform_name" | sed "$ac_script"` + +# Expand $ac_aux_dir to an absolute path. +am_aux_dir=`cd "$ac_aux_dir" && pwd` + +if test x"${MISSING+set}" != xset; then + case $am_aux_dir in + *\ * | *\ *) + MISSING="\${SHELL} \"$am_aux_dir/missing\"" ;; + *) + MISSING="\${SHELL} $am_aux_dir/missing" ;; + esac +fi +# Use eval to expand $SHELL +if eval "$MISSING --is-lightweight"; then + am_missing_run="$MISSING " +else + am_missing_run= + { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: 'missing' script is too old or missing" >&5 +$as_echo "$as_me: WARNING: 'missing' script is too old or missing" >&2;} +fi + +if test x"${install_sh+set}" != xset; then + case $am_aux_dir in + *\ * | *\ *) + install_sh="\${SHELL} '$am_aux_dir/install-sh'" ;; + *) + install_sh="\${SHELL} $am_aux_dir/install-sh" + esac +fi + +# Installed binaries are usually stripped using 'strip' when the user +# run "make install-strip". However 'strip' might not be the right +# tool to use in cross-compilation environments, therefore Automake +# will honor the 'STRIP' environment variable to overrule this program. +if test "$cross_compiling" != no; then + if test -n "$ac_tool_prefix"; then + # Extract the first word of "${ac_tool_prefix}strip", so it can be a program name with args. +set dummy ${ac_tool_prefix}strip; ac_word=$2 +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 +$as_echo_n "checking for $ac_word... " >&6; } +if ${ac_cv_prog_STRIP+:} false; then : + $as_echo_n "(cached) " >&6 +else + if test -n "$STRIP"; then + ac_cv_prog_STRIP="$STRIP" # Let the user override the test. +else +as_save_IFS=$IFS; IFS=$PATH_SEPARATOR +for as_dir in $PATH +do + IFS=$as_save_IFS + test -z "$as_dir" && as_dir=. + for ac_exec_ext in '' $ac_executable_extensions; do + if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then + ac_cv_prog_STRIP="${ac_tool_prefix}strip" + $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 + break 2 + fi +done + done +IFS=$as_save_IFS + +fi +fi +STRIP=$ac_cv_prog_STRIP +if test -n "$STRIP"; then + { $as_echo "$as_me:${as_lineno-$LINENO}: result: $STRIP" >&5 +$as_echo "$STRIP" >&6; } +else + { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 +$as_echo "no" >&6; } +fi + + +fi +if test -z "$ac_cv_prog_STRIP"; then + ac_ct_STRIP=$STRIP + # Extract the first word of "strip", so it can be a program name with args. +set dummy strip; ac_word=$2 +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 +$as_echo_n "checking for $ac_word... " >&6; } +if ${ac_cv_prog_ac_ct_STRIP+:} false; then : + $as_echo_n "(cached) " >&6 +else + if test -n "$ac_ct_STRIP"; then + ac_cv_prog_ac_ct_STRIP="$ac_ct_STRIP" # Let the user override the test. +else +as_save_IFS=$IFS; IFS=$PATH_SEPARATOR +for as_dir in $PATH +do + IFS=$as_save_IFS + test -z "$as_dir" && as_dir=. + for ac_exec_ext in '' $ac_executable_extensions; do + if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then + ac_cv_prog_ac_ct_STRIP="strip" + $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 + break 2 + fi +done + done +IFS=$as_save_IFS + +fi +fi +ac_ct_STRIP=$ac_cv_prog_ac_ct_STRIP +if test -n "$ac_ct_STRIP"; then + { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_ct_STRIP" >&5 +$as_echo "$ac_ct_STRIP" >&6; } +else + { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 +$as_echo "no" >&6; } +fi + + if test "x$ac_ct_STRIP" = x; then + STRIP=":" + else + case $cross_compiling:$ac_tool_warned in +yes:) +{ $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: using cross tools not prefixed with host triplet" >&5 +$as_echo "$as_me: WARNING: using cross tools not prefixed with host triplet" >&2;} +ac_tool_warned=yes ;; +esac + STRIP=$ac_ct_STRIP + fi +else + STRIP="$ac_cv_prog_STRIP" +fi + +fi +INSTALL_STRIP_PROGRAM="\$(install_sh) -c -s" + +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for a thread-safe mkdir -p" >&5 +$as_echo_n "checking for a thread-safe mkdir -p... " >&6; } +if test -z "$MKDIR_P"; then + if ${ac_cv_path_mkdir+:} false; then : + $as_echo_n "(cached) " >&6 +else + as_save_IFS=$IFS; IFS=$PATH_SEPARATOR +for as_dir in $PATH$PATH_SEPARATOR/opt/sfw/bin +do + IFS=$as_save_IFS + test -z "$as_dir" && as_dir=. + for ac_prog in mkdir gmkdir; do + for ac_exec_ext in '' $ac_executable_extensions; do + as_fn_executable_p "$as_dir/$ac_prog$ac_exec_ext" || continue + case `"$as_dir/$ac_prog$ac_exec_ext" --version 2>&1` in #( + 'mkdir (GNU coreutils) '* | \ + 'mkdir (coreutils) '* | \ + 'mkdir (fileutils) '4.1*) + ac_cv_path_mkdir=$as_dir/$ac_prog$ac_exec_ext + break 3;; + esac + done + done + done +IFS=$as_save_IFS + +fi + + test -d ./--version && rmdir ./--version + if test "${ac_cv_path_mkdir+set}" = set; then + MKDIR_P="$ac_cv_path_mkdir -p" + else + # As a last resort, use the slow shell script. Don't cache a + # value for MKDIR_P within a source directory, because that will + # break other packages using the cache if that directory is + # removed, or if the value is a relative name. + MKDIR_P="$ac_install_sh -d" + fi +fi +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $MKDIR_P" >&5 +$as_echo "$MKDIR_P" >&6; } + +for ac_prog in gawk mawk nawk awk +do + # Extract the first word of "$ac_prog", so it can be a program name with args. +set dummy $ac_prog; ac_word=$2 +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 +$as_echo_n "checking for $ac_word... " >&6; } +if ${ac_cv_prog_AWK+:} false; then : + $as_echo_n "(cached) " >&6 +else + if test -n "$AWK"; then + ac_cv_prog_AWK="$AWK" # Let the user override the test. +else +as_save_IFS=$IFS; IFS=$PATH_SEPARATOR +for as_dir in $PATH +do + IFS=$as_save_IFS + test -z "$as_dir" && as_dir=. + for ac_exec_ext in '' $ac_executable_extensions; do + if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then + ac_cv_prog_AWK="$ac_prog" + $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 + break 2 + fi +done + done +IFS=$as_save_IFS + +fi +fi +AWK=$ac_cv_prog_AWK +if test -n "$AWK"; then + { $as_echo "$as_me:${as_lineno-$LINENO}: result: $AWK" >&5 +$as_echo "$AWK" >&6; } +else + { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 +$as_echo "no" >&6; } +fi + + + test -n "$AWK" && break +done + +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking whether ${MAKE-make} sets \$(MAKE)" >&5 +$as_echo_n "checking whether ${MAKE-make} sets \$(MAKE)... " >&6; } +set x ${MAKE-make} +ac_make=`$as_echo "$2" | sed 's/+/p/g; s/[^a-zA-Z0-9_]/_/g'` +if eval \${ac_cv_prog_make_${ac_make}_set+:} false; then : + $as_echo_n "(cached) " >&6 +else + cat >conftest.make <<\_ACEOF +SHELL = /bin/sh +all: + @echo '@@@%%%=$(MAKE)=@@@%%%' +_ACEOF +# GNU make sometimes prints "make[1]: Entering ...", which would confuse us. +case `${MAKE-make} -f conftest.make 2>/dev/null` in + *@@@%%%=?*=@@@%%%*) + eval ac_cv_prog_make_${ac_make}_set=yes;; + *) + eval ac_cv_prog_make_${ac_make}_set=no;; +esac +rm -f conftest.make +fi +if eval test \$ac_cv_prog_make_${ac_make}_set = yes; then + { $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5 +$as_echo "yes" >&6; } + SET_MAKE= +else + { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 +$as_echo "no" >&6; } + SET_MAKE="MAKE=${MAKE-make}" +fi + +rm -rf .tst 2>/dev/null +mkdir .tst 2>/dev/null +if test -d .tst; then + am__leading_dot=. +else + am__leading_dot=_ +fi +rmdir .tst 2>/dev/null + +# Check whether --enable-silent-rules was given. +if test "${enable_silent_rules+set}" = set; then : + enableval=$enable_silent_rules; +fi + +case $enable_silent_rules in # ((( + yes) AM_DEFAULT_VERBOSITY=0;; + no) AM_DEFAULT_VERBOSITY=1;; + *) AM_DEFAULT_VERBOSITY=1;; +esac +am_make=${MAKE-make} +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking whether $am_make supports nested variables" >&5 +$as_echo_n "checking whether $am_make supports nested variables... " >&6; } +if ${am_cv_make_support_nested_variables+:} false; then : + $as_echo_n "(cached) " >&6 +else + if $as_echo 'TRUE=$(BAR$(V)) +BAR0=false +BAR1=true +V=1 +am__doit: + @$(TRUE) +.PHONY: am__doit' | $am_make -f - >/dev/null 2>&1; then + am_cv_make_support_nested_variables=yes +else + am_cv_make_support_nested_variables=no +fi +fi +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $am_cv_make_support_nested_variables" >&5 +$as_echo "$am_cv_make_support_nested_variables" >&6; } +if test $am_cv_make_support_nested_variables = yes; then + AM_V='$(V)' + AM_DEFAULT_V='$(AM_DEFAULT_VERBOSITY)' +else + AM_V=$AM_DEFAULT_VERBOSITY + AM_DEFAULT_V=$AM_DEFAULT_VERBOSITY +fi +AM_BACKSLASH='\' + +if test "`cd $srcdir && pwd`" != "`pwd`"; then + # Use -I$(srcdir) only when $(srcdir) != ., so that make's output + # is not polluted with repeated "-I." + am__isrc=' -I$(srcdir)' + # test to see if srcdir already configured + if test -f $srcdir/config.status; then + as_fn_error $? "source directory already configured; run \"make distclean\" there first" "$LINENO" 5 + fi +fi + +# test whether we have cygpath +if test -z "$CYGPATH_W"; then + if (cygpath --version) >/dev/null 2>/dev/null; then + CYGPATH_W='cygpath -w' + else + CYGPATH_W=echo + fi +fi + + +# Define the identity of the package. + PACKAGE='viking' + VERSION='1.7' + + +cat >>confdefs.h <<_ACEOF +#define PACKAGE "$PACKAGE" +_ACEOF + + +cat >>confdefs.h <<_ACEOF +#define VERSION "$VERSION" +_ACEOF + +# Some tools Automake needs. + +ACLOCAL=${ACLOCAL-"${am_missing_run}aclocal-${am__api_version}"} + + +AUTOCONF=${AUTOCONF-"${am_missing_run}autoconf"} + + +AUTOMAKE=${AUTOMAKE-"${am_missing_run}automake-${am__api_version}"} + + +AUTOHEADER=${AUTOHEADER-"${am_missing_run}autoheader"} + + +MAKEINFO=${MAKEINFO-"${am_missing_run}makeinfo"} + +# For better backward compatibility. To be removed once Automake 1.9.x +# dies out for good. For more background, see: +# +# +mkdir_p='$(MKDIR_P)' + +# We need awk for the "check" target (and possibly the TAP driver). The +# system "awk" is bad on some platforms. +# Always define AMTAR for backward compatibility. Yes, it's still used +# in the wild :-( We should find a proper way to deprecate it ... +AMTAR='$${TAR-tar}' + + +# We'll loop over all known methods to create a tar archive until one works. +_am_tools='gnutar pax cpio none' + +am__tar='$${TAR-tar} chof - "$$tardir"' am__untar='$${TAR-tar} xf -' + + + + + + +# POSIX will say in a future version that running "rm -f" with no argument +# is OK; and we want to be able to make that assumption in our Makefile +# recipes. So use an aggressive probe to check that the usage we want is +# actually supported "in the wild" to an acceptable degree. +# See automake bug#10828. +# To make any issue more visible, cause the running configure to be aborted +# by default if the 'rm' program in use doesn't match our expectations; the +# user can still override this though. +if rm -f && rm -fr && rm -rf; then : OK; else + cat >&2 <<'END' +Oops! + +Your 'rm' program seems unable to run without file operands specified +on the command line, even when the '-f' option is present. This is contrary +to the behaviour of most rm programs out there, and not conforming with +the upcoming POSIX standard: + +Please tell bug-automake@gnu.org about your system, including the value +of your $PATH and any error possibly output before this message. This +can help us improve future automake versions. + +END + if test x"$ACCEPT_INFERIOR_RM_PROGRAM" = x"yes"; then + echo 'Configuration will proceed anyway, since you have set the' >&2 + echo 'ACCEPT_INFERIOR_RM_PROGRAM variable to "yes"' >&2 + echo >&2 + else + cat >&2 <<'END' +Aborting the configuration process, to ensure you take notice of the issue. + +You can download and install GNU coreutils to get an 'rm' implementation +that behaves properly: . + +If you want to complete the configuration process using your problematic +'rm' anyway, export the environment variable ACCEPT_INFERIOR_RM_PROGRAM +to "yes", and re-run configure. + +END + as_fn_error $? "Your 'rm' program is bad, sorry." "$LINENO" 5 + fi +fi + +ac_config_headers="$ac_config_headers src/config.h" + + +# check for gtk-doc + + + + + + + + +if test "x$ac_cv_env_PKG_CONFIG_set" != "xset"; then + if test -n "$ac_tool_prefix"; then + # Extract the first word of "${ac_tool_prefix}pkg-config", so it can be a program name with args. +set dummy ${ac_tool_prefix}pkg-config; ac_word=$2 +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 +$as_echo_n "checking for $ac_word... " >&6; } +if ${ac_cv_path_PKG_CONFIG+:} false; then : + $as_echo_n "(cached) " >&6 +else + case $PKG_CONFIG in + [\\/]* | ?:[\\/]*) + ac_cv_path_PKG_CONFIG="$PKG_CONFIG" # Let the user override the test with a path. + ;; + *) + as_save_IFS=$IFS; IFS=$PATH_SEPARATOR +for as_dir in $PATH +do + IFS=$as_save_IFS + test -z "$as_dir" && as_dir=. + for ac_exec_ext in '' $ac_executable_extensions; do + if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then + ac_cv_path_PKG_CONFIG="$as_dir/$ac_word$ac_exec_ext" + $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 + break 2 + fi +done + done +IFS=$as_save_IFS + + ;; +esac +fi +PKG_CONFIG=$ac_cv_path_PKG_CONFIG +if test -n "$PKG_CONFIG"; then + { $as_echo "$as_me:${as_lineno-$LINENO}: result: $PKG_CONFIG" >&5 +$as_echo "$PKG_CONFIG" >&6; } +else + { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 +$as_echo "no" >&6; } +fi + + +fi +if test -z "$ac_cv_path_PKG_CONFIG"; then + ac_pt_PKG_CONFIG=$PKG_CONFIG + # Extract the first word of "pkg-config", so it can be a program name with args. +set dummy pkg-config; ac_word=$2 +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 +$as_echo_n "checking for $ac_word... " >&6; } +if ${ac_cv_path_ac_pt_PKG_CONFIG+:} false; then : + $as_echo_n "(cached) " >&6 +else + case $ac_pt_PKG_CONFIG in + [\\/]* | ?:[\\/]*) + ac_cv_path_ac_pt_PKG_CONFIG="$ac_pt_PKG_CONFIG" # Let the user override the test with a path. + ;; + *) + as_save_IFS=$IFS; IFS=$PATH_SEPARATOR +for as_dir in $PATH +do + IFS=$as_save_IFS + test -z "$as_dir" && as_dir=. + for ac_exec_ext in '' $ac_executable_extensions; do + if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then + ac_cv_path_ac_pt_PKG_CONFIG="$as_dir/$ac_word$ac_exec_ext" + $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 + break 2 + fi +done + done +IFS=$as_save_IFS + + ;; +esac +fi +ac_pt_PKG_CONFIG=$ac_cv_path_ac_pt_PKG_CONFIG +if test -n "$ac_pt_PKG_CONFIG"; then + { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_pt_PKG_CONFIG" >&5 +$as_echo "$ac_pt_PKG_CONFIG" >&6; } +else + { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 +$as_echo "no" >&6; } +fi + + if test "x$ac_pt_PKG_CONFIG" = x; then + PKG_CONFIG="" + else + case $cross_compiling:$ac_tool_warned in +yes:) +{ $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: using cross tools not prefixed with host triplet" >&5 +$as_echo "$as_me: WARNING: using cross tools not prefixed with host triplet" >&2;} +ac_tool_warned=yes ;; +esac + PKG_CONFIG=$ac_pt_PKG_CONFIG + fi +else + PKG_CONFIG="$ac_cv_path_PKG_CONFIG" +fi + +fi +if test -n "$PKG_CONFIG"; then + _pkg_min_version=0.9.0 + { $as_echo "$as_me:${as_lineno-$LINENO}: checking pkg-config is at least version $_pkg_min_version" >&5 +$as_echo_n "checking pkg-config is at least version $_pkg_min_version... " >&6; } + if $PKG_CONFIG --atleast-pkgconfig-version $_pkg_min_version; then + { $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5 +$as_echo "yes" >&6; } + else + { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 +$as_echo "no" >&6; } + PKG_CONFIG="" + fi +fi + + + + gtk_doc_requires="gtk-doc >= 1.0" + { $as_echo "$as_me:${as_lineno-$LINENO}: checking for gtk-doc" >&5 +$as_echo_n "checking for gtk-doc... " >&6; } + if test -n "$PKG_CONFIG" && \ + { { $as_echo "$as_me:${as_lineno-$LINENO}: \$PKG_CONFIG --exists --print-errors \"\$gtk_doc_requires\""; } >&5 + ($PKG_CONFIG --exists --print-errors "$gtk_doc_requires") 2>&5 + ac_status=$? + $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 + test $ac_status = 0; }; then + have_gtk_doc=yes +else + have_gtk_doc=no +fi + { $as_echo "$as_me:${as_lineno-$LINENO}: result: $have_gtk_doc" >&5 +$as_echo "$have_gtk_doc" >&6; } + + if test "$have_gtk_doc" = "no"; then + { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: + You will not be able to create source packages with 'make dist' + because $gtk_doc_requires is not found." >&5 +$as_echo "$as_me: WARNING: + You will not be able to create source packages with 'make dist' + because $gtk_doc_requires is not found." >&2;} + fi + + # Extract the first word of "gtkdoc-check", so it can be a program name with args. +set dummy gtkdoc-check; ac_word=$2 +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 +$as_echo_n "checking for $ac_word... " >&6; } +if ${ac_cv_prog_GTKDOC_CHECK+:} false; then : + $as_echo_n "(cached) " >&6 +else + if test -n "$GTKDOC_CHECK"; then + ac_cv_prog_GTKDOC_CHECK="$GTKDOC_CHECK" # Let the user override the test. +else +as_save_IFS=$IFS; IFS=$PATH_SEPARATOR +for as_dir in $PATH +do + IFS=$as_save_IFS + test -z "$as_dir" && as_dir=. + for ac_exec_ext in '' $ac_executable_extensions; do + if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then + ac_cv_prog_GTKDOC_CHECK="gtkdoc-check.test" + $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 + break 2 + fi +done + done +IFS=$as_save_IFS + +fi +fi +GTKDOC_CHECK=$ac_cv_prog_GTKDOC_CHECK +if test -n "$GTKDOC_CHECK"; then + { $as_echo "$as_me:${as_lineno-$LINENO}: result: $GTKDOC_CHECK" >&5 +$as_echo "$GTKDOC_CHECK" >&6; } +else + { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 +$as_echo "no" >&6; } +fi + + + # Extract the first word of "gtkdoc-check", so it can be a program name with args. +set dummy gtkdoc-check; ac_word=$2 +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 +$as_echo_n "checking for $ac_word... " >&6; } +if ${ac_cv_path_GTKDOC_CHECK_PATH+:} false; then : + $as_echo_n "(cached) " >&6 +else + case $GTKDOC_CHECK_PATH in + [\\/]* | ?:[\\/]*) + ac_cv_path_GTKDOC_CHECK_PATH="$GTKDOC_CHECK_PATH" # Let the user override the test with a path. + ;; + *) + as_save_IFS=$IFS; IFS=$PATH_SEPARATOR +for as_dir in $PATH +do + IFS=$as_save_IFS + test -z "$as_dir" && as_dir=. + for ac_exec_ext in '' $ac_executable_extensions; do + if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then + ac_cv_path_GTKDOC_CHECK_PATH="$as_dir/$ac_word$ac_exec_ext" + $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 + break 2 + fi +done + done +IFS=$as_save_IFS + + ;; +esac +fi +GTKDOC_CHECK_PATH=$ac_cv_path_GTKDOC_CHECK_PATH +if test -n "$GTKDOC_CHECK_PATH"; then + { $as_echo "$as_me:${as_lineno-$LINENO}: result: $GTKDOC_CHECK_PATH" >&5 +$as_echo "$GTKDOC_CHECK_PATH" >&6; } +else + { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 +$as_echo "no" >&6; } +fi + + + for ac_prog in gtkdoc-rebase +do + # Extract the first word of "$ac_prog", so it can be a program name with args. +set dummy $ac_prog; ac_word=$2 +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 +$as_echo_n "checking for $ac_word... " >&6; } +if ${ac_cv_path_GTKDOC_REBASE+:} false; then : + $as_echo_n "(cached) " >&6 +else + case $GTKDOC_REBASE in + [\\/]* | ?:[\\/]*) + ac_cv_path_GTKDOC_REBASE="$GTKDOC_REBASE" # Let the user override the test with a path. + ;; + *) + as_save_IFS=$IFS; IFS=$PATH_SEPARATOR +for as_dir in $PATH +do + IFS=$as_save_IFS + test -z "$as_dir" && as_dir=. + for ac_exec_ext in '' $ac_executable_extensions; do + if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then + ac_cv_path_GTKDOC_REBASE="$as_dir/$ac_word$ac_exec_ext" + $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 + break 2 + fi +done + done +IFS=$as_save_IFS + + ;; +esac +fi +GTKDOC_REBASE=$ac_cv_path_GTKDOC_REBASE +if test -n "$GTKDOC_REBASE"; then + { $as_echo "$as_me:${as_lineno-$LINENO}: result: $GTKDOC_REBASE" >&5 +$as_echo "$GTKDOC_REBASE" >&6; } +else + { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 +$as_echo "no" >&6; } +fi + + + test -n "$GTKDOC_REBASE" && break +done +test -n "$GTKDOC_REBASE" || GTKDOC_REBASE="true" + + # Extract the first word of "gtkdoc-mkpdf", so it can be a program name with args. +set dummy gtkdoc-mkpdf; ac_word=$2 +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 +$as_echo_n "checking for $ac_word... " >&6; } +if ${ac_cv_path_GTKDOC_MKPDF+:} false; then : + $as_echo_n "(cached) " >&6 +else + case $GTKDOC_MKPDF in + [\\/]* | ?:[\\/]*) + ac_cv_path_GTKDOC_MKPDF="$GTKDOC_MKPDF" # Let the user override the test with a path. + ;; + *) + as_save_IFS=$IFS; IFS=$PATH_SEPARATOR +for as_dir in $PATH +do + IFS=$as_save_IFS + test -z "$as_dir" && as_dir=. + for ac_exec_ext in '' $ac_executable_extensions; do + if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then + ac_cv_path_GTKDOC_MKPDF="$as_dir/$ac_word$ac_exec_ext" + $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 + break 2 + fi +done + done +IFS=$as_save_IFS + + ;; +esac +fi +GTKDOC_MKPDF=$ac_cv_path_GTKDOC_MKPDF +if test -n "$GTKDOC_MKPDF"; then + { $as_echo "$as_me:${as_lineno-$LINENO}: result: $GTKDOC_MKPDF" >&5 +$as_echo "$GTKDOC_MKPDF" >&6; } +else + { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 +$as_echo "no" >&6; } +fi + + + + +# Check whether --with-html-dir was given. +if test "${with_html_dir+set}" = set; then : + withval=$with_html_dir; +else + with_html_dir='${datadir}/gtk-doc/html' +fi + + HTML_DIR="$with_html_dir" + + + # Check whether --enable-gtk-doc was given. +if test "${enable_gtk_doc+set}" = set; then : + enableval=$enable_gtk_doc; +else + enable_gtk_doc=no +fi + + + { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether to build gtk-doc documentation" >&5 +$as_echo_n "checking whether to build gtk-doc documentation... " >&6; } + { $as_echo "$as_me:${as_lineno-$LINENO}: result: $enable_gtk_doc" >&5 +$as_echo "$enable_gtk_doc" >&6; } + + if test "x$enable_gtk_doc" = "xyes" && test "$have_gtk_doc" = "no"; then + as_fn_error $? " + You must have $gtk_doc_requires installed to build documentation for + $PACKAGE_NAME. Please install gtk-doc or disable building the + documentation by adding '--disable-gtk-doc' to '$0'." "$LINENO" 5 + fi + + if test "x$PACKAGE_NAME" != "xglib"; then + +pkg_failed=no +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for GTKDOC_DEPS" >&5 +$as_echo_n "checking for GTKDOC_DEPS... " >&6; } + +if test -n "$GTKDOC_DEPS_CFLAGS"; then + pkg_cv_GTKDOC_DEPS_CFLAGS="$GTKDOC_DEPS_CFLAGS" + elif test -n "$PKG_CONFIG"; then + if test -n "$PKG_CONFIG" && \ + { { $as_echo "$as_me:${as_lineno-$LINENO}: \$PKG_CONFIG --exists --print-errors \"glib-2.0 >= 2.10.0 gobject-2.0 >= 2.10.0\""; } >&5 + ($PKG_CONFIG --exists --print-errors "glib-2.0 >= 2.10.0 gobject-2.0 >= 2.10.0") 2>&5 + ac_status=$? + $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 + test $ac_status = 0; }; then + pkg_cv_GTKDOC_DEPS_CFLAGS=`$PKG_CONFIG --cflags "glib-2.0 >= 2.10.0 gobject-2.0 >= 2.10.0" 2>/dev/null` + test "x$?" != "x0" && pkg_failed=yes +else + pkg_failed=yes +fi + else + pkg_failed=untried +fi +if test -n "$GTKDOC_DEPS_LIBS"; then + pkg_cv_GTKDOC_DEPS_LIBS="$GTKDOC_DEPS_LIBS" + elif test -n "$PKG_CONFIG"; then + if test -n "$PKG_CONFIG" && \ + { { $as_echo "$as_me:${as_lineno-$LINENO}: \$PKG_CONFIG --exists --print-errors \"glib-2.0 >= 2.10.0 gobject-2.0 >= 2.10.0\""; } >&5 + ($PKG_CONFIG --exists --print-errors "glib-2.0 >= 2.10.0 gobject-2.0 >= 2.10.0") 2>&5 + ac_status=$? + $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 + test $ac_status = 0; }; then + pkg_cv_GTKDOC_DEPS_LIBS=`$PKG_CONFIG --libs "glib-2.0 >= 2.10.0 gobject-2.0 >= 2.10.0" 2>/dev/null` + test "x$?" != "x0" && pkg_failed=yes +else + pkg_failed=yes +fi + else + pkg_failed=untried +fi + + + +if test $pkg_failed = yes; then + { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 +$as_echo "no" >&6; } + +if $PKG_CONFIG --atleast-pkgconfig-version 0.20; then + _pkg_short_errors_supported=yes +else + _pkg_short_errors_supported=no +fi + if test $_pkg_short_errors_supported = yes; then + GTKDOC_DEPS_PKG_ERRORS=`$PKG_CONFIG --short-errors --print-errors --cflags --libs "glib-2.0 >= 2.10.0 gobject-2.0 >= 2.10.0" 2>&1` + else + GTKDOC_DEPS_PKG_ERRORS=`$PKG_CONFIG --print-errors --cflags --libs "glib-2.0 >= 2.10.0 gobject-2.0 >= 2.10.0" 2>&1` + fi + # Put the nasty error message in config.log where it belongs + echo "$GTKDOC_DEPS_PKG_ERRORS" >&5 + + : +elif test $pkg_failed = untried; then + { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 +$as_echo "no" >&6; } + : +else + GTKDOC_DEPS_CFLAGS=$pkg_cv_GTKDOC_DEPS_CFLAGS + GTKDOC_DEPS_LIBS=$pkg_cv_GTKDOC_DEPS_LIBS + { $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5 +$as_echo "yes" >&6; } + +fi + fi + + # Check whether --enable-gtk-doc-html was given. +if test "${enable_gtk_doc_html+set}" = set; then : + enableval=$enable_gtk_doc_html; +else + enable_gtk_doc_html=yes +fi + + # Check whether --enable-gtk-doc-pdf was given. +if test "${enable_gtk_doc_pdf+set}" = set; then : + enableval=$enable_gtk_doc_pdf; +else + enable_gtk_doc_pdf=no +fi + + + if test -z "$GTKDOC_MKPDF"; then + enable_gtk_doc_pdf=no + fi + + if test -z "$AM_DEFAULT_VERBOSITY"; then + AM_DEFAULT_VERBOSITY=1 + fi + + + if test x$have_gtk_doc = xyes; then + HAVE_GTK_DOC_TRUE= + HAVE_GTK_DOC_FALSE='#' +else + HAVE_GTK_DOC_TRUE='#' + HAVE_GTK_DOC_FALSE= +fi + + if test x$enable_gtk_doc = xyes; then + ENABLE_GTK_DOC_TRUE= + ENABLE_GTK_DOC_FALSE='#' +else + ENABLE_GTK_DOC_TRUE='#' + ENABLE_GTK_DOC_FALSE= +fi + + if test x$enable_gtk_doc_html = xyes; then + GTK_DOC_BUILD_HTML_TRUE= + GTK_DOC_BUILD_HTML_FALSE='#' +else + GTK_DOC_BUILD_HTML_TRUE='#' + GTK_DOC_BUILD_HTML_FALSE= +fi + + if test x$enable_gtk_doc_pdf = xyes; then + GTK_DOC_BUILD_PDF_TRUE= + GTK_DOC_BUILD_PDF_FALSE='#' +else + GTK_DOC_BUILD_PDF_TRUE='#' + GTK_DOC_BUILD_PDF_FALSE= +fi + + if test -n "$LIBTOOL"; then + GTK_DOC_USE_LIBTOOL_TRUE= + GTK_DOC_USE_LIBTOOL_FALSE='#' +else + GTK_DOC_USE_LIBTOOL_TRUE='#' + GTK_DOC_USE_LIBTOOL_FALSE= +fi + + if test -n "$GTKDOC_REBASE"; then + GTK_DOC_USE_REBASE_TRUE= + GTK_DOC_USE_REBASE_FALSE='#' +else + GTK_DOC_USE_REBASE_TRUE='#' + GTK_DOC_USE_REBASE_FALSE= +fi + + + + +ac_ext=c +ac_cpp='$CPP $CPPFLAGS' +ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5' +ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' +ac_compiler_gnu=$ac_cv_c_compiler_gnu +if test -n "$ac_tool_prefix"; then + # Extract the first word of "${ac_tool_prefix}gcc", so it can be a program name with args. +set dummy ${ac_tool_prefix}gcc; ac_word=$2 +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 +$as_echo_n "checking for $ac_word... " >&6; } +if ${ac_cv_prog_CC+:} false; then : + $as_echo_n "(cached) " >&6 +else + if test -n "$CC"; then + ac_cv_prog_CC="$CC" # Let the user override the test. +else +as_save_IFS=$IFS; IFS=$PATH_SEPARATOR +for as_dir in $PATH +do + IFS=$as_save_IFS + test -z "$as_dir" && as_dir=. + for ac_exec_ext in '' $ac_executable_extensions; do + if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then + ac_cv_prog_CC="${ac_tool_prefix}gcc" + $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 + break 2 + fi +done + done +IFS=$as_save_IFS + +fi +fi +CC=$ac_cv_prog_CC +if test -n "$CC"; then + { $as_echo "$as_me:${as_lineno-$LINENO}: result: $CC" >&5 +$as_echo "$CC" >&6; } +else + { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 +$as_echo "no" >&6; } +fi + + +fi +if test -z "$ac_cv_prog_CC"; then + ac_ct_CC=$CC + # Extract the first word of "gcc", so it can be a program name with args. +set dummy gcc; ac_word=$2 +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 +$as_echo_n "checking for $ac_word... " >&6; } +if ${ac_cv_prog_ac_ct_CC+:} false; then : + $as_echo_n "(cached) " >&6 +else + if test -n "$ac_ct_CC"; then + ac_cv_prog_ac_ct_CC="$ac_ct_CC" # Let the user override the test. +else +as_save_IFS=$IFS; IFS=$PATH_SEPARATOR +for as_dir in $PATH +do + IFS=$as_save_IFS + test -z "$as_dir" && as_dir=. + for ac_exec_ext in '' $ac_executable_extensions; do + if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then + ac_cv_prog_ac_ct_CC="gcc" + $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 + break 2 + fi +done + done +IFS=$as_save_IFS + +fi +fi +ac_ct_CC=$ac_cv_prog_ac_ct_CC +if test -n "$ac_ct_CC"; then + { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_ct_CC" >&5 +$as_echo "$ac_ct_CC" >&6; } +else + { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 +$as_echo "no" >&6; } +fi + + if test "x$ac_ct_CC" = x; then + CC="" + else + case $cross_compiling:$ac_tool_warned in +yes:) +{ $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: using cross tools not prefixed with host triplet" >&5 +$as_echo "$as_me: WARNING: using cross tools not prefixed with host triplet" >&2;} +ac_tool_warned=yes ;; +esac + CC=$ac_ct_CC + fi +else + CC="$ac_cv_prog_CC" +fi + +if test -z "$CC"; then + if test -n "$ac_tool_prefix"; then + # Extract the first word of "${ac_tool_prefix}cc", so it can be a program name with args. +set dummy ${ac_tool_prefix}cc; ac_word=$2 +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 +$as_echo_n "checking for $ac_word... " >&6; } +if ${ac_cv_prog_CC+:} false; then : + $as_echo_n "(cached) " >&6 +else + if test -n "$CC"; then + ac_cv_prog_CC="$CC" # Let the user override the test. +else +as_save_IFS=$IFS; IFS=$PATH_SEPARATOR +for as_dir in $PATH +do + IFS=$as_save_IFS + test -z "$as_dir" && as_dir=. + for ac_exec_ext in '' $ac_executable_extensions; do + if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then + ac_cv_prog_CC="${ac_tool_prefix}cc" + $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 + break 2 + fi +done + done +IFS=$as_save_IFS + +fi +fi +CC=$ac_cv_prog_CC +if test -n "$CC"; then + { $as_echo "$as_me:${as_lineno-$LINENO}: result: $CC" >&5 +$as_echo "$CC" >&6; } +else + { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 +$as_echo "no" >&6; } +fi + + + fi +fi +if test -z "$CC"; then + # Extract the first word of "cc", so it can be a program name with args. +set dummy cc; ac_word=$2 +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 +$as_echo_n "checking for $ac_word... " >&6; } +if ${ac_cv_prog_CC+:} false; then : + $as_echo_n "(cached) " >&6 +else + if test -n "$CC"; then + ac_cv_prog_CC="$CC" # Let the user override the test. +else + ac_prog_rejected=no +as_save_IFS=$IFS; IFS=$PATH_SEPARATOR +for as_dir in $PATH +do + IFS=$as_save_IFS + test -z "$as_dir" && as_dir=. + for ac_exec_ext in '' $ac_executable_extensions; do + if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then + if test "$as_dir/$ac_word$ac_exec_ext" = "/usr/ucb/cc"; then + ac_prog_rejected=yes + continue + fi + ac_cv_prog_CC="cc" + $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 + break 2 + fi +done + done +IFS=$as_save_IFS + +if test $ac_prog_rejected = yes; then + # We found a bogon in the path, so make sure we never use it. + set dummy $ac_cv_prog_CC + shift + if test $# != 0; then + # We chose a different compiler from the bogus one. + # However, it has the same basename, so the bogon will be chosen + # first if we set CC to just the basename; use the full file name. + shift + ac_cv_prog_CC="$as_dir/$ac_word${1+' '}$@" + fi +fi +fi +fi +CC=$ac_cv_prog_CC +if test -n "$CC"; then + { $as_echo "$as_me:${as_lineno-$LINENO}: result: $CC" >&5 +$as_echo "$CC" >&6; } +else + { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 +$as_echo "no" >&6; } +fi + + +fi +if test -z "$CC"; then + if test -n "$ac_tool_prefix"; then + for ac_prog in cl.exe + do + # Extract the first word of "$ac_tool_prefix$ac_prog", so it can be a program name with args. +set dummy $ac_tool_prefix$ac_prog; ac_word=$2 +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 +$as_echo_n "checking for $ac_word... " >&6; } +if ${ac_cv_prog_CC+:} false; then : + $as_echo_n "(cached) " >&6 +else + if test -n "$CC"; then + ac_cv_prog_CC="$CC" # Let the user override the test. +else +as_save_IFS=$IFS; IFS=$PATH_SEPARATOR +for as_dir in $PATH +do + IFS=$as_save_IFS + test -z "$as_dir" && as_dir=. + for ac_exec_ext in '' $ac_executable_extensions; do + if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then + ac_cv_prog_CC="$ac_tool_prefix$ac_prog" + $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 + break 2 + fi +done + done +IFS=$as_save_IFS + +fi +fi +CC=$ac_cv_prog_CC +if test -n "$CC"; then + { $as_echo "$as_me:${as_lineno-$LINENO}: result: $CC" >&5 +$as_echo "$CC" >&6; } +else + { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 +$as_echo "no" >&6; } +fi + + + test -n "$CC" && break + done +fi +if test -z "$CC"; then + ac_ct_CC=$CC + for ac_prog in cl.exe +do + # Extract the first word of "$ac_prog", so it can be a program name with args. +set dummy $ac_prog; ac_word=$2 +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 +$as_echo_n "checking for $ac_word... " >&6; } +if ${ac_cv_prog_ac_ct_CC+:} false; then : + $as_echo_n "(cached) " >&6 +else + if test -n "$ac_ct_CC"; then + ac_cv_prog_ac_ct_CC="$ac_ct_CC" # Let the user override the test. +else +as_save_IFS=$IFS; IFS=$PATH_SEPARATOR +for as_dir in $PATH +do + IFS=$as_save_IFS + test -z "$as_dir" && as_dir=. + for ac_exec_ext in '' $ac_executable_extensions; do + if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then + ac_cv_prog_ac_ct_CC="$ac_prog" + $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 + break 2 + fi +done + done +IFS=$as_save_IFS + +fi +fi +ac_ct_CC=$ac_cv_prog_ac_ct_CC +if test -n "$ac_ct_CC"; then + { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_ct_CC" >&5 +$as_echo "$ac_ct_CC" >&6; } +else + { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 +$as_echo "no" >&6; } +fi + + + test -n "$ac_ct_CC" && break +done + + if test "x$ac_ct_CC" = x; then + CC="" + else + case $cross_compiling:$ac_tool_warned in +yes:) +{ $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: using cross tools not prefixed with host triplet" >&5 +$as_echo "$as_me: WARNING: using cross tools not prefixed with host triplet" >&2;} +ac_tool_warned=yes ;; +esac + CC=$ac_ct_CC + fi +fi + +fi + + +test -z "$CC" && { { $as_echo "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5 +$as_echo "$as_me: error: in \`$ac_pwd':" >&2;} +as_fn_error $? "no acceptable C compiler found in \$PATH +See \`config.log' for more details" "$LINENO" 5; } + +# Provide some information about the compiler. +$as_echo "$as_me:${as_lineno-$LINENO}: checking for C compiler version" >&5 +set X $ac_compile +ac_compiler=$2 +for ac_option in --version -v -V -qversion; do + { { ac_try="$ac_compiler $ac_option >&5" +case "(($ac_try" in + *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; + *) ac_try_echo=$ac_try;; +esac +eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\"" +$as_echo "$ac_try_echo"; } >&5 + (eval "$ac_compiler $ac_option >&5") 2>conftest.err + ac_status=$? + if test -s conftest.err; then + sed '10a\ +... rest of stderr output deleted ... + 10q' conftest.err >conftest.er1 + cat conftest.er1 >&5 + fi + rm -f conftest.er1 conftest.err + $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 + test $ac_status = 0; } +done + +cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ + +int +main () +{ + + ; + return 0; +} +_ACEOF +ac_clean_files_save=$ac_clean_files +ac_clean_files="$ac_clean_files a.out a.out.dSYM a.exe b.out" +# Try to create an executable without -o first, disregard a.out. +# It will help us diagnose broken compilers, and finding out an intuition +# of exeext. +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking whether the C compiler works" >&5 +$as_echo_n "checking whether the C compiler works... " >&6; } +ac_link_default=`$as_echo "$ac_link" | sed 's/ -o *conftest[^ ]*//'` + +# The possible output files: +ac_files="a.out conftest.exe conftest a.exe a_out.exe b.out conftest.*" + +ac_rmfiles= +for ac_file in $ac_files +do + case $ac_file in + *.$ac_ext | *.xcoff | *.tds | *.d | *.pdb | *.xSYM | *.bb | *.bbg | *.map | *.inf | *.dSYM | *.o | *.obj ) ;; + * ) ac_rmfiles="$ac_rmfiles $ac_file";; + esac +done +rm -f $ac_rmfiles + +if { { ac_try="$ac_link_default" +case "(($ac_try" in + *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; + *) ac_try_echo=$ac_try;; +esac +eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\"" +$as_echo "$ac_try_echo"; } >&5 + (eval "$ac_link_default") 2>&5 + ac_status=$? + $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 + test $ac_status = 0; }; then : + # Autoconf-2.13 could set the ac_cv_exeext variable to `no'. +# So ignore a value of `no', otherwise this would lead to `EXEEXT = no' +# in a Makefile. We should not override ac_cv_exeext if it was cached, +# so that the user can short-circuit this test for compilers unknown to +# Autoconf. +for ac_file in $ac_files '' +do + test -f "$ac_file" || continue + case $ac_file in + *.$ac_ext | *.xcoff | *.tds | *.d | *.pdb | *.xSYM | *.bb | *.bbg | *.map | *.inf | *.dSYM | *.o | *.obj ) + ;; + [ab].out ) + # We found the default executable, but exeext='' is most + # certainly right. + break;; + *.* ) + if test "${ac_cv_exeext+set}" = set && test "$ac_cv_exeext" != no; + then :; else + ac_cv_exeext=`expr "$ac_file" : '[^.]*\(\..*\)'` + fi + # We set ac_cv_exeext here because the later test for it is not + # safe: cross compilers may not add the suffix if given an `-o' + # argument, so we may need to know it at that point already. + # Even if this section looks crufty: it has the advantage of + # actually working. + break;; + * ) + break;; + esac +done +test "$ac_cv_exeext" = no && ac_cv_exeext= + +else + ac_file='' +fi +if test -z "$ac_file"; then : + { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 +$as_echo "no" >&6; } +$as_echo "$as_me: failed program was:" >&5 +sed 's/^/| /' conftest.$ac_ext >&5 + +{ { $as_echo "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5 +$as_echo "$as_me: error: in \`$ac_pwd':" >&2;} +as_fn_error 77 "C compiler cannot create executables +See \`config.log' for more details" "$LINENO" 5; } +else + { $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5 +$as_echo "yes" >&6; } +fi +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for C compiler default output file name" >&5 +$as_echo_n "checking for C compiler default output file name... " >&6; } +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_file" >&5 +$as_echo "$ac_file" >&6; } +ac_exeext=$ac_cv_exeext + +rm -f -r a.out a.out.dSYM a.exe conftest$ac_cv_exeext b.out +ac_clean_files=$ac_clean_files_save +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for suffix of executables" >&5 +$as_echo_n "checking for suffix of executables... " >&6; } +if { { ac_try="$ac_link" +case "(($ac_try" in + *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; + *) ac_try_echo=$ac_try;; +esac +eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\"" +$as_echo "$ac_try_echo"; } >&5 + (eval "$ac_link") 2>&5 + ac_status=$? + $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 + test $ac_status = 0; }; then : + # If both `conftest.exe' and `conftest' are `present' (well, observable) +# catch `conftest.exe'. For instance with Cygwin, `ls conftest' will +# work properly (i.e., refer to `conftest.exe'), while it won't with +# `rm'. +for ac_file in conftest.exe conftest conftest.*; do + test -f "$ac_file" || continue + case $ac_file in + *.$ac_ext | *.xcoff | *.tds | *.d | *.pdb | *.xSYM | *.bb | *.bbg | *.map | *.inf | *.dSYM | *.o | *.obj ) ;; + *.* ) ac_cv_exeext=`expr "$ac_file" : '[^.]*\(\..*\)'` + break;; + * ) break;; + esac +done +else + { { $as_echo "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5 +$as_echo "$as_me: error: in \`$ac_pwd':" >&2;} +as_fn_error $? "cannot compute suffix of executables: cannot compile and link +See \`config.log' for more details" "$LINENO" 5; } +fi +rm -f conftest conftest$ac_cv_exeext +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_exeext" >&5 +$as_echo "$ac_cv_exeext" >&6; } + +rm -f conftest.$ac_ext +EXEEXT=$ac_cv_exeext +ac_exeext=$EXEEXT +cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ +#include +int +main () +{ +FILE *f = fopen ("conftest.out", "w"); + return ferror (f) || fclose (f) != 0; + + ; + return 0; +} +_ACEOF +ac_clean_files="$ac_clean_files conftest.out" +# Check that the compiler produces executables we can run. If not, either +# the compiler is broken, or we cross compile. +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking whether we are cross compiling" >&5 +$as_echo_n "checking whether we are cross compiling... " >&6; } +if test "$cross_compiling" != yes; then + { { ac_try="$ac_link" +case "(($ac_try" in + *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; + *) ac_try_echo=$ac_try;; +esac +eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\"" +$as_echo "$ac_try_echo"; } >&5 + (eval "$ac_link") 2>&5 + ac_status=$? + $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 + test $ac_status = 0; } + if { ac_try='./conftest$ac_cv_exeext' + { { case "(($ac_try" in + *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; + *) ac_try_echo=$ac_try;; +esac +eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\"" +$as_echo "$ac_try_echo"; } >&5 + (eval "$ac_try") 2>&5 + ac_status=$? + $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 + test $ac_status = 0; }; }; then + cross_compiling=no + else + if test "$cross_compiling" = maybe; then + cross_compiling=yes + else + { { $as_echo "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5 +$as_echo "$as_me: error: in \`$ac_pwd':" >&2;} +as_fn_error $? "cannot run C compiled programs. +If you meant to cross compile, use \`--host'. +See \`config.log' for more details" "$LINENO" 5; } + fi + fi +fi +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $cross_compiling" >&5 +$as_echo "$cross_compiling" >&6; } + +rm -f conftest.$ac_ext conftest$ac_cv_exeext conftest.out +ac_clean_files=$ac_clean_files_save +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for suffix of object files" >&5 +$as_echo_n "checking for suffix of object files... " >&6; } +if ${ac_cv_objext+:} false; then : + $as_echo_n "(cached) " >&6 +else + cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ + +int +main () +{ + + ; + return 0; +} +_ACEOF +rm -f conftest.o conftest.obj +if { { ac_try="$ac_compile" +case "(($ac_try" in + *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; + *) ac_try_echo=$ac_try;; +esac +eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\"" +$as_echo "$ac_try_echo"; } >&5 + (eval "$ac_compile") 2>&5 + ac_status=$? + $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 + test $ac_status = 0; }; then : + for ac_file in conftest.o conftest.obj conftest.*; do + test -f "$ac_file" || continue; + case $ac_file in + *.$ac_ext | *.xcoff | *.tds | *.d | *.pdb | *.xSYM | *.bb | *.bbg | *.map | *.inf | *.dSYM ) ;; + *) ac_cv_objext=`expr "$ac_file" : '.*\.\(.*\)'` + break;; + esac +done +else + $as_echo "$as_me: failed program was:" >&5 +sed 's/^/| /' conftest.$ac_ext >&5 + +{ { $as_echo "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5 +$as_echo "$as_me: error: in \`$ac_pwd':" >&2;} +as_fn_error $? "cannot compute suffix of object files: cannot compile +See \`config.log' for more details" "$LINENO" 5; } +fi +rm -f conftest.$ac_cv_objext conftest.$ac_ext +fi +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_objext" >&5 +$as_echo "$ac_cv_objext" >&6; } +OBJEXT=$ac_cv_objext +ac_objext=$OBJEXT +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking whether we are using the GNU C compiler" >&5 +$as_echo_n "checking whether we are using the GNU C compiler... " >&6; } +if ${ac_cv_c_compiler_gnu+:} false; then : + $as_echo_n "(cached) " >&6 +else + cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ + +int +main () +{ +#ifndef __GNUC__ + choke me +#endif + + ; + return 0; +} +_ACEOF +if ac_fn_c_try_compile "$LINENO"; then : + ac_compiler_gnu=yes +else + ac_compiler_gnu=no +fi +rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext +ac_cv_c_compiler_gnu=$ac_compiler_gnu + +fi +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_c_compiler_gnu" >&5 +$as_echo "$ac_cv_c_compiler_gnu" >&6; } +if test $ac_compiler_gnu = yes; then + GCC=yes +else + GCC= +fi +ac_test_CFLAGS=${CFLAGS+set} +ac_save_CFLAGS=$CFLAGS +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking whether $CC accepts -g" >&5 +$as_echo_n "checking whether $CC accepts -g... " >&6; } +if ${ac_cv_prog_cc_g+:} false; then : + $as_echo_n "(cached) " >&6 +else + ac_save_c_werror_flag=$ac_c_werror_flag + ac_c_werror_flag=yes + ac_cv_prog_cc_g=no + CFLAGS="-g" + cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ + +int +main () +{ + + ; + return 0; +} +_ACEOF +if ac_fn_c_try_compile "$LINENO"; then : + ac_cv_prog_cc_g=yes +else + CFLAGS="" + cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ + +int +main () +{ + + ; + return 0; +} +_ACEOF +if ac_fn_c_try_compile "$LINENO"; then : + +else + ac_c_werror_flag=$ac_save_c_werror_flag + CFLAGS="-g" + cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ + +int +main () +{ + + ; + return 0; +} +_ACEOF +if ac_fn_c_try_compile "$LINENO"; then : + ac_cv_prog_cc_g=yes +fi +rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext +fi +rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext +fi +rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext + ac_c_werror_flag=$ac_save_c_werror_flag +fi +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_prog_cc_g" >&5 +$as_echo "$ac_cv_prog_cc_g" >&6; } +if test "$ac_test_CFLAGS" = set; then + CFLAGS=$ac_save_CFLAGS +elif test $ac_cv_prog_cc_g = yes; then + if test "$GCC" = yes; then + CFLAGS="-g -O2" + else + CFLAGS="-g" + fi +else + if test "$GCC" = yes; then + CFLAGS="-O2" + else + CFLAGS= + fi +fi +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $CC option to accept ISO C89" >&5 +$as_echo_n "checking for $CC option to accept ISO C89... " >&6; } +if ${ac_cv_prog_cc_c89+:} false; then : + $as_echo_n "(cached) " >&6 +else + ac_cv_prog_cc_c89=no +ac_save_CC=$CC +cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ +#include +#include +struct stat; +/* Most of the following tests are stolen from RCS 5.7's src/conf.sh. */ +struct buf { int x; }; +FILE * (*rcsopen) (struct buf *, struct stat *, int); +static char *e (p, i) + char **p; + int i; +{ + return p[i]; +} +static char *f (char * (*g) (char **, int), char **p, ...) +{ + char *s; + va_list v; + va_start (v,p); + s = g (p, va_arg (v,int)); + va_end (v); + return s; +} + +/* OSF 4.0 Compaq cc is some sort of almost-ANSI by default. It has + function prototypes and stuff, but not '\xHH' hex character constants. + These don't provoke an error unfortunately, instead are silently treated + as 'x'. The following induces an error, until -std is added to get + proper ANSI mode. Curiously '\x00'!='x' always comes out true, for an + array size at least. It's necessary to write '\x00'==0 to get something + that's true only with -std. */ +int osf4_cc_array ['\x00' == 0 ? 1 : -1]; + +/* IBM C 6 for AIX is almost-ANSI by default, but it replaces macro parameters + inside strings and character constants. */ +#define FOO(x) 'x' +int xlc6_cc_array[FOO(a) == 'x' ? 1 : -1]; + +int test (int i, double x); +struct s1 {int (*f) (int a);}; +struct s2 {int (*f) (double a);}; +int pairnames (int, char **, FILE *(*)(struct buf *, struct stat *, int), int, int); +int argc; +char **argv; +int +main () +{ +return f (e, argv, 0) != argv[0] || f (e, argv, 1) != argv[1]; + ; + return 0; +} +_ACEOF +for ac_arg in '' -qlanglvl=extc89 -qlanglvl=ansi -std \ + -Ae "-Aa -D_HPUX_SOURCE" "-Xc -D__EXTENSIONS__" +do + CC="$ac_save_CC $ac_arg" + if ac_fn_c_try_compile "$LINENO"; then : + ac_cv_prog_cc_c89=$ac_arg +fi +rm -f core conftest.err conftest.$ac_objext + test "x$ac_cv_prog_cc_c89" != "xno" && break +done +rm -f conftest.$ac_ext +CC=$ac_save_CC + +fi +# AC_CACHE_VAL +case "x$ac_cv_prog_cc_c89" in + x) + { $as_echo "$as_me:${as_lineno-$LINENO}: result: none needed" >&5 +$as_echo "none needed" >&6; } ;; + xno) + { $as_echo "$as_me:${as_lineno-$LINENO}: result: unsupported" >&5 +$as_echo "unsupported" >&6; } ;; + *) + CC="$CC $ac_cv_prog_cc_c89" + { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_prog_cc_c89" >&5 +$as_echo "$ac_cv_prog_cc_c89" >&6; } ;; +esac +if test "x$ac_cv_prog_cc_c89" != xno; then : + +fi + +ac_ext=c +ac_cpp='$CPP $CPPFLAGS' +ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5' +ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' +ac_compiler_gnu=$ac_cv_c_compiler_gnu + +ac_ext=c +ac_cpp='$CPP $CPPFLAGS' +ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5' +ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' +ac_compiler_gnu=$ac_cv_c_compiler_gnu +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking whether $CC understands -c and -o together" >&5 +$as_echo_n "checking whether $CC understands -c and -o together... " >&6; } +if ${am_cv_prog_cc_c_o+:} false; then : + $as_echo_n "(cached) " >&6 +else + cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ + +int +main () +{ + + ; + return 0; +} +_ACEOF + # Make sure it works both with $CC and with simple cc. + # Following AC_PROG_CC_C_O, we do the test twice because some + # compilers refuse to overwrite an existing .o file with -o, + # though they will create one. + am_cv_prog_cc_c_o=yes + for am_i in 1 2; do + if { echo "$as_me:$LINENO: $CC -c conftest.$ac_ext -o conftest2.$ac_objext" >&5 + ($CC -c conftest.$ac_ext -o conftest2.$ac_objext) >&5 2>&5 + ac_status=$? + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); } \ + && test -f conftest2.$ac_objext; then + : OK + else + am_cv_prog_cc_c_o=no + break + fi + done + rm -f core conftest* + unset am_i +fi +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $am_cv_prog_cc_c_o" >&5 +$as_echo "$am_cv_prog_cc_c_o" >&6; } +if test "$am_cv_prog_cc_c_o" != yes; then + # Losing compiler, so override with the script. + # FIXME: It is wrong to rewrite CC. + # But if we don't then we get into trouble of one sort or another. + # A longer-term fix would be to have automake use am__CC in this case, + # and then we could set am__CC="\$(top_srcdir)/compile \$(CC)" + CC="$am_aux_dir/compile $CC" +fi +ac_ext=c +ac_cpp='$CPP $CPPFLAGS' +ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5' +ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' +ac_compiler_gnu=$ac_cv_c_compiler_gnu + +DEPDIR="${am__leading_dot}deps" + +ac_config_commands="$ac_config_commands depfiles" + +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking whether ${MAKE-make} supports the include directive" >&5 +$as_echo_n "checking whether ${MAKE-make} supports the include directive... " >&6; } +cat > confinc.mk << 'END' +am__doit: + @echo this is the am__doit target >confinc.out +.PHONY: am__doit +END +am__include="#" +am__quote= +# BSD make does it like this. +echo '.include "confinc.mk" # ignored' > confmf.BSD +# Other make implementations (GNU, Solaris 10, AIX) do it like this. +echo 'include confinc.mk # ignored' > confmf.GNU +_am_result=no +for s in GNU BSD; do + { echo "$as_me:$LINENO: ${MAKE-make} -f confmf.$s && cat confinc.out" >&5 + (${MAKE-make} -f confmf.$s && cat confinc.out) >&5 2>&5 + ac_status=$? + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); } + case $?:`cat confinc.out 2>/dev/null` in #( + '0:this is the am__doit target') : + case $s in #( + BSD) : + am__include='.include' am__quote='"' ;; #( + *) : + am__include='include' am__quote='' ;; +esac ;; #( + *) : + ;; +esac + if test "$am__include" != "#"; then + _am_result="yes ($s style)" + break + fi +done +rm -f confinc.* confmf.* +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: ${_am_result}" >&5 +$as_echo "${_am_result}" >&6; } + +# Check whether --enable-dependency-tracking was given. +if test "${enable_dependency_tracking+set}" = set; then : + enableval=$enable_dependency_tracking; +fi + +if test "x$enable_dependency_tracking" != xno; then + am_depcomp="$ac_aux_dir/depcomp" + AMDEPBACKSLASH='\' + am__nodep='_no' +fi + if test "x$enable_dependency_tracking" != xno; then + AMDEP_TRUE= + AMDEP_FALSE='#' +else + AMDEP_TRUE='#' + AMDEP_FALSE= +fi + + + +depcc="$CC" am_compiler_list= + +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking dependency style of $depcc" >&5 +$as_echo_n "checking dependency style of $depcc... " >&6; } +if ${am_cv_CC_dependencies_compiler_type+:} false; then : + $as_echo_n "(cached) " >&6 +else + if test -z "$AMDEP_TRUE" && test -f "$am_depcomp"; then + # We make a subdir and do the tests there. Otherwise we can end up + # making bogus files that we don't know about and never remove. For + # instance it was reported that on HP-UX the gcc test will end up + # making a dummy file named 'D' -- because '-MD' means "put the output + # in D". + rm -rf conftest.dir + mkdir conftest.dir + # Copy depcomp to subdir because otherwise we won't find it if we're + # using a relative directory. + cp "$am_depcomp" conftest.dir + cd conftest.dir + # We will build objects and dependencies in a subdirectory because + # it helps to detect inapplicable dependency modes. For instance + # both Tru64's cc and ICC support -MD to output dependencies as a + # side effect of compilation, but ICC will put the dependencies in + # the current directory while Tru64 will put them in the object + # directory. + mkdir sub + + am_cv_CC_dependencies_compiler_type=none + if test "$am_compiler_list" = ""; then + am_compiler_list=`sed -n 's/^#*\([a-zA-Z0-9]*\))$/\1/p' < ./depcomp` + fi + am__universal=false + case " $depcc " in #( + *\ -arch\ *\ -arch\ *) am__universal=true ;; + esac + + for depmode in $am_compiler_list; do + # Setup a source with many dependencies, because some compilers + # like to wrap large dependency lists on column 80 (with \), and + # we should not choose a depcomp mode which is confused by this. + # + # We need to recreate these files for each test, as the compiler may + # overwrite some of them when testing with obscure command lines. + # This happens at least with the AIX C compiler. + : > sub/conftest.c + for i in 1 2 3 4 5 6; do + echo '#include "conftst'$i'.h"' >> sub/conftest.c + # Using ": > sub/conftst$i.h" creates only sub/conftst1.h with + # Solaris 10 /bin/sh. + echo '/* dummy */' > sub/conftst$i.h + done + echo "${am__include} ${am__quote}sub/conftest.Po${am__quote}" > confmf + + # We check with '-c' and '-o' for the sake of the "dashmstdout" + # mode. It turns out that the SunPro C++ compiler does not properly + # handle '-M -o', and we need to detect this. Also, some Intel + # versions had trouble with output in subdirs. + am__obj=sub/conftest.${OBJEXT-o} + am__minus_obj="-o $am__obj" + case $depmode in + gcc) + # This depmode causes a compiler race in universal mode. + test "$am__universal" = false || continue + ;; + nosideeffect) + # After this tag, mechanisms are not by side-effect, so they'll + # only be used when explicitly requested. + if test "x$enable_dependency_tracking" = xyes; then + continue + else + break + fi + ;; + msvc7 | msvc7msys | msvisualcpp | msvcmsys) + # This compiler won't grok '-c -o', but also, the minuso test has + # not run yet. These depmodes are late enough in the game, and + # so weak that their functioning should not be impacted. + am__obj=conftest.${OBJEXT-o} + am__minus_obj= + ;; + none) break ;; + esac + if depmode=$depmode \ + source=sub/conftest.c object=$am__obj \ + depfile=sub/conftest.Po tmpdepfile=sub/conftest.TPo \ + $SHELL ./depcomp $depcc -c $am__minus_obj sub/conftest.c \ + >/dev/null 2>conftest.err && + grep sub/conftst1.h sub/conftest.Po > /dev/null 2>&1 && + grep sub/conftst6.h sub/conftest.Po > /dev/null 2>&1 && + grep $am__obj sub/conftest.Po > /dev/null 2>&1 && + ${MAKE-make} -s -f confmf > /dev/null 2>&1; then + # icc doesn't choke on unknown options, it will just issue warnings + # or remarks (even with -Werror). So we grep stderr for any message + # that says an option was ignored or not supported. + # When given -MP, icc 7.0 and 7.1 complain thusly: + # icc: Command line warning: ignoring option '-M'; no argument required + # The diagnosis changed in icc 8.0: + # icc: Command line remark: option '-MP' not supported + if (grep 'ignoring option' conftest.err || + grep 'not supported' conftest.err) >/dev/null 2>&1; then :; else + am_cv_CC_dependencies_compiler_type=$depmode + break + fi + fi + done + + cd .. + rm -rf conftest.dir +else + am_cv_CC_dependencies_compiler_type=none +fi + +fi +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $am_cv_CC_dependencies_compiler_type" >&5 +$as_echo "$am_cv_CC_dependencies_compiler_type" >&6; } +CCDEPMODE=depmode=$am_cv_CC_dependencies_compiler_type + + if + test "x$enable_dependency_tracking" != xno \ + && test "$am_cv_CC_dependencies_compiler_type" = gcc3; then + am__fastdepCC_TRUE= + am__fastdepCC_FALSE='#' +else + am__fastdepCC_TRUE='#' + am__fastdepCC_FALSE= +fi + + + case $ac_cv_prog_cc_stdc in #( + no) : + ac_cv_prog_cc_c99=no; ac_cv_prog_cc_c89=no ;; #( + *) : + { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $CC option to accept ISO C99" >&5 +$as_echo_n "checking for $CC option to accept ISO C99... " >&6; } +if ${ac_cv_prog_cc_c99+:} false; then : + $as_echo_n "(cached) " >&6 +else + ac_cv_prog_cc_c99=no +ac_save_CC=$CC +cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ +#include +#include +#include +#include +#include + +// Check varargs macros. These examples are taken from C99 6.10.3.5. +#define debug(...) fprintf (stderr, __VA_ARGS__) +#define showlist(...) puts (#__VA_ARGS__) +#define report(test,...) ((test) ? puts (#test) : printf (__VA_ARGS__)) +static void +test_varargs_macros (void) +{ + int x = 1234; + int y = 5678; + debug ("Flag"); + debug ("X = %d\n", x); + showlist (The first, second, and third items.); + report (x>y, "x is %d but y is %d", x, y); +} + +// Check long long types. +#define BIG64 18446744073709551615ull +#define BIG32 4294967295ul +#define BIG_OK (BIG64 / BIG32 == 4294967297ull && BIG64 % BIG32 == 0) +#if !BIG_OK + your preprocessor is broken; +#endif +#if BIG_OK +#else + your preprocessor is broken; +#endif +static long long int bignum = -9223372036854775807LL; +static unsigned long long int ubignum = BIG64; + +struct incomplete_array +{ + int datasize; + double data[]; +}; + +struct named_init { + int number; + const wchar_t *name; + double average; +}; + +typedef const char *ccp; + +static inline int +test_restrict (ccp restrict text) +{ + // See if C++-style comments work. + // Iterate through items via the restricted pointer. + // Also check for declarations in for loops. + for (unsigned int i = 0; *(text+i) != '\0'; ++i) + continue; + return 0; +} + +// Check varargs and va_copy. +static void +test_varargs (const char *format, ...) +{ + va_list args; + va_start (args, format); + va_list args_copy; + va_copy (args_copy, args); + + const char *str; + int number; + float fnumber; + + while (*format) + { + switch (*format++) + { + case 's': // string + str = va_arg (args_copy, const char *); + break; + case 'd': // int + number = va_arg (args_copy, int); + break; + case 'f': // float + fnumber = va_arg (args_copy, double); + break; + default: + break; + } + } + va_end (args_copy); + va_end (args); +} + +int +main () +{ + + // Check bool. + _Bool success = false; + + // Check restrict. + if (test_restrict ("String literal") == 0) + success = true; + char *restrict newvar = "Another string"; + + // Check varargs. + test_varargs ("s, d' f .", "string", 65, 34.234); + test_varargs_macros (); + + // Check flexible array members. + struct incomplete_array *ia = + malloc (sizeof (struct incomplete_array) + (sizeof (double) * 10)); + ia->datasize = 10; + for (int i = 0; i < ia->datasize; ++i) + ia->data[i] = i * 1.234; + + // Check named initializers. + struct named_init ni = { + .number = 34, + .name = L"Test wide string", + .average = 543.34343, + }; + + ni.number = 58; + + int dynamic_array[ni.number]; + dynamic_array[ni.number - 1] = 543; + + // work around unused variable warnings + return (!success || bignum == 0LL || ubignum == 0uLL || newvar[0] == 'x' + || dynamic_array[ni.number - 1] != 543); + + ; + return 0; +} +_ACEOF +for ac_arg in '' -std=gnu99 -std=c99 -c99 -AC99 -D_STDC_C99= -qlanglvl=extc99 +do + CC="$ac_save_CC $ac_arg" + if ac_fn_c_try_compile "$LINENO"; then : + ac_cv_prog_cc_c99=$ac_arg +fi +rm -f core conftest.err conftest.$ac_objext + test "x$ac_cv_prog_cc_c99" != "xno" && break +done +rm -f conftest.$ac_ext +CC=$ac_save_CC + +fi +# AC_CACHE_VAL +case "x$ac_cv_prog_cc_c99" in + x) + { $as_echo "$as_me:${as_lineno-$LINENO}: result: none needed" >&5 +$as_echo "none needed" >&6; } ;; + xno) + { $as_echo "$as_me:${as_lineno-$LINENO}: result: unsupported" >&5 +$as_echo "unsupported" >&6; } ;; + *) + CC="$CC $ac_cv_prog_cc_c99" + { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_prog_cc_c99" >&5 +$as_echo "$ac_cv_prog_cc_c99" >&6; } ;; +esac +if test "x$ac_cv_prog_cc_c99" != xno; then : + ac_cv_prog_cc_stdc=$ac_cv_prog_cc_c99 +else + { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $CC option to accept ISO C89" >&5 +$as_echo_n "checking for $CC option to accept ISO C89... " >&6; } +if ${ac_cv_prog_cc_c89+:} false; then : + $as_echo_n "(cached) " >&6 +else + ac_cv_prog_cc_c89=no +ac_save_CC=$CC +cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ +#include +#include +struct stat; +/* Most of the following tests are stolen from RCS 5.7's src/conf.sh. */ +struct buf { int x; }; +FILE * (*rcsopen) (struct buf *, struct stat *, int); +static char *e (p, i) + char **p; + int i; +{ + return p[i]; +} +static char *f (char * (*g) (char **, int), char **p, ...) +{ + char *s; + va_list v; + va_start (v,p); + s = g (p, va_arg (v,int)); + va_end (v); + return s; +} + +/* OSF 4.0 Compaq cc is some sort of almost-ANSI by default. It has + function prototypes and stuff, but not '\xHH' hex character constants. + These don't provoke an error unfortunately, instead are silently treated + as 'x'. The following induces an error, until -std is added to get + proper ANSI mode. Curiously '\x00'!='x' always comes out true, for an + array size at least. It's necessary to write '\x00'==0 to get something + that's true only with -std. */ +int osf4_cc_array ['\x00' == 0 ? 1 : -1]; + +/* IBM C 6 for AIX is almost-ANSI by default, but it replaces macro parameters + inside strings and character constants. */ +#define FOO(x) 'x' +int xlc6_cc_array[FOO(a) == 'x' ? 1 : -1]; + +int test (int i, double x); +struct s1 {int (*f) (int a);}; +struct s2 {int (*f) (double a);}; +int pairnames (int, char **, FILE *(*)(struct buf *, struct stat *, int), int, int); +int argc; +char **argv; +int +main () +{ +return f (e, argv, 0) != argv[0] || f (e, argv, 1) != argv[1]; + ; + return 0; +} +_ACEOF +for ac_arg in '' -qlanglvl=extc89 -qlanglvl=ansi -std \ + -Ae "-Aa -D_HPUX_SOURCE" "-Xc -D__EXTENSIONS__" +do + CC="$ac_save_CC $ac_arg" + if ac_fn_c_try_compile "$LINENO"; then : + ac_cv_prog_cc_c89=$ac_arg +fi +rm -f core conftest.err conftest.$ac_objext + test "x$ac_cv_prog_cc_c89" != "xno" && break +done +rm -f conftest.$ac_ext +CC=$ac_save_CC + +fi +# AC_CACHE_VAL +case "x$ac_cv_prog_cc_c89" in + x) + { $as_echo "$as_me:${as_lineno-$LINENO}: result: none needed" >&5 +$as_echo "none needed" >&6; } ;; + xno) + { $as_echo "$as_me:${as_lineno-$LINENO}: result: unsupported" >&5 +$as_echo "unsupported" >&6; } ;; + *) + CC="$CC $ac_cv_prog_cc_c89" + { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_prog_cc_c89" >&5 +$as_echo "$ac_cv_prog_cc_c89" >&6; } ;; +esac +if test "x$ac_cv_prog_cc_c89" != xno; then : + ac_cv_prog_cc_stdc=$ac_cv_prog_cc_c89 +else + ac_cv_prog_cc_stdc=no +fi + +fi + ;; +esac + { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $CC option to accept ISO Standard C" >&5 +$as_echo_n "checking for $CC option to accept ISO Standard C... " >&6; } + if ${ac_cv_prog_cc_stdc+:} false; then : + $as_echo_n "(cached) " >&6 +fi + + case $ac_cv_prog_cc_stdc in #( + no) : + { $as_echo "$as_me:${as_lineno-$LINENO}: result: unsupported" >&5 +$as_echo "unsupported" >&6; } ;; #( + '') : + { $as_echo "$as_me:${as_lineno-$LINENO}: result: none needed" >&5 +$as_echo "none needed" >&6; } ;; #( + *) : + { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_prog_cc_stdc" >&5 +$as_echo "$ac_cv_prog_cc_stdc" >&6; } ;; +esac + +# Checks for programs. +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking whether ${MAKE-make} sets \$(MAKE)" >&5 +$as_echo_n "checking whether ${MAKE-make} sets \$(MAKE)... " >&6; } +set x ${MAKE-make} +ac_make=`$as_echo "$2" | sed 's/+/p/g; s/[^a-zA-Z0-9_]/_/g'` +if eval \${ac_cv_prog_make_${ac_make}_set+:} false; then : + $as_echo_n "(cached) " >&6 +else + cat >conftest.make <<\_ACEOF +SHELL = /bin/sh +all: + @echo '@@@%%%=$(MAKE)=@@@%%%' +_ACEOF +# GNU make sometimes prints "make[1]: Entering ...", which would confuse us. +case `${MAKE-make} -f conftest.make 2>/dev/null` in + *@@@%%%=?*=@@@%%%*) + eval ac_cv_prog_make_${ac_make}_set=yes;; + *) + eval ac_cv_prog_make_${ac_make}_set=no;; +esac +rm -f conftest.make +fi +if eval test \$ac_cv_prog_make_${ac_make}_set = yes; then + { $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5 +$as_echo "yes" >&6; } + SET_MAKE= +else + { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 +$as_echo "no" >&6; } + SET_MAKE="MAKE=${MAKE-make}" +fi + +if test -n "$ac_tool_prefix"; then + # Extract the first word of "${ac_tool_prefix}ranlib", so it can be a program name with args. +set dummy ${ac_tool_prefix}ranlib; ac_word=$2 +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 +$as_echo_n "checking for $ac_word... " >&6; } +if ${ac_cv_prog_RANLIB+:} false; then : + $as_echo_n "(cached) " >&6 +else + if test -n "$RANLIB"; then + ac_cv_prog_RANLIB="$RANLIB" # Let the user override the test. +else +as_save_IFS=$IFS; IFS=$PATH_SEPARATOR +for as_dir in $PATH +do + IFS=$as_save_IFS + test -z "$as_dir" && as_dir=. + for ac_exec_ext in '' $ac_executable_extensions; do + if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then + ac_cv_prog_RANLIB="${ac_tool_prefix}ranlib" + $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 + break 2 + fi +done + done +IFS=$as_save_IFS + +fi +fi +RANLIB=$ac_cv_prog_RANLIB +if test -n "$RANLIB"; then + { $as_echo "$as_me:${as_lineno-$LINENO}: result: $RANLIB" >&5 +$as_echo "$RANLIB" >&6; } +else + { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 +$as_echo "no" >&6; } +fi + + +fi +if test -z "$ac_cv_prog_RANLIB"; then + ac_ct_RANLIB=$RANLIB + # Extract the first word of "ranlib", so it can be a program name with args. +set dummy ranlib; ac_word=$2 +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 +$as_echo_n "checking for $ac_word... " >&6; } +if ${ac_cv_prog_ac_ct_RANLIB+:} false; then : + $as_echo_n "(cached) " >&6 +else + if test -n "$ac_ct_RANLIB"; then + ac_cv_prog_ac_ct_RANLIB="$ac_ct_RANLIB" # Let the user override the test. +else +as_save_IFS=$IFS; IFS=$PATH_SEPARATOR +for as_dir in $PATH +do + IFS=$as_save_IFS + test -z "$as_dir" && as_dir=. + for ac_exec_ext in '' $ac_executable_extensions; do + if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then + ac_cv_prog_ac_ct_RANLIB="ranlib" + $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 + break 2 + fi +done + done +IFS=$as_save_IFS + +fi +fi +ac_ct_RANLIB=$ac_cv_prog_ac_ct_RANLIB +if test -n "$ac_ct_RANLIB"; then + { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_ct_RANLIB" >&5 +$as_echo "$ac_ct_RANLIB" >&6; } +else + { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 +$as_echo "no" >&6; } +fi + + if test "x$ac_ct_RANLIB" = x; then + RANLIB=":" + else + case $cross_compiling:$ac_tool_warned in +yes:) +{ $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: using cross tools not prefixed with host triplet" >&5 +$as_echo "$as_me: WARNING: using cross tools not prefixed with host triplet" >&2;} +ac_tool_warned=yes ;; +esac + RANLIB=$ac_ct_RANLIB + fi +else + RANLIB="$ac_cv_prog_RANLIB" +fi + +# Extract the first word of "glib-mkenums", so it can be a program name with args. +set dummy glib-mkenums; ac_word=$2 +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 +$as_echo_n "checking for $ac_word... " >&6; } +if ${ac_cv_path_GLIB_MKENUMS+:} false; then : + $as_echo_n "(cached) " >&6 +else + case $GLIB_MKENUMS in + [\\/]* | ?:[\\/]*) + ac_cv_path_GLIB_MKENUMS="$GLIB_MKENUMS" # Let the user override the test with a path. + ;; + *) + as_save_IFS=$IFS; IFS=$PATH_SEPARATOR +for as_dir in $PATH +do + IFS=$as_save_IFS + test -z "$as_dir" && as_dir=. + for ac_exec_ext in '' $ac_executable_extensions; do + if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then + ac_cv_path_GLIB_MKENUMS="$as_dir/$ac_word$ac_exec_ext" + $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 + break 2 + fi +done + done +IFS=$as_save_IFS + + ;; +esac +fi +GLIB_MKENUMS=$ac_cv_path_GLIB_MKENUMS +if test -n "$GLIB_MKENUMS"; then + { $as_echo "$as_me:${as_lineno-$LINENO}: result: $GLIB_MKENUMS" >&5 +$as_echo "$GLIB_MKENUMS" >&6; } +else + { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 +$as_echo "no" >&6; } +fi + + + +ac_mingw32=no +case $target_os in + *mingw32*) + ac_mingw32=yes + ;; + *) + ;; +esac + +# I18N +GETTEXT_PACKAGE=viking + + +cat >>confdefs.h <<_ACEOF +#define GETTEXT_PACKAGE "$GETTEXT_PACKAGE" +_ACEOF + + + +ac_ext=c +ac_cpp='$CPP $CPPFLAGS' +ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5' +ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' +ac_compiler_gnu=$ac_cv_c_compiler_gnu +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking how to run the C preprocessor" >&5 +$as_echo_n "checking how to run the C preprocessor... " >&6; } +# On Suns, sometimes $CPP names a directory. +if test -n "$CPP" && test -d "$CPP"; then + CPP= +fi +if test -z "$CPP"; then + if ${ac_cv_prog_CPP+:} false; then : + $as_echo_n "(cached) " >&6 +else + # Double quotes because CPP needs to be expanded + for CPP in "$CC -E" "$CC -E -traditional-cpp" "/lib/cpp" + do + ac_preproc_ok=false +for ac_c_preproc_warn_flag in '' yes +do + # Use a header file that comes with gcc, so configuring glibc + # with a fresh cross-compiler works. + # Prefer to if __STDC__ is defined, since + # exists even on freestanding compilers. + # On the NeXT, cc -E runs the code through the compiler's parser, + # not just through cpp. "Syntax error" is here to catch this case. + cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ +#ifdef __STDC__ +# include +#else +# include +#endif + Syntax error +_ACEOF +if ac_fn_c_try_cpp "$LINENO"; then : + +else + # Broken: fails on valid input. +continue +fi +rm -f conftest.err conftest.i conftest.$ac_ext + + # OK, works on sane cases. Now check whether nonexistent headers + # can be detected and how. + cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ +#include +_ACEOF +if ac_fn_c_try_cpp "$LINENO"; then : + # Broken: success on invalid input. +continue +else + # Passes both tests. +ac_preproc_ok=: +break +fi +rm -f conftest.err conftest.i conftest.$ac_ext + +done +# Because of `break', _AC_PREPROC_IFELSE's cleaning code was skipped. +rm -f conftest.i conftest.err conftest.$ac_ext +if $ac_preproc_ok; then : + break +fi + + done + ac_cv_prog_CPP=$CPP + +fi + CPP=$ac_cv_prog_CPP +else + ac_cv_prog_CPP=$CPP +fi +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $CPP" >&5 +$as_echo "$CPP" >&6; } +ac_preproc_ok=false +for ac_c_preproc_warn_flag in '' yes +do + # Use a header file that comes with gcc, so configuring glibc + # with a fresh cross-compiler works. + # Prefer to if __STDC__ is defined, since + # exists even on freestanding compilers. + # On the NeXT, cc -E runs the code through the compiler's parser, + # not just through cpp. "Syntax error" is here to catch this case. + cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ +#ifdef __STDC__ +# include +#else +# include +#endif + Syntax error +_ACEOF +if ac_fn_c_try_cpp "$LINENO"; then : + +else + # Broken: fails on valid input. +continue +fi +rm -f conftest.err conftest.i conftest.$ac_ext + + # OK, works on sane cases. Now check whether nonexistent headers + # can be detected and how. + cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ +#include +_ACEOF +if ac_fn_c_try_cpp "$LINENO"; then : + # Broken: success on invalid input. +continue +else + # Passes both tests. +ac_preproc_ok=: +break +fi +rm -f conftest.err conftest.i conftest.$ac_ext + +done +# Because of `break', _AC_PREPROC_IFELSE's cleaning code was skipped. +rm -f conftest.i conftest.err conftest.$ac_ext +if $ac_preproc_ok; then : + +else + { { $as_echo "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5 +$as_echo "$as_me: error: in \`$ac_pwd':" >&2;} +as_fn_error $? "C preprocessor \"$CPP\" fails sanity check +See \`config.log' for more details" "$LINENO" 5; } +fi + +ac_ext=c +ac_cpp='$CPP $CPPFLAGS' +ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5' +ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' +ac_compiler_gnu=$ac_cv_c_compiler_gnu + + +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for grep that handles long lines and -e" >&5 +$as_echo_n "checking for grep that handles long lines and -e... " >&6; } +if ${ac_cv_path_GREP+:} false; then : + $as_echo_n "(cached) " >&6 +else + if test -z "$GREP"; then + ac_path_GREP_found=false + # Loop through the user's path and test for each of PROGNAME-LIST + as_save_IFS=$IFS; IFS=$PATH_SEPARATOR +for as_dir in $PATH$PATH_SEPARATOR/usr/xpg4/bin +do + IFS=$as_save_IFS + test -z "$as_dir" && as_dir=. + for ac_prog in grep ggrep; do + for ac_exec_ext in '' $ac_executable_extensions; do + ac_path_GREP="$as_dir/$ac_prog$ac_exec_ext" + as_fn_executable_p "$ac_path_GREP" || continue +# Check for GNU ac_path_GREP and select it if it is found. + # Check for GNU $ac_path_GREP +case `"$ac_path_GREP" --version 2>&1` in +*GNU*) + ac_cv_path_GREP="$ac_path_GREP" ac_path_GREP_found=:;; +*) + ac_count=0 + $as_echo_n 0123456789 >"conftest.in" + while : + do + cat "conftest.in" "conftest.in" >"conftest.tmp" + mv "conftest.tmp" "conftest.in" + cp "conftest.in" "conftest.nl" + $as_echo 'GREP' >> "conftest.nl" + "$ac_path_GREP" -e 'GREP$' -e '-(cannot match)-' < "conftest.nl" >"conftest.out" 2>/dev/null || break + diff "conftest.out" "conftest.nl" >/dev/null 2>&1 || break + as_fn_arith $ac_count + 1 && ac_count=$as_val + if test $ac_count -gt ${ac_path_GREP_max-0}; then + # Best one so far, save it but keep looking for a better one + ac_cv_path_GREP="$ac_path_GREP" + ac_path_GREP_max=$ac_count + fi + # 10*(2^10) chars as input seems more than enough + test $ac_count -gt 10 && break + done + rm -f conftest.in conftest.tmp conftest.nl conftest.out;; +esac + + $ac_path_GREP_found && break 3 + done + done + done +IFS=$as_save_IFS + if test -z "$ac_cv_path_GREP"; then + as_fn_error $? "no acceptable grep could be found in $PATH$PATH_SEPARATOR/usr/xpg4/bin" "$LINENO" 5 + fi +else + ac_cv_path_GREP=$GREP +fi + +fi +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_path_GREP" >&5 +$as_echo "$ac_cv_path_GREP" >&6; } + GREP="$ac_cv_path_GREP" + + +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for egrep" >&5 +$as_echo_n "checking for egrep... " >&6; } +if ${ac_cv_path_EGREP+:} false; then : + $as_echo_n "(cached) " >&6 +else + if echo a | $GREP -E '(a|b)' >/dev/null 2>&1 + then ac_cv_path_EGREP="$GREP -E" + else + if test -z "$EGREP"; then + ac_path_EGREP_found=false + # Loop through the user's path and test for each of PROGNAME-LIST + as_save_IFS=$IFS; IFS=$PATH_SEPARATOR +for as_dir in $PATH$PATH_SEPARATOR/usr/xpg4/bin +do + IFS=$as_save_IFS + test -z "$as_dir" && as_dir=. + for ac_prog in egrep; do + for ac_exec_ext in '' $ac_executable_extensions; do + ac_path_EGREP="$as_dir/$ac_prog$ac_exec_ext" + as_fn_executable_p "$ac_path_EGREP" || continue +# Check for GNU ac_path_EGREP and select it if it is found. + # Check for GNU $ac_path_EGREP +case `"$ac_path_EGREP" --version 2>&1` in +*GNU*) + ac_cv_path_EGREP="$ac_path_EGREP" ac_path_EGREP_found=:;; +*) + ac_count=0 + $as_echo_n 0123456789 >"conftest.in" + while : + do + cat "conftest.in" "conftest.in" >"conftest.tmp" + mv "conftest.tmp" "conftest.in" + cp "conftest.in" "conftest.nl" + $as_echo 'EGREP' >> "conftest.nl" + "$ac_path_EGREP" 'EGREP$' < "conftest.nl" >"conftest.out" 2>/dev/null || break + diff "conftest.out" "conftest.nl" >/dev/null 2>&1 || break + as_fn_arith $ac_count + 1 && ac_count=$as_val + if test $ac_count -gt ${ac_path_EGREP_max-0}; then + # Best one so far, save it but keep looking for a better one + ac_cv_path_EGREP="$ac_path_EGREP" + ac_path_EGREP_max=$ac_count + fi + # 10*(2^10) chars as input seems more than enough + test $ac_count -gt 10 && break + done + rm -f conftest.in conftest.tmp conftest.nl conftest.out;; +esac + + $ac_path_EGREP_found && break 3 + done + done + done +IFS=$as_save_IFS + if test -z "$ac_cv_path_EGREP"; then + as_fn_error $? "no acceptable egrep could be found in $PATH$PATH_SEPARATOR/usr/xpg4/bin" "$LINENO" 5 + fi +else + ac_cv_path_EGREP=$EGREP +fi + + fi +fi +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_path_EGREP" >&5 +$as_echo "$ac_cv_path_EGREP" >&6; } + EGREP="$ac_cv_path_EGREP" + + +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for ANSI C header files" >&5 +$as_echo_n "checking for ANSI C header files... " >&6; } +if ${ac_cv_header_stdc+:} false; then : + $as_echo_n "(cached) " >&6 +else + cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ +#include +#include +#include +#include + +int +main () +{ + + ; + return 0; +} +_ACEOF +if ac_fn_c_try_compile "$LINENO"; then : + ac_cv_header_stdc=yes +else + ac_cv_header_stdc=no +fi +rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext + +if test $ac_cv_header_stdc = yes; then + # SunOS 4.x string.h does not declare mem*, contrary to ANSI. + cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ +#include + +_ACEOF +if (eval "$ac_cpp conftest.$ac_ext") 2>&5 | + $EGREP "memchr" >/dev/null 2>&1; then : + +else + 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 confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ +#include + +_ACEOF +if (eval "$ac_cpp conftest.$ac_ext") 2>&5 | + $EGREP "free" >/dev/null 2>&1; then : + +else + 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 confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ +#include +#include +#if ((' ' & 0x0FF) == 0x020) +# define ISLOWER(c) ('a' <= (c) && (c) <= 'z') +# define TOUPPER(c) (ISLOWER(c) ? 'A' + ((c) - 'a') : (c)) +#else +# define ISLOWER(c) \ + (('a' <= (c) && (c) <= 'i') \ + || ('j' <= (c) && (c) <= 'r') \ + || ('s' <= (c) && (c) <= 'z')) +# define TOUPPER(c) (ISLOWER(c) ? ((c) | 0x40) : (c)) +#endif + +#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)) + return 2; + return 0; +} +_ACEOF +if ac_fn_c_try_run "$LINENO"; then : + +else + ac_cv_header_stdc=no +fi +rm -f core *.core core.conftest.* gmon.out bb.out conftest$ac_exeext \ + conftest.$ac_objext conftest.beam conftest.$ac_ext +fi + +fi +fi +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_header_stdc" >&5 +$as_echo "$ac_cv_header_stdc" >&6; } +if test $ac_cv_header_stdc = yes; then + +$as_echo "#define STDC_HEADERS 1" >>confdefs.h + +fi + +# On IRIX 5.3, sys/types and inttypes.h are conflicting. +for ac_header in sys/types.h sys/stat.h stdlib.h string.h memory.h strings.h \ + inttypes.h stdint.h unistd.h +do : + as_ac_Header=`$as_echo "ac_cv_header_$ac_header" | $as_tr_sh` +ac_fn_c_check_header_compile "$LINENO" "$ac_header" "$as_ac_Header" "$ac_includes_default +" +if eval test \"x\$"$as_ac_Header"\" = x"yes"; then : + cat >>confdefs.h <<_ACEOF +#define `$as_echo "HAVE_$ac_header" | $as_tr_cpp` 1 +_ACEOF + +fi + +done + + + + for ac_header in locale.h +do : + ac_fn_c_check_header_mongrel "$LINENO" "locale.h" "ac_cv_header_locale_h" "$ac_includes_default" +if test "x$ac_cv_header_locale_h" = xyes; then : + cat >>confdefs.h <<_ACEOF +#define HAVE_LOCALE_H 1 +_ACEOF + +fi + +done + + if test $ac_cv_header_locale_h = yes; then + { $as_echo "$as_me:${as_lineno-$LINENO}: checking for LC_MESSAGES" >&5 +$as_echo_n "checking for LC_MESSAGES... " >&6; } +if ${am_cv_val_LC_MESSAGES+:} false; then : + $as_echo_n "(cached) " >&6 +else + cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ +#include +int +main () +{ +return LC_MESSAGES + ; + return 0; +} +_ACEOF +if ac_fn_c_try_link "$LINENO"; then : + am_cv_val_LC_MESSAGES=yes +else + am_cv_val_LC_MESSAGES=no +fi +rm -f core conftest.err conftest.$ac_objext \ + conftest$ac_exeext conftest.$ac_ext +fi +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $am_cv_val_LC_MESSAGES" >&5 +$as_echo "$am_cv_val_LC_MESSAGES" >&6; } + if test $am_cv_val_LC_MESSAGES = yes; then + +$as_echo "#define HAVE_LC_MESSAGES 1" >>confdefs.h + + fi + fi + USE_NLS=yes + + + gt_cv_have_gettext=no + + CATOBJEXT=NONE + XGETTEXT=: + INTLLIBS= + + + { $as_echo "$as_me:${as_lineno-$LINENO}: checking for CFPreferencesCopyAppValue" >&5 +$as_echo_n "checking for CFPreferencesCopyAppValue... " >&6; } +if ${gt_cv_func_CFPreferencesCopyAppValue+:} false; then : + $as_echo_n "(cached) " >&6 +else + gt_save_LIBS="$LIBS" + LIBS="$LIBS -Wl,-framework -Wl,CoreFoundation" + cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ +#include +int +main () +{ +CFPreferencesCopyAppValue(NULL, NULL) + ; + return 0; +} +_ACEOF +if ac_fn_c_try_link "$LINENO"; then : + gt_cv_func_CFPreferencesCopyAppValue=yes +else + gt_cv_func_CFPreferencesCopyAppValue=no +fi +rm -f core conftest.err conftest.$ac_objext \ + conftest$ac_exeext conftest.$ac_ext + LIBS="$gt_save_LIBS" +fi +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $gt_cv_func_CFPreferencesCopyAppValue" >&5 +$as_echo "$gt_cv_func_CFPreferencesCopyAppValue" >&6; } + if test $gt_cv_func_CFPreferencesCopyAppValue = yes; then + +$as_echo "#define HAVE_CFPREFERENCESCOPYAPPVALUE 1" >>confdefs.h + + fi + { $as_echo "$as_me:${as_lineno-$LINENO}: checking for CFLocaleCopyCurrent" >&5 +$as_echo_n "checking for CFLocaleCopyCurrent... " >&6; } +if ${gt_cv_func_CFLocaleCopyCurrent+:} false; then : + $as_echo_n "(cached) " >&6 +else + gt_save_LIBS="$LIBS" + LIBS="$LIBS -Wl,-framework -Wl,CoreFoundation" + cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ +#include +int +main () +{ +CFLocaleCopyCurrent(); + ; + return 0; +} +_ACEOF +if ac_fn_c_try_link "$LINENO"; then : + gt_cv_func_CFLocaleCopyCurrent=yes +else + gt_cv_func_CFLocaleCopyCurrent=no +fi +rm -f core conftest.err conftest.$ac_objext \ + conftest$ac_exeext conftest.$ac_ext + LIBS="$gt_save_LIBS" +fi +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $gt_cv_func_CFLocaleCopyCurrent" >&5 +$as_echo "$gt_cv_func_CFLocaleCopyCurrent" >&6; } + if test $gt_cv_func_CFLocaleCopyCurrent = yes; then + +$as_echo "#define HAVE_CFLOCALECOPYCURRENT 1" >>confdefs.h + + fi + INTL_MACOSX_LIBS= + if test $gt_cv_func_CFPreferencesCopyAppValue = yes || test $gt_cv_func_CFLocaleCopyCurrent = yes; then + INTL_MACOSX_LIBS="-Wl,-framework -Wl,CoreFoundation" + fi + + + + ac_fn_c_check_header_mongrel "$LINENO" "libintl.h" "ac_cv_header_libintl_h" "$ac_includes_default" +if test "x$ac_cv_header_libintl_h" = xyes; then : + gt_cv_func_dgettext_libintl="no" + libintl_extra_libs="" + + # + # First check in libc + # + { $as_echo "$as_me:${as_lineno-$LINENO}: checking for ngettext in libc" >&5 +$as_echo_n "checking for ngettext in libc... " >&6; } +if ${gt_cv_func_ngettext_libc+:} false; then : + $as_echo_n "(cached) " >&6 +else + cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ + +#include + +int +main () +{ +return !ngettext ("","", 1) + ; + return 0; +} +_ACEOF +if ac_fn_c_try_link "$LINENO"; then : + gt_cv_func_ngettext_libc=yes +else + gt_cv_func_ngettext_libc=no +fi +rm -f core conftest.err conftest.$ac_objext \ + conftest$ac_exeext conftest.$ac_ext + +fi +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $gt_cv_func_ngettext_libc" >&5 +$as_echo "$gt_cv_func_ngettext_libc" >&6; } + + if test "$gt_cv_func_ngettext_libc" = "yes" ; then + { $as_echo "$as_me:${as_lineno-$LINENO}: checking for dgettext in libc" >&5 +$as_echo_n "checking for dgettext in libc... " >&6; } +if ${gt_cv_func_dgettext_libc+:} false; then : + $as_echo_n "(cached) " >&6 +else + cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ + +#include + +int +main () +{ +return !dgettext ("","") + ; + return 0; +} +_ACEOF +if ac_fn_c_try_link "$LINENO"; then : + gt_cv_func_dgettext_libc=yes +else + gt_cv_func_dgettext_libc=no +fi +rm -f core conftest.err conftest.$ac_objext \ + conftest$ac_exeext conftest.$ac_ext + +fi +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $gt_cv_func_dgettext_libc" >&5 +$as_echo "$gt_cv_func_dgettext_libc" >&6; } + fi + + if test "$gt_cv_func_ngettext_libc" = "yes" ; then + for ac_func in bind_textdomain_codeset +do : + ac_fn_c_check_func "$LINENO" "bind_textdomain_codeset" "ac_cv_func_bind_textdomain_codeset" +if test "x$ac_cv_func_bind_textdomain_codeset" = xyes; then : + cat >>confdefs.h <<_ACEOF +#define HAVE_BIND_TEXTDOMAIN_CODESET 1 +_ACEOF + +fi +done + + fi + + # + # If we don't have everything we want, check in libintl + # + if test "$gt_cv_func_dgettext_libc" != "yes" \ + || test "$gt_cv_func_ngettext_libc" != "yes" \ + || test "$ac_cv_func_bind_textdomain_codeset" != "yes" ; then + + { $as_echo "$as_me:${as_lineno-$LINENO}: checking for bindtextdomain in -lintl" >&5 +$as_echo_n "checking for bindtextdomain in -lintl... " >&6; } +if ${ac_cv_lib_intl_bindtextdomain+:} false; then : + $as_echo_n "(cached) " >&6 +else + ac_check_lib_save_LIBS=$LIBS +LIBS="-lintl $LIBS" +cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ + +/* Override any GCC internal prototype to avoid an error. + Use char because int might match the return type of a GCC + builtin and then its argument prototype would still apply. */ +#ifdef __cplusplus +extern "C" +#endif +char bindtextdomain (); +int +main () +{ +return bindtextdomain (); + ; + return 0; +} +_ACEOF +if ac_fn_c_try_link "$LINENO"; then : + ac_cv_lib_intl_bindtextdomain=yes +else + ac_cv_lib_intl_bindtextdomain=no +fi +rm -f core conftest.err conftest.$ac_objext \ + conftest$ac_exeext conftest.$ac_ext +LIBS=$ac_check_lib_save_LIBS +fi +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_lib_intl_bindtextdomain" >&5 +$as_echo "$ac_cv_lib_intl_bindtextdomain" >&6; } +if test "x$ac_cv_lib_intl_bindtextdomain" = xyes; then : + { $as_echo "$as_me:${as_lineno-$LINENO}: checking for ngettext in -lintl" >&5 +$as_echo_n "checking for ngettext in -lintl... " >&6; } +if ${ac_cv_lib_intl_ngettext+:} false; then : + $as_echo_n "(cached) " >&6 +else + ac_check_lib_save_LIBS=$LIBS +LIBS="-lintl $LIBS" +cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ + +/* Override any GCC internal prototype to avoid an error. + Use char because int might match the return type of a GCC + builtin and then its argument prototype would still apply. */ +#ifdef __cplusplus +extern "C" +#endif +char ngettext (); +int +main () +{ +return ngettext (); + ; + return 0; +} +_ACEOF +if ac_fn_c_try_link "$LINENO"; then : + ac_cv_lib_intl_ngettext=yes +else + ac_cv_lib_intl_ngettext=no +fi +rm -f core conftest.err conftest.$ac_objext \ + conftest$ac_exeext conftest.$ac_ext +LIBS=$ac_check_lib_save_LIBS +fi +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_lib_intl_ngettext" >&5 +$as_echo "$ac_cv_lib_intl_ngettext" >&6; } +if test "x$ac_cv_lib_intl_ngettext" = xyes; then : + { $as_echo "$as_me:${as_lineno-$LINENO}: checking for dgettext in -lintl" >&5 +$as_echo_n "checking for dgettext in -lintl... " >&6; } +if ${ac_cv_lib_intl_dgettext+:} false; then : + $as_echo_n "(cached) " >&6 +else + ac_check_lib_save_LIBS=$LIBS +LIBS="-lintl $LIBS" +cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ + +/* Override any GCC internal prototype to avoid an error. + Use char because int might match the return type of a GCC + builtin and then its argument prototype would still apply. */ +#ifdef __cplusplus +extern "C" +#endif +char dgettext (); +int +main () +{ +return dgettext (); + ; + return 0; +} +_ACEOF +if ac_fn_c_try_link "$LINENO"; then : + ac_cv_lib_intl_dgettext=yes +else + ac_cv_lib_intl_dgettext=no +fi +rm -f core conftest.err conftest.$ac_objext \ + conftest$ac_exeext conftest.$ac_ext +LIBS=$ac_check_lib_save_LIBS +fi +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_lib_intl_dgettext" >&5 +$as_echo "$ac_cv_lib_intl_dgettext" >&6; } +if test "x$ac_cv_lib_intl_dgettext" = xyes; then : + gt_cv_func_dgettext_libintl=yes +fi + +fi + +fi + + + if test "$gt_cv_func_dgettext_libintl" != "yes" ; then + { $as_echo "$as_me:${as_lineno-$LINENO}: checking if -liconv is needed to use gettext" >&5 +$as_echo_n "checking if -liconv is needed to use gettext... " >&6; } + { $as_echo "$as_me:${as_lineno-$LINENO}: result: " >&5 +$as_echo "" >&6; } + { $as_echo "$as_me:${as_lineno-$LINENO}: checking for ngettext in -lintl" >&5 +$as_echo_n "checking for ngettext in -lintl... " >&6; } +if ${ac_cv_lib_intl_ngettext+:} false; then : + $as_echo_n "(cached) " >&6 +else + ac_check_lib_save_LIBS=$LIBS +LIBS="-lintl -liconv $LIBS" +cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ + +/* Override any GCC internal prototype to avoid an error. + Use char because int might match the return type of a GCC + builtin and then its argument prototype would still apply. */ +#ifdef __cplusplus +extern "C" +#endif +char ngettext (); +int +main () +{ +return ngettext (); + ; + return 0; +} +_ACEOF +if ac_fn_c_try_link "$LINENO"; then : + ac_cv_lib_intl_ngettext=yes +else + ac_cv_lib_intl_ngettext=no +fi +rm -f core conftest.err conftest.$ac_objext \ + conftest$ac_exeext conftest.$ac_ext +LIBS=$ac_check_lib_save_LIBS +fi +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_lib_intl_ngettext" >&5 +$as_echo "$ac_cv_lib_intl_ngettext" >&6; } +if test "x$ac_cv_lib_intl_ngettext" = xyes; then : + { $as_echo "$as_me:${as_lineno-$LINENO}: checking for dcgettext in -lintl" >&5 +$as_echo_n "checking for dcgettext in -lintl... " >&6; } +if ${ac_cv_lib_intl_dcgettext+:} false; then : + $as_echo_n "(cached) " >&6 +else + ac_check_lib_save_LIBS=$LIBS +LIBS="-lintl -liconv $LIBS" +cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ + +/* Override any GCC internal prototype to avoid an error. + Use char because int might match the return type of a GCC + builtin and then its argument prototype would still apply. */ +#ifdef __cplusplus +extern "C" +#endif +char dcgettext (); +int +main () +{ +return dcgettext (); + ; + return 0; +} +_ACEOF +if ac_fn_c_try_link "$LINENO"; then : + ac_cv_lib_intl_dcgettext=yes +else + ac_cv_lib_intl_dcgettext=no +fi +rm -f core conftest.err conftest.$ac_objext \ + conftest$ac_exeext conftest.$ac_ext +LIBS=$ac_check_lib_save_LIBS +fi +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_lib_intl_dcgettext" >&5 +$as_echo "$ac_cv_lib_intl_dcgettext" >&6; } +if test "x$ac_cv_lib_intl_dcgettext" = xyes; then : + gt_cv_func_dgettext_libintl=yes + libintl_extra_libs=-liconv +else + : +fi + +else + : +fi + + fi + + # + # If we found libintl, then check in it for bind_textdomain_codeset(); + # we'll prefer libc if neither have bind_textdomain_codeset(), + # and both have dgettext and ngettext + # + if test "$gt_cv_func_dgettext_libintl" = "yes" ; then + glib_save_LIBS="$LIBS" + LIBS="$LIBS -lintl $libintl_extra_libs" + unset ac_cv_func_bind_textdomain_codeset + for ac_func in bind_textdomain_codeset +do : + ac_fn_c_check_func "$LINENO" "bind_textdomain_codeset" "ac_cv_func_bind_textdomain_codeset" +if test "x$ac_cv_func_bind_textdomain_codeset" = xyes; then : + cat >>confdefs.h <<_ACEOF +#define HAVE_BIND_TEXTDOMAIN_CODESET 1 +_ACEOF + +fi +done + + LIBS="$glib_save_LIBS" + + if test "$ac_cv_func_bind_textdomain_codeset" = "yes" ; then + gt_cv_func_dgettext_libc=no + else + if test "$gt_cv_func_dgettext_libc" = "yes" \ + && test "$gt_cv_func_ngettext_libc" = "yes"; then + gt_cv_func_dgettext_libintl=no + fi + fi + fi + fi + + if test "$gt_cv_func_dgettext_libc" = "yes" \ + || test "$gt_cv_func_dgettext_libintl" = "yes"; then + gt_cv_have_gettext=yes + fi + + if test "$gt_cv_func_dgettext_libintl" = "yes"; then + INTLLIBS="-lintl $libintl_extra_libs $INTL_MACOSX_LIBS" + fi + + if test "$gt_cv_have_gettext" = "yes"; then + +$as_echo "#define HAVE_GETTEXT 1" >>confdefs.h + + # Extract the first word of "msgfmt", so it can be a program name with args. +set dummy msgfmt; ac_word=$2 +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 +$as_echo_n "checking for $ac_word... " >&6; } +if ${ac_cv_path_MSGFMT+:} false; then : + $as_echo_n "(cached) " >&6 +else + case "$MSGFMT" in + /*) + ac_cv_path_MSGFMT="$MSGFMT" # Let the user override the test with a path. + ;; + *) + IFS="${IFS= }"; ac_save_ifs="$IFS"; IFS="${IFS}:" + for ac_dir in $PATH; do + test -z "$ac_dir" && ac_dir=. + if test -f $ac_dir/$ac_word; then + if test -z "`$ac_dir/$ac_word -h 2>&1 | grep 'dv '`"; then + ac_cv_path_MSGFMT="$ac_dir/$ac_word" + break + fi + fi + done + IFS="$ac_save_ifs" + test -z "$ac_cv_path_MSGFMT" && ac_cv_path_MSGFMT="no" + ;; +esac +fi +MSGFMT="$ac_cv_path_MSGFMT" +if test "$MSGFMT" != "no"; then + { $as_echo "$as_me:${as_lineno-$LINENO}: result: $MSGFMT" >&5 +$as_echo "$MSGFMT" >&6; } +else + { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 +$as_echo "no" >&6; } +fi + if test "$MSGFMT" != "no"; then + glib_save_LIBS="$LIBS" + LIBS="$LIBS $INTLLIBS" + for ac_func in dcgettext +do : + ac_fn_c_check_func "$LINENO" "dcgettext" "ac_cv_func_dcgettext" +if test "x$ac_cv_func_dcgettext" = xyes; then : + cat >>confdefs.h <<_ACEOF +#define HAVE_DCGETTEXT 1 +_ACEOF + +fi +done + + MSGFMT_OPTS= + { $as_echo "$as_me:${as_lineno-$LINENO}: checking if msgfmt accepts -c" >&5 +$as_echo_n "checking if msgfmt accepts -c... " >&6; } + cat >conftest.foo <<_ACEOF + +msgid "" +msgstr "" +"Content-Type: text/plain; charset=UTF-8\n" +"Project-Id-Version: test 1.0\n" +"PO-Revision-Date: 2007-02-15 12:01+0100\n" +"Last-Translator: test \n" +"Language-Team: C \n" +"MIME-Version: 1.0\n" +"Content-Transfer-Encoding: 8bit\n" + +_ACEOF +if { { $as_echo "$as_me:${as_lineno-$LINENO}: \$MSGFMT -c -o /dev/null conftest.foo"; } >&5 + ($MSGFMT -c -o /dev/null conftest.foo) 2>&5 + ac_status=$? + $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 + test $ac_status = 0; }; then + MSGFMT_OPTS=-c; { $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5 +$as_echo "yes" >&6; } +else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 +$as_echo "no" >&6; } +echo "$as_me: failed input was:" >&5 +sed 's/^/| /' conftest.foo >&5 +fi + + # Extract the first word of "gmsgfmt", so it can be a program name with args. +set dummy gmsgfmt; ac_word=$2 +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 +$as_echo_n "checking for $ac_word... " >&6; } +if ${ac_cv_path_GMSGFMT+:} false; then : + $as_echo_n "(cached) " >&6 +else + case $GMSGFMT in + [\\/]* | ?:[\\/]*) + ac_cv_path_GMSGFMT="$GMSGFMT" # Let the user override the test with a path. + ;; + *) + as_save_IFS=$IFS; IFS=$PATH_SEPARATOR +for as_dir in $PATH +do + IFS=$as_save_IFS + test -z "$as_dir" && as_dir=. + for ac_exec_ext in '' $ac_executable_extensions; do + if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then + ac_cv_path_GMSGFMT="$as_dir/$ac_word$ac_exec_ext" + $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 + break 2 + fi +done + done +IFS=$as_save_IFS + + test -z "$ac_cv_path_GMSGFMT" && ac_cv_path_GMSGFMT="$MSGFMT" + ;; +esac +fi +GMSGFMT=$ac_cv_path_GMSGFMT +if test -n "$GMSGFMT"; then + { $as_echo "$as_me:${as_lineno-$LINENO}: result: $GMSGFMT" >&5 +$as_echo "$GMSGFMT" >&6; } +else + { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 +$as_echo "no" >&6; } +fi + + + # Extract the first word of "xgettext", so it can be a program name with args. +set dummy xgettext; ac_word=$2 +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 +$as_echo_n "checking for $ac_word... " >&6; } +if ${ac_cv_path_XGETTEXT+:} false; then : + $as_echo_n "(cached) " >&6 +else + case "$XGETTEXT" in + /*) + ac_cv_path_XGETTEXT="$XGETTEXT" # Let the user override the test with a path. + ;; + *) + IFS="${IFS= }"; ac_save_ifs="$IFS"; IFS="${IFS}:" + for ac_dir in $PATH; do + test -z "$ac_dir" && ac_dir=. + if test -f $ac_dir/$ac_word; then + if test -z "`$ac_dir/$ac_word -h 2>&1 | grep '(HELP)'`"; then + ac_cv_path_XGETTEXT="$ac_dir/$ac_word" + break + fi + fi + done + IFS="$ac_save_ifs" + test -z "$ac_cv_path_XGETTEXT" && ac_cv_path_XGETTEXT=":" + ;; +esac +fi +XGETTEXT="$ac_cv_path_XGETTEXT" +if test "$XGETTEXT" != ":"; then + { $as_echo "$as_me:${as_lineno-$LINENO}: result: $XGETTEXT" >&5 +$as_echo "$XGETTEXT" >&6; } +else + { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 +$as_echo "no" >&6; } +fi + + cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ + +int +main () +{ +extern int _nl_msg_cat_cntr; + return _nl_msg_cat_cntr + ; + return 0; +} +_ACEOF +if ac_fn_c_try_link "$LINENO"; then : + CATOBJEXT=.gmo + DATADIRNAME=share +else + case $host in + *-*-solaris*) + ac_fn_c_check_func "$LINENO" "bind_textdomain_codeset" "ac_cv_func_bind_textdomain_codeset" +if test "x$ac_cv_func_bind_textdomain_codeset" = xyes; then : + CATOBJEXT=.gmo + DATADIRNAME=share +else + CATOBJEXT=.mo + DATADIRNAME=lib +fi + + ;; + *-*-openbsd*) + CATOBJEXT=.mo + DATADIRNAME=share + ;; + *) + CATOBJEXT=.mo + DATADIRNAME=lib + ;; + esac +fi +rm -f core conftest.err conftest.$ac_objext \ + conftest$ac_exeext conftest.$ac_ext + LIBS="$glib_save_LIBS" + INSTOBJEXT=.mo + else + gt_cv_have_gettext=no + fi + fi + +fi + + + + if test "$gt_cv_have_gettext" = "yes" ; then + +$as_echo "#define ENABLE_NLS 1" >>confdefs.h + + fi + + if test "$XGETTEXT" != ":"; then + if $XGETTEXT --omit-header /dev/null 2> /dev/null; then + : ; + else + { $as_echo "$as_me:${as_lineno-$LINENO}: result: found xgettext program is not GNU xgettext; ignore it" >&5 +$as_echo "found xgettext program is not GNU xgettext; ignore it" >&6; } + XGETTEXT=":" + fi + fi + + # We need to process the po/ directory. + POSUB=po + + ac_config_commands="$ac_config_commands default-1" + + + for lang in $ALL_LINGUAS; do + GMOFILES="$GMOFILES $lang.gmo" + POFILES="$POFILES $lang.po" + done + + + + + + + + + + + + + + if test "$gt_cv_have_gettext" = "yes"; then + if test "x$ALL_LINGUAS" = "x"; then + LINGUAS= + else + { $as_echo "$as_me:${as_lineno-$LINENO}: checking for catalogs to be installed" >&5 +$as_echo_n "checking for catalogs to be installed... " >&6; } + NEW_LINGUAS= + for presentlang in $ALL_LINGUAS; do + useit=no + if test "%UNSET%" != "${LINGUAS-%UNSET%}"; then + desiredlanguages="$LINGUAS" + else + desiredlanguages="$ALL_LINGUAS" + fi + for desiredlang in $desiredlanguages; do + # Use the presentlang catalog if desiredlang is + # a. equal to presentlang, or + # b. a variant of presentlang (because in this case, + # presentlang can be used as a fallback for messages + # which are not translated in the desiredlang catalog). + case "$desiredlang" in + "$presentlang"*) useit=yes;; + esac + done + if test $useit = yes; then + NEW_LINGUAS="$NEW_LINGUAS $presentlang" + fi + done + LINGUAS=$NEW_LINGUAS + { $as_echo "$as_me:${as_lineno-$LINENO}: result: $LINGUAS" >&5 +$as_echo "$LINGUAS" >&6; } + fi + + if test -n "$LINGUAS"; then + for lang in $LINGUAS; do CATALOGS="$CATALOGS $lang$CATOBJEXT"; done + fi + fi + + MKINSTALLDIRS= + if test -n "$ac_aux_dir"; then + MKINSTALLDIRS="$ac_aux_dir/mkinstalldirs" + fi + if test -z "$MKINSTALLDIRS"; then + MKINSTALLDIRS="\$(top_srcdir)/mkinstalldirs" + fi + + + test -d po || mkdir po + if test "x$srcdir" != "x."; then + if test "x`echo $srcdir | sed 's@/.*@@'`" = "x"; then + posrcprefix="$srcdir/" + else + posrcprefix="../$srcdir/" + fi + else + posrcprefix="../" + fi + rm -f po/POTFILES + sed -e "/^#/d" -e "/^\$/d" -e "s,.*, $posrcprefix& \\\\," -e "\$s/\(.*\) \\\\/\1/" \ + < $srcdir/po/POTFILES.in > po/POTFILES + +glib_save_prefix="$prefix" +glib_save_exec_prefix="$exec_prefix" +glib_save_datarootdir="$datarootdir" +test "x$prefix" = xNONE && prefix=$ac_default_prefix +test "x$exec_prefix" = xNONE && exec_prefix=$prefix +datarootdir=`eval echo "${datarootdir}"` +if test "x$CATOBJEXT" = "x.mo" ; then + localedir=`eval echo "${libdir}/locale"` +else + localedir=`eval echo "${datadir}/locale"` +fi +prefix="$glib_save_prefix" +exec_prefix="$glib_save_exec_prefix" +datarootdir="$glib_save_datarootdir" + +cat >>confdefs.h <<_ACEOF +#define LOCALEDIR "$localedir" +_ACEOF + + + + + +mkdir_p="$MKDIR_P" +case $mkdir_p in + [\\/$]* | ?:[\\/]*) ;; + */*) mkdir_p="\$(top_builddir)/$mkdir_p" ;; +esac + + + { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether NLS is requested" >&5 +$as_echo_n "checking whether NLS is requested... " >&6; } + # Check whether --enable-nls was given. +if test "${enable_nls+set}" = set; then : + enableval=$enable_nls; USE_NLS=$enableval +else + USE_NLS=yes +fi + + { $as_echo "$as_me:${as_lineno-$LINENO}: result: $USE_NLS" >&5 +$as_echo "$USE_NLS" >&6; } + + + + + GETTEXT_MACRO_VERSION=0.17 + + + + +# Prepare PATH_SEPARATOR. +# The user is always right. +if test "${PATH_SEPARATOR+set}" != set; then + echo "#! /bin/sh" >conf$$.sh + echo "exit 0" >>conf$$.sh + chmod +x conf$$.sh + if (PATH="/nonexistent;."; conf$$.sh) >/dev/null 2>&1; then + PATH_SEPARATOR=';' + else + PATH_SEPARATOR=: + fi + rm -f conf$$.sh +fi + +# Find out how to test for executable files. Don't use a zero-byte file, +# as systems may use methods other than mode bits to determine executability. +cat >conf$$.file <<_ASEOF +#! /bin/sh +exit 0 +_ASEOF +chmod +x conf$$.file +if test -x conf$$.file >/dev/null 2>&1; then + ac_executable_p="test -x" +else + ac_executable_p="test -f" +fi +rm -f conf$$.file + +# Extract the first word of "msgfmt", so it can be a program name with args. +set dummy msgfmt; ac_word=$2 +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 +$as_echo_n "checking for $ac_word... " >&6; } +if ${ac_cv_path_MSGFMT+:} false; then : + $as_echo_n "(cached) " >&6 +else + case "$MSGFMT" in + [\\/]* | ?:[\\/]*) + ac_cv_path_MSGFMT="$MSGFMT" # Let the user override the test with a path. + ;; + *) + ac_save_IFS="$IFS"; IFS=$PATH_SEPARATOR + for ac_dir in $PATH; do + IFS="$ac_save_IFS" + test -z "$ac_dir" && ac_dir=. + for ac_exec_ext in '' $ac_executable_extensions; do + if $ac_executable_p "$ac_dir/$ac_word$ac_exec_ext"; then + echo "$as_me: trying $ac_dir/$ac_word..." >&5 + if $ac_dir/$ac_word --statistics /dev/null >&5 2>&1 && + (if $ac_dir/$ac_word --statistics /dev/null 2>&1 >/dev/null | grep usage >/dev/null; then exit 1; else exit 0; fi); then + ac_cv_path_MSGFMT="$ac_dir/$ac_word$ac_exec_ext" + break 2 + fi + fi + done + done + IFS="$ac_save_IFS" + test -z "$ac_cv_path_MSGFMT" && ac_cv_path_MSGFMT=":" + ;; +esac +fi +MSGFMT="$ac_cv_path_MSGFMT" +if test "$MSGFMT" != ":"; then + { $as_echo "$as_me:${as_lineno-$LINENO}: result: $MSGFMT" >&5 +$as_echo "$MSGFMT" >&6; } +else + { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 +$as_echo "no" >&6; } +fi + + # Extract the first word of "gmsgfmt", so it can be a program name with args. +set dummy gmsgfmt; ac_word=$2 +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 +$as_echo_n "checking for $ac_word... " >&6; } +if ${ac_cv_path_GMSGFMT+:} false; then : + $as_echo_n "(cached) " >&6 +else + case $GMSGFMT in + [\\/]* | ?:[\\/]*) + ac_cv_path_GMSGFMT="$GMSGFMT" # Let the user override the test with a path. + ;; + *) + as_save_IFS=$IFS; IFS=$PATH_SEPARATOR +for as_dir in $PATH +do + IFS=$as_save_IFS + test -z "$as_dir" && as_dir=. + for ac_exec_ext in '' $ac_executable_extensions; do + if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then + ac_cv_path_GMSGFMT="$as_dir/$ac_word$ac_exec_ext" + $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 + break 2 + fi +done + done +IFS=$as_save_IFS + + test -z "$ac_cv_path_GMSGFMT" && ac_cv_path_GMSGFMT="$MSGFMT" + ;; +esac +fi +GMSGFMT=$ac_cv_path_GMSGFMT +if test -n "$GMSGFMT"; then + { $as_echo "$as_me:${as_lineno-$LINENO}: result: $GMSGFMT" >&5 +$as_echo "$GMSGFMT" >&6; } +else + { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 +$as_echo "no" >&6; } +fi + + + + case `$MSGFMT --version | sed 1q | sed -e 's,^[^0-9]*,,'` in + '' | 0.[0-9] | 0.[0-9].* | 0.1[0-4] | 0.1[0-4].*) MSGFMT_015=: ;; + *) MSGFMT_015=$MSGFMT ;; + esac + + case `$GMSGFMT --version | sed 1q | sed -e 's,^[^0-9]*,,'` in + '' | 0.[0-9] | 0.[0-9].* | 0.1[0-4] | 0.1[0-4].*) GMSGFMT_015=: ;; + *) GMSGFMT_015=$GMSGFMT ;; + esac + + + +# Prepare PATH_SEPARATOR. +# The user is always right. +if test "${PATH_SEPARATOR+set}" != set; then + echo "#! /bin/sh" >conf$$.sh + echo "exit 0" >>conf$$.sh + chmod +x conf$$.sh + if (PATH="/nonexistent;."; conf$$.sh) >/dev/null 2>&1; then + PATH_SEPARATOR=';' + else + PATH_SEPARATOR=: + fi + rm -f conf$$.sh +fi + +# Find out how to test for executable files. Don't use a zero-byte file, +# as systems may use methods other than mode bits to determine executability. +cat >conf$$.file <<_ASEOF +#! /bin/sh +exit 0 +_ASEOF +chmod +x conf$$.file +if test -x conf$$.file >/dev/null 2>&1; then + ac_executable_p="test -x" +else + ac_executable_p="test -f" +fi +rm -f conf$$.file + +# Extract the first word of "xgettext", so it can be a program name with args. +set dummy xgettext; ac_word=$2 +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 +$as_echo_n "checking for $ac_word... " >&6; } +if ${ac_cv_path_XGETTEXT+:} false; then : + $as_echo_n "(cached) " >&6 +else + case "$XGETTEXT" in + [\\/]* | ?:[\\/]*) + ac_cv_path_XGETTEXT="$XGETTEXT" # Let the user override the test with a path. + ;; + *) + ac_save_IFS="$IFS"; IFS=$PATH_SEPARATOR + for ac_dir in $PATH; do + IFS="$ac_save_IFS" + test -z "$ac_dir" && ac_dir=. + for ac_exec_ext in '' $ac_executable_extensions; do + if $ac_executable_p "$ac_dir/$ac_word$ac_exec_ext"; then + echo "$as_me: trying $ac_dir/$ac_word..." >&5 + if $ac_dir/$ac_word --omit-header --copyright-holder= --msgid-bugs-address= /dev/null >&5 2>&1 && + (if $ac_dir/$ac_word --omit-header --copyright-holder= --msgid-bugs-address= /dev/null 2>&1 >/dev/null | grep usage >/dev/null; then exit 1; else exit 0; fi); then + ac_cv_path_XGETTEXT="$ac_dir/$ac_word$ac_exec_ext" + break 2 + fi + fi + done + done + IFS="$ac_save_IFS" + test -z "$ac_cv_path_XGETTEXT" && ac_cv_path_XGETTEXT=":" + ;; +esac +fi +XGETTEXT="$ac_cv_path_XGETTEXT" +if test "$XGETTEXT" != ":"; then + { $as_echo "$as_me:${as_lineno-$LINENO}: result: $XGETTEXT" >&5 +$as_echo "$XGETTEXT" >&6; } +else + { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 +$as_echo "no" >&6; } +fi + + rm -f messages.po + + case `$XGETTEXT --version | sed 1q | sed -e 's,^[^0-9]*,,'` in + '' | 0.[0-9] | 0.[0-9].* | 0.1[0-4] | 0.1[0-4].*) XGETTEXT_015=: ;; + *) XGETTEXT_015=$XGETTEXT ;; + esac + + + +# Prepare PATH_SEPARATOR. +# The user is always right. +if test "${PATH_SEPARATOR+set}" != set; then + echo "#! /bin/sh" >conf$$.sh + echo "exit 0" >>conf$$.sh + chmod +x conf$$.sh + if (PATH="/nonexistent;."; conf$$.sh) >/dev/null 2>&1; then + PATH_SEPARATOR=';' + else + PATH_SEPARATOR=: + fi + rm -f conf$$.sh +fi + +# Find out how to test for executable files. Don't use a zero-byte file, +# as systems may use methods other than mode bits to determine executability. +cat >conf$$.file <<_ASEOF +#! /bin/sh +exit 0 +_ASEOF +chmod +x conf$$.file +if test -x conf$$.file >/dev/null 2>&1; then + ac_executable_p="test -x" +else + ac_executable_p="test -f" +fi +rm -f conf$$.file + +# Extract the first word of "msgmerge", so it can be a program name with args. +set dummy msgmerge; ac_word=$2 +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 +$as_echo_n "checking for $ac_word... " >&6; } +if ${ac_cv_path_MSGMERGE+:} false; then : + $as_echo_n "(cached) " >&6 +else + case "$MSGMERGE" in + [\\/]* | ?:[\\/]*) + ac_cv_path_MSGMERGE="$MSGMERGE" # Let the user override the test with a path. + ;; + *) + ac_save_IFS="$IFS"; IFS=$PATH_SEPARATOR + for ac_dir in $PATH; do + IFS="$ac_save_IFS" + test -z "$ac_dir" && ac_dir=. + for ac_exec_ext in '' $ac_executable_extensions; do + if $ac_executable_p "$ac_dir/$ac_word$ac_exec_ext"; then + echo "$as_me: trying $ac_dir/$ac_word..." >&5 + if $ac_dir/$ac_word --update -q /dev/null /dev/null >&5 2>&1; then + ac_cv_path_MSGMERGE="$ac_dir/$ac_word$ac_exec_ext" + break 2 + fi + fi + done + done + IFS="$ac_save_IFS" + test -z "$ac_cv_path_MSGMERGE" && ac_cv_path_MSGMERGE=":" + ;; +esac +fi +MSGMERGE="$ac_cv_path_MSGMERGE" +if test "$MSGMERGE" != ":"; then + { $as_echo "$as_me:${as_lineno-$LINENO}: result: $MSGMERGE" >&5 +$as_echo "$MSGMERGE" >&6; } +else + { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 +$as_echo "no" >&6; } +fi + + + test -n "$localedir" || localedir='${datadir}/locale' + + + test -n "${XGETTEXT_EXTRA_OPTIONS+set}" || XGETTEXT_EXTRA_OPTIONS= + + + ac_config_commands="$ac_config_commands po-directories" + + + + if test "X$prefix" = "XNONE"; then + acl_final_prefix="$ac_default_prefix" + else + acl_final_prefix="$prefix" + fi + if test "X$exec_prefix" = "XNONE"; then + acl_final_exec_prefix='${prefix}' + else + acl_final_exec_prefix="$exec_prefix" + fi + acl_save_prefix="$prefix" + prefix="$acl_final_prefix" + eval acl_final_exec_prefix=\"$acl_final_exec_prefix\" + prefix="$acl_save_prefix" + + +# Check whether --with-gnu-ld was given. +if test "${with_gnu_ld+set}" = set; then : + withval=$with_gnu_ld; test "$withval" = no || with_gnu_ld=yes +else + with_gnu_ld=no +fi + +# Prepare PATH_SEPARATOR. +# The user is always right. +if test "${PATH_SEPARATOR+set}" != set; then + echo "#! /bin/sh" >conf$$.sh + echo "exit 0" >>conf$$.sh + chmod +x conf$$.sh + if (PATH="/nonexistent;."; conf$$.sh) >/dev/null 2>&1; then + PATH_SEPARATOR=';' + else + PATH_SEPARATOR=: + fi + rm -f conf$$.sh +fi +ac_prog=ld +if test "$GCC" = yes; then + # Check if gcc -print-prog-name=ld gives a path. + { $as_echo "$as_me:${as_lineno-$LINENO}: checking for ld used by GCC" >&5 +$as_echo_n "checking for ld used by GCC... " >&6; } + case $host in + *-*-mingw*) + # gcc leaves a trailing carriage return which upsets mingw + ac_prog=`($CC -print-prog-name=ld) 2>&5 | tr -d '\015'` ;; + *) + ac_prog=`($CC -print-prog-name=ld) 2>&5` ;; + esac + case $ac_prog in + # Accept absolute paths. + [\\/]* | [A-Za-z]:[\\/]*) + re_direlt='/[^/][^/]*/\.\./' + # Canonicalize the path of ld + ac_prog=`echo $ac_prog| sed 's%\\\\%/%g'` + while echo $ac_prog | grep "$re_direlt" > /dev/null 2>&1; do + ac_prog=`echo $ac_prog| sed "s%$re_direlt%/%"` + done + test -z "$LD" && LD="$ac_prog" + ;; + "") + # If it fails, then pretend we aren't using GCC. + ac_prog=ld + ;; + *) + # If it is relative, then search for the first ld in PATH. + with_gnu_ld=unknown + ;; + esac +elif test "$with_gnu_ld" = yes; then + { $as_echo "$as_me:${as_lineno-$LINENO}: checking for GNU ld" >&5 +$as_echo_n "checking for GNU ld... " >&6; } +else + { $as_echo "$as_me:${as_lineno-$LINENO}: checking for non-GNU ld" >&5 +$as_echo_n "checking for non-GNU ld... " >&6; } +fi +if ${acl_cv_path_LD+:} false; then : + $as_echo_n "(cached) " >&6 +else + if test -z "$LD"; then + IFS="${IFS= }"; ac_save_ifs="$IFS"; IFS="${IFS}${PATH_SEPARATOR-:}" + for ac_dir in $PATH; do + test -z "$ac_dir" && ac_dir=. + if test -f "$ac_dir/$ac_prog" || test -f "$ac_dir/$ac_prog$ac_exeext"; then + acl_cv_path_LD="$ac_dir/$ac_prog" + # Check to see if the program is GNU ld. I'd rather use --version, + # but apparently some GNU ld's only accept -v. + # Break only if it was the GNU/non-GNU ld that we prefer. + case `"$acl_cv_path_LD" -v 2>&1 < /dev/null` in + *GNU* | *'with BFD'*) + test "$with_gnu_ld" != no && break ;; + *) + test "$with_gnu_ld" != yes && break ;; + esac + fi + done + IFS="$ac_save_ifs" +else + acl_cv_path_LD="$LD" # Let the user override the test with a path. +fi +fi + +LD="$acl_cv_path_LD" +if test -n "$LD"; then + { $as_echo "$as_me:${as_lineno-$LINENO}: result: $LD" >&5 +$as_echo "$LD" >&6; } +else + { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 +$as_echo "no" >&6; } +fi +test -z "$LD" && as_fn_error $? "no acceptable ld found in \$PATH" "$LINENO" 5 +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking if the linker ($LD) is GNU ld" >&5 +$as_echo_n "checking if the linker ($LD) is GNU ld... " >&6; } +if ${acl_cv_prog_gnu_ld+:} false; then : + $as_echo_n "(cached) " >&6 +else + # I'd rather use --version here, but apparently some GNU ld's only accept -v. +case `$LD -v 2>&1 &5 +$as_echo "$acl_cv_prog_gnu_ld" >&6; } +with_gnu_ld=$acl_cv_prog_gnu_ld + + + + + { $as_echo "$as_me:${as_lineno-$LINENO}: checking for shared library run path origin" >&5 +$as_echo_n "checking for shared library run path origin... " >&6; } +if ${acl_cv_rpath+:} false; then : + $as_echo_n "(cached) " >&6 +else + + CC="$CC" GCC="$GCC" LDFLAGS="$LDFLAGS" LD="$LD" with_gnu_ld="$with_gnu_ld" \ + ${CONFIG_SHELL-/bin/sh} "$ac_aux_dir/config.rpath" "$host" > conftest.sh + . ./conftest.sh + rm -f ./conftest.sh + acl_cv_rpath=done + +fi +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $acl_cv_rpath" >&5 +$as_echo "$acl_cv_rpath" >&6; } + wl="$acl_cv_wl" + acl_libext="$acl_cv_libext" + acl_shlibext="$acl_cv_shlibext" + acl_libname_spec="$acl_cv_libname_spec" + acl_library_names_spec="$acl_cv_library_names_spec" + acl_hardcode_libdir_flag_spec="$acl_cv_hardcode_libdir_flag_spec" + acl_hardcode_libdir_separator="$acl_cv_hardcode_libdir_separator" + acl_hardcode_direct="$acl_cv_hardcode_direct" + acl_hardcode_minus_L="$acl_cv_hardcode_minus_L" + # Check whether --enable-rpath was given. +if test "${enable_rpath+set}" = set; then : + enableval=$enable_rpath; : +else + enable_rpath=yes +fi + + + + acl_libdirstem=lib + searchpath=`(LC_ALL=C $CC -print-search-dirs) 2>/dev/null | sed -n -e 's,^libraries: ,,p' | sed -e 's,^=,,'` + if test -n "$searchpath"; then + acl_save_IFS="${IFS= }"; IFS=":" + for searchdir in $searchpath; do + if test -d "$searchdir"; then + case "$searchdir" in + */lib64/ | */lib64 ) acl_libdirstem=lib64 ;; + *) searchdir=`cd "$searchdir" && pwd` + case "$searchdir" in + */lib64 ) acl_libdirstem=lib64 ;; + esac ;; + esac + fi + done + IFS="$acl_save_IFS" + fi + + + + + + + + + + use_additional=yes + + acl_save_prefix="$prefix" + prefix="$acl_final_prefix" + acl_save_exec_prefix="$exec_prefix" + exec_prefix="$acl_final_exec_prefix" + + eval additional_includedir=\"$includedir\" + eval additional_libdir=\"$libdir\" + + exec_prefix="$acl_save_exec_prefix" + prefix="$acl_save_prefix" + + +# Check whether --with-libiconv-prefix was given. +if test "${with_libiconv_prefix+set}" = set; then : + withval=$with_libiconv_prefix; + if test "X$withval" = "Xno"; then + use_additional=no + else + if test "X$withval" = "X"; then + + acl_save_prefix="$prefix" + prefix="$acl_final_prefix" + acl_save_exec_prefix="$exec_prefix" + exec_prefix="$acl_final_exec_prefix" + + eval additional_includedir=\"$includedir\" + eval additional_libdir=\"$libdir\" + + exec_prefix="$acl_save_exec_prefix" + prefix="$acl_save_prefix" + + else + additional_includedir="$withval/include" + additional_libdir="$withval/$acl_libdirstem" + fi + fi + +fi + + LIBICONV= + LTLIBICONV= + INCICONV= + LIBICONV_PREFIX= + rpathdirs= + ltrpathdirs= + names_already_handled= + names_next_round='iconv ' + while test -n "$names_next_round"; do + names_this_round="$names_next_round" + names_next_round= + for name in $names_this_round; do + already_handled= + for n in $names_already_handled; do + if test "$n" = "$name"; then + already_handled=yes + break + fi + done + if test -z "$already_handled"; then + names_already_handled="$names_already_handled $name" + uppername=`echo "$name" | sed -e 'y|abcdefghijklmnopqrstuvwxyz./-|ABCDEFGHIJKLMNOPQRSTUVWXYZ___|'` + eval value=\"\$HAVE_LIB$uppername\" + if test -n "$value"; then + if test "$value" = yes; then + eval value=\"\$LIB$uppername\" + test -z "$value" || LIBICONV="${LIBICONV}${LIBICONV:+ }$value" + eval value=\"\$LTLIB$uppername\" + test -z "$value" || LTLIBICONV="${LTLIBICONV}${LTLIBICONV:+ }$value" + else + : + fi + else + found_dir= + found_la= + found_so= + found_a= + eval libname=\"$acl_libname_spec\" # typically: libname=lib$name + if test -n "$acl_shlibext"; then + shrext=".$acl_shlibext" # typically: shrext=.so + else + shrext= + fi + if test $use_additional = yes; then + dir="$additional_libdir" + if test -n "$acl_shlibext"; then + if test -f "$dir/$libname$shrext"; then + found_dir="$dir" + found_so="$dir/$libname$shrext" + else + if test "$acl_library_names_spec" = '$libname$shrext$versuffix'; then + ver=`(cd "$dir" && \ + for f in "$libname$shrext".*; do echo "$f"; done \ + | sed -e "s,^$libname$shrext\\\\.,," \ + | sort -t '.' -n -r -k1,1 -k2,2 -k3,3 -k4,4 -k5,5 \ + | sed 1q ) 2>/dev/null` + if test -n "$ver" && test -f "$dir/$libname$shrext.$ver"; then + found_dir="$dir" + found_so="$dir/$libname$shrext.$ver" + fi + else + eval library_names=\"$acl_library_names_spec\" + for f in $library_names; do + if test -f "$dir/$f"; then + found_dir="$dir" + found_so="$dir/$f" + break + fi + done + fi + fi + fi + if test "X$found_dir" = "X"; then + if test -f "$dir/$libname.$acl_libext"; then + found_dir="$dir" + found_a="$dir/$libname.$acl_libext" + fi + fi + if test "X$found_dir" != "X"; then + if test -f "$dir/$libname.la"; then + found_la="$dir/$libname.la" + fi + fi + fi + if test "X$found_dir" = "X"; then + for x in $LDFLAGS $LTLIBICONV; do + + acl_save_prefix="$prefix" + prefix="$acl_final_prefix" + acl_save_exec_prefix="$exec_prefix" + exec_prefix="$acl_final_exec_prefix" + eval x=\"$x\" + exec_prefix="$acl_save_exec_prefix" + prefix="$acl_save_prefix" + + case "$x" in + -L*) + dir=`echo "X$x" | sed -e 's/^X-L//'` + if test -n "$acl_shlibext"; then + if test -f "$dir/$libname$shrext"; then + found_dir="$dir" + found_so="$dir/$libname$shrext" + else + if test "$acl_library_names_spec" = '$libname$shrext$versuffix'; then + ver=`(cd "$dir" && \ + for f in "$libname$shrext".*; do echo "$f"; done \ + | sed -e "s,^$libname$shrext\\\\.,," \ + | sort -t '.' -n -r -k1,1 -k2,2 -k3,3 -k4,4 -k5,5 \ + | sed 1q ) 2>/dev/null` + if test -n "$ver" && test -f "$dir/$libname$shrext.$ver"; then + found_dir="$dir" + found_so="$dir/$libname$shrext.$ver" + fi + else + eval library_names=\"$acl_library_names_spec\" + for f in $library_names; do + if test -f "$dir/$f"; then + found_dir="$dir" + found_so="$dir/$f" + break + fi + done + fi + fi + fi + if test "X$found_dir" = "X"; then + if test -f "$dir/$libname.$acl_libext"; then + found_dir="$dir" + found_a="$dir/$libname.$acl_libext" + fi + fi + if test "X$found_dir" != "X"; then + if test -f "$dir/$libname.la"; then + found_la="$dir/$libname.la" + fi + fi + ;; + esac + if test "X$found_dir" != "X"; then + break + fi + done + fi + if test "X$found_dir" != "X"; then + LTLIBICONV="${LTLIBICONV}${LTLIBICONV:+ }-L$found_dir -l$name" + if test "X$found_so" != "X"; then + if test "$enable_rpath" = no || test "X$found_dir" = "X/usr/$acl_libdirstem"; then + LIBICONV="${LIBICONV}${LIBICONV:+ }$found_so" + else + haveit= + for x in $ltrpathdirs; do + if test "X$x" = "X$found_dir"; then + haveit=yes + break + fi + done + if test -z "$haveit"; then + ltrpathdirs="$ltrpathdirs $found_dir" + fi + if test "$acl_hardcode_direct" = yes; then + LIBICONV="${LIBICONV}${LIBICONV:+ }$found_so" + else + if test -n "$acl_hardcode_libdir_flag_spec" && test "$acl_hardcode_minus_L" = no; then + LIBICONV="${LIBICONV}${LIBICONV:+ }$found_so" + haveit= + for x in $rpathdirs; do + if test "X$x" = "X$found_dir"; then + haveit=yes + break + fi + done + if test -z "$haveit"; then + rpathdirs="$rpathdirs $found_dir" + fi + else + haveit= + for x in $LDFLAGS $LIBICONV; do + + acl_save_prefix="$prefix" + prefix="$acl_final_prefix" + acl_save_exec_prefix="$exec_prefix" + exec_prefix="$acl_final_exec_prefix" + eval x=\"$x\" + exec_prefix="$acl_save_exec_prefix" + prefix="$acl_save_prefix" + + if test "X$x" = "X-L$found_dir"; then + haveit=yes + break + fi + done + if test -z "$haveit"; then + LIBICONV="${LIBICONV}${LIBICONV:+ }-L$found_dir" + fi + if test "$acl_hardcode_minus_L" != no; then + LIBICONV="${LIBICONV}${LIBICONV:+ }$found_so" + else + LIBICONV="${LIBICONV}${LIBICONV:+ }-l$name" + fi + fi + fi + fi + else + if test "X$found_a" != "X"; then + LIBICONV="${LIBICONV}${LIBICONV:+ }$found_a" + else + LIBICONV="${LIBICONV}${LIBICONV:+ }-L$found_dir -l$name" + fi + fi + additional_includedir= + case "$found_dir" in + */$acl_libdirstem | */$acl_libdirstem/) + basedir=`echo "X$found_dir" | sed -e 's,^X,,' -e "s,/$acl_libdirstem/"'*$,,'` + LIBICONV_PREFIX="$basedir" + additional_includedir="$basedir/include" + ;; + esac + if test "X$additional_includedir" != "X"; then + if test "X$additional_includedir" != "X/usr/include"; then + haveit= + if test "X$additional_includedir" = "X/usr/local/include"; then + if test -n "$GCC"; then + case $host_os in + linux* | gnu* | k*bsd*-gnu) haveit=yes;; + esac + fi + fi + if test -z "$haveit"; then + for x in $CPPFLAGS $INCICONV; do + + acl_save_prefix="$prefix" + prefix="$acl_final_prefix" + acl_save_exec_prefix="$exec_prefix" + exec_prefix="$acl_final_exec_prefix" + eval x=\"$x\" + exec_prefix="$acl_save_exec_prefix" + prefix="$acl_save_prefix" + + if test "X$x" = "X-I$additional_includedir"; then + haveit=yes + break + fi + done + if test -z "$haveit"; then + if test -d "$additional_includedir"; then + INCICONV="${INCICONV}${INCICONV:+ }-I$additional_includedir" + fi + fi + fi + fi + fi + if test -n "$found_la"; then + save_libdir="$libdir" + case "$found_la" in + */* | *\\*) . "$found_la" ;; + *) . "./$found_la" ;; + esac + libdir="$save_libdir" + for dep in $dependency_libs; do + case "$dep" in + -L*) + additional_libdir=`echo "X$dep" | sed -e 's/^X-L//'` + if test "X$additional_libdir" != "X/usr/$acl_libdirstem"; then + haveit= + if test "X$additional_libdir" = "X/usr/local/$acl_libdirstem"; then + if test -n "$GCC"; then + case $host_os in + linux* | gnu* | k*bsd*-gnu) haveit=yes;; + esac + fi + fi + if test -z "$haveit"; then + haveit= + for x in $LDFLAGS $LIBICONV; do + + acl_save_prefix="$prefix" + prefix="$acl_final_prefix" + acl_save_exec_prefix="$exec_prefix" + exec_prefix="$acl_final_exec_prefix" + eval x=\"$x\" + exec_prefix="$acl_save_exec_prefix" + prefix="$acl_save_prefix" + + if test "X$x" = "X-L$additional_libdir"; then + haveit=yes + break + fi + done + if test -z "$haveit"; then + if test -d "$additional_libdir"; then + LIBICONV="${LIBICONV}${LIBICONV:+ }-L$additional_libdir" + fi + fi + haveit= + for x in $LDFLAGS $LTLIBICONV; do + + acl_save_prefix="$prefix" + prefix="$acl_final_prefix" + acl_save_exec_prefix="$exec_prefix" + exec_prefix="$acl_final_exec_prefix" + eval x=\"$x\" + exec_prefix="$acl_save_exec_prefix" + prefix="$acl_save_prefix" + + if test "X$x" = "X-L$additional_libdir"; then + haveit=yes + break + fi + done + if test -z "$haveit"; then + if test -d "$additional_libdir"; then + LTLIBICONV="${LTLIBICONV}${LTLIBICONV:+ }-L$additional_libdir" + fi + fi + fi + fi + ;; + -R*) + dir=`echo "X$dep" | sed -e 's/^X-R//'` + if test "$enable_rpath" != no; then + haveit= + for x in $rpathdirs; do + if test "X$x" = "X$dir"; then + haveit=yes + break + fi + done + if test -z "$haveit"; then + rpathdirs="$rpathdirs $dir" + fi + haveit= + for x in $ltrpathdirs; do + if test "X$x" = "X$dir"; then + haveit=yes + break + fi + done + if test -z "$haveit"; then + ltrpathdirs="$ltrpathdirs $dir" + fi + fi + ;; + -l*) + names_next_round="$names_next_round "`echo "X$dep" | sed -e 's/^X-l//'` + ;; + *.la) + names_next_round="$names_next_round "`echo "X$dep" | sed -e 's,^X.*/,,' -e 's,^lib,,' -e 's,\.la$,,'` + ;; + *) + LIBICONV="${LIBICONV}${LIBICONV:+ }$dep" + LTLIBICONV="${LTLIBICONV}${LTLIBICONV:+ }$dep" + ;; + esac + done + fi + else + LIBICONV="${LIBICONV}${LIBICONV:+ }-l$name" + LTLIBICONV="${LTLIBICONV}${LTLIBICONV:+ }-l$name" + fi + fi + fi + done + done + if test "X$rpathdirs" != "X"; then + if test -n "$acl_hardcode_libdir_separator"; then + alldirs= + for found_dir in $rpathdirs; do + alldirs="${alldirs}${alldirs:+$acl_hardcode_libdir_separator}$found_dir" + done + acl_save_libdir="$libdir" + libdir="$alldirs" + eval flag=\"$acl_hardcode_libdir_flag_spec\" + libdir="$acl_save_libdir" + LIBICONV="${LIBICONV}${LIBICONV:+ }$flag" + else + for found_dir in $rpathdirs; do + acl_save_libdir="$libdir" + libdir="$found_dir" + eval flag=\"$acl_hardcode_libdir_flag_spec\" + libdir="$acl_save_libdir" + LIBICONV="${LIBICONV}${LIBICONV:+ }$flag" + done + fi + fi + if test "X$ltrpathdirs" != "X"; then + for found_dir in $ltrpathdirs; do + LTLIBICONV="${LTLIBICONV}${LTLIBICONV:+ }-R$found_dir" + done + fi + + + + + + + + + + + + + + + + + + + + + + + + + + { $as_echo "$as_me:${as_lineno-$LINENO}: checking for CFPreferencesCopyAppValue" >&5 +$as_echo_n "checking for CFPreferencesCopyAppValue... " >&6; } +if ${gt_cv_func_CFPreferencesCopyAppValue+:} false; then : + $as_echo_n "(cached) " >&6 +else + gt_save_LIBS="$LIBS" + LIBS="$LIBS -Wl,-framework -Wl,CoreFoundation" + cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ +#include +int +main () +{ +CFPreferencesCopyAppValue(NULL, NULL) + ; + return 0; +} +_ACEOF +if ac_fn_c_try_link "$LINENO"; then : + gt_cv_func_CFPreferencesCopyAppValue=yes +else + gt_cv_func_CFPreferencesCopyAppValue=no +fi +rm -f core conftest.err conftest.$ac_objext \ + conftest$ac_exeext conftest.$ac_ext + LIBS="$gt_save_LIBS" +fi +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $gt_cv_func_CFPreferencesCopyAppValue" >&5 +$as_echo "$gt_cv_func_CFPreferencesCopyAppValue" >&6; } + if test $gt_cv_func_CFPreferencesCopyAppValue = yes; then + +$as_echo "#define HAVE_CFPREFERENCESCOPYAPPVALUE 1" >>confdefs.h + + fi + { $as_echo "$as_me:${as_lineno-$LINENO}: checking for CFLocaleCopyCurrent" >&5 +$as_echo_n "checking for CFLocaleCopyCurrent... " >&6; } +if ${gt_cv_func_CFLocaleCopyCurrent+:} false; then : + $as_echo_n "(cached) " >&6 +else + gt_save_LIBS="$LIBS" + LIBS="$LIBS -Wl,-framework -Wl,CoreFoundation" + cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ +#include +int +main () +{ +CFLocaleCopyCurrent(); + ; + return 0; +} +_ACEOF +if ac_fn_c_try_link "$LINENO"; then : + gt_cv_func_CFLocaleCopyCurrent=yes +else + gt_cv_func_CFLocaleCopyCurrent=no +fi +rm -f core conftest.err conftest.$ac_objext \ + conftest$ac_exeext conftest.$ac_ext + LIBS="$gt_save_LIBS" +fi +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $gt_cv_func_CFLocaleCopyCurrent" >&5 +$as_echo "$gt_cv_func_CFLocaleCopyCurrent" >&6; } + if test $gt_cv_func_CFLocaleCopyCurrent = yes; then + +$as_echo "#define HAVE_CFLOCALECOPYCURRENT 1" >>confdefs.h + + fi + INTL_MACOSX_LIBS= + if test $gt_cv_func_CFPreferencesCopyAppValue = yes || test $gt_cv_func_CFLocaleCopyCurrent = yes; then + INTL_MACOSX_LIBS="-Wl,-framework -Wl,CoreFoundation" + fi + + + + + + + LIBINTL= + LTLIBINTL= + POSUB= + + case " $gt_needs " in + *" need-formatstring-macros "*) gt_api_version=3 ;; + *" need-ngettext "*) gt_api_version=2 ;; + *) gt_api_version=1 ;; + esac + gt_func_gnugettext_libc="gt_cv_func_gnugettext${gt_api_version}_libc" + gt_func_gnugettext_libintl="gt_cv_func_gnugettext${gt_api_version}_libintl" + + if test "$USE_NLS" = "yes"; then + gt_use_preinstalled_gnugettext=no + + + if test $gt_api_version -ge 3; then + gt_revision_test_code=' +#ifndef __GNU_GETTEXT_SUPPORTED_REVISION +#define __GNU_GETTEXT_SUPPORTED_REVISION(major) ((major) == 0 ? 0 : -1) +#endif +typedef int array [2 * (__GNU_GETTEXT_SUPPORTED_REVISION(0) >= 1) - 1]; +' + else + gt_revision_test_code= + fi + if test $gt_api_version -ge 2; then + gt_expression_test_code=' + * ngettext ("", "", 0)' + else + gt_expression_test_code= + fi + + { $as_echo "$as_me:${as_lineno-$LINENO}: checking for GNU gettext in libc" >&5 +$as_echo_n "checking for GNU gettext in libc... " >&6; } +if eval \${$gt_func_gnugettext_libc+:} false; then : + $as_echo_n "(cached) " >&6 +else + cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ +#include +$gt_revision_test_code +extern int _nl_msg_cat_cntr; +extern int *_nl_domain_bindings; +int +main () +{ +bindtextdomain ("", ""); +return * gettext ("")$gt_expression_test_code + _nl_msg_cat_cntr + *_nl_domain_bindings + ; + return 0; +} +_ACEOF +if ac_fn_c_try_link "$LINENO"; then : + eval "$gt_func_gnugettext_libc=yes" +else + eval "$gt_func_gnugettext_libc=no" +fi +rm -f core conftest.err conftest.$ac_objext \ + conftest$ac_exeext conftest.$ac_ext +fi +eval ac_res=\$$gt_func_gnugettext_libc + { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_res" >&5 +$as_echo "$ac_res" >&6; } + + if { eval "gt_val=\$$gt_func_gnugettext_libc"; test "$gt_val" != "yes"; }; then + + + + + + am_save_CPPFLAGS="$CPPFLAGS" + + for element in $INCICONV; do + haveit= + for x in $CPPFLAGS; do + + acl_save_prefix="$prefix" + prefix="$acl_final_prefix" + acl_save_exec_prefix="$exec_prefix" + exec_prefix="$acl_final_exec_prefix" + eval x=\"$x\" + exec_prefix="$acl_save_exec_prefix" + prefix="$acl_save_prefix" + + if test "X$x" = "X$element"; then + haveit=yes + break + fi + done + if test -z "$haveit"; then + CPPFLAGS="${CPPFLAGS}${CPPFLAGS:+ }$element" + fi + done + + + { $as_echo "$as_me:${as_lineno-$LINENO}: checking for iconv" >&5 +$as_echo_n "checking for iconv... " >&6; } +if ${am_cv_func_iconv+:} false; then : + $as_echo_n "(cached) " >&6 +else + + am_cv_func_iconv="no, consider installing GNU libiconv" + am_cv_lib_iconv=no + cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ +#include +#include +int +main () +{ +iconv_t cd = iconv_open("",""); + iconv(cd,NULL,NULL,NULL,NULL); + iconv_close(cd); + ; + return 0; +} +_ACEOF +if ac_fn_c_try_link "$LINENO"; then : + am_cv_func_iconv=yes +fi +rm -f core conftest.err conftest.$ac_objext \ + conftest$ac_exeext conftest.$ac_ext + if test "$am_cv_func_iconv" != yes; then + am_save_LIBS="$LIBS" + LIBS="$LIBS $LIBICONV" + cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ +#include +#include +int +main () +{ +iconv_t cd = iconv_open("",""); + iconv(cd,NULL,NULL,NULL,NULL); + iconv_close(cd); + ; + return 0; +} +_ACEOF +if ac_fn_c_try_link "$LINENO"; then : + am_cv_lib_iconv=yes + am_cv_func_iconv=yes +fi +rm -f core conftest.err conftest.$ac_objext \ + conftest$ac_exeext conftest.$ac_ext + LIBS="$am_save_LIBS" + fi + +fi +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $am_cv_func_iconv" >&5 +$as_echo "$am_cv_func_iconv" >&6; } + if test "$am_cv_func_iconv" = yes; then + { $as_echo "$as_me:${as_lineno-$LINENO}: checking for working iconv" >&5 +$as_echo_n "checking for working iconv... " >&6; } +if ${am_cv_func_iconv_works+:} false; then : + $as_echo_n "(cached) " >&6 +else + + am_save_LIBS="$LIBS" + if test $am_cv_lib_iconv = yes; then + LIBS="$LIBS $LIBICONV" + fi + if test "$cross_compiling" = yes; then : + case "$host_os" in + aix* | hpux*) am_cv_func_iconv_works="guessing no" ;; + *) am_cv_func_iconv_works="guessing yes" ;; + esac +else + cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ + +#include +#include +int main () +{ + /* Test against AIX 5.1 bug: Failures are not distinguishable from successful + returns. */ + { + iconv_t cd_utf8_to_88591 = iconv_open ("ISO8859-1", "UTF-8"); + if (cd_utf8_to_88591 != (iconv_t)(-1)) + { + static const char input[] = "\342\202\254"; /* EURO SIGN */ + char buf[10]; + const char *inptr = input; + size_t inbytesleft = strlen (input); + char *outptr = buf; + size_t outbytesleft = sizeof (buf); + size_t res = iconv (cd_utf8_to_88591, + (char **) &inptr, &inbytesleft, + &outptr, &outbytesleft); + if (res == 0) + return 1; + } + } +#if 0 /* This bug could be worked around by the caller. */ + /* Test against HP-UX 11.11 bug: Positive return value instead of 0. */ + { + iconv_t cd_88591_to_utf8 = iconv_open ("utf8", "iso88591"); + if (cd_88591_to_utf8 != (iconv_t)(-1)) + { + static const char input[] = "\304rger mit b\366sen B\374bchen ohne Augenma\337"; + char buf[50]; + const char *inptr = input; + size_t inbytesleft = strlen (input); + char *outptr = buf; + size_t outbytesleft = sizeof (buf); + size_t res = iconv (cd_88591_to_utf8, + (char **) &inptr, &inbytesleft, + &outptr, &outbytesleft); + if ((int)res > 0) + return 1; + } + } +#endif + /* Test against HP-UX 11.11 bug: No converter from EUC-JP to UTF-8 is + provided. */ + if (/* Try standardized names. */ + iconv_open ("UTF-8", "EUC-JP") == (iconv_t)(-1) + /* Try IRIX, OSF/1 names. */ + && iconv_open ("UTF-8", "eucJP") == (iconv_t)(-1) + /* Try AIX names. */ + && iconv_open ("UTF-8", "IBM-eucJP") == (iconv_t)(-1) + /* Try HP-UX names. */ + && iconv_open ("utf8", "eucJP") == (iconv_t)(-1)) + return 1; + return 0; +} +_ACEOF +if ac_fn_c_try_run "$LINENO"; then : + am_cv_func_iconv_works=yes +else + am_cv_func_iconv_works=no +fi +rm -f core *.core core.conftest.* gmon.out bb.out conftest$ac_exeext \ + conftest.$ac_objext conftest.beam conftest.$ac_ext +fi + + LIBS="$am_save_LIBS" + +fi +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $am_cv_func_iconv_works" >&5 +$as_echo "$am_cv_func_iconv_works" >&6; } + case "$am_cv_func_iconv_works" in + *no) am_func_iconv=no am_cv_lib_iconv=no ;; + *) am_func_iconv=yes ;; + esac + else + am_func_iconv=no am_cv_lib_iconv=no + fi + if test "$am_func_iconv" = yes; then + +$as_echo "#define HAVE_ICONV 1" >>confdefs.h + + fi + if test "$am_cv_lib_iconv" = yes; then + { $as_echo "$as_me:${as_lineno-$LINENO}: checking how to link with libiconv" >&5 +$as_echo_n "checking how to link with libiconv... " >&6; } + { $as_echo "$as_me:${as_lineno-$LINENO}: result: $LIBICONV" >&5 +$as_echo "$LIBICONV" >&6; } + else + CPPFLAGS="$am_save_CPPFLAGS" + LIBICONV= + LTLIBICONV= + fi + + + + + + + + + use_additional=yes + + acl_save_prefix="$prefix" + prefix="$acl_final_prefix" + acl_save_exec_prefix="$exec_prefix" + exec_prefix="$acl_final_exec_prefix" + + eval additional_includedir=\"$includedir\" + eval additional_libdir=\"$libdir\" + + exec_prefix="$acl_save_exec_prefix" + prefix="$acl_save_prefix" + + +# Check whether --with-libintl-prefix was given. +if test "${with_libintl_prefix+set}" = set; then : + withval=$with_libintl_prefix; + if test "X$withval" = "Xno"; then + use_additional=no + else + if test "X$withval" = "X"; then + + acl_save_prefix="$prefix" + prefix="$acl_final_prefix" + acl_save_exec_prefix="$exec_prefix" + exec_prefix="$acl_final_exec_prefix" + + eval additional_includedir=\"$includedir\" + eval additional_libdir=\"$libdir\" + + exec_prefix="$acl_save_exec_prefix" + prefix="$acl_save_prefix" + + else + additional_includedir="$withval/include" + additional_libdir="$withval/$acl_libdirstem" + fi + fi + +fi + + LIBINTL= + LTLIBINTL= + INCINTL= + LIBINTL_PREFIX= + rpathdirs= + ltrpathdirs= + names_already_handled= + names_next_round='intl ' + while test -n "$names_next_round"; do + names_this_round="$names_next_round" + names_next_round= + for name in $names_this_round; do + already_handled= + for n in $names_already_handled; do + if test "$n" = "$name"; then + already_handled=yes + break + fi + done + if test -z "$already_handled"; then + names_already_handled="$names_already_handled $name" + uppername=`echo "$name" | sed -e 'y|abcdefghijklmnopqrstuvwxyz./-|ABCDEFGHIJKLMNOPQRSTUVWXYZ___|'` + eval value=\"\$HAVE_LIB$uppername\" + if test -n "$value"; then + if test "$value" = yes; then + eval value=\"\$LIB$uppername\" + test -z "$value" || LIBINTL="${LIBINTL}${LIBINTL:+ }$value" + eval value=\"\$LTLIB$uppername\" + test -z "$value" || LTLIBINTL="${LTLIBINTL}${LTLIBINTL:+ }$value" + else + : + fi + else + found_dir= + found_la= + found_so= + found_a= + eval libname=\"$acl_libname_spec\" # typically: libname=lib$name + if test -n "$acl_shlibext"; then + shrext=".$acl_shlibext" # typically: shrext=.so + else + shrext= + fi + if test $use_additional = yes; then + dir="$additional_libdir" + if test -n "$acl_shlibext"; then + if test -f "$dir/$libname$shrext"; then + found_dir="$dir" + found_so="$dir/$libname$shrext" + else + if test "$acl_library_names_spec" = '$libname$shrext$versuffix'; then + ver=`(cd "$dir" && \ + for f in "$libname$shrext".*; do echo "$f"; done \ + | sed -e "s,^$libname$shrext\\\\.,," \ + | sort -t '.' -n -r -k1,1 -k2,2 -k3,3 -k4,4 -k5,5 \ + | sed 1q ) 2>/dev/null` + if test -n "$ver" && test -f "$dir/$libname$shrext.$ver"; then + found_dir="$dir" + found_so="$dir/$libname$shrext.$ver" + fi + else + eval library_names=\"$acl_library_names_spec\" + for f in $library_names; do + if test -f "$dir/$f"; then + found_dir="$dir" + found_so="$dir/$f" + break + fi + done + fi + fi + fi + if test "X$found_dir" = "X"; then + if test -f "$dir/$libname.$acl_libext"; then + found_dir="$dir" + found_a="$dir/$libname.$acl_libext" + fi + fi + if test "X$found_dir" != "X"; then + if test -f "$dir/$libname.la"; then + found_la="$dir/$libname.la" + fi + fi + fi + if test "X$found_dir" = "X"; then + for x in $LDFLAGS $LTLIBINTL; do + + acl_save_prefix="$prefix" + prefix="$acl_final_prefix" + acl_save_exec_prefix="$exec_prefix" + exec_prefix="$acl_final_exec_prefix" + eval x=\"$x\" + exec_prefix="$acl_save_exec_prefix" + prefix="$acl_save_prefix" + + case "$x" in + -L*) + dir=`echo "X$x" | sed -e 's/^X-L//'` + if test -n "$acl_shlibext"; then + if test -f "$dir/$libname$shrext"; then + found_dir="$dir" + found_so="$dir/$libname$shrext" + else + if test "$acl_library_names_spec" = '$libname$shrext$versuffix'; then + ver=`(cd "$dir" && \ + for f in "$libname$shrext".*; do echo "$f"; done \ + | sed -e "s,^$libname$shrext\\\\.,," \ + | sort -t '.' -n -r -k1,1 -k2,2 -k3,3 -k4,4 -k5,5 \ + | sed 1q ) 2>/dev/null` + if test -n "$ver" && test -f "$dir/$libname$shrext.$ver"; then + found_dir="$dir" + found_so="$dir/$libname$shrext.$ver" + fi + else + eval library_names=\"$acl_library_names_spec\" + for f in $library_names; do + if test -f "$dir/$f"; then + found_dir="$dir" + found_so="$dir/$f" + break + fi + done + fi + fi + fi + if test "X$found_dir" = "X"; then + if test -f "$dir/$libname.$acl_libext"; then + found_dir="$dir" + found_a="$dir/$libname.$acl_libext" + fi + fi + if test "X$found_dir" != "X"; then + if test -f "$dir/$libname.la"; then + found_la="$dir/$libname.la" + fi + fi + ;; + esac + if test "X$found_dir" != "X"; then + break + fi + done + fi + if test "X$found_dir" != "X"; then + LTLIBINTL="${LTLIBINTL}${LTLIBINTL:+ }-L$found_dir -l$name" + if test "X$found_so" != "X"; then + if test "$enable_rpath" = no || test "X$found_dir" = "X/usr/$acl_libdirstem"; then + LIBINTL="${LIBINTL}${LIBINTL:+ }$found_so" + else + haveit= + for x in $ltrpathdirs; do + if test "X$x" = "X$found_dir"; then + haveit=yes + break + fi + done + if test -z "$haveit"; then + ltrpathdirs="$ltrpathdirs $found_dir" + fi + if test "$acl_hardcode_direct" = yes; then + LIBINTL="${LIBINTL}${LIBINTL:+ }$found_so" + else + if test -n "$acl_hardcode_libdir_flag_spec" && test "$acl_hardcode_minus_L" = no; then + LIBINTL="${LIBINTL}${LIBINTL:+ }$found_so" + haveit= + for x in $rpathdirs; do + if test "X$x" = "X$found_dir"; then + haveit=yes + break + fi + done + if test -z "$haveit"; then + rpathdirs="$rpathdirs $found_dir" + fi + else + haveit= + for x in $LDFLAGS $LIBINTL; do + + acl_save_prefix="$prefix" + prefix="$acl_final_prefix" + acl_save_exec_prefix="$exec_prefix" + exec_prefix="$acl_final_exec_prefix" + eval x=\"$x\" + exec_prefix="$acl_save_exec_prefix" + prefix="$acl_save_prefix" + + if test "X$x" = "X-L$found_dir"; then + haveit=yes + break + fi + done + if test -z "$haveit"; then + LIBINTL="${LIBINTL}${LIBINTL:+ }-L$found_dir" + fi + if test "$acl_hardcode_minus_L" != no; then + LIBINTL="${LIBINTL}${LIBINTL:+ }$found_so" + else + LIBINTL="${LIBINTL}${LIBINTL:+ }-l$name" + fi + fi + fi + fi + else + if test "X$found_a" != "X"; then + LIBINTL="${LIBINTL}${LIBINTL:+ }$found_a" + else + LIBINTL="${LIBINTL}${LIBINTL:+ }-L$found_dir -l$name" + fi + fi + additional_includedir= + case "$found_dir" in + */$acl_libdirstem | */$acl_libdirstem/) + basedir=`echo "X$found_dir" | sed -e 's,^X,,' -e "s,/$acl_libdirstem/"'*$,,'` + LIBINTL_PREFIX="$basedir" + additional_includedir="$basedir/include" + ;; + esac + if test "X$additional_includedir" != "X"; then + if test "X$additional_includedir" != "X/usr/include"; then + haveit= + if test "X$additional_includedir" = "X/usr/local/include"; then + if test -n "$GCC"; then + case $host_os in + linux* | gnu* | k*bsd*-gnu) haveit=yes;; + esac + fi + fi + if test -z "$haveit"; then + for x in $CPPFLAGS $INCINTL; do + + acl_save_prefix="$prefix" + prefix="$acl_final_prefix" + acl_save_exec_prefix="$exec_prefix" + exec_prefix="$acl_final_exec_prefix" + eval x=\"$x\" + exec_prefix="$acl_save_exec_prefix" + prefix="$acl_save_prefix" + + if test "X$x" = "X-I$additional_includedir"; then + haveit=yes + break + fi + done + if test -z "$haveit"; then + if test -d "$additional_includedir"; then + INCINTL="${INCINTL}${INCINTL:+ }-I$additional_includedir" + fi + fi + fi + fi + fi + if test -n "$found_la"; then + save_libdir="$libdir" + case "$found_la" in + */* | *\\*) . "$found_la" ;; + *) . "./$found_la" ;; + esac + libdir="$save_libdir" + for dep in $dependency_libs; do + case "$dep" in + -L*) + additional_libdir=`echo "X$dep" | sed -e 's/^X-L//'` + if test "X$additional_libdir" != "X/usr/$acl_libdirstem"; then + haveit= + if test "X$additional_libdir" = "X/usr/local/$acl_libdirstem"; then + if test -n "$GCC"; then + case $host_os in + linux* | gnu* | k*bsd*-gnu) haveit=yes;; + esac + fi + fi + if test -z "$haveit"; then + haveit= + for x in $LDFLAGS $LIBINTL; do + + acl_save_prefix="$prefix" + prefix="$acl_final_prefix" + acl_save_exec_prefix="$exec_prefix" + exec_prefix="$acl_final_exec_prefix" + eval x=\"$x\" + exec_prefix="$acl_save_exec_prefix" + prefix="$acl_save_prefix" + + if test "X$x" = "X-L$additional_libdir"; then + haveit=yes + break + fi + done + if test -z "$haveit"; then + if test -d "$additional_libdir"; then + LIBINTL="${LIBINTL}${LIBINTL:+ }-L$additional_libdir" + fi + fi + haveit= + for x in $LDFLAGS $LTLIBINTL; do + + acl_save_prefix="$prefix" + prefix="$acl_final_prefix" + acl_save_exec_prefix="$exec_prefix" + exec_prefix="$acl_final_exec_prefix" + eval x=\"$x\" + exec_prefix="$acl_save_exec_prefix" + prefix="$acl_save_prefix" + + if test "X$x" = "X-L$additional_libdir"; then + haveit=yes + break + fi + done + if test -z "$haveit"; then + if test -d "$additional_libdir"; then + LTLIBINTL="${LTLIBINTL}${LTLIBINTL:+ }-L$additional_libdir" + fi + fi + fi + fi + ;; + -R*) + dir=`echo "X$dep" | sed -e 's/^X-R//'` + if test "$enable_rpath" != no; then + haveit= + for x in $rpathdirs; do + if test "X$x" = "X$dir"; then + haveit=yes + break + fi + done + if test -z "$haveit"; then + rpathdirs="$rpathdirs $dir" + fi + haveit= + for x in $ltrpathdirs; do + if test "X$x" = "X$dir"; then + haveit=yes + break + fi + done + if test -z "$haveit"; then + ltrpathdirs="$ltrpathdirs $dir" + fi + fi + ;; + -l*) + names_next_round="$names_next_round "`echo "X$dep" | sed -e 's/^X-l//'` + ;; + *.la) + names_next_round="$names_next_round "`echo "X$dep" | sed -e 's,^X.*/,,' -e 's,^lib,,' -e 's,\.la$,,'` + ;; + *) + LIBINTL="${LIBINTL}${LIBINTL:+ }$dep" + LTLIBINTL="${LTLIBINTL}${LTLIBINTL:+ }$dep" + ;; + esac + done + fi + else + LIBINTL="${LIBINTL}${LIBINTL:+ }-l$name" + LTLIBINTL="${LTLIBINTL}${LTLIBINTL:+ }-l$name" + fi + fi + fi + done + done + if test "X$rpathdirs" != "X"; then + if test -n "$acl_hardcode_libdir_separator"; then + alldirs= + for found_dir in $rpathdirs; do + alldirs="${alldirs}${alldirs:+$acl_hardcode_libdir_separator}$found_dir" + done + acl_save_libdir="$libdir" + libdir="$alldirs" + eval flag=\"$acl_hardcode_libdir_flag_spec\" + libdir="$acl_save_libdir" + LIBINTL="${LIBINTL}${LIBINTL:+ }$flag" + else + for found_dir in $rpathdirs; do + acl_save_libdir="$libdir" + libdir="$found_dir" + eval flag=\"$acl_hardcode_libdir_flag_spec\" + libdir="$acl_save_libdir" + LIBINTL="${LIBINTL}${LIBINTL:+ }$flag" + done + fi + fi + if test "X$ltrpathdirs" != "X"; then + for found_dir in $ltrpathdirs; do + LTLIBINTL="${LTLIBINTL}${LTLIBINTL:+ }-R$found_dir" + done + fi + + { $as_echo "$as_me:${as_lineno-$LINENO}: checking for GNU gettext in libintl" >&5 +$as_echo_n "checking for GNU gettext in libintl... " >&6; } +if eval \${$gt_func_gnugettext_libintl+:} false; then : + $as_echo_n "(cached) " >&6 +else + gt_save_CPPFLAGS="$CPPFLAGS" + CPPFLAGS="$CPPFLAGS $INCINTL" + gt_save_LIBS="$LIBS" + LIBS="$LIBS $LIBINTL" + cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ +#include +$gt_revision_test_code +extern int _nl_msg_cat_cntr; +extern +#ifdef __cplusplus +"C" +#endif +const char *_nl_expand_alias (const char *); +int +main () +{ +bindtextdomain ("", ""); +return * gettext ("")$gt_expression_test_code + _nl_msg_cat_cntr + *_nl_expand_alias ("") + ; + return 0; +} +_ACEOF +if ac_fn_c_try_link "$LINENO"; then : + eval "$gt_func_gnugettext_libintl=yes" +else + eval "$gt_func_gnugettext_libintl=no" +fi +rm -f core conftest.err conftest.$ac_objext \ + conftest$ac_exeext conftest.$ac_ext + if { eval "gt_val=\$$gt_func_gnugettext_libintl"; test "$gt_val" != yes; } && test -n "$LIBICONV"; then + LIBS="$LIBS $LIBICONV" + cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ +#include +$gt_revision_test_code +extern int _nl_msg_cat_cntr; +extern +#ifdef __cplusplus +"C" +#endif +const char *_nl_expand_alias (const char *); +int +main () +{ +bindtextdomain ("", ""); +return * gettext ("")$gt_expression_test_code + _nl_msg_cat_cntr + *_nl_expand_alias ("") + ; + return 0; +} +_ACEOF +if ac_fn_c_try_link "$LINENO"; then : + LIBINTL="$LIBINTL $LIBICONV" + LTLIBINTL="$LTLIBINTL $LTLIBICONV" + eval "$gt_func_gnugettext_libintl=yes" + +fi +rm -f core conftest.err conftest.$ac_objext \ + conftest$ac_exeext conftest.$ac_ext + fi + CPPFLAGS="$gt_save_CPPFLAGS" + LIBS="$gt_save_LIBS" +fi +eval ac_res=\$$gt_func_gnugettext_libintl + { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_res" >&5 +$as_echo "$ac_res" >&6; } + fi + + if { eval "gt_val=\$$gt_func_gnugettext_libc"; test "$gt_val" = "yes"; } \ + || { { eval "gt_val=\$$gt_func_gnugettext_libintl"; test "$gt_val" = "yes"; } \ + && test "$PACKAGE" != gettext-runtime \ + && test "$PACKAGE" != gettext-tools; }; then + gt_use_preinstalled_gnugettext=yes + else + LIBINTL= + LTLIBINTL= + INCINTL= + fi + + + + if test -n "$INTL_MACOSX_LIBS"; then + if test "$gt_use_preinstalled_gnugettext" = "yes" \ + || test "$nls_cv_use_gnu_gettext" = "yes"; then + LIBINTL="$LIBINTL $INTL_MACOSX_LIBS" + LTLIBINTL="$LTLIBINTL $INTL_MACOSX_LIBS" + fi + fi + + if test "$gt_use_preinstalled_gnugettext" = "yes" \ + || test "$nls_cv_use_gnu_gettext" = "yes"; then + +$as_echo "#define ENABLE_NLS 1" >>confdefs.h + + else + USE_NLS=no + fi + fi + + { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether to use NLS" >&5 +$as_echo_n "checking whether to use NLS... " >&6; } + { $as_echo "$as_me:${as_lineno-$LINENO}: result: $USE_NLS" >&5 +$as_echo "$USE_NLS" >&6; } + if test "$USE_NLS" = "yes"; then + { $as_echo "$as_me:${as_lineno-$LINENO}: checking where the gettext function comes from" >&5 +$as_echo_n "checking where the gettext function comes from... " >&6; } + if test "$gt_use_preinstalled_gnugettext" = "yes"; then + if { eval "gt_val=\$$gt_func_gnugettext_libintl"; test "$gt_val" = "yes"; }; then + gt_source="external libintl" + else + gt_source="libc" + fi + else + gt_source="included intl directory" + fi + { $as_echo "$as_me:${as_lineno-$LINENO}: result: $gt_source" >&5 +$as_echo "$gt_source" >&6; } + fi + + if test "$USE_NLS" = "yes"; then + + if test "$gt_use_preinstalled_gnugettext" = "yes"; then + if { eval "gt_val=\$$gt_func_gnugettext_libintl"; test "$gt_val" = "yes"; }; then + { $as_echo "$as_me:${as_lineno-$LINENO}: checking how to link with libintl" >&5 +$as_echo_n "checking how to link with libintl... " >&6; } + { $as_echo "$as_me:${as_lineno-$LINENO}: result: $LIBINTL" >&5 +$as_echo "$LIBINTL" >&6; } + + for element in $INCINTL; do + haveit= + for x in $CPPFLAGS; do + + acl_save_prefix="$prefix" + prefix="$acl_final_prefix" + acl_save_exec_prefix="$exec_prefix" + exec_prefix="$acl_final_exec_prefix" + eval x=\"$x\" + exec_prefix="$acl_save_exec_prefix" + prefix="$acl_save_prefix" + + if test "X$x" = "X$element"; then + haveit=yes + break + fi + done + if test -z "$haveit"; then + CPPFLAGS="${CPPFLAGS}${CPPFLAGS:+ }$element" + fi + done + + fi + + +$as_echo "#define HAVE_GETTEXT 1" >>confdefs.h + + +$as_echo "#define HAVE_DCGETTEXT 1" >>confdefs.h + + fi + + POSUB=po + fi + + + + INTLLIBS="$LIBINTL" + + + + + + + + + +case "$am__api_version" in + 1.01234) + as_fn_error $? "Automake 1.5 or newer is required to use intltool" "$LINENO" 5 + ;; + *) + ;; +esac + +INTLTOOL_REQUIRED_VERSION_AS_INT=`echo 0.35.0 | awk -F. '{ print $ 1 * 1000 + $ 2 * 100 + $ 3; }'` +INTLTOOL_APPLIED_VERSION=`intltool-update --version | head -1 | cut -d" " -f3` +INTLTOOL_APPLIED_VERSION_AS_INT=`echo $INTLTOOL_APPLIED_VERSION | awk -F. '{ print $ 1 * 1000 + $ 2 * 100 + $ 3; }'` +if test -n "0.35.0"; then + { $as_echo "$as_me:${as_lineno-$LINENO}: checking for intltool >= 0.35.0" >&5 +$as_echo_n "checking for intltool >= 0.35.0... " >&6; } + { $as_echo "$as_me:${as_lineno-$LINENO}: result: $INTLTOOL_APPLIED_VERSION found" >&5 +$as_echo "$INTLTOOL_APPLIED_VERSION found" >&6; } + test "$INTLTOOL_APPLIED_VERSION_AS_INT" -ge "$INTLTOOL_REQUIRED_VERSION_AS_INT" || + as_fn_error $? "Your intltool is too old. You need intltool 0.35.0 or later." "$LINENO" 5 +fi + +# Extract the first word of "intltool-update", so it can be a program name with args. +set dummy intltool-update; ac_word=$2 +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 +$as_echo_n "checking for $ac_word... " >&6; } +if ${ac_cv_path_INTLTOOL_UPDATE+:} false; then : + $as_echo_n "(cached) " >&6 +else + case $INTLTOOL_UPDATE in + [\\/]* | ?:[\\/]*) + ac_cv_path_INTLTOOL_UPDATE="$INTLTOOL_UPDATE" # Let the user override the test with a path. + ;; + *) + as_save_IFS=$IFS; IFS=$PATH_SEPARATOR +for as_dir in $PATH +do + IFS=$as_save_IFS + test -z "$as_dir" && as_dir=. + for ac_exec_ext in '' $ac_executable_extensions; do + if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then + ac_cv_path_INTLTOOL_UPDATE="$as_dir/$ac_word$ac_exec_ext" + $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 + break 2 + fi +done + done +IFS=$as_save_IFS + + ;; +esac +fi +INTLTOOL_UPDATE=$ac_cv_path_INTLTOOL_UPDATE +if test -n "$INTLTOOL_UPDATE"; then + { $as_echo "$as_me:${as_lineno-$LINENO}: result: $INTLTOOL_UPDATE" >&5 +$as_echo "$INTLTOOL_UPDATE" >&6; } +else + { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 +$as_echo "no" >&6; } +fi + + +# Extract the first word of "intltool-merge", so it can be a program name with args. +set dummy intltool-merge; ac_word=$2 +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 +$as_echo_n "checking for $ac_word... " >&6; } +if ${ac_cv_path_INTLTOOL_MERGE+:} false; then : + $as_echo_n "(cached) " >&6 +else + case $INTLTOOL_MERGE in + [\\/]* | ?:[\\/]*) + ac_cv_path_INTLTOOL_MERGE="$INTLTOOL_MERGE" # Let the user override the test with a path. + ;; + *) + as_save_IFS=$IFS; IFS=$PATH_SEPARATOR +for as_dir in $PATH +do + IFS=$as_save_IFS + test -z "$as_dir" && as_dir=. + for ac_exec_ext in '' $ac_executable_extensions; do + if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then + ac_cv_path_INTLTOOL_MERGE="$as_dir/$ac_word$ac_exec_ext" + $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 + break 2 + fi +done + done +IFS=$as_save_IFS + + ;; +esac +fi +INTLTOOL_MERGE=$ac_cv_path_INTLTOOL_MERGE +if test -n "$INTLTOOL_MERGE"; then + { $as_echo "$as_me:${as_lineno-$LINENO}: result: $INTLTOOL_MERGE" >&5 +$as_echo "$INTLTOOL_MERGE" >&6; } +else + { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 +$as_echo "no" >&6; } +fi + + +# Extract the first word of "intltool-extract", so it can be a program name with args. +set dummy intltool-extract; ac_word=$2 +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 +$as_echo_n "checking for $ac_word... " >&6; } +if ${ac_cv_path_INTLTOOL_EXTRACT+:} false; then : + $as_echo_n "(cached) " >&6 +else + case $INTLTOOL_EXTRACT in + [\\/]* | ?:[\\/]*) + ac_cv_path_INTLTOOL_EXTRACT="$INTLTOOL_EXTRACT" # Let the user override the test with a path. + ;; + *) + as_save_IFS=$IFS; IFS=$PATH_SEPARATOR +for as_dir in $PATH +do + IFS=$as_save_IFS + test -z "$as_dir" && as_dir=. + for ac_exec_ext in '' $ac_executable_extensions; do + if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then + ac_cv_path_INTLTOOL_EXTRACT="$as_dir/$ac_word$ac_exec_ext" + $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 + break 2 + fi +done + done +IFS=$as_save_IFS + + ;; +esac +fi +INTLTOOL_EXTRACT=$ac_cv_path_INTLTOOL_EXTRACT +if test -n "$INTLTOOL_EXTRACT"; then + { $as_echo "$as_me:${as_lineno-$LINENO}: result: $INTLTOOL_EXTRACT" >&5 +$as_echo "$INTLTOOL_EXTRACT" >&6; } +else + { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 +$as_echo "no" >&6; } +fi + + +if test -z "$INTLTOOL_UPDATE" -o -z "$INTLTOOL_MERGE" -o -z "$INTLTOOL_EXTRACT"; then + as_fn_error $? "The intltool scripts were not found. Please install intltool." "$LINENO" 5 +fi + +if test -z "$AM_DEFAULT_VERBOSITY"; then + AM_DEFAULT_VERBOSITY=1 +fi + + +INTLTOOL_V_MERGE='$(INTLTOOL__v_MERGE_$(V))' +INTLTOOL__v_MERGE_='$(INTLTOOL__v_MERGE_$(AM_DEFAULT_VERBOSITY))' +INTLTOOL__v_MERGE_0='@echo " ITMRG " $@;' + + + + +INTLTOOL_V_MERGE_OPTIONS='$(intltool__v_merge_options_$(V))' +intltool__v_merge_options_='$(intltool__v_merge_options_$(AM_DEFAULT_VERBOSITY))' +intltool__v_merge_options_0='-q' + + + + + INTLTOOL_DESKTOP_RULE='%.desktop: %.desktop.in $(INTLTOOL_MERGE) $(wildcard $(top_srcdir)/po/*.po) ; $(INTLTOOL_V_MERGE)LC_ALL=C $(INTLTOOL_MERGE) $(INTLTOOL_V_MERGE_OPTIONS) -d -u -c $(top_builddir)/po/.intltool-merge-cache $(top_srcdir)/po $< $@' +INTLTOOL_DIRECTORY_RULE='%.directory: %.directory.in $(INTLTOOL_MERGE) $(wildcard $(top_srcdir)/po/*.po) ; $(INTLTOOL_V_MERGE)LC_ALL=C $(INTLTOOL_MERGE) $(INTLTOOL_V_MERGE_OPTIONS) -d -u -c $(top_builddir)/po/.intltool-merge-cache $(top_srcdir)/po $< $@' + INTLTOOL_KEYS_RULE='%.keys: %.keys.in $(INTLTOOL_MERGE) $(wildcard $(top_srcdir)/po/*.po) ; $(INTLTOOL_V_MERGE)LC_ALL=C $(INTLTOOL_MERGE) $(INTLTOOL_V_MERGE_OPTIONS) -k -u -c $(top_builddir)/po/.intltool-merge-cache $(top_srcdir)/po $< $@' + INTLTOOL_PROP_RULE='%.prop: %.prop.in $(INTLTOOL_MERGE) $(wildcard $(top_srcdir)/po/*.po) ; $(INTLTOOL_V_MERGE)LC_ALL=C $(INTLTOOL_MERGE) $(INTLTOOL_V_MERGE_OPTIONS) -d -u -c $(top_builddir)/po/.intltool-merge-cache $(top_srcdir)/po $< $@' + INTLTOOL_OAF_RULE='%.oaf: %.oaf.in $(INTLTOOL_MERGE) $(wildcard $(top_srcdir)/po/*.po) ; $(INTLTOOL_V_MERGE)LC_ALL=C $(INTLTOOL_MERGE) $(INTLTOOL_V_MERGE_OPTIONS) -o -p $(top_srcdir)/po $< $@' + INTLTOOL_PONG_RULE='%.pong: %.pong.in $(INTLTOOL_MERGE) $(wildcard $(top_srcdir)/po/*.po) ; $(INTLTOOL_V_MERGE)LC_ALL=C $(INTLTOOL_MERGE) $(INTLTOOL_V_MERGE_OPTIONS) -x -u -c $(top_builddir)/po/.intltool-merge-cache $(top_srcdir)/po $< $@' + INTLTOOL_SERVER_RULE='%.server: %.server.in $(INTLTOOL_MERGE) $(wildcard $(top_srcdir)/po/*.po) ; $(INTLTOOL_V_MERGE)LC_ALL=C $(INTLTOOL_MERGE) $(INTLTOOL_V_MERGE_OPTIONS) -o -u -c $(top_builddir)/po/.intltool-merge-cache $(top_srcdir)/po $< $@' + INTLTOOL_SHEET_RULE='%.sheet: %.sheet.in $(INTLTOOL_MERGE) $(wildcard $(top_srcdir)/po/*.po) ; $(INTLTOOL_V_MERGE)LC_ALL=C $(INTLTOOL_MERGE) $(INTLTOOL_V_MERGE_OPTIONS) -x -u -c $(top_builddir)/po/.intltool-merge-cache $(top_srcdir)/po $< $@' +INTLTOOL_SOUNDLIST_RULE='%.soundlist: %.soundlist.in $(INTLTOOL_MERGE) $(wildcard $(top_srcdir)/po/*.po) ; $(INTLTOOL_V_MERGE)LC_ALL=C $(INTLTOOL_MERGE) $(INTLTOOL_V_MERGE_OPTIONS) -d -u -c $(top_builddir)/po/.intltool-merge-cache $(top_srcdir)/po $< $@' + INTLTOOL_UI_RULE='%.ui: %.ui.in $(INTLTOOL_MERGE) $(wildcard $(top_srcdir)/po/*.po) ; $(INTLTOOL_V_MERGE)LC_ALL=C $(INTLTOOL_MERGE) $(INTLTOOL_V_MERGE_OPTIONS) -x -u -c $(top_builddir)/po/.intltool-merge-cache $(top_srcdir)/po $< $@' + INTLTOOL_XML_RULE='%.xml: %.xml.in $(INTLTOOL_MERGE) $(wildcard $(top_srcdir)/po/*.po) ; $(INTLTOOL_V_MERGE)LC_ALL=C $(INTLTOOL_MERGE) $(INTLTOOL_V_MERGE_OPTIONS) -x -u -c $(top_builddir)/po/.intltool-merge-cache $(top_srcdir)/po $< $@' +if test "$INTLTOOL_APPLIED_VERSION_AS_INT" -ge 5000; then + INTLTOOL_XML_NOMERGE_RULE='%.xml: %.xml.in $(INTLTOOL_MERGE) ; $(INTLTOOL_V_MERGE)LC_ALL=C $(INTLTOOL_MERGE) $(INTLTOOL_V_MERGE_OPTIONS) -x -u --no-translations $< $@' +else + INTLTOOL_XML_NOMERGE_RULE='%.xml: %.xml.in $(INTLTOOL_MERGE) ; $(INTLTOOL_V_MERGE)_it_tmp_dir=tmp.intltool.$$RANDOM && mkdir $$_it_tmp_dir && LC_ALL=C $(INTLTOOL_MERGE) $(INTLTOOL_V_MERGE_OPTIONS) -x -u $$_it_tmp_dir $< $@ && rmdir $$_it_tmp_dir' +fi + INTLTOOL_XAM_RULE='%.xam: %.xml.in $(INTLTOOL_MERGE) $(wildcard $(top_srcdir)/po/*.po) ; $(INTLTOOL_V_MERGE)LC_ALL=C $(INTLTOOL_MERGE) $(INTLTOOL_V_MERGE_OPTIONS) -x -u -c $(top_builddir)/po/.intltool-merge-cache $(top_srcdir)/po $< $@' + INTLTOOL_KBD_RULE='%.kbd: %.kbd.in $(INTLTOOL_MERGE) $(wildcard $(top_srcdir)/po/*.po) ; $(INTLTOOL_V_MERGE)LC_ALL=C $(INTLTOOL_MERGE) $(INTLTOOL_V_MERGE_OPTIONS) -x -u -m -c $(top_builddir)/po/.intltool-merge-cache $(top_srcdir)/po $< $@' + INTLTOOL_CAVES_RULE='%.caves: %.caves.in $(INTLTOOL_MERGE) $(wildcard $(top_srcdir)/po/*.po) ; $(INTLTOOL_V_MERGE)LC_ALL=C $(INTLTOOL_MERGE) $(INTLTOOL_V_MERGE_OPTIONS) -d -u -c $(top_builddir)/po/.intltool-merge-cache $(top_srcdir)/po $< $@' + INTLTOOL_SCHEMAS_RULE='%.schemas: %.schemas.in $(INTLTOOL_MERGE) $(wildcard $(top_srcdir)/po/*.po) ; $(INTLTOOL_V_MERGE)LC_ALL=C $(INTLTOOL_MERGE) $(INTLTOOL_V_MERGE_OPTIONS) -s -u -c $(top_builddir)/po/.intltool-merge-cache $(top_srcdir)/po $< $@' + INTLTOOL_THEME_RULE='%.theme: %.theme.in $(INTLTOOL_MERGE) $(wildcard $(top_srcdir)/po/*.po) ; $(INTLTOOL_V_MERGE)LC_ALL=C $(INTLTOOL_MERGE) $(INTLTOOL_V_MERGE_OPTIONS) -d -u -c $(top_builddir)/po/.intltool-merge-cache $(top_srcdir)/po $< $@' + INTLTOOL_SERVICE_RULE='%.service: %.service.in $(INTLTOOL_MERGE) $(wildcard $(top_srcdir)/po/*.po) ; $(INTLTOOL_V_MERGE)LC_ALL=C $(INTLTOOL_MERGE) $(INTLTOOL_V_MERGE_OPTIONS) -d -u -c $(top_builddir)/po/.intltool-merge-cache $(top_srcdir)/po $< $@' + INTLTOOL_POLICY_RULE='%.policy: %.policy.in $(INTLTOOL_MERGE) $(wildcard $(top_srcdir)/po/*.po) ; $(INTLTOOL_V_MERGE)LC_ALL=C $(INTLTOOL_MERGE) $(INTLTOOL_V_MERGE_OPTIONS) -x -u -c $(top_builddir)/po/.intltool-merge-cache $(top_srcdir)/po $< $@' + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +# Check the gettext tools to make sure they are GNU +# Extract the first word of "xgettext", so it can be a program name with args. +set dummy xgettext; ac_word=$2 +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 +$as_echo_n "checking for $ac_word... " >&6; } +if ${ac_cv_path_XGETTEXT+:} false; then : + $as_echo_n "(cached) " >&6 +else + case $XGETTEXT in + [\\/]* | ?:[\\/]*) + ac_cv_path_XGETTEXT="$XGETTEXT" # Let the user override the test with a path. + ;; + *) + as_save_IFS=$IFS; IFS=$PATH_SEPARATOR +for as_dir in $PATH +do + IFS=$as_save_IFS + test -z "$as_dir" && as_dir=. + for ac_exec_ext in '' $ac_executable_extensions; do + if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then + ac_cv_path_XGETTEXT="$as_dir/$ac_word$ac_exec_ext" + $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 + break 2 + fi +done + done +IFS=$as_save_IFS + + ;; +esac +fi +XGETTEXT=$ac_cv_path_XGETTEXT +if test -n "$XGETTEXT"; then + { $as_echo "$as_me:${as_lineno-$LINENO}: result: $XGETTEXT" >&5 +$as_echo "$XGETTEXT" >&6; } +else + { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 +$as_echo "no" >&6; } +fi + + +# Extract the first word of "msgmerge", so it can be a program name with args. +set dummy msgmerge; ac_word=$2 +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 +$as_echo_n "checking for $ac_word... " >&6; } +if ${ac_cv_path_MSGMERGE+:} false; then : + $as_echo_n "(cached) " >&6 +else + case $MSGMERGE in + [\\/]* | ?:[\\/]*) + ac_cv_path_MSGMERGE="$MSGMERGE" # Let the user override the test with a path. + ;; + *) + as_save_IFS=$IFS; IFS=$PATH_SEPARATOR +for as_dir in $PATH +do + IFS=$as_save_IFS + test -z "$as_dir" && as_dir=. + for ac_exec_ext in '' $ac_executable_extensions; do + if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then + ac_cv_path_MSGMERGE="$as_dir/$ac_word$ac_exec_ext" + $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 + break 2 + fi +done + done +IFS=$as_save_IFS + + ;; +esac +fi +MSGMERGE=$ac_cv_path_MSGMERGE +if test -n "$MSGMERGE"; then + { $as_echo "$as_me:${as_lineno-$LINENO}: result: $MSGMERGE" >&5 +$as_echo "$MSGMERGE" >&6; } +else + { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 +$as_echo "no" >&6; } +fi + + +# Extract the first word of "msgfmt", so it can be a program name with args. +set dummy msgfmt; ac_word=$2 +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 +$as_echo_n "checking for $ac_word... " >&6; } +if ${ac_cv_path_MSGFMT+:} false; then : + $as_echo_n "(cached) " >&6 +else + case $MSGFMT in + [\\/]* | ?:[\\/]*) + ac_cv_path_MSGFMT="$MSGFMT" # Let the user override the test with a path. + ;; + *) + as_save_IFS=$IFS; IFS=$PATH_SEPARATOR +for as_dir in $PATH +do + IFS=$as_save_IFS + test -z "$as_dir" && as_dir=. + for ac_exec_ext in '' $ac_executable_extensions; do + if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then + ac_cv_path_MSGFMT="$as_dir/$ac_word$ac_exec_ext" + $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 + break 2 + fi +done + done +IFS=$as_save_IFS + + ;; +esac +fi +MSGFMT=$ac_cv_path_MSGFMT +if test -n "$MSGFMT"; then + { $as_echo "$as_me:${as_lineno-$LINENO}: result: $MSGFMT" >&5 +$as_echo "$MSGFMT" >&6; } +else + { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 +$as_echo "no" >&6; } +fi + + +# Extract the first word of "gmsgfmt", so it can be a program name with args. +set dummy gmsgfmt; ac_word=$2 +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 +$as_echo_n "checking for $ac_word... " >&6; } +if ${ac_cv_path_GMSGFMT+:} false; then : + $as_echo_n "(cached) " >&6 +else + case $GMSGFMT in + [\\/]* | ?:[\\/]*) + ac_cv_path_GMSGFMT="$GMSGFMT" # Let the user override the test with a path. + ;; + *) + as_save_IFS=$IFS; IFS=$PATH_SEPARATOR +for as_dir in $PATH +do + IFS=$as_save_IFS + test -z "$as_dir" && as_dir=. + for ac_exec_ext in '' $ac_executable_extensions; do + if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then + ac_cv_path_GMSGFMT="$as_dir/$ac_word$ac_exec_ext" + $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 + break 2 + fi +done + done +IFS=$as_save_IFS + + test -z "$ac_cv_path_GMSGFMT" && ac_cv_path_GMSGFMT="$MSGFMT" + ;; +esac +fi +GMSGFMT=$ac_cv_path_GMSGFMT +if test -n "$GMSGFMT"; then + { $as_echo "$as_me:${as_lineno-$LINENO}: result: $GMSGFMT" >&5 +$as_echo "$GMSGFMT" >&6; } +else + { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 +$as_echo "no" >&6; } +fi + + +if test -z "$XGETTEXT" -o -z "$MSGMERGE" -o -z "$MSGFMT"; then + as_fn_error $? "GNU gettext tools not found; required for intltool" "$LINENO" 5 +fi +xgversion="`$XGETTEXT --version|grep '(GNU ' 2> /dev/null`" +mmversion="`$MSGMERGE --version|grep '(GNU ' 2> /dev/null`" +mfversion="`$MSGFMT --version|grep '(GNU ' 2> /dev/null`" +if test -z "$xgversion" -o -z "$mmversion" -o -z "$mfversion"; then + as_fn_error $? "GNU gettext tools not found; required for intltool" "$LINENO" 5 +fi + +# Extract the first word of "perl", so it can be a program name with args. +set dummy perl; ac_word=$2 +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 +$as_echo_n "checking for $ac_word... " >&6; } +if ${ac_cv_path_INTLTOOL_PERL+:} false; then : + $as_echo_n "(cached) " >&6 +else + case $INTLTOOL_PERL in + [\\/]* | ?:[\\/]*) + ac_cv_path_INTLTOOL_PERL="$INTLTOOL_PERL" # Let the user override the test with a path. + ;; + *) + as_save_IFS=$IFS; IFS=$PATH_SEPARATOR +for as_dir in $PATH +do + IFS=$as_save_IFS + test -z "$as_dir" && as_dir=. + for ac_exec_ext in '' $ac_executable_extensions; do + if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then + ac_cv_path_INTLTOOL_PERL="$as_dir/$ac_word$ac_exec_ext" + $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 + break 2 + fi +done + done +IFS=$as_save_IFS + + ;; +esac +fi +INTLTOOL_PERL=$ac_cv_path_INTLTOOL_PERL +if test -n "$INTLTOOL_PERL"; then + { $as_echo "$as_me:${as_lineno-$LINENO}: result: $INTLTOOL_PERL" >&5 +$as_echo "$INTLTOOL_PERL" >&6; } +else + { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 +$as_echo "no" >&6; } +fi + + +if test -z "$INTLTOOL_PERL"; then + as_fn_error $? "perl not found" "$LINENO" 5 +fi +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for perl >= 5.8.1" >&5 +$as_echo_n "checking for perl >= 5.8.1... " >&6; } +$INTLTOOL_PERL -e "use 5.8.1;" > /dev/null 2>&1 +if test $? -ne 0; then + as_fn_error $? "perl 5.8.1 is required for intltool" "$LINENO" 5 +else + IT_PERL_VERSION=`$INTLTOOL_PERL -e "printf '%vd', $^V"` + { $as_echo "$as_me:${as_lineno-$LINENO}: result: $IT_PERL_VERSION" >&5 +$as_echo "$IT_PERL_VERSION" >&6; } +fi +if test "x" != "xno-xml"; then + { $as_echo "$as_me:${as_lineno-$LINENO}: checking for XML::Parser" >&5 +$as_echo_n "checking for XML::Parser... " >&6; } + if `$INTLTOOL_PERL -e "require XML::Parser" 2>/dev/null`; then + { $as_echo "$as_me:${as_lineno-$LINENO}: result: ok" >&5 +$as_echo "ok" >&6; } + else + as_fn_error $? "XML::Parser perl module is required for intltool" "$LINENO" 5 + fi +fi + +# Substitute ALL_LINGUAS so we can use it in po/Makefile + + + + + + +CONFIG_STATUS_DEPENDENCIES='$(top_srcdir)/po/LINGUAS' + + +ACLOCAL_AMFLAGS="\${ACLOCAL_FLAGS}" + + +# Checks for header files. +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for ANSI C header files" >&5 +$as_echo_n "checking for ANSI C header files... " >&6; } +if ${ac_cv_header_stdc+:} false; then : + $as_echo_n "(cached) " >&6 +else + cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ +#include +#include +#include +#include + +int +main () +{ + + ; + return 0; +} +_ACEOF +if ac_fn_c_try_compile "$LINENO"; then : + ac_cv_header_stdc=yes +else + ac_cv_header_stdc=no +fi +rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext + +if test $ac_cv_header_stdc = yes; then + # SunOS 4.x string.h does not declare mem*, contrary to ANSI. + cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ +#include + +_ACEOF +if (eval "$ac_cpp conftest.$ac_ext") 2>&5 | + $EGREP "memchr" >/dev/null 2>&1; then : + +else + 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 confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ +#include + +_ACEOF +if (eval "$ac_cpp conftest.$ac_ext") 2>&5 | + $EGREP "free" >/dev/null 2>&1; then : + +else + 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 confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ +#include +#include +#if ((' ' & 0x0FF) == 0x020) +# define ISLOWER(c) ('a' <= (c) && (c) <= 'z') +# define TOUPPER(c) (ISLOWER(c) ? 'A' + ((c) - 'a') : (c)) +#else +# define ISLOWER(c) \ + (('a' <= (c) && (c) <= 'i') \ + || ('j' <= (c) && (c) <= 'r') \ + || ('s' <= (c) && (c) <= 'z')) +# define TOUPPER(c) (ISLOWER(c) ? ((c) | 0x40) : (c)) +#endif + +#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)) + return 2; + return 0; +} +_ACEOF +if ac_fn_c_try_run "$LINENO"; then : + +else + ac_cv_header_stdc=no +fi +rm -f core *.core core.conftest.* gmon.out bb.out conftest$ac_exeext \ + conftest.$ac_objext conftest.beam conftest.$ac_ext +fi + +fi +fi +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_header_stdc" >&5 +$as_echo "$ac_cv_header_stdc" >&6; } +if test $ac_cv_header_stdc = yes; then + +$as_echo "#define STDC_HEADERS 1" >>confdefs.h + +fi + +for ac_header in malloc.h stdlib.h string.h sys/param.h sys/types.h unistd.h math.h utime.h X11/Xlib.h +do : + as_ac_Header=`$as_echo "ac_cv_header_$ac_header" | $as_tr_sh` +ac_fn_c_check_header_mongrel "$LINENO" "$ac_header" "$as_ac_Header" "$ac_includes_default" +if eval test \"x\$"$as_ac_Header"\" = x"yes"; then : + cat >>confdefs.h <<_ACEOF +#define `$as_echo "HAVE_$ac_header" | $as_tr_cpp` 1 +_ACEOF + +fi + +done + + +# Checks for typedefs, structures, and compiler characteristics. +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for an ANSI C-conforming const" >&5 +$as_echo_n "checking for an ANSI C-conforming const... " >&6; } +if ${ac_cv_c_const+:} false; then : + $as_echo_n "(cached) " >&6 +else + cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ + +int +main () +{ + +#ifndef __cplusplus + /* Ultrix mips cc rejects this sort of thing. */ + typedef int charset[2]; + const charset cs = { 0, 0 }; + /* SunOS 4.1.1 cc rejects this. */ + char const *const *pcpcc; + char **ppc; + /* NEC SVR4.0.2 mips cc rejects this. */ + struct point {int x, y;}; + static struct point const zero = {0,0}; + /* AIX XL C 1.02.0.0 rejects this. + It does not let you subtract one const X* pointer from another in + an arm of an if-expression whose if-part is not a constant + expression */ + const char *g = "string"; + pcpcc = &g + (g ? g-g : 0); + /* HPUX 7.0 cc rejects these. */ + ++pcpcc; + ppc = (char**) pcpcc; + pcpcc = (char const *const *) ppc; + { /* SCO 3.2v4 cc rejects this sort of thing. */ + char tx; + char *t = &tx; + char const *s = 0 ? (char *) 0 : (char const *) 0; + + *t++ = 0; + if (s) return 0; + } + { /* Someone thinks the Sun supposedly-ANSI compiler will reject this. */ + int x[] = {25, 17}; + const int *foo = &x[0]; + ++foo; + } + { /* Sun SC1.0 ANSI compiler rejects this -- but not the above. */ + typedef const int *iptr; + iptr p = 0; + ++p; + } + { /* AIX XL C 1.02.0.0 rejects this sort of thing, saying + "k.c", line 2.27: 1506-025 (S) Operand must be a modifiable lvalue. */ + struct s { int j; const int *ap[3]; } bx; + struct s *b = &bx; b->j = 5; + } + { /* ULTRIX-32 V3.1 (Rev 9) vcc rejects this */ + const int foo = 10; + if (!foo) return 0; + } + return !cs[0] && !zero.x; +#endif + + ; + return 0; +} +_ACEOF +if ac_fn_c_try_compile "$LINENO"; then : + ac_cv_c_const=yes +else + ac_cv_c_const=no +fi +rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext +fi +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_c_const" >&5 +$as_echo "$ac_cv_c_const" >&6; } +if test $ac_cv_c_const = no; then + +$as_echo "#define const /**/" >>confdefs.h + +fi + +ac_fn_c_check_type "$LINENO" "mode_t" "ac_cv_type_mode_t" "$ac_includes_default" +if test "x$ac_cv_type_mode_t" = xyes; then : + +else + +cat >>confdefs.h <<_ACEOF +#define mode_t int +_ACEOF + +fi + + +# Checks for library functions or symbols +for ac_func in floor memset mkdtemp pow realpath sqrt strcasecmp strchr strncasecmp strtol strtoul +do : + as_ac_var=`$as_echo "ac_cv_func_$ac_func" | $as_tr_sh` +ac_fn_c_check_func "$LINENO" "$ac_func" "$as_ac_var" +if eval test \"x\$"$as_ac_var"\" = x"yes"; then : + cat >>confdefs.h <<_ACEOF +#define `$as_echo "HAVE_$ac_func" | $as_tr_cpp` 1 +_ACEOF + +fi +done + +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for tan in -lm" >&5 +$as_echo_n "checking for tan in -lm... " >&6; } +if ${ac_cv_lib_m_tan+:} false; then : + $as_echo_n "(cached) " >&6 +else + ac_check_lib_save_LIBS=$LIBS +LIBS="-lm $LIBS" +cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ + +/* Override any GCC internal prototype to avoid an error. + Use char because int might match the return type of a GCC + builtin and then its argument prototype would still apply. */ +#ifdef __cplusplus +extern "C" +#endif +char tan (); +int +main () +{ +return tan (); + ; + return 0; +} +_ACEOF +if ac_fn_c_try_link "$LINENO"; then : + ac_cv_lib_m_tan=yes +else + ac_cv_lib_m_tan=no +fi +rm -f core conftest.err conftest.$ac_objext \ + conftest$ac_exeext conftest.$ac_ext +LIBS=$ac_check_lib_save_LIBS +fi +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_lib_m_tan" >&5 +$as_echo "$ac_cv_lib_m_tan" >&6; } +if test "x$ac_cv_lib_m_tan" = xyes; then : + cat >>confdefs.h <<_ACEOF +#define HAVE_LIBM 1 +_ACEOF + + LIBS="-lm $LIBS" + +fi + +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for inflate in -lz" >&5 +$as_echo_n "checking for inflate in -lz... " >&6; } +if ${ac_cv_lib_z_inflate+:} false; then : + $as_echo_n "(cached) " >&6 +else + ac_check_lib_save_LIBS=$LIBS +LIBS="-lz $LIBS" +cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ + +/* Override any GCC internal prototype to avoid an error. + Use char because int might match the return type of a GCC + builtin and then its argument prototype would still apply. */ +#ifdef __cplusplus +extern "C" +#endif +char inflate (); +int +main () +{ +return inflate (); + ; + return 0; +} +_ACEOF +if ac_fn_c_try_link "$LINENO"; then : + ac_cv_lib_z_inflate=yes +else + ac_cv_lib_z_inflate=no +fi +rm -f core conftest.err conftest.$ac_objext \ + conftest$ac_exeext conftest.$ac_ext +LIBS=$ac_check_lib_save_LIBS +fi +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_lib_z_inflate" >&5 +$as_echo "$ac_cv_lib_z_inflate" >&6; } +if test "x$ac_cv_lib_z_inflate" = xyes; then : + cat >>confdefs.h <<_ACEOF +#define HAVE_LIBZ 1 +_ACEOF + + LIBS="-lz $LIBS" + +fi + +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for XSetErrorHandler in -lX11" >&5 +$as_echo_n "checking for XSetErrorHandler in -lX11... " >&6; } +if ${ac_cv_lib_X11_XSetErrorHandler+:} false; then : + $as_echo_n "(cached) " >&6 +else + ac_check_lib_save_LIBS=$LIBS +LIBS="-lX11 $LIBS" +cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ + +/* Override any GCC internal prototype to avoid an error. + Use char because int might match the return type of a GCC + builtin and then its argument prototype would still apply. */ +#ifdef __cplusplus +extern "C" +#endif +char XSetErrorHandler (); +int +main () +{ +return XSetErrorHandler (); + ; + return 0; +} +_ACEOF +if ac_fn_c_try_link "$LINENO"; then : + ac_cv_lib_X11_XSetErrorHandler=yes +else + ac_cv_lib_X11_XSetErrorHandler=no +fi +rm -f core conftest.err conftest.$ac_objext \ + conftest$ac_exeext conftest.$ac_ext +LIBS=$ac_check_lib_save_LIBS +fi +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_lib_X11_XSetErrorHandler" >&5 +$as_echo "$ac_cv_lib_X11_XSetErrorHandler" >&6; } +if test "x$ac_cv_lib_X11_XSetErrorHandler" = xyes; then : + cat >>confdefs.h <<_ACEOF +#define HAVE_LIBX11 1 +_ACEOF + + LIBS="-lX11 $LIBS" + +fi + + +# ATM not running automake under Windows +#AC_CHECK_PROG(USE_WINDOWS, cmd.exe, yes, no) +#AM_CONDITIONAL([WINDOWS], [test x$USE_WINDOWS = xyes]) +# So pass in as an option instead +# This is only to perform slightly different build steps +# (the code uses standard WINDOWS defines for any specific different behaviour) +# Check whether --enable-windows was given. +if test "${enable_windows+set}" = set; then : + enableval=$enable_windows; ac_cv_enable_windows=$enableval +else + ac_cv_enable_windows=no +fi + +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking whether to enable Windows build steps" >&5 +$as_echo_n "checking whether to enable Windows build steps... " >&6; } +if ${ac_cv_enable_windows+:} false; then : + $as_echo_n "(cached) " >&6 +else + ac_cv_enable_windows=no +fi +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_enable_windows" >&5 +$as_echo "$ac_cv_enable_windows" >&6; } + if test x$ac_cv_enable_windows = xyes; then + WINDOWS_TRUE= + WINDOWS_FALSE='#' +else + WINDOWS_TRUE='#' + WINDOWS_FALSE= +fi + + +# Expat + +# Check whether --with-expat was given. +if test "${with_expat+set}" = set; then : + withval=$with_expat; +else + with_expat=yes +fi + + + if test $with_expat != no; then + EXPAT_INSTALLED_TRUE= + EXPAT_INSTALLED_FALSE='#' +else + EXPAT_INSTALLED_TRUE='#' + EXPAT_INSTALLED_FALSE= +fi + + + EXPAT_CFLAGS= + EXPAT_LIBS= + if test $with_expat != no; then + if test $with_expat != yes; then + EXPAT_CFLAGS="-I$with_expat/include" + EXPAT_LIBS="-L$with_expat/lib" + fi + { $as_echo "$as_me:${as_lineno-$LINENO}: checking for XML_ParserCreate in -lexpat" >&5 +$as_echo_n "checking for XML_ParserCreate in -lexpat... " >&6; } +if ${ac_cv_lib_expat_XML_ParserCreate+:} false; then : + $as_echo_n "(cached) " >&6 +else + ac_check_lib_save_LIBS=$LIBS +LIBS="-lexpat "$EXPAT_LIBS" $LIBS" +cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ + +/* Override any GCC internal prototype to avoid an error. + Use char because int might match the return type of a GCC + builtin and then its argument prototype would still apply. */ +#ifdef __cplusplus +extern "C" +#endif +char XML_ParserCreate (); +int +main () +{ +return XML_ParserCreate (); + ; + return 0; +} +_ACEOF +if ac_fn_c_try_link "$LINENO"; then : + ac_cv_lib_expat_XML_ParserCreate=yes +else + ac_cv_lib_expat_XML_ParserCreate=no +fi +rm -f core conftest.err conftest.$ac_objext \ + conftest$ac_exeext conftest.$ac_ext +LIBS=$ac_check_lib_save_LIBS +fi +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_lib_expat_XML_ParserCreate" >&5 +$as_echo "$ac_cv_lib_expat_XML_ParserCreate" >&6; } +if test "x$ac_cv_lib_expat_XML_ParserCreate" = xyes; then : + EXPAT_LIBS="$EXPAT_LIBS -lexpat" + expat_found=yes +else + expat_found=no +fi + + if test $expat_found = no; then + as_fn_error $? "Could not find the Expat library" "$LINENO" 5 + fi + expat_save_CFLAGS="$CFLAGS" + CFLAGS="$CFLAGS $EXPAT_CFLAGS" + for ac_header in expat.h +do : + ac_fn_c_check_header_mongrel "$LINENO" "expat.h" "ac_cv_header_expat_h" "$ac_includes_default" +if test "x$ac_cv_header_expat_h" = xyes; then : + cat >>confdefs.h <<_ACEOF +#define HAVE_EXPAT_H 1 +_ACEOF + +else + expat_found=no +fi + +done + + if test $expat_found = no; then + as_fn_error $? "Could not find expat.h" "$LINENO" 5 + fi + CFLAGS="$expat_save_CFLAGS" + fi + + + + + +# Curl + + + + + + + + + + + + + + + + + + + + + +# Check whether --with-libcurl was given. +if test "${with_libcurl+set}" = set; then : + withval=$with_libcurl; _libcurl_with=$withval +else + _libcurl_with=yes +fi + + + if test "$_libcurl_with" != "no" ; then + + for ac_prog in gawk mawk nawk awk +do + # Extract the first word of "$ac_prog", so it can be a program name with args. +set dummy $ac_prog; ac_word=$2 +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 +$as_echo_n "checking for $ac_word... " >&6; } +if ${ac_cv_prog_AWK+:} false; then : + $as_echo_n "(cached) " >&6 +else + if test -n "$AWK"; then + ac_cv_prog_AWK="$AWK" # Let the user override the test. +else +as_save_IFS=$IFS; IFS=$PATH_SEPARATOR +for as_dir in $PATH +do + IFS=$as_save_IFS + test -z "$as_dir" && as_dir=. + for ac_exec_ext in '' $ac_executable_extensions; do + if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then + ac_cv_prog_AWK="$ac_prog" + $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 + break 2 + fi +done + done +IFS=$as_save_IFS + +fi +fi +AWK=$ac_cv_prog_AWK +if test -n "$AWK"; then + { $as_echo "$as_me:${as_lineno-$LINENO}: result: $AWK" >&5 +$as_echo "$AWK" >&6; } +else + { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 +$as_echo "no" >&6; } +fi + + + test -n "$AWK" && break +done + + + _libcurl_version_parse="eval $AWK '{split(\$NF,A,\".\"); X=256*256*A[1]+256*A[2]+A[3]; print X;}'" + + _libcurl_try_link=yes + + if test -d "$_libcurl_with" ; then + LIBCURL_CPPFLAGS="-I$withval/include" + _libcurl_ldflags="-L$withval/lib" + # Extract the first word of ""$withval/bin/curl-config"", so it can be a program name with args. +set dummy "$withval/bin/curl-config"; ac_word=$2 +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 +$as_echo_n "checking for $ac_word... " >&6; } +if ${ac_cv_path__libcurl_config+:} false; then : + $as_echo_n "(cached) " >&6 +else + case $_libcurl_config in + [\\/]* | ?:[\\/]*) + ac_cv_path__libcurl_config="$_libcurl_config" # Let the user override the test with a path. + ;; + *) + as_save_IFS=$IFS; IFS=$PATH_SEPARATOR +for as_dir in $PATH +do + IFS=$as_save_IFS + test -z "$as_dir" && as_dir=. + for ac_exec_ext in '' $ac_executable_extensions; do + if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then + ac_cv_path__libcurl_config="$as_dir/$ac_word$ac_exec_ext" + $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 + break 2 + fi +done + done +IFS=$as_save_IFS + + ;; +esac +fi +_libcurl_config=$ac_cv_path__libcurl_config +if test -n "$_libcurl_config"; then + { $as_echo "$as_me:${as_lineno-$LINENO}: result: $_libcurl_config" >&5 +$as_echo "$_libcurl_config" >&6; } +else + { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 +$as_echo "no" >&6; } +fi + + + else + # Extract the first word of "curl-config", so it can be a program name with args. +set dummy curl-config; ac_word=$2 +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 +$as_echo_n "checking for $ac_word... " >&6; } +if ${ac_cv_path__libcurl_config+:} false; then : + $as_echo_n "(cached) " >&6 +else + case $_libcurl_config in + [\\/]* | ?:[\\/]*) + ac_cv_path__libcurl_config="$_libcurl_config" # Let the user override the test with a path. + ;; + *) + as_save_IFS=$IFS; IFS=$PATH_SEPARATOR +for as_dir in $PATH +do + IFS=$as_save_IFS + test -z "$as_dir" && as_dir=. + for ac_exec_ext in '' $ac_executable_extensions; do + if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then + ac_cv_path__libcurl_config="$as_dir/$ac_word$ac_exec_ext" + $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 + break 2 + fi +done + done +IFS=$as_save_IFS + + ;; +esac +fi +_libcurl_config=$ac_cv_path__libcurl_config +if test -n "$_libcurl_config"; then + { $as_echo "$as_me:${as_lineno-$LINENO}: result: $_libcurl_config" >&5 +$as_echo "$_libcurl_config" >&6; } +else + { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 +$as_echo "no" >&6; } +fi + + + fi + + if test x$_libcurl_config != "x" ; then + { $as_echo "$as_me:${as_lineno-$LINENO}: checking for the version of libcurl" >&5 +$as_echo_n "checking for the version of libcurl... " >&6; } +if ${libcurl_cv_lib_curl_version+:} false; then : + $as_echo_n "(cached) " >&6 +else + libcurl_cv_lib_curl_version=`$_libcurl_config --version | $AWK '{print $2}'` +fi +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $libcurl_cv_lib_curl_version" >&5 +$as_echo "$libcurl_cv_lib_curl_version" >&6; } + + _libcurl_version=`echo $libcurl_cv_lib_curl_version | $_libcurl_version_parse` + _libcurl_wanted=`echo 0 | $_libcurl_version_parse` + + if test $_libcurl_wanted -gt 0 ; then + { $as_echo "$as_me:${as_lineno-$LINENO}: checking for libcurl >= version " >&5 +$as_echo_n "checking for libcurl >= version ... " >&6; } +if ${libcurl_cv_lib_version_ok+:} false; then : + $as_echo_n "(cached) " >&6 +else + + if test $_libcurl_version -ge $_libcurl_wanted ; then + libcurl_cv_lib_version_ok=yes + else + libcurl_cv_lib_version_ok=no + fi + +fi +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $libcurl_cv_lib_version_ok" >&5 +$as_echo "$libcurl_cv_lib_version_ok" >&6; } + fi + + if test $_libcurl_wanted -eq 0 || test x$libcurl_cv_lib_version_ok = xyes ; then + if test x"$LIBCURL_CPPFLAGS" = "x" ; then + LIBCURL_CPPFLAGS=`$_libcurl_config --cflags` + fi + if test x"$LIBCURL" = "x" ; then + LIBCURL=`$_libcurl_config --libs` + + # This is so silly, but Apple actually has a bug in their + # curl-config script. Fixed in Tiger, but there are still + # lots of Panther installs around. + case "${host}" in + powerpc-apple-darwin7*) + LIBCURL=`echo $LIBCURL | sed -e 's|-arch i386||g'` + ;; + esac + fi + + # All curl-config scripts support --feature + _libcurl_features=`$_libcurl_config --feature` + + # Is it modern enough to have --protocols? (7.12.4) + if test $_libcurl_version -ge 461828 ; then + _libcurl_protocols=`$_libcurl_config --protocols` + fi + else + _libcurl_try_link=no + fi + + unset _libcurl_wanted + fi + + if test $_libcurl_try_link = yes ; then + + # we didn't find curl-config, so let's see if the user-supplied + # link line (or failing that, "-lcurl") is enough. + LIBCURL=${LIBCURL-"$_libcurl_ldflags -lcurl"} + + { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether libcurl is usable" >&5 +$as_echo_n "checking whether libcurl is usable... " >&6; } +if ${libcurl_cv_lib_curl_usable+:} false; then : + $as_echo_n "(cached) " >&6 +else + + _libcurl_save_cppflags=$CPPFLAGS + CPPFLAGS="$LIBCURL_CPPFLAGS $CPPFLAGS" + _libcurl_save_libs=$LIBS + LIBS="$LIBCURL $LIBS" + + cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ +#include +int +main () +{ + +/* Try and use a few common options to force a failure if we are + missing symbols or can't link. */ +int x; +curl_easy_setopt(NULL,CURLOPT_URL,NULL); +x=CURL_ERROR_SIZE; +x=CURLOPT_WRITEFUNCTION; +x=CURLOPT_FILE; +x=CURLOPT_ERRORBUFFER; +x=CURLOPT_STDERR; +x=CURLOPT_VERBOSE; + + ; + return 0; +} +_ACEOF +if ac_fn_c_try_link "$LINENO"; then : + libcurl_cv_lib_curl_usable=yes +else + libcurl_cv_lib_curl_usable=no +fi +rm -f core conftest.err conftest.$ac_objext \ + conftest$ac_exeext conftest.$ac_ext + + CPPFLAGS=$_libcurl_save_cppflags + LIBS=$_libcurl_save_libs + unset _libcurl_save_cppflags + unset _libcurl_save_libs + +fi +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $libcurl_cv_lib_curl_usable" >&5 +$as_echo "$libcurl_cv_lib_curl_usable" >&6; } + + if test $libcurl_cv_lib_curl_usable = yes ; then + + # Does curl_free() exist in this version of libcurl? + # If not, fake it with free() + + _libcurl_save_cppflags=$CPPFLAGS + CPPFLAGS="$CPPFLAGS $LIBCURL_CPPFLAGS" + _libcurl_save_libs=$LIBS + LIBS="$LIBS $LIBCURL" + + ac_fn_c_check_func "$LINENO" "curl_free" "ac_cv_func_curl_free" +if test "x$ac_cv_func_curl_free" = xyes; then : + +else + +$as_echo "#define curl_free free" >>confdefs.h + +fi + + + CPPFLAGS=$_libcurl_save_cppflags + LIBS=$_libcurl_save_libs + unset _libcurl_save_cppflags + unset _libcurl_save_libs + + +$as_echo "#define HAVE_LIBCURL 1" >>confdefs.h + + + + + for _libcurl_feature in $_libcurl_features ; do + cat >>confdefs.h <<_ACEOF +#define `$as_echo "libcurl_feature_$_libcurl_feature" | $as_tr_cpp` 1 +_ACEOF + + eval `$as_echo "libcurl_feature_$_libcurl_feature" | $as_tr_sh`=yes + done + + if test "x$_libcurl_protocols" = "x" ; then + + # We don't have --protocols, so just assume that all + # protocols are available + _libcurl_protocols="HTTP FTP FILE TELNET LDAP DICT" + + if test x$libcurl_feature_SSL = xyes ; then + _libcurl_protocols="$_libcurl_protocols HTTPS" + + # FTPS wasn't standards-compliant until version + # 7.11.0 + if test $_libcurl_version -ge 461568; then + _libcurl_protocols="$_libcurl_protocols FTPS" + fi + fi + fi + + for _libcurl_protocol in $_libcurl_protocols ; do + cat >>confdefs.h <<_ACEOF +#define `$as_echo "libcurl_protocol_$_libcurl_protocol" | $as_tr_cpp` 1 +_ACEOF + + eval `$as_echo "libcurl_protocol_$_libcurl_protocol" | $as_tr_sh`=yes + done + else + unset LIBCURL + unset LIBCURL_CPPFLAGS + fi + fi + + unset _libcurl_try_link + unset _libcurl_version_parse + unset _libcurl_config + unset _libcurl_feature + unset _libcurl_features + unset _libcurl_protocol + unset _libcurl_protocols + unset _libcurl_version + unset _libcurl_ldflags + fi + + if test x$_libcurl_with = xno || test x$libcurl_cv_lib_curl_usable != xyes ; then + # This is the IF-NO path + as_fn_error $? "libcurl is needed but not found" "$LINENO" 5 + else + # This is the IF-YES path + : + fi + + unset _libcurl_with + + +# gdk-pixbuf-csource +# Extract the first word of "gdk-pixbuf-csource", so it can be a program name with args. +set dummy gdk-pixbuf-csource; ac_word=$2 +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 +$as_echo_n "checking for $ac_word... " >&6; } +if ${ac_cv_prog_GDK_PIXBUF_CSOURCE+:} false; then : + $as_echo_n "(cached) " >&6 +else + if test -n "$GDK_PIXBUF_CSOURCE"; then + ac_cv_prog_GDK_PIXBUF_CSOURCE="$GDK_PIXBUF_CSOURCE" # Let the user override the test. +else +as_save_IFS=$IFS; IFS=$PATH_SEPARATOR +for as_dir in $PATH +do + IFS=$as_save_IFS + test -z "$as_dir" && as_dir=. + for ac_exec_ext in '' $ac_executable_extensions; do + if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then + ac_cv_prog_GDK_PIXBUF_CSOURCE="yes" + $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 + break 2 + fi +done + done +IFS=$as_save_IFS + +fi +fi +GDK_PIXBUF_CSOURCE=$ac_cv_prog_GDK_PIXBUF_CSOURCE +if test -n "$GDK_PIXBUF_CSOURCE"; then + { $as_echo "$as_me:${as_lineno-$LINENO}: result: $GDK_PIXBUF_CSOURCE" >&5 +$as_echo "$GDK_PIXBUF_CSOURCE" >&6; } +else + { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 +$as_echo "no" >&6; } +fi + + +if test "x$GDK_PIXBUF_CSOURCE" != "xyes" +then + as_fn_error $? "gdk-pixbuf-csource is needed but not found" "$LINENO" 5 +fi + + + +pkg_failed=no +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for PACKAGE" >&5 +$as_echo_n "checking for PACKAGE... " >&6; } + +if test -n "$PACKAGE_CFLAGS"; then + pkg_cv_PACKAGE_CFLAGS="$PACKAGE_CFLAGS" + elif test -n "$PKG_CONFIG"; then + if test -n "$PKG_CONFIG" && \ + { { $as_echo "$as_me:${as_lineno-$LINENO}: \$PKG_CONFIG --exists --print-errors \" + glib-2.0 >= 2.26 + gthread-2.0 >= 2.2 + gtk+-2.0 >= 2.16 + gio-2.0 >= 2.12 +\""; } >&5 + ($PKG_CONFIG --exists --print-errors " + glib-2.0 >= 2.26 + gthread-2.0 >= 2.2 + gtk+-2.0 >= 2.16 + gio-2.0 >= 2.12 +") 2>&5 + ac_status=$? + $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 + test $ac_status = 0; }; then + pkg_cv_PACKAGE_CFLAGS=`$PKG_CONFIG --cflags " + glib-2.0 >= 2.26 + gthread-2.0 >= 2.2 + gtk+-2.0 >= 2.16 + gio-2.0 >= 2.12 +" 2>/dev/null` + test "x$?" != "x0" && pkg_failed=yes +else + pkg_failed=yes +fi + else + pkg_failed=untried +fi +if test -n "$PACKAGE_LIBS"; then + pkg_cv_PACKAGE_LIBS="$PACKAGE_LIBS" + elif test -n "$PKG_CONFIG"; then + if test -n "$PKG_CONFIG" && \ + { { $as_echo "$as_me:${as_lineno-$LINENO}: \$PKG_CONFIG --exists --print-errors \" + glib-2.0 >= 2.26 + gthread-2.0 >= 2.2 + gtk+-2.0 >= 2.16 + gio-2.0 >= 2.12 +\""; } >&5 + ($PKG_CONFIG --exists --print-errors " + glib-2.0 >= 2.26 + gthread-2.0 >= 2.2 + gtk+-2.0 >= 2.16 + gio-2.0 >= 2.12 +") 2>&5 + ac_status=$? + $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 + test $ac_status = 0; }; then + pkg_cv_PACKAGE_LIBS=`$PKG_CONFIG --libs " + glib-2.0 >= 2.26 + gthread-2.0 >= 2.2 + gtk+-2.0 >= 2.16 + gio-2.0 >= 2.12 +" 2>/dev/null` + test "x$?" != "x0" && pkg_failed=yes +else + pkg_failed=yes +fi + else + pkg_failed=untried +fi + + + +if test $pkg_failed = yes; then + { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 +$as_echo "no" >&6; } + +if $PKG_CONFIG --atleast-pkgconfig-version 0.20; then + _pkg_short_errors_supported=yes +else + _pkg_short_errors_supported=no +fi + if test $_pkg_short_errors_supported = yes; then + PACKAGE_PKG_ERRORS=`$PKG_CONFIG --short-errors --print-errors --cflags --libs " + glib-2.0 >= 2.26 + gthread-2.0 >= 2.2 + gtk+-2.0 >= 2.16 + gio-2.0 >= 2.12 +" 2>&1` + else + PACKAGE_PKG_ERRORS=`$PKG_CONFIG --print-errors --cflags --libs " + glib-2.0 >= 2.26 + gthread-2.0 >= 2.2 + gtk+-2.0 >= 2.16 + gio-2.0 >= 2.12 +" 2>&1` + fi + # Put the nasty error message in config.log where it belongs + echo "$PACKAGE_PKG_ERRORS" >&5 + + as_fn_error $? "Package requirements ( + glib-2.0 >= 2.26 + gthread-2.0 >= 2.2 + gtk+-2.0 >= 2.16 + gio-2.0 >= 2.12 +) were not met: + +$PACKAGE_PKG_ERRORS + +Consider adjusting the PKG_CONFIG_PATH environment variable if you +installed software in a non-standard prefix. + +Alternatively, you may set the environment variables PACKAGE_CFLAGS +and PACKAGE_LIBS to avoid the need to call pkg-config. +See the pkg-config man page for more details." "$LINENO" 5 +elif test $pkg_failed = untried; then + { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 +$as_echo "no" >&6; } + { { $as_echo "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5 +$as_echo "$as_me: error: in \`$ac_pwd':" >&2;} +as_fn_error $? "The pkg-config script could not be found or is too old. Make sure it +is in your PATH or set the PKG_CONFIG environment variable to the full +path to pkg-config. + +Alternatively, you may set the environment variables PACKAGE_CFLAGS +and PACKAGE_LIBS to avoid the need to call pkg-config. +See the pkg-config man page for more details. + +To get pkg-config, see . +See \`config.log' for more details" "$LINENO" 5; } +else + PACKAGE_CFLAGS=$pkg_cv_PACKAGE_CFLAGS + PACKAGE_LIBS=$pkg_cv_PACKAGE_LIBS + { $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5 +$as_echo "yes" >&6; } + +fi + + + + +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking whether ln -s works" >&5 +$as_echo_n "checking whether ln -s works... " >&6; } +LN_S=$as_ln_s +if test "$LN_S" = "ln -s"; then + { $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5 +$as_echo "yes" >&6; } +else + { $as_echo "$as_me:${as_lineno-$LINENO}: result: no, using $LN_S" >&5 +$as_echo "no, using $LN_S" >&6; } +fi + + +if test -z "$AM_DEFAULT_VERBOSITY"; then + AM_DEFAULT_VERBOSITY=1 +fi + + +gdu_cv_version_required=0.3.2 + +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking gnome-doc-utils >= $gdu_cv_version_required" >&5 +$as_echo_n "checking gnome-doc-utils >= $gdu_cv_version_required... " >&6; } +if test -n "$PKG_CONFIG" && \ + { { $as_echo "$as_me:${as_lineno-$LINENO}: \$PKG_CONFIG --exists --print-errors \"gnome-doc-utils >= \$gdu_cv_version_required\""; } >&5 + ($PKG_CONFIG --exists --print-errors "gnome-doc-utils >= $gdu_cv_version_required") 2>&5 + ac_status=$? + $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 + test $ac_status = 0; }; then + gdu_cv_have_gdu=yes +else + gdu_cv_have_gdu=no +fi + +if test "$gdu_cv_have_gdu" = "yes"; then + { $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5 +$as_echo "yes" >&6; } + : +else + { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 +$as_echo "no" >&6; } + as_fn_error $? "gnome-doc-utils >= $gdu_cv_version_required not found" "$LINENO" 5 +fi + + + +# Check whether --with-help-dir was given. +if test "${with_help_dir+set}" = set; then : + withval=$with_help_dir; +else + with_help_dir='${datadir}/gnome/help' +fi + +HELP_DIR="$with_help_dir" + + + +# Check whether --with-omf-dir was given. +if test "${with_omf_dir+set}" = set; then : + withval=$with_omf_dir; +else + with_omf_dir='${datadir}/omf' +fi + +OMF_DIR="$with_omf_dir" + + + +# Check whether --with-help-formats was given. +if test "${with_help_formats+set}" = set; then : + withval=$with_help_formats; +else + with_help_formats='' +fi + +DOC_USER_FORMATS="$with_help_formats" + + +# Check whether --enable-scrollkeeper was given. +if test "${enable_scrollkeeper+set}" = set; then : + enableval=$enable_scrollkeeper; +else + enable_scrollkeeper=yes +fi + + if test "$gdu_cv_have_gdu" = "yes" -a "$enable_scrollkeeper" = "yes"; then + ENABLE_SK_TRUE= + ENABLE_SK_FALSE='#' +else + ENABLE_SK_TRUE='#' + ENABLE_SK_FALSE= +fi + + +DISTCHECK_CONFIGURE_FLAGS="--disable-scrollkeeper $DISTCHECK_CONFIGURE_FLAGS" + + + if test "$gdu_cv_have_gdu" = "yes"; then + HAVE_GNOME_DOC_UTILS_TRUE= + HAVE_GNOME_DOC_UTILS_FALSE='#' +else + HAVE_GNOME_DOC_UTILS_TRUE='#' + HAVE_GNOME_DOC_UTILS_FALSE= +fi + + + + + +# Check whether --enable-deprecations was given. +if test "${enable_deprecations+set}" = set; then : + enableval=$enable_deprecations; ac_cv_enable_deprecations=$enableval +else + ac_cv_enable_deprecations=no +fi + +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking whether to enable deprecated features" >&5 +$as_echo_n "checking whether to enable deprecated features... " >&6; } +if ${ac_cv_enable_deprecations+:} false; then : + $as_echo_n "(cached) " >&6 +else + ac_cv_enable_deprecations=no +fi +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_enable_deprecations" >&5 +$as_echo "$ac_cv_enable_deprecations" >&6; } + +if test "x$ac_cv_enable_deprecations" = "xyes"; then + DISABLE_DEPRECATED_CFLAGS="\ +-DG_DISABLE_SINGLE_INCLUDES \ +-DGSEAL_ENABLE \ +-DG_DISABLE_DEPRECATED \ +-DGDK_DISABLE_DEPRECATED \ +-DGDK_PIXBUF_DISABLE_DEPRECATED \ +-DGTK_DISABLE_SINGLE_INCLUDES \ +-DGTK_DISABLE_DEPRECATED" + CPPFLAGS="$CPPFLAGS $DISABLE_DEPRECATED_CFLAGS" +fi + +# Options +# Check whether --enable-bing was given. +if test "${enable_bing+set}" = set; then : + enableval=$enable_bing; ac_cv_enable_bing=$enableval +else + ac_cv_enable_bing=yes +fi + +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking whether to enable Bing stuff" >&5 +$as_echo_n "checking whether to enable Bing stuff... " >&6; } +if ${ac_cv_enable_bing+:} false; then : + $as_echo_n "(cached) " >&6 +else + ac_cv_enable_bing=yes +fi +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_enable_bing" >&5 +$as_echo "$ac_cv_enable_bing" >&6; } +case $ac_cv_enable_bing in + yes) + +$as_echo "#define VIK_CONFIG_BING /**/" >>confdefs.h + + ;; +esac + if test x$ac_cv_enable_bing = xyes; then + BING_TRUE= + BING_FALSE='#' +else + BING_TRUE='#' + BING_FALSE= +fi + + +# Check whether --enable-google was given. +if test "${enable_google+set}" = set; then : + enableval=$enable_google; ac_cv_enable_google=$enableval +else + ac_cv_enable_google=yes +fi + +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking whether to enable Google stuff" >&5 +$as_echo_n "checking whether to enable Google stuff... " >&6; } +if ${ac_cv_enable_google+:} false; then : + $as_echo_n "(cached) " >&6 +else + ac_cv_enable_google=yes +fi +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_enable_google" >&5 +$as_echo "$ac_cv_enable_google" >&6; } +case $ac_cv_enable_google in + yes) + +$as_echo "#define VIK_CONFIG_GOOGLE /**/" >>confdefs.h + + ;; +esac + if test x$ac_cv_enable_google = xyes; then + GOOGLE_TRUE= + GOOGLE_FALSE='#' +else + GOOGLE_TRUE='#' + GOOGLE_FALSE= +fi + + +# Check whether --enable-terraserver was given. +if test "${enable_terraserver+set}" = set; then : + enableval=$enable_terraserver; ac_cv_enable_terraserver=$enableval +else + ac_cv_enable_terraserver=no +fi + +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking whether to enable Terraserver stuff" >&5 +$as_echo_n "checking whether to enable Terraserver stuff... " >&6; } +if ${ac_cv_enable_terraserver+:} false; then : + $as_echo_n "(cached) " >&6 +else + ac_cv_enable_terraserver=yes +fi +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_enable_terraserver" >&5 +$as_echo "$ac_cv_enable_terraserver" >&6; } +case $ac_cv_enable_terraserver in + yes) + +$as_echo "#define VIK_CONFIG_TERRASERVER /**/" >>confdefs.h + + ;; +esac + if test x$ac_cv_enable_terraserver = xyes; then + TERRASERVER_TRUE= + TERRASERVER_FALSE='#' +else + TERRASERVER_TRUE='#' + TERRASERVER_FALSE= +fi + + +# Check whether --enable-expedia was given. +if test "${enable_expedia+set}" = set; then : + enableval=$enable_expedia; ac_cv_enable_expedia=$enableval +else + ac_cv_enable_expedia=no +fi + +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking whether to enable Expedia stuff" >&5 +$as_echo_n "checking whether to enable Expedia stuff... " >&6; } +if ${ac_cv_enable_expedia+:} false; then : + $as_echo_n "(cached) " >&6 +else + ac_cv_enable_expedia=yes +fi +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_enable_expedia" >&5 +$as_echo "$ac_cv_enable_expedia" >&6; } +case $ac_cv_enable_expedia in + yes) + +$as_echo "#define VIK_CONFIG_EXPEDIA /**/" >>confdefs.h + + ;; +esac + if test x$ac_cv_enable_expedia = xyes; then + EXPEDIA_TRUE= + EXPEDIA_FALSE='#' +else + EXPEDIA_TRUE='#' + EXPEDIA_FALSE= +fi + + +# OpenStreetMap http://www.openstreetmap.org/ +# Check whether --enable-openstreetmap was given. +if test "${enable_openstreetmap+set}" = set; then : + enableval=$enable_openstreetmap; ac_cv_enable_openstreetmap=$enableval +else + ac_cv_enable_openstreetmap=yes +fi + +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking whether to enable OpenStreetMap stuff" >&5 +$as_echo_n "checking whether to enable OpenStreetMap stuff... " >&6; } +if ${ac_cv_enable_openstreetmap+:} false; then : + $as_echo_n "(cached) " >&6 +else + ac_cv_enable_openstreetmap=yes +fi +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_enable_openstreetmap" >&5 +$as_echo "$ac_cv_enable_openstreetmap" >&6; } +case $ac_cv_enable_openstreetmap in + yes) + +$as_echo "#define VIK_CONFIG_OPENSTREETMAP /**/" >>confdefs.h + + ;; +esac + if test x$ac_cv_enable_openstreetmap = xyes; then + OPENSTREETMAP_TRUE= + OPENSTREETMAP_FALSE='#' +else + OPENSTREETMAP_TRUE='#' + OPENSTREETMAP_FALSE= +fi + + +# BlueMarble +# Check whether --enable-bluemarble was given. +if test "${enable_bluemarble+set}" = set; then : + enableval=$enable_bluemarble; ac_cv_enable_bluemarble=$enableval +else + ac_cv_enable_bluemarble=yes +fi + +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking whether to enable BlueMarble stuff" >&5 +$as_echo_n "checking whether to enable BlueMarble stuff... " >&6; } +if ${ac_cv_enable_bluemarble+:} false; then : + $as_echo_n "(cached) " >&6 +else + ac_cv_enable_bluemarble=yes +fi +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_enable_bluemarble" >&5 +$as_echo "$ac_cv_enable_bluemarble" >&6; } +case $ac_cv_enable_bluemarble in + yes) + +$as_echo "#define VIK_CONFIG_BLUEMARBLE /**/" >>confdefs.h + + ;; +esac + if test x$ac_cv_enable_bluemarble = xyes; then + BLUEMARBLE_TRUE= + BLUEMARBLE_FALSE='#' +else + BLUEMARBLE_TRUE='#' + BLUEMARBLE_FALSE= +fi + + +# GeoNames http://www.geonames.org/ +# Check whether --enable-geonames was given. +if test "${enable_geonames+set}" = set; then : + enableval=$enable_geonames; ac_cv_enable_geonames=$enableval +else + ac_cv_enable_geonames=yes +fi + +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking whether to enable Geonames stuff" >&5 +$as_echo_n "checking whether to enable Geonames stuff... " >&6; } +if ${ac_cv_enable_geonames+:} false; then : + $as_echo_n "(cached) " >&6 +else + ac_cv_enable_geonames=yes +fi +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_enable_geonames" >&5 +$as_echo "$ac_cv_enable_geonames" >&6; } +case $ac_cv_enable_geonames in + yes) + +$as_echo "#define VIK_CONFIG_GEONAMES /**/" >>confdefs.h + + ;; +esac + if test x$ac_cv_enable_geonames = xyes; then + GEONAMES_TRUE= + GEONAMES_FALSE='#' +else + GEONAMES_TRUE='#' + GEONAMES_FALSE= +fi + + +# Check whether --enable-geocaches was given. +if test "${enable_geocaches+set}" = set; then : + enableval=$enable_geocaches; ac_cv_enable_geocaches=$enableval +else + ac_cv_enable_geocaches=no +fi + +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking whether to enable Geocaches Acquire" >&5 +$as_echo_n "checking whether to enable Geocaches Acquire... " >&6; } +if ${ac_cv_enable_geocaches+:} false; then : + $as_echo_n "(cached) " >&6 +else + ac_cv_enable_geocaches=yes +fi +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_enable_geocaches" >&5 +$as_echo "$ac_cv_enable_geocaches" >&6; } +case $ac_cv_enable_geocaches in + yes) + +$as_echo "#define VIK_CONFIG_GEOCACHES /**/" >>confdefs.h + + ;; +esac + if test x$ac_cv_enable_geocaches = xyes; then + GEOCACHES_TRUE= + GEOCACHES_FALSE='#' +else + GEOCACHES_TRUE='#' + GEOCACHES_FALSE= +fi + + +# GeoClue +# Check whether --enable-geoclue was given. +if test "${enable_geoclue+set}" = set; then : + enableval=$enable_geoclue; ac_cv_enable_geoclue=$enableval +else + ac_cv_enable_geoclue=yes +fi + +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking whether to enable GeoClue Support" >&5 +$as_echo_n "checking whether to enable GeoClue Support... " >&6; } +if ${ac_cv_enable_geoclue+:} false; then : + $as_echo_n "(cached) " >&6 +else + ac_cv_enable_geoclue=yes +fi +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_enable_geoclue" >&5 +$as_echo "$ac_cv_enable_geoclue" >&6; } +case $ac_cv_enable_geoclue in + yes) + +pkg_failed=no +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for LIBGEOCLUE" >&5 +$as_echo_n "checking for LIBGEOCLUE... " >&6; } + +if test -n "$LIBGEOCLUE_CFLAGS"; then + pkg_cv_LIBGEOCLUE_CFLAGS="$LIBGEOCLUE_CFLAGS" + elif test -n "$PKG_CONFIG"; then + if test -n "$PKG_CONFIG" && \ + { { $as_echo "$as_me:${as_lineno-$LINENO}: \$PKG_CONFIG --exists --print-errors \"libgeoclue-2.0 >= 2\""; } >&5 + ($PKG_CONFIG --exists --print-errors "libgeoclue-2.0 >= 2") 2>&5 + ac_status=$? + $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 + test $ac_status = 0; }; then + pkg_cv_LIBGEOCLUE_CFLAGS=`$PKG_CONFIG --cflags "libgeoclue-2.0 >= 2" 2>/dev/null` + test "x$?" != "x0" && pkg_failed=yes +else + pkg_failed=yes +fi + else + pkg_failed=untried +fi +if test -n "$LIBGEOCLUE_LIBS"; then + pkg_cv_LIBGEOCLUE_LIBS="$LIBGEOCLUE_LIBS" + elif test -n "$PKG_CONFIG"; then + if test -n "$PKG_CONFIG" && \ + { { $as_echo "$as_me:${as_lineno-$LINENO}: \$PKG_CONFIG --exists --print-errors \"libgeoclue-2.0 >= 2\""; } >&5 + ($PKG_CONFIG --exists --print-errors "libgeoclue-2.0 >= 2") 2>&5 + ac_status=$? + $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 + test $ac_status = 0; }; then + pkg_cv_LIBGEOCLUE_LIBS=`$PKG_CONFIG --libs "libgeoclue-2.0 >= 2" 2>/dev/null` + test "x$?" != "x0" && pkg_failed=yes +else + pkg_failed=yes +fi + else + pkg_failed=untried +fi + + + +if test $pkg_failed = yes; then + { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 +$as_echo "no" >&6; } + +if $PKG_CONFIG --atleast-pkgconfig-version 0.20; then + _pkg_short_errors_supported=yes +else + _pkg_short_errors_supported=no +fi + if test $_pkg_short_errors_supported = yes; then + LIBGEOCLUE_PKG_ERRORS=`$PKG_CONFIG --short-errors --print-errors --cflags --libs "libgeoclue-2.0 >= 2" 2>&1` + else + LIBGEOCLUE_PKG_ERRORS=`$PKG_CONFIG --print-errors --cflags --libs "libgeoclue-2.0 >= 2" 2>&1` + fi + # Put the nasty error message in config.log where it belongs + echo "$LIBGEOCLUE_PKG_ERRORS" >&5 + + as_fn_error $? "Package requirements (libgeoclue-2.0 >= 2) were not met: + +$LIBGEOCLUE_PKG_ERRORS + +Consider adjusting the PKG_CONFIG_PATH environment variable if you +installed software in a non-standard prefix. + +Alternatively, you may set the environment variables LIBGEOCLUE_CFLAGS +and LIBGEOCLUE_LIBS to avoid the need to call pkg-config. +See the pkg-config man page for more details." "$LINENO" 5 +elif test $pkg_failed = untried; then + { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 +$as_echo "no" >&6; } + { { $as_echo "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5 +$as_echo "$as_me: error: in \`$ac_pwd':" >&2;} +as_fn_error $? "The pkg-config script could not be found or is too old. Make sure it +is in your PATH or set the PKG_CONFIG environment variable to the full +path to pkg-config. + +Alternatively, you may set the environment variables LIBGEOCLUE_CFLAGS +and LIBGEOCLUE_LIBS to avoid the need to call pkg-config. +See the pkg-config man page for more details. + +To get pkg-config, see . +See \`config.log' for more details" "$LINENO" 5; } +else + LIBGEOCLUE_CFLAGS=$pkg_cv_LIBGEOCLUE_CFLAGS + LIBGEOCLUE_LIBS=$pkg_cv_LIBGEOCLUE_LIBS + { $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5 +$as_echo "yes" >&6; } + { $as_echo "$as_me:${as_lineno-$LINENO}: checking for main in -lgeoclue-2" >&5 +$as_echo_n "checking for main in -lgeoclue-2... " >&6; } +if ${ac_cv_lib_geoclue_2_main+:} false; then : + $as_echo_n "(cached) " >&6 +else + ac_check_lib_save_LIBS=$LIBS +LIBS="-lgeoclue-2 $LIBS" +cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ + + +int +main () +{ +return main (); + ; + return 0; +} +_ACEOF +if ac_fn_c_try_link "$LINENO"; then : + ac_cv_lib_geoclue_2_main=yes +else + ac_cv_lib_geoclue_2_main=no +fi +rm -f core conftest.err conftest.$ac_objext \ + conftest$ac_exeext conftest.$ac_ext +LIBS=$ac_check_lib_save_LIBS +fi +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_lib_geoclue_2_main" >&5 +$as_echo "$ac_cv_lib_geoclue_2_main" >&6; } +if test "x$ac_cv_lib_geoclue_2_main" = xyes; then : + cat >>confdefs.h <<_ACEOF +#define HAVE_LIBGEOCLUE_2 1 +_ACEOF + + LIBS="-lgeoclue-2 $LIBS" + +else + as_fn_error $? "libgeoclue is needed but not found - you will need to install package 'libgeoclue-2-dev' or similar " "$LINENO" 5 +fi + +fi + ;; +esac + if test x$ac_cv_enable_geoclue = xyes; then + GEOCLUE_TRUE= + GEOCLUE_FALSE='#' +else + GEOCLUE_TRUE='#' + GEOCLUE_FALSE= +fi + + +# Geotagging + +# Check whether --with-libexif was given. +if test "${with_libexif+set}" = set; then : + withval=$with_libexif; +fi + +# Check whether --enable-geotag was given. +if test "${enable_geotag+set}" = set; then : + enableval=$enable_geotag; ac_cv_enable_geotag=$enableval +else + ac_cv_enable_geotag=yes +fi + +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking whether to enable Geotag Support" >&5 +$as_echo_n "checking whether to enable Geotag Support... " >&6; } +if ${ac_cv_enable_geotag+:} false; then : + $as_echo_n "(cached) " >&6 +else + ac_cv_enable_geotag=yes +fi +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_enable_geotag" >&5 +$as_echo "$ac_cv_enable_geotag" >&6; } +case $ac_cv_enable_geotag in + yes) + if test x$with_libexif = xyes; then : + ac_fn_c_check_header_mongrel "$LINENO" "libexif/exif-data.h" "ac_cv_header_libexif_exif_data_h" "$ac_includes_default" +if test "x$ac_cv_header_libexif_exif_data_h" = xyes; then : + +else + as_fn_error $? "exif-data.h is needed but not found - you will need to install package 'libexif-dev' or similar" "$LINENO" 5 +fi + + + { $as_echo "$as_me:${as_lineno-$LINENO}: checking for exif_loader_new in -lexif" >&5 +$as_echo_n "checking for exif_loader_new in -lexif... " >&6; } +if ${ac_cv_lib_exif_exif_loader_new+:} false; then : + $as_echo_n "(cached) " >&6 +else + ac_check_lib_save_LIBS=$LIBS +LIBS="-lexif $LIBS" +cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ + +/* Override any GCC internal prototype to avoid an error. + Use char because int might match the return type of a GCC + builtin and then its argument prototype would still apply. */ +#ifdef __cplusplus +extern "C" +#endif +char exif_loader_new (); +int +main () +{ +return exif_loader_new (); + ; + return 0; +} +_ACEOF +if ac_fn_c_try_link "$LINENO"; then : + ac_cv_lib_exif_exif_loader_new=yes +else + ac_cv_lib_exif_exif_loader_new=no +fi +rm -f core conftest.err conftest.$ac_objext \ + conftest$ac_exeext conftest.$ac_ext +LIBS=$ac_check_lib_save_LIBS +fi +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_lib_exif_exif_loader_new" >&5 +$as_echo "$ac_cv_lib_exif_exif_loader_new" >&6; } +if test "x$ac_cv_lib_exif_exif_loader_new" = xyes; then : + cat >>confdefs.h <<_ACEOF +#define HAVE_LIBEXIF 1 +_ACEOF + + LIBS="-lexif $LIBS" + +else + as_fn_error $? "libexif is not found but it has been forcibly required" "$LINENO" 5 +fi + +else + # gexiv2.h relies on glib so a simple compile check fails. + #AC_CHECK_HEADER([gexiv2/gexiv2.h],,AC_MSG_ERROR([Error msg...])) + { $as_echo "$as_me:${as_lineno-$LINENO}: checking for gexiv2_metadata_new in -lgexiv2" >&5 +$as_echo_n "checking for gexiv2_metadata_new in -lgexiv2... " >&6; } +if ${ac_cv_lib_gexiv2_gexiv2_metadata_new+:} false; then : + $as_echo_n "(cached) " >&6 +else + ac_check_lib_save_LIBS=$LIBS +LIBS="-lgexiv2 $LIBS" +cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ + +/* Override any GCC internal prototype to avoid an error. + Use char because int might match the return type of a GCC + builtin and then its argument prototype would still apply. */ +#ifdef __cplusplus +extern "C" +#endif +char gexiv2_metadata_new (); +int +main () +{ +return gexiv2_metadata_new (); + ; + return 0; +} +_ACEOF +if ac_fn_c_try_link "$LINENO"; then : + ac_cv_lib_gexiv2_gexiv2_metadata_new=yes +else + ac_cv_lib_gexiv2_gexiv2_metadata_new=no +fi +rm -f core conftest.err conftest.$ac_objext \ + conftest$ac_exeext conftest.$ac_ext +LIBS=$ac_check_lib_save_LIBS +fi +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_lib_gexiv2_gexiv2_metadata_new" >&5 +$as_echo "$ac_cv_lib_gexiv2_gexiv2_metadata_new" >&6; } +if test "x$ac_cv_lib_gexiv2_gexiv2_metadata_new" = xyes; then : + cat >>confdefs.h <<_ACEOF +#define HAVE_LIBGEXIV2 1 +_ACEOF + + LIBS="-lgexiv2 $LIBS" + +else + as_fn_error $? "libgexiv2 is needed but not found - you will need to install package 'libgexiv2-dev' or similar. The feature can be disabled with --disable-geotag" "$LINENO" 5 +fi + + +fi + +$as_echo "#define VIK_CONFIG_GEOTAG /**/" >>confdefs.h + + ;; +esac + if test x$ac_cv_enable_geotag = xyes; then + GEOTAG_TRUE= + GEOTAG_FALSE='#' +else + GEOTAG_TRUE='#' + GEOTAG_FALSE= +fi + + if test x$ac_cv_lib_gexiv2_gexiv2_metadata_new = xyes ; then + GEXIV2_TRUE= + GEXIV2_FALSE='#' +else + GEXIV2_TRUE='#' + GEXIV2_FALSE= +fi + +# Tested with gexiv2 0.10.2, but probably would work with older versions; may be all of them... +#AM_COND_IF([GEXIV2], [PKG_CHECK_MODULES([GEXIV2], [gexiv2 >= 0.6.1])]) + if test x$ac_cv_lib_exif_exif_loader_new = xyes ; then + LIBEXIF_TRUE= + LIBEXIF_FALSE='#' +else + LIBEXIF_TRUE='#' + LIBEXIF_FALSE= +fi + + +# Check whether --enable-dem24k was given. +if test "${enable_dem24k+set}" = set; then : + enableval=$enable_dem24k; ac_cv_enable_dem24k=$enableval +else + ac_cv_enable_dem24k=no +fi + +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking whether to enable USGS DEM 24k download source" >&5 +$as_echo_n "checking whether to enable USGS DEM 24k download source... " >&6; } +if ${ac_cv_enable_dem24k+:} false; then : + $as_echo_n "(cached) " >&6 +else + ac_cv_enable_dem24k=yes +fi +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_enable_dem24k" >&5 +$as_echo "$ac_cv_enable_dem24k" >&6; } +case $ac_cv_enable_dem24k in + yes) + +$as_echo "#define VIK_CONFIG_DEM24K /**/" >>confdefs.h + + ;; +esac + if test x$ac_cv_enable_dem24k = xyes; then + DEM24K_TRUE= + DEM24K_FALSE='#' +else + DEM24K_TRUE='#' + DEM24K_FALSE= +fi + + +# OAuth +# Check whether --enable-oauth was given. +if test "${enable_oauth+set}" = set; then : + enableval=$enable_oauth; ac_cv_enable_oauth=$enableval +else + ac_cv_enable_oauth=yes +fi + +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking whether to enable OAuth Support" >&5 +$as_echo_n "checking whether to enable OAuth Support... " >&6; } +if ${ac_cv_enable_oauth+:} false; then : + $as_echo_n "(cached) " >&6 +else + ac_cv_enable_oauth=yes +fi +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_enable_oauth" >&5 +$as_echo "$ac_cv_enable_oauth" >&6; } +case $ac_cv_enable_oauth in + yes) + for ac_header in oauth.h +do : + ac_fn_c_check_header_mongrel "$LINENO" "oauth.h" "ac_cv_header_oauth_h" "$ac_includes_default" +if test "x$ac_cv_header_oauth_h" = xyes; then : + cat >>confdefs.h <<_ACEOF +#define HAVE_OAUTH_H 1 +_ACEOF + +else + as_fn_error $? "oauth.h is needed but not found - you will need to install package 'liboauth-dev' or similar. The feature can be disabled with --disable-oauth" "$LINENO" 5 +fi + +done + + { $as_echo "$as_me:${as_lineno-$LINENO}: checking for oauth_sign_url2 in -loauth" >&5 +$as_echo_n "checking for oauth_sign_url2 in -loauth... " >&6; } +if ${ac_cv_lib_oauth_oauth_sign_url2+:} false; then : + $as_echo_n "(cached) " >&6 +else + ac_check_lib_save_LIBS=$LIBS +LIBS="-loauth $LIBS" +cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ + +/* Override any GCC internal prototype to avoid an error. + Use char because int might match the return type of a GCC + builtin and then its argument prototype would still apply. */ +#ifdef __cplusplus +extern "C" +#endif +char oauth_sign_url2 (); +int +main () +{ +return oauth_sign_url2 (); + ; + return 0; +} +_ACEOF +if ac_fn_c_try_link "$LINENO"; then : + ac_cv_lib_oauth_oauth_sign_url2=yes +else + ac_cv_lib_oauth_oauth_sign_url2=no +fi +rm -f core conftest.err conftest.$ac_objext \ + conftest$ac_exeext conftest.$ac_ext +LIBS=$ac_check_lib_save_LIBS +fi +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_lib_oauth_oauth_sign_url2" >&5 +$as_echo "$ac_cv_lib_oauth_oauth_sign_url2" >&6; } +if test "x$ac_cv_lib_oauth_oauth_sign_url2" = xyes; then : + cat >>confdefs.h <<_ACEOF +#define HAVE_LIBOAUTH 1 +_ACEOF + + LIBS="-loauth $LIBS" + +else + as_fn_error $? "liboauth is needed but not found." "$LINENO" 5 +fi + + ;; +esac + if test x$ac_cv_enable_oauth = xyes; then + OAUTH_TRUE= + OAUTH_FALSE='#' +else + OAUTH_TRUE='#' + OAUTH_FALSE= +fi + + +# Realtime GPS tracking +# Check whether --enable-realtime-gps-tracking was given. +if test "${enable_realtime_gps_tracking+set}" = set; then : + enableval=$enable_realtime_gps_tracking; ac_cv_enable_realtimegpstracking=$enableval +else + ac_cv_enable_realtimegpstracking=yes +fi + +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking whether to enable Realtime GPS Tracking stuff" >&5 +$as_echo_n "checking whether to enable Realtime GPS Tracking stuff... " >&6; } +if ${ac_cv_enable_realtimegpstracking+:} false; then : + $as_echo_n "(cached) " >&6 +else + ac_cv_enable_realtimegpstracking=yes +fi +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_enable_realtimegpstracking" >&5 +$as_echo "$ac_cv_enable_realtimegpstracking" >&6; } +case $ac_cv_enable_realtimegpstracking in + yes) + for ac_header in gps.h +do : + ac_fn_c_check_header_mongrel "$LINENO" "gps.h" "ac_cv_header_gps_h" "$ac_includes_default" +if test "x$ac_cv_header_gps_h" = xyes; then : + cat >>confdefs.h <<_ACEOF +#define HAVE_GPS_H 1 +_ACEOF + +else + as_fn_error $? "gps.h is needed but not found - you will need to install package 'libgps-dev' or similar. The feature can be disabled with --disable-realtime-gps-tracking" "$LINENO" 5 +fi + +done + + { $as_echo "$as_me:${as_lineno-$LINENO}: checking for gps_close in -lgps" >&5 +$as_echo_n "checking for gps_close in -lgps... " >&6; } +if ${ac_cv_lib_gps_gps_close+:} false; then : + $as_echo_n "(cached) " >&6 +else + ac_check_lib_save_LIBS=$LIBS +LIBS="-lgps $LIBS" +cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ + +/* Override any GCC internal prototype to avoid an error. + Use char because int might match the return type of a GCC + builtin and then its argument prototype would still apply. */ +#ifdef __cplusplus +extern "C" +#endif +char gps_close (); +int +main () +{ +return gps_close (); + ; + return 0; +} +_ACEOF +if ac_fn_c_try_link "$LINENO"; then : + ac_cv_lib_gps_gps_close=yes +else + ac_cv_lib_gps_gps_close=no +fi +rm -f core conftest.err conftest.$ac_objext \ + conftest$ac_exeext conftest.$ac_ext +LIBS=$ac_check_lib_save_LIBS +fi +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_lib_gps_gps_close" >&5 +$as_echo "$ac_cv_lib_gps_gps_close" >&6; } +if test "x$ac_cv_lib_gps_gps_close" = xyes; then : + cat >>confdefs.h <<_ACEOF +#define HAVE_LIBGPS 1 +_ACEOF + + LIBS="-lgps $LIBS" + +else + if test "$ac_mingw32" = "yes"; then + LIBS="-lgps $LIBS" + { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: libgps not found! Forcing it anyway!" >&5 +$as_echo "$as_me: WARNING: libgps not found! Forcing it anyway!" >&2;} + else + as_fn_error $? "libgps is needed but not found." "$LINENO" 5 + fi +fi + + +$as_echo "#define VIK_CONFIG_REALTIME_GPS_TRACKING /**/" >>confdefs.h + + ;; +esac + if test x$ac_cv_enable_realtimegpstracking = xyes; then + REALTIME_GPS_TRACKING_TRUE= + REALTIME_GPS_TRACKING_FALSE='#' +else + REALTIME_GPS_TRACKING_TRUE='#' + REALTIME_GPS_TRACKING_FALSE= +fi + + +# BZIP2 +# Check whether --enable-bzip2 was given. +if test "${enable_bzip2+set}" = set; then : + enableval=$enable_bzip2; ac_cv_enable_bzip2=$enableval +else + ac_cv_enable_bzip2=yes +fi + +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking whether to enable bzip2 Support" >&5 +$as_echo_n "checking whether to enable bzip2 Support... " >&6; } +if ${ac_cv_enable_bzip2+:} false; then : + $as_echo_n "(cached) " >&6 +else + ac_cv_enable_bzip2=yes +fi +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_enable_bzip2" >&5 +$as_echo "$ac_cv_enable_bzip2" >&6; } +case $ac_cv_enable_bzip2 in + yes) + for ac_header in bzlib.h +do : + ac_fn_c_check_header_mongrel "$LINENO" "bzlib.h" "ac_cv_header_bzlib_h" "$ac_includes_default" +if test "x$ac_cv_header_bzlib_h" = xyes; then : + cat >>confdefs.h <<_ACEOF +#define HAVE_BZLIB_H 1 +_ACEOF + +else + as_fn_error $? "bzlib.h is needed but not found - you will need to install package 'libbz2-dev' or similar. The feature can be disabled with --disable-bzip2" "$LINENO" 5 +fi + +done + + if test "$ac_mingw32" = "yes"; then + # Using the cross compiler it bizarrely fails to detect BZ2_bzRead during the configure stage + # I SWEAR THIS WORKED AT SOME POINT - BUT ON A DIFFERENT DAY IT DOESN'T = MORE SWEARING + BZ2FUNC=main + as_ac_Lib=`$as_echo "ac_cv_lib_bz2_$BZ2FUNC" | $as_tr_sh` +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $BZ2FUNC in -lbz2" >&5 +$as_echo_n "checking for $BZ2FUNC in -lbz2... " >&6; } +if eval \${$as_ac_Lib+:} false; then : + $as_echo_n "(cached) " >&6 +else + ac_check_lib_save_LIBS=$LIBS +LIBS="-lbz2 $LIBS" +cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ + +/* Override any GCC internal prototype to avoid an error. + Use char because int might match the return type of a GCC + builtin and then its argument prototype would still apply. */ +#ifdef __cplusplus +extern "C" +#endif +char $BZ2FUNC (); +int +main () +{ +return $BZ2FUNC (); + ; + return 0; +} +_ACEOF +if ac_fn_c_try_link "$LINENO"; then : + eval "$as_ac_Lib=yes" +else + eval "$as_ac_Lib=no" +fi +rm -f core conftest.err conftest.$ac_objext \ + conftest$ac_exeext conftest.$ac_ext +LIBS=$ac_check_lib_save_LIBS +fi +eval ac_res=\$$as_ac_Lib + { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_res" >&5 +$as_echo "$ac_res" >&6; } +if eval test \"x\$"$as_ac_Lib"\" = x"yes"; then : + cat >>confdefs.h <<_ACEOF +#define HAVE_LIBBZ2 1 +_ACEOF + + LIBS="-lbz2 $LIBS" + +else + LIBS="-lbz2 $LIBS" + { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: libbz2 not found! Forcing it anyway!" >&5 +$as_echo "$as_me: WARNING: libbz2 not found! Forcing it anyway!" >&2;} +fi + + else + BZ2FUNC=BZ2_bzRead + as_ac_Lib=`$as_echo "ac_cv_lib_bz2_$BZ2FUNC" | $as_tr_sh` +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $BZ2FUNC in -lbz2" >&5 +$as_echo_n "checking for $BZ2FUNC in -lbz2... " >&6; } +if eval \${$as_ac_Lib+:} false; then : + $as_echo_n "(cached) " >&6 +else + ac_check_lib_save_LIBS=$LIBS +LIBS="-lbz2 $LIBS" +cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ + +/* Override any GCC internal prototype to avoid an error. + Use char because int might match the return type of a GCC + builtin and then its argument prototype would still apply. */ +#ifdef __cplusplus +extern "C" +#endif +char $BZ2FUNC (); +int +main () +{ +return $BZ2FUNC (); + ; + return 0; +} +_ACEOF +if ac_fn_c_try_link "$LINENO"; then : + eval "$as_ac_Lib=yes" +else + eval "$as_ac_Lib=no" +fi +rm -f core conftest.err conftest.$ac_objext \ + conftest$ac_exeext conftest.$ac_ext +LIBS=$ac_check_lib_save_LIBS +fi +eval ac_res=\$$as_ac_Lib + { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_res" >&5 +$as_echo "$ac_res" >&6; } +if eval test \"x\$"$as_ac_Lib"\" = x"yes"; then : + cat >>confdefs.h <<_ACEOF +#define HAVE_LIBBZ2 1 +_ACEOF + + LIBS="-lbz2 $LIBS" + +else + as_fn_error $? "libbz2 is needed but not found." "$LINENO" 5 +fi + + fi + ;; +esac + if test x$ac_cv_enable_bzip2 = xyes; then + BZIP2_TRUE= + BZIP2_FALSE='#' +else + BZIP2_TRUE='#' + BZIP2_FALSE= +fi + + +# FILE MAGIC +# Check whether --enable-magic was given. +if test "${enable_magic+set}" = set; then : + enableval=$enable_magic; ac_cv_enable_magic=$enableval +else + ac_cv_enable_magic=yes +fi + +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking whether to enable Magic Support" >&5 +$as_echo_n "checking whether to enable Magic Support... " >&6; } +if ${ac_cv_enable_magic+:} false; then : + $as_echo_n "(cached) " >&6 +else + ac_cv_enable_magic=yes +fi +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_enable_magic" >&5 +$as_echo "$ac_cv_enable_magic" >&6; } +case $ac_cv_enable_magic in + yes) + for ac_header in magic.h +do : + ac_fn_c_check_header_mongrel "$LINENO" "magic.h" "ac_cv_header_magic_h" "$ac_includes_default" +if test "x$ac_cv_header_magic_h" = xyes; then : + cat >>confdefs.h <<_ACEOF +#define HAVE_MAGIC_H 1 +_ACEOF + +else + as_fn_error $? "magic.h is needed but not found - you will need to install package 'libmagic-dev' or similar. The feature can be disabled with --disable-magic" "$LINENO" 5 +fi + +done + + # Using the cross compiler it fails to find libmagic.dll during the configure stage + { $as_echo "$as_me:${as_lineno-$LINENO}: checking for magic_open in -lmagic" >&5 +$as_echo_n "checking for magic_open in -lmagic... " >&6; } +if ${ac_cv_lib_magic_magic_open+:} false; then : + $as_echo_n "(cached) " >&6 +else + ac_check_lib_save_LIBS=$LIBS +LIBS="-lmagic $LIBS" +cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ + +/* Override any GCC internal prototype to avoid an error. + Use char because int might match the return type of a GCC + builtin and then its argument prototype would still apply. */ +#ifdef __cplusplus +extern "C" +#endif +char magic_open (); +int +main () +{ +return magic_open (); + ; + return 0; +} +_ACEOF +if ac_fn_c_try_link "$LINENO"; then : + ac_cv_lib_magic_magic_open=yes +else + ac_cv_lib_magic_magic_open=no +fi +rm -f core conftest.err conftest.$ac_objext \ + conftest$ac_exeext conftest.$ac_ext +LIBS=$ac_check_lib_save_LIBS +fi +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_lib_magic_magic_open" >&5 +$as_echo "$ac_cv_lib_magic_magic_open" >&6; } +if test "x$ac_cv_lib_magic_magic_open" = xyes; then : + cat >>confdefs.h <<_ACEOF +#define HAVE_LIBMAGIC 1 +_ACEOF + + LIBS="-lmagic $LIBS" + +else + if test "$ac_mingw32" = "yes"; then + LIBS="-lmagic $LIBS" + { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: libmagic not found! Forcing it anyway!" >&5 +$as_echo "$as_me: WARNING: libmagic not found! Forcing it anyway!" >&2;} + else + as_fn_error $? "libmagic is needed but not found." "$LINENO" 5 + fi +fi + + ;; +esac + if test x$ac_cv_enable_magic = xyes; then + MAGIC_TRUE= + MAGIC_FALSE='#' +else + MAGIC_TRUE='#' + MAGIC_FALSE= +fi + + +# SQL for MBTiles +# Check whether --enable-mbtiles was given. +if test "${enable_mbtiles+set}" = set; then : + enableval=$enable_mbtiles; ac_cv_enable_mbtiles=$enableval +else + ac_cv_enable_mbtiles=yes +fi + +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking whether to enable MBTiles Support" >&5 +$as_echo_n "checking whether to enable MBTiles Support... " >&6; } +if ${ac_cv_enable_mbtiles+:} false; then : + $as_echo_n "(cached) " >&6 +else + ac_cv_enable_mbtiles=yes +fi +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_enable_mbtiles" >&5 +$as_echo "$ac_cv_enable_mbtiles" >&6; } +case $ac_cv_enable_mbtiles in + yes) + for ac_header in sqlite3.h +do : + ac_fn_c_check_header_mongrel "$LINENO" "sqlite3.h" "ac_cv_header_sqlite3_h" "$ac_includes_default" +if test "x$ac_cv_header_sqlite3_h" = xyes; then : + cat >>confdefs.h <<_ACEOF +#define HAVE_SQLITE3_H 1 +_ACEOF + +else + as_fn_error $? "sqlite3.h is needed but not found - you will need to install package 'libsqlite3-dev' or similar. The feature can be disabled with --disable-mbtiles" "$LINENO" 5 +fi + +done + + { $as_echo "$as_me:${as_lineno-$LINENO}: checking for sqlite3_open in -lsqlite3" >&5 +$as_echo_n "checking for sqlite3_open in -lsqlite3... " >&6; } +if ${ac_cv_lib_sqlite3_sqlite3_open+:} false; then : + $as_echo_n "(cached) " >&6 +else + ac_check_lib_save_LIBS=$LIBS +LIBS="-lsqlite3 $LIBS" +cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ + +/* Override any GCC internal prototype to avoid an error. + Use char because int might match the return type of a GCC + builtin and then its argument prototype would still apply. */ +#ifdef __cplusplus +extern "C" +#endif +char sqlite3_open (); +int +main () +{ +return sqlite3_open (); + ; + return 0; +} +_ACEOF +if ac_fn_c_try_link "$LINENO"; then : + ac_cv_lib_sqlite3_sqlite3_open=yes +else + ac_cv_lib_sqlite3_sqlite3_open=no +fi +rm -f core conftest.err conftest.$ac_objext \ + conftest$ac_exeext conftest.$ac_ext +LIBS=$ac_check_lib_save_LIBS +fi +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_lib_sqlite3_sqlite3_open" >&5 +$as_echo "$ac_cv_lib_sqlite3_sqlite3_open" >&6; } +if test "x$ac_cv_lib_sqlite3_sqlite3_open" = xyes; then : + cat >>confdefs.h <<_ACEOF +#define HAVE_LIBSQLITE3 1 +_ACEOF + + LIBS="-lsqlite3 $LIBS" + +else + if test "$ac_mingw32" = "yes"; then + LIBS="-lsqlite3 $LIBS" + { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: libsqlite3 not found! Forcing it anyway!" >&5 +$as_echo "$as_me: WARNING: libsqlite3 not found! Forcing it anyway!" >&2;} + else + as_fn_error $? "libsqlite3 is needed but not found." "$LINENO" 5 + fi +fi + + ;; +esac + if test x$ac_cv_enable_mbtiles = xyes; then + SQLITE_TRUE= + SQLITE_FALSE='#' +else + SQLITE_TRUE='#' + SQLITE_FALSE= +fi + + +# Standard compression is handled by libz +# libzip enables a friendlier file based interface +# libzip itself depends on libz (which is required in the Viking build ATM) +# ZIP +# Check whether --enable-zip was given. +if test "${enable_zip+set}" = set; then : + enableval=$enable_zip; ac_cv_enable_zip=$enableval +else + ac_cv_enable_zip=yes +fi + +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking whether to enable zip Support" >&5 +$as_echo_n "checking whether to enable zip Support... " >&6; } +if ${ac_cv_enable_zip+:} false; then : + $as_echo_n "(cached) " >&6 +else + ac_cv_enable_zip=yes +fi +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_enable_zip" >&5 +$as_echo "$ac_cv_enable_zip" >&6; } +case $ac_cv_enable_zip in + yes) + # NB As far as I can tell libzip doesn't provide any versioning info within the header code itself + # Thus supporting old versions via simple #if #else #endif directives is seemingly not possible + # Resort to checking versioning only via pkgconfig + +pkg_failed=no +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for LIBZIP" >&5 +$as_echo_n "checking for LIBZIP... " >&6; } + +if test -n "$LIBZIP_CFLAGS"; then + pkg_cv_LIBZIP_CFLAGS="$LIBZIP_CFLAGS" + elif test -n "$PKG_CONFIG"; then + if test -n "$PKG_CONFIG" && \ + { { $as_echo "$as_me:${as_lineno-$LINENO}: \$PKG_CONFIG --exists --print-errors \"libzip >= 0.11\""; } >&5 + ($PKG_CONFIG --exists --print-errors "libzip >= 0.11") 2>&5 + ac_status=$? + $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 + test $ac_status = 0; }; then + pkg_cv_LIBZIP_CFLAGS=`$PKG_CONFIG --cflags "libzip >= 0.11" 2>/dev/null` + test "x$?" != "x0" && pkg_failed=yes +else + pkg_failed=yes +fi + else + pkg_failed=untried +fi +if test -n "$LIBZIP_LIBS"; then + pkg_cv_LIBZIP_LIBS="$LIBZIP_LIBS" + elif test -n "$PKG_CONFIG"; then + if test -n "$PKG_CONFIG" && \ + { { $as_echo "$as_me:${as_lineno-$LINENO}: \$PKG_CONFIG --exists --print-errors \"libzip >= 0.11\""; } >&5 + ($PKG_CONFIG --exists --print-errors "libzip >= 0.11") 2>&5 + ac_status=$? + $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 + test $ac_status = 0; }; then + pkg_cv_LIBZIP_LIBS=`$PKG_CONFIG --libs "libzip >= 0.11" 2>/dev/null` + test "x$?" != "x0" && pkg_failed=yes +else + pkg_failed=yes +fi + else + pkg_failed=untried +fi + + + +if test $pkg_failed = yes; then + { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 +$as_echo "no" >&6; } + +if $PKG_CONFIG --atleast-pkgconfig-version 0.20; then + _pkg_short_errors_supported=yes +else + _pkg_short_errors_supported=no +fi + if test $_pkg_short_errors_supported = yes; then + LIBZIP_PKG_ERRORS=`$PKG_CONFIG --short-errors --print-errors --cflags --libs "libzip >= 0.11" 2>&1` + else + LIBZIP_PKG_ERRORS=`$PKG_CONFIG --print-errors --cflags --libs "libzip >= 0.11" 2>&1` + fi + # Put the nasty error message in config.log where it belongs + echo "$LIBZIP_PKG_ERRORS" >&5 + + { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: libzip version needs to be at least 0.11, use of libzip is disabled" >&5 +$as_echo "$as_me: WARNING: libzip version needs to be at least 0.11, use of libzip is disabled" >&2;} + ac_cv_enable_zip=no + +elif test $pkg_failed = untried; then + { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 +$as_echo "no" >&6; } + { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: libzip version needs to be at least 0.11, use of libzip is disabled" >&5 +$as_echo "$as_me: WARNING: libzip version needs to be at least 0.11, use of libzip is disabled" >&2;} + ac_cv_enable_zip=no + +else + LIBZIP_CFLAGS=$pkg_cv_LIBZIP_CFLAGS + LIBZIP_LIBS=$pkg_cv_LIBZIP_LIBS + { $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5 +$as_echo "yes" >&6; } + for ac_header in zip.h +do : + ac_fn_c_check_header_mongrel "$LINENO" "zip.h" "ac_cv_header_zip_h" "$ac_includes_default" +if test "x$ac_cv_header_zip_h" = xyes; then : + cat >>confdefs.h <<_ACEOF +#define HAVE_ZIP_H 1 +_ACEOF + +else + as_fn_error $? "zip.h is needed but not found - you will need to install package 'libzip-dev' or similar. The feature can be disabled with --disable-zip" "$LINENO" 5 +fi + +done + + { $as_echo "$as_me:${as_lineno-$LINENO}: checking for main in -lzip" >&5 +$as_echo_n "checking for main in -lzip... " >&6; } +if ${ac_cv_lib_zip_main+:} false; then : + $as_echo_n "(cached) " >&6 +else + ac_check_lib_save_LIBS=$LIBS +LIBS="-lzip $LIBS" +cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ + + +int +main () +{ +return main (); + ; + return 0; +} +_ACEOF +if ac_fn_c_try_link "$LINENO"; then : + ac_cv_lib_zip_main=yes +else + ac_cv_lib_zip_main=no +fi +rm -f core conftest.err conftest.$ac_objext \ + conftest$ac_exeext conftest.$ac_ext +LIBS=$ac_check_lib_save_LIBS +fi +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_lib_zip_main" >&5 +$as_echo "$ac_cv_lib_zip_main" >&6; } +if test "x$ac_cv_lib_zip_main" = xyes; then : + cat >>confdefs.h <<_ACEOF +#define HAVE_LIBZIP 1 +_ACEOF + + LIBS="-lzip $LIBS" + +else + if test "$ac_mingw32" = "yes"; then + LIBS="-lzip $LIBS" + { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: libzip not found! Forcing it anyway!" >&5 +$as_echo "$as_me: WARNING: libzip not found! Forcing it anyway!" >&2;} + else + as_fn_error $? "libzip is needed but not found." "$LINENO" 5 + fi +fi + +fi + ;; +esac + if test x$ac_cv_enable_zip = xyes; then + ZIP_TRUE= + ZIP_FALSE='#' +else + ZIP_TRUE='#' + ZIP_FALSE= +fi + + +# ATM only for MD5 Hashing which is currently only used for filename of image thumbnails +# Check whether --enable-nettle was given. +if test "${enable_nettle+set}" = set; then : + enableval=$enable_nettle; ac_cv_enable_nettle=$enableval +else + ac_cv_enable_nettle=yes +fi + +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking whether to enable MD5 Hash support" >&5 +$as_echo_n "checking whether to enable MD5 Hash support... " >&6; } +if ${ac_cv_enable_nettle+:} false; then : + $as_echo_n "(cached) " >&6 +else + ac_cv_enable_nettle=yes +fi +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_enable_nettle" >&5 +$as_echo "$ac_cv_enable_nettle" >&6; } +case $ac_cv_enable_nettle in + yes) + ac_fn_c_check_header_mongrel "$LINENO" "nettle/md5-compat.h" "ac_cv_header_nettle_md5_compat_h" "$ac_includes_default" +if test "x$ac_cv_header_nettle_md5_compat_h" = xyes; then : + +else + as_fn_error $? "nettle/md5-compat.h is needed but not found - you will need to install package 'nettle-dev' or similar. The feature can be disabled with --disable-nettle" "$LINENO" 5 +fi + + + { $as_echo "$as_me:${as_lineno-$LINENO}: checking for main in -lnettle" >&5 +$as_echo_n "checking for main in -lnettle... " >&6; } +if ${ac_cv_lib_nettle_main+:} false; then : + $as_echo_n "(cached) " >&6 +else + ac_check_lib_save_LIBS=$LIBS +LIBS="-lnettle $LIBS" +cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ + + +int +main () +{ +return main (); + ; + return 0; +} +_ACEOF +if ac_fn_c_try_link "$LINENO"; then : + ac_cv_lib_nettle_main=yes +else + ac_cv_lib_nettle_main=no +fi +rm -f core conftest.err conftest.$ac_objext \ + conftest$ac_exeext conftest.$ac_ext +LIBS=$ac_check_lib_save_LIBS +fi +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_lib_nettle_main" >&5 +$as_echo "$ac_cv_lib_nettle_main" >&6; } +if test "x$ac_cv_lib_nettle_main" = xyes; then : + cat >>confdefs.h <<_ACEOF +#define HAVE_LIBNETTLE 1 +_ACEOF + + LIBS="-lnettle $LIBS" + +else + if test "$ac_mingw32" = "yes"; then + LIBS="-lnettle $LIBS" + { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: libnettle not found! Forcing it anyway!" >&5 +$as_echo "$as_me: WARNING: libnettle not found! Forcing it anyway!" >&2;} + else + as_fn_error $? "libnettle is needed but not found." "$LINENO" 5 + fi +fi + + ;; +esac + if test x$ac_cv_enable_nettle = xyes; then + MD5_HASH_TRUE= + MD5_HASH_FALSE='#' +else + MD5_HASH_TRUE='#' + MD5_HASH_FALSE= +fi + + +# Mapnik rendering layer +# Check whether --enable-mapnik was given. +if test "${enable_mapnik+set}" = set; then : + enableval=$enable_mapnik; ac_cv_enable_mapnik=$enableval +else + ac_cv_enable_mapnik=yes +fi + +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking whether to enable Mapnik" >&5 +$as_echo_n "checking whether to enable Mapnik... " >&6; } +if ${ac_cv_enable_mapnik+:} false; then : + $as_echo_n "(cached) " >&6 +else + ac_cv_enable_mapnik=yes +fi +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_enable_mapnik" >&5 +$as_echo "$ac_cv_enable_mapnik" >&6; } +case $ac_cv_enable_mapnik in + yes) + # C++ + ac_ext=cpp +ac_cpp='$CXXCPP $CPPFLAGS' +ac_compile='$CXX -c $CXXFLAGS $CPPFLAGS conftest.$ac_ext >&5' +ac_link='$CXX -o conftest$ac_exeext $CXXFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' +ac_compiler_gnu=$ac_cv_cxx_compiler_gnu + + + ac_ext=cpp +ac_cpp='$CXXCPP $CPPFLAGS' +ac_compile='$CXX -c $CXXFLAGS $CPPFLAGS conftest.$ac_ext >&5' +ac_link='$CXX -o conftest$ac_exeext $CXXFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' +ac_compiler_gnu=$ac_cv_cxx_compiler_gnu +if test -z "$CXX"; then + if test -n "$CCC"; then + CXX=$CCC + else + if test -n "$ac_tool_prefix"; then + for ac_prog in g++ c++ gpp aCC CC cxx cc++ cl.exe FCC KCC RCC xlC_r xlC + do + # Extract the first word of "$ac_tool_prefix$ac_prog", so it can be a program name with args. +set dummy $ac_tool_prefix$ac_prog; ac_word=$2 +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 +$as_echo_n "checking for $ac_word... " >&6; } +if ${ac_cv_prog_CXX+:} false; then : + $as_echo_n "(cached) " >&6 +else + if test -n "$CXX"; then + ac_cv_prog_CXX="$CXX" # Let the user override the test. +else +as_save_IFS=$IFS; IFS=$PATH_SEPARATOR +for as_dir in $PATH +do + IFS=$as_save_IFS + test -z "$as_dir" && as_dir=. + for ac_exec_ext in '' $ac_executable_extensions; do + if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then + ac_cv_prog_CXX="$ac_tool_prefix$ac_prog" + $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 + break 2 + fi +done + done +IFS=$as_save_IFS + +fi +fi +CXX=$ac_cv_prog_CXX +if test -n "$CXX"; then + { $as_echo "$as_me:${as_lineno-$LINENO}: result: $CXX" >&5 +$as_echo "$CXX" >&6; } +else + { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 +$as_echo "no" >&6; } +fi + + + test -n "$CXX" && break + done +fi +if test -z "$CXX"; then + ac_ct_CXX=$CXX + for ac_prog in g++ c++ gpp aCC CC cxx cc++ cl.exe FCC KCC RCC xlC_r xlC +do + # Extract the first word of "$ac_prog", so it can be a program name with args. +set dummy $ac_prog; ac_word=$2 +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 +$as_echo_n "checking for $ac_word... " >&6; } +if ${ac_cv_prog_ac_ct_CXX+:} false; then : + $as_echo_n "(cached) " >&6 +else + if test -n "$ac_ct_CXX"; then + ac_cv_prog_ac_ct_CXX="$ac_ct_CXX" # Let the user override the test. +else +as_save_IFS=$IFS; IFS=$PATH_SEPARATOR +for as_dir in $PATH +do + IFS=$as_save_IFS + test -z "$as_dir" && as_dir=. + for ac_exec_ext in '' $ac_executable_extensions; do + if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then + ac_cv_prog_ac_ct_CXX="$ac_prog" + $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 + break 2 + fi +done + done +IFS=$as_save_IFS + +fi +fi +ac_ct_CXX=$ac_cv_prog_ac_ct_CXX +if test -n "$ac_ct_CXX"; then + { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_ct_CXX" >&5 +$as_echo "$ac_ct_CXX" >&6; } +else + { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 +$as_echo "no" >&6; } +fi + + + test -n "$ac_ct_CXX" && break +done + + if test "x$ac_ct_CXX" = x; then + CXX="g++" + else + case $cross_compiling:$ac_tool_warned in +yes:) +{ $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: using cross tools not prefixed with host triplet" >&5 +$as_echo "$as_me: WARNING: using cross tools not prefixed with host triplet" >&2;} +ac_tool_warned=yes ;; +esac + CXX=$ac_ct_CXX + fi +fi + + fi +fi +# Provide some information about the compiler. +$as_echo "$as_me:${as_lineno-$LINENO}: checking for C++ compiler version" >&5 +set X $ac_compile +ac_compiler=$2 +for ac_option in --version -v -V -qversion; do + { { ac_try="$ac_compiler $ac_option >&5" +case "(($ac_try" in + *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; + *) ac_try_echo=$ac_try;; +esac +eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\"" +$as_echo "$ac_try_echo"; } >&5 + (eval "$ac_compiler $ac_option >&5") 2>conftest.err + ac_status=$? + if test -s conftest.err; then + sed '10a\ +... rest of stderr output deleted ... + 10q' conftest.err >conftest.er1 + cat conftest.er1 >&5 + fi + rm -f conftest.er1 conftest.err + $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 + test $ac_status = 0; } +done + +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking whether we are using the GNU C++ compiler" >&5 +$as_echo_n "checking whether we are using the GNU C++ compiler... " >&6; } +if ${ac_cv_cxx_compiler_gnu+:} false; then : + $as_echo_n "(cached) " >&6 +else + cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ + +int +main () +{ +#ifndef __GNUC__ + choke me +#endif + + ; + return 0; +} +_ACEOF +if ac_fn_cxx_try_compile "$LINENO"; then : + ac_compiler_gnu=yes +else + ac_compiler_gnu=no +fi +rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext +ac_cv_cxx_compiler_gnu=$ac_compiler_gnu + +fi +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_cxx_compiler_gnu" >&5 +$as_echo "$ac_cv_cxx_compiler_gnu" >&6; } +if test $ac_compiler_gnu = yes; then + GXX=yes +else + GXX= +fi +ac_test_CXXFLAGS=${CXXFLAGS+set} +ac_save_CXXFLAGS=$CXXFLAGS +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking whether $CXX accepts -g" >&5 +$as_echo_n "checking whether $CXX accepts -g... " >&6; } +if ${ac_cv_prog_cxx_g+:} false; then : + $as_echo_n "(cached) " >&6 +else + ac_save_cxx_werror_flag=$ac_cxx_werror_flag + ac_cxx_werror_flag=yes + ac_cv_prog_cxx_g=no + CXXFLAGS="-g" + cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ + +int +main () +{ + + ; + return 0; +} +_ACEOF +if ac_fn_cxx_try_compile "$LINENO"; then : + ac_cv_prog_cxx_g=yes +else + CXXFLAGS="" + cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ + +int +main () +{ + + ; + return 0; +} +_ACEOF +if ac_fn_cxx_try_compile "$LINENO"; then : + +else + ac_cxx_werror_flag=$ac_save_cxx_werror_flag + CXXFLAGS="-g" + cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ + +int +main () +{ + + ; + return 0; +} +_ACEOF +if ac_fn_cxx_try_compile "$LINENO"; then : + ac_cv_prog_cxx_g=yes +fi +rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext +fi +rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext +fi +rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext + ac_cxx_werror_flag=$ac_save_cxx_werror_flag +fi +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_prog_cxx_g" >&5 +$as_echo "$ac_cv_prog_cxx_g" >&6; } +if test "$ac_test_CXXFLAGS" = set; then + CXXFLAGS=$ac_save_CXXFLAGS +elif test $ac_cv_prog_cxx_g = yes; then + if test "$GXX" = yes; then + CXXFLAGS="-g -O2" + else + CXXFLAGS="-g" + fi +else + if test "$GXX" = yes; then + CXXFLAGS="-O2" + else + CXXFLAGS= + fi +fi +ac_ext=cpp +ac_cpp='$CXXCPP $CPPFLAGS' +ac_compile='$CXX -c $CXXFLAGS $CPPFLAGS conftest.$ac_ext >&5' +ac_link='$CXX -o conftest$ac_exeext $CXXFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' +ac_compiler_gnu=$ac_cv_cxx_compiler_gnu + +depcc="$CXX" am_compiler_list= + +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking dependency style of $depcc" >&5 +$as_echo_n "checking dependency style of $depcc... " >&6; } +if ${am_cv_CXX_dependencies_compiler_type+:} false; then : + $as_echo_n "(cached) " >&6 +else + if test -z "$AMDEP_TRUE" && test -f "$am_depcomp"; then + # We make a subdir and do the tests there. Otherwise we can end up + # making bogus files that we don't know about and never remove. For + # instance it was reported that on HP-UX the gcc test will end up + # making a dummy file named 'D' -- because '-MD' means "put the output + # in D". + rm -rf conftest.dir + mkdir conftest.dir + # Copy depcomp to subdir because otherwise we won't find it if we're + # using a relative directory. + cp "$am_depcomp" conftest.dir + cd conftest.dir + # We will build objects and dependencies in a subdirectory because + # it helps to detect inapplicable dependency modes. For instance + # both Tru64's cc and ICC support -MD to output dependencies as a + # side effect of compilation, but ICC will put the dependencies in + # the current directory while Tru64 will put them in the object + # directory. + mkdir sub + + am_cv_CXX_dependencies_compiler_type=none + if test "$am_compiler_list" = ""; then + am_compiler_list=`sed -n 's/^#*\([a-zA-Z0-9]*\))$/\1/p' < ./depcomp` + fi + am__universal=false + case " $depcc " in #( + *\ -arch\ *\ -arch\ *) am__universal=true ;; + esac + + for depmode in $am_compiler_list; do + # Setup a source with many dependencies, because some compilers + # like to wrap large dependency lists on column 80 (with \), and + # we should not choose a depcomp mode which is confused by this. + # + # We need to recreate these files for each test, as the compiler may + # overwrite some of them when testing with obscure command lines. + # This happens at least with the AIX C compiler. + : > sub/conftest.c + for i in 1 2 3 4 5 6; do + echo '#include "conftst'$i'.h"' >> sub/conftest.c + # Using ": > sub/conftst$i.h" creates only sub/conftst1.h with + # Solaris 10 /bin/sh. + echo '/* dummy */' > sub/conftst$i.h + done + echo "${am__include} ${am__quote}sub/conftest.Po${am__quote}" > confmf + + # We check with '-c' and '-o' for the sake of the "dashmstdout" + # mode. It turns out that the SunPro C++ compiler does not properly + # handle '-M -o', and we need to detect this. Also, some Intel + # versions had trouble with output in subdirs. + am__obj=sub/conftest.${OBJEXT-o} + am__minus_obj="-o $am__obj" + case $depmode in + gcc) + # This depmode causes a compiler race in universal mode. + test "$am__universal" = false || continue + ;; + nosideeffect) + # After this tag, mechanisms are not by side-effect, so they'll + # only be used when explicitly requested. + if test "x$enable_dependency_tracking" = xyes; then + continue + else + break + fi + ;; + msvc7 | msvc7msys | msvisualcpp | msvcmsys) + # This compiler won't grok '-c -o', but also, the minuso test has + # not run yet. These depmodes are late enough in the game, and + # so weak that their functioning should not be impacted. + am__obj=conftest.${OBJEXT-o} + am__minus_obj= + ;; + none) break ;; + esac + if depmode=$depmode \ + source=sub/conftest.c object=$am__obj \ + depfile=sub/conftest.Po tmpdepfile=sub/conftest.TPo \ + $SHELL ./depcomp $depcc -c $am__minus_obj sub/conftest.c \ + >/dev/null 2>conftest.err && + grep sub/conftst1.h sub/conftest.Po > /dev/null 2>&1 && + grep sub/conftst6.h sub/conftest.Po > /dev/null 2>&1 && + grep $am__obj sub/conftest.Po > /dev/null 2>&1 && + ${MAKE-make} -s -f confmf > /dev/null 2>&1; then + # icc doesn't choke on unknown options, it will just issue warnings + # or remarks (even with -Werror). So we grep stderr for any message + # that says an option was ignored or not supported. + # When given -MP, icc 7.0 and 7.1 complain thusly: + # icc: Command line warning: ignoring option '-M'; no argument required + # The diagnosis changed in icc 8.0: + # icc: Command line remark: option '-MP' not supported + if (grep 'ignoring option' conftest.err || + grep 'not supported' conftest.err) >/dev/null 2>&1; then :; else + am_cv_CXX_dependencies_compiler_type=$depmode + break + fi + fi + done + + cd .. + rm -rf conftest.dir +else + am_cv_CXX_dependencies_compiler_type=none +fi + +fi +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $am_cv_CXX_dependencies_compiler_type" >&5 +$as_echo "$am_cv_CXX_dependencies_compiler_type" >&6; } +CXXDEPMODE=depmode=$am_cv_CXX_dependencies_compiler_type + + if + test "x$enable_dependency_tracking" != xno \ + && test "$am_cv_CXX_dependencies_compiler_type" = gcc3; then + am__fastdepCXX_TRUE= + am__fastdepCXX_FALSE='#' +else + am__fastdepCXX_TRUE='#' + am__fastdepCXX_FALSE= +fi + + + # Mapnik3 requires C++11. Viking will use C++11 as well. + CXXFLAGS="$CXXFLAGS -std=c++11" + # Too difficult to get check working under Windows (extra dependencies needed probably Boost)- so just skip it + if test "x$ac_cv_enable_windows" = "xno"; then + +ac_ext=cpp +ac_cpp='$CXXCPP $CPPFLAGS' +ac_compile='$CXX -c $CXXFLAGS $CPPFLAGS conftest.$ac_ext >&5' +ac_link='$CXX -o conftest$ac_exeext $CXXFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' +ac_compiler_gnu=$ac_cv_cxx_compiler_gnu +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking how to run the C++ preprocessor" >&5 +$as_echo_n "checking how to run the C++ preprocessor... " >&6; } +if test -z "$CXXCPP"; then + if ${ac_cv_prog_CXXCPP+:} false; then : + $as_echo_n "(cached) " >&6 +else + # Double quotes because CXXCPP needs to be expanded + for CXXCPP in "$CXX -E" "/lib/cpp" + do + ac_preproc_ok=false +for ac_cxx_preproc_warn_flag in '' yes +do + # Use a header file that comes with gcc, so configuring glibc + # with a fresh cross-compiler works. + # Prefer to if __STDC__ is defined, since + # exists even on freestanding compilers. + # On the NeXT, cc -E runs the code through the compiler's parser, + # not just through cpp. "Syntax error" is here to catch this case. + cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ +#ifdef __STDC__ +# include +#else +# include +#endif + Syntax error +_ACEOF +if ac_fn_cxx_try_cpp "$LINENO"; then : + +else + # Broken: fails on valid input. +continue +fi +rm -f conftest.err conftest.i conftest.$ac_ext + + # OK, works on sane cases. Now check whether nonexistent headers + # can be detected and how. + cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ +#include +_ACEOF +if ac_fn_cxx_try_cpp "$LINENO"; then : + # Broken: success on invalid input. +continue +else + # Passes both tests. +ac_preproc_ok=: +break +fi +rm -f conftest.err conftest.i conftest.$ac_ext + +done +# Because of `break', _AC_PREPROC_IFELSE's cleaning code was skipped. +rm -f conftest.i conftest.err conftest.$ac_ext +if $ac_preproc_ok; then : + break +fi + + done + ac_cv_prog_CXXCPP=$CXXCPP + +fi + CXXCPP=$ac_cv_prog_CXXCPP +else + ac_cv_prog_CXXCPP=$CXXCPP +fi +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $CXXCPP" >&5 +$as_echo "$CXXCPP" >&6; } +ac_preproc_ok=false +for ac_cxx_preproc_warn_flag in '' yes +do + # Use a header file that comes with gcc, so configuring glibc + # with a fresh cross-compiler works. + # Prefer to if __STDC__ is defined, since + # exists even on freestanding compilers. + # On the NeXT, cc -E runs the code through the compiler's parser, + # not just through cpp. "Syntax error" is here to catch this case. + cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ +#ifdef __STDC__ +# include +#else +# include +#endif + Syntax error +_ACEOF +if ac_fn_cxx_try_cpp "$LINENO"; then : + +else + # Broken: fails on valid input. +continue +fi +rm -f conftest.err conftest.i conftest.$ac_ext + + # OK, works on sane cases. Now check whether nonexistent headers + # can be detected and how. + cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ +#include +_ACEOF +if ac_fn_cxx_try_cpp "$LINENO"; then : + # Broken: success on invalid input. +continue +else + # Passes both tests. +ac_preproc_ok=: +break +fi +rm -f conftest.err conftest.i conftest.$ac_ext + +done +# Because of `break', _AC_PREPROC_IFELSE's cleaning code was skipped. +rm -f conftest.i conftest.err conftest.$ac_ext +if $ac_preproc_ok; then : + +else + { { $as_echo "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5 +$as_echo "$as_me: error: in \`$ac_pwd':" >&2;} +as_fn_error $? "C++ preprocessor \"$CXXCPP\" fails sanity check +See \`config.log' for more details" "$LINENO" 5; } +fi + +ac_ext=cpp +ac_cpp='$CXXCPP $CPPFLAGS' +ac_compile='$CXX -c $CXXFLAGS $CPPFLAGS conftest.$ac_ext >&5' +ac_link='$CXX -o conftest$ac_exeext $CXXFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' +ac_compiler_gnu=$ac_cv_cxx_compiler_gnu + + +ac_fn_cxx_check_header_mongrel "$LINENO" "mapnik/map.hpp" "ac_cv_header_mapnik_map_hpp" "$ac_includes_default" +if test "x$ac_cv_header_mapnik_map_hpp" = xyes; then : + +else + as_fn_error $? "mapnik/map.hpp is needed but not found - you will need to install package 'libmapnik-dev' or similar. The feature can be disabled with --disable-mapnik" "$LINENO" 5 +fi + + + fi + { $as_echo "$as_me:${as_lineno-$LINENO}: checking for main in -lmapnik" >&5 +$as_echo_n "checking for main in -lmapnik... " >&6; } +if ${ac_cv_lib_mapnik_main+:} false; then : + $as_echo_n "(cached) " >&6 +else + ac_check_lib_save_LIBS=$LIBS +LIBS="-lmapnik $LIBS" +cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ + + +int +main () +{ +return main (); + ; + return 0; +} +_ACEOF +if ac_fn_cxx_try_link "$LINENO"; then : + ac_cv_lib_mapnik_main=yes +else + ac_cv_lib_mapnik_main=no +fi +rm -f core conftest.err conftest.$ac_objext \ + conftest$ac_exeext conftest.$ac_ext +LIBS=$ac_check_lib_save_LIBS +fi +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_lib_mapnik_main" >&5 +$as_echo "$ac_cv_lib_mapnik_main" >&6; } +if test "x$ac_cv_lib_mapnik_main" = xyes; then : + cat >>confdefs.h <<_ACEOF +#define HAVE_LIBMAPNIK 1 +_ACEOF + + LIBS="-lmapnik $LIBS" + +else + as_fn_error $? "libmapnik is needed but not found." "$LINENO" 5 +fi + + { $as_echo "$as_me:${as_lineno-$LINENO}: checking for main in -lstdc++" >&5 +$as_echo_n "checking for main in -lstdc++... " >&6; } +if ${ac_cv_lib_stdcpp_main+:} false; then : + $as_echo_n "(cached) " >&6 +else + ac_check_lib_save_LIBS=$LIBS +LIBS="-lstdc++ $LIBS" +cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ + + +int +main () +{ +return main (); + ; + return 0; +} +_ACEOF +if ac_fn_cxx_try_link "$LINENO"; then : + ac_cv_lib_stdcpp_main=yes +else + ac_cv_lib_stdcpp_main=no +fi +rm -f core conftest.err conftest.$ac_objext \ + conftest$ac_exeext conftest.$ac_ext +LIBS=$ac_check_lib_save_LIBS +fi +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_lib_stdcpp_main" >&5 +$as_echo "$ac_cv_lib_stdcpp_main" >&6; } +if test "x$ac_cv_lib_stdcpp_main" = xyes; then : + cat >>confdefs.h <<_ACEOF +#define HAVE_LIBSTDC__ 1 +_ACEOF + + LIBS="-lstdc++ $LIBS" + +else + as_fn_error $? "libstdc++ is needed but not found." "$LINENO" 5 +fi + + # Required for Mapnik3 build (it's also in Mapnik2 but does not need to be specified for some reason) + # it's part of libmapnik install dependencies + { $as_echo "$as_me:${as_lineno-$LINENO}: checking for main in -licuuc" >&5 +$as_echo_n "checking for main in -licuuc... " >&6; } +if ${ac_cv_lib_icuuc_main+:} false; then : + $as_echo_n "(cached) " >&6 +else + ac_check_lib_save_LIBS=$LIBS +LIBS="-licuuc $LIBS" +cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ + + +int +main () +{ +return main (); + ; + return 0; +} +_ACEOF +if ac_fn_cxx_try_link "$LINENO"; then : + ac_cv_lib_icuuc_main=yes +else + ac_cv_lib_icuuc_main=no +fi +rm -f core conftest.err conftest.$ac_objext \ + conftest$ac_exeext conftest.$ac_ext +LIBS=$ac_check_lib_save_LIBS +fi +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_lib_icuuc_main" >&5 +$as_echo "$ac_cv_lib_icuuc_main" >&6; } +if test "x$ac_cv_lib_icuuc_main" = xyes; then : + cat >>confdefs.h <<_ACEOF +#define HAVE_LIBICUUC 1 +_ACEOF + + LIBS="-licuuc $LIBS" + +else + as_fn_error $? "libicuuc is needed but not found." "$LINENO" 5 +fi + + ac_ext=cpp +ac_cpp='$CXXCPP $CPPFLAGS' +ac_compile='$CXX -c $CXXFLAGS $CPPFLAGS conftest.$ac_ext >&5' +ac_link='$CXX -o conftest$ac_exeext $CXXFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' +ac_compiler_gnu=$ac_cv_cxx_compiler_gnu + + ;; +esac + if test x$ac_cv_enable_mapnik = xyes; then + MAPNIK_TRUE= + MAPNIK_FALSE='#' +else + MAPNIK_TRUE='#' + MAPNIK_FALSE= +fi + +### + +## WORK AROUND BROKEN autoconf - see http://lists.gnu.org/archive/html/bug-automake/2002-11/msg00020.html + +ac_ext=cpp +ac_cpp='$CXXCPP $CPPFLAGS' +ac_compile='$CXX -c $CXXFLAGS $CPPFLAGS conftest.$ac_ext >&5' +ac_link='$CXX -o conftest$ac_exeext $CXXFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' +ac_compiler_gnu=$ac_cv_cxx_compiler_gnu +if test -z "$CXX"; then + if test -n "$CCC"; then + CXX=$CCC + else + if test -n "$ac_tool_prefix"; then + for ac_prog in g++ c++ gpp aCC CC cxx cc++ cl.exe FCC KCC RCC xlC_r xlC + do + # Extract the first word of "$ac_tool_prefix$ac_prog", so it can be a program name with args. +set dummy $ac_tool_prefix$ac_prog; ac_word=$2 +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 +$as_echo_n "checking for $ac_word... " >&6; } +if ${ac_cv_prog_CXX+:} false; then : + $as_echo_n "(cached) " >&6 +else + if test -n "$CXX"; then + ac_cv_prog_CXX="$CXX" # Let the user override the test. +else +as_save_IFS=$IFS; IFS=$PATH_SEPARATOR +for as_dir in $PATH +do + IFS=$as_save_IFS + test -z "$as_dir" && as_dir=. + for ac_exec_ext in '' $ac_executable_extensions; do + if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then + ac_cv_prog_CXX="$ac_tool_prefix$ac_prog" + $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 + break 2 + fi +done + done +IFS=$as_save_IFS + +fi +fi +CXX=$ac_cv_prog_CXX +if test -n "$CXX"; then + { $as_echo "$as_me:${as_lineno-$LINENO}: result: $CXX" >&5 +$as_echo "$CXX" >&6; } +else + { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 +$as_echo "no" >&6; } +fi + + + test -n "$CXX" && break + done +fi +if test -z "$CXX"; then + ac_ct_CXX=$CXX + for ac_prog in g++ c++ gpp aCC CC cxx cc++ cl.exe FCC KCC RCC xlC_r xlC +do + # Extract the first word of "$ac_prog", so it can be a program name with args. +set dummy $ac_prog; ac_word=$2 +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 +$as_echo_n "checking for $ac_word... " >&6; } +if ${ac_cv_prog_ac_ct_CXX+:} false; then : + $as_echo_n "(cached) " >&6 +else + if test -n "$ac_ct_CXX"; then + ac_cv_prog_ac_ct_CXX="$ac_ct_CXX" # Let the user override the test. +else +as_save_IFS=$IFS; IFS=$PATH_SEPARATOR +for as_dir in $PATH +do + IFS=$as_save_IFS + test -z "$as_dir" && as_dir=. + for ac_exec_ext in '' $ac_executable_extensions; do + if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then + ac_cv_prog_ac_ct_CXX="$ac_prog" + $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 + break 2 + fi +done + done +IFS=$as_save_IFS + +fi +fi +ac_ct_CXX=$ac_cv_prog_ac_ct_CXX +if test -n "$ac_ct_CXX"; then + { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_ct_CXX" >&5 +$as_echo "$ac_ct_CXX" >&6; } +else + { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 +$as_echo "no" >&6; } +fi + + + test -n "$ac_ct_CXX" && break +done + + if test "x$ac_ct_CXX" = x; then + CXX="g++" + else + case $cross_compiling:$ac_tool_warned in +yes:) +{ $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: using cross tools not prefixed with host triplet" >&5 +$as_echo "$as_me: WARNING: using cross tools not prefixed with host triplet" >&2;} +ac_tool_warned=yes ;; +esac + CXX=$ac_ct_CXX + fi +fi + + fi +fi +# Provide some information about the compiler. +$as_echo "$as_me:${as_lineno-$LINENO}: checking for C++ compiler version" >&5 +set X $ac_compile +ac_compiler=$2 +for ac_option in --version -v -V -qversion; do + { { ac_try="$ac_compiler $ac_option >&5" +case "(($ac_try" in + *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; + *) ac_try_echo=$ac_try;; +esac +eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\"" +$as_echo "$ac_try_echo"; } >&5 + (eval "$ac_compiler $ac_option >&5") 2>conftest.err + ac_status=$? + if test -s conftest.err; then + sed '10a\ +... rest of stderr output deleted ... + 10q' conftest.err >conftest.er1 + cat conftest.er1 >&5 + fi + rm -f conftest.er1 conftest.err + $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 + test $ac_status = 0; } +done + +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking whether we are using the GNU C++ compiler" >&5 +$as_echo_n "checking whether we are using the GNU C++ compiler... " >&6; } +if ${ac_cv_cxx_compiler_gnu+:} false; then : + $as_echo_n "(cached) " >&6 +else + cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ + +int +main () +{ +#ifndef __GNUC__ + choke me +#endif + + ; + return 0; +} +_ACEOF +if ac_fn_cxx_try_compile "$LINENO"; then : + ac_compiler_gnu=yes +else + ac_compiler_gnu=no +fi +rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext +ac_cv_cxx_compiler_gnu=$ac_compiler_gnu + +fi +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_cxx_compiler_gnu" >&5 +$as_echo "$ac_cv_cxx_compiler_gnu" >&6; } +if test $ac_compiler_gnu = yes; then + GXX=yes +else + GXX= +fi +ac_test_CXXFLAGS=${CXXFLAGS+set} +ac_save_CXXFLAGS=$CXXFLAGS +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking whether $CXX accepts -g" >&5 +$as_echo_n "checking whether $CXX accepts -g... " >&6; } +if ${ac_cv_prog_cxx_g+:} false; then : + $as_echo_n "(cached) " >&6 +else + ac_save_cxx_werror_flag=$ac_cxx_werror_flag + ac_cxx_werror_flag=yes + ac_cv_prog_cxx_g=no + CXXFLAGS="-g" + cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ + +int +main () +{ + + ; + return 0; +} +_ACEOF +if ac_fn_cxx_try_compile "$LINENO"; then : + ac_cv_prog_cxx_g=yes +else + CXXFLAGS="" + cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ + +int +main () +{ + + ; + return 0; +} +_ACEOF +if ac_fn_cxx_try_compile "$LINENO"; then : + +else + ac_cxx_werror_flag=$ac_save_cxx_werror_flag + CXXFLAGS="-g" + cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ + +int +main () +{ + + ; + return 0; +} +_ACEOF +if ac_fn_cxx_try_compile "$LINENO"; then : + ac_cv_prog_cxx_g=yes +fi +rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext +fi +rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext +fi +rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext + ac_cxx_werror_flag=$ac_save_cxx_werror_flag +fi +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_prog_cxx_g" >&5 +$as_echo "$ac_cv_prog_cxx_g" >&6; } +if test "$ac_test_CXXFLAGS" = set; then + CXXFLAGS=$ac_save_CXXFLAGS +elif test $ac_cv_prog_cxx_g = yes; then + if test "$GXX" = yes; then + CXXFLAGS="-g -O2" + else + CXXFLAGS="-g" + fi +else + if test "$GXX" = yes; then + CXXFLAGS="-O2" + else + CXXFLAGS= + fi +fi +ac_ext=cpp +ac_cpp='$CXXCPP $CPPFLAGS' +ac_compile='$CXX -c $CXXFLAGS $CPPFLAGS conftest.$ac_ext >&5' +ac_link='$CXX -o conftest$ac_exeext $CXXFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' +ac_compiler_gnu=$ac_cv_cxx_compiler_gnu + +depcc="$CXX" am_compiler_list= + +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking dependency style of $depcc" >&5 +$as_echo_n "checking dependency style of $depcc... " >&6; } +if ${am_cv_CXX_dependencies_compiler_type+:} false; then : + $as_echo_n "(cached) " >&6 +else + if test -z "$AMDEP_TRUE" && test -f "$am_depcomp"; then + # We make a subdir and do the tests there. Otherwise we can end up + # making bogus files that we don't know about and never remove. For + # instance it was reported that on HP-UX the gcc test will end up + # making a dummy file named 'D' -- because '-MD' means "put the output + # in D". + rm -rf conftest.dir + mkdir conftest.dir + # Copy depcomp to subdir because otherwise we won't find it if we're + # using a relative directory. + cp "$am_depcomp" conftest.dir + cd conftest.dir + # We will build objects and dependencies in a subdirectory because + # it helps to detect inapplicable dependency modes. For instance + # both Tru64's cc and ICC support -MD to output dependencies as a + # side effect of compilation, but ICC will put the dependencies in + # the current directory while Tru64 will put them in the object + # directory. + mkdir sub + + am_cv_CXX_dependencies_compiler_type=none + if test "$am_compiler_list" = ""; then + am_compiler_list=`sed -n 's/^#*\([a-zA-Z0-9]*\))$/\1/p' < ./depcomp` + fi + am__universal=false + case " $depcc " in #( + *\ -arch\ *\ -arch\ *) am__universal=true ;; + esac + + for depmode in $am_compiler_list; do + # Setup a source with many dependencies, because some compilers + # like to wrap large dependency lists on column 80 (with \), and + # we should not choose a depcomp mode which is confused by this. + # + # We need to recreate these files for each test, as the compiler may + # overwrite some of them when testing with obscure command lines. + # This happens at least with the AIX C compiler. + : > sub/conftest.c + for i in 1 2 3 4 5 6; do + echo '#include "conftst'$i'.h"' >> sub/conftest.c + # Using ": > sub/conftst$i.h" creates only sub/conftst1.h with + # Solaris 10 /bin/sh. + echo '/* dummy */' > sub/conftst$i.h + done + echo "${am__include} ${am__quote}sub/conftest.Po${am__quote}" > confmf + + # We check with '-c' and '-o' for the sake of the "dashmstdout" + # mode. It turns out that the SunPro C++ compiler does not properly + # handle '-M -o', and we need to detect this. Also, some Intel + # versions had trouble with output in subdirs. + am__obj=sub/conftest.${OBJEXT-o} + am__minus_obj="-o $am__obj" + case $depmode in + gcc) + # This depmode causes a compiler race in universal mode. + test "$am__universal" = false || continue + ;; + nosideeffect) + # After this tag, mechanisms are not by side-effect, so they'll + # only be used when explicitly requested. + if test "x$enable_dependency_tracking" = xyes; then + continue + else + break + fi + ;; + msvc7 | msvc7msys | msvisualcpp | msvcmsys) + # This compiler won't grok '-c -o', but also, the minuso test has + # not run yet. These depmodes are late enough in the game, and + # so weak that their functioning should not be impacted. + am__obj=conftest.${OBJEXT-o} + am__minus_obj= + ;; + none) break ;; + esac + if depmode=$depmode \ + source=sub/conftest.c object=$am__obj \ + depfile=sub/conftest.Po tmpdepfile=sub/conftest.TPo \ + $SHELL ./depcomp $depcc -c $am__minus_obj sub/conftest.c \ + >/dev/null 2>conftest.err && + grep sub/conftst1.h sub/conftest.Po > /dev/null 2>&1 && + grep sub/conftst6.h sub/conftest.Po > /dev/null 2>&1 && + grep $am__obj sub/conftest.Po > /dev/null 2>&1 && + ${MAKE-make} -s -f confmf > /dev/null 2>&1; then + # icc doesn't choke on unknown options, it will just issue warnings + # or remarks (even with -Werror). So we grep stderr for any message + # that says an option was ignored or not supported. + # When given -MP, icc 7.0 and 7.1 complain thusly: + # icc: Command line warning: ignoring option '-M'; no argument required + # The diagnosis changed in icc 8.0: + # icc: Command line remark: option '-MP' not supported + if (grep 'ignoring option' conftest.err || + grep 'not supported' conftest.err) >/dev/null 2>&1; then :; else + am_cv_CXX_dependencies_compiler_type=$depmode + break + fi + fi + done + + cd .. + rm -rf conftest.dir +else + am_cv_CXX_dependencies_compiler_type=none +fi + +fi +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $am_cv_CXX_dependencies_compiler_type" >&5 +$as_echo "$am_cv_CXX_dependencies_compiler_type" >&6; } +CXXDEPMODE=depmode=$am_cv_CXX_dependencies_compiler_type + + if + test "x$enable_dependency_tracking" != xno \ + && test "$am_cv_CXX_dependencies_compiler_type" = gcc3; then + am__fastdepCXX_TRUE= + am__fastdepCXX_FALSE='#' +else + am__fastdepCXX_TRUE='#' + am__fastdepCXX_FALSE= +fi + + + +## + + +# Check whether --with-mapbox_access_token was given. +if test "${with_mapbox_access_token+set}" = set; then : + withval=$with_mapbox_access_token; VIK_CONFIG_MAPBOX_TOKEN="\"${withval}\"" +else + VIK_CONFIG_MAPBOX_TOKEN="\"pk.eyJ1Ijoicndub3JyaXMiLCJhIjoiY2lxc294anN2MDA5bWhzbWFseWsxMW1ydiJ9.HcybKtZsiG6RVuOHg481Kg\"" +fi + + +cat >>confdefs.h <<_ACEOF +#define VIK_CONFIG_MAPBOX_TOKEN ${VIK_CONFIG_MAPBOX_TOKEN} +_ACEOF + + + + +# Check whether --with-thunderforest_apikey was given. +if test "${with_thunderforest_apikey+set}" = set; then : + withval=$with_thunderforest_apikey; VIK_CONFIG_THUNDERFOREST_KEY="\"${withval}\"" +else + VIK_CONFIG_THUNDERFOREST_KEY="\"7387c111d85642b18f63608bd4cb8b4f\"" +fi + + +cat >>confdefs.h <<_ACEOF +#define VIK_CONFIG_THUNDERFOREST_KEY ${VIK_CONFIG_THUNDERFOREST_KEY} +_ACEOF + + + +# Check whether --with-geonames_username was given. +if test "${with_geonames_username+set}" = set; then : + withval=$with_geonames_username; VIK_CONFIG_GEONAMES_USERNAME="\"${withval}\"" +else + VIK_CONFIG_GEONAMES_USERNAME="\"$PACKAGE\"" +fi + + +cat >>confdefs.h <<_ACEOF +#define VIK_CONFIG_GEONAMES_USERNAME ${VIK_CONFIG_GEONAMES_USERNAME} +_ACEOF + + + + +# Check whether --with-mapcache was given. +if test "${with_mapcache+set}" = set; then : + withval=$with_mapcache; if test "x$withval" = "xno"; then + VIK_CONFIG_MAPCACHE_SIZE=0; + elif test "x$withval" = "xyes"; then + as_fn_error $? "Please, set a value for size of the map cache in MB" "$LINENO" 5 + else + VIK_CONFIG_MAPCACHE_SIZE=${withval} + fi +else + VIK_CONFIG_MAPCACHE_SIZE=128 +fi + + +cat >>confdefs.h <<_ACEOF +#define VIK_CONFIG_MAPCACHE_SIZE ${VIK_CONFIG_MAPCACHE_SIZE} +_ACEOF + + + + +# Check whether --with-tileage was given. +if test "${with_tileage+set}" = set; then : + withval=$with_tileage; if test "x$withval" = "xno"; then + VIK_CONFIG_DEFAULT_TILE_AGE=0; + elif test "x$withval" = "xyes"; then + as_fn_error $? "Please, set a value for age of tiles" "$LINENO" 5 + else + VIK_CONFIG_DEFAULT_TILE_AGE=${withval} + fi +else + VIK_CONFIG_DEFAULT_TILE_AGE=604800 +fi + + +cat >>confdefs.h <<_ACEOF +#define VIK_CONFIG_DEFAULT_TILE_AGE ${VIK_CONFIG_DEFAULT_TILE_AGE} +_ACEOF + + +$as_echo "#define HAVE_VIKING 1" >>confdefs.h + + +if test -r /usr/share/xml/docbook/stylesheet/docbook-xsl/manpages/docbook.xsl; then + DB2MAN_XSL=/usr/share/xml/docbook/stylesheet/docbook-xsl/manpages/docbook.xsl +elif test -r /usr/share/sgml/docbook/xsl-stylesheets/manpages/docbook.xsl; then + DB2MAN_XSL=/usr/share/sgml/docbook/xsl-stylesheets/manpages/docbook.xsl +else + DB2MAN_XSL=/usr/share/sgml/docbook/stylesheet/xsl/nwalsh/manpages/docbook.xsl +fi + +# Extract the first word of "xsltproc", so it can be a program name with args. +set dummy xsltproc; ac_word=$2 +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 +$as_echo_n "checking for $ac_word... " >&6; } +if ${ac_cv_path_XP+:} false; then : + $as_echo_n "(cached) " >&6 +else + case $XP in + [\\/]* | ?:[\\/]*) + ac_cv_path_XP="$XP" # Let the user override the test with a path. + ;; + *) + as_save_IFS=$IFS; IFS=$PATH_SEPARATOR +for as_dir in $PATH +do + IFS=$as_save_IFS + test -z "$as_dir" && as_dir=. + for ac_exec_ext in '' $ac_executable_extensions; do + if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then + ac_cv_path_XP="$as_dir/$ac_word$ac_exec_ext" + $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 + break 2 + fi +done + done +IFS=$as_save_IFS + + ;; +esac +fi +XP=$ac_cv_path_XP +if test -n "$XP"; then + { $as_echo "$as_me:${as_lineno-$LINENO}: result: $XP" >&5 +$as_echo "$XP" >&6; } +else + { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 +$as_echo "no" >&6; } +fi + + + if test "x$XP" != "x"; then + HAVE_XSLTPROC_TRUE= + HAVE_XSLTPROC_FALSE='#' +else + HAVE_XSLTPROC_TRUE='#' + HAVE_XSLTPROC_FALSE= +fi + +# Extract the first word of "scrollkeeper-config", so it can be a program name with args. +set dummy scrollkeeper-config; ac_word=$2 +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 +$as_echo_n "checking for $ac_word... " >&6; } +if ${ac_cv_prog_HAVE_SCROLLKEEPER+:} false; then : + $as_echo_n "(cached) " >&6 +else + if test -n "$HAVE_SCROLLKEEPER"; then + ac_cv_prog_HAVE_SCROLLKEEPER="$HAVE_SCROLLKEEPER" # Let the user override the test. +else +as_save_IFS=$IFS; IFS=$PATH_SEPARATOR +for as_dir in $PATH +do + IFS=$as_save_IFS + test -z "$as_dir" && as_dir=. + for ac_exec_ext in '' $ac_executable_extensions; do + if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then + ac_cv_prog_HAVE_SCROLLKEEPER=""yes"" + $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 + break 2 + fi +done + done +IFS=$as_save_IFS + +fi +fi +HAVE_SCROLLKEEPER=$ac_cv_prog_HAVE_SCROLLKEEPER +if test -n "$HAVE_SCROLLKEEPER"; then + { $as_echo "$as_me:${as_lineno-$LINENO}: result: $HAVE_SCROLLKEEPER" >&5 +$as_echo "$HAVE_SCROLLKEEPER" >&6; } +else + { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 +$as_echo "no" >&6; } +fi + + + if test "x$XP" != "x" && test -r "$DB2MAN_XSL" && test "${HAVE_SCROLLKEEPER}" = "yes" ; then + GEN_MANPAGES_TRUE= + GEN_MANPAGES_FALSE='#' +else + GEN_MANPAGES_TRUE='#' + GEN_MANPAGES_FALSE= +fi + +if test -z "$GEN_MANPAGES_TRUE"; then : + ac_cv_enable_man=yes +else + ac_cv_enable_man=no +fi + +ISODATE="$(date --utc --date="@${SOURCE_DATE_EPOCH:-$(date +%s)}" +%Y-%m-%d)" + + + +cat >>confdefs.h <<_ACEOF +#define THEYEAR "$(date --utc --date="@${SOURCE_DATE_EPOCH:-$(date +%s)}" +%Y)" +_ACEOF + + +# Configuration +ac_config_files="$ac_config_files viking.spec mingw-viking.spec mingw64-viking.spec Makefile src/Makefile src/icons/Makefile po/Makefile.in data/Makefile tools/Makefile test/Makefile help/Makefile help/viking.xml windows/Makefile windows/installer/Makefile windows/installer/pixmaps/Makefile windows/installer/translations/Makefile doc/Makefile doc/reference/Makefile doc/examples/Makefile" + + +cat >confcache <<\_ACEOF +# 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, see configure's option --config-cache. +# It is not useful on other systems. If it contains results you don't +# want to keep, you may remove or edit it. +# +# config.status only pays attention to the cache file if you give it +# the --recheck option to rerun configure. +# +# `ac_cv_env_foo' variables (set or unset) will be overridden when +# loading this file, other *unset* `ac_cv_foo' will be assigned the +# following values. + +_ACEOF + +# The following way of writing the cache mishandles newlines in values, +# but we know of no workaround that is simple, portable, and efficient. +# So, we kill variables containing newlines. +# 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. +( + for ac_var in `(set) 2>&1 | sed -n 's/^\([a-zA-Z_][a-zA-Z0-9_]*\)=.*/\1/p'`; do + eval ac_val=\$$ac_var + case $ac_val in #( + *${as_nl}*) + case $ac_var in #( + *_cv_*) { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: cache variable $ac_var contains a newline" >&5 +$as_echo "$as_me: WARNING: cache variable $ac_var contains a newline" >&2;} ;; + esac + case $ac_var in #( + _ | IFS | as_nl) ;; #( + BASH_ARGV | BASH_SOURCE) eval $ac_var= ;; #( + *) { eval $ac_var=; unset $ac_var;} ;; + esac ;; + esac + done + + (set) 2>&1 | + case $as_nl`(ac_space=' '; set) 2>&1` in #( + *${as_nl}ac_space=\ *) + # `set' does not quote correctly, so add quotes: double-quote + # substitution turns \\\\ into \\, and sed turns \\ into \. + sed -n \ + "s/'/'\\\\''/g; + s/^\\([_$as_cr_alnum]*_cv_[_$as_cr_alnum]*\\)=\\(.*\\)/\\1='\\2'/p" + ;; #( + *) + # `set' quotes correctly as required by POSIX, so do not add quotes. + sed -n "/^[_$as_cr_alnum]*_cv_[_$as_cr_alnum]*=/p" + ;; + esac | + sort +) | + sed ' + /^ac_cv_env_/b end + t clear + :clear + s/^\([^=]*\)=\(.*[{}].*\)$/test "${\1+set}" = set || &/ + t end + s/^\([^=]*\)=\(.*\)$/\1=${\1=\2}/ + :end' >>confcache +if diff "$cache_file" confcache >/dev/null 2>&1; then :; else + if test -w "$cache_file"; then + if test "x$cache_file" != "x/dev/null"; then + { $as_echo "$as_me:${as_lineno-$LINENO}: updating cache $cache_file" >&5 +$as_echo "$as_me: updating cache $cache_file" >&6;} + if test ! -f "$cache_file" || test -h "$cache_file"; then + cat confcache >"$cache_file" + else + case $cache_file in #( + */* | ?:*) + mv -f confcache "$cache_file"$$ && + mv -f "$cache_file"$$ "$cache_file" ;; #( + *) + mv -f confcache "$cache_file" ;; + esac + fi + fi + else + { $as_echo "$as_me:${as_lineno-$LINENO}: not updating unwritable cache $cache_file" >&5 +$as_echo "$as_me: not updating unwritable cache $cache_file" >&6;} + fi +fi +rm -f confcache + +test "x$prefix" = xNONE && prefix=$ac_default_prefix +# Let make expand exec_prefix. +test "x$exec_prefix" = xNONE && exec_prefix='${prefix}' + +DEFS=-DHAVE_CONFIG_H + +ac_libobjs= +ac_ltlibobjs= +U= +for ac_i in : $LIBOBJS; do test "x$ac_i" = x: && continue + # 1. Remove the extension, and $U if already installed. + ac_script='s/\$U\././;s/\.o$//;s/\.obj$//' + ac_i=`$as_echo "$ac_i" | sed "$ac_script"` + # 2. Prepend LIBOBJDIR. When used with automake>=1.10 LIBOBJDIR + # will be set to the directory where LIBOBJS objects are built. + as_fn_append ac_libobjs " \${LIBOBJDIR}$ac_i\$U.$ac_objext" + as_fn_append ac_ltlibobjs " \${LIBOBJDIR}$ac_i"'$U.lo' +done +LIBOBJS=$ac_libobjs + +LTLIBOBJS=$ac_ltlibobjs + + +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking that generated files are newer than configure" >&5 +$as_echo_n "checking that generated files are newer than configure... " >&6; } + if test -n "$am_sleep_pid"; then + # Hide warnings about reused PIDs. + wait $am_sleep_pid 2>/dev/null + fi + { $as_echo "$as_me:${as_lineno-$LINENO}: result: done" >&5 +$as_echo "done" >&6; } + if test -n "$EXEEXT"; then + am__EXEEXT_TRUE= + am__EXEEXT_FALSE='#' +else + am__EXEEXT_TRUE='#' + am__EXEEXT_FALSE= +fi + +if test -z "${HAVE_GTK_DOC_TRUE}" && test -z "${HAVE_GTK_DOC_FALSE}"; then + as_fn_error $? "conditional \"HAVE_GTK_DOC\" was never defined. +Usually this means the macro was only invoked conditionally." "$LINENO" 5 +fi +if test -z "${ENABLE_GTK_DOC_TRUE}" && test -z "${ENABLE_GTK_DOC_FALSE}"; then + as_fn_error $? "conditional \"ENABLE_GTK_DOC\" was never defined. +Usually this means the macro was only invoked conditionally." "$LINENO" 5 +fi +if test -z "${GTK_DOC_BUILD_HTML_TRUE}" && test -z "${GTK_DOC_BUILD_HTML_FALSE}"; then + as_fn_error $? "conditional \"GTK_DOC_BUILD_HTML\" was never defined. +Usually this means the macro was only invoked conditionally." "$LINENO" 5 +fi +if test -z "${GTK_DOC_BUILD_PDF_TRUE}" && test -z "${GTK_DOC_BUILD_PDF_FALSE}"; then + as_fn_error $? "conditional \"GTK_DOC_BUILD_PDF\" was never defined. +Usually this means the macro was only invoked conditionally." "$LINENO" 5 +fi +if test -z "${GTK_DOC_USE_LIBTOOL_TRUE}" && test -z "${GTK_DOC_USE_LIBTOOL_FALSE}"; then + as_fn_error $? "conditional \"GTK_DOC_USE_LIBTOOL\" was never defined. +Usually this means the macro was only invoked conditionally." "$LINENO" 5 +fi +if test -z "${GTK_DOC_USE_REBASE_TRUE}" && test -z "${GTK_DOC_USE_REBASE_FALSE}"; then + as_fn_error $? "conditional \"GTK_DOC_USE_REBASE\" was never defined. +Usually this means the macro was only invoked conditionally." "$LINENO" 5 +fi +if test -z "${AMDEP_TRUE}" && test -z "${AMDEP_FALSE}"; then + as_fn_error $? "conditional \"AMDEP\" was never defined. +Usually this means the macro was only invoked conditionally." "$LINENO" 5 +fi +if test -z "${am__fastdepCC_TRUE}" && test -z "${am__fastdepCC_FALSE}"; then + as_fn_error $? "conditional \"am__fastdepCC\" was never defined. +Usually this means the macro was only invoked conditionally." "$LINENO" 5 +fi + + ac_config_commands="$ac_config_commands po/stamp-it" + + +if test -z "${WINDOWS_TRUE}" && test -z "${WINDOWS_FALSE}"; then + as_fn_error $? "conditional \"WINDOWS\" was never defined. +Usually this means the macro was only invoked conditionally." "$LINENO" 5 +fi +if test -z "${EXPAT_INSTALLED_TRUE}" && test -z "${EXPAT_INSTALLED_FALSE}"; then + as_fn_error $? "conditional \"EXPAT_INSTALLED\" was never defined. +Usually this means the macro was only invoked conditionally." "$LINENO" 5 +fi +if test -z "${ENABLE_SK_TRUE}" && test -z "${ENABLE_SK_FALSE}"; then + as_fn_error $? "conditional \"ENABLE_SK\" was never defined. +Usually this means the macro was only invoked conditionally." "$LINENO" 5 +fi +if test -z "${HAVE_GNOME_DOC_UTILS_TRUE}" && test -z "${HAVE_GNOME_DOC_UTILS_FALSE}"; then + as_fn_error $? "conditional \"HAVE_GNOME_DOC_UTILS\" was never defined. +Usually this means the macro was only invoked conditionally." "$LINENO" 5 +fi +if test -z "${BING_TRUE}" && test -z "${BING_FALSE}"; then + as_fn_error $? "conditional \"BING\" was never defined. +Usually this means the macro was only invoked conditionally." "$LINENO" 5 +fi +if test -z "${GOOGLE_TRUE}" && test -z "${GOOGLE_FALSE}"; then + as_fn_error $? "conditional \"GOOGLE\" was never defined. +Usually this means the macro was only invoked conditionally." "$LINENO" 5 +fi +if test -z "${TERRASERVER_TRUE}" && test -z "${TERRASERVER_FALSE}"; then + as_fn_error $? "conditional \"TERRASERVER\" was never defined. +Usually this means the macro was only invoked conditionally." "$LINENO" 5 +fi +if test -z "${EXPEDIA_TRUE}" && test -z "${EXPEDIA_FALSE}"; then + as_fn_error $? "conditional \"EXPEDIA\" was never defined. +Usually this means the macro was only invoked conditionally." "$LINENO" 5 +fi +if test -z "${OPENSTREETMAP_TRUE}" && test -z "${OPENSTREETMAP_FALSE}"; then + as_fn_error $? "conditional \"OPENSTREETMAP\" was never defined. +Usually this means the macro was only invoked conditionally." "$LINENO" 5 +fi +if test -z "${BLUEMARBLE_TRUE}" && test -z "${BLUEMARBLE_FALSE}"; then + as_fn_error $? "conditional \"BLUEMARBLE\" was never defined. +Usually this means the macro was only invoked conditionally." "$LINENO" 5 +fi +if test -z "${GEONAMES_TRUE}" && test -z "${GEONAMES_FALSE}"; then + as_fn_error $? "conditional \"GEONAMES\" was never defined. +Usually this means the macro was only invoked conditionally." "$LINENO" 5 +fi +if test -z "${GEOCACHES_TRUE}" && test -z "${GEOCACHES_FALSE}"; then + as_fn_error $? "conditional \"GEOCACHES\" was never defined. +Usually this means the macro was only invoked conditionally." "$LINENO" 5 +fi +if test -z "${GEOCLUE_TRUE}" && test -z "${GEOCLUE_FALSE}"; then + as_fn_error $? "conditional \"GEOCLUE\" was never defined. +Usually this means the macro was only invoked conditionally." "$LINENO" 5 +fi +if test -z "${GEOTAG_TRUE}" && test -z "${GEOTAG_FALSE}"; then + as_fn_error $? "conditional \"GEOTAG\" was never defined. +Usually this means the macro was only invoked conditionally." "$LINENO" 5 +fi +if test -z "${GEXIV2_TRUE}" && test -z "${GEXIV2_FALSE}"; then + as_fn_error $? "conditional \"GEXIV2\" was never defined. +Usually this means the macro was only invoked conditionally." "$LINENO" 5 +fi +if test -z "${LIBEXIF_TRUE}" && test -z "${LIBEXIF_FALSE}"; then + as_fn_error $? "conditional \"LIBEXIF\" was never defined. +Usually this means the macro was only invoked conditionally." "$LINENO" 5 +fi +if test -z "${DEM24K_TRUE}" && test -z "${DEM24K_FALSE}"; then + as_fn_error $? "conditional \"DEM24K\" was never defined. +Usually this means the macro was only invoked conditionally." "$LINENO" 5 +fi +if test -z "${OAUTH_TRUE}" && test -z "${OAUTH_FALSE}"; then + as_fn_error $? "conditional \"OAUTH\" was never defined. +Usually this means the macro was only invoked conditionally." "$LINENO" 5 +fi +if test -z "${REALTIME_GPS_TRACKING_TRUE}" && test -z "${REALTIME_GPS_TRACKING_FALSE}"; then + as_fn_error $? "conditional \"REALTIME_GPS_TRACKING\" was never defined. +Usually this means the macro was only invoked conditionally." "$LINENO" 5 +fi +if test -z "${BZIP2_TRUE}" && test -z "${BZIP2_FALSE}"; then + as_fn_error $? "conditional \"BZIP2\" was never defined. +Usually this means the macro was only invoked conditionally." "$LINENO" 5 +fi +if test -z "${MAGIC_TRUE}" && test -z "${MAGIC_FALSE}"; then + as_fn_error $? "conditional \"MAGIC\" was never defined. +Usually this means the macro was only invoked conditionally." "$LINENO" 5 +fi +if test -z "${SQLITE_TRUE}" && test -z "${SQLITE_FALSE}"; then + as_fn_error $? "conditional \"SQLITE\" was never defined. +Usually this means the macro was only invoked conditionally." "$LINENO" 5 +fi +if test -z "${ZIP_TRUE}" && test -z "${ZIP_FALSE}"; then + as_fn_error $? "conditional \"ZIP\" was never defined. +Usually this means the macro was only invoked conditionally." "$LINENO" 5 +fi +if test -z "${MD5_HASH_TRUE}" && test -z "${MD5_HASH_FALSE}"; then + as_fn_error $? "conditional \"MD5_HASH\" was never defined. +Usually this means the macro was only invoked conditionally." "$LINENO" 5 +fi +if test -z "${am__fastdepCXX_TRUE}" && test -z "${am__fastdepCXX_FALSE}"; then + as_fn_error $? "conditional \"am__fastdepCXX\" was never defined. +Usually this means the macro was only invoked conditionally." "$LINENO" 5 +fi +if test -z "${MAPNIK_TRUE}" && test -z "${MAPNIK_FALSE}"; then + as_fn_error $? "conditional \"MAPNIK\" was never defined. +Usually this means the macro was only invoked conditionally." "$LINENO" 5 +fi +if test -z "${am__fastdepCXX_TRUE}" && test -z "${am__fastdepCXX_FALSE}"; then + as_fn_error $? "conditional \"am__fastdepCXX\" was never defined. +Usually this means the macro was only invoked conditionally." "$LINENO" 5 +fi +if test -z "${HAVE_XSLTPROC_TRUE}" && test -z "${HAVE_XSLTPROC_FALSE}"; then + as_fn_error $? "conditional \"HAVE_XSLTPROC\" was never defined. +Usually this means the macro was only invoked conditionally." "$LINENO" 5 +fi +if test -z "${GEN_MANPAGES_TRUE}" && test -z "${GEN_MANPAGES_FALSE}"; then + as_fn_error $? "conditional \"GEN_MANPAGES\" was never defined. +Usually this means the macro was only invoked conditionally." "$LINENO" 5 +fi + +: "${CONFIG_STATUS=./config.status}" +ac_write_fail=0 +ac_clean_files_save=$ac_clean_files +ac_clean_files="$ac_clean_files $CONFIG_STATUS" +{ $as_echo "$as_me:${as_lineno-$LINENO}: creating $CONFIG_STATUS" >&5 +$as_echo "$as_me: creating $CONFIG_STATUS" >&6;} +as_write_fail=0 +cat >$CONFIG_STATUS <<_ASEOF || as_write_fail=1 +#! $SHELL +# Generated by $as_me. +# Run this file to recreate the current configuration. +# Compiler output produced by configure, useful for debugging +# configure, is in config.log if it exists. + +debug=false +ac_cs_recheck=false +ac_cs_silent=false + +SHELL=\${CONFIG_SHELL-$SHELL} +export SHELL +_ASEOF +cat >>$CONFIG_STATUS <<\_ASEOF || as_write_fail=1 +## -------------------- ## +## M4sh Initialization. ## +## -------------------- ## + +# Be more Bourne compatible +DUALCASE=1; export DUALCASE # for MKS sh +if test -n "${ZSH_VERSION+set}" && (emulate sh) >/dev/null 2>&1; then : + emulate sh + NULLCMD=: + # Pre-4.2 versions of Zsh do word splitting on ${1+"$@"}, which + # is contrary to our usage. Disable this feature. + alias -g '${1+"$@"}'='"$@"' + setopt NO_GLOB_SUBST +else + case `(set -o) 2>/dev/null` in #( + *posix*) : + set -o posix ;; #( + *) : + ;; +esac +fi + + +as_nl=' +' +export as_nl +# Printing a long string crashes Solaris 7 /usr/bin/printf. +as_echo='\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\' +as_echo=$as_echo$as_echo$as_echo$as_echo$as_echo +as_echo=$as_echo$as_echo$as_echo$as_echo$as_echo$as_echo +# Prefer a ksh shell builtin over an external printf program on Solaris, +# but without wasting forks for bash or zsh. +if test -z "$BASH_VERSION$ZSH_VERSION" \ + && (test "X`print -r -- $as_echo`" = "X$as_echo") 2>/dev/null; then + as_echo='print -r --' + as_echo_n='print -rn --' +elif (test "X`printf %s $as_echo`" = "X$as_echo") 2>/dev/null; then + as_echo='printf %s\n' + as_echo_n='printf %s' +else + if test "X`(/usr/ucb/echo -n -n $as_echo) 2>/dev/null`" = "X-n $as_echo"; then + as_echo_body='eval /usr/ucb/echo -n "$1$as_nl"' + as_echo_n='/usr/ucb/echo -n' + else + as_echo_body='eval expr "X$1" : "X\\(.*\\)"' + as_echo_n_body='eval + arg=$1; + case $arg in #( + *"$as_nl"*) + expr "X$arg" : "X\\(.*\\)$as_nl"; + arg=`expr "X$arg" : ".*$as_nl\\(.*\\)"`;; + esac; + expr "X$arg" : "X\\(.*\\)" | tr -d "$as_nl" + ' + export as_echo_n_body + as_echo_n='sh -c $as_echo_n_body as_echo' + fi + export as_echo_body + as_echo='sh -c $as_echo_body as_echo' +fi + +# The user is always right. +if test "${PATH_SEPARATOR+set}" != set; then + PATH_SEPARATOR=: + (PATH='/bin;/bin'; FPATH=$PATH; sh -c :) >/dev/null 2>&1 && { + (PATH='/bin:/bin'; FPATH=$PATH; sh -c :) >/dev/null 2>&1 || + PATH_SEPARATOR=';' + } +fi + + +# IFS +# We need space, tab and new line, in precisely that order. Quoting is +# there to prevent editors from complaining about space-tab. +# (If _AS_PATH_WALK were called with IFS unset, it would disable word +# splitting by setting IFS to empty value.) +IFS=" "" $as_nl" + +# Find who we are. Look in the path if we contain no directory separator. +as_myself= +case $0 in #(( + *[\\/]* ) as_myself=$0 ;; + *) as_save_IFS=$IFS; IFS=$PATH_SEPARATOR +for as_dir in $PATH +do + IFS=$as_save_IFS + test -z "$as_dir" && as_dir=. + test -r "$as_dir/$0" && as_myself=$as_dir/$0 && break + done +IFS=$as_save_IFS + + ;; +esac +# We did not find ourselves, most probably we were run as `sh COMMAND' +# in which case we are not to be found in the path. +if test "x$as_myself" = x; then + as_myself=$0 +fi +if test ! -f "$as_myself"; then + $as_echo "$as_myself: error: cannot find myself; rerun with an absolute file name" >&2 + exit 1 +fi + +# Unset variables that we do not need and which cause bugs (e.g. in +# pre-3.0 UWIN ksh). But do not cause bugs in bash 2.01; the "|| exit 1" +# suppresses any "Segmentation fault" message there. '((' could +# trigger a bug in pdksh 5.2.14. +for as_var in BASH_ENV ENV MAIL MAILPATH +do eval test x\${$as_var+set} = xset \ + && ( (unset $as_var) || exit 1) >/dev/null 2>&1 && unset $as_var || : +done +PS1='$ ' +PS2='> ' +PS4='+ ' + +# NLS nuisances. +LC_ALL=C +export LC_ALL +LANGUAGE=C +export LANGUAGE + +# CDPATH. +(unset CDPATH) >/dev/null 2>&1 && unset CDPATH + + +# as_fn_error STATUS ERROR [LINENO LOG_FD] +# ---------------------------------------- +# Output "`basename $0`: error: ERROR" to stderr. If LINENO and LOG_FD are +# provided, also output the error to LOG_FD, referencing LINENO. Then exit the +# script with STATUS, using 1 if that was 0. +as_fn_error () +{ + as_status=$1; test $as_status -eq 0 && as_status=1 + if test "$4"; then + as_lineno=${as_lineno-"$3"} as_lineno_stack=as_lineno_stack=$as_lineno_stack + $as_echo "$as_me:${as_lineno-$LINENO}: error: $2" >&$4 + fi + $as_echo "$as_me: error: $2" >&2 + as_fn_exit $as_status +} # as_fn_error + + +# as_fn_set_status STATUS +# ----------------------- +# Set $? to STATUS, without forking. +as_fn_set_status () +{ + return $1 +} # as_fn_set_status + +# as_fn_exit STATUS +# ----------------- +# Exit the shell with STATUS, even in a "trap 0" or "set -e" context. +as_fn_exit () +{ + set +e + as_fn_set_status $1 + exit $1 +} # as_fn_exit + +# as_fn_unset VAR +# --------------- +# Portably unset VAR. +as_fn_unset () +{ + { eval $1=; unset $1;} +} +as_unset=as_fn_unset +# as_fn_append VAR VALUE +# ---------------------- +# Append the text in VALUE to the end of the definition contained in VAR. Take +# advantage of any shell optimizations that allow amortized linear growth over +# repeated appends, instead of the typical quadratic growth present in naive +# implementations. +if (eval "as_var=1; as_var+=2; test x\$as_var = x12") 2>/dev/null; then : + eval 'as_fn_append () + { + eval $1+=\$2 + }' +else + as_fn_append () + { + eval $1=\$$1\$2 + } +fi # as_fn_append + +# as_fn_arith ARG... +# ------------------ +# Perform arithmetic evaluation on the ARGs, and store the result in the +# global $as_val. Take advantage of shells that can avoid forks. The arguments +# must be portable across $(()) and expr. +if (eval "test \$(( 1 + 1 )) = 2") 2>/dev/null; then : + eval 'as_fn_arith () + { + as_val=$(( $* )) + }' +else + as_fn_arith () + { + as_val=`expr "$@" || test $? -eq 1` + } +fi # as_fn_arith + + +if expr a : '\(a\)' >/dev/null 2>&1 && + test "X`expr 00001 : '.*\(...\)'`" = X001; then + as_expr=expr +else + as_expr=false +fi + +if (basename -- /) >/dev/null 2>&1 && test "X`basename -- / 2>&1`" = "X/"; then + as_basename=basename +else + as_basename=false +fi + +if (as_dir=`dirname -- /` && test "X$as_dir" = X/) >/dev/null 2>&1; then + as_dirname=dirname +else + as_dirname=false +fi + +as_me=`$as_basename -- "$0" || +$as_expr X/"$0" : '.*/\([^/][^/]*\)/*$' \| \ + X"$0" : 'X\(//\)$' \| \ + X"$0" : 'X\(/\)' \| . 2>/dev/null || +$as_echo X/"$0" | + sed '/^.*\/\([^/][^/]*\)\/*$/{ + s//\1/ + q + } + /^X\/\(\/\/\)$/{ + s//\1/ + q + } + /^X\/\(\/\).*/{ + s//\1/ + q + } + s/.*/./; q'` + +# Avoid depending upon Character Ranges. +as_cr_letters='abcdefghijklmnopqrstuvwxyz' +as_cr_LETTERS='ABCDEFGHIJKLMNOPQRSTUVWXYZ' +as_cr_Letters=$as_cr_letters$as_cr_LETTERS +as_cr_digits='0123456789' +as_cr_alnum=$as_cr_Letters$as_cr_digits + +ECHO_C= ECHO_N= ECHO_T= +case `echo -n x` in #((((( +-n*) + case `echo 'xy\c'` in + *c*) ECHO_T=' ';; # ECHO_T is single tab character. + xy) ECHO_C='\c';; + *) echo `echo ksh88 bug on AIX 6.1` > /dev/null + ECHO_T=' ';; + esac;; +*) + ECHO_N='-n';; +esac + +rm -f conf$$ conf$$.exe conf$$.file +if test -d conf$$.dir; then + rm -f conf$$.dir/conf$$.file +else + rm -f conf$$.dir + mkdir conf$$.dir 2>/dev/null +fi +if (echo >conf$$.file) 2>/dev/null; then + if ln -s conf$$.file conf$$ 2>/dev/null; then + as_ln_s='ln -s' + # ... but there are two gotchas: + # 1) On MSYS, both `ln -s file dir' and `ln file dir' fail. + # 2) DJGPP < 2.04 has no symlinks; `ln -s' creates a wrapper executable. + # In both cases, we have to default to `cp -pR'. + ln -s conf$$.file conf$$.dir 2>/dev/null && test ! -f conf$$.exe || + as_ln_s='cp -pR' + elif ln conf$$.file conf$$ 2>/dev/null; then + as_ln_s=ln + else + as_ln_s='cp -pR' + fi +else + as_ln_s='cp -pR' +fi +rm -f conf$$ conf$$.exe conf$$.dir/conf$$.file conf$$.file +rmdir conf$$.dir 2>/dev/null + + +# as_fn_mkdir_p +# ------------- +# Create "$as_dir" as a directory, including parents if necessary. +as_fn_mkdir_p () +{ + + case $as_dir in #( + -*) as_dir=./$as_dir;; + esac + test -d "$as_dir" || eval $as_mkdir_p || { + as_dirs= + while :; do + case $as_dir in #( + *\'*) as_qdir=`$as_echo "$as_dir" | sed "s/'/'\\\\\\\\''/g"`;; #'( + *) as_qdir=$as_dir;; + esac + as_dirs="'$as_qdir' $as_dirs" + as_dir=`$as_dirname -- "$as_dir" || +$as_expr X"$as_dir" : 'X\(.*[^/]\)//*[^/][^/]*/*$' \| \ + X"$as_dir" : 'X\(//\)[^/]' \| \ + X"$as_dir" : 'X\(//\)$' \| \ + X"$as_dir" : 'X\(/\)' \| . 2>/dev/null || +$as_echo X"$as_dir" | + sed '/^X\(.*[^/]\)\/\/*[^/][^/]*\/*$/{ + s//\1/ + q + } + /^X\(\/\/\)[^/].*/{ + s//\1/ + q + } + /^X\(\/\/\)$/{ + s//\1/ + q + } + /^X\(\/\).*/{ + s//\1/ + q + } + s/.*/./; q'` + test -d "$as_dir" && break + done + test -z "$as_dirs" || eval "mkdir $as_dirs" + } || test -d "$as_dir" || as_fn_error $? "cannot create directory $as_dir" + + +} # as_fn_mkdir_p +if mkdir -p . 2>/dev/null; then + as_mkdir_p='mkdir -p "$as_dir"' +else + test -d ./-p && rmdir ./-p + as_mkdir_p=false +fi + + +# as_fn_executable_p FILE +# ----------------------- +# Test if FILE is an executable regular file. +as_fn_executable_p () +{ + test -f "$1" && test -x "$1" +} # as_fn_executable_p +as_test_x='test -x' +as_executable_p=as_fn_executable_p + +# Sed expression to map a string onto a valid CPP name. +as_tr_cpp="eval sed 'y%*$as_cr_letters%P$as_cr_LETTERS%;s%[^_$as_cr_alnum]%_%g'" + +# Sed expression to map a string onto a valid variable name. +as_tr_sh="eval sed 'y%*+%pp%;s%[^_$as_cr_alnum]%_%g'" + + +exec 6>&1 +## ----------------------------------- ## +## Main body of $CONFIG_STATUS script. ## +## ----------------------------------- ## +_ASEOF +test $as_write_fail = 0 && chmod +x $CONFIG_STATUS || ac_write_fail=1 + +cat >>$CONFIG_STATUS <<\_ACEOF || ac_write_fail=1 +# Save the log message, to keep $0 and so on meaningful, and to +# report actual input values of CONFIG_FILES etc. instead of their +# values after options handling. +ac_log=" +This file was extended by viking $as_me 1.7, which was +generated by GNU Autoconf 2.69. Invocation command line was + + CONFIG_FILES = $CONFIG_FILES + CONFIG_HEADERS = $CONFIG_HEADERS + CONFIG_LINKS = $CONFIG_LINKS + CONFIG_COMMANDS = $CONFIG_COMMANDS + $ $0 $@ + +on `(hostname || uname -n) 2>/dev/null | sed 1q` +" + +_ACEOF + +case $ac_config_files in *" +"*) set x $ac_config_files; shift; ac_config_files=$*;; +esac + +case $ac_config_headers in *" +"*) set x $ac_config_headers; shift; ac_config_headers=$*;; +esac + + +cat >>$CONFIG_STATUS <<_ACEOF || ac_write_fail=1 +# Files that config.status was made for. +config_files="$ac_config_files" +config_headers="$ac_config_headers" +config_commands="$ac_config_commands" + +_ACEOF + +cat >>$CONFIG_STATUS <<\_ACEOF || ac_write_fail=1 +ac_cs_usage="\ +\`$as_me' instantiates files and other configuration actions +from templates according to the current configuration. Unless the files +and actions are specified as TAGs, all are instantiated by default. + +Usage: $0 [OPTION]... [TAG]... + + -h, --help print this help, then exit + -V, --version print version number and configuration settings, then exit + --config print configuration, then exit + -q, --quiet, --silent + do not print progress messages + -d, --debug don't remove temporary files + --recheck update $as_me by reconfiguring in the same conditions + --file=FILE[:TEMPLATE] + instantiate the configuration file FILE + --header=FILE[:TEMPLATE] + instantiate the configuration header FILE + +Configuration files: +$config_files + +Configuration headers: +$config_headers + +Configuration commands: +$config_commands + +Report bugs to the package provider. +viking home page: ." + +_ACEOF +cat >>$CONFIG_STATUS <<_ACEOF || ac_write_fail=1 +ac_cs_config="`$as_echo "$ac_configure_args" | sed 's/^ //; s/[\\""\`\$]/\\\\&/g'`" +ac_cs_version="\\ +viking config.status 1.7 +configured by $0, generated by GNU Autoconf 2.69, + with options \\"\$ac_cs_config\\" + +Copyright (C) 2012 Free Software Foundation, Inc. +This config.status script is free software; the Free Software Foundation +gives unlimited permission to copy, distribute and modify it." + +ac_pwd='$ac_pwd' +srcdir='$srcdir' +INSTALL='$INSTALL' +MKDIR_P='$MKDIR_P' +AWK='$AWK' +test -n "\$AWK" || AWK=awk +_ACEOF + +cat >>$CONFIG_STATUS <<\_ACEOF || ac_write_fail=1 +# The default lists apply if the user does not specify any file. +ac_need_defaults=: +while test $# != 0 +do + case $1 in + --*=?*) + ac_option=`expr "X$1" : 'X\([^=]*\)='` + ac_optarg=`expr "X$1" : 'X[^=]*=\(.*\)'` + ac_shift=: + ;; + --*=) + ac_option=`expr "X$1" : 'X\([^=]*\)='` + ac_optarg= + ac_shift=: + ;; + *) + ac_option=$1 + ac_optarg=$2 + ac_shift=shift + ;; + esac + + case $ac_option in + # Handling of the options. + -recheck | --recheck | --rechec | --reche | --rech | --rec | --re | --r) + ac_cs_recheck=: ;; + --version | --versio | --versi | --vers | --ver | --ve | --v | -V ) + $as_echo "$ac_cs_version"; exit ;; + --config | --confi | --conf | --con | --co | --c ) + $as_echo "$ac_cs_config"; exit ;; + --debug | --debu | --deb | --de | --d | -d ) + debug=: ;; + --file | --fil | --fi | --f ) + $ac_shift + case $ac_optarg in + *\'*) ac_optarg=`$as_echo "$ac_optarg" | sed "s/'/'\\\\\\\\''/g"` ;; + '') as_fn_error $? "missing file argument" ;; + esac + as_fn_append CONFIG_FILES " '$ac_optarg'" + ac_need_defaults=false;; + --header | --heade | --head | --hea ) + $ac_shift + case $ac_optarg in + *\'*) ac_optarg=`$as_echo "$ac_optarg" | sed "s/'/'\\\\\\\\''/g"` ;; + esac + as_fn_append CONFIG_HEADERS " '$ac_optarg'" + ac_need_defaults=false;; + --he | --h) + # Conflict between --help and --header + as_fn_error $? "ambiguous option: \`$1' +Try \`$0 --help' for more information.";; + --help | --hel | -h ) + $as_echo "$ac_cs_usage"; exit ;; + -q | -quiet | --quiet | --quie | --qui | --qu | --q \ + | -silent | --silent | --silen | --sile | --sil | --si | --s) + ac_cs_silent=: ;; + + # This is an error. + -*) as_fn_error $? "unrecognized option: \`$1' +Try \`$0 --help' for more information." ;; + + *) as_fn_append ac_config_targets " $1" + ac_need_defaults=false ;; + + esac + shift +done + +ac_configure_extra_args= + +if $ac_cs_silent; then + exec 6>/dev/null + ac_configure_extra_args="$ac_configure_extra_args --silent" +fi + +_ACEOF +cat >>$CONFIG_STATUS <<_ACEOF || ac_write_fail=1 +if \$ac_cs_recheck; then + set X $SHELL '$0' $ac_configure_args \$ac_configure_extra_args --no-create --no-recursion + shift + \$as_echo "running CONFIG_SHELL=$SHELL \$*" >&6 + CONFIG_SHELL='$SHELL' + export CONFIG_SHELL + exec "\$@" +fi + +_ACEOF +cat >>$CONFIG_STATUS <<\_ACEOF || ac_write_fail=1 +exec 5>>config.log +{ + echo + sed 'h;s/./-/g;s/^.../## /;s/...$/ ##/;p;x;p;x' <<_ASBOX +## Running $as_me. ## +_ASBOX + $as_echo "$ac_log" +} >&5 + +_ACEOF +cat >>$CONFIG_STATUS <<_ACEOF || ac_write_fail=1 +# +# INIT-COMMANDS +# +AMDEP_TRUE="$AMDEP_TRUE" MAKE="${MAKE-make}" + +# Capture the value of obsolete ALL_LINGUAS because we need it to compute + # POFILES, UPDATEPOFILES, DUMMYPOFILES, GMOFILES, CATALOGS. But hide it + # from automake < 1.5. + eval 'OBSOLETE_ALL_LINGUAS''="$ALL_LINGUAS"' + # Capture the value of LINGUAS because we need it to compute CATALOGS. + LINGUAS="${LINGUAS-%UNSET%}" + + +_ACEOF + +cat >>$CONFIG_STATUS <<\_ACEOF || ac_write_fail=1 + +# Handling of arguments. +for ac_config_target in $ac_config_targets +do + case $ac_config_target in + "src/config.h") CONFIG_HEADERS="$CONFIG_HEADERS src/config.h" ;; + "depfiles") CONFIG_COMMANDS="$CONFIG_COMMANDS depfiles" ;; + "default-1") CONFIG_COMMANDS="$CONFIG_COMMANDS default-1" ;; + "po-directories") CONFIG_COMMANDS="$CONFIG_COMMANDS po-directories" ;; + "viking.spec") CONFIG_FILES="$CONFIG_FILES viking.spec" ;; + "mingw-viking.spec") CONFIG_FILES="$CONFIG_FILES mingw-viking.spec" ;; + "mingw64-viking.spec") CONFIG_FILES="$CONFIG_FILES mingw64-viking.spec" ;; + "Makefile") CONFIG_FILES="$CONFIG_FILES Makefile" ;; + "src/Makefile") CONFIG_FILES="$CONFIG_FILES src/Makefile" ;; + "src/icons/Makefile") CONFIG_FILES="$CONFIG_FILES src/icons/Makefile" ;; + "po/Makefile.in") CONFIG_FILES="$CONFIG_FILES po/Makefile.in" ;; + "data/Makefile") CONFIG_FILES="$CONFIG_FILES data/Makefile" ;; + "tools/Makefile") CONFIG_FILES="$CONFIG_FILES tools/Makefile" ;; + "test/Makefile") CONFIG_FILES="$CONFIG_FILES test/Makefile" ;; + "help/Makefile") CONFIG_FILES="$CONFIG_FILES help/Makefile" ;; + "help/viking.xml") CONFIG_FILES="$CONFIG_FILES help/viking.xml" ;; + "windows/Makefile") CONFIG_FILES="$CONFIG_FILES windows/Makefile" ;; + "windows/installer/Makefile") CONFIG_FILES="$CONFIG_FILES windows/installer/Makefile" ;; + "windows/installer/pixmaps/Makefile") CONFIG_FILES="$CONFIG_FILES windows/installer/pixmaps/Makefile" ;; + "windows/installer/translations/Makefile") CONFIG_FILES="$CONFIG_FILES windows/installer/translations/Makefile" ;; + "doc/Makefile") CONFIG_FILES="$CONFIG_FILES doc/Makefile" ;; + "doc/reference/Makefile") CONFIG_FILES="$CONFIG_FILES doc/reference/Makefile" ;; + "doc/examples/Makefile") CONFIG_FILES="$CONFIG_FILES doc/examples/Makefile" ;; + "po/stamp-it") CONFIG_COMMANDS="$CONFIG_COMMANDS po/stamp-it" ;; + + *) as_fn_error $? "invalid argument: \`$ac_config_target'" "$LINENO" 5;; + esac +done + + +# If the user did not use the arguments to specify the items to instantiate, +# then the envvar interface is used. Set only those that are not. +# We use the long form for the default assignment because of an extremely +# bizarre bug on SunOS 4.1.3. +if $ac_need_defaults; then + test "${CONFIG_FILES+set}" = set || CONFIG_FILES=$config_files + test "${CONFIG_HEADERS+set}" = set || CONFIG_HEADERS=$config_headers + test "${CONFIG_COMMANDS+set}" = set || CONFIG_COMMANDS=$config_commands +fi + +# Have a temporary directory for convenience. Make it in the build tree +# simply because there is no reason against having it here, and in addition, +# creating and moving files from /tmp can sometimes cause problems. +# Hook for its removal unless debugging. +# Note that there is a small window in which the directory will not be cleaned: +# after its creation but before its name has been assigned to `$tmp'. +$debug || +{ + tmp= ac_tmp= + trap 'exit_status=$? + : "${ac_tmp:=$tmp}" + { test ! -d "$ac_tmp" || rm -fr "$ac_tmp"; } && exit $exit_status +' 0 + trap 'as_fn_exit 1' 1 2 13 15 +} +# Create a (secure) tmp directory for tmp files. + +{ + tmp=`(umask 077 && mktemp -d "./confXXXXXX") 2>/dev/null` && + test -d "$tmp" +} || +{ + tmp=./conf$$-$RANDOM + (umask 077 && mkdir "$tmp") +} || as_fn_error $? "cannot create a temporary directory in ." "$LINENO" 5 +ac_tmp=$tmp + +# Set up the scripts for CONFIG_FILES section. +# No need to generate them if there are no CONFIG_FILES. +# This happens for instance with `./config.status config.h'. +if test -n "$CONFIG_FILES"; then + + +ac_cr=`echo X | tr X '\015'` +# On cygwin, bash can eat \r inside `` if the user requested igncr. +# But we know of no other shell where ac_cr would be empty at this +# point, so we can use a bashism as a fallback. +if test "x$ac_cr" = x; then + eval ac_cr=\$\'\\r\' +fi +ac_cs_awk_cr=`$AWK 'BEGIN { print "a\rb" }' /dev/null` +if test "$ac_cs_awk_cr" = "a${ac_cr}b"; then + ac_cs_awk_cr='\\r' +else + ac_cs_awk_cr=$ac_cr +fi + +echo 'BEGIN {' >"$ac_tmp/subs1.awk" && +_ACEOF + + +{ + echo "cat >conf$$subs.awk <<_ACEOF" && + echo "$ac_subst_vars" | sed 's/.*/&!$&$ac_delim/' && + echo "_ACEOF" +} >conf$$subs.sh || + as_fn_error $? "could not make $CONFIG_STATUS" "$LINENO" 5 +ac_delim_num=`echo "$ac_subst_vars" | grep -c '^'` +ac_delim='%!_!# ' +for ac_last_try in false false false false false :; do + . ./conf$$subs.sh || + as_fn_error $? "could not make $CONFIG_STATUS" "$LINENO" 5 + + ac_delim_n=`sed -n "s/.*$ac_delim\$/X/p" conf$$subs.awk | grep -c X` + if test $ac_delim_n = $ac_delim_num; then + break + elif $ac_last_try; then + as_fn_error $? "could not make $CONFIG_STATUS" "$LINENO" 5 + else + ac_delim="$ac_delim!$ac_delim _$ac_delim!! " + fi +done +rm -f conf$$subs.sh + +cat >>$CONFIG_STATUS <<_ACEOF || ac_write_fail=1 +cat >>"\$ac_tmp/subs1.awk" <<\\_ACAWK && +_ACEOF +sed -n ' +h +s/^/S["/; s/!.*/"]=/ +p +g +s/^[^!]*!// +:repl +t repl +s/'"$ac_delim"'$// +t delim +:nl +h +s/\(.\{148\}\)..*/\1/ +t more1 +s/["\\]/\\&/g; s/^/"/; s/$/\\n"\\/ +p +n +b repl +:more1 +s/["\\]/\\&/g; s/^/"/; s/$/"\\/ +p +g +s/.\{148\}// +t nl +:delim +h +s/\(.\{148\}\)..*/\1/ +t more2 +s/["\\]/\\&/g; s/^/"/; s/$/"/ +p +b +:more2 +s/["\\]/\\&/g; s/^/"/; s/$/"\\/ +p +g +s/.\{148\}// +t delim +' >$CONFIG_STATUS || ac_write_fail=1 +rm -f conf$$subs.awk +cat >>$CONFIG_STATUS <<_ACEOF || ac_write_fail=1 +_ACAWK +cat >>"\$ac_tmp/subs1.awk" <<_ACAWK && + for (key in S) S_is_set[key] = 1 + FS = "" + +} +{ + line = $ 0 + nfields = split(line, field, "@") + substed = 0 + len = length(field[1]) + for (i = 2; i < nfields; i++) { + key = field[i] + keylen = length(key) + if (S_is_set[key]) { + value = S[key] + line = substr(line, 1, len) "" value "" substr(line, len + keylen + 3) + len += length(value) + length(field[++i]) + substed = 1 + } else + len += 1 + keylen + } + + print line +} + +_ACAWK +_ACEOF +cat >>$CONFIG_STATUS <<\_ACEOF || ac_write_fail=1 +if sed "s/$ac_cr//" < /dev/null > /dev/null 2>&1; then + sed "s/$ac_cr\$//; s/$ac_cr/$ac_cs_awk_cr/g" +else + cat +fi < "$ac_tmp/subs1.awk" > "$ac_tmp/subs.awk" \ + || as_fn_error $? "could not setup config files machinery" "$LINENO" 5 +_ACEOF + +# VPATH may cause trouble with some makes, so we remove sole $(srcdir), +# ${srcdir} and @srcdir@ entries from VPATH if srcdir is ".", strip leading and +# trailing colons and then remove the whole line if VPATH becomes empty +# (actually we leave an empty line to preserve line numbers). +if test "x$srcdir" = x.; then + ac_vpsub='/^[ ]*VPATH[ ]*=[ ]*/{ +h +s/// +s/^/:/ +s/[ ]*$/:/ +s/:\$(srcdir):/:/g +s/:\${srcdir}:/:/g +s/:@srcdir@:/:/g +s/^:*// +s/:*$// +x +s/\(=[ ]*\).*/\1/ +G +s/\n// +s/^[^=]*=[ ]*$// +}' +fi + +cat >>$CONFIG_STATUS <<\_ACEOF || ac_write_fail=1 +fi # test -n "$CONFIG_FILES" + +# Set up the scripts for CONFIG_HEADERS section. +# No need to generate them if there are no CONFIG_HEADERS. +# This happens for instance with `./config.status Makefile'. +if test -n "$CONFIG_HEADERS"; then +cat >"$ac_tmp/defines.awk" <<\_ACAWK || +BEGIN { +_ACEOF + +# Transform confdefs.h into an awk script `defines.awk', embedded as +# here-document in config.status, that substitutes the proper values into +# config.h.in to produce config.h. + +# Create a delimiter string that does not exist in confdefs.h, to ease +# handling of long lines. +ac_delim='%!_!# ' +for ac_last_try in false false :; do + ac_tt=`sed -n "/$ac_delim/p" confdefs.h` + if test -z "$ac_tt"; then + break + elif $ac_last_try; then + as_fn_error $? "could not make $CONFIG_HEADERS" "$LINENO" 5 + else + ac_delim="$ac_delim!$ac_delim _$ac_delim!! " + fi +done + +# For the awk script, D is an array of macro values keyed by name, +# likewise P contains macro parameters if any. Preserve backslash +# newline sequences. + +ac_word_re=[_$as_cr_Letters][_$as_cr_alnum]* +sed -n ' +s/.\{148\}/&'"$ac_delim"'/g +t rset +:rset +s/^[ ]*#[ ]*define[ ][ ]*/ / +t def +d +:def +s/\\$// +t bsnl +s/["\\]/\\&/g +s/^ \('"$ac_word_re"'\)\(([^()]*)\)[ ]*\(.*\)/P["\1"]="\2"\ +D["\1"]=" \3"/p +s/^ \('"$ac_word_re"'\)[ ]*\(.*\)/D["\1"]=" \2"/p +d +:bsnl +s/["\\]/\\&/g +s/^ \('"$ac_word_re"'\)\(([^()]*)\)[ ]*\(.*\)/P["\1"]="\2"\ +D["\1"]=" \3\\\\\\n"\\/p +t cont +s/^ \('"$ac_word_re"'\)[ ]*\(.*\)/D["\1"]=" \2\\\\\\n"\\/p +t cont +d +:cont +n +s/.\{148\}/&'"$ac_delim"'/g +t clear +:clear +s/\\$// +t bsnlc +s/["\\]/\\&/g; s/^/"/; s/$/"/p +d +:bsnlc +s/["\\]/\\&/g; s/^/"/; s/$/\\\\\\n"\\/p +b cont +' >$CONFIG_STATUS || ac_write_fail=1 + +cat >>$CONFIG_STATUS <<_ACEOF || ac_write_fail=1 + for (key in D) D_is_set[key] = 1 + FS = "" +} +/^[\t ]*#[\t ]*(define|undef)[\t ]+$ac_word_re([\t (]|\$)/ { + line = \$ 0 + split(line, arg, " ") + if (arg[1] == "#") { + defundef = arg[2] + mac1 = arg[3] + } else { + defundef = substr(arg[1], 2) + mac1 = arg[2] + } + split(mac1, mac2, "(") #) + macro = mac2[1] + prefix = substr(line, 1, index(line, defundef) - 1) + if (D_is_set[macro]) { + # Preserve the white space surrounding the "#". + print prefix "define", macro P[macro] D[macro] + next + } else { + # Replace #undef with comments. This is necessary, for example, + # in the case of _POSIX_SOURCE, which is predefined and required + # on some systems where configure will not decide to define it. + if (defundef == "undef") { + print "/*", prefix defundef, macro, "*/" + next + } + } +} +{ print } +_ACAWK +_ACEOF +cat >>$CONFIG_STATUS <<\_ACEOF || ac_write_fail=1 + as_fn_error $? "could not setup config headers machinery" "$LINENO" 5 +fi # test -n "$CONFIG_HEADERS" + + +eval set X " :F $CONFIG_FILES :H $CONFIG_HEADERS :C $CONFIG_COMMANDS" +shift +for ac_tag +do + case $ac_tag in + :[FHLC]) ac_mode=$ac_tag; continue;; + esac + case $ac_mode$ac_tag in + :[FHL]*:*);; + :L* | :C*:*) as_fn_error $? "invalid tag \`$ac_tag'" "$LINENO" 5;; + :[FH]-) ac_tag=-:-;; + :[FH]*) ac_tag=$ac_tag:$ac_tag.in;; + esac + ac_save_IFS=$IFS + IFS=: + set x $ac_tag + IFS=$ac_save_IFS + shift + ac_file=$1 + shift + + case $ac_mode in + :L) ac_source=$1;; + :[FH]) + ac_file_inputs= + for ac_f + do + case $ac_f in + -) ac_f="$ac_tmp/stdin";; + *) # Look for the file first in the build tree, then in the source tree + # (if the path is not absolute). The absolute path cannot be DOS-style, + # because $ac_f cannot contain `:'. + test -f "$ac_f" || + case $ac_f in + [\\/$]*) false;; + *) test -f "$srcdir/$ac_f" && ac_f="$srcdir/$ac_f";; + esac || + as_fn_error 1 "cannot find input file: \`$ac_f'" "$LINENO" 5;; + esac + case $ac_f in *\'*) ac_f=`$as_echo "$ac_f" | sed "s/'/'\\\\\\\\''/g"`;; esac + as_fn_append ac_file_inputs " '$ac_f'" + done + + # Let's still pretend it is `configure' which instantiates (i.e., don't + # use $as_me), people would be surprised to read: + # /* config.h. Generated by config.status. */ + configure_input='Generated from '` + $as_echo "$*" | sed 's|^[^:]*/||;s|:[^:]*/|, |g' + `' by configure.' + if test x"$ac_file" != x-; then + configure_input="$ac_file. $configure_input" + { $as_echo "$as_me:${as_lineno-$LINENO}: creating $ac_file" >&5 +$as_echo "$as_me: creating $ac_file" >&6;} + fi + # Neutralize special characters interpreted by sed in replacement strings. + case $configure_input in #( + *\&* | *\|* | *\\* ) + ac_sed_conf_input=`$as_echo "$configure_input" | + sed 's/[\\\\&|]/\\\\&/g'`;; #( + *) ac_sed_conf_input=$configure_input;; + esac + + case $ac_tag in + *:-:* | *:-) cat >"$ac_tmp/stdin" \ + || as_fn_error $? "could not create $ac_file" "$LINENO" 5 ;; + esac + ;; + esac + + ac_dir=`$as_dirname -- "$ac_file" || +$as_expr X"$ac_file" : 'X\(.*[^/]\)//*[^/][^/]*/*$' \| \ + X"$ac_file" : 'X\(//\)[^/]' \| \ + X"$ac_file" : 'X\(//\)$' \| \ + X"$ac_file" : 'X\(/\)' \| . 2>/dev/null || +$as_echo X"$ac_file" | + sed '/^X\(.*[^/]\)\/\/*[^/][^/]*\/*$/{ + s//\1/ + q + } + /^X\(\/\/\)[^/].*/{ + s//\1/ + q + } + /^X\(\/\/\)$/{ + s//\1/ + q + } + /^X\(\/\).*/{ + s//\1/ + q + } + s/.*/./; q'` + as_dir="$ac_dir"; as_fn_mkdir_p + ac_builddir=. + +case "$ac_dir" in +.) ac_dir_suffix= ac_top_builddir_sub=. ac_top_build_prefix= ;; +*) + ac_dir_suffix=/`$as_echo "$ac_dir" | sed 's|^\.[\\/]||'` + # A ".." for each directory in $ac_dir_suffix. + ac_top_builddir_sub=`$as_echo "$ac_dir_suffix" | sed 's|/[^\\/]*|/..|g;s|/||'` + case $ac_top_builddir_sub in + "") ac_top_builddir_sub=. ac_top_build_prefix= ;; + *) ac_top_build_prefix=$ac_top_builddir_sub/ ;; + esac ;; +esac +ac_abs_top_builddir=$ac_pwd +ac_abs_builddir=$ac_pwd$ac_dir_suffix +# for backward compatibility: +ac_top_builddir=$ac_top_build_prefix + +case $srcdir in + .) # We are building in place. + ac_srcdir=. + ac_top_srcdir=$ac_top_builddir_sub + ac_abs_top_srcdir=$ac_pwd ;; + [\\/]* | ?:[\\/]* ) # Absolute name. + ac_srcdir=$srcdir$ac_dir_suffix; + ac_top_srcdir=$srcdir + ac_abs_top_srcdir=$srcdir ;; + *) # Relative name. + ac_srcdir=$ac_top_build_prefix$srcdir$ac_dir_suffix + ac_top_srcdir=$ac_top_build_prefix$srcdir + ac_abs_top_srcdir=$ac_pwd/$srcdir ;; +esac +ac_abs_srcdir=$ac_abs_top_srcdir$ac_dir_suffix + + + case $ac_mode in + :F) + # + # CONFIG_FILE + # + + case $INSTALL in + [\\/$]* | ?:[\\/]* ) ac_INSTALL=$INSTALL ;; + *) ac_INSTALL=$ac_top_build_prefix$INSTALL ;; + esac + ac_MKDIR_P=$MKDIR_P + case $MKDIR_P in + [\\/$]* | ?:[\\/]* ) ;; + */*) ac_MKDIR_P=$ac_top_build_prefix$MKDIR_P ;; + esac +_ACEOF + +cat >>$CONFIG_STATUS <<\_ACEOF || ac_write_fail=1 +# If the template does not know about datarootdir, expand it. +# FIXME: This hack should be removed a few years after 2.60. +ac_datarootdir_hack=; ac_datarootdir_seen= +ac_sed_dataroot=' +/datarootdir/ { + p + q +} +/@datadir@/p +/@docdir@/p +/@infodir@/p +/@localedir@/p +/@mandir@/p' +case `eval "sed -n \"\$ac_sed_dataroot\" $ac_file_inputs"` in +*datarootdir*) ac_datarootdir_seen=yes;; +*@datadir@*|*@docdir@*|*@infodir@*|*@localedir@*|*@mandir@*) + { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: $ac_file_inputs seems to ignore the --datarootdir setting" >&5 +$as_echo "$as_me: WARNING: $ac_file_inputs seems to ignore the --datarootdir setting" >&2;} +_ACEOF +cat >>$CONFIG_STATUS <<_ACEOF || ac_write_fail=1 + ac_datarootdir_hack=' + s&@datadir@&$datadir&g + s&@docdir@&$docdir&g + s&@infodir@&$infodir&g + s&@localedir@&$localedir&g + s&@mandir@&$mandir&g + s&\\\${datarootdir}&$datarootdir&g' ;; +esac +_ACEOF + +# Neutralize VPATH when `$srcdir' = `.'. +# Shell code in configure.ac might set extrasub. +# FIXME: do we really want to maintain this feature? +cat >>$CONFIG_STATUS <<_ACEOF || ac_write_fail=1 +ac_sed_extra="$ac_vpsub +$extrasub +_ACEOF +cat >>$CONFIG_STATUS <<\_ACEOF || ac_write_fail=1 +:t +/@[a-zA-Z_][a-zA-Z_0-9]*@/!b +s|@configure_input@|$ac_sed_conf_input|;t t +s&@top_builddir@&$ac_top_builddir_sub&;t t +s&@top_build_prefix@&$ac_top_build_prefix&;t t +s&@srcdir@&$ac_srcdir&;t t +s&@abs_srcdir@&$ac_abs_srcdir&;t t +s&@top_srcdir@&$ac_top_srcdir&;t t +s&@abs_top_srcdir@&$ac_abs_top_srcdir&;t t +s&@builddir@&$ac_builddir&;t t +s&@abs_builddir@&$ac_abs_builddir&;t t +s&@abs_top_builddir@&$ac_abs_top_builddir&;t t +s&@INSTALL@&$ac_INSTALL&;t t +s&@MKDIR_P@&$ac_MKDIR_P&;t t +$ac_datarootdir_hack +" +eval sed \"\$ac_sed_extra\" "$ac_file_inputs" | $AWK -f "$ac_tmp/subs.awk" \ + >$ac_tmp/out || as_fn_error $? "could not create $ac_file" "$LINENO" 5 + +test -z "$ac_datarootdir_hack$ac_datarootdir_seen" && + { ac_out=`sed -n '/\${datarootdir}/p' "$ac_tmp/out"`; test -n "$ac_out"; } && + { ac_out=`sed -n '/^[ ]*datarootdir[ ]*:*=/p' \ + "$ac_tmp/out"`; test -z "$ac_out"; } && + { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: $ac_file contains a reference to the variable \`datarootdir' +which seems to be undefined. Please make sure it is defined" >&5 +$as_echo "$as_me: WARNING: $ac_file contains a reference to the variable \`datarootdir' +which seems to be undefined. Please make sure it is defined" >&2;} + + rm -f "$ac_tmp/stdin" + case $ac_file in + -) cat "$ac_tmp/out" && rm -f "$ac_tmp/out";; + *) rm -f "$ac_file" && mv "$ac_tmp/out" "$ac_file";; + esac \ + || as_fn_error $? "could not create $ac_file" "$LINENO" 5 + ;; + :H) + # + # CONFIG_HEADER + # + if test x"$ac_file" != x-; then + { + $as_echo "/* $configure_input */" \ + && eval '$AWK -f "$ac_tmp/defines.awk"' "$ac_file_inputs" + } >"$ac_tmp/config.h" \ + || as_fn_error $? "could not create $ac_file" "$LINENO" 5 + if diff "$ac_file" "$ac_tmp/config.h" >/dev/null 2>&1; then + { $as_echo "$as_me:${as_lineno-$LINENO}: $ac_file is unchanged" >&5 +$as_echo "$as_me: $ac_file is unchanged" >&6;} + else + rm -f "$ac_file" + mv "$ac_tmp/config.h" "$ac_file" \ + || as_fn_error $? "could not create $ac_file" "$LINENO" 5 + fi + else + $as_echo "/* $configure_input */" \ + && eval '$AWK -f "$ac_tmp/defines.awk"' "$ac_file_inputs" \ + || as_fn_error $? "could not create -" "$LINENO" 5 + fi +# Compute "$ac_file"'s index in $config_headers. +_am_arg="$ac_file" +_am_stamp_count=1 +for _am_header in $config_headers :; do + case $_am_header in + $_am_arg | $_am_arg:* ) + break ;; + * ) + _am_stamp_count=`expr $_am_stamp_count + 1` ;; + esac +done +echo "timestamp for $_am_arg" >`$as_dirname -- "$_am_arg" || +$as_expr X"$_am_arg" : 'X\(.*[^/]\)//*[^/][^/]*/*$' \| \ + X"$_am_arg" : 'X\(//\)[^/]' \| \ + X"$_am_arg" : 'X\(//\)$' \| \ + X"$_am_arg" : 'X\(/\)' \| . 2>/dev/null || +$as_echo X"$_am_arg" | + sed '/^X\(.*[^/]\)\/\/*[^/][^/]*\/*$/{ + s//\1/ + q + } + /^X\(\/\/\)[^/].*/{ + s//\1/ + q + } + /^X\(\/\/\)$/{ + s//\1/ + q + } + /^X\(\/\).*/{ + s//\1/ + q + } + s/.*/./; q'`/stamp-h$_am_stamp_count + ;; + + :C) { $as_echo "$as_me:${as_lineno-$LINENO}: executing $ac_file commands" >&5 +$as_echo "$as_me: executing $ac_file commands" >&6;} + ;; + esac + + + case $ac_file$ac_mode in + "depfiles":C) test x"$AMDEP_TRUE" != x"" || { + # Older Autoconf quotes --file arguments for eval, but not when files + # are listed without --file. Let's play safe and only enable the eval + # if we detect the quoting. + # TODO: see whether this extra hack can be removed once we start + # requiring Autoconf 2.70 or later. + case $CONFIG_FILES in #( + *\'*) : + eval set x "$CONFIG_FILES" ;; #( + *) : + set x $CONFIG_FILES ;; #( + *) : + ;; +esac + shift + # Used to flag and report bootstrapping failures. + am_rc=0 + for am_mf + do + # Strip MF so we end up with the name of the file. + am_mf=`$as_echo "$am_mf" | sed -e 's/:.*$//'` + # Check whether this is an Automake generated Makefile which includes + # dependency-tracking related rules and includes. + # Grep'ing the whole file directly is not great: AIX grep has a line + # limit of 2048, but all sed's we know have understand at least 4000. + sed -n 's,^am--depfiles:.*,X,p' "$am_mf" | grep X >/dev/null 2>&1 \ + || continue + am_dirpart=`$as_dirname -- "$am_mf" || +$as_expr X"$am_mf" : 'X\(.*[^/]\)//*[^/][^/]*/*$' \| \ + X"$am_mf" : 'X\(//\)[^/]' \| \ + X"$am_mf" : 'X\(//\)$' \| \ + X"$am_mf" : 'X\(/\)' \| . 2>/dev/null || +$as_echo X"$am_mf" | + sed '/^X\(.*[^/]\)\/\/*[^/][^/]*\/*$/{ + s//\1/ + q + } + /^X\(\/\/\)[^/].*/{ + s//\1/ + q + } + /^X\(\/\/\)$/{ + s//\1/ + q + } + /^X\(\/\).*/{ + s//\1/ + q + } + s/.*/./; q'` + am_filepart=`$as_basename -- "$am_mf" || +$as_expr X/"$am_mf" : '.*/\([^/][^/]*\)/*$' \| \ + X"$am_mf" : 'X\(//\)$' \| \ + X"$am_mf" : 'X\(/\)' \| . 2>/dev/null || +$as_echo X/"$am_mf" | + sed '/^.*\/\([^/][^/]*\)\/*$/{ + s//\1/ + q + } + /^X\/\(\/\/\)$/{ + s//\1/ + q + } + /^X\/\(\/\).*/{ + s//\1/ + q + } + s/.*/./; q'` + { echo "$as_me:$LINENO: cd "$am_dirpart" \ + && sed -e '/# am--include-marker/d' "$am_filepart" \ + | $MAKE -f - am--depfiles" >&5 + (cd "$am_dirpart" \ + && sed -e '/# am--include-marker/d' "$am_filepart" \ + | $MAKE -f - am--depfiles) >&5 2>&5 + ac_status=$? + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); } || am_rc=$? + done + if test $am_rc -ne 0; then + { { $as_echo "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5 +$as_echo "$as_me: error: in \`$ac_pwd':" >&2;} +as_fn_error $? "Something went wrong bootstrapping makefile fragments + for automatic dependency tracking. Try re-running configure with the + '--disable-dependency-tracking' option to at least be able to build + the package (albeit without support for automatic dependency tracking). +See \`config.log' for more details" "$LINENO" 5; } + fi + { am_dirpart=; unset am_dirpart;} + { am_filepart=; unset am_filepart;} + { am_mf=; unset am_mf;} + { am_rc=; unset am_rc;} + rm -f conftest-deps.mk +} + ;; + "default-1":C) case "$CONFIG_FILES" in *po/Makefile.in*) + sed -e "/POTFILES =/r po/POTFILES" po/Makefile.in > po/Makefile + esac ;; + "po-directories":C) + for ac_file in $CONFIG_FILES; do + # Support "outfile[:infile[:infile...]]" + case "$ac_file" in + *:*) ac_file=`echo "$ac_file"|sed 's%:.*%%'` ;; + esac + # PO directories have a Makefile.in generated from Makefile.in.in. + case "$ac_file" in */Makefile.in) + # Adjust a relative srcdir. + ac_dir=`echo "$ac_file"|sed 's%/[^/][^/]*$%%'` + ac_dir_suffix="/`echo "$ac_dir"|sed 's%^\./%%'`" + ac_dots=`echo "$ac_dir_suffix"|sed 's%/[^/]*%../%g'` + # In autoconf-2.13 it is called $ac_given_srcdir. + # In autoconf-2.50 it is called $srcdir. + test -n "$ac_given_srcdir" || ac_given_srcdir="$srcdir" + case "$ac_given_srcdir" in + .) top_srcdir=`echo $ac_dots|sed 's%/$%%'` ;; + /*) top_srcdir="$ac_given_srcdir" ;; + *) top_srcdir="$ac_dots$ac_given_srcdir" ;; + esac + # Treat a directory as a PO directory if and only if it has a + # POTFILES.in file. This allows packages to have multiple PO + # directories under different names or in different locations. + if test -f "$ac_given_srcdir/$ac_dir/POTFILES.in"; then + rm -f "$ac_dir/POTFILES" + test -n "$as_me" && echo "$as_me: creating $ac_dir/POTFILES" || echo "creating $ac_dir/POTFILES" + cat "$ac_given_srcdir/$ac_dir/POTFILES.in" | sed -e "/^#/d" -e "/^[ ]*\$/d" -e "s,.*, $top_srcdir/& \\\\," | sed -e "\$s/\(.*\) \\\\/\1/" > "$ac_dir/POTFILES" + POMAKEFILEDEPS="POTFILES.in" + # ALL_LINGUAS, POFILES, UPDATEPOFILES, DUMMYPOFILES, GMOFILES depend + # on $ac_dir but don't depend on user-specified configuration + # parameters. + if test -f "$ac_given_srcdir/$ac_dir/LINGUAS"; then + # The LINGUAS file contains the set of available languages. + if test -n "$OBSOLETE_ALL_LINGUAS"; then + test -n "$as_me" && echo "$as_me: setting ALL_LINGUAS in configure.in is obsolete" || echo "setting ALL_LINGUAS in configure.in is obsolete" + fi + ALL_LINGUAS_=`sed -e "/^#/d" -e "s/#.*//" "$ac_given_srcdir/$ac_dir/LINGUAS"` + # Hide the ALL_LINGUAS assigment from automake < 1.5. + eval 'ALL_LINGUAS''=$ALL_LINGUAS_' + POMAKEFILEDEPS="$POMAKEFILEDEPS LINGUAS" + else + # The set of available languages was given in configure.in. + # Hide the ALL_LINGUAS assigment from automake < 1.5. + eval 'ALL_LINGUAS''=$OBSOLETE_ALL_LINGUAS' + fi + # Compute POFILES + # as $(foreach lang, $(ALL_LINGUAS), $(srcdir)/$(lang).po) + # Compute UPDATEPOFILES + # as $(foreach lang, $(ALL_LINGUAS), $(lang).po-update) + # Compute DUMMYPOFILES + # as $(foreach lang, $(ALL_LINGUAS), $(lang).nop) + # Compute GMOFILES + # as $(foreach lang, $(ALL_LINGUAS), $(srcdir)/$(lang).gmo) + case "$ac_given_srcdir" in + .) srcdirpre= ;; + *) srcdirpre='$(srcdir)/' ;; + esac + POFILES= + UPDATEPOFILES= + DUMMYPOFILES= + GMOFILES= + for lang in $ALL_LINGUAS; do + POFILES="$POFILES $srcdirpre$lang.po" + UPDATEPOFILES="$UPDATEPOFILES $lang.po-update" + DUMMYPOFILES="$DUMMYPOFILES $lang.nop" + GMOFILES="$GMOFILES $srcdirpre$lang.gmo" + done + # CATALOGS depends on both $ac_dir and the user's LINGUAS + # environment variable. + INST_LINGUAS= + if test -n "$ALL_LINGUAS"; then + for presentlang in $ALL_LINGUAS; do + useit=no + if test "%UNSET%" != "$LINGUAS"; then + desiredlanguages="$LINGUAS" + else + desiredlanguages="$ALL_LINGUAS" + fi + for desiredlang in $desiredlanguages; do + # Use the presentlang catalog if desiredlang is + # a. equal to presentlang, or + # b. a variant of presentlang (because in this case, + # presentlang can be used as a fallback for messages + # which are not translated in the desiredlang catalog). + case "$desiredlang" in + "$presentlang"*) useit=yes;; + esac + done + if test $useit = yes; then + INST_LINGUAS="$INST_LINGUAS $presentlang" + fi + done + fi + CATALOGS= + if test -n "$INST_LINGUAS"; then + for lang in $INST_LINGUAS; do + CATALOGS="$CATALOGS $lang.gmo" + done + fi + test -n "$as_me" && echo "$as_me: creating $ac_dir/Makefile" || echo "creating $ac_dir/Makefile" + sed -e "/^POTFILES =/r $ac_dir/POTFILES" -e "/^# Makevars/r $ac_given_srcdir/$ac_dir/Makevars" -e "s|@POFILES@|$POFILES|g" -e "s|@UPDATEPOFILES@|$UPDATEPOFILES|g" -e "s|@DUMMYPOFILES@|$DUMMYPOFILES|g" -e "s|@GMOFILES@|$GMOFILES|g" -e "s|@CATALOGS@|$CATALOGS|g" -e "s|@POMAKEFILEDEPS@|$POMAKEFILEDEPS|g" "$ac_dir/Makefile.in" > "$ac_dir/Makefile" + for f in "$ac_given_srcdir/$ac_dir"/Rules-*; do + if test -f "$f"; then + case "$f" in + *.orig | *.bak | *~) ;; + *) cat "$f" >> "$ac_dir/Makefile" ;; + esac + fi + done + fi + ;; + esac + done ;; + "po/stamp-it":C) + if ! grep "^# INTLTOOL_MAKEFILE$" "po/Makefile.in" > /dev/null ; then + as_fn_error $? "po/Makefile.in.in was not created by intltoolize." "$LINENO" 5 + fi + rm -f "po/stamp-it" "po/stamp-it.tmp" "po/POTFILES" "po/Makefile.tmp" + >"po/stamp-it.tmp" + sed '/^#/d + s/^[[].*] *// + /^[ ]*$/d + '"s|^| $ac_top_srcdir/|" \ + "$srcdir/po/POTFILES.in" | sed '$!s/$/ \\/' >"po/POTFILES" + + sed '/^POTFILES =/,/[^\\]$/ { + /^POTFILES =/!d + r po/POTFILES + } + ' "po/Makefile.in" >"po/Makefile" + rm -f "po/Makefile.tmp" + mv "po/stamp-it.tmp" "po/stamp-it" + ;; + + esac +done # for ac_tag + + +as_fn_exit 0 +_ACEOF +ac_clean_files=$ac_clean_files_save + +test $ac_write_fail = 0 || + as_fn_error $? "write failure creating $CONFIG_STATUS" "$LINENO" 5 + + +# configure is writing to config.log, and then calls config.status. +# config.status does its own redirection, appending to config.log. +# Unfortunately, on DOS this fails, as config.log is still kept open +# by configure, so config.status won't be able to write to it; its +# output is simply discarded. So we exec the FD to /dev/null, +# effectively closing config.log, so it can be properly (re)opened and +# appended to by config.status. When coming back to configure, we +# need to make the FD available again. +if test "$no_create" != yes; then + ac_cs_success=: + ac_config_status_args= + test "$silent" = yes && + ac_config_status_args="$ac_config_status_args --quiet" + exec 5>/dev/null + $SHELL $CONFIG_STATUS $ac_config_status_args || ac_cs_success=false + exec 5>>config.log + # Use ||, not &&, to avoid exiting from the if with $? = 1, which + # would make configure fail if this is the last instruction. + $ac_cs_success || as_fn_exit 1 +fi +if test -n "$ac_unrecognized_opts" && test "$enable_option_checking" != no; then + { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: unrecognized options: $ac_unrecognized_opts" >&5 +$as_echo "$as_me: WARNING: unrecognized options: $ac_unrecognized_opts" >&2;} +fi + + +{ $as_echo "$as_me:${as_lineno-$LINENO}: \" +=========================================== +$PACKAGE $PACKAGE_URL $VERSION +------------------------------------------- +Bing Maps : $ac_cv_enable_bing +Google : $ac_cv_enable_google +Terraserver Maps : $ac_cv_enable_terraserver +Expedia Maps : $ac_cv_enable_expedia +Open Street Map : $ac_cv_enable_openstreetmap +BlueMarble : $ac_cv_enable_bluemarble +GeoClue Support : $ac_cv_enable_geoclue +Geonames : $ac_cv_enable_geonames +Geocaches Acquire : $ac_cv_enable_geocaches +Geotag Support : $ac_cv_enable_geotag (libgexiv2=$ac_cv_lib_gexiv2_gexiv2_metadata_new libexif=$ac_cv_lib_exif_exif_loader_new) +USGS 24k DEM : $ac_cv_enable_dem24k +Realtime GPS Tracking : $ac_cv_enable_realtimegpstracking +bzip2 Support : $ac_cv_enable_bzip2 +File Magic Support : $ac_cv_enable_magic +MBTiles Support (SQLite3) : $ac_cv_enable_mbtiles +Zip File Support (with libzip) : $ac_cv_enable_zip +MD5 Hash Support (with libnettle): $ac_cv_enable_nettle +Mapnik Rendering Support (C++) : $ac_cv_enable_mapnik +OAuth : $ac_cv_enable_oauth +Size of map cache (in memory) : ${VIK_CONFIG_MAPCACHE_SIZE} +Age of tiles (in seconds) : ${VIK_CONFIG_DEFAULT_TILE_AGE} +GeoNames user : ${VIK_CONFIG_GEONAMES_USERNAME} +Man page generation : $ac_cv_enable_man +Documentation (+HTML) : ${enable_gtk_doc} (HTML: ${enable_gtk_doc_html}) +------------------------------------------- + +Configure finished, type 'make' to build. +\"" >&5 +$as_echo "$as_me: \" +=========================================== +$PACKAGE $PACKAGE_URL $VERSION +------------------------------------------- +Bing Maps : $ac_cv_enable_bing +Google : $ac_cv_enable_google +Terraserver Maps : $ac_cv_enable_terraserver +Expedia Maps : $ac_cv_enable_expedia +Open Street Map : $ac_cv_enable_openstreetmap +BlueMarble : $ac_cv_enable_bluemarble +GeoClue Support : $ac_cv_enable_geoclue +Geonames : $ac_cv_enable_geonames +Geocaches Acquire : $ac_cv_enable_geocaches +Geotag Support : $ac_cv_enable_geotag (libgexiv2=$ac_cv_lib_gexiv2_gexiv2_metadata_new libexif=$ac_cv_lib_exif_exif_loader_new) +USGS 24k DEM : $ac_cv_enable_dem24k +Realtime GPS Tracking : $ac_cv_enable_realtimegpstracking +bzip2 Support : $ac_cv_enable_bzip2 +File Magic Support : $ac_cv_enable_magic +MBTiles Support (SQLite3) : $ac_cv_enable_mbtiles +Zip File Support (with libzip) : $ac_cv_enable_zip +MD5 Hash Support (with libnettle): $ac_cv_enable_nettle +Mapnik Rendering Support (C++) : $ac_cv_enable_mapnik +OAuth : $ac_cv_enable_oauth +Size of map cache (in memory) : ${VIK_CONFIG_MAPCACHE_SIZE} +Age of tiles (in seconds) : ${VIK_CONFIG_DEFAULT_TILE_AGE} +GeoNames user : ${VIK_CONFIG_GEONAMES_USERNAME} +Man page generation : $ac_cv_enable_man +Documentation (+HTML) : ${enable_gtk_doc} (HTML: ${enable_gtk_doc_html}) +------------------------------------------- + +Configure finished, type 'make' to build. +\"" >&6;} diff --git a/configure.ac b/configure.ac new file mode 100644 index 0000000..cb5907f --- /dev/null +++ b/configure.ac @@ -0,0 +1,635 @@ +# -*- Autoconf -*- +# Process this file with autoconf to produce a configure script. + +AC_PREREQ(2.64) +AC_INIT(viking, 1.7, , viking, http://viking.sf.net/) + +AC_CANONICAL_HOST +AC_CANONICAL_TARGET + +AM_INIT_AUTOMAKE([dist-bzip2 dist-zip subdir-objects]) +dnl AC_CONFIG_SRCDIR([src/main.c]) +AC_CONFIG_HEADERS([src/config.h]) + +# check for gtk-doc +m4_ifdef([GTK_DOC_CHECK], [ +GTK_DOC_CHECK([1.0],[--flavour no-tmpl]) +],[ +AM_CONDITIONAL([ENABLE_GTK_DOC], false) +]) + +AC_PROG_CC +AC_PROG_CC_STDC +# Checks for programs. +AC_PROG_MAKE_SET +AC_PROG_RANLIB +AC_PATH_PROG(GLIB_MKENUMS, glib-mkenums) + +ac_mingw32=no +case $target_os in + *mingw32*) + ac_mingw32=yes + ;; + *) + ;; +esac + +# I18N +GETTEXT_PACKAGE=viking +AC_SUBST(GETTEXT_PACKAGE) +AC_DEFINE_UNQUOTED(GETTEXT_PACKAGE,"$GETTEXT_PACKAGE",[Gettext package name]) + +AM_GLIB_DEFINE_LOCALEDIR(LOCALEDIR) + +AM_GNU_GETTEXT_VERSION([0.17]) +AM_GNU_GETTEXT([external]) + +IT_PROG_INTLTOOL([0.35.0]) + +AC_SUBST([CONFIG_STATUS_DEPENDENCIES],['$(top_srcdir)/po/LINGUAS']) + +dnl This will cause the automake generated makefiles to pass the +dnl correct flags to aclocal. +ACLOCAL_AMFLAGS="\${ACLOCAL_FLAGS}" +AC_SUBST(ACLOCAL_AMFLAGS) + +# Checks for header files. +AC_HEADER_STDC +AC_CHECK_HEADERS([malloc.h stdlib.h string.h sys/param.h sys/types.h unistd.h math.h utime.h X11/Xlib.h]) + +# Checks for typedefs, structures, and compiler characteristics. +AC_C_CONST +AC_TYPE_MODE_T + +# Checks for library functions or symbols +AC_CHECK_FUNCS([floor memset mkdtemp pow realpath sqrt strcasecmp strchr strncasecmp strtol strtoul]) +AC_CHECK_LIB(m, tan) +AC_CHECK_LIB(z, inflate) +AC_CHECK_LIB(X11, XSetErrorHandler) + +# ATM not running automake under Windows +#AC_CHECK_PROG(USE_WINDOWS, cmd.exe, yes, no) +#AM_CONDITIONAL([WINDOWS], [test x$USE_WINDOWS = xyes]) +# So pass in as an option instead +# This is only to perform slightly different build steps +# (the code uses standard WINDOWS defines for any specific different behaviour) +AC_ARG_ENABLE(windows, AC_HELP_STRING([--enable-windows], + [Perform specific Windows build steps (default is no)]), + [ac_cv_enable_windows=$enableval], + [ac_cv_enable_windows=no]) +AC_CACHE_CHECK([whether to enable Windows build steps], + [ac_cv_enable_windows], [ac_cv_enable_windows=no]) +AM_CONDITIONAL([WINDOWS], [test x$ac_cv_enable_windows = xyes]) + +# Expat +AM_WITH_EXPAT + +# Curl +LIBCURL_CHECK_CONFIG([yes],[],[],[AC_MSG_ERROR([libcurl is needed but not found])]) + +# gdk-pixbuf-csource +AC_CHECK_PROG([GDK_PIXBUF_CSOURCE],gdk-pixbuf-csource,[yes]) +if test "x$GDK_PIXBUF_CSOURCE" != "xyes" +then + AC_MSG_ERROR([gdk-pixbuf-csource is needed but not found]) +fi + +dnl ------------------ +dnl | Pkgconfig checks |--------------------------------------- +dnl ------------------ + +PKG_CHECK_MODULES(PACKAGE, [ + glib-2.0 >= 2.26 + gthread-2.0 >= 2.2 + gtk+-2.0 >= 2.16 + gio-2.0 >= 2.12 +]) + +AC_SUBST(PACKAGE_CFLAGS) +AC_SUBST(PACKAGE_LIBS) + +dnl ------------- +dnl | User Manual |--------------------------------------- +dnl ------------- +GNOME_DOC_INIT + +dnl --------------------------------------------------------------------------- +dnl - Use deprecated options (default enabled for devs, disabled in releases) +dnl --------------------------------------------------------------------------- + +AC_ARG_ENABLE(deprecations, + [AC_HELP_STRING([--enable-deprecations], + [warn about deprecated usages [default=no]])], + [ac_cv_enable_deprecations=$enableval], + [ac_cv_enable_deprecations=no]) +AC_CACHE_CHECK([whether to enable deprecated features], + [ac_cv_enable_deprecations], [ac_cv_enable_deprecations=no]) + +if test "x$ac_cv_enable_deprecations" = "xyes"; then + DISABLE_DEPRECATED_CFLAGS="\ +-DG_DISABLE_SINGLE_INCLUDES \ +-DGSEAL_ENABLE \ +-DG_DISABLE_DEPRECATED \ +-DGDK_DISABLE_DEPRECATED \ +-DGDK_PIXBUF_DISABLE_DEPRECATED \ +-DGTK_DISABLE_SINGLE_INCLUDES \ +-DGTK_DISABLE_DEPRECATED" + CPPFLAGS="$CPPFLAGS $DISABLE_DEPRECATED_CFLAGS" +fi + +# Options +AC_ARG_ENABLE(bing, AC_HELP_STRING([--enable-bing], + [enable Bing stuff (default is enable)]), + [ac_cv_enable_bing=$enableval], + [ac_cv_enable_bing=yes]) +AC_CACHE_CHECK([whether to enable Bing stuff], + [ac_cv_enable_bing], [ac_cv_enable_bing=yes]) +case $ac_cv_enable_bing in + yes) + AC_DEFINE(VIK_CONFIG_BING, [], [BING STUFF]) + ;; +esac +AM_CONDITIONAL([BING], [test x$ac_cv_enable_bing = xyes]) + +AC_ARG_ENABLE(google, AC_HELP_STRING([--enable-google], + [enable Google stuff (default is enable)]), + [ac_cv_enable_google=$enableval], + [ac_cv_enable_google=yes]) +AC_CACHE_CHECK([whether to enable Google stuff], + [ac_cv_enable_google], [ac_cv_enable_google=yes]) +case $ac_cv_enable_google in + yes) + AC_DEFINE(VIK_CONFIG_GOOGLE, [], [GOOGLE STUFF]) + ;; +esac +AM_CONDITIONAL([GOOGLE], [test x$ac_cv_enable_google = xyes]) + +AC_ARG_ENABLE(terraserver, AC_HELP_STRING([--enable-terraserver], + [enable Terraserver stuff (default is disabled as the tileserver is no longer available)]), + [ac_cv_enable_terraserver=$enableval], + [ac_cv_enable_terraserver=no]) +AC_CACHE_CHECK([whether to enable Terraserver stuff], + [ac_cv_enable_terraserver], [ac_cv_enable_terraserver=yes]) +case $ac_cv_enable_terraserver in + yes) + AC_DEFINE(VIK_CONFIG_TERRASERVER, [], [TERRASERVER STUFF]) + ;; +esac +AM_CONDITIONAL([TERRASERVER], [test x$ac_cv_enable_terraserver = xyes]) + +AC_ARG_ENABLE(expedia, AC_HELP_STRING([--enable-expedia], + [enable Expedia stuff (default is disable)]), + [ac_cv_enable_expedia=$enableval], + [ac_cv_enable_expedia=no]) +AC_CACHE_CHECK([whether to enable Expedia stuff], + [ac_cv_enable_expedia], [ac_cv_enable_expedia=yes]) +case $ac_cv_enable_expedia in + yes) + AC_DEFINE(VIK_CONFIG_EXPEDIA, [], [EXPEDIA STUFF]) + ;; +esac +AM_CONDITIONAL([EXPEDIA], [test x$ac_cv_enable_expedia = xyes]) + +# OpenStreetMap http://www.openstreetmap.org/ +AC_ARG_ENABLE(openstreetmap, AC_HELP_STRING([--enable-openstreetmap], + [enable OpenStreetMap stuff (default is enable)]), + [ac_cv_enable_openstreetmap=$enableval], + [ac_cv_enable_openstreetmap=yes]) +AC_CACHE_CHECK([whether to enable OpenStreetMap stuff], + [ac_cv_enable_openstreetmap], [ac_cv_enable_openstreetmap=yes]) +case $ac_cv_enable_openstreetmap in + yes) + AC_DEFINE(VIK_CONFIG_OPENSTREETMAP, [], [OPENSTREETMAP STUFF]) + ;; +esac +AM_CONDITIONAL([OPENSTREETMAP], [test x$ac_cv_enable_openstreetmap = xyes]) + +# BlueMarble +AC_ARG_ENABLE(bluemarble, AC_HELP_STRING([--enable-bluemarble], + [enable BlueMarble stuff (default is enable)]), + [ac_cv_enable_bluemarble=$enableval], + [ac_cv_enable_bluemarble=yes]) +AC_CACHE_CHECK([whether to enable BlueMarble stuff], + [ac_cv_enable_bluemarble], [ac_cv_enable_bluemarble=yes]) +case $ac_cv_enable_bluemarble in + yes) + AC_DEFINE(VIK_CONFIG_BLUEMARBLE, [], [BLUEMARBLE STUFF]) + ;; +esac +AM_CONDITIONAL([BLUEMARBLE], [test x$ac_cv_enable_bluemarble = xyes]) + +# GeoNames http://www.geonames.org/ +AC_ARG_ENABLE(geonames, AC_HELP_STRING([--enable-geonames], + [enable Geonames stuff (default is enable)]), + [ac_cv_enable_geonames=$enableval], + [ac_cv_enable_geonames=yes]) +AC_CACHE_CHECK([whether to enable Geonames stuff], + [ac_cv_enable_geonames], [ac_cv_enable_geonames=yes]) +case $ac_cv_enable_geonames in + yes) + AC_DEFINE(VIK_CONFIG_GEONAMES, [], [GEONAMES STUFF]) + ;; +esac +AM_CONDITIONAL([GEONAMES], [test x$ac_cv_enable_geonames = xyes]) + +AC_ARG_ENABLE(geocaches, AC_HELP_STRING([--enable-geocaches], + [enable Geocaches Acquire (default is disable).]), + [ac_cv_enable_geocaches=$enableval], + [ac_cv_enable_geocaches=no]) +AC_CACHE_CHECK([whether to enable Geocaches Acquire], + [ac_cv_enable_geocaches], [ac_cv_enable_geocaches=yes]) +case $ac_cv_enable_geocaches in + yes) + AC_DEFINE(VIK_CONFIG_GEOCACHES, [], [GEOCACHES STUFF]) + ;; +esac +AM_CONDITIONAL([GEOCACHES], [test x$ac_cv_enable_geocaches = xyes]) + +# GeoClue +AC_ARG_ENABLE(geoclue, AC_HELP_STRING([--enable-geoclue], + [enable GeoClue support (default is enable).]), + [ac_cv_enable_geoclue=$enableval], + [ac_cv_enable_geoclue=yes]) +AC_CACHE_CHECK([whether to enable GeoClue Support], + [ac_cv_enable_geoclue], [ac_cv_enable_geoclue=yes]) +case $ac_cv_enable_geoclue in + yes) + PKG_CHECK_MODULES( [LIBGEOCLUE], [libgeoclue-2.0 >= 2], + AC_CHECK_LIB(geoclue-2, main,, AC_MSG_ERROR([libgeoclue is needed but not found - you will need to install package 'libgeoclue-2-dev' or similar ])) ) + ;; +esac +AM_CONDITIONAL([GEOCLUE], [test x$ac_cv_enable_geoclue = xyes]) + +# Geotagging +AC_ARG_WITH(libexif, AC_HELP_STRING([--with-libexif], [Force usage of libexif instead of libgexiv2])) +AC_ARG_ENABLE(geotag, AC_HELP_STRING([--enable-geotag], + [enable Geotag Support (default is enable).]), + [ac_cv_enable_geotag=$enableval], + [ac_cv_enable_geotag=yes]) +AC_CACHE_CHECK([whether to enable Geotag Support], + [ac_cv_enable_geotag], [ac_cv_enable_geotag=yes]) +case $ac_cv_enable_geotag in + yes) + AS_IF([test x$with_libexif = xyes], + AC_CHECK_HEADER([libexif/exif-data.h],[],AC_MSG_ERROR([exif-data.h is needed but not found - you will need to install package 'libexif-dev' or similar])) + AC_CHECK_LIB(exif,exif_loader_new,, AC_MSG_ERROR([libexif is not found but it has been forcibly required])), + # gexiv2.h relies on glib so a simple compile check fails. + #AC_CHECK_HEADER([gexiv2/gexiv2.h],,AC_MSG_ERROR([Error msg...])) + AC_CHECK_LIB(gexiv2,gexiv2_metadata_new,, AC_MSG_ERROR([libgexiv2 is needed but not found - you will need to install package 'libgexiv2-dev' or similar. The feature can be disabled with --disable-geotag])) + ) + AC_DEFINE(VIK_CONFIG_GEOTAG, [], [GEOTAG STUFF]) + ;; +esac +AM_CONDITIONAL([GEOTAG], [test x$ac_cv_enable_geotag = xyes]) +AM_CONDITIONAL([GEXIV2], [test x$ac_cv_lib_gexiv2_gexiv2_metadata_new = xyes] ) +# Tested with gexiv2 0.10.2, but probably would work with older versions; may be all of them... +#AM_COND_IF([GEXIV2], [PKG_CHECK_MODULES([GEXIV2], [gexiv2 >= 0.6.1])]) +AM_CONDITIONAL([LIBEXIF], [test x$ac_cv_lib_exif_exif_loader_new = xyes] ) + +AC_ARG_ENABLE(dem24k, AC_HELP_STRING([--enable-dem24k], + [enable USGS 24k DEM (default is disable) download source. Requires dem24k.pl script in path.]), + [ac_cv_enable_dem24k=$enableval], + [ac_cv_enable_dem24k=no]) +AC_CACHE_CHECK([whether to enable USGS DEM 24k download source], + [ac_cv_enable_dem24k], [ac_cv_enable_dem24k=yes]) +case $ac_cv_enable_dem24k in + yes) + AC_DEFINE(VIK_CONFIG_DEM24K, [], [DEM24K STUFF]) + ;; +esac +AM_CONDITIONAL([DEM24K], [test x$ac_cv_enable_dem24k = xyes]) + +# OAuth +AC_ARG_ENABLE(oauth, AC_HELP_STRING([--enable-oauth], + [enable OAuth Support (default is enable).]), + [ac_cv_enable_oauth=$enableval], + [ac_cv_enable_oauth=yes]) +AC_CACHE_CHECK([whether to enable OAuth Support], + [ac_cv_enable_oauth], [ac_cv_enable_oauth=yes]) +case $ac_cv_enable_oauth in + yes) + AC_CHECK_HEADERS([oauth.h],[],[AC_MSG_ERROR([oauth.h is needed but not found - you will need to install package 'liboauth-dev' or similar. The feature can be disabled with --disable-oauth])]) + AC_CHECK_LIB(oauth, oauth_sign_url2, [], [AC_MSG_ERROR([liboauth is needed but not found.])]) + ;; +esac +AM_CONDITIONAL([OAUTH], [test x$ac_cv_enable_oauth = xyes]) + +# Realtime GPS tracking +AC_ARG_ENABLE(realtime-gps-tracking, AC_HELP_STRING([--enable-realtime-gps-tracking], + [enable realtime GPS tracking (default is enable)]), + [ac_cv_enable_realtimegpstracking=$enableval], + [ac_cv_enable_realtimegpstracking=yes]) +AC_CACHE_CHECK([whether to enable Realtime GPS Tracking stuff], + [ac_cv_enable_realtimegpstracking], [ac_cv_enable_realtimegpstracking=yes]) +case $ac_cv_enable_realtimegpstracking in + yes) + AC_CHECK_HEADERS([gps.h],[],[AC_MSG_ERROR([gps.h is needed but not found - you will need to install package 'libgps-dev' or similar. The feature can be disabled with --disable-realtime-gps-tracking])]) + AC_CHECK_LIB(gps, gps_close, [], + if test "$ac_mingw32" = "yes"; then + [LIBS="-lgps $LIBS" + AC_MSG_WARN([libgps not found! Forcing it anyway!])] + else + AC_MSG_ERROR([libgps is needed but not found.]) + fi) + AC_DEFINE(VIK_CONFIG_REALTIME_GPS_TRACKING, [], [REALTIME GPS TRACKING STUFF]) + ;; +esac +AM_CONDITIONAL([REALTIME_GPS_TRACKING], [test x$ac_cv_enable_realtimegpstracking = xyes]) + +# BZIP2 +AC_ARG_ENABLE(bzip2, AC_HELP_STRING([--enable-bzip2], + [enable bzip2 Support (default is enable).]), + [ac_cv_enable_bzip2=$enableval], + [ac_cv_enable_bzip2=yes]) +AC_CACHE_CHECK([whether to enable bzip2 Support], + [ac_cv_enable_bzip2], [ac_cv_enable_bzip2=yes]) +case $ac_cv_enable_bzip2 in + yes) + AC_CHECK_HEADERS([bzlib.h],[],[AC_MSG_ERROR([bzlib.h is needed but not found - you will need to install package 'libbz2-dev' or similar. The feature can be disabled with --disable-bzip2])]) + if test "$ac_mingw32" = "yes"; then + # Using the cross compiler it bizarrely fails to detect BZ2_bzRead during the configure stage + # I SWEAR THIS WORKED AT SOME POINT - BUT ON A DIFFERENT DAY IT DOESN'T = MORE SWEARING + BZ2FUNC=main + AC_CHECK_LIB(bz2, [$BZ2FUNC], [], [LIBS="-lbz2 $LIBS" + AC_MSG_WARN([libbz2 not found! Forcing it anyway!])]) + else + BZ2FUNC=BZ2_bzRead + AC_CHECK_LIB(bz2, [$BZ2FUNC], [], [AC_MSG_ERROR([libbz2 is needed but not found.])]) + fi + ;; +esac +AM_CONDITIONAL([BZIP2], [test x$ac_cv_enable_bzip2 = xyes]) + +# FILE MAGIC +AC_ARG_ENABLE(magic, AC_HELP_STRING([--enable-magic], + [enable File Magic support via libmagic (default is enable).]), + [ac_cv_enable_magic=$enableval], + [ac_cv_enable_magic=yes]) +AC_CACHE_CHECK([whether to enable Magic Support], + [ac_cv_enable_magic], [ac_cv_enable_magic=yes]) +case $ac_cv_enable_magic in + yes) + AC_CHECK_HEADERS([magic.h],[],[AC_MSG_ERROR([magic.h is needed but not found - you will need to install package 'libmagic-dev' or similar. The feature can be disabled with --disable-magic])]) + # Using the cross compiler it fails to find libmagic.dll during the configure stage + AC_CHECK_LIB(magic, magic_open, [], + if test "$ac_mingw32" = "yes"; then + [LIBS="-lmagic $LIBS" + AC_MSG_WARN([libmagic not found! Forcing it anyway!])] + else + AC_MSG_ERROR([libmagic is needed but not found.]) + fi) + ;; +esac +AM_CONDITIONAL([MAGIC], [test x$ac_cv_enable_magic = xyes]) + +# SQL for MBTiles +AC_ARG_ENABLE(mbtiles, AC_HELP_STRING([--enable-mbtiles], + [enable MBTiles support via libsqlite3 (default is enable).]), + [ac_cv_enable_mbtiles=$enableval], + [ac_cv_enable_mbtiles=yes]) +AC_CACHE_CHECK([whether to enable MBTiles Support], + [ac_cv_enable_mbtiles], [ac_cv_enable_mbtiles=yes]) +case $ac_cv_enable_mbtiles in + yes) + AC_CHECK_HEADERS([sqlite3.h],[],[AC_MSG_ERROR([sqlite3.h is needed but not found - you will need to install package 'libsqlite3-dev' or similar. The feature can be disabled with --disable-mbtiles])]) + AC_CHECK_LIB(sqlite3, sqlite3_open, [], + if test "$ac_mingw32" = "yes"; then + [LIBS="-lsqlite3 $LIBS" + AC_MSG_WARN([libsqlite3 not found! Forcing it anyway!])] + else + AC_MSG_ERROR([libsqlite3 is needed but not found.]) + fi) + ;; +esac +AM_CONDITIONAL([SQLITE], [test x$ac_cv_enable_mbtiles = xyes]) + +# Standard compression is handled by libz +# libzip enables a friendlier file based interface +# libzip itself depends on libz (which is required in the Viking build ATM) +# ZIP +AC_ARG_ENABLE(zip, AC_HELP_STRING([--enable-zip], + [enable zip support (default is enable).]), + [ac_cv_enable_zip=$enableval], + [ac_cv_enable_zip=yes]) +AC_CACHE_CHECK([whether to enable zip Support], + [ac_cv_enable_zip], [ac_cv_enable_zip=yes]) +case $ac_cv_enable_zip in + yes) + # NB As far as I can tell libzip doesn't provide any versioning info within the header code itself + # Thus supporting old versions via simple #if #else #endif directives is seemingly not possible + # Resort to checking versioning only via pkgconfig + PKG_CHECK_MODULES([LIBZIP], [libzip >= 0.11], + [ AC_CHECK_HEADERS([zip.h],[],[AC_MSG_ERROR([zip.h is needed but not found - you will need to install package 'libzip-dev' or similar. The feature can be disabled with --disable-zip])]) + AC_CHECK_LIB(zip, [main], [], + if test "$ac_mingw32" = "yes"; then + [LIBS="-lzip $LIBS" + AC_MSG_WARN([libzip not found! Forcing it anyway!])] + else + AC_MSG_ERROR([libzip is needed but not found.]) + fi)], + [ AC_MSG_WARN([libzip version needs to be at least 0.11, use of libzip is disabled]) + ac_cv_enable_zip=no ] + ) + ;; +esac +AM_CONDITIONAL([ZIP], [test x$ac_cv_enable_zip = xyes]) + +# ATM only for MD5 Hashing which is currently only used for filename of image thumbnails +AC_ARG_ENABLE(nettle, AC_HELP_STRING([--enable-nettle], + [enable MD5 Hash support (default is enable)]), + [ac_cv_enable_nettle=$enableval], + [ac_cv_enable_nettle=yes]) +AC_CACHE_CHECK([whether to enable MD5 Hash support], + [ac_cv_enable_nettle], [ac_cv_enable_nettle=yes]) +case $ac_cv_enable_nettle in + yes) + AC_CHECK_HEADER([nettle/md5-compat.h],[],[AC_MSG_ERROR([nettle/md5-compat.h is needed but not found - you will need to install package 'nettle-dev' or similar. The feature can be disabled with --disable-nettle])]) + AC_CHECK_LIB([nettle], [main], [], + if test "$ac_mingw32" = "yes"; then + [LIBS="-lnettle $LIBS" + AC_MSG_WARN([libnettle not found! Forcing it anyway!])] + else + AC_MSG_ERROR([libnettle is needed but not found.]) + fi) + ;; +esac +AM_CONDITIONAL([MD5_HASH], [test x$ac_cv_enable_nettle = xyes]) + +# Mapnik rendering layer +AC_ARG_ENABLE(mapnik, AC_HELP_STRING([--enable-mapnik], + [enable Mapnik (default is enable)]), + [ac_cv_enable_mapnik=$enableval], + [ac_cv_enable_mapnik=yes]) +AC_CACHE_CHECK([whether to enable Mapnik], + [ac_cv_enable_mapnik], [ac_cv_enable_mapnik=yes]) +case $ac_cv_enable_mapnik in + yes) + # C++ + AC_LANG_CPLUSPLUS + AC_LANG_SAVE + AC_PROG_CXX + # Mapnik3 requires C++11. Viking will use C++11 as well. + CXXFLAGS="$CXXFLAGS -std=c++11" + # Too difficult to get check working under Windows (extra dependencies needed probably Boost)- so just skip it + if test "x$ac_cv_enable_windows" = "xno"; then + AC_CHECK_HEADER([mapnik/map.hpp],[],[AC_MSG_ERROR([mapnik/map.hpp is needed but not found - you will need to install package 'libmapnik-dev' or similar. The feature can be disabled with --disable-mapnik])]) + fi + AC_CHECK_LIB([mapnik], [main], [], [AC_MSG_ERROR([libmapnik is needed but not found.])]) + AC_CHECK_LIB([stdc++], [main], [], [AC_MSG_ERROR([libstdc++ is needed but not found.])]) + # Required for Mapnik3 build (it's also in Mapnik2 but does not need to be specified for some reason) + # it's part of libmapnik install dependencies + AC_CHECK_LIB([icuuc], [main], [], [AC_MSG_ERROR([libicuuc is needed but not found.])]) + AC_LANG_RESTORE + ;; +esac +AM_CONDITIONAL([MAPNIK], [test x$ac_cv_enable_mapnik = xyes]) +### + +## WORK AROUND BROKEN autoconf - see http://lists.gnu.org/archive/html/bug-automake/2002-11/msg00020.html +m4_pushdef([AC_MSG_ERROR]) +AC_PROG_CXX +m4_popdef([AC_MSG_ERROR]) +## + +dnl Compile time defined access token +AC_ARG_WITH(mapbox_access_token, + [AC_HELP_STRING([--with-mapbox_access_token], + [Access token for MapBox tiles. + Please register your own if you're going to distribute the + package, as requests are limited per token.])], + [VIK_CONFIG_MAPBOX_TOKEN="\"${withval}\""], + [VIK_CONFIG_MAPBOX_TOKEN="\"pk.eyJ1Ijoicndub3JyaXMiLCJhIjoiY2lxc294anN2MDA5bWhzbWFseWsxMW1ydiJ9.HcybKtZsiG6RVuOHg481Kg\""]) +AC_DEFINE_UNQUOTED(VIK_CONFIG_MAPBOX_TOKEN, ${VIK_CONFIG_MAPBOX_TOKEN}, [Mapbox Token]) + + +dnl Compile time defined key +AC_ARG_WITH(thunderforest_apikey, + [AC_HELP_STRING([--with-thunderforest_apikey], + [API Key for Thunderforest (OSM Cyclemap) tiles. + Please register your own if you're going to distribute the + package, as requests are limited per key.])], + [VIK_CONFIG_THUNDERFOREST_KEY="\"${withval}\""], + [VIK_CONFIG_THUNDERFOREST_KEY="\"7387c111d85642b18f63608bd4cb8b4f\""]) +AC_DEFINE_UNQUOTED(VIK_CONFIG_THUNDERFOREST_KEY, ${VIK_CONFIG_THUNDERFOREST_KEY}, [Thunderforest key]) + +AC_ARG_WITH(geonames_username, + [AC_HELP_STRING([--with-geonames_username], + [Username for the GeoNames webservice. + Please register your own if you're going to distribute the + package, as requests are limited per username.])], + [VIK_CONFIG_GEONAMES_USERNAME="\"${withval}\""], + [VIK_CONFIG_GEONAMES_USERNAME="\"$PACKAGE\""]) +AC_DEFINE_UNQUOTED(VIK_CONFIG_GEONAMES_USERNAME, ${VIK_CONFIG_GEONAMES_USERNAME}, [geonames username]) + + +AC_ARG_WITH(mapcache, + [AC_HELP_STRING([--with-mapcache], + [specify the size of the map cache in MB (default is 128)])], + [if test "x$withval" = "xno"; then + VIK_CONFIG_MAPCACHE_SIZE=0; + elif test "x$withval" = "xyes"; then + AC_MSG_ERROR([Please, set a value for size of the map cache in MB]) + else + VIK_CONFIG_MAPCACHE_SIZE=${withval} + fi], + [VIK_CONFIG_MAPCACHE_SIZE=128]) +AC_DEFINE_UNQUOTED(VIK_CONFIG_MAPCACHE_SIZE, ${VIK_CONFIG_MAPCACHE_SIZE}, + [Size of the map cache]) + + +AC_ARG_WITH(tileage, + [AC_HELP_STRING([--with-tileage], + [specify the age of a tile before checking it (default is 7 days)])], + [if test "x$withval" = "xno"; then + VIK_CONFIG_DEFAULT_TILE_AGE=0; + elif test "x$withval" = "xyes"; then + AC_MSG_ERROR([Please, set a value for age of tiles]) + else + VIK_CONFIG_DEFAULT_TILE_AGE=${withval} + fi], + [VIK_CONFIG_DEFAULT_TILE_AGE=604800]) +AC_DEFINE_UNQUOTED(VIK_CONFIG_DEFAULT_TILE_AGE, ${VIK_CONFIG_DEFAULT_TILE_AGE}, + [Age of tiles before checking it (in seconds)]) +AC_DEFINE(HAVE_VIKING, 1, [Enable Viking specifics in otherwise reusable code]) + +dnl man pages processing +dnl Different distributions have differing locations for the docbook.xsl +dnl Debian like +if test -r /usr/share/xml/docbook/stylesheet/docbook-xsl/manpages/docbook.xsl; then + DB2MAN_XSL=/usr/share/xml/docbook/stylesheet/docbook-xsl/manpages/docbook.xsl +dnl RedHat like +elif test -r /usr/share/sgml/docbook/xsl-stylesheets/manpages/docbook.xsl; then + DB2MAN_XSL=/usr/share/sgml/docbook/xsl-stylesheets/manpages/docbook.xsl +else +dnl Old default + DB2MAN_XSL=/usr/share/sgml/docbook/stylesheet/xsl/nwalsh/manpages/docbook.xsl +fi +AC_SUBST(DB2MAN_XSL) +AC_PATH_PROG(XP,xsltproc) +AM_CONDITIONAL([HAVE_XSLTPROC],[test "x$XP" != "x"]) +AC_CHECK_PROG([HAVE_SCROLLKEEPER],scrollkeeper-config,"yes") +AM_CONDITIONAL([GEN_MANPAGES],[test "x$XP" != "x" && test -r "$DB2MAN_XSL"] && test "${HAVE_SCROLLKEEPER}" = "yes" ) +AM_COND_IF([GEN_MANPAGES], [ac_cv_enable_man=yes], [ac_cv_enable_man=no]) + +ISODATE="$(date --utc --date="@${SOURCE_DATE_EPOCH:-$(date +%s)}" +%Y-%m-%d)" +AC_SUBST(ISODATE) + +AC_DEFINE_UNQUOTED(THEYEAR, "$(date --utc --date="@${SOURCE_DATE_EPOCH:-$(date +%s)}" +%Y)", [The Year]) + +# Configuration +AC_CONFIG_FILES([ + viking.spec + mingw-viking.spec + mingw64-viking.spec + Makefile + src/Makefile + src/icons/Makefile + po/Makefile.in + data/Makefile + tools/Makefile + test/Makefile + help/Makefile + help/viking.xml + windows/Makefile + windows/installer/Makefile + windows/installer/pixmaps/Makefile + windows/installer/translations/Makefile + doc/Makefile + doc/reference/Makefile + doc/examples/Makefile]) + +AC_OUTPUT + +dnl Output the configuration summary +AC_MSG_NOTICE([" +=========================================== +$PACKAGE $PACKAGE_URL $VERSION +------------------------------------------- +Bing Maps : $ac_cv_enable_bing +Google : $ac_cv_enable_google +Terraserver Maps : $ac_cv_enable_terraserver +Expedia Maps : $ac_cv_enable_expedia +Open Street Map : $ac_cv_enable_openstreetmap +BlueMarble : $ac_cv_enable_bluemarble +GeoClue Support : $ac_cv_enable_geoclue +Geonames : $ac_cv_enable_geonames +Geocaches Acquire : $ac_cv_enable_geocaches +Geotag Support : $ac_cv_enable_geotag (libgexiv2=$ac_cv_lib_gexiv2_gexiv2_metadata_new libexif=$ac_cv_lib_exif_exif_loader_new) +USGS 24k DEM : $ac_cv_enable_dem24k +Realtime GPS Tracking : $ac_cv_enable_realtimegpstracking +bzip2 Support : $ac_cv_enable_bzip2 +File Magic Support : $ac_cv_enable_magic +MBTiles Support (SQLite3) : $ac_cv_enable_mbtiles +Zip File Support (with libzip) : $ac_cv_enable_zip +MD5 Hash Support (with libnettle): $ac_cv_enable_nettle +Mapnik Rendering Support (C++) : $ac_cv_enable_mapnik +OAuth : $ac_cv_enable_oauth +Size of map cache (in memory) : ${VIK_CONFIG_MAPCACHE_SIZE} +Age of tiles (in seconds) : ${VIK_CONFIG_DEFAULT_TILE_AGE} +GeoNames user : ${VIK_CONFIG_GEONAMES_USERNAME} +Man page generation : $ac_cv_enable_man +Documentation (+HTML) : ${enable_gtk_doc} (HTML: ${enable_gtk_doc_html}) +------------------------------------------- + +Configure finished, type 'make' to build. +"]) diff --git a/data/Makefile.am b/data/Makefile.am new file mode 100644 index 0000000..8a44639 --- /dev/null +++ b/data/Makefile.am @@ -0,0 +1,10 @@ +pkgdata_DATA = \ + maps.xml \ + external_tools.xml \ + goto_tools.xml \ + datasources.xml \ + routing.xml \ + latlontz.txt + +EXTRA_DIST = \ + $(pkgdata_DATA) diff --git a/data/Makefile.in b/data/Makefile.in new file mode 100644 index 0000000..bd0c925 --- /dev/null +++ b/data/Makefile.in @@ -0,0 +1,564 @@ +# Makefile.in generated by automake 1.16.1 from Makefile.am. +# @configure_input@ + +# Copyright (C) 1994-2018 Free Software Foundation, Inc. + +# This Makefile.in is free software; the Free Software Foundation +# gives unlimited permission to copy and/or distribute it, +# with or without modifications, as long as this notice is preserved. + +# This program is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY, to the extent permitted by law; without +# even the implied warranty of MERCHANTABILITY or FITNESS FOR A +# PARTICULAR PURPOSE. + +@SET_MAKE@ + +VPATH = @srcdir@ +am__is_gnu_make = { \ + if test -z '$(MAKELEVEL)'; then \ + false; \ + elif test -n '$(MAKE_HOST)'; then \ + true; \ + elif test -n '$(MAKE_VERSION)' && test -n '$(CURDIR)'; then \ + true; \ + else \ + false; \ + fi; \ +} +am__make_running_with_option = \ + case $${target_option-} in \ + ?) ;; \ + *) echo "am__make_running_with_option: internal error: invalid" \ + "target option '$${target_option-}' specified" >&2; \ + exit 1;; \ + esac; \ + has_opt=no; \ + sane_makeflags=$$MAKEFLAGS; \ + if $(am__is_gnu_make); then \ + sane_makeflags=$$MFLAGS; \ + else \ + case $$MAKEFLAGS in \ + *\\[\ \ ]*) \ + bs=\\; \ + sane_makeflags=`printf '%s\n' "$$MAKEFLAGS" \ + | sed "s/$$bs$$bs[$$bs $$bs ]*//g"`;; \ + esac; \ + fi; \ + skip_next=no; \ + strip_trailopt () \ + { \ + flg=`printf '%s\n' "$$flg" | sed "s/$$1.*$$//"`; \ + }; \ + for flg in $$sane_makeflags; do \ + test $$skip_next = yes && { skip_next=no; continue; }; \ + case $$flg in \ + *=*|--*) continue;; \ + -*I) strip_trailopt 'I'; skip_next=yes;; \ + -*I?*) strip_trailopt 'I';; \ + -*O) strip_trailopt 'O'; skip_next=yes;; \ + -*O?*) strip_trailopt 'O';; \ + -*l) strip_trailopt 'l'; skip_next=yes;; \ + -*l?*) strip_trailopt 'l';; \ + -[dEDm]) skip_next=yes;; \ + -[JT]) skip_next=yes;; \ + esac; \ + case $$flg in \ + *$$target_option*) has_opt=yes; break;; \ + esac; \ + done; \ + test $$has_opt = yes +am__make_dryrun = (target_option=n; $(am__make_running_with_option)) +am__make_keepgoing = (target_option=k; $(am__make_running_with_option)) +pkgdatadir = $(datadir)/@PACKAGE@ +pkgincludedir = $(includedir)/@PACKAGE@ +pkglibdir = $(libdir)/@PACKAGE@ +pkglibexecdir = $(libexecdir)/@PACKAGE@ +am__cd = CDPATH="$${ZSH_VERSION+.}$(PATH_SEPARATOR)" && cd +install_sh_DATA = $(install_sh) -c -m 644 +install_sh_PROGRAM = $(install_sh) -c +install_sh_SCRIPT = $(install_sh) -c +INSTALL_HEADER = $(INSTALL_DATA) +transform = $(program_transform_name) +NORMAL_INSTALL = : +PRE_INSTALL = : +POST_INSTALL = : +NORMAL_UNINSTALL = : +PRE_UNINSTALL = : +POST_UNINSTALL = : +build_triplet = @build@ +host_triplet = @host@ +target_triplet = @target@ +subdir = data +ACLOCAL_M4 = $(top_srcdir)/aclocal.m4 +am__aclocal_m4_deps = $(top_srcdir)/m4/expat.m4 \ + $(top_srcdir)/m4/gettext.m4 $(top_srcdir)/m4/iconv.m4 \ + $(top_srcdir)/m4/intlmacosx.m4 $(top_srcdir)/m4/lib-ld.m4 \ + $(top_srcdir)/m4/lib-link.m4 $(top_srcdir)/m4/lib-prefix.m4 \ + $(top_srcdir)/m4/libcurl.m4 $(top_srcdir)/m4/nls.m4 \ + $(top_srcdir)/m4/po.m4 $(top_srcdir)/m4/progtest.m4 \ + $(top_srcdir)/configure.ac +am__configure_deps = $(am__aclocal_m4_deps) $(CONFIGURE_DEPENDENCIES) \ + $(ACLOCAL_M4) +DIST_COMMON = $(srcdir)/Makefile.am $(am__DIST_COMMON) +mkinstalldirs = $(SHELL) $(top_srcdir)/mkinstalldirs +CONFIG_HEADER = $(top_builddir)/src/config.h +CONFIG_CLEAN_FILES = +CONFIG_CLEAN_VPATH_FILES = +AM_V_P = $(am__v_P_@AM_V@) +am__v_P_ = $(am__v_P_@AM_DEFAULT_V@) +am__v_P_0 = false +am__v_P_1 = : +AM_V_GEN = $(am__v_GEN_@AM_V@) +am__v_GEN_ = $(am__v_GEN_@AM_DEFAULT_V@) +am__v_GEN_0 = @echo " GEN " $@; +am__v_GEN_1 = +AM_V_at = $(am__v_at_@AM_V@) +am__v_at_ = $(am__v_at_@AM_DEFAULT_V@) +am__v_at_0 = @ +am__v_at_1 = +SOURCES = +DIST_SOURCES = +am__can_run_installinfo = \ + case $$AM_UPDATE_INFO_DIR in \ + n|no|NO) false;; \ + *) (install-info --version) >/dev/null 2>&1;; \ + esac +am__vpath_adj_setup = srcdirstrip=`echo "$(srcdir)" | sed 's|.|.|g'`; +am__vpath_adj = case $$p in \ + $(srcdir)/*) f=`echo "$$p" | sed "s|^$$srcdirstrip/||"`;; \ + *) f=$$p;; \ + esac; +am__strip_dir = f=`echo $$p | sed -e 's|^.*/||'`; +am__install_max = 40 +am__nobase_strip_setup = \ + srcdirstrip=`echo "$(srcdir)" | sed 's/[].[^$$\\*|]/\\\\&/g'` +am__nobase_strip = \ + for p in $$list; do echo "$$p"; done | sed -e "s|$$srcdirstrip/||" +am__nobase_list = $(am__nobase_strip_setup); \ + for p in $$list; do echo "$$p $$p"; done | \ + sed "s| $$srcdirstrip/| |;"' / .*\//!s/ .*/ ./; s,\( .*\)/[^/]*$$,\1,' | \ + $(AWK) 'BEGIN { files["."] = "" } { files[$$2] = files[$$2] " " $$1; \ + if (++n[$$2] == $(am__install_max)) \ + { print $$2, files[$$2]; n[$$2] = 0; files[$$2] = "" } } \ + END { for (dir in files) print dir, files[dir] }' +am__base_list = \ + sed '$$!N;$$!N;$$!N;$$!N;$$!N;$$!N;$$!N;s/\n/ /g' | \ + sed '$$!N;$$!N;$$!N;$$!N;s/\n/ /g' +am__uninstall_files_from_dir = { \ + test -z "$$files" \ + || { test ! -d "$$dir" && test ! -f "$$dir" && test ! -r "$$dir"; } \ + || { echo " ( cd '$$dir' && rm -f" $$files ")"; \ + $(am__cd) "$$dir" && rm -f $$files; }; \ + } +am__installdirs = "$(DESTDIR)$(pkgdatadir)" +DATA = $(pkgdata_DATA) +am__tagged_files = $(HEADERS) $(SOURCES) $(TAGS_FILES) $(LISP) +am__DIST_COMMON = $(srcdir)/Makefile.in $(top_srcdir)/mkinstalldirs +DISTFILES = $(DIST_COMMON) $(DIST_SOURCES) $(TEXINFOS) $(EXTRA_DIST) +ACLOCAL = @ACLOCAL@ +ACLOCAL_AMFLAGS = @ACLOCAL_AMFLAGS@ +ALL_LINGUAS = @ALL_LINGUAS@ +AMTAR = @AMTAR@ +AM_DEFAULT_VERBOSITY = @AM_DEFAULT_VERBOSITY@ +AUTOCONF = @AUTOCONF@ +AUTOHEADER = @AUTOHEADER@ +AUTOMAKE = @AUTOMAKE@ +AWK = @AWK@ +CATALOGS = @CATALOGS@ +CATOBJEXT = @CATOBJEXT@ +CC = @CC@ +CCDEPMODE = @CCDEPMODE@ +CFLAGS = @CFLAGS@ +CONFIG_STATUS_DEPENDENCIES = @CONFIG_STATUS_DEPENDENCIES@ +CPP = @CPP@ +CPPFLAGS = @CPPFLAGS@ +CXX = @CXX@ +CXXCPP = @CXXCPP@ +CXXDEPMODE = @CXXDEPMODE@ +CXXFLAGS = @CXXFLAGS@ +CYGPATH_W = @CYGPATH_W@ +DATADIRNAME = @DATADIRNAME@ +DB2MAN_XSL = @DB2MAN_XSL@ +DEFS = @DEFS@ +DEPDIR = @DEPDIR@ +DISTCHECK_CONFIGURE_FLAGS = @DISTCHECK_CONFIGURE_FLAGS@ +DOC_USER_FORMATS = @DOC_USER_FORMATS@ +ECHO_C = @ECHO_C@ +ECHO_N = @ECHO_N@ +ECHO_T = @ECHO_T@ +EGREP = @EGREP@ +EXEEXT = @EXEEXT@ +EXPAT_CFLAGS = @EXPAT_CFLAGS@ +EXPAT_LIBS = @EXPAT_LIBS@ +GDK_PIXBUF_CSOURCE = @GDK_PIXBUF_CSOURCE@ +GETTEXT_MACRO_VERSION = @GETTEXT_MACRO_VERSION@ +GETTEXT_PACKAGE = @GETTEXT_PACKAGE@ +GLIB_MKENUMS = @GLIB_MKENUMS@ +GMOFILES = @GMOFILES@ +GMSGFMT = @GMSGFMT@ +GMSGFMT_015 = @GMSGFMT_015@ +GREP = @GREP@ +GTKDOC_CHECK = @GTKDOC_CHECK@ +GTKDOC_CHECK_PATH = @GTKDOC_CHECK_PATH@ +GTKDOC_DEPS_CFLAGS = @GTKDOC_DEPS_CFLAGS@ +GTKDOC_DEPS_LIBS = @GTKDOC_DEPS_LIBS@ +GTKDOC_MKPDF = @GTKDOC_MKPDF@ +GTKDOC_REBASE = @GTKDOC_REBASE@ +HAVE_SCROLLKEEPER = @HAVE_SCROLLKEEPER@ +HELP_DIR = @HELP_DIR@ +HTML_DIR = @HTML_DIR@ +INSTALL = @INSTALL@ +INSTALL_DATA = @INSTALL_DATA@ +INSTALL_PROGRAM = @INSTALL_PROGRAM@ +INSTALL_SCRIPT = @INSTALL_SCRIPT@ +INSTALL_STRIP_PROGRAM = @INSTALL_STRIP_PROGRAM@ +INSTOBJEXT = @INSTOBJEXT@ +INTLLIBS = @INTLLIBS@ +INTLTOOL_EXTRACT = @INTLTOOL_EXTRACT@ +INTLTOOL_MERGE = @INTLTOOL_MERGE@ +INTLTOOL_PERL = @INTLTOOL_PERL@ +INTLTOOL_UPDATE = @INTLTOOL_UPDATE@ +INTLTOOL_V_MERGE = @INTLTOOL_V_MERGE@ +INTLTOOL_V_MERGE_OPTIONS = @INTLTOOL_V_MERGE_OPTIONS@ +INTLTOOL__v_MERGE_ = @INTLTOOL__v_MERGE_@ +INTLTOOL__v_MERGE_0 = @INTLTOOL__v_MERGE_0@ +INTL_MACOSX_LIBS = @INTL_MACOSX_LIBS@ +ISODATE = @ISODATE@ +LDFLAGS = @LDFLAGS@ +LIBCURL = @LIBCURL@ +LIBCURL_CPPFLAGS = @LIBCURL_CPPFLAGS@ +LIBGEOCLUE_CFLAGS = @LIBGEOCLUE_CFLAGS@ +LIBGEOCLUE_LIBS = @LIBGEOCLUE_LIBS@ +LIBICONV = @LIBICONV@ +LIBINTL = @LIBINTL@ +LIBOBJS = @LIBOBJS@ +LIBS = @LIBS@ +LIBZIP_CFLAGS = @LIBZIP_CFLAGS@ +LIBZIP_LIBS = @LIBZIP_LIBS@ +LN_S = @LN_S@ +LTLIBICONV = @LTLIBICONV@ +LTLIBINTL = @LTLIBINTL@ +LTLIBOBJS = @LTLIBOBJS@ +MAKEINFO = @MAKEINFO@ +MKDIR_P = @MKDIR_P@ +MKINSTALLDIRS = @MKINSTALLDIRS@ +MSGFMT = @MSGFMT@ +MSGFMT_015 = @MSGFMT_015@ +MSGFMT_OPTS = @MSGFMT_OPTS@ +MSGMERGE = @MSGMERGE@ +OBJEXT = @OBJEXT@ +OMF_DIR = @OMF_DIR@ +PACKAGE = @PACKAGE@ +PACKAGE_BUGREPORT = @PACKAGE_BUGREPORT@ +PACKAGE_CFLAGS = @PACKAGE_CFLAGS@ +PACKAGE_LIBS = @PACKAGE_LIBS@ +PACKAGE_NAME = @PACKAGE_NAME@ +PACKAGE_STRING = @PACKAGE_STRING@ +PACKAGE_TARNAME = @PACKAGE_TARNAME@ +PACKAGE_URL = @PACKAGE_URL@ +PACKAGE_VERSION = @PACKAGE_VERSION@ +PATH_SEPARATOR = @PATH_SEPARATOR@ +PKG_CONFIG = @PKG_CONFIG@ +PKG_CONFIG_LIBDIR = @PKG_CONFIG_LIBDIR@ +PKG_CONFIG_PATH = @PKG_CONFIG_PATH@ +POFILES = @POFILES@ +POSUB = @POSUB@ +PO_IN_DATADIR_FALSE = @PO_IN_DATADIR_FALSE@ +PO_IN_DATADIR_TRUE = @PO_IN_DATADIR_TRUE@ +RANLIB = @RANLIB@ +SET_MAKE = @SET_MAKE@ +SHELL = @SHELL@ +STRIP = @STRIP@ +USE_NLS = @USE_NLS@ +VERSION = @VERSION@ +XGETTEXT = @XGETTEXT@ +XGETTEXT_015 = @XGETTEXT_015@ +XGETTEXT_EXTRA_OPTIONS = @XGETTEXT_EXTRA_OPTIONS@ +XP = @XP@ +_libcurl_config = @_libcurl_config@ +abs_builddir = @abs_builddir@ +abs_srcdir = @abs_srcdir@ +abs_top_builddir = @abs_top_builddir@ +abs_top_srcdir = @abs_top_srcdir@ +ac_ct_CC = @ac_ct_CC@ +ac_ct_CXX = @ac_ct_CXX@ +am__include = @am__include@ +am__leading_dot = @am__leading_dot@ +am__quote = @am__quote@ +am__tar = @am__tar@ +am__untar = @am__untar@ +bindir = @bindir@ +build = @build@ +build_alias = @build_alias@ +build_cpu = @build_cpu@ +build_os = @build_os@ +build_vendor = @build_vendor@ +builddir = @builddir@ +datadir = @datadir@ +datarootdir = @datarootdir@ +docdir = @docdir@ +dvidir = @dvidir@ +exec_prefix = @exec_prefix@ +host = @host@ +host_alias = @host_alias@ +host_cpu = @host_cpu@ +host_os = @host_os@ +host_vendor = @host_vendor@ +htmldir = @htmldir@ +includedir = @includedir@ +infodir = @infodir@ +install_sh = @install_sh@ +intltool__v_merge_options_ = @intltool__v_merge_options_@ +intltool__v_merge_options_0 = @intltool__v_merge_options_0@ +libdir = @libdir@ +libexecdir = @libexecdir@ +localedir = @localedir@ +localstatedir = @localstatedir@ +mandir = @mandir@ +mkdir_p = @mkdir_p@ +oldincludedir = @oldincludedir@ +pdfdir = @pdfdir@ +prefix = @prefix@ +program_transform_name = @program_transform_name@ +psdir = @psdir@ +runstatedir = @runstatedir@ +sbindir = @sbindir@ +sharedstatedir = @sharedstatedir@ +srcdir = @srcdir@ +sysconfdir = @sysconfdir@ +target = @target@ +target_alias = @target_alias@ +target_cpu = @target_cpu@ +target_os = @target_os@ +target_vendor = @target_vendor@ +top_build_prefix = @top_build_prefix@ +top_builddir = @top_builddir@ +top_srcdir = @top_srcdir@ +pkgdata_DATA = \ + maps.xml \ + external_tools.xml \ + goto_tools.xml \ + datasources.xml \ + routing.xml \ + latlontz.txt + +EXTRA_DIST = \ + $(pkgdata_DATA) + +all: all-am + +.SUFFIXES: +$(srcdir)/Makefile.in: $(srcdir)/Makefile.am $(am__configure_deps) + @for dep in $?; do \ + case '$(am__configure_deps)' in \ + *$$dep*) \ + ( cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh ) \ + && { if test -f $@; then exit 0; else break; fi; }; \ + exit 1;; \ + esac; \ + done; \ + echo ' cd $(top_srcdir) && $(AUTOMAKE) --gnu data/Makefile'; \ + $(am__cd) $(top_srcdir) && \ + $(AUTOMAKE) --gnu data/Makefile +Makefile: $(srcdir)/Makefile.in $(top_builddir)/config.status + @case '$?' in \ + *config.status*) \ + cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh;; \ + *) \ + echo ' cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__maybe_remake_depfiles)'; \ + cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__maybe_remake_depfiles);; \ + esac; + +$(top_builddir)/config.status: $(top_srcdir)/configure $(CONFIG_STATUS_DEPENDENCIES) + cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh + +$(top_srcdir)/configure: $(am__configure_deps) + cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh +$(ACLOCAL_M4): $(am__aclocal_m4_deps) + cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh +$(am__aclocal_m4_deps): +install-pkgdataDATA: $(pkgdata_DATA) + @$(NORMAL_INSTALL) + @list='$(pkgdata_DATA)'; test -n "$(pkgdatadir)" || list=; \ + if test -n "$$list"; then \ + echo " $(MKDIR_P) '$(DESTDIR)$(pkgdatadir)'"; \ + $(MKDIR_P) "$(DESTDIR)$(pkgdatadir)" || exit 1; \ + fi; \ + for p in $$list; do \ + if test -f "$$p"; then d=; else d="$(srcdir)/"; fi; \ + echo "$$d$$p"; \ + done | $(am__base_list) | \ + while read files; do \ + echo " $(INSTALL_DATA) $$files '$(DESTDIR)$(pkgdatadir)'"; \ + $(INSTALL_DATA) $$files "$(DESTDIR)$(pkgdatadir)" || exit $$?; \ + done + +uninstall-pkgdataDATA: + @$(NORMAL_UNINSTALL) + @list='$(pkgdata_DATA)'; test -n "$(pkgdatadir)" || list=; \ + files=`for p in $$list; do echo $$p; done | sed -e 's|^.*/||'`; \ + dir='$(DESTDIR)$(pkgdatadir)'; $(am__uninstall_files_from_dir) +tags TAGS: + +ctags CTAGS: + +cscope cscopelist: + + +distdir: $(BUILT_SOURCES) + $(MAKE) $(AM_MAKEFLAGS) distdir-am + +distdir-am: $(DISTFILES) + @srcdirstrip=`echo "$(srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \ + topsrcdirstrip=`echo "$(top_srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \ + list='$(DISTFILES)'; \ + dist_files=`for file in $$list; do echo $$file; done | \ + sed -e "s|^$$srcdirstrip/||;t" \ + -e "s|^$$topsrcdirstrip/|$(top_builddir)/|;t"`; \ + case $$dist_files in \ + */*) $(MKDIR_P) `echo "$$dist_files" | \ + sed '/\//!d;s|^|$(distdir)/|;s,/[^/]*$$,,' | \ + sort -u` ;; \ + esac; \ + for file in $$dist_files; do \ + if test -f $$file || test -d $$file; then d=.; else d=$(srcdir); fi; \ + if test -d $$d/$$file; then \ + dir=`echo "/$$file" | sed -e 's,/[^/]*$$,,'`; \ + if test -d "$(distdir)/$$file"; then \ + find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \ + fi; \ + if test -d $(srcdir)/$$file && test $$d != $(srcdir); then \ + cp -fpR $(srcdir)/$$file "$(distdir)$$dir" || exit 1; \ + find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \ + fi; \ + cp -fpR $$d/$$file "$(distdir)$$dir" || exit 1; \ + else \ + test -f "$(distdir)/$$file" \ + || cp -p $$d/$$file "$(distdir)/$$file" \ + || exit 1; \ + fi; \ + done +check-am: all-am +check: check-am +all-am: Makefile $(DATA) +installdirs: + for dir in "$(DESTDIR)$(pkgdatadir)"; do \ + test -z "$$dir" || $(MKDIR_P) "$$dir"; \ + done +install: install-am +install-exec: install-exec-am +install-data: install-data-am +uninstall: uninstall-am + +install-am: all-am + @$(MAKE) $(AM_MAKEFLAGS) install-exec-am install-data-am + +installcheck: installcheck-am +install-strip: + if test -z '$(STRIP)'; then \ + $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \ + install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \ + install; \ + else \ + $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \ + install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \ + "INSTALL_PROGRAM_ENV=STRIPPROG='$(STRIP)'" install; \ + fi +mostlyclean-generic: + +clean-generic: + +distclean-generic: + -test -z "$(CONFIG_CLEAN_FILES)" || rm -f $(CONFIG_CLEAN_FILES) + -test . = "$(srcdir)" || test -z "$(CONFIG_CLEAN_VPATH_FILES)" || rm -f $(CONFIG_CLEAN_VPATH_FILES) + +maintainer-clean-generic: + @echo "This command is intended for maintainers to use" + @echo "it deletes files that may require special tools to rebuild." +clean: clean-am + +clean-am: clean-generic mostlyclean-am + +distclean: distclean-am + -rm -f Makefile +distclean-am: clean-am distclean-generic + +dvi: dvi-am + +dvi-am: + +html: html-am + +html-am: + +info: info-am + +info-am: + +install-data-am: install-pkgdataDATA + +install-dvi: install-dvi-am + +install-dvi-am: + +install-exec-am: + +install-html: install-html-am + +install-html-am: + +install-info: install-info-am + +install-info-am: + +install-man: + +install-pdf: install-pdf-am + +install-pdf-am: + +install-ps: install-ps-am + +install-ps-am: + +installcheck-am: + +maintainer-clean: maintainer-clean-am + -rm -f Makefile +maintainer-clean-am: distclean-am maintainer-clean-generic + +mostlyclean: mostlyclean-am + +mostlyclean-am: mostlyclean-generic + +pdf: pdf-am + +pdf-am: + +ps: ps-am + +ps-am: + +uninstall-am: uninstall-pkgdataDATA + +.MAKE: install-am install-strip + +.PHONY: all all-am check check-am clean clean-generic cscopelist-am \ + ctags-am distclean distclean-generic distdir dvi dvi-am html \ + html-am info info-am install install-am install-data \ + install-data-am install-dvi install-dvi-am install-exec \ + install-exec-am install-html install-html-am install-info \ + install-info-am install-man install-pdf install-pdf-am \ + install-pkgdataDATA install-ps install-ps-am install-strip \ + installcheck installcheck-am installdirs maintainer-clean \ + maintainer-clean-generic mostlyclean mostlyclean-generic pdf \ + pdf-am ps ps-am tags-am uninstall uninstall-am \ + uninstall-pkgdataDATA + +.PRECIOUS: Makefile + + +# Tell versions [3.59,3.63) of GNU make to not export all variables. +# Otherwise a system limit (for SysV at least) may be exceeded. +.NOEXPORT: diff --git a/data/datasources.xml b/data/datasources.xml new file mode 100644 index 0000000..7b9c3af --- /dev/null +++ b/data/datasources.xml @@ -0,0 +1,8 @@ + + + OpenStreetMap Amenity POIs + BLTRS + osm + http://overpass-api.de/api/interpreter?data=[bbox:%s,%s,%s,%s];node[amenity="%s"];out%%20center; + + diff --git a/data/external_tools.xml b/data/external_tools.xml new file mode 100644 index 0000000..8d43197 --- /dev/null +++ b/data/external_tools.xml @@ -0,0 +1,18 @@ + + + Waymarked Trails + http://hiking.lonvia.de/en/?lat=%s&lon=%s&zoom=%d + + + Osmose + http://osmose.openstreetmap.fr/map/cgi-bin/index.py?layers=B00000FFFFFFFFFFFFT&lat=%s&lon=%s&zoom=%d + + + Yahoo! Maps + http://maps.yahoo.com/#lat=%s&lon=%s&zoom=%d + + + HERE Maps + http://here.com/%s,%s,%d + + diff --git a/data/goto_tools.xml b/data/goto_tools.xml new file mode 100644 index 0000000..e6d3bb6 --- /dev/null +++ b/data/goto_tools.xml @@ -0,0 +1,41 @@ + + + + + + + + + diff --git a/data/latlontz.txt b/data/latlontz.txt new file mode 100644 index 0000000..62c6b14 --- /dev/null +++ b/data/latlontz.txt @@ -0,0 +1,23328 @@ +42.50729 1.53414 Europe/Andorra +42.50779 1.52109 Europe/Andorra +25.56473 55.55517 Asia/Dubai +25.78953 55.9432 Asia/Dubai +25.33132 56.34199 Asia/Dubai +25.25817 55.30472 Asia/Dubai +25.61955 56.27291 Asia/Dubai +25.33737 55.41206 Asia/Dubai +24.11028 52.73056 Asia/Dubai +25.11641 56.34141 Asia/Dubai +24.19167 55.76056 Asia/Dubai +25.41111 55.43504 Asia/Dubai +25.28812 55.88157 Asia/Dubai +24.46667 54.36667 Asia/Dubai +30.95962 61.86037 Asia/Kabul +36.73605 69.53451 Asia/Kabul +33.30294 62.1474 Asia/Kabul +36.66757 65.7529 Asia/Kabul +34.10738 64.3052 Asia/Kabul +36.21544 65.93249 Asia/Kabul +35.84972 66.43694 Asia/Kabul +36.26468 68.01551 Asia/Kabul +37.12604 69.83045 Asia/Kabul +37.41853 66.04358 Asia/Kabul +37.21959 68.7802 Asia/Kabul +35.94458 68.71512 Asia/Kabul +34.58787 68.95091 Asia/Kabul +36.0649 69.13343 Asia/Kabul +35.92139 64.78361 Asia/Kabul +34.67139 70.20944 Asia/Kabul +36.70904 67.11087 Asia/Kabul +31.59382 64.37161 Asia/Kabul +33.29565 61.95221 Asia/Kabul +36.72896 68.857 Asia/Kabul +33.33951 69.92041 Asia/Kabul +36.69736 67.69826 Asia/Kabul +31.52919 62.79055 Asia/Kabul +36.6825 69.11556 Asia/Kabul +34.48108 62.5863 Asia/Kabul +31.61332 65.71013 Asia/Kabul +34.52813 69.17233 Asia/Kabul +34.42647 70.45153 Asia/Kabul +35.11833 69.23778 Asia/Kabul +34.34817 62.19967 Asia/Kabul +35.73062 63.78264 Asia/Kabul +33.55391 68.42096 Asia/Kabul +31.82089 64.57005 Asia/Kabul +33.59744 69.22592 Asia/Kabul +37.11664 70.58002 Asia/Kabul +32.37451 62.11638 Asia/Kabul +34.66667 61.06667 Asia/Kabul +35.01361 69.17139 Asia/Kabul +33.96744 68.9492 Asia/Kabul +34.82156 67.82734 Asia/Kabul +36.75635 66.8972 Asia/Kabul +36.13068 68.70829 Asia/Kabul +37.08571 69.47958 Asia/Kabul +35.03333 71.35809 Asia/Kabul +34.87311 71.14697 Asia/Kabul +36.95293 65.12376 Asia/Kabul +35.31292 69.51519 Asia/Kabul +34.12583 70.70778 Asia/Kabul +34.26545 67.34516 Asia/Kabul +17.11717 -61.84573 America/Antigua +18.21704 -63.05783 America/Anguilla +39.87556 20.00528 Europe/Tirane +42.07694 20.42194 Europe/Tirane +40.61861 20.78083 Europe/Tirane +40.07583 20.13889 Europe/Tirane +41.1125 20.08222 Europe/Tirane +41.61028 20.00889 Europe/Tirane +40.46667 19.48972 Europe/Tirane +41.3275 19.81889 Europe/Tirane +42.06828 19.51258 Europe/Tirane +40.64278 19.65083 Europe/Tirane +40.94194 19.705 Europe/Tirane +41.78361 19.64361 Europe/Tirane +41.63556 19.71306 Europe/Tirane +40.80028 19.91667 Europe/Tirane +41.50917 19.79278 Europe/Tirane +41.18556 19.55694 Europe/Tirane +40.71667 19.56667 Europe/Tirane +40.72389 19.55611 Europe/Tirane +41.32306 19.44139 Europe/Tirane +40.70583 19.95222 Europe/Tirane +39.20754 46.40576 Asia/Yerevan +39.51288 46.33816 Asia/Yerevan +39.46405 45.97047 Asia/Yerevan +39.96144 44.54447 Asia/Yerevan +39.83166 44.70489 Asia/Yerevan +40.18111 44.51361 Asia/Yerevan +40.16557 44.29462 Asia/Yerevan +40.8322 44.2673 Asia/Yerevan +40.5484 44.94868 Asia/Yerevan +40.06762 44.43591 Asia/Yerevan +40.80456 44.4939 Asia/Yerevan +40.35398 45.12386 Asia/Yerevan +40.49748 44.7662 Asia/Yerevan +40.15446 44.03815 Asia/Yerevan +40.7942 43.84528 Asia/Yerevan +40.2991 44.36204 Asia/Yerevan +40.26741 44.62656 Asia/Yerevan +-9.66078 20.39155 Africa/Luanda +-8.41915 20.74466 Africa/Luanda +-10.70727 22.22466 Africa/Luanda +-7.60874 15.06131 Africa/Luanda +-6.1349 12.36894 Africa/Luanda +-7.23116 12.8666 Africa/Luanda +-9.29782 14.91162 Africa/Luanda +-6.26703 14.2401 Africa/Luanda +-9.54015 16.34096 Africa/Luanda +-8.83682 13.23432 Africa/Luanda +-8.57848 13.66425 Africa/Luanda +-5.55 12.2 Africa/Luanda +-11.20605 13.84371 Africa/Luanda +-15.19611 12.15222 Africa/Luanda +-14.6585 17.69099 Africa/Luanda +-11.78333 19.91667 Africa/Luanda +-14.91717 13.4925 Africa/Luanda +-12.90667 15.25333 Africa/Luanda +-12.3644 13.53601 Africa/Luanda +-12.38333 16.93333 Africa/Luanda +-12.77611 15.73917 Africa/Luanda +-12.43002 13.54677 Africa/Luanda +-12.15 17.28333 Africa/Luanda +-12.01667 17.48333 Africa/Luanda +-13.78333 14.68333 Africa/Luanda +-12.8525 15.56056 Africa/Luanda +-12.57626 13.40547 Africa/Luanda +-34.09814 -59.02858 America/Argentina/Buenos_Aires +-28.48752 -59.35515 America/Argentina/Cordoba +-34.67907 -58.47262 America/Argentina/Buenos_Aires +-31.8653 -59.02689 America/Argentina/Cordoba +-37.26394 -56.97304 America/Argentina/Buenos_Aires +-34.42603 -58.57962 America/Argentina/Buenos_Aires +-37.32167 -59.13316 America/Argentina/Buenos_Aires +-26.61667 -54.13333 America/Argentina/Cordoba +-28.54939 -56.04077 America/Argentina/Cordoba +-30.94768 -59.78696 America/Argentina/Cordoba +-26.62207 -54.10842 America/Argentina/Cordoba +-27.5079 -58.55454 America/Argentina/Cordoba +-28.13306 -58.76733 America/Argentina/Cordoba +-30.57781 -59.9317 America/Argentina/Cordoba +-34.47145 -58.50776 America/Argentina/Buenos_Aires +-28.25384 -58.62591 America/Argentina/Cordoba +-34.58333 -58.38333 America/Argentina/Buenos_Aires +-27.46056 -58.98389 America/Argentina/Cordoba +-29.15 -59.65 America/Argentina/Cordoba +-34.72418 -58.25265 America/Argentina/Buenos_Aires +-26.79598 -55.02402 America/Argentina/Cordoba +-25.59912 -54.57355 America/Argentina/Cordoba +-26.01517 -54.67306 America/Argentina/Cordoba +-26.40842 -54.69463 America/Argentina/Cordoba +-27.36708 -55.89608 America/Argentina/Cordoba +-34.74974 -58.68696 America/Argentina/Buenos_Aires +-25.73239 -59.10879 America/Argentina/Cordoba +-29.71311 -57.08991 America/Argentina/Cordoba +-27.48706 -55.11994 America/Argentina/Cordoba +-38.54726 -58.73675 America/Argentina/Buenos_Aires +-34.65344 -58.61975 America/Argentina/Buenos_Aires +-30.25359 -57.63626 America/Argentina/Cordoba +-26.5662 -54.757 America/Argentina/Cordoba +-34.65146 -59.43068 America/Argentina/Buenos_Aires +-29.18186 -58.07895 America/Argentina/Cordoba +-38.00228 -57.55754 America/Argentina/Buenos_Aires +-34.57028 -59.105 America/Argentina/Buenos_Aires +-34.92145 -57.95453 America/Argentina/Buenos_Aires +-30.74485 -59.64566 America/Argentina/Cordoba +-27.04346 -55.22698 America/Argentina/Cordoba +-33.00938 -58.51722 America/Argentina/Cordoba +-33.14156 -59.30966 America/Argentina/Cordoba +-29.14003 -59.26256 America/Argentina/Cordoba +-28.05 -56.03333 America/Argentina/Cordoba +-26.53743 -59.34158 America/Argentina/Cordoba +-27.48171 -55.82921 America/Argentina/Cordoba +-26.17753 -58.17814 America/Argentina/Cordoba +-27.41813 -59.02392 America/Argentina/Cordoba +-30.95465 -58.78326 America/Argentina/Cordoba +-30.01444 -59.52719 America/Argentina/Cordoba +-27.29846 -54.19877 America/Argentina/Cordoba +-36.31322 -57.67918 America/Argentina/Buenos_Aires +-29.79171 -58.0546 America/Argentina/Cordoba +-27.4806 -58.8341 America/Argentina/Cordoba +-31.39296 -58.02089 America/Argentina/Cordoba +-32.48249 -58.23722 America/Argentina/Cordoba +-34.57365 -58.44924 America/Argentina/Buenos_Aires +-30.75048 -57.97962 America/Argentina/Cordoba +-34.16874 -58.95914 America/Argentina/Buenos_Aires +-34.61315 -58.37723 America/Argentina/Buenos_Aires +-27.48299 -58.93579 America/Argentina/Cordoba +-36.77698 -59.85854 America/Argentina/Buenos_Aires +-29.11761 -59.65834 America/Argentina/Cordoba +-27.09625 -54.89626 America/Argentina/Cordoba +-38.89916 -70.05442 America/Argentina/Salta +-26.81667 -65.31667 America/Argentina/Tucuman +-39.1 -67.06667 America/Argentina/Salta +-31.4933 -68.53838 America/Argentina/San_Juan +-32.43293 -63.24763 America/Argentina/Cordoba +-32.40751 -63.24016 America/Argentina/Cordoba +-31.94585 -65.18958 America/Argentina/Cordoba +-33.22778 -60.3297 America/Argentina/Cordoba +-31.42414 -64.49778 America/Argentina/Cordoba +-27.57383 -60.71526 America/Argentina/Cordoba +-31.29458 -64.29538 America/Argentina/Cordoba +-40.81345 -62.99668 America/Argentina/Salta +-32.61841 -60.15478 America/Argentina/Cordoba +-29.4593 -60.21261 America/Argentina/Cordoba +-33.74556 -61.96884 America/Argentina/Cordoba +-35.4323 -60.17271 America/Argentina/Buenos_Aires +-54.8 -68.3 America/Argentina/Ushuaia +-31.23073 -64.31615 America/Argentina/Cordoba +-26.34066 -60.43207 America/Argentina/Cordoba +-38.37394 -60.27978 America/Argentina/Buenos_Aires +-43.24895 -65.30505 America/Argentina/Catamarca +-27.49983 -64.86042 America/Argentina/Cordoba +-22.51636 -63.80131 America/Argentina/Salta +-26.73201 -65.25921 America/Argentina/Tucuman +-30.94404 -61.56148 America/Argentina/Cordoba +-31.66274 -60.7653 America/Argentina/Cordoba +-27.79511 -64.26149 America/Argentina/Cordoba +-36.61667 -64.28333 America/Argentina/Salta +-31.53987 -68.49503 America/Argentina/San_Juan +-31.63333 -60.7 America/Argentina/Cordoba +-24.19456 -65.29712 America/Argentina/Jujuy +-23.13705 -64.32426 America/Argentina/Salta +-34.61772 -68.33007 America/Argentina/Mendoza +-24.23127 -64.86614 America/Argentina/Jujuy +-33.33578 -60.22523 America/Argentina/Buenos_Aires +-26.82414 -65.2226 America/Argentina/Tucuman +-40.16038 -71.34865 America/Argentina/Salta +-33.08103 -68.46814 America/Argentina/Mendoza +-33.29501 -66.33563 America/Argentina/San_Luis +-30.78913 -60.59189 America/Argentina/Cordoba +-31.5375 -68.53639 America/Argentina/San_Juan +-30.24057 -68.74693 America/Argentina/San_Juan +-31.89618 -61.85984 America/Argentina/Cordoba +-31.42797 -62.08266 America/Argentina/Cordoba +-28.46957 -65.78524 America/Argentina/Catamarca +-40.73193 -64.94769 America/Argentina/Salta +-24.7859 -65.41166 America/Argentina/Salta +-34.26827 -62.71262 America/Argentina/Cordoba +-32.94682 -60.63932 America/Argentina/Cordoba +-32.17301 -64.11406 America/Argentina/Cordoba +-31.6526 -63.9099 America/Argentina/Cordoba +-51.62261 -69.21813 America/Argentina/Rio_Gallegos +-33.13067 -64.34992 America/Argentina/Cordoba +-31.16486 -64.32241 America/Argentina/Cordoba +-43.30016 -65.10228 America/Argentina/Catamarca +-31.25033 -61.4867 America/Argentina/Cordoba +-26.86913 -60.21683 America/Argentina/Cordoba +-38.87588 -62.07359 America/Argentina/Buenos_Aires +-42.7692 -65.03851 America/Argentina/Catamarca +-26.78522 -60.43876 America/Argentina/Cordoba +-31.68333 -68.58333 America/Argentina/San_Juan +-38.96667 -68.23333 America/Argentina/Salta +-33.88995 -60.57357 America/Argentina/Buenos_Aires +-32.99835 -60.76791 America/Argentina/Cordoba +-31.73197 -60.5238 America/Argentina/Cordoba +-24.25648 -65.21163 America/Argentina/Jujuy +-36.89272 -60.32254 America/Argentina/Buenos_Aires +-35.44437 -60.88313 America/Argentina/Buenos_Aires +-38.95161 -68.0591 America/Argentina/Salta +-30.71164 -61.99862 America/Argentina/Cordoba +-27.16742 -65.49832 America/Argentina/Tucuman +-32.89084 -68.82717 America/Argentina/Mendoza +-32.6978 -62.10672 America/Argentina/Cordoba +-26.92614 -60.04956 America/Argentina/Cordoba +-34.86649 -61.5302 America/Argentina/Buenos_Aires +-23.80644 -64.78757 America/Argentina/Jujuy +-27.08966 -61.08161 America/Argentina/Cordoba +-29.41105 -66.85067 America/Argentina/La_Rioja +-31.08841 -64.48987 America/Argentina/Cordoba +-31.34377 -64.33529 America/Argentina/Cordoba +-34.12662 -63.39119 America/Argentina/Cordoba +-34.58382 -60.94332 America/Argentina/Buenos_Aires +-25.08333 -64.18333 America/Argentina/Salta +-30.98153 -64.09424 America/Argentina/Cordoba +-32.85683 -60.71754 America/Argentina/Cordoba +-33.03016 -60.64045 America/Argentina/Cordoba +-39.03333 -67.58333 America/Argentina/Salta +-27.31667 -61.28333 America/Argentina/Cordoba +-35.65662 -63.75682 America/Argentina/Salta +-22.59588 -63.81255 America/Argentina/Salta +-32.02927 -61.22103 America/Argentina/Cordoba +-33.45937 -61.4832 America/Argentina/Cordoba +-27.05413 -65.40329 America/Argentina/Tucuman +-42.91147 -71.31947 America/Argentina/Catamarca +-31.4488 -60.93173 America/Argentina/Cordoba +-23.20898 -64.09605 America/Argentina/Salta +-32.18 -64.41809 America/Argentina/Cordoba +-41.96051 -71.53336 America/Argentina/Salta +-32.06641 -60.63836 America/Argentina/Cordoba +-30.42036 -64.34984 America/Argentina/Cordoba +-38.93424 -69.23052 America/Argentina/Salta +-30.72644 -64.80387 America/Argentina/Cordoba +-32.02873 -60.30658 America/Argentina/Cordoba +-31.24508 -64.46563 America/Argentina/Cordoba +-37.45467 -61.93343 America/Argentina/Buenos_Aires +-31.97263 -60.91982 America/Argentina/Cordoba +-31.4135 -64.18105 America/Argentina/Cordoba +-45.86414 -67.49656 America/Argentina/Catamarca +-38.93392 -67.99032 America/Argentina/Salta +-38.82224 -68.06293 America/Argentina/Salta +-34.89566 -60.01667 America/Argentina/Buenos_Aires +-31.48333 -68.53333 America/Argentina/San_Juan +-29.16195 -67.4974 America/Argentina/La_Rioja +-27.21438 -61.18795 America/Argentina/Cordoba +-34.64167 -60.47389 America/Argentina/Buenos_Aires +-38.82955 -68.1318 America/Argentina/Salta +-31.65179 -68.28105 America/Argentina/San_Juan +-37.87907 -67.7956 America/Argentina/Salta +-25.94679 -60.61947 America/Argentina/Cordoba +-33.04417 -61.16806 America/Argentina/Cordoba +-32.85679 -61.15331 America/Argentina/Cordoba +-32.82262 -60.71852 America/Argentina/Cordoba +-32.81636 -61.39493 America/Argentina/Cordoba +-46.43929 -67.52814 America/Argentina/Rio_Gallegos +-32.62591 -62.68873 America/Argentina/Cordoba +-27.03084 -65.30315 America/Argentina/Tucuman +-38.7196 -62.27243 America/Argentina/Buenos_Aires +-33.15489 -60.50863 America/Argentina/Cordoba +-31.42022 -63.05002 America/Argentina/Cordoba +-28.46064 -62.83472 America/Argentina/Cordoba +-31.65292 -64.42826 America/Argentina/Cordoba +-38.97736 -67.82714 America/Argentina/Salta +-26.81667 -65.13333 America/Argentina/Tucuman +-31.43722 -68.52556 America/Argentina/San_Juan +-27.4338 -65.61427 America/Argentina/Tucuman +-34.61082 -58.481 America/Argentina/Buenos_Aires +-33.67571 -65.45783 America/Argentina/San_Luis +-41.14557 -71.30822 America/Argentina/Salta +-14.27806 -170.7025 Pacific/Pago_Pago +46.84056 14.84417 Europe/Vienna +47.8 16.25 Europe/Vienna +48.20849 16.37208 Europe/Vienna +48.16667 14.03333 Europe/Vienna +48.4 15.6 Europe/Vienna +46.61028 13.85583 Europe/Vienna +48.22656 14.23459 Europe/Vienna +48.01485 16.29324 Europe/Vienna +47.71565 16.03575 Europe/Vienna +48.04274 14.42127 Europe/Vienna +46.8 13.5 Europe/Vienna +48.13333 16.46667 Europe/Vienna +48.2 15.63333 Europe/Vienna +47.79941 13.04399 Europe/Vienna +47.42681 12.848 Europe/Vienna +48.08605 16.28921 Europe/Vienna +47.42642 9.65851 Europe/Vienna +48.30639 14.28611 Europe/Vienna +48.27965 14.2533 Europe/Vienna +47.3765 15.09144 Europe/Vienna +47.58333 12.16667 Europe/Vienna +48.40921 15.61415 Europe/Vienna +48.30521 16.32522 Europe/Vienna +46.62472 14.30528 Europe/Vienna +47.44458 15.29331 Europe/Vienna +47.26266 11.39454 Europe/Vienna +47.68333 13.1 Europe/Vienna +47.06667 15.45 Europe/Vienna +47.23306 9.6 Europe/Vienna +47.41427 9.74195 Europe/Vienna +47.50311 9.7471 Europe/Vienna +48.25628 13.04343 Europe/Vienna +48.00543 16.23264 Europe/Vienna +48.1229 14.87206 Europe/Vienna +47.965 13.04944 Europe/Vienna +-33.03268 137.56484 Australia/Adelaide +-32.27682 115.72978 Australia/Perth +-34.88241 138.5933 Australia/Adelaide +-20.31215 118.61059 Australia/Perth +-31.95224 115.8614 Australia/Perth +-35.11986 139.27345 Australia/Adelaide +-20.72523 139.49727 Australia/Brisbane +-35.13333 138.51667 Australia/Adelaide +-32.5269 115.7217 Australia/Perth +-32.23013 115.78128 Australia/Perth +-30.74614 121.4742 Australia/Perth +-32.081 116.0054 Australia/Perth +-28.77897 114.61459 Australia/Perth +-34.60251 138.74902 Australia/Adelaide +-32.05 115.76667 Australia/Perth +-12.46113 130.84185 Australia/Darwin +-33.65249 115.3455 Australia/Perth +-33.32711 115.64137 Australia/Perth +-32.14607 116.0093 Australia/Perth +-23.69748 133.88362 Australia/Darwin +-35.0031 117.86595 Australia/Perth +-34.92866 138.59863 Australia/Adelaide +-27.63333 153.1 Australia/Brisbane +-36.12179 146.88809 Australia/Melbourne +-38.38176 142.48799 Australia/Melbourne +-36.35846 146.32056 Australia/Melbourne +-35.12577 147.35374 Australia/Sydney +-38.19528 146.5415 Australia/Melbourne +-19.26639 146.8057 Australia/Brisbane +-27.56056 151.95386 Australia/Brisbane +-31.91099 152.45387 Australia/Sydney +-31.09048 150.92905 Australia/Sydney +-33.86785 151.20732 Australia/Sydney +-28.00274 153.42999 Australia/Brisbane +-27.58333 153.05 Australia/Brisbane +-37.57742 144.72607 Australia/Melbourne +-32.71314 152.06623 Australia/Sydney +-27.96724 153.39796 Australia/Brisbane +-29.7076 152.92627 Australia/Sydney +-36.38047 145.39867 Australia/Melbourne +-37.8676 144.98099 Australia/Melbourne +-23.38032 150.50595 Australia/Brisbane +-37.81819 145.00176 Australia/Melbourne +-35.35493 149.232 Australia/Sydney +-33.73333 150.88333 Australia/Sydney +-31.43084 152.90894 Australia/Sydney +-33.28397 149.10018 Australia/Sydney +-34.88422 150.60036 Australia/Sydney +-32.92715 151.77647 Australia/Sydney +-27.98941 153.33633 Australia/Brisbane +-37.91667 145.2 Australia/Melbourne +-37.8318 140.77919 Australia/Adelaide +-33.83902 151.23956 Australia/Sydney +-38.21792 145.03876 Australia/Melbourne +-27.10876 152.94907 Australia/Brisbane +-38.17828 146.26099 Australia/Melbourne +-34.18551 142.16251 Australia/Melbourne +-37.68339 144.58543 Australia/Melbourne +-37.814 144.96332 Australia/Melbourne +-25.54073 152.70493 Australia/Brisbane +-33.90318 151.15176 Australia/Sydney +-33.95 151.23333 Australia/Sydney +-32.73308 151.5574 Australia/Sydney +-21.15345 149.16554 Australia/Brisbane +-33.9 150.93333 Australia/Sydney +-28.81354 153.2773 Australia/Sydney +-41.43876 147.13467 Australia/Hobart +-33.71977 150.30739 Australia/Sydney +-33.70244 151.09931 Australia/Sydney +-42.87936 147.32941 Australia/Hobart +-34.28853 146.05093 Australia/Sydney +-37.70462 145.10302 Australia/Melbourne +-33.83333 151.01667 Australia/Sydney +-34.75155 149.72086 Australia/Sydney +-28.00029 153.43088 Australia/Brisbane +-23.84761 151.25635 Australia/Brisbane +-38.14711 144.36069 Australia/Melbourne +-38.13333 145.13333 Australia/Melbourne +-32.18136 152.51715 Australia/Sydney +-33.77271 151.08184 Australia/Sydney +-34.06667 151.01667 Australia/Sydney +-36.14057 144.75185 Australia/Melbourne +-33.95 151.1 Australia/Sydney +-32.24295 148.60484 Australia/Sydney +-41.17695 146.35152 Australia/Hobart +-27.19354 153.02631 Australia/Brisbane +-34.06251 151.14961 Australia/Sydney +-38.1 145.28333 Australia/Melbourne +-37.6 144.95 Australia/Melbourne +-30.29626 153.11351 Australia/Sydney +-34.424 150.89345 Australia/Sydney +-32.83211 151.35623 Australia/Sydney +-33.73333 151 Australia/Sydney +-33.78269 151.04888 Australia/Sydney +-34.04726 151.12051 Australia/Sydney +-35.28346 149.12807 Australia/Sydney +-37.84205 145.0694 Australia/Melbourne +-26.79709 153.13771 Australia/Brisbane +-16.92304 145.76625 Australia/Brisbane +-27.08465 152.9511 Australia/Brisbane +-41.05584 145.90375 Australia/Hobart +-24.86621 152.3479 Australia/Brisbane +-26.68443 153.05705 Australia/Brisbane +-37.76667 144.96667 Australia/Melbourne +-31.96173 141.45998 Australia/Broken_Hill +-27.46794 153.02809 Australia/Brisbane +-33.76667 150.91667 Australia/Sydney +-36.75818 144.28024 Australia/Melbourne +-33.41665 149.5806 Australia/Sydney +-28.21298 153.53634 Australia/Sydney +-37.56622 143.84957 Australia/Melbourne +-30.50828 151.67123 Australia/Sydney +-36.07494 146.92394 Australia/Sydney +-27.48034 153.02049 Australia/Brisbane +-33.91439 151.24895 Australia/Sydney +-33.75 151.3 Australia/Sydney +-12.48602 130.9833 Australia/Darwin +-27.3171 153.03097 Australia/Brisbane +-33.79677 151.12436 Australia/Sydney +-37.88264 144.7003 Australia/Melbourne +-27.63917 153.10944 Australia/Brisbane +-27.50578 153.10236 Australia/Brisbane +-33.8178 151.00348 Australia/Sydney +-37.88461 145.29539 Australia/Melbourne +-33.81667 151 Australia/Sydney +-34.91118 138.70735 Australia/Adelaide +-32.05798 115.91814 Australia/Perth +-33.79068 150.6693 Australia/Sydney +-37.85995 145.05489 Australia/Melbourne +-37.79086 145.09386 Australia/Melbourne +-37.88867 145.05713 Australia/Melbourne +-37.87397 145.04253 Australia/Melbourne +-37.90141 145.01884 Australia/Melbourne +-37.9201 145.05987 Australia/Melbourne +-27.61328 152.78944 Australia/Brisbane +-37.74496 144.80049 Australia/Melbourne +-37.97695 145.25866 Australia/Melbourne +-37.91731 145.13041 Australia/Melbourne +-28.07751 153.38571 Australia/Brisbane +12.52398 -70.02703 America/Aruba +12.53333 -69.98333 America/Aruba +12.51667 -69.95 America/Aruba +60.09726 19.93481 Europe/Mariehamn +39.8177 46.7528 Asia/Baku +39.87867 48.39902 Asia/Baku +39.76006 46.74989 Asia/Baku +39.59621 48.98479 Asia/Baku +39.93214 48.36892 Asia/Baku +39.3768 49.247 Asia/Baku +39.20889 45.41222 Asia/Baku +38.75428 48.85062 Asia/Baku +39.87095 48.05995 Asia/Baku +39.60094 47.14529 Asia/Baku +39.20963 48.49186 Asia/Baku +39.45833 48.545 Asia/Baku +39.77556 47.61861 Asia/Baku +38.45598 48.87498 Asia/Baku +39.93778 48.929 Asia/Baku +39.99096 46.92736 Asia/Baku +41.6316 46.64479 Asia/Baku +40.47746 49.94174 Asia/Baku +40.61832 47.15014 Asia/Baku +40.58584 46.3189 Asia/Baku +41.46426 48.80565 Asia/Baku +40.51902 47.65423 Asia/Baku +40.34179 46.93242 Asia/Baku +40.58972 49.66861 Asia/Baku +40.39667 49.97361 Asia/Baku +40.82975 46.0178 Asia/Baku +40.63141 48.64137 Asia/Baku +41.19194 47.17056 Asia/Baku +40.4425 49.94806 Asia/Baku +40.00869 48.47701 Asia/Baku +41.4275 48.4302 Asia/Baku +41.36108 48.51341 Asia/Baku +40.03874 48.94286 Asia/Baku +41.09246 45.36561 Asia/Baku +40.62333 49.55861 Asia/Baku +40.76395 47.05953 Asia/Baku +40.52982 50.00616 Asia/Baku +40.49182 50.14292 Asia/Baku +40.3256 49.73376 Asia/Baku +40.34532 48.15085 Asia/Baku +40.44808 49.75502 Asia/Baku +40.43026 50.03598 Asia/Baku +40.65056 47.74219 Asia/Baku +40.37444 50.08528 Asia/Baku +40.68278 46.36056 Asia/Baku +41.20117 48.98712 Asia/Baku +40.51903 50.11438 Asia/Baku +40.45076 50.08686 Asia/Baku +40.37577 47.12619 Asia/Baku +40.4444 49.80566 Asia/Baku +40.37767 49.89201 Asia/Baku +40.42639 49.98361 Asia/Baku +40.57028 48.40087 Asia/Baku +40.64699 47.4738 Asia/Baku +40.05015 47.45937 Asia/Baku +40.41894 49.96693 Asia/Baku +44.20169 17.90397 Europe/Sarajevo +43.98889 18.17806 Europe/Sarajevo +45.18497 15.80579 Europe/Sarajevo +44.53842 18.66709 Europe/Sarajevo +42.71197 18.34362 Europe/Sarajevo +44.22637 17.66582 Europe/Sarajevo +43.84864 18.35644 Europe/Sarajevo +44.97991 16.71401 Europe/Sarajevo +43.34333 17.80806 Europe/Sarajevo +44.87851 18.42764 Europe/Sarajevo +44.70307 18.3101 Europe/Sarajevo +43.66795 18.97564 Europe/Sarajevo +44.73179 18.08698 Europe/Sarajevo +44.96694 15.94306 Europe/Sarajevo +44.05722 17.45083 Europe/Sarajevo +44.87278 18.80833 Europe/Sarajevo +44.8825 16.15139 Europe/Sarajevo +44.75874 19.21437 Europe/Sarajevo +44.81694 15.87083 Europe/Sarajevo +44.77583 17.18556 Europe/Sarajevo +43.65126 17.96082 Europe/Sarajevo +13.1 -59.61667 America/Barbados +26.03097 88.46989 Asia/Dhaka +20.86382 92.30153 Asia/Dhaka +23.89154 90.40232 Asia/Dhaka +24.89904 91.87198 Asia/Dhaka +23.59311 90.14251 Asia/Dhaka +24.91965 89.94812 Asia/Dhaka +24.68501 88.15638 Asia/Dhaka +22.70817 89.07185 Asia/Dhaka +24.45771 89.70802 Asia/Dhaka +24.88352 90.72898 Asia/Dhaka +23.92298 90.71768 Asia/Dhaka +22.51409 91.45491 Asia/Dhaka +24.17687 89.5988 Asia/Dhaka +23.1006 90.84989 Asia/Dhaka +24.374 88.60114 Asia/Dhaka +22.57965 89.97521 Asia/Dhaka +26.33338 88.55777 Asia/Dhaka +22.29543 91.979 Asia/Dhaka +25.66369 88.93093 Asia/Dhaka +23.61352 90.50298 Asia/Dhaka +22.63696 90.27195 Asia/Dhaka +24.05783 89.87696 Asia/Dhaka +25.96817 89.69153 Asia/Dhaka +24.75636 90.40646 Asia/Dhaka +24.76484 90.25698 Asia/Dhaka +24.10287 90.09841 Asia/Dhaka +24.48888 91.77075 Asia/Dhaka +22.45566 89.85584 Asia/Dhaka +22.82257 90.52859 Asia/Dhaka +22.28616 89.95882 Asia/Dhaka +25.91719 89.44595 Asia/Dhaka +23.24018 91.12143 Asia/Dhaka +23.46186 91.18504 Asia/Dhaka +25.74664 89.25166 Asia/Dhaka +23.9028 89.11943 Asia/Dhaka +23.40964 89.13801 Asia/Dhaka +23.11134 89.09061 Asia/Dhaka +25.10147 89.02734 Asia/Dhaka +24.12858 89.06573 Asia/Dhaka +24.38044 91.413 Asia/Dhaka +22.97372 90.22376 Asia/Dhaka +24.432 90.5585 Asia/Dhaka +23.01134 91.4013 Asia/Dhaka +23.0391 90.76808 Asia/Dhaka +22.31006 89.79113 Asia/Dhaka +23.7104 90.40744 Asia/Dhaka +25.55613 89.67097 Asia/Dhaka +23.02475 91.51092 Asia/Dhaka +22.33774 90.73708 Asia/Dhaka +23.10787 91.97006 Asia/Dhaka +25.03858 91.6815 Asia/Dhaka +23.01472 89.43936 Asia/Dhaka +24.02452 88.99234 Asia/Dhaka +24.0524 90.9764 Asia/Dhaka +22.19534 92.21946 Asia/Dhaka +23.043 89.63094 Asia/Dhaka +24.51863 91.35787 Asia/Dhaka +24.21623 90.95002 Asia/Dhaka +25.67419 89.05377 Asia/Dhaka +23.15509 89.49515 Asia/Dhaka +22.89983 89.90326 Asia/Dhaka +24.75127 89.83126 Asia/Dhaka +24.31988 90.16943 Asia/Dhaka +22.53511 91.91919 Asia/Dhaka +22.71673 89.51194 Asia/Dhaka +23.21824 90.35076 Asia/Dhaka +24.80418 88.94875 Asia/Dhaka +23.88791 90.96792 Asia/Dhaka +22.9443 90.83005 Asia/Dhaka +22.90725 89.21954 Asia/Dhaka +23.25191 90.85508 Asia/Dhaka +23.60612 89.84064 Asia/Dhaka +25.62745 88.63779 Asia/Dhaka +22.22647 90.71275 Asia/Dhaka +22.3384 91.83168 Asia/Dhaka +23.30916 90.22698 Asia/Dhaka +24.07821 89.63262 Asia/Dhaka +22.49518 90.7239 Asia/Dhaka +22.07639 92.04955 Asia/Dhaka +21.45388 91.96765 Asia/Dhaka +22.80978 89.56439 Asia/Dhaka +22.68759 90.64403 Asia/Dhaka +22.70497 90.37013 Asia/Dhaka +23.16971 89.21371 Asia/Dhaka +24.00644 89.2372 Asia/Dhaka +24.24984 89.91655 Asia/Dhaka +24.85098 89.37108 Asia/Dhaka +25.85587 88.35943 Asia/Dhaka +24.59025 88.27444 Asia/Dhaka +23.17097 90.20935 Asia/Dhaka +25.01881 90.01751 Asia/Dhaka +24.43944 90.78291 Asia/Dhaka +22.83957 91.84128 Asia/Dhaka +22.48898 90.06273 Asia/Dhaka +22.68768 91.78123 Asia/Dhaka +25.77769 88.89169 Asia/Dhaka +51.21979 4.32664 Europe/Brussels +50.81268 3.33848 Europe/Brussels +50.86956 3.81052 Europe/Brussels +50.99064 5.36819 Europe/Brussels +51.26825 4.71296 Europe/Brussels +50.98318 4.46079 Europe/Brussels +51.06566 4.0403 Europe/Brussels +51.14236 3.1368 Europe/Brussels +50.88365 4.47298 Europe/Brussels +51.39214 4.59546 Europe/Brussels +51.06041 4.36019 Europe/Brussels +50.8 3.16667 Europe/Brussels +51.00526 3.88341 Europe/Brussels +51.09049 4.91544 Europe/Brussels +50.78069 3.03854 Europe/Brussels +50.71717 4.60138 Europe/Brussels +50.71469 4.3991 Europe/Brussels +50.88898 3.42756 Europe/Brussels +50.25401 4.43796 Europe/Brussels +50.7376 5.69907 Europe/Brussels +50.92814 4.42938 Europe/Brussels +50.58907 5.86241 Europe/Brussels +51.32254 4.94471 Europe/Brussels +50.69059 4.2009 Europe/Brussels +50.60715 3.38932 Europe/Brussels +51.0656 3.10085 Europe/Brussels +50.78054 5.46484 Europe/Brussels +50.80744 4.9378 Europe/Brussels +50.99931 3.32707 Europe/Brussels +51.06513 5.08856 Europe/Brussels +50.82372 4.51418 Europe/Brussels +51.12794 4.21372 Europe/Brussels +51.2099 4.0365 Europe/Brussels +51.33189 4.37127 Europe/Brussels +50.61385 5.74679 Europe/Brussels +50.57904 4.07129 Europe/Brussels +50.81679 5.18647 Europe/Brussels +50.77926 4.24355 Europe/Brussels +51.16509 4.1437 Europe/Brussels +51.21399 3.24949 Europe/Brussels +51.06691 4.53469 Europe/Brussels +51.21914 4.12374 Europe/Brussels +50.74645 4.35754 Europe/Brussels +50.58362 5.50115 Europe/Brussels +51.25251 4.50268 Europe/Brussels +51.24107 4.58336 Europe/Brussels +50.62837 5.53243 Europe/Brussels +50.44816 3.81886 Europe/Brussels +50.95302 4.71665 Europe/Brussels +50.74574 3.6005 Europe/Brussels +50.94653 3.12269 Europe/Brussels +50.71229 4.52529 Europe/Brussels +50.80995 5.60131 Europe/Brussels +51.18983 4.56533 Europe/Brussels +50.44067 3.8653 Europe/Brussels +51.07409 4.28844 Europe/Brussels +51.05337 4.63263 Europe/Brussels +50.85386 2.72659 Europe/Brussels +50.50518 4.36887 Europe/Brussels +50.50819 3.59373 Europe/Brussels +51.1303 5.45952 Europe/Brussels +50.77436 4.53461 Europe/Brussels +50.71184 5.6468 Europe/Brussels +50.85168 3.60891 Europe/Brussels +51.15432 3.23128 Europe/Brussels +51.22339 2.91185 Europe/Brussels +50.59833 4.32848 Europe/Brussels +50.82776 4.02657 Europe/Brussels +51.16096 4.67008 Europe/Brussels +51.22807 5.4427 Europe/Brussels +50.4669 4.86746 Europe/Brussels +50.74497 3.20639 Europe/Brussels +51.16697 4.45127 Europe/Brussels +50.45502 4.24519 Europe/Brussels +50.45413 3.95229 Europe/Brussels +51.19188 5.11662 Europe/Brussels +51.18532 2.82077 Europe/Brussels +50.99447 3.74621 Europe/Brussels +50.79722 3.12245 Europe/Brussels +50.93934 4.32655 Europe/Brussels +51.02574 4.47762 Europe/Brussels +50.22678 5.34416 Europe/Brussels +50.50312 4.23589 Europe/Brussels +51.20737 3.44511 Europe/Brussels +50.96545 5.69452 Europe/Brussels +51.09802 5.78379 Europe/Brussels +50.66829 4.61443 Europe/Brussels +51.00468 4.30304 Europe/Brussels +51.23074 5.31349 Europe/Brussels +51.10364 3.99339 Europe/Brussels +51.09644 3.83194 Europe/Brussels +51.24197 4.82312 Europe/Brussels +51.13128 4.57042 Europe/Brussels +50.63373 5.56749 Europe/Brussels +50.87959 4.70093 Europe/Brussels +50.71104 3.83579 Europe/Brussels +50.96626 3.98594 Europe/Brussels +51.00464 4.13457 Europe/Brussels +50.89318 5.6468 Europe/Brussels +50.48657 4.18785 Europe/Brussels +50.82803 3.26487 Europe/Brussels +50.88982 4.54353 Europe/Brussels +51.13213 4.44706 Europe/Brussels +51.11642 2.63772 Europe/Brussels +51.35 3.26667 Europe/Brussels +51.24118 4.96651 Europe/Brussels +51.31377 4.43539 Europe/Brussels +51.38442 4.47556 Europe/Brussels +50.91396 3.21378 Europe/Brussels +50.85114 2.88569 Europe/Brussels +50.51894 5.23284 Europe/Brussels +51.03427 5.37429 Europe/Brussels +51.40029 4.76034 Europe/Brussels +51.17611 4.34844 Europe/Brussels +51.03664 5.28013 Europe/Brussels +50.88681 3.89014 Europe/Brussels +50.64083 5.79353 Europe/Brussels +50.66415 5.62346 Europe/Brussels +51.17655 4.83248 Europe/Brussels +50.90861 4.67056 Europe/Brussels +51.05591 5.38244 Europe/Brussels +51.07537 4.72827 Europe/Brussels +50.93106 5.33781 Europe/Brussels +50.85343 3.30935 Europe/Brussels +51.09822 4.13705 Europe/Brussels +50.73385 4.23454 Europe/Brussels +50.90634 4.00093 Europe/Brussels +50.93409 4.37213 Europe/Brussels +50.77343 3.88223 Europe/Brussels +51.05 3.71667 Europe/Brussels +50.965 5.50082 Europe/Brussels +50.56149 4.69889 Europe/Brussels +51.16557 4.98917 Europe/Brussels +50.40578 3.89603 Europe/Brussels +50.48351 4.55006 Europe/Brussels +50.61516 5.68062 Europe/Brussels +50.59994 5.44471 Europe/Brussels +51.1053 3.704 Europe/Brussels +50.6279 6.03647 Europe/Brussels +51.46272 4.45393 Europe/Brussels +51.18703 3.55654 Europe/Brussels +51.15662 4.44504 Europe/Brussels +51.09554 4.50903 Europe/Brussels +50.39583 3.77792 Europe/Brussels +50.84799 4.25972 Europe/Brussels +51.03248 2.86384 Europe/Brussels +50.98923 5.05062 Europe/Brussels +50.90769 5.41875 Europe/Brussels +51.05952 3.79899 Europe/Brussels +51.02869 4.10106 Europe/Brussels +50.88506 4.07601 Europe/Brussels +50.98175 3.53096 Europe/Brussels +50.46379 4.3747 Europe/Brussels +50.4141 3.85569 Europe/Brussels +50.5828 5.6341 Europe/Brussels +50.40338 4.52826 Europe/Brussels +50.42842 3.95001 Europe/Brussels +50.41136 4.44448 Europe/Brussels +50.85045 4.34878 Europe/Brussels +51.20892 3.22424 Europe/Brussels +51.35024 4.63829 Europe/Brussels +51.2912 4.49182 Europe/Brussels +50.60979 4.14658 Europe/Brussels +50.68363 4.36784 Europe/Brussels +50.43417 3.7944 Europe/Brussels +51.09716 4.24364 Europe/Brussels +51.09242 4.3717 Europe/Brussels +51.31306 3.13227 Europe/Brussels +50.41155 4.16469 Europe/Brussels +50.87325 5.5184 Europe/Brussels +51.21187 4.25633 Europe/Brussels +51.04954 5.22606 Europe/Brussels +50.76589 4.3002 Europe/Brussels +51.31927 4.85304 Europe/Brussels +51.16837 5.17027 Europe/Brussels +50.62937 3.77801 Europe/Brussels +50.91011 4.19836 Europe/Brussels +49.68333 5.81667 Europe/Brussels +51.21989 4.40346 Europe/Brussels +50.6623 5.52029 Europe/Brussels +50.48941 5.09513 Europe/Brussels +50.98715 4.83695 Europe/Brussels +51.09017 3.44693 Europe/Brussels +50.93604 4.0355 Europe/Brussels +12.24922 -0.61527 Africa/Ouagadougou +12.9591 -2.26075 Africa/Ouagadougou +13.0725 -3.0694 Africa/Ouagadougou +13.76667 -2.06667 Africa/Ouagadougou +11.78 -0.36972 Africa/Ouagadougou +12.31963 -2.47094 Africa/Ouagadougou +11.16972 -1.145 Africa/Ouagadougou +13.58278 -2.42158 Africa/Ouagadougou +12.36566 -1.53388 Africa/Ouagadougou +12.72938 -3.86305 Africa/Ouagadougou +11.66361 -1.07306 Africa/Ouagadougou +11.10033 -2.10654 Africa/Ouagadougou +12.17864 -0.35103 Africa/Ouagadougou +12.25263 -2.36272 Africa/Ouagadougou +13.32583 -1.53472 Africa/Ouagadougou +12.06095 -1.33355 Africa/Ouagadougou +12.18972 -1.88556 Africa/Ouagadougou +13.09167 -1.08444 Africa/Ouagadougou +11.5 -3.51667 Africa/Ouagadougou +13.20776 -2.35893 Africa/Ouagadougou +11.8 -0.55056 Africa/Ouagadougou +12.06157 0.35843 Africa/Ouagadougou +14.0354 -0.0345 Africa/Ouagadougou +14.0994 -1.62554 Africa/Ouagadougou +12.07305 1.78838 Africa/Ouagadougou +12.46338 -3.46075 Africa/Ouagadougou +12.6576 -1.89288 Africa/Ouagadougou +12.66664 -0.57468 Africa/Ouagadougou +11.17715 -4.2979 Africa/Ouagadougou +10.63333 -4.76667 Africa/Ouagadougou +10.29917 -3.25083 Africa/Ouagadougou +10.94917 -4.93417 Africa/Ouagadougou +42.48333 26.5 Europe/Sofia +43.21 23.5625 Europe/Sofia +43.99 22.8725 Europe/Sofia +42.02754 23.99155 Europe/Sofia +43.08124 25.62904 Europe/Sofia +43.21667 27.91667 Europe/Sofia +43.2512 26.57215 Europe/Sofia +42.89427 24.71589 Europe/Sofia +43.56667 27.83333 Europe/Sofia +43.61959 25.35044 Europe/Sofia +41.76667 26.2 Europe/Sofia +42.43278 25.64194 Europe/Sofia +42.26667 23.11667 Europe/Sofia +42.69751 23.32415 Europe/Sofia +41.58528 24.69194 Europe/Sofia +42.68583 26.32917 Europe/Sofia +44.11667 27.26667 Europe/Sofia +43.27064 26.92286 Europe/Sofia +43.02583 25.11361 Europe/Sofia +41.56667 23.28333 Europe/Sofia +42.337 23.5528 Europe/Sofia +43.85639 25.97083 Europe/Sofia +43.53333 26.51667 Europe/Sofia +42.3 24.96667 Europe/Sofia +43.35 26.23333 Europe/Sofia +42.15 24.75 Europe/Sofia +43.41667 24.61667 Europe/Sofia +41.4 23.21667 Europe/Sofia +42.03333 24.3 Europe/Sofia +42.6 23.03333 Europe/Sofia +42.2 24.33333 Europe/Sofia +42.5 24.18333 Europe/Sofia +42.48333 26.01667 Europe/Sofia +43.4125 23.225 Europe/Sofia +43.13333 24.71667 Europe/Sofia +43.81389 23.23611 Europe/Sofia +42.28389 22.69111 Europe/Sofia +41.65 25.36667 Europe/Sofia +41.93415 25.55557 Europe/Sofia +41.93333 25.9 Europe/Sofia +42.61667 25.4 Europe/Sofia +42.65 26.98333 Europe/Sofia +42.63333 24.8 Europe/Sofia +41.56667 23.73333 Europe/Sofia +43.12778 25.70167 Europe/Sofia +42.87472 25.33417 Europe/Sofia +42.05 25.6 Europe/Sofia +42.2 25.33333 Europe/Sofia +43.26667 24.1 Europe/Sofia +42.50606 27.46781 Europe/Sofia +42.9 23.78333 Europe/Sofia +42.01667 23.1 Europe/Sofia +43.23611 23.12583 Europe/Sofia +42.7 27.25 Europe/Sofia +42.01667 24.86667 Europe/Sofia +26.15472 50.62056 Asia/Bahrain +26.17361 50.54778 Asia/Bahrain +26.21861 50.54778 Asia/Bahrain +26.11528 50.50694 Asia/Bahrain +26.06861 50.50389 Asia/Bahrain +26.25722 50.61194 Asia/Bahrain +26.21536 50.5832 Asia/Bahrain +26.13 50.555 Asia/Bahrain +-4.1348 29.804 Africa/Bujumbura +-3.94877 29.62438 Africa/Bujumbura +-3.3822 29.3644 Africa/Bujumbura +-3.2682 29.6079 Africa/Bujumbura +-3.4264 29.9308 Africa/Bujumbura +-3.47639 30.24861 Africa/Bujumbura +-2.9075 29.8306 Africa/Bujumbura +-2.9221 29.6293 Africa/Bujumbura +-2.8451 30.3414 Africa/Bujumbura +-3.9279 29.992 Africa/Bujumbura +8.88649 2.59752 Africa/Porto-Novo +10.62118 1.26651 Africa/Porto-Novo +8.03424 2.4866 Africa/Porto-Novo +7.92807 1.97558 Africa/Porto-Novo +6.73618 2.65866 Africa/Porto-Novo +6.49646 2.60359 Africa/Porto-Novo +6.98008 2.6649 Africa/Porto-Novo +9.33716 2.63031 Africa/Porto-Novo +6.36307 2.08506 Africa/Porto-Novo +9.94009 3.21075 Africa/Porto-Novo +10.30416 1.37962 Africa/Porto-Novo +11.86819 3.38327 Africa/Porto-Novo +6.63869 1.71674 Africa/Porto-Novo +7.36332 2.59978 Africa/Porto-Novo +11.13417 2.93861 Africa/Porto-Novo +6.81667 1.78333 Africa/Porto-Novo +9.70853 1.66598 Africa/Porto-Novo +7.75 2.18333 Africa/Porto-Novo +7.22097 2.34017 Africa/Porto-Novo +6.36536 2.41833 Africa/Porto-Novo +6.40764 1.88198 Africa/Porto-Novo +7.17826 2.0667 Africa/Porto-Novo +10.22827 2.66335 Africa/Porto-Novo +9.00814 1.6654 Africa/Porto-Novo +11.29845 2.43856 Africa/Porto-Novo +6.93333 1.68333 Africa/Porto-Novo +6.66547 2.15138 Africa/Porto-Novo +6.44852 2.35566 Africa/Porto-Novo +7.18286 1.99119 Africa/Porto-Novo +17.89618 -62.84978 America/St_Barthelemy +32.29528 -64.78107 Atlantic/Bermuda +4.8 114.65 Asia/Brunei +4.60637 114.32476 Asia/Brunei +4.58361 114.2312 Asia/Brunei +4.94029 114.94806 Asia/Brunei +-22.03799 -63.67968 America/La_Paz +-17.5 -63.16667 America/La_Paz +-22.08659 -65.59422 America/La_Paz +-17.4 -63.83333 America/La_Paz +-21.26236 -63.46903 America/La_Paz +-21.44344 -65.71875 America/La_Paz +-14.83333 -64.9 America/La_Paz +-21.53549 -64.72956 America/La_Paz +-19.03332 -65.26274 America/La_Paz +-17.98674 -63.38118 America/La_Paz +-17.78629 -63.18117 America/La_Paz +-16.36667 -60.95 America/La_Paz +-14.81667 -66.85 America/La_Paz +-11.00654 -66.06312 America/La_Paz +-17.54234 -65.83472 America/La_Paz +-19.58361 -65.75306 America/La_Paz +-17.98333 -67.15 America/La_Paz +-17.33866 -63.2505 America/La_Paz +-17.94101 -65.34016 America/La_Paz +-18.42426 -66.58388 America/La_Paz +-16.5 -68.15 America/La_Paz +-18.289 -66.83583 America/La_Paz +-10.83676 -65.36136 America/La_Paz +-17.81667 -63.05 America/La_Paz +-17.3895 -66.1568 America/La_Paz +-11.02671 -68.76918 America/La_Paz +-20.03849 -63.51833 America/La_Paz +12.15 -68.26667 America/Kralendijk +-3.46222 -44.87056 America/Fortaleza +-8.11806 -35.29139 America/Recife +-1.19667 -46.14 America/Belem +-7.25972 -34.9075 America/Fortaleza +-0.85833 -48.14167 America/Belem +-3.56222 -41.09222 America/Fortaleza +-9.37139 -36.24083 America/Maceio +-3.22028 -45.00361 America/Fortaleza +-5.35 -40.38333 America/Fortaleza +-4.19444 -40.47667 America/Fortaleza +-3.54306 -43.91583 America/Fortaleza +-6.4075 -41.74556 America/Fortaleza +-9.16278 -36.03194 America/Maceio +-4.58583 -42.86417 America/Fortaleza +-5.25806 -44.64889 America/Fortaleza +-3.76611 -49.6725 America/Belem +-0.18333 -50.05 America/Belem +-7.76194 -40.26778 America/Recife +-3.27778 -39.26889 America/Fortaleza +-8.00667 -36.05667 America/Recife +-2.41889 -48.15222 America/Belem +-5.09417 -42.83667 America/Fortaleza +-4.25528 -43.94056 America/Fortaleza +-7.50528 -35.31833 America/Recife +-3.73222 -40.99167 America/Fortaleza +-5.08917 -42.80194 America/Fortaleza +-6 -40.28333 America/Fortaleza +-8.75632 -35.09995 America/Recife +-7.59083 -37.53944 America/Recife +-7.83306 -35.75472 America/Recife +-6.75917 -38.22806 America/Fortaleza +-0.71667 -48.52333 America/Belem +-6.755 -35.54 America/Fortaleza +-3.68611 -40.34972 America/Fortaleza +-8.59083 -35.11611 America/Recife +-8.07361 -37.26444 America/Recife +-7.99194 -38.29833 America/Recife +-5.58806 -39.37167 America/Fortaleza +-9.56333 -35.82444 America/Maceio +-9.01528 -42.69944 America/Fortaleza +-9.78111 -36.09361 America/Maceio +-1.62667 -47.48333 America/Belem +-4.04167 -44.475 America/Fortaleza +-9.31833 -35.56111 America/Maceio +-2.52972 -44.30278 America/Fortaleza +-8.00222 -35.01833 America/Recife +-7.47889 -37.27444 America/Recife +-2.56194 -44.05417 America/Fortaleza +-6.07472 -35.23778 America/Fortaleza +-6.495 -43.70222 America/Fortaleza +-3.60722 -38.96833 America/Fortaleza +-6.64472 -51.995 America/Belem +-5.57583 -44.38528 America/Fortaleza +-6.28333 -37.75 America/Fortaleza +-2.69583 -44.82139 America/Fortaleza +-7.11389 -34.97806 America/Fortaleza +-2.44306 -54.70833 America/Santarem +-3.51556 -42.54667 America/Fortaleza +-4.33194 -40.15667 America/Fortaleza +-9.37833 -37.24528 America/Maceio +-7.64265 -47.21738 America/Fortaleza +-3.66667 -45.38 America/Fortaleza +-2.23111 -45.3 America/Fortaleza +-7.9575 -36.20472 America/Recife +-6.22944 -36.02278 America/Fortaleza +-0.61361 -47.35611 America/Belem +-8.07417 -39.11917 America/Recife +-4.94028 -37.97583 America/Fortaleza +-9.47833 -35.85333 America/Maceio +-8.66877 -35.16277 America/Recife +-8.51444 -35.37778 America/Recife +-8.05389 -34.88111 America/Recife +-5.19917 -39.29278 America/Fortaleza +-4.97139 -39.01528 America/Fortaleza +-5.29 -44.49 America/Fortaleza +-0.05833 -51.18167 America/Belem +-9.045 -35.39833 America/Maceio +-1.93556 -50.82111 America/Belem +-8.14139 -35.39583 America/Recife +-6.77028 -37.80167 America/Fortaleza +-4.27333 -41.77694 America/Fortaleza +-3.92806 -41.70917 America/Fortaleza +-2.52139 -45.0825 America/Fortaleza +-3.60833 -45.34333 America/Fortaleza +-9.59722 -35.95667 America/Maceio +-7.07694 -41.46694 America/Fortaleza +-9.39861 -40.50083 America/Recife +-9.18306 -38.26889 America/Recife +-8.35778 -36.69639 America/Recife +-3.79278 -39.27028 America/Fortaleza +-3.29417 -45.17361 America/Fortaleza +-4.42472 -41.45861 America/Fortaleza +-5.45417 -39.71722 America/Fortaleza +-9.40611 -38.21472 America/Bahia +-7.94083 -34.87306 America/Recife +-7.02444 -37.28 America/Fortaleza +-5.91556 -35.26278 America/Fortaleza +-2.90472 -41.77667 America/Fortaleza +-2.62833 -56.73583 America/Manaus +-6.68778 -36.6575 America/Fortaleza +-3.43944 -39.14833 America/Fortaleza +-2.96667 -47.48333 America/Belem +-3.41 -39.03056 America/Fortaleza +-8.68333 -35.59167 America/Recife +-3.98417 -38.62028 America/Fortaleza +-4.1725 -38.46056 America/Fortaleza +-7.8825 -40.08167 America/Recife +-6.24444 -38.91361 America/Fortaleza +-1.76556 -55.86611 America/Santarem +-8.00889 -34.85528 America/Recife +-7.02528 -42.13111 America/Fortaleza +-1.9175 -55.51806 America/Santarem +-4.70667 -40.56306 America/Fortaleza +-6.47806 -35.43389 America/Fortaleza +-7.74167 -35.22778 America/Recife +-5.795 -35.20944 America/Fortaleza +-9.30667 -35.94333 America/Maceio +-8.11861 -35.09222 America/Recife +-5.10667 -38.3725 America/Fortaleza +-7.88944 -37.12 America/Fortaleza +-2.00082 -54.08102 America/Santarem +-5.74306 -39.6275 America/Fortaleza +-1.88389 -48.76889 America/Belem +-5.1875 -37.34417 America/Fortaleza +-2.58417 -49.50722 America/Belem +-3.38361 -57.71861 America/Manaus +-9.15167 -35.53333 America/Maceio +-7.06 -35.31944 America/Fortaleza +-9.71028 -35.895 America/Maceio +-9.01222 -35.2225 America/Maceio +-3.87667 -38.62556 America/Fortaleza +-5.36861 -49.11778 America/Belem +-6.83861 -35.12611 America/Fortaleza +-9.66583 -35.73528 America/Maceio +-5.115 -36.63444 America/Fortaleza +0.03889 -51.06639 America/Belem +-5.85833 -35.35389 America/Fortaleza +-5.14556 -38.09806 America/Fortaleza +-7.87472 -35.45028 America/Recife +-6.75333 -38.96444 America/Fortaleza +-8.66361 -36.32 America/Recife +-4.28674 -45.23824 America/Fortaleza +-7.93611 -35.29028 America/Recife +-7.21306 -39.31528 America/Fortaleza +-4.75639 -42.57556 America/Fortaleza +-7.115 -34.86306 America/Fortaleza +-5.5375 -35.81972 America/Fortaleza +-4.83389 -37.78111 America/Fortaleza +-5.89056 -38.62194 America/Fortaleza +-8.18028 -35.00139 America/Recife +-5.13472 -49.32667 America/Belem +-3.14306 -58.44417 America/Manaus +-7.30444 -38.15028 America/Fortaleza +-7.77639 -34.89222 America/Recife +-3.49444 -39.57861 America/Fortaleza +-3.3925 -44.35861 America/Fortaleza +-3.68667 -39.58611 America/Fortaleza +-4.27611 -55.98361 America/Santarem +-3.96944 -38.52806 America/Fortaleza +-7.32861 -35.3325 America/Fortaleza +-7.03333 -40.45 America/Fortaleza +-7.65194 -40.14889 America/Recife +-4.32222 -40.71083 America/Fortaleza +-8.39889 -35.06389 America/Recife +-5.52639 -47.49167 America/Fortaleza +-6.35944 -39.29861 America/Fortaleza +-1.975 -48.95972 America/Belem +-1.12889 -47.62 America/Belem +-7.83417 -34.90639 America/Recife +-6.40111 -38.86222 America/Fortaleza +-4.1 -38.48333 America/Fortaleza +-4.16694 -40.7475 America/Fortaleza +-6.85472 -35.49 America/Fortaleza +-4.03972 -38.63722 America/Fortaleza +-8.20111 -35.56472 America/Recife +-3.12028 -40.82611 America/Fortaleza +-5.81944 -46.13861 America/Fortaleza +-7.56056 -35.0025 America/Recife +-8.00167 -35.29278 America/Recife +-8.89028 -36.49278 America/Recife +-8.58444 -35.38667 America/Recife +-3.71722 -38.54306 America/Fortaleza +-6.76694 -43.0225 America/Fortaleza +-8.60111 -38.56861 America/Recife +-3.89 -38.45056 America/Fortaleza +-5.70556 -35.30722 America/Fortaleza +-5.78333 -43.25 America/Fortaleza +-3.90167 -42.23361 America/Fortaleza +-7.03306 -35.85722 America/Fortaleza +-8.35917 -35.22361 America/Recife +-5.0375 -44.43857 America/Fortaleza +-5.35833 -42.67639 America/Fortaleza +-9.38861 -37.99917 America/Maceio +-8.0875 -37.64306 America/Recife +-1.82833 -44.86833 America/Fortaleza +-6.26083 -36.51778 America/Fortaleza +-8.61667 -35.95 America/Recife +-7.23417 -39.40944 America/Fortaleza +-5.17833 -40.6775 America/Fortaleza +-4.13 -44.12417 America/Fortaleza +-7.58583 -35.10583 America/Recife +-8.25778 -49.26472 America/Araguaina +-6.02583 -44.24917 America/Fortaleza +-4.25667 -43.01278 America/Fortaleza +-4.45528 -43.88556 America/Fortaleza +-3.74167 -43.36028 America/Fortaleza +-8.23833 -35.46167 America/Recife +-5.63444 -35.42556 America/Fortaleza +-4.85889 -43.35611 America/Fortaleza +-3.73611 -38.65306 America/Fortaleza +-6.34389 -37.74667 America/Fortaleza +-8.66667 -35.71667 America/Recife +-1.29389 -47.92639 America/Belem +-4.13306 -38.24194 America/Fortaleza +-8.28333 -35.97611 America/Recife +-7.85083 -35.25472 America/Recife +-7.33561 -47.46218 America/Fortaleza +-1.74639 -47.05944 America/Belem +-1.19583 -47.18083 America/Belem +-4.35889 -39.31167 America/Fortaleza +-6.38 -35.12889 America/Fortaleza +-7.07444 -40.37611 America/Fortaleza +-4.82778 -42.16861 America/Fortaleza +-9.78194 -36.35083 America/Maceio +-7.23056 -35.88111 America/Fortaleza +-2.90222 -40.84111 America/Fortaleza +-2.24444 -49.49583 America/Belem +-9.71667 -36.45 America/Maceio +-6.89028 -38.55528 America/Fortaleza +-6.45833 -37.09778 America/Fortaleza +-8.51417 -39.31 America/Recife +-8.28333 -35.03333 America/Recife +-6.98111 -34.83389 America/Fortaleza +-5.83722 -43.83361 America/Fortaleza +-8.62306 -37.15583 America/Recife +-1.68222 -50.48028 America/Belem +-7.49333 -38.98722 America/Fortaleza +-8.14583 -36.37111 America/Recife +-1.05361 -46.76556 America/Belem +-9.16972 -36.67972 America/Recife +-5.1275 -39.73222 America/Fortaleza +-8.23333 -35.79694 America/Recife +-1.36139 -48.24472 America/Belem +-8.33556 -36.42417 America/Recife +-6.69167 -35.53333 America/Fortaleza +-1.45583 -48.50444 America/Belem +-4.17972 -38.13056 America/Fortaleza +-7.125 -34.93222 America/Fortaleza +-4.32861 -38.88472 America/Fortaleza +-8.81833 -35.18639 America/Recife +-2.75556 -42.82591 America/Fortaleza +-4.24444 -42.29444 America/Fortaleza +-5.50308 -45.23693 America/Fortaleza +-1.50583 -48.62583 America/Belem +-7.31111 -39.30417 America/Fortaleza +-7.5325 -46.03556 America/Fortaleza +-4.29167 -44.79167 America/Fortaleza +-1.02167 -46.635 America/Belem +-9.50194 -36.02278 America/Maceio +-4.95611 -37.13694 America/Fortaleza +-8.41889 -37.05389 America/Recife +-7.57611 -40.49833 America/Recife +-3.45361 -44.78 America/Fortaleza +-9.7525 -36.66111 America/Maceio +-7.19111 -48.20722 America/Araguaina +-4.56167 -37.76972 America/Fortaleza +-3.90139 -38.39111 America/Fortaleza +-5.66417 -37.79889 America/Fortaleza +-1.36556 -48.37222 America/Belem +-8.38306 -35.4525 America/Recife +-5.03806 -42.46 America/Fortaleza +-3.20333 -52.20639 America/Santarem +-1.52333 -52.58167 America/Santarem +-1.94167 -54.73833 America/Santarem +-7.15833 -35.63 America/Fortaleza +-9.11139 -37.12306 America/Recife +-8.7075 -35.53056 America/Recife +-7.75083 -37.63917 America/Recife +-5.57667 -36.90861 America/Fortaleza +-6.09528 -39.4525 America/Fortaleza +-2.88556 -40.12 America/Fortaleza +-7.91167 -34.90278 America/Recife +-1.71806 -48.8825 America/Belem +-10.82167 -42.73111 America/Bahia +-26.87694 -52.40417 America/Sao_Paulo +-20.42278 -49.97278 America/Sao_Paulo +-23.54667 -47.43778 America/Sao_Paulo +-22.52306 -44.10417 America/Sao_Paulo +-14.86611 -40.83944 America/Bahia +-20.31944 -40.33778 America/Sao_Paulo +-21.01028 -42.84056 America/Sao_Paulo +-20.87306 -48.29694 America/Sao_Paulo +-23.02972 -46.97528 America/Sao_Paulo +-20.32972 -40.2925 America/Sao_Paulo +-27.00833 -51.15167 America/Sao_Paulo +-20.75389 -42.88194 America/Sao_Paulo +-20.39028 -40.49611 America/Sao_Paulo +-30.08111 -51.02333 America/Sao_Paulo +-19.69194 -43.92333 America/Sao_Paulo +-28.93611 -51.54944 America/Sao_Paulo +-12.63333 -41.03333 America/Bahia +-23.87389 -49.80278 America/Sao_Paulo +-29.60639 -52.19194 America/Sao_Paulo +-17.98694 -46.90778 America/Sao_Paulo +-22.40389 -43.6625 America/Sao_Paulo +-23.21139 -46.82833 America/Sao_Paulo +-15.64667 -56.1325 America/Cuiaba +-17.59806 -44.73083 America/Sao_Paulo +-21.55139 -45.43028 America/Sao_Paulo +-21.83222 -46.89361 America/Sao_Paulo +-21.22778 -50.86833 America/Sao_Paulo +-22.97056 -46.99583 America/Sao_Paulo +-22.24556 -43.70028 America/Sao_Paulo +-13.37028 -39.07306 America/Bahia +-28.51222 -50.93389 America/Sao_Paulo +-29.75472 -57.08833 America/Sao_Paulo +-14.59306 -39.28444 America/Bahia +-14.52472 -49.14083 America/Sao_Paulo +-26.23 -51.08639 America/Sao_Paulo +-16.3575 -46.90611 America/Sao_Paulo +-15.29333 -39.07528 America/Bahia +-23.76639 -53.325 America/Sao_Paulo +-18.91861 -48.27722 America/Sao_Paulo +-19.74833 -47.93194 America/Sao_Paulo +-23.43389 -45.07111 America/Sao_Paulo +-14.21389 -39.52278 America/Bahia +-14.3125 -39.32333 America/Bahia +-21.12 -42.94278 America/Sao_Paulo +-29.08056 -53.83583 America/Sao_Paulo +-18.59222 -48.705 America/Sao_Paulo +-21.93472 -50.51361 America/Sao_Paulo +-10.96306 -38.78667 America/Bahia +-28.46667 -49.00694 America/Sao_Paulo +-16.64944 -49.48889 America/Sao_Paulo +-22.11667 -43.20917 America/Sao_Paulo +-21.36667 -45.5125 America/Sao_Paulo +-27.45556 -53.93194 America/Sao_Paulo +-20.78741 -51.70406 America/Campo_Grande +-27.77333 -54.24 America/Sao_Paulo +-29.51694 -50.77778 America/Sao_Paulo +-21.69694 -45.25333 America/Sao_Paulo +-22.95833 -45.54944 America/Sao_Paulo +-29.98472 -50.13361 America/Sao_Paulo +-29.33528 -49.72694 America/Sao_Paulo +-24.71361 -53.74306 America/Sao_Paulo +-11.18389 -37.99833 America/Maceio +-19.5825 -42.64444 America/Sao_Paulo +-26.82333 -49.27167 America/Sao_Paulo +-27.24139 -48.63361 America/Sao_Paulo +-23.10194 -47.71472 America/Sao_Paulo +-29.44806 -51.80639 America/Sao_Paulo +-22.41222 -42.96556 America/Sao_Paulo +-17.8575 -41.50528 America/Sao_Paulo +-22.5325 -52.1675 America/Sao_Paulo +-24.32389 -50.61556 America/Sao_Paulo +-23.02639 -45.55528 America/Sao_Paulo +-23.35556 -47.85694 America/Sao_Paulo +-23.53306 -49.24444 America/Sao_Paulo +-21.40611 -48.50472 America/Sao_Paulo +-29.79972 -51.86444 America/Sao_Paulo +-29.65056 -50.78056 America/Sao_Paulo +-11.84722 -40.79139 America/Bahia +-30.67333 -51.39583 America/Sao_Paulo +-22.73028 -42.71417 America/Sao_Paulo +-20.62639 -49.64917 America/Sao_Paulo +-21.705 -47.27444 America/Sao_Paulo +-15.80778 -42.23306 America/Sao_Paulo +-23.62611 -46.79167 America/Sao_Paulo +-23.5425 -46.31083 America/Sao_Paulo +-22.82194 -47.26694 America/Sao_Paulo +-23.50167 -47.45806 America/Sao_Paulo +-28.81833 -52.51028 America/Sao_Paulo +-22.59139 -46.52889 America/Sao_Paulo +-12.83333 -39.1 America/Bahia +-10.73833 -37.81111 America/Maceio +-22.65083 -42.39167 America/Sao_Paulo +-20.93194 -54.96139 America/Campo_Grande +-19.46583 -44.24667 America/Sao_Paulo +-21.13778 -47.99028 America/Sao_Paulo +-11.66417 -39.0075 America/Bahia +-22.61222 -46.70056 America/Sao_Paulo +-21.21139 -47.59556 America/Sao_Paulo +-20.12861 -40.30778 America/Sao_Paulo +-22.74389 -43.7075 America/Sao_Paulo +-10.46139 -40.18944 America/Bahia +-16.70806 -49.09306 America/Sao_Paulo +-12.41861 -41.77028 America/Bahia +-26.4125 -49.07306 America/Sao_Paulo +-12.7375 -38.76861 America/Bahia +-20.03528 -44.14472 America/Sao_Paulo +-27.94389 -52.92306 America/Sao_Paulo +-23.44361 -51.87389 America/Sao_Paulo +-22.92 -42.51028 America/Sao_Paulo +-29.83333 -51.15 America/Sao_Paulo +-29.63806 -51.00694 America/Sao_Paulo +-23.96306 -46.39194 America/Sao_Paulo +-30.16056 -53.56528 America/Sao_Paulo +-12.5125 -38.49528 America/Bahia +-20.91694 -46.99139 America/Sao_Paulo +-29.58667 -51.37556 America/Sao_Paulo +-23.76 -45.40972 America/Sao_Paulo +-23.52917 -47.13528 America/Sao_Paulo +-22.83917 -42.10278 America/Sao_Paulo +-22.54861 -47.91389 America/Sao_Paulo +-23.5475 -46.63611 America/Sao_Paulo +-25.34806 -54.23778 America/Sao_Paulo +-13.275 -50.16278 America/Sao_Paulo +-25.87417 -50.38278 America/Sao_Paulo +-18.72011 -39.85891 America/Sao_Paulo +-28.97111 -51.06806 America/Sao_Paulo +-22.73111 -48.57056 America/Sao_Paulo +-28.40833 -54.96083 America/Sao_Paulo +-16.525 -50.37222 America/Sao_Paulo +-31.36528 -51.97833 America/Sao_Paulo +-22.11639 -45.05444 America/Sao_Paulo +-29.76028 -51.14722 America/Sao_Paulo +-25.53472 -49.20639 America/Sao_Paulo +-23.17944 -45.88694 America/Sao_Paulo +-20.81972 -49.37944 America/Sao_Paulo +-21.59556 -46.88861 America/Sao_Paulo +-28.21171 -49.1632 America/Sao_Paulo +-20.58139 -47.85472 America/Sao_Paulo +-28.29389 -49.93167 America/Sao_Paulo +-21.54 -43.01056 America/Sao_Paulo +-22.80389 -43.37222 America/Sao_Paulo +-21.13556 -44.26167 America/Sao_Paulo +-21.96917 -46.79806 America/Sao_Paulo +-21.64028 -41.05111 America/Sao_Paulo +-29.95917 -51.72222 America/Sao_Paulo +-19.31111 -46.04889 America/Sao_Paulo +-21.89222 -45.59528 America/Sao_Paulo +-30.33639 -54.32 America/Sao_Paulo +-26.24333 -48.63806 America/Sao_Paulo +-12.6275 -38.68 America/Bahia +-15.94861 -44.86444 America/Sao_Paulo +-21.64611 -41.74694 America/Sao_Paulo +-11.01472 -37.20639 America/Maceio +-22.0175 -47.89083 America/Sao_Paulo +-23.62306 -46.55111 America/Sao_Paulo +-28.66056 -56.00444 America/Sao_Paulo +-23.69389 -46.565 America/Sao_Paulo +-26.25028 -49.37861 America/Sao_Paulo +-21.45667 -43.5525 America/Sao_Paulo +-23.96083 -46.33361 America/Sao_Paulo +-12.43028 -39.25139 America/Bahia +-20.08722 -45.29361 America/Sao_Paulo +-20.94639 -44.91889 America/Sao_Paulo +-22.60611 -46.91944 America/Sao_Paulo +-21.53944 -42.18028 America/Sao_Paulo +-12.96889 -39.26139 America/Bahia +-23.295 -50.07722 America/Sao_Paulo +-28.29917 -54.26306 America/Sao_Paulo +-23.66389 -46.53833 America/Sao_Paulo +-21.83833 -51.61028 America/Sao_Paulo +-27.68806 -48.77861 America/Sao_Paulo +-12.54667 -38.71194 America/Bahia +-29.19167 -54.86722 America/Sao_Paulo +-33.51889 -53.36806 America/Sao_Paulo +-21.47278 -47.36306 America/Sao_Paulo +-27.87083 -54.48139 America/Sao_Paulo +-22.25222 -45.70333 America/Sao_Paulo +-21.71028 -47.47806 America/Sao_Paulo +-19.36361 -42.56861 America/Sao_Paulo +-30.89083 -55.53278 America/Sao_Paulo +-23.44417 -46.91778 America/Sao_Paulo +-13.39472 -44.18861 America/Bahia +-29.68417 -53.80694 America/Sao_Paulo +-19.76972 -43.85139 America/Sao_Paulo +-11.25583 -39.37472 America/Bahia +-23.31556 -46.22139 America/Sao_Paulo +-17.81361 -50.59694 America/Sao_Paulo +-22.45667 -47.53028 America/Sao_Paulo +-20.21111 -50.92583 America/Sao_Paulo +-29.7175 -52.42583 America/Sao_Paulo +-22.89889 -49.6325 America/Sao_Paulo +-21.82694 -47.24861 America/Sao_Paulo +-16.27806 -39.02472 America/Bahia +-26.96083 -50.42694 America/Sao_Paulo +-22.75361 -47.41361 America/Sao_Paulo +-12.97111 -38.51083 America/Bahia +-23.64889 -47.57333 America/Sao_Paulo +-23.20083 -47.28694 America/Sao_Paulo +-16.17028 -42.29028 America/Sao_Paulo +-19.86528 -47.44 America/Sao_Paulo +-12.28389 -40.49389 America/Bahia +-15.16444 -49.80333 America/Sao_Paulo +-30.25833 -54.91417 America/Sao_Paulo +-16.47083 -54.63556 America/Cuiaba +-29.65056 -50.57583 America/Sao_Paulo +-23.30972 -51.36917 America/Sao_Paulo +-18.91806 -54.84417 America/Campo_Grande +-11.48472 -37.93278 America/Bahia +-29.98972 -52.37806 America/Sao_Paulo +-26.10583 -49.7975 America/Sao_Paulo +-26.25444 -49.51833 America/Sao_Paulo +-23.74417 -46.39833 America/Sao_Paulo +-32.035 -52.09861 America/Sao_Paulo +-27.21417 -49.64306 America/Sao_Paulo +-22.90278 -43.2075 America/Sao_Paulo +-22.84333 -47.60611 America/Sao_Paulo +-22.52694 -41.945 America/Sao_Paulo +-22.41139 -47.56139 America/Sao_Paulo +-21.80194 -54.54639 America/Campo_Grande +-25.19 -49.31417 America/Sao_Paulo +-22.70861 -42.60972 America/Sao_Paulo +-21.1775 -47.81028 America/Sao_Paulo +-23.71056 -46.41333 America/Sao_Paulo +-19.76694 -44.08667 America/Sao_Paulo +-27.69934 -48.53219 America/Sao_Paulo +-10.83444 -38.53583 America/Bahia +-11.80694 -39.38556 America/Bahia +-19.32556 -41.25528 America/Sao_Paulo +-22.46889 -44.44667 America/Sao_Paulo +-24.4875 -47.84361 America/Sao_Paulo +-22.22139 -51.30278 America/Sao_Paulo +-22.22917 -50.89306 America/Sao_Paulo +-18.44833 -50.45167 America/Sao_Paulo +-22.71611 -43.55528 America/Sao_Paulo +-25.36556 -49.07694 America/Sao_Paulo +-30.3875 -56.45139 America/Sao_Paulo +-25.21306 -50.97778 America/Sao_Paulo +-10.21111 -36.84028 America/Maceio +-21.53667 -49.85806 America/Sao_Paulo +-21.87611 -51.84389 America/Sao_Paulo +-22.12556 -51.38889 America/Sao_Paulo +-21.76333 -52.11556 America/Sao_Paulo +-19.30722 -48.92417 America/Sao_Paulo +-24.00583 -46.40278 America/Sao_Paulo +-17.34111 -39.22083 America/Bahia +-22.23 -45.93639 America/Sao_Paulo +-14.09306 -46.36944 America/Sao_Paulo +-26.23806 -51.07833 America/Sao_Paulo +-16.44972 -39.06472 America/Bahia +-21.85389 -47.47917 America/Sao_Paulo +-23.21472 -47.52389 America/Sao_Paulo +-30.03306 -51.23 America/Sao_Paulo +-29.70167 -51.24194 America/Sao_Paulo +-13.44083 -49.14861 America/Sao_Paulo +-15.22611 -59.33528 America/Cuiaba +-20.41639 -42.90861 America/Sao_Paulo +-22.53611 -55.72556 America/Campo_Grande +-21.0225 -48.03722 America/Sao_Paulo +-25.095 -50.16194 America/Sao_Paulo +-19.22444 -44.93528 America/Sao_Paulo +-22.10861 -50.17167 America/Sao_Paulo +-26.74056 -49.17694 America/Sao_Paulo +-21.78778 -46.56139 America/Sao_Paulo +-16.25667 -56.62278 America/Cuiaba +-14.52972 -40.36528 America/Bahia +-23.52806 -46.34472 America/Sao_Paulo +-15.45278 -47.61417 America/Sao_Paulo +-20.83778 -40.72194 America/Sao_Paulo +-20.46528 -45.95806 America/Sao_Paulo +-19.68278 -44.89028 America/Sao_Paulo +-21.00944 -48.22167 America/Sao_Paulo +-24.75722 -51.76139 America/Sao_Paulo +-11.73028 -40.55528 America/Bahia +-17.29972 -48.27944 America/Sao_Paulo +-25.44167 -49.06333 America/Sao_Paulo +-22.27528 -51.5 America/Sao_Paulo +-17.345 -44.94194 America/Sao_Paulo +-21.99861 -49.45722 America/Sao_Paulo +-23.19361 -49.38389 America/Sao_Paulo +-24.52611 -49.94861 America/Sao_Paulo +-22.62917 -43.89806 America/Sao_Paulo +-21.99611 -47.42583 America/Sao_Paulo +-22.72528 -47.64917 America/Sao_Paulo +-17.30278 -49.01667 America/Sao_Paulo +-23.05389 -46.35806 America/Sao_Paulo +-22.51278 -44.00056 America/Sao_Paulo +-25.69556 -51.65972 America/Sao_Paulo +-22.11583 -46.68278 America/Sao_Paulo +-10.74167 -40.36083 America/Bahia +-22.92389 -45.46167 America/Sao_Paulo +-23.81306 -47.71639 America/Sao_Paulo +-23.71194 -47.42778 America/Sao_Paulo +-22.505 -43.17861 America/Sao_Paulo +-24.32 -46.99833 America/Sao_Paulo +-20.63833 -51.10917 America/Sao_Paulo +-21.09083 -45.09139 America/Sao_Paulo +-26.76944 -48.64583 America/Sao_Paulo +-10.29028 -36.58639 America/Maceio +-21.41972 -50.0775 America/Sao_Paulo +-31.77194 -52.3425 America/Sao_Paulo +-19.61806 -44.04306 America/Sao_Paulo +-22.74194 -46.90139 America/Sao_Paulo +-16.00528 -41.29722 America/Sao_Paulo +-22.35167 -48.775 America/Sao_Paulo +-22.76111 -47.15417 America/Sao_Paulo +-18.94389 -46.9925 America/Sao_Paulo +-18.57889 -46.51806 America/Sao_Paulo +-26.22861 -52.67056 America/Sao_Paulo +-22.42861 -43.41861 America/Sao_Paulo +-20.71889 -46.60972 America/Sao_Paulo +-28.26278 -52.40667 America/Sao_Paulo +-29.62861 -50.83472 America/Sao_Paulo +-23.21778 -44.71306 America/Sao_Paulo +-23.07306 -52.46528 America/Sao_Paulo +-23.38861 -48.72278 America/Sao_Paulo +-19.67722 -51.19083 America/Campo_Grande +-25.51944 -48.51992 America/Sao_Paulo +-22.16194 -43.29278 America/Sao_Paulo +-22.41278 -50.57583 America/Sao_Paulo +-21.54722 -45.7375 America/Sao_Paulo +-19.86028 -44.60833 America/Sao_Paulo +-17.22222 -46.87472 America/Sao_Paulo +-22.60829 -43.7084 America/Sao_Paulo +-28.2925 -53.50167 America/Sao_Paulo +-24.28389 -53.84 America/Sao_Paulo +-22.78889 -50.2175 America/Sao_Paulo +-27.89944 -53.31361 America/Sao_Paulo +-25.42944 -50.00639 America/Sao_Paulo +-26.48417 -51.99056 America/Sao_Paulo +-27.64528 -48.66778 America/Sao_Paulo +-23.4575 -52.04861 America/Sao_Paulo +-15.16595 -48.28281 America/Sao_Paulo +-20.39484 -43.50517 America/Sao_Paulo +-20.52083 -43.69194 America/Sao_Paulo +-22.97889 -49.87056 America/Sao_Paulo +-21.79667 -50.87861 America/Sao_Paulo +-29.88667 -50.26972 America/Sao_Paulo +-23.5325 -46.79167 America/Sao_Paulo +-28.35889 -49.29139 America/Sao_Paulo +-20.72028 -47.88667 America/Sao_Paulo +-20.69639 -44.82722 America/Sao_Paulo +-20.73722 -48.91472 America/Sao_Paulo +-21.46806 -49.22083 America/Sao_Paulo +-29.67833 -51.13056 America/Sao_Paulo +-17.89194 -39.37194 America/Bahia +-18.71056 -40.40056 America/Sao_Paulo +-28.78389 -51.61 America/Sao_Paulo +-29.37639 -51.11444 America/Sao_Paulo +-14.79722 -57.28806 America/Cuiaba +-22.7775 -47.29583 America/Sao_Paulo +-19.98556 -43.84667 America/Sao_Paulo +-22.75917 -43.45111 America/Sao_Paulo +-20.53389 -49.31417 America/Sao_Paulo +-22.28194 -42.53111 America/Sao_Paulo +-19.75 -43.0375 America/Sao_Paulo +-10.855 -37.12611 America/Maceio +-10.21833 -37.42028 America/Maceio +-22.88333 -43.10361 America/Sao_Paulo +-14.47389 -48.45972 America/Sao_Paulo +-22.8075 -43.41389 America/Sao_Paulo +-16.40639 -49.21861 America/Sao_Paulo +-21.23583 -45.23583 America/Sao_Paulo +-13.035 -39.01444 America/Bahia +-23.065 -54.19056 America/Campo_Grande +-26.89889 -48.65417 America/Sao_Paulo +-17.83917 -40.35389 America/Sao_Paulo +-21.37583 -46.52556 America/Sao_Paulo +-12.91667 -39.25 America/Bahia +-21.13056 -42.36639 America/Sao_Paulo +-18.08639 -39.55083 America/Bahia +-11.55 -41.15611 America/Bahia +-20.73139 -48.05778 America/Sao_Paulo +-17.73111 -49.09944 America/Sao_Paulo +-16.735 -43.86167 America/Sao_Paulo +-21.18972 -46.98028 America/Sao_Paulo +-29.68861 -51.46111 America/Sao_Paulo +-22.94667 -47.31583 America/Sao_Paulo +-18.72472 -47.49861 America/Sao_Paulo +-20.90722 -48.64139 America/Sao_Paulo +-20.7725 -49.71417 America/Sao_Paulo +-21.26111 -48.49639 America/Sao_Paulo +-24.09306 -46.62083 America/Sao_Paulo +-22.43194 -46.95778 America/Sao_Paulo +-22.37222 -46.94222 America/Sao_Paulo +-23.52278 -46.18833 America/Sao_Paulo +-21.46778 -47.00472 America/Sao_Paulo +-21.13361 -51.10167 America/Sao_Paulo +-21.41222 -42.19667 America/Sao_Paulo +-17.56944 -52.55111 America/Sao_Paulo +-22.45389 -43.46889 America/Sao_Paulo +-20.17944 -48.03194 America/Sao_Paulo +-22.52667 -43.73278 America/Sao_Paulo +-25.29528 -54.09389 America/Sao_Paulo +-17.37389 -40.22056 America/Bahia +-23.66778 -46.46139 America/Sao_Paulo +-19.55778 -44.08139 America/Sao_Paulo +-19.98639 -44.42778 America/Sao_Paulo +-21.60333 -48.36583 America/Sao_Paulo +-12.53028 -38.29917 America/Bahia +-15.56306 -39.3025 America/Bahia +-22.14583 -51.17083 America/Sao_Paulo +-23.42528 -51.93861 America/Sao_Paulo +-22.21389 -49.94583 America/Sao_Paulo +-22.91944 -42.81861 America/Sao_Paulo +-20.37778 -43.41611 America/Sao_Paulo +-23.485 -51.79167 America/Sao_Paulo +-24.55611 -54.05667 America/Sao_Paulo +-28.44917 -52.2 America/Sao_Paulo +-21.04333 -40.82444 America/Sao_Paulo +-12.77778 -38.91944 America/Bahia +-13.44111 -40.43083 America/Bahia +-21.61444 -55.16833 America/Campo_Grande +-20.35778 -41.95806 America/Sao_Paulo +-20.25806 -42.03361 America/Sao_Paulo +-22.95972 -44.04056 America/Sao_Paulo +-23.5475 -51.67083 America/Sao_Paulo +-23.31861 -46.58667 America/Sao_Paulo +-23.54583 -47.18333 America/Sao_Paulo +-26.11139 -49.80528 America/Sao_Paulo +-21.67472 -45.91972 America/Sao_Paulo +-22.50222 -48.71139 America/Sao_Paulo +-22.37083 -41.78694 America/Sao_Paulo +-16.2525 -47.95028 America/Sao_Paulo +-16.33333 -55.93333 America/Cuiaba +-23.08639 -46.95056 America/Sao_Paulo +-22.73083 -45.12472 America/Sao_Paulo +-23.31028 -51.16278 America/Sao_Paulo +-22.92306 -53.13722 America/Sao_Paulo +-13.64306 -41.84056 America/Bahia +-21.67861 -49.7425 America/Sao_Paulo +-19.39111 -40.07222 America/Sao_Paulo +-22.56472 -47.40167 America/Sao_Paulo +-21.53194 -42.64306 America/Sao_Paulo +-22.59861 -48.80028 America/Sao_Paulo +-22.18556 -47.39028 America/Sao_Paulo +-21.24528 -44.99972 America/Sao_Paulo +-25.40778 -52.41611 America/Sao_Paulo +-10.80639 -37.17 America/Maceio +-23.04972 -47.83667 America/Sao_Paulo +-25.76972 -49.71583 America/Sao_Paulo +-20.15139 -41.62278 America/Sao_Paulo +-27.81611 -50.32611 America/Sao_Paulo +-29.46694 -51.96139 America/Sao_Paulo +-28.4825 -48.78083 America/Sao_Paulo +-28.20861 -51.52583 America/Sao_Paulo +-19.62722 -43.88972 America/Sao_Paulo +-20.0225 -45.54361 America/Sao_Paulo +-10.91722 -37.65 America/Maceio +-19.00472 -57.60167 America/Campo_Grande +-23.18639 -46.88417 America/Sao_Paulo +-29.22694 -53.68167 America/Sao_Paulo +-21.76417 -43.35028 America/Sao_Paulo +-19.95194 -44.34278 America/Sao_Paulo +-21.05278 -49.68833 America/Sao_Paulo +-26.30444 -48.84556 America/Sao_Paulo +-17.7425 -46.1725 America/Sao_Paulo +-19.81 -43.17361 America/Sao_Paulo +-27.17806 -51.50472 America/Sao_Paulo +-10.075 -38.48083 America/Bahia +-16.43389 -41.00333 America/Sao_Paulo +-13.8575 -40.08361 America/Bahia +-22.29639 -48.55778 America/Sao_Paulo +-17.88139 -51.71444 America/Sao_Paulo +-23.10139 -46.72833 America/Sao_Paulo +-21.01778 -47.76389 America/Sao_Paulo +-21.48028 -56.13806 America/Campo_Grande +-26.48611 -49.06667 America/Sao_Paulo +-15.75694 -49.33444 America/Sao_Paulo +-22.64306 -43.65333 America/Sao_Paulo +-15.48866 -44.35988 America/Sao_Paulo +-23.5275 -46.9025 America/Sao_Paulo +-23.60306 -51.64333 America/Sao_Paulo +-15.8025 -43.30889 America/Sao_Paulo +-20.26889 -50.54583 America/Sao_Paulo +-22.70556 -46.98583 America/Sao_Paulo +-24.25111 -49.70583 America/Sao_Paulo +-10.26389 -40.19583 America/Bahia +-32.56611 -53.37583 America/Sao_Paulo +-13.53056 -39.97083 America/Bahia +-22.28556 -46.61222 America/Sao_Paulo +-11.18056 -40.51833 America/Bahia +-15.96528 -54.96833 America/Cuiaba +-23.16056 -49.96944 America/Sao_Paulo +-23.30528 -45.96583 America/Sao_Paulo +-21.25472 -48.32222 America/Sao_Paulo +-29.59111 -51.16056 America/Sao_Paulo +-20.33944 -47.78056 America/Sao_Paulo +-19.72806 -50.19556 America/Sao_Paulo +-23.15306 -47.05778 America/Sao_Paulo +-18.41917 -49.21528 America/Sao_Paulo +-18.96889 -49.465 America/Sao_Paulo +-13.73222 -39.14917 America/Bahia +-23.26417 -47.29917 America/Sao_Paulo +-15.11694 -40.07028 America/Bahia +-20.07528 -44.57639 America/Sao_Paulo +-23.10167 -48.61583 America/Sao_Paulo +-23.00583 -46.83889 America/Sao_Paulo +-24.1125 -49.33167 America/Sao_Paulo +-29.12528 -56.55306 America/Sao_Paulo +-23.48611 -46.34833 America/Sao_Paulo +-15.56222 -49.94861 America/Sao_Paulo +-21.59556 -48.81278 America/Sao_Paulo +-22.43611 -46.82167 America/Sao_Paulo +-23.54889 -46.93417 America/Sao_Paulo +-23.98222 -48.87556 America/Sao_Paulo +-23.59167 -48.05306 America/Sao_Paulo +-15.24889 -40.24778 America/Bahia +-21.205 -41.88778 America/Sao_Paulo +-25.22 -49.34778 America/Sao_Paulo +-21.01111 -40.83389 America/Sao_Paulo +-27.09028 -48.61139 America/Sao_Paulo +-23.71694 -46.84917 America/Sao_Paulo +-20.4725 -45.12556 America/Sao_Paulo +-12.88833 -38.67861 America/Bahia +-14.95083 -49.54944 America/Sao_Paulo +-21.66917 -42.07611 America/Sao_Paulo +-24.18306 -46.78889 America/Sao_Paulo +-15.245 -40.62444 America/Bahia +-17.85722 -42.85889 America/Sao_Paulo +-17.03917 -39.53111 America/Bahia +-14.67806 -39.375 America/Bahia +-22.42556 -45.45278 America/Sao_Paulo +-26.90778 -48.66194 America/Sao_Paulo +-23.41778 -49.09056 America/Sao_Paulo +-22.85222 -43.77528 America/Sao_Paulo +-14.78556 -39.28028 America/Bahia +-22.74444 -42.85944 America/Sao_Paulo +-20.25333 -43.80139 America/Sao_Paulo +-19.61917 -43.22694 America/Sao_Paulo +-16.02028 -49.81028 America/Sao_Paulo +-12.5275 -40.30694 America/Bahia +-11.27389 -37.79 America/Maceio +-10.685 -37.42528 America/Maceio +-11.30417 -41.85583 America/Bahia +-25.46722 -50.65111 America/Sao_Paulo +-22.58056 -47.51861 America/Sao_Paulo +-16.44194 -51.11778 America/Sao_Paulo +-12.15833 -39.73722 America/Bahia +-14.13722 -39.73389 America/Bahia +-23.35028 -47.68861 America/Sao_Paulo +-19.46833 -42.53667 America/Sao_Paulo +-17.72194 -48.15972 America/Sao_Paulo +-19.41361 -42.41944 America/Sao_Paulo +-16.35778 -49.49611 America/Sao_Paulo +-23.09028 -47.21806 America/Sao_Paulo +-26.89778 -49.23167 America/Sao_Paulo +-25.23 -50.60444 America/Sao_Paulo +-28.24 -48.67028 America/Sao_Paulo +-14.79364 -39.03949 America/Bahia +-20.43278 -51.3425 America/Sao_Paulo +-23.77806 -45.35806 America/Sao_Paulo +-28.38778 -53.91472 America/Sao_Paulo +-24.70806 -47.55528 America/Sao_Paulo +-29.57444 -50.79028 America/Sao_Paulo +-20.07028 -44.30167 America/Sao_Paulo +-20.03833 -47.74694 America/Sao_Paulo +-22.50917 -48.55778 America/Sao_Paulo +-28.71333 -49.3 America/Sao_Paulo +-12.18528 -43.22056 America/Bahia +-23.65639 -47.2225 America/Sao_Paulo +-21.75778 -48.82889 America/Sao_Paulo +-20.02194 -44.05889 America/Sao_Paulo +-14.06694 -39.64056 America/Bahia +-27.05694 -49.51778 America/Sao_Paulo +-23.26917 -51.04806 America/Sao_Paulo +-14.865 -39.5875 America/Bahia +-19.47833 -46.53889 America/Sao_Paulo +-21.95472 -47.99667 America/Sao_Paulo +-23.84861 -50.18778 America/Sao_Paulo +-12.76722 -40.21167 America/Bahia +-22.85833 -47.22 America/Sao_Paulo +-32.02361 -53.39556 America/Sao_Paulo +-11.72917 -49.06861 America/Araguaina +-21.30528 -46.71278 America/Sao_Paulo +-23.46278 -46.53333 America/Sao_Paulo +-23.99306 -46.25639 America/Sao_Paulo +-21.36 -48.22833 America/Sao_Paulo +-25.88278 -48.57472 America/Sao_Paulo +-22.81639 -45.1925 America/Sao_Paulo +-23.415 -46.035 America/Sao_Paulo +-21.26083 -50.64278 America/Sao_Paulo +-25.39528 -51.45806 America/Sao_Paulo +-20.65367 -40.50204 America/Sao_Paulo +-21.29917 -46.8025 America/Sao_Paulo +-26.47306 -49.00278 America/Sao_Paulo +-20.42833 -47.82417 America/Sao_Paulo +-28.84556 -51.89028 America/Sao_Paulo +-22.53722 -42.98194 America/Sao_Paulo +-18.775 -42.9325 America/Sao_Paulo +-14.22333 -42.78139 America/Bahia +-20.31833 -48.31056 America/Sao_Paulo +-20.77556 -41.67944 America/Sao_Paulo +-29.94444 -50.99194 America/Sao_Paulo +-18.85111 -41.94944 America/Sao_Paulo +-18.0125 -49.35472 America/Sao_Paulo +-15.93444 -50.14028 America/Sao_Paulo +-16.49611 -49.42639 America/Sao_Paulo +-16.67861 -49.25389 America/Sao_Paulo +-15.3175 -49.1175 America/Sao_Paulo +-26.93139 -48.95889 America/Sao_Paulo +-29.25611 -51.53361 America/Sao_Paulo +-22.21056 -49.65611 America/Sao_Paulo +-13.74389 -39.48667 America/Bahia +-20.02472 -48.94056 America/Sao_Paulo +-27.35917 -53.39444 America/Sao_Paulo +-23.32167 -46.72694 America/Sao_Paulo +-23.28167 -46.74528 America/Sao_Paulo +-26.08111 -53.055 America/Sao_Paulo +-20.53861 -47.40083 America/Sao_Paulo +-25.54778 -54.58806 America/Sao_Paulo +-28.7475 -49.47222 America/Sao_Paulo +-15.53722 -47.33444 America/Sao_Paulo +-20.46444 -45.42639 America/Sao_Paulo +-27.59667 -48.54917 America/Sao_Paulo +-29.02889 -51.18167 America/Sao_Paulo +-23.54083 -46.36861 America/Sao_Paulo +-20.28389 -50.24639 America/Sao_Paulo +-12.26667 -38.96667 America/Bahia +-29.225 -51.34778 America/Sao_Paulo +-10.5075 -39.01583 America/Bahia +-28.06111 -50.93833 America/Sao_Paulo +-29.86139 -51.17917 America/Sao_Paulo +-29.64833 -51.17389 America/Sao_Paulo +-11.26833 -37.43833 America/Maceio +-11.79611 -37.945 America/Bahia +-14.92611 -42.81917 America/Sao_Paulo +-19.7625 -44.31389 America/Sao_Paulo +-27.63417 -52.27389 America/Sao_Paulo +-11.94194 -38.08444 America/Bahia +-30.54389 -52.52194 America/Sao_Paulo +-29.23611 -51.86972 America/Sao_Paulo +-23.83222 -46.81139 America/Sao_Paulo +-23.64889 -46.85222 America/Sao_Paulo +-21.61 -45.56528 America/Sao_Paulo +-22.78556 -43.31167 America/Sao_Paulo +-22.22111 -54.80556 America/Campo_Grande +-30.98278 -54.67306 America/Sao_Paulo +-25.73361 -53.05722 America/Sao_Paulo +-22.36611 -48.38028 America/Sao_Paulo +-20.13889 -44.88389 America/Sao_Paulo +-14.40861 -56.44611 America/Cuiaba +-18.24944 -43.60028 America/Sao_Paulo +-23.68611 -46.62278 America/Sao_Paulo +-21.90389 -47.61944 America/Sao_Paulo +-18.75639 -44.43083 America/Sao_Paulo +-27.28278 -50.58444 America/Sao_Paulo +-25.42778 -49.27306 America/Sao_Paulo +-15.59611 -56.09667 America/Cuiaba +-23.895 -46.42528 America/Sao_Paulo +-23.785 -53.07333 America/Sao_Paulo +-22.57611 -44.96278 America/Sao_Paulo +-12.67 -39.10194 America/Bahia +-28.63861 -53.60639 America/Sao_Paulo +-16.76861 -47.61361 America/Sao_Paulo +-28.6775 -49.36972 America/Sao_Paulo +-21.34028 -47.72944 America/Sao_Paulo +-18.50667 -54.76 America/Campo_Grande +-23.60389 -46.91917 America/Sao_Paulo +-22.64583 -47.19611 America/Sao_Paulo +-10.12556 -36.17556 America/Maceio +-19.00917 -57.65333 America/Campo_Grande +-25.97972 -52.56778 America/Sao_Paulo +-19.51861 -42.62889 America/Sao_Paulo +-18.47333 -47.20028 America/Sao_Paulo +-18.38083 -44.45639 America/Sao_Paulo +-22.48194 -47.45667 America/Sao_Paulo +-22.02861 -42.36083 America/Sao_Paulo +-19.93167 -44.05361 America/Sao_Paulo +-20.66028 -43.78611 America/Sao_Paulo +-20.49972 -43.85778 America/Sao_Paulo +-11.81361 -37.61056 America/Bahia +-27.23417 -52.02778 America/Sao_Paulo +-22.33028 -47.1725 America/Sao_Paulo +-11.56389 -39.28278 America/Bahia +-12.31667 -38.76667 America/Bahia +-19.91472 -48.38833 America/Sao_Paulo +-12.50583 -38.99861 America/Bahia +-18.59333 -39.73222 America/Sao_Paulo +-22.8375 -51.97306 America/Sao_Paulo +-25.29167 -49.22417 America/Sao_Paulo +-19.53944 -40.63056 America/Sao_Paulo +-14.64083 -39.55111 America/Bahia +-20.44333 -44.76583 America/Sao_Paulo +-10.6 -38.38333 America/Bahia +-23.66333 -52.605 America/Sao_Paulo +-29.95472 -51.62528 America/Sao_Paulo +-27.09639 -52.61833 America/Sao_Paulo +-23.165 -47.74361 America/Sao_Paulo +-15.30833 -49.59833 America/Sao_Paulo +-27.63444 -51.33639 America/Sao_Paulo +-29.16806 -51.17944 America/Sao_Paulo +-21.97722 -44.9325 America/Sao_Paulo +-12.35306 -38.37889 America/Bahia +-21.13778 -48.97278 America/Sao_Paulo +-18.16583 -47.94639 America/Sao_Paulo +-21.38917 -42.69667 America/Sao_Paulo +-24.79111 -50.01194 America/Sao_Paulo +-20.60361 -41.18472 America/Sao_Paulo +-19.11333 -51.73417 America/Campo_Grande +-22.48056 -42.20417 America/Sao_Paulo +-24.95583 -53.45528 America/Sao_Paulo +-21.77389 -47.08639 America/Sao_Paulo +-19.00083 -46.31611 America/Sao_Paulo +-20.18417 -44.77111 America/Sao_Paulo +-29.2975 -51.50361 America/Sao_Paulo +-28.28389 -52.78639 America/Sao_Paulo +-19.78972 -42.13917 America/Sao_Paulo +-23.52272 -46.835 America/Sao_Paulo +-20.73306 -42.02944 America/Sao_Paulo +-20.95361 -43.80639 America/Sao_Paulo +-23.62028 -45.41306 America/Sao_Paulo +-22.995 -47.50778 America/Sao_Paulo +-27.34361 -51.61194 America/Sao_Paulo +-11.38111 -40.01278 America/Bahia +-17.69139 -42.51583 America/Sao_Paulo +-10.50333 -37.05278 America/Maceio +-29.74556 -50.00972 America/Sao_Paulo +-24.00583 -48.34944 America/Sao_Paulo +-26.17722 -50.39 America/Sao_Paulo +-29.91778 -51.18361 America/Sao_Paulo +-31.395 -52.67556 America/Sao_Paulo +-29.36556 -50.81556 America/Sao_Paulo +-22.74639 -50.38694 America/Sao_Paulo +-29.66917 -52.78889 America/Sao_Paulo +-15.675 -38.94722 America/Bahia +-20.41667 -54.06667 America/Campo_Grande +-27.40167 -51.225 America/Sao_Paulo +-21.235 -45.75861 America/Sao_Paulo +-22.73944 -45.59139 America/Sao_Paulo +-13.03667 -46.77167 America/Sao_Paulo +-21.75227 -41.33044 America/Sao_Paulo +-24.04556 -52.38306 America/Sao_Paulo +-25.45861 -49.52833 America/Sao_Paulo +-20.44278 -54.64639 America/Campo_Grande +-10.5075 -40.32139 America/Bahia +-20.89722 -45.27722 America/Sao_Paulo +-22.90556 -47.06083 America/Sao_Paulo +-25.30556 -49.05528 America/Sao_Paulo +-22.61222 -46.0575 America/Sao_Paulo +-23.27583 -51.27833 America/Sao_Paulo +-23.04639 -50.07361 America/Sao_Paulo +-30.85111 -51.81222 America/Sao_Paulo +-22.75528 -46.14472 America/Sao_Paulo +-12.6975 -38.32417 America/Bahia +-17.74167 -48.625 America/Sao_Paulo +-21.27528 -47.30417 America/Sao_Paulo +-24.73611 -48.12278 America/Sao_Paulo +-23.35611 -46.87694 America/Sao_Paulo +-23.36417 -46.74056 America/Sao_Paulo +-14.06944 -42.475 America/Bahia +-19.88 -43.66972 America/Sao_Paulo +-20.84889 -41.11278 America/Sao_Paulo +-29.95111 -51.09389 America/Sao_Paulo +-22.4625 -42.65306 America/Sao_Paulo +-30.03917 -52.89389 America/Sao_Paulo +-12.61833 -38.95583 America/Bahia +-30.51222 -53.49139 America/Sao_Paulo +-23.10083 -45.70694 America/Sao_Paulo +-26.77528 -51.015 America/Sao_Paulo +-23.3075 -47.13278 America/Sao_Paulo +-22.88717 -42.02622 America/Sao_Paulo +-30.11972 -51.96222 America/Sao_Paulo +-17.35111 -44.96222 America/Sao_Paulo +-15.61778 -46.42333 America/Sao_Paulo +-23.7975 -48.59278 America/Sao_Paulo +-14.95944 -39.29972 America/Bahia +-27.09806 -48.9175 America/Sao_Paulo +-14.20361 -41.66528 America/Bahia +-20.14333 -44.19972 America/Sao_Paulo +-22.28417 -48.12667 America/Sao_Paulo +-20.99139 -47.65861 America/Sao_Paulo +-15.77972 -47.92972 America/Sao_Paulo +-22.95194 -46.54194 America/Sao_Paulo +-28.275 -49.16556 America/Sao_Paulo +-22.88583 -48.445 America/Sao_Paulo +-21.13389 -41.67972 America/Sao_Paulo +-13.255 -43.41806 America/Bahia +-19.73639 -45.25222 America/Sao_Paulo +-23.28333 -47.67222 America/Sao_Paulo +-17.10778 -43.815 America/Sao_Paulo +-21.09 -45.56583 America/Sao_Paulo +-26.91944 -49.06611 America/Sao_Paulo +-23.5725 -46.03861 America/Sao_Paulo +-21.28861 -50.34 America/Sao_Paulo +-27.49417 -48.65556 America/Sao_Paulo +-19.96778 -44.19833 America/Sao_Paulo +-23.85444 -46.13861 America/Sao_Paulo +-29.17139 -51.51917 America/Sao_Paulo +-19.22 -42.48361 America/Sao_Paulo +-19.92083 -43.93778 America/Sao_Paulo +-22.76417 -43.39944 America/Sao_Paulo +-22.10889 -56.52111 America/Campo_Grande +-20.94944 -48.47917 America/Sao_Paulo +-22.31472 -49.06056 America/Sao_Paulo +-20.89111 -47.585 America/Sao_Paulo +-21.92194 -50.73389 America/Sao_Paulo +-23.51056 -46.87611 America/Sao_Paulo +-21.18694 -43.97583 America/Sao_Paulo +-21.19361 -48.16389 America/Sao_Paulo +-20.55722 -48.56778 America/Sao_Paulo +-15.61532 -43.59187 America/Sao_Paulo +-12.15278 -44.99 America/Bahia +-26.63222 -48.68472 America/Sao_Paulo +-22.54417 -44.17139 America/Sao_Paulo +-10.90889 -37.03861 America/Maceio +-22.47 -43.82556 America/Sao_Paulo +-15.89 -52.25667 America/Cuiaba +-15.0725 -57.18111 America/Cuiaba +-18.755 -40.89083 America/Sao_Paulo +-22.49472 -48.55806 America/Sao_Paulo +-11.08944 -43.14167 America/Bahia +-22.07444 -48.74028 America/Sao_Paulo +-21.22583 -43.77361 America/Sao_Paulo +-19.94583 -43.48722 America/Sao_Paulo +-23.11 -50.3675 America/Sao_Paulo +-20.00639 -45.97694 America/Sao_Paulo +-26.99056 -48.63472 America/Sao_Paulo +-19.51889 -41.01583 America/Sao_Paulo +-31.33139 -54.10694 America/Sao_Paulo +-23.09861 -48.92583 America/Sao_Paulo +-23.11694 -46.55028 America/Sao_Paulo +-23.2325 -51.66556 America/Sao_Paulo +-22.66167 -50.41222 America/Sao_Paulo +-23.39611 -46.32083 America/Sao_Paulo +-22.57306 -47.1725 America/Sao_Paulo +-32.2375 -53.08694 America/Sao_Paulo +-29.40111 -51.945 America/Sao_Paulo +-22.96611 -42.02778 America/Sao_Paulo +-22.74694 -41.88167 America/Sao_Paulo +-20.28194 -45.53944 America/Sao_Paulo +-19.59333 -46.94056 America/Sao_Paulo +-25.59306 -49.41028 America/Sao_Paulo +-22.87278 -42.34306 America/Sao_Paulo +-22.35694 -47.38417 America/Sao_Paulo +-21.79444 -48.17556 America/Sao_Paulo +-28.93472 -49.48583 America/Sao_Paulo +-23.41944 -51.42444 America/Sao_Paulo +-18.64722 -48.18722 America/Sao_Paulo +-15.8975 -52.25083 America/Sao_Paulo +-16.84972 -42.07028 America/Sao_Paulo +-19.82028 -40.27333 America/Sao_Paulo +-23.50528 -47.61417 America/Sao_Paulo +-11.33333 -38.96667 America/Bahia +-21.20889 -50.43278 America/Sao_Paulo +-10.91111 -37.07167 America/Maceio +-20.47111 -55.78722 America/Campo_Grande +-23.55083 -51.46083 America/Sao_Paulo +-24.50944 -48.8425 America/Sao_Paulo +-20.08667 -51.09361 America/Campo_Grande +-22.84694 -45.22972 America/Sao_Paulo +-25.42861 -48.71194 America/Sao_Paulo +-16.46111 -49.96167 America/Sao_Paulo +-23.00667 -44.31806 America/Sao_Paulo +-20.89611 -51.37944 America/Sao_Paulo +-22.06806 -46.56917 America/Sao_Paulo +-20.48361 -55.80694 America/Campo_Grande +-16.32667 -48.95278 America/Sao_Paulo +-22.70111 -46.76444 America/Sao_Paulo +-21.72444 -48.10167 America/Sao_Paulo +-22.73917 -47.33139 America/Sao_Paulo +-13.03028 -39.60472 America/Bahia +-22.07944 -51.47194 America/Sao_Paulo +-25.32472 -49.31 America/Sao_Paulo +-16.18361 -40.69444 America/Sao_Paulo +-21.42917 -45.94722 America/Sao_Paulo +-21.88778 -42.70444 America/Sao_Paulo +-29.78306 -55.79194 America/Sao_Paulo +-20.76361 -41.53306 America/Sao_Paulo +-12.13556 -38.41917 America/Bahia +-19.49583 -41.06389 America/Sao_Paulo +-22.46917 -48.9875 America/Sao_Paulo +-15.74722 -41.46 America/Sao_Paulo +-22.47639 -46.63278 America/Sao_Paulo +-22.05944 -46.97861 America/Sao_Paulo +-21.68528 -51.0725 America/Sao_Paulo +-19.16 -45.44583 America/Sao_Paulo +-30.11389 -51.325 America/Sao_Paulo +-10.16745 -48.32766 America/Araguaina +-3.35021 -64.70879 America/Manaus +-8.16139 -70.76556 America/Rio_Branco +-4.22984 -69.93622 America/Manaus +-9.06556 -68.65694 America/Eirunepe +-0.13028 -67.08917 America/Manaus +-9.97472 -67.81 America/Rio_Branco +-8.76194 -63.90389 America/Porto_Velho +-3.10194 -60.025 America/Manaus +-3.29972 -60.62056 America/Manaus +-7.51073 -63.02805 America/Manaus +-2.51389 -66.09167 America/Manaus +-6.66028 -69.87361 America/Eirunepe +-7.63111 -72.67 America/Rio_Branco +-4.085 -63.14139 America/Manaus +-4.88278 -66.89583 America/Manaus +2.81972 -60.67333 America/Boa_Vista +-9.91333 -63.04083 America/Porto_Velho +-9.16667 -60.63333 America/Cuiaba +-12.74056 -60.14583 America/Porto_Velho +-13.08271 -62.27726 America/Porto_Velho +-11.6725 -61.19361 America/Porto_Velho +-10.74806 -62.21583 America/Porto_Velho +-10.88528 -61.95167 America/Porto_Velho +-10.43889 -62.46639 America/Porto_Velho +-10.78278 -65.33944 America/Porto_Velho +-11.43861 -61.44722 America/Porto_Velho +-16.82333 -49.24389 America/Sao_Paulo +-27.59444 -48.60694 America/Sao_Paulo +-8.11278 -35.01472 America/Recife +-12.89444 -38.32722 America/Bahia +-25.44472 -49.1925 America/Sao_Paulo +-2.69944 -59.69972 America/Manaus +-12.78444 -38.40389 America/Bahia +-11.86417 -55.5025 America/Cuiaba +-3.62092 -38.82913 America/Fortaleza +-27.58612 -48.52335 America/Sao_Paulo +-27.71773 -48.56266 America/Sao_Paulo +25.05823 -77.34306 America/Nassau +26.53333 -78.66667 America/Nassau +26.53333 -78.7 America/Nassau +27.46609 89.64191 Asia/Thimphu +27.59137 89.87743 Asia/Thimphu +26.85164 89.38837 Asia/Thimphu +27.0219 90.12291 Asia/Thimphu +-21.44236 27.46153 Africa/Gaborone +-24.67014 25.53975 Africa/Gaborone +-22.38754 26.71077 Africa/Gaborone +-21.97895 27.84296 Africa/Gaborone +-24.87158 25.86989 Africa/Gaborone +-22.54605 27.12507 Africa/Gaborone +-24.7718 25.42156 Africa/Gaborone +-24.40659 25.49508 Africa/Gaborone +-24.62694 25.86556 Africa/Gaborone +-24.41667 26.15 Africa/Gaborone +-19.98333 23.41667 Africa/Gaborone +-23.10407 26.81421 Africa/Gaborone +-25.22435 25.67728 Africa/Gaborone +-21.41494 25.59263 Africa/Gaborone +-24.96675 25.33274 Africa/Gaborone +-25.41667 25.55 Africa/Gaborone +-24.65451 25.90859 Africa/Gaborone +-21.16995 27.50788 Africa/Gaborone +54.0985 28.3331 Europe/Minsk +52.8926 30.024 Europe/Minsk +55.1904 30.2049 Europe/Minsk +54.4914 26.9111 Europe/Minsk +53.1561 24.4513 Europe/Minsk +52.6329 29.7389 Europe/Minsk +53.4785 26.7434 Europe/Minsk +54.4798 26.3957 Europe/Minsk +53.0274 27.5597 Europe/Minsk +53.0869 25.3163 Europe/Minsk +53.6014 24.7465 Europe/Minsk +52.7876 27.5415 Europe/Minsk +53.0934 30.0495 Europe/Minsk +52.3617 30.3916 Europe/Minsk +52.556 24.4573 Europe/Minsk +55.4879 28.7856 Europe/Minsk +52.1229 26.0951 Europe/Minsk +55.11676 26.83263 Europe/Minsk +53.3011 28.6386 Europe/Minsk +54.5081 30.4172 Europe/Minsk +53.88333 27.45 Europe/Minsk +55.5318 28.5987 Europe/Minsk +53.5942 25.8191 Europe/Minsk +53.9 27.56667 Europe/Minsk +52.0495 29.2456 Europe/Minsk +53.4122 24.5387 Europe/Minsk +53.509 28.147 Europe/Minsk +54.3167 26.854 Europe/Minsk +53.9168 30.3449 Europe/Minsk +54.8814 28.699 Europe/Minsk +52.2472 26.8047 Europe/Minsk +53.88333 25.29972 Europe/Minsk +53.7125 31.717 Europe/Minsk +53.944 27.7823 Europe/Minsk +52.2138 24.3564 Europe/Minsk +52.1323 29.3257 Europe/Minsk +52.709 25.3401 Europe/Minsk +53.6884 23.8258 Europe/Minsk +54.2862 30.9863 Europe/Minsk +52.4345 30.9754 Europe/Minsk +55.1384 27.6905 Europe/Minsk +53.6832 27.138 Europe/Minsk +52.4089 31.3237 Europe/Minsk +53.521 30.2454 Europe/Minsk +52.5314 24.9786 Europe/Minsk +52.09755 23.68775 Europe/Minsk +54.2279 28.505 Europe/Minsk +53.1327 26.0139 Europe/Minsk +53.1384 29.2214 Europe/Minsk +53.8579 27.4374 Europe/Minsk +17.1576 -89.07964 America/Belize +18.08124 -88.56328 America/Belize +17.25 -88.76667 America/Belize +17.49952 -88.19756 America/Belize +49.05798 -122.25257 America/Vancouver +51.30011 -114.03528 America/Edmonton +43.85012 -79.03288 America/Toronto +48.55009 -71.6491 America/Montreal +48.56688 -78.11624 America/Montreal +49.31637 -122.85263 America/Vancouver +49.21679 -68.14894 America/Montreal +44.40011 -79.66634 America/Toronto +45.43341 -73.86586 America/Montreal +44.16682 -77.38277 America/Toronto +45.56678 -73.19915 America/Montreal +45.66678 -73.88249 America/Montreal +45.61678 -73.83249 America/Montreal +45.59104 -73.43605 America/Montreal +44.11681 -79.61633 America/Toronto +43.68341 -79.76633 America/Toronto +49.84692 -99.95306 America/Winnipeg +43.1334 -80.34967 America/Toronto +43.1334 -80.26636 America/Toronto +44.59132 -75.68705 America/Toronto +45.45008 -73.46583 America/Montreal +43.38621 -79.83713 America/Toronto +49.26636 -122.95263 America/Vancouver +51.05011 -114.08529 America/Edmonton +43.3601 -80.31269 America/Toronto +50.01634 -125.24459 America/Vancouver +53.01684 -112.83525 America/Edmonton +45.38338 -73.51587 America/Montreal +45.45008 -73.28246 America/Montreal +46.23525 -63.12671 America/Halifax +45.38338 -73.74919 America/Montreal +49.16638 -121.95257 America/Vancouver +45.5501 -75.29101 America/Toronto +43.95977 -78.16515 America/Toronto +51.18341 -114.46871 America/Edmonton +44.4834 -80.21638 America/Toronto +47.49989 -52.99806 America/St_Johns +49.28297 -122.75262 America/Vancouver +48.95001 -57.95202 America/St_Johns +45.01809 -74.72815 America/Toronto +45.46536 -73.66585 America/Montreal +49.68657 -124.9936 America/Vancouver +49.49991 -115.76879 America/Edmonton +44.67134 -63.57719 America/Halifax +49.14399 -122.9068 America/Vancouver +45.53455 -73.90168 America/Montreal +46.07844 -64.68735 America/Moncton +45.49452 -73.82419 America/Montreal +45.4473 -73.75335 America/Montreal +45.88336 -72.48241 America/Montreal +48.78293 -123.70266 America/Vancouver +53.55014 -113.46871 America/Edmonton +43.65421 -79.56711 America/Toronto +42.90012 -78.93286 America/Toronto +56.72676 -111.38103 America/Edmonton +56.24988 -120.85292 America/Dawson_Creek +45.94541 -66.66558 America/Moncton +45.47723 -75.70164 America/Montreal +46.19695 -59.95698 America/Glace_Bay +45.40008 -72.73243 America/Montreal +55.16667 -118.80271 America/Edmonton +46.49 -80.99001 America/Toronto +44.25012 -76.94944 America/Toronto +43.54594 -80.25599 America/Toronto +43.25011 -79.84963 America/Toronto +45.33341 -79.21632 America/Toronto +46.01677 -73.44915 America/Montreal +50.66648 -120.3192 America/Vancouver +49.88307 -119.48568 America/Vancouver +44.25011 -79.46632 America/Toronto +44.22976 -76.48098 America/Toronto +45.45008 -73.86586 America/Montreal +43.42537 -80.5112 America/Toronto +48.44963 -123.50261 America/Vancouver +49.10107 -122.65883 America/Vancouver +49.08297 -122.58589 America/Vancouver +45.41678 -73.49917 America/Montreal +45.82318 -73.4294 America/Montreal +45.56995 -73.692 America/Montreal +53.26682 -113.55201 America/Edmonton +49.69999 -112.81856 America/Edmonton +53.28346 -110.00157 America/Edmonton +42.98339 -81.23304 America/Toronto +45.53121 -73.51806 America/Montreal +45.26678 -72.14909 America/Montreal +49.21939 -122.60193 America/Vancouver +43.86682 -79.2663 America/Toronto +45.74965 -73.59956 America/Montreal +50.05006 -110.66834 America/Edmonton +44.7501 -79.88296 America/Toronto +43.51681 -79.88294 America/Toronto +45.65008 -74.08251 America/Montreal +47.02895 -65.50186 America/Moncton +43.5789 -79.6583 America/Toronto +46.11594 -64.80186 America/Moncton +45.50884 -73.58781 America/Montreal +45.51675 -73.64918 America/Montreal +45.56678 -73.19915 America/Montreal +50.40005 -105.53445 America/Regina +47.51659 -52.78135 America/St_Johns +49.16638 -123.94003 America/Vancouver +45.58344 -62.64863 America/Halifax +44.05011 -79.46631 America/Toronto +49.20678 -122.91092 America/Vancouver +43.10012 -79.06627 America/Toronto +42.8334 -80.38297 America/Toronto +52.77972 -108.2967 America/Regina +46.3168 -79.46633 America/Toronto +48.84133 -123.68596 America/Vancouver +49.31636 -123.06934 America/Vancouver +43.76681 -79.4163 America/Toronto +48.44964 -123.3026 America/Vancouver +43.45011 -79.68292 America/Toronto +43.9168 -80.09967 America/Toronto +44.60868 -79.42068 America/Toronto +43.90012 -78.84957 America/Toronto +45.41117 -75.69812 America/Toronto +44.56717 -80.94349 America/Toronto +49.31835 -124.31494 America/Vancouver +45.81681 -77.11616 America/Toronto +49.48062 -119.58584 America/Vancouver +45.89452 -77.28007 America/Toronto +44.30012 -78.31623 America/Toronto +43.90012 -79.13289 America/Toronto +49.22119 -122.68965 America/Vancouver +45.44868 -73.81669 America/Montreal +49.24133 -124.8028 America/Vancouver +42.90012 -79.23288 America/Toronto +49.28297 -122.85263 America/Vancouver +53.20008 -105.76772 America/Regina +44.00012 -77.24946 America/Toronto +53.9166 -122.75301 America/Vancouver +44.18342 -77.56618 America/Toronto +46.60873 -81.20763 America/Toronto +52.26682 -113.802 America/Edmonton +50.45008 -104.6178 America/Regina +45.74222 -73.45008 America/Montreal +49.17003 -123.13683 America/Vancouver +43.87111 -79.43725 America/Toronto +48.23656 -79.02311 America/Montreal +48.41675 -71.06573 America/Montreal +45.53338 -73.28246 America/Montreal +45.53341 -73.34916 America/Montreal +45.36678 -73.56588 America/Montreal +46.31836 -72.56632 America/Montreal +45.58338 -73.33246 America/Montreal +45.63922 -73.82757 America/Montreal +45.565 -73.90554 America/Montreal +45.63076 -72.95699 America/Montreal +45.30713 -73.26259 America/Montreal +45.78036 -74.00365 America/Montreal +45.27271 -66.06766 America/Moncton +45.50008 -73.66585 America/Montreal +45.40008 -74.13256 America/Montreal +45.58773 -73.59501 America/Montreal +45.25008 -74.13253 America/Montreal +50.6998 -119.30237 America/Vancouver +42.97866 -82.40407 America/Toronto +52.11679 -106.63452 America/Regina +46.51677 -84.33325 America/Toronto +50.20011 -66.38208 America/Montreal +46.56675 -72.74913 America/Montreal +45.40008 -71.89908 America/Montreal +53.51684 -113.3187 America/Edmonton +46.03336 -73.11585 America/Montreal +53.53344 -113.91874 America/Edmonton +53.63344 -113.63533 America/Edmonton +43.17126 -79.24267 America/Toronto +43.36679 -80.94972 America/Toronto +42.77361 -81.18038 America/Toronto +49.10635 -122.82509 America/Vancouver +54.51634 -128.60345 America/Vancouver +45.70004 -73.64732 America/Montreal +43.11682 -79.19958 America/Toronto +48.38202 -89.25018 America/Thunder_Bay +48.46686 -81.33312 America/Toronto +43.70011 -79.4163 America/Toronto +46.34515 -72.5477 America/Montreal +45.36685 -63.26538 America/Halifax +48.10018 -77.7828 America/Montreal +49.24966 -123.11934 America/Vancouver +45.68338 -73.43246 America/Montreal +45.40008 -74.03251 America/Montreal +43.8361 -79.49827 America/Toronto +50.25809 -119.26905 America/Vancouver +48.43294 -123.3693 America/Vancouver +46.05007 -71.96579 America/Montreal +43.4668 -80.51639 America/Toronto +42.98342 -79.24958 America/Toronto +49.28333 -123.13333 America/Vancouver +45.48341 -73.59918 America/Montreal +60.71611 -135.05375 America/Whitehorse +49.01636 -122.8026 America/Vancouver +42.30008 -83.01654 America/Toronto +49.8844 -97.14704 America/Winnipeg +43.13339 -80.7497 America/Toronto +62.456 -114.35255 America/Yellowknife +51.2167 -102.46766 America/Regina +44.64533 -63.57239 America/Halifax +47.56494 -52.70931 America/St_Johns +46.81228 -71.21454 America/Montreal +46.80326 -71.17793 America/Montreal +48.44879 -68.52396 America/Montreal +47.82699 -69.54243 America/Montreal +46.1351 -60.1831 America/Glace_Bay +46.79392 -71.35191 America/Montreal +47.3737 -68.32512 America/Moncton +46.09371 -71.30539 America/Montreal +44.67244 -63.47506 America/Halifax +50.36386 -119.34997 America/Vancouver +49.8625 -119.58333 America/Vancouver +46.66667 -70.71667 America/Montreal +48.41648 -71.24884 America/Montreal +46.74064 -71.45131 America/Montreal +49.08938 -123.08241 America/Vancouver +49.16473 -122.64042 America/Vancouver +43.21806 -79.98716 America/Toronto +49.36672 -123.16652 America/Vancouver +43.76672 -79.39909 America/Toronto +-12.15681 96.82251 Indian/Cocos +0.81021 24.43359 Africa/Lubumbashi +3.03716 29.53551 Africa/Lubumbashi +2.14838 27.99466 Africa/Lubumbashi +-3.39534 29.13779 Africa/Lubumbashi +-6.41621 20.79995 Africa/Lubumbashi +-1.57386 29.04339 Africa/Lubumbashi +-7.00906 23.45278 Africa/Lubumbashi +-4.85187 21.5595 Africa/Lubumbashi +-6.13603 23.58979 Africa/Lubumbashi +-4.97503 23.44391 Africa/Lubumbashi +-5.35218 21.42192 Africa/Lubumbashi +-5.38771 25.74885 Africa/Lubumbashi +-3.52105 23.6005 Africa/Lubumbashi +2.15127 21.51672 Africa/Kinshasa +-5.38532 27.00028 Africa/Lubumbashi +0.51528 25.19099 Africa/Lubumbashi +-2.94373 25.92237 Africa/Lubumbashi +-4.42741 26.66656 Africa/Lubumbashi +-5.89624 22.41659 Africa/Lubumbashi +-3.59678 26.66715 Africa/Lubumbashi +-8.73861 24.99056 Africa/Lubumbashi +-5.94749 29.19471 Africa/Lubumbashi +-6.13791 24.48179 Africa/Lubumbashi +-2.49682 28.79081 Africa/Lubumbashi +-6.05 26.91667 Africa/Lubumbashi +2.77391 27.61603 Africa/Lubumbashi +-4.33112 20.58638 Africa/Lubumbashi +-1.67409 29.22845 Africa/Lubumbashi +4.279 21.00284 Africa/Kinshasa +-6.75 23.95 Africa/Lubumbashi +-5.49573 22.26962 Africa/Lubumbashi +0.14164 29.29117 Africa/Lubumbashi +2.78582 24.72998 Africa/Lubumbashi +3.33863 20.88577 Africa/Kinshasa +1.55941 30.25224 Africa/Lubumbashi +2.18771 22.46827 Africa/Kinshasa +-2.49076 28.84281 Africa/Lubumbashi +-9.2 25.85 Africa/Lubumbashi +3.81461 23.68665 Africa/Lubumbashi +-0.28163 20.88053 Africa/Kinshasa +0.49113 29.47306 Africa/Lubumbashi +1.23909 23.61598 Africa/Lubumbashi +2.73877 23.78326 Africa/Lubumbashi +-11.66089 27.47938 Africa/Lubumbashi +-10.98139 26.73333 Africa/Lubumbashi +-10.71484 25.46674 Africa/Lubumbashi +-11.76667 27.23333 Africa/Lubumbashi +-10.87639 26.59694 Africa/Lubumbashi +-4.99707 12.9484 Africa/Kinshasa +-2.72037 17.69001 Africa/Kinshasa +-3.01728 16.92238 Africa/Kinshasa +-5.25837 14.85838 Africa/Kinshasa +0.04865 18.26034 Africa/Kinshasa +-5.79949 13.44068 Africa/Kinshasa +-4.02328 19.53385 Africa/Kinshasa +3.65332 18.63566 Africa/Kinshasa +-4.32758 15.31357 Africa/Kinshasa +-5.04098 18.81619 Africa/Kinshasa +-6.47833 16.81735 Africa/Kinshasa +-4.59111 15.17083 Africa/Kinshasa +-1.9275 18.2881 Africa/Kinshasa +3.25651 19.77234 Africa/Kinshasa +-4.54438 18.60364 Africa/Kinshasa +-2.158 16.23249 Africa/Kinshasa +-3.31687 17.38063 Africa/Kinshasa +-4.38361 15.39139 Africa/Kinshasa +4.31902 21.17861 Africa/Bangui +6.26793 21.22468 Africa/Bangui +6.54233 21.98633 Africa/Bangui +4.74132 22.81838 Africa/Bangui +5.76795 20.67565 Africa/Bangui +5.71801 19.07389 Africa/Bangui +7.24269 16.44059 Africa/Bangui +3.52716 16.04 Africa/Bangui +3.86781 17.98923 Africa/Bangui +6.98961 19.18744 Africa/Bangui +4.96075 18.7035 Africa/Bangui +4.94273 15.87735 Africa/Bangui +6.31933 16.37992 Africa/Bangui +5.93404 15.59599 Africa/Bangui +6.49263 17.45518 Africa/Bangui +4.31887 17.46953 Africa/Bangui +4.25671 18.41583 Africa/Bangui +4.26116 15.79216 Africa/Bangui +7.30082 18.2833 Africa/Bangui +4.36122 18.55496 Africa/Bangui +-3.68192 13.34985 Africa/Brazzaville +-4.77609 11.86352 Africa/Brazzaville +-0.48193 15.89988 Africa/Brazzaville +1.61361 16.05167 Africa/Brazzaville +-2.94968 12.70423 Africa/Brazzaville +-4.15361 13.55 Africa/Brazzaville +-4.19834 12.66664 Africa/Brazzaville +-4.75611 11.85778 Africa/Brazzaville +-4.20493 13.28608 Africa/Brazzaville +1.61804 18.05981 Africa/Brazzaville +-1.87639 15.86444 Africa/Brazzaville +-4.26613 15.28318 Africa/Brazzaville +47.36667 8.55 Europe/Zurich +47.17242 8.51744 Europe/Zurich +46.77852 6.64115 Europe/Zurich +47.50004 8.7251 Europe/Zurich +47.46152 9.04552 Europe/Zurich +47.4705 8.31636 Europe/Zurich +46.46299 6.84345 Europe/Zurich +46.21702 6.08497 Europe/Zurich +47.34713 8.72091 Europe/Zurich +46.75118 7.62166 Europe/Zurich +46.77807 7.63249 Europe/Zurich +46.22908 7.35942 Europe/Zurich +46.29192 7.53559 Europe/Zurich +47.42181 8.54779 Europe/Zurich +47.69732 8.63493 Europe/Zurich +47.42391 9.37477 Europe/Zurich +46.53989 6.5881 Europe/Zurich +47.22557 8.82228 Europe/Zurich +46.51027 6.66183 Europe/Zurich +46.18391 6.10181 Europe/Zurich +47.34999 7.90329 Europe/Zurich +47.40823 8.54258 Europe/Zurich +46.38318 6.23955 Europe/Zurich +46.99179 6.931 Europe/Zurich +47.52271 7.64511 Europe/Zurich +46.43301 6.91143 Europe/Zurich +46.25546 6.96066 Europe/Zurich +46.23424 6.08025 Europe/Zurich +47.05048 8.30635 Europe/Zurich +46.01008 8.96004 Europe/Zurich +47.05 8.26274 Europe/Zurich +46.44527 6.89908 Europe/Zurich +46.516 6.63282 Europe/Zurich +47.09993 6.82586 Europe/Zurich +47.03537 8.27631 Europe/Zurich +47.65 9.18333 Europe/Zurich +46.92436 7.41457 Europe/Zurich +47.45152 8.58491 Europe/Zurich +47.22983 8.83884 Europe/Zurich +47.25579 8.60027 Europe/Zurich +47.40313 8.4971 Europe/Zurich +47.38615 9.27916 Europe/Zurich +47.1921 7.39586 Europe/Zurich +47.41694 9.25125 Europe/Zurich +46.20222 6.14569 Europe/Zurich +46.80237 7.15128 Europe/Zurich +47.55816 8.89854 Europe/Zurich +47.07772 8.27888 Europe/Zurich +47.39724 8.61872 Europe/Zurich +47.40165 8.40015 Europe/Zurich +46.84986 9.53287 Europe/Zurich +46.18096 6.13921 Europe/Zurich +47.13713 7.24608 Europe/Zurich +46.94809 7.44744 Europe/Zurich +46.19278 9.01703 Europe/Zurich +47.5584 7.57327 Europe/Zurich +47.47333 8.30592 Europe/Zurich +47.19625 8.52954 Europe/Zurich +47.37752 8.52127 Europe/Zurich +47.55074 7.53599 Europe/Zurich +47.30997 8.52462 Europe/Zurich +47.39254 8.04422 Europe/Zurich +47.57884 7.64683 Europe/Zurich +47.39503 8.52529 Europe/Zurich +47.41814 8.5122 Europe/Zurich +47.3401 8.53134 Europe/Zurich +47.37382 8.51164 Europe/Zurich +47.3953 8.53721 Europe/Zurich +47.37398 8.49007 Europe/Zurich +47.38946 8.48533 Europe/Zurich +47.49494 8.71954 Europe/Zurich +47.40372 8.57608 Europe/Zurich +47.47646 8.76996 Europe/Zurich +47.35785 8.50296 Europe/Zurich +47.42326 8.52166 Europe/Zurich +47.38245 8.47993 Europe/Zurich +47.51692 8.76863 Europe/Zurich +47.40773 8.5005 Europe/Zurich +47.33756 8.5211 Europe/Zurich +47.3548 8.56097 Europe/Zurich +47.37328 8.58038 Europe/Zurich +47.39223 8.54381 Europe/Zurich +46.18981 6.11441 Europe/Zurich +7.43027 -6.05054 Africa/Abidjan +6.82055 -5.27674 Africa/Abidjan +7.38194 -6.47778 Africa/Abidjan +6.55799 -5.01769 Africa/Abidjan +8.28333 -7.68333 Africa/Abidjan +10.48115 -6.40694 Africa/Abidjan +5.89839 -4.82293 Africa/Abidjan +7.80336 -3.16832 Africa/Abidjan +4.42295 -7.3528 Africa/Abidjan +6.62103 -5.91144 Africa/Abidjan +4.95384 -6.08531 Africa/Abidjan +4.74851 -6.6363 Africa/Abidjan +7.45462 -5.29263 Africa/Abidjan +6.38309 -5.41759 Africa/Abidjan +9.50511 -7.56433 Africa/Abidjan +8.05861 -6.18972 Africa/Abidjan +7.41251 -7.55383 Africa/Abidjan +5.84752 -5.682 Africa/Abidjan +9.45803 -5.62961 Africa/Abidjan +8.13728 -5.10095 Africa/Abidjan +6.49224 -6.58558 Africa/Abidjan +6.54368 -7.4935 Africa/Abidjan +5.2118 -3.73884 Africa/Abidjan +6.32035 -3.95235 Africa/Abidjan +6.13193 -5.9506 Africa/Abidjan +9.5928 -5.19449 Africa/Abidjan +6.74202 -7.34918 Africa/Abidjan +5.83739 -5.35723 Africa/Abidjan +6.64678 -4.70519 Africa/Abidjan +7.0591 -3.9631 Africa/Abidjan +7.25957 -8.15498 Africa/Abidjan +6.87736 -6.45022 Africa/Abidjan +5.32556 -4.37685 Africa/Abidjan +9.52167 -6.48694 Africa/Abidjan +9.26926 -2.9951 Africa/Abidjan +7.69385 -5.03031 Africa/Abidjan +6.99041 -5.7442 Africa/Abidjan +5.27247 -3.59625 Africa/Abidjan +6.65175 -4.20406 Africa/Abidjan +8.0402 -2.80003 Africa/Abidjan +5.35581 -3.88537 Africa/Abidjan +7.73909 -7.61377 Africa/Abidjan +7.67395 -5.58086 Africa/Abidjan +7.01232 -7.4864 Africa/Abidjan +6.67342 -3.96938 Africa/Abidjan +5.49462 -4.05183 Africa/Abidjan +6.38423 -3.88759 Africa/Abidjan +7.13113 -3.20415 Africa/Abidjan +5.92801 -4.21319 Africa/Abidjan +6.10694 -3.86194 Africa/Abidjan +5.28634 -3.30402 Africa/Abidjan +5.46779 -3.20711 Africa/Abidjan +5.41613 -4.0159 Africa/Abidjan +5.30966 -4.01266 Africa/Abidjan +6.72972 -3.49639 Africa/Abidjan +7.96111 -6.67306 Africa/Abidjan +5.78556 -6.60833 Africa/Abidjan +-21.20778 -159.775 Pacific/Rarotonga +-33.02457 -71.55183 America/Santiago +-39.28569 -72.2279 America/Santiago +-33.04222 -71.37333 America/Santiago +-38.23291 -72.33292 America/Santiago +-33.03932 -71.62725 America/Santiago +-28.57617 -70.75938 America/Santiago +-39.81422 -73.24589 America/Santiago +-36.61756 -72.95593 America/Santiago +-22.09198 -70.19792 America/Santiago +-38.73965 -72.59842 America/Santiago +-36.72494 -73.11684 America/Santiago +-35.4264 -71.65542 America/Santiago +-33.66386 -70.92734 America/Santiago +-34.43333 -71.08333 America/Santiago +-33.45694 -70.64827 America/Santiago +-34.63881 -71.36576 America/Santiago +-35.5952 -71.72924 America/Santiago +-32.74976 -70.72584 America/Santiago +-36.42477 -71.958 America/Santiago +-33.59218 -70.6996 America/Santiago +-33.59473 -71.60746 America/Santiago +-40.33494 -72.95564 America/Santiago +-34.40639 -70.85834 America/Santiago +-34.17083 -70.74444 America/Santiago +-33.04752 -71.44249 America/Santiago +-32.8834 -71.24882 America/Santiago +-53.15483 -70.91129 America/Santiago +-41.31946 -72.98538 America/Santiago +-43.11819 -73.61661 America/Santiago +-51.72363 -72.48745 America/Santiago +-41.46574 -72.94289 America/Santiago +-45.40303 -72.69184 America/Santiago +-33.61169 -70.57577 America/Santiago +-39.28223 -71.95427 America/Santiago +-36.74075 -72.99528 America/Santiago +-33.60627 -70.87649 America/Santiago +-36.14311 -71.82605 America/Santiago +-39.64355 -72.33269 America/Santiago +-33.80796 -70.74109 America/Santiago +-30.60106 -71.19901 America/Santiago +-40.57395 -73.13348 America/Santiago +-38.74451 -72.95025 America/Santiago +-37.50253 -72.67307 America/Santiago +-37.71893 -72.24099 America/Santiago +-35.11428 -71.28232 America/Santiago +-33.68909 -71.21528 America/Santiago +-34.18082 -70.64934 America/Santiago +-37.08994 -73.1577 America/Santiago +-37.46973 -72.35366 America/Santiago +-32.83369 -70.59827 America/Santiago +-39.36708 -72.63087 America/Santiago +-32.84043 -70.95623 America/Santiago +-35.84667 -71.59308 America/Santiago +-33.01667 -71.26667 America/Santiago +-37.60825 -73.65356 America/Santiago +-38.53066 -72.43652 America/Santiago +-40.29313 -73.08167 America/Santiago +-29.90453 -71.24894 America/Santiago +-33.2863 -70.87562 America/Santiago +-32.45242 -71.23106 America/Santiago +-37.28415 -72.71105 America/Santiago +-20.22036 -70.13913 America/Santiago +-31.63349 -71.16967 America/Santiago +-32.78333 -71.21667 America/Santiago +-34.06863 -70.72747 America/Santiago +-41.12676 -73.04372 America/Santiago +-33.67969 -70.98482 America/Santiago +-26.36667 -70.05 America/Santiago +-34.98279 -71.23943 America/Santiago +-37.47793 -73.34495 America/Santiago +-37.03386 -73.14019 America/Santiago +-29.95332 -71.33947 America/Santiago +-27.36679 -70.3314 America/Santiago +-35.33321 -72.41156 America/Santiago +-36.82699 -73.04977 America/Santiago +-37.95453 -72.43438 America/Santiago +-45.57524 -72.06619 America/Santiago +-34.71247 -71.0434 America/Santiago +-36.60664 -72.10344 America/Santiago +-36.9256 -73.02841 America/Santiago +-33.28379 -70.65333 America/Santiago +-35.9671 -72.32248 America/Santiago +-42.4721 -73.77319 America/Santiago +-33.55384 -71.60761 America/Santiago +-37.80128 -73.39616 America/Santiago +-22.45591 -68.93015 America/Santiago +-37.03394 -72.40468 America/Santiago +-33.73257 -70.74281 America/Santiago +-18.4746 -70.29792 America/Santiago +-37.2463 -73.31752 America/Santiago +-23.65236 -70.3954 America/Santiago +-37.79519 -72.71636 America/Santiago +-41.8707 -73.81622 America/Santiago +-39.80867 -73.21821 America/Santiago +-33.58331 -70.63419 America/Santiago +-33.4443 -70.72552 America/Santiago +3.86667 11.51667 Africa/Douala +10.34107 15.23288 Africa/Douala +6.38333 10.06667 Africa/Douala +4.96667 10.7 Africa/Douala +4.0745 9.3699 Africa/Douala +6.46504 12.62843 Africa/Douala +8.4022 14.1698 Africa/Douala +2.93333 11.98333 Africa/Douala +4.63911 9.67987 Africa/Douala +4.16667 11.53333 Africa/Douala +4.51667 12.03333 Africa/Douala +4.9547 9.9404 Africa/Douala +7.32765 13.58472 Africa/Douala +4.68333 12.36667 Africa/Douala +4.2898 9.4103 Africa/Douala +4.0913 9.3144 Africa/Douala +11.04611 14.14011 Africa/Douala +10.73978 13.80188 Africa/Douala +5.1218 9.96143 Africa/Douala +6.51667 14.3 Africa/Douala +5.62578 10.25517 Africa/Douala +4.5016 9.5671 Africa/Douala +4.45 11.9 Africa/Douala +3.51667 11.5 Africa/Douala +10.59095 14.31592 Africa/Douala +4.8428 9.8217 Africa/Douala +5.754 9.3123 Africa/Douala +4.7182 9.7351 Africa/Douala +3.23333 10.73333 Africa/Douala +4.0242 9.2149 Africa/Douala +9.0263 13.6919 Africa/Douala +6.2 10.66667 Africa/Douala +4.6363 9.4469 Africa/Douala +2.95 9.91667 Africa/Douala +12.07689 15.03063 Africa/Douala +10.10917 14.45083 Africa/Douala +9.9333 13.94672 Africa/Douala +5.88333 14.55 Africa/Douala +9.30142 13.39771 Africa/Douala +6.25 10.26667 Africa/Douala +5.50787 10.6356 Africa/Douala +5.7291 10.90011 Africa/Douala +5.4685 9.8818 Africa/Douala +3.65 10.76667 Africa/Douala +3.8 10.13333 Africa/Douala +2.9 11.15 Africa/Douala +5.44397 10.05332 Africa/Douala +4.04827 9.70428 Africa/Douala +3.76667 9.98333 Africa/Douala +4.1527 9.241 Africa/Douala +10.7336 14.60928 Africa/Douala +4.57728 13.68459 Africa/Douala +4.93333 13.3 Africa/Douala +4.43333 14.36667 Africa/Douala +6.75 11.81667 Africa/Douala +5.14079 10.52535 Africa/Douala +4.4591 8.9027 Africa/Douala +5.95266 10.15824 Africa/Douala +5.88724 10.01248 Africa/Douala +5.47775 10.41759 Africa/Douala +4.75 11.23333 Africa/Douala +5.15705 10.1771 Africa/Douala +3.76667 12.25 Africa/Douala +4.2475 9.00472 Africa/Douala +29.25 88.88333 Asia/Urumqi +39.74318 98.51736 Asia/Chongqing +38.41667 77.24056 Asia/Kashgar +31.1304 97.17982 Asia/Urumqi +31.47678 92.05729 Asia/Urumqi +29.65 91.1 Asia/Urumqi +39.83333 97.73333 Asia/Chongqing +39.45472 75.97972 Asia/Kashgar +39.81121 98.28618 Asia/Chongqing +37.1075 79.93548 Asia/Kashgar +29.96178 90.71875 Asia/Urumqi +43.80096 87.60046 Asia/Urumqi +42.9251 89.16831 Asia/Urumqi +44.3023 86.03694 Asia/Urumqi +41.72778 82.93639 Asia/Urumqi +41.76055 86.15231 Asia/Urumqi +46.51872 86.00214 Asia/Urumqi +42.83393 93.50601 Asia/Urumqi +44.00782 87.30461 Asia/Urumqi +45.68928 85.12441 Asia/Urumqi +40.51556 81.26361 Asia/Kashgar +47.84864 88.13361 Asia/Urumqi +41.11312 80.26918 Asia/Kashgar +27.68667 106.90722 Asia/Chongqing +35.40056 116.96556 Asia/Shanghai +30.12108 104.64811 Asia/Chongqing +29.34162 104.77689 Asia/Chongqing +27.83333 113.15 Asia/Shanghai +32.97944 114.02944 Asia/Shanghai +34.45 115.65 Asia/Shanghai +29.71876 120.24233 Asia/Shanghai +35.99472 119.3975 Asia/Shanghai +39.70083 122.99111 Asia/Shanghai +31.11788 120.84427 Asia/Shanghai +33.63333 114.63333 Asia/Shanghai +36.81667 117.81667 Asia/Shanghai +24.355 102.54222 Asia/Chongqing +33.70389 118.67917 Asia/Shanghai +24.51667 103.76667 Asia/Chongqing +31.0054 119.90488 Asia/Shanghai +30.29556 111.50472 Asia/Shanghai +32.28034 119.16999 Asia/Shanghai +32.21086 119.45508 Asia/Shanghai +29.9695 121.68753 Asia/Shanghai +34.75778 113.64861 Asia/Shanghai +32.93917 119.83417 Asia/Shanghai +27.31667 103.71667 Asia/Chongqing +23.05116 112.45972 Asia/Shanghai +39.76667 118.4 Asia/Shanghai +37.36497 120.40997 Asia/Shanghai +21.28145 110.34271 Asia/Urumqi +24.51333 117.65556 Asia/Shanghai +38.93417 100.45167 Asia/Chongqing +36.79056 118.06333 Asia/Shanghai +36.09944 114.32889 Asia/Shanghai +34.86472 117.55417 Asia/Shanghai +32.12722 112.75417 Asia/Shanghai +30.05 121.14944 Asia/Shanghai +34.16278 113.46389 Asia/Shanghai +34.06154 108.62905 Asia/Chongqing +31.37762 120.9543 Asia/Shanghai +33.44743 112.71422 Asia/Shanghai +31.06251 113.76545 Asia/Shanghai +21.99102 100.73409 Asia/Chongqing +34.31139 117.95028 Asia/Shanghai +22.92832 112.03954 Asia/Chongqing +35.02306 110.99278 Asia/Shanghai +38.29056 109.74944 Asia/Chongqing +22.63333 110.15 Asia/Chongqing +29.385 106.51944 Asia/Chongqing +37.68028 112.73194 Asia/Shanghai +34.92889 116.46528 Asia/Shanghai +38.71528 112.7575 Asia/Shanghai +30.421 112.8919 Asia/Shanghai +23.73333 114.68333 Asia/Shanghai +27.42829 112.18338 Asia/Shanghai +29.35376 105.89392 Asia/Chongqing +35.78472 118.62806 Asia/Shanghai +31.16611 112.58306 Asia/Shanghai +32.62945 116.27014 Asia/Shanghai +30.94454 113.55284 Asia/Shanghai +38.46806 106.27306 Asia/Chongqing +34.73806 111.88389 Asia/Shanghai +35.81139 114.31667 Asia/Shanghai +36.69667 118.47972 Asia/Shanghai +27.83333 114.4 Asia/Shanghai +31.70472 112.25611 Asia/Shanghai +31.36059 119.82016 Asia/Shanghai +30.71444 111.28472 Asia/Shanghai +28.76667 104.62383 Asia/Chongqing +37.1566 122.43762 Asia/Shanghai +22.1975 109.94194 Asia/Chongqing +35.55278 116.82861 Asia/Shanghai +37.47649 121.44081 Asia/Shanghai +34.65918 109.22921 Asia/Chongqing +32.39722 119.43583 Asia/Shanghai +24.78081 110.48967 Asia/Chongqing +31.865 120.53889 Asia/Shanghai +37.8575 113.56333 Asia/Shanghai +39.1375 116.99972 Asia/Shanghai +36.11056 115.77528 Asia/Shanghai +39.36389 117.06028 Asia/Shanghai +33.3575 120.1573 Asia/Shanghai +34.18045 117.15707 Asia/Shanghai +20.32917 110.16712 Asia/Urumqi +28.45322 117.9686 Asia/Shanghai +28.45433 104.71498 Asia/Chongqing +34.01667 113.81667 Asia/Shanghai +30.9525 118.75528 Asia/Shanghai +35.16278 112.865 Asia/Shanghai +20.00073 110.29359 Asia/Chongqing +29.71667 112.4 Asia/Shanghai +25.11667 114.3 Asia/Shanghai +28.28857 117.21329 Asia/Shanghai +38.40917 112.73333 Asia/Shanghai +30.86667 114.8 Asia/Shanghai +36.49889 111.70472 Asia/Shanghai +27.80429 114.93335 Asia/Shanghai +32.51861 112.35222 Asia/Shanghai +32.12278 114.06556 Asia/Shanghai +35.30889 113.86722 Asia/Shanghai +35.90056 117.75194 Asia/Shanghai +31.04704 113.14098 Asia/Shanghai +34.59972 119.15944 Asia/Shanghai +37.90278 115.20361 Asia/Shanghai +36.62554 101.75739 Asia/Chongqing +27.74278 111.29556 Asia/Shanghai +37.06306 114.49417 Asia/Shanghai +32.68 109.01722 Asia/Chongqing +36.7975 118.29444 Asia/Shanghai +29.81667 113.46667 Asia/Shanghai +36.24861 116.76583 Asia/Shanghai +23.15486 112.89161 Asia/Shanghai +24.98773 118.3858 Asia/Shanghai +33.78333 114.51667 Asia/Shanghai +31.68636 113.46585 Asia/Shanghai +27.89642 102.26342 Asia/Chongqing +34.91611 118.63889 Asia/Shanghai +34.80222 117.11167 Asia/Shanghai +30.53629 120.68638 Asia/Shanghai +34.76 112.97139 Asia/Shanghai +26.19028 107.5125 Asia/Chongqing +30.16746 120.25883 Asia/Shanghai +32.03244 118.854 Asia/Shanghai +30.92689 113.92221 Asia/Shanghai +34.33778 108.70261 Asia/Chongqing +30.3708 113.44294 Asia/Shanghai +38.985 117.38278 Asia/Shanghai +32.42806 119.56048 Asia/Shanghai +29.88333 114.21667 Asia/Shanghai +28.8547 120.73168 Asia/Shanghai +22.27694 113.56778 Asia/Shanghai +28.66667 112.88333 Asia/Shanghai +27.73333 112.53333 Asia/Shanghai +27.85 112.9 Asia/Shanghai +32.0422 112.14479 Asia/Shanghai +33.84703 113.4778 Asia/Shanghai +34.25833 108.92861 Asia/Chongqing +24.47979 118.08187 Asia/Shanghai +23.48333 111.31667 Asia/Chongqing +31.9925 116.24722 Asia/Shanghai +29.85058 115.5525 Asia/Shanghai +31.56887 120.28857 Asia/Shanghai +29.26778 120.22528 Asia/Shanghai +29.04638 111.6783 Asia/Shanghai +31.33728 118.37351 Asia/Shanghai +30.58333 114.26667 Asia/Shanghai +39.68442 106.81582 Asia/Chongqing +39.49944 106.71167 Asia/Chongqing +29.60077 118.17495 Asia/Shanghai +27.99942 120.66682 Asia/Shanghai +35.7275 116.49611 Asia/Shanghai +28.37161 121.36974 Asia/Shanghai +37.19723 122.05228 Asia/Shanghai +34.50355 109.50891 Asia/Chongqing +37.50914 122.11356 Asia/Shanghai +36.71 119.10194 Asia/Shanghai +30.81544 108.37089 Asia/Chongqing +18.80454 110.39512 Asia/Chongqing +35.87861 119.97528 Asia/Shanghai +39.61833 122.00806 Asia/Shanghai +29.71139 118.3125 Asia/Shanghai +28.1368 106.822 Asia/Chongqing +39.90395 116.66183 Asia/Shanghai +27.32734 120.214 Asia/Shanghai +27.71722 109.18528 Asia/Chongqing +30.95 117.78333 Asia/Shanghai +31.09407 105.08731 Asia/Chongqing +34.57952 105.74238 Asia/Chongqing +30.98664 103.93933 Asia/Chongqing +39.14222 117.17667 Asia/Shanghai +35.07706 117.15176 Asia/Shanghai +34.85 117.33333 Asia/Shanghai +26.03033 119.59739 Asia/Shanghai +34.43278 116.59111 Asia/Shanghai +39.63333 118.18333 Asia/Shanghai +22.03177 111.93537 Asia/Chongqing +39.73333 118.45 Asia/Shanghai +32.68833 112.8275 Asia/Shanghai +39.02111 117.64694 Asia/Shanghai +32.49069 119.90812 Asia/Shanghai +37.86944 112.56028 Asia/Shanghai +32.16667 120.01361 Asia/Shanghai +22.25135 112.7799 Asia/Chongqing +36.18528 117.12 Asia/Shanghai +33.63611 116.97889 Asia/Shanghai +36.95389 118.10472 Asia/Shanghai +31.71111 113.36306 Asia/Shanghai +33.89067 116.77472 Asia/Shanghai +33.8963 117.93307 Asia/Shanghai +30.50802 105.57332 Asia/Chongqing +31.03595 121.2146 Asia/Shanghai +35.64889 117.27583 Asia/Shanghai +36.85917 120.52694 Asia/Shanghai +36.88 118.7375 Asia/Shanghai +39.23333 106.76944 Asia/Chongqing +35.17111 118.82889 Asia/Shanghai +32.6475 110.77806 Asia/Shanghai +32.56667 110.78333 Asia/Shanghai +23.00107 113.077 Asia/Shanghai +39.23417 106.34389 Asia/Chongqing +22.9464 113.35769 Asia/Shanghai +22.51682 113.38521 Asia/Shanghai +24.44647 117.81216 Asia/Shanghai +23.11444 113.84722 Asia/Shanghai +35.08056 109.08972 Asia/Chongqing +38.04139 114.47861 Asia/Shanghai +22.54554 114.0683 Asia/Shanghai +36.24111 115.66722 Asia/Shanghai +29.95762 122.29802 Asia/Shanghai +30.30722 112.24472 Asia/Shanghai +22.77019 112.95776 Asia/Shanghai +30.00237 120.57864 Asia/Shanghai +27.34089 117.4831 Asia/Shanghai +24.8 113.58333 Asia/Shanghai +34.79528 116.08167 Asia/Shanghai +22.78199 115.3475 Asia/Shanghai +23.36814 116.71479 Asia/Shanghai +35.07528 117.45778 Asia/Shanghai +31.22222 121.45806 Asia/Shanghai +36.93833 114.50583 Asia/Shanghai +18.24306 109.505 Asia/Chongqing +26.24861 117.61861 Asia/Shanghai +33.00111 114.35417 Asia/Shanghai +25.725 119.37944 Asia/Shanghai +23.5418 116.36581 Asia/Shanghai +35.4275 119.45528 Asia/Shanghai +38.69889 116.09361 Asia/Shanghai +28.95944 118.86861 Asia/Shanghai +25.48333 103.78333 Asia/Chongqing +35.59667 116.99111 Asia/Shanghai +24.91389 118.58583 Asia/Shanghai +26.5844 111.859 Asia/Shanghai +37.30553 120.82747 Asia/Shanghai +20.00583 110.35417 Asia/Chongqing +28.84061 112.37399 Asia/Shanghai +21.97296 108.62612 Asia/Chongqing +33.25306 119.91333 Asia/Shanghai +39.93167 119.58833 Asia/Shanghai +24.81978 118.57414 Asia/Shanghai +30.45113 115.25593 Asia/Shanghai +33.58861 119.01917 Asia/Shanghai +36.06605 120.36939 Asia/Shanghai +23.7 113.03333 Asia/Shanghai +26.76837 112.10814 Asia/Shanghai +35.70278 115.00528 Asia/Shanghai +29.45679 119.88872 Asia/Shanghai +25.43944 119.01028 Asia/Shanghai +29.71667 113.88333 Asia/Shanghai +22.75867 108.48111 Asia/Chongqing +39.39528 121.96694 Asia/Shanghai +28.99242 116.66754 Asia/Shanghai +36.28306 116.44528 Asia/Shanghai +35.50056 117.63083 Asia/Shanghai +37.2025 112.17806 Asia/Shanghai +27.61672 113.85353 Asia/Shanghai +22.99376 114.71311 Asia/Shanghai +23.54218 110.38946 Asia/Chongqing +35.53917 106.68611 Asia/Chongqing +36.78444 119.94639 Asia/Shanghai +33.73847 113.30119 Asia/Shanghai +36.43111 114.17 Asia/Shanghai +26.5479 101.70539 Asia/Chongqing +35.76417 116.79139 Asia/Shanghai +28.25831 112.56048 Asia/Shanghai +37.38422 121.60859 Asia/Shanghai +29.28917 121.42472 Asia/Shanghai +29.87819 121.54945 Asia/Shanghai +29.58354 105.06216 Asia/Chongqing +29.35955 112.40243 Asia/Shanghai +31.78394 111.82752 Asia/Shanghai +32.99472 112.53278 Asia/Shanghai +32.03028 120.87472 Asia/Shanghai +27.92333 118.53333 Asia/Shanghai +26.645 118.17361 Asia/Shanghai +22.81667 108.31667 Asia/Chongqing +36.18167 118.15833 Asia/Shanghai +31.35333 106.06309 Asia/Chongqing +32.06167 118.77778 Asia/Shanghai +37.35806 115.37444 Asia/Shanghai +23.72695 111.79723 Asia/Shanghai +22.8525 110.82333 Asia/Chongqing +36.74833 118.05583 Asia/Shanghai +30.79508 106.08474 Asia/Chongqing +28.68333 115.88333 Asia/Shanghai +24.40417 103.44278 Asia/Chongqing +36.71667 117.5 Asia/Shanghai +32.78017 117.96378 Asia/Shanghai +32.45861 114.04861 Asia/Shanghai +31.45934 104.75424 Asia/Chongqing +39.93819 116.09307 Asia/Shanghai +35.70694 117.92639 Asia/Shanghai +33.26611 116.56605 Asia/Shanghai +24.29769 116.10724 Asia/Shanghai +21.45713 110.76591 Asia/Urumqi +25.03333 102.63611 Asia/Chongqing +30.42139 111.75333 Asia/Shanghai +31.18013 115.02213 Asia/Shanghai +24.68412 113.59839 Asia/Shanghai +38.8 121.26667 Asia/Shanghai +28.58023 121.37491 Asia/Shanghai +34.68361 112.45361 Asia/Shanghai +24.95938 118.683 Asia/Shanghai +23.16244 114.27342 Asia/Shanghai +24.40583 109.60861 Asia/Chongqing +33.57167 114.03528 Asia/Shanghai +29.38481 104.02862 Asia/Chongqing +31.23357 117.28057 Asia/Shanghai +30.05127 101.96033 Asia/Chongqing +23.17233 112.28298 Asia/Shanghai +37.87917 114.65167 Asia/Shanghai +27.73444 111.99444 Asia/Shanghai +24.67192 102.1613 Asia/Chongqing +37.65182 120.33063 Asia/Shanghai +31.42813 119.48353 Asia/Shanghai +28.15861 113.62709 Asia/Shanghai +23.31072 116.16869 Asia/Shanghai +28.46042 119.91029 Asia/Shanghai +34.37803 109.20892 Asia/Chongqing +35.06306 118.34278 Asia/Shanghai +35.60028 103.20639 Asia/Chongqing +39.7 118.43333 Asia/Shanghai +36.42472 114.20472 Asia/Shanghai +36.51556 118.53972 Asia/Shanghai +30.41587 103.46088 Asia/Chongqing +36.84556 115.71167 Asia/Shanghai +30.4225 120.29722 Asia/Shanghai +28.84815 121.12807 Asia/Shanghai +22.70722 110.34917 Asia/Chongqing +19.90778 109.68583 Asia/Chongqing +36.08889 111.51889 Asia/Shanghai +27.66667 113.5 Asia/Shanghai +30.3 108.85 Asia/Shanghai +23.29549 113.82465 Asia/Shanghai +36.44389 115.96472 Asia/Shanghai +24.78186 112.3712 Asia/Shanghai +21.66621 109.20116 Asia/Chongqing +24.92271 102.48496 Asia/Chongqing +37.92672 102.63202 Asia/Chongqing +39.73598 116.13295 Asia/Shanghai +21.64673 110.28172 Asia/Urumqi +29.56228 103.76386 Asia/Chongqing +26.4111 111.59559 Asia/Shanghai +27.68806 111.42944 Asia/Shanghai +26.40238 112.85908 Asia/Shanghai +25.11371 113.35408 Asia/Shanghai +32.38583 111.66778 Asia/Shanghai +36.05701 103.83987 Asia/Chongqing +29.21588 119.47156 Asia/Shanghai +27.68833 111.66417 Asia/Shanghai +39.50972 116.69472 Asia/Shanghai +37.18072 119.94217 Asia/Shanghai +36.97583 120.71361 Asia/Shanghai +36.19278 117.65694 Asia/Shanghai +23.7 109.26667 Asia/Chongqing +27.66583 120.56583 Asia/Shanghai +25.03889 102.71833 Asia/Chongqing +23.69767 103.30372 Asia/Chongqing +23.3695 104.27721 Asia/Chongqing +34.7986 114.30742 Asia/Shanghai +35.39472 116.08833 Asia/Shanghai +32.31737 121.18552 Asia/Shanghai +29.73333 115.98333 Asia/Shanghai +33.73333 115.4 Asia/Shanghai +28.31926 109.73346 Asia/Shanghai +39.1 121.71667 Asia/Shanghai +27.43265 120.60625 Asia/Shanghai +29.60487 111.87012 Asia/Shanghai +32.08982 121.07355 Asia/Shanghai +19.72878 110.00851 Asia/Chongqing +23.22806 110.82611 Asia/Chongqing +35.405 116.58139 Asia/Shanghai +29.10678 119.64421 Asia/Shanghai +30.35028 112.19028 Asia/Shanghai +37.99806 114.01556 Asia/Shanghai +31.03361 112.20472 Asia/Shanghai +30.65 113.1 Asia/Shanghai +29.2947 117.20789 Asia/Shanghai +38.50062 102.19379 Asia/Chongqing +35.50222 112.83278 Asia/Shanghai +36.66833 116.99722 Asia/Shanghai +36.38972 120.46222 Asia/Shanghai +29.28993 106.25001 Asia/Chongqing +37.02444 111.9125 Asia/Shanghai +33.26338 115.36108 Asia/Shanghai +22.81027 115.83058 Asia/Shanghai +35.54278 118.455 Asia/Shanghai +22.87932 116.07318 Asia/Shanghai +30.7522 120.75 Asia/Shanghai +35.23972 113.23306 Asia/Shanghai +36.28389 120.00333 Asia/Shanghai +26.66167 119.52278 Asia/Shanghai +27.04694 118.32528 Asia/Shanghai +32.50611 120.14278 Asia/Shanghai +28.19377 115.7836 Asia/Shanghai +22.58333 113.08333 Asia/Shanghai +25.48694 119.19834 Asia/Shanghai +21.85564 111.96272 Asia/Chongqing +27.11716 114.97927 Asia/Shanghai +32.44202 105.823 Asia/Chongqing +30.8703 120.0933 Asia/Shanghai +31.53429 119.49 Asia/Shanghai +32.35473 116.2939 Asia/Shanghai +22.81898 113.67306 Asia/Shanghai +23.08333 114.4 Asia/Shanghai +31.81111 121.655 Asia/Shanghai +23.03845 116.28988 Asia/Shanghai +22.456 113.0482 Asia/Shanghai +21.63333 110.58333 Asia/Urumqi +30.45 114.8 Asia/Shanghai +28.6501 121.26591 Asia/Shanghai +30.24706 115.04814 Asia/Shanghai +23.11037 113.4418 Asia/Shanghai +30.88453 114.37789 Asia/Shanghai +30.19235 116.02496 Asia/Shanghai +23.67704 116.99961 Asia/Shanghai +39.74025 116.32693 Asia/Shanghai +32.12722 115.03944 Asia/Shanghai +32.95893 117.16566 Asia/Shanghai +32.62639 116.99694 Asia/Shanghai +23.91952 112.17629 Asia/Shanghai +27.54944 109.95917 Asia/Shanghai +33.43333 115.03333 Asia/Shanghai +33.97444 116.79167 Asia/Shanghai +27.11 109.99556 Asia/Shanghai +35.24306 115.44111 Asia/Shanghai +29.99228 106.26461 Asia/Chongqing +28.58917 112.32833 Asia/Shanghai +23.43077 115.82991 Asia/Shanghai +26.88946 112.61888 Asia/Shanghai +37.73222 115.70111 Asia/Shanghai +31.86389 117.28083 Asia/Shanghai +33.7722 120.26176 Asia/Shanghai +36.53333 114.11111 Asia/Shanghai +35.89917 114.1925 Asia/Shanghai +33.07278 107.03028 Asia/Chongqing +27.08917 119.64528 Asia/Shanghai +36.77083 119.21083 Asia/Shanghai +30.29365 120.16142 Asia/Shanghai +39.24889 117.78917 Asia/Shanghai +36.60056 114.46778 Asia/Shanghai +30.65 113.76667 Asia/Shanghai +35.46028 110.42917 Asia/Chongqing +34.58167 119.12889 Asia/Shanghai +28.68028 121.44278 Asia/Shanghai +23.19346 116.61219 Asia/Shanghai +24.77985 102.57548 Asia/Chongqing +20.04583 110.34167 Asia/Chongqing +39.73333 118.41667 Asia/Shanghai +34.36591 107.35904 Asia/Chongqing +28.88162 120.03308 Asia/Shanghai +26.58333 106.71667 Asia/Chongqing +33.66972 118.18889 Asia/Shanghai +23.39336 110.07437 Asia/Chongqing +25.28194 110.28639 Asia/Chongqing +23.09639 109.60917 Asia/Chongqing +32.26604 111.63476 Asia/Shanghai +23.11667 113.25 Asia/Shanghai +31.6199 113.9978 Asia/Shanghai +23.36085 103.15372 Asia/Chongqing +21.93924 110.84607 Asia/Urumqi +32.78933 119.44182 Asia/Shanghai +30.77576 106.10294 Asia/Chongqing +36.38333 119.75278 Asia/Shanghai +34.0175 119.18861 Asia/Shanghai +26.06139 119.30611 Asia/Shanghai +32.9 115.81667 Asia/Shanghai +30.05333 119.95194 Asia/Shanghai +37.49583 121.25806 Asia/Shanghai +29.706 107.39575 Asia/Chongqing +23.02677 113.13148 Asia/Shanghai +27.81117 114.66805 Asia/Shanghai +34.70388 116.58717 Asia/Shanghai +39.83333 118.11667 Asia/Shanghai +30.08268 113.33346 Asia/Shanghai +35.26056 117.9675 Asia/Shanghai +39.69833 115.9925 Asia/Shanghai +30.4 114.83333 Asia/Shanghai +30.3 109.48333 Asia/Shanghai +22.18659 112.30424 Asia/Chongqing +26.26667 107.51667 Asia/Chongqing +30.67 112.68952 Asia/Shanghai +23.24212 111.5284 Asia/Chongqing +22.37303 110.94746 Asia/Urumqi +37.45639 118.48556 Asia/Shanghai +32.85231 120.30947 Asia/Shanghai +39.81608 109.97763 Asia/Chongqing +33.99972 119.83083 Asia/Shanghai +22.94594 115.64204 Asia/Shanghai +23.04889 113.74472 Asia/Shanghai +35.85 117.7 Asia/Shanghai +36.77667 121.15972 Asia/Shanghai +38.51306 114.99556 Asia/Shanghai +35.06833 115.5625 Asia/Shanghai +37.44861 116.2925 Asia/Shanghai +31.13019 104.38198 Asia/Chongqing +30.54485 119.9599 Asia/Shanghai +37.80822 120.75908 Asia/Shanghai +32.68222 112.08194 Asia/Shanghai +34.45528 113.02806 Asia/Shanghai +33.19973 120.4578 Asia/Shanghai +29.12944 110.47833 Asia/Shanghai +30.08333 114.95 Asia/Shanghai +26.86879 100.22072 Asia/Chongqing +31.21592 107.50092 Asia/Chongqing +39.04194 106.39583 Asia/Chongqing +32.62082 117.06318 Asia/Shanghai +29.65628 121.4064 Asia/Shanghai +35.56389 114.50583 Asia/Shanghai +22.7984 114.46716 Asia/Shanghai +32.54278 111.50861 Asia/Shanghai +31.56055 118.48147 Asia/Shanghai +33.63333 115.18333 Asia/Shanghai +22.84067 113.2503 Asia/Shanghai +38.91222 121.60222 Asia/Shanghai +25.58474 100.21229 Asia/Chongqing +32.32194 118.29778 Asia/Shanghai +22.16667 111.78333 Asia/Chongqing +29.31506 120.07676 Asia/Shanghai +29.56278 106.55278 Asia/Chongqing +29.78062 104.85224 Asia/Chongqing +30.66134 117.47783 Asia/Shanghai +25.8 113.03333 Asia/Shanghai +35.57944 118.83278 Asia/Shanghai +31.91102 120.26302 Asia/Shanghai +30.66667 104.06667 Asia/Chongqing +23.46132 116.77007 Asia/Shanghai +23.65396 116.62262 Asia/Shanghai +31.6 117.86667 Asia/Shanghai +31.77358 119.95401 Asia/Shanghai +35.20889 111.73861 Asia/Shanghai +28.19874 112.97087 Asia/Shanghai +36.5575 116.72722 Asia/Shanghai +39.70417 119.15056 Asia/Shanghai +28.7 115.81667 Asia/Shanghai +30.2297 115.43346 Asia/Shanghai +26.85 104.23333 Asia/Chongqing +38.31667 116.86667 Asia/Shanghai +30.58333 114.03333 Asia/Shanghai +30.28757 112.22979 Asia/Shanghai +33.87722 115.77028 Asia/Shanghai +38.06667 116.56667 Asia/Shanghai +36.48333 117.83333 Asia/Shanghai +23.89972 106.61333 Asia/Chongqing +37.36667 118.01667 Asia/Shanghai +23.22378 108.80216 Asia/Chongqing +27.30193 105.28627 Asia/Chongqing +34.84861 118.04472 Asia/Shanghai +32.94083 117.36083 Asia/Shanghai +39.9075 116.39723 Asia/Shanghai +21.48333 109.1 Asia/Chongqing +34.56861 105.89333 Asia/Chongqing +39.82222 119.51806 Asia/Shanghai +29.82739 106.43645 Asia/Chongqing +33.22917 119.30917 Asia/Shanghai +31.55037 105.99381 Asia/Chongqing +38.85111 115.49028 Asia/Shanghai +36.54696 104.17023 Asia/Chongqing +22.15 107.23333 Asia/Chongqing +30.01556 120.87111 Asia/Shanghai +24.41667 111.51667 Asia/Chongqing +29.4 112.15 Asia/Shanghai +26.25 105.93333 Asia/Chongqing +36.43417 119.1925 Asia/Shanghai +30.51365 117.04723 Asia/Shanghai +23.01279 104.45081 Asia/Chongqing +31.2575 113.67833 Asia/Shanghai +27.31944 110.10306 Asia/Shanghai +23.44895 116.68092 Asia/Shanghai +31.76667 104.71667 Asia/Chongqing +31.30408 120.59538 Asia/Shanghai +30.01075 122.20465 Asia/Shanghai +31.25597 120.51857 Asia/Shanghai +31.1933 120.71758 Asia/Shanghai +21.31992 110.5723 Asia/Urumqi +29.99152 120.89845 Asia/Shanghai +35.91222 116.31167 Asia/Shanghai +39.02861 121.695 Asia/Shanghai +29.37455 113.09481 Asia/Shanghai +26.46722 111.96806 Asia/Shanghai +45.84955 123.2973 Asia/Harbin +43.50639 123.50639 Asia/Harbin +45.68333 125.31667 Asia/Harbin +45.5 125.13333 Asia/Harbin +46.06771 125.98263 Asia/Harbin +40.81 114.87944 Asia/Shanghai +48 122.71667 Asia/Shanghai +44.8 126.53333 Asia/Harbin +47.85306 128.83565 Asia/Harbin +40.66482 122.22833 Asia/Shanghai +46.31618 129.55455 Asia/Harbin +47.72143 128.87529 Asia/Harbin +41.3975 119.64083 Asia/Shanghai +43.29194 126.00944 Asia/Harbin +42.9075 129.50778 Asia/Harbin +49.28333 120.73333 Asia/Shanghai +40.61028 115.04472 Asia/Shanghai +40.29278 123.27444 Asia/Shanghai +48.28701 129.52337 Asia/Harbin +41.99083 122.82528 Asia/Shanghai +43.95611 125.46611 Asia/Harbin +40.61667 120.71667 Asia/Shanghai +43.96667 116.03333 Asia/Shanghai +42.73722 124.72222 Asia/Shanghai +41.29711 124.12092 Asia/Shanghai +44.91428 127.15001 Asia/Harbin +43.32179 129.76342 Asia/Harbin +42.05972 126.91583 Asia/Harbin +46.83283 126.47768 Asia/Harbin +46.08333 122.08333 Asia/Shanghai +42.96611 129.8425 Asia/Harbin +43.6125 122.26528 Asia/Shanghai +42.29306 123.84139 Asia/Shanghai +46.98043 128.04498 Asia/Harbin +45.33333 122.78333 Asia/Harbin +46.38909 123.41372 Asia/Harbin +46.86135 124.442 Asia/Harbin +52.33333 124.73333 Asia/Harbin +41.65917 123.33917 Asia/Shanghai +47.24805 127.09535 Asia/Harbin +46.63954 126.99508 Asia/Harbin +44.4 131.16667 Asia/Harbin +42.1859 127.47895 Asia/Harbin +43.16143 124.37785 Asia/Harbin +40.12175 116.64783 Asia/Shanghai +44.41667 126.95 Asia/Harbin +46.63611 131.15389 Asia/Harbin +43.52417 125.67361 Asia/Harbin +45.35 126.28333 Asia/Harbin +40.70583 110.28556 Asia/Chongqing +41.79222 123.43278 Asia/Shanghai +44.7 127.2 Asia/Harbin +45.21406 127.97426 Asia/Harbin +42.08167 126.60028 Asia/Harbin +40.54139 110.51083 Asia/Chongqing +46.64142 124.86283 Asia/Harbin +45.76195 130.85131 Asia/Harbin +47.34088 123.96045 Asia/Harbin +46.68469 126.10595 Asia/Harbin +45.11712 124.85676 Asia/Harbin +42.03722 119.28889 Asia/Shanghai +42.94222 126.05611 Asia/Harbin +41.18806 122.04944 Asia/Shanghai +47.51667 122.88333 Asia/Harbin +49.17414 125.21774 Asia/Harbin +48.48333 124.83333 Asia/Harbin +40.9241 122.80437 Asia/Shanghai +41.09822 120.74792 Asia/Shanghai +47.13333 129.27426 Asia/Harbin +42.11667 118.78333 Asia/Shanghai +44.58333 129.6 Asia/Harbin +45.55 131.88333 Asia/Harbin +43.10694 128.92167 Asia/Harbin +47.1815 125.90027 Asia/Harbin +42.52722 125.67528 Asia/Harbin +49.6 117.43333 Asia/Shanghai +42.77139 129.42333 Asia/Harbin +47.33072 123.17816 Asia/Harbin +46.53168 125.1038 Asia/Harbin +42.24007 125.71717 Asia/Harbin +43.30472 124.32778 Asia/Harbin +45.28606 130.26151 Asia/Harbin +41.80694 126.90778 Asia/Harbin +41.24 119.40111 Asia/Shanghai +46.56694 131.14528 Asia/Harbin +41.50611 122.72417 Asia/Shanghai +42.90361 125.13583 Asia/Harbin +41.27194 123.17306 Asia/Shanghai +46.25785 126.28269 Asia/Harbin +46.94985 128.86849 Asia/Harbin +40.02611 124.32861 Asia/Shanghai +40.72861 124.78472 Asia/Shanghai +42.53306 124.04028 Asia/Shanghai +44.81351 123.15 Asia/Harbin +45.3011 130.95718 Asia/Harbin +44.1525 125.83278 Asia/Harbin +41.06667 122.95 Asia/Shanghai +44.31667 126.8 Asia/Harbin +41.10778 121.14167 Asia/Shanghai +40.76432 120.85327 Asia/Shanghai +41.0275 113.10583 Asia/Chongqing +43.85083 126.56028 Asia/Harbin +45.21667 131.08333 Asia/Harbin +43.72861 127.34472 Asia/Harbin +46.79927 130.31633 Asia/Harbin +49.45 117.7 Asia/Shanghai +50.41667 124.11667 Asia/Shanghai +41.93222 123.51139 Asia/Shanghai +42.8675 130.35806 Asia/Harbin +47.20417 123.63333 Asia/Harbin +45.98333 126.6 Asia/Harbin +42.6225 126.26139 Asia/Harbin +41.26472 125.36667 Asia/Shanghai +43.55833 128.02389 Asia/Harbin +46.2207 130.525 Asia/Harbin +42.96333 126.74778 Asia/Harbin +46.40124 124.88322 Asia/Harbin +40.81056 111.65222 Asia/Chongqing +45.21235 130.90254 Asia/Harbin +42.53974 128.99722 Asia/Harbin +41.68917 122.11278 Asia/Shanghai +50.24413 127.49016 Asia/Harbin +47.35118 130.30012 Asia/Harbin +45.75 126.65 Asia/Harbin +47.4565 126.95368 Asia/Harbin +44.57149 129.38539 Asia/Harbin +49.2 119.7 Asia/Shanghai +40.85158 122.74754 Asia/Shanghai +43.50075 124.81979 Asia/Harbin +41.11667 123.45 Asia/Shanghai +50.78333 121.51667 Asia/Shanghai +47.91472 123.50306 Asia/Harbin +48.36306 134.28917 Asia/Harbin +47.79756 124.45731 Asia/Harbin +45.18333 124.81667 Asia/Harbin +42.05889 121.745 Asia/Shanghai +42.01556 121.65889 Asia/Shanghai +41.85583 123.92333 Asia/Shanghai +46.72167 131.13944 Asia/Harbin +47.26 132.03222 Asia/Harbin +40.43944 113.15361 Asia/Chongqing +47.57549 130.82306 Asia/Harbin +40.45361 124.07167 Asia/Shanghai +43.6475 111.97667 Asia/Shanghai +41.77639 126.03194 Asia/Harbin +43.3725 128.2425 Asia/Harbin +44.06219 131.12075 Asia/Harbin +41.81444 123.57583 Asia/Shanghai +42.64031 125.51176 Asia/Harbin +45.36088 130.78679 Asia/Harbin +44.53333 125.7 Asia/Harbin +40.09361 113.29139 Asia/Shanghai +43.30667 128.51139 Asia/Harbin +40.63732 122.50251 Asia/Shanghai +46.58333 125 Asia/Harbin +40.12917 124.39472 Asia/Shanghai +41.16528 121.36667 Asia/Shanghai +45.5 124.3 Asia/Harbin +42.26833 118.96361 Asia/Shanghai +45.33333 131.06667 Asia/Harbin +40.9725 117.93611 Asia/Shanghai +42.66223 126.0263 Asia/Harbin +41.57028 120.45861 Asia/Shanghai +42.77884 124.09545 Asia/Shanghai +40.21612 116.23471 Asia/Shanghai +44.26532 124.00045 Asia/Harbin +43.88 125.32278 Asia/Harbin +44.7598 129.67826 Asia/Harbin +45.75279 130.57211 Asia/Harbin +45.75281 127.47986 Asia/Harbin +41.28861 123.765 Asia/Shanghai +41.79194 120.77917 Asia/Shanghai +48.26667 126.6 Asia/Harbin +46.07556 127.3984 Asia/Harbin +40.65222 109.82222 Asia/Chongqing +46.55861 131.42444 Asia/Harbin +46.33167 132.21111 Asia/Harbin +44.91738 130.52 Asia/Harbin +43.58333 127.56667 Asia/Harbin +47.60605 126.08481 Asia/Harbin +45.60746 122.82076 Asia/Harbin +41.93853 126.41965 Asia/Harbin +41.12361 122.99 Asia/Shanghai +46.40202 125.31454 Asia/Harbin +50.56667 123.71667 Asia/Shanghai +45.54545 126.97703 Asia/Harbin +40.30806 118.27056 Asia/Shanghai +24.81878 103.33237 Asia/Chongqing +31.64615 120.74221 Asia/Shanghai +24.94824 114.06572 Asia/Shanghai +30.84918 120.92583 Asia/Shanghai +27.93557 109.59961 Asia/Shanghai +35.99502 119.40259 Asia/Shanghai +27.82511 99.70779 Asia/Chongqing +39.6086 109.78157 Asia/Chongqing +23.36306 104.25047 Asia/Chongqing +26.59444 104.83333 Asia/Chongqing +5.02208 -74.00481 America/Bogota +4.39462 -76.0715 America/Bogota +7.48971 -74.86919 America/Bogota +3.58234 -76.49146 America/Bogota +5.33775 -72.39586 America/Bogota +6.96321 -75.41738 America/Bogota +5.06242 -75.87159 America/Bogota +5.00886 -74.47226 America/Bogota +4.142 -73.62664 America/Bogota +7.83389 -72.47417 America/Bogota +10.60528 -72.98 America/Bogota +5.28333 -71.96667 America/Bogota +5.04492 -75.5146 America/Bogota +10.46314 -73.25322 America/Bogota +6.3152 -76.1342 America/Bogota +5.30933 -73.81574 America/Bogota +8.09368 -76.72691 America/Bogota +10.32944 -75.41137 America/Bogota +1.08878 -77.6183 America/Bogota +5.53528 -73.36778 America/Bogota +1.79861 -78.81556 America/Bogota +4.08466 -76.19536 America/Bogota +9.52392 -75.58139 America/Bogota +8.17361 -76.05917 America/Bogota +6.461 -71.73004 America/Bogota +8.81136 -74.72084 America/Bogota +5.71062 -75.31068 America/Bogota +10.91843 -74.76459 America/Bogota +5.71434 -72.93391 America/Bogota +6.46838 -73.26022 America/Bogota +4.57937 -74.21682 America/Bogota +9.30472 -75.39778 America/Bogota +9.24391 -75.14675 America/Bogota +4.48425 -74.24499 America/Bogota +4.26425 -75.93085 America/Bogota +7.07993 -74.6989 America/Bogota +6.13833 -75.26417 America/Bogota +10.75773 -74.75451 America/Bogota +4.86806 -75.62139 America/Bogota +3.00945 -76.48494 America/Bogota +11.24079 -74.19904 America/Bogota +10.3242 -74.96017 America/Bogota +9.73586 -75.52626 America/Bogota +3.69637 -73.69958 America/Bogota +8.65972 -75.12809 America/Bogota +9.95156 -75.08198 America/Bogota +10.77108 -73.00314 America/Bogota +9.82767 -75.1217 America/Bogota +6.55573 -73.13309 America/Bogota +8.79577 -75.69947 America/Bogota +7.79177 -74.77316 America/Bogota +8.92901 -75.02709 America/Bogota +12.58472 -81.70056 America/Bogota +9.18361 -75.38167 America/Bogota +5.40733 -75.48749 America/Bogota +8.94616 -75.44275 America/Bogota +6.15154 -75.61658 America/Bogota +10.62962 -74.92063 America/Bogota +10.79115 -74.76059 America/Bogota +4.41256 -76.15457 America/Bogota +5.42164 -75.70318 America/Bogota +6.15515 -75.37371 America/Bogota +11.54444 -72.90722 America/Bogota +10.49194 -75.12917 America/Bogota +4.62306 -75.76278 America/Bogota +5.69472 -76.66111 America/Bogota +3.23114 -76.41668 America/Bogota +8.36361 -72.4063 America/Bogota +4.08451 -72.95597 America/Bogota +10.98778 -74.95472 America/Bogota +5.97584 -74.58846 America/Bogota +6.49156 -74.40326 America/Bogota +0.51328 -76.50075 America/Bogota +3.42111 -76.24472 America/Bogota +2.43823 -76.61316 America/Bogota +8.41472 -75.58833 America/Bogota +10.46168 -74.61621 America/Bogota +1.84966 -76.04785 America/Bogota +6.98789 -73.04953 America/Bogota +4.81333 -75.69611 America/Bogota +2.06895 -77.05273 America/Bogota +1.21361 -77.28111 America/Bogota +7.37565 -72.64795 America/Bogota +3.53944 -76.30361 America/Bogota +10.74055 -74.75443 America/Bogota +2.65472 -75.99278 America/Bogota +5.13278 -74.15977 America/Bogota +8.23773 -73.35604 America/Bogota +2.9273 -75.28188 America/Bogota +4.70592 -74.23021 America/Bogota +8.2752 -73.86884 America/Bogota +8.74798 -75.88143 America/Bogota +4.56639 -75.75111 America/Bogota +7.97917 -75.4202 America/Bogota +9.24194 -74.42667 America/Bogota +1.14933 -76.64661 America/Bogota +4.20475 -74.64075 America/Bogota +6.25184 -75.56359 America/Bogota +5.19889 -74.89295 America/Bogota +6.17358 -75.33621 America/Bogota +9.9832 -75.30155 America/Bogota +5.32472 -75.15694 America/Bogota +5.06889 -75.51738 America/Bogota +10.85953 -74.77386 America/Bogota +6.69903 -72.73233 America/Bogota +11.38321 -72.24321 America/Bogota +9.24202 -74.75467 America/Bogota +4.73244 -74.26419 America/Bogota +7.83793 -72.5037 America/Bogota +9.23648 -75.8135 America/Bogota +4.9218 -75.06232 America/Bogota +-4.21528 -69.94056 America/Bogota +4.86242 -74.90977 America/Bogota +4.89972 -75.8825 America/Bogota +4.53282 -76.10318 America/Bogota +1.6045 -77.13152 America/Bogota +4.45265 -75.78746 America/Bogota +2.39341 -75.89232 America/Bogota +5.26667 -73.91667 America/Bogota +9.56228 -73.33405 America/Bogota +6.15769 -75.64317 America/Bogota +5.44783 -74.66311 America/Bogota +6.03082 -75.4315 America/Bogota +3.26074 -76.53499 America/Bogota +6.18461 -75.59913 America/Bogota +0.83018 -77.64959 America/Bogota +4.43889 -75.23222 America/Bogota +5.20856 -74.73584 America/Bogota +3.76383 -76.33292 America/Bogota +3.54625 -73.70687 America/Bogota +7.0682 -73.16981 America/Bogota +4.29866 -74.80468 America/Bogota +2.19593 -75.62777 America/Bogota +10.89686 -74.886 America/Bogota +4.33646 -74.36378 America/Bogota +4.71638 -74.21195 America/Bogota +10.52066 -74.18504 America/Bogota +5.15264 -75.03624 America/Bogota +10.88606 -72.8487 America/Bogota +7.06222 -73.08644 America/Bogota +3.3223 -76.2348 America/Bogota +1.61438 -75.60623 America/Bogota +4.29413 -74.81901 America/Bogota +4.81367 -74.35453 America/Bogota +4.14924 -74.88429 America/Bogota +6.17591 -75.59174 America/Bogota +10.61135 -74.26824 America/Bogota +10.15031 -73.9614 America/Bogota +2.47691 -78.11049 America/Bogota +3.68549 -76.31372 America/Bogota +9.7174 -75.12023 America/Bogota +9.00114 -73.97581 America/Bogota +7.60347 -74.80951 America/Bogota +5.8245 -73.03408 America/Bogota +4.83916 -75.66726 America/Bogota +9.19992 -73.54274 America/Bogota +7.89391 -72.50782 America/Bogota +9.31505 -75.29283 America/Bogota +3.17301 -76.26275 America/Bogota +6.34633 -75.50888 America/Bogota +4.61889 -75.63583 America/Bogota +8.87443 -75.62028 America/Bogota +11.00703 -74.24765 America/Bogota +9.36238 -73.60314 America/Bogota +5.61637 -73.81748 America/Bogota +9.10569 -75.39812 America/Bogota +4.9825 -75.60361 America/Bogota +9.25778 -73.81228 America/Bogota +7.66638 -76.68106 America/Bogota +4.85876 -74.05866 America/Bogota +3.72315 -75.48316 America/Bogota +8.88479 -75.79052 America/Bogota +7.98654 -75.19349 America/Bogota +4.74639 -75.91167 America/Bogota +10.39972 -75.51444 America/Bogota +6.08236 -75.33509 America/Bogota +3.40671 -76.34819 America/Bogota +10.37808 -74.88356 America/Bogota +2.68489 -75.32311 America/Bogota +3.43722 -76.5225 America/Bogota +6.09106 -75.63569 America/Bogota +4.52949 -75.64091 America/Bogota +4.91857 -74.02799 America/Bogota +4.3324 -75.82665 America/Bogota +3.90089 -76.29783 America/Bogota +3.8801 -77.03116 America/Bogota +3.58333 -77 America/Bogota +7.12539 -73.1198 America/Bogota +4.60971 -74.08175 America/Bogota +6.33732 -75.55795 America/Bogota +5.20088 -75.86865 America/Bogota +10.96854 -74.78132 America/Bogota +10.95756 -72.78769 America/Bogota +7.06528 -73.85472 America/Bogota +6.43809 -75.33136 America/Bogota +5.93168 -73.61506 America/Bogota +10.79408 -74.9164 America/Bogota +8.31372 -75.13982 America/Bogota +4.53389 -75.68111 America/Bogota +10.25444 -75.34389 America/Bogota +10.25 -74 America/Bogota +7.08471 -70.75908 America/Bogota +10.59181 -74.18983 America/Bogota +7.88299 -76.62587 America/Bogota +5.33278 -75.79111 America/Bogota +5.6561 -75.87877 America/Bogota +4.17061 -76.16641 America/Bogota +5.17282 -72.54706 America/Bogota +5.61161 -75.45624 America/Bogota +8.30844 -73.6166 America/Bogota +3.98695 -73.75797 America/Bogota +2.75701 -76.61723 America/Bogota +7.75849 -76.65254 America/Bogota +5.85389 -76.02528 America/Bogota +10.03672 -73.23558 America/Bogota +9.79029 -74.78244 America/Bogota +2.57286 -72.64591 America/Bogota +9.90467 -83.68352 America/Costa_Rica +9.74622 -84.23368 America/Costa_Rica +10.09748 -83.50659 America/Costa_Rica +9.96016 -84.04762 America/Costa_Rica +9.87556 -84.07661 America/Costa_Rica +9.831 -84.29008 America/Costa_Rica +9.97454 -84.20974 America/Costa_Rica +9.92787 -84.13722 America/Costa_Rica +9.92829 -84.05074 America/Costa_Rica +9.99559 -84.09656 America/Costa_Rica +9.87121 -84.06084 America/Costa_Rica +9.8773 -84.0847 America/Costa_Rica +9.95974 -84.08165 America/Costa_Rica +10.95173 -85.1361 America/Costa_Rica +9.93333 -84.08333 America/Costa_Rica +9.3721 -83.70399 America/Costa_Rica +9.99299 -84.12934 America/Costa_Rica +9.90488 -84.10551 America/Costa_Rica +9.89898 -84.00287 America/Costa_Rica +10.32381 -84.42714 America/Costa_Rica +9.95808 -84.0305 America/Costa_Rica +9.97625 -84.83836 America/Costa_Rica +9.99074 -83.03596 America/Costa_Rica +9.88071 -84.03501 America/Costa_Rica +9.83832 -83.86556 America/Costa_Rica +10.14527 -85.45243 America/Costa_Rica +10.00696 -84.13396 America/Costa_Rica +10.63504 -85.43772 America/Costa_Rica +9.96746 -84.01326 America/Costa_Rica +10.00236 -84.11651 America/Costa_Rica +10.21588 -83.78661 America/Costa_Rica +9.94611 -84.05279 America/Costa_Rica +9.99447 -84.66466 America/Costa_Rica +9.91178 -84.03407 America/Costa_Rica +9.95091 -84.08503 America/Costa_Rica +9.98424 -84.77892 America/Costa_Rica +9.86444 -83.91944 America/Costa_Rica +10.4294 -85.09311 America/Costa_Rica +9.95 -84.06667 America/Costa_Rica +9.85876 -84.0923 America/Costa_Rica +10.01625 -84.21163 America/Costa_Rica +9.96164 -84.0488 America/Costa_Rica +20.2733 -76.95399 America/Havana +22.32722 -79.23778 America/Havana +22.61243 -83.71136 America/Havana +21.25528 -78.15338 America/Havana +21.73528 -78.79639 America/Havana +23.15678 -81.24441 America/Havana +20.60101 -76.13188 America/Havana +22.79528 -81.5375 America/Havana +21.80194 -79.98417 America/Havana +21.235 -77.52639 America/Havana +22.58667 -80.24361 America/Havana +22.97 -82.38694 America/Havana +20.02472 -75.82194 America/Havana +20.71176 -77.9986 America/Havana +23.15374 -81.92611 America/Havana +22.4 -79.96667 America/Havana +23.06639 -82.29472 America/Havana +20.1875 -75.85083 America/Havana +22.96139 -82.15111 America/Havana +21.92972 -79.4425 America/Havana +22.71417 -83.04806 America/Havana +22.89111 -82.49917 America/Havana +22.80667 -80.07556 America/Havana +20.58194 -75.24139 America/Havana +22.33794 -80.55538 America/Havana +20.36667 -75.01667 America/Havana +20.56284 -76.92122 America/Havana +22.49303 -79.54488 America/Havana +23.125 -82.33194 America/Havana +22.37485 -80.14983 America/Havana +21.19449 -76.60355 America/Havana +21.94694 -78.42833 America/Havana +22.31194 -79.65333 America/Havana +22.4175 -83.69806 America/Havana +22.76917 -81.01889 America/Havana +22.72467 -81.28852 America/Havana +22.24167 -80.39028 America/Havana +20.21238 -75.99843 America/Havana +21.54528 -77.26444 America/Havana +21.88333 -82.8 America/Havana +20.04478 -77.5851 America/Havana +22.10944 -78.6275 America/Havana +20.65694 -74.94028 America/Havana +22.5875 -83.945 America/Havana +21.48833 -77.61832 America/Havana +20.14001 -77.43658 America/Havana +23.04111 -81.5775 America/Havana +22.9875 -82.75361 America/Havana +20.34333 -77.11667 America/Havana +22.14944 -79.97361 America/Havana +20.24673 -74.15181 America/Havana +22.91139 -81.85611 America/Havana +22.58722 -83.24861 America/Havana +20.96167 -76.95111 America/Havana +21.75722 -79.24306 America/Havana +22.86991 -82.42193 America/Havana +23.13302 -82.38304 America/Havana +22.80444 -81.19444 America/Havana +20.96917 -76.29944 America/Havana +20.90508 -77.28819 America/Havana +20.36667 -76.42722 America/Havana +21.16 -76.47889 America/Havana +21.941 -79.17484 America/Havana +23.04306 -82.01083 America/Havana +22.52694 -81.12861 America/Havana +20.88722 -76.26306 America/Havana +20.25101 -76.54152 America/Havana +22.79274 -82.50823 America/Havana +22.83611 -82.02806 America/Havana +20.14444 -75.20917 America/Havana +22.2025 -84.0875 America/Havana +22.92639 -82.6875 America/Havana +23.12389 -82.30028 America/Havana +21.05176 -77.35021 America/Havana +21.10972 -76.13167 America/Havana +22.1001 -79.71913 America/Havana +21.52472 -78.22583 America/Havana +22.14518 -78.97764 America/Havana +21.85155 -78.12005 America/Havana +22.61611 -79.86458 America/Havana +22.14944 -80.20222 America/Havana +20.64511 -75.9402 America/Havana +22.34175 -80.27028 America/Havana +22.98194 -80.58556 America/Havana +20.29778 -76.24139 America/Havana +22.50528 -83.51095 America/Havana +21.87667 -79.84028 America/Havana +22.71917 -80.90583 America/Havana +20.98806 -77.42972 America/Havana +22.01222 -78.705 America/Havana +22.645 -80.04611 America/Havana +22.14957 -80.44662 America/Havana +21.84 -78.76194 America/Havana +22.18736 -78.91569 America/Havana +23.10861 -82.37778 America/Havana +20.55639 -76.47444 America/Havana +23.0375 -81.20472 America/Havana +20.23417 -77.27889 America/Havana +22.48333 -79.75 America/Havana +21.38083 -77.91694 America/Havana +22.53166 -80.9045 America/Havana +22.52056 -79.46694 America/Havana +20.73668 -76.32646 America/Havana +22.07889 -79.49917 America/Havana +22.92861 -82.38861 America/Havana +20.37917 -76.64333 America/Havana +22.98278 -82.54639 America/Havana +20.16303 -76.94443 America/Havana +21.6883 -78.63606 America/Havana +20.34659 -74.49675 America/Havana +20.9625 -75.71861 America/Havana +22.90361 -83.15917 America/Havana +22.81306 -82.76194 America/Havana +23.03611 -82.37167 America/Havana +20.8225 -77.57861 America/Havana +22.80583 -82.58417 America/Havana +23.15833 -82.27694 America/Havana +22.37925 -80.84898 America/Havana +22.2775 -80.5675 America/Havana +23.15917 -82.33056 America/Havana +23.13833 -82.36417 America/Havana +23.13028 -82.35306 America/Havana +20.75167 -76.02694 America/Havana +21.24278 -77.82778 America/Havana +23.0144 -82.3031 America/Havana +23.0072 -82.4017 America/Havana +23.0881 -82.3597 America/Havana +16.6 -22.9 Atlantic/Cape_Verde +14.93152 -23.51254 Atlantic/Cape_Verde +16.89014 -24.98042 Atlantic/Cape_Verde +14.89054 -24.29343 Atlantic/Cape_Verde +12.1084 -68.93354 America/Curacao +-10.42172 105.67912 Indian/Christmas +35.0125 34.05833 Asia/Nicosia +34.76667 32.41667 Asia/Nicosia +35.16667 33.36667 Asia/Nicosia +34.68406 33.03794 Asia/Nicosia +34.91667 33.62917 Asia/Nicosia +35.34167 33.31667 Asia/Nicosia +35.125 33.95 Asia/Nicosia +50.43172 15.81402 Europe/Prague +48.8555 16.0488 Europe/Prague +49.22645 17.67065 Europe/Prague +49.58726 15.93216 Europe/Prague +49.56263 15.93924 Europe/Prague +50.32717 13.54577 Europe/Prague +49.27747 16.99897 Europe/Prague +49.33871 17.99619 Europe/Prague +50.91154 14.61824 Europe/Prague +49.47181 17.97113 Europe/Prague +49.97387 16.39361 Europe/Prague +50.6607 14.03227 Europe/Prague +49.02513 17.64715 Europe/Prague +49.06975 17.45969 Europe/Prague +50.56101 15.9127 Europe/Prague +49.67763 18.67078 Europe/Prague +49.21492 15.88166 Europe/Prague +50.6404 13.82451 Europe/Prague +49.41441 14.6578 Europe/Prague +49.75594 16.46829 Europe/Prague +49.96528 16.97061 Europe/Prague +49.26141 13.90237 Europe/Prague +49.9169 18.33619 Europe/Prague +50.1813 12.6401 Europe/Prague +50.23046 14.08693 Europe/Prague +49.45853 18.14302 Europe/Prague +50.1037 13.7334 Europe/Prague +49.47188 17.11184 Europe/Prague +50.11525 14.50685 Europe/Prague +49.68988 14.01043 Europe/Prague +49.45511 17.4509 Europe/Prague +50.08804 14.42076 Europe/Prague +49.74747 13.37759 Europe/Prague +49.3088 14.1475 Europe/Prague +49.43134 15.22336 Europe/Prague +50.04075 15.77659 Europe/Prague +49.21667 17.51667 Europe/Prague +49.20934 17.53944 Europe/Prague +50.30592 12.93907 Europe/Prague +49.83465 18.28204 Europe/Prague +49.84527 18.43011 Europe/Prague +49.93866 17.90257 Europe/Prague +49.59552 17.25175 Europe/Prague +49.59438 18.01028 Europe/Prague +50.25926 14.51759 Europe/Prague +50.4167 16.16289 Europe/Prague +50.50301 13.63617 Europe/Prague +50.01116 14.4096 Europe/Prague +50.41135 14.90318 Europe/Prague +50.3505 14.47411 Europe/Prague +50.35699 13.79667 Europe/Prague +50.6042 13.61812 Europe/Prague +50.53348 14.1318 Europe/Prague +50.76711 15.05619 Europe/Prague +50.10819 14.47457 Europe/Prague +50.13333 14.51667 Europe/Prague +49.94839 15.26816 Europe/Prague +49.29785 17.39312 Europe/Prague +50.08967 17.70385 Europe/Prague +50.24107 14.31149 Europe/Prague +49.59947 18.1448 Europe/Prague +50.02814 15.20057 Europe/Prague +49.39552 13.29505 Europe/Prague +50.38445 13.17128 Europe/Prague +50.14734 14.10285 Europe/Prague +49.854 18.54169 Europe/Prague +50.23271 12.87117 Europe/Prague +50.38333 13.26667 Europe/Prague +50.37598 13.27131 Europe/Prague +50.49979 13.44769 Europe/Prague +49.14404 15.00301 Europe/Prague +49.3961 15.59124 Europe/Prague +50.43723 15.35162 Europe/Prague +50.72431 15.17108 Europe/Prague +49.54796 17.73469 Europe/Prague +50.20923 15.83277 Europe/Prague +48.84893 17.13244 Europe/Prague +49.60785 15.58069 Europe/Prague +49.77984 18.43688 Europe/Prague +49.68333 18.35 Europe/Prague +50.78215 14.21478 Europe/Prague +49.95109 15.79558 Europe/Prague +50.46048 13.41779 Europe/Prague +50.07963 12.37392 Europe/Prague +49.74613 18.62613 Europe/Prague +48.97447 14.47434 Europe/Prague +49.90436 16.44413 Europe/Prague +50.68551 14.53764 Europe/Prague +49.98844 17.4647 Europe/Prague +49.19522 16.60796 Europe/Prague +48.75897 16.88203 Europe/Prague +50.03597 14.41235 Europe/Prague +50.18709 14.66326 Europe/Prague +49.90411 18.35755 Europe/Prague +49.36304 16.64446 Europe/Prague +50.55 13.76667 Europe/Prague +50.54854 13.77535 Europe/Prague +49.96382 14.072 Europe/Prague +49.78162 14.68697 Europe/Prague +50.10475 14.57974 Europe/Prague +50.72724 12.48839 Europe/Berlin +49.24686 7.36977 Europe/Berlin +50.69447 6.65414 Europe/Berlin +52.216 13.44909 Europe/Berlin +50.89772 14.80764 Europe/Berlin +49.4424 10.95414 Europe/Berlin +51.9662 12.08517 Europe/Berlin +51.04962 12.1369 Europe/Berlin +52.43333 13.25 Europe/Berlin +51.65877 6.45297 Europe/Berlin +51.3707 12.73938 Europe/Berlin +49.79391 9.95121 Europe/Berlin +50.81809 6.1347 Europe/Berlin +51.27027 7.16755 Europe/Berlin +52.42376 9.43585 Europe/Berlin +51.28195 7.03821 Europe/Berlin +49.04888 8.25959 Europe/Berlin +49.63278 8.35916 Europe/Berlin +52.42452 10.7815 Europe/Berlin +47.91289 11.42166 Europe/Berlin +52.16442 10.54095 Europe/Berlin +51.66122 12.26873 Europe/Berlin +51.34103 9.8554 Europe/Berlin +53.16118 12.48287 Europe/Berlin +53.57674 7.77839 Europe/Berlin +49.98596 6.89308 Europe/Berlin +53.00543 11.75032 Europe/Berlin +52.59319 13.32127 Europe/Berlin +51.44362 7.35258 Europe/Berlin +53.89314 11.45286 Europe/Berlin +51.1161 7.39865 Europe/Berlin +53.6 10 Europe/Berlin +53.35753 10.21282 Europe/Berlin +48.87563 9.39819 Europe/Berlin +50.81667 8.1 Europe/Berlin +52.48333 13.31667 Europe/Berlin +51.26371 6.54734 Europe/Berlin +52.52462 13.17707 Europe/Berlin +53.52998 8.11253 Europe/Berlin +52.89446 8.43375 Europe/Berlin +49.29504 8.69846 Europe/Berlin +50.08258 8.24932 Europe/Berlin +50.9495 7.55062 Europe/Berlin +50.56109 8.50495 Europe/Berlin +51.38747 7.39277 Europe/Berlin +53.25682 7.92737 Europe/Berlin +52.51708 13.27636 Europe/Berlin +50.82709 6.9747 Europe/Berlin +51.6669 6.62037 Europe/Berlin +49.759 9.50852 Europe/Berlin +51.83652 10.78216 Europe/Berlin +51.66446 7.63421 Europe/Berlin +51.1397 7.21583 Europe/Berlin +51.55493 7.91403 Europe/Berlin +51.26011 7.76608 Europe/Berlin +52.37874 12.934 Europe/Berlin +50.73604 12.37534 Europe/Berlin +48.67124 9.37632 Europe/Berlin +50.96667 7.86667 Europe/Berlin +49.3523 11.15069 Europe/Berlin +49.9039 8.58874 Europe/Berlin +51.50403 14.64017 Europe/Berlin +51.20148 11.96843 Europe/Berlin +49.03095 10.97221 Europe/Berlin +48.81311 9.36387 Europe/Berlin +49.54887 8.66697 Europe/Berlin +47.81009 9.63863 Europe/Berlin +50.9803 11.32903 Europe/Berlin +47.84147 11.15484 Europe/Berlin +50.76667 6.83333 Europe/Berlin +48.74953 8.87176 Europe/Berlin +47.59331 7.62082 Europe/Berlin +49.67682 12.15613 Europe/Berlin +52.55632 13.46649 Europe/Berlin +51.14221 6.28436 Europe/Berlin +53.16332 7.35052 Europe/Berlin +53.58374 9.69835 Europe/Berlin +52.54734 13.35594 Europe/Berlin +51.10009 6.15484 Europe/Berlin +51.44488 8.34851 Europe/Berlin +51.95109 7.98756 Europe/Berlin +53.5204 12.67985 Europe/Berlin +53.06667 8.2 Europe/Berlin +51.49011 9.14641 Europe/Berlin +47.6895 9.83247 Europe/Berlin +52.74196 13.45799 Europe/Berlin +51.62125 7.40238 Europe/Berlin +52.86147 9.5926 Europe/Berlin +52.35 8.01667 Europe/Berlin +47.62323 8.21717 Europe/Berlin +48.20854 12.39893 Europe/Berlin +48.09585 7.96371 Europe/Berlin +50.87576 7.61688 Europe/Berlin +48.83241 9.31641 Europe/Berlin +49.24991 8.51257 Europe/Berlin +49.26667 6.78333 Europe/Berlin +49.54122 6.88774 Europe/Berlin +50.63333 7.1 Europe/Berlin +52.03792 6.828 Europe/Berlin +49.25162 6.85873 Europe/Berlin +51.59703 6.6863 Europe/Berlin +52.1653 8.85996 Europe/Berlin +48.62695 13.19222 Europe/Berlin +48.06226 8.49358 Europe/Berlin +51.25435 6.39441 Europe/Berlin +49.54033 8.5782 Europe/Berlin +52.04009 8.15272 Europe/Berlin +51.88333 8.51667 Europe/Berlin +52.92342 9.23491 Europe/Berlin +51.33536 7.04348 Europe/Berlin +52.72632 8.28598 Europe/Berlin +52.26038 10.36491 Europe/Berlin +48.10537 11.76825 Europe/Berlin +53.39693 8.13621 Europe/Berlin +48.93563 8.96045 Europe/Berlin +53.68769 9.66394 Europe/Berlin +51.6569 9.63501 Europe/Berlin +48.28038 11.57684 Europe/Berlin +48.06598 11.61564 Europe/Berlin +47.91933 7.69045 Europe/Berlin +51.53794 7.68969 Europe/Berlin +48.39841 9.99155 Europe/Berlin +52.96572 10.56111 Europe/Berlin +47.76977 9.17136 Europe/Berlin +50.93333 6.11667 Europe/Berlin +47.98464 8.8177 Europe/Berlin +48.52266 9.05222 Europe/Berlin +48.07667 8.64409 Europe/Berlin +50.80901 7.14968 Europe/Berlin +49.75565 6.63935 Europe/Berlin +47.86825 12.64335 Europe/Berlin +47.96269 12.59231 Europe/Berlin +51.56016 12.99617 Europe/Berlin +51.32092 6.49412 Europe/Berlin +47.66857 9.59132 Europe/Berlin +53.11865 13.5022 Europe/Berlin +52.46667 13.4 Europe/Berlin +52.4031 13.26014 Europe/Berlin +51.97995 7.78293 Europe/Berlin +52.57601 13.29389 Europe/Berlin +50.14993 8.15206 Europe/Berlin +48.0486 11.61701 Europe/Berlin +52.91345 8.82209 Europe/Berlin +51.3281 8.00369 Europe/Berlin +49.50126 11.74598 Europe/Berlin +49.29882 7.05696 Europe/Berlin +50.60911 10.69401 Europe/Berlin +48.78232 9.17702 Europe/Berlin +53.03333 8.75 Europe/Berlin +52.57859 13.88741 Europe/Berlin +48.88126 12.57385 Europe/Berlin +54.30911 13.0818 Europe/Berlin +51.4419 6.26639 Europe/Berlin +50.77368 6.22595 Europe/Berlin +53.8922 10.64713 Europe/Berlin +47.85105 9.0091 Europe/Berlin +52.6069 11.85867 Europe/Berlin +53.5922 9.9287 Europe/Berlin +52 8.4 Europe/Berlin +52.15045 7.33664 Europe/Berlin +53.61028 10.05917 Europe/Berlin +52.45606 13.332 Europe/Berlin +51.85186 11.58508 Europe/Berlin +48.00193 11.34416 Europe/Berlin +51.99399 6.91918 Europe/Berlin +52.32333 9.20311 Europe/Berlin +50.82261 9.01294 Europe/Berlin +53.59337 9.47629 Europe/Berlin +52.53661 13.15056 Europe/Berlin +51.34669 7.24343 Europe/Berlin +52.20845 9.55416 Europe/Berlin +49.32083 8.43111 Europe/Berlin +52.14021 8.48475 Europe/Berlin +47.51821 10.28262 Europe/Berlin +50.3592 11.17463 Europe/Berlin +51.36973 10.87011 Europe/Berlin +51.15914 11.11524 Europe/Berlin +52.98638 9.84338 Europe/Berlin +51.17343 7.0845 Europe/Berlin +51.57558 8.10619 Europe/Berlin +50.54384 7.24639 Europe/Berlin +49.2529 8.87867 Europe/Berlin +47.75935 8.8403 Europe/Berlin +48.7 9.01667 Europe/Berlin +50.6 6.3 Europe/Berlin +48.08829 9.23033 Europe/Berlin +50.87482 8.02431 Europe/Berlin +50.80019 7.20769 Europe/Berlin +51.52517 14.00164 Europe/Berlin +51.85 7.5 Europe/Berlin +48.32441 10.04442 Europe/Berlin +51.69689 7.46809 Europe/Berlin +50.0432 8.97394 Europe/Berlin +50.17058 12.13054 Europe/Berlin +52.31394 9.9682 Europe/Berlin +53.4 9.96667 Europe/Berlin +51.89096 10.17847 Europe/Berlin +52.39635 9.59727 Europe/Berlin +49.38217 8.5823 Europe/Berlin +51.44387 7.5675 Europe/Berlin +53.62937 11.41316 Europe/Berlin +51.28635 7.29388 Europe/Berlin +50.04937 10.22175 Europe/Berlin +53.05963 14.28154 Europe/Berlin +50.53791 12.78522 Europe/Berlin +53.23333 8.6 Europe/Berlin +49.32534 12.1098 Europe/Berlin +51.21667 6.26667 Europe/Berlin +50.93333 9.21667 Europe/Berlin +49.3 6.81667 Europe/Berlin +49.11127 9.73908 Europe/Berlin +48.79947 9.79809 Europe/Berlin +49.33047 11.02346 Europe/Berlin +48.56067 11.26071 Europe/Berlin +48.22399 8.38583 Europe/Berlin +53.53333 7.95 Europe/Berlin +48.80537 9.52721 Europe/Berlin +47.65105 7.82089 Europe/Berlin +52.46667 13.35 Europe/Berlin +52.01682 11.7307 Europe/Berlin +53.11685 9.79524 Europe/Berlin +50.59465 12.64139 Europe/Berlin +49.43333 6.85 Europe/Berlin +52.47517 13.29071 Europe/Berlin +51.15473 8.28505 Europe/Berlin +50.72136 10.44386 Europe/Berlin +50.34891 9.52532 Europe/Berlin +54.52156 9.5586 Europe/Berlin +51.39678 12.22141 Europe/Berlin +49.36667 7.13333 Europe/Berlin +49.38417 8.3775 Europe/Berlin +53.60278 9.82333 Europe/Berlin +48.01676 9.50064 Europe/Berlin +53.65385 10.11184 Europe/Berlin +52.23495 9.85411 Europe/Berlin +49.46633 7.16814 Europe/Berlin +49.27697 7.11672 Europe/Berlin +50.77538 7.197 Europe/Berlin +51.47221 11.29533 Europe/Berlin +52.85435 11.1525 Europe/Berlin +51.6717 8.60092 Europe/Berlin +49.31366 6.75154 Europe/Berlin +49.2354 6.98165 Europe/Berlin +50.64826 11.36536 Europe/Berlin +49.98955 8.42251 Europe/Berlin +52.50146 13.4934 Europe/Berlin +52.42407 13.48529 Europe/Berlin +50.72043 11.34046 Europe/Berlin +48.16783 8.62719 Europe/Berlin +48.47629 8.93528 Europe/Berlin +49.24762 11.09111 Europe/Berlin +53.11125 9.41082 Europe/Berlin +54.0887 12.14049 Europe/Berlin +50.89559 7.18175 Europe/Berlin +47.85637 12.12247 Europe/Berlin +52.31939 9.65544 Europe/Berlin +52.18604 9.07917 Europe/Berlin +51.80924 8.42841 Europe/Berlin +51.30776 13.29168 Europe/Berlin +49.3 6.93333 Europe/Berlin +54.2422 12.45666 Europe/Berlin +47.56013 7.78715 Europe/Berlin +52.28509 7.44055 Europe/Berlin +51.54649 6.59524 Europe/Berlin +50.62562 6.94911 Europe/Berlin +51.83537 6.69602 Europe/Berlin +51.84967 8.30017 Europe/Berlin +48.49144 9.20427 Europe/Berlin +48.76974 8.93871 Europe/Berlin +54.30663 9.66313 Europe/Berlin +51.17983 7.1925 Europe/Berlin +50.57879 7.22703 Europe/Berlin +52.56667 13.33333 Europe/Berlin +49.82923 8.83572 Europe/Berlin +53.51703 10.2488 Europe/Berlin +50.62279 12.30344 Europe/Berlin +49.03451 12.11923 Europe/Berlin +51.76263 6.39778 Europe/Berlin +51.61379 7.19738 Europe/Berlin +47.78198 9.61062 Europe/Berlin +51.29724 6.84929 Europe/Berlin +52.60659 12.33696 Europe/Berlin +53.95 10.73333 Europe/Berlin +53.25 8.2 Europe/Berlin +48.85851 8.20964 Europe/Berlin +52.43367 8.61263 Europe/Berlin +47.74194 8.97098 Europe/Berlin +51.20218 7.36027 Europe/Berlin +51.10654 13.66047 Europe/Berlin +51.11112 13.91199 Europe/Berlin +53.72831 9.90934 Europe/Berlin +51.78843 11.15006 Europe/Berlin +49.2855 6.88723 Europe/Berlin +50.99965 6.80632 Europe/Berlin +48.15 11.35 Europe/Berlin +52.53878 13.42443 Europe/Berlin +53.31625 13.86261 Europe/Berlin +54.2354 10.27795 Europe/Berlin +52.39886 13.06566 Europe/Berlin +52.23779 8.91901 Europe/Berlin +53.65917 10.08472 Europe/Berlin +51.20949 7.8726 Europe/Berlin +50.4973 12.13782 Europe/Berlin +50.95843 13.93702 Europe/Berlin +49.20145 7.60529 Europe/Berlin +53.66732 9.78936 Europe/Berlin +49.80557 8.60306 Europe/Berlin +48.46458 9.22796 Europe/Berlin +48.88436 8.69892 Europe/Berlin +48.53053 11.505 Europe/Berlin +52.37513 8.96538 Europe/Berlin +47.75293 11.377 Europe/Berlin +52.31928 10.2352 Europe/Berlin +48.5665 13.43122 Europe/Berlin +53.42631 11.84875 Europe/Berlin +53.07738 7.40444 Europe/Berlin +52.56926 13.40186 Europe/Berlin +51.71905 8.75439 Europe/Berlin +53.05 9.01667 Europe/Berlin +50.93275 7.28389 Europe/Berlin +49.40133 7.16424 Europe/Berlin +48.06489 11.66327 Europe/Berlin +53.22698 8.79528 Europe/Berlin +52.27264 8.0498 Europe/Berlin +52.0304 11.22898 Europe/Berlin +51.30001 13.10984 Europe/Berlin +52.75577 13.24197 Europe/Berlin +51.05521 7.01931 Europe/Berlin +51.35613 8.48899 Europe/Berlin +51.02899 7.85139 Europe/Berlin +53.14118 8.21467 Europe/Berlin +48.2 11.33333 Europe/Berlin +49.19884 9.5072 Europe/Berlin +48.47377 7.94495 Europe/Berlin +50.1006 8.76647 Europe/Berlin +51.95453 8.6622 Europe/Berlin +51.64198 7.26451 Europe/Berlin +51.8289 8.14724 Europe/Berlin +51.03333 7.11667 Europe/Berlin +52.20802 7.18988 Europe/Berlin +50.20731 8.57747 Europe/Berlin +50.07139 8.85123 Europe/Berlin +52.46106 13.52108 Europe/Berlin +49.83078 8.74887 Europe/Berlin +48.53241 8.07864 Europe/Berlin +51.47311 6.88074 Europe/Berlin +49.42275 10.95766 Europe/Berlin +48.62565 9.34203 Europe/Berlin +49.45421 11.07752 Europe/Berlin +50.9 7.55 Europe/Berlin +51.93333 7.35 Europe/Berlin +51.70662 9.99998 Europe/Berlin +48.85122 10.48868 Europe/Berlin +52.43081 7.06833 Europe/Berlin +51.5018 10.7957 Europe/Berlin +53.6859 9.98041 Europe/Berlin +53.4861 8.48093 Europe/Berlin +53.59552 7.20639 Europe/Berlin +52.4344 13.20095 Europe/Berlin +52.6461 9.22086 Europe/Berlin +52.58483 13.40272 Europe/Berlin +51.2 6.21667 Europe/Berlin +50.81503 7.03777 Europe/Berlin +49.97756 8.07246 Europe/Berlin +50.23805 8.86704 Europe/Berlin +50.4133 9.00638 Europe/Berlin +53.46667 9.8 Europe/Berlin +50.4336 7.47057 Europe/Berlin +48.39279 10.01112 Europe/Berlin +53.3613 13.07292 Europe/Berlin +54.10707 10.8145 Europe/Berlin +50.32975 11.12058 Europe/Berlin +49.35009 8.13886 Europe/Berlin +52.50462 9.45871 Europe/Berlin +52.15 11.63333 Europe/Berlin +51.19807 6.68504 Europe/Berlin +52.92815 12.80311 Europe/Berlin +49.34449 7.18045 Europe/Berlin +54.07477 9.98195 Europe/Berlin +49.28028 11.46278 Europe/Berlin +50.04832 8.69406 Europe/Berlin +48.31588 11.66316 Europe/Berlin +52.52985 13.68914 Europe/Berlin +48.73218 11.18709 Europe/Berlin +51.13434 6.63857 Europe/Berlin +53.56414 13.27532 Europe/Berlin +50.31667 8.5 Europe/Berlin +51.31667 6.28333 Europe/Berlin +50.91667 8.1 Europe/Berlin +49.18912 9.22528 Europe/Berlin +51.14987 11.80979 Europe/Berlin +52.60701 12.87374 Europe/Berlin +48.5498 8.72366 Europe/Berlin +52.98569 10.08756 Europe/Berlin +51.96236 7.62571 Europe/Berlin +51.41505 9.65046 Europe/Berlin +48.13743 11.57549 Europe/Berlin +47.8082 7.63035 Europe/Berlin +51.43333 6.88333 Europe/Berlin +50.11667 8.83333 Europe/Berlin +48.84232 9.23028 Europe/Berlin +51.20896 10.45275 Europe/Berlin +48.2467 12.52155 Europe/Berlin +48.94754 8.83675 Europe/Berlin +50.91667 7.4 Europe/Berlin +48.40567 9.05419 Europe/Berlin +49.35357 9.15106 Europe/Berlin +48.47089 11.93811 Europe/Berlin +51.09162 6.89218 Europe/Berlin +51.18539 6.44172 Europe/Berlin +53.61702 10.68742 Europe/Berlin +51.45342 6.6326 Europe/Berlin +52.52635 13.33903 Europe/Berlin +50.98622 12.97538 Europe/Berlin +52.28953 8.91455 Europe/Berlin +49.67569 9.00373 Europe/Berlin +48.53695 9.2833 Europe/Berlin +51.2504 6.97536 Europe/Berlin +51.3502 8.28332 Europe/Berlin +49.44331 6.63874 Europe/Berlin +51.35478 11.98923 Europe/Berlin +52.69064 7.29097 Europe/Berlin +51.44337 7.77824 Europe/Berlin +47.98372 10.18527 Europe/Berlin +52.20197 8.33826 Europe/Berlin +51.16158 13.4737 Europe/Berlin +50.56787 10.41521 Europe/Berlin +51.1074 7.64838 Europe/Berlin +51.46667 6.76667 Europe/Berlin +51.26118 6.6717 Europe/Berlin +50.84688 12.46473 Europe/Berlin +50.62388 7.02942 Europe/Berlin +50.59304 6.65224 Europe/Berlin +50.32797 7.22277 Europe/Berlin +52.54525 13.56983 Europe/Berlin +51.46171 8.84949 Europe/Berlin +51.65671 7.09038 Europe/Berlin +50.00443 12.08593 Europe/Berlin +47.77964 10.61713 Europe/Berlin +51.28333 12.36667 Europe/Berlin +52.59841 13.35766 Europe/Berlin +52.41868 13.36723 Europe/Berlin +52.4378 13.38109 Europe/Berlin +50.80904 8.77069 Europe/Berlin +48.93964 9.25995 Europe/Berlin +49.49671 8.47955 Europe/Berlin +49.98419 8.2791 Europe/Berlin +50.15 8.83333 Europe/Berlin +52.50935 13.61373 Europe/Berlin +52.12773 11.62916 Europe/Berlin +51.61634 7.52872 Europe/Berlin +53.2509 10.41409 Europe/Berlin +49.48121 8.44641 Europe/Berlin +52.30322 13.25405 Europe/Berlin +48.89731 9.19161 Europe/Berlin +51.7683 7.44379 Europe/Berlin +51.21977 7.6273 Europe/Berlin +52.09029 13.16772 Europe/Berlin +53.86893 10.68729 Europe/Berlin +51.86217 13.95168 Europe/Berlin +52.30699 8.61423 Europe/Berlin +53.46667 8.65 Europe/Berlin +49.5099 6.74549 Europe/Berlin +47.61497 7.66457 Europe/Berlin +49.98922 9.57223 Europe/Berlin +52.66625 8.2375 Europe/Berlin +50.83868 7.21399 Europe/Berlin +51.09954 14.66738 Europe/Berlin +51.67369 8.34482 Europe/Berlin +52.52143 7.31845 Europe/Berlin +51.01959 7.37758 Europe/Berlin +47.54612 9.68431 Europe/Berlin +50.3836 8.0503 Europe/Berlin +50.85882 12.76165 Europe/Berlin +53.13333 8.91667 Europe/Berlin +52.4333 13.30762 Europe/Berlin +52.39844 13.40637 Europe/Berlin +50.14567 11.05928 Europe/Berlin +52.51395 13.49975 Europe/Berlin +51.0303 6.98432 Europe/Berlin +47.82672 10.0205 Europe/Berlin +52.01246 8.69834 Europe/Berlin +48.8 9.01667 Europe/Berlin +51.11721 8.06707 Europe/Berlin +52.18661 7.86043 Europe/Berlin +52.02786 8.89901 Europe/Berlin +51.33962 12.37129 Europe/Berlin +48.69406 9.16809 Europe/Berlin +49.34737 8.68733 Europe/Berlin +51.10628 7.01873 Europe/Berlin +52.37539 9.97155 Europe/Berlin +53.23157 7.461 Europe/Berlin +49.41122 6.90988 Europe/Berlin +48.22786 9.87874 Europe/Berlin +49.51386 11.28247 Europe/Berlin +51.48813 13.76623 Europe/Berlin +52.43623 13.3459 Europe/Berlin +53.66556 10.00137 Europe/Berlin +52.44758 9.73741 Europe/Berlin +51.10821 6.94831 Europe/Berlin +53.60554 8.59509 Europe/Berlin +49.98955 8.66852 Europe/Berlin +48.52961 12.16179 Europe/Berlin +48.04819 10.88282 Europe/Berlin +49.19844 8.11692 Europe/Berlin +49.59786 8.4725 Europe/Berlin +48.34042 7.86886 Europe/Berlin +50.3 7.61667 Europe/Berlin +51.99223 8.79301 Europe/Berlin +52.31506 9.79739 Europe/Berlin +50.93139 8.42502 Europe/Berlin +51.05 7.26667 Europe/Berlin +49.2818 9.68352 Europe/Berlin +50.5442 9.71792 Europe/Berlin +50.10068 11.45032 Europe/Berlin +50.18424 8.5232 Europe/Berlin +50.23963 11.33308 Europe/Berlin +50.96775 7.98848 Europe/Berlin +52.49973 13.40338 Europe/Berlin +50.74699 6.49069 Europe/Berlin +51.33921 6.58615 Europe/Berlin +51.75186 11.97093 Europe/Berlin +51.19139 6.51352 Europe/Berlin +48.86158 9.18569 Europe/Berlin +48.83218 9.1214 Europe/Berlin +51.27561 8.873 Europe/Berlin +52.4455 13.57455 Europe/Berlin +52.44254 13.58228 Europe/Berlin +49.70045 6.57652 Europe/Berlin +47.66033 9.17582 Europe/Berlin +52.30141 13.633 Europe/Berlin +50.68376 7.18675 Europe/Berlin +50.17943 8.47132 Europe/Berlin +52.25116 10.81683 Europe/Berlin +48.27506 10.89178 Europe/Berlin +50.93333 6.95 Europe/Berlin +47.84965 12.06696 Europe/Berlin +50.35357 7.57884 Europe/Berlin +51.78826 6.13865 Europe/Berlin +52.40786 13.22514 Europe/Berlin +49.73973 10.15072 Europe/Berlin +52.2 8.63333 Europe/Berlin +48.64683 9.45378 Europe/Berlin +50.8272 8.92806 Europe/Berlin +51.13402 7.59075 Europe/Berlin +54.32133 10.13489 Europe/Berlin +51.58243 6.24603 Europe/Berlin +50.86991 6.69691 Europe/Berlin +47.72674 10.31389 Europe/Berlin +51.36432 6.41858 Europe/Berlin +50.13703 8.4502 Europe/Berlin +48.91725 11.88618 Europe/Berlin +48.57297 7.81523 Europe/Berlin +52.51732 13.58871 Europe/Berlin +47.88238 10.62192 Europe/Berlin +51.31667 9.5 Europe/Berlin +52.60904 13.48117 Europe/Berlin +49.96034 9.77239 Europe/Berlin +49.00936 8.40444 Europe/Berlin +52.48419 13.53185 Europe/Berlin +48.21667 11.46667 Europe/Berlin +50.23019 8.77155 Europe/Berlin +51.50467 6.54588 Europe/Berlin +51.26798 14.09374 Europe/Berlin +51.59231 7.6638 Europe/Berlin +53.83292 9.9581 Europe/Berlin +49.443 7.77161 Europe/Berlin +51.22929 6.61882 Europe/Berlin +50.92149 6.36267 Europe/Berlin +51.1 6.5 Europe/Berlin +52.44653 13.5066 Europe/Berlin +50.92878 11.5899 Europe/Berlin +53.92099 9.51529 Europe/Berlin +52.47093 9.84179 Europe/Berlin +51.37547 7.70281 Europe/Berlin +48.76508 11.42372 Europe/Berlin +50.68322 10.91858 Europe/Berlin +49.37362 7.04758 Europe/Berlin +48.22336 10.10347 Europe/Berlin +50.21774 8.26679 Europe/Berlin +49.71443 7.30776 Europe/Berlin +52.27964 7.71457 Europe/Berlin +54.4858 9.05239 Europe/Berlin +50.87079 6.86761 Europe/Berlin +50.67966 9.76727 Europe/Berlin +53.64773 10.04149 Europe/Berlin +53.10766 8.46322 Europe/Berlin +51.1498 7.34471 Europe/Berlin +51.0555 6.22658 Europe/Berlin +51.43787 14.23549 Europe/Berlin +51.77501 9.38155 Europe/Berlin +51.81667 8.65 Europe/Berlin +52.29763 7.58382 Europe/Berlin +48.44423 8.6913 Europe/Berlin +49.32637 7.33867 Europe/Berlin +51.5 7.63333 Europe/Berlin +51.82798 9.4455 Europe/Berlin +47.87663 11.70181 Europe/Berlin +50.80064 12.71287 Europe/Berlin +52.67631 13.27775 Europe/Berlin +50.09019 8.4493 Europe/Berlin +51.49607 9.385 Europe/Berlin +50.31622 11.91833 Europe/Berlin +49.32334 8.55194 Europe/Berlin +50.01436 8.35218 Europe/Berlin +51.41943 6.75462 Europe/Berlin +52.33333 8.75 Europe/Berlin +52.15077 9.95112 Europe/Berlin +51.16818 6.93093 Europe/Berlin +50.99687 8.11062 Europe/Berlin +52.16667 8.61667 Europe/Berlin +49.35 6.93333 Europe/Berlin +50.05553 8.80076 Europe/Berlin +51.6503 11.51146 Europe/Berlin +52.17269 9.24913 Europe/Berlin +50.87067 6.10136 Europe/Berlin +49.56798 10.88565 Europe/Berlin +51.59638 7.14387 Europe/Berlin +48.59523 8.86648 Europe/Berlin +51.5388 7.22572 Europe/Berlin +52.61131 13.31783 Europe/Berlin +52.11457 8.67343 Europe/Berlin +51.39999 7.43584 Europe/Berlin +50.68135 8.30369 Europe/Berlin +49.64145 8.63206 Europe/Berlin +52.63598 13.20419 Europe/Berlin +50.77555 7.28308 Europe/Berlin +52.31425 9.72359 Europe/Berlin +51.38707 7.77019 Europe/Berlin +52.2279 11.00985 Europe/Berlin +52.53319 13.6088 Europe/Berlin +51.06358 6.0998 Europe/Berlin +51.37819 10.13744 Europe/Berlin +52.61449 13.24501 Europe/Berlin +51.32662 6.97106 Europe/Berlin +49.13995 9.22054 Europe/Berlin +48.67798 10.15162 Europe/Berlin +50.97221 13.86741 Europe/Berlin +49.40768 8.69079 Europe/Berlin +54.19579 9.0988 Europe/Berlin +48.35149 8.96317 Europe/Berlin +51.39894 7.18557 Europe/Berlin +50.07854 8.47552 Europe/Berlin +49.36278 8.25806 Europe/Berlin +51.96224 8.22766 Europe/Berlin +52.79262 7.24142 Europe/Berlin +53.46057 9.98388 Europe/Berlin +52.37052 9.73322 Europe/Berlin +50.13423 8.91418 Europe/Berlin +51.73262 6.59031 Europe/Berlin +51.68033 7.82089 Europe/Berlin +52.10397 9.35623 Europe/Berlin +53.56667 10.1 Europe/Berlin +53.56667 10.08333 Europe/Berlin +53.55 10.01667 Europe/Berlin +53.56667 9.98333 Europe/Berlin +53.55 9.93333 Europe/Berlin +53.57532 10.01534 Europe/Berlin +51.18612 7.49817 Europe/Berlin +51.74297 7.18163 Europe/Berlin +53.63333 9.85 Europe/Berlin +52.06008 8.36083 Europe/Berlin +51.5 12 Europe/Berlin +52.28906 11.40982 Europe/Berlin +51.89562 11.05622 Europe/Berlin +52.55877 13.20831 Europe/Berlin +50.74162 8.20778 Europe/Berlin +51.36081 7.47168 Europe/Berlin +48.10881 11.72653 Europe/Berlin +51.19382 7.0133 Europe/Berlin +51.90693 8.37854 Europe/Berlin +53.7972 12.17337 Europe/Berlin +49.11663 10.75971 Europe/Berlin +48.45599 10.27695 Europe/Berlin +51.02608 7.56473 Europe/Berlin +51.94987 14.71447 Europe/Berlin +49.86899 8.9321 Europe/Berlin +49.91986 9.07596 Europe/Berlin +49.92139 8.48255 Europe/Berlin +51.28951 13.5335 Europe/Berlin +52.21099 7.02238 Europe/Berlin +48.2 11.36667 Europe/Berlin +51.23367 12.71959 Europe/Berlin +49.86085 8.5725 Europe/Berlin +51.09102 6.5827 Europe/Berlin +52.09364 7.59396 Europe/Berlin +50.65778 12.19918 Europe/Berlin +54.09311 13.38786 Europe/Berlin +51.3363 6.34072 Europe/Berlin +51.53443 9.93228 Europe/Berlin +50.94823 10.70193 Europe/Berlin +51.90425 10.42766 Europe/Berlin +51.15518 14.98853 Europe/Berlin +48.70354 9.65209 Europe/Berlin +51.67873 6.15895 Europe/Berlin +53.5441 10.20048 Europe/Berlin +50.81987 12.54493 Europe/Berlin +51.57077 6.98593 Europe/Berlin +49.9711 8.34532 Europe/Berlin +48.10755 11.2936 Europe/Berlin +52.47774 10.5511 Europe/Berlin +50.58727 8.67554 Europe/Berlin +48.62219 10.24312 Europe/Berlin +51.31971 7.3392 Europe/Berlin +52.55035 13.39139 Europe/Berlin +51.64091 8.5109 Europe/Berlin +51.954 7.00481 Europe/Berlin +48.42432 10.87273 Europe/Berlin +49.22306 8.36389 Europe/Berlin +48.13392 11.3765 Europe/Berlin +48.79954 9.06316 Europe/Berlin +47.85775 11.48054 Europe/Berlin +50.88029 12.08187 Europe/Berlin +52.20296 8.0448 Europe/Berlin +51.5075 7.12283 Europe/Berlin +50.20164 9.18742 Europe/Berlin +51.51908 6.32363 Europe/Berlin +48.62423 9.82736 Europe/Berlin +50.96745 6.11763 Europe/Berlin +53.43575 10.3779 Europe/Berlin +48.06919 11.37703 Europe/Berlin +47.49209 11.09576 Europe/Berlin +48.24896 11.65101 Europe/Berlin +52.41371 9.5899 Europe/Berlin +53.03333 8.53333 Europe/Berlin +48.8 8.33333 Europe/Berlin +49.47593 10.98856 Europe/Berlin +52.36067 14.06185 Europe/Berlin +48.17904 11.2547 Europe/Berlin +50.55162 9.67518 Europe/Berlin +51.47563 7.76946 Europe/Berlin +52.63336 13.29024 Europe/Berlin +53.0226 7.85764 Europe/Berlin +52.51559 13.45482 Europe/Berlin +52.45052 13.62463 Europe/Berlin +47.65689 9.47554 Europe/Berlin +52.50575 13.50812 Europe/Berlin +50.24962 8.64281 Europe/Berlin +52.47133 13.32813 Europe/Berlin +50.33739 8.75591 Europe/Berlin +48.35693 10.98461 Europe/Berlin +48.46695 8.41371 Europe/Berlin +50.89741 7.87414 Europe/Berlin +51.00166 13.6488 Europe/Berlin +48.40351 11.74876 Europe/Berlin +47.84085 12.98114 Europe/Berlin +47.9959 7.85222 Europe/Berlin +48.93196 9.2024 Europe/Berlin +50.91089 13.33881 Europe/Berlin +50.91485 6.8118 Europe/Berlin +50.11552 8.68417 Europe/Berlin +52.34714 14.55062 Europe/Berlin +49.53414 8.35357 Europe/Berlin +51.0589 8.80077 Europe/Berlin +50.91297 13.04011 Europe/Berlin +51.73544 14.63971 Europe/Berlin +49.71754 11.05877 Europe/Berlin +50.01312 8.42779 Europe/Berlin +54.78431 9.43961 Europe/Berlin +51.63388 13.70662 Europe/Berlin +51.16667 7.96667 Europe/Berlin +48.80867 9.15719 Europe/Berlin +48.80912 9.27697 Europe/Berlin +52.56014 13.0927 Europe/Berlin +54.14054 10.60751 Europe/Berlin +50.66057 6.78722 Europe/Berlin +48.94094 8.40763 Europe/Berlin +48.73961 9.30473 Europe/Berlin +51.45657 7.01228 Europe/Berlin +52.3825 8.62127 Europe/Berlin +50.81854 6.27184 Europe/Berlin +51.18386 10.05329 Europe/Berlin +50.14328 8.57111 Europe/Berlin +51.6127 8.3384 Europe/Berlin +49.59099 11.00783 Europe/Berlin +51.22235 6.9083 Europe/Berlin +51.07947 6.31531 Europe/Berlin +50.9787 11.03283 Europe/Berlin +50.81481 6.79386 Europe/Berlin +48.30603 11.90686 Europe/Berlin +49.13644 8.91229 Europe/Berlin +49.4 6.96667 Europe/Berlin +51.83843 8.03093 Europe/Berlin +51.29848 7.3629 Europe/Berlin +52.14063 8.55772 Europe/Berlin +50.98333 7.4 Europe/Berlin +52.1734 7.52781 Europe/Berlin +51.83933 6.24792 Europe/Berlin +48.12096 7.85359 Europe/Berlin +53.36745 7.20778 Europe/Berlin +50.02858 8.11754 Europe/Berlin +50.93739 6.56828 Europe/Berlin +53.75396 9.65339 Europe/Berlin +48.96164 10.13173 Europe/Berlin +50.76667 7.45 Europe/Berlin +48.69515 9.70676 Europe/Berlin +52.15 14.65 Europe/Berlin +50.9807 10.31522 Europe/Berlin +51.82018 9.86961 Europe/Berlin +51.45984 12.63338 Europe/Berlin +48.28259 9.72749 Europe/Berlin +49.09006 8.39879 Europe/Berlin +53.12699 7.98406 Europe/Berlin +54.46854 9.83824 Europe/Berlin +52.83492 13.81951 Europe/Berlin +48.716 9.5236 Europe/Berlin +49.4668 8.99016 Europe/Berlin +51.22172 6.77616 Europe/Berlin +50.80434 6.49299 Europe/Berlin +51.83149 7.28075 Europe/Berlin +51.43247 6.76516 Europe/Berlin +51.51312 10.25951 Europe/Berlin +51.05089 13.73832 Europe/Berlin +51.79535 7.73815 Europe/Berlin +50.01997 8.69611 Europe/Berlin +51.51494 7.466 Europe/Berlin +51.66166 6.96514 Europe/Berlin +51.09683 6.83167 Europe/Berlin +48.71804 10.7793 Europe/Berlin +47.95514 8.49707 Europe/Berlin +51.1221 13.11027 Europe/Berlin +48.82672 9.06703 Europe/Berlin +51.56227 6.7434 Europe/Berlin +48.64244 12.49283 Europe/Berlin +48.58153 10.49528 Europe/Berlin +49.35557 6.72781 Europe/Berlin +50.74114 8.28699 Europe/Berlin +50.00976 8.77784 Europe/Berlin +52.60783 8.37005 Europe/Berlin +49.89738 8.84613 Europe/Berlin +51.93855 8.87318 Europe/Berlin +51.83864 12.24555 Europe/Berlin +53.0511 8.63091 Europe/Berlin +51.52546 12.34284 Europe/Berlin +51.76502 8.56223 Europe/Berlin +48.84086 12.96068 Europe/Berlin +51.66667 7.38333 Europe/Berlin +49.87167 8.65027 Europe/Berlin +52.52157 8.19793 Europe/Berlin +52.4581 13.28702 Europe/Berlin +48.26 11.43402 Europe/Berlin +53.87176 8.69087 Europe/Berlin +50.81644 12.39045 Europe/Berlin +49.13444 10.07193 Europe/Berlin +51.75769 14.32888 Europe/Berlin +51.13204 13.58312 Europe/Berlin +51.94349 7.16809 Europe/Berlin +50.25937 10.96384 Europe/Berlin +52.84754 8.045 Europe/Berlin +51.80949 10.33821 Europe/Berlin +50.8357 12.92922 Europe/Berlin +52.51667 13.28333 Europe/Berlin +49.22565 12.65501 Europe/Berlin +52.62264 10.08047 Europe/Berlin +51.55657 7.31155 Europe/Berlin +48.71419 8.74031 Europe/Berlin +53.46716 9.68636 Europe/Berlin +50.43395 8.67122 Europe/Berlin +49.64266 8.45936 Europe/Berlin +51.1 7.11667 Europe/Berlin +48.16925 12.83139 Europe/Berlin +52.44628 10.0064 Europe/Berlin +52.27152 11.85493 Europe/Berlin +51.55109 8.55956 Europe/Berlin +52.19837 8.58644 Europe/Berlin +48.69676 8.13523 Europe/Berlin +50.29013 9.1114 Europe/Berlin +52.432 13.46018 Europe/Berlin +52.26065 9.04939 Europe/Berlin +53.32641 9.86812 Europe/Berlin +52.60242 13.43019 Europe/Berlin +49.52416 9.32293 Europe/Berlin +50.82928 6.90499 Europe/Berlin +51.24053 6.18376 Europe/Berlin +47.87859 11.91098 Europe/Berlin +49.12426 8.59804 Europe/Berlin +50.17853 8.92316 Europe/Berlin +52.44293 13.43388 Europe/Berlin +51.39462 8.57146 Europe/Berlin +49.03685 8.70745 Europe/Berlin +53.48458 9.14306 Europe/Berlin +53.55021 8.57674 Europe/Berlin +53.07516 8.80777 Europe/Berlin +52.26594 10.52673 Europe/Berlin +52.41667 12.55 Europe/Berlin +52.40881 7.97288 Europe/Berlin +51.7175 9.18596 Europe/Berlin +53.33333 8.48333 Europe/Berlin +49.07787 9.06601 Europe/Berlin +51.52392 6.9285 Europe/Berlin +50.76313 6.99089 Europe/Berlin +51.12416 12.49638 Europe/Berlin +51.84382 6.85774 Europe/Berlin +50.23085 7.58992 Europe/Berlin +50.73438 7.09548 Europe/Berlin +51.6 7.76667 Europe/Berlin +48.15221 11.61585 Europe/Berlin +51.48165 7.21648 Europe/Berlin +51.83879 6.61531 Europe/Berlin +48.68212 9.01171 Europe/Berlin +48.27091 10.8339 Europe/Berlin +51.94331 9.09067 Europe/Berlin +49.23724 7.25617 Europe/Berlin +51.79025 10.95509 Europe/Berlin +51.62355 12.32396 Europe/Berlin +49.96675 7.8992 Europe/Berlin +48.94407 9.11755 Europe/Berlin +52.50906 13.5534 Europe/Berlin +52.03333 8.53333 Europe/Berlin +48.09345 9.79053 Europe/Berlin +49.34615 7.25527 Europe/Berlin +51.66801 9.37417 Europe/Berlin +51.79464 11.7401 Europe/Berlin +52.67982 13.58708 Europe/Berlin +52.52437 13.41053 Europe/Berlin +51.02496 7.65599 Europe/Berlin +51.61633 7.64451 Europe/Berlin +50.9856 7.13298 Europe/Berlin +50.95572 6.63986 Europe/Berlin +49.68369 8.61839 Europe/Berlin +50.42289 7.57924 Europe/Berlin +50.99258 6.57128 Europe/Berlin +51.75571 8.04075 Europe/Berlin +49.4 6.7 Europe/Berlin +49.94782 11.57894 Europe/Berlin +51.18035 14.43494 Europe/Berlin +51.25182 9.40747 Europe/Berlin +52.46582 13.48524 Europe/Berlin +52.85059 8.72791 Europe/Berlin +49.89873 10.90067 Europe/Berlin +48.27525 8.85464 Europe/Berlin +48.50318 8.37699 Europe/Berlin +52.20737 8.7149 Europe/Berlin +50.90964 6.18874 Europe/Berlin +53.18333 8 Europe/Berlin +51.11963 9.12475 Europe/Berlin +47.92027 9.7549 Europe/Berlin +50.17866 8.73756 Europe/Berlin +47.76111 11.5589 Europe/Berlin +50.1408 8.50449 Europe/Berlin +53.94313 10.30215 Europe/Berlin +53.91887 10.69691 Europe/Berlin +50.81342 10.2361 Europe/Berlin +52.0862 8.74434 Europe/Berlin +47.55371 7.94612 Europe/Berlin +47.72947 12.87819 Europe/Berlin +49.23848 9.1018 Europe/Berlin +51.9859 9.25246 Europe/Berlin +53.81167 10.37417 Europe/Berlin +52.20699 8.80365 Europe/Berlin +50.32174 10.20673 Europe/Berlin +50.54322 7.1113 Europe/Berlin +50.36463 8.73859 Europe/Berlin +50.55666 6.76424 Europe/Berlin +52.19551 9.46421 Europe/Berlin +49.4925 9.77361 Europe/Berlin +51.78333 8.81683 Europe/Berlin +51.10771 10.646 Europe/Berlin +49.8414 7.86713 Europe/Berlin +50.20228 10.07784 Europe/Berlin +50.64336 7.2278 Europe/Berlin +50.22683 8.61816 Europe/Berlin +50.87197 9.70891 Europe/Berlin +51.88268 10.56157 Europe/Berlin +52.31667 8.33333 Europe/Berlin +48.7606 8.23975 Europe/Berlin +49.4618 8.17236 Europe/Berlin +51.73297 9.01969 Europe/Berlin +51.05224 8.39228 Europe/Berlin +52.31814 7.16343 Europe/Berlin +47.8638 12.01055 Europe/Berlin +48.94744 9.43718 Europe/Berlin +49.96519 8.95129 Europe/Berlin +53.46919 7.48232 Europe/Berlin +48.37154 10.89851 Europe/Berlin +50.51155 12.40083 Europe/Berlin +50.59034 12.70657 Europe/Berlin +51.12645 7.90333 Europe/Berlin +51.75742 11.46084 Europe/Berlin +51.78333 7.61667 Europe/Berlin +49.97704 9.15214 Europe/Berlin +51.37982 9.01445 Europe/Berlin +50.84048 10.95198 Europe/Berlin +51.38333 8.08333 Europe/Berlin +51.02624 11.51638 Europe/Berlin +49.30481 10.5931 Europe/Berlin +50.57953 13.00627 Europe/Berlin +53.01499 13.99924 Europe/Berlin +50.43109 7.40425 Europe/Berlin +49.44287 11.86267 Europe/Berlin +49.74657 8.11513 Europe/Berlin +50.0888 9.06455 Europe/Berlin +52.41116 13.5355 Europe/Berlin +50.98763 12.43684 Europe/Berlin +51.29472 7.67336 Europe/Berlin +49.3856 11.3573 Europe/Berlin +50.75185 9.27082 Europe/Berlin +50.87672 6.16399 Europe/Berlin +50.73333 7.01667 Europe/Berlin +51.98382 9.81989 Europe/Berlin +48.21644 9.02596 Europe/Berlin +48.45755 11.13413 Europe/Berlin +53.67515 10.22593 Europe/Berlin +51.76338 7.8887 Europe/Berlin +52.07936 7.01344 Europe/Berlin +52.43548 13.54825 Europe/Berlin +53.01416 9.0263 Europe/Berlin +48.63115 8.07607 Europe/Berlin +48.83777 10.0933 Europe/Berlin +51.35806 9.47974 Europe/Berlin +49.36667 6.68333 Europe/Berlin +53.79132 9.97979 Europe/Berlin +50.77664 6.08342 Europe/Berlin +49.99472 8.58361 Europe/Berlin +49.83411 8.49621 Europe/Berlin +49.56526 9.70816 Europe/Berlin +48.65698 9.22049 Europe/Berlin +48.72704 9.24954 Europe/Berlin +50.02627 8.88588 Europe/Berlin +52.425 13.46667 Europe/Berlin +49.765 8.65194 Europe/Berlin +52.53048 13.29371 Europe/Berlin +52.52003 13.40489 Europe/Berlin +51.56971 14.37355 Europe/Berlin +48.9685 8.30704 Europe/Berlin +50.93331 6.95954 Europe/Berlin +50.93893 6.95752 Europe/Berlin +50.96983 6.92997 Europe/Berlin +48.78363 9.21032 Europe/Berlin +51.50168 7.1756 Europe/Berlin +53.557 9.964 Europe/Berlin +53.60697 9.90538 Europe/Berlin +51.47924 11.91605 Europe/Berlin +53.48462 10.22904 Europe/Berlin +52.5511 13.19921 Europe/Berlin +52.48388 13.3477 Europe/Berlin +52.49376 13.44469 Europe/Berlin +50.08309 8.62852 Europe/Berlin +51.2357 14.02576 Europe/Berlin +53.6052 10.03988 Europe/Berlin +53.60639 10.11972 Europe/Berlin +52.55191 13.16802 Europe/Berlin +52.56681 13.51255 Europe/Berlin +52.54608 13.5013 Europe/Berlin +52.52921 13.47267 Europe/Berlin +53.58935 9.984 Europe/Berlin +47.7044 12.10466 Europe/Berlin +49.45937 8.40377 Europe/Berlin +11.78528 42.88444 Africa/Djibouti +11.96306 43.29056 Africa/Djibouti +11.58901 43.14503 Africa/Djibouti +11.18333 42.93333 Africa/Djibouti +11.15583 42.7125 Africa/Djibouti +56.45319 9.40201 Europe/Copenhagen +55.70927 9.5357 Europe/Copenhagen +55.65173 12.29216 Europe/Copenhagen +55.05982 10.60677 Europe/Copenhagen +55.76828 12.19723 Europe/Copenhagen +54.90926 9.80737 Europe/Copenhagen +55.40276 11.35459 Europe/Copenhagen +56.56381 9.04024 Europe/Copenhagen +56.1697 9.54508 Europe/Copenhagen +55.64152 12.08035 Europe/Copenhagen +55.68062 12.45373 Europe/Copenhagen +55.4426 11.79011 Europe/Copenhagen +56.4607 10.03639 Europe/Copenhagen +55.39594 10.38831 Europe/Copenhagen +54.76906 11.87425 Europe/Copenhagen +55.31274 10.78964 Europe/Copenhagen +55.22992 11.76092 Europe/Copenhagen +55.87496 12.34579 Europe/Copenhagen +55.32993 11.13857 Europe/Copenhagen +55.45802 12.18214 Europe/Copenhagen +55.67594 12.56553 Europe/Copenhagen +55.4904 9.47216 Europe/Copenhagen +55.67954 11.08864 Europe/Copenhagen +55.61543 12.35182 Europe/Copenhagen +55.65719 12.47364 Europe/Copenhagen +55.86066 9.85034 Europe/Copenhagen +55.88098 12.50111 Europe/Copenhagen +56.36009 8.61607 Europe/Copenhagen +55.71354 11.7169 Europe/Copenhagen +57.46417 9.98229 Europe/Copenhagen +55.92791 12.30081 Europe/Copenhagen +56.13932 8.97378 Europe/Copenhagen +56.03606 12.6136 Europe/Copenhagen +55.25377 9.48982 Europe/Copenhagen +55.58333 12.3 Europe/Copenhagen +55.6666 12.40377 Europe/Copenhagen +57.44073 10.53661 Europe/Copenhagen +55.67938 12.53463 Europe/Copenhagen +55.56568 9.75257 Europe/Copenhagen +55.80858 12.36066 Europe/Copenhagen +55.47028 8.45187 Europe/Copenhagen +55.75367 12.59181 Europe/Copenhagen +55.84759 12.42791 Europe/Copenhagen +55.73165 12.36328 Europe/Copenhagen +56.15674 10.21076 Europe/Copenhagen +57.048 9.9187 Europe/Copenhagen +55.65691 12.36381 Europe/Copenhagen +55.04434 9.41741 Europe/Copenhagen +15.30174 -61.38808 America/Dominica +18.46667 -69.9 America/Santo_Domingo +18.48333 -69.9 America/Santo_Domingo +19.56378 -70.87582 America/Santo_Domingo +18.67297 -70.17095 America/Santo_Domingo +19.48538 -70.61104 America/Santo_Domingo +18.50012 -69.98857 America/Santo_Domingo +19.4517 -70.69703 America/Santo_Domingo +18.76559 -69.03886 America/Santo_Domingo +18.20854 -71.10077 America/Santo_Domingo +18.46156 -69.29718 America/Santo_Domingo +18.80588 -71.22991 America/Santo_Domingo +18.54661 -70.50631 America/Santo_Domingo +19.30099 -70.25259 America/Santo_Domingo +19.84826 -71.64597 America/Santo_Domingo +19.79344 -70.6884 America/Santo_Domingo +18.61501 -68.70798 America/Santo_Domingo +19.37762 -70.41762 America/Santo_Domingo +19.47793 -71.34125 America/Santo_Domingo +18.94498 -69.79331 America/Santo_Domingo +19.66667 -70.76667 America/Santo_Domingo +18.55542 -69.40814 America/Santo_Domingo +18.58182 -68.40431 America/Santo_Domingo +18.48138 -71.41965 America/Santo_Domingo +19.3832 -69.8474 America/Santo_Domingo +18.807 -69.78399 America/Santo_Domingo +19.39352 -70.52598 America/Santo_Domingo +19.55186 -71.07813 America/Santo_Domingo +18.87309 -71.51656 America/Santo_Domingo +18.42734 -68.97285 America/Santo_Domingo +19.12178 -70.64218 America/Santo_Domingo +18.76278 -69.25681 America/Santo_Domingo +19.5847 -70.98489 America/Santo_Domingo +19.54878 -71.70829 America/Santo_Domingo +19.05272 -70.14939 America/Santo_Domingo +18.90919 -70.74499 America/Santo_Domingo +19.22207 -70.52956 America/Santo_Domingo +18.46667 -69.9 America/Santo_Domingo +18.93687 -70.40923 America/Santo_Domingo +18.45174 -69.60914 America/Santo_Domingo +18.41667 -70.1 America/Santo_Domingo +18.45 -69.93333 America/Santo_Domingo +18.75639 -69.63616 America/Santo_Domingo +18.27964 -70.33184 America/Santo_Domingo +18.41538 -70.03317 America/Santo_Domingo +18.45319 -70.7349 America/Santo_Domingo +18.5 -70 America/Santo_Domingo +36.76639 3.47717 Africa/Algiers +34.68284 6.51109 Africa/Algiers +36.71169 2.84244 Africa/Algiers +35.72251 0.75509 Africa/Algiers +33.10527 6.05796 Africa/Algiers +34.72224 5.37845 Africa/Algiers +34.87833 -1.315 Africa/Algiers +36.67176 4.19176 Africa/Algiers +36.71182 4.04591 Africa/Algiers +36.54569 4.05712 Africa/Algiers +36.58839 3.77445 Africa/Algiers +35.60722 1.81081 Africa/Algiers +36.65393 3.98143 Africa/Algiers +36.58972 2.4475 Africa/Algiers +27.67111 -8.14744 Africa/Algiers +36.8 4.26667 Africa/Algiers +29.26388 0.23098 Africa/Algiers +36.65 4.77361 Africa/Algiers +35.37103 1.31699 Africa/Algiers +35.87111 2.02806 Africa/Algiers +36.72544 3.55665 Africa/Algiers +36.11653 6.35434 Africa/Algiers +35.40417 8.12417 Africa/Algiers +33.11667 6.08333 Africa/Algiers +35.48171 6.26074 Africa/Algiers +22.785 5.52278 Africa/Algiers +36.83763 6.64018 Africa/Algiers +36.74413 3.90045 Africa/Algiers +36.14766 3.69123 Africa/Algiers +36.51833 2.90528 Africa/Algiers +36.28639 7.95111 Africa/Algiers +35.18568 1.49612 Africa/Algiers +36.87617 6.90921 Africa/Algiers +35.52832 -0.19369 Africa/Algiers +34.74512 5.89833 Africa/Algiers +36.60637 3.08783 Africa/Algiers +36.52056 6.26111 Africa/Algiers +34.387 4.98785 Africa/Algiers +35.65903 -0.52168 Africa/Algiers +35.18994 -0.63085 Africa/Algiers +33.49885 6.00803 Africa/Algiers +36.46472 1.30258 Africa/Algiers +35.88548 3.77236 Africa/Algiers +35.06937 -1.13706 Africa/Algiers +35.23464 -0.24435 Africa/Algiers +36.19112 5.41373 Africa/Algiers +36.12868 7.53376 Africa/Algiers +36.54722 4.68611 Africa/Algiers +34.63703 -1.33143 Africa/Algiers +36.70456 3.02462 Africa/Algiers +35.8545 5.29053 Africa/Algiers +34.83034 0.15171 Africa/Algiers +31.92427 5.35018 Africa/Algiers +36.73829 3.28079 Africa/Algiers +36.45774 6.04267 Africa/Algiers +33.27966 6.90984 Africa/Algiers +35.06196 -1.43362 Africa/Algiers +35.73734 0.55599 Africa/Algiers +33.56391 6.70326 Africa/Algiers +36.73587 3.34018 Africa/Algiers +26.71576 0.1714 Africa/Algiers +35.9441 5.03107 Africa/Algiers +35.67384 5.6453 Africa/Algiers +35.87541 7.11353 Africa/Algiers +34.90472 -1.03394 Africa/Algiers +36.10124 1.19949 Africa/Algiers +35.96124 0.91896 Africa/Algiers +36.18503 1.53299 Africa/Algiers +36.55528 2.79028 Africa/Algiers +35.45595 0.68778 Africa/Algiers +31.94932 5.32502 Africa/Algiers +35.69111 -0.64167 Africa/Algiers +35.01361 -1.74799 Africa/Algiers +36.74625 3.83163 Africa/Algiers +35.70583 4.54194 Africa/Algiers +36.46695 2.68991 Africa/Algiers +35.93115 0.08918 Africa/Algiers +36.45028 6.26444 Africa/Algiers +32.26667 3.63333 Africa/Algiers +34.15429 3.50309 Africa/Algiers +35.63058 7.66606 Africa/Algiers +35.7279 -0.7081 Africa/Algiers +35.63106 5.91186 Africa/Algiers +35.97999 4.18665 Africa/Algiers +36.68178 4.26378 Africa/Algiers +35.43058 1.75714 Africa/Algiers +33.19195 6.08695 Africa/Algiers +36.6204 3.22248 Africa/Algiers +36.26417 2.75393 Africa/Algiers +36.12232 0.89865 Africa/Algiers +35.39664 0.14027 Africa/Algiers +36.08725 4.45192 Africa/Algiers +34.86158 -1.33935 Africa/Algiers +36.78567 4.06273 Africa/Algiers +36.63112 4.19864 Africa/Algiers +36.56471 3.15434 Africa/Algiers +36.56463 3.5933 Africa/Algiers +33.8 2.86514 Africa/Algiers +35.88889 2.74905 Africa/Algiers +35.21222 2.31889 Africa/Algiers +36.63888 2.76845 Africa/Algiers +35.43583 7.14333 Africa/Algiers +36.26104 2.22015 Africa/Algiers +36.64997 3.3308 Africa/Algiers +36.92917 6.58556 Africa/Algiers +36.82055 5.76671 Africa/Algiers +35.92989 0.82871 Africa/Algiers +36.71859 3.66924 Africa/Algiers +27.19351 2.46069 Africa/Algiers +36.46295 4.50532 Africa/Algiers +34.95139 -1.36806 Africa/Algiers +36.50361 7.44278 Africa/Algiers +31.68041 6.07286 Africa/Algiers +35.44862 7.95184 Africa/Algiers +35.37889 -0.96778 Africa/Algiers +36.41205 6.59603 Africa/Algiers +36.51257 2.41382 Africa/Algiers +36.46214 7.42608 Africa/Algiers +32.49094 3.67347 Africa/Algiers +35.06544 1.04945 Africa/Algiers +36.75234 4.3155 Africa/Algiers +36.5604 4.85454 Africa/Algiers +35.64779 -0.62397 Africa/Algiers +36.7672 8.31377 Africa/Algiers +33.35608 6.86319 Africa/Algiers +35.39138 -1.09238 Africa/Algiers +36.67942 4.8555 Africa/Algiers +36.26333 6.69361 Africa/Algiers +36.89556 8.44333 Africa/Algiers +34.44542 2.52749 Africa/Algiers +32.61336 5.51259 Africa/Algiers +36.80377 7.73684 Africa/Algiers +36.15281 5.69016 Africa/Algiers +33.68318 1.01927 Africa/Algiers +36.22393 1.67187 Africa/Algiers +36.16525 1.33452 Africa/Algiers +35.86691 7.88672 Africa/Algiers +35.52439 -1.01577 Africa/Algiers +36.4701 2.62528 Africa/Algiers +36.06386 4.62744 Africa/Algiers +32.893 0.54839 Africa/Algiers +36.26951 1.68609 Africa/Algiers +36.19591 1.25538 Africa/Algiers +36.68482 7.75111 Africa/Algiers +36.53628 3.8334 Africa/Algiers +36.73436 3.96223 Africa/Algiers +36.67 2.94444 Africa/Algiers +34.67279 3.263 Africa/Algiers +33.53388 5.99306 Africa/Algiers +36.4525 6.63639 Africa/Algiers +36.91716 3.91311 Africa/Algiers +33.51667 6.95 Africa/Algiers +36.71333 3.2125 Africa/Algiers +34.89638 3.48543 Africa/Algiers +36.365 6.61472 Africa/Algiers +36.36505 4.32636 Africa/Algiers +36.46293 2.73873 Africa/Algiers +34.92129 -1.29512 Africa/Algiers +35.27306 7.75194 Africa/Algiers +36.76775 2.95924 Africa/Algiers +36.6 4.61667 Africa/Algiers +36.16286 6.16651 Africa/Algiers +36.57722 3.00917 Africa/Algiers +34.62098 2.79503 Africa/Algiers +36.63709 3.69474 Africa/Algiers +33.09892 1.26082 Africa/Algiers +35.57272 -0.8996 Africa/Algiers +36.45833 7.51389 Africa/Algiers +36.06629 1.12602 Africa/Algiers +36.64262 2.69007 Africa/Algiers +36.37489 3.902 Africa/Algiers +36.53167 2.99194 Africa/Algiers +35.31473 -0.05037 Africa/Algiers +36.54178 3.081 Africa/Algiers +36.33293 5.08843 Africa/Algiers +36.57412 2.91214 Africa/Algiers +36.72735 3.40995 Africa/Algiers +36.80218 4.15187 Africa/Algiers +36.46298 2.81464 Africa/Algiers +36.27462 4.85668 Africa/Algiers +35.90111 4.89806 Africa/Algiers +36.74871 3.19248 Africa/Algiers +36.07322 4.76108 Africa/Algiers +36.54222 3.95306 Africa/Algiers +36.47004 2.8277 Africa/Algiers +34.85038 5.72805 Africa/Algiers +36.71499 3.05002 Africa/Algiers +35.635 3.225 Africa/Algiers +35.72 -0.545 Africa/Algiers +34.74488 8.06024 Africa/Algiers +36.70222 7.84722 Africa/Algiers +36.13516 2.91085 Africa/Algiers +32.82648 3.7669 Africa/Algiers +36.83528 7.45333 Africa/Algiers +35.07465 -1.22431 Africa/Algiers +36.76967 7.9064 Africa/Algiers +35.30099 -1.38226 Africa/Algiers +34.87045 -1.42319 Africa/Algiers +36.52389 2.86131 Africa/Algiers +36.61954 4.08282 Africa/Algiers +36.66774 3.59115 Africa/Algiers +36.75587 5.08433 Africa/Algiers +31.61667 -2.21667 Africa/Algiers +35.55597 6.17414 Africa/Algiers +35.38901 5.36584 Africa/Algiers +36.56667 4.96667 Africa/Algiers +36.66655 3.09606 Africa/Algiers +36.72615 3.18291 Africa/Algiers +36.73944 7.10528 Africa/Algiers +36.74472 4.37222 Africa/Algiers +35.25881 6.34706 Africa/Algiers +36.79361 4.31158 Africa/Algiers +36.63773 3.37127 Africa/Algiers +26.96667 1.08333 Africa/Algiers +36.9 7.76667 Africa/Algiers +35.86781 1.11143 Africa/Algiers +36.64022 4.90131 Africa/Algiers +36.7525 3.04197 Africa/Algiers +36.4575 4.53494 Africa/Algiers +35.37675 5.90001 Africa/Algiers +35.29749 -1.14037 Africa/Algiers +36.79333 3.28694 Africa/Algiers +36.2674 6.50135 Africa/Algiers +32.75 -0.58333 Africa/Algiers +35.45139 2.90583 Africa/Algiers +36.16277 0.97037 Africa/Algiers +35.92472 6.69528 Africa/Algiers +35.97108 6.87374 Africa/Algiers +35.74381 -0.7693 Africa/Algiers +34.84146 4.16383 Africa/Algiers +36.56471 4.30619 Africa/Algiers +35.67003 3.88153 Africa/Algiers +35.80389 -0.30178 Africa/Algiers +35.36395 -0.51278 Africa/Algiers +34.3438 3.22475 Africa/Algiers +34.84218 1.54698 Africa/Algiers +36.26406 1.9679 Africa/Algiers +36.29333 3.67319 Africa/Algiers +36.80277 2.92185 Africa/Algiers +35.79639 7.39278 Africa/Algiers +36.18683 5.31347 Africa/Algiers +36.23194 6.94333 Africa/Algiers +34.1128 2.10228 Africa/Algiers +27.87429 -0.29388 Africa/Algiers +36.41657 1.19616 Africa/Algiers +36.48994 5.5393 Africa/Algiers +-4.06685 -78.95488 America/Guayaquil +-2.0968 -79.69485 America/Guayaquil +-1.55611 -79.75191 America/Guayaquil +-1.44158 -79.45943 America/Guayaquil +-1.04376 -79.63837 America/Guayaquil +0.81187 -77.71727 America/Guayaquil +-0.9938 -77.81286 America/Guayaquil +-1.27974 -80.41885 America/Guayaquil +-0.25305 -79.17536 America/Guayaquil +-3.44882 -79.95952 America/Guayaquil +-2.22622 -80.85872 America/Guayaquil +1.28626 -78.83514 America/Guayaquil +0.59318 -77.83078 America/Guayaquil +-1.96276 -79.72402 America/Guayaquil +-2.21452 -80.95151 America/Guayaquil +0.32721 -79.43438 America/Guayaquil +-1.67098 -78.64712 America/Guayaquil +-0.22985 -78.52495 America/Guayaquil +-1.02863 -79.46352 America/Guayaquil +-1.48369 -78.00257 America/Guayaquil +-0.95759 -78.69636 America/Guayaquil +-0.46645 -76.98719 America/Guayaquil +-1.05458 -80.45445 America/Guayaquil +-2.63199 -80.38808 America/Guayaquil +-3.68107 -79.68083 America/Guayaquil +-1.3299 -78.5434 America/Guayaquil +-1.81563 -80.23308 America/Guayaquil +-3.32561 -79.80697 America/Guayaquil +0.23141 -78.25978 America/Guayaquil +-2.16671 -79.4654 America/Guayaquil +-2.67364 -79.6183 America/Guayaquil +-1.04576 -80.65889 America/Guayaquil +-1.79008 -79.28759 America/Guayaquil +-0.96212 -80.71271 America/Guayaquil +-3.25861 -79.96054 America/Guayaquil +-0.51011 -78.56712 America/Guayaquil +-2.30868 -78.11135 America/Guayaquil +-3.99313 -79.20422 America/Guayaquil +-2.42355 -79.33977 America/Guayaquil +-0.93521 -78.61554 America/Guayaquil +-0.94094 -79.22506 America/Guayaquil +-2.233 -80.91039 America/Guayaquil +0.09057 -76.88837 America/Guayaquil +-1.34872 -80.57875 America/Guayaquil +0.35171 -78.12233 America/Guayaquil +-3.47523 -80.23084 America/Guayaquil +-2.20584 -79.90795 America/Guayaquil +-1.59263 -79.00098 America/Guayaquil +-2.89264 -78.77814 America/Guayaquil +0.9592 -79.65397 America/Guayaquil +-1.93333 -79.96667 America/Guayaquil +-2.17579 -79.85519 America/Guayaquil +-2.90054 -79.00453 America/Guayaquil +-0.69819 -80.09361 America/Guayaquil +0.04084 -78.14524 America/Guayaquil +-3.98652 -79.35912 America/Guayaquil +-4.32796 -79.55554 America/Guayaquil +-0.84582 -80.16389 America/Guayaquil +-0.69832 -77.14083 America/Guayaquil +-1.36501 -79.90494 America/Guayaquil +-0.59792 -80.42367 America/Guayaquil +-1.80217 -79.53443 America/Guayaquil +-2.73969 -78.8486 America/Guayaquil +0.33247 -78.21371 America/Guayaquil +-1.24908 -78.61675 America/Guayaquil +58.36389 25.59 Europe/Tallinn +58.38062 26.72509 Europe/Tallinn +59.43696 24.75353 Europe/Tallinn +59.39697 27.76331 Europe/Tallinn +59.34639 26.35583 Europe/Tallinn +58.38588 24.49711 Europe/Tallinn +59.37722 28.19028 Europe/Tallinn +59.47667 25.025 Europe/Tallinn +59.39861 27.27306 Europe/Tallinn +30.7142 31.24425 Africa/Cairo +30.35394 31.20071 Africa/Cairo +30.78847 31.00192 Africa/Cairo +29.47639 30.96119 Africa/Cairo +31.0539 31.37787 Africa/Cairo +30.68025 30.94292 Africa/Cairo +26.7693 31.50214 Africa/Cairo +28.91667 30.85 Africa/Cairo +26.55695 31.69478 Africa/Cairo +31.27105 30.78665 Africa/Cairo +31.19688 31.5243 Africa/Cairo +30.31269 31.32018 Africa/Cairo +30.55258 31.00904 Africa/Cairo +30.9616 31.24069 Africa/Cairo +28.31214 30.71007 Africa/Cairo +31.40444 30.41639 Africa/Cairo +30.56482 31.15777 Africa/Cairo +30.97225 30.95614 Africa/Cairo +25.91407 32.76362 Africa/Cairo +26.16418 32.72671 Africa/Cairo +30.17922 31.2056 Africa/Cairo +26.04949 32.24142 Africa/Cairo +31.12624 31.64313 Africa/Cairo +30.46579 30.93164 Africa/Cairo +28.41899 30.77924 Africa/Cairo +30.36056 31.3776 Africa/Cairo +31.3529 27.23725 Africa/Cairo +27.3104 30.97004 Africa/Cairo +27.7314 30.84165 Africa/Cairo +29.81667 31.05 Africa/Cairo +24.47669 32.94626 Africa/Cairo +30.76096 30.69733 Africa/Cairo +30.79336 31.62575 Africa/Cairo +30.8248 30.81805 Africa/Cairo +31.1143 30.94012 Africa/Cairo +31.13385 30.12843 Africa/Cairo +26.67319 31.4976 Africa/Cairo +26.33826 31.89161 Africa/Cairo +31.5084 31.84106 Africa/Cairo +29.2376 30.78944 Africa/Cairo +25.29336 32.55402 Africa/Cairo +31.30782 30.29901 Africa/Cairo +29.35804 30.68142 Africa/Cairo +29.84144 31.30084 Africa/Cairo +30.6713 31.58801 Africa/Cairo +30.9128 30.29018 Africa/Cairo +31.20291 30.55018 Africa/Cairo +26.05494 32.16329 Africa/Cairo +31.32977 31.71507 Africa/Cairo +30.73006 31.80182 Africa/Cairo +31.41648 31.81332 Africa/Cairo +30.75438 31.44016 Africa/Cairo +31.13305 30.64649 Africa/Cairo +26.12467 32.47598 Africa/Cairo +31.08898 31.59478 Africa/Cairo +27.55602 30.80764 Africa/Cairo +27.64176 30.84662 Africa/Cairo +31.03408 30.46823 Africa/Cairo +29.14816 31.12733 Africa/Cairo +31.25654 32.28412 Africa/Cairo +26.72918 33.93651 Africa/Cairo +31.21452 31.35798 Africa/Cairo +30.42039 31.56223 Africa/Cairo +30.93976 30.81338 Africa/Cairo +29.07441 31.09785 Africa/Cairo +28.5036 30.8004 Africa/Cairo +30.45906 31.17858 Africa/Cairo +30.58768 31.502 Africa/Cairo +30.12303 31.13571 Africa/Cairo +30.54448 31.78525 Africa/Cairo +27.18096 31.18368 Africa/Cairo +24.09082 32.89942 Africa/Cairo +29.97371 32.52627 Africa/Cairo +29.56472 31.28111 Africa/Cairo +30.59618 30.89875 Africa/Cairo +30.29857 30.97635 Africa/Cairo +29.33778 31.20556 Africa/Cairo +25.69893 32.6421 Africa/Cairo +27.4402 30.81841 Africa/Cairo +26.10426 34.27793 Africa/Cairo +30.61618 31.73514 Africa/Cairo +30.6188 31.46099 Africa/Cairo +30.19327 31.13703 Africa/Cairo +30.06263 31.24967 Africa/Cairo +28.10988 30.7503 Africa/Cairo +31.18287 32.03108 Africa/Cairo +31.15815 31.937 Africa/Cairo +31.03637 31.38069 Africa/Cairo +26.47686 31.8035 Africa/Cairo +30.9745 31.16499 Africa/Cairo +25.4514 30.54635 Africa/Cairo +30.21035 31.36812 Africa/Cairo +30.00808 31.21093 Africa/Cairo +31.18086 31.86518 Africa/Cairo +30.60427 32.27225 Africa/Cairo +31.21564 29.95527 Africa/Cairo +30.71877 31.56299 Africa/Cairo +29.9 31.25 Africa/Cairo +31.31146 31.14766 Africa/Cairo +27.25738 33.81291 Africa/Cairo +29.30995 30.8418 Africa/Cairo +28.82431 30.89948 Africa/Cairo +28.34919 28.86591 Africa/Cairo +26.23568 32.00347 Africa/Cairo +30.43026 31.03681 Africa/Cairo +26.99257 31.41554 Africa/Cairo +29.61972 31.2575 Africa/Cairo +31.13159 33.79844 Africa/Cairo +26.56217 31.74503 Africa/Cairo +30.94162 31.29039 Africa/Cairo +30.82791 30.53633 Africa/Cairo +27.04411 31.31897 Africa/Cairo +27.9312 30.83841 Africa/Cairo +30.72508 31.67148 Africa/Cairo +30.91018 30.17438 Africa/Cairo +27.2696 31.15105 Africa/Cairo +24.98028 32.87472 Africa/Cairo +31.20864 31.63528 Africa/Cairo +29.60018 32.31671 Africa/Cairo +26.73841 -11.67194 Africa/El_Aaiun +27.16224 -13.20315 Africa/El_Aaiun +23.68477 -15.95798 Africa/El_Aaiun +15.60811 39.47455 Africa/Asmara +15.77792 38.45107 Africa/Asmara +15.10582 37.59067 Africa/Asmara +15.33805 38.93184 Africa/Asmara +13.00917 42.73944 Africa/Asmara +14.88722 38.81528 Africa/Asmara +37.11906 -3.584 Europe/Madrid +38.41667 -6.41667 Europe/Madrid +38.61365 -1.11468 Europe/Madrid +38.6373 -0.86568 Europe/Madrid +39.26992 -2.60118 Europe/Madrid +39.93333 -0.1 Europe/Madrid +38.97655 -5.7974 Europe/Madrid +38.50754 -0.23346 Europe/Madrid +36.83155 -2.64273 Europe/Madrid +36.77262 -4.10045 Europe/Madrid +39.46975 -0.37739 Europe/Madrid +38.76211 -3.38483 Europe/Madrid +37.18516 -5.78093 Europe/Madrid +36.67778 -5.446 Europe/Madrid +38.01328 -3.3705 Europe/Madrid +37.7688 -1.50229 Europe/Madrid +36.75793 -3.95233 Europe/Madrid +37.97872 -0.68222 Europe/Madrid +37.74293 -0.95396 Europe/Madrid +39.43705 -0.46546 Europe/Madrid +36.62035 -4.49976 Europe/Madrid +39.15218 -3.02431 Europe/Madrid +37.37281 -6.04589 Europe/Madrid +39.8581 -4.02263 Europe/Madrid +28.96108 -13.64502 Atlantic/Canary +27.99242 -15.41915 Atlantic/Canary +29.06049 -13.56398 Atlantic/Canary +36.01393 -5.60695 Europe/Madrid +39.96348 -4.83076 Europe/Madrid +28.47688 -16.41016 Atlantic/Canary +39.06667 -0.26667 Europe/Madrid +39.2026 -0.31114 Europe/Madrid +39.36667 -0.41667 Europe/Madrid +37.38283 -5.97317 Europe/Madrid +38.3964 -0.5255 Europe/Madrid +38.06147 -1.04877 Europe/Madrid +38.19165 -0.5658 Europe/Madrid +27.91174 -15.54071 Atlantic/Canary +38.98457 1.53409 Europe/Madrid +28.46824 -16.25462 Atlantic/Canary +28.68351 -17.76421 Atlantic/Canary +28.03197 -15.50425 Atlantic/Canary +36.21067 -5.38415 Europe/Madrid +37.83568 -0.79102 Europe/Madrid +28.09826 -16.61708 Atlantic/Canary +36.77808 -6.3515 Europe/Madrid +37.35812 -6.03731 Europe/Madrid +38.40148 -0.43623 Europe/Madrid +38.91667 1.28333 Europe/Madrid +37.80626 -0.83736 Europe/Madrid +28.07617 -16.558 Atlantic/Canary +36.4759 -6.19817 Europe/Madrid +28.4853 -16.32014 Atlantic/Canary +27.92481 -15.57329 Atlantic/Canary +29.00093 -13.613 Atlantic/Canary +38.98068 1.30362 Europe/Madrid +39.68333 -0.26667 Europe/Madrid +36.62545 -6.3622 Europe/Madrid +36.76419 -2.61475 Europe/Madrid +36.74231 -5.16709 Europe/Madrid +38.08799 -0.72544 Europe/Madrid +36.71715 -4.27583 Europe/Madrid +39.55 -0.56667 Europe/Madrid +39.48834 -1.10044 Europe/Madrid +28.37645 -16.58575 Atlantic/Canary +39.61667 -0.3 Europe/Madrid +36.52819 -6.19011 Europe/Madrid +38.68712 -4.10734 Europe/Madrid +28.50038 -13.86272 Atlantic/Canary +28.41397 -16.54867 Atlantic/Canary +37.38943 -4.76686 Europe/Madrid +39.6 -0.55 Europe/Madrid +37.43807 -4.19523 Europe/Madrid +38.37906 -4.84827 Europe/Madrid +39.87678 3.01626 Europe/Madrid +37.86591 -0.79256 Europe/Madrid +39.36667 -0.45 Europe/Madrid +39.5 -0.43333 Europe/Madrid +39.56939 2.65024 Europe/Madrid +37.70024 -5.28121 Europe/Madrid +28.35039 -14.1076 Atlantic/Canary +39.43333 -0.41667 Europe/Madrid +37.23765 -5.10746 Europe/Madrid +38.08483 -0.94401 Europe/Madrid +38.81667 -0.61667 Europe/Madrid +39.96667 -0.25 Europe/Madrid +38.91971 -0.11935 Europe/Madrid +38.38479 -0.76773 Europe/Madrid +36.96655 -2.20595 Europe/Madrid +36.75278 -3.8744 Europe/Madrid +39.89158 -5.54064 Europe/Madrid +37.98704 -1.13004 Europe/Madrid +38.04094 -1.49014 Europe/Madrid +38.4158 -0.44529 Europe/Madrid +36.75066 -3.5179 Europe/Madrid +37.12084 -5.45403 Europe/Madrid +37.58627 -4.63805 Europe/Madrid +38.90839 -6.61785 Europe/Madrid +39.54555 -0.39551 Europe/Madrid +38.05456 -1.20763 Europe/Madrid +37.27559 -6.83851 Europe/Madrid +27.88385 -15.72538 Atlantic/Canary +39.47523 -0.41825 Europe/Madrid +36.59575 -4.63728 Europe/Madrid +38.91611 -6.34366 Europe/Madrid +35.29369 -2.93833 Africa/Ceuta +37.5992 -1.31493 Europe/Madrid +27.76056 -15.58602 Atlantic/Canary +39.56667 -0.33333 Europe/Madrid +37.72107 -3.97264 Europe/Madrid +39.64208 2.75388 Europe/Madrid +37.329 -5.41682 Europe/Madrid +36.51543 -4.88583 Europe/Madrid +37.20764 -3.63493 Europe/Madrid +38.99915 -3.36991 Europe/Madrid +39.49139 -0.46349 Europe/Madrid +39.56964 3.20955 Europe/Madrid +36.72016 -4.42034 Europe/Madrid +37.34461 -6.06391 Europe/Madrid +37.37301 -5.74952 Europe/Madrid +39.88853 4.26583 Europe/Madrid +37.40881 -4.48522 Europe/Madrid +37.16181 -5.92433 Europe/Madrid +28.65851 -17.91821 Atlantic/Canary +36.18482 -5.49213 Europe/Madrid +37.74425 -0.85041 Europe/Madrid +37.67119 -1.7017 Europe/Madrid +37.65896 -5.52751 Europe/Madrid +37.16887 -4.15129 Europe/Madrid +39.49093 2.89108 Europe/Madrid +39.63333 -0.6 Europe/Madrid +38.09519 -3.63602 Europe/Madrid +37.25482 -7.20433 Europe/Madrid +36.92077 -6.07529 Europe/Madrid +37.61915 -0.87799 Europe/Madrid +38.02822 -1.24188 Europe/Madrid +28.09973 -15.41343 Atlantic/Canary +38.94422 -3.2381 Europe/Madrid +36.9838 -5.93933 Europe/Madrid +39.21667 -2.15 Europe/Madrid +37.48613 -5.98091 Europe/Madrid +28.39076 -16.52309 Atlantic/Canary +28.61052 -13.92912 Atlantic/Canary +38.61372 -0.1269 Europe/Madrid +36.16809 -5.34777 Europe/Madrid +39.56667 -0.53333 Europe/Madrid +38.27559 -3.61534 Europe/Madrid +38.47917 -1.325 Europe/Madrid +36.68645 -6.13606 Europe/Madrid +38.78333 0.16667 Europe/Madrid +38.98333 -0.51667 Europe/Madrid +37.76922 -3.79028 Europe/Madrid +37.2 -7.31667 Europe/Madrid +27.92086 -15.4406 Atlantic/Canary +39.7211 2.91093 Europe/Madrid +28.37241 -16.71188 Atlantic/Canary +38.90883 1.43296 Europe/Madrid +38.62533 -0.57225 Europe/Madrid +37.38897 -1.94536 Europe/Madrid +37.26638 -6.94004 Europe/Madrid +38.5106 -1.70096 Europe/Madrid +28.3039 -16.43254 Atlantic/Canary +28.21154 -16.77947 Atlantic/Canary +38.09031 -0.65556 Europe/Madrid +37.29932 -3.13922 Europe/Madrid +28.11882 -16.57599 Atlantic/Canary +37.18817 -3.60667 Europe/Madrid +38.96667 -0.18333 Europe/Madrid +28.14701 -15.6502 Atlantic/Canary +36.53998 -4.62473 Europe/Madrid +39.4696 3.14831 Europe/Madrid +36.42764 -5.14589 Europe/Madrid +37.39106 -5.71993 Europe/Madrid +36.59389 -6.23298 Europe/Madrid +36.77629 -2.81456 Europe/Madrid +38.47783 -0.79157 Europe/Madrid +38.26218 -0.70107 Europe/Madrid +37.26273 -5.5453 Europe/Madrid +37.5422 -5.0826 Europe/Madrid +37.28287 -5.92088 Europe/Madrid +38.95627 -5.86162 Europe/Madrid +38.84078 0.10574 Europe/Madrid +39.07004 -3.61498 Europe/Madrid +39.16667 -0.25 Europe/Madrid +39.48139 -0.43937 Europe/Madrid +38.24994 -0.80975 Europe/Madrid +37.28766 -6.0541 Europe/Madrid +37.89155 -4.77275 Europe/Madrid +36.27719 -6.0885 Europe/Madrid +36.65947 -4.75639 Europe/Madrid +38.98626 -3.92907 Europe/Madrid +38.23998 -1.41987 Europe/Madrid +39.46588 -0.42589 Europe/Madrid +36.73663 -6.43703 Europe/Madrid +36.41915 -6.14941 Europe/Madrid +38.09242 -1.7985 Europe/Madrid +39.4 -0.4 Europe/Madrid +37.38594 -6.05258 Europe/Madrid +39.98333 -0.03333 Europe/Madrid +37.28114 -7.15071 Europe/Madrid +36.71068 -4.63297 Europe/Madrid +37.60512 -0.98623 Europe/Madrid +37.47125 -5.64608 Europe/Madrid +39.23333 -0.51667 Europe/Madrid +39.13333 -0.45 Europe/Madrid +38.10558 -1.86342 Europe/Madrid +28.3548 -16.37268 Atlantic/Canary +39.40463 -3.12492 Europe/Madrid +38.21896 -2.9807 Europe/Madrid +38.42885 -0.39774 Europe/Madrid +37.40202 -6.03314 Europe/Madrid +39.5657 2.50621 Europe/Madrid +38.6447 0.0445 Europe/Madrid +38.12497 -0.87822 Europe/Madrid +36.52978 -6.29465 Europe/Madrid +39.47649 -6.37224 Europe/Madrid +37.47249 -4.44206 Europe/Madrid +39.88901 -0.08499 Europe/Madrid +39.51667 -0.41667 Europe/Madrid +37.37358 -6.07232 Europe/Madrid +39.58333 -0.45 Europe/Madrid +36.84693 -2.94966 Europe/Madrid +38.53816 -0.13098 Europe/Madrid +39.41667 -0.4 Europe/Madrid +36.59548 -4.56937 Europe/Madrid +37.49073 -2.77259 Europe/Madrid +36.19237 -5.92186 Europe/Madrid +38.09639 -3.77786 Europe/Madrid +37.99384 -3.47103 Europe/Madrid +37.6167 -4.32245 Europe/Madrid +38.87789 -6.97061 Europe/Madrid +37.20994 -7.40266 Europe/Madrid +37.22479 -3.68686 Europe/Madrid +38.34511 -0.76722 Europe/Madrid +28.11983 -15.52325 Atlantic/Canary +28.96302 -13.54769 Atlantic/Canary +28.09962 -16.68102 Atlantic/Canary +37.14102 -3.61854 Europe/Madrid +36.75075 -5.81056 Europe/Madrid +38.11631 -1.30043 Europe/Madrid +37.01938 -4.56123 Europe/Madrid +38.03922 -4.05078 Europe/Madrid +38.59885 -0.05139 Europe/Madrid +36.73393 -3.69072 Europe/Madrid +38.10879 -0.79197 Europe/Madrid +37.2647 -6.51667 Europe/Madrid +36.83814 -2.45974 Europe/Madrid +38.68316 -6.40747 Europe/Madrid +39.95 -0.05 Europe/Madrid +38.86917 -1.09713 Europe/Madrid +37.2699 -7.02312 Europe/Madrid +38.34517 -0.48149 Europe/Madrid +36.643 -4.68728 Europe/Madrid +36.66401 -4.56139 Europe/Madrid +37.85103 -1.42507 Europe/Madrid +39.18333 -0.43333 Europe/Madrid +36.13326 -5.45051 Europe/Madrid +39.41667 -0.38333 Europe/Madrid +39.46569 -0.46005 Europe/Madrid +39.85316 3.12138 Europe/Madrid +38.70545 -0.47432 Europe/Madrid +39.15 -0.43333 Europe/Madrid +39.39011 -3.20827 Europe/Madrid +37.96939 -1.21714 Europe/Madrid +37.4614 -3.92301 Europe/Madrid +37.33791 -5.83951 Europe/Madrid +39.5 -0.35 Europe/Madrid +37.23088 -3.6551 Europe/Madrid +39.4 -0.41667 Europe/Madrid +38.99424 -1.85643 Europe/Madrid +39.45568 -0.461 Europe/Madrid +27.90539 -15.44609 Atlantic/Canary +37.4063 -1.58289 Europe/Madrid +36.74961 -3.02055 Europe/Madrid +28.12271 -16.726 Atlantic/Canary +39.64167 -0.23889 Europe/Madrid +43.28444 -2.16992 Europe/Madrid +41.65606 -0.87734 Europe/Madrid +41.50633 -5.74456 Europe/Madrid +43.66228 -7.59344 Europe/Madrid +42.84998 -2.67268 Europe/Madrid +40.47033 0.47559 Europe/Madrid +40.35692 -3.90011 Europe/Madrid +40.35 -3.7 Europe/Madrid +42.64685 -5.55835 Europe/Madrid +41.22392 1.72511 Europe/Madrid +40.48333 -3.96667 Europe/Madrid +40.4469 -4.00428 Europe/Madrid +43.3 -7.68333 Europe/Madrid +42.59631 -8.76426 Europe/Madrid +41.35 1.7 Europe/Madrid +41.11667 1.15 Europe/Madrid +42.06174 2.25528 Europe/Madrid +41.31405 2.01427 Europe/Madrid +42.23282 -8.72264 Europe/Madrid +41.93012 2.25486 Europe/Madrid +40.4 -3.6 Europe/Madrid +41.21667 1.53333 Europe/Madrid +41.28612 1.24993 Europe/Madrid +41.65518 -4.72372 Europe/Madrid +40.19081 -3.67887 Europe/Madrid +40.32605 -3.51088 Europe/Madrid +41.71394 -0.99487 Europe/Madrid +42.04713 -8.64435 Europe/Madrid +42.06166 -1.60452 Europe/Madrid +40.81249 0.5216 Europe/Madrid +40.57654 -3.92658 Europe/Madrid +43.34944 -4.04785 Europe/Madrid +40.45535 -3.46973 Europe/Madrid +41.14505 1.39861 Europe/Madrid +41.69914 2.71888 Europe/Madrid +43.13484 -2.07801 Europe/Madrid +40.46667 -3.71667 Europe/Madrid +40.3456 -1.10646 Europe/Madrid +42.75 -8.5 Europe/Madrid +41.64704 1.13957 Europe/Madrid +41.56667 2.01667 Europe/Madrid +41.11667 1.25 Europe/Madrid +40.00851 -3.00731 Europe/Madrid +41.76401 -2.46883 Europe/Madrid +41.23506 1.81193 Europe/Madrid +43.30975 -3.00716 Europe/Madrid +40.10473 -3.69793 Europe/Madrid +40.94808 -4.11839 Europe/Madrid +41.49109 2.14079 Europe/Madrid +41.39317 2.00689 Europe/Madrid +43.29564 -2.99729 Europe/Madrid +43.32842 -3.03248 Europe/Madrid +41.38602 2.07573 Europe/Madrid +42.88052 -8.54569 Europe/Madrid +41.53333 2.18333 Europe/Madrid +43.46472 -3.80444 Europe/Madrid +41.5159 2.12457 Europe/Madrid +41.45152 2.2081 Europe/Madrid +40.54433 -3.61588 Europe/Madrid +43.31283 -1.97499 Europe/Madrid +41.53333 2.08333 Europe/Madrid +41.26667 1.76667 Europe/Madrid +40.20735 -3.57063 Europe/Madrid +40.59144 -4.14738 Europe/Madrid +41.50961 2.39365 Europe/Madrid +41.36667 2.06667 Europe/Madrid +42.39996 -8.80698 Europe/Madrid +40.42386 -3.53261 Europe/Madrid +41.38333 2.05 Europe/Madrid +41.78333 3.03333 Europe/Madrid +41.46667 2.08333 Europe/Madrid +41.68333 2.48333 Europe/Madrid +40.61667 0.6 Europe/Madrid +41.34357 2.03659 Europe/Madrid +41.43541 2.18982 Europe/Madrid +42.61174 -5.61671 Europe/Madrid +41.44659 1.97187 Europe/Madrid +41.43073 2.21855 Europe/Madrid +43.29568 -5.68416 Europe/Madrid +41.97489 2.79281 Europe/Madrid +41.07663 1.14163 Europe/Madrid +40.96882 -5.66388 Europe/Madrid +41.54329 2.10942 Europe/Madrid +41.49226 2.03305 Europe/Madrid +42.26199 3.17689 Europe/Madrid +41.49686 2.15739 Europe/Madrid +42.7461 -8.44392 Europe/Madrid +41.15612 1.10687 Europe/Madrid +43.31195 -1.90234 Europe/Madrid +42.28337 -8.6096 Europe/Madrid +40.39354 -3.662 Europe/Madrid +42.18333 -8.5 Europe/Madrid +41.49206 2.36524 Europe/Madrid +40.43293 -3.81338 Europe/Madrid +42.44423 -8.71482 Europe/Madrid +43.32099 -3.02064 Europe/Madrid +42.16156 -8.6198 Europe/Madrid +42.431 -8.64435 Europe/Madrid +42.54664 -6.59619 Europe/Madrid +43.39228 -5.66335 Europe/Madrid +40.03116 -6.08845 Europe/Madrid +40.24147 -3.69999 Europe/Madrid +41.62763 2.6889 Europe/Madrid +40.23604 -3.76752 Europe/Madrid +41.57481 2.23306 Europe/Madrid +42.81687 -1.64323 Europe/Madrid +42.00955 -4.52406 Europe/Madrid +41.84843 3.12912 Europe/Madrid +41.91738 3.1631 Europe/Madrid +43.36029 -5.84476 Europe/Madrid +43.25541 -2.01873 Europe/Madrid +42.33669 -7.86407 Europe/Madrid +42.18096 2.49012 Europe/Madrid +41.54372 1.89408 Europe/Madrid +43.33333 -8.31667 Europe/Madrid +42.14153 -8.80656 Europe/Madrid +40.28908 -4.01197 Europe/Madrid +43.51667 -8.15278 Europe/Madrid +43.35 -2.83333 Europe/Madrid +40.32234 -3.86496 Europe/Madrid +40.41667 -3.65 Europe/Madrid +41.91084 0.19406 Europe/Madrid +41.53333 2.26667 Europe/Madrid +42.52165 -7.51422 Europe/Madrid +43.06441 -2.48977 Europe/Madrid +41.48333 2.18333 Europe/Madrid +41.54026 2.21306 Europe/Madrid +41.41667 2.01667 Europe/Madrid +42.28333 -8.75 Europe/Madrid +42.6865 -2.94695 Europe/Madrid +43.25 -5.76667 Europe/Madrid +40.39283 -3.48194 Europe/Madrid +41.31239 -4.91413 Europe/Madrid +41.54211 2.4445 Europe/Madrid +41.47978 2.3188 Europe/Madrid +41.47402 1.93062 Europe/Madrid +42.38333 -8.7 Europe/Madrid +41.72498 1.82656 Europe/Madrid +42.00228 2.28476 Europe/Madrid +41.64662 2.74135 Europe/Madrid +40.47353 -3.87182 Europe/Madrid +40.4165 -3.70256 Europe/Madrid +43.00992 -7.55602 Europe/Madrid +42.46667 -2.45 Europe/Madrid +41.69993 2.84565 Europe/Madrid +43.14322 -2.96204 Europe/Madrid +41.61674 0.62218 Europe/Madrid +42.60003 -5.57032 Europe/Madrid +43.33333 -2.98333 Europe/Madrid +40.32718 -3.7635 Europe/Madrid +40.49292 -3.87371 Europe/Madrid +43.26774 -2.02169 Europe/Madrid +41.07625 1.18515 Europe/Madrid +42.66085 -8.11285 Europe/Madrid +41.58151 -4.72332 Europe/Madrid +42.68333 -8.48333 Europe/Madrid +43.37135 -8.396 Europe/Madrid +43.33904 -1.78938 Europe/Madrid +40.12213 -3.84704 Europe/Madrid +41.58098 1.6172 Europe/Madrid +40.25038 -3.83062 Europe/Madrid +42.13615 -0.4087 Europe/Madrid +41.35967 2.10028 Europe/Madrid +40.47444 -3.6411 Europe/Madrid +43.26615 -1.97615 Europe/Madrid +43.31667 -2.68333 Europe/Madrid +43.35689 -3.01146 Europe/Madrid +40.62862 -3.16185 Europe/Madrid +41.60797 2.28773 Europe/Madrid +41.40237 2.15641 Europe/Madrid +43.53573 -5.66152 Europe/Madrid +40.30571 -3.73295 Europe/Madrid +41.98311 2.82493 Europe/Madrid +41.30605 2.00123 Europe/Madrid +43.23333 -2.83333 Europe/Madrid +40.5783 -4.00426 Europe/Madrid +43.36859 -1.79622 Europe/Madrid +40.28419 -3.79415 Europe/Madrid +43.53943 -7.02559 Europe/Madrid +42.26645 2.96163 Europe/Madrid +41.37732 2.08809 Europe/Madrid +41.53333 1.86667 Europe/Madrid +43.18333 -2.5 Europe/Madrid +43.30788 -2.94502 Europe/Madrid +41.32784 2.09472 Europe/Madrid +43.48321 -8.23689 Europe/Madrid +43.40094 -3.82051 Europe/Madrid +42.12632 -1.13716 Europe/Madrid +43.18493 -2.47158 Europe/Madrid +43.17124 -2.6338 Europe/Madrid +43.28788 -8.38858 Europe/Madrid +40.06667 -2.13333 Europe/Madrid +40.42378 -3.56129 Europe/Madrid +43.26697 -3.9471 Europe/Madrid +41.35 2.08333 Europe/Madrid +40.65909 -3.76762 Europe/Madrid +40.63506 -4.00486 Europe/Madrid +40.45455 -3.64808 Europe/Madrid +40.00112 3.84144 Europe/Madrid +40.15913 -3.62103 Europe/Madrid +40.46206 -3.6766 Europe/Madrid +43.38286 -3.22043 Europe/Madrid +43.39788 -6.79217 Europe/Madrid +41.27794 1.97033 Europe/Madrid +41.61667 2.08333 Europe/Madrid +41.63976 2.35739 Europe/Madrid +43.213 -8.69104 Europe/Madrid +41.61667 2.28333 Europe/Madrid +42.26413 -8.78462 Europe/Madrid +41.07479 1.05244 Europe/Madrid +43.29438 -8.34736 Europe/Madrid +43.40744 -3.88498 Europe/Madrid +41.61802 2.66781 Europe/Madrid +41.63333 2.16667 Europe/Madrid +41.35353 -1.64318 Europe/Madrid +42.30506 -1.96521 Europe/Madrid +41.19997 1.5683 Europe/Madrid +42.82562 -1.61671 Europe/Madrid +42.35022 -3.67527 Europe/Madrid +42.65 -8.9 Europe/Madrid +40.405 -3.87835 Europe/Madrid +41.67419 2.79036 Europe/Madrid +43.26271 -2.92528 Europe/Madrid +43.42088 -2.72152 Europe/Madrid +42.10429 1.84628 Europe/Madrid +40.05 0.06667 Europe/Madrid +40.4165 0.42709 Europe/Madrid +42.00249 -5.67826 Europe/Madrid +40.38641 -5.76341 Europe/Madrid +41.38879 2.15899 Europe/Madrid +42.03565 0.12686 Europe/Madrid +42.80567 -1.67731 Europe/Madrid +40.47366 -3.57777 Europe/Madrid +42.11667 2.76667 Europe/Madrid +41.79117 0.81094 Europe/Madrid +41.45004 2.24741 Europe/Madrid +40.56688 -3.25992 Europe/Madrid +43.55473 -5.92483 Europe/Madrid +40.65724 -4.69951 Europe/Madrid +43.30482 -8.50749 Europe/Madrid +40.30076 -3.43722 Europe/Madrid +40.03108 -3.60246 Europe/Madrid +41.67041 -3.6892 Europe/Madrid +40.71308 0.58103 Europe/Madrid +43.21667 -2.73333 Europe/Madrid +42.9 -8.63333 Europe/Madrid +43.34927 -3.0094 Europe/Madrid +40.59711 -3.49743 Europe/Madrid +40.34582 -3.82487 Europe/Madrid +40.54746 -3.64197 Europe/Madrid +41.05 -0.13333 Europe/Madrid +40.48205 -3.35996 Europe/Madrid +41.44163 2.17727 Europe/Madrid +40.47903 -3.66836 Europe/Madrid +27.7567 -15.5787 Atlantic/Canary +28.92313 -13.66579 Atlantic/Canary +35.88933 -5.31979 Africa/Ceuta +40.43547 -3.7317 Europe/Madrid +41.38896 2.16179 Europe/Madrid +41.38712 2.13007 Europe/Madrid +41.40104 2.1394 Europe/Madrid +41.41849 2.1677 Europe/Madrid +41.37263 2.1546 Europe/Madrid +41.41814 2.19933 Europe/Madrid +41.38022 2.17319 Europe/Madrid +40.40021 -3.69618 Europe/Madrid +40.43893 -3.61537 Europe/Madrid +40.38897 -3.74569 Europe/Madrid +40.38866 -3.70035 Europe/Madrid +40.42972 -3.67975 Europe/Madrid +40.43404 -3.70379 Europe/Madrid +40.39094 -3.7242 Europe/Madrid +40.41831 -3.70275 Europe/Madrid +40.41317 -3.68307 Europe/Madrid +38.58055 -0.10321 Europe/Madrid +37.13296 -3.69765 Europe/Madrid +41.64928 -0.90757 Europe/Madrid +41.66124 -0.90169 Europe/Madrid +41.62965 -0.93873 Europe/Madrid +41.64454 -0.93349 Europe/Madrid +43.25347 -2.9161 Europe/Madrid +28.36739 -16.58335 Atlantic/Canary +43.3253 -1.92707 Europe/Madrid +43.2397 -2.8858 Europe/Madrid +41.43806 2.2195 Europe/Madrid +43.51062 -5.8691 Europe/Madrid +36.93068 -3.19565 Europe/Madrid +42.80847 -1.65825 Europe/Madrid +42.81084 -1.66409 Europe/Madrid +42.81483 -1.64898 Europe/Madrid +42.8139 -1.64295 Europe/Madrid +40.4984 -3.7314 Europe/Madrid +40.36695 -3.60146 Europe/Madrid +43.54035 -5.68233 Europe/Madrid +42.18539 2.48805 Europe/Madrid +7.93333 38.71667 Africa/Addis_Ababa +6.75 38.41667 Africa/Addis_Ababa +4.88333 38.08333 Africa/Addis_Ababa +11.91667 37.7 Africa/Addis_Ababa +8.45 39.28333 Africa/Addis_Ababa +7.2 35.45 Africa/Addis_Ababa +7.2 38.6 Africa/Addis_Ababa +9.56667 37.1 Africa/Addis_Ababa +5.75 38.91667 Africa/Addis_Ababa +8.91667 38.61667 Africa/Addis_Ababa +12.01667 39.63333 Africa/Addis_Ababa +9.5 35.5 Africa/Addis_Ababa +8.55 39.26667 Africa/Addis_Ababa +8.6 39.11667 Africa/Addis_Ababa +8.3 35.58333 Africa/Addis_Ababa +8.9 39.91667 Africa/Addis_Ababa +9.8 35.1 Africa/Addis_Ababa +13.49667 39.47528 Africa/Addis_Ababa +12.7875 39.54222 Africa/Addis_Ababa +12.50583 39.52278 Africa/Addis_Ababa +7.31667 38.08333 Africa/Addis_Ababa +5.88333 38.98333 Africa/Addis_Ababa +10.71668 39.86997 Africa/Addis_Ababa +11.08155 39.74339 Africa/Addis_Ababa +5.65 36.65 Africa/Addis_Ababa +7.66667 36.83333 Africa/Addis_Ababa +9.35 42.8 Africa/Addis_Ababa +14.10307 38.28289 Africa/Addis_Ababa +9.31387 42.11815 Africa/Addis_Ababa +8.98333 37.85 Africa/Addis_Ababa +12.6 37.46667 Africa/Addis_Ababa +7.01667 39.98333 Africa/Addis_Ababa +8.53333 37.98333 Africa/Addis_Ababa +7.13952 40.71083 Africa/Addis_Ababa +9.17031 35.83491 Africa/Addis_Ababa +9.06667 38.5 Africa/Addis_Ababa +8.81667 40.51667 Africa/Addis_Ababa +9.8 38.4 Africa/Addis_Ababa +8.25 34.58333 Africa/Addis_Ababa +10.7 37.26667 Africa/Addis_Ababa +9.8 38.73333 Africa/Addis_Ababa +6.3 36.88333 Africa/Addis_Ababa +11.73292 41.082 Africa/Addis_Ababa +6.98333 39.18333 Africa/Addis_Ababa +9.59306 41.86611 Africa/Addis_Ababa +6.41667 38.31667 Africa/Addis_Ababa +11.13333 39.63333 Africa/Addis_Ababa +8.53333 34.8 Africa/Addis_Ababa +8.75 38.98333 Africa/Addis_Ababa +11.85 38.01667 Africa/Addis_Ababa +10.35 37.73333 Africa/Addis_Ababa +9.67954 39.53262 Africa/Addis_Ababa +13.15611 37.89806 Africa/Addis_Ababa +8.11667 38.36667 Africa/Addis_Ababa +10.7 37.06667 Africa/Addis_Ababa +7.28333 36.23333 Africa/Addis_Ababa +6.96667 37.86667 Africa/Addis_Ababa +10.45 38.2 Africa/Addis_Ababa +8.9 40.78333 Africa/Addis_Ababa +8.456 36.35302 Africa/Addis_Ababa +11.19152 40.01675 Africa/Addis_Ababa +5.78333 36.56667 Africa/Addis_Ababa +11.59364 37.39077 Africa/Addis_Ababa +7.06205 38.47635 Africa/Addis_Ababa +10.06667 34.53333 Africa/Addis_Ababa +9.08569 40.86708 Africa/Addis_Ababa +11.56838 41.43869 Africa/Addis_Ababa +7.1 39.2 Africa/Addis_Ababa +7.06667 37.7 Africa/Addis_Ababa +6.03333 37.55 Africa/Addis_Ababa +14.12448 38.72444 Africa/Addis_Ababa +5.63418 38.23603 Africa/Addis_Ababa +7.85 36.65 Africa/Addis_Ababa +12.11667 37.78333 Africa/Addis_Ababa +9.02497 38.74689 Africa/Addis_Ababa +14.277 39.462 Africa/Addis_Ababa +11.26667 37.48333 Africa/Addis_Ababa +9.98333 39.98333 Africa/Addis_Ababa +61.55632 23.59606 Europe/Helsinki +60.41699 24.31965 Europe/Helsinki +62.31533 27.873 Europe/Helsinki +60.29414 25.04099 Europe/Helsinki +61.26421 24.03122 Europe/Helsinki +63.096 21.61577 Europe/Helsinki +60.80043 21.40841 Europe/Helsinki +60.40368 25.02638 Europe/Helsinki +60.45148 22.26869 Europe/Helsinki +65.84811 24.14662 Europe/Helsinki +61.49911 23.78712 Europe/Helsinki +63.08333 27.66667 Europe/Helsinki +60.37752 25.26906 Europe/Helsinki +62.79446 22.82822 Europe/Helsinki +61.8699 28.87999 Europe/Helsinki +60.38333 23.13333 Europe/Helsinki +66.5 25.71667 Europe/Helsinki +60.73769 24.77726 Europe/Helsinki +61.12724 21.51127 Europe/Helsinki +60.48592 22.16895 Europe/Helsinki +64.68333 24.48333 Europe/Helsinki +61.48333 21.78333 Europe/Helsinki +61.46125 23.63228 Europe/Helsinki +65.01236 25.46816 Europe/Helsinki +60.46407 24.8073 Europe/Helsinki +61.46667 23.5 Europe/Helsinki +61.68857 27.27227 Europe/Helsinki +60.63333 25.31667 Europe/Helsinki +60.24859 24.06534 Europe/Helsinki +60.51032 22.46176 Europe/Helsinki +61.31667 23.75 Europe/Helsinki +62.41407 25.95194 Europe/Helsinki +61.05871 28.18871 Europe/Helsinki +60.98267 25.66151 Europe/Helsinki +60.12381 24.43853 Europe/Helsinki +65.96667 29.18333 Europe/Helsinki +62.89238 27.67703 Europe/Helsinki +60.86667 26.7 Europe/Helsinki +60.46667 26.91667 Europe/Helsinki +63.11418 21.68216 Europe/Helsinki +63.83847 23.13066 Europe/Helsinki +60.40338 25.105 Europe/Helsinki +65.73641 24.56371 Europe/Helsinki +60.51667 26.95 Europe/Helsinki +61.46383 24.07602 Europe/Helsinki +64.22728 27.72846 Europe/Helsinki +60.40724 22.36904 Europe/Helsinki +62.24147 25.72088 Europe/Helsinki +62.60118 29.76316 Europe/Helsinki +60.47369 25.08992 Europe/Helsinki +60.9 24.6 Europe/Helsinki +61.8642 25.19002 Europe/Helsinki +63.67486 22.70256 Europe/Helsinki +61.17185 28.75242 Europe/Helsinki +63.55915 27.19067 Europe/Helsinki +60.63333 24.86667 Europe/Helsinki +61.05 25.43333 Europe/Helsinki +60.16952 24.93545 Europe/Helsinki +61.20564 26.03811 Europe/Helsinki +65.17654 25.35233 Europe/Helsinki +60.56974 27.19794 Europe/Helsinki +60.99596 24.46434 Europe/Helsinki +60.81462 23.62146 Europe/Helsinki +60.2052 24.6522 Europe/Helsinki +60.39233 25.66507 Europe/Helsinki +60.68333 26.83333 Europe/Helsinki +60.29972 22.3004 Europe/Helsinki +-18.14161 178.44149 Pacific/Fiji +-17.8 177.41667 Pacific/Fiji +-17.61667 177.46667 Pacific/Fiji +-16.41667 179.38333 Pacific/Fiji +-51.7 -57.85 Atlantic/Stanley +6.92477 158.16109 Pacific/Pohnpei +62.00973 -6.77164 Atlantic/Faroe +48.71785 2.49338 Europe/Paris +47.8078 7.33702 Europe/Paris +50.70118 3.21812 Europe/Paris +50.67043 3.13382 Europe/Paris +45.36395 5.59209 Europe/Paris +48.78716 2.40332 Europe/Paris +48.73333 4.58333 Europe/Paris +43.46 5.24861 Europe/Paris +48.11776 -1.20577 Europe/Paris +48.67212 2.39318 Europe/Paris +48.80078 2.16181 Europe/Paris +48.8486 2.43769 Europe/Paris +48.831 2.54844 Europe/Paris +49.00875 2.39819 Europe/Paris +45.76667 4.88333 Europe/Paris +48.67103 6.15083 Europe/Paris +48.96203 2.53253 Europe/Paris +48.94208 2.61463 Europe/Paris +44.40854 0.70415 Europe/Paris +48.73219 2.44925 Europe/Paris +48.73684 2.40081 Europe/Paris +48.93935 2.31478 Europe/Paris +44.77327 -0.5442 Europe/Paris +48.88333 2.5 Europe/Paris +48.7939 2.35992 Europe/Paris +45.98333 4.71667 Europe/Paris +45.6125 5.14558 Europe/Paris +48.70291 2.41357 Europe/Paris +47.21667 2.08333 Europe/Paris +45.51667 4.86667 Europe/Paris +46.11667 3.41667 Europe/Paris +47.63333 6.16667 Europe/Paris +47.16869 -1.46929 Europe/Paris +48.8 2.13333 Europe/Paris +48.74565 2.26796 Europe/Paris +49.09292 1.46332 Europe/Paris +48.97388 1.9648 Europe/Paris +49.16667 5.38333 Europe/Paris +45.70254 4.87147 Europe/Paris +47.8 1.06667 Europe/Paris +43.72162 7.11232 Europe/Paris +48.78198 2.19395 Europe/Paris +49.03333 2.03333 Europe/Paris +45.7818 4.92085 Europe/Paris +48.82345 2.29025 Europe/Paris +47.66667 -2.75 Europe/Paris +48.65 6.18333 Europe/Paris +43.57803 7.05451 Europe/Paris +50.35 3.53333 Europe/Paris +44.93333 4.9 Europe/Paris +45.26667 1.76667 Europe/Paris +48.3 4.08333 Europe/Paris +48.94956 2.5684 Europe/Paris +48.77413 2.01781 Europe/Paris +47.38333 0.68333 Europe/Paris +43.58872 1.31922 Europe/Paris +49.63828 -1.56639 Europe/Paris +50.72391 3.16117 Europe/Paris +43.60426 1.44367 Europe/Paris +43.11667 5.93333 Europe/Paris +48.68333 5.9 Europe/Paris +48.85 2.65 Europe/Paris +46.36667 6.48333 Europe/Paris +49.36667 6.16667 Europe/Paris +48.76496 2.3961 Europe/Paris +49.65607 3.30107 Europe/Paris +49.02542 2.21691 Europe/Paris +45.75499 4.78812 Europe/Paris +43.23333 0.08333 Europe/Paris +44.80477 -0.59543 Europe/Paris +48.87143 2.22929 Europe/Paris +48.76872 2.53474 Europe/Paris +48.58392 7.74553 Europe/Paris +48.95 2.38333 Europe/Paris +49.40972 1.09006 Europe/Paris +44.01023 4.87381 Europe/Paris +48.98813 2.30156 Europe/Paris +49.38167 3.32361 Europe/Paris +43.1 5.85 Europe/Paris +50.36159 3.13113 Europe/Paris +45.88549 6.08831 Europe/Paris +48.82292 2.21757 Europe/Paris +48.94472 2.52746 Europe/Paris +43.4028 3.69278 Europe/Paris +48.2 3.28333 Europe/Paris +49.2 2.58333 Europe/Paris +48.26667 7.45 Europe/Paris +49.7 4.95 Europe/Paris +48.60749 7.74931 Europe/Paris +48.77644 2.29026 Europe/Paris +48.67678 2.34835 Europe/Paris +48.57409 2.58287 Europe/Paris +47.26667 -0.08333 Europe/Paris +48.9482 2.19169 Europe/Paris +49.10995 7.06747 Europe/Paris +49 2.38333 Europe/Paris +47.95013 1.87601 Europe/Paris +48.96667 2.25 Europe/Paris +43.11784 5.80006 Europe/Paris +43.64074 5.09545 Europe/Paris +45.94423 6.63162 Europe/Paris +47.20768 -1.50332 Europe/Paris +43.42332 6.7735 Europe/Paris +49.84889 3.28757 Europe/Paris +45.69612 4.93892 Europe/Paris +51.03116 2.33984 Europe/Paris +47.38623 0.74849 Europe/Paris +49.04353 2.12134 Europe/Paris +48.9 2.33333 Europe/Paris +50.75 2.25 Europe/Paris +47.28333 -2.2 Europe/Paris +48.63479 2.30831 Europe/Paris +44.89692 -0.72136 Europe/Paris +43.45214 5.86219 Europe/Paris +48.79394 2.49323 Europe/Paris +45.16528 5.76337 Europe/Paris +48.83864 2.41579 Europe/Paris +48.65 -2.01667 Europe/Paris +47.58836 7.56247 Europe/Paris +49.11624 -1.09031 Europe/Paris +49.01667 2.25 Europe/Paris +46.7306 4.50083 Europe/Paris +43.67097 7.17606 Europe/Paris +47.91127 1.86483 Europe/Paris +47.91303 1.97705 Europe/Paris +47.21765 -1.64841 Europe/Paris +48.9735 2.28729 Europe/Paris +48.9 2.08333 Europe/Paris +45.69558 4.7934 Europe/Paris +45.7088 4.86057 Europe/Paris +49.37794 1.10467 Europe/Paris +45.43333 4.4 Europe/Paris +45.75 -0.63333 Europe/Paris +48.64682 2.31965 Europe/Paris +45.73692 4.79688 Europe/Paris +45.23333 5.68333 Europe/Paris +48.63333 4.95 Europe/Paris +48.28333 6.95 Europe/Paris +48.93333 2.36667 Europe/Paris +47.4 0.66667 Europe/Paris +48.79865 2.06814 Europe/Paris +48.84598 2.20289 Europe/Paris +45.47365 4.52541 Europe/Paris +48.51513 -2.76838 Europe/Paris +49.1027 6.70064 Europe/Paris +47.36357 0.73993 Europe/Paris +50.44718 3.43076 Europe/Paris +48.8765 2.18967 Europe/Paris +45.62846 -1.0281 Europe/Paris +49.44313 1.09932 Europe/Paris +50.69421 3.17456 Europe/Paris +48.87017 2.4991 Europe/Paris +50.59883 3.09056 Europe/Paris +47.36667 1.75 Europe/Paris +45.04639 5.0562 Europe/Paris +48.8854 2.43482 Europe/Paris +48.79159 2.64747 Europe/Paris +44.35258 2.57338 Europe/Paris +45.93333 -0.98333 Europe/Paris +46.03333 4.06667 Europe/Paris +48.6511 2.41406 Europe/Paris +45.9 3.11667 Europe/Paris +45.81667 4.9 Europe/Paris +47.18144 -1.54965 Europe/Paris +48.11198 -1.67429 Europe/Paris +49.25 4.03333 Europe/Paris +48.65 1.83333 Europe/Paris +48 -4.1 Europe/Paris +48.88341 2.23894 Europe/Paris +43.40657 4.9809 Europe/Paris +49.05 2.1 Europe/Paris +48.06667 -2.98333 Europe/Paris +46.90347 6.35542 Europe/Paris +48.90786 6.0589 Europe/Paris +46.58333 0.33333 Europe/Paris +48.92902 2.04952 Europe/Paris +47.73333 -3.43333 Europe/Paris +48.82319 1.9541 Europe/Paris +43.56566 1.29749 Europe/Paris +48.96691 2.36104 Europe/Paris +44.81011 -0.64129 Europe/Paris +43.69252 5.50285 Europe/Paris +42.69764 2.89541 Europe/Paris +45.18333 0.71667 Europe/Paris +43.3 -0.36667 Europe/Paris +48.85341 2.3488 Europe/Paris +48.89437 2.40935 Europe/Paris +43.11667 1.6 Europe/Paris +48.71667 2.25 Europe/Paris +48.76699 2.66871 Europe/Paris +46.25917 5.65727 Europe/Paris +50.70535 1.5897 Europe/Paris +45.71774 4.80382 Europe/Paris +49.05937 2.06183 Europe/Paris +47.27095 -1.6219 Europe/Paris +48.69572 2.18727 Europe/Paris +48.74792 2.39252 Europe/Paris +47.90289 1.90389 Europe/Paris +44.1392 4.80791 Europe/Paris +47.86219 1.8991 Europe/Paris +49.62612 -1.64349 Europe/Paris +49.58333 3 Europe/Paris +48.89148 2.46451 Europe/Paris +48.84979 2.56266 Europe/Paris +48.84868 2.62435 Europe/Paris +49.27158 2.47074 Europe/Paris +48.83333 2.48333 Europe/Paris +46.32313 -0.45877 Europe/Paris +43.83333 4.35 Europe/Paris +43.70313 7.26608 Europe/Paris +46.98956 3.159 Europe/Paris +48.8846 2.26965 Europe/Paris +48.85373 2.54903 Europe/Paris +48.86342 2.506 Europe/Paris +43.18333 3 Europe/Paris +47.21725 -1.55336 Europe/Paris +48.89198 2.20675 Europe/Paris +48.68439 6.18496 Europe/Paris +43.46667 1.35 Europe/Paris +47.75 7.33333 Europe/Paris +46.56667 3.33333 Europe/Paris +43.59873 7.00434 Europe/Paris +48.6618 2.35338 Europe/Paris +48.58333 -3.83333 Europe/Paris +49.46307 1.09364 Europe/Paris +48.8162 2.31394 Europe/Paris +48.86415 2.44322 Europe/Paris +43.61092 3.87723 Europe/Paris +48.98826 2.3434 Europe/Paris +46.33333 2.6 Europe/Paris +49.54518 0.18769 Europe/Paris +49.09435 6.15167 Europe/Paris +48.98202 2.20035 Europe/Paris +48.76636 2.03405 Europe/Paris +48.70543 2.45039 Europe/Paris +48.8982 2.57913 Europe/Paris +48.90924 2.13754 Europe/Paris +48.38333 2.95 Europe/Paris +44.55838 4.75094 Europe/Paris +43.89022 -0.49713 Europe/Paris +46.66667 4.36667 Europe/Paris +45.6 4.05 Europe/Paris +47.51667 6.8 Europe/Paris +44.01667 1.35 Europe/Paris +48 2.75 Europe/Paris +50.63333 3.11667 Europe/Paris +48.62605 2.60125 Europe/Paris +48.98333 2.61667 Europe/Paris +43.58666 5.00464 Europe/Paris +44.1 3.08333 Europe/Paris +45.76667 5 Europe/Paris +45.21988 5.79007 Europe/Paris +48.81381 2.235 Europe/Paris +49.11911 6.17269 Europe/Paris +44.83248 -0.63381 Europe/Paris +43.77649 7.50435 Europe/Paris +48.53333 2.66667 Europe/Paris +48.96014 2.87885 Europe/Paris +48.3 -0.61667 Europe/Paris +48.76486 1.92923 Europe/Paris +43.6181 4.00739 Europe/Paris +50.27875 3.97267 Europe/Paris +48.72692 2.28301 Europe/Paris +43.40735 5.05526 Europe/Paris +43.29695 5.38107 Europe/Paris +44.5 0.16667 Europe/Paris +48.86667 2.08333 Europe/Paris +43.41604 5.21453 Europe/Paris +50.66667 3.08333 Europe/Paris +48.97374 1.70253 Europe/Paris +48.98333 1.71667 Europe/Paris +43.82883 5.78688 Europe/Paris +43.55 6.93333 Europe/Paris +48.81999 2.29998 Europe/Paris +48.95264 2.14521 Europe/Paris +48.81171 2.43945 Europe/Paris +46.3 4.83333 Europe/Paris +45.74846 4.84671 Europe/Paris +48.6 6.5 Europe/Paris +43.67778 4.13611 Europe/Paris +48.4369 1.46359 Europe/Paris +49.21667 1.16667 Europe/Paris +43.1 -0.05 Europe/Paris +44.87495 -0.51782 Europe/Paris +47.75 -3.36667 Europe/Paris +50.60982 3.01874 Europe/Paris +46.66667 5.55 Europe/Paris +48.69503 2.30736 Europe/Paris +50.64358 2.98715 Europe/Paris +48.83541 2.62998 Europe/Paris +48.9193 2.54305 Europe/Paris +43.91915 5.05092 Europe/Paris +49.1466 0.22925 Europe/Paris +48.55752 7.68253 Europe/Paris +45.83153 1.2578 Europe/Paris +48.7448 2.48705 Europe/Paris +48.99553 1.74081 Europe/Paris +50.63297 3.05858 Europe/Paris +50.4198 2.78068 Europe/Paris +44.91667 -0.23333 Europe/Paris +48.78333 2.33333 Europe/Paris +48.89281 2.13308 Europe/Paris +48.89389 2.28864 Europe/Paris +46.5 -1.78333 Europe/Paris +43.41028 5.31306 Europe/Paris +48.90683 2.50648 Europe/Paris +48.99173 1.90972 Europe/Paris +48.87992 2.42057 Europe/Paris +46.86667 -1.01667 Europe/Paris +48.82206 1.98677 Europe/Paris +45.04366 3.88523 Europe/Paris +48.88549 2.40422 Europe/Paris +43.96119 4.86008 Europe/Paris +48.81074 2.57363 Europe/Paris +48.78889 2.27078 Europe/Paris +49.41338 1.06155 Europe/Paris +48.85 2.5 Europe/Paris +48.89317 2.10371 Europe/Paris +50.43302 2.82791 Europe/Paris +48.53157 2.62829 Europe/Paris +48 0.2 Europe/Paris +48.81471 2.36073 Europe/Paris +49.4938 0.10767 Europe/Paris +49.40076 1.04582 Europe/Paris +46.80714 4.41632 Europe/Paris +48.8222 2.12213 Europe/Paris +43.57662 7.01912 Europe/Paris +44.866 -0.59411 Europe/Paris +48.93872 2.46138 Europe/Paris +48.68315 6.148 Europe/Paris +43.13741 5.98314 Europe/Paris +48.06667 -0.76667 Europe/Paris +43.56752 3.9046 Europe/Paris +44.62875 -1.14059 Europe/Paris +43.09818 5.88472 Europe/Paris +46.66667 -1.43333 Europe/Paris +46.16667 -1.15 Europe/Paris +49.56667 3.61667 Europe/Paris +48.73333 -3.46667 Europe/Paris +47.76132 -3.33965 Europe/Paris +48.45252 -4.25252 Europe/Paris +50.65 3.03333 Europe/Paris +50.64603 3.07585 Europe/Paris +48.86667 2.71667 Europe/Paris +48.90472 2.2469 Europe/Paris +43.12277 6.00745 Europe/Paris +47.69815 -0.07553 Europe/Paris +43.14981 6.07425 Europe/Paris +48.92805 2.39627 Europe/Paris +43.17476 5.60449 Europe/Paris +47.29584 -1.55309 Europe/Paris +48.85029 2.14523 Europe/Paris +49.01068 2.04028 Europe/Paris +47.35223 0.66906 Europe/Paris +48.82538 2.47458 Europe/Paris +48.81568 2.38487 Europe/Paris +43.51667 4.98333 Europe/Paris +48.82104 2.27718 Europe/Paris +45.55 3.25 Europe/Paris +47.78088 7.34662 Europe/Paris +48.52894 7.71523 Europe/Paris +43.11954 6.13897 Europe/Paris +48.92161 2.19263 Europe/Paris +49.21088 -0.30653 Europe/Paris +48.98994 2.1699 Europe/Paris +50.41359 2.96485 Europe/Paris +50.65256 3.18681 Europe/Paris +50.72374 2.53729 Europe/Paris +49.33428 6.05268 Europe/Paris +50.25077 3.92143 Europe/Paris +49.35571 6.1926 Europe/Paris +50.60826 2.99143 Europe/Paris +50.78628 3.12611 Europe/Paris +48.81557 7.79051 Europe/Paris +48.77334 2.07393 Europe/Paris +44.63333 -1.06667 Europe/Paris +46.16667 1.86667 Europe/Paris +47.32911 -2.42829 Europe/Paris +48.65412 2.39343 Europe/Paris +45.16667 5.71667 Europe/Paris +43.66667 6.91667 Europe/Paris +51.0154 2.29975 Europe/Paris +44.77262 -0.61393 Europe/Paris +49.01367 2.46595 Europe/Paris +48.98693 2.44892 Europe/Paris +45.58415 4.77256 Europe/Paris +48.68333 2.13333 Europe/Paris +47.69332 2.63094 Europe/Paris +48.81294 2.3417 Europe/Paris +48.93333 2.3 Europe/Paris +48.96791 2.39781 Europe/Paris +43.45491 5.46913 Europe/Paris +48.84226 2.18232 Europe/Paris +44.56667 6.08333 Europe/Paris +48.88333 2.53333 Europe/Paris +43.44848 3.754 Europe/Paris +48.75568 2.32241 Europe/Paris +43.43286 6.73524 Europe/Paris +48.98333 2.23333 Europe/Paris +48.35 -1.2 Europe/Paris +43.43774 4.94457 Europe/Paris +49.18333 6.9 Europe/Paris +48.85442 2.48268 Europe/Paris +46.46667 -0.81667 Europe/Paris +48.79325 2.29275 Europe/Paris +48.4 2.7 Europe/Paris +45.19839 5.68265 Europe/Paris +44.83238 -0.51411 Europe/Paris +47.93328 1.91811 Europe/Paris +48.73722 -0.57466 Europe/Paris +45.38732 4.29074 Europe/Paris +49.75787 0.37457 Europe/Paris +50.58333 3.06667 Europe/Paris +44.88352 -0.64686 Europe/Paris +48.63333 2.45 Europe/Paris +49.02414 1.15082 Europe/Paris +48.43333 2.15 Europe/Paris +47.29221 -2.36395 Europe/Paris +48.99004 2.25804 Europe/Paris +49.01667 2.1 Europe/Paris +49.64868 -1.65306 Europe/Paris +48.9535 2.31514 Europe/Paris +48.18333 6.45 Europe/Paris +49.05 3.95 Europe/Paris +49.28669 1.00288 Europe/Paris +48.7842 1.9552 Europe/Paris +45.77726 4.77481 Europe/Paris +45.1439 5.72883 Europe/Paris +48.99712 2.28249 Europe/Paris +51.03297 2.377 Europe/Paris +48.73333 1.36667 Europe/Paris +48.68466 2.41418 Europe/Paris +48.92578 2.44533 Europe/Paris +43.53333 6.46667 Europe/Paris +48.09542 -4.32904 Europe/Paris +50.36667 3.06667 Europe/Paris +49.02782 2.32638 Europe/Paris +47.1 5.5 Europe/Paris +47.31667 5.01667 Europe/Paris +44.09252 6.23199 Europe/Paris +49.93333 1.08333 Europe/Paris +48.97674 2.32722 Europe/Paris +50.3293 3.3943 Europe/Paris +45.76899 4.97277 Europe/Paris +43.71032 -1.05366 Europe/Paris +48.51667 2.65 Europe/Paris +43.53635 1.34428 Europe/Paris +50.67846 3.1493 Europe/Paris +48.78333 2.46667 Europe/Paris +49.23359 2.88807 Europe/Paris +49.25672 2.48477 Europe/Paris +45.9 6.1 Europe/Paris +45.73543 3.19608 Europe/Paris +48.89672 2.25666 Europe/Paris +48.81451 3.08498 Europe/Paris +47.21508 -1.72171 Europe/Paris +51.02288 2.39359 Europe/Paris +48.97111 2.20491 Europe/Paris +48.60603 2.48757 Europe/Paris +49.00158 2.09694 Europe/Paris +47.87502 -3.92245 Europe/Paris +49.41794 2.82606 Europe/Paris +48.66497 2.56957 Europe/Paris +48.79813 2.60676 Europe/Paris +43.61247 1.33278 Europe/Paris +48.91882 2.25404 Europe/Paris +48.08333 7.36667 Europe/Paris +45.7 -0.33333 Europe/Paris +46.06251 6.57497 Europe/Paris +48.9102 2.55324 Europe/Paris +48.90018 2.30952 Europe/Paris +45.77966 3.08628 Europe/Paris +48.80299 2.26692 Europe/Paris +47.06667 -0.88333 Europe/Paris +48.76846 2.41874 Europe/Paris +48.71489 2.31638 Europe/Paris +48.76476 2.3503 Europe/Paris +49.63984 -1.61636 Europe/Paris +47.29323 5.00457 Europe/Paris +48.79702 2.54046 Europe/Paris +48.88109 2.59295 Europe/Paris +48.80565 2.18864 Europe/Paris +48.11121 5.14134 Europe/Paris +48.8898 2.15863 Europe/Paris +48.8024 2.29346 Europe/Paris +48.76507 2.26655 Europe/Paris +46.8 0.53333 Europe/Paris +49.05 3.4 Europe/Paris +46.81667 1.7 Europe/Paris +48.08333 1.33333 Europe/Paris +48.44685 1.48925 Europe/Paris +49.76667 4.71667 Europe/Paris +48.82209 2.41217 Europe/Paris +48.85 2.6 Europe/Paris +48.81642 2.49366 Europe/Paris +45.56667 5.93333 Europe/Paris +45.77559 3.0631 Europe/Paris +46.78333 4.85 Europe/Paris +48.95393 4.36724 Europe/Paris +46.84363 -1.8749 Europe/Paris +44.74345 -0.67905 Europe/Paris +48.1212 -1.603 Europe/Paris +49.03645 2.07613 Europe/Paris +44.8559 -0.51839 Europe/Paris +49.55858 1.62803 Europe/Paris +43.83125 5.03586 Europe/Paris +43.6 2.25 Europe/Paris +43.63333 3.9 Europe/Paris +50.49235 2.95815 Europe/Paris +48.94952 2.04068 Europe/Paris +47.29822 -1.49024 Europe/Paris +44.05 5.05 Europe/Paris +43.21667 2.35 Europe/Paris +49.44065 1.02459 Europe/Paris +43.55135 7.01275 Europe/Paris +50.16667 3.23333 Europe/Paris +45.79041 4.84112 Europe/Paris +50.95194 1.85635 Europe/Paris +44.4491 1.43663 Europe/Paris +43.6646 7.15339 Europe/Paris +49.18585 -0.35912 Europe/Paris +48.79632 2.33661 Europe/Paris +48.83811 2.52488 Europe/Paris +48.6942 2.49223 Europe/Paris +50.48333 2.55 Europe/Paris +45.73333 4.91667 Europe/Paris +45.15 1.53333 Europe/Paris +43.4 6.06667 Europe/Paris +48.68333 2.61667 Europe/Paris +48.61135 2.30593 Europe/Paris +48.4 -4.48333 Europe/Paris +46.85 -0.48333 Europe/Paris +45.58333 5.28333 Europe/Paris +44.95601 4.91023 Europe/Paris +48.77888 2.31781 Europe/Paris +47.08333 2.4 Europe/Paris +46.20574 5.2258 Europe/Paris +50.71667 1.61667 Europe/Paris +48.83333 2.25 Europe/Paris +47.17762 -1.62143 Europe/Paris +44.84044 -0.5805 Europe/Paris +48.7695 2.4793 Europe/Paris +48.9018 2.48931 Europe/Paris +48.7515 2.51163 Europe/Paris +48.91936 2.27484 Europe/Paris +48.9 2.45 Europe/Paris +47.58333 1.33333 Europe/Paris +44.91248 -0.63663 Europe/Paris +43.63276 1.39399 Europe/Paris +48.61612 7.75343 Europe/Paris +43.48012 -1.55558 Europe/Paris +48.92426 2.2128 Europe/Paris +43.34122 3.21402 Europe/Paris +50.53333 2.63333 Europe/Paris +47.24878 6.01815 Europe/Paris +44.85 0.48333 Europe/Paris +50.4 1.6 Europe/Paris +50.40704 1.56446 Europe/Paris +47.63333 6.86667 Europe/Paris +44.80845 -0.54809 Europe/Paris +49.43333 2.08333 Europe/Paris +47.03333 4.83333 Europe/Paris +43.48333 -1.48333 Europe/Paris +49.27732 -0.7039 Europe/Paris +42.70278 9.45 Europe/Paris +48.78333 5.16667 Europe/Paris +43.61111 1.49944 Europe/Paris +44.1599 4.61776 Europe/Paris +48.86667 2.41667 Europe/Paris +48.79564 2.30796 Europe/Paris +48.4022 2.72022 Europe/Paris +50.41038 2.83053 Europe/Paris +43.94834 4.80892 Europe/Paris +47.8 3.56667 Europe/Paris +46.95 4.3 Europe/Paris +44.91667 2.45 Europe/Paris +48.93814 2.49402 Europe/Paris +47.48327 6.85341 Europe/Paris +43.65 0.58333 Europe/Paris +48.91667 2.38333 Europe/Paris +43.29276 5.57067 Europe/Paris +48.70522 2.39147 Europe/Paris +48.91667 2.28333 Europe/Paris +50.29301 2.78186 Europe/Paris +50.68568 2.88214 Europe/Paris +43.67681 4.63031 Europe/Paris +48.95 2.25 Europe/Paris +48.75 -0.01667 Europe/Paris +48.79993 2.33256 Europe/Paris +48.75 2.3 Europe/Paris +43.56241 7.12777 Europe/Paris +45.2397 4.67075 Europe/Paris +46.19439 6.23775 Europe/Paris +45.91972 6.14393 Europe/Paris +45.9 6.11667 Europe/Paris +45.65 0.15 Europe/Paris +43.47664 -1.51346 Europe/Paris +47.46667 -0.55 Europe/Paris +49.9 2.3 Europe/Paris +43.33573 5.48201 Europe/Paris +48.80575 2.4204 Europe/Paris +44.13333 4.08333 Europe/Paris +48.43333 0.08333 Europe/Paris +43.9298 2.148 Europe/Paris +45.67452 6.39061 Europe/Paris +41.92723 8.73462 Europe/Paris +45.68338 5.92241 Europe/Paris +43.5283 5.44973 Europe/Paris +44.2 0.63333 Europe/Paris +43.31083 3.47583 Europe/Paris +48.96116 2.06882 Europe/Paris +50.1 1.83333 Europe/Paris +50.61669 3.16664 Europe/Paris +48.68167 2.16944 Europe/Paris +45.58611 5.27361 Europe/Paris +43.29814 5.38407 Europe/Paris +43.29664 5.37034 Europe/Paris +43.30257 5.37583 Europe/Paris +43.30213 5.40141 Europe/Paris +43.29551 5.40055 Europe/Paris +43.29114 5.38244 Europe/Paris +43.28889 5.36485 Europe/Paris +43.27083 5.3821 Europe/Paris +43.27889 5.41523 Europe/Paris +43.25433 5.4057 Europe/Paris +43.2907 5.4384 Europe/Paris +43.29614 5.43617 Europe/Paris +43.31856 5.40836 Europe/Paris +43.34447 5.38004 Europe/Paris +43.37224 5.35386 Europe/Paris +43.35982 5.33421 Europe/Paris +48.89198 2.23881 Europe/Paris +48.77186 2.01891 Europe/Paris +49.03894 2.07805 Europe/Paris +-2.85 11.03333 Africa/Libreville +-0.71933 8.78151 Africa/Libreville +1.5995 11.57933 Africa/Libreville +-1.86846 11.05594 Africa/Libreville +-1.55746 13.21775 Africa/Libreville +0.39241 9.45356 Africa/Libreville +-0.7001 10.24055 Africa/Libreville +-1.13032 12.47359 Africa/Libreville +-1.63333 13.58357 Africa/Libreville +53.95763 -1.08271 Europe/London +50.94159 -2.63211 Europe/London +53.86437 -1.68743 Europe/London +51.54074 -2.41839 Europe/London +53.04664 -2.99132 Europe/London +50.81448 -0.37126 Europe/London +53.30182 -1.12404 Europe/London +54.6425 -3.54413 Europe/London +52.18935 -2.22001 Europe/London +51.60938 0.02329 Europe/London +53.52189 -1.39698 Europe/London +52.58547 -2.12296 Europe/London +51.4112 -0.83565 Europe/London +51.31903 -0.55893 Europe/London +51.7836 -1.4854 Europe/London +51.80007 0.64038 Europe/London +55.76667 -3.91667 Europe/London +52.66622 0.15938 Europe/London +53.18333 -2.51667 Europe/London +51.48333 -0.6 Europe/London +51.06513 -1.3187 Europe/London +53.32803 -2.23148 Europe/London +52.6 -2.03333 Europe/London +52.58128 -1.09248 Europe/London +53.53333 -2.61667 Europe/London +53.3618 -2.73406 Europe/London +51.61101 0.52331 Europe/London +51.3607 1.0257 Europe/London +55.03973 -1.44713 Europe/London +54.54897 -3.58412 Europe/London +53.55 -2.3 Europe/London +54.94561 -1.67635 Europe/London +50.61136 -2.45334 Europe/London +51.37216 -0.45297 Europe/London +51.34603 -2.97665 Europe/London +51.39985 -0.37997 Europe/London +53.54899 -2.52464 Europe/London +52.51868 -1.9945 Europe/London +52.92979 -1.12537 Europe/London +51.80174 -0.20691 Europe/London +52.7 -2.51667 Europe/London +52.30273 -0.69446 Europe/London +51.46246 0.10759 Europe/London +52.6 -2.08333 Europe/London +52.5514 -2.02355 Europe/London +53.50291 -1.3458 Europe/London +51.65531 -0.39602 Europe/London +50.88067 -1.0304 Europe/London +54.9 -1.51667 Europe/London +52.28333 -1.58333 Europe/London +53.39254 -2.58024 Europe/London +51.20434 -2.17873 Europe/London +51.81265 -0.02832 Europe/London +51.38533 -0.42066 Europe/London +51.687 -0.00421 Europe/London +52.58528 -1.98396 Europe/London +54.99111 -1.53397 Europe/London +53.42324 -3.06497 Europe/London +53.51667 -2.4 Europe/London +53.68331 -1.49768 Europe/London +53.44852 -2.35419 Europe/London +50.96948 0.09589 Europe/London +55.01788 -1.42559 Europe/London +53.51393 -2.46754 Europe/London +50.26526 -5.05436 Europe/London +51.31889 -2.20861 Europe/London +50.91877 -1.49037 Europe/London +50.46384 -3.51434 Europe/London +51.19242 0.27532 Europe/London +50.9 -3.48333 Europe/London +52.52956 -2.06773 Europe/London +54.53333 -1.3 Europe/London +52.41667 0.75 Europe/London +51.40366 -1.26049 Europe/London +50.54768 -3.49637 Europe/London +51.01494 -3.10293 Europe/London +52.63399 -1.69587 Europe/London +51.35045 -1.1285 Europe/London +53.5 -2.35 Europe/London +51.55797 -1.78116 Europe/London +51.62079 -3.94323 Europe/London +51.44713 0.31028 Europe/London +51.39717 0.17321 Europe/London +52.774 -1.55744 Europe/London +53.12542 -1.26135 Europe/London +52.56667 -1.81667 Europe/London +51.35 -0.2 Europe/London +54.90465 -1.38222 Europe/London +51.40606 -0.4137 Europe/London +51.75 -2.2 Europe/London +51.39594 0.49361 Europe/London +53.45 -2.31667 Europe/London +52.19166 -1.70734 Europe/London +52.18893 0.99774 Europe/London +52.35 -2.26667 Europe/London +52.45608 -2.14317 Europe/London +53.00415 -2.18538 Europe/London +54.56848 -1.3187 Europe/London +53.40979 -2.15761 Europe/London +56.11903 -3.93682 Europe/London +51.90224 -0.20256 Europe/London +53.26667 -1.35 Europe/London +52.65 -0.48333 Europe/London +53.48414 -2.05908 Europe/London +51.43092 -0.50606 Europe/London +52.80521 -2.11636 Europe/London +54.6988 -1.60229 Europe/London +52.78709 -0.15141 Europe/London +54.99859 -1.4323 Europe/London +50.79205 -1.08593 Europe/London +53.64779 -3.00648 Europe/London +51.50799 0.28333 Europe/London +51.53782 0.71433 Europe/London +53.59709 -1.28034 Europe/London +51.55295 0.55962 Europe/London +50.90395 -1.40428 Europe/London +51.50896 -0.3713 Europe/London +52.41426 -1.78094 Europe/London +51.50949 -0.59541 Europe/London +52.99826 -0.40941 Europe/London +53.55024 -2.77348 Europe/London +53.14362 0.3363 Europe/London +51.34128 0.73282 Europe/London +52.71009 -2.75208 Europe/London +50.83413 -0.27431 Europe/London +51.3334 0.17801 Europe/London +53.83333 -1.76667 Europe/London +53.38297 -1.4659 Europe/London +51.26997 0.19278 Europe/London +53.78333 -1.06667 Europe/London +54.83903 -1.34575 Europe/London +50.77141 0.10268 Europe/London +53.57905 -0.65437 Europe/London +54.27966 -0.40443 Europe/London +50.65158 -1.16103 Europe/London +53.14515 -2.36251 Europe/London +51.06931 -1.79569 Europe/London +53.48771 -2.29042 Europe/London +53.42519 -2.32443 Europe/London +52.21667 -0.26667 Europe/London +53.45 -2.73333 Europe/London +50.3425 -4.77442 Europe/London +56.33871 -2.79902 Europe/London +51.75 -0.33333 Europe/London +52.61667 -2.35 Europe/London +50.72999 -1.1621 Europe/London +55.82885 -4.21376 Europe/London +52.29139 -0.59923 Europe/London +53.34174 -2.73124 Europe/London +51.57344 -0.42341 Europe/London +52.7593 -1.93694 Europe/London +52.37092 -1.26417 Europe/London +53.56507 -2.12267 Europe/London +51.13245 0.26333 Europe/London +50.80984 -0.05939 Europe/London +53.43012 -1.35678 Europe/London +50.98906 -1.49989 Europe/London +51.58198 0.70673 Europe/London +51.38764 0.50546 Europe/London +53.61766 -2.1552 Europe/London +51.60799 -3.10081 Europe/London +54.13521 -1.52122 Europe/London +53.03333 -1.4 Europe/London +53.31955 -3.48862 Europe/London +51.65896 -3.44885 Europe/London +55.87197 -4.39253 Europe/London +51.23758 -0.2078 Europe/London +51.24048 -0.17044 Europe/London +52.3065 -1.94569 Europe/London +54.61657 -1.05999 Europe/London +51.45625 -0.97113 Europe/London +51.58571 0.60459 Europe/London +53.70076 -2.28442 Europe/London +53.46062 -1.34437 Europe/London +51.33576 1.41552 Europe/London +53.64789 -2.31683 Europe/London +51.33678 -0.11201 Europe/London +53.79538 -1.66134 Europe/London +55.48333 -4.61667 Europe/London +53.53333 -2.28333 Europe/London +53.76667 -2.71667 Europe/London +53.33748 -3.40776 Europe/London +53.42948 -2.80031 Europe/London +53.83333 -2.98333 Europe/London +51.69353 -0.17835 Europe/London +50.79899 -1.09125 Europe/London +50.84335 -0.21544 Europe/London +51.48199 -2.76973 Europe/London +51.47903 -3.70362 Europe/London +55.93464 -4.6895 Europe/London +50.71667 -2 Europe/London +51.6021 -3.34211 Europe/London +51.70111 -3.04444 Europe/London +53.69107 -1.31269 Europe/London +55.9905 -3.70737 Europe/London +50.35999 -4.09049 Europe/London +50.37153 -4.14305 Europe/London +51.56387 0.50859 Europe/London +51.59384 -0.38216 Europe/London +54.76032 -1.33649 Europe/London +57.50584 -1.79806 Europe/London +52.57364 -0.24777 Europe/London +56.39522 -3.43139 Europe/London +50.11861 -5.53715 Europe/London +55.83166 -3.22423 Europe/London +51.4386 -3.17342 Europe/London +55.83173 -4.43254 Europe/London +50.43565 -3.56789 Europe/London +51.75222 -1.25596 Europe/London +52.86195 -3.05497 Europe/London +53.67978 -1.58006 Europe/London +51.37457 0.09785 Europe/London +53.56685 -2.88178 Europe/London +54.6 -7.3 Europe/London +53.54051 -2.1183 Europe/London +52.60621 -1.08354 Europe/London +52.52323 -1.46523 Europe/London +52.9536 -1.15047 Europe/London +52.62783 1.29834 Europe/London +53.26138 -2.51225 Europe/London +55.01646 -1.44925 Europe/London +51.54855 -0.36778 Europe/London +50.82882 -0.32247 Europe/London +52.25 -0.88333 Europe/London +54.33901 -1.43243 Europe/London +54.59236 -5.69092 Europe/London +54.65983 -5.90858 Europe/London +55.77334 -4.33339 Europe/London +53.45 -2.6 Europe/London +54.61842 -1.5719 Europe/London +50.52858 -3.61186 Europe/London +54.17841 -6.33739 Europe/London +50.41317 -5.08186 Europe/London +52.08731 -0.72218 Europe/London +51.58774 -2.99835 Europe/London +50.70146 -1.29124 Europe/London +50.75601 -1.6658 Europe/London +52.24467 0.40418 Europe/London +51.39915 -0.2556 Europe/London +54.97328 -1.61396 Europe/London +53 -2.23333 Europe/London +51.40033 -1.32059 Europe/London +54.9876 -1.74415 Europe/London +53.06667 -0.81667 Europe/London +53.83333 -2.2 Europe/London +51.66317 -3.80443 Europe/London +51.43239 -2.75847 Europe/London +55.9417 -3.04991 Europe/London +55.78924 -3.99187 Europe/London +53.74013 -1.59877 Europe/London +53.4 -3.11667 Europe/London +54.06835 -2.86108 Europe/London +51.40474 -0.16404 Europe/London +53.67343 -1.69636 Europe/London +52.04172 -0.75583 Europe/London +53.55 -2.2 Europe/London +54.57623 -1.23483 Europe/London +53.49389 -1.29243 Europe/London +51.74794 -3.37779 Europe/London +52.76588 -0.88693 Europe/London +53.39452 -2.06292 Europe/London +51.56933 -0.77415 Europe/London +52.4776 -0.92053 Europe/London +51.38132 1.38617 Europe/London +52.55131 0.08828 Europe/London +53.16495 -1.19384 Europe/London +53.13333 -1.2 Europe/London +51.4878 -2.50403 Europe/London +53.48095 -2.23743 Europe/London +53.41667 -1.2 Europe/London +51.7311 0.67463 Europe/London +51.26667 0.51667 Europe/London +51.52279 -0.71986 Europe/London +53.51619 -2.94117 Europe/London +51.60926 -3.65823 Europe/London +53.26023 -2.12564 Europe/London +51.87967 -0.41748 Europe/London +52.4752 1.75159 Europe/London +53.36664 -0.00438 Europe/London +52.76667 -1.2 Europe/London +51.3969 0.30212 Europe/London +52.89855 -1.27136 Europe/London +54.99721 -7.30917 Europe/London +54.9981 -7.30934 Europe/London +51.51279 -0.09184 Europe/London +51.50853 -0.12574 Europe/London +53.72947 -1.49697 Europe/London +51.68195 -4.16191 Europe/London +53.32498 -3.83148 Europe/London +55.90288 -3.52261 Europe/London +53.41058 -2.97794 Europe/London +50.80691 -0.53782 Europe/London +53.46993 -2.99809 Europe/London +54.52337 -6.03527 Europe/London +53.22683 -0.53792 Europe/London +52.68154 -1.82549 Europe/London +53.69786 -2.68758 Europe/London +50.87363 0.01133 Europe/London +51.97944 -0.2284 Europe/London +51.91722 -0.65802 Europe/London +53.48333 -2.51667 Europe/London +52.6386 -1.13169 Europe/London +53.10434 -2.02207 Europe/London +53.79648 -1.54785 Europe/London +51.29593 -0.3259 Europe/London +52.3 -1.53333 Europe/London +54.85 -5.81667 Europe/London +55.73333 -3.96667 Europe/London +54.04649 -2.79988 Europe/London +55.93933 -4.15262 Europe/London +56.10982 -3.16149 Europe/London +53.09982 -1.24379 Europe/London +53.48333 -2.9 Europe/London +51.45278 -2.50833 Europe/London +52.49755 -2.16889 Europe/London +53.7446 -0.33525 Europe/London +52.75172 0.39516 Europe/London +55.65333 -4.70666 Europe/London +55.61171 -4.49581 Europe/London +53.08691 -2.23777 Europe/London +51.82166 -1.2886 Europe/London +52.38819 -2.25 Europe/London +51.41387 -2.4978 Europe/London +52.39836 -0.72571 Europe/London +52.34286 -1.58015 Europe/London +54.32681 -2.74757 Europe/London +52.11599 -0.50044 Europe/London +53.86791 -1.90664 Europe/London +55.82906 -4.51605 Europe/London +54.98036 -1.48423 Europe/London +51.53622 -0.10304 Europe/London +51.47518 -0.34246 Europe/London +55.6194 -4.65508 Europe/London +53.44253 -2.42323 Europe/London +52.05917 1.15545 Europe/London +57.47908 -4.22398 Europe/London +52.97055 -1.30951 Europe/London +50.86004 -1.40162 Europe/London +53.45131 -2.07943 Europe/London +53.4115 -2.83935 Europe/London +52.33049 -0.18651 Europe/London +53.64904 -1.78416 Europe/London +53.03333 -1.2 Europe/London +53.5 -1.45 Europe/London +50.83088 -0.1672 Europe/London +54.84034 -1.46427 Europe/London +53.60126 -2.54975 Europe/London +51.06395 -0.32719 Europe/London +53.83797 -1.64036 Europe/London +51.17423 -0.15919 Europe/London +51.76148 -0.01144 Europe/London +51.95314 -0.26519 Europe/London +53.53333 -2.58333 Europe/London +52.5389 -1.37613 Europe/London +51.62907 -0.74934 Europe/London +55.78438 -4.10007 Europe/London +53.32733 -3.09648 Europe/London +51.79588 -0.07854 Europe/London +51.373 1.12857 Europe/London +52.05684 -2.71482 Europe/London +51.75369 -0.47517 Europe/London +54.97302 -1.51546 Europe/London +53.01372 -1.35383 Europe/London +53.38333 -2.11667 Europe/London +50.99769 -0.10313 Europe/London +51.51579 -0.4234 Europe/London +53.46723 -2.68166 Europe/London +53.18478 -3.02578 Europe/London +52.08226 0.43891 Europe/London +50.8567 -0.98559 Europe/London +51.76338 -0.22419 Europe/London +50.85519 0.57292 Europe/London +53.70326 -2.32382 Europe/London +51.94194 1.28437 Europe/London +54.68611 -1.2125 Europe/London +53.99078 -1.5373 Europe/London +51.81684 -0.35706 Europe/London +51.77655 0.11158 Europe/London +51.41334 -0.36701 Europe/London +55.76667 -4.03333 Europe/London +53.71667 -1.85 Europe/London +52.44859 -2.04938 Europe/London +51.21667 -0.78333 Europe/London +50.8622 0.25775 Europe/London +51.55269 0.60983 Europe/London +53.87561 -1.71232 Europe/London +54.53478 -1.05606 Europe/London +51.23536 -0.57427 Europe/London +51.60954 -1.42187 Europe/London +55.94838 -4.76121 Europe/London +51.52866 -0.35508 Europe/London +52.60831 1.73052 Europe/London +52.66277 -2.01111 Europe/London +53.39234 -2.63994 Europe/London +52.11161 -2.32515 Europe/London +51.47566 0.32521 Europe/London +51.44138 0.37371 Europe/London +52.91149 -0.64184 Europe/London +56.01141 -3.72183 Europe/London +50.79509 -1.12902 Europe/London +55 -1.61667 Europe/London +51.66931 -4.04163 Europe/London +53.71667 -0.86667 Europe/London +53.47693 -2.59651 Europe/London +51.18462 -0.61725 Europe/London +51.86568 -2.2431 Europe/London +53.44325 -1.949 Europe/London +56.19514 -3.17316 Europe/London +55.86515 -4.25763 Europe/London +51.38914 0.54863 Europe/London +55.80373 -4.29488 Europe/London +51.66444 -3.25611 Europe/London +54.96209 -1.60168 Europe/London +53.79173 -1.38067 Europe/London +53.38333 -0.76667 Europe/London +53.83333 -2.91667 Europe/London +51.22834 -2.32211 Europe/London +51.83877 1.24625 Europe/London +53.55364 -3.06816 Europe/London +51.08333 1.18333 Europe/London +53.92527 -3.01085 Europe/London +51.28333 -0.83333 Europe/London +51.4462 -0.41388 Europe/London +54.95297 -1.57152 Europe/London +51.96375 1.3511 Europe/London +51.3148 0.88856 Europe/London +53.55 -2.4 Europe/London +51.21433 -0.79587 Europe/London +51.29424 -0.75565 Europe/London +50.85162 -1.17929 Europe/London +50.15441 -5.07113 Europe/London +55.99917 -3.78713 Europe/London +50.61723 -3.40233 Europe/London +50.7236 -3.52751 Europe/London +52.09237 -1.94887 Europe/London +51.36926 -0.36572 Europe/London +51.3305 -0.27011 Europe/London +50.84779 -0.93697 Europe/London +53.27875 -2.90134 Europe/London +57.65 -3.33333 Europe/London +51.43158 -0.55239 Europe/London +55.95206 -3.19648 Europe/London +53.48333 -2.33333 Europe/London +51.77714 -3.20792 Europe/London +53 -1.3 Europe/London +53.32213 -0.94315 Europe/London +51.39872 -0.34916 Europe/London +50.96667 -1.35 Europe/London +55.76412 -4.17669 Europe/London +51.12382 -0.0061 Europe/London +52.68333 0.93333 Europe/London +50.76871 0.28453 Europe/London +54.77676 -1.57566 Europe/London +51.886 -0.52099 Europe/London +56.07156 -3.45887 Europe/London +56.46913 -2.97489 Europe/London +55.94433 -4.57061 Europe/London +53.47497 -2.08809 Europe/London +52.5 -2.08333 Europe/London +53.48005 -2.14543 Europe/London +53.30221 -1.47507 Europe/London +52.26667 -2.15 Europe/London +51.13333 1.3 Europe/London +51.2329 -0.32942 Europe/London +50.71667 -2.43333 Europe/London +53.52327 -1.13691 Europe/London +51.60928 -1.24214 Europe/London +53.69076 -1.62907 Europe/London +52.92277 -1.47663 Europe/London +53.45678 -2.11822 Europe/London +51.22322 1.40432 Europe/London +52.25688 -1.16066 Europe/London +53.69803 -2.46494 Europe/London +53.58705 -1.52676 Europe/London +51.44352 0.21964 Europe/London +54.52429 -1.55039 Europe/London +55.73333 -3.91667 Europe/London +51.55 0.16667 Europe/London +51.65446 -3.02281 Europe/London +55.94685 -3.99051 Europe/London +51.37027 -0.79219 Europe/London +51.06044 0.16171 Europe/London +53.09787 -2.44161 Europe/London +51.11303 -0.18312 Europe/London +55.08652 -1.58598 Europe/London +51.73139 -1.20742 Europe/London +50.76306 -1.29772 Europe/London +52.40656 -1.51217 Europe/London +51.32002 -0.14088 Europe/London +52.49637 -0.68939 Europe/London +54.85404 -1.8316 Europe/London +53.48188 -1.23214 Europe/London +53.16314 -2.21253 Europe/London +53.29483 -3.72674 Europe/London +53.85713 -2.16851 Europe/London +55.13333 -6.66667 Europe/London +51.88921 0.90421 Europe/London +51.522 -3.55531 Europe/London +51.32997 -0.4113 Europe/London +55.86216 -4.02469 Europe/London +52.72247 -1.3702 Europe/London +55.90137 -4.4057 Europe/London +51.68333 -3.9 Europe/London +53.86667 -2.4 Europe/London +51.44057 -2.85745 Europe/London +53.56047 -0.03225 Europe/London +53.72405 -1.71294 Europe/London +51.78967 1.15597 Europe/London +51.71708 -1.96825 Europe/London +50.73306 -1.77567 Europe/London +53.65 -2.61667 Europe/London +51.41709 0.06858 Europe/London +51.53813 -2.39379 Europe/London +51.46 -2.12472 Europe/London +50.83673 -0.78003 Europe/London +54.85862 -1.57408 Europe/London +53.25 -1.41667 Europe/London +53.1905 -2.89189 Europe/London +51.3624 -0.30427 Europe/London +51.70791 -0.03739 Europe/London +51.7 -0.6 Europe/London +51.9 -2.08333 Europe/London +51.48755 -0.16936 Europe/London +51.73575 0.46958 Europe/London +53.3761 -2.1897 Europe/London +51.37891 0.52786 Europe/London +53.46506 -1.47217 Europe/London +51.01219 -1.38136 Europe/London +51.60885 -0.55618 Europe/London +51.2823 -0.07889 Europe/London +54.5735 -5.88472 Europe/London +53.72587 -1.36256 Europe/London +51.36829 -0.16755 Europe/London +54.7158 -5.8058 Europe/London +51.85552 -4.30535 Europe/London +54.8951 -2.9382 Europe/London +51.48 -3.18 Europe/London +51.27904 1.07992 Europe/London +52.69045 -2.03085 Europe/London +52.2 0.11667 Europe/London +50.21306 -5.29731 Europe/London +51.33705 -0.74261 Europe/London +51.57452 -3.218 Europe/London +53.25741 -1.90982 Europe/London +51.64316 -0.36053 Europe/London +52.2463 0.71111 Europe/London +53.6 -2.3 Europe/London +52.80728 -1.64263 Europe/London +52.68075 -1.92759 Europe/London +53.8 -2.23333 Europe/London +51.23862 -2.9978 Europe/London +50.95843 -0.13287 Europe/London +53.16667 -3.08333 Europe/London +56.17149 -3.03377 Europe/London +53.06667 -3.06667 Europe/London +52.63333 -1.93333 Europe/London +52.33574 -2.05983 Europe/London +51.35908 1.43938 Europe/London +50.39431 -3.51585 Europe/London +51.63106 -3.81898 Europe/London +51.45523 -2.59665 Europe/London +50.82838 -0.13947 Europe/London +53.70322 -1.78428 Europe/London +52.48173 -2.12139 Europe/London +54.08306 -0.19192 Europe/London +51.12837 -3.00356 Europe/London +51.50583 -3.57722 Europe/London +51.62127 0.30556 Europe/London +53.41667 -2.11667 Europe/London +53.35801 -2.16539 Europe/London +51.87819 0.55292 Europe/London +53.79391 -1.75206 Europe/London +51.41363 -0.75054 Europe/London +50.72048 -1.8795 Europe/London +52.97633 -0.02664 Europe/London +51.65468 -0.27762 Europe/London +53.46667 -3.01667 Europe/London +53.58333 -2.43333 Europe/London +50.78206 -0.67978 Europe/London +55.12708 -1.50856 Europe/London +52.61806 -2.00431 Europe/London +51.99334 -0.73471 Europe/London +53.81667 -3.05 Europe/London +53.75 -2.48333 Europe/London +50.96643 -1.32832 Europe/London +51.87113 0.15868 Europe/London +55.90669 -4.21869 Europe/London +54.65554 -1.67706 Europe/London +52.48142 -1.89983 Europe/London +53.39337 -3.01479 Europe/London +53.84861 -1.83857 Europe/London +54.58881 -1.29034 Europe/London +51.62867 0.41963 Europe/London +52.08652 -0.26493 Europe/London +51.01787 -4.20458 Europe/London +53.11724 -2.17584 Europe/London +51.89998 -1.15357 Europe/London +51.44162 0.14866 Europe/London +50.85023 0.47095 Europe/London +53.84587 -0.42332 Europe/London +55.78333 -2 Europe/London +51.7604 -0.56528 Europe/London +53.53333 -1.15 Europe/London +53.0233 -1.48119 Europe/London +55.81667 -4.01667 Europe/London +54.58333 -5.93333 Europe/London +52.4791 -1.46909 Europe/London +55.13061 -1.59319 Europe/London +52.13459 -0.46632 Europe/London +51.40878 -0.02526 Europe/London +53.35 -3.01667 Europe/London +55.91536 -4.33279 Europe/London +53.70291 -1.6337 Europe/London +55.90204 -3.64398 Europe/London +51.3751 -2.36172 Europe/London +51.26249 -1.08708 Europe/London +51.56844 0.45782 Europe/London +51.40667 -3.26944 Europe/London +54.11094 -3.22758 Europe/London +55.79916 -4.39285 Europe/London +51.08022 -4.05808 Europe/London +53.55 -1.48333 Europe/London +51.65 -0.2 Europe/London +51.53333 0.08333 Europe/London +51.32503 -0.19569 Europe/London +54.65338 -5.66895 Europe/London +53.22647 -4.13459 Europe/London +52.0602 -1.34029 Europe/London +54.35 -6.28333 Europe/London +54.86357 -6.27628 Europe/London +53.84711 -1.78785 Europe/London +55.46273 -4.63393 Europe/London +51.81665 -0.81458 Europe/London +53.52371 -2.49354 Europe/London +53.48876 -2.0989 Europe/London +53.48333 -2.65 Europe/London +51.14586 0.87281 Europe/London +51.41082 -0.6748 Europe/London +53 -1.13333 Europe/London +56.56317 -2.58736 Europe/London +54.7 -6.2 Europe/London +51.20828 -1.48246 Europe/London +51.66667 -0.61667 Europe/London +53.38752 -2.34848 Europe/London +51.14931 -0.97469 Europe/London +56.11586 -3.78997 Europe/London +53.0961 -1.38832 Europe/London +52.60549 -1.91715 Europe/London +51.24827 -0.76389 Europe/London +55.86602 -3.98025 Europe/London +51.50901 -0.2762 Europe/London +52.45 -1.81667 Europe/London +53.75379 -2.35863 Europe/London +51.67109 -1.28278 Europe/London +52.41548 -4.08292 Europe/London +53.28436 -3.5822 Europe/London +57.14369 -2.09814 Europe/London +51.71438 -3.44918 Europe/London +53.47778 -3.03333 Europe/London +51.66778 -3.2075 Europe/London +51.41222 -2.20056 Europe/London +51.54057 -0.14334 Europe/London +52.67659 -2.44926 Europe/London +54.44709 -6.387 Europe/London +51.51116 -0.18426 Europe/London +51.34305 -0.82985 Europe/London +52.63884 1.21885 Europe/London +50.91234 -1.30076 Europe/London +55.9005 -4.45028 Europe/London +53.37831 -2.33271 Europe/London +51.67468 -0.60742 Europe/London +51.47475 -0.15547 Europe/London +51.36217 -0.09421 Europe/London +51.55685 0.21664 Europe/London +51.39148 -0.29825 Europe/London +51.34948 -0.2494 Europe/London +51.5529 0.129 Europe/London +51.46593 -0.10652 Europe/London +51.52718 -0.06109 Europe/London +53.50484 -2.16568 Europe/London +53.56178 -2.32455 Europe/London +53.59245 -2.21941 Europe/London +53.45801 -2.20104 Europe/London +50.72044 -3.49646 Europe/London +50.80743 -1.89975 Europe/London +53.7426 -2.997 Europe/London +51.66669 -0.16981 Europe/London +53.82901 -1.53834 Europe/London +51.4647 0.0079 Europe/London +52.08956 -0.49908 Europe/London +51.2372 -2.6266 Europe/London +51.42708 -0.91979 Europe/London +52.43532 -1.99707 Europe/London +51.4439 -0.1854 Europe/London +51.97938 -0.22664 Europe/London +52.41074 -1.81952 Europe/London +54.86796 -1.69846 Europe/London +53.68456 -2.2769 Europe/London +53.87389 -3.02244 Europe/London +53.20053 -3.03841 Europe/London +53.36797 -1.84536 Europe/London +50.7838 -0.96869 Europe/London +58.21901 -6.38803 Europe/London +60.15456 -1.14899 Europe/London +58.98465 -2.95953 Europe/London +51.55237 -0.12497 Europe/London +51.5824 -0.09956 Europe/London +12.05644 -61.74849 America/Grenada +42.5088 41.87088 Asia/Tbilisi +42.11 43.0525 Asia/Tbilisi +42.22764 43.96861 Asia/Tbilisi +42.84035 41.68007 Asia/Tbilisi +41.91978 45.47315 Asia/Tbilisi +41.69411 44.83368 Asia/Tbilisi +43.00697 40.9893 Asia/Tbilisi +42.27042 42.0675 Asia/Tbilisi +42.1537 42.33517 Asia/Tbilisi +41.54949 44.99323 Asia/Tbilisi +42.14616 41.67197 Asia/Tbilisi +41.92442 42.00682 Asia/Tbilisi +42.71232 41.46863 Asia/Tbilisi +41.47588 44.80894 Asia/Tbilisi +42.26791 42.69459 Asia/Tbilisi +41.82 41.77528 Asia/Tbilisi +41.99414 43.59994 Asia/Tbilisi +41.98422 44.11578 Asia/Tbilisi +41.64159 41.63593 Asia/Tbilisi +41.63901 42.98262 Asia/Tbilisi +43.08056 40.83833 Asia/Tbilisi +42.34129 42.5976 Asia/Tbilisi +5.5 -54.03333 America/Cayenne +4.91667 -52.26667 America/Cayenne +4.847 -52.32156 America/Cayenne +5.15518 -52.64779 America/Cayenne +4.93333 -52.33333 America/Cayenne +49.45981 -2.53527 Europe/Guernsey +9.44272 -0.00991 Africa/Accra +5.35113 -0.62313 Africa/Accra +7.73916 -2.10456 Africa/Accra +10.06069 -2.50192 Africa/Accra +5.58365 -0.10722 Africa/Accra +5.6698 -0.01657 Africa/Accra +7.58616 -1.94137 Africa/Accra +5.30644 -1.98474 Africa/Accra +9.40078 -0.8393 Africa/Accra +4.88447 -1.75536 Africa/Accra +6.73453 -1.61275 Africa/Accra +5.53711 -0.69984 Africa/Accra +7.33991 -2.32676 Africa/Accra +6.04089 -0.45004 Africa/Accra +5.00872 -1.63011 Africa/Accra +4.934 -1.7137 Africa/Accra +9.62441 -0.8253 Africa/Accra +5.20913 -1.06058 Africa/Accra +8.55083 -0.51875 Africa/Accra +5.43274 -2.14284 Africa/Accra +5.53449 -0.41679 Africa/Accra +5.92665 -0.98577 Africa/Accra +6.20602 -1.66191 Africa/Accra +5.60106 -0.07713 Africa/Accra +5.80893 -0.35026 Africa/Accra +6.55121 -0.7662 Africa/Accra +10.89557 -1.0921 Africa/Accra +7.06273 -1.4001 Africa/Accra +5.6658 -0.16308 Africa/Accra +6.68848 -1.62443 Africa/Accra +6.99536 0.29306 Africa/Accra +6.61667 -1.21667 Africa/Accra +6.09408 -0.25913 Africa/Accra +8.05627 -1.73058 Africa/Accra +5.91793 0.9879 Africa/Accra +7.15181 0.47362 Africa/Accra +6.60084 0.4713 Africa/Accra +5.57714 -0.31035 Africa/Accra +5.70119 -1.28657 Africa/Accra +5.0847 -1.35093 Africa/Accra +7.38558 -1.35617 Africa/Accra +5.96562 -1.77995 Africa/Accra +5.65003 -0.2361 Africa/Accra +5.10535 -1.2466 Africa/Accra +10.78556 -0.85139 Africa/Accra +6.46346 -2.31938 Africa/Accra +7.4534 -2.58404 Africa/Accra +6.38706 -0.37738 Africa/Accra +11.0616 -0.24168 Africa/Accra +4.86992 -2.24046 Africa/Accra +5.86006 -0.6635 Africa/Accra +5.28483 -0.73711 Africa/Accra +5.79473 0.89728 Africa/Accra +6.04024 -0.80876 Africa/Accra +6.80004 -1.08193 Africa/Accra +5.7 -0.33333 Africa/Accra +5.55602 -0.1969 Africa/Accra +5.84802 -0.17449 Africa/Accra +36.14474 -5.35257 Europe/Gibraltar +64.18347 -51.72157 America/Godthab +13.41033 -16.70815 Africa/Banjul +13.35222 -16.43389 Africa/Banjul +13.56667 -15.6 Africa/Banjul +13.27136 -16.64944 Africa/Banjul +13.45274 -16.57803 Africa/Banjul +13.47806 -16.68194 Africa/Banjul +11.45 -11.68333 Africa/Conakry +10.9 -13.03333 Africa/Conakry +11.42282 -9.16852 Africa/Conakry +11.08333 -12.4 Africa/Conakry +7.75624 -8.8179 Africa/Conakry +10.37546 -12.09148 Africa/Conakry +8.54351 -9.47099 Africa/Conakry +11.31823 -12.28332 Africa/Conakry +9.1848 -10.09987 Africa/Conakry +10.05692 -12.86576 Africa/Conakry +10.38542 -9.30568 Africa/Conakry +10.66667 -14.6 Africa/Conakry +8.56744 -10.1336 Africa/Conakry +10.45 -13.53333 Africa/Conakry +9.70556 -13.37694 Africa/Conakry +9.53795 -13.67729 Africa/Conakry +9.535 -13.68778 Africa/Conakry +10.94094 -14.29665 Africa/Conakry +16.33238 -61.69793 America/Guadeloupe +16.22636 -61.37919 America/Guadeloupe +16.2422 -61.5343 America/Guadeloupe +16.19135 -61.59159 America/Guadeloupe +16.27095 -61.50451 America/Guadeloupe +16.33315 -61.34728 America/Guadeloupe +16.20685 -61.49329 America/Guadeloupe +16.04322 -61.56596 America/Guadeloupe +15.99854 -61.72548 America/Guadeloupe +16.26738 -61.58543 America/Guadeloupe +2.15106 11.33528 Africa/Malabo +3.75 8.78333 Africa/Malabo +1.86391 9.76582 Africa/Malabo +37.84221 23.77651 Europe/Athens +39.36667 22.94583 Europe/Athens +37.96105 23.753 Europe/Athens +37.50889 22.37944 Europe/Athens +39.55528 21.7675 Europe/Athens +38.325 23.31889 Europe/Athens +37.07333 22.42972 Europe/Athens +37.96427 23.49649 Europe/Athens +35.36687 24.47487 Europe/Athens +38.95 20.75 Europe/Athens +37.67513 21.44102 Europe/Athens +37.94745 23.63708 Europe/Athens +38.04187 23.68494 Europe/Athens +38.01667 23.7 Europe/Athens +37.96775 23.5721 Europe/Athens +38.24444 21.73444 Europe/Athens +37.92066 23.70916 Europe/Athens +37.96667 23.65 Europe/Athens +37.94504 23.71416 Europe/Athens +38.08733 23.97642 Europe/Athens +38.03333 23.7 Europe/Athens +38.03333 23.75 Europe/Athens +38.03333 23.73333 Europe/Athens +38.1 23.81667 Europe/Athens +38.39167 21.8275 Europe/Athens +37.94718 23.67708 Europe/Athens +39.11 26.55472 Europe/Athens +38.05 23.83333 Europe/Athens +37.99471 23.34324 Europe/Athens +37.96667 24 Europe/Athens +38.435 22.87389 Europe/Athens +39.63722 22.42028 Europe/Athens +38.9 22.43333 Europe/Athens +36.89333 27.28889 Europe/Athens +37.89886 23.87181 Europe/Athens +37.94068 22.95734 Europe/Athens +38.07438 23.81106 Europe/Athens +38 23.8 Europe/Athens +38.36778 26.13583 Europe/Athens +35.51124 24.02921 Europe/Athens +38.46361 23.59944 Europe/Athens +38.03058 23.79793 Europe/Athens +37.9625 23.61972 Europe/Athens +39.36556 21.92167 Europe/Athens +37.95 23.7 Europe/Athens +37.03889 22.11417 Europe/Athens +37.91033 23.72361 Europe/Athens +37.96667 23.8 Europe/Athens +38.05282 23.76523 Europe/Athens +35.32787 25.14341 Europe/Athens +39.6675 20.85083 Europe/Athens +38.01667 23.75 Europe/Athens +37.88333 23.73333 Europe/Athens +38.04135 23.54295 Europe/Athens +37.98333 23.66667 Europe/Athens +38.01667 23.83333 Europe/Athens +37.97945 23.71622 Europe/Athens +38.06134 23.58971 Europe/Athens +39.16056 20.98528 Europe/Athens +37.63333 22.73333 Europe/Athens +38.08333 23.7 Europe/Athens +38.05 23.8 Europe/Athens +37.8 21.35 Europe/Athens +38.08333 23.73333 Europe/Athens +38.24861 22.08194 Europe/Athens +37.98333 23.68333 Europe/Athens +38.62139 21.40778 Europe/Athens +36.44083 28.2225 Europe/Athens +40.79194 22.4075 Europe/Athens +41.13488 24.888 Europe/Athens +40.52437 22.20242 Europe/Athens +40.64362 22.93086 Europe/Athens +40.64944 22.95083 Europe/Athens +41.08499 23.54757 Europe/Athens +40.51472 21.67861 Europe/Athens +40.66671 22.94881 Europe/Athens +40.59918 22.98613 Europe/Athens +40.49874 22.92617 Europe/Athens +40.58779 23.0315 Europe/Athens +41.50306 26.52972 Europe/Athens +40.73083 22.91722 Europe/Athens +40.62944 22.06806 Europe/Athens +40.65829 22.89712 Europe/Athens +40.30111 21.78639 Europe/Athens +41.11917 25.40535 Europe/Athens +40.99302 22.87433 Europe/Athens +40.93959 24.40687 Europe/Athens +40.26956 22.50608 Europe/Athens +40.5825 22.95028 Europe/Athens +40.78197 21.40981 Europe/Athens +40.8026 22.04751 Europe/Athens +41.15283 24.1473 Europe/Athens +40.84995 25.87644 Europe/Athens +39.62 19.91972 Europe/Athens +38.03381 23.82962 Europe/Athens +38.05404 23.806 Europe/Athens +38.02277 23.8576 Europe/Athens +37.98468 23.64711 Europe/Athens +37.97332 23.7909 Europe/Athens +37.96491 23.66511 Europe/Athens +39.37312 22.93375 Europe/Athens +-54.28111 -36.5092 Atlantic/South_Georgia +14.97222 -89.53056 America/Guatemala +14.52694 -90.5875 America/Guatemala +14.48139 -90.53167 America/Guatemala +14.91167 -91.36111 America/Guatemala +14.76694 -90.99417 America/Guatemala +14.64639 -90.73389 America/Guatemala +14.77222 -91.18333 America/Guatemala +14.63528 -90.67639 America/Guatemala +14.63823 -91.22901 America/Guatemala +14.51833 -90.72667 America/Guatemala +14.33333 -91.01667 America/Guatemala +15.03056 -91.14889 America/Guatemala +14.56889 -90.49528 America/Guatemala +14.96667 -91.76667 America/Guatemala +14.78667 -90.45111 America/Guatemala +14.58333 -91.45 America/Guatemala +14.96389 -91.79444 America/Guatemala +14.60972 -90.65694 America/Guatemala +14.71889 -90.64417 America/Guatemala +14.54611 -90.41139 America/Guatemala +14.95 -91.45 America/Guatemala +15.38333 -90.4 America/Guatemala +16.91321 -89.90868 America/Guatemala +14.795 -90.19222 America/Guatemala +14.62 -90.84417 America/Guatemala +15.10278 -90.31806 America/Guatemala +14.53611 -91.67778 America/Guatemala +14.83472 -91.51806 America/Guatemala +13.9274 -90.82166 America/Guatemala +15.72778 -88.59444 America/Guatemala +14.28333 -91.36667 America/Guatemala +16.33111 -89.41694 America/Guatemala +14.50278 -90.55167 America/Guatemala +14.68333 -91.01667 America/Guatemala +14.63167 -90.92694 America/Guatemala +15.4 -89.66667 America/Guatemala +14.40556 -90.69833 America/Guatemala +14.66472 -90.35861 America/Guatemala +14.86667 -91.61667 America/Guatemala +14.6 -91.7 America/Guatemala +15.40583 -91.14611 America/Guatemala +14.85 -91.31667 America/Guatemala +15.48333 -88.81667 America/Guatemala +15.04361 -91.40861 America/Guatemala +14.63333 -90.60639 America/Guatemala +14.53417 -91.50333 America/Guatemala +14.08333 -91.05 America/Guatemala +14.86667 -91.56667 America/Guatemala +14.29167 -89.89583 America/Guatemala +14.58194 -90.74361 America/Guatemala +14.63472 -89.98889 America/Guatemala +15.66667 -91.73333 America/Guatemala +15.31972 -91.47083 America/Guatemala +15.13333 -89.36667 America/Guatemala +14.46528 -90.44083 America/Guatemala +16.92258 -89.89941 America/Guatemala +14.56667 -89.35 America/Guatemala +14.305 -90.785 America/Guatemala +14.64778 -90.79278 America/Guatemala +14.65 -91.58333 America/Guatemala +15.53333 -89.35 America/Guatemala +14.27639 -90.29889 America/Guatemala +15.08333 -91.71667 America/Guatemala +14.74111 -90.8875 America/Guatemala +14.71667 -91.73333 America/Guatemala +15.47083 -90.37083 America/Guatemala +14.7 -91.86667 America/Guatemala +14.52639 -90.75972 America/Guatemala +14.64072 -90.51327 America/Guatemala +15.81667 -90.28333 America/Guatemala +14.8 -89.54583 America/Guatemala +14.70833 -90.49944 America/Guatemala +14.66111 -90.81944 America/Guatemala +14.93333 -91.11667 America/Guatemala +14.53333 -91.31667 America/Guatemala +14.81667 -91.45 America/Guatemala +14.30944 -90.36111 America/Guatemala +14.33083 -89.71083 America/Guatemala +14.56111 -90.73444 America/Guatemala +14.4875 -90.61528 America/Guatemala +14.48028 -90.8075 America/Guatemala +13.48773 144.78138 Pacific/Guam +13.53605 144.88855 Pacific/Guam +13.47191 144.74978 Pacific/Guam +13.51777 144.8391 Pacific/Guam +13.47567 144.74886 Pacific/Guam +13.44761 144.80109 Pacific/Guam +11.86357 -15.59767 Africa/Bissau +12.16667 -14.66667 Africa/Bissau +6.24793 -57.5171 America/Guyana +6.00809 -58.30714 America/Guyana +6.80448 -58.15527 America/Guyana +22.37066 114.10479 Asia/Hong_Kong +22.45 114.03333 Asia/Hong_Kong +22.39175 113.97157 Asia/Hong_Kong +22.45007 114.16877 Asia/Hong_Kong +22.38333 114.18333 Asia/Hong_Kong +22.31667 114.18333 Asia/Hong_Kong +22.28552 114.15769 Asia/Hong_Kong +15.82562 -87.92968 America/Tegucigalpa +15.1375 -87.12778 America/Tegucigalpa +15.31667 -88 America/Tegucigalpa +15.68333 -86 America/Tegucigalpa +15.78333 -87.45 America/Tegucigalpa +14.0818 -87.20681 America/Tegucigalpa +14.6 -87.83333 America/Tegucigalpa +14.76667 -88.77917 America/Tegucigalpa +14.91944 -88.23611 America/Tegucigalpa +15.50417 -88.025 America/Tegucigalpa +13.42417 -87.44722 America/Tegucigalpa +15.23333 -87.96667 America/Tegucigalpa +15.48131 -86.57415 America/Tegucigalpa +14.31944 -87.67917 America/Tegucigalpa +15.43333 -87.91667 America/Tegucigalpa +15.75971 -86.78221 America/Tegucigalpa +14.66667 -86.21944 America/Tegucigalpa +15.4 -87.8 America/Tegucigalpa +13.86667 -86.55 America/Tegucigalpa +14.03333 -86.58333 America/Tegucigalpa +14.45139 -87.6375 America/Tegucigalpa +15.4 -88.15 America/Tegucigalpa +13.30028 -87.19083 America/Tegucigalpa +15.61444 -87.95302 America/Tegucigalpa +45.85639 15.80778 Europe/Zagreb +45.81444 15.97798 Europe/Zagreb +44.11972 15.24222 Europe/Zagreb +45.34333 18.99972 Europe/Zagreb +45.83194 17.38389 Europe/Zagreb +45.28833 18.80472 Europe/Zagreb +45.7125 16.07556 Europe/Zagreb +46.30444 16.33778 Europe/Zagreb +43.50891 16.43915 Europe/Zagreb +43.5432 16.49314 Europe/Zagreb +45.16028 18.01556 Europe/Zagreb +45.34028 17.68528 Europe/Zagreb +45.46611 16.37833 Europe/Zagreb +43.72722 15.90583 Europe/Zagreb +45.83111 16.11639 Europe/Zagreb +45.80306 15.71806 Europe/Zagreb +45.34306 14.40917 Europe/Zagreb +44.86833 13.84806 Europe/Zagreb +45.55111 18.69389 Europe/Zagreb +46.16278 16.8275 Europe/Zagreb +45.48722 15.54778 Europe/Zagreb +42.64807 18.09216 Europe/Zagreb +46.38444 16.43389 Europe/Zagreb +45.89861 16.84889 Europe/Zagreb +45.80846 15.88245 Europe/Zagreb +45.81313 15.97753 Europe/Zagreb +19.05 -72.46667 America/Port-au-Prince +18.65094 -72.09191 America/Port-au-Prince +19.43799 -72.19794 America/Port-au-Prince +19.10819 -72.69379 America/Port-au-Prince +19.9389 -72.83257 America/Port-au-Prince +18.53917 -72.335 America/Port-au-Prince +18.4294 -72.86297 America/Port-au-Prince +18.5125 -72.28528 America/Port-au-Prince +18.44232 -73.08758 America/Port-au-Prince +19.70409 -72.40027 America/Port-au-Prince +18.50959 -72.63147 America/Port-au-Prince +18.44773 -72.28485 America/Port-au-Prince +18.65 -74.11667 America/Port-au-Prince +18.23417 -72.53472 America/Port-au-Prince +19.15 -72.01667 America/Port-au-Prince +18.55 -72.51667 America/Port-au-Prince +18.4262 -72.76653 America/Port-au-Prince +19.44749 -72.68903 America/Port-au-Prince +18.50583 -71.97667 America/Port-au-Prince +18.9916 -72.38528 America/Port-au-Prince +18.54472 -72.30278 America/Port-au-Prince +18.57512 -72.22302 America/Port-au-Prince +18.2 -73.75 America/Port-au-Prince +18.54114 -72.39922 America/Port-au-Prince +19.75778 -72.20417 America/Port-au-Prince +19.93333 -72.83333 America/Port-au-Prince +47.18333 20.41667 Europe/Budapest +47.93333 21.08333 Europe/Budapest +47.18333 20.2 Europe/Budapest +46.65627 20.27201 Europe/Budapest +46.253 20.14824 Europe/Budapest +46.86667 20.55 Europe/Budapest +48.39492 21.65871 Europe/Budapest +47.31667 21.11667 Europe/Budapest +48.21667 20.3 Europe/Budapest +46.56667 20.66667 Europe/Budapest +47.95539 21.71671 Europe/Budapest +48.1 20.78333 Europe/Budapest +47 20.63333 Europe/Budapest +47.81667 20.58333 Europe/Budapest +47.95528 22.32348 Europe/Budapest +46.21667 20.48333 Europe/Budapest +48.21667 22.08333 Europe/Budapest +48.25 20.63333 Europe/Budapest +47.31667 20.93333 Europe/Budapest +46.41667 20.33333 Europe/Budapest +47.45 21.4 Europe/Budapest +47.85 21.43333 Europe/Budapest +47.66667 21.51667 Europe/Budapest +46.65 21.28333 Europe/Budapest +46.93333 20.83333 Europe/Budapest +47.90265 20.37329 Europe/Budapest +47.53333 21.63333 Europe/Budapest +46.71332 20.14242 Europe/Budapest +47.21667 21.55 Europe/Budapest +46.68333 21.1 Europe/Budapest +46.76667 21.13333 Europe/Budapest +47.61667 21.35 Europe/Budapest +47.1899 20.00476 Europe/Budapest +46.84 16.84389 Europe/Budapest +47.09327 17.91149 Europe/Budapest +47.40705 19.28648 Europe/Budapest +47.19936 18.13954 Europe/Budapest +47.77591 19.13612 Europe/Budapest +47.58494 18.39325 Europe/Budapest +47.65289 18.31838 Europe/Budapest +46.88152 17.44117 Europe/Budapest +47.23088 16.62155 Europe/Budapest +47.34382 19.04335 Europe/Budapest +47.66943 19.07561 Europe/Budapest +46.35014 18.70905 Europe/Budapest +47.18995 18.41034 Europe/Budapest +47.32579 18.92142 Europe/Budapest +47.68501 16.59049 Europe/Budapest +46.90412 18.058 Europe/Budapest +47.25395 16.93525 Europe/Budapest +48.09872 19.80303 Europe/Budapest +46.08333 18.23333 Europe/Budapest +47.9126 19.97709 Europe/Budapest +47.33004 17.4674 Europe/Budapest +46.62648 18.85962 Europe/Budapest +47.48671 18.31225 Europe/Budapest +47.03419 19.77857 Europe/Budapest +46.45347 16.99104 Europe/Budapest +47.86788 17.26994 Europe/Budapest +47.35133 19.44734 Europe/Budapest +45.99306 18.68306 Europe/Budapest +46.19278 18.26494 Europe/Budapest +47.74318 18.11913 Europe/Budapest +46.43402 19.4848 Europe/Budapest +46.71213 19.84458 Europe/Budapest +46.62139 19.28528 Europe/Budapest +46.76812 17.24317 Europe/Budapest +46.90618 19.69128 Europe/Budapest +46.36667 17.8 Europe/Budapest +46.52639 18.98583 Europe/Budapest +47.5 19.91667 Europe/Budapest +47.66667 19.68333 Europe/Budapest +47.68333 17.63512 Europe/Budapest +47.78257 19.928 Europe/Budapest +47.38449 19.2214 Europe/Budapest +47.59657 19.35515 Europe/Budapest +47.68324 19.13417 Europe/Budapest +47.6177 19.1887 Europe/Budapest +47.7928 18.74148 Europe/Budapest +47.39489 18.9136 Europe/Budapest +46.98333 18.93333 Europe/Budapest +47.6364 19.13864 Europe/Budapest +47.3545 19.09822 Europe/Budapest +46.37657 18.13696 Europe/Budapest +47.18594 19.31091 Europe/Budapest +47.17266 19.79952 Europe/Budapest +47.49801 19.03991 Europe/Budapest +47.46181 18.95845 Europe/Budapest +48.07296 19.29614 Europe/Budapest +46.17496 18.95639 Europe/Budapest +47.10196 17.55892 Europe/Budapest +47.49192 19.01493 Europe/Budapest +47.47603 19.03605 Europe/Budapest +47.48299 19.06591 Europe/Budapest +47.48919 19.07012 Europe/Budapest +47.50045 19.06875 Europe/Budapest +47.50369 19.06583 Europe/Budapest +47.5183 19.10789 Europe/Budapest +47.52978 19.08068 Europe/Budapest +47.56182 19.08909 Europe/Budapest +47.56263 19.11681 Europe/Budapest +47.51482 19.17028 Europe/Budapest +47.4791 19.15835 Europe/Budapest +47.45293 19.14943 Europe/Budapest +47.44417 19.17595 Europe/Budapest +47.39788 19.11492 Europe/Budapest +47.42698 19.04016 Europe/Budapest +47.43047 19.07098 Europe/Budapest +47.43674 19.10093 Europe/Budapest +47.47997 19.25388 Europe/Budapest +47.54157 19.04501 Europe/Budapest +47.51291 19.03184 Europe/Budapest +47.49705 19.03961 Europe/Budapest +3.001 99.8164 Asia/Jakarta +3.3285 99.1625 Asia/Jakarta +4.0613 98.3699 Asia/Jakarta +2.96667 99.8 Asia/Jakarta +3.5765 98.6151 Asia/Jakarta +3.761 98.4513 Asia/Jakarta +5.3848 95.9609 Asia/Jakarta +1.74016 98.78117 Asia/Jakarta +5.88969 95.31644 Asia/Jakarta +5.21667 96.28333 Asia/Jakarta +2.1 99.83333 Asia/Jakarta +3.6253 98.864 Asia/Jakarta +3.5679 98.956 Asia/Jakarta +2.9595 99.0687 Asia/Jakarta +4.0238 98.2782 Asia/Jakarta +1.37952 99.27146 Asia/Jakarta +4.1363 96.1285 Asia/Jakarta +3.58333 98.66667 Asia/Jakarta +5.1801 97.1507 Asia/Jakarta +4.4683 97.9683 Asia/Jakarta +3.7278 98.6738 Asia/Jakarta +2.9845 99.6158 Asia/Jakarta +3.1001 98.4908 Asia/Jakarta +3.5078 98.6839 Asia/Jakarta +5.203 96.7009 Asia/Jakarta +3.6001 98.4854 Asia/Jakarta +3.7755 98.6832 Asia/Jakarta +2.05 99.75 Asia/Jakarta +5.5577 95.3222 Asia/Jakarta +-7.78278 110.36083 Asia/Jakarta +-7.36 109.9025 Asia/Jakarta +-6.98333 109.61667 Asia/Jakarta +-7.9908 114.4009 Asia/Jakarta +-6.8922 109.619 Asia/Jakarta +-6.711 108.5037 Asia/Jakarta +-6.9713 110.0666 Asia/Jakarta +-6.8 110.71667 Asia/Jakarta +-7.74306 110.57944 Asia/Jakarta +-4.5386 120.3279 Asia/Makassar +-7.51611 109.05389 Asia/Jakarta +-7.1749 107.9808 Asia/Jakarta +-9.6567 120.2641 Asia/Makassar +-7.13972 110.405 Asia/Jakarta +-5.14 119.4221 Asia/Makassar +-8.5098 115.2654 Asia/Makassar +-8.0657 111.9025 Asia/Jakarta +-7.4737 112.6505 Asia/Jakarta +-6.8976 112.0649 Asia/Jakarta +-5.6193 132.7886 Asia/Jayapura +-7.71833 110.65889 Asia/Jakarta +-8.0764 111.70641 Asia/Jakarta +1.3054 124.91261 Asia/Makassar +1.31678 124.80379 Asia/Makassar +0.79065 127.38424 Asia/Jayapura +-4.87898 105.21818 Asia/Jakarta +-6.8694 109.1402 Asia/Jakarta +-6.5397 111.0518 Asia/Jakarta +-7.3274 108.2207 Asia/Jakarta +-6.93333 109.16667 Asia/Jakarta +3.31332 117.59152 Asia/Makassar +0.91667 104.45 Asia/Jakarta +-2.73353 107.63477 Asia/Jakarta +-5.42544 105.25803 Asia/Jakarta +-3.93728 103.80465 Asia/Jakarta +-7.49958 112.69992 Asia/Jakarta +-6.17806 106.63 Asia/Jakarta +-8.5413 115.12522 Asia/Makassar +-7.55611 110.83167 Asia/Jakarta +-7.24917 112.75083 Asia/Jakarta +0.7 108.9 Asia/Pontianak +-2.0561 101.3913 Asia/Jakarta +-1.85442 106.12215 Asia/Jakarta +-7.01667 113.86667 Asia/Jakarta +-6.85 107.91667 Asia/Jakarta +-8.15856 112.48292 Asia/Jakarta +-6.76028 108.48306 Asia/Jakarta +-8.49317 117.42024 Asia/Makassar +-7.45806 109.28806 Asia/Jakarta +-6.91806 106.92667 Asia/Jakarta +-8.40003 114.26661 Asia/Jakarta +-7.93861 110.25056 Asia/Jakarta +-7.42639 111.02222 Asia/Jakarta +-0.87956 131.26104 Asia/Jayapura +-7.03306 107.51833 Asia/Jakarta +-0.8006 100.6571 Asia/Jakarta +-7.48315 112.42704 Asia/Jakarta +0.73333 127.55 Asia/Jayapura +-9.86071 124.28395 Asia/Makassar +-7.71556 110.35556 Asia/Jakarta +-6.9816 109.1407 Asia/Jakarta +-7.70623 114.00976 Asia/Jakarta +-5.1241 120.253 Asia/Makassar +-7.8924 112.6658 Asia/Jakarta +-8.31667 114.23333 Asia/Jakarta +0.90925 108.98463 Asia/Pontianak +-4.1279 120.0297 Asia/Makassar +-8.112 115.08818 Asia/Makassar +-7.3515 108.111 Asia/Jakarta +-1.26424 104.09701 Asia/Jakarta +-0.7005 100.9774 Asia/Jakarta +-7.4478 112.7183 Asia/Jakarta +-7.4846 108.7923 Asia/Jakarta +-7.87639 110.35889 Asia/Jakarta +-6.31694 106.66417 Asia/Jakarta +-6.1149 106.1502 Asia/Jakarta +-6.11889 106.575 Asia/Jakarta +-6.9932 110.4203 Asia/Jakarta +-7.78333 110.86667 Asia/Jakarta +-6.40278 106.77444 Asia/Jakarta +-2.5315 112.9496 Asia/Pontianak +-7.1872 113.2394 Asia/Jakarta +-0.48585 117.1466 Asia/Makassar +-7.33194 110.49278 Asia/Jakarta +-8.6136 120.4721 Asia/Makassar +-6.15917 107.29806 Asia/Jakarta +-6.7036 111.3416 Asia/Jakarta +-2.9701 119.8978 Asia/Makassar +-6.3591 106.2494 Asia/Jakarta +-7.0981 109.3243 Asia/Jakarta +-7.221 108.1896 Asia/Jakarta +-7.42139 109.23444 Asia/Jakarta +-7.0868 110.9158 Asia/Jakarta +-6.55694 107.44333 Asia/Jakarta +-7.38806 109.36389 Asia/Jakarta +-7.95222 110.34861 Asia/Jakarta +-7.7543 113.2159 Asia/Jakarta +-7.68333 112.61667 Asia/Jakarta +-8.70536 116.27036 Asia/Makassar +-7.75 110.49417 Asia/Jakarta +-1.3959 120.7524 Asia/Makassar +-0.03109 109.32199 Asia/Pontianak +-7.8685 111.462 Asia/Jakarta +-3.4324 119.3435 Asia/Makassar +-6.705 108.47278 Asia/Jakarta +-6.88333 109.43333 Asia/Jakarta +-3.43447 104.23056 Asia/Jakarta +1.16667 108.96667 Asia/Pontianak +-6.9 109.36667 Asia/Jakarta +-6.9875 106.55139 Asia/Jakarta +0.53333 101.45 Asia/Jakarta +-6.8886 109.6753 Asia/Jakarta +-6.6978 110.7107 Asia/Jakarta +-0.2159 100.6334 Asia/Jakarta +-6.7559 111.038 Asia/Jakarta +-7.6453 112.9075 Asia/Jakarta +-7.1026 107.7641 Asia/Jakarta +-6.17028 106.53028 Asia/Jakarta +-6.42139 106.73306 Asia/Jakarta +-0.61898 100.11997 Asia/Jakarta +-4.0135 119.6255 Asia/Makassar +-7.7679 112.198 Asia/Jakarta +-7.72528 114.09954 Asia/Jakarta +-2.12914 106.11377 Asia/Jakarta +-2.6832 111.6259 Asia/Pontianak +-6.3084 106.1067 Asia/Jakarta +-7.65268 112.6875 Asia/Jakarta +-7.91306 110.29361 Asia/Jakarta +-7.70181 113.91844 Asia/Jakarta +-6.34278 106.73833 Asia/Jakarta +-7.01833 107.60389 Asia/Jakarta +-7.1568 113.4746 Asia/Jakarta +-6.28417 107.81056 Asia/Jakarta +-0.8917 119.8707 Asia/Makassar +-2.9925 120.19694 Asia/Makassar +-6.70694 108.42417 Asia/Jakarta +-2.91673 104.7458 Asia/Jakarta +-2.2136 113.9108 Asia/Pontianak +-8.0665 112.5981 Asia/Jakarta +-4.02177 103.25093 Asia/Jakarta +-0.94924 100.35427 Asia/Jakarta +-6.87666 112.37606 Asia/Jakarta +-8.1058 112.01591 Asia/Jakarta +-7.68386 112.25804 Asia/Jakarta +-7.4038 111.4461 Asia/Jakarta +-7.6051 111.9035 Asia/Jakarta +-8.31507 114.60255 Asia/Makassar +-3.35989 135.50074 Asia/Jayapura +-2.06719 105.16228 Asia/Jakarta +-7.58111 110.29278 Asia/Jakarta +-8.43333 114.33333 Asia/Jakarta +-7.0268 110.5158 Asia/Jakarta +-7.4664 112.4338 Asia/Jakarta +-7.56667 112.35 Asia/Jakarta +-6.53333 110.7 Asia/Jakarta +-5.11306 105.30667 Asia/Jakarta +-7.52 110.22639 Asia/Jakarta +-7.73333 110.36667 Asia/Jakarta +-8.6199 122.2111 Asia/Makassar +-8.58333 116.11667 Asia/Makassar +-3.4109 114.8642 Asia/Makassar +-7.1 109.01667 Asia/Jakarta +-6.97083 107.5675 Asia/Jakarta +-0.86667 134.08333 Asia/Jayapura +-2.46667 111.03333 Asia/Pontianak +-2.88333 108.26667 Asia/Jakarta +-1.0163 103.59331 Asia/Jakarta +1.48218 124.84892 Asia/Makassar +-7.9797 112.6304 Asia/Jakarta +-3.5403 118.9707 Asia/Makassar +-7.2975 108.7642 Asia/Jakarta +-6.83611 108.22778 Asia/Jakarta +-7.47056 110.21778 Asia/Jakarta +-7.6298 111.5239 Asia/Jakarta +-0.9516 122.7875 Asia/Makassar +-8.1335 113.2248 Asia/Jakarta +-3.2945 102.8614 Asia/Jakarta +-0.58295 117.09503 Asia/Makassar +-6.81167 107.6175 Asia/Jakarta +-7.0496 109.1441 Asia/Jakarta +-7.8353 112.6947 Asia/Jakarta +-6.6922 111.4527 Asia/Jakarta +-7.11667 112.41667 Asia/Jakarta +-3.78514 103.54279 Asia/Jakarta +-8.4964 119.8877 Asia/Makassar +-6.3784 105.83 Asia/Jakarta +-7.71694 109.91278 Asia/Jakarta +-8.72332 115.17234 Asia/Makassar +-6.97583 108.48306 Asia/Jakarta +-6.8048 110.8405 Asia/Jakarta +-0.81623 103.46111 Asia/Jakarta +-3.00913 114.38759 Asia/Pontianak +-7.63306 109.24611 Asia/Jakarta +-7.4104 112.5792 Asia/Jakarta +-6.13139 106.37972 Asia/Jakarta +-7.75845 113.39624 Asia/Jakarta +-4.82505 104.8817 Asia/Jakarta +-8.53333 115.4 Asia/Makassar +-7.70583 110.60639 Asia/Jakarta +-6.70944 108.44 Asia/Jakarta +0.9 104.63333 Asia/Jakarta +-6.9383 108.891 Asia/Jakarta +-7.58333 112.1 Asia/Jakarta +-8.1303 112.5727 Asia/Jakarta +-3.9778 122.51507 Asia/Makassar +-8.28333 113.36667 Asia/Jakarta +-9.44667 124.47806 Asia/Makassar +-6.97038 109.64794 Asia/Jakarta +-8.06667 111.91667 Asia/Jakarta +-7.81667 112.01667 Asia/Jakarta +-7.70028 110.56306 Asia/Jakarta +-7.16667 112.6333 Asia/Jakarta +-7.3817 108.2082 Asia/Jakarta +-4.9333 122.5167 Asia/Makassar +-6.8487 108.6422 Asia/Jakarta +-8.45 115.61667 Asia/Makassar +-7.64889 110.625 Asia/Jakarta +-6.46222 108.45194 Asia/Jakarta +-7.16778 112.71917 Asia/Jakarta +-7.0537 113.94244 Asia/Jakarta +-6.715 111.1514 Asia/Jakarta +-7.54595 112.23307 Asia/Jakarta +-7.70361 110.53611 Asia/Jakarta +-8.17211 113.69953 Asia/Jakarta +-6.8057 110.9262 Asia/Jakarta +-6.73361 108.26278 Asia/Jakarta +-7.88333 111.11667 Asia/Jakarta +-6.47472 108.31528 Asia/Jakarta +-7.57722 110.8975 Asia/Jakarta +-1.6 103.61667 Asia/Jakarta +-6.21462 106.84513 Asia/Jakarta +-6.32639 108.32 Asia/Jakarta +-7.60111 110.81861 Asia/Jakarta +-7.15389 112.65611 Asia/Jakarta +0.5412 123.0595 Asia/Makassar +-8.17529 112.63594 Asia/Jakarta +-7.60722 109.51417 Asia/Jakarta +-7.76972 110.29389 Asia/Jakarta +-8.36667 114.15 Asia/Jakarta +-7.39083 112.72667 Asia/Jakarta +-6.735 110.8444 Asia/Jakarta +-7.76667 112.01667 Asia/Jakarta +-8.3939 114.1464 Asia/Jakarta +-5.3166 119.3661 Asia/Makassar +-8.8432 121.6623 Asia/Makassar +1.66711 101.44316 Asia/Jakarta +-6.9 109.08333 Asia/Jakarta +-7.3659 112.6219 Asia/Jakarta +-7.57897 112.23109 Asia/Jakarta +-7.7625 110.43167 Asia/Jakarta +-6.4 106.81861 Asia/Jakarta +-8.65 115.21667 Asia/Makassar +-6.8909 110.6396 Asia/Jakarta +-7.61667 110.68333 Asia/Jakarta +-8.21162 112.74934 Asia/Jakarta +-3.4703 102.5207 Asia/Jakarta +-6.26583 106.55639 Asia/Jakarta +-6.9053 109.5347 Asia/Jakarta +-7.53333 110.75 Asia/Jakarta +-6.48556 106.88194 Asia/Jakarta +-6.7063 108.557 Asia/Jakarta +-6.2375 106.69556 Asia/Jakarta +-6.87222 107.5425 Asia/Jakarta +-6.93889 107.75278 Asia/Jakarta +-6.39472 106.95917 Asia/Jakarta +-6.26111 107.15278 Asia/Jakarta +-6.41972 107.45583 Asia/Jakarta +-6.78139 106.7825 Asia/Jakarta +-6.48167 106.85417 Asia/Jakarta +-7.3257 108.3534 Asia/Jakarta +-7.1475 111.5906 Asia/Jakarta +-7.67417 110.67889 Asia/Jakarta +-6.70611 106.82139 Asia/Jakarta +-6.55472 106.70083 Asia/Jakarta +-6.8748 108.9559 Asia/Jakarta +-0.30907 100.37055 Asia/Jakarta +-7.4281 112.7234 Asia/Jakarta +-7.05 109.55 Asia/Jakarta +-8.1181 111.8935 Asia/Jakarta +-7.53306 110.59583 Asia/Jakarta +0.1324 117.4854 Asia/Makassar +-7.91346 113.82145 Asia/Jakarta +-7.1502 111.8817 Asia/Jakarta +-6.59444 106.78917 Asia/Jakarta +-6.9698 111.4186 Asia/Jakarta +-8.0983 112.1681 Asia/Jakarta +1.45697 125.1895 Asia/Makassar +-8.46006 118.72667 Asia/Makassar +-7.73379 113.69785 Asia/Jakarta +-3.80044 102.26554 Asia/Jakarta +-6.2349 106.9896 Asia/Jakarta +-4.12891 104.16695 Asia/Jakarta +-7.3 109.21667 Asia/Jakarta +-7.87 112.52833 Asia/Jakarta +-6.4846 110.7083 Asia/Jakarta +-2.58333 115.38333 Asia/Makassar +-8.2325 114.35755 Asia/Jakarta +-7.51417 109.29417 Asia/Jakarta +-7.88806 110.32889 Asia/Jakarta +-3.31987 114.59075 Asia/Makassar +-7.04528 107.58778 Asia/Jakarta +-8.19 114.9675 Asia/Makassar +-7.1955 107.4313 Asia/Jakarta +-7.0455 112.7351 Asia/Jakarta +-7.59939 112.8186 Asia/Jakarta +-6.90389 107.61861 Asia/Jakarta +-7.95 110.28333 Asia/Jakarta +-7.73333 113.91667 Asia/Jakarta +-1.26753 116.82887 Asia/Makassar +-7.05 109.08333 Asia/Jakarta +1.05949 101.29054 Asia/Jakarta +-7.61278 110.78389 Asia/Jakarta +-6.7674 110.8541 Asia/Jakarta +-7.11282 112.16354 Asia/Jakarta +-9.10611 124.8925 Asia/Makassar +-6.8017 108.6311 Asia/Jakarta +-6.64528 108.41028 Asia/Jakarta +-2.41773 115.24941 Asia/Makassar +-3.69543 128.1814 Asia/Jayapura +-7.26333 110.3975 Asia/Jakarta +-3.33984 128.91975 Asia/Jayapura +-6.9375 109.1325 Asia/Jakarta +-6.83778 107.47278 Asia/Jakarta +-6.82 107.25722 Asia/Jakarta +-6.23639 106.50833 Asia/Jakarta +-6.09889 106.63806 Asia/Jakarta +-7.96556 110.60361 Asia/Jakarta +-7.79556 110.32639 Asia/Jakarta +-7.82694 110.32917 Asia/Jakarta +-7.54972 110.71639 Asia/Jakarta +-7.55194 110.73778 Asia/Jakarta +-7.59083 110.70444 Asia/Jakarta +-10.1718 123.6075 Asia/Makassar +-2.53371 140.71813 Asia/Jayapura +-2.5964 140.6324 Asia/Jayapura +-8.1928 114.9388 Asia/Makassar +-6.36836 107.9558 Asia/Jakarta +-1.24204 116.89419 Asia/Makassar +3.11313 99.17352 Asia/Jakarta +-6.28862 106.71789 Asia/Jakarta +52.33417 -6.4575 Europe/Dublin +52.25833 -7.11194 Europe/Dublin +52.27042 -9.70264 Europe/Dublin +53.2859 -6.37344 Europe/Dublin +53.45972 -6.21806 Europe/Dublin +54.26969 -8.46943 Europe/Dublin +53.18194 -6.79667 Europe/Dublin +53.65278 -6.68139 Europe/Dublin +53.21583 -6.66694 Europe/Dublin +53.53333 -7.35 Europe/Dublin +53.45083 -6.15444 Europe/Dublin +53.35736 -6.44859 Europe/Dublin +52.66472 -8.62306 Europe/Dublin +54.95 -7.73333 Europe/Dublin +53.36583 -6.49556 Europe/Dublin +52.65417 -7.25222 Europe/Dublin +53.27194 -9.04889 Europe/Dublin +53.38917 -6.29694 Europe/Dublin +52.84361 -8.98639 Europe/Dublin +53.29395 -6.13586 Europe/Dublin +54 -6.41667 Europe/Dublin +53.33306 -6.24889 Europe/Dublin +53.71889 -6.34778 Europe/Dublin +51.89797 -8.47061 Europe/Dublin +52.355 -7.70389 Europe/Dublin +53.33861 -6.54361 Europe/Dublin +52.84083 -6.92611 Europe/Dublin +53.38806 -6.37556 Europe/Dublin +53.61278 -6.18194 Europe/Dublin +53.43333 -7.95 Europe/Dublin +53.2747 -6.2253 Europe/Dublin +53.39845 -6.16179 Europe/Dublin +31.76904 35.21633 Asia/Jerusalem +32.96465 35.496 Asia/Jerusalem +32.03317 34.89091 Asia/Jerusalem +31.88078 34.73843 Asia/Jerusalem +32.05043 34.75224 Asia/Jerusalem +32.51725 35.15349 Asia/Jerusalem +32.76021 34.97183 Asia/Jerusalem +32.7922 35.53124 Asia/Jerusalem +32.08088 34.78057 Asia/Jerusalem +33.01667 35.26667 Asia/Jerusalem +32.85301 35.1987 Asia/Jerusalem +31.525 34.59693 Asia/Jerusalem +32.86422 35.29707 Asia/Jerusalem +32.09556 34.95664 Asia/Jerusalem +31.97102 34.78939 Asia/Jerusalem +31.92923 34.86563 Asia/Jerusalem +32.14613 34.8394 Asia/Jerusalem +32.08227 34.81065 Asia/Jerusalem +32.1836 34.87386 Asia/Jerusalem +32.84966 35.06973 Asia/Jerusalem +33.20733 35.57212 Asia/Jerusalem +32.83706 35.0776 Asia/Jerusalem +31.60998 34.76422 Asia/Jerusalem +32.8275 35.08583 Asia/Jerusalem +32.81034 35.11255 Asia/Jerusalem +32.28493 34.98106 Asia/Jerusalem +32.08708 34.88747 Asia/Jerusalem +32.02923 34.85788 Asia/Jerusalem +31.3141 34.62025 Asia/Jerusalem +31.42215 34.58858 Asia/Jerusalem +32.33292 34.85992 Asia/Jerusalem +31.92933 34.79868 Asia/Jerusalem +32.76651 35.05003 Asia/Jerusalem +32.69925 35.30483 Asia/Jerusalem +33.01135 35.09467 Asia/Jerusalem +32.67597 35.23986 Asia/Jerusalem +31.72177 35.10669 Asia/Jerusalem +32.88984 35.40703 Asia/Jerusalem +31.9467 34.8903 Asia/Jerusalem +32.175 34.90694 Asia/Jerusalem +32.91669 35.29918 Asia/Jerusalem +32.11406 34.97624 Asia/Jerusalem +32.81034 35.26009 Asia/Jerusalem +32.7466 35.34242 Asia/Jerusalem +32.9282 35.15705 Asia/Jerusalem +32.01034 34.77918 Asia/Jerusalem +32.15934 34.8932 Asia/Jerusalem +32.16627 34.82536 Asia/Jerusalem +32.81841 34.9885 Asia/Jerusalem +32.43645 34.91956 Asia/Jerusalem +32.07817 34.84858 Asia/Jerusalem +32.07225 34.81253 Asia/Jerusalem +32.2341 34.95023 Asia/Jerusalem +32.26616 35.00893 Asia/Jerusalem +32.72339 35.31622 Asia/Jerusalem +29.55805 34.94821 Asia/Jerusalem +31.07127 35.0337 Asia/Jerusalem +32.69383 35.04686 Asia/Jerusalem +31.73072 34.99293 Asia/Jerusalem +32.49728 35.49632 Asia/Jerusalem +32.08074 34.8338 Asia/Jerusalem +31.25181 34.7913 Asia/Jerusalem +32.02379 34.75185 Asia/Jerusalem +31.66926 34.57149 Asia/Jerusalem +31.79213 34.64966 Asia/Jerusalem +31.25882 35.21282 Asia/Jerusalem +32.92814 35.07647 Asia/Jerusalem +32.63323 35.32522 Asia/Jerusalem +31.89825 35.01051 Asia/Jerusalem +31.77667 35.23417 Asia/Jerusalem +31.78199 35.21961 Asia/Jerusalem +31.93221 35.04416 Asia/Jerusalem +32.1065 35.18449 Asia/Jerusalem +54.15 -4.48333 Europe/Isle_of_Man +33.76969 74.09212 Asia/Kolkata +9.23183 78.78545 Asia/Kolkata +25.96667 94.51667 Asia/Kolkata +25.41961 83.55786 Asia/Kolkata +26.82964 81.32978 Asia/Kolkata +17.68138 77.60743 Asia/Kolkata +20.04262 74.48991 Asia/Kolkata +14.96584 74.71034 Asia/Kolkata +17.59064 80.32146 Asia/Kolkata +13.10129 77.59626 Asia/Kolkata +20.39684 78.13064 Asia/Kolkata +21.16753 75.69761 Asia/Kolkata +16.73308 82.21364 Asia/Kolkata +30.12913 77.28049 Asia/Kolkata +16.77023 77.13754 Asia/Kolkata +26.09716 94.25817 Asia/Kolkata +27.0186 77.17636 Asia/Kolkata +11.36389 76.78525 Asia/Kolkata +28.21109 79.05651 Asia/Kolkata +20.11152 77.13221 Asia/Kolkata +21.47076 78.26858 Asia/Kolkata +20.23014 79.00161 Asia/Kolkata +25.0172 85.64048 Asia/Kolkata +20.73807 78.5967 Asia/Kolkata +21.76454 80.04631 Asia/Kolkata +18 79.58333 Asia/Kolkata +16.36738 78.06889 Asia/Kolkata +22.61198 70.94379 Asia/Kolkata +20.05556 78.95345 Asia/Kolkata +12.9251 79.36626 Asia/Kolkata +17.95276 73.89058 Asia/Kolkata +17.05206 76.99024 Asia/Kolkata +21.11079 73.39365 Asia/Kolkata +16.36188 80.84573 Asia/Kolkata +27.57823 77.69806 Asia/Kolkata +11.51528 79.32186 Asia/Kolkata +18.11692 83.41148 Asia/Kolkata +17.27343 74.53792 Asia/Kolkata +23.69855 72.5521 Asia/Kolkata +17.68009 83.20161 Asia/Kolkata +21.33954 70.74966 Asia/Kolkata +9.58509 77.95787 Asia/Kolkata +8.6961 77.51895 Asia/Kolkata +12.19583 75.80355 Asia/Kolkata +19.4559 72.81136 Asia/Kolkata +16.0518 79.74017 Asia/Kolkata +11.93975 79.49244 Asia/Kolkata +17.3381 77.90441 Asia/Kolkata +16.51928 80.63049 Asia/Kolkata +23.5623 72.74848 Asia/Kolkata +23.52435 77.80972 Asia/Kolkata +8.7 76.73333 Asia/Kolkata +10.56207 76.91305 Asia/Kolkata +15.78204 80.30665 Asia/Kolkata +20.9077 70.36786 Asia/Kolkata +17.77844 83.21577 Asia/Kolkata +13.96065 79.58024 Asia/Kolkata +18.46523 78.86894 Asia/Kolkata +11.10825 78.00113 Asia/Kolkata +12.9184 79.13255 Asia/Kolkata +22.69021 73.56299 Asia/Kolkata +10.37208 79.85095 Asia/Kolkata +9.7 76.33333 Asia/Kolkata +10.16069 77.75883 Asia/Kolkata +9.23921 77.41132 Asia/Kolkata +19.40844 73.26285 Asia/Kolkata +15.39585 73.81568 Asia/Kolkata +22.66079 72.75519 Asia/Kolkata +8.7333 76.7167 Asia/Kolkata +21.01649 75.90991 Asia/Kolkata +25.31668 83.01042 Asia/Kolkata +12.68162 78.62014 Asia/Kolkata +12.50429 79.60556 Asia/Kolkata +20.61728 72.92843 Asia/Kolkata +10.32691 76.95116 Asia/Kolkata +22.53333 72.9 Asia/Kolkata +21.88868 71.87935 Asia/Kolkata +9.74713 76.39522 Asia/Kolkata +19.92672 74.7275 Asia/Kolkata +22.2994 73.20812 Asia/Kolkata +23.78593 72.63893 Asia/Kolkata +14.3097 79.80296 Asia/Kolkata +10.08481 77.96113 Asia/Kolkata +10.44026 78.09999 Asia/Kolkata +8.38095 77.6132 Asia/Kolkata +19.65347 73.14811 Asia/Kolkata +12.61433 79.75748 Asia/Kolkata +30.72986 78.44342 Asia/Kolkata +9.80701 77.32718 Asia/Kolkata +27.31929 82.41838 Asia/Kolkata +9.96936 77.78621 Asia/Kolkata +27.79817 79.23682 Asia/Kolkata +14.9456 77.25928 Asia/Kolkata +18.87813 72.93924 Asia/Kolkata +21.74015 70.28256 Asia/Kolkata +17.40577 78.55911 Asia/Kolkata +26.54706 80.48781 Asia/Kolkata +23.80366 72.39102 Asia/Kolkata +23.33794 75.55931 Asia/Kolkata +31.46493 76.26914 Asia/Kolkata +20.82318 71.03795 Asia/Kolkata +29.58594 77.25398 Asia/Kolkata +23.88745 71.76975 Asia/Kolkata +22.69881 73.11561 Asia/Kolkata +20.85409 79.3242 Asia/Kolkata +19.66529 82.20629 Asia/Kolkata +19.60144 77.68878 Asia/Kolkata +23.52684 80.83745 Asia/Kolkata +17.83841 76.62331 Asia/Kolkata +12.8108 74.8629 Asia/Kolkata +19.21667 73.15 Asia/Kolkata +23.18239 75.77643 Asia/Kolkata +28.00203 79.00926 Asia/Kolkata +10.58806 77.24779 Asia/Kolkata +13.33467 74.74617 Asia/Kolkata +32.92431 75.13573 Asia/Kolkata +18.39258 77.11756 Asia/Kolkata +8.43048 78.02882 Asia/Kolkata +26.75367 92.10215 Asia/Kolkata +23.07564 78.51115 Asia/Kolkata +27.72297 75.47178 Asia/Kolkata +24.57117 73.69183 Asia/Kolkata +23.53333 91.48333 Asia/Kolkata +11.4134 76.69521 Asia/Kolkata +29.46856 76.176 Asia/Kolkata +11.14985 78.59888 Asia/Kolkata +25.51933 90.22284 Asia/Kolkata +17.35967 82.54616 Asia/Kolkata +27.21384 78.23604 Asia/Kolkata +21.38333 79.73333 Asia/Kolkata +13.34149 77.101 Asia/Kolkata +27.5337 82.41653 Asia/Kolkata +18.00804 76.07011 Asia/Kolkata +26.31688 89.66549 Asia/Kolkata +26.26704 94.82415 Asia/Kolkata +8.4855 76.94924 Asia/Kolkata +10.51667 76.21667 Asia/Kolkata +26.16638 75.78824 Asia/Kolkata +9.74172 79.01774 Asia/Kolkata +29.71179 75.90284 Asia/Kolkata +26.02401 75.48182 Asia/Kolkata +26.91667 76.81667 Asia/Kolkata +20.28961 83.15233 Asia/Kolkata +22.74252 88.37326 Asia/Kolkata +8.33248 77.86586 Asia/Kolkata +13.15823 80.30181 Asia/Kolkata +12.66052 79.54308 Asia/Kolkata +12.22662 79.07461 Asia/Kolkata +13.14376 79.90889 Asia/Kolkata +9.3816 76.57489 Asia/Kolkata +13.17594 79.61637 Asia/Kolkata +9.48333 77.83333 Asia/Kolkata +10.91607 75.91862 Asia/Kolkata +9.82556 78.25792 Asia/Kolkata +11.11541 77.35456 Asia/Kolkata +9.88085 78.07252 Asia/Kolkata +13.6355 79.41989 Asia/Kolkata +8.72518 77.68452 Asia/Kolkata +13.68333 79.35 Asia/Kolkata +11.9662 79.20259 Asia/Kolkata +11.38016 77.89444 Asia/Kolkata +10.8155 78.69651 Asia/Kolkata +8.49725 78.11906 Asia/Kolkata +13.68835 75.24548 Asia/Kolkata +13.2563 76.47768 Asia/Kolkata +27.48905 95.35992 Asia/Kolkata +13.11448 80.02713 Asia/Kolkata +12.234 79.65551 Asia/Kolkata +27.9614 79.73962 Asia/Kolkata +24.74413 78.83141 Asia/Kolkata +27.93413 76.85573 Asia/Kolkata +24.6388 93.99638 Asia/Kolkata +10.77269 79.6368 Asia/Kolkata +22.79831 73.21174 Asia/Kolkata +24.39597 71.62577 Asia/Kolkata +10.78523 79.13909 Asia/Kolkata +29.97415 76.83201 Asia/Kolkata +19.19704 72.96356 Asia/Kolkata +29.58653 77.41712 Asia/Kolkata +22.57422 71.19942 Asia/Kolkata +26.42742 88.13112 Asia/Kolkata +29.19203 78.86145 Asia/Kolkata +26.63333 92.8 Asia/Kolkata +16.49379 75.04667 Asia/Kolkata +24.98209 81.64224 Asia/Kolkata +8.96003 77.31525 Asia/Kolkata +10.01531 77.482 Asia/Kolkata +11.74776 75.49338 Asia/Kolkata +21.02694 76.83889 Asia/Kolkata +18.6057 84.23546 Asia/Kolkata +15.53466 76.87562 Asia/Kolkata +24.94216 84.843 Asia/Kolkata +30.39086 78.4803 Asia/Kolkata +25.49109 85.94166 Asia/Kolkata +17.037 74.60171 Asia/Kolkata +31.45112 74.92538 Asia/Kolkata +13.70954 75.81382 Asia/Kolkata +11.02764 79.85425 Asia/Kolkata +28.6686 75.03207 Asia/Kolkata +23.33508 76.04156 Asia/Kolkata +11.7 77.98333 Asia/Kolkata +22.88605 88.01363 Asia/Kolkata +28.2122 76.94954 Asia/Kolkata +16.75319 81.68456 Asia/Kolkata +17.24849 77.57698 Asia/Kolkata +28.97474 78.94243 Asia/Kolkata +26.55063 82.65802 Asia/Kolkata +29.06925 80.1126 Asia/Kolkata +22.30083 87.92592 Asia/Kolkata +31.9498 75.86645 Asia/Kolkata +30.85612 74.92944 Asia/Kolkata +21.5606 74.21258 Asia/Kolkata +12.03454 75.36161 Asia/Kolkata +16.47632 76.31087 Asia/Kolkata +15.46915 73.83285 Asia/Kolkata +18.73502 73.67561 Asia/Kolkata +20.94927 85.23354 Asia/Kolkata +21.3527 72.03524 Asia/Kolkata +22.58868 88.93253 Asia/Kolkata +22.12879 81.86974 Asia/Kolkata +25.3227 73.00322 Asia/Kolkata +29.16348 78.48403 Asia/Kolkata +14.90813 78.01108 Asia/Kolkata +16.81304 81.52874 Asia/Kolkata +16.48333 80.6 Asia/Kolkata +17.14054 79.62044 Asia/Kolkata +25.46333 82.42058 Asia/Kolkata +22.72706 71.64856 Asia/Kolkata +29.3215 73.89979 Asia/Kolkata +21.19594 72.83023 Asia/Kolkata +8.97574 77.41923 Asia/Kolkata +28.31005 75.73271 Asia/Kolkata +26.11503 86.59527 Asia/Kolkata +24.37066 75.95708 Asia/Kolkata +31.53276 76.90594 Asia/Kolkata +22.11667 84.03333 Asia/Kolkata +30.1297 75.80715 Asia/Kolkata +12.56458 75.39085 Asia/Kolkata +13.7 80.01667 Asia/Kolkata +11.02427 77.12565 Asia/Kolkata +31.21448 75.19563 Asia/Kolkata +26.25996 82.07314 Asia/Kolkata +24.64933 76.04423 Asia/Kolkata +27.7 74.46667 Asia/Kolkata +29.02668 79.0576 Asia/Kolkata +9.51272 77.63369 Asia/Kolkata +18.04592 73.01552 Asia/Kolkata +8.62931 77.91281 Asia/Kolkata +16.07277 78.8692 Asia/Kolkata +17.26652 78.25544 Asia/Kolkata +12.96763 79.94197 Asia/Kolkata +13.33933 78.2119 Asia/Kolkata +34.08842 74.80298 Asia/Kolkata +30.22242 78.78341 Asia/Kolkata +27.46599 75.59736 Asia/Kolkata +29.84042 73.45519 Asia/Kolkata +18.29692 83.89732 Asia/Kolkata +28.09712 74.00937 Asia/Kolkata +20.59611 75.61781 Asia/Kolkata +27.89012 78.7467 Asia/Kolkata +21.27851 86.68833 Asia/Kolkata +19.76082 84.42997 Asia/Kolkata +34.28787 74.47219 Asia/Kolkata +28.99587 77.01165 Asia/Kolkata +21.16966 73.56357 Asia/Kolkata +20.83333 83.91667 Asia/Kolkata +27.02462 95.01629 Asia/Kolkata +23.3052 87.41336 Asia/Kolkata +18.94419 84.58449 Asia/Kolkata +13.49112 75.06646 Asia/Kolkata +30.9086 77.10873 Asia/Kolkata +22.53884 72.71984 Asia/Kolkata +25.92493 73.66633 Asia/Kolkata +28.24737 77.06544 Asia/Kolkata +22.70133 78.19895 Asia/Kolkata +25.65154 72.42244 Asia/Kolkata +26.22152 84.35879 Asia/Kolkata +9.44999 77.79797 Asia/Kolkata +11.1194 77.78788 Asia/Kolkata +9.34461 77.42911 Asia/Kolkata +9.84701 78.48358 Asia/Kolkata +23.90806 87.52773 Asia/Kolkata +28.93214 79.70452 Asia/Kolkata +27.56192 80.68265 Asia/Kolkata +26.59356 85.4906 Asia/Kolkata +27.14652 83.75803 Asia/Kolkata +29.41448 77.46877 Asia/Kolkata +18.8276 74.37475 Asia/Kolkata +11.32137 77.00521 Asia/Kolkata +15.63138 76.89271 Asia/Kolkata +18.38865 78.81048 Asia/Kolkata +28.63933 78.64152 Asia/Kolkata +14.61686 74.83087 Asia/Kolkata +27.05745 78.68665 Asia/Kolkata +29.53489 75.02898 Asia/Kolkata +24.1038 77.68959 Asia/Kolkata +24.88838 72.84794 Asia/Kolkata +11.23725 79.73585 Asia/Kolkata +30.64332 76.38489 Asia/Kolkata +13.74155 76.9043 Asia/Kolkata +19.84505 73.99866 Asia/Kolkata +22.80917 88.22944 Asia/Kolkata +15.23094 80.02802 Asia/Kolkata +10.99816 77.03375 Asia/Kolkata +15.76982 76.75581 Asia/Kolkata +16.91845 76.23336 Asia/Kolkata +31.10442 77.16662 Asia/Kolkata +22.61523 84.50208 Asia/Kolkata +20.27386 72.99673 Asia/Kolkata +20.30303 75.65284 Asia/Kolkata +24.82733 92.79787 Asia/Kolkata +25.08317 85.42782 Asia/Kolkata +27.61206 75.13996 Asia/Kolkata +27.68806 78.38114 Asia/Kolkata +26.04306 84.05426 Asia/Kolkata +28.45341 77.69807 Asia/Kolkata +22.43218 69.84158 Asia/Kolkata +23.77617 86.33028 Asia/Kolkata +23.48872 80.10348 Asia/Kolkata +21.71134 71.96179 Asia/Kolkata +13.39141 77.86488 Asia/Kolkata +24.39329 81.87935 Asia/Kolkata +27.26761 80.81029 Asia/Kolkata +18.10483 78.84858 Asia/Kolkata +23.91783 72.37212 Asia/Kolkata +26.98427 94.63784 Asia/Kolkata +22.83333 88.36667 Asia/Kolkata +23.40659 76.70951 Asia/Kolkata +12.42264 76.68439 Asia/Kolkata +22.75278 88.34222 Asia/Kolkata +18.61527 74.69895 Asia/Kolkata +16.521 76.75738 Asia/Kolkata +10.76097 76.27001 Asia/Kolkata +13.1181 79.42025 Asia/Kolkata +17.67152 75.91044 Asia/Kolkata +25.42348 77.66067 Asia/Kolkata +28.73178 79.3139 Asia/Kolkata +21.35161 74.88037 Asia/Kolkata +15.23352 75.57996 Asia/Kolkata +19.76616 74.47738 Asia/Kolkata +13.93157 75.56791 Asia/Kolkata +25.56892 91.88313 Asia/Kolkata +26.71004 88.42851 Asia/Kolkata +27.10813 78.58675 Asia/Kolkata +28.28178 78.01111 Asia/Kolkata +14.2698 75.35643 Asia/Kolkata +14.99053 75.22498 Asia/Kolkata +9.68428 76.35337 Asia/Kolkata +29.32627 78.57448 Asia/Kolkata +24.55971 84.79344 Asia/Kolkata +25.66677 76.69612 Asia/Kolkata +26.51393 85.2934 Asia/Kolkata +25.13915 73.06784 Asia/Kolkata +20.7932 76.69921 Asia/Kolkata +23.24722 88.43302 Asia/Kolkata +27.53733 79.43622 Asia/Kolkata +27.01628 78.12348 Asia/Kolkata +29.44934 77.31282 Asia/Kolkata +24.18817 75.63903 Asia/Kolkata +23.42688 76.27772 Asia/Kolkata +25.14067 85.84332 Asia/Kolkata +27.3912 75.95956 Asia/Kolkata +25.62094 74.92487 Asia/Kolkata +29.35014 77.55062 Asia/Kolkata +25.60213 84.40412 Asia/Kolkata +21.2372 76.22562 Asia/Kolkata +16.70056 76.84136 Asia/Kolkata +27.88142 79.9109 Asia/Kolkata +28.54946 79.3169 Asia/Kolkata +26.05263 82.68134 Asia/Kolkata +23.29356 81.3619 Asia/Kolkata +21.54537 74.47132 Asia/Kolkata +30.16794 76.86977 Asia/Kolkata +28.56681 79.00956 Asia/Kolkata +27.64327 79.93908 Asia/Kolkata +17.1307 76.94361 Asia/Kolkata +23.29312 92.84679 Asia/Kolkata +17.17859 77.28998 Asia/Kolkata +22.45 77.46667 Asia/Kolkata +22.08664 79.55044 Asia/Kolkata +26.15422 78.7812 Asia/Kolkata +29.2088 78.58695 Asia/Kolkata +21.68586 75.0975 Asia/Kolkata +23.2 77.08333 Asia/Kolkata +17.50427 78.54263 Asia/Kolkata +22.54925 71.48324 Asia/Kolkata +26.02301 76.34408 Asia/Kolkata +21.15035 75.88898 Asia/Kolkata +14.97335 75.33724 Asia/Kolkata +15.90412 73.82191 Asia/Kolkata +21.65688 78.79738 Asia/Kolkata +15.76615 75.11778 Asia/Kolkata +11.50526 77.23826 Asia/Kolkata +9.35592 77.92457 Asia/Kolkata +16.39395 80.15135 Asia/Kolkata +24.58224 80.8248 Asia/Kolkata +17.68589 73.99333 Asia/Kolkata +20.59375 74.20338 Asia/Kolkata +18.34351 74.03102 Asia/Kolkata +26.06272 75.01104 Asia/Kolkata +22.98297 72.50196 Asia/Kolkata +29.69224 75.23608 Asia/Kolkata +29.14614 77.61266 Asia/Kolkata +28.44062 74.491 Asia/Kolkata +28.4929 79.0914 Asia/Kolkata +23.56645 76.47194 Asia/Kolkata +21.31506 83.00548 Asia/Kolkata +26.02796 82.91795 Asia/Kolkata +25.37841 81.5113 Asia/Kolkata +21.38586 78.92087 Asia/Kolkata +22.54997 88.22515 Asia/Kolkata +16.25649 74.48195 Asia/Kolkata +30.24608 75.84686 Asia/Kolkata +17.43948 75.19379 Asia/Kolkata +24.92707 76.28649 Asia/Kolkata +16.85438 74.56417 Asia/Kolkata +29.79601 74.4628 Asia/Kolkata +17.62478 78.08669 Asia/Kolkata +19.56784 74.21154 Asia/Kolkata +15.08613 76.54692 Asia/Kolkata +27.07042 80.5146 Asia/Kolkata +27.2884 79.95204 Asia/Kolkata +15.37794 73.90352 Asia/Kolkata +24.7536 71.7728 Asia/Kolkata +22.17146 76.07072 Asia/Kolkata +30.30145 76.457 Asia/Kolkata +22.99227 72.38177 Asia/Kolkata +25.84331 78.90582 Asia/Kolkata +30.83642 76.19262 Asia/Kolkata +25.81299 72.57879 Asia/Kolkata +26.90806 75.19137 Asia/Kolkata +28.58323 78.56689 Asia/Kolkata +21.45 83.96667 Asia/Kolkata +32.56113 75.12494 Asia/Kolkata +25.86077 85.78971 Asia/Kolkata +17.05359 82.17216 Asia/Kolkata +29.23578 77.0138 Asia/Kolkata +18.51652 83.20515 Asia/Kolkata +24.13524 74.04442 Asia/Kolkata +11.65116 78.15867 Asia/Kolkata +22.31038 69.60376 Asia/Kolkata +22.0271 82.96108 Asia/Kolkata +12.94005 75.78388 Asia/Kolkata +13.00334 80.19614 Asia/Kolkata +23.94826 87.68045 Asia/Kolkata +19.45514 76.43946 Asia/Kolkata +22.49183 92.98142 Asia/Kolkata +25.53834 83.22122 Asia/Kolkata +25.24237 87.64908 Asia/Kolkata +27.79593 78.83358 Asia/Kolkata +28.07245 78.7493 Asia/Kolkata +29.12067 78.62148 Asia/Kolkata +25.88504 86.59471 Asia/Kolkata +29.9679 77.54522 Asia/Kolkata +26.77137 84.74197 Asia/Kolkata +23.84251 78.74386 Asia/Kolkata +14.16498 75.02901 Asia/Kolkata +26.73783 80.3435 Asia/Kolkata +29.40572 76.6694 Asia/Kolkata +25.18625 73.45286 Asia/Kolkata +17.61925 77.95263 Asia/Kolkata +16.5587 74.53211 Asia/Kolkata +27.43978 78.03667 Asia/Kolkata +26.24918 77.40786 Asia/Kolkata +25.75355 86.02597 Asia/Kolkata +26.487 79.90243 Asia/Kolkata +30.96878 76.52557 Asia/Kolkata +26.44335 83.61238 Asia/Kolkata +29.86313 77.89126 Asia/Kolkata +15.69935 75.73408 Asia/Kolkata +28.88838 76.5754 Asia/Kolkata +18.43687 73.11964 Asia/Kolkata +12.95629 78.27543 Asia/Kolkata +24.6889 83.06632 Asia/Kolkata +19.9755 76.78844 Asia/Kolkata +22.72394 88.34563 Asia/Kolkata +30.10778 78.29255 Asia/Kolkata +27.3636 75.56838 Asia/Kolkata +28.6937 79.5219 Asia/Kolkata +28.19721 76.61757 Asia/Kolkata +24.53398 81.29596 Asia/Kolkata +25.78553 84.64038 Asia/Kolkata +16.0184 80.82958 Asia/Kolkata +25.85017 84.37794 Asia/Kolkata +24.21641 83.0358 Asia/Kolkata +13.63682 79.5039 Asia/Kolkata +21.52798 86.87156 Asia/Kolkata +23.63628 79.06233 Asia/Kolkata +18.44799 83.65672 Asia/Kolkata +16.49178 74.77391 Asia/Kolkata +14.69743 76.85769 Asia/Kolkata +14.0568 78.75127 Asia/Kolkata +27.55668 77.79017 Asia/Kolkata +26.9832 84.85109 Asia/Kolkata +29.26724 74.40288 Asia/Kolkata +24.92981 75.59209 Asia/Kolkata +21.24749 76.03483 Asia/Kolkata +16.99154 73.31022 Asia/Kolkata +23.33033 75.04032 Asia/Kolkata +29.6854 75.57461 Asia/Kolkata +25.59453 79.56632 Asia/Kolkata +22.28785 82.16767 Asia/Kolkata +28.08137 74.61854 Asia/Kolkata +25.85691 83.85455 Asia/Kolkata +11.46009 78.18635 Asia/Kolkata +23.57267 70.64718 Asia/Kolkata +25.25102 79.06231 Asia/Kolkata +29.64232 79.4334 Asia/Kolkata +23.6164 87.13061 Asia/Kolkata +14.6224 75.62951 Asia/Kolkata +29.52454 74.83689 Asia/Kolkata +26.44931 91.61356 Asia/Kolkata +26.83772 92.66876 Asia/Kolkata +23.34777 85.33856 Asia/Kolkata +21.68734 69.74485 Asia/Kolkata +23.17623 88.56666 Asia/Kolkata +21.39551 79.32702 Asia/Kolkata +24.17737 87.78275 Asia/Kolkata +30.25506 75.24064 Asia/Kolkata +24.467 75.43996 Asia/Kolkata +29.8058 77.45146 Asia/Kolkata +28.80904 79.02896 Asia/Kolkata +29.39484 79.12693 Asia/Kolkata +27.16576 84.32308 Asia/Kolkata +25.26873 83.02934 Asia/Kolkata +22.82815 87.60888 Asia/Kolkata +18.80084 79.45206 Asia/Kolkata +27.25097 75.17893 Asia/Kolkata +23.63018 85.51926 Asia/Kolkata +24.64648 75.94325 Asia/Kolkata +9.2885 79.31271 Asia/Kolkata +13.10089 79.18417 Asia/Kolkata +9.37158 78.83077 Asia/Kolkata +12.72031 77.28176 Asia/Kolkata +16.83636 82.02871 Asia/Kolkata +19.77921 79.36266 Asia/Kolkata +21.03854 71.44345 Asia/Kolkata +25.07145 73.8798 Asia/Kolkata +30.47276 76.58671 Asia/Kolkata +22.30428 74.35511 Asia/Kolkata +21.93954 75.13612 Asia/Kolkata +21.86667 73.5 Asia/Kolkata +21.1 81.03333 Asia/Kolkata +25.05303 87.83048 Asia/Kolkata +22.29161 70.79322 Asia/Kolkata +18.86667 73.9 Asia/Kolkata +25.0277 85.42133 Asia/Kolkata +28.64201 75.38612 Asia/Kolkata +27.23731 76.62243 Asia/Kolkata +24.00826 76.7325 Asia/Kolkata +22.67756 74.94481 Asia/Kolkata +33.37541 74.30838 Asia/Kolkata +9.45296 77.55335 Asia/Kolkata +14.19508 79.15914 Asia/Kolkata +28.02822 74.47304 Asia/Kolkata +26.89802 78.171 Asia/Kolkata +17.00517 81.77784 Asia/Kolkata +29.53583 73.44917 Asia/Kolkata +23.33058 77.78206 Asia/Kolkata +30.31162 78.0934 Asia/Kolkata +26.04259 74.02373 Asia/Kolkata +21.23333 81.63333 Asia/Kolkata +30.65 75.6 Asia/Kolkata +21.9 83.4 Asia/Kolkata +25.61281 88.12449 Asia/Kolkata +16.2047 77.354 Asia/Kolkata +19.39069 74.64979 Asia/Kolkata +17.5921 74.19966 Asia/Kolkata +23.78816 78.39411 Asia/Kolkata +23.53878 86.6735 Asia/Kolkata +24.44406 77.19824 Asia/Kolkata +24.81705 84.63324 Asia/Kolkata +26.2191 81.24499 Asia/Kolkata +23.83238 71.6047 Asia/Kolkata +16.47567 75.1106 Asia/Kolkata +8.88113 76.58469 Asia/Kolkata +25.85643 87.53836 Asia/Kolkata +31.82198 75.37663 Asia/Kolkata +13.44189 79.55314 Asia/Kolkata +12.75975 75.20169 Asia/Kolkata +26.49061 74.55419 Asia/Kolkata +19.9089 77.56825 Asia/Kolkata +26.45811 80.77416 Asia/Kolkata +23.33062 86.36303 Asia/Kolkata +25.77895 87.47422 Asia/Kolkata +19.1798 77.02595 Asia/Kolkata +19.79825 85.82494 Asia/Kolkata +28.51283 80.14829 Asia/Kolkata +26.47079 85.70311 Asia/Kolkata +11.35163 77.16671 Asia/Kolkata +13.36488 78.57141 Asia/Kolkata +18.51957 73.85535 Asia/Kolkata +29.76142 76.55849 Asia/Kolkata +22.23544 76.39295 Asia/Kolkata +9.02165 76.93265 Asia/Kolkata +27.86348 77.20434 Asia/Kolkata +33.87405 74.89955 Asia/Kolkata +9.17489 77.39799 Asia/Kolkata +14.42166 78.22573 Asia/Kolkata +20.72081 78.32086 Asia/Kolkata +26.22287 79.83718 Asia/Kolkata +10.38128 78.82141 Asia/Kolkata +14.7502 78.54813 Asia/Kolkata +24.03215 74.78162 Asia/Kolkata +11.66667 92.75 Asia/Kolkata +26.67324 78.37085 Asia/Kolkata +21.64219 69.60929 Asia/Kolkata +13.04888 80.11488 Asia/Kolkata +16.06547 80.55203 Asia/Kolkata +13.33868 80.19487 Asia/Kolkata +10.76695 75.92523 Asia/Kolkata +11.93381 79.82979 Asia/Kolkata +15.40341 74.01519 Asia/Kolkata +12.51217 79.12405 Asia/Kolkata +10.65825 77.0085 Asia/Kolkata +17.25 81.63333 Asia/Kolkata +19.69386 84.81401 Asia/Kolkata +26.92007 71.91631 Asia/Kolkata +29.58349 80.20947 Asia/Kolkata +17.1168 82.25284 Asia/Kolkata +25.32989 84.40803 Asia/Kolkata +12.33573 76.10003 Asia/Kolkata +9.86667 76.5 Asia/Kolkata +19.79372 75.53519 Asia/Kolkata +26.82799 83.52689 Asia/Kolkata +20.11357 85.83147 Asia/Kolkata +26.38441 73.54394 Asia/Kolkata +30.7974 76.91888 Asia/Kolkata +24.79749 73.05505 Asia/Kolkata +26.88513 78.37496 Asia/Kolkata +18.62292 73.80696 Asia/Kolkata +28.71348 77.65539 Asia/Kolkata +28.63098 79.80338 Asia/Kolkata +29.44964 74.10093 Asia/Kolkata +28.3654 75.60296 Asia/Kolkata +27.62332 80.19986 Asia/Kolkata +25.54842 82.08978 Asia/Kolkata +26.87401 75.24171 Asia/Kolkata +20.47916 84.23162 Asia/Kolkata +16.29078 80.26234 Asia/Kolkata +31.02071 75.78766 Asia/Kolkata +25.66667 94.5 Asia/Kolkata +26.59941 79.46392 Asia/Kolkata +17.99113 74.43177 Asia/Kolkata +27.13102 72.36826 Asia/Kolkata +29.18766 77.82893 Asia/Kolkata +31.2185 75.77166 Asia/Kolkata +22.47681 72.79995 Asia/Kolkata +11.27564 77.58794 Asia/Kolkata +10.11136 76.47478 Asia/Kolkata +11.15255 76.95159 Asia/Kolkata +10.12127 77.54392 Asia/Kolkata +10.29035 79.20156 Asia/Kolkata +12.9343 78.7189 Asia/Kolkata +11.23333 78.88333 Asia/Kolkata +14.08339 77.59588 Asia/Kolkata +16.65363 81.7455 Asia/Kolkata +12.1345 77.89514 Asia/Kolkata +11.40316 79.24103 Asia/Kolkata +18.73734 73.09603 Asia/Kolkata +29.98178 76.58305 Asia/Kolkata +17.07575 82.13905 Asia/Kolkata +18.61357 79.37442 Asia/Kolkata +16.25582 81.14378 Asia/Kolkata +12.0935 75.20249 Asia/Kolkata +28.06626 80.10305 Asia/Kolkata +14.10009 77.28151 Asia/Kolkata +30.15356 78.76998 Asia/Kolkata +20.79205 79.63583 Asia/Kolkata +20.46093 76.93724 Asia/Kolkata +10.42358 79.31949 Asia/Kolkata +31.28083 74.85722 Asia/Kolkata +20.70833 83.13263 Asia/Kolkata +25.60222 85.11936 Asia/Kolkata +30.32715 76.40266 Asia/Kolkata +19.25946 76.43354 Asia/Kolkata +23.89824 79.19392 Asia/Kolkata +23.6658 86.43166 Asia/Kolkata +19.17279 75.17425 Asia/Kolkata +32.27306 75.65256 Asia/Kolkata +9.26667 76.78333 Asia/Kolkata +22.55656 83.46355 Asia/Kolkata +28.32547 76.77858 Asia/Kolkata +17.53334 78.2645 Asia/Kolkata +23.8507 72.12963 Asia/Kolkata +20.57806 86.56063 Asia/Kolkata +28.06631 95.32678 Asia/Kolkata +22.8436 82.19919 Asia/Kolkata +26.88604 74.76602 Asia/Kolkata +18.78303 83.42668 Asia/Kolkata +19.59943 76.21491 Asia/Kolkata +20.88025 75.11723 Asia/Kolkata +18.85018 76.53211 Asia/Kolkata +18.78113 84.08836 Asia/Kolkata +11.01667 75.86667 Asia/Kolkata +28.97809 77.93306 Asia/Kolkata +20.5087 72.94569 Asia/Kolkata +19.26855 76.77081 Asia/Kolkata +8.78333 76.7 Asia/Kolkata +22.19137 78.7579 Asia/Kolkata +9.54633 78.5907 Asia/Kolkata +20.31641 86.6085 Asia/Kolkata +11.95 75.35 Asia/Kolkata +10.92687 79.27056 Asia/Kolkata +30.43853 77.62479 Asia/Kolkata +18.98878 73.11013 Asia/Kolkata +11.77662 79.55269 Asia/Kolkata +24.72147 80.18808 Asia/Kolkata +9.01667 76.51667 Asia/Kolkata +29.39005 76.96949 Asia/Kolkata +22.69089 88.37404 Asia/Kolkata +23.07492 88.28637 Asia/Kolkata +21.59302 78.52888 Asia/Kolkata +17.67924 75.33098 Asia/Kolkata +12.50083 76.67452 Asia/Kolkata +15.49574 73.82624 Asia/Kolkata +23.28552 79.99465 Asia/Kolkata +28.14327 77.32698 Asia/Kolkata +17.60184 80.70509 Asia/Kolkata +10.45034 77.5209 Asia/Kolkata +13.20074 78.74681 Asia/Kolkata +11.93956 78.40152 Asia/Kolkata +12.90816 78.94195 Asia/Kolkata +12.96796 80.15025 Asia/Kolkata +10.72057 77.87951 Asia/Kolkata +10.99175 77.28633 Asia/Kolkata +18.60354 83.75504 Asia/Kolkata +21.52519 71.82308 Asia/Kolkata +28.43205 80.58137 Asia/Kolkata +25.77276 73.32335 Asia/Kolkata +23.36453 81.04374 Asia/Kolkata +10.7744 76.65625 Asia/Kolkata +19.69693 72.76543 Asia/Kolkata +25.02023 79.2318 Asia/Kolkata +18.77257 84.41012 Asia/Kolkata +24.17097 72.43821 Asia/Kolkata +16.5167 81.73 Asia/Kolkata +12.30696 78.07022 Asia/Kolkata +24.63846 87.83893 Asia/Kolkata +13.44917 79.11749 Asia/Kolkata +19.47506 75.38558 Asia/Kolkata +28.17222 78.06358 Asia/Kolkata +26.90424 83.98104 Asia/Kolkata +22.2398 73.08451 Asia/Kolkata +8.24462 77.32581 Asia/Kolkata +29.70885 73.62539 Asia/Kolkata +20.98333 83.06667 Asia/Kolkata +33.46658 76.88488 Asia/Kolkata +27.51234 82.64297 Asia/Kolkata +20.66714 75.35183 Asia/Kolkata +10.77094 76.37844 Asia/Kolkata +18.18158 76.0389 Asia/Kolkata +25.99074 79.45315 Asia/Kolkata +15.50642 80.04867 Asia/Kolkata +22.46756 69.07002 Asia/Kolkata +20.09473 73.92816 Asia/Kolkata +24.41656 82.9859 Asia/Kolkata +16.78806 80.84646 Asia/Kolkata +29.14984 78.40917 Asia/Kolkata +27.23517 94.10357 Asia/Kolkata +26.1975 91.7202 Asia/Kolkata +25.51602 91.2687 Asia/Kolkata +27.56155 73.47141 Asia/Kolkata +29.18351 74.77045 Asia/Kolkata +22.16094 85.50416 Asia/Kolkata +18.67154 78.0988 Asia/Kolkata +26.31397 86.58537 Asia/Kolkata +19.09685 78.34406 Asia/Kolkata +16.399 74.38285 Asia/Kolkata +27.73976 75.78652 Asia/Kolkata +24.62166 74.67999 Asia/Kolkata +20.05756 86.00436 Asia/Kolkata +26.15006 74.00152 Asia/Kolkata +29.83671 76.9319 Asia/Kolkata +12.2649 75.13914 Asia/Kolkata +18.11675 76.75279 Asia/Kolkata +10.165 77.85024 Asia/Kolkata +21.46236 86.76794 Asia/Kolkata +29.32396 78.38673 Asia/Kolkata +16.9027 81.67451 Asia/Kolkata +27.31247 83.7253 Asia/Kolkata +8.39854 77.08586 Asia/Kolkata +28.63576 77.22445 Asia/Kolkata +19.02475 73.31688 Asia/Kolkata +21.45525 76.3934 Asia/Kolkata +14.45363 79.98674 Asia/Kolkata +11.77577 79.66789 Asia/Kolkata +13.09795 77.39575 Asia/Kolkata +8.60267 77.00139 Asia/Kolkata +13.90777 79.89649 Asia/Kolkata +20.12856 85.09563 Asia/Kolkata +31.12612 76.11633 Asia/Kolkata +27.85161 75.27384 Asia/Kolkata +26.36073 75.91836 Asia/Kolkata +24.8867 85.54364 Asia/Kolkata +28.53966 79.63282 Asia/Kolkata +26.93109 81.19934 Asia/Kolkata +26.86452 82.14016 Asia/Kolkata +27.0195 75.00226 Asia/Kolkata +15.55877 75.35305 Asia/Kolkata +23.4067 88.3686 Asia/Kolkata +27.42752 83.41789 Asia/Kolkata +25.38706 87.09856 Asia/Kolkata +10.22776 78.22969 Asia/Kolkata +24.93805 73.82392 Asia/Kolkata +22.68411 77.26887 Asia/Kolkata +25.0503 84.32762 Asia/Kolkata +18.84577 79.46165 Asia/Kolkata +26.30473 74.73364 Asia/Kolkata +19.99727 73.79096 Asia/Kolkata +25.6439 77.9129 Asia/Kolkata +29.59489 76.11816 Asia/Kolkata +17.66727 82.61044 Asia/Kolkata +23.70758 77.09318 Asia/Kolkata +22.95078 79.184 Asia/Kolkata +29.22123 76.14171 Asia/Kolkata +28.04444 76.10833 Asia/Kolkata +15.72299 75.38666 Asia/Kolkata +15.57316 75.80804 Asia/Kolkata +16.74799 77.4954 Asia/Kolkata +30.47696 77.12653 Asia/Kolkata +13.19133 80.18473 Asia/Kolkata +28.19994 78.38472 Asia/Kolkata +28.48451 78.71291 Asia/Kolkata +16.2347 80.04711 Asia/Kolkata +16.4361 81.70159 Asia/Kolkata +18.41428 84.04463 Asia/Kolkata +25.19032 80.475 Asia/Kolkata +26.79069 75.20608 Asia/Kolkata +27.96059 73.55913 Asia/Kolkata +27.86459 81.50036 Asia/Kolkata +12.11802 76.68411 Asia/Kolkata +28.6786 77.06749 Asia/Kolkata +31.38966 76.37574 Asia/Kolkata +15.48879 78.48648 Asia/Kolkata +21.36608 74.23955 Asia/Kolkata +20.83528 76.45839 Asia/Kolkata +15.85668 78.26569 Asia/Kolkata +16.77222 80.28554 Asia/Kolkata +20.30713 74.65733 Asia/Kolkata +19.16023 77.31497 Asia/Kolkata +29.71256 77.4174 Asia/Kolkata +27.19395 95.31929 Asia/Kolkata +11.35833 77.32099 Asia/Kolkata +11.22126 78.16524 Asia/Kolkata +11.455 78.269 Asia/Kolkata +24.3 87.81667 Asia/Kolkata +17.05439 79.26707 Asia/Kolkata +17.81667 76.28182 Asia/Kolkata +29.91972 77.30397 Asia/Kolkata +26.6827 88.22 Asia/Kolkata +31.1259 75.47586 Asia/Kolkata +29.61207 78.34338 Asia/Kolkata +25.77145 75.84978 Asia/Kolkata +22.42743 80.10875 Asia/Kolkata +29.39743 79.44686 Asia/Kolkata +22.89396 88.4152 Asia/Kolkata +27.28912 95.3418 Asia/Kolkata +30.56056 77.29403 Asia/Kolkata +21.14631 79.08491 Asia/Kolkata +24.5705 80.58655 Asia/Kolkata +29.44439 78.43488 Asia/Kolkata +8.17731 77.43437 Asia/Kolkata +23.45834 75.41759 Asia/Kolkata +27.20201 73.73394 Asia/Kolkata +16.4821 78.32471 Asia/Kolkata +13.32139 79.58557 Asia/Kolkata +27.42397 77.09922 Asia/Kolkata +10.76393 79.84454 Asia/Kolkata +12.81938 76.75485 Asia/Kolkata +11.48772 75.77511 Asia/Kolkata +22.69385 72.86157 Asia/Kolkata +27.22288 77.19569 Asia/Kolkata +11.7 75.66667 Asia/Kolkata +24.60658 84.12719 Asia/Kolkata +30.37475 76.15077 Asia/Kolkata +12.29791 76.63925 Asia/Kolkata +26.12259 85.39055 Asia/Kolkata +29.47394 77.70414 Asia/Kolkata +9.98493 76.57728 Asia/Kolkata +10.39531 79.49425 Asia/Kolkata +30.4571 78.05498 Asia/Kolkata +10.95299 78.44427 Asia/Kolkata +22.51136 86.45713 Asia/Kolkata +23.83677 80.39482 Asia/Kolkata +20.73263 77.36714 Asia/Kolkata +24.1839 88.27171 Asia/Kolkata +25.8969 86.99577 Asia/Kolkata +30.78957 76.49733 Asia/Kolkata +19.25395 73.38993 Asia/Kolkata +28.7809 77.49865 Asia/Kolkata +10.08873 77.06269 Asia/Kolkata +25.37556 86.47352 Asia/Kolkata +22.06709 81.68822 Asia/Kolkata +24.4078 78.09666 Asia/Kolkata +27.0631 73.82304 Asia/Kolkata +22.83918 69.7219 Asia/Kolkata +14.97144 75.03658 Asia/Kolkata +15.20677 75.8839 Asia/Kolkata +21.77449 78.25866 Asia/Kolkata +13.09154 74.78437 Asia/Kolkata +15.2807 75.52132 Asia/Kolkata +13.16372 78.39207 Asia/Kolkata +11.8 75.45 Asia/Kolkata +20.0684 79.67812 Asia/Kolkata +30.47764 74.51513 Asia/Kolkata +18.70413 77.36641 Asia/Kolkata +31.95097 75.61488 Asia/Kolkata +27.30854 79.43368 Asia/Kolkata +26.03404 83.38114 Asia/Kolkata +25.61873 83.75499 Asia/Kolkata +25.28183 83.12096 Asia/Kolkata +19.15657 77.50304 Asia/Kolkata +16.33354 75.28305 Asia/Kolkata +16.01187 76.44207 Asia/Kolkata +16.33711 76.13201 Asia/Kolkata +13.06653 74.99525 Asia/Kolkata +26.08866 83.29088 Asia/Kolkata +26.65738 84.91922 Asia/Kolkata +22.90469 73.83912 Asia/Kolkata +21.34071 78.01332 Asia/Kolkata +26.50286 78.00163 Asia/Kolkata +22.8173 70.8377 Asia/Kolkata +26.2264 78.22482 Asia/Kolkata +17.78744 76.4706 Asia/Kolkata +28.83893 78.77684 Asia/Kolkata +26.73583 95.05841 Asia/Kolkata +26.3248 94.51834 Asia/Kolkata +25.39679 85.91923 Asia/Kolkata +24.4975 93.77791 Asia/Kolkata +30.81571 75.17419 Asia/Kolkata +23.46254 73.29857 Asia/Kolkata +27.43201 80.53135 Asia/Kolkata +25.14582 82.56975 Asia/Kolkata +16.8722 79.56247 Asia/Kolkata +28.54012 79.20817 Asia/Kolkata +28.02929 79.66619 Asia/Kolkata +29.29047 77.94789 Asia/Kolkata +13.27918 80.25899 Asia/Kolkata +28.61031 79.16997 Asia/Kolkata +26.2838 78.98016 Asia/Kolkata +17.63359 74.78773 Asia/Kolkata +11.78796 77.8008 Asia/Kolkata +11.29971 76.93485 Asia/Kolkata +26.64859 74.03414 Asia/Kolkata +21.32112 70.44078 Asia/Kolkata +23.17647 88.09749 Asia/Kolkata +10.03241 78.3393 Asia/Kolkata +26.97684 83.10973 Asia/Kolkata +20.1505 76.56841 Asia/Kolkata +28.97155 77.71934 Asia/Kolkata +22.42114 87.32257 Asia/Kolkata +18.04531 78.26078 Asia/Kolkata +11.10354 79.655 Asia/Kolkata +24.60998 93.88873 Asia/Kolkata +29.10436 77.92134 Asia/Kolkata +11.26667 75.91667 Asia/Kolkata +9.25929 76.55642 Asia/Kolkata +30.08333 75.25 Asia/Kolkata +24.66629 81.8741 Asia/Kolkata +25.68355 80.1137 Asia/Kolkata +25.69452 81.92259 Asia/Kolkata +26.26584 78.67108 Asia/Kolkata +25.94167 83.56111 Asia/Kolkata +11.91667 75.58333 Asia/Kolkata +27.50199 77.6833 Asia/Kolkata +26.34197 89.21555 Asia/Kolkata +25.35249 85.03445 Asia/Kolkata +15.40927 73.78868 Asia/Kolkata +15.74041 79.27056 Asia/Kolkata +26.65725 94.31529 Asia/Kolkata +25.60003 82.60187 Asia/Kolkata +25.96927 84.86221 Asia/Kolkata +27.28482 95.66796 Asia/Kolkata +12.19214 79.94193 Asia/Kolkata +27.73645 78.56923 Asia/Kolkata +15.59154 73.80898 Asia/Kolkata +19.30133 76.49735 Asia/Kolkata +15.98949 77.05046 Asia/Kolkata +18.65087 79.66501 Asia/Kolkata +29.99092 75.4012 Asia/Kolkata +23.42564 72.65739 Asia/Kolkata +27.29769 75.9495 Asia/Kolkata +10.66626 79.45064 Asia/Kolkata +10.9914 76.4596 Asia/Kolkata +20.25247 74.44115 Asia/Kolkata +25.53347 89.86373 Asia/Kolkata +19.15599 76.21152 Asia/Kolkata +25.53057 81.37371 Asia/Kolkata +11.1172 76.11987 Asia/Kolkata +25.33891 87.61998 Asia/Kolkata +25.98539 84.17251 Asia/Kolkata +20.31186 77.34484 Asia/Kolkata +25.33061 76.50973 Asia/Kolkata +21.12268 70.11484 Asia/Kolkata +29.79163 77.8793 Asia/Kolkata +12.91723 74.85603 Asia/Kolkata +26.44212 92.03047 Asia/Kolkata +16.40348 80.55846 Asia/Kolkata +25.64728 84.87418 Asia/Kolkata +12.52145 76.89527 Asia/Kolkata +22.83282 69.35238 Asia/Kolkata +21.25526 73.30412 Asia/Kolkata +22.36667 75.38333 Asia/Kolkata +24.07184 75.06986 Asia/Kolkata +22.59974 80.37108 Asia/Kolkata +31.71079 76.93152 Asia/Kolkata +29.48584 78.1259 Asia/Kolkata +16.86254 81.92921 Asia/Kolkata +9.27571 79.12362 Asia/Kolkata +25.19407 75.07215 Asia/Kolkata +25.44126 74.56979 Asia/Kolkata +18.87074 79.42863 Asia/Kolkata +22.23566 75.08917 Asia/Kolkata +21.49813 70.13775 Asia/Kolkata +24.48371 75.26871 Asia/Kolkata +10.60772 78.42582 Asia/Kolkata +9.67318 78.47096 Asia/Kolkata +13.16667 80.26667 Asia/Kolkata +16.05981 73.4629 Asia/Kolkata +13.00273 77.93796 Asia/Kolkata +26.2838 75.36458 Asia/Kolkata +13.35284 74.70833 Asia/Kolkata +11.4892 78.03277 Asia/Kolkata +20.8856 76.20371 Asia/Kolkata +18.36423 81.88728 Asia/Kolkata +26.92223 80.71078 Asia/Kolkata +30.5309 75.87949 Asia/Kolkata +20.5537 74.52881 Asia/Kolkata +12.38613 77.05954 Asia/Kolkata +30.21108 74.48223 Asia/Kolkata +11.04019 76.08237 Asia/Kolkata +27.48652 95.43646 Asia/Kolkata +23.26008 76.1455 Asia/Kolkata +27.04361 74.72445 Asia/Kolkata +26.235 84.14934 Asia/Kolkata +27.23 79.02882 Asia/Kolkata +26.56263 88.8204 Asia/Kolkata +24.26447 80.75941 Asia/Kolkata +27.04594 76.93152 Asia/Kolkata +22.82082 72.94032 Asia/Kolkata +27.66368 80.47371 Asia/Kolkata +25.29222 79.87231 Asia/Kolkata +27.2976 81.12399 Asia/Kolkata +22.18616 87.98072 Asia/Kolkata +26.49471 78.61593 Asia/Kolkata +22.17592 75.58715 Asia/Kolkata +28.26935 76.15253 Asia/Kolkata +22.82359 72.75551 Asia/Kolkata +11.70044 75.53409 Asia/Kolkata +16.74385 77.98597 Asia/Kolkata +17.59728 80.00206 Asia/Kolkata +21.1104 82.09796 Asia/Kolkata +27.14136 83.56524 Asia/Kolkata +26.11066 84.50382 Asia/Kolkata +28.96797 76.29538 Asia/Kolkata +16.3888 75.10873 Asia/Kolkata +18.08333 73.41667 Asia/Kolkata +26.75599 83.12765 Asia/Kolkata +12.957 77.2231 Asia/Kolkata +12.51167 79.88485 Asia/Kolkata +9.91735 78.11962 Asia/Kolkata +10.48134 79.39681 Asia/Kolkata +10.90481 76.96461 Asia/Kolkata +13.08784 80.27847 Asia/Kolkata +12.42602 75.7382 Asia/Kolkata +22.68944 88.44594 Asia/Kolkata +24.27419 86.63929 Asia/Kolkata +13.66013 77.21232 Asia/Kolkata +26.35367 86.07169 Asia/Kolkata +25.92127 86.79271 Asia/Kolkata +15.27501 73.95786 Asia/Kolkata +12.5839 77.04344 Asia/Kolkata +13.5503 78.50288 Asia/Kolkata +16.18747 81.13888 Asia/Kolkata +25.68692 82.41206 Asia/Kolkata +30.91547 76.20134 Asia/Kolkata +16.48333 79.43333 Asia/Kolkata +22.89247 92.74218 Asia/Kolkata +23.12854 73.61065 Asia/Kolkata +30.90015 75.85229 Asia/Kolkata +26.83928 80.92313 Asia/Kolkata +25.1765 86.0947 Asia/Kolkata +27.4 74.91667 Asia/Kolkata +28.75153 77.288 Asia/Kolkata +18.75275 73.40575 Asia/Kolkata +19.98497 76.5214 Asia/Kolkata +23.43313 84.67982 Asia/Kolkata +16.15795 76.52238 Asia/Kolkata +22.56507 71.81076 Asia/Kolkata +24.06067 77.40667 Asia/Kolkata +34.16504 77.58402 Asia/Kolkata +29.11091 77.77767 Asia/Kolkata +30.19406 75.67963 Asia/Kolkata +18.39721 76.56784 Asia/Kolkata +21.7231 71.38843 Asia/Kolkata +23.74395 84.499 Asia/Kolkata +26.20258 83.96792 Asia/Kolkata +26.55951 76.32915 Asia/Kolkata +22.19072 69.96351 Asia/Kolkata +24.69054 78.41888 Asia/Kolkata +10.87419 78.81935 Asia/Kolkata +24.42244 88.25238 Asia/Kolkata +25.93182 81.70478 Asia/Kolkata +25.8673 85.17304 Asia/Kolkata +15.12689 75.46935 Asia/Kolkata +29.75876 78.04086 Asia/Kolkata +23.66667 86.66667 Asia/Kolkata +22.60058 79.60135 Asia/Kolkata +27.952 80.78257 Asia/Kolkata +25.67237 76.17692 Asia/Kolkata +27.71008 80.90069 Asia/Kolkata +26.19401 78.94137 Asia/Kolkata +29.99382 77.04439 Asia/Kolkata +27.65312 74.39993 Asia/Kolkata +27.82294 75.02754 Asia/Kolkata +8.31792 77.19192 Asia/Kolkata +10.7199 79.5157 Asia/Kolkata +10.15 76.73333 Asia/Kolkata +21.6241 69.98494 Asia/Kolkata +9.8 76.33333 Asia/Kolkata +15.75623 76.19112 Asia/Kolkata +11.55028 79.59066 Asia/Kolkata +18.09339 75.41568 Asia/Kolkata +16.68317 74.58892 Asia/Kolkata +12.74768 78.34235 Asia/Kolkata +10.6484 76.07063 Asia/Kolkata +11.30459 75.87772 Asia/Kolkata +13.02319 77.02518 Asia/Kolkata +21.34222 71.30633 Asia/Kolkata +15.25612 75.24735 Asia/Kolkata +28.68362 78.78555 Asia/Kolkata +25.71935 81.51268 Asia/Kolkata +14.42853 74.4189 Asia/Kolkata +27.31657 77.37079 Asia/Kolkata +21.26667 81.51667 Asia/Kolkata +24.37256 77.04922 Asia/Kolkata +10.96209 79.39124 Asia/Kolkata +31.95635 77.11036 Asia/Kolkata +23.73166 86.84372 Asia/Kolkata +25.3202 79.63987 Asia/Kolkata +10.93487 78.41251 Asia/Kolkata +33.64462 75.0187 Asia/Kolkata +22.20801 74.75814 Asia/Kolkata +17.48486 78.41376 Asia/Kolkata +23.72757 85.50616 Asia/Kolkata +14.90467 76.38441 Asia/Kolkata +16.62784 74.85408 Asia/Kolkata +26.98747 73.97108 Asia/Kolkata +27.14745 74.85655 Asia/Kolkata +22.26675 86.17385 Asia/Kolkata +12.66628 76.48812 Asia/Kolkata +23.40576 88.49073 Asia/Kolkata +12.51921 78.21382 Asia/Kolkata +11.24802 75.7804 Asia/Kolkata +17.4 73.76667 Asia/Kolkata +17.0162 81.72934 Asia/Kolkata +14.50011 79.98595 Asia/Kolkata +9.17167 77.86989 Asia/Kolkata +14.82442 76.22005 Asia/Kolkata +9.58692 76.52132 Asia/Kolkata +17.55106 80.61779 Asia/Kolkata +27.70207 76.19911 Asia/Kolkata +23.20383 81.97904 Asia/Kolkata +29.74336 78.51945 Asia/Kolkata +19.14256 82.32536 Asia/Kolkata +10.06178 76.62681 Asia/Kolkata +11.42072 76.86035 Asia/Kolkata +25.18254 75.83906 Asia/Kolkata +22.29344 82.02353 Asia/Kolkata +15.85572 77.24476 Asia/Kolkata +27.794 77.4383 Asia/Kolkata +21.46202 72.95842 Asia/Kolkata +24.11774 78.04007 Asia/Kolkata +18.64573 74.05909 Asia/Kolkata +22.3458 82.69633 Asia/Kolkata +18.82154 78.71186 Asia/Kolkata +18.812 82.71048 Asia/Kolkata +15.34522 76.15478 Asia/Kolkata +19.88239 74.47605 Asia/Kolkata +26.02029 83.56593 Asia/Kolkata +16.20138 74.74886 Asia/Kolkata +22.70508 88.34446 Asia/Kolkata +16.61667 80.53333 Asia/Kolkata +19.59083 81.664 Asia/Kolkata +25.99451 79.15127 Asia/Kolkata +19.89758 86.11413 Asia/Kolkata +24.22388 92.67869 Asia/Kolkata +12.1569 77.10694 Asia/Kolkata +16.69563 74.23167 Asia/Kolkata +25.21942 77.61179 Asia/Kolkata +13.13671 78.12917 Asia/Kolkata +8.17938 77.25818 Asia/Kolkata +26.40107 90.27286 Asia/Kolkata +25.67467 94.11099 Asia/Kolkata +25.5811 84.79632 Asia/Kolkata +10.22222 76.19917 Asia/Kolkata +16.8764 74.1909 Asia/Kolkata +20.79393 70.70216 Asia/Kolkata +24.46802 85.59343 Asia/Kolkata +16.9985 79.9656 Asia/Kolkata +10.23925 77.48932 Asia/Kolkata +26.32539 89.44508 Asia/Kolkata +25.32593 84.25976 Asia/Kolkata +10.30067 76.33763 Asia/Kolkata +28.86663 77.93822 Asia/Kolkata +33.31346 75.76726 Asia/Kolkata +26.5741 74.86685 Asia/Kolkata +26.10282 87.95205 Asia/Kolkata +29.50512 78.2033 Asia/Kolkata +27.13754 77.78644 Asia/Kolkata +19.62368 78.2 Asia/Kolkata +28.91173 79.51535 Asia/Kolkata +28.20307 80.27046 Asia/Kolkata +28.25436 77.85436 Asia/Kolkata +20.18268 85.61629 Asia/Kolkata +24.04344 78.33041 Asia/Kolkata +23.07533 85.27903 Asia/Kolkata +24.07964 91.59972 Asia/Kolkata +18.78562 73.34589 Asia/Kolkata +22.16749 76.8601 Asia/Kolkata +24.03943 76.578 Asia/Kolkata +28.00069 75.78644 Asia/Kolkata +21.67124 74.58535 Asia/Kolkata +27.90308 80.79752 Asia/Kolkata +23.88534 72.61869 Asia/Kolkata +28.86667 77.28333 Asia/Kolkata +24.03165 73.04697 Asia/Kolkata +22.75218 72.68533 Asia/Kolkata +22.97617 86.85462 Asia/Kolkata +28.92221 79.97015 Asia/Kolkata +22.5957 76.91363 Asia/Kolkata +29.2788 77.73196 Asia/Kolkata +26.51839 92.14722 Asia/Kolkata +21.98637 83.10613 Asia/Kolkata +28.87754 76.90836 Asia/Kolkata +21.82526 75.6107 Asia/Kolkata +22.71861 88.37806 Asia/Kolkata +30.74572 76.64702 Asia/Kolkata +18.43997 73.77546 Asia/Kolkata +25.12446 86.55578 Asia/Kolkata +22.33971 87.32501 Asia/Kolkata +21.42264 78.98165 Asia/Kolkata +30.703 76.22106 Asia/Kolkata +21.82451 76.35202 Asia/Kolkata +27.60499 75.502 Asia/Kolkata +15.63968 74.50847 Asia/Kolkata +17.24767 80.14368 Asia/Kolkata +20.70738 76.56827 Asia/Kolkata +22.31744 72.61916 Asia/Kolkata +22.20685 69.65031 Asia/Kolkata +23.22542 79.88005 Asia/Kolkata +26.77447 83.0709 Asia/Kolkata +24.8478 79.93344 Asia/Kolkata +26.94269 77.8189 Asia/Kolkata +21.41879 80.98012 Asia/Kolkata +27.52708 80.75553 Asia/Kolkata +27.94139 77.84373 Asia/Kolkata +25.58282 85.04548 Asia/Kolkata +25.51049 86.47627 Asia/Kolkata +18.5635 73.85205 Asia/Kolkata +27.18333 83.88333 Asia/Kolkata +23.42322 75.28185 Asia/Kolkata +20.18778 83.21949 Asia/Kolkata +25.29275 75.93948 Asia/Kolkata +21.30328 70.24861 Asia/Kolkata +16.01384 75.54631 Asia/Kolkata +20.50166 86.42227 Asia/Kolkata +23.1959 86.51499 Asia/Kolkata +28.8054 79.20396 Asia/Kolkata +25.97132 75.14992 Asia/Kolkata +9.17243 76.50017 Asia/Kolkata +8.57143 78.11992 Asia/Kolkata +22.00827 81.2321 Asia/Kolkata +14.91582 79.9912 Asia/Kolkata +13.21667 80.31667 Asia/Kolkata +9.18333 76.55 Asia/Kolkata +23.79752 86.29834 Asia/Kolkata +12.96951 79.14552 Asia/Kolkata +23.64558 88.13258 Asia/Kolkata +21.26667 78.58333 Asia/Kolkata +25.53852 87.57044 Asia/Kolkata +32.37068 75.52457 Asia/Kolkata +21.28854 72.9407 Asia/Kolkata +22.50254 82.54326 Asia/Kolkata +23.44168 79.79628 Asia/Kolkata +21.77327 79.80554 Asia/Kolkata +22.12745 75.611 Asia/Kolkata +29.21398 78.95693 Asia/Kolkata +27.80544 78.64602 Asia/Kolkata +12.49838 74.98959 Asia/Kolkata +14.81361 74.12972 Asia/Kolkata +10.95771 78.08095 Asia/Kolkata +31.44155 75.49992 Asia/Kolkata +26.88251 88.27729 Asia/Kolkata +28.65156 77.18858 Asia/Kolkata +29.69009 76.98839 Asia/Kolkata +18.4077 75.19386 Asia/Kolkata +13.21051 74.99914 Asia/Kolkata +18.9107 73.32354 Asia/Kolkata +18.43916 79.12856 Asia/Kolkata +24.86919 92.35544 Asia/Kolkata +27.00087 78.93856 Asia/Kolkata +25.46165 78.13941 Asia/Kolkata +22.91581 79.06318 Asia/Kolkata +26.49831 77.02755 Asia/Kolkata +20.48263 77.48748 Asia/Kolkata +22.54243 72.90392 Asia/Kolkata +11.24058 76.96009 Asia/Kolkata +10.0661 78.76786 Asia/Kolkata +10.91667 79.83333 Asia/Kolkata +17.28937 74.18183 Asia/Kolkata +31.38011 75.38105 Asia/Kolkata +25.40529 76.07431 Asia/Kolkata +23.02153 73.07213 Asia/Kolkata +29.05952 78.62874 Asia/Kolkata +20.46709 82.92042 Asia/Kolkata +27.80961 79.79228 Asia/Kolkata +26.4478 80.34627 Asia/Kolkata +22.66684 76.73787 Asia/Kolkata +8.09008 77.53841 Asia/Kolkata +27.0546 79.922 Asia/Kolkata +12.30814 75.10632 Asia/Kolkata +20.25784 75.138 Asia/Kolkata +20.27224 81.49202 Asia/Kolkata +23.43362 85.3211 Asia/Kolkata +16.2661 73.71217 Asia/Kolkata +15.40593 79.50269 Asia/Kolkata +11.00599 77.5609 Asia/Kolkata +15.21542 79.9039 Asia/Kolkata +23.03333 70.21667 Asia/Kolkata +23.95946 88.04018 Asia/Kolkata +29.32102 77.26989 Asia/Kolkata +12.83515 79.70006 Asia/Kolkata +12.54614 77.42099 Asia/Kolkata +21.21714 79.19453 Asia/Kolkata +15.40534 76.60286 Asia/Kolkata +9.73647 77.2847 Asia/Kolkata +22.67111 88.37472 Asia/Kolkata +18.32001 78.34177 Asia/Kolkata +27.65791 77.26908 Asia/Kolkata +27.2625 79.63154 Asia/Kolkata +20.93385 85.5449 Asia/Kolkata +22.98333 88.48333 Asia/Kolkata +19.2437 73.13554 Asia/Kolkata +9.14726 77.70424 Asia/Kolkata +26.11667 79.73333 Asia/Kolkata +11.61056 76.08222 Asia/Kolkata +22.60777 73.46272 Asia/Kolkata +23.21944 88.36295 Asia/Kolkata +21.23234 78.9202 Asia/Kolkata +8.68301 77.46455 Asia/Kolkata +11.7404 78.959 Asia/Kolkata +30.83915 76.93947 Asia/Kolkata +25.63442 88.32665 Asia/Kolkata +27.06834 88.46508 Asia/Kolkata +15.18315 74.97099 Asia/Kolkata +22.20788 70.38343 Asia/Kolkata +29.83281 74.97857 Asia/Kolkata +28.82753 76.39482 Asia/Kolkata +19.67386 77.31149 Asia/Kolkata +19.04437 73.95554 Asia/Kolkata +8.51228 77.5535 Asia/Kolkata +27.89269 79.1945 Asia/Kolkata +26.868 80.7857 Asia/Kolkata +16.96036 82.23809 Asia/Kolkata +24.4982 93.98126 Asia/Kolkata +29.8019 76.39667 Asia/Kolkata +29.3959 77.20564 Asia/Kolkata +23.38465 79.7442 Asia/Kolkata +27.55497 79.33747 Asia/Kolkata +24.332 92.00391 Asia/Kolkata +26.3054 77.61605 Asia/Kolkata +16.55084 81.21177 Asia/Kolkata +16.57702 74.31544 Asia/Kolkata +13.55259 76.01096 Asia/Kolkata +21.21716 73.21972 Asia/Kolkata +14.11252 78.16027 Asia/Kolkata +23.29908 72.33362 Asia/Kolkata +9.07277 77.34152 Asia/Kolkata +22.95998 88.4285 Asia/Kolkata +25.20651 82.71543 Asia/Kolkata +25.40525 79.99421 Asia/Kolkata +19.20815 73.8752 Asia/Kolkata +19.85993 82.93385 Asia/Kolkata +21.51966 70.45981 Asia/Kolkata +24.4349 85.52951 Asia/Kolkata +31.32556 75.57917 Asia/Kolkata +22.77668 86.18351 Asia/Kolkata +26.75751 94.20306 Asia/Kolkata +26.34209 77.8092 Asia/Kolkata +12.57045 78.57341 Asia/Kolkata +26.41667 87.25 Asia/Kolkata +22.71667 70.28333 Asia/Kolkata +26.26841 73.00594 Asia/Kolkata +21.90174 70.0327 Asia/Kolkata +19.61186 76.6874 Asia/Kolkata +29.31617 76.31436 Asia/Kolkata +25.43806 81.90606 Asia/Kolkata +28.12559 75.39797 Asia/Kolkata +29.52177 77.22525 Asia/Kolkata +26.56004 79.73442 Asia/Kolkata +21.86159 84.01788 Asia/Kolkata +23.74079 86.41456 Asia/Kolkata +22.45384 86.99497 Asia/Kolkata +25.45446 78.58221 Asia/Kolkata +26.26467 86.27992 Asia/Kolkata +29.33616 78.22514 Asia/Kolkata +24.54205 76.17242 Asia/Kolkata +23.36541 85.97581 Asia/Kolkata +24.59676 76.16503 Asia/Kolkata +28.6063 76.6565 Asia/Kolkata +24.77418 86.38005 Asia/Kolkata +22.76819 74.59143 Asia/Kolkata +28.1228 77.55622 Asia/Kolkata +17.01394 76.77317 Asia/Kolkata +21.75482 70.62347 Asia/Kolkata +18.8563 82.5716 Asia/Kolkata +26.58749 86.13744 Asia/Kolkata +22.17583 88.41778 Asia/Kolkata +11.21206 79.36473 Asia/Kolkata +24.59916 74.86261 Asia/Kolkata +25.75506 82.68361 Asia/Kolkata +25.00921 79.04778 Asia/Kolkata +20.15975 85.70742 Asia/Kolkata +26.88234 78.90187 Asia/Kolkata +29.27944 78.82656 Asia/Kolkata +24.51379 86.64576 Asia/Kolkata +22.88772 84.13925 Asia/Kolkata +22.03709 71.20794 Asia/Kolkata +27.16442 81.53993 Asia/Kolkata +23.63783 75.12711 Asia/Kolkata +29.32508 77.84945 Asia/Kolkata +22.0092 82.57769 Asia/Kolkata +24.47001 88.07659 Asia/Kolkata +17.72602 79.15236 Asia/Kolkata +31.1593 75.61755 Asia/Kolkata +23.70468 87.07872 Asia/Kolkata +24.92589 86.22574 Asia/Kolkata +23.963 86.80285 Asia/Kolkata +22.80278 86.18545 Asia/Kolkata +22.47292 70.06673 Asia/Kolkata +32.73569 74.86911 Asia/Kolkata +14.8474 78.38401 Asia/Kolkata +16.50461 75.29146 Asia/Kolkata +22.05236 72.80074 Asia/Kolkata +25.31258 86.48888 Asia/Kolkata +22.19565 78.59121 Asia/Kolkata +23.71667 86.4 Asia/Kolkata +26.51667 88.73333 Asia/Kolkata +25.34558 72.61559 Asia/Kolkata +19.84102 75.88636 Asia/Kolkata +21.05194 76.53464 Asia/Kolkata +21.01009 75.56843 Asia/Kolkata +21.80176 87.2225 Asia/Kolkata +27.47235 78.30247 Asia/Kolkata +26.1451 79.3366 Asia/Kolkata +26.31041 82.73799 Asia/Kolkata +20.94896 72.89828 Asia/Kolkata +27.86625 78.25275 Asia/Kolkata +30.60622 74.25726 Asia/Kolkata +29.61857 77.43801 Asia/Kolkata +27.72664 79.65497 Asia/Kolkata +20.84852 86.33729 Asia/Kolkata +30.4475 74.88744 Asia/Kolkata +26.20441 73.93686 Asia/Kolkata +16.77639 74.55361 Asia/Kolkata +26.91763 70.90387 Asia/Kolkata +26.26459 81.5478 Asia/Kolkata +26.91962 75.78781 Asia/Kolkata +25.61994 75.27609 Asia/Kolkata +28.40338 78.10562 Asia/Kolkata +25.21398 84.98772 Asia/Kolkata +18.79473 78.91661 Asia/Kolkata +30.79013 75.47492 Asia/Kolkata +16.8938 80.09807 Asia/Kolkata +25.46877 84.41925 Asia/Kolkata +26.74967 80.5451 Asia/Kolkata +19.0836 82.02331 Asia/Kolkata +20.2557 86.17112 Asia/Kolkata +14.51976 76.33892 Asia/Kolkata +30.16676 77.30311 Asia/Kolkata +23.16697 79.95006 Asia/Kolkata +27.23423 78.20021 Asia/Kolkata +22.61477 77.76222 Asia/Kolkata +27.08694 93.60987 Asia/Kolkata +26.26541 88.18982 Asia/Kolkata +25.14129 85.20432 Asia/Kolkata +28.32849 78.72412 Asia/Kolkata +11.01866 77.06624 Asia/Kolkata +10.34238 76.21124 Asia/Kolkata +11.56667 75.6 Asia/Kolkata +25.00447 88.14573 Asia/Kolkata +29.8799 77.05882 Asia/Kolkata +22.71792 75.8333 Asia/Kolkata +17.17735 75.9526 Asia/Kolkata +26.93521 79.6712 Asia/Kolkata +18.3 73.25 Asia/Kolkata +24.80805 93.9442 Asia/Kolkata +15.95923 76.11351 Asia/Kolkata +19.69522 73.5626 Asia/Kolkata +11.58624 77.83891 Asia/Kolkata +19.11393 84.68721 Asia/Kolkata +16.69116 74.46054 Asia/Kolkata +17.38405 78.45636 Asia/Kolkata +15.02048 75.93186 Asia/Kolkata +24.5285 84 Asia/Kolkata +12.30485 76.2905 Asia/Kolkata +16.06226 76.05839 Asia/Kolkata +16.23082 74.60244 Asia/Kolkata +22.90877 88.39674 Asia/Kolkata +15.34776 75.13378 Asia/Kolkata +26.42237 90.98004 Asia/Kolkata +12.73647 77.83264 Asia/Kolkata +15.26954 76.3871 Asia/Kolkata +13.07192 77.79061 Asia/Kolkata +31.53238 75.90799 Asia/Kolkata +22.75357 77.72249 Asia/Kolkata +13.79742 76.2831 Asia/Kolkata +14.23976 75.64507 Asia/Kolkata +14.28014 74.4452 Asia/Kolkata +17.77074 77.12519 Asia/Kolkata +12.78693 76.243 Asia/Kolkata +14.04262 76.18424 Asia/Kolkata +26.00282 92.85605 Asia/Kolkata +27.89208 77.36686 Asia/Kolkata +24.8351 85.41794 Asia/Kolkata +29.14897 75.73676 Asia/Kolkata +13.94387 76.61553 Asia/Kolkata +14.45506 75.3952 Asia/Kolkata +21.51667 83.86667 Asia/Kolkata +19.48166 84.74489 Asia/Kolkata +19.71908 77.14826 Asia/Kolkata +20.54765 78.84032 Asia/Kolkata +13.82908 77.4924 Asia/Kolkata +23.90264 79.56904 Asia/Kolkata +26.73411 77.03519 Asia/Kolkata +23.59893 72.96602 Asia/Kolkata +25.31586 85.28153 Asia/Kolkata +23.99507 85.36109 Asia/Kolkata +14.79354 75.40448 Asia/Kolkata +24.13388 79.60076 Asia/Kolkata +27.59621 78.05237 Asia/Kolkata +29.15602 77.99659 Asia/Kolkata +13.01426 76.10351 Asia/Kolkata +26.7469 89.35385 Asia/Kolkata +28.72268 78.28325 Asia/Kolkata +12.05267 78.48023 Asia/Kolkata +22.10002 76.73466 Asia/Kolkata +14.78766 75.98863 Asia/Kolkata +25.28773 79.33279 Asia/Kolkata +23.69356 71.907 Asia/Kolkata +14.51288 75.80716 Asia/Kolkata +29.94791 78.16025 Asia/Kolkata +27.39433 80.1311 Asia/Kolkata +22.33893 77.09356 Asia/Kolkata +28.73041 77.78141 Asia/Kolkata +22.57688 88.31857 Asia/Kolkata +29.58182 74.32938 Asia/Kolkata +29.10005 75.9645 Asia/Kolkata +14.76465 75.1246 Asia/Kolkata +25.36344 82.18772 Asia/Kolkata +31.68411 76.52506 Asia/Kolkata +25.95582 80.14882 Asia/Kolkata +23.01516 71.18029 Asia/Kolkata +22.50321 73.47242 Asia/Kolkata +15.32864 74.75638 Asia/Kolkata +22.93218 88.41859 Asia/Kolkata +29.22254 79.5286 Asia/Kolkata +29.28979 78.28368 Asia/Kolkata +26.2452 91.52525 Asia/Kolkata +25.69003 85.20954 Asia/Kolkata +24.68394 92.56097 Asia/Kolkata +25.16478 93.01744 Asia/Kolkata +19.4949 77.6587 Asia/Kolkata +22.84202 88.65606 Asia/Kolkata +26.22982 78.17337 Asia/Kolkata +23.49276 87.73484 Asia/Kolkata +10.5943 76.0411 Asia/Kolkata +30.70862 74.40407 Asia/Kolkata +25.61676 79.18053 Asia/Kolkata +27.11667 79.71667 Asia/Kolkata +16.86562 77.39074 Asia/Kolkata +28.4601 77.02635 Asia/Kolkata +19.07956 83.80827 Asia/Kolkata +16.29974 80.45729 Asia/Kolkata +15.17126 77.36565 Asia/Kolkata +28.23902 78.43797 Asia/Kolkata +11.8082 76.69104 Asia/Kolkata +24.64761 77.31191 Asia/Kolkata +13.40765 80.10879 Asia/Kolkata +23.04156 84.54396 Asia/Kolkata +23.79896 85.82383 Asia/Kolkata +16.05025 75.78997 Asia/Kolkata +17.33764 76.83787 Asia/Kolkata +28.58889 77.79185 Asia/Kolkata +25.90448 74.66025 Asia/Kolkata +12.84519 80.06054 Asia/Kolkata +14.14903 79.8514 Asia/Kolkata +12.94601 78.87377 Asia/Kolkata +16.43171 80.9963 Asia/Kolkata +9.67826 77.24951 Asia/Kolkata +13.31216 76.94102 Asia/Kolkata +26.69984 89.02565 Asia/Kolkata +27.49658 77.46263 Asia/Kolkata +22.16547 88.8007 Asia/Kolkata +29.44702 75.67181 Asia/Kolkata +26.75479 83.37235 Asia/Kolkata +11.45496 77.4422 Asia/Kolkata +26.46734 84.44041 Asia/Kolkata +21.46015 80.19203 Asia/Kolkata +21.96074 70.80255 Asia/Kolkata +27.13253 81.96897 Asia/Kolkata +23.87355 86.1516 Asia/Kolkata +28.07837 80.47054 Asia/Kolkata +26.51166 93.95951 Asia/Kolkata +14.55 74.31667 Asia/Kolkata +16.16901 74.82393 Asia/Kolkata +29.13648 76.69534 Asia/Kolkata +26.42416 78.44094 Asia/Kolkata +22.77547 73.61488 Asia/Kolkata +24.82379 87.21285 Asia/Kolkata +22.63393 86.07162 Asia/Kolkata +22.8774 88.75479 Asia/Kolkata +26.17668 90.62634 Asia/Kolkata +24.18561 86.30772 Asia/Kolkata +12.2559 79.41724 Asia/Kolkata +30.2023 74.66318 Asia/Kolkata +15.37726 78.92748 Asia/Kolkata +19.94593 79.10854 Asia/Kolkata +19.71641 73.62821 Asia/Kolkata +26.10318 83.54379 Asia/Kolkata +25.58052 83.58058 Asia/Kolkata +28.66249 77.43777 Asia/Kolkata +22.58531 86.47682 Asia/Kolkata +20.14195 78.31308 Asia/Kolkata +26.15272 80.16803 Asia/Kolkata +22.66244 87.73399 Asia/Kolkata +29.53851 76.97116 Asia/Kolkata +19.26372 75.75006 Asia/Kolkata +24.79686 85.00385 Asia/Kolkata +26.08334 89.96118 Asia/Kolkata +13.61072 77.51738 Asia/Kolkata +26.1844 91.7458 Asia/Kolkata +24.16291 83.81037 Asia/Kolkata +22.63333 88.4 Asia/Kolkata +21.53888 71.57737 Asia/Kolkata +31.21537 76.14149 Asia/Kolkata +28.78659 78.09884 Asia/Kolkata +23.78015 79.1428 Asia/Kolkata +16.54092 80.80213 Asia/Kolkata +27.32574 88.61216 Asia/Kolkata +13.65024 74.67072 Asia/Kolkata +29.78027 77.26425 Asia/Kolkata +15.43342 76.5293 Asia/Kolkata +25.40138 88.52978 Asia/Kolkata +26.47249 76.71744 Asia/Kolkata +25.21954 74.26028 Asia/Kolkata +19.69718 75.01045 Asia/Kolkata +29.92008 73.87496 Asia/Kolkata +18.96962 76.74946 Asia/Kolkata +23.21667 72.68333 Asia/Kolkata +23.08333 70.13333 Asia/Kolkata +20.81214 72.99811 Asia/Kolkata +34.22992 74.7783 Asia/Kolkata +28.84463 78.23874 Asia/Kolkata +15.73628 75.96976 Asia/Kolkata +16.23504 77.79556 Asia/Kolkata +16.22291 74.3501 Asia/Kolkata +21.96957 71.57828 Asia/Kolkata +22.92258 78.78466 Asia/Kolkata +15.42977 75.62971 Asia/Kolkata +22.50444 88.18333 Asia/Kolkata +26.29857 87.2671 Asia/Kolkata +27.78913 76.94297 Asia/Kolkata +30.92574 74.61311 Asia/Kolkata +27.14941 78.4018 Asia/Kolkata +11.17989 75.84141 Asia/Kolkata +30.40207 74.02836 Asia/Kolkata +25.50974 85.30273 Asia/Kolkata +27.0937 77.66003 Asia/Kolkata +27.99486 74.95628 Asia/Kolkata +27.17253 81.21077 Asia/Kolkata +25.93036 80.8139 Asia/Kolkata +31.8643 74.95665 Asia/Kolkata +28.46125 79.30418 Asia/Kolkata +29.51171 75.45515 Asia/Kolkata +27.02637 78.30297 Asia/Kolkata +17.07788 78.20339 Asia/Kolkata +27.39048 79.58006 Asia/Kolkata +28.2091 79.5393 Asia/Kolkata +30.67238 74.75835 Asia/Kolkata +28.41252 77.31977 Asia/Kolkata +24.81667 87.9 Asia/Kolkata +26.51963 89.20423 Asia/Kolkata +21.16613 75.85862 Asia/Kolkata +26.77691 82.13292 Asia/Kolkata +26.7778 79.02159 Asia/Kolkata +14.63853 78.53974 Asia/Kolkata +11.3428 77.72741 Asia/Kolkata +9.7 76.78333 Asia/Kolkata +20.92461 75.32862 Asia/Kolkata +15.77098 77.48325 Asia/Kolkata +16.71084 81.10559 Asia/Kolkata +10.06667 76.28333 Asia/Kolkata +29.45212 74.6624 Asia/Kolkata +17.54844 82.8494 Asia/Kolkata +21.89947 87.53794 Asia/Kolkata +22.23944 68.96778 Asia/Kolkata +23.49956 87.32155 Asia/Kolkata +20.0048 79.30306 Asia/Kolkata +21.18333 81.28333 Asia/Kolkata +23.84306 73.71466 Asia/Kolkata +27.73356 78.94177 Asia/Kolkata +25.55214 84.15062 Asia/Kolkata +26.56708 85.5204 Asia/Kolkata +24.26778 87.24855 Asia/Kolkata +27.56884 95.55664 Asia/Kolkata +22.63341 88.42286 Asia/Kolkata +27.37227 95.30754 Asia/Kolkata +23.74516 86.17175 Asia/Kolkata +23.7902 87.37648 Asia/Kolkata +17.44475 80.14905 Asia/Kolkata +30.80026 76.02276 Asia/Kolkata +21.18852 80.756 Asia/Kolkata +21.32585 74.56526 Asia/Kolkata +19.21667 73.08333 Asia/Kolkata +13.29455 77.53745 Asia/Kolkata +33.14875 75.54611 Asia/Kolkata +20.71405 70.98224 Asia/Kolkata +24.25612 72.17928 Asia/Kolkata +25.84341 93.43116 Asia/Kolkata +26.13526 89.46129 Asia/Kolkata +22.94321 81.07781 Asia/Kolkata +10.36896 77.98036 Asia/Kolkata +32.13619 75.47141 Asia/Kolkata +25.91174 93.7217 Asia/Kolkata +20.10367 77.71853 Asia/Kolkata +18.5483 77.57695 Asia/Kolkata +25.74359 84.99865 Asia/Kolkata +27.39321 95.61839 Asia/Kolkata +27.47188 77.32564 Asia/Kolkata +27.40096 74.57537 Asia/Kolkata +15.59319 73.94571 Asia/Kolkata +27.47989 94.90837 Asia/Kolkata +28.20772 78.26008 Asia/Kolkata +22.19303 88.18466 Asia/Kolkata +30.37246 75.86185 Asia/Kolkata +26.58904 89.00732 Asia/Kolkata +24.68333 87.96667 Asia/Kolkata +20.90251 74.77735 Asia/Kolkata +26.01856 89.98564 Asia/Kolkata +22.567 70.4177 Asia/Kolkata +22.99167 71.46793 Asia/Kolkata +21.73359 70.45004 Asia/Kolkata +15.39524 77.8731 Asia/Kolkata +22.72732 72.44128 Asia/Kolkata +26.46793 92.47336 Asia/Kolkata +20.65744 85.59693 Asia/Kolkata +26.70367 92.47808 Asia/Kolkata +27.99903 81.08909 Asia/Kolkata +26.69286 77.87968 Asia/Kolkata +18.82018 76.10937 Asia/Kolkata +28.20665 76.79498 Asia/Kolkata +32.24194 76.32133 Asia/Kolkata +14.41494 77.71995 Asia/Kolkata +12.1277 78.15794 Asia/Kolkata +24.36667 92.16667 Asia/Kolkata +11.78333 75.43333 Asia/Kolkata +18.89116 77.8494 Asia/Kolkata +31.95504 75.32172 Asia/Kolkata +21.32855 71.02645 Asia/Kolkata +10.73828 77.53223 Asia/Kolkata +21.01283 75.27239 Asia/Kolkata +20.53693 73.17368 Asia/Kolkata +22.59373 75.29774 Asia/Kolkata +24.50967 72.02343 Asia/Kolkata +22.38185 71.98664 Asia/Kolkata +23.80199 86.44324 Asia/Kolkata +28.95912 78.25629 Asia/Kolkata +30.28288 75.57454 Asia/Kolkata +20.70718 81.54874 Asia/Kolkata +29.30604 78.50802 Asia/Kolkata +22.20928 75.47057 Asia/Kolkata +26.67479 85.16698 Asia/Kolkata +22.96585 76.05526 Asia/Kolkata +25.76042 75.38093 Asia/Kolkata +25.52533 73.90812 Asia/Kolkata +22.70517 73.90882 Asia/Kolkata +16.69186 78.92072 Asia/Kolkata +13.24729 77.71179 Asia/Kolkata +9.94704 78.8233 Asia/Kolkata +20.01757 76.03755 Asia/Kolkata +27.79836 73.34297 Asia/Kolkata +22.85176 75.54237 Asia/Kolkata +23.39087 79.01655 Asia/Kolkata +26.50167 83.77936 Asia/Kolkata +28.62988 79.47648 Asia/Kolkata +20.64898 78.48044 Asia/Kolkata +19.94404 73.83441 Asia/Kolkata +21.53768 84.73372 Asia/Kolkata +29.69291 77.67778 Asia/Kolkata +12.5301 77.78887 Asia/Kolkata +28.65381 77.22897 Asia/Kolkata +24.90504 84.18289 Asia/Kolkata +30.32443 78.03392 Asia/Kolkata +26.89 76.33584 Asia/Kolkata +18.46515 74.58375 Asia/Kolkata +25.03475 84.40017 Asia/Kolkata +20.78174 78.13979 Asia/Kolkata +25.67249 78.45815 Asia/Kolkata +28.0252 79.40528 Asia/Kolkata +31.81565 75.65315 Asia/Kolkata +28.67786 77.52071 Asia/Kolkata +20.9249 77.32622 Asia/Kolkata +20.30862 77.7691 Asia/Kolkata +27.03333 88.26667 Asia/Kolkata +26.15216 85.89707 Asia/Kolkata +15.26667 74.61667 Asia/Kolkata +25.6368 85.04586 Asia/Kolkata +23.83653 79.44134 Asia/Kolkata +21.69232 71.51747 Asia/Kolkata +20.41432 72.83236 Asia/Kolkata +24.04306 84.06866 Asia/Kolkata +25.66795 85.83636 Asia/Kolkata +25.87576 87.84009 Asia/Kolkata +22.75268 73.14967 Asia/Kolkata +22.83188 74.2595 Asia/Kolkata +23.16903 72.82161 Asia/Kolkata +19.96778 72.71263 Asia/Kolkata +28.55315 77.55343 Asia/Kolkata +29.94878 74.73707 Asia/Kolkata +25.89696 78.32938 Asia/Kolkata +26.00239 78.87658 Asia/Kolkata +22.18333 73.43333 Asia/Kolkata +20.46497 85.87927 Asia/Kolkata +15.26349 74.10875 Asia/Kolkata +15.1773 73.99392 Asia/Kolkata +15.58302 79.10981 Asia/Kolkata +14.4775 78.82352 Asia/Kolkata +11.74629 79.76436 Asia/Kolkata +13.63007 74.69068 Asia/Kolkata +27.13333 81.7 Asia/Kolkata +25.26629 87.23327 Asia/Kolkata +15.5439 73.7553 Asia/Kolkata +11.00555 76.96612 Asia/Kolkata +9.93988 76.26022 Asia/Kolkata +30.26055 78.01188 Asia/Kolkata +28.30415 74.96718 Asia/Kolkata +24.33353 93.66999 Asia/Kolkata +25.12909 82.8836 Asia/Kolkata +22.42347 71.19641 Asia/Kolkata +21.24706 75.29819 Asia/Kolkata +17.82974 82.93769 Asia/Kolkata +17.44088 81.77558 Asia/Kolkata +10.69967 76.7471 Asia/Kolkata +24.88963 74.62403 Asia/Kolkata +23.85681 86.90324 Asia/Kolkata +14.22262 76.40038 Asia/Kolkata +17.12357 77.0824 Asia/Kolkata +28.23937 75.64035 Asia/Kolkata +15.82465 80.35206 Asia/Kolkata +18.30846 83.56745 Asia/Kolkata +17.53339 73.50936 Asia/Kolkata +13.40181 78.05448 Asia/Kolkata +11.63325 78.87223 Asia/Kolkata +9.83999 77.38109 Asia/Kolkata +17.46483 77.41895 Asia/Kolkata +26.28259 83.50678 Asia/Kolkata +16.08943 80.16715 Asia/Kolkata +16.42898 74.58591 Asia/Kolkata +13.41609 76.62063 Asia/Kolkata +13.32231 75.774 Asia/Kolkata +20.35046 76.25774 Asia/Kolkata +13.43501 77.72781 Asia/Kolkata +11.39907 79.69113 Asia/Kolkata +21.46939 79.70164 Asia/Kolkata +24.38145 74.7012 Asia/Kolkata +22.30401 74.0158 Asia/Kolkata +22.05795 78.93763 Asia/Kolkata +27.14753 79.49979 Asia/Kolkata +24.91422 79.5878 Asia/Kolkata +26.22268 87.00346 Asia/Kolkata +27.72352 77.50945 Asia/Kolkata +27.92458 78.40092 Asia/Kolkata +29.21067 77.17347 Asia/Kolkata +25.781 84.73089 Asia/Kolkata +27.819 74.43936 Asia/Kolkata +23.30779 72.77404 Asia/Kolkata +24.66472 76.84379 Asia/Kolkata +10.91209 77.03762 Asia/Kolkata +13.07 80.24083 Asia/Kolkata +11.16394 77.60414 Asia/Kolkata +9.31575 76.61513 Asia/Kolkata +12.30889 78.79137 Asia/Kolkata +12.69274 79.9773 Asia/Kolkata +10.53333 76.05 Asia/Kolkata +26.6051 75.94814 Asia/Kolkata +19.35574 84.98359 Asia/Kolkata +24.20376 84.87032 Asia/Kolkata +23.63556 86.16712 Asia/Kolkata +29.54717 77.5937 Asia/Kolkata +28.5963 76.27092 Asia/Kolkata +25.40139 79.75045 Asia/Kolkata +26.27266 90.44556 Asia/Kolkata +12.90648 76.38829 Asia/Kolkata +12.65481 77.20495 Asia/Kolkata +14.02399 75.92577 Asia/Kolkata +9.44203 76.53604 Asia/Kolkata +20.33045 74.24439 Asia/Kolkata +21.2391 77.74703 Asia/Kolkata +20.81389 77.98001 Asia/Kolkata +19.73436 79.17089 Asia/Kolkata +19.94711 79.29607 Asia/Kolkata +22.73333 87.51667 Asia/Kolkata +29.13506 78.26887 Asia/Kolkata +30.73629 76.7884 Asia/Kolkata +24.71514 78.1376 Asia/Kolkata +28.45302 78.78295 Asia/Kolkata +25.25716 83.26787 Asia/Kolkata +22.86225 88.36796 Asia/Kolkata +23.71472 72.11279 Asia/Kolkata +11.92312 76.93949 Asia/Kolkata +22.03593 82.64248 Asia/Kolkata +32.5558 76.12592 Asia/Kolkata +16.11756 80.93139 Asia/Kolkata +14.31199 76.65141 Asia/Kolkata +20.46317 75.01213 Asia/Kolkata +21.41073 71.16621 Asia/Kolkata +22.67626 85.62906 Asia/Kolkata +22.6532 72.94497 Asia/Kolkata +26.41598 85.04665 Asia/Kolkata +18.76059 73.86351 Asia/Kolkata +22.54825 85.80458 Asia/Kolkata +22.31453 88.66248 Asia/Kolkata +11.86752 75.35763 Asia/Kolkata +22.56263 88.36304 Asia/Kolkata +14.67325 75.4868 Asia/Kolkata +25.57473 83.97867 Asia/Kolkata +21.5 83.86667 Asia/Kolkata +23.21494 81.53204 Asia/Kolkata +21.30898 76.22996 Asia/Kolkata +23.16139 85.58925 Asia/Kolkata +25.43855 75.63735 Asia/Kolkata +20.52932 76.18457 Asia/Kolkata +28.40296 77.85824 Asia/Kolkata +29.92799 75.56205 Asia/Kolkata +29.28889 77.47401 Asia/Kolkata +28.0362 79.12631 Asia/Kolkata +21.81667 83.91667 Asia/Kolkata +19.31151 84.7929 Asia/Kolkata +22.16917 71.66671 Asia/Kolkata +22.40788 72.89817 Asia/Kolkata +19.23496 72.85976 Asia/Kolkata +26.47703 90.55815 Asia/Kolkata +19.07283 72.88261 Asia/Kolkata +23.66278 87.69695 Asia/Kolkata +23.78732 85.95622 Asia/Kolkata +26.02131 93.77945 Asia/Kolkata +19.80362 72.75598 Asia/Kolkata +10.01171 77.34976 Asia/Kolkata +24.69794 84.99213 Asia/Kolkata +18.66208 77.88581 Asia/Kolkata +18.57351 83.35899 Asia/Kolkata +27.49672 80.99688 Asia/Kolkata +28.24718 75.07606 Asia/Kolkata +23.0738 87.31991 Asia/Kolkata +28.30822 78.93661 Asia/Kolkata +28.29187 79.80307 Asia/Kolkata +13.59723 75.97167 Asia/Kolkata +26.50823 87.01194 Asia/Kolkata +22.4 84.76667 Asia/Kolkata +21.03333 83.8 Asia/Kolkata +26.03613 80.57617 Asia/Kolkata +24.18386 78.20128 Asia/Kolkata +26.12747 83.89078 Asia/Kolkata +28.13073 78.91055 Asia/Kolkata +28.24246 79.95182 Asia/Kolkata +20.76957 72.96134 Asia/Kolkata +26.84345 80.06388 Asia/Kolkata +27.17503 80.03172 Asia/Kolkata +16.34714 75.61804 Asia/Kolkata +28.8869 79.26663 Asia/Kolkata +22.07402 82.1566 Asia/Kolkata +26.23285 90.2341 Asia/Kolkata +28.62163 78.80314 Asia/Kolkata +26.18048 73.70569 Asia/Kolkata +25.21262 84.25409 Asia/Kolkata +28.02094 73.30749 Asia/Kolkata +29.37219 78.13632 Asia/Kolkata +33.79403 75.10679 Asia/Kolkata +24.62625 79.49243 Asia/Kolkata +16.82442 75.71537 Asia/Kolkata +25.19729 85.52374 Asia/Kolkata +25.73414 86.98837 Asia/Kolkata +26.80172 79.50829 Asia/Kolkata +17.91331 77.5301 Asia/Kolkata +23.86667 76.91667 Asia/Kolkata +11.44154 79.64568 Asia/Kolkata +21.04658 75.78175 Asia/Kolkata +18.45908 75.65877 Asia/Kolkata +23.25397 69.66928 Asia/Kolkata +16.90742 74.59954 Asia/Kolkata +20.27241 85.83385 Asia/Kolkata +20.88197 85.83334 Asia/Kolkata +18.14861 73.84336 Asia/Kolkata +23.25469 77.40289 Asia/Kolkata +17.51544 78.88563 Asia/Kolkata +27.25579 79.18073 Asia/Kolkata +31.55442 75.64271 Asia/Kolkata +28.79194 76.14108 Asia/Kolkata +19.30023 73.05881 Asia/Kolkata +25.79239 78.11077 Asia/Kolkata +24.99944 72.27141 Asia/Kolkata +27.70354 81.93417 Asia/Kolkata +24.50415 74.18595 Asia/Kolkata +26.56672 78.78728 Asia/Kolkata +17.89017 83.45203 Asia/Kolkata +16.54078 81.52322 Asia/Kolkata +25.34644 74.63523 Asia/Kolkata +21.21667 81.43333 Asia/Kolkata +30.06114 75.53433 Asia/Kolkata +21.86694 75.96561 Asia/Kolkata +21.85523 70.24791 Asia/Kolkata +19.30157 72.85107 Asia/Kolkata +19.90765 83.16858 Asia/Kolkata +30.2666 76.03695 Asia/Kolkata +24.41582 75.83552 Asia/Kolkata +21.77446 72.1525 Asia/Kolkata +11.44713 77.68424 Asia/Kolkata +16.1026 80.78074 Asia/Kolkata +22.86643 88.40113 Asia/Kolkata +13.98194 74.55498 Asia/Kolkata +30.20712 74.9414 Asia/Kolkata +21.73333 81.93333 Asia/Kolkata +27.03895 77.04849 Asia/Kolkata +25.5606 81.49174 Asia/Kolkata +21.69482 72.9805 Asia/Kolkata +26.75367 79.22263 Asia/Kolkata +27.21731 77.49009 Asia/Kolkata +21.93053 69.7808 Asia/Kolkata +21.09214 80.93121 Asia/Kolkata +24.513 75.7469 Asia/Kolkata +19.92719 84.58201 Asia/Kolkata +25.73533 78.74576 Asia/Kolkata +21.16667 79.65 Asia/Kolkata +18.04348 77.206 Asia/Kolkata +19.11285 77.96336 Asia/Kolkata +21.64498 77.63072 Asia/Kolkata +25.24446 86.97183 Asia/Kolkata +22.82449 88.33842 Asia/Kolkata +13.84846 75.70502 Asia/Kolkata +21.05447 86.5156 Asia/Kolkata +17.66846 80.88888 Asia/Kolkata +29.10298 75.17138 Asia/Kolkata +25.3949 82.56636 Asia/Kolkata +30.47534 75.33011 Asia/Kolkata +28.31506 74.28836 Asia/Kolkata +23.29858 70.34279 Asia/Kolkata +25.04133 83.60789 Asia/Kolkata +11.17151 75.80611 Asia/Kolkata +27.21818 79.2983 Asia/Kolkata +21.90195 77.90405 Asia/Kolkata +26.8024 84.49873 Asia/Kolkata +15.45185 78.14611 Asia/Kolkata +28.70266 76.57831 Asia/Kolkata +23.63134 77.43351 Asia/Kolkata +24.02335 81.37812 Asia/Kolkata +21.7 81.53333 Asia/Kolkata +13.16558 75.86519 Asia/Kolkata +26.44365 85.40076 Asia/Kolkata +23.25178 91.45407 Asia/Kolkata +15.14575 76.91751 Asia/Kolkata +15.85212 74.50447 Asia/Kolkata +23.93428 88.26018 Asia/Kolkata +25.92104 81.99909 Asia/Kolkata +27.88832 76.28108 Asia/Kolkata +30.1705 77.61532 Asia/Kolkata +25.41853 86.1339 Asia/Kolkata +24.98333 75 Asia/Kolkata +23.60134 78.33976 Asia/Kolkata +22.50143 70.04363 Asia/Kolkata +26.10119 74.32028 Asia/Kolkata +29.15299 79.1064 Asia/Kolkata +26.90791 77.28985 Asia/Kolkata +28.80059 77.03473 Asia/Kolkata +20.83333 84.31667 Asia/Kolkata +31.81861 75.20278 Asia/Kolkata +27.14955 76.58345 Asia/Kolkata +21.11974 86.72896 Asia/Kolkata +26.79446 82.73285 Asia/Kolkata +23.85153 77.93652 Asia/Kolkata +27.17232 73.64519 Asia/Kolkata +19.32872 77.15746 Asia/Kolkata +30.69001 76.40154 Asia/Kolkata +30.5883 76.84389 Asia/Kolkata +26.8315 76.04856 Asia/Kolkata +16.57278 75.97252 Asia/Kolkata +17.87445 76.94972 Asia/Kolkata +22.03261 74.89808 Asia/Kolkata +29.3666 75.90669 Asia/Kolkata +25.47446 85.96681 Asia/Kolkata +22.35253 88.43882 Asia/Kolkata +18.23454 75.69275 Asia/Kolkata +26.32292 91.00632 Asia/Kolkata +21.2 83.58333 Asia/Kolkata +30.37205 75.54537 Asia/Kolkata +25.74572 71.39211 Asia/Kolkata +24.17543 85.89077 Asia/Kolkata +23.62199 85.46714 Asia/Kolkata +23.6182 91.35596 Asia/Kolkata +24.41339 74.47331 Asia/Kolkata +26.64661 77.61634 Asia/Kolkata +25.28814 86.02055 Asia/Kolkata +25.48438 85.71027 Asia/Kolkata +22.99136 79.87619 Asia/Kolkata +21.33333 83.61667 Asia/Kolkata +28.34702 79.42193 Asia/Kolkata +21.12297 73.11151 Asia/Kolkata +23.25572 87.85691 Asia/Kolkata +25.21855 85.7332 Asia/Kolkata +29.10167 77.26242 Asia/Kolkata +26.38149 84.58724 Asia/Kolkata +22.72154 88.48198 Asia/Kolkata +22.22516 88.45086 Asia/Kolkata +22.64132 88.37727 Asia/Kolkata +25.1 76.51667 Asia/Kolkata +34.209 74.34285 Asia/Kolkata +18.15174 74.57767 Asia/Kolkata +22.76602 88.36336 Asia/Kolkata +15.90437 80.4675 Asia/Kolkata +30.55375 76.71867 Asia/Kolkata +12.89122 75.04097 Asia/Kolkata +21.48816 70.07576 Asia/Kolkata +23.54109 74.4425 Asia/Kolkata +18.37725 77.88007 Asia/Kolkata +27.17979 82.93409 Asia/Kolkata +25.88409 84.21737 Asia/Kolkata +22.95387 88.40098 Asia/Kolkata +12.33246 76.86178 Asia/Kolkata +25.88667 87.19491 Asia/Kolkata +23.23241 87.0716 Asia/Kolkata +20.37912 85.52952 Asia/Kolkata +24.88091 86.92257 Asia/Kolkata +26.8912 80.21149 Asia/Kolkata +12.99199 78.17925 Asia/Kolkata +25.86728 86.51152 Asia/Kolkata +23.04552 88.83084 Asia/Kolkata +15.31691 78.22701 Asia/Kolkata +12.97194 77.59369 Asia/Kolkata +31.18602 75.99643 Asia/Kolkata +34.41825 74.64042 Asia/Kolkata +27.05087 76.57325 Asia/Kolkata +25.47534 80.3358 Asia/Kolkata +24.04449 78.96163 Asia/Kolkata +29.46406 77.35306 Asia/Kolkata +19.77889 85.17032 Asia/Kolkata +24.89309 78.1513 Asia/Kolkata +25.22099 88.77732 Asia/Kolkata +20.17811 85.11225 Asia/Kolkata +27.42766 82.1871 Asia/Kolkata +25.83242 72.24 Asia/Kolkata +21.65678 82.16062 Asia/Kolkata +20.73081 81.20578 Asia/Kolkata +22.64859 88.34115 Asia/Kolkata +19.84657 79.34624 Asia/Kolkata +25.19725 73.29117 Asia/Kolkata +21.49266 86.93348 Asia/Kolkata +23.09714 86.22292 Asia/Kolkata +20.66612 76.77386 Asia/Kolkata +20.70419 83.49029 Asia/Kolkata +21.81667 80.18489 Asia/Kolkata +31.06062 76.30166 Asia/Kolkata +25.45931 85.53301 Asia/Kolkata +22.47514 88.17767 Asia/Kolkata +26.74062 85.27323 Asia/Kolkata +13.86667 74.63333 Asia/Kolkata +15.81619 74.85752 Asia/Kolkata +22.10176 80.54963 Asia/Kolkata +22.78498 88.32586 Asia/Kolkata +27.5743 81.59588 Asia/Kolkata +28.39361 78.62212 Asia/Kolkata +28.77373 79.49553 Asia/Kolkata +24.10473 88.25155 Asia/Kolkata +28.69108 76.9316 Asia/Kolkata +26.2594 87.82096 Asia/Kolkata +26.86991 78.59443 Asia/Kolkata +23.33664 88.64109 Asia/Kolkata +28.94442 77.21878 Asia/Kolkata +26.69929 88.31177 Asia/Kolkata +30.68747 75.09572 Asia/Kolkata +13.78338 77.79667 Asia/Kolkata +21.48719 70.95516 Asia/Kolkata +28.1874 75.5005 Asia/Kolkata +16.18673 75.69614 Asia/Kolkata +27.09918 84.09003 Asia/Kolkata +24.52627 85.06094 Asia/Kolkata +14.73959 79.06201 Asia/Kolkata +22.74431 88.78655 Asia/Kolkata +23.02181 75.23268 Asia/Kolkata +19.15516 73.26554 Asia/Kolkata +15.91495 75.67683 Asia/Kolkata +11.5964 75.58622 Asia/Kolkata +22.11186 85.38684 Asia/Kolkata +28.92497 78.23353 Asia/Kolkata +28.2639 78.40471 Asia/Kolkata +21.84577 71.30544 Asia/Kolkata +25.24215 78.46603 Asia/Kolkata +25.54711 80.70442 Asia/Kolkata +22.70256 77.93494 Asia/Kolkata +26.06758 83.18364 Asia/Kolkata +26.79958 82.20414 Asia/Kolkata +10.44992 77.55198 Asia/Kolkata +16.02148 80.91808 Asia/Kolkata +11.19297 77.26865 Asia/Kolkata +13.1147 80.10981 Asia/Kolkata +18.24728 76.4993 Asia/Kolkata +24.75389 84.37406 Asia/Kolkata +19.87757 75.34226 Asia/Kolkata +26.46313 79.51167 Asia/Kolkata +18.25429 77.4135 Asia/Kolkata +11.59414 78.60143 Asia/Kolkata +8.69282 76.81518 Asia/Kolkata +16.7 81.6 Asia/Kolkata +28.02964 78.28572 Asia/Kolkata +15.88109 78.58704 Asia/Kolkata +10.34059 79.37905 Asia/Kolkata +16.72613 75.06421 Asia/Kolkata +20.51999 85.62965 Asia/Kolkata +25.2857 80.57144 Asia/Kolkata +25.7342 74.33278 Asia/Kolkata +19.61114 84.65998 Asia/Kolkata +19.35851 79.28415 Asia/Kolkata +23.0179 76.72024 Asia/Kolkata +16.94943 74.40936 Asia/Kolkata +24.57468 77.73038 Asia/Kolkata +23.68333 86.98333 Asia/Kolkata +29.52173 76.60419 Asia/Kolkata +20.99644 78.22868 Asia/Kolkata +9.50842 78.09449 Asia/Kolkata +8.5688 78.09091 Asia/Kolkata +9.86667 76.35 Asia/Kolkata +13.31446 76.25704 Asia/Kolkata +24.38362 77.4192 Asia/Kolkata +12.76521 76.05622 Asia/Kolkata +11.13849 79.07556 Asia/Kolkata +12.90569 79.31897 Asia/Kolkata +26.14845 87.51404 Asia/Kolkata +10.17235 78.99118 Asia/Kolkata +12.66987 79.28555 Asia/Kolkata +18.67458 75.17976 Asia/Kolkata +21.2 81.96667 Asia/Kolkata +22.88333 87.78333 Asia/Kolkata +13.08449 79.67053 Asia/Kolkata +25.56314 84.67137 Asia/Kolkata +28.27358 79.1597 Asia/Kolkata +28.3573 78.26921 Asia/Kolkata +23.10344 81.69083 Asia/Kolkata +29.19111 73.20861 Asia/Kolkata +25.15 76.3 Asia/Kolkata +20.03997 77.31519 Asia/Kolkata +11.23616 77.10514 Asia/Kolkata +15.42513 75.4335 Asia/Kolkata +21.63236 72.99002 Asia/Kolkata +23.11316 70.02671 Asia/Kolkata +21.16342 77.3107 Asia/Kolkata +22.04171 75.05519 Asia/Kolkata +20.84089 85.10192 Asia/Kolkata +10.2 76.4 Asia/Kolkata +12.7111 77.69557 Asia/Kolkata +17.81458 78.07713 Asia/Kolkata +11.57506 77.59043 Asia/Kolkata +9.99854 77.62122 Asia/Kolkata +33.72993 75.15167 Asia/Kolkata +14.6794 77.59877 Asia/Kolkata +31.2388 76.50069 Asia/Kolkata +22.55251 72.9552 Asia/Kolkata +17.69134 83.00395 Asia/Kolkata +10.58226 76.9347 Asia/Kolkata +18.41062 83.90243 Asia/Kolkata +22.58344 88.01039 Asia/Kolkata +21.25084 72.83878 Asia/Kolkata +28.90314 78.46984 Asia/Kolkata +31.63661 74.87476 Asia/Kolkata +21.59984 71.21169 Asia/Kolkata +20.93333 77.75 Asia/Kolkata +21.99317 72.87047 Asia/Kolkata +20.28333 73.01667 Asia/Kolkata +22.84616 87.33559 Asia/Kolkata +21.92429 78.12766 Asia/Kolkata +25.30609 73.9258 Asia/Kolkata +12.79163 78.71644 Asia/Kolkata +23.11892 83.19537 Asia/Kolkata +13.09818 80.16152 Asia/Kolkata +8.71068 77.4519 Asia/Kolkata +30.36284 76.79516 Asia/Kolkata +18.73312 76.38616 Asia/Kolkata +26.70531 78.22712 Asia/Kolkata +19.61301 75.78906 Asia/Kolkata +25.03967 86.90247 Asia/Kolkata +24.31415 80.97758 Asia/Kolkata +19.2 73.16667 Asia/Kolkata +21.04303 75.0601 Asia/Kolkata +16.57868 82.00609 Asia/Kolkata +10.10468 76.3565 Asia/Kolkata +27.56246 76.625 Asia/Kolkata +23.76336 75.55662 Asia/Kolkata +28.16951 94.8006 Asia/Kolkata +15.42726 74.74111 Asia/Kolkata +29.59726 79.66088 Asia/Kolkata +9.49004 76.3264 Asia/Kolkata +25.44894 81.83328 Asia/Kolkata +28.79961 77.13151 Asia/Kolkata +27.88334 78.07475 Asia/Kolkata +27.49435 79.17045 Asia/Kolkata +18.64813 72.87579 Asia/Kolkata +8.86404 77.49937 Asia/Kolkata +12.62239 78.75158 Asia/Kolkata +13.0025 80.20611 Asia/Kolkata +18.67756 73.89868 Asia/Kolkata +17.56425 76.56854 Asia/Kolkata +21.09639 77.05861 Asia/Kolkata +20.70957 76.9981 Asia/Kolkata +24.41384 76.56863 Asia/Kolkata +16.6 81.38333 Asia/Kolkata +26.43043 82.53673 Asia/Kolkata +26.38313 79.95035 Asia/Kolkata +22.0253 82.42689 Asia/Kolkata +17.52646 76.20665 Asia/Kolkata +16.11601 74.21097 Asia/Kolkata +31.84391 74.76166 Asia/Kolkata +26.44976 74.64116 Asia/Kolkata +23.72894 92.71791 Asia/Kolkata +25.01611 83.03307 Asia/Kolkata +18.70622 76.93731 Asia/Kolkata +19.09457 74.73843 Asia/Kolkata +23.02579 72.58726 Asia/Kolkata +27.18333 78.01667 Asia/Kolkata +23.83605 91.27939 Asia/Kolkata +23.71177 76.01571 Asia/Kolkata +17.20006 76.36024 Asia/Kolkata +29.39374 78.67356 Asia/Kolkata +9.16667 76.73333 Asia/Kolkata +23.49668 86.68363 Asia/Kolkata +15.62509 77.27536 Asia/Kolkata +19.67203 78.5359 Asia/Kolkata +15.80994 79.97311 Asia/Kolkata +27.1787 77.75739 Asia/Kolkata +21.25722 77.50861 Asia/Kolkata +24.48012 72.78186 Asia/Kolkata +24.59365 72.71756 Asia/Kolkata +30.1431 74.19749 Asia/Kolkata +26.32255 90.68526 Asia/Kolkata +21.77985 87.74892 Asia/Kolkata +22.06046 88.10975 Asia/Kolkata +22.94849 88.01954 Asia/Kolkata +22.61993 88.24566 Asia/Kolkata +22.60291 88.27751 Asia/Kolkata +22.63222 88.34861 Asia/Kolkata +22.58826 88.23544 Asia/Kolkata +22.58213 88.171 Asia/Kolkata +22.53665 88.13785 Asia/Kolkata +22.50833 88.21528 Asia/Kolkata +22.4711 88.1453 Asia/Kolkata +22.10833 88.07889 Asia/Kolkata +22.28806 88.50917 Asia/Kolkata +34.08049 74.70871 Asia/Kolkata +17.46982 78.12574 Asia/Kolkata +17.45081 78.68366 Asia/Kolkata +13.29506 77.80228 Asia/Kolkata +31.43224 75.71484 Asia/Kolkata +13.03565 80.15821 Asia/Kolkata +12.96226 80.19864 Asia/Kolkata +12.96095 80.24094 Asia/Kolkata +12.8525 80.04667 Asia/Kolkata +19.1164 72.90471 Asia/Kolkata +19.03681 73.01582 Asia/Kolkata +14.0943 74.4845 Asia/Kolkata +18.53017 73.85263 Asia/Kolkata +28.49615 77.53601 Asia/Kolkata +30.67995 76.72211 Asia/Kolkata +22.60197 75.69649 Asia/Kolkata +21.65685 85.64349 Asia/Kolkata +19.15096 72.99625 Asia/Kolkata +10.10764 76.35158 Asia/Kolkata +30.5819 74.83298 Asia/Kolkata +9.97985 76.57381 Asia/Kolkata +10.10695 76.47366 Asia/Kolkata +20.37175 72.90493 Asia/Kolkata +30.95783 76.79136 Asia/Kolkata +28.58 77.33 Asia/Kolkata +28.21024 76.86056 Asia/Kolkata +23.08166 77.53328 Asia/Kolkata +24.19973 82.67535 Asia/Kolkata +26.70421 89.14547 Asia/Kolkata +26.84766 89.37558 Asia/Kolkata +13.65 79.42 Asia/Kolkata +19.05577 79.493 Asia/Kolkata +15.89794 79.32129 Asia/Kolkata +17.36687 78.5242 Asia/Kolkata +19.65399 78.51213 Asia/Kolkata +16.28584 81.25464 Asia/Kolkata +17.34769 78.55757 Asia/Kolkata +17.44781 78.52633 Asia/Kolkata +18.96506 79.47475 Asia/Kolkata +14.47516 78.8354 Asia/Kolkata +19.66781 78.5289 Asia/Kolkata +17.7 83.21667 Asia/Kolkata +17.98102 80.7547 Asia/Kolkata +14.54519 77.10552 Asia/Kolkata +16.07114 80.54944 Asia/Kolkata +17.50107 78.45818 Asia/Kolkata +16.94516 82.2385 Asia/Kolkata +17.58152 80.67651 Asia/Kolkata +26.50284 90.96937 Asia/Kolkata +17.24968 80.86899 Asia/Kolkata +16.48531 80.66746 Asia/Kolkata +26.37957 92.34146 Asia/Kolkata +27.10467 93.69518 Asia/Kolkata +17.49313 78.30196 Asia/Kolkata +26.20597 93.80951 Asia/Kolkata +25.74903 93.16998 Asia/Kolkata +23.18 88.58 Asia/Kolkata +22.86416 88.63701 Asia/Kolkata +23.65176 87.16475 Asia/Kolkata +26.45352 87.02744 Asia/Kolkata +30.96853 74.99106 Asia/Kolkata +18.755 79.474 Asia/Kolkata +10.87655 76.30932 Asia/Kolkata +18.63649 81.25827 Asia/Kolkata +16.61875 74.70907 Asia/Kolkata +10.31549 78.15141 Asia/Kolkata +37.14805 42.70355 Asia/Baghdad +30.0362 47.91951 Asia/Baghdad +34.88808 44.63256 Asia/Baghdad +34.61581 43.67861 Asia/Baghdad +36.49109 43.12026 Asia/Baghdad +36.80752 43.03831 Asia/Baghdad +34.19663 43.8739 Asia/Baghdad +32.71557 44.27857 Asia/Baghdad +36.61647 44.53014 Asia/Baghdad +34.47935 41.90849 Asia/Baghdad +36.27093 43.37758 Asia/Baghdad +33.7481 45.55503 Asia/Baghdad +36.08289 44.62873 Asia/Baghdad +34.68963 44.96057 Asia/Baghdad +35.46806 44.39222 Asia/Baghdad +32.61603 44.02488 Asia/Baghdad +36.19257 44.01062 Asia/Baghdad +33.63664 42.82768 Asia/Baghdad +35.17778 45.98611 Asia/Baghdad +34.13477 42.37724 Asia/Baghdad +36.86709 42.98845 Asia/Baghdad +35.53356 44.8343 Asia/Baghdad +34.9307 43.49311 Asia/Baghdad +33.7466 44.64366 Asia/Baghdad +35.6169 45.95338 Asia/Baghdad +34.01485 44.14574 Asia/Baghdad +33.34058 44.40088 Asia/Baghdad +30.39213 47.70174 Asia/Baghdad +32.92556 44.77583 Asia/Baghdad +35.56496 45.4329 Asia/Baghdad +31.33198 45.2944 Asia/Baghdad +31.58376 44.64675 Asia/Baghdad +31.40906 46.1727 Asia/Baghdad +31.96257 44.60075 Asia/Baghdad +33.03718 40.28586 Asia/Baghdad +31.52845 45.20377 Asia/Baghdad +33.42056 43.30778 Asia/Baghdad +31.05799 46.25726 Asia/Baghdad +31.9892 44.3291 Asia/Baghdad +34.46934 41.94224 Asia/Baghdad +32.29799 44.68282 Asia/Baghdad +32.78396 44.27662 Asia/Baghdad +31.80436 44.4893 Asia/Baghdad +33.97861 44.93694 Asia/Baghdad +36.33091 43.09065 Asia/Baghdad +36.335 43.11889 Asia/Baghdad +31.57232 47.17529 Asia/Baghdad +32.5128 45.81817 Asia/Baghdad +33.80809 44.53344 Asia/Baghdad +32.46186 46.68794 Asia/Baghdad +32.54217 44.22111 Asia/Baghdad +32.46367 44.41963 Asia/Baghdad +32.17419 46.04345 Asia/Baghdad +30.71861 47.72083 Asia/Baghdad +31.74311 44.6196 Asia/Baghdad +30.96972 46.72278 Asia/Baghdad +29.97421 48.47309 Asia/Baghdad +33.35581 43.78612 Asia/Baghdad +30.53302 47.79747 Asia/Baghdad +32.90941 45.06359 Asia/Baghdad +31.83588 47.144 Asia/Baghdad +32.0643 45.24743 Asia/Baghdad +33.84667 44.23444 Asia/Baghdad +31.99289 44.92552 Asia/Baghdad +33.30703 44.18694 Asia/Baghdad +30.49528 47.8169 Asia/Baghdad +36.3209 41.87656 Asia/Baghdad +34.79049 48.57011 Asia/Tehran +34.3838 47.0553 Asia/Tehran +34.0734 47.9725 Asia/Tehran +35.23455 52.30942 Asia/Tehran +35.42867 51.57544 Asia/Tehran +35.6803 51.0193 Asia/Tehran +36.213 49.196 Asia/Tehran +30.66824 51.58796 Asia/Tehran +37.08701 55.17397 Asia/Tehran +30.81271 56.56399 Asia/Tehran +36.6736 48.4787 Asia/Tehran +31.89722 54.3675 Asia/Tehran +35.3242 51.6457 Asia/Tehran +35.27401 59.21949 Asia/Tehran +36.81626 50.87376 Asia/Tehran +35.69439 51.42151 Asia/Tehran +37.8008 48.9037 Asia/Tehran +36.0696 49.6959 Asia/Tehran +36.4009 47.1133 Asia/Tehran +31.74384 54.20278 Asia/Tehran +38.08 46.2919 Asia/Tehran +33.59586 56.92437 Asia/Tehran +34.7837 47.6004 Asia/Tehran +29.45137 55.6809 Asia/Tehran +32.0455 48.8567 Asia/Tehran +32.1942 48.2436 Asia/Tehran +29.61031 52.53114 Asia/Tehran +32.32556 50.86444 Asia/Tehran +30.1165 55.1186 Asia/Tehran +30.64972 48.66472 Asia/Tehran +35.57692 53.39205 Asia/Tehran +31.41667 51.56667 Asia/Tehran +35.0213 50.3566 Asia/Tehran +36.56332 53.06009 Asia/Tehran +36.24992 46.2735 Asia/Tehran +35.31495 46.99883 Asia/Tehran +38.1973 44.7653 Asia/Tehran +36.6793 46.5669 Asia/Tehran +36.2126 57.68191 Asia/Tehran +37.13761 50.288 Asia/Tehran +35.4846 51.0829 Asia/Tehran +31.26562 56.80545 Asia/Tehran +37.28077 49.58319 Asia/Tehran +30.8946 49.4092 Asia/Tehran +31.27997 49.60351 Asia/Tehran +30.4067 55.9939 Asia/Tehran +37.106 58.50955 Asia/Tehran +35.1664 47.8045 Asia/Tehran +34.6401 50.8764 Asia/Tehran +26.9492 56.2691 Asia/Tehran +36.26877 50.0041 Asia/Tehran +38.8915 45.0255 Asia/Tehran +32.27174 50.98008 Asia/Tehran +33.72654 59.18439 Asia/Tehran +34.46109 45.86264 Asia/Tehran +35.308 51.7267 Asia/Tehran +36.701 45.1413 Asia/Tehran +35.0434 46.3565 Asia/Tehran +39.6482 47.9174 Asia/Tehran +37.0397 45.0983 Asia/Tehran +37.55274 45.07605 Asia/Tehran +30.75972 49.705 Asia/Tehran +30.11405 51.52174 Asia/Tehran +36.649 51.496 Asia/Tehran +36.21329 58.79576 Asia/Tehran +29.1988 54.3278 Asia/Tehran +36.65079 53.29905 Asia/Tehran +35.95411 50.60608 Asia/Tehran +36.9553 45.388 Asia/Tehran +34.1885 48.377 Asia/Tehran +27.13104 57.08716 Asia/Tehran +36.9694 46.1027 Asia/Tehran +32.25014 54.01658 Asia/Tehran +31.58428 54.4428 Asia/Tehran +31.9364 49.3039 Asia/Tehran +29.92266 56.57434 Asia/Tehran +36.31559 59.56796 Asia/Tehran +38.4329 45.7749 Asia/Tehran +34.2969 48.8235 Asia/Tehran +35.6659 50.9767 Asia/Tehran +36.7631 45.7222 Asia/Tehran +37.19701 50.15351 Asia/Tehran +33.53335 47.60999 Asia/Tehran +26.55778 54.01944 Asia/Tehran +38.5503 44.9521 Asia/Tehran +33.22052 50.31497 Asia/Tehran +30.44079 48.18428 Asia/Tehran +33.48778 48.35583 Asia/Tehran +33.64226 50.0789 Asia/Tehran +37.6189 48.5258 Asia/Tehran +34.31417 47.065 Asia/Tehran +30.28321 57.07879 Asia/Tehran +29.61949 51.65415 Asia/Tehran +35.23831 58.46558 Asia/Tehran +33.98308 51.43644 Asia/Tehran +35.83266 50.99154 Asia/Tehran +34.5043 47.9653 Asia/Tehran +34.7956 46.9355 Asia/Tehran +37.38071 55.49164 Asia/Tehran +36.64115 52.91244 Asia/Tehran +34.79611 46.51722 Asia/Tehran +33.6374 46.4227 Asia/Tehran +34.2721 47.5861 Asia/Tehran +34.79922 48.51456 Asia/Tehran +36.84165 54.44361 Asia/Tehran +37.25004 55.16721 Asia/Tehran +34.35286 58.68365 Asia/Tehran +33.4537 50.28836 Asia/Tehran +27.6652 54.1371 Asia/Tehran +29.5791 50.517 Asia/Tehran +28.8438 52.5707 Asia/Tehran +36.68642 52.52255 Asia/Tehran +28.9383 53.6482 Asia/Tehran +32.25694 50.56096 Asia/Tehran +37.07645 57.51009 Asia/Tehran +36.41819 54.97628 Asia/Tehran +30.3586 50.7981 Asia/Tehran +33.9905 50.6838 Asia/Tehran +32.6941 47.2679 Asia/Tehran +30.7949 50.56458 Asia/Tehran +31.5608 48.1831 Asia/Tehran +33.1396 47.3762 Asia/Tehran +28.75194 54.54444 Asia/Tehran +36.1679 54.34292 Asia/Tehran +35.71842 52.06958 Asia/Tehran +36.64546 59.12123 Asia/Tehran +36.655 51.4204 Asia/Tehran +28.9684 50.8385 Asia/Tehran +36.521 46.2089 Asia/Tehran +33.8973 48.7516 Asia/Tehran +31.96523 51.2873 Asia/Tehran +29.2699 51.2188 Asia/Tehran +37.47473 57.32903 Asia/Tehran +32.86628 59.22114 Asia/Tehran +35.8668 47.60506 Asia/Tehran +37.3404 46.0561 Asia/Tehran +36.69235 53.55262 Asia/Tehran +30.5959 50.2417 Asia/Tehran +35.9975 45.8853 Asia/Tehran +26.55792 54.88067 Asia/Tehran +37.47258 49.4593 Asia/Tehran +27.1865 56.2808 Asia/Tehran +29.106 58.357 Asia/Tehran +34.9072 48.4414 Asia/Tehran +31.6035 55.40249 Asia/Tehran +36.70251 52.6576 Asia/Tehran +36.55132 52.67895 Asia/Tehran +33.6095 48.9307 Asia/Tehran +37.4779 47.0508 Asia/Tehran +38.4291 48.872 Asia/Tehran +37.25962 49.94444 Asia/Tehran +34.78241 48.11853 Asia/Tehran +33.3761 52.3694 Asia/Tehran +32.31001 54.01747 Asia/Tehran +38.2498 48.2933 Asia/Tehran +34.09174 49.68916 Asia/Tehran +36.46961 52.35072 Asia/Tehran +36.3187 49.1678 Asia/Tehran +35.65884 51.05775 Asia/Tehran +33.40063 49.6949 Asia/Tehran +33.86419 48.26258 Asia/Tehran +29.2464 52.7793 Asia/Tehran +37.4776 45.8943 Asia/Tehran +31.31901 48.6842 Asia/Tehran +38.4774 47.0699 Asia/Tehran +30.7006 49.8315 Asia/Tehran +36.06667 50.55 Asia/Tehran +36.1468 49.218 Asia/Tehran +32.9926 47.4198 Asia/Tehran +31.1608 52.6506 Asia/Tehran +30.3392 48.3043 Asia/Tehran +35.3022 51.5358 Asia/Tehran +32.03389 51.87944 Asia/Tehran +32.68325 51.60158 Asia/Tehran +32.5767 51.455 Asia/Tehran +32.6344 51.3668 Asia/Tehran +32.6856 51.53609 Asia/Tehran +32.55118 51.52758 Asia/Tehran +32.5553 51.50974 Asia/Tehran +32.65246 51.67462 Asia/Tehran +32.79978 51.69553 Asia/Tehran +32.61528 51.55556 Asia/Tehran +31.0306 61.4949 Asia/Tehran +29.4963 60.8629 Asia/Tehran +35.244 60.6225 Asia/Tehran +34.74 60.7756 Asia/Tehran +36.5449 61.1577 Asia/Tehran +28.22107 61.21582 Asia/Tehran +27.20245 60.68476 Asia/Tehran +25.2919 60.643 Asia/Tehran +35.71071 53.35394 Asia/Tehran +65.68353 -18.0878 Atlantic/Reykjavik +64.13548 -21.89541 Atlantic/Reykjavik +64.11234 -21.91298 Atlantic/Reykjavik +64.0671 -21.93774 Atlantic/Reykjavik +36.95151 14.52788 Europe/Rome +38.07789 13.44275 Europe/Rome +38.67618 16.10094 Europe/Rome +38.01391 12.54127 Europe/Rome +37.98225 13.69729 Europe/Rome +37.08415 15.27628 Europe/Rome +39.30286 9.20283 Europe/Rome +38.26993 16.29607 Europe/Rome +39.29846 9.09248 Europe/Rome +39.25779 9.16323 Europe/Rome +37.29548 14.84058 Europe/Rome +36.78831 14.69883 Europe/Rome +37.50693 13.08399 Europe/Rome +37.5769 15.09371 Europe/Rome +39.26291 16.69531 Europe/Rome +37.48412 13.98542 Europe/Rome +39.60196 16.63475 Europe/Rome +36.82438 14.94893 Europe/Rome +37.49773 13.26676 Europe/Rome +38.11047 15.66129 Europe/Rome +36.89639 14.70689 Europe/Rome +39.34474 16.23802 Europe/Rome +39.22935 9.25004 Europe/Rome +36.73028 14.84672 Europe/Rome +37.29117 13.5161 Europe/Rome +37.38417 14.36921 Europe/Rome +37.56675 14.90254 Europe/Rome +38.04822 13.11915 Europe/Rome +38.4069 15.87173 Europe/Rome +37.19066 13.76603 Europe/Rome +38.13205 13.33561 Europe/Rome +37.32955 14.74474 Europe/Rome +36.71703 15.09062 Europe/Rome +39.89957 8.59326 Europe/Rome +36.89244 15.06977 Europe/Rome +37.14649 14.39381 Europe/Rome +38.96088 16.31012 Europe/Rome +39.25974 9.1384 Europe/Rome +38.07665 13.29319 Europe/Rome +36.8499 14.76976 Europe/Rome +37.51563 15.02999 Europe/Rome +38.02776 13.45047 Europe/Rome +38.2096 15.24078 Europe/Rome +38.19394 15.55256 Europe/Rome +37.65418 12.59304 Europe/Rome +37.58834 15.03998 Europe/Rome +37.86736 12.4983 Europe/Rome +37.10837 13.94487 Europe/Rome +37.28929 14.99644 Europe/Rome +39.3092 8.5372 Europe/Rome +38.4251 15.8975 Europe/Rome +37.72 15.17584 Europe/Rome +37.0757 14.23704 Europe/Rome +37.08507 15.15414 Europe/Rome +37.31754 13.66226 Europe/Rome +37.5577 14.28551 Europe/Rome +39.0823 17.10997 Europe/Rome +39.30422 16.25201 Europe/Rome +36.95587 14.60112 Europe/Rome +38.88247 16.60086 Europe/Rome +37.49223 15.07041 Europe/Rome +39.81949 16.21467 Europe/Rome +37.68081 12.79194 Europe/Rome +40.01311 18.1634 Europe/Rome +38.15535 13.18102 Europe/Rome +39.16465 8.5213 Europe/Rome +37.35842 13.84786 Europe/Rome +37.48997 14.05163 Europe/Rome +37.21609 14.51762 Europe/Rome +39.23054 9.11917 Europe/Rome +37.78863 14.83377 Europe/Rome +37.64442 14.86685 Europe/Rome +37.59192 14.97985 Europe/Rome +38.15697 15.21276 Europe/Rome +38.07892 13.51236 Europe/Rome +36.9084 15.13937 Europe/Rome +37.25784 15.23257 Europe/Rome +39.28982 9.00366 Europe/Rome +38.38333 16.13333 Europe/Rome +37.99724 12.94323 Europe/Rome +37.32744 13.59351 Europe/Rome +37.66765 14.83751 Europe/Rome +37.62606 15.16325 Europe/Rome +37.59596 15.13981 Europe/Rome +37.55564 15.14535 Europe/Rome +44.48966 11.21831 Europe/Rome +44.99467 9.00862 Europe/Rome +45.97797 12.30559 Europe/Rome +42.42322 12.11141 Europe/Rome +45.51461 9.28772 Europe/Rome +45.61545 9.36801 Europe/Rome +45.71289 12.25697 Europe/Rome +40.91866 14.18109 Europe/Rome +45.35807 10.84939 Europe/Rome +44.48758 11.0058 Europe/Rome +45.31407 8.85437 Europe/Rome +45.54672 11.5475 Europe/Rome +43.87145 10.25581 Europe/Rome +45.4299 10.98444 Europe/Rome +45.32163 8.41989 Europe/Rome +43.78956 7.60872 Europe/Rome +45.43713 12.33265 Europe/Rome +45.12597 7.63136 Europe/Rome +41.66784 12.78103 Europe/Rome +42.12198 14.70408 Europe/Rome +45.81934 8.82223 Europe/Rome +41.04615 16.88383 Europe/Rome +45.01335 8.63621 Europe/Rome +45.64498 11.29886 Europe/Rome +46.0637 13.24458 Europe/Rome +41.06549 16.92501 Europe/Rome +45.64325 13.7903 Europe/Rome +45.42212 9.06342 Europe/Rome +45.66908 12.23614 Europe/Rome +45.52081 9.59102 Europe/Rome +40.97517 14.1749 Europe/Rome +46.06787 11.12108 Europe/Rome +45.43399 8.7364 Europe/Rome +41.27733 16.41011 Europe/Rome +45.70843 8.90763 Europe/Rome +44.89784 8.86374 Europe/Rome +41.69115 15.29691 Europe/Rome +40.77939 14.39782 Europe/Rome +40.75011 14.45886 Europe/Rome +45.07049 7.68682 Europe/Rome +43.21173 13.2886 Europe/Rome +41.95781 12.80317 Europe/Rome +45.7088 11.47959 Europe/Rome +40.804 14.49309 Europe/Rome +41.28575 13.20135 Europe/Rome +42.56184 12.63667 Europe/Rome +41.98944 14.9926 Europe/Rome +41.12905 16.54536 Europe/Rome +42.66123 13.69901 Europe/Rome +40.41639 17.25478 Europe/Rome +44.99266 10.74941 Europe/Rome +42.04945 13.92578 Europe/Rome +42.75649 12.72051 Europe/Rome +41.71288 13.60251 Europe/Rome +46.16852 9.87134 Europe/Rome +40.88094 14.44262 Europe/Rome +43.32215 11.3259 Europe/Rome +41.50938 13.07698 Europe/Rome +45.64399 9.14838 Europe/Rome +45.14072 7.76376 Europe/Rome +44.27317 9.39683 Europe/Rome +45.53449 9.23401 Europe/Rome +43.83193 11.19924 Europe/Rome +45.68225 9.72715 Europe/Rome +45.65002 9.20548 Europe/Rome +43.71626 13.20882 Europe/Rome +45.57562 9.1262 Europe/Rome +45.49624 9.29323 Europe/Rome +45.71262 11.35671 Europe/Rome +43.75423 11.18794 Europe/Rome +40.75766 14.52919 Europe/Rome +44.30905 8.47715 Europe/Rome +44.64808 7.65677 Europe/Rome +40.40203 17.55267 Europe/Rome +44.54826 10.78962 Europe/Rome +40.72787 8.55037 Europe/Rome +44.11045 9.96541 Europe/Rome +45.62513 9.03517 Europe/Rome +40.80748 14.62151 Europe/Rome +40.65642 17.70814 Europe/Rome +40.79236 16.75873 Europe/Rome +40.72152 14.54021 Europe/Rome +40.94223 14.23476 Europe/Rome +40.87258 14.39744 Europe/Rome +41.08156 14.25342 Europe/Rome +41.68564 15.38148 Europe/Rome +45.65192 10.25681 Europe/Rome +42.04592 14.73922 Europe/Rome +43.81725 7.7772 Europe/Rome +41.83844 15.56535 Europe/Rome +43.69285 10.7831 Europe/Rome +43.69403 10.84522 Europe/Rome +45.10359 7.76803 Europe/Rome +44.46777 11.41401 Europe/Rome +40.83034 14.50342 Europe/Rome +45.39574 9.28757 Europe/Rome +43.56157 11.53316 Europe/Rome +41.70643 15.7277 Europe/Rome +45.38506 11.03458 Europe/Rome +44.63838 11.18419 Europe/Rome +40.83369 14.33894 Europe/Rome +45.4199 9.26628 Europe/Rome +45.63488 12.57211 Europe/Rome +45.39662 11.28768 Europe/Rome +42.90805 13.88276 Europe/Rome +44.81592 9.98637 Europe/Rome +40.67545 14.79328 Europe/Rome +45.95412 12.50274 Europe/Rome +41.11658 16.48974 Europe/Rome +41.00997 17.00558 Europe/Rome +45.38544 9.16088 Europe/Rome +45.07387 11.79109 Europe/Rome +45.88204 11.03647 Europe/Rome +43.38946 10.43615 Europe/Rome +42.67164 14.01481 Europe/Rome +45.52184 9.75233 Europe/Rome +41.89193 12.51133 Europe/Rome +41.7658 12.70188 Europe/Rome +45.07021 7.52658 Europe/Rome +44.05755 12.56528 Europe/Rome +42.42277 12.91436 Europe/Rome +43.99942 12.65689 Europe/Rome +45.52812 9.05182 Europe/Rome +44.69825 10.63125 Europe/Rome +44.41344 12.20121 Europe/Rome +44.3496 9.22796 Europe/Rome +40.92269 14.14844 Europe/Rome +40.85106 17.1219 Europe/Rome +43.87309 11.08278 Europe/Rome +40.82767 14.15321 Europe/Rome +40.64175 15.80794 Europe/Rome +40.83126 8.37519 Europe/Rome +43.25297 13.7597 Europe/Rome +43.17784 13.79411 Europe/Rome +45.78071 12.84052 Europe/Rome +43.30696 13.72058 Europe/Rome +40.81563 14.33716 Europe/Rome +45.95689 12.66051 Europe/Rome +43.66141 10.63067 Europe/Rome +40.74574 14.49698 Europe/Rome +40.90796 14.38493 Europe/Rome +41.66369 12.50015 Europe/Rome +40.80311 14.53904 Europe/Rome +43.47064 11.14804 Europe/Rome +43.93064 10.92365 Europe/Rome +43.70853 10.4036 Europe/Rome +44.98802 7.4601 Europe/Rome +42.93347 10.52757 Europe/Rome +45.50502 9.33151 Europe/Rome +44.88534 7.33135 Europe/Rome +43.94519 10.21827 Europe/Rome +45.04202 9.70462 Europe/Rome +42.4584 14.20283 Europe/Rome +43.90121 12.895 Europe/Rome +43.1122 12.38878 Europe/Rome +45.19205 9.15917 Europe/Rome +44.79935 10.32618 Europe/Rome +45.55405 8.94838 Europe/Rome +41.05562 16.70321 Europe/Rome +45.59816 9.8942 Europe/Rome +40.57762 17.03812 Europe/Rome +40.74989 14.6098 Europe/Rome +45.40797 11.88586 Europe/Rome +45.56899 9.16483 Europe/Rome +40.84985 14.49341 Europe/Rome +40.72484 17.57922 Europe/Rome +43.48206 13.48766 Europe/Rome +41.32879 15.70994 Europe/Rome +45.00547 7.53813 Europe/Rome +40.92334 9.50395 Europe/Rome +45.7862 12.49547 Europe/Rome +40.31949 9.31394 Europe/Rome +44.76459 8.78981 Europe/Rome +45.5305 9.13954 Europe/Rome +45.44834 8.62328 Europe/Rome +45.58882 9.19792 Europe/Rome +40.92606 14.52816 Europe/Rome +41.03449 16.98963 Europe/Rome +40.79356 17.12681 Europe/Rome +40.74217 14.67564 Europe/Rome +40.75448 14.63919 Europe/Rome +44.99313 7.64135 Europe/Rome +41.48647 12.67046 Europe/Rome +45.55343 8.9792 Europe/Rome +40.15308 18.01183 Europe/Rome +40.85631 14.24641 Europe/Rome +40.90936 14.20984 Europe/Rome +45.58878 9.22784 Europe/Rome +45.58005 9.27246 Europe/Rome +45.41317 10.39799 Europe/Rome +43.5252 11.57238 Europe/Rome +42.51185 14.13729 Europe/Rome +42.0784 12.59636 Europe/Rome +43.92686 11.03718 Europe/Rome +45.50369 11.412 Europe/Rome +43.88153 10.7723 Europe/Rome +45.77504 12.04904 Europe/Rome +40.94918 17.29717 Europe/Rome +45.80052 13.53777 Europe/Rome +41.11733 13.8875 Europe/Rome +44.39603 7.81764 Europe/Rome +45.0031 7.69202 Europe/Rome +41.19695 16.59503 Europe/Rome +41.05906 17.08512 Europe/Rome +45.55594 12.24294 Europe/Rome +41.09454 16.7959 Europe/Rome +44.64783 10.92539 Europe/Rome +45.49458 12.10775 Europe/Rome +44.88515 11.06902 Europe/Rome +45.43 12.11972 Europe/Rome +41.25316 13.73496 Europe/Rome +45.46427 9.18951 Europe/Rome +45.47152 12.24017 Europe/Rome +40.55851 17.80774 Europe/Rome +46.66817 11.15953 Europe/Rome +42.03539 12.64413 Europe/Rome +45.4981 9.42043 Europe/Rome +40.91948 14.23104 Europe/Rome +45.35781 9.3236 Europe/Rome +45.66115 9.15928 Europe/Rome +40.66983 16.59723 Europe/Rome +40.58618 17.11635 Europe/Rome +44.02079 10.11869 Europe/Rome +40.70142 17.33304 Europe/Rome +41.7635 12.63072 Europe/Rome +44.03837 10.04142 Europe/Rome +40.922 14.45412 Europe/Rome +45.69092 9.18243 Europe/Rome +41.03064 14.29868 Europe/Rome +40.89601 14.17476 Europe/Rome +45.16031 10.79784 Europe/Rome +41.62746 15.91038 Europe/Rome +40.40234 17.63352 Europe/Rome +45.79377 8.88104 Europe/Rome +45.46279 8.87915 Europe/Rome +41.03578 14.3823 Europe/Rome +43.29789 13.45293 Europe/Rome +44.42277 11.90817 Europe/Rome +41.5055 15.3391 Europe/Rome +43.8497 10.47234 Europe/Rome +45.30989 9.50085 Europe/Rome +43.54427 10.32615 Europe/Rome +45.61236 9.23985 Europe/Rome +45.60016 9.12833 Europe/Rome +41.73212 12.27654 Europe/Rome +45.4105 12.36649 Europe/Rome +45.5947 8.91355 Europe/Rome +45.18956 11.25616 Europe/Rome +45.85317 9.39005 Europe/Rome +40.35481 18.17244 Europe/Rome +41.46614 12.9043 Europe/Rome +44.11096 9.83632 Europe/Rome +42.35055 13.39954 Europe/Rome +42.22638 14.39582 Europe/Rome +45.57176 9.02681 Europe/Rome +41.9553 12.07899 Europe/Rome +45.46723 7.87617 Europe/Rome +41.60003 14.23701 Europe/Rome +40.73913 13.951 Europe/Rome +40.73793 13.94862 Europe/Rome +45.93778 8.57088 Europe/Rome +43.8875 8.03083 Europe/Rome +44.35916 11.7132 Europe/Rome +43.52142 13.24368 Europe/Rome +41.99232 12.71876 Europe/Rome +40.93591 14.25983 Europe/Rome +45.05837 7.58458 Europe/Rome +40.53694 17.43723 Europe/Rome +41.78888 12.67677 Europe/Rome +42.76871 11.10955 Europe/Rome +40.81892 16.42148 Europe/Rome +40.69572 14.51545 Europe/Rome +45.94088 13.62167 Europe/Rome +45.53069 9.40531 Europe/Rome +45.69066 9.20886 Europe/Rome +42.75381 13.9665 Europe/Rome +40.93188 14.19557 Europe/Rome +41.185 16.67054 Europe/Rome +40.80415 16.92387 Europe/Rome +40.5769 16.75655 Europe/Rome +45.40335 10.27748 Europe/Rome +41.70113 12.69246 Europe/Rome +44.4264 8.91519 Europe/Rome +45.57438 9.07537 Europe/Rome +40.05549 17.99726 Europe/Rome +45.66019 8.79164 Europe/Rome +40.17416 18.17032 Europe/Rome +41.21408 13.57082 Europe/Rome +41.63759 13.33541 Europe/Rome +40.9558 14.27201 Europe/Rome +40.93971 14.27329 Europe/Rome +41.82124 12.66294 Europe/Rome +40.53123 17.58522 Europe/Rome +42.42158 14.28217 Europe/Rome +44.55077 7.71922 Europe/Rome +43.91507 11.04071 Europe/Rome +44.57677 10.84544 Europe/Rome +41.26126 13.6414 Europe/Rome +44.22054 12.05245 Europe/Rome +40.70876 13.8649 Europe/Rome +41.35285 13.43227 Europe/Rome +42.92779 10.76451 Europe/Rome +42.95324 12.70664 Europe/Rome +41.45845 15.55188 Europe/Rome +41.76747 12.22907 Europe/Rome +43.77925 11.24626 Europe/Rome +44.54346 10.83085 Europe/Rome +44.86223 10.06546 Europe/Rome +44.84346 11.60868 Europe/Rome +43.16296 13.72274 Europe/Rome +40.83805 17.35836 Europe/Rome +43.84052 13.01665 Europe/Rome +43.61548 13.37463 Europe/Rome +44.2857 11.88334 Europe/Rome +43.34065 12.90726 Europe/Rome +40.8138 14.36382 Europe/Rome +45.8088 9.22609 Europe/Rome +43.71946 10.94445 Europe/Rome +40.61423 15.05998 Europe/Rome +46.1165 8.29313 Europe/Rome +45.61831 9.20249 Europe/Rome +45.46222 10.55264 Europe/Rome +45.64658 9.60213 Europe/Rome +45.55187 9.18373 Europe/Rome +44.39071 7.54828 Europe/Rome +45.14047 10.02297 Europe/Rome +45.36264 9.68176 Europe/Rome +45.43099 9.11093 Europe/Rome +44.76737 10.78345 Europe/Rome +45.49415 9.02458 Europe/Rome +45.54343 9.16652 Europe/Rome +45.9836 12.70038 Europe/Rome +41.14273 16.40652 Europe/Rome +40.26821 18.0543 Europe/Rome +40.96836 17.11329 Europe/Rome +45.88246 12.29645 Europe/Rome +45.80079 9.08065 Europe/Rome +45.53004 9.27795 Europe/Rome +45.07919 7.57832 Europe/Rome +41.72868 13.00314 Europe/Rome +43.41463 11.12824 Europe/Rome +42.09325 11.79674 Europe/Rome +43.46556 12.2375 Europe/Rome +41.5908 12.82808 Europe/Rome +45.22673 7.5998 Europe/Rome +45.55646 9.22104 Europe/Rome +41.79916 12.60722 Europe/Rome +45.19418 7.90055 Europe/Rome +45.21857 12.27774 Europe/Rome +42.38284 14.13987 Europe/Rome +45.01054 7.82133 Europe/Rome +44.31771 9.32241 Europe/Rome +45.53763 9.92699 Europe/Rome +44.19987 12.3991 Europe/Rome +44.1391 12.24315 Europe/Rome +45.62915 9.15189 Europe/Rome +44.26204 12.34812 Europe/Rome +41.9908 12.09082 Europe/Rome +45.52716 9.3334 Europe/Rome +41.26383 15.8998 Europe/Rome +40.86043 14.35733 Europe/Rome +44.73099 11.28716 Europe/Rome +40.6462 17.51661 Europe/Rome +43.30621 10.51729 Europe/Rome +40.70091 14.70564 Europe/Rome +43.96182 12.73631 Europe/Rome +45.3902 10.48619 Europe/Rome +41.01161 13.9561 Europe/Rome +44.57707 11.36071 Europe/Rome +40.70805 14.48597 Europe/Rome +45.67254 11.93728 Europe/Rome +44.59445 11.04979 Europe/Rome +41.48581 13.82835 Europe/Rome +45.52853 9.51507 Europe/Rome +40.90906 14.29363 Europe/Rome +41.07619 14.34002 Europe/Rome +43.6843 10.50395 Europe/Rome +40.95653 16.92075 Europe/Rome +40.90834 14.34993 Europe/Rome +45.13338 8.4525 Europe/Rome +44.47563 11.27495 Europe/Rome +41.01142 14.12346 Europe/Rome +44.05405 10.06049 Europe/Rome +44.78237 10.8777 Europe/Rome +44.84963 7.72032 Europe/Rome +40.93619 14.29925 Europe/Rome +45.67149 9.23576 Europe/Rome +41.10519 14.21269 Europe/Rome +43.8438 10.5691 Europe/Rome +45.73626 9.13664 Europe/Rome +41.21954 16.06768 Europe/Rome +41.55947 14.66737 Europe/Rome +43.82802 11.13527 Europe/Rome +43.909 10.25038 Europe/Rome +40.95753 14.30591 Europe/Rome +45.61128 8.84914 Europe/Rome +45.46903 10.85371 Europe/Rome +40.92237 14.42386 Europe/Rome +45.55301 9.29907 Europe/Rome +40.63215 17.93607 Europe/Rome +45.53792 9.18921 Europe/Rome +46.71503 11.65598 Europe/Rome +45.53558 10.21472 Europe/Rome +44.69944 7.84979 Europe/Rome +45.61019 9.15301 Europe/Rome +40.77408 14.50708 Europe/Rome +45.69879 8.46823 Europe/Rome +46.49067 11.33982 Europe/Rome +44.49381 11.33875 Europe/Rome +45.54647 9.12054 Europe/Rome +41.11006 16.69086 Europe/Rome +41.24106 16.49492 Europe/Rome +45.5663 8.05499 Europe/Rome +45.69601 9.66721 Europe/Rome +41.1256 14.78101 Europe/Rome +46.14675 12.21324 Europe/Rome +40.6045 14.9876 Europe/Rome +43.06425 12.54612 Europe/Rome +45.76231 11.73112 Europe/Rome +41.31429 16.28165 Europe/Rome +41.11148 16.8554 Europe/Rome +45.47506 8.9978 Europe/Rome +40.81322 14.16807 Europe/Rome +40.79926 14.07846 Europe/Rome +42.03908 13.43847 Europe/Rome +40.97259 14.20745 Europe/Rome +40.92033 14.79652 Europe/Rome +44.90162 8.20751 Europe/Rome +42.85185 13.60658 Europe/Rome +45.51629 11.34414 Europe/Rome +40.91353 14.26741 Europe/Rome +41.7108 12.66255 Europe/Rome +43.44708 11.86867 Europe/Rome +45.552 9.07265 Europe/Rome +41.6123 12.51433 Europe/Rome +45.62675 9.32454 Europe/Rome +41.58808 12.65729 Europe/Rome +45.73764 7.31722 Europe/Rome +41.48493 12.61883 Europe/Rome +40.74066 14.56936 Europe/Rome +41.23117 16.29797 Europe/Rome +43.5942 13.50337 Europe/Rome +40.82664 16.54952 Europe/Rome +45.09964 7.52199 Europe/Rome +40.56541 8.32092 Europe/Rome +44.90924 8.61007 Europe/Rome +45.34896 11.88807 Europe/Rome +44.04997 8.21829 Europe/Rome +41.72513 12.63402 Europe/Rome +44.6999 8.0347 Europe/Rome +40.35183 14.99988 Europe/Rome +40.9242 14.31323 Europe/Rome +41.0033 16.87208 Europe/Rome +44.67508 8.46476 Europe/Rome +40.89704 16.8433 Europe/Rome +41.76337 12.33078 Europe/Rome +40.94744 14.37261 Europe/Rome +45.39821 8.91678 Europe/Rome +45.35753 11.78725 Europe/Rome +45.49306 12.16056 Europe/Rome +45.92136 8.55183 Europe/Rome +45.64788 10.26487 Europe/Rome +41.99362 12.72238 Europe/Rome +38.96589 16.3092 Europe/Rome +45.59777 9.04634 Europe/Rome +45.66972 8.81996 Europe/Rome +41.00581 14.45583 Europe/Rome +41.06073 14.3348 Europe/Rome +40.88088 14.11436 Europe/Rome +40.96651 14.26803 Europe/Rome +40.89921 14.27663 Europe/Rome +40.87363 14.34085 Europe/Rome +37.56085 15.06292 Europe/Rome +45.44207 9.09445 Europe/Rome +41.99771 12.61814 Europe/Rome +41.63431 12.44768 Europe/Rome +44.14212 12.47 Europe/Rome +41.96357 12.75633 Europe/Rome +41.55439 12.54115 Europe/Rome +43.30782 13.73139 Europe/Rome +41.12476 16.79258 Europe/Rome +40.86626 14.07582 Europe/Rome +45.43546 9.1187 Europe/Rome +38.02739 12.55146 Europe/Rome +40.88882 14.32015 Europe/Rome +40.52218 17.27401 Europe/Rome +39.62713 16.51368 Europe/Rome +49.18804 -2.10491 Europe/Jersey +17.99107 -76.95742 America/Jamaica +18.21895 -78.1332 America/Jamaica +17.97024 -76.86722 America/Jamaica +17.94144 -77.10898 America/Jamaica +18.00747 -76.78319 America/Jamaica +18.47116 -77.91883 America/Jamaica +17.96454 -77.24515 America/Jamaica +18.04168 -77.50714 America/Jamaica +18.13683 -77.03171 America/Jamaica +17.99702 -76.79358 America/Jamaica +18.01248 -76.79928 America/Jamaica +31.95126 35.81979 Asia/Amman +31.88542 35.8543 Asia/Amman +31.87207 36.00501 Asia/Amman +31.71667 35.8 Asia/Amman +30.19624 35.73405 Asia/Amman +32.27639 35.59938 Asia/Amman +32.40792 35.70802 Asia/Amman +32.28082 35.89929 Asia/Amman +31.15889 35.69278 Asia/Amman +32.55556 35.85 Asia/Amman +32.07275 36.08796 Asia/Amman +32.50722 35.8575 Asia/Amman +30.83752 35.60442 Asia/Amman +32.03917 35.72722 Asia/Amman +31.03608 35.46544 Asia/Amman +32.55917 36.00694 Asia/Amman +32.3063 35.75653 Asia/Amman +31.95522 35.94503 Asia/Amman +31.9167 35.95 Asia/Amman +32.34289 36.20804 Asia/Amman +31.18248 35.69999 Asia/Amman +32.02581 35.86458 Asia/Amman +29.52667 35.00778 Asia/Amman +32.33385 35.75238 Asia/Amman +31.16368 35.76204 Asia/Amman +32.01778 36.04639 Asia/Amman +33.73333 135.98333 Asia/Tokyo +35.43889 139.35972 Asia/Tokyo +34.63333 134.98333 Asia/Tokyo +35.29264 139.57735 Asia/Tokyo +35.48889 139.38861 Asia/Tokyo +39.01573 139.92909 Asia/Tokyo +33.72873 130.983 Asia/Tokyo +36.3 139.88333 Asia/Tokyo +35.15 139.06667 Asia/Tokyo +35.88528 139.83944 Asia/Tokyo +36.25 138.98333 Asia/Tokyo +37.68333 138.88333 Asia/Tokyo +36.11667 139.2 Asia/Tokyo +35.88333 139.63333 Asia/Tokyo +35.43333 133.33333 Asia/Tokyo +35.28361 139.66722 Asia/Tokyo +35.44778 139.6425 Asia/Tokyo +34.96667 136.61667 Asia/Tokyo +35.11626 136.19768 Asia/Tokyo +34.87009 135.7027 Asia/Tokyo +32.5 130.6 Asia/Tokyo +36.56667 137.13333 Asia/Tokyo +35.42146 133.24224 Asia/Tokyo +34.91667 134.96667 Asia/Tokyo +35.82255 139.83905 Asia/Tokyo +34.61667 135.6 Asia/Tokyo +33.96667 132.11667 Asia/Tokyo +33.16667 130.4 Asia/Tokyo +35 134.55 Asia/Tokyo +34.18583 131.47139 Asia/Tokyo +33.01667 130.68333 Asia/Tokyo +34.86877 138.31952 Asia/Tokyo +36.8 139.93333 Asia/Tokyo +34.06667 134.15 Asia/Tokyo +36.56583 139.88361 Asia/Tokyo +32.68333 130.66667 Asia/Tokyo +33.12342 131.80401 Asia/Tokyo +32.19537 130.02554 Asia/Tokyo +33.1 129.98333 Asia/Tokyo +35.67056 139.88861 Asia/Tokyo +36.8 137.4 Asia/Tokyo +33.56826 130.51009 Asia/Tokyo +36.68333 139.96667 Asia/Tokyo +34.88333 135.8 Asia/Tokyo +35.61667 139.11667 Asia/Tokyo +34.75 136.13333 Asia/Tokyo +32.9 130.68333 Asia/Tokyo +36.4 138.26667 Asia/Tokyo +33.94306 131.25111 Asia/Tokyo +35.05215 133.99885 Asia/Tokyo +35.16667 136.71667 Asia/Tokyo +33.24528 131.69166 Asia/Tokyo +38.72167 139.82167 Asia/Tokyo +36.45 136.63333 Asia/Tokyo +35.64547 136.0558 Asia/Tokyo +32.1 131.4 Asia/Tokyo +33.07539 131.86907 Asia/Tokyo +33.27668 131.15628 Asia/Tokyo +36.67012 136.7403 Asia/Tokyo +37.6645 138.92518 Asia/Tokyo +34.73028 136.50861 Asia/Tokyo +35.08333 137.15 Asia/Tokyo +36.29991 137.90108 Asia/Tokyo +35.54008 134.82038 Asia/Tokyo +34.78244 135.46932 Asia/Tokyo +34.81667 137.4 Asia/Tokyo +34.76667 137.38333 Asia/Tokyo +34.70933 136.93425 Asia/Tokyo +36.69528 137.21139 Asia/Tokyo +35.5 134.23333 Asia/Tokyo +33.36667 130.51667 Asia/Tokyo +34.48333 134.18333 Asia/Tokyo +34.5 135.6 Asia/Tokyo +36.25 138.9 Asia/Tokyo +26.185 127.675 Asia/Tokyo +35.6895 139.69171 Asia/Tokyo +34.05 131.81667 Asia/Tokyo +34.06583 134.55944 Asia/Tokyo +35.79916 139.46903 Asia/Tokyo +34.88333 136.85 Asia/Tokyo +35.35 137.18333 Asia/Tokyo +37.13333 138.76667 Asia/Tokyo +32.83333 129.85 Asia/Tokyo +37.47642 138.99513 Asia/Tokyo +36.38333 139.73333 Asia/Tokyo +34.4833 136.84186 Asia/Tokyo +34.58333 135.83333 Asia/Tokyo +39.9 139.96667 Asia/Tokyo +34.55 135.8 Asia/Tokyo +35.98426 137.99721 Asia/Tokyo +34.86667 134.55 Asia/Tokyo +34.98333 139.86667 Asia/Tokyo +36.25 139.53333 Asia/Tokyo +31.48333 130.7 Asia/Tokyo +35.36667 136.53333 Asia/Tokyo +33.35 130.68333 Asia/Tokyo +36.36667 139.58333 Asia/Tokyo +35.72526 139.5383 Asia/Tokyo +35.7303 139.53391 Asia/Tokyo +34.81667 135.76667 Asia/Tokyo +33.73333 135.36667 Asia/Tokyo +34.48333 133.95 Asia/Tokyo +32.91667 130.56667 Asia/Tokyo +36.3 139.11667 Asia/Tokyo +34.85 136.91667 Asia/Tokyo +33.2 130.01667 Asia/Tokyo +34.33833 132.91667 Asia/Tokyo +35.90393 136.16687 Asia/Tokyo +32.96667 131.4 Asia/Tokyo +36.13333 137.25 Asia/Tokyo +34.84833 135.61678 Asia/Tokyo +36.33333 139.01667 Asia/Tokyo +34.79936 135.35697 Asia/Tokyo +36.75 137.01667 Asia/Tokyo +32.13333 131.5 Asia/Tokyo +34.34028 134.04333 Asia/Tokyo +34.51667 135.43333 Asia/Tokyo +34.78333 133.61667 Asia/Tokyo +34.91667 136.98333 Asia/Tokyo +33.5567 131.44506 Asia/Tokyo +35.31667 137.13333 Asia/Tokyo +34.66667 137.26667 Asia/Tokyo +33.63333 130.8 Asia/Tokyo +34.275 133.75 Asia/Tokyo +34.88333 136.58333 Asia/Tokyo +36.65 138.31667 Asia/Tokyo +36.03799 138.11308 Asia/Tokyo +33.39471 133.29128 Asia/Tokyo +34.35 134.9 Asia/Tokyo +32.93333 132.73333 Asia/Tokyo +34.76143 135.51567 Asia/Tokyo +37.84608 139.23039 Asia/Tokyo +36.03107 139.72636 Asia/Tokyo +31.65 131.01667 Asia/Tokyo +35.82028 139.80444 Asia/Tokyo +34.66667 133.75 Asia/Tokyo +35.25 136.71667 Asia/Tokyo +36.06667 139.6 Asia/Tokyo +34.85 133.01667 Asia/Tokyo +34.97694 138.38306 Asia/Tokyo +37.76354 139.02199 Asia/Tokyo +36.01839 139.66034 Asia/Tokyo +34.78333 134.71667 Asia/Tokyo +37.03757 138.84867 Asia/Tokyo +36.1 137.96667 Asia/Tokyo +34.9 137.5 Asia/Tokyo +34.55543 133.27297 Asia/Tokyo +33.71667 130.43333 Asia/Tokyo +33.95 130.95 Asia/Tokyo +36.3 139.98333 Asia/Tokyo +34.66667 138.95 Asia/Tokyo +34.18333 135.2 Asia/Tokyo +36.77957 137.07576 Asia/Tokyo +34.81667 138.18333 Asia/Tokyo +32.78333 130.36667 Asia/Tokyo +35.83333 139.58333 Asia/Tokyo +34.32333 134.17333 Asia/Tokyo +31.46667 131.105 Asia/Tokyo +36.48333 139 Asia/Tokyo +37.95 139.33333 Asia/Tokyo +35.23333 137.1 Asia/Tokyo +33.15 130.46667 Asia/Tokyo +31.81667 130.3 Asia/Tokyo +36.07254 139.72615 Asia/Tokyo +33.15917 129.72278 Asia/Tokyo +35.06667 135.21667 Asia/Tokyo +33.61561 130.55106 Asia/Tokyo +36.31667 139.58333 Asia/Tokyo +37.61667 138.95 Asia/Tokyo +34.88333 135.23333 Asia/Tokyo +34.5 135.85 Asia/Tokyo +36.21667 138.48333 Asia/Tokyo +38.91667 139.855 Asia/Tokyo +35.55 133.23333 Asia/Tokyo +34.31667 133.85 Asia/Tokyo +36.26667 139.25 Asia/Tokyo +36.1 139.8 Asia/Tokyo +34.58333 135.46667 Asia/Tokyo +35.95694 139.38889 Asia/Tokyo +32.95 131.9 Asia/Tokyo +34.68503 138.20461 Asia/Tokyo +33.24932 130.2988 Asia/Tokyo +35.94647 136.18498 Asia/Tokyo +35.65 138.5 Asia/Tokyo +38.07817 138.4394 Asia/Tokyo +32.86667 130.86667 Asia/Tokyo +36.3 139.8 Asia/Tokyo +34.60359 138.21719 Asia/Tokyo +34.06667 136.2 Asia/Tokyo +35.6 138.93333 Asia/Tokyo +35.00444 135.86833 Asia/Tokyo +34.2 132.21667 Asia/Tokyo +36.3 139.36667 Asia/Tokyo +34.69374 135.50218 Asia/Tokyo +34.41667 133.2 Asia/Tokyo +34.00139 131.18361 Asia/Tokyo +35.98106 136.48727 Asia/Tokyo +34.85 134.93333 Asia/Tokyo +34.28333 132.26667 Asia/Tokyo +33.03333 130.45 Asia/Tokyo +32.92139 129.95389 Asia/Tokyo +35.78389 139.24306 Asia/Tokyo +36.43333 139.28333 Asia/Tokyo +36.5 137.86667 Asia/Tokyo +32.06667 130.61667 Asia/Tokyo +36 139.55722 Asia/Tokyo +34.95 137.16667 Asia/Tokyo +34.66167 133.935 Asia/Tokyo +36.05659 138.0451 Asia/Tokyo +33.2 130.35 Asia/Tokyo +37.3 138.8 Asia/Tokyo +33.23806 131.6125 Asia/Tokyo +35.30306 139.30278 Asia/Tokyo +35.85091 139.51998 Asia/Tokyo +34.1 131.4 Asia/Tokyo +36.05 139.26667 Asia/Tokyo +35.35 136.61667 Asia/Tokyo +35.25556 139.15972 Asia/Tokyo +35.19025 132.50846 Asia/Tokyo +35 136.96667 Asia/Tokyo +32.81667 129.88333 Asia/Tokyo +35.49576 135.74604 Asia/Tokyo +36.93744 137.50059 Asia/Tokyo +35.1 138.86667 Asia/Tokyo +36.63333 139.05 Asia/Tokyo +36.53333 136.61667 Asia/Tokyo +33.73996 130.72282 Asia/Tokyo +35.94111 139.85806 Asia/Tokyo +32.58333 131.66667 Asia/Tokyo +34.98333 134.96667 Asia/Tokyo +34.86667 137.05 Asia/Tokyo +30.73333 131 Asia/Tokyo +34.71667 135.33333 Asia/Tokyo +35.7 138.45 Asia/Tokyo +35.30333 139.25333 Asia/Tokyo +36.75 139.61667 Asia/Tokyo +37.80024 139.1224 Asia/Tokyo +34.98333 133.46667 Asia/Tokyo +33.96047 133.30522 Asia/Tokyo +37.90222 139.02361 Asia/Tokyo +31.6 131.36667 Asia/Tokyo +28.36667 129.48333 Asia/Tokyo +34.18333 134.61667 Asia/Tokyo +34.68505 135.80485 Asia/Tokyo +37.05 136.96667 Asia/Tokyo +36.76667 137.33333 Asia/Tokyo +35.48333 137.5 Asia/Tokyo +33.59811 131.1883 Asia/Tokyo +36.58333 138.85 Asia/Tokyo +36.75 138.36667 Asia/Tokyo +32.98333 132.93333 Asia/Tokyo +33.81667 130.7 Asia/Tokyo +26.2125 127.68111 Asia/Tokyo +35.18147 136.90641 Asia/Tokyo +26.58806 127.97611 Asia/Tokyo +32.74472 129.87361 Asia/Tokyo +35.8563 139.90266 Asia/Tokyo +37.45 138.85 Asia/Tokyo +36.65139 138.18111 Asia/Tokyo +35.38333 136.26667 Asia/Tokyo +34.61667 136.08333 Asia/Tokyo +35.70611 139.55944 Asia/Tokyo +33.28662 134.16832 Asia/Tokyo +37.69257 139.17127 Asia/Tokyo +38.23333 139.48333 Asia/Tokyo +34.96545 135.70415 Asia/Tokyo +37.06667 138.88333 Asia/Tokyo +35.93556 139.30444 Asia/Tokyo +35.06667 135.98333 Asia/Tokyo +34.73333 135.56667 Asia/Tokyo +34.83333 137.93333 Asia/Tokyo +35.36667 137.25 Asia/Tokyo +34.8 132.85 Asia/Tokyo +35.53333 135.18333 Asia/Tokyo +31.91111 131.42389 Asia/Tokyo +31.73333 131.06667 Asia/Tokyo +33.70811 130.65297 Asia/Tokyo +37.53333 138.93333 Asia/Tokyo +36.01667 139.98333 Asia/Tokyo +35.41667 137.13333 Asia/Tokyo +35.68351 139.55963 Asia/Tokyo +35.11667 138.91667 Asia/Tokyo +34.82691 135.47057 Asia/Tokyo +35.53333 136.91667 Asia/Tokyo +35.48333 139.45 Asia/Tokyo +32.21667 130.4 Asia/Tokyo +34.96667 136.16667 Asia/Tokyo +36.21706 136.15185 Asia/Tokyo +34.8 134.98333 Asia/Tokyo +34.4 133.08333 Asia/Tokyo +36.41667 139.8 Asia/Tokyo +36.21667 139.38333 Asia/Tokyo +36.51667 136.56667 Asia/Tokyo +36.23333 137.96667 Asia/Tokyo +35.47222 133.05056 Asia/Tokyo +35.78333 139.9 Asia/Tokyo +32.65 130.66667 Asia/Tokyo +34.56667 135.55 Asia/Tokyo +34.66667 131.85 Asia/Tokyo +36.1534 136.27029 Asia/Tokyo +36.31667 138.26667 Asia/Tokyo +34.28333 133.78333 Asia/Tokyo +31.26667 130.31667 Asia/Tokyo +37.75 138.88333 Asia/Tokyo +35.45 135.33333 Asia/Tokyo +36.39111 139.06083 Asia/Tokyo +33.55 130.2 Asia/Tokyo +35.54028 139.45083 Asia/Tokyo +35.02107 135.75385 Asia/Tokyo +31.71667 130.26667 Asia/Tokyo +35.01667 135.96667 Asia/Tokyo +33.31667 130.51667 Asia/Tokyo +35.35 136.78333 Asia/Tokyo +36.13333 139.7 Asia/Tokyo +34.23222 132.56658 Asia/Tokyo +35.43333 133.81667 Asia/Tokyo +34.58333 133.76667 Asia/Tokyo +32.80589 130.69181 Asia/Tokyo +36.13333 139.38333 Asia/Tokyo +36.06739 139.67498 Asia/Tokyo +34 131.86667 Asia/Tokyo +34.8 137.35889 Asia/Tokyo +36.73403 137.14186 Asia/Tokyo +35.88333 139.78333 Asia/Tokyo +34.7184 137.53175 Asia/Tokyo +36.06868 139.51684 Asia/Tokyo +35.33165 136.87042 Asia/Tokyo +36.31667 138.43333 Asia/Tokyo +35 136.51667 Asia/Tokyo +34 134.58333 Asia/Tokyo +36.40263 136.45088 Asia/Tokyo +35.28333 136.91667 Asia/Tokyo +35.70222 139.47556 Asia/Tokyo +31.73333 130.76667 Asia/Tokyo +36.18333 139.71667 Asia/Tokyo +33.73333 130.46667 Asia/Tokyo +35.66389 138.56833 Asia/Tokyo +36.18333 139.13333 Asia/Tokyo +33.55972 133.53111 Asia/Tokyo +34.6913 135.183 Asia/Tokyo +31.98333 130.98333 Asia/Tokyo +33.41998 131.61836 Asia/Tokyo +33.83333 130.83333 Asia/Tokyo +37.65 139.86667 Asia/Tokyo +35.16667 135.91667 Asia/Tokyo +34.46667 135.36667 Asia/Tokyo +35.37472 139.9225 Asia/Tokyo +36.1 139.58333 Asia/Tokyo +36.4 139.33333 Asia/Tokyo +32.98333 130.81667 Asia/Tokyo +36.11667 139.6 Asia/Tokyo +35.52056 139.71722 Asia/Tokyo +33.59993 130.81495 Asia/Tokyo +34.81667 135.41667 Asia/Tokyo +35.80521 139.71072 Asia/Tokyo +35.90861 139.48528 Asia/Tokyo +36.06173 136.50101 Asia/Tokyo +35.98122 139.74424 Asia/Tokyo +35.24762 136.97229 Asia/Tokyo +37.36667 138.55 Asia/Tokyo +35.85444 139.96889 Asia/Tokyo +33.10611 130.09056 Asia/Tokyo +34.50896 135.7929 Asia/Tokyo +34.58333 135.61667 Asia/Tokyo +31.41667 130.31667 Asia/Tokyo +34.5 133.5 Asia/Tokyo +35.36667 136.76667 Asia/Tokyo +34.98333 136.98333 Asia/Tokyo +33.4425 129.96972 Asia/Tokyo +33.3 130.36667 Asia/Tokyo +36.55 139.73333 Asia/Tokyo +31.38333 130.85 Asia/Tokyo +34.11667 133.65 Asia/Tokyo +34.55808 133.41796 Asia/Tokyo +35.13333 136.8 Asia/Tokyo +36.4 139 Asia/Tokyo +33.78333 130.98333 Asia/Tokyo +36.59444 136.62556 Asia/Tokyo +34.82022 138.12775 Asia/Tokyo +34.06667 134.35 Asia/Tokyo +34.53333 133.58333 Asia/Tokyo +37.66442 139.03502 Asia/Tokyo +35.70034 139.55665 Asia/Tokyo +36.43333 139.91667 Asia/Tokyo +36.7 137.36667 Asia/Tokyo +34.85 136.45 Asia/Tokyo +35 135.58333 Asia/Tokyo +37.87214 139.1099 Asia/Tokyo +35.30889 139.55028 Asia/Tokyo +34.76667 134.85 Asia/Tokyo +34.76667 138.01667 Asia/Tokyo +35.41667 136.86667 Asia/Tokyo +35.96536 140.64474 Asia/Tokyo +31.73333 130.66667 Asia/Tokyo +34.45 135.35 Asia/Tokyo +34.15 135.2 Asia/Tokyo +31.56018 130.55814 Asia/Tokyo +34.73333 135.58333 Asia/Tokyo +35.36667 132.76667 Asia/Tokyo +34.5 135.4 Asia/Tokyo +34.48333 135.43333 Asia/Tokyo +32.08333 130.36667 Asia/Tokyo +35.95225 139.68502 Asia/Tokyo +34.7 137.85 Asia/Tokyo +35.28333 136.86667 Asia/Tokyo +34.16297 132.22 Asia/Tokyo +36.05 139.9 Asia/Tokyo +34.25 135.31667 Asia/Tokyo +35.72528 139.21778 Asia/Tokyo +26.12647 127.66918 Asia/Tokyo +37.03333 137.85 Asia/Tokyo +34.96667 139.08333 Asia/Tokyo +34.78427 135.40126 Asia/Tokyo +34.8 137.01667 Asia/Tokyo +26.42333 127.82139 Asia/Tokyo +34.06667 134.43333 Asia/Tokyo +36.11667 139.96667 Asia/Tokyo +24.34478 124.15717 Asia/Tokyo +36.31667 139.2 Asia/Tokyo +35.39056 139.30778 Asia/Tokyo +34.48333 136.7 Asia/Tokyo +35.65 138.63333 Asia/Tokyo +32.84111 130.04306 Asia/Tokyo +35.37995 136.94295 Asia/Tokyo +33.55 133.43333 Asia/Tokyo +34.28333 133.18333 Asia/Tokyo +35.25 136.78333 Asia/Tokyo +35.82756 137.95378 Asia/Tokyo +33.26667 129.88333 Asia/Tokyo +36.71667 139.68333 Asia/Tokyo +34.68333 135.7 Asia/Tokyo +34.82208 135.4298 Asia/Tokyo +34.01667 133.8 Asia/Tokyo +31.61667 130.4 Asia/Tokyo +33.63654 130.68678 Asia/Tokyo +36.85 138.36667 Asia/Tokyo +35.51965 137.82074 Asia/Tokyo +35.3 136.8 Asia/Tokyo +31.23333 130.65 Asia/Tokyo +34.81641 135.56828 Asia/Tokyo +34.6 133.46667 Asia/Tokyo +36.3396 137.88254 Asia/Tokyo +36.23333 139.18333 Asia/Tokyo +32.45 130.2 Asia/Tokyo +34.05 131.56667 Asia/Tokyo +32.21667 130.75 Asia/Tokyo +33.3213 130.94098 Asia/Tokyo +34.66667 136.46667 Asia/Tokyo +34.39627 132.45937 Asia/Tokyo +35.32306 139.34222 Asia/Tokyo +35.43333 132.81667 Asia/Tokyo +24.80379 125.30222 Asia/Tokyo +34.81352 135.64914 Asia/Tokyo +33.36853 129.55247 Asia/Tokyo +35.67306 139.40028 Asia/Tokyo +35 136.25 Asia/Tokyo +36.85 136.98333 Asia/Tokyo +34.81667 134.7 Asia/Tokyo +35.25 136.25 Asia/Tokyo +33.37081 131.53025 Asia/Tokyo +34.88333 136.98333 Asia/Tokyo +35.27651 139.57733 Asia/Tokyo +34.35 132.33333 Asia/Tokyo +35.83314 139.7425 Asia/Tokyo +34.31667 135.61667 Asia/Tokyo +36.16667 139.53333 Asia/Tokyo +35.85194 139.31806 Asia/Tokyo +34.88333 136.93333 Asia/Tokyo +31.71667 130.73333 Asia/Tokyo +34.7 137.73333 Asia/Tokyo +34.8 137.78333 Asia/Tokyo +34.88333 132.08333 Asia/Tokyo +36.88333 136.78333 Asia/Tokyo +34.53333 135.95 Asia/Tokyo +34.4 131.41667 Asia/Tokyo +26.33694 127.87194 Asia/Tokyo +35.37111 139.22361 Asia/Tokyo +35.65583 139.32389 Asia/Tokyo +35.12861 136.0976 Asia/Tokyo +36.13333 139.45 Asia/Tokyo +26.35937 127.86735 Asia/Tokyo +35.00856 132.2257 Asia/Tokyo +35.3 138.93333 Asia/Tokyo +37.73333 139.16667 Asia/Tokyo +34.45 135.73333 Asia/Tokyo +34.35 135.7 Asia/Tokyo +35.41667 136.6 Asia/Tokyo +33.88333 135.15 Asia/Tokyo +26.26265 127.76147 Asia/Tokyo +35.42291 136.76039 Asia/Tokyo +34.83333 137.23333 Asia/Tokyo +35.30528 139.81861 Asia/Tokyo +35.69306 139.98333 Asia/Tokyo +34.48333 133.36667 Asia/Tokyo +34.75 137.91667 Asia/Tokyo +34.25 134.71667 Asia/Tokyo +33.60639 130.41806 Asia/Tokyo +36.55751 136.86945 Asia/Tokyo +33.76667 130.46667 Asia/Tokyo +36.06443 136.22257 Asia/Tokyo +32.69732 128.84561 Asia/Tokyo +35.3 135.11667 Asia/Tokyo +36.1 139.45 Asia/Tokyo +36.2 139.28333 Asia/Tokyo +35.34194 139.47 Asia/Tokyo +36.25 139.65 Asia/Tokyo +36.25 139.08333 Asia/Tokyo +35.21667 138.61667 Asia/Tokyo +34.86667 138.26667 Asia/Tokyo +35.16667 138.68333 Asia/Tokyo +34.5735 133.23513 Asia/Tokyo +35.7 138.73333 Asia/Tokyo +34.7 135.61667 Asia/Tokyo +35.65924 139.54837 Asia/Tokyo +35 137.03333 Asia/Tokyo +35.9944 138.15428 Asia/Tokyo +33.49631 130.5156 Asia/Tokyo +35.32611 139.40389 Asia/Tokyo +35.99028 139.07639 Asia/Tokyo +26.30944 127.77028 Asia/Tokyo +33.27945 131.49751 Asia/Tokyo +35.3 135.25 Asia/Tokyo +35.08944 139.06861 Asia/Tokyo +34.72807 135.30264 Asia/Tokyo +36.33333 139.45 Asia/Tokyo +37.00059 138.2259 Asia/Tokyo +36.31667 138.9 Asia/Tokyo +34.95828 137.08054 Asia/Tokyo +33.91667 134.65 Asia/Tokyo +33.41804 130.65413 Asia/Tokyo +34.71667 135.41667 Asia/Tokyo +32.01667 130.2 Asia/Tokyo +34.75 134.4 Asia/Tokyo +33.5 133.9 Asia/Tokyo +34.80361 134.46806 Asia/Tokyo +35.97145 139.61382 Asia/Tokyo +26.33583 127.80139 Asia/Tokyo +31.48621 131.2421 Asia/Tokyo +33.955 131.95 Asia/Tokyo +34.38333 131.2 Asia/Tokyo +35.97134 139.6534 Asia/Tokyo +35.87076 139.51393 Asia/Tokyo +35.85295 139.41212 Asia/Tokyo +35.73667 139.32361 Asia/Tokyo +35.80472 139.60194 Asia/Tokyo +35.78944 139.62333 Asia/Tokyo +35.81251 139.6856 Asia/Tokyo +35.32528 139.89111 Asia/Tokyo +35.14 139.61917 Asia/Tokyo +34.22611 135.1675 Asia/Tokyo +33.75139 132.70139 Asia/Tokyo +33.22375 132.56001 Asia/Tokyo +33.91667 133.18333 Asia/Tokyo +33.5 132.55 Asia/Tokyo +33.83916 132.76574 Asia/Tokyo +33.78757 132.71124 Asia/Tokyo +34.01667 133.56667 Asia/Tokyo +33.97661 132.77767 Asia/Tokyo +39.16667 140.5 Asia/Tokyo +35.65 140.16667 Asia/Tokyo +37.91 140.11667 Asia/Tokyo +39.31691 140.55034 Asia/Tokyo +35.7 140.55 Asia/Tokyo +37.85 140.6 Asia/Tokyo +38.42738 141.21487 Asia/Tokyo +38.24056 140.36333 Asia/Tokyo +39.46667 141.95 Asia/Tokyo +35.65 140.31667 Asia/Tokyo +38.035 140.85111 Asia/Tokyo +38.54465 141.13461 Asia/Tokyo +35.96667 140.13333 Asia/Tokyo +36.2 140.1 Asia/Tokyo +35.9 140.08333 Asia/Tokyo +39.31667 141.53333 Asia/Tokyo +36.35 140.3 Asia/Tokyo +38.39306 140.88611 Asia/Tokyo +35.55 140.36667 Asia/Tokyo +38.35361 140.36972 Asia/Tokyo +38.0025 140.19111 Asia/Tokyo +36.71667 140.71667 Asia/Tokyo +37.28333 140.38333 Asia/Tokyo +39.69414 140.98442 Asia/Tokyo +35.71667 140.26667 Asia/Tokyo +38.00333 140.61833 Asia/Tokyo +35.8 140.06667 Asia/Tokyo +38.31667 141.03333 Asia/Tokyo +38.75861 140.30083 Asia/Tokyo +38.26889 140.87194 Asia/Tokyo +35.88333 140.5 Asia/Tokyo +35.71667 140.23333 Asia/Tokyo +38.3725 140.2725 Asia/Tokyo +35.9 140.18333 Asia/Tokyo +38.33092 140.97691 Asia/Tokyo +39.36667 141.9 Asia/Tokyo +36.86667 140.03333 Asia/Tokyo +36.55 140.41667 Asia/Tokyo +35.85 140.61667 Asia/Tokyo +39.45 140.48333 Asia/Tokyo +36.28333 140.41667 Asia/Tokyo +38.05 140.73361 Asia/Tokyo +35.25 140.38333 Asia/Tokyo +39.07167 141.71667 Asia/Tokyo +38.60333 140.40194 Asia/Tokyo +36.31409 140.58389 Asia/Tokyo +35.51667 140.31667 Asia/Tokyo +37.58333 140.43333 Asia/Tokyo +35.6 140.41667 Asia/Tokyo +35.78333 140.31667 Asia/Tokyo +37.48333 141 Asia/Tokyo +36.05 140.16667 Asia/Tokyo +38.10361 140.035 Asia/Tokyo +37.51391 140.40063 Asia/Tokyo +36.51667 140.18333 Asia/Tokyo +35.93333 140 Asia/Tokyo +39.70361 141.1525 Asia/Tokyo +36.43333 140.01667 Asia/Tokyo +35.41667 140.3 Asia/Tokyo +39.13333 141.13333 Asia/Tokyo +39.64692 141.94057 Asia/Tokyo +36.34139 140.44667 Asia/Tokyo +37.43333 140.48333 Asia/Tokyo +38.37357 141.06105 Asia/Tokyo +36.46667 140.1 Asia/Tokyo +37.91667 140.76667 Asia/Tokyo +36.26667 140.1 Asia/Tokyo +36.96667 140.05 Asia/Tokyo +37.4 140.38333 Asia/Tokyo +38.55 141.05 Asia/Tokyo +39.28333 141.11667 Asia/Tokyo +36.78671 140.74901 Asia/Tokyo +35.0969 140.1003 Asia/Tokyo +35.14297 140.31388 Asia/Tokyo +36.38333 140.53333 Asia/Tokyo +35.89767 140.49943 Asia/Tokyo +36.38333 140.26667 Asia/Tokyo +36.65 140.15 Asia/Tokyo +38.15389 140.27361 Asia/Tokyo +39.27694 141.86801 Asia/Tokyo +37.97451 140.77202 Asia/Tokyo +36.35 140.1 Asia/Tokyo +38.10472 140.85944 Asia/Tokyo +37.05 140.88333 Asia/Tokyo +35.93333 140.55 Asia/Tokyo +36.18333 140.26667 Asia/Tokyo +38.41667 141.3 Asia/Tokyo +37.15 140.45 Asia/Tokyo +37.56667 140.11667 Asia/Tokyo +38.91667 141.13333 Asia/Tokyo +35.51667 140.08333 Asia/Tokyo +37.81667 140.55 Asia/Tokyo +36.6 140.65 Asia/Tokyo +38.43889 140.40056 Asia/Tokyo +35.73333 140.83333 Asia/Tokyo +39.38333 141.11667 Asia/Tokyo +38.57167 140.95556 Asia/Tokyo +37.44722 140.5771 Asia/Tokyo +36.46667 140.56667 Asia/Tokyo +37.75 140.46778 Asia/Tokyo +35.91667 140.11667 Asia/Tokyo +35.95 140.31667 Asia/Tokyo +36.76667 140.35 Asia/Tokyo +35.60472 140.12333 Asia/Tokyo +35.71667 140.65 Asia/Tokyo +36.03333 140.2 Asia/Tokyo +39.71667 140.11667 Asia/Tokyo +35.86667 140.01667 Asia/Tokyo +39.71806 140.10333 Asia/Tokyo +43.82278 144.10444 Asia/Tokyo +45.40944 141.67389 Asia/Tokyo +42.63694 141.60333 Asia/Tokyo +43.21694 141.51694 Asia/Tokyo +41.28944 141.21694 Asia/Tokyo +43.55278 141.90639 Asia/Tokyo +40.22194 140.36944 Asia/Tokyo +43.48639 141.90556 Asia/Tokyo +42.33389 142.36694 Asia/Tokyo +42.55 141.35 Asia/Tokyo +43.35 142.38333 Asia/Tokyo +43.65899 145.13197 Asia/Tokyo +43.06417 141.34694 Asia/Tokyo +43.93444 141.64278 Asia/Tokyo +42.99167 143.20028 Asia/Tokyo +43.18944 141.00222 Asia/Tokyo +40.27178 140.55756 Asia/Tokyo +42.91722 143.20444 Asia/Tokyo +40.20389 140.02417 Asia/Tokyo +43.32361 145.575 Asia/Tokyo +44.35056 142.45778 Asia/Tokyo +41.88333 140.68333 Asia/Tokyo +40.71069 140.59048 Asia/Tokyo +42.31722 140.98806 Asia/Tokyo +44.3525 143.3525 Asia/Tokyo +40.68682 141.38969 Asia/Tokyo +43.20389 140.77028 Asia/Tokyo +45.37139 141.82111 Asia/Tokyo +42.975 144.37472 Asia/Tokyo +40.64581 140.58354 Asia/Tokyo +40.81609 140.37539 Asia/Tokyo +43.80306 143.89083 Asia/Tokyo +41.82013 140.64482 Asia/Tokyo +42.97444 140.50889 Asia/Tokyo +43.20028 141.75972 Asia/Tokyo +43.23972 141.35389 Asia/Tokyo +40.21965 141.28986 Asia/Tokyo +42.97583 141.56722 Asia/Tokyo +40.59306 140.4725 Asia/Tokyo +40.18361 140.78722 Asia/Tokyo +41.77583 140.73667 Asia/Tokyo +40.5 141.5 Asia/Tokyo +43.70806 142.03917 Asia/Tokyo +43.10806 141.55056 Asia/Tokyo +42.46806 140.86806 Asia/Tokyo +42.81944 141.65222 Asia/Tokyo +43.32472 141.85861 Asia/Tokyo +43.50972 142.18556 Asia/Tokyo +43.77063 142.36489 Asia/Tokyo +40.82444 140.74 Asia/Tokyo +44.02127 144.26971 Asia/Tokyo +40.80444 140.44139 Asia/Tokyo +32.93726 131.08008 Asia/Tokyo +36.56922 136.91162 Asia/Tokyo +34.80447 136.54645 Asia/Tokyo +34.76615 135.62759 Asia/Tokyo +36.39659 140.53479 Asia/Tokyo +35.95633 140.32356 Asia/Tokyo +33.53567 130.47861 Asia/Tokyo +35.48199 137.02166 Asia/Tokyo +35.73691 136.95852 Asia/Tokyo +37.14828 138.23642 Asia/Tokyo +35.90807 139.65657 Asia/Tokyo +35.75459 139.46852 Asia/Tokyo +35.48933 138.68832 Asia/Tokyo +33.51278 130.52389 Asia/Tokyo +35.02954 135.75666 Asia/Tokyo +33.61153 131.13002 Asia/Tokyo +38.25759 140.8667 Asia/Tokyo +0.60751 34.76966 Africa/Nairobi +1.7471 40.05732 Africa/Nairobi +-3.39605 38.55609 Africa/Nairobi +-1.03326 37.06933 Africa/Nairobi +-0.17333 35.86382 Africa/Nairobi +-1.28333 36.85 Africa/Nairobi +-0.42013 36.94759 Africa/Nairobi +0.0421 36.36734 Africa/Nairobi +-1.07829 35.86012 Africa/Nairobi +0.01667 37.07283 Africa/Nairobi +-0.28333 36.06667 Africa/Nairobi +-0.71667 36.43591 Africa/Nairobi +-1.28333 36.81667 Africa/Nairobi +0.33511 34.4864 Africa/Nairobi +-0.15406 35.19878 Africa/Nairobi +3.5216 39.05472 Africa/Nairobi +-4.05466 39.66359 Africa/Nairobi +-0.2479 35.73743 Africa/Nairobi +-1.06344 34.47313 Africa/Nairobi +0.04626 37.65587 Africa/Nairobi +-3.4 38.38333 Africa/Nairobi +2.32839 37.98986 Africa/Nairobi +1.09679 36.69799 Africa/Nairobi +3.93726 41.85688 Africa/Nairobi +-3.21799 40.11692 Africa/Nairobi +-1.80409 37.62034 Africa/Nairobi +-1.51667 37.26667 Africa/Nairobi +0.39361 34.30528 Africa/Nairobi +3.11911 35.59727 Africa/Nairobi +-2.27169 40.90201 Africa/Nairobi +-1.36696 38.01056 Africa/Nairobi +1.01572 35.00622 Africa/Nairobi +-0.10221 34.76171 Africa/Nairobi +-0.68174 34.76666 Africa/Nairobi +-3.63045 39.84992 Africa/Nairobi +-1.16667 36.83333 Africa/Nairobi +-0.49886 37.28031 Africa/Nairobi +-0.36774 35.28314 Africa/Nairobi +-0.7 37.18333 Africa/Nairobi +1.23333 35.11667 Africa/Nairobi +0.28422 34.75228 Africa/Nairobi +0.49194 35.74303 Africa/Nairobi +0.35462 37.58218 Africa/Nairobi +-0.52731 34.45714 Africa/Nairobi +-0.45275 39.64601 Africa/Nairobi +-0.53112 37.4506 Africa/Nairobi +0.52036 35.26992 Africa/Nairobi +0.46005 34.11169 Africa/Nairobi +0.5635 34.56055 Africa/Nairobi +-1.4563 36.97826 Africa/Nairobi +0.06116 34.28823 Africa/Nairobi +-0.27088 36.37917 Africa/Nairobi +39.93652 69.56779 Asia/Bishkek +39.83895 69.5276 Asia/Bishkek +42.46017 76.18709 Asia/Bishkek +42.84194 75.30149 Asia/Bishkek +41.34612 72.21708 Asia/Bishkek +42.52277 72.24274 Asia/Bishkek +42.34211 78.00644 Asia/Bishkek +40.76994 73.30068 Asia/Bishkek +40.51506 72.80826 Asia/Bishkek +41.42866 75.99111 Asia/Bishkek +40.25684 72.12793 Asia/Bishkek +40.7046 72.86666 Asia/Bishkek +42.49068 78.39362 Asia/Bishkek +42.81423 73.84813 Asia/Bishkek +42.89106 74.85077 Asia/Bishkek +40.93333 73 Asia/Bishkek +40.26667 72.1 Asia/Bishkek +42.64944 77.08225 Asia/Bishkek +42.87 74.59 Asia/Bishkek +41.0376 72.74586 Asia/Bishkek +41.17017 75.81058 Asia/Bishkek +41.87079 72.9402 Asia/Bishkek +11.56245 104.91601 Asia/Phnom_Penh +11.48333 104.95 Asia/Phnom_Penh +10.99081 104.78498 Asia/Phnom_Penh +11.08785 105.79935 Asia/Phnom_Penh +13.52586 105.9683 Asia/Phnom_Penh +13.58588 102.97369 Asia/Phnom_Penh +13.36179 103.86056 Asia/Phnom_Penh +11.48682 105.32533 Asia/Phnom_Penh +12.53878 103.9192 Asia/Phnom_Penh +10.98081 104.77828 Asia/Phnom_Penh +14.18175 103.51761 Asia/Phnom_Penh +13.80732 104.98046 Asia/Phnom_Penh +13.65611 102.5625 Asia/Phnom_Penh +12.84895 102.60928 Asia/Phnom_Penh +13.48784 106.98158 Asia/Phnom_Penh +11.61531 102.9838 Asia/Phnom_Penh +12.48811 106.01879 Asia/Phnom_Penh +10.61041 104.18145 Asia/Phnom_Penh +12.71112 104.88873 Asia/Phnom_Penh +11.45332 104.52085 Asia/Phnom_Penh +10.60932 103.52958 Asia/Phnom_Penh +12.25 104.66667 Asia/Phnom_Penh +11.99339 105.4635 Asia/Phnom_Penh +13.73939 106.98727 Asia/Phnom_Penh +13.10271 103.19822 Asia/Phnom_Penh +11.54665 103.03569 Asia/Phnom_Penh +1.3278 172.97696 Pacific/Tarawa +-12.16672 44.39944 Indian/Comoro +-11.70216 43.25506 Indian/Comoro +17.29484 -62.7261 America/St_Kitts +37.90889 126.16111 Asia/Pyongyang +39.15278 127.44361 Asia/Pyongyang +38.95389 127.89167 Asia/Pyongyang +38.99139 125.97778 Asia/Pyongyang +39.19833 125.69 Asia/Pyongyang +38.75417 125.645 Asia/Pyongyang +39.49472 125.47361 Asia/Pyongyang +38.41667 126.23333 Asia/Pyongyang +39.59806 125.60972 Asia/Pyongyang +38.50722 125.75583 Asia/Pyongyang +39.9475 127.87111 Asia/Pyongyang +39.03385 125.75432 Asia/Pyongyang +39.24639 125.87194 Asia/Pyongyang +37.93472 125.36194 Asia/Pyongyang +38.7375 125.40778 Asia/Pyongyang +39.98111 125.24472 Asia/Pyongyang +39.86722 126.03028 Asia/Pyongyang +39.43806 127.24306 Asia/Pyongyang +38.85583 127.41806 Asia/Pyongyang +39.1425 126.09611 Asia/Pyongyang +37.97083 126.55444 Asia/Pyongyang +38.67028 125.77611 Asia/Pyongyang +39.83167 127.61861 Asia/Pyongyang +38.79861 125.79194 Asia/Pyongyang +38.71028 127.59833 Asia/Pyongyang +39.91833 127.53639 Asia/Pyongyang +38.04056 125.71472 Asia/Pyongyang +38.86389 125.8 Asia/Pyongyang +39.69333 125.21028 Asia/Pyongyang +38.25083 125.09611 Asia/Pyongyang +38.39917 125.61556 Asia/Pyongyang +38.24306 125.78 Asia/Pyongyang +39.61778 125.66472 Asia/Pyongyang +39.0425 127.52389 Asia/Pyongyang +38.51083 125.49417 Asia/Pyongyang +40.02472 128.15972 Asia/Pyongyang +40.19944 124.53167 Asia/Pyongyang +42.34222 130.39667 Asia/Pyongyang +40.10056 124.39806 Asia/Pyongyang +40.38944 125.04667 Asia/Pyongyang +40.01833 127.45472 Asia/Pyongyang +42.95722 129.99333 Asia/Pyongyang +41.71361 129.68444 Asia/Pyongyang +42.95 129.86667 Asia/Pyongyang +42.24889 130.30028 Asia/Pyongyang +42.22609 129.20776 Asia/Pyongyang +41.58778 129.60611 Asia/Pyongyang +40.96417 129.32778 Asia/Pyongyang +41.09028 128.29333 Asia/Pyongyang +40.96946 126.58523 Asia/Pyongyang +40.32306 128.65528 Asia/Pyongyang +41.39756 128.17873 Asia/Pyongyang +41.40167 128.17778 Asia/Pyongyang +40.02528 127.95583 Asia/Pyongyang +42.44278 129.75083 Asia/Pyongyang +41.79556 129.77583 Asia/Pyongyang +42.52056 130.39528 Asia/Pyongyang +36.1125 129.35222 Asia/Seoul +35.99417 129.345 Asia/Seoul +37.18447 128.46821 Asia/Seoul +36.82167 128.63083 Asia/Seoul +35.275 126.50944 Asia/Seoul +36.175 127.77639 Asia/Seoul +35.9675 128.93083 Asia/Seoul +37.29583 127.63389 Asia/Seoul +36.67756 126.84272 Asia/Seoul +35.33861 129.03861 Asia/Seoul +37.48972 127.49056 Asia/Seoul +37.83311 127.06169 Asia/Seoul +38.10583 127.98944 Asia/Seoul +37.35139 127.94528 Asia/Seoul +35.84509 127.14752 Asia/Seoul +35.99175 128.39732 Asia/Seoul +35.53722 129.31667 Asia/Seoul +37.7415 127.0474 Asia/Seoul +36.89444 126.62972 Asia/Seoul +36.9714 126.4542 Asia/Seoul +36.32139 127.41972 Asia/Seoul +35.87028 128.59111 Asia/Seoul +36.34931 126.59772 Asia/Seoul +37.1759 128.9889 Asia/Seoul +37.29111 127.00889 Asia/Seoul +34.94808 127.48947 Asia/Seoul +37.566 126.9784 Asia/Seoul +36.78167 126.45222 Asia/Seoul +36.24083 128.2975 Asia/Seoul +36.91556 127.13139 Asia/Seoul +38.20833 128.59111 Asia/Seoul +36.41528 128.16056 Asia/Seoul +37.44056 129.17083 Asia/Seoul +36.28194 126.9125 Asia/Seoul +35.10278 129.04028 Asia/Seoul +37.49889 126.78306 Asia/Seoul +35.72806 126.73194 Asia/Seoul +34.84494 127.34293 Asia/Seoul +36.03222 129.365 Asia/Seoul +37.15222 127.07056 Asia/Seoul +36.78361 127.00417 Asia/Seoul +36.3012 127.568 Asia/Seoul +38.37881 128.4676 Asia/Seoul +36.20389 127.08472 Asia/Seoul +35.41 127.38583 Asia/Seoul +35.02833 126.7175 Asia/Seoul +37.85944 126.785 Asia/Seoul +36.59458 128.19946 Asia/Seoul +34.99014 126.47899 Asia/Seoul +34.79361 126.38861 Asia/Seoul +35.49333 128.74889 Asia/Seoul +35.82333 128.73778 Asia/Seoul +35.84278 129.21167 Asia/Seoul +34.97528 127.58917 Asia/Seoul +37.41 127.25722 Asia/Seoul +35.15472 126.91556 Asia/Seoul +35.20944 127.46444 Asia/Seoul +37.5986 127.1394 Asia/Seoul +36.23472 128.57278 Asia/Seoul +35.97861 126.71139 Asia/Seoul +36.10306 127.48889 Asia/Seoul +36.1136 128.336 Asia/Seoul +37.65639 126.835 Asia/Seoul +34.97631 128.32361 Asia/Seoul +36.45556 127.12472 Asia/Seoul +34.85028 128.58861 Asia/Seoul +36.81083 127.79472 Asia/Seoul +35.43333 126.7 Asia/Seoul +35.80167 126.88889 Asia/Seoul +35.23417 128.88111 Asia/Seoul +36.12176 128.11981 Asia/Seoul +35.24417 129.21389 Asia/Seoul +37.83101 127.51059 Asia/Seoul +37.75556 128.89611 Asia/Seoul +37.74722 126.48556 Asia/Seoul +35.94389 126.95444 Asia/Seoul +37.45646 126.70515 Asia/Seoul +35.61306 127.27944 Asia/Seoul +37.27917 127.4425 Asia/Seoul +35.05944 126.985 Asia/Seoul +37.20682 126.8169 Asia/Seoul +38.10611 127.70667 Asia/Seoul +36.6009 126.665 Asia/Seoul +37.6918 127.8857 Asia/Seoul +35.91333 128.82 Asia/Seoul +34.57111 126.59889 Asia/Seoul +37.87472 127.73417 Asia/Seoul +35.82194 127.14889 Asia/Seoul +36.43351 129.057 Asia/Seoul +36.63722 127.48972 Asia/Seoul +36.8065 127.1522 Asia/Seoul +35.19278 128.08472 Asia/Seoul +36.85667 127.44333 Asia/Seoul +35.79167 127.42528 Asia/Seoul +33.50972 126.52194 Asia/Seoul +35.22806 128.68111 Asia/Seoul +35.64842 127.51523 Asia/Seoul +37.3925 126.92694 Asia/Seoul +37.01083 127.27028 Asia/Seoul +37.32361 126.82194 Asia/Seoul +36.56556 128.725 Asia/Seoul +33.46444 126.31833 Asia/Seoul +34.8825 128.62667 Asia/Seoul +34.76278 127.66528 Asia/Seoul +36.12944 127.1 Asia/Seoul +37.54389 129.10694 Asia/Seoul +37.29167 127.50778 Asia/Seoul +37.43861 127.13778 Asia/Seoul +37.54 127.20556 Asia/Seoul +37.6525 127.3075 Asia/Seoul +37.63667 127.21417 Asia/Seoul +35.40611 129.16861 Asia/Seoul +37.58972 127.22028 Asia/Seoul +35.24972 128.52 Asia/Seoul +35.80167 128.50083 Asia/Seoul +37.47722 126.86639 Asia/Seoul +34.8262 126.10863 Asia/Seoul +33.25333 126.56181 Asia/Seoul +35.54145 128.49506 Asia/Seoul +29.26917 47.97806 Asia/Kuwait +29.33278 48.02861 Asia/Kuwait +29.3032 48.04881 Asia/Kuwait +29.33389 48.07611 Asia/Kuwait +29.31167 48.07417 Asia/Kuwait +29.14583 48.09472 Asia/Kuwait +29.09611 48.13278 Asia/Kuwait +29.145 48.13028 Asia/Kuwait +29.36972 47.97833 Asia/Kuwait +29.3375 47.65806 Asia/Kuwait +29.0825 48.13028 Asia/Kuwait +29.17389 48.12111 Asia/Kuwait +29.2775 47.95861 Asia/Kuwait +29.07694 48.08389 Asia/Kuwait +29.365 48.00139 Asia/Kuwait +29.29583 48.07861 Asia/Kuwait +29.295 47.93306 Asia/Kuwait +29.25722 48.05722 Asia/Kuwait +19.2866 -81.37436 America/Cayman +48.03333 48.9 Asia/Oral +51.23333 51.36667 Asia/Oral +49.46912 57.41914 Asia/Aqtobe +46.95307 54.01978 Asia/Oral +50.25117 58.44003 Asia/Aqtobe +49.83333 73.1658 Asia/Almaty +48.82981 58.15042 Asia/Aqtobe +47.06667 51.86667 Asia/Oral +47.11667 51.88333 Asia/Oral +50.27969 57.20718 Asia/Aqtobe +43.64806 51.17222 Asia/Aqtau +51.1681 52.99782 Asia/Oral +49.72654 84.27318 Asia/Almaty +45.48778 64.07806 Asia/Qyzylorda +47.78333 67.76667 Asia/Almaty +52.19019 61.19894 Asia/Qyzylorda +43.56667 69.75 Asia/Almaty +45.84608 62.15264 Asia/Qyzylorda +42.9 71.36667 Asia/Almaty +47.46657 84.87144 Asia/Almaty +43.915 67.24806 Asia/Qyzylorda +42.53333 70.33333 Asia/Almaty +45.25201 77.98007 Asia/Almaty +43.33333 68.25 Asia/Almaty +50.05494 72.96464 Asia/Almaty +44.83322 78.8309 Asia/Almaty +44.77384 65.55227 Asia/Qyzylorda +43.30348 77.24085 Asia/Almaty +45.01556 78.37389 Asia/Almaty +45 77.91667 Asia/Almaty +42.3 69.6 Asia/Almaty +43.59833 73.76139 Asia/Almaty +50.62811 81.91213 Asia/Almaty +52.93818 70.1895 Asia/Almaty +50.42675 80.26669 Asia/Almaty +41.45 69.16667 Asia/Almaty +45.41126 79.91545 Asia/Almaty +49.7908 72.83744 Asia/Almaty +52.9729 63.11677 Asia/Qyzylorda +44.85278 65.50917 Asia/Qyzylorda +53.21435 63.62463 Asia/Qyzylorda +43.16667 70.46667 Asia/Almaty +43.86681 77.06304 Asia/Almaty +54.87278 69.143 Asia/Almaty +52.27401 77.00438 Asia/Almaty +44.1666 80.00655 Asia/Almaty +49.97143 82.60586 Asia/Almaty +43 71.5 Asia/Almaty +42.86772 73.17623 Asia/Almaty +52.63373 70.4177 Asia/Almaty +52.54707 62.49987 Asia/Qyzylorda +45.61667 63.31667 Asia/Almaty +50.34413 83.51287 Asia/Almaty +42.18301 69.88393 Asia/Almaty +53.28244 69.39692 Asia/Almaty +43.52061 68.5094 Asia/Almaty +43.3552 77.45245 Asia/Almaty +49.32671 81.57373 Asia/Almaty +52.07287 76.9039 Asia/Almaty +43.42684 77.01908 Asia/Almaty +51.72371 75.32287 Asia/Almaty +44.16882 66.73887 Asia/Qyzylorda +41.26182 67.98437 Asia/Almaty +43.36028 76.85778 Asia/Almaty +42.4219 69.82795 Asia/Almaty +46.84806 74.995 Asia/Almaty +47.96447 80.43437 Asia/Almaty +51.80652 68.35996 Asia/Almaty +42.42965 68.80463 Asia/Almaty +50.24915 66.92027 Asia/Almaty +46.8 61.66667 Asia/Qyzylorda +51.1801 71.44598 Asia/Almaty +43.25654 76.92848 Asia/Almaty +53.29617 69.59997 Asia/Almaty +49.63574 72.86164 Asia/Almaty +52.35533 71.88641 Asia/Almaty +17.96667 102.6 Asia/Vientiane +20.41592 104.04838 Asia/Vientiane +16.56504 104.75273 Asia/Vientiane +15.12022 105.79898 Asia/Vientiane +20.69229 101.98368 Asia/Vientiane +18.9235 102.44784 Asia/Vientiane +19.45 103.21667 Asia/Vientiane +18.38261 103.65857 Asia/Vientiane +17.41027 104.83068 Asia/Vientiane +19.88601 102.13503 Asia/Vientiane +20.2467 100.45401 Asia/Vientiane +19.45907 103.17999 Asia/Vientiane +33.84675 35.90203 Asia/Beirut +34.43667 35.84972 Asia/Beirut +33.27333 35.19389 Asia/Beirut +33.55993 35.37564 Asia/Beirut +33.9 35.48333 Asia/Beirut +33.98083 35.61778 Asia/Beirut +34.12111 35.64806 Asia/Beirut +33.40729 35.48169 Asia/Beirut +34.25083 36.01056 Asia/Beirut +33.88894 35.49442 Asia/Beirut +34.00583 36.21806 Asia/Beirut +33.37889 35.48389 Asia/Beirut +13.9957 -61.00614 America/St_Lucia +47.14151 9.52154 Europe/Vaduz +7.0281 79.9014 Asia/Colombo +5.97501 80.42968 Asia/Colombo +6.9779 79.8898 Asia/Colombo +8.7514 80.4971 Asia/Colombo +9.81667 80.16667 Asia/Colombo +8.5711 81.2335 Asia/Colombo +6.68278 80.39917 Asia/Colombo +8.0362 79.8283 Asia/Colombo +9.81667 80.23333 Asia/Colombo +6.8905 79.9015 Asia/Colombo +6.9685 79.8836 Asia/Colombo +6.7132 79.9026 Asia/Colombo +6.97078 80.78286 Asia/Colombo +7.2083 79.8358 Asia/Colombo +6.933 79.9297 Asia/Colombo +6.773 79.8816 Asia/Colombo +5.94851 80.53528 Asia/Colombo +6.848 79.9265 Asia/Colombo +7.4863 80.3623 Asia/Colombo +6.88297 79.90708 Asia/Colombo +6.9269 79.9095 Asia/Colombo +6.9329 79.8848 Asia/Colombo +6.9553 79.922 Asia/Colombo +7.1643 79.8757 Asia/Colombo +7.2955 80.6356 Asia/Colombo +7.048 79.8937 Asia/Colombo +6.5831 79.9593 Asia/Colombo +7.40902 81.83472 Asia/Colombo +9.66845 80.00742 Asia/Colombo +7.0744 79.8919 Asia/Colombo +6.844 80.0024 Asia/Colombo +6.9909 79.883 Asia/Colombo +6.8916 80.5955 Asia/Colombo +6.9012 80.0852 Asia/Colombo +7.1643 80.5696 Asia/Colombo +6.0367 80.217 Asia/Colombo +6.8293 79.863 Asia/Colombo +7.7782 81.6038 Asia/Colombo +7.86 80.65167 Asia/Colombo +6.93194 79.84778 Asia/Colombo +7.57583 79.79528 Asia/Colombo +6.4788 79.9828 Asia/Colombo +6.42598 79.99575 Asia/Colombo +7.7102 81.6924 Asia/Colombo +6.8964 79.9181 Asia/Colombo +6.9895 81.0557 Asia/Colombo +8.31223 80.41306 Asia/Colombo +7.29754 81.68202 Asia/Colombo +6.2355 80.0538 Asia/Colombo +7.38216 81.84198 Asia/Colombo +6.06667 -8.12806 Africa/Monrovia +7.57944 -8.53778 Africa/Monrovia +8.42194 -9.74778 Africa/Monrovia +6.30054 -10.7969 Africa/Monrovia +6.53 -10.35167 Africa/Monrovia +4.375 -7.71694 Africa/Monrovia +5.01111 -9.03889 Africa/Monrovia +6.99556 -9.47222 Africa/Monrovia +5.88083 -10.04667 Africa/Monrovia +6.44611 -10.6125 Africa/Monrovia +-30.40001 27.70027 Africa/Maseru +-30.11537 28.68936 Africa/Maseru +-30.15137 27.47691 Africa/Maseru +-29.31667 27.48333 Africa/Maseru +-28.8866 27.89914 Africa/Maseru +-29.823 27.23744 Africa/Maseru +-28.87185 28.04501 Africa/Maseru +-28.76659 28.24936 Africa/Maseru +55.6 26.41667 Europe/Vilnius +54.68916 25.2798 Europe/Vilnius +55.5 25.6 Europe/Vilnius +55.25 24.75 Europe/Vilnius +55.98139 22.24722 Europe/Vilnius +55.25222 22.28972 Europe/Vilnius +55.34889 21.48306 Europe/Vilnius +55.93333 23.31667 Europe/Vilnius +55.96667 25.58333 Europe/Vilnius +55.81667 23.53333 Europe/Vilnius +55.91139 21.84417 Europe/Vilnius +55.73333 24.35 Europe/Vilnius +55.9175 21.06861 Europe/Vilnius +56.31667 22.33333 Europe/Vilnius +54.56667 23.35 Europe/Vilnius +55.87583 21.25083 Europe/Vilnius +55.71722 21.1175 Europe/Vilnius +55.28833 23.97472 Europe/Vilnius +54.9 23.9 Europe/Vilnius +55.08333 24.28333 Europe/Vilnius +55.71278 21.40333 Europe/Vilnius +54.01667 23.96667 Europe/Vilnius +54.4 24.05 Europe/Vilnius +54.91525 23.96831 Europe/Vilnius +49.61167 6.13 Europe/Luxembourg +49.49583 5.98056 Europe/Luxembourg +49.48056 6.0875 Europe/Luxembourg +57.54108 25.42751 Europe/Riga +57.38944 21.56056 Europe/Riga +56.53333 21.01667 Europe/Riga +56.96694 23.15528 Europe/Riga +56.86014 24.36544 Europe/Riga +56.946 24.10589 Europe/Riga +56.5 27.31667 Europe/Riga +56.8162 24.61401 Europe/Riga +56.51667 21.01667 Europe/Riga +56.968 23.77038 Europe/Riga +56.65 23.71278 Europe/Riga +56.49903 25.85735 Europe/Riga +55.88333 26.53333 Europe/Riga +57.31188 25.27456 Europe/Riga +32.08361 23.97639 Africa/Tripoli +31.66818 20.25205 Africa/Tripoli +32.76704 22.63669 Africa/Tripoli +32.11486 20.06859 Africa/Tripoli +30.9522 20.12022 Africa/Tripoli +24.20487 23.2857 Africa/Tripoli +32.53414 20.57911 Africa/Tripoli +32.76162 22.24237 Africa/Tripoli +32.48798 20.83174 Africa/Tripoli +24.1989 23.29093 Africa/Tripoli +32.76272 21.75506 Africa/Tripoli +32.19 20.59653 Africa/Tripoli +30.75545 20.22626 Africa/Tripoli +32.9312 12.08199 Africa/Tripoli +32.46738 14.56874 Africa/Tripoli +32.94701 11.86647 Africa/Tripoli +32.06329 12.52859 Africa/Tripoli +29.1614 16.13904 Africa/Tripoli +32.43502 13.6332 Africa/Tripoli +32.87519 13.18746 Africa/Tripoli +32.88167 13.35056 Africa/Tripoli +31.20892 16.58866 Africa/Tripoli +32.75668 12.57159 Africa/Tripoli +32.79335 12.48845 Africa/Tripoli +27.03766 14.42832 Africa/Tripoli +31.86848 10.9812 Africa/Tripoli +25.91552 13.91839 Africa/Tripoli +31.44514 12.98013 Africa/Tripoli +32.37535 15.09254 Africa/Tripoli +32.61667 14 Africa/Tripoli +29.12684 15.94772 Africa/Tripoli +32.75222 12.72778 Africa/Tripoli +24.96472 10.17278 Africa/Tripoli +32.17222 13.02028 Africa/Tripoli +27.54956 14.27138 Africa/Tripoli +31.75662 13.99422 Africa/Tripoli +31.92231 12.25195 Africa/Tripoli +32.7571 12.72764 Africa/Tripoli +26.59206 12.78049 Africa/Tripoli +32.64861 14.26191 Africa/Tripoli +27.05 14.4 Africa/Tripoli +34.94282 -2.7329 Africa/Casablanca +30.33241 -5.8384 Africa/Casablanca +32.24634 -8.52941 Africa/Casablanca +29.69742 -9.73162 Africa/Casablanca +35.23619 -3.95453 Africa/Casablanca +31.51472 -5.53278 Africa/Casablanca +33.89469 -6.3065 Africa/Casablanca +35.57845 -5.36837 Africa/Casablanca +34.21 -4.01 Africa/Casablanca +30.47028 -8.87695 Africa/Casablanca +34.4073 -2.89732 Africa/Casablanca +34.53661 -4.64009 Africa/Casablanca +28.43799 -11.10321 Africa/Casablanca +35.76727 -5.79975 Africa/Casablanca +34.04845 -4.42795 Africa/Casablanca +34.68664 -6.00272 Africa/Casablanca +34.30652 -6.30618 Africa/Casablanca +34.26478 -5.92598 Africa/Casablanca +34.22149 -5.70775 Africa/Casablanca +29.37975 -10.17299 Africa/Casablanca +32.65236 -8.42769 Africa/Casablanca +33.00103 -7.61662 Africa/Casablanca +33.83186 -4.828 Africa/Casablanca +34.0531 -6.79846 Africa/Casablanca +32.29939 -9.23718 Africa/Casablanca +34.01325 -6.83255 Africa/Casablanca +30.39467 -9.20897 Africa/Casablanca +34.68052 -1.90764 Africa/Casablanca +32.8627 -6.57359 Africa/Casablanca +34.79711 -5.58224 Africa/Casablanca +30.91894 -6.89341 Africa/Casablanca +35.16813 -2.93352 Africa/Casablanca +33.68607 -7.38298 Africa/Casablanca +32.6852 -4.74512 Africa/Casablanca +33.89352 -5.54727 Africa/Casablanca +34.57396 -5.95372 Africa/Casablanca +35.61662 -5.27522 Africa/Casablanca +31.63416 -7.99994 Africa/Casablanca +35.19321 -6.15572 Africa/Casablanca +35.00174 -5.90534 Africa/Casablanca +32.88108 -6.9063 Africa/Casablanca +32.9391 -5.6686 Africa/Casablanca +34.26101 -6.5802 Africa/Casablanca +32.5977 -6.26844 Africa/Casablanca +34.31 -2.16 Africa/Casablanca +35.15 -3.86 Africa/Casablanca +34.22568 -3.35361 Africa/Casablanca +28.98696 -10.05738 Africa/Casablanca +32.50093 -6.69062 Africa/Casablanca +34.03715 -4.9998 Africa/Casablanca +31.5125 -9.77 Africa/Casablanca +33.25492 -8.50602 Africa/Casablanca +33.68786 -5.371 Africa/Casablanca +34.58319 -2.50612 Africa/Casablanca +35.16878 -5.2636 Africa/Casablanca +33.58831 -7.61138 Africa/Casablanca +33.78942 -7.15968 Africa/Casablanca +34.92 -2.32 Africa/Casablanca +32.33725 -6.34984 Africa/Casablanca +33.26553 -7.58754 Africa/Casablanca +33.43443 -5.22126 Africa/Casablanca +33.28952 -8.3425 Africa/Casablanca +35.46522 -6.03415 Africa/Casablanca +33.82404 -6.06627 Africa/Casablanca +35.25165 -3.93723 Africa/Casablanca +34.95368 -2.10027 Africa/Casablanca +30.42018 -9.59815 Africa/Casablanca +33.84984 -7.04037 Africa/Casablanca +32.90046 -6.77464 Africa/Casablanca +30.41071 -9.55572 Africa/Casablanca +43.73976 7.42732 Europe/Monaco +43.73333 7.41667 Europe/Monaco +48.16806 27.305 Europe/Chisinau +47.20417 27.79583 Europe/Chisinau +46.84028 29.64333 Europe/Chisinau +47.14139 28.61028 Europe/Chisinau +47.65639 28.04722 Europe/Chisinau +48.15583 28.2975 Europe/Chisinau +46.72806 29.70778 Europe/Chisinau +47.76639 29.00111 Europe/Chisinau +47.38306 28.82306 Europe/Chisinau +46.82583 28.59361 Europe/Chisinau +46.64417 29.41389 Europe/Chisinau +47.89333 28.30139 Europe/Chisinau +47.26306 29.16083 Europe/Chisinau +48.035 27.81611 Europe/Chisinau +46.30028 28.65722 Europe/Chisinau +47.00556 28.8575 Europe/Chisinau +46.055 28.83028 Europe/Chisinau +45.9075 28.19444 Europe/Chisinau +46.83056 29.47111 Europe/Chisinau +47.76167 27.92889 Europe/Chisinau +42.44111 19.26361 Europe/Podgorica +43.3567 19.35843 Europe/Podgorica +42.7731 18.94446 Europe/Podgorica +42.45306 18.5375 Europe/Podgorica +42.39063 18.91417 Europe/Podgorica +42.28639 18.84 Europe/Podgorica +43.03834 19.74758 Europe/Podgorica +42.09306 19.10028 Europe/Podgorica +18.06667 -63.08333 America/Marigot +-18.1492 49.40234 Indian/Antananarivo +-22.81667 47.28333 Indian/Antananarivo +-23.55 47.5 Indian/Antananarivo +-17.35 49.03333 Indian/Antananarivo +-17.46667 49.2 Indian/Antananarivo +-23.35 47.6 Indian/Antananarivo +-18.76908 46.05005 Indian/Antananarivo +-25.3 45.48333 Indian/Antananarivo +-16.79706 47.65165 Indian/Antananarivo +-23.35 43.66667 Indian/Antananarivo +-25.03249 46.98329 Indian/Antananarivo +-19.16667 46.73333 Indian/Antananarivo +-19.9 47.23333 Indian/Antananarivo +-16.91667 49.58333 Indian/Antananarivo +-16.66667 46.1 Indian/Antananarivo +-14.26667 50.16667 Indian/Antananarivo +-22.9 44.53333 Indian/Antananarivo +-20.6 48.33333 Indian/Antananarivo +-18.63333 47.7 Indian/Antananarivo +-20.58333 48.53333 Indian/Antananarivo +-20.28869 44.31782 Indian/Antananarivo +-18.94948 48.23007 Indian/Antananarivo +-19.52905 45.45559 Indian/Antananarivo +-19.43333 46.75 Indian/Antananarivo +-16.11064 46.64383 Indian/Antananarivo +-20.05 48.11667 Indian/Antananarivo +-15.43689 49.73871 Indian/Antananarivo +-18.91667 47.8 Indian/Antananarivo +-21.23034 48.34173 Indian/Antananarivo +-16.16864 49.76622 Indian/Antananarivo +-22.14862 48.01055 Indian/Antananarivo +-18.06354 44.02951 Indian/Antananarivo +-19.9 48.8 Indian/Antananarivo +-15.71667 46.31667 Indian/Antananarivo +-16.95 46.83333 Indian/Antananarivo +-21.88333 47.43333 Indian/Antananarivo +-21.15 46.58333 Indian/Antananarivo +-22.40293 46.12576 Indian/Antananarivo +-21.3 47.63333 Indian/Antananarivo +-21.45267 47.08569 Indian/Antananarivo +-18.43333 46.56667 Indian/Antananarivo +-17.38095 49.40826 Indian/Antananarivo +-19.4 46.95 Indian/Antananarivo +-22.82223 47.82615 Indian/Antananarivo +-20.23333 47.38333 Indian/Antananarivo +-23.72065 44.38069 Indian/Antananarivo +-19.83333 46.85 Indian/Antananarivo +-21.66667 45.16667 Indian/Antananarivo +-19.69787 44.54587 Indian/Antananarivo +-25.16667 45.05 Indian/Antananarivo +-14.54329 48.74981 Indian/Antananarivo +-19.01667 47.18333 Indian/Antananarivo +-13.08333 48.85 Indian/Antananarivo +-14.87959 47.98751 Indian/Antananarivo +-12.2787 49.29171 Indian/Antananarivo +-19.86586 47.03333 Indian/Antananarivo +-19.65 47.31667 Indian/Antananarivo +-18.91368 47.53613 Indian/Antananarivo +-14.90033 50.27876 Indian/Antananarivo +-18.7 47.78333 Indian/Antananarivo +-18.31667 47.11667 Indian/Antananarivo +-22.28333 44.51667 Indian/Antananarivo +-18.4 47.86667 Indian/Antananarivo +-13.4 48.26667 Indian/Antananarivo +-17.01009 48.57313 Indian/Antananarivo +-14.65 49.65 Indian/Antananarivo +-18.81667 49.06667 Indian/Antananarivo +-17.5876 48.22391 Indian/Antananarivo +-24.6937 44.74581 Indian/Antananarivo +-14.75 50.21667 Indian/Antananarivo +-25.17838 46.08722 Indian/Antananarivo +-20.53034 47.24344 Indian/Antananarivo +-18.7 47.68333 Indian/Antananarivo +-25.03333 46.38333 Indian/Antananarivo +-22 47.85 Indian/Antananarivo +-13.2 49.05 Indian/Antananarivo +-17.83333 48.41667 Indian/Antananarivo +-19.38333 47.41667 Indian/Antananarivo +-20.55284 46.80365 Indian/Antananarivo +-16.46667 46.71667 Indian/Antananarivo +-13.5 48.86667 Indian/Antananarivo +-13.68333 48.45 Indian/Antananarivo +-21.83333 46.93333 Indian/Antananarivo +-18.96667 47.73333 Indian/Antananarivo +7.08971 171.38027 Pacific/Majuro +7.08931 171.3805 Pacific/Majuro +41.98028 21.06417 Europe/Skopje +41.88278 22.50917 Europe/Skopje +41.71556 21.77556 Europe/Skopje +42.01056 20.97139 Europe/Skopje +42.07444 21.0525 Europe/Skopje +41.91583 21.53056 Europe/Skopje +41.4375 22.64333 Europe/Skopje +41.17799 20.67784 Europe/Skopje +41.74583 22.19583 Europe/Skopje +41.99646 21.43141 Europe/Skopje +42 21.32778 Europe/Skopje +41.08889 21.01222 Europe/Skopje +41.63833 22.46472 Europe/Skopje +41.34514 21.55504 Europe/Skopje +41.11722 20.80194 Europe/Skopje +41.87861 20.88389 Europe/Skopje +41.48456 22.09056 Europe/Skopje +42.15639 21.58528 Europe/Skopje +42.13222 21.71444 Europe/Skopje +42.20194 22.33194 Europe/Skopje +41.91639 22.41278 Europe/Skopje +41.51444 20.96333 Europe/Skopje +41.43306 22.01194 Europe/Skopje +41.94444 20.92667 Europe/Skopje +41.79722 20.90833 Europe/Skopje +41.14166 22.50141 Europe/Skopje +41.96722 22.76944 Europe/Skopje +41.525 20.5275 Europe/Skopje +41.96722 20.98083 Europe/Skopje +41.92361 20.91361 Europe/Skopje +41.03143 21.33474 Europe/Skopje +42.04 21.425 Europe/Skopje +42.03083 21.44667 Europe/Skopje +42.01528 21.44111 Europe/Skopje +41.99451 21.58002 Europe/Skopje +41.94889 21.50278 Europe/Skopje +41.47849 20.55945 Europe/Skopje +12.35812 -4.77688 Africa/Bamako +16.77348 -3.00742 Africa/Bamako +11.31755 -5.66654 Africa/Bamako +13.4317 -6.2157 Africa/Bamako +13.30335 -4.89562 Africa/Bamako +12.2 -10.7 Africa/Bamako +14.4843 -4.18296 Africa/Bamako +13.7021 -6.0659 Africa/Bamako +12.39173 -5.46421 Africa/Bamako +12.86273 -7.55985 Africa/Bamako +13.5728 -8.0339 Africa/Bamako +14.44693 -11.44448 Africa/Bamako +12.74409 -8.07257 Africa/Bamako +11.93333 -8.41667 Africa/Bamako +16.27167 -0.04472 Africa/Bamako +13.90608 -4.55332 Africa/Bamako +11.41769 -7.48323 Africa/Bamako +13.54773 -7.44808 Africa/Bamako +12.65 -8 Africa/Bamako +13.8065 -10.8321 Africa/Bamako +20.46504 94.8712 Asia/Rangoon +17.04459 95.63957 Asia/Rangoon +20.43189 96.13874 Asia/Rangoon +16.60333 95.18278 Asia/Rangoon +16.71047 95.92866 Asia/Rangoon +18.94291 96.43408 Asia/Rangoon +16.75998 96.52498 Asia/Rangoon +19.32076 95.18272 Asia/Rangoon +16.91867 97.37001 Asia/Rangoon +17.65399 95.78813 Asia/Rangoon +17.29136 96.57523 Asia/Rangoon +17.21194 96.30333 Asia/Rangoon +14.07375 98.19423 Asia/Rangoon +20.78919 97.03776 Asia/Rangoon +20.0065 95.54531 Asia/Rangoon +16.76887 96.24503 Asia/Rangoon +20.14624 92.89835 Asia/Rangoon +22.56925 95.69818 Asia/Rangoon +21.8787 95.97965 Asia/Rangoon +16.80528 96.15611 Asia/Rangoon +18.4813 96.43742 Asia/Rangoon +19.7381 96.20742 Asia/Rangoon +18.82464 95.22216 Asia/Rangoon +16.28543 95.67882 Asia/Rangoon +17.33521 96.48135 Asia/Rangoon +18.49167 95.50591 Asia/Rangoon +21.33489 95.08438 Asia/Rangoon +16.88953 97.63482 Asia/Rangoon +17.95363 96.72247 Asia/Rangoon +25.38641 97.39439 Asia/Rangoon +21.46002 95.3884 Asia/Rangoon +18.28651 95.32014 Asia/Rangoon +16.25624 97.7246 Asia/Rangoon +16.3772 95.26488 Asia/Rangoon +16.49051 97.62825 Asia/Rangoon +22.10856 95.13583 Asia/Rangoon +22.91766 96.50982 Asia/Rangoon +20.18059 94.87595 Asia/Rangoon +12.43954 98.60028 Asia/Rangoon +20.87776 95.85844 Asia/Rangoon +22.02826 96.47066 Asia/Rangoon +23.64254 94.40478 Asia/Rangoon +16.73148 95.65441 Asia/Rangoon +16.52834 97.6157 Asia/Rangoon +21.97473 96.08359 Asia/Rangoon +20.14956 94.93246 Asia/Rangoon +19.67798 97.20975 Asia/Rangoon +17.78664 95.75076 Asia/Rangoon +22.9359 97.7498 Asia/Rangoon +21.6056 96.13508 Asia/Rangoon +17.30858 97.01124 Asia/Rangoon +16.44502 95.72373 Asia/Rangoon +16.07686 97.56388 Asia/Rangoon +16.90802 96.56037 Asia/Rangoon +16.70728 96.00168 Asia/Rangoon +17.64944 95.45706 Asia/Rangoon +22.65 93.61667 Asia/Rangoon +20.89921 94.81784 Asia/Rangoon +16.29416 95.39742 Asia/Rangoon +24.25256 97.23357 Asia/Rangoon +16.77919 94.73212 Asia/Rangoon +19.36838 95.21512 Asia/Rangoon +19.745 96.12972 Asia/Rangoon +47.74167 96.84444 Asia/Hovd +49.98111 92.06667 Asia/Hovd +48.96833 89.9625 Asia/Hovd +48.00556 91.64194 Asia/Hovd +46.37222 96.25833 Asia/Hovd +47.90771 106.88324 Asia/Ulaanbaatar +50.23139 106.20778 Asia/Ulaanbaatar +49.63417 100.1625 Asia/Ulaanbaatar +45.7625 106.27083 Asia/Ulaanbaatar +44.67024 102.17491 Asia/Ulaanbaatar +49.03333 104.08333 Asia/Ulaanbaatar +48.85229 106.45786 Asia/Ulaanbaatar +49.48667 105.92278 Asia/Ulaanbaatar +43.57083 104.425 Asia/Ulaanbaatar +44.88239 110.11631 Asia/Ulaanbaatar +48.8125 103.53472 Asia/Ulaanbaatar +46.71667 100.11667 Asia/Ulaanbaatar +46.19444 100.71806 Asia/Ulaanbaatar +46.68056 113.27917 Asia/Choibalsan +46.26389 102.775 Asia/Ulaanbaatar +47.70693 106.95276 Asia/Ulaanbaatar +22.20056 113.54611 Asia/Macau +15.21233 145.7545 Pacific/Saipan +14.66792 -61.04558 America/Martinique +14.78392 -60.99274 America/Martinique +14.75 -60.96667 America/Martinique +14.67751 -60.94228 America/Martinique +14.608 -61.00933 America/Martinique +14.61557 -60.90308 America/Martinique +14.73758 -60.96286 America/Martinique +14.60892 -61.07334 America/Martinique +14.57529 -60.97453 America/Martinique +22.71873 -12.45205 Africa/Nouakchott +16.57806 -15.45972 Africa/Nouakchott +15.15895 -12.1829 Africa/Nouakchott +16.51378 -15.80503 Africa/Nouakchott +18.08581 -15.9785 Africa/Nouakchott +20.93098 -17.03465 Africa/Nouakchott +16.6162 -7.2535 Africa/Nouakchott +16.61659 -11.40453 Africa/Nouakchott +16.14653 -13.50474 Africa/Nouakchott +20.51686 -13.04986 Africa/Nouakchott +17.0481 -13.9209 Africa/Nouakchott +16.70555 -62.21292 America/Montserrat +16.79183 -62.21058 America/Montserrat +35.87611 14.535 Europe/Malta +35.89972 14.51472 Europe/Malta +35.87601 14.472 Europe/Malta +35.90917 14.42556 Europe/Malta +35.89722 14.46111 Europe/Malta +-20.29806 57.47833 Indian/Mauritius +-20.05472 57.54528 Indian/Mauritius +-20.2175 57.52083 Indian/Mauritius +-20.26381 57.4791 Indian/Mauritius +-20.16194 57.49889 Indian/Mauritius +-20.40806 57.7 Indian/Mauritius +-20.035 57.64306 Indian/Mauritius +-20.31472 57.52028 Indian/Mauritius +-20.18972 57.71444 Indian/Mauritius +-20.25777 57.74976 Indian/Mauritius +-20.135 57.52111 Indian/Mauritius +4.1748 73.50888 Indian/Maldives +-9.93333 33.93333 Africa/Blantyre +-15.38596 35.3188 Africa/Blantyre +-13.7804 34.4587 Africa/Blantyre +-11.01863 33.85746 Africa/Blantyre +-16.91995 35.26199 Africa/Blantyre +-12.92744 34.29614 Africa/Blantyre +-11.46556 34.02071 Africa/Blantyre +-11.9 33.6 Africa/Blantyre +-16.03163 35.5 Africa/Blantyre +-13.79841 32.88019 Africa/Blantyre +-14.47815 35.26448 Africa/Blantyre +-15.06665 35.22543 Africa/Blantyre +-13.96692 33.78725 Africa/Blantyre +-13.03333 33.48333 Africa/Blantyre +-14.3779 34.33322 Africa/Blantyre +-15.78499 35.00854 Africa/Blantyre +-14.97928 34.95575 Africa/Blantyre +22.8694 -98.75886 America/Monterrey +24.84749 -98.14828 America/Monterrey +19.7967 -99.09946 America/Mexico_City +17.65319 -99.52607 America/Mexico_City +20.6493 -98.65621 America/Mexico_City +19.93372 -97.96119 America/Mexico_City +18.65388 -99.19054 America/Mexico_City +18.88333 -98.865 America/Mexico_City +18.88188 -99.06715 America/Mexico_City +18.68502 -99.24608 America/Mexico_City +19.40513 -99.52752 America/Mexico_City +18.78121 -99.23055 America/Mexico_City +19.25785 -99.10513 America/Mexico_City +20.27606 -97.9611 America/Mexico_City +19.42223 -97.0093 America/Mexico_City +19.27081 -98.94803 America/Mexico_City +19.35867 -99.20329 America/Mexico_City +17.98689 -92.93028 America/Mexico_City +19.49016 -99.10978 America/Mexico_City +19.41652 -99.55876 America/Mexico_City +19.18074 -96.13405 America/Mexico_City +16.33893 -92.56312 America/Mexico_City +25.6718 -97.81181 America/Monterrey +20.68812 -88.19936 America/Merida +20.8824 -89.747 America/Merida +16.75469 -93.11485 America/Mexico_City +20.95773 -97.40798 America/Mexico_City +19.64756 -99.16796 America/Mexico_City +19.685 -99.12806 America/Mexico_City +20.08363 -98.36332 America/Mexico_City +20.05329 -99.34539 America/Mexico_City +19.28786 -99.65324 America/Mexico_City +19.02863 -98.28334 America/Mexico_City +18.63693 -99.16208 America/Mexico_City +17.54042 -98.57952 America/Mexico_City +19.96268 -97.21141 America/Mexico_City +19.29708 -99.16787 America/Mexico_City +19.54005 -99.19538 America/Mexico_City +19.28348 -99.00317 America/Mexico_City +21.14284 -88.15119 America/Merida +19.83721 -98.97607 America/Mexico_City +17.56732 -99.39799 America/Mexico_City +20.3996 -89.53433 America/Merida +19.17927 -99.46731 America/Mexico_City +20.19188 -99.27204 America/Mexico_City +19.8173 -97.35992 America/Mexico_City +19.51194 -98.88293 America/Mexico_City +19.90944 -99.14472 America/Mexico_City +20.5225 -99.89167 America/Mexico_City +19.64388 -99.21598 America/Mexico_City +18.98603 -99.09914 America/Mexico_City +19.71981 -99.2237 America/Mexico_City +19.9063 -99.34297 America/Mexico_City +18.96923 -97.90074 America/Mexico_City +19.06747 -97.96595 America/Mexico_City +19.7458 -99.17855 America/Mexico_City +17.47496 -91.42214 America/Mexico_City +19.10641 -99.59068 America/Mexico_City +18.85528 -99.23072 America/Mexico_City +21.06611 -97.64207 America/Mexico_City +18.36874 -99.8723 America/Mexico_City +20.20427 -89.28629 America/Merida +18.46148 -97.39282 America/Mexico_City +18.88179 -97.73132 America/Mexico_City +17.54815 -92.95228 America/Mexico_City +18.55629 -99.60491 America/Mexico_City +14.90696 -92.26185 America/Mexico_City +21.35064 -98.2257 America/Mexico_City +22.27817 -97.86772 America/Monterrey +21.25151 -98.78247 America/Mexico_City +16.31841 -95.24783 America/Mexico_City +18.46562 -95.30159 America/Mexico_City +16.33847 -98.05532 America/Mexico_City +20.0357 -98.35638 America/Mexico_City +19.25391 -98.40644 America/Mexico_City +19.42155 -98.95038 America/Mexico_City +17.02909 -96.73328 America/Mexico_City +19.71288 -98.96896 America/Mexico_City +19.31277 -98.20933 America/Mexico_City +19.13368 -97.6418 America/Mexico_City +19.5517 -98.91867 America/Mexico_City +19.6667 -99.09527 America/Mexico_City +19.3546 -99.65694 America/Mexico_City +19.28501 -99.73478 America/Mexico_City +19.44999 -98.87274 America/Mexico_City +19.26919 -99.53201 America/Mexico_City +19.28378 -98.43808 America/Mexico_City +19.24333 -98.19083 America/Mexico_City +19.68782 -98.86208 America/Mexico_City +20.3878 -99.99605 America/Mexico_City +18.08829 -96.12982 America/Mexico_City +19.34317 -98.85557 America/Mexico_City +19.09917 -98.25417 America/Mexico_City +16.73788 -92.63819 America/Mexico_City +18.4487 -95.21327 America/Mexico_City +16.18798 -95.19952 America/Mexico_City +21.93032 -99.99169 America/Mexico_City +25.98729 -98.09414 America/Monterrey +18.83936 -97.12829 America/Mexico_City +26.07681 -98.29748 America/Matamoros +15.87037 -97.07726 America/Mexico_City +18.61472 -99.31806 America/Mexico_City +19.04334 -98.20193 America/Mexico_City +20.24875 -99.18894 America/Mexico_City +21.28953 -89.6292 America/Merida +20.53315 -97.45946 America/Mexico_City +19.41667 -99.2 America/Mexico_City +20.6274 -87.07987 America/Cancun +15.68618 -93.20938 America/Mexico_City +20.12635 -88.92346 America/Merida +19.5633 -97.24228 America/Mexico_City +18.39816 -93.21408 America/Mexico_City +20.44655 -97.32495 America/Mexico_City +22.05372 -98.18498 America/Mexico_City +18.89891 -97.63892 America/Mexico_City +17.50904 -91.98334 America/Mexico_City +20.11697 -98.73329 America/Mexico_City +19.03689 -98.79516 America/Mexico_City +20.30651 -89.41837 America/Merida +18.85101 -97.10084 America/Mexico_City +16.68848 -98.40776 America/Mexico_City +16.75989 -93.37317 America/Mexico_City +19.27127 -99.45662 America/Mexico_City +16.90639 -92.09374 America/Mexico_City +17.07108 -96.71914 America/Mexico_City +27.47629 -99.51639 America/Matamoros +18.83141 -97.15603 America/Mexico_City +19.63658 -99.30682 America/Mexico_City +19.47851 -99.23963 America/Mexico_City +21.35087 -97.68656 America/Mexico_City +18.07113 -94.40799 America/Mexico_City +21.09571 -89.28332 America/Merida +15.36643 -92.24812 America/Mexico_City +25.1891 -99.82866 America/Monterrey +19.07361 -98.26694 America/Mexico_City +20.23031 -99.21396 America/Mexico_City +19.92992 -96.85194 America/Mexico_City +22.32085 -97.8595 America/Monterrey +18.00126 -94.5581 America/Mexico_City +19.19174 -99.02277 America/Mexico_City +16.3327 -96.59558 America/Mexico_City +19.26169 -99.59844 America/Mexico_City +20.9767 -89.62059 America/Merida +16.87984 -95.03908 America/Mexico_City +25.87972 -97.50417 America/Matamoros +20.07067 -97.05825 America/Mexico_City +15.44224 -92.89395 America/Mexico_City +17.05 -98.66667 America/Mexico_City +19.33212 -99.21118 America/Mexico_City +17.76152 -92.5965 America/Mexico_City +19.7755 -98.98079 America/Mexico_City +19.36356 -98.97707 America/Mexico_City +24.85908 -99.56568 America/Monterrey +19.28986 -99.51236 America/Mexico_City +18.62942 -95.51864 America/Mexico_City +16.3119 -91.98028 America/Mexico_City +17.93333 -94.08333 America/Mexico_City +18.6 -96.15 America/Mexico_City +20.93438 -89.55811 America/Merida +16.43603 -95.01975 America/Mexico_City +18.61472 -99.18028 America/Mexico_City +18.88139 -99.17778 America/Mexico_City +18.17643 -93.06349 America/Mexico_City +19.53124 -96.91589 America/Mexico_City +18.60151 -98.46499 America/Mexico_City +16.57855 -95.10223 America/Mexico_City +18.84206 -99.67654 America/Mexico_City +19.31905 -98.88432 America/Mexico_City +19.35738 -99.0671 America/Mexico_City +18.85504 -97.06088 America/Mexico_City +19.39528 -99.09778 America/Mexico_City +20.47831 -99.21689 America/Mexico_City +18.34928 -99.53936 America/Mexico_City +21.017 -89.8759 America/Merida +15.1391 -92.4648 America/Mexico_City +18.30668 -99.33541 America/Mexico_City +17.83386 -93.39198 America/Mexico_City +21.14 -98.41944 America/Mexico_City +19.15945 -98.40734 America/Mexico_City +20.17251 -98.05422 America/Mexico_City +19.15024 -96.96835 America/Mexico_City +17.80967 -97.77643 America/Mexico_City +15.65866 -92.14388 America/Mexico_City +18.54326 -92.6453 America/Mexico_City +18.90806 -97 America/Mexico_City +19.5775 -88.04529 America/Cancun +18.60891 -90.74544 America/Merida +18.83677 -99.18207 America/Mexico_City +17.74042 -91.76602 America/Mexico_City +22.74304 -98.9739 America/Monterrey +19.61725 -99.06601 America/Mexico_City +18.06562 -93.17698 America/Mexico_City +18.9261 -99.23075 America/Mexico_City +19.08912 -98.27137 America/Mexico_City +18.80459 -98.94555 America/Mexico_City +19.67029 -99.17865 America/Mexico_City +20.03573 -98.3105 America/Mexico_City +19.35993 -99.29388 America/Mexico_City +20.501 -86.94598 America/Cancun +19.77708 -99.2114 America/Mexico_City +19.3467 -99.16174 America/Mexico_City +17.99794 -94.63542 America/Mexico_City +18.36678 -95.79634 America/Mexico_City +18.88584 -96.93125 America/Mexico_City +19.32932 -98.1664 America/Mexico_City +16.24471 -92.13425 America/Mexico_City +18.26295 -93.2214 America/Mexico_City +20.48699 -97.46823 America/Mexico_City +18.14212 -94.4371 America/Mexico_City +19.45379 -96.96026 America/Mexico_City +19.63452 -99.1005 America/Mexico_City +23.74174 -99.14599 America/Monterrey +21.98333 -99.01667 America/Mexico_City +18.9894 -97.44702 America/Mexico_City +19.77558 -98.57471 America/Mexico_City +19.40061 -99.01483 America/Mexico_City +26.35 -99.1 America/Monterrey +18.80615 -97.17777 America/Mexico_City +22.27228 -97.83623 America/Monterrey +21.94037 -100.0117 America/Mexico_City +19.42847 -99.12766 America/Mexico_City +18.64592 -91.82991 America/Merida +16.69567 -93.72352 America/Mexico_City +19.06406 -98.30352 America/Mexico_City +17.5506 -99.50578 America/Mexico_City +17.59459 -99.17639 America/Mexico_City +19.83866 -98.03171 America/Mexico_City +19.55939 -98.89884 America/Mexico_City +19.41686 -98.90202 America/Mexico_City +20.66667 -88.56667 America/Merida +19.54895 -98.88236 America/Mexico_City +16.71375 -92.98804 America/Mexico_City +18.51138 -88.301 America/Cancun +19.34441 -90.72576 America/Merida +19.26174 -98.89775 America/Mexico_City +21.192 -97.74088 America/Mexico_City +18.42131 -95.11398 America/Mexico_City +18.37424 -95.75508 America/Mexico_City +22.00144 -99.64247 America/Mexico_City +17.99647 -93.37835 America/Mexico_City +19.19305 -99.46512 America/Mexico_City +21.17429 -86.84656 America/Cancun +19.83803 -90.5277 America/Merida +19.58848 -98.5684 America/Mexico_City +25.58333 -99.98333 America/Monterrey +16.79925 -93.27249 America/Mexico_City +19.58865 -96.93639 America/Mexico_City +19.48698 -99.18594 America/Mexico_City +18.50307 -98.75219 America/Mexico_City +18.90815 -98.43613 America/Mexico_City +19.80038 -99.87376 America/Mexico_City +19.58547 -99.26034 America/Mexico_City +19.41333 -98.14358 America/Mexico_City +19.71154 -98.45152 America/Mexico_City +19.04611 -98.045 America/Mexico_City +19.12384 -98.76649 America/Mexico_City +18.77072 -95.76063 America/Mexico_City +19.76613 -97.24514 America/Mexico_City +18.36886 -97.29832 America/Mexico_City +22.39215 -97.93867 America/Monterrey +18.15426 -94.39452 America/Mexico_City +20.91063 -97.67485 America/Mexico_City +18.37831 -97.25766 America/Mexico_City +18.14233 -94.14364 America/Mexico_City +20.27007 -98.94368 America/Mexico_City +17.94885 -94.91399 America/Mexico_City +18.98036 -97.78474 America/Mexico_City +18.2025 -98.04864 America/Mexico_City +16.86336 -99.8901 America/Mexico_City +19.10412 -97.95104 America/Mexico_City +17.02833 -96.70056 America/Mexico_City +25.8569 -99.61855 America/Monterrey +17.78282 -92.90042 America/Mexico_City +19.31491 -97.92322 America/Mexico_City +19.21583 -98.23972 America/Mexico_City +19.32076 -98.20959 America/Mexico_City +19.16861 -98.20389 America/Mexico_City +19.12516 -98.16192 America/Mexico_City +16.0887 -93.75588 America/Mexico_City +16.2375 -93.90184 America/Mexico_City +19.05 -98.3 America/Mexico_City +22.25528 -97.86861 America/Monterrey +20.95361 -97.44194 America/Mexico_City +19.33241 -99.60349 America/Mexico_City +19.3056 -99.59399 America/Mexico_City +19.32889 -99.32556 America/Mexico_City +19.3984 -99.15766 America/Mexico_City +19.44286 -99.09724 America/Mexico_City +19.43471 -99.20091 America/Mexico_City +19.44506 -99.14612 America/Mexico_City +19.35985 -99.35016 America/Mexico_City +19.70246 -99.1438 America/Mexico_City +19.68056 -99.25639 America/Mexico_City +19.65791 -99.1234 America/Mexico_City +19.68028 -99.01 America/Mexico_City +19.60833 -99.16944 America/Mexico_City +28.84028 -111.4775 America/Hermosillo +25.66163 -108.637 America/Mazatlan +19.2366 -104.56512 America/Mexico_City +32.28924 -115.10534 America/Tijuana +17.64344 -101.55212 America/Mexico_City +20.62248 -103.06766 America/Mexico_City +19.62749 -103.41752 America/Mexico_City +20.72356 -103.38479 America/Mexico_City +19.98912 -102.28477 America/Mexico_City +20.22816 -103.5687 America/Mexico_City +22.76843 -102.58141 America/Mexico_City +19.81389 -101.79042 America/Mexico_City +20.21081 -101.13212 America/Mexico_City +20.33738 -102.28342 America/Mexico_City +20.51499 -100.9967 America/Mexico_City +26.92814 -101.45212 America/Monterrey +25.81147 -100.5941 America/Monterrey +19.26722 -103.73778 America/Mexico_City +20.39321 -101.18917 America/Mexico_City +19.19387 -100.13394 America/Mexico_City +19.41362 -102.05278 America/Mexico_City +20.14085 -101.1825 America/Mexico_City +19.55555 -103.37587 America/Mexico_City +25.54389 -103.41898 America/Monterrey +20.62445 -103.23423 America/Mexico_City +20.6409 -103.29327 America/Mexico_City +20.47421 -103.44654 America/Mexico_City +32.5027 -117.00371 America/Tijuana +20.80051 -103.46993 America/Mexico_City +20.88197 -103.83569 America/Mexico_City +21.5008 -104.88936 America/Mazatlan +20.81692 -102.76347 America/Mexico_City +19.18666 -102.84926 America/Mexico_City +21.43421 -102.57449 America/Mexico_City +18.90467 -100.15301 America/Mexico_City +18.91463 -103.87564 America/Mexico_City +32.56716 -116.62509 America/Tijuana +19.88667 -102.20514 America/Mexico_City +19.67754 -103.25225 America/Mexico_City +20.6536 -103.70092 America/Mexico_City +19.23514 -101.45817 America/Mexico_City +23.63482 -103.64214 America/Mexico_City +22.18778 -100.94192 America/Mexico_City +20.94356 -101.42964 America/Mexico_City +19.88442 -103.59993 America/Mexico_City +25.04389 -105.41917 America/Monterrey +21.81102 -105.20789 America/Mazatlan +25.42533 -100.15205 America/Monterrey +20.74206 -100.44615 America/Mexico_City +25.67325 -100.45813 America/Monterrey +20.55056 -103.44 America/Mexico_City +20.51667 -103.41667 America/Mexico_City +25.43333 -103.21667 America/Monterrey +25.74167 -100.30222 America/Monterrey +21.03011 -102.40414 America/Mexico_City +24.83026 -105.3373 America/Monterrey +20.91528 -100.74389 America/Mexico_City +32.45612 -114.77186 America/Hermosillo +22.14993 -100.9828 America/Mexico_City +21.29861 -100.51639 America/Mexico_City +21.29787 -100.51676 America/Mexico_City +22.89088 -109.91238 America/Mazatlan +21.24891 -102.33184 America/Mexico_City +21.00116 -100.38379 America/Mexico_City +23.05888 -109.69771 America/Mazatlan +21.01958 -101.85695 America/Mexico_City +31.02468 -114.83919 America/Tijuana +21.47777 -101.21593 America/Mexico_City +27.06193 -101.54891 America/Monterrey +20.54638 -103.46622 America/Mexico_City +20.21249 -100.87923 America/Mexico_City +25.42321 -101.0053 America/Monterrey +20.57224 -101.19119 America/Mexico_City +20.05858 -102.71575 America/Mexico_City +26.50358 -100.18187 America/Monterrey +27.85591 -101.11738 America/Monterrey +32.36044 -117.04645 America/Tijuana +20.87179 -101.51666 America/Mexico_City +23.82521 -103.03178 America/Mexico_City +22.22869 -102.32156 America/Mexico_City +25.53928 -100.94742 America/Monterrey +20.58806 -100.38806 America/Mexico_City +20.08695 -101.51418 America/Mexico_City +20.617 -105.23018 America/Mexico_City +31.31716 -113.53799 America/Hermosillo +28.70007 -100.52353 America/Matamoros +17.53892 -101.26685 America/Mexico_City +20.43222 -101.7213 America/Mexico_City +19.51931 -101.6097 America/Mexico_City +25.44156 -102.1792 America/Monterrey +19.64654 -102.04763 America/Mexico_City +27.89232 -101.42319 America/Monterrey +29.56689 -104.54487 America/Ojinaga +20.3553 -102.77358 America/Mexico_City +20.7565 -103.44297 America/Mexico_City +30.41552 -107.91166 America/Chihuahua +27.94028 -101.21812 America/Monterrey +19.02612 -102.09136 America/Mexico_City +21.36545 -102.84659 America/Mexico_City +24.76712 -107.69724 America/Mazatlan +27.07015 -109.44391 America/Hermosillo +28.42071 -100.76565 America/Monterrey +20.12571 -101.19208 America/Mexico_City +19.70078 -101.18443 America/Mexico_City +25.67506 -100.31846 America/Monterrey +26.90687 -101.42056 America/Monterrey +32.62781 -115.45446 America/Tijuana +28.28333 -105.48333 America/Chihuahua +27.87933 -101.51615 America/Monterrey +21.14972 -101.6225 America/Mexico_City +23.2329 -106.40616 America/Mazatlan +23.64824 -100.64334 America/Mexico_City +25.52699 -103.2285 America/Monterrey +20.99884 -101.28752 America/Mexico_City +19.89167 -100.44229 America/Mexico_City +19.11695 -104.34214 America/Mexico_City +31.72099 -116.57184 America/Tijuana +30.62789 -110.96203 America/Hermosillo +29.19366 -108.14684 America/Chihuahua +25.79116 -108.99463 America/Mazatlan +22.27248 -101.98898 America/Mexico_City +21.12131 -101.66801 America/Mexico_City +20.57376 -103.32345 America/Mexico_City +20.34763 -102.02806 America/Mexico_City +24.1423 -110.31274 America/Mazatlan +17.99583 -102.22694 America/Mexico_City +21.3559 -101.93399 America/Mexico_City +20.29028 -102.54565 America/Mexico_City +20.64364 -100.99239 America/Mexico_City +20.28527 -103.42897 America/Mexico_City +19.99419 -102.71919 America/Mexico_City +28.33333 -105.4 America/Chihuahua +21.96111 -102.34333 America/Mexico_City +22.64862 -102.99034 America/Mexico_City +20.37266 -101.06361 America/Mexico_City +20.29348 -102.70754 America/Mexico_City +21.16741 -102.46386 America/Mexico_City +21.03821 -104.3706 America/Mazatlan +20.71623 -105.20408 America/Mexico_City +20.6784 -101.34654 America/Mexico_City +18.63028 -100.89885 America/Mexico_City +26.8261 -109.6422 America/Hermosillo +26.92961 -105.6662 America/Chihuahua +19.43661 -100.35691 America/Mexico_City +31.30862 -110.94217 America/Hermosillo +30.72043 -112.15847 America/Hermosillo +29.1026 -110.97732 America/Hermosillo +27.91928 -110.89755 America/Hermosillo +25.56745 -108.46756 America/Mazatlan +21.01858 -101.2591 America/Mexico_City +25.45978 -108.0753 America/Mazatlan +25.67678 -100.25646 America/Monterrey +22.75433 -102.5225 America/Mexico_City +20.66682 -103.39182 America/Mexico_City +25.56985 -103.49588 America/Monterrey +25.75686 -108.82585 America/Mazatlan +25.79516 -100.3146 America/Monterrey +25.65384 -100.37758 America/Monterrey +23.17569 -102.86942 America/Mexico_City +22.83253 -105.77539 America/Mazatlan +31.86612 -116.59972 America/Tijuana +21.52727 -102.23975 America/Mexico_City +27.9634 -110.80911 America/Hermosillo +23.38333 -105.38333 America/Monterrey +20.33333 -104.5 America/Mexico_City +20.53972 -100.44139 America/Mexico_City +19.80647 -104.21707 America/Mexico_City +24.02032 -104.65756 America/Monterrey +24.80737 -107.39734 America/Mazatlan +28.40884 -106.86319 America/Chihuahua +24.5875 -107.3875 America/Mazatlan +20.48008 -100.96067 America/Mexico_City +21.23777 -104.9001 America/Mazatlan +20.72154 -100.76056 America/Mexico_City +19.24341 -103.72767 America/Mexico_City +27.48642 -109.94083 America/Hermosillo +25.53718 -103.52456 America/Monterrey +31.73333 -106.48333 America/Ojinaga +19.69229 -100.55739 America/Mexico_City +19.70466 -103.4617 America/Mexico_City +28.19013 -105.47012 America/Chihuahua +25.03371 -111.65991 America/Mazatlan +27.67842 -105.17136 America/Chihuahua +27.24457 -100.13229 America/Matamoros +18.3571 -100.66832 America/Mexico_City +29.32322 -100.95217 America/Matamoros +28.63528 -106.08889 America/Chihuahua +20.29616 -103.19123 America/Mexico_City +20.52353 -100.81566 America/Mexico_City +26.78932 -101.43211 America/Monterrey +30.98699 -110.29062 America/Hermosillo +24.66019 -107.53927 America/Mazatlan +21.84583 -102.71849 America/Mexico_City +22.94889 -102.70222 America/Mexico_City +19.77249 -104.36531 America/Mexico_City +17.20667 -100.43306 America/Mexico_City +20.55078 -102.50942 America/Mexico_City +18.93725 -103.96531 America/Mexico_City +18.31788 -100.28345 America/Mexico_City +20.70519 -102.34635 America/Mexico_City +25.75976 -100.16287 America/Monterrey +19.08864 -102.35704 America/Mexico_City +20.5448 -100.6843 America/Mexico_City +20.45748 -100.6224 America/Mexico_City +20.54906 -104.04678 America/Mexico_City +28.34124 -100.85111 America/Monterrey +25.27673 -100.01442 America/Monterrey +21.88234 -102.28259 America/Mexico_City +31.33071 -109.54876 America/Hermosillo +22.49317 -105.36267 America/Mazatlan +20.03024 -100.72249 America/Mexico_City +20.45001 -101.53 America/Mexico_City +27.24056 -100.13222 America/Matamoros +21.15611 -100.9325 America/Mexico_City +18.02108 -102.21268 America/Mexico_City +17.98085 -102.22172 America/Mexico_City +19.38611 -99.16204 America/Mexico_City +19.49156 -99.12475 America/Mexico_City +19.38119 -99.13685 America/Mexico_City +32.40889 -116.94361 America/Tijuana +25.65716 -100.40268 America/Monterrey +22.18306 -100.94083 America/Mexico_City +19.05222 -104.31583 America/Mexico_City +19.39694 -99.27667 America/Mexico_City +20.51806 -103.38056 America/Mexico_City +19.6325 -99.13861 America/Mexico_City +19.26028 -99.59083 America/Mexico_City +25.62944 -100.18778 America/Monterrey +19.3025 -98.86306 America/Mexico_City +19.845 -99.23333 America/Mexico_City +19.29306 -98.84167 America/Mexico_City +19.68667 -98.97278 America/Mexico_City +25.90417 -100.15972 America/Monterrey +32.4425 -117.03417 America/Tijuana +19.33972 -98.95056 America/Mexico_City +21.135 -101.74972 America/Mexico_City +19.34472 -99.59194 America/Mexico_City +20.56444 -103.30222 America/Mexico_City +19.34361 -98.97472 America/Mexico_City +19.21778 -98.98806 America/Mexico_City +24.65667 -107.545 America/Mazatlan +19.68972 -98.86083 America/Mexico_City +19.375 -99.29444 America/Mexico_City +19.25417 -99.62778 America/Mexico_City +29.56444 -104.41639 America/Ojinaga +32.4875 -116.82667 America/Tijuana +21.15194 -101.73306 America/Mexico_City +20.4925 -103.4175 America/Mexico_City +25.78861 -100.44778 America/Monterrey +25.77583 -100.42583 America/Monterrey +32.42389 -116.97167 America/Tijuana +18.86861 -99.20833 America/Mexico_City +19.87444 -98.93472 America/Mexico_City +17.26944 -97.67917 America/Mexico_City +18.30111 -99.33111 America/Mexico_City +19.04222 -98.11889 America/Mexico_City +20.06417 -98.71722 America/Mexico_City +19.61639 -99.14722 America/Mexico_City +18.15056 -94.5525 America/Mexico_City +19.29167 -98.46806 America/Mexico_City +19.71306 -98.96833 America/Mexico_City +20.55083 -100.39806 America/Mexico_City +19.66194 -99.06889 America/Mexico_City +15.76889 -96.135 America/Mexico_City +6.32649 99.8432 Asia/Kuala_Lumpur +3.936 102.3626 Asia/Kuala_Lumpur +3.7899 101.857 Asia/Kuala_Lumpur +1.8548 102.9325 Asia/Kuala_Lumpur +1.8681 103.1124 Asia/Kuala_Lumpur +1.51 103.5141 Asia/Kuala_Lumpur +1.4866 103.3896 Asia/Kuala_Lumpur +1.4726 103.878 Asia/Kuala_Lumpur +1.7381 103.8999 Asia/Kuala_Lumpur +1.6006 103.6419 Asia/Kuala_Lumpur +1.6561 103.6032 Asia/Kuala_Lumpur +1.53742 103.65779 Asia/Kuala_Lumpur +1.4655 103.7578 Asia/Kuala_Lumpur +2.0251 103.3328 Asia/Kuala_Lumpur +2.0136 103.0659 Asia/Kuala_Lumpur +2.4312 103.8405 Asia/Kuala_Lumpur +2.5148 102.8158 Asia/Kuala_Lumpur +2.2673 102.5453 Asia/Kuala_Lumpur +2.0442 102.5689 Asia/Kuala_Lumpur +2.0441 102.6527 Asia/Kuala_Lumpur +2.385 103.021 Asia/Kuala_Lumpur +3.35 101.25 Asia/Kuala_Lumpur +3.38333 101.41667 Asia/Kuala_Lumpur +3.31667 101.46667 Asia/Kuala_Lumpur +3.08507 101.53281 Asia/Kuala_Lumpur +3.03333 101.45 Asia/Kuala_Lumpur +4.25 103.41667 Asia/Kuala_Lumpur +4.1842 102.0468 Asia/Kuala_Lumpur +5.73333 115.93333 Asia/Kuching +5.9749 116.0724 Asia/Kuching +5.90702 116.10146 Asia/Kuching +5.9258 116.06094 Asia/Kuching +5.8231 116.0466 Asia/Kuching +5.9538 116.6641 Asia/Kuching +4.48178 118.61118 Asia/Kuching +5.27667 115.24167 Asia/Kuching +5.3473 115.7455 Asia/Kuching +5.0268 118.327 Asia/Kuching +5.8402 118.1179 Asia/Kuching +5.3378 116.1602 Asia/Kuching +4.2498 117.8871 Asia/Kuching +4.6374 103.4368 Asia/Kuala_Lumpur +4.5141 103.4483 Asia/Kuala_Lumpur +5.36499 100.56177 Asia/Kuala_Lumpur +5.0108 100.54101 Asia/Kuala_Lumpur +5.72744 100.50876 Asia/Kuala_Lumpur +4.95 100.63333 Asia/Kuala_Lumpur +4.85 100.73333 Asia/Kuala_Lumpur +4.76667 100.93333 Asia/Kuala_Lumpur +4.5841 101.0829 Asia/Kuala_Lumpur +4.8823 101.9644 Asia/Kuala_Lumpur +5.3302 103.1408 Asia/Kuala_Lumpur +5.2056 103.2059 Asia/Kuala_Lumpur +2.4701 102.2302 Asia/Kuala_Lumpur +2.3804 102.2089 Asia/Kuala_Lumpur +2.2654 102.2801 Asia/Kuala_Lumpur +2.269 102.1427 Asia/Kuala_Lumpur +2.196 102.2405 Asia/Kuala_Lumpur +2.8136 101.50185 Asia/Kuala_Lumpur +2.8724 101.49484 Asia/Kuala_Lumpur +2.9516 101.843 Asia/Kuala_Lumpur +2.7297 101.9381 Asia/Kuala_Lumpur +2.5228 101.7959 Asia/Kuala_Lumpur +2.8079 102.4049 Asia/Kuala_Lumpur +2.7389 102.2487 Asia/Kuala_Lumpur +3.4836 103.3996 Asia/Kuala_Lumpur +3.4854 102.3484 Asia/Kuala_Lumpur +3.4506 102.4176 Asia/Kuala_Lumpur +5.3991 100.36382 Asia/Kuala_Lumpur +5.38333 100.38333 Asia/Kuala_Lumpur +5.36301 100.4667 Asia/Kuala_Lumpur +5.16586 100.47793 Asia/Kuala_Lumpur +5.12671 100.49316 Asia/Kuala_Lumpur +5.48032 100.49849 Asia/Kuala_Lumpur +5.41123 100.33543 Asia/Kuala_Lumpur +3.3646 101.6041 Asia/Kuala_Lumpur +3.3213 101.5767 Asia/Kuala_Lumpur +3.10726 101.60671 Asia/Kuala_Lumpur +3.1412 101.68653 Asia/Kuala_Lumpur +3.7698 100.9879 Asia/Kuala_Lumpur +3.6746 100.9867 Asia/Kuala_Lumpur +3.8077 103.326 Asia/Kuala_Lumpur +4.46916 101.04107 Asia/Kuala_Lumpur +4.3 101.15 Asia/Kuala_Lumpur +4.16667 101.2 Asia/Kuala_Lumpur +4.11667 101.28333 Asia/Kuala_Lumpur +4.2323 100.6298 Asia/Kuala_Lumpur +4.0259 101.0213 Asia/Kuala_Lumpur +5.81717 100.47381 Asia/Kuala_Lumpur +5.647 100.48772 Asia/Kuala_Lumpur +5.51707 100.4265 Asia/Kuala_Lumpur +5.8 102.15 Asia/Kuala_Lumpur +1.55 110.33333 Asia/Kuching +1.24722 111.45278 Asia/Kuching +2.11667 111.51667 Asia/Kuching +2.3 111.81667 Asia/Kuching +6.4414 100.19862 Asia/Kuala_Lumpur +6.26812 100.42167 Asia/Kuala_Lumpur +6.1 100.3 Asia/Kuala_Lumpur +6.12104 100.36014 Asia/Kuala_Lumpur +6.04934 102.13987 Asia/Kuala_Lumpur +6.13328 102.2386 Asia/Kuala_Lumpur +6.8837 116.8477 Asia/Kuching +2.01667 112.93333 Asia/Kuching +3.16667 113.03333 Asia/Kuching +4.75 115 Asia/Kuching +4.4148 114.0089 Asia/Kuching +1.6 103.81667 Asia/Kuala_Lumpur +5.46061 100.30742 Asia/Kuala_Lumpur +2.6579 101.5629 Asia/Kuala_Lumpur +5.46339 100.38144 Asia/Kuala_Lumpur +6.03333 102.28333 Asia/Kuala_Lumpur +3.2856 101.519 Asia/Kuala_Lumpur +4.4557 100.6288 Asia/Kuala_Lumpur +3.2594 101.5541 Asia/Kuala_Lumpur +2.2186 102.1995 Asia/Kuala_Lumpur +3.4242 101.1849 Asia/Kuala_Lumpur +5.32699 100.27348 Asia/Kuala_Lumpur +1.8278 103.3 Asia/Kuala_Lumpur +5.91667 102.21667 Asia/Kuala_Lumpur +2.35 102.11667 Asia/Kuala_Lumpur +6 102.25 Asia/Kuala_Lumpur +3.21667 101.31667 Asia/Kuala_Lumpur +2.2152 102.2851 Asia/Kuala_Lumpur +3.15 101.53333 Asia/Kuala_Lumpur +2.8033 101.7972 Asia/Kuala_Lumpur +3.03333 101.75 Asia/Kuala_Lumpur +2.2139 102.3278 Asia/Kuala_Lumpur +2.2594 102.1838 Asia/Kuala_Lumpur +3.51667 101.9 Asia/Kuala_Lumpur +2.2487 102.246 Asia/Kuala_Lumpur +2.93527 101.69112 Asia/Kuala_Lumpur +5.28883 115.26924 Asia/Kuching +3.04384 101.58062 Asia/Kuala_Lumpur +-25.05194 33.64417 Africa/Maputo +-19.60944 34.74306 Africa/Maputo +-25.02694 33.09889 Africa/Maputo +-16.15639 33.58667 Africa/Maputo +-25.44278 31.99528 Africa/Maputo +-17.87861 36.88833 Africa/Maputo +-12.97395 40.51775 Africa/Maputo +-15.11646 39.2666 Africa/Maputo +-14.56257 40.68538 Africa/Maputo +-13.12556 38.99972 Africa/Maputo +-11.31667 40.35 Africa/Maputo +-15.03417 40.73583 Africa/Maputo +-23.85972 35.34722 Africa/Maputo +-25.96222 32.45889 Africa/Maputo +-25.96553 32.58322 Africa/Maputo +-24.71167 33.88278 Africa/Maputo +-13.31278 35.24056 Africa/Maputo +-23.865 35.38333 Africa/Maputo +-14.80306 36.53722 Africa/Maputo +-24.53333 32.98333 Africa/Maputo +-19.11639 33.48333 Africa/Maputo +-24.68667 33.53056 Africa/Maputo +-19.84361 34.83889 Africa/Maputo +-16.2325 39.90861 Africa/Maputo +-14.87056 37.00444 Africa/Maputo +-17.5 24.26667 Africa/Windhoek +-22.55941 17.08323 Africa/Windhoek +-22.68333 14.53333 Africa/Windhoek +-17.93333 19.76667 Africa/Windhoek +-23.31667 17.08333 Africa/Windhoek +-20.46369 16.64772 Africa/Windhoek +-17.78333 15.68333 Africa/Windhoek +-21.98333 16.91667 Africa/Windhoek +-26.64806 15.15944 Africa/Windhoek +-26.58333 18.13333 Africa/Windhoek +-19.56667 18.11667 Africa/Windhoek +-22.45 18.96667 Africa/Windhoek +-22.9575 14.50528 Africa/Windhoek +-22.27631 166.4572 Pacific/Noumea +-22.28333 166.58333 Pacific/Noumea +-22.15 166.45 Pacific/Noumea +13.79599 5.25026 Africa/Niamey +13.80716 8.9881 Africa/Niamey +14.20711 1.45418 Africa/Niamey +13.56271 7.04848 Africa/Niamey +13.75737 7.9874 Africa/Niamey +14.00776 0.75306 Africa/Niamey +14.97089 8.88786 Africa/Niamey +14.8888 5.2692 Africa/Niamey +13.51366 2.1098 Africa/Niamey +14.24953 13.10921 Africa/Niamey +13.70727 9.15013 Africa/Niamey +13.95532 7.67122 Africa/Niamey +13.42309 8.47485 Africa/Niamey +13.5 7.10174 Africa/Niamey +12.99826 8.90991 Africa/Niamey +14.073 5.96 Africa/Niamey +14.4605 5.2437 Africa/Niamey +11.88435 3.44919 Africa/Niamey +13.049 3.1937 Africa/Niamey +13.63933 4.02875 Africa/Niamey +13.31536 12.61134 Africa/Niamey +14.51056 6.765 Africa/Niamey +14.73075 0.91738 Africa/Niamey +17.0187 8.0168 Africa/Niamey +16.97333 7.99111 Africa/Niamey +-29.05459 167.96628 Pacific/Norfolk +11.42406 5.22879 Africa/Lagos +9.81278 6.15583 Africa/Lagos +11.11128 7.7227 Africa/Lagos +9.2 12.48333 Africa/Lagos +4.92472 6.26417 Africa/Lagos +7.85 9.78333 Africa/Lagos +11.81067 8.84505 Africa/Lagos +5.51667 5.75 Africa/Lagos +8.93333 8.6 Africa/Lagos +5.05127 7.9335 Africa/Lagos +6.7 6.33333 Africa/Lagos +5.52627 7.48959 Africa/Lagos +5.48986 6.00743 Africa/Lagos +5.8086 8.0812 Africa/Lagos +5.93576 7.0793 Africa/Lagos +6.65504 6.38687 Africa/Lagos +10.0706 6.1906 Africa/Lagos +12.40386 4.64692 Africa/Lagos +12.57317 6.05971 Africa/Lagos +7.26667 9.98333 Africa/Lagos +9.18052 7.17933 Africa/Lagos +13.06092 5.23902 Africa/Lagos +10.98134 8.05749 Africa/Lagos +8.66667 3.38333 Africa/Lagos +6.84323 3.64776 Africa/Lagos +5.89405 5.67666 Africa/Lagos +11.10298 5.25068 Africa/Lagos +11.54912 8.57464 Africa/Lagos +11.71391 11.08108 Africa/Lagos +4.77742 7.0134 Africa/Lagos +9.98333 10.93333 Africa/Lagos +8.73333 5.75 Africa/Lagos +9.33333 9.45 Africa/Lagos +5.95666 6.84904 Africa/Lagos +7.85 3.93333 Africa/Lagos +8.05 4.76667 Africa/Lagos +7.1962 5.58681 Africa/Lagos +5.48333 7.03041 Africa/Lagos +7.08921 7.64989 Africa/Lagos +7.95 4.8 Africa/Lagos +7.76667 4.56667 Africa/Lagos +7.55 3.43333 Africa/Lagos +6.14543 6.78845 Africa/Lagos +7.1 4.83333 Africa/Lagos +7.6 4.18333 Africa/Lagos +9.21667 3.18333 Africa/Lagos +4.74159 7.08488 Africa/Lagos +5.83523 7.35989 Africa/Lagos +7.81667 4.91667 Africa/Lagos +7.95 4.98333 Africa/Lagos +5.61455 7.81191 Africa/Lagos +6.17818 6.52429 Africa/Lagos +5.7089 6.81026 Africa/Lagos +6.65471 8.79764 Africa/Lagos +7.59464 6.22476 Africa/Lagos +8.15 4.71667 Africa/Lagos +7.7899 5.7117 Africa/Lagos +6.66737 9.17157 Africa/Lagos +4.70844 6.79307 Africa/Lagos +9.46667 12.03333 Africa/Lagos +6.85783 7.39577 Africa/Lagos +6.01986 6.91478 Africa/Lagos +5.75555 7.10627 Africa/Lagos +6.15164 6.84458 Africa/Lagos +12.8791 10.4526 Africa/Lagos +8.52944 7.72417 Africa/Lagos +11.09596 11.33261 Africa/Lagos +10.26761 13.26436 Africa/Lagos +12.87405 6.48754 Africa/Lagos +12.67024 13.61174 Africa/Lagos +9.28333 5.05 Africa/Lagos +7.38333 4.26667 Africa/Lagos +9.61389 6.55694 Africa/Lagos +12.36532 13.8293 Africa/Lagos +11.78529 7.62175 Africa/Lagos +7.7411 8.5121 Africa/Lagos +6.49611 3.38778 Africa/Lagos +11.84692 13.15712 Africa/Lagos +12.1131 12.8274 Africa/Lagos +7.80236 6.743 Africa/Lagos +10.38697 8.57262 Africa/Lagos +9.05 6.56667 Africa/Lagos +7.46667 4.06667 Africa/Lagos +6.45306 3.39583 Africa/Lagos +8.86667 5.41667 Africa/Lagos +8.48333 8.51667 Africa/Lagos +5.70632 6.43741 Africa/Lagos +10.04469 11.21217 Africa/Lagos +13.15514 10.63423 Africa/Lagos +12.92475 13.56617 Africa/Lagos +8.89639 7.24306 Africa/Lagos +10.39989 5.46949 Africa/Lagos +11.78278 9.6125 Africa/Lagos +9.08333 3.85 Africa/Lagos +8.84861 7.87361 Africa/Lagos +12.58979 6.57791 Africa/Lagos +7.16667 9.28333 Africa/Lagos +12.98943 7.60063 Africa/Lagos +11.2471 10.561 Africa/Lagos +12.00012 8.51672 Africa/Lagos +11.84864 3.65761 Africa/Lagos +9.6225 3.94806 Africa/Lagos +9.6 8.38333 Africa/Lagos +9.58333 8.3 Africa/Lagos +10.52224 7.43828 Africa/Lagos +9.86667 7.95 Africa/Lagos +7.82873 6.0731 Africa/Lagos +9.91667 8.9 Africa/Lagos +9.28333 12.46667 Africa/Lagos +12.2175 4.37917 Africa/Lagos +9.13333 4.83333 Africa/Lagos +8.88333 11.36667 Africa/Lagos +7.63333 4.18333 Africa/Lagos +5.2004 7.98475 Africa/Lagos +6.37831 8.03524 Africa/Lagos +7.4632 5.4281 Africa/Lagos +8.26667 5.83333 Africa/Lagos +7.87377 5.07692 Africa/Lagos +6.91002 3.66557 Africa/Lagos +7.85 4.33333 Africa/Lagos +8.5 4.55 Africa/Lagos +7.83333 4.48333 Africa/Lagos +13.72918 5.29752 Africa/Lagos +7.61667 4.73333 Africa/Lagos +6.88653 3.0205 Africa/Lagos +8.01667 4.9 Africa/Lagos +5.17938 7.71082 Africa/Lagos +5.96669 8.70632 Africa/Lagos +7.91667 4.66667 Africa/Lagos +7.35 4.18333 Africa/Lagos +7.49133 5.23225 Africa/Lagos +6.59422 3.33748 Africa/Lagos +7.8139 5.0742 Africa/Lagos +6.81609 3.91588 Africa/Lagos +7.68333 4.81667 Africa/Lagos +6.9798 4.00329 Africa/Lagos +5.85377 6.86026 Africa/Lagos +7.66676 5.13205 Africa/Lagos +6.01669 7.02654 Africa/Lagos +7.4527 8.6098 Africa/Lagos +7.43333 3.28333 Africa/Lagos +8.83333 3.75 Africa/Lagos +8.75 4.13333 Africa/Lagos +7.50251 5.06258 Africa/Lagos +6.81437 3.19575 Africa/Lagos +7.1127 5.1159 Africa/Lagos +7.10651 6.73415 Africa/Lagos +8.18333 9.75 Africa/Lagos +10.48536 5.14502 Africa/Lagos +7.38778 3.89639 Africa/Lagos +12.4498 10.0444 Africa/Lagos +11.08243 13.69745 Africa/Lagos +11.91521 7.9346 Africa/Lagos +11.27639 9.88583 Africa/Lagos +13.35612 5.23664 Africa/Lagos +12.16278 6.66135 Africa/Lagos +12.14358 5.10809 Africa/Lagos +12.62791 9.39119 Africa/Lagos +10.16138 12.7399 Africa/Lagos +10.28969 11.16729 Africa/Lagos +6.7 11.26667 Africa/Lagos +12.897 11.9304 Africa/Lagos +7.46667 4.35 Africa/Lagos +11.86136 8.99714 Africa/Lagos +12.871 11.0482 Africa/Lagos +10.17506 11.16458 Africa/Lagos +8.43333 12.06667 Africa/Lagos +12.37066 14.21731 Africa/Lagos +11.52325 7.30813 Africa/Lagos +7.71361 3.91722 Africa/Lagos +6.4373 8.0862 Africa/Lagos +4.80293 8.25341 Africa/Lagos +6.58412 3.98336 Africa/Lagos +6.17851 7.01156 Africa/Lagos +6.9825 7.457 Africa/Lagos +6.4402 7.4943 Africa/Lagos +7.43614 5.45932 Africa/Lagos +5.1009 6.81411 Africa/Lagos +6.74206 6.139 Africa/Lagos +4.64122 7.92092 Africa/Lagos +7.9 4.31667 Africa/Lagos +6.65915 7.75961 Africa/Lagos +8.21667 5.51667 Africa/Lagos +7.65 4.91667 Africa/Lagos +6.62917 8.05925 Africa/Lagos +6.60086 3.48818 Africa/Lagos +10.85009 8.199 Africa/Lagos +11.7594 9.33921 Africa/Lagos +10.82306 10.77167 Africa/Lagos +8.38333 8.35 Africa/Lagos +12.03609 13.91815 Africa/Lagos +10.20864 11.38586 Africa/Lagos +13.03594 8.31631 Africa/Lagos +11.5541 11.406 Africa/Lagos +10.99375 10.41179 Africa/Lagos +11.1554 12.75551 Africa/Lagos +11.74697 11.96083 Africa/Lagos +4.9517 8.322 Africa/Lagos +5.35091 5.50758 Africa/Lagos +9.8 8.86667 Africa/Lagos +4.73407 6.86345 Africa/Lagos +4.4522 7.16808 Africa/Lagos +8.93333 4.78333 Africa/Lagos +10.61285 12.19458 Africa/Lagos +11.44588 9.4984 Africa/Lagos +12.45389 4.1975 Africa/Lagos +11.01537 6.78036 Africa/Lagos +9.86472 11.22528 Africa/Lagos +9.08333 6.01667 Africa/Lagos +6.33504 5.62749 Africa/Lagos +5.55718 7.63676 Africa/Lagos +7.85868 10.97187 Africa/Lagos +10.31344 9.84327 Africa/Lagos +8.6 6.41667 Africa/Lagos +11.52147 13.68826 Africa/Lagos +6.41667 2.88333 Africa/Lagos +10.42949 3.81495 Africa/Lagos +11.6765 10.1948 Africa/Lagos +6.21009 7.07411 Africa/Lagos +6.0742 7.4786 Africa/Lagos +7.06667 6.26667 Africa/Lagos +6.19824 6.73187 Africa/Lagos +12.74334 4.52687 Africa/Lagos +7.70927 5.04474 Africa/Lagos +7.33333 4.18333 Africa/Lagos +10.95967 8.39155 Africa/Lagos +5.78917 7.83829 Africa/Lagos +8.91667 8.38333 Africa/Lagos +7.25256 5.19312 Africa/Lagos +6.7081 7.3167 Africa/Lagos +7.56229 6.65497 Africa/Lagos +6.11 7.0724 Africa/Lagos +6.25183 6.19337 Africa/Lagos +5.89312 7.93735 Africa/Lagos +6.6 2.93333 Africa/Lagos +7.621 5.2215 Africa/Lagos +9.05785 7.49508 Africa/Lagos +7.15 3.35 Africa/Lagos +6.31625 8.11691 Africa/Lagos +5.10658 7.36667 Africa/Lagos +4.76254 6.752 Africa/Lagos +12.19732 -86.09706 America/Managua +13.48082 -86.58208 America/Managua +13.04328 -86.90645 America/Managua +13.73321 -84.77725 America/Managua +11.84854 -86.43839 America/Managua +11.90949 -86.20351 America/Managua +11.43716 -85.82632 America/Managua +12.93435 -85.22354 America/Managua +12.15965 -84.21952 America/Managua +14.03507 -83.38882 America/Managua +13.63208 -86.47516 America/Managua +11.68758 -84.45616 America/Managua +11.75696 -86.05286 America/Managua +12.26593 -86.56474 America/Managua +12.92559 -85.91747 America/Managua +11.97444 -86.09417 America/Managua +11.9184 -86.14467 America/Managua +12.13282 -86.2504 America/Managua +12.43787 -86.87804 America/Managua +12.34 -86.67528 America/Managua +12.10629 -85.36452 America/Managua +11.84962 -86.19903 America/Managua +13.09171 -86.00177 America/Managua +13.92222 -86.12346 America/Managua +11.92988 -85.95602 America/Managua +13.09185 -86.35384 America/Managua +12.6633 -87.16722 America/Managua +11.99008 -86.30954 America/Managua +11.85842 -86.23878 America/Managua +12.48199 -87.17336 America/Managua +12.62937 -87.13105 America/Managua +12.57758 -87.02705 America/Managua +12.38386 -85.51157 America/Managua +12.47224 -85.6586 America/Managua +12.01366 -83.76353 America/Managua +12.15889 -86.34417 America/Managua +52.5125 6.09444 Europe/Amsterdam +51.8175 4.63333 Europe/Amsterdam +52.13833 6.20139 Europe/Amsterdam +51.47167 4.65556 Europe/Amsterdam +52.0575 4.49306 Europe/Amsterdam +51.93 6.07083 Europe/Amsterdam +52.09 5.23333 Europe/Amsterdam +52.33 5.54167 Europe/Amsterdam +52.37487 4.53409 Europe/Amsterdam +51.81 5.24444 Europe/Amsterdam +52.45313 4.81356 Europe/Amsterdam +52.43854 4.82643 Europe/Amsterdam +52.87545 5.99691 Europe/Amsterdam +52.085 4.88333 Europe/Amsterdam +51.42897 4.30355 Europe/Amsterdam +51.92648 6.41705 Europe/Amsterdam +51.9725 6.71944 Europe/Amsterdam +53.14417 7.03472 Europe/Amsterdam +51.97417 5.34167 Europe/Amsterdam +51.80917 5.725 Europe/Amsterdam +52.35917 6.59306 Europe/Amsterdam +51.95583 5.97222 Europe/Amsterdam +51.81 4.89444 Europe/Amsterdam +52.3075 5.04167 Europe/Amsterdam +51.25167 5.70694 Europe/Amsterdam +52.14583 4.40278 Europe/Amsterdam +51.97 5.66667 Europe/Amsterdam +52.045 4.65139 Europe/Amsterdam +51.6825 5.07083 Europe/Amsterdam +51.38667 5.44444 Europe/Amsterdam +51.65333 5.2875 Europe/Amsterdam +52.17 6.14167 Europe/Amsterdam +52.1275 4.44861 Europe/Amsterdam +52.22167 4.48472 Europe/Amsterdam +52.07417 4.35972 Europe/Amsterdam +52.495 5.07083 Europe/Amsterdam +51.4425 3.57361 Europe/Amsterdam +53.0275 7.10833 Europe/Amsterdam +51.9125 4.34167 Europe/Amsterdam +51.9925 5.09167 Europe/Amsterdam +51.525 5.975 Europe/Amsterdam +51.37 6.16806 Europe/Amsterdam +52.46 4.65 Europe/Amsterdam +51.995 5.97361 Europe/Amsterdam +51.41833 5.40278 Europe/Amsterdam +51.61667 5.54861 Europe/Amsterdam +51.54833 3.66667 Europe/Amsterdam +52.02863 5.55891 Europe/Amsterdam +53.10667 6.87917 Europe/Amsterdam +51.35083 5.45972 Europe/Amsterdam +52.09083 5.12222 Europe/Amsterdam +52.6625 5.60139 Europe/Amsterdam +52.2375 4.82639 Europe/Amsterdam +51.66083 5.61944 Europe/Amsterdam +52.4075 6.78472 Europe/Amsterdam +51.44889 5.51978 Europe/Amsterdam +51.55551 5.0913 Europe/Amsterdam +51.88667 5.42917 Europe/Amsterdam +51.33583 3.82778 Europe/Amsterdam +51.34417 6.13611 Europe/Amsterdam +52.7875 6.12083 Europe/Amsterdam +51.58417 4.31944 Europe/Amsterdam +52.645 6.21111 Europe/Amsterdam +52.98947 6.9504 Europe/Amsterdam +51.845 4.32917 Europe/Amsterdam +51.385 5.71111 Europe/Amsterdam +52.17333 5.29167 Europe/Amsterdam +53.03297 5.6589 Europe/Amsterdam +51.82083 4.77639 Europe/Amsterdam +50.99833 5.86944 Europe/Amsterdam +51.5675 5.45972 Europe/Amsterdam +51.69917 5.30417 Europe/Amsterdam +52.00167 4.16528 Europe/Amsterdam +52.07667 4.29861 Europe/Amsterdam +51.6225 5.43194 Europe/Amsterdam +51.91917 4.38889 Europe/Amsterdam +52.10461 4.27557 Europe/Amsterdam +52.7875 4.79861 Europe/Amsterdam +51.53167 4.55833 Europe/Amsterdam +51.9225 4.47917 Europe/Amsterdam +51.53083 4.46528 Europe/Amsterdam +51.19417 5.9875 Europe/Amsterdam +52.03634 4.32501 Europe/Amsterdam +51.8725 4.60278 Europe/Amsterdam +51.8575 4.42222 Europe/Amsterdam +51.95917 5.56806 Europe/Amsterdam +52.38583 6.275 Europe/Amsterdam +52.25917 5.60694 Europe/Amsterdam +52.505 4.95972 Europe/Amsterdam +52.01954 4.42946 Europe/Amsterdam +51.83167 4.6875 Europe/Amsterdam +51.82417 4.4125 Europe/Amsterdam +51.765 5.51806 Europe/Amsterdam +51.645 4.85972 Europe/Amsterdam +52.31333 6.92917 Europe/Amsterdam +52.445 5.90139 Europe/Amsterdam +51.57917 5.18889 Europe/Amsterdam +52.18 4.46944 Europe/Amsterdam +50.9175 5.88611 Europe/Amsterdam +52.37917 5.78611 Europe/Amsterdam +51.47 5.55278 Europe/Amsterdam +52.26167 4.49306 Europe/Amsterdam +52.234 4.44474 Europe/Amsterdam +51.8425 5.85278 Europe/Amsterdam +52.22 5.48611 Europe/Amsterdam +52.02917 5.08056 Europe/Amsterdam +51.28583 5.74861 Europe/Amsterdam +52.29583 5.1625 Europe/Amsterdam +51.99417 4.20972 Europe/Amsterdam +52.20667 4.8625 Europe/Amsterdam +51.7575 4.16528 Europe/Amsterdam +51.5 3.61389 Europe/Amsterdam +52.69583 6.19444 Europe/Amsterdam +50.8875 5.75 Europe/Amsterdam +52.77167 5.10556 Europe/Amsterdam +50.84833 5.68889 Europe/Amsterdam +51.92333 4.25 Europe/Amsterdam +52.13917 5.04167 Europe/Amsterdam +52.26083 7.00417 Europe/Amsterdam +51.6275 5.075 Europe/Amsterdam +52.26 4.55694 Europe/Amsterdam +51.8327 5.7934 Europe/Amsterdam +51.98667 6.56667 Europe/Amsterdam +52.1325 5.43194 Europe/Amsterdam +52.50833 5.475 Europe/Amsterdam +52.15833 4.52917 Europe/Amsterdam +52.15833 4.49306 Europe/Amsterdam +53.20139 5.80859 Europe/Amsterdam +51.89333 5.09167 Europe/Amsterdam +53.1625 6.37639 Europe/Amsterdam +51.91667 4.60278 Europe/Amsterdam +53.23235 6.56804 Europe/Amsterdam +50.86583 6.0625 Europe/Amsterdam +52.20333 4.39861 Europe/Amsterdam +52.555 5.91111 Europe/Amsterdam +52.02 5.04306 Europe/Amsterdam +52.29917 5.24167 Europe/Amsterdam +52.02833 5.16806 Europe/Amsterdam +52.30833 5.58194 Europe/Amsterdam +52.6425 5.05972 Europe/Amsterdam +53.16167 6.76111 Europe/Amsterdam +52.7225 6.47639 Europe/Amsterdam +52.3025 4.68889 Europe/Amsterdam +51.60794 4.7915 Europe/Amsterdam +50.92387 5.92528 Europe/Amsterdam +52.22333 5.17639 Europe/Amsterdam +51.48583 5.1375 Europe/Amsterdam +52.29083 4.58333 Europe/Amsterdam +51.73417 5.13889 Europe/Amsterdam +52.26583 6.79306 Europe/Amsterdam +51.84417 4.63889 Europe/Amsterdam +51.48167 5.66111 Europe/Amsterdam +51.83333 4.13333 Europe/Amsterdam +52.60252 4.68815 Europe/Amsterdam +51.73362 5.52672 Europe/Amsterdam +50.88365 5.98154 Europe/Amsterdam +52.67144 4.84862 Europe/Amsterdam +52.95929 5.91854 Europe/Amsterdam +52.38723 6.04016 Europe/Amsterdam +52.34992 4.62301 Europe/Amsterdam +52.51108 4.67165 Europe/Amsterdam +53.17477 5.42244 Europe/Amsterdam +52.73416 4.77682 Europe/Amsterdam +53.17209 6.60931 Europe/Amsterdam +52.34167 5.62083 Europe/Amsterdam +52.57583 6.61944 Europe/Amsterdam +52.38084 4.63683 Europe/Amsterdam +52.15667 6.73889 Europe/Amsterdam +53.21917 6.56667 Europe/Amsterdam +51.77667 5.93611 Europe/Amsterdam +52.01667 4.70833 Europe/Amsterdam +51.83652 4.97243 Europe/Amsterdam +51.52083 5.06667 Europe/Amsterdam +51.50417 3.88889 Europe/Amsterdam +51.69833 5.97361 Europe/Amsterdam +51.87333 6.37639 Europe/Amsterdam +51.42167 5.55972 Europe/Amsterdam +51.88083 5.28889 Europe/Amsterdam +51.70167 4.85694 Europe/Amsterdam +52.29833 5.62222 Europe/Amsterdam +52.3475 5.98333 Europe/Amsterdam +52.21833 6.89583 Europe/Amsterdam +52.70333 5.29167 Europe/Amsterdam +52.77917 6.90694 Europe/Amsterdam +52.71083 5.74861 Europe/Amsterdam +51.91917 5.84167 Europe/Amsterdam +52.4475 5.84306 Europe/Amsterdam +51.44083 5.47778 Europe/Amsterdam +52.1 6.64861 Europe/Amsterdam +51.3575 5.31806 Europe/Amsterdam +52.03333 5.65833 Europe/Amsterdam +51.94667 6.01389 Europe/Amsterdam +51.88833 5.60556 Europe/Amsterdam +52.525 5.71806 Europe/Amsterdam +51.70667 4.80417 Europe/Amsterdam +52.05333 5.28056 Europe/Amsterdam +53.11254 6.0989 Europe/Amsterdam +51.81 4.67361 Europe/Amsterdam +51.62667 4.93889 Europe/Amsterdam +51.965 6.28889 Europe/Amsterdam +52.33964 4.96256 Europe/Amsterdam +52.255 6.16389 Europe/Amsterdam +52.95988 4.75933 Europe/Amsterdam +53.33 6.91806 Europe/Amsterdam +52.00667 4.35556 Europe/Amsterdam +51.90488 4.45315 Europe/Amsterdam +52.11 5.18056 Europe/Amsterdam +52.51167 6.25694 Europe/Amsterdam +51.955 5.22778 Europe/Amsterdam +51.73083 5.87917 Europe/Amsterdam +51.30417 5.58889 Europe/Amsterdam +52.54833 4.66944 Europe/Amsterdam +51.92917 4.57778 Europe/Amsterdam +52.27333 5.16111 Europe/Amsterdam +52.24304 5.37884 Europe/Amsterdam +50.94667 5.97083 Europe/Amsterdam +52.09 6.15556 Europe/Amsterdam +52.67417 4.80556 Europe/Amsterdam +52.43417 4.99583 Europe/Amsterdam +51.58656 4.77596 Europe/Amsterdam +51.59083 5.32917 Europe/Amsterdam +52.075 4.65556 Europe/Amsterdam +51.42333 3.73472 Europe/Amsterdam +52.30136 6.7482 Europe/Amsterdam +51.03167 5.80972 Europe/Amsterdam +52.92333 6.79306 Europe/Amsterdam +52.0825 4.75 Europe/Amsterdam +52.4025 4.62222 Europe/Amsterdam +51.36833 5.22083 Europe/Amsterdam +52.48333 4.65694 Europe/Amsterdam +51.86083 5.76667 Europe/Amsterdam +51.5075 5.39028 Europe/Amsterdam +51.99 4.49861 Europe/Amsterdam +51.31917 5.35833 Europe/Amsterdam +51.495 4.29167 Europe/Amsterdam +52.0775 4.54444 Europe/Amsterdam +50.94083 5.79722 Europe/Amsterdam +52.14 5.58472 Europe/Amsterdam +51.85667 4.53472 Europe/Amsterdam +52.21167 5.2875 Europe/Amsterdam +51.40417 5.74861 Europe/Amsterdam +52.99667 6.5625 Europe/Amsterdam +51.98 5.91111 Europe/Amsterdam +52.21 5.96944 Europe/Amsterdam +53.04417 6.70139 Europe/Amsterdam +52.37403 4.88969 Europe/Amsterdam +52.30083 4.86389 Europe/Amsterdam +52.155 5.3875 Europe/Amsterdam +52.12917 4.65546 Europe/Amsterdam +52.37025 5.21413 Europe/Amsterdam +52.35667 6.6625 Europe/Amsterdam +52.63167 4.74861 Europe/Amsterdam +51.86583 4.66111 Europe/Amsterdam +51.925 6.58056 Europe/Amsterdam +52.25917 4.75972 Europe/Amsterdam +52.3075 4.97222 Europe/Amsterdam +51.99313 4.47865 Europe/Amsterdam +52.04098 4.36981 Europe/Amsterdam +63.43049 10.39506 Europe/Oslo +69.6489 18.95508 Europe/Oslo +59.26754 10.40762 Europe/Oslo +64.01487 11.49537 Europe/Oslo +58.97005 5.73332 Europe/Oslo +59.20962 9.60897 Europe/Oslo +59.28391 11.10962 Europe/Oslo +58.85244 5.73521 Europe/Oslo +59.13118 10.21665 Europe/Oslo +59.14054 9.6561 Europe/Oslo +59.91273 10.74609 Europe/Oslo +59.43403 10.65771 Europe/Oslo +62.73752 7.15912 Europe/Oslo +66.31278 14.14278 Europe/Oslo +61.11514 10.46628 Europe/Oslo +59.05328 10.03517 Europe/Oslo +63.11045 7.72795 Europe/Oslo +58.14671 7.9956 Europe/Oslo +59.66858 9.65017 Europe/Oslo +59.41721 10.48343 Europe/Oslo +59.41378 5.268 Europe/Oslo +68.79833 16.54165 Europe/Oslo +60.7945 11.06798 Europe/Oslo +59.12478 11.38754 Europe/Oslo +60.79574 10.69155 Europe/Oslo +59.2181 10.9298 Europe/Oslo +59.74389 10.20449 Europe/Oslo +67.28 14.40501 Europe/Oslo +60.39299 5.32415 Europe/Oslo +58.46151 8.77253 Europe/Oslo +62.47225 6.15492 Europe/Oslo +60.4 5.18333 Europe/Oslo +60.30504 5.28236 Europe/Oslo +27.98333 83.76667 Asia/Kathmandu +28.13099 82.29726 Asia/Kathmandu +28.5 81.13333 Asia/Kathmandu +27.86731 83.5467 Asia/Kathmandu +26.65411 86.2087 Asia/Kathmandu +26.53333 86.75 Asia/Kathmandu +28.26689 83.96851 Asia/Kathmandu +27.67658 85.31417 Asia/Kathmandu +27.58138 85.5124 Asia/Kathmandu +26.85679 85.55811 Asia/Kathmandu +28.91667 80.33333 Asia/Kathmandu +26.72958 86.49515 Asia/Kathmandu +27.67988 85.27544 Asia/Kathmandu +27.37469 87.2039 Asia/Kathmandu +27.70169 85.3206 Asia/Kathmandu +26.71828 85.90646 Asia/Kathmandu +26.64711 85.80081 Asia/Kathmandu +26.66667 87.28333 Asia/Kathmandu +26.90943 87.92824 Asia/Kathmandu +27.42839 85.03219 Asia/Kathmandu +28.23333 81.33333 Asia/Kathmandu +26.76667 85.26667 Asia/Kathmandu +26.81248 87.28355 Asia/Kathmandu +26.98333 87.33333 Asia/Kathmandu +28.70792 80.59611 Asia/Kathmandu +29.84121 80.52874 Asia/Kathmandu +28.84434 81.71011 Asia/Kathmandu +29.29842 80.58059 Asia/Kathmandu +27.70055 83.44836 Asia/Kathmandu +27.01043 84.87735 Asia/Kathmandu +26.4831 87.28337 Asia/Kathmandu +27.68333 84.43333 Asia/Kathmandu +27.5 83.45 Asia/Kathmandu +26.54404 88.09436 Asia/Kathmandu +27.62979 85.52138 Asia/Kathmandu +28.27189 83.58976 Asia/Kathmandu +28.60194 81.63389 Asia/Kathmandu +29.26083 80.94 Asia/Kathmandu +28.05 81.61667 Asia/Kathmandu +-19.05952 -169.91867 Pacific/Niue +-41.28664 174.77557 Pacific/Auckland +-39.93333 175.05 Pacific/Auckland +-44.4 171.25 Pacific/Auckland +-38.68333 176.08333 Pacific/Auckland +-37.2 174.95 Pacific/Auckland +-41.13333 174.85 Pacific/Auckland +-40.91667 175.01667 Pacific/Auckland +-40.35636 175.61113 Pacific/Auckland +-36.8 174.75 Pacific/Auckland +-39.06667 174.08333 Pacific/Auckland +-41.27078 173.28404 Pacific/Auckland +-39.48333 176.91667 Pacific/Auckland +-36.99282 174.87986 Pacific/Auckland +-36.96807 174.79875 Pacific/Auckland +-41.21667 174.91667 Pacific/Auckland +-46.4 168.35 Pacific/Auckland +-39.6381 176.84918 Pacific/Auckland +-37.78333 175.28333 Pacific/Auckland +-45.87416 170.50361 Pacific/Auckland +-43.53333 172.63333 Pacific/Auckland +-36.86667 174.76667 Pacific/Auckland +-40.63333 175.275 Pacific/Auckland +-38.65333 178.00417 Pacific/Auckland +-40.95972 175.6575 Pacific/Auckland +-37.68611 176.16667 Pacific/Auckland +-37.06572 174.94393 Pacific/Auckland +-37.95855 176.98545 Pacific/Auckland +-43.89834 171.73011 Pacific/Auckland +-35.73167 174.32391 Pacific/Auckland +-37.87822 175.4402 Pacific/Auckland +-38.13874 176.24516 Pacific/Auckland +-41.51603 173.9528 Pacific/Auckland +-41.13827 175.0502 Pacific/Auckland +-39.53333 176.85 Pacific/Auckland +-36.91754 174.65773 Pacific/Auckland +22.56667 59.52889 Asia/Muscat +24.3643 56.74681 Asia/Muscat +23.31667 58.01667 Asia/Muscat +24.74333 56.46583 Asia/Muscat +17.01505 54.09237 Asia/Muscat +24.17222 56.88861 Asia/Muscat +22.93333 57.53333 Asia/Muscat +23.61387 58.5922 Asia/Muscat +26.17993 56.24774 Asia/Muscat +22.93333 57.76667 Asia/Muscat +23.22573 56.51572 Asia/Muscat +22.69057 58.53337 Asia/Muscat +23.40786 58.1283 Asia/Muscat +23.55563 58.3989 Asia/Muscat +23.70739 57.88908 Asia/Muscat +22.97339 57.29958 Asia/Muscat +22.45 58.8 Asia/Muscat +23.84944 57.43861 Asia/Muscat +23.67027 58.18911 Asia/Muscat +23.39083 57.42444 Asia/Muscat +24.53611 56.56556 Asia/Muscat +23.98864 57.09838 Asia/Muscat +24.25088 55.79312 Asia/Muscat +22.3756 57.52334 Asia/Muscat +23.59051 56.55008 Asia/Muscat +8.93333 -79.7 America/Panama +8.88333 -79.63333 America/Panama +9.08333 -79.38333 America/Panama +8.1 -80.98333 America/Panama +9.03333 -79.5 America/Panama +8.27775 -82.86206 America/Panama +8.36667 -82.43333 America/Panama +8.9936 -79.51973 America/Panama +9.08333 -79.28333 America/Panama +8.91667 -79.71667 America/Panama +9.08333 -79.53333 America/Panama +8.51667 -82.61667 America/Panama +8.88028 -79.78333 America/Panama +9.13333 -79.53333 America/Panama +8.42729 -82.43085 America/Panama +9.35917 -79.90139 America/Panama +7.96667 -80.43333 America/Panama +9.15 -79.61667 America/Panama +9.16667 -79.1 America/Panama +9.43333 -82.51667 America/Panama +9.36056 -79.84361 America/Panama +8.95 -79.65 America/Panama +9.11667 -79.55 America/Panama +8.25 -80.55 America/Panama +-5.9 -76.08333 America/Lima +-8.41554 -78.75201 America/Lima +-8.45917 -76.46333 America/Lima +-3.56694 -80.45153 America/Lima +-8.11599 -79.02998 America/Lima +-8.18846 -76.5125 America/Lima +-9.29616 -75.99831 America/Lima +-4.92694 -80.34472 America/Lima +-4.57722 -81.27194 America/Lima +-4.90389 -80.68528 America/Lima +-5.55694 -80.82222 America/Lima +-7.95889 -79.23917 America/Lima +-7.4289 -79.50416 America/Lima +-6.92315 -79.58384 America/Lima +-6.05861 -77.165 America/Lima +-4.83778 -80.64556 America/Lima +-8.37915 -74.55387 America/Lima +-5.19449 -80.63282 America/Lima +-6.83667 -79.93417 America/Lima +-6.71778 -79.76972 America/Lima +-5.08917 -81.11444 America/Lima +-7.73291 -79.3015 America/Lima +-7.40056 -79.57139 America/Lima +-6.03416 -76.97168 America/Lima +-6.87719 -79.86998 America/Lima +-8.17111 -79.00917 America/Lima +-4.87778 -80.70528 America/Lima +-5.40232 -80.74224 America/Lima +-8.08965 -78.9602 America/Lima +-5.61111 -78.435 America/Lima +-6.70111 -79.90611 America/Lima +-7.17697 -76.72774 America/Lima +-5.70908 -78.80748 America/Lima +-3.74912 -73.25383 America/Lima +-9.52779 -77.52778 America/Lima +-9.93062 -76.24223 America/Lima +-7.8 -78.06667 America/Lima +-7.25 -79.48333 America/Lima +-6.63889 -79.78889 America/Lima +-9.02306 -78.61556 America/Lima +-5.0925 -80.1625 America/Lima +-6.64056 -79.38917 America/Lima +-7.79139 -79.22167 America/Lima +-9.08528 -78.57833 America/Lima +-6.77137 -79.84088 America/Lima +-7.22884 -79.42599 America/Lima +-6.23169 -77.86903 America/Lima +-5.26667 -80.68333 America/Lima +-7.16378 -78.50027 America/Lima +-7.05614 -76.5911 America/Lima +-5.75611 -78.44111 America/Lima +-4.26054 -80.88807 America/Lima +-3.50306 -80.27306 America/Lima +-16.25 -69.08333 America/Lima +-10.24111 -76.64556 America/Lima +-11.41972 -75.69083 America/Lima +-12.73333 -69.18333 America/Lima +-18.01465 -70.25362 America/Lima +-12.13952 -77.00615 America/Lima +-14.26944 -71.22611 America/Lima +-11.25222 -74.63861 America/Lima +-13.07556 -76.38528 America/Lima +-12.86667 -72.71667 America/Lima +-12.11667 -77.05 America/Lima +-13.66667 -76.15 America/Lima +-15.8422 -70.0199 America/Lima +-12.59331 -69.18913 America/Lima +-13.71029 -76.20538 America/Lima +-10.66667 -77.83333 America/Lima +-13.07541 -76.31719 America/Lima +-14.83098 -74.93895 America/Lima +-17.19832 -70.93567 America/Lima +-17.02306 -72.01472 America/Lima +-15.21194 -75.11028 America/Lima +-12.65806 -76.63083 America/Lima +-12.04318 -77.02824 America/Lima +-11.51893 -75.89935 America/Lima +-11.15895 -75.99304 America/Lima +-15.5 -70.13333 America/Lima +-11.77584 -75.49656 America/Lima +-13.05927 -76.35269 America/Lima +-17.63944 -71.3375 America/Lima +-16.08333 -69.66667 America/Lima +-14.06777 -75.72861 America/Lima +-11.07 -77.59944 America/Lima +-10.06806 -78.15222 America/Lima +-11.495 -77.20778 America/Lima +-12.93333 -74.25 America/Lima +-12.06513 -75.20486 America/Lima +-12.78261 -74.97266 America/Lima +-11.09639 -77.61389 America/Lima +-11.10667 -77.605 America/Lima +-13.52264 -71.96734 America/Lima +-11.94306 -76.70944 America/Lima +-13.40985 -76.13235 America/Lima +-10.40696 -76.46168 America/Lima +-11.57139 -77.26722 America/Lima +-10.66748 -76.25668 America/Lima +-16.62375 -72.71055 America/Lima +-12.05658 -77.11814 America/Lima +-10.75 -77.76667 America/Lima +-14.88639 -70.58889 America/Lima +-13.15878 -74.22321 America/Lima +-16.39889 -71.535 America/Lima +-13.65556 -73.38722 America/Lima +-13.63389 -72.88139 America/Lima +-14.63126 -69.44638 America/Lima +-17.63333 -149.6 Pacific/Tahiti +-17.53733 -149.5665 Pacific/Tahiti +-17.55 -149.6 Pacific/Tahiti +-3.55342 143.62678 Pacific/Port_Moresby +-9.44314 147.17972 Pacific/Port_Moresby +-8.75931 148.24095 Pacific/Port_Moresby +-5.8581 144.22744 Pacific/Port_Moresby +-6.17608 143.65134 Pacific/Port_Moresby +-5.22465 145.79656 Pacific/Port_Moresby +-6.72208 146.98469 Pacific/Port_Moresby +-4.35202 152.26327 Pacific/Port_Moresby +-5.55021 150.14285 Pacific/Port_Moresby +-6.08336 145.38735 Pacific/Port_Moresby +-9.07628 143.20919 Pacific/Port_Moresby +-7.20718 146.63572 Pacific/Port_Moresby +-6.21319 155.53674 Pacific/Port_Moresby +6.91028 122.07389 Asia/Manila +7.68333 124.66667 Asia/Manila +13.5848 124.2374 Asia/Manila +17.57472 120.38694 Asia/Manila +10.90154 123.0705 Asia/Manila +14.2277 121.3292 Asia/Manila +8.0731 125.9558 Asia/Manila +7.90639 125.09417 Asia/Manila +15.97611 120.57111 Asia/Manila +10.57396 123.3933 Asia/Manila +6.33444 124.95278 Asia/Manila +17.61306 121.72694 Asia/Manila +8.04583 126.06361 Asia/Manila +10.3773 123.6386 Asia/Manila +13.4585 123.6805 Asia/Manila +14.2897 120.7168 Asia/Manila +14.5612 121.2195 Asia/Manila +15.11854 120.60773 Asia/Manila +14.5678 121.1394 Asia/Manila +14.0259 121.5929 Asia/Manila +15.48017 120.59794 Asia/Manila +14.6753 120.9389 Asia/Manila +9.5162 123.158 Asia/Manila +8.0618 123.7477 Asia/Manila +9.07833 126.19861 Asia/Manila +14.4968 121.2846 Asia/Manila +14.08627 121.14975 Asia/Manila +11.10944 125.01556 Asia/Manila +10.5746 122.8954 Asia/Manila +14.0925 121.02194 Asia/Manila +10.7375 122.9666 Asia/Manila +10.24472 123.84944 Asia/Manila +15.5883 120.9192 Asia/Manila +8.45611 125.78417 Asia/Manila +7.44778 125.80778 Asia/Manila +14.5243 121.0792 Asia/Manila +16.9355 120.4442 Asia/Manila +8.53889 124.75694 Asia/Manila +9.65556 123.85219 Asia/Manila +13.16667 123.71667 Asia/Manila +6.6925 124.67639 Asia/Manila +17.47378 121.46799 Asia/Manila +13.35861 123.73361 Asia/Manila +13.87992 120.92311 Asia/Manila +9.789 125.495 Asia/Manila +6.37527 124.74521 Asia/Manila +14.87999 120.23433 Asia/Manila +10.0533 122.8423 Asia/Manila +12.97389 123.99333 Asia/Manila +16.51918 121.18124 Asia/Manila +17.6528 121.691 Asia/Manila +4.66115 119.39647 Asia/Manila +9.75194 122.40417 Asia/Manila +14.21567 120.97137 Asia/Manila +9.3584 123.285 Asia/Manila +14.9438 120.6229 Asia/Manila +6.22 124.69361 Asia/Manila +13.9624 121.5265 Asia/Manila +15.2921 120.65498 Asia/Manila +14.1079 121.14136 Asia/Manila +15.16222 120.5675 Asia/Manila +16.68808 121.5487 Asia/Manila +14.31222 121.11139 Asia/Manila +16.9518 120.4445 Asia/Manila +6.55361 125.47083 Asia/Manila +15.7654 119.9092 Asia/Manila +14.9127 120.56659 Asia/Manila +14.2814 121.4161 Asia/Manila +9.3337 122.8637 Asia/Manila +16.0009 120.4023 Asia/Manila +15.0955 120.767 Asia/Manila +14.9996 120.7808 Asia/Manila +14.3595 121.0473 Asia/Manila +13.7975 121.03417 Asia/Manila +14.0683 121.3256 Asia/Manila +18.1725 120.5953 Asia/Manila +15.0143 120.0803 Asia/Manila +15.44397 120.59923 Asia/Manila +15.1423 120.97568 Asia/Manila +16.88206 121.58694 Asia/Manila +14.6982 121.1236 Asia/Manila +7.5 126 Asia/Manila +14.97418 120.15733 Asia/Manila +15.0401 120.7883 Asia/Manila +15.363 120.9639 Asia/Manila +14.6 121.0333 Asia/Manila +14.81389 121.04528 Asia/Manila +13.35 123.55 Asia/Manila +12.35275 121.06761 Asia/Manila +15.0809 120.941 Asia/Manila +15.35566 120.84001 Asia/Manila +13.3476 122.5195 Asia/Manila +8.53556 125.95 Asia/Manila +16.61591 120.31663 Asia/Manila +15.0286 120.6898 Asia/Manila +10.1624 123.7076 Asia/Manila +15.3062 120.856 Asia/Manila +15.24226 120.83924 Asia/Manila +14.94659 120.08673 Asia/Manila +14.5402 121.3602 Asia/Manila +14.76778 120.54306 Asia/Manila +7.07444 125.70833 Asia/Manila +10.94472 123.42417 Asia/Manila +12.8346 120.769 Asia/Manila +17.11894 121.62014 Asia/Manila +11.58528 122.75111 Asia/Manila +10.3215 119.3451 Asia/Manila +12.57513 122.27081 Asia/Manila +15.7118 121.1061 Asia/Manila +6.95194 121.96361 Asia/Manila +15.6653 120.6406 Asia/Manila +16.78416 121.53504 Asia/Manila +14.6 120.9833 Asia/Manila +14.6488 121.0509 Asia/Manila +15.5512 120.8147 Asia/Manila +7.73028 125.09889 Asia/Manila +10.5203 122.8017 Asia/Manila +14.27324 121.07643 Asia/Manila +14.90167 120.84917 Asia/Manila +9.73917 118.73528 Asia/Manila +14.5833 120.9667 Asia/Manila +15.0711 120.5423 Asia/Manila +6.22167 125.06398 Asia/Manila +13.2923 123.4855 Asia/Manila +14.88722 120.85722 Asia/Manila +15.04741 120.51891 Asia/Manila +10.2708 123.5839 Asia/Manila +13.0357 121.48842 Asia/Manila +14.4854 121.3062 Asia/Manila +14.66 120.56528 Asia/Manila +14.2325 121.3648 Asia/Manila +15.35116 121.00393 Asia/Manila +14.11667 120.96667 Asia/Manila +11.10778 122.64194 Asia/Manila +7.37035 124.26973 Asia/Manila +10.8849 123.3627 Asia/Manila +15.32016 120.83574 Asia/Manila +14.83111 120.78917 Asia/Manila +14.96806 120.95472 Asia/Manila +15.6689 120.5806 Asia/Manila +14.4008 121.4685 Asia/Manila +14.865 120.95722 Asia/Manila +15.1719 120.65457 Asia/Manila +11.25111 125.00639 Asia/Manila +7.30806 125.68417 Asia/Manila +11.1575 124.99083 Asia/Manila +15.5415 121.0848 Asia/Manila +13.9712 121.6879 Asia/Manila +7.14167 124.38056 Asia/Manila +7.8257 123.437 Asia/Manila +14.3647 121.4829 Asia/Manila +10.45 122.81667 Asia/Manila +8.1481 123.8405 Asia/Manila +8.4859 123.8048 Asia/Manila +11.00639 124.6075 Asia/Manila +14.62056 120.58167 Asia/Manila +14.8006 120.5371 Asia/Manila +14.82917 120.28278 Asia/Manila +14.7098 120.9362 Asia/Manila +14.42922 120.87989 Asia/Manila +14.9109 121.0493 Asia/Manila +7.5866 125.8237 Asia/Manila +14.0722 120.6332 Asia/Manila +9.26877 118.4043 Asia/Manila +14.31812 120.76609 Asia/Manila +14.1364 121.4165 Asia/Manila +13.61917 123.18139 Asia/Manila +10.20898 123.758 Asia/Manila +7.60778 125.96639 Asia/Manila +13.4075 123.3724 Asia/Manila +7.8275 123.4782 Asia/Manila +10.60516 123.0417 Asia/Manila +15.71611 120.90306 Asia/Manila +14.67889 120.26611 Asia/Manila +14.5115 121.2393 Asia/Manila +14.7314 121.1417 Asia/Manila +7.81528 126.05444 Asia/Manila +8.0844 123.491 Asia/Manila +10.24498 123.7964 Asia/Manila +7.19083 124.53028 Asia/Manila +14.73694 120.96083 Asia/Manila +15.0646 120.7198 Asia/Manila +14.1093 123.0109 Asia/Manila +14.12861 120.90583 Asia/Manila +14.191 121.7309 Asia/Manila +6.95508 126.21655 Asia/Manila +15.5363 119.9502 Asia/Manila +12.37169 123.62494 Asia/Manila +14.896 120.7092 Asia/Manila +14.4361 120.4857 Asia/Manila +14.75778 120.94833 Asia/Manila +8.83333 125.11667 Asia/Manila +8.0034 124.28395 Asia/Manila +7.76333 125.00528 Asia/Manila +14.2733 120.7377 Asia/Manila +8.16667 124.21667 Asia/Manila +10.63111 122.97889 Asia/Manila +12.52044 121.43851 Asia/Manila +8.36972 124.86444 Asia/Manila +14.6042 120.9822 Asia/Manila +15.09621 120.56445 Asia/Manila +16.07 120.4025 Asia/Manila +10.32361 123.92222 Asia/Manila +14.5832 121.0409 Asia/Manila +16.8632 120.7829 Asia/Manila +7.215 126.53972 Asia/Manila +10.95803 123.123 Asia/Manila +16.0438 120.4861 Asia/Manila +13.2233 120.596 Asia/Manila +14.2349 121.15902 Asia/Manila +14.04472 121.15861 Asia/Manila +6.543 121.8753 Asia/Manila +6.27917 125.28167 Asia/Manila +14.8443 120.81039 Asia/Manila +6.415 125.61167 Asia/Manila +13.3188 123.7385 Asia/Manila +8.1575 125.12778 Asia/Manila +5.96917 125.28944 Asia/Manila +14.7069 121.1306 Asia/Manila +13.94521 121.43065 Asia/Manila +14.55027 121.03269 Asia/Manila +8.1183 123.4455 Asia/Manila +6.76667 125.18333 Asia/Manila +13.6604 123.1869 Asia/Manila +6.86472 124.44167 Asia/Manila +15.2151 120.6596 Asia/Manila +15.2216 120.5736 Asia/Manila +10.13361 124.84472 Asia/Manila +10.4896 122.9907 Asia/Manila +6.89814 126.00961 Asia/Manila +14.2973 121.4598 Asia/Manila +13.93139 121.61722 Asia/Manila +14.1148 121.5547 Asia/Manila +14.9405 120.6011 Asia/Manila +14.1798 121.2234 Asia/Manila +13.884 122.2604 Asia/Manila +14.78869 120.99889 Asia/Manila +13.9411 121.1631 Asia/Manila +16.02182 120.23194 Asia/Manila +14.56194 120.59833 Asia/Manila +10.3991 123.9992 Asia/Manila +14.1313 121.4362 Asia/Manila +13.2997 123.4386 Asia/Manila +8.94417 125.50194 Asia/Manila +13.13722 123.73444 Asia/Manila +15.5865 121.1834 Asia/Manila +16.455 120.5875 Asia/Manila +10.31028 123.94944 Asia/Manila +15.44125 120.72863 Asia/Manila +12.5698 125.0141 Asia/Manila +18.1978 120.5957 Asia/Manila +7.9745 123.7458 Asia/Manila +6.6525 124.52111 Asia/Manila +10.3239 123.0215 Asia/Manila +10.4242 122.9212 Asia/Manila +14.1532 122.8303 Asia/Manila +6.50306 124.84694 Asia/Manila +7.00833 125.08944 Asia/Manila +14.44426 120.90164 Asia/Manila +11.70611 122.36444 Asia/Manila +9.9902 122.8142 Asia/Manila +7.10667 124.82917 Asia/Manila +14.2906 122.6917 Asia/Manila +6.05222 121.00222 Asia/Manila +8.65417 124.75556 Asia/Manila +14.353 121.3225 Asia/Manila +15.3275 120.9192 Asia/Manila +16.36389 120.67694 Asia/Manila +6.62944 124.605 Asia/Manila +10.2048 122.9888 Asia/Manila +6.70407 121.97117 Asia/Manila +12.7026 124.0362 Asia/Manila +13.4324 123.4115 Asia/Manila +7.78444 122.58611 Asia/Manila +14.19528 120.87694 Asia/Manila +14.42972 120.93667 Asia/Manila +10.69694 122.56444 Asia/Manila +8.25 124.4 Asia/Manila +17.14854 121.88924 Asia/Manila +15.3276 119.978 Asia/Manila +10.2706 122.8507 Asia/Manila +10.09889 122.87056 Asia/Manila +14.8314 120.5081 Asia/Manila +14.83413 120.73271 Asia/Manila +14.8361 120.97844 Asia/Manila +13.921 122.1002 Asia/Manila +16.06667 120.68333 Asia/Manila +15.6605 120.7683 Asia/Manila +10.1214 123.2742 Asia/Manila +14.83333 120.88333 Asia/Manila +13.6978 123.4892 Asia/Manila +5.82417 125.20333 Asia/Manila +15.6065 120.5978 Asia/Manila +14.38694 120.88167 Asia/Manila +15.35076 121.04773 Asia/Manila +6.11278 125.17167 Asia/Manila +15.6025 121.0515 Asia/Manila +15.3072 120.9464 Asia/Manila +10.84028 123.49917 Asia/Manila +10.87754 122.9677 Asia/Manila +9.307 123.3074 Asia/Manila +7.68 125.005 Asia/Manila +16.00292 120.21154 Asia/Manila +7.84083 125.04444 Asia/Manila +8.5883 123.3409 Asia/Manila +14.87314 120.46416 Asia/Manila +6.74972 125.35722 Asia/Manila +16.7262 121.3589 Asia/Manila +15.03601 120.69935 Asia/Manila +7.07306 125.61278 Asia/Manila +14.32944 120.93667 Asia/Manila +8.6561 123.4227 Asia/Manila +10.52083 124.02722 Asia/Manila +9.55421 123.75648 Asia/Manila +14.1122 122.9553 Asia/Manila +13.902 121.0521 Asia/Manila +7.22361 124.24639 Asia/Manila +10.25194 123.94944 Asia/Manila +10.3766 123.9573 Asia/Manila +15.32546 120.65723 Asia/Manila +13.92309 121.46099 Asia/Manila +10.455 124.0106 Asia/Manila +7.67306 126.08889 Asia/Manila +10.31672 123.89071 Asia/Manila +14.48369 120.89878 Asia/Manila +11.77528 124.88611 Asia/Manila +12.4989 124.6377 Asia/Manila +13.5926 122.3215 Asia/Manila +14.93039 120.20143 Asia/Manila +14.3132 121.0576 Asia/Manila +10.59306 124.01778 Asia/Manila +11.29917 124.67556 Asia/Manila +14.486 121.2289 Asia/Manila +10.1061 123.6402 Asia/Manila +15.33117 120.5898 Asia/Manila +10.38697 123.2227 Asia/Manila +13.93111 121.42333 Asia/Manila +15.0956 120.8267 Asia/Manila +15.6866 120.4128 Asia/Manila +14.91639 120.76583 Asia/Manila +14.6228 121.0897 Asia/Manila +12.0668 124.5962 Asia/Manila +14.1447 121.3152 Asia/Manila +13.9575 122.288 Asia/Manila +13.83224 120.6322 Asia/Manila +16.0111 120.36 Asia/Manila +13.4117 121.1803 Asia/Manila +14.21167 121.16528 Asia/Manila +13.93244 120.81327 Asia/Manila +13.7068 123.2087 Asia/Manila +14.5786 121.1222 Asia/Manila +8.48222 124.64722 Asia/Manila +10.9465 123.288 Asia/Manila +15.2488 120.8548 Asia/Manila +7.40722 125.73306 Asia/Manila +15.48586 120.96648 Asia/Manila +17.42782 121.76955 Asia/Manila +9.12361 125.53444 Asia/Manila +8.94917 125.54361 Asia/Manila +14.95806 120.91778 Asia/Manila +8.18778 124.17694 Asia/Manila +15.72892 120.57224 Asia/Manila +8.16722 125.99083 Asia/Manila +6.72028 124.80194 Asia/Manila +15.08262 120.66288 Asia/Manila +12.67139 123.875 Asia/Manila +14.79278 120.87889 Asia/Manila +13.4322 123.517 Asia/Manila +8.50833 124.75944 Asia/Manila +8.97694 125.40889 Asia/Manila +7.20417 124.43972 Asia/Manila +15.2896 120.0245 Asia/Manila +11.60806 125.43194 Asia/Manila +5.02917 119.77306 Asia/Manila +15.6321 121.1448 Asia/Manila +11.0517 124.0055 Asia/Manila +14.79833 120.92611 Asia/Manila +8.21528 126.31639 Asia/Manila +10.7719 122.9817 Asia/Manila +16.03232 120.26904 Asia/Manila +14.4646 121.1929 Asia/Manila +10.1948 122.8581 Asia/Manila +13.86445 121.48792 Asia/Manila +8.75611 125.7675 Asia/Manila +16.4812 121.1497 Asia/Manila +10.6785 124.8006 Asia/Manila +9.3649 122.804 Asia/Manila +15.8127 120.4557 Asia/Manila +14.1831 121.2848 Asia/Manila +16.53083 120.33306 Asia/Manila +13.7917 121.0085 Asia/Manila +13.3528 123.3677 Asia/Manila +13.7567 121.0584 Asia/Manila +18.0554 120.56489 Asia/Manila +14.5234 121.2651 Asia/Manila +11.1683 123.7223 Asia/Manila +6.78611 125.21333 Asia/Manila +6.42389 124.77833 Asia/Manila +13.85 121.2 Asia/Manila +16.3865 121.1066 Asia/Manila +14.95472 120.89694 Asia/Manila +13.93714 120.73224 Asia/Manila +14.67611 120.53611 Asia/Manila +10.5039 123.7156 Asia/Manila +14.81667 120.86667 Asia/Manila +9.59111 123.12278 Asia/Manila +8.60722 125.91444 Asia/Manila +16.41639 120.59306 Asia/Manila +10.53333 122.83333 Asia/Manila +16.50588 121.19014 Asia/Manila +14.45903 120.92903 Asia/Manila +10.66667 122.95 Asia/Manila +15.08333 120.51667 Asia/Manila +13.4549 123.3653 Asia/Manila +14.0027 121.92078 Asia/Manila +9.5506 122.5164 Asia/Manila +16.394 120.3545 Asia/Manila +15.1505 120.7697 Asia/Manila +18.3566 121.6406 Asia/Manila +14.95333 120.77 Asia/Manila +14.58639 121.17528 Asia/Manila +14.5266 121.1536 Asia/Manila +15.15 120.58333 Asia/Manila +14.9285 121.03 Asia/Manila +14.17056 120.92361 Asia/Manila +16.77936 121.69734 Asia/Manila +15.5 120.843 Asia/Manila +14.06391 121.24649 Asia/Manila +6.10179 125.29048 Asia/Manila +16.08333 120.1 Asia/Manila +10.747 125.0107 Asia/Manila +14.72222 120.53833 Asia/Manila +14.6627 121.0328 Asia/Manila +7.16083 124.475 Asia/Manila +14.58691 121.0614 Asia/Manila +11.74479 122.10027 Asia/Manila +24.38953 67.99234 Asia/Karachi +33.85782 73.76043 Asia/Karachi +27.59102 68.61786 Asia/Karachi +27.52948 68.7617 Asia/Karachi +31.34111 69.44806 Asia/Karachi +34.06028 72.46778 Asia/Karachi +28.81239 70.52405 Asia/Karachi +32.34631 74.89987 Asia/Karachi +29.12122 71.74459 Asia/Karachi +32.44583 74.11594 Asia/Karachi +31.55 73.83333 Asia/Karachi +27.44808 67.79776 Asia/Karachi +30.03333 72.35 Asia/Karachi +34.18799 71.76286 Asia/Karachi +25.80722 66.62194 Asia/Karachi +28.17943 68.04454 Asia/Karachi +25.36157 69.73624 Asia/Karachi +28.16524 69.7289 Asia/Karachi +26.00228 63.04399 Asia/Karachi +34.07041 72.62358 Asia/Karachi +30.97433 72.48269 Asia/Karachi +28.24034 68.77588 Asia/Karachi +24.74745 67.92353 Asia/Karachi +26.94423 68.11602 Asia/Karachi +30.70484 70.65051 Asia/Karachi +32.22168 70.37928 Asia/Karachi +34.30056 71.65361 Asia/Karachi +25.12301 68.53577 Asia/Karachi +25.42718 68.53619 Asia/Karachi +25.46263 68.71923 Asia/Karachi +25.76374 68.66098 Asia/Karachi +31.03333 73.13333 Asia/Karachi +24.88333 68.81667 Asia/Karachi +30.52708 72.24011 Asia/Karachi +32.92973 72.41583 Asia/Karachi +35.47908 72.24385 Asia/Karachi +34.11988 72.46987 Asia/Karachi +32.71667 74.45 Asia/Karachi +27.70516 68.85738 Asia/Karachi +31.86388 73.51122 Asia/Karachi +32.46162 74.18234 Asia/Karachi +27.03333 67.85 Asia/Karachi +26.03031 68.80898 Asia/Karachi +31.82611 72.53984 Asia/Karachi +29.5448 67.8764 Asia/Karachi +32.49268 74.53134 Asia/Karachi +29.87967 71.29313 Asia/Karachi +31.90991 70.87741 Asia/Karachi +27.95706 68.63789 Asia/Karachi +31.71306 73.97833 Asia/Karachi +31.46333 74.1 Asia/Karachi +32.26232 75.16682 Asia/Karachi +29.57646 71.02116 Asia/Karachi +26.15497 68.65093 Asia/Karachi +31.5709 73.48531 Asia/Karachi +25.92406 68.61999 Asia/Karachi +27.84771 67.9055 Asia/Karachi +34.2139 71.55523 Asia/Karachi +26.42794 67.863 Asia/Karachi +32.08361 72.67111 Asia/Karachi +30.59489 71.96977 Asia/Karachi +32.82591 70.78136 Asia/Karachi +32.90122 73.75591 Asia/Karachi +31.71667 73.38333 Asia/Karachi +26.04656 68.9481 Asia/Karachi +32.47455 74.35209 Asia/Karachi +26.13839 68.27361 Asia/Karachi +31.97446 72.33087 Asia/Karachi +30.66667 73.1 Asia/Karachi +28.30623 70.13065 Asia/Karachi +27.69223 68.89506 Asia/Karachi +30.88333 73.6 Asia/Karachi +33.6007 73.0679 Asia/Karachi +27.80296 68.28708 Asia/Karachi +27.28792 68.50505 Asia/Karachi +29.10351 70.32504 Asia/Karachi +31.22083 74.25194 Asia/Karachi +31.25444 74.21778 Asia/Karachi +27.18333 67.95 Asia/Karachi +31.75583 72.91972 Asia/Karachi +30.199 67.00971 Asia/Karachi +27.58676 68.00103 Asia/Karachi +30.29238 71.67117 Asia/Karachi +30.58028 66.99611 Asia/Karachi +30.76667 72.43333 Asia/Karachi +33.24024 72.26609 Asia/Karachi +31.89781 73.27302 Asia/Karachi +32.58789 73.04564 Asia/Karachi +32.42973 73.57745 Asia/Karachi +34.008 71.57849 Asia/Karachi +31.01667 73.85 Asia/Karachi +32.26413 74.66342 Asia/Karachi +25.26311 63.47103 Asia/Karachi +27.85685 69.11156 Asia/Karachi +30.34104 73.38664 Asia/Karachi +32.10384 70.97235 Asia/Karachi +26.77475 68.30197 Asia/Karachi +34.01056 71.79889 Asia/Karachi +30.80806 73.44583 Asia/Karachi +29.55423 66.02148 Asia/Karachi +26.24833 68.40955 Asia/Karachi +26.84238 68.12298 Asia/Karachi +31.96284 73.97225 Asia/Karachi +27.66477 68.36217 Asia/Karachi +27.38091 67.91678 Asia/Karachi +32.1 74.88333 Asia/Karachi +31.9132 74.51756 Asia/Karachi +24.85869 69.40238 Asia/Karachi +31.4475 73.69722 Asia/Karachi +30.07537 71.19213 Asia/Karachi +34.37002 73.47082 Asia/Karachi +30.89222 73.49889 Asia/Karachi +33.90727 73.39295 Asia/Karachi +31.8025 74.26167 Asia/Karachi +30.19556 71.47528 Asia/Karachi +26.66459 68.00156 Asia/Karachi +24.73183 69.79811 Asia/Karachi +32.24861 72.11083 Asia/Karachi +28.02271 69.54886 Asia/Karachi +25.5251 69.0159 Asia/Karachi +34.7795 72.36265 Asia/Karachi +30.163 73.56854 Asia/Karachi +32.5741 71.52639 Asia/Karachi +30.44004 72.35431 Asia/Karachi +28.1085 68.0254 Asia/Karachi +27.18067 67.82288 Asia/Karachi +25.04312 68.65568 Asia/Karachi +25.59609 68.44666 Asia/Karachi +29.79936 66.84505 Asia/Karachi +34.20195 72.05254 Asia/Karachi +34.33333 73.2 Asia/Karachi +31.89306 72.38167 Asia/Karachi +32.58339 73.48432 Asia/Karachi +31.58417 73.68778 Asia/Karachi +30.83333 72.8 Asia/Karachi +24.9424 67.2066 Asia/Karachi +32.55362 73.21234 Asia/Karachi +29.80028 72.17583 Asia/Karachi +29.86371 67.32978 Asia/Karachi +30.37053 68.59798 Asia/Karachi +29.54051 71.63357 Asia/Karachi +30.96128 70.93904 Asia/Karachi +27.55508 68.21414 Asia/Karachi +31.82414 72.79971 Asia/Karachi +32.70235 73.96 Asia/Karachi +32.60795 70.91142 Asia/Karachi +31.54972 74.34361 Asia/Karachi +32.15656 74.11701 Asia/Karachi +33.38325 71.33858 Asia/Karachi +25.17847 69.56913 Asia/Karachi +32.52848 73.97368 Asia/Karachi +32.45872 71.47754 Asia/Karachi +31.92861 70.45917 Asia/Karachi +28.5522 70.46837 Asia/Karachi +25.366 68.31216 Asia/Karachi +31.1725 74.09972 Asia/Karachi +32.18954 73.02798 Asia/Karachi +30.19438 66.99299 Asia/Karachi +32.5883 74.49321 Asia/Karachi +33.51667 73.91667 Asia/Karachi +32.33298 74.54798 Asia/Karachi +27.34272 68.70834 Asia/Karachi +30.4692 70.96714 Asia/Karachi +33.58196 71.44929 Asia/Karachi +32.29667 72.3525 Asia/Karachi +31.50056 73.26667 Asia/Karachi +32.64793 73.01058 Asia/Karachi +32.81493 73.86359 Asia/Karachi +28.58333 65.41667 Asia/Karachi +28.64534 70.6567 Asia/Karachi +27.84358 69.41373 Asia/Karachi +29.9173 71.16184 Asia/Karachi +31.83167 73.62306 Asia/Karachi +34.06 72.88944 Asia/Karachi +27.09359 67.73366 Asia/Karachi +29.58111 72.23639 Asia/Karachi +28.06526 69.70076 Asia/Karachi +31.11556 74.44667 Asia/Karachi +28.43333 69.58333 Asia/Karachi +31.22741 70.94923 Asia/Karachi +24.9056 67.0822 Asia/Karachi +30.76629 74.12311 Asia/Karachi +27.06011 68.20909 Asia/Karachi +28.24396 69.18235 Asia/Karachi +33.74734 73.51107 Asia/Karachi +31.97444 74.22444 Asia/Karachi +30.43333 73.05 Asia/Karachi +32.84389 71.36694 Asia/Karachi +30.73333 72.65 Asia/Karachi +32.15639 71.25944 Asia/Karachi +32.78333 72.7 Asia/Karachi +31.97718 73.60259 Asia/Karachi +29.02252 66.5916 Asia/Karachi +32.965 71.55697 Asia/Karachi +33.5913 73.38676 Asia/Karachi +29.62382 71.91673 Asia/Karachi +31.36917 74.36528 Asia/Karachi +30.40677 71.8667 Asia/Karachi +26.69206 67.6133 Asia/Karachi +25.04992 61.7468 Asia/Karachi +31.56781 73.18347 Asia/Karachi +25.95507 68.88821 Asia/Karachi +32.93313 73.72637 Asia/Karachi +32.36139 72.62278 Asia/Karachi +31.27154 72.32842 Asia/Karachi +32.2898 72.2813 Asia/Karachi +29.51654 70.85032 Asia/Karachi +31.33333 73.43333 Asia/Karachi +33.42985 72.01928 Asia/Karachi +29.64414 70.59544 Asia/Karachi +29.50687 71.21917 Asia/Karachi +32.63744 74.21829 Asia/Karachi +31.80552 72.27711 Asia/Karachi +28.281 68.43876 Asia/Karachi +33.72148 73.04329 Asia/Karachi +25.39242 68.37366 Asia/Karachi +30.74179 73.82358 Asia/Karachi +27.21088 68.41598 Asia/Karachi +33.90914 72.49212 Asia/Karachi +34.0536 73.16571 Asia/Karachi +30.45016 73.69888 Asia/Karachi +29.71222 72.55528 Asia/Karachi +30.43333 72.7 Asia/Karachi +29.61333 73.13889 Asia/Karachi +32.27917 71.55389 Asia/Karachi +33.99997 72.93409 Asia/Karachi +33.53108 71.05934 Asia/Karachi +25.81308 68.42273 Asia/Karachi +32.06786 73.68545 Asia/Karachi +32.64132 74.56904 Asia/Karachi +25.12163 62.32541 Asia/Karachi +32.57284 74.07897 Asia/Karachi +32.16167 74.18831 Asia/Karachi +33.25579 73.30255 Asia/Karachi +31.14874 72.68656 Asia/Karachi +28.00604 69.31608 Asia/Karachi +28.13906 69.08305 Asia/Karachi +24.74241 67.58565 Asia/Karachi +30.83388 71.90529 Asia/Karachi +27.35145 68.52051 Asia/Karachi +29.1925 72.85361 Asia/Karachi +32.18333 75.06667 Asia/Karachi +31.17959 71.20946 Asia/Karachi +31.88722 72.4144 Asia/Karachi +29.46631 73.03403 Asia/Karachi +31.41667 73.08333 Asia/Karachi +32.04219 74.25944 Asia/Karachi +29.7995 71.71958 Asia/Karachi +29.74931 73.24324 Asia/Karachi +31.83587 71.43625 Asia/Karachi +35.20583 71.87556 Asia/Karachi +30.67091 73.65292 Asia/Karachi +32.63976 73.72202 Asia/Karachi +31.21667 72.98333 Asia/Karachi +25.15579 69.11129 Asia/Karachi +25.5 69.56667 Asia/Karachi +29.57991 71.75213 Asia/Karachi +31.83269 70.9024 Asia/Karachi +30.05614 70.63477 Asia/Karachi +29.03069 69.15099 Asia/Karachi +26.45834 68.31915 Asia/Karachi +32.87498 71.57012 Asia/Karachi +32.32426 74.34974 Asia/Karachi +31.79123 71.10394 Asia/Karachi +29.55767 70.37615 Asia/Karachi +26.73286 67.77631 Asia/Karachi +29.47527 67.65135 Asia/Karachi +30.96397 73.98029 Asia/Karachi +31.75 73.8 Asia/Karachi +25.51667 69.76667 Asia/Karachi +32.72006 72.98486 Asia/Karachi +29.8 72.86667 Asia/Karachi +31.72 72.97889 Asia/Karachi +30.53333 72.7 Asia/Karachi +32.34692 74.70612 Asia/Karachi +34.14345 71.73173 Asia/Karachi +30.9236 66.45116 Asia/Karachi +32.93338 72.85853 Asia/Karachi +30.75 73.03333 Asia/Karachi +30.16667 72.65 Asia/Karachi +32.42888 74.3633 Asia/Karachi +25.80437 68.49265 Asia/Karachi +32.97568 74.07926 Asia/Karachi +32.48318 72.9097 Asia/Karachi +31.56918 72.64899 Asia/Karachi +26.55831 67.72139 Asia/Karachi +32.27204 72.90425 Asia/Karachi +31.62525 71.06574 Asia/Karachi +31.2 73.95 Asia/Karachi +26.2271 66.3111 Asia/Karachi +34.61667 71.97139 Asia/Karachi +30.58318 73.829 Asia/Karachi +32.98541 70.6027 Asia/Karachi +29.4 71.68333 Asia/Karachi +29.99866 73.2536 Asia/Karachi +24.65599 68.83841 Asia/Karachi +31.99283 74.66834 Asia/Karachi +33.77311 72.3741 Asia/Karachi +30.29399 73.07354 Asia/Karachi +34.00583 71.93 Asia/Karachi +29.38464 70.91157 Asia/Karachi +34.00361 72.12611 Asia/Karachi +29.14309 71.25976 Asia/Karachi +34.14685 73.21449 Asia/Karachi +30.55083 73.39083 Asia/Karachi +33.99829 71.99834 Asia/Karachi +30.67539 71.74828 Asia/Karachi +27.34167 68.03194 Asia/Karachi +25.13111 68.86759 Asia/Karachi +27.2127 68.46883 Asia/Karachi +34.06186 71.99166 Asia/Karachi +32.55492 73.2122 Asia/Karachi +52.0488 20.44599 Europe/Warsaw +52.26896 20.98644 Europe/Warsaw +52.30376 21.16018 Europe/Warsaw +50.72314 23.25196 Europe/Warsaw +52.9855 22.24319 Europe/Warsaw +52.29271 21.10539 Europe/Warsaw +52.59278 21.4584 Europe/Warsaw +52.34006 21.24207 Europe/Warsaw +52.2401 20.98869 Europe/Warsaw +52.17941 20.94612 Europe/Warsaw +49.98738 20.06473 Europe/Warsaw +52.25451 21.22407 Europe/Warsaw +52.19656 21.17752 Europe/Warsaw +52.22977 21.01178 Europe/Warsaw +52.19517 20.88419 Europe/Warsaw +51.53131 20.00855 Europe/Warsaw +50.44767 23.41616 Europe/Warsaw +50.01381 20.98698 Europe/Warsaw +50.57304 21.67937 Europe/Warsaw +52.29185 21.04845 Europe/Warsaw +53.56259 20.98747 Europe/Warsaw +51.21898 22.69621 Europe/Warsaw +54.11175 22.93087 Europe/Warsaw +52.25221 21.26902 Europe/Warsaw +50.56307 21.16593 Europe/Warsaw +51.0374 21.07126 Europe/Warsaw +50.58286 22.05334 Europe/Warsaw +52.22904 21.01644 Europe/Warsaw +52.40677 22.25307 Europe/Warsaw +53.40715 23.50228 Europe/Warsaw +52.22944 20.23838 Europe/Warsaw +51.95485 20.15837 Europe/Warsaw +51.11311 20.87162 Europe/Warsaw +52.42719 22.86231 Europe/Warsaw +52.16772 22.29006 Europe/Warsaw +49.55573 22.2056 Europe/Warsaw +50.68265 21.74898 Europe/Warsaw +50.04132 21.99901 Europe/Warsaw +50.05229 21.60891 Europe/Warsaw +52.26059 21.16355 Europe/Warsaw +51.76437 20.25493 Europe/Warsaw +51.78333 22.61667 Europe/Warsaw +51.40253 21.14714 Europe/Warsaw +52.7025 21.08276 Europe/Warsaw +51.41655 21.96939 Europe/Warsaw +50.05912 22.49408 Europe/Warsaw +49.78498 22.76728 Europe/Warsaw +53.01907 20.88029 Europe/Warsaw +52.17072 20.81214 Europe/Warsaw +52.62348 20.37552 Europe/Warsaw +53.62744 21.81253 Europe/Warsaw +51.47604 21.44995 Europe/Warsaw +52.18435 20.83952 Europe/Warsaw +52.0814 21.02397 Europe/Warsaw +52.10577 21.26129 Europe/Warsaw +52.80245 21.89507 Europe/Warsaw +50.92936 21.38525 Europe/Warsaw +53.08621 21.57566 Europe/Warsaw +51.37569 20.27827 Europe/Warsaw +53.77995 20.49416 Europe/Warsaw +54.03374 22.50704 Europe/Warsaw +52.22096 20.98526 Europe/Warsaw +49.47783 20.03228 Europe/Warsaw +49.62177 20.69705 Europe/Warsaw +52.43022 20.71652 Europe/Warsaw +50.51987 22.13968 Europe/Warsaw +53.86437 21.30507 Europe/Warsaw +52.1934 21.03487 Europe/Warsaw +53.11278 20.3841 Europe/Warsaw +52.17935 21.57251 Europe/Warsaw +52.11879 20.67155 Europe/Warsaw +50.28709 21.4239 Europe/Warsaw +51.9864 22.78248 Europe/Warsaw +52.32065 21.10474 Europe/Warsaw +51.929 22.37956 Europe/Warsaw +51.25 22.56667 Europe/Warsaw +51.46026 22.60952 Europe/Warsaw +53.17806 22.05935 Europe/Warsaw +52.33413 20.88602 Europe/Warsaw +54.12588 20.57954 Europe/Warsaw +52.40149 20.92664 Europe/Warsaw +51.30121 22.88135 Europe/Warsaw +52.9911 22.88422 Europe/Warsaw +50.06871 22.22912 Europe/Warsaw +49.68866 21.77058 Europe/Warsaw +50.98464 23.1742 Europe/Warsaw +50.9236 22.22706 Europe/Warsaw +51.58294 21.54779 Europe/Warsaw +52.0938 21.11761 Europe/Warsaw +51.19166 20.40607 Europe/Warsaw +52.33953 21.19589 Europe/Warsaw +50.87033 20.62752 Europe/Warsaw +54.07676 21.37527 Europe/Warsaw +52.13012 21.08148 Europe/Warsaw +52.13707 21.23589 Europe/Warsaw +50.63945 20.30454 Europe/Warsaw +49.74506 21.47252 Europe/Warsaw +50.01623 22.67776 Europe/Warsaw +50.80502 23.89251 Europe/Warsaw +52.74328 23.58122 Europe/Warsaw +52.10387 20.6337 Europe/Warsaw +53.64728 22.45537 Europe/Warsaw +49.65563 21.16035 Europe/Warsaw +54.03811 21.76441 Europe/Warsaw +54.08134 21.49551 Europe/Warsaw +51.89747 21.61466 Europe/Warsaw +53.82824 22.36469 Europe/Warsaw +53.23958 20.17004 Europe/Warsaw +51.55912 21.84829 Europe/Warsaw +50.05146 21.41141 Europe/Warsaw +52.88141 20.61996 Europe/Warsaw +51.14312 23.4716 Europe/Warsaw +50.47078 20.71884 Europe/Warsaw +49.96911 20.60606 Europe/Warsaw +49.96905 20.43028 Europe/Warsaw +50.54114 22.72204 Europe/Warsaw +52.76512 23.18647 Europe/Warsaw +52.29242 20.93531 Europe/Warsaw +53.13333 23.16433 Europe/Warsaw +52.32127 20.97204 Europe/Warsaw +52.03238 23.11652 Europe/Warsaw +52.2546 20.90844 Europe/Warsaw +54.25354 20.80819 Europe/Warsaw +53.84321 22.97979 Europe/Warsaw +49.68529 19.19243 Europe/Warsaw +50.04523 18.70062 Europe/Warsaw +53.36346 17.04082 Europe/Warsaw +51.12637 15.91979 Europe/Warsaw +51.93548 15.50643 Europe/Warsaw +51.14942 15.00835 Europe/Warsaw +51.85561 19.40623 Europe/Warsaw +51.59915 18.93974 Europe/Warsaw +50.48766 19.41679 Europe/Warsaw +51.64205 15.13727 Europe/Warsaw +49.29899 19.94885 Europe/Warsaw +51.61759 15.31486 Europe/Warsaw +50.32492 18.78576 Europe/Warsaw +50.58969 16.81239 Europe/Warsaw +52.32512 17.56519 Europe/Warsaw +51.1 17.03333 Europe/Warsaw +50.00377 18.47205 Europe/Warsaw +52.64817 19.0678 Europe/Warsaw +51.22097 18.56964 Europe/Warsaw +54.60568 18.23559 Europe/Warsaw +53.27787 16.47122 Europe/Warsaw +50.77141 16.28432 Europe/Warsaw +52.80842 17.19961 Europe/Warsaw +49.88335 19.49292 Europe/Warsaw +49.72153 18.80198 Europe/Warsaw +54.58048 16.86194 Europe/Warsaw +50.13717 18.96641 Europe/Warsaw +52.01548 18.50055 Europe/Warsaw +50.15931 19.46966 Europe/Warsaw +53.04063 16.45628 Europe/Warsaw +53.01375 18.59814 Europe/Warsaw +54.09242 18.77787 Europe/Warsaw +50.44548 18.86147 Europe/Warsaw +53.70791 16.69937 Europe/Warsaw +53.42894 14.55302 Europe/Warsaw +52.61201 16.57794 Europe/Warsaw +53.91053 14.24712 Europe/Warsaw +50.29636 18.91726 Europe/Warsaw +52.24751 15.53355 Europe/Warsaw +53.40953 18.44742 Europe/Warsaw +50.85976 16.3282 Europe/Warsaw +53.77464 15.77671 Europe/Warsaw +50.84378 16.48859 Europe/Warsaw +52.41289 17.08503 Europe/Warsaw +52.08362 15.62513 Europe/Warsaw +50.5107 18.30056 Europe/Warsaw +50.96264 16.35006 Europe/Warsaw +53.96396 18.52638 Europe/Warsaw +53.33672 15.0499 Europe/Warsaw +52.22843 17.27617 Europe/Warsaw +52.08868 17.01508 Europe/Warsaw +50.28682 19.10385 Europe/Warsaw +54.4418 18.56003 Europe/Warsaw +53.08371 18.22572 Europe/Warsaw +54.46405 17.02872 Europe/Warsaw +52.35088 14.56065 Europe/Warsaw +49.97524 19.82869 Europe/Warsaw +52.8568 19.66913 Europe/Warsaw +51.59584 18.73023 Europe/Warsaw +50.32738 19.02901 Europe/Warsaw +53.06603 19.40941 Europe/Warsaw +50.05857 18.41703 Europe/Warsaw +50.09713 18.54179 Europe/Warsaw +54.57092 18.38802 Europe/Warsaw +50.2584 18.85632 Europe/Warsaw +54.60528 18.34717 Europe/Warsaw +51.60946 16.85852 Europe/Warsaw +50.40026 18.90232 Europe/Warsaw +51.06713 19.44477 Europe/Warsaw +50.0502 18.47626 Europe/Warsaw +50.09195 18.21928 Europe/Warsaw +50.4 18.63333 Europe/Warsaw +49.98037 18.95382 Europe/Warsaw +54.26217 18.63625 Europe/Warsaw +50.32124 17.57461 Europe/Warsaw +52.40692 16.92993 Europe/Warsaw +51.50391 16.07261 Europe/Warsaw +53.55214 14.57182 Europe/Warsaw +52.54682 19.70638 Europe/Warsaw +51.89636 17.78549 Europe/Warsaw +51.40547 19.70321 Europe/Warsaw +53.15145 16.73782 Europe/Warsaw +50.38017 18.92653 Europe/Warsaw +51.66446 19.35473 Europe/Warsaw +51.96336 19.29139 Europe/Warsaw +50.03437 19.21037 Europe/Warsaw +51.65501 17.80686 Europe/Warsaw +53.69671 19.96486 Europe/Warsaw +50.15595 18.77924 Europe/Warsaw +50.67212 17.92532 Europe/Warsaw +50.2813 19.56503 Europe/Warsaw +51.21338 17.38986 Europe/Warsaw +50.9466 17.2926 Europe/Warsaw +52.64739 16.81406 Europe/Warsaw +50.4575 17.31308 Europe/Warsaw +50.47379 17.33437 Europe/Warsaw +52.3195 16.12844 Europe/Warsaw +53.67437 15.1163 Europe/Warsaw +51.80333 15.71702 Europe/Warsaw +50.58008 16.50164 Europe/Warsaw +51.07592 17.72284 Europe/Warsaw +53.14214 17.60181 Europe/Warsaw +50.5752 19.32461 Europe/Warsaw +50.20745 19.16668 Europe/Warsaw +49.83383 19.9383 Europe/Warsaw +50.17103 18.9041 Europe/Warsaw +52.44461 15.57801 Europe/Warsaw +54.03591 19.0266 Europe/Warsaw +52.34705 16.89267 Europe/Warsaw +50.66897 18.6844 Europe/Warsaw +51.40089 16.20149 Europe/Warsaw +51.12014 15.28768 Europe/Warsaw +52.10714 19.94525 Europe/Warsaw +51.75 19.46667 Europe/Warsaw +50.10396 19.31568 Europe/Warsaw +51.84034 16.57494 Europe/Warsaw +51.21006 16.1619 Europe/Warsaw +50.14264 19.13149 Europe/Warsaw +52.05959 19.19972 Europe/Warsaw +54.53921 17.75012 Europe/Warsaw +50.14952 18.84215 Europe/Warsaw +51.59056 19.13278 Europe/Warsaw +53.72495 18.93114 Europe/Warsaw +52.23064 19.36409 Europe/Warsaw +51.69868 17.43738 Europe/Warsaw +50.47515 17.96539 Europe/Warsaw +50.06143 19.93658 Europe/Warsaw +54.19438 16.17222 Europe/Warsaw +52.58713 14.64953 Europe/Warsaw +54.12226 17.98119 Europe/Warsaw +52.08829 16.64866 Europe/Warsaw +51.74776 19.32564 Europe/Warsaw +52.22338 18.25121 Europe/Warsaw +54.17565 15.58342 Europe/Warsaw +52.20024 18.63865 Europe/Warsaw +50.21971 18.65067 Europe/Warsaw +50.97281 18.21816 Europe/Warsaw +50.43488 16.66145 Europe/Warsaw +49.88214 19.22333 Europe/Warsaw +50.34984 18.22606 Europe/Warsaw +50.25842 19.02754 Europe/Warsaw +54.33424 18.19735 Europe/Warsaw +50.78314 16.03037 Europe/Warsaw +51.76109 18.09102 Europe/Warsaw +50.89973 15.72899 Europe/Warsaw +51.02102 17.32095 Europe/Warsaw +50.20528 19.27498 Europe/Warsaw +51.05132 16.19347 Europe/Warsaw +49.95542 18.57479 Europe/Warsaw +51.97266 17.50256 Europe/Warsaw +52.79886 18.26388 Europe/Warsaw +53.59601 19.56849 Europe/Warsaw +51.94956 14.72837 Europe/Warsaw +53.25243 14.48831 Europe/Warsaw +53.9165 15.20027 Europe/Warsaw +53.48411 18.75366 Europe/Warsaw +52.42938 19.46194 Europe/Warsaw +51.88247 17.01226 Europe/Warsaw +52.73679 15.22878 Europe/Warsaw +53.56392 14.82854 Europe/Warsaw +52.53481 17.58259 Europe/Warsaw +50.31505 17.38355 Europe/Warsaw +51.96463 19.71565 Europe/Warsaw +51.66361 16.0845 Europe/Warsaw +50.29761 18.67658 Europe/Warsaw +54.51889 18.53188 Europe/Warsaw +54.35205 18.64637 Europe/Warsaw +53.14821 18.17036 Europe/Warsaw +54.1522 19.40884 Europe/Warsaw +50.7282 16.65141 Europe/Warsaw +50.31818 19.2374 Europe/Warsaw +50.79646 19.12409 Europe/Warsaw +50.15007 18.67762 Europe/Warsaw +50.31542 19.07824 Europe/Warsaw +49.91342 19.00479 Europe/Warsaw +49.75133 18.63213 Europe/Warsaw +50.13546 19.40203 Europe/Warsaw +53.16905 15.42054 Europe/Warsaw +50.30582 18.9742 Europe/Warsaw +53.69554 17.55701 Europe/Warsaw +52.99505 16.9198 Europe/Warsaw +53.18463 18.60466 Europe/Warsaw +53.34855 18.4251 Europe/Warsaw +54.17057 17.49187 Europe/Warsaw +50.34802 18.93282 Europe/Warsaw +53.1235 18.00762 Europe/Warsaw +50.86079 17.4674 Europe/Warsaw +53.25967 19.39653 Europe/Warsaw +54.37971 19.81959 Europe/Warsaw +51.26418 15.5697 Europe/Warsaw +50.75514 16.20494 Europe/Warsaw +50.90747 14.95634 Europe/Warsaw +50.09 19.09291 Europe/Warsaw +49.82245 19.04686 Europe/Warsaw +50.69075 16.623 Europe/Warsaw +54.00696 15.98751 Europe/Warsaw +51.36883 19.35671 Europe/Warsaw +50.32607 19.12565 Europe/Warsaw +49.85497 19.33834 Europe/Warsaw +51.81965 19.30384 Europe/Warsaw +52.15051 21.05041 Europe/Warsaw +52.25443 21.03472 Europe/Warsaw +52.24424 21.08545 Europe/Warsaw +51.02134 17.31649 Europe/Warsaw +46.77914 -56.1773 America/Miquelon +-25.06597 -130.10147 Pacific/Pitcairn +18.42745 -67.15407 America/Puerto_Rico +18.47244 -66.71573 America/Puerto_Rico +18.4505 -66.53851 America/Puerto_Rico +18.39856 -66.15572 America/Puerto_Rico +18.23412 -66.0485 America/Puerto_Rico +18.40411 -66.20878 America/Puerto_Rico +18.38078 -65.95739 America/Puerto_Rico +18.44134 -66.11822 America/Puerto_Rico +18.11191 -66.166 America/Puerto_Rico +18.32579 -65.65238 America/Puerto_Rico +17.98413 -66.11378 America/Puerto_Rico +18.35745 -66.111 America/Puerto_Rico +18.14968 -65.82738 America/Puerto_Rico +18.44995 -66.18156 America/Puerto_Rico +18.42745 -66.49212 America/Puerto_Rico +18.20107 -67.13962 America/Puerto_Rico +18.01108 -66.61406 America/Puerto_Rico +18.46633 -66.10572 America/Puerto_Rico +18.35467 -66.00739 America/Puerto_Rico +18.44439 -66.38767 America/Puerto_Rico +18.03496 -66.8499 America/Puerto_Rico +18.16379 -66.72369 America/Puerto_Rico +31.287 34.25952 Asia/Gaza +31.44861 34.3925 Asia/Gaza +31.34018 34.30627 Asia/Gaza +31.5272 34.48347 Asia/Gaza +31.5 34.46667 Asia/Gaza +31.41783 34.35033 Asia/Gaza +31.5464 34.49514 Asia/Gaza +31.5353 34.53579 Asia/Gaza +31.34337 34.32337 Asia/Gaza +31.43944 34.40306 Asia/Gaza +31.31913 34.34005 Asia/Gaza +31.4459 35.09443 Asia/Hebron +32.31037 35.02863 Asia/Hebron +32.32091 35.36989 Asia/Hebron +31.57855 35.14017 Asia/Hebron +31.89964 35.20422 Asia/Hebron +32.18966 34.97063 Asia/Hebron +32.41035 35.28087 Asia/Hebron +32.22111 35.25444 Asia/Hebron +32.45943 35.30086 Asia/Hebron +31.55874 34.97436 Asia/Hebron +31.58029 35.10178 Asia/Hebron +31.50777 35.02929 Asia/Hebron +31.70487 35.20376 Asia/Hebron +31.71545 35.18788 Asia/Hebron +31.51591 35.16416 Asia/Hebron +32.21207 35.28561 Asia/Hebron +31.40967 34.97329 Asia/Hebron +31.39671 35.06611 Asia/Hebron +31.84945 35.2342 Asia/Hebron +31.86667 35.45 Asia/Hebron +32.48563 35.23011 Asia/Hebron +31.52935 35.0938 Asia/Hebron +31.91001 35.21645 Asia/Hebron +31.77078 35.26916 Asia/Hebron +31.37389 34.34085 Asia/Gaza +31.43954 34.38053 Asia/Gaza +31.78336 35.23388 Asia/Hebron +38.95525 -8.98966 Europe/Lisbon +38.87094 -9.06823 Europe/Lisbon +39.09109 -9.2586 Europe/Lisbon +39.60199 -8.40924 Europe/Lisbon +38.80097 -9.37826 Europe/Lisbon +38.44451 -9.10149 Europe/Lisbon +38.5244 -8.8882 Europe/Lisbon +38.82183 -9.09079 Europe/Lisbon +38.70123 -9.3276 Europe/Lisbon +39.23333 -8.68333 Europe/Lisbon +38.84629 -9.08748 Europe/Lisbon +38.79202 -9.10801 Europe/Lisbon +38.77457 -9.3276 Europe/Lisbon +38.80235 -9.19216 Europe/Lisbon +38.75657 -9.25451 Europe/Lisbon +37.06946 -8.10064 Europe/Lisbon +38.86101 -9.06453 Europe/Lisbon +37.13856 -8.53775 Europe/Lisbon +39.29379 -7.43122 Europe/Lisbon +38.76771 -9.19935 Europe/Lisbon +39.91674 -8.62847 Europe/Lisbon +38.63106 -8.91376 Europe/Lisbon +38.66667 -9.15 Europe/Lisbon +39.3558 -9.38112 Europe/Lisbon +38.69282 -9.35412 Europe/Lisbon +38.56902 -8.90126 Europe/Lisbon +38.69569 -9.29143 Europe/Lisbon +37.0286 -7.8411 Europe/Lisbon +38.79269 -9.1838 Europe/Lisbon +38.70675 -8.97388 Europe/Lisbon +38.70279 -9.41606 Europe/Lisbon +39.46203 -8.7118 Europe/Lisbon +38.65078 -8.99038 Europe/Lisbon +39.74769 -8.93228 Europe/Lisbon +38.83091 -9.16845 Europe/Lisbon +37.13772 -8.01968 Europe/Lisbon +38.71667 -9.13333 Europe/Lisbon +38.71446 -9.2422 Europe/Lisbon +39.74362 -8.80705 Europe/Lisbon +37.06831 -7.7937 Europe/Lisbon +37.10202 -8.67422 Europe/Lisbon +32.63333 -16.9 Atlantic/Madeira +37.01937 -7.93223 Europe/Lisbon +38.56667 -7.9 Europe/Lisbon +38.70571 -9.39773 Europe/Lisbon +39.46667 -8.46667 Europe/Lisbon +38.64502 -9.14843 Europe/Lisbon +38.62059 -9.19149 Europe/Lisbon +39.82219 -7.49087 Europe/Lisbon +38.6979 -9.42146 Europe/Lisbon +38.72706 -9.24671 Europe/Lisbon +38.69105 -9.32215 Europe/Lisbon +38.66667 -9.2 Europe/Lisbon +38.80358 -9.12808 Europe/Lisbon +32.63333 -16.96667 Atlantic/Madeira +39.40326 -9.13839 Europe/Lisbon +38.76698 -9.29793 Europe/Lisbon +38.77721 -9.26078 Europe/Lisbon +38.01506 -7.86323 Europe/Lisbon +38.66314 -9.0724 Europe/Lisbon +38.61667 -9.1 Europe/Lisbon +38.62961 -9.11557 Europe/Lisbon +38.75382 -9.23083 Europe/Lisbon +38.67902 -9.1569 Europe/Lisbon +38.70245 -9.22936 Europe/Lisbon +38.73366 -9.40928 Europe/Lisbon +37.08819 -8.2503 Europe/Lisbon +40.66101 -7.90971 Europe/Lisbon +41.30062 -7.74413 Europe/Lisbon +41.10751 -8.59632 Europe/Lisbon +41.13363 -8.61742 Europe/Lisbon +41.35481 -8.7434 Europe/Lisbon +41.69323 -8.83287 Europe/Lisbon +41.19501 -8.51027 Europe/Lisbon +40.55364 -7.22594 Europe/Lisbon +41.1864 -8.65172 Europe/Lisbon +41.15508 -8.50412 Europe/Lisbon +41.20042 -8.60251 Europe/Lisbon +40.90229 -8.48969 Europe/Lisbon +41.18259 -8.55811 Europe/Lisbon +41.38344 -8.76364 Europe/Lisbon +41.14961 -8.61099 Europe/Lisbon +41.76719 -8.58393 Europe/Lisbon +41.41103 -8.74897 Europe/Lisbon +40.85862 -8.62513 Europe/Lisbon +41.12466 -8.58463 Europe/Lisbon +42.07892 -8.48076 Europe/Madrid +41.18207 -8.68908 Europe/Lisbon +41.23574 -8.6199 Europe/Lisbon +41.21457 -8.61348 Europe/Lisbon +41.191 -8.70027 Europe/Lisbon +40.5999 -8.66732 Europe/Lisbon +41.44444 -8.29619 Europe/Lisbon +40.53733 -7.26575 Europe/Lisbon +41.14454 -8.53223 Europe/Lisbon +40.92535 -8.54277 Europe/Lisbon +41.17087 -8.5257 Europe/Lisbon +41.45423 -8.168 Europe/Lisbon +41.5361 -8.78201 Europe/Lisbon +41.53333 -8.78333 Europe/Lisbon +41.22176 -8.55462 Europe/Lisbon +41.1053 -7.32097 Europe/Lisbon +40.28601 -7.50396 Europe/Lisbon +40.20564 -8.41955 Europe/Lisbon +41.12402 -8.65104 Europe/Lisbon +41.80582 -6.75719 Europe/Lisbon +41.55032 -8.42005 Europe/Lisbon +41.33979 -8.5518 Europe/Lisbon +41.53876 -8.61505 Europe/Lisbon +41.19392 -8.54133 Europe/Lisbon +40.64427 -8.64554 Europe/Lisbon +41.21061 -8.5866 Europe/Lisbon +37.73333 -25.66667 Atlantic/Azores +7.50043 134.62355 Pacific/Palau +-25.78056 -56.44861 America/Asuncion +-25.09306 -57.52361 America/Asuncion +-25.3676 -57.59274 America/Asuncion +-25.33968 -57.50879 America/Asuncion +-26.66944 -57.14583 America/Asuncion +-25.42126 -57.54725 America/Asuncion +-25.53333 -54.61667 America/Asuncion +-26.86879 -58.29346 America/Asuncion +-22.54722 -55.73333 America/Asuncion +-25.3949 -57.53574 America/Asuncion +-25.16611 -57.48562 America/Asuncion +-25.34682 -57.60647 America/Asuncion +-25.38333 -57.33333 America/Asuncion +-25.48333 -57.35 America/Asuncion +-25.32308 -57.54021 America/Asuncion +-27.33056 -55.86667 America/Asuncion +-25.44444 -56.44028 America/Asuncion +-23.40556 -57.44028 America/Asuncion +-25.16667 -57.55 America/Asuncion +-25.50972 -54.61111 America/Asuncion +-25.3552 -57.44545 America/Asuncion +-26.19583 -56.36806 America/Asuncion +-25.45 -56.01667 America/Asuncion +-25.38611 -57.14028 America/Asuncion +-25.30066 -57.63591 America/Asuncion +25.41694 51.40389 Asia/Qatar +25.29194 51.42444 Asia/Qatar +25.17151 51.60337 Asia/Qatar +25.68389 51.50583 Asia/Qatar +25.27932 51.52245 Asia/Qatar +-21.3393 55.47811 Indian/Reunion +-21.00963 55.27071 Indian/Reunion +-21.28585 55.41124 Indian/Reunion +-21.17059 55.28824 Indian/Reunion +-21.37838 55.61918 Indian/Reunion +-20.90614 55.60886 Indian/Reunion +-20.89684 55.5496 Indian/Reunion +-20.88231 55.4504 Indian/Reunion +-21.03801 55.71937 Indian/Reunion +-20.96333 55.65031 Indian/Reunion +-21.28309 55.51802 Indian/Reunion +-20.9373 55.29189 Indian/Reunion +-20.92892 55.33513 Indian/Reunion +-21.21962 55.31513 Indian/Reunion +43.66667 25.36667 Europe/Bucharest +45.56093 25.31787 Europe/Bucharest +47.2 23.05 Europe/Bucharest +45.38333 23.26667 Europe/Bucharest +44.49002 26.17338 Europe/Bucharest +47.71667 24.43333 Europe/Bucharest +47.35 25.36667 Europe/Bucharest +46.63333 27.73333 Europe/Bucharest +44.71667 26.63333 Europe/Bucharest +43.75 24.86667 Europe/Bucharest +46.56667 23.78333 Europe/Bucharest +45.16667 28.8 Europe/Bucharest +46.33191 24.29662 Europe/Bucharest +46 26.13333 Europe/Bucharest +47.2 26.36667 Europe/Bucharest +46.54245 24.55747 Europe/Bucharest +45.05 23.28333 Europe/Bucharest +44.92543 25.4567 Europe/Bucharest +45.75372 21.22571 Europe/Bucharest +45.84973 27.43441 Europe/Bucharest +47.63333 26.25 Europe/Bucharest +44.43333 24.36667 Europe/Bucharest +47.23333 22.8 Europe/Bucharest +47.93195 23.88603 Europe/Bucharest +45.8 24.15 Europe/Bucharest +45.86667 25.78333 Europe/Bucharest +45.95646 23.571 Europe/Bucharest +47.8 22.88333 Europe/Bucharest +46.8 21.65 Europe/Bucharest +45.61674 25.71101 Europe/Bucharest +44.11667 24.98333 Europe/Bucharest +46.91667 26.91667 Europe/Bucharest +45.58333 25.45 Europe/Bucharest +45.1 24.36667 Europe/Bucharest +45.38333 27.05 Europe/Bucharest +45.30083 21.88917 Europe/Bucharest +46.78333 24.71667 Europe/Bucharest +47.85 25.91667 Europe/Bucharest +44.38333 26.16667 Europe/Bucharest +44.95 26.01667 Europe/Bucharest +44.85 24.86667 Europe/Bucharest +46.91667 26.33333 Europe/Bucharest +45.41667 23.36667 Europe/Bucharest +45.45 23.41667 Europe/Bucharest +44.45 26.2 Europe/Bucharest +45.83333 23.2 Europe/Bucharest +47.06667 21.93333 Europe/Bucharest +44.08333 26.63333 Europe/Bucharest +46.3 25.3 Europe/Bucharest +46.38333 23.85 Europe/Bucharest +44.31667 28.6 Europe/Bucharest +44.80333 22.97194 Europe/Bucharest +44.98301 25.64415 Europe/Bucharest +46.47523 26.48907 Europe/Bucharest +45.01667 26.45 Europe/Bucharest +46.35 25.8 Europe/Bucharest +46.16667 24.35 Europe/Bucharest +44.25 28.28333 Europe/Bucharest +47.35 22.33333 Europe/Bucharest +43.8 28.58333 Europe/Bucharest +45.36029 23.23832 Europe/Bucharest +45.68861 21.90306 Europe/Bucharest +46.48333 24.1 Europe/Bucharest +47.16667 27.6 Europe/Bucharest +46.67361 28.05944 Europe/Bucharest +45.75 22.9 Europe/Bucharest +47.55 25.9 Europe/Bucharest +43.88333 25.96667 Europe/Bucharest +47.03333 23.91667 Europe/Bucharest +46.72292 25.60055 Europe/Bucharest +45.45 28.05 Europe/Bucharest +44.71667 25.31667 Europe/Bucharest +45.7 27.18333 Europe/Bucharest +44.55 23.51667 Europe/Bucharest +44.4196 27.82536 Europe/Bucharest +44.38333 27.83333 Europe/Bucharest +47.45 26.3 Europe/Bucharest +45.85 24.96667 Europe/Bucharest +44.63194 22.65611 Europe/Bucharest +44.65 24.26667 Europe/Bucharest +47.95 26.4 Europe/Bucharest +45.88333 22.9 Europe/Bucharest +47.15 23.86667 Europe/Bucharest +45.13422 24.67409 Europe/Bucharest +45.83651 23.36998 Europe/Bucharest +44.31667 23.8 Europe/Bucharest +43.78333 24.5 Europe/Bucharest +44.18073 28.63432 Europe/Bucharest +46.42135 26.43645 Europe/Bucharest +45.7 25.45 Europe/Bucharest +46.76667 23.6 Europe/Bucharest +45.71667 24.15 Europe/Bucharest +47.53333 25.56667 Europe/Bucharest +45.12619 25.73496 Europe/Bucharest +46.55 23.88333 Europe/Bucharest +44.36667 28.01667 Europe/Bucharest +47.68333 22.46667 Europe/Bucharest +45.41667 22.21667 Europe/Bucharest +44.11667 24.35 Europe/Bucharest +43.99111 22.93278 Europe/Bucharest +45.15 26.83333 Europe/Bucharest +46.71667 26.7 Europe/Bucharest +44.56139 25.94889 Europe/Bucharest +44.43225 26.10626 Europe/Bucharest +45.18333 25.66667 Europe/Bucharest +45.64861 25.60613 Europe/Bucharest +45.26667 27.98333 Europe/Bucharest +46.13333 22.78333 Europe/Bucharest +47.75 26.66667 Europe/Bucharest +47.65527 24.66328 Europe/Bucharest +45.37333 21.70917 Europe/Bucharest +46.17508 23.91578 Europe/Bucharest +47.13316 24.50011 Europe/Bucharest +46.23333 27.66667 Europe/Bucharest +44.35 24.1 Europe/Bucharest +44.01667 23.35 Europe/Bucharest +45.03333 25.85 Europe/Bucharest +47.66189 23.69215 Europe/Bucharest +47.65729 23.56808 Europe/Bucharest +46.56667 26.9 Europe/Bucharest +46.18333 21.31667 Europe/Bucharest +43.98333 25.33333 Europe/Bucharest +46.06667 23.58333 Europe/Bucharest +46.31006 23.72128 Europe/Bucharest +46.1 27.16667 Europe/Bucharest +47.65331 23.57949 Europe/Bucharest +47.2469 26.72291 Europe/Bucharest +44.95905 24.94198 Europe/Bucharest +46.22141 24.79279 Europe/Bucharest +44.5647 27.3633 Europe/Bucharest +45.38361 20.38194 Europe/Belgrade +44.84306 20.40111 Europe/Belgrade +43.90358 22.26405 Europe/Belgrade +45.11667 21.30361 Europe/Belgrade +42.55139 21.90028 Europe/Belgrade +43.61694 21.0025 Europe/Belgrade +44.985 20.16083 Europe/Belgrade +44.67653 20.39232 Europe/Belgrade +44.36548 20.95885 Europe/Belgrade +44.66278 20.93 Europe/Belgrade +45.9275 20.07722 Europe/Belgrade +43.23417 21.58806 Europe/Belgrade +44.62133 21.18782 Europe/Belgrade +43.15306 22.58611 Europe/Belgrade +44.87083 20.64028 Europe/Belgrade +44.65486 20.20017 Europe/Belgrade +43.13667 20.51222 Europe/Belgrade +44.94366 20.21931 Europe/Belgrade +43.32472 21.90333 Europe/Belgrade +44.22639 22.53083 Europe/Belgrade +42.99806 21.94611 Europe/Belgrade +44.38534 20.2557 Europe/Belgrade +43.58 21.33389 Europe/Belgrade +43.72583 20.68944 Europe/Belgrade +44.01667 20.91667 Europe/Belgrade +45.82972 20.46528 Europe/Belgrade +43.97713 21.26121 Europe/Belgrade +45.04816 20.08165 Europe/Belgrade +44.02603 20.46152 Europe/Belgrade +43.9275 21.37 Europe/Belgrade +43.89139 20.34972 Europe/Belgrade +44.07488 22.09591 Europe/Belgrade +44.80401 20.46513 Europe/Belgrade +45.61632 20.03331 Europe/Belgrade +44.30694 20.56 Europe/Belgrade +45.57139 19.64083 Europe/Belgrade +44.27513 19.89821 Europe/Belgrade +43.85861 19.84878 Europe/Belgrade +46.1 19.66667 Europe/Belgrade +44.97639 19.61222 Europe/Belgrade +45.77417 19.11222 Europe/Belgrade +44.74667 19.69 Europe/Belgrade +45.00806 19.82222 Europe/Belgrade +45.25167 19.83694 Europe/Belgrade +45.81516 19.6318 Europe/Belgrade +45.25083 19.39194 Europe/Belgrade +45.67111 18.98472 Europe/Belgrade +43.56634 22.25701 Europe/Belgrade +57.87944 34.9925 Europe/Moscow +60.01667 30.35 Europe/Moscow +54.35369 41.91986 Europe/Moscow +55.65608 37.56846 Europe/Moscow +55.61667 37.76667 Europe/Moscow +48.02108 40.12282 Europe/Moscow +55.73402 36.85918 Europe/Moscow +55.17111 59.65083 Asia/Yekaterinburg +47.1474 42.4721 Europe/Moscow +55.7 37.85 Europe/Moscow +55.59528 38.12028 Europe/Moscow +53.53395 33.72798 Europe/Moscow +50.98448 44.77347 Europe/Volgograd +53.39972 49.49528 Europe/Samara +51.84861 41.46056 Europe/Moscow +44.13944 43.01972 Europe/Moscow +52.331 35.3711 Europe/Moscow +55.744 38.01684 Europe/Moscow +46.84518 40.30834 Europe/Moscow +44.40694 43.88056 Europe/Moscow +55.9825 37.18139 Europe/Moscow +55.84376 48.51784 Europe/Moscow +43.85804 41.5894 Europe/Moscow +56.64051 43.39446 Europe/Moscow +53.20356 45.19227 Europe/Moscow +54.7605 38.87841 Europe/Moscow +69.41541 30.81355 Europe/Moscow +55.73333 37.63333 Europe/Moscow +55.3195 52.06942 Europe/Moscow +56.50339 39.67911 Europe/Moscow +56.63877 47.89078 Europe/Moscow +46.7055 38.2739 Europe/Moscow +44.0328 42.8813 Europe/Moscow +44.04444 42.86056 Europe/Moscow +51.3513 48.2766 Europe/Volgograd +62.58999 50.85939 Europe/Moscow +45.04616 38.79491 Europe/Moscow +52.62366 38.50169 Europe/Moscow +50.949 43.73781 Europe/Volgograd +55.76127 52.06493 Europe/Moscow +55.38283 39.03233 Europe/Moscow +46.56564 40.65621 Europe/Moscow +53.14806 38.09924 Europe/Moscow +51.0333 59.8742 Asia/Yekaterinburg +54.48082 37.69854 Europe/Moscow +55.60686 37.51991 Europe/Moscow +55.06667 32.69639 Europe/Moscow +57.62987 39.87368 Europe/Moscow +57.30331 47.88611 Europe/Volgograd +56.2751 54.9338 Asia/Yekaterinburg +44.98901 38.94324 Europe/Moscow +57.59125 34.56453 Europe/Moscow +45.58128 39.66409 Europe/Moscow +55.3175 42.17444 Europe/Moscow +55.70196 37.81178 Europe/Moscow +60.70763 28.75283 Europe/Moscow +56.24057 42.15563 Europe/Moscow +55.21039 34.29508 Europe/Moscow +56.22602 51.06557 Europe/Volgograd +60.01512 30.67314 Europe/Moscow +57.04865 53.98717 Europe/Samara +55.66667 37.45 Europe/Moscow +55.39934 37.80829 Europe/Moscow +55.31733 38.65264 Europe/Moscow +51.67204 39.1843 Europe/Moscow +55.88333 37.58333 Europe/Moscow +55.71667 37.53333 Europe/Moscow +48.78583 44.77973 Europe/Volgograd +55.86638 48.3594 Europe/Moscow +52.04541 47.37993 Europe/Volgograd +56.03361 35.96944 Europe/Moscow +59.2239 39.88398 Europe/Moscow +59.9258 32.33819 Europe/Moscow +55.65 37.61667 Europe/Moscow +57.43931 41.15553 Europe/Moscow +48.71939 44.50184 Europe/Volgograd +47.51361 42.15139 Europe/Moscow +55.6 37.21667 Europe/Moscow +55.85 37.58333 Europe/Moscow +56.13655 40.39658 Europe/Moscow +43.03667 44.66778 Europe/Moscow +55.55239 37.70966 Europe/Moscow +57.21276 41.93012 Europe/Moscow +55.72393 37.81952 Europe/Moscow +58.07894 54.6557 Asia/Yekaterinburg +54.35533 38.26843 Europe/Moscow +61.07006 42.0983 Europe/Moscow +60.76186 46.31352 Europe/Moscow +56.34 30.54517 Europe/Moscow +55.88441 37.69055 Europe/Moscow +50.2035 38.1067 Europe/Moscow +57.97472 33.2525 Europe/Moscow +55.9 37.55 Europe/Moscow +53.98179 38.17118 Europe/Moscow +51.98486 42.26147 Europe/Moscow +56.99081 52.18517 Europe/Samara +45.21077 39.68914 Europe/Moscow +54.9366 58.1757 Asia/Yekaterinburg +44.0834 41.9763 Europe/Moscow +52.04662 39.7288 Europe/Moscow +50.8047 42.0138 Europe/Volgograd +43.13053 45.53791 Europe/Moscow +59.83889 30.17528 Europe/Moscow +52.84591 32.67394 Europe/Moscow +54.32824 48.38657 Europe/Moscow +63.56705 53.68348 Europe/Moscow +57.5275 38.33167 Europe/Moscow +54.74306 55.96779 Asia/Yekaterinburg +43.93778 42.51167 Europe/Moscow +54.35806 59.43611 Asia/Yekaterinburg +54.2996 59.4521 Asia/Yekaterinburg +43.38278 42.91833 Europe/Moscow +56.85836 35.90057 Europe/Moscow +54.60666 53.7097 Asia/Yekaterinburg +57.88529 39.5406 Europe/Moscow +54.19609 37.61822 Europe/Moscow +55.60111 36.46806 Europe/Moscow +44.1053 39.0802 Europe/Moscow +47.64611 42.10194 Europe/Moscow +52.5798 33.7644 Europe/Moscow +55.65625 37.48496 Europe/Moscow +43.30664 44.98395 Europe/Moscow +55.48498 37.30736 Europe/Moscow +59.54 30.8775 Europe/Moscow +57.0436 34.96221 Europe/Moscow +55.6562 37.94713 Europe/Moscow +53.5303 49.3461 Europe/Samara +45.61694 38.94528 Europe/Moscow +59.64511 33.52937 Europe/Moscow +45.85472 40.12528 Europe/Moscow +56.85796 40.53692 Europe/Moscow +43.48333 44.13611 Europe/Moscow +55.62047 37.49338 Europe/Moscow +45.27055 37.38716 Europe/Moscow +55.70033 37.74271 Europe/Moscow +45.36333 40.19 Europe/Moscow +52.73169 41.44326 Europe/Moscow +55.9077 53.9355 Asia/Yekaterinburg +47.23617 38.89688 Europe/Moscow +55.73333 37.66667 Europe/Moscow +53.1585 48.4681 Europe/Samara +61.67642 50.80994 Europe/Moscow +44.02556 43.05028 Europe/Moscow +55.85 37.63333 Europe/Moscow +61.11213 28.86321 Europe/Moscow +54.67501 20.13473 Europe/Kaliningrad +45.33528 42.85472 Europe/Moscow +44.1901 42.6595 Europe/Moscow +54.1223 36.49657 Europe/Moscow +48.60734 42.84621 Europe/Volgograd +43.1875 44.90194 Europe/Moscow +54.09989 35.34254 Europe/Moscow +54.90083 38.07083 Europe/Moscow +56.38333 38.56667 Europe/Moscow +50.78543 36.4831 Europe/Moscow +55.81838 37.41224 Europe/Moscow +53.62462 55.95015 Asia/Yekaterinburg +45.0428 41.9734 Europe/Moscow +51.29667 37.84167 Europe/Moscow +46.6311 38.6742 Europe/Moscow +46.53 39.04972 Europe/Moscow +52.58444 32.76333 Europe/Moscow +57.99439 31.36081 Europe/Moscow +55.80799 38.1805 Europe/Moscow +59.98834 30.24296 Europe/Moscow +57.58475 48.95844 Europe/Volgograd +55.08392 21.87851 Europe/Kaliningrad +59.8996 29.08574 Europe/Moscow +59.83528 30.14667 Europe/Moscow +63.60229 53.88175 Europe/Moscow +61.71233 30.70953 Europe/Moscow +52.4338 53.1583 Asia/Yekaterinburg +55.63711 37.38115 Europe/Moscow +56.18333 36.98333 Europe/Moscow +51.1631 54.99176 Asia/Yekaterinburg +59.6316 56.7685 Asia/Yekaterinburg +55.80202 37.67159 Europe/Moscow +55.8 37.51667 Europe/Moscow +59.46167 40.12056 Europe/Moscow +56.15 37.96667 Europe/Moscow +43.59917 39.72569 Europe/Moscow +55.98553 40.01111 Europe/Moscow +54.7818 32.0401 Europe/Moscow +58.73222 50.17722 Europe/Volgograd +55.86667 37.58333 Europe/Moscow +45.2558 38.1256 Europe/Moscow +59.11817 28.09137 Europe/Moscow +53.82486 39.55053 Europe/Moscow +55.94806 37.29778 Europe/Moscow +54.993 57.6982 Asia/Yekaterinburg +52.71806 58.66583 Asia/Yekaterinburg +56.84865 41.38833 Europe/Moscow +59.80917 30.38167 Europe/Moscow +55.5005 46.41288 Europe/Moscow +45.12833 42.02556 Europe/Moscow +54.3204 40.874 Europe/Moscow +59.20998 38.51066 Europe/Moscow +50.40967 36.9136 Europe/Moscow +55.8 37.45 Europe/Moscow +51.87555 36.90432 Europe/Moscow +55.49972 37.55972 Europe/Moscow +55.89303 38.0586 Europe/Moscow +54.00513 37.52194 Europe/Moscow +55.57253 39.53682 Europe/Moscow +58.36909 45.51558 Europe/Moscow +43.14806 45.90194 Europe/Moscow +57.67579 46.61136 Europe/Moscow +47.70911 40.21443 Europe/Moscow +44.85407 38.67686 Europe/Moscow +54.03481 38.40172 Europe/Moscow +60.15328 59.95205 Asia/Yekaterinburg +69.06889 33.41622 Europe/Moscow +64.5635 39.8302 Europe/Moscow +55.93583 37.54889 Europe/Moscow +55.71667 37.41667 Europe/Moscow +60.09802 29.96378 Europe/Moscow +60.1444 30.20165 Europe/Moscow +54.91578 37.41114 Europe/Moscow +56.3 38.13333 Europe/Moscow +55.53079 45.46611 Europe/Moscow +52.45861 44.21689 Europe/Moscow +51.68526 39.02787 Europe/Moscow +47.51943 40.8112 Europe/Moscow +55.68333 37.55 Europe/Moscow +56.78749 44.49297 Europe/Moscow +53.36831 34.10328 Europe/Moscow +63.74147 34.32218 Europe/Moscow +55.0425 59.04 Asia/Yekaterinburg +54.93583 43.32352 Europe/Moscow +51.54056 46.00861 Europe/Volgograd +56.47633 53.79782 Europe/Samara +54.1838 45.1749 Europe/Moscow +51.78771 56.36091 Asia/Yekaterinburg +59.93863 30.31413 Europe/Moscow +53.20006 50.15 Europe/Samara +46.4747 41.54114 Europe/Moscow +53.38365 55.90773 Asia/Yekaterinburg +55.15 33.21667 Europe/Moscow +56.26241 34.32817 Europe/Moscow +54.72774 39.51731 Europe/Moscow +58.0446 38.84259 Europe/Moscow +59.8393 30.49873 Europe/Moscow +53.7038 40.1109 Europe/Moscow +54.6269 39.6916 Europe/Moscow +54.06387 44.9509 Europe/Moscow +55.78514 37.35481 Europe/Moscow +52.26041 43.78745 Europe/Volgograd +47.23135 39.72328 Europe/Moscow +57.1914 39.41394 Europe/Moscow +55.83333 37.66667 Europe/Moscow +51.1209 38.5116 Europe/Moscow +50.19828 39.56726 Europe/Moscow +53.95278 32.86389 Europe/Moscow +55.66853 39.87488 Europe/Moscow +57.10513 41.73048 Europe/Moscow +56.80097 59.93028 Asia/Yekaterinburg +55.76111 37.8575 Europe/Moscow +50.53439 36.68462 Europe/Moscow +54.0658 54.9468 Asia/Yekaterinburg +52.65599 41.88461 Europe/Moscow +55.7 37.5 Europe/Moscow +44.04861 43.05944 Europe/Moscow +56.01722 37.86667 Europe/Moscow +59.71417 30.39642 Europe/Moscow +54.83373 37.61138 Europe/Moscow +57.8136 28.3496 Europe/Moscow +54.8682 37.21584 Europe/Moscow +46.70289 41.72717 Europe/Moscow +43.75741 44.0297 Europe/Moscow +53.9 53.93333 Asia/Yekaterinburg +51.40944 46.04833 Europe/Volgograd +57.38698 41.28666 Europe/Moscow +61.03928 30.12907 Europe/Moscow +46.0497 38.1747 Europe/Moscow +51.68406 39.0727 Europe/Moscow +51.1945 42.2457 Europe/Moscow +55.65928 37.60404 Europe/Moscow +55.58333 37.6 Europe/Moscow +67.36611 32.49806 Europe/Moscow +69.19889 33.44778 Europe/Moscow +55.80797 37.45814 Europe/Moscow +55.91797 39.17242 Europe/Moscow +53.65237 52.12738 Europe/Samara +60.91124 34.17064 Europe/Moscow +55.42418 37.55472 Europe/Moscow +52.9336 33.4464 Europe/Moscow +55.73333 37.76667 Europe/Moscow +53.70944 37.29194 Europe/Moscow +59.51833 34.16639 Europe/Moscow +55.92639 39.46104 Europe/Moscow +61.78491 34.34691 Europe/Moscow +55.55 37.78333 Europe/Moscow +52.30639 45.39167 Europe/Volgograd +59.89565 29.80145 Europe/Moscow +59.88333 29.9 Europe/Moscow +58.59382 35.80244 Europe/Moscow +56.90528 59.94361 Asia/Yekaterinburg +55.73501 37.79088 Europe/Moscow +58.01046 56.25017 Asia/Yekaterinburg +56.73934 38.85626 Europe/Moscow +55.64528 37.33583 Europe/Moscow +53.20066 45.00464 Europe/Moscow +65.14716 57.22439 Europe/Moscow +55.78187 38.65025 Europe/Moscow +46.1377 39.7832 Europe/Moscow +59.68333 30.43472 Europe/Moscow +50.45778 40.10806 Europe/Moscow +45.02366 39.10436 Europe/Moscow +50.05 46.88333 Europe/Volgograd +54.85998 38.55062 Europe/Moscow +60.03947 30.31128 Europe/Moscow +53.37596 51.3452 Europe/Samara +55.86667 37.6 Europe/Moscow +59.7775 30.81806 Europe/Moscow +44.39333 41.52056 Europe/Moscow +57.34395 28.35368 Europe/Moscow +50.8664 39.07562 Europe/Moscow +57.14667 33.10753 Europe/Moscow +55.82958 37.61604 Europe/Moscow +57.283 55.4589 Asia/Yekaterinburg +51.20487 58.56685 Asia/Yekaterinburg +46.87139 42.05917 Europe/Moscow +51.7727 55.0988 Asia/Yekaterinburg +52.96508 36.0785 Europe/Moscow +55.80672 38.96178 Europe/Moscow +55.61667 37.68333 Europe/Moscow +43.3195 45.04911 Europe/Moscow +63.90692 38.11112 Europe/Moscow +58.67001 52.1932 Europe/Volgograd +68.1432 33.25287 Europe/Moscow +43.24206 46.00013 Europe/Moscow +54.48147 53.47103 Asia/Yekaterinburg +55.67798 37.27773 Europe/Moscow +57.89035 54.7202 Asia/Yekaterinburg +55.68432 37.44654 Europe/Moscow +55.09681 36.61006 Europe/Moscow +57.9437 55.3396 Asia/Yekaterinburg +61.6656 40.2013 Europe/Moscow +54.42766 50.80511 Europe/Moscow +50.7633 37.86402 Europe/Moscow +55.7 37.75 Europe/Moscow +55.7 37.58333 Europe/Moscow +52.5396 31.9275 Europe/Moscow +51.30719 39.21732 Europe/Moscow +50.45917 48.14306 Europe/Volgograd +54.14961 48.38907 Europe/Moscow +51.20301 58.32665 Asia/Yekaterinburg +45.23756 38.98059 Europe/Moscow +47.76037 39.93335 Europe/Moscow +44.72439 37.76752 Europe/Moscow +45.95139 40.70056 Europe/Moscow +43.96222 43.63417 Europe/Moscow +54.0105 38.2846 Europe/Moscow +54.0384 39.7479 Europe/Moscow +55.71667 37.78333 Europe/Moscow +53.0959 49.9462 Europe/Samara +45.117 41.0267 Europe/Moscow +55.86667 37.5 Europe/Moscow +55.75378 37.81885 Europe/Moscow +64.4165 40.8122 Europe/Moscow +47.42018 40.09132 Europe/Moscow +56.11095 47.47755 Europe/Moscow +50.5287 42.6747 Europe/Volgograd +45.4948 41.22075 Europe/Moscow +58.52131 31.27104 Europe/Moscow +51.64177 39.40863 Europe/Moscow +59.98748 30.28682 Europe/Moscow +55.86647 38.4438 Europe/Moscow +58.6293 59.8118 Asia/Yekaterinburg +57.91944 59.965 Asia/Yekaterinburg +56.32867 44.00205 Europe/Moscow +53.53041 43.67664 Europe/Moscow +55.63657 51.82447 Europe/Moscow +55.66943 37.46598 Europe/Moscow +55.68333 37.48333 Europe/Moscow +59.70056 30.78472 Europe/Moscow +53.71886 46.07118 Europe/Moscow +50.02824 45.45953 Europe/Volgograd +69.41285 30.22198 Europe/Moscow +44.11806 43.40278 Europe/Moscow +44.6333 41.9444 Europe/Moscow +56.02094 29.92844 Europe/Moscow +43.23861 45.05028 Europe/Moscow +57.45881 40.57471 Europe/Moscow +56.22107 32.77738 Europe/Moscow +56.092 54.2661 Asia/Yekaterinburg +52.802 51.166 Europe/Samara +43.22597 44.77323 Europe/Moscow +55.5441 42.1968 Europe/Moscow +67.63869 53.00371 Europe/Moscow +43.5575 43.85083 Europe/Moscow +55.38752 36.73307 Europe/Moscow +43.49806 43.61889 Europe/Moscow +55.84854 37.17788 Europe/Moscow +55.72545 52.41122 Europe/Moscow +55.91163 37.73076 Europe/Moscow +55.575 42.0426 Europe/Moscow +68.97917 33.09251 Europe/Moscow +53.27657 36.57334 Europe/Moscow +56.44469 52.22763 Europe/Samara +55.50194 36.02722 Europe/Moscow +43.74359 44.65177 Europe/Moscow +44.41222 40.79361 Europe/Moscow +55.75222 37.61556 Europe/Moscow +53.44354 41.81065 Europe/Moscow +48.35502 41.82627 Europe/Moscow +55.84244 38.19362 Europe/Moscow +67.93972 32.87389 Europe/Moscow +61.33289 44.53598 Europe/Moscow +44.21028 43.13528 Europe/Moscow +48.92265 40.39673 Europe/Moscow +50.06 43.2379 Europe/Volgograd +55.68333 37.43333 Europe/Moscow +52.8978 40.4907 Europe/Moscow +59.80083 30.54778 Europe/Moscow +55.72706 53.10258 Europe/Moscow +55.90818 52.29047 Europe/Moscow +52.96467 55.93277 Asia/Yekaterinburg +55.3343 41.6295 Europe/Moscow +62.91713 34.45689 Europe/Moscow +45.45151 39.02485 Europe/Moscow +56.63388 47.80405 Europe/Moscow +51.4128 57.595 Asia/Yekaterinburg +44.60778 40.10583 Europe/Moscow +55.71112 37.47502 Europe/Moscow +51.71111 46.74861 Europe/Volgograd +55.65 37.71667 Europe/Moscow +55.8 37.61667 Europe/Moscow +58.32889 44.76406 Europe/Moscow +55.88333 37.71667 Europe/Moscow +55.01457 36.47185 Europe/Moscow +43.51118 44.58821 Europe/Moscow +55.64776 38.02486 Europe/Moscow +42.97638 47.50236 Europe/Moscow +53.41861 59.04722 Asia/Yekaterinburg +53.86639 34.44778 Europe/Moscow +55.67923 37.7525 Europe/Moscow +55.67719 37.89322 Europe/Moscow +55.58271 37.90516 Europe/Moscow +58.10861 57.80528 Asia/Yekaterinburg +56.03282 45.0422 Europe/Moscow +55.71599 37.55376 Europe/Moscow +54.97661 39.0444 Europe/Moscow +58.73722 29.84528 Europe/Moscow +55.86959 38.20065 Europe/Moscow +59.90612 29.77253 Europe/Moscow +60.726 33.55306 Europe/Moscow +56.00972 37.48194 Europe/Moscow +52.42534 37.60689 Europe/Moscow +50.98405 39.51545 Europe/Moscow +52.60311 39.57076 Europe/Moscow +55.7083 38.9542 Europe/Moscow +55.85 37.56667 Europe/Moscow +55.89783 37.5868 Europe/Moscow +51.63069 35.2775 Europe/Moscow +55.88333 37.48333 Europe/Moscow +60.00448 30.27523 Europe/Moscow +44.10667 42.97333 Europe/Moscow +55.85 37.65 Europe/Moscow +55.7 37.56667 Europe/Moscow +48.70233 45.19798 Europe/Volgograd +54.60256 52.46087 Europe/Moscow +55.6254 37.65032 Europe/Moscow +46.3214 39.3877 Europe/Moscow +55.93333 37.83333 Europe/Moscow +55.76667 37.7 Europe/Moscow +53.01942 39.16639 Europe/Moscow +43.90886 39.33137 Europe/Moscow +56.01931 39.94848 Europe/Moscow +44.63417 40.73556 Europe/Moscow +43.6625 43.53694 Europe/Moscow +53.11675 46.60037 Europe/Moscow +55.7 37.8 Europe/Moscow +51.4781 57.3552 Asia/Yekaterinburg +55.73423 37.82616 Europe/Moscow +58.29056 59.75917 Asia/Yekaterinburg +46.5599 39.6321 Europe/Moscow +55.33833 59.44056 Asia/Yekaterinburg +55.65 37.7 Europe/Moscow +51.73733 36.18735 Europe/Moscow +55.58183 38.91994 Europe/Moscow +44.88 40.59861 Europe/Moscow +51.6601 35.6521 Europe/Moscow +43.20184 46.0881 Europe/Moscow +59.85278 30.35667 Europe/Moscow +57.4368 56.9593 Asia/Yekaterinburg +52.76667 55.78333 Asia/Yekaterinburg +55.41333 42.5325 Europe/Moscow +56.1855 50.8944 Europe/Moscow +59.01306 54.65556 Asia/Yekaterinburg +43.49547 39.89294 Europe/Moscow +55.57957 36.70392 Europe/Moscow +56.14733 44.19787 Europe/Moscow +44.92934 37.99117 Europe/Moscow +45.4375 40.57556 Europe/Moscow +59.99541 29.76668 Europe/Kaliningrad +47.89221 40.07037 Europe/Moscow +55.58766 37.64282 Europe/Moscow +59.73833 30.08944 Europe/Moscow +60.40783 57.08199 Asia/Yekaterinburg +56.60585 57.76686 Asia/Yekaterinburg +58.0796 55.7552 Asia/Yekaterinburg +45.84604 41.51885 Europe/Moscow +55.82036 37.33017 Europe/Moscow +45.04484 38.97603 Europe/Moscow +45.36614 38.21171 Europe/Moscow +56.1 38.13333 Europe/Moscow +51.02389 45.69694 Europe/Volgograd +55.75 37.55 Europe/Moscow +56.3419 46.56353 Europe/Moscow +55.7 37.66667 Europe/Moscow +55.86667 37.61667 Europe/Moscow +54.03746 35.77159 Europe/Moscow +54.03876 43.91386 Europe/Moscow +56.35722 41.31917 Europe/Moscow +67.56616 30.47576 Europe/Moscow +52.58666 41.5021 Europe/Moscow +50.32113 44.80119 Europe/Volgograd +61.25745 46.64963 Europe/Moscow +47.63009 43.14068 Europe/Volgograd +55.63546 37.8445 Europe/Moscow +58.3089 48.348 Europe/Volgograd +57.76647 40.92686 Europe/Moscow +64.571 30.57667 Europe/Moscow +54.11896 37.54459 Europe/Moscow +61.31433 47.16914 Europe/Moscow +45.46899 39.45136 Europe/Moscow +47.58278 41.09222 Europe/Moscow +54.80639 35.92778 Europe/Moscow +62.20565 34.26138 Europe/Moscow +56.7 36.76667 Europe/Moscow +59.62056 30.39 Europe/Moscow +59.75069 30.58856 Europe/Moscow +60.02427 30.28491 Europe/Moscow +55.07944 38.77833 Europe/Moscow +55.66667 37.68333 Europe/Moscow +56.29929 39.38304 Europe/Moscow +56.93486 41.0915 Europe/Moscow +52.76019 32.23934 Europe/Moscow +56.33333 36.73333 Europe/Moscow +55.36352 37.52984 Europe/Moscow +43.84712 46.71445 Europe/Moscow +43.20697 46.8679 Europe/Moscow +59.04709 57.64767 Asia/Yekaterinburg +43.91333 42.72083 Europe/Moscow +56.15273 38.85509 Europe/Moscow +52.65494 42.72236 Europe/Moscow +67.61475 33.67274 Europe/Moscow +59.88101 30.99507 Europe/Moscow +58.55386 50.03986 Europe/Volgograd +58.59665 49.66007 Europe/Volgograd +54.06686 34.29955 Europe/Moscow +59.44712 32.02049 Europe/Moscow +53.93361 37.92792 Europe/Moscow +59.37331 28.61343 Europe/Moscow +57.43914 42.12894 Europe/Moscow +53.4706 51.4743 Europe/Samara +53.22571 50.62907 Europe/Samara +56.86667 37.35 Europe/Moscow +53.97164 38.53186 Europe/Moscow +56.25699 37.99544 Europe/Moscow +43.51484 39.86825 Europe/Moscow +55.78364 37.47137 Europe/Moscow +44.84694 38.385 Europe/Moscow +55.89704 37.42969 Europe/Moscow +43.2509 46.58766 Europe/Moscow +47.41958 47.25678 Europe/Volgograd +44.4258 39.5362 Europe/Moscow +55.78874 49.12214 Europe/Moscow +54.75306 58.19556 Asia/Yekaterinburg +55.71667 37.5 Europe/Moscow +42.88165 47.63919 Europe/Moscow +54.94111 41.39528 Europe/Moscow +54.84444 38.16694 Europe/Moscow +57.35917 37.60806 Europe/Moscow +53.12292 34.98517 Europe/Moscow +43.77399 41.91419 Europe/Moscow +43.30513 44.89949 Europe/Moscow +56.31667 38.7 Europe/Moscow +55.63806 37.79306 Europe/Moscow +43.22824 44.63322 Europe/Moscow +46.0849 38.9596 Europe/Moscow +67.162 32.41229 Europe/Moscow +55.50962 47.49127 Europe/Moscow +46.10995 48.07364 Europe/Volgograd +50.09833 45.41601 Europe/Volgograd +48.31779 40.25948 Europe/Moscow +54.5293 36.27542 Europe/Moscow +51.5 44.4758 Europe/Volgograd +55.91417 37.82556 Europe/Moscow +54.70649 20.51095 Europe/Kaliningrad +48.69099 43.52638 Europe/Volgograd +50.4258 41.0261 Europe/Moscow +58.7002 59.4839 Asia/Yekaterinburg +55.78677 37.80165 Europe/Moscow +56.84976 53.20448 Europe/Samara +42.56955 47.86447 Europe/Moscow +55.97111 37.92083 Europe/Moscow +55.76667 37.83333 Europe/Moscow +56.99719 40.97139 Europe/Moscow +55.91997 36.86867 Europe/Moscow +53.45446 56.04149 Asia/Yekaterinburg +45.71806 42.90361 Europe/Moscow +53.85672 46.35622 Europe/Moscow +44.09264 43.09113 Europe/Moscow +44.84222 38.56686 Europe/Moscow +57.5549 53.0544 Europe/Samara +55.61113 40.65186 Europe/Moscow +54.59222 22.19972 Europe/Kaliningrad +45.35383 40.69465 Europe/Moscow +48.05306 39.93111 Europe/Moscow +43.35071 46.10925 Europe/Moscow +51.28167 37.54583 Europe/Moscow +58.83862 57.55325 Asia/Yekaterinburg +58.88 40.2525 Europe/Moscow +52.49657 39.93593 Europe/Moscow +43.31195 45.68895 Europe/Moscow +51.45792 41.97636 Europe/Moscow +60.03587 30.40518 Europe/Moscow +44.63083 39.13 Europe/Moscow +44.02361 43.09222 Europe/Moscow +48.80454 44.47439 Europe/Volgograd +56.65493 43.47273 Europe/Moscow +59.77472 30.11971 Europe/Moscow +55.82299 37.81306 Europe/Moscow +55.60928 36.98212 Europe/Moscow +58.1393 52.658 Europe/Samara +44.86208 40.07195 Europe/Moscow +44.15194 43.46972 Europe/Moscow +44.5622 38.0848 Europe/Moscow +51.4666 58.4552 Asia/Yekaterinburg +57.30185 39.85331 Europe/Moscow +59.57639 30.12833 Europe/Moscow +58.37884 42.34633 Europe/Moscow +55.55291 34.99537 Europe/Moscow +57.25363 41.10849 Europe/Moscow +55.96056 38.04556 Europe/Moscow +55.73321 38.46458 Europe/Moscow +49.77133 43.66222 Europe/Volgograd +55.74819 37.47968 Europe/Moscow +61.81281 50.72834 Europe/Moscow +51.48389 46.10528 Europe/Volgograd +44.9264 38.90584 Europe/Moscow +46.30778 44.25583 Europe/Moscow +55.72445 38.20908 Europe/Moscow +55.78959 38.44671 Europe/Moscow +55.88431 38.7864 Europe/Moscow +43.21222 44.82306 Europe/Moscow +55.62945 37.85654 Europe/Moscow +56.24143 43.45539 Europe/Moscow +55.49106 54.86883 Asia/Yekaterinburg +53.59782 34.33825 Europe/Moscow +49.05825 44.829 Europe/Volgograd +56.73333 37.16667 Europe/Moscow +55.75 37.56667 Europe/Moscow +45.45518 41.97411 Europe/Moscow +53.97106 38.33627 Europe/Moscow +48.33372 39.94776 Europe/Moscow +55.4413 37.75367 Europe/Moscow +55.94958 37.50183 Europe/Moscow +58.4644 56.4127 Asia/Yekaterinburg +56.34485 37.52041 Europe/Moscow +45.90889 43.35472 Europe/Moscow +45.21516 39.2265 Europe/Moscow +54.21386 49.61838 Europe/Moscow +54.15077 33.28151 Europe/Moscow +42.0678 48.28987 Europe/Moscow +55.86667 37.53333 Europe/Moscow +55.86861 37.12222 Europe/Moscow +55.71815 37.47271 Europe/Moscow +54.22145 55.03434 Asia/Yekaterinburg +53.25155 39.15553 Europe/Moscow +58.1908 40.17171 Europe/Moscow +42.11589 48.19204 Europe/Moscow +59.84167 30.25583 Europe/Moscow +58.3013 57.8131 Asia/Yekaterinburg +59.11667 31.68333 Europe/Moscow +55.36311 50.64244 Europe/Moscow +54.57648 55.37642 Asia/Yekaterinburg +50.94095 37.80693 Europe/Moscow +54.63345 21.81557 Europe/Kaliningrad +56.50722 56.07661 Asia/Yekaterinburg +56 38.36667 Europe/Moscow +44.22333 42.05778 Europe/Moscow +59.13333 37.9 Europe/Moscow +55.66473 37.56135 Europe/Moscow +55.1477 37.47728 Europe/Moscow +43.28333 43.13333 Europe/Moscow +56.13222 47.25194 Europe/Moscow +56.76864 54.11484 Asia/Yekaterinburg +52.9771 49.7086 Europe/Samara +52.7807 52.2635 Asia/Yekaterinburg +42.819 47.1192 Europe/Moscow +58.48067 41.53699 Europe/Moscow +50.82389 40.60917 Europe/Moscow +55.88333 37.5 Europe/Moscow +54.97119 48.29184 Europe/Moscow +53.6554 52.442 Asia/Yekaterinburg +54.5378 52.7985 Europe/Moscow +44.78389 44.16583 Europe/Moscow +45.80603 38.99959 Europe/Moscow +53.25209 34.37167 Europe/Moscow +55.42112 38.26188 Europe/Moscow +55.63755 37.76438 Europe/Moscow +58.38778 33.91546 Europe/Moscow +51.36713 42.08494 Europe/Moscow +56.35808 44.07477 Europe/Moscow +55.71667 37.41667 Europe/Moscow +57.8799 34.1068 Europe/Moscow +59.47405 33.84853 Europe/Moscow +49.93577 40.545 Europe/Moscow +55.81353 37.71617 Europe/Moscow +56.10514 43.51294 Europe/Moscow +53.77166 38.12408 Europe/Moscow +51.09611 40.03333 Europe/Moscow +55.035 55.97806 Asia/Yekaterinburg +45.09778 43.43639 Europe/Moscow +55.58635 37.67781 Europe/Moscow +55.42111 55.54278 Asia/Yekaterinburg +55.88333 37.6 Europe/Moscow +57.78506 36.69651 Europe/Moscow +52.982 49.4333 Europe/Samara +43.19217 44.54313 Europe/Moscow +59.4091 56.8204 Asia/Yekaterinburg +53.96306 58.39806 Asia/Yekaterinburg +44.77127 39.87879 Europe/Moscow +55.45978 38.44358 Europe/Moscow +50.61074 36.58015 Europe/Moscow +53.81194 36.13194 Europe/Moscow +54.11667 54.11667 Asia/Yekaterinburg +48.18585 40.77424 Europe/Moscow +46.07802 40.86651 Europe/Moscow +52.59333 58.3225 Asia/Yekaterinburg +54.39304 53.26023 Europe/Moscow +47.13975 39.75181 Europe/Moscow +53.65533 47.11229 Europe/Moscow +57.9787 53.0138 Europe/Samara +51.5502 43.1667 Europe/Volgograd +55.80945 37.95806 Europe/Moscow +52.02782 47.8007 Europe/Volgograd +56.48989 43.60114 Europe/Moscow +55.18161 36.6606 Europe/Moscow +43.68806 43.53694 Europe/Moscow +54.9417 58.8083 Asia/Yekaterinburg +47.32411 40.38791 Europe/Moscow +55.86931 37.72966 Europe/Moscow +47.10779 39.41648 Europe/Moscow +43.16354 46.0012 Europe/Moscow +59.87167 30.26583 Europe/Moscow +51.87185 45.00775 Europe/Volgograd +46.34968 48.04076 Europe/Volgograd +54.9973 57.2722 Asia/Yekaterinburg +45.37278 44.22056 Europe/Moscow +55.39485 43.83992 Europe/Moscow +56.09151 49.87783 Europe/Moscow +44.9892 41.1234 Europe/Moscow +64.5401 40.5433 Europe/Moscow +43.29713 45.87454 Europe/Moscow +43.1772 44.29702 Europe/Moscow +44.46472 39.73417 Europe/Moscow +55.55194 37.0801 Europe/Moscow +67.56414 33.4031 Europe/Moscow +51.4842 40.4299 Europe/Moscow +55.55487 37.92566 Europe/Moscow +44.89084 37.3239 Europe/Moscow +55.7 37.46667 Europe/Moscow +54.90442 52.3154 Europe/Moscow +54.50503 37.0674 Europe/Moscow +55.63 37.8 Europe/Moscow +50.6309 38.6903 Europe/Moscow +56.4 38.71667 Europe/Moscow +44.71417 43.00083 Europe/Moscow +59.1581 57.5695 Asia/Yekaterinburg +56.39516 38.71216 Europe/Moscow +54.8421 46.5813 Europe/Moscow +55.85 37.48333 Europe/Moscow +47.25838 39.86675 Europe/Moscow +44.8546 38.3031 Europe/Moscow +48.27955 46.17217 Europe/Volgograd +56.52034 52.99422 Europe/Moscow +44.90005 38.84265 Europe/Moscow +43.42896 39.92391 Europe/Moscow +43.18997 45.28373 Europe/Moscow +44.86804 38.15728 Europe/Moscow +53.7 53.66667 Asia/Yekaterinburg +55.83596 48.6582 Europe/Moscow +51.5655 34.6822 Europe/Moscow +44.75583 44.9925 Europe/Moscow +43.04222 44.22222 Europe/Moscow +47.52972 39.41833 Europe/Moscow +55.58316 37.26019 Europe/Moscow +43.66974 39.66863 Europe/Moscow +55.9686 43.0912 Europe/Moscow +41.89184 48.41247 Europe/Moscow +58.63667 59.80222 Asia/Yekaterinburg +54.815 58.45917 Asia/Yekaterinburg +62.76409 40.33746 Europe/Moscow +48.5842 45.7338 Europe/Volgograd +53.13333 46.58333 Europe/Moscow +44.64417 41.84528 Europe/Moscow +55.61194 37.29611 Europe/Moscow +55.59911 37.35495 Europe/Moscow +65.99389 57.52806 Europe/Moscow +59.84389 30.45111 Europe/Moscow +43.54437 44.59592 Europe/Moscow +56.5042 66.55153 Asia/Yekaterinburg +53.7074 84.9493 Asia/Omsk +56.811 61.3254 Asia/Yekaterinburg +53.25417 83.69361 Asia/Omsk +54.4418 61.2536 Asia/Yekaterinburg +55.72306 84.88611 Asia/Novokuznetsk +58.44937 92.17968 Asia/Krasnoyarsk +54.75472 61.32083 Asia/Yekaterinburg +56.8519 60.6122 Asia/Yekaterinburg +55.8736 85.4265 Asia/Novokuznetsk +52.9273 78.58 Asia/Omsk +56.65358 66.30058 Asia/Yekaterinburg +67.49884 64.05253 Europe/Moscow +67.58355 63.79399 Europe/Moscow +58.04874 60.55949 Asia/Yekaterinburg +56.97047 60.58219 Asia/Yekaterinburg +56.0556 60.2397 Asia/Yekaterinburg +55.31246 89.83301 Asia/Krasnoyarsk +56.1124 94.5985 Asia/Krasnoyarsk +60.13044 64.78896 Asia/Yekaterinburg +57.15222 65.52722 Asia/Yekaterinburg +58.04575 63.69605 Asia/Yekaterinburg +54.0979 61.5773 Asia/Yekaterinburg +55.2769 85.6163 Asia/Novokuznetsk +56.49771 84.97437 Asia/Novosibirsk +55.23528 84.38583 Asia/Novosibirsk +58.19807 68.25457 Asia/Yekaterinburg +55.9342 98.0044 Asia/Irkutsk +56.06402 85.62238 Asia/Novokuznetsk +58.04254 65.27258 Asia/Yekaterinburg +55.21904 75.98284 Asia/Novosibirsk +52.7657 87.8894 Asia/Novokuznetsk +64.91611 77.77457 Asia/Yekaterinburg +56.89436 74.37096 Asia/Omsk +69.4865 88.3972 Asia/Krasnoyarsk +53.8183 83.5677 Asia/Omsk +56.8804 60.0213 Asia/Yekaterinburg +57.01095 63.73254 Asia/Yekaterinburg +56.50243 60.81917 Asia/Yekaterinburg +53.7841 82.3116 Asia/Novosibirsk +61.25 73.41667 Asia/Yekaterinburg +56.9094 62.0296 Asia/Yekaterinburg +60.7333 77.5889 Asia/Novosibirsk +56.98921 60.46662 Asia/Yekaterinburg +61.36139 63.58417 Asia/Yekaterinburg +56.1217 93.3385 Asia/Krasnoyarsk +52.9978 78.6449 Asia/Omsk +53.325 91.93556 Asia/Krasnoyarsk +55.22611 63.29611 Asia/Yekaterinburg +55.54028 89.20083 Asia/Krasnoyarsk +56.0852 63.6335 Asia/Yekaterinburg +59.60334 60.5787 Asia/Yekaterinburg +53.0875 91.39972 Asia/Krasnoyarsk +66.53 66.60194 Asia/Yekaterinburg +51.51473 81.20613 Asia/Omsk +57.37005 61.40428 Asia/Yekaterinburg +57.09013 61.67692 Asia/Yekaterinburg +54.9159 85.6385 Asia/Novokuznetsk +53.9059 86.719 Asia/Novokuznetsk +61.23333 73.33333 Asia/Yekaterinburg +54.6012 86.2459 Asia/Novokuznetsk +56.44222 60.18778 Asia/Yekaterinburg +54.36914 60.81361 Asia/Yekaterinburg +53.6239 87.3598 Asia/Novokuznetsk +54.99244 73.36859 Asia/Omsk +54.9872 82.7166 Asia/Novosibirsk +62.14056 65.39361 Asia/Yekaterinburg +63.19309 75.43728 Asia/Yekaterinburg +66.08333 76.63333 Asia/Yekaterinburg +53.30972 83.62389 Asia/Omsk +55.0415 82.9346 Asia/Novosibirsk +53.7557 87.1099 Asia/Novokuznetsk +53.3917 83.9363 Asia/Omsk +69.3535 88.2027 Asia/Krasnoyarsk +58.07756 60.7202 Asia/Yekaterinburg +60.9344 76.5531 Asia/Yekaterinburg +54.9076 99.0276 Asia/Irkutsk +57.4953 60.2112 Asia/Yekaterinburg +61.09979 72.60349 Asia/Yekaterinburg +56.0104 90.4011 Asia/Krasnoyarsk +65.53333 72.51667 Asia/Yekaterinburg +53.709 87.8014 Asia/Novokuznetsk +53.71028 91.6875 Asia/Krasnoyarsk +55.045 60.10833 Asia/Yekaterinburg +53.69417 88.06028 Asia/Novokuznetsk +61.0296 76.1136 Asia/Yekaterinburg +52.01577 85.90963 Asia/Omsk +56.21389 87.74722 Asia/Novokuznetsk +54.4589 83.3764 Asia/Novosibirsk +58.23583 92.48278 Asia/Krasnoyarsk +54.6567 86.1737 Asia/Novokuznetsk +66.65722 66.41833 Asia/Yekaterinburg +51.71472 94.45338 Asia/Krasnoyarsk +55.714 60.5528 Asia/Yekaterinburg +55.44753 78.32181 Asia/Novosibirsk +54.91028 64.43194 Asia/Yekaterinburg +55.45 65.33333 Asia/Yekaterinburg +54.36635 77.29805 Asia/Novosibirsk +52.566 78.9385 Asia/Omsk +56.01839 92.86717 Asia/Krasnoyarsk +58.3638 60.0407 Asia/Yekaterinburg +59.7666 60.2086 Asia/Yekaterinburg +54.9198 82.9909 Asia/Novosibirsk +54.8913 61.3969 Asia/Yekaterinburg +55.11722 61.62824 Asia/Yekaterinburg +61.31226 63.33068 Asia/Yekaterinburg +58.31306 82.90889 Asia/Novosibirsk +58.68806 99.18444 Asia/Krasnoyarsk +55.0218 82.202 Asia/Novosibirsk +53.99 86.6621 Asia/Novokuznetsk +57.42972 60.05972 Asia/Yekaterinburg +61.00417 69.00194 Asia/Yekaterinburg +55.33333 86.08333 Asia/Novokuznetsk +55.53333 86.05 Asia/Novokuznetsk +69.37861 87.74389 Asia/Krasnoyarsk +56.289 62.5841 Asia/Yekaterinburg +55.8909 60.7616 Asia/Yekaterinburg +53.05285 60.64903 Asia/Yekaterinburg +59.7703 59.9964 Asia/Yekaterinburg +53.73772 78.04026 Asia/Novosibirsk +55.4808 60.2157 Asia/Yekaterinburg +56.20167 95.7175 Asia/Krasnoyarsk +56.84278 62.71111 Asia/Yekaterinburg +56.4185 61.9329 Asia/Yekaterinburg +53.7884 81.3423 Asia/Omsk +53.5347 87.2457 Asia/Novokuznetsk +55.05286 74.57511 Asia/Omsk +60.69111 60.42056 Asia/Yekaterinburg +54.6366 83.3045 Asia/Novosibirsk +56.11281 69.49015 Asia/Yekaterinburg +57.67052 63.071 Asia/Yekaterinburg +56.2325 96.0652 Asia/Krasnoyarsk +54.28333 85.93333 Asia/Novokuznetsk +50.99417 81.46611 Asia/Omsk +51.96056 85.91892 Asia/Omsk +69.40583 86.17778 Asia/Krasnoyarsk +55.9581 92.3726 Asia/Krasnoyarsk +56.704 60.0879 Asia/Yekaterinburg +56.0815 99.6342 Asia/Irkutsk +53.82361 91.28417 Asia/Krasnoyarsk +54.2222 83.381 Asia/Novosibirsk +55.15402 61.42915 Asia/Yekaterinburg +54.9749 60.3633 Asia/Yekaterinburg +57.04096 65.72018 Asia/Yekaterinburg +55.9061 94.9079 Asia/Krasnoyarsk +55.67167 84.39806 Asia/Novosibirsk +56.20778 89.53417 Asia/Krasnoyarsk +56.78028 62.04944 Asia/Yekaterinburg +52.53639 85.20722 Asia/Omsk +56.9083 60.8019 Asia/Yekaterinburg +55.6 86.2 Asia/Novokuznetsk +56.03044 93.11164 Asia/Krasnoyarsk +54.7551 83.0967 Asia/Novosibirsk +63.71194 66.67222 Asia/Yekaterinburg +54.4165 86.2976 Asia/Novokuznetsk +53.36056 83.76361 Asia/Omsk +55.35709 78.35697 Asia/Novosibirsk +56.99987 86.14393 Asia/Novosibirsk +57.00993 61.45776 Asia/Yekaterinburg +57.3555 61.86865 Asia/Yekaterinburg +56.6977 60.8369 Asia/Yekaterinburg +56.081 86.0285 Asia/Novokuznetsk +52.4926 82.7822 Asia/Omsk +57.85158 61.69627 Asia/Yekaterinburg +54.8523 83.106 Asia/Novosibirsk +56.2694 90.4993 Asia/Krasnoyarsk +52.655 90.09278 Asia/Krasnoyarsk +53.71556 91.42917 Asia/Krasnoyarsk +56.085 60.73139 Asia/Yekaterinburg +55.75556 60.70278 Asia/Yekaterinburg +56.25111 93.53194 Asia/Krasnoyarsk +57.24389 60.08389 Asia/Yekaterinburg +56.60056 84.88639 Asia/Novosibirsk +64.434 76.50261 Asia/Yekaterinburg +62.09611 77.475 Asia/Yekaterinburg +63.78977 74.52301 Asia/Yekaterinburg +61.61945 72.15546 Asia/Yekaterinburg +53.9202 102.0442 Asia/Irkutsk +56.5768 104.1217 Asia/Irkutsk +53.73601 127.257 Asia/Yakutsk +62.03389 129.73306 Asia/Yakutsk +47.53758 134.75556 Asia/Vladivostok +42.73021 133.08322 Asia/Vladivostok +43.10562 131.87353 Asia/Vladivostok +56.12128 101.17767 Asia/Irkutsk +56.7938 105.7672 Asia/Irkutsk +58.00056 102.66194 Asia/Irkutsk +43.80291 131.94578 Asia/Vladivostok +52.75194 103.64528 Asia/Irkutsk +51.82721 107.60627 Asia/Irkutsk +66.42989 112.4021 Asia/Yakutsk +55.156 124.72479 Asia/Yakutsk +54.56358 100.58143 Asia/Irkutsk +43.29823 132.06877 Asia/Vladivostok +42.97429 132.40574 Asia/Vladivostok +51.37525 128.14097 Asia/Yakutsk +44.59884 132.82593 Asia/Vladivostok +51.65944 103.70611 Asia/Irkutsk +52.00575 127.67756 Asia/Yakutsk +52.21389 104.1 Asia/Irkutsk +55.63695 109.32297 Asia/Irkutsk +49.78998 129.40992 Asia/Yakutsk +51.2753 108.843 Asia/Yakutsk +43.12165 133.12347 Asia/Vladivostok +56.66637 124.63825 Asia/Yakutsk +51.98333 116.58333 Asia/Yakutsk +42.81384 132.87348 Asia/Vladivostok +62.53528 113.96111 Asia/Yakutsk +46.47656 134.19532 Asia/Vladivostok +45.47885 133.42825 Asia/Vladivostok +60.72528 114.92778 Asia/Yakutsk +50.35737 106.45033 Asia/Irkutsk +50.0979 118.0369 Asia/Yakutsk +50.55034 137.00995 Asia/Vladivostok +48.48272 135.08379 Asia/Vladivostok +44.27221 135.05227 Asia/Vladivostok +52.29778 104.29639 Asia/Irkutsk +51.28333 106.5 Asia/Irkutsk +45.93149 133.73906 Asia/Vladivostok +52.03171 113.50087 Asia/Yakutsk +53.15611 103.0675 Asia/Irkutsk +50.38333 116.51667 Asia/Yakutsk +43.11283 132.354 Asia/Vladivostok +57.85056 114.19333 Asia/Irkutsk +50.27961 127.5405 Asia/Yakutsk +48.79284 132.92386 Asia/Vladivostok +46.81293 134.25012 Asia/Vladivostok +50.91644 128.47726 Asia/Yakutsk +51.5151 104.1402 Asia/Irkutsk +65.9338 111.4834 Asia/Yakutsk +43.3595 132.18887 Asia/Vladivostok +44.15254 133.27791 Asia/Vladivostok +52.53667 103.88639 Asia/Irkutsk +50.23685 136.88136 Asia/Vladivostok +58.61021 125.39613 Asia/Yakutsk +44.56039 135.57009 Asia/Vladivostok +56.1325 101.61417 Asia/Irkutsk +54.1088 102.1648 Asia/Irkutsk +48.43776 135.13328 Asia/Vladivostok +52.9311 158.40469 Asia/Kamchatka +46.95407 142.73603 Asia/Sakhalin +53.18909 158.38135 Asia/Kamchatka +49.09848 140.25313 Asia/Vladivostok +48.97215 140.28919 Asia/Vladivostok +49.22188 143.09694 Asia/Sakhalin +53.04444 158.65076 Asia/Kamchatka +53.58991 142.95313 Asia/Sakhalin +53.14657 140.72288 Asia/Vladivostok +46.67902 141.8563 Asia/Sakhalin +59.5638 150.80347 Asia/Magadan +46.6342 142.77722 Asia/Sakhalin +47.04737 142.05048 Asia/Sakhalin +54.65455 19.90929 Europe/Kaliningrad +55.59944 37.03861 Europe/Moscow +55.59072 37.59519 Europe/Moscow +55.57657 37.66709 Europe/Moscow +55.61252 37.72639 Europe/Moscow +55.80961 37.78739 Europe/Moscow +62.26537 74.47906 Asia/Yekaterinburg +60.74985 72.85824 Asia/Yekaterinburg +61.25439 75.2124 Asia/Yekaterinburg +57.6198 63.0784 Asia/Yekaterinburg +55.75533 38.09578 Europe/Moscow +56.0038 40.33905 Europe/Moscow +62.43965 71.76029 Asia/Yekaterinburg +61.71982 75.36827 Asia/Yekaterinburg +60.97944 76.92421 Asia/Yekaterinburg +60.16562 29.908 Europe/Moscow +59.98594 30.30338 Europe/Moscow +60.0122 30.20897 Europe/Moscow +59.96567 30.31154 Europe/Moscow +59.94091 30.25377 Europe/Moscow +60.06964 30.3487 Europe/Moscow +59.99675 30.3899 Europe/Moscow +59.97305 30.47607 Europe/Moscow +59.90839 30.28484 Europe/Moscow +59.97091 30.25789 Europe/Moscow +60.01375 30.39471 Europe/Moscow +59.96824 30.36415 Europe/Moscow +59.93111 30.36072 Europe/Moscow +60.00276 30.33051 Europe/Moscow +59.98499 30.34295 Europe/Moscow +55.8801 37.55758 Europe/Moscow +-1.9487 30.4347 Africa/Kigali +-1.49984 29.63497 Africa/Kigali +-2.479 29.5564 Africa/Kigali +-1.94995 30.05885 Africa/Kigali +-2.06028 29.34778 Africa/Kigali +-2.1597 30.5427 Africa/Kigali +-2.07444 29.75667 Africa/Kigali +-2.4846 28.9075 Africa/Kigali +-1.70278 29.25639 Africa/Kigali +-1.5763 30.0675 Africa/Kigali +-2.59667 29.73944 Africa/Kigali +24.08912 38.06374 Asia/Riyadh +25.02126 37.2685 Asia/Riyadh +31.67252 38.66374 Asia/Riyadh +21.21406 41.6331 Asia/Riyadh +26.57332 50.03694 Asia/Riyadh +28.3998 36.5715 Asia/Riyadh +30.49987 38.21603 Asia/Riyadh +24.49258 39.58572 Asia/Riyadh +26.48522 50.04046 Asia/Riyadh +16.59601 42.94435 Asia/Riyadh +29.96974 40.20641 Asia/Riyadh +26.64986 49.95223 Asia/Riyadh +17.1495 42.62537 Asia/Riyadh +26.70791 50.06194 Asia/Riyadh +22.79856 39.03493 Asia/Riyadh +20.00054 42.6052 Asia/Riyadh +17.4924 44.12766 Asia/Riyadh +21.42664 39.82563 Asia/Riyadh +18.3 42.73333 Asia/Riyadh +16.88917 42.55111 Asia/Riyadh +21.54238 39.19797 Asia/Riyadh +27.52188 41.69073 Asia/Riyadh +27.35134 35.69014 Asia/Riyadh +26.32599 43.97497 Asia/Riyadh +25.9371 49.67761 Asia/Riyadh +23.78292 38.79047 Asia/Riyadh +26.29945 44.81542 Asia/Riyadh +26.28864 50.11396 Asia/Riyadh +25.36276 49.72504 Asia/Riyadh +21.27028 40.41583 Asia/Riyadh +20.46067 45.57792 Asia/Riyadh +24.68773 46.72185 Asia/Riyadh +25.86944 43.4973 Asia/Riyadh +30.97531 41.03808 Asia/Riyadh +19.14547 42.1201 Asia/Riyadh +31.33176 37.34282 Asia/Riyadh +26.24551 36.45248 Asia/Riyadh +26.60853 37.92316 Asia/Riyadh +28.31117 46.12729 Asia/Riyadh +26.5208 50.02452 Asia/Riyadh +25.38333 49.66667 Asia/Riyadh +25.41 49.58083 Asia/Riyadh +25.86012 44.22228 Asia/Riyadh +24.46861 39.61417 Asia/Riyadh +26.27944 50.20833 Asia/Riyadh +28.43905 48.49132 Asia/Riyadh +21.61694 39.69806 Asia/Riyadh +27.01122 49.65826 Asia/Riyadh +25.36457 49.56532 Asia/Riyadh +26.14422 43.65933 Asia/Riyadh +25.43333 49.63333 Asia/Riyadh +20.01288 41.46767 Asia/Riyadh +23.9065 42.91724 Asia/Riyadh +23.99146 47.16266 Asia/Riyadh +24.50772 44.39237 Asia/Riyadh +26.43442 50.10326 Asia/Riyadh +16.96887 42.83251 Asia/Riyadh +18.21639 42.50528 Asia/Riyadh +21.0721 40.31185 Asia/Riyadh +26.08427 43.99355 Asia/Riyadh +-9.43333 159.95 Pacific/Guadalcanal +-4.61667 55.45 Indian/Mahe +12.9096 23.47406 Africa/Khartoum +14.40118 33.51989 Africa/Khartoum +12.9061 31.2158 Africa/Khartoum +15.64453 32.47773 Africa/Khartoum +18.4254 37.729 Africa/Khartoum +13.01667 31.86667 Africa/Khartoum +13.15 33.93333 Africa/Khartoum +16.6915 33.4341 Africa/Khartoum +19.1059 37.3321 Africa/Khartoum +13.56907 33.56718 Africa/Khartoum +13.18087 32.73999 Africa/Khartoum +13.41667 33.66667 Africa/Khartoum +13.1629 32.66347 Africa/Khartoum +18.55 31.85 Africa/Khartoum +14.0361 33.1712 Africa/Khartoum +15.45099 36.39998 Africa/Khartoum +11.01667 29.71667 Africa/Khartoum +13.51667 35.76667 Africa/Khartoum +12.05 29.65 Africa/Khartoum +19.61745 37.21644 Africa/Khartoum +18.02158 33.98299 Africa/Khartoum +13.7 30.36667 Africa/Khartoum +17.70217 33.98638 Africa/Khartoum +13.31667 33.88333 Africa/Khartoum +11.8659 34.3869 Africa/Khartoum +12.71667 30.65 Africa/Khartoum +12.7 28.43333 Africa/Khartoum +13.18421 30.21669 Africa/Khartoum +14.8648 32.3668 Africa/Khartoum +14.03493 35.38344 Africa/Khartoum +11.03333 27.73333 Africa/Khartoum +14.2459 32.9891 Africa/Khartoum +15.55177 32.53241 Africa/Khartoum +13.45262 22.44725 Africa/Khartoum +14.9398 33.234 Africa/Khartoum +13.41667 34.63333 Africa/Khartoum +14.75264 33.29836 Africa/Khartoum +13.62793 25.34936 Africa/Khartoum +18.26196 33.90812 Africa/Khartoum +14.0012 32.3116 Africa/Khartoum +11.46186 26.12583 Africa/Khartoum +13.2 34.16667 Africa/Khartoum +17.59278 33.95917 Africa/Khartoum +11.7891 34.3592 Africa/Khartoum +12.35 29.25 Africa/Khartoum +11.4562 31.2285 Africa/Khartoum +63.82842 20.25972 Europe/Stockholm +64.75067 20.95279 Europe/Stockholm +65.31717 21.47944 Europe/Stockholm +65.58415 22.15465 Europe/Stockholm +67.85572 20.22513 Europe/Stockholm +65.82518 21.68864 Europe/Stockholm +55.42966 13.82041 Europe/Stockholm +57.64089 18.29602 Europe/Stockholm +56.87767 14.80906 Europe/Stockholm +57.7584 16.63733 Europe/Stockholm +59.61617 16.55276 Europe/Stockholm +57.18604 14.04001 Europe/Stockholm +57.10557 12.25078 Europe/Stockholm +58.38075 12.3234 Europe/Stockholm +59.53436 18.07758 Europe/Stockholm +59.85882 17.63889 Europe/Stockholm +59.51839 17.91128 Europe/Stockholm +58.34784 11.9424 Europe/Stockholm +59.19858 17.83317 Europe/Stockholm +59.2 17.9 Europe/Stockholm +58.28365 12.28864 Europe/Stockholm +55.37514 13.15691 Europe/Stockholm +59.4439 18.06872 Europe/Stockholm +62.39129 17.3063 Europe/Stockholm +59.36128 17.97114 Europe/Stockholm +59.33258 18.0649 Europe/Stockholm +59.36004 18.00086 Europe/Stockholm +59.42804 17.95093 Europe/Stockholm +59.19554 17.62525 Europe/Stockholm +58.39118 13.84506 Europe/Stockholm +60.61667 16.76667 Europe/Stockholm +59.36667 17.98333 Europe/Stockholm +57.7395 12.10642 Europe/Stockholm +63.1792 14.63566 Europe/Stockholm +59.33879 18.08487 Europe/Stockholm +57.26455 16.44837 Europe/Stockholm +63.29091 18.71525 Europe/Stockholm +59.27412 15.2066 Europe/Stockholm +58.753 17.00788 Europe/Stockholm +59.75799 18.70496 Europe/Stockholm +58.59419 16.1826 Europe/Stockholm +57.65307 14.69676 Europe/Stockholm +59.31053 18.16372 Europe/Stockholm +58.53706 15.03649 Europe/Stockholm +57.6554 12.01378 Europe/Stockholm +59.62157 17.85476 Europe/Stockholm +55.60587 13.00073 Europe/Stockholm +55.70584 13.19321 Europe/Stockholm +58.41086 15.62157 Europe/Stockholm +58.50517 13.15765 Europe/Stockholm +59.36667 18.13333 Europe/Stockholm +57.77051 12.26904 Europe/Stockholm +55.8708 12.83016 Europe/Stockholm +57.48719 12.07612 Europe/Stockholm +57.87096 11.98054 Europe/Stockholm +59.30978 14.10808 Europe/Stockholm +56.03129 14.15242 Europe/Stockholm +59.51404 15.99255 Europe/Stockholm +58.99587 16.20721 Europe/Stockholm +59.3793 13.50357 Europe/Stockholm +56.16156 15.58661 Europe/Stockholm +59.32667 14.52386 Europe/Stockholm +56.1706 14.86188 Europe/Stockholm +56.66157 16.36163 Europe/Stockholm +57.78145 14.15618 Europe/Stockholm +59.42268 17.83508 Europe/Stockholm +57.78596 14.30214 Europe/Stockholm +59.23705 17.98192 Europe/Stockholm +56.04673 12.69437 Europe/Stockholm +56.15905 13.76638 Europe/Stockholm +62.63228 17.93794 Europe/Stockholm +59.16775 18.14478 Europe/Stockholm +56.67446 12.85676 Europe/Stockholm +57.70716 11.96679 Europe/Stockholm +60.67452 17.14174 Europe/Stockholm +60.60357 15.62597 Europe/Stockholm +58.17347 13.55068 Europe/Stockholm +56.90552 12.49118 Europe/Stockholm +55.83928 13.30393 Europe/Stockholm +59.36661 16.5077 Europe/Stockholm +59.63607 17.07768 Europe/Stockholm +59.34 17.94 Europe/Stockholm +60.4858 15.43714 Europe/Stockholm +57.72101 12.9401 Europe/Stockholm +59.33333 18.28333 Europe/Stockholm +59.2978 18.0514 Europe/Stockholm +56.2428 12.86219 Europe/Stockholm +57.93033 12.53345 Europe/Stockholm +59.47944 18.29967 Europe/Stockholm +57.69195 11.91605 Europe/Stockholm +1.28967 103.85007 Asia/Singapore +-15.93872 -5.71675 Atlantic/St_Helena +46.155 15.05333 Europe/Ljubljana +46.35917 15.11028 Europe/Ljubljana +46.42005 15.87018 Europe/Ljubljana +45.80397 15.16886 Europe/Ljubljana +46.55472 15.64667 Europe/Ljubljana +46.05108 14.50513 Europe/Ljubljana +46.23887 14.35561 Europe/Ljubljana +45.54694 13.72944 Europe/Ljubljana +46.23092 15.26044 Europe/Ljubljana +78.22 15.65 Arctic/Longyearbyen +48.88836 21.68479 Europe/Bratislava +48.62858 21.71954 Europe/Bratislava +49.29859 20.6862 Europe/Bratislava +48.94464 20.56154 Europe/Bratislava +48.98857 22.15099 Europe/Bratislava +48.66008 20.53758 Europe/Bratislava +48.38284 20.0224 Europe/Bratislava +48.99839 21.23393 Europe/Bratislava +49.06144 20.29798 Europe/Bratislava +48.75434 21.9195 Europe/Bratislava +48.71395 21.25808 Europe/Bratislava +49.1357 20.43352 Europe/Bratislava +48.93707 21.91625 Europe/Bratislava +49.29175 21.27271 Europe/Bratislava +48.57442 19.15324 Europe/Bratislava +48.38553 18.40063 Europe/Bratislava +49.22315 18.73941 Europe/Bratislava +48.59184 18.84958 Europe/Bratislava +48.3774 17.58723 Europe/Bratislava +48.89452 18.04436 Europe/Bratislava +48.8449 17.22635 Europe/Bratislava +48.67922 17.36697 Europe/Bratislava +48.15127 17.88062 Europe/Bratislava +49.0748 19.30751 Europe/Bratislava +49.12494 18.32596 Europe/Bratislava +48.77446 18.6275 Europe/Bratislava +49.12153 18.42169 Europe/Bratislava +48.59479 17.82591 Europe/Bratislava +48.28986 17.26664 Europe/Bratislava +48.62861 18.38456 Europe/Bratislava +47.98544 18.16195 Europe/Bratislava +48.75763 17.8309 Europe/Bratislava +48.30763 18.08453 Europe/Bratislava +49.06651 18.92399 Europe/Bratislava +48.43604 17.02188 Europe/Bratislava +48.33249 19.66708 Europe/Bratislava +49.08061 19.62218 Europe/Bratislava +48.21563 18.60705 Europe/Bratislava +49.3 18.78333 Europe/Bratislava +47.76356 18.12263 Europe/Bratislava +48.43174 17.8031 Europe/Bratislava +48.7276 18.76012 Europe/Bratislava +48.19001 17.72747 Europe/Bratislava +47.99268 17.61211 Europe/Bratislava +48.95981 18.16634 Europe/Bratislava +49.20983 19.30341 Europe/Bratislava +48.56082 19.41954 Europe/Bratislava +49.43503 18.78895 Europe/Bratislava +48.80431 19.63631 Europe/Bratislava +48.14816 17.10674 Europe/Bratislava +48.73946 19.15349 Europe/Bratislava +48.7213 18.25754 Europe/Bratislava +8.33833 -13.07194 Africa/Freetown +8 -10.95 Africa/Freetown +8.76667 -12.78333 Africa/Freetown +8.88333 -12.05 Africa/Freetown +8.68333 -12.53333 Africa/Freetown +8.63333 -10.98333 Africa/Freetown +7.87667 -11.1875 Africa/Freetown +9.58333 -11.55 Africa/Freetown +8.484 -13.22994 Africa/Freetown +7.96472 -11.73833 Africa/Freetown +43.93667 12.44639 Europe/San_Marino +12.58333 -16.27194 Africa/Dakar +13.15 -14.11667 Africa/Dakar +14.85 -15.88333 Africa/Dakar +14.63333 -16.23333 Africa/Dakar +14.78333 -16.96667 Africa/Dakar +13.77073 -13.66734 Africa/Dakar +12.70806 -15.55694 Africa/Dakar +16.01793 -16.48962 Africa/Dakar +16.4625 -15.70083 Africa/Dakar +14.77099 -17.06107 Africa/Dakar +14.35 -16.41667 Africa/Dakar +14.76457 -17.39071 Africa/Dakar +13.75 -15.8 Africa/Dakar +14.51255 -17.00447 Africa/Dakar +15.3338 -15.4766 Africa/Dakar +15.1097 -16.6218 Africa/Dakar +14.79032 -15.90803 Africa/Dakar +15.65587 -13.25544 Africa/Dakar +15.61867 -16.22436 Africa/Dakar +12.88333 -14.95 Africa/Dakar +12.5579 -12.1743 Africa/Dakar +14.91893 -17.11978 Africa/Dakar +14.1825 -16.25333 Africa/Dakar +14.10594 -15.5508 Africa/Dakar +14.16667 -16.83333 Africa/Dakar +14.26667 -15.95 Africa/Dakar +14.71331 -17.45472 Africa/Dakar +15.34844 -15.47993 Africa/Dakar +14.6937 -17.44406 Africa/Dakar +12.81028 -16.22639 Africa/Dakar +2.6185 44.8938 Africa/Mogadishu +1.78784 44.52999 Africa/Mogadishu +11.47197 49.87282 Africa/Mogadishu +2.03711 45.34375 Africa/Mogadishu +1.71594 44.77166 Africa/Mogadishu +3.79376 42.5445 Africa/Mogadishu +-0.35817 42.54536 Africa/Mogadishu +0.48829 42.78535 Africa/Mogadishu +2.78087 45.50048 Africa/Mogadishu +0.06968 42.74497 Africa/Mogadishu +9.56 44.065 Africa/Mogadishu +8.40207 48.48284 Africa/Mogadishu +6.76972 47.43083 Africa/Mogadishu +7.9803 49.8164 Africa/Mogadishu +10.61616 47.36795 Africa/Mogadishu +3.84878 47.18064 Africa/Mogadishu +2.80257 44.07806 Africa/Mogadishu +3.85375 45.56744 Africa/Mogadishu +9.52212 45.53363 Africa/Mogadishu +11.28421 49.18158 Africa/Mogadishu +10.43959 45.01432 Africa/Mogadishu +4.73583 45.20361 Africa/Mogadishu +3.11383 43.6498 Africa/Mogadishu +2.34464 42.27644 Africa/Mogadishu +2.1381 45.1212 Africa/Mogadishu +8.47738 47.35971 Africa/Mogadishu +9.89206 43.38531 Africa/Mogadishu +5.86638 -55.16682 America/Paramaribo +5.7 -55.23333 America/Paramaribo +4.09504 30.67792 Africa/Juba +4.57213 28.39549 Africa/Juba +7.70286 27.9953 Africa/Juba +8.76816 27.40019 Africa/Juba +4.41177 32.57046 Africa/Juba +7.27369 28.68223 Africa/Juba +6.80619 29.67742 Africa/Juba +9.53342 31.66048 Africa/Juba +4.85165 31.58247 Africa/Juba +8.53324 28.10037 Africa/Juba +3.86512 32.48212 Africa/Juba +6.20593 31.55633 Africa/Juba +0.33654 6.72732 Africa/Sao_Tome +13.5 -88.86667 America/El_Salvador +13.35 -88.45 America/El_Salvador +13.73472 -89.15139 America/El_Salvador +13.73417 -89.71472 America/El_Salvador +13.71889 -89.72417 America/El_Salvador +13.86667 -88.63333 America/El_Salvador +13.63333 -88.8 America/El_Salvador +13.48333 -88.46667 America/El_Salvador +13.99417 -89.55972 America/El_Salvador +13.68935 -89.18718 America/El_Salvador +13.38333 -88.35 America/El_Salvador +13.48333 -88.18333 America/El_Salvador +13.78333 -88.91667 America/El_Salvador +13.65889 -89.18306 America/El_Salvador +13.7 -88.1 America/El_Salvador +13.835 -89.27444 America/El_Salvador +13.28333 -88.55 America/El_Salvador +13.67694 -89.27972 America/El_Salvador +14.33333 -89.45 America/El_Salvador +13.74028 -89.21306 America/El_Salvador +13.33694 -87.84389 America/El_Salvador +13.48833 -89.32222 America/El_Salvador +13.74472 -89.67306 America/El_Salvador +13.70167 -89.10944 America/El_Salvador +13.72417 -89.17028 America/El_Salvador +13.73611 -89.18139 America/El_Salvador +13.71667 -88.93333 America/El_Salvador +13.98667 -89.68111 America/El_Salvador +14.03333 -88.93333 America/El_Salvador +13.74556 -89.20639 America/El_Salvador +13.80722 -89.17917 America/El_Salvador +13.67306 -89.24083 America/El_Salvador +13.92139 -89.845 America/El_Salvador +13.95722 -89.18972 America/El_Salvador +13.59278 -89.8275 America/El_Salvador +18.026 -63.04582 America/Lower_Princes +33.96736 36.65741 Asia/Damascus +35.26592 36.71219 Asia/Damascus +34.88902 35.88659 Asia/Damascus +36.47362 37.09672 Asia/Damascus +34.66842 36.25995 Asia/Damascus +34.84063 36.73093 Asia/Damascus +32.73564 36.06694 Asia/Damascus +34.56077 38.28055 Asia/Damascus +36.34814 37.5309 Asia/Damascus +35.29193 36.74848 Asia/Damascus +34.85444 40.60833 Asia/Damascus +32.82944 36.15933 Asia/Damascus +35.86447 36.80591 Asia/Damascus +36.13951 36.45413 Asia/Damascus +35.01127 37.05324 Asia/Damascus +34.81836 36.11376 Asia/Damascus +33.43646 36.07757 Asia/Damascus +32.99233 36.06018 Asia/Damascus +34.1527 36.74152 Asia/Damascus +36.37867 36.99294 Asia/Damascus +35.0653 36.3406 Asia/Damascus +36.52815 37.95495 Asia/Damascus +36.01152 36.67183 Asia/Damascus +35.44208 36.65095 Asia/Damascus +35.37425 36.6033 Asia/Damascus +36.1168 36.51522 Asia/Damascus +35.61376 36.56449 Asia/Damascus +34.89469 36.49582 Asia/Damascus +35.81426 36.32062 Asia/Damascus +33.8074 36.74036 Asia/Damascus +36.8175 38.01111 Asia/Damascus +35.36211 35.92759 Asia/Damascus +33.53719 36.36635 Asia/Damascus +33.01797 36.12806 Asia/Damascus +35.93062 36.63393 Asia/Damascus +34.72682 36.72339 Asia/Damascus +33.55869 36.36515 Asia/Damascus +35.13179 36.75783 Asia/Damascus +35.26014 36.60581 Asia/Damascus +36.20124 37.16117 Asia/Damascus +33.57175 36.4027 Asia/Damascus +33.5102 36.29128 Asia/Damascus +36.15694 37.70778 Asia/Damascus +35.33588 40.14084 Asia/Damascus +37.07279 40.65199 Asia/Damascus +33.45834 36.23256 Asia/Damascus +32.61889 36.10213 Asia/Damascus +35.95664 36.7138 Asia/Damascus +35.18188 35.94871 Asia/Damascus +33.72488 36.1005 Asia/Damascus +36.58662 37.04628 Asia/Damascus +33.61033 36.3107 Asia/Damascus +35.83453 38.54659 Asia/Damascus +32.70896 36.56951 Asia/Damascus +33.07227 36.18382 Asia/Damascus +36.07696 37.37251 Asia/Damascus +34.92653 36.73238 Asia/Damascus +35.95283 39.00788 Asia/Damascus +34.02547 36.72837 Asia/Damascus +33.73848 36.60071 Asia/Damascus +34.50914 36.57975 Asia/Damascus +33.12594 35.82461 Asia/Damascus +34.22956 37.24066 Asia/Damascus +35.02089 40.45346 Asia/Damascus +35.53168 35.79011 Asia/Damascus +33.3581 36.2419 Asia/Damascus +36.50237 40.74772 Asia/Damascus +32.74932 36.30994 Asia/Damascus +36.36994 37.51788 Asia/Damascus +36.51194 36.86954 Asia/Damascus +36.21252 36.76978 Asia/Damascus +34.45 40.91861 Asia/Damascus +34.6927 40.827 Asia/Damascus +-26.31667 31.13333 Africa/Mbabane +-26.49884 31.38004 Africa/Mbabane +-26.46667 31.2 Africa/Mbabane +21.46122 -71.14188 America/Grand_Turk +17.1832 21.58862 Africa/Ndjamena +11.0297 20.2827 Africa/Ndjamena +13.82916 20.8324 Africa/Ndjamena +9.1429 18.3923 Africa/Ndjamena +9.3642 14.9046 Africa/Ndjamena +13.2954 19.6966 Africa/Ndjamena +12.10672 15.0444 Africa/Ndjamena +13.64084 16.49007 Africa/Ndjamena +8.56667 16.08333 Africa/Ndjamena +12.18441 18.69303 Africa/Ndjamena +9.7639 14.1539 Africa/Ndjamena +12.996 15.72927 Africa/Ndjamena +12.47554 15.43647 Africa/Ndjamena +14.12116 15.3103 Africa/Ndjamena +9.3952 16.2989 Africa/Ndjamena +9.45149 18.94493 Africa/Ndjamena +8.91256 17.55392 Africa/Ndjamena +9.30859 15.80658 Africa/Ndjamena +11.80909 15.86323 Africa/Ndjamena +8.65 16.85 Africa/Ndjamena +10.28056 15.37222 Africa/Ndjamena +11.9801 18.2138 Africa/Ndjamena +8.98327 16.31991 Africa/Ndjamena +13.2154 18.3353 Africa/Ndjamena +-49.35 70.21667 Indian/Kerguelen +6.33333 1.53333 Africa/Lome +6.42611 1.21333 Africa/Lome +9.03333 1.41667 Africa/Lome +8.5634 0.98399 Africa/Lome +8.98333 1.13333 Africa/Lome +6.95 1.16667 Africa/Lome +9.76806 1.10528 Africa/Lome +10.35917 0.47083 Africa/Lome +6.13748 1.21227 Africa/Lome +6.9 0.63333 Africa/Lome +9.55111 1.18611 Africa/Lome +10.86225 0.20762 Africa/Lome +9.26021 0.78106 Africa/Lome +9.35 1.26667 Africa/Lome +7.58333 0.6 Africa/Lome +7.53333 1.13333 Africa/Lome +6.23333 1.6 Africa/Lome +7.88481 98.40008 Asia/Bangkok +7.88489 98.38557 Asia/Bangkok +12.27081 99.87203 Asia/Bangkok +13.11189 99.94467 Asia/Bangkok +7.55633 99.61141 Asia/Bangkok +8.16453 99.68039 Asia/Bangkok +17.61289 99.21612 Asia/Bangkok +15.46063 99.89166 Asia/Bangkok +13.96118 99.64122 Asia/Bangkok +13.9 99.76667 Asia/Bangkok +16.86968 99.12898 Asia/Bangkok +9.14011 99.33311 Asia/Bangkok +17.00778 99.823 Asia/Bangkok +17.51692 99.75978 Asia/Bangkok +17.31597 99.83186 Asia/Bangkok +18.62828 98.89572 Asia/Bangkok +18.74486 99.11953 Asia/Bangkok +8.17911 99.85425 Asia/Bangkok +13.53671 99.81712 Asia/Bangkok +9.96583 98.63476 Asia/Bangkok +12.38487 99.90158 Asia/Bangkok +11.82098 99.7841 Asia/Bangkok +9.11072 99.23208 Asia/Bangkok +7.89059 98.3981 Asia/Bangkok +13.69234 99.84969 Asia/Bangkok +19.19203 99.87883 Asia/Bangkok +18.52617 98.93936 Asia/Bangkok +8.43333 99.96667 Asia/Bangkok +16.71667 98.56667 Asia/Bangkok +20.43353 99.87617 Asia/Bangkok +16.98403 98.51665 Asia/Bangkok +20.14675 99.85256 Asia/Bangkok +15.751 99.78925 Asia/Bangkok +9.94561 99.07847 Asia/Bangkok +18.58054 99.00745 Asia/Bangkok +18.29232 99.49277 Asia/Bangkok +12.08283 99.85431 Asia/Bangkok +8.07257 98.91052 Asia/Bangkok +13.24025 99.82428 Asia/Bangkok +16.0617 99.86058 Asia/Bangkok +7.91779 98.33322 Asia/Bangkok +14.00412 99.54832 Asia/Bangkok +16.48344 99.52153 Asia/Bangkok +7.78937 99.63469 Asia/Bangkok +12.57065 99.95876 Asia/Bangkok +18.68703 98.91939 Asia/Bangkok +19.16242 99.99342 Asia/Bangkok +13.51824 99.95469 Asia/Bangkok +10.4957 99.17971 Asia/Bangkok +13.62 99.59169 Asia/Bangkok +19.90858 99.8325 Asia/Bangkok +18.79038 98.98468 Asia/Bangkok +12.8 99.96667 Asia/Bangkok +14.32517 99.51467 Asia/Bangkok +17.04325 99.08128 Asia/Bangkok +9.53567 99.93567 Asia/Bangkok +13.81629 99.87739 Asia/Bangkok +8.80036 99.36372 Asia/Bangkok +17.01717 99.73283 Asia/Bangkok +11.21259 99.51167 Asia/Bangkok +13.69157 99.92982 Asia/Bangkok +16.65 103.3 Asia/Bangkok +17.2675 103.22472 Asia/Bangkok +7.20411 100.54508 Asia/Bangkok +14.98333 102.65 Asia/Bangkok +13.64172 100.83272 Asia/Bangkok +17.3072 102.18886 Asia/Bangkok +15.79408 104.1451 Asia/Bangkok +6.86617 101.36894 Asia/Bangkok +6.53995 101.28128 Asia/Bangkok +14.5945 100.33825 Asia/Bangkok +15.65778 101.10603 Asia/Bangkok +15.19319 104.8628 Asia/Bangkok +17.30097 101.7685 Asia/Bangkok +14.22689 100.7155 Asia/Bangkok +13.50325 102.18115 Asia/Bangkok +17.62557 100.09421 Asia/Bangkok +15.37939 100.0245 Asia/Bangkok +17.41567 102.78589 Asia/Bangkok +15.23844 104.84866 Asia/Bangkok +12.24364 102.51514 Asia/Bangkok +12.95772 99.90555 Asia/Bangkok +14.56739 100.72598 Asia/Bangkok +16.16003 100.59656 Asia/Bangkok +12.62137 102.0048 Asia/Bangkok +17.85003 102.58139 Asia/Bangkok +16.22094 100.41978 Asia/Bangkok +6.25947 102.05461 Asia/Bangkok +14.88181 103.49364 Asia/Bangkok +14.47418 100.12218 Asia/Bangkok +6.02977 101.96586 Asia/Bangkok +7.19882 100.5951 Asia/Bangkok +15.11481 104.32938 Asia/Bangkok +13.17372 100.93111 Asia/Bangkok +14.88786 100.40464 Asia/Bangkok +17.92851 103.95519 Asia/Bangkok +17.47531 103.45753 Asia/Bangkok +6.62314 100.06676 Asia/Bangkok +12.66644 100.90073 Asia/Bangkok +14.53333 100.91667 Asia/Bangkok +13.41456 100.00264 Asia/Bangkok +13.54753 100.27362 Asia/Bangkok +13.59934 100.59675 Asia/Bangkok +13.72698 100.21526 Asia/Bangkok +17.16116 104.14725 Asia/Bangkok +13.81411 102.07222 Asia/Bangkok +6.63883 100.42342 Asia/Bangkok +16.0567 103.65309 Asia/Bangkok +12.68095 101.25798 Asia/Bangkok +7.77768 100.32134 Asia/Bangkok +6.29678 101.72844 Asia/Bangkok +14.60592 103.12081 Asia/Bangkok +14.04992 101.36864 Asia/Bangkok +16.88425 101.88467 Asia/Bangkok +16.3765 102.12853 Asia/Bangkok +13.65854 100.53362 Asia/Bangkok +14.72526 100.79536 Asia/Bangkok +14.35167 100.57739 Asia/Bangkok +18.14589 100.14103 Asia/Bangkok +18.03333 103.16667 Asia/Bangkok +16.82481 100.25858 Asia/Bangkok +16.44184 100.34879 Asia/Bangkok +15.24467 105.22908 Asia/Bangkok +16.41904 101.16056 Asia/Bangkok +7.61786 100.07792 Asia/Bangkok +13.46804 101.09532 Asia/Bangkok +13.74787 101.3553 Asia/Bangkok +13.44581 101.18445 Asia/Bangkok +14.45736 100.36989 Asia/Bangkok +6.86814 101.25009 Asia/Bangkok +14.01346 100.53049 Asia/Bangkok +8.35109 100.20195 Asia/Bangkok +13.91301 100.49883 Asia/Bangkok +14.70802 101.41614 Asia/Bangkok +13.86075 100.51477 Asia/Bangkok +15.18014 102.25694 Asia/Bangkok +15.99025 101.06183 Asia/Bangkok +17.87847 102.742 Asia/Bangkok +14.34062 100.86733 Asia/Bangkok +17.20406 102.44068 Asia/Bangkok +6.42639 101.82308 Asia/Bangkok +14.6377 102.79138 Asia/Bangkok +18.78378 100.77899 Asia/Bangkok +17.77036 102.18947 Asia/Bangkok +15.70472 100.13717 Asia/Bangkok +14.97066 102.10196 Asia/Bangkok +17.41081 104.77856 Asia/Bangkok +13.8196 100.04427 Asia/Bangkok +14.20463 101.21295 Asia/Bangkok +14.46281 100.60832 Asia/Bangkok +16.54531 104.72351 Asia/Bangkok +16.18483 103.30067 Asia/Bangkok +14.79808 100.65397 Asia/Bangkok +16.77983 101.24225 Asia/Bangkok +17.49052 101.72749 Asia/Bangkok +12.48164 102.07375 Asia/Bangkok +17.4257 102.56692 Asia/Bangkok +16.541 104.05004 Asia/Bangkok +13.75398 100.50144 Asia/Bangkok +13.6533 100.25972 Asia/Bangkok +12.77972 101.64831 Asia/Bangkok +16.44671 102.833 Asia/Bangkok +14.52541 102.24591 Asia/Bangkok +14.06467 100.64578 Asia/Bangkok +16.70008 104.0902 Asia/Bangkok +15.65558 103.58361 Asia/Bangkok +16.28053 101.95422 Asia/Bangkok +14.64056 104.64992 Asia/Bangkok +16.33839 103.57564 Asia/Bangkok +16.43281 103.50658 Asia/Bangkok +14.58617 100.99758 Asia/Bangkok +16.10864 102.25808 Asia/Bangkok +13.95114 101.71769 Asia/Bangkok +7.00836 100.47668 Asia/Bangkok +14.90598 105.07836 Asia/Bangkok +17.98372 100.05217 Asia/Bangkok +15.2085 101.77138 Asia/Bangkok +16.5443 102.09924 Asia/Bangkok +16.18953 100.85958 Asia/Bangkok +13.3622 100.98345 Asia/Bangkok +14.72844 102.16524 Asia/Bangkok +12.60961 102.10447 Asia/Bangkok +15.81047 102.02881 Asia/Bangkok +15.18636 100.12353 Asia/Bangkok +15.2 101.13333 Asia/Bangkok +13.6882 101.07156 Asia/Bangkok +14.99433 103.10392 Asia/Bangkok +15.58552 102.42587 Asia/Bangkok +5.77434 101.07231 Asia/Bangkok +16.01667 103.95 Asia/Bangkok +14.02775 100.75603 Asia/Bangkok +12.93333 100.88333 Asia/Bangkok +17.14272 102.97261 Asia/Bangkok +16.05997 102.73097 Asia/Bangkok +13.59072 100.10748 Asia/Bangkok +14.61544 100.72731 Asia/Bangkok +13.97738 100.77776 Asia/Bangkok +16.75847 100.11742 Asia/Bangkok +14.892 100.31728 Asia/Bangkok +13.54297 100.99333 Asia/Bangkok +14.22783 100.57589 Asia/Bangkok +16.02781 100.37917 Asia/Bangkok +14.02188 100.17183 Asia/Bangkok +13.04704 100.92891 Asia/Bangkok +13.805 100.47283 Asia/Bangkok +16.57831 100.30034 Asia/Bangkok +13.91783 100.42403 Asia/Bangkok +14.37394 100.48528 Asia/Bangkok +17.699 103.25957 Asia/Bangkok +12.72543 101.0553 Asia/Bangkok +13.311 101.11214 Asia/Bangkok +13.07147 101.00314 Asia/Bangkok +13.99904 100.54962 Asia/Bangkok +13.58333 100.81667 Asia/Bangkok +13.69276 102.50128 Asia/Bangkok +15.85851 104.62883 Asia/Bangkok +14.89944 101.70833 Asia/Bangkok +7.8894 98.38523 Asia/Bangkok +7.84468 98.33897 Asia/Bangkok +7.90963 98.40248 Asia/Bangkok +38.31408 69.03784 Asia/Dushanbe +37.80396 69.64416 Asia/Dushanbe +37.71485 68.83456 Asia/Dushanbe +39.9142 69.00328 Asia/Dushanbe +38.51437 68.23327 Asia/Dushanbe +37.83399 68.78186 Asia/Dushanbe +39.49524 67.60931 Asia/Dushanbe +37.49219 69.40356 Asia/Dushanbe +38.55632 69.01354 Asia/Dushanbe +38.38917 69.32272 Asia/Dushanbe +37.91458 69.78454 Asia/Dushanbe +37.58823 68.65886 Asia/Dushanbe +37.48974 71.55304 Asia/Dushanbe +36.72484 71.61331 Asia/Dushanbe +38.52504 68.55124 Asia/Dushanbe +38.53575 68.77905 Asia/Dushanbe +38.09578 69.33998 Asia/Dushanbe +37.61453 69.70525 Asia/Dushanbe +38.46613 68.80533 Asia/Dushanbe +40.16713 69.50163 Asia/Dushanbe +40.28256 69.62216 Asia/Dushanbe +40.29414 70.43122 Asia/Dushanbe +40.12648 70.62526 Asia/Dushanbe +40.23417 69.69481 Asia/Dushanbe +-9.31286 125.25648 Asia/Dili +-8.61194 125.20611 Asia/Dili +-8.99167 125.21972 Asia/Dili +-8.5875 125.34194 Asia/Dili +-8.55861 125.57361 Asia/Dili +-8.47111 126.45833 Asia/Dili +-8.72806 125.56639 Asia/Dili +-9.00581 125.64617 Asia/Dili +-8.51861 127.0025 Asia/Dili +-8.64306 126.37833 Asia/Dili +39.51075 54.36713 Asia/Ashgabat +37.34821 59.61431 Asia/Ashgabat +39.20611 54.59056 Asia/Ashgabat +39.24463 55.51536 Asia/Ashgabat +38.05067 58.20559 Asia/Ashgabat +38.43624 57.43158 Asia/Ashgabat +37.95 58.38333 Asia/Ashgabat +37.88757 58.516 Asia/Ashgabat +41.83333 59.65 Asia/Ashgabat +41.65041 59.9164 Asia/Ashgabat +40.02216 52.95518 Asia/Ashgabat +42.32773 59.15442 Asia/Ashgabat +42.12824 59.67101 Asia/Ashgabat +41.83625 59.96662 Asia/Ashgabat +37.29886 62.35975 Asia/Ashgabat +37.38338 60.50544 Asia/Ashgabat +39.4816 62.91374 Asia/Ashgabat +38.78392 63.88035 Asia/Ashgabat +37.59378 61.83031 Asia/Ashgabat +37.83574 65.21058 Asia/Ashgabat +37.81244 66.04656 Asia/Ashgabat +39.07328 63.57862 Asia/Ashgabat +37.61852 62.16715 Asia/Ashgabat +41.18746 61.4036 Asia/Ashgabat +36.40291 10.14292 Africa/Tunis +36.83408 10.04057 Africa/Tunis +36.81897 10.16579 Africa/Tunis +33.91968 8.13352 Africa/Tunis +32.92967 10.45177 Africa/Tunis +35.57244 8.67031 Africa/Tunis +36.78333 10.63333 Africa/Tunis +35.89174 8.55276 Africa/Tunis +35.82539 10.63699 Africa/Tunis +36.08497 9.37082 Africa/Tunis +35.03823 9.48494 Africa/Tunis +35.78333 10.8 Africa/Tunis +34.74056 10.76028 Africa/Tunis +36.67931 10.29195 Africa/Tunis +36.76806 10.27528 Africa/Tunis +35.41808 10.99475 Africa/Tunis +36.57861 10.85861 Africa/Tunis +36.84757 11.09386 Africa/Tunis +33.70439 8.96903 Africa/Tunis +35.64773 10.89046 Africa/Tunis +36.86108 10.33161 Africa/Tunis +36.37419 9.90651 Africa/Tunis +37.0629 10.11829 Africa/Tunis +34.425 8.78417 Africa/Tunis +33.88146 10.0982 Africa/Tunis +33.87309 7.87765 Africa/Tunis +36.45606 10.73763 Africa/Tunis +33.80813 10.99228 Africa/Tunis +37.04045 9.66557 Africa/Tunis +35.72917 10.58082 Africa/Tunis +37.23618 9.91448 Africa/Tunis +36.68312 10.58431 Africa/Tunis +37.15368 9.78594 Africa/Tunis +37.23737 9.86313 Africa/Tunis +36.80803 10.0972 Africa/Tunis +36.64964 9.61231 Africa/Tunis +33.35495 10.50548 Africa/Tunis +36.50114 8.78024 Africa/Tunis +33.50398 11.11216 Africa/Tunis +35.62231 10.75696 Africa/Tunis +33.87576 10.85745 Africa/Tunis +35.8609 10.60313 Africa/Tunis +36.72866 10.34163 Africa/Tunis +36.81806 10.305 Africa/Tunis +33.46632 9.0203 Africa/Tunis +37.16667 9.75 Africa/Tunis +36.46798 10.75167 Africa/Tunis +36.75306 10.21889 Africa/Tunis +37.27442 9.87391 Africa/Tunis +36.46917 10.78222 Africa/Tunis +36.72564 9.18169 Africa/Tunis +35.50056 11.06056 Africa/Tunis +35.23722 11.115 Africa/Tunis +36.86012 10.19337 Africa/Tunis +34.3827 8.15549 Africa/Tunis +35.70915 10.67397 Africa/Tunis +35.6781 10.09633 Africa/Tunis +35.16758 8.83651 Africa/Tunis +34.75 10.78333 Africa/Tunis +35.77799 10.82617 Africa/Tunis +36.67446 10.15633 Africa/Tunis +34.32081 8.40158 Africa/Tunis +36.87818 10.32466 Africa/Tunis +35.50472 11.06222 Africa/Tunis +36.17424 8.70486 Africa/Tunis +35.3 10.71667 Africa/Tunis +36.4 10.61667 Africa/Tunis +33.89152 9.79629 Africa/Tunis +35.61739 10.99466 Africa/Tunis +37.1691 10.03478 Africa/Tunis +35.8691 10.5653 Africa/Tunis +36.44766 10.7557 Africa/Tunis +-21.13938 -175.2018 Pacific/Tongatapu +37.57362 44.28716 Europe/Istanbul +39.82 34.80444 Europe/Istanbul +37.3405 40.82558 Europe/Istanbul +36.95589 36.2 Europe/Istanbul +39.63806 34.46722 Europe/Istanbul +37.38496 27.25643 Europe/Istanbul +37.34026 28.14279 Europe/Istanbul +38.29556 31.17778 Europe/Istanbul +38.10228 35.35704 Europe/Istanbul +37.23528 39.76306 Europe/Istanbul +39.17321 41.45593 Europe/Istanbul +38.49239 43.38311 Europe/Istanbul +39.71011 39.70213 Europe/Istanbul +38.67351 29.4058 Europe/Istanbul +38.32292 26.76403 Europe/Istanbul +38.6296 34.91198 Europe/Istanbul +37.16708 38.79392 Europe/Istanbul +38.49533 27.6997 Europe/Istanbul +39.10829 39.54711 Europe/Istanbul +38.1519 27.36223 Europe/Istanbul +38.08877 27.73508 Europe/Istanbul +36.5017 30.52723 Europe/Istanbul +39.54237 29.49866 Europe/Istanbul +38.50667 42.28167 Europe/Istanbul +36.91876 34.8784 Europe/Istanbul +38.6908 35.5538 Europe/Istanbul +39.91361 28.15778 Europe/Istanbul +36.97614 38.42495 Europe/Istanbul +39.81012 35.18596 Europe/Istanbul +39.18554 27.60945 Europe/Istanbul +38.96338 41.02931 Europe/Istanbul +37.7482 27.40614 Europe/Istanbul +37.75502 39.31667 Europe/Istanbul +39.74833 37.01611 Europe/Istanbul +37.52278 42.45944 Europe/Istanbul +39.0882 28.97767 Europe/Istanbul +38.14194 41.00806 Europe/Istanbul +37.24972 42.46944 Europe/Istanbul +36.37778 33.93444 Europe/Istanbul +37.93262 41.94025 Europe/Istanbul +37.41926 31.84527 Europe/Istanbul +36.36139 36.21361 Europe/Istanbul +36.91694 31.09889 Europe/Istanbul +38.93925 33.5386 Europe/Istanbul +38.10444 30.54861 Europe/Istanbul +37.30514 44.5742 Europe/Istanbul +37.95137 27.36849 Europe/Istanbul +38.19686 26.83902 Europe/Istanbul +39.35186 36.40976 Europe/Istanbul +38.07944 31.36639 Europe/Istanbul +37.92448 28.92516 Europe/Istanbul +38.46472 30.26946 Europe/Istanbul +38.48258 28.14774 Europe/Istanbul +36.26917 36.56722 Europe/Istanbul +39.57716 32.14132 Europe/Istanbul +37.48685 37.29961 Europe/Istanbul +39.23361 42.86344 Europe/Istanbul +39.98031 41.67635 Europe/Istanbul +37.07417 36.24778 Europe/Istanbul +38.73728 34.03866 Europe/Istanbul +36.82944 28.77083 Europe/Istanbul +38.2278 27.96955 Europe/Istanbul +37.0778 41.2178 Europe/Istanbul +37.00972 37.79417 Europe/Istanbul +37.96583 34.67935 Europe/Istanbul +38.625 34.71222 Europe/Istanbul +37.91631 28.32225 Europe/Istanbul +36.64389 33.43885 Europe/Istanbul +38.74525 41.50693 Europe/Istanbul +37.21807 28.3665 Europe/Istanbul +39.06147 34.38286 Europe/Istanbul +37.31639 27.78389 Europe/Istanbul +37.4247 41.33934 Europe/Istanbul +36.79526 34.61792 Europe/Istanbul +38.60754 27.06938 Europe/Istanbul +36.855 28.27417 Europe/Istanbul +37.31309 40.74357 Europe/Istanbul +38.61202 27.42646 Europe/Istanbul +36.78667 31.44306 Europe/Istanbul +39.14265 42.54008 Europe/Istanbul +38.35018 38.31667 Europe/Istanbul +36.49463 32.09085 Europe/Istanbul +38.45917 40.6475 Europe/Istanbul +39.42417 29.98333 Europe/Istanbul +37.85562 27.2566 Europe/Istanbul +37.92717 41.70282 Europe/Istanbul +36.32573 30.30302 Europe/Istanbul +39.09514 33.07989 Europe/Istanbul +38.49722 41.01222 Europe/Istanbul +38.54726 28.64976 Europe/Istanbul +38.19383 41.48853 Europe/Istanbul +37.45517 35.81573 Europe/Istanbul +38.72139 39.86806 Europe/Istanbul +37.06498 30.19565 Europe/Istanbul +37.87135 32.48464 Europe/Istanbul +37.19319 40.58799 Europe/Istanbul +37.58104 29.26639 Europe/Istanbul +39.14583 34.16389 Europe/Istanbul +39.10638 27.66925 Europe/Istanbul +39.84528 33.50639 Europe/Istanbul +36.49939 36.35755 Europe/Istanbul +36.71611 37.115 Europe/Istanbul +39.67306 33.61361 Europe/Istanbul +36.59778 30.56056 Europe/Istanbul +38.42621 27.41731 Europe/Istanbul +38.73222 35.48528 Europe/Istanbul +37.71596 33.55064 Europe/Istanbul +37.18111 33.215 Europe/Istanbul +39.71944 43.05139 Europe/Istanbul +38.95583 40.03861 Europe/Istanbul +39.34919 42.11239 Europe/Istanbul +39.3575 33.72389 Europe/Istanbul +37.78552 38.6237 Europe/Istanbul +37.5847 36.9264 Europe/Istanbul +37.37389 36.09611 Europe/Istanbul +38.23972 32.21139 Europe/Istanbul +38.41273 27.13838 Europe/Istanbul +37.76444 30.55222 Europe/Istanbul +36.58718 36.17347 Europe/Istanbul +37.85222 27.72361 Europe/Istanbul +37.26506 35.65717 Europe/Istanbul +38.27917 31.91389 Europe/Istanbul +39.92371 44.045 Europe/Istanbul +37.34114 41.8895 Europe/Istanbul +38.22572 42.42776 Europe/Istanbul +39.3606 41.70222 Europe/Istanbul +37.58686 38.95505 Europe/Istanbul +36.98776 32.45674 Europe/Istanbul +38.64631 35.44937 Europe/Istanbul +38.57739 42.02811 Europe/Istanbul +37.78361 37.63667 Europe/Istanbul +38.02096 36.4973 Europe/Istanbul +38.75071 40.56035 Europe/Istanbul +39.18342 36.07189 Europe/Istanbul +39.04167 29.41 Europe/Istanbul +36.26942 32.31792 Europe/Istanbul +37.05944 37.3825 Europe/Istanbul +38.6703 26.75656 Europe/Istanbul +36.62167 29.11639 Europe/Istanbul +39.78561 26.34083 Europe/Istanbul +39.77667 30.52056 Europe/Istanbul +39.90861 41.27694 Europe/Istanbul +39.75222 39.49278 Europe/Istanbul +36.64043 32.89179 Europe/Istanbul +38.26533 39.76212 Europe/Istanbul +37.51333 34.04672 Europe/Istanbul +36.60498 34.30836 Europe/Istanbul +39.02869 43.35864 Europe/Istanbul +39.01972 31.15 Europe/Istanbul +39.343 29.25847 Europe/Istanbul +36.73583 29.91775 Europe/Istanbul +39.92083 33.23083 Europe/Istanbul +39.80333 42.67361 Europe/Istanbul +38.20591 37.1983 Europe/Istanbul +38.67431 39.22321 Europe/Istanbul +37.87462 30.85042 Europe/Istanbul +39.59611 27.02444 Europe/Istanbul +39.58596 28.62568 Europe/Istanbul +36.86158 36.22885 Europe/Istanbul +39.54694 44.08417 Europe/Istanbul +37.91583 40.21889 Europe/Istanbul +39.54056 43.67135 Europe/Istanbul +38.065 30.16557 Europe/Istanbul +38.39056 35.49222 Europe/Istanbul +37.77417 29.0875 Europe/Istanbul +39.04607 28.65889 Europe/Istanbul +37.54545 41.71966 Europe/Istanbul +38.54583 37.50583 Europe/Istanbul +37.5732 32.77446 Europe/Istanbul +38.24963 27.13429 Europe/Istanbul +37.57444 43.74083 Europe/Istanbul +37.33024 42.18484 Europe/Istanbul +37.61167 28.06139 Europe/Istanbul +36.84722 40.05 Europe/Istanbul +37.02472 35.8175 Europe/Istanbul +38.32278 26.30639 Europe/Istanbul +38.13613 39.44929 Europe/Istanbul +38.59167 31.02861 Europe/Istanbul +37.74959 37.29622 Europe/Istanbul +39.50041 26.97269 Europe/Istanbul +37.72028 30.29083 Europe/Istanbul +39.09292 42.27031 Europe/Istanbul +37.45917 30.595 Europe/Istanbul +36.1082 32.96113 Europe/Istanbul +39.90778 30.03667 Europe/Istanbul +37.3625 38.52667 Europe/Istanbul +37.89056 34.55889 Europe/Istanbul +38.71111 31.04861 Europe/Istanbul +37.03833 27.42917 Europe/Istanbul +38.40115 42.10784 Europe/Istanbul +37.84861 40.66583 Europe/Istanbul +37.02944 37.99028 Europe/Istanbul +38.88472 40.49389 Europe/Istanbul +39.3925 28.13111 Europe/Istanbul +37.67735 31.72458 Europe/Istanbul +37.69278 37.86111 Europe/Istanbul +39.12074 27.18052 Europe/Istanbul +36.48911 36.22331 Europe/Istanbul +36.86278 31.05556 Europe/Istanbul +38.21741 27.64744 Europe/Istanbul +37.88738 41.13221 Europe/Istanbul +38.56791 38.82382 Europe/Istanbul +38.73707 29.75194 Europe/Istanbul +39.64917 27.88611 Europe/Istanbul +37.19724 36.57658 Europe/Istanbul +39.31905 26.6954 Europe/Istanbul +37.84501 27.83963 Europe/Istanbul +39.92083 40.695 Europe/Istanbul +36.90812 30.69556 Europe/Istanbul +36.20655 36.15722 Europe/Istanbul +39.91987 32.85427 Europe/Istanbul +36.07508 32.83691 Europe/Istanbul +38.79975 26.97203 Europe/Istanbul +38.35083 28.51718 Europe/Istanbul +36.54375 31.99982 Europe/Istanbul +38.3575 31.41639 Europe/Istanbul +38.37255 34.02537 Europe/Istanbul +38.91852 27.84006 Europe/Istanbul +39.66028 35.88361 Europe/Istanbul +36.71111 38.9475 Europe/Istanbul +38.75178 42.48135 Europe/Istanbul +38.75667 30.54333 Europe/Istanbul +38.24769 36.91399 Europe/Istanbul +37.76441 38.27629 Europe/Istanbul +38.80389 42.73422 Europe/Istanbul +37.00167 35.32889 Europe/Istanbul +36.64951 36.22956 Europe/Istanbul +39.96833 32.73083 Europe/Istanbul +36.76591 28.8028 Europe/Istanbul +41.45139 31.79305 Europe/Istanbul +40.30306 35.88639 Europe/Istanbul +40.99441 28.90417 Europe/Istanbul +40.95411 39.86405 Europe/Istanbul +40.26444 29.65306 Europe/Istanbul +40.76704 29.78275 Europe/Istanbul +40.65502 29.27693 Europe/Istanbul +40.98894 28.67582 Europe/Istanbul +41.14361 35.45472 Europe/Istanbul +41.04583 39.27639 Europe/Istanbul +41.26598 26.6885 Europe/Istanbul +41.02252 29.02369 Europe/Istanbul +41.13139 37.2825 Europe/Istanbul +41.01643 29.12476 Europe/Istanbul +40.3875 36.08111 Europe/Istanbul +41.005 39.72694 Europe/Istanbul +41.01545 34.04013 Europe/Istanbul +40.31389 36.55444 Europe/Istanbul +41.00694 38.81389 Europe/Istanbul +41.20917 36.97389 Europe/Istanbul +41.02931 28.54978 Europe/Istanbul +41.21167 36.46 Europe/Istanbul +40.97801 27.50852 Europe/Istanbul +40.75972 36.3225 Europe/Istanbul +41.5098 34.21414 Europe/Istanbul +40.16444 38.08667 Europe/Istanbul +40.91258 40.11676 Europe/Istanbul +40.1675 34.37389 Europe/Istanbul +40.83128 35.64788 Europe/Istanbul +41.06046 28.98717 Europe/Istanbul +42.02683 35.16252 Europe/Istanbul +41.07393 28.24644 Europe/Istanbul +40.28833 38.42361 Europe/Istanbul +40.33806 42.57306 Europe/Istanbul +40.69141 30.26738 Europe/Istanbul +41.28667 36.33 Europe/Istanbul +41.25083 32.69417 Europe/Istanbul +41.02083 40.52194 Europe/Istanbul +40.35722 30.01417 Europe/Istanbul +40.97818 34.8047 Europe/Istanbul +40.48917 29.30889 Europe/Istanbul +40.98472 37.87889 Europe/Istanbul +40.54983 42.00126 Europe/Istanbul +40.94458 40.26746 Europe/Istanbul +40.59167 36.95167 Europe/Istanbul +40.18593 31.35179 Europe/Istanbul +40.37528 28.88222 Europe/Istanbul +41.0179 28.56176 Europe/Istanbul +40.87333 35.46306 Europe/Istanbul +40.93567 29.15507 Europe/Istanbul +40.89 26.90111 Europe/Istanbul +41.40385 27.35918 Europe/Istanbul +40.87444 37.26389 Europe/Istanbul +40.82472 37.34667 Europe/Istanbul +41.05336 30.85278 Europe/Istanbul +40.46972 32.65056 Europe/Istanbul +41.73508 27.22521 Europe/Istanbul +40.19828 29.21237 Europe/Istanbul +40.85583 26.63028 Europe/Istanbul +40.12978 39.43607 Europe/Istanbul +40.23167 32.68389 Europe/Istanbul +41.09258 28.33172 Europe/Istanbul +41.37805 33.77528 Europe/Istanbul +40.60199 43.09495 Europe/Istanbul +41.07096 30.78543 Europe/Istanbul +40.69144 29.61568 Europe/Istanbul +40.21323 28.3612 Europe/Istanbul +41.20488 32.62768 Europe/Istanbul +40.15669 43.13424 Europe/Istanbul +40.42861 29.72111 Europe/Istanbul +40.76694 29.91694 Europe/Istanbul +41.01384 28.94966 Europe/Istanbul +40.73528 34.47389 Europe/Istanbul +40.07806 29.51333 Europe/Istanbul +40.04583 42.17278 Europe/Istanbul +41.39046 41.41966 Europe/Istanbul +40.79944 30.74806 Europe/Istanbul +41.21311 27.10688 Europe/Istanbul +40.97056 35.66222 Europe/Istanbul +40.21876 29.19487 Europe/Istanbul +40.99256 28.61428 Europe/Istanbul +40.78833 37.60167 Europe/Istanbul +40.46028 39.48139 Europe/Istanbul +41.03083 39.00306 Europe/Istanbul +40.1049 27.65399 Europe/Istanbul +40.70324 29.87216 Europe/Istanbul +40.91698 38.38741 Europe/Istanbul +40.5075 30.2925 Europe/Istanbul +40.80083 32.19694 Europe/Istanbul +40.43094 29.15969 Europe/Istanbul +40.41028 26.67083 Europe/Istanbul +40.80276 29.43068 Europe/Istanbul +40.94082 30.48583 Europe/Istanbul +41.02778 37.50139 Europe/Istanbul +41.02697 28.67732 Europe/Istanbul +41.0435 28.87619 Europe/Istanbul +41.28262 31.41806 Europe/Istanbul +40.3996 27.79348 Europe/Istanbul +40.66889 36.5675 Europe/Istanbul +41.01766 28.97438 Europe/Istanbul +41.67719 26.55597 Europe/Istanbul +40.83889 31.16389 Europe/Istanbul +41.21917 31.95583 Europe/Istanbul +40.23861 33.03222 Europe/Istanbul +40.54889 34.95333 Europe/Istanbul +41.15917 27.8 Europe/Istanbul +41.28629 27.99939 Europe/Istanbul +40.81164 32.89358 Europe/Istanbul +41.09228 40.72924 Europe/Istanbul +41.42639 32.07556 Europe/Istanbul +41.14324 28.46154 Europe/Istanbul +41.19889 36.72194 Europe/Istanbul +40.59995 33.6153 Europe/Istanbul +40.14556 26.40639 Europe/Istanbul +40.03328 27.05236 Europe/Istanbul +40.19266 29.08403 Europe/Istanbul +40.93717 38.22907 Europe/Istanbul +41.46889 34.76667 Europe/Istanbul +40.73583 31.60611 Europe/Istanbul +40.14192 29.97932 Europe/Istanbul +40.22806 27.24222 Europe/Istanbul +40.1675 31.92111 Europe/Istanbul +41.05199 39.22844 Europe/Istanbul +40.25889 40.22778 Europe/Istanbul +41.63583 32.3375 Europe/Istanbul +40.35222 27.97667 Europe/Istanbul +41.03903 28.85671 Europe/Istanbul +41.56778 35.90694 Europe/Istanbul +41.4325 27.09306 Europe/Istanbul +41.18161 41.82172 Europe/Istanbul +40.94958 39.92756 Europe/Istanbul +41.35121 41.30456 Europe/Istanbul +41.19111 40.9875 Europe/Istanbul +41.10871 42.70222 Europe/Istanbul +40.93854 40.05842 Europe/Istanbul +40.65333 35.83306 Europe/Istanbul +41.1694 31.37917 Europe/Istanbul +40.16833 34.8425 Europe/Istanbul +40.685 30.62222 Europe/Istanbul +41.08663 31.11623 Europe/Istanbul +41.0212 39.57146 Europe/Istanbul +40.78056 30.40333 Europe/Istanbul +40.94794 38.71148 Europe/Istanbul +41.01295 28.88593 Europe/Istanbul +41.00711 28.88795 Europe/Istanbul +37.01667 27.26667 Europe/Istanbul +36.71549 28.70436 Europe/Istanbul +40.9833 29.1167 Europe/Istanbul +41.09307 28.80203 Europe/Istanbul +40.982 28.6399 Europe/Istanbul +41.02072 28.58502 Europe/Istanbul +39.9179 32.86268 Europe/Istanbul +41.00231 28.8598 Europe/Istanbul +41.10652 28.86847 Europe/Istanbul +40.96072 29.27067 Europe/Istanbul +41.00244 29.23187 Europe/Istanbul +38.37396 27.1352 Europe/Istanbul +10.63333 -61.38333 America/Port_of_Spain +11.18333 -60.73333 America/Port_of_Spain +10.58333 -61.11667 America/Port_of_Spain +10.28333 -61.46667 America/Port_of_Spain +10.3 -61.18333 America/Port_of_Spain +10.66668 -61.51889 America/Port_of_Spain +10.18333 -61.68333 America/Port_of_Spain +10.65298 -61.36298 America/Port_of_Spain +10.27979 -61.4459 America/Port_of_Spain +10.30618 -61.44671 America/Port_of_Spain +10.64917 -61.49889 America/Port_of_Spain +10.51667 -61.41667 America/Port_of_Spain +10.63333 -61.28333 America/Port_of_Spain +-8.52425 179.19417 Pacific/Funafuti +23.70944 120.54333 Asia/Taipei +23.12493 120.46138 Asia/Taipei +25.04776 121.53185 Asia/Taipei +22.99083 120.21333 Asia/Taipei +24.1469 120.6839 Asia/Taipei +24.88373 121.29043 Asia/Taipei +25.01427 121.46719 Asia/Taipei +23.96639 120.96952 Asia/Taipei +23.91566 120.66387 Asia/Taipei +23.5654 119.58627 Asia/Taipei +23.74639 120.7525 Asia/Taipei +22.61626 120.31333 Asia/Taipei +24.757 121.753 Asia/Taipei +23.97694 121.60444 Asia/Taipei +24.80361 120.96861 Asia/Taipei +22.00417 120.74389 Asia/Taipei +24.43667 118.31833 Asia/Taipei +25.12825 121.7419 Asia/Taipei +24.99368 121.29696 Asia/Taipei +22.7583 121.1444 Asia/Taipei +23.95908 120.68516 Asia/Taipei +-6.16394 39.19793 Africa/Dar_es_Salaam +-5.05589 39.72938 Africa/Dar_es_Salaam +-9.11667 32.93333 Africa/Dar_es_Salaam +-7.00667 39.29849 Africa/Dar_es_Salaam +-3.28333 31.52583 Africa/Dar_es_Salaam +-5.10361 30.39111 Africa/Dar_es_Salaam +-3.49194 31.96389 Africa/Dar_es_Salaam +-7.1 31.23333 Africa/Dar_es_Salaam +-2.68333 33 Africa/Dar_es_Salaam +-3.36667 36.85 Africa/Dar_es_Salaam +-5.06667 32.05 Africa/Dar_es_Salaam +-9.3 32.76667 Africa/Dar_es_Salaam +-5.06667 32.73333 Africa/Dar_es_Salaam +-9.25 33.65 Africa/Dar_es_Salaam +-3.88333 33.2 Africa/Dar_es_Salaam +-1.35 34.36667 Africa/Dar_es_Salaam +-5.06893 39.09875 Africa/Dar_es_Salaam +-5.01622 32.82663 Africa/Dar_es_Salaam +-7.96667 31.61667 Africa/Dar_es_Salaam +-3.51667 33.51667 Africa/Dar_es_Salaam +-3.36667 33.95 Africa/Dar_es_Salaam +-6.43333 39.55 Africa/Dar_es_Salaam +-1.23333 34.43333 Africa/Dar_es_Salaam +-4.81629 34.74358 Africa/Dar_es_Salaam +-5.63333 32.76667 Africa/Dar_es_Salaam +-3.66393 33.42118 Africa/Dar_es_Salaam +-4.36667 34.2 Africa/Dar_es_Salaam +-4.75 34.53333 Africa/Dar_es_Salaam +-4.06667 37.73333 Africa/Dar_es_Salaam +-2.7175 30.6325 Africa/Dar_es_Salaam +-8.7 34.38333 Africa/Dar_es_Salaam +-5 34.73333 Africa/Dar_es_Salaam +-3.55 33.4 Africa/Dar_es_Salaam +-4.21667 33.18333 Africa/Dar_es_Salaam +-1.9 34.01667 Africa/Dar_es_Salaam +-3.18333 33.78333 Africa/Dar_es_Salaam +-2.63333 33.98333 Africa/Dar_es_Salaam +-1.14389 31.39472 Africa/Dar_es_Salaam +-1.79833 31.55111 Africa/Dar_es_Salaam +-9.33333 34.76667 Africa/Dar_es_Salaam +-5.10917 31.04194 Africa/Dar_es_Salaam +-2.96667 33.33333 Africa/Dar_es_Salaam +-6.75 38.11667 Africa/Dar_es_Salaam +-2.51222 30.65583 Africa/Dar_es_Salaam +-4.46667 35.45 Africa/Dar_es_Salaam +-7.51667 31.05 Africa/Dar_es_Salaam +-2.51667 32.9 Africa/Dar_es_Salaam +-3.55 33.6 Africa/Dar_es_Salaam +-6.25 38.66667 Africa/Dar_es_Salaam +-1.5 33.8 Africa/Dar_es_Salaam +-1.98333 32.91667 Africa/Dar_es_Salaam +-4.96667 34.88333 Africa/Dar_es_Salaam +-5.16667 38.78333 Africa/Dar_es_Salaam +-1.85 34.7 Africa/Dar_es_Salaam +-9.01667 34.8 Africa/Dar_es_Salaam +-3.35 35.85 Africa/Dar_es_Salaam +-4.55 34.85 Africa/Dar_es_Salaam +-6.53333 37.2 Africa/Dar_es_Salaam +-6.35 36.48333 Africa/Dar_es_Salaam +-6.34379 31.06951 Africa/Dar_es_Salaam +-3.35 37.33333 Africa/Dar_es_Salaam +-6.82102 37.66122 Africa/Dar_es_Salaam +-9 32.98333 Africa/Dar_es_Salaam +-8.8 35.81667 Africa/Dar_es_Salaam +-9.78333 34.51667 Africa/Dar_es_Salaam +-6.7 38.73333 Africa/Dar_es_Salaam +-4.93333 38.93333 Africa/Dar_es_Salaam +-7.11799 39.20782 Africa/Dar_es_Salaam +-4.83 29.65806 Africa/Dar_es_Salaam +-2.85 33.08333 Africa/Dar_es_Salaam +-7.40409 36.98309 Africa/Dar_es_Salaam +-3.28333 32.85 Africa/Dar_es_Salaam +-5.95 34.13333 Africa/Dar_es_Salaam +-3.56667 36.95 Africa/Dar_es_Salaam +-8.9 33.45 Africa/Dar_es_Salaam +-4.8 38.21667 Africa/Dar_es_Salaam +-4.8 38.25 Africa/Dar_es_Salaam +-8.3 31.51667 Africa/Dar_es_Salaam +-2.68333 33.98333 Africa/Dar_es_Salaam +-3.63333 32.18333 Africa/Dar_es_Salaam +-5.05 38.61667 Africa/Dar_es_Salaam +-8.93333 36.13333 Africa/Dar_es_Salaam +-3.13333 33.53333 Africa/Dar_es_Salaam +-4.73333 38.1 Africa/Dar_es_Salaam +-8.85 34.83333 Africa/Dar_es_Salaam +-9.93333 35.33333 Africa/Dar_es_Salaam +-2.58333 33.35 Africa/Dar_es_Salaam +-4.01667 35.76667 Africa/Dar_es_Salaam +-6.8 39.25 Africa/Dar_es_Salaam +-6.36667 37.36667 Africa/Dar_es_Salaam +-7.25 35.06667 Africa/Dar_es_Salaam +-5.13333 32.53333 Africa/Dar_es_Salaam +-4.78333 38.28333 Africa/Dar_es_Salaam +-6.45 38.33333 Africa/Dar_es_Salaam +-9.76667 37.93333 Africa/Dar_es_Salaam +-3.78333 37.61667 Africa/Dar_es_Salaam +-3.45 33.95 Africa/Dar_es_Salaam +-8.56667 32.05 Africa/Dar_es_Salaam +-9.58333 33.85 Africa/Dar_es_Salaam +-4.9 35.78333 Africa/Dar_es_Salaam +-9.16667 33.53333 Africa/Dar_es_Salaam +-3.61667 33.86667 Africa/Dar_es_Salaam +-3.08333 34.15 Africa/Dar_es_Salaam +-7.41667 30.6 Africa/Dar_es_Salaam +-4.26667 34.36667 Africa/Dar_es_Salaam +-3.28333 36.98333 Africa/Dar_es_Salaam +-6.83333 36.98333 Africa/Dar_es_Salaam +-4.87694 29.62667 Africa/Dar_es_Salaam +-7.60361 37.00438 Africa/Dar_es_Salaam +-7.69916 36.95722 Africa/Dar_es_Salaam +-3.58639 30.72028 Africa/Dar_es_Salaam +-7.72178 38.93749 Africa/Dar_es_Salaam +-2.15 33.45 Africa/Dar_es_Salaam +-6.71667 36.36667 Africa/Dar_es_Salaam +-6.76667 38.91667 Africa/Dar_es_Salaam +-9.23333 33.61667 Africa/Dar_es_Salaam +-3.02028 31.89583 Africa/Dar_es_Salaam +-1.4 31.73333 Africa/Dar_es_Salaam +-4.57667 30.1025 Africa/Dar_es_Salaam +-2.85 32.43333 Africa/Dar_es_Salaam +-3.33333 35.66667 Africa/Dar_es_Salaam +-1.61861 31.62 Africa/Dar_es_Salaam +-3.28278 30.96417 Africa/Dar_es_Salaam +-3.83333 32.6 Africa/Dar_es_Salaam +-2.63861 30.46778 Africa/Dar_es_Salaam +-7.2 35.73333 Africa/Dar_es_Salaam +-5.7 34.48333 Africa/Dar_es_Salaam +-3.9 32.93333 Africa/Dar_es_Salaam +-7.76667 35.7 Africa/Dar_es_Salaam +-9.48333 33.9 Africa/Dar_es_Salaam +-7.6766 36.03658 Africa/Dar_es_Salaam +-4.66667 34.86667 Africa/Dar_es_Salaam +-8.9 34.58333 Africa/Dar_es_Salaam +-5.13333 34.76667 Africa/Dar_es_Salaam +-8.85 33.85 Africa/Dar_es_Salaam +-4.28333 33.88333 Africa/Dar_es_Salaam +-4.56667 34.63333 Africa/Dar_es_Salaam +-8.13333 36.68333 Africa/Dar_es_Salaam +-4.5 37.9 Africa/Dar_es_Salaam +-2.86667 32.16667 Africa/Dar_es_Salaam +-6.15 36.86667 Africa/Dar_es_Salaam +-4.26667 35.85 Africa/Dar_es_Salaam +-4.06667 35.38333 Africa/Dar_es_Salaam +-6.17221 35.73947 Africa/Dar_es_Salaam +-6.82349 39.26951 Africa/Dar_es_Salaam +-4.21667 35.55 Africa/Dar_es_Salaam +-8.85 34.01667 Africa/Dar_es_Salaam +-2.63778 31.76694 Africa/Dar_es_Salaam +-5.41667 38.01667 Africa/Dar_es_Salaam +-6.63784 38.35396 Africa/Dar_es_Salaam +-7.58333 31.26667 Africa/Dar_es_Salaam +-5.24586 39.76659 Africa/Dar_es_Salaam +-1.76667 33.96667 Africa/Dar_es_Salaam +-3.02361 31.87472 Africa/Dar_es_Salaam +-7.63369 39.05818 Africa/Dar_es_Salaam +-2.05 33.86667 Africa/Dar_es_Salaam +-1.33167 31.81222 Africa/Dar_es_Salaam +-2.87056 30.52806 Africa/Dar_es_Salaam +-2.63194 31.30889 Africa/Dar_es_Salaam +-4.36667 35.08333 Africa/Dar_es_Salaam +-4.23333 35.41667 Africa/Dar_es_Salaam +-2.8 33.98333 Africa/Dar_es_Salaam +-6.43333 38.9 Africa/Dar_es_Salaam +-4.21667 35.75 Africa/Dar_es_Salaam +-3.36667 36.68333 Africa/Dar_es_Salaam +-11.3 35.03333 Africa/Dar_es_Salaam +-10.75 39.63333 Africa/Dar_es_Salaam +-10.68333 35.65 Africa/Dar_es_Salaam +-10.33333 39.28333 Africa/Dar_es_Salaam +-10.95 39.28333 Africa/Dar_es_Salaam +-10.68333 39.83333 Africa/Dar_es_Salaam +-10.9 38.5 Africa/Dar_es_Salaam +-10.38333 39.15 Africa/Dar_es_Salaam +-10.3725 38.76251 Africa/Dar_es_Salaam +-10.26667 40.18333 Africa/Dar_es_Salaam +-10.93333 35.01667 Africa/Dar_es_Salaam +-10.75 34.9 Africa/Dar_es_Salaam +-10.71667 38.8 Africa/Dar_es_Salaam +-10.58333 35.4 Africa/Dar_es_Salaam +-10.56667 38.8 Africa/Dar_es_Salaam +-10.9 39.33333 Africa/Dar_es_Salaam +-10 39.71667 Africa/Dar_es_Salaam +-10.71667 39.73333 Africa/Dar_es_Salaam +-10.8 35.05 Africa/Dar_es_Salaam +-3.56182 36.97895 Africa/Dar_es_Salaam +50.58518 34.4849 Europe/Kiev +48.63013 37.55259 Europe/Kiev +47.43694 35.27417 Europe/Zaporozhye +49.07866 30.96754 Europe/Kiev +48.0114 38.26444 Europe/Kiev +49.66886 32.03773 Europe/Kiev +49.80597 24.89436 Europe/Kiev +48.71278 32.66472 Europe/Kiev +49.67453 36.34775 Europe/Kiev +50.26487 28.67669 Europe/Kiev +49.03705 28.11201 Europe/Kiev +48.34731 33.50034 Europe/Kiev +49.24545 30.1102 Europe/Kiev +50.5206 26.24251 Europe/Kiev +47.82289 35.19031 Europe/Zaporozhye +46.62211 31.10131 Europe/Kiev +45.20091 33.36655 Europe/Simferopol +48.23331 38.21137 Europe/Kiev +48.1298 37.8594 Europe/Kiev +44.50013 34.16148 Europe/Simferopol +50.27975 31.76246 Europe/Kiev +50.58476 30.4898 Europe/Kiev +48.14135 23.02666 Europe/Uzhgorod +47.56494 31.33078 Europe/Kiev +47.60103 37.49674 Europe/Kiev +50.29078 36.94108 Europe/Kiev +50.85253 24.32364 Europe/Kiev +50.38913 30.3705 Europe/Kiev +49.23278 28.48097 Europe/Kiev +49.01502 31.06211 Europe/Kiev +50.18692 30.31346 Europe/Kiev +48.61667 22.3 Europe/Uzhgorod +48.74838 30.22184 Europe/Kiev +48.67448 28.84641 Europe/Kiev +46.61842 32.7189 Europe/Kiev +49.27837 23.50618 Europe/Kiev +48.03876 38.59685 Europe/Kiev +47.25522 35.71238 Europe/Zaporozhye +49.55589 25.60556 Europe/Kiev +48.88877 30.69482 Europe/Kiev +48.94832 38.49166 Europe/Zaporozhye +49.04894 33.24106 Europe/Kiev +48.08964 39.65243 Europe/Zaporozhye +49.41029 38.15035 Europe/Zaporozhye +48.54853 22.99578 Europe/Uzhgorod +50.9216 34.80029 Europe/Kiev +49.26223 23.85609 Europe/Kiev +49.29416 23.56357 Europe/Kiev +49.75764 27.20342 Europe/Kiev +49.27832 38.91069 Europe/Zaporozhye +48.56818 38.64352 Europe/Zaporozhye +50.47438 24.28288 Europe/Kiev +48.02612 38.77225 Europe/Kiev +49.22242 31.88714 Europe/Kiev +48.86667 37.61667 Europe/Kiev +50.30155 26.86506 Europe/Kiev +49.73177 29.66569 Europe/Kiev +46.1161 32.91124 Europe/Kiev +48.32044 35.51792 Europe/Kiev +44.95719 34.11079 Europe/Simferopol +49.00687 31.39471 Europe/Kiev +51.86296 33.4698 Europe/Kiev +50.18545 27.06365 Europe/Kiev +48.06252 38.51665 Europe/Kiev +44.58883 33.5224 Europe/Simferopol +48.14708 37.30032 Europe/Kiev +51.33795 26.60191 Europe/Kiev +49.5183 23.19752 Europe/Kiev +45.13424 33.59996 Europe/Simferopol +49.01229 38.37967 Europe/Zaporozhye +46.84334 30.07919 Europe/Kiev +48.08332 39.37764 Europe/Zaporozhye +50.75104 33.47471 Europe/Kiev +50.62308 26.22743 Europe/Kiev +45.45727 28.29317 Europe/Kiev +50.49613 29.22911 Europe/Kiev +48.41333 33.71056 Europe/Kiev +51.33745 33.87066 Europe/Kiev +50.59324 32.38761 Europe/Kiev +48.63328 38.37804 Europe/Zaporozhye +49.59373 34.54073 Europe/Kiev +50.12424 27.51087 Europe/Kiev +47.48444 36.25361 Europe/Zaporozhye +48.57528 35.1068 Europe/Kiev +50.2445 32.51073 Europe/Kiev +48.62988 38.54806 Europe/Zaporozhye +48.04433 30.85073 Europe/Kiev +50.08768 31.4795 Europe/Kiev +48.43779 38.84384 Europe/Zaporozhye +48.53341 35.8705 Europe/Kiev +51.3246 28.80351 Europe/Kiev +47.56731 35.78575 Europe/Zaporozhye +48.66961 33.11593 Europe/Kiev +46.47747 30.73262 Europe/Kiev +46.61283 31.54982 Europe/Kiev +50.10997 30.62272 Europe/Kiev +47.69308 32.5216 Europe/Kiev +50.72576 24.16265 Europe/Kiev +48.32635 31.52852 Europe/Kiev +48.63798 35.24548 Europe/Kiev +50.59412 27.6165 Europe/Kiev +46.75451 33.34864 Europe/Kiev +50.93152 31.58282 Europe/Kiev +51.04801 31.88688 Europe/Kiev +45.44789 34.73839 Europe/Simferopol +47.57119 34.39637 Europe/Kiev +50.34004 26.64171 Europe/Kiev +48.6348 24.56936 Europe/Kiev +46.96591 31.9974 Europe/Kiev +48.43919 22.71779 Europe/Uzhgorod +48.34578 39.65824 Europe/Zaporozhye +48.44598 27.7982 Europe/Kiev +44.43333 34.08333 Europe/Simferopol +49.96854 33.60886 Europe/Kiev +49.82302 36.05069 Europe/Kiev +46.84891 35.36533 Europe/Zaporozhye +47.09514 37.54131 Europe/Kiev +47.63543 34.62769 Europe/Kiev +50.77233 29.23833 Europe/Kiev +48.04782 37.92576 Europe/Kiev +49.94691 35.92907 Europe/Kiev +49.83826 24.02324 Europe/Kiev +48.40507 39.22675 Europe/Zaporozhye +50.75932 25.34244 Europe/Kiev +48.56705 39.31706 Europe/Zaporozhye +50.01625 32.99694 Europe/Kiev +48.88937 36.31755 Europe/Kiev +48.90485 38.44207 Europe/Zaporozhye +48.68496 29.23678 Europe/Kiev +50.45466 30.5238 Europe/Kiev +51.68333 25.86667 Europe/Kiev +47.98522 37.2821 Europe/Kiev +49.71054 37.61517 Europe/Kiev +47.90966 33.38044 Europe/Kiev +51.54775 33.38475 Europe/Kiev +49.0495 38.21792 Europe/Zaporozhye +50.09693 25.72459 Europe/Kiev +49.06802 33.42041 Europe/Kiev +48.13954 38.93715 Europe/Zaporozhye +48.98836 37.80225 Europe/Kiev +45.95716 33.7965 Europe/Simferopol +49.3814 35.44021 Europe/Kiev +48.29229 39.73729 Europe/Zaporozhye +48.28198 37.17585 Europe/Kiev +49.65186 26.97252 Europe/Kiev +48.72305 37.55629 Europe/Kiev +49.63096 37.68821 Europe/Kiev +51.21526 24.70867 Europe/Kiev +47.75305 29.53205 Europe/Kiev +50.87841 26.45192 Europe/Kiev +49.41894 31.25865 Europe/Kiev +50.31723 29.0563 Europe/Kiev +50.95937 28.63855 Europe/Kiev +48.5277 37.7069 Europe/Kiev +51.24032 33.20263 Europe/Kiev +49.59701 36.52618 Europe/Kiev +48.53115 25.03649 Europe/Kiev +50.83425 25.45821 Europe/Kiev +48.63751 38.6428 Europe/Zaporozhye +48.5132 32.2597 Europe/Kiev +45.45518 29.26367 Europe/Kiev +48.1793 23.29909 Europe/Uzhgorod +49.42161 26.99653 Europe/Kiev +49.55979 27.95754 Europe/Kiev +46.65581 32.6178 Europe/Kiev +48.04243 38.14728 Europe/Kiev +49.98081 36.25272 Europe/Kiev +45.3607 36.4706 Europe/Simferopol +49.71431 28.83385 Europe/Kiev +49.45668 35.12947 Europe/Kiev +49.75182 31.46004 Europe/Kiev +48.6845 26.58559 Europe/Kiev +49.01187 24.37308 Europe/Kiev +49.45389 28.52608 Europe/Kiev +46.81371 33.48698 Europe/Kiev +49.20875 37.24848 Europe/Kiev +50.11947 26.82125 Europe/Kiev +45.34929 28.84079 Europe/Kiev +48.9215 24.70972 Europe/Kiev +50.52175 30.25055 Europe/Kiev +47.92498 38.20236 Europe/Kiev +46.30495 30.65478 Europe/Kiev +49.16374 26.58394 Europe/Kiev +48.33576 38.05325 Europe/Kiev +51.67822 33.9162 Europe/Kiev +47.66389 36.25633 Europe/Zaporozhye +49.78465 23.64806 Europe/Kiev +49.28489 31.44513 Europe/Kiev +46.5272 32.52417 Europe/Kiev +46.17592 34.8034 Europe/Kiev +48.33958 29.86791 Europe/Kiev +48.81143 29.38977 Europe/Kiev +50.37112 33.99099 Europe/Kiev +45.03677 35.37789 Europe/Simferopol +50.0767 29.9177 Europe/Kiev +47.49865 34.6574 Europe/Zaporozhye +45.71168 34.39274 Europe/Simferopol +48.39869 37.84787 Europe/Kiev +48.88909 26.85636 Europe/Kiev +50.41694 25.73432 Europe/Kiev +49.34991 23.50561 Europe/Kiev +48.023 37.80224 Europe/Kiev +48.9733 24.00944 Europe/Kiev +48.11041 32.76449 Europe/Kiev +47.74773 37.67384 Europe/Kiev +48.46147 37.08524 Europe/Kiev +48.45 34.98333 Europe/Kiev +48.51134 34.6021 Europe/Kiev +47.38169 34.97652 Europe/Zaporozhye +50.10659 36.12112 Europe/Kiev +48.34072 38.4049 Europe/Kiev +49.83588 36.68803 Europe/Kiev +49.01709 25.79804 Europe/Kiev +48.07613 39.79618 Europe/Zaporozhye +50.39105 24.23514 Europe/Kiev +48.29149 25.94034 Europe/Kiev +51.50551 31.28488 Europe/Kiev +49.42854 32.06207 Europe/Kiev +50.54345 30.21201 Europe/Kiev +48.511 38.67222 Europe/Zaporozhye +50.51809 30.80671 Europe/Kiev +50.08791 25.15027 Europe/Kiev +50.3191 30.29728 Europe/Kiev +50.35269 30.95501 Europe/Kiev +49.28672 23.43238 Europe/Kiev +45.68262 28.61487 Europe/Kiev +49.54939 30.8744 Europe/Kiev +50.16466 35.52765 Europe/Kiev +46.1952 30.34938 Europe/Kiev +49.80939 30.11209 Europe/Kiev +49.45 24.93333 Europe/Kiev +48.20555 22.64418 Europe/Uzhgorod +49.89928 28.60235 Europe/Kiev +46.7663 36.79882 Europe/Zaporozhye +51.15016 34.31287 Europe/Kiev +45.05462 34.60185 Europe/Simferopol +49.07717 27.68256 Europe/Kiev +47.93548 29.61982 Europe/Kiev +49.4627 36.85951 Europe/Kiev +44.51428 33.60013 Europe/Simferopol +51.18144 32.83463 Europe/Kiev +44.75525 33.85782 Europe/Simferopol +48.13989 37.74255 Europe/Kiev +45.99194 29.41824 Europe/Kiev +48.59559 37.99987 Europe/Kiev +46.10919 33.69206 Europe/Simferopol +47.66003 33.71369 Europe/Kiev +48.11503 39.09128 Europe/Zaporozhye +47.79348 38.47768 Europe/Kiev +44.67631 34.40778 Europe/Simferopol +48.46893 38.81669 Europe/Zaporozhye +50.31036 34.89879 Europe/Kiev +49.01018 33.63567 Europe/Kiev +51.51964 30.73434 Europe/Kiev +47.81777 31.18263 Europe/Kiev +49.93023 23.57357 Europe/Kiev +3.46506 31.24689 Africa/Kampala +0.72833 32.51222 Africa/Kampala +0.40444 32.45944 Africa/Kampala +0.69299 34.18085 Africa/Kampala +1.71464 33.61113 Africa/Kampala +1.145 33.70944 Africa/Kampala +2.41669 30.98551 Africa/Kampala +-0.9 30.41667 Africa/Kampala +-0.88333 29.65 Africa/Kampala +-0.87944 30.26417 Africa/Kampala +0.41861 33.17306 Africa/Kampala +2.47826 31.08894 Africa/Kampala +0.68944 32.42139 Africa/Kampala +0.35333 32.75528 Africa/Kampala +0.55849 31.39489 Africa/Kampala +3.66088 31.72474 Africa/Kampala +0.4175 32.02278 Africa/Kampala +-0.60467 30.64851 Africa/Kampala +1.08209 34.17503 Africa/Kampala +1.67444 31.715 Africa/Kampala +-0.33379 31.73409 Africa/Kampala +0.84917 32.47306 Africa/Kampala +0.37722 32.91972 Africa/Kampala +2.2499 32.89985 Africa/Kampala +0.63278 30.62139 Africa/Kampala +2.98056 34.13306 Africa/Kampala +3.27833 32.88667 Africa/Kampala +0.3475 32.64917 Africa/Kampala +0.7025 32.88861 Africa/Kampala +0.18333 30.08333 Africa/Kampala +0.1866 30.45393 Africa/Kampala +0.31628 32.58219 Africa/Kampala +-1.24857 29.98993 Africa/Kampala +0.43902 33.20317 Africa/Kampala +0.60917 33.46861 Africa/Kampala +1.43314 31.35241 Africa/Kampala +2.77457 32.29899 Africa/Kampala +0.66174 30.2748 Africa/Kampala +0.06444 32.44694 Africa/Kampala +-0.59167 30.62861 Africa/Kampala +0.64222 33.17444 Africa/Kampala +0.46588 34.09221 Africa/Kampala +0.76972 33.61306 Africa/Kampala +0.71117 30.06469 Africa/Kampala +0.57139 33.74167 Africa/Kampala +3.02013 30.91105 Africa/Kampala +3.37786 31.7909 Africa/Kampala +38.73289 -77.05803 America/New_York +33.40178 -86.95444 America/Chicago +37.08339 -88.60005 America/Chicago +33.52066 -86.80249 America/Chicago +33.64566 -86.6836 America/Chicago +30.60353 -87.9036 America/Chicago +34.60593 -86.98334 America/Chicago +31.22323 -85.39049 America/Chicago +34.80953 -87.64947 America/Chicago +31.31517 -85.85522 America/Chicago +30.52297 -87.90333 America/Chicago +34.79981 -87.67725 America/Chicago +34.01426 -86.00664 America/Chicago +33.29622 -86.8436 America/Chicago +33.47177 -86.80082 America/Chicago +33.40539 -86.81138 America/Chicago +33.45122 -86.99666 America/Chicago +34.73037 -86.5861 America/Chicago +34.69926 -86.74833 America/Chicago +30.69436 -88.04305 America/Chicago +32.36681 -86.29997 America/Chicago +33.50094 -86.75221 America/Chicago +33.22901 -87.57723 America/Chicago +32.64541 -85.37828 America/Chicago +33.61427 -85.83496 America/Chicago +33.28567 -86.80999 America/Chicago +32.47098 -85.00077 America/New_York +32.46402 -86.4597 America/Chicago +30.7388 -88.07889 America/Chicago +32.40736 -87.0211 America/Chicago +33.43594 -86.1058 America/Chicago +30.59019 -88.17084 America/Chicago +31.80877 -85.96995 America/Chicago +33.61983 -86.60888 America/Chicago +33.20984 -87.56917 America/Chicago +33.44872 -86.78777 America/Chicago +36.4807 -94.27134 America/Chicago +34.56454 -92.58683 America/Chicago +36.37285 -94.20882 America/Chicago +35.9273 -89.91898 America/Chicago +34.59593 -92.48905 America/Chicago +34.97453 -92.01653 America/Chicago +35.0887 -92.4421 America/Chicago +33.20763 -92.66627 America/Chicago +36.06258 -94.15743 America/Chicago +35.00815 -90.78983 America/Chicago +35.38592 -94.39855 America/Chicago +34.5037 -93.05518 America/Chicago +34.8662 -92.11015 America/Chicago +35.8423 -90.70428 America/Chicago +34.74648 -92.28959 America/Chicago +34.86676 -92.40432 America/Chicago +34.76954 -92.26709 America/Chicago +36.0584 -90.49733 America/Chicago +34.22843 -92.0032 America/Chicago +36.33202 -94.11854 America/Chicago +35.27842 -93.13379 America/Chicago +35.25064 -91.73625 America/Chicago +36.18814 -94.5405 America/Chicago +36.18674 -94.12881 America/Chicago +33.44179 -94.03769 America/Chicago +35.43676 -94.34827 America/Chicago +35.14648 -90.18454 America/Chicago +38.89511 -77.03637 America/New_York +39.62928 -75.65826 America/New_York +39.15817 -75.52437 America/New_York +39.44956 -75.71632 America/New_York +39.68372 -75.74966 America/New_York +39.74595 -75.54659 America/New_York +25.81454 -80.22394 America/New_York +28.66111 -81.36562 America/New_York +28.68055 -81.50952 America/New_York +25.95648 -80.13921 America/New_York +27.89641 -81.84314 America/New_York +28.32667 -82.68343 America/New_York +27.42532 -82.59038 America/New_York +26.68451 -80.66756 America/New_York +30.46159 -87.31497 America/Chicago +27.89364 -82.24037 America/New_York +26.34508 -80.14671 America/New_York +26.35869 -80.0831 America/New_York +26.33981 -81.7787 America/New_York +26.52535 -80.06643 America/New_York +27.49893 -82.57482 America/New_York +27.9378 -82.28592 America/New_York +30.46881 -87.23608 America/Chicago +25.82176 -80.24116 America/New_York +28.33584 -81.35313 America/New_York +30.60853 -87.33998 America/Chicago +26.56285 -81.94953 America/New_York +25.94065 -80.2456 America/New_York +28.05002 -82.49287 America/New_York +28.06752 -82.52093 America/New_York +28.67778 -81.32785 America/New_York +28.07835 -82.56982 America/New_York +27.96585 -82.8001 America/New_York +28.54944 -81.77285 America/New_York +28.38612 -80.742 America/New_York +26.25175 -80.17894 America/New_York +25.7126 -80.25699 America/New_York +26.05731 -80.27172 America/New_York +25.72149 -80.26838 America/New_York +26.27119 -80.2706 America/New_York +25.74593 -80.3045 America/New_York +25.63399 -80.43228 America/New_York +25.94815 -80.317 America/New_York +30.76213 -86.57051 America/Chicago +25.6151 -80.31061 America/New_York +25.58066 -80.34672 America/New_York +26.05231 -80.14393 America/New_York +26.06287 -80.2331 America/New_York +29.21081 -81.02283 America/New_York +29.02832 -81.30312 America/New_York +28.88305 -81.30868 America/New_York +26.31841 -80.09977 America/New_York +26.46146 -80.07282 America/New_York +28.90054 -81.26367 America/New_York +25.81954 -80.35533 America/New_York +28.01974 -82.77177 America/New_York +28.11085 -82.69482 America/New_York +30.42881 -87.17997 America/Chicago +28.98888 -80.90228 America/New_York +28.01769 -82.50619 America/New_York +30.51881 -87.27275 America/Chicago +26.43814 -81.80675 America/New_York +28.85277 -81.68535 America/New_York +30.5102 -87.21247 America/Chicago +25.76232 -80.31616 America/New_York +27.58031 -80.38672 America/New_York +26.12231 -80.14338 America/New_York +26.62168 -81.84059 America/New_York +27.44671 -80.32561 America/New_York +30.40576 -86.61884 America/Chicago +25.77288 -80.34783 America/New_York +30.11107 -81.64176 America/New_York +29.65163 -82.32483 America/New_York +25.7076 -80.32561 America/New_York +26.18787 -81.69509 America/New_York +25.91176 -80.20033 America/New_York +26.62368 -80.12532 America/New_York +28.11418 -81.61785 America/New_York +25.9812 -80.14838 America/New_York +25.8576 -80.27811 America/New_York +25.8651 -80.3245 America/New_York +28.18779 -82.73955 America/New_York +26.0112 -80.14949 America/New_York +25.46872 -80.47756 America/New_York +26.41869 -81.4173 America/New_York +26.52036 -81.96398 America/New_York +25.96231 -80.17671 America/New_York +30.33218 -81.65565 America/New_York +30.29469 -81.39314 America/New_York +28.29306 -82.6901 America/New_York +26.93422 -80.09421 America/New_York +25.70816 -80.407 America/New_York +25.67927 -80.31727 America/New_York +24.5557 -81.78259 America/New_York +28.15585 -82.62121 America/New_York +28.30468 -81.41667 America/New_York +28.50167 -81.54091 America/New_York +28.07418 -82.47176 America/New_York +26.6159 -80.05699 America/New_York +26.61649 -80.10102 America/New_York +28.03947 -81.9498 America/New_York +30.12996 -81.76815 America/New_York +28.2189 -82.45759 America/New_York +27.90947 -82.78732 America/New_York +26.16647 -80.20838 America/New_York +26.14036 -80.21338 America/New_York +27.82114 -82.67927 America/New_York +28.81082 -81.87786 America/New_York +26.62535 -81.6248 America/New_York +25.49539 -80.42922 America/New_York +28.15112 -82.46148 America/New_York +30.24548 -85.64826 America/Chicago +28.62778 -81.36312 America/New_York +26.24453 -80.20644 America/New_York +28.38556 -81.36646 America/New_York +28.08363 -80.60811 America/New_York +28.53917 -80.672 America/New_York +25.77427 -80.19366 America/New_York +25.79065 -80.13005 America/New_York +25.94204 -80.2456 America/New_York +25.90871 -80.30866 America/New_York +25.98731 -80.23227 America/New_York +30.42103 -87.30747 America/Chicago +26.14204 -81.79481 America/New_York +30.40159 -86.86357 America/Chicago +29.02582 -80.927 America/New_York +25.94898 -80.21227 America/New_York +26.66729 -81.88009 America/New_York +26.2173 -80.22588 America/New_York +25.89009 -80.18671 America/New_York +25.93315 -80.16255 America/New_York +27.04422 -82.23593 America/New_York +28.47112 -81.42452 America/New_York +26.17231 -80.13199 America/New_York +29.1872 -82.14009 America/New_York +28.56917 -81.54396 America/New_York +25.94843 -80.1506 America/New_York +25.90232 -80.25033 America/New_York +28.53834 -81.37924 America/New_York +29.28581 -81.05589 America/New_York +28.67 -81.20812 America/New_York +30.59936 -87.16108 America/Chicago +28.03446 -80.58866 America/New_York +26.82339 -80.13865 America/New_York +27.16783 -80.26616 America/New_York +29.58497 -81.20784 America/New_York +28.07807 -82.76371 America/New_York +26.6359 -80.09615 America/New_York +30.17746 -81.38758 America/New_York +25.62177 -80.32477 America/New_York +30.15946 -85.65983 America/Chicago +26.31008 -80.23727 America/New_York +26.00315 -80.22394 America/New_York +30.42131 -87.21691 America/Chicago +28.55778 -81.4534 America/New_York +25.66705 -80.30811 America/New_York +27.8428 -82.69954 America/New_York +25.86898 -80.21699 America/New_York +28.01863 -82.11286 America/New_York +26.13421 -80.23184 America/New_York +28.14029 -81.45841 America/New_York +26.23786 -80.12477 America/New_York +30.23969 -81.38564 America/New_York +26.97617 -82.09064 America/New_York +29.13832 -80.99561 America/New_York +27.29393 -80.35033 America/New_York +25.53844 -80.40894 America/New_York +26.92978 -82.04537 America/New_York +26.91756 -82.07842 America/New_York +25.6105 -80.42971 America/New_York +27.86614 -82.32648 America/New_York +26.77534 -80.0581 America/New_York +28.35084 -80.72533 America/New_York +26.7084 -80.2306 America/New_York +27.72086 -82.43315 America/New_York +27.99085 -82.69316 America/New_York +28.2489 -81.28118 America/New_York +27.77086 -82.67927 America/New_York +26.4673 -81.80147 America/New_York +28.80055 -81.27312 America/New_York +27.33643 -82.53065 America/New_York +27.81642 -80.47061 America/New_York +27.83975 -82.79121 America/New_York +27.4631 -82.58176 America/New_York +25.59761 -80.38061 America/New_York +28.39306 -81.3834 America/New_York +28.47688 -82.52546 America/New_York +27.19755 -80.25283 America/New_York +27.71809 -82.35176 America/New_York +25.95065 -80.12282 America/New_York +26.15767 -80.28611 America/New_York +25.70594 -80.35228 America/New_York +30.43826 -84.28073 America/New_York +26.21286 -80.24977 America/New_York +25.75871 -80.39839 America/New_York +27.94752 -82.45843 America/New_York +28.14612 -82.75677 America/New_York +28.0353 -82.38926 America/New_York +25.67066 -80.40117 America/New_York +25.67149 -80.4445 America/New_York +28.93408 -81.95994 America/New_York +25.64205 -80.39839 America/New_York +28.61222 -80.80755 America/New_York +28.01057 -82.57732 America/New_York +25.74649 -80.36755 America/New_York +27.93789 -82.23644 America/New_York +27.09978 -82.45426 America/New_York +27.63864 -80.39727 America/New_York +28.69861 -81.42563 America/New_York +26.65868 -80.24144 America/New_York +28.23973 -82.32787 America/New_York +28.05502 -82.60982 America/New_York +25.85704 -80.23699 America/New_York +28.07168 -80.65339 America/New_York +26.71534 -80.05337 America/New_York +30.42659 -87.27969 America/Chicago +27.81993 -82.68944 America/New_York +25.75482 -80.32727 America/New_York +26.10037 -80.39977 America/New_York +28.56528 -81.58618 America/New_York +28.02224 -81.73286 America/New_York +28.6 -81.33924 America/New_York +28.69889 -81.30812 America/New_York +30.45575 -86.63829 America/Chicago +34.06593 -84.67688 America/New_York +31.57851 -84.15574 America/New_York +34.07538 -84.29409 America/New_York +32.07239 -84.23269 America/New_York +33.96095 -83.37794 America/New_York +33.749 -84.38798 America/New_York +33.47097 -81.97484 America/New_York +33.75483 -84.26742 America/New_York +31.14995 -81.49149 America/New_York +34.50259 -84.95105 America/New_York +34.23676 -84.49076 America/New_York +33.58011 -85.07661 America/New_York +34.1651 -84.79994 America/New_York +32.46098 -84.98771 America/New_York +33.66761 -84.01769 America/New_York +34.7698 -84.97022 America/New_York +33.77483 -84.29631 America/New_York +33.7515 -84.74771 America/New_York +32.54044 -82.90375 America/New_York +34.00288 -84.14464 America/New_York +33.94621 -84.33465 America/New_York +33.67955 -84.43937 America/New_York +33.53375 -82.13067 America/New_York +33.44873 -84.45493 America/New_York +33.62205 -84.36909 America/New_York +34.29788 -83.82407 America/New_York +33.24678 -84.26409 America/New_York +31.84688 -81.59595 America/New_York +34.02343 -84.61549 America/New_York +30.79996 -81.68983 America/New_York +33.03929 -85.03133 America/New_York +33.95621 -83.98796 America/New_York +33.794 -84.66049 America/New_York +33.81574 -84.56194 America/New_York +32.84069 -83.6324 America/New_York +33.9526 -84.54993 America/New_York +33.51736 -82.07567 America/New_York +33.44734 -84.14686 America/New_York +33.08014 -83.2321 America/New_York +33.38067 -84.79966 America/New_York +33.8651 -84.33659 America/New_York +33.79038 -84.30603 America/New_York +33.81677 -84.31326 America/New_York +33.39678 -84.59576 America/New_York +32.11548 -81.24706 America/New_York +33.74538 -84.13158 America/New_York +33.57261 -84.41326 America/New_York +34.25704 -85.16467 America/New_York +34.02316 -84.36159 America/New_York +30.73051 -81.54649 America/New_York +33.92427 -84.37854 America/New_York +32.08354 -81.09983 America/New_York +33.88399 -84.51438 America/New_York +33.85733 -84.01991 America/New_York +32.44879 -81.78317 America/New_York +33.54428 -84.23381 America/New_York +34.10649 -84.03352 America/New_York +34.05149 -84.0713 America/New_York +30.83658 -83.97878 America/New_York +31.45046 -83.5085 America/New_York +33.85455 -84.21714 America/New_York +33.58706 -84.54243 America/New_York +30.8327 -83.27849 America/New_York +32.62098 -83.5999 America/New_York +32.00355 -80.97372 America/New_York +34.10149 -84.51938 America/New_York +38.8906 -90.18428 America/Chicago +38.52005 -89.98399 America/Chicago +38.57088 -90.19011 America/Chicago +37.72727 -89.21675 America/Chicago +39.49615 -88.17615 America/Chicago +38.67033 -89.98455 America/Chicago +39.84031 -88.9548 America/Chicago +38.6245 -90.15094 America/Chicago +38.81144 -89.95316 America/Chicago +38.58894 -89.99038 America/Chicago +38.9556 -90.18678 America/Chicago +38.70144 -90.14872 America/Chicago +39.73394 -90.22901 America/Chicago +37.73061 -88.93313 America/Chicago +39.48309 -88.37283 America/Chicago +38.31727 -88.90312 America/Chicago +38.59227 -89.91121 America/Chicago +39.9356 -91.40987 America/Chicago +39.80172 -89.64371 America/Chicago +38.91144 -90.15066 America/Chicago +39.16532 -86.52639 America/Indiana/Indianapolis +39.86671 -86.14165 America/Indiana/Indianapolis +39.84338 -86.39777 America/Indiana/Indianapolis +39.97837 -86.11804 America/Indiana/Indianapolis +38.29674 -85.75996 America/Kentucky/Louisville +39.20144 -85.92138 America/Indiana/Indianapolis +37.97476 -87.55585 America/Chicago +39.95559 -86.01387 America/Indiana/Indianapolis +39.78504 -85.76942 America/Indiana/Indianapolis +39.61366 -86.10665 America/Indiana/Indianapolis +39.76838 -86.15804 America/Indiana/Indianapolis +38.39144 -86.93111 America/Indiana/Vincennes +38.27757 -85.73718 America/Kentucky/Louisville +39.83865 -86.02526 America/Indiana/Indianapolis +38.28562 -85.82413 America/Kentucky/Louisville +39.92894 -85.37025 America/Indiana/Indianapolis +39.70421 -86.39944 America/Indiana/Indianapolis +39.82894 -84.89024 America/Indiana/Indianapolis +38.95922 -85.89025 America/Indiana/Indianapolis +39.52144 -85.77692 America/Indiana/Indianapolis +39.4667 -87.41391 America/Indiana/Indianapolis +38.67727 -87.52863 America/Indiana/Vincennes +37.54557 -97.26893 America/Chicago +38.4039 -96.18166 America/Chicago +38.81084 -94.92719 America/Chicago +38.36446 -98.76481 America/Chicago +38.87918 -99.32677 America/Chicago +38.06084 -97.92977 America/Chicago +39.02861 -96.8314 America/Chicago +39.11417 -94.62746 America/Chicago +38.97167 -95.23525 America/Chicago +39.31111 -94.92246 America/Chicago +38.96667 -94.6169 America/Chicago +38.95362 -94.73357 America/Chicago +39.18361 -96.57167 America/Chicago +38.04668 -97.34504 America/Chicago +38.8814 -94.81913 America/Chicago +38.98223 -94.67079 America/Chicago +37.41088 -94.70496 America/Chicago +38.99167 -94.63357 America/Chicago +38.84028 -97.61142 America/Chicago +39.04167 -94.72024 America/Chicago +39.04833 -95.67804 America/Chicago +37.69224 -97.33754 America/Chicago +38.47841 -82.63794 America/New_York +36.99032 -86.4436 America/Chicago +39.02756 -84.72411 America/New_York +39.08367 -84.50855 America/New_York +37.64563 -84.77217 America/New_York +37.69395 -85.85913 America/New_York +39.01673 -84.60078 America/New_York +38.15979 -85.58774 America/Kentucky/Louisville +38.99895 -84.62661 America/New_York +39.07506 -84.44716 America/New_York +38.20091 -84.87328 America/New_York +38.2098 -84.55883 America/New_York +37.83615 -87.59001 America/Chicago +38.14285 -85.62413 America/Kentucky/Louisville +36.8656 -87.48862 America/Chicago +38.94312 -84.54411 America/New_York +38.45647 -82.69238 America/New_York +38.19424 -85.5644 America/Kentucky/Louisville +37.98869 -84.47772 America/New_York +38.0498 -84.45855 America/New_York +38.25424 -85.75941 America/Kentucky/Louisville +37.3281 -87.49889 America/Chicago +38.41258 -82.70905 America/New_York +36.61033 -88.31476 America/Chicago +38.16007 -85.65968 America/Kentucky/Louisville +39.09145 -84.49578 America/New_York +37.88063 -84.573 America/New_York +38.14118 -85.68774 America/Kentucky/Louisville +37.77422 -87.11333 America/Chicago +38.14535 -85.8583 America/Kentucky/Louisville +37.84035 -85.94913 America/New_York +37.74786 -84.29465 America/New_York +38.25285 -85.65579 America/Kentucky/Louisville +38.20007 -85.82274 America/Kentucky/Louisville +38.11118 -85.87024 America/Kentucky/Louisville +37.99008 -84.17965 America/New_York +31.31129 -92.44514 America/Chicago +30.45075 -91.15455 America/Chicago +29.6241 -90.7512 America/Chicago +32.51599 -93.73212 America/Chicago +30.55435 -91.03677 America/Chicago +29.9427 -89.9634 America/Chicago +29.84576 -90.10674 America/Chicago +29.91465 -90.05396 America/Chicago +30.50436 -90.4612 America/Chicago +29.90354 -90.07729 America/Chicago +29.59577 -90.71953 America/Chicago +29.99409 -90.24174 America/Chicago +30.22409 -92.01984 America/Chicago +30.21309 -93.2044 America/Chicago +30.06659 -90.48008 America/Chicago +29.89937 -90.10035 America/Chicago +29.98409 -90.15285 America/Chicago +29.97854 -90.16396 America/Chicago +32.50931 -92.1193 America/Chicago +31.76072 -93.08627 America/Chicago +30.00354 -91.81873 America/Chicago +29.95465 -90.07507 America/Chicago +30.53353 -92.08151 America/Chicago +30.30297 -90.97205 America/Chicago +32.52321 -92.63793 America/Chicago +30.4013 -91.00094 America/Chicago +32.52515 -93.75018 America/Chicago +30.27519 -89.78117 America/Chicago +30.23659 -93.37738 America/Chicago +29.9102 -90.03257 America/Chicago +39.00317 -76.97192 America/New_York +38.97845 -76.49218 America/New_York +39.25455 -76.69997 America/New_York +39.03206 -76.50274 America/New_York +39.07955 -77.07303 America/New_York +39.29038 -76.61219 America/New_York +39.3726 -77.43526 America/New_York +39.03483 -76.90747 America/New_York +38.98067 -77.10026 America/New_York +38.94278 -76.73028 America/New_York +39.05761 -76.93581 America/New_York +38.804 -76.90664 America/New_York +39.39427 -76.52358 America/New_York +39.27205 -76.73192 America/New_York +38.96372 -76.99081 America/New_York +39.10816 -76.99775 America/New_York +38.76511 -76.89831 America/New_York +39.48122 -76.64386 America/New_York +38.98067 -76.93692 America/New_York +39.24038 -76.83942 America/New_York +39.00178 -76.68747 America/New_York +39.65287 -78.76252 America/New_York +39.28844 -77.20387 America/New_York +39.25066 -76.52052 America/New_York +38.96206 -76.92192 America/New_York +38.77428 -76.07633 America/New_York +39.41872 -76.2944 America/New_York +39.40371 -76.95026 America/New_York +39.60678 -75.83327 America/New_York +39.21261 -76.71358 America/New_York +39.26733 -76.79831 America/New_York +39.30927 -76.47496 America/New_York +39.07622 -76.95775 America/New_York +39.18316 -76.64024 America/New_York +38.70734 -77.02303 America/New_York +39.41427 -77.41054 America/New_York +39.14344 -77.20137 America/New_York +39.17316 -77.27165 America/New_York +38.819 -76.99859 America/New_York +39.16261 -76.62469 America/New_York +39.13955 -76.54774 America/New_York +39.00455 -76.87553 America/New_York +39.64176 -77.71999 America/New_York +39.19289 -76.72414 America/New_York +38.83289 -76.95942 America/New_York +39.49983 -76.64108 America/New_York +38.95594 -76.94553 America/New_York +39.25094 -76.76469 America/New_York +39.10705 -76.48496 America/New_York +38.934 -76.89664 America/New_York +38.98872 -76.98136 America/New_York +39.09928 -76.84831 America/New_York +39.34066 -76.72219 America/New_York +39.09205 -76.81775 America/New_York +39.33427 -76.43941 America/New_York +39.34788 -76.76997 America/New_York +39.17677 -77.19526 America/New_York +39.53983 -76.35496 America/New_York +39.04455 -77.11887 America/New_York +39.08289 -77.26498 America/New_York +39.084 -76.70025 America/New_York +39.15316 -77.06692 America/New_York +39.41955 -76.78025 America/New_York +38.80345 -76.9897 America/New_York +39.37733 -76.53969 America/New_York +38.97956 -76.53052 America/New_York +39.10733 -76.57108 America/New_York +39.41261 -76.46357 America/New_York +39.37427 -76.72247 America/New_York +39.01817 -77.20859 America/New_York +39.36733 -76.79525 America/New_York +39.14539 -77.14415 America/New_York +39.46955 -76.82942 America/New_York +39.084 -77.15276 America/New_York +39.32011 -76.51552 America/New_York +39.33844 -76.47968 America/New_York +38.60317 -76.93858 America/New_York +38.36067 -75.59937 America/New_York +38.96789 -76.84497 America/New_York +39.13705 -76.6983 America/New_York +39.07039 -76.54524 America/New_York +38.99067 -77.02609 America/New_York +39.53316 -76.33746 America/New_York +39.129 -76.6258 America/New_York +39.06983 -76.85025 America/New_York +38.84872 -76.92386 America/New_York +38.97789 -77.00748 America/New_York +39.4015 -76.60191 America/New_York +38.62456 -76.93914 America/New_York +39.20705 -76.72692 America/New_York +39.57538 -76.99581 America/New_York +39.03983 -77.05526 America/New_York +39.03983 -76.99303 America/New_York +39.32288 -76.72803 America/New_York +38.55061 -90.33317 America/Chicago +38.43283 -90.37762 America/Chicago +38.59505 -90.54623 America/Chicago +38.81195 -94.5319 America/Chicago +39.01695 -94.28161 America/Chicago +37.30588 -89.51815 America/Chicago +38.66311 -90.57707 America/Chicago +38.64255 -90.32373 America/Chicago +38.95171 -92.33407 America/Chicago +38.5245 -90.35734 America/Chicago +38.66089 -90.42262 America/Chicago +39.09556 -94.35523 America/Chicago +37.78088 -90.42179 America/Chicago +38.74422 -90.30539 America/Chicago +38.78922 -90.32261 America/Chicago +39.20389 -94.55468 America/Chicago +38.88584 -94.53301 America/Chicago +39.70838 -91.35848 America/Chicago +38.77144 -90.37095 America/Chicago +39.09112 -94.41551 America/Chicago +38.5767 -92.17352 America/Chicago +37.08423 -94.51328 America/Chicago +39.09973 -94.57857 America/Chicago +38.58339 -90.40678 America/Chicago +38.91084 -94.38217 America/Chicago +38.53339 -90.27928 America/Chicago +39.24611 -94.41912 America/Chicago +38.597 -90.50929 America/Chicago +38.71311 -90.42984 America/Chicago +38.50839 -90.32289 America/Chicago +37.04339 -93.29435 America/Chicago +38.81061 -90.69985 America/Chicago +38.47005 -90.30456 America/Chicago +38.70116 -90.36234 America/Chicago +37.02089 -93.20602 America/Chicago +36.757 -90.39289 America/Chicago +38.80195 -94.45273 America/Chicago +39.00862 -94.46356 America/Chicago +37.95143 -91.77127 America/Chicago +38.78394 -90.48123 America/Chicago +39.76861 -94.84663 America/Chicago +38.62727 -90.19789 America/Chicago +38.80033 -90.62651 America/Chicago +38.70446 -93.22826 America/Chicago +36.87672 -89.58786 America/Chicago +38.78783 -90.21594 America/Chicago +37.21533 -93.29824 America/Chicago +38.65588 -90.30928 America/Chicago +38.76279 -93.73605 America/Chicago +38.59255 -90.35734 America/Chicago +38.81144 -90.85291 America/Chicago +38.58283 -90.6629 America/Chicago +30.39603 -88.88531 America/Chicago +32.2732 -89.98592 America/Chicago +34.20011 -90.57093 America/Chicago +32.34153 -90.32176 America/Chicago +33.49567 -88.42726 America/Chicago +30.38576 -88.61169 America/Chicago +33.41012 -91.06177 America/Chicago +33.51623 -90.17953 America/Chicago +30.36742 -89.09282 America/Chicago +31.32712 -89.29034 America/Chicago +34.95537 -90.03481 America/Chicago +32.29876 -90.18481 America/Chicago +31.69405 -89.13061 America/Chicago +32.46181 -90.11536 America/Chicago +32.36431 -88.70366 America/Chicago +31.56044 -91.40317 America/Chicago +30.41131 -88.82781 America/Chicago +34.96176 -89.82953 America/Chicago +34.3665 -89.51925 America/Chicago +30.36576 -88.55613 America/Chicago +32.27459 -90.13203 America/Chicago +32.42848 -90.13231 America/Chicago +34.98898 -90.01259 America/Chicago +33.4504 -88.81839 America/Chicago +34.25761 -88.70339 America/Chicago +32.35265 -90.87788 America/Chicago +30.40409 -89.0942 America/Chicago +35.35014 -80.20006 America/New_York +35.73265 -78.85029 America/New_York +35.70791 -79.81364 America/New_York +35.60095 -82.55402 America/New_York +36.2168 -81.67455 America/New_York +36.09569 -79.4378 America/New_York +35.91014 -79.07529 America/New_York +35.79154 -78.78112 America/New_York +35.9132 -79.05584 America/New_York +35.22709 -80.84313 America/New_York +35.65071 -78.45639 America/New_York +36.02153 -80.382 America/New_York +35.40875 -80.57951 America/New_York +35.4868 -80.86007 America/New_York +35.99403 -78.89862 America/New_York +36.48847 -79.7667 America/New_York +36.2946 -76.25105 America/New_York +35.05266 -78.87836 America/New_York +35.58432 -78.80001 America/New_York +35.71126 -78.61417 America/New_York +35.26208 -81.1873 America/New_York +35.38488 -77.99277 America/New_York +36.07264 -79.79198 America/New_York +35.61266 -77.36635 America/New_York +34.87905 -76.90133 America/New_York +36.32959 -78.39916 America/New_York +35.73319 -81.3412 America/New_York +35.95569 -80.00532 America/New_York +35.65127 -78.83362 America/New_York +34.97044 -78.94531 America/New_York +35.41069 -80.84285 America/New_York +35.07681 -80.66924 America/New_York +34.75405 -77.43024 America/New_York +35.48736 -80.62173 America/New_York +36.11986 -80.07365 America/New_York +35.26266 -77.58164 America/New_York +34.77405 -79.46282 America/New_York +35.91402 -81.53898 America/New_York +35.82403 -80.25338 America/New_York +34.61822 -79.00864 America/New_York +35.11681 -80.72368 America/New_York +35.17959 -80.64729 America/New_York +34.98543 -80.54951 America/New_York +35.58486 -80.81007 America/New_York +35.74541 -81.68482 America/New_York +35.82348 -78.82556 America/New_York +35.10849 -77.04411 America/New_York +35.7721 -78.63861 America/New_York +36.46154 -77.65415 America/New_York +35.93821 -77.79053 America/New_York +35.67097 -80.47423 America/New_York +35.47988 -79.1803 America/New_York +35.29235 -81.53565 America/New_York +35.78264 -80.8873 America/New_York +35.88264 -80.08199 America/New_York +35.97987 -78.50972 America/New_York +35.78682 -78.66389 America/New_York +34.22573 -77.94471 America/New_York +35.72127 -77.91554 America/New_York +36.09986 -80.24422 America/New_York +39.36428 -74.42293 America/New_York +39.42734 -75.23408 America/New_York +39.92595 -75.11962 America/New_York +39.93484 -75.03073 America/New_York +39.70289 -75.11184 America/New_York +39.7765 -74.86238 America/New_York +39.82428 -74.99767 America/New_York +39.95261 -74.99239 America/New_York +39.40206 -75.03934 America/New_York +39.934 -74.891 America/New_York +39.74345 -74.28098 America/New_York +39.95622 -75.05795 America/New_York +39.38984 -74.52404 America/New_York +39.71734 -74.96933 America/New_York +39.44595 -75.02879 America/New_York +39.95373 -74.19792 America/New_York +39.48623 -75.02573 America/New_York +39.68623 -74.99517 America/New_York +39.32924 -82.10126 America/New_York +39.70923 -84.06327 America/New_York +39.62839 -84.15938 America/New_York +39.162 -84.45689 America/New_York +39.96118 -82.99879 America/New_York +39.75895 -84.19161 America/New_York +39.82089 -84.01938 America/New_York +39.34589 -84.5605 America/New_York +39.29034 -84.50411 America/New_York +39.88145 -83.09296 America/New_York +39.3995 -84.56134 America/New_York +39.84395 -84.12466 America/New_York +39.6895 -84.16883 America/New_York +39.71368 -82.59933 America/New_York +39.43534 -84.20299 America/New_York +39.36006 -84.30994 America/New_York +39.64284 -84.28661 America/New_York +39.51506 -84.39828 America/New_York +39.15561 -84.45966 America/New_York +39.507 -84.74523 America/New_York +39.88423 -82.7535 America/New_York +38.73174 -82.99767 America/New_York +39.95479 -82.81212 America/New_York +39.77978 -84.1241 America/New_York +39.55228 -84.23327 America/New_York +39.92423 -83.80882 America/New_York +39.79728 -84.31133 America/New_York +39.99451 -83.06241 America/New_York +39.89061 -84.19883 America/New_York +39.21311 -84.59939 America/New_York +39.96673 -82.88546 America/New_York +39.68478 -83.92965 America/New_York +39.94035 -82.01319 America/New_York +34.77453 -96.67834 America/Chicago +34.63813 -99.33398 America/Chicago +34.17426 -97.14363 America/Chicago +36.74731 -95.98082 America/Chicago +35.51867 -97.63226 America/Chicago +35.94204 -95.88332 America/Chicago +36.0526 -95.79082 America/Chicago +35.05256 -97.93643 America/Chicago +36.3126 -95.61609 America/Chicago +35.44201 -97.44087 America/Chicago +34.5023 -97.95781 America/Chicago +33.99399 -96.37082 America/Chicago +35.65283 -97.4781 America/Chicago +35.53227 -97.95505 America/Chicago +36.39559 -97.87839 America/Chicago +36.02287 -95.96833 America/Chicago +34.60869 -98.39033 America/Chicago +34.93343 -95.76971 America/Chicago +35.44951 -97.3967 America/Chicago +35.33951 -97.4867 America/Chicago +35.74788 -95.36969 America/Chicago +35.38423 -97.72449 America/Chicago +35.22257 -97.43948 America/Chicago +35.46756 -97.51643 America/Chicago +36.26954 -95.85471 America/Chicago +36.70698 -97.08559 America/Chicago +36.13981 -96.10889 America/Chicago +35.9987 -96.11417 America/Chicago +35.32729 -96.9253 America/Chicago +36.11561 -97.05837 America/Chicago +35.91537 -94.96996 America/Chicago +36.15398 -95.99278 America/Chicago +35.50672 -97.76254 America/Chicago +39.93759 -77.6611 America/New_York +39.84956 -75.35575 America/New_York +39.94706 -75.29213 America/New_York +39.80066 -76.98304 America/New_York +39.95234 -75.16379 America/New_York +39.93067 -75.32019 America/New_York +39.96066 -75.60549 America/New_York +39.9626 -76.72774 America/New_York +33.56042 -81.71955 America/New_York +34.50344 -82.65013 America/New_York +32.77657 -79.93092 America/New_York +34.00071 -81.03481 America/New_York +33.836 -79.04781 America/New_York +34.82984 -82.60152 America/New_York +34.19543 -79.76256 America/New_York +32.98101 -80.03259 America/New_York +34.85262 -82.39401 America/New_York +34.1954 -82.16179 America/New_York +34.93873 -82.22706 America/New_York +32.91851 -80.02203 America/New_York +32.21632 -80.75261 America/New_York +33.98154 -81.23621 America/New_York +34.77873 -82.31012 America/New_York +32.79407 -79.86259 America/New_York +33.68906 -78.88669 America/New_York +33.5018 -81.96512 America/New_York +32.85306 -79.97463 America/New_York +34.92487 -81.02508 America/New_York +34.04543 -81.12926 America/New_York +34.04876 -81.14648 America/New_York +34.73706 -82.25428 America/New_York +33.6835 -78.99837 America/New_York +34.94957 -81.93205 America/New_York +33.0185 -80.17565 America/New_York +33.92044 -80.34147 America/New_York +34.92039 -82.29623 America/New_York +34.90373 -82.33317 America/New_York +35.20453 -89.87398 America/Chicago +36.03312 -86.78278 America/Chicago +36.02506 -86.77917 America/Chicago +36.59511 -82.18874 America/New_York +35.04563 -85.30968 America/New_York +36.52977 -87.35945 America/Chicago +35.15952 -84.87661 America/New_York +35.04204 -89.66453 America/Chicago +35.61507 -87.03528 America/Chicago +36.16284 -85.50164 America/Chicago +36.03452 -89.38563 America/Chicago +34.99591 -85.15023 America/New_York +35.06535 -85.24912 America/New_York +35.01424 -85.2519 America/New_York +35.88452 -84.15353 America/New_York +35.92506 -86.86889 America/Chicago +36.38838 -86.44666 America/Chicago +35.08676 -89.81009 America/Chicago +36.32311 -86.71333 America/Chicago +36.16316 -82.83099 America/New_York +36.30477 -86.62 America/Chicago +35.61452 -88.81395 America/Chicago +36.31344 -82.35347 America/New_York +36.54843 -82.56182 America/New_York +35.96064 -83.92074 America/New_York +36.01562 -86.58194 America/Chicago +36.20811 -86.2911 America/Chicago +35.75647 -83.97046 America/New_York +35.14953 -90.04898 America/Chicago +36.21398 -83.29489 America/New_York +36.20006 -86.51861 America/Chicago +35.84562 -86.39027 America/Chicago +36.16589 -86.78444 America/Chicago +35.08676 -90.05676 America/Chicago +36.01036 -84.26964 America/New_York +35.48341 -86.46027 America/Chicago +35.98284 -86.5186 America/Chicago +35.75118 -86.93 America/Chicago +36.50921 -86.885 America/Chicago +35.36202 -86.20943 America/Chicago +32.44874 -99.73314 America/Chicago +26.18369 -98.12306 America/Chicago +29.93244 -95.38021 America/Chicago +27.75225 -98.06972 America/Chicago +33.10317 -96.67055 America/Chicago +29.42385 -95.2441 America/Chicago +29.16941 -95.43188 America/Chicago +32.73569 -97.10807 America/Chicago +29.99883 -95.1766 America/Chicago +30.26715 -97.74306 America/Chicago +32.72874 -96.62277 America/Chicago +29.7355 -94.97743 America/Chicago +30.08605 -94.10185 America/Chicago +32.84402 -97.14307 America/Chicago +29.70579 -95.45883 America/Chicago +31.05601 -97.46445 America/Chicago +32.67319 -97.46058 America/Chicago +30.16688 -96.39774 America/Chicago +25.90175 -97.49748 America/Chicago +31.70932 -98.99116 America/Chicago +30.51353 -97.73973 America/Chicago +30.67436 -96.36996 America/Chicago +32.54208 -97.32085 America/Chicago +29.87522 -98.26251 America/Chicago +32.95373 -96.89028 America/Chicago +32.58847 -96.95612 America/Chicago +30.5052 -97.82029 America/Chicago +29.77606 -95.11465 America/Chicago +29.56162 -98.22696 America/Chicago +29.73884 -95.758 America/Chicago +32.34764 -97.38668 America/Chicago +29.77828 -95.17188 America/Chicago +30.62798 -96.33441 America/Chicago +32.88096 -97.15501 America/Chicago +30.31188 -95.45605 America/Chicago +29.51801 -98.31612 America/Chicago +32.95457 -97.01501 America/Chicago +31.12406 -97.90308 America/Chicago +33.15401 -97.06473 America/Chicago +27.80058 -97.39638 America/Chicago +32.09543 -96.46887 America/Chicago +29.96911 -95.69717 America/Chicago +32.78306 -96.80667 America/Chicago +32.58986 -96.85695 America/Chicago +29.70523 -95.12382 America/Chicago +33.75566 -96.53666 America/Chicago +33.21484 -97.13307 America/Chicago +29.46079 -95.05132 America/Chicago +26.17035 -98.05195 America/Chicago +32.6518 -96.90834 America/Chicago +26.30174 -98.16334 America/Chicago +32.32931 -96.62527 America/Chicago +32.83707 -97.08195 America/Chicago +32.92651 -96.89612 America/Chicago +33.01457 -97.09696 America/Chicago +32.72541 -97.32085 America/Chicago +29.53885 -95.44744 America/Chicago +29.5294 -95.20104 America/Chicago +33.15067 -96.82361 America/Chicago +33.62594 -97.13335 America/Chicago +29.30135 -94.7977 America/Chicago +32.91262 -96.63888 America/Chicago +31.43516 -97.74391 America/Chicago +30.63269 -97.67723 America/Chicago +32.74596 -96.99778 America/Chicago +32.93429 -97.07807 America/Chicago +33.13845 -96.11081 America/Chicago +29.94827 -93.91712 America/Chicago +32.79957 -97.26918 America/Chicago +31.08351 -97.65974 America/Chicago +26.19063 -97.6961 America/Chicago +33.09179 -97.04668 America/Chicago +29.76328 -95.36327 America/Chicago +29.99883 -95.26216 America/Chicago +30.72353 -95.55078 America/Chicago +32.82346 -97.17057 America/Chicago +32.81402 -96.94889 America/Chicago +30.4427 -97.77501 America/Chicago +32.93457 -97.25168 America/Chicago +30.04743 -99.14032 America/Chicago +31.11712 -97.7278 America/Chicago +27.51587 -97.85611 America/Chicago +29.99835 -97.87153 America/Chicago +29.66578 -95.01937 America/Chicago +29.03386 -95.43439 America/Chicago +32.59208 -96.75611 America/Chicago +27.50641 -99.50754 America/Chicago +29.50745 -95.09493 America/Chicago +30.57881 -97.85307 America/Chicago +33.04623 -96.99417 America/Chicago +33.16262 -96.93751 America/Chicago +32.5007 -94.74049 America/Chicago +31.33824 -94.7291 America/Chicago +32.56319 -97.14168 America/Chicago +32.54487 -94.36742 America/Chicago +26.20341 -98.23001 America/Chicago +33.19762 -96.61527 America/Chicago +26.1498 -97.91361 America/Chicago +32.7668 -96.59916 America/Chicago +32.48236 -96.99445 America/Chicago +32.80846 -98.11282 America/Chicago +26.21591 -98.32529 America/Chicago +29.69384 -95.66495 America/Chicago +29.61857 -95.53772 America/Chicago +33.15679 -94.96827 America/Chicago +33.01512 -96.61305 America/Chicago +31.60351 -94.65549 America/Chicago +29.97438 -93.9924 America/Chicago +29.703 -98.12445 America/Chicago +29.59412 -95.68078 America/Chicago +32.8343 -97.2289 America/Chicago +30.09299 -93.73655 America/Chicago +31.76212 -95.63079 America/Chicago +33.66094 -95.55551 America/Chicago +29.69106 -95.2091 America/Chicago +29.56357 -95.28605 America/Chicago +29.62607 -95.73162 America/Chicago +30.43937 -97.62 America/Chicago +26.1948 -98.18362 America/Chicago +33.01984 -96.69889 America/Chicago +29.89883 -93.92878 America/Chicago +27.87725 -97.32388 America/Chicago +32.94818 -96.72972 America/Chicago +32.93123 -96.45971 America/Chicago +29.55718 -95.80856 America/Chicago +30.50826 -97.6789 America/Chicago +32.9029 -96.56388 America/Chicago +32.97623 -96.59527 America/Chicago +32.86013 -97.36391 America/Chicago +29.42412 -98.49363 America/Chicago +26.13258 -97.6311 America/Chicago +26.18924 -98.15529 America/Chicago +29.88327 -97.94139 America/Chicago +29.55217 -98.26973 America/Chicago +29.56884 -97.96473 America/Chicago +33.63566 -96.60888 America/Chicago +29.66301 -95.23549 America/Chicago +32.94124 -97.13418 America/Chicago +30.07994 -95.41716 America/Chicago +29.61607 -95.55772 America/Chicago +32.2207 -98.20226 America/Chicago +29.61968 -95.63495 America/Chicago +33.13845 -95.60107 America/Chicago +30.57076 -97.40944 America/Chicago +31.09823 -97.34278 America/Chicago +32.73596 -96.27526 America/Chicago +33.42512 -94.04769 America/Chicago +29.38384 -94.9027 America/Chicago +33.08901 -96.88639 America/Chicago +30.15799 -95.48938 America/Chicago +32.35126 -95.30106 America/Chicago +29.54801 -98.29112 America/Chicago +32.85013 -96.80028 America/Chicago +29.20968 -99.78617 America/Chicago +28.80527 -97.0036 America/Chicago +31.54933 -97.14667 America/Chicago +32.85791 -97.25474 America/Chicago +32.38653 -96.84833 America/Chicago +32.7593 -97.79725 America/Chicago +26.15952 -97.99084 America/Chicago +32.75957 -97.45835 America/Chicago +33.91371 -98.49339 America/Chicago +33.01512 -96.53888 America/Chicago +38.80484 -77.04692 America/New_York +38.83039 -77.19637 America/New_York +38.88101 -77.10428 America/New_York +39.04372 -77.48749 America/New_York +38.85039 -77.1297 America/New_York +37.22957 -80.41394 America/New_York +37.52487 -77.55777 America/New_York +36.59649 -82.18847 America/New_York +38.73178 -77.4311 America/New_York +38.79345 -77.27165 America/New_York +37.22764 -80.01282 America/New_York +38.84039 -77.42888 America/New_York +38.89428 -77.4311 America/New_York +38.02931 -78.47668 America/New_York +38.56984 -77.26693 America/New_York +36.81904 -76.27494 America/New_York +37.35682 -77.44165 America/New_York +37.12985 -80.40894 America/New_York +37.26804 -77.40726 America/New_York +38.47318 -77.99666 America/New_York +38.63706 -77.31109 America/New_York +36.58597 -79.39502 America/New_York +37.03737 -76.33161 America/New_York +38.84622 -77.30637 America/New_York +38.78206 -77.14637 America/New_York +38.30318 -77.46054 America/New_York +38.99817 -77.28832 America/New_York +37.02987 -76.34522 America/New_York +38.44957 -78.86892 America/New_York +38.96955 -77.3861 America/New_York +37.54598 -77.32776 America/New_York +37.30432 -77.2872 America/New_York +38.74761 -77.08303 America/New_York +38.89511 -77.21165 America/New_York +38.86456 -77.18776 America/New_York +38.68789 -77.29776 America/New_York +37.64292 -77.50887 America/New_York +39.11566 -77.5636 America/New_York +38.81845 -77.14331 America/New_York +38.75984 -77.57499 America/New_York +38.70428 -77.22776 America/New_York +37.41375 -79.14225 America/New_York +38.75095 -77.47527 America/New_York +38.93428 -77.17748 America/New_York +37.60876 -77.37331 America/New_York +38.87428 -77.22693 America/New_York +38.61095 -77.33971 America/New_York +36.97876 -76.428 America/New_York +36.84681 -76.28522 America/New_York +38.88095 -77.30082 America/New_York +37.22793 -77.40193 America/New_York +36.83543 -76.29827 America/New_York +36.82098 -76.36883 America/New_York +37.13179 -80.57645 America/New_York +38.96872 -77.3411 America/New_York +37.55376 -77.46026 America/New_York +37.27097 -79.94143 America/New_York +38.78872 -77.11276 America/New_York +37.29347 -80.05476 America/New_York +37.65042 -77.61249 America/New_York +38.92094 -77.50388 America/New_York +36.71709 -76.59023 America/New_York +38.78928 -77.1872 America/New_York +38.14958 -79.0717 America/New_York +39.00622 -77.4286 America/New_York +38.79289 -77.49749 America/New_York +36.72821 -76.58356 America/New_York +37.59015 -77.55638 America/New_York +38.91872 -77.23109 America/New_York +38.90122 -77.26526 America/New_York +36.85293 -75.97798 America/New_York +38.06847 -78.88947 America/New_York +37.4032 -79.17808 America/New_York +38.77261 -77.22109 America/New_York +39.18566 -78.16333 America/New_York +38.93983 -77.28609 America/New_York +38.71678 -77.13276 America/New_York +37.77817 -81.18816 America/New_York +38.34982 -81.63262 America/New_York +39.28065 -80.34453 America/New_York +39.48508 -80.14258 America/New_York +38.41925 -82.44515 America/New_York +39.45621 -77.96389 America/New_York +39.62953 -79.9559 America/New_York +39.26674 -81.56151 America/New_York +34.81509 -92.22432 America/Chicago +39.48061 -86.05499 America/Indiana/Indianapolis +39.33312 -82.9824 America/New_York +28.98276 -95.9694 America/Chicago +33.24428 -86.81638 America/Chicago +34.26759 -86.20887 America/Chicago +33.65983 -85.83163 America/Chicago +34.80287 -86.97167 America/Chicago +32.60986 -85.48078 America/Chicago +41.91031 -88.07174 America/Chicago +42.6987 -71.13506 America/New_York +42.40843 -71.01199 America/New_York +41.39482 -73.45401 America/New_York +41.07871 -73.46929 America/New_York +42.2942 -83.30993 America/Detroit +41.52005 -81.55624 America/New_York +41.78232 -72.61203 America/New_York +41.27621 -72.86843 America/New_York +41.10565 -73.39845 America/New_York +41.97621 -72.59176 America/New_York +41.14121 -73.26373 America/New_York +41.71982 -72.83204 America/New_York +41.71232 -72.60815 America/New_York +41.28899 -72.68176 America/New_York +41.39593 -72.89677 America/New_York +41.76371 -72.68509 America/New_York +41.83871 -71.86924 America/New_York +41.43982 -72.01424 America/New_York +41.27954 -72.59843 America/New_York +41.77593 -72.52148 America/New_York +41.76593 -72.23369 America/New_York +41.53815 -72.80704 America/New_York +41.56232 -72.65065 America/New_York +41.22232 -73.0565 America/New_York +41.47899 -72.15119 America/New_York +41.48593 -73.05066 America/New_York +41.66121 -72.77954 America/New_York +41.30815 -72.92816 America/New_York +41.35565 -72.09952 America/New_York +41.69788 -72.72371 America/New_York +41.39093 -72.85954 America/New_York +41.13815 -73.54346 America/New_York +41.1176 -73.4079 America/New_York +41.52426 -72.07591 America/New_York +41.67649 -71.91507 America/New_York +41.67454 -72.85816 America/New_York +41.39676 -73.07594 America/New_York +41.31649 -73.09316 America/New_York +41.82371 -72.6212 America/New_York +41.48148 -73.21317 America/New_York +41.05343 -73.53873 America/New_York +41.80843 -72.24952 America/New_York +41.18454 -73.13317 America/New_York +41.80065 -73.12122 America/New_York +41.24287 -73.20067 America/New_York +41.45704 -72.82316 America/New_York +41.55815 -73.0515 America/New_York +41.76204 -72.74204 America/New_York +41.27065 -72.94705 America/New_York +41.81843 -73.14372 America/New_York +41.14149 -73.3579 America/New_York +41.71427 -72.65259 America/New_York +41.71065 -72.20813 America/New_York +41.19537 -73.4379 America/New_York +41.69982 -72.15702 America/New_York +41.8526 -72.6437 America/New_York +41.60232 -72.98677 America/New_York +42.03471 -93.61994 America/Chicago +41.72971 -93.60577 America/Chicago +41.52448 -90.51569 America/Chicago +40.80754 -91.11292 America/Chicago +42.52776 -92.44547 America/Chicago +42.00833 -91.64407 America/Chicago +41.84447 -90.18874 America/Chicago +41.60304 -93.72411 America/Chicago +41.6764 -91.58045 America/Chicago +41.26194 -95.86083 America/Chicago +41.52364 -90.57764 America/Chicago +41.60054 -93.60911 America/Chicago +42.50056 -90.66457 America/Chicago +42.49747 -94.16802 America/Chicago +41.66113 -91.53017 America/Chicago +41.67304 -93.69772 America/Chicago +42.03417 -91.59768 America/Chicago +42.04943 -92.90798 America/Chicago +43.15357 -93.20104 America/Chicago +41.42447 -91.04321 America/Chicago +41.69971 -93.04798 America/Chicago +41.02001 -92.4113 America/Chicago +42.49999 -96.40031 America/Chicago +41.62666 -93.71217 America/Chicago +42.49276 -92.34296 America/Chicago +41.57199 -93.74531 America/Chicago +41.9317 -87.98896 America/Chicago +42.16558 -88.29425 America/Chicago +41.66892 -87.73866 America/Chicago +42.08836 -87.98063 America/Chicago +41.76058 -88.32007 America/Chicago +41.99503 -88.18563 America/Chicago +41.85003 -88.31257 America/Chicago +41.88142 -87.88312 America/Chicago +42.26391 -88.84427 America/Chicago +41.95503 -87.94007 America/Chicago +41.85059 -87.79367 America/Chicago +41.95753 -88.0809 America/Chicago +40.4842 -88.99369 America/Chicago +41.65726 -87.68005 America/Chicago +41.69864 -88.0684 America/Chicago +41.1417 -87.87504 America/Chicago +41.14198 -87.86115 America/Chicago +41.75003 -87.80422 America/Chicago +41.82392 -87.85173 America/Chicago +42.15141 -87.95979 America/Chicago +41.73392 -87.7795 America/Chicago +41.61559 -87.52949 America/Chicago +41.91253 -88.13479 America/Chicago +42.12114 -88.25786 America/Chicago +42.21197 -88.23814 America/Chicago +40.11642 -88.24338 America/Chicago +41.85003 -87.65005 America/Chicago +41.50615 -87.6356 America/Chicago +41.84559 -87.75394 America/Chicago +41.56809 -87.72033 America/Chicago +41.55475 -88.09867 America/Chicago +42.24113 -88.3162 America/Chicago +40.12448 -87.63002 America/Chicago +41.75198 -87.97395 America/Chicago +41.92947 -88.75036 America/Chicago +42.17114 -87.84451 America/Chicago +42.03336 -87.8834 America/Chicago +41.83892 -89.47955 America/Chicago +41.63892 -87.60727 America/Chicago +41.80892 -88.01117 America/Chicago +41.50087 -90.4443 America/Chicago +40.66615 -89.5801 America/Chicago +42.03725 -88.28119 America/Chicago +42.00392 -87.97035 America/Chicago +41.89947 -87.94034 America/Chicago +41.92114 -87.80923 America/Chicago +42.04114 -87.69006 America/Chicago +41.72059 -87.70172 America/Chicago +41.49587 -87.84866 America/Chicago +41.93531 -87.86562 America/Chicago +42.29669 -89.62123 America/Chicago +40.94782 -90.37124 America/Chicago +41.88753 -88.30535 America/Chicago +41.87753 -88.06701 America/Chicago +42.06975 -87.78784 America/Chicago +41.6292 -87.93089 America/Chicago +42.34447 -88.04175 America/Chicago +42.3703 -87.90202 America/Chicago +41.99947 -88.14507 America/Chicago +41.61003 -87.64671 America/Chicago +42.18169 -87.80034 America/Chicago +41.80086 -87.93701 America/Chicago +42.04281 -88.0798 America/Chicago +41.60003 -87.93811 America/Chicago +41.55726 -87.6656 America/Chicago +42.16808 -88.42814 America/Chicago +41.52503 -88.08173 America/Chicago +41.12003 -87.86115 America/Chicago +41.80503 -87.86923 America/Chicago +42.25863 -87.84062 America/Chicago +42.19697 -88.09341 America/Chicago +42.18169 -88.33036 America/Chicago +41.56476 -87.53893 America/Chicago +41.67364 -88.00173 America/Chicago +42.28308 -87.95313 America/Chicago +41.80114 -88.07479 America/Chicago +41.58948 -88.05784 America/Chicago +41.88003 -88.00784 America/Chicago +42.32002 -89.05816 America/Chicago +42.34724 -89.039 America/Chicago +40.45921 -90.6718 America/Chicago +41.50392 -87.7131 America/Chicago +41.8792 -87.84312 America/Chicago +42.33336 -88.26675 America/Chicago +41.90059 -87.85673 America/Chicago +41.52614 -87.88922 America/Chicago +41.5067 -90.51513 America/Chicago +41.73058 -88.3459 America/Chicago +40.61282 -89.45926 America/Chicago +42.04059 -87.78256 America/Chicago +42.06642 -87.93729 America/Chicago +42.26308 -88.00397 America/Chicago +41.78586 -88.14729 America/Chicago +41.51198 -87.96561 America/Chicago +42.01892 -87.80284 America/Chicago +40.5142 -88.99063 America/Chicago +41.80614 -88.3273 America/Chicago +42.32558 -87.84118 America/Chicago +40.71754 -89.58426 America/Chicago +42.12753 -87.82895 America/Chicago +41.60281 -87.74394 America/Chicago +41.71087 -87.75811 America/Chicago +41.88503 -87.7845 America/Chicago +41.63031 -87.85394 America/Chicago +41.68281 -88.35146 America/Chicago +41.34559 -88.84258 America/Chicago +42.1103 -88.03424 America/Chicago +41.6967 -87.817 America/Chicago +41.49142 -87.67449 America/Chicago +42.01114 -87.84062 America/Chicago +40.56754 -89.64066 America/Chicago +40.69365 -89.58899 America/Chicago +41.62697 -88.20395 America/Chicago +42.0953 -87.93757 America/Chicago +41.50948 -90.57875 America/Chicago +42.27113 -89.094 America/Chicago +42.08419 -88.01313 America/Chicago +41.64753 -88.08951 America/Chicago +41.98475 -88.07979 America/Chicago +42.35336 -88.09341 America/Chicago +42.37169 -88.09008 America/Chicago +41.91419 -88.30869 America/Chicago +42.03336 -88.08341 America/Chicago +41.52003 -88.20173 America/Chicago +42.03336 -87.73339 America/Chicago +41.99419 -88.2923 America/Chicago +41.60087 -87.60699 America/Chicago +41.78864 -89.69622 America/Chicago +42.02558 -88.17841 America/Chicago +41.98892 -88.68675 America/Chicago +41.57337 -87.78449 America/Chicago +40.11059 -88.20727 America/Chicago +42.21809 -87.96513 America/Chicago +41.88975 -87.98895 America/Chicago +41.93808 -88.40452 America/Chicago +40.70365 -89.40731 America/Chicago +42.36363 -87.84479 America/Chicago +41.88475 -88.20396 America/Chicago +41.85059 -87.882 America/Chicago +41.79586 -87.97562 America/Chicago +41.86614 -88.10701 America/Chicago +42.13919 -87.92896 America/Chicago +42.07225 -87.72284 America/Chicago +41.74697 -88.05034 America/Chicago +42.31474 -88.4487 America/Chicago +41.64114 -88.44729 America/Chicago +42.44613 -87.83285 America/Chicago +40.10532 -85.68025 America/Indiana/Indianapolis +40.04115 -86.87445 America/Indiana/Indianapolis +41.41698 -87.36531 America/Chicago +41.4942 -87.52171 America/Chicago +41.6392 -87.45476 America/Chicago +41.68199 -85.97667 America/Indiana/Indianapolis +41.1306 -85.12886 America/Indiana/Indianapolis +40.27948 -86.51084 America/Indiana/Indianapolis +41.59337 -87.34643 America/Chicago +41.58227 -85.83444 America/Indiana/Indianapolis +41.74813 -86.12569 America/Indiana/Indianapolis +41.52837 -87.42365 America/Chicago +41.58337 -87.50004 America/Chicago +41.55365 -87.45198 America/Chicago +41.53226 -87.25504 America/Chicago +40.8831 -85.49748 America/Indiana/Indianapolis +40.48643 -86.1336 America/Indiana/Indianapolis +41.6106 -86.72252 America/Chicago +40.4167 -86.87529 America/Indiana/Indianapolis +40.04837 -86.46917 America/Indiana/Indianapolis +40.75448 -86.35667 America/Indiana/Indianapolis +40.55837 -85.65914 America/Indiana/Indianapolis +41.48281 -87.33281 America/Chicago +41.70754 -86.89503 America/Chicago +41.66199 -86.15862 America/Indiana/Indianapolis +40.19338 -85.38636 America/Indiana/Indianapolis +41.56448 -87.51254 America/Chicago +40.04559 -86.0086 America/Indiana/Indianapolis +41.57587 -87.17615 America/Chicago +41.47892 -87.45476 America/Chicago +41.68338 -86.25001 America/Indiana/Indianapolis +41.47309 -87.06114 America/Chicago +40.42587 -86.90807 America/Indiana/Indianapolis +40.04282 -86.12749 America/Indiana/Indianapolis +42.10482 -70.94532 America/New_York +42.48509 -71.43284 America/New_York +42.06954 -72.61481 America/New_York +42.85842 -70.93005 America/New_York +42.37537 -72.51925 America/New_York +42.41537 -71.15644 America/New_York +42.26121 -71.4634 America/New_York +41.94454 -71.28561 America/New_York +42.19454 -71.83563 America/New_York +41.70011 -70.29947 America/New_York +42.39593 -71.17867 America/New_York +42.55843 -70.88005 America/New_York +42.55343 -70.85366 America/New_York +42.55843 -71.26895 America/New_York +42.35843 -71.05977 America/New_York +42.22232 -70.99949 America/New_York +42.08343 -71.01838 America/New_York +42.33176 -71.12116 America/New_York +42.50482 -71.19561 America/New_York +42.3751 -71.10561 America/New_York +42.15843 -71.14477 America/New_York +42.59981 -71.36728 America/New_York +42.39176 -71.03283 America/New_York +42.14521 -72.60864 America/New_York +42.46037 -71.34895 America/New_York +42.57509 -70.93005 America/New_York +42.24177 -71.16616 America/New_York +42.67037 -71.30201 America/New_York +42.06454 -72.51259 America/New_York +42.26676 -72.66898 America/New_York +42.02454 -71.12866 America/New_York +42.40843 -71.05366 America/New_York +41.6376 -70.90365 America/New_York +41.70149 -71.15505 America/New_York +42.58342 -71.8023 America/New_York +42.27926 -71.41617 America/New_York +42.29732 -71.43701 America/New_York +42.08343 -71.39672 America/New_York +42.57509 -71.99813 America/New_York +42.61593 -70.66199 America/New_York +42.20704 -71.68562 America/New_York +42.58759 -72.59953 America/New_York +42.11316 -70.81199 America/New_York +42.7762 -71.07728 America/New_York +42.35176 -71.86341 America/New_York +42.20426 -72.6162 America/New_York +42.30982 -71.12033 America/New_York +42.70704 -71.16311 America/New_York +42.52509 -71.75979 America/New_York +42.44732 -71.2245 America/New_York +42.0501 -72.58287 America/New_York +42.63342 -71.31617 America/New_York +42.16009 -72.47592 America/New_York +42.46676 -70.94949 America/New_York +42.4251 -71.06616 America/New_York +42.03343 -71.21894 America/New_York +42.5001 -70.85783 America/New_York +42.34624 -71.55215 America/New_York +42.41843 -71.10616 America/New_York +42.45843 -71.06616 America/New_York +42.7262 -71.19089 America/New_York +42.13982 -71.51617 America/New_York +42.24954 -71.06616 America/New_York +42.28343 -71.3495 America/New_York +42.28343 -71.23283 America/New_York +41.63622 -70.9342 America/New_York +42.81259 -70.87728 America/New_York +42.33704 -71.20922 America/New_York +42.18343 -72.59953 America/New_York +42.32509 -72.6412 America/New_York +41.96677 -71.18699 America/New_York +42.19454 -71.1995 America/New_York +42.15843 -72.32869 America/New_York +42.52787 -70.92866 America/New_York +42.45008 -73.24538 America/New_York +42.25288 -71.00227 America/New_York +42.1626 -71.04116 America/New_York +42.52565 -71.09533 America/New_York +42.13066 -70.91616 America/New_York +42.51954 -70.89672 America/New_York +42.46482 -71.01005 America/New_York +42.29593 -71.71285 America/New_York +41.76955 -71.12866 America/New_York +42.3876 -71.0995 America/New_York +42.33343 -71.04949 America/New_York +42.25842 -72.57453 America/New_York +42.50982 -70.94949 America/New_York +42.0751 -72.03341 America/New_York +42.10148 -72.58981 America/New_York +42.4801 -71.0995 America/New_York +42.1251 -71.10227 America/New_York +42.38343 -71.41617 America/New_York +41.74816 -71.18977 America/New_York +41.9001 -71.08977 America/New_York +42.61065 -71.23422 America/New_York +42.50648 -71.07283 America/New_York +42.37649 -71.23561 America/New_York +42.37093 -71.18283 America/New_York +42.29649 -71.29256 America/New_York +42.10704 -72.62037 America/New_York +42.12509 -72.74954 America/New_York +42.57926 -71.43784 America/New_York +42.22093 -70.93977 America/New_York +42.54648 -71.17367 America/New_York +42.45232 -71.137 America/New_York +42.3751 -70.98283 America/New_York +42.47926 -71.15228 America/New_York +42.26259 -71.80229 America/New_York +41.70567 -70.22863 America/New_York +44.09785 -70.23117 America/New_York +44.31062 -69.77949 America/New_York +44.80118 -68.77781 America/New_York +43.49258 -70.45338 America/New_York +43.91452 -69.96533 America/New_York +44.10035 -70.21478 America/New_York +43.66147 -70.25533 America/New_York +43.50092 -70.44283 America/New_York +43.64147 -70.24088 America/New_York +43.63897 -70.31533 America/New_York +44.55201 -69.63171 America/New_York +43.57036 -70.38783 America/New_York +43.67703 -70.37116 America/New_York +41.89755 -84.03717 America/Detroit +42.25754 -83.21104 America/Detroit +42.97225 -85.95365 America/Detroit +42.27756 -83.74088 America/Detroit +42.68753 -83.2341 America/Detroit +42.32115 -85.17971 America/Detroit +43.59447 -83.88886 America/Detroit +42.5467 -83.21132 America/Detroit +42.99947 -83.61634 America/Detroit +42.30865 -83.48216 America/Detroit +42.58698 -82.91992 America/Detroit +42.32226 -83.17631 America/Detroit +42.33698 -83.27326 America/Detroit +42.33143 -83.04575 America/Detroit +42.73698 -84.48387 America/Detroit +42.46837 -82.95547 America/Detroit +42.48531 -83.37716 America/Detroit +42.46059 -83.13465 America/Detroit +43.01253 -83.68746 America/Detroit +42.95947 -85.48975 America/Detroit +42.32559 -83.33104 America/Detroit +42.96336 -85.66809 America/Detroit +42.90975 -85.76309 America/Detroit +42.44365 -82.90686 America/Detroit +42.39282 -83.04964 America/Detroit +42.74698 -84.40108 America/Detroit +42.46254 -83.10409 America/Detroit +42.78752 -86.10893 America/Detroit +42.64059 -84.51525 America/Detroit +42.24587 -84.40135 America/Detroit +42.90725 -85.79198 America/Detroit +42.29171 -85.58723 America/Detroit +42.86947 -85.64475 America/Detroit +42.73254 -84.55553 America/Detroit +42.25059 -83.17854 America/Detroit +42.36837 -83.35271 America/Detroit +42.48587 -83.1052 America/Detroit +46.54354 -87.39542 America/Detroit +43.61558 -84.24721 America/Detroit +41.91643 -83.39771 America/Detroit +42.59726 -82.87798 America/Detroit +43.59781 -84.76751 America/Detroit +43.23418 -86.24839 America/Detroit +43.1689 -86.26395 America/Detroit +42.48059 -83.47549 America/Detroit +42.45948 -83.18271 America/Detroit +42.72226 -84.42747 America/Detroit +42.9978 -84.17664 America/Detroit +42.63892 -83.29105 America/Detroit +42.97086 -82.42491 America/Detroit +42.20115 -85.58 America/Detroit +42.38337 -83.2966 America/Detroit +42.65837 -83.14993 America/Detroit +42.22226 -83.3966 America/Detroit +42.49726 -82.93714 America/Detroit +42.48948 -83.14465 America/Detroit +43.41947 -83.95081 America/Detroit +42.67087 -83.03298 America/Detroit +42.47337 -83.22187 America/Detroit +42.21393 -83.19381 America/Detroit +42.49698 -82.88881 America/Detroit +42.58031 -83.0302 America/Detroit +42.24087 -83.26965 America/Detroit +42.13949 -83.17826 America/Detroit +42.60559 -83.14993 America/Detroit +43.00141 -85.76809 America/Detroit +42.47754 -83.0277 America/Detroit +42.70225 -83.40272 America/Detroit +42.7392 -84.62082 America/Detroit +42.28143 -83.38632 America/Detroit +42.3242 -83.40021 America/Detroit +42.21421 -83.14992 America/Detroit +42.91336 -85.70531 America/Detroit +42.24115 -83.61299 America/Detroit +43.64801 -93.36827 America/Chicago +45.2333 -93.29134 America/Chicago +45.19774 -93.38718 America/Chicago +44.73191 -93.21772 America/Chicago +43.66663 -92.97464 America/Chicago +45.1608 -93.23495 America/Chicago +44.8408 -93.29828 America/Chicago +45.07608 -93.33273 America/Chicago +45.09413 -93.35634 America/Chicago +45.17191 -93.87469 America/Chicago +44.76774 -93.27772 America/Chicago +45.18885 -93.39745 America/Chicago +44.86219 -93.53079 America/Chicago +44.78941 -93.60218 America/Chicago +45.0408 -93.263 America/Chicago +45.11997 -93.28773 America/Chicago +44.82774 -92.94382 America/Chicago +45.03274 -93.36023 America/Chicago +46.78327 -92.10658 America/Chicago +44.80413 -93.16689 America/Chicago +44.85469 -93.47079 America/Chicago +44.88969 -93.34995 America/Chicago +45.30385 -93.56718 America/Chicago +44.29496 -93.26883 America/Chicago +44.64024 -93.14355 America/Chicago +45.27886 -92.98522 America/Chicago +45.08608 -93.26328 America/Chicago +45.00969 -93.34912 America/Chicago +45.25024 -93.24995 America/Chicago +44.7433 -92.85243 America/Chicago +47.42715 -92.93769 America/Chicago +44.92496 -93.46273 America/Chicago +44.84802 -93.04272 America/Chicago +44.64969 -93.24272 America/Chicago +45.16024 -93.08883 America/Chicago +44.16358 -93.9994 America/Chicago +45.07246 -93.45579 America/Chicago +44.95302 -92.99522 America/Chicago +44.97997 -93.26384 America/Chicago +44.9133 -93.50329 America/Chicago +44.94107 -93.4419 America/Chicago +46.87385 -96.76758 America/Chicago +45.06552 -93.20189 America/Chicago +45.03802 -93.38662 America/Chicago +44.4583 -93.1616 America/Chicago +44.96302 -92.96494 America/Chicago +44.08385 -93.22604 America/Chicago +45.01052 -93.45551 America/Chicago +44.7133 -93.42273 America/Chicago +45.2611 -93.45 America/Chicago +44.56247 -92.5338 America/Chicago +44.8833 -93.283 America/Chicago +44.02163 -92.4699 America/Chicago +44.73941 -93.12577 America/Chicago +45.00608 -93.15661 America/Chicago +45.5608 -94.16249 America/Chicago +44.9483 -93.34801 America/Chicago +45.20996 -93.66496 America/Chicago +44.94441 -93.09327 America/Chicago +45.62163 -94.20694 America/Chicago +44.77913 -93.33634 America/Chicago +44.79802 -93.5269 America/Chicago +45.07913 -93.14717 America/Chicago +44.89274 -93.03494 America/Chicago +45.05636 -92.80604 America/Chicago +45.15969 -93.34967 America/Chicago +44.91608 -93.10161 America/Chicago +45.08469 -93.00994 America/Chicago +45.12191 -95.04334 America/Chicago +44.04996 -91.63932 America/Chicago +44.92386 -92.95938 America/Chicago +40.19475 -92.58325 America/Chicago +46.87719 -96.7898 America/Chicago +47.92526 -97.03285 America/Chicago +46.91054 -98.70844 America/Chicago +46.87497 -96.90036 America/Chicago +41.13667 -95.89084 America/Chicago +41.42973 -97.36838 America/Chicago +41.43333 -96.49808 America/Chicago +40.92501 -98.34201 America/Chicago +40.58612 -98.38839 America/Chicago +40.69946 -99.08148 America/Chicago +41.18389 -96.03113 America/Chicago +40.8 -96.66696 America/Chicago +42.02834 -97.417 America/Chicago +41.25861 -95.93779 America/Chicago +41.15444 -96.04224 America/Chicago +42.94647 -71.5159 America/New_York +43.20814 -71.53757 America/New_York +42.88064 -71.32729 America/New_York +42.89175 -71.31201 America/New_York +43.19786 -70.87367 America/New_York +43.24202 -71.53813 America/New_York +42.93369 -72.27814 America/New_York +43.52785 -71.47035 America/New_York +42.99564 -71.45479 America/New_York +42.86509 -71.4934 America/New_York +42.76537 -71.46757 America/New_York +43.07176 -70.76255 America/New_York +43.30453 -70.97562 America/New_York +42.78842 -71.20089 America/New_York +40.22039 -74.01208 America/New_York +40.58038 -74.28515 America/New_York +40.66871 -74.11431 America/New_York +40.79371 -74.15014 America/New_York +40.9276 -73.99736 America/New_York +40.80677 -74.18542 America/New_York +40.57733 -74.2282 America/New_York +40.82149 -73.98764 America/New_York +40.85843 -74.16376 America/New_York +40.57455 -74.30209 America/New_York +40.65844 -74.29959 America/New_York +40.88399 -74.5621 America/New_York +40.94065 -73.99681 America/New_York +40.42788 -74.41598 America/New_York +40.76732 -74.20487 America/New_York +40.51872 -74.4121 America/New_York +40.66399 -74.2107 America/New_York +40.90399 -74.11848 America/New_York +40.89288 -73.97264 America/New_York +40.26983 -74.79988 America/New_York +40.94038 -74.13181 America/New_York +40.52927 -74.31598 America/New_York +40.85093 -73.97014 America/New_York +40.88149 -74.1132 America/New_York +40.88593 -74.04347 America/New_York +40.94926 -74.15375 America/New_York +40.70121 -74.23015 America/New_York +40.74399 -74.03236 America/New_York +40.93288 -74.65933 America/New_York +40.94399 -74.67072 America/New_York +40.73232 -74.23487 America/New_York +40.57538 -74.32237 America/New_York +40.72816 -74.07764 America/New_York +40.76843 -74.14542 America/New_York +40.09789 -74.21764 America/New_York +40.62205 -74.24459 America/New_York +40.79593 -74.31487 America/New_York +40.88232 -74.0832 America/New_York +40.30428 -73.99236 America/New_York +40.81204 -74.12431 America/New_York +40.75982 -74.4171 America/New_York +41.08871 -74.14376 America/New_York +40.73121 -74.27348 America/New_York +40.82593 -74.20903 America/New_York +40.79677 -74.48154 America/New_York +40.48622 -74.45182 America/New_York +40.93268 -74.01785 America/New_York +40.73566 -74.17237 America/New_York +40.78843 -74.1332 America/New_York +40.80427 -74.01208 America/New_York +40.6301 -74.42737 America/New_York +40.82232 -74.15987 America/New_York +40.41483 -74.36543 America/New_York +40.77066 -74.23265 America/New_York +40.84816 -73.99764 America/New_York +40.94454 -74.07542 America/New_York +40.85788 -74.42599 America/New_York +40.85677 -74.12848 America/New_York +40.91677 -74.17181 America/New_York +40.50677 -74.26542 America/New_York +40.49927 -74.39904 America/New_York +40.61682 -74.41727 America/New_York +40.08317 -74.06819 America/New_York +40.60816 -74.27765 America/New_York +40.97926 -74.11653 America/New_York +40.66427 -74.2632 America/New_York +40.82649 -74.10681 America/New_York +40.45927 -74.36098 America/New_York +40.46538 -74.33043 America/New_York +40.65538 -74.38987 America/New_York +40.79672 -74.05532 America/New_York +40.4976 -74.48849 America/New_York +40.40816 -74.35432 America/New_York +40.74899 -74.26126 America/New_York +40.57927 -74.41154 America/New_York +40.4465 -74.38598 America/New_York +40.74149 -74.35959 America/New_York +40.8976 -74.01597 America/New_York +40.30428 -74.10042 America/New_York +40.21705 -74.74294 America/New_York +40.6976 -74.2632 America/New_York +40.77955 -74.02375 America/New_York +40.92538 -74.27654 America/New_York +41.13121 -74.36737 America/New_York +40.78788 -74.01431 America/New_York +40.79871 -74.23904 America/New_York +40.65899 -74.34737 America/New_York +40.02789 -74.86905 America/New_York +40.5576 -74.28459 America/New_York +41.00954 -74.17292 America/New_York +42.65258 -73.75623 America/New_York +42.97839 -78.79976 America/New_York +42.93869 -74.18819 America/New_York +42.93173 -76.56605 America/New_York +40.65649 -73.6093 America/New_York +42.99812 -78.18752 America/New_York +40.7251 -73.24539 America/New_York +41.50482 -73.96958 America/New_York +40.66871 -73.52707 America/New_York +40.60177 -73.99403 America/New_York +40.74427 -73.48207 America/New_York +42.09869 -75.91797 America/New_York +40.78121 -73.24623 America/New_York +43.14756 -77.55055 America/New_York +40.84985 -73.86641 America/New_York +40.6501 -73.94958 America/New_York +42.88645 -78.87837 America/New_York +40.85843 -73.09955 America/New_York +40.79065 -73.20178 America/New_York +42.90339 -78.75475 America/New_York +42.77424 -73.70012 America/New_York +40.84288 -73.29289 America/New_York +40.57788 -73.99403 America/New_York +40.68149 -73.39984 America/New_York +40.86871 -73.00149 America/New_York +42.60118 -76.18048 America/New_York +40.76177 -73.32929 America/New_York +42.90395 -78.69225 America/New_York +40.80482 -73.33623 America/New_York +40.71399 -73.55902 America/New_York +40.67343 -73.43651 America/New_York +40.66677 -73.88236 America/New_York +40.87676 -73.32456 America/New_York +40.76704 -72.99622 America/New_York +40.94149 -73.10594 America/New_York +40.8876 -73.83291 America/New_York +42.96339 -78.80392 America/New_York +42.0898 -76.80773 America/New_York +40.70094 -73.71291 America/New_York +40.83121 -73.02955 America/New_York +40.72371 -73.70485 America/New_York +40.70732 -73.67596 America/New_York +40.6576 -73.58318 America/New_York +40.72677 -73.6343 America/New_York +40.86232 -73.63374 America/New_York +43.05285 -74.34375 America/New_York +41.03288 -73.84291 America/New_York +40.96899 -73.71263 America/New_York +40.82565 -73.20261 America/New_York +40.70621 -73.61874 America/New_York +40.76843 -73.52513 America/New_York +40.81232 -73.07844 America/New_York +40.81538 -73.04511 America/New_York +40.86815 -73.42568 America/New_York +40.85343 -73.41151 America/New_York +43.2134 -77.57972 America/New_York +40.72982 -73.21039 America/New_York +42.44063 -76.49661 America/New_York +40.69149 -73.80569 America/New_York +42.097 -79.23533 America/New_York +42.11563 -75.95881 America/New_York +42.96589 -78.87004 America/New_York +40.88621 -73.25734 America/New_York +41.92704 -73.99736 America/New_York +41.34204 -74.16792 America/New_York +42.82561 -78.82337 America/New_York +40.8351 -73.13122 America/New_York +40.72593 -73.51429 America/New_York +40.68677 -73.37345 America/New_York +43.17061 -78.69031 America/New_York +40.58844 -73.65791 America/New_York +40.74482 -73.94875 America/New_York +40.65483 -73.6718 America/New_York +40.94871 -73.73263 America/New_York +40.78343 -73.96625 America/New_York +40.68066 -73.47429 America/New_York +40.68038 -73.45512 America/New_York +40.80204 -72.84094 America/New_York +40.8176 -73.00011 America/New_York +40.79343 -73.41512 America/New_York +40.66288 -73.55152 America/New_York +41.44593 -74.42293 America/New_York +40.74927 -73.64068 America/New_York +41.11121 -74.06848 America/New_York +40.9126 -73.83708 America/New_York +41.08871 -74.01347 America/New_York +41.1476 -73.98931 America/New_York +40.91149 -73.78235 America/New_York +40.71427 -74.00597 America/New_York +41.50343 -74.01042 America/New_York +43.0945 -79.05671 America/New_York +40.6976 -73.42512 America/New_York +40.71649 -73.32179 America/New_York +40.73621 -73.26262 America/New_York +40.69149 -73.53346 America/New_York +40.70093 -73.46207 America/New_York +43.03867 -78.8642 America/New_York +40.6851 -73.7018 America/New_York +40.63871 -73.64013 America/New_York +41.16287 -73.86152 America/New_York +43.45535 -76.5105 America/New_York +41.05899 -74.02181 America/New_York +41.29009 -73.92042 America/New_York +40.77649 -73.46735 America/New_York +44.69949 -73.45291 America/New_York +41.00176 -73.66568 America/New_York +40.82566 -73.69819 America/New_York +41.70037 -73.92097 America/New_York +40.68149 -73.83652 America/New_York +43.15478 -77.61556 America/New_York +40.65871 -73.64124 America/New_York +43.21285 -75.45573 America/New_York +40.81538 -73.11233 America/New_York +40.67871 -73.58902 America/New_York +42.78702 -73.97096 America/New_York +40.98065 -73.68374 America/New_York +43.08313 -73.78457 America/New_York +40.73593 -73.08206 America/New_York +41.0051 -73.78458 America/New_York +42.81424 -73.93957 America/New_York +40.66593 -73.48818 America/New_York +40.86649 -73.03566 America/New_York +40.80149 -72.8676 America/New_York +40.85593 -73.20067 America/New_York +41.11315 -74.04375 America/New_York +40.56233 -74.13986 America/New_York +40.82621 -73.50207 America/New_York +43.04812 -76.14742 America/New_York +43.02033 -78.88032 America/New_York +42.72841 -73.69179 America/New_York +40.70038 -73.59291 America/New_York +43.1009 -75.23266 America/New_York +40.66427 -73.70846 America/New_York +40.68371 -73.51013 America/New_York +43.97478 -75.91076 America/New_York +42.68313 -73.77845 America/New_York +40.71816 -73.35429 America/New_York +40.70482 -73.65013 America/New_York +40.70621 -73.30623 America/New_York +42.85006 -78.79975 America/New_York +40.75566 -73.58763 America/New_York +41.03399 -73.76291 America/New_York +40.63205 -73.71263 America/New_York +40.93121 -73.89875 America/New_York +41.08144 -81.51901 America/New_York +40.91534 -81.10593 America/New_York +40.86867 -82.31822 America/New_York +41.86505 -80.78981 America/New_York +41.31755 -81.34539 America/New_York +41.10172 -80.76452 America/New_York +41.45171 -82.03542 America/New_York +41.45976 -82.01959 America/New_York +41.50532 -82.0282 America/New_York +41.01283 -81.60512 America/New_York +41.48477 -81.92208 America/New_York +41.36616 -81.8543 America/New_York +41.02423 -80.66285 America/New_York +41.37477 -83.65132 America/New_York +41.31394 -81.68513 America/New_York +41.39838 -81.80458 America/New_York +41.23811 -81.8418 America/New_York +40.79895 -81.37845 America/New_York +41.4995 -81.69541 America/New_York +41.13394 -81.48456 America/New_York +41.28449 -84.35578 America/New_York +40.29867 -83.06796 America/New_York +40.09923 -83.11408 America/New_York +41.53311 -81.57901 America/New_York +41.65394 -81.45039 America/New_York +41.36838 -82.10765 America/New_York +41.5931 -81.52679 America/New_York +41.44144 -81.8643 America/New_York +41.04422 -83.64993 America/New_York +41.35033 -83.12186 America/New_York +40.01923 -82.87934 America/New_York +41.417 -81.60596 America/New_York +40.94589 -81.48317 America/New_York +40.0334 -83.15825 America/New_York +41.24006 -81.44067 America/New_York +41.15367 -81.35789 America/New_York +41.48199 -81.79819 America/New_York +40.74255 -84.10523 America/New_York +41.45282 -82.18237 America/New_York +40.75839 -82.51545 America/New_York +41.41533 -81.56596 America/New_York +40.58867 -83.12852 America/New_York +40.23645 -83.36714 America/New_York +40.79672 -81.52151 America/New_York +41.51922 -81.4579 America/New_York +41.13839 -81.86375 America/New_York +41.66616 -81.33955 America/New_York +41.36144 -81.81291 America/New_York +40.3934 -82.48572 America/New_York +40.48979 -81.44567 America/New_York +40.05812 -82.40126 America/New_York +41.18284 -80.76536 America/New_York +40.87589 -81.40234 America/New_York +41.4156 -81.92347 America/New_York +41.38949 -82.01903 America/New_York +41.31366 -81.72457 America/New_York +41.24255 -82.61573 America/New_York +41.64366 -83.48688 America/New_York +41.72449 -81.24566 America/New_York +41.40477 -81.72291 America/New_York +41.39005 -81.75958 America/New_York +41.557 -83.62716 America/New_York +40.14477 -84.24244 America/New_York +41.4756 -81.8393 America/New_York +41.44894 -82.70796 America/New_York +41.47394 -81.53707 America/New_York +40.28422 -84.1555 America/New_York +41.38978 -81.44123 America/New_York +41.52311 -81.51846 America/New_York +40.36979 -80.63396 America/New_York +41.1595 -81.44039 America/New_York +41.23922 -81.34594 America/New_York +41.3145 -81.83569 America/New_York +41.71894 -83.71299 America/New_York +41.10145 -81.44178 America/New_York +41.1145 -83.17797 America/New_York +41.66394 -83.55521 America/New_York +40.0395 -84.20328 America/New_York +41.31256 -81.44011 America/New_York +41.02561 -81.72985 America/New_York +41.23756 -80.81842 America/New_York +40.12617 -82.92907 America/New_York +41.45532 -81.91792 America/New_York +41.63977 -81.4065 America/New_York +40.80506 -81.93514 America/New_York +41.09978 -80.64952 America/New_York +40.60843 -75.49018 America/New_York +40.55951 -79.95867 America/New_York +40.51868 -78.39474 America/New_York +41.33591 -75.99631 America/New_York +40.33813 -79.97894 America/New_York +40.32757 -80.0395 America/New_York +40.62593 -75.37046 America/New_York +40.20148 -77.18887 America/New_York +40.68843 -75.22073 America/New_York +42.12922 -80.08506 America/New_York +40.2737 -76.88442 America/New_York +40.95842 -75.97465 America/New_York +41.23339 -80.44868 America/New_York +40.32674 -78.92197 America/New_York +40.08927 -75.39602 America/New_York +40.03788 -76.30551 America/New_York +40.2415 -75.28379 America/New_York +40.34093 -76.41135 America/New_York +40.15511 -74.82877 America/New_York +40.23093 -75.52212 America/New_York +40.34785 -79.86422 America/New_York +40.42118 -79.7881 America/New_York +40.35535 -80.0495 America/New_York +40.10677 -75.95272 America/New_York +40.4284 -79.69754 America/New_York +41.00367 -80.34701 America/New_York +40.1215 -75.3399 America/New_York +40.50118 -79.83922 America/New_York +40.13038 -75.51491 America/New_York +40.44062 -79.99589 America/New_York +40.50035 -79.74949 America/New_York +40.24537 -75.64963 America/New_York +40.04622 -75.35991 America/New_York +40.33565 -75.92687 America/New_York +41.40897 -75.66241 America/New_York +40.7934 -77.86 America/New_York +40.3359 -80.08339 America/New_York +40.044 -75.38769 America/New_York +40.3634 -79.86644 America/New_York +40.66676 -75.49991 America/New_York +41.24591 -75.88131 America/New_York +40.44174 -79.88199 America/New_York +41.24119 -77.00108 America/New_York +40.144 -75.11573 America/New_York +41.74066 -71.30866 America/New_York +41.67705 -71.26616 America/New_York +41.89066 -71.39228 America/New_York +41.7001 -71.68284 America/New_York +41.77982 -71.43728 America/New_York +41.96677 -71.43284 America/New_York +41.81371 -71.37005 America/New_York +41.54566 -71.29144 America/New_York +41.4901 -71.31283 America/New_York +41.5501 -71.46617 America/New_York +41.8501 -71.46617 America/New_York +41.87871 -71.38256 America/New_York +41.60232 -71.25033 America/New_York +41.82399 -71.41283 America/New_York +41.92204 -71.54951 America/New_York +41.7001 -71.41617 America/New_York +41.69689 -71.52194 America/New_York +41.3776 -71.82729 America/New_York +42.00288 -71.51478 America/New_York +45.4647 -98.48648 America/Chicago +44.31136 -96.79839 America/Chicago +43.70943 -98.0298 America/Chicago +43.54997 -96.70033 America/Chicago +44.89941 -97.11507 America/Chicago +44.47588 -73.21207 America/New_York +44.54394 -73.14791 America/New_York +43.61062 -72.97261 America/New_York +44.46699 -73.17096 America/New_York +44.26193 -88.41538 America/Chicago +44.48221 -88.0701 America/Chicago +43.45777 -88.83733 America/Chicago +42.50835 -89.03178 America/Chicago +43.06057 -88.10648 America/Chicago +42.8078 -87.92425 America/Chicago +42.95974 -87.86147 America/Chicago +44.44888 -88.06038 America/Chicago +44.81135 -91.49849 America/Chicago +42.96083 -89.46984 America/Chicago +43.775 -88.43883 America/Chicago +42.88863 -88.03842 America/Chicago +43.22862 -88.11037 America/Chicago +44.51916 -88.01983 America/Chicago +42.9614 -88.01259 America/Chicago +44.5436 -88.08816 America/Chicago +42.68279 -89.01872 America/Chicago +44.27804 -88.27205 America/Chicago +42.58474 -87.82119 America/Chicago +43.80136 -91.23958 America/Chicago +43.07305 -89.40123 America/Chicago +44.08861 -87.65758 America/Chicago +44.66885 -90.1718 America/Chicago +44.20221 -88.4465 America/Chicago +43.1789 -88.11731 America/Chicago +44.87552 -91.91934 America/Chicago +43.2364 -87.98453 America/Chicago +43.09722 -89.50429 America/Chicago +43.0389 -87.90647 America/Chicago +42.90585 -88.13898 America/Chicago +44.18582 -88.46261 America/Chicago +42.9764 -88.10842 America/Chicago +43.84635 -91.24819 America/Chicago +42.88585 -87.86314 America/Chicago +43.11167 -88.49927 America/Chicago +43.88441 -91.23514 America/Chicago +44.02471 -88.54261 America/Chicago +42.55308 -87.93341 America/Chicago +42.72613 -87.78285 America/Chicago +43.75083 -87.71453 America/Chicago +42.91057 -87.86064 America/Chicago +44.52358 -89.57456 America/Chicago +43.1836 -89.21373 America/Chicago +46.72077 -92.10408 America/Chicago +43.19472 -88.72899 America/Chicago +43.01168 -88.23148 America/Chicago +44.95914 -89.63012 America/Chicago +43.04946 -88.00759 America/Chicago +43.01668 -88.00703 America/Chicago +43.42528 -88.18343 America/Chicago +44.38358 -89.81735 America/Chicago +40.41896 -80.58952 America/New_York +40.4084 -80.53924 America/New_York +40.06396 -80.72091 America/New_York +41.34621 -73.079 America/New_York +41.16704 -73.20483 America/New_York +41.67176 -72.94927 America/New_York +41.27954 -72.8151 America/New_York +41.49899 -72.90066 America/New_York +34.39916 -118.91815 America/Los_Angeles +33.37032 -112.58378 America/Phoenix +35.14778 -114.5683 America/Phoenix +32.8795 -111.75735 America/Phoenix +32.32341 -110.9951 America/Phoenix +32.29785 -110.9187 America/Phoenix +33.30616 -111.84125 America/Phoenix +31.34455 -109.54534 America/Phoenix +32.14119 -111.02843 America/Phoenix +33.61309 -112.3246 America/Phoenix +32.7559 -111.55484 America/Phoenix +35.19807 -111.65127 America/Phoenix +33.03145 -111.38734 America/Phoenix +32.29396 -111.00982 America/Phoenix +32.65783 -114.41189 America/Phoenix +33.61171 -111.71736 America/Phoenix +33.35283 -111.78903 America/Phoenix +33.53865 -112.18599 America/Phoenix +33.43532 -112.35821 America/Phoenix +31.85425 -110.9937 America/Phoenix +35.18944 -114.05301 America/Phoenix +34.4839 -114.32245 America/Phoenix +32.43674 -111.22538 America/Phoenix +33.05811 -112.04764 America/Phoenix +33.42227 -111.82264 America/Phoenix +31.34038 -110.93425 America/Phoenix +32.39091 -110.96649 America/Phoenix +34.23087 -111.32514 America/Phoenix +33.5806 -112.23738 America/Phoenix +33.44838 -112.07404 America/Phoenix +34.54002 -112.4685 America/Phoenix +34.58941 -112.32525 America/Phoenix +33.24866 -111.6343 America/Phoenix +31.47148 -110.97648 America/Phoenix +31.95758 -110.95565 America/Phoenix +32.487 -114.78218 America/Phoenix +33.50921 -111.89903 America/Phoenix +31.55454 -110.30369 America/Phoenix +33.59754 -112.27182 America/Phoenix +33.66198 -112.34127 America/Phoenix +33.63059 -112.33322 America/Phoenix +32.25174 -110.73731 America/Phoenix +33.41477 -111.90931 America/Phoenix +33.41421 -111.94348 America/Phoenix +32.22174 -110.92648 America/Phoenix +32.72532 -114.6244 America/Phoenix +34.58277 -117.40922 America/Los_Angeles +34.14306 -118.73787 America/Los_Angeles +34.13639 -118.77453 America/Los_Angeles +37.76521 -122.24164 America/Los_Angeles +37.88687 -122.29775 America/Los_Angeles +34.09529 -118.12701 America/Los_Angeles +33.56504 -117.72712 America/Los_Angeles +34.18973 -118.13118 America/Los_Angeles +37.36605 -121.82718 America/Los_Angeles +38.17492 -122.2608 America/Los_Angeles +33.83529 -117.9145 America/Los_Angeles +38.70824 -121.32995 America/Los_Angeles +38.00492 -121.80579 America/Los_Angeles +34.50083 -117.18588 America/Los_Angeles +34.13973 -118.03534 America/Los_Angeles +35.11859 -120.59073 America/Los_Angeles +33.86585 -118.08312 America/Los_Angeles +35.20913 -118.82843 America/Los_Angeles +37.69465 -122.11385 America/Los_Angeles +35.48942 -120.67073 America/Los_Angeles +37.34772 -120.60908 America/Los_Angeles +36.00412 -120.12903 America/Los_Angeles +34.03612 -117.99118 America/Los_Angeles +34.13362 -117.90756 America/Los_Angeles +35.37329 -119.01871 America/Los_Angeles +34.08529 -117.9609 America/Los_Angeles +33.92557 -116.87641 America/Los_Angeles +34.89859 -117.02282 America/Los_Angeles +34.86971 -117.05615 America/Los_Angeles +38.02909 -121.96163 America/Los_Angeles +33.92946 -116.97725 America/Los_Angeles +33.97751 -118.18702 America/Los_Angeles +33.96529 -118.15146 America/Los_Angeles +33.88168 -118.11701 America/Los_Angeles +37.52021 -122.2758 America/Los_Angeles +38.04936 -122.15858 America/Los_Angeles +37.87159 -122.27275 America/Los_Angeles +34.07362 -118.40036 America/Los_Angeles +34.07029 -117.39588 America/Los_Angeles +33.6103 -114.59635 America/Los_Angeles +32.80755 -116.93642 America/Los_Angeles +34.0339 -118.20535 America/Los_Angeles +32.97866 -115.53027 America/Los_Angeles +33.91668 -117.90006 America/Los_Angeles +37.92687 -121.72577 America/Los_Angeles +33.86751 -117.99812 America/Los_Angeles +34.18084 -118.30897 America/Los_Angeles +37.5841 -122.36608 America/Los_Angeles +34.15778 -118.63842 America/Los_Angeles +32.67895 -115.49888 America/Los_Angeles +34.21639 -119.0376 America/Los_Angeles +38.66879 -120.98716 America/Los_Angeles +37.28717 -121.94996 America/Los_Angeles +34.20112 -118.59814 America/Los_Angeles +33.15809 -117.35059 America/Los_Angeles +38.61713 -121.32828 America/Los_Angeles +33.83141 -118.28202 America/Los_Angeles +34.48888 -118.62287 America/Los_Angeles +37.6941 -122.08635 America/Los_Angeles +33.77974 -116.46529 America/Los_Angeles +37.59493 -120.95771 America/Los_Angeles +33.85835 -118.06479 America/Los_Angeles +34.25723 -118.6012 America/Los_Angeles +39.72849 -121.83748 America/Los_Angeles +34.01223 -117.68894 America/Los_Angeles +33.9938 -117.75888 America/Los_Angeles +37.123 -120.26018 America/Los_Angeles +32.64005 -117.0842 America/Los_Angeles +38.70712 -121.28106 America/Los_Angeles +34.09668 -117.71978 America/Los_Angeles +38.95823 -122.62637 America/Los_Angeles +36.82523 -119.70292 America/Los_Angeles +33.6803 -116.17389 America/Los_Angeles +34.0739 -117.31365 America/Los_Angeles +33.89585 -118.22007 America/Los_Angeles +37.97798 -122.03107 America/Los_Angeles +36.09801 -119.5604 America/Los_Angeles +33.87529 -117.56644 America/Los_Angeles +32.68589 -117.18309 America/Los_Angeles +33.64113 -117.91867 America/Los_Angeles +34.09001 -117.89034 America/Los_Angeles +33.96057 -118.18535 America/Los_Angeles +34.02112 -118.39647 America/Los_Angeles +37.323 -122.03218 America/Los_Angeles +33.81696 -118.03729 America/Los_Angeles +37.70577 -122.46192 America/Los_Angeles +33.46697 -117.69811 America/Los_Angeles +37.82159 -121.99996 America/Los_Angeles +38.54491 -121.74052 America/Los_Angeles +35.76884 -119.24705 America/Los_Angeles +33.96112 -116.50168 America/Los_Angeles +34.02862 -117.81034 America/Los_Angeles +36.54328 -119.38707 America/Los_Angeles +38.44546 -121.8233 America/Los_Angeles +33.94001 -118.13257 America/Los_Angeles +34.13945 -117.97729 America/Los_Angeles +37.70215 -121.93579 America/Los_Angeles +33.89807 -118.19535 America/Los_Angeles +33.74002 -116.93891 America/Los_Angeles +34.0239 -118.17202 America/Los_Angeles +37.46883 -122.14108 America/Los_Angeles +32.79477 -116.96253 America/Los_Angeles +32.792 -115.56305 America/Los_Angeles +37.91576 -122.31164 America/Los_Angeles +38.68574 -121.08217 America/Los_Angeles +34.06862 -118.02757 America/Los_Angeles +33.91918 -118.41647 America/Los_Angeles +38.4088 -121.37162 America/Los_Angeles +33.03699 -117.29198 America/Los_Angeles +33.11921 -117.08642 America/Los_Angeles +38.64463 -121.27217 America/Los_Angeles +38.24936 -122.03997 America/Los_Angeles +33.37642 -117.25115 America/Los_Angeles +38.49602 -121.40884 America/Los_Angeles +38.67796 -121.17606 America/Los_Angeles +34.09223 -117.43505 America/Los_Angeles +38.67877 -121.35114 America/Los_Angeles +37.55855 -122.27108 America/Los_Angeles +33.70918 -117.95367 America/Los_Angeles +37.54827 -121.98857 America/Los_Angeles +36.74773 -119.77237 America/Los_Angeles +33.87029 -117.92534 America/Los_Angeles +38.25464 -121.29995 America/Los_Angeles +33.77391 -117.94145 America/Los_Angeles +33.88835 -118.30896 America/Los_Angeles +37.00578 -121.56828 America/Los_Angeles +34.01168 -117.48477 America/Los_Angeles +34.14251 -118.25508 America/Los_Angeles +34.13612 -117.86534 America/Los_Angeles +34.43583 -119.82764 America/Los_Angeles +38.76323 -121.16384 America/Los_Angeles +36.3208 -121.24381 America/Los_Angeles +33.99307 -117.96868 America/Los_Angeles +36.32745 -119.64568 America/Los_Angeles +33.9164 -118.35257 America/Los_Angeles +37.66882 -122.0808 America/Los_Angeles +33.74752 -116.97197 America/Los_Angeles +38.01714 -122.28858 America/Los_Angeles +33.86224 -118.39952 America/Los_Angeles +34.42639 -117.30088 America/Los_Angeles +34.12834 -117.20865 America/Los_Angeles +36.85245 -121.4016 America/Los_Angeles +34.09834 -118.32674 America/Los_Angeles +33.6603 -117.99923 America/Los_Angeles +33.98168 -118.22507 America/Los_Angeles +32.58394 -117.11308 America/Los_Angeles +33.72058 -116.21556 America/Los_Angeles +33.96168 -118.35313 America/Los_Angeles +33.66946 -117.82311 America/Los_Angeles +34.41333 -119.86097 America/Los_Angeles +34.19917 -118.18785 America/Los_Angeles +33.93196 -117.94617 America/Los_Angeles +32.84727 -117.2742 America/Los_Angeles +32.76783 -117.02308 America/Los_Angeles +33.91724 -118.01201 America/Los_Angeles +33.8464 -118.04673 America/Los_Angeles +32.70811 -116.99725 America/Los_Angeles +34.02001 -117.94951 America/Los_Angeles +33.66336 -116.31001 America/Los_Angeles +34.10084 -117.76784 America/Los_Angeles +33.57086 -117.63561 America/Los_Angeles +37.88576 -122.11802 America/Los_Angeles +38.42102 -121.42384 America/Los_Angeles +33.54225 -117.78311 America/Los_Angeles +33.5956 -117.70031 America/Los_Angeles +33.52253 -117.70755 America/Los_Angeles +33.6103 -117.72533 America/Los_Angeles +33.66808 -117.32726 America/Los_Angeles +33.64697 -117.68922 America/Los_Angeles +32.85727 -116.92225 America/Los_Angeles +33.85363 -118.13396 America/Los_Angeles +35.25968 -118.91427 America/Los_Angeles +34.69804 -118.13674 America/Los_Angeles +37.8227 -121.27661 America/Los_Angeles +33.88724 -118.35257 America/Los_Angeles +32.74255 -117.03142 America/Los_Angeles +36.30078 -119.78291 America/Los_Angeles +33.93807 -118.35258 America/Los_Angeles +38.89156 -121.29301 America/Los_Angeles +39.12767 -121.5508 America/Los_Angeles +36.98356 -121.98052 America/Los_Angeles +37.68187 -121.76801 America/Los_Angeles +38.1302 -121.27245 America/Los_Angeles +34.04835 -117.26115 America/Los_Angeles +33.79224 -118.31507 America/Los_Angeles +34.63915 -120.45794 America/Los_Angeles +33.76696 -118.18923 America/Los_Angeles +37.38522 -122.11413 America/Los_Angeles +34.05223 -118.24368 America/Los_Angeles +37.05828 -120.84992 America/Los_Angeles +37.22661 -121.97468 America/Los_Angeles +33.93029 -118.21146 America/Los_Angeles +36.96134 -120.06072 America/Los_Angeles +33.88474 -118.41091 America/Los_Angeles +37.79743 -121.21605 America/Los_Angeles +36.6844 -121.80217 America/Los_Angeles +38.01937 -122.13413 America/Los_Angeles +33.98668 -118.18535 America/Los_Angeles +33.83335 -117.29615 America/Los_Angeles +33.72835 -117.14642 America/Los_Angeles +37.45383 -122.18219 America/Los_Angeles +37.30216 -120.48297 America/Los_Angeles +37.59855 -122.38719 America/Los_Angeles +37.42827 -121.90662 America/Los_Angeles +33.99251 -117.51644 America/Los_Angeles +33.60002 -117.672 America/Los_Angeles +37.6391 -120.99688 America/Los_Angeles +34.14806 -117.99895 America/Los_Angeles +34.07751 -117.68978 America/Los_Angeles +34.00946 -118.10535 America/Los_Angeles +36.60024 -121.89468 America/Los_Angeles +34.06251 -118.12285 America/Los_Angeles +34.28556 -118.88204 America/Los_Angeles +37.83493 -122.12969 America/Los_Angeles +33.93752 -117.23059 America/Los_Angeles +37.1305 -121.65439 America/Los_Angeles +37.38605 -122.08385 America/Los_Angeles +33.55391 -117.21392 America/Los_Angeles +38.29714 -122.28553 America/Los_Angeles +32.67811 -117.0992 America/Los_Angeles +37.52966 -122.04024 America/Los_Angeles +33.61891 -117.92895 America/Los_Angeles +35.04275 -120.476 America/Los_Angeles +33.93113 -117.54866 America/Los_Angeles +34.16056 -118.26452 America/Los_Angeles +38.68574 -121.37217 America/Los_Angeles +34.17223 -118.37897 America/Los_Angeles +34.22834 -118.53675 America/Los_Angeles +33.90224 -118.08173 America/Los_Angeles +38.10742 -122.5697 America/Los_Angeles +37.76659 -120.84715 America/Los_Angeles +37.80437 -122.2708 America/Los_Angeles +37.99742 -121.71245 America/Los_Angeles +33.19587 -117.37948 America/Los_Angeles +35.41968 -119.01955 America/Los_Angeles +34.06334 -117.65089 America/Los_Angeles +33.78779 -117.85311 America/Los_Angeles +38.67851 -121.22578 America/Los_Angeles +34.86526 -120.436 America/Los_Angeles +37.87715 -122.17969 America/Los_Angeles +39.51378 -121.55636 America/Los_Angeles +34.1975 -119.17705 America/Los_Angeles +34.19084 -119.2415 America/Los_Angeles +37.61383 -122.48692 America/Los_Angeles +36.61774 -121.91662 America/Los_Angeles +33.72224 -116.37446 America/Los_Angeles +33.8303 -116.54529 America/Los_Angeles +34.57943 -118.11646 America/Los_Angeles +37.44188 -122.14302 America/Los_Angeles +39.75961 -121.62192 America/Los_Angeles +33.88946 -118.15979 America/Los_Angeles +34.14778 -118.14452 America/Los_Angeles +35.62664 -120.691 America/Los_Angeles +37.4716 -121.12966 America/Los_Angeles +33.78252 -117.22865 America/Los_Angeles +38.23242 -122.63665 America/Los_Angeles +33.98307 -118.09674 America/Los_Angeles +38.00437 -122.29886 America/Los_Angeles +38.02798 -121.88468 America/Los_Angeles +33.87224 -117.87034 America/Los_Angeles +37.94798 -122.0608 America/Los_Angeles +37.66243 -121.87468 America/Los_Angeles +34.05529 -117.75228 America/Los_Angeles +34.14778 -119.19511 America/Los_Angeles +36.06523 -119.01677 America/Los_Angeles +32.96282 -117.03586 America/Los_Angeles +36.77579 -121.66967 America/Los_Angeles +33.04171 -116.86808 America/Los_Angeles +38.58907 -121.30273 America/Los_Angeles +34.1064 -117.59311 America/Los_Angeles +33.73974 -116.41279 America/Los_Angeles +33.74446 -118.38702 America/Los_Angeles +32.74727 -116.9353 America/Los_Angeles +33.64086 -117.6031 America/Los_Angeles +34.05557 -117.18254 America/Los_Angeles +33.84918 -118.38841 America/Los_Angeles +37.48522 -122.23635 America/Los_Angeles +36.59634 -119.4504 America/Los_Angeles +34.1064 -117.37032 America/Los_Angeles +37.93576 -122.34775 America/Los_Angeles +35.62246 -117.6709 America/Los_Angeles +38.69101 -121.44857 America/Los_Angeles +37.73604 -120.93549 America/Los_Angeles +33.95335 -117.39616 America/Los_Angeles +38.79073 -121.23578 America/Los_Angeles +38.33964 -122.7011 America/Los_Angeles +34.86414 -118.16341 America/Los_Angeles +34.08057 -118.07285 America/Los_Angeles +38.55185 -121.36467 America/Los_Angeles +38.75212 -121.28801 America/Los_Angeles +33.97612 -117.90534 America/Los_Angeles +33.99613 -117.4056 America/Los_Angeles +38.58157 -121.4944 America/Los_Angeles +36.67774 -121.6555 America/Los_Angeles +34.10834 -117.28977 America/Los_Angeles +37.63049 -122.41108 America/Los_Angeles +37.50716 -122.26052 America/Los_Angeles +33.42697 -117.61199 America/Los_Angeles +32.71533 -117.15726 America/Los_Angeles +34.10668 -117.80673 America/Los_Angeles +34.28195 -118.43897 America/Los_Angeles +37.77493 -122.41942 America/Los_Angeles +34.09611 -118.10583 America/Los_Angeles +33.78391 -116.95864 America/Los_Angeles +37.33939 -121.89496 America/Los_Angeles +33.50169 -117.66255 America/Los_Angeles +37.72493 -122.15608 America/Los_Angeles +37.68104 -122.12441 America/Los_Angeles +35.28275 -120.65962 America/Los_Angeles +33.14337 -117.16614 America/Los_Angeles +37.56299 -122.32553 America/Los_Angeles +37.96215 -122.34553 America/Los_Angeles +33.73585 -118.29229 America/Los_Angeles +37.97353 -122.53109 America/Los_Angeles +37.77993 -121.97802 America/Los_Angeles +36.70801 -119.55597 America/Los_Angeles +33.74557 -117.86783 America/Los_Angeles +34.42083 -119.69819 America/Los_Angeles +37.35411 -121.95524 America/Los_Angeles +34.39166 -118.54259 America/Los_Angeles +36.97412 -122.0308 America/Los_Angeles +33.94724 -118.08535 America/Los_Angeles +34.95303 -120.43572 America/Los_Angeles +34.01945 -118.49119 America/Los_Angeles +34.35417 -119.05927 America/Los_Angeles +38.44047 -122.71443 America/Los_Angeles +32.83838 -116.97392 America/Los_Angeles +37.26383 -122.02301 America/Los_Angeles +33.74141 -118.10479 America/Los_Angeles +36.61107 -121.85162 America/Los_Angeles +36.57078 -119.61208 America/Los_Angeles +35.50051 -119.27178 America/Los_Angeles +34.15112 -118.44925 America/Los_Angeles +34.26945 -118.78148 America/Los_Angeles +36.42469 -121.32632 America/Los_Angeles +34.05195 -118.04673 America/Los_Angeles +33.95474 -118.21202 America/Los_Angeles +38.93324 -119.98435 America/Los_Angeles +34.11612 -118.15035 America/Los_Angeles +37.65466 -122.40775 America/Los_Angeles +34.01279 -117.90478 America/Los_Angeles +33.96085 -118.04173 America/Los_Angeles +39.11656 -121.63913 America/Los_Angeles +32.74477 -116.99892 America/Los_Angeles +33.80252 -117.99312 America/Los_Angeles +37.9577 -121.29078 America/Los_Angeles +38.23825 -122.04024 America/Los_Angeles +33.70919 -117.19726 America/Los_Angeles +37.36883 -122.03635 America/Los_Angeles +33.49364 -117.14836 America/Los_Angeles +34.10723 -118.05785 America/Los_Angeles +34.17056 -118.83759 America/Los_Angeles +33.83585 -118.34063 America/Los_Angeles +37.73965 -121.42522 America/Los_Angeles +39.32796 -120.18325 America/Los_Angeles +36.20773 -119.34734 America/Los_Angeles +37.49466 -120.84659 America/Los_Angeles +33.74585 -117.82617 America/Los_Angeles +33.76446 -117.79394 America/Los_Angeles +34.13556 -116.05417 America/Los_Angeles +39.15017 -123.20778 America/Los_Angeles +37.59577 -122.01913 America/Los_Angeles +34.1389 -118.35341 America/Los_Angeles +34.09751 -117.64839 America/Los_Angeles +38.35658 -121.98774 America/Los_Angeles +34.44361 -118.60953 America/Los_Angeles +34.04529 -117.94367 America/Los_Angeles +38.10409 -122.25664 America/Los_Angeles +34.18667 -118.44897 America/Los_Angeles +34.27834 -119.29317 America/Los_Angeles +34.53611 -117.29116 America/Los_Angeles +34.50055 -118.11646 America/Los_Angeles +36.33023 -119.29206 America/Los_Angeles +33.20004 -117.24254 America/Los_Angeles +34.02029 -117.86534 America/Los_Angeles +37.90631 -122.06496 America/Los_Angeles +33.96807 -118.22507 America/Los_Angeles +36.91023 -121.75689 America/Los_Angeles +33.82168 -118.29257 America/Los_Angeles +34.06862 -117.93895 America/Los_Angeles +34.09001 -118.36174 America/Los_Angeles +34.05168 -117.9684 America/Los_Angeles +38.58046 -121.53023 America/Los_Angeles +33.75918 -118.00673 America/Los_Angeles +33.9414 -118.3023 America/Los_Angeles +33.97918 -118.03284 America/Los_Angeles +33.59891 -117.28004 America/Los_Angeles +33.91696 -118.25507 America/Los_Angeles +38.54713 -122.81638 America/Los_Angeles +32.83116 -116.93336 America/Los_Angeles +38.67852 -121.7733 America/Los_Angeles +34.16834 -118.60592 America/Los_Angeles +33.88863 -117.81311 America/Los_Angeles +39.14045 -121.61691 America/Los_Angeles +34.03362 -117.04309 America/Los_Angeles +34.11417 -116.43224 America/Los_Angeles +39.80276 -105.08748 America/Denver +39.72943 -104.83192 America/Denver +39.98526 -104.82053 America/Denver +39.92054 -105.08665 America/Denver +38.44098 -105.24245 America/Denver +39.37221 -104.85609 America/Denver +39.58471 -104.90109 America/Denver +39.57916 -104.87692 America/Denver +38.85861 -104.69886 America/Denver +39.09193 -108.44898 America/Denver +38.83388 -104.82136 America/Denver +39.58777 -105.06943 America/Denver +39.80832 -104.93387 America/Denver +39.73915 -104.9847 America/Denver +37.27528 -107.88007 America/Denver +39.64777 -104.98776 America/Denver +38.68222 -104.70081 America/Denver +39.75554 -105.2211 America/Denver +39.06387 -108.55065 America/Denver +39.55388 -104.96943 America/Denver +39.57726 -105.11687 America/Denver +39.9936 -105.08971 America/Denver +39.70471 -105.08137 America/Denver +39.61332 -105.01665 America/Denver +39.97776 -105.13193 America/Denver +38.47832 -107.87617 America/Denver +39.88554 -104.9872 America/Denver +39.5186 -104.76136 America/Denver +38.25445 -104.60914 America/Denver +38.35 -104.72275 America/Denver +39.83776 -105.00137 America/Denver +39.58721 -104.95276 America/Denver +39.86804 -104.97192 America/Denver +39.83665 -105.0372 America/Denver +39.7661 -105.07721 America/Denver +37.7528 -100.01708 America/Chicago +37.97169 -100.87266 America/Chicago +37.04308 -100.921 America/Chicago +32.89953 -105.96026 America/Denver +35.08449 -106.65114 America/Denver +32.42067 -104.22884 America/Denver +34.4048 -103.20523 America/Denver +36.72806 -108.21869 America/Denver +35.52808 -108.74258 America/Denver +32.70261 -103.13604 America/Denver +32.31232 -106.77834 America/Denver +35.23338 -106.66447 America/Denver +33.39427 -104.52302 America/Denver +35.68698 -105.9378 America/Denver +35.01005 -106.67808 America/Denver +35.97859 -114.83249 America/Los_Angeles +39.1638 -119.7674 America/Los_Angeles +36.02525 -115.24194 America/Los_Angeles +39.60797 -119.25183 America/Los_Angeles +36.0397 -114.98194 America/Los_Angeles +36.17497 -115.13722 America/Los_Angeles +36.80553 -114.06719 America/Los_Angeles +36.19886 -115.1175 America/Los_Angeles +36.20829 -115.98391 America/Los_Angeles +36.09719 -115.14666 America/Los_Angeles +39.52963 -119.8138 America/Los_Angeles +39.64908 -119.70741 America/Los_Angeles +39.53491 -119.75269 America/Los_Angeles +36.10803 -115.245 America/Los_Angeles +39.5963 -119.77602 America/Los_Angeles +36.21108 -115.07306 America/Los_Angeles +36.07081 -115.08416 America/Los_Angeles +36.12997 -115.11889 America/Los_Angeles +35.222 -101.8313 America/Chicago +32.2504 -101.47874 America/Chicago +29.36273 -100.89676 America/Chicago +28.70914 -100.49952 America/Chicago +31.75872 -106.48693 America/Denver +34.81506 -102.3977 America/Chicago +31.69261 -106.20748 America/Denver +33.57786 -101.85517 America/Chicago +31.99735 -102.07791 America/Chicago +31.84568 -102.36764 America/Chicago +35.53616 -100.95987 America/Chicago +34.18479 -101.70684 America/Chicago +31.46377 -100.43704 America/Chicago +31.65456 -106.30331 America/Denver +31.63622 -106.29054 America/Denver +31.84235 -102.49876 America/Chicago +37.67748 -113.06189 America/Denver +37.10415 -113.58412 America/Denver +37.13054 -113.50829 America/Denver +35.59412 -119.34095 America/Los_Angeles +33.86726 -112.14682 America/Phoenix +33.41505 -111.54958 America/Phoenix +33.4356 -112.3496 America/Phoenix +58.30194 -134.41972 America/Juneau +40.86652 -124.08284 America/Los_Angeles +40.84235 -124.06367 America/Los_Angeles +40.80207 -124.16367 America/Los_Angeles +40.94652 -124.10062 America/Los_Angeles +40.58654 -122.39168 America/Los_Angeles +40.41628 -120.65301 America/Los_Angeles +40.01499 -105.27055 America/Denver +40.05026 -105.04998 America/Denver +40.37637 -104.69219 America/Denver +40.58526 -105.08442 America/Denver +40.42331 -104.70913 America/Denver +40.16721 -105.10193 America/Denver +40.39776 -105.07498 America/Denver +40.47748 -104.90136 America/Denver +43.6135 -116.20345 America/Boise +43.66294 -116.68736 America/Boise +47.67768 -116.78047 America/Los_Angeles +43.69544 -116.35401 America/Boise +43.46658 -112.03414 America/Boise +43.49183 -116.42012 America/Boise +46.41655 -117.01766 America/Los_Angeles +46.38044 -116.97543 America/Los_Angeles +43.61211 -116.39151 America/Boise +46.73239 -117.00017 America/Los_Angeles +43.54072 -116.56346 America/Boise +42.8713 -112.44553 America/Boise +47.71796 -116.95159 America/Los_Angeles +43.82602 -111.78969 America/Boise +42.56297 -114.46087 America/Boise +45.78329 -108.50069 America/Denver +45.67965 -111.03856 America/Denver +46.00382 -112.53474 America/Denver +47.50024 -111.30081 America/Denver +46.59271 -112.03611 America/Denver +48.19579 -114.31291 America/Denver +46.87215 -113.994 America/Denver +46.80833 -100.78374 America/Chicago +46.87918 -102.78962 America/Denver +46.82666 -100.88958 America/North_Dakota/New_Salem +48.23251 -101.29627 America/Chicago +41.12389 -100.76542 America/Chicago +41.86663 -103.66717 America/Denver +40.83242 -115.76312 America/Los_Angeles +44.63651 -123.10593 America/Los_Angeles +45.49428 -122.86705 America/Los_Angeles +42.20681 -121.73722 America/Los_Angeles +42.19458 -122.70948 America/Los_Angeles +45.48706 -122.80371 America/Los_Angeles +44.05817 -121.31531 America/Los_Angeles +45.55789 -122.8676 America/Los_Angeles +45.2629 -122.69259 America/Los_Angeles +42.37596 -122.91643 America/Los_Angeles +43.3665 -124.21789 America/Los_Angeles +44.56457 -123.26204 America/Los_Angeles +44.05207 -123.08675 America/Los_Angeles +45.51984 -123.11066 America/Los_Angeles +44.9279 -122.98371 America/Los_Angeles +42.43901 -123.32839 America/Los_Angeles +45.49818 -122.43148 America/Los_Angeles +44.98595 -122.98287 America/Los_Angeles +45.84041 -119.28946 America/Los_Angeles +45.52289 -122.98983 America/Los_Angeles +44.99012 -123.02621 America/Los_Angeles +42.22487 -121.78167 America/Los_Angeles +45.42067 -122.67065 America/Los_Angeles +44.53651 -122.90703 America/Los_Angeles +45.47984 -122.56731 America/Los_Angeles +45.21012 -123.19872 America/Los_Angeles +42.32652 -122.87559 America/Los_Angeles +45.44623 -122.63926 America/Los_Angeles +45.30012 -122.97316 America/Los_Angeles +45.41679 -122.64009 America/Los_Angeles +45.35734 -122.60676 America/Los_Angeles +45.67208 -118.7886 America/Los_Angeles +45.52345 -122.67621 America/Los_Angeles +44.27262 -121.17392 America/Los_Angeles +43.2165 -123.34174 America/Los_Angeles +44.9429 -123.0351 America/Los_Angeles +45.35651 -122.8401 America/Los_Angeles +44.04624 -123.02203 America/Los_Angeles +45.43123 -122.77149 America/Los_Angeles +45.53929 -122.38731 America/Los_Angeles +45.38401 -122.76399 America/Los_Angeles +45.36568 -122.61231 America/Los_Angeles +45.29984 -122.77371 America/Los_Angeles +45.14373 -122.85537 America/Los_Angeles +44.08054 -103.23101 America/Denver +40.88939 -111.88077 America/Denver +41.51021 -112.0155 America/Denver +40.918 -111.87216 America/Denver +41.11078 -112.02605 America/Denver +41.13967 -112.0505 America/Denver +40.61967 -111.81021 America/Denver +40.52467 -111.86382 America/Denver +40.31412 -112.00688 America/Denver +40.69995 -111.81049 America/Denver +40.9805 -111.88744 America/Denver +40.51411 -112.03299 America/Denver +40.44995 -111.77021 America/Denver +40.66884 -111.82466 America/Denver +41.03522 -111.93855 America/Denver +40.65995 -111.99633 America/Denver +41.06022 -111.97105 America/Denver +40.39162 -111.85077 America/Denver +41.73549 -111.83439 America/Denver +40.70911 -112.10161 America/Denver +40.61106 -111.89994 America/Denver +40.68689 -111.87549 America/Denver +40.66689 -111.88799 America/Denver +41.30716 -111.96022 America/Denver +40.84856 -111.90688 America/Denver +41.223 -111.97383 America/Denver +40.2969 -111.69465 America/Denver +40.0444 -111.73215 America/Denver +40.36412 -111.73854 America/Denver +40.23384 -111.65853 America/Denver +40.52189 -111.9391 America/Denver +41.16161 -112.02633 America/Denver +40.76078 -111.89105 America/Denver +40.57204 -111.86056 America/Denver +40.58106 -111.85077 America/Denver +40.34912 -111.90466 America/Denver +40.56384 -111.94938 America/Denver +40.56217 -111.92966 America/Denver +41.19189 -111.97133 America/Denver +40.71884 -111.88827 America/Denver +40.11496 -111.65492 America/Denver +40.16523 -111.61075 America/Denver +41.08939 -112.06467 America/Denver +40.66772 -111.93883 America/Denver +40.53078 -112.29828 America/Denver +40.60967 -111.9391 America/Denver +40.69161 -112.00105 America/Denver +46.97537 -123.81572 America/Los_Angeles +48.5126 -122.61267 America/Los_Angeles +48.19871 -122.12514 America/Los_Angeles +47.30732 -122.22845 America/Los_Angeles +45.78095 -122.53343 America/Los_Angeles +47.61038 -122.20068 America/Los_Angeles +48.75955 -122.48822 America/Los_Angeles +47.17705 -122.18651 America/Los_Angeles +47.76232 -122.2054 America/Los_Angeles +47.56732 -122.63264 America/Los_Angeles +47.47038 -122.34679 America/Los_Angeles +45.58706 -122.39954 America/Los_Angeles +46.71621 -122.9543 America/Los_Angeles +47.74427 -122.07735 America/Los_Angeles +47.35818 -122.12216 America/Los_Angeles +47.40177 -122.32429 America/Los_Angeles +47.81065 -122.37736 America/Los_Angeles +46.99651 -120.54785 America/Los_Angeles +47.97898 -122.20208 America/Los_Angeles +47.44843 -122.15734 America/Los_Angeles +47.32232 -122.31262 America/Los_Angeles +45.68456 -122.5751 America/Los_Angeles +47.09621 -122.35873 America/Los_Angeles +47.05288 -122.29428 America/Los_Angeles +45.67151 -122.66288 America/Los_Angeles +47.5301 -122.03262 America/Los_Angeles +47.75732 -122.24401 America/Los_Angeles +46.21125 -119.13723 America/Los_Angeles +47.38093 -122.23484 America/Los_Angeles +47.68149 -122.20874 America/Los_Angeles +47.03426 -122.82319 America/Los_Angeles +48.0151 -122.06374 America/Los_Angeles +47.17176 -122.51846 America/Los_Angeles +46.13817 -122.93817 America/Los_Angeles +47.82093 -122.31513 America/Los_Angeles +47.39272 -122.04641 America/Los_Angeles +47.85093 -122.2393 America/Los_Angeles +48.05176 -122.17708 America/Los_Angeles +47.57065 -122.22207 America/Los_Angeles +47.8601 -122.2043 America/Los_Angeles +47.85538 -121.97096 America/Los_Angeles +47.13014 -119.27808 America/Los_Angeles +48.42122 -122.33405 America/Los_Angeles +47.78815 -122.30874 America/Los_Angeles +47.94454 -122.30458 America/Los_Angeles +47.81954 -122.17624 America/Los_Angeles +48.29316 -122.64322 America/Los_Angeles +47.03787 -122.9007 America/Los_Angeles +47.64995 -117.23991 America/Los_Angeles +45.66651 -122.56093 America/Los_Angeles +47.15538 -122.43401 America/Los_Angeles +46.23958 -119.10057 America/Los_Angeles +48.11815 -123.43074 America/Los_Angeles +46.73127 -117.17962 America/Los_Angeles +47.18538 -122.2929 America/Los_Angeles +47.67399 -122.12151 America/Los_Angeles +47.48288 -122.21707 America/Los_Angeles +46.28569 -119.28446 America/Los_Angeles +45.71067 -122.64899 America/Los_Angeles +47.64177 -122.0804 America/Los_Angeles +47.44846 -122.29217 America/Los_Angeles +47.60621 -122.33207 America/Los_Angeles +47.75565 -122.34152 America/Los_Angeles +47.64454 -122.69487 America/Los_Angeles +47.14121 -122.27012 America/Los_Angeles +47.10399 -122.43457 America/Los_Angeles +47.65966 -117.42908 America/Los_Angeles +47.67323 -117.23937 America/Los_Angeles +46.32374 -120.00865 America/Los_Angeles +47.25288 -122.44429 America/Los_Angeles +47.47399 -122.26096 America/Los_Angeles +47.00732 -122.90931 America/Los_Angeles +47.23565 -122.5504 America/Los_Angeles +45.63873 -122.66149 America/Los_Angeles +46.06458 -118.34302 America/Los_Angeles +47.42346 -120.31035 America/Los_Angeles +47.5776 -122.10123 America/Los_Angeles +47.99343 -122.1018 America/Los_Angeles +47.62621 -122.52124 America/Los_Angeles +46.60207 -120.5059 America/Los_Angeles +42.86663 -106.31308 America/Denver +41.13998 -104.82025 America/Denver +44.29109 -105.50222 America/Denver +41.31137 -105.5911 America/Denver +41.58746 -109.2029 America/Denver +44.79719 -106.95618 America/Denver +40.3769 -111.79576 America/Denver +20.89472 -156.47 Pacific/Honolulu +21.40222 -157.73944 Pacific/Honolulu +21.40929 -157.80092 Pacific/Honolulu +20.75548 -156.45446 Pacific/Honolulu +21.34694 -158.08583 Pacific/Honolulu +21.45 -158.00111 Pacific/Honolulu +21.39722 -157.97333 Pacific/Honolulu +21.50211 -158.02104 Pacific/Honolulu +20.89111 -156.50472 Pacific/Honolulu +21.38667 -158.00917 Pacific/Honolulu +21.34417 -158.03083 Pacific/Honolulu +19.72972 -155.09 Pacific/Honolulu +21.30694 -157.85833 Pacific/Honolulu +61.32139 -149.56778 America/Anchorage +64.83778 -147.71639 America/Anchorage +61.21806 -149.90028 America/Anchorage +64.8 -147.53333 America/Anchorage +34.13216 -84.30067 America/New_York +34.02893 -84.19858 America/New_York +25.5783 -80.3377 America/New_York +28.5641 -81.2114 America/New_York +35.139 -79.00603 America/New_York +41.22374 -73.06164 America/New_York +45.90194 -112.65708 America/Denver +47.86602 -122.1551 America/Los_Angeles +38.46449 -121.34692 America/Los_Angeles +41.44987 -72.81892 America/New_York +39.55429 -76.37309 America/New_York +39.50506 -76.31976 America/New_York +40.93064 -73.10178 America/New_York +42.98499 -78.87798 America/New_York +37.70573 -92.15717 America/Chicago +42.56891 -83.38356 America/Detroit +27.98269 -82.37878 America/New_York +28.33287 -81.64738 America/New_York +28.10545 -82.52594 America/New_York +33.72672 -84.27246 America/New_York +28.0692 -82.43609 America/New_York +27.61638 -80.41308 America/New_York +25.7065 -80.4388 America/New_York +27.92386 -82.37939 America/New_York +38.6025 -121.37854 America/Los_Angeles +47.4943 -122.24092 America/Los_Angeles +32.76397 -116.96877 America/Los_Angeles +33.96772 -118.24438 America/Los_Angeles +31.13489 -97.77561 America/Chicago +47.72049 -122.23167 America/Los_Angeles +34.23216 -118.23529 America/Los_Angeles +47.41052 -122.17369 America/Los_Angeles +38.74728 -104.71439 America/Denver +47.67887 -122.02833 America/Los_Angeles +33.976 -118.06909 America/Los_Angeles +36.11708 -115.33001 America/Los_Angeles +21.35237 -158.08655 Pacific/Honolulu +21.4936 -158.06151 Pacific/Honolulu +33.1911 -111.528 America/Phoenix +35.33676 -106.59296 America/Denver +34.19731 -118.64398 America/Los_Angeles +38.9258 -77.40156 America/New_York +40.60079 -74.64815 America/New_York +40.60822 -74.51803 America/New_York +39.82861 -86.38224 America/Indiana/Indianapolis +40.84829 -74.58148 America/New_York +34.51342 -93.05429 America/Chicago +33.74021 -86.64938 America/Chicago +40.68496 -80.10714 America/New_York +-32.68333 -57.63333 America/Montevideo +-33.5165 -56.89957 America/Montevideo +-33.53889 -56.88861 America/Montevideo +-33.23333 -54.38333 America/Montevideo +-31.73333 -55.98333 America/Montevideo +-34.45333 -56.39056 America/Montevideo +-34.3375 -56.71361 America/Montevideo +-34.8 -54.91667 America/Montevideo +-31.38333 -57.96667 America/Montevideo +-34.48333 -54.33333 America/Montevideo +-30.90534 -55.55076 America/Montevideo +-34.665 -56.21944 America/Montevideo +-32.32139 -58.07556 America/Montevideo +-34.86028 -56.05222 America/Montevideo +-34.71667 -55.95 America/Montevideo +-34.90328 -56.18816 America/Montevideo +-34.37589 -55.23771 America/Montevideo +-33.2524 -58.03047 America/Montevideo +-32.36667 -54.18333 America/Montevideo +-34.9 -54.95 America/Montevideo +-34.72639 -56.22 America/Montevideo +-34.76167 -56.22361 America/Montevideo +-33.1325 -58.29556 America/Montevideo +-34.09556 -56.21417 America/Montevideo +-33.41306 -56.50056 America/Montevideo +-33.53009 -58.21701 America/Montevideo +-34.76333 -56.38528 America/Montevideo +-34.46262 -57.83976 America/Montevideo +-34.00023 -58.28402 America/Montevideo +-34.52278 -56.27778 America/Montevideo +-30.4 -56.46667 America/Montevideo +42.45306 59.61028 Asia/Samarkand +42.40043 59.46005 Asia/Samarkand +43.06874 58.90372 Asia/Samarkand +39.96056 68.39583 Asia/Samarkand +39.40222 67.24306 Asia/Samarkand +37.22417 67.27833 Asia/Samarkand +37.99944 67.7875 Asia/Samarkand +39.05778 66.83417 Asia/Samarkand +39.65417 66.95972 Asia/Samarkand +38.86056 65.78905 Asia/Samarkand +39.25528 65.15278 Asia/Samarkand +39.08425 66.83318 Asia/Samarkand +39.89889 66.25611 Asia/Samarkand +39.0375 65.585 Asia/Samarkand +39.53333 63.83333 Asia/Samarkand +39.72278 64.55167 Asia/Samarkand +38.62083 66.24806 Asia/Samarkand +39.85778 64.44833 Asia/Samarkand +39.71611 66.66417 Asia/Samarkand +38.26667 67.9 Asia/Samarkand +39.03361 66.57222 Asia/Samarkand +39.92028 66.86111 Asia/Samarkand +39.76472 67.27139 Asia/Samarkand +39.77472 64.42861 Asia/Samarkand +38.82139 65.65306 Asia/Samarkand +38.20611 67.19861 Asia/Samarkand +39.92139 65.92528 Asia/Samarkand +40.98333 68.9 Asia/Tashkent +40.37583 70.81556 Asia/Tashkent +41.11202 69.0471 Asia/Tashkent +40.275 68.8225 Asia/Tashkent +40.02539 65.96095 Asia/Samarkand +41.18722 71.73333 Asia/Tashkent +41.11919 70.09406 Asia/Tashkent +40.03028 64.515 Asia/Samarkand +41.08073 71.92331 Asia/Tashkent +41.55 60.63333 Asia/Samarkand +40.12694 68.49444 Asia/Tashkent +41.11371 72.07915 Asia/Tashkent +41.0321 69.36253 Asia/Tashkent +40.99984 71.51162 Asia/Tashkent +40.47722 71.76778 Asia/Tashkent +41.26465 69.21627 Asia/Tashkent +40.92339 71.57214 Asia/Tashkent +40.84361 68.66167 Asia/Tashkent +41.65583 60.3025 Asia/Samarkand +40.12 64.50139 Asia/Samarkand +41.37222 69.38167 Asia/Tashkent +41.535 60.34556 Asia/Samarkand +40.52861 70.9425 Asia/Tashkent +40.89722 69.35056 Asia/Tashkent +40.00778 66.23694 Asia/Samarkand +41.29444 69.67639 Asia/Tashkent +40.87361 71.10889 Asia/Tashkent +40.31528 67.95444 Asia/Samarkand +40.84472 69.59833 Asia/Tashkent +40.90639 69.63833 Asia/Tashkent +40.56139 65.68861 Asia/Samarkand +41.55 61.01667 Asia/Samarkand +40.08444 65.37917 Asia/Samarkand +40.9983 71.67257 Asia/Tashkent +40.47111 71.72472 Asia/Tashkent +42.11556 60.05972 Asia/Samarkand +40.64153 72.23868 Asia/Tashkent +40.30222 71.97444 Asia/Bishkek +40.73192 72.76177 Asia/Tashkent +40.43583 71.76722 Asia/Tashkent +41.38972 69.465 Asia/Tashkent +40.66886 72.56002 Asia/Tashkent +41.37833 60.36389 Asia/Samarkand +40.91667 72.11667 Asia/Tashkent +41.25611 71.55083 Asia/Tashkent +40.11583 67.84222 Asia/Samarkand +41.55389 69.70083 Asia/Tashkent +41.31944 61.07417 Asia/Samarkand +41.84472 60.39194 Asia/Samarkand +40.48972 68.78417 Asia/Tashkent +40.1 64.68333 Asia/Samarkand +41.55806 69.77083 Asia/Tashkent +40.66194 68.17222 Asia/Tashkent +40.38421 71.78432 Asia/Tashkent +40.52472 68.03583 Asia/Tashkent +41.00936 71.2287 Asia/Tashkent +41.46889 69.58222 Asia/Tashkent +40.93639 68.76972 Asia/Tashkent +41.06656 71.85527 Asia/Tashkent +40.81083 69.19861 Asia/Tashkent +40.43583 70.61028 Asia/Tashkent +41.69111 60.7525 Asia/Samarkand +41.20972 69.33417 Asia/Tashkent +40.22083 69.26972 Asia/Tashkent +41.01667 70.14361 Asia/Tashkent +40.78206 72.34424 Asia/Tashkent +40.39194 71.47417 Asia/Tashkent +40.52204 72.07292 Asia/Tashkent +40.09294 65.3712 Asia/Samarkand +41.90236 12.45332 Europe/Vatican +13.15872 -61.22475 America/St_Vincent +13.15833 -61.235 America/St_Vincent +11.03333 -63.86278 America/Caracas +9.43889 -64.47278 America/Caracas +8.5931 -70.2261 America/Caracas +9.35029 -65.32452 America/Caracas +10.08 -69.12611 America/Caracas +10.03863 -67.48938 America/Caracas +9.33278 -69.12083 America/Caracas +9.21554 -66.00734 America/Caracas +9.31778 -70.60361 America/Caracas +10.16202 -68.00765 America/Caracas +8.00861 -62.39889 America/Caracas +10.22388 -67.47288 America/Caracas +9.06222 -62.05102 America/Caracas +9.37084 -70.43472 America/Caracas +9.91861 -68.30472 America/Caracas +7.8188 -72.22427 America/Caracas +10.23409 -66.66308 America/Caracas +10.53642 -71.51104 America/Caracas +4.60226 -61.11025 America/Caracas +10.21302 -67.42365 America/Caracas +9.91152 -67.35381 America/Caracas +8.03125 -72.26053 America/Caracas +8.88724 -64.16512 America/Caracas +10.263 -67.7858 America/Caracas +10.33991 -68.74247 America/Caracas +7.76694 -72.225 America/Caracas +9.00003 -71.91352 America/Caracas +9.66124 -68.58268 America/Caracas +7.81454 -72.4431 America/Caracas +10.38854 -66.95179 America/Caracas +7.70131 -72.35569 America/Caracas +10.3258 -72.31343 America/Caracas +9.92866 -69.6201 America/Caracas +11.6956 -70.19957 America/Caracas +11.65806 -70.215 America/Caracas +10.21667 -64.61667 America/Caracas +10.47306 -68.0125 America/Caracas +5.66389 -67.62361 America/Caracas +10.95796 -63.84906 America/Caracas +10.47226 -66.80155 America/Caracas +10.17389 -67.54194 America/Caracas +10.11649 -66.77609 America/Caracas +10.15526 -68.5663 America/Caracas +8.41667 -71.13333 America/Caracas +10.48889 -68.20028 America/Caracas +8.59524 -71.1434 America/Caracas +10.29644 -67.71813 America/Caracas +10.24694 -67.59583 America/Caracas +10.63167 -71.64056 America/Caracas +10.59621 -66.95485 America/Caracas +10.06444 -72.545 America/Caracas +10.34447 -67.04325 America/Caracas +10.02588 -69.24166 America/Caracas +10.49389 -66.82863 America/Caracas +10.21844 -67.33017 America/Caracas +10.25237 -67.18472 America/Caracas +10.13008 -71.25946 America/Caracas +10.59901 -66.9346 America/Caracas +11.08172 -63.96549 America/Caracas +10.57806 -62.29772 America/Caracas +10.08528 -67.77917 America/Caracas +10.4762 -66.54266 America/Caracas +10.46736 -66.60663 America/Caracas +9.04183 -69.74206 America/Caracas +10.22609 -67.877 America/Caracas +8.61366 -71.65284 America/Caracas +9.78734 -69.7937 America/Caracas +8.88752 -64.24544 America/Caracas +10.30589 -67.63212 America/Caracas +10.42994 -66.8161 America/Caracas +8.54665 -71.24087 America/Caracas +10.45397 -64.18256 America/Caracas +10.15892 -66.88575 America/Caracas +11.4045 -69.67344 America/Caracas +8.35122 -62.64102 America/Caracas +8.12923 -63.54086 America/Caracas +10.16028 -68.895 America/Caracas +10.24247 -66.85723 America/Caracas +10.49598 -66.85347 America/Caracas +10.08621 -67.91982 America/Caracas +10.48666 -66.73799 America/Caracas +10.60383 -67.03034 America/Caracas +10.66781 -63.25849 America/Caracas +10.34985 -66.98632 America/Caracas +10.17554 -70.08274 America/Caracas +10.48801 -66.87919 America/Caracas +10.61119 -66.85215 America/Caracas +9.30571 -64.35841 America/Caracas +8.92416 -67.42929 America/Caracas +10.18634 -67.45935 America/Caracas +10.38828 -71.43992 America/Caracas +10.43398 -66.87662 America/Caracas +10.07389 -69.32278 America/Caracas +8.76222 -70.41111 America/Caracas +8.62261 -70.20749 America/Caracas +10.13333 -64.7 America/Caracas +9.56009 -69.21475 America/Caracas +9.86005 -66.38139 America/Caracas +9.55451 -69.19564 America/Caracas +9.74569 -63.18323 America/Caracas +8.21523 -72.24888 America/Caracas +10.46941 -66.83063 America/Caracas +10.35782 -66.80252 America/Caracas +10.4883 -66.78608 America/Caracas +7.24241 -70.73236 America/Caracas +7.88782 -67.47236 America/Caracas +18.42693 -64.62079 America/Tortola +18.43882 -64.60382 America/Tortola +18.3419 -64.9307 America/St_Thomas +17.72751 -64.74698 America/St_Thomas +18.66667 105.66667 Asia/Ho_Chi_Minh +21.72288 104.9113 Asia/Ho_Chi_Minh +10.34599 107.08426 Asia/Ho_Chi_Minh +9.78444 105.47306 Asia/Ho_Chi_Minh +21.30891 105.60489 Asia/Ho_Chi_Minh +10.25 105.96667 Asia/Ho_Chi_Minh +18.67336 105.69232 Asia/Ho_Chi_Minh +21.32274 105.40198 Asia/Ho_Chi_Minh +21.03433 106.77049 Asia/Ho_Chi_Minh +13.09546 109.32094 Asia/Ho_Chi_Minh +21.82356 105.21424 Asia/Ho_Chi_Minh +9.93472 106.34528 Asia/Ho_Chi_Minh +10.98671 106.65497 Asia/Ho_Chi_Minh +10.82302 106.62965 Asia/Ho_Chi_Minh +19.8 105.76667 Asia/Ho_Chi_Minh +21.59422 105.84817 Asia/Ho_Chi_Minh +20.45 106.34002 Asia/Ho_Chi_Minh +11.3 106.1 Asia/Ho_Chi_Minh +10.53333 106.41667 Asia/Ho_Chi_Minh +15.57364 108.47403 Asia/Ho_Chi_Minh +21.14053 105.50686 Asia/Ho_Chi_Minh +21.3256 103.91882 Asia/Ho_Chi_Minh +13.4556 109.22348 Asia/Ho_Chi_Minh +9.60333 105.98 Asia/Ho_Chi_Minh +22.34023 103.84415 Asia/Ho_Chi_Minh +10.3 105.76667 Asia/Ho_Chi_Minh +10.01667 105.08333 Asia/Ho_Chi_Minh +13.77648 109.22367 Asia/Ho_Chi_Minh +15.12047 108.79232 Asia/Ho_Chi_Minh +13.98333 108 Asia/Ho_Chi_Minh +20.54531 105.91221 Asia/Ho_Chi_Minh +11.28333 106.13333 Asia/Ho_Chi_Minh +10.92889 108.10208 Asia/Ho_Chi_Minh +11.56432 108.98858 Asia/Ho_Chi_Minh +20.25808 105.97965 Asia/Ho_Chi_Minh +12.24507 109.19432 Asia/Ho_Chi_Minh +20.43389 106.17729 Asia/Ho_Chi_Minh +10.36004 106.35996 Asia/Ho_Chi_Minh +21.52471 107.9662 Asia/Ho_Chi_Minh +10.38639 105.43518 Asia/Ho_Chi_Minh +22.48556 103.97066 Asia/Ho_Chi_Minh +21.85264 106.76101 Asia/Ho_Chi_Minh +10.65993 107.77206 Asia/Ho_Chi_Minh +14.35452 108.00759 Asia/Ho_Chi_Minh +20.64637 106.05112 Asia/Ho_Chi_Minh +16.4619 107.59546 Asia/Ho_Chi_Minh +20.95045 107.07336 Asia/Ho_Chi_Minh +15.87944 108.335 Asia/Ho_Chi_Minh +20.81717 105.33759 Asia/Ho_Chi_Minh +18.34282 105.9057 Asia/Ho_Chi_Minh +10.38333 104.48333 Asia/Ho_Chi_Minh +21.0245 105.84117 Asia/Ho_Chi_Minh +20.86481 106.68345 Asia/Ho_Chi_Minh +20.94099 106.33302 Asia/Ho_Chi_Minh +22.82333 104.98357 Asia/Ho_Chi_Minh +20.97136 105.77876 Asia/Ho_Chi_Minh +11.53333 106.91667 Asia/Ho_Chi_Minh +17.46885 106.62226 Asia/Ho_Chi_Minh +16.81625 107.10031 Asia/Ho_Chi_Minh +21.38602 103.02301 Asia/Ho_Chi_Minh +16.06778 108.22083 Asia/Ho_Chi_Minh +11.94646 108.44193 Asia/Ho_Chi_Minh +10.96667 106.46667 Asia/Ho_Chi_Minh +10.7 105.11667 Asia/Ho_Chi_Minh +20.72779 107.04819 Asia/Ho_Chi_Minh +10.45 105.63333 Asia/Ho_Chi_Minh +22.66568 106.25786 Asia/Ho_Chi_Minh +10.03333 105.78333 Asia/Ho_Chi_Minh +10.41667 106.96667 Asia/Ho_Chi_Minh +10.61667 106.66667 Asia/Ho_Chi_Minh +11.92144 109.15913 Asia/Ho_Chi_Minh +21.01667 107.3 Asia/Ho_Chi_Minh +9.17694 105.15 Asia/Ho_Chi_Minh +12.66747 108.03775 Asia/Ho_Chi_Minh +20.07806 105.86028 Asia/Ho_Chi_Minh +10.95 106.81667 Asia/Ho_Chi_Minh +10.23333 106.38333 Asia/Ho_Chi_Minh +21.18608 106.07632 Asia/Ho_Chi_Minh +9.29414 105.72776 Asia/Ho_Chi_Minh +21.27307 106.1946 Asia/Ho_Chi_Minh +22.14701 105.83481 Asia/Ho_Chi_Minh +-17.73381 168.32188 Pacific/Efate +-13.28163 -176.17453 Pacific/Wallis +-13.83333 -171.76666 Pacific/Apia +42.9075 20.84028 Europe/Belgrade +42.82306 20.9675 Europe/Belgrade +42.32139 21.35833 Europe/Belgrade +42.37056 21.15528 Europe/Belgrade +42.35861 20.825 Europe/Belgrade +42.43306 21.03972 Europe/Belgrade +42.21389 20.73972 Europe/Belgrade +42.67272 21.16688 Europe/Belgrade +42.91056 21.19306 Europe/Belgrade +42.65913 20.28828 Europe/Belgrade +42.39944 20.65472 Europe/Belgrade +42.55528 20.76333 Europe/Belgrade +43.10389 20.80278 Europe/Belgrade +42.88333 20.86667 Europe/Belgrade +42.66394 21.09611 Europe/Belgrade +42.78083 20.4875 Europe/Belgrade +42.46045 21.46986 Europe/Belgrade +42.62833 20.89389 Europe/Belgrade +42.0265 20.65333 Europe/Belgrade +42.54018 20.28793 Europe/Belgrade +42.38028 20.43083 Europe/Belgrade +13.12871 45.38073 Asia/Aden +14.1951 43.31518 Asia/Aden +14.29804 44.37795 Asia/Aden +13.57952 44.02091 Asia/Aden +15.17177 44.32442 Asia/Aden +15.35472 44.20667 Asia/Aden +15.31586 44.30858 Asia/Aden +16.94021 43.76394 Asia/Aden +15.46253 45.32581 Asia/Aden +13.05667 44.88194 Asia/Aden +13.96667 44.18333 Asia/Aden +15.69425 43.60582 Asia/Aden +13.83446 44.11469 Asia/Aden +14.54274 44.40514 Asia/Aden +14.51635 43.32446 Asia/Aden +15.05835 43.28506 Asia/Aden +14.53766 46.83187 Asia/Aden +15.6594 43.94385 Asia/Aden +14.54248 49.12424 Asia/Aden +14.79781 42.95452 Asia/Aden +16.16406 44.77692 Asia/Aden +13.98523 45.57272 Asia/Aden +12.77944 45.03667 Asia/Aden +-12.78234 45.22878 Indian/Mayotte +-12.78339 45.25693 Indian/Mayotte +-12.73361 45.20417 Indian/Mayotte +-26.1625 27.8725 Africa/Johannesburg +-25.53695 26.07512 Africa/Johannesburg +-27.1974 25.98311 Africa/Johannesburg +-25.33177 31.01166 Africa/Johannesburg +-25.87133 29.23323 Africa/Johannesburg +-26.31906 27.6486 Africa/Johannesburg +-27.8549 26.36583 Africa/Johannesburg +-27.97742 26.73506 Africa/Johannesburg +-28.11396 24.84753 Africa/Johannesburg +-24.88333 28.28333 Africa/Johannesburg +-27.76952 30.79165 Africa/Johannesburg +-26.95659 24.7284 Africa/Johannesburg +-27.36542 29.88175 Africa/Johannesburg +-28.10391 26.86593 Africa/Johannesburg +-27.20841 26.94855 Africa/Johannesburg +-26.67313 27.92615 Africa/Johannesburg +-26.71171 27.83795 Africa/Johannesburg +-28.44776 21.25612 Africa/Johannesburg +-31.58893 28.78443 Africa/Johannesburg +-30.20674 30.79776 Africa/Johannesburg +-28.33523 31.41617 Africa/Johannesburg +-33.75757 25.3971 Africa/Johannesburg +-23.83322 30.16351 Africa/Johannesburg +-22.94564 30.48497 Africa/Johannesburg +-28.41098 26.70107 Africa/Johannesburg +-29.20932 26.83898 Africa/Johannesburg +-25.99636 28.2268 Africa/Johannesburg +-32.57076 27.42396 Africa/Johannesburg +-26.84493 26.76829 Africa/Johannesburg +-29.32816 31.28954 Africa/Johannesburg +-26.93366 29.24152 Africa/Johannesburg +-26.25 28.4 Africa/Johannesburg +-26.26781 27.85849 Africa/Johannesburg +-32.72173 25.58804 Africa/Johannesburg +-25.11319 29.04454 Africa/Johannesburg +-28.31971 27.62082 Africa/Johannesburg +-26.55 29.16667 Africa/Johannesburg +-30.28666 30.75316 Africa/Johannesburg +-27.18871 25.32931 Africa/Johannesburg +-26.81358 27.81695 Africa/Johannesburg +-25.66756 27.24208 Africa/Johannesburg +-29.87196 30.27235 Africa/Johannesburg +-28.78301 32.03768 Africa/Johannesburg +-27.80138 28.42726 Africa/Johannesburg +-26.1844 27.70203 Africa/Johannesburg +-31.89756 26.87533 Africa/Johannesburg +-31.87101 26.97862 Africa/Johannesburg +-25.74486 28.18783 Africa/Johannesburg +-24.19436 29.00974 Africa/Johannesburg +-26.71667 27.1 Africa/Johannesburg +-30.74137 30.45499 Africa/Johannesburg +-33.91799 25.57007 Africa/Johannesburg +-33.59057 26.89104 Africa/Johannesburg +-34.05274 23.3716 Africa/Johannesburg +-27.00706 30.81323 Africa/Johannesburg +-23.90448 29.46885 Africa/Johannesburg +-29.61678 30.39278 Africa/Johannesburg +-28.52423 28.81582 Africa/Johannesburg +-23.94299 31.14107 Africa/Johannesburg +-26.9033 27.45727 Africa/Johannesburg +-27.78324 24.68768 Africa/Johannesburg +-33.59067 22.2014 Africa/Johannesburg +-26.98023 26.67272 Africa/Johannesburg +-24.7 28.4 Africa/Johannesburg +-23.88782 30.28708 Africa/Johannesburg +-26.43138 28.47713 Africa/Johannesburg +-27.75796 29.9318 Africa/Johannesburg +-25.47448 30.97033 Africa/Johannesburg +-29.81292 30.63646 Africa/Johannesburg +-29.56822 30.18618 Africa/Johannesburg +-34.18307 22.14605 Africa/Johannesburg +-27.98299 30.71769 Africa/Johannesburg +-25.85 25.63333 Africa/Johannesburg +-31.49285 25.00633 Africa/Johannesburg +-25.77507 29.46482 Africa/Johannesburg +-22.35131 30.0396 Africa/Johannesburg +-30.8636 30.37052 Africa/Johannesburg +-25.49768 28.10065 Africa/Johannesburg +-25.0978 30.45967 Africa/Johannesburg +-23.04385 29.90319 Africa/Johannesburg +-26.152 26.15968 Africa/Johannesburg +-24.2 29.5 Africa/Johannesburg +-31.70312 27.2329 Africa/Johannesburg +-29.19448 27.45739 Africa/Johannesburg +-27.83333 26.75 Africa/Johannesburg +-34.00333 24.73142 Africa/Johannesburg +-26.08577 27.77515 Africa/Johannesburg +-27.65036 27.23488 Africa/Johannesburg +-26.27391 29.2253 Africa/Johannesburg +-25.4332 31.95478 Africa/Johannesburg +-30.54723 29.42412 Africa/Johannesburg +-34.03627 23.04713 Africa/Johannesburg +-26.85213 26.66672 Africa/Johannesburg +-28.73226 24.76232 Africa/Johannesburg +-26.20227 28.04363 Africa/Johannesburg +-29.47795 30.23057 Africa/Johannesburg +-27.97654 27.02423 Africa/Johannesburg +-26.15881 29.71528 Africa/Johannesburg +-27.28115 27.9709 Africa/Johannesburg +-26.50476 28.35921 Africa/Johannesburg +-28.27276 29.12946 Africa/Johannesburg +-33.30422 26.53276 Africa/Johannesburg +-32.25215 24.53075 Africa/Johannesburg +-23.30246 30.71868 Africa/Johannesburg +-33.963 22.46173 Africa/Johannesburg +-25.61692 27.99471 Africa/Johannesburg +-32.77477 26.63376 Africa/Johannesburg +-26.48862 27.49387 Africa/Johannesburg +-28.87097 31.89961 Africa/Johannesburg +-26.53333 29.98333 Africa/Johannesburg +-28.76197 31.89329 Africa/Johannesburg +-26.53333 29.06667 Africa/Johannesburg +-33.01529 27.91162 Africa/Johannesburg +-29.8579 31.0292 Africa/Johannesburg +-28.16678 30.23371 Africa/Johannesburg +-23.69339 30.14002 Africa/Johannesburg +-27.0177 30.44979 Africa/Johannesburg +-26.1466 28.68322 Africa/Johannesburg +-30.64966 24.0123 Africa/Johannesburg +-25.67088 28.52364 Africa/Johannesburg +-32.16422 25.61918 Africa/Johannesburg +-27.91402 25.16111 Africa/Johannesburg +-26.36094 27.39767 Africa/Johannesburg +-32.33083 28.14981 Africa/Johannesburg +-25.81015 28.74248 Africa/Johannesburg +-25.63473 27.78022 Africa/Johannesburg +-26.23656 28.36938 Africa/Johannesburg +-29.27016 26.7052 Africa/Johannesburg +-27.3887 26.61701 Africa/Johannesburg +-26.21197 28.25958 Africa/Johannesburg +-27.64686 25.60697 Africa/Johannesburg +-29.12106 26.214 Africa/Johannesburg +-32.84721 27.44218 Africa/Johannesburg +-28.23078 28.30707 Africa/Johannesburg +-26.45794 29.46553 Africa/Johannesburg +-26.18848 28.32078 Africa/Johannesburg +-32.35671 22.58295 Africa/Johannesburg +-25.78842 31.05319 Africa/Johannesburg +-29.53897 31.21439 Africa/Johannesburg +-26.66331 28.59016 Africa/Johannesburg +-27.75431 26.64382 Africa/Johannesburg +-30.69366 26.71141 Africa/Johannesburg +-25.69619 28.74918 Africa/Johannesburg +-25.98953 28.12843 Africa/Johannesburg +-25.85891 28.18577 Africa/Johannesburg +-33.64651 19.44852 Africa/Johannesburg +-33.93462 18.86676 Africa/Johannesburg +-33.01167 17.9442 Africa/Johannesburg +-33.70468 18.96552 Africa/Johannesburg +-33.4608 18.72714 Africa/Johannesburg +-33.98735 18.49746 Africa/Johannesburg +-33.84808 18.71724 Africa/Johannesburg +-34.4187 19.23446 Africa/Johannesburg +-34.15152 19.01509 Africa/Johannesburg +-33.36889 19.31096 Africa/Johannesburg +-33.92584 18.42322 Africa/Johannesburg +-33.56668 18.48335 Africa/Johannesburg +-33.96333 18.47639 Africa/Johannesburg +-34.05515 18.47617 Africa/Johannesburg +-25.93312 28.01213 Africa/Johannesburg +-9.34506 28.73396 Africa/Lusaka +-8.84024 31.36587 Africa/Lusaka +-9.7915 29.07913 Africa/Lusaka +-16.53818 28.70876 Africa/Lusaka +-17.47593 24.29684 Africa/Lusaka +-11.36491 29.55652 Africa/Lusaka +-14.24264 31.3253 Africa/Lusaka +-12.95867 28.63659 Africa/Lusaka +-14.98293 27.0619 Africa/Lusaka +-12.54982 28.24071 Africa/Lusaka +-11.83431 31.45287 Africa/Lusaka +-16.28333 27.48333 Africa/Lusaka +-15.24835 23.12741 Africa/Lusaka +-15.85601 27.748 Africa/Lusaka +-11.19976 28.89431 Africa/Lusaka +-15.40669 28.28713 Africa/Lusaka +-13.13667 28.41661 Africa/Lusaka +-17.84194 25.85425 Africa/Lusaka +-12.80243 28.21323 Africa/Lusaka +-10.21289 31.18084 Africa/Lusaka +-13.97147 28.66985 Africa/Lusaka +-12.09514 26.42727 Africa/Lusaka +-12.84151 28.09479 Africa/Lusaka +-15.76911 28.18136 Africa/Lusaka +-14.4469 28.44644 Africa/Lusaka +-16.80648 26.95306 Africa/Lusaka +-13.63333 32.65 Africa/Lusaka +-12.52897 27.88382 Africa/Lusaka +-12.36475 27.82286 Africa/Lusaka +-20.32674 30.06648 Africa/Harare +-17.92353 25.84299 Africa/Harare +-19.67016 30.00589 Africa/Harare +-18.52785 32.12843 Africa/Harare +-19.03333 29.78333 Africa/Harare +-17.88333 30.7 Africa/Harare +-18.9707 32.67086 Africa/Harare +-20.06373 30.82766 Africa/Harare +-18.18527 31.55193 Africa/Harare +-18.9281 29.81486 Africa/Harare +-16.80993 29.69247 Africa/Harare +-16.51667 28.8 Africa/Harare +-18.33328 29.91534 Africa/Harare +-18.36927 26.50194 Africa/Harare +-17.82772 31.05337 Africa/Harare +-19.45 29.81667 Africa/Harare +-18.20476 28.9349 Africa/Harare +-21.05 31.66667 Africa/Harare +-20.18833 32.62364 Africa/Harare +-17.36667 30.2 Africa/Harare +-18.13021 30.14074 Africa/Harare +-20.15 28.58333 Africa/Harare +-17.30192 31.33056 Africa/Harare +-22.21667 30 Africa/Harare +-17.89 31.1475 Africa/Harare +-18.01274 31.07555 Africa/Harare diff --git a/data/maps.xml b/data/maps.xml new file mode 100644 index 0000000..decdf6c --- /dev/null +++ b/data/maps.xml @@ -0,0 +1,152 @@ + + + + + OSM GPS Traces + https://gps-c.tile.openstreetmap.org + /lines/%d/%d/%d.png + 0 + 18 + 33 + OSM-GPS + © OpenStreetMap contributors + CC-BY-SA + http://www.openstreetmap.org/copyright + TRUE + + + 29 + CalTopo + CalTopo USGS 7.5" Topos + s3-us-west-1.amazonaws.com + /caltopo/topo/%d/%d/%d.png?v=1 + 0 + 16 + 18.76 + 71.56 + -178.0 + -66.95 + CalTopo Terms of Use + CalTopo Terms of Use + http://caltopo.com/ + + + Public Transport Map + tile.xn--pnvkarte-m4a.de + /tilegen/%0d/%d/%d.png + 0 + 18 + 101 + pnvkarte + © OpenStreetMap contributors + CC-BY-SA + http://www.openstreetmap.org/copyright + + + OpenSeaMap + tiles.openseamap.org + /seamark/%d/%d/%d.png + 8 + 18 + 600 + OpenSeaMap + © OpenStreetMap contributors + CC-BY-SA + http://www.openstreetmap.org/copyright + + + Waymarked Trails Hiking + tile.waymarkedtrails.org + /hiking/%d/%d/%d.png + 701 + CC-by-SA 3.0 / ODBl + http://creativecommons.org/licenses/by-sa/3.0/de/deed.en + + + Waymarked Trails Cycling + tile.waymarkedtrails.org + /cycling/%d/%d/%d.png + 702 + CC-by-SA 3.0 / ODBl + http://creativecommons.org/licenses/by-sa/3.0/de/deed.en + + + Waymarked Trails MTB + tile.waymarkedtrails.org + /mtb/%d/%d/%d.png + 703 + CC-by-SA 3.0 / ODBl + http://creativecommons.org/licenses/by-sa/3.0/de/deed.en + + + Waymarked Trails Inline Skating + tile.waymarkedtrails.org + /skating/%d/%d/%d.png + 704 + CC-by-SA 3.0 / ODBl + http://creativecommons.org/licenses/by-sa/3.0/de/deed.en + + + Waymarked Trails Riding + tile.waymarkedtrails.org + /riding/%d/%d/%d.png + 705 + CC-by-SA 3.0 / ODBl + http://creativecommons.org/licenses/by-sa/3.0/de/deed.en + + + Waymarked Trails Winter Sport Slopes + tile.waymarkedtrails.org + /slopes/%d/%d/%d.png + 706 + CC-by-SA 3.0 / ODBl + http://creativecommons.org/licenses/by-sa/3.0/de/deed.en + + + 4UMaps + tileserver.4umaps.eu + /%d/%d/%d.png + © 4UMaps.eu © OpenStreetMap and contributors + CC-BY-SA + http://www.4umaps.eu/terms-of-use-copyright.aspx + 801 + + + OpenTopoMap + a.tile.opentopomap.org + /%d/%d/%d.png + 2 + Kartendaten: © OpenStreetMap-Mitwirkende, SRTM | Kartendarstellung: © OpenTopoMap + CC-BY-SA + https://creativecommons.org/licenses/by-sa/3.0/ + 901 + + diff --git a/data/routing.xml b/data/routing.xml new file mode 100644 index 0000000..e2c22c3 --- /dev/null +++ b/data/routing.xml @@ -0,0 +1,28 @@ + + + yourscar + Yours: Car + kml + http://www.yournavigation.org/api/1.0/gosmore.php?format=kml + &flat=%s&flon=%s + &tlat=%s&tlon=%s&v=car&fast=1&layer=mapnik + + + yoursbikefoot + Yours: Bicycle/Foot + kml + http://www.yournavigation.org/api/1.0/gosmore.php?format=kml + &flat=%s&flon=%s + &tlat=%s&tlon=%s&v=bicycle&fast=1&layer=mapnik + + + brouter + brouter + gpx + http://h2096617.stratoserver.net:443/brouter?nogos=&profile=hiking-beta&alternativeidx=0&format=gpx + &lonlats=%s,%s + |%s,%s + + FALSE + + diff --git a/depcomp b/depcomp new file mode 100755 index 0000000..65cbf70 --- /dev/null +++ b/depcomp @@ -0,0 +1,791 @@ +#! /bin/sh +# depcomp - compile a program generating dependencies as side-effects + +scriptversion=2018-03-07.03; # UTC + +# Copyright (C) 1999-2018 Free Software Foundation, Inc. + +# 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, 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, see . + +# As a special exception to the GNU General Public License, if you +# distribute this file as part of a program that contains a +# configuration script generated by Autoconf, you may include it under +# the same distribution terms that you use for the rest of that program. + +# Originally written by Alexandre Oliva . + +case $1 in + '') + echo "$0: No command. Try '$0 --help' for more information." 1>&2 + exit 1; + ;; + -h | --h*) + cat <<\EOF +Usage: depcomp [--help] [--version] PROGRAM [ARGS] + +Run PROGRAMS ARGS to compile a file, generating dependencies +as side-effects. + +Environment variables: + depmode Dependency tracking mode. + source Source file read by 'PROGRAMS ARGS'. + object Object file output by 'PROGRAMS ARGS'. + DEPDIR directory where to store dependencies. + depfile Dependency file to output. + tmpdepfile Temporary file to use when outputting dependencies. + libtool Whether libtool is used (yes/no). + +Report bugs to . +EOF + exit $? + ;; + -v | --v*) + echo "depcomp $scriptversion" + exit $? + ;; +esac + +# Get the directory component of the given path, and save it in the +# global variables '$dir'. Note that this directory component will +# be either empty or ending with a '/' character. This is deliberate. +set_dir_from () +{ + case $1 in + */*) dir=`echo "$1" | sed -e 's|/[^/]*$|/|'`;; + *) dir=;; + esac +} + +# Get the suffix-stripped basename of the given path, and save it the +# global variable '$base'. +set_base_from () +{ + base=`echo "$1" | sed -e 's|^.*/||' -e 's/\.[^.]*$//'` +} + +# If no dependency file was actually created by the compiler invocation, +# we still have to create a dummy depfile, to avoid errors with the +# Makefile "include basename.Plo" scheme. +make_dummy_depfile () +{ + echo "#dummy" > "$depfile" +} + +# Factor out some common post-processing of the generated depfile. +# Requires the auxiliary global variable '$tmpdepfile' to be set. +aix_post_process_depfile () +{ + # If the compiler actually managed to produce a dependency file, + # post-process it. + if test -f "$tmpdepfile"; then + # Each line is of the form 'foo.o: dependency.h'. + # Do two passes, one to just change these to + # $object: dependency.h + # and one to simply output + # dependency.h: + # which is needed to avoid the deleted-header problem. + { sed -e "s,^.*\.[$lower]*:,$object:," < "$tmpdepfile" + sed -e "s,^.*\.[$lower]*:[$tab ]*,," -e 's,$,:,' < "$tmpdepfile" + } > "$depfile" + rm -f "$tmpdepfile" + else + make_dummy_depfile + fi +} + +# A tabulation character. +tab=' ' +# A newline character. +nl=' +' +# Character ranges might be problematic outside the C locale. +# These definitions help. +upper=ABCDEFGHIJKLMNOPQRSTUVWXYZ +lower=abcdefghijklmnopqrstuvwxyz +digits=0123456789 +alpha=${upper}${lower} + +if test -z "$depmode" || test -z "$source" || test -z "$object"; then + echo "depcomp: Variables source, object and depmode must be set" 1>&2 + exit 1 +fi + +# Dependencies for sub/bar.o or sub/bar.obj go into sub/.deps/bar.Po. +depfile=${depfile-`echo "$object" | + sed 's|[^\\/]*$|'${DEPDIR-.deps}'/&|;s|\.\([^.]*\)$|.P\1|;s|Pobj$|Po|'`} +tmpdepfile=${tmpdepfile-`echo "$depfile" | sed 's/\.\([^.]*\)$/.T\1/'`} + +rm -f "$tmpdepfile" + +# Avoid interferences from the environment. +gccflag= dashmflag= + +# Some modes work just like other modes, but use different flags. We +# parameterize here, but still list the modes in the big case below, +# to make depend.m4 easier to write. Note that we *cannot* use a case +# here, because this file can only contain one case statement. +if test "$depmode" = hp; then + # HP compiler uses -M and no extra arg. + gccflag=-M + depmode=gcc +fi + +if test "$depmode" = dashXmstdout; then + # This is just like dashmstdout with a different argument. + dashmflag=-xM + depmode=dashmstdout +fi + +cygpath_u="cygpath -u -f -" +if test "$depmode" = msvcmsys; then + # This is just like msvisualcpp but w/o cygpath translation. + # Just convert the backslash-escaped backslashes to single forward + # slashes to satisfy depend.m4 + cygpath_u='sed s,\\\\,/,g' + depmode=msvisualcpp +fi + +if test "$depmode" = msvc7msys; then + # This is just like msvc7 but w/o cygpath translation. + # Just convert the backslash-escaped backslashes to single forward + # slashes to satisfy depend.m4 + cygpath_u='sed s,\\\\,/,g' + depmode=msvc7 +fi + +if test "$depmode" = xlc; then + # IBM C/C++ Compilers xlc/xlC can output gcc-like dependency information. + gccflag=-qmakedep=gcc,-MF + depmode=gcc +fi + +case "$depmode" in +gcc3) +## gcc 3 implements dependency tracking that does exactly what +## we want. Yay! Note: for some reason libtool 1.4 doesn't like +## it if -MD -MP comes after the -MF stuff. Hmm. +## Unfortunately, FreeBSD c89 acceptance of flags depends upon +## the command line argument order; so add the flags where they +## appear in depend2.am. Note that the slowdown incurred here +## affects only configure: in makefiles, %FASTDEP% shortcuts this. + for arg + do + case $arg in + -c) set fnord "$@" -MT "$object" -MD -MP -MF "$tmpdepfile" "$arg" ;; + *) set fnord "$@" "$arg" ;; + esac + shift # fnord + shift # $arg + done + "$@" + stat=$? + if test $stat -ne 0; then + rm -f "$tmpdepfile" + exit $stat + fi + mv "$tmpdepfile" "$depfile" + ;; + +gcc) +## Note that this doesn't just cater to obsosete pre-3.x GCC compilers. +## but also to in-use compilers like IMB xlc/xlC and the HP C compiler. +## (see the conditional assignment to $gccflag above). +## There are various ways to get dependency output from gcc. Here's +## why we pick this rather obscure method: +## - Don't want to use -MD because we'd like the dependencies to end +## up in a subdir. Having to rename by hand is ugly. +## (We might end up doing this anyway to support other compilers.) +## - The DEPENDENCIES_OUTPUT environment variable makes gcc act like +## -MM, not -M (despite what the docs say). Also, it might not be +## supported by the other compilers which use the 'gcc' depmode. +## - Using -M directly means running the compiler twice (even worse +## than renaming). + if test -z "$gccflag"; then + gccflag=-MD, + fi + "$@" -Wp,"$gccflag$tmpdepfile" + stat=$? + if test $stat -ne 0; then + rm -f "$tmpdepfile" + exit $stat + fi + rm -f "$depfile" + echo "$object : \\" > "$depfile" + # The second -e expression handles DOS-style file names with drive + # letters. + sed -e 's/^[^:]*: / /' \ + -e 's/^['$alpha']:\/[^:]*: / /' < "$tmpdepfile" >> "$depfile" +## This next piece of magic avoids the "deleted header file" problem. +## The problem is that when a header file which appears in a .P file +## is deleted, the dependency causes make to die (because there is +## typically no way to rebuild the header). We avoid this by adding +## dummy dependencies for each header file. Too bad gcc doesn't do +## this for us directly. +## Some versions of gcc put a space before the ':'. On the theory +## that the space means something, we add a space to the output as +## well. hp depmode also adds that space, but also prefixes the VPATH +## to the object. Take care to not repeat it in the output. +## Some versions of the HPUX 10.20 sed can't process this invocation +## correctly. Breaking it into two sed invocations is a workaround. + tr ' ' "$nl" < "$tmpdepfile" \ + | sed -e 's/^\\$//' -e '/^$/d' -e "s|.*$object$||" -e '/:$/d' \ + | sed -e 's/$/ :/' >> "$depfile" + rm -f "$tmpdepfile" + ;; + +hp) + # This case exists only to let depend.m4 do its work. It works by + # looking at the text of this script. This case will never be run, + # since it is checked for above. + exit 1 + ;; + +sgi) + if test "$libtool" = yes; then + "$@" "-Wp,-MDupdate,$tmpdepfile" + else + "$@" -MDupdate "$tmpdepfile" + fi + stat=$? + if test $stat -ne 0; then + rm -f "$tmpdepfile" + exit $stat + fi + rm -f "$depfile" + + if test -f "$tmpdepfile"; then # yes, the sourcefile depend on other files + echo "$object : \\" > "$depfile" + # Clip off the initial element (the dependent). Don't try to be + # clever and replace this with sed code, as IRIX sed won't handle + # lines with more than a fixed number of characters (4096 in + # IRIX 6.2 sed, 8192 in IRIX 6.5). We also remove comment lines; + # the IRIX cc adds comments like '#:fec' to the end of the + # dependency line. + tr ' ' "$nl" < "$tmpdepfile" \ + | sed -e 's/^.*\.o://' -e 's/#.*$//' -e '/^$/ d' \ + | tr "$nl" ' ' >> "$depfile" + echo >> "$depfile" + # The second pass generates a dummy entry for each header file. + tr ' ' "$nl" < "$tmpdepfile" \ + | sed -e 's/^.*\.o://' -e 's/#.*$//' -e '/^$/ d' -e 's/$/:/' \ + >> "$depfile" + else + make_dummy_depfile + fi + rm -f "$tmpdepfile" + ;; + +xlc) + # This case exists only to let depend.m4 do its work. It works by + # looking at the text of this script. This case will never be run, + # since it is checked for above. + exit 1 + ;; + +aix) + # The C for AIX Compiler uses -M and outputs the dependencies + # in a .u file. In older versions, this file always lives in the + # current directory. Also, the AIX compiler puts '$object:' at the + # start of each line; $object doesn't have directory information. + # Version 6 uses the directory in both cases. + set_dir_from "$object" + set_base_from "$object" + if test "$libtool" = yes; then + tmpdepfile1=$dir$base.u + tmpdepfile2=$base.u + tmpdepfile3=$dir.libs/$base.u + "$@" -Wc,-M + else + tmpdepfile1=$dir$base.u + tmpdepfile2=$dir$base.u + tmpdepfile3=$dir$base.u + "$@" -M + fi + stat=$? + if test $stat -ne 0; then + rm -f "$tmpdepfile1" "$tmpdepfile2" "$tmpdepfile3" + exit $stat + fi + + for tmpdepfile in "$tmpdepfile1" "$tmpdepfile2" "$tmpdepfile3" + do + test -f "$tmpdepfile" && break + done + aix_post_process_depfile + ;; + +tcc) + # tcc (Tiny C Compiler) understand '-MD -MF file' since version 0.9.26 + # FIXME: That version still under development at the moment of writing. + # Make that this statement remains true also for stable, released + # versions. + # It will wrap lines (doesn't matter whether long or short) with a + # trailing '\', as in: + # + # foo.o : \ + # foo.c \ + # foo.h \ + # + # It will put a trailing '\' even on the last line, and will use leading + # spaces rather than leading tabs (at least since its commit 0394caf7 + # "Emit spaces for -MD"). + "$@" -MD -MF "$tmpdepfile" + stat=$? + if test $stat -ne 0; then + rm -f "$tmpdepfile" + exit $stat + fi + rm -f "$depfile" + # Each non-empty line is of the form 'foo.o : \' or ' dep.h \'. + # We have to change lines of the first kind to '$object: \'. + sed -e "s|.*:|$object :|" < "$tmpdepfile" > "$depfile" + # And for each line of the second kind, we have to emit a 'dep.h:' + # dummy dependency, to avoid the deleted-header problem. + sed -n -e 's|^ *\(.*\) *\\$|\1:|p' < "$tmpdepfile" >> "$depfile" + rm -f "$tmpdepfile" + ;; + +## The order of this option in the case statement is important, since the +## shell code in configure will try each of these formats in the order +## listed in this file. A plain '-MD' option would be understood by many +## compilers, so we must ensure this comes after the gcc and icc options. +pgcc) + # Portland's C compiler understands '-MD'. + # Will always output deps to 'file.d' where file is the root name of the + # source file under compilation, even if file resides in a subdirectory. + # The object file name does not affect the name of the '.d' file. + # pgcc 10.2 will output + # foo.o: sub/foo.c sub/foo.h + # and will wrap long lines using '\' : + # foo.o: sub/foo.c ... \ + # sub/foo.h ... \ + # ... + set_dir_from "$object" + # Use the source, not the object, to determine the base name, since + # that's sadly what pgcc will do too. + set_base_from "$source" + tmpdepfile=$base.d + + # For projects that build the same source file twice into different object + # files, the pgcc approach of using the *source* file root name can cause + # problems in parallel builds. Use a locking strategy to avoid stomping on + # the same $tmpdepfile. + lockdir=$base.d-lock + trap " + echo '$0: caught signal, cleaning up...' >&2 + rmdir '$lockdir' + exit 1 + " 1 2 13 15 + numtries=100 + i=$numtries + while test $i -gt 0; do + # mkdir is a portable test-and-set. + if mkdir "$lockdir" 2>/dev/null; then + # This process acquired the lock. + "$@" -MD + stat=$? + # Release the lock. + rmdir "$lockdir" + break + else + # If the lock is being held by a different process, wait + # until the winning process is done or we timeout. + while test -d "$lockdir" && test $i -gt 0; do + sleep 1 + i=`expr $i - 1` + done + fi + i=`expr $i - 1` + done + trap - 1 2 13 15 + if test $i -le 0; then + echo "$0: failed to acquire lock after $numtries attempts" >&2 + echo "$0: check lockdir '$lockdir'" >&2 + exit 1 + fi + + if test $stat -ne 0; then + rm -f "$tmpdepfile" + exit $stat + fi + rm -f "$depfile" + # Each line is of the form `foo.o: dependent.h', + # or `foo.o: dep1.h dep2.h \', or ` dep3.h dep4.h \'. + # Do two passes, one to just change these to + # `$object: dependent.h' and one to simply `dependent.h:'. + sed "s,^[^:]*:,$object :," < "$tmpdepfile" > "$depfile" + # Some versions of the HPUX 10.20 sed can't process this invocation + # correctly. Breaking it into two sed invocations is a workaround. + sed 's,^[^:]*: \(.*\)$,\1,;s/^\\$//;/^$/d;/:$/d' < "$tmpdepfile" \ + | sed -e 's/$/ :/' >> "$depfile" + rm -f "$tmpdepfile" + ;; + +hp2) + # The "hp" stanza above does not work with aCC (C++) and HP's ia64 + # compilers, which have integrated preprocessors. The correct option + # to use with these is +Maked; it writes dependencies to a file named + # 'foo.d', which lands next to the object file, wherever that + # happens to be. + # Much of this is similar to the tru64 case; see comments there. + set_dir_from "$object" + set_base_from "$object" + if test "$libtool" = yes; then + tmpdepfile1=$dir$base.d + tmpdepfile2=$dir.libs/$base.d + "$@" -Wc,+Maked + else + tmpdepfile1=$dir$base.d + tmpdepfile2=$dir$base.d + "$@" +Maked + fi + stat=$? + if test $stat -ne 0; then + rm -f "$tmpdepfile1" "$tmpdepfile2" + exit $stat + fi + + for tmpdepfile in "$tmpdepfile1" "$tmpdepfile2" + do + test -f "$tmpdepfile" && break + done + if test -f "$tmpdepfile"; then + sed -e "s,^.*\.[$lower]*:,$object:," "$tmpdepfile" > "$depfile" + # Add 'dependent.h:' lines. + sed -ne '2,${ + s/^ *// + s/ \\*$// + s/$/:/ + p + }' "$tmpdepfile" >> "$depfile" + else + make_dummy_depfile + fi + rm -f "$tmpdepfile" "$tmpdepfile2" + ;; + +tru64) + # The Tru64 compiler uses -MD to generate dependencies as a side + # effect. 'cc -MD -o foo.o ...' puts the dependencies into 'foo.o.d'. + # At least on Alpha/Redhat 6.1, Compaq CCC V6.2-504 seems to put + # dependencies in 'foo.d' instead, so we check for that too. + # Subdirectories are respected. + set_dir_from "$object" + set_base_from "$object" + + if test "$libtool" = yes; then + # Libtool generates 2 separate objects for the 2 libraries. These + # two compilations output dependencies in $dir.libs/$base.o.d and + # in $dir$base.o.d. We have to check for both files, because + # one of the two compilations can be disabled. We should prefer + # $dir$base.o.d over $dir.libs/$base.o.d because the latter is + # automatically cleaned when .libs/ is deleted, while ignoring + # the former would cause a distcleancheck panic. + tmpdepfile1=$dir$base.o.d # libtool 1.5 + tmpdepfile2=$dir.libs/$base.o.d # Likewise. + tmpdepfile3=$dir.libs/$base.d # Compaq CCC V6.2-504 + "$@" -Wc,-MD + else + tmpdepfile1=$dir$base.d + tmpdepfile2=$dir$base.d + tmpdepfile3=$dir$base.d + "$@" -MD + fi + + stat=$? + if test $stat -ne 0; then + rm -f "$tmpdepfile1" "$tmpdepfile2" "$tmpdepfile3" + exit $stat + fi + + for tmpdepfile in "$tmpdepfile1" "$tmpdepfile2" "$tmpdepfile3" + do + test -f "$tmpdepfile" && break + done + # Same post-processing that is required for AIX mode. + aix_post_process_depfile + ;; + +msvc7) + if test "$libtool" = yes; then + showIncludes=-Wc,-showIncludes + else + showIncludes=-showIncludes + fi + "$@" $showIncludes > "$tmpdepfile" + stat=$? + grep -v '^Note: including file: ' "$tmpdepfile" + if test $stat -ne 0; then + rm -f "$tmpdepfile" + exit $stat + fi + rm -f "$depfile" + echo "$object : \\" > "$depfile" + # The first sed program below extracts the file names and escapes + # backslashes for cygpath. The second sed program outputs the file + # name when reading, but also accumulates all include files in the + # hold buffer in order to output them again at the end. This only + # works with sed implementations that can handle large buffers. + sed < "$tmpdepfile" -n ' +/^Note: including file: *\(.*\)/ { + s//\1/ + s/\\/\\\\/g + p +}' | $cygpath_u | sort -u | sed -n ' +s/ /\\ /g +s/\(.*\)/'"$tab"'\1 \\/p +s/.\(.*\) \\/\1:/ +H +$ { + s/.*/'"$tab"'/ + G + p +}' >> "$depfile" + echo >> "$depfile" # make sure the fragment doesn't end with a backslash + rm -f "$tmpdepfile" + ;; + +msvc7msys) + # This case exists only to let depend.m4 do its work. It works by + # looking at the text of this script. This case will never be run, + # since it is checked for above. + exit 1 + ;; + +#nosideeffect) + # This comment above is used by automake to tell side-effect + # dependency tracking mechanisms from slower ones. + +dashmstdout) + # Important note: in order to support this mode, a compiler *must* + # always write the preprocessed file to stdout, regardless of -o. + "$@" || exit $? + + # Remove the call to Libtool. + if test "$libtool" = yes; then + while test "X$1" != 'X--mode=compile'; do + shift + done + shift + fi + + # Remove '-o $object'. + IFS=" " + for arg + do + case $arg in + -o) + shift + ;; + $object) + shift + ;; + *) + set fnord "$@" "$arg" + shift # fnord + shift # $arg + ;; + esac + done + + test -z "$dashmflag" && dashmflag=-M + # Require at least two characters before searching for ':' + # in the target name. This is to cope with DOS-style filenames: + # a dependency such as 'c:/foo/bar' could be seen as target 'c' otherwise. + "$@" $dashmflag | + sed "s|^[$tab ]*[^:$tab ][^:][^:]*:[$tab ]*|$object: |" > "$tmpdepfile" + rm -f "$depfile" + cat < "$tmpdepfile" > "$depfile" + # Some versions of the HPUX 10.20 sed can't process this sed invocation + # correctly. Breaking it into two sed invocations is a workaround. + tr ' ' "$nl" < "$tmpdepfile" \ + | sed -e 's/^\\$//' -e '/^$/d' -e '/:$/d' \ + | sed -e 's/$/ :/' >> "$depfile" + rm -f "$tmpdepfile" + ;; + +dashXmstdout) + # This case only exists to satisfy depend.m4. It is never actually + # run, as this mode is specially recognized in the preamble. + exit 1 + ;; + +makedepend) + "$@" || exit $? + # Remove any Libtool call + if test "$libtool" = yes; then + while test "X$1" != 'X--mode=compile'; do + shift + done + shift + fi + # X makedepend + shift + cleared=no eat=no + for arg + do + case $cleared in + no) + set ""; shift + cleared=yes ;; + esac + if test $eat = yes; then + eat=no + continue + fi + case "$arg" in + -D*|-I*) + set fnord "$@" "$arg"; shift ;; + # Strip any option that makedepend may not understand. Remove + # the object too, otherwise makedepend will parse it as a source file. + -arch) + eat=yes ;; + -*|$object) + ;; + *) + set fnord "$@" "$arg"; shift ;; + esac + done + obj_suffix=`echo "$object" | sed 's/^.*\././'` + touch "$tmpdepfile" + ${MAKEDEPEND-makedepend} -o"$obj_suffix" -f"$tmpdepfile" "$@" + rm -f "$depfile" + # makedepend may prepend the VPATH from the source file name to the object. + # No need to regex-escape $object, excess matching of '.' is harmless. + sed "s|^.*\($object *:\)|\1|" "$tmpdepfile" > "$depfile" + # Some versions of the HPUX 10.20 sed can't process the last invocation + # correctly. Breaking it into two sed invocations is a workaround. + sed '1,2d' "$tmpdepfile" \ + | tr ' ' "$nl" \ + | sed -e 's/^\\$//' -e '/^$/d' -e '/:$/d' \ + | sed -e 's/$/ :/' >> "$depfile" + rm -f "$tmpdepfile" "$tmpdepfile".bak + ;; + +cpp) + # Important note: in order to support this mode, a compiler *must* + # always write the preprocessed file to stdout. + "$@" || exit $? + + # Remove the call to Libtool. + if test "$libtool" = yes; then + while test "X$1" != 'X--mode=compile'; do + shift + done + shift + fi + + # Remove '-o $object'. + IFS=" " + for arg + do + case $arg in + -o) + shift + ;; + $object) + shift + ;; + *) + set fnord "$@" "$arg" + shift # fnord + shift # $arg + ;; + esac + done + + "$@" -E \ + | sed -n -e '/^# [0-9][0-9]* "\([^"]*\)".*/ s:: \1 \\:p' \ + -e '/^#line [0-9][0-9]* "\([^"]*\)".*/ s:: \1 \\:p' \ + | sed '$ s: \\$::' > "$tmpdepfile" + rm -f "$depfile" + echo "$object : \\" > "$depfile" + cat < "$tmpdepfile" >> "$depfile" + sed < "$tmpdepfile" '/^$/d;s/^ //;s/ \\$//;s/$/ :/' >> "$depfile" + rm -f "$tmpdepfile" + ;; + +msvisualcpp) + # Important note: in order to support this mode, a compiler *must* + # always write the preprocessed file to stdout. + "$@" || exit $? + + # Remove the call to Libtool. + if test "$libtool" = yes; then + while test "X$1" != 'X--mode=compile'; do + shift + done + shift + fi + + IFS=" " + for arg + do + case "$arg" in + -o) + shift + ;; + $object) + shift + ;; + "-Gm"|"/Gm"|"-Gi"|"/Gi"|"-ZI"|"/ZI") + set fnord "$@" + shift + shift + ;; + *) + set fnord "$@" "$arg" + shift + shift + ;; + esac + done + "$@" -E 2>/dev/null | + sed -n '/^#line [0-9][0-9]* "\([^"]*\)"/ s::\1:p' | $cygpath_u | sort -u > "$tmpdepfile" + rm -f "$depfile" + echo "$object : \\" > "$depfile" + sed < "$tmpdepfile" -n -e 's% %\\ %g' -e '/^\(.*\)$/ s::'"$tab"'\1 \\:p' >> "$depfile" + echo "$tab" >> "$depfile" + sed < "$tmpdepfile" -n -e 's% %\\ %g' -e '/^\(.*\)$/ s::\1\::p' >> "$depfile" + rm -f "$tmpdepfile" + ;; + +msvcmsys) + # This case exists only to let depend.m4 do its work. It works by + # looking at the text of this script. This case will never be run, + # since it is checked for above. + exit 1 + ;; + +none) + exec "$@" + ;; + +*) + echo "Unknown depmode $depmode" 1>&2 + exit 1 + ;; +esac + +exit 0 + +# Local Variables: +# mode: shell-script +# sh-indentation: 2 +# eval: (add-hook 'before-save-hook 'time-stamp) +# time-stamp-start: "scriptversion=" +# time-stamp-format: "%:y-%02m-%02d.%02H" +# time-stamp-time-zone: "UTC0" +# time-stamp-end: "; # UTC" +# End: diff --git a/doc/GPSMAPPER b/doc/GPSMAPPER new file mode 100644 index 0000000..4813ee7 --- /dev/null +++ b/doc/GPSMAPPER @@ -0,0 +1,13 @@ +A word on exporting TrackWaypoint layers as GPSMapper files. +(NOTE: You should always save your data as a gpspoint or Viking file also because Viking cannot open gpsmapper files) +The comment field for each track/waypoint you want to export to GPSMapper should be in the following format: + +Name RGN## 0x#### + - or - +Name RGN## 0x## + +Where the first '##' is 10, 20, 40, or 80, and the second group of '#'s is the type of region. +See the GPSmapper ( http://gps.chrisb.org/ ) docs for more details. +By the way, if anyone knows of an open-source program to make compiled maps for (preferably Garmin, +but I would appreciate info on other brand) GPS receivers, please tell me! + diff --git a/doc/Makefile.am b/doc/Makefile.am new file mode 100644 index 0000000..c8c377a --- /dev/null +++ b/doc/Makefile.am @@ -0,0 +1,5 @@ +SUBDIRS = examples reference + +EXTRA_DIST = GPSMAPPER + +CLEANFILES= diff --git a/doc/Makefile.in b/doc/Makefile.in new file mode 100644 index 0000000..e819dd4 --- /dev/null +++ b/doc/Makefile.in @@ -0,0 +1,682 @@ +# Makefile.in generated by automake 1.16.1 from Makefile.am. +# @configure_input@ + +# Copyright (C) 1994-2018 Free Software Foundation, Inc. + +# This Makefile.in is free software; the Free Software Foundation +# gives unlimited permission to copy and/or distribute it, +# with or without modifications, as long as this notice is preserved. + +# This program is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY, to the extent permitted by law; without +# even the implied warranty of MERCHANTABILITY or FITNESS FOR A +# PARTICULAR PURPOSE. + +@SET_MAKE@ +VPATH = @srcdir@ +am__is_gnu_make = { \ + if test -z '$(MAKELEVEL)'; then \ + false; \ + elif test -n '$(MAKE_HOST)'; then \ + true; \ + elif test -n '$(MAKE_VERSION)' && test -n '$(CURDIR)'; then \ + true; \ + else \ + false; \ + fi; \ +} +am__make_running_with_option = \ + case $${target_option-} in \ + ?) ;; \ + *) echo "am__make_running_with_option: internal error: invalid" \ + "target option '$${target_option-}' specified" >&2; \ + exit 1;; \ + esac; \ + has_opt=no; \ + sane_makeflags=$$MAKEFLAGS; \ + if $(am__is_gnu_make); then \ + sane_makeflags=$$MFLAGS; \ + else \ + case $$MAKEFLAGS in \ + *\\[\ \ ]*) \ + bs=\\; \ + sane_makeflags=`printf '%s\n' "$$MAKEFLAGS" \ + | sed "s/$$bs$$bs[$$bs $$bs ]*//g"`;; \ + esac; \ + fi; \ + skip_next=no; \ + strip_trailopt () \ + { \ + flg=`printf '%s\n' "$$flg" | sed "s/$$1.*$$//"`; \ + }; \ + for flg in $$sane_makeflags; do \ + test $$skip_next = yes && { skip_next=no; continue; }; \ + case $$flg in \ + *=*|--*) continue;; \ + -*I) strip_trailopt 'I'; skip_next=yes;; \ + -*I?*) strip_trailopt 'I';; \ + -*O) strip_trailopt 'O'; skip_next=yes;; \ + -*O?*) strip_trailopt 'O';; \ + -*l) strip_trailopt 'l'; skip_next=yes;; \ + -*l?*) strip_trailopt 'l';; \ + -[dEDm]) skip_next=yes;; \ + -[JT]) skip_next=yes;; \ + esac; \ + case $$flg in \ + *$$target_option*) has_opt=yes; break;; \ + esac; \ + done; \ + test $$has_opt = yes +am__make_dryrun = (target_option=n; $(am__make_running_with_option)) +am__make_keepgoing = (target_option=k; $(am__make_running_with_option)) +pkgdatadir = $(datadir)/@PACKAGE@ +pkgincludedir = $(includedir)/@PACKAGE@ +pkglibdir = $(libdir)/@PACKAGE@ +pkglibexecdir = $(libexecdir)/@PACKAGE@ +am__cd = CDPATH="$${ZSH_VERSION+.}$(PATH_SEPARATOR)" && cd +install_sh_DATA = $(install_sh) -c -m 644 +install_sh_PROGRAM = $(install_sh) -c +install_sh_SCRIPT = $(install_sh) -c +INSTALL_HEADER = $(INSTALL_DATA) +transform = $(program_transform_name) +NORMAL_INSTALL = : +PRE_INSTALL = : +POST_INSTALL = : +NORMAL_UNINSTALL = : +PRE_UNINSTALL = : +POST_UNINSTALL = : +build_triplet = @build@ +host_triplet = @host@ +target_triplet = @target@ +subdir = doc +ACLOCAL_M4 = $(top_srcdir)/aclocal.m4 +am__aclocal_m4_deps = $(top_srcdir)/m4/expat.m4 \ + $(top_srcdir)/m4/gettext.m4 $(top_srcdir)/m4/iconv.m4 \ + $(top_srcdir)/m4/intlmacosx.m4 $(top_srcdir)/m4/lib-ld.m4 \ + $(top_srcdir)/m4/lib-link.m4 $(top_srcdir)/m4/lib-prefix.m4 \ + $(top_srcdir)/m4/libcurl.m4 $(top_srcdir)/m4/nls.m4 \ + $(top_srcdir)/m4/po.m4 $(top_srcdir)/m4/progtest.m4 \ + $(top_srcdir)/configure.ac +am__configure_deps = $(am__aclocal_m4_deps) $(CONFIGURE_DEPENDENCIES) \ + $(ACLOCAL_M4) +DIST_COMMON = $(srcdir)/Makefile.am $(am__DIST_COMMON) +mkinstalldirs = $(SHELL) $(top_srcdir)/mkinstalldirs +CONFIG_HEADER = $(top_builddir)/src/config.h +CONFIG_CLEAN_FILES = +CONFIG_CLEAN_VPATH_FILES = +AM_V_P = $(am__v_P_@AM_V@) +am__v_P_ = $(am__v_P_@AM_DEFAULT_V@) +am__v_P_0 = false +am__v_P_1 = : +AM_V_GEN = $(am__v_GEN_@AM_V@) +am__v_GEN_ = $(am__v_GEN_@AM_DEFAULT_V@) +am__v_GEN_0 = @echo " GEN " $@; +am__v_GEN_1 = +AM_V_at = $(am__v_at_@AM_V@) +am__v_at_ = $(am__v_at_@AM_DEFAULT_V@) +am__v_at_0 = @ +am__v_at_1 = +SOURCES = +DIST_SOURCES = +RECURSIVE_TARGETS = all-recursive check-recursive cscopelist-recursive \ + ctags-recursive dvi-recursive html-recursive info-recursive \ + install-data-recursive install-dvi-recursive \ + install-exec-recursive install-html-recursive \ + install-info-recursive install-pdf-recursive \ + install-ps-recursive install-recursive installcheck-recursive \ + installdirs-recursive pdf-recursive ps-recursive \ + tags-recursive uninstall-recursive +am__can_run_installinfo = \ + case $$AM_UPDATE_INFO_DIR in \ + n|no|NO) false;; \ + *) (install-info --version) >/dev/null 2>&1;; \ + esac +RECURSIVE_CLEAN_TARGETS = mostlyclean-recursive clean-recursive \ + distclean-recursive maintainer-clean-recursive +am__recursive_targets = \ + $(RECURSIVE_TARGETS) \ + $(RECURSIVE_CLEAN_TARGETS) \ + $(am__extra_recursive_targets) +AM_RECURSIVE_TARGETS = $(am__recursive_targets:-recursive=) TAGS CTAGS \ + distdir distdir-am +am__tagged_files = $(HEADERS) $(SOURCES) $(TAGS_FILES) $(LISP) +# Read a list of newline-separated strings from the standard input, +# and print each of them once, without duplicates. Input order is +# *not* preserved. +am__uniquify_input = $(AWK) '\ + BEGIN { nonempty = 0; } \ + { items[$$0] = 1; nonempty = 1; } \ + END { if (nonempty) { for (i in items) print i; }; } \ +' +# Make sure the list of sources is unique. This is necessary because, +# e.g., the same source file might be shared among _SOURCES variables +# for different programs/libraries. +am__define_uniq_tagged_files = \ + list='$(am__tagged_files)'; \ + unique=`for i in $$list; do \ + if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \ + done | $(am__uniquify_input)` +ETAGS = etags +CTAGS = ctags +DIST_SUBDIRS = $(SUBDIRS) +am__DIST_COMMON = $(srcdir)/Makefile.in $(top_srcdir)/mkinstalldirs +DISTFILES = $(DIST_COMMON) $(DIST_SOURCES) $(TEXINFOS) $(EXTRA_DIST) +am__relativize = \ + dir0=`pwd`; \ + sed_first='s,^\([^/]*\)/.*$$,\1,'; \ + sed_rest='s,^[^/]*/*,,'; \ + sed_last='s,^.*/\([^/]*\)$$,\1,'; \ + sed_butlast='s,/*[^/]*$$,,'; \ + while test -n "$$dir1"; do \ + first=`echo "$$dir1" | sed -e "$$sed_first"`; \ + if test "$$first" != "."; then \ + if test "$$first" = ".."; then \ + dir2=`echo "$$dir0" | sed -e "$$sed_last"`/"$$dir2"; \ + dir0=`echo "$$dir0" | sed -e "$$sed_butlast"`; \ + else \ + first2=`echo "$$dir2" | sed -e "$$sed_first"`; \ + if test "$$first2" = "$$first"; then \ + dir2=`echo "$$dir2" | sed -e "$$sed_rest"`; \ + else \ + dir2="../$$dir2"; \ + fi; \ + dir0="$$dir0"/"$$first"; \ + fi; \ + fi; \ + dir1=`echo "$$dir1" | sed -e "$$sed_rest"`; \ + done; \ + reldir="$$dir2" +ACLOCAL = @ACLOCAL@ +ACLOCAL_AMFLAGS = @ACLOCAL_AMFLAGS@ +ALL_LINGUAS = @ALL_LINGUAS@ +AMTAR = @AMTAR@ +AM_DEFAULT_VERBOSITY = @AM_DEFAULT_VERBOSITY@ +AUTOCONF = @AUTOCONF@ +AUTOHEADER = @AUTOHEADER@ +AUTOMAKE = @AUTOMAKE@ +AWK = @AWK@ +CATALOGS = @CATALOGS@ +CATOBJEXT = @CATOBJEXT@ +CC = @CC@ +CCDEPMODE = @CCDEPMODE@ +CFLAGS = @CFLAGS@ +CONFIG_STATUS_DEPENDENCIES = @CONFIG_STATUS_DEPENDENCIES@ +CPP = @CPP@ +CPPFLAGS = @CPPFLAGS@ +CXX = @CXX@ +CXXCPP = @CXXCPP@ +CXXDEPMODE = @CXXDEPMODE@ +CXXFLAGS = @CXXFLAGS@ +CYGPATH_W = @CYGPATH_W@ +DATADIRNAME = @DATADIRNAME@ +DB2MAN_XSL = @DB2MAN_XSL@ +DEFS = @DEFS@ +DEPDIR = @DEPDIR@ +DISTCHECK_CONFIGURE_FLAGS = @DISTCHECK_CONFIGURE_FLAGS@ +DOC_USER_FORMATS = @DOC_USER_FORMATS@ +ECHO_C = @ECHO_C@ +ECHO_N = @ECHO_N@ +ECHO_T = @ECHO_T@ +EGREP = @EGREP@ +EXEEXT = @EXEEXT@ +EXPAT_CFLAGS = @EXPAT_CFLAGS@ +EXPAT_LIBS = @EXPAT_LIBS@ +GDK_PIXBUF_CSOURCE = @GDK_PIXBUF_CSOURCE@ +GETTEXT_MACRO_VERSION = @GETTEXT_MACRO_VERSION@ +GETTEXT_PACKAGE = @GETTEXT_PACKAGE@ +GLIB_MKENUMS = @GLIB_MKENUMS@ +GMOFILES = @GMOFILES@ +GMSGFMT = @GMSGFMT@ +GMSGFMT_015 = @GMSGFMT_015@ +GREP = @GREP@ +GTKDOC_CHECK = @GTKDOC_CHECK@ +GTKDOC_CHECK_PATH = @GTKDOC_CHECK_PATH@ +GTKDOC_DEPS_CFLAGS = @GTKDOC_DEPS_CFLAGS@ +GTKDOC_DEPS_LIBS = @GTKDOC_DEPS_LIBS@ +GTKDOC_MKPDF = @GTKDOC_MKPDF@ +GTKDOC_REBASE = @GTKDOC_REBASE@ +HAVE_SCROLLKEEPER = @HAVE_SCROLLKEEPER@ +HELP_DIR = @HELP_DIR@ +HTML_DIR = @HTML_DIR@ +INSTALL = @INSTALL@ +INSTALL_DATA = @INSTALL_DATA@ +INSTALL_PROGRAM = @INSTALL_PROGRAM@ +INSTALL_SCRIPT = @INSTALL_SCRIPT@ +INSTALL_STRIP_PROGRAM = @INSTALL_STRIP_PROGRAM@ +INSTOBJEXT = @INSTOBJEXT@ +INTLLIBS = @INTLLIBS@ +INTLTOOL_EXTRACT = @INTLTOOL_EXTRACT@ +INTLTOOL_MERGE = @INTLTOOL_MERGE@ +INTLTOOL_PERL = @INTLTOOL_PERL@ +INTLTOOL_UPDATE = @INTLTOOL_UPDATE@ +INTLTOOL_V_MERGE = @INTLTOOL_V_MERGE@ +INTLTOOL_V_MERGE_OPTIONS = @INTLTOOL_V_MERGE_OPTIONS@ +INTLTOOL__v_MERGE_ = @INTLTOOL__v_MERGE_@ +INTLTOOL__v_MERGE_0 = @INTLTOOL__v_MERGE_0@ +INTL_MACOSX_LIBS = @INTL_MACOSX_LIBS@ +ISODATE = @ISODATE@ +LDFLAGS = @LDFLAGS@ +LIBCURL = @LIBCURL@ +LIBCURL_CPPFLAGS = @LIBCURL_CPPFLAGS@ +LIBGEOCLUE_CFLAGS = @LIBGEOCLUE_CFLAGS@ +LIBGEOCLUE_LIBS = @LIBGEOCLUE_LIBS@ +LIBICONV = @LIBICONV@ +LIBINTL = @LIBINTL@ +LIBOBJS = @LIBOBJS@ +LIBS = @LIBS@ +LIBZIP_CFLAGS = @LIBZIP_CFLAGS@ +LIBZIP_LIBS = @LIBZIP_LIBS@ +LN_S = @LN_S@ +LTLIBICONV = @LTLIBICONV@ +LTLIBINTL = @LTLIBINTL@ +LTLIBOBJS = @LTLIBOBJS@ +MAKEINFO = @MAKEINFO@ +MKDIR_P = @MKDIR_P@ +MKINSTALLDIRS = @MKINSTALLDIRS@ +MSGFMT = @MSGFMT@ +MSGFMT_015 = @MSGFMT_015@ +MSGFMT_OPTS = @MSGFMT_OPTS@ +MSGMERGE = @MSGMERGE@ +OBJEXT = @OBJEXT@ +OMF_DIR = @OMF_DIR@ +PACKAGE = @PACKAGE@ +PACKAGE_BUGREPORT = @PACKAGE_BUGREPORT@ +PACKAGE_CFLAGS = @PACKAGE_CFLAGS@ +PACKAGE_LIBS = @PACKAGE_LIBS@ +PACKAGE_NAME = @PACKAGE_NAME@ +PACKAGE_STRING = @PACKAGE_STRING@ +PACKAGE_TARNAME = @PACKAGE_TARNAME@ +PACKAGE_URL = @PACKAGE_URL@ +PACKAGE_VERSION = @PACKAGE_VERSION@ +PATH_SEPARATOR = @PATH_SEPARATOR@ +PKG_CONFIG = @PKG_CONFIG@ +PKG_CONFIG_LIBDIR = @PKG_CONFIG_LIBDIR@ +PKG_CONFIG_PATH = @PKG_CONFIG_PATH@ +POFILES = @POFILES@ +POSUB = @POSUB@ +PO_IN_DATADIR_FALSE = @PO_IN_DATADIR_FALSE@ +PO_IN_DATADIR_TRUE = @PO_IN_DATADIR_TRUE@ +RANLIB = @RANLIB@ +SET_MAKE = @SET_MAKE@ +SHELL = @SHELL@ +STRIP = @STRIP@ +USE_NLS = @USE_NLS@ +VERSION = @VERSION@ +XGETTEXT = @XGETTEXT@ +XGETTEXT_015 = @XGETTEXT_015@ +XGETTEXT_EXTRA_OPTIONS = @XGETTEXT_EXTRA_OPTIONS@ +XP = @XP@ +_libcurl_config = @_libcurl_config@ +abs_builddir = @abs_builddir@ +abs_srcdir = @abs_srcdir@ +abs_top_builddir = @abs_top_builddir@ +abs_top_srcdir = @abs_top_srcdir@ +ac_ct_CC = @ac_ct_CC@ +ac_ct_CXX = @ac_ct_CXX@ +am__include = @am__include@ +am__leading_dot = @am__leading_dot@ +am__quote = @am__quote@ +am__tar = @am__tar@ +am__untar = @am__untar@ +bindir = @bindir@ +build = @build@ +build_alias = @build_alias@ +build_cpu = @build_cpu@ +build_os = @build_os@ +build_vendor = @build_vendor@ +builddir = @builddir@ +datadir = @datadir@ +datarootdir = @datarootdir@ +docdir = @docdir@ +dvidir = @dvidir@ +exec_prefix = @exec_prefix@ +host = @host@ +host_alias = @host_alias@ +host_cpu = @host_cpu@ +host_os = @host_os@ +host_vendor = @host_vendor@ +htmldir = @htmldir@ +includedir = @includedir@ +infodir = @infodir@ +install_sh = @install_sh@ +intltool__v_merge_options_ = @intltool__v_merge_options_@ +intltool__v_merge_options_0 = @intltool__v_merge_options_0@ +libdir = @libdir@ +libexecdir = @libexecdir@ +localedir = @localedir@ +localstatedir = @localstatedir@ +mandir = @mandir@ +mkdir_p = @mkdir_p@ +oldincludedir = @oldincludedir@ +pdfdir = @pdfdir@ +prefix = @prefix@ +program_transform_name = @program_transform_name@ +psdir = @psdir@ +runstatedir = @runstatedir@ +sbindir = @sbindir@ +sharedstatedir = @sharedstatedir@ +srcdir = @srcdir@ +sysconfdir = @sysconfdir@ +target = @target@ +target_alias = @target_alias@ +target_cpu = @target_cpu@ +target_os = @target_os@ +target_vendor = @target_vendor@ +top_build_prefix = @top_build_prefix@ +top_builddir = @top_builddir@ +top_srcdir = @top_srcdir@ +SUBDIRS = examples reference +EXTRA_DIST = GPSMAPPER +CLEANFILES = +all: all-recursive + +.SUFFIXES: +$(srcdir)/Makefile.in: $(srcdir)/Makefile.am $(am__configure_deps) + @for dep in $?; do \ + case '$(am__configure_deps)' in \ + *$$dep*) \ + ( cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh ) \ + && { if test -f $@; then exit 0; else break; fi; }; \ + exit 1;; \ + esac; \ + done; \ + echo ' cd $(top_srcdir) && $(AUTOMAKE) --gnu doc/Makefile'; \ + $(am__cd) $(top_srcdir) && \ + $(AUTOMAKE) --gnu doc/Makefile +Makefile: $(srcdir)/Makefile.in $(top_builddir)/config.status + @case '$?' in \ + *config.status*) \ + cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh;; \ + *) \ + echo ' cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__maybe_remake_depfiles)'; \ + cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__maybe_remake_depfiles);; \ + esac; + +$(top_builddir)/config.status: $(top_srcdir)/configure $(CONFIG_STATUS_DEPENDENCIES) + cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh + +$(top_srcdir)/configure: $(am__configure_deps) + cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh +$(ACLOCAL_M4): $(am__aclocal_m4_deps) + cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh +$(am__aclocal_m4_deps): + +# This directory's subdirectories are mostly independent; you can cd +# into them and run 'make' without going through this Makefile. +# To change the values of 'make' variables: instead of editing Makefiles, +# (1) if the variable is set in 'config.status', edit 'config.status' +# (which will cause the Makefiles to be regenerated when you run 'make'); +# (2) otherwise, pass the desired values on the 'make' command line. +$(am__recursive_targets): + @fail=; \ + if $(am__make_keepgoing); then \ + failcom='fail=yes'; \ + else \ + failcom='exit 1'; \ + fi; \ + dot_seen=no; \ + target=`echo $@ | sed s/-recursive//`; \ + case "$@" in \ + distclean-* | maintainer-clean-*) list='$(DIST_SUBDIRS)' ;; \ + *) list='$(SUBDIRS)' ;; \ + esac; \ + for subdir in $$list; do \ + echo "Making $$target in $$subdir"; \ + if test "$$subdir" = "."; then \ + dot_seen=yes; \ + local_target="$$target-am"; \ + else \ + local_target="$$target"; \ + fi; \ + ($(am__cd) $$subdir && $(MAKE) $(AM_MAKEFLAGS) $$local_target) \ + || eval $$failcom; \ + done; \ + if test "$$dot_seen" = "no"; then \ + $(MAKE) $(AM_MAKEFLAGS) "$$target-am" || exit 1; \ + fi; test -z "$$fail" + +ID: $(am__tagged_files) + $(am__define_uniq_tagged_files); mkid -fID $$unique +tags: tags-recursive +TAGS: tags + +tags-am: $(TAGS_DEPENDENCIES) $(am__tagged_files) + set x; \ + here=`pwd`; \ + if ($(ETAGS) --etags-include --version) >/dev/null 2>&1; then \ + include_option=--etags-include; \ + empty_fix=.; \ + else \ + include_option=--include; \ + empty_fix=; \ + fi; \ + list='$(SUBDIRS)'; for subdir in $$list; do \ + if test "$$subdir" = .; then :; else \ + test ! -f $$subdir/TAGS || \ + set "$$@" "$$include_option=$$here/$$subdir/TAGS"; \ + fi; \ + done; \ + $(am__define_uniq_tagged_files); \ + shift; \ + if test -z "$(ETAGS_ARGS)$$*$$unique"; then :; else \ + test -n "$$unique" || unique=$$empty_fix; \ + if test $$# -gt 0; then \ + $(ETAGS) $(ETAGSFLAGS) $(AM_ETAGSFLAGS) $(ETAGS_ARGS) \ + "$$@" $$unique; \ + else \ + $(ETAGS) $(ETAGSFLAGS) $(AM_ETAGSFLAGS) $(ETAGS_ARGS) \ + $$unique; \ + fi; \ + fi +ctags: ctags-recursive + +CTAGS: ctags +ctags-am: $(TAGS_DEPENDENCIES) $(am__tagged_files) + $(am__define_uniq_tagged_files); \ + test -z "$(CTAGS_ARGS)$$unique" \ + || $(CTAGS) $(CTAGSFLAGS) $(AM_CTAGSFLAGS) $(CTAGS_ARGS) \ + $$unique + +GTAGS: + here=`$(am__cd) $(top_builddir) && pwd` \ + && $(am__cd) $(top_srcdir) \ + && gtags -i $(GTAGS_ARGS) "$$here" +cscopelist: cscopelist-recursive + +cscopelist-am: $(am__tagged_files) + list='$(am__tagged_files)'; \ + case "$(srcdir)" in \ + [\\/]* | ?:[\\/]*) sdir="$(srcdir)" ;; \ + *) sdir=$(subdir)/$(srcdir) ;; \ + esac; \ + for i in $$list; do \ + if test -f "$$i"; then \ + echo "$(subdir)/$$i"; \ + else \ + echo "$$sdir/$$i"; \ + fi; \ + done >> $(top_builddir)/cscope.files + +distclean-tags: + -rm -f TAGS ID GTAGS GRTAGS GSYMS GPATH tags + +distdir: $(BUILT_SOURCES) + $(MAKE) $(AM_MAKEFLAGS) distdir-am + +distdir-am: $(DISTFILES) + @srcdirstrip=`echo "$(srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \ + topsrcdirstrip=`echo "$(top_srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \ + list='$(DISTFILES)'; \ + dist_files=`for file in $$list; do echo $$file; done | \ + sed -e "s|^$$srcdirstrip/||;t" \ + -e "s|^$$topsrcdirstrip/|$(top_builddir)/|;t"`; \ + case $$dist_files in \ + */*) $(MKDIR_P) `echo "$$dist_files" | \ + sed '/\//!d;s|^|$(distdir)/|;s,/[^/]*$$,,' | \ + sort -u` ;; \ + esac; \ + for file in $$dist_files; do \ + if test -f $$file || test -d $$file; then d=.; else d=$(srcdir); fi; \ + if test -d $$d/$$file; then \ + dir=`echo "/$$file" | sed -e 's,/[^/]*$$,,'`; \ + if test -d "$(distdir)/$$file"; then \ + find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \ + fi; \ + if test -d $(srcdir)/$$file && test $$d != $(srcdir); then \ + cp -fpR $(srcdir)/$$file "$(distdir)$$dir" || exit 1; \ + find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \ + fi; \ + cp -fpR $$d/$$file "$(distdir)$$dir" || exit 1; \ + else \ + test -f "$(distdir)/$$file" \ + || cp -p $$d/$$file "$(distdir)/$$file" \ + || exit 1; \ + fi; \ + done + @list='$(DIST_SUBDIRS)'; for subdir in $$list; do \ + if test "$$subdir" = .; then :; else \ + $(am__make_dryrun) \ + || test -d "$(distdir)/$$subdir" \ + || $(MKDIR_P) "$(distdir)/$$subdir" \ + || exit 1; \ + dir1=$$subdir; dir2="$(distdir)/$$subdir"; \ + $(am__relativize); \ + new_distdir=$$reldir; \ + dir1=$$subdir; dir2="$(top_distdir)"; \ + $(am__relativize); \ + new_top_distdir=$$reldir; \ + echo " (cd $$subdir && $(MAKE) $(AM_MAKEFLAGS) top_distdir="$$new_top_distdir" distdir="$$new_distdir" \\"; \ + echo " am__remove_distdir=: am__skip_length_check=: am__skip_mode_fix=: distdir)"; \ + ($(am__cd) $$subdir && \ + $(MAKE) $(AM_MAKEFLAGS) \ + top_distdir="$$new_top_distdir" \ + distdir="$$new_distdir" \ + am__remove_distdir=: \ + am__skip_length_check=: \ + am__skip_mode_fix=: \ + distdir) \ + || exit 1; \ + fi; \ + done +check-am: all-am +check: check-recursive +all-am: Makefile +installdirs: installdirs-recursive +installdirs-am: +install: install-recursive +install-exec: install-exec-recursive +install-data: install-data-recursive +uninstall: uninstall-recursive + +install-am: all-am + @$(MAKE) $(AM_MAKEFLAGS) install-exec-am install-data-am + +installcheck: installcheck-recursive +install-strip: + if test -z '$(STRIP)'; then \ + $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \ + install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \ + install; \ + else \ + $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \ + install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \ + "INSTALL_PROGRAM_ENV=STRIPPROG='$(STRIP)'" install; \ + fi +mostlyclean-generic: + +clean-generic: + -test -z "$(CLEANFILES)" || rm -f $(CLEANFILES) + +distclean-generic: + -test -z "$(CONFIG_CLEAN_FILES)" || rm -f $(CONFIG_CLEAN_FILES) + -test . = "$(srcdir)" || test -z "$(CONFIG_CLEAN_VPATH_FILES)" || rm -f $(CONFIG_CLEAN_VPATH_FILES) + +maintainer-clean-generic: + @echo "This command is intended for maintainers to use" + @echo "it deletes files that may require special tools to rebuild." +clean: clean-recursive + +clean-am: clean-generic mostlyclean-am + +distclean: distclean-recursive + -rm -f Makefile +distclean-am: clean-am distclean-generic distclean-tags + +dvi: dvi-recursive + +dvi-am: + +html: html-recursive + +html-am: + +info: info-recursive + +info-am: + +install-data-am: + +install-dvi: install-dvi-recursive + +install-dvi-am: + +install-exec-am: + +install-html: install-html-recursive + +install-html-am: + +install-info: install-info-recursive + +install-info-am: + +install-man: + +install-pdf: install-pdf-recursive + +install-pdf-am: + +install-ps: install-ps-recursive + +install-ps-am: + +installcheck-am: + +maintainer-clean: maintainer-clean-recursive + -rm -f Makefile +maintainer-clean-am: distclean-am maintainer-clean-generic + +mostlyclean: mostlyclean-recursive + +mostlyclean-am: mostlyclean-generic + +pdf: pdf-recursive + +pdf-am: + +ps: ps-recursive + +ps-am: + +uninstall-am: + +.MAKE: $(am__recursive_targets) install-am install-strip + +.PHONY: $(am__recursive_targets) CTAGS GTAGS TAGS all all-am check \ + check-am clean clean-generic cscopelist-am ctags ctags-am \ + distclean distclean-generic distclean-tags distdir dvi dvi-am \ + html html-am info info-am install install-am install-data \ + install-data-am install-dvi install-dvi-am install-exec \ + install-exec-am install-html install-html-am install-info \ + install-info-am install-man install-pdf install-pdf-am \ + install-ps install-ps-am install-strip installcheck \ + installcheck-am installdirs installdirs-am maintainer-clean \ + maintainer-clean-generic mostlyclean mostlyclean-generic pdf \ + pdf-am ps ps-am tags tags-am uninstall uninstall-am + +.PRECIOUS: Makefile + + +# Tell versions [3.59,3.63) of GNU make to not export all variables. +# Otherwise a system limit (for SysV at least) may be exceeded. +.NOEXPORT: diff --git a/doc/examples/Makefile.am b/doc/examples/Makefile.am new file mode 100644 index 0000000..e3db0d6 --- /dev/null +++ b/doc/examples/Makefile.am @@ -0,0 +1 @@ +EXTRA_DIST = maps.xml external_tools.xml goto_tools.xml datasources.xml diff --git a/doc/examples/Makefile.in b/doc/examples/Makefile.in new file mode 100644 index 0000000..fcb5276 --- /dev/null +++ b/doc/examples/Makefile.in @@ -0,0 +1,499 @@ +# Makefile.in generated by automake 1.16.1 from Makefile.am. +# @configure_input@ + +# Copyright (C) 1994-2018 Free Software Foundation, Inc. + +# This Makefile.in is free software; the Free Software Foundation +# gives unlimited permission to copy and/or distribute it, +# with or without modifications, as long as this notice is preserved. + +# This program is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY, to the extent permitted by law; without +# even the implied warranty of MERCHANTABILITY or FITNESS FOR A +# PARTICULAR PURPOSE. + +@SET_MAKE@ +VPATH = @srcdir@ +am__is_gnu_make = { \ + if test -z '$(MAKELEVEL)'; then \ + false; \ + elif test -n '$(MAKE_HOST)'; then \ + true; \ + elif test -n '$(MAKE_VERSION)' && test -n '$(CURDIR)'; then \ + true; \ + else \ + false; \ + fi; \ +} +am__make_running_with_option = \ + case $${target_option-} in \ + ?) ;; \ + *) echo "am__make_running_with_option: internal error: invalid" \ + "target option '$${target_option-}' specified" >&2; \ + exit 1;; \ + esac; \ + has_opt=no; \ + sane_makeflags=$$MAKEFLAGS; \ + if $(am__is_gnu_make); then \ + sane_makeflags=$$MFLAGS; \ + else \ + case $$MAKEFLAGS in \ + *\\[\ \ ]*) \ + bs=\\; \ + sane_makeflags=`printf '%s\n' "$$MAKEFLAGS" \ + | sed "s/$$bs$$bs[$$bs $$bs ]*//g"`;; \ + esac; \ + fi; \ + skip_next=no; \ + strip_trailopt () \ + { \ + flg=`printf '%s\n' "$$flg" | sed "s/$$1.*$$//"`; \ + }; \ + for flg in $$sane_makeflags; do \ + test $$skip_next = yes && { skip_next=no; continue; }; \ + case $$flg in \ + *=*|--*) continue;; \ + -*I) strip_trailopt 'I'; skip_next=yes;; \ + -*I?*) strip_trailopt 'I';; \ + -*O) strip_trailopt 'O'; skip_next=yes;; \ + -*O?*) strip_trailopt 'O';; \ + -*l) strip_trailopt 'l'; skip_next=yes;; \ + -*l?*) strip_trailopt 'l';; \ + -[dEDm]) skip_next=yes;; \ + -[JT]) skip_next=yes;; \ + esac; \ + case $$flg in \ + *$$target_option*) has_opt=yes; break;; \ + esac; \ + done; \ + test $$has_opt = yes +am__make_dryrun = (target_option=n; $(am__make_running_with_option)) +am__make_keepgoing = (target_option=k; $(am__make_running_with_option)) +pkgdatadir = $(datadir)/@PACKAGE@ +pkgincludedir = $(includedir)/@PACKAGE@ +pkglibdir = $(libdir)/@PACKAGE@ +pkglibexecdir = $(libexecdir)/@PACKAGE@ +am__cd = CDPATH="$${ZSH_VERSION+.}$(PATH_SEPARATOR)" && cd +install_sh_DATA = $(install_sh) -c -m 644 +install_sh_PROGRAM = $(install_sh) -c +install_sh_SCRIPT = $(install_sh) -c +INSTALL_HEADER = $(INSTALL_DATA) +transform = $(program_transform_name) +NORMAL_INSTALL = : +PRE_INSTALL = : +POST_INSTALL = : +NORMAL_UNINSTALL = : +PRE_UNINSTALL = : +POST_UNINSTALL = : +build_triplet = @build@ +host_triplet = @host@ +target_triplet = @target@ +subdir = doc/examples +ACLOCAL_M4 = $(top_srcdir)/aclocal.m4 +am__aclocal_m4_deps = $(top_srcdir)/m4/expat.m4 \ + $(top_srcdir)/m4/gettext.m4 $(top_srcdir)/m4/iconv.m4 \ + $(top_srcdir)/m4/intlmacosx.m4 $(top_srcdir)/m4/lib-ld.m4 \ + $(top_srcdir)/m4/lib-link.m4 $(top_srcdir)/m4/lib-prefix.m4 \ + $(top_srcdir)/m4/libcurl.m4 $(top_srcdir)/m4/nls.m4 \ + $(top_srcdir)/m4/po.m4 $(top_srcdir)/m4/progtest.m4 \ + $(top_srcdir)/configure.ac +am__configure_deps = $(am__aclocal_m4_deps) $(CONFIGURE_DEPENDENCIES) \ + $(ACLOCAL_M4) +DIST_COMMON = $(srcdir)/Makefile.am $(am__DIST_COMMON) +mkinstalldirs = $(SHELL) $(top_srcdir)/mkinstalldirs +CONFIG_HEADER = $(top_builddir)/src/config.h +CONFIG_CLEAN_FILES = +CONFIG_CLEAN_VPATH_FILES = +AM_V_P = $(am__v_P_@AM_V@) +am__v_P_ = $(am__v_P_@AM_DEFAULT_V@) +am__v_P_0 = false +am__v_P_1 = : +AM_V_GEN = $(am__v_GEN_@AM_V@) +am__v_GEN_ = $(am__v_GEN_@AM_DEFAULT_V@) +am__v_GEN_0 = @echo " GEN " $@; +am__v_GEN_1 = +AM_V_at = $(am__v_at_@AM_V@) +am__v_at_ = $(am__v_at_@AM_DEFAULT_V@) +am__v_at_0 = @ +am__v_at_1 = +SOURCES = +DIST_SOURCES = +am__can_run_installinfo = \ + case $$AM_UPDATE_INFO_DIR in \ + n|no|NO) false;; \ + *) (install-info --version) >/dev/null 2>&1;; \ + esac +am__tagged_files = $(HEADERS) $(SOURCES) $(TAGS_FILES) $(LISP) +am__DIST_COMMON = $(srcdir)/Makefile.in $(top_srcdir)/mkinstalldirs +DISTFILES = $(DIST_COMMON) $(DIST_SOURCES) $(TEXINFOS) $(EXTRA_DIST) +ACLOCAL = @ACLOCAL@ +ACLOCAL_AMFLAGS = @ACLOCAL_AMFLAGS@ +ALL_LINGUAS = @ALL_LINGUAS@ +AMTAR = @AMTAR@ +AM_DEFAULT_VERBOSITY = @AM_DEFAULT_VERBOSITY@ +AUTOCONF = @AUTOCONF@ +AUTOHEADER = @AUTOHEADER@ +AUTOMAKE = @AUTOMAKE@ +AWK = @AWK@ +CATALOGS = @CATALOGS@ +CATOBJEXT = @CATOBJEXT@ +CC = @CC@ +CCDEPMODE = @CCDEPMODE@ +CFLAGS = @CFLAGS@ +CONFIG_STATUS_DEPENDENCIES = @CONFIG_STATUS_DEPENDENCIES@ +CPP = @CPP@ +CPPFLAGS = @CPPFLAGS@ +CXX = @CXX@ +CXXCPP = @CXXCPP@ +CXXDEPMODE = @CXXDEPMODE@ +CXXFLAGS = @CXXFLAGS@ +CYGPATH_W = @CYGPATH_W@ +DATADIRNAME = @DATADIRNAME@ +DB2MAN_XSL = @DB2MAN_XSL@ +DEFS = @DEFS@ +DEPDIR = @DEPDIR@ +DISTCHECK_CONFIGURE_FLAGS = @DISTCHECK_CONFIGURE_FLAGS@ +DOC_USER_FORMATS = @DOC_USER_FORMATS@ +ECHO_C = @ECHO_C@ +ECHO_N = @ECHO_N@ +ECHO_T = @ECHO_T@ +EGREP = @EGREP@ +EXEEXT = @EXEEXT@ +EXPAT_CFLAGS = @EXPAT_CFLAGS@ +EXPAT_LIBS = @EXPAT_LIBS@ +GDK_PIXBUF_CSOURCE = @GDK_PIXBUF_CSOURCE@ +GETTEXT_MACRO_VERSION = @GETTEXT_MACRO_VERSION@ +GETTEXT_PACKAGE = @GETTEXT_PACKAGE@ +GLIB_MKENUMS = @GLIB_MKENUMS@ +GMOFILES = @GMOFILES@ +GMSGFMT = @GMSGFMT@ +GMSGFMT_015 = @GMSGFMT_015@ +GREP = @GREP@ +GTKDOC_CHECK = @GTKDOC_CHECK@ +GTKDOC_CHECK_PATH = @GTKDOC_CHECK_PATH@ +GTKDOC_DEPS_CFLAGS = @GTKDOC_DEPS_CFLAGS@ +GTKDOC_DEPS_LIBS = @GTKDOC_DEPS_LIBS@ +GTKDOC_MKPDF = @GTKDOC_MKPDF@ +GTKDOC_REBASE = @GTKDOC_REBASE@ +HAVE_SCROLLKEEPER = @HAVE_SCROLLKEEPER@ +HELP_DIR = @HELP_DIR@ +HTML_DIR = @HTML_DIR@ +INSTALL = @INSTALL@ +INSTALL_DATA = @INSTALL_DATA@ +INSTALL_PROGRAM = @INSTALL_PROGRAM@ +INSTALL_SCRIPT = @INSTALL_SCRIPT@ +INSTALL_STRIP_PROGRAM = @INSTALL_STRIP_PROGRAM@ +INSTOBJEXT = @INSTOBJEXT@ +INTLLIBS = @INTLLIBS@ +INTLTOOL_EXTRACT = @INTLTOOL_EXTRACT@ +INTLTOOL_MERGE = @INTLTOOL_MERGE@ +INTLTOOL_PERL = @INTLTOOL_PERL@ +INTLTOOL_UPDATE = @INTLTOOL_UPDATE@ +INTLTOOL_V_MERGE = @INTLTOOL_V_MERGE@ +INTLTOOL_V_MERGE_OPTIONS = @INTLTOOL_V_MERGE_OPTIONS@ +INTLTOOL__v_MERGE_ = @INTLTOOL__v_MERGE_@ +INTLTOOL__v_MERGE_0 = @INTLTOOL__v_MERGE_0@ +INTL_MACOSX_LIBS = @INTL_MACOSX_LIBS@ +ISODATE = @ISODATE@ +LDFLAGS = @LDFLAGS@ +LIBCURL = @LIBCURL@ +LIBCURL_CPPFLAGS = @LIBCURL_CPPFLAGS@ +LIBGEOCLUE_CFLAGS = @LIBGEOCLUE_CFLAGS@ +LIBGEOCLUE_LIBS = @LIBGEOCLUE_LIBS@ +LIBICONV = @LIBICONV@ +LIBINTL = @LIBINTL@ +LIBOBJS = @LIBOBJS@ +LIBS = @LIBS@ +LIBZIP_CFLAGS = @LIBZIP_CFLAGS@ +LIBZIP_LIBS = @LIBZIP_LIBS@ +LN_S = @LN_S@ +LTLIBICONV = @LTLIBICONV@ +LTLIBINTL = @LTLIBINTL@ +LTLIBOBJS = @LTLIBOBJS@ +MAKEINFO = @MAKEINFO@ +MKDIR_P = @MKDIR_P@ +MKINSTALLDIRS = @MKINSTALLDIRS@ +MSGFMT = @MSGFMT@ +MSGFMT_015 = @MSGFMT_015@ +MSGFMT_OPTS = @MSGFMT_OPTS@ +MSGMERGE = @MSGMERGE@ +OBJEXT = @OBJEXT@ +OMF_DIR = @OMF_DIR@ +PACKAGE = @PACKAGE@ +PACKAGE_BUGREPORT = @PACKAGE_BUGREPORT@ +PACKAGE_CFLAGS = @PACKAGE_CFLAGS@ +PACKAGE_LIBS = @PACKAGE_LIBS@ +PACKAGE_NAME = @PACKAGE_NAME@ +PACKAGE_STRING = @PACKAGE_STRING@ +PACKAGE_TARNAME = @PACKAGE_TARNAME@ +PACKAGE_URL = @PACKAGE_URL@ +PACKAGE_VERSION = @PACKAGE_VERSION@ +PATH_SEPARATOR = @PATH_SEPARATOR@ +PKG_CONFIG = @PKG_CONFIG@ +PKG_CONFIG_LIBDIR = @PKG_CONFIG_LIBDIR@ +PKG_CONFIG_PATH = @PKG_CONFIG_PATH@ +POFILES = @POFILES@ +POSUB = @POSUB@ +PO_IN_DATADIR_FALSE = @PO_IN_DATADIR_FALSE@ +PO_IN_DATADIR_TRUE = @PO_IN_DATADIR_TRUE@ +RANLIB = @RANLIB@ +SET_MAKE = @SET_MAKE@ +SHELL = @SHELL@ +STRIP = @STRIP@ +USE_NLS = @USE_NLS@ +VERSION = @VERSION@ +XGETTEXT = @XGETTEXT@ +XGETTEXT_015 = @XGETTEXT_015@ +XGETTEXT_EXTRA_OPTIONS = @XGETTEXT_EXTRA_OPTIONS@ +XP = @XP@ +_libcurl_config = @_libcurl_config@ +abs_builddir = @abs_builddir@ +abs_srcdir = @abs_srcdir@ +abs_top_builddir = @abs_top_builddir@ +abs_top_srcdir = @abs_top_srcdir@ +ac_ct_CC = @ac_ct_CC@ +ac_ct_CXX = @ac_ct_CXX@ +am__include = @am__include@ +am__leading_dot = @am__leading_dot@ +am__quote = @am__quote@ +am__tar = @am__tar@ +am__untar = @am__untar@ +bindir = @bindir@ +build = @build@ +build_alias = @build_alias@ +build_cpu = @build_cpu@ +build_os = @build_os@ +build_vendor = @build_vendor@ +builddir = @builddir@ +datadir = @datadir@ +datarootdir = @datarootdir@ +docdir = @docdir@ +dvidir = @dvidir@ +exec_prefix = @exec_prefix@ +host = @host@ +host_alias = @host_alias@ +host_cpu = @host_cpu@ +host_os = @host_os@ +host_vendor = @host_vendor@ +htmldir = @htmldir@ +includedir = @includedir@ +infodir = @infodir@ +install_sh = @install_sh@ +intltool__v_merge_options_ = @intltool__v_merge_options_@ +intltool__v_merge_options_0 = @intltool__v_merge_options_0@ +libdir = @libdir@ +libexecdir = @libexecdir@ +localedir = @localedir@ +localstatedir = @localstatedir@ +mandir = @mandir@ +mkdir_p = @mkdir_p@ +oldincludedir = @oldincludedir@ +pdfdir = @pdfdir@ +prefix = @prefix@ +program_transform_name = @program_transform_name@ +psdir = @psdir@ +runstatedir = @runstatedir@ +sbindir = @sbindir@ +sharedstatedir = @sharedstatedir@ +srcdir = @srcdir@ +sysconfdir = @sysconfdir@ +target = @target@ +target_alias = @target_alias@ +target_cpu = @target_cpu@ +target_os = @target_os@ +target_vendor = @target_vendor@ +top_build_prefix = @top_build_prefix@ +top_builddir = @top_builddir@ +top_srcdir = @top_srcdir@ +EXTRA_DIST = maps.xml external_tools.xml goto_tools.xml datasources.xml +all: all-am + +.SUFFIXES: +$(srcdir)/Makefile.in: $(srcdir)/Makefile.am $(am__configure_deps) + @for dep in $?; do \ + case '$(am__configure_deps)' in \ + *$$dep*) \ + ( cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh ) \ + && { if test -f $@; then exit 0; else break; fi; }; \ + exit 1;; \ + esac; \ + done; \ + echo ' cd $(top_srcdir) && $(AUTOMAKE) --gnu doc/examples/Makefile'; \ + $(am__cd) $(top_srcdir) && \ + $(AUTOMAKE) --gnu doc/examples/Makefile +Makefile: $(srcdir)/Makefile.in $(top_builddir)/config.status + @case '$?' in \ + *config.status*) \ + cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh;; \ + *) \ + echo ' cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__maybe_remake_depfiles)'; \ + cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__maybe_remake_depfiles);; \ + esac; + +$(top_builddir)/config.status: $(top_srcdir)/configure $(CONFIG_STATUS_DEPENDENCIES) + cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh + +$(top_srcdir)/configure: $(am__configure_deps) + cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh +$(ACLOCAL_M4): $(am__aclocal_m4_deps) + cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh +$(am__aclocal_m4_deps): +tags TAGS: + +ctags CTAGS: + +cscope cscopelist: + + +distdir: $(BUILT_SOURCES) + $(MAKE) $(AM_MAKEFLAGS) distdir-am + +distdir-am: $(DISTFILES) + @srcdirstrip=`echo "$(srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \ + topsrcdirstrip=`echo "$(top_srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \ + list='$(DISTFILES)'; \ + dist_files=`for file in $$list; do echo $$file; done | \ + sed -e "s|^$$srcdirstrip/||;t" \ + -e "s|^$$topsrcdirstrip/|$(top_builddir)/|;t"`; \ + case $$dist_files in \ + */*) $(MKDIR_P) `echo "$$dist_files" | \ + sed '/\//!d;s|^|$(distdir)/|;s,/[^/]*$$,,' | \ + sort -u` ;; \ + esac; \ + for file in $$dist_files; do \ + if test -f $$file || test -d $$file; then d=.; else d=$(srcdir); fi; \ + if test -d $$d/$$file; then \ + dir=`echo "/$$file" | sed -e 's,/[^/]*$$,,'`; \ + if test -d "$(distdir)/$$file"; then \ + find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \ + fi; \ + if test -d $(srcdir)/$$file && test $$d != $(srcdir); then \ + cp -fpR $(srcdir)/$$file "$(distdir)$$dir" || exit 1; \ + find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \ + fi; \ + cp -fpR $$d/$$file "$(distdir)$$dir" || exit 1; \ + else \ + test -f "$(distdir)/$$file" \ + || cp -p $$d/$$file "$(distdir)/$$file" \ + || exit 1; \ + fi; \ + done +check-am: all-am +check: check-am +all-am: Makefile +installdirs: +install: install-am +install-exec: install-exec-am +install-data: install-data-am +uninstall: uninstall-am + +install-am: all-am + @$(MAKE) $(AM_MAKEFLAGS) install-exec-am install-data-am + +installcheck: installcheck-am +install-strip: + if test -z '$(STRIP)'; then \ + $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \ + install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \ + install; \ + else \ + $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \ + install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \ + "INSTALL_PROGRAM_ENV=STRIPPROG='$(STRIP)'" install; \ + fi +mostlyclean-generic: + +clean-generic: + +distclean-generic: + -test -z "$(CONFIG_CLEAN_FILES)" || rm -f $(CONFIG_CLEAN_FILES) + -test . = "$(srcdir)" || test -z "$(CONFIG_CLEAN_VPATH_FILES)" || rm -f $(CONFIG_CLEAN_VPATH_FILES) + +maintainer-clean-generic: + @echo "This command is intended for maintainers to use" + @echo "it deletes files that may require special tools to rebuild." +clean: clean-am + +clean-am: clean-generic mostlyclean-am + +distclean: distclean-am + -rm -f Makefile +distclean-am: clean-am distclean-generic + +dvi: dvi-am + +dvi-am: + +html: html-am + +html-am: + +info: info-am + +info-am: + +install-data-am: + +install-dvi: install-dvi-am + +install-dvi-am: + +install-exec-am: + +install-html: install-html-am + +install-html-am: + +install-info: install-info-am + +install-info-am: + +install-man: + +install-pdf: install-pdf-am + +install-pdf-am: + +install-ps: install-ps-am + +install-ps-am: + +installcheck-am: + +maintainer-clean: maintainer-clean-am + -rm -f Makefile +maintainer-clean-am: distclean-am maintainer-clean-generic + +mostlyclean: mostlyclean-am + +mostlyclean-am: mostlyclean-generic + +pdf: pdf-am + +pdf-am: + +ps: ps-am + +ps-am: + +uninstall-am: + +.MAKE: install-am install-strip + +.PHONY: all all-am check check-am clean clean-generic cscopelist-am \ + ctags-am distclean distclean-generic distdir dvi dvi-am html \ + html-am info info-am install install-am install-data \ + install-data-am install-dvi install-dvi-am install-exec \ + install-exec-am install-html install-html-am install-info \ + install-info-am install-man install-pdf install-pdf-am \ + install-ps install-ps-am install-strip installcheck \ + installcheck-am installdirs maintainer-clean \ + maintainer-clean-generic mostlyclean mostlyclean-generic pdf \ + pdf-am ps ps-am tags-am uninstall uninstall-am + +.PRECIOUS: Makefile + + +# Tell versions [3.59,3.63) of GNU make to not export all variables. +# Otherwise a system limit (for SysV at least) may be exceeded. +.NOEXPORT: diff --git a/doc/examples/datasources.xml b/doc/examples/datasources.xml new file mode 100644 index 0000000..a32de84 --- /dev/null +++ b/doc/examples/datasources.xml @@ -0,0 +1,53 @@ + + + OpenStreetBugs + LRBT + + + + + + + + + + + + + http://openstreetbugs.schokokeks.org/api/0.1/getGPX?l=%s&r=%s&b=%s&t=%s&open=only_open_bugs + + + + + OpenStreetMap Notes + LBRT + + http://api.openstreetmap.org/api/0.6/notes.gpx?bbox=%s,%s,%s,%s&closed=0 + + + PostBoxes + AO + + robert.mathmos.net/osm/postboxes/2/mapdata.cgi?lat=%s&lon=%s&output=gpx + + + + OpenPlaques + TLBR + http://openplaques.org/plaques.kml?box=[%s,%s],[%s,%s] + kml + + + + + + + OpenStreetMap Amenity + BLTRS + -x nuketypes,routes,tracks + Amenity Search + osm + http://overpass-api.de/api/interpreter?data=[bbox:%s,%s,%s,%s];(node[amenity="%5$s"];way[amenity="%5$s"];);out%%20center; + + + diff --git a/doc/examples/external_tools.xml b/doc/examples/external_tools.xml new file mode 100644 index 0000000..0d05752 --- /dev/null +++ b/doc/examples/external_tools.xml @@ -0,0 +1,31 @@ + + + + + NLS: Historic Map of GB + http://nls.tileserver.com?lat=%s&lng=%s&zoom=%d + + + + + Local port 8111 (eg JOSM) + http://localhost:8111/load_and_zoom?left=%s&right=%s&bottom=%s&top=%s + + + + + + + + + + + diff --git a/doc/examples/goto_tools.xml b/doc/examples/goto_tools.xml new file mode 100644 index 0000000..aded2b6 --- /dev/null +++ b/doc/examples/goto_tools.xml @@ -0,0 +1,26 @@ + + + + + Geonames + http://ws.geonames.org/search?q=%s&maxRows=1&lang=es&style=short + /geonames/geoname/lat + /geonames/geoname/lng + + + + Name finder + http://gazetteer.openstreetmap.org/namefinder/search.xml?find=%s&max=1 + /searchresults/named + lat + /searchresults/named + lon + + + + Nominatim + http://nominatim.openstreetmap.org/search?q=%s&format=xml + /searchresults/place@lat + /searchresults/place@lon + + diff --git a/doc/examples/maps.xml b/doc/examples/maps.xml new file mode 100644 index 0000000..210bd4d --- /dev/null +++ b/doc/examples/maps.xml @@ -0,0 +1,81 @@ + + + + + OpenStreetMap (Mapnik) + tile.openstreetmap.org + /%d/%d/%d.png + 0 + 19 + 13 + OSM-Mapnik + © OpenStreetMap contributors + CC-BY-SA + http://www.openstreetmap.org/copyright + .png + + + + + + + + 60 + ArcGIS + ArcGIS World Street Map + services.arcgisonline.com + /ArcGIS/rest/services/World_Street_Map/MapServer/tile/%d/%d/%d + TRUE + Sources: Esri, DeLorme, NAVTEQ, USGS, Intermap, iPC, NRCAN, Esri Japan, METI, Esri China (Hong Kong), Esri (Thailand), TomTom, 2013 + ArcGIS Specific + http://services.arcgisonline.com/ArcGIS/rest/services/World_Street_Map/MapServer + + + + + + OS NPE + ooc.openstreetmap.org + /npe/%d/%d/%d.png + 245 + NPE + .png + 7 + 18 + 49.8 + 55.8 + -5.8 + 1.9 + + + + + 193 + OSMANDHD + OSMAND HD + https://tile.osmand.net/hd/%d/%d/%d.png + 2 + © OpenStreetMap contributors + CC-BY-SA + http://www.openstreetmap.org/copyright + + + diff --git a/doc/reference/Makefile.am b/doc/reference/Makefile.am new file mode 100644 index 0000000..a03bc9b --- /dev/null +++ b/doc/reference/Makefile.am @@ -0,0 +1,88 @@ +## Process this file with automake to produce Makefile.in + +# We require automake 1.6 at least. +AUTOMAKE_OPTIONS = 1.6 + +# This is a blank Makefile.am for using gtk-doc. +# Copy this to your project's API docs directory and modify the variables to +# suit your project. See the GTK+ Makefiles in gtk+/docs/reference for examples +# of using the various options. + +# The name of the module, e.g. 'glib'. +DOC_MODULE=viking + +# The top-level SGML file. You can change this if you want to. +DOC_MAIN_SGML_FILE=$(DOC_MODULE)-docs.sgml + +# The directory containing the source code. Relative to $(srcdir). +# gtk-doc will search all .c & .h files beneath here for inline comments +# documenting the functions and macros. +# e.g. DOC_SOURCE_DIR=../../../gtk +DOC_SOURCE_DIR=../../src + +# Extra options to pass to gtkdoc-scangobj. Not normally needed. +SCANGOBJ_OPTIONS= + +# Extra options to supply to gtkdoc-scan. +# e.g. SCAN_OPTIONS=--deprecated-guards="GTK_DISABLE_DEPRECATED" +SCAN_OPTIONS=--rebuild-types + +# Extra options to supply to gtkdoc-mkdb. +# e.g. MKDB_OPTIONS=--sgml-mode --output-format=xml +MKDB_OPTIONS=--sgml-mode --output-format=xml + +# Extra options to supply to gtkdoc-mktmpl +# e.g. MKTMPL_OPTIONS=--only-section-tmpl +MKTMPL_OPTIONS= + +# Extra options to supply to gtkdoc-fixref. Not normally needed. +# e.g. FIXXREF_OPTIONS=--extra-dir=../gdk-pixbuf/html --extra-dir=../gdk/html +FIXXREF_OPTIONS= + +# Used for dependencies. The docs will be rebuilt if any of these change. +# e.g. HFILE_GLOB=$(top_srcdir)/gtk/*.h +# e.g. CFILE_GLOB=$(top_srcdir)/gtk/*.c +HFILE_GLOB= +CFILE_GLOB= + +# Header files to ignore when scanning. +# e.g. IGNORE_HFILES=gtkdebug.h gtkintl.h +IGNORE_HFILES=terraserver.h terraservermapsource.h + +# Images to copy into HTML directory. +# e.g. HTML_IMAGES=$(top_srcdir)/gtk/stock-icons/stock_about_24.png +HTML_IMAGES= + +# Extra SGML files that are included by $(DOC_MAIN_SGML_FILE). +# e.g. content_files=running.sgml building.sgml changes-2.0.sgml +content_files= + +# SGML files where gtk-doc abbrevations (#GtkWidget) are expanded +# These files must be listed here *and* in content_files +# e.g. expand_content_files=running.sgml +expand_content_files= + +# CFLAGS and LDFLAGS for compiling gtkdoc-scangobj with your library. +# Only needed if you are using gtkdoc-scangobj to dynamically query widget +# signals and properties. +# e.g. INCLUDES=-I$(top_srcdir) -I$(top_builddir) $(GTK_DEBUG_FLAGS) +# e.g. GTKDOC_LIBS=$(top_builddir)/gtk/$(gtktargetlib) +INCLUDES = @PACKAGE_CFLAGS@ @EXPAT_CFLAGS@ @LIBCURL_CPPFLAGS@ +GTKDOC_LIBS = -L$(top_srcdir)/src -lviking -L$(top_srcdir)/src/icons -licons @PACKAGE_LIBS@ @EXPAT_LIBS@ @LIBCURL@ $(LIBS) + +# This includes the standard gtk-doc make rules, copied by gtkdocize. +if ENABLE_GTK_DOC +include $(top_srcdir)/gtk-doc.make +endif + +# Other files to distribute +# e.g. EXTRA_DIST += version.xml.in + +# Files not to distribute +# for --rebuild-types in $(SCAN_OPTIONS), e.g. $(DOC_MODULE).types +# for --rebuild-sections in $(SCAN_OPTIONS) e.g. $(DOC_MODULE)-sections.txt +#DISTCLEANFILES += + +# Comment this out if you want your docs-status tested during 'make check' +#TESTS = $(GTKDOC_CHECK) + diff --git a/doc/reference/Makefile.in b/doc/reference/Makefile.in new file mode 100644 index 0000000..c867c1b --- /dev/null +++ b/doc/reference/Makefile.in @@ -0,0 +1,894 @@ +# Makefile.in generated by automake 1.16.1 from Makefile.am. +# @configure_input@ + +# Copyright (C) 1994-2018 Free Software Foundation, Inc. + +# This Makefile.in is free software; the Free Software Foundation +# gives unlimited permission to copy and/or distribute it, +# with or without modifications, as long as this notice is preserved. + +# This program is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY, to the extent permitted by law; without +# even the implied warranty of MERCHANTABILITY or FITNESS FOR A +# PARTICULAR PURPOSE. + +@SET_MAKE@ + +# -*- mode: makefile -*- +# +# gtk-doc.make - make rules for gtk-doc +# Copyright (C) 2003 James Henstridge +# 2004-2007 Damon Chaplin +# 2007-2017 Stefan Sauer +# +# 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 3 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, see . + +#################################### +# Everything below here is generic # +#################################### +VPATH = @srcdir@ +am__is_gnu_make = { \ + if test -z '$(MAKELEVEL)'; then \ + false; \ + elif test -n '$(MAKE_HOST)'; then \ + true; \ + elif test -n '$(MAKE_VERSION)' && test -n '$(CURDIR)'; then \ + true; \ + else \ + false; \ + fi; \ +} +am__make_running_with_option = \ + case $${target_option-} in \ + ?) ;; \ + *) echo "am__make_running_with_option: internal error: invalid" \ + "target option '$${target_option-}' specified" >&2; \ + exit 1;; \ + esac; \ + has_opt=no; \ + sane_makeflags=$$MAKEFLAGS; \ + if $(am__is_gnu_make); then \ + sane_makeflags=$$MFLAGS; \ + else \ + case $$MAKEFLAGS in \ + *\\[\ \ ]*) \ + bs=\\; \ + sane_makeflags=`printf '%s\n' "$$MAKEFLAGS" \ + | sed "s/$$bs$$bs[$$bs $$bs ]*//g"`;; \ + esac; \ + fi; \ + skip_next=no; \ + strip_trailopt () \ + { \ + flg=`printf '%s\n' "$$flg" | sed "s/$$1.*$$//"`; \ + }; \ + for flg in $$sane_makeflags; do \ + test $$skip_next = yes && { skip_next=no; continue; }; \ + case $$flg in \ + *=*|--*) continue;; \ + -*I) strip_trailopt 'I'; skip_next=yes;; \ + -*I?*) strip_trailopt 'I';; \ + -*O) strip_trailopt 'O'; skip_next=yes;; \ + -*O?*) strip_trailopt 'O';; \ + -*l) strip_trailopt 'l'; skip_next=yes;; \ + -*l?*) strip_trailopt 'l';; \ + -[dEDm]) skip_next=yes;; \ + -[JT]) skip_next=yes;; \ + esac; \ + case $$flg in \ + *$$target_option*) has_opt=yes; break;; \ + esac; \ + done; \ + test $$has_opt = yes +am__make_dryrun = (target_option=n; $(am__make_running_with_option)) +am__make_keepgoing = (target_option=k; $(am__make_running_with_option)) +pkgdatadir = $(datadir)/@PACKAGE@ +pkgincludedir = $(includedir)/@PACKAGE@ +pkglibdir = $(libdir)/@PACKAGE@ +pkglibexecdir = $(libexecdir)/@PACKAGE@ +am__cd = CDPATH="$${ZSH_VERSION+.}$(PATH_SEPARATOR)" && cd +install_sh_DATA = $(install_sh) -c -m 644 +install_sh_PROGRAM = $(install_sh) -c +install_sh_SCRIPT = $(install_sh) -c +INSTALL_HEADER = $(INSTALL_DATA) +transform = $(program_transform_name) +NORMAL_INSTALL = : +PRE_INSTALL = : +POST_INSTALL = : +NORMAL_UNINSTALL = : +PRE_UNINSTALL = : +POST_UNINSTALL = : +build_triplet = @build@ +host_triplet = @host@ +target_triplet = @target@ +subdir = doc/reference +ACLOCAL_M4 = $(top_srcdir)/aclocal.m4 +am__aclocal_m4_deps = $(top_srcdir)/m4/expat.m4 \ + $(top_srcdir)/m4/gettext.m4 $(top_srcdir)/m4/iconv.m4 \ + $(top_srcdir)/m4/intlmacosx.m4 $(top_srcdir)/m4/lib-ld.m4 \ + $(top_srcdir)/m4/lib-link.m4 $(top_srcdir)/m4/lib-prefix.m4 \ + $(top_srcdir)/m4/libcurl.m4 $(top_srcdir)/m4/nls.m4 \ + $(top_srcdir)/m4/po.m4 $(top_srcdir)/m4/progtest.m4 \ + $(top_srcdir)/configure.ac +am__configure_deps = $(am__aclocal_m4_deps) $(CONFIGURE_DEPENDENCIES) \ + $(ACLOCAL_M4) +DIST_COMMON = $(srcdir)/Makefile.am $(am__DIST_COMMON) +mkinstalldirs = $(SHELL) $(top_srcdir)/mkinstalldirs +CONFIG_HEADER = $(top_builddir)/src/config.h +CONFIG_CLEAN_FILES = +CONFIG_CLEAN_VPATH_FILES = +AM_V_P = $(am__v_P_@AM_V@) +am__v_P_ = $(am__v_P_@AM_DEFAULT_V@) +am__v_P_0 = false +am__v_P_1 = : +AM_V_GEN = $(am__v_GEN_@AM_V@) +am__v_GEN_ = $(am__v_GEN_@AM_DEFAULT_V@) +am__v_GEN_0 = @echo " GEN " $@; +am__v_GEN_1 = +AM_V_at = $(am__v_at_@AM_V@) +am__v_at_ = $(am__v_at_@AM_DEFAULT_V@) +am__v_at_0 = @ +am__v_at_1 = +SOURCES = +DIST_SOURCES = +am__can_run_installinfo = \ + case $$AM_UPDATE_INFO_DIR in \ + n|no|NO) false;; \ + *) (install-info --version) >/dev/null 2>&1;; \ + esac +am__tagged_files = $(HEADERS) $(SOURCES) $(TAGS_FILES) $(LISP) +am__DIST_COMMON = $(srcdir)/Makefile.in $(top_srcdir)/gtk-doc.make \ + $(top_srcdir)/mkinstalldirs README +DISTFILES = $(DIST_COMMON) $(DIST_SOURCES) $(TEXINFOS) $(EXTRA_DIST) +ACLOCAL = @ACLOCAL@ +ACLOCAL_AMFLAGS = @ACLOCAL_AMFLAGS@ +ALL_LINGUAS = @ALL_LINGUAS@ +AMTAR = @AMTAR@ +AM_DEFAULT_VERBOSITY = @AM_DEFAULT_VERBOSITY@ +AUTOCONF = @AUTOCONF@ +AUTOHEADER = @AUTOHEADER@ +AUTOMAKE = @AUTOMAKE@ +AWK = @AWK@ +CATALOGS = @CATALOGS@ +CATOBJEXT = @CATOBJEXT@ +CC = @CC@ +CCDEPMODE = @CCDEPMODE@ +CFLAGS = @CFLAGS@ +CONFIG_STATUS_DEPENDENCIES = @CONFIG_STATUS_DEPENDENCIES@ +CPP = @CPP@ +CPPFLAGS = @CPPFLAGS@ +CXX = @CXX@ +CXXCPP = @CXXCPP@ +CXXDEPMODE = @CXXDEPMODE@ +CXXFLAGS = @CXXFLAGS@ +CYGPATH_W = @CYGPATH_W@ +DATADIRNAME = @DATADIRNAME@ +DB2MAN_XSL = @DB2MAN_XSL@ +DEFS = @DEFS@ +DEPDIR = @DEPDIR@ +DISTCHECK_CONFIGURE_FLAGS = @DISTCHECK_CONFIGURE_FLAGS@ +DOC_USER_FORMATS = @DOC_USER_FORMATS@ +ECHO_C = @ECHO_C@ +ECHO_N = @ECHO_N@ +ECHO_T = @ECHO_T@ +EGREP = @EGREP@ +EXEEXT = @EXEEXT@ +EXPAT_CFLAGS = @EXPAT_CFLAGS@ +EXPAT_LIBS = @EXPAT_LIBS@ +GDK_PIXBUF_CSOURCE = @GDK_PIXBUF_CSOURCE@ +GETTEXT_MACRO_VERSION = @GETTEXT_MACRO_VERSION@ +GETTEXT_PACKAGE = @GETTEXT_PACKAGE@ +GLIB_MKENUMS = @GLIB_MKENUMS@ +GMOFILES = @GMOFILES@ +GMSGFMT = @GMSGFMT@ +GMSGFMT_015 = @GMSGFMT_015@ +GREP = @GREP@ +GTKDOC_CHECK = @GTKDOC_CHECK@ +GTKDOC_CHECK_PATH = @GTKDOC_CHECK_PATH@ +GTKDOC_DEPS_CFLAGS = @GTKDOC_DEPS_CFLAGS@ +GTKDOC_DEPS_LIBS = @GTKDOC_DEPS_LIBS@ +GTKDOC_MKPDF = @GTKDOC_MKPDF@ +GTKDOC_REBASE = @GTKDOC_REBASE@ +HAVE_SCROLLKEEPER = @HAVE_SCROLLKEEPER@ +HELP_DIR = @HELP_DIR@ +HTML_DIR = @HTML_DIR@ +INSTALL = @INSTALL@ +INSTALL_DATA = @INSTALL_DATA@ +INSTALL_PROGRAM = @INSTALL_PROGRAM@ +INSTALL_SCRIPT = @INSTALL_SCRIPT@ +INSTALL_STRIP_PROGRAM = @INSTALL_STRIP_PROGRAM@ +INSTOBJEXT = @INSTOBJEXT@ +INTLLIBS = @INTLLIBS@ +INTLTOOL_EXTRACT = @INTLTOOL_EXTRACT@ +INTLTOOL_MERGE = @INTLTOOL_MERGE@ +INTLTOOL_PERL = @INTLTOOL_PERL@ +INTLTOOL_UPDATE = @INTLTOOL_UPDATE@ +INTLTOOL_V_MERGE = @INTLTOOL_V_MERGE@ +INTLTOOL_V_MERGE_OPTIONS = @INTLTOOL_V_MERGE_OPTIONS@ +INTLTOOL__v_MERGE_ = @INTLTOOL__v_MERGE_@ +INTLTOOL__v_MERGE_0 = @INTLTOOL__v_MERGE_0@ +INTL_MACOSX_LIBS = @INTL_MACOSX_LIBS@ +ISODATE = @ISODATE@ +LDFLAGS = @LDFLAGS@ +LIBCURL = @LIBCURL@ +LIBCURL_CPPFLAGS = @LIBCURL_CPPFLAGS@ +LIBGEOCLUE_CFLAGS = @LIBGEOCLUE_CFLAGS@ +LIBGEOCLUE_LIBS = @LIBGEOCLUE_LIBS@ +LIBICONV = @LIBICONV@ +LIBINTL = @LIBINTL@ +LIBOBJS = @LIBOBJS@ +LIBS = @LIBS@ +LIBZIP_CFLAGS = @LIBZIP_CFLAGS@ +LIBZIP_LIBS = @LIBZIP_LIBS@ +LN_S = @LN_S@ +LTLIBICONV = @LTLIBICONV@ +LTLIBINTL = @LTLIBINTL@ +LTLIBOBJS = @LTLIBOBJS@ +MAKEINFO = @MAKEINFO@ +MKDIR_P = @MKDIR_P@ +MKINSTALLDIRS = @MKINSTALLDIRS@ +MSGFMT = @MSGFMT@ +MSGFMT_015 = @MSGFMT_015@ +MSGFMT_OPTS = @MSGFMT_OPTS@ +MSGMERGE = @MSGMERGE@ +OBJEXT = @OBJEXT@ +OMF_DIR = @OMF_DIR@ +PACKAGE = @PACKAGE@ +PACKAGE_BUGREPORT = @PACKAGE_BUGREPORT@ +PACKAGE_CFLAGS = @PACKAGE_CFLAGS@ +PACKAGE_LIBS = @PACKAGE_LIBS@ +PACKAGE_NAME = @PACKAGE_NAME@ +PACKAGE_STRING = @PACKAGE_STRING@ +PACKAGE_TARNAME = @PACKAGE_TARNAME@ +PACKAGE_URL = @PACKAGE_URL@ +PACKAGE_VERSION = @PACKAGE_VERSION@ +PATH_SEPARATOR = @PATH_SEPARATOR@ +PKG_CONFIG = @PKG_CONFIG@ +PKG_CONFIG_LIBDIR = @PKG_CONFIG_LIBDIR@ +PKG_CONFIG_PATH = @PKG_CONFIG_PATH@ +POFILES = @POFILES@ +POSUB = @POSUB@ +PO_IN_DATADIR_FALSE = @PO_IN_DATADIR_FALSE@ +PO_IN_DATADIR_TRUE = @PO_IN_DATADIR_TRUE@ +RANLIB = @RANLIB@ +SET_MAKE = @SET_MAKE@ +SHELL = @SHELL@ +STRIP = @STRIP@ +USE_NLS = @USE_NLS@ +VERSION = @VERSION@ +XGETTEXT = @XGETTEXT@ +XGETTEXT_015 = @XGETTEXT_015@ +XGETTEXT_EXTRA_OPTIONS = @XGETTEXT_EXTRA_OPTIONS@ +XP = @XP@ +_libcurl_config = @_libcurl_config@ +abs_builddir = @abs_builddir@ +abs_srcdir = @abs_srcdir@ +abs_top_builddir = @abs_top_builddir@ +abs_top_srcdir = @abs_top_srcdir@ +ac_ct_CC = @ac_ct_CC@ +ac_ct_CXX = @ac_ct_CXX@ +am__include = @am__include@ +am__leading_dot = @am__leading_dot@ +am__quote = @am__quote@ +am__tar = @am__tar@ +am__untar = @am__untar@ +bindir = @bindir@ +build = @build@ +build_alias = @build_alias@ +build_cpu = @build_cpu@ +build_os = @build_os@ +build_vendor = @build_vendor@ +builddir = @builddir@ +datadir = @datadir@ +datarootdir = @datarootdir@ +docdir = @docdir@ +dvidir = @dvidir@ +exec_prefix = @exec_prefix@ +host = @host@ +host_alias = @host_alias@ +host_cpu = @host_cpu@ +host_os = @host_os@ +host_vendor = @host_vendor@ +htmldir = @htmldir@ +includedir = @includedir@ +infodir = @infodir@ +install_sh = @install_sh@ +intltool__v_merge_options_ = @intltool__v_merge_options_@ +intltool__v_merge_options_0 = @intltool__v_merge_options_0@ +libdir = @libdir@ +libexecdir = @libexecdir@ +localedir = @localedir@ +localstatedir = @localstatedir@ +mandir = @mandir@ +mkdir_p = @mkdir_p@ +oldincludedir = @oldincludedir@ +pdfdir = @pdfdir@ +prefix = @prefix@ +program_transform_name = @program_transform_name@ +psdir = @psdir@ +runstatedir = @runstatedir@ +sbindir = @sbindir@ +sharedstatedir = @sharedstatedir@ +srcdir = @srcdir@ +sysconfdir = @sysconfdir@ +target = @target@ +target_alias = @target_alias@ +target_cpu = @target_cpu@ +target_os = @target_os@ +target_vendor = @target_vendor@ +top_build_prefix = @top_build_prefix@ +top_builddir = @top_builddir@ +top_srcdir = @top_srcdir@ + +# We require automake 1.6 at least. +AUTOMAKE_OPTIONS = 1.6 + +# This is a blank Makefile.am for using gtk-doc. +# Copy this to your project's API docs directory and modify the variables to +# suit your project. See the GTK+ Makefiles in gtk+/docs/reference for examples +# of using the various options. + +# The name of the module, e.g. 'glib'. +DOC_MODULE = viking + +# The top-level SGML file. You can change this if you want to. +DOC_MAIN_SGML_FILE = $(DOC_MODULE)-docs.sgml + +# The directory containing the source code. Relative to $(srcdir). +# gtk-doc will search all .c & .h files beneath here for inline comments +# documenting the functions and macros. +# e.g. DOC_SOURCE_DIR=../../../gtk +DOC_SOURCE_DIR = ../../src + +# Extra options to pass to gtkdoc-scangobj. Not normally needed. +SCANGOBJ_OPTIONS = + +# Extra options to supply to gtkdoc-scan. +# e.g. SCAN_OPTIONS=--deprecated-guards="GTK_DISABLE_DEPRECATED" +SCAN_OPTIONS = --rebuild-types + +# Extra options to supply to gtkdoc-mkdb. +# e.g. MKDB_OPTIONS=--sgml-mode --output-format=xml +MKDB_OPTIONS = --sgml-mode --output-format=xml + +# Extra options to supply to gtkdoc-mktmpl +# e.g. MKTMPL_OPTIONS=--only-section-tmpl +MKTMPL_OPTIONS = + +# Extra options to supply to gtkdoc-fixref. Not normally needed. +# e.g. FIXXREF_OPTIONS=--extra-dir=../gdk-pixbuf/html --extra-dir=../gdk/html +FIXXREF_OPTIONS = + +# Used for dependencies. The docs will be rebuilt if any of these change. +# e.g. HFILE_GLOB=$(top_srcdir)/gtk/*.h +# e.g. CFILE_GLOB=$(top_srcdir)/gtk/*.c +HFILE_GLOB = +CFILE_GLOB = + +# Header files to ignore when scanning. +# e.g. IGNORE_HFILES=gtkdebug.h gtkintl.h +IGNORE_HFILES = terraserver.h terraservermapsource.h + +# Images to copy into HTML directory. +# e.g. HTML_IMAGES=$(top_srcdir)/gtk/stock-icons/stock_about_24.png +HTML_IMAGES = + +# Extra SGML files that are included by $(DOC_MAIN_SGML_FILE). +# e.g. content_files=running.sgml building.sgml changes-2.0.sgml +content_files = + +# SGML files where gtk-doc abbrevations (#GtkWidget) are expanded +# These files must be listed here *and* in content_files +# e.g. expand_content_files=running.sgml +expand_content_files = + +# CFLAGS and LDFLAGS for compiling gtkdoc-scangobj with your library. +# Only needed if you are using gtkdoc-scangobj to dynamically query widget +# signals and properties. +# e.g. INCLUDES=-I$(top_srcdir) -I$(top_builddir) $(GTK_DEBUG_FLAGS) +# e.g. GTKDOC_LIBS=$(top_builddir)/gtk/$(gtktargetlib) +INCLUDES = @PACKAGE_CFLAGS@ @EXPAT_CFLAGS@ @LIBCURL_CPPFLAGS@ +GTKDOC_LIBS = -L$(top_srcdir)/src -lviking -L$(top_srcdir)/src/icons -licons @PACKAGE_LIBS@ @EXPAT_LIBS@ @LIBCURL@ $(LIBS) +@ENABLE_GTK_DOC_TRUE@@GTK_DOC_USE_LIBTOOL_FALSE@GTKDOC_CC = $(CC) $(INCLUDES) $(GTKDOC_DEPS_CFLAGS) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) +@ENABLE_GTK_DOC_TRUE@@GTK_DOC_USE_LIBTOOL_TRUE@GTKDOC_CC = $(LIBTOOL) --tag=CC --mode=compile $(CC) $(INCLUDES) $(GTKDOC_DEPS_CFLAGS) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) +@ENABLE_GTK_DOC_TRUE@@GTK_DOC_USE_LIBTOOL_FALSE@GTKDOC_LD = $(CC) $(GTKDOC_DEPS_LIBS) $(AM_CFLAGS) $(CFLAGS) $(AM_LDFLAGS) $(LDFLAGS) +@ENABLE_GTK_DOC_TRUE@@GTK_DOC_USE_LIBTOOL_TRUE@GTKDOC_LD = $(LIBTOOL) --tag=CC --mode=link $(CC) $(GTKDOC_DEPS_LIBS) $(AM_CFLAGS) $(CFLAGS) $(AM_LDFLAGS) $(LDFLAGS) +@ENABLE_GTK_DOC_TRUE@@GTK_DOC_USE_LIBTOOL_FALSE@GTKDOC_RUN = +@ENABLE_GTK_DOC_TRUE@@GTK_DOC_USE_LIBTOOL_TRUE@GTKDOC_RUN = $(LIBTOOL) --mode=execute + +# We set GPATH here; this gives us semantics for GNU make +# which are more like other make's VPATH, when it comes to +# whether a source that is a target of one rule is then +# searched for in VPATH/GPATH. +# +@ENABLE_GTK_DOC_TRUE@GPATH = $(srcdir) +@ENABLE_GTK_DOC_TRUE@TARGET_DIR = $(HTML_DIR)/$(DOC_MODULE) +@ENABLE_GTK_DOC_TRUE@SETUP_FILES = \ +@ENABLE_GTK_DOC_TRUE@ $(content_files) \ +@ENABLE_GTK_DOC_TRUE@ $(expand_content_files) \ +@ENABLE_GTK_DOC_TRUE@ $(DOC_MAIN_SGML_FILE) \ +@ENABLE_GTK_DOC_TRUE@ $(DOC_MODULE)-sections.txt \ +@ENABLE_GTK_DOC_TRUE@ $(DOC_MODULE)-overrides.txt + +@ENABLE_GTK_DOC_TRUE@EXTRA_DIST = \ +@ENABLE_GTK_DOC_TRUE@ $(HTML_IMAGES) \ +@ENABLE_GTK_DOC_TRUE@ $(SETUP_FILES) + +@ENABLE_GTK_DOC_TRUE@DOC_STAMPS = setup-build.stamp scan-build.stamp sgml-build.stamp \ +@ENABLE_GTK_DOC_TRUE@ html-build.stamp pdf-build.stamp \ +@ENABLE_GTK_DOC_TRUE@ sgml.stamp html.stamp pdf.stamp + +@ENABLE_GTK_DOC_TRUE@SCANOBJ_FILES = \ +@ENABLE_GTK_DOC_TRUE@ $(DOC_MODULE).args \ +@ENABLE_GTK_DOC_TRUE@ $(DOC_MODULE).hierarchy \ +@ENABLE_GTK_DOC_TRUE@ $(DOC_MODULE).interfaces \ +@ENABLE_GTK_DOC_TRUE@ $(DOC_MODULE).prerequisites \ +@ENABLE_GTK_DOC_TRUE@ $(DOC_MODULE).signals + +@ENABLE_GTK_DOC_TRUE@REPORT_FILES = \ +@ENABLE_GTK_DOC_TRUE@ $(DOC_MODULE)-undocumented.txt \ +@ENABLE_GTK_DOC_TRUE@ $(DOC_MODULE)-undeclared.txt \ +@ENABLE_GTK_DOC_TRUE@ $(DOC_MODULE)-unused.txt + +@ENABLE_GTK_DOC_TRUE@CLEANFILES = $(SCANOBJ_FILES) $(REPORT_FILES) $(DOC_STAMPS) gtkdoc-check.test +@ENABLE_GTK_DOC_TRUE@@GTK_DOC_BUILD_HTML_FALSE@HTML_BUILD_STAMP = +@ENABLE_GTK_DOC_TRUE@@GTK_DOC_BUILD_HTML_TRUE@HTML_BUILD_STAMP = html-build.stamp +@ENABLE_GTK_DOC_TRUE@@GTK_DOC_BUILD_PDF_FALSE@PDF_BUILD_STAMP = +@ENABLE_GTK_DOC_TRUE@@GTK_DOC_BUILD_PDF_TRUE@PDF_BUILD_STAMP = pdf-build.stamp + +#### setup #### +@ENABLE_GTK_DOC_TRUE@GTK_DOC_V_SETUP = $(GTK_DOC_V_SETUP_@AM_V@) +@ENABLE_GTK_DOC_TRUE@GTK_DOC_V_SETUP_ = $(GTK_DOC_V_SETUP_@AM_DEFAULT_V@) +@ENABLE_GTK_DOC_TRUE@GTK_DOC_V_SETUP_0 = @echo " DOC Preparing build"; + +#### scan #### +@ENABLE_GTK_DOC_TRUE@GTK_DOC_V_SCAN = $(GTK_DOC_V_SCAN_@AM_V@) +@ENABLE_GTK_DOC_TRUE@GTK_DOC_V_SCAN_ = $(GTK_DOC_V_SCAN_@AM_DEFAULT_V@) +@ENABLE_GTK_DOC_TRUE@GTK_DOC_V_SCAN_0 = @echo " DOC Scanning header files"; +@ENABLE_GTK_DOC_TRUE@GTK_DOC_V_INTROSPECT = $(GTK_DOC_V_INTROSPECT_@AM_V@) +@ENABLE_GTK_DOC_TRUE@GTK_DOC_V_INTROSPECT_ = $(GTK_DOC_V_INTROSPECT_@AM_DEFAULT_V@) +@ENABLE_GTK_DOC_TRUE@GTK_DOC_V_INTROSPECT_0 = @echo " DOC Introspecting gobjects"; + +#### xml #### +@ENABLE_GTK_DOC_TRUE@GTK_DOC_V_XML = $(GTK_DOC_V_XML_@AM_V@) +@ENABLE_GTK_DOC_TRUE@GTK_DOC_V_XML_ = $(GTK_DOC_V_XML_@AM_DEFAULT_V@) +@ENABLE_GTK_DOC_TRUE@GTK_DOC_V_XML_0 = @echo " DOC Building XML"; + +#### html #### +@ENABLE_GTK_DOC_TRUE@GTK_DOC_V_HTML = $(GTK_DOC_V_HTML_@AM_V@) +@ENABLE_GTK_DOC_TRUE@GTK_DOC_V_HTML_ = $(GTK_DOC_V_HTML_@AM_DEFAULT_V@) +@ENABLE_GTK_DOC_TRUE@GTK_DOC_V_HTML_0 = @echo " DOC Building HTML"; +@ENABLE_GTK_DOC_TRUE@GTK_DOC_V_XREF = $(GTK_DOC_V_XREF_@AM_V@) +@ENABLE_GTK_DOC_TRUE@GTK_DOC_V_XREF_ = $(GTK_DOC_V_XREF_@AM_DEFAULT_V@) +@ENABLE_GTK_DOC_TRUE@GTK_DOC_V_XREF_0 = @echo " DOC Fixing cross-references"; + +#### pdf #### +@ENABLE_GTK_DOC_TRUE@GTK_DOC_V_PDF = $(GTK_DOC_V_PDF_@AM_V@) +@ENABLE_GTK_DOC_TRUE@GTK_DOC_V_PDF_ = $(GTK_DOC_V_PDF_@AM_DEFAULT_V@) +@ENABLE_GTK_DOC_TRUE@GTK_DOC_V_PDF_0 = @echo " DOC Building PDF"; +all: all-am + +.SUFFIXES: +$(srcdir)/Makefile.in: $(srcdir)/Makefile.am $(top_srcdir)/gtk-doc.make $(am__configure_deps) + @for dep in $?; do \ + case '$(am__configure_deps)' in \ + *$$dep*) \ + ( cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh ) \ + && { if test -f $@; then exit 0; else break; fi; }; \ + exit 1;; \ + esac; \ + done; \ + echo ' cd $(top_srcdir) && $(AUTOMAKE) --gnu doc/reference/Makefile'; \ + $(am__cd) $(top_srcdir) && \ + $(AUTOMAKE) --gnu doc/reference/Makefile +Makefile: $(srcdir)/Makefile.in $(top_builddir)/config.status + @case '$?' in \ + *config.status*) \ + cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh;; \ + *) \ + echo ' cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__maybe_remake_depfiles)'; \ + cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__maybe_remake_depfiles);; \ + esac; +$(top_srcdir)/gtk-doc.make $(am__empty): + +$(top_builddir)/config.status: $(top_srcdir)/configure $(CONFIG_STATUS_DEPENDENCIES) + cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh + +$(top_srcdir)/configure: $(am__configure_deps) + cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh +$(ACLOCAL_M4): $(am__aclocal_m4_deps) + cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh +$(am__aclocal_m4_deps): +tags TAGS: + +ctags CTAGS: + +cscope cscopelist: + +@ENABLE_GTK_DOC_FALSE@dist-hook: + +distdir: $(BUILT_SOURCES) + $(MAKE) $(AM_MAKEFLAGS) distdir-am + +distdir-am: $(DISTFILES) + @srcdirstrip=`echo "$(srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \ + topsrcdirstrip=`echo "$(top_srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \ + list='$(DISTFILES)'; \ + dist_files=`for file in $$list; do echo $$file; done | \ + sed -e "s|^$$srcdirstrip/||;t" \ + -e "s|^$$topsrcdirstrip/|$(top_builddir)/|;t"`; \ + case $$dist_files in \ + */*) $(MKDIR_P) `echo "$$dist_files" | \ + sed '/\//!d;s|^|$(distdir)/|;s,/[^/]*$$,,' | \ + sort -u` ;; \ + esac; \ + for file in $$dist_files; do \ + if test -f $$file || test -d $$file; then d=.; else d=$(srcdir); fi; \ + if test -d $$d/$$file; then \ + dir=`echo "/$$file" | sed -e 's,/[^/]*$$,,'`; \ + if test -d "$(distdir)/$$file"; then \ + find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \ + fi; \ + if test -d $(srcdir)/$$file && test $$d != $(srcdir); then \ + cp -fpR $(srcdir)/$$file "$(distdir)$$dir" || exit 1; \ + find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \ + fi; \ + cp -fpR $$d/$$file "$(distdir)$$dir" || exit 1; \ + else \ + test -f "$(distdir)/$$file" \ + || cp -p $$d/$$file "$(distdir)/$$file" \ + || exit 1; \ + fi; \ + done + $(MAKE) $(AM_MAKEFLAGS) \ + top_distdir="$(top_distdir)" distdir="$(distdir)" \ + dist-hook +check-am: all-am +check: check-am +@ENABLE_GTK_DOC_FALSE@all-local: +all-am: Makefile all-local +installdirs: +install: install-am +install-exec: install-exec-am +install-data: install-data-am +uninstall: uninstall-am + +install-am: all-am + @$(MAKE) $(AM_MAKEFLAGS) install-exec-am install-data-am + +installcheck: installcheck-am +install-strip: + if test -z '$(STRIP)'; then \ + $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \ + install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \ + install; \ + else \ + $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \ + install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \ + "INSTALL_PROGRAM_ENV=STRIPPROG='$(STRIP)'" install; \ + fi +mostlyclean-generic: + +clean-generic: + -test -z "$(CLEANFILES)" || rm -f $(CLEANFILES) + +distclean-generic: + -test -z "$(CONFIG_CLEAN_FILES)" || rm -f $(CONFIG_CLEAN_FILES) + -test . = "$(srcdir)" || test -z "$(CONFIG_CLEAN_VPATH_FILES)" || rm -f $(CONFIG_CLEAN_VPATH_FILES) + +maintainer-clean-generic: + @echo "This command is intended for maintainers to use" + @echo "it deletes files that may require special tools to rebuild." +@ENABLE_GTK_DOC_FALSE@clean-local: +@ENABLE_GTK_DOC_FALSE@install-data-local: +@ENABLE_GTK_DOC_FALSE@maintainer-clean-local: +@ENABLE_GTK_DOC_FALSE@uninstall-local: +@ENABLE_GTK_DOC_FALSE@distclean-local: +clean: clean-am + +clean-am: clean-generic clean-local mostlyclean-am + +distclean: distclean-am + -rm -f Makefile +distclean-am: clean-am distclean-generic distclean-local + +dvi: dvi-am + +dvi-am: + +html: html-am + +html-am: + +info: info-am + +info-am: + +install-data-am: install-data-local + +install-dvi: install-dvi-am + +install-dvi-am: + +install-exec-am: + +install-html: install-html-am + +install-html-am: + +install-info: install-info-am + +install-info-am: + +install-man: + +install-pdf: install-pdf-am + +install-pdf-am: + +install-ps: install-ps-am + +install-ps-am: + +installcheck-am: + +maintainer-clean: maintainer-clean-am + -rm -f Makefile +maintainer-clean-am: distclean-am maintainer-clean-generic \ + maintainer-clean-local + +mostlyclean: mostlyclean-am + +mostlyclean-am: mostlyclean-generic + +pdf: pdf-am + +pdf-am: + +ps: ps-am + +ps-am: + +uninstall-am: uninstall-local + +.MAKE: install-am install-strip + +.PHONY: all all-am all-local check check-am clean clean-generic \ + clean-local cscopelist-am ctags-am dist-hook distclean \ + distclean-generic distclean-local distdir dvi dvi-am html \ + html-am info info-am install install-am install-data \ + install-data-am install-data-local install-dvi install-dvi-am \ + install-exec install-exec-am install-html install-html-am \ + install-info install-info-am install-man install-pdf \ + install-pdf-am install-ps install-ps-am install-strip \ + installcheck installcheck-am installdirs maintainer-clean \ + maintainer-clean-generic maintainer-clean-local mostlyclean \ + mostlyclean-generic pdf pdf-am ps ps-am tags-am uninstall \ + uninstall-am uninstall-local + +.PRECIOUS: Makefile + + +@ENABLE_GTK_DOC_TRUE@gtkdoc-check.test: Makefile +@ENABLE_GTK_DOC_TRUE@ $(AM_V_GEN)echo "#!/bin/sh -e" > $@; \ +@ENABLE_GTK_DOC_TRUE@ echo "$(GTKDOC_CHECK_PATH) || exit 1" >> $@; \ +@ENABLE_GTK_DOC_TRUE@ chmod +x $@ + +@ENABLE_GTK_DOC_TRUE@all-gtk-doc: $(HTML_BUILD_STAMP) $(PDF_BUILD_STAMP) +@ENABLE_GTK_DOC_TRUE@.PHONY: all-gtk-doc + +@ENABLE_GTK_DOC_TRUE@all-local: all-gtk-doc + +@ENABLE_GTK_DOC_TRUE@docs: $(HTML_BUILD_STAMP) $(PDF_BUILD_STAMP) + +@ENABLE_GTK_DOC_TRUE@$(REPORT_FILES): sgml-build.stamp + +@ENABLE_GTK_DOC_TRUE@setup-build.stamp: +@ENABLE_GTK_DOC_TRUE@ -$(GTK_DOC_V_SETUP)if test "$(abs_srcdir)" != "$(abs_builddir)" ; then \ +@ENABLE_GTK_DOC_TRUE@ files=`echo $(SETUP_FILES) $(DOC_MODULE).types`; \ +@ENABLE_GTK_DOC_TRUE@ if test "x$$files" != "x" ; then \ +@ENABLE_GTK_DOC_TRUE@ for file in $$files ; do \ +@ENABLE_GTK_DOC_TRUE@ destdir=`dirname $(abs_builddir)/$$file`; \ +@ENABLE_GTK_DOC_TRUE@ test -d "$$destdir" || mkdir -p "$$destdir"; \ +@ENABLE_GTK_DOC_TRUE@ test -f $(abs_srcdir)/$$file && \ +@ENABLE_GTK_DOC_TRUE@ cp -pf $(abs_srcdir)/$$file $(abs_builddir)/$$file || true; \ +@ENABLE_GTK_DOC_TRUE@ done; \ +@ENABLE_GTK_DOC_TRUE@ fi; \ +@ENABLE_GTK_DOC_TRUE@ fi +@ENABLE_GTK_DOC_TRUE@ $(AM_V_at)touch setup-build.stamp + +@ENABLE_GTK_DOC_TRUE@scan-build.stamp: setup-build.stamp $(HFILE_GLOB) $(CFILE_GLOB) +@ENABLE_GTK_DOC_TRUE@ $(GTK_DOC_V_SCAN)_source_dir='' ; \ +@ENABLE_GTK_DOC_TRUE@ for i in $(DOC_SOURCE_DIR) ; do \ +@ENABLE_GTK_DOC_TRUE@ _source_dir="$${_source_dir} --source-dir=$$i" ; \ +@ENABLE_GTK_DOC_TRUE@ done ; \ +@ENABLE_GTK_DOC_TRUE@ gtkdoc-scan --module=$(DOC_MODULE) --ignore-headers="$(IGNORE_HFILES)" $${_source_dir} $(SCAN_OPTIONS) $(EXTRA_HFILES) +@ENABLE_GTK_DOC_TRUE@ $(GTK_DOC_V_INTROSPECT)if grep -l '^..*$$' $(DOC_MODULE).types > /dev/null 2>&1 ; then \ +@ENABLE_GTK_DOC_TRUE@ scanobj_options=""; \ +@ENABLE_GTK_DOC_TRUE@ gtkdoc-scangobj 2>&1 --help | grep >/dev/null "\-\-verbose"; \ +@ENABLE_GTK_DOC_TRUE@ if test "$$?" = "0"; then \ +@ENABLE_GTK_DOC_TRUE@ if test "x$(V)" = "x1"; then \ +@ENABLE_GTK_DOC_TRUE@ scanobj_options="--verbose"; \ +@ENABLE_GTK_DOC_TRUE@ fi; \ +@ENABLE_GTK_DOC_TRUE@ fi; \ +@ENABLE_GTK_DOC_TRUE@ CC="$(GTKDOC_CC)" LD="$(GTKDOC_LD)" RUN="$(GTKDOC_RUN)" CFLAGS="$(GTKDOC_CFLAGS) $(CFLAGS)" LDFLAGS="$(GTKDOC_LIBS) $(LDFLAGS)" \ +@ENABLE_GTK_DOC_TRUE@ gtkdoc-scangobj $(SCANGOBJ_OPTIONS) $$scanobj_options --module=$(DOC_MODULE); \ +@ENABLE_GTK_DOC_TRUE@ else \ +@ENABLE_GTK_DOC_TRUE@ for i in $(SCANOBJ_FILES) ; do \ +@ENABLE_GTK_DOC_TRUE@ test -f $$i || touch $$i ; \ +@ENABLE_GTK_DOC_TRUE@ done \ +@ENABLE_GTK_DOC_TRUE@ fi +@ENABLE_GTK_DOC_TRUE@ $(AM_V_at)touch scan-build.stamp + +@ENABLE_GTK_DOC_TRUE@$(DOC_MODULE)-decl.txt $(SCANOBJ_FILES) $(DOC_MODULE)-sections.txt $(DOC_MODULE)-overrides.txt: scan-build.stamp +@ENABLE_GTK_DOC_TRUE@ @true + +@ENABLE_GTK_DOC_TRUE@sgml-build.stamp: setup-build.stamp $(DOC_MODULE)-decl.txt $(SCANOBJ_FILES) $(HFILE_GLOB) $(CFILE_GLOB) $(DOC_MODULE)-sections.txt $(DOC_MODULE)-overrides.txt $(expand_content_files) xml/gtkdocentities.ent +@ENABLE_GTK_DOC_TRUE@ $(GTK_DOC_V_XML)_source_dir='' ; \ +@ENABLE_GTK_DOC_TRUE@ for i in $(DOC_SOURCE_DIR) ; do \ +@ENABLE_GTK_DOC_TRUE@ _source_dir="$${_source_dir} --source-dir=$$i" ; \ +@ENABLE_GTK_DOC_TRUE@ done ; \ +@ENABLE_GTK_DOC_TRUE@ gtkdoc-mkdb --module=$(DOC_MODULE) --output-format=xml --expand-content-files="$(expand_content_files)" --main-sgml-file=$(DOC_MAIN_SGML_FILE) $${_source_dir} $(MKDB_OPTIONS) +@ENABLE_GTK_DOC_TRUE@ $(AM_V_at)touch sgml-build.stamp + +@ENABLE_GTK_DOC_TRUE@sgml.stamp: sgml-build.stamp +@ENABLE_GTK_DOC_TRUE@ @true + +@ENABLE_GTK_DOC_TRUE@$(DOC_MAIN_SGML_FILE): sgml-build.stamp +@ENABLE_GTK_DOC_TRUE@ @true + +@ENABLE_GTK_DOC_TRUE@xml/gtkdocentities.ent: Makefile +@ENABLE_GTK_DOC_TRUE@ $(GTK_DOC_V_XML)$(MKDIR_P) $(@D) && ( \ +@ENABLE_GTK_DOC_TRUE@ echo ""; \ +@ENABLE_GTK_DOC_TRUE@ echo ""; \ +@ENABLE_GTK_DOC_TRUE@ echo ""; \ +@ENABLE_GTK_DOC_TRUE@ echo ""; \ +@ENABLE_GTK_DOC_TRUE@ echo ""; \ +@ENABLE_GTK_DOC_TRUE@ echo ""; \ +@ENABLE_GTK_DOC_TRUE@ echo ""; \ +@ENABLE_GTK_DOC_TRUE@ ) > $@ + +@ENABLE_GTK_DOC_TRUE@html-build.stamp: sgml.stamp $(DOC_MAIN_SGML_FILE) $(content_files) $(expand_content_files) +@ENABLE_GTK_DOC_TRUE@ $(GTK_DOC_V_HTML)rm -rf html && mkdir html && \ +@ENABLE_GTK_DOC_TRUE@ mkhtml_options=""; \ +@ENABLE_GTK_DOC_TRUE@ gtkdoc-mkhtml 2>&1 --help | grep >/dev/null "\-\-verbose"; \ +@ENABLE_GTK_DOC_TRUE@ if test "$$?" = "0"; then \ +@ENABLE_GTK_DOC_TRUE@ if test "x$(V)" = "x1"; then \ +@ENABLE_GTK_DOC_TRUE@ mkhtml_options="$$mkhtml_options --verbose"; \ +@ENABLE_GTK_DOC_TRUE@ fi; \ +@ENABLE_GTK_DOC_TRUE@ fi; \ +@ENABLE_GTK_DOC_TRUE@ gtkdoc-mkhtml 2>&1 --help | grep >/dev/null "\-\-path"; \ +@ENABLE_GTK_DOC_TRUE@ if test "$$?" = "0"; then \ +@ENABLE_GTK_DOC_TRUE@ mkhtml_options="$$mkhtml_options --path=\"$(abs_srcdir)\""; \ +@ENABLE_GTK_DOC_TRUE@ fi; \ +@ENABLE_GTK_DOC_TRUE@ cd html && gtkdoc-mkhtml $$mkhtml_options $(MKHTML_OPTIONS) $(DOC_MODULE) ../$(DOC_MAIN_SGML_FILE) +@ENABLE_GTK_DOC_TRUE@ -@test "x$(HTML_IMAGES)" = "x" || \ +@ENABLE_GTK_DOC_TRUE@ for file in $(HTML_IMAGES) ; do \ +@ENABLE_GTK_DOC_TRUE@ test -f $(abs_srcdir)/$$file && cp $(abs_srcdir)/$$file $(abs_builddir)/html; \ +@ENABLE_GTK_DOC_TRUE@ test -f $(abs_builddir)/$$file && cp $(abs_builddir)/$$file $(abs_builddir)/html; \ +@ENABLE_GTK_DOC_TRUE@ test -f $$file && cp $$file $(abs_builddir)/html; \ +@ENABLE_GTK_DOC_TRUE@ done; +@ENABLE_GTK_DOC_TRUE@ $(GTK_DOC_V_XREF)gtkdoc-fixxref --module=$(DOC_MODULE) --module-dir=html --html-dir=$(HTML_DIR) $(FIXXREF_OPTIONS) +@ENABLE_GTK_DOC_TRUE@ $(AM_V_at)touch html-build.stamp + +@ENABLE_GTK_DOC_TRUE@pdf-build.stamp: sgml.stamp $(DOC_MAIN_SGML_FILE) $(content_files) $(expand_content_files) +@ENABLE_GTK_DOC_TRUE@ $(GTK_DOC_V_PDF)rm -f $(DOC_MODULE).pdf && \ +@ENABLE_GTK_DOC_TRUE@ mkpdf_options=""; \ +@ENABLE_GTK_DOC_TRUE@ gtkdoc-mkpdf 2>&1 --help | grep >/dev/null "\-\-verbose"; \ +@ENABLE_GTK_DOC_TRUE@ if test "$$?" = "0"; then \ +@ENABLE_GTK_DOC_TRUE@ if test "x$(V)" = "x1"; then \ +@ENABLE_GTK_DOC_TRUE@ mkpdf_options="$$mkpdf_options --verbose"; \ +@ENABLE_GTK_DOC_TRUE@ fi; \ +@ENABLE_GTK_DOC_TRUE@ fi; \ +@ENABLE_GTK_DOC_TRUE@ if test "x$(HTML_IMAGES)" != "x"; then \ +@ENABLE_GTK_DOC_TRUE@ for img in $(HTML_IMAGES); do \ +@ENABLE_GTK_DOC_TRUE@ part=`dirname $$img`; \ +@ENABLE_GTK_DOC_TRUE@ echo $$mkpdf_options | grep >/dev/null "\-\-imgdir=$$part "; \ +@ENABLE_GTK_DOC_TRUE@ if test $$? != 0; then \ +@ENABLE_GTK_DOC_TRUE@ mkpdf_options="$$mkpdf_options --imgdir=$$part"; \ +@ENABLE_GTK_DOC_TRUE@ fi; \ +@ENABLE_GTK_DOC_TRUE@ done; \ +@ENABLE_GTK_DOC_TRUE@ fi; \ +@ENABLE_GTK_DOC_TRUE@ gtkdoc-mkpdf --path="$(abs_srcdir)" $$mkpdf_options $(DOC_MODULE) $(DOC_MAIN_SGML_FILE) $(MKPDF_OPTIONS) +@ENABLE_GTK_DOC_TRUE@ $(AM_V_at)touch pdf-build.stamp + +############## + +@ENABLE_GTK_DOC_TRUE@clean-local: +@ENABLE_GTK_DOC_TRUE@ @rm -f *~ *.bak +@ENABLE_GTK_DOC_TRUE@ @rm -rf .libs +@ENABLE_GTK_DOC_TRUE@ @if echo $(SCAN_OPTIONS) | grep -q "\-\-rebuild-types" ; then \ +@ENABLE_GTK_DOC_TRUE@ rm -f $(DOC_MODULE).types; \ +@ENABLE_GTK_DOC_TRUE@ fi +@ENABLE_GTK_DOC_TRUE@ @if echo $(SCAN_OPTIONS) | grep -q "\-\-rebuild-sections" ; then \ +@ENABLE_GTK_DOC_TRUE@ rm -f $(DOC_MODULE)-sections.txt; \ +@ENABLE_GTK_DOC_TRUE@ fi + +@ENABLE_GTK_DOC_TRUE@distclean-local: +@ENABLE_GTK_DOC_TRUE@ @rm -rf xml html $(REPORT_FILES) $(DOC_MODULE).pdf \ +@ENABLE_GTK_DOC_TRUE@ $(DOC_MODULE)-decl-list.txt $(DOC_MODULE)-decl.txt +@ENABLE_GTK_DOC_TRUE@ @if test "$(abs_srcdir)" != "$(abs_builddir)" ; then \ +@ENABLE_GTK_DOC_TRUE@ rm -f $(SETUP_FILES) $(DOC_MODULE).types; \ +@ENABLE_GTK_DOC_TRUE@ fi + +@ENABLE_GTK_DOC_TRUE@maintainer-clean-local: +@ENABLE_GTK_DOC_TRUE@ @rm -rf xml html + +@ENABLE_GTK_DOC_TRUE@install-data-local: +@ENABLE_GTK_DOC_TRUE@ @installfiles=`echo $(builddir)/html/*`; \ +@ENABLE_GTK_DOC_TRUE@ if test "$$installfiles" = '$(builddir)/html/*'; \ +@ENABLE_GTK_DOC_TRUE@ then echo 1>&2 'Nothing to install' ; \ +@ENABLE_GTK_DOC_TRUE@ else \ +@ENABLE_GTK_DOC_TRUE@ if test -n "$(DOC_MODULE_VERSION)"; then \ +@ENABLE_GTK_DOC_TRUE@ installdir="$(DESTDIR)$(TARGET_DIR)-$(DOC_MODULE_VERSION)"; \ +@ENABLE_GTK_DOC_TRUE@ else \ +@ENABLE_GTK_DOC_TRUE@ installdir="$(DESTDIR)$(TARGET_DIR)"; \ +@ENABLE_GTK_DOC_TRUE@ fi; \ +@ENABLE_GTK_DOC_TRUE@ $(mkinstalldirs) $${installdir} ; \ +@ENABLE_GTK_DOC_TRUE@ for i in $$installfiles; do \ +@ENABLE_GTK_DOC_TRUE@ echo ' $(INSTALL_DATA) '$$i ; \ +@ENABLE_GTK_DOC_TRUE@ $(INSTALL_DATA) $$i $${installdir}; \ +@ENABLE_GTK_DOC_TRUE@ done; \ +@ENABLE_GTK_DOC_TRUE@ if test -n "$(DOC_MODULE_VERSION)"; then \ +@ENABLE_GTK_DOC_TRUE@ mv -f $${installdir}/$(DOC_MODULE).devhelp2 \ +@ENABLE_GTK_DOC_TRUE@ $${installdir}/$(DOC_MODULE)-$(DOC_MODULE_VERSION).devhelp2; \ +@ENABLE_GTK_DOC_TRUE@ fi; \ +@ENABLE_GTK_DOC_TRUE@ $(GTKDOC_REBASE) --relative --dest-dir=$(DESTDIR) --html-dir=$${installdir}; \ +@ENABLE_GTK_DOC_TRUE@ fi + +@ENABLE_GTK_DOC_TRUE@uninstall-local: +@ENABLE_GTK_DOC_TRUE@ @if test -n "$(DOC_MODULE_VERSION)"; then \ +@ENABLE_GTK_DOC_TRUE@ installdir="$(DESTDIR)$(TARGET_DIR)-$(DOC_MODULE_VERSION)"; \ +@ENABLE_GTK_DOC_TRUE@ else \ +@ENABLE_GTK_DOC_TRUE@ installdir="$(DESTDIR)$(TARGET_DIR)"; \ +@ENABLE_GTK_DOC_TRUE@ fi; \ +@ENABLE_GTK_DOC_TRUE@ rm -rf $${installdir} + +# +# Require gtk-doc when making dist +# +@ENABLE_GTK_DOC_TRUE@@HAVE_GTK_DOC_TRUE@dist-check-gtkdoc: docs +@ENABLE_GTK_DOC_TRUE@@HAVE_GTK_DOC_FALSE@dist-check-gtkdoc: +@ENABLE_GTK_DOC_TRUE@@HAVE_GTK_DOC_FALSE@ @echo "*** gtk-doc is needed to run 'make dist'. ***" +@ENABLE_GTK_DOC_TRUE@@HAVE_GTK_DOC_FALSE@ @echo "*** gtk-doc was not found when 'configure' ran. ***" +@ENABLE_GTK_DOC_TRUE@@HAVE_GTK_DOC_FALSE@ @echo "*** please install gtk-doc and rerun 'configure'. ***" +@ENABLE_GTK_DOC_TRUE@@HAVE_GTK_DOC_FALSE@ @false + +@ENABLE_GTK_DOC_TRUE@dist-hook: dist-check-gtkdoc all-gtk-doc dist-hook-local +@ENABLE_GTK_DOC_TRUE@ @mkdir $(distdir)/html +@ENABLE_GTK_DOC_TRUE@ @cp ./html/* $(distdir)/html +@ENABLE_GTK_DOC_TRUE@ @-cp ./$(DOC_MODULE).pdf $(distdir)/ +@ENABLE_GTK_DOC_TRUE@ @-cp ./$(DOC_MODULE).types $(distdir)/ +@ENABLE_GTK_DOC_TRUE@ @-cp ./$(DOC_MODULE)-sections.txt $(distdir)/ +@ENABLE_GTK_DOC_TRUE@ @cd $(distdir) && rm -f $(DISTCLEANFILES) +@ENABLE_GTK_DOC_TRUE@ @$(GTKDOC_REBASE) --online --relative --html-dir=$(distdir)/html + +@ENABLE_GTK_DOC_TRUE@.PHONY : dist-hook-local docs + +# This includes the standard gtk-doc make rules, copied by gtkdocize. + +# Other files to distribute +# e.g. EXTRA_DIST += version.xml.in + +# Files not to distribute +# for --rebuild-types in $(SCAN_OPTIONS), e.g. $(DOC_MODULE).types +# for --rebuild-sections in $(SCAN_OPTIONS) e.g. $(DOC_MODULE)-sections.txt +#DISTCLEANFILES += + +# Comment this out if you want your docs-status tested during 'make check' +#TESTS = $(GTKDOC_CHECK) + +# Tell versions [3.59,3.63) of GNU make to not export all variables. +# Otherwise a system limit (for SysV at least) may be exceeded. +.NOEXPORT: diff --git a/doc/reference/README b/doc/reference/README new file mode 100644 index 0000000..171da45 --- /dev/null +++ b/doc/reference/README @@ -0,0 +1,24 @@ +In order to activate reference documentation, you have to specify +the following configure command line: +$ ./configure --enable-gtk-doc --enable-gtk-doc-html + +Then, cd to doc/reference and launch make command. + +(This directory is not recursively make when launching make from top +directory. So, this avoid spending time in reference documentation +computation when not really needed.) + +Unfortunately to regenerate the references running make again does not +detect any changes to the source files, thus it must be regenerated +manually: + +$ make clean ; make + +If you want remove the generated HTML files you need to perform a more +thorough cleanse: + +$ make distclean + +Unfortunately this also removes the Makefile, so you have to go through +the ./configure steps again to regenerate the Makefile. + diff --git a/gnome-doc-utils.make b/gnome-doc-utils.make new file mode 100644 index 0000000..726c5b8 --- /dev/null +++ b/gnome-doc-utils.make @@ -0,0 +1,706 @@ +# gnome-doc-utils.make - make magic for building documentation +# Copyright (C) 2004-2005 Shaun McCance +# +# 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., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. +# +# As a special exception to the GNU General Public License, if you +# distribute this file as part of a program that contains a +# configuration script generated by Autoconf, you may include it under +# the same distribution terms that you use for the rest of that program. + +################################################################################ +## @@ Generating Header Files + +## @ DOC_H_FILE +## The name of the header file to generate +DOC_H_FILE ?= + +## @ DOC_H_DOCS +## The input DocBook files for generating the header file +DOC_H_DOCS ?= + +$(DOC_H_FILE): $(DOC_H_DOCS); + @rm -f $@.tmp; touch $@.tmp; + echo 'const gchar* documentation_credits[] = {' >> $@.tmp + list='$(DOC_H_DOCS)'; for doc in $$list; do \ + xmlpath="`echo $$doc | sed -e 's/^\(.*\/\).*/\1/' -e '/\//!s/.*//'`:$(srcdir)/`echo $$doc | sed -e 's/^\(.*\/\).*/\1/' -e '/\//!s/.*//'`"; \ + if ! test -f "$$doc"; then doc="$(srcdir)/$$doc"; fi; \ + xsltproc --path "$$xmlpath" $(_credits) $$doc; \ + done | sort | uniq \ + | awk 'BEGIN{s=""}{n=split($$0,w,"<");if(s!=""&&s!=substr(w[1],1,length(w[1])-1)){print s};if(n>1){print $$0;s=""}else{s=$$0}};END{if(s!=""){print s}}' \ + | sed -e 's/\\/\\\\/' -e 's/"/\\"/' -e 's/\(.*\)/\t"\1",/' >> $@.tmp + echo ' NULL' >> $@.tmp + echo '};' >> $@.tmp + echo >> $@.tmp + list='$(DOC_H_DOCS)'; for doc in $$list; do \ + xmlpath="`echo $$doc | sed -e 's/^\(.*\/\).*/\1/' -e '/\//!s/.*//'`:$(srcdir)/`echo $$doc | sed -e 's/^\(.*\/\).*/\1/' -e '/\//!s/.*//'`"; \ + if ! test -f "$$doc"; then doc="$(srcdir)/$$doc"; fi; \ + docid=`echo "$$doc" | sed -e 's/.*\/\([^/]*\)\.xml/\1/' \ + | sed -e 's/[^a-zA-Z_]/_/g' | tr 'a-z' 'A-Z'`; \ + echo $$xmlpath; \ + ids=`xsltproc --xinclude --path "$$xmlpath" $(_ids) $$doc`; \ + for id in $$ids; do \ + echo '#define HELP_'`echo $$docid`'_'`echo $$id \ + | sed -e 's/[^a-zA-Z_]/_/g' | tr 'a-z' 'A-Z'`' "'$$id'"' >> $@.tmp; \ + done; \ + echo >> $@.tmp; \ + done; + cp $@.tmp $@ && rm -f $@.tmp + +dist-check-gdu: +if !HAVE_GNOME_DOC_UTILS + @echo "*** GNOME Doc Utils must be installed in order to make dist" + @false +endif + +.PHONY: dist-doc-header +dist-doc-header: $(DOC_H_FILE) + @if test -f "$(DOC_H_FILE)"; then d=; else d="$(srcdir)/"; fi; \ + echo "$(INSTALL_DATA) $${d}$(DOC_H_FILE) $(distdir)/$(DOC_H_FILE)"; \ + $(INSTALL_DATA) "$${d}$(DOC_H_FILE)" "$(distdir)/$(DOC_H_FILE)"; + +doc-dist-hook: dist-check-gdu $(if $(DOC_H_FILE),dist-doc-header) + +.PHONY: clean-doc-header +_clean_doc_header = $(if $(DOC_H_FILE),clean-doc-header) +clean-local: $(_clean_doc_header) +distclean-local: $(_clean_doc_header) +mostlyclean-local: $(_clean_doc_header) +maintainer-clean-local: $(_clean_doc_header) +clean-doc-header: + rm -f $(DOC_H_FILE) + +all: $(DOC_H_FILE) + + +################################################################################ +## @@ Generating Documentation Files + +## @ DOC_MODULE +## The name of the document being built +DOC_MODULE ?= + +## @ DOC_ID +## The unique identifier for a Mallard document +DOC_ID ?= + +## @ DOC_PAGES +## Page files in a Mallard document +DOC_PAGES ?= + +## @ DOC_ENTITIES +## Files included with a SYSTEM entity +DOC_ENTITIES ?= + +## @ DOC_INCLUDES +## Files included with XInclude +DOC_INCLUDES ?= + +## @ DOC_FIGURES +## Figures and other external data +DOC_FIGURES ?= + +## @ DOC_FORMATS +## The default formats to be built and installed +DOC_FORMATS ?= docbook +_DOC_REAL_FORMATS = $(if $(DOC_USER_FORMATS),$(DOC_USER_FORMATS),$(DOC_FORMATS)) + +## @ DOC_LINGUAS +## The languages this document is translated into +DOC_LINGUAS ?= +_DOC_REAL_LINGUAS = $(if $(filter environment,$(origin LINGUAS)), \ + $(filter $(LINGUAS),$(DOC_LINGUAS)), \ + $(DOC_LINGUAS)) + +_DOC_ABS_SRCDIR = @abs_srcdir@ + + +################################################################################ +## Variables for Bootstrapping + +_xml2po ?= `which xml2po` +_xml2po_mode = $(if $(DOC_ID),mallard,docbook) + +_db2html ?= `$(PKG_CONFIG) --variable db2html gnome-doc-utils` +_db2omf ?= `$(PKG_CONFIG) --variable db2omf gnome-doc-utils` +_chunks ?= `$(PKG_CONFIG) --variable xmldir gnome-doc-utils`/gnome/xslt/docbook/utils/chunks.xsl +_credits ?= `$(PKG_CONFIG) --variable xmldir gnome-doc-utils`/gnome/xslt/docbook/utils/credits.xsl +_ids ?= $(shell $(PKG_CONFIG) --variable xmldir gnome-doc-utils)/gnome/xslt/docbook/utils/ids.xsl + +if ENABLE_SK +_ENABLE_SK = true +_skpkgdatadir ?= `scrollkeeper-config --pkgdatadir` +_sklocalstatedir ?= `scrollkeeper-config --pkglocalstatedir` +_skcontentslist ?= $(_skpkgdatadir)/Templates/C/scrollkeeper_cl.xml +endif + + +################################################################################ +## Support for automake silent-rules +GDU_V_XML2PO=$(GDU__v_XML2PO_$(V)) +GDU__v_XML2PO_=$(GDU__v_XML2PO_$(AM_DEFAULT_VERBOSITY)) +GDU__v_XML2PO_0=@echo " XML2PO" $@; + +GDU_V_MSGFMT=$(GDU__v_MSGFMT_$(V)) +GDU__v_MSGFMT_=$(GDU__v_MSGFMT_$(AM_DEFAULT_VERBOSITY)) +GDU__v_MSGFMT_0=@echo " MSGFMT" $@; + +GDU_V_DB2OMF=$(GDU__v_DB2OMF_$(V)) +GDU__v_DB2OMF_=$(GDU__v_DB2OMF_$(AM_DEFAULT_VERBOSITY)) +GDU__v_DB2OMF_0=@echo " DB2OMF" $@; + +GDU_V_DB2HTM=$(GDU__v_DB2HTM_$(V)) +GDU__v_DB2HTM_=$(GDU__v_DB2HTM_$(AM_DEFAULT_VERBOSITY)) +GDU__v_DB2HTM_0=@echo " DB2HTM" $@; + +################################################################################ +## @@ Rules for OMF Files + +db2omf_args = \ + --stringparam db2omf.basename $(DOC_MODULE) \ + --stringparam db2omf.format $(3) \ + --stringparam db2omf.dtd \ + $(shell xmllint --format $(2) | grep -h PUBLIC | head -n 1 \ + | sed -e 's/.*PUBLIC \(\"[^\"]*\"\).*/\1/') \ + --stringparam db2omf.lang $(notdir $(patsubst %/$(notdir $(2)),%,$(2))) \ + --stringparam db2omf.omf_dir "$(OMF_DIR)" \ + --stringparam db2omf.help_dir "$(HELP_DIR)" \ + --stringparam db2omf.omf_in "$(_DOC_OMF_IN)" \ + $(if $(_ENABLE_SK), \ + --stringparam db2omf.scrollkeeper_cl "$(_skcontentslist)") \ + $(_db2omf) $(2) + +## @ _DOC_OMF_IN +## The OMF input file +_DOC_OMF_IN = $(if $(DOC_MODULE),$(wildcard $(_DOC_ABS_SRCDIR)/$(DOC_MODULE).omf.in)) + +## @ _DOC_OMF_DB +## The OMF files for DocBook output +_DOC_OMF_DB = $(if $(_DOC_OMF_IN), \ + $(foreach lc,C $(_DOC_REAL_LINGUAS),$(DOC_MODULE)-$(lc).omf)) + +$(_DOC_OMF_DB) : $(_DOC_OMF_IN) +$(_DOC_OMF_DB) : $(DOC_MODULE)-%.omf : %/$(DOC_MODULE).xml + @test "x$(_ENABLE_SK)" != "xtrue" -o -f "$(_skcontentslist)" || { \ + echo "The file '$(_skcontentslist)' does not exist." >&2; \ + echo "Please check your ScrollKeeper installation." >&2; \ + exit 1; } + $(GDU_V_DB2OMF)xsltproc -o $@ $(call db2omf_args,$@,$<,'docbook') || { rm -f "$@"; exit 1; } + +## @ _DOC_OMF_HTML +## The OMF files for HTML output +_DOC_OMF_HTML = $(if $(_DOC_OMF_IN), \ + $(foreach lc,C $(_DOC_REAL_LINGUAS),$(DOC_MODULE)-html-$(lc).omf)) + +$(_DOC_OMF_HTML) : $(_DOC_OMF_IN) +$(_DOC_OMF_HTML) : $(DOC_MODULE)-html-%.omf : %/$(DOC_MODULE).xml +if ENABLE_SK + @test "x$(_ENABLE_SK)" != "xtrue" -o -f "$(_skcontentslist)" || { \ + echo "The file '$(_skcontentslist)' does not exist" >&2; \ + echo "Please check your ScrollKeeper installation." >&2; \ + exit 1; } +endif + $(GDU_V_DB2OMF)xsltproc -o $@ $(call db2omf_args,$@,$<,'xhtml') || { rm -f "$@"; exit 1; } + +## @ _DOC_OMF_ALL +## All OMF output files to be built +# FIXME +_DOC_OMF_ALL = \ + $(if $(filter docbook,$(_DOC_REAL_FORMATS)),$(_DOC_OMF_DB)) \ + $(if $(filter html HTML,$(_DOC_REAL_FORMATS)),$(_DOC_OMF_HTML)) + +.PHONY: omf +omf: $(_DOC_OMF_ALL) + + +################################################################################ +## @@ C Locale Documents + +## @ _DOC_C_MODULE +## The top-level documentation file in the C locale +_DOC_C_MODULE = $(if $(DOC_MODULE),C/$(DOC_MODULE).xml) + +## @ _DOC_C_PAGES +## Page files in a Mallard document in the C locale +_DOC_C_PAGES = $(foreach page,$(DOC_PAGES),C/$(page)) + +## @ _DOC_C_ENTITIES +## Files included with a SYSTEM entity in the C locale +_DOC_C_ENTITIES = $(foreach ent,$(DOC_ENTITIES),C/$(ent)) + +## @ _DOC_C_XINCLUDES +## Files included with XInclude in the C locale +_DOC_C_INCLUDES = $(foreach inc,$(DOC_INCLUDES),C/$(inc)) + +## @ _DOC_C_DOCS +## All documentation files in the C locale +_DOC_C_DOCS = \ + $(_DOC_C_ENTITIES) $(_DOC_C_INCLUDES) \ + $(_DOC_C_PAGES) $(_DOC_C_MODULE) + +## @ _DOC_C_DOCS_NOENT +## All documentation files in the C locale, +## except files included with a SYSTEM entity +_DOC_C_DOCS_NOENT = \ + $(_DOC_C_MODULE) $(_DOC_C_INCLUDES) \ + $(_DOC_C_PAGES) + +## @ _DOC_C_FIGURES +## All figures and other external data in the C locale +_DOC_C_FIGURES = $(if $(DOC_FIGURES), \ + $(foreach fig,$(DOC_FIGURES),C/$(fig)), \ + $(patsubst $(srcdir)/%,%,$(wildcard $(srcdir)/C/figures/*.png))) + +## @ _DOC_C_HTML +## All HTML documentation in the C locale +# FIXME: probably have to shell escape to determine the file names +_DOC_C_HTML = $(foreach f, \ + $(shell xsltproc --xinclude \ + --stringparam db.chunk.basename "$(DOC_MODULE)" \ + $(_chunks) "C/$(DOC_MODULE).xml"), \ + C/$(f).xhtml) + +############################################################################### +## @@ Other Locale Documentation + +## @ _DOC_POFILES +## The .po files used for translating the document +_DOC_POFILES = $(if $(DOC_MODULE)$(DOC_ID), \ + $(foreach lc,$(_DOC_REAL_LINGUAS),$(lc)/$(lc).po)) + +.PHONY: po +po: $(_DOC_POFILES) + +## @ _DOC_MOFILES +## The .mo files used for translating the document +_DOC_MOFILES = $(patsubst %.po,%.mo,$(_DOC_POFILES)) + +.PHONY: mo +mo: $(_DOC_MOFILES) + +## @ _DOC_LC_MODULES +## The top-level documentation files in all other locales +_DOC_LC_MODULES = $(if $(DOC_MODULE), \ + $(foreach lc,$(_DOC_REAL_LINGUAS),$(lc)/$(DOC_MODULE).xml)) + +## @ _DOC_LC_PAGES +## Page files in a Mallard document in all other locales +_DOC_LC_PAGES = \ + $(foreach lc,$(_DOC_REAL_LINGUAS),$(foreach page,$(_DOC_C_PAGES), \ + $(lc)/$(notdir $(page)) )) + +## @ _DOC_LC_XINCLUDES +## Files included with XInclude in all other locales +_DOC_LC_INCLUDES = \ + $(foreach lc,$(_DOC_REAL_LINGUAS),$(foreach inc,$(_DOC_C_INCLUDES), \ + $(lc)/$(notdir $(inc)) )) + +## @ _DOC_LC_HTML +## All HTML documentation in all other locales +# FIXME: probably have to shell escape to determine the file names +_DOC_LC_HTML = \ + $(foreach lc,$(_DOC_REAL_LINGUAS),$(foreach doc,$(_DOC_C_HTML), \ + $(lc)/$(notdir $(doc)) )) + +## @ _DOC_LC_DOCS +## All documentation files in all other locales +_DOC_LC_DOCS = \ + $(_DOC_LC_MODULES) $(_DOC_LC_INCLUDES) $(_DOC_LC_PAGES) \ + $(if $(filter html HTML,$(_DOC_REAL_FORMATS)),$(_DOC_LC_HTML)) + +## @ _DOC_LC_FIGURES +## All figures and other external data in all other locales +_DOC_LC_FIGURES = $(foreach lc,$(_DOC_REAL_LINGUAS), \ + $(patsubst C/%,$(lc)/%,$(_DOC_C_FIGURES)) ) + +_DOC_SRC_FIGURES = \ + $(foreach fig,$(_DOC_C_FIGURES), $(foreach lc,C $(_DOC_REAL_LINGUAS), \ + $(wildcard $(srcdir)/$(lc)/$(patsubst C/%,%,$(fig))) )) + +$(_DOC_POFILES): + @if ! test -d $(dir $@); then \ + echo "mkdir $(dir $@)"; \ + mkdir "$(dir $@)"; \ + fi + @if test ! -f $@ -a -f $(srcdir)/$@; then \ + echo "cp $(srcdir)/$@ $@"; \ + cp "$(srcdir)/$@" "$@"; \ + fi; + @docs=; \ + list='$(_DOC_C_DOCS_NOENT)'; for doc in $$list; do \ + docs="$$docs $(_DOC_ABS_SRCDIR)/$$doc"; \ + done; \ + if ! test -f $@; then \ + echo "(cd $(dir $@) && \ + $(_xml2po) -m $(_xml2po_mode) -e $$docs > $(notdir $@).tmp && \ + cp $(notdir $@).tmp $(notdir $@) && rm -f $(notdir $@).tmp)"; \ + (cd $(dir $@) && \ + $(_xml2po) -m $(_xml2po_mode) -e $$docs > $(notdir $@).tmp && \ + cp $(notdir $@).tmp $(notdir $@) && rm -f $(notdir $@).tmp); \ + else \ + echo "(cd $(dir $@) && \ + $(_xml2po) -m $(_xml2po_mode) -e -u $(notdir $@) $$docs)"; \ + (cd $(dir $@) && \ + $(_xml2po) -m $(_xml2po_mode) -e -u $(notdir $@) $$docs); \ + fi + +$(_DOC_MOFILES): %.mo: %.po + $(AM_V_at)if ! test -d $(dir $@); then mkdir "$(dir $@)"; fi + $(GDU_V_MSGFMT)msgfmt -o $@ $< + +# FIXME: fix the dependancy +# FIXME: hook xml2po up +$(_DOC_LC_DOCS) : $(_DOC_MOFILES) +$(_DOC_LC_DOCS) : $(_DOC_C_DOCS) + $(AM_V_at)if ! test -d $(dir $@); then mkdir $(dir $@); fi + $(GDU_V_XML2PO)if [ -f "C/$(notdir $@)" ]; then d="../"; else d="$(_DOC_ABS_SRCDIR)/"; fi; \ + mo="$(dir $@)$(patsubst %/$(notdir $@),%,$@).mo"; \ + if [ -f "$${mo}" ]; then mo="../$${mo}"; else mo="$(_DOC_ABS_SRCDIR)/$${mo}"; fi; \ + (cd $(dir $@) && \ + $(_xml2po) -m $(_xml2po_mode) -e -t "$${mo}" \ + "$${d}C/$(notdir $@)" > $(notdir $@).tmp && \ + cp $(notdir $@).tmp $(notdir $@) && rm -f $(notdir $@).tmp) + +## @ _DOC_POT +## A pot file +_DOC_POT = $(if $(DOC_MODULE),$(DOC_MODULE).pot,$(if $(DOC_ID),$(DOC_ID).pot)) +.PHONY: pot +pot: $(_DOC_POT) +$(_DOC_POT): $(_DOC_C_DOCS_NOENT) + $(GDU_V_XML2PO)$(_xml2po) -m $(_xml2po_mode) -e -o $@ $^ + + +################################################################################ +## @@ All Documentation + +## @ _DOC_HTML_ALL +## All HTML documentation, only if it's built +_DOC_HTML_ALL = $(if $(filter html HTML,$(_DOC_REAL_FORMATS)), \ + $(_DOC_C_HTML) $(_DOC_LC_HTML)) + +_DOC_HTML_TOPS = $(foreach lc,C $(_DOC_REAL_LINGUAS),$(lc)/$(DOC_MODULE).xhtml) + +$(_DOC_HTML_TOPS): $(_DOC_C_DOCS) $(_DOC_LC_DOCS) + $(GDU_V_DB2HTM)xsltproc -o $@ --xinclude --param db.chunk.chunk_top "false()" --stringparam db.chunk.basename "$(DOC_MODULE)" --stringparam db.chunk.extension ".xhtml" $(_db2html) $(patsubst %.xhtml,%.xml,$@) + + +################################################################################ +## All + +all: \ + $(_DOC_C_DOCS) $(_DOC_LC_DOCS) \ + $(_DOC_OMF_ALL) $(_DOC_DSK_ALL) \ + $(_DOC_HTML_ALL) $(_DOC_POFILES) + + +################################################################################ +## Clean + +.PHONY: clean-doc-omf clean-doc-dsk clean-doc-lc clean-doc-dir + +clean-doc-omf: ; rm -f $(_DOC_OMF_DB) $(_DOC_OMF_HTML) +clean-doc-dsk: ; rm -f $(_DOC_DSK_DB) $(_DOC_DSK_HTML) +clean-doc-lc: + rm -f $(_DOC_LC_DOCS) + rm -f $(_DOC_MOFILES) + @list='$(_DOC_POFILES)'; for po in $$list; do \ + if ! test "$$po" -ef "$(srcdir)/$$po"; then \ + echo "rm -f $$po"; \ + rm -f "$$po"; \ + fi; \ + done +# .xml2.po.mo cleaning is obsolete as of 0.18.1 and could be removed in 0.20.x + @for lc in C $(_DOC_REAL_LINGUAS); do \ + if test -f "$$lc/.xml2po.mo"; then \ + echo "rm -f $$lc/.xml2po.mo"; \ + rm -f "$$lc/.xml2po.mo"; \ + fi; \ + done +clean-doc-dir: clean-doc-lc + @for lc in C $(_DOC_REAL_LINGUAS); do \ + for dir in `find $$lc -depth -type d`; do \ + if ! test $$dir -ef $(srcdir)/$$dir; then \ + echo "rmdir $$dir"; \ + rmdir "$$dir"; \ + fi; \ + done; \ + done + +_clean_omf = $(if $(_DOC_OMF_IN),clean-doc-omf) +_clean_dsk = $(if $(_DOC_DSK_IN),clean-doc-dsk) +_clean_lc = $(if $(_DOC_REAL_LINGUAS),clean-doc-lc) +_clean_dir = $(if $(DOC_MODULE)$(DOC_ID),clean-doc-dir) + +clean-local: \ + $(_clean_omf) $(_clean_dsk) \ + $(_clean_lc) $(_clean_dir) +distclean-local: \ + $(_clean_omf) $(_clean_dsk) \ + $(_clean_lc) $(_clean_dir) +mostlyclean-local: \ + $(_clean_omf) $(_clean_dsk) \ + $(_clean_lc) $(_clean_dir) +maintainer-clean-local: \ + $(_clean_omf) $(_clean_dsk) \ + $(_clean_lc) $(_clean_dir) + + + +################################################################################ +## Dist + +.PHONY: dist-doc-docs dist-doc-pages dist-doc-figs dist-doc-omf dist-doc-dsk +doc-dist-hook: \ + $(if $(DOC_MODULE)$(DOC_ID),dist-doc-docs) \ + $(if $(_DOC_C_FIGURES),dist-doc-figs) \ + $(if $(_DOC_OMF_IN),dist-doc-omf) +# $(if $(_DOC_DSK_IN),dist-doc-dsk) + +dist-doc-docs: $(_DOC_C_DOCS) $(_DOC_LC_DOCS) $(_DOC_POFILES) + @for lc in C $(_DOC_REAL_LINGUAS); do \ + echo " $(mkinstalldirs) $(distdir)/$$lc"; \ + $(mkinstalldirs) "$(distdir)/$$lc"; \ + done + @list='$(_DOC_C_DOCS)'; \ + for doc in $$list; do \ + if test -f "$$doc"; then d=; else d="$(srcdir)/"; fi; \ + docdir=`echo $$doc | sed -e 's/^\(.*\/\).*/\1/' -e '/\//!s/.*//'`; \ + if ! test -d "$(distdir)/$$docdir"; then \ + echo "$(mkinstalldirs) $(distdir)/$$docdir"; \ + $(mkinstalldirs) "$(distdir)/$$docdir"; \ + fi; \ + echo "$(INSTALL_DATA) $$d$$doc $(distdir)/$$doc"; \ + $(INSTALL_DATA) "$$d$$doc" "$(distdir)/$$doc"; \ + done + @list='$(_DOC_LC_DOCS)'; \ + for doc in $$list; do \ + if test -f "$$doc"; then d=; else d="$(srcdir)/"; fi; \ + docdir=`echo $$doc | sed -e 's/^\(.*\/\).*/\1/' -e '/\//!s/.*//'`; \ + if ! test -d "$(distdir)/$$docdir"; then \ + echo "$(mkinstalldirs) $(distdir)/$$docdir"; \ + $(mkinstalldirs) "$(distdir)/$$docdir"; \ + fi; \ + echo "$(INSTALL_DATA) $$d$$doc $(distdir)/$$doc"; \ + $(INSTALL_DATA) "$$d$$doc" "$(distdir)/$$doc"; \ + done + @list='$(_DOC_POFILES)'; \ + for doc in $$list; do \ + if test -f "$$doc"; then d=; else d="$(srcdir)/"; fi; \ + docdir=`echo $$doc | sed -e 's/^\(.*\/\).*/\1/' -e '/\//!s/.*//'`; \ + if ! test -d "$(distdir)/$$docdir"; then \ + echo "$(mkinstalldirs) $(distdir)/$$docdir"; \ + $(mkinstalldirs) "$(distdir)/$$docdir"; \ + fi; \ + echo "$(INSTALL_DATA) $$d$$doc $(distdir)/$$doc"; \ + $(INSTALL_DATA) "$$d$$doc" "$(distdir)/$$doc"; \ + done + +dist-doc-figs: $(_DOC_SRC_FIGURES) + @list='$(_DOC_C_FIGURES) $(_DOC_LC_FIGURES)'; \ + for fig in $$list; do \ + if test -f "$$fig"; then d=; else d="$(srcdir)/"; fi; \ + if test -f "$$d$$fig"; then \ + figdir=`echo $$fig | sed -e 's/^\(.*\/\).*/\1/' -e '/\//!s/.*//'`; \ + if ! test -d "$(distdir)/$$figdir"; then \ + echo "$(mkinstalldirs) $(distdir)/$$figdir"; \ + $(mkinstalldirs) "$(distdir)/$$figdir"; \ + fi; \ + echo "$(INSTALL_DATA) $$d$$fig $(distdir)/$$fig"; \ + $(INSTALL_DATA) "$$d$$fig" "$(distdir)/$$fig"; \ + fi; \ + done; + +dist-doc-omf: + @if test -f "$(_DOC_OMF_IN)"; then d=; else d="$(srcdir)/"; fi; \ + echo "$(INSTALL_DATA) $$d$(_DOC_OMF_IN) $(distdir)/$(notdir $(_DOC_OMF_IN))"; \ + $(INSTALL_DATA) "$$d$(_DOC_OMF_IN)" "$(distdir)/$(notdir $(_DOC_OMF_IN))" + +dist-doc-dsk: + @if test -f "$(_DOC_DSK_IN)"; then d=; else d="$(srcdir)/"; fi; \ + echo "$(INSTALL_DATA) $$d$(_DOC_DSK_IN) $(distdir)/$(notdir $(_DOC_DSK_IN))"; \ + $(INSTALL_DATA) "$$d$(_DOC_DSK_IN)" "$(distdir)/$(notdir $(_DOC_DSK_IN))" + + + +################################################################################ +## Check + +.PHONY: check-doc-docs check-doc-omf +check: \ + $(if $(DOC_MODULE),check-doc-docs) \ + $(if $(DOC_ID),check-doc-pages) \ + $(if $(_DOC_OMF_IN),check-doc-omf) + +check-doc-docs: $(_DOC_C_DOCS) $(_DOC_LC_DOCS) + @for lc in C $(_DOC_REAL_LINGUAS); do \ + if test -f "$$lc"; \ + then d=; \ + xmlpath="$$lc"; \ + else \ + d="$(srcdir)/"; \ + xmlpath="$$lc:$(srcdir)/$$lc"; \ + fi; \ + echo "xmllint --noout --noent --path $$xmlpath --xinclude --postvalid $$d$$lc/$(DOC_MODULE).xml"; \ + xmllint --noout --noent --path "$$xmlpath" --xinclude --postvalid "$$d$$lc/$(DOC_MODULE).xml"; \ + done + +check-doc-pages: $(_DOC_C_PAGES) $(_DOC_LC_PAGES) + for lc in C $(_DOC_REAL_LINGUAS); do \ + if test -f "$$lc"; \ + then d=; \ + xmlpath="$$lc"; \ + else \ + d="$(srcdir)/"; \ + xmlpath="$$lc:$(srcdir)/$$lc"; \ + fi; \ + for page in $(DOC_PAGES); do \ + echo "xmllint --noout --noent --path $$xmlpath --xinclude $$d$$lc/$$page"; \ + xmllint --noout --noent --path "$$xmlpath" --xinclude "$$d$$lc/$$page"; \ + done; \ + done + +check-doc-omf: $(_DOC_OMF_ALL) + @list='$(_DOC_OMF_ALL)'; for omf in $$list; do \ + echo "xmllint --noout --xinclude --dtdvalid 'http://scrollkeeper.sourceforge.net/dtds/scrollkeeper-omf-1.0/scrollkeeper-omf.dtd' $$omf"; \ + xmllint --noout --xinclude --dtdvalid 'http://scrollkeeper.sourceforge.net/dtds/scrollkeeper-omf-1.0/scrollkeeper-omf.dtd' $$omf; \ + done + + + +################################################################################ +## Install + +.PHONY: install-doc-docs install-doc-html install-doc-figs install-doc-omf install-doc-dsk + +_doc_install_dir = $(if $(DOC_ID),$(DOC_ID),$(DOC_MODULE)) + +install-data-local: \ + $(if $(DOC_MODULE)$(DOC_ID),install-doc-docs) \ + $(if $(_DOC_HTML_ALL),install-doc-html) \ + $(if $(_DOC_C_FIGURES),install-doc-figs) \ + $(if $(_DOC_OMF_IN),install-doc-omf) +# $(if $(_DOC_DSK_IN),install-doc-dsk) + +install-doc-docs: + @for lc in C $(_DOC_REAL_LINGUAS); do \ + echo "$(mkinstalldirs) $(DESTDIR)$(HELP_DIR)/$(_doc_install_dir)/$$lc"; \ + $(mkinstalldirs) $(DESTDIR)$(HELP_DIR)/$(_doc_install_dir)/$$lc; \ + done + @list='$(_DOC_C_DOCS)'; for doc in $$list; do \ + if test -f "$$doc"; then d=; else d="$(srcdir)/"; fi; \ + docdir="$$lc/"`echo $$doc | sed -e 's/^\(.*\/\).*/\1/' -e '/\//!s/.*//'`; \ + docdir="$(DESTDIR)$(HELP_DIR)/$(_doc_install_dir)/$$docdir"; \ + if ! test -d "$$docdir"; then \ + echo "$(mkinstalldirs) $$docdir"; \ + $(mkinstalldirs) "$$docdir"; \ + fi; \ + echo "$(INSTALL_DATA) $$d$$doc $(DESTDIR)$(HELP_DIR)/$(_doc_install_dir)/$$doc"; \ + $(INSTALL_DATA) $$d$$doc $(DESTDIR)$(HELP_DIR)/$(_doc_install_dir)/$$doc; \ + done + @list='$(_DOC_LC_DOCS)'; for doc in $$list; do \ + if test -f "$$doc"; then d=; else d="$(srcdir)/"; fi; \ + docdir="$$lc/"`echo $$doc | sed -e 's/^\(.*\/\).*/\1/' -e '/\//!s/.*//'`; \ + docdir="$(DESTDIR)$(HELP_DIR)/$(_doc_install_dir)/$$docdir"; \ + if ! test -d "$$docdir"; then \ + echo "$(mkinstalldirs) $$docdir"; \ + $(mkinstalldirs) "$$docdir"; \ + fi; \ + echo "$(INSTALL_DATA) $$d$$doc $(DESTDIR)$(HELP_DIR)/$(_doc_install_dir)/$$doc"; \ + $(INSTALL_DATA) $$d$$doc $(DESTDIR)$(HELP_DIR)/$(_doc_install_dir)/$$doc; \ + done + +install-doc-figs: + @list='$(patsubst C/%,%,$(_DOC_C_FIGURES))'; for fig in $$list; do \ + for lc in C $(_DOC_REAL_LINGUAS); do \ + figsymlink=false; \ + if test -f "$$lc/$$fig"; then \ + figfile="$$lc/$$fig"; \ + elif test -f "$(srcdir)/$$lc/$$fig"; then \ + figfile="$(srcdir)/$$lc/$$fig"; \ + else \ + figsymlink=true; \ + fi; \ + figdir="$$lc/"`echo $$fig | sed -e 's/^\(.*\/\).*/\1/' -e '/\//!s/.*//'`; \ + figdir="$(DESTDIR)$(HELP_DIR)/$(_doc_install_dir)/$$figdir"; \ + if ! test -d "$$figdir"; then \ + echo "$(mkinstalldirs) $$figdir"; \ + $(mkinstalldirs) "$$figdir"; \ + fi; \ + figbase=`echo $$fig | sed -e 's/^.*\///'`; \ + if $$figsymlink; then \ + echo "cd $$figdir && $(LN_S) -f ../../C/$$fig $$figbase"; \ + ( cd "$$figdir" && $(LN_S) -f "../../C/$$fig" "$$figbase" ); \ + else \ + echo "$(INSTALL_DATA) $$figfile $$figdir$$figbase"; \ + $(INSTALL_DATA) "$$figfile" "$$figdir$$figbase"; \ + fi; \ + done; \ + done + +install-doc-html: + echo install-html + +install-doc-omf: + $(mkinstalldirs) $(DESTDIR)$(OMF_DIR)/$(_doc_install_dir) + @list='$(_DOC_OMF_ALL)'; for omf in $$list; do \ + echo "$(INSTALL_DATA) $$omf $(DESTDIR)$(OMF_DIR)/$(_doc_install_dir)/$$omf"; \ + $(INSTALL_DATA) $$omf $(DESTDIR)$(OMF_DIR)/$(_doc_install_dir)/$$omf; \ + done + @if test "x$(_ENABLE_SK)" = "xtrue"; then \ + echo "scrollkeeper-update -p $(DESTDIR)$(_sklocalstatedir) -o $(DESTDIR)$(OMF_DIR)/$(_doc_install_dir)"; \ + scrollkeeper-update -p "$(DESTDIR)$(_sklocalstatedir)" -o "$(DESTDIR)$(OMF_DIR)/$(_doc_install_dir)"; \ + fi; + +install-doc-dsk: + echo install-dsk + + + +################################################################################ +## Uninstall + +.PHONY: uninstall-doc-docs uninstall-doc-html uninstall-doc-figs uninstall-doc-omf uninstall-doc-dsk +uninstall-local: \ + $(if $(DOC_MODULE)$(DOC_ID),uninstall-doc-docs) \ + $(if $(_DOC_HTML_ALL),uninstall-doc-html) \ + $(if $(_DOC_C_FIGURES),uninstall-doc-figs) \ + $(if $(_DOC_OMF_IN),uninstall-doc-omf) +# $(if $(_DOC_DSK_IN),uninstall-doc-dsk) + +uninstall-doc-docs: + @list='$(_DOC_C_DOCS)'; for doc in $$list; do \ + echo " rm -f $(DESTDIR)$(HELP_DIR)/$(_doc_install_dir)/$$doc"; \ + rm -f "$(DESTDIR)$(HELP_DIR)/$(_doc_install_dir)/$$doc"; \ + done + @list='$(_DOC_LC_DOCS)'; for doc in $$list; do \ + echo " rm -f $(DESTDIR)$(HELP_DIR)/$(_doc_install_dir)/$$doc"; \ + rm -f "$(DESTDIR)$(HELP_DIR)/$(_doc_install_dir)/$$doc"; \ + done + +uninstall-doc-figs: + @list='$(_DOC_C_FIGURES) $(_DOC_LC_FIGURES)'; for fig in $$list; do \ + echo "rm -f $(DESTDIR)$(HELP_DIR)/$(_doc_install_dir)/$$fig"; \ + rm -f "$(DESTDIR)$(HELP_DIR)/$(_doc_install_dir)/$$fig"; \ + done; + +uninstall-doc-omf: + @list='$(_DOC_OMF_ALL)'; for omf in $$list; do \ + if test "x$(_ENABLE_SK)" = "xtrue"; then \ + echo "scrollkeeper-uninstall -p $(_sklocalstatedir) $(DESTDIR)$(OMF_DIR)/$(_doc_install_dir)/$$omf"; \ + scrollkeeper-uninstall -p "$(_sklocalstatedir)" "$(DESTDIR)$(OMF_DIR)/$(_doc_install_dir)/$$omf"; \ + fi; \ + echo "rm -f $(DESTDIR)$(OMF_DIR)/$(_doc_install_dir)/$$omf"; \ + rm -f "$(DESTDIR)$(OMF_DIR)/$(_doc_install_dir)/$$omf"; \ + done diff --git a/gtk-doc.make b/gtk-doc.make new file mode 100644 index 0000000..7d9a27f --- /dev/null +++ b/gtk-doc.make @@ -0,0 +1,321 @@ +# -*- mode: makefile -*- +# +# gtk-doc.make - make rules for gtk-doc +# Copyright (C) 2003 James Henstridge +# 2004-2007 Damon Chaplin +# 2007-2017 Stefan Sauer +# +# 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 3 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, see . + +#################################### +# Everything below here is generic # +#################################### + +if GTK_DOC_USE_LIBTOOL +GTKDOC_CC = $(LIBTOOL) --tag=CC --mode=compile $(CC) $(INCLUDES) $(GTKDOC_DEPS_CFLAGS) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) +GTKDOC_LD = $(LIBTOOL) --tag=CC --mode=link $(CC) $(GTKDOC_DEPS_LIBS) $(AM_CFLAGS) $(CFLAGS) $(AM_LDFLAGS) $(LDFLAGS) +GTKDOC_RUN = $(LIBTOOL) --mode=execute +else +GTKDOC_CC = $(CC) $(INCLUDES) $(GTKDOC_DEPS_CFLAGS) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) +GTKDOC_LD = $(CC) $(GTKDOC_DEPS_LIBS) $(AM_CFLAGS) $(CFLAGS) $(AM_LDFLAGS) $(LDFLAGS) +GTKDOC_RUN = +endif + +# We set GPATH here; this gives us semantics for GNU make +# which are more like other make's VPATH, when it comes to +# whether a source that is a target of one rule is then +# searched for in VPATH/GPATH. +# +GPATH = $(srcdir) + +TARGET_DIR=$(HTML_DIR)/$(DOC_MODULE) + +SETUP_FILES = \ + $(content_files) \ + $(expand_content_files) \ + $(DOC_MAIN_SGML_FILE) \ + $(DOC_MODULE)-sections.txt \ + $(DOC_MODULE)-overrides.txt + +EXTRA_DIST = \ + $(HTML_IMAGES) \ + $(SETUP_FILES) + +DOC_STAMPS=setup-build.stamp scan-build.stamp sgml-build.stamp \ + html-build.stamp pdf-build.stamp \ + sgml.stamp html.stamp pdf.stamp + +SCANOBJ_FILES = \ + $(DOC_MODULE).args \ + $(DOC_MODULE).hierarchy \ + $(DOC_MODULE).interfaces \ + $(DOC_MODULE).prerequisites \ + $(DOC_MODULE).signals + +REPORT_FILES = \ + $(DOC_MODULE)-undocumented.txt \ + $(DOC_MODULE)-undeclared.txt \ + $(DOC_MODULE)-unused.txt + +gtkdoc-check.test: Makefile + $(AM_V_GEN)echo "#!/bin/sh -e" > $@; \ + echo "$(GTKDOC_CHECK_PATH) || exit 1" >> $@; \ + chmod +x $@ + +CLEANFILES = $(SCANOBJ_FILES) $(REPORT_FILES) $(DOC_STAMPS) gtkdoc-check.test + +if GTK_DOC_BUILD_HTML +HTML_BUILD_STAMP=html-build.stamp +else +HTML_BUILD_STAMP= +endif +if GTK_DOC_BUILD_PDF +PDF_BUILD_STAMP=pdf-build.stamp +else +PDF_BUILD_STAMP= +endif + +all-gtk-doc: $(HTML_BUILD_STAMP) $(PDF_BUILD_STAMP) +.PHONY: all-gtk-doc + +if ENABLE_GTK_DOC +all-local: all-gtk-doc +endif + +docs: $(HTML_BUILD_STAMP) $(PDF_BUILD_STAMP) + +$(REPORT_FILES): sgml-build.stamp + +#### setup #### + +GTK_DOC_V_SETUP=$(GTK_DOC_V_SETUP_@AM_V@) +GTK_DOC_V_SETUP_=$(GTK_DOC_V_SETUP_@AM_DEFAULT_V@) +GTK_DOC_V_SETUP_0=@echo " DOC Preparing build"; + +setup-build.stamp: + -$(GTK_DOC_V_SETUP)if test "$(abs_srcdir)" != "$(abs_builddir)" ; then \ + files=`echo $(SETUP_FILES) $(DOC_MODULE).types`; \ + if test "x$$files" != "x" ; then \ + for file in $$files ; do \ + destdir=`dirname $(abs_builddir)/$$file`; \ + test -d "$$destdir" || mkdir -p "$$destdir"; \ + test -f $(abs_srcdir)/$$file && \ + cp -pf $(abs_srcdir)/$$file $(abs_builddir)/$$file || true; \ + done; \ + fi; \ + fi + $(AM_V_at)touch setup-build.stamp + +#### scan #### + +GTK_DOC_V_SCAN=$(GTK_DOC_V_SCAN_@AM_V@) +GTK_DOC_V_SCAN_=$(GTK_DOC_V_SCAN_@AM_DEFAULT_V@) +GTK_DOC_V_SCAN_0=@echo " DOC Scanning header files"; + +GTK_DOC_V_INTROSPECT=$(GTK_DOC_V_INTROSPECT_@AM_V@) +GTK_DOC_V_INTROSPECT_=$(GTK_DOC_V_INTROSPECT_@AM_DEFAULT_V@) +GTK_DOC_V_INTROSPECT_0=@echo " DOC Introspecting gobjects"; + +scan-build.stamp: setup-build.stamp $(HFILE_GLOB) $(CFILE_GLOB) + $(GTK_DOC_V_SCAN)_source_dir='' ; \ + for i in $(DOC_SOURCE_DIR) ; do \ + _source_dir="$${_source_dir} --source-dir=$$i" ; \ + done ; \ + gtkdoc-scan --module=$(DOC_MODULE) --ignore-headers="$(IGNORE_HFILES)" $${_source_dir} $(SCAN_OPTIONS) $(EXTRA_HFILES) + $(GTK_DOC_V_INTROSPECT)if grep -l '^..*$$' $(DOC_MODULE).types > /dev/null 2>&1 ; then \ + scanobj_options=""; \ + gtkdoc-scangobj 2>&1 --help | grep >/dev/null "\-\-verbose"; \ + if test "$$?" = "0"; then \ + if test "x$(V)" = "x1"; then \ + scanobj_options="--verbose"; \ + fi; \ + fi; \ + CC="$(GTKDOC_CC)" LD="$(GTKDOC_LD)" RUN="$(GTKDOC_RUN)" CFLAGS="$(GTKDOC_CFLAGS) $(CFLAGS)" LDFLAGS="$(GTKDOC_LIBS) $(LDFLAGS)" \ + gtkdoc-scangobj $(SCANGOBJ_OPTIONS) $$scanobj_options --module=$(DOC_MODULE); \ + else \ + for i in $(SCANOBJ_FILES) ; do \ + test -f $$i || touch $$i ; \ + done \ + fi + $(AM_V_at)touch scan-build.stamp + +$(DOC_MODULE)-decl.txt $(SCANOBJ_FILES) $(DOC_MODULE)-sections.txt $(DOC_MODULE)-overrides.txt: scan-build.stamp + @true + +#### xml #### + +GTK_DOC_V_XML=$(GTK_DOC_V_XML_@AM_V@) +GTK_DOC_V_XML_=$(GTK_DOC_V_XML_@AM_DEFAULT_V@) +GTK_DOC_V_XML_0=@echo " DOC Building XML"; + +sgml-build.stamp: setup-build.stamp $(DOC_MODULE)-decl.txt $(SCANOBJ_FILES) $(HFILE_GLOB) $(CFILE_GLOB) $(DOC_MODULE)-sections.txt $(DOC_MODULE)-overrides.txt $(expand_content_files) xml/gtkdocentities.ent + $(GTK_DOC_V_XML)_source_dir='' ; \ + for i in $(DOC_SOURCE_DIR) ; do \ + _source_dir="$${_source_dir} --source-dir=$$i" ; \ + done ; \ + gtkdoc-mkdb --module=$(DOC_MODULE) --output-format=xml --expand-content-files="$(expand_content_files)" --main-sgml-file=$(DOC_MAIN_SGML_FILE) $${_source_dir} $(MKDB_OPTIONS) + $(AM_V_at)touch sgml-build.stamp + +sgml.stamp: sgml-build.stamp + @true + +$(DOC_MAIN_SGML_FILE): sgml-build.stamp + @true + +xml/gtkdocentities.ent: Makefile + $(GTK_DOC_V_XML)$(MKDIR_P) $(@D) && ( \ + echo ""; \ + echo ""; \ + echo ""; \ + echo ""; \ + echo ""; \ + echo ""; \ + echo ""; \ + ) > $@ + +#### html #### + +GTK_DOC_V_HTML=$(GTK_DOC_V_HTML_@AM_V@) +GTK_DOC_V_HTML_=$(GTK_DOC_V_HTML_@AM_DEFAULT_V@) +GTK_DOC_V_HTML_0=@echo " DOC Building HTML"; + +GTK_DOC_V_XREF=$(GTK_DOC_V_XREF_@AM_V@) +GTK_DOC_V_XREF_=$(GTK_DOC_V_XREF_@AM_DEFAULT_V@) +GTK_DOC_V_XREF_0=@echo " DOC Fixing cross-references"; + +html-build.stamp: sgml.stamp $(DOC_MAIN_SGML_FILE) $(content_files) $(expand_content_files) + $(GTK_DOC_V_HTML)rm -rf html && mkdir html && \ + mkhtml_options=""; \ + gtkdoc-mkhtml 2>&1 --help | grep >/dev/null "\-\-verbose"; \ + if test "$$?" = "0"; then \ + if test "x$(V)" = "x1"; then \ + mkhtml_options="$$mkhtml_options --verbose"; \ + fi; \ + fi; \ + gtkdoc-mkhtml 2>&1 --help | grep >/dev/null "\-\-path"; \ + if test "$$?" = "0"; then \ + mkhtml_options="$$mkhtml_options --path=\"$(abs_srcdir)\""; \ + fi; \ + cd html && gtkdoc-mkhtml $$mkhtml_options $(MKHTML_OPTIONS) $(DOC_MODULE) ../$(DOC_MAIN_SGML_FILE) + -@test "x$(HTML_IMAGES)" = "x" || \ + for file in $(HTML_IMAGES) ; do \ + test -f $(abs_srcdir)/$$file && cp $(abs_srcdir)/$$file $(abs_builddir)/html; \ + test -f $(abs_builddir)/$$file && cp $(abs_builddir)/$$file $(abs_builddir)/html; \ + test -f $$file && cp $$file $(abs_builddir)/html; \ + done; + $(GTK_DOC_V_XREF)gtkdoc-fixxref --module=$(DOC_MODULE) --module-dir=html --html-dir=$(HTML_DIR) $(FIXXREF_OPTIONS) + $(AM_V_at)touch html-build.stamp + +#### pdf #### + +GTK_DOC_V_PDF=$(GTK_DOC_V_PDF_@AM_V@) +GTK_DOC_V_PDF_=$(GTK_DOC_V_PDF_@AM_DEFAULT_V@) +GTK_DOC_V_PDF_0=@echo " DOC Building PDF"; + +pdf-build.stamp: sgml.stamp $(DOC_MAIN_SGML_FILE) $(content_files) $(expand_content_files) + $(GTK_DOC_V_PDF)rm -f $(DOC_MODULE).pdf && \ + mkpdf_options=""; \ + gtkdoc-mkpdf 2>&1 --help | grep >/dev/null "\-\-verbose"; \ + if test "$$?" = "0"; then \ + if test "x$(V)" = "x1"; then \ + mkpdf_options="$$mkpdf_options --verbose"; \ + fi; \ + fi; \ + if test "x$(HTML_IMAGES)" != "x"; then \ + for img in $(HTML_IMAGES); do \ + part=`dirname $$img`; \ + echo $$mkpdf_options | grep >/dev/null "\-\-imgdir=$$part "; \ + if test $$? != 0; then \ + mkpdf_options="$$mkpdf_options --imgdir=$$part"; \ + fi; \ + done; \ + fi; \ + gtkdoc-mkpdf --path="$(abs_srcdir)" $$mkpdf_options $(DOC_MODULE) $(DOC_MAIN_SGML_FILE) $(MKPDF_OPTIONS) + $(AM_V_at)touch pdf-build.stamp + +############## + +clean-local: + @rm -f *~ *.bak + @rm -rf .libs + @if echo $(SCAN_OPTIONS) | grep -q "\-\-rebuild-types" ; then \ + rm -f $(DOC_MODULE).types; \ + fi + @if echo $(SCAN_OPTIONS) | grep -q "\-\-rebuild-sections" ; then \ + rm -f $(DOC_MODULE)-sections.txt; \ + fi + +distclean-local: + @rm -rf xml html $(REPORT_FILES) $(DOC_MODULE).pdf \ + $(DOC_MODULE)-decl-list.txt $(DOC_MODULE)-decl.txt + @if test "$(abs_srcdir)" != "$(abs_builddir)" ; then \ + rm -f $(SETUP_FILES) $(DOC_MODULE).types; \ + fi + +maintainer-clean-local: + @rm -rf xml html + +install-data-local: + @installfiles=`echo $(builddir)/html/*`; \ + if test "$$installfiles" = '$(builddir)/html/*'; \ + then echo 1>&2 'Nothing to install' ; \ + else \ + if test -n "$(DOC_MODULE_VERSION)"; then \ + installdir="$(DESTDIR)$(TARGET_DIR)-$(DOC_MODULE_VERSION)"; \ + else \ + installdir="$(DESTDIR)$(TARGET_DIR)"; \ + fi; \ + $(mkinstalldirs) $${installdir} ; \ + for i in $$installfiles; do \ + echo ' $(INSTALL_DATA) '$$i ; \ + $(INSTALL_DATA) $$i $${installdir}; \ + done; \ + if test -n "$(DOC_MODULE_VERSION)"; then \ + mv -f $${installdir}/$(DOC_MODULE).devhelp2 \ + $${installdir}/$(DOC_MODULE)-$(DOC_MODULE_VERSION).devhelp2; \ + fi; \ + $(GTKDOC_REBASE) --relative --dest-dir=$(DESTDIR) --html-dir=$${installdir}; \ + fi + +uninstall-local: + @if test -n "$(DOC_MODULE_VERSION)"; then \ + installdir="$(DESTDIR)$(TARGET_DIR)-$(DOC_MODULE_VERSION)"; \ + else \ + installdir="$(DESTDIR)$(TARGET_DIR)"; \ + fi; \ + rm -rf $${installdir} + +# +# Require gtk-doc when making dist +# +if HAVE_GTK_DOC +dist-check-gtkdoc: docs +else +dist-check-gtkdoc: + @echo "*** gtk-doc is needed to run 'make dist'. ***" + @echo "*** gtk-doc was not found when 'configure' ran. ***" + @echo "*** please install gtk-doc and rerun 'configure'. ***" + @false +endif + +dist-hook: dist-check-gtkdoc all-gtk-doc dist-hook-local + @mkdir $(distdir)/html + @cp ./html/* $(distdir)/html + @-cp ./$(DOC_MODULE).pdf $(distdir)/ + @-cp ./$(DOC_MODULE).types $(distdir)/ + @-cp ./$(DOC_MODULE)-sections.txt $(distdir)/ + @cd $(distdir) && rm -f $(DISTCLEANFILES) + @$(GTKDOC_REBASE) --online --relative --html-dir=$(distdir)/html + +.PHONY : dist-hook-local docs diff --git a/help/C/attribution.xml b/help/C/attribution.xml new file mode 100644 index 0000000..6bb0f8c --- /dev/null +++ b/help/C/attribution.xml @@ -0,0 +1,126 @@ + + + +
+Attributions + +This document contains licenses and notices for open source software used in this product. +The source code used in this product is available on the project website http://viking.sf.net + + +
+ coords.c + coords.h + Available under license: + +** Copyright © 2001 by Jef Poskanzer jef@acme.com. +** 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. + +
+ +
+ strtod.c + Source: + Available under license: + +// Copyright (C) 2002 Michael Ringgaard. 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. +// 3. Neither the name of the project nor the names of its contributors +// may be used to endorse or promote products derived from this software +// without specific prior written permission. +// +// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS 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 COPYRIGHT OWNER 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. + +
+ +
+ kdtree.c + kdtree.h - 0.5.6 + Source: + Available under license: + +Copyright (C) 2007-2011 John Tsiombikas nuclear@member.fsf.org + +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. +3. The name of the author may not be used to endorse or promote products + derived from this software without specific prior written permission. + +THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``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 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. + +
+ +
+ Data: cities15000.txt + Source: + This is used in a lookup of positions to timezones. + Unneccesary fields in the dataset (for Viking) have been removed and the resultant file is data/latlontz.txt + Available under license: + +This work is licensed under a Creative Commons Attribution 3.0 License, +see +The Data is provided "as is" without warranty or any representation of accuracy, timeliness or completeness. +
+ +
+ Data: Response to online request made in vikgoto.c + Use of geoPlugin services making use of geolocation data is under condition of acceptance of the Creative Commons Attribution-ShareAlike 3.0 Unported License. + This product includes GeoLite data created by MaxMind, available from . +
+ +
+ diff --git a/help/C/commandline.xml b/help/C/commandline.xml new file mode 100644 index 0000000..89eb33e --- /dev/null +++ b/help/C/commandline.xml @@ -0,0 +1,171 @@ + + + + ] +> +
+Command Line +
+Overview + +&appname; being a Graphical User Interface program only has a few command line options. + + + + + + &dhpackage; + program to manage GPS data + + + + &dhpackage; + + + + + + + + + + + degrees + + + degrees + + + + + ZoomLevelOSM + + + + MapId + + + file + + + &dhpackage; + + + + + + + &dhpackage; + + + + + + + + + + + +
+ +
Details + +Note that the ordering of files can be important depending on their file type. +Subsequent non Viking project files are loaded into the previous Viking project, with the files being processed left to right. +Some examples: + + +viking file1.gpx file2.gpx file3.gpx Here all GPX files are loaded into a new &appname; project in one window. +viking file1.vik file2.vik Each &appname; project file is opened in a new window. +viking file1.vik file2.gpx file3.gpx The GPX files are loaded into the &appname; project in one window. +viking file2.gpx file3.gpx file1.vik The GPX files are loaded into a new &appname; project in a one window and the &appname; project is loaded seperately in a seperate window. + + +Command Line Reference + + + + Short Option + Long Option + Description + + + + + -h + --help + Show the command line options and then exit. + + + -V + --verbose + Run in verbose mode. Some information about what &appname; is doing is shown in stdout. + + + -d + --debug + Run in debug mode. Even more information about what &appname; is doing is shown in stdout. +This also enables some extra information features in the GUI itself, primarily of interest to developers. + + + + -v + --version + Show the version and then exit. + + + N/A + --latitude + Set the initial position to the specified latitude in decimal degrees. + + + N/A + --longitude + Set the initial position to the specified longitude in decimal degrees. + + + -z + --zoom + Set the initial zoom level. The value is the OSM zoom level (0 - 22). + + + -m + --map + Add a map layer by specifying the map id. The value needs to match one of the internal ids or an id from the . + Specifying a value of 0 will use the configured map layer default. + + + +
+ + + Internal Map Ids: + OSM Mapnik = 13 + OSM Cycle = 17 + Mapquest OSM = 19 + + + +An example to open at a specified location with an OSM Mapnik map layer: +viking --latitude 51.4 --longitude -1.3 --zoom 12 --map 13 +If a file is also specified on the command line, the command line location and zoom parameters will take precendence. + + + + +As a special combination when both -V and -d are both enabled at the same time, &appname; will not delete some of the temporary files created during the program run. +This is especially useful to monitor results of download requests (which need to be interpreted) if they suddenly start failing, as the file will have often more detailed information about the failure mode. + + + + +&appname; being a GTK+ program means some options are processed by GTK+ itself such as --display. Use the following to find out what they are for your system: +viking --help-gtk + + +
+
diff --git a/help/C/figures/Aggregate_statistics.png b/help/C/figures/Aggregate_statistics.png new file mode 100644 index 0000000..41fd245 Binary files /dev/null and b/help/C/figures/Aggregate_statistics.png differ diff --git a/help/C/figures/DEM_file_info_dialog.png b/help/C/figures/DEM_file_info_dialog.png new file mode 100644 index 0000000..0ebd4c0 Binary files /dev/null and b/help/C/figures/DEM_file_info_dialog.png differ diff --git a/help/C/figures/LayersTracksList.png b/help/C/figures/LayersTracksList.png new file mode 100644 index 0000000..c6bf2f2 Binary files /dev/null and b/help/C/figures/LayersTracksList.png differ diff --git a/help/C/figures/LayersTracksStatistics.png b/help/C/figures/LayersTracksStatistics.png new file mode 100644 index 0000000..08d3514 Binary files /dev/null and b/help/C/figures/LayersTracksStatistics.png differ diff --git a/help/C/figures/Maps_download_region_dialog.png b/help/C/figures/Maps_download_region_dialog.png new file mode 100644 index 0000000..162cd55 Binary files /dev/null and b/help/C/figures/Maps_download_region_dialog.png differ diff --git a/help/C/figures/Track_elevation_graph.png b/help/C/figures/Track_elevation_graph.png new file mode 100644 index 0000000..6c87fba Binary files /dev/null and b/help/C/figures/Track_elevation_graph.png differ diff --git a/help/C/figures/Track_properties.png b/help/C/figures/Track_properties.png new file mode 100644 index 0000000..23c8a2e Binary files /dev/null and b/help/C/figures/Track_properties.png differ diff --git a/help/C/figures/Track_statistics.png b/help/C/figures/Track_statistics.png new file mode 100644 index 0000000..5890e1c Binary files /dev/null and b/help/C/figures/Track_statistics.png differ diff --git a/help/C/figures/Trackpoint_edit_dialog.png b/help/C/figures/Trackpoint_edit_dialog.png new file mode 100644 index 0000000..c2da03a Binary files /dev/null and b/help/C/figures/Trackpoint_edit_dialog.png differ diff --git a/help/C/figures/Viking-OSM-CycleMap-ManyTracks.jpg b/help/C/figures/Viking-OSM-CycleMap-ManyTracks.jpg new file mode 100644 index 0000000..88d5d86 Binary files /dev/null and b/help/C/figures/Viking-OSM-CycleMap-ManyTracks.jpg differ diff --git a/help/C/figures/WaypointsList.png b/help/C/figures/WaypointsList.png new file mode 100644 index 0000000..6aa69af Binary files /dev/null and b/help/C/figures/WaypointsList.png differ diff --git a/help/C/figures/addtr_18.png b/help/C/figures/addtr_18.png new file mode 100644 index 0000000..4d12151 Binary files /dev/null and b/help/C/figures/addtr_18.png differ diff --git a/help/C/figures/addwp_18.png b/help/C/figures/addwp_18.png new file mode 100644 index 0000000..3b1747d Binary files /dev/null and b/help/C/figures/addwp_18.png differ diff --git a/help/C/figures/customize_toolbar_dialog.png b/help/C/figures/customize_toolbar_dialog.png new file mode 100644 index 0000000..d62abc1 Binary files /dev/null and b/help/C/figures/customize_toolbar_dialog.png differ diff --git a/help/C/figures/demdl_18.png b/help/C/figures/demdl_18.png new file mode 100644 index 0000000..a27de8f Binary files /dev/null and b/help/C/figures/demdl_18.png differ diff --git a/help/C/figures/edtr_18.png b/help/C/figures/edtr_18.png new file mode 100644 index 0000000..687cdb5 Binary files /dev/null and b/help/C/figures/edtr_18.png differ diff --git a/help/C/figures/edwp_18.png b/help/C/figures/edwp_18.png new file mode 100644 index 0000000..eeab250 Binary files /dev/null and b/help/C/figures/edwp_18.png differ diff --git a/help/C/figures/geomove_18.png b/help/C/figures/geomove_18.png new file mode 100644 index 0000000..34aae19 Binary files /dev/null and b/help/C/figures/geomove_18.png differ diff --git a/help/C/figures/geozoom_18.png b/help/C/figures/geozoom_18.png new file mode 100644 index 0000000..9e1fe34 Binary files /dev/null and b/help/C/figures/geozoom_18.png differ diff --git a/help/C/figures/map_tile_info_dialog.png b/help/C/figures/map_tile_info_dialog.png new file mode 100644 index 0000000..2c39c79 Binary files /dev/null and b/help/C/figures/map_tile_info_dialog.png differ diff --git a/help/C/figures/mapdl_18.png b/help/C/figures/mapdl_18.png new file mode 100644 index 0000000..b60dcf7 Binary files /dev/null and b/help/C/figures/mapdl_18.png differ diff --git a/help/C/figures/mover_22.png b/help/C/figures/mover_22.png new file mode 100644 index 0000000..b99d3e4 Binary files /dev/null and b/help/C/figures/mover_22.png differ diff --git a/help/C/figures/properties_degree.png b/help/C/figures/properties_degree.png new file mode 100644 index 0000000..ed33c32 Binary files /dev/null and b/help/C/figures/properties_degree.png differ diff --git a/help/C/figures/properties_units.png b/help/C/figures/properties_units.png new file mode 100644 index 0000000..15c6e25 Binary files /dev/null and b/help/C/figures/properties_units.png differ diff --git a/help/C/figures/route_finder_18.png b/help/C/figures/route_finder_18.png new file mode 100644 index 0000000..15def87 Binary files /dev/null and b/help/C/figures/route_finder_18.png differ diff --git a/help/C/figures/ruler_18.png b/help/C/figures/ruler_18.png new file mode 100644 index 0000000..eb4c544 Binary files /dev/null and b/help/C/figures/ruler_18.png differ diff --git a/help/C/figures/select_18.png b/help/C/figures/select_18.png new file mode 100644 index 0000000..6a40830 Binary files /dev/null and b/help/C/figures/select_18.png differ diff --git a/help/C/figures/showpic_18.png b/help/C/figures/showpic_18.png new file mode 100644 index 0000000..b629a4a Binary files /dev/null and b/help/C/figures/showpic_18.png differ diff --git a/help/C/figures/trw_statusbar.png b/help/C/figures/trw_statusbar.png new file mode 100644 index 0000000..88e5d0c Binary files /dev/null and b/help/C/figures/trw_statusbar.png differ diff --git a/help/C/figures/vik_new_route_18.png b/help/C/figures/vik_new_route_18.png new file mode 100644 index 0000000..cb2c6bc Binary files /dev/null and b/help/C/figures/vik_new_route_18.png differ diff --git a/help/C/figures/zoom_18.png b/help/C/figures/zoom_18.png new file mode 100644 index 0000000..75c10db Binary files /dev/null and b/help/C/figures/zoom_18.png differ diff --git a/help/C/figures/zoom_status_popup.png b/help/C/figures/zoom_status_popup.png new file mode 100644 index 0000000..1ccc9a3 Binary files /dev/null and b/help/C/figures/zoom_status_popup.png differ diff --git a/help/C/georef_layer.xml b/help/C/georef_layer.xml new file mode 100644 index 0000000..5ca4135 --- /dev/null +++ b/help/C/georef_layer.xml @@ -0,0 +1,68 @@ + +] +> + +
GeoRef Layer + +This layer allows one to use any image as a map. You will need to tell it how to align the map to a position in the world and the scale of map. + + +When a new image is selected the values from a World File will automatically be tried to be found. +(subject to the setting in ) + + + +&appname; does not currently support skew values and since World Files do not contain what coordinate system the coordinate values are in - &appname; assumes they are in UTM. + + + +If you do not know the scale of the map but know the coordinates of both upper left and lower right coordinates, + you can enter these coordinates (Lat/Lon only) and then use the Calculate MPP values from coordinates button. + + +The map once loaded can be repositioned via , which may be easier than trying to edit the raw property values. + + +
Layer Properties + +Configurable properties: + + + + The map image file. + + + X + Y Scales in metres per pixel. + + + Coordinates of the upper left corner of the map (either UTM or Lat/Lon value). + + + Alpha. Control the Alpha value for transparency effects using a value between 0 and 255 with the default being 255 for a fully solid image, whereas 0 is transparent. + + +
+ +
Layer Operations +
Zoom to Fit Map + +Automatically set a zoom level to see the entire map coverage. + +
+ +
Goto Map Center + +Center the viewport on this map. + + +
+
Export to World File + +Opens a file save dialog to save the scale and position information as a World File. + +
+
+ +
diff --git a/help/C/legal.xml b/help/C/legal.xml new file mode 100644 index 0000000..312c12e --- /dev/null +++ b/help/C/legal.xml @@ -0,0 +1,73 @@ + + + Permission is granted to copy, distribute and/or modify this + document under the terms of the GNU Free Documentation + License (GFDL), Version 1.1 or any later version published + by the Free Software Foundation with no Invariant Sections, + no Front-Cover Texts, and no Back-Cover Texts. You can find + a copy of the GFDL at this link or in the file COPYING-DOCS + distributed with this manual. + + This manual is part of a collection of GNOME manuals + distributed under the GFDL. If you want to distribute this + manual separately from the collection, you can do so by + adding a copy of the license to the manual, as described in + section 6 of the license. + + + + Many of the names used by companies to distinguish their + products and services are claimed as trademarks. Where those + names appear in any GNOME documentation, and the members of + the GNOME Documentation Project are made aware of those + trademarks, then the names are in capital letters or initial + capital letters. + + + + DOCUMENT AND MODIFIED VERSIONS OF THE DOCUMENT ARE PROVIDED + UNDER THE TERMS OF THE GNU FREE DOCUMENTATION LICENSE + WITH THE FURTHER UNDERSTANDING THAT: + + + + DOCUMENT IS PROVIDED ON AN "AS IS" BASIS, + WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESSED OR + IMPLIED, INCLUDING, WITHOUT LIMITATION, WARRANTIES + THAT THE DOCUMENT OR MODIFIED VERSION OF THE + DOCUMENT IS FREE OF DEFECTS MERCHANTABLE, FIT FOR + A PARTICULAR PURPOSE OR NON-INFRINGING. THE ENTIRE + RISK AS TO THE QUALITY, ACCURACY, AND PERFORMANCE + OF THE DOCUMENT OR MODIFIED VERSION OF THE + DOCUMENT IS WITH YOU. SHOULD ANY DOCUMENT OR + MODIFIED VERSION PROVE DEFECTIVE IN ANY RESPECT, + YOU (NOT THE INITIAL WRITER, AUTHOR OR ANY + CONTRIBUTOR) ASSUME THE COST OF ANY NECESSARY + SERVICING, REPAIR OR CORRECTION. THIS DISCLAIMER + OF WARRANTY CONSTITUTES AN ESSENTIAL PART OF THIS + LICENSE. NO USE OF ANY DOCUMENT OR MODIFIED + VERSION OF THE DOCUMENT IS AUTHORIZED HEREUNDER + EXCEPT UNDER THIS DISCLAIMER; AND + UNDER NO CIRCUMSTANCES AND UNDER NO LEGAL + THEORY, WHETHER IN TORT (INCLUDING NEGLIGENCE), + CONTRACT, OR OTHERWISE, SHALL THE AUTHOR, + INITIAL WRITER, ANY CONTRIBUTOR, OR ANY + DISTRIBUTOR OF THE DOCUMENT OR MODIFIED VERSION + OF THE DOCUMENT, OR ANY SUPPLIER OF ANY OF SUCH + PARTIES, BE LIABLE TO ANY PERSON FOR ANY + DIRECT, INDIRECT, SPECIAL, INCIDENTAL, OR + CONSEQUENTIAL DAMAGES OF ANY CHARACTER + INCLUDING, WITHOUT LIMITATION, DAMAGES FOR LOSS + OF GOODWILL, WORK STOPPAGE, COMPUTER FAILURE OR + MALFUNCTION, OR ANY AND ALL OTHER DAMAGES OR + LOSSES ARISING OUT OF OR RELATING TO USE OF THE + DOCUMENT AND MODIFIED VERSIONS OF THE DOCUMENT, + EVEN IF SUCH PARTY SHALL HAVE BEEN INFORMED OF + THE POSSIBILITY OF SUCH DAMAGES. + + + + + + diff --git a/help/C/mapnik_rendering_layer.xml b/help/C/mapnik_rendering_layer.xml new file mode 100644 index 0000000..1bf9a73 --- /dev/null +++ b/help/C/mapnik_rendering_layer.xml @@ -0,0 +1,105 @@ + + + ] +> +
+Mapnik Rendering Layer + + +The Mapnik Rendering Layer uses the Mapnik Library to generate map images according to the Mapnik configuration. + + + +When using this layer it is useful to review the to ensure the settings are correct for your system. + + + +Mapnik configurations can be created via the CartoCSS Mapnik stylesheet pre-processor. +&appname; will automatically invoke the carto program when a carto project file is specified. +Currently &appname; can not tell when an included file of the project has changed, so there is an option to manually run the carto command. + + + +&appname; will only (re)render tiles when it believes it is necessary - such as when there is no tile in the file cache, +when there is a new Mapnik configuration style or the tile is over a certain age. +To force &appname; to (re)render all tiles - create the file ~/.viking/planet-import-complete + and/or update its timestamp. (e.g. using the touch command). + + + +Creating a Carto project or an initial Mapnik configuration file and maintaining the datasource is beyond the scope of this documentation. +There are various existing Carto projects such as OSM Carto +or OSM Bright. These use OSM data and contain guides on how to setup the datasource. +Further detail about using OSM data can be found on the Switch2OSM website. + + + +If you use a simple Mapnik configuration then the tile rendering time can be negligible and you can avoid having a tile cache. +However for most systems using a stylesheet of similar complexity to the OSM Carto styling, +rendering a tile (including reading/acquiring the data) can take some time and thus several seconds to generate a display screen's worth of tiles. +Hence &appname; runs these tasks in the background and uses the tile cache to save this output. + + + +Generated tiles are stored in the PNG format in the standard OSM Tile name layout. + + + + +Currently due to code build and dependency complexities, Mapnik Rendering is not available in the Windows version of &appname; + + + +
Layer Properties + +Configurable properties: + +Carto project file + When specified, this is used to generate the mapnik configuration file. + +Mapnik configuration file + Specify the Mapnik configuration file or leave it blank when using a Carto project file. + +Alpha + Control the Alpha value for transparency effects using a value between 0 and 255 with the default being 255 for a fully solid image, whereas 0 is transparent. + +Use File Cache + The default is to use a file cache. + +Tile cache directory + The top level directory of where the generated tiles are stored. + +
+ +
Layer Operations +These extra options are available when right clicking on the Mapnik Rendering Layer in the Layers Panel. +Refresh +Reload the Mapnik configuration. + +Run Carto Command +Force running the carto command and reload the generated Mapnik configuration. + +About +Show some information about the Mapnik version in use. + +
+ +
Viewport Tools + +When a Mapnik Rendering Layer is selected in the Layers Panel, the Mapnik Features tool can be selected from the toolbar. +This enables location dependent actions to be invoked by right clicking on the viewport and selecting an action from the drop down menu. + + + + Rerender Tile. + + + Tile Info + + +
+ +
diff --git a/help/C/recommends.xml b/help/C/recommends.xml new file mode 100644 index 0000000..0239ec4 --- /dev/null +++ b/help/C/recommends.xml @@ -0,0 +1,46 @@ + + + GPSBabel"> +]> + +
+Recommended Programs + +gpsbabel +&appname; uses &gpsbabel; for several important functions, such as: + + +Importing Files from many formats (including KML) +Exporting Files to various formats +Transfer Data to/from GPS Devices via serial connections + +Thus these will not be available if the program can not be found. +For Unix like systems this will search the system path to find the program, as it is typically installed via the System's package manager. + + From &appname; 1.6 onwards &gpsbabel; is not deployed automatically on Windows systems, + as it is made an optional install component (using the official &gpsbabel; installation program). + If &gpsbabel; is not installed in a typical Windows location that &appname; can find, + then the &gpsbabel; preference can be set to specify the exact location. See . + +&appname; will need to be restarted to use the new &gpsbabel; location preference. + +unbuffer +&appname; uses unbuffer command to optimize conversion calls. + +This mainly applies to Unix like systems when invoking &gpsbabel; commands. + +gpsd (not available for <trademark>Windows</trademark>) +&appname; can use gpsd to get the current location. + + +togpx +&appname; will use togpx to open GeoJSON files if the program is available on the system. + + +togeojson +&appname; will use togeojson to export to GeoJSON files if the program is available on the system. + + +
diff --git a/help/C/viking.xml b/help/C/viking.xml new file mode 100644 index 0000000..c19cc79 --- /dev/null +++ b/help/C/viking.xml @@ -0,0 +1,3977 @@ + + + Viking"> + + + + maps.xml, goto_tools.xml, datasources.xml, external_tools.xml, routing.xml"> +]> + + +
+ + &app; Manual + + &app; is a free/open source program to manage GPS data. + + + + 2013 + Guilhem Bonnefille + Rob Norris + + + + + GNOME Documentation Project + + + + + + + + Guilhem + Bonnefille + + + Rob + Norris + + + + username: + Alexxy + + + username: + Vikingis + + + username: + Tallguy + + + username: + EliotB + + + Alex + Foobarian + + + + + + + &appname; Manual V&manrevision; + &date; + + Guilhem Bonnefille guilhem.bonnefille@gmail.com + Rob Norris rw_norris@hotmail.com + GNOME Documentation Project + This document was generated on . + + + + + This manual describes version &appversion; of &appname;. + + + Feedback + To report a bug or make a suggestion regarding the &app; application or + this manual, follow the directions in the + Feedback section of the GNOME User Guide. + + + + + + &app; + + +
+ Introduction + +&appname; aims to be easy to use, yet powerful in accomplishing a wide +variety of tasks. Some of the things you can use &appname; for are: + + + +Uploading and downloading waypoints, tracks and routes to/from GPS. + + + +Preparing tracks, routes and waypoints for trips using maps from services such as OpenStreetMap (OSM). +The data is only needed to be uploaded to your GPS before you leave. +The maps together with your tracks, routes and waypoints can also be printed and used during the trip. + + + + +After trips, tracks and waypoints from GPS can be downloaded, stored, managed and reused in your (or your friends') later trips. + + + + +Analyzing Off Highway Vehicle (OHV) and hiking trips, understanding where you went and how far you were from something. + + + +Making waypoints, tracks and routes to follow to easily get someplace +you've never been before or don't have GPS data for but online +maps exist for it. + + + + +Making maps with using Mapnik. +Not on Windows at the moment. + + + + +Grouping data from multiple trips using a hierarchical data manager. + + + + +Analyzing speed at different places (to some degree), adding waypoints where you forgot to mark one but did slow down or stop. + + + + +Downloading and storing OpenStreetMap and/or other map types on your hard drive and looking at them later. + + + + +Editing routes or tracks and their trackpoints, joining and splitting up tracks and routes. + + + + +Show the live GPS position on the map (for use on a mobile device - e.g. a laptop). Not Windows at the moment. + + + + +Import and export track, route and waypoint files of various types via GPSBabel + + + + +View, create and update Geotagged Images (using EXIF data). + + + + + +&appname; is under continual improvement: see the potential areas in the Roadmap / Wishlist: + + +
+Screenshot: OSM Cycle Map and Many Tracks + + + +
+ + + The Windows build of Viking does not currently support verification of https connections. + + +
+ +
General Concepts +
Layers + +Layers is concept one may know from powerful graphics editors such as Photoshop or GIMP. +Instead of putting all the data on the same level, it is stacked (i.e. layered) with different data over one another. +This can be useful for analysis and general handling of various sets of data. + + +Unfortunately the downside of this complexity is remembering how differing layers of data can obscure other data. + + +The Map layers have Alpha Compositing, +to create the appearance of partial transparency. +By controlling this value one can see data below it in the layer heirarchy for interesting effects. + +
+
Layers Panel + +The panel on the left is called the layers panel. +It determines which layers and sublayers (such as tracks and waypoints) +are shown, and the order in which they are drawn. Layers on the +top of the layers panel list are drawn last. You can change the order by +drag and drop, or by selecting a layer and using the up and down +buttons at the bottom of the layers panel. + + + The panel also contains a calendar to show when Layers occurred. + Double clicking on the day will select and move the viewport display to that layer. + +
+
Viewport + +The main &appname; area where the layer data is drawn, is called the viewport. + +
+
Statusbar +This provides a readout of various information: + +The currently selected (mouse pointer) tool +The number of items to process in the background - normally this the number in the map tile download queue +The zoom factor +The location of the mouse pointer (and potentially height information if DEM data is available) + +When creating a track/route, the statusbar also displays some information about the track/route. +
+Statusbar + + + +
+This part of the statusbar displays: + +The total distance of the track/route (including currently edited segment). +The bearing of the currently edited segment. +The distance of the currently edited segment. + + +For convenience, a zoom selector can be opened from the status bar. Simply left-click on the zoom factor. +
+ The zoom selector available from status bar + + + +
+
+ +
Toolbar +The toolbar is an area for buttons that perform common actions. +Some actions are modal, so the appropriate layer needs selected before these toolbar buttons are enabled. See more detail. +The display of the toolbar is influenced by the +Right clicking on the toolbar and selecting Customize allows jumping to the directly. +
+ +
Projections + +&appname; supports differents projections: + + +UTM + + +LatLon (also called EPSG:4326) + + +Mercator (also called Spherical Mercator) + + + +
+ +
Map Cache + +&appname; stores downloaded map tiles to disk for a couple of reasons: + + +Enables off line usage +Reduces loading on the map tile provider + + +The &appname; automatic caching strategy is two fold: + + + + + If the age of the tile on disk is less than the specified tile age (see ), + it will not attempt to contact the server to get a new version of the tile. + + + + + When the tile age has expired &appname; will attempt a refresh update, so that it provides the cached tile generation timestamp so the server can determine if a new tile image needs to be returned. Not all map types support this refresh method. + + + + + You can override the caching scheme by using right-click on the Map on the layers panel and selecting Redownload All Onscreen Maps, or Ctrl+F5 for the top most map displayed. This will get the latest version held by the server. + + + + This can be useful if you contribute to OpenStreetMap and wish to see your modifications (of course give time for the server to have processed your changes - see I have made edits but they don't show up on the map) + + + + +The layout of the cache on disk itself can be controlled via a per Map Layer property. + +Viking - Legacy default in a private cache layout scheme +OSM - Newer available default (1.6+) + +This is to increase the compatibility between &appname; and similar applications that cache tiles on disk so that the tiles can be shared. + + + + + +
+ +
Shortcut Keys + +&appname; has several shortcut keys or key combinations for commands as listed in the main window along side the command. + + +By default some function keys follow standard GUI behaviour: + + +F1 Help (view this manual) +F5 or Ctrl+R Refresh the maps on screen +F10 Select the Menubar (in built behaviour) +F11 Full Screen +Ctrl+F5 or Ctrl+Shift+R Redownload the maps on screen + + + +Refresh attempts to get new maps only if the local tile cache time period has expired for any particular map tile. +Redownload gets all on screen maps from the server, ignoring the local tile cache. + + + +Other function keys control turn on/off visibility of various elements: + + +F3 Toggle visibility of the Toolbar +F4 Toggle visibility of the Menubar +Shift+F5 Toggle visibility of the Scale indicator on the viewport +F6 Toggle visibility of the Center Crosshairs on the viewport +F7 Toggle showing selected items (e.g. tracks or waypoints) in the highlight colour in the viewport +F9 Toggle visibility of the Layers Panel +F12 Toggle visibility of the Statusbar + + +Standard shortcuts are provided for normal GUI operations: such as creating new files, opening, saving and exitting. +Then there are shortcuts specific to &appname; to switch projection modes, zoom in/out, create layers,switch the active tool mode and move the map: + +Ctrl+Up Pan the viewport North +Ctrl+Right Pan the viewport East +Ctrl+Down Pan the viewport South +Ctrl+Left Pan the viewport West +Ctrl+Keypad+ Zoom In +Ctrl+Keypad- Zoom Out + +These work irrespective of the mode selected +For other combinations see the menu entry themselves. + +
+ +
+Keyboard Configuration +Keyboard configuration is supported by the standard GTK+ way of changing shortcuts for menu entries. +Hover over the menu option with the mouse pointer and press the keyboard shortcut you want to bind it to. +To delete a keyboard assignment, press Backspace whilst over the menu entry. + + + If the keyboard shortcut is already in use you will not receive any notification that new action replaces the old action. + This is probably why most distributions have this facility disabled by default. + Thus you will need to enable Editable menu accelerators for your system. + Check the Desktop Menu and Toolbar Control or other User Interface preferences for this setting. + + + + + For Windows systems this can be done by adding the line gtk-can-change-accels=1 to %USERPROFILE%\.gtkrc-2.0 (create the file if it does not exist). + + +From &app; 1.6+ the keyboard configuration is automatically loaded and saved between sessions in the +
+ +
Tracks vs Routes + +In theory a route is path you are planning to follow and a track is of where you have actually been. The GPX specification splits these into two separate categories, although tracks contain everything route may have. + + +Q. When planning a route what difference does it make if it's a route or a track? + + +A. One difference is in how a GPS device navigates following the route or track. +The capability, the options and data on a particular device also effect how the navigation is performed. +Often the how a device actually works doesn't seem to be formally documented by the manufacturer (and can be firmware dependent too). +Web searches can reveal people's experiences with specific devices on blogs and various forums. +For some devices it will attempt to navigate between route points, which may then suggest various roads and tracks between the points using an internal routing algorithm with some kind of transport profile. +However this is limited to the quality of data available and how well the profile matches ones actual need. +If the points are close enough then the 'best' route for any form of transport will typically be the straight line between the points. + + +There are often restrictions on the numbers of route (or track) points the GPS Device can handle - may be 250 or as little as 50. +This generally not a problem for shorter routes, but needs managing for longer or detailed routes. +The number of track points is normally alot higher (e.g. 500 or typically with latest devices 10,000 or more) and less of a problem. + + + See for helping to manage this. + +
+ +
+ +
File Types and the Main Window + + +&appname; has it's own file type traditionally marked by the .vik file extension. +This is a plain text file saving all information of the current window including the view location, zoom level, projection type and then all the layer information (aggregrates, maps, tracks, waypoints, etc...). + + +Besides it's own file type, &appname; can open (and save to via export methods) GPX and KML file types. + + + +&appname; does not handle GPX 1.1 particularly well - it prefers GPX 1.0 + + + +By default &appname; opens a default blank window centered on the home location. This behaviour can be changed by the . +Each window contains menus, a toolbar, a viewport, layers panel and a statusbar. +Each section (apart from the viewport) can be hidden using the or from the +ViewShow choices. + + +One may consider each &appname; window to be a separate project - each with it's project Viking file. +However generally one window is enough for most purposes! + + +Several operations apply at the window level as follows next. +Also see for the operational modes that generally work in conjunction with a selected layer. + + +
New + +Located on the FileNew menu and on the toolbar New. + + +This creates a new window with the default settings. + +
+ +
Open + +Located on the FileOpen menu and on the toolbar Open. + + +This opens a file chooser dialog to select one (or more) files of the supported GPS data file types: + +Viking +GPX +KML +JPG + + + +GPX, KML and JPG files will be loaded into the existing &appname; view. A Viking file will be given a new window if the current window is already assigned. + + + +&appname; handles more file types via the Acquire methods below. + + +
+ +
Open Recent File + +Located on the FileOpen Recent File menu only. + + +The most recently opened files are available for opening again. +The number of files remembered is controlled by a value in the . + + +Note that files imported via the Acquire mechanism are not available in this list. + +
+ +
Save + +Located on the FileSave menu and on the toolbar Save. + + +If the current opened file is Viking file, this save will simply update it. +If it is a new file or the file loaded was an external type (i.e. GPX or KML), then this will ask for a new name to save as a Viking file. + +
+ +
Save As + +Located on the FileSave As menu only. + + +This will ask for a new name to save as a Viking file (even it was already a Viking file). + +
+ +
Append File + +Located on the FileAppend File... menu only. + + +Selecting a Viking file from this method will join the file contents to the current window (instead of creating a new one). + + +GPX and KML files may also be appended, whereby the file contents are added to the currently selected TrackWaypoint layer. Otherwise they are loaded in the normal file open method when no layer is selected. + +
+ +
Open GPX as External Layer + +Located on the FileOpen GPX as External Layer... menu only. + + +Selecting a GPX file from this method will create an external Layer that loads from the specified file. +The layer is marked as a "no write" external layer, which means any changes made will not be written back to the GPX file. +To enable changes to be written, you can change the layer to a standard external layer in the layer properties dialog. +This is in contrast to importing the data and storing it in the Viking file. + +
+ +
Properties + +Located on the FileProperties menu only. + + +Displays some simple properties about the loaded Viking project file (if any), such as full filename including the path, the filesize and the date/time of the file. + +
+ +
Export All + +Located on the FileExport All menu only. +Choose either the GPX or KML option. + +This allows converting every layer from the existing project into files of the type choosen. +You will be prompted for a directory into which a new file for each layer will be saved. + + +The KML option uses GPSBabel and so will not be available if GPSBabel can not be detected. + + +Note that some data properties are not supported by the target export file type. Such as item visibility or track colours. + +
+ +
Acquire + + +Available on the FileAcquire menu and from the layer menu. + + +If used from the File menu these methods place the results in a new TrackWaypoint layer. + + +If used from the layer menu these methods place the results in that TrackWaypoint layer. + + +
+From GPS + +FileAcquireFrom GPS +Probably the easiest way of getting information from a GPS Device. + + +Select the GPS Device communication settings and then hit OK. +See the Getting Started section for more info about the settings. + + + +Some GPS devices (such as the Garmin Nuvi 255) support a native file system and write information to a Current.gpx file or similar. You will have to browse the file system on the device and open it directly. + + +
+ +
+Import File With GPSBabel + +FileAcquireImport File With GPSBabel + + +Other formats can be imported that are supported by GPSBabel. + + +You need to select the file and the type of the file that is going to be opened, +since there is no automatic detection of the file kind. + +
+ +
+OSM Traces + +FileAcquireOSM Traces + + +See section for more information. + +
+ +
+My OSM Traces + +FileAcquireMy OSM Traces + + +See section for more information. + +
+ +
+From Geotagged Images + +FileAcquireFrom Geotagged Images +Enables automatic creation of waypoints from geotagged images. + + +This menu opens a dialog to select such image files. +If the image files have geotag information in them, then a layer with named waypoints positioned at the location of each image with a thumbnail of that image is created. + +
+ +
+From Wikipedia Waypoints + +FileAcquireFrom Wikipedia Waypoints + + +This gets interesting points from Wikipedia for the specified view: either within the extent of layer bounds or within the current viewport boundary. + +
+ +
+From Routing + +FileAcquireFrom Directions + + +This gets a route from given directions. + +
+ +
+From URL + +FileAcquireFrom URL + + +This gets a file from the entered URL. +File formats that can be opened are those supported by GPSBabel. + + + +You need to select the type of the file that is going to be returned, since there is no automatic detection of the file kind. + + +
+ +
+Import GeoJSON File + +FileAcquireImport GeoJSON File + + +This uses the program togpx to load .geojson files. +If the program is not detected on your system, then this option will not be available. +See here for the installation method. + + +The current version (1.4.4) of GPSBabel does not support the GeoJSON file format. + +
+ +
+ +
Print + +Located on the FilePrint menu and on the toolbar Print. + + +Print uses what is displayed on the current map view for printing: i.e. what ever map, tracks and waypoints that are in view, including the +cross hairs and the scale. + + +It uses a standard system print dialog using an image the size of the current viewport in pixel terms. +On the Image Settings you can move the image around the page and scale the image up / or down. + +
+ +
Generate Image File + +Located on the FileGenerate Image File menu only. + + +Allows generation of larger (pixel) area images than the standard Print method above. +From the generated image you can use the facilities of the Operating System to print the image +or perform other actions. + + +You should have previously downloaded the tile images for the chosen zoom level, +otherwise the image produced will have missing sections. + + + +Using large areas takes some time to process and due to the method used it may run out of memory to complete the operation. +Unfortunately under Windows systems it can not detect this failure and may crash the program. +So the maximum size is dependent on the capabilities of your system. +For instance the largest successful image generated on my (RN) Debian system is a pixel area of 20,000 x 20,000. + + +
+ +
Generate Directory of Images + +Located on the FileGenerate Directory of Images menu only. + + + +This is only available in UTM mode. + + +
+ +
KMZ Map File Overview + +A KMZ file is a compressed version of a KML file and associated supporting files. + + +A KMZ Map file is a KMZ file with an image overlay often for use as a Custom Map on Garmin GPSr devices. + + +&appname; only supports basic properties in KMZ Map files, primarily intended for use with Garmin GPSr devices although KMZ exports are known to be work with Google Earth. + +
+ +
Import KMZ Map File + +Located on the File menu only. + + +Enables loading of a selected KMZ map file. +This generates a new map layer using the overlay image contained within the KMZ file. + +
+ +
Generate KMZ Map File + +Located on the File menu only. + + +Enables exporting the current viewport as a KMZ map file. +The area and zoom level covered by the KMZ map can be adjusted before saving. + + +Note that Garmin GPSr devices have limits in using images if they are too large (e.g. over 3Mb big) in KMZ files. +&appname; does not enforce any limits on the KMZ files it generates. + +
+ +
+ +
Layers + + +Layers supported by &appname; are: + + + + + + + + + + + + +For each layer there are a few standard options: + + +Properties - Layer setup / configuration settings +Cut +Copy +Paste +Delete +Visibility - This checkbox on the Layers Panel controls whether the layer is shown in the viewport or not + + +The cut/copy/paste options can be accessed in a variety of ways once the layer has been selected: + + +Standard keys: Ctrl+x|c|v +Main menu Edit +From the right click menu +Buttons at the bottom of the Layers Panel + + +Default values used for each layer's properties can be altered via the EditLayer Defaults menu options. + + +See the individual section for detail about each layer. + +
+ +
TrackWaypoint Layer + +TrackWaypoint layers display GPS data (tracks, routes and waypoints). + +One way to create new waypoints is to copy a +latitude/longitude coordinate pair, such as the one shown on most +geocaches, and paste it into an active TrackWaypoint layer. &appname; can +automatically recognize several variations of the lat/lon format. + + +By right-clicking on tracks, routes or waypoints in the , you can access many commands on them. +You can easily find a specific track, route or waypoint by expanding the appropriate containing Tracks, Routes or Waypoints sublayer in the +layers panel to show all the individual items and then typing the name of the track, route or waypoint. + + + +The containing Tracks, Routes or Waypoints sublayers are only shown when items of that type exist. +To start creating them enter into a create mode via either the Create toolbar commands or the New menu commands. + + + +The new TrackWaypoint layer dialog allows the layer to be specified as external. +In this case the layer is exported as GPX to the file specified instead of stored in the Viking file itself. +It is also possible to specify the layer as "no write". +This means that &appname; does not write the layer to the GPX file specified; instead, &appname; only reads the file. +No-write layers are primarily intended to be used with the option in the File menu. + + + +External layers are loaded only when they are displayed or selected. +Hence, they will not appear in any summary statistics if they have not been loaded. +It is possible to load all external layers contained in an layer by selecting "Load External Layers" from the Aggregate Layer context menu. +Note, &appname; specific options may not be saved if not supported by the GPX export. + + + +The sublayers also offer right click menu options. +These are the same as those available at the TrackWaypoint level, but only those that relate to the sublayer type. + + + +By default routes are coloured red. Tracks are automatically assigned a spread of colours. + + + +Most operations available on tracks are available on routes, except for functionality that relies on having timestamps - since routes by definition have no timing information. Thus for example, uploading a route to OpenStreetMap Traces is not available nor is Geotagging on a route. +It is possible to convert between Tracks and Routes, although converting from a Track to a Route may involve a loss of information (hence you are required to confirm this operation before it happens). + + +
Layer Operations + +The layer has a context menu with several operations. + + +
View Layer + +Version1.1+: This will automatically move the viewport and select the best zoom level to see the whole layer (i.e. all tracks, routes and waypoints). + +
+ +
View + +
View All Tracks + +Version1.1+: This will automatically move the viewport and select the best zoom level to see the all the tracks in the layer (ignoring positions of any routes or waypoints). + +
+ +
View All Routes + +Version1.4+: This will automatically move the viewport and select the best zoom level to see the all the routes in the layer (ignoring positions of any tracks or waypoints). + +
+ +
View All Waypoints + +Version1.1+: This will automatically move the viewport and select the best zoom level to see the all the waypoints in the layer (ignoring positions of any tracks or routes). + +
+ +
+ +
Goto Center of Layer + +This will automatically move the viewport to see the whole layer (i.e. tracks, routes and waypoints). It does not adjust the zoom level. + +
+ +
Goto Waypoint + +This opens a dialog box to enter a name of waypoint to search for. If it is found the viewport is centred on it. + + + +Note this search is not very clever and only finds exact matches. +You are probably better off expanding the waypoint list and directly start typing, as mentioned above, which finds a match based on each letter typed. + + +
+ +
Export Layer + +The layer (all tracks, routes and waypoints) can be exported to following file formats: + + + + GPX + + + GPSPoint + + + GPSMapper + + + Google's KML + + + Any GPSBabel File Formats + + + GeoJSON. Via the program togeojson + This option will not be available if the program is not detected on your system. + See here for the installation method. + + + +Version1.1+: An individual track can be exported to a GPX file via the track menu. + +
+ +
Finish Track or Route + +Selecting this option ends the creation of that individual track or route. + + + +This is only available when a track or route is being created by the or tools. + + +
+ +
New +
New Waypoint + +This opens a dialog box to create a new waypoint. A default name will be suggested and the default position is the center of the viewport. + +
+
New Track + +This turns on the tool. + +
+
New Route + +This turns on the tool. + +
+
+ +
Geotag Images + +This starts the Geotagging Images dialog against all tracks in the layer. +See Geotagging for further detail. + +
+ +
Acquire + +This offers the same choice from methods as on the File menu. +However when invoked from here, the results will be stored in this layer (instead of creating a new one). + +
+ +
Upload + +
Upload to GPS + +This opens a dialog to select the GPS Device and port to which the layer information will be transferred. + + +The types of GPS information (tracks, routes or waypoints) to be transferred can be selected. + + +Tracks, Routes or Waypoints that are invisible will not be transferred. + +
+ +
Upload To OSM + +This opens a dialog to upload all tracks and waypoints to OpenStreetMap traces. +Useful if you are an OpenStreetMap contributor, access details are stored in &appname; + + + &appname; allows you to edit a track, e.g. remove duplicate points, perhaps remove track points leading to your home and then upload it to OpenStreetMap. + +
+
+ +
Delete +Offers deletion of various parts of a TrackWaypoint layer: +
Delete All Tracks +Deletes all the tracks in this layer. +
+
Delete Tracks from Selection +Opens a dialog with list of all the tracks from this layer to choose the ones to delete. +
+
Delete All Routes +Deletes all the routes in this layer. +
+
Delete Routes from Selection +Opens a dialog with list of all the routes from this layer to choose the ones to delete. +
+
Delete All Waypoints +Deletes all the waypoints in this layer. +
+
Delete Waypoints from Selection +Opens a dialog with list of all the waypoints from this layer to choose the ones to delete. +
+
Delete Duplicate Waypoints + + Deletes duplicate waypoints in this layer. + Waypoints are considered duplicate if they have the same location and symbol. + + If other properties are different such as name, comment, altitude, etc... they will still be considered a duplicate. + + + +
+
+ +
Filter +
Simplify All Tracks + +This opens dialog to request the number of points each track will be simplified using GPSBabel. The result is put into a new layer. The simplification method removes points considered to be in a 'near straight line', thus reducing the number of points and attempting to keep the most important turning points. + +
+
Compress Tracks + +Enables compression of tracks and routes via GPSBabel's Crosstrack simplify method. +It opens a dialog to request the Error factor value which is the maximum allowable error that may be introduced by removing a single point. +It is expressed a distance in units as specified by the distance option. +Thus a higher value will remove more points. +The result is put into a new layer. + +
+
Remove Duplicate Waypoints + +Remove Duplicate Waypoints - fairly self explainatory, with the results created in a new layer. + + + +However it only considers a precise position (waypoints only 1 metre away from each other are considered different) and also doesn't consider if the waypoints have different comments, symbols or images. + + +
+
+ +
Filter With <emphasis>Trackname</emphasis> + +This runs GPSBabel on the layer using information from a previously selected track (select via the track menu "Use With Filter" option) with the following command types: + + +Waypoints Inside This +Waypoints Outside This + + +The result is generated in a new Track/Waypoint layer. + +
+ +
Geotag Images + +This starts the Geotagging Images dialog using the specific track. +See Geotagging for further detail. + +
+ +
List Tracks or Routes + +Opens a new dialog with the list. As described in the Aggregrate layer + +
+ +
List Waypoints + +Opens a new dialog with the list. As described in the Aggregrate layer + +
+ +
+ +
Track and Route Sublayer Options +Repeats options available at the TrackWaypoint level, but only those for tracks and routes: + + +Finish Track or Route +Same as the layer Finish Track or Route + + +New Track or Route +Same as the layer New Track or New Route + + +View All Tracks or Routes +Same as the layer View All Tracks or View All Routes + + +Delete All Tracks or Routes +Same as the layer Delete All Tracks or Delete All Routes + + +Delete Tracks or Routes from Selection +Same as the layer Delete Tracks from Selection or Delete Routes from Selection + + +List Tracks or Routes +Opens a new dialog with the list. As described in the Aggregrate layer + + +Also gives other options for handling multiple items: + + +Sort +Gives the ability to sort the items in the treeview alphabetically or by date. + + +Visibility +Offers options to quickly control the visibility of all items within the sublayer, as per + + +
+ +
Track and Route Properties + +This shows several tabs for properties and useful statistics about a track or a route, including elevation-distance and speed-time graphs (if data is available). +Moving the mouse pointer over the graph displays values related to that point along the track. +You can click on these graphs to jump to the point in the track. +You can reverse it, delete duplicates, split at marked position or split a track from its component segments (discontinuous breaks in a track) into separate tracks. + + +For the elevation related graphs the Show DEM check button is only enabled if a suitable is available that overlaps the track. + + +Graphs either have a Show GPS Speed or Show Speed button. +Each of these overlays relative speed markers along the graph. +The difference between Speed vs GPS Speed is that GPS Speed is taken directly from a field reporting the speed value in the source data. +Typically speeds used in Viking are calculated between the points time and position differences. +This is due to the reporting of speed values in source data is not mandatory and often not present. + +
Track and Route Properties Tab + +
+Properties Tab: Example + + + +
+
+
+
Track and Route Statistics Tab + +
+Statistics Tab: Example + + + +
+
+
+
Track Elevation Graph + +
+Elevation Distance Tab: Example + + + +
+
+ +The following colors are used in the elevation-distance graph: + + + +Main colour - this is dependent on your Desktop theme - often blue by default +elevation data in graph + + +Yellow + +no elevation data + + + +Green + +elevation data from DEM + + + +Red + +speed + + + +
+
+ +
Track and Route Operations + +
Finish Track + +Selecting this option ends the creation of the individual track. + + + +This is only available when a track is being created by the tool. + + +
+ +
Goto + +This centers the viewport on the selected position on the track: + + +Startpoint +"Center" - the notional center from the bounds of the track +Endpoint +Version1.1+: Highest Altitude +Version1.1+: Lowest Altitude +Version1.1+: Maximum Speed (Not Available on Routes) + +
+ +
View + +Version1.1+: This centers the viewport on the track and selects the best zoom level to see it. + +
+ +
Combine +
Merge By Time + +This operation repeatedly tries to merge the right-clicked track +with tracks in the same TrackWaypoint layer. The tracks which are +merged are those which have at least one trackpoint less than some +threshold time away. This way, if you somehow end up with lots of small +segments (say, caused by turning the GPS on and off) you can merge them +easily into one track. + + + +This is not available on routes as they have no timestamps. + + +
+ +
Merge With Other Tracks + + This opens a dialog listing the other tracks in the same TrackWaypoint layer, from which one can select the other tracks to merge with. + Tracks are merged in order of time. + +
+ +
Merge Segments + +Combines track segments. Effectively removing track segment markers to leave one segment for the whole track. + +
+ +
Append Track or Route + +Enable joining of a single track to the end of the current track. +This opens a dialog listing the other tracks in the same TrackWaypoint layer from which one can make the selection. + +
+
+ +
Split +
Split By Time + +This operation will split a single track into segments wherever the +time interval between successive trackpoints is larger than some +threshold. This is useful when processing raw NMEA GPS data, especially +taken over a long time. + + + +This is not available on routes as they have no timestamps. + + +
+ +
Split By Number of Points + +Version1.2+: This operation will split a single track into segments by the number of points specified. +This can be useful with devices which may have limits on the number of points it supports. + +
+ +
Split Segments + +Splits track segments into new tracks. + + + +This is not available on routes as they do not have route segments. + + +
+ +
Split at Trackpoint + +Splits the track at the currently selected trackpoint. + + +The current track will finish at this trackpoint. +A new track will start from a copy of this trackpoint. + + + +This is only enabled when a trackpoint is selected. + + +
+
+ +
Insert Points + + +These options are only enabled when a trackpoint is selected. + + +
Insert Point Before Selected Point + +Inserts a track point halfway between the previous track point and the current track point. +All track point properties are interpolated between the two points. + +
+
Insert Point After Selected Point + +Inserts a track point halfway between the current track point and the next track point. +All track point properties are interpolated between the two points. + +
+
+ +
Delete Points +
Delete Selected Point + +Deletes the currently selected track point. + + + +This is only enabled when a trackpoint is selected. + + +
+
Delete Points With the Same Position + +Deletes subsequent points that have the same position (but have different timestamps). + +
+
Delete Points With the Same Time + +Deletes subsequent points that have the same time stamp (but may have different positions). + + + +This is not available on routes as they have no timestamps. + + +
+ +
+ +
Transform + +These options alter the data of trackpoints of a track but not add or remove trackpoints. +And don't seem to fit any other category :) + +
Apply DEM data + +If any DEM data is loaded, this will apply the DEM data to give the track elevation data. +Two ways of applying DEM data are offered: + +Keep. Retains the existing elevation data of trackpoints and only those missing an elevation value are set. +Overwrite. Elevation data are set on all trackpoints even if they already elevation values. + + +
+
Smooth Missing Elevation data + +In various locations across the world, there are missing DEM values (AKA DEM Holes) from the SRTM data. +This is particularly noticeable in mountainous areas. +Two ways of applying elevation data to trackpoints that do not have elevation values are offered: + +Interpolated. Missing elevation data is interpolated between the previous and next known values. +Flat. Elevation data is filled in from the last previously known value. + + +
+
+Convert to Track or Route + +If this is a Route then it will convert it to a Track. + + +If this is Track then convert it to a Route. + + + +Converting from a Track to a Route may involve a loss of information, in particular timestamp values (hence you are required to confirm this operation before it happens). + + +
+
+Anonymize Times + +Timestamp information of a track can be shifted to be all offset from 1901-01-01. + + +Thus the timestamps themselves will no longer reveal exactly when a track was taken. +However the relative difference between the timestamps is kept thus one is still able to calculate some properties such as speeds along the track. + + + +This is not available for routes, as they have no timestamps. + + +
+
+Interpolate Times + +Trackpoint timestamps between the first and last points are calculated such that track is travelled at equal speed. +This is mostly useful when tracks don't have timestamps and you wish to recreate your trip (e.g. you've forgotten to turn on your GPS or the batteries have run out) +Thus edit the first and last trackpoints to set the approximate times of your trip and then use this to give approximate times along the track. +When used on tracks with timestamps this will overwrite the existing timestamps. + + + +This is not available for routes, as they have no timestamps. + + +
+
+ +
Export Track as GPX + +Version1.1+: This allows exporting the track as a GPX file by opening a file save dialog. + +
+ +
Extend Track End + +Changes the current tool to add trackpoints to the end of the track. + +
+ +
Extend Using Route Finder + +Enables the Route Finder tool. Thus on a subsequent left click in the viewport, a route is calculated from the end of track to that point using the default route service and applied to the track. + +
+ +
Upload + +
Upload to GPS + +Same as the layer Upload to GPS command, but only applies to the track. + +
+ +
Upload to OSM + +Same as the layer Upload to OSM command, but only applies to the track. + +
+ +
+ +
Use With Filter + +This selects the track to be used in the Filter With Trackname feature. + + + +This is not available on routes. + + +
+ +
Edit Trackpoint + +This opens the Trackpoint edit dialog. See . + + + +This is only enabled when a trackpoint is selected. + + +
+ +
Refine Route... + +This function allows to request a Routing Engine in order to refine a given route. +By "refining" we mean computing all real intermediates points between some given major points. +This could be useful to compute a trip giving only the wished important steps. + + + +This is only available on routes. + + +
+ +
View Google Directions + +This option is only available on a track created using the Route Finder tool. + + +Launch a web browser to see the Google directions page which yielded the route. + + + +The record of the Google route is stored in the track's comment, so if the comment is changed (or the route was created by something other than the Route Finder tool) this will not work correctly. + + +
+ +
+ +
Waypoint Sublayer Options +Repeats options available at the TrackWaypoint level, but only those for waypoints: + + +New Waypoint +Same as the layer New Waypoint + + +View All Waypoints +Same as the layer View All Waypoints + + +Goto Waypoint +Same as the layer Goto Waypoint + + +Delete All Waypoints +Same as the layer Delete All Waypoints + + +Delete Waypoints from Selection +Same as the layer Delete Waypoints from Selection + + +Delete Duplicate Waypoints +Same as the layer Delete Duplicate Waypoints + + +List Waypoints +Opens a new dialog with the list. As described in the Aggregrate layer + + +Also gives other options for handling multiple items: + + +Sort +Gives the ability to sort the items in the treeview alphabetically or by date. + + +Visibility +Offers options to quickly control the visibility of all items within the sublayer, as per + + +
+ +
Waypoint Properties + + +This shows a dialog with detailed information for the waypoint. Many properties of the waypoint can changed here, such as the comment, the symbol used in drawing or the image (normally a photograph taken at this position) assiocated with it. When a waypoint has an image, a thumbnail of it is drawn in the viewport for the waypoint (in preference to the symbol). + + +If the waypoint has an associated image, then the Geotag information may be updated, either with updating the file's modification timestamp or not. +This can be useful when the waypoint has been moved. + + +
+ +
Waypoint Operations + +
Goto + +This centers the viewport on the selected waypoint. + +
+ +
Geotag Images... + +This opens the Geotag Dialog to allow Geotagging multiple images to the position of this waypoint. +In this circumstance creation of waypoint options are disabled and only the options related to writing the EXIF information are available. + +
+ +
Transform + +Offers a subset of the track utilities. +Currently only setting the altitude from DEM data methods are available. + +
+ +
Visit Webpage + +If the waypoint's comment (or description) starts with http: then this option is available and allows launching a web browser to go to the webpage. + +
+ +
Visit Geocache Webpage + +If the waypoint's name is in Geocache form (GCXXXXX) then this option is available and allows launching a web browser to go to the Geocache page. + +
+ +
New Waypoint + +Same as the layer New Waypoint. + +
+ +
+ +
Version1.3+: Geotag Images + +This dialog allows geotagging images (normally taken with a digital camera) against a specific waypoint or via interpolation against a specific track or all tracks in the TrackWaypoint layer - depending on how it is invoked. + + +When geotagging against tracks, images need to have an EXIF DATE_TIME_ORIGINAL (nearly always set by a camera). This timestamp is then used to find the location when the image(s) was taken by searching through the track(s) to find the nearest time - interpolating between points if necessary to set the location. + + + +Generally it is good policy to synchronize your camera's clock with your GPS clock before taking photographs. However the times can be adjusted afterwards (if necessary) to take into consideration clock differences. + + + +Various options allow control of how the geotagging process is performed: + + +Images - Add the images used for geotagging +Create Waypoints +Overwrite Existing Waypoints +Write EXIF +Overwrite Existing GPS Information +Interpolate Between Track Segments +Image Time Offset - The number of seconds to ADD to the photos time to make it match the GPS data. Calculate this with (GPS - Photo). Can be negative or positive. Useful to adjust times when a camera's timestamp was incorrect. +Image Timezone - The timezone that the used when the images were created. For example, if a camera is set to AWST or +8:00 hours. Enter +8:00 here so that the correct adjustment to the images' time can be made. GPS data is always in UTC. + +
+ +
+ +
GPS Layer + +The GPS layer is responsible for uploading and downloading GPS data +from a GPS device. It also is responsible for realtime GPS tracking. +Expand the GPS layer in the layers panel to see the two layers it +uses for uploading and downloading. To upload, download, or use +realtime tracking, right-click the GPS layer and click the appropiate +menu item. + + +
Download + +To download data from the GPS, right-click the GPS layer and click Download from GPS. + +
+ +
Upload + +To upload data to the GPS, first populate the GPS Upload child +layer of the GPS layer (either by creating waypoints/tracks/routes in it, or +copying and pasting or dragging waypoints/tracks/routes from another layer). +Then right-click the GPS layer and click Upload to GPS. + +
+ +
Realtime Tracking + +You must set up gpsd correctly or use a GPSD server and put the +correct information in the GPS layer properties dialog. Then right-click +the layer and select Start Realtime Tracking. + +
+ +
Empty <emphasis>Item</emphasis> + +There are several options to quickly delete a subsection of data: + + +Empty Realtime +Empty Upload +Empty Download +Empty All + +
+ +
+ +
DEM (Digital Elevation Model) Layer + +This layer provides elevation data from the Shuttle Radar Topography Mission (SRTM) + + +Elevation data can be useful in planning trips, as you many wish to avoid/minimise the hills encountered. [OSM Cyclemap is also useful this way too] + + +To download the data use the DEM Download tool (shown on the toolbar), and then click on a area of the viewport. Once files have been downloaded they can then be loaded from disk via the DEM properties in future application runs. + + +The current data server is: NASA STRM 2.1. + + +ATM &appname; does not auto download DEM data. If you want to get lots of data blocks, you may wish to use some other program get such as curl or wget to download them for an area. + + + +Using many DEMs is CPU/memory intensive. Depending on your computer's capability, &appname; will be less responsive when about 50+ DEM blocks are loaded. It is probably unwise to attempt using 200+ blocks, so trying to use DEMs covering large countries/continents (USA, Australia etc...) is unlikely to work. In these conditions under Linux, &appname; may be automatically stopped by the "OOM Killer" + + + +
+ + +
Maps Layer + +This layer provides a single map resource, you may have multiple map layers but only top one (if enabled) will be visible (subject to the Alpha compositing property). + + +Some maps are continually improving over time (e.g. OpenStreetMap) thus &appname; employs a caching mechanism to avoid redownloading data (see ). +However a forced refresh for the current view can be made via the Reload All Onscreen Maps option or Ctrl+F5. + +Online Map Tile Providers + +You will need an open internet connection when you are downloading maps these following map types, but once downloaded they are available from the hard disk cache. When map are avaliable from the disk cache it is much faster and can be used offline. +Inbuilt maps include various OpenStreetMap (OSM) ones and more: + + + +Bing Aerial Maps (&appname; Version1.2+) +Mapbox Outdoors - This is the default (&appname; Version1.7+) +OpenStreetMap (Mapnik) +OpenStreetMap (Cycle) +OpenStreetMap (Transport) (&appname; Version1.3+) +OpenStreetMap (Humanitarian) (&appname; Version1.5+) +NASA BlueMarble + + + +&appname; can be configured to handle additional online map resources. See for further detail. + + +Offline Map Tilesets + +Some map types supported are for on disk tile formats: + + + + + On Disk OSM Tile Format + This is equivalent to any map set with OSM Cache Layput. + +MBTiles File + + OSM Metatiles + + This file format is mostly aimed at being rendering cache feature and is Endian dependent. + Thus to successfully view the file cache, the Metatile files and Viking must be of the same endian type (which they probably will be). + + + + +Of course you need to have acquired or generated these tilesets yourself. + + +
Map Layer Properties + +Configurable properties: + + + +Map Type + + The kind of map this layer displays. + Map types are dependent on the current mode. + + + +Maps Directory +Not applicable for MBTiles Map type since it is a single file. + + +Cache Layout +Viking or OSM. See . Only applies to maps from online tile providers. + + +Map File +Ony applicable for MBTiles Map type since it is a single file. + + +Alpha + + Control the Alpha value for transparency effect using a value between 0 and 255 with the default being 255 for a fully solid image. + Zero is fully transparent. A value of around 160 can be useful for blending views of multiple map layers (when applied to the upper most map layer). + + + +Autodownload Maps +This can be useful to turn off when you are not online to avoid pointless download requests or may be keep a map in a 'historical' state. +e.g. perhaps in case a current map rendering is broken. + + +Autodownload Only Gets Missing Maps +Using this option avoids attempting to update already acquired tiles. +This can be useful if you want to restrict the network usage, without having to resort to manual control. Only applies when Autodownload Maps is on. + + +Zoom Level +Determines the method of displaying map tiles for the current zoom level. +Viking Zoom Level uses the best matching level, otherwise setting a fixed value will always use map tiles of the specified value regardless of the actual zoom level. + + +
+ + +
Layer Operations +
Download Missing Onscreen Maps + +This requests map tiles for areas of the viewport that do not currently have one. + +
+ +
Download New Onscreen Maps + +This requests map tiles only if the maps are older than the Tile Age preference. + +
+ +
Reload All Onscreen Maps + +Force a refresh of all visible map tiles. + +
+ +
Download Maps in Zoom Levels + +This opens a dialog to enable requesting the download of maps for the region in the viewport over a specified number of zoom levels. +The download method type can be specified to help limit the number of requests. + + + +There are some inbuilt limits to prevent downloading large amounts of map tiles. + + +Please respect the usage policy of the tile set provider. +Such as OSM Tile Usage Policy. + + + +
+Maps Download Dialog: Example + + + +
+
+
+
+ + +
+ +
Aggregate Layer + +This layer is a container layer to hold other layers. There is always an initial and controlling Top Layer that can not be removed or renamed. + + +This layer type is useful for grouping other layers, especially layers, in whatever categories are relevant to you: such as by activity, location or date. +Here are some suggestions: + +Hiking +Mountain Biking +Road Cycling +Car Trips +Sailing +Holidays +UK Points of Interest +USA Points of Interest +etc... + + + +Thus one can have a list of all your tracks, but groups can be shown or not using the relevant layers visibility checkbox. + + +
Layer Operations + +The following are available on Aggregate Layers: + +
+ +
New Layer + +Add a new layer of the selected type. + +
+ +
Sort + +The list within the treeview can be sorted. + + +Alphabetical and Date sorts are available. + + + +Generally it is not useful to sort the Top most layer. Sort is mainly intended for Aggregate groups of TrackWaypoint layers. + + +
+ +
Track List + +Selecting this opens a dialog listing all the tracks in a table along side statistics such as track length and maximum speed. +Each column header is clickable and will reorder the list according to that particular column. +You can also rearrange the columns via dragging the column header to the new location. + + +This table may be invoked from a variety of different layer levels and will then list only the relevant tracks (and/or routes). + + +Aggregate Layer +Lists Tracks and Routes and the TrackWaypoint Layer they are in + + +TrackWaypoint Layer +Lists Tracks and Routes + + +TrackWaypoint Track sublayer +Lists Tracks only + + +TrackWaypoint Route sublayer +Lists Routes only + + + + +
+Track List Dialog: Example +
+ +This is showing all tracks and routes (although there are no actual routes here!) in multiple TrackWaypoint layers, that has been sorted by height. +Note that routes will not have timestamps or speeds, but may have elevations and should have some distance! + +
+ + + +
+
+ +Hovering the mouse over an entry will show a tooltip of the comment or description if it is available. + + +Each entry in the track list can be selected and on mouse right click offers these options: + + +View +Move the viewport to the area of the item and highlight it. + + +Statistics +Opens the Properties dialog on the tab. Note this will close the track list dialog. + + +Copy Data +Copy the data fields as text. + + + + +If multiple entries are selected the only right click option is Copy Data. +This copies the individual data fields as plain text separated by tab characters, ideal for pasting into other applications in particular spreadsheet programs. +Note that the order of the fields copied is the default column ordering (irrespective to how they may have been rearranged). + +
+ +
Waypoint List + +Selecting this opens a dialog listing all the waypoints to give a overview of the waypoint information. +Each column header is clickable and will reorder the list according to that particular column. +You can also rearrange the columns via dragging the column header to the new location. + + +This table may be invoked from a variety of different layer levels and will then list only the relevant waypoints. + + +Aggregate Layer +Lists Waypoints and the TrackWaypoint Layer they are in + + +TrackWaypoint Layer +Lists Waypoints + + +TrackWaypoint Waypoint sublayer +Lists Waypoints + + + + +
+Waypoint List Dialog: Example +
+ +This was invoked on a TrackWaypoint layer and shows all waypoints from that single layer. It has been sorted by the symbols. + +
+ + + +
+
+ +Hovering the mouse over an entry will show a tooltip of the description if it is available. + + +Each entry in the list can be selected and on mouse right click offers these options: + + +View +Move the viewport to the area of the item and highlight it. + + +Properties +This will open the properties dialog. Note this will close the waypoint list dialog. + + +Show Picture +If enabled, this will open the associated image in an external Image Viewer program. + + +Copy Data +Copy the data fields as text. + + + + +If multiple entries are selected the only right click option is Copy Data. +This copies the individual data fields as plain text separated by tab characters, ideal for pasting into other applications in particular spreadsheet programs. +Note that the order of the fields copied is the default column ordering (irrespective to how they may have been rearranged). + +
+ +
Visibility Options + +This offers a quick way to set all the visibilities of each item within the containing layer, rather than having to change each one individually. + + +Show All +Ensures all items are set to be visible. + + +Hide All +Ensures all items are set to be invisible. This is useful for then turning on single items afterwards so the display is not cluttered. + + +Toggle +Inverts the visibility status of each item. + + + +
+ +
Search by Date + +This opens calendar dialog to select a date to search by within this Aggregate layer. +The first item that is found on that date will be selected. +Tracks are searched first in preference over waypoints. + +
+ +
Statistics + +This opens a dialog to display various statistics about all tracks contained within this Aggregate layer. + +
+Statistics Dialog: Example + + + +
+ + + This currently generates a simplified Eddington number. + In that a per track length value is used, rather than trying to work out a length per day. + (i.e. doesn't combine multiple tracks for a single day or split very long tracks into days). + The Eddington number is in the current Unit distance . + + +
+ +
+ + + + + +
Coordinate Layer + +This layer is allows drawing of grid lines on the viewport. + +
+ + +
Tools + +&appname;'s mouse actions on the viewport are controlled by which tool is active. Only one tool can be active at a time. The default mode is pan. + + +You can use the scroll wheel, the middle-click, the middle-click+drag to zoom, center map at position and pan respectively no matter what tool you are using. + + +Scroll: zoom in and out keeping the mouse over same location + + +Ctrl-scroll: pan north-south (also Ctrl-up, Ctrl-down) + + +Shift-scroll: pan east-west (also Ctrl-left, Ctrl-right) + + +Ctrl-shift-scroll: zoom in and out, without changing the center (also Ctrl+, Ctrl- [*not* KeyPad +/-]) + + +Middle-click: make the clicked point on the map the center + + +Middle-click and drag: pan + + +
Pan + +This is the default mode of operation for &appname;. + + +This mode is entered by clicking on the toolbar icon: + + +Pan moves the viewpoint. A single click centers the viewport at that point, whereas click and drag dynamically moves the view around. +This is the default tool. + + +This mode can also be entered by the keyboard shortcut Ctrl+Shift+P + + +Double clicking the left mouse button will zoom the map in. +Shift + double clicking the left mouse button will zoom the map out. +Double clicking the right mouse button will also zoom the map out. + +
+ +
Zoom + +This mode is entered by clicking on the toolbar icon: + + +Zooms in and out on the clicked part of the map or by the selected area. + + +This mode can also be entered by the keyboard shortcut Ctrl+Shift+Z + + +Ctrl + left or right click: Zoom in/out and center the map on the clicked location + + +Shift (and hold) + left mouse button: Draws a bounding box area on which to zoom in. The zoom action is performed when the left mouse button is released. + + +Shift + left click button: Jump Zoom In by up to factor of 3 standard zooms. + + +Shift + right click button: Jump Zoom Out by up to factor of 3 standard zooms. + +
+ +
Ruler + +This mode is entered by clicking on the toolbar icon: + + +The ruler is used to measure the bearing and distance between two points: Click on first point and then move the mouse point around - the values will be continually updated. +A second click will freeze the ruler at that point. + + +This mode can also be entered by the keyboard shortcut Ctrl+Shift+U + +
+ +
Version1.1+: Select + +This mode is entered by clicking on the toolbar icon: + + +The select tool allows one to choose any waypoint or track by clicking on it (or reasonably near) in the viewpoint. + + +ATM to select a track one must actually click on a trackpoint, which is also selected. + + +This mode can also be entered by the keyboard shortcut Ctrl+Shift+S + +
+ +
TrackWaypoint Layer Tools + +You must have a Layer selected to use these tools. + +
Create Waypoint + +Enable this tool by clicking on the toolbar icon: + + +Left click will open the new waypoint dialog using the specified position. + +
+ +
Create/Edit Track + +Enable this tool by clicking on the toolbar icon: + + +General track edit/create tool. +The first left-click will create a new track and you will be asked to enter a name for the track. +If Shift is held, a track will be continued from a nearby trackpoint. +Subsequent left-clicks will add new trackpoints. +If Shift is held, the track will be joined to an existing track at the point selected. +If Ctrl is held, it will jump the new trackpoint position to a nearby existing trackpoint. + + +Right click or Backspace: undo one point. + + + + + +Double click or Escape: to finish track creation. +Finishing the track is also available via the right click and track menus. + + +One must finish the current track to be able to create another track. + +
+ +
Edit Route + +Enable this tool by clicking on the toolbar icon: + + +This operates in exactly the same way as the Edit Track above. + + +One must finish the current route to be able to create another route. + + +One can switch between the Edit Route and Route Finder tools while editing routes. + +
+ +
Create Route Using the Route Finder + +Enable this tool by clicking on the toolbar icon: + + +Requires an internet connection. +Left click to create a new trackpoint. +If it's the initial trackpoint you will be asked to enter a name for the route, otherwise the default routing engine will be queried to find a route to the new trackpoint. +Right click or Backspace: remove the last added route. + + +Escape: to finish route creation. +Finishing the track is also available via the right click and track menus. + + +One must finish the current route to be able to create another route. + + +One can switch between the Edit Route and Route Finder tools while editing routes. + +
+ +
Track Splitter + +Enable this tool by clicking on the toolbar icon: + + +Use this tool to split a track or route. +After enabling the tool, click on the track/route point of the track/route at the position where you want the split to occur. + +
+ +
Edit Waypoint + +Enable this tool by clicking on the toolbar icon: + + +Left Click/drag: select/move a waypoint. +If Ctrl is held at the same time, it will jump the waypoint position to a nearby existing trackpoint. +If Shift is held at the same time, it will jump the waypoint position to a nearby existing waypoint. + +Right-click on waypoint: opens a menu with waypoint actions (the +same menu accessed by right-clicking the waypoint in the layers panel) + +
+ +
Edit Trackpoint + +Enable this tool by clicking on the toolbar icon: + + +Left click near a trackpoint (in screen pixel terms) to bring up the Track Point Edit dialog on that trackpoint. +Whilst the edit dialog is already open, left click again and drag enables moving of the trackpoint. +If Ctrl is held at the same time, it will jump the new trackpoint position to a nearby existing trackpoint. + +
Edit Trackpoint Dialog + +Editing options in the Trackpoint Edit dialog include: + +Edit the trackpoint name +Changing raw lat/long position and altitude +Forward (go to the next trackpoint) +Back (go to the previous trackpoint) +Delete +Insert. Inserts a point halfway to next trackpoint +Split. + + + +Several fields are read only for reference purposes, values are shown if the trackpoint has such information: + +Time. +Speed and course. +'Between' values: Speed, Time Difference and Distance Difference. When moving between trackpoints (via the Back and Forward buttons) these values are calculated. +GPS precision factors. + + + +
+Trackpoint Edit Dialog: Example + + + +
+One must have been going downhill here to get a reasonable speed by bicycle! +
+
+
+ +
Show Picture + +Enable this tool by clicking on the toolbar icon: + + +Opens an image viewer with the picture associated with the waypoint. +By default this uses the default system image viewer. +For Linux you can override this with the setting in the + +
+ +
+ +
Georef Map Layer Tools + +You must have a Map Layer selected to use these tools. + +
Georef zoom + +Enable this tool by clicking on the toolbar icon: + +Changes the zoom level of the georeferenced map and changes the +&appname; zoom level accordingly. Useful if you are trying to match GPS +data to a georeferenced map. + +
+ +
Georef move + +Enable this tool by clicking on the toolbar icon: + + +Drag to move the georeferenced map. + +
+
+ +
Map Download + +You must have a Layer selected to use this. + + +Enable this tool by clicking on the toolbar icon: + + +Click to download a single tile. Drag to download tiles in the dragged rectangle area. + + +Right-click to redownload tiles via the selected method. Right-click and drag to redownload tiles in the dragged rectangle area by the selected method. +The possible methods to redownload one or more tiles are: + + + + +Bad +Only if the tile is corrupt in some way or missing, then this will download a new copy + + +New +Refresh the tile according to the local map cache and if server has a newer version + + +All +Redownload the tile + + + +Map Tile Information + +By right clicking on viewport and selecting Show Tile Information you can see the tile properties of this location for the current map layer and current zoom level. +This includes the remote source URL for the tile and the cached version on the local filesystem with timestamp details. + + + +
+Map Tile Info Dialog: Example + + + +
+This is using MapQuest at &appname; zoom level 128 over the Isle of Wight, UK. +
+
+ +
DEM Download + +You must have a Layer selected to use this. + + +Enable this tool by clicking on the toolbar icon: + + +Click to download and import a DEM file. + +DEM File Information + +By right clicking on viewport and selecting Show DEM File Infomation you can see the file properties of the DEM file for this location. +This includes the remote source URL for the file and the cached version on the local filesystem with timestamp details. + + + +
+DEM File Info Dialog: Example + + + +
+This is for block 51N, 003W - covering Bristol in the UK. +
+
+ +
Webtools + +Many services are available only via a web browser (Google Maps, OpenStreetMap Potlach editor, etc.). + + +Jumping from &app; to such service can become annoying. + + +&appname; allows you to open such service directly at the position currently viewed in &app;. + + +This feature is called Webtools. It is also known as External Tools. + +
+ +
+ + +
Preferences +
General +
Localisation +You can select units displayed by &appname; to best fit your usage. +
+Properties dialog: units part + + + +
+Concerning degrees, you can select the way to display them: + + +DDDdecimal degree + + +DMMpartial sexagesimal display: degrees, minutes and decimal part of minutes + + +DMSsexagesimal display: degrees, minutes and seconds + + + +
+Properties dialog: degree display options + + + +
+
+
Waypoint Icon Size +An option exists to control the icon (symbol) size used for waypoints + +
+
<emphasis>Home</emphasis> Default Location: Latitude and Longitude +You can set the Home location directly by inputting the latitude and longitude in decimal degrees. + +
+
Time Display +This controls the reference timezone that times are shown in. +Locale is the current user's system preference. This was how all times were shown up to version 1.5. +World will attempt to determine the timezone at an object's position. +UTC enforces this standard timezone. +
+
Tile's age +This age is used to decided wether or not a new request to tile server must be done. + +Changing this value, you will increase or decrese the network load. +
+
Default map layer directory +This property sets the default directory of the tiles cache. +This value is used when you create a new map layer. + +You are still able to change this value in each map layer properties. +
+
Map Cache Memory Size +This controls the amount of maps that are stored in memory, rather than having to reread from disk. +Generally if you have a system with lots of memory it's recommended to increase this value. + +
+
+ +
Export/External +
KML Export Units +Allows setting the units used when saved as the KML file type, such as Metric or Statue units +
+
GPX Track Order + + Other software may display tracks in a particular order (often the order saved into the file). + This allows you to control the order they are saved when exporting to a GPX file. + +
+
GPX Waypoint Symbols +Some GPS devices require waypoint symbols to be in a particular case. +E.g. On a Garmin Oregon 450 they must be in Title Case to be recognized. +
+
Image Viewer (Not Windows) +Allows setting the program used to view images associated with Waypoints. +By default this is set to xdg-open which should open the system's default image viewer, however this can be overridden with this setting. +Note: for Windows systems, viewing images associated with Waypoints always uses the system's default image viewer. +
+
External GPX programs +Allows setting the programs invoked via the Layer menu Export LayerOpen With 'program' +Two options are given so that it can be configured for various uses such as: + +An OSM editor (default) +Some other user defined program + +
+
GPSBabel +This allows setting the specific location of GPSBabel. +&appname; will need to be restarted for this setting to take effect. +
+
Auto Read World Files +If this is on, when a new image is selected for the GeoRef layer then the associated world file will be read to find the scale and positional properties. +The associated file is based on filename patterns; e.g. if the image is filename.jpg - then the world file may be filename.jpgw or filename.jgw +
+
Auto Device GPX Simplify +If this is on, GPX files will be simplified (using GPSBabel) if they are saved into a special location (by default a Garmin device location in OS file system). +Extra parameters used in process such as the location and limits applied can be refined by export_device_* values in . +A warning message is displayed when this occurs so one can consider if manually managing the tracks is needed, e.g. see methods. +The main intention for this is to prevent writing GPX files that are only partially useful. +For instance on a GPS Etrex 20 device: if a track with 1000 points is saved to it, the device will only read in the first 500 points, +thus effectively making only 1/2 of the track available. +Hopefully a simplified track will be more useful to follow to your destination when one is out in the wilds, than only a section of it. + +You will need to set the appropriate limits for your device, as this is not currently auto detected. +
+
+ +
Advanced +
Save File Reference Mode + + Files referenced within project files can be saved with either absolute or relative paths. + Using relative paths can be useful when copying the project file and the associated files between different systems. + +
+
Ask for Name before Track Creation +A setting to control whether an automatic name is used when creating a new track or route, or whether you are asked to enter a name. +
+
Show Tooltip during Track Creation +A setting to control whether the tooltip with the cumulative track or route distance is shown when creating tracks and routes. +
+
The number of recent files + + The number of recent files shown in the FileOpen Recent File menu. + A value of -1 means all files. The new value applies to New Windows only (or on application restart). + +
Open files in selected layer +A setting to control whether non Viking format files (i.e. typically GPX or KML files) will open in the selected TrackWaypoint Layer. +When no TrackWaypoint Layer is selected (or the layer is invisibile) then the file will be open in the default manner: at the top level. + +
+
Show calendar day names +A setting to control whether the calendar displays day names (Mon, Tue, etc...) or not. + +
+
+
+ +
OpenStreetMap Traces +
OAuth Method + + Using the OAuth method means that your OSM account details are no longer needed to be known by &appname;. + Instead specific tokens are generated for use only by &appname; which are associated with your OSM account. + +Get New OSM Access Tokens + Use this button to generate a new OSM Access Token Key and Secret. + You will be redirected to the OSM website to confirm allowing &appname; to access the GPX Traces features. + The tokens returned by the OSM website will be stored in the Access Token Key + Access Token Secret preferences. + +Access Token Key + Access Token Secret: +These are the values used, however one typically does not need to manually change them. +
+
HTTP Basic Authentication (Discouraged) +OSM Username + Password +Store your OSM details here, so that you don't need to enter it in every time in the procedure. +This is not recommended and one should use the OAuth method using access tokens described above. + + +Your OSM password will be stored in plain text. + + + + +This password is transferred unencrypted in every request sent to the OpenStreetMap server. This is due to the use of OpenStreetMap's basic authentication method. + + + + +When OAuth capability is built into &appname; (the default), use of HTTP Basic Authentication can only be used if the osm_basic_auth is enabled. + + +
+
+ +
Mapnik + +If any changes to these settings are made, you will need to restart &appname; to make them be applied. + + +
Plugins Directory +The location of Mapnik plugins. An attempt is made to automatically determine the initial value, + however if this is wrong or Mapnik is upgraded then the directory can be set here. +
+
Fonts Directory + +The location of fonts for use with Mapnik. Normally it is best to simply use the System's font directory. + +
+
Recurse Fonts Directory +Load fonts in any sub-directories of the main font directory. +
+
Rerender Timeout +The time in hours before any tile is rerendered. +This is useful in case the underlying source data for the tiles changes (e.g. OSM data is continually evovling). + &appname; normally has no way of knowing when the data has changed, so this simple timeout method is provided to maintain consistency of the tile images. +
+
CartoCSS +This allows setting the specific location of the carto executable. +
+
Threads + + The number of threads to use for Mapnik rendering tasks. + By default the value is set to the 1 in case of any multi-threading rendering code chain crashes. + Otherwise trying setting the value to the number of the CPUs of the system minus one (so as not to overload the system), in order to minimise the overall rendering times. + +
+
+ +
Routing +
Routing engine +You can select the routing engine used by default, ie by features that do not propose a live selection, like . +
+
+ +
Startup +Naturally since these preferences effect the startup, the values will not be used until &appname; is restarted. +
Restore Window Setup +When this is enabled, the main window size and layout (such as whether the statusbar or layers panel are shown) is restored to the values from last use. +
+
Default Map Layer +When this is enabled, a map layer is automatically added whenever &appname; is opened and a &appname; file is not to be loaded. +The map layer used is defined by the map layer's default values. +
+
Startup Method +Enables selection of how the startup position should be determined. + + +Home Location (default) +Position as set by the Set the Default Location + + +Last Location +Uses the last position viewed on the viewport + + +Specified File +Load the file as specified below + + +Auto Location + + Uses the GeoClue service if available + or otherwise the web service hostip.info to attempt to determine your location via IP lookup + + + + +
+
Startup File +Loads this specified file when the Startup method is set to Specified File +
+
Check For New Version +Periodically (no more than once every 14 days), check to see if there is a new version of &appname; available. +
+
+ +
Toolbar +
Append to Menu +Allows setting the toolbar on the same vertical space as the menu, thus increasing vertical space for the map. +
+
Icon Size +Allows configuration of the icon size, including overiding the system's default preference to the setting desired just for &appname;. +
+
Icon Style +Allows configuration of the icon style, including overiding the system's default preference to the setting desired just for &appname;. +
+
Customize +Opens the Customize Toolbar dialog. +From this dialog the items in the toolbar can be added, removed and reordered. Reordering of items is performed by drag and drop. +
+Customize Toolbar dialog + + + +
+
+
+ +
+ + +
Howto's +
Getting Started + +&appname; from version 1.5 has several features to ease the start up process. +On the very first run, you will be asked if you want to enable these features which make use of an Internet connection. +If you select no or you have upgraded from an earlier version you can choose to enable any of the startup options via the . + + +Some other general use cases for using &appname;, are as follows: + +
Go to an area of interest + +&appname;'s default location is a Manhatten, New York, USA, so you may need to pick another place that interests you - such as where you live. + + +Method A + + + Use the online location address/place search. + + + Use the Go to Location toolbar button or from the menus + ViewGo to Location. + You can change the search location provider if desired. + Enter the name of place you wish to go to (you may need to specify the country to refine the search). + Also you can enter a post code or a ZIP code instead. + + + You will need an internet connection for this search to work + + + + +Method B + + + If you know the coordinates of where you want to view: + + +Use View and select from either Go to Lat/Lon or Go to UTM and then enter in the specific coordinates. + + + + +Method C + +Use the GPS Layer or FileAcquireFrom GPS +to load data directly from your GPS into &appname;. + +You can specify the types of data to acquire: Tracks, Routes and/or Waypoints. + + +You must have write permission to the port used. For Unix like OS: + + /dev/ttyS0 is the first serial port + /dev/ttyUSB0 is the first USB port + usb: is any USB port + +Depending on your distribution only one of the USB port types may work +For Windows: + + com1: is the first serial port + usb: is any USB port + + + + The GPS devices supported are those supported by GPSBabel. + Garmin and Magellan GPS devices supported by all versions, later versions of GPSBabel support more devices such as DeLorme and Navilink. + + + + +Method D + + +Get data from files in GPX or KML format, which can be opened directly. +Use FileOpen + + +Other formats can be imported that are supported by GPSBabel. +FileAcquireImport File With GPSBabel... + + + +The viewport will be automatically moved and resized to view the contents of the file. + + + + +
+
Add a Map Layer + +Use LayersNew Map Layer, and choose a suitable cache directory +where you would like to store your tracks and click OK. Zoom to a +comfortable level (I suggest 4 mpp) by clicking the left and right +mouse buttons on the gray area where your tracks are. Now from the menu +choose the Tool. Click where you would like to download a +map. Regardless of what tool you are using, the middle mouse button +always pans. + + +You need an open internet connection when you are downloading maps. + + + +If you can no longer see your tracks or waypoints and only the map, +it is because the layer named Map is ABOVE your TrackWaypoint layer that your GPS data is in. +This means that it will be drawn last and on top of the other . +Look at the to the left which shows this order. +Select the Map layer from the list and click the down arrow button beneath the list until the Map layer is below the TrackWaypoint layer. +Your tracks will now be drawn over the map. + +
+ +
Set Your Home Location + + You can save the current center position of the viewport as the default location AKA the Home Location by + EditSet the Default Location. + + + Then at any time you can return to this place by clicking on the Home icon on the toolbar. + + + You can also set the default location via specifing the exact latitude and longitude in the . + +
+ +
+
From 1st startup to GPS track (including offline maps) + +The first you'll see is an empty map, because &appname; in its default configuration will download maps only on demand. +Before fetching unneeded data, one can position to a location of interest, e.g. Stuttgart: ViewGo to Location, enter Stuttgart. + +
Fetching the maps + +Map + + +LayersNew Map Layer +in the layer properties dialogue choose e.g. OpenStreetMap (Mapnik). + +For the moment, we keep the default Maps Directory (the directory in +which the maps will be stored and can be used for offline usage). + + +Check Autodownload maps and keep the zoom level as Use Viking +Zoom Level. + + +however, that these settings will play an important +role in the pre-fetch for offline usage discussed later + + + + +You'll see a map of Stuttgart. Using the mouse wheel, you can +zoom in and out. The maps for the choosen resolution will be downloaded +automatically. + + +DEM Layer (Height Map) + + +Zoom out to 512. +LayersNew DEM Layer +Keep the download source as is (SRTM Global 90m), hit OK. + + +In the layer listing on the left, the layer should reside +above the map layer. If this is not the case, highlight the DEM layer +an shift it one up (using the arrow up button). + + +highlight the DEM layer in the layer listing on the left +in the toolbar, check DEM layer download/import (the last symbol) +a left-click in the map window should then fetch the DEM data + + +This might take some time. + + +Sometimes, a tile does not show up correctly (you might see only a +black frame in the map window) because it got corrupted during +transfer. In order to correct this, you can delete the corresponding +datafile in the cache. right-click the DEM layer properties + + +The DEM Files listing allows you to delete the specific tiles (alternatively do this from the command line). + + +You can also alter the Min. and Max. elevation in this dialogue. + + +
+
GPS Track with Height Profile + +Uncheck the layer (the map is shown again) + + LayersNew TrackWaypoint Layer + Ensure the new track layer is above the map layer. + +Expand the layer, select Tracks +In the tools menu choose Create Track + +Leftclick in the map window, enter a name + + Click several times to generate a track (a right-click removes the last point). + Height data is set automatically since DEM data is available + +Expand tracks in the layer menu, your track should show up, select it +Right click your track, select Properties +Click the tab Elevation-distance - enjoy the plot + + +In order to save this setting for later usage + + +click OK in the Track Properties dialog +FileSave As, choose a name (you can open this view later via fileOpen). + + +
+
Usecase: offline data for holiday + +Suppose you want to have the and data offline for your holiday in Italy near Bologna. + + +Start a new &appname; session. +ViewGo to Location, enter Bologna +LayersNew Map Layer +Choose e.g. OpenStreetMap (mapnik). +adapt the maps directory e.g. to /home/user/.viking-map-holiday/. +This allows you to delete the map stuff after holiday without purging the rest of your maps. + +check autodownload map +keep viking zoom level +zoom out to 1024 +add a layer (as discussed above) +download the DEM data + +In the &app; version discussed here, the DEM data automatically +are stored in /home/user/.viking-maps/. You can move the corresponding +tiles into .viking-map-holiday/ if you like. + + +Download map data for all zoom levels + + +uncheck the DEM layer for the map to show up +navigate the map to be centered at Bologna +choose the zoom such, that all regions of interest are displayed in the map window (e.g. 1024) + +follow this sequence until you have all tiles for all zoom levels you need + +right-click the map layer properties +set the zoomlevel explicitely one below the last (in the first cycle 512), hit OK +right click the map layer Download Missing Onscreen Maps +wait until all tiles for that resolution have been downloaded + + + +This may take some time and some hard disk capacity. + +Do not forget to save your configuration (as discussed above). + + +
+ +
+
OpenStreetMap project + +OpenStreetMap (OSM) is a collaborative project to create a free editable map of the world. +One of the sources of data for this project is GPS tracks. +&appname; supports this project via the GPS Traces methods, both uploading and downloading such data. + + + Authentication/authorization is required to use these services. See . + + +Also see for further detail. + +
Uploading data to OpenStreetMap + +It is possible to upload data directly from &appname; to OpenStreetMap. + + +Upload a layer + +One solution is to upload whole a layer. To do this, +simply select the layer and right click on it. Then, select Upload to +OSM. + + + +Upload a single track +Another solution is to upload an individual track. Simply select the track and right click on it. +Then select Upload to OSM. + + + +Fill in the form + +The filename is the name you want your upload has on the server. This information is displayed by the osm server. +The description is some descriptive information. +The tags field is a white space separated list of tags. + + +
+ +
Downloading Traces from OpenStreetMap + +It is possible to download GPS traces directly from OpenStreetMap into &appname;. +This feature can be really useful for checking existing data before uploading new ones. + + +Download all visible tracks +One solution is to select + +File +Acquire +OSM traces... +. +Each request can get up to 5,000 points. +The dialog box allows setting which group of 5,000 points to get. These groups are known as Page Numbers which start at 0. +Increasing the page number parameter allows one to request the subsequent sets of point groups. + + +
+
Downloading Your Own Traces from OpenStreetMap + +It is possible to download any of your personal GPS traces previously uploaded to OpenStreetMap into &appname;. + + +Initially this will return the list of your OSM Traces, from which you can select which specific traces to retrieve. +This list can be sorted on each column so that it easier to find an individual trace or select a group of traces by similar properties. + +
+ +
+ +
Geotagging + + This assumes you already have a layer enabled for ease of use (if not see above to get one). + +
Manual Positioning + + This is useful for instances when you already know exactly where the image was taken (no need for tracklog). + Or maybe you want to adjust an automatically generated waypoint for the position of the subject of the image rather than the location that the photograph is taken from. + ATM this process only works on an individual image, so it will be tedious for handling lots of images. + + + First create a layer or use an existing one; and select it in the . + NB Make sure this layer is above the map layer in the Layers Panel list. + Create a new waypoint (or move an existing one) to exact location desired: + + Select the tool, then left click on the map at the location desired, choosing an image to associate with it in the new waypoint dialog + Select the tool, then left click on waypoint to be moved. Left click again and drag the waypoint to the location desired + + Then using the Select tool left click on waypoint to select it, then right click to access the Waypoint properties menu, then choose + Update Geotag on ImageUpdate + + + The Update Geotag on Image options are only available when a waypoint has an image associated with it. + +
+ +
Automatic Positioning Against a Tracklog + + First you will need a tracklog with timestamps in it. Either load one from a previously saved file or freshly acquired from a GPS device - + see Getting Started. + It helps if this is the track that was recorded at the time you took some photographs! + + + Select the track either from the layers panel on the left or via the viewport using the tool. + Then right click on it and chose the Geotag Images... leading you to the Dialog. + + + Load some images that where taken around the time the track log was recorded. Confirm the other options in the dialog - normally the defaults should be alright and select OK. + If things are succesful, new waypoints with thumbnail images of the photographs will appear. + You should probably check they are really in the right place as often the timestamp of the camera may not be aligned to the GPS correctly leading to inferring incorrect locations. + +Option: Overwrite Waypoints + + This is particularly useful when one finds an attempt at geotagging gives wrong locations, often due to time offset issues. + Simply try again with a new time offset (often 1 hour adjustments due to Daylight Savings or Summer Time times) and the old waypoints will be updated (instead of creating new ones). + + + + If you have multiple tracks in a TrackWaypoint layer, then invoking the Geotag Images... action on the layer + will search all the tracks to find location matches. + +
+
+ +
GPS Real Time Location + + &appname; relies on gpsd to provide the current location from a real time feed from a GPS device. + + + This assumes you already have a layer enabled for ease of use (if not see above to get one). + + + Turn on the GPS Device, ensure it has figured out it's location and plug it in to your computer. + +
Set Up GPS Layer + + You will need a layer. One can be added via LayersAdd GPS Layer. + + + Adjust the Realtime Tracking Mode settings to interface with gpsd as necessary. Normally the defaults should suffice. + + + Current Linux distributions should run gpsd automatically when a GPS Device is plugged in. Otherwise you may have to run gpsd manually. + + + Then right-click the layer and select Start Realtime Tracking. + Hopefully the viewport should jump to the GPS location. + + + Troubleshooting checklist: + +Confirm gpsd is running. +Confirm on the GPS device it has a location. +Confirm the Realtime Tracking Mode settings. +
+
+ +
What to Do if &appname; Does Not Seem to Work + +In order to get some information about what &appname; is doing, start it in verbose debug mode via the command line: +viking -dV + + +For instance you can check the correct URLs &appname; is using in requesting remote data for DEMs or map tiles in the verbose debug output. +E.g. Something like this for DEMs: + +** (viking:28778): DEBUG: curl_download_uri: uri=http://dds.cr.usgs.gov/srtm/version2_1/SRTM3/Eurasia/N48E008.hgt.zip +* About to connect() to dds.cr.usgs.gov port 80 (#0) +* Trying 152.61.128.95... * connected +* Connected to dds.cr.usgs.gov (152.61.128.95) port 80 (#0) + GET /srtm/version2_1/SRTM3/Eurasia/N48E008.hgt.zip HTTP/1.1 +User-Agent: viking/0.9.8 libcurl/7.18.2 GnuTLS/2.4.2 zlib/1.2.3.3 libidn/1.8 +Host: dds.cr.usgs.gov +Accept: */* + HTTP/1.1 200 OK + Date: Sun, 26 Jul 2009 18:13:38 GMT + Server: Apache + Last-Modified: Tue, 21 Jul 2009 19:57:35 GMT + ETag: eac3f8-1828f5-46f3caa76070a + Accept-Ranges: bytes + Content-Length: 1583349 + Content-Type: application/zip + +* Connection #0 to host dds.cr.usgs.gov left intact +* Closing connection #0 +** (viking:28778): DEBUG: dem_layer_add_file: /home/username/.viking-maps/srtm3-Eurasia/N48E008.hgt.zip + +Or for OSM Mapnik tile server: + +* About to connect() to tile.openstreetmap.org port 80 (#0) +* Trying 193.63.75.28... * connected +* Connected to tile.openstreetmap.org (193.63.75.28) port 80 (#0) + GET /13/4065/2748.png HTTP/1.1 +User-Agent: viking/0.9.96 libcurl/7.20.1 GnuTLS/2.8.6 zlib/1.2.3.4 libidn/1.18 +Host: tile.openstreetmap.org +Accept: */* + +* HTTP 1.0, assume close after body + HTTP/1.0 200 OK + Date: Thu, 14 Oct 2010 22:18:42 GMT + Server: Apache/2.2.8 (Ubuntu) + ETag: "b66ff9d46474bab68262a3483428a232" +** (viking:16704): DEBUG: curl_get_etag_func: ETAG found: "b66ff9d46474bab68262a3483428a232" + Content-Length: 17194 + Cache-Control: max-age=94805 + Expires: Sat, 16 Oct 2010 00:38:47 GMT + Content-Type: image/png + Age: 5153 + X-Cache: HIT from konqi.openstreetmap.org + X-Cache-Lookup: HIT from konqi.openstreetmap.org:3128 + Via: 1.1 konqi.openstreetmap.org:3128 (squid/2.7.STABLE7) + Connection: close + +* Closing connection #0 +* About to connect() to a.andy.sandbox.cloudmade.com port 80 (#0) +* Trying 178.63.75.195... ** (viking:16704): DEBUG: curl_download_uri: uri=http://tile.openstreetmap.org/13/4065/2749.png +* About to connect() to tile.openstreetmap.org port 80 (#0) +* Trying 193.63.75.28... * connected +* Connected to a.andy.sandbox.cloudmade.com (178.63.75.195) port 80 (#0) + GET /tiles/cycle/13/4065/2747.png HTTP/1.1 +User-Agent: viking/0.9.96 libcurl/7.20.1 GnuTLS/2.8.6 zlib/1.2.3.4 libidn/1.18 +Host: a.andy.sandbox.cloudmade.com +Accept: */* + +* connected +* Connected to tile.openstreetmap.org (193.63.75.28) port 80 (#0) + GET /13/4065/2749.png HTTP/1.1 +User-Agent: viking/0.9.96 libcurl/7.20.1 GnuTLS/2.8.6 zlib/1.2.3.4 libidn/1.18 +Host: tile.openstreetmap.org +Accept: */* + +* HTTP 1.0, assume close after body + HTTP/1.0 200 OK + Date: Thu, 14 Oct 2010 23:44:35 GMT + Server: Apache/2.2.8 (Ubuntu) + ETag: "8e520ad47ce9c1b63430554886eb5fab" +** (viking:16704): DEBUG: curl_get_etag_func: ETAG found: "8e520ad47ce9c1b63430554886eb5fab" + Content-Length: 18094 + Cache-Control: max-age=87742 + Expires: Sat, 16 Oct 2010 00:06:57 GMT + Content-Type: image/png + X-Cache: MISS from konqi.openstreetmap.org + X-Cache-Lookup: MISS from konqi.openstreetmap.org:3128 + Via: 1.1 konqi.openstreetmap.org:3128 (squid/2.7.STABLE7) + Connection: close + + +
+ +
+ + +
+ Extending Viking + + Currently, &app; has some extention points based on configuration files. The file format is heavily inspired by the GtkBuilder file format: you specify the class of the GObject to build and set its properties. Technically, it is a XML file containing a "objects" root element. Inside this element, you set a collection of "object". + Here is an example: + + + Property value + Property value + + ... + +]]> + + + You can find more examples in the documentation part of the distribution. + + It is also possible to override the internal defaults e.g. to update any parameters should they change over time, + by adding the values into your configuration file. + When you define object group that already exists (and for Maps this means by a repeated Id key, but you may have to examine the source code to work out what the relevant Id values are) then you need to define all the other keys as well, otherwise they will be reset to the defaults. + +
+ Map Source + It is possible to add new map's sources. The file is ~/.viking/maps.xml for UNIX like systems, C:\Documents and Settings\username\.viking\maps.xml on Windows XP or C:\Users\username\.viking\maps.xml on Windows 7 onwards. + An example of the file is in the distribution doc/examples/maps.xml. Further examples and values are online in the Maps Wiki + + The VikSlippyMapSource allows to declare any map's source working like OpenStreetMap. It supports the following properties: + + + id + this is an integer and should be unique as it used to identify the map source + + + name + a string (should be unique) that is used for the OSM style cache directory name when the Map Cache directory is the default (~/.viking-maps) + + + label + the text displayed in the map's source selection dialog + + + hostname + the server's hostname (eg. "tile.openstreetmap.org") + + + url + + the parametrized address of the tile, in the spirit of C printf format, with 3 "%d" fields for Z, X and Y (in that order) (eg. "/%d/%d/%d.png") + + The full parametrized address can just be put in the URL field and the hostname field doesn't need specifying. + e.g. "https://tile.openstreetmap.org/%d/%d/%d.png" + + + + + zoom-min (optional) + The minimum zoom value supported by the tile server. The Default is 0 if not specified. + + + zoom-max (optional) + + The maximum zoom value supported by the tile server. The Default is 18 if not specified. + See Zoom Levels + + + + lat-min (optional) + The minimum latitude value in degrees supported by the tile server. The Default is -90 degrees if not specified. + + + lat-max (optional) + The maximum latitude value in degrees supported by the tile server. The Default is 90 degrees if not specified. + + + lon-min (optional) + The minimum longitude value in degrees supported by the tile server. The Default is -180 degrees if not specified. + + + lon-max (optional) + The maximum longitude value in degrees supported by the tile server. The Default is 180 degrees if not specified. + + + file-extension (optional) + + The file extension of the files on disk. The default is .png + If the tile source URL ends in something other than .png, then this parameter will need to match it. + This can also be useful in reading a tileset from other software which may name tiles in an alternative form, + e.g. for Mobile Atlas creator it names them .png.tile + The file types actually usable are those supported by GDK Pixbuf Library, which includes at least PNG and JPEG. + Remember to include the beginning '.' when specifying this parameter. + + + + use-direct-file-access (optional) + + Only use files on disk. The default is FALSE + This can also be useful for tilesets already on disk as it will avoid attempting to download any tiles. + Thus with this type the hostname and url parameters are not necessary and are ignored. + + + + switch-xy (optional) + + Swap the X,Y values around in the URL parametrized ordering. + The default is false. + + + + check-file-server-time (optional) + + Sends the timestamp of the tile to the server, so the server can decide whether it should send a new tile or not. + The default is false. + + + + use-etag (optional) + + Use and compare the ETag value in determining whether to download a newer tile. The default is false. + The ETag value is stored in a separate file in the same directory as the tile to enable checking the value across multiple runs of the program. + + + + tilesize-x (optional) + The tile x size. The default is 256 pixels if not specified. + + + tilesize-y (optional) + The tile y size. The default is 256 pixels if not specified. + + + scale (optional) + + The tile scale. The scale is 1 if not specified. + Use a value of 2 to represent high res tiles. + Don't change the tilesize as the internal display size is still based on 256 pixels. + + + + + + The VikTmsMapSource allows to declare any TMS service. It supports the following properties (as per VikSlippyMapSource above): + + + id + + + label + + + hostname + + + url + + + check-file-server-time (optional) + + + zoom-min (optional) + + + zoom-max (optional) + + + lat-min (optional) + + + lat-max (optional) + + + lon-min (optional) + + + lon-max (optional) + + + + The VikWmscMapSource allows to declare any WMS or WMS-C service. It supports the following properties (as per VikSlippyMapSource above): + + + id + + + label + + + hostname + + + url + + + check-file-server-time (optional) + + + zoom-min (optional) + + + zoom-max (optional) + + + lat-min (optional) + + + lat-max (optional) + + + lon-min (optional) + + + lon-max (optional) + + + +
+ +
+ Go-to search engines + It is possible to add new new search engines for the "Go-To" feature. The file is ~/.viking/goto_tools.xml. + An example of the file in the distribution doc/examples/goto_tools.xml. + Currently, there is a single object class available: VikGotoXmlTool. Such feature allows to declare any search engine using a XML format as result. + The related properties are: + + + label + the text displayed in the Go-To dialog + + + url-format + the parametrized address of the query, in the spirit of C printf format, with a single "%s" field (replaced by the query string) + + + lat-path + XML path of the latitude (eg. /root/parent/elem) + + + lat-attr (optional) + name of the attribute (of previous element) containing the latitude + + + lon-path + XML path of the longitude (eg. /root/parent/elem) + + + lon-attr (optional) + name of the attribute (of previous element) containing the longiude + + + + As a facility (or readability) it is possible to set both path and attribute name in a single property, like an XPath expression. To do so, simply set both info in lat-path (or lon-path) in the following format: /root/parent/elem@attribute. +
+ +
+ External tools + It is possible to add new external tools. The file is ~/.viking/external_tools.xml. + An example of the file in the distribution doc/examples/external_tools.xml. + The VikWebtoolCenter allows to declare any Webtool using a logic based on center coordinates and zoom level value. + The related properties are: + + + label + the text displayed in the menu entry + + + url + the parametrized URL to open, in the spirit of C printf format, with 2 "%s" and a "%d" fields for X, Y and Z (zoom level) (eg. "http://hostname/?lat=%s&lon=%s&zoom=%d") + + + + The VikWebtoolBounds allows to declare any Webtool using a logic based on bounds coordinates. + The related properties are: + + + label + the text displayed in the menu entry + + + url + the parametrized address of the tile, in the spirit of C printf format, with 4 "%s" fields for left, right, bottom and top (eg. "http://hostname:8111/load_and_zoom?left=%s&right=%s&bottom=%s&top=%s") + + + +
+ +
+ Routing engine + It is possible to declare new routing engines. The file is ~/.viking/routing.xml. + An example of the file in the distribution doc/examples/routing.xml. + The VikRoutingWebEngine allows to declare a routing engine available via HTTP. + The related properties are: + + + id + a string, should be unique as it used to identify the routing engine + + + label + the text displayed in the menu entry + + + format + + The GPSBabel format code to interpret the service response. By default a GPX response is expected and processed internally. However if the service returns different format then GPSBabel is used to transform the text into something that &appname; can understand. Only formats that GPSBabel supports can be used: e.g. 'gpx', 'kml', 'gtrnctr' (for Garmin Training Center .tcx files), etc... + Use gpsbabel --help on the command line to find out the supported file types and their codes to process them. + + + + url-base + the base URL of the web service (eg. "http://hostname/service?") + + + url-start-ll + the part of the URL setting the starting point location, parametrized in the spirit of C printf format, with 2 "%s" for coordinates (eg. "&start=%s,%s") + + + url-stop-ll + the part of the URL setting the end point location, parametrized in the spirit of C printf format, with 2 "%s" for coordinates (eg. "&stop=%s,%s") + + + url-via-ll (optional) + the part of the URL setting via point location, parametrized in the spirit of C printf format, with 2 "%s" for coordinates (eg. "&via=%s,%s") + + + url-start-dir (optional) + the part of the URL setting the starting point location for direction based routing, parametrized in the spirit of C printf format, with one "%s" for direction (eg. "&start=%s") + + + url-stop-dir (optional) + the part of the URL setting the end point location for direction based routing, parametrized in the spirit of C printf format, with one "%s" for direction (eg. "&start=%s") + + + url-ll-lat-first (optional) + The ordering of the lat/long terms in the Start, Stop and Via URL settings. By default this is TRUE. + For instance using Brouter services, the URL uses a pair of values which is longitude and then latitude. Thus setting this value to FALSE ensures the value substitution is performed in the necessary order. + + + referer (optional) + A URL to serve as referer for the HTTP request (eg. "http://hostname/") + + + follow-location (optional) + the max depth of recursive redirections + + + +
+ +
+ Remote File Datasources + It is possible to add web references expected to return a file which can then be opened directly or converted via GPSBabel. + The file is ~/.viking/datasources.xml. + An example of the file is in the source distribution doc/examples/datasources.xml. + The VikWebtoolDatasource allows to declare any URL using logic based on coordinates. + The related properties are: + + + label + the text displayed in the menu entry + + + url + + the parametrized URL to open in the spirit of C printf format, with up to 9 "%s" values. e.g. http://hostname/getfile?lat=%s&lon=%s + The order and meaning of these parameters is given by the url_format_code below + + + + url_format_code + + A string describing the parametrized URL substitution parameters, each character represents how to translate each term. + B = Bottom of the current view i.e. minimum latitude + L = Left of the current view i.e. minimum longitude + T = Top of the current view i.e. maximum latitude + R = Right of the current view i.e. maximum longitude + A = center lAtitude of the current view + O = center lOngitude of the current view + Z = OSM Zoom value of the current view. See Zoom Levels + P = selected Point's latitude + N = selected poiNt's longitude + S = A user specified input string requested from the user via a dialog box + Thus for the url example above then the format code should be AO + + + + file_type + + This value is passed on for the -i parameter in interfacing with GPSBabel. + If it is not defined then the returned file is interpreted internally as a GPX file. + Possible values such as 'kml', 'mapsource' etc.. can be used. See GPSBabel File Formats for the full list. + + + + babel_filter_args + + This value is passed on for the filter arguments interfacing with GPSBabel. + E.g. "-x nuketypes,routes" can be used to filter all routes from the results. + + + + input_label + + This value is used when requesting input from the user. + It is the label of the text input box. + + + + +
+ +
+ System Extension File Locations + Note that, on UNIX like systems, the extension files (&extfiles;) are also searched in /etc/viking and /usr/share/viking directories (or related in your system). + The XDG_DATA_DIRS environment variable can be used to change these directories. + The XDG_DATA_HOME environment variable is also used (if set) to look for these extension files. +
+ + +
+ Miscellaneous Settings + Various individual values are automatically saved between &app; sessions in the ~/.viking/viking.ini file. + This file is not intended to be manually edited, but since it is a plain text file it can be changed if desired. + Some values in this file are read only, in the sense that there is no way to set it other than by manually entering in the keys and values (the key will not exist in the file otherwise). This allows some fine tuning of &app; behaviours, without resorting to recompiling the code. However is it not expected that these values should need to be changed for a normal user, hence no GUI options for these have been provided. + Here is the list of the read only keys and their default values. + + + curl_cainfo=NULL + See CURLOPT_CAINFO + + + curl_ssl_verifypeer=1 + See CURLOPT_SSL_VERIFYPEER + On Windows this is defaulted to 0 to get HTTPS connections to at least work, + otherwise any attempts at verifying always fail. + [Some incompatibily is suspected in the reliant binary DLLs] + + + geoclue_accuracy_level=4 + Set the integer value for the accuracy level request to the GeoClue service. Values to match the GClueAccuracyLevel: + + 0 = GCLUE_ACCURACY_LEVEL_NONE + 1 = GCLUE_ACCURACY_LEVEL_COUNTRY + 4 = GCLUE_ACCURACY_LEVEL_CITY + 5 = GCLUE_ACCURACY_LEVEL_NEIGHBORHOOD + 6 = GCLUE_ACCURACY_LEVEL_STREET + 8 = GCLUE_ACCURACY_LEVEL_EXACT + + + + gpx_tidy_points=true + ATM Only attempts to remove a suspicious first point of a GPX track + (as opposed to any points within a track). + + + gpx_tidy_points_max_speed=340 + Over this speed (in metres per second) for the first pair of points - the first point is removed. + + + layers_create_trw_auto_default=false + Create new TrackWaypoint layers without showing the layer properties dialog first. + + + layers_panel_calendar_markup_mode=3 + 0=No markups. 1=Day marked. 2=Day marked and tooltips created. 3=Auto (timed tooltip creation, so if too slow it reverts to 1) + + + maps_max_tiles=1000 + + + maps_min_shrinkfactor=0.0312499 + + + maps_max_shrinkfactor=8.0000001 + + + maps_real_min_shrinkfactor=0.0039062499 + + + maps_scale_inc_down=4 + + + maps_scale_inc_up=2 + + + maps_scale_smaller_zoom_first=true + + + srtm_http_base_url=https://dds.cr.usgs.gov/srtm/version2_1/SRTM3 + Allows using an alternative service for acquiring DEM SRTM files. + Note that the layout on the server needs to be split into Continent directories. + + + mapnik_buffer_size=128 (in pixels) + + + osm_basic_auth=false + Set to true to force the use of HTTP Basic Authenication even when OAuth is available + + + background_max_threads=10 + + + background_max_threads_local=Number of CPUs + + + window_default_tool=Pan + Options are: Pan, Zoom, Ruler or Select + + + window_menubar=true + + + window_copy_centre_full_format=false + + + version_check_period_days=14 + + + trackwaypoint_start_end_distance_diff=100.0 + + + gps_statusbar_format=GSA + This string is in the Message Format Code + + + trkpt_selected_statusbar_format=KEATDN + This string is in the Message Format Code + + + utils_nearest_tz_factor=1.0 + + + viewport_history_size=20 + + + viewport_history_diff_dist=500 + In metres. + + Go Back or Go Forward requests over this range from the last history location will move back to that position. + If within this range it will skip over this location and move on to the next saved history location. + + + + viewport_scale=1 + + If Viking doesn't automatically detect a high resolution display, you can force the setting here - typically by setting this to 2. + + + + external_diary_program=rednotebook + Or in Windows it uses C:/Progra~1/Rednotebook/rednotebook.exe - This string value must use Unix separators and not have spaces. + + + external_astro_program=stellarium + Or in Windows use C:/Progra~1/Stellarium/stellarium.exe - This string value must use Unix separators and not have spaces. + Needs to be version 0.15.0 or greater (otherwise due to this Bug means this does not actually work. + + + bfilter_simplify=100 + + + bfilter_compress=0.001 + + + list_date_format=%Y-%m-%d %H:%M + A date format description as passed on to strftime(). + Note that when displayed in tables sorting by this column simply uses the text value, rather than the underlying date/time value. + + + + export_device_path=OS Specific + UNIX = "/media/user/GARMIN/Garmin/GPX" + WINDOWS = ":/Garmin/GPX" + + + export_device_trackpoint_limit=10000 (Typical Garmin Edge limit) + Older Garmins limits are typically much lower - Etrex 20/30 is 500 + + + export_device_routepoint_limit=250 + + + kmz_default_maps_dir=Empty + You may want to use something like: "/media/user/GARMIN/Garmin/CustomMaps" + + + +
+ Message Format Code + Currently for ease of implementation the message format code is a string of characters. + Each character represents what should be inserted in relation to a Trackpoint. + One day it might evolve into something more user friendly with a frontend to control it, perhaps allowing arbitary text too. However for now at least some control is offered :) + + + + Character Code + + G = Some text to display at the start of the message - GPSD + K = Some text to display at the start of the message - Trkpt + A = Altitude of a Trackpoint + S = Speed of a Trackpoint + B = Vertical Speed (Climb) + C = Course of a Trackpoint + L = Location of a Trackpoint + T = Time of a Trackpoint + M = Time diff of a Trackpoint from the previous trackpoint + X = Number of satellites used in the trackpoint fix + D = Distance of the trackpoint from the start of a track (following along the track) + F = Distance of the trackpoint from the finish (end) of a track (following along the track) + P = Distance difference of the trackpoint from the previous trackpoint + N = Name of track to which the trackpoint belongs + E = Name of the trackpoint + + + + Output Notes + + If the output has * after it, then the value has been calculated via interpolation (such as speed when the Trackpoint does not contain a speed value). + If the output has ** after it, then difficulties were encountered in trying to work the value so probably a default of 0 will be shown. + + + + +
+ +
+ +
+ Keyboard Shortcuts (Accelerator) Settings + This is held in the file ~/.viking/keys.rc + It is in the standard GTK Accelerator map format. Values are automatically read in and saved between &app; sessions. + This file is not intended to be manually edited, but since it is a plain text file it can be changed if desired. +
+ +
+ + + + + + + + +
diff --git a/help/Makefile.am b/help/Makefile.am new file mode 100644 index 0000000..c2576f1 --- /dev/null +++ b/help/Makefile.am @@ -0,0 +1,73 @@ +if GEN_MANPAGES +include $(top_srcdir)/gnome-doc-utils.make +endif + +# Annoyingly in the XML, yelp refuses to load relative images fileref, i.e. ../../src/icons/file.png +# whereas the PDF generation inserts these references OK +# Nevertheless we need to copy the images into figures/ so they are available for the distribution installed help +# Most tool icons are _18, except the pan one which is _22 just to be annoying +get-icons: + -cp -f ../src/icons/*_[12][0-9].png C/figures/ +# '-' ^^^^^ means it doesn't care about the exit status +# this copy statement is not critical (especially when run under make distcheck) + +dist-hook: get-icons doc-dist-hook + +DOC_MODULE = viking +DOC_ENTITIES = legal.xml \ + attribution.xml \ + commandline.xml \ + georef_layer.xml \ + mapnik_rendering_layer.xml \ + recommends.xml +DOC_INCLUDES = +DOC_FIGURES = \ + figures/Aggregate_statistics.png \ + figures/addtr_18.png \ + figures/addwp_18.png \ + figures/demdl_18.png \ + figures/edtr_18.png \ + figures/edwp_18.png \ + figures/geomove_18.png \ + figures/geozoom_18.png \ + figures/LayersTracksList.png \ + figures/LayersTracksStatistics.png \ + figures/Maps_download_region_dialog.png \ + figures/map_tile_info_dialog.png \ + figures/mapdl_18.png \ + figures/mover_22.png \ + figures/properties_degree.png \ + figures/properties_units.png \ + figures/route_finder_18.png \ + figures/ruler_18.png \ + figures/select_18.png \ + figures/showpic_18.png \ + figures/Trackpoint_edit_dialog.png \ + figures/Track_elevation_graph.png \ + figures/Track_properties.png \ + figures/Track_statistics.png \ + figures/trw_statusbar.png \ + figures/vik_new_route_18.png \ + figures/WaypointsList.png \ + figures/zoom_18.png \ + figures/zoom_status_popup.png \ + figures/Viking-OSM-CycleMap-ManyTracks.jpg \ + figures/DEM_file_info_dialog.png \ + figures/customize_toolbar_dialog.png +DOC_LINGUAS = + +EXTRA_DIST = viking.xml.in + +CLEANFILES= + +# man pages processing +if GEN_MANPAGES +MANPAGES=viking.1 +man_MANS = $(MANPAGES) +CLEANFILES+=$(MANPAGES) +endif +DB2MAN=@DB2MAN_XSL@ +XP=@XP@ -''-nonet + +%.1: %.xml + $(XP) -o $@ $(DB2MAN) $< diff --git a/help/Makefile.in b/help/Makefile.in new file mode 100644 index 0000000..af11df7 --- /dev/null +++ b/help/Makefile.in @@ -0,0 +1,1257 @@ +# Makefile.in generated by automake 1.16.1 from Makefile.am. +# @configure_input@ + +# Copyright (C) 1994-2018 Free Software Foundation, Inc. + +# This Makefile.in is free software; the Free Software Foundation +# gives unlimited permission to copy and/or distribute it, +# with or without modifications, as long as this notice is preserved. + +# This program is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY, to the extent permitted by law; without +# even the implied warranty of MERCHANTABILITY or FITNESS FOR A +# PARTICULAR PURPOSE. + +@SET_MAKE@ + +# gnome-doc-utils.make - make magic for building documentation +# Copyright (C) 2004-2005 Shaun McCance +# +# 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., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. +# +# As a special exception to the GNU General Public License, if you +# distribute this file as part of a program that contains a +# configuration script generated by Autoconf, you may include it under +# the same distribution terms that you use for the rest of that program. + +################################################################################ +VPATH = @srcdir@ +am__is_gnu_make = { \ + if test -z '$(MAKELEVEL)'; then \ + false; \ + elif test -n '$(MAKE_HOST)'; then \ + true; \ + elif test -n '$(MAKE_VERSION)' && test -n '$(CURDIR)'; then \ + true; \ + else \ + false; \ + fi; \ +} +am__make_running_with_option = \ + case $${target_option-} in \ + ?) ;; \ + *) echo "am__make_running_with_option: internal error: invalid" \ + "target option '$${target_option-}' specified" >&2; \ + exit 1;; \ + esac; \ + has_opt=no; \ + sane_makeflags=$$MAKEFLAGS; \ + if $(am__is_gnu_make); then \ + sane_makeflags=$$MFLAGS; \ + else \ + case $$MAKEFLAGS in \ + *\\[\ \ ]*) \ + bs=\\; \ + sane_makeflags=`printf '%s\n' "$$MAKEFLAGS" \ + | sed "s/$$bs$$bs[$$bs $$bs ]*//g"`;; \ + esac; \ + fi; \ + skip_next=no; \ + strip_trailopt () \ + { \ + flg=`printf '%s\n' "$$flg" | sed "s/$$1.*$$//"`; \ + }; \ + for flg in $$sane_makeflags; do \ + test $$skip_next = yes && { skip_next=no; continue; }; \ + case $$flg in \ + *=*|--*) continue;; \ + -*I) strip_trailopt 'I'; skip_next=yes;; \ + -*I?*) strip_trailopt 'I';; \ + -*O) strip_trailopt 'O'; skip_next=yes;; \ + -*O?*) strip_trailopt 'O';; \ + -*l) strip_trailopt 'l'; skip_next=yes;; \ + -*l?*) strip_trailopt 'l';; \ + -[dEDm]) skip_next=yes;; \ + -[JT]) skip_next=yes;; \ + esac; \ + case $$flg in \ + *$$target_option*) has_opt=yes; break;; \ + esac; \ + done; \ + test $$has_opt = yes +am__make_dryrun = (target_option=n; $(am__make_running_with_option)) +am__make_keepgoing = (target_option=k; $(am__make_running_with_option)) +pkgdatadir = $(datadir)/@PACKAGE@ +pkgincludedir = $(includedir)/@PACKAGE@ +pkglibdir = $(libdir)/@PACKAGE@ +pkglibexecdir = $(libexecdir)/@PACKAGE@ +am__cd = CDPATH="$${ZSH_VERSION+.}$(PATH_SEPARATOR)" && cd +install_sh_DATA = $(install_sh) -c -m 644 +install_sh_PROGRAM = $(install_sh) -c +install_sh_SCRIPT = $(install_sh) -c +INSTALL_HEADER = $(INSTALL_DATA) +transform = $(program_transform_name) +NORMAL_INSTALL = : +PRE_INSTALL = : +POST_INSTALL = : +NORMAL_UNINSTALL = : +PRE_UNINSTALL = : +POST_UNINSTALL = : +build_triplet = @build@ +host_triplet = @host@ +target_triplet = @target@ +@GEN_MANPAGES_TRUE@am__append_1 = $(MANPAGES) +subdir = help +ACLOCAL_M4 = $(top_srcdir)/aclocal.m4 +am__aclocal_m4_deps = $(top_srcdir)/m4/expat.m4 \ + $(top_srcdir)/m4/gettext.m4 $(top_srcdir)/m4/iconv.m4 \ + $(top_srcdir)/m4/intlmacosx.m4 $(top_srcdir)/m4/lib-ld.m4 \ + $(top_srcdir)/m4/lib-link.m4 $(top_srcdir)/m4/lib-prefix.m4 \ + $(top_srcdir)/m4/libcurl.m4 $(top_srcdir)/m4/nls.m4 \ + $(top_srcdir)/m4/po.m4 $(top_srcdir)/m4/progtest.m4 \ + $(top_srcdir)/configure.ac +am__configure_deps = $(am__aclocal_m4_deps) $(CONFIGURE_DEPENDENCIES) \ + $(ACLOCAL_M4) +DIST_COMMON = $(srcdir)/Makefile.am $(am__DIST_COMMON) +mkinstalldirs = $(SHELL) $(top_srcdir)/mkinstalldirs +CONFIG_HEADER = $(top_builddir)/src/config.h +CONFIG_CLEAN_FILES = viking.xml +CONFIG_CLEAN_VPATH_FILES = +AM_V_P = $(am__v_P_@AM_V@) +am__v_P_ = $(am__v_P_@AM_DEFAULT_V@) +am__v_P_0 = false +am__v_P_1 = : +AM_V_GEN = $(am__v_GEN_@AM_V@) +am__v_GEN_ = $(am__v_GEN_@AM_DEFAULT_V@) +am__v_GEN_0 = @echo " GEN " $@; +am__v_GEN_1 = +AM_V_at = $(am__v_at_@AM_V@) +am__v_at_ = $(am__v_at_@AM_DEFAULT_V@) +am__v_at_0 = @ +am__v_at_1 = +SOURCES = +DIST_SOURCES = +am__can_run_installinfo = \ + case $$AM_UPDATE_INFO_DIR in \ + n|no|NO) false;; \ + *) (install-info --version) >/dev/null 2>&1;; \ + esac +am__vpath_adj_setup = srcdirstrip=`echo "$(srcdir)" | sed 's|.|.|g'`; +am__vpath_adj = case $$p in \ + $(srcdir)/*) f=`echo "$$p" | sed "s|^$$srcdirstrip/||"`;; \ + *) f=$$p;; \ + esac; +am__strip_dir = f=`echo $$p | sed -e 's|^.*/||'`; +am__install_max = 40 +am__nobase_strip_setup = \ + srcdirstrip=`echo "$(srcdir)" | sed 's/[].[^$$\\*|]/\\\\&/g'` +am__nobase_strip = \ + for p in $$list; do echo "$$p"; done | sed -e "s|$$srcdirstrip/||" +am__nobase_list = $(am__nobase_strip_setup); \ + for p in $$list; do echo "$$p $$p"; done | \ + sed "s| $$srcdirstrip/| |;"' / .*\//!s/ .*/ ./; s,\( .*\)/[^/]*$$,\1,' | \ + $(AWK) 'BEGIN { files["."] = "" } { files[$$2] = files[$$2] " " $$1; \ + if (++n[$$2] == $(am__install_max)) \ + { print $$2, files[$$2]; n[$$2] = 0; files[$$2] = "" } } \ + END { for (dir in files) print dir, files[dir] }' +am__base_list = \ + sed '$$!N;$$!N;$$!N;$$!N;$$!N;$$!N;$$!N;s/\n/ /g' | \ + sed '$$!N;$$!N;$$!N;$$!N;s/\n/ /g' +am__uninstall_files_from_dir = { \ + test -z "$$files" \ + || { test ! -d "$$dir" && test ! -f "$$dir" && test ! -r "$$dir"; } \ + || { echo " ( cd '$$dir' && rm -f" $$files ")"; \ + $(am__cd) "$$dir" && rm -f $$files; }; \ + } +man1dir = $(mandir)/man1 +am__installdirs = "$(DESTDIR)$(man1dir)" +NROFF = nroff +MANS = $(man_MANS) +am__tagged_files = $(HEADERS) $(SOURCES) $(TAGS_FILES) $(LISP) +am__DIST_COMMON = $(srcdir)/Makefile.in $(srcdir)/viking.xml.in \ + $(top_srcdir)/gnome-doc-utils.make $(top_srcdir)/mkinstalldirs +DISTFILES = $(DIST_COMMON) $(DIST_SOURCES) $(TEXINFOS) $(EXTRA_DIST) +ACLOCAL = @ACLOCAL@ +ACLOCAL_AMFLAGS = @ACLOCAL_AMFLAGS@ +ALL_LINGUAS = @ALL_LINGUAS@ +AMTAR = @AMTAR@ +AM_DEFAULT_VERBOSITY = @AM_DEFAULT_VERBOSITY@ +AUTOCONF = @AUTOCONF@ +AUTOHEADER = @AUTOHEADER@ +AUTOMAKE = @AUTOMAKE@ +AWK = @AWK@ +CATALOGS = @CATALOGS@ +CATOBJEXT = @CATOBJEXT@ +CC = @CC@ +CCDEPMODE = @CCDEPMODE@ +CFLAGS = @CFLAGS@ +CONFIG_STATUS_DEPENDENCIES = @CONFIG_STATUS_DEPENDENCIES@ +CPP = @CPP@ +CPPFLAGS = @CPPFLAGS@ +CXX = @CXX@ +CXXCPP = @CXXCPP@ +CXXDEPMODE = @CXXDEPMODE@ +CXXFLAGS = @CXXFLAGS@ +CYGPATH_W = @CYGPATH_W@ +DATADIRNAME = @DATADIRNAME@ +DB2MAN_XSL = @DB2MAN_XSL@ +DEFS = @DEFS@ +DEPDIR = @DEPDIR@ +DISTCHECK_CONFIGURE_FLAGS = @DISTCHECK_CONFIGURE_FLAGS@ +DOC_USER_FORMATS = @DOC_USER_FORMATS@ +ECHO_C = @ECHO_C@ +ECHO_N = @ECHO_N@ +ECHO_T = @ECHO_T@ +EGREP = @EGREP@ +EXEEXT = @EXEEXT@ +EXPAT_CFLAGS = @EXPAT_CFLAGS@ +EXPAT_LIBS = @EXPAT_LIBS@ +GDK_PIXBUF_CSOURCE = @GDK_PIXBUF_CSOURCE@ +GETTEXT_MACRO_VERSION = @GETTEXT_MACRO_VERSION@ +GETTEXT_PACKAGE = @GETTEXT_PACKAGE@ +GLIB_MKENUMS = @GLIB_MKENUMS@ +GMOFILES = @GMOFILES@ +GMSGFMT = @GMSGFMT@ +GMSGFMT_015 = @GMSGFMT_015@ +GREP = @GREP@ +GTKDOC_CHECK = @GTKDOC_CHECK@ +GTKDOC_CHECK_PATH = @GTKDOC_CHECK_PATH@ +GTKDOC_DEPS_CFLAGS = @GTKDOC_DEPS_CFLAGS@ +GTKDOC_DEPS_LIBS = @GTKDOC_DEPS_LIBS@ +GTKDOC_MKPDF = @GTKDOC_MKPDF@ +GTKDOC_REBASE = @GTKDOC_REBASE@ +HAVE_SCROLLKEEPER = @HAVE_SCROLLKEEPER@ +HELP_DIR = @HELP_DIR@ +HTML_DIR = @HTML_DIR@ +INSTALL = @INSTALL@ +INSTALL_DATA = @INSTALL_DATA@ +INSTALL_PROGRAM = @INSTALL_PROGRAM@ +INSTALL_SCRIPT = @INSTALL_SCRIPT@ +INSTALL_STRIP_PROGRAM = @INSTALL_STRIP_PROGRAM@ +INSTOBJEXT = @INSTOBJEXT@ +INTLLIBS = @INTLLIBS@ +INTLTOOL_EXTRACT = @INTLTOOL_EXTRACT@ +INTLTOOL_MERGE = @INTLTOOL_MERGE@ +INTLTOOL_PERL = @INTLTOOL_PERL@ +INTLTOOL_UPDATE = @INTLTOOL_UPDATE@ +INTLTOOL_V_MERGE = @INTLTOOL_V_MERGE@ +INTLTOOL_V_MERGE_OPTIONS = @INTLTOOL_V_MERGE_OPTIONS@ +INTLTOOL__v_MERGE_ = @INTLTOOL__v_MERGE_@ +INTLTOOL__v_MERGE_0 = @INTLTOOL__v_MERGE_0@ +INTL_MACOSX_LIBS = @INTL_MACOSX_LIBS@ +ISODATE = @ISODATE@ +LDFLAGS = @LDFLAGS@ +LIBCURL = @LIBCURL@ +LIBCURL_CPPFLAGS = @LIBCURL_CPPFLAGS@ +LIBGEOCLUE_CFLAGS = @LIBGEOCLUE_CFLAGS@ +LIBGEOCLUE_LIBS = @LIBGEOCLUE_LIBS@ +LIBICONV = @LIBICONV@ +LIBINTL = @LIBINTL@ +LIBOBJS = @LIBOBJS@ +LIBS = @LIBS@ +LIBZIP_CFLAGS = @LIBZIP_CFLAGS@ +LIBZIP_LIBS = @LIBZIP_LIBS@ +LN_S = @LN_S@ +LTLIBICONV = @LTLIBICONV@ +LTLIBINTL = @LTLIBINTL@ +LTLIBOBJS = @LTLIBOBJS@ +MAKEINFO = @MAKEINFO@ +MKDIR_P = @MKDIR_P@ +MKINSTALLDIRS = @MKINSTALLDIRS@ +MSGFMT = @MSGFMT@ +MSGFMT_015 = @MSGFMT_015@ +MSGFMT_OPTS = @MSGFMT_OPTS@ +MSGMERGE = @MSGMERGE@ +OBJEXT = @OBJEXT@ +OMF_DIR = @OMF_DIR@ +PACKAGE = @PACKAGE@ +PACKAGE_BUGREPORT = @PACKAGE_BUGREPORT@ +PACKAGE_CFLAGS = @PACKAGE_CFLAGS@ +PACKAGE_LIBS = @PACKAGE_LIBS@ +PACKAGE_NAME = @PACKAGE_NAME@ +PACKAGE_STRING = @PACKAGE_STRING@ +PACKAGE_TARNAME = @PACKAGE_TARNAME@ +PACKAGE_URL = @PACKAGE_URL@ +PACKAGE_VERSION = @PACKAGE_VERSION@ +PATH_SEPARATOR = @PATH_SEPARATOR@ +PKG_CONFIG = @PKG_CONFIG@ +PKG_CONFIG_LIBDIR = @PKG_CONFIG_LIBDIR@ +PKG_CONFIG_PATH = @PKG_CONFIG_PATH@ +POFILES = @POFILES@ +POSUB = @POSUB@ +PO_IN_DATADIR_FALSE = @PO_IN_DATADIR_FALSE@ +PO_IN_DATADIR_TRUE = @PO_IN_DATADIR_TRUE@ +RANLIB = @RANLIB@ +SET_MAKE = @SET_MAKE@ +SHELL = @SHELL@ +STRIP = @STRIP@ +USE_NLS = @USE_NLS@ +VERSION = @VERSION@ +XGETTEXT = @XGETTEXT@ +XGETTEXT_015 = @XGETTEXT_015@ +XGETTEXT_EXTRA_OPTIONS = @XGETTEXT_EXTRA_OPTIONS@ +XP = @XP@ -''-nonet +_libcurl_config = @_libcurl_config@ +abs_builddir = @abs_builddir@ +abs_srcdir = @abs_srcdir@ +abs_top_builddir = @abs_top_builddir@ +abs_top_srcdir = @abs_top_srcdir@ +ac_ct_CC = @ac_ct_CC@ +ac_ct_CXX = @ac_ct_CXX@ +am__include = @am__include@ +am__leading_dot = @am__leading_dot@ +am__quote = @am__quote@ +am__tar = @am__tar@ +am__untar = @am__untar@ +bindir = @bindir@ +build = @build@ +build_alias = @build_alias@ +build_cpu = @build_cpu@ +build_os = @build_os@ +build_vendor = @build_vendor@ +builddir = @builddir@ +datadir = @datadir@ +datarootdir = @datarootdir@ +docdir = @docdir@ +dvidir = @dvidir@ +exec_prefix = @exec_prefix@ +host = @host@ +host_alias = @host_alias@ +host_cpu = @host_cpu@ +host_os = @host_os@ +host_vendor = @host_vendor@ +htmldir = @htmldir@ +includedir = @includedir@ +infodir = @infodir@ +install_sh = @install_sh@ +intltool__v_merge_options_ = @intltool__v_merge_options_@ +intltool__v_merge_options_0 = @intltool__v_merge_options_0@ +libdir = @libdir@ +libexecdir = @libexecdir@ +localedir = @localedir@ +localstatedir = @localstatedir@ +mandir = @mandir@ +mkdir_p = @mkdir_p@ +oldincludedir = @oldincludedir@ +pdfdir = @pdfdir@ +prefix = @prefix@ +program_transform_name = @program_transform_name@ +psdir = @psdir@ +runstatedir = @runstatedir@ +sbindir = @sbindir@ +sharedstatedir = @sharedstatedir@ +srcdir = @srcdir@ +sysconfdir = @sysconfdir@ +target = @target@ +target_alias = @target_alias@ +target_cpu = @target_cpu@ +target_os = @target_os@ +target_vendor = @target_vendor@ +top_build_prefix = @top_build_prefix@ +top_builddir = @top_builddir@ +top_srcdir = @top_srcdir@ +@GEN_MANPAGES_TRUE@_clean_doc_header = $(if $(DOC_H_FILE),clean-doc-header) +@GEN_MANPAGES_TRUE@_DOC_REAL_FORMATS = $(if $(DOC_USER_FORMATS),$(DOC_USER_FORMATS),$(DOC_FORMATS)) +@GEN_MANPAGES_TRUE@_DOC_REAL_LINGUAS = $(if $(filter environment,$(origin LINGUAS)), \ +@GEN_MANPAGES_TRUE@ $(filter $(LINGUAS),$(DOC_LINGUAS)), \ +@GEN_MANPAGES_TRUE@ $(DOC_LINGUAS)) + +@GEN_MANPAGES_TRUE@_DOC_ABS_SRCDIR = @abs_srcdir@ +@GEN_MANPAGES_TRUE@_xml2po_mode = $(if $(DOC_ID),mallard,docbook) +@ENABLE_SK_TRUE@@GEN_MANPAGES_TRUE@_ENABLE_SK = true + +################################################################################ +@GEN_MANPAGES_TRUE@GDU_V_XML2PO = $(GDU__v_XML2PO_$(V)) +@GEN_MANPAGES_TRUE@GDU__v_XML2PO_ = $(GDU__v_XML2PO_$(AM_DEFAULT_VERBOSITY)) +@GEN_MANPAGES_TRUE@GDU__v_XML2PO_0 = @echo " XML2PO" $@; +@GEN_MANPAGES_TRUE@GDU_V_MSGFMT = $(GDU__v_MSGFMT_$(V)) +@GEN_MANPAGES_TRUE@GDU__v_MSGFMT_ = $(GDU__v_MSGFMT_$(AM_DEFAULT_VERBOSITY)) +@GEN_MANPAGES_TRUE@GDU__v_MSGFMT_0 = @echo " MSGFMT" $@; +@GEN_MANPAGES_TRUE@GDU_V_DB2OMF = $(GDU__v_DB2OMF_$(V)) +@GEN_MANPAGES_TRUE@GDU__v_DB2OMF_ = $(GDU__v_DB2OMF_$(AM_DEFAULT_VERBOSITY)) +@GEN_MANPAGES_TRUE@GDU__v_DB2OMF_0 = @echo " DB2OMF" $@; +@GEN_MANPAGES_TRUE@GDU_V_DB2HTM = $(GDU__v_DB2HTM_$(V)) +@GEN_MANPAGES_TRUE@GDU__v_DB2HTM_ = $(GDU__v_DB2HTM_$(AM_DEFAULT_VERBOSITY)) +@GEN_MANPAGES_TRUE@GDU__v_DB2HTM_0 = @echo " DB2HTM" $@; + +################################################################################ +@GEN_MANPAGES_TRUE@db2omf_args = \ +@GEN_MANPAGES_TRUE@ --stringparam db2omf.basename $(DOC_MODULE) \ +@GEN_MANPAGES_TRUE@ --stringparam db2omf.format $(3) \ +@GEN_MANPAGES_TRUE@ --stringparam db2omf.dtd \ +@GEN_MANPAGES_TRUE@ $(shell xmllint --format $(2) | grep -h PUBLIC | head -n 1 \ +@GEN_MANPAGES_TRUE@ | sed -e 's/.*PUBLIC \(\"[^\"]*\"\).*/\1/') \ +@GEN_MANPAGES_TRUE@ --stringparam db2omf.lang $(notdir $(patsubst %/$(notdir $(2)),%,$(2))) \ +@GEN_MANPAGES_TRUE@ --stringparam db2omf.omf_dir "$(OMF_DIR)" \ +@GEN_MANPAGES_TRUE@ --stringparam db2omf.help_dir "$(HELP_DIR)" \ +@GEN_MANPAGES_TRUE@ --stringparam db2omf.omf_in "$(_DOC_OMF_IN)" \ +@GEN_MANPAGES_TRUE@ $(if $(_ENABLE_SK), \ +@GEN_MANPAGES_TRUE@ --stringparam db2omf.scrollkeeper_cl "$(_skcontentslist)") \ +@GEN_MANPAGES_TRUE@ $(_db2omf) $(2) + +@GEN_MANPAGES_TRUE@_DOC_OMF_IN = $(if $(DOC_MODULE),$(wildcard $(_DOC_ABS_SRCDIR)/$(DOC_MODULE).omf.in)) +@GEN_MANPAGES_TRUE@_DOC_OMF_DB = $(if $(_DOC_OMF_IN), \ +@GEN_MANPAGES_TRUE@ $(foreach lc,C $(_DOC_REAL_LINGUAS),$(DOC_MODULE)-$(lc).omf)) + +@GEN_MANPAGES_TRUE@_DOC_OMF_HTML = $(if $(_DOC_OMF_IN), \ +@GEN_MANPAGES_TRUE@ $(foreach lc,C $(_DOC_REAL_LINGUAS),$(DOC_MODULE)-html-$(lc).omf)) + + +# FIXME +@GEN_MANPAGES_TRUE@_DOC_OMF_ALL = \ +@GEN_MANPAGES_TRUE@ $(if $(filter docbook,$(_DOC_REAL_FORMATS)),$(_DOC_OMF_DB)) \ +@GEN_MANPAGES_TRUE@ $(if $(filter html HTML,$(_DOC_REAL_FORMATS)),$(_DOC_OMF_HTML)) + + +################################################################################ +@GEN_MANPAGES_TRUE@_DOC_C_MODULE = $(if $(DOC_MODULE),C/$(DOC_MODULE).xml) +@GEN_MANPAGES_TRUE@_DOC_C_PAGES = $(foreach page,$(DOC_PAGES),C/$(page)) +@GEN_MANPAGES_TRUE@_DOC_C_ENTITIES = $(foreach ent,$(DOC_ENTITIES),C/$(ent)) +@GEN_MANPAGES_TRUE@_DOC_C_INCLUDES = $(foreach inc,$(DOC_INCLUDES),C/$(inc)) +@GEN_MANPAGES_TRUE@_DOC_C_DOCS = \ +@GEN_MANPAGES_TRUE@ $(_DOC_C_ENTITIES) $(_DOC_C_INCLUDES) \ +@GEN_MANPAGES_TRUE@ $(_DOC_C_PAGES) $(_DOC_C_MODULE) + +@GEN_MANPAGES_TRUE@_DOC_C_DOCS_NOENT = \ +@GEN_MANPAGES_TRUE@ $(_DOC_C_MODULE) $(_DOC_C_INCLUDES) \ +@GEN_MANPAGES_TRUE@ $(_DOC_C_PAGES) + +@GEN_MANPAGES_TRUE@_DOC_C_FIGURES = $(if $(DOC_FIGURES), \ +@GEN_MANPAGES_TRUE@ $(foreach fig,$(DOC_FIGURES),C/$(fig)), \ +@GEN_MANPAGES_TRUE@ $(patsubst $(srcdir)/%,%,$(wildcard $(srcdir)/C/figures/*.png))) + + +# FIXME: probably have to shell escape to determine the file names +@GEN_MANPAGES_TRUE@_DOC_C_HTML = $(foreach f, \ +@GEN_MANPAGES_TRUE@ $(shell xsltproc --xinclude \ +@GEN_MANPAGES_TRUE@ --stringparam db.chunk.basename "$(DOC_MODULE)" \ +@GEN_MANPAGES_TRUE@ $(_chunks) "C/$(DOC_MODULE).xml"), \ +@GEN_MANPAGES_TRUE@ C/$(f).xhtml) + + +############################################################################### +@GEN_MANPAGES_TRUE@_DOC_POFILES = $(if $(DOC_MODULE)$(DOC_ID), \ +@GEN_MANPAGES_TRUE@ $(foreach lc,$(_DOC_REAL_LINGUAS),$(lc)/$(lc).po)) + +@GEN_MANPAGES_TRUE@_DOC_MOFILES = $(patsubst %.po,%.mo,$(_DOC_POFILES)) +@GEN_MANPAGES_TRUE@_DOC_LC_MODULES = $(if $(DOC_MODULE), \ +@GEN_MANPAGES_TRUE@ $(foreach lc,$(_DOC_REAL_LINGUAS),$(lc)/$(DOC_MODULE).xml)) + +@GEN_MANPAGES_TRUE@_DOC_LC_PAGES = \ +@GEN_MANPAGES_TRUE@ $(foreach lc,$(_DOC_REAL_LINGUAS),$(foreach page,$(_DOC_C_PAGES), \ +@GEN_MANPAGES_TRUE@ $(lc)/$(notdir $(page)) )) + +@GEN_MANPAGES_TRUE@_DOC_LC_INCLUDES = \ +@GEN_MANPAGES_TRUE@ $(foreach lc,$(_DOC_REAL_LINGUAS),$(foreach inc,$(_DOC_C_INCLUDES), \ +@GEN_MANPAGES_TRUE@ $(lc)/$(notdir $(inc)) )) + + +# FIXME: probably have to shell escape to determine the file names +@GEN_MANPAGES_TRUE@_DOC_LC_HTML = \ +@GEN_MANPAGES_TRUE@ $(foreach lc,$(_DOC_REAL_LINGUAS),$(foreach doc,$(_DOC_C_HTML), \ +@GEN_MANPAGES_TRUE@ $(lc)/$(notdir $(doc)) )) + +@GEN_MANPAGES_TRUE@_DOC_LC_DOCS = \ +@GEN_MANPAGES_TRUE@ $(_DOC_LC_MODULES) $(_DOC_LC_INCLUDES) $(_DOC_LC_PAGES) \ +@GEN_MANPAGES_TRUE@ $(if $(filter html HTML,$(_DOC_REAL_FORMATS)),$(_DOC_LC_HTML)) + +@GEN_MANPAGES_TRUE@_DOC_LC_FIGURES = $(foreach lc,$(_DOC_REAL_LINGUAS), \ +@GEN_MANPAGES_TRUE@ $(patsubst C/%,$(lc)/%,$(_DOC_C_FIGURES)) ) + +@GEN_MANPAGES_TRUE@_DOC_SRC_FIGURES = \ +@GEN_MANPAGES_TRUE@ $(foreach fig,$(_DOC_C_FIGURES), $(foreach lc,C $(_DOC_REAL_LINGUAS), \ +@GEN_MANPAGES_TRUE@ $(wildcard $(srcdir)/$(lc)/$(patsubst C/%,%,$(fig))) )) + +@GEN_MANPAGES_TRUE@_DOC_POT = $(if $(DOC_MODULE),$(DOC_MODULE).pot,$(if $(DOC_ID),$(DOC_ID).pot)) + +################################################################################ +@GEN_MANPAGES_TRUE@_DOC_HTML_ALL = $(if $(filter html HTML,$(_DOC_REAL_FORMATS)), \ +@GEN_MANPAGES_TRUE@ $(_DOC_C_HTML) $(_DOC_LC_HTML)) + +@GEN_MANPAGES_TRUE@_DOC_HTML_TOPS = $(foreach lc,C $(_DOC_REAL_LINGUAS),$(lc)/$(DOC_MODULE).xhtml) +@GEN_MANPAGES_TRUE@_clean_omf = $(if $(_DOC_OMF_IN),clean-doc-omf) +@GEN_MANPAGES_TRUE@_clean_dsk = $(if $(_DOC_DSK_IN),clean-doc-dsk) +@GEN_MANPAGES_TRUE@_clean_lc = $(if $(_DOC_REAL_LINGUAS),clean-doc-lc) +@GEN_MANPAGES_TRUE@_clean_dir = $(if $(DOC_MODULE)$(DOC_ID),clean-doc-dir) +@GEN_MANPAGES_TRUE@_doc_install_dir = $(if $(DOC_ID),$(DOC_ID),$(DOC_MODULE)) +DOC_MODULE = viking +DOC_ENTITIES = legal.xml \ + attribution.xml \ + commandline.xml \ + georef_layer.xml \ + mapnik_rendering_layer.xml \ + recommends.xml + +DOC_INCLUDES = +DOC_FIGURES = \ + figures/Aggregate_statistics.png \ + figures/addtr_18.png \ + figures/addwp_18.png \ + figures/demdl_18.png \ + figures/edtr_18.png \ + figures/edwp_18.png \ + figures/geomove_18.png \ + figures/geozoom_18.png \ + figures/LayersTracksList.png \ + figures/LayersTracksStatistics.png \ + figures/Maps_download_region_dialog.png \ + figures/map_tile_info_dialog.png \ + figures/mapdl_18.png \ + figures/mover_22.png \ + figures/properties_degree.png \ + figures/properties_units.png \ + figures/route_finder_18.png \ + figures/ruler_18.png \ + figures/select_18.png \ + figures/showpic_18.png \ + figures/Trackpoint_edit_dialog.png \ + figures/Track_elevation_graph.png \ + figures/Track_properties.png \ + figures/Track_statistics.png \ + figures/trw_statusbar.png \ + figures/vik_new_route_18.png \ + figures/WaypointsList.png \ + figures/zoom_18.png \ + figures/zoom_status_popup.png \ + figures/Viking-OSM-CycleMap-ManyTracks.jpg \ + figures/DEM_file_info_dialog.png \ + figures/customize_toolbar_dialog.png + +DOC_LINGUAS = +EXTRA_DIST = viking.xml.in +CLEANFILES = $(am__append_1) + +# man pages processing +@GEN_MANPAGES_TRUE@MANPAGES = viking.1 +@GEN_MANPAGES_TRUE@man_MANS = $(MANPAGES) +DB2MAN = @DB2MAN_XSL@ +all: all-am + +.SUFFIXES: +$(srcdir)/Makefile.in: $(srcdir)/Makefile.am $(top_srcdir)/gnome-doc-utils.make $(am__configure_deps) + @for dep in $?; do \ + case '$(am__configure_deps)' in \ + *$$dep*) \ + ( cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh ) \ + && { if test -f $@; then exit 0; else break; fi; }; \ + exit 1;; \ + esac; \ + done; \ + echo ' cd $(top_srcdir) && $(AUTOMAKE) --gnu help/Makefile'; \ + $(am__cd) $(top_srcdir) && \ + $(AUTOMAKE) --gnu help/Makefile +Makefile: $(srcdir)/Makefile.in $(top_builddir)/config.status + @case '$?' in \ + *config.status*) \ + cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh;; \ + *) \ + echo ' cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__maybe_remake_depfiles)'; \ + cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__maybe_remake_depfiles);; \ + esac; +$(top_srcdir)/gnome-doc-utils.make $(am__empty): + +$(top_builddir)/config.status: $(top_srcdir)/configure $(CONFIG_STATUS_DEPENDENCIES) + cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh + +$(top_srcdir)/configure: $(am__configure_deps) + cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh +$(ACLOCAL_M4): $(am__aclocal_m4_deps) + cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh +$(am__aclocal_m4_deps): +viking.xml: $(top_builddir)/config.status $(srcdir)/viking.xml.in + cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ +install-man1: $(man_MANS) + @$(NORMAL_INSTALL) + @list1=''; \ + list2='$(man_MANS)'; \ + test -n "$(man1dir)" \ + && test -n "`echo $$list1$$list2`" \ + || exit 0; \ + echo " $(MKDIR_P) '$(DESTDIR)$(man1dir)'"; \ + $(MKDIR_P) "$(DESTDIR)$(man1dir)" || exit 1; \ + { for i in $$list1; do echo "$$i"; done; \ + if test -n "$$list2"; then \ + for i in $$list2; do echo "$$i"; done \ + | sed -n '/\.1[a-z]*$$/p'; \ + fi; \ + } | while read p; do \ + if test -f $$p; then d=; else d="$(srcdir)/"; fi; \ + echo "$$d$$p"; echo "$$p"; \ + done | \ + sed -e 'n;s,.*/,,;p;h;s,.*\.,,;s,^[^1][0-9a-z]*$$,1,;x' \ + -e 's,\.[0-9a-z]*$$,,;$(transform);G;s,\n,.,' | \ + sed 'N;N;s,\n, ,g' | { \ + list=; while read file base inst; do \ + if test "$$base" = "$$inst"; then list="$$list $$file"; else \ + echo " $(INSTALL_DATA) '$$file' '$(DESTDIR)$(man1dir)/$$inst'"; \ + $(INSTALL_DATA) "$$file" "$(DESTDIR)$(man1dir)/$$inst" || exit $$?; \ + fi; \ + done; \ + for i in $$list; do echo "$$i"; done | $(am__base_list) | \ + while read files; do \ + test -z "$$files" || { \ + echo " $(INSTALL_DATA) $$files '$(DESTDIR)$(man1dir)'"; \ + $(INSTALL_DATA) $$files "$(DESTDIR)$(man1dir)" || exit $$?; }; \ + done; } + +uninstall-man1: + @$(NORMAL_UNINSTALL) + @list=''; test -n "$(man1dir)" || exit 0; \ + files=`{ for i in $$list; do echo "$$i"; done; \ + l2='$(man_MANS)'; for i in $$l2; do echo "$$i"; done | \ + sed -n '/\.1[a-z]*$$/p'; \ + } | sed -e 's,.*/,,;h;s,.*\.,,;s,^[^1][0-9a-z]*$$,1,;x' \ + -e 's,\.[0-9a-z]*$$,,;$(transform);G;s,\n,.,'`; \ + dir='$(DESTDIR)$(man1dir)'; $(am__uninstall_files_from_dir) +tags TAGS: + +ctags CTAGS: + +cscope cscopelist: + + +distdir: $(BUILT_SOURCES) + $(MAKE) $(AM_MAKEFLAGS) distdir-am + +distdir-am: $(DISTFILES) + @srcdirstrip=`echo "$(srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \ + topsrcdirstrip=`echo "$(top_srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \ + list='$(DISTFILES)'; \ + dist_files=`for file in $$list; do echo $$file; done | \ + sed -e "s|^$$srcdirstrip/||;t" \ + -e "s|^$$topsrcdirstrip/|$(top_builddir)/|;t"`; \ + case $$dist_files in \ + */*) $(MKDIR_P) `echo "$$dist_files" | \ + sed '/\//!d;s|^|$(distdir)/|;s,/[^/]*$$,,' | \ + sort -u` ;; \ + esac; \ + for file in $$dist_files; do \ + if test -f $$file || test -d $$file; then d=.; else d=$(srcdir); fi; \ + if test -d $$d/$$file; then \ + dir=`echo "/$$file" | sed -e 's,/[^/]*$$,,'`; \ + if test -d "$(distdir)/$$file"; then \ + find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \ + fi; \ + if test -d $(srcdir)/$$file && test $$d != $(srcdir); then \ + cp -fpR $(srcdir)/$$file "$(distdir)$$dir" || exit 1; \ + find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \ + fi; \ + cp -fpR $$d/$$file "$(distdir)$$dir" || exit 1; \ + else \ + test -f "$(distdir)/$$file" \ + || cp -p $$d/$$file "$(distdir)/$$file" \ + || exit 1; \ + fi; \ + done + $(MAKE) $(AM_MAKEFLAGS) \ + top_distdir="$(top_distdir)" distdir="$(distdir)" \ + dist-hook +check-am: all-am +check: check-am +all-am: Makefile $(MANS) +installdirs: + for dir in "$(DESTDIR)$(man1dir)"; do \ + test -z "$$dir" || $(MKDIR_P) "$$dir"; \ + done +install: install-am +install-exec: install-exec-am +install-data: install-data-am +uninstall: uninstall-am + +install-am: all-am + @$(MAKE) $(AM_MAKEFLAGS) install-exec-am install-data-am + +installcheck: installcheck-am +install-strip: + if test -z '$(STRIP)'; then \ + $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \ + install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \ + install; \ + else \ + $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \ + install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \ + "INSTALL_PROGRAM_ENV=STRIPPROG='$(STRIP)'" install; \ + fi +mostlyclean-generic: + +clean-generic: + -test -z "$(CLEANFILES)" || rm -f $(CLEANFILES) + +distclean-generic: + -test -z "$(CONFIG_CLEAN_FILES)" || rm -f $(CONFIG_CLEAN_FILES) + -test . = "$(srcdir)" || test -z "$(CONFIG_CLEAN_VPATH_FILES)" || rm -f $(CONFIG_CLEAN_VPATH_FILES) + +maintainer-clean-generic: + @echo "This command is intended for maintainers to use" + @echo "it deletes files that may require special tools to rebuild." +@GEN_MANPAGES_FALSE@maintainer-clean-local: +@GEN_MANPAGES_FALSE@uninstall-local: +@GEN_MANPAGES_FALSE@install-data-local: +@GEN_MANPAGES_FALSE@mostlyclean-local: +@GEN_MANPAGES_FALSE@clean-local: +@GEN_MANPAGES_FALSE@distclean-local: +clean: clean-am + +clean-am: clean-generic clean-local mostlyclean-am + +distclean: distclean-am + -rm -f Makefile +distclean-am: clean-am distclean-generic distclean-local + +dvi: dvi-am + +dvi-am: + +html: html-am + +html-am: + +info: info-am + +info-am: + +install-data-am: install-data-local install-man + +install-dvi: install-dvi-am + +install-dvi-am: + +install-exec-am: + +install-html: install-html-am + +install-html-am: + +install-info: install-info-am + +install-info-am: + +install-man: install-man1 + +install-pdf: install-pdf-am + +install-pdf-am: + +install-ps: install-ps-am + +install-ps-am: + +installcheck-am: + +maintainer-clean: maintainer-clean-am + -rm -f Makefile +maintainer-clean-am: distclean-am maintainer-clean-generic \ + maintainer-clean-local + +mostlyclean: mostlyclean-am + +mostlyclean-am: mostlyclean-generic mostlyclean-local + +pdf: pdf-am + +pdf-am: + +ps: ps-am + +ps-am: + +uninstall-am: uninstall-local uninstall-man + +uninstall-man: uninstall-man1 + +.MAKE: install-am install-strip + +.PHONY: all all-am check check-am clean clean-generic clean-local \ + cscopelist-am ctags-am dist-hook distclean distclean-generic \ + distclean-local distdir dvi dvi-am html html-am info info-am \ + install install-am install-data install-data-am \ + install-data-local install-dvi install-dvi-am install-exec \ + install-exec-am install-html install-html-am install-info \ + install-info-am install-man install-man1 install-pdf \ + install-pdf-am install-ps install-ps-am install-strip \ + installcheck installcheck-am installdirs maintainer-clean \ + maintainer-clean-generic maintainer-clean-local mostlyclean \ + mostlyclean-generic mostlyclean-local pdf pdf-am ps ps-am \ + tags-am uninstall uninstall-am uninstall-local uninstall-man \ + uninstall-man1 + +.PRECIOUS: Makefile + + +@GEN_MANPAGES_TRUE@DOC_H_FILE ?= + +@GEN_MANPAGES_TRUE@DOC_H_DOCS ?= + +@GEN_MANPAGES_TRUE@$(DOC_H_FILE): $(DOC_H_DOCS); +@GEN_MANPAGES_TRUE@ @rm -f $@.tmp; touch $@.tmp; +@GEN_MANPAGES_TRUE@ echo 'const gchar* documentation_credits[] = {' >> $@.tmp +@GEN_MANPAGES_TRUE@ list='$(DOC_H_DOCS)'; for doc in $$list; do \ +@GEN_MANPAGES_TRUE@ xmlpath="`echo $$doc | sed -e 's/^\(.*\/\).*/\1/' -e '/\//!s/.*//'`:$(srcdir)/`echo $$doc | sed -e 's/^\(.*\/\).*/\1/' -e '/\//!s/.*//'`"; \ +@GEN_MANPAGES_TRUE@ if ! test -f "$$doc"; then doc="$(srcdir)/$$doc"; fi; \ +@GEN_MANPAGES_TRUE@ xsltproc --path "$$xmlpath" $(_credits) $$doc; \ +@GEN_MANPAGES_TRUE@ done | sort | uniq \ +@GEN_MANPAGES_TRUE@ | awk 'BEGIN{s=""}{n=split($$0,w,"<");if(s!=""&&s!=substr(w[1],1,length(w[1])-1)){print s};if(n>1){print $$0;s=""}else{s=$$0}};END{if(s!=""){print s}}' \ +@GEN_MANPAGES_TRUE@ | sed -e 's/\\/\\\\/' -e 's/"/\\"/' -e 's/\(.*\)/\t"\1",/' >> $@.tmp +@GEN_MANPAGES_TRUE@ echo ' NULL' >> $@.tmp +@GEN_MANPAGES_TRUE@ echo '};' >> $@.tmp +@GEN_MANPAGES_TRUE@ echo >> $@.tmp +@GEN_MANPAGES_TRUE@ list='$(DOC_H_DOCS)'; for doc in $$list; do \ +@GEN_MANPAGES_TRUE@ xmlpath="`echo $$doc | sed -e 's/^\(.*\/\).*/\1/' -e '/\//!s/.*//'`:$(srcdir)/`echo $$doc | sed -e 's/^\(.*\/\).*/\1/' -e '/\//!s/.*//'`"; \ +@GEN_MANPAGES_TRUE@ if ! test -f "$$doc"; then doc="$(srcdir)/$$doc"; fi; \ +@GEN_MANPAGES_TRUE@ docid=`echo "$$doc" | sed -e 's/.*\/\([^/]*\)\.xml/\1/' \ +@GEN_MANPAGES_TRUE@ | sed -e 's/[^a-zA-Z_]/_/g' | tr 'a-z' 'A-Z'`; \ +@GEN_MANPAGES_TRUE@ echo $$xmlpath; \ +@GEN_MANPAGES_TRUE@ ids=`xsltproc --xinclude --path "$$xmlpath" $(_ids) $$doc`; \ +@GEN_MANPAGES_TRUE@ for id in $$ids; do \ +@GEN_MANPAGES_TRUE@ echo '#define HELP_'`echo $$docid`'_'`echo $$id \ +@GEN_MANPAGES_TRUE@ | sed -e 's/[^a-zA-Z_]/_/g' | tr 'a-z' 'A-Z'`' "'$$id'"' >> $@.tmp; \ +@GEN_MANPAGES_TRUE@ done; \ +@GEN_MANPAGES_TRUE@ echo >> $@.tmp; \ +@GEN_MANPAGES_TRUE@ done; +@GEN_MANPAGES_TRUE@ cp $@.tmp $@ && rm -f $@.tmp + +@GEN_MANPAGES_TRUE@dist-check-gdu: +@GEN_MANPAGES_TRUE@@HAVE_GNOME_DOC_UTILS_FALSE@ @echo "*** GNOME Doc Utils must be installed in order to make dist" +@GEN_MANPAGES_TRUE@@HAVE_GNOME_DOC_UTILS_FALSE@ @false + +@GEN_MANPAGES_TRUE@.PHONY: dist-doc-header +@GEN_MANPAGES_TRUE@dist-doc-header: $(DOC_H_FILE) +@GEN_MANPAGES_TRUE@ @if test -f "$(DOC_H_FILE)"; then d=; else d="$(srcdir)/"; fi; \ +@GEN_MANPAGES_TRUE@ echo "$(INSTALL_DATA) $${d}$(DOC_H_FILE) $(distdir)/$(DOC_H_FILE)"; \ +@GEN_MANPAGES_TRUE@ $(INSTALL_DATA) "$${d}$(DOC_H_FILE)" "$(distdir)/$(DOC_H_FILE)"; + +@GEN_MANPAGES_TRUE@doc-dist-hook: dist-check-gdu $(if $(DOC_H_FILE),dist-doc-header) + +@GEN_MANPAGES_TRUE@.PHONY: clean-doc-header +@GEN_MANPAGES_TRUE@clean-local: $(_clean_doc_header) +@GEN_MANPAGES_TRUE@distclean-local: $(_clean_doc_header) +@GEN_MANPAGES_TRUE@mostlyclean-local: $(_clean_doc_header) +@GEN_MANPAGES_TRUE@maintainer-clean-local: $(_clean_doc_header) +@GEN_MANPAGES_TRUE@clean-doc-header: +@GEN_MANPAGES_TRUE@ rm -f $(DOC_H_FILE) + +@GEN_MANPAGES_TRUE@all: $(DOC_H_FILE) + +################################################################################ + +@GEN_MANPAGES_TRUE@DOC_MODULE ?= + +@GEN_MANPAGES_TRUE@DOC_ID ?= + +@GEN_MANPAGES_TRUE@DOC_PAGES ?= + +@GEN_MANPAGES_TRUE@DOC_ENTITIES ?= + +@GEN_MANPAGES_TRUE@DOC_INCLUDES ?= + +@GEN_MANPAGES_TRUE@DOC_FIGURES ?= + +@GEN_MANPAGES_TRUE@DOC_FORMATS ?= docbook + +@GEN_MANPAGES_TRUE@DOC_LINGUAS ?= + +################################################################################ + +@GEN_MANPAGES_TRUE@_xml2po ?= `which xml2po` + +@GEN_MANPAGES_TRUE@_db2html ?= `$(PKG_CONFIG) --variable db2html gnome-doc-utils` +@GEN_MANPAGES_TRUE@_db2omf ?= `$(PKG_CONFIG) --variable db2omf gnome-doc-utils` +@GEN_MANPAGES_TRUE@_chunks ?= `$(PKG_CONFIG) --variable xmldir gnome-doc-utils`/gnome/xslt/docbook/utils/chunks.xsl +@GEN_MANPAGES_TRUE@_credits ?= `$(PKG_CONFIG) --variable xmldir gnome-doc-utils`/gnome/xslt/docbook/utils/credits.xsl +@GEN_MANPAGES_TRUE@_ids ?= $(shell $(PKG_CONFIG) --variable xmldir gnome-doc-utils)/gnome/xslt/docbook/utils/ids.xsl +@ENABLE_SK_TRUE@@GEN_MANPAGES_TRUE@_skpkgdatadir ?= `scrollkeeper-config --pkgdatadir` +@ENABLE_SK_TRUE@@GEN_MANPAGES_TRUE@_sklocalstatedir ?= `scrollkeeper-config --pkglocalstatedir` +@ENABLE_SK_TRUE@@GEN_MANPAGES_TRUE@_skcontentslist ?= $(_skpkgdatadir)/Templates/C/scrollkeeper_cl.xml + +@GEN_MANPAGES_TRUE@$(_DOC_OMF_DB) : $(_DOC_OMF_IN) +@GEN_MANPAGES_TRUE@$(_DOC_OMF_DB) : $(DOC_MODULE)-%.omf : %/$(DOC_MODULE).xml +@GEN_MANPAGES_TRUE@ @test "x$(_ENABLE_SK)" != "xtrue" -o -f "$(_skcontentslist)" || { \ +@GEN_MANPAGES_TRUE@ echo "The file '$(_skcontentslist)' does not exist." >&2; \ +@GEN_MANPAGES_TRUE@ echo "Please check your ScrollKeeper installation." >&2; \ +@GEN_MANPAGES_TRUE@ exit 1; } +@GEN_MANPAGES_TRUE@ $(GDU_V_DB2OMF)xsltproc -o $@ $(call db2omf_args,$@,$<,'docbook') || { rm -f "$@"; exit 1; } + +@GEN_MANPAGES_TRUE@$(_DOC_OMF_HTML) : $(_DOC_OMF_IN) +@GEN_MANPAGES_TRUE@$(_DOC_OMF_HTML) : $(DOC_MODULE)-html-%.omf : %/$(DOC_MODULE).xml +@ENABLE_SK_TRUE@@GEN_MANPAGES_TRUE@ @test "x$(_ENABLE_SK)" != "xtrue" -o -f "$(_skcontentslist)" || { \ +@ENABLE_SK_TRUE@@GEN_MANPAGES_TRUE@ echo "The file '$(_skcontentslist)' does not exist" >&2; \ +@ENABLE_SK_TRUE@@GEN_MANPAGES_TRUE@ echo "Please check your ScrollKeeper installation." >&2; \ +@ENABLE_SK_TRUE@@GEN_MANPAGES_TRUE@ exit 1; } +@GEN_MANPAGES_TRUE@ $(GDU_V_DB2OMF)xsltproc -o $@ $(call db2omf_args,$@,$<,'xhtml') || { rm -f "$@"; exit 1; } + +@GEN_MANPAGES_TRUE@.PHONY: omf +@GEN_MANPAGES_TRUE@omf: $(_DOC_OMF_ALL) + +@GEN_MANPAGES_TRUE@.PHONY: po +@GEN_MANPAGES_TRUE@po: $(_DOC_POFILES) + +@GEN_MANPAGES_TRUE@.PHONY: mo +@GEN_MANPAGES_TRUE@mo: $(_DOC_MOFILES) + +@GEN_MANPAGES_TRUE@$(_DOC_POFILES): +@GEN_MANPAGES_TRUE@ @if ! test -d $(dir $@); then \ +@GEN_MANPAGES_TRUE@ echo "mkdir $(dir $@)"; \ +@GEN_MANPAGES_TRUE@ mkdir "$(dir $@)"; \ +@GEN_MANPAGES_TRUE@ fi +@GEN_MANPAGES_TRUE@ @if test ! -f $@ -a -f $(srcdir)/$@; then \ +@GEN_MANPAGES_TRUE@ echo "cp $(srcdir)/$@ $@"; \ +@GEN_MANPAGES_TRUE@ cp "$(srcdir)/$@" "$@"; \ +@GEN_MANPAGES_TRUE@ fi; +@GEN_MANPAGES_TRUE@ @docs=; \ +@GEN_MANPAGES_TRUE@ list='$(_DOC_C_DOCS_NOENT)'; for doc in $$list; do \ +@GEN_MANPAGES_TRUE@ docs="$$docs $(_DOC_ABS_SRCDIR)/$$doc"; \ +@GEN_MANPAGES_TRUE@ done; \ +@GEN_MANPAGES_TRUE@ if ! test -f $@; then \ +@GEN_MANPAGES_TRUE@ echo "(cd $(dir $@) && \ +@GEN_MANPAGES_TRUE@ $(_xml2po) -m $(_xml2po_mode) -e $$docs > $(notdir $@).tmp && \ +@GEN_MANPAGES_TRUE@ cp $(notdir $@).tmp $(notdir $@) && rm -f $(notdir $@).tmp)"; \ +@GEN_MANPAGES_TRUE@ (cd $(dir $@) && \ +@GEN_MANPAGES_TRUE@ $(_xml2po) -m $(_xml2po_mode) -e $$docs > $(notdir $@).tmp && \ +@GEN_MANPAGES_TRUE@ cp $(notdir $@).tmp $(notdir $@) && rm -f $(notdir $@).tmp); \ +@GEN_MANPAGES_TRUE@ else \ +@GEN_MANPAGES_TRUE@ echo "(cd $(dir $@) && \ +@GEN_MANPAGES_TRUE@ $(_xml2po) -m $(_xml2po_mode) -e -u $(notdir $@) $$docs)"; \ +@GEN_MANPAGES_TRUE@ (cd $(dir $@) && \ +@GEN_MANPAGES_TRUE@ $(_xml2po) -m $(_xml2po_mode) -e -u $(notdir $@) $$docs); \ +@GEN_MANPAGES_TRUE@ fi + +@GEN_MANPAGES_TRUE@$(_DOC_MOFILES): %.mo: %.po +@GEN_MANPAGES_TRUE@ $(AM_V_at)if ! test -d $(dir $@); then mkdir "$(dir $@)"; fi +@GEN_MANPAGES_TRUE@ $(GDU_V_MSGFMT)msgfmt -o $@ $< + +# FIXME: fix the dependancy +# FIXME: hook xml2po up +@GEN_MANPAGES_TRUE@$(_DOC_LC_DOCS) : $(_DOC_MOFILES) +@GEN_MANPAGES_TRUE@$(_DOC_LC_DOCS) : $(_DOC_C_DOCS) +@GEN_MANPAGES_TRUE@ $(AM_V_at)if ! test -d $(dir $@); then mkdir $(dir $@); fi +@GEN_MANPAGES_TRUE@ $(GDU_V_XML2PO)if [ -f "C/$(notdir $@)" ]; then d="../"; else d="$(_DOC_ABS_SRCDIR)/"; fi; \ +@GEN_MANPAGES_TRUE@ mo="$(dir $@)$(patsubst %/$(notdir $@),%,$@).mo"; \ +@GEN_MANPAGES_TRUE@ if [ -f "$${mo}" ]; then mo="../$${mo}"; else mo="$(_DOC_ABS_SRCDIR)/$${mo}"; fi; \ +@GEN_MANPAGES_TRUE@ (cd $(dir $@) && \ +@GEN_MANPAGES_TRUE@ $(_xml2po) -m $(_xml2po_mode) -e -t "$${mo}" \ +@GEN_MANPAGES_TRUE@ "$${d}C/$(notdir $@)" > $(notdir $@).tmp && \ +@GEN_MANPAGES_TRUE@ cp $(notdir $@).tmp $(notdir $@) && rm -f $(notdir $@).tmp) +@GEN_MANPAGES_TRUE@.PHONY: pot +@GEN_MANPAGES_TRUE@pot: $(_DOC_POT) +@GEN_MANPAGES_TRUE@$(_DOC_POT): $(_DOC_C_DOCS_NOENT) +@GEN_MANPAGES_TRUE@ $(GDU_V_XML2PO)$(_xml2po) -m $(_xml2po_mode) -e -o $@ $^ + +@GEN_MANPAGES_TRUE@$(_DOC_HTML_TOPS): $(_DOC_C_DOCS) $(_DOC_LC_DOCS) +@GEN_MANPAGES_TRUE@ $(GDU_V_DB2HTM)xsltproc -o $@ --xinclude --param db.chunk.chunk_top "false()" --stringparam db.chunk.basename "$(DOC_MODULE)" --stringparam db.chunk.extension ".xhtml" $(_db2html) $(patsubst %.xhtml,%.xml,$@) + +################################################################################ + +@GEN_MANPAGES_TRUE@all: \ +@GEN_MANPAGES_TRUE@ $(_DOC_C_DOCS) $(_DOC_LC_DOCS) \ +@GEN_MANPAGES_TRUE@ $(_DOC_OMF_ALL) $(_DOC_DSK_ALL) \ +@GEN_MANPAGES_TRUE@ $(_DOC_HTML_ALL) $(_DOC_POFILES) + +################################################################################ + +@GEN_MANPAGES_TRUE@.PHONY: clean-doc-omf clean-doc-dsk clean-doc-lc clean-doc-dir + +@GEN_MANPAGES_TRUE@clean-doc-omf: ; rm -f $(_DOC_OMF_DB) $(_DOC_OMF_HTML) +@GEN_MANPAGES_TRUE@clean-doc-dsk: ; rm -f $(_DOC_DSK_DB) $(_DOC_DSK_HTML) +@GEN_MANPAGES_TRUE@clean-doc-lc: +@GEN_MANPAGES_TRUE@ rm -f $(_DOC_LC_DOCS) +@GEN_MANPAGES_TRUE@ rm -f $(_DOC_MOFILES) +@GEN_MANPAGES_TRUE@ @list='$(_DOC_POFILES)'; for po in $$list; do \ +@GEN_MANPAGES_TRUE@ if ! test "$$po" -ef "$(srcdir)/$$po"; then \ +@GEN_MANPAGES_TRUE@ echo "rm -f $$po"; \ +@GEN_MANPAGES_TRUE@ rm -f "$$po"; \ +@GEN_MANPAGES_TRUE@ fi; \ +@GEN_MANPAGES_TRUE@ done +# .xml2.po.mo cleaning is obsolete as of 0.18.1 and could be removed in 0.20.x +@GEN_MANPAGES_TRUE@ @for lc in C $(_DOC_REAL_LINGUAS); do \ +@GEN_MANPAGES_TRUE@ if test -f "$$lc/.xml2po.mo"; then \ +@GEN_MANPAGES_TRUE@ echo "rm -f $$lc/.xml2po.mo"; \ +@GEN_MANPAGES_TRUE@ rm -f "$$lc/.xml2po.mo"; \ +@GEN_MANPAGES_TRUE@ fi; \ +@GEN_MANPAGES_TRUE@ done +@GEN_MANPAGES_TRUE@clean-doc-dir: clean-doc-lc +@GEN_MANPAGES_TRUE@ @for lc in C $(_DOC_REAL_LINGUAS); do \ +@GEN_MANPAGES_TRUE@ for dir in `find $$lc -depth -type d`; do \ +@GEN_MANPAGES_TRUE@ if ! test $$dir -ef $(srcdir)/$$dir; then \ +@GEN_MANPAGES_TRUE@ echo "rmdir $$dir"; \ +@GEN_MANPAGES_TRUE@ rmdir "$$dir"; \ +@GEN_MANPAGES_TRUE@ fi; \ +@GEN_MANPAGES_TRUE@ done; \ +@GEN_MANPAGES_TRUE@ done + +@GEN_MANPAGES_TRUE@clean-local: \ +@GEN_MANPAGES_TRUE@ $(_clean_omf) $(_clean_dsk) \ +@GEN_MANPAGES_TRUE@ $(_clean_lc) $(_clean_dir) +@GEN_MANPAGES_TRUE@distclean-local: \ +@GEN_MANPAGES_TRUE@ $(_clean_omf) $(_clean_dsk) \ +@GEN_MANPAGES_TRUE@ $(_clean_lc) $(_clean_dir) +@GEN_MANPAGES_TRUE@mostlyclean-local: \ +@GEN_MANPAGES_TRUE@ $(_clean_omf) $(_clean_dsk) \ +@GEN_MANPAGES_TRUE@ $(_clean_lc) $(_clean_dir) +@GEN_MANPAGES_TRUE@maintainer-clean-local: \ +@GEN_MANPAGES_TRUE@ $(_clean_omf) $(_clean_dsk) \ +@GEN_MANPAGES_TRUE@ $(_clean_lc) $(_clean_dir) + +################################################################################ + +@GEN_MANPAGES_TRUE@.PHONY: dist-doc-docs dist-doc-pages dist-doc-figs dist-doc-omf dist-doc-dsk +@GEN_MANPAGES_TRUE@doc-dist-hook: \ +@GEN_MANPAGES_TRUE@ $(if $(DOC_MODULE)$(DOC_ID),dist-doc-docs) \ +@GEN_MANPAGES_TRUE@ $(if $(_DOC_C_FIGURES),dist-doc-figs) \ +@GEN_MANPAGES_TRUE@ $(if $(_DOC_OMF_IN),dist-doc-omf) +# $(if $(_DOC_DSK_IN),dist-doc-dsk) + +@GEN_MANPAGES_TRUE@dist-doc-docs: $(_DOC_C_DOCS) $(_DOC_LC_DOCS) $(_DOC_POFILES) +@GEN_MANPAGES_TRUE@ @for lc in C $(_DOC_REAL_LINGUAS); do \ +@GEN_MANPAGES_TRUE@ echo " $(mkinstalldirs) $(distdir)/$$lc"; \ +@GEN_MANPAGES_TRUE@ $(mkinstalldirs) "$(distdir)/$$lc"; \ +@GEN_MANPAGES_TRUE@ done +@GEN_MANPAGES_TRUE@ @list='$(_DOC_C_DOCS)'; \ +@GEN_MANPAGES_TRUE@ for doc in $$list; do \ +@GEN_MANPAGES_TRUE@ if test -f "$$doc"; then d=; else d="$(srcdir)/"; fi; \ +@GEN_MANPAGES_TRUE@ docdir=`echo $$doc | sed -e 's/^\(.*\/\).*/\1/' -e '/\//!s/.*//'`; \ +@GEN_MANPAGES_TRUE@ if ! test -d "$(distdir)/$$docdir"; then \ +@GEN_MANPAGES_TRUE@ echo "$(mkinstalldirs) $(distdir)/$$docdir"; \ +@GEN_MANPAGES_TRUE@ $(mkinstalldirs) "$(distdir)/$$docdir"; \ +@GEN_MANPAGES_TRUE@ fi; \ +@GEN_MANPAGES_TRUE@ echo "$(INSTALL_DATA) $$d$$doc $(distdir)/$$doc"; \ +@GEN_MANPAGES_TRUE@ $(INSTALL_DATA) "$$d$$doc" "$(distdir)/$$doc"; \ +@GEN_MANPAGES_TRUE@ done +@GEN_MANPAGES_TRUE@ @list='$(_DOC_LC_DOCS)'; \ +@GEN_MANPAGES_TRUE@ for doc in $$list; do \ +@GEN_MANPAGES_TRUE@ if test -f "$$doc"; then d=; else d="$(srcdir)/"; fi; \ +@GEN_MANPAGES_TRUE@ docdir=`echo $$doc | sed -e 's/^\(.*\/\).*/\1/' -e '/\//!s/.*//'`; \ +@GEN_MANPAGES_TRUE@ if ! test -d "$(distdir)/$$docdir"; then \ +@GEN_MANPAGES_TRUE@ echo "$(mkinstalldirs) $(distdir)/$$docdir"; \ +@GEN_MANPAGES_TRUE@ $(mkinstalldirs) "$(distdir)/$$docdir"; \ +@GEN_MANPAGES_TRUE@ fi; \ +@GEN_MANPAGES_TRUE@ echo "$(INSTALL_DATA) $$d$$doc $(distdir)/$$doc"; \ +@GEN_MANPAGES_TRUE@ $(INSTALL_DATA) "$$d$$doc" "$(distdir)/$$doc"; \ +@GEN_MANPAGES_TRUE@ done +@GEN_MANPAGES_TRUE@ @list='$(_DOC_POFILES)'; \ +@GEN_MANPAGES_TRUE@ for doc in $$list; do \ +@GEN_MANPAGES_TRUE@ if test -f "$$doc"; then d=; else d="$(srcdir)/"; fi; \ +@GEN_MANPAGES_TRUE@ docdir=`echo $$doc | sed -e 's/^\(.*\/\).*/\1/' -e '/\//!s/.*//'`; \ +@GEN_MANPAGES_TRUE@ if ! test -d "$(distdir)/$$docdir"; then \ +@GEN_MANPAGES_TRUE@ echo "$(mkinstalldirs) $(distdir)/$$docdir"; \ +@GEN_MANPAGES_TRUE@ $(mkinstalldirs) "$(distdir)/$$docdir"; \ +@GEN_MANPAGES_TRUE@ fi; \ +@GEN_MANPAGES_TRUE@ echo "$(INSTALL_DATA) $$d$$doc $(distdir)/$$doc"; \ +@GEN_MANPAGES_TRUE@ $(INSTALL_DATA) "$$d$$doc" "$(distdir)/$$doc"; \ +@GEN_MANPAGES_TRUE@ done + +@GEN_MANPAGES_TRUE@dist-doc-figs: $(_DOC_SRC_FIGURES) +@GEN_MANPAGES_TRUE@ @list='$(_DOC_C_FIGURES) $(_DOC_LC_FIGURES)'; \ +@GEN_MANPAGES_TRUE@ for fig in $$list; do \ +@GEN_MANPAGES_TRUE@ if test -f "$$fig"; then d=; else d="$(srcdir)/"; fi; \ +@GEN_MANPAGES_TRUE@ if test -f "$$d$$fig"; then \ +@GEN_MANPAGES_TRUE@ figdir=`echo $$fig | sed -e 's/^\(.*\/\).*/\1/' -e '/\//!s/.*//'`; \ +@GEN_MANPAGES_TRUE@ if ! test -d "$(distdir)/$$figdir"; then \ +@GEN_MANPAGES_TRUE@ echo "$(mkinstalldirs) $(distdir)/$$figdir"; \ +@GEN_MANPAGES_TRUE@ $(mkinstalldirs) "$(distdir)/$$figdir"; \ +@GEN_MANPAGES_TRUE@ fi; \ +@GEN_MANPAGES_TRUE@ echo "$(INSTALL_DATA) $$d$$fig $(distdir)/$$fig"; \ +@GEN_MANPAGES_TRUE@ $(INSTALL_DATA) "$$d$$fig" "$(distdir)/$$fig"; \ +@GEN_MANPAGES_TRUE@ fi; \ +@GEN_MANPAGES_TRUE@ done; + +@GEN_MANPAGES_TRUE@dist-doc-omf: +@GEN_MANPAGES_TRUE@ @if test -f "$(_DOC_OMF_IN)"; then d=; else d="$(srcdir)/"; fi; \ +@GEN_MANPAGES_TRUE@ echo "$(INSTALL_DATA) $$d$(_DOC_OMF_IN) $(distdir)/$(notdir $(_DOC_OMF_IN))"; \ +@GEN_MANPAGES_TRUE@ $(INSTALL_DATA) "$$d$(_DOC_OMF_IN)" "$(distdir)/$(notdir $(_DOC_OMF_IN))" + +@GEN_MANPAGES_TRUE@dist-doc-dsk: +@GEN_MANPAGES_TRUE@ @if test -f "$(_DOC_DSK_IN)"; then d=; else d="$(srcdir)/"; fi; \ +@GEN_MANPAGES_TRUE@ echo "$(INSTALL_DATA) $$d$(_DOC_DSK_IN) $(distdir)/$(notdir $(_DOC_DSK_IN))"; \ +@GEN_MANPAGES_TRUE@ $(INSTALL_DATA) "$$d$(_DOC_DSK_IN)" "$(distdir)/$(notdir $(_DOC_DSK_IN))" + +################################################################################ + +@GEN_MANPAGES_TRUE@.PHONY: check-doc-docs check-doc-omf +@GEN_MANPAGES_TRUE@check: \ +@GEN_MANPAGES_TRUE@ $(if $(DOC_MODULE),check-doc-docs) \ +@GEN_MANPAGES_TRUE@ $(if $(DOC_ID),check-doc-pages) \ +@GEN_MANPAGES_TRUE@ $(if $(_DOC_OMF_IN),check-doc-omf) + +@GEN_MANPAGES_TRUE@check-doc-docs: $(_DOC_C_DOCS) $(_DOC_LC_DOCS) +@GEN_MANPAGES_TRUE@ @for lc in C $(_DOC_REAL_LINGUAS); do \ +@GEN_MANPAGES_TRUE@ if test -f "$$lc"; \ +@GEN_MANPAGES_TRUE@ then d=; \ +@GEN_MANPAGES_TRUE@ xmlpath="$$lc"; \ +@GEN_MANPAGES_TRUE@ else \ +@GEN_MANPAGES_TRUE@ d="$(srcdir)/"; \ +@GEN_MANPAGES_TRUE@ xmlpath="$$lc:$(srcdir)/$$lc"; \ +@GEN_MANPAGES_TRUE@ fi; \ +@GEN_MANPAGES_TRUE@ echo "xmllint --noout --noent --path $$xmlpath --xinclude --postvalid $$d$$lc/$(DOC_MODULE).xml"; \ +@GEN_MANPAGES_TRUE@ xmllint --noout --noent --path "$$xmlpath" --xinclude --postvalid "$$d$$lc/$(DOC_MODULE).xml"; \ +@GEN_MANPAGES_TRUE@ done + +@GEN_MANPAGES_TRUE@check-doc-pages: $(_DOC_C_PAGES) $(_DOC_LC_PAGES) +@GEN_MANPAGES_TRUE@ for lc in C $(_DOC_REAL_LINGUAS); do \ +@GEN_MANPAGES_TRUE@ if test -f "$$lc"; \ +@GEN_MANPAGES_TRUE@ then d=; \ +@GEN_MANPAGES_TRUE@ xmlpath="$$lc"; \ +@GEN_MANPAGES_TRUE@ else \ +@GEN_MANPAGES_TRUE@ d="$(srcdir)/"; \ +@GEN_MANPAGES_TRUE@ xmlpath="$$lc:$(srcdir)/$$lc"; \ +@GEN_MANPAGES_TRUE@ fi; \ +@GEN_MANPAGES_TRUE@ for page in $(DOC_PAGES); do \ +@GEN_MANPAGES_TRUE@ echo "xmllint --noout --noent --path $$xmlpath --xinclude $$d$$lc/$$page"; \ +@GEN_MANPAGES_TRUE@ xmllint --noout --noent --path "$$xmlpath" --xinclude "$$d$$lc/$$page"; \ +@GEN_MANPAGES_TRUE@ done; \ +@GEN_MANPAGES_TRUE@ done + +@GEN_MANPAGES_TRUE@check-doc-omf: $(_DOC_OMF_ALL) +@GEN_MANPAGES_TRUE@ @list='$(_DOC_OMF_ALL)'; for omf in $$list; do \ +@GEN_MANPAGES_TRUE@ echo "xmllint --noout --xinclude --dtdvalid 'http://scrollkeeper.sourceforge.net/dtds/scrollkeeper-omf-1.0/scrollkeeper-omf.dtd' $$omf"; \ +@GEN_MANPAGES_TRUE@ xmllint --noout --xinclude --dtdvalid 'http://scrollkeeper.sourceforge.net/dtds/scrollkeeper-omf-1.0/scrollkeeper-omf.dtd' $$omf; \ +@GEN_MANPAGES_TRUE@ done + +################################################################################ + +@GEN_MANPAGES_TRUE@.PHONY: install-doc-docs install-doc-html install-doc-figs install-doc-omf install-doc-dsk + +@GEN_MANPAGES_TRUE@install-data-local: \ +@GEN_MANPAGES_TRUE@ $(if $(DOC_MODULE)$(DOC_ID),install-doc-docs) \ +@GEN_MANPAGES_TRUE@ $(if $(_DOC_HTML_ALL),install-doc-html) \ +@GEN_MANPAGES_TRUE@ $(if $(_DOC_C_FIGURES),install-doc-figs) \ +@GEN_MANPAGES_TRUE@ $(if $(_DOC_OMF_IN),install-doc-omf) +# $(if $(_DOC_DSK_IN),install-doc-dsk) + +@GEN_MANPAGES_TRUE@install-doc-docs: +@GEN_MANPAGES_TRUE@ @for lc in C $(_DOC_REAL_LINGUAS); do \ +@GEN_MANPAGES_TRUE@ echo "$(mkinstalldirs) $(DESTDIR)$(HELP_DIR)/$(_doc_install_dir)/$$lc"; \ +@GEN_MANPAGES_TRUE@ $(mkinstalldirs) $(DESTDIR)$(HELP_DIR)/$(_doc_install_dir)/$$lc; \ +@GEN_MANPAGES_TRUE@ done +@GEN_MANPAGES_TRUE@ @list='$(_DOC_C_DOCS)'; for doc in $$list; do \ +@GEN_MANPAGES_TRUE@ if test -f "$$doc"; then d=; else d="$(srcdir)/"; fi; \ +@GEN_MANPAGES_TRUE@ docdir="$$lc/"`echo $$doc | sed -e 's/^\(.*\/\).*/\1/' -e '/\//!s/.*//'`; \ +@GEN_MANPAGES_TRUE@ docdir="$(DESTDIR)$(HELP_DIR)/$(_doc_install_dir)/$$docdir"; \ +@GEN_MANPAGES_TRUE@ if ! test -d "$$docdir"; then \ +@GEN_MANPAGES_TRUE@ echo "$(mkinstalldirs) $$docdir"; \ +@GEN_MANPAGES_TRUE@ $(mkinstalldirs) "$$docdir"; \ +@GEN_MANPAGES_TRUE@ fi; \ +@GEN_MANPAGES_TRUE@ echo "$(INSTALL_DATA) $$d$$doc $(DESTDIR)$(HELP_DIR)/$(_doc_install_dir)/$$doc"; \ +@GEN_MANPAGES_TRUE@ $(INSTALL_DATA) $$d$$doc $(DESTDIR)$(HELP_DIR)/$(_doc_install_dir)/$$doc; \ +@GEN_MANPAGES_TRUE@ done +@GEN_MANPAGES_TRUE@ @list='$(_DOC_LC_DOCS)'; for doc in $$list; do \ +@GEN_MANPAGES_TRUE@ if test -f "$$doc"; then d=; else d="$(srcdir)/"; fi; \ +@GEN_MANPAGES_TRUE@ docdir="$$lc/"`echo $$doc | sed -e 's/^\(.*\/\).*/\1/' -e '/\//!s/.*//'`; \ +@GEN_MANPAGES_TRUE@ docdir="$(DESTDIR)$(HELP_DIR)/$(_doc_install_dir)/$$docdir"; \ +@GEN_MANPAGES_TRUE@ if ! test -d "$$docdir"; then \ +@GEN_MANPAGES_TRUE@ echo "$(mkinstalldirs) $$docdir"; \ +@GEN_MANPAGES_TRUE@ $(mkinstalldirs) "$$docdir"; \ +@GEN_MANPAGES_TRUE@ fi; \ +@GEN_MANPAGES_TRUE@ echo "$(INSTALL_DATA) $$d$$doc $(DESTDIR)$(HELP_DIR)/$(_doc_install_dir)/$$doc"; \ +@GEN_MANPAGES_TRUE@ $(INSTALL_DATA) $$d$$doc $(DESTDIR)$(HELP_DIR)/$(_doc_install_dir)/$$doc; \ +@GEN_MANPAGES_TRUE@ done + +@GEN_MANPAGES_TRUE@install-doc-figs: +@GEN_MANPAGES_TRUE@ @list='$(patsubst C/%,%,$(_DOC_C_FIGURES))'; for fig in $$list; do \ +@GEN_MANPAGES_TRUE@ for lc in C $(_DOC_REAL_LINGUAS); do \ +@GEN_MANPAGES_TRUE@ figsymlink=false; \ +@GEN_MANPAGES_TRUE@ if test -f "$$lc/$$fig"; then \ +@GEN_MANPAGES_TRUE@ figfile="$$lc/$$fig"; \ +@GEN_MANPAGES_TRUE@ elif test -f "$(srcdir)/$$lc/$$fig"; then \ +@GEN_MANPAGES_TRUE@ figfile="$(srcdir)/$$lc/$$fig"; \ +@GEN_MANPAGES_TRUE@ else \ +@GEN_MANPAGES_TRUE@ figsymlink=true; \ +@GEN_MANPAGES_TRUE@ fi; \ +@GEN_MANPAGES_TRUE@ figdir="$$lc/"`echo $$fig | sed -e 's/^\(.*\/\).*/\1/' -e '/\//!s/.*//'`; \ +@GEN_MANPAGES_TRUE@ figdir="$(DESTDIR)$(HELP_DIR)/$(_doc_install_dir)/$$figdir"; \ +@GEN_MANPAGES_TRUE@ if ! test -d "$$figdir"; then \ +@GEN_MANPAGES_TRUE@ echo "$(mkinstalldirs) $$figdir"; \ +@GEN_MANPAGES_TRUE@ $(mkinstalldirs) "$$figdir"; \ +@GEN_MANPAGES_TRUE@ fi; \ +@GEN_MANPAGES_TRUE@ figbase=`echo $$fig | sed -e 's/^.*\///'`; \ +@GEN_MANPAGES_TRUE@ if $$figsymlink; then \ +@GEN_MANPAGES_TRUE@ echo "cd $$figdir && $(LN_S) -f ../../C/$$fig $$figbase"; \ +@GEN_MANPAGES_TRUE@ ( cd "$$figdir" && $(LN_S) -f "../../C/$$fig" "$$figbase" ); \ +@GEN_MANPAGES_TRUE@ else \ +@GEN_MANPAGES_TRUE@ echo "$(INSTALL_DATA) $$figfile $$figdir$$figbase"; \ +@GEN_MANPAGES_TRUE@ $(INSTALL_DATA) "$$figfile" "$$figdir$$figbase"; \ +@GEN_MANPAGES_TRUE@ fi; \ +@GEN_MANPAGES_TRUE@ done; \ +@GEN_MANPAGES_TRUE@ done + +@GEN_MANPAGES_TRUE@install-doc-html: +@GEN_MANPAGES_TRUE@ echo install-html + +@GEN_MANPAGES_TRUE@install-doc-omf: +@GEN_MANPAGES_TRUE@ $(mkinstalldirs) $(DESTDIR)$(OMF_DIR)/$(_doc_install_dir) +@GEN_MANPAGES_TRUE@ @list='$(_DOC_OMF_ALL)'; for omf in $$list; do \ +@GEN_MANPAGES_TRUE@ echo "$(INSTALL_DATA) $$omf $(DESTDIR)$(OMF_DIR)/$(_doc_install_dir)/$$omf"; \ +@GEN_MANPAGES_TRUE@ $(INSTALL_DATA) $$omf $(DESTDIR)$(OMF_DIR)/$(_doc_install_dir)/$$omf; \ +@GEN_MANPAGES_TRUE@ done +@GEN_MANPAGES_TRUE@ @if test "x$(_ENABLE_SK)" = "xtrue"; then \ +@GEN_MANPAGES_TRUE@ echo "scrollkeeper-update -p $(DESTDIR)$(_sklocalstatedir) -o $(DESTDIR)$(OMF_DIR)/$(_doc_install_dir)"; \ +@GEN_MANPAGES_TRUE@ scrollkeeper-update -p "$(DESTDIR)$(_sklocalstatedir)" -o "$(DESTDIR)$(OMF_DIR)/$(_doc_install_dir)"; \ +@GEN_MANPAGES_TRUE@ fi; + +@GEN_MANPAGES_TRUE@install-doc-dsk: +@GEN_MANPAGES_TRUE@ echo install-dsk + +################################################################################ + +@GEN_MANPAGES_TRUE@.PHONY: uninstall-doc-docs uninstall-doc-html uninstall-doc-figs uninstall-doc-omf uninstall-doc-dsk +@GEN_MANPAGES_TRUE@uninstall-local: \ +@GEN_MANPAGES_TRUE@ $(if $(DOC_MODULE)$(DOC_ID),uninstall-doc-docs) \ +@GEN_MANPAGES_TRUE@ $(if $(_DOC_HTML_ALL),uninstall-doc-html) \ +@GEN_MANPAGES_TRUE@ $(if $(_DOC_C_FIGURES),uninstall-doc-figs) \ +@GEN_MANPAGES_TRUE@ $(if $(_DOC_OMF_IN),uninstall-doc-omf) +# $(if $(_DOC_DSK_IN),uninstall-doc-dsk) + +@GEN_MANPAGES_TRUE@uninstall-doc-docs: +@GEN_MANPAGES_TRUE@ @list='$(_DOC_C_DOCS)'; for doc in $$list; do \ +@GEN_MANPAGES_TRUE@ echo " rm -f $(DESTDIR)$(HELP_DIR)/$(_doc_install_dir)/$$doc"; \ +@GEN_MANPAGES_TRUE@ rm -f "$(DESTDIR)$(HELP_DIR)/$(_doc_install_dir)/$$doc"; \ +@GEN_MANPAGES_TRUE@ done +@GEN_MANPAGES_TRUE@ @list='$(_DOC_LC_DOCS)'; for doc in $$list; do \ +@GEN_MANPAGES_TRUE@ echo " rm -f $(DESTDIR)$(HELP_DIR)/$(_doc_install_dir)/$$doc"; \ +@GEN_MANPAGES_TRUE@ rm -f "$(DESTDIR)$(HELP_DIR)/$(_doc_install_dir)/$$doc"; \ +@GEN_MANPAGES_TRUE@ done + +@GEN_MANPAGES_TRUE@uninstall-doc-figs: +@GEN_MANPAGES_TRUE@ @list='$(_DOC_C_FIGURES) $(_DOC_LC_FIGURES)'; for fig in $$list; do \ +@GEN_MANPAGES_TRUE@ echo "rm -f $(DESTDIR)$(HELP_DIR)/$(_doc_install_dir)/$$fig"; \ +@GEN_MANPAGES_TRUE@ rm -f "$(DESTDIR)$(HELP_DIR)/$(_doc_install_dir)/$$fig"; \ +@GEN_MANPAGES_TRUE@ done; + +@GEN_MANPAGES_TRUE@uninstall-doc-omf: +@GEN_MANPAGES_TRUE@ @list='$(_DOC_OMF_ALL)'; for omf in $$list; do \ +@GEN_MANPAGES_TRUE@ if test "x$(_ENABLE_SK)" = "xtrue"; then \ +@GEN_MANPAGES_TRUE@ echo "scrollkeeper-uninstall -p $(_sklocalstatedir) $(DESTDIR)$(OMF_DIR)/$(_doc_install_dir)/$$omf"; \ +@GEN_MANPAGES_TRUE@ scrollkeeper-uninstall -p "$(_sklocalstatedir)" "$(DESTDIR)$(OMF_DIR)/$(_doc_install_dir)/$$omf"; \ +@GEN_MANPAGES_TRUE@ fi; \ +@GEN_MANPAGES_TRUE@ echo "rm -f $(DESTDIR)$(OMF_DIR)/$(_doc_install_dir)/$$omf"; \ +@GEN_MANPAGES_TRUE@ rm -f "$(DESTDIR)$(OMF_DIR)/$(_doc_install_dir)/$$omf"; \ +@GEN_MANPAGES_TRUE@ done + +# Annoyingly in the XML, yelp refuses to load relative images fileref, i.e. ../../src/icons/file.png +# whereas the PDF generation inserts these references OK +# Nevertheless we need to copy the images into figures/ so they are available for the distribution installed help +# Most tool icons are _18, except the pan one which is _22 just to be annoying +get-icons: + -cp -f ../src/icons/*_[12][0-9].png C/figures/ +# '-' ^^^^^ means it doesn't care about the exit status +# this copy statement is not critical (especially when run under make distcheck) + +dist-hook: get-icons doc-dist-hook + +%.1: %.xml + $(XP) -o $@ $(DB2MAN) $< + +# Tell versions [3.59,3.63) of GNU make to not export all variables. +# Otherwise a system limit (for SysV at least) may be exceeded. +.NOEXPORT: diff --git a/help/viking.omf.in b/help/viking.omf.in new file mode 100644 index 0000000..745d1e5 --- /dev/null +++ b/help/viking.omf.in @@ -0,0 +1,10 @@ + + + + + manual + + + + + diff --git a/help/viking.xml.in b/help/viking.xml.in new file mode 100644 index 0000000..eb69bc4 --- /dev/null +++ b/help/viking.xml.in @@ -0,0 +1,732 @@ + +.
will be generated. You may view the +manual page with: nroff -man .
| less'. A +typical entry in a Makefile or Makefile.am is: + +DB2MAN=/usr/share/sgml/docbook/stylesheet/xsl/nwalsh/\ +manpages/docbook.xsl +XP=xsltproc -''-nonet + +manpage.1: manpage.dbk + $(XP) $(DB2MAN) $< + +The xsltproc binary is found in the xsltproc package. The +XSL files are in docbook-xsl. Please remember that if you +create the nroff version in one of the debian/rules file +targets (such as build), you will need to include xsltproc +and docbook-xsl in your Build-Depends control field. + +--> + + + Ralf"> + Meyer"> + @ISODATE@"> + + + + 1"> + ranfyy@gmail.com"> + + VIKING"> + + + Debian"> + GNU"> + GPL"> + + + maps.xml, goto_tools.xml, datasources.xml, external_tools.xml, routing.xml"> +]> + + +&dhsource; &dhversion; + + + +
+ &dhemail; +
+ + 2007 + &dhusername; + + + 2010 + Guilhem Bonnefille + + + 2013 + Rob Norris + + &dhdate; + Viking +
+ + &dhucpackage; + &dhsection; + &dhsource; + &dhversion; + + + &dhpackage; + + program to manage GPS data + + + + &dhpackage; + + + + + + + + + + + degrees + + + degrees + + + + + ZoomLevelOSM + + + + MapId + + + file + + + &dhpackage; + + + + + + + &dhpackage; + + + + + + + + DESCRIPTION + + + Viking is a program to manage GPS data. + + + You can import and plot tracks, routes and waypoints, show OpenStreetMap (OSM) and/or other maps, generate maps (using Mapnik), + geotag images, add coordinate lines, make new tracks, routes and waypoints, hide different things, etc. + It is written mainly in C with some C++ and uses the GTK+ 2 toolkit. It is available for Linux, other POSIX operating systems and Windows. + + + Homepage: http://viking.sf.net + + + Viking is licensed under the GNU GPL. + + + + + OPTIONS + + + + + + Specify file to load at start. + + + + + + + Enable debug output. + + + + + + + Enable verbose output. + + + + + + + Show help options. + + + + + + + Show version. + + + + + + Set the initial position to the specified latitude in decimal degrees. + + + + + + Set the initial position to the specified longitude in decimal degrees. + + + + + + + Set the initial zoom level. The value is the OSM zoom level (0 - 22). + + + + + + + Add a map layer by specifying the map id. The value needs to match one of the internal ids or an id from the maps configuration extension (see below). + Specifying a value of 0 will use the configured map layer default. + + Internal Map Ids: + OSM Mapnik = 13 + OSM Cycle = 17 + Mapquest OSM = 19 + + + + + + + + Extending Viking + + Currently, &dhpackage; has some extension points based on configuration files. The file format is heavily inspired by the GtkBuilder file format: you specify the class of the GObject to build and set its properties. Technically, it is a XML file containing a "objects" root element. Inside this element, you set a collection of "object". + Here is an example: + + + Property value + Property value + + ... + +]]> + + + You can find more examples in the documentation part of the distribution. + + Map Source + It is possible to add new map's sources. The file is ~/.viking/maps.xml. + An example of the file in the distribution doc/examples/maps.xml. + The VikSlippyMapSource allows to declare any map's source working like OpenStreetMap. It supports the following properties: + + + id + this is an integer and should be unique as it used to identify the map source + + + name + a string (should be unique) that is used for the OSM style cache directory name when the Map Cache directory is the default (~/.viking-maps) + + + label + the text displayed in the map's source selection dialog + + + hostname + the server's hostname (eg. "tile.openstreetmap.org") + + + url + + the parametrized address of the tile, in the spirit of C printf format, with 3 "%d" fields for Z, X and Y (in that order) (eg. "/%d/%d/%d.png") + + The full parametrized address can just be put in the URL field and the hostname field doesn't need specifying. + e.g. "https://tile.openstreetmap.org/%d/%d/%d.png" + + + + + zoom-min (optional) + The minimum zoom value supported by the tile server. The Default is 0 if not specified. + + + zoom-max (optional) + + The maximum zoom value supported by the tile server. The Default is 18 if not specified. + See Zoom Levels + + + + lat-min (optional) + The minimum latitude value in degrees supported by the tile server. The Default is -90 degrees if not specified. + + + lat-max (optional) + The maximum latitude value in degrees supported by the tile server. The Default is 90 degrees if not specified. + + + lon-min (optional) + The minimum longitude value in degrees supported by the tile server. The Default is -180 degrees if not specified. + + + lon-max (optional) + The maximum longitude value in degrees supported by the tile server. The Default is 180 degrees if not specified. + + + file-extension (optional) + + The file extension of the files on disk. The default is .png + If the tile source URL ends in something other than .png, then this parameter will need to match it. + This can also be useful in reading a tileset from other software which may name tiles in an alternative form, + e.g. for Mobile Atlas creator it names them .png.tile + The file types actually usable are those supported by GDK Pixbuf Library, which includes at least PNG and JPEG. + Remember to include the beginning '.' when specifying this parameter. + + + + switch-xy (optional) + + Swap the X,Y values around in the URL parametrized ordering. + The default is false. + + + + check-file-server-time (optional) + + Sends the timestamp of the tile to the server, so the server can decide whether it should send a new tile or not. + The default is false. + + + + use-etag (optional) + + Use and compare the ETag value in determining whether to download a newer tile. The default is false. + The ETag value is stored in a separate file in the same directory as the tile to enable checking the value across multiple runs of the program. + + + + tilesize-x (optional) + The tile x size. The default is 256 pixels if not specified. + + + tilesize-y (optional) + The tile y size. The default is 256 pixels if not specified. + + + scale (optional) + + The tile scale. The scale is 1 if not specified. + Use a value of 2 to represent high res tiles. + Don't change the tilesize as the internal display size is still based on 256 pixels. + + + + + + The VikTmsMapSource allows to declare any TMS service. It supports the following properties (as per VikSlippyMapSource above): + + + id + + + label + + + hostname + + + url + + + check-file-server-time (optional) + + + zoom-min (optional) + + + zoom-max (optional) + + + lat-min (optional) + + + lat-max (optional) + + + lon-min (optional) + + + lon-max (optional) + + + + The VikWmscMapSource allows to declare any WMS or WMS-C service. It supports the following properties (as per VikSlippyMapSource above): + + + id + + + label + + + hostname + + + url + + + check-file-server-time (optional) + + + zoom-min (optional) + + + zoom-max (optional) + + + lat-min (optional) + + + lat-max (optional) + + + lon-min (optional) + + + lon-max (optional) + + + + + + + Go-to search engines + It is possible to add new new search engines for the "Go-To" feature. The file is ~/.viking/goto_tools.xml. + An example of the file in the distribution doc/examples/goto_tools.xml. + Currently, there is a single object class available: VikGotoXmlTool. Such feature allows to declare any search engine using a XML format as result. + The related properties are: + + + label + the text displayed in the Go-To dialog + + + url-format + the parametrized address of the query, in the spirit of C printf format, with a single "%s" field (replaced by the query string) + + + lat-path + XML path of the latitude (eg. /root/parent/elem) + + + lat-attr (optional) + name of the attribute (of previous element) containing the latitude + + + lon-path + XML path of the longitude (eg. /root/parent/elem) + + + lon-attr (optional) + name of the attribute (of previous element) containing the longiude + + + + As a facility (or readability) it is possible to set both path and attribute name in a single property, like an XPath expression. To do so, simply set both info in lat-path (or lon-path) in the following format: /root/parent/elem@attribute. + + + + External tools + It is possible to add new external tools. The file is ~/.viking/external_tools.xml. + An example of the file in the distribution doc/examples/external_tools.xml. + The VikWebtoolCenter allows to declare any Webtool using a logic based on center coordinates and zoom level value. + The related properties are: + + + label + the text displayed in the menu entry + + + url + the parametrized URL to open, in the spirit of C printf format, with 2 "%s" and a "%d" fields for X, Y and Z (zoom level) (eg. "http://hostname/?lat=%s&lon=%s&zoom=%d") + + + + The VikWebtoolBounds allows to declare any Webtool using a logic based on bounds coordinates. + The related properties are: + + + label + the text displayed in the menu entry + + + url + the parametrized address of the tile, in the spirit of C printf format, with 4 "%s" fields for left, right, bottom and top (eg. "http://hostname:8111/load_and_zoom?left=%s&right=%s&bottom=%s&top=%s") + + + + + + + Routing engine + It is possible to declare new routing engines. The file is ~/.viking/routing.xml. + An example of the file in the distribution doc/examples/routing.xml. + The VikRoutingWebEngine allows to declare a routing engine available via HTTP. + The related properties are: + + + id + a string, should be unique as it used to identify the routing engine + + + label + the text displayed in the menu entry + + + format + + The GPSBabel format code to interpret the service response. By default a GPX response is expected and processed internally. However if the service returns different format then GPSBabel is used to transform the text into something that &appname; can understand. Only formats that GPSBabel supports can be used: e.g. 'gpx', 'kml', 'gtrnctr' (for Garmin Training Center .tcx files), etc... + Use gpsbabel --help on the command line to find out the supported file types and their codes to process them. + + + + url-base + the base URL of the web service (eg. "http://hostname/service?") + + + url-start-ll + the part of the URL setting the starting point location, parametrized in the spirit of C printf format, with 2 "%s" for coordinates (eg. "&start=%s,%s") + + + url-stop-ll + the part of the URL setting the end point location, parametrized in the spirit of C printf format, with 2 "%s" for coordinates (eg. "&stop=%s,%s") + + + url-via-ll (optional) + the part of the URL setting via point location, parametrized in the spirit of C printf format, with 2 "%s" for coordinates (eg. "&via=%s,%s") + + + url-start-dir (optional) + the part of the URL setting the starting point location for direction based routing, parametrized in the spirit of C printf format, with one "%s" for direction (eg. "&start=%s") + + + url-stop-dir (optional) + the part of the URL setting the end point location for direction based routing, parametrized in the spirit of C printf format, with one "%s" for direction (eg. "&start=%s") + + + url-ll-lat-first (optional) + The ordering of the lat/long terms in the Start, Stop and Via URL settings. By default this is TRUE. + For instance using Brouter services, the URL uses a pair of values which is longitude and then latitude. Thus setting this value to FALSE ensures the value substitution is performed in the necessary order. + + + referer (optional) + A URL to serve as referer for the HTTP request (eg. "http://hostname/") + + + follow-location (optional) + the max depth of recursive redirections + + + + + + + Remote File Datasources + It is possible to add web references expected to return a file which can then be opened directly or converted via GPSBabel. + The file is ~/.viking/datasources.xml. + An example of the file is in the source distribution doc/examples/datasources.xml. + The VikWebtoolDatasource allows to declare any URL using logic based on coordinates. + The related properties are: + + + label + the text displayed in the menu entry + + + url + + the parametrized URL to open in the spirit of C printf format, with up to 7 "%s" values. e.g. http://hostname/getfile?lat=%s&lon=%s + The order and meaning of these parameters is given by the url_format_code below + + + + url_format_code + + A string describing the parametrized URL substitution parameters, each character represents how to translate each term. + B = Bottom of the current view i.e. minimum latitude + L = Left of the current view i.e. minimum longitude + T = Top of the current view i.e. maximum latitude + R = Right of the current view i.e. maximum longitude + A = center lAtitude of the current view + O = center lOngitude of the current view + Z = OSM Zoom value of the current view. See Zoom Levels + S = A user specified input string requested from the user via a dialog box + Thus for the url example above then the format code should be AO + + + + file_type + + This value is passed on for the -i parameter in interfacing with GPSBabel. + If it is not defined then the returned file is interpreted internally as a GPX file. + Possible values such as 'kml', 'mapsource' etc.. can be used. See GPSBabel File Formats for the full list. + + + + babel_filter_args + + This value is passed on for the filter arguments interfacing with GPSBabel. + E.g. "-x nuketypes,routes" can be used to filter all routes from the results. + + + + input_label + + This value is used when requesting input from the user. + It is the label of the text input box. + + + + + + + + + FILES + + + + ~/.viking/maps.xml + + File containing definition of map sources. + See previous section for details. + + + + ~/.viking/goto_tools.xml + + File containing definition of "Go-to" services. + See previous section for details. + + + + ~/.viking/external_tools.xml + + File containing definition of external tools. + See previous section for details. + + + + ~/.viking/datasources.xml + + File containing definition of remote file datasources. + See previous section for details. + + + + ~/.viking/routing.xml + + File containing definition of routing sources. + See previous section for details. + + + + ~/.viking/viking.prefs + + Preferences for &dhpackage;. + + + + ~/.viking/viking_layer_defaults.ini + + Layer default values for &dhpackage;. + + + + ~/.viking/viking.ini + + Values for &dhpackage; automatically saved between sessions. + Not generally intended to be manually edited. + However some finer control of default internal values can be set. + + + + ~/.viking/keys.rc + + File containing short cut key accelerators. + This is in the standard GTK Accelerator map format. + + + + ~/.viking-maps/ + + Default location of the map cache of tiles downloaded or created by &dhpackage;. + + + + + Extension files (&extfiles;) + are also searched in /etc/viking and + /usr/share/viking directories (or related in your system). + + + + ENVIRONMENT + + + + XDG_DATA_HOME + + Optional directory to look for extension files (&extfiles;). + + + + XDG_DATA_DIRS + + Path used to change the directories scanned for extension files (&extfiles;). + + + + + + + AUTHOR + + This manual page was originally written by &dhusername; &dhemail; for + the &debian; system (but may be used by others). Permission is + granted to copy, distribute and/or modify this document under + the terms of the &gnu; General Public License, Version 2 any + later version published by the Free Software Foundation. + + + On Debian systems, the complete text of the GNU General Public + License can be found in /usr/share/common-licenses/GPL. + + + +
+
diff --git a/install-sh b/install-sh new file mode 100755 index 0000000..8175c64 --- /dev/null +++ b/install-sh @@ -0,0 +1,518 @@ +#!/bin/sh +# install - install a program, script, or datafile + +scriptversion=2018-03-11.20; # UTC + +# This originates from X11R5 (mit/util/scripts/install.sh), which was +# later released in X11R6 (xc/config/util/install.sh) with the +# following copyright and license. +# +# Copyright (C) 1994 X Consortium +# +# 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 +# X CONSORTIUM BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN +# AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNEC- +# TION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. +# +# Except as contained in this notice, the name of the X Consortium shall not +# be used in advertising or otherwise to promote the sale, use or other deal- +# ings in this Software without prior written authorization from the X Consor- +# tium. +# +# +# FSF changes to this file are in the public domain. +# +# Calling this script install-sh is preferred over install.sh, to prevent +# 'make' implicit rules from creating a file called install from it +# when there is no Makefile. +# +# This script is compatible with the BSD install script, but was written +# from scratch. + +tab=' ' +nl=' +' +IFS=" $tab$nl" + +# Set DOITPROG to "echo" to test this script. + +doit=${DOITPROG-} +doit_exec=${doit:-exec} + +# Put in absolute file names if you don't have them in your path; +# or use environment vars. + +chgrpprog=${CHGRPPROG-chgrp} +chmodprog=${CHMODPROG-chmod} +chownprog=${CHOWNPROG-chown} +cmpprog=${CMPPROG-cmp} +cpprog=${CPPROG-cp} +mkdirprog=${MKDIRPROG-mkdir} +mvprog=${MVPROG-mv} +rmprog=${RMPROG-rm} +stripprog=${STRIPPROG-strip} + +posix_mkdir= + +# Desired mode of installed file. +mode=0755 + +chgrpcmd= +chmodcmd=$chmodprog +chowncmd= +mvcmd=$mvprog +rmcmd="$rmprog -f" +stripcmd= + +src= +dst= +dir_arg= +dst_arg= + +copy_on_change=false +is_target_a_directory=possibly + +usage="\ +Usage: $0 [OPTION]... [-T] SRCFILE DSTFILE + or: $0 [OPTION]... SRCFILES... DIRECTORY + or: $0 [OPTION]... -t DIRECTORY SRCFILES... + or: $0 [OPTION]... -d DIRECTORIES... + +In the 1st form, copy SRCFILE to DSTFILE. +In the 2nd and 3rd, copy all SRCFILES to DIRECTORY. +In the 4th, create DIRECTORIES. + +Options: + --help display this help and exit. + --version display version info and exit. + + -c (ignored) + -C install only if different (preserve the last data modification time) + -d create directories instead of installing files. + -g GROUP $chgrpprog installed files to GROUP. + -m MODE $chmodprog installed files to MODE. + -o USER $chownprog installed files to USER. + -s $stripprog installed files. + -t DIRECTORY install into DIRECTORY. + -T report an error if DSTFILE is a directory. + +Environment variables override the default commands: + CHGRPPROG CHMODPROG CHOWNPROG CMPPROG CPPROG MKDIRPROG MVPROG + RMPROG STRIPPROG +" + +while test $# -ne 0; do + case $1 in + -c) ;; + + -C) copy_on_change=true;; + + -d) dir_arg=true;; + + -g) chgrpcmd="$chgrpprog $2" + shift;; + + --help) echo "$usage"; exit $?;; + + -m) mode=$2 + case $mode in + *' '* | *"$tab"* | *"$nl"* | *'*'* | *'?'* | *'['*) + echo "$0: invalid mode: $mode" >&2 + exit 1;; + esac + shift;; + + -o) chowncmd="$chownprog $2" + shift;; + + -s) stripcmd=$stripprog;; + + -t) + is_target_a_directory=always + dst_arg=$2 + # Protect names problematic for 'test' and other utilities. + case $dst_arg in + -* | [=\(\)!]) dst_arg=./$dst_arg;; + esac + shift;; + + -T) is_target_a_directory=never;; + + --version) echo "$0 $scriptversion"; exit $?;; + + --) shift + break;; + + -*) echo "$0: invalid option: $1" >&2 + exit 1;; + + *) break;; + esac + shift +done + +# We allow the use of options -d and -T together, by making -d +# take the precedence; this is for compatibility with GNU install. + +if test -n "$dir_arg"; then + if test -n "$dst_arg"; then + echo "$0: target directory not allowed when installing a directory." >&2 + exit 1 + fi +fi + +if test $# -ne 0 && test -z "$dir_arg$dst_arg"; then + # When -d is used, all remaining arguments are directories to create. + # When -t is used, the destination is already specified. + # Otherwise, the last argument is the destination. Remove it from $@. + for arg + do + if test -n "$dst_arg"; then + # $@ is not empty: it contains at least $arg. + set fnord "$@" "$dst_arg" + shift # fnord + fi + shift # arg + dst_arg=$arg + # Protect names problematic for 'test' and other utilities. + case $dst_arg in + -* | [=\(\)!]) dst_arg=./$dst_arg;; + esac + done +fi + +if test $# -eq 0; then + if test -z "$dir_arg"; then + echo "$0: no input file specified." >&2 + exit 1 + fi + # It's OK to call 'install-sh -d' without argument. + # This can happen when creating conditional directories. + exit 0 +fi + +if test -z "$dir_arg"; then + if test $# -gt 1 || test "$is_target_a_directory" = always; then + if test ! -d "$dst_arg"; then + echo "$0: $dst_arg: Is not a directory." >&2 + exit 1 + fi + fi +fi + +if test -z "$dir_arg"; then + do_exit='(exit $ret); exit $ret' + trap "ret=129; $do_exit" 1 + trap "ret=130; $do_exit" 2 + trap "ret=141; $do_exit" 13 + trap "ret=143; $do_exit" 15 + + # Set umask so as not to create temps with too-generous modes. + # However, 'strip' requires both read and write access to temps. + case $mode in + # Optimize common cases. + *644) cp_umask=133;; + *755) cp_umask=22;; + + *[0-7]) + if test -z "$stripcmd"; then + u_plus_rw= + else + u_plus_rw='% 200' + fi + cp_umask=`expr '(' 777 - $mode % 1000 ')' $u_plus_rw`;; + *) + if test -z "$stripcmd"; then + u_plus_rw= + else + u_plus_rw=,u+rw + fi + cp_umask=$mode$u_plus_rw;; + esac +fi + +for src +do + # Protect names problematic for 'test' and other utilities. + case $src in + -* | [=\(\)!]) src=./$src;; + esac + + if test -n "$dir_arg"; then + dst=$src + dstdir=$dst + test -d "$dstdir" + dstdir_status=$? + else + + # Waiting for this to be detected by the "$cpprog $src $dsttmp" command + # might cause directories to be created, which would be especially bad + # if $src (and thus $dsttmp) contains '*'. + if test ! -f "$src" && test ! -d "$src"; then + echo "$0: $src does not exist." >&2 + exit 1 + fi + + if test -z "$dst_arg"; then + echo "$0: no destination specified." >&2 + exit 1 + fi + dst=$dst_arg + + # If destination is a directory, append the input filename. + if test -d "$dst"; then + if test "$is_target_a_directory" = never; then + echo "$0: $dst_arg: Is a directory" >&2 + exit 1 + fi + dstdir=$dst + dstbase=`basename "$src"` + case $dst in + */) dst=$dst$dstbase;; + *) dst=$dst/$dstbase;; + esac + dstdir_status=0 + else + dstdir=`dirname "$dst"` + test -d "$dstdir" + dstdir_status=$? + fi + fi + + case $dstdir in + */) dstdirslash=$dstdir;; + *) dstdirslash=$dstdir/;; + esac + + obsolete_mkdir_used=false + + if test $dstdir_status != 0; then + case $posix_mkdir in + '') + # Create intermediate dirs using mode 755 as modified by the umask. + # This is like FreeBSD 'install' as of 1997-10-28. + umask=`umask` + case $stripcmd.$umask in + # Optimize common cases. + *[2367][2367]) mkdir_umask=$umask;; + .*0[02][02] | .[02][02] | .[02]) mkdir_umask=22;; + + *[0-7]) + mkdir_umask=`expr $umask + 22 \ + - $umask % 100 % 40 + $umask % 20 \ + - $umask % 10 % 4 + $umask % 2 + `;; + *) mkdir_umask=$umask,go-w;; + esac + + # With -d, create the new directory with the user-specified mode. + # Otherwise, rely on $mkdir_umask. + if test -n "$dir_arg"; then + mkdir_mode=-m$mode + else + mkdir_mode= + fi + + posix_mkdir=false + case $umask in + *[123567][0-7][0-7]) + # POSIX mkdir -p sets u+wx bits regardless of umask, which + # is incompatible with FreeBSD 'install' when (umask & 300) != 0. + ;; + *) + # Note that $RANDOM variable is not portable (e.g. dash); Use it + # here however when possible just to lower collision chance. + tmpdir=${TMPDIR-/tmp}/ins$RANDOM-$$ + + trap 'ret=$?; rmdir "$tmpdir/a/b" "$tmpdir/a" "$tmpdir" 2>/dev/null; exit $ret' 0 + + # Because "mkdir -p" follows existing symlinks and we likely work + # directly in world-writeable /tmp, make sure that the '$tmpdir' + # directory is successfully created first before we actually test + # 'mkdir -p' feature. + if (umask $mkdir_umask && + $mkdirprog $mkdir_mode "$tmpdir" && + exec $mkdirprog $mkdir_mode -p -- "$tmpdir/a/b") >/dev/null 2>&1 + then + if test -z "$dir_arg" || { + # Check for POSIX incompatibilities with -m. + # HP-UX 11.23 and IRIX 6.5 mkdir -m -p sets group- or + # other-writable bit of parent directory when it shouldn't. + # FreeBSD 6.1 mkdir -m -p sets mode of existing directory. + test_tmpdir="$tmpdir/a" + ls_ld_tmpdir=`ls -ld "$test_tmpdir"` + case $ls_ld_tmpdir in + d????-?r-*) different_mode=700;; + d????-?--*) different_mode=755;; + *) false;; + esac && + $mkdirprog -m$different_mode -p -- "$test_tmpdir" && { + ls_ld_tmpdir_1=`ls -ld "$test_tmpdir"` + test "$ls_ld_tmpdir" = "$ls_ld_tmpdir_1" + } + } + then posix_mkdir=: + fi + rmdir "$tmpdir/a/b" "$tmpdir/a" "$tmpdir" + else + # Remove any dirs left behind by ancient mkdir implementations. + rmdir ./$mkdir_mode ./-p ./-- "$tmpdir" 2>/dev/null + fi + trap '' 0;; + esac;; + esac + + if + $posix_mkdir && ( + umask $mkdir_umask && + $doit_exec $mkdirprog $mkdir_mode -p -- "$dstdir" + ) + then : + else + + # The umask is ridiculous, or mkdir does not conform to POSIX, + # or it failed possibly due to a race condition. Create the + # directory the slow way, step by step, checking for races as we go. + + case $dstdir in + /*) prefix='/';; + [-=\(\)!]*) prefix='./';; + *) prefix='';; + esac + + oIFS=$IFS + IFS=/ + set -f + set fnord $dstdir + shift + set +f + IFS=$oIFS + + prefixes= + + for d + do + test X"$d" = X && continue + + prefix=$prefix$d + if test -d "$prefix"; then + prefixes= + else + if $posix_mkdir; then + (umask=$mkdir_umask && + $doit_exec $mkdirprog $mkdir_mode -p -- "$dstdir") && break + # Don't fail if two instances are running concurrently. + test -d "$prefix" || exit 1 + else + case $prefix in + *\'*) qprefix=`echo "$prefix" | sed "s/'/'\\\\\\\\''/g"`;; + *) qprefix=$prefix;; + esac + prefixes="$prefixes '$qprefix'" + fi + fi + prefix=$prefix/ + done + + if test -n "$prefixes"; then + # Don't fail if two instances are running concurrently. + (umask $mkdir_umask && + eval "\$doit_exec \$mkdirprog $prefixes") || + test -d "$dstdir" || exit 1 + obsolete_mkdir_used=true + fi + fi + fi + + if test -n "$dir_arg"; then + { test -z "$chowncmd" || $doit $chowncmd "$dst"; } && + { test -z "$chgrpcmd" || $doit $chgrpcmd "$dst"; } && + { test "$obsolete_mkdir_used$chowncmd$chgrpcmd" = false || + test -z "$chmodcmd" || $doit $chmodcmd $mode "$dst"; } || exit 1 + else + + # Make a couple of temp file names in the proper directory. + dsttmp=${dstdirslash}_inst.$$_ + rmtmp=${dstdirslash}_rm.$$_ + + # Trap to clean up those temp files at exit. + trap 'ret=$?; rm -f "$dsttmp" "$rmtmp" && exit $ret' 0 + + # Copy the file name to the temp name. + (umask $cp_umask && $doit_exec $cpprog "$src" "$dsttmp") && + + # and set any options; do chmod last to preserve setuid bits. + # + # If any of these fail, we abort the whole thing. If we want to + # ignore errors from any of these, just make sure not to ignore + # errors from the above "$doit $cpprog $src $dsttmp" command. + # + { test -z "$chowncmd" || $doit $chowncmd "$dsttmp"; } && + { test -z "$chgrpcmd" || $doit $chgrpcmd "$dsttmp"; } && + { test -z "$stripcmd" || $doit $stripcmd "$dsttmp"; } && + { test -z "$chmodcmd" || $doit $chmodcmd $mode "$dsttmp"; } && + + # If -C, don't bother to copy if it wouldn't change the file. + if $copy_on_change && + old=`LC_ALL=C ls -dlL "$dst" 2>/dev/null` && + new=`LC_ALL=C ls -dlL "$dsttmp" 2>/dev/null` && + set -f && + set X $old && old=:$2:$4:$5:$6 && + set X $new && new=:$2:$4:$5:$6 && + set +f && + test "$old" = "$new" && + $cmpprog "$dst" "$dsttmp" >/dev/null 2>&1 + then + rm -f "$dsttmp" + else + # Rename the file to the real destination. + $doit $mvcmd -f "$dsttmp" "$dst" 2>/dev/null || + + # The rename failed, perhaps because mv can't rename something else + # to itself, or perhaps because mv is so ancient that it does not + # support -f. + { + # Now remove or move aside any old file at destination location. + # We try this two ways since rm can't unlink itself on some + # systems and the destination file might be busy for other + # reasons. In this case, the final cleanup might fail but the new + # file should still install successfully. + { + test ! -f "$dst" || + $doit $rmcmd -f "$dst" 2>/dev/null || + { $doit $mvcmd -f "$dst" "$rmtmp" 2>/dev/null && + { $doit $rmcmd -f "$rmtmp" 2>/dev/null; :; } + } || + { echo "$0: cannot unlink or rename $dst" >&2 + (exit 1); exit 1 + } + } && + + # Now rename the file to the real destination. + $doit $mvcmd "$dsttmp" "$dst" + } + fi || exit 1 + + trap '' 0 + fi +done + +# Local variables: +# eval: (add-hook 'before-save-hook 'time-stamp) +# time-stamp-start: "scriptversion=" +# time-stamp-format: "%:y-%02m-%02d.%02H" +# time-stamp-time-zone: "UTC0" +# time-stamp-end: "; # UTC" +# End: diff --git a/intltool-extract.in b/intltool-extract.in new file mode 100644 index 0000000..e69de29 diff --git a/intltool-merge.in b/intltool-merge.in new file mode 100644 index 0000000..e69de29 diff --git a/intltool-update.in b/intltool-update.in new file mode 100644 index 0000000..e69de29 diff --git a/m4/expat.m4 b/m4/expat.m4 new file mode 100644 index 0000000..f7b5ef8 --- /dev/null +++ b/m4/expat.m4 @@ -0,0 +1,45 @@ +dnl Expat macro retrived on the Expat CVS + +dnl Check if --with-expat[=PREFIX] is specified and +dnl Expat >= 1.95.0 is installed in the system. +dnl If yes, substitute EXPAT_CFLAGS, EXPAT_LIBS with regard to +dnl the specified PREFIX and set with_expat to PREFIX, or 'yes' if PREFIX +dnl has not been specified. Also HAVE_LIBEXPAT, HAVE_EXPAT_H are defined. +dnl If --with-expat has not been specified, set with_expat to 'no'. +dnl In addition, an Automake conditional EXPAT_INSTALLED is set accordingly. +dnl This is necessary to adapt a whole lot of packages that have expat +dnl bundled as a static library. +AC_DEFUN([AM_WITH_EXPAT], +[ AC_ARG_WITH(expat, + [ --with-expat=PREFIX Use system Expat library], + , with_expat=yes) + + AM_CONDITIONAL(EXPAT_INSTALLED, test $with_expat != no) + + EXPAT_CFLAGS= + EXPAT_LIBS= + if test $with_expat != no; then + if test $with_expat != yes; then + EXPAT_CFLAGS="-I$with_expat/include" + EXPAT_LIBS="-L$with_expat/lib" + fi + AC_CHECK_LIB(expat, XML_ParserCreate, + [ EXPAT_LIBS="$EXPAT_LIBS -lexpat" + expat_found=yes ], + [ expat_found=no ], + "$EXPAT_LIBS") + if test $expat_found = no; then + AC_MSG_ERROR([Could not find the Expat library]) + fi + expat_save_CFLAGS="$CFLAGS" + CFLAGS="$CFLAGS $EXPAT_CFLAGS" + AC_CHECK_HEADERS(expat.h, , expat_found=no) + if test $expat_found = no; then + AC_MSG_ERROR([Could not find expat.h]) + fi + CFLAGS="$expat_save_CFLAGS" + fi + + AC_SUBST(EXPAT_CFLAGS) + AC_SUBST(EXPAT_LIBS) +]) diff --git a/m4/gettext.m4 b/m4/gettext.m4 new file mode 100644 index 0000000..c9ae1f7 --- /dev/null +++ b/m4/gettext.m4 @@ -0,0 +1,381 @@ +# gettext.m4 serial 60 (gettext-0.17) +dnl Copyright (C) 1995-2007 Free Software Foundation, Inc. +dnl This file is free software; the Free Software Foundation +dnl gives unlimited permission to copy and/or distribute it, +dnl with or without modifications, as long as this notice is preserved. +dnl +dnl This file can can be used in projects which are not available under +dnl the GNU General Public License or the GNU Library General Public +dnl License but which still want to provide support for the GNU gettext +dnl functionality. +dnl Please note that the actual code of the GNU gettext library is covered +dnl by the GNU Library General Public License, and the rest of the GNU +dnl gettext package package is covered by the GNU General Public License. +dnl They are *not* in the public domain. + +dnl Authors: +dnl Ulrich Drepper , 1995-2000. +dnl Bruno Haible , 2000-2006. + +dnl Macro to add for using GNU gettext. + +dnl Usage: AM_GNU_GETTEXT([INTLSYMBOL], [NEEDSYMBOL], [INTLDIR]). +dnl INTLSYMBOL can be one of 'external', 'no-libtool', 'use-libtool'. The +dnl default (if it is not specified or empty) is 'no-libtool'. +dnl INTLSYMBOL should be 'external' for packages with no intl directory, +dnl and 'no-libtool' or 'use-libtool' for packages with an intl directory. +dnl If INTLSYMBOL is 'use-libtool', then a libtool library +dnl $(top_builddir)/intl/libintl.la will be created (shared and/or static, +dnl depending on --{enable,disable}-{shared,static} and on the presence of +dnl AM-DISABLE-SHARED). If INTLSYMBOL is 'no-libtool', a static library +dnl $(top_builddir)/intl/libintl.a will be created. +dnl If NEEDSYMBOL is specified and is 'need-ngettext', then GNU gettext +dnl implementations (in libc or libintl) without the ngettext() function +dnl will be ignored. If NEEDSYMBOL is specified and is +dnl 'need-formatstring-macros', then GNU gettext implementations that don't +dnl support the ISO C 99 formatstring macros will be ignored. +dnl INTLDIR is used to find the intl libraries. If empty, +dnl the value `$(top_builddir)/intl/' is used. +dnl +dnl The result of the configuration is one of three cases: +dnl 1) GNU gettext, as included in the intl subdirectory, will be compiled +dnl and used. +dnl Catalog format: GNU --> install in $(datadir) +dnl Catalog extension: .mo after installation, .gmo in source tree +dnl 2) GNU gettext has been found in the system's C library. +dnl Catalog format: GNU --> install in $(datadir) +dnl Catalog extension: .mo after installation, .gmo in source tree +dnl 3) No internationalization, always use English msgid. +dnl Catalog format: none +dnl Catalog extension: none +dnl If INTLSYMBOL is 'external', only cases 2 and 3 can occur. +dnl The use of .gmo is historical (it was needed to avoid overwriting the +dnl GNU format catalogs when building on a platform with an X/Open gettext), +dnl but we keep it in order not to force irrelevant filename changes on the +dnl maintainers. +dnl +AC_DEFUN([AM_GNU_GETTEXT], +[ + dnl Argument checking. + ifelse([$1], [], , [ifelse([$1], [external], , [ifelse([$1], [no-libtool], , [ifelse([$1], [use-libtool], , + [errprint([ERROR: invalid first argument to AM_GNU_GETTEXT +])])])])]) + ifelse([$2], [], , [ifelse([$2], [need-ngettext], , [ifelse([$2], [need-formatstring-macros], , + [errprint([ERROR: invalid second argument to AM_GNU_GETTEXT +])])])]) + define([gt_included_intl], + ifelse([$1], [external], + ifdef([AM_GNU_GETTEXT_][INTL_SUBDIR], [yes], [no]), + [yes])) + define([gt_libtool_suffix_prefix], ifelse([$1], [use-libtool], [l], [])) + gt_NEEDS_INIT + AM_GNU_GETTEXT_NEED([$2]) + + AC_REQUIRE([AM_PO_SUBDIRS])dnl + ifelse(gt_included_intl, yes, [ + AC_REQUIRE([AM_INTL_SUBDIR])dnl + ]) + + dnl Prerequisites of AC_LIB_LINKFLAGS_BODY. + AC_REQUIRE([AC_LIB_PREPARE_PREFIX]) + AC_REQUIRE([AC_LIB_RPATH]) + + dnl Sometimes libintl requires libiconv, so first search for libiconv. + dnl Ideally we would do this search only after the + dnl if test "$USE_NLS" = "yes"; then + dnl if { eval "gt_val=\$$gt_func_gnugettext_libc"; test "$gt_val" != "yes"; }; then + dnl tests. But if configure.in invokes AM_ICONV after AM_GNU_GETTEXT + dnl the configure script would need to contain the same shell code + dnl again, outside any 'if'. There are two solutions: + dnl - Invoke AM_ICONV_LINKFLAGS_BODY here, outside any 'if'. + dnl - Control the expansions in more detail using AC_PROVIDE_IFELSE. + dnl Since AC_PROVIDE_IFELSE is only in autoconf >= 2.52 and not + dnl documented, we avoid it. + ifelse(gt_included_intl, yes, , [ + AC_REQUIRE([AM_ICONV_LINKFLAGS_BODY]) + ]) + + dnl Sometimes, on MacOS X, libintl requires linking with CoreFoundation. + gt_INTL_MACOSX + + dnl Set USE_NLS. + AC_REQUIRE([AM_NLS]) + + ifelse(gt_included_intl, yes, [ + BUILD_INCLUDED_LIBINTL=no + USE_INCLUDED_LIBINTL=no + ]) + LIBINTL= + LTLIBINTL= + POSUB= + + dnl Add a version number to the cache macros. + case " $gt_needs " in + *" need-formatstring-macros "*) gt_api_version=3 ;; + *" need-ngettext "*) gt_api_version=2 ;; + *) gt_api_version=1 ;; + esac + gt_func_gnugettext_libc="gt_cv_func_gnugettext${gt_api_version}_libc" + gt_func_gnugettext_libintl="gt_cv_func_gnugettext${gt_api_version}_libintl" + + dnl If we use NLS figure out what method + if test "$USE_NLS" = "yes"; then + gt_use_preinstalled_gnugettext=no + ifelse(gt_included_intl, yes, [ + AC_MSG_CHECKING([whether included gettext is requested]) + AC_ARG_WITH(included-gettext, + [ --with-included-gettext use the GNU gettext library included here], + nls_cv_force_use_gnu_gettext=$withval, + nls_cv_force_use_gnu_gettext=no) + AC_MSG_RESULT($nls_cv_force_use_gnu_gettext) + + nls_cv_use_gnu_gettext="$nls_cv_force_use_gnu_gettext" + if test "$nls_cv_force_use_gnu_gettext" != "yes"; then + ]) + dnl User does not insist on using GNU NLS library. Figure out what + dnl to use. If GNU gettext is available we use this. Else we have + dnl to fall back to GNU NLS library. + + if test $gt_api_version -ge 3; then + gt_revision_test_code=' +#ifndef __GNU_GETTEXT_SUPPORTED_REVISION +#define __GNU_GETTEXT_SUPPORTED_REVISION(major) ((major) == 0 ? 0 : -1) +#endif +changequote(,)dnl +typedef int array [2 * (__GNU_GETTEXT_SUPPORTED_REVISION(0) >= 1) - 1]; +changequote([,])dnl +' + else + gt_revision_test_code= + fi + if test $gt_api_version -ge 2; then + gt_expression_test_code=' + * ngettext ("", "", 0)' + else + gt_expression_test_code= + fi + + AC_CACHE_CHECK([for GNU gettext in libc], [$gt_func_gnugettext_libc], + [AC_TRY_LINK([#include +$gt_revision_test_code +extern int _nl_msg_cat_cntr; +extern int *_nl_domain_bindings;], + [bindtextdomain ("", ""); +return * gettext ("")$gt_expression_test_code + _nl_msg_cat_cntr + *_nl_domain_bindings], + [eval "$gt_func_gnugettext_libc=yes"], + [eval "$gt_func_gnugettext_libc=no"])]) + + if { eval "gt_val=\$$gt_func_gnugettext_libc"; test "$gt_val" != "yes"; }; then + dnl Sometimes libintl requires libiconv, so first search for libiconv. + ifelse(gt_included_intl, yes, , [ + AM_ICONV_LINK + ]) + dnl Search for libintl and define LIBINTL, LTLIBINTL and INCINTL + dnl accordingly. Don't use AC_LIB_LINKFLAGS_BODY([intl],[iconv]) + dnl because that would add "-liconv" to LIBINTL and LTLIBINTL + dnl even if libiconv doesn't exist. + AC_LIB_LINKFLAGS_BODY([intl]) + AC_CACHE_CHECK([for GNU gettext in libintl], + [$gt_func_gnugettext_libintl], + [gt_save_CPPFLAGS="$CPPFLAGS" + CPPFLAGS="$CPPFLAGS $INCINTL" + gt_save_LIBS="$LIBS" + LIBS="$LIBS $LIBINTL" + dnl Now see whether libintl exists and does not depend on libiconv. + AC_TRY_LINK([#include +$gt_revision_test_code +extern int _nl_msg_cat_cntr; +extern +#ifdef __cplusplus +"C" +#endif +const char *_nl_expand_alias (const char *);], + [bindtextdomain ("", ""); +return * gettext ("")$gt_expression_test_code + _nl_msg_cat_cntr + *_nl_expand_alias ("")], + [eval "$gt_func_gnugettext_libintl=yes"], + [eval "$gt_func_gnugettext_libintl=no"]) + dnl Now see whether libintl exists and depends on libiconv. + if { eval "gt_val=\$$gt_func_gnugettext_libintl"; test "$gt_val" != yes; } && test -n "$LIBICONV"; then + LIBS="$LIBS $LIBICONV" + AC_TRY_LINK([#include +$gt_revision_test_code +extern int _nl_msg_cat_cntr; +extern +#ifdef __cplusplus +"C" +#endif +const char *_nl_expand_alias (const char *);], + [bindtextdomain ("", ""); +return * gettext ("")$gt_expression_test_code + _nl_msg_cat_cntr + *_nl_expand_alias ("")], + [LIBINTL="$LIBINTL $LIBICONV" + LTLIBINTL="$LTLIBINTL $LTLIBICONV" + eval "$gt_func_gnugettext_libintl=yes" + ]) + fi + CPPFLAGS="$gt_save_CPPFLAGS" + LIBS="$gt_save_LIBS"]) + fi + + dnl If an already present or preinstalled GNU gettext() is found, + dnl use it. But if this macro is used in GNU gettext, and GNU + dnl gettext is already preinstalled in libintl, we update this + dnl libintl. (Cf. the install rule in intl/Makefile.in.) + if { eval "gt_val=\$$gt_func_gnugettext_libc"; test "$gt_val" = "yes"; } \ + || { { eval "gt_val=\$$gt_func_gnugettext_libintl"; test "$gt_val" = "yes"; } \ + && test "$PACKAGE" != gettext-runtime \ + && test "$PACKAGE" != gettext-tools; }; then + gt_use_preinstalled_gnugettext=yes + else + dnl Reset the values set by searching for libintl. + LIBINTL= + LTLIBINTL= + INCINTL= + fi + + ifelse(gt_included_intl, yes, [ + if test "$gt_use_preinstalled_gnugettext" != "yes"; then + dnl GNU gettext is not found in the C library. + dnl Fall back on included GNU gettext library. + nls_cv_use_gnu_gettext=yes + fi + fi + + if test "$nls_cv_use_gnu_gettext" = "yes"; then + dnl Mark actions used to generate GNU NLS library. + BUILD_INCLUDED_LIBINTL=yes + USE_INCLUDED_LIBINTL=yes + LIBINTL="ifelse([$3],[],\${top_builddir}/intl,[$3])/libintl.[]gt_libtool_suffix_prefix[]a $LIBICONV $LIBTHREAD" + LTLIBINTL="ifelse([$3],[],\${top_builddir}/intl,[$3])/libintl.[]gt_libtool_suffix_prefix[]a $LTLIBICONV $LTLIBTHREAD" + LIBS=`echo " $LIBS " | sed -e 's/ -lintl / /' -e 's/^ //' -e 's/ $//'` + fi + + CATOBJEXT= + if test "$gt_use_preinstalled_gnugettext" = "yes" \ + || test "$nls_cv_use_gnu_gettext" = "yes"; then + dnl Mark actions to use GNU gettext tools. + CATOBJEXT=.gmo + fi + ]) + + if test -n "$INTL_MACOSX_LIBS"; then + if test "$gt_use_preinstalled_gnugettext" = "yes" \ + || test "$nls_cv_use_gnu_gettext" = "yes"; then + dnl Some extra flags are needed during linking. + LIBINTL="$LIBINTL $INTL_MACOSX_LIBS" + LTLIBINTL="$LTLIBINTL $INTL_MACOSX_LIBS" + fi + fi + + if test "$gt_use_preinstalled_gnugettext" = "yes" \ + || test "$nls_cv_use_gnu_gettext" = "yes"; then + AC_DEFINE(ENABLE_NLS, 1, + [Define to 1 if translation of program messages to the user's native language + is requested.]) + else + USE_NLS=no + fi + fi + + AC_MSG_CHECKING([whether to use NLS]) + AC_MSG_RESULT([$USE_NLS]) + if test "$USE_NLS" = "yes"; then + AC_MSG_CHECKING([where the gettext function comes from]) + if test "$gt_use_preinstalled_gnugettext" = "yes"; then + if { eval "gt_val=\$$gt_func_gnugettext_libintl"; test "$gt_val" = "yes"; }; then + gt_source="external libintl" + else + gt_source="libc" + fi + else + gt_source="included intl directory" + fi + AC_MSG_RESULT([$gt_source]) + fi + + if test "$USE_NLS" = "yes"; then + + if test "$gt_use_preinstalled_gnugettext" = "yes"; then + if { eval "gt_val=\$$gt_func_gnugettext_libintl"; test "$gt_val" = "yes"; }; then + AC_MSG_CHECKING([how to link with libintl]) + AC_MSG_RESULT([$LIBINTL]) + AC_LIB_APPENDTOVAR([CPPFLAGS], [$INCINTL]) + fi + + dnl For backward compatibility. Some packages may be using this. + AC_DEFINE(HAVE_GETTEXT, 1, + [Define if the GNU gettext() function is already present or preinstalled.]) + AC_DEFINE(HAVE_DCGETTEXT, 1, + [Define if the GNU dcgettext() function is already present or preinstalled.]) + fi + + dnl We need to process the po/ directory. + POSUB=po + fi + + ifelse(gt_included_intl, yes, [ + dnl If this is used in GNU gettext we have to set BUILD_INCLUDED_LIBINTL + dnl to 'yes' because some of the testsuite requires it. + if test "$PACKAGE" = gettext-runtime || test "$PACKAGE" = gettext-tools; then + BUILD_INCLUDED_LIBINTL=yes + fi + + dnl Make all variables we use known to autoconf. + AC_SUBST(BUILD_INCLUDED_LIBINTL) + AC_SUBST(USE_INCLUDED_LIBINTL) + AC_SUBST(CATOBJEXT) + + dnl For backward compatibility. Some configure.ins may be using this. + nls_cv_header_intl= + nls_cv_header_libgt= + + dnl For backward compatibility. Some Makefiles may be using this. + DATADIRNAME=share + AC_SUBST(DATADIRNAME) + + dnl For backward compatibility. Some Makefiles may be using this. + INSTOBJEXT=.mo + AC_SUBST(INSTOBJEXT) + + dnl For backward compatibility. Some Makefiles may be using this. + GENCAT=gencat + AC_SUBST(GENCAT) + + dnl For backward compatibility. Some Makefiles may be using this. + INTLOBJS= + if test "$USE_INCLUDED_LIBINTL" = yes; then + INTLOBJS="\$(GETTOBJS)" + fi + AC_SUBST(INTLOBJS) + + dnl Enable libtool support if the surrounding package wishes it. + INTL_LIBTOOL_SUFFIX_PREFIX=gt_libtool_suffix_prefix + AC_SUBST(INTL_LIBTOOL_SUFFIX_PREFIX) + ]) + + dnl For backward compatibility. Some Makefiles may be using this. + INTLLIBS="$LIBINTL" + AC_SUBST(INTLLIBS) + + dnl Make all documented variables known to autoconf. + AC_SUBST(LIBINTL) + AC_SUBST(LTLIBINTL) + AC_SUBST(POSUB) +]) + + +dnl gt_NEEDS_INIT ensures that the gt_needs variable is initialized. +m4_define([gt_NEEDS_INIT], +[ + m4_divert_text([DEFAULTS], [gt_needs=]) + m4_define([gt_NEEDS_INIT], []) +]) + + +dnl Usage: AM_GNU_GETTEXT_NEED([NEEDSYMBOL]) +AC_DEFUN([AM_GNU_GETTEXT_NEED], +[ + m4_divert_text([INIT_PREPARE], [gt_needs="$gt_needs $1"]) +]) + + +dnl Usage: AM_GNU_GETTEXT_VERSION([gettext-version]) +AC_DEFUN([AM_GNU_GETTEXT_VERSION], []) diff --git a/m4/iconv.m4 b/m4/iconv.m4 new file mode 100644 index 0000000..66bc76f --- /dev/null +++ b/m4/iconv.m4 @@ -0,0 +1,180 @@ +# iconv.m4 serial AM6 (gettext-0.17) +dnl Copyright (C) 2000-2002, 2007 Free Software Foundation, Inc. +dnl This file is free software; the Free Software Foundation +dnl gives unlimited permission to copy and/or distribute it, +dnl with or without modifications, as long as this notice is preserved. + +dnl From Bruno Haible. + +AC_DEFUN([AM_ICONV_LINKFLAGS_BODY], +[ + dnl Prerequisites of AC_LIB_LINKFLAGS_BODY. + AC_REQUIRE([AC_LIB_PREPARE_PREFIX]) + AC_REQUIRE([AC_LIB_RPATH]) + + dnl Search for libiconv and define LIBICONV, LTLIBICONV and INCICONV + dnl accordingly. + AC_LIB_LINKFLAGS_BODY([iconv]) +]) + +AC_DEFUN([AM_ICONV_LINK], +[ + dnl Some systems have iconv in libc, some have it in libiconv (OSF/1 and + dnl those with the standalone portable GNU libiconv installed). + AC_REQUIRE([AC_CANONICAL_HOST]) dnl for cross-compiles + + dnl Search for libiconv and define LIBICONV, LTLIBICONV and INCICONV + dnl accordingly. + AC_REQUIRE([AM_ICONV_LINKFLAGS_BODY]) + + dnl Add $INCICONV to CPPFLAGS before performing the following checks, + dnl because if the user has installed libiconv and not disabled its use + dnl via --without-libiconv-prefix, he wants to use it. The first + dnl AC_TRY_LINK will then fail, the second AC_TRY_LINK will succeed. + am_save_CPPFLAGS="$CPPFLAGS" + AC_LIB_APPENDTOVAR([CPPFLAGS], [$INCICONV]) + + AC_CACHE_CHECK([for iconv], am_cv_func_iconv, [ + am_cv_func_iconv="no, consider installing GNU libiconv" + am_cv_lib_iconv=no + AC_TRY_LINK([#include +#include ], + [iconv_t cd = iconv_open("",""); + iconv(cd,NULL,NULL,NULL,NULL); + iconv_close(cd);], + am_cv_func_iconv=yes) + if test "$am_cv_func_iconv" != yes; then + am_save_LIBS="$LIBS" + LIBS="$LIBS $LIBICONV" + AC_TRY_LINK([#include +#include ], + [iconv_t cd = iconv_open("",""); + iconv(cd,NULL,NULL,NULL,NULL); + iconv_close(cd);], + am_cv_lib_iconv=yes + am_cv_func_iconv=yes) + LIBS="$am_save_LIBS" + fi + ]) + if test "$am_cv_func_iconv" = yes; then + AC_CACHE_CHECK([for working iconv], am_cv_func_iconv_works, [ + dnl This tests against bugs in AIX 5.1 and HP-UX 11.11. + am_save_LIBS="$LIBS" + if test $am_cv_lib_iconv = yes; then + LIBS="$LIBS $LIBICONV" + fi + AC_TRY_RUN([ +#include +#include +int main () +{ + /* Test against AIX 5.1 bug: Failures are not distinguishable from successful + returns. */ + { + iconv_t cd_utf8_to_88591 = iconv_open ("ISO8859-1", "UTF-8"); + if (cd_utf8_to_88591 != (iconv_t)(-1)) + { + static const char input[] = "\342\202\254"; /* EURO SIGN */ + char buf[10]; + const char *inptr = input; + size_t inbytesleft = strlen (input); + char *outptr = buf; + size_t outbytesleft = sizeof (buf); + size_t res = iconv (cd_utf8_to_88591, + (char **) &inptr, &inbytesleft, + &outptr, &outbytesleft); + if (res == 0) + return 1; + } + } +#if 0 /* This bug could be worked around by the caller. */ + /* Test against HP-UX 11.11 bug: Positive return value instead of 0. */ + { + iconv_t cd_88591_to_utf8 = iconv_open ("utf8", "iso88591"); + if (cd_88591_to_utf8 != (iconv_t)(-1)) + { + static const char input[] = "\304rger mit b\366sen B\374bchen ohne Augenma\337"; + char buf[50]; + const char *inptr = input; + size_t inbytesleft = strlen (input); + char *outptr = buf; + size_t outbytesleft = sizeof (buf); + size_t res = iconv (cd_88591_to_utf8, + (char **) &inptr, &inbytesleft, + &outptr, &outbytesleft); + if ((int)res > 0) + return 1; + } + } +#endif + /* Test against HP-UX 11.11 bug: No converter from EUC-JP to UTF-8 is + provided. */ + if (/* Try standardized names. */ + iconv_open ("UTF-8", "EUC-JP") == (iconv_t)(-1) + /* Try IRIX, OSF/1 names. */ + && iconv_open ("UTF-8", "eucJP") == (iconv_t)(-1) + /* Try AIX names. */ + && iconv_open ("UTF-8", "IBM-eucJP") == (iconv_t)(-1) + /* Try HP-UX names. */ + && iconv_open ("utf8", "eucJP") == (iconv_t)(-1)) + return 1; + return 0; +}], [am_cv_func_iconv_works=yes], [am_cv_func_iconv_works=no], + [case "$host_os" in + aix* | hpux*) am_cv_func_iconv_works="guessing no" ;; + *) am_cv_func_iconv_works="guessing yes" ;; + esac]) + LIBS="$am_save_LIBS" + ]) + case "$am_cv_func_iconv_works" in + *no) am_func_iconv=no am_cv_lib_iconv=no ;; + *) am_func_iconv=yes ;; + esac + else + am_func_iconv=no am_cv_lib_iconv=no + fi + if test "$am_func_iconv" = yes; then + AC_DEFINE(HAVE_ICONV, 1, + [Define if you have the iconv() function and it works.]) + fi + if test "$am_cv_lib_iconv" = yes; then + AC_MSG_CHECKING([how to link with libiconv]) + AC_MSG_RESULT([$LIBICONV]) + else + dnl If $LIBICONV didn't lead to a usable library, we don't need $INCICONV + dnl either. + CPPFLAGS="$am_save_CPPFLAGS" + LIBICONV= + LTLIBICONV= + fi + AC_SUBST(LIBICONV) + AC_SUBST(LTLIBICONV) +]) + +AC_DEFUN([AM_ICONV], +[ + AM_ICONV_LINK + if test "$am_cv_func_iconv" = yes; then + AC_MSG_CHECKING([for iconv declaration]) + AC_CACHE_VAL(am_cv_proto_iconv, [ + AC_TRY_COMPILE([ +#include +#include +extern +#ifdef __cplusplus +"C" +#endif +#if defined(__STDC__) || defined(__cplusplus) +size_t iconv (iconv_t cd, char * *inbuf, size_t *inbytesleft, char * *outbuf, size_t *outbytesleft); +#else +size_t iconv(); +#endif +], [], am_cv_proto_iconv_arg1="", am_cv_proto_iconv_arg1="const") + am_cv_proto_iconv="extern size_t iconv (iconv_t cd, $am_cv_proto_iconv_arg1 char * *inbuf, size_t *inbytesleft, char * *outbuf, size_t *outbytesleft);"]) + am_cv_proto_iconv=`echo "[$]am_cv_proto_iconv" | tr -s ' ' | sed -e 's/( /(/'` + AC_MSG_RESULT([$]{ac_t:- + }[$]am_cv_proto_iconv) + AC_DEFINE_UNQUOTED(ICONV_CONST, $am_cv_proto_iconv_arg1, + [Define as const if the declaration of iconv() needs const.]) + fi +]) diff --git a/m4/intlmacosx.m4 b/m4/intlmacosx.m4 new file mode 100644 index 0000000..d3f0d90 --- /dev/null +++ b/m4/intlmacosx.m4 @@ -0,0 +1,51 @@ +# intlmacosx.m4 serial 1 (gettext-0.17) +dnl Copyright (C) 2004-2007 Free Software Foundation, Inc. +dnl This file is free software; the Free Software Foundation +dnl gives unlimited permission to copy and/or distribute it, +dnl with or without modifications, as long as this notice is preserved. +dnl +dnl This file can can be used in projects which are not available under +dnl the GNU General Public License or the GNU Library General Public +dnl License but which still want to provide support for the GNU gettext +dnl functionality. +dnl Please note that the actual code of the GNU gettext library is covered +dnl by the GNU Library General Public License, and the rest of the GNU +dnl gettext package package is covered by the GNU General Public License. +dnl They are *not* in the public domain. + +dnl Checks for special options needed on MacOS X. +dnl Defines INTL_MACOSX_LIBS. +AC_DEFUN([gt_INTL_MACOSX], +[ + dnl Check for API introduced in MacOS X 10.2. + AC_CACHE_CHECK([for CFPreferencesCopyAppValue], + gt_cv_func_CFPreferencesCopyAppValue, + [gt_save_LIBS="$LIBS" + LIBS="$LIBS -Wl,-framework -Wl,CoreFoundation" + AC_TRY_LINK([#include ], + [CFPreferencesCopyAppValue(NULL, NULL)], + [gt_cv_func_CFPreferencesCopyAppValue=yes], + [gt_cv_func_CFPreferencesCopyAppValue=no]) + LIBS="$gt_save_LIBS"]) + if test $gt_cv_func_CFPreferencesCopyAppValue = yes; then + AC_DEFINE([HAVE_CFPREFERENCESCOPYAPPVALUE], 1, + [Define to 1 if you have the MacOS X function CFPreferencesCopyAppValue in the CoreFoundation framework.]) + fi + dnl Check for API introduced in MacOS X 10.3. + AC_CACHE_CHECK([for CFLocaleCopyCurrent], gt_cv_func_CFLocaleCopyCurrent, + [gt_save_LIBS="$LIBS" + LIBS="$LIBS -Wl,-framework -Wl,CoreFoundation" + AC_TRY_LINK([#include ], [CFLocaleCopyCurrent();], + [gt_cv_func_CFLocaleCopyCurrent=yes], + [gt_cv_func_CFLocaleCopyCurrent=no]) + LIBS="$gt_save_LIBS"]) + if test $gt_cv_func_CFLocaleCopyCurrent = yes; then + AC_DEFINE([HAVE_CFLOCALECOPYCURRENT], 1, + [Define to 1 if you have the MacOS X function CFLocaleCopyCurrent in the CoreFoundation framework.]) + fi + INTL_MACOSX_LIBS= + if test $gt_cv_func_CFPreferencesCopyAppValue = yes || test $gt_cv_func_CFLocaleCopyCurrent = yes; then + INTL_MACOSX_LIBS="-Wl,-framework -Wl,CoreFoundation" + fi + AC_SUBST([INTL_MACOSX_LIBS]) +]) diff --git a/m4/lib-ld.m4 b/m4/lib-ld.m4 new file mode 100644 index 0000000..96c4e2c --- /dev/null +++ b/m4/lib-ld.m4 @@ -0,0 +1,110 @@ +# lib-ld.m4 serial 3 (gettext-0.13) +dnl Copyright (C) 1996-2003 Free Software Foundation, Inc. +dnl This file is free software; the Free Software Foundation +dnl gives unlimited permission to copy and/or distribute it, +dnl with or without modifications, as long as this notice is preserved. + +dnl Subroutines of libtool.m4, +dnl with replacements s/AC_/AC_LIB/ and s/lt_cv/acl_cv/ to avoid collision +dnl with libtool.m4. + +dnl From libtool-1.4. Sets the variable with_gnu_ld to yes or no. +AC_DEFUN([AC_LIB_PROG_LD_GNU], +[AC_CACHE_CHECK([if the linker ($LD) is GNU ld], acl_cv_prog_gnu_ld, +[# I'd rather use --version here, but apparently some GNU ld's only accept -v. +case `$LD -v 2>&1 conf$$.sh + echo "exit 0" >>conf$$.sh + chmod +x conf$$.sh + if (PATH="/nonexistent;."; conf$$.sh) >/dev/null 2>&1; then + PATH_SEPARATOR=';' + else + PATH_SEPARATOR=: + fi + rm -f conf$$.sh +fi +ac_prog=ld +if test "$GCC" = yes; then + # Check if gcc -print-prog-name=ld gives a path. + AC_MSG_CHECKING([for ld used by GCC]) + case $host in + *-*-mingw*) + # gcc leaves a trailing carriage return which upsets mingw + ac_prog=`($CC -print-prog-name=ld) 2>&5 | tr -d '\015'` ;; + *) + ac_prog=`($CC -print-prog-name=ld) 2>&5` ;; + esac + case $ac_prog in + # Accept absolute paths. + [[\\/]* | [A-Za-z]:[\\/]*)] + [re_direlt='/[^/][^/]*/\.\./'] + # Canonicalize the path of ld + ac_prog=`echo $ac_prog| sed 's%\\\\%/%g'` + while echo $ac_prog | grep "$re_direlt" > /dev/null 2>&1; do + ac_prog=`echo $ac_prog| sed "s%$re_direlt%/%"` + done + test -z "$LD" && LD="$ac_prog" + ;; + "") + # If it fails, then pretend we aren't using GCC. + ac_prog=ld + ;; + *) + # If it is relative, then search for the first ld in PATH. + with_gnu_ld=unknown + ;; + esac +elif test "$with_gnu_ld" = yes; then + AC_MSG_CHECKING([for GNU ld]) +else + AC_MSG_CHECKING([for non-GNU ld]) +fi +AC_CACHE_VAL(acl_cv_path_LD, +[if test -z "$LD"; then + IFS="${IFS= }"; ac_save_ifs="$IFS"; IFS="${IFS}${PATH_SEPARATOR-:}" + for ac_dir in $PATH; do + test -z "$ac_dir" && ac_dir=. + if test -f "$ac_dir/$ac_prog" || test -f "$ac_dir/$ac_prog$ac_exeext"; then + acl_cv_path_LD="$ac_dir/$ac_prog" + # Check to see if the program is GNU ld. I'd rather use --version, + # but apparently some GNU ld's only accept -v. + # Break only if it was the GNU/non-GNU ld that we prefer. + case `"$acl_cv_path_LD" -v 2>&1 < /dev/null` in + *GNU* | *'with BFD'*) + test "$with_gnu_ld" != no && break ;; + *) + test "$with_gnu_ld" != yes && break ;; + esac + fi + done + IFS="$ac_save_ifs" +else + acl_cv_path_LD="$LD" # Let the user override the test with a path. +fi]) +LD="$acl_cv_path_LD" +if test -n "$LD"; then + AC_MSG_RESULT($LD) +else + AC_MSG_RESULT(no) +fi +test -z "$LD" && AC_MSG_ERROR([no acceptable ld found in \$PATH]) +AC_LIB_PROG_LD_GNU +]) diff --git a/m4/lib-link.m4 b/m4/lib-link.m4 new file mode 100644 index 0000000..e3d26fc --- /dev/null +++ b/m4/lib-link.m4 @@ -0,0 +1,709 @@ +# lib-link.m4 serial 13 (gettext-0.17) +dnl Copyright (C) 2001-2007 Free Software Foundation, Inc. +dnl This file is free software; the Free Software Foundation +dnl gives unlimited permission to copy and/or distribute it, +dnl with or without modifications, as long as this notice is preserved. + +dnl From Bruno Haible. + +AC_PREREQ(2.54) + +dnl AC_LIB_LINKFLAGS(name [, dependencies]) searches for libname and +dnl the libraries corresponding to explicit and implicit dependencies. +dnl Sets and AC_SUBSTs the LIB${NAME} and LTLIB${NAME} variables and +dnl augments the CPPFLAGS variable. +dnl Sets and AC_SUBSTs the LIB${NAME}_PREFIX variable to nonempty if libname +dnl was found in ${LIB${NAME}_PREFIX}/$acl_libdirstem. +AC_DEFUN([AC_LIB_LINKFLAGS], +[ + AC_REQUIRE([AC_LIB_PREPARE_PREFIX]) + AC_REQUIRE([AC_LIB_RPATH]) + define([Name],[translit([$1],[./-], [___])]) + define([NAME],[translit([$1],[abcdefghijklmnopqrstuvwxyz./-], + [ABCDEFGHIJKLMNOPQRSTUVWXYZ___])]) + AC_CACHE_CHECK([how to link with lib[]$1], [ac_cv_lib[]Name[]_libs], [ + AC_LIB_LINKFLAGS_BODY([$1], [$2]) + ac_cv_lib[]Name[]_libs="$LIB[]NAME" + ac_cv_lib[]Name[]_ltlibs="$LTLIB[]NAME" + ac_cv_lib[]Name[]_cppflags="$INC[]NAME" + ac_cv_lib[]Name[]_prefix="$LIB[]NAME[]_PREFIX" + ]) + LIB[]NAME="$ac_cv_lib[]Name[]_libs" + LTLIB[]NAME="$ac_cv_lib[]Name[]_ltlibs" + INC[]NAME="$ac_cv_lib[]Name[]_cppflags" + LIB[]NAME[]_PREFIX="$ac_cv_lib[]Name[]_prefix" + AC_LIB_APPENDTOVAR([CPPFLAGS], [$INC]NAME) + AC_SUBST([LIB]NAME) + AC_SUBST([LTLIB]NAME) + AC_SUBST([LIB]NAME[_PREFIX]) + dnl Also set HAVE_LIB[]NAME so that AC_LIB_HAVE_LINKFLAGS can reuse the + dnl results of this search when this library appears as a dependency. + HAVE_LIB[]NAME=yes + undefine([Name]) + undefine([NAME]) +]) + +dnl AC_LIB_HAVE_LINKFLAGS(name, dependencies, includes, testcode) +dnl searches for libname and the libraries corresponding to explicit and +dnl implicit dependencies, together with the specified include files and +dnl the ability to compile and link the specified testcode. If found, it +dnl sets and AC_SUBSTs HAVE_LIB${NAME}=yes and the LIB${NAME} and +dnl LTLIB${NAME} variables and augments the CPPFLAGS variable, and +dnl #defines HAVE_LIB${NAME} to 1. Otherwise, it sets and AC_SUBSTs +dnl HAVE_LIB${NAME}=no and LIB${NAME} and LTLIB${NAME} to empty. +dnl Sets and AC_SUBSTs the LIB${NAME}_PREFIX variable to nonempty if libname +dnl was found in ${LIB${NAME}_PREFIX}/$acl_libdirstem. +AC_DEFUN([AC_LIB_HAVE_LINKFLAGS], +[ + AC_REQUIRE([AC_LIB_PREPARE_PREFIX]) + AC_REQUIRE([AC_LIB_RPATH]) + define([Name],[translit([$1],[./-], [___])]) + define([NAME],[translit([$1],[abcdefghijklmnopqrstuvwxyz./-], + [ABCDEFGHIJKLMNOPQRSTUVWXYZ___])]) + + dnl Search for lib[]Name and define LIB[]NAME, LTLIB[]NAME and INC[]NAME + dnl accordingly. + AC_LIB_LINKFLAGS_BODY([$1], [$2]) + + dnl Add $INC[]NAME to CPPFLAGS before performing the following checks, + dnl because if the user has installed lib[]Name and not disabled its use + dnl via --without-lib[]Name-prefix, he wants to use it. + ac_save_CPPFLAGS="$CPPFLAGS" + AC_LIB_APPENDTOVAR([CPPFLAGS], [$INC]NAME) + + AC_CACHE_CHECK([for lib[]$1], [ac_cv_lib[]Name], [ + ac_save_LIBS="$LIBS" + LIBS="$LIBS $LIB[]NAME" + AC_TRY_LINK([$3], [$4], [ac_cv_lib[]Name=yes], [ac_cv_lib[]Name=no]) + LIBS="$ac_save_LIBS" + ]) + if test "$ac_cv_lib[]Name" = yes; then + HAVE_LIB[]NAME=yes + AC_DEFINE([HAVE_LIB]NAME, 1, [Define if you have the $1 library.]) + AC_MSG_CHECKING([how to link with lib[]$1]) + AC_MSG_RESULT([$LIB[]NAME]) + else + HAVE_LIB[]NAME=no + dnl If $LIB[]NAME didn't lead to a usable library, we don't need + dnl $INC[]NAME either. + CPPFLAGS="$ac_save_CPPFLAGS" + LIB[]NAME= + LTLIB[]NAME= + LIB[]NAME[]_PREFIX= + fi + AC_SUBST([HAVE_LIB]NAME) + AC_SUBST([LIB]NAME) + AC_SUBST([LTLIB]NAME) + AC_SUBST([LIB]NAME[_PREFIX]) + undefine([Name]) + undefine([NAME]) +]) + +dnl Determine the platform dependent parameters needed to use rpath: +dnl acl_libext, +dnl acl_shlibext, +dnl acl_hardcode_libdir_flag_spec, +dnl acl_hardcode_libdir_separator, +dnl acl_hardcode_direct, +dnl acl_hardcode_minus_L. +AC_DEFUN([AC_LIB_RPATH], +[ + dnl Tell automake >= 1.10 to complain if config.rpath is missing. + m4_ifdef([AC_REQUIRE_AUX_FILE], [AC_REQUIRE_AUX_FILE([config.rpath])]) + AC_REQUIRE([AC_PROG_CC]) dnl we use $CC, $GCC, $LDFLAGS + AC_REQUIRE([AC_LIB_PROG_LD]) dnl we use $LD, $with_gnu_ld + AC_REQUIRE([AC_CANONICAL_HOST]) dnl we use $host + AC_REQUIRE([AC_CONFIG_AUX_DIR_DEFAULT]) dnl we use $ac_aux_dir + AC_CACHE_CHECK([for shared library run path origin], acl_cv_rpath, [ + CC="$CC" GCC="$GCC" LDFLAGS="$LDFLAGS" LD="$LD" with_gnu_ld="$with_gnu_ld" \ + ${CONFIG_SHELL-/bin/sh} "$ac_aux_dir/config.rpath" "$host" > conftest.sh + . ./conftest.sh + rm -f ./conftest.sh + acl_cv_rpath=done + ]) + wl="$acl_cv_wl" + acl_libext="$acl_cv_libext" + acl_shlibext="$acl_cv_shlibext" + acl_libname_spec="$acl_cv_libname_spec" + acl_library_names_spec="$acl_cv_library_names_spec" + acl_hardcode_libdir_flag_spec="$acl_cv_hardcode_libdir_flag_spec" + acl_hardcode_libdir_separator="$acl_cv_hardcode_libdir_separator" + acl_hardcode_direct="$acl_cv_hardcode_direct" + acl_hardcode_minus_L="$acl_cv_hardcode_minus_L" + dnl Determine whether the user wants rpath handling at all. + AC_ARG_ENABLE(rpath, + [ --disable-rpath do not hardcode runtime library paths], + :, enable_rpath=yes) +]) + +dnl AC_LIB_LINKFLAGS_BODY(name [, dependencies]) searches for libname and +dnl the libraries corresponding to explicit and implicit dependencies. +dnl Sets the LIB${NAME}, LTLIB${NAME} and INC${NAME} variables. +dnl Also, sets the LIB${NAME}_PREFIX variable to nonempty if libname was found +dnl in ${LIB${NAME}_PREFIX}/$acl_libdirstem. +AC_DEFUN([AC_LIB_LINKFLAGS_BODY], +[ + AC_REQUIRE([AC_LIB_PREPARE_MULTILIB]) + define([NAME],[translit([$1],[abcdefghijklmnopqrstuvwxyz./-], + [ABCDEFGHIJKLMNOPQRSTUVWXYZ___])]) + dnl Autoconf >= 2.61 supports dots in --with options. + define([N_A_M_E],[m4_if(m4_version_compare(m4_defn([m4_PACKAGE_VERSION]),[2.61]),[-1],[translit([$1],[.],[_])],[$1])]) + dnl By default, look in $includedir and $libdir. + use_additional=yes + AC_LIB_WITH_FINAL_PREFIX([ + eval additional_includedir=\"$includedir\" + eval additional_libdir=\"$libdir\" + ]) + AC_LIB_ARG_WITH([lib]N_A_M_E[-prefix], +[ --with-lib]N_A_M_E[-prefix[=DIR] search for lib$1 in DIR/include and DIR/lib + --without-lib]N_A_M_E[-prefix don't search for lib$1 in includedir and libdir], +[ + if test "X$withval" = "Xno"; then + use_additional=no + else + if test "X$withval" = "X"; then + AC_LIB_WITH_FINAL_PREFIX([ + eval additional_includedir=\"$includedir\" + eval additional_libdir=\"$libdir\" + ]) + else + additional_includedir="$withval/include" + additional_libdir="$withval/$acl_libdirstem" + fi + fi +]) + dnl Search the library and its dependencies in $additional_libdir and + dnl $LDFLAGS. Using breadth-first-seach. + LIB[]NAME= + LTLIB[]NAME= + INC[]NAME= + LIB[]NAME[]_PREFIX= + rpathdirs= + ltrpathdirs= + names_already_handled= + names_next_round='$1 $2' + while test -n "$names_next_round"; do + names_this_round="$names_next_round" + names_next_round= + for name in $names_this_round; do + already_handled= + for n in $names_already_handled; do + if test "$n" = "$name"; then + already_handled=yes + break + fi + done + if test -z "$already_handled"; then + names_already_handled="$names_already_handled $name" + dnl See if it was already located by an earlier AC_LIB_LINKFLAGS + dnl or AC_LIB_HAVE_LINKFLAGS call. + uppername=`echo "$name" | sed -e 'y|abcdefghijklmnopqrstuvwxyz./-|ABCDEFGHIJKLMNOPQRSTUVWXYZ___|'` + eval value=\"\$HAVE_LIB$uppername\" + if test -n "$value"; then + if test "$value" = yes; then + eval value=\"\$LIB$uppername\" + test -z "$value" || LIB[]NAME="${LIB[]NAME}${LIB[]NAME:+ }$value" + eval value=\"\$LTLIB$uppername\" + test -z "$value" || LTLIB[]NAME="${LTLIB[]NAME}${LTLIB[]NAME:+ }$value" + else + dnl An earlier call to AC_LIB_HAVE_LINKFLAGS has determined + dnl that this library doesn't exist. So just drop it. + : + fi + else + dnl Search the library lib$name in $additional_libdir and $LDFLAGS + dnl and the already constructed $LIBNAME/$LTLIBNAME. + found_dir= + found_la= + found_so= + found_a= + eval libname=\"$acl_libname_spec\" # typically: libname=lib$name + if test -n "$acl_shlibext"; then + shrext=".$acl_shlibext" # typically: shrext=.so + else + shrext= + fi + if test $use_additional = yes; then + dir="$additional_libdir" + dnl The same code as in the loop below: + dnl First look for a shared library. + if test -n "$acl_shlibext"; then + if test -f "$dir/$libname$shrext"; then + found_dir="$dir" + found_so="$dir/$libname$shrext" + else + if test "$acl_library_names_spec" = '$libname$shrext$versuffix'; then + ver=`(cd "$dir" && \ + for f in "$libname$shrext".*; do echo "$f"; done \ + | sed -e "s,^$libname$shrext\\\\.,," \ + | sort -t '.' -n -r -k1,1 -k2,2 -k3,3 -k4,4 -k5,5 \ + | sed 1q ) 2>/dev/null` + if test -n "$ver" && test -f "$dir/$libname$shrext.$ver"; then + found_dir="$dir" + found_so="$dir/$libname$shrext.$ver" + fi + else + eval library_names=\"$acl_library_names_spec\" + for f in $library_names; do + if test -f "$dir/$f"; then + found_dir="$dir" + found_so="$dir/$f" + break + fi + done + fi + fi + fi + dnl Then look for a static library. + if test "X$found_dir" = "X"; then + if test -f "$dir/$libname.$acl_libext"; then + found_dir="$dir" + found_a="$dir/$libname.$acl_libext" + fi + fi + if test "X$found_dir" != "X"; then + if test -f "$dir/$libname.la"; then + found_la="$dir/$libname.la" + fi + fi + fi + if test "X$found_dir" = "X"; then + for x in $LDFLAGS $LTLIB[]NAME; do + AC_LIB_WITH_FINAL_PREFIX([eval x=\"$x\"]) + case "$x" in + -L*) + dir=`echo "X$x" | sed -e 's/^X-L//'` + dnl First look for a shared library. + if test -n "$acl_shlibext"; then + if test -f "$dir/$libname$shrext"; then + found_dir="$dir" + found_so="$dir/$libname$shrext" + else + if test "$acl_library_names_spec" = '$libname$shrext$versuffix'; then + ver=`(cd "$dir" && \ + for f in "$libname$shrext".*; do echo "$f"; done \ + | sed -e "s,^$libname$shrext\\\\.,," \ + | sort -t '.' -n -r -k1,1 -k2,2 -k3,3 -k4,4 -k5,5 \ + | sed 1q ) 2>/dev/null` + if test -n "$ver" && test -f "$dir/$libname$shrext.$ver"; then + found_dir="$dir" + found_so="$dir/$libname$shrext.$ver" + fi + else + eval library_names=\"$acl_library_names_spec\" + for f in $library_names; do + if test -f "$dir/$f"; then + found_dir="$dir" + found_so="$dir/$f" + break + fi + done + fi + fi + fi + dnl Then look for a static library. + if test "X$found_dir" = "X"; then + if test -f "$dir/$libname.$acl_libext"; then + found_dir="$dir" + found_a="$dir/$libname.$acl_libext" + fi + fi + if test "X$found_dir" != "X"; then + if test -f "$dir/$libname.la"; then + found_la="$dir/$libname.la" + fi + fi + ;; + esac + if test "X$found_dir" != "X"; then + break + fi + done + fi + if test "X$found_dir" != "X"; then + dnl Found the library. + LTLIB[]NAME="${LTLIB[]NAME}${LTLIB[]NAME:+ }-L$found_dir -l$name" + if test "X$found_so" != "X"; then + dnl Linking with a shared library. We attempt to hardcode its + dnl directory into the executable's runpath, unless it's the + dnl standard /usr/lib. + if test "$enable_rpath" = no || test "X$found_dir" = "X/usr/$acl_libdirstem"; then + dnl No hardcoding is needed. + LIB[]NAME="${LIB[]NAME}${LIB[]NAME:+ }$found_so" + else + dnl Use an explicit option to hardcode DIR into the resulting + dnl binary. + dnl Potentially add DIR to ltrpathdirs. + dnl The ltrpathdirs will be appended to $LTLIBNAME at the end. + haveit= + for x in $ltrpathdirs; do + if test "X$x" = "X$found_dir"; then + haveit=yes + break + fi + done + if test -z "$haveit"; then + ltrpathdirs="$ltrpathdirs $found_dir" + fi + dnl The hardcoding into $LIBNAME is system dependent. + if test "$acl_hardcode_direct" = yes; then + dnl Using DIR/libNAME.so during linking hardcodes DIR into the + dnl resulting binary. + LIB[]NAME="${LIB[]NAME}${LIB[]NAME:+ }$found_so" + else + if test -n "$acl_hardcode_libdir_flag_spec" && test "$acl_hardcode_minus_L" = no; then + dnl Use an explicit option to hardcode DIR into the resulting + dnl binary. + LIB[]NAME="${LIB[]NAME}${LIB[]NAME:+ }$found_so" + dnl Potentially add DIR to rpathdirs. + dnl The rpathdirs will be appended to $LIBNAME at the end. + haveit= + for x in $rpathdirs; do + if test "X$x" = "X$found_dir"; then + haveit=yes + break + fi + done + if test -z "$haveit"; then + rpathdirs="$rpathdirs $found_dir" + fi + else + dnl Rely on "-L$found_dir". + dnl But don't add it if it's already contained in the LDFLAGS + dnl or the already constructed $LIBNAME + haveit= + for x in $LDFLAGS $LIB[]NAME; do + AC_LIB_WITH_FINAL_PREFIX([eval x=\"$x\"]) + if test "X$x" = "X-L$found_dir"; then + haveit=yes + break + fi + done + if test -z "$haveit"; then + LIB[]NAME="${LIB[]NAME}${LIB[]NAME:+ }-L$found_dir" + fi + if test "$acl_hardcode_minus_L" != no; then + dnl FIXME: Not sure whether we should use + dnl "-L$found_dir -l$name" or "-L$found_dir $found_so" + dnl here. + LIB[]NAME="${LIB[]NAME}${LIB[]NAME:+ }$found_so" + else + dnl We cannot use $acl_hardcode_runpath_var and LD_RUN_PATH + dnl here, because this doesn't fit in flags passed to the + dnl compiler. So give up. No hardcoding. This affects only + dnl very old systems. + dnl FIXME: Not sure whether we should use + dnl "-L$found_dir -l$name" or "-L$found_dir $found_so" + dnl here. + LIB[]NAME="${LIB[]NAME}${LIB[]NAME:+ }-l$name" + fi + fi + fi + fi + else + if test "X$found_a" != "X"; then + dnl Linking with a static library. + LIB[]NAME="${LIB[]NAME}${LIB[]NAME:+ }$found_a" + else + dnl We shouldn't come here, but anyway it's good to have a + dnl fallback. + LIB[]NAME="${LIB[]NAME}${LIB[]NAME:+ }-L$found_dir -l$name" + fi + fi + dnl Assume the include files are nearby. + additional_includedir= + case "$found_dir" in + */$acl_libdirstem | */$acl_libdirstem/) + basedir=`echo "X$found_dir" | sed -e 's,^X,,' -e "s,/$acl_libdirstem/"'*$,,'` + LIB[]NAME[]_PREFIX="$basedir" + additional_includedir="$basedir/include" + ;; + esac + if test "X$additional_includedir" != "X"; then + dnl Potentially add $additional_includedir to $INCNAME. + dnl But don't add it + dnl 1. if it's the standard /usr/include, + dnl 2. if it's /usr/local/include and we are using GCC on Linux, + dnl 3. if it's already present in $CPPFLAGS or the already + dnl constructed $INCNAME, + dnl 4. if it doesn't exist as a directory. + if test "X$additional_includedir" != "X/usr/include"; then + haveit= + if test "X$additional_includedir" = "X/usr/local/include"; then + if test -n "$GCC"; then + case $host_os in + linux* | gnu* | k*bsd*-gnu) haveit=yes;; + esac + fi + fi + if test -z "$haveit"; then + for x in $CPPFLAGS $INC[]NAME; do + AC_LIB_WITH_FINAL_PREFIX([eval x=\"$x\"]) + if test "X$x" = "X-I$additional_includedir"; then + haveit=yes + break + fi + done + if test -z "$haveit"; then + if test -d "$additional_includedir"; then + dnl Really add $additional_includedir to $INCNAME. + INC[]NAME="${INC[]NAME}${INC[]NAME:+ }-I$additional_includedir" + fi + fi + fi + fi + fi + dnl Look for dependencies. + if test -n "$found_la"; then + dnl Read the .la file. It defines the variables + dnl dlname, library_names, old_library, dependency_libs, current, + dnl age, revision, installed, dlopen, dlpreopen, libdir. + save_libdir="$libdir" + case "$found_la" in + */* | *\\*) . "$found_la" ;; + *) . "./$found_la" ;; + esac + libdir="$save_libdir" + dnl We use only dependency_libs. + for dep in $dependency_libs; do + case "$dep" in + -L*) + additional_libdir=`echo "X$dep" | sed -e 's/^X-L//'` + dnl Potentially add $additional_libdir to $LIBNAME and $LTLIBNAME. + dnl But don't add it + dnl 1. if it's the standard /usr/lib, + dnl 2. if it's /usr/local/lib and we are using GCC on Linux, + dnl 3. if it's already present in $LDFLAGS or the already + dnl constructed $LIBNAME, + dnl 4. if it doesn't exist as a directory. + if test "X$additional_libdir" != "X/usr/$acl_libdirstem"; then + haveit= + if test "X$additional_libdir" = "X/usr/local/$acl_libdirstem"; then + if test -n "$GCC"; then + case $host_os in + linux* | gnu* | k*bsd*-gnu) haveit=yes;; + esac + fi + fi + if test -z "$haveit"; then + haveit= + for x in $LDFLAGS $LIB[]NAME; do + AC_LIB_WITH_FINAL_PREFIX([eval x=\"$x\"]) + if test "X$x" = "X-L$additional_libdir"; then + haveit=yes + break + fi + done + if test -z "$haveit"; then + if test -d "$additional_libdir"; then + dnl Really add $additional_libdir to $LIBNAME. + LIB[]NAME="${LIB[]NAME}${LIB[]NAME:+ }-L$additional_libdir" + fi + fi + haveit= + for x in $LDFLAGS $LTLIB[]NAME; do + AC_LIB_WITH_FINAL_PREFIX([eval x=\"$x\"]) + if test "X$x" = "X-L$additional_libdir"; then + haveit=yes + break + fi + done + if test -z "$haveit"; then + if test -d "$additional_libdir"; then + dnl Really add $additional_libdir to $LTLIBNAME. + LTLIB[]NAME="${LTLIB[]NAME}${LTLIB[]NAME:+ }-L$additional_libdir" + fi + fi + fi + fi + ;; + -R*) + dir=`echo "X$dep" | sed -e 's/^X-R//'` + if test "$enable_rpath" != no; then + dnl Potentially add DIR to rpathdirs. + dnl The rpathdirs will be appended to $LIBNAME at the end. + haveit= + for x in $rpathdirs; do + if test "X$x" = "X$dir"; then + haveit=yes + break + fi + done + if test -z "$haveit"; then + rpathdirs="$rpathdirs $dir" + fi + dnl Potentially add DIR to ltrpathdirs. + dnl The ltrpathdirs will be appended to $LTLIBNAME at the end. + haveit= + for x in $ltrpathdirs; do + if test "X$x" = "X$dir"; then + haveit=yes + break + fi + done + if test -z "$haveit"; then + ltrpathdirs="$ltrpathdirs $dir" + fi + fi + ;; + -l*) + dnl Handle this in the next round. + names_next_round="$names_next_round "`echo "X$dep" | sed -e 's/^X-l//'` + ;; + *.la) + dnl Handle this in the next round. Throw away the .la's + dnl directory; it is already contained in a preceding -L + dnl option. + names_next_round="$names_next_round "`echo "X$dep" | sed -e 's,^X.*/,,' -e 's,^lib,,' -e 's,\.la$,,'` + ;; + *) + dnl Most likely an immediate library name. + LIB[]NAME="${LIB[]NAME}${LIB[]NAME:+ }$dep" + LTLIB[]NAME="${LTLIB[]NAME}${LTLIB[]NAME:+ }$dep" + ;; + esac + done + fi + else + dnl Didn't find the library; assume it is in the system directories + dnl known to the linker and runtime loader. (All the system + dnl directories known to the linker should also be known to the + dnl runtime loader, otherwise the system is severely misconfigured.) + LIB[]NAME="${LIB[]NAME}${LIB[]NAME:+ }-l$name" + LTLIB[]NAME="${LTLIB[]NAME}${LTLIB[]NAME:+ }-l$name" + fi + fi + fi + done + done + if test "X$rpathdirs" != "X"; then + if test -n "$acl_hardcode_libdir_separator"; then + dnl Weird platform: only the last -rpath option counts, the user must + dnl pass all path elements in one option. We can arrange that for a + dnl single library, but not when more than one $LIBNAMEs are used. + alldirs= + for found_dir in $rpathdirs; do + alldirs="${alldirs}${alldirs:+$acl_hardcode_libdir_separator}$found_dir" + done + dnl Note: acl_hardcode_libdir_flag_spec uses $libdir and $wl. + acl_save_libdir="$libdir" + libdir="$alldirs" + eval flag=\"$acl_hardcode_libdir_flag_spec\" + libdir="$acl_save_libdir" + LIB[]NAME="${LIB[]NAME}${LIB[]NAME:+ }$flag" + else + dnl The -rpath options are cumulative. + for found_dir in $rpathdirs; do + acl_save_libdir="$libdir" + libdir="$found_dir" + eval flag=\"$acl_hardcode_libdir_flag_spec\" + libdir="$acl_save_libdir" + LIB[]NAME="${LIB[]NAME}${LIB[]NAME:+ }$flag" + done + fi + fi + if test "X$ltrpathdirs" != "X"; then + dnl When using libtool, the option that works for both libraries and + dnl executables is -R. The -R options are cumulative. + for found_dir in $ltrpathdirs; do + LTLIB[]NAME="${LTLIB[]NAME}${LTLIB[]NAME:+ }-R$found_dir" + done + fi +]) + +dnl AC_LIB_APPENDTOVAR(VAR, CONTENTS) appends the elements of CONTENTS to VAR, +dnl unless already present in VAR. +dnl Works only for CPPFLAGS, not for LIB* variables because that sometimes +dnl contains two or three consecutive elements that belong together. +AC_DEFUN([AC_LIB_APPENDTOVAR], +[ + for element in [$2]; do + haveit= + for x in $[$1]; do + AC_LIB_WITH_FINAL_PREFIX([eval x=\"$x\"]) + if test "X$x" = "X$element"; then + haveit=yes + break + fi + done + if test -z "$haveit"; then + [$1]="${[$1]}${[$1]:+ }$element" + fi + done +]) + +dnl For those cases where a variable contains several -L and -l options +dnl referring to unknown libraries and directories, this macro determines the +dnl necessary additional linker options for the runtime path. +dnl AC_LIB_LINKFLAGS_FROM_LIBS([LDADDVAR], [LIBSVALUE], [USE-LIBTOOL]) +dnl sets LDADDVAR to linker options needed together with LIBSVALUE. +dnl If USE-LIBTOOL evaluates to non-empty, linking with libtool is assumed, +dnl otherwise linking without libtool is assumed. +AC_DEFUN([AC_LIB_LINKFLAGS_FROM_LIBS], +[ + AC_REQUIRE([AC_LIB_RPATH]) + AC_REQUIRE([AC_LIB_PREPARE_MULTILIB]) + $1= + if test "$enable_rpath" != no; then + if test -n "$acl_hardcode_libdir_flag_spec" && test "$acl_hardcode_minus_L" = no; then + dnl Use an explicit option to hardcode directories into the resulting + dnl binary. + rpathdirs= + next= + for opt in $2; do + if test -n "$next"; then + dir="$next" + dnl No need to hardcode the standard /usr/lib. + if test "X$dir" != "X/usr/$acl_libdirstem"; then + rpathdirs="$rpathdirs $dir" + fi + next= + else + case $opt in + -L) next=yes ;; + -L*) dir=`echo "X$opt" | sed -e 's,^X-L,,'` + dnl No need to hardcode the standard /usr/lib. + if test "X$dir" != "X/usr/$acl_libdirstem"; then + rpathdirs="$rpathdirs $dir" + fi + next= ;; + *) next= ;; + esac + fi + done + if test "X$rpathdirs" != "X"; then + if test -n ""$3""; then + dnl libtool is used for linking. Use -R options. + for dir in $rpathdirs; do + $1="${$1}${$1:+ }-R$dir" + done + else + dnl The linker is used for linking directly. + if test -n "$acl_hardcode_libdir_separator"; then + dnl Weird platform: only the last -rpath option counts, the user + dnl must pass all path elements in one option. + alldirs= + for dir in $rpathdirs; do + alldirs="${alldirs}${alldirs:+$acl_hardcode_libdir_separator}$dir" + done + acl_save_libdir="$libdir" + libdir="$alldirs" + eval flag=\"$acl_hardcode_libdir_flag_spec\" + libdir="$acl_save_libdir" + $1="$flag" + else + dnl The -rpath options are cumulative. + for dir in $rpathdirs; do + acl_save_libdir="$libdir" + libdir="$dir" + eval flag=\"$acl_hardcode_libdir_flag_spec\" + libdir="$acl_save_libdir" + $1="${$1}${$1:+ }$flag" + done + fi + fi + fi + fi + fi + AC_SUBST([$1]) +]) diff --git a/m4/lib-prefix.m4 b/m4/lib-prefix.m4 new file mode 100644 index 0000000..a8684e1 --- /dev/null +++ b/m4/lib-prefix.m4 @@ -0,0 +1,185 @@ +# lib-prefix.m4 serial 5 (gettext-0.15) +dnl Copyright (C) 2001-2005 Free Software Foundation, Inc. +dnl This file is free software; the Free Software Foundation +dnl gives unlimited permission to copy and/or distribute it, +dnl with or without modifications, as long as this notice is preserved. + +dnl From Bruno Haible. + +dnl AC_LIB_ARG_WITH is synonymous to AC_ARG_WITH in autoconf-2.13, and +dnl similar to AC_ARG_WITH in autoconf 2.52...2.57 except that is doesn't +dnl require excessive bracketing. +ifdef([AC_HELP_STRING], +[AC_DEFUN([AC_LIB_ARG_WITH], [AC_ARG_WITH([$1],[[$2]],[$3],[$4])])], +[AC_DEFUN([AC_][LIB_ARG_WITH], [AC_ARG_WITH([$1],[$2],[$3],[$4])])]) + +dnl AC_LIB_PREFIX adds to the CPPFLAGS and LDFLAGS the flags that are needed +dnl to access previously installed libraries. The basic assumption is that +dnl a user will want packages to use other packages he previously installed +dnl with the same --prefix option. +dnl This macro is not needed if only AC_LIB_LINKFLAGS is used to locate +dnl libraries, but is otherwise very convenient. +AC_DEFUN([AC_LIB_PREFIX], +[ + AC_BEFORE([$0], [AC_LIB_LINKFLAGS]) + AC_REQUIRE([AC_PROG_CC]) + AC_REQUIRE([AC_CANONICAL_HOST]) + AC_REQUIRE([AC_LIB_PREPARE_MULTILIB]) + AC_REQUIRE([AC_LIB_PREPARE_PREFIX]) + dnl By default, look in $includedir and $libdir. + use_additional=yes + AC_LIB_WITH_FINAL_PREFIX([ + eval additional_includedir=\"$includedir\" + eval additional_libdir=\"$libdir\" + ]) + AC_LIB_ARG_WITH([lib-prefix], +[ --with-lib-prefix[=DIR] search for libraries in DIR/include and DIR/lib + --without-lib-prefix don't search for libraries in includedir and libdir], +[ + if test "X$withval" = "Xno"; then + use_additional=no + else + if test "X$withval" = "X"; then + AC_LIB_WITH_FINAL_PREFIX([ + eval additional_includedir=\"$includedir\" + eval additional_libdir=\"$libdir\" + ]) + else + additional_includedir="$withval/include" + additional_libdir="$withval/$acl_libdirstem" + fi + fi +]) + if test $use_additional = yes; then + dnl Potentially add $additional_includedir to $CPPFLAGS. + dnl But don't add it + dnl 1. if it's the standard /usr/include, + dnl 2. if it's already present in $CPPFLAGS, + dnl 3. if it's /usr/local/include and we are using GCC on Linux, + dnl 4. if it doesn't exist as a directory. + if test "X$additional_includedir" != "X/usr/include"; then + haveit= + for x in $CPPFLAGS; do + AC_LIB_WITH_FINAL_PREFIX([eval x=\"$x\"]) + if test "X$x" = "X-I$additional_includedir"; then + haveit=yes + break + fi + done + if test -z "$haveit"; then + if test "X$additional_includedir" = "X/usr/local/include"; then + if test -n "$GCC"; then + case $host_os in + linux* | gnu* | k*bsd*-gnu) haveit=yes;; + esac + fi + fi + if test -z "$haveit"; then + if test -d "$additional_includedir"; then + dnl Really add $additional_includedir to $CPPFLAGS. + CPPFLAGS="${CPPFLAGS}${CPPFLAGS:+ }-I$additional_includedir" + fi + fi + fi + fi + dnl Potentially add $additional_libdir to $LDFLAGS. + dnl But don't add it + dnl 1. if it's the standard /usr/lib, + dnl 2. if it's already present in $LDFLAGS, + dnl 3. if it's /usr/local/lib and we are using GCC on Linux, + dnl 4. if it doesn't exist as a directory. + if test "X$additional_libdir" != "X/usr/$acl_libdirstem"; then + haveit= + for x in $LDFLAGS; do + AC_LIB_WITH_FINAL_PREFIX([eval x=\"$x\"]) + if test "X$x" = "X-L$additional_libdir"; then + haveit=yes + break + fi + done + if test -z "$haveit"; then + if test "X$additional_libdir" = "X/usr/local/$acl_libdirstem"; then + if test -n "$GCC"; then + case $host_os in + linux*) haveit=yes;; + esac + fi + fi + if test -z "$haveit"; then + if test -d "$additional_libdir"; then + dnl Really add $additional_libdir to $LDFLAGS. + LDFLAGS="${LDFLAGS}${LDFLAGS:+ }-L$additional_libdir" + fi + fi + fi + fi + fi +]) + +dnl AC_LIB_PREPARE_PREFIX creates variables acl_final_prefix, +dnl acl_final_exec_prefix, containing the values to which $prefix and +dnl $exec_prefix will expand at the end of the configure script. +AC_DEFUN([AC_LIB_PREPARE_PREFIX], +[ + dnl Unfortunately, prefix and exec_prefix get only finally determined + dnl at the end of configure. + if test "X$prefix" = "XNONE"; then + acl_final_prefix="$ac_default_prefix" + else + acl_final_prefix="$prefix" + fi + if test "X$exec_prefix" = "XNONE"; then + acl_final_exec_prefix='${prefix}' + else + acl_final_exec_prefix="$exec_prefix" + fi + acl_save_prefix="$prefix" + prefix="$acl_final_prefix" + eval acl_final_exec_prefix=\"$acl_final_exec_prefix\" + prefix="$acl_save_prefix" +]) + +dnl AC_LIB_WITH_FINAL_PREFIX([statement]) evaluates statement, with the +dnl variables prefix and exec_prefix bound to the values they will have +dnl at the end of the configure script. +AC_DEFUN([AC_LIB_WITH_FINAL_PREFIX], +[ + acl_save_prefix="$prefix" + prefix="$acl_final_prefix" + acl_save_exec_prefix="$exec_prefix" + exec_prefix="$acl_final_exec_prefix" + $1 + exec_prefix="$acl_save_exec_prefix" + prefix="$acl_save_prefix" +]) + +dnl AC_LIB_PREPARE_MULTILIB creates a variable acl_libdirstem, containing +dnl the basename of the libdir, either "lib" or "lib64". +AC_DEFUN([AC_LIB_PREPARE_MULTILIB], +[ + dnl There is no formal standard regarding lib and lib64. The current + dnl practice is that on a system supporting 32-bit and 64-bit instruction + dnl sets or ABIs, 64-bit libraries go under $prefix/lib64 and 32-bit + dnl libraries go under $prefix/lib. We determine the compiler's default + dnl mode by looking at the compiler's library search path. If at least + dnl of its elements ends in /lib64 or points to a directory whose absolute + dnl pathname ends in /lib64, we assume a 64-bit ABI. Otherwise we use the + dnl default, namely "lib". + acl_libdirstem=lib + searchpath=`(LC_ALL=C $CC -print-search-dirs) 2>/dev/null | sed -n -e 's,^libraries: ,,p' | sed -e 's,^=,,'` + if test -n "$searchpath"; then + acl_save_IFS="${IFS= }"; IFS=":" + for searchdir in $searchpath; do + if test -d "$searchdir"; then + case "$searchdir" in + */lib64/ | */lib64 ) acl_libdirstem=lib64 ;; + *) searchdir=`cd "$searchdir" && pwd` + case "$searchdir" in + */lib64 ) acl_libdirstem=lib64 ;; + esac ;; + esac + fi + done + IFS="$acl_save_IFS" + fi +]) diff --git a/m4/libcurl.m4 b/m4/libcurl.m4 new file mode 100644 index 0000000..ee102a1 --- /dev/null +++ b/m4/libcurl.m4 @@ -0,0 +1,239 @@ +# LIBCURL_CHECK_CONFIG ([DEFAULT-ACTION], [MINIMUM-VERSION], +# [ACTION-IF-YES], [ACTION-IF-NO]) +# ---------------------------------------------------------- +# David Shaw May-09-2006 +# +# Checks for libcurl. DEFAULT-ACTION is the string yes or no to +# specify whether to default to --with-libcurl or --without-libcurl. +# If not supplied, DEFAULT-ACTION is yes. MINIMUM-VERSION is the +# minimum version of libcurl to accept. Pass the version as a regular +# version number like 7.10.1. If not supplied, any version is +# accepted. ACTION-IF-YES is a list of shell commands to run if +# libcurl was successfully found and passed the various tests. +# ACTION-IF-NO is a list of shell commands that are run otherwise. +# Note that using --without-libcurl does run ACTION-IF-NO. +# +# This macro #defines HAVE_LIBCURL if a working libcurl setup is +# found, and sets @LIBCURL@ and @LIBCURL_CPPFLAGS@ to the necessary +# values. Other useful defines are LIBCURL_FEATURE_xxx where xxx are +# the various features supported by libcurl, and LIBCURL_PROTOCOL_yyy +# where yyy are the various protocols supported by libcurl. Both xxx +# and yyy are capitalized. See the list of AH_TEMPLATEs at the top of +# the macro for the complete list of possible defines. Shell +# variables $libcurl_feature_xxx and $libcurl_protocol_yyy are also +# defined to 'yes' for those features and protocols that were found. +# Note that xxx and yyy keep the same capitalization as in the +# curl-config list (e.g. it's "HTTP" and not "http"). +# +# Users may override the detected values by doing something like: +# LIBCURL="-lcurl" LIBCURL_CPPFLAGS="-I/usr/myinclude" ./configure +# +# For the sake of sanity, this macro assumes that any libcurl that is +# found is after version 7.7.2, the first version that included the +# curl-config script. Note that it is very important for people +# packaging binary versions of libcurl to include this script! +# Without curl-config, we can only guess what protocols are available, +# or use curl_version_info to figure it out at runtime. + +AC_DEFUN([LIBCURL_CHECK_CONFIG], +[ + AH_TEMPLATE([LIBCURL_FEATURE_SSL],[Defined if libcurl supports SSL]) + AH_TEMPLATE([LIBCURL_FEATURE_KRB4],[Defined if libcurl supports KRB4]) + AH_TEMPLATE([LIBCURL_FEATURE_IPV6],[Defined if libcurl supports IPv6]) + AH_TEMPLATE([LIBCURL_FEATURE_LIBZ],[Defined if libcurl supports libz]) + AH_TEMPLATE([LIBCURL_FEATURE_ASYNCHDNS],[Defined if libcurl supports AsynchDNS]) + AH_TEMPLATE([LIBCURL_FEATURE_IDN],[Defined if libcurl supports IDN]) + AH_TEMPLATE([LIBCURL_FEATURE_SSPI],[Defined if libcurl supports SSPI]) + AH_TEMPLATE([LIBCURL_FEATURE_NTLM],[Defined if libcurl supports NTLM]) + + AH_TEMPLATE([LIBCURL_PROTOCOL_HTTP],[Defined if libcurl supports HTTP]) + AH_TEMPLATE([LIBCURL_PROTOCOL_HTTPS],[Defined if libcurl supports HTTPS]) + AH_TEMPLATE([LIBCURL_PROTOCOL_FTP],[Defined if libcurl supports FTP]) + AH_TEMPLATE([LIBCURL_PROTOCOL_FTPS],[Defined if libcurl supports FTPS]) + AH_TEMPLATE([LIBCURL_PROTOCOL_FILE],[Defined if libcurl supports FILE]) + AH_TEMPLATE([LIBCURL_PROTOCOL_TELNET],[Defined if libcurl supports TELNET]) + AH_TEMPLATE([LIBCURL_PROTOCOL_LDAP],[Defined if libcurl supports LDAP]) + AH_TEMPLATE([LIBCURL_PROTOCOL_DICT],[Defined if libcurl supports DICT]) + AH_TEMPLATE([LIBCURL_PROTOCOL_TFTP],[Defined if libcurl supports TFTP]) + + AC_ARG_WITH(libcurl, + AC_HELP_STRING([--with-libcurl=DIR],[look for the curl library in DIR]), + [_libcurl_with=$withval],[_libcurl_with=ifelse([$1],,[yes],[$1])]) + + if test "$_libcurl_with" != "no" ; then + + AC_PROG_AWK + + _libcurl_version_parse="eval $AWK '{split(\$NF,A,\".\"); X=256*256*A[[1]]+256*A[[2]]+A[[3]]; print X;}'" + + _libcurl_try_link=yes + + if test -d "$_libcurl_with" ; then + LIBCURL_CPPFLAGS="-I$withval/include" + _libcurl_ldflags="-L$withval/lib" + AC_PATH_PROG([_libcurl_config],["$withval/bin/curl-config"]) + else + AC_PATH_PROG([_libcurl_config],[curl-config]) + fi + + if test x$_libcurl_config != "x" ; then + AC_CACHE_CHECK([for the version of libcurl], + [libcurl_cv_lib_curl_version], + [libcurl_cv_lib_curl_version=`$_libcurl_config --version | $AWK '{print $[]2}'`]) + + _libcurl_version=`echo $libcurl_cv_lib_curl_version | $_libcurl_version_parse` + _libcurl_wanted=`echo ifelse([$2],,[0],[$2]) | $_libcurl_version_parse` + + if test $_libcurl_wanted -gt 0 ; then + AC_CACHE_CHECK([for libcurl >= version $2], + [libcurl_cv_lib_version_ok], + [ + if test $_libcurl_version -ge $_libcurl_wanted ; then + libcurl_cv_lib_version_ok=yes + else + libcurl_cv_lib_version_ok=no + fi + ]) + fi + + if test $_libcurl_wanted -eq 0 || test x$libcurl_cv_lib_version_ok = xyes ; then + if test x"$LIBCURL_CPPFLAGS" = "x" ; then + LIBCURL_CPPFLAGS=`$_libcurl_config --cflags` + fi + if test x"$LIBCURL" = "x" ; then + LIBCURL=`$_libcurl_config --libs` + + # This is so silly, but Apple actually has a bug in their + # curl-config script. Fixed in Tiger, but there are still + # lots of Panther installs around. + case "${host}" in + powerpc-apple-darwin7*) + LIBCURL=`echo $LIBCURL | sed -e 's|-arch i386||g'` + ;; + esac + fi + + # All curl-config scripts support --feature + _libcurl_features=`$_libcurl_config --feature` + + # Is it modern enough to have --protocols? (7.12.4) + if test $_libcurl_version -ge 461828 ; then + _libcurl_protocols=`$_libcurl_config --protocols` + fi + else + _libcurl_try_link=no + fi + + unset _libcurl_wanted + fi + + if test $_libcurl_try_link = yes ; then + + # we didn't find curl-config, so let's see if the user-supplied + # link line (or failing that, "-lcurl") is enough. + LIBCURL=${LIBCURL-"$_libcurl_ldflags -lcurl"} + + AC_CACHE_CHECK([whether libcurl is usable], + [libcurl_cv_lib_curl_usable], + [ + _libcurl_save_cppflags=$CPPFLAGS + CPPFLAGS="$LIBCURL_CPPFLAGS $CPPFLAGS" + _libcurl_save_libs=$LIBS + LIBS="$LIBCURL $LIBS" + + AC_LINK_IFELSE([AC_LANG_PROGRAM([[#include ]],[[ +/* Try and use a few common options to force a failure if we are + missing symbols or can't link. */ +int x; +curl_easy_setopt(NULL,CURLOPT_URL,NULL); +x=CURL_ERROR_SIZE; +x=CURLOPT_WRITEFUNCTION; +x=CURLOPT_FILE; +x=CURLOPT_ERRORBUFFER; +x=CURLOPT_STDERR; +x=CURLOPT_VERBOSE; +]])],libcurl_cv_lib_curl_usable=yes,libcurl_cv_lib_curl_usable=no) + + CPPFLAGS=$_libcurl_save_cppflags + LIBS=$_libcurl_save_libs + unset _libcurl_save_cppflags + unset _libcurl_save_libs + ]) + + if test $libcurl_cv_lib_curl_usable = yes ; then + + # Does curl_free() exist in this version of libcurl? + # If not, fake it with free() + + _libcurl_save_cppflags=$CPPFLAGS + CPPFLAGS="$CPPFLAGS $LIBCURL_CPPFLAGS" + _libcurl_save_libs=$LIBS + LIBS="$LIBS $LIBCURL" + + AC_CHECK_FUNC(curl_free,, + AC_DEFINE(curl_free,free, + [Define curl_free() as free() if our version of curl lacks curl_free.])) + + CPPFLAGS=$_libcurl_save_cppflags + LIBS=$_libcurl_save_libs + unset _libcurl_save_cppflags + unset _libcurl_save_libs + + AC_DEFINE(HAVE_LIBCURL,1, + [Define to 1 if you have a functional curl library.]) + AC_SUBST(LIBCURL_CPPFLAGS) + AC_SUBST(LIBCURL) + + for _libcurl_feature in $_libcurl_features ; do + AC_DEFINE_UNQUOTED(AS_TR_CPP(libcurl_feature_$_libcurl_feature),[1]) + eval AS_TR_SH(libcurl_feature_$_libcurl_feature)=yes + done + + if test "x$_libcurl_protocols" = "x" ; then + + # We don't have --protocols, so just assume that all + # protocols are available + _libcurl_protocols="HTTP FTP FILE TELNET LDAP DICT" + + if test x$libcurl_feature_SSL = xyes ; then + _libcurl_protocols="$_libcurl_protocols HTTPS" + + # FTPS wasn't standards-compliant until version + # 7.11.0 + if test $_libcurl_version -ge 461568; then + _libcurl_protocols="$_libcurl_protocols FTPS" + fi + fi + fi + + for _libcurl_protocol in $_libcurl_protocols ; do + AC_DEFINE_UNQUOTED(AS_TR_CPP(libcurl_protocol_$_libcurl_protocol),[1]) + eval AS_TR_SH(libcurl_protocol_$_libcurl_protocol)=yes + done + else + unset LIBCURL + unset LIBCURL_CPPFLAGS + fi + fi + + unset _libcurl_try_link + unset _libcurl_version_parse + unset _libcurl_config + unset _libcurl_feature + unset _libcurl_features + unset _libcurl_protocol + unset _libcurl_protocols + unset _libcurl_version + unset _libcurl_ldflags + fi + + if test x$_libcurl_with = xno || test x$libcurl_cv_lib_curl_usable != xyes ; then + # This is the IF-NO path + ifelse([$4],,:,[$4]) + else + # This is the IF-YES path + ifelse([$3],,:,[$3]) + fi + + unset _libcurl_with +])dnl diff --git a/m4/nls.m4 b/m4/nls.m4 new file mode 100644 index 0000000..7967cc2 --- /dev/null +++ b/m4/nls.m4 @@ -0,0 +1,31 @@ +# nls.m4 serial 3 (gettext-0.15) +dnl Copyright (C) 1995-2003, 2005-2006 Free Software Foundation, Inc. +dnl This file is free software; the Free Software Foundation +dnl gives unlimited permission to copy and/or distribute it, +dnl with or without modifications, as long as this notice is preserved. +dnl +dnl This file can can be used in projects which are not available under +dnl the GNU General Public License or the GNU Library General Public +dnl License but which still want to provide support for the GNU gettext +dnl functionality. +dnl Please note that the actual code of the GNU gettext library is covered +dnl by the GNU Library General Public License, and the rest of the GNU +dnl gettext package package is covered by the GNU General Public License. +dnl They are *not* in the public domain. + +dnl Authors: +dnl Ulrich Drepper , 1995-2000. +dnl Bruno Haible , 2000-2003. + +AC_PREREQ(2.50) + +AC_DEFUN([AM_NLS], +[ + AC_MSG_CHECKING([whether NLS is requested]) + dnl Default is enabled NLS + AC_ARG_ENABLE(nls, + [ --disable-nls do not use Native Language Support], + USE_NLS=$enableval, USE_NLS=yes) + AC_MSG_RESULT($USE_NLS) + AC_SUBST(USE_NLS) +]) diff --git a/m4/po.m4 b/m4/po.m4 new file mode 100644 index 0000000..0734762 --- /dev/null +++ b/m4/po.m4 @@ -0,0 +1,449 @@ +# po.m4 serial 15 (gettext-0.17) +dnl Copyright (C) 1995-2007 Free Software Foundation, Inc. +dnl This file is free software; the Free Software Foundation +dnl gives unlimited permission to copy and/or distribute it, +dnl with or without modifications, as long as this notice is preserved. +dnl +dnl This file can can be used in projects which are not available under +dnl the GNU General Public License or the GNU Library General Public +dnl License but which still want to provide support for the GNU gettext +dnl functionality. +dnl Please note that the actual code of the GNU gettext library is covered +dnl by the GNU Library General Public License, and the rest of the GNU +dnl gettext package package is covered by the GNU General Public License. +dnl They are *not* in the public domain. + +dnl Authors: +dnl Ulrich Drepper , 1995-2000. +dnl Bruno Haible , 2000-2003. + +AC_PREREQ(2.50) + +dnl Checks for all prerequisites of the po subdirectory. +AC_DEFUN([AM_PO_SUBDIRS], +[ + AC_REQUIRE([AC_PROG_MAKE_SET])dnl + AC_REQUIRE([AC_PROG_INSTALL])dnl + AC_REQUIRE([AM_PROG_MKDIR_P])dnl defined by automake + AC_REQUIRE([AM_NLS])dnl + + dnl Release version of the gettext macros. This is used to ensure that + dnl the gettext macros and po/Makefile.in.in are in sync. + AC_SUBST([GETTEXT_MACRO_VERSION], [0.17]) + + dnl Perform the following tests also if --disable-nls has been given, + dnl because they are needed for "make dist" to work. + + dnl Search for GNU msgfmt in the PATH. + dnl The first test excludes Solaris msgfmt and early GNU msgfmt versions. + dnl The second test excludes FreeBSD msgfmt. + AM_PATH_PROG_WITH_TEST(MSGFMT, msgfmt, + [$ac_dir/$ac_word --statistics /dev/null >&]AS_MESSAGE_LOG_FD[ 2>&1 && + (if $ac_dir/$ac_word --statistics /dev/null 2>&1 >/dev/null | grep usage >/dev/null; then exit 1; else exit 0; fi)], + :) + AC_PATH_PROG(GMSGFMT, gmsgfmt, $MSGFMT) + + dnl Test whether it is GNU msgfmt >= 0.15. +changequote(,)dnl + case `$MSGFMT --version | sed 1q | sed -e 's,^[^0-9]*,,'` in + '' | 0.[0-9] | 0.[0-9].* | 0.1[0-4] | 0.1[0-4].*) MSGFMT_015=: ;; + *) MSGFMT_015=$MSGFMT ;; + esac +changequote([,])dnl + AC_SUBST([MSGFMT_015]) +changequote(,)dnl + case `$GMSGFMT --version | sed 1q | sed -e 's,^[^0-9]*,,'` in + '' | 0.[0-9] | 0.[0-9].* | 0.1[0-4] | 0.1[0-4].*) GMSGFMT_015=: ;; + *) GMSGFMT_015=$GMSGFMT ;; + esac +changequote([,])dnl + AC_SUBST([GMSGFMT_015]) + + dnl Search for GNU xgettext 0.12 or newer in the PATH. + dnl The first test excludes Solaris xgettext and early GNU xgettext versions. + dnl The second test excludes FreeBSD xgettext. + AM_PATH_PROG_WITH_TEST(XGETTEXT, xgettext, + [$ac_dir/$ac_word --omit-header --copyright-holder= --msgid-bugs-address= /dev/null >&]AS_MESSAGE_LOG_FD[ 2>&1 && + (if $ac_dir/$ac_word --omit-header --copyright-holder= --msgid-bugs-address= /dev/null 2>&1 >/dev/null | grep usage >/dev/null; then exit 1; else exit 0; fi)], + :) + dnl Remove leftover from FreeBSD xgettext call. + rm -f messages.po + + dnl Test whether it is GNU xgettext >= 0.15. +changequote(,)dnl + case `$XGETTEXT --version | sed 1q | sed -e 's,^[^0-9]*,,'` in + '' | 0.[0-9] | 0.[0-9].* | 0.1[0-4] | 0.1[0-4].*) XGETTEXT_015=: ;; + *) XGETTEXT_015=$XGETTEXT ;; + esac +changequote([,])dnl + AC_SUBST([XGETTEXT_015]) + + dnl Search for GNU msgmerge 0.11 or newer in the PATH. + AM_PATH_PROG_WITH_TEST(MSGMERGE, msgmerge, + [$ac_dir/$ac_word --update -q /dev/null /dev/null >&]AS_MESSAGE_LOG_FD[ 2>&1], :) + + dnl Installation directories. + dnl Autoconf >= 2.60 defines localedir. For older versions of autoconf, we + dnl have to define it here, so that it can be used in po/Makefile. + test -n "$localedir" || localedir='${datadir}/locale' + AC_SUBST([localedir]) + + dnl Support for AM_XGETTEXT_OPTION. + test -n "${XGETTEXT_EXTRA_OPTIONS+set}" || XGETTEXT_EXTRA_OPTIONS= + AC_SUBST([XGETTEXT_EXTRA_OPTIONS]) + + AC_CONFIG_COMMANDS([po-directories], [[ + for ac_file in $CONFIG_FILES; do + # Support "outfile[:infile[:infile...]]" + case "$ac_file" in + *:*) ac_file=`echo "$ac_file"|sed 's%:.*%%'` ;; + esac + # PO directories have a Makefile.in generated from Makefile.in.in. + case "$ac_file" in */Makefile.in) + # Adjust a relative srcdir. + ac_dir=`echo "$ac_file"|sed 's%/[^/][^/]*$%%'` + ac_dir_suffix="/`echo "$ac_dir"|sed 's%^\./%%'`" + ac_dots=`echo "$ac_dir_suffix"|sed 's%/[^/]*%../%g'` + # In autoconf-2.13 it is called $ac_given_srcdir. + # In autoconf-2.50 it is called $srcdir. + test -n "$ac_given_srcdir" || ac_given_srcdir="$srcdir" + case "$ac_given_srcdir" in + .) top_srcdir=`echo $ac_dots|sed 's%/$%%'` ;; + /*) top_srcdir="$ac_given_srcdir" ;; + *) top_srcdir="$ac_dots$ac_given_srcdir" ;; + esac + # Treat a directory as a PO directory if and only if it has a + # POTFILES.in file. This allows packages to have multiple PO + # directories under different names or in different locations. + if test -f "$ac_given_srcdir/$ac_dir/POTFILES.in"; then + rm -f "$ac_dir/POTFILES" + test -n "$as_me" && echo "$as_me: creating $ac_dir/POTFILES" || echo "creating $ac_dir/POTFILES" + cat "$ac_given_srcdir/$ac_dir/POTFILES.in" | sed -e "/^#/d" -e "/^[ ]*\$/d" -e "s,.*, $top_srcdir/& \\\\," | sed -e "\$s/\(.*\) \\\\/\1/" > "$ac_dir/POTFILES" + POMAKEFILEDEPS="POTFILES.in" + # ALL_LINGUAS, POFILES, UPDATEPOFILES, DUMMYPOFILES, GMOFILES depend + # on $ac_dir but don't depend on user-specified configuration + # parameters. + if test -f "$ac_given_srcdir/$ac_dir/LINGUAS"; then + # The LINGUAS file contains the set of available languages. + if test -n "$OBSOLETE_ALL_LINGUAS"; then + test -n "$as_me" && echo "$as_me: setting ALL_LINGUAS in configure.in is obsolete" || echo "setting ALL_LINGUAS in configure.in is obsolete" + fi + ALL_LINGUAS_=`sed -e "/^#/d" -e "s/#.*//" "$ac_given_srcdir/$ac_dir/LINGUAS"` + # Hide the ALL_LINGUAS assigment from automake < 1.5. + eval 'ALL_LINGUAS''=$ALL_LINGUAS_' + POMAKEFILEDEPS="$POMAKEFILEDEPS LINGUAS" + else + # The set of available languages was given in configure.in. + # Hide the ALL_LINGUAS assigment from automake < 1.5. + eval 'ALL_LINGUAS''=$OBSOLETE_ALL_LINGUAS' + fi + # Compute POFILES + # as $(foreach lang, $(ALL_LINGUAS), $(srcdir)/$(lang).po) + # Compute UPDATEPOFILES + # as $(foreach lang, $(ALL_LINGUAS), $(lang).po-update) + # Compute DUMMYPOFILES + # as $(foreach lang, $(ALL_LINGUAS), $(lang).nop) + # Compute GMOFILES + # as $(foreach lang, $(ALL_LINGUAS), $(srcdir)/$(lang).gmo) + case "$ac_given_srcdir" in + .) srcdirpre= ;; + *) srcdirpre='$(srcdir)/' ;; + esac + POFILES= + UPDATEPOFILES= + DUMMYPOFILES= + GMOFILES= + for lang in $ALL_LINGUAS; do + POFILES="$POFILES $srcdirpre$lang.po" + UPDATEPOFILES="$UPDATEPOFILES $lang.po-update" + DUMMYPOFILES="$DUMMYPOFILES $lang.nop" + GMOFILES="$GMOFILES $srcdirpre$lang.gmo" + done + # CATALOGS depends on both $ac_dir and the user's LINGUAS + # environment variable. + INST_LINGUAS= + if test -n "$ALL_LINGUAS"; then + for presentlang in $ALL_LINGUAS; do + useit=no + if test "%UNSET%" != "$LINGUAS"; then + desiredlanguages="$LINGUAS" + else + desiredlanguages="$ALL_LINGUAS" + fi + for desiredlang in $desiredlanguages; do + # Use the presentlang catalog if desiredlang is + # a. equal to presentlang, or + # b. a variant of presentlang (because in this case, + # presentlang can be used as a fallback for messages + # which are not translated in the desiredlang catalog). + case "$desiredlang" in + "$presentlang"*) useit=yes;; + esac + done + if test $useit = yes; then + INST_LINGUAS="$INST_LINGUAS $presentlang" + fi + done + fi + CATALOGS= + if test -n "$INST_LINGUAS"; then + for lang in $INST_LINGUAS; do + CATALOGS="$CATALOGS $lang.gmo" + done + fi + test -n "$as_me" && echo "$as_me: creating $ac_dir/Makefile" || echo "creating $ac_dir/Makefile" + sed -e "/^POTFILES =/r $ac_dir/POTFILES" -e "/^# Makevars/r $ac_given_srcdir/$ac_dir/Makevars" -e "s|@POFILES@|$POFILES|g" -e "s|@UPDATEPOFILES@|$UPDATEPOFILES|g" -e "s|@DUMMYPOFILES@|$DUMMYPOFILES|g" -e "s|@GMOFILES@|$GMOFILES|g" -e "s|@CATALOGS@|$CATALOGS|g" -e "s|@POMAKEFILEDEPS@|$POMAKEFILEDEPS|g" "$ac_dir/Makefile.in" > "$ac_dir/Makefile" + for f in "$ac_given_srcdir/$ac_dir"/Rules-*; do + if test -f "$f"; then + case "$f" in + *.orig | *.bak | *~) ;; + *) cat "$f" >> "$ac_dir/Makefile" ;; + esac + fi + done + fi + ;; + esac + done]], + [# Capture the value of obsolete ALL_LINGUAS because we need it to compute + # POFILES, UPDATEPOFILES, DUMMYPOFILES, GMOFILES, CATALOGS. But hide it + # from automake < 1.5. + eval 'OBSOLETE_ALL_LINGUAS''="$ALL_LINGUAS"' + # Capture the value of LINGUAS because we need it to compute CATALOGS. + LINGUAS="${LINGUAS-%UNSET%}" + ]) +]) + +dnl Postprocesses a Makefile in a directory containing PO files. +AC_DEFUN([AM_POSTPROCESS_PO_MAKEFILE], +[ + # When this code is run, in config.status, two variables have already been + # set: + # - OBSOLETE_ALL_LINGUAS is the value of LINGUAS set in configure.in, + # - LINGUAS is the value of the environment variable LINGUAS at configure + # time. + +changequote(,)dnl + # Adjust a relative srcdir. + ac_dir=`echo "$ac_file"|sed 's%/[^/][^/]*$%%'` + ac_dir_suffix="/`echo "$ac_dir"|sed 's%^\./%%'`" + ac_dots=`echo "$ac_dir_suffix"|sed 's%/[^/]*%../%g'` + # In autoconf-2.13 it is called $ac_given_srcdir. + # In autoconf-2.50 it is called $srcdir. + test -n "$ac_given_srcdir" || ac_given_srcdir="$srcdir" + case "$ac_given_srcdir" in + .) top_srcdir=`echo $ac_dots|sed 's%/$%%'` ;; + /*) top_srcdir="$ac_given_srcdir" ;; + *) top_srcdir="$ac_dots$ac_given_srcdir" ;; + esac + + # Find a way to echo strings without interpreting backslash. + if test "X`(echo '\t') 2>/dev/null`" = 'X\t'; then + gt_echo='echo' + else + if test "X`(printf '%s\n' '\t') 2>/dev/null`" = 'X\t'; then + gt_echo='printf %s\n' + else + echo_func () { + cat < "$ac_file.tmp" + if grep -l '@TCLCATALOGS@' "$ac_file" > /dev/null; then + # Add dependencies that cannot be formulated as a simple suffix rule. + for lang in $ALL_LINGUAS; do + frobbedlang=`echo $lang | sed -e 's/\..*$//' -e 'y/ABCDEFGHIJKLMNOPQRSTUVWXYZ/abcdefghijklmnopqrstuvwxyz/'` + cat >> "$ac_file.tmp" < /dev/null; then + # Add dependencies that cannot be formulated as a simple suffix rule. + for lang in $ALL_LINGUAS; do + frobbedlang=`echo $lang | sed -e 's/_/-/g' -e 's/^sr-CS/sr-SP/' -e 's/@latin$/-Latn/' -e 's/@cyrillic$/-Cyrl/' -e 's/^sr-SP$/sr-SP-Latn/' -e 's/^uz-UZ$/uz-UZ-Latn/'` + cat >> "$ac_file.tmp" <> "$ac_file.tmp" <, 1996. + +AC_PREREQ(2.50) + +# Search path for a program which passes the given test. + +dnl AM_PATH_PROG_WITH_TEST(VARIABLE, PROG-TO-CHECK-FOR, +dnl TEST-PERFORMED-ON-FOUND_PROGRAM [, VALUE-IF-NOT-FOUND [, PATH]]) +AC_DEFUN([AM_PATH_PROG_WITH_TEST], +[ +# Prepare PATH_SEPARATOR. +# The user is always right. +if test "${PATH_SEPARATOR+set}" != set; then + echo "#! /bin/sh" >conf$$.sh + echo "exit 0" >>conf$$.sh + chmod +x conf$$.sh + if (PATH="/nonexistent;."; conf$$.sh) >/dev/null 2>&1; then + PATH_SEPARATOR=';' + else + PATH_SEPARATOR=: + fi + rm -f conf$$.sh +fi + +# Find out how to test for executable files. Don't use a zero-byte file, +# as systems may use methods other than mode bits to determine executability. +cat >conf$$.file <<_ASEOF +#! /bin/sh +exit 0 +_ASEOF +chmod +x conf$$.file +if test -x conf$$.file >/dev/null 2>&1; then + ac_executable_p="test -x" +else + ac_executable_p="test -f" +fi +rm -f conf$$.file + +# Extract the first word of "$2", so it can be a program name with args. +set dummy $2; ac_word=[$]2 +AC_MSG_CHECKING([for $ac_word]) +AC_CACHE_VAL(ac_cv_path_$1, +[case "[$]$1" in + [[\\/]]* | ?:[[\\/]]*) + ac_cv_path_$1="[$]$1" # Let the user override the test with a path. + ;; + *) + ac_save_IFS="$IFS"; IFS=$PATH_SEPARATOR + for ac_dir in ifelse([$5], , $PATH, [$5]); do + IFS="$ac_save_IFS" + test -z "$ac_dir" && ac_dir=. + for ac_exec_ext in '' $ac_executable_extensions; do + if $ac_executable_p "$ac_dir/$ac_word$ac_exec_ext"; then + echo "$as_me: trying $ac_dir/$ac_word..." >&AS_MESSAGE_LOG_FD + if [$3]; then + ac_cv_path_$1="$ac_dir/$ac_word$ac_exec_ext" + break 2 + fi + fi + done + done + IFS="$ac_save_IFS" +dnl If no 4th arg is given, leave the cache variable unset, +dnl so AC_PATH_PROGS will keep looking. +ifelse([$4], , , [ test -z "[$]ac_cv_path_$1" && ac_cv_path_$1="$4" +])dnl + ;; +esac])dnl +$1="$ac_cv_path_$1" +if test ifelse([$4], , [-n "[$]$1"], ["[$]$1" != "$4"]); then + AC_MSG_RESULT([$]$1) +else + AC_MSG_RESULT(no) +fi +AC_SUBST($1)dnl +]) diff --git a/mingw-viking.spec b/mingw-viking.spec new file mode 100644 index 0000000..d22851d --- /dev/null +++ b/mingw-viking.spec @@ -0,0 +1,113 @@ +# Public Domain CC0 +%{?mingw_package_header} +%define _pkg_name viking +Name: mingw32-%{_pkg_name} +Version: 1.7 +Release: 1 +Summary: GPS data editor and analyzer +Group: Applications/Productivity +License: GPLv2 +URL: http://sourceforge.net/projects/viking/ +Source0: %{_pkg_name}-%{version}.tar.gz +BuildRoot: %{_tmppath}/%{name}-%{version}-%{release}-root-%(%{__id_u} -n) +BuildArch: noarch + +# 32bit version only in this file. See mingw64-viking.spec for the 64bit version + +# Programs to enable the cross build +BuildRequires: mingw32-filesystem +BuildRequires: mingw32-binutils +BuildRequires: mingw32-runtime +BuildRequires: mingw32-cross-binutils +BuildRequires: mingw32-cross-gcc +BuildRequires: mingw32-cross-pkg-config +BuildRequires: mingw32-gettext-tools +BuildRequires: mingw32-gnome-doc-utils-devel +BuildRequires: intltool +BuildRequires: gdk-pixbuf-devel +# ^For gdk-pixbuf-csource + +# Code +# Not worried about versions ATM +BuildRequires: mingw32-gtk2-devel +# ATM gtk2-devel auto includes at least devel versions of glib2, gobject, zlib and more + +# Mandatory libraries +BuildRequires: mingw32-libexpat-devel +BuildRequires: mingw32-libcurl-devel +# Optional libraries +BuildRequires: mingw32-libgexiv2-devel +BuildRequires: mingw32-libbz2-devel +BuildRequires: mingw32-file-devel +BuildRequires: mingw32-libmagic1 +BuildRequires: mingw32-libbz2-1 +BuildRequires: mingw32-sqlite-devel +BuildRequires: mingw32-libzip-devel +BuildRequires: mingw32-libnettle-devel +BuildRequires: mingw32-libgps-devel +BuildRequires: mingw32-liboauth-devel + +# Libs for runtime (and thus also available for the NSIS installer to include the dependencies) +Requires: mingw32-gtk2 +Requires: mingw32-libexpat1 +Requires: mingw32-libcurl4 +Requires: mingw32-libgexiv2 +Requires: mingw32-libstdc++6 +Requires: mingw32-libsqlite3-0 +Requires: mingw32-libzip4 +Requires: mingw32-libnettle +Requires: mingw32-libgps +Requires: mingw32-liboauth +# Currently running makensis in seperate script - so you will need it then +#Requires: mingw32-cross-nsis + +%description +Viking is a free/open source program to manage GPS data. +You can import, plot and create tracks, routes and waypoints, show OSM and other maps, see real-time GPS position, control items, etc. +Other advanced capabilities include Geotagging Images, generate Maps (using Mapnik), Upload and Download tracks from OSM, Routing from OSRM or Google, Name Searches from OSM Nominatim or Google and more. +It is written in mainly in C with some C++ and uses the GTK+2 toolkit. + +%prep +%setup -q -n %{_pkg_name}-%{version} + +%build +# Create Icon +pushd windows/installer/pixmaps +%{_mingw32_windres} viking_icon.rc -o viking_icon.o +popd + +# +# Specifics for Windows build - i.e. no Mapnik yet +%{_mingw32_configure}\ + --disable-realtime-gps-tracking \ + --disable-mapnik \ + --disable-geoclue \ + --disable-scrollkeeper \ + --enable-windows \ + CFLAGS="-DWINDOWS -DWIN32 -mwindows" + +%{_mingw32_make} %{?_smp_mflags} + +%install +pushd src +%{_mingw32_strip} -g %{_pkg_name}.exe +popd + +%make_install + +%find_lang %{_pkg_name} + +%clean +#rm -rf %{buildroot} + +%files -f %{_pkg_name}.lang +%defattr(-,root,root) +%doc AUTHORS ChangeLog COPYING NEWS README.md doc/ +%{_mingw32_bindir}/*%{_pkg_name}.exe +%{_mingw32_datadir}/applications/%{_pkg_name}.desktop +%{_mingw32_datadir}/%{_pkg_name} +%{_mingw32_datadir}/icons/hicolor/*/apps/%{_pkg_name}.* +%exclude %{_mingw32_datadir}/icons/hicolor/icon-theme.cache +#%{_mingw32_mandir}/man1/* + +%changelog diff --git a/mingw-viking.spec.in b/mingw-viking.spec.in new file mode 100644 index 0000000..c450d4f --- /dev/null +++ b/mingw-viking.spec.in @@ -0,0 +1,113 @@ +# Public Domain CC0 +%{?mingw_package_header} +%define _pkg_name viking +Name: mingw32-%{_pkg_name} +Version: @VERSION@ +Release: 1 +Summary: GPS data editor and analyzer +Group: Applications/Productivity +License: GPLv2 +URL: http://sourceforge.net/projects/viking/ +Source0: %{_pkg_name}-%{version}.tar.gz +BuildRoot: %{_tmppath}/%{name}-%{version}-%{release}-root-%(%{__id_u} -n) +BuildArch: noarch + +# 32bit version only in this file. See mingw64-viking.spec for the 64bit version + +# Programs to enable the cross build +BuildRequires: mingw32-filesystem +BuildRequires: mingw32-binutils +BuildRequires: mingw32-runtime +BuildRequires: mingw32-cross-binutils +BuildRequires: mingw32-cross-gcc +BuildRequires: mingw32-cross-pkg-config +BuildRequires: mingw32-gettext-tools +BuildRequires: mingw32-gnome-doc-utils-devel +BuildRequires: intltool +BuildRequires: gdk-pixbuf-devel +# ^For gdk-pixbuf-csource + +# Code +# Not worried about versions ATM +BuildRequires: mingw32-gtk2-devel +# ATM gtk2-devel auto includes at least devel versions of glib2, gobject, zlib and more + +# Mandatory libraries +BuildRequires: mingw32-libexpat-devel +BuildRequires: mingw32-libcurl-devel +# Optional libraries +BuildRequires: mingw32-libgexiv2-devel +BuildRequires: mingw32-libbz2-devel +BuildRequires: mingw32-file-devel +BuildRequires: mingw32-libmagic1 +BuildRequires: mingw32-libbz2-1 +BuildRequires: mingw32-sqlite-devel +BuildRequires: mingw32-libzip-devel +BuildRequires: mingw32-libnettle-devel +BuildRequires: mingw32-libgps-devel +BuildRequires: mingw32-liboauth-devel + +# Libs for runtime (and thus also available for the NSIS installer to include the dependencies) +Requires: mingw32-gtk2 +Requires: mingw32-libexpat1 +Requires: mingw32-libcurl4 +Requires: mingw32-libgexiv2 +Requires: mingw32-libstdc++6 +Requires: mingw32-libsqlite3-0 +Requires: mingw32-libzip4 +Requires: mingw32-libnettle +Requires: mingw32-libgps +Requires: mingw32-liboauth +# Currently running makensis in seperate script - so you will need it then +#Requires: mingw32-cross-nsis + +%description +Viking is a free/open source program to manage GPS data. +You can import, plot and create tracks, routes and waypoints, show OSM and other maps, see real-time GPS position, control items, etc. +Other advanced capabilities include Geotagging Images, generate Maps (using Mapnik), Upload and Download tracks from OSM, Routing from OSRM or Google, Name Searches from OSM Nominatim or Google and more. +It is written in mainly in C with some C++ and uses the GTK+2 toolkit. + +%prep +%setup -q -n %{_pkg_name}-%{version} + +%build +# Create Icon +pushd windows/installer/pixmaps +%{_mingw32_windres} viking_icon.rc -o viking_icon.o +popd + +# +# Specifics for Windows build - i.e. no Mapnik yet +%{_mingw32_configure}\ + --disable-realtime-gps-tracking \ + --disable-mapnik \ + --disable-geoclue \ + --disable-scrollkeeper \ + --enable-windows \ + CFLAGS="-DWINDOWS -DWIN32 -mwindows" + +%{_mingw32_make} %{?_smp_mflags} + +%install +pushd src +%{_mingw32_strip} -g %{_pkg_name}.exe +popd + +%make_install + +%find_lang %{_pkg_name} + +%clean +#rm -rf %{buildroot} + +%files -f %{_pkg_name}.lang +%defattr(-,root,root) +%doc AUTHORS ChangeLog COPYING NEWS README.md doc/ +%{_mingw32_bindir}/*%{_pkg_name}.exe +%{_mingw32_datadir}/applications/%{_pkg_name}.desktop +%{_mingw32_datadir}/%{_pkg_name} +%{_mingw32_datadir}/icons/hicolor/*/apps/%{_pkg_name}.* +%exclude %{_mingw32_datadir}/icons/hicolor/icon-theme.cache +#%{_mingw32_mandir}/man1/* + +%changelog diff --git a/mingw64-viking.spec b/mingw64-viking.spec new file mode 100644 index 0000000..dd9ba9b --- /dev/null +++ b/mingw64-viking.spec @@ -0,0 +1,112 @@ +# Public Domain CC0 +%{?mingw_package_header} +%define _pkg_name viking +Name: mingw64-%{_pkg_name} +Version: 1.7 +Release: 1 +Summary: GPS data editor and analyzer +Group: Applications/Productivity +License: GPLv2 +URL: http://sourceforge.net/projects/viking/ +Source0: %{_pkg_name}-%{version}.tar.gz +BuildRoot: %{_tmppath}/%{name}-%{version}-build +BuildArch: noarch + +# 64bit version only in this file. See mingw-viking.spec for the 32bit version + +# Programs to enable the cross build +BuildRequires: mingw64-filesystem +BuildRequires: mingw64-binutils +BuildRequires: mingw64-runtime +BuildRequires: mingw64-cross-binutils +BuildRequires: mingw64-cross-gcc +BuildRequires: mingw64-cross-pkg-config +BuildRequires: mingw64-gettext-tools +BuildRequires: mingw64-gnome-doc-utils-devel +BuildRequires: intltool +BuildRequires: gdk-pixbuf-devel +# ^For gdk-pixbuf-csource + +# Code +# Not worried about versions ATM +BuildRequires: mingw64-gtk2-devel +# ATM gtk2-devel auto includes at least devel versions of glib2, gobject, zlib and more + +# Mandatory libraries +BuildRequires: mingw64-libexpat-devel +BuildRequires: mingw64-libcurl-devel +# Optional libraries +BuildRequires: mingw64-libgexiv2-devel +BuildRequires: mingw64-libbz2-devel +BuildRequires: mingw64-file-devel +BuildRequires: mingw64-libmagic1 +BuildRequires: mingw64-libbz2-1 +BuildRequires: mingw64-sqlite-devel +BuildRequires: mingw64-libzip-devel +BuildRequires: mingw64-libnettle-devel +BuildRequires: mingw64-libgps-devel +BuildRequires: mingw64-liboauth-devel + +# Libs for runtime (and thus also available for the NSIS installer to include the dependencies) +Requires: mingw64-gtk2 +Requires: mingw64-libexpat1 +Requires: mingw64-libcurl4 +Requires: mingw64-libgexiv2 +Requires: mingw64-libstdc++6 +Requires: mingw64-libsqlite3-0 +Requires: mingw64-libzip4 +Requires: mingw64-libnettle +Requires: mingw64-liboauth +# Currently running makensis in seperate script - so you will need it then +# NB No 64bit version available +#Requires: mingw32-cross-nsis + +%description +Viking is a free/open source program to manage GPS data. +You can import, plot and create tracks, routes and waypoints, show OSM and other maps, see real-time GPS position, control items, etc. +Other advanced capabilities include Geotagging Images, generate Maps (using Mapnik), Upload and Download tracks from OSM, Routing from OSRM or Google, Name Searches from OSM Nominatim or Google and more. +It is written in mainly in C with some C++ and uses the GTK+2 toolkit. + +%prep +%setup -q -n %{_pkg_name}-%{version} + +%build +# Create Icon +pushd windows/installer/pixmaps +%{_mingw64_windres} viking_icon.rc -o viking_icon.o +popd + +# +# Specifics for Windows build - i.e. no Mapnik yet +%{_mingw64_configure}\ + --disable-mapnik \ + --disable-geoclue \ + --disable-scrollkeeper \ + --enable-windows \ + CFLAGS="-DWINDOWS -DWIN32 -mwindows" +# NB not sure if '-DWIN32' is necessary/applicable for a 64bit build... + +%{_mingw64_make} %{?_smp_mflags} + +%install +pushd src +%{_mingw64_strip} -g %{_pkg_name}.exe +popd + +%make_install + +%find_lang %{_pkg_name} + +%clean +rm -rf %{buildroot} + +%files -f %{_pkg_name}.lang +%defattr(-,root,root) +%doc AUTHORS ChangeLog COPYING NEWS README.md doc/ +%{_mingw64_bindir}/*%{_pkg_name}.exe +%{_mingw64_datadir}/applications/%{_pkg_name}.desktop +%{_mingw64_datadir}/%{_pkg_name} +%{_mingw64_datadir}/icons/hicolor/*/apps/%{_pkg_name}.* +%exclude %{_mingw64_datadir}/icons/hicolor/icon-theme.cache + +%changelog diff --git a/mingw64-viking.spec.in b/mingw64-viking.spec.in new file mode 100644 index 0000000..8bc4ea8 --- /dev/null +++ b/mingw64-viking.spec.in @@ -0,0 +1,112 @@ +# Public Domain CC0 +%{?mingw_package_header} +%define _pkg_name viking +Name: mingw64-%{_pkg_name} +Version: @VERSION@ +Release: 1 +Summary: GPS data editor and analyzer +Group: Applications/Productivity +License: GPLv2 +URL: http://sourceforge.net/projects/viking/ +Source0: %{_pkg_name}-%{version}.tar.gz +BuildRoot: %{_tmppath}/%{name}-%{version}-build +BuildArch: noarch + +# 64bit version only in this file. See mingw-viking.spec for the 32bit version + +# Programs to enable the cross build +BuildRequires: mingw64-filesystem +BuildRequires: mingw64-binutils +BuildRequires: mingw64-runtime +BuildRequires: mingw64-cross-binutils +BuildRequires: mingw64-cross-gcc +BuildRequires: mingw64-cross-pkg-config +BuildRequires: mingw64-gettext-tools +BuildRequires: mingw64-gnome-doc-utils-devel +BuildRequires: intltool +BuildRequires: gdk-pixbuf-devel +# ^For gdk-pixbuf-csource + +# Code +# Not worried about versions ATM +BuildRequires: mingw64-gtk2-devel +# ATM gtk2-devel auto includes at least devel versions of glib2, gobject, zlib and more + +# Mandatory libraries +BuildRequires: mingw64-libexpat-devel +BuildRequires: mingw64-libcurl-devel +# Optional libraries +BuildRequires: mingw64-libgexiv2-devel +BuildRequires: mingw64-libbz2-devel +BuildRequires: mingw64-file-devel +BuildRequires: mingw64-libmagic1 +BuildRequires: mingw64-libbz2-1 +BuildRequires: mingw64-sqlite-devel +BuildRequires: mingw64-libzip-devel +BuildRequires: mingw64-libnettle-devel +BuildRequires: mingw64-libgps-devel +BuildRequires: mingw64-liboauth-devel + +# Libs for runtime (and thus also available for the NSIS installer to include the dependencies) +Requires: mingw64-gtk2 +Requires: mingw64-libexpat1 +Requires: mingw64-libcurl4 +Requires: mingw64-libgexiv2 +Requires: mingw64-libstdc++6 +Requires: mingw64-libsqlite3-0 +Requires: mingw64-libzip4 +Requires: mingw64-libnettle +Requires: mingw64-liboauth +# Currently running makensis in seperate script - so you will need it then +# NB No 64bit version available +#Requires: mingw32-cross-nsis + +%description +Viking is a free/open source program to manage GPS data. +You can import, plot and create tracks, routes and waypoints, show OSM and other maps, see real-time GPS position, control items, etc. +Other advanced capabilities include Geotagging Images, generate Maps (using Mapnik), Upload and Download tracks from OSM, Routing from OSRM or Google, Name Searches from OSM Nominatim or Google and more. +It is written in mainly in C with some C++ and uses the GTK+2 toolkit. + +%prep +%setup -q -n %{_pkg_name}-%{version} + +%build +# Create Icon +pushd windows/installer/pixmaps +%{_mingw64_windres} viking_icon.rc -o viking_icon.o +popd + +# +# Specifics for Windows build - i.e. no Mapnik yet +%{_mingw64_configure}\ + --disable-mapnik \ + --disable-geoclue \ + --disable-scrollkeeper \ + --enable-windows \ + CFLAGS="-DWINDOWS -DWIN32 -mwindows" +# NB not sure if '-DWIN32' is necessary/applicable for a 64bit build... + +%{_mingw64_make} %{?_smp_mflags} + +%install +pushd src +%{_mingw64_strip} -g %{_pkg_name}.exe +popd + +%make_install + +%find_lang %{_pkg_name} + +%clean +rm -rf %{buildroot} + +%files -f %{_pkg_name}.lang +%defattr(-,root,root) +%doc AUTHORS ChangeLog COPYING NEWS README.md doc/ +%{_mingw64_bindir}/*%{_pkg_name}.exe +%{_mingw64_datadir}/applications/%{_pkg_name}.desktop +%{_mingw64_datadir}/%{_pkg_name} +%{_mingw64_datadir}/icons/hicolor/*/apps/%{_pkg_name}.* +%exclude %{_mingw64_datadir}/icons/hicolor/icon-theme.cache + +%changelog diff --git a/missing b/missing new file mode 100755 index 0000000..625aeb1 --- /dev/null +++ b/missing @@ -0,0 +1,215 @@ +#! /bin/sh +# Common wrapper for a few potentially missing GNU programs. + +scriptversion=2018-03-07.03; # UTC + +# Copyright (C) 1996-2018 Free Software Foundation, Inc. +# Originally written by Fran,cois Pinard , 1996. + +# 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, 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, see . + +# As a special exception to the GNU General Public License, if you +# distribute this file as part of a program that contains a +# configuration script generated by Autoconf, you may include it under +# the same distribution terms that you use for the rest of that program. + +if test $# -eq 0; then + echo 1>&2 "Try '$0 --help' for more information" + exit 1 +fi + +case $1 in + + --is-lightweight) + # Used by our autoconf macros to check whether the available missing + # script is modern enough. + exit 0 + ;; + + --run) + # Back-compat with the calling convention used by older automake. + shift + ;; + + -h|--h|--he|--hel|--help) + echo "\ +$0 [OPTION]... PROGRAM [ARGUMENT]... + +Run 'PROGRAM [ARGUMENT]...', returning a proper advice when this fails due +to PROGRAM being missing or too old. + +Options: + -h, --help display this help and exit + -v, --version output version information and exit + +Supported PROGRAM values: + aclocal autoconf autoheader autom4te automake makeinfo + bison yacc flex lex help2man + +Version suffixes to PROGRAM as well as the prefixes 'gnu-', 'gnu', and +'g' are ignored when checking the name. + +Send bug reports to ." + exit $? + ;; + + -v|--v|--ve|--ver|--vers|--versi|--versio|--version) + echo "missing $scriptversion (GNU Automake)" + exit $? + ;; + + -*) + echo 1>&2 "$0: unknown '$1' option" + echo 1>&2 "Try '$0 --help' for more information" + exit 1 + ;; + +esac + +# Run the given program, remember its exit status. +"$@"; st=$? + +# If it succeeded, we are done. +test $st -eq 0 && exit 0 + +# Also exit now if we it failed (or wasn't found), and '--version' was +# passed; such an option is passed most likely to detect whether the +# program is present and works. +case $2 in --version|--help) exit $st;; esac + +# Exit code 63 means version mismatch. This often happens when the user +# tries to use an ancient version of a tool on a file that requires a +# minimum version. +if test $st -eq 63; then + msg="probably too old" +elif test $st -eq 127; then + # Program was missing. + msg="missing on your system" +else + # Program was found and executed, but failed. Give up. + exit $st +fi + +perl_URL=https://www.perl.org/ +flex_URL=https://github.com/westes/flex +gnu_software_URL=https://www.gnu.org/software + +program_details () +{ + case $1 in + aclocal|automake) + echo "The '$1' program is part of the GNU Automake package:" + echo "<$gnu_software_URL/automake>" + echo "It also requires GNU Autoconf, GNU m4 and Perl in order to run:" + echo "<$gnu_software_URL/autoconf>" + echo "<$gnu_software_URL/m4/>" + echo "<$perl_URL>" + ;; + autoconf|autom4te|autoheader) + echo "The '$1' program is part of the GNU Autoconf package:" + echo "<$gnu_software_URL/autoconf/>" + echo "It also requires GNU m4 and Perl in order to run:" + echo "<$gnu_software_URL/m4/>" + echo "<$perl_URL>" + ;; + esac +} + +give_advice () +{ + # Normalize program name to check for. + normalized_program=`echo "$1" | sed ' + s/^gnu-//; t + s/^gnu//; t + s/^g//; t'` + + printf '%s\n' "'$1' is $msg." + + configure_deps="'configure.ac' or m4 files included by 'configure.ac'" + case $normalized_program in + autoconf*) + echo "You should only need it if you modified 'configure.ac'," + echo "or m4 files included by it." + program_details 'autoconf' + ;; + autoheader*) + echo "You should only need it if you modified 'acconfig.h' or" + echo "$configure_deps." + program_details 'autoheader' + ;; + automake*) + echo "You should only need it if you modified 'Makefile.am' or" + echo "$configure_deps." + program_details 'automake' + ;; + aclocal*) + echo "You should only need it if you modified 'acinclude.m4' or" + echo "$configure_deps." + program_details 'aclocal' + ;; + autom4te*) + echo "You might have modified some maintainer files that require" + echo "the 'autom4te' program to be rebuilt." + program_details 'autom4te' + ;; + bison*|yacc*) + echo "You should only need it if you modified a '.y' file." + echo "You may want to install the GNU Bison package:" + echo "<$gnu_software_URL/bison/>" + ;; + lex*|flex*) + echo "You should only need it if you modified a '.l' file." + echo "You may want to install the Fast Lexical Analyzer package:" + echo "<$flex_URL>" + ;; + help2man*) + echo "You should only need it if you modified a dependency" \ + "of a man page." + echo "You may want to install the GNU Help2man package:" + echo "<$gnu_software_URL/help2man/>" + ;; + makeinfo*) + echo "You should only need it if you modified a '.texi' file, or" + echo "any other file indirectly affecting the aspect of the manual." + echo "You might want to install the Texinfo package:" + echo "<$gnu_software_URL/texinfo/>" + echo "The spurious makeinfo call might also be the consequence of" + echo "using a buggy 'make' (AIX, DU, IRIX), in which case you might" + echo "want to install GNU make:" + echo "<$gnu_software_URL/make/>" + ;; + *) + echo "You might have modified some files without having the proper" + echo "tools for further handling them. Check the 'README' file, it" + echo "often tells you about the needed prerequisites for installing" + echo "this package. You may also peek at any GNU archive site, in" + echo "case some other package contains this missing '$1' program." + ;; + esac +} + +give_advice "$1" | sed -e '1s/^/WARNING: /' \ + -e '2,$s/^/ /' >&2 + +# Propagate the correct exit status (expected to be 127 for a program +# not found, 63 for a program that failed due to version mismatch). +exit $st + +# Local variables: +# eval: (add-hook 'before-save-hook 'time-stamp) +# time-stamp-start: "scriptversion=" +# time-stamp-format: "%:y-%02m-%02d.%02H" +# time-stamp-time-zone: "UTC0" +# time-stamp-end: "; # UTC" +# End: diff --git a/mkinstalldirs b/mkinstalldirs new file mode 100755 index 0000000..36aa909 --- /dev/null +++ b/mkinstalldirs @@ -0,0 +1,162 @@ +#! /bin/sh +# mkinstalldirs --- make directory hierarchy + +scriptversion=2018-03-07.03; # UTC + +# Original author: Noah Friedman +# Created: 1993-05-16 +# Public domain. +# +# This file is maintained in Automake, please report +# bugs to or send patches to +# . + +nl=' +' +IFS=" "" $nl" +errstatus=0 +dirmode= + +usage="\ +Usage: mkinstalldirs [-h] [--help] [--version] [-m MODE] DIR ... + +Create each directory DIR (with mode MODE, if specified), including all +leading file name components. + +Report bugs to ." + +# process command line arguments +while test $# -gt 0 ; do + case $1 in + -h | --help | --h*) # -h for help + echo "$usage" + exit $? + ;; + -m) # -m PERM arg + shift + test $# -eq 0 && { echo "$usage" 1>&2; exit 1; } + dirmode=$1 + shift + ;; + --version) + echo "$0 $scriptversion" + exit $? + ;; + --) # stop option processing + shift + break + ;; + -*) # unknown option + echo "$usage" 1>&2 + exit 1 + ;; + *) # first non-opt arg + break + ;; + esac +done + +for file +do + if test -d "$file"; then + shift + else + break + fi +done + +case $# in + 0) exit 0 ;; +esac + +# Solaris 8's mkdir -p isn't thread-safe. If you mkdir -p a/b and +# mkdir -p a/c at the same time, both will detect that a is missing, +# one will create a, then the other will try to create a and die with +# a "File exists" error. This is a problem when calling mkinstalldirs +# from a parallel make. We use --version in the probe to restrict +# ourselves to GNU mkdir, which is thread-safe. +case $dirmode in + '') + if mkdir -p --version . >/dev/null 2>&1 && test ! -d ./--version; then + echo "mkdir -p -- $*" + exec mkdir -p -- "$@" + else + # On NextStep and OpenStep, the 'mkdir' command does not + # recognize any option. It will interpret all options as + # directories to create, and then abort because '.' already + # exists. + test -d ./-p && rmdir ./-p + test -d ./--version && rmdir ./--version + fi + ;; + *) + if mkdir -m "$dirmode" -p --version . >/dev/null 2>&1 && + test ! -d ./--version; then + echo "mkdir -m $dirmode -p -- $*" + exec mkdir -m "$dirmode" -p -- "$@" + else + # Clean up after NextStep and OpenStep mkdir. + for d in ./-m ./-p ./--version "./$dirmode"; + do + test -d $d && rmdir $d + done + fi + ;; +esac + +for file +do + case $file in + /*) pathcomp=/ ;; + *) pathcomp= ;; + esac + oIFS=$IFS + IFS=/ + set fnord $file + shift + IFS=$oIFS + + for d + do + test "x$d" = x && continue + + pathcomp=$pathcomp$d + case $pathcomp in + -*) pathcomp=./$pathcomp ;; + esac + + if test ! -d "$pathcomp"; then + echo "mkdir $pathcomp" + + mkdir "$pathcomp" || lasterr=$? + + if test ! -d "$pathcomp"; then + errstatus=$lasterr + else + if test ! -z "$dirmode"; then + echo "chmod $dirmode $pathcomp" + lasterr= + chmod "$dirmode" "$pathcomp" || lasterr=$? + + if test ! -z "$lasterr"; then + errstatus=$lasterr + fi + fi + fi + fi + + pathcomp=$pathcomp/ + done +done + +exit $errstatus + +# Local Variables: +# mode: shell-script +# sh-indentation: 2 +# eval: (add-hook 'before-save-hook 'time-stamp) +# time-stamp-start: "scriptversion=" +# time-stamp-format: "%:y-%02m-%02d.%02H" +# time-stamp-time-zone: "UTC0" +# time-stamp-end: "; # UTC" +# End: diff --git a/po/ChangeLog b/po/ChangeLog new file mode 100644 index 0000000..b36c94a --- /dev/null +++ b/po/ChangeLog @@ -0,0 +1,492 @@ +2018-10-28 Guido Scholz + * de.po: updated + +2018-07-13 Nikolay Korotkiy + * ru.po: updated + +2017-04-26 Po-Hsu Lin + * zh_TW.po: updated + +2017-01-31 Rokar ✌ + * ku.po: updated + +2017-01-24 huobos + * zh_CN.po: updated + +2016-04-10 Alexander Gabilondo + * eu.po: updated + +2016-01-10 Djiboun + * fr.po: updated + +2015-08-29 Jocelyn + * fr.po: updated + +2015-05-06 Nitin Ullal + * de.po: updated + +2015-04-12 Сергій Дубик + * uk.po: updated + +2015-03-30 Radek Stastny + * cs.po: updated + +2015-02-10 Aleksey Kabanov + * ru.po: updated + +2015-02-05 Nitin Ullal + * de.po: updated + +2014-09-11 Rob Norris + * en_GB.po: updated + +2014-07-09 myziny + * ko.po: updated + +2014-04-22 Ibai Oihanguren Sala + * eu.po: updated + +2014-04-09 Po-Hsu Lin + * zh_TW.po: updated + +2014-02-20 Ján Neščivera + * sk.po: updated + +2014-01-21 Xuacu Saturio + * ast.po: updated + +2014-01-17 Radek Stastny + * cs.po: updated + +2013-09-28 lann + * fr.po: updated + +2013-09-17 Alexander + * ru.po: updated + +2013-09-05 Radek Stastny + * cs.po: updated + +2013-06-30 Cristian Marchi + * it.po: updated + +2013-06-18 Tim Schulz + * de.po: updated + +2013-05-25 Xuacu Saturio + * ast.po: updated + +2013-05-17 Mantas Kriaučiūnas + * lt.po: updated + +2013-03-22 Xuacu Saturio + * ast.po: created + +2013-03-07 Wylmer Wang + * zh_CN.po: updated + +2013-03-06 Radek Stastny + * cs.po: updated + +2013-02-05 Rob Norris + * en_GB.po: updated + +2013-01-26 Rob Norris + * en_GB.po: updated + +2012-11-13 Jorma Karvonen + * fi.po: updated + +2012-11-07 Wonderfulheart + * it.po: updated + +2012-11-04 Maxime Teixeira + * fr.po: updated + +2012-11-04 Aiguanachein + * es.po: updated + +2012-10-29 Dmitri Bogomolov + * ru.po: updated + +2012-08-17 Guido Scholz + * de.po: updated + +2012-08-15 Dirk Roos + * nl.po: updated + +2012-04-23 Radek Stastny + * cs.po: updated + +2012-03-26 Dennis Baudys + * de.po: updated + +2012-02-02 Vyacheslav Sharmanov + * ru.po: updated + +2011-12-31 Jonay + * es.po: updated + +2011-10-04 Mantas Kriaučiūnas + * lt.po: updated + +2011-10-02 Jordi Hortigüela + * ca.po: added + +2011-09-26 György Balló + * hu.po: updated + +2011-09-20 Cristian Marchi + * it.po: updated + +2011-09-17 Rob Norris + * en_GB.po: updated + +2011-09-17 Nicolas ELIE + * fr.po: updated + +2011-06-09 Sam Samuels + * pt_BR.po: updated + +2011-05-09 sezaiyeniay + * tr.po: new + +2011-05-04 Dmitri Bogomolov + * ru.po: updated + +2011-04-29 eknus + * de.po: updated + +2011-04-29 Alessi Andrea + * it.po: updated + +2011-04-23 Radek Stastny + * cs.po: updated + +2011-03-08 英华 + * zh_CN.po: updated + +2011-02-08 Guilhem Bonnefille + * fr.po: updated + +2011-02-06 Radek Stastny + * cs.po: updated + +2011-02-03 György Balló + * hu.po: updated + +2011-02-01 Colegota + * es.po: updated + +2011-01-10 FULL NAME + * jv.po: updated + +2011-01-10 Arief Setiadi Wibowo + * id.po: updated + +2010-12-30 Erik Simmesgård + * sv.po: updated + +2010-12-19 asphyxia + * nl.po: updated + +2010-12-08 Júlio Cezar Santos Pires + * pt_BR.po: updated + +2010-11-21 Patricio Carreño Mancilla + * es.po: updated + +2010-11-17 György Balló + * hu.po: updated + +2010-11-17 Guilhem Bonnefille + * zh_TW.po: updated + +2010-11-17 Guilhem Bonnefille + * nb.po: updated + +2010-11-17 Guilhem Bonnefille + * it.po: updated + +2010-11-17 Guilhem Bonnefille + * da.po: updated + +2010-11-17 Eleanor Chen + * zh_CN.po: updated + +2010-11-17 eknus + * de.po: updated + +2010-11-16 Guilhem Bonnefille + * fr.po: updated + +2010-11-16 Guilhem Bonnefille + * el.po: updated + +2010-11-16 Guilhem Bonnefille + * cs.po: updated + +2010-11-12 Jean-Paul GERST + * fr.po: updated + +2010-11-03 eknus + * de.po: updated + +2010-11-01 Radek Stastny + * cs.po: updated + +2010-10-17 simone.sandri + * it.po: updated + +2010-10-11 aitolos + * el.po: updated + +2010-09-26 WillyTM + * de.po: updated + +2010-09-14 Radek Stastny + * cs.po: updated + +2010-09-07 Jonay + * es.po: updated + +2010-09-07 issyl0 + * en_GB.po: updated + +2010-09-07 Guilhem Bonnefille + * da.po, de.po, el.po, es.po, fr.po, id.po, it.po, lt.po, nb.po, pl.po, pt_BR.po, sl.po, sv.po, zh_CN.po, zh_TW.po: restore as many translations as possible + +2010-09-01 Jonay + * es.po: updated + +2010-08-21 FULL NAME + * uk.po: updated + +2010-08-21 Dmitri Bogomolov + * ru.po: updated + +2010-08-02 Arief Setiadi Wibowo + * id.po: updated + +2010-07-29 skrzat + * pl.po: updated + +2010-07-14 Radek Stastny + * cs.po: updated + +2010-06-24 Mathieu A + * fr.po: updated + +2010-06-09 Gustavo Guidorizzi + * pt_BR.po: updated + +2010-06-07 Eleanor Chen + * zh_CN.po: updated + +2010-05-01 Erik Simmesgård + * sv.po: updated + +2010-04-23 Mathieu A + * fr.po: updated + +2010-04-22 DiegoJ + * es.po: updated + +2010-04-16 skrzat + * pl.po: updated + +2010-04-12 Vladimir G. Galkin + * ru.po: updated + +2010-03-28 aitolos + * el.po: updated + +2010-03-25 Juan Eduardo Riva + * es.po: updated + +2010-03-20 Fabian Affolter + * de.po: updated + +2010-03-16 Radek Stastny + * cs.po: updated + +2010-02-25 issyl0 + * en_GB.po: updated + +2010-02-25 GP Frello + * it.po: updated + +2010-02-19 Fabian Affolter + * de.po: updated + +2010-02-11 Auduf <5097@mail.ru> + * ru.po: updated + +2010-02-10 Radek Stastny + * cs.po: updated + +2010-02-05 Guilhem Bonnefille + * import launchpad files + * Declare new translations + +2010-01-03 Jarosław Ogrodnik + * de.po: updated + +2009-12-09 Giwex + * it.po: updated + +2009-12-08 Cadu + * pt_BR.po: updated + +2009-11-02 Arief Setiadi Wibowo + * id.po: updated + +2009-10-29 shizhao + * zh_CN.po: updated + +2009-10-17 Tognu + * es.po: updated + +2009-10-08 tonio_73 + * fr.po: updated + +2009-10-02 ΑναστόπουλοςΧάρης + * el.po: updated + +2009-10-12 Guilhem Bonnefille + * Declare new translations + +2009-09-09 Guilhem Bonnefille + * import launchpad files + +2009-09-07 rainofchaos + * zh_CN.po: updated + +2009-09-06 Federico Vera + * es.po: updated + +2009-09-02 Guilhem Bonnefille + * fr.po: updated + +2009-08-31 EliotBlennerhassett + * en_GB.po: created + +2009-08-20 Dainius Sakalinskas + * lt.po: updated + +2009-08-20 Alessi Andrea + * it.po: updated + +2009-08-20 Radek Stastny + * cs.po: updated + +2009-08-18 Guilhem Bonnefille + * import launchpad files + +2009-07-30 MarcusLS + * de.po: updated + +2009-07-20 skrzat + * pl.po: updated + +2009-05-23 MeltingShell + * it.po: updated + +2009-05-01 Mikael Olofsson + * sv.po: updated + +2009-04-04 Tadas Masiulionis + * lt.po: updated + +2009-02-08 Guilhem Bonnefille + * fr.po: updated + +2009-02-05 Radek Stastny + * cs.po: updated + +2009-02-04 Guilhem Bonnefille + * Automatic update files and manual correction + +2008-09-30 Viesturs Zariņš + * lv.po: added + +2008-09-16 Guilhem Bonnefille + * Automatic update files and manual correction + +2008-09-06 Aron Xu + * updated zh_CN.po + +2008-09-06 Tognu + * updated es.po + +2008-09-04 Štefan Baebler + * added sl.po + +2008-08-18 Krylov Ilya + * added he.po, ru.po + +2008-08-08 Ufis + * updated it.po + +2008-07-25 Radek Stastny + * updated cz.po + +2008-07-21 Zhang Jun + * updated zh_TW.po + +2008-07-21 Radek Stastny + * updated cz.po + +2008-07-17 Dainius Sakalinskas + * added lt.po + +2008-07-12 Mikael Olofsson + * sw.po + +2008-07-11 Katz Kawai + * added ja.po + +2008-07-11 Jocelyn Jaubert + * fr.po + +2008-07-09 Guilhem Bonnefille + * Update files + +2008-05-24 Emilio Gómez Fernández + * es.po + +2008-04-12 Zhang Jun + * zh_TW.po, zh_CN.po + +2008-04-10 Tomasz + * pl.po + +2008-03-29 Liam Zwitser + * nl.po + +2008-03-28 kingu + * nb.po + +2008-03-22 Pierre Slamich + * fr.po + +2008-03-11 Alessi Andrea + * it.po + +2008-02-22 George & Elina + * el.po + +2008-02-15 Guilhem Bonnefille + * cs.po, da.po, de.po, es.po, pt_BR.po, sv.po: + Added translations from LaunchPad.net + +2007-12-15 Jocelyn Jaubert + * fr.po: + French translation updated + +2007-12-13 Guilhem Bonnefille + * fr.po: + Added French translation + +2007-11-26 Guilhem Bonnefille + * Start I18N diff --git a/po/LINGUAS b/po/LINGUAS new file mode 100644 index 0000000..637b557 --- /dev/null +++ b/po/LINGUAS @@ -0,0 +1,34 @@ +# Supported languages +ast +ca +cs +da +de +el +en_GB +es +eu +fi +fr +he +hu +id +it +ja +jv +ko +ku +lt +lv +nb +nl +pl +pt_BR +ru +sk +sl +sv +tr +uk +zh_CN +zh_TW diff --git a/po/Makefile.in.in b/po/Makefile.in.in new file mode 100644 index 0000000..fcd2c3b --- /dev/null +++ b/po/Makefile.in.in @@ -0,0 +1,221 @@ +# Makefile for program source directory in GNU NLS utilities package. +# Copyright (C) 1995, 1996, 1997 by Ulrich Drepper +# Copyright (C) 2004-2008 Rodney Dawes +# +# This file may be copied and used freely without restrictions. It may +# be used in projects which are not available under a GNU Public License, +# but which still want to provide support for the GNU gettext functionality. +# +# - Modified by Owen Taylor to use GETTEXT_PACKAGE +# instead of PACKAGE and to look for po2tbl in ./ not in intl/ +# +# - Modified by jacob berkman to install +# Makefile.in.in and po2tbl.sed.in for use with glib-gettextize +# +# - Modified by Rodney Dawes for use with intltool +# +# We have the following line for use by intltoolize: +# INTLTOOL_MAKEFILE + +GETTEXT_PACKAGE = @GETTEXT_PACKAGE@ +PACKAGE = @PACKAGE@ +VERSION = @VERSION@ + +SHELL = @SHELL@ + +srcdir = @srcdir@ +top_srcdir = @top_srcdir@ +top_builddir = @top_builddir@ +VPATH = @srcdir@ + +prefix = @prefix@ +exec_prefix = @exec_prefix@ +datadir = @datadir@ +datarootdir = @datarootdir@ +libdir = @libdir@ +localedir = @localedir@ +subdir = po +install_sh = @install_sh@ +# Automake >= 1.8 provides @mkdir_p@. +# Until it can be supposed, use the safe fallback: +mkdir_p = $(install_sh) -d + +INSTALL = @INSTALL@ +INSTALL_DATA = @INSTALL_DATA@ + +GMSGFMT = @GMSGFMT@ +MSGFMT = @MSGFMT@ +XGETTEXT = @XGETTEXT@ +INTLTOOL_UPDATE = @INTLTOOL_UPDATE@ +INTLTOOL_EXTRACT = @INTLTOOL_EXTRACT@ +MSGMERGE = INTLTOOL_EXTRACT="$(INTLTOOL_EXTRACT)" XGETTEXT="$(XGETTEXT)" srcdir=$(srcdir) $(INTLTOOL_UPDATE) --gettext-package $(GETTEXT_PACKAGE) --dist +GENPOT = INTLTOOL_EXTRACT="$(INTLTOOL_EXTRACT)" XGETTEXT="$(XGETTEXT)" srcdir=$(srcdir) $(INTLTOOL_UPDATE) --gettext-package $(GETTEXT_PACKAGE) --pot + +ALL_LINGUAS = @ALL_LINGUAS@ + +PO_LINGUAS=$(shell if test -r $(srcdir)/LINGUAS; then grep -v "^\#" $(srcdir)/LINGUAS; else echo "$(ALL_LINGUAS)"; fi) + +USER_LINGUAS=$(shell if test -n "$(LINGUAS)"; then LLINGUAS="$(LINGUAS)"; ALINGUAS="$(ALL_LINGUAS)"; for lang in $$LLINGUAS; do if test -n "`grep \^$$lang$$ $(srcdir)/LINGUAS 2>/dev/null`" -o -n "`echo $$ALINGUAS|tr ' ' '\n'|grep \^$$lang$$`"; then printf "$$lang "; fi; done; fi) + +USE_LINGUAS=$(shell if test -n "$(USER_LINGUAS)" -o -n "$(LINGUAS)"; then LLINGUAS="$(USER_LINGUAS)"; else if test -n "$(PO_LINGUAS)"; then LLINGUAS="$(PO_LINGUAS)"; else LLINGUAS="$(ALL_LINGUAS)"; fi; fi; for lang in $$LLINGUAS; do printf "$$lang "; done) + +POFILES=$(shell LINGUAS="$(PO_LINGUAS)"; for lang in $$LINGUAS; do printf "$$lang.po "; done) + +DISTFILES = Makefile.in.in POTFILES.in $(POFILES) +EXTRA_DISTFILES = ChangeLog POTFILES.skip Makevars LINGUAS + +POTFILES = \ +# This comment gets stripped out + +CATALOGS=$(shell LINGUAS="$(USE_LINGUAS)"; for lang in $$LINGUAS; do printf "$$lang.gmo "; done) + +.SUFFIXES: +.SUFFIXES: .po .pox .gmo .mo .msg .cat + +AM_DEFAULT_VERBOSITY = @AM_DEFAULT_VERBOSITY@ +INTLTOOL_V_MSGFMT = $(INTLTOOL__v_MSGFMT_$(V)) +INTLTOOL__v_MSGFMT_= $(INTLTOOL__v_MSGFMT_$(AM_DEFAULT_VERBOSITY)) +INTLTOOL__v_MSGFMT_0 = @echo " MSGFMT" $@; + +.po.pox: + $(MAKE) $(GETTEXT_PACKAGE).pot + $(MSGMERGE) $* $(GETTEXT_PACKAGE).pot -o $*.pox + +.po.mo: + $(INTLTOOL_V_MSGFMT)$(MSGFMT) -o $@ $< + +.po.gmo: + $(INTLTOOL_V_MSGFMT)file=`echo $* | sed 's,.*/,,'`.gmo \ + && rm -f $$file && $(GMSGFMT) -o $$file $< + +.po.cat: + sed -f ../intl/po2msg.sed < $< > $*.msg \ + && rm -f $@ && gencat $@ $*.msg + + +all: all-@USE_NLS@ + +all-yes: $(CATALOGS) +all-no: + +$(GETTEXT_PACKAGE).pot: $(POTFILES) + $(GENPOT) + +install: install-data +install-data: install-data-@USE_NLS@ +install-data-no: all +install-data-yes: all + linguas="$(USE_LINGUAS)"; \ + for lang in $$linguas; do \ + dir=$(DESTDIR)$(localedir)/$$lang/LC_MESSAGES; \ + $(mkdir_p) $$dir; \ + if test -r $$lang.gmo; then \ + $(INSTALL_DATA) $$lang.gmo $$dir/$(GETTEXT_PACKAGE).mo; \ + echo "installing $$lang.gmo as $$dir/$(GETTEXT_PACKAGE).mo"; \ + else \ + $(INSTALL_DATA) $(srcdir)/$$lang.gmo $$dir/$(GETTEXT_PACKAGE).mo; \ + echo "installing $(srcdir)/$$lang.gmo as" \ + "$$dir/$(GETTEXT_PACKAGE).mo"; \ + fi; \ + if test -r $$lang.gmo.m; then \ + $(INSTALL_DATA) $$lang.gmo.m $$dir/$(GETTEXT_PACKAGE).mo.m; \ + echo "installing $$lang.gmo.m as $$dir/$(GETTEXT_PACKAGE).mo.m"; \ + else \ + if test -r $(srcdir)/$$lang.gmo.m ; then \ + $(INSTALL_DATA) $(srcdir)/$$lang.gmo.m \ + $$dir/$(GETTEXT_PACKAGE).mo.m; \ + echo "installing $(srcdir)/$$lang.gmo.m as" \ + "$$dir/$(GETTEXT_PACKAGE).mo.m"; \ + else \ + true; \ + fi; \ + fi; \ + done + +# Empty stubs to satisfy archaic automake needs +dvi info ctags tags CTAGS TAGS ID: + +# Define this as empty until I found a useful application. +install-exec installcheck: + +uninstall: + linguas="$(USE_LINGUAS)"; \ + for lang in $$linguas; do \ + rm -f $(DESTDIR)$(localedir)/$$lang/LC_MESSAGES/$(GETTEXT_PACKAGE).mo; \ + rm -f $(DESTDIR)$(localedir)/$$lang/LC_MESSAGES/$(GETTEXT_PACKAGE).mo.m; \ + done + +check: all $(GETTEXT_PACKAGE).pot + rm -f missing notexist + srcdir=$(srcdir) $(INTLTOOL_UPDATE) -m + if [ -r missing -o -r notexist ]; then \ + exit 1; \ + fi + +mostlyclean: + rm -f *.pox $(GETTEXT_PACKAGE).pot *.old.po cat-id-tbl.tmp + rm -f .intltool-merge-cache + +clean: mostlyclean + +distclean: clean + rm -f Makefile Makefile.in POTFILES stamp-it + rm -f *.mo *.msg *.cat *.cat.m *.gmo + +maintainer-clean: distclean + @echo "This command is intended for maintainers to use;" + @echo "it deletes files that may require special tools to rebuild." + rm -f Makefile.in.in + +distdir = ../$(PACKAGE)-$(VERSION)/$(subdir) +dist distdir: $(DISTFILES) + dists="$(DISTFILES)"; \ + extra_dists="$(EXTRA_DISTFILES)"; \ + for file in $$extra_dists; do \ + test -f $(srcdir)/$$file && dists="$$dists $(srcdir)/$$file"; \ + done; \ + for file in $$dists; do \ + test -f $$file || file="$(srcdir)/$$file"; \ + ln $$file $(distdir) 2> /dev/null \ + || cp -p $$file $(distdir); \ + done + +update-po: Makefile + $(MAKE) $(GETTEXT_PACKAGE).pot + tmpdir=`pwd`; \ + linguas="$(USE_LINGUAS)"; \ + for lang in $$linguas; do \ + echo "$$lang:"; \ + result="`$(MSGMERGE) -o $$tmpdir/$$lang.new.po $$lang`"; \ + if $$result; then \ + if cmp $(srcdir)/$$lang.po $$tmpdir/$$lang.new.po >/dev/null 2>&1; then \ + rm -f $$tmpdir/$$lang.new.po; \ + else \ + if mv -f $$tmpdir/$$lang.new.po $$lang.po; then \ + :; \ + else \ + echo "msgmerge for $$lang.po failed: cannot move $$tmpdir/$$lang.new.po to $$lang.po" 1>&2; \ + rm -f $$tmpdir/$$lang.new.po; \ + exit 1; \ + fi; \ + fi; \ + else \ + echo "msgmerge for $$lang.gmo failed!"; \ + rm -f $$tmpdir/$$lang.new.po; \ + fi; \ + done + +Makefile POTFILES: stamp-it + @if test ! -f $@; then \ + rm -f stamp-it; \ + $(MAKE) stamp-it; \ + fi + +stamp-it: Makefile.in.in $(top_builddir)/config.status POTFILES.in + cd $(top_builddir) \ + && CONFIG_FILES=$(subdir)/Makefile.in CONFIG_HEADERS= CONFIG_LINKS= \ + $(SHELL) ./config.status + +# Tell versions [3.59,3.63) of GNU make not to export all variables. +# Otherwise a system limit (for SysV at least) may be exceeded. +.NOEXPORT: diff --git a/po/POTFILES.in b/po/POTFILES.in new file mode 100644 index 0000000..3d51593 --- /dev/null +++ b/po/POTFILES.in @@ -0,0 +1,75 @@ +src/acquire.c +src/babel.c +src/babel_ui.c +src/background.c +src/bing.c +src/bingmapsource.c +src/clipboard.c +src/curl_download.c +src/dialog.c +src/expedia.c +src/geonamessearch.c +src/geojson.c +src/globals.c +src/google.c +src/googlesearch.c +src/gpx.c +src/datasource_bfilter.c +src/datasource_file.c +src/datasource_gc.c +src/datasource_geotag.c +src/datasource_geojson.c +src/datasource_gps.c +src/datasource_osm.c +src/datasource_osm_my_traces.c +src/datasource_routing.c +src/datasource_url.c +src/datasource_wikipedia.c +src/dem.c +src/download.c +src/file.c +src/geotag_exif.c +src/osm-traces.c +src/mapcache.c +src/mapnik_interface.cpp +src/print.c +src/ui_util.c +src/util.c +src/vikcoordlayer.c +src/main.c +src/osm.c +src/osm-traces.c +src/preferences.c +src/toolbar.c +src/viklayer_defaults.c +src/uibuilder.c +src/vikaggregatelayer.c +src/vikdemlayer.c +src/vikfileentry.c +src/vikfilelist.c +src/vikgeoreflayer.c +src/vikgoto.c +src/vikgototool.c +src/vikgpslayer.c +src/viklayer.c +src/viklayerspanel.c +src/vikmapniklayer.c +src/vikmapslayer.c +src/vikrouting.c +src/viktreeview.c +src/viktrwlayer.c +src/viktrwlayer_export.c +src/viktrwlayer_propwin.c +src/viktrwlayer_tpwin.c +src/viktrwlayer_tracklist.c +src/viktrwlayer_waypointlist.c +src/viktrwlayer_wpwin.c +src/viktrwlayer_geotag.c +src/viktrwlayer_analysis.c +src/vikstatus.c +src/vikutils.c +src/vikwaypoint.c +src/vikwebtool_datasource.c +src/vikwindow.c +src/viking.desktop.in +src/libjpeg/jpeg-data.c diff --git a/po/ast.po b/po/ast.po new file mode 100644 index 0000000..ff2e884 --- /dev/null +++ b/po/ast.po @@ -0,0 +1,6124 @@ +# Asturian translation for viking +# Copyright (c) 2013 Rosetta Contributors and Canonical Ltd 2013 +# This file is distributed under the same license as the viking package. +# FIRST AUTHOR , 2013. +# +msgid "" +msgstr "" +"Project-Id-Version: viking\n" +"Report-Msgid-Bugs-To: \n" +"POT-Creation-Date: 2019-01-19 12:53+0000\n" +"PO-Revision-Date: 2014-01-21 17:17+0000\n" +"Last-Translator: Xuacu Saturio \n" +"Language-Team: Asturian \n" +"Language: ast\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-Launchpad-Export-Date: 2018-12-21 17:32+0000\n" +"X-Generator: Launchpad (build 18847)\n" + +#: ../src/acquire.c:106 ../src/vikgpslayer.c:1367 +msgid "Done." +msgstr "Fecho." + +#: ../src/acquire.c:115 +msgid "No data." +msgstr "Nun hai datos." + +#: ../src/acquire.c:167 ../src/acquire.c:415 +msgid "Error: acquisition failed." +msgstr "Error: falló l'atropamientu." + +#: ../src/acquire.c:339 +msgid "Working..." +msgstr "Trabayando..." + +#. This shouldn't happen... +#: ../src/acquire.c:406 +msgid "" +"Unable to create command\n" +"Acquire method failed." +msgstr "" +"Nun se pudo crear el comandu\n" +"Falló'l métodu d'atropamientu." + +#: ../src/acquire.c:513 +msgid "_Filter" +msgstr "_Filtru" + +#: ../src/acquire.c:528 +#, c-format +msgid "Filter with %s" +msgstr "Filtriar con %s" + +#: ../src/acquire.c:545 +msgid "Filter" +msgstr "Filtru" + +#: ../src/babel.c:640 +msgid "GPSBabel:" +msgstr "" + +#: ../src/babel.c:641 +msgid "" +"Allow setting the specific instance of GPSBabel. You must restart Viking for " +"this value to take effect." +msgstr "" + +#: ../src/babel_ui.c:79 +msgid "Select a file format" +msgstr "" + +#: ../src/babel_ui.c:144 ../src/viktrwlayer.c:531 ../src/viktrwlayer.c:2882 +msgid "Tracks" +msgstr "" + +#: ../src/babel_ui.c:149 ../src/viktrwlayer.c:2892 +msgid "Routes" +msgstr "" + +#. ***** PARAMETERS ***** +#: ../src/babel_ui.c:154 ../src/viktrwlayer.c:531 ../src/viktrwlayer.c:2887 +msgid "Waypoints" +msgstr "Puntos de vía" + +#: ../src/background.c:64 +#, c-format +msgid "%d items" +msgstr "%d oxetos" + +#: ../src/background.c:287 +msgid "Threads:" +msgstr "" + +#: ../src/background.c:288 +msgid "" +"Number of threads to use for Mapnik tasks. You need to restart Viking for a " +"change to this value to be used" +msgstr "" + +#: ../src/background.c:361 +msgid "Job" +msgstr "Xera" + +#: ../src/background.c:365 +msgid "Progress" +msgstr "Progresu" + +#: ../src/background.c:373 +msgid "Viking Background Jobs" +msgstr "Xeres en segundu planu de Viking" + +#: ../src/bing.c:42 +msgid "Bing Aerial" +msgstr "" + +#: ../src/bing.c:48 +msgid "Bing" +msgstr "Bing" + +#. VIK_GTK_WINDOW_FROM_WIDGET(vp) +#: ../src/bingmapsource.c:514 +msgid "Bing attribution Loading" +msgstr "Cargando atribución a Bing" + +#: ../src/clipboard.c:95 +msgid "paste failed" +msgstr "falló'l pegáu" + +#: ../src/clipboard.c:105 +msgid "wrong clipboard data size" +msgstr "tamañu incorreutu de los datos del cartafueyu" + +#: ../src/clipboard.c:124 +#, c-format +msgid "" +"The clipboard contains sublayer data for %s layers. You must select a layer " +"of this type to paste the clipboard data." +msgstr "" +"El cartafueyu contien datos de subcapa de %s capes. Seleicione una capa " +"d'esta mena pa pegar los datos del cartafueyu." + +#: ../src/clipboard.c:264 +msgid "" +"In order to paste a waypoint, please select an appropriate layer to paste " +"into." +msgstr "Pa pegar un puntu de vía, por favor, seleicione una capa afayadiza." + +#: ../src/dialog.c:60 +msgid "Go to Lat/Lon" +msgstr "Dir a Llat/Llon" + +#: ../src/dialog.c:69 ../src/viktrwlayer_wpwin.c:173 +msgid "Latitude:" +msgstr "Llatitú:" + +#: ../src/dialog.c:72 ../src/viktrwlayer_wpwin.c:177 +msgid "Longitude:" +msgstr "Llonxitú:" + +#: ../src/dialog.c:102 +msgid "Go to UTM" +msgstr "Dir a UTM" + +#: ../src/dialog.c:114 +msgid "Northing:" +msgstr "" + +#: ../src/dialog.c:117 +msgid "Easting:" +msgstr "" + +#: ../src/dialog.c:121 ../src/vikgeoreflayer.c:902 +msgid "Zone:" +msgstr "Zona:" + +#: ../src/dialog.c:124 ../src/vikgeoreflayer.c:904 +msgid "Letter:" +msgstr "Lletra:" + +#: ../src/dialog.c:246 ../src/geonamessearch.c:238 +#: ../src/datasource_osm_my_traces.c:505 +msgid "Nothing was selected" +msgstr "Nun ta seleicionao ren" + +#: ../src/dialog.c:254 +msgid "Add Route" +msgstr "Amestar ruta" + +#: ../src/dialog.c:254 +msgid "Add Track" +msgstr "Amestar track" + +#: ../src/dialog.c:262 +msgid "Route Name:" +msgstr "Nome de la ruta:" + +#: ../src/dialog.c:262 +msgid "Track Name:" +msgstr "Nome del track:" + +#: ../src/dialog.c:282 +msgid "Please enter a name for the track." +msgstr "Escriba un nome pal track." + +#: ../src/dialog.c:311 +msgid "Today" +msgstr "" + +#: ../src/dialog.c:393 +msgid "Zoom Factors..." +msgstr "Factores d'ampliación..." + +#: ../src/dialog.c:407 +msgid "Zoom factor (in meters per pixel):" +msgstr "Factores d'ampliación (en metros por pixel):" + +#: ../src/dialog.c:408 +msgid "X (easting): " +msgstr "X (coordenada este): " + +#: ../src/dialog.c:409 +msgid "Y (northing): " +msgstr "Y (coordenada norte): " + +#: ../src/dialog.c:414 +msgid "X and Y zoom factors must be equal" +msgstr "Los factores d'ampliación X y Y tienen de ser iguales" + +#: ../src/dialog.c:469 +msgid "1 min" +msgstr "1 min" + +#: ../src/dialog.c:470 +msgid "1 hour" +msgstr "1 hora" + +#: ../src/dialog.c:471 +msgid "1 day" +msgstr "1 día" + +#: ../src/dialog.c:472 +msgid "Custom (in minutes):" +msgstr "Personalizáu (en minutos):" + +#: ../src/dialog.c:608 +#, c-format +msgid "" +"2003-2008, Evan Battaglia\n" +"2008-%s, Viking's contributors" +msgstr "" + +#: ../src/dialog.c:609 +msgid "GPS Data and Topo Analyzer, Explorer, and Manager." +msgstr "Analizador, esplorador y xestor de datos GPS y topográficos." + +#: ../src/dialog.c:610 +msgid "" +"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.\n" +"\n" +"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.\n" +"\n" +"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., 59 Temple " +"Place, Suite 330, Boston, MA 02111-1307, USA" +msgstr "" +"Esti programa ye software llibre; pue redistribuilu , y / o camudalu baxo " +"les condiciones de la Llicencia Pública Xeneral GNU como la publica la Free " +"Software Foundation; o la versión 2 de la llicencia , o (como prefiera) " +"cualesquier versión posterior.\n" +"\n" +"Esti programa distribuise cola esperanza de que seya útil, PERO ENSIN " +"GARANTÍA DALA; nin siquiera la garantía implícita de COMERCIALIDÁ o " +"ADAUTACIÓN PA UN PROPÓSITU DETERMINÁU. Vea la Llicencia Pública Xeneral GNU " +"pa más detalles.\n" +"\n" +"Debería recibir una copia de la Llicencia Pública Xeneral GNU xunto con esti " +"programa; si nun ye asina, escriba a la Free Software Foundation, Inc., 59 " +"Temple Place, Suite 330, Boston, MA 02111-1307, USA" + +#: ../src/dialog.c:703 +msgid "Translation is coordinated on http://launchpad.net/viking" +msgstr "La traducción coordinase'n http://launchpad.net/viking" + +#: ../src/dialog.c:713 +msgid "Download along track" +msgstr "Descargar a lo llargo del track" + +#: ../src/dialog.c:720 +msgid "Map type:" +msgstr "Tipu de mapa:" + +#: ../src/dialog.c:726 +msgid "Zoom level:" +msgstr "Nivel d'ampliación:" + +#: ../src/dialog.c:766 +#, c-format +msgid "The map data is licensed: %s." +msgstr "Los datos del mapa tienen llicencia: %s" + +#: ../src/dialog.c:769 +#, c-format +msgid "" +"The data provided by '%s' are licensed under the following license: " +"%s." +msgstr "" + +#: ../src/dialog.c:773 +msgid "Open license" +msgstr "Llicencia abierta" + +#: ../src/expedia.c:54 +msgid "Expedia Street Maps" +msgstr "Mapes de calles Expedia" + +#: ../src/expedia.c:82 +msgid "Invalid expedia altitude" +msgstr "Altitú d'expedia inválida" + +#: ../src/expedia.c:113 +#, c-format +msgid "" +"Couldn't open EXPEDIA image file (right after successful download! Please " +"report and delete image file!): %s" +msgstr "" +"Nun pudo abrise'l ficheru d'imaxe EXPEDIA (¡xusto dempués de descargalu " +"correutamente! Por favor informe y desanicie'l ficheru d'imaxe): %s" + +#: ../src/expedia.c:126 +#, c-format +msgid "" +"Couldn't save EXPEDIA image file (right after successful download! Please " +"report and delete image file!): %s" +msgstr "" +"Nun pudo guardase'l ficheru d'imaxe EXPEDIA (¡xusto dempués de descargalu " +"correutamente! Por favor informe y desanicie'l ficheru d'imaxe): %s" + +#: ../src/geonamessearch.c:115 +msgid "Search" +msgstr "Guetar" + +#: ../src/geonamessearch.c:117 +msgid "No entries found!" +msgstr "¡Nun s'alcontró denguna entrada!" + +#. NB could allow columns to be shifted around by doing this after each new +#. gtk_tree_view_column_set_reorderable ( column, TRUE ); +#. However I don't think is that useful, so I haven't put it in +#: ../src/geonamessearch.c:171 ../src/datasource_osm_my_traces.c:422 +#: ../src/viktrwlayer_tracklist.c:621 ../src/viktrwlayer_waypointlist.c:618 +msgid "Name" +msgstr "Nome" + +#: ../src/geonamessearch.c:176 +msgid "Feature" +msgstr "Propiedá" + +#: ../src/geonamessearch.c:181 ../src/datasource_osm_my_traces.c:437 +msgid "Lat/Lon" +msgstr "Llat/Llon" + +#: ../src/geonamessearch.c:264 ../src/googlesearch.c:101 ../src/vikgoto.c:430 +msgid "couldn't map temp file" +msgstr "nun se pudo facer un mapa del ficheru temporal" + +#: ../src/geonamessearch.c:459 +msgid "Select articles" +msgstr "" + +#: ../src/geonamessearch.c:459 +msgid "Select the articles you want to add." +msgstr "" + +#: ../src/geonamessearch.c:475 +msgid "city" +msgstr "" + +#: ../src/geonamessearch.c:477 +msgid "edu" +msgstr "" + +#: ../src/geonamessearch.c:479 +msgid "airport" +msgstr "" + +#: ../src/geonamessearch.c:481 +msgid "mountain" +msgstr "" + +#: ../src/geonamessearch.c:483 +msgid "forest" +msgstr "" + +#: ../src/geonamessearch.c:485 +msgid "church" +msgstr "" + +#: ../src/geojson.c:74 +#, c-format +msgid "%s command failed: %s" +msgstr "" + +#: ../src/geojson.c:146 ../src/gpx.c:1317 +#, c-format +msgid "failed to open temporary file: %s" +msgstr "" + +#: ../src/globals.c:67 +msgid "DDD" +msgstr "" + +#: ../src/globals.c:67 +msgid "DMM" +msgstr "" + +#: ../src/globals.c:67 +msgid "DMS" +msgstr "" + +#: ../src/globals.c:67 +msgid "Raw" +msgstr "" + +#: ../src/globals.c:68 +msgid "Kilometres" +msgstr "" + +#: ../src/globals.c:68 +msgid "Miles" +msgstr "" + +#: ../src/globals.c:68 +msgid "Nautical Miles" +msgstr "" + +#. VIK_UNITS_SPEED_KILOMETRES_PER_HOUR: +#: ../src/globals.c:69 ../src/viktrwlayer_tracklist.c:655 ../src/vikutils.c:100 +msgid "km/h" +msgstr "" + +#: ../src/globals.c:69 ../src/viktrwlayer_tracklist.c:656 ../src/vikutils.c:78 +msgid "mph" +msgstr "" + +#. VIK_UNITS_SPEED_METRES_PER_SECOND: +#: ../src/globals.c:69 ../src/viktrwlayer_tracklist.c:663 ../src/vikutils.c:81 +msgid "m/s" +msgstr "" + +#: ../src/globals.c:69 ../src/viktrwlayer_tracklist.c:657 ../src/vikutils.c:84 +msgid "knots" +msgstr "" + +#: ../src/globals.c:69 ../src/viktrwlayer_tracklist.c:658 ../src/vikutils.c:87 +msgid "s/km" +msgstr "" + +#: ../src/globals.c:69 ../src/viktrwlayer_tracklist.c:659 ../src/vikutils.c:90 +msgid "min/km" +msgstr "" + +#: ../src/globals.c:69 +msgid "s/mi" +msgstr "" + +#: ../src/globals.c:69 ../src/viktrwlayer_tracklist.c:661 ../src/vikutils.c:96 +msgid "min/mi" +msgstr "" + +#: ../src/globals.c:70 +msgid "Metres" +msgstr "" + +#: ../src/globals.c:70 +msgid "Feet" +msgstr "" + +#: ../src/globals.c:73 +msgid "Locale" +msgstr "" + +#: ../src/globals.c:73 +msgid "World" +msgstr "" + +#: ../src/globals.c:73 +msgid "UTC" +msgstr "" + +#: ../src/globals.c:76 +msgid "Degree format:" +msgstr "Formatu de graos:" + +#: ../src/globals.c:77 +msgid "Distance units:" +msgstr "Unidaes de distancia:" + +#: ../src/globals.c:78 +msgid "Speed units:" +msgstr "Unidaes de velocidá:" + +#: ../src/globals.c:79 +msgid "Height units:" +msgstr "Unidaes d'altura:" + +#: ../src/globals.c:80 +msgid "Use large waypoint icons:" +msgstr "Usar iconos de puntu de vía grandes:" + +#: ../src/globals.c:81 +msgid "Default latitude:" +msgstr "Llatitú predeterminada:" + +#: ../src/globals.c:82 +msgid "Default longitude:" +msgstr "Llonxitú predeterminada:" + +#: ../src/globals.c:83 +msgid "Time Display:" +msgstr "" + +#: ../src/globals.c:84 +msgid "" +"Display times according to the reference frame. Locale is the user's system " +"setting. World is relative to the location of the object." +msgstr "" + +#: ../src/globals.c:90 +msgid "Alphabetical" +msgstr "Alfabéticu" + +#: ../src/globals.c:90 ../src/datasource_osm_my_traces.c:432 +msgid "Time" +msgstr "Tiempu" + +#: ../src/globals.c:90 +msgid "Creation" +msgstr "Creación" + +#: ../src/globals.c:91 +msgid "Title Case" +msgstr "Mayúscules nel títulu" + +#: ../src/globals.c:91 +msgid "Lowercase" +msgstr "Minúscules" + +#: ../src/globals.c:94 +msgid "KML File Export Units:" +msgstr "Unidaes d'esportación de ficheros KML:" + +#: ../src/globals.c:95 +msgid "GPX Track Order:" +msgstr "Orde de track GPX:" + +#: ../src/globals.c:96 +msgid "GPX Waypoint Symbols:" +msgstr "Símbolos de puntu de vía GPX" + +#: ../src/globals.c:97 +msgid "" +"Save GPX Waypoint Symbol names in the specified case. May be useful for " +"compatibility with various devices" +msgstr "" +"Guardar los nomes de Puntos de vía GPX cola capitalización especificada. Pue " +"ser afayadizo pa la compatibilidá con dellos preseos" + +#: ../src/globals.c:98 +#, fuzzy +msgid "GPX Creator:" +msgstr "Creación" + +#: ../src/globals.c:99 +msgid "" +"The creator value when writing a GPX file. Otherwise when blank a default is " +"used." +msgstr "" + +#: ../src/globals.c:104 +msgid "Image Viewer:" +msgstr "Visor d'imaxes:" + +#: ../src/globals.c:109 +msgid "External GPX Program 1:" +msgstr "Programa GPX esternu 1:" + +#: ../src/globals.c:110 +msgid "External GPX Program 2:" +msgstr "Programa GPX esternu 2:" + +#: ../src/globals.c:113 +msgid "Absolute" +msgstr "Absolutu" + +#: ../src/globals.c:113 +msgid "Relative" +msgstr "Relativu" + +#: ../src/globals.c:117 +msgid "Save File Reference Mode:" +msgstr "Guardar el mou de referencia a ficheru:" + +#: ../src/globals.c:118 +msgid "" +"When saving a Viking .vik file, this determines how the directory paths of " +"filenames are written." +msgstr "" +"Al guardar un ficheru .vik de Viking, esto determina cómo s'escriben los " +"caminos a los direutorios de los nomes de ficheru." + +#: ../src/globals.c:119 +msgid "Ask for Name before Track Creation:" +msgstr "" + +#: ../src/globals.c:120 +msgid "Show Tooltip during Track Creation:" +msgstr "Amosar gabitos de ferramienta na Creación de pista:" + +#: ../src/globals.c:121 +msgid "The number of recent files:" +msgstr "" + +#: ../src/globals.c:122 +msgid "" +"Only applies to new windows or on application restart. -1 means all " +"available files." +msgstr "" + +#: ../src/globals.c:123 +msgid "Open files in selected layer:" +msgstr "" + +#: ../src/globals.c:124 +msgid "Open files (but not .vik ones) into the selected TrackWaypoint layer." +msgstr "" + +#: ../src/globals.c:125 +msgid "Show calendar day names:" +msgstr "" + +#: ../src/globals.c:128 +msgid "Home Location" +msgstr "Allugamientu base" + +#: ../src/globals.c:128 +msgid "Last Location" +msgstr "Últimu allugamientu" + +#: ../src/globals.c:128 +msgid "Specified File" +msgstr "Ficheru especificáu" + +#: ../src/globals.c:128 +msgid "Auto Location" +msgstr "Allugamientu automáticu" + +#: ../src/globals.c:131 +msgid "Restore Window Setup:" +msgstr "Restaurar la configuración de ventana:" + +#: ../src/globals.c:132 +msgid "Restore window size and layout" +msgstr "Restaurar el tamañu y disposición de la ventana" + +#: ../src/globals.c:133 +msgid "Add a Default Map Layer:" +msgstr "Amestar una capa de mapa predeterminada:" + +#: ../src/globals.c:134 +msgid "" +"The default map layer added is defined by the Layer Defaults. Use the menu " +"Edit->Layer Defaults->Map... to change the map type and other values." +msgstr "" +"La capa de mapa predeterminada que s'amiestas defínese pola Configuración " +"predeterminada de capa. Use'l menú Editar->Configuración de capa->Mapa... pa " +"cambiar el tipu de mapa y otros valores." + +#: ../src/globals.c:135 +msgid "Startup Method:" +msgstr "Métodu d'aniciu:" + +#: ../src/globals.c:136 +msgid "Startup File:" +msgstr "Ficheru d'aniciu:" + +#: ../src/globals.c:137 +msgid "" +"The default file to load on startup. Only applies when the startup method is " +"set to 'Specified File'" +msgstr "" +"El ficheru predetermináu a cargar nel aniciu. Sólo s'aplica cuando'l métodu " +"d'aniciu ta configuráu como «Ficheru especificáu»" + +#: ../src/globals.c:138 +msgid "Check For New Version:" +msgstr "Buscar versión nueva:" + +#: ../src/globals.c:139 +msgid "Periodically check to see if a new version of Viking is available" +msgstr "Comprobar periódicamente si ta disponible una versión nueva de Viking" + +#. Defaults for the options are setup here +#: ../src/globals.c:176 +msgid "General" +msgstr "Xeneral" + +#. New Tab +#: ../src/globals.c:204 +msgid "Startup" +msgstr "Aniciu" + +#. New Tab +#: ../src/globals.c:222 +msgid "Export/External" +msgstr "Esportación/Esternu" + +#. 'Advanced' Properties +#: ../src/globals.c:249 +msgid "Advanced" +msgstr "Avanzaes" + +#. Webtools +#: ../src/google.c:39 +msgid "Google" +msgstr "Google" + +#. If there is an actual description field it will overwrite this value +#: ../src/gpx.c:264 +#, c-format +msgid "Created by: %s" +msgstr "" + +#: ../src/datasource_bfilter.c:43 +msgid "Max number of points:" +msgstr "" + +#: ../src/datasource_bfilter.c:84 +msgid "Simplify All Tracks..." +msgstr "" + +#: ../src/datasource_bfilter.c:85 +msgid "Simplified Tracks" +msgstr "" + +#. { VIK_LAYER_NUM_TYPES, "compressmethod", VIK_LAYER_PARAM_UINT, VIK_LAYER_GROUP_NONE, N_("Simplify Method:"), VIK_LAYER_WIDGET_COMBOBOX, compress_method, NULL, NULL, NULL, NULL, NULL }, +#: ../src/datasource_bfilter.c:111 +msgid "Error Factor:" +msgstr "" + +#: ../src/datasource_bfilter.c:112 +msgid "" +"Specifies the maximum allowable error that may be introduced by removing a " +"single point by the crosstrack method. See the manual or GPSBabel Simplify " +"Filter documentation for more detail." +msgstr "" + +#: ../src/datasource_bfilter.c:166 +msgid "Compress Tracks..." +msgstr "" + +#: ../src/datasource_bfilter.c:167 +msgid "Compressed Tracks" +msgstr "" + +#: ../src/datasource_bfilter.c:197 ../src/datasource_bfilter.c:198 +msgid "Remove Duplicate Waypoints" +msgstr "Desaniciar puntos de vía duplicaos" + +#: ../src/datasource_bfilter.c:221 +msgid "Manual filter:" +msgstr "" + +#: ../src/datasource_bfilter.c:222 +msgid "Manual filter command: e.g. 'swap'." +msgstr "" + +#: ../src/datasource_bfilter.c:233 ../src/datasource_bfilter.c:234 +msgid "Manual filter" +msgstr "" + +#: ../src/datasource_bfilter.c:262 +msgid "Waypoints Inside This" +msgstr "Puntos de vía dientro d'esti" + +#: ../src/datasource_bfilter.c:263 ../src/datasource_bfilter.c:292 +msgid "Polygonized Layer" +msgstr "" + +#: ../src/datasource_bfilter.c:291 +msgid "Waypoints Outside This" +msgstr "Puntos de vía fuera d'esti" + +#: ../src/datasource_file.c:61 +msgid "Import file with GPSBabel" +msgstr "Importar ficheru con GPSBabel" + +#: ../src/datasource_file.c:62 +msgid "Imported file" +msgstr "Ficheru importáu" + +#. The file selector +#: ../src/datasource_file.c:129 +msgid "File:" +msgstr "Ficheru:" + +#: ../src/datasource_file.c:130 +msgid "File to import" +msgstr "Ficheru a importar" + +#: ../src/datasource_file.c:137 +msgid "All files" +msgstr "Tolos ficheros" + +#. The file format selector +#: ../src/datasource_file.c:144 ../src/datasource_url.c:106 +msgid "File type:" +msgstr "Tipu de ficheru:" + +#: ../src/datasource_file.c:189 +#, c-format +msgid "using babel args '%s' and file '%s'" +msgstr "usando los argumentos de babel '%s' ya'l ficheru '%s'" + +#: ../src/datasource_gc.c:67 +msgid "Download Geocaches" +msgstr "Descargar xeocachés" + +#: ../src/datasource_gc.c:68 +msgid "Geocaching.com Caches" +msgstr "Cachés de Geocaching.com" + +#: ../src/datasource_gc.c:86 +msgid "geocaching.com username:" +msgstr "Nome d'usuariu de geocaching.com" + +#: ../src/datasource_gc.c:87 +msgid "geocaching.com password:" +msgstr "Contraseña de geocaching.com" + +#: ../src/datasource_gc.c:92 ../src/vikwindow.c:3502 +msgid "Geocaching" +msgstr "" + +#: ../src/datasource_gc.c:128 +#, c-format +msgid "" +"Can't find %s or %s in path! Check that you have installed it correctly." +msgstr "" +"¡Nun pue alcontrase %s o %s nel path! Compruebe que ta instaláu " +"correutamente." + +#: ../src/datasource_gc.c:190 +msgid "Number geocaches:" +msgstr "Numberar xeocachés:" + +#: ../src/datasource_gc.c:192 +msgid "Centered around:" +msgstr "Centráu alredor de:" + +#: ../src/datasource_gc.c:231 +msgid "Broken input - using some defaults" +msgstr "Entrada frañada - usando dalgunos predeterminaos" + +#: ../src/datasource_geotag.c:51 +msgid "Create Waypoints from Geotagged Images" +msgstr "Crear puntos de vía dende imaxes xeomarcaes" + +#: ../src/datasource_geotag.c:52 +msgid "Geotagged Images" +msgstr "Imaxes xeomarcaes" + +#: ../src/datasource_geotag.c:102 ../src/datasource_geojson.c:93 +#: ../src/vikfileentry.c:171 ../src/vikwindow.c:3533 ../src/vikwindow.c:3610 +#: ../src/vikwindow.c:3641 ../src/vikwindow.c:4356 ../src/vikwindow.c:4649 +msgid "All" +msgstr "Too" + +#: ../src/datasource_geotag.c:107 ../src/vikfileentry.c:115 +#: ../src/viktrwlayer_geotag.c:637 ../src/vikwindow.c:3518 +#: ../src/vikwindow.c:4377 +msgid "JPG" +msgstr "JPG" + +#: ../src/datasource_geotag.c:168 +#, c-format +msgid "Unable to create waypoint from %s" +msgstr "Nun pudo crease'l puntu de vía dende %s" + +#: ../src/datasource_geojson.c:46 +msgid "Acquire from GeoJSON" +msgstr "" + +#: ../src/datasource_geojson.c:47 ../src/datasource_geojson.c:98 +msgid "GeoJSON" +msgstr "" + +#: ../src/datasource_geojson.c:152 +#, c-format +msgid "Unable to import from: %s" +msgstr "" + +#: ../src/datasource_gps.c:54 +msgid "Acquire from GPS" +msgstr "Adquirir dende GPS" + +#: ../src/datasource_gps.c:55 +msgid "Acquired from GPS" +msgstr "Adquiríu dende GPS" + +#: ../src/datasource_gps.c:258 +#, c-format +msgid "using cmd '%s' and file '%s'\n" +msgstr "" + +#: ../src/datasource_gps.c:353 ../src/vikgpslayer.c:966 +#, c-format +msgid "Downloading %d waypoint..." +msgid_plural "Downloading %d waypoints..." +msgstr[0] "Descargando %d puntu de vía..." +msgstr[1] "Descargando %d puntos de vía..." + +#: ../src/datasource_gps.c:358 ../src/vikgpslayer.c:971 +#, c-format +msgid "Downloading %d trackpoint..." +msgid_plural "Downloading %d trackpoints..." +msgstr[0] "Descargando %d puntu de traza..." +msgstr[1] "Descargando %d puntos de traza..." + +#: ../src/datasource_gps.c:363 ../src/vikgpslayer.c:976 +#, c-format +msgid "Downloading %d routepoint..." +msgid_plural "Downloading %d routepoints..." +msgstr[0] "Descargando %d puntu de ruta..." +msgstr[1] "Descargando %d puntos de ruta..." + +#: ../src/datasource_gps.c:386 ../src/datasource_gps.c:393 +#: ../src/datasource_gps.c:400 +#, c-format +msgid "Downloaded %d out of %d %s..." +msgstr "Descargaos %d de %d %s..." + +#: ../src/datasource_gps.c:388 ../src/datasource_gps.c:395 +#: ../src/datasource_gps.c:402 +#, c-format +msgid "Downloaded %d %s." +msgstr "Descargaos %d %s." + +#: ../src/datasource_gps.c:416 ../src/vikgpslayer.c:1134 +#, c-format +msgid "GPS Device: %s" +msgstr "Preséu GPS: %s" + +#: ../src/datasource_gps.c:428 ../src/vikgpslayer.c:1214 +msgid "Status: Working..." +msgstr "Estáu: Funcionando..." + +#. NB gps_layer_inst_init() is performed after parameter registeration +#. thus to give the protocols some potential values use the old static list +#. TODO: find another way to use gps_layer_inst_init()? +#: ../src/datasource_gps.c:584 ../src/vikgpslayer.c:216 +msgid "GPS Protocol:" +msgstr "Protocolu GPS:" + +#. List reassigned at runtime +#: ../src/datasource_gps.c:609 ../src/vikgpslayer.c:217 +msgid "Serial Port:" +msgstr "Puertu serie:" + +#: ../src/datasource_gps.c:659 +msgid "" +"Turn Off After Transfer\n" +"(Garmin/NAViLink Only)" +msgstr "" +"Apagar después de la tresferencia\n" +"(Sólo Garmin/NAViLink)" + +#: ../src/datasource_gps.c:666 +msgid "Tracks:" +msgstr "Pistes:" + +#: ../src/datasource_gps.c:673 +msgid "Routes:" +msgstr "Rutes:" + +#: ../src/datasource_gps.c:680 +msgid "Waypoints:" +msgstr "Puntos de vía:" + +#: ../src/datasource_gps.c:756 ../src/vikgpslayer.c:1509 +msgid "GPS device: N/A" +msgstr "Preséu GPS: N/D" + +#: ../src/datasource_osm.c:53 ../src/datasource_osm.c:54 +msgid "OSM traces" +msgstr "Traces d'OSM" + +#: ../src/datasource_osm.c:89 +msgid "Page number:" +msgstr "Númberu de páxina:" + +#: ../src/datasource_osm_my_traces.c:59 ../src/datasource_osm_my_traces.c:60 +msgid "OSM My Traces" +msgstr "" + +#: ../src/datasource_osm_my_traces.c:106 ../src/osm-traces.c:684 +msgid "Email/username:" +msgstr "" + +#: ../src/datasource_osm_my_traces.c:111 +msgid "The email or username used to login to OSM" +msgstr "" + +#: ../src/datasource_osm_my_traces.c:113 ../src/osm-traces.c:692 +msgid "Password:" +msgstr "" + +#: ../src/datasource_osm_my_traces.c:116 +msgid "The password used to login to OSM" +msgstr "" + +#: ../src/datasource_osm_my_traces.c:427 ../src/viktrwlayer.c:689 +msgid "Description" +msgstr "" + +#: ../src/datasource_osm_my_traces.c:442 +msgid "Privacy" +msgstr "" + +#: ../src/datasource_osm_my_traces.c:449 +msgid "Within Current View" +msgstr "" + +#: ../src/datasource_osm_my_traces.c:516 +msgid "GPS Traces" +msgstr "" + +#: ../src/datasource_osm_my_traces.c:518 +msgid "None found!" +msgstr "" + +#: ../src/datasource_osm_my_traces.c:569 +msgid "Ensure the OSM access token preferences are setup." +msgstr "" + +#: ../src/datasource_osm_my_traces.c:645 +msgid "My OSM Traces" +msgstr "" + +#. Report errors to the status bar +#: ../src/datasource_osm_my_traces.c:667 +#, c-format +msgid "Unable to get trace: %s" +msgstr "" + +#: ../src/datasource_routing.c:56 ../src/datasource_routing.c:57 +msgid "Directions" +msgstr "" + +#: ../src/datasource_routing.c:90 +msgid "No routing engines with directions available" +msgstr "" + +#. Engine selector +#: ../src/datasource_routing.c:99 +msgid "Engine:" +msgstr "" + +#. From and To entries +#: ../src/datasource_routing.c:104 +msgid "From:" +msgstr "Dende:" + +#: ../src/datasource_routing.c:105 +msgid "To:" +msgstr "Fasta:" + +#: ../src/datasource_url.c:48 +msgid "Acquire from URL" +msgstr "" + +#: ../src/datasource_url.c:49 +msgid "URL" +msgstr "" + +#: ../src/datasource_url.c:101 +msgid "URL:" +msgstr "" + +#. Only GPX (not using GPSbabel) +#: ../src/datasource_url.c:133 ../src/vikfileentry.c:161 +#: ../src/vikwindow.c:3513 ../src/vikwindow.c:3603 +msgid "GPX" +msgstr "" + +#: ../src/datasource_wikipedia.c:32 +msgid "Create Waypoints from Wikipedia Articles" +msgstr "Crear puntos de vía dende artículos de Uiquipedia" + +#: ../src/datasource_wikipedia.c:33 +msgid "Wikipedia Waypoints" +msgstr "Puntos de vía de Uiquipedia" + +#: ../src/dem.c:66 ../src/dem.c:80 +msgid "Invalid DEM" +msgstr "" + +#: ../src/dem.c:122 +msgid "Invalid DEM header" +msgstr "" + +#: ../src/dem.c:191 ../src/dem.c:204 +msgid "Incorrect DEM Class B record: expected 1" +msgstr "" + +#: ../src/dem.c:289 ../src/download.c:176 +#, c-format +msgid "Couldn't map file %s: %s" +msgstr "" + +#: ../src/download.c:130 +msgid "Tile age (days):" +msgstr "" + +#: ../src/download.c:406 +#, c-format +msgid "Download error: %s" +msgstr "" + +#: ../src/download.c:490 +msgid "couldn't open temp file" +msgstr "" + +#: ../src/file.c:458 ../src/file.c:463 +#, c-format +msgid "Draw mode '%s' no more supported" +msgstr "" + +#: ../src/geotag_exif.c:621 +msgid "Not enough memory." +msgstr "" + +#: ../src/geotag_exif.c:639 +msgid "Setting a value for this tag is unsupported!" +msgstr "" + +#: ../src/geotag_exif.c:658 +#, c-format +msgid "Too few components specified (need %d, found %d)\n" +msgstr "" + +#: ../src/geotag_exif.c:662 +msgid "Numeric value expected\n" +msgstr "" + +#: ../src/geotag_exif.c:670 +msgid "This shouldn't happen!" +msgstr "" + +#: ../src/geotag_exif.c:740 +msgid "Not yet implemented!" +msgstr "" + +#: ../src/geotag_exif.c:753 +msgid "Warning; Too many components specified!" +msgstr "" + +#: ../src/osm-traces.c:87 +msgid "Identifiable (public w/ timestamps)" +msgstr "" + +#: ../src/osm-traces.c:88 +msgid "Trackable (private w/ timestamps)" +msgstr "" + +#: ../src/osm-traces.c:89 +msgid "Public" +msgstr "" + +#: ../src/osm-traces.c:90 +msgid "Private" +msgstr "" + +#: ../src/osm-traces.c:108 +msgid "Access Token:" +msgstr "" + +#: ../src/osm-traces.c:108 +msgid "Get New OSM Access Tokens" +msgstr "" + +#: ../src/osm-traces.c:109 +msgid "Access Token Key:" +msgstr "" + +#: ../src/osm-traces.c:110 +msgid "Access Token Secret:" +msgstr "" + +#: ../src/osm-traces.c:111 +msgid "OSM username:" +msgstr "" + +#: ../src/osm-traces.c:112 +msgid "OSM password:" +msgstr "" + +#. Check to really override existing values... +#: ../src/osm-traces.c:263 +msgid "Do you want to overwrite existing values?" +msgstr "" + +#: ../src/osm-traces.c:275 +msgid "Not able to generate OSM request tokens." +msgstr "" + +#: ../src/osm-traces.c:299 +msgid "" +"Waiting for authorization approval.\n" +"Ensure you have granted access at the website before continuing here." +msgstr "" + +#: ../src/osm-traces.c:315 +#, fuzzy +msgid "No Authorization." +msgstr "Allugamientu automáticu" + +#: ../src/osm-traces.c:354 +msgid "" +"OSM Username and Password preferences are not required anymore. You can now " +"remove them." +msgstr "" + +#. Preferences +#: ../src/osm-traces.c:379 +msgid "OpenStreetMap Traces" +msgstr "" + +#: ../src/osm-traces.c:504 +#, c-format +msgid "failed to upload data: HTTP response is %ld" +msgstr "" + +#: ../src/osm-traces.c:509 +#, c-format +msgid "curl_easy_getinfo failed: %d" +msgstr "" + +#: ../src/osm-traces.c:514 +#, c-format +msgid "curl request failed: %s" +msgstr "" + +#. Success +#: ../src/osm-traces.c:592 +msgid "Uploaded to OSM" +msgstr "" + +#: ../src/osm-traces.c:596 +msgid "" +"FAILED TO UPLOAD DATA TO OSM - Ensure the OSM access token preferences are " +"setup." +msgstr "" + +#: ../src/osm-traces.c:599 +msgid "FAILED TO UPLOAD DATA TO OSM - CURL PROBLEM" +msgstr "" + +#: ../src/osm-traces.c:602 +msgid "FAILED TO UPLOAD DATA TO OSM" +msgstr "" + +#: ../src/osm-traces.c:602 +msgid "HTTP response code" +msgstr "" + +#: ../src/osm-traces.c:610 +#, c-format +msgid "failed to unlink temporary file: %s" +msgstr "" + +#: ../src/osm-traces.c:664 +msgid "OSM upload" +msgstr "" + +#: ../src/osm-traces.c:689 +msgid "" +"The email/username used as login\n" +"Enter the email/username you use to login into www.openstreetmap.org." +"" +msgstr "" + +#: ../src/osm-traces.c:697 +msgid "" +"The password used to login\n" +"Enter the password you use to login into www.openstreetmap.org." +msgstr "" + +#: ../src/osm-traces.c:703 +msgid "File's name:" +msgstr "" + +#: ../src/osm-traces.c:713 +msgid "" +"The name of the file on OSM\n" +"This is the name of the file created on the server.This is not the " +"name of the local file." +msgstr "" + +#: ../src/osm-traces.c:717 ../src/viktrwlayer_wpwin.c:197 +#: ../src/viktrwlayer_wpwin.c:199 +msgid "Description:" +msgstr "Descripción:" + +#: ../src/osm-traces.c:731 +msgid "The description of the trace" +msgstr "" + +#: ../src/osm-traces.c:734 +msgid "Anonymize Times:" +msgstr "" + +#: ../src/osm-traces.c:739 +msgid "" +"Anonymize times of the trace.\n" +"You may choose to make the trace identifiable, yet mask the actual " +"real time values" +msgstr "" + +#: ../src/osm-traces.c:743 +msgid "Tags:" +msgstr "" + +#: ../src/osm-traces.c:751 +msgid "The tags associated to the trace" +msgstr "" + +#: ../src/osm-traces.c:816 +#, c-format +msgid "Uploading %s to OSM" +msgstr "" + +#: ../src/mapcache.c:67 +msgid "Map cache memory size (MB):" +msgstr "" + +#. NB Can have a couple hundred fonts loaded when using system directories +#. So ATM don't list them all - otherwise need better GUI feedback display. +#: ../src/mapnik_interface.cpp:324 +#, c-format +msgid "" +"%s %s\n" +"Plugins=%sFonts loaded=%d" +msgstr "" + +#: ../src/mapnik_interface.cpp:325 ../src/vikmapniklayer.c:278 +msgid "Mapnik" +msgstr "" + +#: ../src/print.c:51 ../src/viktrwlayer.c:572 +msgid "None" +msgstr "" + +#: ../src/print.c:52 +msgid "Horizontally" +msgstr "" + +#: ../src/print.c:53 +msgid "Vertically" +msgstr "" + +#: ../src/print.c:54 +msgid "Both" +msgstr "" + +#: ../src/print.c:118 +msgid "Image Settings" +msgstr "" + +#: ../src/print.c:551 +msgid "done" +msgstr "" + +#. Page Size +#: ../src/print.c:580 +msgid "_Adjust Page Size and Orientation" +msgstr "" + +#: ../src/print.c:596 +msgid "C_enter:" +msgstr "" + +#. ignore page margins +#: ../src/print.c:614 +msgid "Ignore Page _Margins" +msgstr "" + +#: ../src/print.c:633 +msgid "Image S_ize:" +msgstr "" + +#: ../src/ui_util.c:88 +#, c-format +msgid "Could not launch web browser. %s" +msgstr "" + +#: ../src/ui_util.c:101 +#, c-format +msgid "Could not create new email. %s" +msgstr "" + +#: ../src/vikcoordlayer.c:57 +msgid "Color:" +msgstr "" + +#: ../src/vikcoordlayer.c:58 +msgid "Minutes Width:" +msgstr "" + +#: ../src/vikcoordlayer.c:59 +msgid "Line Thickness:" +msgstr "" + +#: ../src/vikcoordlayer.c:66 +msgid "Coordinate" +msgstr "" + +#: ../src/main.c:92 +#, c-format +msgid "Ignoring Xlib error: error code %d request code %d\n" +msgstr "" + +#: ../src/main.c:111 +msgid "Enable debug output" +msgstr "" + +#: ../src/main.c:112 +msgid "Enable verbose output" +msgstr "" + +#: ../src/main.c:113 +msgid "Show version" +msgstr "" + +#: ../src/main.c:114 +msgid "Latitude in decimal degrees" +msgstr "" + +#: ../src/main.c:115 +msgid "Longitude in decimal degrees" +msgstr "" + +#: ../src/main.c:116 +msgid "Zoom Level (OSM). Value can be 0 - 22" +msgstr "" + +#: ../src/main.c:117 +msgid "Add a map layer by id value. Use 0 for the default map." +msgstr "" + +#: ../src/main.c:160 +#, c-format +msgid "" +"%s %s\n" +"Copyright (c) 2003-2008 Evan Battaglia\n" +"Copyright (c) 2008-%s Viking's contributors\n" +msgstr "" + +#: ../src/osm.c:50 +msgid "OpenStreetMap (Mapnik)" +msgstr "" + +#: ../src/osm.c:65 +msgid "OpenStreetMap (Cycle)" +msgstr "" + +#: ../src/osm.c:79 +msgid "OpenStreetMap (Transport)" +msgstr "" + +#: ../src/osm.c:95 +msgid "OpenStreetMap (Humanitarian)" +msgstr "" + +#: ../src/osm.c:111 +msgid "On Disk OSM Tile Format" +msgstr "" + +#: ../src/osm.c:121 +msgid "MBTiles File" +msgstr "" + +#: ../src/osm.c:132 +msgid "OSM Metatiles" +msgstr "" + +#: ../src/osm.c:146 +msgid "Mapbox Outdoors" +msgstr "" + +#: ../src/osm.c:153 +msgid "Mapbox Specific" +msgstr "" + +#: ../src/osm.c:170 +msgid "OSM (view)" +msgstr "" + +#: ../src/osm.c:174 +msgid "OSM (edit)" +msgstr "" + +#. Note the use of positional parameters +#: ../src/osm.c:179 +msgid "OSM (query)" +msgstr "" + +#: ../src/osm.c:183 +msgid "OSM (render)" +msgstr "" + +#. Example: http://127.0.0.1:8111/load_and_zoom?left=8.19&right=8.20&top=48.605&bottom=48.590&select=node413602999 +#. JOSM or merkaartor must already be running with remote interface enabled +#: ../src/osm.c:190 +msgid "Local port 8111 (eg JOSM)" +msgstr "" + +#: ../src/osm.c:195 +msgid "Geofabrik Map Compare" +msgstr "" + +#: ../src/osm.c:203 +msgid "OpenStreetMap Notes" +msgstr "" + +#. Not really OSM but can't be bothered to create somewhere else to put it... +#: ../src/osm.c:221 +msgid "Wikimedia Toolserver GeoHack" +msgstr "" + +#: ../src/preferences.c:195 +msgid "Preferences" +msgstr "" + +#: ../src/toolbar.c:91 ../src/toolbar.c:92 +msgid "System Default" +msgstr "" + +#: ../src/toolbar.c:91 ../src/viktrwlayer.c:563 +msgid "Small" +msgstr "" + +#: ../src/toolbar.c:91 ../src/viktrwlayer.c:564 +msgid "Medium" +msgstr "" + +#: ../src/toolbar.c:91 ../src/viktrwlayer.c:565 +msgid "Large" +msgstr "" + +#: ../src/toolbar.c:92 +msgid "Icons Only" +msgstr "" + +#: ../src/toolbar.c:92 +msgid "Text Only" +msgstr "" + +#: ../src/toolbar.c:92 +msgid "Icons and Text" +msgstr "" + +#: ../src/toolbar.c:106 +msgid "Append to Menu:" +msgstr "" + +#: ../src/toolbar.c:107 +msgid "Pack the toolbar to the main menu to save vertical space" +msgstr "" + +#: ../src/toolbar.c:108 +msgid "Icon Size:" +msgstr "" + +#: ../src/toolbar.c:110 +msgid "Icon Style:" +msgstr "" + +#: ../src/toolbar.c:112 +msgid "Customize:" +msgstr "" + +#: ../src/toolbar.c:112 +msgid "Customize Buttons" +msgstr "" + +#. Preferences +#: ../src/toolbar.c:145 +msgid "Toolbar" +msgstr "" + +#: ../src/toolbar.c:312 +msgid "_Customize" +msgstr "" + +#: ../src/toolbar.c:641 +msgid "Separator" +msgstr "" + +#: ../src/toolbar.c:642 +msgid "--- Separator ---" +msgstr "" + +#: ../src/toolbar.c:1007 +msgid "Customize Toolbar" +msgstr "" + +#: ../src/toolbar.c:1028 +msgid "" +"Select items to be displayed on the toolbar. Items can be reordered by drag " +"and drop." +msgstr "" + +#: ../src/toolbar.c:1044 +msgid "Available Items" +msgstr "" + +#: ../src/toolbar.c:1065 +msgid "Displayed Items" +msgstr "" + +#: ../src/viklayer_defaults.c:232 +#, c-format +msgid "Could not open file: %s" +msgstr "" + +#: ../src/viklayer_defaults.c:304 +msgid "Layer Defaults" +msgstr "" + +#: ../src/uibuilder.c:196 +msgid "Take care that this password will be stored clearly in a plain file." +msgstr "" + +#: ../src/uibuilder.c:628 ../src/viktrwlayer_export.c:188 +#: ../src/viktrwlayer_export.c:304 ../src/vikwindow.c:3666 +#: ../src/vikwindow.c:4408 +#, c-format +msgid "The file \"%s\" exists, do you wish to overwrite it?" +msgstr "" + +#: ../src/vikaggregatelayer.c:41 +msgid "Aggregate" +msgstr "" + +#: ../src/vikaggregatelayer.c:528 ../src/viktrwlayer.c:11700 +#, c-format +msgid "%s: Waypoint List" +msgstr "" + +#: ../src/vikaggregatelayer.c:570 +msgid "Search by Date" +msgstr "" + +#: ../src/vikaggregatelayer.c:576 +msgid "No items found with the requested date." +msgstr "" + +#: ../src/vikaggregatelayer.c:615 ../src/viktrwlayer.c:11691 +#, c-format +msgid "%s: Track and Route List" +msgstr "" + +#: ../src/vikaggregatelayer.c:681 ../src/viktrwlayer.c:8346 +#: ../src/viktrwlayer.c:8417 ../src/viktrwlayer.c:8494 +msgid "_Visibility" +msgstr "" + +#: ../src/vikaggregatelayer.c:686 +msgid "_Show All" +msgstr "" + +#: ../src/vikaggregatelayer.c:692 +msgid "_Hide All" +msgstr "" + +#: ../src/vikaggregatelayer.c:698 ../src/viktrwlayer.c:8363 +#: ../src/viktrwlayer.c:8434 ../src/viktrwlayer.c:8511 +msgid "_Toggle" +msgstr "" + +#: ../src/vikaggregatelayer.c:705 ../src/viktrwlayer.c:8532 +msgid "_Sort" +msgstr "" + +#: ../src/vikaggregatelayer.c:711 ../src/viktrwlayer.c:8538 +msgid "Name _Ascending" +msgstr "" + +#: ../src/vikaggregatelayer.c:717 ../src/viktrwlayer.c:8544 +msgid "Name _Descending" +msgstr "" + +#: ../src/vikaggregatelayer.c:723 ../src/viktrwlayer.c:575 +#: ../src/viktrwlayer.c:8550 +msgid "Date Ascending" +msgstr "" + +#: ../src/vikaggregatelayer.c:729 ../src/viktrwlayer.c:576 +#: ../src/viktrwlayer.c:8556 +msgid "Date Descending" +msgstr "" + +#: ../src/vikaggregatelayer.c:735 ../src/viktrwlayer.c:8445 +#: ../src/viktrwlayer.c:8523 ../src/viktrwlayer.c:8595 +#: ../src/viktrwlayer_tracklist.c:296 +msgid "_Statistics" +msgstr "" + +#: ../src/vikaggregatelayer.c:740 ../src/viktrwlayer.c:4533 +msgid "Track _List..." +msgstr "" + +#: ../src/vikaggregatelayer.c:746 ../src/viktrwlayer.c:4540 +msgid "_Waypoint List..." +msgstr "" + +#: ../src/vikaggregatelayer.c:753 +msgid "Searc_h" +msgstr "" + +#: ../src/vikaggregatelayer.c:759 +msgid "By _Date..." +msgstr "" + +#: ../src/vikaggregatelayer.c:762 +msgid "Find the first item with a specified date" +msgstr "" + +#: ../src/vikaggregatelayer.c:765 +msgid "Load E_xternal Layers" +msgstr "" + +#. Could have a more complicated tooltip that numbers each type of layers, +#. but for now a simple overall count +#: ../src/vikaggregatelayer.c:1011 +#, c-format +msgid "One layer" +msgid_plural "%d layers" +msgstr[0] "" +msgstr[1] "" + +#: ../src/vikaggregatelayer.c:1014 +#, c-format +msgid "Empty" +msgstr "" + +#: ../src/vikdemlayer.c:86 +msgid "SRTM Global 90m (3 arcsec)" +msgstr "" + +#: ../src/vikdemlayer.c:94 +msgid "Absolute height" +msgstr "" + +#: ../src/vikdemlayer.c:95 +msgid "Height gradient" +msgstr "" + +#: ../src/vikdemlayer.c:120 +msgid "DEM Files:" +msgstr "" + +#: ../src/vikdemlayer.c:121 +msgid "Download Source:" +msgstr "" + +#: ../src/vikdemlayer.c:122 +msgid "Min Elev Color:" +msgstr "" + +#: ../src/vikdemlayer.c:123 ../src/viktrwlayer_wpwin.c:207 +msgid "Type:" +msgstr "" + +#: ../src/vikdemlayer.c:124 +msgid "Min Elev:" +msgstr "" + +#: ../src/vikdemlayer.c:125 +msgid "Max Elev:" +msgstr "" + +#: ../src/vikdemlayer.c:137 +msgid "_DEM Download" +msgstr "" + +#: ../src/vikdemlayer.c:137 +msgid "DEM Download" +msgstr "" + +#: ../src/vikdemlayer.c:192 +msgid "DEM" +msgstr "" + +#: ../src/vikdemlayer.c:304 +#, c-format +msgid "Number of files: %d" +msgstr "" + +#: ../src/vikdemlayer.c:446 +msgid "DEM Loading" +msgstr "" + +#: ../src/vikdemlayer.c:927 +#, c-format +msgid "No SRTM data available for %f, %f" +msgstr "" + +#: ../src/vikdemlayer.c:948 +#, c-format +msgid "DEM download failure for %f, %f" +msgstr "" + +#: ../src/vikdemlayer.c:954 +#, c-format +msgid "DEM write failure for %s" +msgstr "" + +#. Probably not over any land... +#: ../src/vikdemlayer.c:1201 +msgid "No DEM File Available" +msgstr "" + +#: ../src/vikdemlayer.c:1220 +#, c-format +msgid "" +"\n" +"Source: %s\n" +"\n" +"DEM File: %s\n" +"DEM File Timestamp: %s" +msgstr "" + +#: ../src/vikdemlayer.c:1224 +#, c-format +msgid "" +"Source: %s\n" +"\n" +"No DEM File!" +msgstr "" + +#: ../src/vikdemlayer.c:1264 +#, c-format +msgid "Downloading DEM %s" +msgstr "" + +#: ../src/vikdemlayer.c:1289 +msgid "_Show DEM File Information" +msgstr "" + +#: ../src/vikfileentry.c:72 +msgid "Browse..." +msgstr "" + +#: ../src/vikfileentry.c:103 +msgid "Choose file" +msgstr "" + +#: ../src/vikfileentry.c:120 ../src/vikwindow.c:4372 +msgid "PNG" +msgstr "" + +#: ../src/vikfileentry.c:125 +msgid "TIFF" +msgstr "" + +#: ../src/vikfileentry.c:133 +msgid "MBTiles" +msgstr "" + +#: ../src/vikfileentry.c:142 +msgid "XML" +msgstr "" + +#: ../src/vikfileentry.c:149 +msgid "MML" +msgstr "" + +#: ../src/vikfileentry.c:154 +msgid "MSS" +msgstr "" + +#: ../src/vikfilelist.c:49 +msgid "Choose file(s)" +msgstr "" + +#: ../src/vikfilelist.c:182 +msgid "Add..." +msgstr "" + +#: ../src/vikfilelist.c:183 +msgid "Delete" +msgstr "" + +#: ../src/vikgeoreflayer.c:97 +msgid "_Georef Move Map" +msgstr "" + +#: ../src/vikgeoreflayer.c:97 +msgid "Georef Move Map" +msgstr "" + +#: ../src/vikgeoreflayer.c:106 +msgid "Georef Z_oom Tool" +msgstr "" + +#: ../src/vikgeoreflayer.c:106 +msgid "Georef Zoom Tool" +msgstr "" + +#: ../src/vikgeoreflayer.c:117 +msgid "GeoRef Map" +msgstr "" + +#: ../src/vikgeoreflayer.c:214 +msgid "Auto Read World Files:" +msgstr "" + +#: ../src/vikgeoreflayer.c:215 +msgid "" +"Automatically attempt to read associated world file of a new image for a " +"GeoRef layer" +msgstr "" + +#: ../src/vikgeoreflayer.c:511 ../src/vikgeoreflayer.c:797 +#: ../src/vikmapslayer.c:1174 +#, c-format +msgid "Couldn't open image file: %s" +msgstr "" + +#: ../src/vikgeoreflayer.c:607 ../src/vikgeoreflayer.c:633 +msgid "Choose World file" +msgstr "" + +#: ../src/vikgeoreflayer.c:619 +msgid "The World file you requested could not be opened for reading." +msgstr "" + +#: ../src/vikgeoreflayer.c:621 +msgid "Unexpected end of file reading World file." +msgstr "" + +#: ../src/vikgeoreflayer.c:646 +msgid "The file you requested could not be opened for writing." +msgstr "" + +#: ../src/vikgeoreflayer.c:782 +msgid "Lower right corner values may not be consistent with upper right values" +msgstr "" + +#: ../src/vikgeoreflayer.c:806 +#, c-format +msgid "Invalid image size: %s" +msgstr "" + +#: ../src/vikgeoreflayer.c:831 ../src/viklayer.c:561 ../src/vikwindow.c:4891 +msgid "Layer Properties" +msgstr "" + +#: ../src/vikgeoreflayer.c:852 +msgid "World File Parameters:" +msgstr "" + +#: ../src/vikgeoreflayer.c:853 +msgid "Load From File..." +msgstr "" + +#: ../src/vikgeoreflayer.c:858 +msgid "Corner pixel easting:" +msgstr "" + +#: ../src/vikgeoreflayer.c:860 +msgid "the UTM \"easting\" value of the upper-left corner pixel of the map" +msgstr "" + +#: ../src/vikgeoreflayer.c:862 +msgid "Corner pixel northing:" +msgstr "" + +#: ../src/vikgeoreflayer.c:864 +msgid "the UTM \"northing\" value of the upper-left corner pixel of the map" +msgstr "" + +#: ../src/vikgeoreflayer.c:866 +msgid "X (easting) scale (mpp): " +msgstr "" + +#: ../src/vikgeoreflayer.c:867 +msgid "Y (northing) scale (mpp): " +msgstr "" + +#: ../src/vikgeoreflayer.c:870 +msgid "the scale of the map in the X direction (meters per pixel)" +msgstr "" + +#: ../src/vikgeoreflayer.c:872 +msgid "the scale of the map in the Y direction (meters per pixel)" +msgstr "" + +#: ../src/vikgeoreflayer.c:874 +msgid "Map Image:" +msgstr "" + +#: ../src/vikgeoreflayer.c:919 +msgid "Upper left latitude:" +msgstr "" + +#: ../src/vikgeoreflayer.c:921 +msgid "Upper left longitude:" +msgstr "" + +#: ../src/vikgeoreflayer.c:923 +msgid "Lower right latitude:" +msgstr "" + +#: ../src/vikgeoreflayer.c:925 +msgid "Lower right longitude:" +msgstr "" + +#: ../src/vikgeoreflayer.c:937 +msgid "Calculate MPP values from coordinates" +msgstr "" + +#: ../src/vikgeoreflayer.c:938 +msgid "" +"Enter all corner coordinates before calculating the MPP values from the " +"image size" +msgstr "" + +#: ../src/vikgeoreflayer.c:948 +msgid "UTM" +msgstr "" + +#: ../src/vikgeoreflayer.c:949 +msgid "Latitude/Longitude" +msgstr "" + +#: ../src/vikgeoreflayer.c:957 ../src/vikmapniklayer.c:82 +#: ../src/vikmapslayer.c:158 +msgid "Alpha:" +msgstr "" + +#. Now with icons +#: ../src/vikgeoreflayer.c:1062 +msgid "_Zoom to Fit Map" +msgstr "" + +#: ../src/vikgeoreflayer.c:1068 +msgid "_Goto Map Center" +msgstr "" + +#: ../src/vikgeoreflayer.c:1074 +msgid "_Export to World File" +msgstr "" + +#: ../src/vikgoto.c:98 +msgid "No goto tool available." +msgstr "" + +#: ../src/vikgoto.c:295 +msgid "goto" +msgstr "" + +#: ../src/vikgoto.c:297 +msgid "goto provider:" +msgstr "" + +#: ../src/vikgoto.c:312 +msgid "Enter address or place name:" +msgstr "" + +#: ../src/vikgoto.c:487 +msgid "Locality" +msgstr "" + +#: ../src/vikgpslayer.c:137 +msgid "Data Mode" +msgstr "" + +#: ../src/vikgpslayer.c:139 +msgid "Realtime Tracking Mode" +msgstr "" + +#: ../src/vikgpslayer.c:176 +msgid "Keep vehicle at center" +msgstr "" + +#: ../src/vikgpslayer.c:177 +msgid "Keep vehicle on screen" +msgstr "" + +#: ../src/vikgpslayer.c:178 +msgid "Disable" +msgstr "" + +#: ../src/vikgpslayer.c:218 +msgid "Download Tracks:" +msgstr "" + +#: ../src/vikgpslayer.c:219 +msgid "Upload Tracks:" +msgstr "" + +#: ../src/vikgpslayer.c:220 +msgid "Download Routes:" +msgstr "" + +#: ../src/vikgpslayer.c:221 +msgid "Upload Routes:" +msgstr "" + +#: ../src/vikgpslayer.c:222 +msgid "Download Waypoints:" +msgstr "Descargar puntos de vía" + +#: ../src/vikgpslayer.c:223 +msgid "Upload Waypoints:" +msgstr "Xubir puntos de vía" + +#: ../src/vikgpslayer.c:225 +msgid "Recording tracks" +msgstr "" + +#: ../src/vikgpslayer.c:226 +msgid "Jump to current position on start" +msgstr "" + +#: ../src/vikgpslayer.c:227 +msgid "Moving Map Method:" +msgstr "" + +#: ../src/vikgpslayer.c:228 +msgid "Update Statusbar:" +msgstr "" + +#: ../src/vikgpslayer.c:228 +msgid "Display information in the statusbar on GPS updates" +msgstr "" + +#: ../src/vikgpslayer.c:229 +#, fuzzy +msgid "Auto Connect" +msgstr "Allugamientu automáticu" + +#: ../src/vikgpslayer.c:229 +msgid "Automatically connect to GPSD" +msgstr "" + +#: ../src/vikgpslayer.c:230 +msgid "Gpsd Host:" +msgstr "" + +#: ../src/vikgpslayer.c:231 +msgid "Gpsd Port:" +msgstr "" + +#: ../src/vikgpslayer.c:232 +msgid "Gpsd Retry Interval (seconds):" +msgstr "" + +#: ../src/vikgpslayer.c:254 +msgid "GPS" +msgstr "" + +#: ../src/vikgpslayer.c:320 ../src/vikgpslayer.c:1504 +msgid "GPS Download" +msgstr "" + +#: ../src/vikgpslayer.c:320 ../src/vikgpslayer.c:1504 ../src/viktrwlayer.c:3993 +msgid "GPS Upload" +msgstr "" + +#: ../src/vikgpslayer.c:322 +msgid "GPS Realtime Tracking" +msgstr "" + +#: ../src/vikgpslayer.c:458 +msgid "Connected" +msgstr "" + +#: ../src/vikgpslayer.c:460 +msgid "Disconnected" +msgstr "" + +#: ../src/vikgpslayer.c:554 +msgid "Unknown GPS Protocol" +msgstr "" + +#: ../src/vikgpslayer.c:572 +msgid "Unknown serial port device" +msgstr "" + +#: ../src/vikgpslayer.c:691 +#, c-format +msgid "%s: unknown parameter" +msgstr "" + +#. Now with icons +#: ../src/vikgpslayer.c:794 +msgid "_Upload to GPS" +msgstr "" + +#: ../src/vikgpslayer.c:800 +msgid "Download from _GPS" +msgstr "" + +#: ../src/vikgpslayer.c:821 +msgid "Empty _Realtime" +msgstr "" + +#: ../src/vikgpslayer.c:828 +msgid "E_mpty Upload" +msgstr "" + +#: ../src/vikgpslayer.c:834 +msgid "_Empty Download" +msgstr "" + +#: ../src/vikgpslayer.c:840 +msgid "Empty _All" +msgstr "" + +#: ../src/vikgpslayer.c:852 +#, c-format +msgid "Unexpected number of disconnected handlers: %d" +msgstr "" + +#: ../src/vikgpslayer.c:995 +#, c-format +msgid "Uploading %d waypoint..." +msgid_plural "Uploading %d waypoints..." +msgstr[0] "Xubiendo %d puntu de vía..." +msgstr[1] "Xubiendo %d puntos de vía..." + +#: ../src/vikgpslayer.c:1000 +#, c-format +msgid "Uploading %d trackpoint..." +msgid_plural "Uploading %d trackpoints..." +msgstr[0] "" +msgstr[1] "" + +#: ../src/vikgpslayer.c:1005 +#, c-format +msgid "Uploading %d routepoint..." +msgid_plural "Uploading %d routepoints..." +msgstr[0] "" +msgstr[1] "" + +#: ../src/vikgpslayer.c:1034 +#, c-format +msgid "Downloaded %d out of %d waypoint..." +msgid_plural "Downloaded %d out of %d waypoints..." +msgstr[0] "Descargáu %d de %d puntos de vía..." +msgstr[1] "Descargaos %d de %d puntos de vía..." + +#: ../src/vikgpslayer.c:1040 +#, c-format +msgid "Downloaded %d out of %d trackpoint..." +msgid_plural "Downloaded %d out of %d trackpoints..." +msgstr[0] "" +msgstr[1] "" + +#: ../src/vikgpslayer.c:1046 +#, c-format +msgid "Downloaded %d out of %d routepoint..." +msgid_plural "Downloaded %d out of %d routepoints..." +msgstr[0] "" +msgstr[1] "" + +#: ../src/vikgpslayer.c:1056 +#, c-format +msgid "Uploaded %d out of %d waypoint..." +msgid_plural "Uploaded %d out of %d waypoints..." +msgstr[0] "Xubíu %d de %d puntos de vía..." +msgstr[1] "Xubíos %d de %d puntos de vía..." + +#: ../src/vikgpslayer.c:1062 +#, c-format +msgid "Uploaded %d out of %d trackpoint..." +msgid_plural "Uploaded %d out of %d trackpoints..." +msgstr[0] "" +msgstr[1] "" + +#: ../src/vikgpslayer.c:1068 +#, c-format +msgid "Uploaded %d out of %d routepoint..." +msgid_plural "Uploaded %d out of %d routepoints..." +msgstr[0] "" +msgstr[1] "" + +#: ../src/vikgpslayer.c:1079 +#, c-format +msgid "Downloaded %d waypoint" +msgid_plural "Downloaded %d waypoints" +msgstr[0] "Descargáu %d puntu de vía" +msgstr[1] "Descargaos %d puntos de vía" + +#: ../src/vikgpslayer.c:1085 +#, c-format +msgid "Downloaded %d trackpoint" +msgid_plural "Downloaded %d trackpoints" +msgstr[0] "" +msgstr[1] "" + +#: ../src/vikgpslayer.c:1091 +#, c-format +msgid "Downloaded %d routepoint" +msgid_plural "Downloaded %d routepoints" +msgstr[0] "" +msgstr[1] "" + +#: ../src/vikgpslayer.c:1101 +#, c-format +msgid "Uploaded %d waypoint" +msgid_plural "Uploaded %d waypoints" +msgstr[0] "Xubíu %d puntu de vía" +msgstr[1] "Xubíos %d puntos de vía" + +#: ../src/vikgpslayer.c:1107 +#, c-format +msgid "Uploaded %d trackpoint" +msgid_plural "Uploaded %d trackpoints" +msgstr[0] "" +msgstr[1] "" + +#: ../src/vikgpslayer.c:1113 +#, c-format +msgid "Uploaded %d routepoint" +msgid_plural "Uploaded %d routepoints" +msgstr[0] "" +msgstr[1] "" + +#: ../src/vikgpslayer.c:1363 +msgid "Error: No result." +msgstr "" + +#: ../src/vikgpslayer.c:1471 +msgid "Warning - GPS Upload items may overwrite each other" +msgstr "" + +#: ../src/vikgpslayer.c:1506 +msgid "Status: detecting gpsbabel" +msgstr "" + +#: ../src/vikgpslayer.c:1533 +msgid "No GPS items selected for transfer." +msgstr "" + +#: ../src/vikgpslayer.c:1546 +msgid "Could not turn off device." +msgstr "" + +#: ../src/vikgpslayer.c:1589 +msgid "Are you sure you want to delete GPS Upload data?" +msgstr "" + +#: ../src/vikgpslayer.c:1602 +msgid "Are you sure you want to delete GPS Download data?" +msgstr "" + +#: ../src/vikgpslayer.c:1616 +msgid "Are you sure you want to delete GPS Realtime data?" +msgstr "" + +#: ../src/vikgpslayer.c:1630 +msgid "Are you sure you want to delete All GPS data?" +msgstr "" + +#: ../src/vikgpslayer.c:2004 +#, c-format +msgid "" +"Failed to connect to gpsd at %s (port %s)\n" +"Should Viking keep trying (every %d seconds)?" +msgstr "" + +#: ../src/viklayerspanel.c:73 +msgid "C_ut" +msgstr "" + +#: ../src/viklayerspanel.c:74 ../src/vikwindow.c:4882 +msgid "_Copy" +msgstr "" + +#: ../src/viklayerspanel.c:75 ../src/vikwindow.c:4883 +msgid "_Paste" +msgstr "" + +#: ../src/viklayerspanel.c:76 ../src/vikwindow.c:4884 +msgid "_Delete" +msgstr "" + +#: ../src/viklayerspanel.c:154 +msgid "New Layer" +msgstr "" + +#: ../src/viklayerspanel.c:347 +msgid "Top Layer" +msgstr "" + +#: ../src/viklayerspanel.c:363 +msgid "Add new layer" +msgstr "" + +#: ../src/viklayerspanel.c:370 ../src/vikwindow.c:4884 +msgid "Remove selected layer" +msgstr "" + +#: ../src/viklayerspanel.c:377 +msgid "Move selected layer up" +msgstr "" + +#: ../src/viklayerspanel.c:384 +msgid "Move selected layer down" +msgstr "" + +#: ../src/viklayerspanel.c:391 ../src/vikwindow.c:4881 +msgid "Cut selected layer" +msgstr "" + +#: ../src/viklayerspanel.c:398 ../src/vikwindow.c:4882 +msgid "Copy selected layer" +msgstr "" + +#: ../src/viklayerspanel.c:405 ../src/vikwindow.c:4883 +msgid "" +"Paste layer into selected container layer or otherwise above selected layer" +msgstr "" + +#: ../src/viklayerspanel.c:502 +msgid "New name can not be blank." +msgstr "" + +#: ../src/viklayerspanel.c:751 +msgid "Aggregate Layers have no settable properties." +msgstr "" + +#: ../src/viklayerspanel.c:798 +msgid "You cannot cut the Top Layer." +msgstr "" + +#: ../src/viklayerspanel.c:843 +#, c-format +msgid "Are you sure you want to delete %s?" +msgstr "" + +#: ../src/viklayerspanel.c:863 +msgid "You cannot delete the Top Layer." +msgstr "" + +#: ../src/vikmapniklayer.c:78 +msgid "CSS (MML) Config File:" +msgstr "" + +#: ../src/vikmapniklayer.c:79 +msgid "CartoCSS configuration file" +msgstr "" + +#: ../src/vikmapniklayer.c:80 +msgid "XML Config File:" +msgstr "" + +#: ../src/vikmapniklayer.c:81 +msgid "Mapnik XML configuration file" +msgstr "" + +#: ../src/vikmapniklayer.c:84 +msgid "Use File Cache:" +msgstr "" + +#: ../src/vikmapniklayer.c:86 +msgid "File Cache Directory:" +msgstr "" + +#: ../src/vikmapniklayer.c:122 +msgid "_Mapnik Features" +msgstr "" + +#: ../src/vikmapniklayer.c:122 +msgid "Mapnik Features" +msgstr "" + +#: ../src/vikmapniklayer.c:140 +msgid "Mapnik Rendering" +msgstr "" + +#. Changing these values only applies before first mapnik layer is 'created' +#: ../src/vikmapniklayer.c:258 +msgid "Plugins Directory:" +msgstr "" + +#: ../src/vikmapniklayer.c:258 ../src/vikmapniklayer.c:259 +#: ../src/vikmapniklayer.c:260 ../src/vikmapniklayer.c:261 +msgid "You need to restart Viking for a change to this value to be used" +msgstr "" + +#: ../src/vikmapniklayer.c:259 +msgid "Fonts Directory:" +msgstr "" + +#: ../src/vikmapniklayer.c:260 +msgid "Recurse Fonts Directory:" +msgstr "" + +#: ../src/vikmapniklayer.c:261 +msgid "Rerender Timeout (hours):" +msgstr "" + +#. Changeable any time +#: ../src/vikmapniklayer.c:263 +msgid "CartoCSS:" +msgstr "" + +#: ../src/vikmapniklayer.c:263 +msgid "The program to convert CartoCSS files into Mapnik XML" +msgstr "" + +#: ../src/vikmapniklayer.c:506 +msgid "Running" +msgstr "" + +#: ../src/vikmapniklayer.c:525 +#, c-format +msgid "" +"Error running carto command:\n" +"%s" +msgstr "" + +#: ../src/vikmapniklayer.c:561 +msgid " completed in " +msgstr "" + +#: ../src/vikmapniklayer.c:561 +msgid "seconds" +msgstr "" + +#: ../src/vikmapniklayer.c:611 ../src/vikmapniklayer.c:979 +#, c-format +msgid "" +"Mapnik error loading configuration file:\n" +"%s" +msgstr "" + +#: ../src/vikmapniklayer.c:749 +#, c-format +msgid "Mapnik Render %d:%d:%d %s" +msgstr "" + +#: ../src/vikmapniklayer.c:840 +msgid "Mapnik Rendering must be in Mercator mode" +msgstr "" + +#: ../src/vikmapniklayer.c:997 +msgid "Mapnik Information" +msgstr "" + +#: ../src/vikmapniklayer.c:1031 +msgid "_Flush Memory Cache" +msgstr "" + +#: ../src/vikmapniklayer.c:1044 +msgid "_Run Carto Command" +msgstr "" + +#: ../src/vikmapniklayer.c:1102 ../src/vikmapslayer.c:2029 +#, c-format +msgid "Tile File Timestamp: %s" +msgstr "" + +#: ../src/vikmapniklayer.c:1105 ../src/vikmapslayer.c:2032 +msgid "Tile File Timestamp: Not Available" +msgstr "" + +#: ../src/vikmapniklayer.c:1120 +#, c-format +msgid "Rendering time %.2f seconds" +msgstr "" + +#: ../src/vikmapniklayer.c:1124 ../src/vikmapslayer.c:2042 +msgid "Tile Information" +msgstr "" + +#: ../src/vikmapniklayer.c:1145 +msgid "_Rerender Tile" +msgstr "" + +#: ../src/vikmapniklayer.c:1150 +msgid "_Info" +msgstr "" + +#. ******* MAPZOOMS ******** +#: ../src/vikmapslayer.c:96 +msgid "Use Viking Zoom Level" +msgstr "" + +#: ../src/vikmapslayer.c:146 +msgid "OSM" +msgstr "" + +#. NB mode => id - But can't break file format just to rename something better +#: ../src/vikmapslayer.c:152 +msgid "Map Type:" +msgstr "" + +#: ../src/vikmapslayer.c:153 +msgid "Maps Directory:" +msgstr "" + +#: ../src/vikmapslayer.c:154 +msgid "Cache Layout:" +msgstr "" + +#: ../src/vikmapslayer.c:155 +msgid "This determines the tile storage layout on disk" +msgstr "" + +#: ../src/vikmapslayer.c:156 +msgid "Map File:" +msgstr "" + +#: ../src/vikmapslayer.c:157 +msgid "An MBTiles file. Only applies when the map type method is 'MBTiles'" +msgstr "" + +#: ../src/vikmapslayer.c:159 +msgid "Control the Alpha value for transparency effects" +msgstr "" + +#: ../src/vikmapslayer.c:160 +msgid "Autodownload maps:" +msgstr "" + +#: ../src/vikmapslayer.c:161 +msgid "Autodownload Only Gets Missing Maps:" +msgstr "" + +#: ../src/vikmapslayer.c:162 +msgid "" +"Using this option avoids attempting to update already acquired tiles. This " +"can be useful if you want to restrict the network usage, without having to " +"resort to manual control. Only applies when 'Autodownload Maps' is on." +msgstr "" + +#: ../src/vikmapslayer.c:163 +msgid "Zoom Level:" +msgstr "" + +#: ../src/vikmapslayer.c:164 +msgid "" +"Determines the method of displaying map tiles for the current zoom level. " +"'Viking Zoom Level' uses the best matching level, otherwise setting a fixed " +"value will always use map tiles of the specified value regardless of the " +"actual zoom level." +msgstr "" + +#: ../src/vikmapslayer.c:197 +msgid "_Maps Download" +msgstr "" + +#: ../src/vikmapslayer.c:197 +msgid "Maps Download" +msgstr "" + +#: ../src/vikmapslayer.c:213 ../src/vikutils.c:895 +msgid "Map" +msgstr "" + +#: ../src/vikmapslayer.c:306 +msgid "Default map layer directory:" +msgstr "" + +#: ../src/vikmapslayer.c:306 +msgid "Choose a directory to store cached Map tiles for this layer" +msgstr "" + +#: ../src/vikmapslayer.c:436 ../src/vikmapslayer.c:633 +msgid "Unknown map type" +msgstr "" + +#: ../src/vikmapslayer.c:664 +msgid "Unknown Map Zoom" +msgstr "" + +#: ../src/vikmapslayer.c:833 +#, c-format +msgid "Failed to open MBTiles file: %s" +msgstr "" + +#: ../src/vikmapslayer.c:856 +#, c-format +msgid "" +"New map cannot be displayed in the current drawmode.\n" +"Select \"%s\" from View menu to view it." +msgstr "" + +#: ../src/vikmapslayer.c:1314 +#, c-format +msgid "" +"Cowardly refusing to draw tiles or existence of tiles beyond %d zoom out " +"factor" +msgstr "" + +#. TODO: ?? count up the number of download errors somehow... +#: ../src/vikmapslayer.c:1667 +msgid "Failed to download tile" +msgstr "" + +#: ../src/vikmapslayer.c:1673 +msgid "Unable to save tile" +msgstr "" + +#: ../src/vikmapslayer.c:1799 +#, c-format +msgid "Redownloading up to %d %s map..." +msgid_plural "Redownloading up to %d %s maps..." +msgstr[0] "" +msgstr[1] "" + +#: ../src/vikmapslayer.c:1801 +#, c-format +msgid "Redownloading %d %s map..." +msgid_plural "Redownloading %d %s maps..." +msgstr[0] "" +msgstr[1] "" + +#: ../src/vikmapslayer.c:1805 ../src/vikmapslayer.c:1890 +#, c-format +msgid "Downloading %d %s map..." +msgid_plural "Downloading %d %s maps..." +msgstr[0] "" +msgstr[1] "" + +#: ../src/vikmapslayer.c:1969 +msgid "YES" +msgstr "" + +#: ../src/vikmapslayer.c:1973 ../src/vikmapslayer.c:1977 +msgid "NO" +msgstr "" + +#. NB Also handles .jpg automatically due to pixbuf_new_from () support - although just print png for now. +#: ../src/vikmapslayer.c:1980 +#, c-format +msgid "Source: %s (%d%s%d%s%d.%s %s)" +msgstr "" + +#: ../src/vikmapslayer.c:1983 +msgid "Source: Not available" +msgstr "" + +#: ../src/vikmapslayer.c:2000 +msgid "Source: file://" +msgstr "" + +#: ../src/vikmapslayer.c:2012 +#, c-format +msgid "Source: %s" +msgstr "" + +#: ../src/vikmapslayer.c:2038 +#, c-format +msgid "Tile File: %s [Not Available]" +msgstr "" + +#: ../src/vikmapslayer.c:2086 +msgid "Redownload _Bad Map(s)" +msgstr "" + +#: ../src/vikmapslayer.c:2090 +msgid "Redownload _New Map(s)" +msgstr "" + +#: ../src/vikmapslayer.c:2094 +msgid "Redownload _All Map(s)" +msgstr "" + +#: ../src/vikmapslayer.c:2099 +msgid "_Show Tile Information" +msgstr "" + +#: ../src/vikmapslayer.c:2166 +#, c-format +msgid "" +"Wrong drawmode for this map.\n" +"Select \"%s\" from View menu and try again." +msgstr "" + +#: ../src/vikmapslayer.c:2171 +msgid "Wrong zoom level for this map." +msgstr "" + +#: ../src/vikmapslayer.c:2334 +msgid "Zoom Start:" +msgstr "" + +#: ../src/vikmapslayer.c:2341 +msgid "Zoom End:" +msgstr "" + +#: ../src/vikmapslayer.c:2347 +msgid "Download Maps Method:" +msgstr "" + +#. redownload method - needs to align with REDOWNLOAD* macro values +#: ../src/vikmapslayer.c:2419 +msgid "Missing" +msgstr "" + +#: ../src/vikmapslayer.c:2419 +msgid "Bad" +msgstr "" + +#: ../src/vikmapslayer.c:2419 +msgid "New" +msgstr "" + +#: ../src/vikmapslayer.c:2419 +msgid "Reload All" +msgstr "" + +#: ../src/vikmapslayer.c:2421 +msgid "Download for Zoom Levels" +msgstr "" + +#: ../src/vikmapslayer.c:2461 +#, c-format +msgid "" +"You are not allowed to download more than %d tiles in one go (requested %d)" +msgstr "" + +#: ../src/vikmapslayer.c:2469 +#, c-format +msgid "Do you really want to download %d tiles?" +msgstr "" + +#. Now with icons +#: ../src/vikmapslayer.c:2509 +msgid "Download _Missing Onscreen Maps" +msgstr "" + +#: ../src/vikmapslayer.c:2516 +msgid "Download _New Onscreen Maps" +msgstr "" + +#: ../src/vikmapslayer.c:2523 +msgid "Reload _All Onscreen Maps" +msgstr "" + +#: ../src/vikmapslayer.c:2529 +msgid "Download Maps in _Zoom Levels..." +msgstr "" + +#: ../src/vikmapslayer.c:2539 +msgid "_Open MBTiles Files" +msgstr "" + +#: ../src/vikmapslayer.c:2554 +msgid "Flush Map Cache" +msgstr "" + +#: ../src/vikrouting.c:54 +msgid "Default engine:" +msgstr "" + +#: ../src/vikrouting.c:68 +msgid "Routing" +msgstr "" + +#: ../src/viktreeview.c:347 +msgid "Layer Name" +msgstr "" + +#: ../src/viktreeview.c:924 +#, c-format +msgid "delete data from %s\n" +msgstr "" + +#: ../src/viktrwlayer.c:427 +msgid "Create _Waypoint" +msgstr "Crear puntu de _vía" + +#: ../src/viktrwlayer.c:427 +msgid "Create Waypoint" +msgstr "Crear puntu de vía" + +#: ../src/viktrwlayer.c:437 +#, fuzzy +msgid "Edit _Track" +msgstr "Amestar track" + +#: ../src/viktrwlayer.c:437 +#, fuzzy +msgid "Edit Track" +msgstr "Amestar track" + +#: ../src/viktrwlayer.c:449 +#, fuzzy +msgid "Edit _Route" +msgstr "Amestar ruta" + +#: ../src/viktrwlayer.c:449 +#, fuzzy +msgid "Edit Route" +msgstr "Amestar ruta" + +#: ../src/viktrwlayer.c:460 +msgid "Route _Finder" +msgstr "" + +#: ../src/viktrwlayer.c:460 +msgid "Route Finder" +msgstr "" + +#: ../src/viktrwlayer.c:471 +msgid "Splitter" +msgstr "" + +#: ../src/viktrwlayer.c:482 +msgid "_Edit Waypoint" +msgstr "_Editar puntu de vía" + +#: ../src/viktrwlayer.c:482 +msgid "Edit Waypoint" +msgstr "Editar puntu de vía" + +#: ../src/viktrwlayer.c:495 +msgid "Edit Trac_kpoint" +msgstr "" + +#: ../src/viktrwlayer.c:495 +msgid "Edit Trackpoint" +msgstr "" + +#. a pixbuf for this one is already made globally available +#: ../src/viktrwlayer.c:508 +msgid "Show P_icture" +msgstr "" + +#: ../src/viktrwlayer.c:508 +msgid "Show Picture" +msgstr "" + +#: ../src/viktrwlayer.c:531 +msgid "Waypoint Images" +msgstr "Imaxes de puntos de vía" + +#: ../src/viktrwlayer.c:531 +msgid "Tracks Advanced" +msgstr "" + +#: ../src/viktrwlayer.c:531 +msgid "Metadata" +msgstr "" + +#: ../src/viktrwlayer.c:531 +#, fuzzy +msgid "Filesystem" +msgstr "Tipu de ficheru:" + +#: ../src/viktrwlayer.c:534 +msgid "Draw by Track" +msgstr "" + +#: ../src/viktrwlayer.c:534 +msgid "Draw by Speed" +msgstr "" + +#: ../src/viktrwlayer.c:534 +msgid "All Tracks Same Color" +msgstr "" + +#: ../src/viktrwlayer.c:535 +msgid "Filled Square" +msgstr "" + +#: ../src/viktrwlayer.c:535 +msgid "Square" +msgstr "" + +#: ../src/viktrwlayer.c:535 +msgid "Circle" +msgstr "" + +#: ../src/viktrwlayer.c:535 +msgid "X" +msgstr "" + +#: ../src/viktrwlayer.c:561 +msgid "Extra Extra Small" +msgstr "" + +#: ../src/viktrwlayer.c:562 +msgid "Extra Small" +msgstr "" + +#: ../src/viktrwlayer.c:566 +msgid "Extra Large" +msgstr "" + +#: ../src/viktrwlayer.c:567 +msgid "Extra Extra Large" +msgstr "" + +#: ../src/viktrwlayer.c:573 +msgid "Name Ascending" +msgstr "" + +#: ../src/viktrwlayer.c:574 +msgid "Name Descending" +msgstr "" + +#: ../src/viktrwlayer.c:582 ../src/viktrwlayer_propwin.c:3319 +msgid "No" +msgstr "" + +#: ../src/viktrwlayer.c:583 +msgid "Yes" +msgstr "" + +#: ../src/viktrwlayer.c:584 +msgid "No write" +msgstr "" + +#: ../src/viktrwlayer.c:649 ../src/viktrwlayer.c:673 +msgid "Draw Labels" +msgstr "" + +#: ../src/viktrwlayer.c:650 +msgid "Note: the individual track controls what labels may be displayed" +msgstr "" + +#: ../src/viktrwlayer.c:651 +msgid "Track Labels Font Size:" +msgstr "" + +#: ../src/viktrwlayer.c:652 +msgid "Track Drawing Mode:" +msgstr "" + +#: ../src/viktrwlayer.c:653 +msgid "All Tracks Color:" +msgstr "" + +#: ../src/viktrwlayer.c:654 +msgid "The color used when 'All Tracks Same Color' drawing mode is selected" +msgstr "" + +#: ../src/viktrwlayer.c:655 +msgid "Draw Track Lines" +msgstr "" + +#: ../src/viktrwlayer.c:656 +msgid "Track Thickness:" +msgstr "" + +#: ../src/viktrwlayer.c:657 +msgid "Draw Track Direction" +msgstr "" + +#: ../src/viktrwlayer.c:658 +msgid "Direction Size:" +msgstr "" + +#: ../src/viktrwlayer.c:659 +msgid "Draw Trackpoints" +msgstr "" + +#: ../src/viktrwlayer.c:660 +msgid "Trackpoint Size:" +msgstr "" + +#: ../src/viktrwlayer.c:661 +msgid "Draw Elevation" +msgstr "" + +#: ../src/viktrwlayer.c:662 +msgid "Draw Elevation Height %:" +msgstr "" + +#: ../src/viktrwlayer.c:663 +msgid "Draw Stops" +msgstr "" + +#: ../src/viktrwlayer.c:664 +msgid "" +"Whether to draw a marker when trackpoints are at the same position but over " +"the minimum stop length apart in time" +msgstr "" + +#: ../src/viktrwlayer.c:665 +msgid "Min Stop Length (seconds):" +msgstr "" + +#: ../src/viktrwlayer.c:667 +msgid "Track BG Thickness:" +msgstr "" + +#: ../src/viktrwlayer.c:668 +msgid "Track Background Color" +msgstr "" + +#: ../src/viktrwlayer.c:669 +msgid "Draw by Speed Factor (%):" +msgstr "" + +#: ../src/viktrwlayer.c:670 +msgid "" +"The percentage factor away from the average speed determining the color used" +msgstr "" + +#: ../src/viktrwlayer.c:671 +msgid "Track Sort Order:" +msgstr "" + +#: ../src/viktrwlayer.c:674 +msgid "Waypoint Font Size:" +msgstr "Tamañu de lletra de puntu de vía:" + +#: ../src/viktrwlayer.c:675 +msgid "Waypoint Color:" +msgstr "Color de puntu de vía:" + +#: ../src/viktrwlayer.c:676 +msgid "Waypoint Text:" +msgstr "Testu de puntu de vía:" + +#: ../src/viktrwlayer.c:677 +msgid "Background:" +msgstr "" + +#: ../src/viktrwlayer.c:678 +msgid "Fake BG Color Translucency:" +msgstr "" + +#: ../src/viktrwlayer.c:679 +msgid "Waypoint marker:" +msgstr "Marcador de puntu de vía:" + +#: ../src/viktrwlayer.c:680 +msgid "Waypoint size:" +msgstr "Tamañu de puntu de vía:" + +#: ../src/viktrwlayer.c:681 +msgid "Draw Waypoint Symbols:" +msgstr "Dibuxar símbolos de puntu de vía:" + +#: ../src/viktrwlayer.c:682 +msgid "Waypoint Sort Order:" +msgstr "" + +#: ../src/viktrwlayer.c:684 +msgid "Draw Waypoint Images" +msgstr "Dibuxar imaxes de puntu de vía" + +#: ../src/viktrwlayer.c:685 +msgid "Image Size (pixels):" +msgstr "" + +#: ../src/viktrwlayer.c:686 +msgid "Image Alpha:" +msgstr "" + +#: ../src/viktrwlayer.c:687 +msgid "Image Memory Cache Size:" +msgstr "" + +#: ../src/viktrwlayer.c:690 +msgid "Author" +msgstr "" + +#: ../src/viktrwlayer.c:691 +msgid "Creation Time" +msgstr "" + +#: ../src/viktrwlayer.c:692 +msgid "Keywords" +msgstr "" + +#: ../src/viktrwlayer.c:693 +msgid "External layer:" +msgstr "" + +#: ../src/viktrwlayer.c:693 +msgid "" +"Layer data stored in the Viking file, in an external file, or in an external " +"file but changes are not written to the file (file only loaded at startup)" +msgstr "" + +#: ../src/viktrwlayer.c:694 +msgid "Save layer as:" +msgstr "" + +#: ../src/viktrwlayer.c:694 +msgid "Specify where layer should be saved. Overwrites file if it exists." +msgstr "" + +#: ../src/viktrwlayer.c:798 +msgid "TrackWaypoint" +msgstr "" + +#: ../src/viktrwlayer.c:1999 ../src/viktrwlayer_propwin.c:1469 +#: ../src/viktrwlayer_propwin.c:1471 ../src/vikutils.c:299 +#: ../src/vikutils.c:326 +msgid "miles" +msgstr "" + +#: ../src/viktrwlayer.c:2002 ../src/viktrwlayer_propwin.c:1475 +#: ../src/viktrwlayer_propwin.c:1477 ../src/vikutils.c:303 +#: ../src/vikutils.c:330 +msgid "NM" +msgstr "" + +#. VIK_UNITS_DISTANCE_KILOMETRES: +#: ../src/viktrwlayer.c:2006 ../src/viktrwlayer_propwin.c:1482 +#: ../src/viktrwlayer_propwin.c:1484 ../src/vikutils.c:308 +#: ../src/vikutils.c:335 +msgid "km" +msgstr "" + +#: ../src/viktrwlayer.c:2121 +msgid "start/end" +msgstr "" + +#: ../src/viktrwlayer.c:2133 +msgid "start" +msgstr "" + +#: ../src/viktrwlayer.c:2142 +msgid "end" +msgstr "" + +#: ../src/viktrwlayer.c:3103 +#, c-format +msgid " in %d:%02d hrs:mins" +msgstr "" + +#: ../src/viktrwlayer.c:3107 +#, c-format +msgid "" +"\n" +"%sTotal Length %.1f %s%s" +msgstr "" + +#: ../src/viktrwlayer.c:3131 +#, c-format +msgid "" +"\n" +"Total route length %.1f %s" +msgstr "" + +#: ../src/viktrwlayer.c:3136 +#, c-format +msgid "Tracks: %d - Waypoints: %d - Routes: %d%s%s" +msgstr "" + +#: ../src/viktrwlayer.c:3155 +#, c-format +msgid "Tracks: %d" +msgstr "" + +#: ../src/viktrwlayer.c:3165 +#, c-format +msgid "Routes: %d" +msgstr "" + +#: ../src/viktrwlayer.c:3195 +#, c-format +msgid "- %d:%02d hrs:mins" +msgstr "" + +#: ../src/viktrwlayer.c:3202 +#, c-format +msgid "%s%.1f km %s" +msgstr "" + +#: ../src/viktrwlayer.c:3205 +#, c-format +msgid "%s%.1f miles %s" +msgstr "" + +#: ../src/viktrwlayer.c:3208 +#, c-format +msgid "%s%.1f NM %s" +msgstr "" + +#: ../src/viktrwlayer.c:3222 +#, c-format +msgid "Waypoints: %d" +msgstr "Puntos de vía: %d" + +#: ../src/viktrwlayer.c:3279 +#, c-format +msgid "Wpt: Alt %dft" +msgstr "" + +#. VIK_UNITS_HEIGHT_METRES: +#: ../src/viktrwlayer.c:3283 +#, c-format +msgid "Wpt: Alt %dm" +msgstr "" + +#. Add comment if available +#: ../src/viktrwlayer.c:3298 +#, c-format +msgid "%s | %s %s | Comment: %s" +msgstr "" + +#: ../src/viktrwlayer.c:3300 +#, c-format +msgid "%s | %s %s" +msgstr "" + +#: ../src/viktrwlayer.c:3562 ../src/viktrwlayer.c:3591 +msgid "This layer has no waypoints or trackpoints." +msgstr "Esta capa nun tien puntos de vía nin de pista." + +#: ../src/viktrwlayer.c:3598 ../src/viktrwlayer.c:3607 +#: ../src/viktrwlayer.c:3616 ../src/viktrwlayer.c:3625 +#: ../src/viktrwlayer.c:3634 ../src/viktrwlayer.c:3642 +msgid "Export Layer" +msgstr "" + +#: ../src/viktrwlayer.c:3671 +msgid "Export Route as GPX" +msgstr "" + +#: ../src/viktrwlayer.c:3673 +msgid "Export Track as GPX" +msgstr "" + +#: ../src/viktrwlayer.c:3693 +msgid "Find" +msgstr "" + +#: ../src/viktrwlayer.c:3703 +msgid "Waypoint Name:" +msgstr "Nome del puntu de vía:" + +#: ../src/viktrwlayer.c:3720 +msgid "Waypoint not found in this layer." +msgstr "El puntu de vía nun s'alcuentra nesta capa." + +#: ../src/viktrwlayer.c:3989 +msgid "Can not upload invisible track." +msgstr "" + +#: ../src/viktrwlayer.c:4082 ../src/viktrwlayer.c:10512 +msgid "Track" +msgstr "" + +#: ../src/viktrwlayer.c:4107 ../src/viktrwlayer.c:10599 +msgid "Route" +msgstr "" + +#: ../src/viktrwlayer.c:4194 +msgid "Externa_l" +msgstr "" + +#: ../src/viktrwlayer.c:4216 ../src/viktrwlayer.c:8456 +#: ../src/viktrwlayer.c:8574 +msgid "_Finish Route" +msgstr "" + +#: ../src/viktrwlayer.c:4218 ../src/viktrwlayer.c:8380 +#: ../src/viktrwlayer.c:8572 +msgid "_Finish Track" +msgstr "" + +#. Now with icons +#: ../src/viktrwlayer.c:4230 +msgid "_View Layer" +msgstr "" + +#: ../src/viktrwlayer.c:4237 +msgid "V_iew" +msgstr "" + +#: ../src/viktrwlayer.c:4243 +msgid "View All _Tracks" +msgstr "" + +#: ../src/viktrwlayer.c:4248 +msgid "View All _Routes" +msgstr "" + +#: ../src/viktrwlayer.c:4253 +msgid "View All _Waypoints" +msgstr "Ver tolos puntos de _vía" + +#: ../src/viktrwlayer.c:4258 +msgid "_Goto Center of Layer" +msgstr "" + +#: ../src/viktrwlayer.c:4264 ../src/viktrwlayer.c:8321 +msgid "Goto _Waypoint..." +msgstr "Dir a puntu de _vía..." + +#: ../src/viktrwlayer.c:4270 +msgid "_Export Layer" +msgstr "" + +#: ../src/viktrwlayer.c:4276 +msgid "Export as GPS_Point..." +msgstr "" + +#: ../src/viktrwlayer.c:4281 +msgid "Export as GPS_Mapper..." +msgstr "" + +#: ../src/viktrwlayer.c:4286 +msgid "Export as _GPX..." +msgstr "" + +#: ../src/viktrwlayer.c:4292 +msgid "Export as _KML..." +msgstr "" + +#: ../src/viktrwlayer.c:4299 +msgid "Export as GEO_JSON..." +msgstr "" + +#: ../src/viktrwlayer.c:4306 +msgid "Export via GPSbabel..." +msgstr "" + +#: ../src/viktrwlayer.c:4312 +#, c-format +msgid "Open with External Program_1: %s" +msgstr "" + +#: ../src/viktrwlayer.c:4319 +#, c-format +msgid "Open with External Program_2: %s" +msgstr "" + +#: ../src/viktrwlayer.c:4327 ../src/vikwindow.c:4825 +msgid "_New" +msgstr "" + +#: ../src/viktrwlayer.c:4333 +msgid "New _Waypoint..." +msgstr "Puntu de _vía nuevu..." + +#: ../src/viktrwlayer.c:4339 +msgid "New _Track" +msgstr "" + +#: ../src/viktrwlayer.c:4347 +msgid "New _Route" +msgstr "" + +#: ../src/viktrwlayer.c:4356 ../src/viktrwlayer.c:8232 +#: ../src/viktrwlayer.c:9003 +msgid "Geotag _Images..." +msgstr "" + +#: ../src/viktrwlayer.c:4363 +msgid "_Acquire" +msgstr "" + +#: ../src/viktrwlayer.c:4369 ../src/vikwindow.c:4904 +msgid "From _GPS..." +msgstr "" + +#. FIXME: only add menu when at least a routing engine has support for Directions +#: ../src/viktrwlayer.c:4375 +msgid "From _Directions..." +msgstr "" + +#: ../src/viktrwlayer.c:4381 +msgid "From _OSM Traces..." +msgstr "" + +#: ../src/viktrwlayer.c:4386 +msgid "From _My OSM Traces..." +msgstr "" + +#: ../src/viktrwlayer.c:4392 ../src/vikwindow.c:4844 +msgid "From _URL..." +msgstr "" + +#: ../src/viktrwlayer.c:4399 ../src/vikwindow.c:4846 +msgid "From _Wikipedia Waypoints" +msgstr "Puntos de vía dende _Uiquipedia" + +#: ../src/viktrwlayer.c:4405 +msgid "Within _Layer Bounds" +msgstr "" + +#: ../src/viktrwlayer.c:4411 +msgid "Within _Current View" +msgstr "" + +#: ../src/viktrwlayer.c:4419 +msgid "From Geo_caching..." +msgstr "" + +#: ../src/viktrwlayer.c:4426 ../src/vikwindow.c:4842 +msgid "From Geotagged _Images..." +msgstr "" + +#: ../src/viktrwlayer.c:4433 +msgid "From _File..." +msgstr "" + +#: ../src/viktrwlayer.c:4436 ../src/vikwindow.c:4905 +msgid "Import File With GPS_Babel..." +msgstr "" + +#: ../src/viktrwlayer.c:4443 ../src/viktrwlayer.c:8905 +msgid "_Upload" +msgstr "" + +#: ../src/viktrwlayer.c:4449 +msgid "Upload to _GPS..." +msgstr "" + +#: ../src/viktrwlayer.c:4456 ../src/viktrwlayer.c:8973 +msgid "Upload to _OSM..." +msgstr "" + +#: ../src/viktrwlayer.c:4464 +msgid "De_lete" +msgstr "" + +#: ../src/viktrwlayer.c:4470 +msgid "Delete All _Tracks" +msgstr "" + +#: ../src/viktrwlayer.c:4477 +msgid "Delete Tracks _From Selection..." +msgstr "" + +#: ../src/viktrwlayer.c:4484 ../src/viktrwlayer.c:8481 +msgid "Delete _All Routes" +msgstr "" + +#: ../src/viktrwlayer.c:4491 ../src/viktrwlayer.c:8487 +msgid "_Delete Routes From Selection..." +msgstr "" + +#: ../src/viktrwlayer.c:4498 +msgid "Delete All _Waypoints" +msgstr "Desaniciar tolos puntos de _vía" + +#: ../src/viktrwlayer.c:4505 +msgid "Delete Waypoints From _Selection..." +msgstr "Desaniciar puntos de vía dende _seleición..." + +#: ../src/viktrwlayer.c:4512 ../src/viktrwlayer.c:8339 +#, fuzzy +msgid "Delete Duplicate Waypoints" +msgstr "Desaniciar puntos de vía duplicaos" + +#: ../src/viktrwlayer.c:5198 +#, c-format +msgid "Are you sure you want to delete all tracks in %s?" +msgstr "" + +#: ../src/viktrwlayer.c:5211 +#, c-format +msgid "Are you sure you want to delete all routes in %s?" +msgstr "" + +#: ../src/viktrwlayer.c:5221 +#, c-format +msgid "Are you sure you want to delete all waypoints in %s?" +msgstr "¿Seguro que quier desaniciar tolos puntos de vía de %s?" + +#: ../src/viktrwlayer.c:5238 +#, c-format +msgid "Are you sure you want to delete the waypoint \"%s\"?" +msgstr "" + +#: ../src/viktrwlayer.c:5254 +#, c-format +msgid "Are you sure you want to delete the track \"%s\"?" +msgstr "" + +#: ../src/viktrwlayer.c:5271 +#, c-format +msgid "Are you sure you want to delete the route \"%s\"?" +msgstr "" + +#: ../src/viktrwlayer.c:5527 ../src/viktrwlayer.c:6373 +msgid "" +"Converting a track to a route removes extra track data such as segments, " +"timestamps, etc...\n" +"Do you want to continue?" +msgstr "" + +#: ../src/viktrwlayer.c:5631 +msgid "No DEM layers available, thus no DEM values can be applied." +msgstr "" + +#: ../src/viktrwlayer.c:5651 ../src/viktrwlayer.c:5692 +#, c-format +msgid "%ld point adjusted" +msgid_plural "%ld points adjusted" +msgstr[0] "" +msgstr[1] "" + +#: ../src/viktrwlayer.c:5736 +#, c-format +msgid "%ld waypoint changed" +msgid_plural "%ld waypoints changed" +msgstr[0] "" +msgstr[1] "" + +#: ../src/viktrwlayer.c:5917 +#, c-format +msgid "" +"Refining a track with many points (%d) is unlikely to yield sensible " +"results. Do you want to Continue?" +msgstr "" + +#. Select engine from dialog +#: ../src/viktrwlayer.c:5925 +msgid "Refine Route with Routing Engine..." +msgstr "" + +#: ../src/viktrwlayer.c:5933 +msgid "Select routing engine" +msgstr "" + +#: ../src/viktrwlayer.c:6158 +msgid "Failed. No other tracks with timestamps in this layer found" +msgstr "" + +#: ../src/viktrwlayer.c:6160 +msgid "Failed. No other tracks without timestamps in this layer found" +msgstr "" + +#: ../src/viktrwlayer.c:6179 +msgid "Merge with..." +msgstr "" + +#: ../src/viktrwlayer.c:6180 +msgid "Select route to merge with" +msgstr "" + +#: ../src/viktrwlayer.c:6180 +msgid "Select track to merge with" +msgstr "" + +#: ../src/viktrwlayer.c:6264 ../src/viktrwlayer.c:6346 +msgid "Append Route" +msgstr "" + +#: ../src/viktrwlayer.c:6264 ../src/viktrwlayer.c:6346 +msgid "Append Track" +msgstr "" + +#: ../src/viktrwlayer.c:6265 +msgid "Select the route to append after the current route" +msgstr "" + +#: ../src/viktrwlayer.c:6266 +msgid "Select the track to append after the current track" +msgstr "" + +#: ../src/viktrwlayer.c:6347 +msgid "Select the track to append after the current route" +msgstr "" + +#: ../src/viktrwlayer.c:6348 +msgid "Select the route to append after the current track" +msgstr "" + +#: ../src/viktrwlayer.c:6414 +#, c-format +msgid "%d segment merged" +msgid_plural "%d segments merged" +msgstr[0] "" +msgstr[1] "" + +#: ../src/viktrwlayer.c:6430 +msgid "Failed. This track does not have timestamp" +msgstr "" + +#: ../src/viktrwlayer.c:6442 +msgid "Failed. No other track in this layer has timestamp" +msgstr "" + +#: ../src/viktrwlayer.c:6449 +msgid "Merge Threshold..." +msgstr "" + +#: ../src/viktrwlayer.c:6450 +msgid "Merge when time between tracks less than:" +msgstr "" + +#: ../src/viktrwlayer.c:6580 +msgid "Split Threshold..." +msgstr "" + +#: ../src/viktrwlayer.c:6581 +msgid "Split when time between trackpoints exceeds:" +msgstr "" + +#: ../src/viktrwlayer.c:6598 +#, c-format +msgid "" +"Can not split track due to trackpoints not ordered in time - such as at %s.\n" +"\n" +"Goto this trackpoint?" +msgstr "" + +#: ../src/viktrwlayer.c:6668 +msgid "Split Every Nth Point" +msgstr "" + +#: ../src/viktrwlayer.c:6669 +msgid "Split on every Nth point:" +msgstr "" + +#: ../src/viktrwlayer.c:6779 +msgid "Can not split track as it has no segments" +msgstr "" + +#: ../src/viktrwlayer.c:6861 ../src/viktrwlayer.c:6891 +#, c-format +msgid "Deleted %ld point" +msgid_plural "Deleted %ld points" +msgstr[0] "" +msgstr[1] "" + +#: ../src/viktrwlayer.c:6966 ../src/viktrwlayer.c:10989 +#: ../src/viktrwlayer_waypointlist.c:214 +#, c-format +msgid "Could not launch %s to open file." +msgstr "" + +#: ../src/viktrwlayer.c:6992 ../src/viktrwlayer.c:7113 +msgid "This track has no date information." +msgstr "" + +#: ../src/viktrwlayer.c:7006 ../src/viktrwlayer.c:7136 +msgid "This waypoint has no date information." +msgstr "" + +#: ../src/viktrwlayer.c:7030 +#, c-format +msgid "Could not launch %s" +msgstr "" + +#: ../src/viktrwlayer.c:7269 +msgid "Internal Error in vik_trw_layer_uniquify_tracks" +msgstr "" + +#: ../src/viktrwlayer.c:7374 ../src/viktrwlayer.c:7424 +#: ../src/viktrwlayer.c:7587 +msgid "" +"Multiple entries with the same name exist. This method only works with " +"unique names. Force unique names now?" +msgstr "" + +#: ../src/viktrwlayer.c:7385 +msgid "No tracks found" +msgstr "" + +#: ../src/viktrwlayer.c:7393 ../src/viktrwlayer.c:7443 +#: ../src/viktrwlayer.c:7607 +msgid "Delete Selection" +msgstr "" + +#: ../src/viktrwlayer.c:7394 +msgid "Select tracks to delete" +msgstr "" + +#: ../src/viktrwlayer.c:7435 +msgid "No routes found" +msgstr "" + +#: ../src/viktrwlayer.c:7444 +msgid "Select routes to delete" +msgstr "" + +#: ../src/viktrwlayer.c:7550 +msgid "Internal Error in vik_trw_layer_uniquify_waypoints" +msgstr "Error internu en vik_trw_layer_uniquify_waypoints" + +#: ../src/viktrwlayer.c:7597 +msgid "No waypoints found" +msgstr "Nun s'alcontraron puntos de vía" + +#: ../src/viktrwlayer.c:7608 +msgid "Select waypoints to delete" +msgstr "Seleicione los puntos de vía a desaniciar" + +#: ../src/viktrwlayer.c:7691 +#, fuzzy, c-format +msgid "%ld waypoint deleted" +msgid_plural "%ld waypoints deleted" +msgstr[0] "Seleicione los puntos de vía a desaniciar" +msgstr[1] "Seleicione los puntos de vía a desaniciar" + +#: ../src/viktrwlayer.c:7697 +#, fuzzy +msgid "No duplicates found" +msgstr "Nun s'alcontraron puntos de vía" + +#: ../src/viktrwlayer.c:8028 +#, c-format +msgid "" +"A waypoint with the name \"%s\" already exists. Really rename to the same " +"name?" +msgstr "" +"Yá esiste un puntu de vía col nome «%s». ¿Realmente quier camudar al mesmu " +"nome?" + +#: ../src/viktrwlayer.c:8058 +#, c-format +msgid "" +"A track with the name \"%s\" already exists. Really rename to the same name?" +msgstr "" + +#: ../src/viktrwlayer.c:8095 +#, c-format +msgid "" +"A route with the name \"%s\" already exists. Really rename to the same name?" +msgstr "" + +#: ../src/viktrwlayer.c:8215 ../src/viktrwlayer.c:8602 +msgid "_Goto" +msgstr "" + +#: ../src/viktrwlayer.c:8226 +msgid "_Visit Geocache Webpage" +msgstr "" + +#: ../src/viktrwlayer.c:8235 +msgid "Geotag multiple images against this waypoint" +msgstr "" + +#: ../src/viktrwlayer.c:8245 ../src/viktrwlayer_waypointlist.c:352 +msgid "_Show Picture..." +msgstr "" + +#: ../src/viktrwlayer.c:8253 +msgid "Update Geotag on _Image" +msgstr "" + +#: ../src/viktrwlayer.c:8259 +msgid "_Update" +msgstr "" + +#: ../src/viktrwlayer.c:8264 +msgid "Update and _Keep File Timestamp" +msgstr "" + +#: ../src/viktrwlayer.c:8276 +msgid "Visit _Webpage" +msgstr "" + +#: ../src/viktrwlayer.c:8306 +msgid "_New Waypoint..." +msgstr "Puntu de vía _nuevu..." + +#: ../src/viktrwlayer.c:8315 +msgid "_View All Waypoints" +msgstr "Ver tolos puntos de vía" + +#: ../src/viktrwlayer.c:8327 +msgid "Delete _All Waypoints" +msgstr "Des_aniciar tolos puntos de vía" + +#: ../src/viktrwlayer.c:8333 +msgid "_Delete Waypoints From Selection..." +msgstr "_Desaniciar puntos de vía de la seleición..." + +#: ../src/viktrwlayer.c:8351 +msgid "_Show All Waypoints" +msgstr "" + +#: ../src/viktrwlayer.c:8357 +msgid "_Hide All Waypoints" +msgstr "" + +#: ../src/viktrwlayer.c:8369 +msgid "_List Waypoints..." +msgstr "" + +#: ../src/viktrwlayer.c:8390 +msgid "_View All Tracks" +msgstr "" + +#: ../src/viktrwlayer.c:8396 +msgid "_New Track" +msgstr "" + +#: ../src/viktrwlayer.c:8404 +msgid "Delete _All Tracks" +msgstr "" + +#: ../src/viktrwlayer.c:8410 +msgid "_Delete Tracks From Selection..." +msgstr "" + +#: ../src/viktrwlayer.c:8422 +msgid "_Show All Tracks" +msgstr "" + +#: ../src/viktrwlayer.c:8428 +msgid "_Hide All Tracks" +msgstr "" + +#: ../src/viktrwlayer.c:8439 +msgid "_List Tracks..." +msgstr "" + +#: ../src/viktrwlayer.c:8467 +msgid "_View All Routes" +msgstr "" + +#: ../src/viktrwlayer.c:8473 +msgid "_New Route" +msgstr "" + +#: ../src/viktrwlayer.c:8499 +msgid "_Show All Routes" +msgstr "" + +#: ../src/viktrwlayer.c:8505 +msgid "_Hide All Routes" +msgstr "" + +#: ../src/viktrwlayer.c:8516 +msgid "_List Routes..." +msgstr "" + +#: ../src/viktrwlayer.c:8587 +msgid "_View Track" +msgstr "" + +#: ../src/viktrwlayer.c:8589 +msgid "_View Route" +msgstr "" + +#: ../src/viktrwlayer.c:8608 +msgid "_Startpoint" +msgstr "" + +#: ../src/viktrwlayer.c:8614 +msgid "\"_Center\"" +msgstr "" + +#: ../src/viktrwlayer.c:8620 +msgid "_Endpoint" +msgstr "" + +#: ../src/viktrwlayer.c:8626 +msgid "_Highest Altitude" +msgstr "" + +#: ../src/viktrwlayer.c:8632 +msgid "_Lowest Altitude" +msgstr "" + +#: ../src/viktrwlayer.c:8640 +msgid "_Maximum Speed" +msgstr "" + +#: ../src/viktrwlayer.c:8646 +msgid "_Date" +msgstr "" + +#: ../src/viktrwlayer.c:8655 +msgid "Co_mbine" +msgstr "" + +#: ../src/viktrwlayer.c:8663 +msgid "_Merge By Time..." +msgstr "" + +#: ../src/viktrwlayer.c:8668 +msgid "Merge _Segments" +msgstr "" + +#: ../src/viktrwlayer.c:8675 +msgid "Merge _With Other Tracks..." +msgstr "" + +#: ../src/viktrwlayer.c:8682 +msgid "_Append Track..." +msgstr "" + +#: ../src/viktrwlayer.c:8684 +msgid "_Append Route..." +msgstr "" + +#: ../src/viktrwlayer.c:8690 +msgid "Append _Route..." +msgstr "" + +#: ../src/viktrwlayer.c:8692 +msgid "Append _Track..." +msgstr "" + +#: ../src/viktrwlayer.c:8699 +msgid "_Split" +msgstr "" + +#: ../src/viktrwlayer.c:8707 +msgid "_Split By Time..." +msgstr "" + +#. ATM always enable this entry - don't want to have to analyse the track before displaying the menu - to keep the menu speedy +#: ../src/viktrwlayer.c:8713 +msgid "Split Se_gments" +msgstr "" + +#: ../src/viktrwlayer.c:8719 +msgid "Split By _Number of Points..." +msgstr "" + +#: ../src/viktrwlayer.c:8724 +msgid "Split at _Trackpoint" +msgstr "" + +#: ../src/viktrwlayer.c:8732 +msgid "_Insert Points" +msgstr "" + +#: ../src/viktrwlayer.c:8738 +msgid "Insert Point _Before Selected Point" +msgstr "" + +#: ../src/viktrwlayer.c:8745 +msgid "Insert Point _After Selected Point" +msgstr "" + +#: ../src/viktrwlayer.c:8754 +msgid "Delete Poi_nts" +msgstr "" + +#: ../src/viktrwlayer.c:8760 +msgid "Delete _Selected Point" +msgstr "" + +#: ../src/viktrwlayer.c:8768 +msgid "Delete Points With The Same _Position" +msgstr "" + +#: ../src/viktrwlayer.c:8773 +msgid "Delete Points With The Same _Time" +msgstr "" + +#: ../src/viktrwlayer.c:8780 ../src/viktrwlayer.c:9029 +msgid "_Transform" +msgstr "" + +#: ../src/viktrwlayer.c:8788 ../src/viktrwlayer.c:9037 +msgid "_Apply DEM Data" +msgstr "" + +#: ../src/viktrwlayer.c:8793 ../src/viktrwlayer.c:9042 +msgid "_Overwrite" +msgstr "" + +#: ../src/viktrwlayer.c:8796 ../src/viktrwlayer.c:9045 +msgid "Overwrite any existing elevation values with DEM values" +msgstr "" + +#: ../src/viktrwlayer.c:8799 ../src/viktrwlayer.c:9048 +msgid "_Keep Existing" +msgstr "" + +#: ../src/viktrwlayer.c:8802 ../src/viktrwlayer.c:9051 +msgid "Keep existing elevation values, only attempt for missing values" +msgstr "" + +#: ../src/viktrwlayer.c:8807 +msgid "_Smooth Missing Elevation Data" +msgstr "" + +#: ../src/viktrwlayer.c:8812 +msgid "_Interpolated" +msgstr "" + +#: ../src/viktrwlayer.c:8815 +msgid "" +"Interpolate between known elevation values to derive values for the missing " +"elevations" +msgstr "" + +#: ../src/viktrwlayer.c:8818 +msgid "_Flat" +msgstr "" + +#: ../src/viktrwlayer.c:8821 +msgid "Set unknown elevation values to the last known value" +msgstr "" + +#: ../src/viktrwlayer.c:8825 +msgid "C_onvert to a Route" +msgstr "" + +#: ../src/viktrwlayer.c:8827 +msgid "C_onvert to a Track" +msgstr "" + +#: ../src/viktrwlayer.c:8835 +msgid "_Anonymize Times" +msgstr "" + +#: ../src/viktrwlayer.c:8838 +msgid "Shift timestamps to a relative offset from 1901-01-01" +msgstr "" + +#: ../src/viktrwlayer.c:8841 +msgid "_Interpolate Times" +msgstr "" + +#: ../src/viktrwlayer.c:8844 +msgid "" +"Reset trackpoint timestamps between the first and last points such that " +"track is traveled at equal speed" +msgstr "" + +#: ../src/viktrwlayer.c:8849 +msgid "_Reverse Track" +msgstr "" + +#: ../src/viktrwlayer.c:8851 +msgid "_Reverse Route" +msgstr "" + +#: ../src/viktrwlayer.c:8858 +msgid "Refine Route..." +msgstr "" + +#: ../src/viktrwlayer.c:8868 +msgid "Down_load Maps Along Track..." +msgstr "" + +#: ../src/viktrwlayer.c:8870 +msgid "Down_load Maps Along Route..." +msgstr "" + +#: ../src/viktrwlayer.c:8878 +msgid "_Export Track as GPX..." +msgstr "" + +#: ../src/viktrwlayer.c:8880 +msgid "_Export Route as GPX..." +msgstr "" + +#: ../src/viktrwlayer.c:8887 +msgid "E_xtend Track End" +msgstr "" + +#: ../src/viktrwlayer.c:8889 +msgid "E_xtend Route End" +msgstr "" + +#: ../src/viktrwlayer.c:8896 +msgid "Extend _Using Route Finder" +msgstr "" + +#: ../src/viktrwlayer.c:8911 +msgid "_Upload to GPS..." +msgstr "" + +#: ../src/viktrwlayer.c:8926 +msgid "_Diary" +msgstr "" + +#: ../src/viktrwlayer.c:8930 +msgid "Open diary program at this date" +msgstr "" + +#: ../src/viktrwlayer.c:8935 +msgid "_Astronomy" +msgstr "" + +#: ../src/viktrwlayer.c:8938 +msgid "Open astronomy program at this date and location" +msgstr "" + +#: ../src/viktrwlayer.c:8962 +msgid "_View Google Directions" +msgstr "" + +#: ../src/viktrwlayer.c:8984 +msgid "Use with _Filter" +msgstr "" + +#: ../src/viktrwlayer.c:9018 +msgid "_Edit Trackpoint" +msgstr "" + +#: ../src/viktrwlayer.c:10116 +#, c-format +msgid " - Gain %dm:Loss %dm" +msgstr "" + +#: ../src/viktrwlayer.c:10118 +#, c-format +msgid " - Gain %dft:Loss %dft" +msgstr "" + +#: ../src/viktrwlayer.c:10123 +#, c-format +msgid " - Bearing %3.1f° - Step %s" +msgstr "" + +#: ../src/viktrwlayer.c:10232 +#, c-format +msgid "Querying %s for route between (%.3f, %.3f) and (%.3f, %.3f)." +msgstr "" + +#: ../src/viktrwlayer.c:10248 +#, c-format +msgid "%s returned route between (%.3f, %.3f) and (%.3f, %.3f)." +msgstr "" + +#: ../src/viktrwlayer.c:10251 +#, c-format +msgid "Error getting route from %s." +msgstr "" + +#: ../src/viktrwlayer.c:11070 +#, c-format +msgid "Creating %d Image Thumbnails..." +msgstr "" + +#: ../src/viktrwlayer.c:11560 +msgid "No map layer in use. Create one first" +msgstr "" + +#: ../src/viktrwlayer.c:11679 +#, c-format +msgid "%s: Track List" +msgstr "" + +#: ../src/viktrwlayer.c:11681 +#, c-format +msgid "%s: Route List" +msgstr "" + +#: ../src/viktrwlayer.c:11734 +#, c-format +msgid "" +"Could not write external layer %s to %s, please fix and save before exiting " +"or data will be lost" +msgstr "" + +#: ../src/viktrwlayer.c:11782 +#, c-format +msgid "WARNING: issues encountered loading external layer %s from %s" +msgstr "" + +#: ../src/viktrwlayer_export.c:47 +msgid "Auto Device GPX Simplify:" +msgstr "" + +#: ../src/viktrwlayer_export.c:48 +msgid "" +"GPX saves to certain devices will be simplified for device compatibility." +msgstr "" + +#: ../src/viktrwlayer_export.c:125 +#, c-format +msgid "Export of GPX file simplified using point limit: %d" +msgstr "" + +#: ../src/viktrwlayer_export.c:206 ../src/viktrwlayer_export.c:323 +#: ../src/vikwindow.c:3694 +msgid "The filename you requested could not be opened for writing." +msgstr "" + +#: ../src/viktrwlayer_export.c:226 +#, c-format +msgid "Could not launch %s." +msgstr "" + +#: ../src/viktrwlayer_export.c:234 +msgid "Could not create temporary file for export." +msgstr "" + +#: ../src/viktrwlayer_export.c:268 +msgid "File format:" +msgstr "" + +#: ../src/viktrwlayer_export.c:276 +msgid "Select the file format." +msgstr "" + +#: ../src/viktrwlayer_export.c:281 +msgid "" +"Select the information to process.\n" +"Warning: the behavior of these switches is highly dependent of the file " +"format selected.\n" +"Please, refer to GPSbabel if unsure." +msgstr "" + +#: ../src/viktrwlayer_export.c:308 +msgid "You did not select a valid file format." +msgstr "" + +#: ../src/viktrwlayer_propwin.c:915 ../src/viktrwlayer_propwin.c:3381 +#: ../src/viktrwlayer_propwin.c:3417 ../src/viktrwlayer_propwin.c:3457 +#: ../src/viktrwlayer_propwin.c:3509 ../src/viktrwlayer_propwin.c:3527 +#: ../src/viktrwlayer_propwin.c:3600 ../src/viktrwlayer_propwin.c:3601 +#: ../src/viktrwlayer_propwin.c:3602 ../src/viktrwlayer_propwin.c:3611 +#: ../src/viktrwlayer_propwin.c:3612 ../src/viktrwlayer_propwin.c:3629 +#: ../src/viktrwlayer_propwin.c:3630 ../src/viktrwlayer_propwin.c:3644 +#: ../src/viktrwlayer_propwin.c:3645 ../src/viktrwlayer_propwin.c:3646 +#: ../src/viktrwlayer_propwin.c:3660 ../src/viktrwlayer_propwin.c:3661 +#: ../src/viktrwlayer_propwin.c:3662 ../src/viktrwlayer_propwin.c:3676 +#: ../src/viktrwlayer_propwin.c:3677 ../src/viktrwlayer_propwin.c:3678 +#: ../src/viktrwlayer_propwin.c:3695 ../src/viktrwlayer_propwin.c:3696 +#: ../src/viktrwlayer_analysis.c:293 +#, c-format +msgid "No Data" +msgstr "" + +#: ../src/viktrwlayer_propwin.c:960 ../src/viktrwlayer_propwin.c:1245 +#, c-format +msgid "%.1f kph" +msgstr "" + +#: ../src/viktrwlayer_propwin.c:963 ../src/viktrwlayer_propwin.c:1248 +#: ../src/viktrwlayer_analysis.c:352 +#, c-format +msgid "%.1f mph" +msgstr "" + +#: ../src/viktrwlayer_propwin.c:966 ../src/viktrwlayer_propwin.c:1251 +#, c-format +msgid "%.1f knots" +msgstr "" + +#: ../src/viktrwlayer_propwin.c:969 ../src/viktrwlayer_propwin.c:1254 +#, c-format +msgid "%.1f s/km" +msgstr "" + +#: ../src/viktrwlayer_propwin.c:972 ../src/viktrwlayer_propwin.c:1257 +#: ../src/viktrwlayer_analysis.c:389 ../src/viktrwlayer_analysis.c:392 +#, fuzzy, c-format +msgid "%.1f min/km" +msgstr "1 min" + +#: ../src/viktrwlayer_propwin.c:975 ../src/viktrwlayer_propwin.c:1260 +#, c-format +msgid "%.1f sec/mi" +msgstr "" + +#: ../src/viktrwlayer_propwin.c:978 ../src/viktrwlayer_propwin.c:1263 +#: ../src/viktrwlayer_analysis.c:409 ../src/viktrwlayer_analysis.c:412 +#, fuzzy, c-format +msgid "%.1f min/mi" +msgstr "1 min" + +#. VIK_UNITS_SPEED_METRES_PER_SECOND: +#: ../src/viktrwlayer_propwin.c:982 ../src/viktrwlayer_propwin.c:1267 +#, c-format +msgid "%.1f m/s" +msgstr "" + +#. Minutes +#: ../src/viktrwlayer_propwin.c:1411 +msgid "mins" +msgstr "" + +#. Hours +#: ../src/viktrwlayer_propwin.c:1418 +msgid "h" +msgstr "" + +#. Days +#: ../src/viktrwlayer_propwin.c:1424 +msgid "d" +msgstr "" + +#. Weeks +#: ../src/viktrwlayer_propwin.c:1429 +msgid "w" +msgstr "" + +#. 'Months' +#: ../src/viktrwlayer_propwin.c:1433 +msgid "M" +msgstr "" + +#: ../src/viktrwlayer_propwin.c:2051 ../src/viktrwlayer_analysis.c:303 +#, c-format +msgid "%.1f miles" +msgstr "" + +#: ../src/viktrwlayer_propwin.c:2054 ../src/viktrwlayer_analysis.c:306 +#, c-format +msgid "%.1f NM" +msgstr "" + +#. VIK_UNITS_DISTANCE_KILOMETRES +#: ../src/viktrwlayer_propwin.c:2057 ../src/viktrwlayer_analysis.c:310 +#, c-format +msgid "%.1f km" +msgstr "" + +#: ../src/viktrwlayer_propwin.c:3083 +msgid "Failed spliting track. Track unchanged" +msgstr "" + +#: ../src/viktrwlayer_propwin.c:3234 ../src/viktrwlayer_propwin.c:3744 +#, c-format +msgid "%s - Track Properties" +msgstr "" + +#: ../src/viktrwlayer_propwin.c:3239 +msgid "Split at _Marker" +msgstr "" + +#: ../src/viktrwlayer_propwin.c:3240 +msgid "Split _Segments" +msgstr "" + +#: ../src/viktrwlayer_propwin.c:3241 +msgid "_Reverse" +msgstr "" + +#: ../src/viktrwlayer_propwin.c:3242 +msgid "_Delete Dupl." +msgstr "" + +#: ../src/viktrwlayer_propwin.c:3269 +msgid "Comment:" +msgstr "" + +#: ../src/viktrwlayer_propwin.c:3270 +msgid "Description:" +msgstr "" + +#: ../src/viktrwlayer_propwin.c:3271 +msgid "Source:" +msgstr "" + +#: ../src/viktrwlayer_propwin.c:3272 +msgid "Type:" +msgstr "" + +#: ../src/viktrwlayer_propwin.c:3273 +msgid "Color:" +msgstr "" + +#: ../src/viktrwlayer_propwin.c:3274 +msgid "Draw Name:" +msgstr "" + +#: ../src/viktrwlayer_propwin.c:3275 +msgid "Distance Labels:" +msgstr "" + +#: ../src/viktrwlayer_propwin.c:3278 +msgid "Track Length:" +msgstr "" + +#: ../src/viktrwlayer_propwin.c:3279 +msgid "Trackpoints:" +msgstr "" + +#: ../src/viktrwlayer_propwin.c:3280 +msgid "Segments:" +msgstr "" + +#: ../src/viktrwlayer_propwin.c:3281 +msgid "Duplicate Points:" +msgstr "" + +#: ../src/viktrwlayer_propwin.c:3282 +msgid "Max Speed:" +msgstr "" + +#: ../src/viktrwlayer_propwin.c:3283 +msgid "Avg. Speed:" +msgstr "" + +#: ../src/viktrwlayer_propwin.c:3284 +msgid "Moving Avg. Speed:" +msgstr "" + +#: ../src/viktrwlayer_propwin.c:3285 +msgid "Avg. Dist. Between TPs:" +msgstr "" + +#: ../src/viktrwlayer_propwin.c:3286 +msgid "Elevation Range:" +msgstr "" + +#: ../src/viktrwlayer_propwin.c:3287 +msgid "Total Elevation Gain/Loss:" +msgstr "" + +#: ../src/viktrwlayer_propwin.c:3288 +msgid "Start:" +msgstr "" + +#: ../src/viktrwlayer_propwin.c:3289 +msgid "End:" +msgstr "" + +#: ../src/viktrwlayer_propwin.c:3290 +msgid "Duration:" +msgstr "" + +#: ../src/viktrwlayer_propwin.c:3320 +msgid "Centre" +msgstr "" + +#: ../src/viktrwlayer_propwin.c:3321 +msgid "Start only" +msgstr "" + +#: ../src/viktrwlayer_propwin.c:3322 +msgid "End only" +msgstr "" + +#: ../src/viktrwlayer_propwin.c:3323 +msgid "Start and End" +msgstr "" + +#: ../src/viktrwlayer_propwin.c:3324 +msgid "Centre, Start and End" +msgstr "" + +#: ../src/viktrwlayer_propwin.c:3336 +msgid "Maximum number of distance labels to be shown" +msgstr "" + +#: ../src/viktrwlayer_propwin.c:3340 +msgid "Properties" +msgstr "" + +#: ../src/viktrwlayer_propwin.c:3584 +#, c-format +msgid "%d minutes - %d minutes moving" +msgstr "" + +#: ../src/viktrwlayer_propwin.c:3596 +#, c-format +msgid "%s total - %s in segments" +msgstr "" + +#: ../src/viktrwlayer_propwin.c:3607 ../src/viktrwlayer_analysis.c:622 +msgid "Statistics" +msgstr "" + +#: ../src/viktrwlayer_propwin.c:3613 ../src/viktrwlayer_propwin.c:3680 +msgid "Show D_EM" +msgstr "" + +#: ../src/viktrwlayer_propwin.c:3615 ../src/viktrwlayer_propwin.c:3631 +#: ../src/viktrwlayer_propwin.c:3647 ../src/viktrwlayer_propwin.c:3697 +msgid "Show _GPS Speed" +msgstr "" + +#: ../src/viktrwlayer_propwin.c:3617 ../src/viktrwlayer_propwin.c:3633 +#: ../src/viktrwlayer_propwin.c:3665 ../src/viktrwlayer_propwin.c:3699 +msgid "Track Distance:" +msgstr "" + +#: ../src/viktrwlayer_propwin.c:3618 ../src/viktrwlayer_propwin.c:3684 +msgid "Track Height:" +msgstr "" + +#: ../src/viktrwlayer_propwin.c:3624 +msgid "Elevation-distance" +msgstr "" + +#: ../src/viktrwlayer_propwin.c:3634 +msgid "Track Gradient:" +msgstr "" + +#: ../src/viktrwlayer_propwin.c:3639 +msgid "Gradient-distance" +msgstr "" + +#: ../src/viktrwlayer_propwin.c:3649 ../src/viktrwlayer_propwin.c:3666 +#: ../src/viktrwlayer_propwin.c:3683 +msgid "Track Time:" +msgstr "" + +#: ../src/viktrwlayer_propwin.c:3650 ../src/viktrwlayer_propwin.c:3700 +msgid "Track Speed:" +msgstr "" + +#: ../src/viktrwlayer_propwin.c:3651 ../src/viktrwlayer_propwin.c:3667 +#: ../src/viktrwlayer_propwin.c:3685 +msgid "Time/Date:" +msgstr "" + +#: ../src/viktrwlayer_propwin.c:3655 +msgid "Speed-time" +msgstr "" + +#: ../src/viktrwlayer_propwin.c:3663 ../src/viktrwlayer_propwin.c:3679 +msgid "Show S_peed" +msgstr "" + +#: ../src/viktrwlayer_propwin.c:3671 +msgid "Distance-time" +msgstr "" + +#: ../src/viktrwlayer_propwin.c:3690 +msgid "Elevation-time" +msgstr "" + +#: ../src/viktrwlayer_propwin.c:3705 +msgid "Speed-distance" +msgstr "" + +#: ../src/viktrwlayer_tpwin.c:190 ../src/viktrwlayer_wpwin.c:66 +msgid "Date/Time Edit" +msgstr "" + +#: ../src/viktrwlayer_tpwin.c:242 +msgid "Name:" +msgstr "" + +#: ../src/viktrwlayer_tpwin.c:243 +msgid "Latitude:" +msgstr "" + +#: ../src/viktrwlayer_tpwin.c:244 +msgid "Longitude:" +msgstr "" + +#: ../src/viktrwlayer_tpwin.c:245 +msgid "Altitude:" +msgstr "" + +#: ../src/viktrwlayer_tpwin.c:246 +msgid "Course:" +msgstr "" + +#: ../src/viktrwlayer_tpwin.c:247 +msgid "Timestamp:" +msgstr "" + +#: ../src/viktrwlayer_tpwin.c:248 +msgid "Time:" +msgstr "" + +#: ../src/viktrwlayer_tpwin.c:249 +msgid "Distance Difference:" +msgstr "" + +#: ../src/viktrwlayer_tpwin.c:250 +msgid "Time Difference:" +msgstr "" + +#: ../src/viktrwlayer_tpwin.c:251 +msgid "\"Speed\" Between:" +msgstr "" + +#: ../src/viktrwlayer_tpwin.c:252 +msgid "Speed:" +msgstr "" + +#: ../src/viktrwlayer_tpwin.c:253 +msgid "VDOP:" +msgstr "" + +#: ../src/viktrwlayer_tpwin.c:254 +msgid "HDOP:" +msgstr "" + +#: ../src/viktrwlayer_tpwin.c:255 +msgid "PDOP:" +msgstr "" + +#: ../src/viktrwlayer_tpwin.c:256 +msgid "SAT/FIX:" +msgstr "" + +#: ../src/viktrwlayer_tpwin.c:263 ../src/viktrwlayer_tpwin.c:408 +#: ../src/viktrwlayer_tpwin.c:622 +msgid "Trackpoint" +msgstr "" + +#: ../src/viktrwlayer_tpwin.c:266 +msgid "_Insert After" +msgstr "" + +#: ../src/viktrwlayer_tpwin.c:268 +msgid "Split Here" +msgstr "" + +#: ../src/viktrwlayer_tracklist.c:262 ../src/viktrwlayer_waypointlist.c:306 +msgid "_Copy Data" +msgstr "" + +#. +#. item = gtk_image_menu_item_new_with_mnemonic ( _("_Select") ); +#. gtk_image_menu_item_set_image ( (GtkImageMenuItem*)item, gtk_image_new_from_stock (GTK_STOCK_FIND, GTK_ICON_SIZE_MENU) ); +#. g_signal_connect_swapped ( G_OBJECT(item), "activate", G_CALLBACK(trw_layer_track_select), values ); +#. gtk_menu_shell_append (GTK_MENU_SHELL (menu), item); +#. gtk_widget_show ( item ); +#. +#. ATM view auto selects, so don't bother with separate select menu entry +#. +#. item = gtk_image_menu_item_new_with_mnemonic ( _("_Select") ); +#. gtk_image_menu_item_set_image ( (GtkImageMenuItem*)item, gtk_image_new_from_stock (GTK_STOCK_FIND, GTK_ICON_SIZE_MENU) ); +#. g_signal_connect_swapped ( G_OBJECT(item), "activate", G_CALLBACK(trw_layer_waypoint_select), values ); +#. gtk_menu_shell_append (GTK_MENU_SHELL (menu), item); +#. gtk_widget_show ( item ); +#. +#. AUTO SELECT NOT TRUE YET... +#. ATM view auto selects, so don't bother with separate select menu entry +#: ../src/viktrwlayer_tracklist.c:290 ../src/viktrwlayer_waypointlist.c:341 +#: ../src/vikwindow.c:4816 +msgid "_View" +msgstr "" + +#. Insert column for the layer name when viewing multi layers +#: ../src/viktrwlayer_tracklist.c:613 ../src/viktrwlayer_waypointlist.c:609 +msgid "Layer" +msgstr "" + +#: ../src/viktrwlayer_tracklist.c:627 ../src/viktrwlayer_waypointlist.c:624 +msgid "Date" +msgstr "" + +#: ../src/viktrwlayer_tracklist.c:631 ../src/viktrwlayer_waypointlist.c:628 +msgid "Visible" +msgstr "" + +#: ../src/viktrwlayer_tracklist.c:639 +msgid "" +"Distance\n" +"(miles)" +msgstr "" + +#: ../src/viktrwlayer_tracklist.c:642 +msgid "" +"Distance\n" +"(NM)" +msgstr "" + +#: ../src/viktrwlayer_tracklist.c:645 +msgid "" +"Distance\n" +"(km)" +msgstr "" + +#: ../src/viktrwlayer_tracklist.c:651 +msgid "" +"Length\n" +"(minutes)" +msgstr "" + +#: ../src/viktrwlayer_tracklist.c:660 ../src/vikutils.c:93 +msgid "sec/mi" +msgstr "" + +#: ../src/viktrwlayer_tracklist.c:666 +#, c-format +msgid "" +"Av. Speed\n" +"(%s)" +msgstr "" + +#. Apply own formatting of the data +#: ../src/viktrwlayer_tracklist.c:671 +#, c-format +msgid "" +"Max Speed\n" +"(%s)" +msgstr "" + +#: ../src/viktrwlayer_tracklist.c:679 ../src/viktrwlayer_waypointlist.c:637 +msgid "" +"Max Height\n" +"(Feet)" +msgstr "" + +#: ../src/viktrwlayer_tracklist.c:681 ../src/viktrwlayer_waypointlist.c:639 +msgid "" +"Max Height\n" +"(Metres)" +msgstr "" + +#: ../src/viktrwlayer_waypointlist.c:312 +msgid "Copy Data (with _positions)" +msgstr "" + +#: ../src/viktrwlayer_waypointlist.c:633 +msgid "Comment" +msgstr "" + +#: ../src/viktrwlayer_waypointlist.c:643 +msgid "Symbol" +msgstr "" + +#: ../src/viktrwlayer_wpwin.c:93 ../src/viktrwlayer_wpwin.c:302 +msgid "True" +msgstr "" + +#: ../src/viktrwlayer_wpwin.c:122 +msgid "Waypoint Properties" +msgstr "Propiedaes del puntu de vía" + +#: ../src/viktrwlayer_wpwin.c:164 +msgid "Name:" +msgstr "Nome:" + +#: ../src/viktrwlayer_wpwin.c:181 +msgid "Altitude:" +msgstr "Altitú:" + +#: ../src/viktrwlayer_wpwin.c:186 ../src/viktrwlayer_wpwin.c:188 +msgid "Comment:" +msgstr "Comentariu:" + +#: ../src/viktrwlayer_wpwin.c:202 +msgid "Source:" +msgstr "" + +#: ../src/viktrwlayer_wpwin.c:212 +msgid "Image:" +msgstr "Imaxe:" + +#: ../src/viktrwlayer_wpwin.c:217 +msgid "Symbol:" +msgstr "Símbolu:" + +#: ../src/viktrwlayer_wpwin.c:226 +msgid "(none)" +msgstr "(dengún)" + +#. Geotag Info [readonly] +#: ../src/viktrwlayer_wpwin.c:272 +msgid "Has Geotag" +msgstr "" + +#: ../src/viktrwlayer_wpwin.c:279 +msgid "Consistent Position" +msgstr "" + +#. ATM the direction value box is always shown, even when there is no information. +#. It would be nice to be able to hide it until the 'Add' has been performed, +#. however I've not been able to achieve this. +#. Thus simply sensistizing it instead. +#: ../src/viktrwlayer_wpwin.c:292 +#, fuzzy +msgid "Image Direction:" +msgstr "Visor d'imaxes:" + +#: ../src/viktrwlayer_wpwin.c:300 +msgid "Magnetic" +msgstr "" + +#: ../src/viktrwlayer_wpwin.c:320 +msgid "Time:" +msgstr "Hora:" + +#. TODO: other checks (isalpha or whatever ) +#: ../src/viktrwlayer_wpwin.c:386 +msgid "Please enter a name for the waypoint." +msgstr "Escriba un nome pal puntu de vía." + +#: ../src/viktrwlayer_geotag.c:320 ../src/viktrwlayer_geotag.c:460 +#, c-format +msgid "Failed updating EXIF on %s" +msgstr "" + +#: ../src/viktrwlayer_geotag.c:562 +#, c-format +msgid "Geotagging %d Images..." +msgstr "" + +#: ../src/viktrwlayer_geotag.c:630 +msgid "Geotag Images" +msgstr "" + +#: ../src/viktrwlayer_geotag.c:640 +msgid "Images" +msgstr "" + +#: ../src/viktrwlayer_geotag.c:645 +msgid "Overwrite Existing Waypoints:" +msgstr "Sobrescribir los puntos de vía esistentes:" + +#: ../src/viktrwlayer_geotag.c:648 +msgid "Overwrite Existing GPS Information:" +msgstr "" + +#: ../src/viktrwlayer_geotag.c:650 +msgid "Keep File Modification Timestamp:" +msgstr "" + +#: ../src/viktrwlayer_geotag.c:684 +msgid "Create Waypoints:" +msgstr "Crear puntos de vía:" + +#: ../src/viktrwlayer_geotag.c:693 +msgid "Write EXIF:" +msgstr "" + +#: ../src/viktrwlayer_geotag.c:705 +msgid "Automatic Image Direction:" +msgstr "" + +#: ../src/viktrwlayer_geotag.c:707 +msgid "Set image direction based on a heading derived from the track" +msgstr "" + +#: ../src/viktrwlayer_geotag.c:710 +msgid "Interpolate Between Track Segments:" +msgstr "" + +#: ../src/viktrwlayer_geotag.c:715 +msgid "Image Time Offset (Seconds):" +msgstr "" + +#: ../src/viktrwlayer_geotag.c:718 +msgid "" +"The number of seconds to ADD to the photos time to make it match the GPS " +"data. Calculate this with (GPS - Photo). Can be negative or positive. Useful " +"to adjust times when a camera's timestamp was incorrect." +msgstr "" + +#: ../src/viktrwlayer_geotag.c:721 +msgid "Image Timezone:" +msgstr "" + +#: ../src/viktrwlayer_geotag.c:724 +msgid "" +"The timezone that was used when the images were created. For example, if a " +"camera is set to AWST or +8:00 hours. Enter +8:00 here so that the correct " +"adjustment to the images' time can be made. GPS data is always in UTC." +msgstr "" + +#: ../src/viktrwlayer_geotag.c:728 +#, c-format +msgid "Using waypoint: %s" +msgstr "" + +#: ../src/viktrwlayer_geotag.c:742 +#, c-format +msgid "Using track: %s" +msgstr "" + +#: ../src/viktrwlayer_geotag.c:744 +#, c-format +msgid "Using all tracks in: %s" +msgstr "" + +#: ../src/viktrwlayer_analysis.c:214 +msgid "Number of Tracks" +msgstr "" + +#: ../src/viktrwlayer_analysis.c:215 +msgid "Date Range" +msgstr "" + +#: ../src/viktrwlayer_analysis.c:216 +msgid "Total Length" +msgstr "" + +#: ../src/viktrwlayer_analysis.c:217 +msgid "Average Length" +msgstr "" + +#: ../src/viktrwlayer_analysis.c:218 +msgid "Eddington number" +msgstr "" + +#. No.4: Extended display only +#: ../src/viktrwlayer_analysis.c:219 +msgid "Max Speed" +msgstr "" + +#: ../src/viktrwlayer_analysis.c:220 +msgid "Avg. Speed" +msgstr "" + +#: ../src/viktrwlayer_analysis.c:221 +msgid "Minimum Altitude" +msgstr "" + +#: ../src/viktrwlayer_analysis.c:222 +msgid "Maximum Altitude" +msgstr "" + +#: ../src/viktrwlayer_analysis.c:223 +msgid "Total Elevation Gain/Loss" +msgstr "" + +#: ../src/viktrwlayer_analysis.c:224 +msgid "Avg. Elevation Gain/Loss" +msgstr "" + +#: ../src/viktrwlayer_analysis.c:225 +msgid "Total Duration" +msgstr "" + +#: ../src/viktrwlayer_analysis.c:226 +msgid "Avg. Duration" +msgstr "" + +#: ../src/viktrwlayer_analysis.c:317 +#, c-format +msgid "%.2f miles" +msgstr "" + +#: ../src/viktrwlayer_analysis.c:320 +#, c-format +msgid "%.2f NM" +msgstr "" + +#. VIK_UNITS_DISTANCE_KILOMETRES +#: ../src/viktrwlayer_analysis.c:324 +#, c-format +msgid "%.2f km" +msgstr "" + +#: ../src/viktrwlayer_analysis.c:361 +#, c-format +msgid "%.2f m/s" +msgstr "" + +#: ../src/viktrwlayer_analysis.c:370 ../src/viktrwlayer_analysis.c:373 +#, c-format +msgid "%.2f knots" +msgstr "" + +#: ../src/viktrwlayer_analysis.c:379 ../src/viktrwlayer_analysis.c:382 +#, c-format +msgid "%d s/km" +msgstr "" + +#: ../src/viktrwlayer_analysis.c:399 ../src/viktrwlayer_analysis.c:402 +#, c-format +msgid "%d sec/mi" +msgstr "" + +#: ../src/viktrwlayer_analysis.c:420 ../src/viktrwlayer_analysis.c:423 +#, c-format +msgid "%.2f km/h" +msgstr "" + +#: ../src/viktrwlayer_analysis.c:434 ../src/viktrwlayer_analysis.c:440 +#, c-format +msgid "%d feet" +msgstr "" + +#: ../src/viktrwlayer_analysis.c:445 ../src/viktrwlayer_analysis.c:447 +#, c-format +msgid "%d feet / %d feet" +msgstr "" + +#: ../src/viktrwlayer_analysis.c:452 ../src/viktrwlayer_analysis.c:458 +#, c-format +msgid "%d m" +msgstr "" + +#: ../src/viktrwlayer_analysis.c:463 ../src/viktrwlayer_analysis.c:465 +#, c-format +msgid "%d m / %d m" +msgstr "" + +#: ../src/viktrwlayer_analysis.c:477 +#, c-format +msgid "%d:%02d:%02d days:hrs:mins" +msgstr "" + +#: ../src/viktrwlayer_analysis.c:484 +#, c-format +msgid "%d:%02d hrs:mins" +msgstr "" + +#: ../src/viktrwlayer_analysis.c:658 +msgid "Include Invisible Items" +msgstr "" + +#: ../src/vikstatus.c:129 +msgid "Current number of background tasks. Click to see the background jobs." +msgstr "" + +#: ../src/vikstatus.c:134 +msgid "Current zoom level. Click to select a new one." +msgstr "" + +#: ../src/vikstatus.c:141 +msgid "Left click to clear the message. Right click to copy the message." +msgstr "" + +#: ../src/vikutils.c:108 +msgid "GPSD" +msgstr "" + +#. GPS Preamble +#: ../src/vikutils.c:109 +msgid "Trkpt" +msgstr "" + +#: ../src/vikutils.c:160 +#, c-format +msgid "%sSpeed%s %.1f%s" +msgstr "" + +#. Go for 2dp as expect low values for vertical speeds +#: ../src/vikutils.c:214 +#, c-format +msgid "%sClimb%s %.2f%s" +msgstr "" + +#: ../src/vikutils.c:223 +#, c-format +msgid "%sAlt %dfeet" +msgstr "" + +#. VIK_UNITS_HEIGHT_METRES: +#: ../src/vikutils.c:227 +#, c-format +msgid "%sAlt %dm" +msgstr "" + +#: ../src/vikutils.c:235 +#, c-format +msgid "%sCourse %03d°" +msgstr "" + +#: ../src/vikutils.c:249 +msgid "yards" +msgstr "" + +#. VIK_UNITS_DISTANCE_KILOMETRES: +#: ../src/vikutils.c:253 +msgid "m" +msgstr "" + +#: ../src/vikutils.c:257 +#, c-format +msgid "%sDistance diff %d%s" +msgstr "" + +#: ../src/vikutils.c:272 +#, c-format +msgid "%sTime %s" +msgstr "" + +#: ../src/vikutils.c:281 +#, c-format +msgid "%sTime diff %lds" +msgstr "" + +#: ../src/vikutils.c:287 +#, c-format +msgid "%sNo. of Sats %d" +msgstr "" + +#: ../src/vikutils.c:312 +#, c-format +msgid "%sTo End %.2f%s" +msgstr "" + +#: ../src/vikutils.c:339 +#, c-format +msgid "%sDistance along %.2f%s" +msgstr "" + +#: ../src/vikutils.c:359 +#, c-format +msgid "%sTrack: %s" +msgstr "" + +#: ../src/vikutils.c:396 +#, c-format +msgid "" +"There is a newer version of Viking available: %s\n" +"\n" +"Do you wish to go to Viking's website now?" +msgstr "" + +#: ../src/vikutils.c:526 +msgid "" +"This appears to be Viking's very first run.\n" +"\n" +"Do you wish to enable automatic internet features?\n" +"\n" +"Individual settings can be controlled in the Preferences." +msgstr "" + +#: ../src/vikwaypoint.c:37 +msgid "Waypoint" +msgstr "Puntu de vía" + +#: ../src/vikwebtool_datasource.c:352 +msgid "Search Term" +msgstr "" + +#. TODO get rid of this as this is unnecessary duplication... +#: ../src/vikwindow.c:258 +msgid "Pan" +msgstr "" + +#: ../src/vikwindow.c:258 +msgid "Zoom" +msgstr "" + +#: ../src/vikwindow.c:258 +msgid "Ruler" +msgstr "" + +#: ../src/vikwindow.c:258 +msgid "Select" +msgstr "" + +#: ../src/vikwindow.c:368 +msgid "This is Viking " +msgstr "" + +#: ../src/vikwindow.c:457 +msgid "Location lookup aborted" +msgstr "" + +#: ../src/vikwindow.c:477 +#, c-format +msgid "Location found: %s" +msgstr "" + +#: ../src/vikwindow.c:486 +msgid "Unable to determine location" +msgstr "" + +#: ../src/vikwindow.c:495 +msgid "Determining location" +msgstr "" + +#: ../src/vikwindow.c:525 +#, c-format +msgid "Location found via geoclue" +msgstr "" + +#: ../src/vikwindow.c:546 +msgid "Default Map" +msgstr "" + +#: ../src/vikwindow.c:557 ../src/vikwindow.c:3938 +msgid "Trying to determine location..." +msgstr "" + +#. Create tooltip +#: ../src/vikwindow.c:723 +msgid "Select zoom level" +msgstr "" + +#: ../src/vikwindow.c:1176 +#, c-format +msgid "" +"Do you want to save the changes you made to the document \"%s\"?\n" +"\n" +"Your changes will be lost if you don't save them." +msgstr "" + +#: ../src/vikwindow.c:1180 +msgid "Don't Save" +msgstr "" + +#: ../src/vikwindow.c:1268 +msgid "mpp" +msgstr "" + +#: ../src/vikwindow.c:1268 +msgid "pixelfact" +msgstr "" + +#: ../src/vikwindow.c:1467 +#, c-format +msgid "%s %s %dm" +msgstr "" + +#: ../src/vikwindow.c:1469 +#, c-format +msgid "%s %s %dft" +msgstr "" + +#: ../src/vikwindow.c:1472 +#, c-format +msgid "%s %s" +msgstr "" + +#: ../src/vikwindow.c:1929 +msgid "_Ruler" +msgstr "" + +#: ../src/vikwindow.c:1929 +msgid "Ruler Tool" +msgstr "" + +#: ../src/vikwindow.c:2204 ../src/vikwindow.c:4818 +msgid "_Zoom" +msgstr "" + +#: ../src/vikwindow.c:2204 +msgid "Zoom Tool" +msgstr "" + +#: ../src/vikwindow.c:2271 ../src/vikwindow.c:4819 +msgid "_Pan" +msgstr "" + +#: ../src/vikwindow.c:2271 +msgid "Pan Tool" +msgstr "" + +#: ../src/vikwindow.c:2425 +msgid "_Select" +msgstr "" + +#: ../src/vikwindow.c:2425 +msgid "Select Tool" +msgstr "" + +#: ../src/vikwindow.c:2615 +msgid "You must select a layer to show its properties." +msgstr "" + +#. No error to show, so unlikely this will get called +#: ../src/vikwindow.c:2629 +msgid "The help system is not available." +msgstr "" + +#. Main error path +#: ../src/vikwindow.c:2632 +#, c-format +msgid "" +"Help is not available because: %s.\n" +"Ensure a Mime Type ghelp handler program is installed (e.g. yelp)." +msgstr "" + +#: ../src/vikwindow.c:2865 +msgid "You must select a layer to delete." +msgstr "" + +#: ../src/vikwindow.c:3171 +msgid "Untitled" +msgstr "" + +#: ../src/vikwindow.c:3300 +#, c-format +msgid "Unable to add '%s' to the list of recently used documents" +msgstr "" + +#: ../src/vikwindow.c:3391 +msgid "The file you requested could not be opened." +msgstr "" + +#: ../src/vikwindow.c:3394 +msgid "" +"GPSBabel is required to load files of this type or GPSBabel encountered " +"problems." +msgstr "" + +#: ../src/vikwindow.c:3397 +#, c-format +msgid "Unable to load malformed GPX file %s" +msgstr "" + +#: ../src/vikwindow.c:3400 +#, c-format +msgid "Unsupported file type for %s" +msgstr "" + +#. Since we can process .vik files with issues just show a warning in the status bar +#. Not that a user can do much about it... or tells them what this issue is yet... +#: ../src/vikwindow.c:3406 +#, c-format +msgid "WARNING: issues encountered loading %s" +msgstr "" + +#: ../src/vikwindow.c:3489 +msgid "Please select a GPS data file to open. " +msgstr "" + +#: ../src/vikwindow.c:3508 +msgid "Google Earth" +msgstr "" + +#: ../src/vikwindow.c:3523 ../src/vikwindow.c:3646 ../src/viking.desktop.in.h:1 +msgid "Viking" +msgstr "" + +#: ../src/vikwindow.c:3594 ../src/vikwindow.c:4632 +msgid "Open File" +msgstr "" + +#: ../src/vikwindow.c:3630 +msgid "Save as Viking File." +msgstr "" + +#: ../src/vikwindow.c:3757 +#, c-format +msgid "Exporting to file: %s" +msgstr "" + +#. Confirm what happened. +#: ../src/vikwindow.c:3774 +#, c-format +msgid "Exported files: %d" +msgstr "" + +#: ../src/vikwindow.c:3786 +msgid "Nothing to Export!" +msgstr "" + +#: ../src/vikwindow.c:3790 +msgid "Export to directory" +msgstr "" + +#: ../src/vikwindow.c:3809 +msgid "Could not convert all files" +msgstr "" + +#: ../src/vikwindow.c:3851 +msgid "File not accessible" +msgstr "" + +#: ../src/vikwindow.c:3854 +msgid "No Viking File" +msgstr "" + +#: ../src/vikwindow.c:3998 +msgid "This layer has no configurable properties." +msgstr "" + +#: ../src/vikwindow.c:4080 +msgid "Are you sure you wish to delete all layers?" +msgstr "" + +#. Try harder... +#: ../src/vikwindow.c:4126 ../src/vikwindow.c:4132 +msgid "Generating image file..." +msgstr "" + +#: ../src/vikwindow.c:4154 +msgid "" +"Failed to generate internal image.\n" +"\n" +"Try creating a smaller image." +msgstr "" + +#: ../src/vikwindow.c:4175 +msgid "Image file generated." +msgstr "" + +#: ../src/vikwindow.c:4177 +msgid "Failed to generate image file." +msgstr "" + +#: ../src/vikwindow.c:4246 +#, c-format +msgid "Unable to write to file %s: %s" +msgstr "" + +#: ../src/vikwindow.c:4284 +msgid "" +"Viewable region outside allowable pixel size bounds for image. Clipping " +"width/height values." +msgstr "" + +#: ../src/vikwindow.c:4309 +#, c-format +msgid "Total area: %ldm x %ldm (%.3f sq. km)" +msgstr "" + +#: ../src/vikwindow.c:4312 +#, c-format +msgid "Total area: %ldm x %ldm (%.3f sq. miles)" +msgstr "" + +#: ../src/vikwindow.c:4315 +#, c-format +msgid "Total area: %ldm x %ldm (%.3f sq. NM)" +msgstr "" + +#. Single file +#: ../src/vikwindow.c:4343 +msgid "Save Image" +msgstr "" + +#: ../src/vikwindow.c:4364 ../src/vikwindow.c:4641 +msgid "KMZ" +msgstr "" + +#: ../src/vikwindow.c:4417 +msgid "You must be in UTM mode to use this feature" +msgstr "" + +#: ../src/vikwindow.c:4421 +msgid "Choose a directory to hold images" +msgstr "" + +#. todo: default for answers inside VikWindow or static (thruout instance) +#: ../src/vikwindow.c:4441 +msgid "Save to Image File" +msgstr "" + +#: ../src/vikwindow.c:4457 +msgid "Width (pixels):" +msgstr "" + +#: ../src/vikwindow.c:4459 +msgid "Height (pixels):" +msgstr "" + +#: ../src/vikwindow.c:4462 +msgid "" +"WARNING: USING LARGE IMAGES OVER 10000x10000\n" +"MAY CRASH THE PROGRAM!" +msgstr "" + +#: ../src/vikwindow.c:4464 +msgid "Zoom (meters per pixel):" +msgstr "" + +#: ../src/vikwindow.c:4480 +msgid "Area in current viewable window" +msgstr "" + +#: ../src/vikwindow.c:4490 +msgid "Save as PNG" +msgstr "" + +#: ../src/vikwindow.c:4491 +msgid "Save as JPEG" +msgstr "" + +#: ../src/vikwindow.c:4520 +msgid "East-west image tiles:" +msgstr "" + +#: ../src/vikwindow.c:4522 +msgid "North-south image tiles:" +msgstr "" + +#: ../src/vikwindow.c:4619 +msgid "This feature is not available in UTM mode" +msgstr "" + +#: ../src/vikwindow.c:4658 +#, c-format +msgid "Unable to import %s." +msgstr "" + +#: ../src/vikwindow.c:4749 +msgid "Choose a background color" +msgstr "" + +#: ../src/vikwindow.c:4765 +msgid "Choose a track highlight color" +msgstr "" + +#: ../src/vikwindow.c:4814 +msgid "_File" +msgstr "" + +#: ../src/vikwindow.c:4815 +msgid "_Edit" +msgstr "" + +#: ../src/vikwindow.c:4817 +msgid "_Show" +msgstr "" + +#: ../src/vikwindow.c:4820 +msgid "_Layers" +msgstr "" + +#: ../src/vikwindow.c:4821 +msgid "_Tools" +msgstr "" + +#: ../src/vikwindow.c:4822 +msgid "_Webtools" +msgstr "" + +#: ../src/vikwindow.c:4823 ../src/vikwindow.c:4893 +msgid "_Help" +msgstr "" + +#: ../src/vikwindow.c:4825 +msgid "New file" +msgstr "" + +#: ../src/vikwindow.c:4826 +msgid "_Open..." +msgstr "" + +#: ../src/vikwindow.c:4826 +msgid "Open a file" +msgstr "" + +#: ../src/vikwindow.c:4827 +msgid "Open _Recent File" +msgstr "" + +#: ../src/vikwindow.c:4828 +msgid "Append _File..." +msgstr "" + +#: ../src/vikwindow.c:4828 +msgid "Append data from a different file" +msgstr "" + +#: ../src/vikwindow.c:4829 +msgid "Open GPX as External _Layer..." +msgstr "" + +#: ../src/vikwindow.c:4829 +msgid "Open a GPX file as an external layer" +msgstr "" + +#: ../src/vikwindow.c:4830 +msgid "_Export All" +msgstr "" + +#: ../src/vikwindow.c:4830 +msgid "Export All TrackWaypoint Layers" +msgstr "" + +#: ../src/vikwindow.c:4831 +msgid "_GPX..." +msgstr "" + +#: ../src/vikwindow.c:4831 +msgid "Export as GPX" +msgstr "" + +#: ../src/vikwindow.c:4832 +msgid "A_cquire" +msgstr "" + +#: ../src/vikwindow.c:4833 +msgid "_Directions..." +msgstr "" + +#: ../src/vikwindow.c:4833 +msgid "Get driving directions" +msgstr "" + +#: ../src/vikwindow.c:4835 +msgid "_OSM Traces..." +msgstr "" + +#: ../src/vikwindow.c:4835 +msgid "Get traces from OpenStreetMap" +msgstr "" + +#: ../src/vikwindow.c:4836 +msgid "_My OSM Traces..." +msgstr "" + +#: ../src/vikwindow.c:4836 +msgid "Get Your Own Traces from OpenStreetMap" +msgstr "" + +#: ../src/vikwindow.c:4839 +msgid "Geo_caches..." +msgstr "" + +#: ../src/vikwindow.c:4839 +msgid "Get Geocaches from geocaching.com" +msgstr "" + +#: ../src/vikwindow.c:4842 +msgid "Create waypoints from geotagged images" +msgstr "Crear puntos de vía dende imaxes xeomarcaes" + +#: ../src/vikwindow.c:4844 +msgid "Get a file from a URL" +msgstr "" + +#: ../src/vikwindow.c:4846 +msgid "Create waypoints from Wikipedia items in the current view" +msgstr "" +"Crear puntos de vía dende los elementos de Uiquipedia de la vista actual" + +#: ../src/vikwindow.c:4848 +msgid "_Save" +msgstr "" + +#: ../src/vikwindow.c:4848 +msgid "Save the file" +msgstr "" + +#: ../src/vikwindow.c:4849 +msgid "Save _As..." +msgstr "" + +#: ../src/vikwindow.c:4849 +msgid "Save the file under different name" +msgstr "" + +#: ../src/vikwindow.c:4850 +msgid "Properties..." +msgstr "" + +#: ../src/vikwindow.c:4850 +msgid "File Properties" +msgstr "" + +#: ../src/vikwindow.c:4852 +msgid "Import KMZ _Map File..." +msgstr "" + +#: ../src/vikwindow.c:4852 +msgid "Import a KMZ file" +msgstr "" + +#: ../src/vikwindow.c:4853 +msgid "Generate _KMZ Map File..." +msgstr "" + +#: ../src/vikwindow.c:4853 +msgid "Generate a KMZ file with an overlay of the current view" +msgstr "" + +#: ../src/vikwindow.c:4855 +msgid "_Generate Image File..." +msgstr "" + +#: ../src/vikwindow.c:4855 +msgid "Save a snapshot of the workspace into a file" +msgstr "" + +#: ../src/vikwindow.c:4856 +msgid "Generate _Directory of Images..." +msgstr "" + +#: ../src/vikwindow.c:4856 +msgid "Generate _Directory of Images" +msgstr "" + +#: ../src/vikwindow.c:4857 +msgid "_Print..." +msgstr "" + +#: ../src/vikwindow.c:4857 +msgid "Print maps" +msgstr "" + +#: ../src/vikwindow.c:4858 +msgid "E_xit" +msgstr "" + +#: ../src/vikwindow.c:4858 +msgid "Exit the program" +msgstr "" + +#: ../src/vikwindow.c:4859 +msgid "Save and Exit" +msgstr "" + +#: ../src/vikwindow.c:4859 +msgid "Save and Exit the program" +msgstr "" + +#: ../src/vikwindow.c:4861 +msgid "Go to the Pre_vious Location" +msgstr "" + +#: ../src/vikwindow.c:4861 +msgid "Go to the previous location" +msgstr "" + +#: ../src/vikwindow.c:4862 +msgid "Go to the _Next Location" +msgstr "" + +#: ../src/vikwindow.c:4862 +msgid "Go to the next location" +msgstr "" + +#: ../src/vikwindow.c:4863 +msgid "Go to the _Default Location" +msgstr "" + +#: ../src/vikwindow.c:4863 +msgid "Go to the default location" +msgstr "" + +#: ../src/vikwindow.c:4864 +#, fuzzy +msgid "Go to the _Auto Location" +msgstr "Allugamientu automáticu" + +#: ../src/vikwindow.c:4864 +msgid "Go to a location via automatic lookup" +msgstr "" + +#: ../src/vikwindow.c:4865 +msgid "Go to _Location..." +msgstr "" + +#: ../src/vikwindow.c:4865 +msgid "Go to address/place using text search" +msgstr "" + +#: ../src/vikwindow.c:4866 +msgid "_Go to Lat/Lon..." +msgstr "" + +#: ../src/vikwindow.c:4866 +msgid "Go to arbitrary lat/lon coordinate" +msgstr "" + +#: ../src/vikwindow.c:4867 +msgid "Go to UTM..." +msgstr "" + +#: ../src/vikwindow.c:4867 +msgid "Go to arbitrary UTM coordinate" +msgstr "" + +#: ../src/vikwindow.c:4868 +#, fuzzy +msgid "Go to Today" +msgstr "Dir a UTM" + +#: ../src/vikwindow.c:4868 +msgid "Go to today on the calendar" +msgstr "" + +#: ../src/vikwindow.c:4869 +msgid "_Refresh" +msgstr "" + +#: ../src/vikwindow.c:4869 +msgid "Refresh any maps displayed" +msgstr "" + +#: ../src/vikwindow.c:4870 +msgid "Set _Highlight Color..." +msgstr "" + +#: ../src/vikwindow.c:4870 +msgid "Set Highlight Color" +msgstr "" + +#: ../src/vikwindow.c:4871 +msgid "Set Bac_kground Color..." +msgstr "" + +#: ../src/vikwindow.c:4871 +msgid "Set Background Color" +msgstr "" + +#: ../src/vikwindow.c:4872 +msgid "Zoom _In" +msgstr "" + +#: ../src/vikwindow.c:4872 +msgid "Zoom In" +msgstr "" + +#: ../src/vikwindow.c:4873 +msgid "Zoom _Out" +msgstr "" + +#: ../src/vikwindow.c:4873 +msgid "Zoom Out" +msgstr "" + +#: ../src/vikwindow.c:4874 +msgid "Zoom _To..." +msgstr "" + +#: ../src/vikwindow.c:4874 +msgid "Zoom To" +msgstr "" + +#: ../src/vikwindow.c:4875 +msgid "Pan _North" +msgstr "" + +#: ../src/vikwindow.c:4876 +msgid "Pan _East" +msgstr "" + +#: ../src/vikwindow.c:4877 +msgid "Pan _South" +msgstr "" + +#: ../src/vikwindow.c:4878 +msgid "Pan _West" +msgstr "" + +#: ../src/vikwindow.c:4879 +msgid "Background _Jobs" +msgstr "" + +#: ../src/vikwindow.c:4879 +msgid "Background Jobs" +msgstr "" + +#: ../src/vikwindow.c:4881 +msgid "Cu_t" +msgstr "" + +#: ../src/vikwindow.c:4885 +msgid "Delete All" +msgstr "" + +#: ../src/vikwindow.c:4886 +msgid "Copy Centre _Location" +msgstr "" + +#: ../src/vikwindow.c:4887 +msgid "_Flush Map Cache" +msgstr "" + +#: ../src/vikwindow.c:4888 +msgid "_Set the Default Location" +msgstr "" + +#: ../src/vikwindow.c:4888 +msgid "Set the Default Location to the current position" +msgstr "" + +#: ../src/vikwindow.c:4889 +msgid "_Preferences" +msgstr "" + +#: ../src/vikwindow.c:4889 +msgid "Program Preferences" +msgstr "" + +#: ../src/vikwindow.c:4890 +msgid "_Layer Defaults" +msgstr "" + +#: ../src/vikwindow.c:4891 +msgid "_Properties" +msgstr "" + +#: ../src/vikwindow.c:4893 +msgid "Help" +msgstr "" + +#: ../src/vikwindow.c:4894 +msgid "_About" +msgstr "" + +#: ../src/vikwindow.c:4894 +msgid "About" +msgstr "" + +#: ../src/vikwindow.c:4903 +msgid "_KML..." +msgstr "" + +#: ../src/vikwindow.c:4903 +msgid "Export as KML" +msgstr "" + +#: ../src/vikwindow.c:4904 +msgid "Transfer data from a GPS device" +msgstr "" + +#: ../src/vikwindow.c:4905 +msgid "Import file via GPSBabel converter" +msgstr "" + +#: ../src/vikwindow.c:4909 +msgid "Import Geo_JSON File..." +msgstr "" + +#: ../src/vikwindow.c:4909 +msgid "Import GeoJSON file" +msgstr "" + +#: ../src/vikwindow.c:4914 +msgid "_UTM Mode" +msgstr "" + +#: ../src/vikwindow.c:4915 +msgid "_Expedia Mode" +msgstr "" + +#: ../src/vikwindow.c:4916 +msgid "_Mercator Mode" +msgstr "" + +#: ../src/vikwindow.c:4917 +msgid "Lat_/Lon Mode" +msgstr "" + +#: ../src/vikwindow.c:4921 +msgid "Show _Scale" +msgstr "" + +#: ../src/vikwindow.c:4921 +msgid "Show Scale" +msgstr "" + +#: ../src/vikwindow.c:4922 +msgid "Show _Center Mark" +msgstr "" + +#: ../src/vikwindow.c:4922 +msgid "Show Center Mark" +msgstr "" + +#: ../src/vikwindow.c:4923 +msgid "Show _Highlight" +msgstr "" + +#: ../src/vikwindow.c:4923 +msgid "Show Highlight" +msgstr "" + +#: ../src/vikwindow.c:4924 +msgid "_Full Screen" +msgstr "" + +#: ../src/vikwindow.c:4924 +msgid "Activate full screen mode" +msgstr "" + +#: ../src/vikwindow.c:4925 +msgid "Show Side _Panel" +msgstr "" + +#: ../src/vikwindow.c:4925 +msgid "Show Side Panel" +msgstr "" + +#: ../src/vikwindow.c:4926 +msgid "Show Status_bar" +msgstr "" + +#: ../src/vikwindow.c:4926 +msgid "Show Statusbar" +msgstr "" + +#: ../src/vikwindow.c:4927 +msgid "Show _Toolbar" +msgstr "" + +#: ../src/vikwindow.c:4927 +msgid "Show Toolbar" +msgstr "" + +#: ../src/vikwindow.c:4928 +msgid "Show _Menu" +msgstr "" + +#: ../src/vikwindow.c:4928 +msgid "Show Menu" +msgstr "" + +#: ../src/vikwindow.c:4929 +msgid "Show Side Panel B_uttons" +msgstr "" + +#: ../src/vikwindow.c:4929 +msgid "Show Side Panel Buttons" +msgstr "" + +#: ../src/vikwindow.c:4930 +msgid "Show Side Panel Ca_lendar" +msgstr "" + +#: ../src/vikwindow.c:4930 +msgid "Show Side Panel Calendar" +msgstr "" + +#: ../src/vikwindow.c:5064 +#, c-format +msgid "New _%s Layer" +msgstr "" + +#: ../src/vikwindow.c:5114 +msgid "..." +msgstr "" + +#: ../src/viking.desktop.in.h:2 +msgid "GPS Data Manager" +msgstr "" + +#: ../src/viking.desktop.in.h:3 +msgid "Map Based GPS Data Manager (live data capable)." +msgstr "" + +#: ../src/libjpeg/jpeg-data.c:205 +msgid "Data does not follow JPEG specification." +msgstr "" + +#: ../src/libjpeg/jpeg-data.c:302 +#, c-format +msgid "Path '%s' invalid." +msgstr "" + +#: ../src/libjpeg/jpeg-data.c:320 +#, c-format +msgid "Could not read '%s'." +msgstr "" + +#~ msgid "en" +#~ msgstr "ast" diff --git a/po/ca.po b/po/ca.po new file mode 100644 index 0000000..cecf1ac --- /dev/null +++ b/po/ca.po @@ -0,0 +1,6076 @@ +# Catalan translation for viking +# Copyright (c) 2011 Rosetta Contributors and Canonical Ltd 2011 +# This file is distributed under the same license as the viking package. +# FIRST AUTHOR , 2011. +# +msgid "" +msgstr "" +"Project-Id-Version: viking\n" +"Report-Msgid-Bugs-To: \n" +"POT-Creation-Date: 2019-01-19 12:53+0000\n" +"PO-Revision-Date: 2011-10-02 09:06+0000\n" +"Last-Translator: Jordi Hortigüela \n" +"Language-Team: Catalan \n" +"Language: ca\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-Launchpad-Export-Date: 2018-12-21 17:32+0000\n" +"X-Generator: Launchpad (build 18847)\n" + +#: ../src/acquire.c:106 ../src/vikgpslayer.c:1367 +msgid "Done." +msgstr "Fet." + +#: ../src/acquire.c:115 +msgid "No data." +msgstr "" + +#: ../src/acquire.c:167 ../src/acquire.c:415 +msgid "Error: acquisition failed." +msgstr "" + +#: ../src/acquire.c:339 +msgid "Working..." +msgstr "Encara sense traducció" + +#. This shouldn't happen... +#: ../src/acquire.c:406 +msgid "" +"Unable to create command\n" +"Acquire method failed." +msgstr "" + +#: ../src/acquire.c:513 +msgid "_Filter" +msgstr "" + +#: ../src/acquire.c:528 +#, c-format +msgid "Filter with %s" +msgstr "" + +#: ../src/acquire.c:545 +msgid "Filter" +msgstr "" + +#: ../src/babel.c:640 +msgid "GPSBabel:" +msgstr "" + +#: ../src/babel.c:641 +msgid "" +"Allow setting the specific instance of GPSBabel. You must restart Viking for " +"this value to take effect." +msgstr "" + +#: ../src/babel_ui.c:79 +msgid "Select a file format" +msgstr "" + +#: ../src/babel_ui.c:144 ../src/viktrwlayer.c:531 ../src/viktrwlayer.c:2882 +msgid "Tracks" +msgstr "" + +#: ../src/babel_ui.c:149 ../src/viktrwlayer.c:2892 +msgid "Routes" +msgstr "" + +#. ***** PARAMETERS ***** +#: ../src/babel_ui.c:154 ../src/viktrwlayer.c:531 ../src/viktrwlayer.c:2887 +msgid "Waypoints" +msgstr "" + +#: ../src/background.c:64 +#, c-format +msgid "%d items" +msgstr "%d elements" + +#: ../src/background.c:287 +msgid "Threads:" +msgstr "" + +#: ../src/background.c:288 +msgid "" +"Number of threads to use for Mapnik tasks. You need to restart Viking for a " +"change to this value to be used" +msgstr "" + +#: ../src/background.c:361 +msgid "Job" +msgstr "Tasca" + +#: ../src/background.c:365 +msgid "Progress" +msgstr "En procés" + +#: ../src/background.c:373 +msgid "Viking Background Jobs" +msgstr "Tasques en segon pla deViking" + +#: ../src/bing.c:42 +msgid "Bing Aerial" +msgstr "" + +#: ../src/bing.c:48 +msgid "Bing" +msgstr "" + +#. VIK_GTK_WINDOW_FROM_WIDGET(vp) +#: ../src/bingmapsource.c:514 +msgid "Bing attribution Loading" +msgstr "" + +#: ../src/clipboard.c:95 +msgid "paste failed" +msgstr "Enganxar ha fallat" + +#: ../src/clipboard.c:105 +msgid "wrong clipboard data size" +msgstr "" + +#: ../src/clipboard.c:124 +#, c-format +msgid "" +"The clipboard contains sublayer data for %s layers. You must select a layer " +"of this type to paste the clipboard data." +msgstr "" + +#: ../src/clipboard.c:264 +msgid "" +"In order to paste a waypoint, please select an appropriate layer to paste " +"into." +msgstr "" +"per tal d'enganxar un \"waypoint\", selecciona la capa adhient per enganxar-" +"hi" + +#: ../src/dialog.c:60 +msgid "Go to Lat/Lon" +msgstr "Anar a Lan/Lon" + +#: ../src/dialog.c:69 ../src/viktrwlayer_wpwin.c:173 +msgid "Latitude:" +msgstr "Latitud:" + +#: ../src/dialog.c:72 ../src/viktrwlayer_wpwin.c:177 +msgid "Longitude:" +msgstr "Longitud:" + +#: ../src/dialog.c:102 +msgid "Go to UTM" +msgstr "Anar a UTM" + +#: ../src/dialog.c:114 +msgid "Northing:" +msgstr "" + +#: ../src/dialog.c:117 +msgid "Easting:" +msgstr "" + +#: ../src/dialog.c:121 ../src/vikgeoreflayer.c:902 +msgid "Zone:" +msgstr "Zona:" + +#: ../src/dialog.c:124 ../src/vikgeoreflayer.c:904 +msgid "Letter:" +msgstr "" + +#: ../src/dialog.c:246 ../src/geonamessearch.c:238 +#: ../src/datasource_osm_my_traces.c:505 +msgid "Nothing was selected" +msgstr "No hi ha res seleccionat" + +#: ../src/dialog.c:254 +msgid "Add Route" +msgstr "" + +#: ../src/dialog.c:254 +msgid "Add Track" +msgstr "Afegir \"Track\"" + +#: ../src/dialog.c:262 +msgid "Route Name:" +msgstr "" + +#: ../src/dialog.c:262 +msgid "Track Name:" +msgstr "Nom del \"Track\"" + +#: ../src/dialog.c:282 +msgid "Please enter a name for the track." +msgstr "Si us plau, posa un nom per al \"track\"" + +#: ../src/dialog.c:311 +msgid "Today" +msgstr "" + +#: ../src/dialog.c:393 +msgid "Zoom Factors..." +msgstr "Factors de zoom..." + +#: ../src/dialog.c:407 +msgid "Zoom factor (in meters per pixel):" +msgstr "Factor de zoom (en metres per pixel)" + +#: ../src/dialog.c:408 +msgid "X (easting): " +msgstr "X (al Est) " + +#: ../src/dialog.c:409 +msgid "Y (northing): " +msgstr "Y (al Nord) " + +#: ../src/dialog.c:414 +msgid "X and Y zoom factors must be equal" +msgstr "Els factors de zomm X i Y han de ser iguals" + +#: ../src/dialog.c:469 +msgid "1 min" +msgstr "1 min" + +#: ../src/dialog.c:470 +msgid "1 hour" +msgstr "1 hora" + +#: ../src/dialog.c:471 +msgid "1 day" +msgstr "1 dia" + +#: ../src/dialog.c:472 +msgid "Custom (in minutes):" +msgstr "" + +#: ../src/dialog.c:608 +#, c-format +msgid "" +"2003-2008, Evan Battaglia\n" +"2008-%s, Viking's contributors" +msgstr "" + +#: ../src/dialog.c:609 +msgid "GPS Data and Topo Analyzer, Explorer, and Manager." +msgstr "" + +#: ../src/dialog.c:610 +msgid "" +"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.\n" +"\n" +"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.\n" +"\n" +"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., 59 Temple " +"Place, Suite 330, Boston, MA 02111-1307, USA" +msgstr "" + +#: ../src/dialog.c:703 +msgid "Translation is coordinated on http://launchpad.net/viking" +msgstr "" + +#: ../src/dialog.c:713 +msgid "Download along track" +msgstr "" + +#: ../src/dialog.c:720 +msgid "Map type:" +msgstr "Tipus de mapa:" + +#: ../src/dialog.c:726 +msgid "Zoom level:" +msgstr "Nivell de zoom" + +#: ../src/dialog.c:766 +#, c-format +msgid "The map data is licensed: %s." +msgstr "" + +#: ../src/dialog.c:769 +#, c-format +msgid "" +"The data provided by '%s' are licensed under the following license: " +"%s." +msgstr "" + +#: ../src/dialog.c:773 +msgid "Open license" +msgstr "" + +#: ../src/expedia.c:54 +msgid "Expedia Street Maps" +msgstr "" + +#: ../src/expedia.c:82 +msgid "Invalid expedia altitude" +msgstr "" + +#: ../src/expedia.c:113 +#, c-format +msgid "" +"Couldn't open EXPEDIA image file (right after successful download! Please " +"report and delete image file!): %s" +msgstr "" + +#: ../src/expedia.c:126 +#, c-format +msgid "" +"Couldn't save EXPEDIA image file (right after successful download! Please " +"report and delete image file!): %s" +msgstr "" + +#: ../src/geonamessearch.c:115 +msgid "Search" +msgstr "Cerca" + +#: ../src/geonamessearch.c:117 +msgid "No entries found!" +msgstr "" + +#. NB could allow columns to be shifted around by doing this after each new +#. gtk_tree_view_column_set_reorderable ( column, TRUE ); +#. However I don't think is that useful, so I haven't put it in +#: ../src/geonamessearch.c:171 ../src/datasource_osm_my_traces.c:422 +#: ../src/viktrwlayer_tracklist.c:621 ../src/viktrwlayer_waypointlist.c:618 +msgid "Name" +msgstr "" + +#: ../src/geonamessearch.c:176 +msgid "Feature" +msgstr "" + +#: ../src/geonamessearch.c:181 ../src/datasource_osm_my_traces.c:437 +msgid "Lat/Lon" +msgstr "" + +#: ../src/geonamessearch.c:264 ../src/googlesearch.c:101 ../src/vikgoto.c:430 +msgid "couldn't map temp file" +msgstr "" + +#: ../src/geonamessearch.c:459 +msgid "Select articles" +msgstr "" + +#: ../src/geonamessearch.c:459 +msgid "Select the articles you want to add." +msgstr "" + +#: ../src/geonamessearch.c:475 +msgid "city" +msgstr "" + +#: ../src/geonamessearch.c:477 +msgid "edu" +msgstr "" + +#: ../src/geonamessearch.c:479 +msgid "airport" +msgstr "" + +#: ../src/geonamessearch.c:481 +msgid "mountain" +msgstr "" + +#: ../src/geonamessearch.c:483 +msgid "forest" +msgstr "" + +#: ../src/geonamessearch.c:485 +msgid "church" +msgstr "" + +#: ../src/geojson.c:74 +#, c-format +msgid "%s command failed: %s" +msgstr "" + +#: ../src/geojson.c:146 ../src/gpx.c:1317 +#, c-format +msgid "failed to open temporary file: %s" +msgstr "" + +#: ../src/globals.c:67 +msgid "DDD" +msgstr "" + +#: ../src/globals.c:67 +msgid "DMM" +msgstr "" + +#: ../src/globals.c:67 +msgid "DMS" +msgstr "" + +#: ../src/globals.c:67 +msgid "Raw" +msgstr "" + +#: ../src/globals.c:68 +msgid "Kilometres" +msgstr "" + +#: ../src/globals.c:68 +msgid "Miles" +msgstr "" + +#: ../src/globals.c:68 +msgid "Nautical Miles" +msgstr "" + +#. VIK_UNITS_SPEED_KILOMETRES_PER_HOUR: +#: ../src/globals.c:69 ../src/viktrwlayer_tracklist.c:655 ../src/vikutils.c:100 +msgid "km/h" +msgstr "" + +#: ../src/globals.c:69 ../src/viktrwlayer_tracklist.c:656 ../src/vikutils.c:78 +msgid "mph" +msgstr "" + +#. VIK_UNITS_SPEED_METRES_PER_SECOND: +#: ../src/globals.c:69 ../src/viktrwlayer_tracklist.c:663 ../src/vikutils.c:81 +msgid "m/s" +msgstr "" + +#: ../src/globals.c:69 ../src/viktrwlayer_tracklist.c:657 ../src/vikutils.c:84 +msgid "knots" +msgstr "" + +#: ../src/globals.c:69 ../src/viktrwlayer_tracklist.c:658 ../src/vikutils.c:87 +msgid "s/km" +msgstr "" + +#: ../src/globals.c:69 ../src/viktrwlayer_tracklist.c:659 ../src/vikutils.c:90 +msgid "min/km" +msgstr "" + +#: ../src/globals.c:69 +msgid "s/mi" +msgstr "" + +#: ../src/globals.c:69 ../src/viktrwlayer_tracklist.c:661 ../src/vikutils.c:96 +msgid "min/mi" +msgstr "" + +#: ../src/globals.c:70 +msgid "Metres" +msgstr "" + +#: ../src/globals.c:70 +msgid "Feet" +msgstr "" + +#: ../src/globals.c:73 +msgid "Locale" +msgstr "" + +#: ../src/globals.c:73 +msgid "World" +msgstr "" + +#: ../src/globals.c:73 +msgid "UTC" +msgstr "" + +#: ../src/globals.c:76 +msgid "Degree format:" +msgstr "Format de graus;" + +#: ../src/globals.c:77 +msgid "Distance units:" +msgstr "Unitats de distancia" + +#: ../src/globals.c:78 +msgid "Speed units:" +msgstr "Unitats de velocitat" + +#: ../src/globals.c:79 +msgid "Height units:" +msgstr "Unitats d'alçada" + +#: ../src/globals.c:80 +msgid "Use large waypoint icons:" +msgstr "Fes servir icones grans per als \"waypoints\"" + +#: ../src/globals.c:81 +msgid "Default latitude:" +msgstr "Latitud inicial:" + +#: ../src/globals.c:82 +msgid "Default longitude:" +msgstr "Longotud inicial:" + +#: ../src/globals.c:83 +msgid "Time Display:" +msgstr "" + +#: ../src/globals.c:84 +msgid "" +"Display times according to the reference frame. Locale is the user's system " +"setting. World is relative to the location of the object." +msgstr "" + +#: ../src/globals.c:90 +msgid "Alphabetical" +msgstr "" + +#: ../src/globals.c:90 ../src/datasource_osm_my_traces.c:432 +msgid "Time" +msgstr "" + +#: ../src/globals.c:90 +msgid "Creation" +msgstr "" + +#: ../src/globals.c:91 +msgid "Title Case" +msgstr "" + +#: ../src/globals.c:91 +msgid "Lowercase" +msgstr "" + +#: ../src/globals.c:94 +msgid "KML File Export Units:" +msgstr "" + +#: ../src/globals.c:95 +msgid "GPX Track Order:" +msgstr "" + +#: ../src/globals.c:96 +msgid "GPX Waypoint Symbols:" +msgstr "" + +#: ../src/globals.c:97 +msgid "" +"Save GPX Waypoint Symbol names in the specified case. May be useful for " +"compatibility with various devices" +msgstr "" + +#: ../src/globals.c:98 +msgid "GPX Creator:" +msgstr "" + +#: ../src/globals.c:99 +msgid "" +"The creator value when writing a GPX file. Otherwise when blank a default is " +"used." +msgstr "" + +#: ../src/globals.c:104 +msgid "Image Viewer:" +msgstr "" + +#: ../src/globals.c:109 +msgid "External GPX Program 1:" +msgstr "" + +#: ../src/globals.c:110 +msgid "External GPX Program 2:" +msgstr "" + +#: ../src/globals.c:113 +msgid "Absolute" +msgstr "" + +#: ../src/globals.c:113 +msgid "Relative" +msgstr "" + +#: ../src/globals.c:117 +msgid "Save File Reference Mode:" +msgstr "" + +#: ../src/globals.c:118 +msgid "" +"When saving a Viking .vik file, this determines how the directory paths of " +"filenames are written." +msgstr "" + +#: ../src/globals.c:119 +msgid "Ask for Name before Track Creation:" +msgstr "" + +#: ../src/globals.c:120 +msgid "Show Tooltip during Track Creation:" +msgstr "" + +#: ../src/globals.c:121 +msgid "The number of recent files:" +msgstr "" + +#: ../src/globals.c:122 +msgid "" +"Only applies to new windows or on application restart. -1 means all " +"available files." +msgstr "" + +#: ../src/globals.c:123 +msgid "Open files in selected layer:" +msgstr "" + +#: ../src/globals.c:124 +msgid "Open files (but not .vik ones) into the selected TrackWaypoint layer." +msgstr "" + +#: ../src/globals.c:125 +msgid "Show calendar day names:" +msgstr "" + +#: ../src/globals.c:128 +msgid "Home Location" +msgstr "" + +#: ../src/globals.c:128 +msgid "Last Location" +msgstr "" + +#: ../src/globals.c:128 +msgid "Specified File" +msgstr "" + +#: ../src/globals.c:128 +msgid "Auto Location" +msgstr "" + +#: ../src/globals.c:131 +msgid "Restore Window Setup:" +msgstr "" + +#: ../src/globals.c:132 +msgid "Restore window size and layout" +msgstr "" + +#: ../src/globals.c:133 +msgid "Add a Default Map Layer:" +msgstr "" + +#: ../src/globals.c:134 +msgid "" +"The default map layer added is defined by the Layer Defaults. Use the menu " +"Edit->Layer Defaults->Map... to change the map type and other values." +msgstr "" + +#: ../src/globals.c:135 +msgid "Startup Method:" +msgstr "" + +#: ../src/globals.c:136 +msgid "Startup File:" +msgstr "" + +#: ../src/globals.c:137 +msgid "" +"The default file to load on startup. Only applies when the startup method is " +"set to 'Specified File'" +msgstr "" + +#: ../src/globals.c:138 +msgid "Check For New Version:" +msgstr "" + +#: ../src/globals.c:139 +msgid "Periodically check to see if a new version of Viking is available" +msgstr "" + +#. Defaults for the options are setup here +#: ../src/globals.c:176 +msgid "General" +msgstr "" + +#. New Tab +#: ../src/globals.c:204 +msgid "Startup" +msgstr "" + +#. New Tab +#: ../src/globals.c:222 +msgid "Export/External" +msgstr "" + +#. 'Advanced' Properties +#: ../src/globals.c:249 +msgid "Advanced" +msgstr "" + +#. Webtools +#: ../src/google.c:39 +msgid "Google" +msgstr "Google" + +#. If there is an actual description field it will overwrite this value +#: ../src/gpx.c:264 +#, c-format +msgid "Created by: %s" +msgstr "" + +#: ../src/datasource_bfilter.c:43 +msgid "Max number of points:" +msgstr "" + +#: ../src/datasource_bfilter.c:84 +msgid "Simplify All Tracks..." +msgstr "" + +#: ../src/datasource_bfilter.c:85 +msgid "Simplified Tracks" +msgstr "" + +#. { VIK_LAYER_NUM_TYPES, "compressmethod", VIK_LAYER_PARAM_UINT, VIK_LAYER_GROUP_NONE, N_("Simplify Method:"), VIK_LAYER_WIDGET_COMBOBOX, compress_method, NULL, NULL, NULL, NULL, NULL }, +#: ../src/datasource_bfilter.c:111 +msgid "Error Factor:" +msgstr "" + +#: ../src/datasource_bfilter.c:112 +msgid "" +"Specifies the maximum allowable error that may be introduced by removing a " +"single point by the crosstrack method. See the manual or GPSBabel Simplify " +"Filter documentation for more detail." +msgstr "" + +#: ../src/datasource_bfilter.c:166 +msgid "Compress Tracks..." +msgstr "" + +#: ../src/datasource_bfilter.c:167 +msgid "Compressed Tracks" +msgstr "" + +#: ../src/datasource_bfilter.c:197 ../src/datasource_bfilter.c:198 +msgid "Remove Duplicate Waypoints" +msgstr "" + +#: ../src/datasource_bfilter.c:221 +msgid "Manual filter:" +msgstr "" + +#: ../src/datasource_bfilter.c:222 +msgid "Manual filter command: e.g. 'swap'." +msgstr "" + +#: ../src/datasource_bfilter.c:233 ../src/datasource_bfilter.c:234 +msgid "Manual filter" +msgstr "" + +#: ../src/datasource_bfilter.c:262 +msgid "Waypoints Inside This" +msgstr "" + +#: ../src/datasource_bfilter.c:263 ../src/datasource_bfilter.c:292 +msgid "Polygonized Layer" +msgstr "" + +#: ../src/datasource_bfilter.c:291 +msgid "Waypoints Outside This" +msgstr "" + +#: ../src/datasource_file.c:61 +msgid "Import file with GPSBabel" +msgstr "" + +#: ../src/datasource_file.c:62 +msgid "Imported file" +msgstr "" + +#. The file selector +#: ../src/datasource_file.c:129 +msgid "File:" +msgstr "" + +#: ../src/datasource_file.c:130 +msgid "File to import" +msgstr "" + +#: ../src/datasource_file.c:137 +msgid "All files" +msgstr "" + +#. The file format selector +#: ../src/datasource_file.c:144 ../src/datasource_url.c:106 +msgid "File type:" +msgstr "" + +#: ../src/datasource_file.c:189 +#, c-format +msgid "using babel args '%s' and file '%s'" +msgstr "" + +#: ../src/datasource_gc.c:67 +msgid "Download Geocaches" +msgstr "" + +#: ../src/datasource_gc.c:68 +msgid "Geocaching.com Caches" +msgstr "" + +#: ../src/datasource_gc.c:86 +msgid "geocaching.com username:" +msgstr "" + +#: ../src/datasource_gc.c:87 +msgid "geocaching.com password:" +msgstr "" + +#: ../src/datasource_gc.c:92 ../src/vikwindow.c:3502 +msgid "Geocaching" +msgstr "" + +#: ../src/datasource_gc.c:128 +#, c-format +msgid "" +"Can't find %s or %s in path! Check that you have installed it correctly." +msgstr "" + +#: ../src/datasource_gc.c:190 +msgid "Number geocaches:" +msgstr "" + +#: ../src/datasource_gc.c:192 +msgid "Centered around:" +msgstr "" + +#: ../src/datasource_gc.c:231 +msgid "Broken input - using some defaults" +msgstr "" + +#: ../src/datasource_geotag.c:51 +msgid "Create Waypoints from Geotagged Images" +msgstr "" + +#: ../src/datasource_geotag.c:52 +msgid "Geotagged Images" +msgstr "" + +#: ../src/datasource_geotag.c:102 ../src/datasource_geojson.c:93 +#: ../src/vikfileentry.c:171 ../src/vikwindow.c:3533 ../src/vikwindow.c:3610 +#: ../src/vikwindow.c:3641 ../src/vikwindow.c:4356 ../src/vikwindow.c:4649 +msgid "All" +msgstr "" + +#: ../src/datasource_geotag.c:107 ../src/vikfileentry.c:115 +#: ../src/viktrwlayer_geotag.c:637 ../src/vikwindow.c:3518 +#: ../src/vikwindow.c:4377 +msgid "JPG" +msgstr "" + +#: ../src/datasource_geotag.c:168 +#, c-format +msgid "Unable to create waypoint from %s" +msgstr "" + +#: ../src/datasource_geojson.c:46 +msgid "Acquire from GeoJSON" +msgstr "" + +#: ../src/datasource_geojson.c:47 ../src/datasource_geojson.c:98 +msgid "GeoJSON" +msgstr "" + +#: ../src/datasource_geojson.c:152 +#, c-format +msgid "Unable to import from: %s" +msgstr "" + +#: ../src/datasource_gps.c:54 +msgid "Acquire from GPS" +msgstr "" + +#: ../src/datasource_gps.c:55 +msgid "Acquired from GPS" +msgstr "" + +#: ../src/datasource_gps.c:258 +#, c-format +msgid "using cmd '%s' and file '%s'\n" +msgstr "" + +#: ../src/datasource_gps.c:353 ../src/vikgpslayer.c:966 +#, c-format +msgid "Downloading %d waypoint..." +msgid_plural "Downloading %d waypoints..." +msgstr[0] "" +msgstr[1] "" + +#: ../src/datasource_gps.c:358 ../src/vikgpslayer.c:971 +#, c-format +msgid "Downloading %d trackpoint..." +msgid_plural "Downloading %d trackpoints..." +msgstr[0] "" +msgstr[1] "" + +#: ../src/datasource_gps.c:363 ../src/vikgpslayer.c:976 +#, c-format +msgid "Downloading %d routepoint..." +msgid_plural "Downloading %d routepoints..." +msgstr[0] "" +msgstr[1] "" + +#: ../src/datasource_gps.c:386 ../src/datasource_gps.c:393 +#: ../src/datasource_gps.c:400 +#, c-format +msgid "Downloaded %d out of %d %s..." +msgstr "" + +#: ../src/datasource_gps.c:388 ../src/datasource_gps.c:395 +#: ../src/datasource_gps.c:402 +#, c-format +msgid "Downloaded %d %s." +msgstr "" + +#: ../src/datasource_gps.c:416 ../src/vikgpslayer.c:1134 +#, c-format +msgid "GPS Device: %s" +msgstr "" + +#: ../src/datasource_gps.c:428 ../src/vikgpslayer.c:1214 +msgid "Status: Working..." +msgstr "" + +#. NB gps_layer_inst_init() is performed after parameter registeration +#. thus to give the protocols some potential values use the old static list +#. TODO: find another way to use gps_layer_inst_init()? +#: ../src/datasource_gps.c:584 ../src/vikgpslayer.c:216 +msgid "GPS Protocol:" +msgstr "" + +#. List reassigned at runtime +#: ../src/datasource_gps.c:609 ../src/vikgpslayer.c:217 +msgid "Serial Port:" +msgstr "" + +#: ../src/datasource_gps.c:659 +msgid "" +"Turn Off After Transfer\n" +"(Garmin/NAViLink Only)" +msgstr "" + +#: ../src/datasource_gps.c:666 +msgid "Tracks:" +msgstr "" + +#: ../src/datasource_gps.c:673 +msgid "Routes:" +msgstr "" + +#: ../src/datasource_gps.c:680 +msgid "Waypoints:" +msgstr "" + +#: ../src/datasource_gps.c:756 ../src/vikgpslayer.c:1509 +msgid "GPS device: N/A" +msgstr "" + +#: ../src/datasource_osm.c:53 ../src/datasource_osm.c:54 +msgid "OSM traces" +msgstr "" + +#: ../src/datasource_osm.c:89 +msgid "Page number:" +msgstr "" + +#: ../src/datasource_osm_my_traces.c:59 ../src/datasource_osm_my_traces.c:60 +msgid "OSM My Traces" +msgstr "" + +#: ../src/datasource_osm_my_traces.c:106 ../src/osm-traces.c:684 +msgid "Email/username:" +msgstr "" + +#: ../src/datasource_osm_my_traces.c:111 +msgid "The email or username used to login to OSM" +msgstr "" + +#: ../src/datasource_osm_my_traces.c:113 ../src/osm-traces.c:692 +msgid "Password:" +msgstr "" + +#: ../src/datasource_osm_my_traces.c:116 +msgid "The password used to login to OSM" +msgstr "" + +#: ../src/datasource_osm_my_traces.c:427 ../src/viktrwlayer.c:689 +msgid "Description" +msgstr "" + +#: ../src/datasource_osm_my_traces.c:442 +msgid "Privacy" +msgstr "" + +#: ../src/datasource_osm_my_traces.c:449 +msgid "Within Current View" +msgstr "" + +#: ../src/datasource_osm_my_traces.c:516 +msgid "GPS Traces" +msgstr "" + +#: ../src/datasource_osm_my_traces.c:518 +msgid "None found!" +msgstr "" + +#: ../src/datasource_osm_my_traces.c:569 +msgid "Ensure the OSM access token preferences are setup." +msgstr "" + +#: ../src/datasource_osm_my_traces.c:645 +msgid "My OSM Traces" +msgstr "" + +#. Report errors to the status bar +#: ../src/datasource_osm_my_traces.c:667 +#, c-format +msgid "Unable to get trace: %s" +msgstr "" + +#: ../src/datasource_routing.c:56 ../src/datasource_routing.c:57 +msgid "Directions" +msgstr "" + +#: ../src/datasource_routing.c:90 +msgid "No routing engines with directions available" +msgstr "" + +#. Engine selector +#: ../src/datasource_routing.c:99 +msgid "Engine:" +msgstr "" + +#. From and To entries +#: ../src/datasource_routing.c:104 +msgid "From:" +msgstr "" + +#: ../src/datasource_routing.c:105 +msgid "To:" +msgstr "" + +#: ../src/datasource_url.c:48 +msgid "Acquire from URL" +msgstr "" + +#: ../src/datasource_url.c:49 +msgid "URL" +msgstr "" + +#: ../src/datasource_url.c:101 +msgid "URL:" +msgstr "" + +#. Only GPX (not using GPSbabel) +#: ../src/datasource_url.c:133 ../src/vikfileentry.c:161 +#: ../src/vikwindow.c:3513 ../src/vikwindow.c:3603 +msgid "GPX" +msgstr "" + +#: ../src/datasource_wikipedia.c:32 +msgid "Create Waypoints from Wikipedia Articles" +msgstr "" + +#: ../src/datasource_wikipedia.c:33 +msgid "Wikipedia Waypoints" +msgstr "" + +#: ../src/dem.c:66 ../src/dem.c:80 +msgid "Invalid DEM" +msgstr "" + +#: ../src/dem.c:122 +msgid "Invalid DEM header" +msgstr "" + +#: ../src/dem.c:191 ../src/dem.c:204 +msgid "Incorrect DEM Class B record: expected 1" +msgstr "" + +#: ../src/dem.c:289 ../src/download.c:176 +#, c-format +msgid "Couldn't map file %s: %s" +msgstr "" + +#: ../src/download.c:130 +msgid "Tile age (days):" +msgstr "" + +#: ../src/download.c:406 +#, c-format +msgid "Download error: %s" +msgstr "" + +#: ../src/download.c:490 +msgid "couldn't open temp file" +msgstr "" + +#: ../src/file.c:458 ../src/file.c:463 +#, c-format +msgid "Draw mode '%s' no more supported" +msgstr "" + +#: ../src/geotag_exif.c:621 +msgid "Not enough memory." +msgstr "" + +#: ../src/geotag_exif.c:639 +msgid "Setting a value for this tag is unsupported!" +msgstr "" + +#: ../src/geotag_exif.c:658 +#, c-format +msgid "Too few components specified (need %d, found %d)\n" +msgstr "" + +#: ../src/geotag_exif.c:662 +msgid "Numeric value expected\n" +msgstr "" + +#: ../src/geotag_exif.c:670 +msgid "This shouldn't happen!" +msgstr "" + +#: ../src/geotag_exif.c:740 +msgid "Not yet implemented!" +msgstr "" + +#: ../src/geotag_exif.c:753 +msgid "Warning; Too many components specified!" +msgstr "" + +#: ../src/osm-traces.c:87 +msgid "Identifiable (public w/ timestamps)" +msgstr "" + +#: ../src/osm-traces.c:88 +msgid "Trackable (private w/ timestamps)" +msgstr "" + +#: ../src/osm-traces.c:89 +msgid "Public" +msgstr "" + +#: ../src/osm-traces.c:90 +msgid "Private" +msgstr "" + +#: ../src/osm-traces.c:108 +msgid "Access Token:" +msgstr "" + +#: ../src/osm-traces.c:108 +msgid "Get New OSM Access Tokens" +msgstr "" + +#: ../src/osm-traces.c:109 +msgid "Access Token Key:" +msgstr "" + +#: ../src/osm-traces.c:110 +msgid "Access Token Secret:" +msgstr "" + +#: ../src/osm-traces.c:111 +msgid "OSM username:" +msgstr "" + +#: ../src/osm-traces.c:112 +msgid "OSM password:" +msgstr "" + +#. Check to really override existing values... +#: ../src/osm-traces.c:263 +msgid "Do you want to overwrite existing values?" +msgstr "" + +#: ../src/osm-traces.c:275 +msgid "Not able to generate OSM request tokens." +msgstr "" + +#: ../src/osm-traces.c:299 +msgid "" +"Waiting for authorization approval.\n" +"Ensure you have granted access at the website before continuing here." +msgstr "" + +#: ../src/osm-traces.c:315 +msgid "No Authorization." +msgstr "" + +#: ../src/osm-traces.c:354 +msgid "" +"OSM Username and Password preferences are not required anymore. You can now " +"remove them." +msgstr "" + +#. Preferences +#: ../src/osm-traces.c:379 +msgid "OpenStreetMap Traces" +msgstr "" + +#: ../src/osm-traces.c:504 +#, c-format +msgid "failed to upload data: HTTP response is %ld" +msgstr "" + +#: ../src/osm-traces.c:509 +#, c-format +msgid "curl_easy_getinfo failed: %d" +msgstr "" + +#: ../src/osm-traces.c:514 +#, c-format +msgid "curl request failed: %s" +msgstr "" + +#. Success +#: ../src/osm-traces.c:592 +msgid "Uploaded to OSM" +msgstr "" + +#: ../src/osm-traces.c:596 +msgid "" +"FAILED TO UPLOAD DATA TO OSM - Ensure the OSM access token preferences are " +"setup." +msgstr "" + +#: ../src/osm-traces.c:599 +msgid "FAILED TO UPLOAD DATA TO OSM - CURL PROBLEM" +msgstr "" + +#: ../src/osm-traces.c:602 +msgid "FAILED TO UPLOAD DATA TO OSM" +msgstr "" + +#: ../src/osm-traces.c:602 +msgid "HTTP response code" +msgstr "" + +#: ../src/osm-traces.c:610 +#, c-format +msgid "failed to unlink temporary file: %s" +msgstr "" + +#: ../src/osm-traces.c:664 +msgid "OSM upload" +msgstr "" + +#: ../src/osm-traces.c:689 +msgid "" +"The email/username used as login\n" +"Enter the email/username you use to login into www.openstreetmap.org." +"" +msgstr "" + +#: ../src/osm-traces.c:697 +msgid "" +"The password used to login\n" +"Enter the password you use to login into www.openstreetmap.org." +msgstr "" + +#: ../src/osm-traces.c:703 +msgid "File's name:" +msgstr "" + +#: ../src/osm-traces.c:713 +msgid "" +"The name of the file on OSM\n" +"This is the name of the file created on the server.This is not the " +"name of the local file." +msgstr "" + +#: ../src/osm-traces.c:717 ../src/viktrwlayer_wpwin.c:197 +#: ../src/viktrwlayer_wpwin.c:199 +msgid "Description:" +msgstr "" + +#: ../src/osm-traces.c:731 +msgid "The description of the trace" +msgstr "" + +#: ../src/osm-traces.c:734 +msgid "Anonymize Times:" +msgstr "" + +#: ../src/osm-traces.c:739 +msgid "" +"Anonymize times of the trace.\n" +"You may choose to make the trace identifiable, yet mask the actual " +"real time values" +msgstr "" + +#: ../src/osm-traces.c:743 +msgid "Tags:" +msgstr "" + +#: ../src/osm-traces.c:751 +msgid "The tags associated to the trace" +msgstr "" + +#: ../src/osm-traces.c:816 +#, c-format +msgid "Uploading %s to OSM" +msgstr "" + +#: ../src/mapcache.c:67 +msgid "Map cache memory size (MB):" +msgstr "" + +#. NB Can have a couple hundred fonts loaded when using system directories +#. So ATM don't list them all - otherwise need better GUI feedback display. +#: ../src/mapnik_interface.cpp:324 +#, c-format +msgid "" +"%s %s\n" +"Plugins=%sFonts loaded=%d" +msgstr "" + +#: ../src/mapnik_interface.cpp:325 ../src/vikmapniklayer.c:278 +msgid "Mapnik" +msgstr "" + +#: ../src/print.c:51 ../src/viktrwlayer.c:572 +msgid "None" +msgstr "" + +#: ../src/print.c:52 +msgid "Horizontally" +msgstr "" + +#: ../src/print.c:53 +msgid "Vertically" +msgstr "" + +#: ../src/print.c:54 +msgid "Both" +msgstr "" + +#: ../src/print.c:118 +msgid "Image Settings" +msgstr "" + +#: ../src/print.c:551 +msgid "done" +msgstr "" + +#. Page Size +#: ../src/print.c:580 +msgid "_Adjust Page Size and Orientation" +msgstr "" + +#: ../src/print.c:596 +msgid "C_enter:" +msgstr "" + +#. ignore page margins +#: ../src/print.c:614 +msgid "Ignore Page _Margins" +msgstr "" + +#: ../src/print.c:633 +msgid "Image S_ize:" +msgstr "" + +#: ../src/ui_util.c:88 +#, c-format +msgid "Could not launch web browser. %s" +msgstr "" + +#: ../src/ui_util.c:101 +#, c-format +msgid "Could not create new email. %s" +msgstr "" + +#: ../src/vikcoordlayer.c:57 +msgid "Color:" +msgstr "" + +#: ../src/vikcoordlayer.c:58 +msgid "Minutes Width:" +msgstr "" + +#: ../src/vikcoordlayer.c:59 +msgid "Line Thickness:" +msgstr "" + +#: ../src/vikcoordlayer.c:66 +msgid "Coordinate" +msgstr "" + +#: ../src/main.c:92 +#, c-format +msgid "Ignoring Xlib error: error code %d request code %d\n" +msgstr "" + +#: ../src/main.c:111 +msgid "Enable debug output" +msgstr "" + +#: ../src/main.c:112 +msgid "Enable verbose output" +msgstr "" + +#: ../src/main.c:113 +msgid "Show version" +msgstr "" + +#: ../src/main.c:114 +msgid "Latitude in decimal degrees" +msgstr "" + +#: ../src/main.c:115 +msgid "Longitude in decimal degrees" +msgstr "" + +#: ../src/main.c:116 +msgid "Zoom Level (OSM). Value can be 0 - 22" +msgstr "" + +#: ../src/main.c:117 +msgid "Add a map layer by id value. Use 0 for the default map." +msgstr "" + +#: ../src/main.c:160 +#, c-format +msgid "" +"%s %s\n" +"Copyright (c) 2003-2008 Evan Battaglia\n" +"Copyright (c) 2008-%s Viking's contributors\n" +msgstr "" + +#: ../src/osm.c:50 +msgid "OpenStreetMap (Mapnik)" +msgstr "" + +#: ../src/osm.c:65 +msgid "OpenStreetMap (Cycle)" +msgstr "" + +#: ../src/osm.c:79 +msgid "OpenStreetMap (Transport)" +msgstr "" + +#: ../src/osm.c:95 +msgid "OpenStreetMap (Humanitarian)" +msgstr "" + +#: ../src/osm.c:111 +msgid "On Disk OSM Tile Format" +msgstr "" + +#: ../src/osm.c:121 +msgid "MBTiles File" +msgstr "" + +#: ../src/osm.c:132 +msgid "OSM Metatiles" +msgstr "" + +#: ../src/osm.c:146 +msgid "Mapbox Outdoors" +msgstr "" + +#: ../src/osm.c:153 +msgid "Mapbox Specific" +msgstr "" + +#: ../src/osm.c:170 +msgid "OSM (view)" +msgstr "" + +#: ../src/osm.c:174 +msgid "OSM (edit)" +msgstr "" + +#. Note the use of positional parameters +#: ../src/osm.c:179 +msgid "OSM (query)" +msgstr "" + +#: ../src/osm.c:183 +msgid "OSM (render)" +msgstr "" + +#. Example: http://127.0.0.1:8111/load_and_zoom?left=8.19&right=8.20&top=48.605&bottom=48.590&select=node413602999 +#. JOSM or merkaartor must already be running with remote interface enabled +#: ../src/osm.c:190 +msgid "Local port 8111 (eg JOSM)" +msgstr "" + +#: ../src/osm.c:195 +msgid "Geofabrik Map Compare" +msgstr "" + +#: ../src/osm.c:203 +msgid "OpenStreetMap Notes" +msgstr "" + +#. Not really OSM but can't be bothered to create somewhere else to put it... +#: ../src/osm.c:221 +msgid "Wikimedia Toolserver GeoHack" +msgstr "" + +#: ../src/preferences.c:195 +msgid "Preferences" +msgstr "" + +#: ../src/toolbar.c:91 ../src/toolbar.c:92 +msgid "System Default" +msgstr "" + +#: ../src/toolbar.c:91 ../src/viktrwlayer.c:563 +msgid "Small" +msgstr "" + +#: ../src/toolbar.c:91 ../src/viktrwlayer.c:564 +msgid "Medium" +msgstr "" + +#: ../src/toolbar.c:91 ../src/viktrwlayer.c:565 +msgid "Large" +msgstr "" + +#: ../src/toolbar.c:92 +msgid "Icons Only" +msgstr "" + +#: ../src/toolbar.c:92 +msgid "Text Only" +msgstr "" + +#: ../src/toolbar.c:92 +msgid "Icons and Text" +msgstr "" + +#: ../src/toolbar.c:106 +msgid "Append to Menu:" +msgstr "" + +#: ../src/toolbar.c:107 +msgid "Pack the toolbar to the main menu to save vertical space" +msgstr "" + +#: ../src/toolbar.c:108 +msgid "Icon Size:" +msgstr "" + +#: ../src/toolbar.c:110 +msgid "Icon Style:" +msgstr "" + +#: ../src/toolbar.c:112 +msgid "Customize:" +msgstr "" + +#: ../src/toolbar.c:112 +msgid "Customize Buttons" +msgstr "" + +#. Preferences +#: ../src/toolbar.c:145 +msgid "Toolbar" +msgstr "" + +#: ../src/toolbar.c:312 +msgid "_Customize" +msgstr "" + +#: ../src/toolbar.c:641 +msgid "Separator" +msgstr "" + +#: ../src/toolbar.c:642 +msgid "--- Separator ---" +msgstr "" + +#: ../src/toolbar.c:1007 +msgid "Customize Toolbar" +msgstr "" + +#: ../src/toolbar.c:1028 +msgid "" +"Select items to be displayed on the toolbar. Items can be reordered by drag " +"and drop." +msgstr "" + +#: ../src/toolbar.c:1044 +msgid "Available Items" +msgstr "" + +#: ../src/toolbar.c:1065 +msgid "Displayed Items" +msgstr "" + +#: ../src/viklayer_defaults.c:232 +#, c-format +msgid "Could not open file: %s" +msgstr "" + +#: ../src/viklayer_defaults.c:304 +msgid "Layer Defaults" +msgstr "" + +#: ../src/uibuilder.c:196 +msgid "Take care that this password will be stored clearly in a plain file." +msgstr "" + +#: ../src/uibuilder.c:628 ../src/viktrwlayer_export.c:188 +#: ../src/viktrwlayer_export.c:304 ../src/vikwindow.c:3666 +#: ../src/vikwindow.c:4408 +#, c-format +msgid "The file \"%s\" exists, do you wish to overwrite it?" +msgstr "" + +#: ../src/vikaggregatelayer.c:41 +msgid "Aggregate" +msgstr "" + +#: ../src/vikaggregatelayer.c:528 ../src/viktrwlayer.c:11700 +#, c-format +msgid "%s: Waypoint List" +msgstr "" + +#: ../src/vikaggregatelayer.c:570 +msgid "Search by Date" +msgstr "" + +#: ../src/vikaggregatelayer.c:576 +msgid "No items found with the requested date." +msgstr "" + +#: ../src/vikaggregatelayer.c:615 ../src/viktrwlayer.c:11691 +#, c-format +msgid "%s: Track and Route List" +msgstr "" + +#: ../src/vikaggregatelayer.c:681 ../src/viktrwlayer.c:8346 +#: ../src/viktrwlayer.c:8417 ../src/viktrwlayer.c:8494 +msgid "_Visibility" +msgstr "" + +#: ../src/vikaggregatelayer.c:686 +msgid "_Show All" +msgstr "" + +#: ../src/vikaggregatelayer.c:692 +msgid "_Hide All" +msgstr "" + +#: ../src/vikaggregatelayer.c:698 ../src/viktrwlayer.c:8363 +#: ../src/viktrwlayer.c:8434 ../src/viktrwlayer.c:8511 +msgid "_Toggle" +msgstr "" + +#: ../src/vikaggregatelayer.c:705 ../src/viktrwlayer.c:8532 +msgid "_Sort" +msgstr "" + +#: ../src/vikaggregatelayer.c:711 ../src/viktrwlayer.c:8538 +msgid "Name _Ascending" +msgstr "" + +#: ../src/vikaggregatelayer.c:717 ../src/viktrwlayer.c:8544 +msgid "Name _Descending" +msgstr "" + +#: ../src/vikaggregatelayer.c:723 ../src/viktrwlayer.c:575 +#: ../src/viktrwlayer.c:8550 +msgid "Date Ascending" +msgstr "" + +#: ../src/vikaggregatelayer.c:729 ../src/viktrwlayer.c:576 +#: ../src/viktrwlayer.c:8556 +msgid "Date Descending" +msgstr "" + +#: ../src/vikaggregatelayer.c:735 ../src/viktrwlayer.c:8445 +#: ../src/viktrwlayer.c:8523 ../src/viktrwlayer.c:8595 +#: ../src/viktrwlayer_tracklist.c:296 +msgid "_Statistics" +msgstr "" + +#: ../src/vikaggregatelayer.c:740 ../src/viktrwlayer.c:4533 +msgid "Track _List..." +msgstr "" + +#: ../src/vikaggregatelayer.c:746 ../src/viktrwlayer.c:4540 +msgid "_Waypoint List..." +msgstr "" + +#: ../src/vikaggregatelayer.c:753 +msgid "Searc_h" +msgstr "" + +#: ../src/vikaggregatelayer.c:759 +msgid "By _Date..." +msgstr "" + +#: ../src/vikaggregatelayer.c:762 +msgid "Find the first item with a specified date" +msgstr "" + +#: ../src/vikaggregatelayer.c:765 +msgid "Load E_xternal Layers" +msgstr "" + +#. Could have a more complicated tooltip that numbers each type of layers, +#. but for now a simple overall count +#: ../src/vikaggregatelayer.c:1011 +#, c-format +msgid "One layer" +msgid_plural "%d layers" +msgstr[0] "" +msgstr[1] "" + +#: ../src/vikaggregatelayer.c:1014 +#, c-format +msgid "Empty" +msgstr "" + +#: ../src/vikdemlayer.c:86 +msgid "SRTM Global 90m (3 arcsec)" +msgstr "" + +#: ../src/vikdemlayer.c:94 +msgid "Absolute height" +msgstr "" + +#: ../src/vikdemlayer.c:95 +msgid "Height gradient" +msgstr "" + +#: ../src/vikdemlayer.c:120 +msgid "DEM Files:" +msgstr "" + +#: ../src/vikdemlayer.c:121 +msgid "Download Source:" +msgstr "" + +#: ../src/vikdemlayer.c:122 +msgid "Min Elev Color:" +msgstr "" + +#: ../src/vikdemlayer.c:123 ../src/viktrwlayer_wpwin.c:207 +msgid "Type:" +msgstr "" + +#: ../src/vikdemlayer.c:124 +msgid "Min Elev:" +msgstr "" + +#: ../src/vikdemlayer.c:125 +msgid "Max Elev:" +msgstr "" + +#: ../src/vikdemlayer.c:137 +msgid "_DEM Download" +msgstr "" + +#: ../src/vikdemlayer.c:137 +msgid "DEM Download" +msgstr "" + +#: ../src/vikdemlayer.c:192 +msgid "DEM" +msgstr "" + +#: ../src/vikdemlayer.c:304 +#, c-format +msgid "Number of files: %d" +msgstr "" + +#: ../src/vikdemlayer.c:446 +msgid "DEM Loading" +msgstr "" + +#: ../src/vikdemlayer.c:927 +#, c-format +msgid "No SRTM data available for %f, %f" +msgstr "" + +#: ../src/vikdemlayer.c:948 +#, c-format +msgid "DEM download failure for %f, %f" +msgstr "" + +#: ../src/vikdemlayer.c:954 +#, c-format +msgid "DEM write failure for %s" +msgstr "" + +#. Probably not over any land... +#: ../src/vikdemlayer.c:1201 +msgid "No DEM File Available" +msgstr "" + +#: ../src/vikdemlayer.c:1220 +#, c-format +msgid "" +"\n" +"Source: %s\n" +"\n" +"DEM File: %s\n" +"DEM File Timestamp: %s" +msgstr "" + +#: ../src/vikdemlayer.c:1224 +#, c-format +msgid "" +"Source: %s\n" +"\n" +"No DEM File!" +msgstr "" + +#: ../src/vikdemlayer.c:1264 +#, c-format +msgid "Downloading DEM %s" +msgstr "" + +#: ../src/vikdemlayer.c:1289 +msgid "_Show DEM File Information" +msgstr "" + +#: ../src/vikfileentry.c:72 +msgid "Browse..." +msgstr "" + +#: ../src/vikfileentry.c:103 +msgid "Choose file" +msgstr "" + +#: ../src/vikfileentry.c:120 ../src/vikwindow.c:4372 +msgid "PNG" +msgstr "" + +#: ../src/vikfileentry.c:125 +msgid "TIFF" +msgstr "" + +#: ../src/vikfileentry.c:133 +msgid "MBTiles" +msgstr "" + +#: ../src/vikfileentry.c:142 +msgid "XML" +msgstr "" + +#: ../src/vikfileentry.c:149 +msgid "MML" +msgstr "" + +#: ../src/vikfileentry.c:154 +msgid "MSS" +msgstr "" + +#: ../src/vikfilelist.c:49 +msgid "Choose file(s)" +msgstr "" + +#: ../src/vikfilelist.c:182 +msgid "Add..." +msgstr "" + +#: ../src/vikfilelist.c:183 +msgid "Delete" +msgstr "" + +#: ../src/vikgeoreflayer.c:97 +msgid "_Georef Move Map" +msgstr "" + +#: ../src/vikgeoreflayer.c:97 +msgid "Georef Move Map" +msgstr "" + +#: ../src/vikgeoreflayer.c:106 +msgid "Georef Z_oom Tool" +msgstr "" + +#: ../src/vikgeoreflayer.c:106 +msgid "Georef Zoom Tool" +msgstr "" + +#: ../src/vikgeoreflayer.c:117 +msgid "GeoRef Map" +msgstr "" + +#: ../src/vikgeoreflayer.c:214 +msgid "Auto Read World Files:" +msgstr "" + +#: ../src/vikgeoreflayer.c:215 +msgid "" +"Automatically attempt to read associated world file of a new image for a " +"GeoRef layer" +msgstr "" + +#: ../src/vikgeoreflayer.c:511 ../src/vikgeoreflayer.c:797 +#: ../src/vikmapslayer.c:1174 +#, c-format +msgid "Couldn't open image file: %s" +msgstr "" + +#: ../src/vikgeoreflayer.c:607 ../src/vikgeoreflayer.c:633 +msgid "Choose World file" +msgstr "" + +#: ../src/vikgeoreflayer.c:619 +msgid "The World file you requested could not be opened for reading." +msgstr "" + +#: ../src/vikgeoreflayer.c:621 +msgid "Unexpected end of file reading World file." +msgstr "" + +#: ../src/vikgeoreflayer.c:646 +msgid "The file you requested could not be opened for writing." +msgstr "" + +#: ../src/vikgeoreflayer.c:782 +msgid "Lower right corner values may not be consistent with upper right values" +msgstr "" + +#: ../src/vikgeoreflayer.c:806 +#, c-format +msgid "Invalid image size: %s" +msgstr "" + +#: ../src/vikgeoreflayer.c:831 ../src/viklayer.c:561 ../src/vikwindow.c:4891 +msgid "Layer Properties" +msgstr "" + +#: ../src/vikgeoreflayer.c:852 +msgid "World File Parameters:" +msgstr "" + +#: ../src/vikgeoreflayer.c:853 +msgid "Load From File..." +msgstr "" + +#: ../src/vikgeoreflayer.c:858 +msgid "Corner pixel easting:" +msgstr "" + +#: ../src/vikgeoreflayer.c:860 +msgid "the UTM \"easting\" value of the upper-left corner pixel of the map" +msgstr "" + +#: ../src/vikgeoreflayer.c:862 +msgid "Corner pixel northing:" +msgstr "" + +#: ../src/vikgeoreflayer.c:864 +msgid "the UTM \"northing\" value of the upper-left corner pixel of the map" +msgstr "" + +#: ../src/vikgeoreflayer.c:866 +msgid "X (easting) scale (mpp): " +msgstr "" + +#: ../src/vikgeoreflayer.c:867 +msgid "Y (northing) scale (mpp): " +msgstr "" + +#: ../src/vikgeoreflayer.c:870 +msgid "the scale of the map in the X direction (meters per pixel)" +msgstr "" + +#: ../src/vikgeoreflayer.c:872 +msgid "the scale of the map in the Y direction (meters per pixel)" +msgstr "" + +#: ../src/vikgeoreflayer.c:874 +msgid "Map Image:" +msgstr "" + +#: ../src/vikgeoreflayer.c:919 +msgid "Upper left latitude:" +msgstr "" + +#: ../src/vikgeoreflayer.c:921 +msgid "Upper left longitude:" +msgstr "" + +#: ../src/vikgeoreflayer.c:923 +msgid "Lower right latitude:" +msgstr "" + +#: ../src/vikgeoreflayer.c:925 +msgid "Lower right longitude:" +msgstr "" + +#: ../src/vikgeoreflayer.c:937 +msgid "Calculate MPP values from coordinates" +msgstr "" + +#: ../src/vikgeoreflayer.c:938 +msgid "" +"Enter all corner coordinates before calculating the MPP values from the " +"image size" +msgstr "" + +#: ../src/vikgeoreflayer.c:948 +msgid "UTM" +msgstr "" + +#: ../src/vikgeoreflayer.c:949 +msgid "Latitude/Longitude" +msgstr "" + +#: ../src/vikgeoreflayer.c:957 ../src/vikmapniklayer.c:82 +#: ../src/vikmapslayer.c:158 +msgid "Alpha:" +msgstr "" + +#. Now with icons +#: ../src/vikgeoreflayer.c:1062 +msgid "_Zoom to Fit Map" +msgstr "" + +#: ../src/vikgeoreflayer.c:1068 +msgid "_Goto Map Center" +msgstr "" + +#: ../src/vikgeoreflayer.c:1074 +msgid "_Export to World File" +msgstr "" + +#: ../src/vikgoto.c:98 +msgid "No goto tool available." +msgstr "" + +#: ../src/vikgoto.c:295 +msgid "goto" +msgstr "" + +#: ../src/vikgoto.c:297 +msgid "goto provider:" +msgstr "" + +#: ../src/vikgoto.c:312 +msgid "Enter address or place name:" +msgstr "" + +#: ../src/vikgoto.c:487 +msgid "Locality" +msgstr "" + +#: ../src/vikgpslayer.c:137 +msgid "Data Mode" +msgstr "" + +#: ../src/vikgpslayer.c:139 +msgid "Realtime Tracking Mode" +msgstr "" + +#: ../src/vikgpslayer.c:176 +msgid "Keep vehicle at center" +msgstr "" + +#: ../src/vikgpslayer.c:177 +msgid "Keep vehicle on screen" +msgstr "" + +#: ../src/vikgpslayer.c:178 +msgid "Disable" +msgstr "" + +#: ../src/vikgpslayer.c:218 +msgid "Download Tracks:" +msgstr "" + +#: ../src/vikgpslayer.c:219 +msgid "Upload Tracks:" +msgstr "" + +#: ../src/vikgpslayer.c:220 +msgid "Download Routes:" +msgstr "" + +#: ../src/vikgpslayer.c:221 +msgid "Upload Routes:" +msgstr "" + +#: ../src/vikgpslayer.c:222 +msgid "Download Waypoints:" +msgstr "" + +#: ../src/vikgpslayer.c:223 +msgid "Upload Waypoints:" +msgstr "" + +#: ../src/vikgpslayer.c:225 +msgid "Recording tracks" +msgstr "" + +#: ../src/vikgpslayer.c:226 +msgid "Jump to current position on start" +msgstr "" + +#: ../src/vikgpslayer.c:227 +msgid "Moving Map Method:" +msgstr "" + +#: ../src/vikgpslayer.c:228 +msgid "Update Statusbar:" +msgstr "" + +#: ../src/vikgpslayer.c:228 +msgid "Display information in the statusbar on GPS updates" +msgstr "" + +#: ../src/vikgpslayer.c:229 +msgid "Auto Connect" +msgstr "" + +#: ../src/vikgpslayer.c:229 +msgid "Automatically connect to GPSD" +msgstr "" + +#: ../src/vikgpslayer.c:230 +msgid "Gpsd Host:" +msgstr "" + +#: ../src/vikgpslayer.c:231 +msgid "Gpsd Port:" +msgstr "" + +#: ../src/vikgpslayer.c:232 +msgid "Gpsd Retry Interval (seconds):" +msgstr "" + +#: ../src/vikgpslayer.c:254 +msgid "GPS" +msgstr "" + +#: ../src/vikgpslayer.c:320 ../src/vikgpslayer.c:1504 +msgid "GPS Download" +msgstr "" + +#: ../src/vikgpslayer.c:320 ../src/vikgpslayer.c:1504 ../src/viktrwlayer.c:3993 +msgid "GPS Upload" +msgstr "" + +#: ../src/vikgpslayer.c:322 +msgid "GPS Realtime Tracking" +msgstr "" + +#: ../src/vikgpslayer.c:458 +msgid "Connected" +msgstr "" + +#: ../src/vikgpslayer.c:460 +msgid "Disconnected" +msgstr "" + +#: ../src/vikgpslayer.c:554 +msgid "Unknown GPS Protocol" +msgstr "" + +#: ../src/vikgpslayer.c:572 +msgid "Unknown serial port device" +msgstr "" + +#: ../src/vikgpslayer.c:691 +#, c-format +msgid "%s: unknown parameter" +msgstr "" + +#. Now with icons +#: ../src/vikgpslayer.c:794 +msgid "_Upload to GPS" +msgstr "" + +#: ../src/vikgpslayer.c:800 +msgid "Download from _GPS" +msgstr "" + +#: ../src/vikgpslayer.c:821 +msgid "Empty _Realtime" +msgstr "" + +#: ../src/vikgpslayer.c:828 +msgid "E_mpty Upload" +msgstr "" + +#: ../src/vikgpslayer.c:834 +msgid "_Empty Download" +msgstr "" + +#: ../src/vikgpslayer.c:840 +msgid "Empty _All" +msgstr "" + +#: ../src/vikgpslayer.c:852 +#, c-format +msgid "Unexpected number of disconnected handlers: %d" +msgstr "" + +#: ../src/vikgpslayer.c:995 +#, c-format +msgid "Uploading %d waypoint..." +msgid_plural "Uploading %d waypoints..." +msgstr[0] "" +msgstr[1] "" + +#: ../src/vikgpslayer.c:1000 +#, c-format +msgid "Uploading %d trackpoint..." +msgid_plural "Uploading %d trackpoints..." +msgstr[0] "" +msgstr[1] "" + +#: ../src/vikgpslayer.c:1005 +#, c-format +msgid "Uploading %d routepoint..." +msgid_plural "Uploading %d routepoints..." +msgstr[0] "" +msgstr[1] "" + +#: ../src/vikgpslayer.c:1034 +#, c-format +msgid "Downloaded %d out of %d waypoint..." +msgid_plural "Downloaded %d out of %d waypoints..." +msgstr[0] "" +msgstr[1] "" + +#: ../src/vikgpslayer.c:1040 +#, c-format +msgid "Downloaded %d out of %d trackpoint..." +msgid_plural "Downloaded %d out of %d trackpoints..." +msgstr[0] "" +msgstr[1] "" + +#: ../src/vikgpslayer.c:1046 +#, c-format +msgid "Downloaded %d out of %d routepoint..." +msgid_plural "Downloaded %d out of %d routepoints..." +msgstr[0] "" +msgstr[1] "" + +#: ../src/vikgpslayer.c:1056 +#, c-format +msgid "Uploaded %d out of %d waypoint..." +msgid_plural "Uploaded %d out of %d waypoints..." +msgstr[0] "" +msgstr[1] "" + +#: ../src/vikgpslayer.c:1062 +#, c-format +msgid "Uploaded %d out of %d trackpoint..." +msgid_plural "Uploaded %d out of %d trackpoints..." +msgstr[0] "" +msgstr[1] "" + +#: ../src/vikgpslayer.c:1068 +#, c-format +msgid "Uploaded %d out of %d routepoint..." +msgid_plural "Uploaded %d out of %d routepoints..." +msgstr[0] "" +msgstr[1] "" + +#: ../src/vikgpslayer.c:1079 +#, c-format +msgid "Downloaded %d waypoint" +msgid_plural "Downloaded %d waypoints" +msgstr[0] "" +msgstr[1] "" + +#: ../src/vikgpslayer.c:1085 +#, c-format +msgid "Downloaded %d trackpoint" +msgid_plural "Downloaded %d trackpoints" +msgstr[0] "" +msgstr[1] "" + +#: ../src/vikgpslayer.c:1091 +#, c-format +msgid "Downloaded %d routepoint" +msgid_plural "Downloaded %d routepoints" +msgstr[0] "" +msgstr[1] "" + +#: ../src/vikgpslayer.c:1101 +#, c-format +msgid "Uploaded %d waypoint" +msgid_plural "Uploaded %d waypoints" +msgstr[0] "" +msgstr[1] "" + +#: ../src/vikgpslayer.c:1107 +#, c-format +msgid "Uploaded %d trackpoint" +msgid_plural "Uploaded %d trackpoints" +msgstr[0] "" +msgstr[1] "" + +#: ../src/vikgpslayer.c:1113 +#, c-format +msgid "Uploaded %d routepoint" +msgid_plural "Uploaded %d routepoints" +msgstr[0] "" +msgstr[1] "" + +#: ../src/vikgpslayer.c:1363 +msgid "Error: No result." +msgstr "" + +#: ../src/vikgpslayer.c:1471 +msgid "Warning - GPS Upload items may overwrite each other" +msgstr "" + +#: ../src/vikgpslayer.c:1506 +msgid "Status: detecting gpsbabel" +msgstr "Estat: Detectant gpsbabel" + +#: ../src/vikgpslayer.c:1533 +msgid "No GPS items selected for transfer." +msgstr "" + +#: ../src/vikgpslayer.c:1546 +msgid "Could not turn off device." +msgstr "" + +#: ../src/vikgpslayer.c:1589 +msgid "Are you sure you want to delete GPS Upload data?" +msgstr "" + +#: ../src/vikgpslayer.c:1602 +msgid "Are you sure you want to delete GPS Download data?" +msgstr "" + +#: ../src/vikgpslayer.c:1616 +msgid "Are you sure you want to delete GPS Realtime data?" +msgstr "" + +#: ../src/vikgpslayer.c:1630 +msgid "Are you sure you want to delete All GPS data?" +msgstr "" + +#: ../src/vikgpslayer.c:2004 +#, c-format +msgid "" +"Failed to connect to gpsd at %s (port %s)\n" +"Should Viking keep trying (every %d seconds)?" +msgstr "" + +#: ../src/viklayerspanel.c:73 +msgid "C_ut" +msgstr "" + +#: ../src/viklayerspanel.c:74 ../src/vikwindow.c:4882 +msgid "_Copy" +msgstr "" + +#: ../src/viklayerspanel.c:75 ../src/vikwindow.c:4883 +msgid "_Paste" +msgstr "" + +#: ../src/viklayerspanel.c:76 ../src/vikwindow.c:4884 +msgid "_Delete" +msgstr "" + +#: ../src/viklayerspanel.c:154 +msgid "New Layer" +msgstr "" + +#: ../src/viklayerspanel.c:347 +msgid "Top Layer" +msgstr "" + +#: ../src/viklayerspanel.c:363 +msgid "Add new layer" +msgstr "" + +#: ../src/viklayerspanel.c:370 ../src/vikwindow.c:4884 +msgid "Remove selected layer" +msgstr "" + +#: ../src/viklayerspanel.c:377 +msgid "Move selected layer up" +msgstr "" + +#: ../src/viklayerspanel.c:384 +msgid "Move selected layer down" +msgstr "" + +#: ../src/viklayerspanel.c:391 ../src/vikwindow.c:4881 +msgid "Cut selected layer" +msgstr "" + +#: ../src/viklayerspanel.c:398 ../src/vikwindow.c:4882 +msgid "Copy selected layer" +msgstr "" + +#: ../src/viklayerspanel.c:405 ../src/vikwindow.c:4883 +msgid "" +"Paste layer into selected container layer or otherwise above selected layer" +msgstr "" + +#: ../src/viklayerspanel.c:502 +msgid "New name can not be blank." +msgstr "" + +#: ../src/viklayerspanel.c:751 +msgid "Aggregate Layers have no settable properties." +msgstr "" + +#: ../src/viklayerspanel.c:798 +msgid "You cannot cut the Top Layer." +msgstr "" + +#: ../src/viklayerspanel.c:843 +#, c-format +msgid "Are you sure you want to delete %s?" +msgstr "" + +#: ../src/viklayerspanel.c:863 +msgid "You cannot delete the Top Layer." +msgstr "" + +#: ../src/vikmapniklayer.c:78 +msgid "CSS (MML) Config File:" +msgstr "" + +#: ../src/vikmapniklayer.c:79 +msgid "CartoCSS configuration file" +msgstr "" + +#: ../src/vikmapniklayer.c:80 +msgid "XML Config File:" +msgstr "" + +#: ../src/vikmapniklayer.c:81 +msgid "Mapnik XML configuration file" +msgstr "" + +#: ../src/vikmapniklayer.c:84 +msgid "Use File Cache:" +msgstr "" + +#: ../src/vikmapniklayer.c:86 +msgid "File Cache Directory:" +msgstr "" + +#: ../src/vikmapniklayer.c:122 +msgid "_Mapnik Features" +msgstr "" + +#: ../src/vikmapniklayer.c:122 +msgid "Mapnik Features" +msgstr "" + +#: ../src/vikmapniklayer.c:140 +msgid "Mapnik Rendering" +msgstr "" + +#. Changing these values only applies before first mapnik layer is 'created' +#: ../src/vikmapniklayer.c:258 +msgid "Plugins Directory:" +msgstr "" + +#: ../src/vikmapniklayer.c:258 ../src/vikmapniklayer.c:259 +#: ../src/vikmapniklayer.c:260 ../src/vikmapniklayer.c:261 +msgid "You need to restart Viking for a change to this value to be used" +msgstr "" + +#: ../src/vikmapniklayer.c:259 +msgid "Fonts Directory:" +msgstr "" + +#: ../src/vikmapniklayer.c:260 +msgid "Recurse Fonts Directory:" +msgstr "" + +#: ../src/vikmapniklayer.c:261 +msgid "Rerender Timeout (hours):" +msgstr "" + +#. Changeable any time +#: ../src/vikmapniklayer.c:263 +msgid "CartoCSS:" +msgstr "" + +#: ../src/vikmapniklayer.c:263 +msgid "The program to convert CartoCSS files into Mapnik XML" +msgstr "" + +#: ../src/vikmapniklayer.c:506 +msgid "Running" +msgstr "" + +#: ../src/vikmapniklayer.c:525 +#, c-format +msgid "" +"Error running carto command:\n" +"%s" +msgstr "" + +#: ../src/vikmapniklayer.c:561 +msgid " completed in " +msgstr "" + +#: ../src/vikmapniklayer.c:561 +msgid "seconds" +msgstr "" + +#: ../src/vikmapniklayer.c:611 ../src/vikmapniklayer.c:979 +#, c-format +msgid "" +"Mapnik error loading configuration file:\n" +"%s" +msgstr "" + +#: ../src/vikmapniklayer.c:749 +#, c-format +msgid "Mapnik Render %d:%d:%d %s" +msgstr "" + +#: ../src/vikmapniklayer.c:840 +msgid "Mapnik Rendering must be in Mercator mode" +msgstr "" + +#: ../src/vikmapniklayer.c:997 +msgid "Mapnik Information" +msgstr "" + +#: ../src/vikmapniklayer.c:1031 +msgid "_Flush Memory Cache" +msgstr "" + +#: ../src/vikmapniklayer.c:1044 +msgid "_Run Carto Command" +msgstr "" + +#: ../src/vikmapniklayer.c:1102 ../src/vikmapslayer.c:2029 +#, c-format +msgid "Tile File Timestamp: %s" +msgstr "" + +#: ../src/vikmapniklayer.c:1105 ../src/vikmapslayer.c:2032 +msgid "Tile File Timestamp: Not Available" +msgstr "" + +#: ../src/vikmapniklayer.c:1120 +#, c-format +msgid "Rendering time %.2f seconds" +msgstr "" + +#: ../src/vikmapniklayer.c:1124 ../src/vikmapslayer.c:2042 +msgid "Tile Information" +msgstr "" + +#: ../src/vikmapniklayer.c:1145 +msgid "_Rerender Tile" +msgstr "" + +#: ../src/vikmapniklayer.c:1150 +msgid "_Info" +msgstr "" + +#. ******* MAPZOOMS ******** +#: ../src/vikmapslayer.c:96 +msgid "Use Viking Zoom Level" +msgstr "" + +#: ../src/vikmapslayer.c:146 +msgid "OSM" +msgstr "" + +#. NB mode => id - But can't break file format just to rename something better +#: ../src/vikmapslayer.c:152 +msgid "Map Type:" +msgstr "" + +#: ../src/vikmapslayer.c:153 +msgid "Maps Directory:" +msgstr "" + +#: ../src/vikmapslayer.c:154 +msgid "Cache Layout:" +msgstr "" + +#: ../src/vikmapslayer.c:155 +msgid "This determines the tile storage layout on disk" +msgstr "" + +#: ../src/vikmapslayer.c:156 +msgid "Map File:" +msgstr "" + +#: ../src/vikmapslayer.c:157 +msgid "An MBTiles file. Only applies when the map type method is 'MBTiles'" +msgstr "" + +#: ../src/vikmapslayer.c:159 +msgid "Control the Alpha value for transparency effects" +msgstr "" + +#: ../src/vikmapslayer.c:160 +msgid "Autodownload maps:" +msgstr "" + +#: ../src/vikmapslayer.c:161 +msgid "Autodownload Only Gets Missing Maps:" +msgstr "" + +#: ../src/vikmapslayer.c:162 +msgid "" +"Using this option avoids attempting to update already acquired tiles. This " +"can be useful if you want to restrict the network usage, without having to " +"resort to manual control. Only applies when 'Autodownload Maps' is on." +msgstr "" + +#: ../src/vikmapslayer.c:163 +msgid "Zoom Level:" +msgstr "" + +#: ../src/vikmapslayer.c:164 +msgid "" +"Determines the method of displaying map tiles for the current zoom level. " +"'Viking Zoom Level' uses the best matching level, otherwise setting a fixed " +"value will always use map tiles of the specified value regardless of the " +"actual zoom level." +msgstr "" + +#: ../src/vikmapslayer.c:197 +msgid "_Maps Download" +msgstr "" + +#: ../src/vikmapslayer.c:197 +msgid "Maps Download" +msgstr "" + +#: ../src/vikmapslayer.c:213 ../src/vikutils.c:895 +msgid "Map" +msgstr "" + +#: ../src/vikmapslayer.c:306 +msgid "Default map layer directory:" +msgstr "" + +#: ../src/vikmapslayer.c:306 +msgid "Choose a directory to store cached Map tiles for this layer" +msgstr "" + +#: ../src/vikmapslayer.c:436 ../src/vikmapslayer.c:633 +msgid "Unknown map type" +msgstr "" + +#: ../src/vikmapslayer.c:664 +msgid "Unknown Map Zoom" +msgstr "" + +#: ../src/vikmapslayer.c:833 +#, c-format +msgid "Failed to open MBTiles file: %s" +msgstr "" + +#: ../src/vikmapslayer.c:856 +#, c-format +msgid "" +"New map cannot be displayed in the current drawmode.\n" +"Select \"%s\" from View menu to view it." +msgstr "" + +#: ../src/vikmapslayer.c:1314 +#, c-format +msgid "" +"Cowardly refusing to draw tiles or existence of tiles beyond %d zoom out " +"factor" +msgstr "" + +#. TODO: ?? count up the number of download errors somehow... +#: ../src/vikmapslayer.c:1667 +msgid "Failed to download tile" +msgstr "" + +#: ../src/vikmapslayer.c:1673 +msgid "Unable to save tile" +msgstr "" + +#: ../src/vikmapslayer.c:1799 +#, c-format +msgid "Redownloading up to %d %s map..." +msgid_plural "Redownloading up to %d %s maps..." +msgstr[0] "" +msgstr[1] "" + +#: ../src/vikmapslayer.c:1801 +#, c-format +msgid "Redownloading %d %s map..." +msgid_plural "Redownloading %d %s maps..." +msgstr[0] "" +msgstr[1] "" + +#: ../src/vikmapslayer.c:1805 ../src/vikmapslayer.c:1890 +#, c-format +msgid "Downloading %d %s map..." +msgid_plural "Downloading %d %s maps..." +msgstr[0] "" +msgstr[1] "" + +#: ../src/vikmapslayer.c:1969 +msgid "YES" +msgstr "" + +#: ../src/vikmapslayer.c:1973 ../src/vikmapslayer.c:1977 +msgid "NO" +msgstr "" + +#. NB Also handles .jpg automatically due to pixbuf_new_from () support - although just print png for now. +#: ../src/vikmapslayer.c:1980 +#, c-format +msgid "Source: %s (%d%s%d%s%d.%s %s)" +msgstr "" + +#: ../src/vikmapslayer.c:1983 +msgid "Source: Not available" +msgstr "" + +#: ../src/vikmapslayer.c:2000 +msgid "Source: file://" +msgstr "" + +#: ../src/vikmapslayer.c:2012 +#, c-format +msgid "Source: %s" +msgstr "" + +#: ../src/vikmapslayer.c:2038 +#, c-format +msgid "Tile File: %s [Not Available]" +msgstr "" + +#: ../src/vikmapslayer.c:2086 +msgid "Redownload _Bad Map(s)" +msgstr "" + +#: ../src/vikmapslayer.c:2090 +msgid "Redownload _New Map(s)" +msgstr "" + +#: ../src/vikmapslayer.c:2094 +msgid "Redownload _All Map(s)" +msgstr "" + +#: ../src/vikmapslayer.c:2099 +msgid "_Show Tile Information" +msgstr "" + +#: ../src/vikmapslayer.c:2166 +#, c-format +msgid "" +"Wrong drawmode for this map.\n" +"Select \"%s\" from View menu and try again." +msgstr "" + +#: ../src/vikmapslayer.c:2171 +msgid "Wrong zoom level for this map." +msgstr "" + +#: ../src/vikmapslayer.c:2334 +msgid "Zoom Start:" +msgstr "" + +#: ../src/vikmapslayer.c:2341 +msgid "Zoom End:" +msgstr "" + +#: ../src/vikmapslayer.c:2347 +msgid "Download Maps Method:" +msgstr "" + +#. redownload method - needs to align with REDOWNLOAD* macro values +#: ../src/vikmapslayer.c:2419 +msgid "Missing" +msgstr "" + +#: ../src/vikmapslayer.c:2419 +msgid "Bad" +msgstr "" + +#: ../src/vikmapslayer.c:2419 +msgid "New" +msgstr "" + +#: ../src/vikmapslayer.c:2419 +msgid "Reload All" +msgstr "" + +#: ../src/vikmapslayer.c:2421 +msgid "Download for Zoom Levels" +msgstr "" + +#: ../src/vikmapslayer.c:2461 +#, c-format +msgid "" +"You are not allowed to download more than %d tiles in one go (requested %d)" +msgstr "" + +#: ../src/vikmapslayer.c:2469 +#, c-format +msgid "Do you really want to download %d tiles?" +msgstr "" + +#. Now with icons +#: ../src/vikmapslayer.c:2509 +msgid "Download _Missing Onscreen Maps" +msgstr "" + +#: ../src/vikmapslayer.c:2516 +msgid "Download _New Onscreen Maps" +msgstr "" + +#: ../src/vikmapslayer.c:2523 +msgid "Reload _All Onscreen Maps" +msgstr "" + +#: ../src/vikmapslayer.c:2529 +msgid "Download Maps in _Zoom Levels..." +msgstr "" + +#: ../src/vikmapslayer.c:2539 +msgid "_Open MBTiles Files" +msgstr "" + +#: ../src/vikmapslayer.c:2554 +msgid "Flush Map Cache" +msgstr "" + +#: ../src/vikrouting.c:54 +msgid "Default engine:" +msgstr "" + +#: ../src/vikrouting.c:68 +msgid "Routing" +msgstr "" + +#: ../src/viktreeview.c:347 +msgid "Layer Name" +msgstr "" + +#: ../src/viktreeview.c:924 +#, c-format +msgid "delete data from %s\n" +msgstr "" + +#: ../src/viktrwlayer.c:427 +msgid "Create _Waypoint" +msgstr "" + +#: ../src/viktrwlayer.c:427 +msgid "Create Waypoint" +msgstr "" + +#: ../src/viktrwlayer.c:437 +#, fuzzy +msgid "Edit _Track" +msgstr "Afegir \"Track\"" + +#: ../src/viktrwlayer.c:437 +#, fuzzy +msgid "Edit Track" +msgstr "Afegir \"Track\"" + +#: ../src/viktrwlayer.c:449 +msgid "Edit _Route" +msgstr "" + +#: ../src/viktrwlayer.c:449 +msgid "Edit Route" +msgstr "" + +#: ../src/viktrwlayer.c:460 +msgid "Route _Finder" +msgstr "" + +#: ../src/viktrwlayer.c:460 +msgid "Route Finder" +msgstr "" + +#: ../src/viktrwlayer.c:471 +msgid "Splitter" +msgstr "" + +#: ../src/viktrwlayer.c:482 +msgid "_Edit Waypoint" +msgstr "" + +#: ../src/viktrwlayer.c:482 +msgid "Edit Waypoint" +msgstr "" + +#: ../src/viktrwlayer.c:495 +msgid "Edit Trac_kpoint" +msgstr "" + +#: ../src/viktrwlayer.c:495 +msgid "Edit Trackpoint" +msgstr "" + +#. a pixbuf for this one is already made globally available +#: ../src/viktrwlayer.c:508 +msgid "Show P_icture" +msgstr "" + +#: ../src/viktrwlayer.c:508 +msgid "Show Picture" +msgstr "" + +#: ../src/viktrwlayer.c:531 +msgid "Waypoint Images" +msgstr "" + +#: ../src/viktrwlayer.c:531 +msgid "Tracks Advanced" +msgstr "" + +#: ../src/viktrwlayer.c:531 +msgid "Metadata" +msgstr "" + +#: ../src/viktrwlayer.c:531 +msgid "Filesystem" +msgstr "" + +#: ../src/viktrwlayer.c:534 +msgid "Draw by Track" +msgstr "" + +#: ../src/viktrwlayer.c:534 +msgid "Draw by Speed" +msgstr "" + +#: ../src/viktrwlayer.c:534 +msgid "All Tracks Same Color" +msgstr "" + +#: ../src/viktrwlayer.c:535 +msgid "Filled Square" +msgstr "" + +#: ../src/viktrwlayer.c:535 +msgid "Square" +msgstr "" + +#: ../src/viktrwlayer.c:535 +msgid "Circle" +msgstr "" + +#: ../src/viktrwlayer.c:535 +msgid "X" +msgstr "" + +#: ../src/viktrwlayer.c:561 +msgid "Extra Extra Small" +msgstr "" + +#: ../src/viktrwlayer.c:562 +msgid "Extra Small" +msgstr "" + +#: ../src/viktrwlayer.c:566 +msgid "Extra Large" +msgstr "" + +#: ../src/viktrwlayer.c:567 +msgid "Extra Extra Large" +msgstr "" + +#: ../src/viktrwlayer.c:573 +msgid "Name Ascending" +msgstr "" + +#: ../src/viktrwlayer.c:574 +msgid "Name Descending" +msgstr "" + +#: ../src/viktrwlayer.c:582 ../src/viktrwlayer_propwin.c:3319 +msgid "No" +msgstr "" + +#: ../src/viktrwlayer.c:583 +msgid "Yes" +msgstr "" + +#: ../src/viktrwlayer.c:584 +msgid "No write" +msgstr "" + +#: ../src/viktrwlayer.c:649 ../src/viktrwlayer.c:673 +msgid "Draw Labels" +msgstr "" + +#: ../src/viktrwlayer.c:650 +msgid "Note: the individual track controls what labels may be displayed" +msgstr "" + +#: ../src/viktrwlayer.c:651 +msgid "Track Labels Font Size:" +msgstr "" + +#: ../src/viktrwlayer.c:652 +msgid "Track Drawing Mode:" +msgstr "" + +#: ../src/viktrwlayer.c:653 +msgid "All Tracks Color:" +msgstr "" + +#: ../src/viktrwlayer.c:654 +msgid "The color used when 'All Tracks Same Color' drawing mode is selected" +msgstr "" + +#: ../src/viktrwlayer.c:655 +msgid "Draw Track Lines" +msgstr "" + +#: ../src/viktrwlayer.c:656 +msgid "Track Thickness:" +msgstr "" + +#: ../src/viktrwlayer.c:657 +msgid "Draw Track Direction" +msgstr "" + +#: ../src/viktrwlayer.c:658 +msgid "Direction Size:" +msgstr "" + +#: ../src/viktrwlayer.c:659 +msgid "Draw Trackpoints" +msgstr "" + +#: ../src/viktrwlayer.c:660 +msgid "Trackpoint Size:" +msgstr "" + +#: ../src/viktrwlayer.c:661 +msgid "Draw Elevation" +msgstr "" + +#: ../src/viktrwlayer.c:662 +msgid "Draw Elevation Height %:" +msgstr "" + +#: ../src/viktrwlayer.c:663 +msgid "Draw Stops" +msgstr "" + +#: ../src/viktrwlayer.c:664 +msgid "" +"Whether to draw a marker when trackpoints are at the same position but over " +"the minimum stop length apart in time" +msgstr "" + +#: ../src/viktrwlayer.c:665 +msgid "Min Stop Length (seconds):" +msgstr "" + +#: ../src/viktrwlayer.c:667 +msgid "Track BG Thickness:" +msgstr "" + +#: ../src/viktrwlayer.c:668 +msgid "Track Background Color" +msgstr "" + +#: ../src/viktrwlayer.c:669 +msgid "Draw by Speed Factor (%):" +msgstr "" + +#: ../src/viktrwlayer.c:670 +msgid "" +"The percentage factor away from the average speed determining the color used" +msgstr "" + +#: ../src/viktrwlayer.c:671 +msgid "Track Sort Order:" +msgstr "" + +#: ../src/viktrwlayer.c:674 +msgid "Waypoint Font Size:" +msgstr "" + +#: ../src/viktrwlayer.c:675 +msgid "Waypoint Color:" +msgstr "" + +#: ../src/viktrwlayer.c:676 +msgid "Waypoint Text:" +msgstr "" + +#: ../src/viktrwlayer.c:677 +msgid "Background:" +msgstr "" + +#: ../src/viktrwlayer.c:678 +msgid "Fake BG Color Translucency:" +msgstr "" + +#: ../src/viktrwlayer.c:679 +msgid "Waypoint marker:" +msgstr "" + +#: ../src/viktrwlayer.c:680 +msgid "Waypoint size:" +msgstr "" + +#: ../src/viktrwlayer.c:681 +msgid "Draw Waypoint Symbols:" +msgstr "" + +#: ../src/viktrwlayer.c:682 +msgid "Waypoint Sort Order:" +msgstr "" + +#: ../src/viktrwlayer.c:684 +msgid "Draw Waypoint Images" +msgstr "" + +#: ../src/viktrwlayer.c:685 +msgid "Image Size (pixels):" +msgstr "" + +#: ../src/viktrwlayer.c:686 +msgid "Image Alpha:" +msgstr "" + +#: ../src/viktrwlayer.c:687 +msgid "Image Memory Cache Size:" +msgstr "" + +#: ../src/viktrwlayer.c:690 +msgid "Author" +msgstr "" + +#: ../src/viktrwlayer.c:691 +msgid "Creation Time" +msgstr "" + +#: ../src/viktrwlayer.c:692 +msgid "Keywords" +msgstr "" + +#: ../src/viktrwlayer.c:693 +msgid "External layer:" +msgstr "" + +#: ../src/viktrwlayer.c:693 +msgid "" +"Layer data stored in the Viking file, in an external file, or in an external " +"file but changes are not written to the file (file only loaded at startup)" +msgstr "" + +#: ../src/viktrwlayer.c:694 +msgid "Save layer as:" +msgstr "" + +#: ../src/viktrwlayer.c:694 +msgid "Specify where layer should be saved. Overwrites file if it exists." +msgstr "" + +#: ../src/viktrwlayer.c:798 +msgid "TrackWaypoint" +msgstr "" + +#: ../src/viktrwlayer.c:1999 ../src/viktrwlayer_propwin.c:1469 +#: ../src/viktrwlayer_propwin.c:1471 ../src/vikutils.c:299 +#: ../src/vikutils.c:326 +msgid "miles" +msgstr "" + +#: ../src/viktrwlayer.c:2002 ../src/viktrwlayer_propwin.c:1475 +#: ../src/viktrwlayer_propwin.c:1477 ../src/vikutils.c:303 +#: ../src/vikutils.c:330 +msgid "NM" +msgstr "" + +#. VIK_UNITS_DISTANCE_KILOMETRES: +#: ../src/viktrwlayer.c:2006 ../src/viktrwlayer_propwin.c:1482 +#: ../src/viktrwlayer_propwin.c:1484 ../src/vikutils.c:308 +#: ../src/vikutils.c:335 +msgid "km" +msgstr "" + +#: ../src/viktrwlayer.c:2121 +msgid "start/end" +msgstr "" + +#: ../src/viktrwlayer.c:2133 +msgid "start" +msgstr "" + +#: ../src/viktrwlayer.c:2142 +msgid "end" +msgstr "" + +#: ../src/viktrwlayer.c:3103 +#, c-format +msgid " in %d:%02d hrs:mins" +msgstr "" + +#: ../src/viktrwlayer.c:3107 +#, c-format +msgid "" +"\n" +"%sTotal Length %.1f %s%s" +msgstr "" + +#: ../src/viktrwlayer.c:3131 +#, c-format +msgid "" +"\n" +"Total route length %.1f %s" +msgstr "" + +#: ../src/viktrwlayer.c:3136 +#, c-format +msgid "Tracks: %d - Waypoints: %d - Routes: %d%s%s" +msgstr "" + +#: ../src/viktrwlayer.c:3155 +#, c-format +msgid "Tracks: %d" +msgstr "" + +#: ../src/viktrwlayer.c:3165 +#, c-format +msgid "Routes: %d" +msgstr "" + +#: ../src/viktrwlayer.c:3195 +#, c-format +msgid "- %d:%02d hrs:mins" +msgstr "" + +#: ../src/viktrwlayer.c:3202 +#, c-format +msgid "%s%.1f km %s" +msgstr "" + +#: ../src/viktrwlayer.c:3205 +#, c-format +msgid "%s%.1f miles %s" +msgstr "" + +#: ../src/viktrwlayer.c:3208 +#, c-format +msgid "%s%.1f NM %s" +msgstr "" + +#: ../src/viktrwlayer.c:3222 +#, c-format +msgid "Waypoints: %d" +msgstr "" + +#: ../src/viktrwlayer.c:3279 +#, c-format +msgid "Wpt: Alt %dft" +msgstr "" + +#. VIK_UNITS_HEIGHT_METRES: +#: ../src/viktrwlayer.c:3283 +#, c-format +msgid "Wpt: Alt %dm" +msgstr "" + +#. Add comment if available +#: ../src/viktrwlayer.c:3298 +#, c-format +msgid "%s | %s %s | Comment: %s" +msgstr "" + +#: ../src/viktrwlayer.c:3300 +#, c-format +msgid "%s | %s %s" +msgstr "" + +#: ../src/viktrwlayer.c:3562 ../src/viktrwlayer.c:3591 +msgid "This layer has no waypoints or trackpoints." +msgstr "" + +#: ../src/viktrwlayer.c:3598 ../src/viktrwlayer.c:3607 +#: ../src/viktrwlayer.c:3616 ../src/viktrwlayer.c:3625 +#: ../src/viktrwlayer.c:3634 ../src/viktrwlayer.c:3642 +msgid "Export Layer" +msgstr "" + +#: ../src/viktrwlayer.c:3671 +msgid "Export Route as GPX" +msgstr "" + +#: ../src/viktrwlayer.c:3673 +msgid "Export Track as GPX" +msgstr "" + +#: ../src/viktrwlayer.c:3693 +msgid "Find" +msgstr "" + +#: ../src/viktrwlayer.c:3703 +msgid "Waypoint Name:" +msgstr "" + +#: ../src/viktrwlayer.c:3720 +msgid "Waypoint not found in this layer." +msgstr "" + +#: ../src/viktrwlayer.c:3989 +msgid "Can not upload invisible track." +msgstr "" + +#: ../src/viktrwlayer.c:4082 ../src/viktrwlayer.c:10512 +msgid "Track" +msgstr "" + +#: ../src/viktrwlayer.c:4107 ../src/viktrwlayer.c:10599 +msgid "Route" +msgstr "" + +#: ../src/viktrwlayer.c:4194 +msgid "Externa_l" +msgstr "" + +#: ../src/viktrwlayer.c:4216 ../src/viktrwlayer.c:8456 +#: ../src/viktrwlayer.c:8574 +msgid "_Finish Route" +msgstr "" + +#: ../src/viktrwlayer.c:4218 ../src/viktrwlayer.c:8380 +#: ../src/viktrwlayer.c:8572 +msgid "_Finish Track" +msgstr "" + +#. Now with icons +#: ../src/viktrwlayer.c:4230 +msgid "_View Layer" +msgstr "" + +#: ../src/viktrwlayer.c:4237 +msgid "V_iew" +msgstr "" + +#: ../src/viktrwlayer.c:4243 +msgid "View All _Tracks" +msgstr "" + +#: ../src/viktrwlayer.c:4248 +msgid "View All _Routes" +msgstr "" + +#: ../src/viktrwlayer.c:4253 +msgid "View All _Waypoints" +msgstr "" + +#: ../src/viktrwlayer.c:4258 +msgid "_Goto Center of Layer" +msgstr "" + +#: ../src/viktrwlayer.c:4264 ../src/viktrwlayer.c:8321 +msgid "Goto _Waypoint..." +msgstr "" + +#: ../src/viktrwlayer.c:4270 +msgid "_Export Layer" +msgstr "" + +#: ../src/viktrwlayer.c:4276 +msgid "Export as GPS_Point..." +msgstr "" + +#: ../src/viktrwlayer.c:4281 +msgid "Export as GPS_Mapper..." +msgstr "" + +#: ../src/viktrwlayer.c:4286 +msgid "Export as _GPX..." +msgstr "" + +#: ../src/viktrwlayer.c:4292 +msgid "Export as _KML..." +msgstr "" + +#: ../src/viktrwlayer.c:4299 +msgid "Export as GEO_JSON..." +msgstr "" + +#: ../src/viktrwlayer.c:4306 +msgid "Export via GPSbabel..." +msgstr "" + +#: ../src/viktrwlayer.c:4312 +#, c-format +msgid "Open with External Program_1: %s" +msgstr "" + +#: ../src/viktrwlayer.c:4319 +#, c-format +msgid "Open with External Program_2: %s" +msgstr "" + +#: ../src/viktrwlayer.c:4327 ../src/vikwindow.c:4825 +msgid "_New" +msgstr "" + +#: ../src/viktrwlayer.c:4333 +msgid "New _Waypoint..." +msgstr "" + +#: ../src/viktrwlayer.c:4339 +msgid "New _Track" +msgstr "" + +#: ../src/viktrwlayer.c:4347 +msgid "New _Route" +msgstr "" + +#: ../src/viktrwlayer.c:4356 ../src/viktrwlayer.c:8232 +#: ../src/viktrwlayer.c:9003 +msgid "Geotag _Images..." +msgstr "" + +#: ../src/viktrwlayer.c:4363 +msgid "_Acquire" +msgstr "" + +#: ../src/viktrwlayer.c:4369 ../src/vikwindow.c:4904 +msgid "From _GPS..." +msgstr "" + +#. FIXME: only add menu when at least a routing engine has support for Directions +#: ../src/viktrwlayer.c:4375 +msgid "From _Directions..." +msgstr "" + +#: ../src/viktrwlayer.c:4381 +msgid "From _OSM Traces..." +msgstr "" + +#: ../src/viktrwlayer.c:4386 +msgid "From _My OSM Traces..." +msgstr "" + +#: ../src/viktrwlayer.c:4392 ../src/vikwindow.c:4844 +msgid "From _URL..." +msgstr "" + +#: ../src/viktrwlayer.c:4399 ../src/vikwindow.c:4846 +msgid "From _Wikipedia Waypoints" +msgstr "" + +#: ../src/viktrwlayer.c:4405 +msgid "Within _Layer Bounds" +msgstr "" + +#: ../src/viktrwlayer.c:4411 +msgid "Within _Current View" +msgstr "" + +#: ../src/viktrwlayer.c:4419 +msgid "From Geo_caching..." +msgstr "" + +#: ../src/viktrwlayer.c:4426 ../src/vikwindow.c:4842 +msgid "From Geotagged _Images..." +msgstr "" + +#: ../src/viktrwlayer.c:4433 +msgid "From _File..." +msgstr "" + +#: ../src/viktrwlayer.c:4436 ../src/vikwindow.c:4905 +msgid "Import File With GPS_Babel..." +msgstr "" + +#: ../src/viktrwlayer.c:4443 ../src/viktrwlayer.c:8905 +msgid "_Upload" +msgstr "" + +#: ../src/viktrwlayer.c:4449 +msgid "Upload to _GPS..." +msgstr "" + +#: ../src/viktrwlayer.c:4456 ../src/viktrwlayer.c:8973 +msgid "Upload to _OSM..." +msgstr "" + +#: ../src/viktrwlayer.c:4464 +msgid "De_lete" +msgstr "" + +#: ../src/viktrwlayer.c:4470 +msgid "Delete All _Tracks" +msgstr "" + +#: ../src/viktrwlayer.c:4477 +msgid "Delete Tracks _From Selection..." +msgstr "" + +#: ../src/viktrwlayer.c:4484 ../src/viktrwlayer.c:8481 +msgid "Delete _All Routes" +msgstr "" + +#: ../src/viktrwlayer.c:4491 ../src/viktrwlayer.c:8487 +msgid "_Delete Routes From Selection..." +msgstr "" + +#: ../src/viktrwlayer.c:4498 +msgid "Delete All _Waypoints" +msgstr "" + +#: ../src/viktrwlayer.c:4505 +msgid "Delete Waypoints From _Selection..." +msgstr "" + +#: ../src/viktrwlayer.c:4512 ../src/viktrwlayer.c:8339 +msgid "Delete Duplicate Waypoints" +msgstr "" + +#: ../src/viktrwlayer.c:5198 +#, c-format +msgid "Are you sure you want to delete all tracks in %s?" +msgstr "" + +#: ../src/viktrwlayer.c:5211 +#, c-format +msgid "Are you sure you want to delete all routes in %s?" +msgstr "" + +#: ../src/viktrwlayer.c:5221 +#, c-format +msgid "Are you sure you want to delete all waypoints in %s?" +msgstr "" + +#: ../src/viktrwlayer.c:5238 +#, c-format +msgid "Are you sure you want to delete the waypoint \"%s\"?" +msgstr "" + +#: ../src/viktrwlayer.c:5254 +#, c-format +msgid "Are you sure you want to delete the track \"%s\"?" +msgstr "" + +#: ../src/viktrwlayer.c:5271 +#, c-format +msgid "Are you sure you want to delete the route \"%s\"?" +msgstr "" + +#: ../src/viktrwlayer.c:5527 ../src/viktrwlayer.c:6373 +msgid "" +"Converting a track to a route removes extra track data such as segments, " +"timestamps, etc...\n" +"Do you want to continue?" +msgstr "" + +#: ../src/viktrwlayer.c:5631 +msgid "No DEM layers available, thus no DEM values can be applied." +msgstr "" + +#: ../src/viktrwlayer.c:5651 ../src/viktrwlayer.c:5692 +#, c-format +msgid "%ld point adjusted" +msgid_plural "%ld points adjusted" +msgstr[0] "" +msgstr[1] "" + +#: ../src/viktrwlayer.c:5736 +#, c-format +msgid "%ld waypoint changed" +msgid_plural "%ld waypoints changed" +msgstr[0] "" +msgstr[1] "" + +#: ../src/viktrwlayer.c:5917 +#, c-format +msgid "" +"Refining a track with many points (%d) is unlikely to yield sensible " +"results. Do you want to Continue?" +msgstr "" + +#. Select engine from dialog +#: ../src/viktrwlayer.c:5925 +msgid "Refine Route with Routing Engine..." +msgstr "" + +#: ../src/viktrwlayer.c:5933 +msgid "Select routing engine" +msgstr "" + +#: ../src/viktrwlayer.c:6158 +msgid "Failed. No other tracks with timestamps in this layer found" +msgstr "" + +#: ../src/viktrwlayer.c:6160 +msgid "Failed. No other tracks without timestamps in this layer found" +msgstr "" + +#: ../src/viktrwlayer.c:6179 +msgid "Merge with..." +msgstr "" + +#: ../src/viktrwlayer.c:6180 +msgid "Select route to merge with" +msgstr "" + +#: ../src/viktrwlayer.c:6180 +msgid "Select track to merge with" +msgstr "" + +#: ../src/viktrwlayer.c:6264 ../src/viktrwlayer.c:6346 +msgid "Append Route" +msgstr "" + +#: ../src/viktrwlayer.c:6264 ../src/viktrwlayer.c:6346 +msgid "Append Track" +msgstr "" + +#: ../src/viktrwlayer.c:6265 +msgid "Select the route to append after the current route" +msgstr "" + +#: ../src/viktrwlayer.c:6266 +msgid "Select the track to append after the current track" +msgstr "" + +#: ../src/viktrwlayer.c:6347 +msgid "Select the track to append after the current route" +msgstr "" + +#: ../src/viktrwlayer.c:6348 +msgid "Select the route to append after the current track" +msgstr "" + +#: ../src/viktrwlayer.c:6414 +#, c-format +msgid "%d segment merged" +msgid_plural "%d segments merged" +msgstr[0] "" +msgstr[1] "" + +#: ../src/viktrwlayer.c:6430 +msgid "Failed. This track does not have timestamp" +msgstr "" + +#: ../src/viktrwlayer.c:6442 +msgid "Failed. No other track in this layer has timestamp" +msgstr "" + +#: ../src/viktrwlayer.c:6449 +msgid "Merge Threshold..." +msgstr "" + +#: ../src/viktrwlayer.c:6450 +msgid "Merge when time between tracks less than:" +msgstr "" + +#: ../src/viktrwlayer.c:6580 +msgid "Split Threshold..." +msgstr "" + +#: ../src/viktrwlayer.c:6581 +msgid "Split when time between trackpoints exceeds:" +msgstr "" + +#: ../src/viktrwlayer.c:6598 +#, c-format +msgid "" +"Can not split track due to trackpoints not ordered in time - such as at %s.\n" +"\n" +"Goto this trackpoint?" +msgstr "" + +#: ../src/viktrwlayer.c:6668 +msgid "Split Every Nth Point" +msgstr "" + +#: ../src/viktrwlayer.c:6669 +msgid "Split on every Nth point:" +msgstr "" + +#: ../src/viktrwlayer.c:6779 +msgid "Can not split track as it has no segments" +msgstr "" + +#: ../src/viktrwlayer.c:6861 ../src/viktrwlayer.c:6891 +#, c-format +msgid "Deleted %ld point" +msgid_plural "Deleted %ld points" +msgstr[0] "" +msgstr[1] "" + +#: ../src/viktrwlayer.c:6966 ../src/viktrwlayer.c:10989 +#: ../src/viktrwlayer_waypointlist.c:214 +#, c-format +msgid "Could not launch %s to open file." +msgstr "" + +#: ../src/viktrwlayer.c:6992 ../src/viktrwlayer.c:7113 +msgid "This track has no date information." +msgstr "" + +#: ../src/viktrwlayer.c:7006 ../src/viktrwlayer.c:7136 +msgid "This waypoint has no date information." +msgstr "" + +#: ../src/viktrwlayer.c:7030 +#, c-format +msgid "Could not launch %s" +msgstr "" + +#: ../src/viktrwlayer.c:7269 +msgid "Internal Error in vik_trw_layer_uniquify_tracks" +msgstr "" + +#: ../src/viktrwlayer.c:7374 ../src/viktrwlayer.c:7424 +#: ../src/viktrwlayer.c:7587 +msgid "" +"Multiple entries with the same name exist. This method only works with " +"unique names. Force unique names now?" +msgstr "" + +#: ../src/viktrwlayer.c:7385 +msgid "No tracks found" +msgstr "" + +#: ../src/viktrwlayer.c:7393 ../src/viktrwlayer.c:7443 +#: ../src/viktrwlayer.c:7607 +msgid "Delete Selection" +msgstr "" + +#: ../src/viktrwlayer.c:7394 +msgid "Select tracks to delete" +msgstr "" + +#: ../src/viktrwlayer.c:7435 +msgid "No routes found" +msgstr "" + +#: ../src/viktrwlayer.c:7444 +msgid "Select routes to delete" +msgstr "" + +#: ../src/viktrwlayer.c:7550 +msgid "Internal Error in vik_trw_layer_uniquify_waypoints" +msgstr "" + +#: ../src/viktrwlayer.c:7597 +msgid "No waypoints found" +msgstr "" + +#: ../src/viktrwlayer.c:7608 +msgid "Select waypoints to delete" +msgstr "" + +#: ../src/viktrwlayer.c:7691 +#, c-format +msgid "%ld waypoint deleted" +msgid_plural "%ld waypoints deleted" +msgstr[0] "" +msgstr[1] "" + +#: ../src/viktrwlayer.c:7697 +msgid "No duplicates found" +msgstr "" + +#: ../src/viktrwlayer.c:8028 +#, c-format +msgid "" +"A waypoint with the name \"%s\" already exists. Really rename to the same " +"name?" +msgstr "" + +#: ../src/viktrwlayer.c:8058 +#, c-format +msgid "" +"A track with the name \"%s\" already exists. Really rename to the same name?" +msgstr "" + +#: ../src/viktrwlayer.c:8095 +#, c-format +msgid "" +"A route with the name \"%s\" already exists. Really rename to the same name?" +msgstr "" + +#: ../src/viktrwlayer.c:8215 ../src/viktrwlayer.c:8602 +msgid "_Goto" +msgstr "" + +#: ../src/viktrwlayer.c:8226 +msgid "_Visit Geocache Webpage" +msgstr "" + +#: ../src/viktrwlayer.c:8235 +msgid "Geotag multiple images against this waypoint" +msgstr "" + +#: ../src/viktrwlayer.c:8245 ../src/viktrwlayer_waypointlist.c:352 +msgid "_Show Picture..." +msgstr "" + +#: ../src/viktrwlayer.c:8253 +msgid "Update Geotag on _Image" +msgstr "" + +#: ../src/viktrwlayer.c:8259 +msgid "_Update" +msgstr "" + +#: ../src/viktrwlayer.c:8264 +msgid "Update and _Keep File Timestamp" +msgstr "" + +#: ../src/viktrwlayer.c:8276 +msgid "Visit _Webpage" +msgstr "" + +#: ../src/viktrwlayer.c:8306 +msgid "_New Waypoint..." +msgstr "" + +#: ../src/viktrwlayer.c:8315 +msgid "_View All Waypoints" +msgstr "" + +#: ../src/viktrwlayer.c:8327 +msgid "Delete _All Waypoints" +msgstr "" + +#: ../src/viktrwlayer.c:8333 +msgid "_Delete Waypoints From Selection..." +msgstr "" + +#: ../src/viktrwlayer.c:8351 +msgid "_Show All Waypoints" +msgstr "" + +#: ../src/viktrwlayer.c:8357 +msgid "_Hide All Waypoints" +msgstr "" + +#: ../src/viktrwlayer.c:8369 +msgid "_List Waypoints..." +msgstr "" + +#: ../src/viktrwlayer.c:8390 +msgid "_View All Tracks" +msgstr "" + +#: ../src/viktrwlayer.c:8396 +msgid "_New Track" +msgstr "" + +#: ../src/viktrwlayer.c:8404 +msgid "Delete _All Tracks" +msgstr "" + +#: ../src/viktrwlayer.c:8410 +msgid "_Delete Tracks From Selection..." +msgstr "" + +#: ../src/viktrwlayer.c:8422 +msgid "_Show All Tracks" +msgstr "" + +#: ../src/viktrwlayer.c:8428 +msgid "_Hide All Tracks" +msgstr "" + +#: ../src/viktrwlayer.c:8439 +msgid "_List Tracks..." +msgstr "" + +#: ../src/viktrwlayer.c:8467 +msgid "_View All Routes" +msgstr "" + +#: ../src/viktrwlayer.c:8473 +msgid "_New Route" +msgstr "" + +#: ../src/viktrwlayer.c:8499 +msgid "_Show All Routes" +msgstr "" + +#: ../src/viktrwlayer.c:8505 +msgid "_Hide All Routes" +msgstr "" + +#: ../src/viktrwlayer.c:8516 +msgid "_List Routes..." +msgstr "" + +#: ../src/viktrwlayer.c:8587 +msgid "_View Track" +msgstr "" + +#: ../src/viktrwlayer.c:8589 +msgid "_View Route" +msgstr "" + +#: ../src/viktrwlayer.c:8608 +msgid "_Startpoint" +msgstr "" + +#: ../src/viktrwlayer.c:8614 +msgid "\"_Center\"" +msgstr "" + +#: ../src/viktrwlayer.c:8620 +msgid "_Endpoint" +msgstr "" + +#: ../src/viktrwlayer.c:8626 +msgid "_Highest Altitude" +msgstr "" + +#: ../src/viktrwlayer.c:8632 +msgid "_Lowest Altitude" +msgstr "" + +#: ../src/viktrwlayer.c:8640 +msgid "_Maximum Speed" +msgstr "" + +#: ../src/viktrwlayer.c:8646 +msgid "_Date" +msgstr "" + +#: ../src/viktrwlayer.c:8655 +msgid "Co_mbine" +msgstr "" + +#: ../src/viktrwlayer.c:8663 +msgid "_Merge By Time..." +msgstr "" + +#: ../src/viktrwlayer.c:8668 +msgid "Merge _Segments" +msgstr "" + +#: ../src/viktrwlayer.c:8675 +msgid "Merge _With Other Tracks..." +msgstr "" + +#: ../src/viktrwlayer.c:8682 +msgid "_Append Track..." +msgstr "" + +#: ../src/viktrwlayer.c:8684 +msgid "_Append Route..." +msgstr "" + +#: ../src/viktrwlayer.c:8690 +msgid "Append _Route..." +msgstr "" + +#: ../src/viktrwlayer.c:8692 +msgid "Append _Track..." +msgstr "" + +#: ../src/viktrwlayer.c:8699 +msgid "_Split" +msgstr "" + +#: ../src/viktrwlayer.c:8707 +msgid "_Split By Time..." +msgstr "" + +#. ATM always enable this entry - don't want to have to analyse the track before displaying the menu - to keep the menu speedy +#: ../src/viktrwlayer.c:8713 +msgid "Split Se_gments" +msgstr "" + +#: ../src/viktrwlayer.c:8719 +msgid "Split By _Number of Points..." +msgstr "" + +#: ../src/viktrwlayer.c:8724 +msgid "Split at _Trackpoint" +msgstr "" + +#: ../src/viktrwlayer.c:8732 +msgid "_Insert Points" +msgstr "" + +#: ../src/viktrwlayer.c:8738 +msgid "Insert Point _Before Selected Point" +msgstr "" + +#: ../src/viktrwlayer.c:8745 +msgid "Insert Point _After Selected Point" +msgstr "" + +#: ../src/viktrwlayer.c:8754 +msgid "Delete Poi_nts" +msgstr "" + +#: ../src/viktrwlayer.c:8760 +msgid "Delete _Selected Point" +msgstr "" + +#: ../src/viktrwlayer.c:8768 +msgid "Delete Points With The Same _Position" +msgstr "" + +#: ../src/viktrwlayer.c:8773 +msgid "Delete Points With The Same _Time" +msgstr "" + +#: ../src/viktrwlayer.c:8780 ../src/viktrwlayer.c:9029 +msgid "_Transform" +msgstr "" + +#: ../src/viktrwlayer.c:8788 ../src/viktrwlayer.c:9037 +msgid "_Apply DEM Data" +msgstr "" + +#: ../src/viktrwlayer.c:8793 ../src/viktrwlayer.c:9042 +msgid "_Overwrite" +msgstr "" + +#: ../src/viktrwlayer.c:8796 ../src/viktrwlayer.c:9045 +msgid "Overwrite any existing elevation values with DEM values" +msgstr "" + +#: ../src/viktrwlayer.c:8799 ../src/viktrwlayer.c:9048 +msgid "_Keep Existing" +msgstr "" + +#: ../src/viktrwlayer.c:8802 ../src/viktrwlayer.c:9051 +msgid "Keep existing elevation values, only attempt for missing values" +msgstr "" + +#: ../src/viktrwlayer.c:8807 +msgid "_Smooth Missing Elevation Data" +msgstr "" + +#: ../src/viktrwlayer.c:8812 +msgid "_Interpolated" +msgstr "" + +#: ../src/viktrwlayer.c:8815 +msgid "" +"Interpolate between known elevation values to derive values for the missing " +"elevations" +msgstr "" + +#: ../src/viktrwlayer.c:8818 +msgid "_Flat" +msgstr "" + +#: ../src/viktrwlayer.c:8821 +msgid "Set unknown elevation values to the last known value" +msgstr "" + +#: ../src/viktrwlayer.c:8825 +msgid "C_onvert to a Route" +msgstr "" + +#: ../src/viktrwlayer.c:8827 +msgid "C_onvert to a Track" +msgstr "" + +#: ../src/viktrwlayer.c:8835 +msgid "_Anonymize Times" +msgstr "" + +#: ../src/viktrwlayer.c:8838 +msgid "Shift timestamps to a relative offset from 1901-01-01" +msgstr "" + +#: ../src/viktrwlayer.c:8841 +msgid "_Interpolate Times" +msgstr "" + +#: ../src/viktrwlayer.c:8844 +msgid "" +"Reset trackpoint timestamps between the first and last points such that " +"track is traveled at equal speed" +msgstr "" + +#: ../src/viktrwlayer.c:8849 +msgid "_Reverse Track" +msgstr "" + +#: ../src/viktrwlayer.c:8851 +msgid "_Reverse Route" +msgstr "" + +#: ../src/viktrwlayer.c:8858 +msgid "Refine Route..." +msgstr "" + +#: ../src/viktrwlayer.c:8868 +msgid "Down_load Maps Along Track..." +msgstr "" + +#: ../src/viktrwlayer.c:8870 +msgid "Down_load Maps Along Route..." +msgstr "" + +#: ../src/viktrwlayer.c:8878 +msgid "_Export Track as GPX..." +msgstr "" + +#: ../src/viktrwlayer.c:8880 +msgid "_Export Route as GPX..." +msgstr "" + +#: ../src/viktrwlayer.c:8887 +msgid "E_xtend Track End" +msgstr "" + +#: ../src/viktrwlayer.c:8889 +msgid "E_xtend Route End" +msgstr "" + +#: ../src/viktrwlayer.c:8896 +msgid "Extend _Using Route Finder" +msgstr "" + +#: ../src/viktrwlayer.c:8911 +msgid "_Upload to GPS..." +msgstr "" + +#: ../src/viktrwlayer.c:8926 +msgid "_Diary" +msgstr "" + +#: ../src/viktrwlayer.c:8930 +msgid "Open diary program at this date" +msgstr "" + +#: ../src/viktrwlayer.c:8935 +msgid "_Astronomy" +msgstr "" + +#: ../src/viktrwlayer.c:8938 +msgid "Open astronomy program at this date and location" +msgstr "" + +#: ../src/viktrwlayer.c:8962 +msgid "_View Google Directions" +msgstr "" + +#: ../src/viktrwlayer.c:8984 +msgid "Use with _Filter" +msgstr "" + +#: ../src/viktrwlayer.c:9018 +msgid "_Edit Trackpoint" +msgstr "" + +#: ../src/viktrwlayer.c:10116 +#, c-format +msgid " - Gain %dm:Loss %dm" +msgstr "" + +#: ../src/viktrwlayer.c:10118 +#, c-format +msgid " - Gain %dft:Loss %dft" +msgstr "" + +#: ../src/viktrwlayer.c:10123 +#, c-format +msgid " - Bearing %3.1f° - Step %s" +msgstr "" + +#: ../src/viktrwlayer.c:10232 +#, c-format +msgid "Querying %s for route between (%.3f, %.3f) and (%.3f, %.3f)." +msgstr "" + +#: ../src/viktrwlayer.c:10248 +#, c-format +msgid "%s returned route between (%.3f, %.3f) and (%.3f, %.3f)." +msgstr "" + +#: ../src/viktrwlayer.c:10251 +#, c-format +msgid "Error getting route from %s." +msgstr "" + +#: ../src/viktrwlayer.c:11070 +#, c-format +msgid "Creating %d Image Thumbnails..." +msgstr "" + +#: ../src/viktrwlayer.c:11560 +msgid "No map layer in use. Create one first" +msgstr "" + +#: ../src/viktrwlayer.c:11679 +#, c-format +msgid "%s: Track List" +msgstr "" + +#: ../src/viktrwlayer.c:11681 +#, c-format +msgid "%s: Route List" +msgstr "" + +#: ../src/viktrwlayer.c:11734 +#, c-format +msgid "" +"Could not write external layer %s to %s, please fix and save before exiting " +"or data will be lost" +msgstr "" + +#: ../src/viktrwlayer.c:11782 +#, c-format +msgid "WARNING: issues encountered loading external layer %s from %s" +msgstr "" + +#: ../src/viktrwlayer_export.c:47 +msgid "Auto Device GPX Simplify:" +msgstr "" + +#: ../src/viktrwlayer_export.c:48 +msgid "" +"GPX saves to certain devices will be simplified for device compatibility." +msgstr "" + +#: ../src/viktrwlayer_export.c:125 +#, c-format +msgid "Export of GPX file simplified using point limit: %d" +msgstr "" + +#: ../src/viktrwlayer_export.c:206 ../src/viktrwlayer_export.c:323 +#: ../src/vikwindow.c:3694 +msgid "The filename you requested could not be opened for writing." +msgstr "" + +#: ../src/viktrwlayer_export.c:226 +#, c-format +msgid "Could not launch %s." +msgstr "" + +#: ../src/viktrwlayer_export.c:234 +msgid "Could not create temporary file for export." +msgstr "" + +#: ../src/viktrwlayer_export.c:268 +msgid "File format:" +msgstr "" + +#: ../src/viktrwlayer_export.c:276 +msgid "Select the file format." +msgstr "" + +#: ../src/viktrwlayer_export.c:281 +msgid "" +"Select the information to process.\n" +"Warning: the behavior of these switches is highly dependent of the file " +"format selected.\n" +"Please, refer to GPSbabel if unsure." +msgstr "" + +#: ../src/viktrwlayer_export.c:308 +msgid "You did not select a valid file format." +msgstr "" + +#: ../src/viktrwlayer_propwin.c:915 ../src/viktrwlayer_propwin.c:3381 +#: ../src/viktrwlayer_propwin.c:3417 ../src/viktrwlayer_propwin.c:3457 +#: ../src/viktrwlayer_propwin.c:3509 ../src/viktrwlayer_propwin.c:3527 +#: ../src/viktrwlayer_propwin.c:3600 ../src/viktrwlayer_propwin.c:3601 +#: ../src/viktrwlayer_propwin.c:3602 ../src/viktrwlayer_propwin.c:3611 +#: ../src/viktrwlayer_propwin.c:3612 ../src/viktrwlayer_propwin.c:3629 +#: ../src/viktrwlayer_propwin.c:3630 ../src/viktrwlayer_propwin.c:3644 +#: ../src/viktrwlayer_propwin.c:3645 ../src/viktrwlayer_propwin.c:3646 +#: ../src/viktrwlayer_propwin.c:3660 ../src/viktrwlayer_propwin.c:3661 +#: ../src/viktrwlayer_propwin.c:3662 ../src/viktrwlayer_propwin.c:3676 +#: ../src/viktrwlayer_propwin.c:3677 ../src/viktrwlayer_propwin.c:3678 +#: ../src/viktrwlayer_propwin.c:3695 ../src/viktrwlayer_propwin.c:3696 +#: ../src/viktrwlayer_analysis.c:293 +#, c-format +msgid "No Data" +msgstr "" + +#: ../src/viktrwlayer_propwin.c:960 ../src/viktrwlayer_propwin.c:1245 +#, c-format +msgid "%.1f kph" +msgstr "" + +#: ../src/viktrwlayer_propwin.c:963 ../src/viktrwlayer_propwin.c:1248 +#: ../src/viktrwlayer_analysis.c:352 +#, c-format +msgid "%.1f mph" +msgstr "" + +#: ../src/viktrwlayer_propwin.c:966 ../src/viktrwlayer_propwin.c:1251 +#, c-format +msgid "%.1f knots" +msgstr "" + +#: ../src/viktrwlayer_propwin.c:969 ../src/viktrwlayer_propwin.c:1254 +#, c-format +msgid "%.1f s/km" +msgstr "" + +#: ../src/viktrwlayer_propwin.c:972 ../src/viktrwlayer_propwin.c:1257 +#: ../src/viktrwlayer_analysis.c:389 ../src/viktrwlayer_analysis.c:392 +#, fuzzy, c-format +msgid "%.1f min/km" +msgstr "1 min" + +#: ../src/viktrwlayer_propwin.c:975 ../src/viktrwlayer_propwin.c:1260 +#, c-format +msgid "%.1f sec/mi" +msgstr "" + +#: ../src/viktrwlayer_propwin.c:978 ../src/viktrwlayer_propwin.c:1263 +#: ../src/viktrwlayer_analysis.c:409 ../src/viktrwlayer_analysis.c:412 +#, fuzzy, c-format +msgid "%.1f min/mi" +msgstr "1 min" + +#. VIK_UNITS_SPEED_METRES_PER_SECOND: +#: ../src/viktrwlayer_propwin.c:982 ../src/viktrwlayer_propwin.c:1267 +#, c-format +msgid "%.1f m/s" +msgstr "" + +#. Minutes +#: ../src/viktrwlayer_propwin.c:1411 +msgid "mins" +msgstr "" + +#. Hours +#: ../src/viktrwlayer_propwin.c:1418 +msgid "h" +msgstr "" + +#. Days +#: ../src/viktrwlayer_propwin.c:1424 +msgid "d" +msgstr "" + +#. Weeks +#: ../src/viktrwlayer_propwin.c:1429 +msgid "w" +msgstr "" + +#. 'Months' +#: ../src/viktrwlayer_propwin.c:1433 +msgid "M" +msgstr "" + +#: ../src/viktrwlayer_propwin.c:2051 ../src/viktrwlayer_analysis.c:303 +#, c-format +msgid "%.1f miles" +msgstr "" + +#: ../src/viktrwlayer_propwin.c:2054 ../src/viktrwlayer_analysis.c:306 +#, c-format +msgid "%.1f NM" +msgstr "" + +#. VIK_UNITS_DISTANCE_KILOMETRES +#: ../src/viktrwlayer_propwin.c:2057 ../src/viktrwlayer_analysis.c:310 +#, c-format +msgid "%.1f km" +msgstr "" + +#: ../src/viktrwlayer_propwin.c:3083 +msgid "Failed spliting track. Track unchanged" +msgstr "" + +#: ../src/viktrwlayer_propwin.c:3234 ../src/viktrwlayer_propwin.c:3744 +#, c-format +msgid "%s - Track Properties" +msgstr "" + +#: ../src/viktrwlayer_propwin.c:3239 +msgid "Split at _Marker" +msgstr "" + +#: ../src/viktrwlayer_propwin.c:3240 +msgid "Split _Segments" +msgstr "" + +#: ../src/viktrwlayer_propwin.c:3241 +msgid "_Reverse" +msgstr "" + +#: ../src/viktrwlayer_propwin.c:3242 +msgid "_Delete Dupl." +msgstr "" + +#: ../src/viktrwlayer_propwin.c:3269 +msgid "Comment:" +msgstr "" + +#: ../src/viktrwlayer_propwin.c:3270 +msgid "Description:" +msgstr "" + +#: ../src/viktrwlayer_propwin.c:3271 +msgid "Source:" +msgstr "" + +#: ../src/viktrwlayer_propwin.c:3272 +msgid "Type:" +msgstr "" + +#: ../src/viktrwlayer_propwin.c:3273 +msgid "Color:" +msgstr "" + +#: ../src/viktrwlayer_propwin.c:3274 +msgid "Draw Name:" +msgstr "" + +#: ../src/viktrwlayer_propwin.c:3275 +msgid "Distance Labels:" +msgstr "" + +#: ../src/viktrwlayer_propwin.c:3278 +msgid "Track Length:" +msgstr "" + +#: ../src/viktrwlayer_propwin.c:3279 +msgid "Trackpoints:" +msgstr "" + +#: ../src/viktrwlayer_propwin.c:3280 +msgid "Segments:" +msgstr "" + +#: ../src/viktrwlayer_propwin.c:3281 +msgid "Duplicate Points:" +msgstr "" + +#: ../src/viktrwlayer_propwin.c:3282 +msgid "Max Speed:" +msgstr "" + +#: ../src/viktrwlayer_propwin.c:3283 +msgid "Avg. Speed:" +msgstr "" + +#: ../src/viktrwlayer_propwin.c:3284 +msgid "Moving Avg. Speed:" +msgstr "" + +#: ../src/viktrwlayer_propwin.c:3285 +msgid "Avg. Dist. Between TPs:" +msgstr "" + +#: ../src/viktrwlayer_propwin.c:3286 +msgid "Elevation Range:" +msgstr "" + +#: ../src/viktrwlayer_propwin.c:3287 +msgid "Total Elevation Gain/Loss:" +msgstr "" + +#: ../src/viktrwlayer_propwin.c:3288 +msgid "Start:" +msgstr "" + +#: ../src/viktrwlayer_propwin.c:3289 +msgid "End:" +msgstr "" + +#: ../src/viktrwlayer_propwin.c:3290 +msgid "Duration:" +msgstr "" + +#: ../src/viktrwlayer_propwin.c:3320 +msgid "Centre" +msgstr "" + +#: ../src/viktrwlayer_propwin.c:3321 +msgid "Start only" +msgstr "" + +#: ../src/viktrwlayer_propwin.c:3322 +msgid "End only" +msgstr "" + +#: ../src/viktrwlayer_propwin.c:3323 +msgid "Start and End" +msgstr "" + +#: ../src/viktrwlayer_propwin.c:3324 +msgid "Centre, Start and End" +msgstr "" + +#: ../src/viktrwlayer_propwin.c:3336 +msgid "Maximum number of distance labels to be shown" +msgstr "" + +#: ../src/viktrwlayer_propwin.c:3340 +msgid "Properties" +msgstr "" + +#: ../src/viktrwlayer_propwin.c:3584 +#, c-format +msgid "%d minutes - %d minutes moving" +msgstr "" + +#: ../src/viktrwlayer_propwin.c:3596 +#, c-format +msgid "%s total - %s in segments" +msgstr "" + +#: ../src/viktrwlayer_propwin.c:3607 ../src/viktrwlayer_analysis.c:622 +msgid "Statistics" +msgstr "" + +#: ../src/viktrwlayer_propwin.c:3613 ../src/viktrwlayer_propwin.c:3680 +msgid "Show D_EM" +msgstr "" + +#: ../src/viktrwlayer_propwin.c:3615 ../src/viktrwlayer_propwin.c:3631 +#: ../src/viktrwlayer_propwin.c:3647 ../src/viktrwlayer_propwin.c:3697 +msgid "Show _GPS Speed" +msgstr "" + +#: ../src/viktrwlayer_propwin.c:3617 ../src/viktrwlayer_propwin.c:3633 +#: ../src/viktrwlayer_propwin.c:3665 ../src/viktrwlayer_propwin.c:3699 +msgid "Track Distance:" +msgstr "" + +#: ../src/viktrwlayer_propwin.c:3618 ../src/viktrwlayer_propwin.c:3684 +msgid "Track Height:" +msgstr "" + +#: ../src/viktrwlayer_propwin.c:3624 +msgid "Elevation-distance" +msgstr "" + +#: ../src/viktrwlayer_propwin.c:3634 +msgid "Track Gradient:" +msgstr "" + +#: ../src/viktrwlayer_propwin.c:3639 +msgid "Gradient-distance" +msgstr "" + +#: ../src/viktrwlayer_propwin.c:3649 ../src/viktrwlayer_propwin.c:3666 +#: ../src/viktrwlayer_propwin.c:3683 +msgid "Track Time:" +msgstr "" + +#: ../src/viktrwlayer_propwin.c:3650 ../src/viktrwlayer_propwin.c:3700 +msgid "Track Speed:" +msgstr "" + +#: ../src/viktrwlayer_propwin.c:3651 ../src/viktrwlayer_propwin.c:3667 +#: ../src/viktrwlayer_propwin.c:3685 +msgid "Time/Date:" +msgstr "" + +#: ../src/viktrwlayer_propwin.c:3655 +msgid "Speed-time" +msgstr "" + +#: ../src/viktrwlayer_propwin.c:3663 ../src/viktrwlayer_propwin.c:3679 +msgid "Show S_peed" +msgstr "" + +#: ../src/viktrwlayer_propwin.c:3671 +msgid "Distance-time" +msgstr "" + +#: ../src/viktrwlayer_propwin.c:3690 +msgid "Elevation-time" +msgstr "" + +#: ../src/viktrwlayer_propwin.c:3705 +msgid "Speed-distance" +msgstr "" + +#: ../src/viktrwlayer_tpwin.c:190 ../src/viktrwlayer_wpwin.c:66 +msgid "Date/Time Edit" +msgstr "" + +#: ../src/viktrwlayer_tpwin.c:242 +msgid "Name:" +msgstr "" + +#: ../src/viktrwlayer_tpwin.c:243 +msgid "Latitude:" +msgstr "" + +#: ../src/viktrwlayer_tpwin.c:244 +msgid "Longitude:" +msgstr "" + +#: ../src/viktrwlayer_tpwin.c:245 +msgid "Altitude:" +msgstr "" + +#: ../src/viktrwlayer_tpwin.c:246 +msgid "Course:" +msgstr "" + +#: ../src/viktrwlayer_tpwin.c:247 +msgid "Timestamp:" +msgstr "" + +#: ../src/viktrwlayer_tpwin.c:248 +msgid "Time:" +msgstr "" + +#: ../src/viktrwlayer_tpwin.c:249 +msgid "Distance Difference:" +msgstr "" + +#: ../src/viktrwlayer_tpwin.c:250 +msgid "Time Difference:" +msgstr "" + +#: ../src/viktrwlayer_tpwin.c:251 +msgid "\"Speed\" Between:" +msgstr "" + +#: ../src/viktrwlayer_tpwin.c:252 +msgid "Speed:" +msgstr "" + +#: ../src/viktrwlayer_tpwin.c:253 +msgid "VDOP:" +msgstr "" + +#: ../src/viktrwlayer_tpwin.c:254 +msgid "HDOP:" +msgstr "" + +#: ../src/viktrwlayer_tpwin.c:255 +msgid "PDOP:" +msgstr "" + +#: ../src/viktrwlayer_tpwin.c:256 +msgid "SAT/FIX:" +msgstr "" + +#: ../src/viktrwlayer_tpwin.c:263 ../src/viktrwlayer_tpwin.c:408 +#: ../src/viktrwlayer_tpwin.c:622 +msgid "Trackpoint" +msgstr "" + +#: ../src/viktrwlayer_tpwin.c:266 +msgid "_Insert After" +msgstr "" + +#: ../src/viktrwlayer_tpwin.c:268 +msgid "Split Here" +msgstr "" + +#: ../src/viktrwlayer_tracklist.c:262 ../src/viktrwlayer_waypointlist.c:306 +msgid "_Copy Data" +msgstr "" + +#. +#. item = gtk_image_menu_item_new_with_mnemonic ( _("_Select") ); +#. gtk_image_menu_item_set_image ( (GtkImageMenuItem*)item, gtk_image_new_from_stock (GTK_STOCK_FIND, GTK_ICON_SIZE_MENU) ); +#. g_signal_connect_swapped ( G_OBJECT(item), "activate", G_CALLBACK(trw_layer_track_select), values ); +#. gtk_menu_shell_append (GTK_MENU_SHELL (menu), item); +#. gtk_widget_show ( item ); +#. +#. ATM view auto selects, so don't bother with separate select menu entry +#. +#. item = gtk_image_menu_item_new_with_mnemonic ( _("_Select") ); +#. gtk_image_menu_item_set_image ( (GtkImageMenuItem*)item, gtk_image_new_from_stock (GTK_STOCK_FIND, GTK_ICON_SIZE_MENU) ); +#. g_signal_connect_swapped ( G_OBJECT(item), "activate", G_CALLBACK(trw_layer_waypoint_select), values ); +#. gtk_menu_shell_append (GTK_MENU_SHELL (menu), item); +#. gtk_widget_show ( item ); +#. +#. AUTO SELECT NOT TRUE YET... +#. ATM view auto selects, so don't bother with separate select menu entry +#: ../src/viktrwlayer_tracklist.c:290 ../src/viktrwlayer_waypointlist.c:341 +#: ../src/vikwindow.c:4816 +msgid "_View" +msgstr "" + +#. Insert column for the layer name when viewing multi layers +#: ../src/viktrwlayer_tracklist.c:613 ../src/viktrwlayer_waypointlist.c:609 +msgid "Layer" +msgstr "" + +#: ../src/viktrwlayer_tracklist.c:627 ../src/viktrwlayer_waypointlist.c:624 +msgid "Date" +msgstr "" + +#: ../src/viktrwlayer_tracklist.c:631 ../src/viktrwlayer_waypointlist.c:628 +msgid "Visible" +msgstr "" + +#: ../src/viktrwlayer_tracklist.c:639 +msgid "" +"Distance\n" +"(miles)" +msgstr "" + +#: ../src/viktrwlayer_tracklist.c:642 +msgid "" +"Distance\n" +"(NM)" +msgstr "" + +#: ../src/viktrwlayer_tracklist.c:645 +msgid "" +"Distance\n" +"(km)" +msgstr "" + +#: ../src/viktrwlayer_tracklist.c:651 +msgid "" +"Length\n" +"(minutes)" +msgstr "" + +#: ../src/viktrwlayer_tracklist.c:660 ../src/vikutils.c:93 +msgid "sec/mi" +msgstr "" + +#: ../src/viktrwlayer_tracklist.c:666 +#, c-format +msgid "" +"Av. Speed\n" +"(%s)" +msgstr "" + +#. Apply own formatting of the data +#: ../src/viktrwlayer_tracklist.c:671 +#, c-format +msgid "" +"Max Speed\n" +"(%s)" +msgstr "" + +#: ../src/viktrwlayer_tracklist.c:679 ../src/viktrwlayer_waypointlist.c:637 +msgid "" +"Max Height\n" +"(Feet)" +msgstr "" + +#: ../src/viktrwlayer_tracklist.c:681 ../src/viktrwlayer_waypointlist.c:639 +msgid "" +"Max Height\n" +"(Metres)" +msgstr "" + +#: ../src/viktrwlayer_waypointlist.c:312 +msgid "Copy Data (with _positions)" +msgstr "" + +#: ../src/viktrwlayer_waypointlist.c:633 +msgid "Comment" +msgstr "" + +#: ../src/viktrwlayer_waypointlist.c:643 +msgid "Symbol" +msgstr "" + +#: ../src/viktrwlayer_wpwin.c:93 ../src/viktrwlayer_wpwin.c:302 +msgid "True" +msgstr "" + +#: ../src/viktrwlayer_wpwin.c:122 +msgid "Waypoint Properties" +msgstr "Propietats del \"Waypoint\"" + +#: ../src/viktrwlayer_wpwin.c:164 +msgid "Name:" +msgstr "Nom:" + +#: ../src/viktrwlayer_wpwin.c:181 +msgid "Altitude:" +msgstr "Altitud:" + +#: ../src/viktrwlayer_wpwin.c:186 ../src/viktrwlayer_wpwin.c:188 +msgid "Comment:" +msgstr "Comentari:" + +#: ../src/viktrwlayer_wpwin.c:202 +msgid "Source:" +msgstr "" + +#: ../src/viktrwlayer_wpwin.c:212 +msgid "Image:" +msgstr "Imatge:" + +#: ../src/viktrwlayer_wpwin.c:217 +msgid "Symbol:" +msgstr "Símbol" + +#: ../src/viktrwlayer_wpwin.c:226 +msgid "(none)" +msgstr "" + +#. Geotag Info [readonly] +#: ../src/viktrwlayer_wpwin.c:272 +msgid "Has Geotag" +msgstr "" + +#: ../src/viktrwlayer_wpwin.c:279 +msgid "Consistent Position" +msgstr "" + +#. ATM the direction value box is always shown, even when there is no information. +#. It would be nice to be able to hide it until the 'Add' has been performed, +#. however I've not been able to achieve this. +#. Thus simply sensistizing it instead. +#: ../src/viktrwlayer_wpwin.c:292 +msgid "Image Direction:" +msgstr "" + +#: ../src/viktrwlayer_wpwin.c:300 +msgid "Magnetic" +msgstr "" + +#: ../src/viktrwlayer_wpwin.c:320 +msgid "Time:" +msgstr "" + +#. TODO: other checks (isalpha or whatever ) +#: ../src/viktrwlayer_wpwin.c:386 +msgid "Please enter a name for the waypoint." +msgstr "Si us plau, entra un nom per al \"waypoint\"" + +#: ../src/viktrwlayer_geotag.c:320 ../src/viktrwlayer_geotag.c:460 +#, c-format +msgid "Failed updating EXIF on %s" +msgstr "" + +#: ../src/viktrwlayer_geotag.c:562 +#, c-format +msgid "Geotagging %d Images..." +msgstr "" + +#: ../src/viktrwlayer_geotag.c:630 +msgid "Geotag Images" +msgstr "" + +#: ../src/viktrwlayer_geotag.c:640 +msgid "Images" +msgstr "" + +#: ../src/viktrwlayer_geotag.c:645 +msgid "Overwrite Existing Waypoints:" +msgstr "" + +#: ../src/viktrwlayer_geotag.c:648 +msgid "Overwrite Existing GPS Information:" +msgstr "" + +#: ../src/viktrwlayer_geotag.c:650 +msgid "Keep File Modification Timestamp:" +msgstr "" + +#: ../src/viktrwlayer_geotag.c:684 +msgid "Create Waypoints:" +msgstr "" + +#: ../src/viktrwlayer_geotag.c:693 +msgid "Write EXIF:" +msgstr "" + +#: ../src/viktrwlayer_geotag.c:705 +msgid "Automatic Image Direction:" +msgstr "" + +#: ../src/viktrwlayer_geotag.c:707 +msgid "Set image direction based on a heading derived from the track" +msgstr "" + +#: ../src/viktrwlayer_geotag.c:710 +msgid "Interpolate Between Track Segments:" +msgstr "" + +#: ../src/viktrwlayer_geotag.c:715 +msgid "Image Time Offset (Seconds):" +msgstr "" + +#: ../src/viktrwlayer_geotag.c:718 +msgid "" +"The number of seconds to ADD to the photos time to make it match the GPS " +"data. Calculate this with (GPS - Photo). Can be negative or positive. Useful " +"to adjust times when a camera's timestamp was incorrect." +msgstr "" + +#: ../src/viktrwlayer_geotag.c:721 +msgid "Image Timezone:" +msgstr "" + +#: ../src/viktrwlayer_geotag.c:724 +msgid "" +"The timezone that was used when the images were created. For example, if a " +"camera is set to AWST or +8:00 hours. Enter +8:00 here so that the correct " +"adjustment to the images' time can be made. GPS data is always in UTC." +msgstr "" + +#: ../src/viktrwlayer_geotag.c:728 +#, c-format +msgid "Using waypoint: %s" +msgstr "" + +#: ../src/viktrwlayer_geotag.c:742 +#, c-format +msgid "Using track: %s" +msgstr "" + +#: ../src/viktrwlayer_geotag.c:744 +#, c-format +msgid "Using all tracks in: %s" +msgstr "" + +#: ../src/viktrwlayer_analysis.c:214 +msgid "Number of Tracks" +msgstr "" + +#: ../src/viktrwlayer_analysis.c:215 +msgid "Date Range" +msgstr "" + +#: ../src/viktrwlayer_analysis.c:216 +msgid "Total Length" +msgstr "" + +#: ../src/viktrwlayer_analysis.c:217 +msgid "Average Length" +msgstr "" + +#: ../src/viktrwlayer_analysis.c:218 +msgid "Eddington number" +msgstr "" + +#. No.4: Extended display only +#: ../src/viktrwlayer_analysis.c:219 +msgid "Max Speed" +msgstr "" + +#: ../src/viktrwlayer_analysis.c:220 +msgid "Avg. Speed" +msgstr "" + +#: ../src/viktrwlayer_analysis.c:221 +msgid "Minimum Altitude" +msgstr "" + +#: ../src/viktrwlayer_analysis.c:222 +msgid "Maximum Altitude" +msgstr "" + +#: ../src/viktrwlayer_analysis.c:223 +msgid "Total Elevation Gain/Loss" +msgstr "" + +#: ../src/viktrwlayer_analysis.c:224 +msgid "Avg. Elevation Gain/Loss" +msgstr "" + +#: ../src/viktrwlayer_analysis.c:225 +msgid "Total Duration" +msgstr "" + +#: ../src/viktrwlayer_analysis.c:226 +msgid "Avg. Duration" +msgstr "" + +#: ../src/viktrwlayer_analysis.c:317 +#, c-format +msgid "%.2f miles" +msgstr "" + +#: ../src/viktrwlayer_analysis.c:320 +#, c-format +msgid "%.2f NM" +msgstr "" + +#. VIK_UNITS_DISTANCE_KILOMETRES +#: ../src/viktrwlayer_analysis.c:324 +#, c-format +msgid "%.2f km" +msgstr "" + +#: ../src/viktrwlayer_analysis.c:361 +#, c-format +msgid "%.2f m/s" +msgstr "" + +#: ../src/viktrwlayer_analysis.c:370 ../src/viktrwlayer_analysis.c:373 +#, c-format +msgid "%.2f knots" +msgstr "" + +#: ../src/viktrwlayer_analysis.c:379 ../src/viktrwlayer_analysis.c:382 +#, c-format +msgid "%d s/km" +msgstr "" + +#: ../src/viktrwlayer_analysis.c:399 ../src/viktrwlayer_analysis.c:402 +#, c-format +msgid "%d sec/mi" +msgstr "" + +#: ../src/viktrwlayer_analysis.c:420 ../src/viktrwlayer_analysis.c:423 +#, c-format +msgid "%.2f km/h" +msgstr "" + +#: ../src/viktrwlayer_analysis.c:434 ../src/viktrwlayer_analysis.c:440 +#, c-format +msgid "%d feet" +msgstr "" + +#: ../src/viktrwlayer_analysis.c:445 ../src/viktrwlayer_analysis.c:447 +#, c-format +msgid "%d feet / %d feet" +msgstr "" + +#: ../src/viktrwlayer_analysis.c:452 ../src/viktrwlayer_analysis.c:458 +#, c-format +msgid "%d m" +msgstr "" + +#: ../src/viktrwlayer_analysis.c:463 ../src/viktrwlayer_analysis.c:465 +#, c-format +msgid "%d m / %d m" +msgstr "" + +#: ../src/viktrwlayer_analysis.c:477 +#, c-format +msgid "%d:%02d:%02d days:hrs:mins" +msgstr "" + +#: ../src/viktrwlayer_analysis.c:484 +#, c-format +msgid "%d:%02d hrs:mins" +msgstr "" + +#: ../src/viktrwlayer_analysis.c:658 +msgid "Include Invisible Items" +msgstr "" + +#: ../src/vikstatus.c:129 +msgid "Current number of background tasks. Click to see the background jobs." +msgstr "" + +#: ../src/vikstatus.c:134 +msgid "Current zoom level. Click to select a new one." +msgstr "" + +#: ../src/vikstatus.c:141 +msgid "Left click to clear the message. Right click to copy the message." +msgstr "" + +#: ../src/vikutils.c:108 +msgid "GPSD" +msgstr "" + +#. GPS Preamble +#: ../src/vikutils.c:109 +msgid "Trkpt" +msgstr "" + +#: ../src/vikutils.c:160 +#, c-format +msgid "%sSpeed%s %.1f%s" +msgstr "" + +#. Go for 2dp as expect low values for vertical speeds +#: ../src/vikutils.c:214 +#, c-format +msgid "%sClimb%s %.2f%s" +msgstr "" + +#: ../src/vikutils.c:223 +#, c-format +msgid "%sAlt %dfeet" +msgstr "" + +#. VIK_UNITS_HEIGHT_METRES: +#: ../src/vikutils.c:227 +#, c-format +msgid "%sAlt %dm" +msgstr "" + +#: ../src/vikutils.c:235 +#, c-format +msgid "%sCourse %03d°" +msgstr "" + +#: ../src/vikutils.c:249 +msgid "yards" +msgstr "" + +#. VIK_UNITS_DISTANCE_KILOMETRES: +#: ../src/vikutils.c:253 +msgid "m" +msgstr "" + +#: ../src/vikutils.c:257 +#, c-format +msgid "%sDistance diff %d%s" +msgstr "" + +#: ../src/vikutils.c:272 +#, c-format +msgid "%sTime %s" +msgstr "" + +#: ../src/vikutils.c:281 +#, c-format +msgid "%sTime diff %lds" +msgstr "" + +#: ../src/vikutils.c:287 +#, c-format +msgid "%sNo. of Sats %d" +msgstr "" + +#: ../src/vikutils.c:312 +#, c-format +msgid "%sTo End %.2f%s" +msgstr "" + +#: ../src/vikutils.c:339 +#, c-format +msgid "%sDistance along %.2f%s" +msgstr "" + +#: ../src/vikutils.c:359 +#, c-format +msgid "%sTrack: %s" +msgstr "" + +#: ../src/vikutils.c:396 +#, c-format +msgid "" +"There is a newer version of Viking available: %s\n" +"\n" +"Do you wish to go to Viking's website now?" +msgstr "" + +#: ../src/vikutils.c:526 +msgid "" +"This appears to be Viking's very first run.\n" +"\n" +"Do you wish to enable automatic internet features?\n" +"\n" +"Individual settings can be controlled in the Preferences." +msgstr "" + +#: ../src/vikwaypoint.c:37 +msgid "Waypoint" +msgstr "" + +#: ../src/vikwebtool_datasource.c:352 +msgid "Search Term" +msgstr "" + +#. TODO get rid of this as this is unnecessary duplication... +#: ../src/vikwindow.c:258 +msgid "Pan" +msgstr "" + +#: ../src/vikwindow.c:258 +msgid "Zoom" +msgstr "" + +#: ../src/vikwindow.c:258 +msgid "Ruler" +msgstr "" + +#: ../src/vikwindow.c:258 +msgid "Select" +msgstr "" + +#: ../src/vikwindow.c:368 +msgid "This is Viking " +msgstr "" + +#: ../src/vikwindow.c:457 +msgid "Location lookup aborted" +msgstr "" + +#: ../src/vikwindow.c:477 +#, c-format +msgid "Location found: %s" +msgstr "" + +#: ../src/vikwindow.c:486 +msgid "Unable to determine location" +msgstr "" + +#: ../src/vikwindow.c:495 +msgid "Determining location" +msgstr "" + +#: ../src/vikwindow.c:525 +#, c-format +msgid "Location found via geoclue" +msgstr "" + +#: ../src/vikwindow.c:546 +msgid "Default Map" +msgstr "" + +#: ../src/vikwindow.c:557 ../src/vikwindow.c:3938 +msgid "Trying to determine location..." +msgstr "" + +#. Create tooltip +#: ../src/vikwindow.c:723 +msgid "Select zoom level" +msgstr "" + +#: ../src/vikwindow.c:1176 +#, c-format +msgid "" +"Do you want to save the changes you made to the document \"%s\"?\n" +"\n" +"Your changes will be lost if you don't save them." +msgstr "" + +#: ../src/vikwindow.c:1180 +msgid "Don't Save" +msgstr "" + +#: ../src/vikwindow.c:1268 +msgid "mpp" +msgstr "" + +#: ../src/vikwindow.c:1268 +msgid "pixelfact" +msgstr "" + +#: ../src/vikwindow.c:1467 +#, c-format +msgid "%s %s %dm" +msgstr "" + +#: ../src/vikwindow.c:1469 +#, c-format +msgid "%s %s %dft" +msgstr "" + +#: ../src/vikwindow.c:1472 +#, c-format +msgid "%s %s" +msgstr "" + +#: ../src/vikwindow.c:1929 +msgid "_Ruler" +msgstr "" + +#: ../src/vikwindow.c:1929 +msgid "Ruler Tool" +msgstr "" + +#: ../src/vikwindow.c:2204 ../src/vikwindow.c:4818 +msgid "_Zoom" +msgstr "" + +#: ../src/vikwindow.c:2204 +msgid "Zoom Tool" +msgstr "" + +#: ../src/vikwindow.c:2271 ../src/vikwindow.c:4819 +msgid "_Pan" +msgstr "" + +#: ../src/vikwindow.c:2271 +msgid "Pan Tool" +msgstr "" + +#: ../src/vikwindow.c:2425 +msgid "_Select" +msgstr "" + +#: ../src/vikwindow.c:2425 +msgid "Select Tool" +msgstr "" + +#: ../src/vikwindow.c:2615 +msgid "You must select a layer to show its properties." +msgstr "" + +#. No error to show, so unlikely this will get called +#: ../src/vikwindow.c:2629 +msgid "The help system is not available." +msgstr "" + +#. Main error path +#: ../src/vikwindow.c:2632 +#, c-format +msgid "" +"Help is not available because: %s.\n" +"Ensure a Mime Type ghelp handler program is installed (e.g. yelp)." +msgstr "" + +#: ../src/vikwindow.c:2865 +msgid "You must select a layer to delete." +msgstr "" + +#: ../src/vikwindow.c:3171 +msgid "Untitled" +msgstr "" + +#: ../src/vikwindow.c:3300 +#, c-format +msgid "Unable to add '%s' to the list of recently used documents" +msgstr "" + +#: ../src/vikwindow.c:3391 +msgid "The file you requested could not be opened." +msgstr "" + +#: ../src/vikwindow.c:3394 +msgid "" +"GPSBabel is required to load files of this type or GPSBabel encountered " +"problems." +msgstr "" + +#: ../src/vikwindow.c:3397 +#, c-format +msgid "Unable to load malformed GPX file %s" +msgstr "" + +#: ../src/vikwindow.c:3400 +#, c-format +msgid "Unsupported file type for %s" +msgstr "" + +#. Since we can process .vik files with issues just show a warning in the status bar +#. Not that a user can do much about it... or tells them what this issue is yet... +#: ../src/vikwindow.c:3406 +#, c-format +msgid "WARNING: issues encountered loading %s" +msgstr "" + +#: ../src/vikwindow.c:3489 +msgid "Please select a GPS data file to open. " +msgstr "" + +#: ../src/vikwindow.c:3508 +msgid "Google Earth" +msgstr "" + +#: ../src/vikwindow.c:3523 ../src/vikwindow.c:3646 ../src/viking.desktop.in.h:1 +msgid "Viking" +msgstr "" + +#: ../src/vikwindow.c:3594 ../src/vikwindow.c:4632 +msgid "Open File" +msgstr "" + +#: ../src/vikwindow.c:3630 +msgid "Save as Viking File." +msgstr "" + +#: ../src/vikwindow.c:3757 +#, c-format +msgid "Exporting to file: %s" +msgstr "" + +#. Confirm what happened. +#: ../src/vikwindow.c:3774 +#, c-format +msgid "Exported files: %d" +msgstr "" + +#: ../src/vikwindow.c:3786 +msgid "Nothing to Export!" +msgstr "" + +#: ../src/vikwindow.c:3790 +msgid "Export to directory" +msgstr "" + +#: ../src/vikwindow.c:3809 +msgid "Could not convert all files" +msgstr "" + +#: ../src/vikwindow.c:3851 +msgid "File not accessible" +msgstr "" + +#: ../src/vikwindow.c:3854 +msgid "No Viking File" +msgstr "" + +#: ../src/vikwindow.c:3998 +msgid "This layer has no configurable properties." +msgstr "" + +#: ../src/vikwindow.c:4080 +msgid "Are you sure you wish to delete all layers?" +msgstr "" + +#. Try harder... +#: ../src/vikwindow.c:4126 ../src/vikwindow.c:4132 +msgid "Generating image file..." +msgstr "" + +#: ../src/vikwindow.c:4154 +msgid "" +"Failed to generate internal image.\n" +"\n" +"Try creating a smaller image." +msgstr "" + +#: ../src/vikwindow.c:4175 +msgid "Image file generated." +msgstr "" + +#: ../src/vikwindow.c:4177 +msgid "Failed to generate image file." +msgstr "" + +#: ../src/vikwindow.c:4246 +#, c-format +msgid "Unable to write to file %s: %s" +msgstr "" + +#: ../src/vikwindow.c:4284 +msgid "" +"Viewable region outside allowable pixel size bounds for image. Clipping " +"width/height values." +msgstr "" + +#: ../src/vikwindow.c:4309 +#, c-format +msgid "Total area: %ldm x %ldm (%.3f sq. km)" +msgstr "" + +#: ../src/vikwindow.c:4312 +#, c-format +msgid "Total area: %ldm x %ldm (%.3f sq. miles)" +msgstr "" + +#: ../src/vikwindow.c:4315 +#, c-format +msgid "Total area: %ldm x %ldm (%.3f sq. NM)" +msgstr "" + +#. Single file +#: ../src/vikwindow.c:4343 +msgid "Save Image" +msgstr "" + +#: ../src/vikwindow.c:4364 ../src/vikwindow.c:4641 +msgid "KMZ" +msgstr "" + +#: ../src/vikwindow.c:4417 +msgid "You must be in UTM mode to use this feature" +msgstr "" + +#: ../src/vikwindow.c:4421 +msgid "Choose a directory to hold images" +msgstr "" + +#. todo: default for answers inside VikWindow or static (thruout instance) +#: ../src/vikwindow.c:4441 +msgid "Save to Image File" +msgstr "" + +#: ../src/vikwindow.c:4457 +msgid "Width (pixels):" +msgstr "" + +#: ../src/vikwindow.c:4459 +msgid "Height (pixels):" +msgstr "" + +#: ../src/vikwindow.c:4462 +msgid "" +"WARNING: USING LARGE IMAGES OVER 10000x10000\n" +"MAY CRASH THE PROGRAM!" +msgstr "" + +#: ../src/vikwindow.c:4464 +msgid "Zoom (meters per pixel):" +msgstr "" + +#: ../src/vikwindow.c:4480 +msgid "Area in current viewable window" +msgstr "" + +#: ../src/vikwindow.c:4490 +msgid "Save as PNG" +msgstr "" + +#: ../src/vikwindow.c:4491 +msgid "Save as JPEG" +msgstr "" + +#: ../src/vikwindow.c:4520 +msgid "East-west image tiles:" +msgstr "" + +#: ../src/vikwindow.c:4522 +msgid "North-south image tiles:" +msgstr "" + +#: ../src/vikwindow.c:4619 +msgid "This feature is not available in UTM mode" +msgstr "" + +#: ../src/vikwindow.c:4658 +#, c-format +msgid "Unable to import %s." +msgstr "" + +#: ../src/vikwindow.c:4749 +msgid "Choose a background color" +msgstr "" + +#: ../src/vikwindow.c:4765 +msgid "Choose a track highlight color" +msgstr "" + +#: ../src/vikwindow.c:4814 +msgid "_File" +msgstr "" + +#: ../src/vikwindow.c:4815 +msgid "_Edit" +msgstr "" + +#: ../src/vikwindow.c:4817 +msgid "_Show" +msgstr "" + +#: ../src/vikwindow.c:4820 +msgid "_Layers" +msgstr "" + +#: ../src/vikwindow.c:4821 +msgid "_Tools" +msgstr "" + +#: ../src/vikwindow.c:4822 +msgid "_Webtools" +msgstr "" + +#: ../src/vikwindow.c:4823 ../src/vikwindow.c:4893 +msgid "_Help" +msgstr "" + +#: ../src/vikwindow.c:4825 +msgid "New file" +msgstr "" + +#: ../src/vikwindow.c:4826 +msgid "_Open..." +msgstr "" + +#: ../src/vikwindow.c:4826 +msgid "Open a file" +msgstr "" + +#: ../src/vikwindow.c:4827 +msgid "Open _Recent File" +msgstr "" + +#: ../src/vikwindow.c:4828 +msgid "Append _File..." +msgstr "" + +#: ../src/vikwindow.c:4828 +msgid "Append data from a different file" +msgstr "" + +#: ../src/vikwindow.c:4829 +msgid "Open GPX as External _Layer..." +msgstr "" + +#: ../src/vikwindow.c:4829 +msgid "Open a GPX file as an external layer" +msgstr "" + +#: ../src/vikwindow.c:4830 +msgid "_Export All" +msgstr "" + +#: ../src/vikwindow.c:4830 +msgid "Export All TrackWaypoint Layers" +msgstr "" + +#: ../src/vikwindow.c:4831 +msgid "_GPX..." +msgstr "" + +#: ../src/vikwindow.c:4831 +msgid "Export as GPX" +msgstr "" + +#: ../src/vikwindow.c:4832 +msgid "A_cquire" +msgstr "" + +#: ../src/vikwindow.c:4833 +msgid "_Directions..." +msgstr "" + +#: ../src/vikwindow.c:4833 +msgid "Get driving directions" +msgstr "" + +#: ../src/vikwindow.c:4835 +msgid "_OSM Traces..." +msgstr "" + +#: ../src/vikwindow.c:4835 +msgid "Get traces from OpenStreetMap" +msgstr "" + +#: ../src/vikwindow.c:4836 +msgid "_My OSM Traces..." +msgstr "" + +#: ../src/vikwindow.c:4836 +msgid "Get Your Own Traces from OpenStreetMap" +msgstr "" + +#: ../src/vikwindow.c:4839 +msgid "Geo_caches..." +msgstr "" + +#: ../src/vikwindow.c:4839 +msgid "Get Geocaches from geocaching.com" +msgstr "" + +#: ../src/vikwindow.c:4842 +msgid "Create waypoints from geotagged images" +msgstr "" + +#: ../src/vikwindow.c:4844 +msgid "Get a file from a URL" +msgstr "" + +#: ../src/vikwindow.c:4846 +msgid "Create waypoints from Wikipedia items in the current view" +msgstr "" + +#: ../src/vikwindow.c:4848 +msgid "_Save" +msgstr "" + +#: ../src/vikwindow.c:4848 +msgid "Save the file" +msgstr "" + +#: ../src/vikwindow.c:4849 +msgid "Save _As..." +msgstr "" + +#: ../src/vikwindow.c:4849 +msgid "Save the file under different name" +msgstr "" + +#: ../src/vikwindow.c:4850 +msgid "Properties..." +msgstr "" + +#: ../src/vikwindow.c:4850 +msgid "File Properties" +msgstr "" + +#: ../src/vikwindow.c:4852 +msgid "Import KMZ _Map File..." +msgstr "" + +#: ../src/vikwindow.c:4852 +msgid "Import a KMZ file" +msgstr "" + +#: ../src/vikwindow.c:4853 +msgid "Generate _KMZ Map File..." +msgstr "" + +#: ../src/vikwindow.c:4853 +msgid "Generate a KMZ file with an overlay of the current view" +msgstr "" + +#: ../src/vikwindow.c:4855 +msgid "_Generate Image File..." +msgstr "" + +#: ../src/vikwindow.c:4855 +msgid "Save a snapshot of the workspace into a file" +msgstr "" + +#: ../src/vikwindow.c:4856 +msgid "Generate _Directory of Images..." +msgstr "" + +#: ../src/vikwindow.c:4856 +msgid "Generate _Directory of Images" +msgstr "" + +#: ../src/vikwindow.c:4857 +msgid "_Print..." +msgstr "" + +#: ../src/vikwindow.c:4857 +msgid "Print maps" +msgstr "" + +#: ../src/vikwindow.c:4858 +msgid "E_xit" +msgstr "" + +#: ../src/vikwindow.c:4858 +msgid "Exit the program" +msgstr "" + +#: ../src/vikwindow.c:4859 +msgid "Save and Exit" +msgstr "" + +#: ../src/vikwindow.c:4859 +msgid "Save and Exit the program" +msgstr "" + +#: ../src/vikwindow.c:4861 +msgid "Go to the Pre_vious Location" +msgstr "" + +#: ../src/vikwindow.c:4861 +msgid "Go to the previous location" +msgstr "" + +#: ../src/vikwindow.c:4862 +msgid "Go to the _Next Location" +msgstr "" + +#: ../src/vikwindow.c:4862 +msgid "Go to the next location" +msgstr "" + +#: ../src/vikwindow.c:4863 +msgid "Go to the _Default Location" +msgstr "" + +#: ../src/vikwindow.c:4863 +msgid "Go to the default location" +msgstr "" + +#: ../src/vikwindow.c:4864 +msgid "Go to the _Auto Location" +msgstr "" + +#: ../src/vikwindow.c:4864 +msgid "Go to a location via automatic lookup" +msgstr "" + +#: ../src/vikwindow.c:4865 +msgid "Go to _Location..." +msgstr "" + +#: ../src/vikwindow.c:4865 +msgid "Go to address/place using text search" +msgstr "" + +#: ../src/vikwindow.c:4866 +msgid "_Go to Lat/Lon..." +msgstr "" + +#: ../src/vikwindow.c:4866 +msgid "Go to arbitrary lat/lon coordinate" +msgstr "" + +#: ../src/vikwindow.c:4867 +msgid "Go to UTM..." +msgstr "" + +#: ../src/vikwindow.c:4867 +msgid "Go to arbitrary UTM coordinate" +msgstr "" + +#: ../src/vikwindow.c:4868 +#, fuzzy +msgid "Go to Today" +msgstr "Anar a UTM" + +#: ../src/vikwindow.c:4868 +msgid "Go to today on the calendar" +msgstr "" + +#: ../src/vikwindow.c:4869 +msgid "_Refresh" +msgstr "" + +#: ../src/vikwindow.c:4869 +msgid "Refresh any maps displayed" +msgstr "" + +#: ../src/vikwindow.c:4870 +msgid "Set _Highlight Color..." +msgstr "" + +#: ../src/vikwindow.c:4870 +msgid "Set Highlight Color" +msgstr "" + +#: ../src/vikwindow.c:4871 +msgid "Set Bac_kground Color..." +msgstr "" + +#: ../src/vikwindow.c:4871 +msgid "Set Background Color" +msgstr "" + +#: ../src/vikwindow.c:4872 +msgid "Zoom _In" +msgstr "" + +#: ../src/vikwindow.c:4872 +msgid "Zoom In" +msgstr "" + +#: ../src/vikwindow.c:4873 +msgid "Zoom _Out" +msgstr "" + +#: ../src/vikwindow.c:4873 +msgid "Zoom Out" +msgstr "" + +#: ../src/vikwindow.c:4874 +msgid "Zoom _To..." +msgstr "" + +#: ../src/vikwindow.c:4874 +msgid "Zoom To" +msgstr "" + +#: ../src/vikwindow.c:4875 +msgid "Pan _North" +msgstr "" + +#: ../src/vikwindow.c:4876 +msgid "Pan _East" +msgstr "" + +#: ../src/vikwindow.c:4877 +msgid "Pan _South" +msgstr "" + +#: ../src/vikwindow.c:4878 +msgid "Pan _West" +msgstr "" + +#: ../src/vikwindow.c:4879 +msgid "Background _Jobs" +msgstr "" + +#: ../src/vikwindow.c:4879 +msgid "Background Jobs" +msgstr "" + +#: ../src/vikwindow.c:4881 +msgid "Cu_t" +msgstr "" + +#: ../src/vikwindow.c:4885 +msgid "Delete All" +msgstr "" + +#: ../src/vikwindow.c:4886 +msgid "Copy Centre _Location" +msgstr "" + +#: ../src/vikwindow.c:4887 +msgid "_Flush Map Cache" +msgstr "" + +#: ../src/vikwindow.c:4888 +msgid "_Set the Default Location" +msgstr "" + +#: ../src/vikwindow.c:4888 +msgid "Set the Default Location to the current position" +msgstr "" + +#: ../src/vikwindow.c:4889 +msgid "_Preferences" +msgstr "" + +#: ../src/vikwindow.c:4889 +msgid "Program Preferences" +msgstr "" + +#: ../src/vikwindow.c:4890 +msgid "_Layer Defaults" +msgstr "" + +#: ../src/vikwindow.c:4891 +msgid "_Properties" +msgstr "" + +#: ../src/vikwindow.c:4893 +msgid "Help" +msgstr "" + +#: ../src/vikwindow.c:4894 +msgid "_About" +msgstr "" + +#: ../src/vikwindow.c:4894 +msgid "About" +msgstr "" + +#: ../src/vikwindow.c:4903 +msgid "_KML..." +msgstr "" + +#: ../src/vikwindow.c:4903 +msgid "Export as KML" +msgstr "" + +#: ../src/vikwindow.c:4904 +msgid "Transfer data from a GPS device" +msgstr "" + +#: ../src/vikwindow.c:4905 +msgid "Import file via GPSBabel converter" +msgstr "" + +#: ../src/vikwindow.c:4909 +msgid "Import Geo_JSON File..." +msgstr "" + +#: ../src/vikwindow.c:4909 +msgid "Import GeoJSON file" +msgstr "" + +#: ../src/vikwindow.c:4914 +msgid "_UTM Mode" +msgstr "" + +#: ../src/vikwindow.c:4915 +msgid "_Expedia Mode" +msgstr "" + +#: ../src/vikwindow.c:4916 +msgid "_Mercator Mode" +msgstr "" + +#: ../src/vikwindow.c:4917 +msgid "Lat_/Lon Mode" +msgstr "" + +#: ../src/vikwindow.c:4921 +msgid "Show _Scale" +msgstr "" + +#: ../src/vikwindow.c:4921 +msgid "Show Scale" +msgstr "" + +#: ../src/vikwindow.c:4922 +msgid "Show _Center Mark" +msgstr "" + +#: ../src/vikwindow.c:4922 +msgid "Show Center Mark" +msgstr "" + +#: ../src/vikwindow.c:4923 +msgid "Show _Highlight" +msgstr "" + +#: ../src/vikwindow.c:4923 +msgid "Show Highlight" +msgstr "" + +#: ../src/vikwindow.c:4924 +msgid "_Full Screen" +msgstr "" + +#: ../src/vikwindow.c:4924 +msgid "Activate full screen mode" +msgstr "" + +#: ../src/vikwindow.c:4925 +msgid "Show Side _Panel" +msgstr "" + +#: ../src/vikwindow.c:4925 +msgid "Show Side Panel" +msgstr "" + +#: ../src/vikwindow.c:4926 +msgid "Show Status_bar" +msgstr "" + +#: ../src/vikwindow.c:4926 +msgid "Show Statusbar" +msgstr "" + +#: ../src/vikwindow.c:4927 +msgid "Show _Toolbar" +msgstr "" + +#: ../src/vikwindow.c:4927 +msgid "Show Toolbar" +msgstr "" + +#: ../src/vikwindow.c:4928 +msgid "Show _Menu" +msgstr "" + +#: ../src/vikwindow.c:4928 +msgid "Show Menu" +msgstr "" + +#: ../src/vikwindow.c:4929 +msgid "Show Side Panel B_uttons" +msgstr "" + +#: ../src/vikwindow.c:4929 +msgid "Show Side Panel Buttons" +msgstr "" + +#: ../src/vikwindow.c:4930 +msgid "Show Side Panel Ca_lendar" +msgstr "" + +#: ../src/vikwindow.c:4930 +msgid "Show Side Panel Calendar" +msgstr "" + +#: ../src/vikwindow.c:5064 +#, c-format +msgid "New _%s Layer" +msgstr "" + +#: ../src/vikwindow.c:5114 +msgid "..." +msgstr "" + +#: ../src/viking.desktop.in.h:2 +msgid "GPS Data Manager" +msgstr "" + +#: ../src/viking.desktop.in.h:3 +msgid "Map Based GPS Data Manager (live data capable)." +msgstr "" + +#: ../src/libjpeg/jpeg-data.c:205 +msgid "Data does not follow JPEG specification." +msgstr "" + +#: ../src/libjpeg/jpeg-data.c:302 +#, c-format +msgid "Path '%s' invalid." +msgstr "" + +#: ../src/libjpeg/jpeg-data.c:320 +#, c-format +msgid "Could not read '%s'." +msgstr "" diff --git a/po/cs.po b/po/cs.po new file mode 100644 index 0000000..665bec8 --- /dev/null +++ b/po/cs.po @@ -0,0 +1,6279 @@ +# Czech translation for viking +# Copyright (c) 2007 Rosetta Contributors and Canonical Ltd 2007 +# This file is distributed under the same license as the viking package. +# FIRST AUTHOR , 2007. +# +msgid "" +msgstr "" +"Project-Id-Version: viking\n" +"Report-Msgid-Bugs-To: \n" +"POT-Creation-Date: 2019-01-19 12:53+0000\n" +"PO-Revision-Date: 2015-03-30 21:56+0000\n" +"Last-Translator: Radek Stastny \n" +"Language-Team: Czech \n" +"Language: cs\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" +"X-Launchpad-Export-Date: 2018-12-21 17:32+0000\n" +"X-Generator: Launchpad (build 18847)\n" + +#: ../src/acquire.c:106 ../src/vikgpslayer.c:1367 +msgid "Done." +msgstr "Hotovo." + +#: ../src/acquire.c:115 +msgid "No data." +msgstr "Žádná data." + +#: ../src/acquire.c:167 ../src/acquire.c:415 +msgid "Error: acquisition failed." +msgstr "Chyba: stažení selhalo" + +#: ../src/acquire.c:339 +msgid "Working..." +msgstr "Pracuji..." + +#. This shouldn't happen... +#: ../src/acquire.c:406 +msgid "" +"Unable to create command\n" +"Acquire method failed." +msgstr "" +"Nelze zadat příkaz\n" +"Stažení dat selhalo." + +#: ../src/acquire.c:513 +msgid "_Filter" +msgstr "_Filtr" + +#: ../src/acquire.c:528 +#, c-format +msgid "Filter with %s" +msgstr "Filtrovat s %s" + +#: ../src/acquire.c:545 +msgid "Filter" +msgstr "Filtrovat" + +#: ../src/babel.c:640 +msgid "GPSBabel:" +msgstr "" + +#: ../src/babel.c:641 +msgid "" +"Allow setting the specific instance of GPSBabel. You must restart Viking for " +"this value to take effect." +msgstr "" + +#: ../src/babel_ui.c:79 +msgid "Select a file format" +msgstr "" + +#: ../src/babel_ui.c:144 ../src/viktrwlayer.c:531 ../src/viktrwlayer.c:2882 +msgid "Tracks" +msgstr "Stopy" + +#: ../src/babel_ui.c:149 ../src/viktrwlayer.c:2892 +msgid "Routes" +msgstr "Trasy" + +#. ***** PARAMETERS ***** +#: ../src/babel_ui.c:154 ../src/viktrwlayer.c:531 ../src/viktrwlayer.c:2887 +msgid "Waypoints" +msgstr "Místa" + +#: ../src/background.c:64 +#, c-format +msgid "%d items" +msgstr "%d položek" + +#: ../src/background.c:287 +msgid "Threads:" +msgstr "" + +#: ../src/background.c:288 +msgid "" +"Number of threads to use for Mapnik tasks. You need to restart Viking for a " +"change to this value to be used" +msgstr "" + +#: ../src/background.c:361 +msgid "Job" +msgstr "Úloha" + +#: ../src/background.c:365 +msgid "Progress" +msgstr "Průběh" + +#: ../src/background.c:373 +msgid "Viking Background Jobs" +msgstr "Úlohy na pozadí" + +#: ../src/bing.c:42 +msgid "Bing Aerial" +msgstr "" + +#: ../src/bing.c:48 +msgid "Bing" +msgstr "Bing" + +#. VIK_GTK_WINDOW_FROM_WIDGET(vp) +#: ../src/bingmapsource.c:514 +msgid "Bing attribution Loading" +msgstr "Bing nahrávání" + +#: ../src/clipboard.c:95 +msgid "paste failed" +msgstr "vložení selhalo" + +#: ../src/clipboard.c:105 +msgid "wrong clipboard data size" +msgstr "špatná velikost dat ve schránce" + +#: ../src/clipboard.c:124 +#, c-format +msgid "" +"The clipboard contains sublayer data for %s layers. You must select a layer " +"of this type to paste the clipboard data." +msgstr "" +"Schránka obsahuje data z %s podvrstev. Pro vložení je nutné vybrat vrstvu " +"stejného typu." + +#: ../src/clipboard.c:264 +msgid "" +"In order to paste a waypoint, please select an appropriate layer to paste " +"into." +msgstr "K vložení místa je nutné vybrat cílovou vrstvu." + +#: ../src/dialog.c:60 +msgid "Go to Lat/Lon" +msgstr "Jdi na souřadnice" + +#: ../src/dialog.c:69 ../src/viktrwlayer_wpwin.c:173 +msgid "Latitude:" +msgstr "Šířka:" + +#: ../src/dialog.c:72 ../src/viktrwlayer_wpwin.c:177 +msgid "Longitude:" +msgstr "Délka:" + +#: ../src/dialog.c:102 +msgid "Go to UTM" +msgstr "Jít na souřadnice UTM" + +#: ../src/dialog.c:114 +msgid "Northing:" +msgstr "Severní souřadnice:" + +#: ../src/dialog.c:117 +msgid "Easting:" +msgstr "Východní souřadnice:" + +#: ../src/dialog.c:121 ../src/vikgeoreflayer.c:902 +msgid "Zone:" +msgstr "Zóna:" + +#: ../src/dialog.c:124 ../src/vikgeoreflayer.c:904 +msgid "Letter:" +msgstr "Písmeno:" + +#: ../src/dialog.c:246 ../src/geonamessearch.c:238 +#: ../src/datasource_osm_my_traces.c:505 +msgid "Nothing was selected" +msgstr "Nic nebylo vybráno" + +#: ../src/dialog.c:254 +msgid "Add Route" +msgstr "Přidat trasu" + +#: ../src/dialog.c:254 +msgid "Add Track" +msgstr "Přidat stopu" + +#: ../src/dialog.c:262 +msgid "Route Name:" +msgstr "Jméno trasy:" + +#: ../src/dialog.c:262 +msgid "Track Name:" +msgstr "Jméno stpy:" + +#: ../src/dialog.c:282 +msgid "Please enter a name for the track." +msgstr "Zadejte prosím jméno stopy." + +#: ../src/dialog.c:311 +msgid "Today" +msgstr "" + +#: ../src/dialog.c:393 +msgid "Zoom Factors..." +msgstr "Stupeň přiblížení..." + +#: ../src/dialog.c:407 +msgid "Zoom factor (in meters per pixel):" +msgstr "Měřítko (metry na pixel)" + +#: ../src/dialog.c:408 +msgid "X (easting): " +msgstr "X (východní): " + +#: ../src/dialog.c:409 +msgid "Y (northing): " +msgstr "Y (severní): " + +#: ../src/dialog.c:414 +msgid "X and Y zoom factors must be equal" +msgstr "Stejný stupeň přiblížení pro X a Y" + +#: ../src/dialog.c:469 +msgid "1 min" +msgstr "1 min" + +#: ../src/dialog.c:470 +msgid "1 hour" +msgstr "1 hodina" + +#: ../src/dialog.c:471 +msgid "1 day" +msgstr "1 den" + +#: ../src/dialog.c:472 +msgid "Custom (in minutes):" +msgstr "Uživatelský (v minutách):" + +#: ../src/dialog.c:608 +#, c-format +msgid "" +"2003-2008, Evan Battaglia\n" +"2008-%s, Viking's contributors" +msgstr "" + +#: ../src/dialog.c:609 +msgid "GPS Data and Topo Analyzer, Explorer, and Manager." +msgstr "Analyzátor, průzkumník a správce GPS a topologických dat." + +#: ../src/dialog.c:610 +msgid "" +"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.\n" +"\n" +"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.\n" +"\n" +"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., 59 Temple " +"Place, Suite 330, Boston, MA 02111-1307, USA" +msgstr "" +"Program je šířen pod následující licencí. Oficiální překlad neexistuje, " +"podrobnosti a vysvětlení lze nalézt například zde http://www.gnu.org/" +"copyleft/copyleft.cs.html.\n" +"\n" +"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.\n" +"\n" +"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.\n" +"\n" +"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., 59 Temple " +"Place, Suite 330, Boston, MA 02111-1307, USA" + +#: ../src/dialog.c:703 +msgid "Translation is coordinated on http://launchpad.net/viking" +msgstr "Překlady do češtiny můžete zlepšit na http://launchpad.net/viking" + +#: ../src/dialog.c:713 +msgid "Download along track" +msgstr "Stáhnout mapy podél stopy" + +#: ../src/dialog.c:720 +msgid "Map type:" +msgstr "Typ mapy:" + +#: ../src/dialog.c:726 +msgid "Zoom level:" +msgstr "Stupeň přiblížení:" + +#: ../src/dialog.c:766 +#, c-format +msgid "The map data is licensed: %s." +msgstr "Data mapy jsou licencována: %s." + +#: ../src/dialog.c:769 +#, c-format +msgid "" +"The data provided by '%s' are licensed under the following license: " +"%s." +msgstr "" + +#: ../src/dialog.c:773 +msgid "Open license" +msgstr "Otevřená licence" + +#: ../src/expedia.c:54 +msgid "Expedia Street Maps" +msgstr "Expedia uliční mapy" + +#: ../src/expedia.c:82 +msgid "Invalid expedia altitude" +msgstr "Špatná výška dle Expedie" + +#: ../src/expedia.c:113 +#, c-format +msgid "" +"Couldn't open EXPEDIA image file (right after successful download! Please " +"report and delete image file!): %s" +msgstr "" +"Nemohu otevřít soubor EXPEDIA (po úspěšném stažení, soubor smažte a chybu " +"prosím nahlaste!): %s" + +#: ../src/expedia.c:126 +#, c-format +msgid "" +"Couldn't save EXPEDIA image file (right after successful download! Please " +"report and delete image file!): %s" +msgstr "" +"Nemohu uložit soubor EXPEDIA (po úspěšném stažení, soubor smažte a chybu " +"prosím nahlaste!): %s" + +#: ../src/geonamessearch.c:115 +msgid "Search" +msgstr "Hledat" + +#: ../src/geonamessearch.c:117 +msgid "No entries found!" +msgstr "Nenalezeno!" + +#. NB could allow columns to be shifted around by doing this after each new +#. gtk_tree_view_column_set_reorderable ( column, TRUE ); +#. However I don't think is that useful, so I haven't put it in +#: ../src/geonamessearch.c:171 ../src/datasource_osm_my_traces.c:422 +#: ../src/viktrwlayer_tracklist.c:621 ../src/viktrwlayer_waypointlist.c:618 +msgid "Name" +msgstr "Název" + +#: ../src/geonamessearch.c:176 +msgid "Feature" +msgstr "Vlastnost" + +#: ../src/geonamessearch.c:181 ../src/datasource_osm_my_traces.c:437 +msgid "Lat/Lon" +msgstr "šířka/délka" + +#: ../src/geonamessearch.c:264 ../src/googlesearch.c:101 ../src/vikgoto.c:430 +msgid "couldn't map temp file" +msgstr "nelze zpracovat dočasný soubor" + +#: ../src/geonamessearch.c:459 +#, fuzzy +msgid "Select articles" +msgstr "Výběr" + +#: ../src/geonamessearch.c:459 +msgid "Select the articles you want to add." +msgstr "" + +#: ../src/geonamessearch.c:475 +msgid "city" +msgstr "" + +#: ../src/geonamessearch.c:477 +#, fuzzy +msgid "edu" +msgstr "konec" + +#: ../src/geonamessearch.c:479 +msgid "airport" +msgstr "" + +#: ../src/geonamessearch.c:481 +msgid "mountain" +msgstr "" + +#: ../src/geonamessearch.c:483 +msgid "forest" +msgstr "" + +#: ../src/geonamessearch.c:485 +msgid "church" +msgstr "" + +#: ../src/geojson.c:74 +#, c-format +msgid "%s command failed: %s" +msgstr "" + +#: ../src/geojson.c:146 ../src/gpx.c:1317 +#, c-format +msgid "failed to open temporary file: %s" +msgstr "nelze otevřít dočasný soubor: %s" + +#: ../src/globals.c:67 +msgid "DDD" +msgstr "" + +#: ../src/globals.c:67 +#, fuzzy +msgid "DMM" +msgstr "DEM" + +#: ../src/globals.c:67 +#, fuzzy +msgid "DMS" +msgstr "DEM" + +#: ../src/globals.c:67 +msgid "Raw" +msgstr "" + +#: ../src/globals.c:68 +msgid "Kilometres" +msgstr "" + +#: ../src/globals.c:68 +msgid "Miles" +msgstr "" + +#: ../src/globals.c:68 +msgid "Nautical Miles" +msgstr "" + +#. VIK_UNITS_SPEED_KILOMETRES_PER_HOUR: +#: ../src/globals.c:69 ../src/viktrwlayer_tracklist.c:655 ../src/vikutils.c:100 +msgid "km/h" +msgstr "km/h" + +#: ../src/globals.c:69 ../src/viktrwlayer_tracklist.c:656 ../src/vikutils.c:78 +msgid "mph" +msgstr "mil/h" + +#. VIK_UNITS_SPEED_METRES_PER_SECOND: +#: ../src/globals.c:69 ../src/viktrwlayer_tracklist.c:663 ../src/vikutils.c:81 +msgid "m/s" +msgstr "m/s" + +#: ../src/globals.c:69 ../src/viktrwlayer_tracklist.c:657 ../src/vikutils.c:84 +msgid "knots" +msgstr "uzly" + +#: ../src/globals.c:69 ../src/viktrwlayer_tracklist.c:658 ../src/vikutils.c:87 +msgid "s/km" +msgstr "" + +#: ../src/globals.c:69 ../src/viktrwlayer_tracklist.c:659 ../src/vikutils.c:90 +msgid "min/km" +msgstr "" + +#: ../src/globals.c:69 +msgid "s/mi" +msgstr "" + +#: ../src/globals.c:69 ../src/viktrwlayer_tracklist.c:661 ../src/vikutils.c:96 +msgid "min/mi" +msgstr "" + +#: ../src/globals.c:70 +msgid "Metres" +msgstr "" + +#: ../src/globals.c:70 +msgid "Feet" +msgstr "" + +#: ../src/globals.c:73 +msgid "Locale" +msgstr "" + +#: ../src/globals.c:73 +msgid "World" +msgstr "" + +#: ../src/globals.c:73 +msgid "UTC" +msgstr "" + +#: ../src/globals.c:76 +msgid "Degree format:" +msgstr "Formát zobrazení stupňů:" + +#: ../src/globals.c:77 +msgid "Distance units:" +msgstr "Jednotka vzdálenosti:" + +#: ../src/globals.c:78 +msgid "Speed units:" +msgstr "Jednotka rychlosti:" + +#: ../src/globals.c:79 +msgid "Height units:" +msgstr "Jednotka výšky:" + +#: ../src/globals.c:80 +msgid "Use large waypoint icons:" +msgstr "Velké ikony místa:" + +#: ../src/globals.c:81 +msgid "Default latitude:" +msgstr "Výchozí zem. šířka:" + +#: ../src/globals.c:82 +msgid "Default longitude:" +msgstr "Výchozí zem. délka:" + +#: ../src/globals.c:83 +msgid "Time Display:" +msgstr "" + +#: ../src/globals.c:84 +msgid "" +"Display times according to the reference frame. Locale is the user's system " +"setting. World is relative to the location of the object." +msgstr "" + +#: ../src/globals.c:90 +msgid "Alphabetical" +msgstr "abecedně" + +#: ../src/globals.c:90 ../src/datasource_osm_my_traces.c:432 +msgid "Time" +msgstr "dle času" + +#: ../src/globals.c:90 +msgid "Creation" +msgstr "dle vytvoření" + +#: ../src/globals.c:91 +msgid "Title Case" +msgstr "počáteční velká" + +#: ../src/globals.c:91 +msgid "Lowercase" +msgstr "malá písmena" + +#: ../src/globals.c:94 +msgid "KML File Export Units:" +msgstr "Jednotky v KML exportu" + +#: ../src/globals.c:95 +msgid "GPX Track Order:" +msgstr "řadit GPX stopy" + +#: ../src/globals.c:96 +msgid "GPX Waypoint Symbols:" +msgstr "GPX názvy symbolů" + +#: ../src/globals.c:97 +msgid "" +"Save GPX Waypoint Symbol names in the specified case. May be useful for " +"compatibility with various devices" +msgstr "" +"Uložit GPX místa s velkými, nebo malými písmeny. Může zvýšit kompatibilitu s " +"různými zařízeními." + +#: ../src/globals.c:98 +#, fuzzy +msgid "GPX Creator:" +msgstr "dle vytvoření" + +#: ../src/globals.c:99 +msgid "" +"The creator value when writing a GPX file. Otherwise when blank a default is " +"used." +msgstr "" + +#: ../src/globals.c:104 +msgid "Image Viewer:" +msgstr "Prohlížeč obrázků" + +#: ../src/globals.c:109 +msgid "External GPX Program 1:" +msgstr "externí GPX program 1" + +#: ../src/globals.c:110 +msgid "External GPX Program 2:" +msgstr "externí GPX program 2" + +#: ../src/globals.c:113 +msgid "Absolute" +msgstr "absolutní" + +#: ../src/globals.c:113 +msgid "Relative" +msgstr "relativní" + +#: ../src/globals.c:117 +msgid "Save File Reference Mode:" +msgstr "Způsob odkazů na soubory" + +#: ../src/globals.c:118 +msgid "" +"When saving a Viking .vik file, this determines how the directory paths of " +"filenames are written." +msgstr "" +"Rozhoduje, zda jsou cesty k adresářům ve viking souboru zapsány jako " +"absolutní, nebo relativní." + +#: ../src/globals.c:119 +msgid "Ask for Name before Track Creation:" +msgstr "" + +#: ../src/globals.c:120 +msgid "Show Tooltip during Track Creation:" +msgstr "Zobrazit nápovědu při vytváření stopy:" + +#: ../src/globals.c:121 +msgid "The number of recent files:" +msgstr "" + +#: ../src/globals.c:122 +msgid "" +"Only applies to new windows or on application restart. -1 means all " +"available files." +msgstr "" + +#: ../src/globals.c:123 +#, fuzzy +msgid "Open files in selected layer:" +msgstr "Smazat vrstvu" + +#: ../src/globals.c:124 +msgid "Open files (but not .vik ones) into the selected TrackWaypoint layer." +msgstr "" + +#: ../src/globals.c:125 +msgid "Show calendar day names:" +msgstr "" + +#: ../src/globals.c:128 +msgid "Home Location" +msgstr "výchozí místo" + +#: ../src/globals.c:128 +msgid "Last Location" +msgstr "poslední pozice" + +#: ../src/globals.c:128 +msgid "Specified File" +msgstr "spouštěcí soubor" + +#: ../src/globals.c:128 +msgid "Auto Location" +msgstr "automatická poloha" + +#: ../src/globals.c:131 +msgid "Restore Window Setup:" +msgstr "Obnovení nastavení okna:" + +#: ../src/globals.c:132 +msgid "Restore window size and layout" +msgstr "Obnovení velikosti a uspořádání okna" + +#: ../src/globals.c:133 +msgid "Add a Default Map Layer:" +msgstr "Přidej výchozí mapovou vrstvu:" + +#: ../src/globals.c:134 +msgid "" +"The default map layer added is defined by the Layer Defaults. Use the menu " +"Edit->Layer Defaults->Map... to change the map type and other values." +msgstr "" +"Výchozí mapa a další výchozí nastavení jsou předefinovány v Upravit-" +">Výchozí nastevení vrstev->Mapa." + +#: ../src/globals.c:135 +msgid "Startup Method:" +msgstr "Metoda spuštění:" + +#: ../src/globals.c:136 +msgid "Startup File:" +msgstr "Spouštěcí soubor:" + +#: ../src/globals.c:137 +msgid "" +"The default file to load on startup. Only applies when the startup method is " +"set to 'Specified File'" +msgstr "" +"Výchozí soubor nastavení. Použit pouze pokud je metoda spuštění nastavena na " +"'Spouštěcí soubor'" + +#: ../src/globals.c:138 +msgid "Check For New Version:" +msgstr "Kontrola nové verze:" + +#: ../src/globals.c:139 +msgid "Periodically check to see if a new version of Viking is available" +msgstr "Pravidelná kontrola dostupnosti nové verze" + +#. Defaults for the options are setup here +#: ../src/globals.c:176 +msgid "General" +msgstr "Obecné" + +#. New Tab +#: ../src/globals.c:204 +msgid "Startup" +msgstr "Spuštění" + +#. New Tab +#: ../src/globals.c:222 +msgid "Export/External" +msgstr "Export/Externí" + +#. 'Advanced' Properties +#: ../src/globals.c:249 +msgid "Advanced" +msgstr "Pokročilé" + +#. Webtools +#: ../src/google.c:39 +msgid "Google" +msgstr "Google" + +#. If there is an actual description field it will overwrite this value +#: ../src/gpx.c:264 +#, c-format +msgid "Created by: %s" +msgstr "" + +#: ../src/datasource_bfilter.c:43 +msgid "Max number of points:" +msgstr "Maximální počet bodů:" + +#: ../src/datasource_bfilter.c:84 +msgid "Simplify All Tracks..." +msgstr "Redukce bodů všech stop.." + +#: ../src/datasource_bfilter.c:85 +msgid "Simplified Tracks" +msgstr "Zjednodušené stopy" + +#. { VIK_LAYER_NUM_TYPES, "compressmethod", VIK_LAYER_PARAM_UINT, VIK_LAYER_GROUP_NONE, N_("Simplify Method:"), VIK_LAYER_WIDGET_COMBOBOX, compress_method, NULL, NULL, NULL, NULL, NULL }, +#: ../src/datasource_bfilter.c:111 +msgid "Error Factor:" +msgstr "" + +#: ../src/datasource_bfilter.c:112 +msgid "" +"Specifies the maximum allowable error that may be introduced by removing a " +"single point by the crosstrack method. See the manual or GPSBabel Simplify " +"Filter documentation for more detail." +msgstr "" + +#: ../src/datasource_bfilter.c:166 +msgid "Compress Tracks..." +msgstr "" + +#: ../src/datasource_bfilter.c:167 +msgid "Compressed Tracks" +msgstr "" + +#: ../src/datasource_bfilter.c:197 ../src/datasource_bfilter.c:198 +msgid "Remove Duplicate Waypoints" +msgstr "Odstranit duplicitní místa" + +#: ../src/datasource_bfilter.c:221 +msgid "Manual filter:" +msgstr "" + +#: ../src/datasource_bfilter.c:222 +msgid "Manual filter command: e.g. 'swap'." +msgstr "" + +#: ../src/datasource_bfilter.c:233 ../src/datasource_bfilter.c:234 +msgid "Manual filter" +msgstr "" + +#: ../src/datasource_bfilter.c:262 +msgid "Waypoints Inside This" +msgstr "Místa v" + +#: ../src/datasource_bfilter.c:263 ../src/datasource_bfilter.c:292 +msgid "Polygonized Layer" +msgstr "Polygonizovaná vrstva" + +#: ../src/datasource_bfilter.c:291 +msgid "Waypoints Outside This" +msgstr "Místa mimo" + +#: ../src/datasource_file.c:61 +msgid "Import file with GPSBabel" +msgstr "Importovat soubor pomocí GPSBabel" + +#: ../src/datasource_file.c:62 +msgid "Imported file" +msgstr "Importovaný soubor" + +#. The file selector +#: ../src/datasource_file.c:129 +msgid "File:" +msgstr "Soubor:" + +#: ../src/datasource_file.c:130 +msgid "File to import" +msgstr "Soubor pro importování" + +#: ../src/datasource_file.c:137 +msgid "All files" +msgstr "Všechny soubory" + +#. The file format selector +#: ../src/datasource_file.c:144 ../src/datasource_url.c:106 +msgid "File type:" +msgstr "Typ souboru:" + +#: ../src/datasource_file.c:189 +#, c-format +msgid "using babel args '%s' and file '%s'" +msgstr "babel argumenty '%s' soubor '%s'" + +#: ../src/datasource_gc.c:67 +msgid "Download Geocaches" +msgstr "Stáhnout Geocache" + +#: ../src/datasource_gc.c:68 +msgid "Geocaching.com Caches" +msgstr "Geocaching.com cache" + +#: ../src/datasource_gc.c:86 +msgid "geocaching.com username:" +msgstr "geocaching.com uživatel:" + +#: ../src/datasource_gc.c:87 +msgid "geocaching.com password:" +msgstr "geocaching.com heslo:" + +#: ../src/datasource_gc.c:92 ../src/vikwindow.c:3502 +msgid "Geocaching" +msgstr "Geocaching" + +#: ../src/datasource_gc.c:128 +#, c-format +msgid "" +"Can't find %s or %s in path! Check that you have installed it correctly." +msgstr "" +"%s ani %s nenalezeno v cestě pro spuštění, zkontrolujte zda je korektně " +"nainstalováno." + +#: ../src/datasource_gc.c:190 +msgid "Number geocaches:" +msgstr "Počet geocache:" + +#: ../src/datasource_gc.c:192 +msgid "Centered around:" +msgstr "Centrovat okolo:" + +#: ../src/datasource_gc.c:231 +msgid "Broken input - using some defaults" +msgstr "Chybný vstup, používájí se výchozí hodnoty" + +#: ../src/datasource_geotag.c:51 +msgid "Create Waypoints from Geotagged Images" +msgstr "Vytvořit místa z geotagovaných obrázků" + +#: ../src/datasource_geotag.c:52 +msgid "Geotagged Images" +msgstr "Obrázky s GPS souřadnicemi" + +#: ../src/datasource_geotag.c:102 ../src/datasource_geojson.c:93 +#: ../src/vikfileentry.c:171 ../src/vikwindow.c:3533 ../src/vikwindow.c:3610 +#: ../src/vikwindow.c:3641 ../src/vikwindow.c:4356 ../src/vikwindow.c:4649 +msgid "All" +msgstr "Vše" + +#: ../src/datasource_geotag.c:107 ../src/vikfileentry.c:115 +#: ../src/viktrwlayer_geotag.c:637 ../src/vikwindow.c:3518 +#: ../src/vikwindow.c:4377 +msgid "JPG" +msgstr "JPG" + +#: ../src/datasource_geotag.c:168 +#, c-format +msgid "Unable to create waypoint from %s" +msgstr "Nelze vytvořit místo z %s" + +#: ../src/datasource_geojson.c:46 +msgid "Acquire from GeoJSON" +msgstr "" + +#: ../src/datasource_geojson.c:47 ../src/datasource_geojson.c:98 +msgid "GeoJSON" +msgstr "" + +#: ../src/datasource_geojson.c:152 +#, c-format +msgid "Unable to import from: %s" +msgstr "" + +#: ../src/datasource_gps.c:54 +msgid "Acquire from GPS" +msgstr "Stahuji z GPS" + +#: ../src/datasource_gps.c:55 +msgid "Acquired from GPS" +msgstr "Staženo z GPS" + +#: ../src/datasource_gps.c:258 +#, c-format +msgid "using cmd '%s' and file '%s'\n" +msgstr "" + +#: ../src/datasource_gps.c:353 ../src/vikgpslayer.c:966 +#, c-format +msgid "Downloading %d waypoint..." +msgid_plural "Downloading %d waypoints..." +msgstr[0] "Stahuji %d místo..." +msgstr[1] "Stahuji %d místa..." +msgstr[2] "Stahuji %d míst..." + +#: ../src/datasource_gps.c:358 ../src/vikgpslayer.c:971 +#, c-format +msgid "Downloading %d trackpoint..." +msgid_plural "Downloading %d trackpoints..." +msgstr[0] "Stahuji %d bod..." +msgstr[1] "Stahuji %d body..." +msgstr[2] "Stahuji %d bodů ..." + +#: ../src/datasource_gps.c:363 ../src/vikgpslayer.c:976 +#, c-format +msgid "Downloading %d routepoint..." +msgid_plural "Downloading %d routepoints..." +msgstr[0] "Stahování %d bodu..." +msgstr[1] "Stahování %d bodů..." +msgstr[2] "Stahování %d bodů..." + +#: ../src/datasource_gps.c:386 ../src/datasource_gps.c:393 +#: ../src/datasource_gps.c:400 +#, c-format +msgid "Downloaded %d out of %d %s..." +msgstr "Staženo %d z %d %s..." + +#: ../src/datasource_gps.c:388 ../src/datasource_gps.c:395 +#: ../src/datasource_gps.c:402 +#, c-format +msgid "Downloaded %d %s." +msgstr "Staženo %d %s." + +#: ../src/datasource_gps.c:416 ../src/vikgpslayer.c:1134 +#, c-format +msgid "GPS Device: %s" +msgstr "GPS zařízení: %s" + +#: ../src/datasource_gps.c:428 ../src/vikgpslayer.c:1214 +msgid "Status: Working..." +msgstr "Status: Pracuji..." + +#. NB gps_layer_inst_init() is performed after parameter registeration +#. thus to give the protocols some potential values use the old static list +#. TODO: find another way to use gps_layer_inst_init()? +#: ../src/datasource_gps.c:584 ../src/vikgpslayer.c:216 +msgid "GPS Protocol:" +msgstr "GPS protokol:" + +#. List reassigned at runtime +#: ../src/datasource_gps.c:609 ../src/vikgpslayer.c:217 +msgid "Serial Port:" +msgstr "Sériový port:" + +#: ../src/datasource_gps.c:659 +msgid "" +"Turn Off After Transfer\n" +"(Garmin/NAViLink Only)" +msgstr "" +"Vypnout po přesunu dat\n" +"(Garmin/NAViLink Only)" + +#: ../src/datasource_gps.c:666 +msgid "Tracks:" +msgstr "Stopy:" + +#: ../src/datasource_gps.c:673 +msgid "Routes:" +msgstr "Trasy:" + +#: ../src/datasource_gps.c:680 +msgid "Waypoints:" +msgstr "Místa:" + +#: ../src/datasource_gps.c:756 ../src/vikgpslayer.c:1509 +msgid "GPS device: N/A" +msgstr "GPS zařízení: N/A" + +#: ../src/datasource_osm.c:53 ../src/datasource_osm.c:54 +msgid "OSM traces" +msgstr "OSM záznamy" + +#: ../src/datasource_osm.c:89 +msgid "Page number:" +msgstr "Číslo stránky:" + +#: ../src/datasource_osm_my_traces.c:59 ../src/datasource_osm_my_traces.c:60 +msgid "OSM My Traces" +msgstr "Moje OSM záznamy" + +#: ../src/datasource_osm_my_traces.c:106 ../src/osm-traces.c:684 +#, fuzzy +msgid "Email/username:" +msgstr "Uživatelské jméno:" + +#: ../src/datasource_osm_my_traces.c:111 +msgid "The email or username used to login to OSM" +msgstr "Uživatelské jméno nebo email k přihlášení do OSM" + +#: ../src/datasource_osm_my_traces.c:113 ../src/osm-traces.c:692 +msgid "Password:" +msgstr "Heslo:" + +#: ../src/datasource_osm_my_traces.c:116 +msgid "The password used to login to OSM" +msgstr "Heslo k přihlášení do OSM" + +#: ../src/datasource_osm_my_traces.c:427 ../src/viktrwlayer.c:689 +msgid "Description" +msgstr "Popis" + +#: ../src/datasource_osm_my_traces.c:442 +msgid "Privacy" +msgstr "Ochrana osobních údajů" + +#: ../src/datasource_osm_my_traces.c:449 +msgid "Within Current View" +msgstr "V tomto pohledu" + +#: ../src/datasource_osm_my_traces.c:516 +msgid "GPS Traces" +msgstr "GPS trasy" + +#: ../src/datasource_osm_my_traces.c:518 +msgid "None found!" +msgstr "Nenalezeno!" + +#: ../src/datasource_osm_my_traces.c:569 +msgid "Ensure the OSM access token preferences are setup." +msgstr "" + +#: ../src/datasource_osm_my_traces.c:645 +msgid "My OSM Traces" +msgstr "Moje OSM záznamy" + +#. Report errors to the status bar +#: ../src/datasource_osm_my_traces.c:667 +#, c-format +msgid "Unable to get trace: %s" +msgstr "Nelze stáhnout trasu: %s" + +#: ../src/datasource_routing.c:56 ../src/datasource_routing.c:57 +msgid "Directions" +msgstr "Plán trasy" + +#: ../src/datasource_routing.c:90 +msgid "No routing engines with directions available" +msgstr "" + +#. Engine selector +#: ../src/datasource_routing.c:99 +msgid "Engine:" +msgstr "Zdroj :" + +#. From and To entries +#: ../src/datasource_routing.c:104 +msgid "From:" +msgstr "Z:" + +#: ../src/datasource_routing.c:105 +msgid "To:" +msgstr "Do:" + +#: ../src/datasource_url.c:48 +msgid "Acquire from URL" +msgstr "" + +#: ../src/datasource_url.c:49 +msgid "URL" +msgstr "" + +#: ../src/datasource_url.c:101 +msgid "URL:" +msgstr "" + +#. Only GPX (not using GPSbabel) +#: ../src/datasource_url.c:133 ../src/vikfileentry.c:161 +#: ../src/vikwindow.c:3513 ../src/vikwindow.c:3603 +msgid "GPX" +msgstr "GPX" + +#: ../src/datasource_wikipedia.c:32 +msgid "Create Waypoints from Wikipedia Articles" +msgstr "místa z Wikipedie" + +#: ../src/datasource_wikipedia.c:33 +msgid "Wikipedia Waypoints" +msgstr "Místa z Wikipedie" + +#: ../src/dem.c:66 ../src/dem.c:80 +msgid "Invalid DEM" +msgstr "Špatný DEM" + +#: ../src/dem.c:122 +msgid "Invalid DEM header" +msgstr "Špatná hlavička DEM" + +#: ../src/dem.c:191 ../src/dem.c:204 +msgid "Incorrect DEM Class B record: expected 1" +msgstr "Špatný DEM Class B záznam: očekávám 1" + +#: ../src/dem.c:289 ../src/download.c:176 +#, c-format +msgid "Couldn't map file %s: %s" +msgstr "Nelze zpracovat soubor %s: %s" + +#: ../src/download.c:130 +msgid "Tile age (days):" +msgstr "Stáří mapových dlaždic (dny):" + +#: ../src/download.c:406 +#, c-format +msgid "Download error: %s" +msgstr "Chyba stahování: %s" + +#: ../src/download.c:490 +msgid "couldn't open temp file" +msgstr "nelze otevřít dočasný soubor" + +#: ../src/file.c:458 ../src/file.c:463 +#, c-format +msgid "Draw mode '%s' no more supported" +msgstr "Zobrazovací režim '%s' již není podporován" + +#: ../src/geotag_exif.c:621 +msgid "Not enough memory." +msgstr "Nedostatek paměti." + +#: ../src/geotag_exif.c:639 +msgid "Setting a value for this tag is unsupported!" +msgstr "Nastavení hodnoty z tohoto údaje není podporováno!" + +#: ../src/geotag_exif.c:658 +#, c-format +msgid "Too few components specified (need %d, found %d)\n" +msgstr "Příliš málo zadaných komponent (nutno %d, nalezeno %d)\n" + +#: ../src/geotag_exif.c:662 +msgid "Numeric value expected\n" +msgstr "Očekávám číslo\n" + +#: ../src/geotag_exif.c:670 +msgid "This shouldn't happen!" +msgstr "To by nemělo nastat!" + +#: ../src/geotag_exif.c:740 +msgid "Not yet implemented!" +msgstr "Zatím není naprogramované!" + +#: ../src/geotag_exif.c:753 +msgid "Warning; Too many components specified!" +msgstr "Varování: Přiliš mnoho komponentů!" + +#: ../src/osm-traces.c:87 +msgid "Identifiable (public w/ timestamps)" +msgstr "Identifikovatelný (veřejný, body s časovou značkou)" + +#: ../src/osm-traces.c:88 +msgid "Trackable (private w/ timestamps)" +msgstr "Sledovatelný (anonymní, body s časovou značkou)" + +#: ../src/osm-traces.c:89 +msgid "Public" +msgstr "Veřejný" + +#: ../src/osm-traces.c:90 +msgid "Private" +msgstr "Soukromý" + +#: ../src/osm-traces.c:108 +msgid "Access Token:" +msgstr "" + +#: ../src/osm-traces.c:108 +msgid "Get New OSM Access Tokens" +msgstr "" + +#: ../src/osm-traces.c:109 +msgid "Access Token Key:" +msgstr "" + +#: ../src/osm-traces.c:110 +msgid "Access Token Secret:" +msgstr "" + +#: ../src/osm-traces.c:111 +msgid "OSM username:" +msgstr "OSM uživatel:" + +#: ../src/osm-traces.c:112 +msgid "OSM password:" +msgstr "OSM heslo:" + +#. Check to really override existing values... +#: ../src/osm-traces.c:263 +msgid "Do you want to overwrite existing values?" +msgstr "" + +#: ../src/osm-traces.c:275 +msgid "Not able to generate OSM request tokens." +msgstr "" + +#: ../src/osm-traces.c:299 +msgid "" +"Waiting for authorization approval.\n" +"Ensure you have granted access at the website before continuing here." +msgstr "" + +#: ../src/osm-traces.c:315 +#, fuzzy +msgid "No Authorization." +msgstr "automatická poloha" + +#: ../src/osm-traces.c:354 +msgid "" +"OSM Username and Password preferences are not required anymore. You can now " +"remove them." +msgstr "" + +#. Preferences +#: ../src/osm-traces.c:379 +msgid "OpenStreetMap Traces" +msgstr "OpenStreetMap trasy" + +#: ../src/osm-traces.c:504 +#, c-format +msgid "failed to upload data: HTTP response is %ld" +msgstr "chyba při nahrávání dat: HTTP odpověď %ld" + +#: ../src/osm-traces.c:509 +#, c-format +msgid "curl_easy_getinfo failed: %d" +msgstr "curl_easy_getinfo selhalo: %d" + +#: ../src/osm-traces.c:514 +#, c-format +msgid "curl request failed: %s" +msgstr "požadavek curl selhal: %s" + +#. Success +#: ../src/osm-traces.c:592 +msgid "Uploaded to OSM" +msgstr "Nahráno do OSM" + +#: ../src/osm-traces.c:596 +msgid "" +"FAILED TO UPLOAD DATA TO OSM - Ensure the OSM access token preferences are " +"setup." +msgstr "" + +#: ../src/osm-traces.c:599 +msgid "FAILED TO UPLOAD DATA TO OSM - CURL PROBLEM" +msgstr "Selhalo nahrání do OSM - chyba curl" + +#: ../src/osm-traces.c:602 +msgid "FAILED TO UPLOAD DATA TO OSM" +msgstr "Selhalo nahrání do OSM" + +#: ../src/osm-traces.c:602 +msgid "HTTP response code" +msgstr "HTTP návratová hodnota" + +#: ../src/osm-traces.c:610 +#, c-format +msgid "failed to unlink temporary file: %s" +msgstr "nelze smazat dočasné soubory: %s" + +#: ../src/osm-traces.c:664 +msgid "OSM upload" +msgstr "nahrání do OSM" + +#: ../src/osm-traces.c:689 +#, fuzzy +msgid "" +"The email/username used as login\n" +"Enter the email/username you use to login into www.openstreetmap.org." +"" +msgstr "" +"Uživatelské jméno:\n" +"Zadejte email pro přihlášení na www.openstreetmap.org." + +#: ../src/osm-traces.c:697 +msgid "" +"The password used to login\n" +"Enter the password you use to login into www.openstreetmap.org." +msgstr "" +"Heslo\n" +"Zadejte heslo pro přihlášení na www.openstreetmap.org." + +#: ../src/osm-traces.c:703 +msgid "File's name:" +msgstr "Jméno souboru:" + +#: ../src/osm-traces.c:713 +msgid "" +"The name of the file on OSM\n" +"This is the name of the file created on the server.This is not the " +"name of the local file." +msgstr "" +"Jméno souboru\n" +"Jak bude pojmenován soubor na www.openstreetmap.org " + +#: ../src/osm-traces.c:717 ../src/viktrwlayer_wpwin.c:197 +#: ../src/viktrwlayer_wpwin.c:199 +msgid "Description:" +msgstr "Popis:" + +#: ../src/osm-traces.c:731 +msgid "The description of the trace" +msgstr "Popis logu trasy" + +#: ../src/osm-traces.c:734 +msgid "Anonymize Times:" +msgstr "anonymizovat časy:" + +#: ../src/osm-traces.c:739 +msgid "" +"Anonymize times of the trace.\n" +"You may choose to make the trace identifiable, yet mask the actual " +"real time values" +msgstr "" +"anonymizovat časy bodů stopy.\n" +"Lze vybrat aby bylo možné stopy identifikovat, ale zároveň maskovat " +"skutečný čas průchodu. Začátek stopy se posune od 1.1.1901 1:00:00" + +#: ../src/osm-traces.c:743 +msgid "Tags:" +msgstr "Tagy:" + +#: ../src/osm-traces.c:751 +msgid "The tags associated to the trace" +msgstr "Tagy přiřazené k trase" + +#: ../src/osm-traces.c:816 +#, c-format +msgid "Uploading %s to OSM" +msgstr "Nahrávám %s na OSM" + +#: ../src/mapcache.c:67 +msgid "Map cache memory size (MB):" +msgstr "Cache pro mapy (MB):" + +#. NB Can have a couple hundred fonts loaded when using system directories +#. So ATM don't list them all - otherwise need better GUI feedback display. +#: ../src/mapnik_interface.cpp:324 +#, c-format +msgid "" +"%s %s\n" +"Plugins=%sFonts loaded=%d" +msgstr "" + +#: ../src/mapnik_interface.cpp:325 ../src/vikmapniklayer.c:278 +msgid "Mapnik" +msgstr "" + +#: ../src/print.c:51 ../src/viktrwlayer.c:572 +msgid "None" +msgstr "Žádné" + +#: ../src/print.c:52 +msgid "Horizontally" +msgstr "Vodorovně" + +#: ../src/print.c:53 +msgid "Vertically" +msgstr "Svisle" + +#: ../src/print.c:54 +msgid "Both" +msgstr "V obou osách" + +#: ../src/print.c:118 +msgid "Image Settings" +msgstr "Nastavení obrázku" + +#: ../src/print.c:551 +msgid "done" +msgstr "hotovo" + +#. Page Size +#: ../src/print.c:580 +msgid "_Adjust Page Size and Orientation" +msgstr "_Upravit velikost stránky a orientaci" + +#: ../src/print.c:596 +msgid "C_enter:" +msgstr "Uprostř_ed:" + +#. ignore page margins +#: ../src/print.c:614 +msgid "Ignore Page _Margins" +msgstr "Ignorovat okraje _stránky" + +#: ../src/print.c:633 +msgid "Image S_ize:" +msgstr "Velikost obrázku" + +#: ../src/ui_util.c:88 +#, c-format +msgid "Could not launch web browser. %s" +msgstr "Nelze spustit prohlížeč. %s" + +#: ../src/ui_util.c:101 +#, c-format +msgid "Could not create new email. %s" +msgstr "Nelze vytvořit nový mail. %s" + +#: ../src/vikcoordlayer.c:57 +msgid "Color:" +msgstr "Barva:" + +#: ../src/vikcoordlayer.c:58 +msgid "Minutes Width:" +msgstr "Šířka v minutách:" + +#: ../src/vikcoordlayer.c:59 +msgid "Line Thickness:" +msgstr "Šířka čary:" + +#: ../src/vikcoordlayer.c:66 +msgid "Coordinate" +msgstr "Souřadnicová" + +#: ../src/main.c:92 +#, c-format +msgid "Ignoring Xlib error: error code %d request code %d\n" +msgstr "Xlib error: error kód %d kód požadavku %d\n" + +#: ../src/main.c:111 +msgid "Enable debug output" +msgstr "Povolit ladící výstup" + +#: ../src/main.c:112 +msgid "Enable verbose output" +msgstr "Povolit podrobný výstup" + +#: ../src/main.c:113 +msgid "Show version" +msgstr "Ukáže verzi" + +#: ../src/main.c:114 +msgid "Latitude in decimal degrees" +msgstr "" + +#: ../src/main.c:115 +msgid "Longitude in decimal degrees" +msgstr "" + +#: ../src/main.c:116 +msgid "Zoom Level (OSM). Value can be 0 - 22" +msgstr "" + +#: ../src/main.c:117 +msgid "Add a map layer by id value. Use 0 for the default map." +msgstr "" + +#: ../src/main.c:160 +#, c-format +msgid "" +"%s %s\n" +"Copyright (c) 2003-2008 Evan Battaglia\n" +"Copyright (c) 2008-%s Viking's contributors\n" +msgstr "" + +#: ../src/osm.c:50 +#, fuzzy +msgid "OpenStreetMap (Mapnik)" +msgstr "OpenStreetMap trasy" + +#: ../src/osm.c:65 +#, fuzzy +msgid "OpenStreetMap (Cycle)" +msgstr "OpenStreetMap trasy" + +#: ../src/osm.c:79 +#, fuzzy +msgid "OpenStreetMap (Transport)" +msgstr "OpenStreetMap trasy" + +#: ../src/osm.c:95 +#, fuzzy +msgid "OpenStreetMap (Humanitarian)" +msgstr "OpenStreetMap trasy" + +#: ../src/osm.c:111 +msgid "On Disk OSM Tile Format" +msgstr "" + +#: ../src/osm.c:121 +msgid "MBTiles File" +msgstr "" + +#: ../src/osm.c:132 +msgid "OSM Metatiles" +msgstr "" + +#: ../src/osm.c:146 +msgid "Mapbox Outdoors" +msgstr "" + +#: ../src/osm.c:153 +msgid "Mapbox Specific" +msgstr "" + +#: ../src/osm.c:170 +msgid "OSM (view)" +msgstr "OpenStreetMap (náhled)" + +#: ../src/osm.c:174 +msgid "OSM (edit)" +msgstr "OpenStreetMap (editace)" + +#. Note the use of positional parameters +#: ../src/osm.c:179 +msgid "OSM (query)" +msgstr "" + +#: ../src/osm.c:183 +msgid "OSM (render)" +msgstr "OpenStreetMap (výstup)" + +#. Example: http://127.0.0.1:8111/load_and_zoom?left=8.19&right=8.20&top=48.605&bottom=48.590&select=node413602999 +#. JOSM or merkaartor must already be running with remote interface enabled +#: ../src/osm.c:190 +msgid "Local port 8111 (eg JOSM)" +msgstr "Lokální port 8111 (např. JOSM)" + +#: ../src/osm.c:195 +msgid "Geofabrik Map Compare" +msgstr "" + +#: ../src/osm.c:203 +msgid "OpenStreetMap Notes" +msgstr "OpenStreetMap poznámky" + +#. Not really OSM but can't be bothered to create somewhere else to put it... +#: ../src/osm.c:221 +msgid "Wikimedia Toolserver GeoHack" +msgstr "Wikimedia Toolserver GeoHack" + +#: ../src/preferences.c:195 +msgid "Preferences" +msgstr "Nastavení" + +#: ../src/toolbar.c:91 ../src/toolbar.c:92 +msgid "System Default" +msgstr "" + +#: ../src/toolbar.c:91 ../src/viktrwlayer.c:563 +msgid "Small" +msgstr "malý" + +#: ../src/toolbar.c:91 ../src/viktrwlayer.c:564 +msgid "Medium" +msgstr "střední" + +#: ../src/toolbar.c:91 ../src/viktrwlayer.c:565 +msgid "Large" +msgstr "větší" + +#: ../src/toolbar.c:92 +msgid "Icons Only" +msgstr "" + +#: ../src/toolbar.c:92 +msgid "Text Only" +msgstr "" + +#: ../src/toolbar.c:92 +msgid "Icons and Text" +msgstr "" + +#: ../src/toolbar.c:106 +msgid "Append to Menu:" +msgstr "" + +#: ../src/toolbar.c:107 +msgid "Pack the toolbar to the main menu to save vertical space" +msgstr "" + +#: ../src/toolbar.c:108 +msgid "Icon Size:" +msgstr "" + +#: ../src/toolbar.c:110 +msgid "Icon Style:" +msgstr "" + +#: ../src/toolbar.c:112 +msgid "Customize:" +msgstr "" + +#: ../src/toolbar.c:112 +msgid "Customize Buttons" +msgstr "" + +#. Preferences +#: ../src/toolbar.c:145 +msgid "Toolbar" +msgstr "" + +#: ../src/toolbar.c:312 +msgid "_Customize" +msgstr "" + +#: ../src/toolbar.c:641 +msgid "Separator" +msgstr "" + +#: ../src/toolbar.c:642 +msgid "--- Separator ---" +msgstr "" + +#: ../src/toolbar.c:1007 +msgid "Customize Toolbar" +msgstr "" + +#: ../src/toolbar.c:1028 +msgid "" +"Select items to be displayed on the toolbar. Items can be reordered by drag " +"and drop." +msgstr "" + +#: ../src/toolbar.c:1044 +msgid "Available Items" +msgstr "" + +#: ../src/toolbar.c:1065 +msgid "Displayed Items" +msgstr "" + +#: ../src/viklayer_defaults.c:232 +#, c-format +msgid "Could not open file: %s" +msgstr "Nelze otevřít soubor: %s" + +#: ../src/viklayer_defaults.c:304 +msgid "Layer Defaults" +msgstr "Výchozí nastavení vrstvy" + +#: ../src/uibuilder.c:196 +msgid "Take care that this password will be stored clearly in a plain file." +msgstr "Heslo bude uloženo nešifrovaně v souboru." + +#: ../src/uibuilder.c:628 ../src/viktrwlayer_export.c:188 +#: ../src/viktrwlayer_export.c:304 ../src/vikwindow.c:3666 +#: ../src/vikwindow.c:4408 +#, c-format +msgid "The file \"%s\" exists, do you wish to overwrite it?" +msgstr "Soubor \"%s\" existuje, přepsat?" + +#: ../src/vikaggregatelayer.c:41 +msgid "Aggregate" +msgstr "Spojovací" + +#: ../src/vikaggregatelayer.c:528 ../src/viktrwlayer.c:11700 +#, c-format +msgid "%s: Waypoint List" +msgstr "" + +#: ../src/vikaggregatelayer.c:570 +msgid "Search by Date" +msgstr "" + +#: ../src/vikaggregatelayer.c:576 +msgid "No items found with the requested date." +msgstr "" + +#: ../src/vikaggregatelayer.c:615 ../src/viktrwlayer.c:11691 +#, c-format +msgid "%s: Track and Route List" +msgstr "%s: Výpis stop and tras" + +#: ../src/vikaggregatelayer.c:681 ../src/viktrwlayer.c:8346 +#: ../src/viktrwlayer.c:8417 ../src/viktrwlayer.c:8494 +msgid "_Visibility" +msgstr "_Zobrazení" + +#: ../src/vikaggregatelayer.c:686 +msgid "_Show All" +msgstr "_Zobrazit vše" + +#: ../src/vikaggregatelayer.c:692 +msgid "_Hide All" +msgstr "_Skrýt vše" + +#: ../src/vikaggregatelayer.c:698 ../src/viktrwlayer.c:8363 +#: ../src/viktrwlayer.c:8434 ../src/viktrwlayer.c:8511 +msgid "_Toggle" +msgstr "Přepnou_t" + +#: ../src/vikaggregatelayer.c:705 ../src/viktrwlayer.c:8532 +msgid "_Sort" +msgstr "_Seřadit" + +#: ../src/vikaggregatelayer.c:711 ../src/viktrwlayer.c:8538 +msgid "Name _Ascending" +msgstr "dle jména" + +#: ../src/vikaggregatelayer.c:717 ../src/viktrwlayer.c:8544 +msgid "Name _Descending" +msgstr "dle jména sestupně" + +#: ../src/vikaggregatelayer.c:723 ../src/viktrwlayer.c:575 +#: ../src/viktrwlayer.c:8550 +msgid "Date Ascending" +msgstr "" + +#: ../src/vikaggregatelayer.c:729 ../src/viktrwlayer.c:576 +#: ../src/viktrwlayer.c:8556 +msgid "Date Descending" +msgstr "" + +#: ../src/vikaggregatelayer.c:735 ../src/viktrwlayer.c:8445 +#: ../src/viktrwlayer.c:8523 ../src/viktrwlayer.c:8595 +#: ../src/viktrwlayer_tracklist.c:296 +msgid "_Statistics" +msgstr "_Statistiky" + +#: ../src/vikaggregatelayer.c:740 ../src/viktrwlayer.c:4533 +msgid "Track _List..." +msgstr "Výpis _stop..." + +#: ../src/vikaggregatelayer.c:746 ../src/viktrwlayer.c:4540 +msgid "_Waypoint List..." +msgstr "" + +#: ../src/vikaggregatelayer.c:753 +msgid "Searc_h" +msgstr "" + +#: ../src/vikaggregatelayer.c:759 +msgid "By _Date..." +msgstr "" + +#: ../src/vikaggregatelayer.c:762 +msgid "Find the first item with a specified date" +msgstr "" + +#: ../src/vikaggregatelayer.c:765 +msgid "Load E_xternal Layers" +msgstr "" + +#. Could have a more complicated tooltip that numbers each type of layers, +#. but for now a simple overall count +#: ../src/vikaggregatelayer.c:1011 +#, c-format +msgid "One layer" +msgid_plural "%d layers" +msgstr[0] "" +msgstr[1] "" + +#: ../src/vikaggregatelayer.c:1014 +#, fuzzy, c-format +msgid "Empty" +msgstr "Smazat _vše" + +#: ../src/vikdemlayer.c:86 +msgid "SRTM Global 90m (3 arcsec)" +msgstr "" + +#: ../src/vikdemlayer.c:94 +msgid "Absolute height" +msgstr "Absolutní výška" + +#: ../src/vikdemlayer.c:95 +msgid "Height gradient" +msgstr "Sklon" + +#: ../src/vikdemlayer.c:120 +msgid "DEM Files:" +msgstr "DEM soubory:" + +#: ../src/vikdemlayer.c:121 +msgid "Download Source:" +msgstr "Zdroj stahování:" + +#: ../src/vikdemlayer.c:122 +msgid "Min Elev Color:" +msgstr "Barva min. výšky:" + +#: ../src/vikdemlayer.c:123 ../src/viktrwlayer_wpwin.c:207 +msgid "Type:" +msgstr "Typ:" + +#: ../src/vikdemlayer.c:124 +msgid "Min Elev:" +msgstr "Výška od:" + +#: ../src/vikdemlayer.c:125 +msgid "Max Elev:" +msgstr "Max výška:" + +#: ../src/vikdemlayer.c:137 +msgid "_DEM Download" +msgstr "Stažení _DEM dat" + +#: ../src/vikdemlayer.c:137 +msgid "DEM Download" +msgstr "Stažení DEM dat" + +#: ../src/vikdemlayer.c:192 +msgid "DEM" +msgstr "DEM" + +#: ../src/vikdemlayer.c:304 +#, c-format +msgid "Number of files: %d" +msgstr "Počet souborů: %d" + +#: ../src/vikdemlayer.c:446 +msgid "DEM Loading" +msgstr "DEM načítání" + +#: ../src/vikdemlayer.c:927 +#, c-format +msgid "No SRTM data available for %f, %f" +msgstr "žádná dostupná SRTM data pro %f, %f" + +#: ../src/vikdemlayer.c:948 +#, c-format +msgid "DEM download failure for %f, %f" +msgstr "" + +#: ../src/vikdemlayer.c:954 +#, c-format +msgid "DEM write failure for %s" +msgstr "" + +#. Probably not over any land... +#: ../src/vikdemlayer.c:1201 +msgid "No DEM File Available" +msgstr "Žádný dostupný DEM soubor" + +#: ../src/vikdemlayer.c:1220 +#, c-format +msgid "" +"\n" +"Source: %s\n" +"\n" +"DEM File: %s\n" +"DEM File Timestamp: %s" +msgstr "" +"\n" +"Zdroj: %s\n" +"\n" +"DEM soubor: %s\n" +"DEM soubor timestamp: %s" + +#: ../src/vikdemlayer.c:1224 +#, c-format +msgid "" +"Source: %s\n" +"\n" +"No DEM File!" +msgstr "" +"Zdroj: %s\n" +"\n" +"Žádný DEM soubor!" + +#: ../src/vikdemlayer.c:1264 +#, c-format +msgid "Downloading DEM %s" +msgstr "Stahuji DEM %s" + +#: ../src/vikdemlayer.c:1289 +msgid "_Show DEM File Information" +msgstr "Zobrazit informace o DEM souboru" + +#: ../src/vikfileentry.c:72 +msgid "Browse..." +msgstr "Procházet..." + +#: ../src/vikfileentry.c:103 +msgid "Choose file" +msgstr "Výběr souboru" + +#: ../src/vikfileentry.c:120 ../src/vikwindow.c:4372 +msgid "PNG" +msgstr "PNG" + +#: ../src/vikfileentry.c:125 +msgid "TIFF" +msgstr "" + +#: ../src/vikfileentry.c:133 +msgid "MBTiles" +msgstr "" + +#: ../src/vikfileentry.c:142 +msgid "XML" +msgstr "" + +#: ../src/vikfileentry.c:149 +msgid "MML" +msgstr "" + +#: ../src/vikfileentry.c:154 +msgid "MSS" +msgstr "" + +#: ../src/vikfilelist.c:49 +msgid "Choose file(s)" +msgstr "Výběr souborů" + +#: ../src/vikfilelist.c:182 +msgid "Add..." +msgstr "Přidat..." + +#: ../src/vikfilelist.c:183 +msgid "Delete" +msgstr "Odstranit" + +#: ../src/vikgeoreflayer.c:97 +msgid "_Georef Move Map" +msgstr "_Georef posun mapy" + +#: ../src/vikgeoreflayer.c:97 +msgid "Georef Move Map" +msgstr "Georef posun mapy" + +#: ../src/vikgeoreflayer.c:106 +msgid "Georef Z_oom Tool" +msgstr "G_eoref přiblížení" + +#: ../src/vikgeoreflayer.c:106 +msgid "Georef Zoom Tool" +msgstr "Georef přiblížení" + +#: ../src/vikgeoreflayer.c:117 +msgid "GeoRef Map" +msgstr "GeoRef mapa" + +#: ../src/vikgeoreflayer.c:214 +msgid "Auto Read World Files:" +msgstr "" + +#: ../src/vikgeoreflayer.c:215 +msgid "" +"Automatically attempt to read associated world file of a new image for a " +"GeoRef layer" +msgstr "" + +#: ../src/vikgeoreflayer.c:511 ../src/vikgeoreflayer.c:797 +#: ../src/vikmapslayer.c:1174 +#, c-format +msgid "Couldn't open image file: %s" +msgstr "Nelze otevřít soubor s obrázkem: %s" + +#: ../src/vikgeoreflayer.c:607 ../src/vikgeoreflayer.c:633 +msgid "Choose World file" +msgstr "Vyberte World soubor" + +#: ../src/vikgeoreflayer.c:619 +msgid "The World file you requested could not be opened for reading." +msgstr "Vybraný World soubor nelze otevřít pro čtení." + +#: ../src/vikgeoreflayer.c:621 +msgid "Unexpected end of file reading World file." +msgstr "Neočekávaný konec World souboru." + +#: ../src/vikgeoreflayer.c:646 +msgid "The file you requested could not be opened for writing." +msgstr "Vybraný World soubor nelze otevřít pro zápis." + +#: ../src/vikgeoreflayer.c:782 +msgid "Lower right corner values may not be consistent with upper right values" +msgstr "" + +#: ../src/vikgeoreflayer.c:806 +#, c-format +msgid "Invalid image size: %s" +msgstr "" + +#: ../src/vikgeoreflayer.c:831 ../src/viklayer.c:561 ../src/vikwindow.c:4891 +msgid "Layer Properties" +msgstr "Vlastnosti vrstvy" + +#: ../src/vikgeoreflayer.c:852 +msgid "World File Parameters:" +msgstr "Parametry World souboru:" + +#: ../src/vikgeoreflayer.c:853 +msgid "Load From File..." +msgstr "Načíst ze souboru..." + +#: ../src/vikgeoreflayer.c:858 +msgid "Corner pixel easting:" +msgstr "Východní rohový bod:" + +#: ../src/vikgeoreflayer.c:860 +msgid "the UTM \"easting\" value of the upper-left corner pixel of the map" +msgstr "" + +#: ../src/vikgeoreflayer.c:862 +msgid "Corner pixel northing:" +msgstr "Severní rohový bod:" + +#: ../src/vikgeoreflayer.c:864 +msgid "the UTM \"northing\" value of the upper-left corner pixel of the map" +msgstr "" + +#: ../src/vikgeoreflayer.c:866 +msgid "X (easting) scale (mpp): " +msgstr "X (východní) měřítko (mmp): " + +#: ../src/vikgeoreflayer.c:867 +msgid "Y (northing) scale (mpp): " +msgstr "Y (severní) měřítko (mpp): " + +#: ../src/vikgeoreflayer.c:870 +msgid "the scale of the map in the X direction (meters per pixel)" +msgstr "měřítko mapy v ose x (metry na pixel)" + +#: ../src/vikgeoreflayer.c:872 +msgid "the scale of the map in the Y direction (meters per pixel)" +msgstr "měřítko mapy v ose y (metry na pixel)" + +#: ../src/vikgeoreflayer.c:874 +msgid "Map Image:" +msgstr "Obrázek s mapou:" + +#: ../src/vikgeoreflayer.c:919 +msgid "Upper left latitude:" +msgstr "" + +#: ../src/vikgeoreflayer.c:921 +msgid "Upper left longitude:" +msgstr "" + +#: ../src/vikgeoreflayer.c:923 +msgid "Lower right latitude:" +msgstr "" + +#: ../src/vikgeoreflayer.c:925 +msgid "Lower right longitude:" +msgstr "" + +#: ../src/vikgeoreflayer.c:937 +msgid "Calculate MPP values from coordinates" +msgstr "" + +#: ../src/vikgeoreflayer.c:938 +msgid "" +"Enter all corner coordinates before calculating the MPP values from the " +"image size" +msgstr "" + +#: ../src/vikgeoreflayer.c:948 +msgid "UTM" +msgstr "" + +#: ../src/vikgeoreflayer.c:949 +msgid "Latitude/Longitude" +msgstr "" + +#: ../src/vikgeoreflayer.c:957 ../src/vikmapniklayer.c:82 +#: ../src/vikmapslayer.c:158 +msgid "Alpha:" +msgstr "Alfa:" + +#. Now with icons +#: ../src/vikgeoreflayer.c:1062 +msgid "_Zoom to Fit Map" +msgstr "_Přiblížit do mapy" + +#: ../src/vikgeoreflayer.c:1068 +msgid "_Goto Map Center" +msgstr "_Jít na střed mapy" + +#: ../src/vikgeoreflayer.c:1074 +msgid "_Export to World File" +msgstr "_Export jako World File" + +#: ../src/vikgoto.c:98 +msgid "No goto tool available." +msgstr "Jít na místo... není dostupné." + +#: ../src/vikgoto.c:295 +msgid "goto" +msgstr "Jít na" + +#: ../src/vikgoto.c:297 +msgid "goto provider:" +msgstr "Jít na... zdroj:" + +#: ../src/vikgoto.c:312 +msgid "Enter address or place name:" +msgstr "Zadejte adresu, nebo jméno místa:" + +#: ../src/vikgoto.c:487 +msgid "Locality" +msgstr "Umístění" + +#: ../src/vikgpslayer.c:137 +msgid "Data Mode" +msgstr "Datový režim" + +#: ../src/vikgpslayer.c:139 +msgid "Realtime Tracking Mode" +msgstr "Režim sledování pozice" + +#: ../src/vikgpslayer.c:176 +msgid "Keep vehicle at center" +msgstr "Držet ve středu obrazovky" + +#: ../src/vikgpslayer.c:177 +msgid "Keep vehicle on screen" +msgstr "Držet vozidlo na obrazovce" + +#: ../src/vikgpslayer.c:178 +msgid "Disable" +msgstr "Zakázat" + +#: ../src/vikgpslayer.c:218 +msgid "Download Tracks:" +msgstr "Stáhnout stopy:" + +#: ../src/vikgpslayer.c:219 +msgid "Upload Tracks:" +msgstr "Nahrát stopy:" + +#: ../src/vikgpslayer.c:220 +msgid "Download Routes:" +msgstr "Stáhnout trasy:" + +#: ../src/vikgpslayer.c:221 +msgid "Upload Routes:" +msgstr "Nahrát trasy:" + +#: ../src/vikgpslayer.c:222 +msgid "Download Waypoints:" +msgstr "Stáhnout místa:" + +#: ../src/vikgpslayer.c:223 +msgid "Upload Waypoints:" +msgstr "Nahrát místa:" + +#: ../src/vikgpslayer.c:225 +msgid "Recording tracks" +msgstr "Zapisuji stopy" + +#: ../src/vikgpslayer.c:226 +msgid "Jump to current position on start" +msgstr "Na začátku skočit na aktuální pozici" + +#: ../src/vikgpslayer.c:227 +msgid "Moving Map Method:" +msgstr "Posun mapy:" + +#: ../src/vikgpslayer.c:228 +msgid "Update Statusbar:" +msgstr "Aktualizace statusbaru:" + +#: ../src/vikgpslayer.c:228 +msgid "Display information in the statusbar on GPS updates" +msgstr "Zobrazí informace při změně GPS údajů" + +#: ../src/vikgpslayer.c:229 +#, fuzzy +msgid "Auto Connect" +msgstr "automatická poloha" + +#: ../src/vikgpslayer.c:229 +msgid "Automatically connect to GPSD" +msgstr "" + +#: ../src/vikgpslayer.c:230 +msgid "Gpsd Host:" +msgstr "Gpsd host:" + +#: ../src/vikgpslayer.c:231 +msgid "Gpsd Port:" +msgstr "Gpsd port:" + +#: ../src/vikgpslayer.c:232 +msgid "Gpsd Retry Interval (seconds):" +msgstr "Opakovat připojení k gpsd po (s):" + +#: ../src/vikgpslayer.c:254 +msgid "GPS" +msgstr "GPS" + +#: ../src/vikgpslayer.c:320 ../src/vikgpslayer.c:1504 +msgid "GPS Download" +msgstr "Stažení z GPS" + +#: ../src/vikgpslayer.c:320 ../src/vikgpslayer.c:1504 ../src/viktrwlayer.c:3993 +msgid "GPS Upload" +msgstr "Nahrání do GPS" + +#: ../src/vikgpslayer.c:322 +msgid "GPS Realtime Tracking" +msgstr "GPS sledování pozice" + +#: ../src/vikgpslayer.c:458 +msgid "Connected" +msgstr "" + +#: ../src/vikgpslayer.c:460 +msgid "Disconnected" +msgstr "" + +#: ../src/vikgpslayer.c:554 +msgid "Unknown GPS Protocol" +msgstr "Neznámý GPS protokol" + +#: ../src/vikgpslayer.c:572 +msgid "Unknown serial port device" +msgstr "Neznámé zařízení pro sériový port" + +#: ../src/vikgpslayer.c:691 +#, c-format +msgid "%s: unknown parameter" +msgstr "%s: neznámý parametr" + +#. Now with icons +#: ../src/vikgpslayer.c:794 +msgid "_Upload to GPS" +msgstr "Nahrát _do GPS" + +#: ../src/vikgpslayer.c:800 +msgid "Download from _GPS" +msgstr "Stáhnout _z GPS" + +#: ../src/vikgpslayer.c:821 +msgid "Empty _Realtime" +msgstr "Smazat _sledování pozice" + +#: ../src/vikgpslayer.c:828 +msgid "E_mpty Upload" +msgstr "Smazat k nahrání" + +#: ../src/vikgpslayer.c:834 +msgid "_Empty Download" +msgstr "Smazat _Download" + +#: ../src/vikgpslayer.c:840 +msgid "Empty _All" +msgstr "Smazat _vše" + +#: ../src/vikgpslayer.c:852 +#, c-format +msgid "Unexpected number of disconnected handlers: %d" +msgstr "Neočekávané množství odpojených popisovačů: %d" + +#: ../src/vikgpslayer.c:995 +#, c-format +msgid "Uploading %d waypoint..." +msgid_plural "Uploading %d waypoints..." +msgstr[0] "Nahrávám %d místo..." +msgstr[1] "Nahrávám %d místa..." +msgstr[2] "Nahrávám %d míst..." + +#: ../src/vikgpslayer.c:1000 +#, c-format +msgid "Uploading %d trackpoint..." +msgid_plural "Uploading %d trackpoints..." +msgstr[0] "Nahrávám %d bod" +msgstr[1] "Nahrávám %d body" +msgstr[2] "Nahrávám %d bodů" + +#: ../src/vikgpslayer.c:1005 +#, c-format +msgid "Uploading %d routepoint..." +msgid_plural "Uploading %d routepoints..." +msgstr[0] "Nahrán %d bod..." +msgstr[1] "Nahrány %d body..." +msgstr[2] "Nahráno %d bodů..." + +#: ../src/vikgpslayer.c:1034 +#, c-format +msgid "Downloaded %d out of %d waypoint..." +msgid_plural "Downloaded %d out of %d waypoints..." +msgstr[0] "Staženo %d z %d místa..." +msgstr[1] "Staženy %d ze %d míst..." +msgstr[2] "Staženo %d z %d míst..." + +#: ../src/vikgpslayer.c:1040 +#, c-format +msgid "Downloaded %d out of %d trackpoint..." +msgid_plural "Downloaded %d out of %d trackpoints..." +msgstr[0] "Stažen %d z %d bodu..." +msgstr[1] "Staženy %d ze %d bodů..." +msgstr[2] "Staženo %d z %d bodů..." + +#: ../src/vikgpslayer.c:1046 +#, c-format +msgid "Downloaded %d out of %d routepoint..." +msgid_plural "Downloaded %d out of %d routepoints..." +msgstr[0] "Stažen %d bod z %d bodu..." +msgstr[1] "Staženy %d body z %d bodů..." +msgstr[2] "Staženy %d bodů z %d bodů..." + +#: ../src/vikgpslayer.c:1056 +#, c-format +msgid "Uploaded %d out of %d waypoint..." +msgid_plural "Uploaded %d out of %d waypoints..." +msgstr[0] "Nahráno %d z %d místa" +msgstr[1] "Nahráno %d z %d míst" +msgstr[2] "Nahráno %d z %d míst" + +#: ../src/vikgpslayer.c:1062 +#, c-format +msgid "Uploaded %d out of %d trackpoint..." +msgid_plural "Uploaded %d out of %d trackpoints..." +msgstr[0] "Nahrán %d z %d bodu..." +msgstr[1] "Nahráno %d z %d bodů..." +msgstr[2] "Nahráno %d z %d bodů..." + +#: ../src/vikgpslayer.c:1068 +#, c-format +msgid "Uploaded %d out of %d routepoint..." +msgid_plural "Uploaded %d out of %d routepoints..." +msgstr[0] "Nahráno %d bod z %d bodu..." +msgstr[1] "Nahrány %d body ze %d bodů..." +msgstr[2] "Nahráno %d bodů z %d bodů..." + +#: ../src/vikgpslayer.c:1079 +#, c-format +msgid "Downloaded %d waypoint" +msgid_plural "Downloaded %d waypoints" +msgstr[0] "Staženo %d místo" +msgstr[1] "Stažena %d místa" +msgstr[2] "Staženo %d míst" + +#: ../src/vikgpslayer.c:1085 +#, c-format +msgid "Downloaded %d trackpoint" +msgid_plural "Downloaded %d trackpoints" +msgstr[0] "Stažen %d bod" +msgstr[1] "Staženy %d body" +msgstr[2] "Staženo %d bodů" + +#: ../src/vikgpslayer.c:1091 +#, c-format +msgid "Downloaded %d routepoint" +msgid_plural "Downloaded %d routepoints" +msgstr[0] "Stažen %d bod" +msgstr[1] "Staženy %d body" +msgstr[2] "Staženo %d bodů" + +#: ../src/vikgpslayer.c:1101 +#, c-format +msgid "Uploaded %d waypoint" +msgid_plural "Uploaded %d waypoints" +msgstr[0] "Nahráno %d místo" +msgstr[1] "Nahrána %d místa" +msgstr[2] "Nahráno %d míst" + +#: ../src/vikgpslayer.c:1107 +#, c-format +msgid "Uploaded %d trackpoint" +msgid_plural "Uploaded %d trackpoints" +msgstr[0] "Nahrán %d bod" +msgstr[1] "Nahrány %d body" +msgstr[2] "Nahráno %d bodů" + +#: ../src/vikgpslayer.c:1113 +#, c-format +msgid "Uploaded %d routepoint" +msgid_plural "Uploaded %d routepoints" +msgstr[0] "Nahrán %d bod" +msgstr[1] "Nahrány %d body" +msgstr[2] "Nahráno %d bodů" + +#: ../src/vikgpslayer.c:1363 +msgid "Error: No result." +msgstr "" + +#: ../src/vikgpslayer.c:1471 +msgid "Warning - GPS Upload items may overwrite each other" +msgstr "Varování - nahrávané GPS objekty se mohou vzájemně přepsat" + +#: ../src/vikgpslayer.c:1506 +msgid "Status: detecting gpsbabel" +msgstr "Status: hledám gpsbabel" + +#: ../src/vikgpslayer.c:1533 +msgid "No GPS items selected for transfer." +msgstr "Nevybrány GPS objekty k přenosu." + +#: ../src/vikgpslayer.c:1546 +msgid "Could not turn off device." +msgstr "Vypnutí zařízení selhalo." + +#: ../src/vikgpslayer.c:1589 +msgid "Are you sure you want to delete GPS Upload data?" +msgstr "Opravdu chcete odstranit Nahraná GPS data?" + +#: ../src/vikgpslayer.c:1602 +msgid "Are you sure you want to delete GPS Download data?" +msgstr "Opravdu chcete odstranit Stažená GPS data?" + +#: ../src/vikgpslayer.c:1616 +msgid "Are you sure you want to delete GPS Realtime data?" +msgstr "Opravdu chcete odstranit realtime GPS data?" + +#: ../src/vikgpslayer.c:1630 +msgid "Are you sure you want to delete All GPS data?" +msgstr "Opravdu chcete odstranit všechna GPS data?" + +#: ../src/vikgpslayer.c:2004 +#, c-format +msgid "" +"Failed to connect to gpsd at %s (port %s)\n" +"Should Viking keep trying (every %d seconds)?" +msgstr "" + +#: ../src/viklayerspanel.c:73 +msgid "C_ut" +msgstr "_Vyjmout" + +#: ../src/viklayerspanel.c:74 ../src/vikwindow.c:4882 +msgid "_Copy" +msgstr "_Kopírovat" + +#: ../src/viklayerspanel.c:75 ../src/vikwindow.c:4883 +msgid "_Paste" +msgstr "_Vložit" + +#: ../src/viklayerspanel.c:76 ../src/vikwindow.c:4884 +msgid "_Delete" +msgstr "_Smazat" + +#: ../src/viklayerspanel.c:154 +msgid "New Layer" +msgstr "Nová vrstva" + +#: ../src/viklayerspanel.c:347 +msgid "Top Layer" +msgstr "Hlavní" + +#: ../src/viklayerspanel.c:363 +msgid "Add new layer" +msgstr "Přidat novou vrstvu" + +#: ../src/viklayerspanel.c:370 ../src/vikwindow.c:4884 +msgid "Remove selected layer" +msgstr "Smazat vrstvu" + +#: ../src/viklayerspanel.c:377 +msgid "Move selected layer up" +msgstr "Posunout vrstvu nahoru" + +#: ../src/viklayerspanel.c:384 +msgid "Move selected layer down" +msgstr "Posunout vrstvu dolů" + +#: ../src/viklayerspanel.c:391 ../src/vikwindow.c:4881 +msgid "Cut selected layer" +msgstr "Vyjmout vrstvu" + +#: ../src/viklayerspanel.c:398 ../src/vikwindow.c:4882 +msgid "Copy selected layer" +msgstr "Kopírovat vrstvu" + +#: ../src/viklayerspanel.c:405 ../src/vikwindow.c:4883 +msgid "" +"Paste layer into selected container layer or otherwise above selected layer" +msgstr "Vložit kopírovanou vrstvu." + +#: ../src/viklayerspanel.c:502 +msgid "New name can not be blank." +msgstr "Nové jméno nemůže být prázdné." + +#: ../src/viklayerspanel.c:751 +msgid "Aggregate Layers have no settable properties." +msgstr "Spojovací vrstvy nemají žádná nastavení." + +#: ../src/viklayerspanel.c:798 +msgid "You cannot cut the Top Layer." +msgstr "Nelze vyjmout hlavní vrstvu." + +#: ../src/viklayerspanel.c:843 +#, c-format +msgid "Are you sure you want to delete %s?" +msgstr "Opravdu chcete odstranit %s?" + +#: ../src/viklayerspanel.c:863 +msgid "You cannot delete the Top Layer." +msgstr "Nelze odstranit hlavní vrstvu." + +#: ../src/vikmapniklayer.c:78 +msgid "CSS (MML) Config File:" +msgstr "" + +#: ../src/vikmapniklayer.c:79 +msgid "CartoCSS configuration file" +msgstr "" + +#: ../src/vikmapniklayer.c:80 +msgid "XML Config File:" +msgstr "" + +#: ../src/vikmapniklayer.c:81 +msgid "Mapnik XML configuration file" +msgstr "" + +#: ../src/vikmapniklayer.c:84 +msgid "Use File Cache:" +msgstr "" + +#: ../src/vikmapniklayer.c:86 +msgid "File Cache Directory:" +msgstr "" + +#: ../src/vikmapniklayer.c:122 +msgid "_Mapnik Features" +msgstr "" + +#: ../src/vikmapniklayer.c:122 +msgid "Mapnik Features" +msgstr "" + +#: ../src/vikmapniklayer.c:140 +msgid "Mapnik Rendering" +msgstr "" + +#. Changing these values only applies before first mapnik layer is 'created' +#: ../src/vikmapniklayer.c:258 +msgid "Plugins Directory:" +msgstr "" + +#: ../src/vikmapniklayer.c:258 ../src/vikmapniklayer.c:259 +#: ../src/vikmapniklayer.c:260 ../src/vikmapniklayer.c:261 +msgid "You need to restart Viking for a change to this value to be used" +msgstr "" + +#: ../src/vikmapniklayer.c:259 +msgid "Fonts Directory:" +msgstr "" + +#: ../src/vikmapniklayer.c:260 +msgid "Recurse Fonts Directory:" +msgstr "" + +#: ../src/vikmapniklayer.c:261 +msgid "Rerender Timeout (hours):" +msgstr "" + +#. Changeable any time +#: ../src/vikmapniklayer.c:263 +msgid "CartoCSS:" +msgstr "" + +#: ../src/vikmapniklayer.c:263 +msgid "The program to convert CartoCSS files into Mapnik XML" +msgstr "" + +#: ../src/vikmapniklayer.c:506 +msgid "Running" +msgstr "" + +#: ../src/vikmapniklayer.c:525 +#, c-format +msgid "" +"Error running carto command:\n" +"%s" +msgstr "" + +#: ../src/vikmapniklayer.c:561 +msgid " completed in " +msgstr "" + +#: ../src/vikmapniklayer.c:561 +msgid "seconds" +msgstr "" + +#: ../src/vikmapniklayer.c:611 ../src/vikmapniklayer.c:979 +#, c-format +msgid "" +"Mapnik error loading configuration file:\n" +"%s" +msgstr "" + +#: ../src/vikmapniklayer.c:749 +#, c-format +msgid "Mapnik Render %d:%d:%d %s" +msgstr "" + +#: ../src/vikmapniklayer.c:840 +msgid "Mapnik Rendering must be in Mercator mode" +msgstr "" + +#: ../src/vikmapniklayer.c:997 +msgid "Mapnik Information" +msgstr "" + +#: ../src/vikmapniklayer.c:1031 +msgid "_Flush Memory Cache" +msgstr "" + +#: ../src/vikmapniklayer.c:1044 +msgid "_Run Carto Command" +msgstr "" + +#: ../src/vikmapniklayer.c:1102 ../src/vikmapslayer.c:2029 +#, c-format +msgid "Tile File Timestamp: %s" +msgstr "" + +#: ../src/vikmapniklayer.c:1105 ../src/vikmapslayer.c:2032 +msgid "Tile File Timestamp: Not Available" +msgstr "" + +#: ../src/vikmapniklayer.c:1120 +#, c-format +msgid "Rendering time %.2f seconds" +msgstr "" + +#: ../src/vikmapniklayer.c:1124 ../src/vikmapslayer.c:2042 +msgid "Tile Information" +msgstr "" + +#: ../src/vikmapniklayer.c:1145 +msgid "_Rerender Tile" +msgstr "" + +#: ../src/vikmapniklayer.c:1150 +msgid "_Info" +msgstr "" + +#. ******* MAPZOOMS ******** +#: ../src/vikmapslayer.c:96 +msgid "Use Viking Zoom Level" +msgstr "použít aktuální přiblížení mapy" + +#: ../src/vikmapslayer.c:146 +msgid "OSM" +msgstr "" + +#. NB mode => id - But can't break file format just to rename something better +#: ../src/vikmapslayer.c:152 +msgid "Map Type:" +msgstr "Typ mapy:" + +#: ../src/vikmapslayer.c:153 +msgid "Maps Directory:" +msgstr "Adresář pro mapy:" + +#: ../src/vikmapslayer.c:154 +msgid "Cache Layout:" +msgstr "" + +#: ../src/vikmapslayer.c:155 +msgid "This determines the tile storage layout on disk" +msgstr "" + +#: ../src/vikmapslayer.c:156 +msgid "Map File:" +msgstr "" + +#: ../src/vikmapslayer.c:157 +msgid "An MBTiles file. Only applies when the map type method is 'MBTiles'" +msgstr "" + +#: ../src/vikmapslayer.c:159 +msgid "Control the Alpha value for transparency effects" +msgstr "Nazstavení alfa pro průhlednost" + +#: ../src/vikmapslayer.c:160 +msgid "Autodownload maps:" +msgstr "Stahovat mapy automaticky:" + +#: ../src/vikmapslayer.c:161 +msgid "Autodownload Only Gets Missing Maps:" +msgstr "Automaticky stahovat pouze chybějící:" + +#: ../src/vikmapslayer.c:162 +msgid "" +"Using this option avoids attempting to update already acquired tiles. This " +"can be useful if you want to restrict the network usage, without having to " +"resort to manual control. Only applies when 'Autodownload Maps' is on." +msgstr "" +"Tato volba brání opakovanému stahování již uložených mapových dlaždic. " +"Užitečné při omezeném přístupu k síti, použije se pouze pokud je povoleno " +"automatické stahování map." + +#: ../src/vikmapslayer.c:163 +msgid "Zoom Level:" +msgstr "Stupeň přiblížení:" + +#: ../src/vikmapslayer.c:164 +msgid "" +"Determines the method of displaying map tiles for the current zoom level. " +"'Viking Zoom Level' uses the best matching level, otherwise setting a fixed " +"value will always use map tiles of the specified value regardless of the " +"actual zoom level." +msgstr "" +"Určuje způsob zobrazení mapových dlaždic pro dané přiblížení. \"Přiblížení " +"dle vikingu\" použije nejlépe se hodící úroveň, při nastavení pevné hodnoty " +"se vždy použijí dlaždice dané velikosti bez ohledu na stupeň přiblížení." + +#: ../src/vikmapslayer.c:197 +msgid "_Maps Download" +msgstr "Stažení _map" + +#: ../src/vikmapslayer.c:197 +msgid "Maps Download" +msgstr "Stažení map" + +#: ../src/vikmapslayer.c:213 ../src/vikutils.c:895 +msgid "Map" +msgstr "Mapová" + +#: ../src/vikmapslayer.c:306 +msgid "Default map layer directory:" +msgstr "Adresář pro data map" + +#: ../src/vikmapslayer.c:306 +msgid "Choose a directory to store cached Map tiles for this layer" +msgstr "Vyberte složku určenou pro mapy této vrstvy" + +#: ../src/vikmapslayer.c:436 ../src/vikmapslayer.c:633 +msgid "Unknown map type" +msgstr "Neznámý typ mapy" + +#: ../src/vikmapslayer.c:664 +msgid "Unknown Map Zoom" +msgstr "Neznámé přiblížení mapy" + +#: ../src/vikmapslayer.c:833 +#, c-format +msgid "Failed to open MBTiles file: %s" +msgstr "" + +#: ../src/vikmapslayer.c:856 +#, c-format +msgid "" +"New map cannot be displayed in the current drawmode.\n" +"Select \"%s\" from View menu to view it." +msgstr "" +"Nová mapa nemůže být zobrazena v tomto režimu.\n" +"Vyberte \"%s\" z menu zobrazení." + +#: ../src/vikmapslayer.c:1314 +#, c-format +msgid "" +"Cowardly refusing to draw tiles or existence of tiles beyond %d zoom out " +"factor" +msgstr "Zbaběle odmítá vykreslit mapové podklady nad stupeň přiblížení %d" + +#. TODO: ?? count up the number of download errors somehow... +#: ../src/vikmapslayer.c:1667 +msgid "Failed to download tile" +msgstr "" + +#: ../src/vikmapslayer.c:1673 +msgid "Unable to save tile" +msgstr "" + +#: ../src/vikmapslayer.c:1799 +#, c-format +msgid "Redownloading up to %d %s map..." +msgid_plural "Redownloading up to %d %s maps..." +msgstr[0] "Opakované stažení %d %s mapy..." +msgstr[1] "Opakované stažení %d %s map..." +msgstr[2] "Opakované stažení %d %s map..." + +#: ../src/vikmapslayer.c:1801 +#, c-format +msgid "Redownloading %d %s map..." +msgid_plural "Redownloading %d %s maps..." +msgstr[0] "Opakované stahování %d %s mapy..." +msgstr[1] "Opakované stahování %d %s map..." +msgstr[2] "Opakované stahování %d %s map..." + +#: ../src/vikmapslayer.c:1805 ../src/vikmapslayer.c:1890 +#, c-format +msgid "Downloading %d %s map..." +msgid_plural "Downloading %d %s maps..." +msgstr[0] "Stahuji %d %s mapu..." +msgstr[1] "Stahuji %d %s mapu..." +msgstr[2] "Stahuji %d %s mapu..." + +#: ../src/vikmapslayer.c:1969 +msgid "YES" +msgstr "" + +#: ../src/vikmapslayer.c:1973 ../src/vikmapslayer.c:1977 +msgid "NO" +msgstr "" + +#. NB Also handles .jpg automatically due to pixbuf_new_from () support - although just print png for now. +#: ../src/vikmapslayer.c:1980 +#, c-format +msgid "Source: %s (%d%s%d%s%d.%s %s)" +msgstr "" + +#: ../src/vikmapslayer.c:1983 +msgid "Source: Not available" +msgstr "" + +#: ../src/vikmapslayer.c:2000 +msgid "Source: file://" +msgstr "" + +#: ../src/vikmapslayer.c:2012 +#, c-format +msgid "Source: %s" +msgstr "" + +#: ../src/vikmapslayer.c:2038 +#, fuzzy, c-format +msgid "Tile File: %s [Not Available]" +msgstr "Nápověda není dostupná." + +#: ../src/vikmapslayer.c:2086 +msgid "Redownload _Bad Map(s)" +msgstr "Stáhnout ch_ybné mapy" + +#: ../src/vikmapslayer.c:2090 +msgid "Redownload _New Map(s)" +msgstr "Znovu stáhnout _nové mapy" + +#: ../src/vikmapslayer.c:2094 +msgid "Redownload _All Map(s)" +msgstr "Znovu stáhnout všechny m_apy" + +#: ../src/vikmapslayer.c:2099 +msgid "_Show Tile Information" +msgstr "_zobrazit info o dlaždici" + +#: ../src/vikmapslayer.c:2166 +#, c-format +msgid "" +"Wrong drawmode for this map.\n" +"Select \"%s\" from View menu and try again." +msgstr "" +"špatný zobrazovací režim pro tento druh mapy.\n" +"Vyberte \"%s\" z menu Zobrazení a zkuste znovu." + +#: ../src/vikmapslayer.c:2171 +msgid "Wrong zoom level for this map." +msgstr "Špatný stupeň přiblížení pro tuto mapu." + +#: ../src/vikmapslayer.c:2334 +msgid "Zoom Start:" +msgstr "přiblížení od:" + +#: ../src/vikmapslayer.c:2341 +msgid "Zoom End:" +msgstr "do:" + +#: ../src/vikmapslayer.c:2347 +msgid "Download Maps Method:" +msgstr "Výběr:" + +#. redownload method - needs to align with REDOWNLOAD* macro values +#: ../src/vikmapslayer.c:2419 +msgid "Missing" +msgstr "Chybějící" + +#: ../src/vikmapslayer.c:2419 +msgid "Bad" +msgstr "Špatné" + +#: ../src/vikmapslayer.c:2419 +msgid "New" +msgstr "Nové" + +#: ../src/vikmapslayer.c:2419 +msgid "Reload All" +msgstr "Všechny" + +#: ../src/vikmapslayer.c:2421 +msgid "Download for Zoom Levels" +msgstr "Stáhnout pro rozsah přiblížení" + +#: ../src/vikmapslayer.c:2461 +#, c-format +msgid "" +"You are not allowed to download more than %d tiles in one go (requested %d)" +msgstr "" +"Není dovoleno stahovat více než %d dlaždic v jednom kroku (požadováno %d)" + +#: ../src/vikmapslayer.c:2469 +#, c-format +msgid "Do you really want to download %d tiles?" +msgstr "Opravdu stáhnoutd %d dlaždic?" + +#. Now with icons +#: ../src/vikmapslayer.c:2509 +msgid "Download _Missing Onscreen Maps" +msgstr "Stáhnout chybějící _mapy na obrazovce" + +#: ../src/vikmapslayer.c:2516 +msgid "Download _New Onscreen Maps" +msgstr "Stáhnout _aktualizované mapy na obrazovce" + +#: ../src/vikmapslayer.c:2523 +msgid "Reload _All Onscreen Maps" +msgstr "Znovu stáhnut všechny mapy na obrazovce" + +#: ../src/vikmapslayer.c:2529 +msgid "Download Maps in _Zoom Levels..." +msgstr "Stáhnout mapy s rozsahem přiblížení" + +#: ../src/vikmapslayer.c:2539 +#, fuzzy +msgid "_Open MBTiles Files" +msgstr "O_tevřít nedávné soubory" + +#: ../src/vikmapslayer.c:2554 +msgid "Flush Map Cache" +msgstr "" + +#: ../src/vikrouting.c:54 +msgid "Default engine:" +msgstr "Výběr způsobu:" + +#: ../src/vikrouting.c:68 +msgid "Routing" +msgstr "" + +#: ../src/viktreeview.c:347 +msgid "Layer Name" +msgstr "Jméno vrstvy" + +#: ../src/viktreeview.c:924 +#, c-format +msgid "delete data from %s\n" +msgstr "smazat data z %s\n" + +#: ../src/viktrwlayer.c:427 +msgid "Create _Waypoint" +msgstr "Vytvořit míst_o" + +#: ../src/viktrwlayer.c:427 +msgid "Create Waypoint" +msgstr "Vytvořit místo" + +#: ../src/viktrwlayer.c:437 +#, fuzzy +msgid "Edit _Track" +msgstr "Změna bodu" + +#: ../src/viktrwlayer.c:437 +#, fuzzy +msgid "Edit Track" +msgstr "Změna bodu" + +#: ../src/viktrwlayer.c:449 +#, fuzzy +msgid "Edit _Route" +msgstr "Přidat trasu" + +#: ../src/viktrwlayer.c:449 +#, fuzzy +msgid "Edit Route" +msgstr "Přidat trasu" + +#: ../src/viktrwlayer.c:460 +msgid "Route _Finder" +msgstr "Nalézt _trasu" + +#: ../src/viktrwlayer.c:460 +msgid "Route Finder" +msgstr "Vyhledání cesty" + +#: ../src/viktrwlayer.c:471 +#, fuzzy +msgid "Splitter" +msgstr "Zde rozdělit" + +#: ../src/viktrwlayer.c:482 +msgid "_Edit Waypoint" +msgstr "Změna _místa" + +#: ../src/viktrwlayer.c:482 +msgid "Edit Waypoint" +msgstr "Změna místa" + +#: ../src/viktrwlayer.c:495 +msgid "Edit Trac_kpoint" +msgstr "Změna _bodu" + +#: ../src/viktrwlayer.c:495 +msgid "Edit Trackpoint" +msgstr "Změna bodu" + +#. a pixbuf for this one is already made globally available +#: ../src/viktrwlayer.c:508 +msgid "Show P_icture" +msgstr "Zobrazit _obrázek" + +#: ../src/viktrwlayer.c:508 +msgid "Show Picture" +msgstr "Ukázat obrázek" + +#: ../src/viktrwlayer.c:531 +msgid "Waypoint Images" +msgstr "Obrázky míst" + +#: ../src/viktrwlayer.c:531 +msgid "Tracks Advanced" +msgstr "Stopy pokročilé" + +#: ../src/viktrwlayer.c:531 +msgid "Metadata" +msgstr "" + +#: ../src/viktrwlayer.c:531 +#, fuzzy +msgid "Filesystem" +msgstr "Typ souboru:" + +#: ../src/viktrwlayer.c:534 +msgid "Draw by Track" +msgstr "Barva dle stopy" + +#: ../src/viktrwlayer.c:534 +msgid "Draw by Speed" +msgstr "dle rychlosti" + +#: ../src/viktrwlayer.c:534 +msgid "All Tracks Same Color" +msgstr "Všechny stejná barva" + +#: ../src/viktrwlayer.c:535 +msgid "Filled Square" +msgstr "Plný čtverec" + +#: ../src/viktrwlayer.c:535 +msgid "Square" +msgstr "Čtverec" + +#: ../src/viktrwlayer.c:535 +msgid "Circle" +msgstr "Kruh" + +#: ../src/viktrwlayer.c:535 +msgid "X" +msgstr "X" + +#: ../src/viktrwlayer.c:561 +msgid "Extra Extra Small" +msgstr "nejmenší" + +#: ../src/viktrwlayer.c:562 +msgid "Extra Small" +msgstr "menší" + +#: ../src/viktrwlayer.c:566 +msgid "Extra Large" +msgstr "velký" + +#: ../src/viktrwlayer.c:567 +msgid "Extra Extra Large" +msgstr "největší" + +#: ../src/viktrwlayer.c:573 +msgid "Name Ascending" +msgstr "dle jména" + +#: ../src/viktrwlayer.c:574 +msgid "Name Descending" +msgstr "dle jména sestupně" + +#: ../src/viktrwlayer.c:582 ../src/viktrwlayer_propwin.c:3319 +msgid "No" +msgstr "Ne" + +#: ../src/viktrwlayer.c:583 +msgid "Yes" +msgstr "" + +#: ../src/viktrwlayer.c:584 +msgid "No write" +msgstr "" + +#: ../src/viktrwlayer.c:649 ../src/viktrwlayer.c:673 +msgid "Draw Labels" +msgstr "Kreslit popisky" + +#: ../src/viktrwlayer.c:650 +msgid "Note: the individual track controls what labels may be displayed" +msgstr "" + +#: ../src/viktrwlayer.c:651 +msgid "Track Labels Font Size:" +msgstr "Velikost písma:" + +#: ../src/viktrwlayer.c:652 +msgid "Track Drawing Mode:" +msgstr "Režim vykreslení trasy:" + +#: ../src/viktrwlayer.c:653 +msgid "All Tracks Color:" +msgstr "Barva všech:" + +#: ../src/viktrwlayer.c:654 +msgid "The color used when 'All Tracks Same Color' drawing mode is selected" +msgstr "Vybraná barva je použita pokud je zvolen režim 'Všechny stejná barva'" + +#: ../src/viktrwlayer.c:655 +msgid "Draw Track Lines" +msgstr "Zobrazit stopu" + +#: ../src/viktrwlayer.c:656 +msgid "Track Thickness:" +msgstr "Tloušťka stopy" + +#: ../src/viktrwlayer.c:657 +msgid "Draw Track Direction" +msgstr "Vykreslit směr" + +#: ../src/viktrwlayer.c:658 +msgid "Direction Size:" +msgstr "Velikost značky směru:" + +#: ../src/viktrwlayer.c:659 +msgid "Draw Trackpoints" +msgstr "Zobrazit body" + +#: ../src/viktrwlayer.c:660 +msgid "Trackpoint Size:" +msgstr "Velikost bodu:" + +#: ../src/viktrwlayer.c:661 +msgid "Draw Elevation" +msgstr "Vykreslit výšku" + +#: ../src/viktrwlayer.c:662 +msgid "Draw Elevation Height %:" +msgstr "Míra zobrazení výšky %:" + +#: ../src/viktrwlayer.c:663 +msgid "Draw Stops" +msgstr "Vykreslit zastávky" + +#: ../src/viktrwlayer.c:664 +msgid "" +"Whether to draw a marker when trackpoints are at the same position but over " +"the minimum stop length apart in time" +msgstr "" + +#: ../src/viktrwlayer.c:665 +msgid "Min Stop Length (seconds):" +msgstr "Min. délka zastávky (sekund):" + +#: ../src/viktrwlayer.c:667 +msgid "Track BG Thickness:" +msgstr "Pozadí tloušťky:" + +#: ../src/viktrwlayer.c:668 +msgid "Track Background Color" +msgstr "Barva pozadí stopy" + +#: ../src/viktrwlayer.c:669 +msgid "Draw by Speed Factor (%):" +msgstr "Míra zobrazení rychlosti (%):" + +#: ../src/viktrwlayer.c:670 +msgid "" +"The percentage factor away from the average speed determining the color used" +msgstr "Poměr v % určující barvu vzhledem k průměrné hodnotě" + +#: ../src/viktrwlayer.c:671 +msgid "Track Sort Order:" +msgstr "Pořadí stopy" + +#: ../src/viktrwlayer.c:674 +msgid "Waypoint Font Size:" +msgstr "Velikost fontu místa:" + +#: ../src/viktrwlayer.c:675 +msgid "Waypoint Color:" +msgstr "Barva místa:" + +#: ../src/viktrwlayer.c:676 +msgid "Waypoint Text:" +msgstr "Text místa:" + +#: ../src/viktrwlayer.c:677 +msgid "Background:" +msgstr "Pozadí:" + +#: ../src/viktrwlayer.c:678 +msgid "Fake BG Color Translucency:" +msgstr "pozadí částečně průhledné:" + +#: ../src/viktrwlayer.c:679 +msgid "Waypoint marker:" +msgstr "Označení místa:" + +#: ../src/viktrwlayer.c:680 +msgid "Waypoint size:" +msgstr "Velikost označení:" + +#: ../src/viktrwlayer.c:681 +msgid "Draw Waypoint Symbols:" +msgstr "Vykreslit symboly míst:" + +#: ../src/viktrwlayer.c:682 +msgid "Waypoint Sort Order:" +msgstr "Pořadí řazení" + +#: ../src/viktrwlayer.c:684 +msgid "Draw Waypoint Images" +msgstr "Vykreslit obrázky míst" + +#: ../src/viktrwlayer.c:685 +msgid "Image Size (pixels):" +msgstr "Veliost obrázku (pixely):" + +#: ../src/viktrwlayer.c:686 +msgid "Image Alpha:" +msgstr "Alfa obrázku:" + +#: ../src/viktrwlayer.c:687 +msgid "Image Memory Cache Size:" +msgstr "Velikost cache paměti obrázků:" + +#: ../src/viktrwlayer.c:690 +msgid "Author" +msgstr "" + +#: ../src/viktrwlayer.c:691 +msgid "Creation Time" +msgstr "" + +#: ../src/viktrwlayer.c:692 +msgid "Keywords" +msgstr "" + +#: ../src/viktrwlayer.c:693 +msgid "External layer:" +msgstr "" + +#: ../src/viktrwlayer.c:693 +msgid "" +"Layer data stored in the Viking file, in an external file, or in an external " +"file but changes are not written to the file (file only loaded at startup)" +msgstr "" + +#: ../src/viktrwlayer.c:694 +msgid "Save layer as:" +msgstr "" + +#: ../src/viktrwlayer.c:694 +msgid "Specify where layer should be saved. Overwrites file if it exists." +msgstr "" + +#: ../src/viktrwlayer.c:798 +msgid "TrackWaypoint" +msgstr "Stopy a trasy" + +#: ../src/viktrwlayer.c:1999 ../src/viktrwlayer_propwin.c:1469 +#: ../src/viktrwlayer_propwin.c:1471 ../src/vikutils.c:299 +#: ../src/vikutils.c:326 +msgid "miles" +msgstr "míle" + +#: ../src/viktrwlayer.c:2002 ../src/viktrwlayer_propwin.c:1475 +#: ../src/viktrwlayer_propwin.c:1477 ../src/vikutils.c:303 +#: ../src/vikutils.c:330 +msgid "NM" +msgstr "" + +#. VIK_UNITS_DISTANCE_KILOMETRES: +#: ../src/viktrwlayer.c:2006 ../src/viktrwlayer_propwin.c:1482 +#: ../src/viktrwlayer_propwin.c:1484 ../src/vikutils.c:308 +#: ../src/vikutils.c:335 +msgid "km" +msgstr "km" + +#: ../src/viktrwlayer.c:2121 +msgid "start/end" +msgstr "začátek/konec" + +#: ../src/viktrwlayer.c:2133 +msgid "start" +msgstr "počátek" + +#: ../src/viktrwlayer.c:2142 +msgid "end" +msgstr "konec" + +#: ../src/viktrwlayer.c:3103 +#, c-format +msgid " in %d:%02d hrs:mins" +msgstr " za %d:%02d hod:min" + +#: ../src/viktrwlayer.c:3107 +#, c-format +msgid "" +"\n" +"%sTotal Length %.1f %s%s" +msgstr "" +"\n" +"%sCelková vzdálenost %.1f %s%s" + +#: ../src/viktrwlayer.c:3131 +#, c-format +msgid "" +"\n" +"Total route length %.1f %s" +msgstr "" + +#: ../src/viktrwlayer.c:3136 +#, c-format +msgid "Tracks: %d - Waypoints: %d - Routes: %d%s%s" +msgstr "" + +#: ../src/viktrwlayer.c:3155 +#, c-format +msgid "Tracks: %d" +msgstr "Stopy: %d" + +#: ../src/viktrwlayer.c:3165 +#, c-format +msgid "Routes: %d" +msgstr "Trasy: %d" + +#: ../src/viktrwlayer.c:3195 +#, c-format +msgid "- %d:%02d hrs:mins" +msgstr "- %d:%02d hod:min" + +#: ../src/viktrwlayer.c:3202 +#, c-format +msgid "%s%.1f km %s" +msgstr "%s%.1f km %s" + +#: ../src/viktrwlayer.c:3205 +#, c-format +msgid "%s%.1f miles %s" +msgstr "%s%.1f mil %s" + +#: ../src/viktrwlayer.c:3208 +#, c-format +msgid "%s%.1f NM %s" +msgstr "" + +#: ../src/viktrwlayer.c:3222 +#, c-format +msgid "Waypoints: %d" +msgstr "Místa: %d" + +#: ../src/viktrwlayer.c:3279 +#, c-format +msgid "Wpt: Alt %dft" +msgstr "Wpt: Alt %dft" + +#. VIK_UNITS_HEIGHT_METRES: +#: ../src/viktrwlayer.c:3283 +#, c-format +msgid "Wpt: Alt %dm" +msgstr "Wpt: Alt %dm" + +#. Add comment if available +#: ../src/viktrwlayer.c:3298 +#, c-format +msgid "%s | %s %s | Comment: %s" +msgstr "%s | %s %s | Comment: %s" + +#: ../src/viktrwlayer.c:3300 +#, c-format +msgid "%s | %s %s" +msgstr "%s | %s %s" + +#: ../src/viktrwlayer.c:3562 ../src/viktrwlayer.c:3591 +msgid "This layer has no waypoints or trackpoints." +msgstr "Ve vrstvě nejsou body ani místa." + +#: ../src/viktrwlayer.c:3598 ../src/viktrwlayer.c:3607 +#: ../src/viktrwlayer.c:3616 ../src/viktrwlayer.c:3625 +#: ../src/viktrwlayer.c:3634 ../src/viktrwlayer.c:3642 +msgid "Export Layer" +msgstr "Export vrstvy jako..." + +#: ../src/viktrwlayer.c:3671 +msgid "Export Route as GPX" +msgstr "" + +#: ../src/viktrwlayer.c:3673 +msgid "Export Track as GPX" +msgstr "Exportovat jako GPX" + +#: ../src/viktrwlayer.c:3693 +msgid "Find" +msgstr "Hledat" + +#: ../src/viktrwlayer.c:3703 +msgid "Waypoint Name:" +msgstr "Jméno místa:" + +#: ../src/viktrwlayer.c:3720 +msgid "Waypoint not found in this layer." +msgstr "Místo není v této vrstvě" + +#: ../src/viktrwlayer.c:3989 +msgid "Can not upload invisible track." +msgstr "Nelze nahrát neviditelnou stopu." + +#: ../src/viktrwlayer.c:4082 ../src/viktrwlayer.c:10512 +msgid "Track" +msgstr "Stopa" + +#: ../src/viktrwlayer.c:4107 ../src/viktrwlayer.c:10599 +msgid "Route" +msgstr "Trasa" + +#: ../src/viktrwlayer.c:4194 +msgid "Externa_l" +msgstr "" + +#: ../src/viktrwlayer.c:4216 ../src/viktrwlayer.c:8456 +#: ../src/viktrwlayer.c:8574 +msgid "_Finish Route" +msgstr "Ukončit _trasu" + +#: ../src/viktrwlayer.c:4218 ../src/viktrwlayer.c:8380 +#: ../src/viktrwlayer.c:8572 +msgid "_Finish Track" +msgstr "Ukončit _stopu" + +#. Now with icons +#: ../src/viktrwlayer.c:4230 +msgid "_View Layer" +msgstr "Zobrazit v_rstvu" + +#: ../src/viktrwlayer.c:4237 +msgid "V_iew" +msgstr "_Zobrazení" + +#: ../src/viktrwlayer.c:4243 +msgid "View All _Tracks" +msgstr "Zobrazit všechny _stopy" + +#: ../src/viktrwlayer.c:4248 +msgid "View All _Routes" +msgstr "Zobrazit všechny _trasy" + +#: ../src/viktrwlayer.c:4253 +msgid "View All _Waypoints" +msgstr "Z_obrazit všechna místa" + +#: ../src/viktrwlayer.c:4258 +msgid "_Goto Center of Layer" +msgstr "_Jít na střed vrstvy" + +#: ../src/viktrwlayer.c:4264 ../src/viktrwlayer.c:8321 +msgid "Goto _Waypoint..." +msgstr "Jít na _místo..." + +#: ../src/viktrwlayer.c:4270 +msgid "_Export Layer" +msgstr "_Export vstvy" + +#: ../src/viktrwlayer.c:4276 +msgid "Export as GPS_Point..." +msgstr "Export GPS_Point..." + +#: ../src/viktrwlayer.c:4281 +msgid "Export as GPS_Mapper..." +msgstr "Export GPS_Mapper..." + +#: ../src/viktrwlayer.c:4286 +msgid "Export as _GPX..." +msgstr "Export _GPX..." + +#: ../src/viktrwlayer.c:4292 +msgid "Export as _KML..." +msgstr "Export _KML..." + +#: ../src/viktrwlayer.c:4299 +msgid "Export as GEO_JSON..." +msgstr "" + +#: ../src/viktrwlayer.c:4306 +msgid "Export via GPSbabel..." +msgstr "" + +#: ../src/viktrwlayer.c:4312 +#, c-format +msgid "Open with External Program_1: %s" +msgstr "" + +#: ../src/viktrwlayer.c:4319 +#, c-format +msgid "Open with External Program_2: %s" +msgstr "" + +#: ../src/viktrwlayer.c:4327 ../src/vikwindow.c:4825 +msgid "_New" +msgstr "_Nový" + +#: ../src/viktrwlayer.c:4333 +msgid "New _Waypoint..." +msgstr "Nové míst_o..." + +#: ../src/viktrwlayer.c:4339 +msgid "New _Track" +msgstr "Nová _stopa" + +#: ../src/viktrwlayer.c:4347 +msgid "New _Route" +msgstr "Nová _trasa" + +#: ../src/viktrwlayer.c:4356 ../src/viktrwlayer.c:8232 +#: ../src/viktrwlayer.c:9003 +msgid "Geotag _Images..." +msgstr "Geotagovat _obrázky..." + +#: ../src/viktrwlayer.c:4363 +msgid "_Acquire" +msgstr "Získ_at" + +#: ../src/viktrwlayer.c:4369 ../src/vikwindow.c:4904 +msgid "From _GPS..." +msgstr "z _GPS..." + +#. FIXME: only add menu when at least a routing engine has support for Directions +#: ../src/viktrwlayer.c:4375 +msgid "From _Directions..." +msgstr "z nalezených tras..." + +#: ../src/viktrwlayer.c:4381 +msgid "From _OSM Traces..." +msgstr "z _OSM záznamů..." + +#: ../src/viktrwlayer.c:4386 +msgid "From _My OSM Traces..." +msgstr "z _mých OSM záznamů" + +#: ../src/viktrwlayer.c:4392 ../src/vikwindow.c:4844 +msgid "From _URL..." +msgstr "" + +#: ../src/viktrwlayer.c:4399 ../src/vikwindow.c:4846 +msgid "From _Wikipedia Waypoints" +msgstr "z míst na _Wikipedii" + +#: ../src/viktrwlayer.c:4405 +msgid "Within _Layer Bounds" +msgstr "Ve vrstvě" + +#: ../src/viktrwlayer.c:4411 +msgid "Within _Current View" +msgstr "V aktuálním pohledu" + +#: ../src/viktrwlayer.c:4419 +msgid "From Geo_caching..." +msgstr "z Geo_cachingu..." + +#: ../src/viktrwlayer.c:4426 ../src/vikwindow.c:4842 +msgid "From Geotagged _Images..." +msgstr "z geotagovaných _obrázků..." + +#: ../src/viktrwlayer.c:4433 +msgid "From _File..." +msgstr "ze _souboru..." + +#: ../src/viktrwlayer.c:4436 ../src/vikwindow.c:4905 +msgid "Import File With GPS_Babel..." +msgstr "ze souboru pomocí GPSBabel..." + +#: ../src/viktrwlayer.c:4443 ../src/viktrwlayer.c:8905 +msgid "_Upload" +msgstr "_Nahrát" + +#: ../src/viktrwlayer.c:4449 +msgid "Upload to _GPS..." +msgstr "do _GPS..." + +#: ../src/viktrwlayer.c:4456 ../src/viktrwlayer.c:8973 +msgid "Upload to _OSM..." +msgstr "do _OSM..." + +#: ../src/viktrwlayer.c:4464 +msgid "De_lete" +msgstr "_Odstranit" + +#: ../src/viktrwlayer.c:4470 +msgid "Delete All _Tracks" +msgstr "Smazat všechny _stopy" + +#: ../src/viktrwlayer.c:4477 +msgid "Delete Tracks _From Selection..." +msgstr "Smazat _vybrané stopy" + +#: ../src/viktrwlayer.c:4484 ../src/viktrwlayer.c:8481 +msgid "Delete _All Routes" +msgstr "Smazat _všechny trasy" + +#: ../src/viktrwlayer.c:4491 ../src/viktrwlayer.c:8487 +msgid "_Delete Routes From Selection..." +msgstr "_Smazat vybrané trasy" + +#: ../src/viktrwlayer.c:4498 +msgid "Delete All _Waypoints" +msgstr "Smazat všechna místa" + +#: ../src/viktrwlayer.c:4505 +msgid "Delete Waypoints From _Selection..." +msgstr "Odstranit místa z výběru..." + +#: ../src/viktrwlayer.c:4512 ../src/viktrwlayer.c:8339 +#, fuzzy +msgid "Delete Duplicate Waypoints" +msgstr "Odstranit duplicitní místa" + +#: ../src/viktrwlayer.c:5198 +#, c-format +msgid "Are you sure you want to delete all tracks in %s?" +msgstr "Opravdu chcete odstranit všechny stopy v %s?" + +#: ../src/viktrwlayer.c:5211 +#, c-format +msgid "Are you sure you want to delete all routes in %s?" +msgstr "Opravdu smazat všechny trasy v %s?" + +#: ../src/viktrwlayer.c:5221 +#, c-format +msgid "Are you sure you want to delete all waypoints in %s?" +msgstr "Opravdu chcete odstranit všechna místa v %s?" + +#: ../src/viktrwlayer.c:5238 +#, c-format +msgid "Are you sure you want to delete the waypoint \"%s\"?" +msgstr "Opravdu chcete odstranit místa \"%s\"?" + +#: ../src/viktrwlayer.c:5254 +#, c-format +msgid "Are you sure you want to delete the track \"%s\"?" +msgstr "Opravdu chcete odstranit stopu \"%s\"?" + +#: ../src/viktrwlayer.c:5271 +#, c-format +msgid "Are you sure you want to delete the route \"%s\"?" +msgstr "Opravdu chcete odstranit trasu \"%s\"?" + +#: ../src/viktrwlayer.c:5527 ../src/viktrwlayer.c:6373 +msgid "" +"Converting a track to a route removes extra track data such as segments, " +"timestamps, etc...\n" +"Do you want to continue?" +msgstr "" +"Konverze na trasu odebere některé vlastnosti záznamu jako třeba úseky, " +"časové značky atp... Chcete pokračovat?" + +#: ../src/viktrwlayer.c:5631 +msgid "No DEM layers available, thus no DEM values can be applied." +msgstr "" +"Není vložena žádná DEM vrstva, nelze akplikovat hodnoty nadmořské výšky do " +"trasy." + +#: ../src/viktrwlayer.c:5651 ../src/viktrwlayer.c:5692 +#, c-format +msgid "%ld point adjusted" +msgid_plural "%ld points adjusted" +msgstr[0] "%ld bod upraven" +msgstr[1] "%ld body upraveny" +msgstr[2] "%ld bodů upraveno" + +#: ../src/viktrwlayer.c:5736 +#, c-format +msgid "%ld waypoint changed" +msgid_plural "%ld waypoints changed" +msgstr[0] "%ld místo upraveno" +msgstr[1] "%ld místa upraveny" +msgstr[2] "%ld míst upraveno" + +#: ../src/viktrwlayer.c:5917 +#, c-format +msgid "" +"Refining a track with many points (%d) is unlikely to yield sensible " +"results. Do you want to Continue?" +msgstr "" + +#. Select engine from dialog +#: ../src/viktrwlayer.c:5925 +msgid "Refine Route with Routing Engine..." +msgstr "" + +#: ../src/viktrwlayer.c:5933 +msgid "Select routing engine" +msgstr "Způsob hledání trasy" + +#: ../src/viktrwlayer.c:6158 +msgid "Failed. No other tracks with timestamps in this layer found" +msgstr "Chyba: Žádná další stopa s časovými údaji v této vrstvě" + +#: ../src/viktrwlayer.c:6160 +msgid "Failed. No other tracks without timestamps in this layer found" +msgstr "Chyba: Žádná další stopa bez časových údajů v této vrstvě" + +#: ../src/viktrwlayer.c:6179 +msgid "Merge with..." +msgstr "Připojit s ..," + +#: ../src/viktrwlayer.c:6180 +msgid "Select route to merge with" +msgstr "Vyberte záznam k připojení" + +#: ../src/viktrwlayer.c:6180 +msgid "Select track to merge with" +msgstr "Vybrat stopu k připojení" + +#: ../src/viktrwlayer.c:6264 ../src/viktrwlayer.c:6346 +msgid "Append Route" +msgstr "Připojit trasu" + +#: ../src/viktrwlayer.c:6264 ../src/viktrwlayer.c:6346 +msgid "Append Track" +msgstr "Připojit stopu" + +#: ../src/viktrwlayer.c:6265 +msgid "Select the route to append after the current route" +msgstr "Vyberte trasu, kterou připojit za aktuální trasu" + +#: ../src/viktrwlayer.c:6266 +msgid "Select the track to append after the current track" +msgstr "Vyberte stopu, kterou připojit za aktuální stopu" + +#: ../src/viktrwlayer.c:6347 +msgid "Select the track to append after the current route" +msgstr "Vyberte stopu, který připojit za aktuální stopu" + +#: ../src/viktrwlayer.c:6348 +msgid "Select the route to append after the current track" +msgstr "Vyberte trasu, kterou připojit za aktuální stopu" + +#: ../src/viktrwlayer.c:6414 +#, c-format +msgid "%d segment merged" +msgid_plural "%d segments merged" +msgstr[0] "%d úsek připojen" +msgstr[1] "%d úseky připojeny" +msgstr[2] "%d úseků připojeno" + +#: ../src/viktrwlayer.c:6430 +msgid "Failed. This track does not have timestamp" +msgstr "Selhalo. Stopa neobsahuje časové údaje" + +#: ../src/viktrwlayer.c:6442 +msgid "Failed. No other track in this layer has timestamp" +msgstr "Selhalo. Žádná stopa v této vstvě neobsahuje časové údaje" + +#: ../src/viktrwlayer.c:6449 +msgid "Merge Threshold..." +msgstr "Práh pro spojování..." + +#: ../src/viktrwlayer.c:6450 +msgid "Merge when time between tracks less than:" +msgstr "Připojit stopy pokud je dělí méně než:" + +#: ../src/viktrwlayer.c:6580 +msgid "Split Threshold..." +msgstr "Práh pro rozdělování..." + +#: ../src/viktrwlayer.c:6581 +msgid "Split when time between trackpoints exceeds:" +msgstr "Rozdělit pokud je čas mezi body delší než:" + +#: ../src/viktrwlayer.c:6598 +#, c-format +msgid "" +"Can not split track due to trackpoints not ordered in time - such as at %s.\n" +"\n" +"Goto this trackpoint?" +msgstr "" +"Nelze rozdělit stopu, body nejdou seřazeny podle času např. v %s.\n" +"\n" +"Zobrazit bod?" + +#: ../src/viktrwlayer.c:6668 +msgid "Split Every Nth Point" +msgstr "Rodělit každý x-tý bod" + +#: ../src/viktrwlayer.c:6669 +msgid "Split on every Nth point:" +msgstr "Rodělit každý x-tý bod:" + +#: ../src/viktrwlayer.c:6779 +msgid "Can not split track as it has no segments" +msgstr "Nelze rozdělit stopu, nemá žádné úseky" + +#: ../src/viktrwlayer.c:6861 ../src/viktrwlayer.c:6891 +#, c-format +msgid "Deleted %ld point" +msgid_plural "Deleted %ld points" +msgstr[0] "Smazán %ld bod" +msgstr[1] "Smazány %ld body" +msgstr[2] "Smazáno %ld bodů" + +#: ../src/viktrwlayer.c:6966 ../src/viktrwlayer.c:10989 +#: ../src/viktrwlayer_waypointlist.c:214 +#, c-format +msgid "Could not launch %s to open file." +msgstr "Nelze spustit %s pro otevření souboru." + +#: ../src/viktrwlayer.c:6992 ../src/viktrwlayer.c:7113 +msgid "This track has no date information." +msgstr "" + +#: ../src/viktrwlayer.c:7006 ../src/viktrwlayer.c:7136 +msgid "This waypoint has no date information." +msgstr "" + +#: ../src/viktrwlayer.c:7030 +#, c-format +msgid "Could not launch %s" +msgstr "" + +#: ../src/viktrwlayer.c:7269 +msgid "Internal Error in vik_trw_layer_uniquify_tracks" +msgstr "Interní chyba v vik_trw_layer_uniquify_tracks" + +#: ../src/viktrwlayer.c:7374 ../src/viktrwlayer.c:7424 +#: ../src/viktrwlayer.c:7587 +msgid "" +"Multiple entries with the same name exist. This method only works with " +"unique names. Force unique names now?" +msgstr "" +"Existuje několik položek se stejným jménem. Tento kód pracuje pouze s " +"jednoznačnými jmény. Přejmenovat na unikátní?" + +#: ../src/viktrwlayer.c:7385 +msgid "No tracks found" +msgstr "Nenalezeny žádné stopy" + +#: ../src/viktrwlayer.c:7393 ../src/viktrwlayer.c:7443 +#: ../src/viktrwlayer.c:7607 +msgid "Delete Selection" +msgstr "Smazat výběr" + +#: ../src/viktrwlayer.c:7394 +msgid "Select tracks to delete" +msgstr "Vyberte stopy k odstranění" + +#: ../src/viktrwlayer.c:7435 +msgid "No routes found" +msgstr "Žádné záznamy nenalezeny" + +#: ../src/viktrwlayer.c:7444 +msgid "Select routes to delete" +msgstr "Vyberte trasy ke smazání" + +#: ../src/viktrwlayer.c:7550 +msgid "Internal Error in vik_trw_layer_uniquify_waypoints" +msgstr "Interní chyba v vik_trw_layer_uniquify_waypoints" + +#: ../src/viktrwlayer.c:7597 +msgid "No waypoints found" +msgstr "Žádná místa nenalezena" + +#: ../src/viktrwlayer.c:7608 +msgid "Select waypoints to delete" +msgstr "Vyberte místa k odstranění" + +#: ../src/viktrwlayer.c:7691 +#, fuzzy, c-format +msgid "%ld waypoint deleted" +msgid_plural "%ld waypoints deleted" +msgstr[0] "%ld místo upraveno" +msgstr[1] "%ld místa upraveny" +msgstr[2] "%ld míst upraveno" + +#: ../src/viktrwlayer.c:7697 +#, fuzzy +msgid "No duplicates found" +msgstr "Žádné záznamy nenalezeny" + +#: ../src/viktrwlayer.c:8028 +#, c-format +msgid "" +"A waypoint with the name \"%s\" already exists. Really rename to the same " +"name?" +msgstr "Místo z názvem \"%s\" již existuje, opravdu pojmenovat stejně?" + +#: ../src/viktrwlayer.c:8058 +#, c-format +msgid "" +"A track with the name \"%s\" already exists. Really rename to the same name?" +msgstr "Stopa s názvem \"%s\" již existuje, opravdu pojmenovat stejně?" + +#: ../src/viktrwlayer.c:8095 +#, c-format +msgid "" +"A route with the name \"%s\" already exists. Really rename to the same name?" +msgstr "Trasa s názvem \"%s\" již existuje, opravdu pojmenovat stejně?" + +#: ../src/viktrwlayer.c:8215 ../src/viktrwlayer.c:8602 +msgid "_Goto" +msgstr "_Jít na" + +#: ../src/viktrwlayer.c:8226 +msgid "_Visit Geocache Webpage" +msgstr "_Jít na stránku Geocache" + +#: ../src/viktrwlayer.c:8235 +msgid "Geotag multiple images against this waypoint" +msgstr "" + +#: ../src/viktrwlayer.c:8245 ../src/viktrwlayer_waypointlist.c:352 +msgid "_Show Picture..." +msgstr "_Zobrazit obrázek..." + +#: ../src/viktrwlayer.c:8253 +msgid "Update Geotag on _Image" +msgstr "Aktual_izovat geotagování obrázku" + +#: ../src/viktrwlayer.c:8259 +msgid "_Update" +msgstr "Akt_ualizovat" + +#: ../src/viktrwlayer.c:8264 +msgid "Update and _Keep File Timestamp" +msgstr "Aktualizovat a _zachovat čas změny souborů" + +#: ../src/viktrwlayer.c:8276 +msgid "Visit _Webpage" +msgstr "Navštivte _stránku" + +#: ../src/viktrwlayer.c:8306 +msgid "_New Waypoint..." +msgstr "_Nové místo..." + +#: ../src/viktrwlayer.c:8315 +msgid "_View All Waypoints" +msgstr "Zobrazit _všechna místa" + +#: ../src/viktrwlayer.c:8327 +msgid "Delete _All Waypoints" +msgstr "Smazat všechn_a místa" + +#: ../src/viktrwlayer.c:8333 +msgid "_Delete Waypoints From Selection..." +msgstr "Smazat _vybraná místa" + +#: ../src/viktrwlayer.c:8351 +msgid "_Show All Waypoints" +msgstr "_Zobrazit všechna místa" + +#: ../src/viktrwlayer.c:8357 +msgid "_Hide All Waypoints" +msgstr "_Skrýt všechna místa" + +#: ../src/viktrwlayer.c:8369 +msgid "_List Waypoints..." +msgstr "" + +#: ../src/viktrwlayer.c:8390 +msgid "_View All Tracks" +msgstr "Zobrazit _všechny stopy" + +#: ../src/viktrwlayer.c:8396 +msgid "_New Track" +msgstr "Nová _stopa" + +#: ../src/viktrwlayer.c:8404 +msgid "Delete _All Tracks" +msgstr "_Smazat všechny stopy" + +#: ../src/viktrwlayer.c:8410 +msgid "_Delete Tracks From Selection..." +msgstr "Smazat _vybrané stopy" + +#: ../src/viktrwlayer.c:8422 +msgid "_Show All Tracks" +msgstr "_Zobrazit všechny stopy" + +#: ../src/viktrwlayer.c:8428 +msgid "_Hide All Tracks" +msgstr "_Skrýt všechny stopy" + +#: ../src/viktrwlayer.c:8439 +msgid "_List Tracks..." +msgstr "_Vypsat všechny stopy" + +#: ../src/viktrwlayer.c:8467 +msgid "_View All Routes" +msgstr "Zobrazit všechny _trasy" + +#: ../src/viktrwlayer.c:8473 +msgid "_New Route" +msgstr "Nová _trasa" + +#: ../src/viktrwlayer.c:8499 +msgid "_Show All Routes" +msgstr "_Zobrazit všechny trasy" + +#: ../src/viktrwlayer.c:8505 +msgid "_Hide All Routes" +msgstr "_Skrýt všechny trasy" + +#: ../src/viktrwlayer.c:8516 +msgid "_List Routes..." +msgstr "_Výpis tras..." + +#: ../src/viktrwlayer.c:8587 +msgid "_View Track" +msgstr "Zobrazit _stopu" + +#: ../src/viktrwlayer.c:8589 +msgid "_View Route" +msgstr "Zobrazit _trasu" + +#: ../src/viktrwlayer.c:8608 +msgid "_Startpoint" +msgstr "_začátek" + +#: ../src/viktrwlayer.c:8614 +msgid "\"_Center\"" +msgstr "\"_střed\"" + +#: ../src/viktrwlayer.c:8620 +msgid "_Endpoint" +msgstr "_konec" + +#: ../src/viktrwlayer.c:8626 +msgid "_Highest Altitude" +msgstr "_maximální výšku" + +#: ../src/viktrwlayer.c:8632 +msgid "_Lowest Altitude" +msgstr "_nejnižší bod" + +#: ../src/viktrwlayer.c:8640 +msgid "_Maximum Speed" +msgstr "nejvyššší _rychlost" + +#: ../src/viktrwlayer.c:8646 +#, fuzzy +msgid "_Date" +msgstr "Datum" + +#: ../src/viktrwlayer.c:8655 +msgid "Co_mbine" +msgstr "Spojit" + +#: ../src/viktrwlayer.c:8663 +msgid "_Merge By Time..." +msgstr "_Spojit dle času..." + +#: ../src/viktrwlayer.c:8668 +msgid "Merge _Segments" +msgstr "Spojit úseky" + +#: ../src/viktrwlayer.c:8675 +msgid "Merge _With Other Tracks..." +msgstr "Připojit _další stopy..." + +#: ../src/viktrwlayer.c:8682 +msgid "_Append Track..." +msgstr "Připojit _stopu..." + +#: ../src/viktrwlayer.c:8684 +msgid "_Append Route..." +msgstr "Připojit _trasu..." + +#: ../src/viktrwlayer.c:8690 +msgid "Append _Route..." +msgstr "Připojit _trasu..." + +#: ../src/viktrwlayer.c:8692 +msgid "Append _Track..." +msgstr "Připojit _stopu..." + +#: ../src/viktrwlayer.c:8699 +msgid "_Split" +msgstr "_Rozdělit" + +#: ../src/viktrwlayer.c:8707 +msgid "_Split By Time..." +msgstr "_Rozdělit dle času..." + +#. ATM always enable this entry - don't want to have to analyse the track before displaying the menu - to keep the menu speedy +#: ../src/viktrwlayer.c:8713 +msgid "Split Se_gments" +msgstr "Rozdělit ú_seky" + +#: ../src/viktrwlayer.c:8719 +msgid "Split By _Number of Points..." +msgstr "Rozdělit dle počtu bodů..." + +#: ../src/viktrwlayer.c:8724 +msgid "Split at _Trackpoint" +msgstr "Rozdělit v _bodě" + +#: ../src/viktrwlayer.c:8732 +msgid "_Insert Points" +msgstr "Vlož_it body" + +#: ../src/viktrwlayer.c:8738 +msgid "Insert Point _Before Selected Point" +msgstr "před vy_braný bod" + +#: ../src/viktrwlayer.c:8745 +msgid "Insert Point _After Selected Point" +msgstr "z_a vybraný bod" + +#: ../src/viktrwlayer.c:8754 +msgid "Delete Poi_nts" +msgstr "Smazat bo_dy" + +#: ../src/viktrwlayer.c:8760 +msgid "Delete _Selected Point" +msgstr "Smazat _vybraný bod" + +#: ../src/viktrwlayer.c:8768 +msgid "Delete Points With The Same _Position" +msgstr "na stejné _pozici" + +#: ../src/viktrwlayer.c:8773 +msgid "Delete Points With The Same _Time" +msgstr "se stejným č_asem" + +#: ../src/viktrwlayer.c:8780 ../src/viktrwlayer.c:9029 +msgid "_Transform" +msgstr "_Úpravit" + +#: ../src/viktrwlayer.c:8788 ../src/viktrwlayer.c:9037 +msgid "_Apply DEM Data" +msgstr "Přidat výšku z D_EM dat" + +#: ../src/viktrwlayer.c:8793 ../src/viktrwlayer.c:9042 +msgid "_Overwrite" +msgstr "přep_sat" + +#: ../src/viktrwlayer.c:8796 ../src/viktrwlayer.c:9045 +msgid "Overwrite any existing elevation values with DEM values" +msgstr "Přepsat stávající nadmořskou výšku údaji z DEM souboru" + +#: ../src/viktrwlayer.c:8799 ../src/viktrwlayer.c:9048 +msgid "_Keep Existing" +msgstr "_ponechat stávající" + +#: ../src/viktrwlayer.c:8802 ../src/viktrwlayer.c:9051 +msgid "Keep existing elevation values, only attempt for missing values" +msgstr "Ponechat stávající nadmořskou výšku, pouze doplnit chybějící hodnoty" + +#: ../src/viktrwlayer.c:8807 +msgid "_Smooth Missing Elevation Data" +msgstr "Doplnit údaje o nadmořské výšce" + +#: ../src/viktrwlayer.c:8812 +msgid "_Interpolated" +msgstr "_interpolavat" + +#: ../src/viktrwlayer.c:8815 +msgid "" +"Interpolate between known elevation values to derive values for the missing " +"elevations" +msgstr "Interpolovat chybějící údaje dle okolních bodů" + +#: ../src/viktrwlayer.c:8818 +msgid "_Flat" +msgstr "_dle poslední" + +#: ../src/viktrwlayer.c:8821 +msgid "Set unknown elevation values to the last known value" +msgstr "Nastavit stejný údaj jako má poslední bod" + +#: ../src/viktrwlayer.c:8825 +msgid "C_onvert to a Route" +msgstr "Konverze na _trasu" + +#: ../src/viktrwlayer.c:8827 +msgid "C_onvert to a Track" +msgstr "Konverze na _stopu" + +#: ../src/viktrwlayer.c:8835 +msgid "_Anonymize Times" +msgstr "_Anonymizace časů" + +#: ../src/viktrwlayer.c:8838 +msgid "Shift timestamps to a relative offset from 1901-01-01" +msgstr "Posune časové značky aby první bod začínal od 1.1.1901" + +#: ../src/viktrwlayer.c:8841 +msgid "_Interpolate Times" +msgstr "" + +#: ../src/viktrwlayer.c:8844 +msgid "" +"Reset trackpoint timestamps between the first and last points such that " +"track is traveled at equal speed" +msgstr "" + +#: ../src/viktrwlayer.c:8849 +msgid "_Reverse Track" +msgstr "_Otočit stopu" + +#: ../src/viktrwlayer.c:8851 +msgid "_Reverse Route" +msgstr "_Otočit trasu" + +#: ../src/viktrwlayer.c:8858 +msgid "Refine Route..." +msgstr "" + +#: ../src/viktrwlayer.c:8868 +msgid "Down_load Maps Along Track..." +msgstr "Stáhnout mapy _podél stopy" + +#: ../src/viktrwlayer.c:8870 +msgid "Down_load Maps Along Route..." +msgstr "Stáhnout mapy oko_lo trasy" + +#: ../src/viktrwlayer.c:8878 +msgid "_Export Track as GPX..." +msgstr "Export _stopu jako GPX..." + +#: ../src/viktrwlayer.c:8880 +msgid "_Export Route as GPX..." +msgstr "Export _trasy jako GPX..." + +#: ../src/viktrwlayer.c:8887 +msgid "E_xtend Track End" +msgstr "Rozšířit _konec stopy" + +#: ../src/viktrwlayer.c:8889 +msgid "E_xtend Route End" +msgstr "Po_kračovat v trase" + +#: ../src/viktrwlayer.c:8896 +msgid "Extend _Using Route Finder" +msgstr "Prodloužit _pomocí hledání cesty" + +#: ../src/viktrwlayer.c:8911 +msgid "_Upload to GPS..." +msgstr "_do GPS..." + +#: ../src/viktrwlayer.c:8926 +msgid "_Diary" +msgstr "" + +#: ../src/viktrwlayer.c:8930 +msgid "Open diary program at this date" +msgstr "" + +#: ../src/viktrwlayer.c:8935 +msgid "_Astronomy" +msgstr "" + +#: ../src/viktrwlayer.c:8938 +msgid "Open astronomy program at this date and location" +msgstr "" + +#: ../src/viktrwlayer.c:8962 +msgid "_View Google Directions" +msgstr "_Zobrazit trasu dle Google" + +#: ../src/viktrwlayer.c:8984 +msgid "Use with _Filter" +msgstr "Použít _filtr" + +#: ../src/viktrwlayer.c:9018 +msgid "_Edit Trackpoint" +msgstr "_Upravit bod" + +#: ../src/viktrwlayer.c:10116 +#, c-format +msgid " - Gain %dm:Loss %dm" +msgstr " - Gain %dm:Loss %dm" + +#: ../src/viktrwlayer.c:10118 +#, c-format +msgid " - Gain %dft:Loss %dft" +msgstr " - Gain %dft:Loss %dft" + +#: ../src/viktrwlayer.c:10123 +#, c-format +msgid " - Bearing %3.1f° - Step %s" +msgstr " - Bearing %3.1f° - krok %s" + +#: ../src/viktrwlayer.c:10232 +#, c-format +msgid "Querying %s for route between (%.3f, %.3f) and (%.3f, %.3f)." +msgstr "" + +#: ../src/viktrwlayer.c:10248 +#, c-format +msgid "%s returned route between (%.3f, %.3f) and (%.3f, %.3f)." +msgstr "" + +#: ../src/viktrwlayer.c:10251 +#, c-format +msgid "Error getting route from %s." +msgstr "" + +#: ../src/viktrwlayer.c:11070 +#, c-format +msgid "Creating %d Image Thumbnails..." +msgstr "Vytvářím %d náhledy obrázků..." + +#: ../src/viktrwlayer.c:11560 +msgid "No map layer in use. Create one first" +msgstr "Je třeba vytvořit mapovou vrstvu." + +#: ../src/viktrwlayer.c:11679 +#, c-format +msgid "%s: Track List" +msgstr "%s: Výpis stop" + +#: ../src/viktrwlayer.c:11681 +#, c-format +msgid "%s: Route List" +msgstr "%s: Výpis tras" + +#: ../src/viktrwlayer.c:11734 +#, c-format +msgid "" +"Could not write external layer %s to %s, please fix and save before exiting " +"or data will be lost" +msgstr "" + +#: ../src/viktrwlayer.c:11782 +#, fuzzy, c-format +msgid "WARNING: issues encountered loading external layer %s from %s" +msgstr "Varování: problém při nahrávání %s" + +#: ../src/viktrwlayer_export.c:47 +msgid "Auto Device GPX Simplify:" +msgstr "" + +#: ../src/viktrwlayer_export.c:48 +msgid "" +"GPX saves to certain devices will be simplified for device compatibility." +msgstr "" + +#: ../src/viktrwlayer_export.c:125 +#, c-format +msgid "Export of GPX file simplified using point limit: %d" +msgstr "" + +#: ../src/viktrwlayer_export.c:206 ../src/viktrwlayer_export.c:323 +#: ../src/vikwindow.c:3694 +msgid "The filename you requested could not be opened for writing." +msgstr "Soubor nemůže být otevřen k zápisu." + +#: ../src/viktrwlayer_export.c:226 +#, c-format +msgid "Could not launch %s." +msgstr "Nelze spustit %s." + +#: ../src/viktrwlayer_export.c:234 +msgid "Could not create temporary file for export." +msgstr "Nelze vytvořit dočasný soubor s exportem." + +#: ../src/viktrwlayer_export.c:268 +msgid "File format:" +msgstr "" + +#: ../src/viktrwlayer_export.c:276 +msgid "Select the file format." +msgstr "" + +#: ../src/viktrwlayer_export.c:281 +msgid "" +"Select the information to process.\n" +"Warning: the behavior of these switches is highly dependent of the file " +"format selected.\n" +"Please, refer to GPSbabel if unsure." +msgstr "" + +#: ../src/viktrwlayer_export.c:308 +msgid "You did not select a valid file format." +msgstr "" + +#: ../src/viktrwlayer_propwin.c:915 ../src/viktrwlayer_propwin.c:3381 +#: ../src/viktrwlayer_propwin.c:3417 ../src/viktrwlayer_propwin.c:3457 +#: ../src/viktrwlayer_propwin.c:3509 ../src/viktrwlayer_propwin.c:3527 +#: ../src/viktrwlayer_propwin.c:3600 ../src/viktrwlayer_propwin.c:3601 +#: ../src/viktrwlayer_propwin.c:3602 ../src/viktrwlayer_propwin.c:3611 +#: ../src/viktrwlayer_propwin.c:3612 ../src/viktrwlayer_propwin.c:3629 +#: ../src/viktrwlayer_propwin.c:3630 ../src/viktrwlayer_propwin.c:3644 +#: ../src/viktrwlayer_propwin.c:3645 ../src/viktrwlayer_propwin.c:3646 +#: ../src/viktrwlayer_propwin.c:3660 ../src/viktrwlayer_propwin.c:3661 +#: ../src/viktrwlayer_propwin.c:3662 ../src/viktrwlayer_propwin.c:3676 +#: ../src/viktrwlayer_propwin.c:3677 ../src/viktrwlayer_propwin.c:3678 +#: ../src/viktrwlayer_propwin.c:3695 ../src/viktrwlayer_propwin.c:3696 +#: ../src/viktrwlayer_analysis.c:293 +#, c-format +msgid "No Data" +msgstr "Žádná data" + +#: ../src/viktrwlayer_propwin.c:960 ../src/viktrwlayer_propwin.c:1245 +#, c-format +msgid "%.1f kph" +msgstr "%.1f kph" + +#: ../src/viktrwlayer_propwin.c:963 ../src/viktrwlayer_propwin.c:1248 +#: ../src/viktrwlayer_analysis.c:352 +#, c-format +msgid "%.1f mph" +msgstr "%.1f mph" + +#: ../src/viktrwlayer_propwin.c:966 ../src/viktrwlayer_propwin.c:1251 +#, c-format +msgid "%.1f knots" +msgstr "%.1f knots" + +#: ../src/viktrwlayer_propwin.c:969 ../src/viktrwlayer_propwin.c:1254 +#, fuzzy, c-format +msgid "%.1f s/km" +msgstr "%.1f km" + +#: ../src/viktrwlayer_propwin.c:972 ../src/viktrwlayer_propwin.c:1257 +#: ../src/viktrwlayer_analysis.c:389 ../src/viktrwlayer_analysis.c:392 +#, fuzzy, c-format +msgid "%.1f min/km" +msgstr "%.1f km" + +#: ../src/viktrwlayer_propwin.c:975 ../src/viktrwlayer_propwin.c:1260 +#, fuzzy, c-format +msgid "%.1f sec/mi" +msgstr "%.1f miles" + +#: ../src/viktrwlayer_propwin.c:978 ../src/viktrwlayer_propwin.c:1263 +#: ../src/viktrwlayer_analysis.c:409 ../src/viktrwlayer_analysis.c:412 +#, fuzzy, c-format +msgid "%.1f min/mi" +msgstr "%.1f m/s" + +#. VIK_UNITS_SPEED_METRES_PER_SECOND: +#: ../src/viktrwlayer_propwin.c:982 ../src/viktrwlayer_propwin.c:1267 +#, c-format +msgid "%.1f m/s" +msgstr "%.1f m/s" + +#. Minutes +#: ../src/viktrwlayer_propwin.c:1411 +msgid "mins" +msgstr "" + +#. Hours +#: ../src/viktrwlayer_propwin.c:1418 +msgid "h" +msgstr "" + +#. Days +#: ../src/viktrwlayer_propwin.c:1424 +msgid "d" +msgstr "" + +#. Weeks +#: ../src/viktrwlayer_propwin.c:1429 +msgid "w" +msgstr "" + +#. 'Months' +#: ../src/viktrwlayer_propwin.c:1433 +msgid "M" +msgstr "" + +#: ../src/viktrwlayer_propwin.c:2051 ../src/viktrwlayer_analysis.c:303 +#, c-format +msgid "%.1f miles" +msgstr "%.1f miles" + +#: ../src/viktrwlayer_propwin.c:2054 ../src/viktrwlayer_analysis.c:306 +#, c-format +msgid "%.1f NM" +msgstr "" + +#. VIK_UNITS_DISTANCE_KILOMETRES +#: ../src/viktrwlayer_propwin.c:2057 ../src/viktrwlayer_analysis.c:310 +#, c-format +msgid "%.1f km" +msgstr "%.1f km" + +#: ../src/viktrwlayer_propwin.c:3083 +msgid "Failed spliting track. Track unchanged" +msgstr "Chyba při rozdělení stopy. Stopa nezměněna" + +#: ../src/viktrwlayer_propwin.c:3234 ../src/viktrwlayer_propwin.c:3744 +#, c-format +msgid "%s - Track Properties" +msgstr "%s - vlastnosti stopy" + +#: ../src/viktrwlayer_propwin.c:3239 +msgid "Split at _Marker" +msgstr "Rozdělit na _značce" + +#: ../src/viktrwlayer_propwin.c:3240 +msgid "Split _Segments" +msgstr "Rozdělit segmety" + +#: ../src/viktrwlayer_propwin.c:3241 +msgid "_Reverse" +msgstr "O_brátit" + +#: ../src/viktrwlayer_propwin.c:3242 +msgid "_Delete Dupl." +msgstr "Smazat _duplicitní" + +#: ../src/viktrwlayer_propwin.c:3269 +msgid "Comment:" +msgstr "Komentář:" + +#: ../src/viktrwlayer_propwin.c:3270 +msgid "Description:" +msgstr "Popis:" + +#: ../src/viktrwlayer_propwin.c:3271 +#, fuzzy +msgid "Source:" +msgstr "Kurz:" + +#: ../src/viktrwlayer_propwin.c:3272 +#, fuzzy +msgid "Type:" +msgstr "Čas:" + +#: ../src/viktrwlayer_propwin.c:3273 +msgid "Color:" +msgstr "Barva:" + +#: ../src/viktrwlayer_propwin.c:3274 +msgid "Draw Name:" +msgstr "Zobrazit jméno:" + +#: ../src/viktrwlayer_propwin.c:3275 +msgid "Distance Labels:" +msgstr "značek vzdálenosti:" + +#: ../src/viktrwlayer_propwin.c:3278 +msgid "Track Length:" +msgstr "Délka stopy:" + +#: ../src/viktrwlayer_propwin.c:3279 +msgid "Trackpoints:" +msgstr "Body:" + +#: ../src/viktrwlayer_propwin.c:3280 +msgid "Segments:" +msgstr "Segmenty:" + +#: ../src/viktrwlayer_propwin.c:3281 +msgid "Duplicate Points:" +msgstr "Zdvojené body:" + +#: ../src/viktrwlayer_propwin.c:3282 +msgid "Max Speed:" +msgstr "Nejvyšší rychlost:" + +#: ../src/viktrwlayer_propwin.c:3283 +msgid "Avg. Speed:" +msgstr "Průměrná rychlost:" + +#: ../src/viktrwlayer_propwin.c:3284 +msgid "Moving Avg. Speed:" +msgstr "Průměrná rychlost pohybu:" + +#: ../src/viktrwlayer_propwin.c:3285 +msgid "Avg. Dist. Between TPs:" +msgstr "Průměrná vzdálenost mezi body:" + +#: ../src/viktrwlayer_propwin.c:3286 +msgid "Elevation Range:" +msgstr "Rozsah nadmořské výšky:" + +#: ../src/viktrwlayer_propwin.c:3287 +msgid "Total Elevation Gain/Loss:" +msgstr "Celkové stoupání/klesání:" + +#: ../src/viktrwlayer_propwin.c:3288 +msgid "Start:" +msgstr "Začátek:" + +#: ../src/viktrwlayer_propwin.c:3289 +msgid "End:" +msgstr "Konec:" + +#: ../src/viktrwlayer_propwin.c:3290 +msgid "Duration:" +msgstr "Trvání:" + +#: ../src/viktrwlayer_propwin.c:3320 +msgid "Centre" +msgstr "uprostřed" + +#: ../src/viktrwlayer_propwin.c:3321 +msgid "Start only" +msgstr "na začátku" + +#: ../src/viktrwlayer_propwin.c:3322 +msgid "End only" +msgstr "na konci" + +#: ../src/viktrwlayer_propwin.c:3323 +msgid "Start and End" +msgstr "na začátku a konci" + +#: ../src/viktrwlayer_propwin.c:3324 +msgid "Centre, Start and End" +msgstr "uprostřed, na začátku a konci" + +#: ../src/viktrwlayer_propwin.c:3336 +msgid "Maximum number of distance labels to be shown" +msgstr "Počet zobrazených značek délky trasy" + +#: ../src/viktrwlayer_propwin.c:3340 +msgid "Properties" +msgstr "Vlastnosti" + +#: ../src/viktrwlayer_propwin.c:3584 +#, c-format +msgid "%d minutes - %d minutes moving" +msgstr "" + +#: ../src/viktrwlayer_propwin.c:3596 +#, c-format +msgid "%s total - %s in segments" +msgstr "" + +#: ../src/viktrwlayer_propwin.c:3607 ../src/viktrwlayer_analysis.c:622 +msgid "Statistics" +msgstr "Statistika" + +#: ../src/viktrwlayer_propwin.c:3613 ../src/viktrwlayer_propwin.c:3680 +msgid "Show D_EM" +msgstr "Zobrazit D_EM" + +#: ../src/viktrwlayer_propwin.c:3615 ../src/viktrwlayer_propwin.c:3631 +#: ../src/viktrwlayer_propwin.c:3647 ../src/viktrwlayer_propwin.c:3697 +msgid "Show _GPS Speed" +msgstr "Zobrazit _GPS rychlost" + +#: ../src/viktrwlayer_propwin.c:3617 ../src/viktrwlayer_propwin.c:3633 +#: ../src/viktrwlayer_propwin.c:3665 ../src/viktrwlayer_propwin.c:3699 +msgid "Track Distance:" +msgstr "Délka stopy:" + +#: ../src/viktrwlayer_propwin.c:3618 ../src/viktrwlayer_propwin.c:3684 +msgid "Track Height:" +msgstr "Nadmořská výška:" + +#: ../src/viktrwlayer_propwin.c:3624 +msgid "Elevation-distance" +msgstr "Výška - vzdálenost" + +#: ../src/viktrwlayer_propwin.c:3634 +msgid "Track Gradient:" +msgstr "Stoupání:" + +#: ../src/viktrwlayer_propwin.c:3639 +msgid "Gradient-distance" +msgstr "Stoupání - vzdálenost" + +#: ../src/viktrwlayer_propwin.c:3649 ../src/viktrwlayer_propwin.c:3666 +#: ../src/viktrwlayer_propwin.c:3683 +msgid "Track Time:" +msgstr "Čas záznamu:" + +#: ../src/viktrwlayer_propwin.c:3650 ../src/viktrwlayer_propwin.c:3700 +msgid "Track Speed:" +msgstr "Rychlost:" + +#: ../src/viktrwlayer_propwin.c:3651 ../src/viktrwlayer_propwin.c:3667 +#: ../src/viktrwlayer_propwin.c:3685 +msgid "Time/Date:" +msgstr "" + +#: ../src/viktrwlayer_propwin.c:3655 +msgid "Speed-time" +msgstr "Rychlost - čas" + +#: ../src/viktrwlayer_propwin.c:3663 ../src/viktrwlayer_propwin.c:3679 +msgid "Show S_peed" +msgstr "Zobrazit rychlost" + +#: ../src/viktrwlayer_propwin.c:3671 +msgid "Distance-time" +msgstr "Vzdálenost - čas" + +#: ../src/viktrwlayer_propwin.c:3690 +msgid "Elevation-time" +msgstr "Výška - čas" + +#: ../src/viktrwlayer_propwin.c:3705 +msgid "Speed-distance" +msgstr "Rychlost - vzdálenost" + +#: ../src/viktrwlayer_tpwin.c:190 ../src/viktrwlayer_wpwin.c:66 +msgid "Date/Time Edit" +msgstr "" + +#: ../src/viktrwlayer_tpwin.c:242 +msgid "Name:" +msgstr "" + +#: ../src/viktrwlayer_tpwin.c:243 +msgid "Latitude:" +msgstr "Zeměpisná šířka:" + +#: ../src/viktrwlayer_tpwin.c:244 +msgid "Longitude:" +msgstr "Zeměpisná délka:" + +#: ../src/viktrwlayer_tpwin.c:245 +msgid "Altitude:" +msgstr "Nadmořská výška:" + +#: ../src/viktrwlayer_tpwin.c:246 +msgid "Course:" +msgstr "Kurz:" + +#: ../src/viktrwlayer_tpwin.c:247 +msgid "Timestamp:" +msgstr "Časová značka:" + +#: ../src/viktrwlayer_tpwin.c:248 +msgid "Time:" +msgstr "Čas:" + +#: ../src/viktrwlayer_tpwin.c:249 +msgid "Distance Difference:" +msgstr "Vzdálenosti mezi body:" + +#: ../src/viktrwlayer_tpwin.c:250 +msgid "Time Difference:" +msgstr "Rozdíl času:" + +#: ../src/viktrwlayer_tpwin.c:251 +msgid "\"Speed\" Between:" +msgstr "Rychlost mezi body:" + +#: ../src/viktrwlayer_tpwin.c:252 +msgid "Speed:" +msgstr "Rychlost:" + +#: ../src/viktrwlayer_tpwin.c:253 +msgid "VDOP:" +msgstr "VDOP:" + +#: ../src/viktrwlayer_tpwin.c:254 +msgid "HDOP:" +msgstr "HDOP:" + +#: ../src/viktrwlayer_tpwin.c:255 +msgid "PDOP:" +msgstr "PDOP:" + +#: ../src/viktrwlayer_tpwin.c:256 +msgid "SAT/FIX:" +msgstr "SAT/FIX:" + +#: ../src/viktrwlayer_tpwin.c:263 ../src/viktrwlayer_tpwin.c:408 +#: ../src/viktrwlayer_tpwin.c:622 +msgid "Trackpoint" +msgstr "Bod" + +#: ../src/viktrwlayer_tpwin.c:266 +msgid "_Insert After" +msgstr "Vložit _za" + +#: ../src/viktrwlayer_tpwin.c:268 +msgid "Split Here" +msgstr "Zde rozdělit" + +#: ../src/viktrwlayer_tracklist.c:262 ../src/viktrwlayer_waypointlist.c:306 +msgid "_Copy Data" +msgstr "" + +#. +#. item = gtk_image_menu_item_new_with_mnemonic ( _("_Select") ); +#. gtk_image_menu_item_set_image ( (GtkImageMenuItem*)item, gtk_image_new_from_stock (GTK_STOCK_FIND, GTK_ICON_SIZE_MENU) ); +#. g_signal_connect_swapped ( G_OBJECT(item), "activate", G_CALLBACK(trw_layer_track_select), values ); +#. gtk_menu_shell_append (GTK_MENU_SHELL (menu), item); +#. gtk_widget_show ( item ); +#. +#. ATM view auto selects, so don't bother with separate select menu entry +#. +#. item = gtk_image_menu_item_new_with_mnemonic ( _("_Select") ); +#. gtk_image_menu_item_set_image ( (GtkImageMenuItem*)item, gtk_image_new_from_stock (GTK_STOCK_FIND, GTK_ICON_SIZE_MENU) ); +#. g_signal_connect_swapped ( G_OBJECT(item), "activate", G_CALLBACK(trw_layer_waypoint_select), values ); +#. gtk_menu_shell_append (GTK_MENU_SHELL (menu), item); +#. gtk_widget_show ( item ); +#. +#. AUTO SELECT NOT TRUE YET... +#. ATM view auto selects, so don't bother with separate select menu entry +#: ../src/viktrwlayer_tracklist.c:290 ../src/viktrwlayer_waypointlist.c:341 +#: ../src/vikwindow.c:4816 +msgid "_View" +msgstr "_Zobrazení" + +#. Insert column for the layer name when viewing multi layers +#: ../src/viktrwlayer_tracklist.c:613 ../src/viktrwlayer_waypointlist.c:609 +msgid "Layer" +msgstr "Vrstva" + +#: ../src/viktrwlayer_tracklist.c:627 ../src/viktrwlayer_waypointlist.c:624 +msgid "Date" +msgstr "Datum" + +#: ../src/viktrwlayer_tracklist.c:631 ../src/viktrwlayer_waypointlist.c:628 +msgid "Visible" +msgstr "Viditelné" + +#: ../src/viktrwlayer_tracklist.c:639 +msgid "" +"Distance\n" +"(miles)" +msgstr "" +"Vzdálenost\n" +"(míle)" + +#: ../src/viktrwlayer_tracklist.c:642 +#, fuzzy +msgid "" +"Distance\n" +"(NM)" +msgstr "" +"Vzdálenost\n" +"(km)" + +#: ../src/viktrwlayer_tracklist.c:645 +msgid "" +"Distance\n" +"(km)" +msgstr "" +"Vzdálenost\n" +"(km)" + +#: ../src/viktrwlayer_tracklist.c:651 +msgid "" +"Length\n" +"(minutes)" +msgstr "" +"Délka\n" +"(minuty)" + +#: ../src/viktrwlayer_tracklist.c:660 ../src/vikutils.c:93 +msgid "sec/mi" +msgstr "" + +#: ../src/viktrwlayer_tracklist.c:666 +#, c-format +msgid "" +"Av. Speed\n" +"(%s)" +msgstr "" +"Prům. rychl.\n" +"(%s)" + +#. Apply own formatting of the data +#: ../src/viktrwlayer_tracklist.c:671 +#, c-format +msgid "" +"Max Speed\n" +"(%s)" +msgstr "" +"max rychlost\n" +"(%s)" + +#: ../src/viktrwlayer_tracklist.c:679 ../src/viktrwlayer_waypointlist.c:637 +msgid "" +"Max Height\n" +"(Feet)" +msgstr "" +"max. výška\n" +"(stopy)" + +#: ../src/viktrwlayer_tracklist.c:681 ../src/viktrwlayer_waypointlist.c:639 +msgid "" +"Max Height\n" +"(Metres)" +msgstr "" +"max. výška\n" +"(metry)" + +#: ../src/viktrwlayer_waypointlist.c:312 +msgid "Copy Data (with _positions)" +msgstr "" + +#: ../src/viktrwlayer_waypointlist.c:633 +msgid "Comment" +msgstr "" + +#: ../src/viktrwlayer_waypointlist.c:643 +msgid "Symbol" +msgstr "" + +#: ../src/viktrwlayer_wpwin.c:93 ../src/viktrwlayer_wpwin.c:302 +msgid "True" +msgstr "" + +#: ../src/viktrwlayer_wpwin.c:122 +msgid "Waypoint Properties" +msgstr "Vlastnosti místa" + +#: ../src/viktrwlayer_wpwin.c:164 +msgid "Name:" +msgstr "Název:" + +#: ../src/viktrwlayer_wpwin.c:181 +msgid "Altitude:" +msgstr "Výška:" + +#: ../src/viktrwlayer_wpwin.c:186 ../src/viktrwlayer_wpwin.c:188 +msgid "Comment:" +msgstr "Poznámka:" + +#: ../src/viktrwlayer_wpwin.c:202 +#, fuzzy +msgid "Source:" +msgstr "Zdroj stahování:" + +#: ../src/viktrwlayer_wpwin.c:212 +msgid "Image:" +msgstr "Obrázek:" + +#: ../src/viktrwlayer_wpwin.c:217 +msgid "Symbol:" +msgstr "Symbol:" + +#: ../src/viktrwlayer_wpwin.c:226 +msgid "(none)" +msgstr "(žádné)" + +#. Geotag Info [readonly] +#: ../src/viktrwlayer_wpwin.c:272 +msgid "Has Geotag" +msgstr "" + +#: ../src/viktrwlayer_wpwin.c:279 +msgid "Consistent Position" +msgstr "" + +#. ATM the direction value box is always shown, even when there is no information. +#. It would be nice to be able to hide it until the 'Add' has been performed, +#. however I've not been able to achieve this. +#. Thus simply sensistizing it instead. +#: ../src/viktrwlayer_wpwin.c:292 +#, fuzzy +msgid "Image Direction:" +msgstr "Časová zóna:" + +#: ../src/viktrwlayer_wpwin.c:300 +msgid "Magnetic" +msgstr "" + +#: ../src/viktrwlayer_wpwin.c:320 +msgid "Time:" +msgstr "Čas:" + +#. TODO: other checks (isalpha or whatever ) +#: ../src/viktrwlayer_wpwin.c:386 +msgid "Please enter a name for the waypoint." +msgstr "Zadejte prosím jméno místa." + +#: ../src/viktrwlayer_geotag.c:320 ../src/viktrwlayer_geotag.c:460 +#, c-format +msgid "Failed updating EXIF on %s" +msgstr "" + +#: ../src/viktrwlayer_geotag.c:562 +#, c-format +msgid "Geotagging %d Images..." +msgstr "Geotagování %d obrázků..." + +#: ../src/viktrwlayer_geotag.c:630 +msgid "Geotag Images" +msgstr "Geotagování obrázků" + +#: ../src/viktrwlayer_geotag.c:640 +msgid "Images" +msgstr "Obrázky" + +#: ../src/viktrwlayer_geotag.c:645 +msgid "Overwrite Existing Waypoints:" +msgstr "Přepsat stávající místa?" + +#: ../src/viktrwlayer_geotag.c:648 +msgid "Overwrite Existing GPS Information:" +msgstr "Přepsat existující GPS data:" + +#: ../src/viktrwlayer_geotag.c:650 +msgid "Keep File Modification Timestamp:" +msgstr "Zachovat čas změny souboru:" + +#: ../src/viktrwlayer_geotag.c:684 +msgid "Create Waypoints:" +msgstr "Vytvořit místa:" + +#: ../src/viktrwlayer_geotag.c:693 +msgid "Write EXIF:" +msgstr "Zapsat EXIF:" + +#: ../src/viktrwlayer_geotag.c:705 +msgid "Automatic Image Direction:" +msgstr "" + +#: ../src/viktrwlayer_geotag.c:707 +msgid "Set image direction based on a heading derived from the track" +msgstr "" + +#: ../src/viktrwlayer_geotag.c:710 +msgid "Interpolate Between Track Segments:" +msgstr "Interpolovat mezi segmenty stopy:" + +#: ../src/viktrwlayer_geotag.c:715 +msgid "Image Time Offset (Seconds):" +msgstr "Časový posun obrázků (sekundy):" + +#: ../src/viktrwlayer_geotag.c:718 +msgid "" +"The number of seconds to ADD to the photos time to make it match the GPS " +"data. Calculate this with (GPS - Photo). Can be negative or positive. Useful " +"to adjust times when a camera's timestamp was incorrect." +msgstr "" +"Počet sekund, které se přidají, nebo uberou z časové značky v obrázku, aby " +"si odpovídali údaje fotek a GPS. Vypočítejte jako čas fotky - čas gps." + +#: ../src/viktrwlayer_geotag.c:721 +msgid "Image Timezone:" +msgstr "Časová zóna:" + +#: ../src/viktrwlayer_geotag.c:724 +msgid "" +"The timezone that was used when the images were created. For example, if a " +"camera is set to AWST or +8:00 hours. Enter +8:00 here so that the correct " +"adjustment to the images' time can be made. GPS data is always in UTC." +msgstr "" +"Časová zóna použitá při vytváření obrázků. Například pokud je fotoaparát " +"nastaven na AWST +8:00, zadejte pro správné přepočítání +8:00. GPS záznamy " +"jsou vždy v UTC." + +#: ../src/viktrwlayer_geotag.c:728 +#, c-format +msgid "Using waypoint: %s" +msgstr "" + +#: ../src/viktrwlayer_geotag.c:742 +#, c-format +msgid "Using track: %s" +msgstr "Použít stopu: %s" + +#: ../src/viktrwlayer_geotag.c:744 +#, c-format +msgid "Using all tracks in: %s" +msgstr "Použít všechny stopy v: %s" + +#: ../src/viktrwlayer_analysis.c:214 +msgid "Number of Tracks" +msgstr "Počet záznamů" + +#: ../src/viktrwlayer_analysis.c:215 +msgid "Date Range" +msgstr "Časové období" + +#: ../src/viktrwlayer_analysis.c:216 +msgid "Total Length" +msgstr "Celková délka" + +#: ../src/viktrwlayer_analysis.c:217 +msgid "Average Length" +msgstr "Průměrná délka" + +#: ../src/viktrwlayer_analysis.c:218 +msgid "Eddington number" +msgstr "" + +#. No.4: Extended display only +#: ../src/viktrwlayer_analysis.c:219 +msgid "Max Speed" +msgstr "Maximální rychlost" + +#: ../src/viktrwlayer_analysis.c:220 +msgid "Avg. Speed" +msgstr "Průměrná rychlost" + +#: ../src/viktrwlayer_analysis.c:221 +msgid "Minimum Altitude" +msgstr "Nejmenší nadm. výška" + +#: ../src/viktrwlayer_analysis.c:222 +msgid "Maximum Altitude" +msgstr "Maximální nadm. výška" + +#: ../src/viktrwlayer_analysis.c:223 +msgid "Total Elevation Gain/Loss" +msgstr "Celková změna nadm. výšky" + +#: ../src/viktrwlayer_analysis.c:224 +msgid "Avg. Elevation Gain/Loss" +msgstr "Průměrné stoupání/pokles" + +#: ../src/viktrwlayer_analysis.c:225 +msgid "Total Duration" +msgstr "Celkové trvání" + +#: ../src/viktrwlayer_analysis.c:226 +msgid "Avg. Duration" +msgstr "Průměrné trvání" + +#: ../src/viktrwlayer_analysis.c:317 +#, c-format +msgid "%.2f miles" +msgstr "%.2f mil" + +#: ../src/viktrwlayer_analysis.c:320 +#, fuzzy, c-format +msgid "%.2f NM" +msgstr "%.2f km" + +#. VIK_UNITS_DISTANCE_KILOMETRES +#: ../src/viktrwlayer_analysis.c:324 +#, c-format +msgid "%.2f km" +msgstr "%.2f km" + +#: ../src/viktrwlayer_analysis.c:361 +#, c-format +msgid "%.2f m/s" +msgstr "%.2f m/s" + +#: ../src/viktrwlayer_analysis.c:370 ../src/viktrwlayer_analysis.c:373 +#, c-format +msgid "%.2f knots" +msgstr "%.2f uzlů" + +#: ../src/viktrwlayer_analysis.c:379 ../src/viktrwlayer_analysis.c:382 +#, c-format +msgid "%d s/km" +msgstr "" + +#: ../src/viktrwlayer_analysis.c:399 ../src/viktrwlayer_analysis.c:402 +#, c-format +msgid "%d sec/mi" +msgstr "" + +#: ../src/viktrwlayer_analysis.c:420 ../src/viktrwlayer_analysis.c:423 +#, c-format +msgid "%.2f km/h" +msgstr "%.2f km/h" + +#: ../src/viktrwlayer_analysis.c:434 ../src/viktrwlayer_analysis.c:440 +#, c-format +msgid "%d feet" +msgstr "%d stop" + +#: ../src/viktrwlayer_analysis.c:445 ../src/viktrwlayer_analysis.c:447 +#, c-format +msgid "%d feet / %d feet" +msgstr "%d stop / %d stop" + +#: ../src/viktrwlayer_analysis.c:452 ../src/viktrwlayer_analysis.c:458 +#, c-format +msgid "%d m" +msgstr "%d m" + +#: ../src/viktrwlayer_analysis.c:463 ../src/viktrwlayer_analysis.c:465 +#, c-format +msgid "%d m / %d m" +msgstr "%d m / %d m" + +#: ../src/viktrwlayer_analysis.c:477 +#, c-format +msgid "%d:%02d:%02d days:hrs:mins" +msgstr "%d:%02d:%02d days:hrs:mins" + +#: ../src/viktrwlayer_analysis.c:484 +#, c-format +msgid "%d:%02d hrs:mins" +msgstr "%d:%02d hod:min" + +#: ../src/viktrwlayer_analysis.c:658 +msgid "Include Invisible Items" +msgstr "" + +#: ../src/vikstatus.c:129 +msgid "Current number of background tasks. Click to see the background jobs." +msgstr "Počet úloh na pozadí. Po kliknutí se zobrazí průběh zpracování." + +#: ../src/vikstatus.c:134 +msgid "Current zoom level. Click to select a new one." +msgstr "Současný stupeň přiblížení. Klikněte k výběru." + +#: ../src/vikstatus.c:141 +msgid "Left click to clear the message. Right click to copy the message." +msgstr "" + +#: ../src/vikutils.c:108 +msgid "GPSD" +msgstr "GPSD" + +#. GPS Preamble +#: ../src/vikutils.c:109 +msgid "Trkpt" +msgstr "Trkpt" + +#: ../src/vikutils.c:160 +#, c-format +msgid "%sSpeed%s %.1f%s" +msgstr "%srychlost%s %.1f%s" + +#. Go for 2dp as expect low values for vertical speeds +#: ../src/vikutils.c:214 +#, c-format +msgid "%sClimb%s %.2f%s" +msgstr "" + +#: ../src/vikutils.c:223 +#, c-format +msgid "%sAlt %dfeet" +msgstr "%sVýška %dstop" + +#. VIK_UNITS_HEIGHT_METRES: +#: ../src/vikutils.c:227 +#, c-format +msgid "%sAlt %dm" +msgstr "%svýška %dm" + +#: ../src/vikutils.c:235 +#, c-format +msgid "%sCourse %03d°" +msgstr "%skurz %03d°" + +#: ../src/vikutils.c:249 +msgid "yards" +msgstr "yardy" + +#. VIK_UNITS_DISTANCE_KILOMETRES: +#: ../src/vikutils.c:253 +msgid "m" +msgstr "m" + +#: ../src/vikutils.c:257 +#, c-format +msgid "%sDistance diff %d%s" +msgstr "%svzdálenost %d%s" + +#: ../src/vikutils.c:272 +#, c-format +msgid "%sTime %s" +msgstr "%sčas %s" + +#: ../src/vikutils.c:281 +#, c-format +msgid "%sTime diff %lds" +msgstr "%sčas od do %lds" + +#: ../src/vikutils.c:287 +#, c-format +msgid "%sNo. of Sats %d" +msgstr "" + +#: ../src/vikutils.c:312 +#, c-format +msgid "%sTo End %.2f%s" +msgstr "" + +#: ../src/vikutils.c:339 +#, c-format +msgid "%sDistance along %.2f%s" +msgstr "" + +#: ../src/vikutils.c:359 +#, c-format +msgid "%sTrack: %s" +msgstr "%sstopa: %s" + +#: ../src/vikutils.c:396 +#, c-format +msgid "" +"There is a newer version of Viking available: %s\n" +"\n" +"Do you wish to go to Viking's website now?" +msgstr "" +"K dispozici je nová verze: %s\n" +"\n" +"Chcete přejít na domácí stránku projektu Viking?" + +#: ../src/vikutils.c:526 +msgid "" +"This appears to be Viking's very first run.\n" +"\n" +"Do you wish to enable automatic internet features?\n" +"\n" +"Individual settings can be controlled in the Preferences." +msgstr "" +"Vypadá to, že spouštíte Viking poprvé.\n" +"\n" +"Přejete si povolit funkce využívající internet?\n" +"\n" +"Úprava je možná v nastaveních." + +#: ../src/vikwaypoint.c:37 +msgid "Waypoint" +msgstr "Místo" + +#: ../src/vikwebtool_datasource.c:352 +msgid "Search Term" +msgstr "" + +#. TODO get rid of this as this is unnecessary duplication... +#: ../src/vikwindow.c:258 +msgid "Pan" +msgstr "Posun" + +#: ../src/vikwindow.c:258 +msgid "Zoom" +msgstr "Lupa" + +#: ../src/vikwindow.c:258 +msgid "Ruler" +msgstr "Pravítko" + +#: ../src/vikwindow.c:258 +msgid "Select" +msgstr "Vybrat" + +#: ../src/vikwindow.c:368 +msgid "This is Viking " +msgstr "" + +#: ../src/vikwindow.c:457 +msgid "Location lookup aborted" +msgstr "Hledání pozice zrušeno" + +#: ../src/vikwindow.c:477 +#, c-format +msgid "Location found: %s" +msgstr "Pozice nalezena: %s" + +#: ../src/vikwindow.c:486 +msgid "Unable to determine location" +msgstr "Pozice nenalezena" + +#: ../src/vikwindow.c:495 +msgid "Determining location" +msgstr "Zjišťuji pozici" + +#: ../src/vikwindow.c:525 +#, fuzzy, c-format +msgid "Location found via geoclue" +msgstr "Pozice nalezena: %s" + +#: ../src/vikwindow.c:546 +msgid "Default Map" +msgstr "Výchozí mapa" + +#: ../src/vikwindow.c:557 ../src/vikwindow.c:3938 +msgid "Trying to determine location..." +msgstr "Zkouším zjistit aktuální polohu..." + +#. Create tooltip +#: ../src/vikwindow.c:723 +msgid "Select zoom level" +msgstr "Vyberte úroveň přiblížení" + +#: ../src/vikwindow.c:1176 +#, c-format +msgid "" +"Do you want to save the changes you made to the document \"%s\"?\n" +"\n" +"Your changes will be lost if you don't save them." +msgstr "" +"Uložit změny v souboru \"%s\"?\n" +"Změny se ztratí pokud nebudou uloženy." + +#: ../src/vikwindow.c:1180 +msgid "Don't Save" +msgstr "Neukládat" + +#: ../src/vikwindow.c:1268 +msgid "mpp" +msgstr "mpp" + +#: ../src/vikwindow.c:1268 +msgid "pixelfact" +msgstr "pixelfact" + +#: ../src/vikwindow.c:1467 +#, c-format +msgid "%s %s %dm" +msgstr "%s %s %dm" + +#: ../src/vikwindow.c:1469 +#, c-format +msgid "%s %s %dft" +msgstr "%s %s %dft" + +#: ../src/vikwindow.c:1472 +#, c-format +msgid "%s %s" +msgstr "%s %s" + +#: ../src/vikwindow.c:1929 +msgid "_Ruler" +msgstr "_Pravítko" + +#: ../src/vikwindow.c:1929 +msgid "Ruler Tool" +msgstr "Pravítko" + +#: ../src/vikwindow.c:2204 ../src/vikwindow.c:4818 +msgid "_Zoom" +msgstr "_Přiblížení" + +#: ../src/vikwindow.c:2204 +msgid "Zoom Tool" +msgstr "Lupa" + +#: ../src/vikwindow.c:2271 ../src/vikwindow.c:4819 +msgid "_Pan" +msgstr "_Posun" + +#: ../src/vikwindow.c:2271 +msgid "Pan Tool" +msgstr "Posun" + +#: ../src/vikwindow.c:2425 +msgid "_Select" +msgstr "_Vybrat" + +#: ../src/vikwindow.c:2425 +msgid "Select Tool" +msgstr "Výběr" + +#: ../src/vikwindow.c:2615 +msgid "You must select a layer to show its properties." +msgstr "K zobrazení vlastností je třeba označit vrstvu." + +#. No error to show, so unlikely this will get called +#: ../src/vikwindow.c:2629 +msgid "The help system is not available." +msgstr "Nápověda není dostupná." + +#. Main error path +#: ../src/vikwindow.c:2632 +#, c-format +msgid "" +"Help is not available because: %s.\n" +"Ensure a Mime Type ghelp handler program is installed (e.g. yelp)." +msgstr "" +"Nápověda není dostupná: %s.\n" +"Ověřte dostupnost programmu pro Mime Type ghelp (např. yelp)." + +#: ../src/vikwindow.c:2865 +msgid "You must select a layer to delete." +msgstr "Ke smazání je třeba označit vrstvu." + +#: ../src/vikwindow.c:3171 +msgid "Untitled" +msgstr "Bez názvu" + +#: ../src/vikwindow.c:3300 +#, c-format +msgid "Unable to add '%s' to the list of recently used documents" +msgstr "'%s' nelze přidat do seznamu naposledy použitých souborů." + +#: ../src/vikwindow.c:3391 +msgid "The file you requested could not be opened." +msgstr "Nelze otevřít vybraný soubor." + +#: ../src/vikwindow.c:3394 +msgid "" +"GPSBabel is required to load files of this type or GPSBabel encountered " +"problems." +msgstr "" +"GPSBabel je vyžadován pro nahrávání tohoto typu dat, nebo nastala chyba po " +"spuštění GPSBabel." + +#: ../src/vikwindow.c:3397 +#, c-format +msgid "Unable to load malformed GPX file %s" +msgstr "Nelze nahrát poškozený GPX soubor %s" + +#: ../src/vikwindow.c:3400 +#, c-format +msgid "Unsupported file type for %s" +msgstr "Nepodporovaný typ souboru %s" + +#. Since we can process .vik files with issues just show a warning in the status bar +#. Not that a user can do much about it... or tells them what this issue is yet... +#: ../src/vikwindow.c:3406 +#, c-format +msgid "WARNING: issues encountered loading %s" +msgstr "Varování: problém při nahrávání %s" + +#: ../src/vikwindow.c:3489 +msgid "Please select a GPS data file to open. " +msgstr "Vyberte prosím datový GPS soubor. " + +#: ../src/vikwindow.c:3508 +msgid "Google Earth" +msgstr "Google Earth" + +#: ../src/vikwindow.c:3523 ../src/vikwindow.c:3646 ../src/viking.desktop.in.h:1 +msgid "Viking" +msgstr "Viking" + +#: ../src/vikwindow.c:3594 ../src/vikwindow.c:4632 +msgid "Open File" +msgstr "" + +#: ../src/vikwindow.c:3630 +msgid "Save as Viking File." +msgstr "Uložit jako soubor typu Viking." + +#: ../src/vikwindow.c:3757 +#, c-format +msgid "Exporting to file: %s" +msgstr "" + +#. Confirm what happened. +#: ../src/vikwindow.c:3774 +#, c-format +msgid "Exported files: %d" +msgstr "Exportované soubory: %d" + +#: ../src/vikwindow.c:3786 +msgid "Nothing to Export!" +msgstr "Nic k exportu!" + +#: ../src/vikwindow.c:3790 +msgid "Export to directory" +msgstr "Export do adresáře" + +#: ../src/vikwindow.c:3809 +msgid "Could not convert all files" +msgstr "" + +#: ../src/vikwindow.c:3851 +msgid "File not accessible" +msgstr "Soubor nedostupný" + +#: ../src/vikwindow.c:3854 +msgid "No Viking File" +msgstr "Žádný .vik soubor" + +#: ../src/vikwindow.c:3998 +msgid "This layer has no configurable properties." +msgstr "Vrstva nemá nic k nastavení." + +#: ../src/vikwindow.c:4080 +msgid "Are you sure you wish to delete all layers?" +msgstr "Opravdu smazat všechny vrstvy?" + +#. Try harder... +#: ../src/vikwindow.c:4126 ../src/vikwindow.c:4132 +msgid "Generating image file..." +msgstr "Generování obrázku..." + +#: ../src/vikwindow.c:4154 +msgid "" +"Failed to generate internal image.\n" +"\n" +"Try creating a smaller image." +msgstr "" +"Selhalo interní generování obrázku.\n" +"\n" +"Zkuste vytvářet menší velikost obrázku." + +#: ../src/vikwindow.c:4175 +msgid "Image file generated." +msgstr "Obrázek vygenerován." + +#: ../src/vikwindow.c:4177 +msgid "Failed to generate image file." +msgstr "Selhalo generování obrázku." + +#: ../src/vikwindow.c:4246 +#, c-format +msgid "Unable to write to file %s: %s" +msgstr "" + +#: ../src/vikwindow.c:4284 +msgid "" +"Viewable region outside allowable pixel size bounds for image. Clipping " +"width/height values." +msgstr "Zobrazovaná oblast přesáhla okraje mapy. Upravuji zobrazení." + +#: ../src/vikwindow.c:4309 +#, c-format +msgid "Total area: %ldm x %ldm (%.3f sq. km)" +msgstr "Celková plocha: %ldm x %ldm (%.3f km čtv. )" + +#: ../src/vikwindow.c:4312 +#, c-format +msgid "Total area: %ldm x %ldm (%.3f sq. miles)" +msgstr "Celková plocha %ldm x %ldm (%.3f čtv. mil)" + +#: ../src/vikwindow.c:4315 +#, c-format +msgid "Total area: %ldm x %ldm (%.3f sq. NM)" +msgstr "" + +#. Single file +#: ../src/vikwindow.c:4343 +msgid "Save Image" +msgstr "Uložit obrázek" + +#: ../src/vikwindow.c:4364 ../src/vikwindow.c:4641 +msgid "KMZ" +msgstr "" + +#: ../src/vikwindow.c:4417 +msgid "You must be in UTM mode to use this feature" +msgstr "Tato funkce je dostupná pouze v UTM módu" + +#: ../src/vikwindow.c:4421 +msgid "Choose a directory to hold images" +msgstr "Vybrat adresář na obrázky" + +#. todo: default for answers inside VikWindow or static (thruout instance) +#: ../src/vikwindow.c:4441 +msgid "Save to Image File" +msgstr "Uložit obrázek do souboru" + +#: ../src/vikwindow.c:4457 +msgid "Width (pixels):" +msgstr "Šířka (pixelů):" + +#: ../src/vikwindow.c:4459 +msgid "Height (pixels):" +msgstr "Výška (pixelů):" + +#: ../src/vikwindow.c:4462 +msgid "" +"WARNING: USING LARGE IMAGES OVER 10000x10000\n" +"MAY CRASH THE PROGRAM!" +msgstr "" +"Varování: velikost obrázku větší než 10000x10000\n" +"může program ukončit!" + +#: ../src/vikwindow.c:4464 +msgid "Zoom (meters per pixel):" +msgstr "Měrítko (metrů/pixel)" + +#: ../src/vikwindow.c:4480 +msgid "Area in current viewable window" +msgstr "Aktuálně zobrazená oblast" + +#: ../src/vikwindow.c:4490 +msgid "Save as PNG" +msgstr "Uložit jako PNG" + +#: ../src/vikwindow.c:4491 +msgid "Save as JPEG" +msgstr "Uložit jako JPEG" + +#: ../src/vikwindow.c:4520 +msgid "East-west image tiles:" +msgstr "Východ-západ obrázky:" + +#: ../src/vikwindow.c:4522 +msgid "North-south image tiles:" +msgstr "Počet obrázků svisle:" + +#: ../src/vikwindow.c:4619 +msgid "This feature is not available in UTM mode" +msgstr "" + +#: ../src/vikwindow.c:4658 +#, c-format +msgid "Unable to import %s." +msgstr "" + +#: ../src/vikwindow.c:4749 +msgid "Choose a background color" +msgstr "Vyberte barvu pozadí" + +#: ../src/vikwindow.c:4765 +msgid "Choose a track highlight color" +msgstr "Barva zvýraznění stopy" + +#: ../src/vikwindow.c:4814 +msgid "_File" +msgstr "_Soubor" + +#: ../src/vikwindow.c:4815 +msgid "_Edit" +msgstr "_Upravit" + +#: ../src/vikwindow.c:4817 +msgid "_Show" +msgstr "_Zobrazit" + +#: ../src/vikwindow.c:4820 +msgid "_Layers" +msgstr "_Vrstvy" + +#: ../src/vikwindow.c:4821 +msgid "_Tools" +msgstr "Nás_troje" + +#: ../src/vikwindow.c:4822 +msgid "_Webtools" +msgstr "_Externí odkazy" + +#: ../src/vikwindow.c:4823 ../src/vikwindow.c:4893 +msgid "_Help" +msgstr "_Nápověda" + +#: ../src/vikwindow.c:4825 +msgid "New file" +msgstr "Nový soubor" + +#: ../src/vikwindow.c:4826 +msgid "_Open..." +msgstr "_Otevřít..." + +#: ../src/vikwindow.c:4826 +msgid "Open a file" +msgstr "Otevřít soubor" + +#: ../src/vikwindow.c:4827 +msgid "Open _Recent File" +msgstr "O_tevřít nedávné soubory" + +#: ../src/vikwindow.c:4828 +msgid "Append _File..." +msgstr "Připojit soubor" + +#: ../src/vikwindow.c:4828 +msgid "Append data from a different file" +msgstr "Připojí data z jiného souboru" + +#: ../src/vikwindow.c:4829 +msgid "Open GPX as External _Layer..." +msgstr "" + +#: ../src/vikwindow.c:4829 +msgid "Open a GPX file as an external layer" +msgstr "" + +#: ../src/vikwindow.c:4830 +msgid "_Export All" +msgstr "_Exportovat vše" + +#: ../src/vikwindow.c:4830 +msgid "Export All TrackWaypoint Layers" +msgstr "Export všech vrstev Stopy a trasy" + +#: ../src/vikwindow.c:4831 +msgid "_GPX..." +msgstr "_GPX..." + +#: ../src/vikwindow.c:4831 +msgid "Export as GPX" +msgstr "Export jako GPX" + +#: ../src/vikwindow.c:4832 +msgid "A_cquire" +msgstr "_Získat" + +#: ../src/vikwindow.c:4833 +msgid "_Directions..." +msgstr "_Plán trasy..." + +#: ../src/vikwindow.c:4833 +msgid "Get driving directions" +msgstr "Získat plán trasy" + +#: ../src/vikwindow.c:4835 +msgid "_OSM Traces..." +msgstr "_OSM záznamy..." + +#: ../src/vikwindow.c:4835 +msgid "Get traces from OpenStreetMap" +msgstr "Stáhnout záznamy z OpenStreetMap" + +#: ../src/vikwindow.c:4836 +msgid "_My OSM Traces..." +msgstr "M_oje OSM záznamy" + +#: ../src/vikwindow.c:4836 +msgid "Get Your Own Traces from OpenStreetMap" +msgstr "Stáhnout vlastní OSM záznamy" + +#: ../src/vikwindow.c:4839 +msgid "Geo_caches..." +msgstr "Geo_cache.." + +#: ../src/vikwindow.c:4839 +msgid "Get Geocaches from geocaching.com" +msgstr "Získat Geocache z geocaching.com" + +#: ../src/vikwindow.c:4842 +msgid "Create waypoints from geotagged images" +msgstr "Vytvořit místa z geotagovaných obrázků" + +#: ../src/vikwindow.c:4844 +msgid "Get a file from a URL" +msgstr "" + +#: ../src/vikwindow.c:4846 +msgid "Create waypoints from Wikipedia items in the current view" +msgstr "Vytvořit v tomto pohledu místa z Wikipedie" + +#: ../src/vikwindow.c:4848 +msgid "_Save" +msgstr "_Uložit" + +#: ../src/vikwindow.c:4848 +msgid "Save the file" +msgstr "Uložit soubor" + +#: ../src/vikwindow.c:4849 +msgid "Save _As..." +msgstr "Uložit _jako..." + +#: ../src/vikwindow.c:4849 +msgid "Save the file under different name" +msgstr "Uložit soubor s jiným jménem" + +#: ../src/vikwindow.c:4850 +msgid "Properties..." +msgstr "Vlastnosti..." + +#: ../src/vikwindow.c:4850 +msgid "File Properties" +msgstr "Vlastnosti souboru" + +#: ../src/vikwindow.c:4852 +msgid "Import KMZ _Map File..." +msgstr "" + +#: ../src/vikwindow.c:4852 +msgid "Import a KMZ file" +msgstr "" + +#: ../src/vikwindow.c:4853 +msgid "Generate _KMZ Map File..." +msgstr "" + +#: ../src/vikwindow.c:4853 +msgid "Generate a KMZ file with an overlay of the current view" +msgstr "" + +#: ../src/vikwindow.c:4855 +msgid "_Generate Image File..." +msgstr "_Generovat obrázek..." + +#: ../src/vikwindow.c:4855 +msgid "Save a snapshot of the workspace into a file" +msgstr "Uloží zobrazení mapy jako obrázek" + +#: ../src/vikwindow.c:4856 +msgid "Generate _Directory of Images..." +msgstr "Generovat _adresář s obrázky..." + +#: ../src/vikwindow.c:4856 +msgid "Generate _Directory of Images" +msgstr "" + +#: ../src/vikwindow.c:4857 +msgid "_Print..." +msgstr "_Tisk..." + +#: ../src/vikwindow.c:4857 +msgid "Print maps" +msgstr "Tisk map" + +#: ../src/vikwindow.c:4858 +msgid "E_xit" +msgstr "U_končit" + +#: ../src/vikwindow.c:4858 +msgid "Exit the program" +msgstr "Ukončit aplikaci" + +#: ../src/vikwindow.c:4859 +msgid "Save and Exit" +msgstr "U_ložit a ukončit" + +#: ../src/vikwindow.c:4859 +msgid "Save and Exit the program" +msgstr "Uložit a ukončit aplikaci" + +#: ../src/vikwindow.c:4861 +msgid "Go to the Pre_vious Location" +msgstr "" + +#: ../src/vikwindow.c:4861 +msgid "Go to the previous location" +msgstr "" + +#: ../src/vikwindow.c:4862 +msgid "Go to the _Next Location" +msgstr "" + +#: ../src/vikwindow.c:4862 +msgid "Go to the next location" +msgstr "" + +#: ../src/vikwindow.c:4863 +msgid "Go to the _Default Location" +msgstr "Jít na výchozí pozici" + +#: ../src/vikwindow.c:4863 +msgid "Go to the default location" +msgstr "Jít na výchozí pozici" + +#: ../src/vikwindow.c:4864 +#, fuzzy +msgid "Go to the _Auto Location" +msgstr "Jít na výchozí pozici" + +#: ../src/vikwindow.c:4864 +msgid "Go to a location via automatic lookup" +msgstr "" + +#: ../src/vikwindow.c:4865 +msgid "Go to _Location..." +msgstr "Jít na _místo..." + +#: ../src/vikwindow.c:4865 +msgid "Go to address/place using text search" +msgstr "Jít na adresu pomocí vyhledávání" + +#: ../src/vikwindow.c:4866 +msgid "_Go to Lat/Lon..." +msgstr "Jít na pozici..." + +#: ../src/vikwindow.c:4866 +msgid "Go to arbitrary lat/lon coordinate" +msgstr "Jít na souřadnice" + +#: ../src/vikwindow.c:4867 +msgid "Go to UTM..." +msgstr "Jít na souřadnice _UTM..." + +#: ../src/vikwindow.c:4867 +msgid "Go to arbitrary UTM coordinate" +msgstr "Jít na libovolné UTM souřadnice" + +#: ../src/vikwindow.c:4868 +#, fuzzy +msgid "Go to Today" +msgstr "Jít na souřadnice UTM" + +#: ../src/vikwindow.c:4868 +msgid "Go to today on the calendar" +msgstr "" + +#: ../src/vikwindow.c:4869 +msgid "_Refresh" +msgstr "_Obnovit" + +#: ../src/vikwindow.c:4869 +msgid "Refresh any maps displayed" +msgstr "Obnovit mapy v tomto pohledu" + +#: ../src/vikwindow.c:4870 +msgid "Set _Highlight Color..." +msgstr "Nastavte barvu zvýraznění..." + +#: ../src/vikwindow.c:4870 +msgid "Set Highlight Color" +msgstr "" + +#: ../src/vikwindow.c:4871 +msgid "Set Bac_kground Color..." +msgstr "Nastavit barvu p_ozadí..." + +#: ../src/vikwindow.c:4871 +msgid "Set Background Color" +msgstr "" + +#: ../src/vikwindow.c:4872 +msgid "Zoom _In" +msgstr "Př_iblížit" + +#: ../src/vikwindow.c:4872 +msgid "Zoom In" +msgstr "" + +#: ../src/vikwindow.c:4873 +msgid "Zoom _Out" +msgstr "_Oddálit" + +#: ../src/vikwindow.c:4873 +msgid "Zoom Out" +msgstr "" + +#: ../src/vikwindow.c:4874 +msgid "Zoom _To..." +msgstr "Přiblížit na..." + +#: ../src/vikwindow.c:4874 +msgid "Zoom To" +msgstr "" + +#: ../src/vikwindow.c:4875 +msgid "Pan _North" +msgstr "na _sever" + +#: ../src/vikwindow.c:4876 +msgid "Pan _East" +msgstr "na _západ" + +#: ../src/vikwindow.c:4877 +msgid "Pan _South" +msgstr "na _jih" + +#: ../src/vikwindow.c:4878 +msgid "Pan _West" +msgstr "na _západ" + +#: ../src/vikwindow.c:4879 +msgid "Background _Jobs" +msgstr "Úlohy na _pozadí" + +#: ../src/vikwindow.c:4879 +msgid "Background Jobs" +msgstr "" + +#: ../src/vikwindow.c:4881 +msgid "Cu_t" +msgstr "Vyjmou_t" + +#: ../src/vikwindow.c:4885 +msgid "Delete All" +msgstr "S_mazat vše" + +#: ../src/vikwindow.c:4886 +msgid "Copy Centre _Location" +msgstr "" + +#: ../src/vikwindow.c:4887 +msgid "_Flush Map Cache" +msgstr "V_ymazat mapovou cache" + +#: ../src/vikwindow.c:4888 +msgid "_Set the Default Location" +msgstr "_Nastavit výchozí místo" + +#: ../src/vikwindow.c:4888 +msgid "Set the Default Location to the current position" +msgstr "Nastavit výchozí místo na aktuální pozici" + +#: ../src/vikwindow.c:4889 +msgid "_Preferences" +msgstr "_Nastavení" + +#: ../src/vikwindow.c:4889 +msgid "Program Preferences" +msgstr "" + +#: ../src/vikwindow.c:4890 +msgid "_Layer Defaults" +msgstr "_Výchozí nastavení vrstev" + +#: ../src/vikwindow.c:4891 +msgid "_Properties" +msgstr "V_lastnosti" + +#: ../src/vikwindow.c:4893 +msgid "Help" +msgstr "" + +#: ../src/vikwindow.c:4894 +msgid "_About" +msgstr "O _aplikaci" + +#: ../src/vikwindow.c:4894 +msgid "About" +msgstr "" + +#: ../src/vikwindow.c:4903 +msgid "_KML..." +msgstr "_KML..." + +#: ../src/vikwindow.c:4903 +msgid "Export as KML" +msgstr "Export jako KML" + +#: ../src/vikwindow.c:4904 +msgid "Transfer data from a GPS device" +msgstr "Získat data z GPS" + +#: ../src/vikwindow.c:4905 +msgid "Import file via GPSBabel converter" +msgstr "Import souboru pomocí GPSBabel" + +#: ../src/vikwindow.c:4909 +msgid "Import Geo_JSON File..." +msgstr "" + +#: ../src/vikwindow.c:4909 +msgid "Import GeoJSON file" +msgstr "" + +#: ../src/vikwindow.c:4914 +msgid "_UTM Mode" +msgstr "_UTM mód" + +#: ../src/vikwindow.c:4915 +msgid "_Expedia Mode" +msgstr "_Expedia mód" + +#: ../src/vikwindow.c:4916 +msgid "_Mercator Mode" +msgstr "_Mercator mód" + +#: ../src/vikwindow.c:4917 +msgid "Lat_/Lon Mode" +msgstr "Lat_/Lon mód" + +#: ../src/vikwindow.c:4921 +msgid "Show _Scale" +msgstr "_Měřítko" + +#: ../src/vikwindow.c:4921 +msgid "Show Scale" +msgstr "Zobrazit _měřítko" + +#: ../src/vikwindow.c:4922 +msgid "Show _Center Mark" +msgstr "S_třed" + +#: ../src/vikwindow.c:4922 +msgid "Show Center Mark" +msgstr "Zobrazit s_třed" + +#: ../src/vikwindow.c:4923 +msgid "Show _Highlight" +msgstr "_Zvýraznit" + +#: ../src/vikwindow.c:4923 +msgid "Show Highlight" +msgstr "Zvýraznit" + +#: ../src/vikwindow.c:4924 +msgid "_Full Screen" +msgstr "_Celá obrazovka" + +#: ../src/vikwindow.c:4924 +msgid "Activate full screen mode" +msgstr "Přes celou obrazovku" + +#: ../src/vikwindow.c:4925 +msgid "Show Side _Panel" +msgstr "_Boční panel" + +#: ../src/vikwindow.c:4925 +msgid "Show Side Panel" +msgstr "Boční panel vstev" + +#: ../src/vikwindow.c:4926 +msgid "Show Status_bar" +msgstr "_Stavovou lištu" + +#: ../src/vikwindow.c:4926 +msgid "Show Statusbar" +msgstr "_Stavovou lištu" + +#: ../src/vikwindow.c:4927 +msgid "Show _Toolbar" +msgstr "_Panel nástrojů" + +#: ../src/vikwindow.c:4927 +msgid "Show Toolbar" +msgstr "Panel _nástrojů" + +#: ../src/vikwindow.c:4928 +msgid "Show _Menu" +msgstr "_Menu" + +#: ../src/vikwindow.c:4928 +msgid "Show Menu" +msgstr "_Menu" + +#: ../src/vikwindow.c:4929 +#, fuzzy +msgid "Show Side Panel B_uttons" +msgstr "Boční panel vstev" + +#: ../src/vikwindow.c:4929 +#, fuzzy +msgid "Show Side Panel Buttons" +msgstr "Boční panel vstev" + +#: ../src/vikwindow.c:4930 +#, fuzzy +msgid "Show Side Panel Ca_lendar" +msgstr "Boční panel vstev" + +#: ../src/vikwindow.c:4930 +#, fuzzy +msgid "Show Side Panel Calendar" +msgstr "Boční panel vstev" + +#: ../src/vikwindow.c:5064 +#, c-format +msgid "New _%s Layer" +msgstr "nová _%s vrstva" + +#: ../src/vikwindow.c:5114 +#, fuzzy +msgid "..." +msgstr "Přidat..." + +#: ../src/viking.desktop.in.h:2 +msgid "GPS Data Manager" +msgstr "Správce GPS dat" + +#: ../src/viking.desktop.in.h:3 +msgid "Map Based GPS Data Manager (live data capable)." +msgstr "Správce GPS a mapových dat" + +#: ../src/libjpeg/jpeg-data.c:205 +msgid "Data does not follow JPEG specification." +msgstr "Data nerespektují specifikaci formátu JPEG" + +#: ../src/libjpeg/jpeg-data.c:302 +#, c-format +msgid "Path '%s' invalid." +msgstr "Cesta '%s' je chybná," + +#: ../src/libjpeg/jpeg-data.c:320 +#, c-format +msgid "Could not read '%s'." +msgstr "Nelze číst '%s'." + +#~ msgid "en" +#~ msgstr "en" + +#~ msgid "Polygonzied Layer" +#~ msgstr "Polygonální vrstva" + +#~ msgid "Email:" +#~ msgstr "email:" + +#~ msgid "I don't know that place. Do you want another goto?" +#~ msgstr "Místo nenalezono. Zkusit jiné?" + +#~ msgid "Error: couldn't find gpsbabel." +#~ msgstr "Chyba: gpsbabel nenalezen" + +#~ msgid "Create _Track" +#~ msgstr "Vytvořit s_topu" + +#~ msgid "Create Track" +#~ msgstr "Vytvořit stopu" + +#~ msgid "Create _Route" +#~ msgstr "Vytvořit trasu" + +#~ msgid "Create Route" +#~ msgstr "Vytvořit trasu" + +#~ msgid "%.2f knots\n" +#~ msgstr "%.2f uzlů\n" diff --git a/po/da.po b/po/da.po new file mode 100644 index 0000000..b727a79 --- /dev/null +++ b/po/da.po @@ -0,0 +1,6083 @@ +# Danish translation for viking +# Copyright (c) 2007 Rosetta Contributors and Canonical Ltd 2007 +# This file is distributed under the same license as the viking package. +# FIRST AUTHOR , 2007. +# +msgid "" +msgstr "" +"Project-Id-Version: viking\n" +"Report-Msgid-Bugs-To: \n" +"POT-Creation-Date: 2019-01-19 12:53+0000\n" +"PO-Revision-Date: 2010-11-17 23:14+0000\n" +"Last-Translator: Guilhem Bonnefille \n" +"Language-Team: Danish \n" +"Language: da\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-Launchpad-Export-Date: 2018-12-21 17:32+0000\n" +"X-Generator: Launchpad (build 18847)\n" + +#: ../src/acquire.c:106 ../src/vikgpslayer.c:1367 +msgid "Done." +msgstr "Færdig." + +#: ../src/acquire.c:115 +msgid "No data." +msgstr "" + +#: ../src/acquire.c:167 ../src/acquire.c:415 +msgid "Error: acquisition failed." +msgstr "" + +#: ../src/acquire.c:339 +msgid "Working..." +msgstr "Arbejder..." + +#. This shouldn't happen... +#: ../src/acquire.c:406 +msgid "" +"Unable to create command\n" +"Acquire method failed." +msgstr "" + +#: ../src/acquire.c:513 +msgid "_Filter" +msgstr "" + +#: ../src/acquire.c:528 +#, c-format +msgid "Filter with %s" +msgstr "" + +#: ../src/acquire.c:545 +msgid "Filter" +msgstr "" + +#: ../src/babel.c:640 +msgid "GPSBabel:" +msgstr "" + +#: ../src/babel.c:641 +msgid "" +"Allow setting the specific instance of GPSBabel. You must restart Viking for " +"this value to take effect." +msgstr "" + +#: ../src/babel_ui.c:79 +msgid "Select a file format" +msgstr "" + +#: ../src/babel_ui.c:144 ../src/viktrwlayer.c:531 ../src/viktrwlayer.c:2882 +msgid "Tracks" +msgstr "Spor" + +#: ../src/babel_ui.c:149 ../src/viktrwlayer.c:2892 +msgid "Routes" +msgstr "" + +#. ***** PARAMETERS ***** +#: ../src/babel_ui.c:154 ../src/viktrwlayer.c:531 ../src/viktrwlayer.c:2887 +msgid "Waypoints" +msgstr "" + +#: ../src/background.c:64 +#, c-format +msgid "%d items" +msgstr "%d emner" + +#: ../src/background.c:287 +msgid "Threads:" +msgstr "" + +#: ../src/background.c:288 +msgid "" +"Number of threads to use for Mapnik tasks. You need to restart Viking for a " +"change to this value to be used" +msgstr "" + +#: ../src/background.c:361 +msgid "Job" +msgstr "Opgave" + +#: ../src/background.c:365 +msgid "Progress" +msgstr "Fremdrift" + +#: ../src/background.c:373 +msgid "Viking Background Jobs" +msgstr "Viking baggrundsjob" + +#: ../src/bing.c:42 +msgid "Bing Aerial" +msgstr "" + +#: ../src/bing.c:48 +msgid "Bing" +msgstr "" + +#. VIK_GTK_WINDOW_FROM_WIDGET(vp) +#: ../src/bingmapsource.c:514 +msgid "Bing attribution Loading" +msgstr "" + +#: ../src/clipboard.c:95 +msgid "paste failed" +msgstr "" + +#: ../src/clipboard.c:105 +msgid "wrong clipboard data size" +msgstr "" + +#: ../src/clipboard.c:124 +#, c-format +msgid "" +"The clipboard contains sublayer data for %s layers. You must select a layer " +"of this type to paste the clipboard data." +msgstr "" + +#: ../src/clipboard.c:264 +msgid "" +"In order to paste a waypoint, please select an appropriate layer to paste " +"into." +msgstr "" + +#: ../src/dialog.c:60 +msgid "Go to Lat/Lon" +msgstr "" + +#: ../src/dialog.c:69 ../src/viktrwlayer_wpwin.c:173 +msgid "Latitude:" +msgstr "Breddegrad:" + +#: ../src/dialog.c:72 ../src/viktrwlayer_wpwin.c:177 +msgid "Longitude:" +msgstr "Længdegrad:" + +#: ../src/dialog.c:102 +msgid "Go to UTM" +msgstr "" + +#: ../src/dialog.c:114 +msgid "Northing:" +msgstr "" + +#: ../src/dialog.c:117 +msgid "Easting:" +msgstr "" + +#: ../src/dialog.c:121 ../src/vikgeoreflayer.c:902 +msgid "Zone:" +msgstr "Zone:" + +#: ../src/dialog.c:124 ../src/vikgeoreflayer.c:904 +msgid "Letter:" +msgstr "" + +#: ../src/dialog.c:246 ../src/geonamessearch.c:238 +#: ../src/datasource_osm_my_traces.c:505 +msgid "Nothing was selected" +msgstr "" + +#: ../src/dialog.c:254 +msgid "Add Route" +msgstr "" + +#: ../src/dialog.c:254 +msgid "Add Track" +msgstr "Tilføj spor" + +#: ../src/dialog.c:262 +msgid "Route Name:" +msgstr "" + +#: ../src/dialog.c:262 +msgid "Track Name:" +msgstr "Spornavn:" + +#: ../src/dialog.c:282 +msgid "Please enter a name for the track." +msgstr "Indtast venligst et navn for sporet." + +#: ../src/dialog.c:311 +msgid "Today" +msgstr "" + +#: ../src/dialog.c:393 +msgid "Zoom Factors..." +msgstr "Zoom faktor..." + +#: ../src/dialog.c:407 +msgid "Zoom factor (in meters per pixel):" +msgstr "" + +#: ../src/dialog.c:408 +msgid "X (easting): " +msgstr "" + +#: ../src/dialog.c:409 +msgid "Y (northing): " +msgstr "" + +#: ../src/dialog.c:414 +msgid "X and Y zoom factors must be equal" +msgstr "" + +#: ../src/dialog.c:469 +msgid "1 min" +msgstr "1 min" + +#: ../src/dialog.c:470 +msgid "1 hour" +msgstr "1 time" + +#: ../src/dialog.c:471 +msgid "1 day" +msgstr "1 dag" + +#: ../src/dialog.c:472 +msgid "Custom (in minutes):" +msgstr "" + +#: ../src/dialog.c:608 +#, c-format +msgid "" +"2003-2008, Evan Battaglia\n" +"2008-%s, Viking's contributors" +msgstr "" + +#: ../src/dialog.c:609 +msgid "GPS Data and Topo Analyzer, Explorer, and Manager." +msgstr "" + +#: ../src/dialog.c:610 +msgid "" +"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.\n" +"\n" +"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.\n" +"\n" +"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., 59 Temple " +"Place, Suite 330, Boston, MA 02111-1307, USA" +msgstr "" + +#: ../src/dialog.c:703 +msgid "Translation is coordinated on http://launchpad.net/viking" +msgstr "" + +#: ../src/dialog.c:713 +msgid "Download along track" +msgstr "" + +#: ../src/dialog.c:720 +msgid "Map type:" +msgstr "Korttype:" + +#: ../src/dialog.c:726 +msgid "Zoom level:" +msgstr "Zoom niveau:" + +#: ../src/dialog.c:766 +#, c-format +msgid "The map data is licensed: %s." +msgstr "" + +#: ../src/dialog.c:769 +#, c-format +msgid "" +"The data provided by '%s' are licensed under the following license: " +"%s." +msgstr "" + +#: ../src/dialog.c:773 +msgid "Open license" +msgstr "" + +#: ../src/expedia.c:54 +msgid "Expedia Street Maps" +msgstr "Expedia vejkort" + +#: ../src/expedia.c:82 +msgid "Invalid expedia altitude" +msgstr "" + +#: ../src/expedia.c:113 +#, c-format +msgid "" +"Couldn't open EXPEDIA image file (right after successful download! Please " +"report and delete image file!): %s" +msgstr "" + +#: ../src/expedia.c:126 +#, c-format +msgid "" +"Couldn't save EXPEDIA image file (right after successful download! Please " +"report and delete image file!): %s" +msgstr "" + +#: ../src/geonamessearch.c:115 +msgid "Search" +msgstr "Søgning" + +#: ../src/geonamessearch.c:117 +msgid "No entries found!" +msgstr "" + +#. NB could allow columns to be shifted around by doing this after each new +#. gtk_tree_view_column_set_reorderable ( column, TRUE ); +#. However I don't think is that useful, so I haven't put it in +#: ../src/geonamessearch.c:171 ../src/datasource_osm_my_traces.c:422 +#: ../src/viktrwlayer_tracklist.c:621 ../src/viktrwlayer_waypointlist.c:618 +msgid "Name" +msgstr "" + +#: ../src/geonamessearch.c:176 +msgid "Feature" +msgstr "" + +#: ../src/geonamessearch.c:181 ../src/datasource_osm_my_traces.c:437 +msgid "Lat/Lon" +msgstr "" + +#: ../src/geonamessearch.c:264 ../src/googlesearch.c:101 ../src/vikgoto.c:430 +msgid "couldn't map temp file" +msgstr "" + +#: ../src/geonamessearch.c:459 +msgid "Select articles" +msgstr "" + +#: ../src/geonamessearch.c:459 +msgid "Select the articles you want to add." +msgstr "" + +#: ../src/geonamessearch.c:475 +msgid "city" +msgstr "" + +#: ../src/geonamessearch.c:477 +msgid "edu" +msgstr "" + +#: ../src/geonamessearch.c:479 +msgid "airport" +msgstr "" + +#: ../src/geonamessearch.c:481 +msgid "mountain" +msgstr "" + +#: ../src/geonamessearch.c:483 +msgid "forest" +msgstr "" + +#: ../src/geonamessearch.c:485 +msgid "church" +msgstr "" + +#: ../src/geojson.c:74 +#, c-format +msgid "%s command failed: %s" +msgstr "" + +#: ../src/geojson.c:146 ../src/gpx.c:1317 +#, c-format +msgid "failed to open temporary file: %s" +msgstr "det mislykkedes at åbne midlertidig fil: %s" + +#: ../src/globals.c:67 +msgid "DDD" +msgstr "" + +#: ../src/globals.c:67 +msgid "DMM" +msgstr "" + +#: ../src/globals.c:67 +msgid "DMS" +msgstr "" + +#: ../src/globals.c:67 +msgid "Raw" +msgstr "" + +#: ../src/globals.c:68 +msgid "Kilometres" +msgstr "" + +#: ../src/globals.c:68 +msgid "Miles" +msgstr "" + +#: ../src/globals.c:68 +msgid "Nautical Miles" +msgstr "" + +#. VIK_UNITS_SPEED_KILOMETRES_PER_HOUR: +#: ../src/globals.c:69 ../src/viktrwlayer_tracklist.c:655 ../src/vikutils.c:100 +msgid "km/h" +msgstr "" + +#: ../src/globals.c:69 ../src/viktrwlayer_tracklist.c:656 ../src/vikutils.c:78 +msgid "mph" +msgstr "" + +#. VIK_UNITS_SPEED_METRES_PER_SECOND: +#: ../src/globals.c:69 ../src/viktrwlayer_tracklist.c:663 ../src/vikutils.c:81 +msgid "m/s" +msgstr "" + +#: ../src/globals.c:69 ../src/viktrwlayer_tracklist.c:657 ../src/vikutils.c:84 +msgid "knots" +msgstr "" + +#: ../src/globals.c:69 ../src/viktrwlayer_tracklist.c:658 ../src/vikutils.c:87 +msgid "s/km" +msgstr "" + +#: ../src/globals.c:69 ../src/viktrwlayer_tracklist.c:659 ../src/vikutils.c:90 +msgid "min/km" +msgstr "" + +#: ../src/globals.c:69 +msgid "s/mi" +msgstr "" + +#: ../src/globals.c:69 ../src/viktrwlayer_tracklist.c:661 ../src/vikutils.c:96 +msgid "min/mi" +msgstr "" + +#: ../src/globals.c:70 +msgid "Metres" +msgstr "" + +#: ../src/globals.c:70 +msgid "Feet" +msgstr "" + +#: ../src/globals.c:73 +msgid "Locale" +msgstr "" + +#: ../src/globals.c:73 +msgid "World" +msgstr "" + +#: ../src/globals.c:73 +msgid "UTC" +msgstr "" + +#: ../src/globals.c:76 +msgid "Degree format:" +msgstr "" + +#: ../src/globals.c:77 +msgid "Distance units:" +msgstr "" + +#: ../src/globals.c:78 +msgid "Speed units:" +msgstr "" + +#: ../src/globals.c:79 +msgid "Height units:" +msgstr "" + +#: ../src/globals.c:80 +msgid "Use large waypoint icons:" +msgstr "" + +#: ../src/globals.c:81 +msgid "Default latitude:" +msgstr "" + +#: ../src/globals.c:82 +msgid "Default longitude:" +msgstr "" + +#: ../src/globals.c:83 +msgid "Time Display:" +msgstr "" + +#: ../src/globals.c:84 +msgid "" +"Display times according to the reference frame. Locale is the user's system " +"setting. World is relative to the location of the object." +msgstr "" + +#: ../src/globals.c:90 +msgid "Alphabetical" +msgstr "" + +#: ../src/globals.c:90 ../src/datasource_osm_my_traces.c:432 +msgid "Time" +msgstr "" + +#: ../src/globals.c:90 +msgid "Creation" +msgstr "" + +#: ../src/globals.c:91 +msgid "Title Case" +msgstr "" + +#: ../src/globals.c:91 +msgid "Lowercase" +msgstr "" + +#: ../src/globals.c:94 +msgid "KML File Export Units:" +msgstr "" + +#: ../src/globals.c:95 +msgid "GPX Track Order:" +msgstr "" + +#: ../src/globals.c:96 +msgid "GPX Waypoint Symbols:" +msgstr "" + +#: ../src/globals.c:97 +msgid "" +"Save GPX Waypoint Symbol names in the specified case. May be useful for " +"compatibility with various devices" +msgstr "" + +#: ../src/globals.c:98 +msgid "GPX Creator:" +msgstr "" + +#: ../src/globals.c:99 +msgid "" +"The creator value when writing a GPX file. Otherwise when blank a default is " +"used." +msgstr "" + +#: ../src/globals.c:104 +msgid "Image Viewer:" +msgstr "" + +#: ../src/globals.c:109 +msgid "External GPX Program 1:" +msgstr "" + +#: ../src/globals.c:110 +msgid "External GPX Program 2:" +msgstr "" + +#: ../src/globals.c:113 +msgid "Absolute" +msgstr "" + +#: ../src/globals.c:113 +msgid "Relative" +msgstr "" + +#: ../src/globals.c:117 +msgid "Save File Reference Mode:" +msgstr "" + +#: ../src/globals.c:118 +msgid "" +"When saving a Viking .vik file, this determines how the directory paths of " +"filenames are written." +msgstr "" + +#: ../src/globals.c:119 +msgid "Ask for Name before Track Creation:" +msgstr "" + +#: ../src/globals.c:120 +msgid "Show Tooltip during Track Creation:" +msgstr "" + +#: ../src/globals.c:121 +msgid "The number of recent files:" +msgstr "" + +#: ../src/globals.c:122 +msgid "" +"Only applies to new windows or on application restart. -1 means all " +"available files." +msgstr "" + +#: ../src/globals.c:123 +msgid "Open files in selected layer:" +msgstr "" + +#: ../src/globals.c:124 +msgid "Open files (but not .vik ones) into the selected TrackWaypoint layer." +msgstr "" + +#: ../src/globals.c:125 +msgid "Show calendar day names:" +msgstr "" + +#: ../src/globals.c:128 +msgid "Home Location" +msgstr "" + +#: ../src/globals.c:128 +msgid "Last Location" +msgstr "" + +#: ../src/globals.c:128 +msgid "Specified File" +msgstr "" + +#: ../src/globals.c:128 +msgid "Auto Location" +msgstr "" + +#: ../src/globals.c:131 +msgid "Restore Window Setup:" +msgstr "" + +#: ../src/globals.c:132 +msgid "Restore window size and layout" +msgstr "" + +#: ../src/globals.c:133 +msgid "Add a Default Map Layer:" +msgstr "" + +#: ../src/globals.c:134 +msgid "" +"The default map layer added is defined by the Layer Defaults. Use the menu " +"Edit->Layer Defaults->Map... to change the map type and other values." +msgstr "" + +#: ../src/globals.c:135 +msgid "Startup Method:" +msgstr "" + +#: ../src/globals.c:136 +msgid "Startup File:" +msgstr "" + +#: ../src/globals.c:137 +msgid "" +"The default file to load on startup. Only applies when the startup method is " +"set to 'Specified File'" +msgstr "" + +#: ../src/globals.c:138 +msgid "Check For New Version:" +msgstr "" + +#: ../src/globals.c:139 +msgid "Periodically check to see if a new version of Viking is available" +msgstr "" + +#. Defaults for the options are setup here +#: ../src/globals.c:176 +msgid "General" +msgstr "" + +#. New Tab +#: ../src/globals.c:204 +msgid "Startup" +msgstr "" + +#. New Tab +#: ../src/globals.c:222 +msgid "Export/External" +msgstr "" + +#. 'Advanced' Properties +#: ../src/globals.c:249 +msgid "Advanced" +msgstr "" + +#. Webtools +#: ../src/google.c:39 +msgid "Google" +msgstr "Google" + +#. If there is an actual description field it will overwrite this value +#: ../src/gpx.c:264 +#, c-format +msgid "Created by: %s" +msgstr "" + +#: ../src/datasource_bfilter.c:43 +msgid "Max number of points:" +msgstr "" + +#: ../src/datasource_bfilter.c:84 +msgid "Simplify All Tracks..." +msgstr "" + +#: ../src/datasource_bfilter.c:85 +msgid "Simplified Tracks" +msgstr "" + +#. { VIK_LAYER_NUM_TYPES, "compressmethod", VIK_LAYER_PARAM_UINT, VIK_LAYER_GROUP_NONE, N_("Simplify Method:"), VIK_LAYER_WIDGET_COMBOBOX, compress_method, NULL, NULL, NULL, NULL, NULL }, +#: ../src/datasource_bfilter.c:111 +msgid "Error Factor:" +msgstr "" + +#: ../src/datasource_bfilter.c:112 +msgid "" +"Specifies the maximum allowable error that may be introduced by removing a " +"single point by the crosstrack method. See the manual or GPSBabel Simplify " +"Filter documentation for more detail." +msgstr "" + +#: ../src/datasource_bfilter.c:166 +msgid "Compress Tracks..." +msgstr "" + +#: ../src/datasource_bfilter.c:167 +msgid "Compressed Tracks" +msgstr "" + +#: ../src/datasource_bfilter.c:197 ../src/datasource_bfilter.c:198 +msgid "Remove Duplicate Waypoints" +msgstr "" + +#: ../src/datasource_bfilter.c:221 +msgid "Manual filter:" +msgstr "" + +#: ../src/datasource_bfilter.c:222 +msgid "Manual filter command: e.g. 'swap'." +msgstr "" + +#: ../src/datasource_bfilter.c:233 ../src/datasource_bfilter.c:234 +msgid "Manual filter" +msgstr "" + +#: ../src/datasource_bfilter.c:262 +msgid "Waypoints Inside This" +msgstr "" + +#: ../src/datasource_bfilter.c:263 ../src/datasource_bfilter.c:292 +msgid "Polygonized Layer" +msgstr "" + +#: ../src/datasource_bfilter.c:291 +msgid "Waypoints Outside This" +msgstr "" + +#: ../src/datasource_file.c:61 +msgid "Import file with GPSBabel" +msgstr "" + +#: ../src/datasource_file.c:62 +msgid "Imported file" +msgstr "" + +#. The file selector +#: ../src/datasource_file.c:129 +msgid "File:" +msgstr "" + +#: ../src/datasource_file.c:130 +msgid "File to import" +msgstr "" + +#: ../src/datasource_file.c:137 +msgid "All files" +msgstr "" + +#. The file format selector +#: ../src/datasource_file.c:144 ../src/datasource_url.c:106 +msgid "File type:" +msgstr "" + +#: ../src/datasource_file.c:189 +#, c-format +msgid "using babel args '%s' and file '%s'" +msgstr "" + +#: ../src/datasource_gc.c:67 +msgid "Download Geocaches" +msgstr "Download Geocashes" + +#: ../src/datasource_gc.c:68 +msgid "Geocaching.com Caches" +msgstr "" + +#: ../src/datasource_gc.c:86 +msgid "geocaching.com username:" +msgstr "" + +#: ../src/datasource_gc.c:87 +msgid "geocaching.com password:" +msgstr "" + +#: ../src/datasource_gc.c:92 ../src/vikwindow.c:3502 +msgid "Geocaching" +msgstr "" + +#: ../src/datasource_gc.c:128 +#, c-format +msgid "" +"Can't find %s or %s in path! Check that you have installed it correctly." +msgstr "" + +#: ../src/datasource_gc.c:190 +msgid "Number geocaches:" +msgstr "" + +#: ../src/datasource_gc.c:192 +msgid "Centered around:" +msgstr "" + +#: ../src/datasource_gc.c:231 +msgid "Broken input - using some defaults" +msgstr "" + +#: ../src/datasource_geotag.c:51 +msgid "Create Waypoints from Geotagged Images" +msgstr "" + +#: ../src/datasource_geotag.c:52 +msgid "Geotagged Images" +msgstr "" + +#: ../src/datasource_geotag.c:102 ../src/datasource_geojson.c:93 +#: ../src/vikfileentry.c:171 ../src/vikwindow.c:3533 ../src/vikwindow.c:3610 +#: ../src/vikwindow.c:3641 ../src/vikwindow.c:4356 ../src/vikwindow.c:4649 +msgid "All" +msgstr "" + +#: ../src/datasource_geotag.c:107 ../src/vikfileentry.c:115 +#: ../src/viktrwlayer_geotag.c:637 ../src/vikwindow.c:3518 +#: ../src/vikwindow.c:4377 +msgid "JPG" +msgstr "" + +#: ../src/datasource_geotag.c:168 +#, c-format +msgid "Unable to create waypoint from %s" +msgstr "" + +#: ../src/datasource_geojson.c:46 +msgid "Acquire from GeoJSON" +msgstr "" + +#: ../src/datasource_geojson.c:47 ../src/datasource_geojson.c:98 +msgid "GeoJSON" +msgstr "" + +#: ../src/datasource_geojson.c:152 +#, c-format +msgid "Unable to import from: %s" +msgstr "" + +#: ../src/datasource_gps.c:54 +msgid "Acquire from GPS" +msgstr "Hent fra GPS" + +#: ../src/datasource_gps.c:55 +msgid "Acquired from GPS" +msgstr "Hentet fra GPS" + +#: ../src/datasource_gps.c:258 +#, c-format +msgid "using cmd '%s' and file '%s'\n" +msgstr "" + +#: ../src/datasource_gps.c:353 ../src/vikgpslayer.c:966 +#, c-format +msgid "Downloading %d waypoint..." +msgid_plural "Downloading %d waypoints..." +msgstr[0] "" +msgstr[1] "" + +#: ../src/datasource_gps.c:358 ../src/vikgpslayer.c:971 +#, c-format +msgid "Downloading %d trackpoint..." +msgid_plural "Downloading %d trackpoints..." +msgstr[0] "" +msgstr[1] "" + +#: ../src/datasource_gps.c:363 ../src/vikgpslayer.c:976 +#, c-format +msgid "Downloading %d routepoint..." +msgid_plural "Downloading %d routepoints..." +msgstr[0] "" +msgstr[1] "" + +#: ../src/datasource_gps.c:386 ../src/datasource_gps.c:393 +#: ../src/datasource_gps.c:400 +#, c-format +msgid "Downloaded %d out of %d %s..." +msgstr "Downloadet %d ud af %d %s..." + +#: ../src/datasource_gps.c:388 ../src/datasource_gps.c:395 +#: ../src/datasource_gps.c:402 +#, c-format +msgid "Downloaded %d %s." +msgstr "Downloaded %d %s." + +#: ../src/datasource_gps.c:416 ../src/vikgpslayer.c:1134 +#, c-format +msgid "GPS Device: %s" +msgstr "GPS udstyr: %s" + +#: ../src/datasource_gps.c:428 ../src/vikgpslayer.c:1214 +msgid "Status: Working..." +msgstr "" + +#. NB gps_layer_inst_init() is performed after parameter registeration +#. thus to give the protocols some potential values use the old static list +#. TODO: find another way to use gps_layer_inst_init()? +#: ../src/datasource_gps.c:584 ../src/vikgpslayer.c:216 +msgid "GPS Protocol:" +msgstr "GPS protekol:" + +#. List reassigned at runtime +#: ../src/datasource_gps.c:609 ../src/vikgpslayer.c:217 +msgid "Serial Port:" +msgstr "" + +#: ../src/datasource_gps.c:659 +msgid "" +"Turn Off After Transfer\n" +"(Garmin/NAViLink Only)" +msgstr "" + +#: ../src/datasource_gps.c:666 +msgid "Tracks:" +msgstr "" + +#: ../src/datasource_gps.c:673 +msgid "Routes:" +msgstr "" + +#: ../src/datasource_gps.c:680 +msgid "Waypoints:" +msgstr "" + +#: ../src/datasource_gps.c:756 ../src/vikgpslayer.c:1509 +msgid "GPS device: N/A" +msgstr "GPS udstyr: N/A" + +#: ../src/datasource_osm.c:53 ../src/datasource_osm.c:54 +msgid "OSM traces" +msgstr "" + +#: ../src/datasource_osm.c:89 +msgid "Page number:" +msgstr "" + +#: ../src/datasource_osm_my_traces.c:59 ../src/datasource_osm_my_traces.c:60 +msgid "OSM My Traces" +msgstr "" + +#: ../src/datasource_osm_my_traces.c:106 ../src/osm-traces.c:684 +msgid "Email/username:" +msgstr "" + +#: ../src/datasource_osm_my_traces.c:111 +msgid "The email or username used to login to OSM" +msgstr "" + +#: ../src/datasource_osm_my_traces.c:113 ../src/osm-traces.c:692 +msgid "Password:" +msgstr "Adgangskode:" + +#: ../src/datasource_osm_my_traces.c:116 +msgid "The password used to login to OSM" +msgstr "" + +#: ../src/datasource_osm_my_traces.c:427 ../src/viktrwlayer.c:689 +msgid "Description" +msgstr "" + +#: ../src/datasource_osm_my_traces.c:442 +msgid "Privacy" +msgstr "" + +#: ../src/datasource_osm_my_traces.c:449 +msgid "Within Current View" +msgstr "" + +#: ../src/datasource_osm_my_traces.c:516 +msgid "GPS Traces" +msgstr "" + +#: ../src/datasource_osm_my_traces.c:518 +msgid "None found!" +msgstr "" + +#: ../src/datasource_osm_my_traces.c:569 +msgid "Ensure the OSM access token preferences are setup." +msgstr "" + +#: ../src/datasource_osm_my_traces.c:645 +msgid "My OSM Traces" +msgstr "" + +#. Report errors to the status bar +#: ../src/datasource_osm_my_traces.c:667 +#, c-format +msgid "Unable to get trace: %s" +msgstr "" + +#: ../src/datasource_routing.c:56 ../src/datasource_routing.c:57 +msgid "Directions" +msgstr "" + +#: ../src/datasource_routing.c:90 +msgid "No routing engines with directions available" +msgstr "" + +#. Engine selector +#: ../src/datasource_routing.c:99 +msgid "Engine:" +msgstr "" + +#. From and To entries +#: ../src/datasource_routing.c:104 +msgid "From:" +msgstr "Fra:" + +#: ../src/datasource_routing.c:105 +msgid "To:" +msgstr "Til:" + +#: ../src/datasource_url.c:48 +msgid "Acquire from URL" +msgstr "" + +#: ../src/datasource_url.c:49 +msgid "URL" +msgstr "" + +#: ../src/datasource_url.c:101 +msgid "URL:" +msgstr "" + +#. Only GPX (not using GPSbabel) +#: ../src/datasource_url.c:133 ../src/vikfileentry.c:161 +#: ../src/vikwindow.c:3513 ../src/vikwindow.c:3603 +msgid "GPX" +msgstr "" + +#: ../src/datasource_wikipedia.c:32 +msgid "Create Waypoints from Wikipedia Articles" +msgstr "" + +#: ../src/datasource_wikipedia.c:33 +msgid "Wikipedia Waypoints" +msgstr "" + +#: ../src/dem.c:66 ../src/dem.c:80 +msgid "Invalid DEM" +msgstr "" + +#: ../src/dem.c:122 +msgid "Invalid DEM header" +msgstr "" + +#: ../src/dem.c:191 ../src/dem.c:204 +msgid "Incorrect DEM Class B record: expected 1" +msgstr "" + +#: ../src/dem.c:289 ../src/download.c:176 +#, c-format +msgid "Couldn't map file %s: %s" +msgstr "" + +#: ../src/download.c:130 +msgid "Tile age (days):" +msgstr "" + +#: ../src/download.c:406 +#, c-format +msgid "Download error: %s" +msgstr "" + +#: ../src/download.c:490 +msgid "couldn't open temp file" +msgstr "kunne ikke åbne midlertidig fil" + +#: ../src/file.c:458 ../src/file.c:463 +#, c-format +msgid "Draw mode '%s' no more supported" +msgstr "" + +#: ../src/geotag_exif.c:621 +msgid "Not enough memory." +msgstr "" + +#: ../src/geotag_exif.c:639 +msgid "Setting a value for this tag is unsupported!" +msgstr "" + +#: ../src/geotag_exif.c:658 +#, c-format +msgid "Too few components specified (need %d, found %d)\n" +msgstr "" + +#: ../src/geotag_exif.c:662 +msgid "Numeric value expected\n" +msgstr "" + +#: ../src/geotag_exif.c:670 +msgid "This shouldn't happen!" +msgstr "" + +#: ../src/geotag_exif.c:740 +msgid "Not yet implemented!" +msgstr "" + +#: ../src/geotag_exif.c:753 +msgid "Warning; Too many components specified!" +msgstr "" + +#: ../src/osm-traces.c:87 +msgid "Identifiable (public w/ timestamps)" +msgstr "" + +#: ../src/osm-traces.c:88 +msgid "Trackable (private w/ timestamps)" +msgstr "" + +#: ../src/osm-traces.c:89 +msgid "Public" +msgstr "Offentlig" + +#: ../src/osm-traces.c:90 +msgid "Private" +msgstr "" + +#: ../src/osm-traces.c:108 +msgid "Access Token:" +msgstr "" + +#: ../src/osm-traces.c:108 +msgid "Get New OSM Access Tokens" +msgstr "" + +#: ../src/osm-traces.c:109 +msgid "Access Token Key:" +msgstr "" + +#: ../src/osm-traces.c:110 +msgid "Access Token Secret:" +msgstr "" + +#: ../src/osm-traces.c:111 +msgid "OSM username:" +msgstr "" + +#: ../src/osm-traces.c:112 +msgid "OSM password:" +msgstr "" + +#. Check to really override existing values... +#: ../src/osm-traces.c:263 +msgid "Do you want to overwrite existing values?" +msgstr "" + +#: ../src/osm-traces.c:275 +msgid "Not able to generate OSM request tokens." +msgstr "" + +#: ../src/osm-traces.c:299 +msgid "" +"Waiting for authorization approval.\n" +"Ensure you have granted access at the website before continuing here." +msgstr "" + +#: ../src/osm-traces.c:315 +msgid "No Authorization." +msgstr "" + +#: ../src/osm-traces.c:354 +msgid "" +"OSM Username and Password preferences are not required anymore. You can now " +"remove them." +msgstr "" + +#. Preferences +#: ../src/osm-traces.c:379 +msgid "OpenStreetMap Traces" +msgstr "" + +#: ../src/osm-traces.c:504 +#, c-format +msgid "failed to upload data: HTTP response is %ld" +msgstr "" + +#: ../src/osm-traces.c:509 +#, c-format +msgid "curl_easy_getinfo failed: %d" +msgstr "" + +#: ../src/osm-traces.c:514 +#, c-format +msgid "curl request failed: %s" +msgstr "" + +#. Success +#: ../src/osm-traces.c:592 +msgid "Uploaded to OSM" +msgstr "" + +#: ../src/osm-traces.c:596 +msgid "" +"FAILED TO UPLOAD DATA TO OSM - Ensure the OSM access token preferences are " +"setup." +msgstr "" + +#: ../src/osm-traces.c:599 +msgid "FAILED TO UPLOAD DATA TO OSM - CURL PROBLEM" +msgstr "" + +#: ../src/osm-traces.c:602 +msgid "FAILED TO UPLOAD DATA TO OSM" +msgstr "" + +#: ../src/osm-traces.c:602 +msgid "HTTP response code" +msgstr "" + +#: ../src/osm-traces.c:610 +#, c-format +msgid "failed to unlink temporary file: %s" +msgstr "" + +#: ../src/osm-traces.c:664 +msgid "OSM upload" +msgstr "" + +#: ../src/osm-traces.c:689 +msgid "" +"The email/username used as login\n" +"Enter the email/username you use to login into www.openstreetmap.org." +"" +msgstr "" + +#: ../src/osm-traces.c:697 +msgid "" +"The password used to login\n" +"Enter the password you use to login into www.openstreetmap.org." +msgstr "" + +#: ../src/osm-traces.c:703 +msgid "File's name:" +msgstr "Filens navn:" + +#: ../src/osm-traces.c:713 +msgid "" +"The name of the file on OSM\n" +"This is the name of the file created on the server.This is not the " +"name of the local file." +msgstr "" + +#: ../src/osm-traces.c:717 ../src/viktrwlayer_wpwin.c:197 +#: ../src/viktrwlayer_wpwin.c:199 +msgid "Description:" +msgstr "Beskrivelse:" + +#: ../src/osm-traces.c:731 +msgid "The description of the trace" +msgstr "" + +#: ../src/osm-traces.c:734 +msgid "Anonymize Times:" +msgstr "" + +#: ../src/osm-traces.c:739 +msgid "" +"Anonymize times of the trace.\n" +"You may choose to make the trace identifiable, yet mask the actual " +"real time values" +msgstr "" + +#: ../src/osm-traces.c:743 +msgid "Tags:" +msgstr "Mærker:" + +#: ../src/osm-traces.c:751 +msgid "The tags associated to the trace" +msgstr "" + +#: ../src/osm-traces.c:816 +#, c-format +msgid "Uploading %s to OSM" +msgstr "" + +#: ../src/mapcache.c:67 +msgid "Map cache memory size (MB):" +msgstr "" + +#. NB Can have a couple hundred fonts loaded when using system directories +#. So ATM don't list them all - otherwise need better GUI feedback display. +#: ../src/mapnik_interface.cpp:324 +#, c-format +msgid "" +"%s %s\n" +"Plugins=%sFonts loaded=%d" +msgstr "" + +#: ../src/mapnik_interface.cpp:325 ../src/vikmapniklayer.c:278 +msgid "Mapnik" +msgstr "" + +#: ../src/print.c:51 ../src/viktrwlayer.c:572 +msgid "None" +msgstr "Ingen" + +#: ../src/print.c:52 +msgid "Horizontally" +msgstr "Vandret" + +#: ../src/print.c:53 +msgid "Vertically" +msgstr "Lodret" + +#: ../src/print.c:54 +msgid "Both" +msgstr "Begge" + +#: ../src/print.c:118 +msgid "Image Settings" +msgstr "Billedindstillinger" + +#: ../src/print.c:551 +msgid "done" +msgstr "færdig" + +#. Page Size +#: ../src/print.c:580 +msgid "_Adjust Page Size and Orientation" +msgstr "" + +#: ../src/print.c:596 +msgid "C_enter:" +msgstr "C_entrum:" + +#. ignore page margins +#: ../src/print.c:614 +msgid "Ignore Page _Margins" +msgstr "" + +#: ../src/print.c:633 +msgid "Image S_ize:" +msgstr "B_illed størrelse:" + +#: ../src/ui_util.c:88 +#, c-format +msgid "Could not launch web browser. %s" +msgstr "" + +#: ../src/ui_util.c:101 +#, c-format +msgid "Could not create new email. %s" +msgstr "" + +#: ../src/vikcoordlayer.c:57 +msgid "Color:" +msgstr "Farve:" + +#: ../src/vikcoordlayer.c:58 +msgid "Minutes Width:" +msgstr "" + +#: ../src/vikcoordlayer.c:59 +msgid "Line Thickness:" +msgstr "Linjetykkelse:" + +#: ../src/vikcoordlayer.c:66 +msgid "Coordinate" +msgstr "" + +#: ../src/main.c:92 +#, c-format +msgid "Ignoring Xlib error: error code %d request code %d\n" +msgstr "" + +#: ../src/main.c:111 +msgid "Enable debug output" +msgstr "" + +#: ../src/main.c:112 +msgid "Enable verbose output" +msgstr "" + +#: ../src/main.c:113 +msgid "Show version" +msgstr "" + +#: ../src/main.c:114 +msgid "Latitude in decimal degrees" +msgstr "" + +#: ../src/main.c:115 +msgid "Longitude in decimal degrees" +msgstr "" + +#: ../src/main.c:116 +msgid "Zoom Level (OSM). Value can be 0 - 22" +msgstr "" + +#: ../src/main.c:117 +msgid "Add a map layer by id value. Use 0 for the default map." +msgstr "" + +#: ../src/main.c:160 +#, c-format +msgid "" +"%s %s\n" +"Copyright (c) 2003-2008 Evan Battaglia\n" +"Copyright (c) 2008-%s Viking's contributors\n" +msgstr "" + +#: ../src/osm.c:50 +msgid "OpenStreetMap (Mapnik)" +msgstr "" + +#: ../src/osm.c:65 +msgid "OpenStreetMap (Cycle)" +msgstr "" + +#: ../src/osm.c:79 +msgid "OpenStreetMap (Transport)" +msgstr "" + +#: ../src/osm.c:95 +msgid "OpenStreetMap (Humanitarian)" +msgstr "" + +#: ../src/osm.c:111 +msgid "On Disk OSM Tile Format" +msgstr "" + +#: ../src/osm.c:121 +msgid "MBTiles File" +msgstr "" + +#: ../src/osm.c:132 +msgid "OSM Metatiles" +msgstr "" + +#: ../src/osm.c:146 +msgid "Mapbox Outdoors" +msgstr "" + +#: ../src/osm.c:153 +msgid "Mapbox Specific" +msgstr "" + +#: ../src/osm.c:170 +msgid "OSM (view)" +msgstr "" + +#: ../src/osm.c:174 +msgid "OSM (edit)" +msgstr "" + +#. Note the use of positional parameters +#: ../src/osm.c:179 +msgid "OSM (query)" +msgstr "" + +#: ../src/osm.c:183 +msgid "OSM (render)" +msgstr "" + +#. Example: http://127.0.0.1:8111/load_and_zoom?left=8.19&right=8.20&top=48.605&bottom=48.590&select=node413602999 +#. JOSM or merkaartor must already be running with remote interface enabled +#: ../src/osm.c:190 +msgid "Local port 8111 (eg JOSM)" +msgstr "" + +#: ../src/osm.c:195 +msgid "Geofabrik Map Compare" +msgstr "" + +#: ../src/osm.c:203 +msgid "OpenStreetMap Notes" +msgstr "" + +#. Not really OSM but can't be bothered to create somewhere else to put it... +#: ../src/osm.c:221 +msgid "Wikimedia Toolserver GeoHack" +msgstr "" + +#: ../src/preferences.c:195 +msgid "Preferences" +msgstr "" + +#: ../src/toolbar.c:91 ../src/toolbar.c:92 +msgid "System Default" +msgstr "" + +#: ../src/toolbar.c:91 ../src/viktrwlayer.c:563 +msgid "Small" +msgstr "" + +#: ../src/toolbar.c:91 ../src/viktrwlayer.c:564 +msgid "Medium" +msgstr "" + +#: ../src/toolbar.c:91 ../src/viktrwlayer.c:565 +msgid "Large" +msgstr "" + +#: ../src/toolbar.c:92 +msgid "Icons Only" +msgstr "" + +#: ../src/toolbar.c:92 +msgid "Text Only" +msgstr "" + +#: ../src/toolbar.c:92 +msgid "Icons and Text" +msgstr "" + +#: ../src/toolbar.c:106 +msgid "Append to Menu:" +msgstr "" + +#: ../src/toolbar.c:107 +msgid "Pack the toolbar to the main menu to save vertical space" +msgstr "" + +#: ../src/toolbar.c:108 +msgid "Icon Size:" +msgstr "" + +#: ../src/toolbar.c:110 +msgid "Icon Style:" +msgstr "" + +#: ../src/toolbar.c:112 +msgid "Customize:" +msgstr "" + +#: ../src/toolbar.c:112 +msgid "Customize Buttons" +msgstr "" + +#. Preferences +#: ../src/toolbar.c:145 +msgid "Toolbar" +msgstr "" + +#: ../src/toolbar.c:312 +msgid "_Customize" +msgstr "" + +#: ../src/toolbar.c:641 +msgid "Separator" +msgstr "" + +#: ../src/toolbar.c:642 +msgid "--- Separator ---" +msgstr "" + +#: ../src/toolbar.c:1007 +msgid "Customize Toolbar" +msgstr "" + +#: ../src/toolbar.c:1028 +msgid "" +"Select items to be displayed on the toolbar. Items can be reordered by drag " +"and drop." +msgstr "" + +#: ../src/toolbar.c:1044 +msgid "Available Items" +msgstr "" + +#: ../src/toolbar.c:1065 +msgid "Displayed Items" +msgstr "" + +#: ../src/viklayer_defaults.c:232 +#, c-format +msgid "Could not open file: %s" +msgstr "" + +#: ../src/viklayer_defaults.c:304 +msgid "Layer Defaults" +msgstr "" + +#: ../src/uibuilder.c:196 +msgid "Take care that this password will be stored clearly in a plain file." +msgstr "" + +#: ../src/uibuilder.c:628 ../src/viktrwlayer_export.c:188 +#: ../src/viktrwlayer_export.c:304 ../src/vikwindow.c:3666 +#: ../src/vikwindow.c:4408 +#, c-format +msgid "The file \"%s\" exists, do you wish to overwrite it?" +msgstr "Filen \"%s\" eksisterer, ønsker du at overskrive den?" + +#: ../src/vikaggregatelayer.c:41 +msgid "Aggregate" +msgstr "" + +#: ../src/vikaggregatelayer.c:528 ../src/viktrwlayer.c:11700 +#, c-format +msgid "%s: Waypoint List" +msgstr "" + +#: ../src/vikaggregatelayer.c:570 +msgid "Search by Date" +msgstr "" + +#: ../src/vikaggregatelayer.c:576 +msgid "No items found with the requested date." +msgstr "" + +#: ../src/vikaggregatelayer.c:615 ../src/viktrwlayer.c:11691 +#, c-format +msgid "%s: Track and Route List" +msgstr "" + +#: ../src/vikaggregatelayer.c:681 ../src/viktrwlayer.c:8346 +#: ../src/viktrwlayer.c:8417 ../src/viktrwlayer.c:8494 +msgid "_Visibility" +msgstr "" + +#: ../src/vikaggregatelayer.c:686 +msgid "_Show All" +msgstr "" + +#: ../src/vikaggregatelayer.c:692 +msgid "_Hide All" +msgstr "" + +#: ../src/vikaggregatelayer.c:698 ../src/viktrwlayer.c:8363 +#: ../src/viktrwlayer.c:8434 ../src/viktrwlayer.c:8511 +msgid "_Toggle" +msgstr "" + +#: ../src/vikaggregatelayer.c:705 ../src/viktrwlayer.c:8532 +msgid "_Sort" +msgstr "" + +#: ../src/vikaggregatelayer.c:711 ../src/viktrwlayer.c:8538 +msgid "Name _Ascending" +msgstr "" + +#: ../src/vikaggregatelayer.c:717 ../src/viktrwlayer.c:8544 +msgid "Name _Descending" +msgstr "" + +#: ../src/vikaggregatelayer.c:723 ../src/viktrwlayer.c:575 +#: ../src/viktrwlayer.c:8550 +msgid "Date Ascending" +msgstr "" + +#: ../src/vikaggregatelayer.c:729 ../src/viktrwlayer.c:576 +#: ../src/viktrwlayer.c:8556 +msgid "Date Descending" +msgstr "" + +#: ../src/vikaggregatelayer.c:735 ../src/viktrwlayer.c:8445 +#: ../src/viktrwlayer.c:8523 ../src/viktrwlayer.c:8595 +#: ../src/viktrwlayer_tracklist.c:296 +msgid "_Statistics" +msgstr "" + +#: ../src/vikaggregatelayer.c:740 ../src/viktrwlayer.c:4533 +msgid "Track _List..." +msgstr "" + +#: ../src/vikaggregatelayer.c:746 ../src/viktrwlayer.c:4540 +msgid "_Waypoint List..." +msgstr "" + +#: ../src/vikaggregatelayer.c:753 +msgid "Searc_h" +msgstr "" + +#: ../src/vikaggregatelayer.c:759 +msgid "By _Date..." +msgstr "" + +#: ../src/vikaggregatelayer.c:762 +msgid "Find the first item with a specified date" +msgstr "" + +#: ../src/vikaggregatelayer.c:765 +msgid "Load E_xternal Layers" +msgstr "" + +#. Could have a more complicated tooltip that numbers each type of layers, +#. but for now a simple overall count +#: ../src/vikaggregatelayer.c:1011 +#, c-format +msgid "One layer" +msgid_plural "%d layers" +msgstr[0] "" +msgstr[1] "" + +#: ../src/vikaggregatelayer.c:1014 +#, c-format +msgid "Empty" +msgstr "" + +#: ../src/vikdemlayer.c:86 +msgid "SRTM Global 90m (3 arcsec)" +msgstr "" + +#: ../src/vikdemlayer.c:94 +msgid "Absolute height" +msgstr "" + +#: ../src/vikdemlayer.c:95 +msgid "Height gradient" +msgstr "" + +#: ../src/vikdemlayer.c:120 +msgid "DEM Files:" +msgstr "" + +#: ../src/vikdemlayer.c:121 +msgid "Download Source:" +msgstr "Download kilde:" + +#: ../src/vikdemlayer.c:122 +msgid "Min Elev Color:" +msgstr "" + +#: ../src/vikdemlayer.c:123 ../src/viktrwlayer_wpwin.c:207 +msgid "Type:" +msgstr "" + +#: ../src/vikdemlayer.c:124 +msgid "Min Elev:" +msgstr "" + +#: ../src/vikdemlayer.c:125 +msgid "Max Elev:" +msgstr "" + +#: ../src/vikdemlayer.c:137 +msgid "_DEM Download" +msgstr "" + +#: ../src/vikdemlayer.c:137 +msgid "DEM Download" +msgstr "" + +#: ../src/vikdemlayer.c:192 +msgid "DEM" +msgstr "" + +#: ../src/vikdemlayer.c:304 +#, c-format +msgid "Number of files: %d" +msgstr "" + +#: ../src/vikdemlayer.c:446 +msgid "DEM Loading" +msgstr "" + +#: ../src/vikdemlayer.c:927 +#, c-format +msgid "No SRTM data available for %f, %f" +msgstr "" + +#: ../src/vikdemlayer.c:948 +#, c-format +msgid "DEM download failure for %f, %f" +msgstr "" + +#: ../src/vikdemlayer.c:954 +#, c-format +msgid "DEM write failure for %s" +msgstr "" + +#. Probably not over any land... +#: ../src/vikdemlayer.c:1201 +msgid "No DEM File Available" +msgstr "" + +#: ../src/vikdemlayer.c:1220 +#, c-format +msgid "" +"\n" +"Source: %s\n" +"\n" +"DEM File: %s\n" +"DEM File Timestamp: %s" +msgstr "" + +#: ../src/vikdemlayer.c:1224 +#, c-format +msgid "" +"Source: %s\n" +"\n" +"No DEM File!" +msgstr "" + +#: ../src/vikdemlayer.c:1264 +#, c-format +msgid "Downloading DEM %s" +msgstr "" + +#: ../src/vikdemlayer.c:1289 +msgid "_Show DEM File Information" +msgstr "" + +#: ../src/vikfileentry.c:72 +msgid "Browse..." +msgstr "Gennemse..." + +#: ../src/vikfileentry.c:103 +msgid "Choose file" +msgstr "Vælg fil" + +#: ../src/vikfileentry.c:120 ../src/vikwindow.c:4372 +msgid "PNG" +msgstr "" + +#: ../src/vikfileentry.c:125 +msgid "TIFF" +msgstr "" + +#: ../src/vikfileentry.c:133 +msgid "MBTiles" +msgstr "" + +#: ../src/vikfileentry.c:142 +msgid "XML" +msgstr "" + +#: ../src/vikfileentry.c:149 +msgid "MML" +msgstr "" + +#: ../src/vikfileentry.c:154 +msgid "MSS" +msgstr "" + +#: ../src/vikfilelist.c:49 +msgid "Choose file(s)" +msgstr "Vælg fil(er)" + +#: ../src/vikfilelist.c:182 +msgid "Add..." +msgstr "Tilføj..." + +#: ../src/vikfilelist.c:183 +msgid "Delete" +msgstr "Slet" + +#: ../src/vikgeoreflayer.c:97 +msgid "_Georef Move Map" +msgstr "" + +#: ../src/vikgeoreflayer.c:97 +msgid "Georef Move Map" +msgstr "" + +#: ../src/vikgeoreflayer.c:106 +msgid "Georef Z_oom Tool" +msgstr "" + +#: ../src/vikgeoreflayer.c:106 +msgid "Georef Zoom Tool" +msgstr "" + +#: ../src/vikgeoreflayer.c:117 +msgid "GeoRef Map" +msgstr "" + +#: ../src/vikgeoreflayer.c:214 +msgid "Auto Read World Files:" +msgstr "" + +#: ../src/vikgeoreflayer.c:215 +msgid "" +"Automatically attempt to read associated world file of a new image for a " +"GeoRef layer" +msgstr "" + +#: ../src/vikgeoreflayer.c:511 ../src/vikgeoreflayer.c:797 +#: ../src/vikmapslayer.c:1174 +#, c-format +msgid "Couldn't open image file: %s" +msgstr "Kunne ikke åbne billedfil: %s" + +#: ../src/vikgeoreflayer.c:607 ../src/vikgeoreflayer.c:633 +msgid "Choose World file" +msgstr "Vælg World fil" + +#: ../src/vikgeoreflayer.c:619 +msgid "The World file you requested could not be opened for reading." +msgstr "Den World fil som du valgte kunne ikke åbnes og læses." + +#: ../src/vikgeoreflayer.c:621 +msgid "Unexpected end of file reading World file." +msgstr "" + +#: ../src/vikgeoreflayer.c:646 +msgid "The file you requested could not be opened for writing." +msgstr "Den World fil som du valgte kunne ider ikke skives til." + +#: ../src/vikgeoreflayer.c:782 +msgid "Lower right corner values may not be consistent with upper right values" +msgstr "" + +#: ../src/vikgeoreflayer.c:806 +#, c-format +msgid "Invalid image size: %s" +msgstr "" + +#: ../src/vikgeoreflayer.c:831 ../src/viklayer.c:561 ../src/vikwindow.c:4891 +msgid "Layer Properties" +msgstr "Lag-egenskaber" + +#: ../src/vikgeoreflayer.c:852 +msgid "World File Parameters:" +msgstr "World fil parametre:" + +#: ../src/vikgeoreflayer.c:853 +msgid "Load From File..." +msgstr "Indlæs fra fil..." + +#: ../src/vikgeoreflayer.c:858 +msgid "Corner pixel easting:" +msgstr "" + +#: ../src/vikgeoreflayer.c:860 +msgid "the UTM \"easting\" value of the upper-left corner pixel of the map" +msgstr "" + +#: ../src/vikgeoreflayer.c:862 +msgid "Corner pixel northing:" +msgstr "" + +#: ../src/vikgeoreflayer.c:864 +msgid "the UTM \"northing\" value of the upper-left corner pixel of the map" +msgstr "" + +#: ../src/vikgeoreflayer.c:866 +msgid "X (easting) scale (mpp): " +msgstr "" + +#: ../src/vikgeoreflayer.c:867 +msgid "Y (northing) scale (mpp): " +msgstr "" + +#: ../src/vikgeoreflayer.c:870 +msgid "the scale of the map in the X direction (meters per pixel)" +msgstr "" + +#: ../src/vikgeoreflayer.c:872 +msgid "the scale of the map in the Y direction (meters per pixel)" +msgstr "" + +#: ../src/vikgeoreflayer.c:874 +msgid "Map Image:" +msgstr "Kort billed:" + +#: ../src/vikgeoreflayer.c:919 +msgid "Upper left latitude:" +msgstr "" + +#: ../src/vikgeoreflayer.c:921 +msgid "Upper left longitude:" +msgstr "" + +#: ../src/vikgeoreflayer.c:923 +msgid "Lower right latitude:" +msgstr "" + +#: ../src/vikgeoreflayer.c:925 +msgid "Lower right longitude:" +msgstr "" + +#: ../src/vikgeoreflayer.c:937 +msgid "Calculate MPP values from coordinates" +msgstr "" + +#: ../src/vikgeoreflayer.c:938 +msgid "" +"Enter all corner coordinates before calculating the MPP values from the " +"image size" +msgstr "" + +#: ../src/vikgeoreflayer.c:948 +msgid "UTM" +msgstr "" + +#: ../src/vikgeoreflayer.c:949 +msgid "Latitude/Longitude" +msgstr "" + +#: ../src/vikgeoreflayer.c:957 ../src/vikmapniklayer.c:82 +#: ../src/vikmapslayer.c:158 +msgid "Alpha:" +msgstr "Alfa:" + +#. Now with icons +#: ../src/vikgeoreflayer.c:1062 +msgid "_Zoom to Fit Map" +msgstr "" + +#: ../src/vikgeoreflayer.c:1068 +msgid "_Goto Map Center" +msgstr "" + +#: ../src/vikgeoreflayer.c:1074 +msgid "_Export to World File" +msgstr "" + +#: ../src/vikgoto.c:98 +msgid "No goto tool available." +msgstr "" + +#: ../src/vikgoto.c:295 +msgid "goto" +msgstr "" + +#: ../src/vikgoto.c:297 +msgid "goto provider:" +msgstr "" + +#: ../src/vikgoto.c:312 +msgid "Enter address or place name:" +msgstr "Angiv adresse eller stedets navn:" + +#: ../src/vikgoto.c:487 +msgid "Locality" +msgstr "" + +#: ../src/vikgpslayer.c:137 +msgid "Data Mode" +msgstr "" + +#: ../src/vikgpslayer.c:139 +msgid "Realtime Tracking Mode" +msgstr "" + +#: ../src/vikgpslayer.c:176 +msgid "Keep vehicle at center" +msgstr "" + +#: ../src/vikgpslayer.c:177 +msgid "Keep vehicle on screen" +msgstr "" + +#: ../src/vikgpslayer.c:178 +msgid "Disable" +msgstr "" + +#: ../src/vikgpslayer.c:218 +msgid "Download Tracks:" +msgstr "" + +#: ../src/vikgpslayer.c:219 +msgid "Upload Tracks:" +msgstr "" + +#: ../src/vikgpslayer.c:220 +msgid "Download Routes:" +msgstr "" + +#: ../src/vikgpslayer.c:221 +msgid "Upload Routes:" +msgstr "" + +#: ../src/vikgpslayer.c:222 +msgid "Download Waypoints:" +msgstr "" + +#: ../src/vikgpslayer.c:223 +msgid "Upload Waypoints:" +msgstr "" + +#: ../src/vikgpslayer.c:225 +msgid "Recording tracks" +msgstr "" + +#: ../src/vikgpslayer.c:226 +msgid "Jump to current position on start" +msgstr "" + +#: ../src/vikgpslayer.c:227 +msgid "Moving Map Method:" +msgstr "" + +#: ../src/vikgpslayer.c:228 +msgid "Update Statusbar:" +msgstr "" + +#: ../src/vikgpslayer.c:228 +msgid "Display information in the statusbar on GPS updates" +msgstr "" + +#: ../src/vikgpslayer.c:229 +msgid "Auto Connect" +msgstr "" + +#: ../src/vikgpslayer.c:229 +msgid "Automatically connect to GPSD" +msgstr "" + +#: ../src/vikgpslayer.c:230 +msgid "Gpsd Host:" +msgstr "" + +#: ../src/vikgpslayer.c:231 +msgid "Gpsd Port:" +msgstr "Gpsd port:" + +#: ../src/vikgpslayer.c:232 +msgid "Gpsd Retry Interval (seconds):" +msgstr "" + +#: ../src/vikgpslayer.c:254 +msgid "GPS" +msgstr "" + +#: ../src/vikgpslayer.c:320 ../src/vikgpslayer.c:1504 +msgid "GPS Download" +msgstr "GPS download" + +#: ../src/vikgpslayer.c:320 ../src/vikgpslayer.c:1504 ../src/viktrwlayer.c:3993 +msgid "GPS Upload" +msgstr "GPS upload" + +#: ../src/vikgpslayer.c:322 +msgid "GPS Realtime Tracking" +msgstr "" + +#: ../src/vikgpslayer.c:458 +msgid "Connected" +msgstr "" + +#: ../src/vikgpslayer.c:460 +msgid "Disconnected" +msgstr "" + +#: ../src/vikgpslayer.c:554 +msgid "Unknown GPS Protocol" +msgstr "Ukendt GPS protekol" + +#: ../src/vikgpslayer.c:572 +msgid "Unknown serial port device" +msgstr "" + +#: ../src/vikgpslayer.c:691 +#, c-format +msgid "%s: unknown parameter" +msgstr "%s: ukendt parameter" + +#. Now with icons +#: ../src/vikgpslayer.c:794 +msgid "_Upload to GPS" +msgstr "" + +#: ../src/vikgpslayer.c:800 +msgid "Download from _GPS" +msgstr "" + +#: ../src/vikgpslayer.c:821 +msgid "Empty _Realtime" +msgstr "" + +#: ../src/vikgpslayer.c:828 +msgid "E_mpty Upload" +msgstr "" + +#: ../src/vikgpslayer.c:834 +msgid "_Empty Download" +msgstr "" + +#: ../src/vikgpslayer.c:840 +msgid "Empty _All" +msgstr "" + +#: ../src/vikgpslayer.c:852 +#, c-format +msgid "Unexpected number of disconnected handlers: %d" +msgstr "" + +#: ../src/vikgpslayer.c:995 +#, c-format +msgid "Uploading %d waypoint..." +msgid_plural "Uploading %d waypoints..." +msgstr[0] "" +msgstr[1] "" + +#: ../src/vikgpslayer.c:1000 +#, c-format +msgid "Uploading %d trackpoint..." +msgid_plural "Uploading %d trackpoints..." +msgstr[0] "" +msgstr[1] "" + +#: ../src/vikgpslayer.c:1005 +#, c-format +msgid "Uploading %d routepoint..." +msgid_plural "Uploading %d routepoints..." +msgstr[0] "" +msgstr[1] "" + +#: ../src/vikgpslayer.c:1034 +#, c-format +msgid "Downloaded %d out of %d waypoint..." +msgid_plural "Downloaded %d out of %d waypoints..." +msgstr[0] "" +msgstr[1] "" + +#: ../src/vikgpslayer.c:1040 +#, c-format +msgid "Downloaded %d out of %d trackpoint..." +msgid_plural "Downloaded %d out of %d trackpoints..." +msgstr[0] "" +msgstr[1] "" + +#: ../src/vikgpslayer.c:1046 +#, c-format +msgid "Downloaded %d out of %d routepoint..." +msgid_plural "Downloaded %d out of %d routepoints..." +msgstr[0] "" +msgstr[1] "" + +#: ../src/vikgpslayer.c:1056 +#, c-format +msgid "Uploaded %d out of %d waypoint..." +msgid_plural "Uploaded %d out of %d waypoints..." +msgstr[0] "" +msgstr[1] "" + +#: ../src/vikgpslayer.c:1062 +#, c-format +msgid "Uploaded %d out of %d trackpoint..." +msgid_plural "Uploaded %d out of %d trackpoints..." +msgstr[0] "" +msgstr[1] "" + +#: ../src/vikgpslayer.c:1068 +#, c-format +msgid "Uploaded %d out of %d routepoint..." +msgid_plural "Uploaded %d out of %d routepoints..." +msgstr[0] "" +msgstr[1] "" + +#: ../src/vikgpslayer.c:1079 +#, c-format +msgid "Downloaded %d waypoint" +msgid_plural "Downloaded %d waypoints" +msgstr[0] "" +msgstr[1] "" + +#: ../src/vikgpslayer.c:1085 +#, c-format +msgid "Downloaded %d trackpoint" +msgid_plural "Downloaded %d trackpoints" +msgstr[0] "" +msgstr[1] "" + +#: ../src/vikgpslayer.c:1091 +#, c-format +msgid "Downloaded %d routepoint" +msgid_plural "Downloaded %d routepoints" +msgstr[0] "" +msgstr[1] "" + +#: ../src/vikgpslayer.c:1101 +#, c-format +msgid "Uploaded %d waypoint" +msgid_plural "Uploaded %d waypoints" +msgstr[0] "" +msgstr[1] "" + +#: ../src/vikgpslayer.c:1107 +#, c-format +msgid "Uploaded %d trackpoint" +msgid_plural "Uploaded %d trackpoints" +msgstr[0] "" +msgstr[1] "" + +#: ../src/vikgpslayer.c:1113 +#, c-format +msgid "Uploaded %d routepoint" +msgid_plural "Uploaded %d routepoints" +msgstr[0] "" +msgstr[1] "" + +#: ../src/vikgpslayer.c:1363 +msgid "Error: No result." +msgstr "" + +#: ../src/vikgpslayer.c:1471 +msgid "Warning - GPS Upload items may overwrite each other" +msgstr "" + +#: ../src/vikgpslayer.c:1506 +msgid "Status: detecting gpsbabel" +msgstr "" + +#: ../src/vikgpslayer.c:1533 +msgid "No GPS items selected for transfer." +msgstr "" + +#: ../src/vikgpslayer.c:1546 +msgid "Could not turn off device." +msgstr "" + +#: ../src/vikgpslayer.c:1589 +msgid "Are you sure you want to delete GPS Upload data?" +msgstr "" + +#: ../src/vikgpslayer.c:1602 +msgid "Are you sure you want to delete GPS Download data?" +msgstr "" + +#: ../src/vikgpslayer.c:1616 +msgid "Are you sure you want to delete GPS Realtime data?" +msgstr "" + +#: ../src/vikgpslayer.c:1630 +msgid "Are you sure you want to delete All GPS data?" +msgstr "" + +#: ../src/vikgpslayer.c:2004 +#, c-format +msgid "" +"Failed to connect to gpsd at %s (port %s)\n" +"Should Viking keep trying (every %d seconds)?" +msgstr "" + +#: ../src/viklayerspanel.c:73 +msgid "C_ut" +msgstr "" + +#: ../src/viklayerspanel.c:74 ../src/vikwindow.c:4882 +msgid "_Copy" +msgstr "_Kopiér" + +#: ../src/viklayerspanel.c:75 ../src/vikwindow.c:4883 +msgid "_Paste" +msgstr "_Sæt ind" + +#: ../src/viklayerspanel.c:76 ../src/vikwindow.c:4884 +msgid "_Delete" +msgstr "_Slet" + +#: ../src/viklayerspanel.c:154 +msgid "New Layer" +msgstr "" + +#: ../src/viklayerspanel.c:347 +msgid "Top Layer" +msgstr "Øverste lag" + +#: ../src/viklayerspanel.c:363 +msgid "Add new layer" +msgstr "" + +#: ../src/viklayerspanel.c:370 ../src/vikwindow.c:4884 +msgid "Remove selected layer" +msgstr "" + +#: ../src/viklayerspanel.c:377 +msgid "Move selected layer up" +msgstr "" + +#: ../src/viklayerspanel.c:384 +msgid "Move selected layer down" +msgstr "" + +#: ../src/viklayerspanel.c:391 ../src/vikwindow.c:4881 +msgid "Cut selected layer" +msgstr "" + +#: ../src/viklayerspanel.c:398 ../src/vikwindow.c:4882 +msgid "Copy selected layer" +msgstr "" + +#: ../src/viklayerspanel.c:405 ../src/vikwindow.c:4883 +msgid "" +"Paste layer into selected container layer or otherwise above selected layer" +msgstr "" + +#: ../src/viklayerspanel.c:502 +msgid "New name can not be blank." +msgstr "" + +#: ../src/viklayerspanel.c:751 +msgid "Aggregate Layers have no settable properties." +msgstr "" + +#: ../src/viklayerspanel.c:798 +msgid "You cannot cut the Top Layer." +msgstr "" + +#: ../src/viklayerspanel.c:843 +#, c-format +msgid "Are you sure you want to delete %s?" +msgstr "" + +#: ../src/viklayerspanel.c:863 +msgid "You cannot delete the Top Layer." +msgstr "Du kan ikke slette øverste lag" + +#: ../src/vikmapniklayer.c:78 +msgid "CSS (MML) Config File:" +msgstr "" + +#: ../src/vikmapniklayer.c:79 +msgid "CartoCSS configuration file" +msgstr "" + +#: ../src/vikmapniklayer.c:80 +msgid "XML Config File:" +msgstr "" + +#: ../src/vikmapniklayer.c:81 +msgid "Mapnik XML configuration file" +msgstr "" + +#: ../src/vikmapniklayer.c:84 +msgid "Use File Cache:" +msgstr "" + +#: ../src/vikmapniklayer.c:86 +msgid "File Cache Directory:" +msgstr "" + +#: ../src/vikmapniklayer.c:122 +msgid "_Mapnik Features" +msgstr "" + +#: ../src/vikmapniklayer.c:122 +msgid "Mapnik Features" +msgstr "" + +#: ../src/vikmapniklayer.c:140 +msgid "Mapnik Rendering" +msgstr "" + +#. Changing these values only applies before first mapnik layer is 'created' +#: ../src/vikmapniklayer.c:258 +msgid "Plugins Directory:" +msgstr "" + +#: ../src/vikmapniklayer.c:258 ../src/vikmapniklayer.c:259 +#: ../src/vikmapniklayer.c:260 ../src/vikmapniklayer.c:261 +msgid "You need to restart Viking for a change to this value to be used" +msgstr "" + +#: ../src/vikmapniklayer.c:259 +msgid "Fonts Directory:" +msgstr "" + +#: ../src/vikmapniklayer.c:260 +msgid "Recurse Fonts Directory:" +msgstr "" + +#: ../src/vikmapniklayer.c:261 +msgid "Rerender Timeout (hours):" +msgstr "" + +#. Changeable any time +#: ../src/vikmapniklayer.c:263 +msgid "CartoCSS:" +msgstr "" + +#: ../src/vikmapniklayer.c:263 +msgid "The program to convert CartoCSS files into Mapnik XML" +msgstr "" + +#: ../src/vikmapniklayer.c:506 +msgid "Running" +msgstr "" + +#: ../src/vikmapniklayer.c:525 +#, c-format +msgid "" +"Error running carto command:\n" +"%s" +msgstr "" + +#: ../src/vikmapniklayer.c:561 +msgid " completed in " +msgstr "" + +#: ../src/vikmapniklayer.c:561 +msgid "seconds" +msgstr "" + +#: ../src/vikmapniklayer.c:611 ../src/vikmapniklayer.c:979 +#, c-format +msgid "" +"Mapnik error loading configuration file:\n" +"%s" +msgstr "" + +#: ../src/vikmapniklayer.c:749 +#, c-format +msgid "Mapnik Render %d:%d:%d %s" +msgstr "" + +#: ../src/vikmapniklayer.c:840 +msgid "Mapnik Rendering must be in Mercator mode" +msgstr "" + +#: ../src/vikmapniklayer.c:997 +msgid "Mapnik Information" +msgstr "" + +#: ../src/vikmapniklayer.c:1031 +msgid "_Flush Memory Cache" +msgstr "" + +#: ../src/vikmapniklayer.c:1044 +msgid "_Run Carto Command" +msgstr "" + +#: ../src/vikmapniklayer.c:1102 ../src/vikmapslayer.c:2029 +#, c-format +msgid "Tile File Timestamp: %s" +msgstr "" + +#: ../src/vikmapniklayer.c:1105 ../src/vikmapslayer.c:2032 +msgid "Tile File Timestamp: Not Available" +msgstr "" + +#: ../src/vikmapniklayer.c:1120 +#, c-format +msgid "Rendering time %.2f seconds" +msgstr "" + +#: ../src/vikmapniklayer.c:1124 ../src/vikmapslayer.c:2042 +msgid "Tile Information" +msgstr "" + +#: ../src/vikmapniklayer.c:1145 +msgid "_Rerender Tile" +msgstr "" + +#: ../src/vikmapniklayer.c:1150 +msgid "_Info" +msgstr "" + +#. ******* MAPZOOMS ******** +#: ../src/vikmapslayer.c:96 +msgid "Use Viking Zoom Level" +msgstr "" + +#: ../src/vikmapslayer.c:146 +msgid "OSM" +msgstr "" + +#. NB mode => id - But can't break file format just to rename something better +#: ../src/vikmapslayer.c:152 +msgid "Map Type:" +msgstr "Kort type:" + +#: ../src/vikmapslayer.c:153 +msgid "Maps Directory:" +msgstr "" + +#: ../src/vikmapslayer.c:154 +msgid "Cache Layout:" +msgstr "" + +#: ../src/vikmapslayer.c:155 +msgid "This determines the tile storage layout on disk" +msgstr "" + +#: ../src/vikmapslayer.c:156 +msgid "Map File:" +msgstr "" + +#: ../src/vikmapslayer.c:157 +msgid "An MBTiles file. Only applies when the map type method is 'MBTiles'" +msgstr "" + +#: ../src/vikmapslayer.c:159 +msgid "Control the Alpha value for transparency effects" +msgstr "" + +#: ../src/vikmapslayer.c:160 +msgid "Autodownload maps:" +msgstr "Autodownload kort:" + +#: ../src/vikmapslayer.c:161 +msgid "Autodownload Only Gets Missing Maps:" +msgstr "" + +#: ../src/vikmapslayer.c:162 +msgid "" +"Using this option avoids attempting to update already acquired tiles. This " +"can be useful if you want to restrict the network usage, without having to " +"resort to manual control. Only applies when 'Autodownload Maps' is on." +msgstr "" + +#: ../src/vikmapslayer.c:163 +msgid "Zoom Level:" +msgstr "Zoom niveau:" + +#: ../src/vikmapslayer.c:164 +msgid "" +"Determines the method of displaying map tiles for the current zoom level. " +"'Viking Zoom Level' uses the best matching level, otherwise setting a fixed " +"value will always use map tiles of the specified value regardless of the " +"actual zoom level." +msgstr "" + +#: ../src/vikmapslayer.c:197 +msgid "_Maps Download" +msgstr "" + +#: ../src/vikmapslayer.c:197 +msgid "Maps Download" +msgstr "Kort downloaded" + +#: ../src/vikmapslayer.c:213 ../src/vikutils.c:895 +msgid "Map" +msgstr "Kort" + +#: ../src/vikmapslayer.c:306 +msgid "Default map layer directory:" +msgstr "" + +#: ../src/vikmapslayer.c:306 +msgid "Choose a directory to store cached Map tiles for this layer" +msgstr "" + +#: ../src/vikmapslayer.c:436 ../src/vikmapslayer.c:633 +msgid "Unknown map type" +msgstr "Ukendt korttype" + +#: ../src/vikmapslayer.c:664 +msgid "Unknown Map Zoom" +msgstr "Ukendt kort zoom" + +#: ../src/vikmapslayer.c:833 +#, c-format +msgid "Failed to open MBTiles file: %s" +msgstr "" + +#: ../src/vikmapslayer.c:856 +#, c-format +msgid "" +"New map cannot be displayed in the current drawmode.\n" +"Select \"%s\" from View menu to view it." +msgstr "" + +#: ../src/vikmapslayer.c:1314 +#, c-format +msgid "" +"Cowardly refusing to draw tiles or existence of tiles beyond %d zoom out " +"factor" +msgstr "" + +#. TODO: ?? count up the number of download errors somehow... +#: ../src/vikmapslayer.c:1667 +msgid "Failed to download tile" +msgstr "" + +#: ../src/vikmapslayer.c:1673 +msgid "Unable to save tile" +msgstr "" + +#: ../src/vikmapslayer.c:1799 +#, c-format +msgid "Redownloading up to %d %s map..." +msgid_plural "Redownloading up to %d %s maps..." +msgstr[0] "" +msgstr[1] "" + +#: ../src/vikmapslayer.c:1801 +#, c-format +msgid "Redownloading %d %s map..." +msgid_plural "Redownloading %d %s maps..." +msgstr[0] "" +msgstr[1] "" + +#: ../src/vikmapslayer.c:1805 ../src/vikmapslayer.c:1890 +#, c-format +msgid "Downloading %d %s map..." +msgid_plural "Downloading %d %s maps..." +msgstr[0] "Downloader %d %s kort..." + +#: ../src/vikmapslayer.c:1969 +msgid "YES" +msgstr "" + +#: ../src/vikmapslayer.c:1973 ../src/vikmapslayer.c:1977 +msgid "NO" +msgstr "" + +#. NB Also handles .jpg automatically due to pixbuf_new_from () support - although just print png for now. +#: ../src/vikmapslayer.c:1980 +#, c-format +msgid "Source: %s (%d%s%d%s%d.%s %s)" +msgstr "" + +#: ../src/vikmapslayer.c:1983 +msgid "Source: Not available" +msgstr "" + +#: ../src/vikmapslayer.c:2000 +msgid "Source: file://" +msgstr "" + +#: ../src/vikmapslayer.c:2012 +#, c-format +msgid "Source: %s" +msgstr "" + +#: ../src/vikmapslayer.c:2038 +#, c-format +msgid "Tile File: %s [Not Available]" +msgstr "" + +#: ../src/vikmapslayer.c:2086 +msgid "Redownload _Bad Map(s)" +msgstr "" + +#: ../src/vikmapslayer.c:2090 +msgid "Redownload _New Map(s)" +msgstr "" + +#: ../src/vikmapslayer.c:2094 +msgid "Redownload _All Map(s)" +msgstr "" + +#: ../src/vikmapslayer.c:2099 +msgid "_Show Tile Information" +msgstr "" + +#: ../src/vikmapslayer.c:2166 +#, c-format +msgid "" +"Wrong drawmode for this map.\n" +"Select \"%s\" from View menu and try again." +msgstr "" + +#: ../src/vikmapslayer.c:2171 +msgid "Wrong zoom level for this map." +msgstr "Forkert zoom niveau for dette kort." + +#: ../src/vikmapslayer.c:2334 +msgid "Zoom Start:" +msgstr "" + +#: ../src/vikmapslayer.c:2341 +msgid "Zoom End:" +msgstr "" + +#: ../src/vikmapslayer.c:2347 +msgid "Download Maps Method:" +msgstr "" + +#. redownload method - needs to align with REDOWNLOAD* macro values +#: ../src/vikmapslayer.c:2419 +msgid "Missing" +msgstr "" + +#: ../src/vikmapslayer.c:2419 +msgid "Bad" +msgstr "" + +#: ../src/vikmapslayer.c:2419 +msgid "New" +msgstr "" + +#: ../src/vikmapslayer.c:2419 +msgid "Reload All" +msgstr "" + +#: ../src/vikmapslayer.c:2421 +msgid "Download for Zoom Levels" +msgstr "" + +#: ../src/vikmapslayer.c:2461 +#, c-format +msgid "" +"You are not allowed to download more than %d tiles in one go (requested %d)" +msgstr "" + +#: ../src/vikmapslayer.c:2469 +#, c-format +msgid "Do you really want to download %d tiles?" +msgstr "" + +#. Now with icons +#: ../src/vikmapslayer.c:2509 +msgid "Download _Missing Onscreen Maps" +msgstr "" + +#: ../src/vikmapslayer.c:2516 +msgid "Download _New Onscreen Maps" +msgstr "" + +#: ../src/vikmapslayer.c:2523 +msgid "Reload _All Onscreen Maps" +msgstr "" + +#: ../src/vikmapslayer.c:2529 +msgid "Download Maps in _Zoom Levels..." +msgstr "" + +#: ../src/vikmapslayer.c:2539 +#, fuzzy +msgid "_Open MBTiles Files" +msgstr "Åbn en fil" + +#: ../src/vikmapslayer.c:2554 +msgid "Flush Map Cache" +msgstr "" + +#: ../src/vikrouting.c:54 +msgid "Default engine:" +msgstr "" + +#: ../src/vikrouting.c:68 +msgid "Routing" +msgstr "" + +#: ../src/viktreeview.c:347 +msgid "Layer Name" +msgstr "Navn på lag" + +#: ../src/viktreeview.c:924 +#, c-format +msgid "delete data from %s\n" +msgstr "slet data fra %s\n" + +#: ../src/viktrwlayer.c:427 +msgid "Create _Waypoint" +msgstr "" + +#: ../src/viktrwlayer.c:427 +msgid "Create Waypoint" +msgstr "" + +#: ../src/viktrwlayer.c:437 +#, fuzzy +msgid "Edit _Track" +msgstr "Tilføj spor" + +#: ../src/viktrwlayer.c:437 +#, fuzzy +msgid "Edit Track" +msgstr "Tilføj spor" + +#: ../src/viktrwlayer.c:449 +msgid "Edit _Route" +msgstr "" + +#: ../src/viktrwlayer.c:449 +msgid "Edit Route" +msgstr "" + +#: ../src/viktrwlayer.c:460 +msgid "Route _Finder" +msgstr "" + +#: ../src/viktrwlayer.c:460 +msgid "Route Finder" +msgstr "" + +#: ../src/viktrwlayer.c:471 +#, fuzzy +msgid "Splitter" +msgstr "Opdel her" + +#: ../src/viktrwlayer.c:482 +msgid "_Edit Waypoint" +msgstr "" + +#: ../src/viktrwlayer.c:482 +msgid "Edit Waypoint" +msgstr "" + +#: ../src/viktrwlayer.c:495 +msgid "Edit Trac_kpoint" +msgstr "" + +#: ../src/viktrwlayer.c:495 +msgid "Edit Trackpoint" +msgstr "" + +#. a pixbuf for this one is already made globally available +#: ../src/viktrwlayer.c:508 +msgid "Show P_icture" +msgstr "" + +#: ../src/viktrwlayer.c:508 +msgid "Show Picture" +msgstr "Vis billed" + +#: ../src/viktrwlayer.c:531 +msgid "Waypoint Images" +msgstr "" + +#: ../src/viktrwlayer.c:531 +msgid "Tracks Advanced" +msgstr "" + +#: ../src/viktrwlayer.c:531 +msgid "Metadata" +msgstr "" + +#: ../src/viktrwlayer.c:531 +msgid "Filesystem" +msgstr "" + +#: ../src/viktrwlayer.c:534 +msgid "Draw by Track" +msgstr "" + +#: ../src/viktrwlayer.c:534 +msgid "Draw by Speed" +msgstr "" + +#: ../src/viktrwlayer.c:534 +msgid "All Tracks Same Color" +msgstr "" + +#: ../src/viktrwlayer.c:535 +msgid "Filled Square" +msgstr "" + +#: ../src/viktrwlayer.c:535 +msgid "Square" +msgstr "Kvadrat" + +#: ../src/viktrwlayer.c:535 +msgid "Circle" +msgstr "Cirkel" + +#: ../src/viktrwlayer.c:535 +msgid "X" +msgstr "X" + +#: ../src/viktrwlayer.c:561 +msgid "Extra Extra Small" +msgstr "" + +#: ../src/viktrwlayer.c:562 +msgid "Extra Small" +msgstr "" + +#: ../src/viktrwlayer.c:566 +msgid "Extra Large" +msgstr "" + +#: ../src/viktrwlayer.c:567 +msgid "Extra Extra Large" +msgstr "" + +#: ../src/viktrwlayer.c:573 +msgid "Name Ascending" +msgstr "" + +#: ../src/viktrwlayer.c:574 +msgid "Name Descending" +msgstr "" + +#: ../src/viktrwlayer.c:582 ../src/viktrwlayer_propwin.c:3319 +msgid "No" +msgstr "" + +#: ../src/viktrwlayer.c:583 +msgid "Yes" +msgstr "" + +#: ../src/viktrwlayer.c:584 +msgid "No write" +msgstr "" + +#: ../src/viktrwlayer.c:649 ../src/viktrwlayer.c:673 +msgid "Draw Labels" +msgstr "" + +#: ../src/viktrwlayer.c:650 +msgid "Note: the individual track controls what labels may be displayed" +msgstr "" + +#: ../src/viktrwlayer.c:651 +msgid "Track Labels Font Size:" +msgstr "" + +#: ../src/viktrwlayer.c:652 +msgid "Track Drawing Mode:" +msgstr "" + +#: ../src/viktrwlayer.c:653 +msgid "All Tracks Color:" +msgstr "" + +#: ../src/viktrwlayer.c:654 +msgid "The color used when 'All Tracks Same Color' drawing mode is selected" +msgstr "" + +#: ../src/viktrwlayer.c:655 +msgid "Draw Track Lines" +msgstr "" + +#: ../src/viktrwlayer.c:656 +msgid "Track Thickness:" +msgstr "Spor tykkelse:" + +#: ../src/viktrwlayer.c:657 +msgid "Draw Track Direction" +msgstr "" + +#: ../src/viktrwlayer.c:658 +msgid "Direction Size:" +msgstr "" + +#: ../src/viktrwlayer.c:659 +msgid "Draw Trackpoints" +msgstr "" + +#: ../src/viktrwlayer.c:660 +msgid "Trackpoint Size:" +msgstr "" + +#: ../src/viktrwlayer.c:661 +msgid "Draw Elevation" +msgstr "" + +#: ../src/viktrwlayer.c:662 +msgid "Draw Elevation Height %:" +msgstr "" + +#: ../src/viktrwlayer.c:663 +msgid "Draw Stops" +msgstr "" + +#: ../src/viktrwlayer.c:664 +msgid "" +"Whether to draw a marker when trackpoints are at the same position but over " +"the minimum stop length apart in time" +msgstr "" + +#: ../src/viktrwlayer.c:665 +msgid "Min Stop Length (seconds):" +msgstr "" + +#: ../src/viktrwlayer.c:667 +msgid "Track BG Thickness:" +msgstr "" + +#: ../src/viktrwlayer.c:668 +msgid "Track Background Color" +msgstr "Spor baggrundsfarve" + +#: ../src/viktrwlayer.c:669 +msgid "Draw by Speed Factor (%):" +msgstr "" + +#: ../src/viktrwlayer.c:670 +msgid "" +"The percentage factor away from the average speed determining the color used" +msgstr "" + +#: ../src/viktrwlayer.c:671 +msgid "Track Sort Order:" +msgstr "" + +#: ../src/viktrwlayer.c:674 +msgid "Waypoint Font Size:" +msgstr "" + +#: ../src/viktrwlayer.c:675 +msgid "Waypoint Color:" +msgstr "" + +#: ../src/viktrwlayer.c:676 +msgid "Waypoint Text:" +msgstr "" + +#: ../src/viktrwlayer.c:677 +msgid "Background:" +msgstr "Baggrund:" + +#: ../src/viktrwlayer.c:678 +msgid "Fake BG Color Translucency:" +msgstr "" + +#: ../src/viktrwlayer.c:679 +msgid "Waypoint marker:" +msgstr "" + +#: ../src/viktrwlayer.c:680 +msgid "Waypoint size:" +msgstr "" + +#: ../src/viktrwlayer.c:681 +msgid "Draw Waypoint Symbols:" +msgstr "" + +#: ../src/viktrwlayer.c:682 +msgid "Waypoint Sort Order:" +msgstr "" + +#: ../src/viktrwlayer.c:684 +msgid "Draw Waypoint Images" +msgstr "" + +#: ../src/viktrwlayer.c:685 +msgid "Image Size (pixels):" +msgstr "Billed størrelse (pixels):Alfa billed:" + +#: ../src/viktrwlayer.c:686 +msgid "Image Alpha:" +msgstr "" + +#: ../src/viktrwlayer.c:687 +msgid "Image Memory Cache Size:" +msgstr "" + +#: ../src/viktrwlayer.c:690 +msgid "Author" +msgstr "" + +#: ../src/viktrwlayer.c:691 +msgid "Creation Time" +msgstr "" + +#: ../src/viktrwlayer.c:692 +msgid "Keywords" +msgstr "" + +#: ../src/viktrwlayer.c:693 +msgid "External layer:" +msgstr "" + +#: ../src/viktrwlayer.c:693 +msgid "" +"Layer data stored in the Viking file, in an external file, or in an external " +"file but changes are not written to the file (file only loaded at startup)" +msgstr "" + +#: ../src/viktrwlayer.c:694 +msgid "Save layer as:" +msgstr "" + +#: ../src/viktrwlayer.c:694 +msgid "Specify where layer should be saved. Overwrites file if it exists." +msgstr "" + +#: ../src/viktrwlayer.c:798 +msgid "TrackWaypoint" +msgstr "" + +#: ../src/viktrwlayer.c:1999 ../src/viktrwlayer_propwin.c:1469 +#: ../src/viktrwlayer_propwin.c:1471 ../src/vikutils.c:299 +#: ../src/vikutils.c:326 +msgid "miles" +msgstr "" + +#: ../src/viktrwlayer.c:2002 ../src/viktrwlayer_propwin.c:1475 +#: ../src/viktrwlayer_propwin.c:1477 ../src/vikutils.c:303 +#: ../src/vikutils.c:330 +msgid "NM" +msgstr "" + +#. VIK_UNITS_DISTANCE_KILOMETRES: +#: ../src/viktrwlayer.c:2006 ../src/viktrwlayer_propwin.c:1482 +#: ../src/viktrwlayer_propwin.c:1484 ../src/vikutils.c:308 +#: ../src/vikutils.c:335 +msgid "km" +msgstr "" + +#: ../src/viktrwlayer.c:2121 +msgid "start/end" +msgstr "" + +#: ../src/viktrwlayer.c:2133 +msgid "start" +msgstr "" + +#: ../src/viktrwlayer.c:2142 +msgid "end" +msgstr "" + +#: ../src/viktrwlayer.c:3103 +#, c-format +msgid " in %d:%02d hrs:mins" +msgstr "" + +#: ../src/viktrwlayer.c:3107 +#, c-format +msgid "" +"\n" +"%sTotal Length %.1f %s%s" +msgstr "" + +#: ../src/viktrwlayer.c:3131 +#, c-format +msgid "" +"\n" +"Total route length %.1f %s" +msgstr "" + +#: ../src/viktrwlayer.c:3136 +#, c-format +msgid "Tracks: %d - Waypoints: %d - Routes: %d%s%s" +msgstr "" + +#: ../src/viktrwlayer.c:3155 +#, c-format +msgid "Tracks: %d" +msgstr "" + +#: ../src/viktrwlayer.c:3165 +#, c-format +msgid "Routes: %d" +msgstr "" + +#: ../src/viktrwlayer.c:3195 +#, c-format +msgid "- %d:%02d hrs:mins" +msgstr "" + +#: ../src/viktrwlayer.c:3202 +#, c-format +msgid "%s%.1f km %s" +msgstr "" + +#: ../src/viktrwlayer.c:3205 +#, c-format +msgid "%s%.1f miles %s" +msgstr "" + +#: ../src/viktrwlayer.c:3208 +#, c-format +msgid "%s%.1f NM %s" +msgstr "" + +#: ../src/viktrwlayer.c:3222 +#, c-format +msgid "Waypoints: %d" +msgstr "" + +#: ../src/viktrwlayer.c:3279 +#, c-format +msgid "Wpt: Alt %dft" +msgstr "" + +#. VIK_UNITS_HEIGHT_METRES: +#: ../src/viktrwlayer.c:3283 +#, c-format +msgid "Wpt: Alt %dm" +msgstr "" + +#. Add comment if available +#: ../src/viktrwlayer.c:3298 +#, c-format +msgid "%s | %s %s | Comment: %s" +msgstr "" + +#: ../src/viktrwlayer.c:3300 +#, c-format +msgid "%s | %s %s" +msgstr "" + +#: ../src/viktrwlayer.c:3562 ../src/viktrwlayer.c:3591 +msgid "This layer has no waypoints or trackpoints." +msgstr "" + +#: ../src/viktrwlayer.c:3598 ../src/viktrwlayer.c:3607 +#: ../src/viktrwlayer.c:3616 ../src/viktrwlayer.c:3625 +#: ../src/viktrwlayer.c:3634 ../src/viktrwlayer.c:3642 +msgid "Export Layer" +msgstr "Eksportér lag" + +#: ../src/viktrwlayer.c:3671 +msgid "Export Route as GPX" +msgstr "" + +#: ../src/viktrwlayer.c:3673 +msgid "Export Track as GPX" +msgstr "" + +#: ../src/viktrwlayer.c:3693 +msgid "Find" +msgstr "" + +#: ../src/viktrwlayer.c:3703 +msgid "Waypoint Name:" +msgstr "" + +#: ../src/viktrwlayer.c:3720 +msgid "Waypoint not found in this layer." +msgstr "" + +#: ../src/viktrwlayer.c:3989 +msgid "Can not upload invisible track." +msgstr "" + +#: ../src/viktrwlayer.c:4082 ../src/viktrwlayer.c:10512 +msgid "Track" +msgstr "" + +#: ../src/viktrwlayer.c:4107 ../src/viktrwlayer.c:10599 +msgid "Route" +msgstr "" + +#: ../src/viktrwlayer.c:4194 +msgid "Externa_l" +msgstr "" + +#: ../src/viktrwlayer.c:4216 ../src/viktrwlayer.c:8456 +#: ../src/viktrwlayer.c:8574 +msgid "_Finish Route" +msgstr "" + +#: ../src/viktrwlayer.c:4218 ../src/viktrwlayer.c:8380 +#: ../src/viktrwlayer.c:8572 +msgid "_Finish Track" +msgstr "" + +#. Now with icons +#: ../src/viktrwlayer.c:4230 +msgid "_View Layer" +msgstr "" + +#: ../src/viktrwlayer.c:4237 +msgid "V_iew" +msgstr "" + +#: ../src/viktrwlayer.c:4243 +msgid "View All _Tracks" +msgstr "" + +#: ../src/viktrwlayer.c:4248 +msgid "View All _Routes" +msgstr "" + +#: ../src/viktrwlayer.c:4253 +msgid "View All _Waypoints" +msgstr "" + +#: ../src/viktrwlayer.c:4258 +msgid "_Goto Center of Layer" +msgstr "" + +#: ../src/viktrwlayer.c:4264 ../src/viktrwlayer.c:8321 +msgid "Goto _Waypoint..." +msgstr "" + +#: ../src/viktrwlayer.c:4270 +msgid "_Export Layer" +msgstr "" + +#: ../src/viktrwlayer.c:4276 +msgid "Export as GPS_Point..." +msgstr "" + +#: ../src/viktrwlayer.c:4281 +msgid "Export as GPS_Mapper..." +msgstr "" + +#: ../src/viktrwlayer.c:4286 +msgid "Export as _GPX..." +msgstr "" + +#: ../src/viktrwlayer.c:4292 +msgid "Export as _KML..." +msgstr "" + +#: ../src/viktrwlayer.c:4299 +msgid "Export as GEO_JSON..." +msgstr "" + +#: ../src/viktrwlayer.c:4306 +msgid "Export via GPSbabel..." +msgstr "" + +#: ../src/viktrwlayer.c:4312 +#, c-format +msgid "Open with External Program_1: %s" +msgstr "" + +#: ../src/viktrwlayer.c:4319 +#, c-format +msgid "Open with External Program_2: %s" +msgstr "" + +#: ../src/viktrwlayer.c:4327 ../src/vikwindow.c:4825 +msgid "_New" +msgstr "_Ny" + +#: ../src/viktrwlayer.c:4333 +msgid "New _Waypoint..." +msgstr "" + +#: ../src/viktrwlayer.c:4339 +msgid "New _Track" +msgstr "" + +#: ../src/viktrwlayer.c:4347 +msgid "New _Route" +msgstr "" + +#: ../src/viktrwlayer.c:4356 ../src/viktrwlayer.c:8232 +#: ../src/viktrwlayer.c:9003 +msgid "Geotag _Images..." +msgstr "" + +#: ../src/viktrwlayer.c:4363 +msgid "_Acquire" +msgstr "" + +#: ../src/viktrwlayer.c:4369 ../src/vikwindow.c:4904 +msgid "From _GPS..." +msgstr "Fra _GPS..." + +#. FIXME: only add menu when at least a routing engine has support for Directions +#: ../src/viktrwlayer.c:4375 +msgid "From _Directions..." +msgstr "" + +#: ../src/viktrwlayer.c:4381 +msgid "From _OSM Traces..." +msgstr "" + +#: ../src/viktrwlayer.c:4386 +msgid "From _My OSM Traces..." +msgstr "" + +#: ../src/viktrwlayer.c:4392 ../src/vikwindow.c:4844 +msgid "From _URL..." +msgstr "" + +#: ../src/viktrwlayer.c:4399 ../src/vikwindow.c:4846 +msgid "From _Wikipedia Waypoints" +msgstr "" + +#: ../src/viktrwlayer.c:4405 +msgid "Within _Layer Bounds" +msgstr "" + +#: ../src/viktrwlayer.c:4411 +msgid "Within _Current View" +msgstr "" + +#: ../src/viktrwlayer.c:4419 +msgid "From Geo_caching..." +msgstr "" + +#: ../src/viktrwlayer.c:4426 ../src/vikwindow.c:4842 +msgid "From Geotagged _Images..." +msgstr "" + +#: ../src/viktrwlayer.c:4433 +msgid "From _File..." +msgstr "" + +#: ../src/viktrwlayer.c:4436 ../src/vikwindow.c:4905 +msgid "Import File With GPS_Babel..." +msgstr "" + +#: ../src/viktrwlayer.c:4443 ../src/viktrwlayer.c:8905 +msgid "_Upload" +msgstr "" + +#: ../src/viktrwlayer.c:4449 +msgid "Upload to _GPS..." +msgstr "" + +#: ../src/viktrwlayer.c:4456 ../src/viktrwlayer.c:8973 +msgid "Upload to _OSM..." +msgstr "" + +#: ../src/viktrwlayer.c:4464 +msgid "De_lete" +msgstr "" + +#: ../src/viktrwlayer.c:4470 +msgid "Delete All _Tracks" +msgstr "" + +#: ../src/viktrwlayer.c:4477 +msgid "Delete Tracks _From Selection..." +msgstr "" + +#: ../src/viktrwlayer.c:4484 ../src/viktrwlayer.c:8481 +msgid "Delete _All Routes" +msgstr "" + +#: ../src/viktrwlayer.c:4491 ../src/viktrwlayer.c:8487 +msgid "_Delete Routes From Selection..." +msgstr "" + +#: ../src/viktrwlayer.c:4498 +msgid "Delete All _Waypoints" +msgstr "" + +#: ../src/viktrwlayer.c:4505 +msgid "Delete Waypoints From _Selection..." +msgstr "" + +#: ../src/viktrwlayer.c:4512 ../src/viktrwlayer.c:8339 +msgid "Delete Duplicate Waypoints" +msgstr "" + +#: ../src/viktrwlayer.c:5198 +#, c-format +msgid "Are you sure you want to delete all tracks in %s?" +msgstr "" + +#: ../src/viktrwlayer.c:5211 +#, c-format +msgid "Are you sure you want to delete all routes in %s?" +msgstr "" + +#: ../src/viktrwlayer.c:5221 +#, c-format +msgid "Are you sure you want to delete all waypoints in %s?" +msgstr "" + +#: ../src/viktrwlayer.c:5238 +#, c-format +msgid "Are you sure you want to delete the waypoint \"%s\"?" +msgstr "" + +#: ../src/viktrwlayer.c:5254 +#, c-format +msgid "Are you sure you want to delete the track \"%s\"?" +msgstr "" + +#: ../src/viktrwlayer.c:5271 +#, c-format +msgid "Are you sure you want to delete the route \"%s\"?" +msgstr "" + +#: ../src/viktrwlayer.c:5527 ../src/viktrwlayer.c:6373 +msgid "" +"Converting a track to a route removes extra track data such as segments, " +"timestamps, etc...\n" +"Do you want to continue?" +msgstr "" + +#: ../src/viktrwlayer.c:5631 +msgid "No DEM layers available, thus no DEM values can be applied." +msgstr "" + +#: ../src/viktrwlayer.c:5651 ../src/viktrwlayer.c:5692 +#, c-format +msgid "%ld point adjusted" +msgid_plural "%ld points adjusted" +msgstr[0] "" +msgstr[1] "" + +#: ../src/viktrwlayer.c:5736 +#, c-format +msgid "%ld waypoint changed" +msgid_plural "%ld waypoints changed" +msgstr[0] "" +msgstr[1] "" + +#: ../src/viktrwlayer.c:5917 +#, c-format +msgid "" +"Refining a track with many points (%d) is unlikely to yield sensible " +"results. Do you want to Continue?" +msgstr "" + +#. Select engine from dialog +#: ../src/viktrwlayer.c:5925 +msgid "Refine Route with Routing Engine..." +msgstr "" + +#: ../src/viktrwlayer.c:5933 +msgid "Select routing engine" +msgstr "" + +#: ../src/viktrwlayer.c:6158 +msgid "Failed. No other tracks with timestamps in this layer found" +msgstr "" + +#: ../src/viktrwlayer.c:6160 +msgid "Failed. No other tracks without timestamps in this layer found" +msgstr "" + +#: ../src/viktrwlayer.c:6179 +msgid "Merge with..." +msgstr "" + +#: ../src/viktrwlayer.c:6180 +msgid "Select route to merge with" +msgstr "" + +#: ../src/viktrwlayer.c:6180 +msgid "Select track to merge with" +msgstr "" + +#: ../src/viktrwlayer.c:6264 ../src/viktrwlayer.c:6346 +msgid "Append Route" +msgstr "" + +#: ../src/viktrwlayer.c:6264 ../src/viktrwlayer.c:6346 +msgid "Append Track" +msgstr "" + +#: ../src/viktrwlayer.c:6265 +msgid "Select the route to append after the current route" +msgstr "" + +#: ../src/viktrwlayer.c:6266 +msgid "Select the track to append after the current track" +msgstr "" + +#: ../src/viktrwlayer.c:6347 +msgid "Select the track to append after the current route" +msgstr "" + +#: ../src/viktrwlayer.c:6348 +msgid "Select the route to append after the current track" +msgstr "" + +#: ../src/viktrwlayer.c:6414 +#, c-format +msgid "%d segment merged" +msgid_plural "%d segments merged" +msgstr[0] "" +msgstr[1] "" + +#: ../src/viktrwlayer.c:6430 +msgid "Failed. This track does not have timestamp" +msgstr "" + +#: ../src/viktrwlayer.c:6442 +msgid "Failed. No other track in this layer has timestamp" +msgstr "" + +#: ../src/viktrwlayer.c:6449 +msgid "Merge Threshold..." +msgstr "" + +#: ../src/viktrwlayer.c:6450 +msgid "Merge when time between tracks less than:" +msgstr "" + +#: ../src/viktrwlayer.c:6580 +msgid "Split Threshold..." +msgstr "" + +#: ../src/viktrwlayer.c:6581 +msgid "Split when time between trackpoints exceeds:" +msgstr "" + +#: ../src/viktrwlayer.c:6598 +#, c-format +msgid "" +"Can not split track due to trackpoints not ordered in time - such as at %s.\n" +"\n" +"Goto this trackpoint?" +msgstr "" + +#: ../src/viktrwlayer.c:6668 +msgid "Split Every Nth Point" +msgstr "" + +#: ../src/viktrwlayer.c:6669 +msgid "Split on every Nth point:" +msgstr "" + +#: ../src/viktrwlayer.c:6779 +msgid "Can not split track as it has no segments" +msgstr "" + +#: ../src/viktrwlayer.c:6861 ../src/viktrwlayer.c:6891 +#, c-format +msgid "Deleted %ld point" +msgid_plural "Deleted %ld points" +msgstr[0] "" +msgstr[1] "" + +#: ../src/viktrwlayer.c:6966 ../src/viktrwlayer.c:10989 +#: ../src/viktrwlayer_waypointlist.c:214 +#, c-format +msgid "Could not launch %s to open file." +msgstr "" + +#: ../src/viktrwlayer.c:6992 ../src/viktrwlayer.c:7113 +msgid "This track has no date information." +msgstr "" + +#: ../src/viktrwlayer.c:7006 ../src/viktrwlayer.c:7136 +msgid "This waypoint has no date information." +msgstr "" + +#: ../src/viktrwlayer.c:7030 +#, c-format +msgid "Could not launch %s" +msgstr "" + +#: ../src/viktrwlayer.c:7269 +msgid "Internal Error in vik_trw_layer_uniquify_tracks" +msgstr "" + +#: ../src/viktrwlayer.c:7374 ../src/viktrwlayer.c:7424 +#: ../src/viktrwlayer.c:7587 +msgid "" +"Multiple entries with the same name exist. This method only works with " +"unique names. Force unique names now?" +msgstr "" + +#: ../src/viktrwlayer.c:7385 +msgid "No tracks found" +msgstr "" + +#: ../src/viktrwlayer.c:7393 ../src/viktrwlayer.c:7443 +#: ../src/viktrwlayer.c:7607 +msgid "Delete Selection" +msgstr "" + +#: ../src/viktrwlayer.c:7394 +msgid "Select tracks to delete" +msgstr "" + +#: ../src/viktrwlayer.c:7435 +msgid "No routes found" +msgstr "" + +#: ../src/viktrwlayer.c:7444 +msgid "Select routes to delete" +msgstr "" + +#: ../src/viktrwlayer.c:7550 +msgid "Internal Error in vik_trw_layer_uniquify_waypoints" +msgstr "" + +#: ../src/viktrwlayer.c:7597 +msgid "No waypoints found" +msgstr "" + +#: ../src/viktrwlayer.c:7608 +msgid "Select waypoints to delete" +msgstr "" + +#: ../src/viktrwlayer.c:7691 +#, c-format +msgid "%ld waypoint deleted" +msgid_plural "%ld waypoints deleted" +msgstr[0] "" +msgstr[1] "" + +#: ../src/viktrwlayer.c:7697 +msgid "No duplicates found" +msgstr "" + +#: ../src/viktrwlayer.c:8028 +#, c-format +msgid "" +"A waypoint with the name \"%s\" already exists. Really rename to the same " +"name?" +msgstr "" + +#: ../src/viktrwlayer.c:8058 +#, c-format +msgid "" +"A track with the name \"%s\" already exists. Really rename to the same name?" +msgstr "" + +#: ../src/viktrwlayer.c:8095 +#, c-format +msgid "" +"A route with the name \"%s\" already exists. Really rename to the same name?" +msgstr "" + +#: ../src/viktrwlayer.c:8215 ../src/viktrwlayer.c:8602 +msgid "_Goto" +msgstr "" + +#: ../src/viktrwlayer.c:8226 +msgid "_Visit Geocache Webpage" +msgstr "" + +#: ../src/viktrwlayer.c:8235 +msgid "Geotag multiple images against this waypoint" +msgstr "" + +#: ../src/viktrwlayer.c:8245 ../src/viktrwlayer_waypointlist.c:352 +msgid "_Show Picture..." +msgstr "" + +#: ../src/viktrwlayer.c:8253 +msgid "Update Geotag on _Image" +msgstr "" + +#: ../src/viktrwlayer.c:8259 +msgid "_Update" +msgstr "" + +#: ../src/viktrwlayer.c:8264 +msgid "Update and _Keep File Timestamp" +msgstr "" + +#: ../src/viktrwlayer.c:8276 +msgid "Visit _Webpage" +msgstr "" + +#: ../src/viktrwlayer.c:8306 +msgid "_New Waypoint..." +msgstr "" + +#: ../src/viktrwlayer.c:8315 +msgid "_View All Waypoints" +msgstr "" + +#: ../src/viktrwlayer.c:8327 +msgid "Delete _All Waypoints" +msgstr "" + +#: ../src/viktrwlayer.c:8333 +msgid "_Delete Waypoints From Selection..." +msgstr "" + +#: ../src/viktrwlayer.c:8351 +msgid "_Show All Waypoints" +msgstr "" + +#: ../src/viktrwlayer.c:8357 +msgid "_Hide All Waypoints" +msgstr "" + +#: ../src/viktrwlayer.c:8369 +msgid "_List Waypoints..." +msgstr "" + +#: ../src/viktrwlayer.c:8390 +msgid "_View All Tracks" +msgstr "" + +#: ../src/viktrwlayer.c:8396 +msgid "_New Track" +msgstr "" + +#: ../src/viktrwlayer.c:8404 +msgid "Delete _All Tracks" +msgstr "" + +#: ../src/viktrwlayer.c:8410 +msgid "_Delete Tracks From Selection..." +msgstr "" + +#: ../src/viktrwlayer.c:8422 +msgid "_Show All Tracks" +msgstr "" + +#: ../src/viktrwlayer.c:8428 +msgid "_Hide All Tracks" +msgstr "" + +#: ../src/viktrwlayer.c:8439 +msgid "_List Tracks..." +msgstr "" + +#: ../src/viktrwlayer.c:8467 +msgid "_View All Routes" +msgstr "" + +#: ../src/viktrwlayer.c:8473 +msgid "_New Route" +msgstr "" + +#: ../src/viktrwlayer.c:8499 +msgid "_Show All Routes" +msgstr "" + +#: ../src/viktrwlayer.c:8505 +msgid "_Hide All Routes" +msgstr "" + +#: ../src/viktrwlayer.c:8516 +msgid "_List Routes..." +msgstr "" + +#: ../src/viktrwlayer.c:8587 +msgid "_View Track" +msgstr "" + +#: ../src/viktrwlayer.c:8589 +msgid "_View Route" +msgstr "" + +#: ../src/viktrwlayer.c:8608 +msgid "_Startpoint" +msgstr "" + +#: ../src/viktrwlayer.c:8614 +msgid "\"_Center\"" +msgstr "" + +#: ../src/viktrwlayer.c:8620 +msgid "_Endpoint" +msgstr "" + +#: ../src/viktrwlayer.c:8626 +msgid "_Highest Altitude" +msgstr "" + +#: ../src/viktrwlayer.c:8632 +msgid "_Lowest Altitude" +msgstr "" + +#: ../src/viktrwlayer.c:8640 +msgid "_Maximum Speed" +msgstr "" + +#: ../src/viktrwlayer.c:8646 +msgid "_Date" +msgstr "" + +#: ../src/viktrwlayer.c:8655 +msgid "Co_mbine" +msgstr "" + +#: ../src/viktrwlayer.c:8663 +msgid "_Merge By Time..." +msgstr "" + +#: ../src/viktrwlayer.c:8668 +msgid "Merge _Segments" +msgstr "" + +#: ../src/viktrwlayer.c:8675 +msgid "Merge _With Other Tracks..." +msgstr "" + +#: ../src/viktrwlayer.c:8682 +msgid "_Append Track..." +msgstr "" + +#: ../src/viktrwlayer.c:8684 +msgid "_Append Route..." +msgstr "" + +#: ../src/viktrwlayer.c:8690 +msgid "Append _Route..." +msgstr "" + +#: ../src/viktrwlayer.c:8692 +msgid "Append _Track..." +msgstr "" + +#: ../src/viktrwlayer.c:8699 +msgid "_Split" +msgstr "" + +#: ../src/viktrwlayer.c:8707 +msgid "_Split By Time..." +msgstr "" + +#. ATM always enable this entry - don't want to have to analyse the track before displaying the menu - to keep the menu speedy +#: ../src/viktrwlayer.c:8713 +msgid "Split Se_gments" +msgstr "" + +#: ../src/viktrwlayer.c:8719 +msgid "Split By _Number of Points..." +msgstr "" + +#: ../src/viktrwlayer.c:8724 +msgid "Split at _Trackpoint" +msgstr "" + +#: ../src/viktrwlayer.c:8732 +msgid "_Insert Points" +msgstr "" + +#: ../src/viktrwlayer.c:8738 +msgid "Insert Point _Before Selected Point" +msgstr "" + +#: ../src/viktrwlayer.c:8745 +msgid "Insert Point _After Selected Point" +msgstr "" + +#: ../src/viktrwlayer.c:8754 +msgid "Delete Poi_nts" +msgstr "" + +#: ../src/viktrwlayer.c:8760 +msgid "Delete _Selected Point" +msgstr "" + +#: ../src/viktrwlayer.c:8768 +msgid "Delete Points With The Same _Position" +msgstr "" + +#: ../src/viktrwlayer.c:8773 +msgid "Delete Points With The Same _Time" +msgstr "" + +#: ../src/viktrwlayer.c:8780 ../src/viktrwlayer.c:9029 +msgid "_Transform" +msgstr "" + +#: ../src/viktrwlayer.c:8788 ../src/viktrwlayer.c:9037 +msgid "_Apply DEM Data" +msgstr "" + +#: ../src/viktrwlayer.c:8793 ../src/viktrwlayer.c:9042 +msgid "_Overwrite" +msgstr "" + +#: ../src/viktrwlayer.c:8796 ../src/viktrwlayer.c:9045 +msgid "Overwrite any existing elevation values with DEM values" +msgstr "" + +#: ../src/viktrwlayer.c:8799 ../src/viktrwlayer.c:9048 +msgid "_Keep Existing" +msgstr "" + +#: ../src/viktrwlayer.c:8802 ../src/viktrwlayer.c:9051 +msgid "Keep existing elevation values, only attempt for missing values" +msgstr "" + +#: ../src/viktrwlayer.c:8807 +msgid "_Smooth Missing Elevation Data" +msgstr "" + +#: ../src/viktrwlayer.c:8812 +msgid "_Interpolated" +msgstr "" + +#: ../src/viktrwlayer.c:8815 +msgid "" +"Interpolate between known elevation values to derive values for the missing " +"elevations" +msgstr "" + +#: ../src/viktrwlayer.c:8818 +msgid "_Flat" +msgstr "" + +#: ../src/viktrwlayer.c:8821 +msgid "Set unknown elevation values to the last known value" +msgstr "" + +#: ../src/viktrwlayer.c:8825 +msgid "C_onvert to a Route" +msgstr "" + +#: ../src/viktrwlayer.c:8827 +msgid "C_onvert to a Track" +msgstr "" + +#: ../src/viktrwlayer.c:8835 +msgid "_Anonymize Times" +msgstr "" + +#: ../src/viktrwlayer.c:8838 +msgid "Shift timestamps to a relative offset from 1901-01-01" +msgstr "" + +#: ../src/viktrwlayer.c:8841 +msgid "_Interpolate Times" +msgstr "" + +#: ../src/viktrwlayer.c:8844 +msgid "" +"Reset trackpoint timestamps between the first and last points such that " +"track is traveled at equal speed" +msgstr "" + +#: ../src/viktrwlayer.c:8849 +msgid "_Reverse Track" +msgstr "" + +#: ../src/viktrwlayer.c:8851 +msgid "_Reverse Route" +msgstr "" + +#: ../src/viktrwlayer.c:8858 +msgid "Refine Route..." +msgstr "" + +#: ../src/viktrwlayer.c:8868 +msgid "Down_load Maps Along Track..." +msgstr "" + +#: ../src/viktrwlayer.c:8870 +msgid "Down_load Maps Along Route..." +msgstr "" + +#: ../src/viktrwlayer.c:8878 +msgid "_Export Track as GPX..." +msgstr "" + +#: ../src/viktrwlayer.c:8880 +msgid "_Export Route as GPX..." +msgstr "" + +#: ../src/viktrwlayer.c:8887 +msgid "E_xtend Track End" +msgstr "" + +#: ../src/viktrwlayer.c:8889 +msgid "E_xtend Route End" +msgstr "" + +#: ../src/viktrwlayer.c:8896 +msgid "Extend _Using Route Finder" +msgstr "" + +#: ../src/viktrwlayer.c:8911 +msgid "_Upload to GPS..." +msgstr "" + +#: ../src/viktrwlayer.c:8926 +msgid "_Diary" +msgstr "" + +#: ../src/viktrwlayer.c:8930 +msgid "Open diary program at this date" +msgstr "" + +#: ../src/viktrwlayer.c:8935 +msgid "_Astronomy" +msgstr "" + +#: ../src/viktrwlayer.c:8938 +msgid "Open astronomy program at this date and location" +msgstr "" + +#: ../src/viktrwlayer.c:8962 +msgid "_View Google Directions" +msgstr "" + +#: ../src/viktrwlayer.c:8984 +msgid "Use with _Filter" +msgstr "" + +#: ../src/viktrwlayer.c:9018 +msgid "_Edit Trackpoint" +msgstr "" + +#: ../src/viktrwlayer.c:10116 +#, c-format +msgid " - Gain %dm:Loss %dm" +msgstr "" + +#: ../src/viktrwlayer.c:10118 +#, c-format +msgid " - Gain %dft:Loss %dft" +msgstr "" + +#: ../src/viktrwlayer.c:10123 +#, c-format +msgid " - Bearing %3.1f° - Step %s" +msgstr "" + +#: ../src/viktrwlayer.c:10232 +#, c-format +msgid "Querying %s for route between (%.3f, %.3f) and (%.3f, %.3f)." +msgstr "" + +#: ../src/viktrwlayer.c:10248 +#, c-format +msgid "%s returned route between (%.3f, %.3f) and (%.3f, %.3f)." +msgstr "" + +#: ../src/viktrwlayer.c:10251 +#, c-format +msgid "Error getting route from %s." +msgstr "" + +#: ../src/viktrwlayer.c:11070 +#, c-format +msgid "Creating %d Image Thumbnails..." +msgstr "" + +#: ../src/viktrwlayer.c:11560 +msgid "No map layer in use. Create one first" +msgstr "Ingen kortlag i brug. Skab en først" + +#: ../src/viktrwlayer.c:11679 +#, c-format +msgid "%s: Track List" +msgstr "" + +#: ../src/viktrwlayer.c:11681 +#, c-format +msgid "%s: Route List" +msgstr "" + +#: ../src/viktrwlayer.c:11734 +#, c-format +msgid "" +"Could not write external layer %s to %s, please fix and save before exiting " +"or data will be lost" +msgstr "" + +#: ../src/viktrwlayer.c:11782 +#, c-format +msgid "WARNING: issues encountered loading external layer %s from %s" +msgstr "" + +#: ../src/viktrwlayer_export.c:47 +msgid "Auto Device GPX Simplify:" +msgstr "" + +#: ../src/viktrwlayer_export.c:48 +msgid "" +"GPX saves to certain devices will be simplified for device compatibility." +msgstr "" + +#: ../src/viktrwlayer_export.c:125 +#, c-format +msgid "Export of GPX file simplified using point limit: %d" +msgstr "" + +#: ../src/viktrwlayer_export.c:206 ../src/viktrwlayer_export.c:323 +#: ../src/vikwindow.c:3694 +msgid "The filename you requested could not be opened for writing." +msgstr "Filnavnet du anmodede om kunne ikke åbnes til skrivning." + +#: ../src/viktrwlayer_export.c:226 +#, c-format +msgid "Could not launch %s." +msgstr "" + +#: ../src/viktrwlayer_export.c:234 +msgid "Could not create temporary file for export." +msgstr "" + +#: ../src/viktrwlayer_export.c:268 +msgid "File format:" +msgstr "" + +#: ../src/viktrwlayer_export.c:276 +msgid "Select the file format." +msgstr "" + +#: ../src/viktrwlayer_export.c:281 +msgid "" +"Select the information to process.\n" +"Warning: the behavior of these switches is highly dependent of the file " +"format selected.\n" +"Please, refer to GPSbabel if unsure." +msgstr "" + +#: ../src/viktrwlayer_export.c:308 +msgid "You did not select a valid file format." +msgstr "" + +#: ../src/viktrwlayer_propwin.c:915 ../src/viktrwlayer_propwin.c:3381 +#: ../src/viktrwlayer_propwin.c:3417 ../src/viktrwlayer_propwin.c:3457 +#: ../src/viktrwlayer_propwin.c:3509 ../src/viktrwlayer_propwin.c:3527 +#: ../src/viktrwlayer_propwin.c:3600 ../src/viktrwlayer_propwin.c:3601 +#: ../src/viktrwlayer_propwin.c:3602 ../src/viktrwlayer_propwin.c:3611 +#: ../src/viktrwlayer_propwin.c:3612 ../src/viktrwlayer_propwin.c:3629 +#: ../src/viktrwlayer_propwin.c:3630 ../src/viktrwlayer_propwin.c:3644 +#: ../src/viktrwlayer_propwin.c:3645 ../src/viktrwlayer_propwin.c:3646 +#: ../src/viktrwlayer_propwin.c:3660 ../src/viktrwlayer_propwin.c:3661 +#: ../src/viktrwlayer_propwin.c:3662 ../src/viktrwlayer_propwin.c:3676 +#: ../src/viktrwlayer_propwin.c:3677 ../src/viktrwlayer_propwin.c:3678 +#: ../src/viktrwlayer_propwin.c:3695 ../src/viktrwlayer_propwin.c:3696 +#: ../src/viktrwlayer_analysis.c:293 +#, c-format +msgid "No Data" +msgstr "Ingen data" + +#: ../src/viktrwlayer_propwin.c:960 ../src/viktrwlayer_propwin.c:1245 +#, c-format +msgid "%.1f kph" +msgstr "" + +#: ../src/viktrwlayer_propwin.c:963 ../src/viktrwlayer_propwin.c:1248 +#: ../src/viktrwlayer_analysis.c:352 +#, c-format +msgid "%.1f mph" +msgstr "" + +#: ../src/viktrwlayer_propwin.c:966 ../src/viktrwlayer_propwin.c:1251 +#, c-format +msgid "%.1f knots" +msgstr "" + +#: ../src/viktrwlayer_propwin.c:969 ../src/viktrwlayer_propwin.c:1254 +#, c-format +msgid "%.1f s/km" +msgstr "" + +#: ../src/viktrwlayer_propwin.c:972 ../src/viktrwlayer_propwin.c:1257 +#: ../src/viktrwlayer_analysis.c:389 ../src/viktrwlayer_analysis.c:392 +#, fuzzy, c-format +msgid "%.1f min/km" +msgstr "1 min" + +#: ../src/viktrwlayer_propwin.c:975 ../src/viktrwlayer_propwin.c:1260 +#, c-format +msgid "%.1f sec/mi" +msgstr "" + +#: ../src/viktrwlayer_propwin.c:978 ../src/viktrwlayer_propwin.c:1263 +#: ../src/viktrwlayer_analysis.c:409 ../src/viktrwlayer_analysis.c:412 +#, fuzzy, c-format +msgid "%.1f min/mi" +msgstr "1 min" + +#. VIK_UNITS_SPEED_METRES_PER_SECOND: +#: ../src/viktrwlayer_propwin.c:982 ../src/viktrwlayer_propwin.c:1267 +#, c-format +msgid "%.1f m/s" +msgstr "" + +#. Minutes +#: ../src/viktrwlayer_propwin.c:1411 +msgid "mins" +msgstr "" + +#. Hours +#: ../src/viktrwlayer_propwin.c:1418 +msgid "h" +msgstr "" + +#. Days +#: ../src/viktrwlayer_propwin.c:1424 +msgid "d" +msgstr "" + +#. Weeks +#: ../src/viktrwlayer_propwin.c:1429 +msgid "w" +msgstr "" + +#. 'Months' +#: ../src/viktrwlayer_propwin.c:1433 +msgid "M" +msgstr "" + +#: ../src/viktrwlayer_propwin.c:2051 ../src/viktrwlayer_analysis.c:303 +#, c-format +msgid "%.1f miles" +msgstr "" + +#: ../src/viktrwlayer_propwin.c:2054 ../src/viktrwlayer_analysis.c:306 +#, c-format +msgid "%.1f NM" +msgstr "" + +#. VIK_UNITS_DISTANCE_KILOMETRES +#: ../src/viktrwlayer_propwin.c:2057 ../src/viktrwlayer_analysis.c:310 +#, c-format +msgid "%.1f km" +msgstr "" + +#: ../src/viktrwlayer_propwin.c:3083 +msgid "Failed spliting track. Track unchanged" +msgstr "" + +#: ../src/viktrwlayer_propwin.c:3234 ../src/viktrwlayer_propwin.c:3744 +#, c-format +msgid "%s - Track Properties" +msgstr "" + +#: ../src/viktrwlayer_propwin.c:3239 +msgid "Split at _Marker" +msgstr "" + +#: ../src/viktrwlayer_propwin.c:3240 +msgid "Split _Segments" +msgstr "" + +#: ../src/viktrwlayer_propwin.c:3241 +msgid "_Reverse" +msgstr "" + +#: ../src/viktrwlayer_propwin.c:3242 +msgid "_Delete Dupl." +msgstr "" + +#: ../src/viktrwlayer_propwin.c:3269 +msgid "Comment:" +msgstr "Kommentar:" + +#: ../src/viktrwlayer_propwin.c:3270 +msgid "Description:" +msgstr "" + +#: ../src/viktrwlayer_propwin.c:3271 +#, fuzzy +msgid "Source:" +msgstr "Start:" + +#: ../src/viktrwlayer_propwin.c:3272 +#, fuzzy +msgid "Type:" +msgstr "Tid:" + +#: ../src/viktrwlayer_propwin.c:3273 +msgid "Color:" +msgstr "" + +#: ../src/viktrwlayer_propwin.c:3274 +msgid "Draw Name:" +msgstr "" + +#: ../src/viktrwlayer_propwin.c:3275 +msgid "Distance Labels:" +msgstr "" + +#: ../src/viktrwlayer_propwin.c:3278 +msgid "Track Length:" +msgstr "Spor længde:" + +#: ../src/viktrwlayer_propwin.c:3279 +msgid "Trackpoints:" +msgstr "" + +#: ../src/viktrwlayer_propwin.c:3280 +msgid "Segments:" +msgstr "" + +#: ../src/viktrwlayer_propwin.c:3281 +msgid "Duplicate Points:" +msgstr "" + +#: ../src/viktrwlayer_propwin.c:3282 +msgid "Max Speed:" +msgstr "Max hastighed:" + +#: ../src/viktrwlayer_propwin.c:3283 +msgid "Avg. Speed:" +msgstr "Gennemsnitlig hastighed:" + +#: ../src/viktrwlayer_propwin.c:3284 +msgid "Moving Avg. Speed:" +msgstr "" + +#: ../src/viktrwlayer_propwin.c:3285 +msgid "Avg. Dist. Between TPs:" +msgstr "" + +#: ../src/viktrwlayer_propwin.c:3286 +msgid "Elevation Range:" +msgstr "" + +#: ../src/viktrwlayer_propwin.c:3287 +msgid "Total Elevation Gain/Loss:" +msgstr "" + +#: ../src/viktrwlayer_propwin.c:3288 +msgid "Start:" +msgstr "Start:" + +#: ../src/viktrwlayer_propwin.c:3289 +msgid "End:" +msgstr "Slut:" + +#: ../src/viktrwlayer_propwin.c:3290 +msgid "Duration:" +msgstr "Varighed:" + +#: ../src/viktrwlayer_propwin.c:3320 +msgid "Centre" +msgstr "" + +#: ../src/viktrwlayer_propwin.c:3321 +msgid "Start only" +msgstr "" + +#: ../src/viktrwlayer_propwin.c:3322 +msgid "End only" +msgstr "" + +#: ../src/viktrwlayer_propwin.c:3323 +msgid "Start and End" +msgstr "" + +#: ../src/viktrwlayer_propwin.c:3324 +msgid "Centre, Start and End" +msgstr "" + +#: ../src/viktrwlayer_propwin.c:3336 +msgid "Maximum number of distance labels to be shown" +msgstr "" + +#: ../src/viktrwlayer_propwin.c:3340 +msgid "Properties" +msgstr "" + +#: ../src/viktrwlayer_propwin.c:3584 +#, c-format +msgid "%d minutes - %d minutes moving" +msgstr "" + +#: ../src/viktrwlayer_propwin.c:3596 +#, c-format +msgid "%s total - %s in segments" +msgstr "" + +#: ../src/viktrwlayer_propwin.c:3607 ../src/viktrwlayer_analysis.c:622 +msgid "Statistics" +msgstr "" + +#: ../src/viktrwlayer_propwin.c:3613 ../src/viktrwlayer_propwin.c:3680 +msgid "Show D_EM" +msgstr "" + +#: ../src/viktrwlayer_propwin.c:3615 ../src/viktrwlayer_propwin.c:3631 +#: ../src/viktrwlayer_propwin.c:3647 ../src/viktrwlayer_propwin.c:3697 +msgid "Show _GPS Speed" +msgstr "" + +#: ../src/viktrwlayer_propwin.c:3617 ../src/viktrwlayer_propwin.c:3633 +#: ../src/viktrwlayer_propwin.c:3665 ../src/viktrwlayer_propwin.c:3699 +msgid "Track Distance:" +msgstr "" + +#: ../src/viktrwlayer_propwin.c:3618 ../src/viktrwlayer_propwin.c:3684 +msgid "Track Height:" +msgstr "" + +#: ../src/viktrwlayer_propwin.c:3624 +msgid "Elevation-distance" +msgstr "" + +#: ../src/viktrwlayer_propwin.c:3634 +msgid "Track Gradient:" +msgstr "" + +#: ../src/viktrwlayer_propwin.c:3639 +msgid "Gradient-distance" +msgstr "" + +#: ../src/viktrwlayer_propwin.c:3649 ../src/viktrwlayer_propwin.c:3666 +#: ../src/viktrwlayer_propwin.c:3683 +msgid "Track Time:" +msgstr "" + +#: ../src/viktrwlayer_propwin.c:3650 ../src/viktrwlayer_propwin.c:3700 +msgid "Track Speed:" +msgstr "" + +#: ../src/viktrwlayer_propwin.c:3651 ../src/viktrwlayer_propwin.c:3667 +#: ../src/viktrwlayer_propwin.c:3685 +msgid "Time/Date:" +msgstr "" + +#: ../src/viktrwlayer_propwin.c:3655 +msgid "Speed-time" +msgstr "Hastighed-tid" + +#: ../src/viktrwlayer_propwin.c:3663 ../src/viktrwlayer_propwin.c:3679 +msgid "Show S_peed" +msgstr "" + +#: ../src/viktrwlayer_propwin.c:3671 +msgid "Distance-time" +msgstr "" + +#: ../src/viktrwlayer_propwin.c:3690 +msgid "Elevation-time" +msgstr "" + +#: ../src/viktrwlayer_propwin.c:3705 +msgid "Speed-distance" +msgstr "" + +#: ../src/viktrwlayer_tpwin.c:190 ../src/viktrwlayer_wpwin.c:66 +msgid "Date/Time Edit" +msgstr "" + +#: ../src/viktrwlayer_tpwin.c:242 +msgid "Name:" +msgstr "" + +#: ../src/viktrwlayer_tpwin.c:243 +msgid "Latitude:" +msgstr "" + +#: ../src/viktrwlayer_tpwin.c:244 +msgid "Longitude:" +msgstr "" + +#: ../src/viktrwlayer_tpwin.c:245 +msgid "Altitude:" +msgstr "" + +#: ../src/viktrwlayer_tpwin.c:246 +msgid "Course:" +msgstr "" + +#: ../src/viktrwlayer_tpwin.c:247 +msgid "Timestamp:" +msgstr "Tidsstempel:" + +#: ../src/viktrwlayer_tpwin.c:248 +msgid "Time:" +msgstr "Tid:" + +#: ../src/viktrwlayer_tpwin.c:249 +msgid "Distance Difference:" +msgstr "Afstandsforskel:" + +#: ../src/viktrwlayer_tpwin.c:250 +msgid "Time Difference:" +msgstr "Tidsforskel:" + +#: ../src/viktrwlayer_tpwin.c:251 +msgid "\"Speed\" Between:" +msgstr "\"Hastighed\" mellem:" + +#: ../src/viktrwlayer_tpwin.c:252 +msgid "Speed:" +msgstr "" + +#: ../src/viktrwlayer_tpwin.c:253 +msgid "VDOP:" +msgstr "" + +#: ../src/viktrwlayer_tpwin.c:254 +msgid "HDOP:" +msgstr "" + +#: ../src/viktrwlayer_tpwin.c:255 +msgid "PDOP:" +msgstr "" + +#: ../src/viktrwlayer_tpwin.c:256 +msgid "SAT/FIX:" +msgstr "" + +#: ../src/viktrwlayer_tpwin.c:263 ../src/viktrwlayer_tpwin.c:408 +#: ../src/viktrwlayer_tpwin.c:622 +msgid "Trackpoint" +msgstr "" + +#: ../src/viktrwlayer_tpwin.c:266 +msgid "_Insert After" +msgstr "" + +#: ../src/viktrwlayer_tpwin.c:268 +msgid "Split Here" +msgstr "Opdel her" + +#: ../src/viktrwlayer_tracklist.c:262 ../src/viktrwlayer_waypointlist.c:306 +msgid "_Copy Data" +msgstr "" + +#. +#. item = gtk_image_menu_item_new_with_mnemonic ( _("_Select") ); +#. gtk_image_menu_item_set_image ( (GtkImageMenuItem*)item, gtk_image_new_from_stock (GTK_STOCK_FIND, GTK_ICON_SIZE_MENU) ); +#. g_signal_connect_swapped ( G_OBJECT(item), "activate", G_CALLBACK(trw_layer_track_select), values ); +#. gtk_menu_shell_append (GTK_MENU_SHELL (menu), item); +#. gtk_widget_show ( item ); +#. +#. ATM view auto selects, so don't bother with separate select menu entry +#. +#. item = gtk_image_menu_item_new_with_mnemonic ( _("_Select") ); +#. gtk_image_menu_item_set_image ( (GtkImageMenuItem*)item, gtk_image_new_from_stock (GTK_STOCK_FIND, GTK_ICON_SIZE_MENU) ); +#. g_signal_connect_swapped ( G_OBJECT(item), "activate", G_CALLBACK(trw_layer_waypoint_select), values ); +#. gtk_menu_shell_append (GTK_MENU_SHELL (menu), item); +#. gtk_widget_show ( item ); +#. +#. AUTO SELECT NOT TRUE YET... +#. ATM view auto selects, so don't bother with separate select menu entry +#: ../src/viktrwlayer_tracklist.c:290 ../src/viktrwlayer_waypointlist.c:341 +#: ../src/vikwindow.c:4816 +msgid "_View" +msgstr "_Vis" + +#. Insert column for the layer name when viewing multi layers +#: ../src/viktrwlayer_tracklist.c:613 ../src/viktrwlayer_waypointlist.c:609 +msgid "Layer" +msgstr "" + +#: ../src/viktrwlayer_tracklist.c:627 ../src/viktrwlayer_waypointlist.c:624 +msgid "Date" +msgstr "" + +#: ../src/viktrwlayer_tracklist.c:631 ../src/viktrwlayer_waypointlist.c:628 +msgid "Visible" +msgstr "" + +#: ../src/viktrwlayer_tracklist.c:639 +msgid "" +"Distance\n" +"(miles)" +msgstr "" + +#: ../src/viktrwlayer_tracklist.c:642 +msgid "" +"Distance\n" +"(NM)" +msgstr "" + +#: ../src/viktrwlayer_tracklist.c:645 +msgid "" +"Distance\n" +"(km)" +msgstr "" + +#: ../src/viktrwlayer_tracklist.c:651 +msgid "" +"Length\n" +"(minutes)" +msgstr "" + +#: ../src/viktrwlayer_tracklist.c:660 ../src/vikutils.c:93 +msgid "sec/mi" +msgstr "" + +#: ../src/viktrwlayer_tracklist.c:666 +#, c-format +msgid "" +"Av. Speed\n" +"(%s)" +msgstr "" + +#. Apply own formatting of the data +#: ../src/viktrwlayer_tracklist.c:671 +#, c-format +msgid "" +"Max Speed\n" +"(%s)" +msgstr "" + +#: ../src/viktrwlayer_tracklist.c:679 ../src/viktrwlayer_waypointlist.c:637 +msgid "" +"Max Height\n" +"(Feet)" +msgstr "" + +#: ../src/viktrwlayer_tracklist.c:681 ../src/viktrwlayer_waypointlist.c:639 +msgid "" +"Max Height\n" +"(Metres)" +msgstr "" + +#: ../src/viktrwlayer_waypointlist.c:312 +msgid "Copy Data (with _positions)" +msgstr "" + +#: ../src/viktrwlayer_waypointlist.c:633 +msgid "Comment" +msgstr "" + +#: ../src/viktrwlayer_waypointlist.c:643 +msgid "Symbol" +msgstr "" + +#: ../src/viktrwlayer_wpwin.c:93 ../src/viktrwlayer_wpwin.c:302 +msgid "True" +msgstr "" + +#: ../src/viktrwlayer_wpwin.c:122 +msgid "Waypoint Properties" +msgstr "" + +#: ../src/viktrwlayer_wpwin.c:164 +msgid "Name:" +msgstr "Navn:" + +#: ../src/viktrwlayer_wpwin.c:181 +msgid "Altitude:" +msgstr "Højde:" + +#: ../src/viktrwlayer_wpwin.c:186 ../src/viktrwlayer_wpwin.c:188 +msgid "Comment:" +msgstr "Kommentar:" + +#: ../src/viktrwlayer_wpwin.c:202 +#, fuzzy +msgid "Source:" +msgstr "Download kilde:" + +#: ../src/viktrwlayer_wpwin.c:212 +msgid "Image:" +msgstr "Billede:" + +#: ../src/viktrwlayer_wpwin.c:217 +msgid "Symbol:" +msgstr "Symbol:" + +#: ../src/viktrwlayer_wpwin.c:226 +msgid "(none)" +msgstr "(ingen)" + +#. Geotag Info [readonly] +#: ../src/viktrwlayer_wpwin.c:272 +msgid "Has Geotag" +msgstr "" + +#: ../src/viktrwlayer_wpwin.c:279 +msgid "Consistent Position" +msgstr "" + +#. ATM the direction value box is always shown, even when there is no information. +#. It would be nice to be able to hide it until the 'Add' has been performed, +#. however I've not been able to achieve this. +#. Thus simply sensistizing it instead. +#: ../src/viktrwlayer_wpwin.c:292 +#, fuzzy +msgid "Image Direction:" +msgstr "Billedindstillinger" + +#: ../src/viktrwlayer_wpwin.c:300 +msgid "Magnetic" +msgstr "" + +#: ../src/viktrwlayer_wpwin.c:320 +msgid "Time:" +msgstr "" + +#. TODO: other checks (isalpha or whatever ) +#: ../src/viktrwlayer_wpwin.c:386 +msgid "Please enter a name for the waypoint." +msgstr "" + +#: ../src/viktrwlayer_geotag.c:320 ../src/viktrwlayer_geotag.c:460 +#, c-format +msgid "Failed updating EXIF on %s" +msgstr "" + +#: ../src/viktrwlayer_geotag.c:562 +#, c-format +msgid "Geotagging %d Images..." +msgstr "" + +#: ../src/viktrwlayer_geotag.c:630 +msgid "Geotag Images" +msgstr "" + +#: ../src/viktrwlayer_geotag.c:640 +msgid "Images" +msgstr "" + +#: ../src/viktrwlayer_geotag.c:645 +msgid "Overwrite Existing Waypoints:" +msgstr "" + +#: ../src/viktrwlayer_geotag.c:648 +msgid "Overwrite Existing GPS Information:" +msgstr "" + +#: ../src/viktrwlayer_geotag.c:650 +msgid "Keep File Modification Timestamp:" +msgstr "" + +#: ../src/viktrwlayer_geotag.c:684 +msgid "Create Waypoints:" +msgstr "" + +#: ../src/viktrwlayer_geotag.c:693 +msgid "Write EXIF:" +msgstr "" + +#: ../src/viktrwlayer_geotag.c:705 +msgid "Automatic Image Direction:" +msgstr "" + +#: ../src/viktrwlayer_geotag.c:707 +msgid "Set image direction based on a heading derived from the track" +msgstr "" + +#: ../src/viktrwlayer_geotag.c:710 +msgid "Interpolate Between Track Segments:" +msgstr "" + +#: ../src/viktrwlayer_geotag.c:715 +msgid "Image Time Offset (Seconds):" +msgstr "" + +#: ../src/viktrwlayer_geotag.c:718 +msgid "" +"The number of seconds to ADD to the photos time to make it match the GPS " +"data. Calculate this with (GPS - Photo). Can be negative or positive. Useful " +"to adjust times when a camera's timestamp was incorrect." +msgstr "" + +#: ../src/viktrwlayer_geotag.c:721 +msgid "Image Timezone:" +msgstr "" + +#: ../src/viktrwlayer_geotag.c:724 +msgid "" +"The timezone that was used when the images were created. For example, if a " +"camera is set to AWST or +8:00 hours. Enter +8:00 here so that the correct " +"adjustment to the images' time can be made. GPS data is always in UTC." +msgstr "" + +#: ../src/viktrwlayer_geotag.c:728 +#, c-format +msgid "Using waypoint: %s" +msgstr "" + +#: ../src/viktrwlayer_geotag.c:742 +#, c-format +msgid "Using track: %s" +msgstr "" + +#: ../src/viktrwlayer_geotag.c:744 +#, c-format +msgid "Using all tracks in: %s" +msgstr "" + +#: ../src/viktrwlayer_analysis.c:214 +msgid "Number of Tracks" +msgstr "" + +#: ../src/viktrwlayer_analysis.c:215 +msgid "Date Range" +msgstr "" + +#: ../src/viktrwlayer_analysis.c:216 +msgid "Total Length" +msgstr "" + +#: ../src/viktrwlayer_analysis.c:217 +msgid "Average Length" +msgstr "" + +#: ../src/viktrwlayer_analysis.c:218 +msgid "Eddington number" +msgstr "" + +#. No.4: Extended display only +#: ../src/viktrwlayer_analysis.c:219 +msgid "Max Speed" +msgstr "" + +#: ../src/viktrwlayer_analysis.c:220 +msgid "Avg. Speed" +msgstr "" + +#: ../src/viktrwlayer_analysis.c:221 +msgid "Minimum Altitude" +msgstr "" + +#: ../src/viktrwlayer_analysis.c:222 +msgid "Maximum Altitude" +msgstr "" + +#: ../src/viktrwlayer_analysis.c:223 +msgid "Total Elevation Gain/Loss" +msgstr "" + +#: ../src/viktrwlayer_analysis.c:224 +msgid "Avg. Elevation Gain/Loss" +msgstr "" + +#: ../src/viktrwlayer_analysis.c:225 +msgid "Total Duration" +msgstr "" + +#: ../src/viktrwlayer_analysis.c:226 +msgid "Avg. Duration" +msgstr "" + +#: ../src/viktrwlayer_analysis.c:317 +#, c-format +msgid "%.2f miles" +msgstr "" + +#: ../src/viktrwlayer_analysis.c:320 +#, c-format +msgid "%.2f NM" +msgstr "" + +#. VIK_UNITS_DISTANCE_KILOMETRES +#: ../src/viktrwlayer_analysis.c:324 +#, c-format +msgid "%.2f km" +msgstr "" + +#: ../src/viktrwlayer_analysis.c:361 +#, c-format +msgid "%.2f m/s" +msgstr "" + +#: ../src/viktrwlayer_analysis.c:370 ../src/viktrwlayer_analysis.c:373 +#, c-format +msgid "%.2f knots" +msgstr "" + +#: ../src/viktrwlayer_analysis.c:379 ../src/viktrwlayer_analysis.c:382 +#, c-format +msgid "%d s/km" +msgstr "" + +#: ../src/viktrwlayer_analysis.c:399 ../src/viktrwlayer_analysis.c:402 +#, c-format +msgid "%d sec/mi" +msgstr "" + +#: ../src/viktrwlayer_analysis.c:420 ../src/viktrwlayer_analysis.c:423 +#, c-format +msgid "%.2f km/h" +msgstr "" + +#: ../src/viktrwlayer_analysis.c:434 ../src/viktrwlayer_analysis.c:440 +#, c-format +msgid "%d feet" +msgstr "" + +#: ../src/viktrwlayer_analysis.c:445 ../src/viktrwlayer_analysis.c:447 +#, c-format +msgid "%d feet / %d feet" +msgstr "" + +#: ../src/viktrwlayer_analysis.c:452 ../src/viktrwlayer_analysis.c:458 +#, c-format +msgid "%d m" +msgstr "" + +#: ../src/viktrwlayer_analysis.c:463 ../src/viktrwlayer_analysis.c:465 +#, c-format +msgid "%d m / %d m" +msgstr "" + +#: ../src/viktrwlayer_analysis.c:477 +#, c-format +msgid "%d:%02d:%02d days:hrs:mins" +msgstr "" + +#: ../src/viktrwlayer_analysis.c:484 +#, c-format +msgid "%d:%02d hrs:mins" +msgstr "" + +#: ../src/viktrwlayer_analysis.c:658 +msgid "Include Invisible Items" +msgstr "" + +#: ../src/vikstatus.c:129 +msgid "Current number of background tasks. Click to see the background jobs." +msgstr "" + +#: ../src/vikstatus.c:134 +msgid "Current zoom level. Click to select a new one." +msgstr "" + +#: ../src/vikstatus.c:141 +msgid "Left click to clear the message. Right click to copy the message." +msgstr "" + +#: ../src/vikutils.c:108 +msgid "GPSD" +msgstr "" + +#. GPS Preamble +#: ../src/vikutils.c:109 +msgid "Trkpt" +msgstr "" + +#: ../src/vikutils.c:160 +#, c-format +msgid "%sSpeed%s %.1f%s" +msgstr "" + +#. Go for 2dp as expect low values for vertical speeds +#: ../src/vikutils.c:214 +#, c-format +msgid "%sClimb%s %.2f%s" +msgstr "" + +#: ../src/vikutils.c:223 +#, c-format +msgid "%sAlt %dfeet" +msgstr "" + +#. VIK_UNITS_HEIGHT_METRES: +#: ../src/vikutils.c:227 +#, c-format +msgid "%sAlt %dm" +msgstr "" + +#: ../src/vikutils.c:235 +#, c-format +msgid "%sCourse %03d°" +msgstr "" + +#: ../src/vikutils.c:249 +msgid "yards" +msgstr "" + +#. VIK_UNITS_DISTANCE_KILOMETRES: +#: ../src/vikutils.c:253 +msgid "m" +msgstr "" + +#: ../src/vikutils.c:257 +#, c-format +msgid "%sDistance diff %d%s" +msgstr "" + +#: ../src/vikutils.c:272 +#, c-format +msgid "%sTime %s" +msgstr "" + +#: ../src/vikutils.c:281 +#, c-format +msgid "%sTime diff %lds" +msgstr "" + +#: ../src/vikutils.c:287 +#, c-format +msgid "%sNo. of Sats %d" +msgstr "" + +#: ../src/vikutils.c:312 +#, c-format +msgid "%sTo End %.2f%s" +msgstr "" + +#: ../src/vikutils.c:339 +#, c-format +msgid "%sDistance along %.2f%s" +msgstr "" + +#: ../src/vikutils.c:359 +#, c-format +msgid "%sTrack: %s" +msgstr "" + +#: ../src/vikutils.c:396 +#, c-format +msgid "" +"There is a newer version of Viking available: %s\n" +"\n" +"Do you wish to go to Viking's website now?" +msgstr "" + +#: ../src/vikutils.c:526 +msgid "" +"This appears to be Viking's very first run.\n" +"\n" +"Do you wish to enable automatic internet features?\n" +"\n" +"Individual settings can be controlled in the Preferences." +msgstr "" + +#: ../src/vikwaypoint.c:37 +msgid "Waypoint" +msgstr "" + +#: ../src/vikwebtool_datasource.c:352 +msgid "Search Term" +msgstr "" + +#. TODO get rid of this as this is unnecessary duplication... +#: ../src/vikwindow.c:258 +msgid "Pan" +msgstr "" + +#: ../src/vikwindow.c:258 +msgid "Zoom" +msgstr "Zoom" + +#: ../src/vikwindow.c:258 +msgid "Ruler" +msgstr "Lineal" + +#: ../src/vikwindow.c:258 +msgid "Select" +msgstr "" + +#: ../src/vikwindow.c:368 +msgid "This is Viking " +msgstr "" + +#: ../src/vikwindow.c:457 +msgid "Location lookup aborted" +msgstr "" + +#: ../src/vikwindow.c:477 +#, c-format +msgid "Location found: %s" +msgstr "" + +#: ../src/vikwindow.c:486 +msgid "Unable to determine location" +msgstr "" + +#: ../src/vikwindow.c:495 +msgid "Determining location" +msgstr "" + +#: ../src/vikwindow.c:525 +#, c-format +msgid "Location found via geoclue" +msgstr "" + +#: ../src/vikwindow.c:546 +msgid "Default Map" +msgstr "" + +#: ../src/vikwindow.c:557 ../src/vikwindow.c:3938 +msgid "Trying to determine location..." +msgstr "" + +#. Create tooltip +#: ../src/vikwindow.c:723 +msgid "Select zoom level" +msgstr "" + +#: ../src/vikwindow.c:1176 +#, c-format +msgid "" +"Do you want to save the changes you made to the document \"%s\"?\n" +"\n" +"Your changes will be lost if you don't save them." +msgstr "" + +#: ../src/vikwindow.c:1180 +msgid "Don't Save" +msgstr "Gem ikke" + +#: ../src/vikwindow.c:1268 +msgid "mpp" +msgstr "" + +#: ../src/vikwindow.c:1268 +msgid "pixelfact" +msgstr "" + +#: ../src/vikwindow.c:1467 +#, c-format +msgid "%s %s %dm" +msgstr "" + +#: ../src/vikwindow.c:1469 +#, c-format +msgid "%s %s %dft" +msgstr "" + +#: ../src/vikwindow.c:1472 +#, c-format +msgid "%s %s" +msgstr "" + +#: ../src/vikwindow.c:1929 +msgid "_Ruler" +msgstr "" + +#: ../src/vikwindow.c:1929 +msgid "Ruler Tool" +msgstr "" + +#: ../src/vikwindow.c:2204 ../src/vikwindow.c:4818 +msgid "_Zoom" +msgstr "_Zoom" + +#: ../src/vikwindow.c:2204 +msgid "Zoom Tool" +msgstr "Zoomværktøj" + +#: ../src/vikwindow.c:2271 ../src/vikwindow.c:4819 +msgid "_Pan" +msgstr "" + +#: ../src/vikwindow.c:2271 +msgid "Pan Tool" +msgstr "" + +#: ../src/vikwindow.c:2425 +msgid "_Select" +msgstr "" + +#: ../src/vikwindow.c:2425 +msgid "Select Tool" +msgstr "" + +#: ../src/vikwindow.c:2615 +msgid "You must select a layer to show its properties." +msgstr "" + +#. No error to show, so unlikely this will get called +#: ../src/vikwindow.c:2629 +msgid "The help system is not available." +msgstr "" + +#. Main error path +#: ../src/vikwindow.c:2632 +#, c-format +msgid "" +"Help is not available because: %s.\n" +"Ensure a Mime Type ghelp handler program is installed (e.g. yelp)." +msgstr "" + +#: ../src/vikwindow.c:2865 +msgid "You must select a layer to delete." +msgstr "" + +#: ../src/vikwindow.c:3171 +msgid "Untitled" +msgstr "Uden navn" + +#: ../src/vikwindow.c:3300 +#, c-format +msgid "Unable to add '%s' to the list of recently used documents" +msgstr "" + +#: ../src/vikwindow.c:3391 +msgid "The file you requested could not be opened." +msgstr "Den fil du anmodede om kunne ikke åbnes." + +#: ../src/vikwindow.c:3394 +msgid "" +"GPSBabel is required to load files of this type or GPSBabel encountered " +"problems." +msgstr "" + +#: ../src/vikwindow.c:3397 +#, c-format +msgid "Unable to load malformed GPX file %s" +msgstr "" + +#: ../src/vikwindow.c:3400 +#, c-format +msgid "Unsupported file type for %s" +msgstr "" + +#. Since we can process .vik files with issues just show a warning in the status bar +#. Not that a user can do much about it... or tells them what this issue is yet... +#: ../src/vikwindow.c:3406 +#, c-format +msgid "WARNING: issues encountered loading %s" +msgstr "" + +#: ../src/vikwindow.c:3489 +msgid "Please select a GPS data file to open. " +msgstr "Vælg venligst en GPS data fil. " + +#: ../src/vikwindow.c:3508 +msgid "Google Earth" +msgstr "" + +#: ../src/vikwindow.c:3523 ../src/vikwindow.c:3646 ../src/viking.desktop.in.h:1 +msgid "Viking" +msgstr "" + +#: ../src/vikwindow.c:3594 ../src/vikwindow.c:4632 +msgid "Open File" +msgstr "" + +#: ../src/vikwindow.c:3630 +msgid "Save as Viking File." +msgstr "Gem som Viking fil." + +#: ../src/vikwindow.c:3757 +#, c-format +msgid "Exporting to file: %s" +msgstr "" + +#. Confirm what happened. +#: ../src/vikwindow.c:3774 +#, c-format +msgid "Exported files: %d" +msgstr "" + +#: ../src/vikwindow.c:3786 +msgid "Nothing to Export!" +msgstr "" + +#: ../src/vikwindow.c:3790 +msgid "Export to directory" +msgstr "" + +#: ../src/vikwindow.c:3809 +msgid "Could not convert all files" +msgstr "" + +#: ../src/vikwindow.c:3851 +msgid "File not accessible" +msgstr "" + +#: ../src/vikwindow.c:3854 +msgid "No Viking File" +msgstr "" + +#: ../src/vikwindow.c:3998 +msgid "This layer has no configurable properties." +msgstr "" + +#: ../src/vikwindow.c:4080 +msgid "Are you sure you wish to delete all layers?" +msgstr "er du sikker på at du vil slette alle lag?" + +#. Try harder... +#: ../src/vikwindow.c:4126 ../src/vikwindow.c:4132 +msgid "Generating image file..." +msgstr "" + +#: ../src/vikwindow.c:4154 +msgid "" +"Failed to generate internal image.\n" +"\n" +"Try creating a smaller image." +msgstr "" + +#: ../src/vikwindow.c:4175 +msgid "Image file generated." +msgstr "" + +#: ../src/vikwindow.c:4177 +msgid "Failed to generate image file." +msgstr "" + +#: ../src/vikwindow.c:4246 +#, c-format +msgid "Unable to write to file %s: %s" +msgstr "" + +#: ../src/vikwindow.c:4284 +msgid "" +"Viewable region outside allowable pixel size bounds for image. Clipping " +"width/height values." +msgstr "" + +#: ../src/vikwindow.c:4309 +#, c-format +msgid "Total area: %ldm x %ldm (%.3f sq. km)" +msgstr "" + +#: ../src/vikwindow.c:4312 +#, c-format +msgid "Total area: %ldm x %ldm (%.3f sq. miles)" +msgstr "" + +#: ../src/vikwindow.c:4315 +#, c-format +msgid "Total area: %ldm x %ldm (%.3f sq. NM)" +msgstr "" + +#. Single file +#: ../src/vikwindow.c:4343 +msgid "Save Image" +msgstr "Gem billede" + +#: ../src/vikwindow.c:4364 ../src/vikwindow.c:4641 +msgid "KMZ" +msgstr "" + +#: ../src/vikwindow.c:4417 +msgid "You must be in UTM mode to use this feature" +msgstr "Du skal være i UTM mode for at bruge denne facilitet" + +#: ../src/vikwindow.c:4421 +msgid "Choose a directory to hold images" +msgstr "" + +#. todo: default for answers inside VikWindow or static (thruout instance) +#: ../src/vikwindow.c:4441 +msgid "Save to Image File" +msgstr "Gem til billedfil" + +#: ../src/vikwindow.c:4457 +msgid "Width (pixels):" +msgstr "Bredde (pixels):" + +#: ../src/vikwindow.c:4459 +msgid "Height (pixels):" +msgstr "Højde (pixels):" + +#: ../src/vikwindow.c:4462 +msgid "" +"WARNING: USING LARGE IMAGES OVER 10000x10000\n" +"MAY CRASH THE PROGRAM!" +msgstr "" + +#: ../src/vikwindow.c:4464 +msgid "Zoom (meters per pixel):" +msgstr "Zoom (meter pr pixel):" + +#: ../src/vikwindow.c:4480 +msgid "Area in current viewable window" +msgstr "" + +#: ../src/vikwindow.c:4490 +msgid "Save as PNG" +msgstr "Gem som PNG" + +#: ../src/vikwindow.c:4491 +msgid "Save as JPEG" +msgstr "Gem som JPEG" + +#: ../src/vikwindow.c:4520 +msgid "East-west image tiles:" +msgstr "" + +#: ../src/vikwindow.c:4522 +msgid "North-south image tiles:" +msgstr "" + +#: ../src/vikwindow.c:4619 +msgid "This feature is not available in UTM mode" +msgstr "" + +#: ../src/vikwindow.c:4658 +#, c-format +msgid "Unable to import %s." +msgstr "" + +#: ../src/vikwindow.c:4749 +msgid "Choose a background color" +msgstr "Vælg en baggrundsfarve" + +#: ../src/vikwindow.c:4765 +msgid "Choose a track highlight color" +msgstr "" + +#: ../src/vikwindow.c:4814 +msgid "_File" +msgstr "_Fil" + +#: ../src/vikwindow.c:4815 +msgid "_Edit" +msgstr "_Redigér" + +#: ../src/vikwindow.c:4817 +msgid "_Show" +msgstr "" + +#: ../src/vikwindow.c:4820 +msgid "_Layers" +msgstr "_Lag" + +#: ../src/vikwindow.c:4821 +msgid "_Tools" +msgstr "Værk_tøjer" + +#: ../src/vikwindow.c:4822 +msgid "_Webtools" +msgstr "" + +#: ../src/vikwindow.c:4823 ../src/vikwindow.c:4893 +msgid "_Help" +msgstr "_Hjælp" + +#: ../src/vikwindow.c:4825 +msgid "New file" +msgstr "Ny fil" + +#: ../src/vikwindow.c:4826 +msgid "_Open..." +msgstr "_Åbn..." + +#: ../src/vikwindow.c:4826 +msgid "Open a file" +msgstr "Åbn en fil" + +#: ../src/vikwindow.c:4827 +msgid "Open _Recent File" +msgstr "" + +#: ../src/vikwindow.c:4828 +msgid "Append _File..." +msgstr "" + +#: ../src/vikwindow.c:4828 +msgid "Append data from a different file" +msgstr "" + +#: ../src/vikwindow.c:4829 +msgid "Open GPX as External _Layer..." +msgstr "" + +#: ../src/vikwindow.c:4829 +msgid "Open a GPX file as an external layer" +msgstr "" + +#: ../src/vikwindow.c:4830 +msgid "_Export All" +msgstr "" + +#: ../src/vikwindow.c:4830 +msgid "Export All TrackWaypoint Layers" +msgstr "" + +#: ../src/vikwindow.c:4831 +msgid "_GPX..." +msgstr "" + +#: ../src/vikwindow.c:4831 +msgid "Export as GPX" +msgstr "" + +#: ../src/vikwindow.c:4832 +msgid "A_cquire" +msgstr "" + +#: ../src/vikwindow.c:4833 +msgid "_Directions..." +msgstr "" + +#: ../src/vikwindow.c:4833 +msgid "Get driving directions" +msgstr "" + +#: ../src/vikwindow.c:4835 +msgid "_OSM Traces..." +msgstr "" + +#: ../src/vikwindow.c:4835 +msgid "Get traces from OpenStreetMap" +msgstr "" + +#: ../src/vikwindow.c:4836 +msgid "_My OSM Traces..." +msgstr "" + +#: ../src/vikwindow.c:4836 +msgid "Get Your Own Traces from OpenStreetMap" +msgstr "" + +#: ../src/vikwindow.c:4839 +msgid "Geo_caches..." +msgstr "Geo_caches..." + +#: ../src/vikwindow.c:4839 +msgid "Get Geocaches from geocaching.com" +msgstr "Få Geocaches fra geocaching.com" + +#: ../src/vikwindow.c:4842 +msgid "Create waypoints from geotagged images" +msgstr "" + +#: ../src/vikwindow.c:4844 +msgid "Get a file from a URL" +msgstr "" + +#: ../src/vikwindow.c:4846 +msgid "Create waypoints from Wikipedia items in the current view" +msgstr "" + +#: ../src/vikwindow.c:4848 +msgid "_Save" +msgstr "_Gem" + +#: ../src/vikwindow.c:4848 +msgid "Save the file" +msgstr "Gem filen" + +#: ../src/vikwindow.c:4849 +msgid "Save _As..." +msgstr "Gem _som..." + +#: ../src/vikwindow.c:4849 +msgid "Save the file under different name" +msgstr "Gem filen under et andet navn" + +#: ../src/vikwindow.c:4850 +msgid "Properties..." +msgstr "" + +#: ../src/vikwindow.c:4850 +msgid "File Properties" +msgstr "" + +#: ../src/vikwindow.c:4852 +msgid "Import KMZ _Map File..." +msgstr "" + +#: ../src/vikwindow.c:4852 +msgid "Import a KMZ file" +msgstr "" + +#: ../src/vikwindow.c:4853 +msgid "Generate _KMZ Map File..." +msgstr "" + +#: ../src/vikwindow.c:4853 +msgid "Generate a KMZ file with an overlay of the current view" +msgstr "" + +#: ../src/vikwindow.c:4855 +msgid "_Generate Image File..." +msgstr "" + +#: ../src/vikwindow.c:4855 +msgid "Save a snapshot of the workspace into a file" +msgstr "" + +#: ../src/vikwindow.c:4856 +msgid "Generate _Directory of Images..." +msgstr "" + +#: ../src/vikwindow.c:4856 +msgid "Generate _Directory of Images" +msgstr "" + +#: ../src/vikwindow.c:4857 +msgid "_Print..." +msgstr "_Udskriv..." + +#: ../src/vikwindow.c:4857 +msgid "Print maps" +msgstr "Udskriv kort" + +#: ../src/vikwindow.c:4858 +msgid "E_xit" +msgstr "A_fslut" + +#: ../src/vikwindow.c:4858 +msgid "Exit the program" +msgstr "Afslut programmet" + +#: ../src/vikwindow.c:4859 +msgid "Save and Exit" +msgstr "Gem og afslut" + +#: ../src/vikwindow.c:4859 +msgid "Save and Exit the program" +msgstr "Gem og afslut programmet" + +#: ../src/vikwindow.c:4861 +msgid "Go to the Pre_vious Location" +msgstr "" + +#: ../src/vikwindow.c:4861 +msgid "Go to the previous location" +msgstr "" + +#: ../src/vikwindow.c:4862 +msgid "Go to the _Next Location" +msgstr "" + +#: ../src/vikwindow.c:4862 +msgid "Go to the next location" +msgstr "" + +#: ../src/vikwindow.c:4863 +msgid "Go to the _Default Location" +msgstr "" + +#: ../src/vikwindow.c:4863 +msgid "Go to the default location" +msgstr "" + +#: ../src/vikwindow.c:4864 +msgid "Go to the _Auto Location" +msgstr "" + +#: ../src/vikwindow.c:4864 +msgid "Go to a location via automatic lookup" +msgstr "" + +#: ../src/vikwindow.c:4865 +msgid "Go to _Location..." +msgstr "" + +#: ../src/vikwindow.c:4865 +msgid "Go to address/place using text search" +msgstr "" + +#: ../src/vikwindow.c:4866 +msgid "_Go to Lat/Lon..." +msgstr "" + +#: ../src/vikwindow.c:4866 +msgid "Go to arbitrary lat/lon coordinate" +msgstr "" + +#: ../src/vikwindow.c:4867 +msgid "Go to UTM..." +msgstr "Gå til UTM..." + +#: ../src/vikwindow.c:4867 +msgid "Go to arbitrary UTM coordinate" +msgstr "" + +#: ../src/vikwindow.c:4868 +#, fuzzy +msgid "Go to Today" +msgstr "Gå til UTM..." + +#: ../src/vikwindow.c:4868 +msgid "Go to today on the calendar" +msgstr "" + +#: ../src/vikwindow.c:4869 +msgid "_Refresh" +msgstr "" + +#: ../src/vikwindow.c:4869 +msgid "Refresh any maps displayed" +msgstr "" + +#: ../src/vikwindow.c:4870 +msgid "Set _Highlight Color..." +msgstr "" + +#: ../src/vikwindow.c:4870 +msgid "Set Highlight Color" +msgstr "" + +#: ../src/vikwindow.c:4871 +msgid "Set Bac_kground Color..." +msgstr "" + +#: ../src/vikwindow.c:4871 +msgid "Set Background Color" +msgstr "" + +#: ../src/vikwindow.c:4872 +msgid "Zoom _In" +msgstr "Zoom _ind" + +#: ../src/vikwindow.c:4872 +msgid "Zoom In" +msgstr "" + +#: ../src/vikwindow.c:4873 +msgid "Zoom _Out" +msgstr "Zoom _ud" + +#: ../src/vikwindow.c:4873 +msgid "Zoom Out" +msgstr "" + +#: ../src/vikwindow.c:4874 +msgid "Zoom _To..." +msgstr "Zoom _til..." + +#: ../src/vikwindow.c:4874 +msgid "Zoom To" +msgstr "" + +#: ../src/vikwindow.c:4875 +msgid "Pan _North" +msgstr "" + +#: ../src/vikwindow.c:4876 +msgid "Pan _East" +msgstr "" + +#: ../src/vikwindow.c:4877 +msgid "Pan _South" +msgstr "" + +#: ../src/vikwindow.c:4878 +msgid "Pan _West" +msgstr "" + +#: ../src/vikwindow.c:4879 +msgid "Background _Jobs" +msgstr "Baggrunds_job" + +#: ../src/vikwindow.c:4879 +msgid "Background Jobs" +msgstr "" + +#: ../src/vikwindow.c:4881 +msgid "Cu_t" +msgstr "K_lip" + +#: ../src/vikwindow.c:4885 +msgid "Delete All" +msgstr "Slet alle" + +#: ../src/vikwindow.c:4886 +msgid "Copy Centre _Location" +msgstr "" + +#: ../src/vikwindow.c:4887 +msgid "_Flush Map Cache" +msgstr "" + +#: ../src/vikwindow.c:4888 +msgid "_Set the Default Location" +msgstr "" + +#: ../src/vikwindow.c:4888 +msgid "Set the Default Location to the current position" +msgstr "" + +#: ../src/vikwindow.c:4889 +msgid "_Preferences" +msgstr "" + +#: ../src/vikwindow.c:4889 +msgid "Program Preferences" +msgstr "" + +#: ../src/vikwindow.c:4890 +msgid "_Layer Defaults" +msgstr "" + +#: ../src/vikwindow.c:4891 +msgid "_Properties" +msgstr "_Egenskaber" + +#: ../src/vikwindow.c:4893 +msgid "Help" +msgstr "" + +#: ../src/vikwindow.c:4894 +msgid "_About" +msgstr "_Om" + +#: ../src/vikwindow.c:4894 +msgid "About" +msgstr "" + +#: ../src/vikwindow.c:4903 +msgid "_KML..." +msgstr "" + +#: ../src/vikwindow.c:4903 +msgid "Export as KML" +msgstr "" + +#: ../src/vikwindow.c:4904 +msgid "Transfer data from a GPS device" +msgstr "Overfør data fra GPS udstyr" + +#: ../src/vikwindow.c:4905 +msgid "Import file via GPSBabel converter" +msgstr "" + +#: ../src/vikwindow.c:4909 +msgid "Import Geo_JSON File..." +msgstr "" + +#: ../src/vikwindow.c:4909 +msgid "Import GeoJSON file" +msgstr "" + +#: ../src/vikwindow.c:4914 +msgid "_UTM Mode" +msgstr "" + +#: ../src/vikwindow.c:4915 +msgid "_Expedia Mode" +msgstr "" + +#: ../src/vikwindow.c:4916 +msgid "_Mercator Mode" +msgstr "" + +#: ../src/vikwindow.c:4917 +msgid "Lat_/Lon Mode" +msgstr "" + +#: ../src/vikwindow.c:4921 +msgid "Show _Scale" +msgstr "" + +#: ../src/vikwindow.c:4921 +msgid "Show Scale" +msgstr "Vis skala" + +#: ../src/vikwindow.c:4922 +msgid "Show _Center Mark" +msgstr "" + +#: ../src/vikwindow.c:4922 +msgid "Show Center Mark" +msgstr "" + +#: ../src/vikwindow.c:4923 +msgid "Show _Highlight" +msgstr "" + +#: ../src/vikwindow.c:4923 +msgid "Show Highlight" +msgstr "" + +#: ../src/vikwindow.c:4924 +msgid "_Full Screen" +msgstr "" + +#: ../src/vikwindow.c:4924 +msgid "Activate full screen mode" +msgstr "" + +#: ../src/vikwindow.c:4925 +msgid "Show Side _Panel" +msgstr "" + +#: ../src/vikwindow.c:4925 +msgid "Show Side Panel" +msgstr "" + +#: ../src/vikwindow.c:4926 +msgid "Show Status_bar" +msgstr "" + +#: ../src/vikwindow.c:4926 +msgid "Show Statusbar" +msgstr "" + +#: ../src/vikwindow.c:4927 +msgid "Show _Toolbar" +msgstr "" + +#: ../src/vikwindow.c:4927 +msgid "Show Toolbar" +msgstr "" + +#: ../src/vikwindow.c:4928 +msgid "Show _Menu" +msgstr "" + +#: ../src/vikwindow.c:4928 +msgid "Show Menu" +msgstr "" + +#: ../src/vikwindow.c:4929 +msgid "Show Side Panel B_uttons" +msgstr "" + +#: ../src/vikwindow.c:4929 +msgid "Show Side Panel Buttons" +msgstr "" + +#: ../src/vikwindow.c:4930 +msgid "Show Side Panel Ca_lendar" +msgstr "" + +#: ../src/vikwindow.c:4930 +msgid "Show Side Panel Calendar" +msgstr "" + +#: ../src/vikwindow.c:5064 +#, c-format +msgid "New _%s Layer" +msgstr "" + +#: ../src/vikwindow.c:5114 +#, fuzzy +msgid "..." +msgstr "Tilføj..." + +#: ../src/viking.desktop.in.h:2 +msgid "GPS Data Manager" +msgstr "" + +#: ../src/viking.desktop.in.h:3 +msgid "Map Based GPS Data Manager (live data capable)." +msgstr "" + +#: ../src/libjpeg/jpeg-data.c:205 +msgid "Data does not follow JPEG specification." +msgstr "" + +#: ../src/libjpeg/jpeg-data.c:302 +#, c-format +msgid "Path '%s' invalid." +msgstr "" + +#: ../src/libjpeg/jpeg-data.c:320 +#, c-format +msgid "Could not read '%s'." +msgstr "" + +#~ msgid "Email:" +#~ msgstr "E-mail:" diff --git a/po/de.po b/po/de.po new file mode 100644 index 0000000..f0cdf03 --- /dev/null +++ b/po/de.po @@ -0,0 +1,6270 @@ +# German translation for viking +# Copyright (c) 2007 Rosetta Contributors and Canonical Ltd 2007 +# This file is distributed under the same license as the viking package. +# FIRST AUTHOR , 2007. +# +msgid "" +msgstr "" +"Project-Id-Version: viking\n" +"Report-Msgid-Bugs-To: \n" +"POT-Creation-Date: 2019-01-19 12:53+0000\n" +"PO-Revision-Date: 2018-10-28 11:08+0000\n" +"Last-Translator: Guido Scholz \n" +"Language-Team: German \n" +"Language: de\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-Launchpad-Export-Date: 2018-12-21 17:32+0000\n" +"X-Generator: Launchpad (build 18847)\n" + +#: ../src/acquire.c:106 ../src/vikgpslayer.c:1367 +msgid "Done." +msgstr "Fertig." + +#: ../src/acquire.c:115 +msgid "No data." +msgstr "Keine Daten." + +#: ../src/acquire.c:167 ../src/acquire.c:415 +msgid "Error: acquisition failed." +msgstr "Fehler: Datenübertragung fehlgeschlagen" + +#: ../src/acquire.c:339 +msgid "Working..." +msgstr "Wird bearbeitet …" + +#. This shouldn't happen... +#: ../src/acquire.c:406 +msgid "" +"Unable to create command\n" +"Acquire method failed." +msgstr "" + +#: ../src/acquire.c:513 +msgid "_Filter" +msgstr "_Filter" + +#: ../src/acquire.c:528 +#, c-format +msgid "Filter with %s" +msgstr "Filtern mit %s" + +#: ../src/acquire.c:545 +msgid "Filter" +msgstr "Filter" + +#: ../src/babel.c:640 +msgid "GPSBabel:" +msgstr "GPSBabel:" + +#: ../src/babel.c:641 +msgid "" +"Allow setting the specific instance of GPSBabel. You must restart Viking for " +"this value to take effect." +msgstr "" +"Erlaubt es, eine spezielle Instanz von GPSBabel festzulegen. Sie müssen " +"Viking neu starten, um die Änderung zu übernehmen." + +#: ../src/babel_ui.c:79 +msgid "Select a file format" +msgstr "Dateiformat wählen" + +#: ../src/babel_ui.c:144 ../src/viktrwlayer.c:531 ../src/viktrwlayer.c:2882 +msgid "Tracks" +msgstr "Spuren" + +#: ../src/babel_ui.c:149 ../src/viktrwlayer.c:2892 +msgid "Routes" +msgstr "Routen" + +#. ***** PARAMETERS ***** +#: ../src/babel_ui.c:154 ../src/viktrwlayer.c:531 ../src/viktrwlayer.c:2887 +msgid "Waypoints" +msgstr "Wegpunkte" + +#: ../src/background.c:64 +#, c-format +msgid "%d items" +msgstr "%d Teile" + +#: ../src/background.c:287 +msgid "Threads:" +msgstr "Threads:" + +#: ../src/background.c:288 +msgid "" +"Number of threads to use for Mapnik tasks. You need to restart Viking for a " +"change to this value to be used" +msgstr "" +"Anzahl der Threads, die für Mapnik genutzt werden. Sie müssen Viking neu " +"starten, um die Änderung zu übernehmen" + +#: ../src/background.c:361 +msgid "Job" +msgstr "Aufgabe" + +#: ../src/background.c:365 +msgid "Progress" +msgstr "Fortschritt" + +#: ../src/background.c:373 +msgid "Viking Background Jobs" +msgstr "Viking-Hintergrund-Aufträge" + +#: ../src/bing.c:42 +msgid "Bing Aerial" +msgstr "Bing Aerial" + +#: ../src/bing.c:48 +msgid "Bing" +msgstr "Bing" + +#. VIK_GTK_WINDOW_FROM_WIDGET(vp) +#: ../src/bingmapsource.c:514 +msgid "Bing attribution Loading" +msgstr "Lade Bing-Attribution" + +#: ../src/clipboard.c:95 +msgid "paste failed" +msgstr "Einfügen fehlgeschlagen" + +#: ../src/clipboard.c:105 +msgid "wrong clipboard data size" +msgstr "Fehlerhafte Größe für Zwischenablage" + +#: ../src/clipboard.c:124 +#, c-format +msgid "" +"The clipboard contains sublayer data for %s layers. You must select a layer " +"of this type to paste the clipboard data." +msgstr "" +"Die Zwischenablage enthält Sublayer-Daten für %s Ebenen. Sie müssen eine " +"Ebene dieses Typs wählen, um die Dateien der Zwischenablage einzufügen." + +#: ../src/clipboard.c:264 +msgid "" +"In order to paste a waypoint, please select an appropriate layer to paste " +"into." +msgstr "Bitte eine zum Einfügen eines Wegpunktes geeignete Ebene auswählen." + +#: ../src/dialog.c:60 +msgid "Go to Lat/Lon" +msgstr "Gehe zu Breite/Länge" + +#: ../src/dialog.c:69 ../src/viktrwlayer_wpwin.c:173 +msgid "Latitude:" +msgstr "Breitengrad:" + +#: ../src/dialog.c:72 ../src/viktrwlayer_wpwin.c:177 +msgid "Longitude:" +msgstr "Längengrad:" + +#: ../src/dialog.c:102 +msgid "Go to UTM" +msgstr "Gehe zu UTM" + +#: ../src/dialog.c:114 +msgid "Northing:" +msgstr "Nördliche Deklinaton:" + +#: ../src/dialog.c:117 +msgid "Easting:" +msgstr "Östliche Deklination:" + +#: ../src/dialog.c:121 ../src/vikgeoreflayer.c:902 +msgid "Zone:" +msgstr "Zone:" + +#: ../src/dialog.c:124 ../src/vikgeoreflayer.c:904 +msgid "Letter:" +msgstr "Buchstabe:" + +#: ../src/dialog.c:246 ../src/geonamessearch.c:238 +#: ../src/datasource_osm_my_traces.c:505 +msgid "Nothing was selected" +msgstr "Nichts ausgewählt" + +#: ../src/dialog.c:254 +msgid "Add Route" +msgstr "Route hinzufügen" + +#: ../src/dialog.c:254 +msgid "Add Track" +msgstr "Spur hinzufügen" + +#: ../src/dialog.c:262 +msgid "Route Name:" +msgstr "Routen-Name:" + +#: ../src/dialog.c:262 +msgid "Track Name:" +msgstr "Spurname:" + +#: ../src/dialog.c:282 +msgid "Please enter a name for the track." +msgstr "Bitte einen Namen für die Spur eingeben." + +#: ../src/dialog.c:311 +msgid "Today" +msgstr "Heute" + +#: ../src/dialog.c:393 +msgid "Zoom Factors..." +msgstr "Vergrößerungsfaktoren …" + +#: ../src/dialog.c:407 +msgid "Zoom factor (in meters per pixel):" +msgstr "Vergrösserungsfaktor (in Meter pro Pixel):" + +#: ../src/dialog.c:408 +msgid "X (easting): " +msgstr "X (östlich): " + +#: ../src/dialog.c:409 +msgid "Y (northing): " +msgstr "Y (nördlich): " + +#: ../src/dialog.c:414 +msgid "X and Y zoom factors must be equal" +msgstr "Die Zoom-Fakoren X und Y müssen gleich sein." + +#: ../src/dialog.c:469 +msgid "1 min" +msgstr "1 Minute" + +#: ../src/dialog.c:470 +msgid "1 hour" +msgstr "1 Stunde" + +#: ../src/dialog.c:471 +msgid "1 day" +msgstr "1 Tag" + +#: ../src/dialog.c:472 +msgid "Custom (in minutes):" +msgstr "Einstellung (in Minuten)" + +#: ../src/dialog.c:608 +#, c-format +msgid "" +"2003-2008, Evan Battaglia\n" +"2008-%s, Viking's contributors" +msgstr "" + +#: ../src/dialog.c:609 +msgid "GPS Data and Topo Analyzer, Explorer, and Manager." +msgstr "GPS-Daten und Topo-Analysierer, Explorer und Manager," + +#: ../src/dialog.c:610 +msgid "" +"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.\n" +"\n" +"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.\n" +"\n" +"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., 59 Temple " +"Place, Suite 330, Boston, MA 02111-1307, USA" +msgstr "" +"Dieses Programm ist freie Software, Sie können sie weitergeben und/oder " +"verändern solange Sie sich an die Regeln der GNU General Public License " +"halten, so wie sie von der Free Software Foundation festgelegt wurden; " +"entweder in Version 2 der Lizenz oder (nach Ihrem Ermessen) in jeder " +"folgenden Lizenz.\n" +"\n" +"Dieses Programm wurde mit dem Ziel veröffentlicht, dass Sie es nützlich " +"finden, jedoch OHNE JEDWEDE GARANTIE, sogar ohne eine implizite Garantie der " +"VERKAUFBARKEIT oder der NUTZBARKEIT FÜR EINEN SPEZIELLEN ZWECK. Schauen Sie " +"für weitere Informationen bitte in der GNU General Public License (GNU GPL) " +"nach.\n" +"\n" +"Mit diesem Programm sollten Sie außerdem eine Kopie der GNU General Public " +"License erhalten haben. Wenn dem nicht so ist, so schreiben Sie bitte an die " +"Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA " +"02110-1301, USA." + +#: ../src/dialog.c:703 +msgid "Translation is coordinated on http://launchpad.net/viking" +msgstr "Die Übersetzungen werden über http://launchpad.net/viking koordiniert" + +#: ../src/dialog.c:713 +msgid "Download along track" +msgstr "Daten entlang der Spur herunterladen" + +#: ../src/dialog.c:720 +msgid "Map type:" +msgstr "Kartentyp:" + +#: ../src/dialog.c:726 +msgid "Zoom level:" +msgstr "Vergrößerungsstufe:" + +#: ../src/dialog.c:766 +#, c-format +msgid "The map data is licensed: %s." +msgstr "Die Lizenz der Kartendaten liegt bei: %s." + +#: ../src/dialog.c:769 +#, c-format +msgid "" +"The data provided by '%s' are licensed under the following license: " +"%s." +msgstr "" +"Die von '%s' bereitgestellten Daten sind unter folgenden " +"Lizenzbedingungen zugelassen: %s." + +#: ../src/dialog.c:773 +msgid "Open license" +msgstr "Offene Lizenz" + +#: ../src/expedia.c:54 +msgid "Expedia Street Maps" +msgstr "Expedia-Straßenkarten" + +#: ../src/expedia.c:82 +msgid "Invalid expedia altitude" +msgstr "Unzulässige Expedia-Höhe" + +#: ../src/expedia.c:113 +#, c-format +msgid "" +"Couldn't open EXPEDIA image file (right after successful download! Please " +"report and delete image file!): %s" +msgstr "" +"Kann EXPEDIA-Bilddatei nicht öffnen (nach erfolgreichem Herunterladen! Bitte " +"berichten und löschen Sie die Bild-Datei!): %s" + +#: ../src/expedia.c:126 +#, c-format +msgid "" +"Couldn't save EXPEDIA image file (right after successful download! Please " +"report and delete image file!): %s" +msgstr "" +"Kann EXPEDIA-Bilddatei nicht speichern (nach erfolgreichem Herunterladen! " +"Bitte berichten und löschen Sie die Bild-Datei!): %s" + +#: ../src/geonamessearch.c:115 +msgid "Search" +msgstr "Suche" + +#: ../src/geonamessearch.c:117 +msgid "No entries found!" +msgstr "Keine Einträge gefunden!" + +#. NB could allow columns to be shifted around by doing this after each new +#. gtk_tree_view_column_set_reorderable ( column, TRUE ); +#. However I don't think is that useful, so I haven't put it in +#: ../src/geonamessearch.c:171 ../src/datasource_osm_my_traces.c:422 +#: ../src/viktrwlayer_tracklist.c:621 ../src/viktrwlayer_waypointlist.c:618 +msgid "Name" +msgstr "Name" + +#: ../src/geonamessearch.c:176 +msgid "Feature" +msgstr "Eigenschaft" + +#: ../src/geonamessearch.c:181 ../src/datasource_osm_my_traces.c:437 +msgid "Lat/Lon" +msgstr "Breite/Länge" + +#: ../src/geonamessearch.c:264 ../src/googlesearch.c:101 ../src/vikgoto.c:430 +msgid "couldn't map temp file" +msgstr "Aufzeichen der Zwischendatei fehlgeschlagen" + +#: ../src/geonamessearch.c:459 +#, fuzzy +msgid "Select articles" +msgstr "Dateiformat wählen" + +#: ../src/geonamessearch.c:459 +#, fuzzy +msgid "Select the articles you want to add." +msgstr "Dateiformat wählen." + +#: ../src/geonamessearch.c:475 +msgid "city" +msgstr "" + +#: ../src/geonamessearch.c:477 +#, fuzzy +msgid "edu" +msgstr "Ende" + +#: ../src/geonamessearch.c:479 +msgid "airport" +msgstr "" + +#: ../src/geonamessearch.c:481 +msgid "mountain" +msgstr "" + +#: ../src/geonamessearch.c:483 +msgid "forest" +msgstr "" + +#: ../src/geonamessearch.c:485 +msgid "church" +msgstr "" + +#: ../src/geojson.c:74 +#, c-format +msgid "%s command failed: %s" +msgstr "%s-Befehl fehlgeschlagen: %s" + +#: ../src/geojson.c:146 ../src/gpx.c:1317 +#, c-format +msgid "failed to open temporary file: %s" +msgstr "Fehler beim Öffnen der Zwischendatei: %s" + +#: ../src/globals.c:67 +msgid "DDD" +msgstr "" + +#: ../src/globals.c:67 +#, fuzzy +msgid "DMM" +msgstr "DEM" + +#: ../src/globals.c:67 +#, fuzzy +msgid "DMS" +msgstr "DEM" + +#: ../src/globals.c:67 +msgid "Raw" +msgstr "Rohdaten" + +#: ../src/globals.c:68 +msgid "Kilometres" +msgstr "Kilometer" + +#: ../src/globals.c:68 +msgid "Miles" +msgstr "Meilen" + +#: ../src/globals.c:68 +msgid "Nautical Miles" +msgstr "Seemeilen" + +#. VIK_UNITS_SPEED_KILOMETRES_PER_HOUR: +#: ../src/globals.c:69 ../src/viktrwlayer_tracklist.c:655 ../src/vikutils.c:100 +msgid "km/h" +msgstr "km/h" + +#: ../src/globals.c:69 ../src/viktrwlayer_tracklist.c:656 ../src/vikutils.c:78 +msgid "mph" +msgstr "Meilen/h" + +#. VIK_UNITS_SPEED_METRES_PER_SECOND: +#: ../src/globals.c:69 ../src/viktrwlayer_tracklist.c:663 ../src/vikutils.c:81 +msgid "m/s" +msgstr "m/s" + +#: ../src/globals.c:69 ../src/viktrwlayer_tracklist.c:657 ../src/vikutils.c:84 +msgid "knots" +msgstr "Knoten" + +#: ../src/globals.c:69 ../src/viktrwlayer_tracklist.c:658 ../src/vikutils.c:87 +msgid "s/km" +msgstr "" + +#: ../src/globals.c:69 ../src/viktrwlayer_tracklist.c:659 ../src/vikutils.c:90 +msgid "min/km" +msgstr "" + +#: ../src/globals.c:69 +msgid "s/mi" +msgstr "" + +#: ../src/globals.c:69 ../src/viktrwlayer_tracklist.c:661 ../src/vikutils.c:96 +msgid "min/mi" +msgstr "" + +#: ../src/globals.c:70 +#, fuzzy +msgid "Metres" +msgstr "Kilometer" + +#: ../src/globals.c:70 +msgid "Feet" +msgstr "" + +#: ../src/globals.c:73 +msgid "Locale" +msgstr "Ortszeit" + +#: ../src/globals.c:73 +msgid "World" +msgstr "Weltzeit" + +#: ../src/globals.c:73 +msgid "UTC" +msgstr "UTC (Weltzeit)" + +#: ../src/globals.c:76 +msgid "Degree format:" +msgstr "Grad-Format:" + +#: ../src/globals.c:77 +msgid "Distance units:" +msgstr "Abstandseinheit:" + +#: ../src/globals.c:78 +msgid "Speed units:" +msgstr "Geschwindigkeitseinheit:" + +#: ../src/globals.c:79 +msgid "Height units:" +msgstr "Höheneinheit:" + +#: ../src/globals.c:80 +msgid "Use large waypoint icons:" +msgstr "Benutze große Wegpunktsymbole:" + +#: ../src/globals.c:81 +msgid "Default latitude:" +msgstr "Standardbreitengrad:" + +#: ../src/globals.c:82 +msgid "Default longitude:" +msgstr "Standardlängengrad:" + +#: ../src/globals.c:83 +msgid "Time Display:" +msgstr "Zeitanzeige" + +#: ../src/globals.c:84 +msgid "" +"Display times according to the reference frame. Locale is the user's system " +"setting. World is relative to the location of the object." +msgstr "" +"Zeiten gemäß dem jeweiligen Bezugsrahmen anzeigen. Die Ortszeit entspricht " +"der Zeit in den Systemeinstellungen des Benutzers. Die Weltzeit bezieht sich " +"auf die Lage des Objektes." + +#: ../src/globals.c:90 +msgid "Alphabetical" +msgstr "Alphabetisch" + +#: ../src/globals.c:90 ../src/datasource_osm_my_traces.c:432 +msgid "Time" +msgstr "Zeit" + +#: ../src/globals.c:90 +msgid "Creation" +msgstr "Erstellung" + +#: ../src/globals.c:91 +msgid "Title Case" +msgstr "Wortanfänge groß" + +#: ../src/globals.c:91 +msgid "Lowercase" +msgstr "Kleinbuchstaben" + +#: ../src/globals.c:94 +msgid "KML File Export Units:" +msgstr "KML-Datei Exporteinheiten:" + +#: ../src/globals.c:95 +msgid "GPX Track Order:" +msgstr "GPX-Track-Auflistung:" + +#: ../src/globals.c:96 +msgid "GPX Waypoint Symbols:" +msgstr "GPX-Wegpunkt-Symbole:" + +#: ../src/globals.c:97 +msgid "" +"Save GPX Waypoint Symbol names in the specified case. May be useful for " +"compatibility with various devices" +msgstr "" +"GPX-Wegpunkt-Symbol-Namen in diesem speziellen Fall speichern. Kann für die " +"Kompatibilität mit verschiedenen Geräten nützlich sein." + +#: ../src/globals.c:98 +#, fuzzy +msgid "GPX Creator:" +msgstr "Erstellung" + +#: ../src/globals.c:99 +msgid "" +"The creator value when writing a GPX file. Otherwise when blank a default is " +"used." +msgstr "" + +#: ../src/globals.c:104 +msgid "Image Viewer:" +msgstr "Bildbetrachter:" + +#: ../src/globals.c:109 +msgid "External GPX Program 1:" +msgstr "Externes GPX-Programm 1:" + +#: ../src/globals.c:110 +msgid "External GPX Program 2:" +msgstr "Externes GPX-Programm 2:" + +#: ../src/globals.c:113 +msgid "Absolute" +msgstr "Absolut" + +#: ../src/globals.c:113 +msgid "Relative" +msgstr "Relativ" + +#: ../src/globals.c:117 +msgid "Save File Reference Mode:" +msgstr "Datei-Referenz-Modus speichern:" + +#: ../src/globals.c:118 +msgid "" +"When saving a Viking .vik file, this determines how the directory paths of " +"filenames are written." +msgstr "" +"Hiermit wird bestimmt, wie die Verzeichnispfade der Dateinamen geschrieben " +"werden, wenn eine Viking-Datei (.vik) gespeichert wird." + +#: ../src/globals.c:119 +msgid "Ask for Name before Track Creation:" +msgstr "Vor Erstellung einer Spur Namen erfragen:" + +#: ../src/globals.c:120 +msgid "Show Tooltip during Track Creation:" +msgstr "Tooltips während der Anlage eines Tracks anzeigen" + +#: ../src/globals.c:121 +msgid "The number of recent files:" +msgstr "Anzahl der zuletzt verwendeten Dateien:" + +#: ../src/globals.c:122 +msgid "" +"Only applies to new windows or on application restart. -1 means all " +"available files." +msgstr "" +"Wird nur bei neuen Fenstern oder einem Neustart der Anwendung angewendet. -1 " +"steht für alle verfügbaren Dateien." + +#: ../src/globals.c:123 +#, fuzzy +msgid "Open files in selected layer:" +msgstr "Ausgewählte Ebene entfernen" + +#: ../src/globals.c:124 +msgid "Open files (but not .vik ones) into the selected TrackWaypoint layer." +msgstr "" + +#: ../src/globals.c:125 +msgid "Show calendar day names:" +msgstr "" + +#: ../src/globals.c:128 +msgid "Home Location" +msgstr "Heimatort" + +#: ../src/globals.c:128 +msgid "Last Location" +msgstr "Letzte Position" + +#: ../src/globals.c:128 +msgid "Specified File" +msgstr "Ausgewählte Datei" + +#: ../src/globals.c:128 +msgid "Auto Location" +msgstr "Automatische Position" + +#: ../src/globals.c:131 +msgid "Restore Window Setup:" +msgstr "Fensteraufbau wiederherstellen" + +#: ../src/globals.c:132 +msgid "Restore window size and layout" +msgstr "Fenstergröße und -aufbau wiederherstellen" + +#: ../src/globals.c:133 +msgid "Add a Default Map Layer:" +msgstr "Standard-Kartenebene" + +#: ../src/globals.c:134 +msgid "" +"The default map layer added is defined by the Layer Defaults. Use the menu " +"Edit->Layer Defaults->Map... to change the map type and other values." +msgstr "" +"Die hinzugefügte Standard-Kartenebene wird über die Ebenen-Standards " +"bestimmt. Verwenden Sie das Menü 'Bearbeiten' -> 'Ebenen-Standards' -> " +"'Karte...', um den Kartentyp und andere Werte zu ändern." + +#: ../src/globals.c:135 +msgid "Startup Method:" +msgstr "Startmethode" + +#: ../src/globals.c:136 +msgid "Startup File:" +msgstr "Datei, die beim Start geladen wird:" + +#: ../src/globals.c:137 +msgid "" +"The default file to load on startup. Only applies when the startup method is " +"set to 'Specified File'" +msgstr "" +"Beim Start zu ladende Standarddatei. Kommt nur bei der Startmethoden-" +"Einstellung 'ausgewählte Datei' zur Anwendung." + +#: ../src/globals.c:138 +msgid "Check For New Version:" +msgstr "Auf neue Version prüfen:" + +#: ../src/globals.c:139 +msgid "Periodically check to see if a new version of Viking is available" +msgstr "Periodisch prüfen ob neue Versionen von Viking verfügbar sind" + +#. Defaults for the options are setup here +#: ../src/globals.c:176 +msgid "General" +msgstr "Allgemeines" + +#. New Tab +#: ../src/globals.c:204 +msgid "Startup" +msgstr "Start" + +#. New Tab +#: ../src/globals.c:222 +msgid "Export/External" +msgstr "Export/Externes" + +#. 'Advanced' Properties +#: ../src/globals.c:249 +msgid "Advanced" +msgstr "Fortgeschritten" + +#. Webtools +#: ../src/google.c:39 +msgid "Google" +msgstr "Google" + +#. If there is an actual description field it will overwrite this value +#: ../src/gpx.c:264 +#, c-format +msgid "Created by: %s" +msgstr "" + +#: ../src/datasource_bfilter.c:43 +msgid "Max number of points:" +msgstr "Maximale Anzahl von Punkten:" + +#: ../src/datasource_bfilter.c:84 +msgid "Simplify All Tracks..." +msgstr "Alle GPS-Spuren vereinfachen..." + +#: ../src/datasource_bfilter.c:85 +msgid "Simplified Tracks" +msgstr "Vereinfachte Spuren" + +#. { VIK_LAYER_NUM_TYPES, "compressmethod", VIK_LAYER_PARAM_UINT, VIK_LAYER_GROUP_NONE, N_("Simplify Method:"), VIK_LAYER_WIDGET_COMBOBOX, compress_method, NULL, NULL, NULL, NULL, NULL }, +#: ../src/datasource_bfilter.c:111 +msgid "Error Factor:" +msgstr "Fehlerfaktor:" + +#: ../src/datasource_bfilter.c:112 +msgid "" +"Specifies the maximum allowable error that may be introduced by removing a " +"single point by the crosstrack method. See the manual or GPSBabel Simplify " +"Filter documentation for more detail." +msgstr "" +"Legt den maximal erlaubten Fehler fest, der durch das Entfernen eines " +"einzelnen Punktes entsteht. Mehr hierzu erfahren sie im Handbuch oder in der " +"Simplify Filter Dokumentation von GPSBabel." + +#: ../src/datasource_bfilter.c:166 +msgid "Compress Tracks..." +msgstr "Spuren komprimieren ..." + +#: ../src/datasource_bfilter.c:167 +msgid "Compressed Tracks" +msgstr "Komprimierte Spuren" + +#: ../src/datasource_bfilter.c:197 ../src/datasource_bfilter.c:198 +msgid "Remove Duplicate Waypoints" +msgstr "Doppelte Wegpunkte entfernen" + +#: ../src/datasource_bfilter.c:221 +msgid "Manual filter:" +msgstr "Manueller Filter:" + +#: ../src/datasource_bfilter.c:222 +msgid "Manual filter command: e.g. 'swap'." +msgstr "" + +#: ../src/datasource_bfilter.c:233 ../src/datasource_bfilter.c:234 +msgid "Manual filter" +msgstr "Manueller Filter" + +#: ../src/datasource_bfilter.c:262 +msgid "Waypoints Inside This" +msgstr "Wegpunkte innerhalb von" + +#: ../src/datasource_bfilter.c:263 ../src/datasource_bfilter.c:292 +msgid "Polygonized Layer" +msgstr "Polygon-Ebene" + +#: ../src/datasource_bfilter.c:291 +msgid "Waypoints Outside This" +msgstr "Wegpunkte liegt außerhalb von" + +#: ../src/datasource_file.c:61 +msgid "Import file with GPSBabel" +msgstr "Datei mit GPSBabel importieren" + +#: ../src/datasource_file.c:62 +msgid "Imported file" +msgstr "Importierte Datei" + +#. The file selector +#: ../src/datasource_file.c:129 +msgid "File:" +msgstr "Datei:" + +#: ../src/datasource_file.c:130 +msgid "File to import" +msgstr "Zu importierende Datei" + +#: ../src/datasource_file.c:137 +msgid "All files" +msgstr "Alle Dateien" + +#. The file format selector +#: ../src/datasource_file.c:144 ../src/datasource_url.c:106 +msgid "File type:" +msgstr "Dateityp:" + +#: ../src/datasource_file.c:189 +#, c-format +msgid "using babel args '%s' and file '%s'" +msgstr "Babel-Argumente '%s' und -Datei '%s' werden verwendet" + +#: ../src/datasource_gc.c:67 +msgid "Download Geocaches" +msgstr "Geocaches herunterladen" + +#: ../src/datasource_gc.c:68 +msgid "Geocaching.com Caches" +msgstr "Caches von Geocaching.com" + +#: ../src/datasource_gc.c:86 +msgid "geocaching.com username:" +msgstr "geocaching.com-Benutzername:" + +#: ../src/datasource_gc.c:87 +msgid "geocaching.com password:" +msgstr "geocaching.com-Passwort:" + +#: ../src/datasource_gc.c:92 ../src/vikwindow.c:3502 +msgid "Geocaching" +msgstr "Geocaching" + +#: ../src/datasource_gc.c:128 +#, c-format +msgid "" +"Can't find %s or %s in path! Check that you have installed it correctly." +msgstr "" +"Kann %s oder %s nicht im Pfad finden! Bitte prüfen, ob es richtig " +"installiert ist" + +#: ../src/datasource_gc.c:190 +msgid "Number geocaches:" +msgstr "Anzahl Geocaches:" + +#: ../src/datasource_gc.c:192 +msgid "Centered around:" +msgstr "Mittelpunkt:" + +#: ../src/datasource_gc.c:231 +msgid "Broken input - using some defaults" +msgstr "Falsche Eingabe - Benutze einige Voreinstellungen" + +#: ../src/datasource_geotag.c:51 +msgid "Create Waypoints from Geotagged Images" +msgstr "Wegpunkte aus georeferenzierten Bildern erzeugen" + +#: ../src/datasource_geotag.c:52 +msgid "Geotagged Images" +msgstr "Georeferenzierte Bilder" + +#: ../src/datasource_geotag.c:102 ../src/datasource_geojson.c:93 +#: ../src/vikfileentry.c:171 ../src/vikwindow.c:3533 ../src/vikwindow.c:3610 +#: ../src/vikwindow.c:3641 ../src/vikwindow.c:4356 ../src/vikwindow.c:4649 +msgid "All" +msgstr "Alle" + +#: ../src/datasource_geotag.c:107 ../src/vikfileentry.c:115 +#: ../src/viktrwlayer_geotag.c:637 ../src/vikwindow.c:3518 +#: ../src/vikwindow.c:4377 +msgid "JPG" +msgstr "JPG" + +#: ../src/datasource_geotag.c:168 +#, c-format +msgid "Unable to create waypoint from %s" +msgstr "Kann keinen Wegpunkt aus %s erzeugen" + +#: ../src/datasource_geojson.c:46 +msgid "Acquire from GeoJSON" +msgstr "" + +#: ../src/datasource_geojson.c:47 ../src/datasource_geojson.c:98 +msgid "GeoJSON" +msgstr "GeoJSON" + +#: ../src/datasource_geojson.c:152 +#, c-format +msgid "Unable to import from: %s" +msgstr "Fehler beim Import von: %s" + +#: ../src/datasource_gps.c:54 +msgid "Acquire from GPS" +msgstr "Vom GPS laden" + +#: ../src/datasource_gps.c:55 +msgid "Acquired from GPS" +msgstr "Vom GPS geladen" + +#: ../src/datasource_gps.c:258 +#, c-format +msgid "using cmd '%s' and file '%s'\n" +msgstr "" + +#: ../src/datasource_gps.c:353 ../src/vikgpslayer.c:966 +#, c-format +msgid "Downloading %d waypoint..." +msgid_plural "Downloading %d waypoints..." +msgstr[0] "%d Wegpunkt herunterladen..." +msgstr[1] "%d Wegpunkte herunterladen..." + +#: ../src/datasource_gps.c:358 ../src/vikgpslayer.c:971 +#, c-format +msgid "Downloading %d trackpoint..." +msgid_plural "Downloading %d trackpoints..." +msgstr[0] "%d Spurpunkt herunterladen..." +msgstr[1] "%d Spurpunkte herunterladen..." + +#: ../src/datasource_gps.c:363 ../src/vikgpslayer.c:976 +#, c-format +msgid "Downloading %d routepoint..." +msgid_plural "Downloading %d routepoints..." +msgstr[0] "%d Routenpunkt herunterladen ..." +msgstr[1] "%d Routenpunkte herunterladen ..." + +#: ../src/datasource_gps.c:386 ../src/datasource_gps.c:393 +#: ../src/datasource_gps.c:400 +#, c-format +msgid "Downloaded %d out of %d %s..." +msgstr "%d heruntergeladen von %d %s ..." + +#: ../src/datasource_gps.c:388 ../src/datasource_gps.c:395 +#: ../src/datasource_gps.c:402 +#, c-format +msgid "Downloaded %d %s." +msgstr "%d %s heruntergeladen." + +#: ../src/datasource_gps.c:416 ../src/vikgpslayer.c:1134 +#, c-format +msgid "GPS Device: %s" +msgstr "GPS-Gerät: %s" + +#: ../src/datasource_gps.c:428 ../src/vikgpslayer.c:1214 +msgid "Status: Working..." +msgstr "Status: in Arbeit ..." + +#. NB gps_layer_inst_init() is performed after parameter registeration +#. thus to give the protocols some potential values use the old static list +#. TODO: find another way to use gps_layer_inst_init()? +#: ../src/datasource_gps.c:584 ../src/vikgpslayer.c:216 +msgid "GPS Protocol:" +msgstr "GPS-Protokoll:" + +#. List reassigned at runtime +#: ../src/datasource_gps.c:609 ../src/vikgpslayer.c:217 +msgid "Serial Port:" +msgstr "Serielle Schnittstelle:" + +#: ../src/datasource_gps.c:659 +msgid "" +"Turn Off After Transfer\n" +"(Garmin/NAViLink Only)" +msgstr "" +"Nach dem Datentransfer bitte ausschalten\n" +"(Nur Garmin/NAViLink)" + +#: ../src/datasource_gps.c:666 +msgid "Tracks:" +msgstr "Spuren:" + +#: ../src/datasource_gps.c:673 +msgid "Routes:" +msgstr "Routen:" + +#: ../src/datasource_gps.c:680 +msgid "Waypoints:" +msgstr "Wegpunkte:" + +#: ../src/datasource_gps.c:756 ../src/vikgpslayer.c:1509 +msgid "GPS device: N/A" +msgstr "GPS-Gerät: Nicht gefunden" + +#: ../src/datasource_osm.c:53 ../src/datasource_osm.c:54 +msgid "OSM traces" +msgstr "OSM-Spuren" + +#: ../src/datasource_osm.c:89 +msgid "Page number:" +msgstr "Seitennummer:" + +#: ../src/datasource_osm_my_traces.c:59 ../src/datasource_osm_my_traces.c:60 +msgid "OSM My Traces" +msgstr "OSM Meine Spuren" + +#: ../src/datasource_osm_my_traces.c:106 ../src/osm-traces.c:684 +#, fuzzy +msgid "Email/username:" +msgstr "Benutzername:" + +#: ../src/datasource_osm_my_traces.c:111 +msgid "The email or username used to login to OSM" +msgstr "" +"Die E-Mail-Adresse oder der Benutzername, welche zum Anmelden bei OSM " +"benutzt werden" + +#: ../src/datasource_osm_my_traces.c:113 ../src/osm-traces.c:692 +msgid "Password:" +msgstr "Passwort:" + +#: ../src/datasource_osm_my_traces.c:116 +msgid "The password used to login to OSM" +msgstr "Passwort für die Anmeldung bei OSM" + +#: ../src/datasource_osm_my_traces.c:427 ../src/viktrwlayer.c:689 +msgid "Description" +msgstr "Beschreibung" + +#: ../src/datasource_osm_my_traces.c:442 +msgid "Privacy" +msgstr "Privatsphäre" + +#: ../src/datasource_osm_my_traces.c:449 +msgid "Within Current View" +msgstr "Innerhalb der aktuellen Ansicht" + +#: ../src/datasource_osm_my_traces.c:516 +msgid "GPS Traces" +msgstr "GPS-Spuren" + +#: ../src/datasource_osm_my_traces.c:518 +msgid "None found!" +msgstr "Keine gefunden!" + +#: ../src/datasource_osm_my_traces.c:569 +msgid "Ensure the OSM access token preferences are setup." +msgstr "" + +#: ../src/datasource_osm_my_traces.c:645 +msgid "My OSM Traces" +msgstr "Meine OSM-Spuren" + +#. Report errors to the status bar +#: ../src/datasource_osm_my_traces.c:667 +#, c-format +msgid "Unable to get trace: %s" +msgstr "" + +#: ../src/datasource_routing.c:56 ../src/datasource_routing.c:57 +msgid "Directions" +msgstr "Richtung" + +#: ../src/datasource_routing.c:90 +msgid "No routing engines with directions available" +msgstr "" + +#. Engine selector +#: ../src/datasource_routing.c:99 +msgid "Engine:" +msgstr "Treiber:" + +#. From and To entries +#: ../src/datasource_routing.c:104 +msgid "From:" +msgstr "Von:" + +#: ../src/datasource_routing.c:105 +msgid "To:" +msgstr "Zu:" + +#: ../src/datasource_url.c:48 +msgid "Acquire from URL" +msgstr "" + +#: ../src/datasource_url.c:49 +msgid "URL" +msgstr "Internetadresse (URL)" + +#: ../src/datasource_url.c:101 +msgid "URL:" +msgstr "URL :" + +#. Only GPX (not using GPSbabel) +#: ../src/datasource_url.c:133 ../src/vikfileentry.c:161 +#: ../src/vikwindow.c:3513 ../src/vikwindow.c:3603 +msgid "GPX" +msgstr "GPX" + +#: ../src/datasource_wikipedia.c:32 +msgid "Create Waypoints from Wikipedia Articles" +msgstr "Wegpunkte aus Wikipedia Einträgen erstellen" + +#: ../src/datasource_wikipedia.c:33 +msgid "Wikipedia Waypoints" +msgstr "Wikipedia-Wegpunkte" + +#: ../src/dem.c:66 ../src/dem.c:80 +msgid "Invalid DEM" +msgstr "Ungültiges DEM" + +#: ../src/dem.c:122 +msgid "Invalid DEM header" +msgstr "DEM-Dateikopf fehlerhaft" + +#: ../src/dem.c:191 ../src/dem.c:204 +msgid "Incorrect DEM Class B record: expected 1" +msgstr "Ungültiger DEM-Klasse B Eintrag: 1 erwartet" + +#: ../src/dem.c:289 ../src/download.c:176 +#, c-format +msgid "Couldn't map file %s: %s" +msgstr "Kann Datei %s: %s nicht zeichnen" + +#: ../src/download.c:130 +msgid "Tile age (days):" +msgstr "Kachelalter (in Tagen)" + +#: ../src/download.c:406 +#, c-format +msgid "Download error: %s" +msgstr "Fehler beim Herunterladen: %s" + +#: ../src/download.c:490 +msgid "couldn't open temp file" +msgstr "Kann Zwischendatei nicht öffnen" + +#: ../src/file.c:458 ../src/file.c:463 +#, c-format +msgid "Draw mode '%s' no more supported" +msgstr "Zeichen-Modus '%s' nicht mehr unterstützt" + +#: ../src/geotag_exif.c:621 +msgid "Not enough memory." +msgstr "Nicht genügend Speicher." + +#: ../src/geotag_exif.c:639 +msgid "Setting a value for this tag is unsupported!" +msgstr "Werteingabe für diese Marke wird nicht unterstützt!" + +#: ../src/geotag_exif.c:658 +#, c-format +msgid "Too few components specified (need %d, found %d)\n" +msgstr "Zu wenig Komponenten angegeben (erforderlich: %d, gefunden: %d)\n" + +#: ../src/geotag_exif.c:662 +msgid "Numeric value expected\n" +msgstr "Numerischer Wert erwartet\n" + +#: ../src/geotag_exif.c:670 +msgid "This shouldn't happen!" +msgstr "Das sollte nicht passieren!" + +#: ../src/geotag_exif.c:740 +msgid "Not yet implemented!" +msgstr "Noch nicht implementiert!" + +#: ../src/geotag_exif.c:753 +msgid "Warning; Too many components specified!" +msgstr "Warnung: Zu viele Komponenten angegeben!" + +#: ../src/osm-traces.c:87 +msgid "Identifiable (public w/ timestamps)" +msgstr "Identifizierbar (öffentlich mit Zeitstempeln)" + +#: ../src/osm-traces.c:88 +msgid "Trackable (private w/ timestamps)" +msgstr "Auffindbar (privat mit Zeitstempeln)" + +#: ../src/osm-traces.c:89 +msgid "Public" +msgstr "Öffentlich" + +#: ../src/osm-traces.c:90 +msgid "Private" +msgstr "Nicht öffentlich" + +#: ../src/osm-traces.c:108 +msgid "Access Token:" +msgstr "" + +#: ../src/osm-traces.c:108 +msgid "Get New OSM Access Tokens" +msgstr "" + +#: ../src/osm-traces.c:109 +msgid "Access Token Key:" +msgstr "" + +#: ../src/osm-traces.c:110 +msgid "Access Token Secret:" +msgstr "" + +#: ../src/osm-traces.c:111 +msgid "OSM username:" +msgstr "OSM-Benutzername:" + +#: ../src/osm-traces.c:112 +msgid "OSM password:" +msgstr "OSM-Passwort:" + +#. Check to really override existing values... +#: ../src/osm-traces.c:263 +msgid "Do you want to overwrite existing values?" +msgstr "" + +#: ../src/osm-traces.c:275 +msgid "Not able to generate OSM request tokens." +msgstr "" + +#: ../src/osm-traces.c:299 +msgid "" +"Waiting for authorization approval.\n" +"Ensure you have granted access at the website before continuing here." +msgstr "" + +#: ../src/osm-traces.c:315 +#, fuzzy +msgid "No Authorization." +msgstr "Automatische Position" + +#: ../src/osm-traces.c:354 +msgid "" +"OSM Username and Password preferences are not required anymore. You can now " +"remove them." +msgstr "" + +#. Preferences +#: ../src/osm-traces.c:379 +msgid "OpenStreetMap Traces" +msgstr "Openstreetmap-Spuren" + +#: ../src/osm-traces.c:504 +#, c-format +msgid "failed to upload data: HTTP response is %ld" +msgstr "Fehler beim Hochladen (HTTP Fehler: %ld)" + +#: ../src/osm-traces.c:509 +#, c-format +msgid "curl_easy_getinfo failed: %d" +msgstr "curl_easy_getinfo fehlgeschlagen: %d" + +#: ../src/osm-traces.c:514 +#, c-format +msgid "curl request failed: %s" +msgstr "curl request fehlgeschlagen: %s" + +#. Success +#: ../src/osm-traces.c:592 +msgid "Uploaded to OSM" +msgstr "Nach OSM hochgeladen" + +#: ../src/osm-traces.c:596 +msgid "" +"FAILED TO UPLOAD DATA TO OSM - Ensure the OSM access token preferences are " +"setup." +msgstr "" + +#: ../src/osm-traces.c:599 +msgid "FAILED TO UPLOAD DATA TO OSM - CURL PROBLEM" +msgstr "Fehler beim Hochladen nach OSM - Curl-Problem" + +#: ../src/osm-traces.c:602 +msgid "FAILED TO UPLOAD DATA TO OSM" +msgstr "Fehler beim Hochladen nach OSM" + +#: ../src/osm-traces.c:602 +msgid "HTTP response code" +msgstr "HTTP Antwort" + +#: ../src/osm-traces.c:610 +#, c-format +msgid "failed to unlink temporary file: %s" +msgstr "Fehler beim Freigeben der Zwischendatei: %s" + +#: ../src/osm-traces.c:664 +msgid "OSM upload" +msgstr "OSM-Upload" + +#: ../src/osm-traces.c:689 +#, fuzzy +msgid "" +"The email/username used as login\n" +"Enter the email/username you use to login into www.openstreetmap.org." +"" +msgstr "" +"Die E-Mail-Adresse zum Anmelden\n" +"Geben Sie die E-Mail-Adresse ein, mit der Sie sich auf www." +"openstreetmap.org einloggen." + +#: ../src/osm-traces.c:697 +msgid "" +"The password used to login\n" +"Enter the password you use to login into www.openstreetmap.org." +msgstr "" +"Das Passwort zum Anmelden\n" +"Geben Sie das Passwort ein, mit dem Sie sich auf www.openstreetmap." +"org anmelden." + +#: ../src/osm-traces.c:703 +msgid "File's name:" +msgstr "Dateiname:" + +#: ../src/osm-traces.c:713 +msgid "" +"The name of the file on OSM\n" +"This is the name of the file created on the server.This is not the " +"name of the local file." +msgstr "" +"Der Name der Datei auf OSM\n" +"Das ist der Name der Datei, die auf dem Server erstellt wurde. Es ist " +"nicht der Name der lokalen Datei." + +#: ../src/osm-traces.c:717 ../src/viktrwlayer_wpwin.c:197 +#: ../src/viktrwlayer_wpwin.c:199 +msgid "Description:" +msgstr "Beschreibung:" + +#: ../src/osm-traces.c:731 +msgid "The description of the trace" +msgstr "Beschreibung der Aufzeichnung" + +#: ../src/osm-traces.c:734 +msgid "Anonymize Times:" +msgstr "Zeiten anonymisieren:" + +#: ../src/osm-traces.c:739 +msgid "" +"Anonymize times of the trace.\n" +"You may choose to make the trace identifiable, yet mask the actual " +"real time values" +msgstr "" + +#: ../src/osm-traces.c:743 +msgid "Tags:" +msgstr "Schlagwörter:" + +#: ../src/osm-traces.c:751 +msgid "The tags associated to the trace" +msgstr "Die zur Aufzeichnung gehörigen Schlagwörter:" + +#: ../src/osm-traces.c:816 +#, c-format +msgid "Uploading %s to OSM" +msgstr "Hochladen von %s nach OSM" + +#: ../src/mapcache.c:67 +msgid "Map cache memory size (MB):" +msgstr "Karten-Cache-Speichergrössen (MB):" + +#. NB Can have a couple hundred fonts loaded when using system directories +#. So ATM don't list them all - otherwise need better GUI feedback display. +#: ../src/mapnik_interface.cpp:324 +#, c-format +msgid "" +"%s %s\n" +"Plugins=%sFonts loaded=%d" +msgstr "" + +#: ../src/mapnik_interface.cpp:325 ../src/vikmapniklayer.c:278 +msgid "Mapnik" +msgstr "Mapnik" + +#: ../src/print.c:51 ../src/viktrwlayer.c:572 +msgid "None" +msgstr "Keine" + +#: ../src/print.c:52 +msgid "Horizontally" +msgstr "Horizontal" + +#: ../src/print.c:53 +msgid "Vertically" +msgstr "Vertikal" + +#: ../src/print.c:54 +msgid "Both" +msgstr "Beides" + +#: ../src/print.c:118 +msgid "Image Settings" +msgstr "Bildeinstellungen" + +#: ../src/print.c:551 +msgid "done" +msgstr "fertig" + +#. Page Size +#: ../src/print.c:580 +msgid "_Adjust Page Size and Orientation" +msgstr "Seitengröße und _Orientierung anpassen" + +#: ../src/print.c:596 +msgid "C_enter:" +msgstr "_Zentrieren:" + +#. ignore page margins +#: ../src/print.c:614 +msgid "Ignore Page _Margins" +msgstr "Seiten_ränder ignorieren" + +#: ../src/print.c:633 +msgid "Image S_ize:" +msgstr "_Bildgröße:" + +#: ../src/ui_util.c:88 +#, c-format +msgid "Could not launch web browser. %s" +msgstr "Konnte den Webbrowser nicht starten. %s" + +#: ../src/ui_util.c:101 +#, c-format +msgid "Could not create new email. %s" +msgstr "Konnte neue Email nicht anlegen. %s" + +#: ../src/vikcoordlayer.c:57 +msgid "Color:" +msgstr "Farbe:" + +#: ../src/vikcoordlayer.c:58 +msgid "Minutes Width:" +msgstr "Minuten-Dicke:" + +#: ../src/vikcoordlayer.c:59 +msgid "Line Thickness:" +msgstr "Strichstärke:" + +#: ../src/vikcoordlayer.c:66 +msgid "Coordinate" +msgstr "Koordinate" + +#: ../src/main.c:92 +#, c-format +msgid "Ignoring Xlib error: error code %d request code %d\n" +msgstr "" + +#: ../src/main.c:111 +msgid "Enable debug output" +msgstr "Fehlerausgabe aktivieren" + +#: ../src/main.c:112 +msgid "Enable verbose output" +msgstr "Mit Verlaufsprotokoll" + +#: ../src/main.c:113 +msgid "Show version" +msgstr "Version anzeigen" + +#: ../src/main.c:114 +msgid "Latitude in decimal degrees" +msgstr "Breite in Dezimalgraden" + +#: ../src/main.c:115 +msgid "Longitude in decimal degrees" +msgstr "Länge in Dezimalgraden" + +#: ../src/main.c:116 +msgid "Zoom Level (OSM). Value can be 0 - 22" +msgstr "Vergrößerungsstufe (OSM). Wert von 0 bis 22" + +#: ../src/main.c:117 +msgid "Add a map layer by id value. Use 0 for the default map." +msgstr "" + +#: ../src/main.c:160 +#, c-format +msgid "" +"%s %s\n" +"Copyright (c) 2003-2008 Evan Battaglia\n" +"Copyright (c) 2008-%s Viking's contributors\n" +msgstr "" + +#: ../src/osm.c:50 +#, fuzzy +msgid "OpenStreetMap (Mapnik)" +msgstr "Openstreetmap-Spuren" + +#: ../src/osm.c:65 +#, fuzzy +msgid "OpenStreetMap (Cycle)" +msgstr "Openstreetmap-Spuren" + +#: ../src/osm.c:79 +#, fuzzy +msgid "OpenStreetMap (Transport)" +msgstr "Openstreetmap-Spuren" + +#: ../src/osm.c:95 +#, fuzzy +msgid "OpenStreetMap (Humanitarian)" +msgstr "Openstreetmap-Spuren" + +#: ../src/osm.c:111 +msgid "On Disk OSM Tile Format" +msgstr "OSM Kachel Format auf lokaler Platte" + +#: ../src/osm.c:121 +msgid "MBTiles File" +msgstr "" + +#: ../src/osm.c:132 +msgid "OSM Metatiles" +msgstr "" + +#: ../src/osm.c:146 +msgid "Mapbox Outdoors" +msgstr "" + +#: ../src/osm.c:153 +msgid "Mapbox Specific" +msgstr "" + +#: ../src/osm.c:170 +msgid "OSM (view)" +msgstr "OSM (Ansicht)" + +#: ../src/osm.c:174 +msgid "OSM (edit)" +msgstr "OSM (Bearbeiten)" + +#. Note the use of positional parameters +#: ../src/osm.c:179 +msgid "OSM (query)" +msgstr "" + +#: ../src/osm.c:183 +msgid "OSM (render)" +msgstr "OSM (Darstellen)" + +#. Example: http://127.0.0.1:8111/load_and_zoom?left=8.19&right=8.20&top=48.605&bottom=48.590&select=node413602999 +#. JOSM or merkaartor must already be running with remote interface enabled +#: ../src/osm.c:190 +msgid "Local port 8111 (eg JOSM)" +msgstr "Lokaler Port 8111 (z.B. JOSM)" + +#: ../src/osm.c:195 +msgid "Geofabrik Map Compare" +msgstr "" + +#: ../src/osm.c:203 +msgid "OpenStreetMap Notes" +msgstr "OpenStreetMap-Notizen" + +#. Not really OSM but can't be bothered to create somewhere else to put it... +#: ../src/osm.c:221 +msgid "Wikimedia Toolserver GeoHack" +msgstr "" + +#: ../src/preferences.c:195 +msgid "Preferences" +msgstr "Einstellungen" + +#: ../src/toolbar.c:91 ../src/toolbar.c:92 +msgid "System Default" +msgstr "Systemvorgabe" + +#: ../src/toolbar.c:91 ../src/viktrwlayer.c:563 +msgid "Small" +msgstr "Klein" + +#: ../src/toolbar.c:91 ../src/viktrwlayer.c:564 +msgid "Medium" +msgstr "Mittel" + +#: ../src/toolbar.c:91 ../src/viktrwlayer.c:565 +msgid "Large" +msgstr "Groß" + +#: ../src/toolbar.c:92 +msgid "Icons Only" +msgstr "Nur Symbole" + +#: ../src/toolbar.c:92 +msgid "Text Only" +msgstr "Nur Text" + +#: ../src/toolbar.c:92 +msgid "Icons and Text" +msgstr "Symbole und Text" + +#: ../src/toolbar.c:106 +msgid "Append to Menu:" +msgstr "Dem Menü anhängen" + +#: ../src/toolbar.c:107 +msgid "Pack the toolbar to the main menu to save vertical space" +msgstr "" +"Die Werkzeugliste im Hauptmenü platzieren um vertikalen Platz zu sparen." + +#: ../src/toolbar.c:108 +msgid "Icon Size:" +msgstr "Symbolgröße:" + +#: ../src/toolbar.c:110 +msgid "Icon Style:" +msgstr "" + +#: ../src/toolbar.c:112 +msgid "Customize:" +msgstr "Anpassen:" + +#: ../src/toolbar.c:112 +msgid "Customize Buttons" +msgstr "" + +#. Preferences +#: ../src/toolbar.c:145 +msgid "Toolbar" +msgstr "Symbolleiste" + +#: ../src/toolbar.c:312 +msgid "_Customize" +msgstr "_Anpassen" + +#: ../src/toolbar.c:641 +msgid "Separator" +msgstr "Trennstrich" + +#: ../src/toolbar.c:642 +msgid "--- Separator ---" +msgstr "---- Trenner ----" + +#: ../src/toolbar.c:1007 +msgid "Customize Toolbar" +msgstr "Werkzeugleiste anpassen" + +#: ../src/toolbar.c:1028 +msgid "" +"Select items to be displayed on the toolbar. Items can be reordered by drag " +"and drop." +msgstr "" +"Symbole der Werkzeugliste auswählen. Die Symbole können mit der Maus neu " +"angeordnet werden." + +#: ../src/toolbar.c:1044 +msgid "Available Items" +msgstr "Verfügbare Elemente" + +#: ../src/toolbar.c:1065 +msgid "Displayed Items" +msgstr "Angezeigte Elemente" + +#: ../src/viklayer_defaults.c:232 +#, c-format +msgid "Could not open file: %s" +msgstr "Datei kann nicht geöffnet werden: %s" + +#: ../src/viklayer_defaults.c:304 +msgid "Layer Defaults" +msgstr "Layer-Standards" + +#: ../src/uibuilder.c:196 +msgid "Take care that this password will be stored clearly in a plain file." +msgstr "Achtung: Das Passwort wird in Klartext in einer Datei abgelegt." + +#: ../src/uibuilder.c:628 ../src/viktrwlayer_export.c:188 +#: ../src/viktrwlayer_export.c:304 ../src/vikwindow.c:3666 +#: ../src/vikwindow.c:4408 +#, c-format +msgid "The file \"%s\" exists, do you wish to overwrite it?" +msgstr "Soll die bereits existierende Datei \"%s\" überschrieben werden?" + +#: ../src/vikaggregatelayer.c:41 +msgid "Aggregate" +msgstr "Zusammenfassen" + +#: ../src/vikaggregatelayer.c:528 ../src/viktrwlayer.c:11700 +#, c-format +msgid "%s: Waypoint List" +msgstr "%s: Wegpunktliste" + +#: ../src/vikaggregatelayer.c:570 +msgid "Search by Date" +msgstr "Suche nach Datum" + +#: ../src/vikaggregatelayer.c:576 +msgid "No items found with the requested date." +msgstr "" + +#: ../src/vikaggregatelayer.c:615 ../src/viktrwlayer.c:11691 +#, c-format +msgid "%s: Track and Route List" +msgstr "%s: Track- und Routenliste" + +#: ../src/vikaggregatelayer.c:681 ../src/viktrwlayer.c:8346 +#: ../src/viktrwlayer.c:8417 ../src/viktrwlayer.c:8494 +msgid "_Visibility" +msgstr "Sichtbarkeit" + +#: ../src/vikaggregatelayer.c:686 +msgid "_Show All" +msgstr "_Alle anzeigen" + +#: ../src/vikaggregatelayer.c:692 +msgid "_Hide All" +msgstr "Alle _verstecken" + +#: ../src/vikaggregatelayer.c:698 ../src/viktrwlayer.c:8363 +#: ../src/viktrwlayer.c:8434 ../src/viktrwlayer.c:8511 +msgid "_Toggle" +msgstr "_Umschalten" + +#: ../src/vikaggregatelayer.c:705 ../src/viktrwlayer.c:8532 +msgid "_Sort" +msgstr "_Sortieren" + +#: ../src/vikaggregatelayer.c:711 ../src/viktrwlayer.c:8538 +msgid "Name _Ascending" +msgstr "Namen _aufsteigend" + +#: ../src/vikaggregatelayer.c:717 ../src/viktrwlayer.c:8544 +msgid "Name _Descending" +msgstr "Name _absteigend" + +#: ../src/vikaggregatelayer.c:723 ../src/viktrwlayer.c:575 +#: ../src/viktrwlayer.c:8550 +msgid "Date Ascending" +msgstr "Datum aufsteigend" + +#: ../src/vikaggregatelayer.c:729 ../src/viktrwlayer.c:576 +#: ../src/viktrwlayer.c:8556 +msgid "Date Descending" +msgstr "Datum absteigend" + +#: ../src/vikaggregatelayer.c:735 ../src/viktrwlayer.c:8445 +#: ../src/viktrwlayer.c:8523 ../src/viktrwlayer.c:8595 +#: ../src/viktrwlayer_tracklist.c:296 +msgid "_Statistics" +msgstr "_Statistiken" + +#: ../src/vikaggregatelayer.c:740 ../src/viktrwlayer.c:4533 +msgid "Track _List..." +msgstr "Spuren_liste" + +#: ../src/vikaggregatelayer.c:746 ../src/viktrwlayer.c:4540 +msgid "_Waypoint List..." +msgstr "_Wegpunktliste ..." + +#: ../src/vikaggregatelayer.c:753 +msgid "Searc_h" +msgstr "Suc_hen" + +#: ../src/vikaggregatelayer.c:759 +msgid "By _Date..." +msgstr "Nach _Datum ..." + +#: ../src/vikaggregatelayer.c:762 +msgid "Find the first item with a specified date" +msgstr "" + +#: ../src/vikaggregatelayer.c:765 +msgid "Load E_xternal Layers" +msgstr "" + +#. Could have a more complicated tooltip that numbers each type of layers, +#. but for now a simple overall count +#: ../src/vikaggregatelayer.c:1011 +#, c-format +msgid "One layer" +msgid_plural "%d layers" +msgstr[0] "" +msgstr[1] "" + +#: ../src/vikaggregatelayer.c:1014 +#, fuzzy, c-format +msgid "Empty" +msgstr "Lösche _alles" + +#: ../src/vikdemlayer.c:86 +msgid "SRTM Global 90m (3 arcsec)" +msgstr "" + +#: ../src/vikdemlayer.c:94 +msgid "Absolute height" +msgstr "Absolute Höhe" + +#: ../src/vikdemlayer.c:95 +msgid "Height gradient" +msgstr "Höhen-Gradient" + +#: ../src/vikdemlayer.c:120 +msgid "DEM Files:" +msgstr "DEM-Dateien:" + +#: ../src/vikdemlayer.c:121 +msgid "Download Source:" +msgstr "Quelle zum Herunterladen:" + +#: ../src/vikdemlayer.c:122 +msgid "Min Elev Color:" +msgstr "Min. Höhe Farbe:" + +#: ../src/vikdemlayer.c:123 ../src/viktrwlayer_wpwin.c:207 +msgid "Type:" +msgstr "Typ:" + +#: ../src/vikdemlayer.c:124 +msgid "Min Elev:" +msgstr "Min. Höhe:" + +#: ../src/vikdemlayer.c:125 +msgid "Max Elev:" +msgstr "Max. Höhe:" + +#: ../src/vikdemlayer.c:137 +msgid "_DEM Download" +msgstr "_DEM Download" + +#: ../src/vikdemlayer.c:137 +msgid "DEM Download" +msgstr "DEM Download" + +#: ../src/vikdemlayer.c:192 +msgid "DEM" +msgstr "DEM" + +#: ../src/vikdemlayer.c:304 +#, c-format +msgid "Number of files: %d" +msgstr "Anzahl der Dateien: %d" + +#: ../src/vikdemlayer.c:446 +msgid "DEM Loading" +msgstr "Lade DEM" + +#: ../src/vikdemlayer.c:927 +#, c-format +msgid "No SRTM data available for %f, %f" +msgstr "Keine SRTM-Daten für %f, %f verfügbar" + +#: ../src/vikdemlayer.c:948 +#, c-format +msgid "DEM download failure for %f, %f" +msgstr "Fehler beim Herunterladen von DEM für %f, %f" + +#: ../src/vikdemlayer.c:954 +#, c-format +msgid "DEM write failure for %s" +msgstr "DEM Schreibfehler für %s" + +#. Probably not over any land... +#: ../src/vikdemlayer.c:1201 +msgid "No DEM File Available" +msgstr "Keine DEM Datei verfügbar" + +#: ../src/vikdemlayer.c:1220 +#, c-format +msgid "" +"\n" +"Source: %s\n" +"\n" +"DEM File: %s\n" +"DEM File Timestamp: %s" +msgstr "" + +#: ../src/vikdemlayer.c:1224 +#, c-format +msgid "" +"Source: %s\n" +"\n" +"No DEM File!" +msgstr "" +"Quelle: %s\n" +"\n" +"Keine DEM-Datei!" + +#: ../src/vikdemlayer.c:1264 +#, c-format +msgid "Downloading DEM %s" +msgstr "DEM %s herunterladen" + +#: ../src/vikdemlayer.c:1289 +msgid "_Show DEM File Information" +msgstr "_Zeige DEM Datei Informationen" + +#: ../src/vikfileentry.c:72 +msgid "Browse..." +msgstr "_Durchsuchen..." + +#: ../src/vikfileentry.c:103 +msgid "Choose file" +msgstr "Datei auswählen" + +#: ../src/vikfileentry.c:120 ../src/vikwindow.c:4372 +msgid "PNG" +msgstr "PNG" + +#: ../src/vikfileentry.c:125 +msgid "TIFF" +msgstr "TIFF" + +#: ../src/vikfileentry.c:133 +msgid "MBTiles" +msgstr "" + +#: ../src/vikfileentry.c:142 +msgid "XML" +msgstr "XML" + +#: ../src/vikfileentry.c:149 +msgid "MML" +msgstr "" + +#: ../src/vikfileentry.c:154 +msgid "MSS" +msgstr "" + +#: ../src/vikfilelist.c:49 +msgid "Choose file(s)" +msgstr "Datei(en) auswählen" + +#: ../src/vikfilelist.c:182 +msgid "Add..." +msgstr "Hinzufügen ..." + +#: ../src/vikfilelist.c:183 +msgid "Delete" +msgstr "Löschen" + +#: ../src/vikgeoreflayer.c:97 +msgid "_Georef Move Map" +msgstr "" + +#: ../src/vikgeoreflayer.c:97 +msgid "Georef Move Map" +msgstr "Georef-Karte verschieben" + +#: ../src/vikgeoreflayer.c:106 +msgid "Georef Z_oom Tool" +msgstr "" + +#: ../src/vikgeoreflayer.c:106 +msgid "Georef Zoom Tool" +msgstr "Georef-Vergrösserungswerkzeug" + +#: ../src/vikgeoreflayer.c:117 +msgid "GeoRef Map" +msgstr "GeoRef-Karte" + +#: ../src/vikgeoreflayer.c:214 +msgid "Auto Read World Files:" +msgstr "" + +#: ../src/vikgeoreflayer.c:215 +msgid "" +"Automatically attempt to read associated world file of a new image for a " +"GeoRef layer" +msgstr "" + +#: ../src/vikgeoreflayer.c:511 ../src/vikgeoreflayer.c:797 +#: ../src/vikmapslayer.c:1174 +#, c-format +msgid "Couldn't open image file: %s" +msgstr "Konnte Bilddatei nicht öffnen: %s" + +#: ../src/vikgeoreflayer.c:607 ../src/vikgeoreflayer.c:633 +msgid "Choose World file" +msgstr "Welt-Datei auswählen" + +#: ../src/vikgeoreflayer.c:619 +msgid "The World file you requested could not be opened for reading." +msgstr "Ihre gewünschte Welt-Datei koonte zum Einlesen nicht geöffnet werden." + +#: ../src/vikgeoreflayer.c:621 +msgid "Unexpected end of file reading World file." +msgstr "Unerwartetes Ende beim Einlesen der Welt-Datei." + +#: ../src/vikgeoreflayer.c:646 +msgid "The file you requested could not be opened for writing." +msgstr "Die angeforderte Datei konnte nicht zum Schreiben geöffnet werden." + +#: ../src/vikgeoreflayer.c:782 +msgid "Lower right corner values may not be consistent with upper right values" +msgstr "" +"Werte der unteren rechten Ecke könnten nicht zu denen der oberen rechten " +"Ecke passen" + +#: ../src/vikgeoreflayer.c:806 +#, c-format +msgid "Invalid image size: %s" +msgstr "Ungültige Bildgröße: %s" + +#: ../src/vikgeoreflayer.c:831 ../src/viklayer.c:561 ../src/vikwindow.c:4891 +msgid "Layer Properties" +msgstr "Ebenen-Eigenschaften" + +#: ../src/vikgeoreflayer.c:852 +msgid "World File Parameters:" +msgstr "Welt-Datei-Parameter:" + +#: ../src/vikgeoreflayer.c:853 +msgid "Load From File..." +msgstr "Aus Datei laden ..." + +#: ../src/vikgeoreflayer.c:858 +msgid "Corner pixel easting:" +msgstr "Pixel östliche Ecke" + +#: ../src/vikgeoreflayer.c:860 +msgid "the UTM \"easting\" value of the upper-left corner pixel of the map" +msgstr "" + +#: ../src/vikgeoreflayer.c:862 +msgid "Corner pixel northing:" +msgstr "Pixel. Nördliche Ecke" + +#: ../src/vikgeoreflayer.c:864 +msgid "the UTM \"northing\" value of the upper-left corner pixel of the map" +msgstr "" + +#: ../src/vikgeoreflayer.c:866 +msgid "X (easting) scale (mpp): " +msgstr "X (Ostwert) Maßstab (mpp): " + +#: ../src/vikgeoreflayer.c:867 +msgid "Y (northing) scale (mpp): " +msgstr "Y (Nordwert) Maßstab (mpp): " + +#: ../src/vikgeoreflayer.c:870 +msgid "the scale of the map in the X direction (meters per pixel)" +msgstr "Maßstab in X-Richtung (Meter pro Pixel)" + +#: ../src/vikgeoreflayer.c:872 +msgid "the scale of the map in the Y direction (meters per pixel)" +msgstr "Maßstab in Y-Richtung (Meter pro Pixel)" + +#: ../src/vikgeoreflayer.c:874 +msgid "Map Image:" +msgstr "Karten-Bild:" + +#: ../src/vikgeoreflayer.c:919 +msgid "Upper left latitude:" +msgstr "Breitengrad oben links:" + +#: ../src/vikgeoreflayer.c:921 +msgid "Upper left longitude:" +msgstr "Längenngrad oben links:" + +#: ../src/vikgeoreflayer.c:923 +msgid "Lower right latitude:" +msgstr "Breitengrad unten rechts:" + +#: ../src/vikgeoreflayer.c:925 +msgid "Lower right longitude:" +msgstr "Längengrad unten rechts:" + +#: ../src/vikgeoreflayer.c:937 +msgid "Calculate MPP values from coordinates" +msgstr "" + +#: ../src/vikgeoreflayer.c:938 +msgid "" +"Enter all corner coordinates before calculating the MPP values from the " +"image size" +msgstr "" + +#: ../src/vikgeoreflayer.c:948 +msgid "UTM" +msgstr "UTM" + +#: ../src/vikgeoreflayer.c:949 +msgid "Latitude/Longitude" +msgstr "Breitengrad/Längengrad" + +#: ../src/vikgeoreflayer.c:957 ../src/vikmapniklayer.c:82 +#: ../src/vikmapslayer.c:158 +msgid "Alpha:" +msgstr "Alpha:" + +#. Now with icons +#: ../src/vikgeoreflayer.c:1062 +msgid "_Zoom to Fit Map" +msgstr "_Zoom (zum Einpassen der Karte)" + +#: ../src/vikgeoreflayer.c:1068 +msgid "_Goto Map Center" +msgstr "_Gehe zum Kartenmittelpunkt" + +#: ../src/vikgeoreflayer.c:1074 +msgid "_Export to World File" +msgstr "_Export als Welt-Datei" + +#: ../src/vikgoto.c:98 +msgid "No goto tool available." +msgstr "Kein \"Gehe zu\"-Werkzeug verfügbar" + +#: ../src/vikgoto.c:295 +msgid "goto" +msgstr "Gehe zu" + +#: ../src/vikgoto.c:297 +msgid "goto provider:" +msgstr "Suchanbieter:" + +#: ../src/vikgoto.c:312 +msgid "Enter address or place name:" +msgstr "Adresse oder Namen des Ortes eingeben:" + +#: ../src/vikgoto.c:487 +msgid "Locality" +msgstr "Standort" + +#: ../src/vikgpslayer.c:137 +msgid "Data Mode" +msgstr "Daten-Modus" + +#: ../src/vikgpslayer.c:139 +msgid "Realtime Tracking Mode" +msgstr "Echtzeit-Verfolgungsmodus" + +#: ../src/vikgpslayer.c:176 +msgid "Keep vehicle at center" +msgstr "Fahrzeug im Zentrum halten" + +#: ../src/vikgpslayer.c:177 +msgid "Keep vehicle on screen" +msgstr "Fahrzeug auf dem Bildschirm behalten" + +#: ../src/vikgpslayer.c:178 +msgid "Disable" +msgstr "Deaktivieren" + +#: ../src/vikgpslayer.c:218 +msgid "Download Tracks:" +msgstr "GPS-Spuren herunterladen:" + +#: ../src/vikgpslayer.c:219 +msgid "Upload Tracks:" +msgstr "GPS-Spuren zum Hochladen:" + +#: ../src/vikgpslayer.c:220 +msgid "Download Routes:" +msgstr "Routen herunterladen:" + +#: ../src/vikgpslayer.c:221 +msgid "Upload Routes:" +msgstr "Routen hinaufladen:" + +#: ../src/vikgpslayer.c:222 +msgid "Download Waypoints:" +msgstr "Wegpunkte zum Herunterladen:" + +#: ../src/vikgpslayer.c:223 +msgid "Upload Waypoints:" +msgstr "Wegpunkte zum Hochladen:" + +#: ../src/vikgpslayer.c:225 +msgid "Recording tracks" +msgstr "Spur aufzeichen" + +#: ../src/vikgpslayer.c:226 +msgid "Jump to current position on start" +msgstr "Beim Start zu dieser Position springen" + +#: ../src/vikgpslayer.c:227 +msgid "Moving Map Method:" +msgstr "Kartenverschiebungsmethode:" + +#: ../src/vikgpslayer.c:228 +msgid "Update Statusbar:" +msgstr "Statuszeile aktualisieren" + +#: ../src/vikgpslayer.c:228 +msgid "Display information in the statusbar on GPS updates" +msgstr "GPS Aktualisierungen in der Statuszeile anzeigen" + +#: ../src/vikgpslayer.c:229 +#, fuzzy +msgid "Auto Connect" +msgstr "Automatische Position" + +#: ../src/vikgpslayer.c:229 +msgid "Automatically connect to GPSD" +msgstr "" + +#: ../src/vikgpslayer.c:230 +msgid "Gpsd Host:" +msgstr "Gpsd-Rechner:" + +#: ../src/vikgpslayer.c:231 +msgid "Gpsd Port:" +msgstr "Gpsd-Port:" + +#: ../src/vikgpslayer.c:232 +msgid "Gpsd Retry Interval (seconds):" +msgstr "Gpsd-Empfangs-Interval (Sekunden):" + +#: ../src/vikgpslayer.c:254 +msgid "GPS" +msgstr "GPS" + +#: ../src/vikgpslayer.c:320 ../src/vikgpslayer.c:1504 +msgid "GPS Download" +msgstr "Von GPS-Gerät herunterladen" + +#: ../src/vikgpslayer.c:320 ../src/vikgpslayer.c:1504 ../src/viktrwlayer.c:3993 +msgid "GPS Upload" +msgstr "Zum GPS-Gerät senden" + +#: ../src/vikgpslayer.c:322 +msgid "GPS Realtime Tracking" +msgstr "GPS-Echtzeitverfolgung" + +#: ../src/vikgpslayer.c:458 +msgid "Connected" +msgstr "" + +#: ../src/vikgpslayer.c:460 +msgid "Disconnected" +msgstr "" + +#: ../src/vikgpslayer.c:554 +msgid "Unknown GPS Protocol" +msgstr "Unbekanntes GPS-Protokoll" + +#: ../src/vikgpslayer.c:572 +msgid "Unknown serial port device" +msgstr "Unbekanntes serielles Schnittstellengerät" + +#: ../src/vikgpslayer.c:691 +#, c-format +msgid "%s: unknown parameter" +msgstr "%s: unbekannter Parameter" + +#. Now with icons +#: ../src/vikgpslayer.c:794 +msgid "_Upload to GPS" +msgstr "Auf GPS-Gerät _hochladen" + +#: ../src/vikgpslayer.c:800 +msgid "Download from _GPS" +msgstr "Vom _GPS-Gerät herunterladen" + +#: ../src/vikgpslayer.c:821 +msgid "Empty _Realtime" +msgstr "Echtzeitaufzeichnnung _löschen" + +#: ../src/vikgpslayer.c:828 +msgid "E_mpty Upload" +msgstr "L_ösche Hochgeladenes" + +#: ../src/vikgpslayer.c:834 +msgid "_Empty Download" +msgstr "_Lösche Heruntergeladenes" + +#: ../src/vikgpslayer.c:840 +msgid "Empty _All" +msgstr "Lösche _alles" + +#: ../src/vikgpslayer.c:852 +#, c-format +msgid "Unexpected number of disconnected handlers: %d" +msgstr "Unerwartete Anzahl an \"disconnected handlers\": %d" + +#: ../src/vikgpslayer.c:995 +#, c-format +msgid "Uploading %d waypoint..." +msgid_plural "Uploading %d waypoints..." +msgstr[0] "%d Wegpunkt hochladen..." +msgstr[1] "%d Wegpunkte hochladen..." + +#: ../src/vikgpslayer.c:1000 +#, c-format +msgid "Uploading %d trackpoint..." +msgid_plural "Uploading %d trackpoints..." +msgstr[0] "%d Spurpunkt hochladen..." +msgstr[1] "%d Spurpunkte hochladen..." + +#: ../src/vikgpslayer.c:1005 +#, c-format +msgid "Uploading %d routepoint..." +msgid_plural "Uploading %d routepoints..." +msgstr[0] "%d Routenpunkt wird hochgeladen" +msgstr[1] "%d Routenpunkte werden hochgeladen" + +#: ../src/vikgpslayer.c:1034 +#, c-format +msgid "Downloaded %d out of %d waypoint..." +msgid_plural "Downloaded %d out of %d waypoints..." +msgstr[0] "%d von %d Wegpunkt heruntergeladen..." +msgstr[1] "%d von %d Wegpunkten heruntergeladen..." + +#: ../src/vikgpslayer.c:1040 +#, c-format +msgid "Downloaded %d out of %d trackpoint..." +msgid_plural "Downloaded %d out of %d trackpoints..." +msgstr[0] "%d von %d Spurpunkt heruntergeladen..." +msgstr[1] "%d von %d Spurpunkten heruntergeladen..." + +#: ../src/vikgpslayer.c:1046 +#, c-format +msgid "Downloaded %d out of %d routepoint..." +msgid_plural "Downloaded %d out of %d routepoints..." +msgstr[0] "" +msgstr[1] "" + +#: ../src/vikgpslayer.c:1056 +#, c-format +msgid "Uploaded %d out of %d waypoint..." +msgid_plural "Uploaded %d out of %d waypoints..." +msgstr[0] "%d von %d Wegpunkt heruntergeladen ..." +msgstr[1] "%d von %d Wegpunkte heruntergeladen ..." + +#: ../src/vikgpslayer.c:1062 +#, c-format +msgid "Uploaded %d out of %d trackpoint..." +msgid_plural "Uploaded %d out of %d trackpoints..." +msgstr[0] "%d von %d Spurpunkt heruntergeladen ..." +msgstr[1] "%d von %d Spurpunkten heruntergeladen ..." + +#: ../src/vikgpslayer.c:1068 +#, c-format +msgid "Uploaded %d out of %d routepoint..." +msgid_plural "Uploaded %d out of %d routepoints..." +msgstr[0] "" +msgstr[1] "" + +#: ../src/vikgpslayer.c:1079 +#, c-format +msgid "Downloaded %d waypoint" +msgid_plural "Downloaded %d waypoints" +msgstr[0] "%d Wegpunkt heruntergeladen" +msgstr[1] "%d Wegpunkte heruntergeladen" + +#: ../src/vikgpslayer.c:1085 +#, c-format +msgid "Downloaded %d trackpoint" +msgid_plural "Downloaded %d trackpoints" +msgstr[0] "%d Spurpunkt heruntergeladen" +msgstr[1] "%d Spurpunkte heruntergeladen" + +#: ../src/vikgpslayer.c:1091 +#, c-format +msgid "Downloaded %d routepoint" +msgid_plural "Downloaded %d routepoints" +msgstr[0] "" +msgstr[1] "" + +#: ../src/vikgpslayer.c:1101 +#, c-format +msgid "Uploaded %d waypoint" +msgid_plural "Uploaded %d waypoints" +msgstr[0] "%d Wegpunkt heruntergeladen" +msgstr[1] "%d Wegpunkte heruntergeladen" + +#: ../src/vikgpslayer.c:1107 +#, c-format +msgid "Uploaded %d trackpoint" +msgid_plural "Uploaded %d trackpoints" +msgstr[0] "%d Spurpunkt heruntergeladen" +msgstr[1] "%d Spurpunkte heruntergeladen" + +#: ../src/vikgpslayer.c:1113 +#, c-format +msgid "Uploaded %d routepoint" +msgid_plural "Uploaded %d routepoints" +msgstr[0] "" +msgstr[1] "" + +#: ../src/vikgpslayer.c:1363 +msgid "Error: No result." +msgstr "" + +#: ../src/vikgpslayer.c:1471 +msgid "Warning - GPS Upload items may overwrite each other" +msgstr "" +"Achtung - Das Hochladen auf das GPS wird ggfs. bestehende Einträge " +"überschreiben" + +#: ../src/vikgpslayer.c:1506 +msgid "Status: detecting gpsbabel" +msgstr "Status: Suche nach gpsbabel" + +#: ../src/vikgpslayer.c:1533 +msgid "No GPS items selected for transfer." +msgstr "Keine GPS Elemente für den Transfer ausgewählt." + +#: ../src/vikgpslayer.c:1546 +msgid "Could not turn off device." +msgstr "Konnte das Gerät nicht ausschalten." + +#: ../src/vikgpslayer.c:1589 +msgid "Are you sure you want to delete GPS Upload data?" +msgstr "Sind sie sicher, dass sie die GPS-Daten zum Hochladen löschen möchten?" + +#: ../src/vikgpslayer.c:1602 +msgid "Are you sure you want to delete GPS Download data?" +msgstr "" +"Sind sie sicher, dass sie die GPS-Daten zum Herunterladen löschen möchten?" + +#: ../src/vikgpslayer.c:1616 +msgid "Are you sure you want to delete GPS Realtime data?" +msgstr "Sind sie sicher, dass sie die GPS-Echtzeitdaten löschen möchten?" + +#: ../src/vikgpslayer.c:1630 +msgid "Are you sure you want to delete All GPS data?" +msgstr "Sind sie sicher, dass sie alle GPS-Daten löschen möchten?" + +#: ../src/vikgpslayer.c:2004 +#, c-format +msgid "" +"Failed to connect to gpsd at %s (port %s)\n" +"Should Viking keep trying (every %d seconds)?" +msgstr "" + +#: ../src/viklayerspanel.c:73 +msgid "C_ut" +msgstr "_Ausschneiden" + +#: ../src/viklayerspanel.c:74 ../src/vikwindow.c:4882 +msgid "_Copy" +msgstr "K_opieren" + +#: ../src/viklayerspanel.c:75 ../src/vikwindow.c:4883 +msgid "_Paste" +msgstr "_Einfügen" + +#: ../src/viklayerspanel.c:76 ../src/vikwindow.c:4884 +msgid "_Delete" +msgstr "_Löschen" + +#: ../src/viklayerspanel.c:154 +msgid "New Layer" +msgstr "Neue Ebene" + +#: ../src/viklayerspanel.c:347 +msgid "Top Layer" +msgstr "Oberste Ebene" + +#: ../src/viklayerspanel.c:363 +msgid "Add new layer" +msgstr "Eine neue Ebene hinzufügen" + +#: ../src/viklayerspanel.c:370 ../src/vikwindow.c:4884 +msgid "Remove selected layer" +msgstr "Ausgewählte Ebene entfernen" + +#: ../src/viklayerspanel.c:377 +msgid "Move selected layer up" +msgstr "Gewählte Ebene nach oben verschieben" + +#: ../src/viklayerspanel.c:384 +msgid "Move selected layer down" +msgstr "Gewählte Ebene nach unten veraschieben" + +#: ../src/viklayerspanel.c:391 ../src/vikwindow.c:4881 +msgid "Cut selected layer" +msgstr "Gewählte Ebene ausschneiden" + +#: ../src/viklayerspanel.c:398 ../src/vikwindow.c:4882 +msgid "Copy selected layer" +msgstr "Gewählte Ebene kopieren" + +#: ../src/viklayerspanel.c:405 ../src/vikwindow.c:4883 +msgid "" +"Paste layer into selected container layer or otherwise above selected layer" +msgstr "" + +#: ../src/viklayerspanel.c:502 +msgid "New name can not be blank." +msgstr "Der Name kann nicht leer sein." + +#: ../src/viklayerspanel.c:751 +msgid "Aggregate Layers have no settable properties." +msgstr "Zusammengefügte Ebenen ohne gemeinsame Eigenschaft." + +#: ../src/viklayerspanel.c:798 +msgid "You cannot cut the Top Layer." +msgstr "Sie können die oberste Ebene nicht ausschneiden." + +#: ../src/viklayerspanel.c:843 +#, c-format +msgid "Are you sure you want to delete %s?" +msgstr "Sind Sie sicher, dass sie %s löschen möchten?" + +#: ../src/viklayerspanel.c:863 +msgid "You cannot delete the Top Layer." +msgstr "Sie können die oberste Ebene nicht löschen." + +#: ../src/vikmapniklayer.c:78 +msgid "CSS (MML) Config File:" +msgstr "CSS (MML) Konfigurationsdatei:" + +#: ../src/vikmapniklayer.c:79 +msgid "CartoCSS configuration file" +msgstr "CartoCSS Konfigurationsdatei" + +#: ../src/vikmapniklayer.c:80 +msgid "XML Config File:" +msgstr "XML Konfigurationsdatei" + +#: ../src/vikmapniklayer.c:81 +msgid "Mapnik XML configuration file" +msgstr "Mapnik-XML-Konfigurationsdatei" + +#: ../src/vikmapniklayer.c:84 +msgid "Use File Cache:" +msgstr "" + +#: ../src/vikmapniklayer.c:86 +msgid "File Cache Directory:" +msgstr "" + +#: ../src/vikmapniklayer.c:122 +msgid "_Mapnik Features" +msgstr "_Mapnik-Eigenschaften" + +#: ../src/vikmapniklayer.c:122 +msgid "Mapnik Features" +msgstr "Mapnik-Eigenschaften" + +#: ../src/vikmapniklayer.c:140 +msgid "Mapnik Rendering" +msgstr "" + +#. Changing these values only applies before first mapnik layer is 'created' +#: ../src/vikmapniklayer.c:258 +msgid "Plugins Directory:" +msgstr "Plugin-Verzeichnis:" + +#: ../src/vikmapniklayer.c:258 ../src/vikmapniklayer.c:259 +#: ../src/vikmapniklayer.c:260 ../src/vikmapniklayer.c:261 +msgid "You need to restart Viking for a change to this value to be used" +msgstr "" + +#: ../src/vikmapniklayer.c:259 +msgid "Fonts Directory:" +msgstr "" + +#: ../src/vikmapniklayer.c:260 +msgid "Recurse Fonts Directory:" +msgstr "" + +#: ../src/vikmapniklayer.c:261 +msgid "Rerender Timeout (hours):" +msgstr "" + +#. Changeable any time +#: ../src/vikmapniklayer.c:263 +msgid "CartoCSS:" +msgstr "CartoCSS:" + +#: ../src/vikmapniklayer.c:263 +msgid "The program to convert CartoCSS files into Mapnik XML" +msgstr "" + +#: ../src/vikmapniklayer.c:506 +msgid "Running" +msgstr "In Ausführung" + +#: ../src/vikmapniklayer.c:525 +#, c-format +msgid "" +"Error running carto command:\n" +"%s" +msgstr "" + +#: ../src/vikmapniklayer.c:561 +msgid " completed in " +msgstr " abgeschlossen nach " + +#: ../src/vikmapniklayer.c:561 +msgid "seconds" +msgstr "Sekunden" + +#: ../src/vikmapniklayer.c:611 ../src/vikmapniklayer.c:979 +#, c-format +msgid "" +"Mapnik error loading configuration file:\n" +"%s" +msgstr "" + +#: ../src/vikmapniklayer.c:749 +#, c-format +msgid "Mapnik Render %d:%d:%d %s" +msgstr "" + +#: ../src/vikmapniklayer.c:840 +msgid "Mapnik Rendering must be in Mercator mode" +msgstr "" + +#: ../src/vikmapniklayer.c:997 +msgid "Mapnik Information" +msgstr "" + +#: ../src/vikmapniklayer.c:1031 +msgid "_Flush Memory Cache" +msgstr "" + +#: ../src/vikmapniklayer.c:1044 +msgid "_Run Carto Command" +msgstr "" + +#: ../src/vikmapniklayer.c:1102 ../src/vikmapslayer.c:2029 +#, c-format +msgid "Tile File Timestamp: %s" +msgstr "" + +#: ../src/vikmapniklayer.c:1105 ../src/vikmapslayer.c:2032 +msgid "Tile File Timestamp: Not Available" +msgstr "" + +#: ../src/vikmapniklayer.c:1120 +#, c-format +msgid "Rendering time %.2f seconds" +msgstr "" + +#: ../src/vikmapniklayer.c:1124 ../src/vikmapslayer.c:2042 +msgid "Tile Information" +msgstr "" + +#: ../src/vikmapniklayer.c:1145 +msgid "_Rerender Tile" +msgstr "" + +#: ../src/vikmapniklayer.c:1150 +msgid "_Info" +msgstr "_Information" + +#. ******* MAPZOOMS ******** +#: ../src/vikmapslayer.c:96 +msgid "Use Viking Zoom Level" +msgstr "Viking-Vergrößerungsstufe verwenden" + +#: ../src/vikmapslayer.c:146 +msgid "OSM" +msgstr "OSM" + +#. NB mode => id - But can't break file format just to rename something better +#: ../src/vikmapslayer.c:152 +msgid "Map Type:" +msgstr "Kartentyp" + +#: ../src/vikmapslayer.c:153 +msgid "Maps Directory:" +msgstr "Kartenverzeichnis" + +#: ../src/vikmapslayer.c:154 +msgid "Cache Layout:" +msgstr "" + +#: ../src/vikmapslayer.c:155 +msgid "This determines the tile storage layout on disk" +msgstr "" + +#: ../src/vikmapslayer.c:156 +msgid "Map File:" +msgstr "Kartendatei" + +#: ../src/vikmapslayer.c:157 +msgid "An MBTiles file. Only applies when the map type method is 'MBTiles'" +msgstr "" + +#: ../src/vikmapslayer.c:159 +msgid "Control the Alpha value for transparency effects" +msgstr "" + +#: ../src/vikmapslayer.c:160 +msgid "Autodownload maps:" +msgstr "Karten automatisch herunterladen:" + +#: ../src/vikmapslayer.c:161 +msgid "Autodownload Only Gets Missing Maps:" +msgstr "Automatisches Herunterladen holt nur fehlende Karten" + +#: ../src/vikmapslayer.c:162 +msgid "" +"Using this option avoids attempting to update already acquired tiles. This " +"can be useful if you want to restrict the network usage, without having to " +"resort to manual control. Only applies when 'Autodownload Maps' is on." +msgstr "" +"Die Verwendung dieser Einstellung verhindert Versuche, bereits vorhandene " +"Kartenteile zu aktualisieren. Das kann von Vorteil sein, da Sie den " +"Internetverkehr begrenzen können, ohne gleich auf manuelle Steuerung " +"umstellen zu müssen. Funktioniert nur in der Kombination mit 'Karten " +"automatisch herunterladen'." + +#: ../src/vikmapslayer.c:163 +msgid "Zoom Level:" +msgstr "Vergrößerungsstufe" + +#: ../src/vikmapslayer.c:164 +msgid "" +"Determines the method of displaying map tiles for the current zoom level. " +"'Viking Zoom Level' uses the best matching level, otherwise setting a fixed " +"value will always use map tiles of the specified value regardless of the " +"actual zoom level." +msgstr "" + +#: ../src/vikmapslayer.c:197 +msgid "_Maps Download" +msgstr "_Karten herunterladen" + +#: ../src/vikmapslayer.c:197 +msgid "Maps Download" +msgstr "Herunterladen von Karten" + +#: ../src/vikmapslayer.c:213 ../src/vikutils.c:895 +msgid "Map" +msgstr "Karte" + +#: ../src/vikmapslayer.c:306 +msgid "Default map layer directory:" +msgstr "Verzeichnis für Standardkarte:" + +#: ../src/vikmapslayer.c:306 +msgid "Choose a directory to store cached Map tiles for this layer" +msgstr "" +"Wählen Sie ein Verzeichnis für die zwischengespeicherten Kacheln für diese " +"Ebene" + +#: ../src/vikmapslayer.c:436 ../src/vikmapslayer.c:633 +msgid "Unknown map type" +msgstr "Unbekannter Kartentyp" + +#: ../src/vikmapslayer.c:664 +msgid "Unknown Map Zoom" +msgstr "Unbekannte Kartenvergrösserung" + +#: ../src/vikmapslayer.c:833 +#, c-format +msgid "Failed to open MBTiles file: %s" +msgstr "" + +#: ../src/vikmapslayer.c:856 +#, c-format +msgid "" +"New map cannot be displayed in the current drawmode.\n" +"Select \"%s\" from View menu to view it." +msgstr "" +"Neue Karte kann im aktuellen Zeichenmodus nicht angezeigt werden.\n" +"Wähle \"%s\" aus dem Ansichtmenü." + +#: ../src/vikmapslayer.c:1314 +#, c-format +msgid "" +"Cowardly refusing to draw tiles or existence of tiles beyond %d zoom out " +"factor" +msgstr "Schlechte Kacheldarstellung beim Herauszoomen hinter Faktor %d" + +#. TODO: ?? count up the number of download errors somehow... +#: ../src/vikmapslayer.c:1667 +msgid "Failed to download tile" +msgstr "FEhler beim Herunterladen einer Kachel" + +#: ../src/vikmapslayer.c:1673 +msgid "Unable to save tile" +msgstr "Kachel konnte nicht gespeichert werden" + +#: ../src/vikmapslayer.c:1799 +#, c-format +msgid "Redownloading up to %d %s map..." +msgid_plural "Redownloading up to %d %s maps..." +msgstr[0] "Neuladen von bis zu %d %s Karten..." +msgstr[1] "Neuladen von bis zu %d %s Karten..." + +#: ../src/vikmapslayer.c:1801 +#, c-format +msgid "Redownloading %d %s map..." +msgid_plural "Redownloading %d %s maps..." +msgstr[0] "Erneutes Herunterladen der %d %s Karte..." +msgstr[1] "Erneutes Herunterladen der %d %s Karten..." + +#: ../src/vikmapslayer.c:1805 ../src/vikmapslayer.c:1890 +#, c-format +msgid "Downloading %d %s map..." +msgid_plural "Downloading %d %s maps..." +msgstr[0] "Herunterladen der %d %s Karte..." +msgstr[1] "Erneutes Herunterladen der %d %s Karten..." + +#: ../src/vikmapslayer.c:1969 +msgid "YES" +msgstr "Ja" + +#: ../src/vikmapslayer.c:1973 ../src/vikmapslayer.c:1977 +msgid "NO" +msgstr "Nein" + +#. NB Also handles .jpg automatically due to pixbuf_new_from () support - although just print png for now. +#: ../src/vikmapslayer.c:1980 +#, c-format +msgid "Source: %s (%d%s%d%s%d.%s %s)" +msgstr "" + +#: ../src/vikmapslayer.c:1983 +msgid "Source: Not available" +msgstr "Quelle: Nicht verfügbar" + +#: ../src/vikmapslayer.c:2000 +#, fuzzy +msgid "Source: file://" +msgstr "Quelle: Nicht verfügbar" + +#: ../src/vikmapslayer.c:2012 +#, c-format +msgid "Source: %s" +msgstr "" + +#: ../src/vikmapslayer.c:2038 +#, fuzzy, c-format +msgid "Tile File: %s [Not Available]" +msgstr "Keine DEM Datei verfügbar" + +#: ../src/vikmapslayer.c:2086 +msgid "Redownload _Bad Map(s)" +msgstr "_Fehlerhafte Karte(n) erneut laden" + +#: ../src/vikmapslayer.c:2090 +msgid "Redownload _New Map(s)" +msgstr "_Neue Karte(n) erneut laden" + +#: ../src/vikmapslayer.c:2094 +msgid "Redownload _All Map(s)" +msgstr "_Alle Karten neu laden" + +#: ../src/vikmapslayer.c:2099 +msgid "_Show Tile Information" +msgstr "_Zeige Kachel Informationen" + +#: ../src/vikmapslayer.c:2166 +#, c-format +msgid "" +"Wrong drawmode for this map.\n" +"Select \"%s\" from View menu and try again." +msgstr "" +"Falscher Zeichenmodus für diese Karte.\n" +"Wähle \"%s\" aus dem Ansichtmenü und versuche es neu." + +#: ../src/vikmapslayer.c:2171 +msgid "Wrong zoom level for this map." +msgstr "Falsche Vergrößerungsstufe für diese Karte." + +#: ../src/vikmapslayer.c:2334 +msgid "Zoom Start:" +msgstr "Vergrösserung-Start" + +#: ../src/vikmapslayer.c:2341 +msgid "Zoom End:" +msgstr "Vergrösserung-Ende" + +#: ../src/vikmapslayer.c:2347 +msgid "Download Maps Method:" +msgstr "Methode für das Herunterladen von Karten:" + +#. redownload method - needs to align with REDOWNLOAD* macro values +#: ../src/vikmapslayer.c:2419 +msgid "Missing" +msgstr "Fehlt" + +#: ../src/vikmapslayer.c:2419 +msgid "Bad" +msgstr "Schlecht" + +#: ../src/vikmapslayer.c:2419 +msgid "New" +msgstr "Neu" + +#: ../src/vikmapslayer.c:2419 +msgid "Reload All" +msgstr "Alle neu laden" + +#: ../src/vikmapslayer.c:2421 +msgid "Download for Zoom Levels" +msgstr "Alle Vergrößerungsstufen herunterladen" + +#: ../src/vikmapslayer.c:2461 +#, c-format +msgid "" +"You are not allowed to download more than %d tiles in one go (requested %d)" +msgstr "" +"Es dürfen nicht mehr als %d Kacheln auf ein Mal runtergeladen werden " +"(angefordert sind %d)" + +#: ../src/vikmapslayer.c:2469 +#, c-format +msgid "Do you really want to download %d tiles?" +msgstr "Wollen Sie wirklich %d Kacheln runterladen?" + +#. Now with icons +#: ../src/vikmapslayer.c:2509 +msgid "Download _Missing Onscreen Maps" +msgstr "_Fehlende Bildschirmkarte laden" + +#: ../src/vikmapslayer.c:2516 +msgid "Download _New Onscreen Maps" +msgstr "_Neue Bildschirmkarte laden" + +#: ../src/vikmapslayer.c:2523 +msgid "Reload _All Onscreen Maps" +msgstr "Alle _Bildschirmkarten erneut laden" + +#: ../src/vikmapslayer.c:2529 +msgid "Download Maps in _Zoom Levels..." +msgstr "Herunterladen in den _Vergrößerungsstufen ..." + +#: ../src/vikmapslayer.c:2539 +#, fuzzy +msgid "_Open MBTiles Files" +msgstr "Datei öffnen" + +#: ../src/vikmapslayer.c:2554 +msgid "Flush Map Cache" +msgstr "" + +#: ../src/vikrouting.c:54 +msgid "Default engine:" +msgstr "Standard engine:" + +#: ../src/vikrouting.c:68 +msgid "Routing" +msgstr "" + +#: ../src/viktreeview.c:347 +msgid "Layer Name" +msgstr "Name der Ebene" + +#: ../src/viktreeview.c:924 +#, c-format +msgid "delete data from %s\n" +msgstr "Daten von %s löschen\n" + +#: ../src/viktrwlayer.c:427 +msgid "Create _Waypoint" +msgstr "_Wegpunkt erzeugen" + +#: ../src/viktrwlayer.c:427 +msgid "Create Waypoint" +msgstr "Weg_punkt erstellen" + +#: ../src/viktrwlayer.c:437 +#, fuzzy +msgid "Edit _Track" +msgstr "Spurpun_kt bearbeiten" + +#: ../src/viktrwlayer.c:437 +#, fuzzy +msgid "Edit Track" +msgstr "Spurpun_kt bearbeiten" + +#: ../src/viktrwlayer.c:449 +#, fuzzy +msgid "Edit _Route" +msgstr "Route hinzufügen" + +#: ../src/viktrwlayer.c:449 +#, fuzzy +msgid "Edit Route" +msgstr "Route hinzufügen" + +#: ../src/viktrwlayer.c:460 +msgid "Route _Finder" +msgstr "Routen_planer" + +#: ../src/viktrwlayer.c:460 +msgid "Route Finder" +msgstr "Routensuche" + +#: ../src/viktrwlayer.c:471 +#, fuzzy +msgid "Splitter" +msgstr "Hier auftrennen" + +#: ../src/viktrwlayer.c:482 +msgid "_Edit Waypoint" +msgstr "Wegpunkt b_earbeiten" + +#: ../src/viktrwlayer.c:482 +msgid "Edit Waypoint" +msgstr "Wegpunkt _bearbeiten" + +#: ../src/viktrwlayer.c:495 +msgid "Edit Trac_kpoint" +msgstr "Trac_kpunkt bearbeiten" + +#: ../src/viktrwlayer.c:495 +msgid "Edit Trackpoint" +msgstr "Spurpun_kt bearbeiten" + +#. a pixbuf for this one is already made globally available +#: ../src/viktrwlayer.c:508 +msgid "Show P_icture" +msgstr "B_ild anzeigen" + +#: ../src/viktrwlayer.c:508 +msgid "Show Picture" +msgstr "Bild _anzeigen" + +#: ../src/viktrwlayer.c:531 +msgid "Waypoint Images" +msgstr "Wegpunkt-Bilder" + +#: ../src/viktrwlayer.c:531 +msgid "Tracks Advanced" +msgstr "" + +#: ../src/viktrwlayer.c:531 +msgid "Metadata" +msgstr "Metadaten" + +#: ../src/viktrwlayer.c:531 +#, fuzzy +msgid "Filesystem" +msgstr "Dateityp:" + +#: ../src/viktrwlayer.c:534 +msgid "Draw by Track" +msgstr "Von Spur gezeichnet" + +#: ../src/viktrwlayer.c:534 +msgid "Draw by Speed" +msgstr "Zeichne nach Geschwindigkeit" + +#: ../src/viktrwlayer.c:534 +msgid "All Tracks Same Color" +msgstr "Alle Spuren mit der gleichen Farbe" + +#: ../src/viktrwlayer.c:535 +msgid "Filled Square" +msgstr "Rechteck ausgefüllt" + +#: ../src/viktrwlayer.c:535 +msgid "Square" +msgstr "Quadrat" + +#: ../src/viktrwlayer.c:535 +msgid "Circle" +msgstr "Kreis" + +#: ../src/viktrwlayer.c:535 +msgid "X" +msgstr "X" + +#: ../src/viktrwlayer.c:561 +msgid "Extra Extra Small" +msgstr "Sehr sehr klein" + +#: ../src/viktrwlayer.c:562 +msgid "Extra Small" +msgstr "Sehr klein" + +#: ../src/viktrwlayer.c:566 +msgid "Extra Large" +msgstr "Sehr groß" + +#: ../src/viktrwlayer.c:567 +msgid "Extra Extra Large" +msgstr "Sehr sehr groß" + +#: ../src/viktrwlayer.c:573 +msgid "Name Ascending" +msgstr "Name aufsteigend" + +#: ../src/viktrwlayer.c:574 +msgid "Name Descending" +msgstr "Name absteigend" + +#: ../src/viktrwlayer.c:582 ../src/viktrwlayer_propwin.c:3319 +msgid "No" +msgstr "Nein" + +#: ../src/viktrwlayer.c:583 +msgid "Yes" +msgstr "" + +#: ../src/viktrwlayer.c:584 +msgid "No write" +msgstr "" + +#: ../src/viktrwlayer.c:649 ../src/viktrwlayer.c:673 +msgid "Draw Labels" +msgstr "Beschriftungen zeichnen" + +#: ../src/viktrwlayer.c:650 +msgid "Note: the individual track controls what labels may be displayed" +msgstr "" + +#: ../src/viktrwlayer.c:651 +msgid "Track Labels Font Size:" +msgstr "Fontgrösse der Trackbeschriftungen" + +#: ../src/viktrwlayer.c:652 +msgid "Track Drawing Mode:" +msgstr "Spur-Zeichenmodus" + +#: ../src/viktrwlayer.c:653 +msgid "All Tracks Color:" +msgstr "Alle Spuren-Farbe:" + +#: ../src/viktrwlayer.c:654 +msgid "The color used when 'All Tracks Same Color' drawing mode is selected" +msgstr "" + +#: ../src/viktrwlayer.c:655 +msgid "Draw Track Lines" +msgstr "Spurlinien zeichnen" + +#: ../src/viktrwlayer.c:656 +msgid "Track Thickness:" +msgstr "Spur-Dicke:" + +#: ../src/viktrwlayer.c:657 +msgid "Draw Track Direction" +msgstr "Zeichne die Track Richtung" + +#: ../src/viktrwlayer.c:658 +msgid "Direction Size:" +msgstr "Verzeichnis-Grösse:" + +#: ../src/viktrwlayer.c:659 +msgid "Draw Trackpoints" +msgstr "Spurpunkte zeichnen" + +#: ../src/viktrwlayer.c:660 +msgid "Trackpoint Size:" +msgstr "Trackpunkte-Grösse:" + +#: ../src/viktrwlayer.c:661 +msgid "Draw Elevation" +msgstr "Steigungen zeichnen" + +#: ../src/viktrwlayer.c:662 +msgid "Draw Elevation Height %:" +msgstr "Steigungshöhe zeichnen %:" + +#: ../src/viktrwlayer.c:663 +msgid "Draw Stops" +msgstr "Stopps zeichnen" + +#: ../src/viktrwlayer.c:664 +msgid "" +"Whether to draw a marker when trackpoints are at the same position but over " +"the minimum stop length apart in time" +msgstr "" + +#: ../src/viktrwlayer.c:665 +msgid "Min Stop Length (seconds):" +msgstr "Minimale Stopp-Dauer (Sekunden):" + +#: ../src/viktrwlayer.c:667 +msgid "Track BG Thickness:" +msgstr "Spur-Hintergrund-Dicke:" + +#: ../src/viktrwlayer.c:668 +msgid "Track Background Color" +msgstr "Spur-Hintergrundfarbe:" + +#: ../src/viktrwlayer.c:669 +msgid "Draw by Speed Factor (%):" +msgstr "Zeichne nach Geschwindigkeitfaktor (%):" + +#: ../src/viktrwlayer.c:670 +msgid "" +"The percentage factor away from the average speed determining the color used" +msgstr "" + +#: ../src/viktrwlayer.c:671 +msgid "Track Sort Order:" +msgstr "Track Sortierreihenfolge:" + +#: ../src/viktrwlayer.c:674 +msgid "Waypoint Font Size:" +msgstr "Wegpunkt-Schriftgrösse:" + +#: ../src/viktrwlayer.c:675 +msgid "Waypoint Color:" +msgstr "Wegpunkt-Farbe:" + +#: ../src/viktrwlayer.c:676 +msgid "Waypoint Text:" +msgstr "Wegpunkt-Text:" + +#: ../src/viktrwlayer.c:677 +msgid "Background:" +msgstr "Hintergrund:" + +#: ../src/viktrwlayer.c:678 +msgid "Fake BG Color Translucency:" +msgstr "Falsche Hintergrund-Farbdurchsichtigkeit:" + +#: ../src/viktrwlayer.c:679 +msgid "Waypoint marker:" +msgstr "Wegpunkt-Markierung" + +#: ../src/viktrwlayer.c:680 +msgid "Waypoint size:" +msgstr "Wegpunkt-Grösse:" + +#: ../src/viktrwlayer.c:681 +msgid "Draw Waypoint Symbols:" +msgstr "Wegpunkt-Symbol zeichnen:" + +#: ../src/viktrwlayer.c:682 +msgid "Waypoint Sort Order:" +msgstr "Wegpunkt Sortierreihenfolge:" + +#: ../src/viktrwlayer.c:684 +msgid "Draw Waypoint Images" +msgstr "Wegpunkt-Bild zeichnen:" + +#: ../src/viktrwlayer.c:685 +msgid "Image Size (pixels):" +msgstr "Bild-Grösse (Pixel):" + +#: ../src/viktrwlayer.c:686 +msgid "Image Alpha:" +msgstr "Bild Alpha-Wert:" + +#: ../src/viktrwlayer.c:687 +msgid "Image Memory Cache Size:" +msgstr "Bildspeicher Puffergröße:" + +#: ../src/viktrwlayer.c:690 +msgid "Author" +msgstr "Autor" + +#: ../src/viktrwlayer.c:691 +msgid "Creation Time" +msgstr "Angelegt am" + +#: ../src/viktrwlayer.c:692 +msgid "Keywords" +msgstr "Schlüsselwörter" + +#: ../src/viktrwlayer.c:693 +msgid "External layer:" +msgstr "" + +#: ../src/viktrwlayer.c:693 +msgid "" +"Layer data stored in the Viking file, in an external file, or in an external " +"file but changes are not written to the file (file only loaded at startup)" +msgstr "" + +#: ../src/viktrwlayer.c:694 +msgid "Save layer as:" +msgstr "" + +#: ../src/viktrwlayer.c:694 +msgid "Specify where layer should be saved. Overwrites file if it exists." +msgstr "" + +#: ../src/viktrwlayer.c:798 +msgid "TrackWaypoint" +msgstr "TrackWegpunkt" + +#: ../src/viktrwlayer.c:1999 ../src/viktrwlayer_propwin.c:1469 +#: ../src/viktrwlayer_propwin.c:1471 ../src/vikutils.c:299 +#: ../src/vikutils.c:326 +msgid "miles" +msgstr "Meilen" + +#: ../src/viktrwlayer.c:2002 ../src/viktrwlayer_propwin.c:1475 +#: ../src/viktrwlayer_propwin.c:1477 ../src/vikutils.c:303 +#: ../src/vikutils.c:330 +msgid "NM" +msgstr "" + +#. VIK_UNITS_DISTANCE_KILOMETRES: +#: ../src/viktrwlayer.c:2006 ../src/viktrwlayer_propwin.c:1482 +#: ../src/viktrwlayer_propwin.c:1484 ../src/vikutils.c:308 +#: ../src/vikutils.c:335 +msgid "km" +msgstr "km" + +#: ../src/viktrwlayer.c:2121 +msgid "start/end" +msgstr "Start/Ende" + +#: ../src/viktrwlayer.c:2133 +msgid "start" +msgstr "Start" + +#: ../src/viktrwlayer.c:2142 +msgid "end" +msgstr "Ende" + +#: ../src/viktrwlayer.c:3103 +#, c-format +msgid " in %d:%02d hrs:mins" +msgstr " in %d:%02d hh:mm" + +#: ../src/viktrwlayer.c:3107 +#, c-format +msgid "" +"\n" +"%sTotal Length %.1f %s%s" +msgstr "" +"\n" +"%s Gesamtlänge %.1f %s%s" + +#: ../src/viktrwlayer.c:3131 +#, c-format +msgid "" +"\n" +"Total route length %.1f %s" +msgstr "" +"\n" +"Routengesamtlänge %.1f %s" + +#: ../src/viktrwlayer.c:3136 +#, c-format +msgid "Tracks: %d - Waypoints: %d - Routes: %d%s%s" +msgstr "Spuren: %d - Wegpunkte: %d - Routen: %d%s%s" + +#: ../src/viktrwlayer.c:3155 +#, c-format +msgid "Tracks: %d" +msgstr "Spuren: %d" + +#: ../src/viktrwlayer.c:3165 +#, c-format +msgid "Routes: %d" +msgstr "Routen: %d" + +#: ../src/viktrwlayer.c:3195 +#, c-format +msgid "- %d:%02d hrs:mins" +msgstr "- %d:%02d hh:mm" + +#: ../src/viktrwlayer.c:3202 +#, c-format +msgid "%s%.1f km %s" +msgstr "%s%.1f km %s" + +#: ../src/viktrwlayer.c:3205 +#, c-format +msgid "%s%.1f miles %s" +msgstr "%s%.1f Meilen %s" + +#: ../src/viktrwlayer.c:3208 +#, c-format +msgid "%s%.1f NM %s" +msgstr "" + +#: ../src/viktrwlayer.c:3222 +#, c-format +msgid "Waypoints: %d" +msgstr "Wegpunkte: %d" + +#: ../src/viktrwlayer.c:3279 +#, c-format +msgid "Wpt: Alt %dft" +msgstr "Wpt: Höhe %d ft" + +#. VIK_UNITS_HEIGHT_METRES: +#: ../src/viktrwlayer.c:3283 +#, c-format +msgid "Wpt: Alt %dm" +msgstr "Wpt: Höhe %d m" + +#. Add comment if available +#: ../src/viktrwlayer.c:3298 +#, c-format +msgid "%s | %s %s | Comment: %s" +msgstr "%s | %s %s | Kommentar: %s" + +#: ../src/viktrwlayer.c:3300 +#, c-format +msgid "%s | %s %s" +msgstr "%s | %s %s" + +#: ../src/viktrwlayer.c:3562 ../src/viktrwlayer.c:3591 +msgid "This layer has no waypoints or trackpoints." +msgstr "Diese Ebene hat keine Wegpunkte oder Spurpunkte." + +#: ../src/viktrwlayer.c:3598 ../src/viktrwlayer.c:3607 +#: ../src/viktrwlayer.c:3616 ../src/viktrwlayer.c:3625 +#: ../src/viktrwlayer.c:3634 ../src/viktrwlayer.c:3642 +msgid "Export Layer" +msgstr "Ebene exportieren" + +#: ../src/viktrwlayer.c:3671 +msgid "Export Route as GPX" +msgstr "Route als GPX exportieren" + +#: ../src/viktrwlayer.c:3673 +msgid "Export Track as GPX" +msgstr "Exportiere Spur als GPX" + +#: ../src/viktrwlayer.c:3693 +msgid "Find" +msgstr "Suche" + +#: ../src/viktrwlayer.c:3703 +msgid "Waypoint Name:" +msgstr "Wegpunkt-Name:" + +#: ../src/viktrwlayer.c:3720 +msgid "Waypoint not found in this layer." +msgstr "Wegpunkt nicht in dieser Ebene gefunden" + +#: ../src/viktrwlayer.c:3989 +msgid "Can not upload invisible track." +msgstr "Unsichtbare Spuren können nicht hochgeladen werden." + +#: ../src/viktrwlayer.c:4082 ../src/viktrwlayer.c:10512 +msgid "Track" +msgstr "Spur" + +#: ../src/viktrwlayer.c:4107 ../src/viktrwlayer.c:10599 +msgid "Route" +msgstr "Route" + +#: ../src/viktrwlayer.c:4194 +msgid "Externa_l" +msgstr "" + +#: ../src/viktrwlayer.c:4216 ../src/viktrwlayer.c:8456 +#: ../src/viktrwlayer.c:8574 +msgid "_Finish Route" +msgstr "Route _abschliessen" + +#: ../src/viktrwlayer.c:4218 ../src/viktrwlayer.c:8380 +#: ../src/viktrwlayer.c:8572 +msgid "_Finish Track" +msgstr "Spur _abschliessen" + +#. Now with icons +#: ../src/viktrwlayer.c:4230 +msgid "_View Layer" +msgstr "_Ebene anzeigen" + +#: ../src/viktrwlayer.c:4237 +msgid "V_iew" +msgstr "Ans_icht" + +#: ../src/viktrwlayer.c:4243 +msgid "View All _Tracks" +msgstr "Alle _Spuren ansehen" + +#: ../src/viktrwlayer.c:4248 +msgid "View All _Routes" +msgstr "Alle _Routen ansehen" + +#: ../src/viktrwlayer.c:4253 +msgid "View All _Waypoints" +msgstr "Alle _Wegpunkte ansehen" + +#: ../src/viktrwlayer.c:4258 +msgid "_Goto Center of Layer" +msgstr "_Zentriere Ebene" + +#: ../src/viktrwlayer.c:4264 ../src/viktrwlayer.c:8321 +msgid "Goto _Waypoint..." +msgstr "Gehe _zum Wegpunkt..." + +#: ../src/viktrwlayer.c:4270 +msgid "_Export Layer" +msgstr "_Exportiere Ebene" + +#: ../src/viktrwlayer.c:4276 +msgid "Export as GPS_Point..." +msgstr "E_xportiere als Spurpunkt..." + +#: ../src/viktrwlayer.c:4281 +msgid "Export as GPS_Mapper..." +msgstr "Ex_portiere als GPS-Kartierer..." + +#: ../src/viktrwlayer.c:4286 +msgid "Export as _GPX..." +msgstr "Exportiere als _GPX..." + +#: ../src/viktrwlayer.c:4292 +msgid "Export as _KML..." +msgstr "Exportiere als _KML..." + +#: ../src/viktrwlayer.c:4299 +msgid "Export as GEO_JSON..." +msgstr "Route als GEO_JSON exportieren ..." + +#: ../src/viktrwlayer.c:4306 +msgid "Export via GPSbabel..." +msgstr "Mit GPSBabel exportieren ..." + +#: ../src/viktrwlayer.c:4312 +#, c-format +msgid "Open with External Program_1: %s" +msgstr "Mit externem Programm_1 öffnen: %s" + +#: ../src/viktrwlayer.c:4319 +#, c-format +msgid "Open with External Program_2: %s" +msgstr "Mit externem Programm_2 öffnen: %s" + +#: ../src/viktrwlayer.c:4327 ../src/vikwindow.c:4825 +msgid "_New" +msgstr "_Neu" + +#: ../src/viktrwlayer.c:4333 +msgid "New _Waypoint..." +msgstr "Neuer _Wegpunkt ..." + +#: ../src/viktrwlayer.c:4339 +msgid "New _Track" +msgstr "Neue _Spur" + +#: ../src/viktrwlayer.c:4347 +msgid "New _Route" +msgstr "Neue _Route" + +#: ../src/viktrwlayer.c:4356 ../src/viktrwlayer.c:8232 +#: ../src/viktrwlayer.c:9003 +msgid "Geotag _Images..." +msgstr "_Kartenreferenzierte Bilder..." + +#: ../src/viktrwlayer.c:4363 +msgid "_Acquire" +msgstr "_Holen" + +#: ../src/viktrwlayer.c:4369 ../src/vikwindow.c:4904 +msgid "From _GPS..." +msgstr "Von _GPS-Gerät..." + +#. FIXME: only add menu when at least a routing engine has support for Directions +#: ../src/viktrwlayer.c:4375 +msgid "From _Directions..." +msgstr "" + +#: ../src/viktrwlayer.c:4381 +msgid "From _OSM Traces..." +msgstr "Von _OSM-Spuren..." + +#: ../src/viktrwlayer.c:4386 +msgid "From _My OSM Traces..." +msgstr "" + +#: ../src/viktrwlayer.c:4392 ../src/vikwindow.c:4844 +msgid "From _URL..." +msgstr "" + +#: ../src/viktrwlayer.c:4399 ../src/vikwindow.c:4846 +msgid "From _Wikipedia Waypoints" +msgstr "Von _Wikipedia-Wegpunkte" + +#: ../src/viktrwlayer.c:4405 +msgid "Within _Layer Bounds" +msgstr "_Innerhalb Ebenenbegrenzung" + +#: ../src/viktrwlayer.c:4411 +msgid "Within _Current View" +msgstr "Innerhalb _aktueller Ansicht" + +#: ../src/viktrwlayer.c:4419 +msgid "From Geo_caching..." +msgstr "Von Geo-_Caching..." + +#: ../src/viktrwlayer.c:4426 ../src/vikwindow.c:4842 +msgid "From Geotagged _Images..." +msgstr "Von georeferenzierten _Bildern..." + +#: ../src/viktrwlayer.c:4433 +msgid "From _File..." +msgstr "Aus _Datei ..." + +#: ../src/viktrwlayer.c:4436 ../src/vikwindow.c:4905 +msgid "Import File With GPS_Babel..." +msgstr "Importiere Datei mit GPS_Babel..." + +#: ../src/viktrwlayer.c:4443 ../src/viktrwlayer.c:8905 +msgid "_Upload" +msgstr "_Hochladen" + +#: ../src/viktrwlayer.c:4449 +msgid "Upload to _GPS..." +msgstr "Auf _GPS hochladen ..." + +#: ../src/viktrwlayer.c:4456 ../src/viktrwlayer.c:8973 +msgid "Upload to _OSM..." +msgstr "Nach OSM _hochladen..." + +#: ../src/viktrwlayer.c:4464 +msgid "De_lete" +msgstr "_Löschen" + +#: ../src/viktrwlayer.c:4470 +msgid "Delete All _Tracks" +msgstr "_Alle GPS-Spuren löschen" + +#: ../src/viktrwlayer.c:4477 +msgid "Delete Tracks _From Selection..." +msgstr "Ge_wählte GPS-Spuren löschen..." + +#: ../src/viktrwlayer.c:4484 ../src/viktrwlayer.c:8481 +msgid "Delete _All Routes" +msgstr "_Alle Routen löschen" + +#: ../src/viktrwlayer.c:4491 ../src/viktrwlayer.c:8487 +msgid "_Delete Routes From Selection..." +msgstr "" + +#: ../src/viktrwlayer.c:4498 +msgid "Delete All _Waypoints" +msgstr "Alle Weg_punkte löschen" + +#: ../src/viktrwlayer.c:4505 +msgid "Delete Waypoints From _Selection..." +msgstr "Gewählte Wegpun_kte löschen..." + +#: ../src/viktrwlayer.c:4512 ../src/viktrwlayer.c:8339 +#, fuzzy +msgid "Delete Duplicate Waypoints" +msgstr "Doppelte Wegpunkte entfernen" + +#: ../src/viktrwlayer.c:5198 +#, c-format +msgid "Are you sure you want to delete all tracks in %s?" +msgstr "Sind sich sicher, dass sie alle GPS-Spuren in %s löschen wollen?" + +#: ../src/viktrwlayer.c:5211 +#, c-format +msgid "Are you sure you want to delete all routes in %s?" +msgstr "Sie Sie sicher, dass Sie alle Routen in %s löschen wollen?" + +#: ../src/viktrwlayer.c:5221 +#, c-format +msgid "Are you sure you want to delete all waypoints in %s?" +msgstr "Sind sich sicher, dass sie alle Wegpunkte in %s löschen wollen?" + +#: ../src/viktrwlayer.c:5238 +#, c-format +msgid "Are you sure you want to delete the waypoint \"%s\"?" +msgstr "Sie Sie sicher, dass Sie alle Wegpunkte in \"%s\" löschen wollen?" + +#: ../src/viktrwlayer.c:5254 +#, c-format +msgid "Are you sure you want to delete the track \"%s\"?" +msgstr "Soll die Spur \"%s\" wirklich gelöscht werden?" + +#: ../src/viktrwlayer.c:5271 +#, c-format +msgid "Are you sure you want to delete the route \"%s\"?" +msgstr "Sind Sie sicher, dass Sie die Route \"%s\" löschen wollen?" + +#: ../src/viktrwlayer.c:5527 ../src/viktrwlayer.c:6373 +msgid "" +"Converting a track to a route removes extra track data such as segments, " +"timestamps, etc...\n" +"Do you want to continue?" +msgstr "" +"Bei der Umwandlung einer Spur in eine Route werden mit dem Track verknüpfte " +"Daten wie Segmente, Zeitstempel, usw. entfernt. \n" +"Möchten Sie fortfahren?" + +#: ../src/viktrwlayer.c:5631 +msgid "No DEM layers available, thus no DEM values can be applied." +msgstr "" +"Es ist keine DEM Ebene vorhangen. Somit können keine DEM Werte angewendet " +"werden." + +#: ../src/viktrwlayer.c:5651 ../src/viktrwlayer.c:5692 +#, c-format +msgid "%ld point adjusted" +msgid_plural "%ld points adjusted" +msgstr[0] "%ld Punkt angepasst" +msgstr[1] "%ld Punkte angepasst" + +#: ../src/viktrwlayer.c:5736 +#, c-format +msgid "%ld waypoint changed" +msgid_plural "%ld waypoints changed" +msgstr[0] "%ld Wegpunkt angepasst" +msgstr[1] "%ld Wegpunkte angepasst" + +#: ../src/viktrwlayer.c:5917 +#, c-format +msgid "" +"Refining a track with many points (%d) is unlikely to yield sensible " +"results. Do you want to Continue?" +msgstr "" + +#. Select engine from dialog +#: ../src/viktrwlayer.c:5925 +msgid "Refine Route with Routing Engine..." +msgstr "Route mit Routenplaner ermitteln..." + +#: ../src/viktrwlayer.c:5933 +msgid "Select routing engine" +msgstr "Routenplaner auswählen" + +#: ../src/viktrwlayer.c:6158 +msgid "Failed. No other tracks with timestamps in this layer found" +msgstr "" +"Fehler: Keine weiteren GPS-Spuren mit Zeitstempel in dieser Ebene gefunden" + +#: ../src/viktrwlayer.c:6160 +msgid "Failed. No other tracks without timestamps in this layer found" +msgstr "" +"Fehler: Keine weiteren GPS-Spuren ohne Zeitstempel in dieser Ebene gefunden" + +#: ../src/viktrwlayer.c:6179 +msgid "Merge with..." +msgstr "Vereinen mit..." + +#: ../src/viktrwlayer.c:6180 +msgid "Select route to merge with" +msgstr "Route zum Zusammenführen auswählen" + +#: ../src/viktrwlayer.c:6180 +msgid "Select track to merge with" +msgstr "Spur auswählen zum Zusammenfügen mit" + +#: ../src/viktrwlayer.c:6264 ../src/viktrwlayer.c:6346 +msgid "Append Route" +msgstr "Route anhängen" + +#: ../src/viktrwlayer.c:6264 ../src/viktrwlayer.c:6346 +msgid "Append Track" +msgstr "Spur anhängen" + +#: ../src/viktrwlayer.c:6265 +msgid "Select the route to append after the current route" +msgstr "Route zum Anhängen an aktuelle Route auswählen" + +#: ../src/viktrwlayer.c:6266 +msgid "Select the track to append after the current track" +msgstr "Spur auswählen, die an die aktuelle Spur angehängt werden soll" + +#: ../src/viktrwlayer.c:6347 +msgid "Select the track to append after the current route" +msgstr "Spur auswählen, die an die aktuelle Route angehängt werden soll" + +#: ../src/viktrwlayer.c:6348 +msgid "Select the route to append after the current track" +msgstr "Route zum Anhängen an aktuellen Track auswählen" + +#: ../src/viktrwlayer.c:6414 +#, c-format +msgid "%d segment merged" +msgid_plural "%d segments merged" +msgstr[0] "" +msgstr[1] "" + +#: ../src/viktrwlayer.c:6430 +msgid "Failed. This track does not have timestamp" +msgstr "Fehlgeschlagen. Diese Spur hat keine Zeitstempel" + +#: ../src/viktrwlayer.c:6442 +msgid "Failed. No other track in this layer has timestamp" +msgstr "Fehlgeschlagen. Keine andere Spur in dieser Ebene hat Zeitstempel" + +#: ../src/viktrwlayer.c:6449 +msgid "Merge Threshold..." +msgstr "Vereine bei Grenzwert..." + +#: ../src/viktrwlayer.c:6450 +msgid "Merge when time between tracks less than:" +msgstr "Zusammenfassen, wenn Dauer zwischen Spuren kleiner als:" + +#: ../src/viktrwlayer.c:6580 +msgid "Split Threshold..." +msgstr "Bei Schwellwert trennen..." + +#: ../src/viktrwlayer.c:6581 +msgid "Split when time between trackpoints exceeds:" +msgstr "Trennen, wenn Dauer zwischen Spurpunkten grösser als:" + +#: ../src/viktrwlayer.c:6598 +#, c-format +msgid "" +"Can not split track due to trackpoints not ordered in time - such as at %s.\n" +"\n" +"Goto this trackpoint?" +msgstr "" + +#: ../src/viktrwlayer.c:6668 +msgid "Split Every Nth Point" +msgstr "Trenne jeden n'ten Punkt" + +#: ../src/viktrwlayer.c:6669 +msgid "Split on every Nth point:" +msgstr "Trenne auf dem n'ten Punkt" + +#: ../src/viktrwlayer.c:6779 +msgid "Can not split track as it has no segments" +msgstr "Die Spur kann nicht geteilt werden, da sie keine Segmente hat" + +#: ../src/viktrwlayer.c:6861 ../src/viktrwlayer.c:6891 +#, c-format +msgid "Deleted %ld point" +msgid_plural "Deleted %ld points" +msgstr[0] "" +msgstr[1] "" + +#: ../src/viktrwlayer.c:6966 ../src/viktrwlayer.c:10989 +#: ../src/viktrwlayer_waypointlist.c:214 +#, c-format +msgid "Could not launch %s to open file." +msgstr "Konnte %s nicht zum Dateiöffnen starten." + +#: ../src/viktrwlayer.c:6992 ../src/viktrwlayer.c:7113 +msgid "This track has no date information." +msgstr "Diese GPS-Spur hat keine Zeitinformation." + +#: ../src/viktrwlayer.c:7006 ../src/viktrwlayer.c:7136 +msgid "This waypoint has no date information." +msgstr "Dieser Wegpunkt hat keine Zeitinformation." + +#: ../src/viktrwlayer.c:7030 +#, c-format +msgid "Could not launch %s" +msgstr "Konnte %s nicht starten" + +#: ../src/viktrwlayer.c:7269 +msgid "Internal Error in vik_trw_layer_uniquify_tracks" +msgstr "" + +#: ../src/viktrwlayer.c:7374 ../src/viktrwlayer.c:7424 +#: ../src/viktrwlayer.c:7587 +msgid "" +"Multiple entries with the same name exist. This method only works with " +"unique names. Force unique names now?" +msgstr "" + +#: ../src/viktrwlayer.c:7385 +msgid "No tracks found" +msgstr "Keine GPS-Spuren gefunden" + +#: ../src/viktrwlayer.c:7393 ../src/viktrwlayer.c:7443 +#: ../src/viktrwlayer.c:7607 +msgid "Delete Selection" +msgstr "Auswahl löschen" + +#: ../src/viktrwlayer.c:7394 +msgid "Select tracks to delete" +msgstr "GPS-Spuren zum Löschen auswählen" + +#: ../src/viktrwlayer.c:7435 +msgid "No routes found" +msgstr "Keine Route gefunden" + +#: ../src/viktrwlayer.c:7444 +msgid "Select routes to delete" +msgstr "Route zum Löschen auswählen" + +#: ../src/viktrwlayer.c:7550 +msgid "Internal Error in vik_trw_layer_uniquify_waypoints" +msgstr "" + +#: ../src/viktrwlayer.c:7597 +msgid "No waypoints found" +msgstr "Keine Wegpunkte gefunden" + +#: ../src/viktrwlayer.c:7608 +msgid "Select waypoints to delete" +msgstr "Wegpunkte zum Löschen auswählen" + +#: ../src/viktrwlayer.c:7691 +#, fuzzy, c-format +msgid "%ld waypoint deleted" +msgid_plural "%ld waypoints deleted" +msgstr[0] "%ld Wegpunkt angepasst" +msgstr[1] "%ld Wegpunkte angepasst" + +#: ../src/viktrwlayer.c:7697 +#, fuzzy +msgid "No duplicates found" +msgstr "Keine Route gefunden" + +#: ../src/viktrwlayer.c:8028 +#, c-format +msgid "" +"A waypoint with the name \"%s\" already exists. Really rename to the same " +"name?" +msgstr "" +"Ein Wegpunkt mit dem Namen \"%s\" existiert bereits. Wollen Sie wirklich mit " +"dem gleichen Namen umbenennen?" + +#: ../src/viktrwlayer.c:8058 +#, c-format +msgid "" +"A track with the name \"%s\" already exists. Really rename to the same name?" +msgstr "" + +#: ../src/viktrwlayer.c:8095 +#, c-format +msgid "" +"A route with the name \"%s\" already exists. Really rename to the same name?" +msgstr "" + +#: ../src/viktrwlayer.c:8215 ../src/viktrwlayer.c:8602 +msgid "_Goto" +msgstr "_Gehe zu" + +#: ../src/viktrwlayer.c:8226 +msgid "_Visit Geocache Webpage" +msgstr "Zur Geocache _Internetseite" + +#: ../src/viktrwlayer.c:8235 +msgid "Geotag multiple images against this waypoint" +msgstr "" + +#: ../src/viktrwlayer.c:8245 ../src/viktrwlayer_waypointlist.c:352 +msgid "_Show Picture..." +msgstr "Bild _anzeigen..." + +#: ../src/viktrwlayer.c:8253 +msgid "Update Geotag on _Image" +msgstr "Geotag über _Bild aktualisieren" + +#: ../src/viktrwlayer.c:8259 +msgid "_Update" +msgstr "_Aktualisieren" + +#: ../src/viktrwlayer.c:8264 +msgid "Update and _Keep File Timestamp" +msgstr "Aktualisieren und _Zeitstempel der Datei erhalten" + +#: ../src/viktrwlayer.c:8276 +msgid "Visit _Webpage" +msgstr "Webseite _besuchen" + +#: ../src/viktrwlayer.c:8306 +msgid "_New Waypoint..." +msgstr "Neuer _Wegpunkt..." + +#: ../src/viktrwlayer.c:8315 +msgid "_View All Waypoints" +msgstr "Alle Weg_punkte anzeigen" + +#: ../src/viktrwlayer.c:8327 +msgid "Delete _All Waypoints" +msgstr "Alle Wegpunkte l_öschen" + +#: ../src/viktrwlayer.c:8333 +msgid "_Delete Waypoints From Selection..." +msgstr "Gewählte Wegpun_kte löschen" + +#: ../src/viktrwlayer.c:8351 +msgid "_Show All Waypoints" +msgstr "Alle Wegppunkte _zeigen" + +#: ../src/viktrwlayer.c:8357 +msgid "_Hide All Waypoints" +msgstr "Alle Wegpunkte _verstecken" + +#: ../src/viktrwlayer.c:8369 +msgid "_List Waypoints..." +msgstr "Wegpunkte auf_listen ..." + +#: ../src/viktrwlayer.c:8390 +msgid "_View All Tracks" +msgstr "Alle GPS-Sp_uren anzeigen" + +#: ../src/viktrwlayer.c:8396 +msgid "_New Track" +msgstr "_Neuer Track" + +#: ../src/viktrwlayer.c:8404 +msgid "Delete _All Tracks" +msgstr "Alle GPS-Spu_ren löschen" + +#: ../src/viktrwlayer.c:8410 +msgid "_Delete Tracks From Selection..." +msgstr "Gew_ählte GPS-Spuren löschen..." + +#: ../src/viktrwlayer.c:8422 +msgid "_Show All Tracks" +msgstr "Alle Tracks _zeigen" + +#: ../src/viktrwlayer.c:8428 +msgid "_Hide All Tracks" +msgstr "Alle Tracks _verstecken" + +#: ../src/viktrwlayer.c:8439 +msgid "_List Tracks..." +msgstr "Tracks auf_listen..." + +#: ../src/viktrwlayer.c:8467 +msgid "_View All Routes" +msgstr "Alle Routen _ansehen" + +#: ../src/viktrwlayer.c:8473 +msgid "_New Route" +msgstr "_Neue Route" + +#: ../src/viktrwlayer.c:8499 +msgid "_Show All Routes" +msgstr "Alle Routen _zeigen" + +#: ../src/viktrwlayer.c:8505 +msgid "_Hide All Routes" +msgstr "Alle Routen _verstecken" + +#: ../src/viktrwlayer.c:8516 +msgid "_List Routes..." +msgstr "Routen auf_listen..." + +#: ../src/viktrwlayer.c:8587 +msgid "_View Track" +msgstr "_Zeige Spur" + +#: ../src/viktrwlayer.c:8589 +msgid "_View Route" +msgstr "Route _ansehen" + +#: ../src/viktrwlayer.c:8608 +msgid "_Startpoint" +msgstr "_Startpunkt" + +#: ../src/viktrwlayer.c:8614 +msgid "\"_Center\"" +msgstr "_Zentriere" + +#: ../src/viktrwlayer.c:8620 +msgid "_Endpoint" +msgstr "_Endpunkt" + +#: ../src/viktrwlayer.c:8626 +msgid "_Highest Altitude" +msgstr "_Höchster Punkt" + +#: ../src/viktrwlayer.c:8632 +msgid "_Lowest Altitude" +msgstr "_Tiefster Punkt" + +#: ../src/viktrwlayer.c:8640 +msgid "_Maximum Speed" +msgstr "_Maximalgeschwindigkeit" + +#: ../src/viktrwlayer.c:8646 +#, fuzzy +msgid "_Date" +msgstr "Datum" + +#: ../src/viktrwlayer.c:8655 +msgid "Co_mbine" +msgstr "Ko_mbinieren" + +#: ../src/viktrwlayer.c:8663 +msgid "_Merge By Time..." +msgstr "Vereinen nach _Zeit" + +#: ../src/viktrwlayer.c:8668 +msgid "Merge _Segments" +msgstr "Zusammenführen _Segemente" + +#: ../src/viktrwlayer.c:8675 +msgid "Merge _With Other Tracks..." +msgstr "Mit _anderen Spuren vereinen..." + +#: ../src/viktrwlayer.c:8682 +msgid "_Append Track..." +msgstr "GPS-Spur _anhängen ..." + +#: ../src/viktrwlayer.c:8684 +msgid "_Append Route..." +msgstr "_Anhängen Route..." + +#: ../src/viktrwlayer.c:8690 +msgid "Append _Route..." +msgstr "Anhängen _Route..." + +#: ../src/viktrwlayer.c:8692 +msgid "Append _Track..." +msgstr "GPS-Spur _anhängen ..." + +#: ../src/viktrwlayer.c:8699 +msgid "_Split" +msgstr "_Teilen" + +#: ../src/viktrwlayer.c:8707 +msgid "_Split By Time..." +msgstr "_Trenne nach Zeit" + +#. ATM always enable this entry - don't want to have to analyse the track before displaying the menu - to keep the menu speedy +#: ../src/viktrwlayer.c:8713 +msgid "Split Se_gments" +msgstr "Se_gmente aufteilen" + +#: ../src/viktrwlayer.c:8719 +msgid "Split By _Number of Points..." +msgstr "Tre_nne nach Anzahl der Punkte" + +#: ../src/viktrwlayer.c:8724 +msgid "Split at _Trackpoint" +msgstr "" + +#: ../src/viktrwlayer.c:8732 +msgid "_Insert Points" +msgstr "Punkte e_infügen" + +#: ../src/viktrwlayer.c:8738 +msgid "Insert Point _Before Selected Point" +msgstr "" + +#: ../src/viktrwlayer.c:8745 +msgid "Insert Point _After Selected Point" +msgstr "" + +#: ../src/viktrwlayer.c:8754 +msgid "Delete Poi_nts" +msgstr "Pu_nkte löschen" + +#: ../src/viktrwlayer.c:8760 +msgid "Delete _Selected Point" +msgstr "_Gewählten Punkt löschen" + +#: ../src/viktrwlayer.c:8768 +msgid "Delete Points With The Same _Position" +msgstr "Punkte mit gleicher _Position löschen" + +#: ../src/viktrwlayer.c:8773 +msgid "Delete Points With The Same _Time" +msgstr "Punkte mit der gleichen _Zeit löschen" + +#: ../src/viktrwlayer.c:8780 ../src/viktrwlayer.c:9029 +msgid "_Transform" +msgstr "_Transformieren" + +#: ../src/viktrwlayer.c:8788 ../src/viktrwlayer.c:9037 +msgid "_Apply DEM Data" +msgstr "Verwende DEM-D_aten" + +#: ../src/viktrwlayer.c:8793 ../src/viktrwlayer.c:9042 +msgid "_Overwrite" +msgstr "_Überschreiben" + +#: ../src/viktrwlayer.c:8796 ../src/viktrwlayer.c:9045 +msgid "Overwrite any existing elevation values with DEM values" +msgstr "Überschreibe vorhandenen Höhendaten durch DEM-Werte" + +#: ../src/viktrwlayer.c:8799 ../src/viktrwlayer.c:9048 +msgid "_Keep Existing" +msgstr "Vorhandenen _beibehalten" + +#: ../src/viktrwlayer.c:8802 ../src/viktrwlayer.c:9051 +msgid "Keep existing elevation values, only attempt for missing values" +msgstr "Vorhandenen Höhendaten behalten, nur fehlenden Daten ergänzen" + +#: ../src/viktrwlayer.c:8807 +msgid "_Smooth Missing Elevation Data" +msgstr "Fehlende Höhendaten _glätten" + +#: ../src/viktrwlayer.c:8812 +msgid "_Interpolated" +msgstr "_Interpoliert" + +#: ../src/viktrwlayer.c:8815 +msgid "" +"Interpolate between known elevation values to derive values for the missing " +"elevations" +msgstr "" +"Interpoliere zwischen vorhandenen Höhendaten, um fehlende Daten zu ergänzen" + +#: ../src/viktrwlayer.c:8818 +msgid "_Flat" +msgstr "_Flach" + +#: ../src/viktrwlayer.c:8821 +msgid "Set unknown elevation values to the last known value" +msgstr "Unbekannte Höhenwerte auf letzten bekannte Werte setzen" + +#: ../src/viktrwlayer.c:8825 +msgid "C_onvert to a Route" +msgstr "In Route um_wandeln" + +#: ../src/viktrwlayer.c:8827 +msgid "C_onvert to a Track" +msgstr "In _GPS-Spur umwandeln" + +#: ../src/viktrwlayer.c:8835 +msgid "_Anonymize Times" +msgstr "Zeit _anonymisieren" + +#: ../src/viktrwlayer.c:8838 +msgid "Shift timestamps to a relative offset from 1901-01-01" +msgstr "" + +#: ../src/viktrwlayer.c:8841 +msgid "_Interpolate Times" +msgstr "Zeit _interpolieren" + +#: ../src/viktrwlayer.c:8844 +msgid "" +"Reset trackpoint timestamps between the first and last points such that " +"track is traveled at equal speed" +msgstr "" + +#: ../src/viktrwlayer.c:8849 +msgid "_Reverse Track" +msgstr "GPS-Spur _umkehren" + +#: ../src/viktrwlayer.c:8851 +msgid "_Reverse Route" +msgstr "Route umkeh_ren" + +#: ../src/viktrwlayer.c:8858 +msgid "Refine Route..." +msgstr "Route neudefinieren ..." + +#: ../src/viktrwlayer.c:8868 +msgid "Down_load Maps Along Track..." +msgstr "_Lade Karte entlang der Spur..." + +#: ../src/viktrwlayer.c:8870 +msgid "Down_load Maps Along Route..." +msgstr "Karten entlang der Route herunter_laden ..." + +#: ../src/viktrwlayer.c:8878 +msgid "_Export Track as GPX..." +msgstr "GPS-Spur als GPX _exportieren ..." + +#: ../src/viktrwlayer.c:8880 +msgid "_Export Route as GPX..." +msgstr "Route als GPX _exportieren" + +#: ../src/viktrwlayer.c:8887 +msgid "E_xtend Track End" +msgstr "Verlänger_e Spurende" + +#: ../src/viktrwlayer.c:8889 +msgid "E_xtend Route End" +msgstr "" + +#: ../src/viktrwlayer.c:8896 +msgid "Extend _Using Route Finder" +msgstr "Verlängere über _Routenfinder" + +#: ../src/viktrwlayer.c:8911 +msgid "_Upload to GPS..." +msgstr "Zu GPS hina_ufladen ..." + +#: ../src/viktrwlayer.c:8926 +msgid "_Diary" +msgstr "_Tagebuch" + +#: ../src/viktrwlayer.c:8930 +msgid "Open diary program at this date" +msgstr "" + +#: ../src/viktrwlayer.c:8935 +msgid "_Astronomy" +msgstr "_Astronomie" + +#: ../src/viktrwlayer.c:8938 +msgid "Open astronomy program at this date and location" +msgstr "" + +#: ../src/viktrwlayer.c:8962 +msgid "_View Google Directions" +msgstr "Google _Directions anzeigen" + +#: ../src/viktrwlayer.c:8984 +msgid "Use with _Filter" +msgstr "_Filter anwenden" + +#: ../src/viktrwlayer.c:9018 +msgid "_Edit Trackpoint" +msgstr "Spurpunkt _bearbeiten" + +#: ../src/viktrwlayer.c:10116 +#, c-format +msgid " - Gain %dm:Loss %dm" +msgstr " - Gewinn %d m: Verlust %d m" + +#: ../src/viktrwlayer.c:10118 +#, c-format +msgid " - Gain %dft:Loss %dft" +msgstr " - Gewinn %d ft: Verlust %d ft" + +#: ../src/viktrwlayer.c:10123 +#, c-format +msgid " - Bearing %3.1f° - Step %s" +msgstr "" + +#: ../src/viktrwlayer.c:10232 +#, c-format +msgid "Querying %s for route between (%.3f, %.3f) and (%.3f, %.3f)." +msgstr "" + +#: ../src/viktrwlayer.c:10248 +#, c-format +msgid "%s returned route between (%.3f, %.3f) and (%.3f, %.3f)." +msgstr "" + +#: ../src/viktrwlayer.c:10251 +#, c-format +msgid "Error getting route from %s." +msgstr "" + +#: ../src/viktrwlayer.c:11070 +#, c-format +msgid "Creating %d Image Thumbnails..." +msgstr "%d Bild-Vorschauen erzeugen ..." + +#: ../src/viktrwlayer.c:11560 +msgid "No map layer in use. Create one first" +msgstr "Keine Karten-Ebene in Benutzung. Zuerst eine erzeugen" + +#: ../src/viktrwlayer.c:11679 +#, c-format +msgid "%s: Track List" +msgstr "%s: Track-Liste" + +#: ../src/viktrwlayer.c:11681 +#, c-format +msgid "%s: Route List" +msgstr "%s: Routen-Liste" + +#: ../src/viktrwlayer.c:11734 +#, c-format +msgid "" +"Could not write external layer %s to %s, please fix and save before exiting " +"or data will be lost" +msgstr "" + +#: ../src/viktrwlayer.c:11782 +#, c-format +msgid "WARNING: issues encountered loading external layer %s from %s" +msgstr "" + +#: ../src/viktrwlayer_export.c:47 +msgid "Auto Device GPX Simplify:" +msgstr "" + +#: ../src/viktrwlayer_export.c:48 +msgid "" +"GPX saves to certain devices will be simplified for device compatibility." +msgstr "" + +#: ../src/viktrwlayer_export.c:125 +#, c-format +msgid "Export of GPX file simplified using point limit: %d" +msgstr "" + +#: ../src/viktrwlayer_export.c:206 ../src/viktrwlayer_export.c:323 +#: ../src/vikwindow.c:3694 +msgid "The filename you requested could not be opened for writing." +msgstr "Die angegebene Datei konnte nicht zum Schreiben geöffnet werden." + +#: ../src/viktrwlayer_export.c:226 +#, c-format +msgid "Could not launch %s." +msgstr "Konnte %s nicht starten." + +#: ../src/viktrwlayer_export.c:234 +msgid "Could not create temporary file for export." +msgstr "Konnte keine temporäre Datei für Export erzeugen." + +#: ../src/viktrwlayer_export.c:268 +msgid "File format:" +msgstr "Dateiformat:" + +#: ../src/viktrwlayer_export.c:276 +msgid "Select the file format." +msgstr "Dateiformat wählen." + +#: ../src/viktrwlayer_export.c:281 +msgid "" +"Select the information to process.\n" +"Warning: the behavior of these switches is highly dependent of the file " +"format selected.\n" +"Please, refer to GPSbabel if unsure." +msgstr "" + +#: ../src/viktrwlayer_export.c:308 +msgid "You did not select a valid file format." +msgstr "Sie haben kein gültiges Dateiformat gewählt." + +#: ../src/viktrwlayer_propwin.c:915 ../src/viktrwlayer_propwin.c:3381 +#: ../src/viktrwlayer_propwin.c:3417 ../src/viktrwlayer_propwin.c:3457 +#: ../src/viktrwlayer_propwin.c:3509 ../src/viktrwlayer_propwin.c:3527 +#: ../src/viktrwlayer_propwin.c:3600 ../src/viktrwlayer_propwin.c:3601 +#: ../src/viktrwlayer_propwin.c:3602 ../src/viktrwlayer_propwin.c:3611 +#: ../src/viktrwlayer_propwin.c:3612 ../src/viktrwlayer_propwin.c:3629 +#: ../src/viktrwlayer_propwin.c:3630 ../src/viktrwlayer_propwin.c:3644 +#: ../src/viktrwlayer_propwin.c:3645 ../src/viktrwlayer_propwin.c:3646 +#: ../src/viktrwlayer_propwin.c:3660 ../src/viktrwlayer_propwin.c:3661 +#: ../src/viktrwlayer_propwin.c:3662 ../src/viktrwlayer_propwin.c:3676 +#: ../src/viktrwlayer_propwin.c:3677 ../src/viktrwlayer_propwin.c:3678 +#: ../src/viktrwlayer_propwin.c:3695 ../src/viktrwlayer_propwin.c:3696 +#: ../src/viktrwlayer_analysis.c:293 +#, c-format +msgid "No Data" +msgstr "Keine Daten" + +#: ../src/viktrwlayer_propwin.c:960 ../src/viktrwlayer_propwin.c:1245 +#, c-format +msgid "%.1f kph" +msgstr "%.1f km/h" + +#: ../src/viktrwlayer_propwin.c:963 ../src/viktrwlayer_propwin.c:1248 +#: ../src/viktrwlayer_analysis.c:352 +#, c-format +msgid "%.1f mph" +msgstr "%.1f mph" + +#: ../src/viktrwlayer_propwin.c:966 ../src/viktrwlayer_propwin.c:1251 +#, c-format +msgid "%.1f knots" +msgstr "%.1f knots" + +#: ../src/viktrwlayer_propwin.c:969 ../src/viktrwlayer_propwin.c:1254 +#, fuzzy, c-format +msgid "%.1f s/km" +msgstr "%.1f km" + +#: ../src/viktrwlayer_propwin.c:972 ../src/viktrwlayer_propwin.c:1257 +#: ../src/viktrwlayer_analysis.c:389 ../src/viktrwlayer_analysis.c:392 +#, fuzzy, c-format +msgid "%.1f min/km" +msgstr "%.1f km" + +#: ../src/viktrwlayer_propwin.c:975 ../src/viktrwlayer_propwin.c:1260 +#, fuzzy, c-format +msgid "%.1f sec/mi" +msgstr "%.1f Meilen" + +#: ../src/viktrwlayer_propwin.c:978 ../src/viktrwlayer_propwin.c:1263 +#: ../src/viktrwlayer_analysis.c:409 ../src/viktrwlayer_analysis.c:412 +#, fuzzy, c-format +msgid "%.1f min/mi" +msgstr "%.1f m/s" + +#. VIK_UNITS_SPEED_METRES_PER_SECOND: +#: ../src/viktrwlayer_propwin.c:982 ../src/viktrwlayer_propwin.c:1267 +#, c-format +msgid "%.1f m/s" +msgstr "%.1f m/s" + +#. Minutes +#: ../src/viktrwlayer_propwin.c:1411 +msgid "mins" +msgstr "Min." + +#. Hours +#: ../src/viktrwlayer_propwin.c:1418 +msgid "h" +msgstr "Std." + +#. Days +#: ../src/viktrwlayer_propwin.c:1424 +msgid "d" +msgstr "Tag" + +#. Weeks +#: ../src/viktrwlayer_propwin.c:1429 +msgid "w" +msgstr "W" + +#. 'Months' +#: ../src/viktrwlayer_propwin.c:1433 +msgid "M" +msgstr "M" + +#: ../src/viktrwlayer_propwin.c:2051 ../src/viktrwlayer_analysis.c:303 +#, c-format +msgid "%.1f miles" +msgstr "%.1f Meilen" + +#: ../src/viktrwlayer_propwin.c:2054 ../src/viktrwlayer_analysis.c:306 +#, c-format +msgid "%.1f NM" +msgstr "" + +#. VIK_UNITS_DISTANCE_KILOMETRES +#: ../src/viktrwlayer_propwin.c:2057 ../src/viktrwlayer_analysis.c:310 +#, c-format +msgid "%.1f km" +msgstr "%.1f km" + +#: ../src/viktrwlayer_propwin.c:3083 +msgid "Failed spliting track. Track unchanged" +msgstr "Trennen der Spur fehlgeschlagen. Spur unverändert" + +#: ../src/viktrwlayer_propwin.c:3234 ../src/viktrwlayer_propwin.c:3744 +#, c-format +msgid "%s - Track Properties" +msgstr "%s - Spur-Eigenschaften" + +#: ../src/viktrwlayer_propwin.c:3239 +msgid "Split at _Marker" +msgstr "Bei Markierung _trennen" + +#: ../src/viktrwlayer_propwin.c:3240 +msgid "Split _Segments" +msgstr "_Segmente trennen" + +#: ../src/viktrwlayer_propwin.c:3241 +msgid "_Reverse" +msgstr "_Umkehren" + +#: ../src/viktrwlayer_propwin.c:3242 +msgid "_Delete Dupl." +msgstr "_Doppelte Daten löschen" + +#: ../src/viktrwlayer_propwin.c:3269 +msgid "Comment:" +msgstr "Kommentar:" + +#: ../src/viktrwlayer_propwin.c:3270 +msgid "Description:" +msgstr "Beschreibung:" + +#: ../src/viktrwlayer_propwin.c:3271 +#, fuzzy +msgid "Source:" +msgstr "Start:" + +#: ../src/viktrwlayer_propwin.c:3272 +#, fuzzy +msgid "Type:" +msgstr "Zeit:" + +#: ../src/viktrwlayer_propwin.c:3273 +msgid "Color:" +msgstr "Farbe:" + +#: ../src/viktrwlayer_propwin.c:3274 +msgid "Draw Name:" +msgstr "Namen zeichnen:" + +#: ../src/viktrwlayer_propwin.c:3275 +msgid "Distance Labels:" +msgstr "Distanz-Breschriftung:" + +#: ../src/viktrwlayer_propwin.c:3278 +msgid "Track Length:" +msgstr "Spur-Länge:" + +#: ../src/viktrwlayer_propwin.c:3279 +msgid "Trackpoints:" +msgstr "Spurpunkte:" + +#: ../src/viktrwlayer_propwin.c:3280 +msgid "Segments:" +msgstr "Segmente:" + +#: ../src/viktrwlayer_propwin.c:3281 +msgid "Duplicate Points:" +msgstr "Doppelte Punkte:" + +#: ../src/viktrwlayer_propwin.c:3282 +msgid "Max Speed:" +msgstr "Höchstgeschwindigkeit:" + +#: ../src/viktrwlayer_propwin.c:3283 +msgid "Avg. Speed:" +msgstr "Durchschnittsgeschwindigkeit:" + +#: ../src/viktrwlayer_propwin.c:3284 +msgid "Moving Avg. Speed:" +msgstr "Mittlere Durchschnittsgeschwindigkeit:" + +#: ../src/viktrwlayer_propwin.c:3285 +msgid "Avg. Dist. Between TPs:" +msgstr "Durchschnt. Abstand TPs:" + +#: ../src/viktrwlayer_propwin.c:3286 +msgid "Elevation Range:" +msgstr "Höhendifferenz:" + +#: ../src/viktrwlayer_propwin.c:3287 +msgid "Total Elevation Gain/Loss:" +msgstr "Absoluter Höhengewinn/-verlust:" + +#: ../src/viktrwlayer_propwin.c:3288 +msgid "Start:" +msgstr "Start:" + +#: ../src/viktrwlayer_propwin.c:3289 +msgid "End:" +msgstr "Ende:" + +#: ../src/viktrwlayer_propwin.c:3290 +msgid "Duration:" +msgstr "Dauer:" + +#: ../src/viktrwlayer_propwin.c:3320 +msgid "Centre" +msgstr "Zentrieren" + +#: ../src/viktrwlayer_propwin.c:3321 +msgid "Start only" +msgstr "Nur Start" + +#: ../src/viktrwlayer_propwin.c:3322 +msgid "End only" +msgstr "Nur Ende" + +#: ../src/viktrwlayer_propwin.c:3323 +msgid "Start and End" +msgstr "Start und Ende" + +#: ../src/viktrwlayer_propwin.c:3324 +msgid "Centre, Start and End" +msgstr "Zentrum, Start und Ende" + +#: ../src/viktrwlayer_propwin.c:3336 +msgid "Maximum number of distance labels to be shown" +msgstr "" + +#: ../src/viktrwlayer_propwin.c:3340 +msgid "Properties" +msgstr "Eigenschaften" + +#: ../src/viktrwlayer_propwin.c:3584 +#, c-format +msgid "%d minutes - %d minutes moving" +msgstr "" + +#: ../src/viktrwlayer_propwin.c:3596 +#, c-format +msgid "%s total - %s in segments" +msgstr "" + +#: ../src/viktrwlayer_propwin.c:3607 ../src/viktrwlayer_analysis.c:622 +msgid "Statistics" +msgstr "Statistiken" + +#: ../src/viktrwlayer_propwin.c:3613 ../src/viktrwlayer_propwin.c:3680 +msgid "Show D_EM" +msgstr "D_EM Anzeigen" + +#: ../src/viktrwlayer_propwin.c:3615 ../src/viktrwlayer_propwin.c:3631 +#: ../src/viktrwlayer_propwin.c:3647 ../src/viktrwlayer_propwin.c:3697 +msgid "Show _GPS Speed" +msgstr "_GPS-Geschwindigkeit anzeigen" + +#: ../src/viktrwlayer_propwin.c:3617 ../src/viktrwlayer_propwin.c:3633 +#: ../src/viktrwlayer_propwin.c:3665 ../src/viktrwlayer_propwin.c:3699 +msgid "Track Distance:" +msgstr "Spur-Distanz:" + +#: ../src/viktrwlayer_propwin.c:3618 ../src/viktrwlayer_propwin.c:3684 +msgid "Track Height:" +msgstr "Spur-Höhe:" + +#: ../src/viktrwlayer_propwin.c:3624 +msgid "Elevation-distance" +msgstr "Höhenunterschied" + +#: ../src/viktrwlayer_propwin.c:3634 +msgid "Track Gradient:" +msgstr "" + +#: ../src/viktrwlayer_propwin.c:3639 +msgid "Gradient-distance" +msgstr "" + +#: ../src/viktrwlayer_propwin.c:3649 ../src/viktrwlayer_propwin.c:3666 +#: ../src/viktrwlayer_propwin.c:3683 +msgid "Track Time:" +msgstr "Spur-Zeit:" + +#: ../src/viktrwlayer_propwin.c:3650 ../src/viktrwlayer_propwin.c:3700 +msgid "Track Speed:" +msgstr "Spur-Geschwindigkeit:" + +#: ../src/viktrwlayer_propwin.c:3651 ../src/viktrwlayer_propwin.c:3667 +#: ../src/viktrwlayer_propwin.c:3685 +msgid "Time/Date:" +msgstr "" + +#: ../src/viktrwlayer_propwin.c:3655 +msgid "Speed-time" +msgstr "Geschwindigkeit-Zeit" + +#: ../src/viktrwlayer_propwin.c:3663 ../src/viktrwlayer_propwin.c:3679 +msgid "Show S_peed" +msgstr "_Geschwindigkeit anzeigen" + +#: ../src/viktrwlayer_propwin.c:3671 +msgid "Distance-time" +msgstr "Distanz-Zeit" + +#: ../src/viktrwlayer_propwin.c:3690 +msgid "Elevation-time" +msgstr "Höhe-Zeit" + +#: ../src/viktrwlayer_propwin.c:3705 +msgid "Speed-distance" +msgstr "Geschwindigkeit-Distanz" + +#: ../src/viktrwlayer_tpwin.c:190 ../src/viktrwlayer_wpwin.c:66 +msgid "Date/Time Edit" +msgstr "" + +#: ../src/viktrwlayer_tpwin.c:242 +msgid "Name:" +msgstr "Name:" + +#: ../src/viktrwlayer_tpwin.c:243 +msgid "Latitude:" +msgstr "Breitengrad:" + +#: ../src/viktrwlayer_tpwin.c:244 +msgid "Longitude:" +msgstr "Längengrad:" + +#: ../src/viktrwlayer_tpwin.c:245 +msgid "Altitude:" +msgstr "Höhe:" + +#: ../src/viktrwlayer_tpwin.c:246 +msgid "Course:" +msgstr "" + +#: ../src/viktrwlayer_tpwin.c:247 +msgid "Timestamp:" +msgstr "Zeitstempel:" + +#: ../src/viktrwlayer_tpwin.c:248 +msgid "Time:" +msgstr "Zeit:" + +#: ../src/viktrwlayer_tpwin.c:249 +msgid "Distance Difference:" +msgstr "Distanz-Differenz:" + +#: ../src/viktrwlayer_tpwin.c:250 +msgid "Time Difference:" +msgstr "Zeitunterschied:" + +#: ../src/viktrwlayer_tpwin.c:251 +msgid "\"Speed\" Between:" +msgstr "\"Geschwindigkeit\" zwischen:" + +#: ../src/viktrwlayer_tpwin.c:252 +msgid "Speed:" +msgstr "Geschwindigkeit:" + +#: ../src/viktrwlayer_tpwin.c:253 +msgid "VDOP:" +msgstr "VDOP:" + +#: ../src/viktrwlayer_tpwin.c:254 +msgid "HDOP:" +msgstr "HDOP:" + +#: ../src/viktrwlayer_tpwin.c:255 +msgid "PDOP:" +msgstr "PDOP:" + +#: ../src/viktrwlayer_tpwin.c:256 +msgid "SAT/FIX:" +msgstr "SAT/FIX:" + +#: ../src/viktrwlayer_tpwin.c:263 ../src/viktrwlayer_tpwin.c:408 +#: ../src/viktrwlayer_tpwin.c:622 +msgid "Trackpoint" +msgstr "Spurpunkt" + +#: ../src/viktrwlayer_tpwin.c:266 +msgid "_Insert After" +msgstr "Einfügen _nach" + +#: ../src/viktrwlayer_tpwin.c:268 +msgid "Split Here" +msgstr "Hier auftrennen" + +#: ../src/viktrwlayer_tracklist.c:262 ../src/viktrwlayer_waypointlist.c:306 +msgid "_Copy Data" +msgstr "_Kopiere Daten" + +#. +#. item = gtk_image_menu_item_new_with_mnemonic ( _("_Select") ); +#. gtk_image_menu_item_set_image ( (GtkImageMenuItem*)item, gtk_image_new_from_stock (GTK_STOCK_FIND, GTK_ICON_SIZE_MENU) ); +#. g_signal_connect_swapped ( G_OBJECT(item), "activate", G_CALLBACK(trw_layer_track_select), values ); +#. gtk_menu_shell_append (GTK_MENU_SHELL (menu), item); +#. gtk_widget_show ( item ); +#. +#. ATM view auto selects, so don't bother with separate select menu entry +#. +#. item = gtk_image_menu_item_new_with_mnemonic ( _("_Select") ); +#. gtk_image_menu_item_set_image ( (GtkImageMenuItem*)item, gtk_image_new_from_stock (GTK_STOCK_FIND, GTK_ICON_SIZE_MENU) ); +#. g_signal_connect_swapped ( G_OBJECT(item), "activate", G_CALLBACK(trw_layer_waypoint_select), values ); +#. gtk_menu_shell_append (GTK_MENU_SHELL (menu), item); +#. gtk_widget_show ( item ); +#. +#. AUTO SELECT NOT TRUE YET... +#. ATM view auto selects, so don't bother with separate select menu entry +#: ../src/viktrwlayer_tracklist.c:290 ../src/viktrwlayer_waypointlist.c:341 +#: ../src/vikwindow.c:4816 +msgid "_View" +msgstr "_Ansicht" + +#. Insert column for the layer name when viewing multi layers +#: ../src/viktrwlayer_tracklist.c:613 ../src/viktrwlayer_waypointlist.c:609 +msgid "Layer" +msgstr "Ebenen" + +#: ../src/viktrwlayer_tracklist.c:627 ../src/viktrwlayer_waypointlist.c:624 +msgid "Date" +msgstr "Datum" + +#: ../src/viktrwlayer_tracklist.c:631 ../src/viktrwlayer_waypointlist.c:628 +msgid "Visible" +msgstr "Sichtbarkeit" + +#: ../src/viktrwlayer_tracklist.c:639 +msgid "" +"Distance\n" +"(miles)" +msgstr "" +"Distanz\n" +"(Meilen)" + +#: ../src/viktrwlayer_tracklist.c:642 +#, fuzzy +msgid "" +"Distance\n" +"(NM)" +msgstr "" +"Distanz\n" +"(km)" + +#: ../src/viktrwlayer_tracklist.c:645 +msgid "" +"Distance\n" +"(km)" +msgstr "" +"Distanz\n" +"(km)" + +#: ../src/viktrwlayer_tracklist.c:651 +msgid "" +"Length\n" +"(minutes)" +msgstr "" +"Länge\n" +"(Minuten)" + +#: ../src/viktrwlayer_tracklist.c:660 ../src/vikutils.c:93 +msgid "sec/mi" +msgstr "" + +#: ../src/viktrwlayer_tracklist.c:666 +#, c-format +msgid "" +"Av. Speed\n" +"(%s)" +msgstr "" +"Druchschnittsgeschwindigkeit\n" +"(%s)" + +#. Apply own formatting of the data +#: ../src/viktrwlayer_tracklist.c:671 +#, c-format +msgid "" +"Max Speed\n" +"(%s)" +msgstr "" +"Max. Geschwindigkeit\n" +"(%s)" + +#: ../src/viktrwlayer_tracklist.c:679 ../src/viktrwlayer_waypointlist.c:637 +msgid "" +"Max Height\n" +"(Feet)" +msgstr "" +"Max. Höhe\n" +"(Fuss)" + +#: ../src/viktrwlayer_tracklist.c:681 ../src/viktrwlayer_waypointlist.c:639 +msgid "" +"Max Height\n" +"(Metres)" +msgstr "" +"Max. Höhe\n" +"(Meter)" + +#: ../src/viktrwlayer_waypointlist.c:312 +msgid "Copy Data (with _positions)" +msgstr "Kopiere Daten (mit Position)" + +#: ../src/viktrwlayer_waypointlist.c:633 +msgid "Comment" +msgstr "Kommentar" + +#: ../src/viktrwlayer_waypointlist.c:643 +msgid "Symbol" +msgstr "Symbol" + +#: ../src/viktrwlayer_wpwin.c:93 ../src/viktrwlayer_wpwin.c:302 +msgid "True" +msgstr "" + +#: ../src/viktrwlayer_wpwin.c:122 +msgid "Waypoint Properties" +msgstr "Wegpunkt-Eigenschaften" + +#: ../src/viktrwlayer_wpwin.c:164 +msgid "Name:" +msgstr "Name:" + +#: ../src/viktrwlayer_wpwin.c:181 +msgid "Altitude:" +msgstr "Höhe:" + +#: ../src/viktrwlayer_wpwin.c:186 ../src/viktrwlayer_wpwin.c:188 +msgid "Comment:" +msgstr "Kommentar:" + +#: ../src/viktrwlayer_wpwin.c:202 +#, fuzzy +msgid "Source:" +msgstr "Quelle zum Herunterladen:" + +#: ../src/viktrwlayer_wpwin.c:212 +msgid "Image:" +msgstr "Bild:" + +#: ../src/viktrwlayer_wpwin.c:217 +msgid "Symbol:" +msgstr "Symbol:" + +#: ../src/viktrwlayer_wpwin.c:226 +msgid "(none)" +msgstr "(nichts)" + +#. Geotag Info [readonly] +#: ../src/viktrwlayer_wpwin.c:272 +msgid "Has Geotag" +msgstr "" + +#: ../src/viktrwlayer_wpwin.c:279 +msgid "Consistent Position" +msgstr "" + +#. ATM the direction value box is always shown, even when there is no information. +#. It would be nice to be able to hide it until the 'Add' has been performed, +#. however I've not been able to achieve this. +#. Thus simply sensistizing it instead. +#: ../src/viktrwlayer_wpwin.c:292 +#, fuzzy +msgid "Image Direction:" +msgstr "Zeitzone des Bildes" + +#: ../src/viktrwlayer_wpwin.c:300 +msgid "Magnetic" +msgstr "" + +#: ../src/viktrwlayer_wpwin.c:320 +msgid "Time:" +msgstr "Zeit:" + +#. TODO: other checks (isalpha or whatever ) +#: ../src/viktrwlayer_wpwin.c:386 +msgid "Please enter a name for the waypoint." +msgstr "Bitte einen Namen für den Wegpunkt eingeben." + +#: ../src/viktrwlayer_geotag.c:320 ../src/viktrwlayer_geotag.c:460 +#, c-format +msgid "Failed updating EXIF on %s" +msgstr "" + +#: ../src/viktrwlayer_geotag.c:562 +#, c-format +msgid "Geotagging %d Images..." +msgstr "Georeferenziere %d Bilder..." + +#: ../src/viktrwlayer_geotag.c:630 +msgid "Geotag Images" +msgstr "Bilder georeferenzieren" + +#: ../src/viktrwlayer_geotag.c:640 +msgid "Images" +msgstr "Bilder" + +#: ../src/viktrwlayer_geotag.c:645 +msgid "Overwrite Existing Waypoints:" +msgstr "Vorhandene Wegpunkte überschreiben:" + +#: ../src/viktrwlayer_geotag.c:648 +msgid "Overwrite Existing GPS Information:" +msgstr "Überschreibe existierende GPS-Information:" + +#: ../src/viktrwlayer_geotag.c:650 +msgid "Keep File Modification Timestamp:" +msgstr "Erhalte Zeitstempel für Dateiänderung:" + +#: ../src/viktrwlayer_geotag.c:684 +msgid "Create Waypoints:" +msgstr "Erzeuge Wegpunkte:" + +#: ../src/viktrwlayer_geotag.c:693 +msgid "Write EXIF:" +msgstr "Schreibe EXIF:" + +#: ../src/viktrwlayer_geotag.c:705 +msgid "Automatic Image Direction:" +msgstr "" + +#: ../src/viktrwlayer_geotag.c:707 +msgid "Set image direction based on a heading derived from the track" +msgstr "" + +#: ../src/viktrwlayer_geotag.c:710 +msgid "Interpolate Between Track Segments:" +msgstr "Interpoliere zwischen Spursegmenten:" + +#: ../src/viktrwlayer_geotag.c:715 +msgid "Image Time Offset (Seconds):" +msgstr "Bild-Zeitversatz (Sekunden)" + +#: ../src/viktrwlayer_geotag.c:718 +msgid "" +"The number of seconds to ADD to the photos time to make it match the GPS " +"data. Calculate this with (GPS - Photo). Can be negative or positive. Useful " +"to adjust times when a camera's timestamp was incorrect." +msgstr "" +"Anzahl Sekunden, die der Zeitinformation im Bild hinzugefügt werden muss, um " +"synchron zu den GPS-Daten zu sein. Kann negativ oder positiv sein. Nützlich, " +"wenn der Kamerazeitstempel falsch war." + +#: ../src/viktrwlayer_geotag.c:721 +msgid "Image Timezone:" +msgstr "Zeitzone des Bildes" + +#: ../src/viktrwlayer_geotag.c:724 +msgid "" +"The timezone that was used when the images were created. For example, if a " +"camera is set to AWST or +8:00 hours. Enter +8:00 here so that the correct " +"adjustment to the images' time can be made. GPS data is always in UTC." +msgstr "" +"Zeitzone in der das Bild erzeugt wurde. Z.B. wenn die Kamera CEST oder +2:00 " +"h nutzt, dann hier +2:00 eingeben, so dass der Zeitstempel des Bildes auf " +"die GPS-Zeitbasis (UTC) justiert wird." + +#: ../src/viktrwlayer_geotag.c:728 +#, c-format +msgid "Using waypoint: %s" +msgstr "Benutze Wegpunkt: %s" + +#: ../src/viktrwlayer_geotag.c:742 +#, c-format +msgid "Using track: %s" +msgstr "Benutze Spur: %s" + +#: ../src/viktrwlayer_geotag.c:744 +#, c-format +msgid "Using all tracks in: %s" +msgstr "Benutze alle Spuren in: %s" + +#: ../src/viktrwlayer_analysis.c:214 +msgid "Number of Tracks" +msgstr "Anzahl der Tracks" + +#: ../src/viktrwlayer_analysis.c:215 +msgid "Date Range" +msgstr "Zeitraum" + +#: ../src/viktrwlayer_analysis.c:216 +msgid "Total Length" +msgstr "Total-Länge" + +#: ../src/viktrwlayer_analysis.c:217 +msgid "Average Length" +msgstr "Durchnittslänge" + +#: ../src/viktrwlayer_analysis.c:218 +msgid "Eddington number" +msgstr "" + +#. No.4: Extended display only +#: ../src/viktrwlayer_analysis.c:219 +msgid "Max Speed" +msgstr "Max. Geschwidigkeit" + +#: ../src/viktrwlayer_analysis.c:220 +msgid "Avg. Speed" +msgstr "Durchschnittsgeschwindigkeit" + +#: ../src/viktrwlayer_analysis.c:221 +msgid "Minimum Altitude" +msgstr "Minimale Höhe" + +#: ../src/viktrwlayer_analysis.c:222 +msgid "Maximum Altitude" +msgstr "Maximale Höhe" + +#: ../src/viktrwlayer_analysis.c:223 +msgid "Total Elevation Gain/Loss" +msgstr "" + +#: ../src/viktrwlayer_analysis.c:224 +msgid "Avg. Elevation Gain/Loss" +msgstr "" + +#: ../src/viktrwlayer_analysis.c:225 +msgid "Total Duration" +msgstr "Gesamtdauer" + +#: ../src/viktrwlayer_analysis.c:226 +msgid "Avg. Duration" +msgstr "Durchschnittliche Dauer" + +#: ../src/viktrwlayer_analysis.c:317 +#, c-format +msgid "%.2f miles" +msgstr "%.2f Meilen" + +#: ../src/viktrwlayer_analysis.c:320 +#, fuzzy, c-format +msgid "%.2f NM" +msgstr "%.2f km" + +#. VIK_UNITS_DISTANCE_KILOMETRES +#: ../src/viktrwlayer_analysis.c:324 +#, c-format +msgid "%.2f km" +msgstr "%.2f km" + +#: ../src/viktrwlayer_analysis.c:361 +#, c-format +msgid "%.2f m/s" +msgstr "%.2f m/s" + +#: ../src/viktrwlayer_analysis.c:370 ../src/viktrwlayer_analysis.c:373 +#, c-format +msgid "%.2f knots" +msgstr "%.2f Knoten" + +#: ../src/viktrwlayer_analysis.c:379 ../src/viktrwlayer_analysis.c:382 +#, c-format +msgid "%d s/km" +msgstr "" + +#: ../src/viktrwlayer_analysis.c:399 ../src/viktrwlayer_analysis.c:402 +#, c-format +msgid "%d sec/mi" +msgstr "" + +#: ../src/viktrwlayer_analysis.c:420 ../src/viktrwlayer_analysis.c:423 +#, c-format +msgid "%.2f km/h" +msgstr "%.2f km/h" + +#: ../src/viktrwlayer_analysis.c:434 ../src/viktrwlayer_analysis.c:440 +#, c-format +msgid "%d feet" +msgstr "%d Fuss" + +#: ../src/viktrwlayer_analysis.c:445 ../src/viktrwlayer_analysis.c:447 +#, c-format +msgid "%d feet / %d feet" +msgstr "%d Fuss / %d Fuss" + +#: ../src/viktrwlayer_analysis.c:452 ../src/viktrwlayer_analysis.c:458 +#, c-format +msgid "%d m" +msgstr "%d m" + +#: ../src/viktrwlayer_analysis.c:463 ../src/viktrwlayer_analysis.c:465 +#, c-format +msgid "%d m / %d m" +msgstr "%d m / %d m" + +#: ../src/viktrwlayer_analysis.c:477 +#, c-format +msgid "%d:%02d:%02d days:hrs:mins" +msgstr "%d:%02d:%02d days:hrs:mins" + +#: ../src/viktrwlayer_analysis.c:484 +#, c-format +msgid "%d:%02d hrs:mins" +msgstr "%d:%02d hrs:mins" + +#: ../src/viktrwlayer_analysis.c:658 +msgid "Include Invisible Items" +msgstr "Unsichtbare Elemente mit einbeziehen" + +#: ../src/vikstatus.c:129 +msgid "Current number of background tasks. Click to see the background jobs." +msgstr "" + +#: ../src/vikstatus.c:134 +msgid "Current zoom level. Click to select a new one." +msgstr "Aktuelle Vergrößerungsstufe. Anklicken, um sie zu ändern." + +#: ../src/vikstatus.c:141 +msgid "Left click to clear the message. Right click to copy the message." +msgstr "" + +#: ../src/vikutils.c:108 +msgid "GPSD" +msgstr "GPSD" + +#. GPS Preamble +#: ../src/vikutils.c:109 +msgid "Trkpt" +msgstr "Trkpt" + +#: ../src/vikutils.c:160 +#, c-format +msgid "%sSpeed%s %.1f%s" +msgstr "%sGeschwindigkeit%s %.1f%s" + +#. Go for 2dp as expect low values for vertical speeds +#: ../src/vikutils.c:214 +#, c-format +msgid "%sClimb%s %.2f%s" +msgstr "%sAnstieg%s %.2f%s" + +#: ../src/vikutils.c:223 +#, c-format +msgid "%sAlt %dfeet" +msgstr "%sAlt %dFuss" + +#. VIK_UNITS_HEIGHT_METRES: +#: ../src/vikutils.c:227 +#, c-format +msgid "%sAlt %dm" +msgstr "%sAlt %dm" + +#: ../src/vikutils.c:235 +#, c-format +msgid "%sCourse %03d°" +msgstr "%sKurs %03d°" + +#: ../src/vikutils.c:249 +msgid "yards" +msgstr "Yards" + +#. VIK_UNITS_DISTANCE_KILOMETRES: +#: ../src/vikutils.c:253 +msgid "m" +msgstr "m" + +#: ../src/vikutils.c:257 +#, c-format +msgid "%sDistance diff %d%s" +msgstr "" + +#: ../src/vikutils.c:272 +#, c-format +msgid "%sTime %s" +msgstr "%sZeit %s" + +#: ../src/vikutils.c:281 +#, c-format +msgid "%sTime diff %lds" +msgstr "%sZeit diff %lds" + +#: ../src/vikutils.c:287 +#, c-format +msgid "%sNo. of Sats %d" +msgstr "" + +#: ../src/vikutils.c:312 +#, c-format +msgid "%sTo End %.2f%s" +msgstr "" + +#: ../src/vikutils.c:339 +#, c-format +msgid "%sDistance along %.2f%s" +msgstr "" + +#: ../src/vikutils.c:359 +#, c-format +msgid "%sTrack: %s" +msgstr "%sTrack: %s" + +#: ../src/vikutils.c:396 +#, c-format +msgid "" +"There is a newer version of Viking available: %s\n" +"\n" +"Do you wish to go to Viking's website now?" +msgstr "" +"Es ist eine neue Version von Viking verfügbar: %s\n" +"\n" +"Möchten Sie zur Viking-Webseite wechseln?" + +#: ../src/vikutils.c:526 +msgid "" +"This appears to be Viking's very first run.\n" +"\n" +"Do you wish to enable automatic internet features?\n" +"\n" +"Individual settings can be controlled in the Preferences." +msgstr "" + +#: ../src/vikwaypoint.c:37 +msgid "Waypoint" +msgstr "Wegpunkt" + +#: ../src/vikwebtool_datasource.c:352 +msgid "Search Term" +msgstr "Suchbegriff" + +#. TODO get rid of this as this is unnecessary duplication... +#: ../src/vikwindow.c:258 +msgid "Pan" +msgstr "Greifer" + +#: ../src/vikwindow.c:258 +msgid "Zoom" +msgstr "Vergrößerung" + +#: ../src/vikwindow.c:258 +msgid "Ruler" +msgstr "Lineal" + +#: ../src/vikwindow.c:258 +msgid "Select" +msgstr "Auswahl" + +#: ../src/vikwindow.c:368 +msgid "This is Viking " +msgstr "" + +#: ../src/vikwindow.c:457 +msgid "Location lookup aborted" +msgstr "" + +#: ../src/vikwindow.c:477 +#, c-format +msgid "Location found: %s" +msgstr "" + +#: ../src/vikwindow.c:486 +msgid "Unable to determine location" +msgstr "" + +#: ../src/vikwindow.c:495 +msgid "Determining location" +msgstr "" + +#: ../src/vikwindow.c:525 +#, c-format +msgid "Location found via geoclue" +msgstr "" + +#: ../src/vikwindow.c:546 +msgid "Default Map" +msgstr "Standard-Karte" + +#: ../src/vikwindow.c:557 ../src/vikwindow.c:3938 +msgid "Trying to determine location..." +msgstr "" + +#. Create tooltip +#: ../src/vikwindow.c:723 +msgid "Select zoom level" +msgstr "Vergrößerungsstufe auswählen" + +#: ../src/vikwindow.c:1176 +#, c-format +msgid "" +"Do you want to save the changes you made to the document \"%s\"?\n" +"\n" +"Your changes will be lost if you don't save them." +msgstr "" +"Wollen Sie die Änderungen am Dokument \"%s\" speichern?\n" +"Ihre Änderungen gehen verloren, wenn Sie sie nicht speichern." + +#: ../src/vikwindow.c:1180 +msgid "Don't Save" +msgstr "Nicht speichern" + +#: ../src/vikwindow.c:1268 +msgid "mpp" +msgstr "mpp" + +#: ../src/vikwindow.c:1268 +msgid "pixelfact" +msgstr "pixelfact" + +#: ../src/vikwindow.c:1467 +#, c-format +msgid "%s %s %dm" +msgstr "%s %s %d m" + +#: ../src/vikwindow.c:1469 +#, c-format +msgid "%s %s %dft" +msgstr "%s %s %d ft" + +#: ../src/vikwindow.c:1472 +#, c-format +msgid "%s %s" +msgstr "%s %s" + +#: ../src/vikwindow.c:1929 +msgid "_Ruler" +msgstr "_Messwerkzeug" + +#: ../src/vikwindow.c:1929 +msgid "Ruler Tool" +msgstr "Messwerkzeug" + +#: ../src/vikwindow.c:2204 ../src/vikwindow.c:4818 +msgid "_Zoom" +msgstr "_Vergrößerung" + +#: ../src/vikwindow.c:2204 +msgid "Zoom Tool" +msgstr "Vergrößerungswerkzeug" + +#: ../src/vikwindow.c:2271 ../src/vikwindow.c:4819 +msgid "_Pan" +msgstr "_Greife" + +#: ../src/vikwindow.c:2271 +msgid "Pan Tool" +msgstr "Greifer-Werkzeug" + +#: ../src/vikwindow.c:2425 +msgid "_Select" +msgstr "Aus_wählen" + +#: ../src/vikwindow.c:2425 +msgid "Select Tool" +msgstr "Auswahlwerkzeug" + +#: ../src/vikwindow.c:2615 +msgid "You must select a layer to show its properties." +msgstr "Sie müssen eine Ebene auswählen, um ihre Eigenschaften anzuzeigen." + +#. No error to show, so unlikely this will get called +#: ../src/vikwindow.c:2629 +msgid "The help system is not available." +msgstr "" + +#. Main error path +#: ../src/vikwindow.c:2632 +#, c-format +msgid "" +"Help is not available because: %s.\n" +"Ensure a Mime Type ghelp handler program is installed (e.g. yelp)." +msgstr "" + +#: ../src/vikwindow.c:2865 +msgid "You must select a layer to delete." +msgstr "Sie müssen eine Ebene zum Löschen auswählen." + +#: ../src/vikwindow.c:3171 +msgid "Untitled" +msgstr "Unbenannt" + +#: ../src/vikwindow.c:3300 +#, c-format +msgid "Unable to add '%s' to the list of recently used documents" +msgstr "" +"'%s' kann der Liste der aktuell benutzten Dokumente nicht angefügt werden." + +#: ../src/vikwindow.c:3391 +msgid "The file you requested could not be opened." +msgstr "Die angeforderte Datei konnte nicht geöffnet werden." + +#: ../src/vikwindow.c:3394 +msgid "" +"GPSBabel is required to load files of this type or GPSBabel encountered " +"problems." +msgstr "" +"GPSBabel wird benötigt, um Dateien dieses Typs zu laden oder es gab ein " +"Problem beim Anwenden von GPSBabel." + +#: ../src/vikwindow.c:3397 +#, c-format +msgid "Unable to load malformed GPX file %s" +msgstr "" + +#: ../src/vikwindow.c:3400 +#, c-format +msgid "Unsupported file type for %s" +msgstr "Nicht unterstützter Dateityp für %s" + +#. Since we can process .vik files with issues just show a warning in the status bar +#. Not that a user can do much about it... or tells them what this issue is yet... +#: ../src/vikwindow.c:3406 +#, c-format +msgid "WARNING: issues encountered loading %s" +msgstr "" + +#: ../src/vikwindow.c:3489 +msgid "Please select a GPS data file to open. " +msgstr "Bitte geben Sie eine GPS-Datendatei zum Öffnen an. " + +#: ../src/vikwindow.c:3508 +msgid "Google Earth" +msgstr "Google Earth" + +#: ../src/vikwindow.c:3523 ../src/vikwindow.c:3646 ../src/viking.desktop.in.h:1 +msgid "Viking" +msgstr "Viking" + +#: ../src/vikwindow.c:3594 ../src/vikwindow.c:4632 +msgid "Open File" +msgstr "Datei öffnen" + +#: ../src/vikwindow.c:3630 +msgid "Save as Viking File." +msgstr "Als Viking-Datei speichern." + +#: ../src/vikwindow.c:3757 +#, c-format +msgid "Exporting to file: %s" +msgstr "Exportiere in Datei: %s" + +#. Confirm what happened. +#: ../src/vikwindow.c:3774 +#, c-format +msgid "Exported files: %d" +msgstr "Exportierte Dateien: %d" + +#: ../src/vikwindow.c:3786 +msgid "Nothing to Export!" +msgstr "Nichts zum Exportieren ausgewählt!" + +#: ../src/vikwindow.c:3790 +msgid "Export to directory" +msgstr "Exportieren ins Verzeichnis" + +#: ../src/vikwindow.c:3809 +msgid "Could not convert all files" +msgstr "Konnte nicht alle Dateien umwandeln" + +#: ../src/vikwindow.c:3851 +msgid "File not accessible" +msgstr "" + +#: ../src/vikwindow.c:3854 +msgid "No Viking File" +msgstr "Keine Viking-Datei" + +#: ../src/vikwindow.c:3998 +msgid "This layer has no configurable properties." +msgstr "" + +#: ../src/vikwindow.c:4080 +msgid "Are you sure you wish to delete all layers?" +msgstr "Sind Sie sicher, dass Sie alle Ebenen löschen wollen?" + +#. Try harder... +#: ../src/vikwindow.c:4126 ../src/vikwindow.c:4132 +msgid "Generating image file..." +msgstr "" + +#: ../src/vikwindow.c:4154 +msgid "" +"Failed to generate internal image.\n" +"\n" +"Try creating a smaller image." +msgstr "" + +#: ../src/vikwindow.c:4175 +msgid "Image file generated." +msgstr "" + +#: ../src/vikwindow.c:4177 +msgid "Failed to generate image file." +msgstr "" + +#: ../src/vikwindow.c:4246 +#, c-format +msgid "Unable to write to file %s: %s" +msgstr "" + +#: ../src/vikwindow.c:4284 +msgid "" +"Viewable region outside allowable pixel size bounds for image. Clipping " +"width/height values." +msgstr "" +"Der sichtbare Bereich liegt außerhalb der erlaubten Pixelzahl des Bildes. " +"Höhe/Breite beschnitten." + +#: ../src/vikwindow.c:4309 +#, c-format +msgid "Total area: %ldm x %ldm (%.3f sq. km)" +msgstr "Gesamtareal: %ld m x %ld m (%.3f km²)" + +#: ../src/vikwindow.c:4312 +#, c-format +msgid "Total area: %ldm x %ldm (%.3f sq. miles)" +msgstr "Gesamtareal: %ld m x %ld m (%.3f Quadratmeilen)" + +#: ../src/vikwindow.c:4315 +#, c-format +msgid "Total area: %ldm x %ldm (%.3f sq. NM)" +msgstr "" + +#. Single file +#: ../src/vikwindow.c:4343 +msgid "Save Image" +msgstr "Bild speichern" + +#: ../src/vikwindow.c:4364 ../src/vikwindow.c:4641 +msgid "KMZ" +msgstr "" + +#: ../src/vikwindow.c:4417 +msgid "You must be in UTM mode to use this feature" +msgstr "Diese Funktion nur im UTM-Modus möglich." + +#: ../src/vikwindow.c:4421 +msgid "Choose a directory to hold images" +msgstr "Ein Verzeichnis für Speicherung der Bilder auswählen" + +#. todo: default for answers inside VikWindow or static (thruout instance) +#: ../src/vikwindow.c:4441 +msgid "Save to Image File" +msgstr "Als Bild-Datei speichern" + +#: ../src/vikwindow.c:4457 +msgid "Width (pixels):" +msgstr "Breite (Pixel):" + +#: ../src/vikwindow.c:4459 +msgid "Height (pixels):" +msgstr "Höhe (Pixel):" + +#: ../src/vikwindow.c:4462 +msgid "" +"WARNING: USING LARGE IMAGES OVER 10000x10000\n" +"MAY CRASH THE PROGRAM!" +msgstr "" + +#: ../src/vikwindow.c:4464 +msgid "Zoom (meters per pixel):" +msgstr "Vergrösserung (Meter pro Pixel):" + +#: ../src/vikwindow.c:4480 +msgid "Area in current viewable window" +msgstr "Bereich in aktuell sichtbarem Fenster" + +#: ../src/vikwindow.c:4490 +msgid "Save as PNG" +msgstr "Als PNG speichern" + +#: ../src/vikwindow.c:4491 +msgid "Save as JPEG" +msgstr "Als JPEG speichern" + +#: ../src/vikwindow.c:4520 +msgid "East-west image tiles:" +msgstr "Ost-West-Bildkachel:" + +#: ../src/vikwindow.c:4522 +msgid "North-south image tiles:" +msgstr "Nord-Süd-Bildkachel:" + +#: ../src/vikwindow.c:4619 +msgid "This feature is not available in UTM mode" +msgstr "" + +#: ../src/vikwindow.c:4658 +#, c-format +msgid "Unable to import %s." +msgstr "" + +#: ../src/vikwindow.c:4749 +msgid "Choose a background color" +msgstr "Hintergrundfarbe wählen" + +#: ../src/vikwindow.c:4765 +msgid "Choose a track highlight color" +msgstr "Farbe für Hervorhebung der Spur wählen" + +#: ../src/vikwindow.c:4814 +msgid "_File" +msgstr "_Datei" + +#: ../src/vikwindow.c:4815 +msgid "_Edit" +msgstr "_Bearbeiten" + +#: ../src/vikwindow.c:4817 +msgid "_Show" +msgstr "_Anzeigen" + +#: ../src/vikwindow.c:4820 +msgid "_Layers" +msgstr "_Ebenen" + +#: ../src/vikwindow.c:4821 +msgid "_Tools" +msgstr "_Werkzeuge" + +#: ../src/vikwindow.c:4822 +msgid "_Webtools" +msgstr "_Internetwerkzeuge" + +#: ../src/vikwindow.c:4823 ../src/vikwindow.c:4893 +msgid "_Help" +msgstr "_Hilfe" + +#: ../src/vikwindow.c:4825 +msgid "New file" +msgstr "Neue Datei" + +#: ../src/vikwindow.c:4826 +msgid "_Open..." +msgstr "_Öffnen..." + +#: ../src/vikwindow.c:4826 +msgid "Open a file" +msgstr "Eine Datei öffnen" + +#: ../src/vikwindow.c:4827 +msgid "Open _Recent File" +msgstr "_Zuletzt geöffnet" + +#: ../src/vikwindow.c:4828 +msgid "Append _File..." +msgstr "Datei _anfügen..." + +#: ../src/vikwindow.c:4828 +msgid "Append data from a different file" +msgstr "Daten auf einer anderen Datei anfügen" + +#: ../src/vikwindow.c:4829 +msgid "Open GPX as External _Layer..." +msgstr "" + +#: ../src/vikwindow.c:4829 +msgid "Open a GPX file as an external layer" +msgstr "" + +#: ../src/vikwindow.c:4830 +msgid "_Export All" +msgstr "ALles _exportieren" + +#: ../src/vikwindow.c:4830 +msgid "Export All TrackWaypoint Layers" +msgstr "" + +#: ../src/vikwindow.c:4831 +msgid "_GPX..." +msgstr "_GPX ..." + +#: ../src/vikwindow.c:4831 +msgid "Export as GPX" +msgstr "Als GPX exportieren" + +#: ../src/vikwindow.c:4832 +msgid "A_cquire" +msgstr "_Laden" + +#: ../src/vikwindow.c:4833 +msgid "_Directions..." +msgstr "_Richtungen ..." + +#: ../src/vikwindow.c:4833 +msgid "Get driving directions" +msgstr "" + +#: ../src/vikwindow.c:4835 +msgid "_OSM Traces..." +msgstr "_OSM-Spuren..." + +#: ../src/vikwindow.c:4835 +msgid "Get traces from OpenStreetMap" +msgstr "Hole Spuren von Openstreetmap" + +#: ../src/vikwindow.c:4836 +msgid "_My OSM Traces..." +msgstr "_Meine OSM-Spuren ..." + +#: ../src/vikwindow.c:4836 +msgid "Get Your Own Traces from OpenStreetMap" +msgstr "" + +#: ../src/vikwindow.c:4839 +msgid "Geo_caches..." +msgstr "Geo_caches..." + +#: ../src/vikwindow.c:4839 +msgid "Get Geocaches from geocaching.com" +msgstr "Geocaches von geocaching.com beziehen" + +#: ../src/vikwindow.c:4842 +msgid "Create waypoints from geotagged images" +msgstr "Erzeuge Wegpunkte aus georeferenzierten Bildern" + +#: ../src/vikwindow.c:4844 +msgid "Get a file from a URL" +msgstr "" + +#: ../src/vikwindow.c:4846 +msgid "Create waypoints from Wikipedia items in the current view" +msgstr "" + +#: ../src/vikwindow.c:4848 +msgid "_Save" +msgstr "_Speichern" + +#: ../src/vikwindow.c:4848 +msgid "Save the file" +msgstr "Datei speichern" + +#: ../src/vikwindow.c:4849 +msgid "Save _As..." +msgstr "Speichern _unter …" + +#: ../src/vikwindow.c:4849 +msgid "Save the file under different name" +msgstr "Datei unter anderem Namen Speichern" + +#: ../src/vikwindow.c:4850 +msgid "Properties..." +msgstr "Eigenschaften …" + +#: ../src/vikwindow.c:4850 +msgid "File Properties" +msgstr "Datei-Eigenschaften" + +#: ../src/vikwindow.c:4852 +msgid "Import KMZ _Map File..." +msgstr "" + +#: ../src/vikwindow.c:4852 +msgid "Import a KMZ file" +msgstr "Importiere eine KMZ-Datei" + +#: ../src/vikwindow.c:4853 +msgid "Generate _KMZ Map File..." +msgstr "" + +#: ../src/vikwindow.c:4853 +msgid "Generate a KMZ file with an overlay of the current view" +msgstr "" + +#: ../src/vikwindow.c:4855 +msgid "_Generate Image File..." +msgstr "_Bild-Datei erzeugen..." + +#: ../src/vikwindow.c:4855 +msgid "Save a snapshot of the workspace into a file" +msgstr "Speichere Schnappschuss des Arbeitsbereichs in einer Datei." + +#: ../src/vikwindow.c:4856 +msgid "Generate _Directory of Images..." +msgstr "Bild-_Verzeichnis erzeugen..." + +#: ../src/vikwindow.c:4856 +msgid "Generate _Directory of Images" +msgstr "" + +#: ../src/vikwindow.c:4857 +msgid "_Print..." +msgstr "_Drucken …" + +#: ../src/vikwindow.c:4857 +msgid "Print maps" +msgstr "Karten drucken" + +#: ../src/vikwindow.c:4858 +msgid "E_xit" +msgstr "Be_enden" + +#: ../src/vikwindow.c:4858 +msgid "Exit the program" +msgstr "Das Programm beenden" + +#: ../src/vikwindow.c:4859 +msgid "Save and Exit" +msgstr "Speichern _und beenden" + +#: ../src/vikwindow.c:4859 +msgid "Save and Exit the program" +msgstr "Speichern und das Programm beenden" + +#: ../src/vikwindow.c:4861 +msgid "Go to the Pre_vious Location" +msgstr "Eine Position _zurück" + +#: ../src/vikwindow.c:4861 +msgid "Go to the previous location" +msgstr "Gehe eine Position zurück" + +#: ../src/vikwindow.c:4862 +msgid "Go to the _Next Location" +msgstr "Eine Position nach _vorn" + +#: ../src/vikwindow.c:4862 +msgid "Go to the next location" +msgstr "Gehe eine Position nach vorn" + +#: ../src/vikwindow.c:4863 +msgid "Go to the _Default Location" +msgstr "Gehe zum _Ausgangsstandort" + +#: ../src/vikwindow.c:4863 +msgid "Go to the default location" +msgstr "Gehe zum Ausgangsstandort" + +#: ../src/vikwindow.c:4864 +#, fuzzy +msgid "Go to the _Auto Location" +msgstr "Eine Position nach _vorn" + +#: ../src/vikwindow.c:4864 +msgid "Go to a location via automatic lookup" +msgstr "" + +#: ../src/vikwindow.c:4865 +msgid "Go to _Location..." +msgstr "Gehe zum _Ort" + +#: ../src/vikwindow.c:4865 +msgid "Go to address/place using text search" +msgstr "Gehe zu Adresse/Ort mittels _Textsuche" + +#: ../src/vikwindow.c:4866 +msgid "_Go to Lat/Lon..." +msgstr "Gehe zu B_reite/Länge..." + +#: ../src/vikwindow.c:4866 +msgid "Go to arbitrary lat/lon coordinate" +msgstr "Gehe zu beliebiger Breiten-/Längenkoordinate" + +#: ../src/vikwindow.c:4867 +msgid "Go to UTM..." +msgstr "Gehe zu _UTM..." + +#: ../src/vikwindow.c:4867 +msgid "Go to arbitrary UTM coordinate" +msgstr "Gehe zu beliebiger UTM-Koordinate" + +#: ../src/vikwindow.c:4868 +#, fuzzy +msgid "Go to Today" +msgstr "Gehe zu UTM" + +#: ../src/vikwindow.c:4868 +msgid "Go to today on the calendar" +msgstr "" + +#: ../src/vikwindow.c:4869 +msgid "_Refresh" +msgstr "_Aktualisieren" + +#: ../src/vikwindow.c:4869 +msgid "Refresh any maps displayed" +msgstr "Aktualisiere alle angezeigten Karten" + +#: ../src/vikwindow.c:4870 +msgid "Set _Highlight Color..." +msgstr "Farbe für _Hervorhebung wählen..." + +#: ../src/vikwindow.c:4870 +msgid "Set Highlight Color" +msgstr "Vordergrundfarbe festlegen" + +#: ../src/vikwindow.c:4871 +msgid "Set Bac_kground Color..." +msgstr "Hintergrund_farbe" + +#: ../src/vikwindow.c:4871 +msgid "Set Background Color" +msgstr "Hintergrundfarbe festlegen" + +#: ../src/vikwindow.c:4872 +msgid "Zoom _In" +msgstr "Ver_größern" + +#: ../src/vikwindow.c:4872 +msgid "Zoom In" +msgstr "Vergrößern" + +#: ../src/vikwindow.c:4873 +msgid "Zoom _Out" +msgstr "Ver_kleinern" + +#: ../src/vikwindow.c:4873 +msgid "Zoom Out" +msgstr "Ansicht verkleinern" + +#: ../src/vikwindow.c:4874 +msgid "Zoom _To..." +msgstr "Zoome _auf..." + +#: ../src/vikwindow.c:4874 +msgid "Zoom To" +msgstr "" + +#: ../src/vikwindow.c:4875 +msgid "Pan _North" +msgstr "Richtung _Nord" + +#: ../src/vikwindow.c:4876 +msgid "Pan _East" +msgstr "Richtung _Ost" + +#: ../src/vikwindow.c:4877 +msgid "Pan _South" +msgstr "Richtung _Süd" + +#: ../src/vikwindow.c:4878 +msgid "Pan _West" +msgstr "Richtung _West" + +#: ../src/vikwindow.c:4879 +msgid "Background _Jobs" +msgstr "Hintergrund_aufträge" + +#: ../src/vikwindow.c:4879 +msgid "Background Jobs" +msgstr "" + +#: ../src/vikwindow.c:4881 +msgid "Cu_t" +msgstr "_Ausschneiden" + +#: ../src/vikwindow.c:4885 +msgid "Delete All" +msgstr "_Alle löschen" + +#: ../src/vikwindow.c:4886 +msgid "Copy Centre _Location" +msgstr "" + +#: ../src/vikwindow.c:4887 +msgid "_Flush Map Cache" +msgstr "Kartenpu_ffer löschen" + +#: ../src/vikwindow.c:4888 +msgid "_Set the Default Location" +msgstr "Ausgangsstandort _setzen" + +#: ../src/vikwindow.c:4888 +msgid "Set the Default Location to the current position" +msgstr "Ausgangsstandort auf aktuelle Position setzen" + +#: ../src/vikwindow.c:4889 +msgid "_Preferences" +msgstr "_Einstellungen" + +#: ../src/vikwindow.c:4889 +msgid "Program Preferences" +msgstr "" + +#: ../src/vikwindow.c:4890 +msgid "_Layer Defaults" +msgstr "_Ebenen-Standards" + +#: ../src/vikwindow.c:4891 +msgid "_Properties" +msgstr "Ei_genschaften..." + +#: ../src/vikwindow.c:4893 +msgid "Help" +msgstr "" + +#: ../src/vikwindow.c:4894 +msgid "_About" +msgstr "_Über" + +#: ../src/vikwindow.c:4894 +msgid "About" +msgstr "" + +#: ../src/vikwindow.c:4903 +msgid "_KML..." +msgstr "_KML ..." + +#: ../src/vikwindow.c:4903 +msgid "Export as KML" +msgstr "Als KML exportieren" + +#: ../src/vikwindow.c:4904 +msgid "Transfer data from a GPS device" +msgstr "Daten von GPS-Gerät übertragen" + +#: ../src/vikwindow.c:4905 +msgid "Import file via GPSBabel converter" +msgstr "Importiere Datei über den GPSBabel-Dateikonvertierer" + +#: ../src/vikwindow.c:4909 +msgid "Import Geo_JSON File..." +msgstr "" + +#: ../src/vikwindow.c:4909 +msgid "Import GeoJSON file" +msgstr "" + +#: ../src/vikwindow.c:4914 +msgid "_UTM Mode" +msgstr "_UTM-Modus" + +#: ../src/vikwindow.c:4915 +msgid "_Expedia Mode" +msgstr "_Expedia-Modus" + +#: ../src/vikwindow.c:4916 +msgid "_Mercator Mode" +msgstr "_Mercator-Modus" + +#: ../src/vikwindow.c:4917 +msgid "Lat_/Lon Mode" +msgstr "Längen-_/Breitengrad-Modus" + +#: ../src/vikwindow.c:4921 +msgid "Show _Scale" +msgstr "Maß_stab anzeigen" + +#: ../src/vikwindow.c:4921 +msgid "Show Scale" +msgstr "Maßstab anzeigen" + +#: ../src/vikwindow.c:4922 +msgid "Show _Center Mark" +msgstr "_Mittenmarkierung anzeigen" + +#: ../src/vikwindow.c:4922 +msgid "Show Center Mark" +msgstr "Zentrumsmarkierung anzeigen" + +#: ../src/vikwindow.c:4923 +msgid "Show _Highlight" +msgstr "_Hervorhebung anzeigen" + +#: ../src/vikwindow.c:4923 +msgid "Show Highlight" +msgstr "Hervorhebung anzeigen" + +#: ../src/vikwindow.c:4924 +msgid "_Full Screen" +msgstr "_Vollbild" + +#: ../src/vikwindow.c:4924 +msgid "Activate full screen mode" +msgstr "Vollbildmodus aktivieren" + +#: ../src/vikwindow.c:4925 +msgid "Show Side _Panel" +msgstr "Seiten_fenster anzeigen" + +#: ../src/vikwindow.c:4925 +msgid "Show Side Panel" +msgstr "Seitenfenster anzeigen" + +#: ../src/vikwindow.c:4926 +msgid "Show Status_bar" +msgstr "Status_leiste anzeigen" + +#: ../src/vikwindow.c:4926 +msgid "Show Statusbar" +msgstr "Statusleiste anzeigen" + +#: ../src/vikwindow.c:4927 +msgid "Show _Toolbar" +msgstr "_Werkzeugleiste anzeigen" + +#: ../src/vikwindow.c:4927 +msgid "Show Toolbar" +msgstr "Werkzeugleiste anzeigen" + +#: ../src/vikwindow.c:4928 +msgid "Show _Menu" +msgstr "_Menü anzeigen" + +#: ../src/vikwindow.c:4928 +msgid "Show Menu" +msgstr "Menü anzeigen" + +#: ../src/vikwindow.c:4929 +#, fuzzy +msgid "Show Side Panel B_uttons" +msgstr "Seitenfenster anzeigen" + +#: ../src/vikwindow.c:4929 +#, fuzzy +msgid "Show Side Panel Buttons" +msgstr "Seitenfenster anzeigen" + +#: ../src/vikwindow.c:4930 +#, fuzzy +msgid "Show Side Panel Ca_lendar" +msgstr "Seitenfenster anzeigen" + +#: ../src/vikwindow.c:4930 +#, fuzzy +msgid "Show Side Panel Calendar" +msgstr "Seitenfenster anzeigen" + +#: ../src/vikwindow.c:5064 +#, c-format +msgid "New _%s Layer" +msgstr "Neue %s Ebene" + +#: ../src/vikwindow.c:5114 +#, fuzzy +msgid "..." +msgstr "Hinzufügen ..." + +#: ../src/viking.desktop.in.h:2 +msgid "GPS Data Manager" +msgstr "GPS-Daten-Manager" + +#: ../src/viking.desktop.in.h:3 +msgid "Map Based GPS Data Manager (live data capable)." +msgstr "Kartenbasierter GPS Daten-Manager (Live-Daten fähig)" + +#: ../src/libjpeg/jpeg-data.c:205 +msgid "Data does not follow JPEG specification." +msgstr "Daten erfüllen nicht die JPEG-Spezifikation." + +#: ../src/libjpeg/jpeg-data.c:302 +#, c-format +msgid "Path '%s' invalid." +msgstr "Pfad '%s' ist ungültig." + +#: ../src/libjpeg/jpeg-data.c:320 +#, c-format +msgid "Could not read '%s'." +msgstr "Konnte '%s' nicht lesen." + +#~ msgid "en" +#~ msgstr "en" + +#~ msgid "Polygonzied Layer" +#~ msgstr "Polygon-Ebene" + +#~ msgid "Email:" +#~ msgstr "E-Mail:" + +#~ msgid "I don't know that place. Do you want another goto?" +#~ msgstr "Dieser Ort ist unbekannt. Wollen Sie einen anderen wählen?" + +#~ msgid "Error: couldn't find gpsbabel." +#~ msgstr "Fehler: gpsbabel nicht gefunden." + +#~ msgid "Create _Track" +#~ msgstr "_Track erzeugen" + +#~ msgid "Create Track" +#~ msgstr "Spur er_zeugen" + +#~ msgid "Create _Route" +#~ msgstr "_Route erzeugen" + +#~ msgid "Create Route" +#~ msgstr "Route erzeugen" + +#~ msgid "%.2f knots\n" +#~ msgstr "%.2f Knoten\n" diff --git a/po/el.po b/po/el.po new file mode 100644 index 0000000..6cfd44c --- /dev/null +++ b/po/el.po @@ -0,0 +1,6085 @@ +# Greek translation for viking +# Copyright (c) 2008 Rosetta Contributors and Canonical Ltd 2008 +# This file is distributed under the same license as the viking package. +# FIRST AUTHOR , 2008. +# +msgid "" +msgstr "" +"Project-Id-Version: viking\n" +"Report-Msgid-Bugs-To: \n" +"POT-Creation-Date: 2019-01-19 12:53+0000\n" +"PO-Revision-Date: 2010-11-16 03:07+0000\n" +"Last-Translator: Guilhem Bonnefille \n" +"Language-Team: Greek \n" +"Language: el\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-Launchpad-Export-Date: 2018-12-21 17:32+0000\n" +"X-Generator: Launchpad (build 18847)\n" + +#: ../src/acquire.c:106 ../src/vikgpslayer.c:1367 +msgid "Done." +msgstr "Ολοκληρώθηκε." + +#: ../src/acquire.c:115 +msgid "No data." +msgstr "Χωρίς δεδομένα" + +#: ../src/acquire.c:167 ../src/acquire.c:415 +msgid "Error: acquisition failed." +msgstr "" + +#: ../src/acquire.c:339 +msgid "Working..." +msgstr "Εργασία..." + +#. This shouldn't happen... +#: ../src/acquire.c:406 +msgid "" +"Unable to create command\n" +"Acquire method failed." +msgstr "" + +#: ../src/acquire.c:513 +msgid "_Filter" +msgstr "" + +#: ../src/acquire.c:528 +#, c-format +msgid "Filter with %s" +msgstr "" + +#: ../src/acquire.c:545 +msgid "Filter" +msgstr "" + +#: ../src/babel.c:640 +msgid "GPSBabel:" +msgstr "" + +#: ../src/babel.c:641 +msgid "" +"Allow setting the specific instance of GPSBabel. You must restart Viking for " +"this value to take effect." +msgstr "" + +#: ../src/babel_ui.c:79 +msgid "Select a file format" +msgstr "" + +#: ../src/babel_ui.c:144 ../src/viktrwlayer.c:531 ../src/viktrwlayer.c:2882 +msgid "Tracks" +msgstr "" + +#: ../src/babel_ui.c:149 ../src/viktrwlayer.c:2892 +msgid "Routes" +msgstr "" + +#. ***** PARAMETERS ***** +#: ../src/babel_ui.c:154 ../src/viktrwlayer.c:531 ../src/viktrwlayer.c:2887 +msgid "Waypoints" +msgstr "" + +#: ../src/background.c:64 +#, c-format +msgid "%d items" +msgstr "" + +#: ../src/background.c:287 +msgid "Threads:" +msgstr "" + +#: ../src/background.c:288 +msgid "" +"Number of threads to use for Mapnik tasks. You need to restart Viking for a " +"change to this value to be used" +msgstr "" + +#: ../src/background.c:361 +msgid "Job" +msgstr "Εργασία" + +#: ../src/background.c:365 +msgid "Progress" +msgstr "Πρόοδος" + +#: ../src/background.c:373 +msgid "Viking Background Jobs" +msgstr "" + +#: ../src/bing.c:42 +msgid "Bing Aerial" +msgstr "" + +#: ../src/bing.c:48 +msgid "Bing" +msgstr "" + +#. VIK_GTK_WINDOW_FROM_WIDGET(vp) +#: ../src/bingmapsource.c:514 +msgid "Bing attribution Loading" +msgstr "" + +#: ../src/clipboard.c:95 +msgid "paste failed" +msgstr "η επικόλληση απέτυχε" + +#: ../src/clipboard.c:105 +msgid "wrong clipboard data size" +msgstr "" + +#: ../src/clipboard.c:124 +#, c-format +msgid "" +"The clipboard contains sublayer data for %s layers. You must select a layer " +"of this type to paste the clipboard data." +msgstr "" + +#: ../src/clipboard.c:264 +msgid "" +"In order to paste a waypoint, please select an appropriate layer to paste " +"into." +msgstr "" + +#: ../src/dialog.c:60 +msgid "Go to Lat/Lon" +msgstr "" + +#: ../src/dialog.c:69 ../src/viktrwlayer_wpwin.c:173 +msgid "Latitude:" +msgstr "Γεωγραφικό πλάτος:" + +#: ../src/dialog.c:72 ../src/viktrwlayer_wpwin.c:177 +msgid "Longitude:" +msgstr "Γεωγραφικό μήκος:" + +#: ../src/dialog.c:102 +msgid "Go to UTM" +msgstr "" + +#: ../src/dialog.c:114 +msgid "Northing:" +msgstr "" + +#: ../src/dialog.c:117 +msgid "Easting:" +msgstr "" + +#: ../src/dialog.c:121 ../src/vikgeoreflayer.c:902 +msgid "Zone:" +msgstr "Ζώνη:" + +#: ../src/dialog.c:124 ../src/vikgeoreflayer.c:904 +msgid "Letter:" +msgstr "Επιστολή:" + +#: ../src/dialog.c:246 ../src/geonamessearch.c:238 +#: ../src/datasource_osm_my_traces.c:505 +msgid "Nothing was selected" +msgstr "Δεν επιλέχθηκε τίποτα" + +#: ../src/dialog.c:254 +msgid "Add Route" +msgstr "" + +#: ../src/dialog.c:254 +msgid "Add Track" +msgstr "Προσθήκη Ίχνους" + +#: ../src/dialog.c:262 +msgid "Route Name:" +msgstr "" + +#: ../src/dialog.c:262 +msgid "Track Name:" +msgstr "Όνομα Ίχνους" + +#: ../src/dialog.c:282 +msgid "Please enter a name for the track." +msgstr "Παρακαλώ εισάγετε ένα όνομα για το ίχνος" + +#: ../src/dialog.c:311 +msgid "Today" +msgstr "" + +#: ../src/dialog.c:393 +msgid "Zoom Factors..." +msgstr "" + +#: ../src/dialog.c:407 +msgid "Zoom factor (in meters per pixel):" +msgstr "" + +#: ../src/dialog.c:408 +msgid "X (easting): " +msgstr "" + +#: ../src/dialog.c:409 +msgid "Y (northing): " +msgstr "" + +#: ../src/dialog.c:414 +msgid "X and Y zoom factors must be equal" +msgstr "" + +#: ../src/dialog.c:469 +msgid "1 min" +msgstr "" + +#: ../src/dialog.c:470 +msgid "1 hour" +msgstr "1 ώρα" + +#: ../src/dialog.c:471 +msgid "1 day" +msgstr "1 ημέρα" + +#: ../src/dialog.c:472 +msgid "Custom (in minutes):" +msgstr "" + +#: ../src/dialog.c:608 +#, c-format +msgid "" +"2003-2008, Evan Battaglia\n" +"2008-%s, Viking's contributors" +msgstr "" + +#: ../src/dialog.c:609 +msgid "GPS Data and Topo Analyzer, Explorer, and Manager." +msgstr "" + +#: ../src/dialog.c:610 +msgid "" +"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.\n" +"\n" +"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.\n" +"\n" +"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., 59 Temple " +"Place, Suite 330, Boston, MA 02111-1307, USA" +msgstr "" + +#: ../src/dialog.c:703 +msgid "Translation is coordinated on http://launchpad.net/viking" +msgstr "" + +#: ../src/dialog.c:713 +msgid "Download along track" +msgstr "" + +#: ../src/dialog.c:720 +msgid "Map type:" +msgstr "Τύπος χάρτη:" + +#: ../src/dialog.c:726 +msgid "Zoom level:" +msgstr "Επίπεδο εστίασης:" + +#: ../src/dialog.c:766 +#, c-format +msgid "The map data is licensed: %s." +msgstr "" + +#: ../src/dialog.c:769 +#, c-format +msgid "" +"The data provided by '%s' are licensed under the following license: " +"%s." +msgstr "" + +#: ../src/dialog.c:773 +msgid "Open license" +msgstr "" + +#: ../src/expedia.c:54 +msgid "Expedia Street Maps" +msgstr "Χάρτες Δρόμων Expedia" + +#: ../src/expedia.c:82 +msgid "Invalid expedia altitude" +msgstr "" + +#: ../src/expedia.c:113 +#, c-format +msgid "" +"Couldn't open EXPEDIA image file (right after successful download! Please " +"report and delete image file!): %s" +msgstr "" + +#: ../src/expedia.c:126 +#, c-format +msgid "" +"Couldn't save EXPEDIA image file (right after successful download! Please " +"report and delete image file!): %s" +msgstr "" + +#: ../src/geonamessearch.c:115 +msgid "Search" +msgstr "Αναζήτηση" + +#: ../src/geonamessearch.c:117 +msgid "No entries found!" +msgstr "Δεν βρέθηκαν εγγραφές" + +#. NB could allow columns to be shifted around by doing this after each new +#. gtk_tree_view_column_set_reorderable ( column, TRUE ); +#. However I don't think is that useful, so I haven't put it in +#: ../src/geonamessearch.c:171 ../src/datasource_osm_my_traces.c:422 +#: ../src/viktrwlayer_tracklist.c:621 ../src/viktrwlayer_waypointlist.c:618 +msgid "Name" +msgstr "" + +#: ../src/geonamessearch.c:176 +msgid "Feature" +msgstr "" + +#: ../src/geonamessearch.c:181 ../src/datasource_osm_my_traces.c:437 +msgid "Lat/Lon" +msgstr "" + +#: ../src/geonamessearch.c:264 ../src/googlesearch.c:101 ../src/vikgoto.c:430 +msgid "couldn't map temp file" +msgstr "Δεν μπορεί να χαρτογραφηθεί το αρχείο temp" + +#: ../src/geonamessearch.c:459 +msgid "Select articles" +msgstr "" + +#: ../src/geonamessearch.c:459 +msgid "Select the articles you want to add." +msgstr "" + +#: ../src/geonamessearch.c:475 +msgid "city" +msgstr "" + +#: ../src/geonamessearch.c:477 +msgid "edu" +msgstr "" + +#: ../src/geonamessearch.c:479 +msgid "airport" +msgstr "" + +#: ../src/geonamessearch.c:481 +msgid "mountain" +msgstr "" + +#: ../src/geonamessearch.c:483 +msgid "forest" +msgstr "" + +#: ../src/geonamessearch.c:485 +msgid "church" +msgstr "" + +#: ../src/geojson.c:74 +#, c-format +msgid "%s command failed: %s" +msgstr "" + +#: ../src/geojson.c:146 ../src/gpx.c:1317 +#, c-format +msgid "failed to open temporary file: %s" +msgstr "" + +#: ../src/globals.c:67 +msgid "DDD" +msgstr "" + +#: ../src/globals.c:67 +msgid "DMM" +msgstr "" + +#: ../src/globals.c:67 +msgid "DMS" +msgstr "" + +#: ../src/globals.c:67 +msgid "Raw" +msgstr "" + +#: ../src/globals.c:68 +msgid "Kilometres" +msgstr "" + +#: ../src/globals.c:68 +msgid "Miles" +msgstr "" + +#: ../src/globals.c:68 +msgid "Nautical Miles" +msgstr "" + +#. VIK_UNITS_SPEED_KILOMETRES_PER_HOUR: +#: ../src/globals.c:69 ../src/viktrwlayer_tracklist.c:655 ../src/vikutils.c:100 +msgid "km/h" +msgstr "" + +#: ../src/globals.c:69 ../src/viktrwlayer_tracklist.c:656 ../src/vikutils.c:78 +msgid "mph" +msgstr "" + +#. VIK_UNITS_SPEED_METRES_PER_SECOND: +#: ../src/globals.c:69 ../src/viktrwlayer_tracklist.c:663 ../src/vikutils.c:81 +msgid "m/s" +msgstr "" + +#: ../src/globals.c:69 ../src/viktrwlayer_tracklist.c:657 ../src/vikutils.c:84 +msgid "knots" +msgstr "" + +#: ../src/globals.c:69 ../src/viktrwlayer_tracklist.c:658 ../src/vikutils.c:87 +msgid "s/km" +msgstr "" + +#: ../src/globals.c:69 ../src/viktrwlayer_tracklist.c:659 ../src/vikutils.c:90 +msgid "min/km" +msgstr "" + +#: ../src/globals.c:69 +msgid "s/mi" +msgstr "" + +#: ../src/globals.c:69 ../src/viktrwlayer_tracklist.c:661 ../src/vikutils.c:96 +msgid "min/mi" +msgstr "" + +#: ../src/globals.c:70 +msgid "Metres" +msgstr "" + +#: ../src/globals.c:70 +msgid "Feet" +msgstr "" + +#: ../src/globals.c:73 +msgid "Locale" +msgstr "" + +#: ../src/globals.c:73 +msgid "World" +msgstr "" + +#: ../src/globals.c:73 +msgid "UTC" +msgstr "" + +#: ../src/globals.c:76 +msgid "Degree format:" +msgstr "" + +#: ../src/globals.c:77 +msgid "Distance units:" +msgstr "" + +#: ../src/globals.c:78 +msgid "Speed units:" +msgstr "" + +#: ../src/globals.c:79 +msgid "Height units:" +msgstr "" + +#: ../src/globals.c:80 +msgid "Use large waypoint icons:" +msgstr "" + +#: ../src/globals.c:81 +msgid "Default latitude:" +msgstr "" + +#: ../src/globals.c:82 +msgid "Default longitude:" +msgstr "" + +#: ../src/globals.c:83 +msgid "Time Display:" +msgstr "" + +#: ../src/globals.c:84 +msgid "" +"Display times according to the reference frame. Locale is the user's system " +"setting. World is relative to the location of the object." +msgstr "" + +#: ../src/globals.c:90 +msgid "Alphabetical" +msgstr "" + +#: ../src/globals.c:90 ../src/datasource_osm_my_traces.c:432 +msgid "Time" +msgstr "" + +#: ../src/globals.c:90 +msgid "Creation" +msgstr "" + +#: ../src/globals.c:91 +msgid "Title Case" +msgstr "" + +#: ../src/globals.c:91 +msgid "Lowercase" +msgstr "" + +#: ../src/globals.c:94 +msgid "KML File Export Units:" +msgstr "" + +#: ../src/globals.c:95 +msgid "GPX Track Order:" +msgstr "" + +#: ../src/globals.c:96 +msgid "GPX Waypoint Symbols:" +msgstr "" + +#: ../src/globals.c:97 +msgid "" +"Save GPX Waypoint Symbol names in the specified case. May be useful for " +"compatibility with various devices" +msgstr "" + +#: ../src/globals.c:98 +msgid "GPX Creator:" +msgstr "" + +#: ../src/globals.c:99 +msgid "" +"The creator value when writing a GPX file. Otherwise when blank a default is " +"used." +msgstr "" + +#: ../src/globals.c:104 +msgid "Image Viewer:" +msgstr "" + +#: ../src/globals.c:109 +msgid "External GPX Program 1:" +msgstr "" + +#: ../src/globals.c:110 +msgid "External GPX Program 2:" +msgstr "" + +#: ../src/globals.c:113 +msgid "Absolute" +msgstr "" + +#: ../src/globals.c:113 +msgid "Relative" +msgstr "" + +#: ../src/globals.c:117 +msgid "Save File Reference Mode:" +msgstr "" + +#: ../src/globals.c:118 +msgid "" +"When saving a Viking .vik file, this determines how the directory paths of " +"filenames are written." +msgstr "" + +#: ../src/globals.c:119 +msgid "Ask for Name before Track Creation:" +msgstr "" + +#: ../src/globals.c:120 +msgid "Show Tooltip during Track Creation:" +msgstr "" + +#: ../src/globals.c:121 +msgid "The number of recent files:" +msgstr "" + +#: ../src/globals.c:122 +msgid "" +"Only applies to new windows or on application restart. -1 means all " +"available files." +msgstr "" + +#: ../src/globals.c:123 +#, fuzzy +msgid "Open files in selected layer:" +msgstr "Αφαίρεση επιλεγμένου επιπέδου" + +#: ../src/globals.c:124 +msgid "Open files (but not .vik ones) into the selected TrackWaypoint layer." +msgstr "" + +#: ../src/globals.c:125 +msgid "Show calendar day names:" +msgstr "" + +#: ../src/globals.c:128 +msgid "Home Location" +msgstr "" + +#: ../src/globals.c:128 +msgid "Last Location" +msgstr "" + +#: ../src/globals.c:128 +msgid "Specified File" +msgstr "" + +#: ../src/globals.c:128 +msgid "Auto Location" +msgstr "" + +#: ../src/globals.c:131 +msgid "Restore Window Setup:" +msgstr "" + +#: ../src/globals.c:132 +msgid "Restore window size and layout" +msgstr "" + +#: ../src/globals.c:133 +msgid "Add a Default Map Layer:" +msgstr "" + +#: ../src/globals.c:134 +msgid "" +"The default map layer added is defined by the Layer Defaults. Use the menu " +"Edit->Layer Defaults->Map... to change the map type and other values." +msgstr "" + +#: ../src/globals.c:135 +msgid "Startup Method:" +msgstr "" + +#: ../src/globals.c:136 +msgid "Startup File:" +msgstr "" + +#: ../src/globals.c:137 +msgid "" +"The default file to load on startup. Only applies when the startup method is " +"set to 'Specified File'" +msgstr "" + +#: ../src/globals.c:138 +msgid "Check For New Version:" +msgstr "" + +#: ../src/globals.c:139 +msgid "Periodically check to see if a new version of Viking is available" +msgstr "" + +#. Defaults for the options are setup here +#: ../src/globals.c:176 +msgid "General" +msgstr "" + +#. New Tab +#: ../src/globals.c:204 +msgid "Startup" +msgstr "" + +#. New Tab +#: ../src/globals.c:222 +msgid "Export/External" +msgstr "" + +#. 'Advanced' Properties +#: ../src/globals.c:249 +msgid "Advanced" +msgstr "" + +#. Webtools +#: ../src/google.c:39 +msgid "Google" +msgstr "" + +#. If there is an actual description field it will overwrite this value +#: ../src/gpx.c:264 +#, c-format +msgid "Created by: %s" +msgstr "" + +#: ../src/datasource_bfilter.c:43 +msgid "Max number of points:" +msgstr "Μέγιστος αριθμός σημείων:" + +#: ../src/datasource_bfilter.c:84 +msgid "Simplify All Tracks..." +msgstr "" + +#: ../src/datasource_bfilter.c:85 +msgid "Simplified Tracks" +msgstr "" + +#. { VIK_LAYER_NUM_TYPES, "compressmethod", VIK_LAYER_PARAM_UINT, VIK_LAYER_GROUP_NONE, N_("Simplify Method:"), VIK_LAYER_WIDGET_COMBOBOX, compress_method, NULL, NULL, NULL, NULL, NULL }, +#: ../src/datasource_bfilter.c:111 +msgid "Error Factor:" +msgstr "" + +#: ../src/datasource_bfilter.c:112 +msgid "" +"Specifies the maximum allowable error that may be introduced by removing a " +"single point by the crosstrack method. See the manual or GPSBabel Simplify " +"Filter documentation for more detail." +msgstr "" + +#: ../src/datasource_bfilter.c:166 +msgid "Compress Tracks..." +msgstr "" + +#: ../src/datasource_bfilter.c:167 +msgid "Compressed Tracks" +msgstr "" + +#: ../src/datasource_bfilter.c:197 ../src/datasource_bfilter.c:198 +msgid "Remove Duplicate Waypoints" +msgstr "" + +#: ../src/datasource_bfilter.c:221 +msgid "Manual filter:" +msgstr "" + +#: ../src/datasource_bfilter.c:222 +msgid "Manual filter command: e.g. 'swap'." +msgstr "" + +#: ../src/datasource_bfilter.c:233 ../src/datasource_bfilter.c:234 +msgid "Manual filter" +msgstr "" + +#: ../src/datasource_bfilter.c:262 +msgid "Waypoints Inside This" +msgstr "" + +#: ../src/datasource_bfilter.c:263 ../src/datasource_bfilter.c:292 +msgid "Polygonized Layer" +msgstr "" + +#: ../src/datasource_bfilter.c:291 +msgid "Waypoints Outside This" +msgstr "" + +#: ../src/datasource_file.c:61 +msgid "Import file with GPSBabel" +msgstr "" + +#: ../src/datasource_file.c:62 +msgid "Imported file" +msgstr "" + +#. The file selector +#: ../src/datasource_file.c:129 +msgid "File:" +msgstr "" + +#: ../src/datasource_file.c:130 +msgid "File to import" +msgstr "" + +#: ../src/datasource_file.c:137 +msgid "All files" +msgstr "" + +#. The file format selector +#: ../src/datasource_file.c:144 ../src/datasource_url.c:106 +msgid "File type:" +msgstr "" + +#: ../src/datasource_file.c:189 +#, c-format +msgid "using babel args '%s' and file '%s'" +msgstr "" + +#: ../src/datasource_gc.c:67 +msgid "Download Geocaches" +msgstr "" + +#: ../src/datasource_gc.c:68 +msgid "Geocaching.com Caches" +msgstr "" + +#: ../src/datasource_gc.c:86 +msgid "geocaching.com username:" +msgstr "geocachiing.com όνομα χρήστη:" + +#: ../src/datasource_gc.c:87 +msgid "geocaching.com password:" +msgstr "geocaching.com κωδικός:" + +#: ../src/datasource_gc.c:92 ../src/vikwindow.c:3502 +msgid "Geocaching" +msgstr "" + +#: ../src/datasource_gc.c:128 +#, c-format +msgid "" +"Can't find %s or %s in path! Check that you have installed it correctly." +msgstr "" + +#: ../src/datasource_gc.c:190 +msgid "Number geocaches:" +msgstr "" + +#: ../src/datasource_gc.c:192 +msgid "Centered around:" +msgstr "" + +#: ../src/datasource_gc.c:231 +msgid "Broken input - using some defaults" +msgstr "" + +#: ../src/datasource_geotag.c:51 +msgid "Create Waypoints from Geotagged Images" +msgstr "" + +#: ../src/datasource_geotag.c:52 +msgid "Geotagged Images" +msgstr "" + +#: ../src/datasource_geotag.c:102 ../src/datasource_geojson.c:93 +#: ../src/vikfileentry.c:171 ../src/vikwindow.c:3533 ../src/vikwindow.c:3610 +#: ../src/vikwindow.c:3641 ../src/vikwindow.c:4356 ../src/vikwindow.c:4649 +msgid "All" +msgstr "" + +#: ../src/datasource_geotag.c:107 ../src/vikfileentry.c:115 +#: ../src/viktrwlayer_geotag.c:637 ../src/vikwindow.c:3518 +#: ../src/vikwindow.c:4377 +msgid "JPG" +msgstr "" + +#: ../src/datasource_geotag.c:168 +#, c-format +msgid "Unable to create waypoint from %s" +msgstr "" + +#: ../src/datasource_geojson.c:46 +msgid "Acquire from GeoJSON" +msgstr "" + +#: ../src/datasource_geojson.c:47 ../src/datasource_geojson.c:98 +msgid "GeoJSON" +msgstr "" + +#: ../src/datasource_geojson.c:152 +#, c-format +msgid "Unable to import from: %s" +msgstr "" + +#: ../src/datasource_gps.c:54 +msgid "Acquire from GPS" +msgstr "" + +#: ../src/datasource_gps.c:55 +msgid "Acquired from GPS" +msgstr "" + +#: ../src/datasource_gps.c:258 +#, c-format +msgid "using cmd '%s' and file '%s'\n" +msgstr "" + +#: ../src/datasource_gps.c:353 ../src/vikgpslayer.c:966 +#, c-format +msgid "Downloading %d waypoint..." +msgid_plural "Downloading %d waypoints..." +msgstr[0] "" +msgstr[1] "" + +#: ../src/datasource_gps.c:358 ../src/vikgpslayer.c:971 +#, c-format +msgid "Downloading %d trackpoint..." +msgid_plural "Downloading %d trackpoints..." +msgstr[0] "" +msgstr[1] "" + +#: ../src/datasource_gps.c:363 ../src/vikgpslayer.c:976 +#, c-format +msgid "Downloading %d routepoint..." +msgid_plural "Downloading %d routepoints..." +msgstr[0] "" +msgstr[1] "" + +#: ../src/datasource_gps.c:386 ../src/datasource_gps.c:393 +#: ../src/datasource_gps.c:400 +#, c-format +msgid "Downloaded %d out of %d %s..." +msgstr "" + +#: ../src/datasource_gps.c:388 ../src/datasource_gps.c:395 +#: ../src/datasource_gps.c:402 +#, c-format +msgid "Downloaded %d %s." +msgstr "" + +#: ../src/datasource_gps.c:416 ../src/vikgpslayer.c:1134 +#, c-format +msgid "GPS Device: %s" +msgstr "" + +#: ../src/datasource_gps.c:428 ../src/vikgpslayer.c:1214 +msgid "Status: Working..." +msgstr "" + +#. NB gps_layer_inst_init() is performed after parameter registeration +#. thus to give the protocols some potential values use the old static list +#. TODO: find another way to use gps_layer_inst_init()? +#: ../src/datasource_gps.c:584 ../src/vikgpslayer.c:216 +msgid "GPS Protocol:" +msgstr "Πρωτόκολλο GPS:" + +#. List reassigned at runtime +#: ../src/datasource_gps.c:609 ../src/vikgpslayer.c:217 +msgid "Serial Port:" +msgstr "Σειριακή Θύρα:" + +#: ../src/datasource_gps.c:659 +msgid "" +"Turn Off After Transfer\n" +"(Garmin/NAViLink Only)" +msgstr "" + +#: ../src/datasource_gps.c:666 +msgid "Tracks:" +msgstr "" + +#: ../src/datasource_gps.c:673 +msgid "Routes:" +msgstr "" + +#: ../src/datasource_gps.c:680 +msgid "Waypoints:" +msgstr "" + +#: ../src/datasource_gps.c:756 ../src/vikgpslayer.c:1509 +msgid "GPS device: N/A" +msgstr "" + +#: ../src/datasource_osm.c:53 ../src/datasource_osm.c:54 +msgid "OSM traces" +msgstr "" + +#: ../src/datasource_osm.c:89 +msgid "Page number:" +msgstr "" + +#: ../src/datasource_osm_my_traces.c:59 ../src/datasource_osm_my_traces.c:60 +msgid "OSM My Traces" +msgstr "" + +#: ../src/datasource_osm_my_traces.c:106 ../src/osm-traces.c:684 +#, fuzzy +msgid "Email/username:" +msgstr "OSM όνομα χρήστη:" + +#: ../src/datasource_osm_my_traces.c:111 +msgid "The email or username used to login to OSM" +msgstr "" + +#: ../src/datasource_osm_my_traces.c:113 ../src/osm-traces.c:692 +msgid "Password:" +msgstr "Κωδικός:" + +#: ../src/datasource_osm_my_traces.c:116 +msgid "The password used to login to OSM" +msgstr "" + +#: ../src/datasource_osm_my_traces.c:427 ../src/viktrwlayer.c:689 +msgid "Description" +msgstr "" + +#: ../src/datasource_osm_my_traces.c:442 +msgid "Privacy" +msgstr "" + +#: ../src/datasource_osm_my_traces.c:449 +msgid "Within Current View" +msgstr "" + +#: ../src/datasource_osm_my_traces.c:516 +msgid "GPS Traces" +msgstr "" + +#: ../src/datasource_osm_my_traces.c:518 +msgid "None found!" +msgstr "" + +#: ../src/datasource_osm_my_traces.c:569 +msgid "Ensure the OSM access token preferences are setup." +msgstr "" + +#: ../src/datasource_osm_my_traces.c:645 +msgid "My OSM Traces" +msgstr "" + +#. Report errors to the status bar +#: ../src/datasource_osm_my_traces.c:667 +#, c-format +msgid "Unable to get trace: %s" +msgstr "" + +#: ../src/datasource_routing.c:56 ../src/datasource_routing.c:57 +msgid "Directions" +msgstr "" + +#: ../src/datasource_routing.c:90 +msgid "No routing engines with directions available" +msgstr "" + +#. Engine selector +#: ../src/datasource_routing.c:99 +msgid "Engine:" +msgstr "" + +#. From and To entries +#: ../src/datasource_routing.c:104 +msgid "From:" +msgstr "Από:" + +#: ../src/datasource_routing.c:105 +msgid "To:" +msgstr "Προς:" + +#: ../src/datasource_url.c:48 +msgid "Acquire from URL" +msgstr "" + +#: ../src/datasource_url.c:49 +msgid "URL" +msgstr "" + +#: ../src/datasource_url.c:101 +msgid "URL:" +msgstr "" + +#. Only GPX (not using GPSbabel) +#: ../src/datasource_url.c:133 ../src/vikfileentry.c:161 +#: ../src/vikwindow.c:3513 ../src/vikwindow.c:3603 +msgid "GPX" +msgstr "" + +#: ../src/datasource_wikipedia.c:32 +msgid "Create Waypoints from Wikipedia Articles" +msgstr "" + +#: ../src/datasource_wikipedia.c:33 +msgid "Wikipedia Waypoints" +msgstr "" + +#: ../src/dem.c:66 ../src/dem.c:80 +msgid "Invalid DEM" +msgstr "Λανθασμένο DEM" + +#: ../src/dem.c:122 +msgid "Invalid DEM header" +msgstr "" + +#: ../src/dem.c:191 ../src/dem.c:204 +msgid "Incorrect DEM Class B record: expected 1" +msgstr "" + +#: ../src/dem.c:289 ../src/download.c:176 +#, c-format +msgid "Couldn't map file %s: %s" +msgstr "" + +#: ../src/download.c:130 +msgid "Tile age (days):" +msgstr "" + +#: ../src/download.c:406 +#, c-format +msgid "Download error: %s" +msgstr "" + +#: ../src/download.c:490 +msgid "couldn't open temp file" +msgstr "Δεν μπορεί να ανοιχτεί το αρχείο temp" + +#: ../src/file.c:458 ../src/file.c:463 +#, c-format +msgid "Draw mode '%s' no more supported" +msgstr "" + +#: ../src/geotag_exif.c:621 +msgid "Not enough memory." +msgstr "" + +#: ../src/geotag_exif.c:639 +msgid "Setting a value for this tag is unsupported!" +msgstr "" + +#: ../src/geotag_exif.c:658 +#, c-format +msgid "Too few components specified (need %d, found %d)\n" +msgstr "" + +#: ../src/geotag_exif.c:662 +msgid "Numeric value expected\n" +msgstr "" + +#: ../src/geotag_exif.c:670 +msgid "This shouldn't happen!" +msgstr "" + +#: ../src/geotag_exif.c:740 +msgid "Not yet implemented!" +msgstr "" + +#: ../src/geotag_exif.c:753 +msgid "Warning; Too many components specified!" +msgstr "" + +#: ../src/osm-traces.c:87 +msgid "Identifiable (public w/ timestamps)" +msgstr "" + +#: ../src/osm-traces.c:88 +msgid "Trackable (private w/ timestamps)" +msgstr "" + +#: ../src/osm-traces.c:89 +msgid "Public" +msgstr "" + +#: ../src/osm-traces.c:90 +msgid "Private" +msgstr "" + +#: ../src/osm-traces.c:108 +msgid "Access Token:" +msgstr "" + +#: ../src/osm-traces.c:108 +msgid "Get New OSM Access Tokens" +msgstr "" + +#: ../src/osm-traces.c:109 +msgid "Access Token Key:" +msgstr "" + +#: ../src/osm-traces.c:110 +msgid "Access Token Secret:" +msgstr "" + +#: ../src/osm-traces.c:111 +msgid "OSM username:" +msgstr "OSM όνομα χρήστη:" + +#: ../src/osm-traces.c:112 +msgid "OSM password:" +msgstr "OSM κωδικός:" + +#. Check to really override existing values... +#: ../src/osm-traces.c:263 +msgid "Do you want to overwrite existing values?" +msgstr "" + +#: ../src/osm-traces.c:275 +msgid "Not able to generate OSM request tokens." +msgstr "" + +#: ../src/osm-traces.c:299 +msgid "" +"Waiting for authorization approval.\n" +"Ensure you have granted access at the website before continuing here." +msgstr "" + +#: ../src/osm-traces.c:315 +msgid "No Authorization." +msgstr "" + +#: ../src/osm-traces.c:354 +msgid "" +"OSM Username and Password preferences are not required anymore. You can now " +"remove them." +msgstr "" + +#. Preferences +#: ../src/osm-traces.c:379 +msgid "OpenStreetMap Traces" +msgstr "" + +#: ../src/osm-traces.c:504 +#, c-format +msgid "failed to upload data: HTTP response is %ld" +msgstr "" + +#: ../src/osm-traces.c:509 +#, c-format +msgid "curl_easy_getinfo failed: %d" +msgstr "" + +#: ../src/osm-traces.c:514 +#, c-format +msgid "curl request failed: %s" +msgstr "" + +#. Success +#: ../src/osm-traces.c:592 +msgid "Uploaded to OSM" +msgstr "" + +#: ../src/osm-traces.c:596 +msgid "" +"FAILED TO UPLOAD DATA TO OSM - Ensure the OSM access token preferences are " +"setup." +msgstr "" + +#: ../src/osm-traces.c:599 +msgid "FAILED TO UPLOAD DATA TO OSM - CURL PROBLEM" +msgstr "" + +#: ../src/osm-traces.c:602 +msgid "FAILED TO UPLOAD DATA TO OSM" +msgstr "" + +#: ../src/osm-traces.c:602 +msgid "HTTP response code" +msgstr "" + +#: ../src/osm-traces.c:610 +#, c-format +msgid "failed to unlink temporary file: %s" +msgstr "" + +#: ../src/osm-traces.c:664 +msgid "OSM upload" +msgstr "" + +#: ../src/osm-traces.c:689 +msgid "" +"The email/username used as login\n" +"Enter the email/username you use to login into www.openstreetmap.org." +"" +msgstr "" + +#: ../src/osm-traces.c:697 +msgid "" +"The password used to login\n" +"Enter the password you use to login into www.openstreetmap.org." +msgstr "" + +#: ../src/osm-traces.c:703 +msgid "File's name:" +msgstr "Όνομα αρχείου:" + +#: ../src/osm-traces.c:713 +msgid "" +"The name of the file on OSM\n" +"This is the name of the file created on the server.This is not the " +"name of the local file." +msgstr "" + +#: ../src/osm-traces.c:717 ../src/viktrwlayer_wpwin.c:197 +#: ../src/viktrwlayer_wpwin.c:199 +msgid "Description:" +msgstr "Περιγραφή:" + +#: ../src/osm-traces.c:731 +msgid "The description of the trace" +msgstr "" + +#: ../src/osm-traces.c:734 +msgid "Anonymize Times:" +msgstr "" + +#: ../src/osm-traces.c:739 +msgid "" +"Anonymize times of the trace.\n" +"You may choose to make the trace identifiable, yet mask the actual " +"real time values" +msgstr "" + +#: ../src/osm-traces.c:743 +msgid "Tags:" +msgstr "Ετικέτες:" + +#: ../src/osm-traces.c:751 +msgid "The tags associated to the trace" +msgstr "" + +#: ../src/osm-traces.c:816 +#, c-format +msgid "Uploading %s to OSM" +msgstr "" + +#: ../src/mapcache.c:67 +msgid "Map cache memory size (MB):" +msgstr "" + +#. NB Can have a couple hundred fonts loaded when using system directories +#. So ATM don't list them all - otherwise need better GUI feedback display. +#: ../src/mapnik_interface.cpp:324 +#, c-format +msgid "" +"%s %s\n" +"Plugins=%sFonts loaded=%d" +msgstr "" + +#: ../src/mapnik_interface.cpp:325 ../src/vikmapniklayer.c:278 +msgid "Mapnik" +msgstr "" + +#: ../src/print.c:51 ../src/viktrwlayer.c:572 +msgid "None" +msgstr "Κανένα" + +#: ../src/print.c:52 +msgid "Horizontally" +msgstr "Οριζόντια" + +#: ../src/print.c:53 +msgid "Vertically" +msgstr "Κατακόρυφα" + +#: ../src/print.c:54 +msgid "Both" +msgstr "Και τα δύο" + +#: ../src/print.c:118 +msgid "Image Settings" +msgstr "Ρυθμίσεις εικόνας" + +#: ../src/print.c:551 +msgid "done" +msgstr "ολοκληρώθηκε" + +#. Page Size +#: ../src/print.c:580 +msgid "_Adjust Page Size and Orientation" +msgstr "" + +#: ../src/print.c:596 +msgid "C_enter:" +msgstr "Κ_έντρο" + +#. ignore page margins +#: ../src/print.c:614 +msgid "Ignore Page _Margins" +msgstr "" + +#: ../src/print.c:633 +msgid "Image S_ize:" +msgstr "Μ_έγεθος Εικόνας:" + +#: ../src/ui_util.c:88 +#, c-format +msgid "Could not launch web browser. %s" +msgstr "" + +#: ../src/ui_util.c:101 +#, c-format +msgid "Could not create new email. %s" +msgstr "" + +#: ../src/vikcoordlayer.c:57 +msgid "Color:" +msgstr "Χρώμα:" + +#: ../src/vikcoordlayer.c:58 +msgid "Minutes Width:" +msgstr "" + +#: ../src/vikcoordlayer.c:59 +msgid "Line Thickness:" +msgstr "Πάχος γραμμής:" + +#: ../src/vikcoordlayer.c:66 +msgid "Coordinate" +msgstr "" + +#: ../src/main.c:92 +#, c-format +msgid "Ignoring Xlib error: error code %d request code %d\n" +msgstr "" + +#: ../src/main.c:111 +msgid "Enable debug output" +msgstr "" + +#: ../src/main.c:112 +msgid "Enable verbose output" +msgstr "" + +#: ../src/main.c:113 +msgid "Show version" +msgstr "Προβολή έκδοσης" + +#: ../src/main.c:114 +msgid "Latitude in decimal degrees" +msgstr "" + +#: ../src/main.c:115 +msgid "Longitude in decimal degrees" +msgstr "" + +#: ../src/main.c:116 +msgid "Zoom Level (OSM). Value can be 0 - 22" +msgstr "" + +#: ../src/main.c:117 +msgid "Add a map layer by id value. Use 0 for the default map." +msgstr "" + +#: ../src/main.c:160 +#, c-format +msgid "" +"%s %s\n" +"Copyright (c) 2003-2008 Evan Battaglia\n" +"Copyright (c) 2008-%s Viking's contributors\n" +msgstr "" + +#: ../src/osm.c:50 +msgid "OpenStreetMap (Mapnik)" +msgstr "" + +#: ../src/osm.c:65 +msgid "OpenStreetMap (Cycle)" +msgstr "" + +#: ../src/osm.c:79 +msgid "OpenStreetMap (Transport)" +msgstr "" + +#: ../src/osm.c:95 +msgid "OpenStreetMap (Humanitarian)" +msgstr "" + +#: ../src/osm.c:111 +msgid "On Disk OSM Tile Format" +msgstr "" + +#: ../src/osm.c:121 +msgid "MBTiles File" +msgstr "" + +#: ../src/osm.c:132 +msgid "OSM Metatiles" +msgstr "" + +#: ../src/osm.c:146 +msgid "Mapbox Outdoors" +msgstr "" + +#: ../src/osm.c:153 +msgid "Mapbox Specific" +msgstr "" + +#: ../src/osm.c:170 +msgid "OSM (view)" +msgstr "" + +#: ../src/osm.c:174 +msgid "OSM (edit)" +msgstr "" + +#. Note the use of positional parameters +#: ../src/osm.c:179 +msgid "OSM (query)" +msgstr "" + +#: ../src/osm.c:183 +msgid "OSM (render)" +msgstr "" + +#. Example: http://127.0.0.1:8111/load_and_zoom?left=8.19&right=8.20&top=48.605&bottom=48.590&select=node413602999 +#. JOSM or merkaartor must already be running with remote interface enabled +#: ../src/osm.c:190 +msgid "Local port 8111 (eg JOSM)" +msgstr "" + +#: ../src/osm.c:195 +msgid "Geofabrik Map Compare" +msgstr "" + +#: ../src/osm.c:203 +msgid "OpenStreetMap Notes" +msgstr "" + +#. Not really OSM but can't be bothered to create somewhere else to put it... +#: ../src/osm.c:221 +msgid "Wikimedia Toolserver GeoHack" +msgstr "" + +#: ../src/preferences.c:195 +msgid "Preferences" +msgstr "" + +#: ../src/toolbar.c:91 ../src/toolbar.c:92 +msgid "System Default" +msgstr "" + +#: ../src/toolbar.c:91 ../src/viktrwlayer.c:563 +msgid "Small" +msgstr "" + +#: ../src/toolbar.c:91 ../src/viktrwlayer.c:564 +msgid "Medium" +msgstr "" + +#: ../src/toolbar.c:91 ../src/viktrwlayer.c:565 +msgid "Large" +msgstr "" + +#: ../src/toolbar.c:92 +msgid "Icons Only" +msgstr "" + +#: ../src/toolbar.c:92 +msgid "Text Only" +msgstr "" + +#: ../src/toolbar.c:92 +msgid "Icons and Text" +msgstr "" + +#: ../src/toolbar.c:106 +msgid "Append to Menu:" +msgstr "" + +#: ../src/toolbar.c:107 +msgid "Pack the toolbar to the main menu to save vertical space" +msgstr "" + +#: ../src/toolbar.c:108 +msgid "Icon Size:" +msgstr "" + +#: ../src/toolbar.c:110 +msgid "Icon Style:" +msgstr "" + +#: ../src/toolbar.c:112 +msgid "Customize:" +msgstr "" + +#: ../src/toolbar.c:112 +msgid "Customize Buttons" +msgstr "" + +#. Preferences +#: ../src/toolbar.c:145 +msgid "Toolbar" +msgstr "" + +#: ../src/toolbar.c:312 +msgid "_Customize" +msgstr "" + +#: ../src/toolbar.c:641 +msgid "Separator" +msgstr "" + +#: ../src/toolbar.c:642 +msgid "--- Separator ---" +msgstr "" + +#: ../src/toolbar.c:1007 +msgid "Customize Toolbar" +msgstr "" + +#: ../src/toolbar.c:1028 +msgid "" +"Select items to be displayed on the toolbar. Items can be reordered by drag " +"and drop." +msgstr "" + +#: ../src/toolbar.c:1044 +msgid "Available Items" +msgstr "" + +#: ../src/toolbar.c:1065 +msgid "Displayed Items" +msgstr "" + +#: ../src/viklayer_defaults.c:232 +#, c-format +msgid "Could not open file: %s" +msgstr "" + +#: ../src/viklayer_defaults.c:304 +msgid "Layer Defaults" +msgstr "" + +#: ../src/uibuilder.c:196 +msgid "Take care that this password will be stored clearly in a plain file." +msgstr "" + +#: ../src/uibuilder.c:628 ../src/viktrwlayer_export.c:188 +#: ../src/viktrwlayer_export.c:304 ../src/vikwindow.c:3666 +#: ../src/vikwindow.c:4408 +#, c-format +msgid "The file \"%s\" exists, do you wish to overwrite it?" +msgstr "" + +#: ../src/vikaggregatelayer.c:41 +msgid "Aggregate" +msgstr "" + +#: ../src/vikaggregatelayer.c:528 ../src/viktrwlayer.c:11700 +#, c-format +msgid "%s: Waypoint List" +msgstr "" + +#: ../src/vikaggregatelayer.c:570 +msgid "Search by Date" +msgstr "" + +#: ../src/vikaggregatelayer.c:576 +msgid "No items found with the requested date." +msgstr "" + +#: ../src/vikaggregatelayer.c:615 ../src/viktrwlayer.c:11691 +#, c-format +msgid "%s: Track and Route List" +msgstr "" + +#: ../src/vikaggregatelayer.c:681 ../src/viktrwlayer.c:8346 +#: ../src/viktrwlayer.c:8417 ../src/viktrwlayer.c:8494 +msgid "_Visibility" +msgstr "" + +#: ../src/vikaggregatelayer.c:686 +msgid "_Show All" +msgstr "" + +#: ../src/vikaggregatelayer.c:692 +msgid "_Hide All" +msgstr "" + +#: ../src/vikaggregatelayer.c:698 ../src/viktrwlayer.c:8363 +#: ../src/viktrwlayer.c:8434 ../src/viktrwlayer.c:8511 +msgid "_Toggle" +msgstr "" + +#: ../src/vikaggregatelayer.c:705 ../src/viktrwlayer.c:8532 +msgid "_Sort" +msgstr "" + +#: ../src/vikaggregatelayer.c:711 ../src/viktrwlayer.c:8538 +msgid "Name _Ascending" +msgstr "" + +#: ../src/vikaggregatelayer.c:717 ../src/viktrwlayer.c:8544 +msgid "Name _Descending" +msgstr "" + +#: ../src/vikaggregatelayer.c:723 ../src/viktrwlayer.c:575 +#: ../src/viktrwlayer.c:8550 +msgid "Date Ascending" +msgstr "" + +#: ../src/vikaggregatelayer.c:729 ../src/viktrwlayer.c:576 +#: ../src/viktrwlayer.c:8556 +msgid "Date Descending" +msgstr "" + +#: ../src/vikaggregatelayer.c:735 ../src/viktrwlayer.c:8445 +#: ../src/viktrwlayer.c:8523 ../src/viktrwlayer.c:8595 +#: ../src/viktrwlayer_tracklist.c:296 +msgid "_Statistics" +msgstr "" + +#: ../src/vikaggregatelayer.c:740 ../src/viktrwlayer.c:4533 +msgid "Track _List..." +msgstr "" + +#: ../src/vikaggregatelayer.c:746 ../src/viktrwlayer.c:4540 +msgid "_Waypoint List..." +msgstr "" + +#: ../src/vikaggregatelayer.c:753 +msgid "Searc_h" +msgstr "" + +#: ../src/vikaggregatelayer.c:759 +msgid "By _Date..." +msgstr "" + +#: ../src/vikaggregatelayer.c:762 +msgid "Find the first item with a specified date" +msgstr "" + +#: ../src/vikaggregatelayer.c:765 +msgid "Load E_xternal Layers" +msgstr "" + +#. Could have a more complicated tooltip that numbers each type of layers, +#. but for now a simple overall count +#: ../src/vikaggregatelayer.c:1011 +#, c-format +msgid "One layer" +msgid_plural "%d layers" +msgstr[0] "" +msgstr[1] "" + +#: ../src/vikaggregatelayer.c:1014 +#, c-format +msgid "Empty" +msgstr "" + +#: ../src/vikdemlayer.c:86 +msgid "SRTM Global 90m (3 arcsec)" +msgstr "" + +#: ../src/vikdemlayer.c:94 +msgid "Absolute height" +msgstr "" + +#: ../src/vikdemlayer.c:95 +msgid "Height gradient" +msgstr "" + +#: ../src/vikdemlayer.c:120 +msgid "DEM Files:" +msgstr "Αρχεία DEM" + +#: ../src/vikdemlayer.c:121 +msgid "Download Source:" +msgstr "" + +#: ../src/vikdemlayer.c:122 +msgid "Min Elev Color:" +msgstr "" + +#: ../src/vikdemlayer.c:123 ../src/viktrwlayer_wpwin.c:207 +msgid "Type:" +msgstr "Τύπος:" + +#: ../src/vikdemlayer.c:124 +msgid "Min Elev:" +msgstr "" + +#: ../src/vikdemlayer.c:125 +msgid "Max Elev:" +msgstr "" + +#: ../src/vikdemlayer.c:137 +msgid "_DEM Download" +msgstr "" + +#: ../src/vikdemlayer.c:137 +msgid "DEM Download" +msgstr "" + +#: ../src/vikdemlayer.c:192 +msgid "DEM" +msgstr "" + +#: ../src/vikdemlayer.c:304 +#, c-format +msgid "Number of files: %d" +msgstr "" + +#: ../src/vikdemlayer.c:446 +msgid "DEM Loading" +msgstr "" + +#: ../src/vikdemlayer.c:927 +#, c-format +msgid "No SRTM data available for %f, %f" +msgstr "" + +#: ../src/vikdemlayer.c:948 +#, c-format +msgid "DEM download failure for %f, %f" +msgstr "" + +#: ../src/vikdemlayer.c:954 +#, c-format +msgid "DEM write failure for %s" +msgstr "" + +#. Probably not over any land... +#: ../src/vikdemlayer.c:1201 +msgid "No DEM File Available" +msgstr "" + +#: ../src/vikdemlayer.c:1220 +#, c-format +msgid "" +"\n" +"Source: %s\n" +"\n" +"DEM File: %s\n" +"DEM File Timestamp: %s" +msgstr "" + +#: ../src/vikdemlayer.c:1224 +#, c-format +msgid "" +"Source: %s\n" +"\n" +"No DEM File!" +msgstr "" + +#: ../src/vikdemlayer.c:1264 +#, c-format +msgid "Downloading DEM %s" +msgstr "" + +#: ../src/vikdemlayer.c:1289 +msgid "_Show DEM File Information" +msgstr "" + +#: ../src/vikfileentry.c:72 +msgid "Browse..." +msgstr "" + +#: ../src/vikfileentry.c:103 +msgid "Choose file" +msgstr "Επιλογή αρχείου" + +#: ../src/vikfileentry.c:120 ../src/vikwindow.c:4372 +msgid "PNG" +msgstr "" + +#: ../src/vikfileentry.c:125 +msgid "TIFF" +msgstr "" + +#: ../src/vikfileentry.c:133 +msgid "MBTiles" +msgstr "" + +#: ../src/vikfileentry.c:142 +msgid "XML" +msgstr "" + +#: ../src/vikfileentry.c:149 +msgid "MML" +msgstr "" + +#: ../src/vikfileentry.c:154 +msgid "MSS" +msgstr "" + +#: ../src/vikfilelist.c:49 +msgid "Choose file(s)" +msgstr "Επιλογή αρχείου(ων)" + +#: ../src/vikfilelist.c:182 +msgid "Add..." +msgstr "Προσθήκη..." + +#: ../src/vikfilelist.c:183 +msgid "Delete" +msgstr "Διαγραφή" + +#: ../src/vikgeoreflayer.c:97 +msgid "_Georef Move Map" +msgstr "" + +#: ../src/vikgeoreflayer.c:97 +msgid "Georef Move Map" +msgstr "" + +#: ../src/vikgeoreflayer.c:106 +msgid "Georef Z_oom Tool" +msgstr "" + +#: ../src/vikgeoreflayer.c:106 +msgid "Georef Zoom Tool" +msgstr "" + +#: ../src/vikgeoreflayer.c:117 +msgid "GeoRef Map" +msgstr "" + +#: ../src/vikgeoreflayer.c:214 +msgid "Auto Read World Files:" +msgstr "" + +#: ../src/vikgeoreflayer.c:215 +msgid "" +"Automatically attempt to read associated world file of a new image for a " +"GeoRef layer" +msgstr "" + +#: ../src/vikgeoreflayer.c:511 ../src/vikgeoreflayer.c:797 +#: ../src/vikmapslayer.c:1174 +#, c-format +msgid "Couldn't open image file: %s" +msgstr "" + +#: ../src/vikgeoreflayer.c:607 ../src/vikgeoreflayer.c:633 +msgid "Choose World file" +msgstr "Διαλέξτε αρχείο Κόσμου" + +#: ../src/vikgeoreflayer.c:619 +msgid "The World file you requested could not be opened for reading." +msgstr "Το αρχείο Κόσμου που επιλέξατε δεν μπορεί να διαβαστεί." + +#: ../src/vikgeoreflayer.c:621 +msgid "Unexpected end of file reading World file." +msgstr "" + +#: ../src/vikgeoreflayer.c:646 +msgid "The file you requested could not be opened for writing." +msgstr "Το αρχείο που επιλέξατε δεν μπορεί να διαβαστεί." + +#: ../src/vikgeoreflayer.c:782 +msgid "Lower right corner values may not be consistent with upper right values" +msgstr "" + +#: ../src/vikgeoreflayer.c:806 +#, c-format +msgid "Invalid image size: %s" +msgstr "" + +#: ../src/vikgeoreflayer.c:831 ../src/viklayer.c:561 ../src/vikwindow.c:4891 +msgid "Layer Properties" +msgstr "Ιδιότητες επιπέδου" + +#: ../src/vikgeoreflayer.c:852 +msgid "World File Parameters:" +msgstr "" + +#: ../src/vikgeoreflayer.c:853 +msgid "Load From File..." +msgstr "" + +#: ../src/vikgeoreflayer.c:858 +msgid "Corner pixel easting:" +msgstr "" + +#: ../src/vikgeoreflayer.c:860 +msgid "the UTM \"easting\" value of the upper-left corner pixel of the map" +msgstr "" + +#: ../src/vikgeoreflayer.c:862 +msgid "Corner pixel northing:" +msgstr "" + +#: ../src/vikgeoreflayer.c:864 +msgid "the UTM \"northing\" value of the upper-left corner pixel of the map" +msgstr "" + +#: ../src/vikgeoreflayer.c:866 +msgid "X (easting) scale (mpp): " +msgstr "" + +#: ../src/vikgeoreflayer.c:867 +msgid "Y (northing) scale (mpp): " +msgstr "" + +#: ../src/vikgeoreflayer.c:870 +msgid "the scale of the map in the X direction (meters per pixel)" +msgstr "" + +#: ../src/vikgeoreflayer.c:872 +msgid "the scale of the map in the Y direction (meters per pixel)" +msgstr "" + +#: ../src/vikgeoreflayer.c:874 +msgid "Map Image:" +msgstr "Εικόνα Χάρτη:" + +#: ../src/vikgeoreflayer.c:919 +msgid "Upper left latitude:" +msgstr "" + +#: ../src/vikgeoreflayer.c:921 +msgid "Upper left longitude:" +msgstr "" + +#: ../src/vikgeoreflayer.c:923 +msgid "Lower right latitude:" +msgstr "" + +#: ../src/vikgeoreflayer.c:925 +msgid "Lower right longitude:" +msgstr "" + +#: ../src/vikgeoreflayer.c:937 +msgid "Calculate MPP values from coordinates" +msgstr "" + +#: ../src/vikgeoreflayer.c:938 +msgid "" +"Enter all corner coordinates before calculating the MPP values from the " +"image size" +msgstr "" + +#: ../src/vikgeoreflayer.c:948 +msgid "UTM" +msgstr "" + +#: ../src/vikgeoreflayer.c:949 +msgid "Latitude/Longitude" +msgstr "" + +#: ../src/vikgeoreflayer.c:957 ../src/vikmapniklayer.c:82 +#: ../src/vikmapslayer.c:158 +msgid "Alpha:" +msgstr "Άλφα:" + +#. Now with icons +#: ../src/vikgeoreflayer.c:1062 +msgid "_Zoom to Fit Map" +msgstr "" + +#: ../src/vikgeoreflayer.c:1068 +msgid "_Goto Map Center" +msgstr "" + +#: ../src/vikgeoreflayer.c:1074 +msgid "_Export to World File" +msgstr "" + +#: ../src/vikgoto.c:98 +msgid "No goto tool available." +msgstr "" + +#: ../src/vikgoto.c:295 +msgid "goto" +msgstr "Μετάβαση" + +#: ../src/vikgoto.c:297 +msgid "goto provider:" +msgstr "" + +#: ../src/vikgoto.c:312 +msgid "Enter address or place name:" +msgstr "Εισάγετε διεύθυνση ή όνομα μέρους:" + +#: ../src/vikgoto.c:487 +msgid "Locality" +msgstr "" + +#: ../src/vikgpslayer.c:137 +msgid "Data Mode" +msgstr "" + +#: ../src/vikgpslayer.c:139 +msgid "Realtime Tracking Mode" +msgstr "" + +#: ../src/vikgpslayer.c:176 +msgid "Keep vehicle at center" +msgstr "" + +#: ../src/vikgpslayer.c:177 +msgid "Keep vehicle on screen" +msgstr "" + +#: ../src/vikgpslayer.c:178 +msgid "Disable" +msgstr "" + +#: ../src/vikgpslayer.c:218 +msgid "Download Tracks:" +msgstr "" + +#: ../src/vikgpslayer.c:219 +msgid "Upload Tracks:" +msgstr "" + +#: ../src/vikgpslayer.c:220 +msgid "Download Routes:" +msgstr "" + +#: ../src/vikgpslayer.c:221 +msgid "Upload Routes:" +msgstr "" + +#: ../src/vikgpslayer.c:222 +msgid "Download Waypoints:" +msgstr "" + +#: ../src/vikgpslayer.c:223 +msgid "Upload Waypoints:" +msgstr "" + +#: ../src/vikgpslayer.c:225 +msgid "Recording tracks" +msgstr "" + +#: ../src/vikgpslayer.c:226 +msgid "Jump to current position on start" +msgstr "" + +#: ../src/vikgpslayer.c:227 +msgid "Moving Map Method:" +msgstr "" + +#: ../src/vikgpslayer.c:228 +msgid "Update Statusbar:" +msgstr "" + +#: ../src/vikgpslayer.c:228 +msgid "Display information in the statusbar on GPS updates" +msgstr "" + +#: ../src/vikgpslayer.c:229 +msgid "Auto Connect" +msgstr "" + +#: ../src/vikgpslayer.c:229 +msgid "Automatically connect to GPSD" +msgstr "" + +#: ../src/vikgpslayer.c:230 +msgid "Gpsd Host:" +msgstr "" + +#: ../src/vikgpslayer.c:231 +msgid "Gpsd Port:" +msgstr "Gpsd θύρα:" + +#: ../src/vikgpslayer.c:232 +msgid "Gpsd Retry Interval (seconds):" +msgstr "" + +#: ../src/vikgpslayer.c:254 +msgid "GPS" +msgstr "" + +#: ../src/vikgpslayer.c:320 ../src/vikgpslayer.c:1504 +msgid "GPS Download" +msgstr "" + +#: ../src/vikgpslayer.c:320 ../src/vikgpslayer.c:1504 ../src/viktrwlayer.c:3993 +msgid "GPS Upload" +msgstr "" + +#: ../src/vikgpslayer.c:322 +msgid "GPS Realtime Tracking" +msgstr "" + +#: ../src/vikgpslayer.c:458 +msgid "Connected" +msgstr "" + +#: ../src/vikgpslayer.c:460 +msgid "Disconnected" +msgstr "" + +#: ../src/vikgpslayer.c:554 +msgid "Unknown GPS Protocol" +msgstr "Άγνωστο Πρωτόκολλο GPS" + +#: ../src/vikgpslayer.c:572 +msgid "Unknown serial port device" +msgstr "Άγνωστη συσκευή στην σειριακή θύρα" + +#: ../src/vikgpslayer.c:691 +#, c-format +msgid "%s: unknown parameter" +msgstr "%s: Αγνωστη παράμετρος" + +#. Now with icons +#: ../src/vikgpslayer.c:794 +msgid "_Upload to GPS" +msgstr "" + +#: ../src/vikgpslayer.c:800 +msgid "Download from _GPS" +msgstr "" + +#: ../src/vikgpslayer.c:821 +msgid "Empty _Realtime" +msgstr "" + +#: ../src/vikgpslayer.c:828 +msgid "E_mpty Upload" +msgstr "" + +#: ../src/vikgpslayer.c:834 +msgid "_Empty Download" +msgstr "" + +#: ../src/vikgpslayer.c:840 +msgid "Empty _All" +msgstr "" + +#: ../src/vikgpslayer.c:852 +#, c-format +msgid "Unexpected number of disconnected handlers: %d" +msgstr "" + +#: ../src/vikgpslayer.c:995 +#, c-format +msgid "Uploading %d waypoint..." +msgid_plural "Uploading %d waypoints..." +msgstr[0] "" +msgstr[1] "" + +#: ../src/vikgpslayer.c:1000 +#, c-format +msgid "Uploading %d trackpoint..." +msgid_plural "Uploading %d trackpoints..." +msgstr[0] "" +msgstr[1] "" + +#: ../src/vikgpslayer.c:1005 +#, c-format +msgid "Uploading %d routepoint..." +msgid_plural "Uploading %d routepoints..." +msgstr[0] "" +msgstr[1] "" + +#: ../src/vikgpslayer.c:1034 +#, c-format +msgid "Downloaded %d out of %d waypoint..." +msgid_plural "Downloaded %d out of %d waypoints..." +msgstr[0] "" +msgstr[1] "" + +#: ../src/vikgpslayer.c:1040 +#, c-format +msgid "Downloaded %d out of %d trackpoint..." +msgid_plural "Downloaded %d out of %d trackpoints..." +msgstr[0] "" +msgstr[1] "" + +#: ../src/vikgpslayer.c:1046 +#, c-format +msgid "Downloaded %d out of %d routepoint..." +msgid_plural "Downloaded %d out of %d routepoints..." +msgstr[0] "" +msgstr[1] "" + +#: ../src/vikgpslayer.c:1056 +#, c-format +msgid "Uploaded %d out of %d waypoint..." +msgid_plural "Uploaded %d out of %d waypoints..." +msgstr[0] "" +msgstr[1] "" + +#: ../src/vikgpslayer.c:1062 +#, c-format +msgid "Uploaded %d out of %d trackpoint..." +msgid_plural "Uploaded %d out of %d trackpoints..." +msgstr[0] "" +msgstr[1] "" + +#: ../src/vikgpslayer.c:1068 +#, c-format +msgid "Uploaded %d out of %d routepoint..." +msgid_plural "Uploaded %d out of %d routepoints..." +msgstr[0] "" +msgstr[1] "" + +#: ../src/vikgpslayer.c:1079 +#, c-format +msgid "Downloaded %d waypoint" +msgid_plural "Downloaded %d waypoints" +msgstr[0] "" +msgstr[1] "" + +#: ../src/vikgpslayer.c:1085 +#, c-format +msgid "Downloaded %d trackpoint" +msgid_plural "Downloaded %d trackpoints" +msgstr[0] "" +msgstr[1] "" + +#: ../src/vikgpslayer.c:1091 +#, c-format +msgid "Downloaded %d routepoint" +msgid_plural "Downloaded %d routepoints" +msgstr[0] "" +msgstr[1] "" + +#: ../src/vikgpslayer.c:1101 +#, c-format +msgid "Uploaded %d waypoint" +msgid_plural "Uploaded %d waypoints" +msgstr[0] "" +msgstr[1] "" + +#: ../src/vikgpslayer.c:1107 +#, c-format +msgid "Uploaded %d trackpoint" +msgid_plural "Uploaded %d trackpoints" +msgstr[0] "" +msgstr[1] "" + +#: ../src/vikgpslayer.c:1113 +#, c-format +msgid "Uploaded %d routepoint" +msgid_plural "Uploaded %d routepoints" +msgstr[0] "" +msgstr[1] "" + +#: ../src/vikgpslayer.c:1363 +msgid "Error: No result." +msgstr "" + +#: ../src/vikgpslayer.c:1471 +msgid "Warning - GPS Upload items may overwrite each other" +msgstr "" + +#: ../src/vikgpslayer.c:1506 +msgid "Status: detecting gpsbabel" +msgstr "Κατάσταση: εντοπισμός gpsbabel" + +#: ../src/vikgpslayer.c:1533 +msgid "No GPS items selected for transfer." +msgstr "" + +#: ../src/vikgpslayer.c:1546 +msgid "Could not turn off device." +msgstr "" + +#: ../src/vikgpslayer.c:1589 +msgid "Are you sure you want to delete GPS Upload data?" +msgstr "" + +#: ../src/vikgpslayer.c:1602 +msgid "Are you sure you want to delete GPS Download data?" +msgstr "" + +#: ../src/vikgpslayer.c:1616 +msgid "Are you sure you want to delete GPS Realtime data?" +msgstr "" + +#: ../src/vikgpslayer.c:1630 +msgid "Are you sure you want to delete All GPS data?" +msgstr "" + +#: ../src/vikgpslayer.c:2004 +#, c-format +msgid "" +"Failed to connect to gpsd at %s (port %s)\n" +"Should Viking keep trying (every %d seconds)?" +msgstr "" + +#: ../src/viklayerspanel.c:73 +msgid "C_ut" +msgstr "" + +#: ../src/viklayerspanel.c:74 ../src/vikwindow.c:4882 +msgid "_Copy" +msgstr "Αντι_γραφή" + +#: ../src/viklayerspanel.c:75 ../src/vikwindow.c:4883 +msgid "_Paste" +msgstr "Ε_πικόλληση" + +#: ../src/viklayerspanel.c:76 ../src/vikwindow.c:4884 +msgid "_Delete" +msgstr "_Διαγραφή" + +#: ../src/viklayerspanel.c:154 +msgid "New Layer" +msgstr "" + +#: ../src/viklayerspanel.c:347 +msgid "Top Layer" +msgstr "" + +#: ../src/viklayerspanel.c:363 +msgid "Add new layer" +msgstr "Προσθήκη νέου επιπέδου" + +#: ../src/viklayerspanel.c:370 ../src/vikwindow.c:4884 +msgid "Remove selected layer" +msgstr "Αφαίρεση επιλεγμένου επιπέδου" + +#: ../src/viklayerspanel.c:377 +msgid "Move selected layer up" +msgstr "" + +#: ../src/viklayerspanel.c:384 +msgid "Move selected layer down" +msgstr "" + +#: ../src/viklayerspanel.c:391 ../src/vikwindow.c:4881 +msgid "Cut selected layer" +msgstr "" + +#: ../src/viklayerspanel.c:398 ../src/vikwindow.c:4882 +msgid "Copy selected layer" +msgstr "" + +#: ../src/viklayerspanel.c:405 ../src/vikwindow.c:4883 +msgid "" +"Paste layer into selected container layer or otherwise above selected layer" +msgstr "" + +#: ../src/viklayerspanel.c:502 +msgid "New name can not be blank." +msgstr "" + +#: ../src/viklayerspanel.c:751 +msgid "Aggregate Layers have no settable properties." +msgstr "" + +#: ../src/viklayerspanel.c:798 +msgid "You cannot cut the Top Layer." +msgstr "" + +#: ../src/viklayerspanel.c:843 +#, c-format +msgid "Are you sure you want to delete %s?" +msgstr "" + +#: ../src/viklayerspanel.c:863 +msgid "You cannot delete the Top Layer." +msgstr "" + +#: ../src/vikmapniklayer.c:78 +msgid "CSS (MML) Config File:" +msgstr "" + +#: ../src/vikmapniklayer.c:79 +msgid "CartoCSS configuration file" +msgstr "" + +#: ../src/vikmapniklayer.c:80 +msgid "XML Config File:" +msgstr "" + +#: ../src/vikmapniklayer.c:81 +msgid "Mapnik XML configuration file" +msgstr "" + +#: ../src/vikmapniklayer.c:84 +msgid "Use File Cache:" +msgstr "" + +#: ../src/vikmapniklayer.c:86 +msgid "File Cache Directory:" +msgstr "" + +#: ../src/vikmapniklayer.c:122 +msgid "_Mapnik Features" +msgstr "" + +#: ../src/vikmapniklayer.c:122 +msgid "Mapnik Features" +msgstr "" + +#: ../src/vikmapniklayer.c:140 +msgid "Mapnik Rendering" +msgstr "" + +#. Changing these values only applies before first mapnik layer is 'created' +#: ../src/vikmapniklayer.c:258 +msgid "Plugins Directory:" +msgstr "" + +#: ../src/vikmapniklayer.c:258 ../src/vikmapniklayer.c:259 +#: ../src/vikmapniklayer.c:260 ../src/vikmapniklayer.c:261 +msgid "You need to restart Viking for a change to this value to be used" +msgstr "" + +#: ../src/vikmapniklayer.c:259 +msgid "Fonts Directory:" +msgstr "" + +#: ../src/vikmapniklayer.c:260 +msgid "Recurse Fonts Directory:" +msgstr "" + +#: ../src/vikmapniklayer.c:261 +msgid "Rerender Timeout (hours):" +msgstr "" + +#. Changeable any time +#: ../src/vikmapniklayer.c:263 +msgid "CartoCSS:" +msgstr "" + +#: ../src/vikmapniklayer.c:263 +msgid "The program to convert CartoCSS files into Mapnik XML" +msgstr "" + +#: ../src/vikmapniklayer.c:506 +msgid "Running" +msgstr "" + +#: ../src/vikmapniklayer.c:525 +#, c-format +msgid "" +"Error running carto command:\n" +"%s" +msgstr "" + +#: ../src/vikmapniklayer.c:561 +msgid " completed in " +msgstr "" + +#: ../src/vikmapniklayer.c:561 +msgid "seconds" +msgstr "" + +#: ../src/vikmapniklayer.c:611 ../src/vikmapniklayer.c:979 +#, c-format +msgid "" +"Mapnik error loading configuration file:\n" +"%s" +msgstr "" + +#: ../src/vikmapniklayer.c:749 +#, c-format +msgid "Mapnik Render %d:%d:%d %s" +msgstr "" + +#: ../src/vikmapniklayer.c:840 +msgid "Mapnik Rendering must be in Mercator mode" +msgstr "" + +#: ../src/vikmapniklayer.c:997 +msgid "Mapnik Information" +msgstr "" + +#: ../src/vikmapniklayer.c:1031 +msgid "_Flush Memory Cache" +msgstr "" + +#: ../src/vikmapniklayer.c:1044 +msgid "_Run Carto Command" +msgstr "" + +#: ../src/vikmapniklayer.c:1102 ../src/vikmapslayer.c:2029 +#, c-format +msgid "Tile File Timestamp: %s" +msgstr "" + +#: ../src/vikmapniklayer.c:1105 ../src/vikmapslayer.c:2032 +msgid "Tile File Timestamp: Not Available" +msgstr "" + +#: ../src/vikmapniklayer.c:1120 +#, c-format +msgid "Rendering time %.2f seconds" +msgstr "" + +#: ../src/vikmapniklayer.c:1124 ../src/vikmapslayer.c:2042 +msgid "Tile Information" +msgstr "" + +#: ../src/vikmapniklayer.c:1145 +msgid "_Rerender Tile" +msgstr "" + +#: ../src/vikmapniklayer.c:1150 +msgid "_Info" +msgstr "" + +#. ******* MAPZOOMS ******** +#: ../src/vikmapslayer.c:96 +msgid "Use Viking Zoom Level" +msgstr "" + +#: ../src/vikmapslayer.c:146 +msgid "OSM" +msgstr "" + +#. NB mode => id - But can't break file format just to rename something better +#: ../src/vikmapslayer.c:152 +msgid "Map Type:" +msgstr "Τύπος Χάρτη:" + +#: ../src/vikmapslayer.c:153 +msgid "Maps Directory:" +msgstr "Κατάλογος Χαρτών:" + +#: ../src/vikmapslayer.c:154 +msgid "Cache Layout:" +msgstr "" + +#: ../src/vikmapslayer.c:155 +msgid "This determines the tile storage layout on disk" +msgstr "" + +#: ../src/vikmapslayer.c:156 +msgid "Map File:" +msgstr "" + +#: ../src/vikmapslayer.c:157 +msgid "An MBTiles file. Only applies when the map type method is 'MBTiles'" +msgstr "" + +#: ../src/vikmapslayer.c:159 +msgid "Control the Alpha value for transparency effects" +msgstr "" + +#: ../src/vikmapslayer.c:160 +msgid "Autodownload maps:" +msgstr "" + +#: ../src/vikmapslayer.c:161 +msgid "Autodownload Only Gets Missing Maps:" +msgstr "" + +#: ../src/vikmapslayer.c:162 +msgid "" +"Using this option avoids attempting to update already acquired tiles. This " +"can be useful if you want to restrict the network usage, without having to " +"resort to manual control. Only applies when 'Autodownload Maps' is on." +msgstr "" + +#: ../src/vikmapslayer.c:163 +msgid "Zoom Level:" +msgstr "" + +#: ../src/vikmapslayer.c:164 +msgid "" +"Determines the method of displaying map tiles for the current zoom level. " +"'Viking Zoom Level' uses the best matching level, otherwise setting a fixed " +"value will always use map tiles of the specified value regardless of the " +"actual zoom level." +msgstr "" + +#: ../src/vikmapslayer.c:197 +msgid "_Maps Download" +msgstr "" + +#: ../src/vikmapslayer.c:197 +msgid "Maps Download" +msgstr "" + +#: ../src/vikmapslayer.c:213 ../src/vikutils.c:895 +msgid "Map" +msgstr "Χάρτης" + +#: ../src/vikmapslayer.c:306 +msgid "Default map layer directory:" +msgstr "" + +#: ../src/vikmapslayer.c:306 +msgid "Choose a directory to store cached Map tiles for this layer" +msgstr "" + +#: ../src/vikmapslayer.c:436 ../src/vikmapslayer.c:633 +msgid "Unknown map type" +msgstr "Αγνωστος τύπος χάρτη" + +#: ../src/vikmapslayer.c:664 +msgid "Unknown Map Zoom" +msgstr "" + +#: ../src/vikmapslayer.c:833 +#, c-format +msgid "Failed to open MBTiles file: %s" +msgstr "" + +#: ../src/vikmapslayer.c:856 +#, c-format +msgid "" +"New map cannot be displayed in the current drawmode.\n" +"Select \"%s\" from View menu to view it." +msgstr "" + +#: ../src/vikmapslayer.c:1314 +#, c-format +msgid "" +"Cowardly refusing to draw tiles or existence of tiles beyond %d zoom out " +"factor" +msgstr "" + +#. TODO: ?? count up the number of download errors somehow... +#: ../src/vikmapslayer.c:1667 +msgid "Failed to download tile" +msgstr "" + +#: ../src/vikmapslayer.c:1673 +msgid "Unable to save tile" +msgstr "" + +#: ../src/vikmapslayer.c:1799 +#, c-format +msgid "Redownloading up to %d %s map..." +msgid_plural "Redownloading up to %d %s maps..." +msgstr[0] "" +msgstr[1] "" + +#: ../src/vikmapslayer.c:1801 +#, c-format +msgid "Redownloading %d %s map..." +msgid_plural "Redownloading %d %s maps..." +msgstr[0] "" +msgstr[1] "" + +#: ../src/vikmapslayer.c:1805 ../src/vikmapslayer.c:1890 +#, c-format +msgid "Downloading %d %s map..." +msgid_plural "Downloading %d %s maps..." +msgstr[0] "" +msgstr[1] "" + +#: ../src/vikmapslayer.c:1969 +msgid "YES" +msgstr "" + +#: ../src/vikmapslayer.c:1973 ../src/vikmapslayer.c:1977 +msgid "NO" +msgstr "" + +#. NB Also handles .jpg automatically due to pixbuf_new_from () support - although just print png for now. +#: ../src/vikmapslayer.c:1980 +#, c-format +msgid "Source: %s (%d%s%d%s%d.%s %s)" +msgstr "" + +#: ../src/vikmapslayer.c:1983 +msgid "Source: Not available" +msgstr "" + +#: ../src/vikmapslayer.c:2000 +msgid "Source: file://" +msgstr "" + +#: ../src/vikmapslayer.c:2012 +#, c-format +msgid "Source: %s" +msgstr "" + +#: ../src/vikmapslayer.c:2038 +#, c-format +msgid "Tile File: %s [Not Available]" +msgstr "" + +#: ../src/vikmapslayer.c:2086 +msgid "Redownload _Bad Map(s)" +msgstr "" + +#: ../src/vikmapslayer.c:2090 +msgid "Redownload _New Map(s)" +msgstr "" + +#: ../src/vikmapslayer.c:2094 +msgid "Redownload _All Map(s)" +msgstr "" + +#: ../src/vikmapslayer.c:2099 +msgid "_Show Tile Information" +msgstr "" + +#: ../src/vikmapslayer.c:2166 +#, c-format +msgid "" +"Wrong drawmode for this map.\n" +"Select \"%s\" from View menu and try again." +msgstr "" + +#: ../src/vikmapslayer.c:2171 +msgid "Wrong zoom level for this map." +msgstr "" + +#: ../src/vikmapslayer.c:2334 +msgid "Zoom Start:" +msgstr "" + +#: ../src/vikmapslayer.c:2341 +msgid "Zoom End:" +msgstr "" + +#: ../src/vikmapslayer.c:2347 +msgid "Download Maps Method:" +msgstr "" + +#. redownload method - needs to align with REDOWNLOAD* macro values +#: ../src/vikmapslayer.c:2419 +msgid "Missing" +msgstr "" + +#: ../src/vikmapslayer.c:2419 +msgid "Bad" +msgstr "" + +#: ../src/vikmapslayer.c:2419 +msgid "New" +msgstr "" + +#: ../src/vikmapslayer.c:2419 +msgid "Reload All" +msgstr "" + +#: ../src/vikmapslayer.c:2421 +msgid "Download for Zoom Levels" +msgstr "" + +#: ../src/vikmapslayer.c:2461 +#, c-format +msgid "" +"You are not allowed to download more than %d tiles in one go (requested %d)" +msgstr "" + +#: ../src/vikmapslayer.c:2469 +#, c-format +msgid "Do you really want to download %d tiles?" +msgstr "" + +#. Now with icons +#: ../src/vikmapslayer.c:2509 +msgid "Download _Missing Onscreen Maps" +msgstr "" + +#: ../src/vikmapslayer.c:2516 +msgid "Download _New Onscreen Maps" +msgstr "" + +#: ../src/vikmapslayer.c:2523 +msgid "Reload _All Onscreen Maps" +msgstr "" + +#: ../src/vikmapslayer.c:2529 +msgid "Download Maps in _Zoom Levels..." +msgstr "" + +#: ../src/vikmapslayer.c:2539 +#, fuzzy +msgid "_Open MBTiles Files" +msgstr "Άνοιγμα αρχείου" + +#: ../src/vikmapslayer.c:2554 +msgid "Flush Map Cache" +msgstr "" + +#: ../src/vikrouting.c:54 +msgid "Default engine:" +msgstr "" + +#: ../src/vikrouting.c:68 +msgid "Routing" +msgstr "" + +#: ../src/viktreeview.c:347 +msgid "Layer Name" +msgstr "Ονομα επιπέδου" + +#: ../src/viktreeview.c:924 +#, c-format +msgid "delete data from %s\n" +msgstr "" + +#: ../src/viktrwlayer.c:427 +msgid "Create _Waypoint" +msgstr "" + +#: ../src/viktrwlayer.c:427 +msgid "Create Waypoint" +msgstr "" + +#: ../src/viktrwlayer.c:437 +#, fuzzy +msgid "Edit _Track" +msgstr "Προσθήκη Ίχνους" + +#: ../src/viktrwlayer.c:437 +#, fuzzy +msgid "Edit Track" +msgstr "Προσθήκη Ίχνους" + +#: ../src/viktrwlayer.c:449 +msgid "Edit _Route" +msgstr "" + +#: ../src/viktrwlayer.c:449 +msgid "Edit Route" +msgstr "" + +#: ../src/viktrwlayer.c:460 +msgid "Route _Finder" +msgstr "" + +#: ../src/viktrwlayer.c:460 +msgid "Route Finder" +msgstr "" + +#: ../src/viktrwlayer.c:471 +#, fuzzy +msgid "Splitter" +msgstr "Διαίρεση εδώ" + +#: ../src/viktrwlayer.c:482 +msgid "_Edit Waypoint" +msgstr "" + +#: ../src/viktrwlayer.c:482 +msgid "Edit Waypoint" +msgstr "" + +#: ../src/viktrwlayer.c:495 +msgid "Edit Trac_kpoint" +msgstr "" + +#: ../src/viktrwlayer.c:495 +msgid "Edit Trackpoint" +msgstr "" + +#. a pixbuf for this one is already made globally available +#: ../src/viktrwlayer.c:508 +msgid "Show P_icture" +msgstr "" + +#: ../src/viktrwlayer.c:508 +msgid "Show Picture" +msgstr "" + +#: ../src/viktrwlayer.c:531 +msgid "Waypoint Images" +msgstr "" + +#: ../src/viktrwlayer.c:531 +msgid "Tracks Advanced" +msgstr "" + +#: ../src/viktrwlayer.c:531 +msgid "Metadata" +msgstr "" + +#: ../src/viktrwlayer.c:531 +msgid "Filesystem" +msgstr "" + +#: ../src/viktrwlayer.c:534 +msgid "Draw by Track" +msgstr "" + +#: ../src/viktrwlayer.c:534 +msgid "Draw by Speed" +msgstr "" + +#: ../src/viktrwlayer.c:534 +msgid "All Tracks Same Color" +msgstr "" + +#: ../src/viktrwlayer.c:535 +msgid "Filled Square" +msgstr "" + +#: ../src/viktrwlayer.c:535 +msgid "Square" +msgstr "Τετράγωνο" + +#: ../src/viktrwlayer.c:535 +msgid "Circle" +msgstr "Κύκλος" + +#: ../src/viktrwlayer.c:535 +msgid "X" +msgstr "X" + +#: ../src/viktrwlayer.c:561 +msgid "Extra Extra Small" +msgstr "" + +#: ../src/viktrwlayer.c:562 +msgid "Extra Small" +msgstr "" + +#: ../src/viktrwlayer.c:566 +msgid "Extra Large" +msgstr "" + +#: ../src/viktrwlayer.c:567 +msgid "Extra Extra Large" +msgstr "" + +#: ../src/viktrwlayer.c:573 +msgid "Name Ascending" +msgstr "" + +#: ../src/viktrwlayer.c:574 +msgid "Name Descending" +msgstr "" + +#: ../src/viktrwlayer.c:582 ../src/viktrwlayer_propwin.c:3319 +msgid "No" +msgstr "" + +#: ../src/viktrwlayer.c:583 +msgid "Yes" +msgstr "" + +#: ../src/viktrwlayer.c:584 +msgid "No write" +msgstr "" + +#: ../src/viktrwlayer.c:649 ../src/viktrwlayer.c:673 +msgid "Draw Labels" +msgstr "Σχεδιασμός ετικετών" + +#: ../src/viktrwlayer.c:650 +msgid "Note: the individual track controls what labels may be displayed" +msgstr "" + +#: ../src/viktrwlayer.c:651 +msgid "Track Labels Font Size:" +msgstr "" + +#: ../src/viktrwlayer.c:652 +msgid "Track Drawing Mode:" +msgstr "" + +#: ../src/viktrwlayer.c:653 +msgid "All Tracks Color:" +msgstr "" + +#: ../src/viktrwlayer.c:654 +msgid "The color used when 'All Tracks Same Color' drawing mode is selected" +msgstr "" + +#: ../src/viktrwlayer.c:655 +msgid "Draw Track Lines" +msgstr "" + +#: ../src/viktrwlayer.c:656 +msgid "Track Thickness:" +msgstr "" + +#: ../src/viktrwlayer.c:657 +msgid "Draw Track Direction" +msgstr "" + +#: ../src/viktrwlayer.c:658 +msgid "Direction Size:" +msgstr "" + +#: ../src/viktrwlayer.c:659 +msgid "Draw Trackpoints" +msgstr "" + +#: ../src/viktrwlayer.c:660 +msgid "Trackpoint Size:" +msgstr "" + +#: ../src/viktrwlayer.c:661 +msgid "Draw Elevation" +msgstr "" + +#: ../src/viktrwlayer.c:662 +msgid "Draw Elevation Height %:" +msgstr "" + +#: ../src/viktrwlayer.c:663 +msgid "Draw Stops" +msgstr "" + +#: ../src/viktrwlayer.c:664 +msgid "" +"Whether to draw a marker when trackpoints are at the same position but over " +"the minimum stop length apart in time" +msgstr "" + +#: ../src/viktrwlayer.c:665 +msgid "Min Stop Length (seconds):" +msgstr "" + +#: ../src/viktrwlayer.c:667 +msgid "Track BG Thickness:" +msgstr "" + +#: ../src/viktrwlayer.c:668 +msgid "Track Background Color" +msgstr "" + +#: ../src/viktrwlayer.c:669 +msgid "Draw by Speed Factor (%):" +msgstr "" + +#: ../src/viktrwlayer.c:670 +msgid "" +"The percentage factor away from the average speed determining the color used" +msgstr "" + +#: ../src/viktrwlayer.c:671 +msgid "Track Sort Order:" +msgstr "" + +#: ../src/viktrwlayer.c:674 +msgid "Waypoint Font Size:" +msgstr "" + +#: ../src/viktrwlayer.c:675 +msgid "Waypoint Color:" +msgstr "" + +#: ../src/viktrwlayer.c:676 +msgid "Waypoint Text:" +msgstr "" + +#: ../src/viktrwlayer.c:677 +msgid "Background:" +msgstr "Φόντο:" + +#: ../src/viktrwlayer.c:678 +msgid "Fake BG Color Translucency:" +msgstr "" + +#: ../src/viktrwlayer.c:679 +msgid "Waypoint marker:" +msgstr "" + +#: ../src/viktrwlayer.c:680 +msgid "Waypoint size:" +msgstr "" + +#: ../src/viktrwlayer.c:681 +msgid "Draw Waypoint Symbols:" +msgstr "" + +#: ../src/viktrwlayer.c:682 +msgid "Waypoint Sort Order:" +msgstr "" + +#: ../src/viktrwlayer.c:684 +msgid "Draw Waypoint Images" +msgstr "" + +#: ../src/viktrwlayer.c:685 +msgid "Image Size (pixels):" +msgstr "Μέγεθος Εικόνας (pixels):" + +#: ../src/viktrwlayer.c:686 +msgid "Image Alpha:" +msgstr "" + +#: ../src/viktrwlayer.c:687 +msgid "Image Memory Cache Size:" +msgstr "" + +#: ../src/viktrwlayer.c:690 +msgid "Author" +msgstr "" + +#: ../src/viktrwlayer.c:691 +msgid "Creation Time" +msgstr "" + +#: ../src/viktrwlayer.c:692 +msgid "Keywords" +msgstr "" + +#: ../src/viktrwlayer.c:693 +msgid "External layer:" +msgstr "" + +#: ../src/viktrwlayer.c:693 +msgid "" +"Layer data stored in the Viking file, in an external file, or in an external " +"file but changes are not written to the file (file only loaded at startup)" +msgstr "" + +#: ../src/viktrwlayer.c:694 +msgid "Save layer as:" +msgstr "" + +#: ../src/viktrwlayer.c:694 +msgid "Specify where layer should be saved. Overwrites file if it exists." +msgstr "" + +#: ../src/viktrwlayer.c:798 +msgid "TrackWaypoint" +msgstr "" + +#: ../src/viktrwlayer.c:1999 ../src/viktrwlayer_propwin.c:1469 +#: ../src/viktrwlayer_propwin.c:1471 ../src/vikutils.c:299 +#: ../src/vikutils.c:326 +msgid "miles" +msgstr "" + +#: ../src/viktrwlayer.c:2002 ../src/viktrwlayer_propwin.c:1475 +#: ../src/viktrwlayer_propwin.c:1477 ../src/vikutils.c:303 +#: ../src/vikutils.c:330 +msgid "NM" +msgstr "" + +#. VIK_UNITS_DISTANCE_KILOMETRES: +#: ../src/viktrwlayer.c:2006 ../src/viktrwlayer_propwin.c:1482 +#: ../src/viktrwlayer_propwin.c:1484 ../src/vikutils.c:308 +#: ../src/vikutils.c:335 +msgid "km" +msgstr "" + +#: ../src/viktrwlayer.c:2121 +msgid "start/end" +msgstr "" + +#: ../src/viktrwlayer.c:2133 +msgid "start" +msgstr "" + +#: ../src/viktrwlayer.c:2142 +msgid "end" +msgstr "" + +#: ../src/viktrwlayer.c:3103 +#, c-format +msgid " in %d:%02d hrs:mins" +msgstr "" + +#: ../src/viktrwlayer.c:3107 +#, c-format +msgid "" +"\n" +"%sTotal Length %.1f %s%s" +msgstr "" + +#: ../src/viktrwlayer.c:3131 +#, c-format +msgid "" +"\n" +"Total route length %.1f %s" +msgstr "" + +#: ../src/viktrwlayer.c:3136 +#, c-format +msgid "Tracks: %d - Waypoints: %d - Routes: %d%s%s" +msgstr "" + +#: ../src/viktrwlayer.c:3155 +#, c-format +msgid "Tracks: %d" +msgstr "" + +#: ../src/viktrwlayer.c:3165 +#, c-format +msgid "Routes: %d" +msgstr "" + +#: ../src/viktrwlayer.c:3195 +#, c-format +msgid "- %d:%02d hrs:mins" +msgstr "" + +#: ../src/viktrwlayer.c:3202 +#, c-format +msgid "%s%.1f km %s" +msgstr "" + +#: ../src/viktrwlayer.c:3205 +#, c-format +msgid "%s%.1f miles %s" +msgstr "" + +#: ../src/viktrwlayer.c:3208 +#, c-format +msgid "%s%.1f NM %s" +msgstr "" + +#: ../src/viktrwlayer.c:3222 +#, c-format +msgid "Waypoints: %d" +msgstr "" + +#: ../src/viktrwlayer.c:3279 +#, c-format +msgid "Wpt: Alt %dft" +msgstr "" + +#. VIK_UNITS_HEIGHT_METRES: +#: ../src/viktrwlayer.c:3283 +#, c-format +msgid "Wpt: Alt %dm" +msgstr "" + +#. Add comment if available +#: ../src/viktrwlayer.c:3298 +#, c-format +msgid "%s | %s %s | Comment: %s" +msgstr "" + +#: ../src/viktrwlayer.c:3300 +#, c-format +msgid "%s | %s %s" +msgstr "" + +#: ../src/viktrwlayer.c:3562 ../src/viktrwlayer.c:3591 +msgid "This layer has no waypoints or trackpoints." +msgstr "" + +#: ../src/viktrwlayer.c:3598 ../src/viktrwlayer.c:3607 +#: ../src/viktrwlayer.c:3616 ../src/viktrwlayer.c:3625 +#: ../src/viktrwlayer.c:3634 ../src/viktrwlayer.c:3642 +msgid "Export Layer" +msgstr "Εξαγωγή Επιπέδου" + +#: ../src/viktrwlayer.c:3671 +msgid "Export Route as GPX" +msgstr "" + +#: ../src/viktrwlayer.c:3673 +msgid "Export Track as GPX" +msgstr "" + +#: ../src/viktrwlayer.c:3693 +msgid "Find" +msgstr "" + +#: ../src/viktrwlayer.c:3703 +msgid "Waypoint Name:" +msgstr "" + +#: ../src/viktrwlayer.c:3720 +msgid "Waypoint not found in this layer." +msgstr "" + +#: ../src/viktrwlayer.c:3989 +msgid "Can not upload invisible track." +msgstr "" + +#: ../src/viktrwlayer.c:4082 ../src/viktrwlayer.c:10512 +msgid "Track" +msgstr "" + +#: ../src/viktrwlayer.c:4107 ../src/viktrwlayer.c:10599 +msgid "Route" +msgstr "" + +#: ../src/viktrwlayer.c:4194 +msgid "Externa_l" +msgstr "" + +#: ../src/viktrwlayer.c:4216 ../src/viktrwlayer.c:8456 +#: ../src/viktrwlayer.c:8574 +msgid "_Finish Route" +msgstr "" + +#: ../src/viktrwlayer.c:4218 ../src/viktrwlayer.c:8380 +#: ../src/viktrwlayer.c:8572 +msgid "_Finish Track" +msgstr "" + +#. Now with icons +#: ../src/viktrwlayer.c:4230 +msgid "_View Layer" +msgstr "" + +#: ../src/viktrwlayer.c:4237 +msgid "V_iew" +msgstr "" + +#: ../src/viktrwlayer.c:4243 +msgid "View All _Tracks" +msgstr "" + +#: ../src/viktrwlayer.c:4248 +msgid "View All _Routes" +msgstr "" + +#: ../src/viktrwlayer.c:4253 +msgid "View All _Waypoints" +msgstr "" + +#: ../src/viktrwlayer.c:4258 +msgid "_Goto Center of Layer" +msgstr "" + +#: ../src/viktrwlayer.c:4264 ../src/viktrwlayer.c:8321 +msgid "Goto _Waypoint..." +msgstr "" + +#: ../src/viktrwlayer.c:4270 +msgid "_Export Layer" +msgstr "" + +#: ../src/viktrwlayer.c:4276 +msgid "Export as GPS_Point..." +msgstr "" + +#: ../src/viktrwlayer.c:4281 +msgid "Export as GPS_Mapper..." +msgstr "" + +#: ../src/viktrwlayer.c:4286 +msgid "Export as _GPX..." +msgstr "" + +#: ../src/viktrwlayer.c:4292 +msgid "Export as _KML..." +msgstr "" + +#: ../src/viktrwlayer.c:4299 +msgid "Export as GEO_JSON..." +msgstr "" + +#: ../src/viktrwlayer.c:4306 +msgid "Export via GPSbabel..." +msgstr "" + +#: ../src/viktrwlayer.c:4312 +#, c-format +msgid "Open with External Program_1: %s" +msgstr "" + +#: ../src/viktrwlayer.c:4319 +#, c-format +msgid "Open with External Program_2: %s" +msgstr "" + +#: ../src/viktrwlayer.c:4327 ../src/vikwindow.c:4825 +msgid "_New" +msgstr "_Νέο" + +#: ../src/viktrwlayer.c:4333 +msgid "New _Waypoint..." +msgstr "" + +#: ../src/viktrwlayer.c:4339 +msgid "New _Track" +msgstr "" + +#: ../src/viktrwlayer.c:4347 +msgid "New _Route" +msgstr "" + +#: ../src/viktrwlayer.c:4356 ../src/viktrwlayer.c:8232 +#: ../src/viktrwlayer.c:9003 +msgid "Geotag _Images..." +msgstr "" + +#: ../src/viktrwlayer.c:4363 +msgid "_Acquire" +msgstr "" + +#: ../src/viktrwlayer.c:4369 ../src/vikwindow.c:4904 +msgid "From _GPS..." +msgstr "" + +#. FIXME: only add menu when at least a routing engine has support for Directions +#: ../src/viktrwlayer.c:4375 +msgid "From _Directions..." +msgstr "" + +#: ../src/viktrwlayer.c:4381 +msgid "From _OSM Traces..." +msgstr "" + +#: ../src/viktrwlayer.c:4386 +msgid "From _My OSM Traces..." +msgstr "" + +#: ../src/viktrwlayer.c:4392 ../src/vikwindow.c:4844 +msgid "From _URL..." +msgstr "" + +#: ../src/viktrwlayer.c:4399 ../src/vikwindow.c:4846 +msgid "From _Wikipedia Waypoints" +msgstr "" + +#: ../src/viktrwlayer.c:4405 +msgid "Within _Layer Bounds" +msgstr "" + +#: ../src/viktrwlayer.c:4411 +msgid "Within _Current View" +msgstr "" + +#: ../src/viktrwlayer.c:4419 +msgid "From Geo_caching..." +msgstr "" + +#: ../src/viktrwlayer.c:4426 ../src/vikwindow.c:4842 +msgid "From Geotagged _Images..." +msgstr "" + +#: ../src/viktrwlayer.c:4433 +msgid "From _File..." +msgstr "" + +#: ../src/viktrwlayer.c:4436 ../src/vikwindow.c:4905 +msgid "Import File With GPS_Babel..." +msgstr "" + +#: ../src/viktrwlayer.c:4443 ../src/viktrwlayer.c:8905 +msgid "_Upload" +msgstr "" + +#: ../src/viktrwlayer.c:4449 +msgid "Upload to _GPS..." +msgstr "" + +#: ../src/viktrwlayer.c:4456 ../src/viktrwlayer.c:8973 +msgid "Upload to _OSM..." +msgstr "" + +#: ../src/viktrwlayer.c:4464 +msgid "De_lete" +msgstr "" + +#: ../src/viktrwlayer.c:4470 +msgid "Delete All _Tracks" +msgstr "" + +#: ../src/viktrwlayer.c:4477 +msgid "Delete Tracks _From Selection..." +msgstr "" + +#: ../src/viktrwlayer.c:4484 ../src/viktrwlayer.c:8481 +msgid "Delete _All Routes" +msgstr "" + +#: ../src/viktrwlayer.c:4491 ../src/viktrwlayer.c:8487 +msgid "_Delete Routes From Selection..." +msgstr "" + +#: ../src/viktrwlayer.c:4498 +msgid "Delete All _Waypoints" +msgstr "" + +#: ../src/viktrwlayer.c:4505 +msgid "Delete Waypoints From _Selection..." +msgstr "" + +#: ../src/viktrwlayer.c:4512 ../src/viktrwlayer.c:8339 +msgid "Delete Duplicate Waypoints" +msgstr "" + +#: ../src/viktrwlayer.c:5198 +#, c-format +msgid "Are you sure you want to delete all tracks in %s?" +msgstr "" + +#: ../src/viktrwlayer.c:5211 +#, c-format +msgid "Are you sure you want to delete all routes in %s?" +msgstr "" + +#: ../src/viktrwlayer.c:5221 +#, c-format +msgid "Are you sure you want to delete all waypoints in %s?" +msgstr "" + +#: ../src/viktrwlayer.c:5238 +#, c-format +msgid "Are you sure you want to delete the waypoint \"%s\"?" +msgstr "" + +#: ../src/viktrwlayer.c:5254 +#, c-format +msgid "Are you sure you want to delete the track \"%s\"?" +msgstr "" + +#: ../src/viktrwlayer.c:5271 +#, c-format +msgid "Are you sure you want to delete the route \"%s\"?" +msgstr "" + +#: ../src/viktrwlayer.c:5527 ../src/viktrwlayer.c:6373 +msgid "" +"Converting a track to a route removes extra track data such as segments, " +"timestamps, etc...\n" +"Do you want to continue?" +msgstr "" + +#: ../src/viktrwlayer.c:5631 +msgid "No DEM layers available, thus no DEM values can be applied." +msgstr "" + +#: ../src/viktrwlayer.c:5651 ../src/viktrwlayer.c:5692 +#, c-format +msgid "%ld point adjusted" +msgid_plural "%ld points adjusted" +msgstr[0] "" +msgstr[1] "" + +#: ../src/viktrwlayer.c:5736 +#, c-format +msgid "%ld waypoint changed" +msgid_plural "%ld waypoints changed" +msgstr[0] "" +msgstr[1] "" + +#: ../src/viktrwlayer.c:5917 +#, c-format +msgid "" +"Refining a track with many points (%d) is unlikely to yield sensible " +"results. Do you want to Continue?" +msgstr "" + +#. Select engine from dialog +#: ../src/viktrwlayer.c:5925 +msgid "Refine Route with Routing Engine..." +msgstr "" + +#: ../src/viktrwlayer.c:5933 +msgid "Select routing engine" +msgstr "" + +#: ../src/viktrwlayer.c:6158 +msgid "Failed. No other tracks with timestamps in this layer found" +msgstr "" + +#: ../src/viktrwlayer.c:6160 +msgid "Failed. No other tracks without timestamps in this layer found" +msgstr "" + +#: ../src/viktrwlayer.c:6179 +msgid "Merge with..." +msgstr "" + +#: ../src/viktrwlayer.c:6180 +msgid "Select route to merge with" +msgstr "" + +#: ../src/viktrwlayer.c:6180 +msgid "Select track to merge with" +msgstr "" + +#: ../src/viktrwlayer.c:6264 ../src/viktrwlayer.c:6346 +msgid "Append Route" +msgstr "" + +#: ../src/viktrwlayer.c:6264 ../src/viktrwlayer.c:6346 +msgid "Append Track" +msgstr "" + +#: ../src/viktrwlayer.c:6265 +msgid "Select the route to append after the current route" +msgstr "" + +#: ../src/viktrwlayer.c:6266 +msgid "Select the track to append after the current track" +msgstr "" + +#: ../src/viktrwlayer.c:6347 +msgid "Select the track to append after the current route" +msgstr "" + +#: ../src/viktrwlayer.c:6348 +msgid "Select the route to append after the current track" +msgstr "" + +#: ../src/viktrwlayer.c:6414 +#, c-format +msgid "%d segment merged" +msgid_plural "%d segments merged" +msgstr[0] "" +msgstr[1] "" + +#: ../src/viktrwlayer.c:6430 +msgid "Failed. This track does not have timestamp" +msgstr "" + +#: ../src/viktrwlayer.c:6442 +msgid "Failed. No other track in this layer has timestamp" +msgstr "" + +#: ../src/viktrwlayer.c:6449 +msgid "Merge Threshold..." +msgstr "" + +#: ../src/viktrwlayer.c:6450 +msgid "Merge when time between tracks less than:" +msgstr "" + +#: ../src/viktrwlayer.c:6580 +msgid "Split Threshold..." +msgstr "" + +#: ../src/viktrwlayer.c:6581 +msgid "Split when time between trackpoints exceeds:" +msgstr "" + +#: ../src/viktrwlayer.c:6598 +#, c-format +msgid "" +"Can not split track due to trackpoints not ordered in time - such as at %s.\n" +"\n" +"Goto this trackpoint?" +msgstr "" + +#: ../src/viktrwlayer.c:6668 +msgid "Split Every Nth Point" +msgstr "" + +#: ../src/viktrwlayer.c:6669 +msgid "Split on every Nth point:" +msgstr "" + +#: ../src/viktrwlayer.c:6779 +msgid "Can not split track as it has no segments" +msgstr "" + +#: ../src/viktrwlayer.c:6861 ../src/viktrwlayer.c:6891 +#, c-format +msgid "Deleted %ld point" +msgid_plural "Deleted %ld points" +msgstr[0] "" +msgstr[1] "" + +#: ../src/viktrwlayer.c:6966 ../src/viktrwlayer.c:10989 +#: ../src/viktrwlayer_waypointlist.c:214 +#, c-format +msgid "Could not launch %s to open file." +msgstr "" + +#: ../src/viktrwlayer.c:6992 ../src/viktrwlayer.c:7113 +msgid "This track has no date information." +msgstr "" + +#: ../src/viktrwlayer.c:7006 ../src/viktrwlayer.c:7136 +msgid "This waypoint has no date information." +msgstr "" + +#: ../src/viktrwlayer.c:7030 +#, c-format +msgid "Could not launch %s" +msgstr "" + +#: ../src/viktrwlayer.c:7269 +msgid "Internal Error in vik_trw_layer_uniquify_tracks" +msgstr "" + +#: ../src/viktrwlayer.c:7374 ../src/viktrwlayer.c:7424 +#: ../src/viktrwlayer.c:7587 +msgid "" +"Multiple entries with the same name exist. This method only works with " +"unique names. Force unique names now?" +msgstr "" + +#: ../src/viktrwlayer.c:7385 +msgid "No tracks found" +msgstr "" + +#: ../src/viktrwlayer.c:7393 ../src/viktrwlayer.c:7443 +#: ../src/viktrwlayer.c:7607 +msgid "Delete Selection" +msgstr "" + +#: ../src/viktrwlayer.c:7394 +msgid "Select tracks to delete" +msgstr "" + +#: ../src/viktrwlayer.c:7435 +msgid "No routes found" +msgstr "" + +#: ../src/viktrwlayer.c:7444 +msgid "Select routes to delete" +msgstr "" + +#: ../src/viktrwlayer.c:7550 +msgid "Internal Error in vik_trw_layer_uniquify_waypoints" +msgstr "" + +#: ../src/viktrwlayer.c:7597 +msgid "No waypoints found" +msgstr "" + +#: ../src/viktrwlayer.c:7608 +msgid "Select waypoints to delete" +msgstr "" + +#: ../src/viktrwlayer.c:7691 +#, c-format +msgid "%ld waypoint deleted" +msgid_plural "%ld waypoints deleted" +msgstr[0] "" +msgstr[1] "" + +#: ../src/viktrwlayer.c:7697 +#, fuzzy +msgid "No duplicates found" +msgstr "Δεν βρέθηκαν εγγραφές" + +#: ../src/viktrwlayer.c:8028 +#, c-format +msgid "" +"A waypoint with the name \"%s\" already exists. Really rename to the same " +"name?" +msgstr "" + +#: ../src/viktrwlayer.c:8058 +#, c-format +msgid "" +"A track with the name \"%s\" already exists. Really rename to the same name?" +msgstr "" + +#: ../src/viktrwlayer.c:8095 +#, c-format +msgid "" +"A route with the name \"%s\" already exists. Really rename to the same name?" +msgstr "" + +#: ../src/viktrwlayer.c:8215 ../src/viktrwlayer.c:8602 +msgid "_Goto" +msgstr "" + +#: ../src/viktrwlayer.c:8226 +msgid "_Visit Geocache Webpage" +msgstr "" + +#: ../src/viktrwlayer.c:8235 +msgid "Geotag multiple images against this waypoint" +msgstr "" + +#: ../src/viktrwlayer.c:8245 ../src/viktrwlayer_waypointlist.c:352 +msgid "_Show Picture..." +msgstr "" + +#: ../src/viktrwlayer.c:8253 +msgid "Update Geotag on _Image" +msgstr "" + +#: ../src/viktrwlayer.c:8259 +msgid "_Update" +msgstr "" + +#: ../src/viktrwlayer.c:8264 +msgid "Update and _Keep File Timestamp" +msgstr "" + +#: ../src/viktrwlayer.c:8276 +msgid "Visit _Webpage" +msgstr "" + +#: ../src/viktrwlayer.c:8306 +msgid "_New Waypoint..." +msgstr "" + +#: ../src/viktrwlayer.c:8315 +msgid "_View All Waypoints" +msgstr "" + +#: ../src/viktrwlayer.c:8327 +msgid "Delete _All Waypoints" +msgstr "" + +#: ../src/viktrwlayer.c:8333 +msgid "_Delete Waypoints From Selection..." +msgstr "" + +#: ../src/viktrwlayer.c:8351 +msgid "_Show All Waypoints" +msgstr "" + +#: ../src/viktrwlayer.c:8357 +msgid "_Hide All Waypoints" +msgstr "" + +#: ../src/viktrwlayer.c:8369 +msgid "_List Waypoints..." +msgstr "" + +#: ../src/viktrwlayer.c:8390 +msgid "_View All Tracks" +msgstr "" + +#: ../src/viktrwlayer.c:8396 +msgid "_New Track" +msgstr "" + +#: ../src/viktrwlayer.c:8404 +msgid "Delete _All Tracks" +msgstr "" + +#: ../src/viktrwlayer.c:8410 +msgid "_Delete Tracks From Selection..." +msgstr "" + +#: ../src/viktrwlayer.c:8422 +msgid "_Show All Tracks" +msgstr "" + +#: ../src/viktrwlayer.c:8428 +msgid "_Hide All Tracks" +msgstr "" + +#: ../src/viktrwlayer.c:8439 +msgid "_List Tracks..." +msgstr "" + +#: ../src/viktrwlayer.c:8467 +msgid "_View All Routes" +msgstr "" + +#: ../src/viktrwlayer.c:8473 +msgid "_New Route" +msgstr "" + +#: ../src/viktrwlayer.c:8499 +msgid "_Show All Routes" +msgstr "" + +#: ../src/viktrwlayer.c:8505 +msgid "_Hide All Routes" +msgstr "" + +#: ../src/viktrwlayer.c:8516 +msgid "_List Routes..." +msgstr "" + +#: ../src/viktrwlayer.c:8587 +msgid "_View Track" +msgstr "" + +#: ../src/viktrwlayer.c:8589 +msgid "_View Route" +msgstr "" + +#: ../src/viktrwlayer.c:8608 +msgid "_Startpoint" +msgstr "" + +#: ../src/viktrwlayer.c:8614 +msgid "\"_Center\"" +msgstr "" + +#: ../src/viktrwlayer.c:8620 +msgid "_Endpoint" +msgstr "" + +#: ../src/viktrwlayer.c:8626 +msgid "_Highest Altitude" +msgstr "" + +#: ../src/viktrwlayer.c:8632 +msgid "_Lowest Altitude" +msgstr "" + +#: ../src/viktrwlayer.c:8640 +msgid "_Maximum Speed" +msgstr "" + +#: ../src/viktrwlayer.c:8646 +msgid "_Date" +msgstr "" + +#: ../src/viktrwlayer.c:8655 +msgid "Co_mbine" +msgstr "" + +#: ../src/viktrwlayer.c:8663 +msgid "_Merge By Time..." +msgstr "" + +#: ../src/viktrwlayer.c:8668 +msgid "Merge _Segments" +msgstr "" + +#: ../src/viktrwlayer.c:8675 +msgid "Merge _With Other Tracks..." +msgstr "" + +#: ../src/viktrwlayer.c:8682 +msgid "_Append Track..." +msgstr "" + +#: ../src/viktrwlayer.c:8684 +msgid "_Append Route..." +msgstr "" + +#: ../src/viktrwlayer.c:8690 +msgid "Append _Route..." +msgstr "" + +#: ../src/viktrwlayer.c:8692 +msgid "Append _Track..." +msgstr "" + +#: ../src/viktrwlayer.c:8699 +msgid "_Split" +msgstr "" + +#: ../src/viktrwlayer.c:8707 +msgid "_Split By Time..." +msgstr "" + +#. ATM always enable this entry - don't want to have to analyse the track before displaying the menu - to keep the menu speedy +#: ../src/viktrwlayer.c:8713 +msgid "Split Se_gments" +msgstr "" + +#: ../src/viktrwlayer.c:8719 +msgid "Split By _Number of Points..." +msgstr "" + +#: ../src/viktrwlayer.c:8724 +msgid "Split at _Trackpoint" +msgstr "" + +#: ../src/viktrwlayer.c:8732 +msgid "_Insert Points" +msgstr "" + +#: ../src/viktrwlayer.c:8738 +msgid "Insert Point _Before Selected Point" +msgstr "" + +#: ../src/viktrwlayer.c:8745 +msgid "Insert Point _After Selected Point" +msgstr "" + +#: ../src/viktrwlayer.c:8754 +msgid "Delete Poi_nts" +msgstr "" + +#: ../src/viktrwlayer.c:8760 +msgid "Delete _Selected Point" +msgstr "" + +#: ../src/viktrwlayer.c:8768 +msgid "Delete Points With The Same _Position" +msgstr "" + +#: ../src/viktrwlayer.c:8773 +msgid "Delete Points With The Same _Time" +msgstr "" + +#: ../src/viktrwlayer.c:8780 ../src/viktrwlayer.c:9029 +msgid "_Transform" +msgstr "" + +#: ../src/viktrwlayer.c:8788 ../src/viktrwlayer.c:9037 +msgid "_Apply DEM Data" +msgstr "" + +#: ../src/viktrwlayer.c:8793 ../src/viktrwlayer.c:9042 +msgid "_Overwrite" +msgstr "" + +#: ../src/viktrwlayer.c:8796 ../src/viktrwlayer.c:9045 +msgid "Overwrite any existing elevation values with DEM values" +msgstr "" + +#: ../src/viktrwlayer.c:8799 ../src/viktrwlayer.c:9048 +msgid "_Keep Existing" +msgstr "" + +#: ../src/viktrwlayer.c:8802 ../src/viktrwlayer.c:9051 +msgid "Keep existing elevation values, only attempt for missing values" +msgstr "" + +#: ../src/viktrwlayer.c:8807 +msgid "_Smooth Missing Elevation Data" +msgstr "" + +#: ../src/viktrwlayer.c:8812 +msgid "_Interpolated" +msgstr "" + +#: ../src/viktrwlayer.c:8815 +msgid "" +"Interpolate between known elevation values to derive values for the missing " +"elevations" +msgstr "" + +#: ../src/viktrwlayer.c:8818 +msgid "_Flat" +msgstr "" + +#: ../src/viktrwlayer.c:8821 +msgid "Set unknown elevation values to the last known value" +msgstr "" + +#: ../src/viktrwlayer.c:8825 +msgid "C_onvert to a Route" +msgstr "" + +#: ../src/viktrwlayer.c:8827 +msgid "C_onvert to a Track" +msgstr "" + +#: ../src/viktrwlayer.c:8835 +msgid "_Anonymize Times" +msgstr "" + +#: ../src/viktrwlayer.c:8838 +msgid "Shift timestamps to a relative offset from 1901-01-01" +msgstr "" + +#: ../src/viktrwlayer.c:8841 +msgid "_Interpolate Times" +msgstr "" + +#: ../src/viktrwlayer.c:8844 +msgid "" +"Reset trackpoint timestamps between the first and last points such that " +"track is traveled at equal speed" +msgstr "" + +#: ../src/viktrwlayer.c:8849 +msgid "_Reverse Track" +msgstr "" + +#: ../src/viktrwlayer.c:8851 +msgid "_Reverse Route" +msgstr "" + +#: ../src/viktrwlayer.c:8858 +msgid "Refine Route..." +msgstr "" + +#: ../src/viktrwlayer.c:8868 +msgid "Down_load Maps Along Track..." +msgstr "" + +#: ../src/viktrwlayer.c:8870 +msgid "Down_load Maps Along Route..." +msgstr "" + +#: ../src/viktrwlayer.c:8878 +msgid "_Export Track as GPX..." +msgstr "" + +#: ../src/viktrwlayer.c:8880 +msgid "_Export Route as GPX..." +msgstr "" + +#: ../src/viktrwlayer.c:8887 +msgid "E_xtend Track End" +msgstr "" + +#: ../src/viktrwlayer.c:8889 +msgid "E_xtend Route End" +msgstr "" + +#: ../src/viktrwlayer.c:8896 +msgid "Extend _Using Route Finder" +msgstr "" + +#: ../src/viktrwlayer.c:8911 +msgid "_Upload to GPS..." +msgstr "" + +#: ../src/viktrwlayer.c:8926 +msgid "_Diary" +msgstr "" + +#: ../src/viktrwlayer.c:8930 +msgid "Open diary program at this date" +msgstr "" + +#: ../src/viktrwlayer.c:8935 +msgid "_Astronomy" +msgstr "" + +#: ../src/viktrwlayer.c:8938 +msgid "Open astronomy program at this date and location" +msgstr "" + +#: ../src/viktrwlayer.c:8962 +msgid "_View Google Directions" +msgstr "" + +#: ../src/viktrwlayer.c:8984 +msgid "Use with _Filter" +msgstr "" + +#: ../src/viktrwlayer.c:9018 +msgid "_Edit Trackpoint" +msgstr "" + +#: ../src/viktrwlayer.c:10116 +#, c-format +msgid " - Gain %dm:Loss %dm" +msgstr "" + +#: ../src/viktrwlayer.c:10118 +#, c-format +msgid " - Gain %dft:Loss %dft" +msgstr "" + +#: ../src/viktrwlayer.c:10123 +#, c-format +msgid " - Bearing %3.1f° - Step %s" +msgstr "" + +#: ../src/viktrwlayer.c:10232 +#, c-format +msgid "Querying %s for route between (%.3f, %.3f) and (%.3f, %.3f)." +msgstr "" + +#: ../src/viktrwlayer.c:10248 +#, c-format +msgid "%s returned route between (%.3f, %.3f) and (%.3f, %.3f)." +msgstr "" + +#: ../src/viktrwlayer.c:10251 +#, c-format +msgid "Error getting route from %s." +msgstr "" + +#: ../src/viktrwlayer.c:11070 +#, c-format +msgid "Creating %d Image Thumbnails..." +msgstr "" + +#: ../src/viktrwlayer.c:11560 +msgid "No map layer in use. Create one first" +msgstr "" + +#: ../src/viktrwlayer.c:11679 +#, c-format +msgid "%s: Track List" +msgstr "" + +#: ../src/viktrwlayer.c:11681 +#, c-format +msgid "%s: Route List" +msgstr "" + +#: ../src/viktrwlayer.c:11734 +#, c-format +msgid "" +"Could not write external layer %s to %s, please fix and save before exiting " +"or data will be lost" +msgstr "" + +#: ../src/viktrwlayer.c:11782 +#, c-format +msgid "WARNING: issues encountered loading external layer %s from %s" +msgstr "" + +#: ../src/viktrwlayer_export.c:47 +msgid "Auto Device GPX Simplify:" +msgstr "" + +#: ../src/viktrwlayer_export.c:48 +msgid "" +"GPX saves to certain devices will be simplified for device compatibility." +msgstr "" + +#: ../src/viktrwlayer_export.c:125 +#, c-format +msgid "Export of GPX file simplified using point limit: %d" +msgstr "" + +#: ../src/viktrwlayer_export.c:206 ../src/viktrwlayer_export.c:323 +#: ../src/vikwindow.c:3694 +msgid "The filename you requested could not be opened for writing." +msgstr "" + +#: ../src/viktrwlayer_export.c:226 +#, c-format +msgid "Could not launch %s." +msgstr "" + +#: ../src/viktrwlayer_export.c:234 +msgid "Could not create temporary file for export." +msgstr "" + +#: ../src/viktrwlayer_export.c:268 +msgid "File format:" +msgstr "" + +#: ../src/viktrwlayer_export.c:276 +msgid "Select the file format." +msgstr "" + +#: ../src/viktrwlayer_export.c:281 +msgid "" +"Select the information to process.\n" +"Warning: the behavior of these switches is highly dependent of the file " +"format selected.\n" +"Please, refer to GPSbabel if unsure." +msgstr "" + +#: ../src/viktrwlayer_export.c:308 +msgid "You did not select a valid file format." +msgstr "" + +#: ../src/viktrwlayer_propwin.c:915 ../src/viktrwlayer_propwin.c:3381 +#: ../src/viktrwlayer_propwin.c:3417 ../src/viktrwlayer_propwin.c:3457 +#: ../src/viktrwlayer_propwin.c:3509 ../src/viktrwlayer_propwin.c:3527 +#: ../src/viktrwlayer_propwin.c:3600 ../src/viktrwlayer_propwin.c:3601 +#: ../src/viktrwlayer_propwin.c:3602 ../src/viktrwlayer_propwin.c:3611 +#: ../src/viktrwlayer_propwin.c:3612 ../src/viktrwlayer_propwin.c:3629 +#: ../src/viktrwlayer_propwin.c:3630 ../src/viktrwlayer_propwin.c:3644 +#: ../src/viktrwlayer_propwin.c:3645 ../src/viktrwlayer_propwin.c:3646 +#: ../src/viktrwlayer_propwin.c:3660 ../src/viktrwlayer_propwin.c:3661 +#: ../src/viktrwlayer_propwin.c:3662 ../src/viktrwlayer_propwin.c:3676 +#: ../src/viktrwlayer_propwin.c:3677 ../src/viktrwlayer_propwin.c:3678 +#: ../src/viktrwlayer_propwin.c:3695 ../src/viktrwlayer_propwin.c:3696 +#: ../src/viktrwlayer_analysis.c:293 +#, c-format +msgid "No Data" +msgstr "Χωρίς δεδομένα" + +#: ../src/viktrwlayer_propwin.c:960 ../src/viktrwlayer_propwin.c:1245 +#, c-format +msgid "%.1f kph" +msgstr "" + +#: ../src/viktrwlayer_propwin.c:963 ../src/viktrwlayer_propwin.c:1248 +#: ../src/viktrwlayer_analysis.c:352 +#, c-format +msgid "%.1f mph" +msgstr "" + +#: ../src/viktrwlayer_propwin.c:966 ../src/viktrwlayer_propwin.c:1251 +#, c-format +msgid "%.1f knots" +msgstr "" + +#: ../src/viktrwlayer_propwin.c:969 ../src/viktrwlayer_propwin.c:1254 +#, c-format +msgid "%.1f s/km" +msgstr "" + +#: ../src/viktrwlayer_propwin.c:972 ../src/viktrwlayer_propwin.c:1257 +#: ../src/viktrwlayer_analysis.c:389 ../src/viktrwlayer_analysis.c:392 +#, c-format +msgid "%.1f min/km" +msgstr "" + +#: ../src/viktrwlayer_propwin.c:975 ../src/viktrwlayer_propwin.c:1260 +#, c-format +msgid "%.1f sec/mi" +msgstr "" + +#: ../src/viktrwlayer_propwin.c:978 ../src/viktrwlayer_propwin.c:1263 +#: ../src/viktrwlayer_analysis.c:409 ../src/viktrwlayer_analysis.c:412 +#, c-format +msgid "%.1f min/mi" +msgstr "" + +#. VIK_UNITS_SPEED_METRES_PER_SECOND: +#: ../src/viktrwlayer_propwin.c:982 ../src/viktrwlayer_propwin.c:1267 +#, c-format +msgid "%.1f m/s" +msgstr "" + +#. Minutes +#: ../src/viktrwlayer_propwin.c:1411 +msgid "mins" +msgstr "" + +#. Hours +#: ../src/viktrwlayer_propwin.c:1418 +msgid "h" +msgstr "" + +#. Days +#: ../src/viktrwlayer_propwin.c:1424 +msgid "d" +msgstr "" + +#. Weeks +#: ../src/viktrwlayer_propwin.c:1429 +msgid "w" +msgstr "" + +#. 'Months' +#: ../src/viktrwlayer_propwin.c:1433 +msgid "M" +msgstr "" + +#: ../src/viktrwlayer_propwin.c:2051 ../src/viktrwlayer_analysis.c:303 +#, c-format +msgid "%.1f miles" +msgstr "" + +#: ../src/viktrwlayer_propwin.c:2054 ../src/viktrwlayer_analysis.c:306 +#, c-format +msgid "%.1f NM" +msgstr "" + +#. VIK_UNITS_DISTANCE_KILOMETRES +#: ../src/viktrwlayer_propwin.c:2057 ../src/viktrwlayer_analysis.c:310 +#, c-format +msgid "%.1f km" +msgstr "" + +#: ../src/viktrwlayer_propwin.c:3083 +msgid "Failed spliting track. Track unchanged" +msgstr "" + +#: ../src/viktrwlayer_propwin.c:3234 ../src/viktrwlayer_propwin.c:3744 +#, c-format +msgid "%s - Track Properties" +msgstr "" + +#: ../src/viktrwlayer_propwin.c:3239 +msgid "Split at _Marker" +msgstr "" + +#: ../src/viktrwlayer_propwin.c:3240 +msgid "Split _Segments" +msgstr "" + +#: ../src/viktrwlayer_propwin.c:3241 +msgid "_Reverse" +msgstr "" + +#: ../src/viktrwlayer_propwin.c:3242 +msgid "_Delete Dupl." +msgstr "" + +#: ../src/viktrwlayer_propwin.c:3269 +msgid "Comment:" +msgstr "Σχόλιο:" + +#: ../src/viktrwlayer_propwin.c:3270 +msgid "Description:" +msgstr "" + +#: ../src/viktrwlayer_propwin.c:3271 +#, fuzzy +msgid "Source:" +msgstr "Σχόλιο:" + +#: ../src/viktrwlayer_propwin.c:3272 +#, fuzzy +msgid "Type:" +msgstr "Σχόλιο:" + +#: ../src/viktrwlayer_propwin.c:3273 +msgid "Color:" +msgstr "" + +#: ../src/viktrwlayer_propwin.c:3274 +msgid "Draw Name:" +msgstr "" + +#: ../src/viktrwlayer_propwin.c:3275 +msgid "Distance Labels:" +msgstr "" + +#: ../src/viktrwlayer_propwin.c:3278 +msgid "Track Length:" +msgstr "" + +#: ../src/viktrwlayer_propwin.c:3279 +msgid "Trackpoints:" +msgstr "" + +#: ../src/viktrwlayer_propwin.c:3280 +msgid "Segments:" +msgstr "" + +#: ../src/viktrwlayer_propwin.c:3281 +msgid "Duplicate Points:" +msgstr "" + +#: ../src/viktrwlayer_propwin.c:3282 +msgid "Max Speed:" +msgstr "" + +#: ../src/viktrwlayer_propwin.c:3283 +msgid "Avg. Speed:" +msgstr "" + +#: ../src/viktrwlayer_propwin.c:3284 +msgid "Moving Avg. Speed:" +msgstr "" + +#: ../src/viktrwlayer_propwin.c:3285 +msgid "Avg. Dist. Between TPs:" +msgstr "" + +#: ../src/viktrwlayer_propwin.c:3286 +msgid "Elevation Range:" +msgstr "" + +#: ../src/viktrwlayer_propwin.c:3287 +msgid "Total Elevation Gain/Loss:" +msgstr "" + +#: ../src/viktrwlayer_propwin.c:3288 +msgid "Start:" +msgstr "" + +#: ../src/viktrwlayer_propwin.c:3289 +msgid "End:" +msgstr "" + +#: ../src/viktrwlayer_propwin.c:3290 +msgid "Duration:" +msgstr "Διάρκεια:" + +#: ../src/viktrwlayer_propwin.c:3320 +msgid "Centre" +msgstr "" + +#: ../src/viktrwlayer_propwin.c:3321 +msgid "Start only" +msgstr "" + +#: ../src/viktrwlayer_propwin.c:3322 +msgid "End only" +msgstr "" + +#: ../src/viktrwlayer_propwin.c:3323 +msgid "Start and End" +msgstr "" + +#: ../src/viktrwlayer_propwin.c:3324 +msgid "Centre, Start and End" +msgstr "" + +#: ../src/viktrwlayer_propwin.c:3336 +msgid "Maximum number of distance labels to be shown" +msgstr "" + +#: ../src/viktrwlayer_propwin.c:3340 +msgid "Properties" +msgstr "" + +#: ../src/viktrwlayer_propwin.c:3584 +#, c-format +msgid "%d minutes - %d minutes moving" +msgstr "" + +#: ../src/viktrwlayer_propwin.c:3596 +#, c-format +msgid "%s total - %s in segments" +msgstr "" + +#: ../src/viktrwlayer_propwin.c:3607 ../src/viktrwlayer_analysis.c:622 +msgid "Statistics" +msgstr "Στατιστικά" + +#: ../src/viktrwlayer_propwin.c:3613 ../src/viktrwlayer_propwin.c:3680 +msgid "Show D_EM" +msgstr "" + +#: ../src/viktrwlayer_propwin.c:3615 ../src/viktrwlayer_propwin.c:3631 +#: ../src/viktrwlayer_propwin.c:3647 ../src/viktrwlayer_propwin.c:3697 +msgid "Show _GPS Speed" +msgstr "" + +#: ../src/viktrwlayer_propwin.c:3617 ../src/viktrwlayer_propwin.c:3633 +#: ../src/viktrwlayer_propwin.c:3665 ../src/viktrwlayer_propwin.c:3699 +msgid "Track Distance:" +msgstr "" + +#: ../src/viktrwlayer_propwin.c:3618 ../src/viktrwlayer_propwin.c:3684 +msgid "Track Height:" +msgstr "" + +#: ../src/viktrwlayer_propwin.c:3624 +msgid "Elevation-distance" +msgstr "" + +#: ../src/viktrwlayer_propwin.c:3634 +msgid "Track Gradient:" +msgstr "" + +#: ../src/viktrwlayer_propwin.c:3639 +msgid "Gradient-distance" +msgstr "" + +#: ../src/viktrwlayer_propwin.c:3649 ../src/viktrwlayer_propwin.c:3666 +#: ../src/viktrwlayer_propwin.c:3683 +msgid "Track Time:" +msgstr "" + +#: ../src/viktrwlayer_propwin.c:3650 ../src/viktrwlayer_propwin.c:3700 +msgid "Track Speed:" +msgstr "" + +#: ../src/viktrwlayer_propwin.c:3651 ../src/viktrwlayer_propwin.c:3667 +#: ../src/viktrwlayer_propwin.c:3685 +msgid "Time/Date:" +msgstr "" + +#: ../src/viktrwlayer_propwin.c:3655 +msgid "Speed-time" +msgstr "" + +#: ../src/viktrwlayer_propwin.c:3663 ../src/viktrwlayer_propwin.c:3679 +msgid "Show S_peed" +msgstr "" + +#: ../src/viktrwlayer_propwin.c:3671 +msgid "Distance-time" +msgstr "" + +#: ../src/viktrwlayer_propwin.c:3690 +msgid "Elevation-time" +msgstr "" + +#: ../src/viktrwlayer_propwin.c:3705 +msgid "Speed-distance" +msgstr "" + +#: ../src/viktrwlayer_tpwin.c:190 ../src/viktrwlayer_wpwin.c:66 +msgid "Date/Time Edit" +msgstr "" + +#: ../src/viktrwlayer_tpwin.c:242 +msgid "Name:" +msgstr "" + +#: ../src/viktrwlayer_tpwin.c:243 +msgid "Latitude:" +msgstr "" + +#: ../src/viktrwlayer_tpwin.c:244 +msgid "Longitude:" +msgstr "" + +#: ../src/viktrwlayer_tpwin.c:245 +msgid "Altitude:" +msgstr "" + +#: ../src/viktrwlayer_tpwin.c:246 +msgid "Course:" +msgstr "" + +#: ../src/viktrwlayer_tpwin.c:247 +msgid "Timestamp:" +msgstr "" + +#: ../src/viktrwlayer_tpwin.c:248 +msgid "Time:" +msgstr "" + +#: ../src/viktrwlayer_tpwin.c:249 +msgid "Distance Difference:" +msgstr "" + +#: ../src/viktrwlayer_tpwin.c:250 +msgid "Time Difference:" +msgstr "" + +#: ../src/viktrwlayer_tpwin.c:251 +msgid "\"Speed\" Between:" +msgstr "" + +#: ../src/viktrwlayer_tpwin.c:252 +msgid "Speed:" +msgstr "" + +#: ../src/viktrwlayer_tpwin.c:253 +msgid "VDOP:" +msgstr "" + +#: ../src/viktrwlayer_tpwin.c:254 +msgid "HDOP:" +msgstr "" + +#: ../src/viktrwlayer_tpwin.c:255 +msgid "PDOP:" +msgstr "" + +#: ../src/viktrwlayer_tpwin.c:256 +msgid "SAT/FIX:" +msgstr "" + +#: ../src/viktrwlayer_tpwin.c:263 ../src/viktrwlayer_tpwin.c:408 +#: ../src/viktrwlayer_tpwin.c:622 +msgid "Trackpoint" +msgstr "" + +#: ../src/viktrwlayer_tpwin.c:266 +msgid "_Insert After" +msgstr "" + +#: ../src/viktrwlayer_tpwin.c:268 +msgid "Split Here" +msgstr "Διαίρεση εδώ" + +#: ../src/viktrwlayer_tracklist.c:262 ../src/viktrwlayer_waypointlist.c:306 +msgid "_Copy Data" +msgstr "" + +#. +#. item = gtk_image_menu_item_new_with_mnemonic ( _("_Select") ); +#. gtk_image_menu_item_set_image ( (GtkImageMenuItem*)item, gtk_image_new_from_stock (GTK_STOCK_FIND, GTK_ICON_SIZE_MENU) ); +#. g_signal_connect_swapped ( G_OBJECT(item), "activate", G_CALLBACK(trw_layer_track_select), values ); +#. gtk_menu_shell_append (GTK_MENU_SHELL (menu), item); +#. gtk_widget_show ( item ); +#. +#. ATM view auto selects, so don't bother with separate select menu entry +#. +#. item = gtk_image_menu_item_new_with_mnemonic ( _("_Select") ); +#. gtk_image_menu_item_set_image ( (GtkImageMenuItem*)item, gtk_image_new_from_stock (GTK_STOCK_FIND, GTK_ICON_SIZE_MENU) ); +#. g_signal_connect_swapped ( G_OBJECT(item), "activate", G_CALLBACK(trw_layer_waypoint_select), values ); +#. gtk_menu_shell_append (GTK_MENU_SHELL (menu), item); +#. gtk_widget_show ( item ); +#. +#. AUTO SELECT NOT TRUE YET... +#. ATM view auto selects, so don't bother with separate select menu entry +#: ../src/viktrwlayer_tracklist.c:290 ../src/viktrwlayer_waypointlist.c:341 +#: ../src/vikwindow.c:4816 +msgid "_View" +msgstr "Π_ροβολή" + +#. Insert column for the layer name when viewing multi layers +#: ../src/viktrwlayer_tracklist.c:613 ../src/viktrwlayer_waypointlist.c:609 +msgid "Layer" +msgstr "" + +#: ../src/viktrwlayer_tracklist.c:627 ../src/viktrwlayer_waypointlist.c:624 +msgid "Date" +msgstr "" + +#: ../src/viktrwlayer_tracklist.c:631 ../src/viktrwlayer_waypointlist.c:628 +msgid "Visible" +msgstr "" + +#: ../src/viktrwlayer_tracklist.c:639 +msgid "" +"Distance\n" +"(miles)" +msgstr "" + +#: ../src/viktrwlayer_tracklist.c:642 +msgid "" +"Distance\n" +"(NM)" +msgstr "" + +#: ../src/viktrwlayer_tracklist.c:645 +msgid "" +"Distance\n" +"(km)" +msgstr "" + +#: ../src/viktrwlayer_tracklist.c:651 +msgid "" +"Length\n" +"(minutes)" +msgstr "" + +#: ../src/viktrwlayer_tracklist.c:660 ../src/vikutils.c:93 +msgid "sec/mi" +msgstr "" + +#: ../src/viktrwlayer_tracklist.c:666 +#, c-format +msgid "" +"Av. Speed\n" +"(%s)" +msgstr "" + +#. Apply own formatting of the data +#: ../src/viktrwlayer_tracklist.c:671 +#, c-format +msgid "" +"Max Speed\n" +"(%s)" +msgstr "" + +#: ../src/viktrwlayer_tracklist.c:679 ../src/viktrwlayer_waypointlist.c:637 +msgid "" +"Max Height\n" +"(Feet)" +msgstr "" + +#: ../src/viktrwlayer_tracklist.c:681 ../src/viktrwlayer_waypointlist.c:639 +msgid "" +"Max Height\n" +"(Metres)" +msgstr "" + +#: ../src/viktrwlayer_waypointlist.c:312 +msgid "Copy Data (with _positions)" +msgstr "" + +#: ../src/viktrwlayer_waypointlist.c:633 +msgid "Comment" +msgstr "" + +#: ../src/viktrwlayer_waypointlist.c:643 +msgid "Symbol" +msgstr "" + +#: ../src/viktrwlayer_wpwin.c:93 ../src/viktrwlayer_wpwin.c:302 +msgid "True" +msgstr "" + +#: ../src/viktrwlayer_wpwin.c:122 +msgid "Waypoint Properties" +msgstr "" + +#: ../src/viktrwlayer_wpwin.c:164 +msgid "Name:" +msgstr "Όνομα:" + +#: ../src/viktrwlayer_wpwin.c:181 +msgid "Altitude:" +msgstr "Υψόμετρο:" + +#: ../src/viktrwlayer_wpwin.c:186 ../src/viktrwlayer_wpwin.c:188 +msgid "Comment:" +msgstr "Σχόλιο:" + +#: ../src/viktrwlayer_wpwin.c:202 +msgid "Source:" +msgstr "" + +#: ../src/viktrwlayer_wpwin.c:212 +msgid "Image:" +msgstr "Εικόνα:" + +#: ../src/viktrwlayer_wpwin.c:217 +msgid "Symbol:" +msgstr "Σύμβολο:" + +#: ../src/viktrwlayer_wpwin.c:226 +msgid "(none)" +msgstr "(κανένα)" + +#. Geotag Info [readonly] +#: ../src/viktrwlayer_wpwin.c:272 +msgid "Has Geotag" +msgstr "" + +#: ../src/viktrwlayer_wpwin.c:279 +msgid "Consistent Position" +msgstr "" + +#. ATM the direction value box is always shown, even when there is no information. +#. It would be nice to be able to hide it until the 'Add' has been performed, +#. however I've not been able to achieve this. +#. Thus simply sensistizing it instead. +#: ../src/viktrwlayer_wpwin.c:292 +#, fuzzy +msgid "Image Direction:" +msgstr "Ρυθμίσεις εικόνας" + +#: ../src/viktrwlayer_wpwin.c:300 +msgid "Magnetic" +msgstr "" + +#: ../src/viktrwlayer_wpwin.c:320 +msgid "Time:" +msgstr "" + +#. TODO: other checks (isalpha or whatever ) +#: ../src/viktrwlayer_wpwin.c:386 +msgid "Please enter a name for the waypoint." +msgstr "" + +#: ../src/viktrwlayer_geotag.c:320 ../src/viktrwlayer_geotag.c:460 +#, c-format +msgid "Failed updating EXIF on %s" +msgstr "" + +#: ../src/viktrwlayer_geotag.c:562 +#, c-format +msgid "Geotagging %d Images..." +msgstr "" + +#: ../src/viktrwlayer_geotag.c:630 +msgid "Geotag Images" +msgstr "" + +#: ../src/viktrwlayer_geotag.c:640 +msgid "Images" +msgstr "" + +#: ../src/viktrwlayer_geotag.c:645 +msgid "Overwrite Existing Waypoints:" +msgstr "" + +#: ../src/viktrwlayer_geotag.c:648 +msgid "Overwrite Existing GPS Information:" +msgstr "" + +#: ../src/viktrwlayer_geotag.c:650 +msgid "Keep File Modification Timestamp:" +msgstr "" + +#: ../src/viktrwlayer_geotag.c:684 +msgid "Create Waypoints:" +msgstr "" + +#: ../src/viktrwlayer_geotag.c:693 +msgid "Write EXIF:" +msgstr "" + +#: ../src/viktrwlayer_geotag.c:705 +msgid "Automatic Image Direction:" +msgstr "" + +#: ../src/viktrwlayer_geotag.c:707 +msgid "Set image direction based on a heading derived from the track" +msgstr "" + +#: ../src/viktrwlayer_geotag.c:710 +msgid "Interpolate Between Track Segments:" +msgstr "" + +#: ../src/viktrwlayer_geotag.c:715 +msgid "Image Time Offset (Seconds):" +msgstr "" + +#: ../src/viktrwlayer_geotag.c:718 +msgid "" +"The number of seconds to ADD to the photos time to make it match the GPS " +"data. Calculate this with (GPS - Photo). Can be negative or positive. Useful " +"to adjust times when a camera's timestamp was incorrect." +msgstr "" + +#: ../src/viktrwlayer_geotag.c:721 +msgid "Image Timezone:" +msgstr "" + +#: ../src/viktrwlayer_geotag.c:724 +msgid "" +"The timezone that was used when the images were created. For example, if a " +"camera is set to AWST or +8:00 hours. Enter +8:00 here so that the correct " +"adjustment to the images' time can be made. GPS data is always in UTC." +msgstr "" + +#: ../src/viktrwlayer_geotag.c:728 +#, c-format +msgid "Using waypoint: %s" +msgstr "" + +#: ../src/viktrwlayer_geotag.c:742 +#, c-format +msgid "Using track: %s" +msgstr "" + +#: ../src/viktrwlayer_geotag.c:744 +#, c-format +msgid "Using all tracks in: %s" +msgstr "" + +#: ../src/viktrwlayer_analysis.c:214 +msgid "Number of Tracks" +msgstr "" + +#: ../src/viktrwlayer_analysis.c:215 +msgid "Date Range" +msgstr "" + +#: ../src/viktrwlayer_analysis.c:216 +msgid "Total Length" +msgstr "" + +#: ../src/viktrwlayer_analysis.c:217 +msgid "Average Length" +msgstr "" + +#: ../src/viktrwlayer_analysis.c:218 +msgid "Eddington number" +msgstr "" + +#. No.4: Extended display only +#: ../src/viktrwlayer_analysis.c:219 +msgid "Max Speed" +msgstr "" + +#: ../src/viktrwlayer_analysis.c:220 +msgid "Avg. Speed" +msgstr "" + +#: ../src/viktrwlayer_analysis.c:221 +msgid "Minimum Altitude" +msgstr "" + +#: ../src/viktrwlayer_analysis.c:222 +msgid "Maximum Altitude" +msgstr "" + +#: ../src/viktrwlayer_analysis.c:223 +msgid "Total Elevation Gain/Loss" +msgstr "" + +#: ../src/viktrwlayer_analysis.c:224 +msgid "Avg. Elevation Gain/Loss" +msgstr "" + +#: ../src/viktrwlayer_analysis.c:225 +msgid "Total Duration" +msgstr "" + +#: ../src/viktrwlayer_analysis.c:226 +msgid "Avg. Duration" +msgstr "" + +#: ../src/viktrwlayer_analysis.c:317 +#, c-format +msgid "%.2f miles" +msgstr "" + +#: ../src/viktrwlayer_analysis.c:320 +#, c-format +msgid "%.2f NM" +msgstr "" + +#. VIK_UNITS_DISTANCE_KILOMETRES +#: ../src/viktrwlayer_analysis.c:324 +#, c-format +msgid "%.2f km" +msgstr "" + +#: ../src/viktrwlayer_analysis.c:361 +#, c-format +msgid "%.2f m/s" +msgstr "" + +#: ../src/viktrwlayer_analysis.c:370 ../src/viktrwlayer_analysis.c:373 +#, c-format +msgid "%.2f knots" +msgstr "" + +#: ../src/viktrwlayer_analysis.c:379 ../src/viktrwlayer_analysis.c:382 +#, c-format +msgid "%d s/km" +msgstr "" + +#: ../src/viktrwlayer_analysis.c:399 ../src/viktrwlayer_analysis.c:402 +#, c-format +msgid "%d sec/mi" +msgstr "" + +#: ../src/viktrwlayer_analysis.c:420 ../src/viktrwlayer_analysis.c:423 +#, c-format +msgid "%.2f km/h" +msgstr "" + +#: ../src/viktrwlayer_analysis.c:434 ../src/viktrwlayer_analysis.c:440 +#, c-format +msgid "%d feet" +msgstr "" + +#: ../src/viktrwlayer_analysis.c:445 ../src/viktrwlayer_analysis.c:447 +#, c-format +msgid "%d feet / %d feet" +msgstr "" + +#: ../src/viktrwlayer_analysis.c:452 ../src/viktrwlayer_analysis.c:458 +#, c-format +msgid "%d m" +msgstr "" + +#: ../src/viktrwlayer_analysis.c:463 ../src/viktrwlayer_analysis.c:465 +#, c-format +msgid "%d m / %d m" +msgstr "" + +#: ../src/viktrwlayer_analysis.c:477 +#, c-format +msgid "%d:%02d:%02d days:hrs:mins" +msgstr "" + +#: ../src/viktrwlayer_analysis.c:484 +#, c-format +msgid "%d:%02d hrs:mins" +msgstr "" + +#: ../src/viktrwlayer_analysis.c:658 +msgid "Include Invisible Items" +msgstr "" + +#: ../src/vikstatus.c:129 +msgid "Current number of background tasks. Click to see the background jobs." +msgstr "" + +#: ../src/vikstatus.c:134 +msgid "Current zoom level. Click to select a new one." +msgstr "" + +#: ../src/vikstatus.c:141 +msgid "Left click to clear the message. Right click to copy the message." +msgstr "" + +#: ../src/vikutils.c:108 +msgid "GPSD" +msgstr "" + +#. GPS Preamble +#: ../src/vikutils.c:109 +msgid "Trkpt" +msgstr "" + +#: ../src/vikutils.c:160 +#, c-format +msgid "%sSpeed%s %.1f%s" +msgstr "" + +#. Go for 2dp as expect low values for vertical speeds +#: ../src/vikutils.c:214 +#, c-format +msgid "%sClimb%s %.2f%s" +msgstr "" + +#: ../src/vikutils.c:223 +#, c-format +msgid "%sAlt %dfeet" +msgstr "" + +#. VIK_UNITS_HEIGHT_METRES: +#: ../src/vikutils.c:227 +#, c-format +msgid "%sAlt %dm" +msgstr "" + +#: ../src/vikutils.c:235 +#, c-format +msgid "%sCourse %03d°" +msgstr "" + +#: ../src/vikutils.c:249 +msgid "yards" +msgstr "" + +#. VIK_UNITS_DISTANCE_KILOMETRES: +#: ../src/vikutils.c:253 +msgid "m" +msgstr "" + +#: ../src/vikutils.c:257 +#, c-format +msgid "%sDistance diff %d%s" +msgstr "" + +#: ../src/vikutils.c:272 +#, c-format +msgid "%sTime %s" +msgstr "" + +#: ../src/vikutils.c:281 +#, c-format +msgid "%sTime diff %lds" +msgstr "" + +#: ../src/vikutils.c:287 +#, c-format +msgid "%sNo. of Sats %d" +msgstr "" + +#: ../src/vikutils.c:312 +#, c-format +msgid "%sTo End %.2f%s" +msgstr "" + +#: ../src/vikutils.c:339 +#, c-format +msgid "%sDistance along %.2f%s" +msgstr "" + +#: ../src/vikutils.c:359 +#, c-format +msgid "%sTrack: %s" +msgstr "" + +#: ../src/vikutils.c:396 +#, c-format +msgid "" +"There is a newer version of Viking available: %s\n" +"\n" +"Do you wish to go to Viking's website now?" +msgstr "" + +#: ../src/vikutils.c:526 +msgid "" +"This appears to be Viking's very first run.\n" +"\n" +"Do you wish to enable automatic internet features?\n" +"\n" +"Individual settings can be controlled in the Preferences." +msgstr "" + +#: ../src/vikwaypoint.c:37 +msgid "Waypoint" +msgstr "" + +#: ../src/vikwebtool_datasource.c:352 +msgid "Search Term" +msgstr "" + +#. TODO get rid of this as this is unnecessary duplication... +#: ../src/vikwindow.c:258 +msgid "Pan" +msgstr "" + +#: ../src/vikwindow.c:258 +msgid "Zoom" +msgstr "Εστίαση" + +#: ../src/vikwindow.c:258 +msgid "Ruler" +msgstr "Χάρακας" + +#: ../src/vikwindow.c:258 +msgid "Select" +msgstr "" + +#: ../src/vikwindow.c:368 +msgid "This is Viking " +msgstr "" + +#: ../src/vikwindow.c:457 +msgid "Location lookup aborted" +msgstr "" + +#: ../src/vikwindow.c:477 +#, c-format +msgid "Location found: %s" +msgstr "" + +#: ../src/vikwindow.c:486 +msgid "Unable to determine location" +msgstr "" + +#: ../src/vikwindow.c:495 +msgid "Determining location" +msgstr "" + +#: ../src/vikwindow.c:525 +#, c-format +msgid "Location found via geoclue" +msgstr "" + +#: ../src/vikwindow.c:546 +msgid "Default Map" +msgstr "" + +#: ../src/vikwindow.c:557 ../src/vikwindow.c:3938 +msgid "Trying to determine location..." +msgstr "" + +#. Create tooltip +#: ../src/vikwindow.c:723 +msgid "Select zoom level" +msgstr "" + +#: ../src/vikwindow.c:1176 +#, c-format +msgid "" +"Do you want to save the changes you made to the document \"%s\"?\n" +"\n" +"Your changes will be lost if you don't save them." +msgstr "" + +#: ../src/vikwindow.c:1180 +msgid "Don't Save" +msgstr "Να μη γίνει αποθήκευση" + +#: ../src/vikwindow.c:1268 +msgid "mpp" +msgstr "" + +#: ../src/vikwindow.c:1268 +msgid "pixelfact" +msgstr "" + +#: ../src/vikwindow.c:1467 +#, c-format +msgid "%s %s %dm" +msgstr "" + +#: ../src/vikwindow.c:1469 +#, c-format +msgid "%s %s %dft" +msgstr "" + +#: ../src/vikwindow.c:1472 +#, c-format +msgid "%s %s" +msgstr "" + +#: ../src/vikwindow.c:1929 +msgid "_Ruler" +msgstr "" + +#: ../src/vikwindow.c:1929 +msgid "Ruler Tool" +msgstr "" + +#: ../src/vikwindow.c:2204 ../src/vikwindow.c:4818 +msgid "_Zoom" +msgstr "_Εστίαση" + +#: ../src/vikwindow.c:2204 +msgid "Zoom Tool" +msgstr "Εργαλείο Εστίασης" + +#: ../src/vikwindow.c:2271 ../src/vikwindow.c:4819 +msgid "_Pan" +msgstr "" + +#: ../src/vikwindow.c:2271 +msgid "Pan Tool" +msgstr "" + +#: ../src/vikwindow.c:2425 +msgid "_Select" +msgstr "" + +#: ../src/vikwindow.c:2425 +msgid "Select Tool" +msgstr "" + +#: ../src/vikwindow.c:2615 +msgid "You must select a layer to show its properties." +msgstr "" + +#. No error to show, so unlikely this will get called +#: ../src/vikwindow.c:2629 +msgid "The help system is not available." +msgstr "" + +#. Main error path +#: ../src/vikwindow.c:2632 +#, c-format +msgid "" +"Help is not available because: %s.\n" +"Ensure a Mime Type ghelp handler program is installed (e.g. yelp)." +msgstr "" + +#: ../src/vikwindow.c:2865 +msgid "You must select a layer to delete." +msgstr "" + +#: ../src/vikwindow.c:3171 +msgid "Untitled" +msgstr "Ανώνυμο" + +#: ../src/vikwindow.c:3300 +#, c-format +msgid "Unable to add '%s' to the list of recently used documents" +msgstr "" + +#: ../src/vikwindow.c:3391 +msgid "The file you requested could not be opened." +msgstr "" + +#: ../src/vikwindow.c:3394 +msgid "" +"GPSBabel is required to load files of this type or GPSBabel encountered " +"problems." +msgstr "" + +#: ../src/vikwindow.c:3397 +#, c-format +msgid "Unable to load malformed GPX file %s" +msgstr "" + +#: ../src/vikwindow.c:3400 +#, c-format +msgid "Unsupported file type for %s" +msgstr "" + +#. Since we can process .vik files with issues just show a warning in the status bar +#. Not that a user can do much about it... or tells them what this issue is yet... +#: ../src/vikwindow.c:3406 +#, c-format +msgid "WARNING: issues encountered loading %s" +msgstr "" + +#: ../src/vikwindow.c:3489 +msgid "Please select a GPS data file to open. " +msgstr "" + +#: ../src/vikwindow.c:3508 +msgid "Google Earth" +msgstr "" + +#: ../src/vikwindow.c:3523 ../src/vikwindow.c:3646 ../src/viking.desktop.in.h:1 +msgid "Viking" +msgstr "" + +#: ../src/vikwindow.c:3594 ../src/vikwindow.c:4632 +msgid "Open File" +msgstr "" + +#: ../src/vikwindow.c:3630 +msgid "Save as Viking File." +msgstr "" + +#: ../src/vikwindow.c:3757 +#, c-format +msgid "Exporting to file: %s" +msgstr "" + +#. Confirm what happened. +#: ../src/vikwindow.c:3774 +#, c-format +msgid "Exported files: %d" +msgstr "" + +#: ../src/vikwindow.c:3786 +msgid "Nothing to Export!" +msgstr "" + +#: ../src/vikwindow.c:3790 +msgid "Export to directory" +msgstr "" + +#: ../src/vikwindow.c:3809 +msgid "Could not convert all files" +msgstr "" + +#: ../src/vikwindow.c:3851 +msgid "File not accessible" +msgstr "" + +#: ../src/vikwindow.c:3854 +msgid "No Viking File" +msgstr "" + +#: ../src/vikwindow.c:3998 +msgid "This layer has no configurable properties." +msgstr "" + +#: ../src/vikwindow.c:4080 +msgid "Are you sure you wish to delete all layers?" +msgstr "" + +#. Try harder... +#: ../src/vikwindow.c:4126 ../src/vikwindow.c:4132 +msgid "Generating image file..." +msgstr "" + +#: ../src/vikwindow.c:4154 +msgid "" +"Failed to generate internal image.\n" +"\n" +"Try creating a smaller image." +msgstr "" + +#: ../src/vikwindow.c:4175 +msgid "Image file generated." +msgstr "" + +#: ../src/vikwindow.c:4177 +msgid "Failed to generate image file." +msgstr "" + +#: ../src/vikwindow.c:4246 +#, c-format +msgid "Unable to write to file %s: %s" +msgstr "" + +#: ../src/vikwindow.c:4284 +msgid "" +"Viewable region outside allowable pixel size bounds for image. Clipping " +"width/height values." +msgstr "" + +#: ../src/vikwindow.c:4309 +#, c-format +msgid "Total area: %ldm x %ldm (%.3f sq. km)" +msgstr "" + +#: ../src/vikwindow.c:4312 +#, c-format +msgid "Total area: %ldm x %ldm (%.3f sq. miles)" +msgstr "" + +#: ../src/vikwindow.c:4315 +#, c-format +msgid "Total area: %ldm x %ldm (%.3f sq. NM)" +msgstr "" + +#. Single file +#: ../src/vikwindow.c:4343 +msgid "Save Image" +msgstr "Αποθήκευση Εικόνας" + +#: ../src/vikwindow.c:4364 ../src/vikwindow.c:4641 +msgid "KMZ" +msgstr "" + +#: ../src/vikwindow.c:4417 +msgid "You must be in UTM mode to use this feature" +msgstr "" + +#: ../src/vikwindow.c:4421 +msgid "Choose a directory to hold images" +msgstr "" + +#. todo: default for answers inside VikWindow or static (thruout instance) +#: ../src/vikwindow.c:4441 +msgid "Save to Image File" +msgstr "" + +#: ../src/vikwindow.c:4457 +msgid "Width (pixels):" +msgstr "Πλάτος (εικονοστοιχεία):" + +#: ../src/vikwindow.c:4459 +msgid "Height (pixels):" +msgstr "Ύψος (εικονοστοιχεία):" + +#: ../src/vikwindow.c:4462 +msgid "" +"WARNING: USING LARGE IMAGES OVER 10000x10000\n" +"MAY CRASH THE PROGRAM!" +msgstr "" + +#: ../src/vikwindow.c:4464 +msgid "Zoom (meters per pixel):" +msgstr "" + +#: ../src/vikwindow.c:4480 +msgid "Area in current viewable window" +msgstr "" + +#: ../src/vikwindow.c:4490 +msgid "Save as PNG" +msgstr "Αποθήκευση ως PNG" + +#: ../src/vikwindow.c:4491 +msgid "Save as JPEG" +msgstr "Αποθήκευση ως JPEG" + +#: ../src/vikwindow.c:4520 +msgid "East-west image tiles:" +msgstr "" + +#: ../src/vikwindow.c:4522 +msgid "North-south image tiles:" +msgstr "" + +#: ../src/vikwindow.c:4619 +msgid "This feature is not available in UTM mode" +msgstr "" + +#: ../src/vikwindow.c:4658 +#, c-format +msgid "Unable to import %s." +msgstr "" + +#: ../src/vikwindow.c:4749 +msgid "Choose a background color" +msgstr "" + +#: ../src/vikwindow.c:4765 +msgid "Choose a track highlight color" +msgstr "" + +#: ../src/vikwindow.c:4814 +msgid "_File" +msgstr "_Αρχείο" + +#: ../src/vikwindow.c:4815 +msgid "_Edit" +msgstr "Επε_ξεργασία" + +#: ../src/vikwindow.c:4817 +msgid "_Show" +msgstr "" + +#: ../src/vikwindow.c:4820 +msgid "_Layers" +msgstr "Ε_πίπεδα" + +#: ../src/vikwindow.c:4821 +msgid "_Tools" +msgstr "Εργα_λεία" + +#: ../src/vikwindow.c:4822 +msgid "_Webtools" +msgstr "" + +#: ../src/vikwindow.c:4823 ../src/vikwindow.c:4893 +msgid "_Help" +msgstr "Βο_ηθεια" + +#: ../src/vikwindow.c:4825 +msgid "New file" +msgstr "Νέο αρχείο" + +#: ../src/vikwindow.c:4826 +msgid "_Open..." +msgstr "Άν_οιγμα..." + +#: ../src/vikwindow.c:4826 +msgid "Open a file" +msgstr "Άνοιγμα αρχείου" + +#: ../src/vikwindow.c:4827 +msgid "Open _Recent File" +msgstr "" + +#: ../src/vikwindow.c:4828 +msgid "Append _File..." +msgstr "" + +#: ../src/vikwindow.c:4828 +msgid "Append data from a different file" +msgstr "" + +#: ../src/vikwindow.c:4829 +msgid "Open GPX as External _Layer..." +msgstr "" + +#: ../src/vikwindow.c:4829 +msgid "Open a GPX file as an external layer" +msgstr "" + +#: ../src/vikwindow.c:4830 +msgid "_Export All" +msgstr "" + +#: ../src/vikwindow.c:4830 +msgid "Export All TrackWaypoint Layers" +msgstr "" + +#: ../src/vikwindow.c:4831 +msgid "_GPX..." +msgstr "" + +#: ../src/vikwindow.c:4831 +msgid "Export as GPX" +msgstr "" + +#: ../src/vikwindow.c:4832 +msgid "A_cquire" +msgstr "" + +#: ../src/vikwindow.c:4833 +msgid "_Directions..." +msgstr "" + +#: ../src/vikwindow.c:4833 +msgid "Get driving directions" +msgstr "" + +#: ../src/vikwindow.c:4835 +msgid "_OSM Traces..." +msgstr "" + +#: ../src/vikwindow.c:4835 +msgid "Get traces from OpenStreetMap" +msgstr "" + +#: ../src/vikwindow.c:4836 +msgid "_My OSM Traces..." +msgstr "" + +#: ../src/vikwindow.c:4836 +msgid "Get Your Own Traces from OpenStreetMap" +msgstr "" + +#: ../src/vikwindow.c:4839 +msgid "Geo_caches..." +msgstr "" + +#: ../src/vikwindow.c:4839 +msgid "Get Geocaches from geocaching.com" +msgstr "" + +#: ../src/vikwindow.c:4842 +msgid "Create waypoints from geotagged images" +msgstr "" + +#: ../src/vikwindow.c:4844 +msgid "Get a file from a URL" +msgstr "" + +#: ../src/vikwindow.c:4846 +msgid "Create waypoints from Wikipedia items in the current view" +msgstr "" + +#: ../src/vikwindow.c:4848 +msgid "_Save" +msgstr "Αποθή_κευση" + +#: ../src/vikwindow.c:4848 +msgid "Save the file" +msgstr "" + +#: ../src/vikwindow.c:4849 +msgid "Save _As..." +msgstr "Αποθήκευση _Ως..." + +#: ../src/vikwindow.c:4849 +msgid "Save the file under different name" +msgstr "" + +#: ../src/vikwindow.c:4850 +msgid "Properties..." +msgstr "" + +#: ../src/vikwindow.c:4850 +msgid "File Properties" +msgstr "" + +#: ../src/vikwindow.c:4852 +msgid "Import KMZ _Map File..." +msgstr "" + +#: ../src/vikwindow.c:4852 +msgid "Import a KMZ file" +msgstr "" + +#: ../src/vikwindow.c:4853 +msgid "Generate _KMZ Map File..." +msgstr "" + +#: ../src/vikwindow.c:4853 +msgid "Generate a KMZ file with an overlay of the current view" +msgstr "" + +#: ../src/vikwindow.c:4855 +msgid "_Generate Image File..." +msgstr "" + +#: ../src/vikwindow.c:4855 +msgid "Save a snapshot of the workspace into a file" +msgstr "" + +#: ../src/vikwindow.c:4856 +msgid "Generate _Directory of Images..." +msgstr "" + +#: ../src/vikwindow.c:4856 +msgid "Generate _Directory of Images" +msgstr "" + +#: ../src/vikwindow.c:4857 +msgid "_Print..." +msgstr "_Εκτύπωση..." + +#: ../src/vikwindow.c:4857 +msgid "Print maps" +msgstr "" + +#: ../src/vikwindow.c:4858 +msgid "E_xit" +msgstr "Έ_ξοδος" + +#: ../src/vikwindow.c:4858 +msgid "Exit the program" +msgstr "Έξοδος από το πρόγραμμα" + +#: ../src/vikwindow.c:4859 +msgid "Save and Exit" +msgstr "Αποθήκευση και Έξοδος" + +#: ../src/vikwindow.c:4859 +msgid "Save and Exit the program" +msgstr "" + +#: ../src/vikwindow.c:4861 +msgid "Go to the Pre_vious Location" +msgstr "" + +#: ../src/vikwindow.c:4861 +msgid "Go to the previous location" +msgstr "" + +#: ../src/vikwindow.c:4862 +msgid "Go to the _Next Location" +msgstr "" + +#: ../src/vikwindow.c:4862 +msgid "Go to the next location" +msgstr "" + +#: ../src/vikwindow.c:4863 +msgid "Go to the _Default Location" +msgstr "" + +#: ../src/vikwindow.c:4863 +msgid "Go to the default location" +msgstr "" + +#: ../src/vikwindow.c:4864 +msgid "Go to the _Auto Location" +msgstr "" + +#: ../src/vikwindow.c:4864 +msgid "Go to a location via automatic lookup" +msgstr "" + +#: ../src/vikwindow.c:4865 +msgid "Go to _Location..." +msgstr "" + +#: ../src/vikwindow.c:4865 +msgid "Go to address/place using text search" +msgstr "" + +#: ../src/vikwindow.c:4866 +msgid "_Go to Lat/Lon..." +msgstr "" + +#: ../src/vikwindow.c:4866 +msgid "Go to arbitrary lat/lon coordinate" +msgstr "" + +#: ../src/vikwindow.c:4867 +msgid "Go to UTM..." +msgstr "" + +#: ../src/vikwindow.c:4867 +msgid "Go to arbitrary UTM coordinate" +msgstr "" + +#: ../src/vikwindow.c:4868 +msgid "Go to Today" +msgstr "" + +#: ../src/vikwindow.c:4868 +msgid "Go to today on the calendar" +msgstr "" + +#: ../src/vikwindow.c:4869 +msgid "_Refresh" +msgstr "" + +#: ../src/vikwindow.c:4869 +msgid "Refresh any maps displayed" +msgstr "" + +#: ../src/vikwindow.c:4870 +msgid "Set _Highlight Color..." +msgstr "" + +#: ../src/vikwindow.c:4870 +msgid "Set Highlight Color" +msgstr "" + +#: ../src/vikwindow.c:4871 +msgid "Set Bac_kground Color..." +msgstr "" + +#: ../src/vikwindow.c:4871 +msgid "Set Background Color" +msgstr "" + +#: ../src/vikwindow.c:4872 +msgid "Zoom _In" +msgstr "Μεγέ_θυνση" + +#: ../src/vikwindow.c:4872 +msgid "Zoom In" +msgstr "" + +#: ../src/vikwindow.c:4873 +msgid "Zoom _Out" +msgstr "Σ_μίκρυνση" + +#: ../src/vikwindow.c:4873 +msgid "Zoom Out" +msgstr "" + +#: ../src/vikwindow.c:4874 +msgid "Zoom _To..." +msgstr "" + +#: ../src/vikwindow.c:4874 +msgid "Zoom To" +msgstr "" + +#: ../src/vikwindow.c:4875 +msgid "Pan _North" +msgstr "" + +#: ../src/vikwindow.c:4876 +msgid "Pan _East" +msgstr "" + +#: ../src/vikwindow.c:4877 +msgid "Pan _South" +msgstr "" + +#: ../src/vikwindow.c:4878 +msgid "Pan _West" +msgstr "" + +#: ../src/vikwindow.c:4879 +msgid "Background _Jobs" +msgstr "" + +#: ../src/vikwindow.c:4879 +msgid "Background Jobs" +msgstr "" + +#: ../src/vikwindow.c:4881 +msgid "Cu_t" +msgstr "Απ_οκοπή" + +#: ../src/vikwindow.c:4885 +msgid "Delete All" +msgstr "Διαγραφή όλων" + +#: ../src/vikwindow.c:4886 +msgid "Copy Centre _Location" +msgstr "" + +#: ../src/vikwindow.c:4887 +msgid "_Flush Map Cache" +msgstr "" + +#: ../src/vikwindow.c:4888 +msgid "_Set the Default Location" +msgstr "" + +#: ../src/vikwindow.c:4888 +msgid "Set the Default Location to the current position" +msgstr "" + +#: ../src/vikwindow.c:4889 +msgid "_Preferences" +msgstr "" + +#: ../src/vikwindow.c:4889 +msgid "Program Preferences" +msgstr "" + +#: ../src/vikwindow.c:4890 +msgid "_Layer Defaults" +msgstr "" + +#: ../src/vikwindow.c:4891 +msgid "_Properties" +msgstr "_Ιδιότητες" + +#: ../src/vikwindow.c:4893 +msgid "Help" +msgstr "" + +#: ../src/vikwindow.c:4894 +msgid "_About" +msgstr "_Περί" + +#: ../src/vikwindow.c:4894 +msgid "About" +msgstr "" + +#: ../src/vikwindow.c:4903 +msgid "_KML..." +msgstr "" + +#: ../src/vikwindow.c:4903 +msgid "Export as KML" +msgstr "" + +#: ../src/vikwindow.c:4904 +msgid "Transfer data from a GPS device" +msgstr "" + +#: ../src/vikwindow.c:4905 +msgid "Import file via GPSBabel converter" +msgstr "" + +#: ../src/vikwindow.c:4909 +msgid "Import Geo_JSON File..." +msgstr "" + +#: ../src/vikwindow.c:4909 +msgid "Import GeoJSON file" +msgstr "" + +#: ../src/vikwindow.c:4914 +msgid "_UTM Mode" +msgstr "" + +#: ../src/vikwindow.c:4915 +msgid "_Expedia Mode" +msgstr "" + +#: ../src/vikwindow.c:4916 +msgid "_Mercator Mode" +msgstr "" + +#: ../src/vikwindow.c:4917 +msgid "Lat_/Lon Mode" +msgstr "" + +#: ../src/vikwindow.c:4921 +msgid "Show _Scale" +msgstr "" + +#: ../src/vikwindow.c:4921 +msgid "Show Scale" +msgstr "" + +#: ../src/vikwindow.c:4922 +msgid "Show _Center Mark" +msgstr "" + +#: ../src/vikwindow.c:4922 +msgid "Show Center Mark" +msgstr "" + +#: ../src/vikwindow.c:4923 +msgid "Show _Highlight" +msgstr "" + +#: ../src/vikwindow.c:4923 +msgid "Show Highlight" +msgstr "" + +#: ../src/vikwindow.c:4924 +msgid "_Full Screen" +msgstr "" + +#: ../src/vikwindow.c:4924 +msgid "Activate full screen mode" +msgstr "" + +#: ../src/vikwindow.c:4925 +msgid "Show Side _Panel" +msgstr "" + +#: ../src/vikwindow.c:4925 +msgid "Show Side Panel" +msgstr "" + +#: ../src/vikwindow.c:4926 +msgid "Show Status_bar" +msgstr "" + +#: ../src/vikwindow.c:4926 +msgid "Show Statusbar" +msgstr "" + +#: ../src/vikwindow.c:4927 +msgid "Show _Toolbar" +msgstr "" + +#: ../src/vikwindow.c:4927 +msgid "Show Toolbar" +msgstr "" + +#: ../src/vikwindow.c:4928 +msgid "Show _Menu" +msgstr "" + +#: ../src/vikwindow.c:4928 +msgid "Show Menu" +msgstr "" + +#: ../src/vikwindow.c:4929 +msgid "Show Side Panel B_uttons" +msgstr "" + +#: ../src/vikwindow.c:4929 +msgid "Show Side Panel Buttons" +msgstr "" + +#: ../src/vikwindow.c:4930 +msgid "Show Side Panel Ca_lendar" +msgstr "" + +#: ../src/vikwindow.c:4930 +msgid "Show Side Panel Calendar" +msgstr "" + +#: ../src/vikwindow.c:5064 +#, c-format +msgid "New _%s Layer" +msgstr "" + +#: ../src/vikwindow.c:5114 +#, fuzzy +msgid "..." +msgstr "Προσθήκη..." + +#: ../src/viking.desktop.in.h:2 +msgid "GPS Data Manager" +msgstr "" + +#: ../src/viking.desktop.in.h:3 +msgid "Map Based GPS Data Manager (live data capable)." +msgstr "" + +#: ../src/libjpeg/jpeg-data.c:205 +msgid "Data does not follow JPEG specification." +msgstr "" + +#: ../src/libjpeg/jpeg-data.c:302 +#, c-format +msgid "Path '%s' invalid." +msgstr "" + +#: ../src/libjpeg/jpeg-data.c:320 +#, c-format +msgid "Could not read '%s'." +msgstr "" + +#~ msgid "Create Track" +#~ msgstr "Δημιουργία Κομματιού" diff --git a/po/en_GB.po b/po/en_GB.po new file mode 100644 index 0000000..e386e17 --- /dev/null +++ b/po/en_GB.po @@ -0,0 +1,6074 @@ +# English (United Kingdom) translation for viking +# Copyright (c) 2009 Rosetta Contributors and Canonical Ltd 2009 +# This file is distributed under the same license as the viking package. +# FIRST AUTHOR , 2009. +# +msgid "" +msgstr "" +"Project-Id-Version: viking\n" +"Report-Msgid-Bugs-To: \n" +"POT-Creation-Date: 2019-01-19 12:53+0000\n" +"PO-Revision-Date: 2014-09-11 21:49+0000\n" +"Last-Translator: Rob Norris \n" +"Language-Team: English (United Kingdom) \n" +"Language: \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-Launchpad-Export-Date: 2018-12-21 17:32+0000\n" +"X-Generator: Launchpad (build 18847)\n" + +#: ../src/acquire.c:106 ../src/vikgpslayer.c:1367 +msgid "Done." +msgstr "Done." + +#: ../src/acquire.c:115 +msgid "No data." +msgstr "" + +#: ../src/acquire.c:167 ../src/acquire.c:415 +msgid "Error: acquisition failed." +msgstr "Error: acquisition failed." + +#: ../src/acquire.c:339 +msgid "Working..." +msgstr "Working…" + +#. This shouldn't happen... +#: ../src/acquire.c:406 +msgid "" +"Unable to create command\n" +"Acquire method failed." +msgstr "" + +#: ../src/acquire.c:513 +msgid "_Filter" +msgstr "" + +#: ../src/acquire.c:528 +#, c-format +msgid "Filter with %s" +msgstr "" + +#: ../src/acquire.c:545 +msgid "Filter" +msgstr "" + +#: ../src/babel.c:640 +msgid "GPSBabel:" +msgstr "" + +#: ../src/babel.c:641 +msgid "" +"Allow setting the specific instance of GPSBabel. You must restart Viking for " +"this value to take effect." +msgstr "" + +#: ../src/babel_ui.c:79 +msgid "Select a file format" +msgstr "" + +#: ../src/babel_ui.c:144 ../src/viktrwlayer.c:531 ../src/viktrwlayer.c:2882 +msgid "Tracks" +msgstr "" + +#: ../src/babel_ui.c:149 ../src/viktrwlayer.c:2892 +msgid "Routes" +msgstr "" + +#. ***** PARAMETERS ***** +#: ../src/babel_ui.c:154 ../src/viktrwlayer.c:531 ../src/viktrwlayer.c:2887 +msgid "Waypoints" +msgstr "" + +#: ../src/background.c:64 +#, c-format +msgid "%d items" +msgstr "%d items" + +#: ../src/background.c:287 +msgid "Threads:" +msgstr "" + +#: ../src/background.c:288 +msgid "" +"Number of threads to use for Mapnik tasks. You need to restart Viking for a " +"change to this value to be used" +msgstr "" + +#: ../src/background.c:361 +msgid "Job" +msgstr "Job" + +#: ../src/background.c:365 +msgid "Progress" +msgstr "Progress" + +#: ../src/background.c:373 +msgid "Viking Background Jobs" +msgstr "Viking Background Jobs" + +#: ../src/bing.c:42 +msgid "Bing Aerial" +msgstr "" + +#: ../src/bing.c:48 +msgid "Bing" +msgstr "" + +#. VIK_GTK_WINDOW_FROM_WIDGET(vp) +#: ../src/bingmapsource.c:514 +msgid "Bing attribution Loading" +msgstr "" + +#: ../src/clipboard.c:95 +msgid "paste failed" +msgstr "paste failed" + +#: ../src/clipboard.c:105 +msgid "wrong clipboard data size" +msgstr "wrong clipboard data size" + +#: ../src/clipboard.c:124 +#, c-format +msgid "" +"The clipboard contains sublayer data for %s layers. You must select a layer " +"of this type to paste the clipboard data." +msgstr "" + +#: ../src/clipboard.c:264 +msgid "" +"In order to paste a waypoint, please select an appropriate layer to paste " +"into." +msgstr "" + +#: ../src/dialog.c:60 +msgid "Go to Lat/Lon" +msgstr "" + +#: ../src/dialog.c:69 ../src/viktrwlayer_wpwin.c:173 +msgid "Latitude:" +msgstr "" + +#: ../src/dialog.c:72 ../src/viktrwlayer_wpwin.c:177 +msgid "Longitude:" +msgstr "" + +#: ../src/dialog.c:102 +msgid "Go to UTM" +msgstr "" + +#: ../src/dialog.c:114 +msgid "Northing:" +msgstr "" + +#: ../src/dialog.c:117 +msgid "Easting:" +msgstr "" + +#: ../src/dialog.c:121 ../src/vikgeoreflayer.c:902 +msgid "Zone:" +msgstr "" + +#: ../src/dialog.c:124 ../src/vikgeoreflayer.c:904 +msgid "Letter:" +msgstr "" + +#: ../src/dialog.c:246 ../src/geonamessearch.c:238 +#: ../src/datasource_osm_my_traces.c:505 +msgid "Nothing was selected" +msgstr "" + +#: ../src/dialog.c:254 +msgid "Add Route" +msgstr "" + +#: ../src/dialog.c:254 +msgid "Add Track" +msgstr "" + +#: ../src/dialog.c:262 +msgid "Route Name:" +msgstr "" + +#: ../src/dialog.c:262 +msgid "Track Name:" +msgstr "" + +#: ../src/dialog.c:282 +msgid "Please enter a name for the track." +msgstr "" + +#: ../src/dialog.c:311 +msgid "Today" +msgstr "" + +#: ../src/dialog.c:393 +msgid "Zoom Factors..." +msgstr "" + +#: ../src/dialog.c:407 +msgid "Zoom factor (in meters per pixel):" +msgstr "" + +#: ../src/dialog.c:408 +msgid "X (easting): " +msgstr "" + +#: ../src/dialog.c:409 +msgid "Y (northing): " +msgstr "" + +#: ../src/dialog.c:414 +msgid "X and Y zoom factors must be equal" +msgstr "" + +#: ../src/dialog.c:469 +msgid "1 min" +msgstr "" + +#: ../src/dialog.c:470 +msgid "1 hour" +msgstr "" + +#: ../src/dialog.c:471 +msgid "1 day" +msgstr "" + +#: ../src/dialog.c:472 +msgid "Custom (in minutes):" +msgstr "" + +#: ../src/dialog.c:608 +#, c-format +msgid "" +"2003-2008, Evan Battaglia\n" +"2008-%s, Viking's contributors" +msgstr "" + +#: ../src/dialog.c:609 +msgid "GPS Data and Topo Analyzer, Explorer, and Manager." +msgstr "" + +#: ../src/dialog.c:610 +msgid "" +"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.\n" +"\n" +"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.\n" +"\n" +"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., 59 Temple " +"Place, Suite 330, Boston, MA 02111-1307, USA" +msgstr "" + +#: ../src/dialog.c:703 +msgid "Translation is coordinated on http://launchpad.net/viking" +msgstr "" + +#: ../src/dialog.c:713 +msgid "Download along track" +msgstr "" + +#: ../src/dialog.c:720 +msgid "Map type:" +msgstr "" + +#: ../src/dialog.c:726 +msgid "Zoom level:" +msgstr "" + +#: ../src/dialog.c:766 +#, c-format +msgid "The map data is licensed: %s." +msgstr "" + +#: ../src/dialog.c:769 +#, c-format +msgid "" +"The data provided by '%s' are licensed under the following license: " +"%s." +msgstr "" + +#: ../src/dialog.c:773 +msgid "Open license" +msgstr "" + +#: ../src/expedia.c:54 +msgid "Expedia Street Maps" +msgstr "" + +#: ../src/expedia.c:82 +msgid "Invalid expedia altitude" +msgstr "" + +#: ../src/expedia.c:113 +#, c-format +msgid "" +"Couldn't open EXPEDIA image file (right after successful download! Please " +"report and delete image file!): %s" +msgstr "" + +#: ../src/expedia.c:126 +#, c-format +msgid "" +"Couldn't save EXPEDIA image file (right after successful download! Please " +"report and delete image file!): %s" +msgstr "" + +#: ../src/geonamessearch.c:115 +msgid "Search" +msgstr "" + +#: ../src/geonamessearch.c:117 +msgid "No entries found!" +msgstr "" + +#. NB could allow columns to be shifted around by doing this after each new +#. gtk_tree_view_column_set_reorderable ( column, TRUE ); +#. However I don't think is that useful, so I haven't put it in +#: ../src/geonamessearch.c:171 ../src/datasource_osm_my_traces.c:422 +#: ../src/viktrwlayer_tracklist.c:621 ../src/viktrwlayer_waypointlist.c:618 +msgid "Name" +msgstr "" + +#: ../src/geonamessearch.c:176 +msgid "Feature" +msgstr "" + +#: ../src/geonamessearch.c:181 ../src/datasource_osm_my_traces.c:437 +msgid "Lat/Lon" +msgstr "" + +#: ../src/geonamessearch.c:264 ../src/googlesearch.c:101 ../src/vikgoto.c:430 +msgid "couldn't map temp file" +msgstr "" + +#: ../src/geonamessearch.c:459 +msgid "Select articles" +msgstr "" + +#: ../src/geonamessearch.c:459 +msgid "Select the articles you want to add." +msgstr "" + +#: ../src/geonamessearch.c:475 +msgid "city" +msgstr "" + +#: ../src/geonamessearch.c:477 +msgid "edu" +msgstr "" + +#: ../src/geonamessearch.c:479 +msgid "airport" +msgstr "" + +#: ../src/geonamessearch.c:481 +msgid "mountain" +msgstr "" + +#: ../src/geonamessearch.c:483 +msgid "forest" +msgstr "" + +#: ../src/geonamessearch.c:485 +msgid "church" +msgstr "" + +#: ../src/geojson.c:74 +#, c-format +msgid "%s command failed: %s" +msgstr "" + +#: ../src/geojson.c:146 ../src/gpx.c:1317 +#, c-format +msgid "failed to open temporary file: %s" +msgstr "" + +#: ../src/globals.c:67 +msgid "DDD" +msgstr "" + +#: ../src/globals.c:67 +msgid "DMM" +msgstr "" + +#: ../src/globals.c:67 +msgid "DMS" +msgstr "" + +#: ../src/globals.c:67 +msgid "Raw" +msgstr "" + +#: ../src/globals.c:68 +msgid "Kilometres" +msgstr "" + +#: ../src/globals.c:68 +msgid "Miles" +msgstr "" + +#: ../src/globals.c:68 +msgid "Nautical Miles" +msgstr "" + +#. VIK_UNITS_SPEED_KILOMETRES_PER_HOUR: +#: ../src/globals.c:69 ../src/viktrwlayer_tracklist.c:655 ../src/vikutils.c:100 +msgid "km/h" +msgstr "" + +#: ../src/globals.c:69 ../src/viktrwlayer_tracklist.c:656 ../src/vikutils.c:78 +msgid "mph" +msgstr "" + +#. VIK_UNITS_SPEED_METRES_PER_SECOND: +#: ../src/globals.c:69 ../src/viktrwlayer_tracklist.c:663 ../src/vikutils.c:81 +msgid "m/s" +msgstr "" + +#: ../src/globals.c:69 ../src/viktrwlayer_tracklist.c:657 ../src/vikutils.c:84 +msgid "knots" +msgstr "" + +#: ../src/globals.c:69 ../src/viktrwlayer_tracklist.c:658 ../src/vikutils.c:87 +msgid "s/km" +msgstr "" + +#: ../src/globals.c:69 ../src/viktrwlayer_tracklist.c:659 ../src/vikutils.c:90 +msgid "min/km" +msgstr "" + +#: ../src/globals.c:69 +msgid "s/mi" +msgstr "" + +#: ../src/globals.c:69 ../src/viktrwlayer_tracklist.c:661 ../src/vikutils.c:96 +msgid "min/mi" +msgstr "" + +#: ../src/globals.c:70 +msgid "Metres" +msgstr "" + +#: ../src/globals.c:70 +msgid "Feet" +msgstr "" + +#: ../src/globals.c:73 +msgid "Locale" +msgstr "" + +#: ../src/globals.c:73 +msgid "World" +msgstr "" + +#: ../src/globals.c:73 +msgid "UTC" +msgstr "" + +#: ../src/globals.c:76 +msgid "Degree format:" +msgstr "" + +#: ../src/globals.c:77 +msgid "Distance units:" +msgstr "" + +#: ../src/globals.c:78 +msgid "Speed units:" +msgstr "" + +#: ../src/globals.c:79 +msgid "Height units:" +msgstr "" + +#: ../src/globals.c:80 +msgid "Use large waypoint icons:" +msgstr "" + +#: ../src/globals.c:81 +msgid "Default latitude:" +msgstr "" + +#: ../src/globals.c:82 +msgid "Default longitude:" +msgstr "" + +#: ../src/globals.c:83 +msgid "Time Display:" +msgstr "" + +#: ../src/globals.c:84 +msgid "" +"Display times according to the reference frame. Locale is the user's system " +"setting. World is relative to the location of the object." +msgstr "" + +#: ../src/globals.c:90 +msgid "Alphabetical" +msgstr "" + +#: ../src/globals.c:90 ../src/datasource_osm_my_traces.c:432 +msgid "Time" +msgstr "" + +#: ../src/globals.c:90 +msgid "Creation" +msgstr "" + +#: ../src/globals.c:91 +msgid "Title Case" +msgstr "" + +#: ../src/globals.c:91 +msgid "Lowercase" +msgstr "" + +#: ../src/globals.c:94 +msgid "KML File Export Units:" +msgstr "" + +#: ../src/globals.c:95 +msgid "GPX Track Order:" +msgstr "" + +#: ../src/globals.c:96 +msgid "GPX Waypoint Symbols:" +msgstr "" + +#: ../src/globals.c:97 +msgid "" +"Save GPX Waypoint Symbol names in the specified case. May be useful for " +"compatibility with various devices" +msgstr "" + +#: ../src/globals.c:98 +msgid "GPX Creator:" +msgstr "" + +#: ../src/globals.c:99 +msgid "" +"The creator value when writing a GPX file. Otherwise when blank a default is " +"used." +msgstr "" + +#: ../src/globals.c:104 +msgid "Image Viewer:" +msgstr "" + +#: ../src/globals.c:109 +msgid "External GPX Program 1:" +msgstr "" + +#: ../src/globals.c:110 +msgid "External GPX Program 2:" +msgstr "" + +#: ../src/globals.c:113 +msgid "Absolute" +msgstr "" + +#: ../src/globals.c:113 +msgid "Relative" +msgstr "" + +#: ../src/globals.c:117 +msgid "Save File Reference Mode:" +msgstr "" + +#: ../src/globals.c:118 +msgid "" +"When saving a Viking .vik file, this determines how the directory paths of " +"filenames are written." +msgstr "" + +#: ../src/globals.c:119 +msgid "Ask for Name before Track Creation:" +msgstr "" + +#: ../src/globals.c:120 +msgid "Show Tooltip during Track Creation:" +msgstr "" + +#: ../src/globals.c:121 +msgid "The number of recent files:" +msgstr "" + +#: ../src/globals.c:122 +msgid "" +"Only applies to new windows or on application restart. -1 means all " +"available files." +msgstr "" + +#: ../src/globals.c:123 +msgid "Open files in selected layer:" +msgstr "" + +#: ../src/globals.c:124 +msgid "Open files (but not .vik ones) into the selected TrackWaypoint layer." +msgstr "" + +#: ../src/globals.c:125 +msgid "Show calendar day names:" +msgstr "" + +#: ../src/globals.c:128 +msgid "Home Location" +msgstr "" + +#: ../src/globals.c:128 +msgid "Last Location" +msgstr "" + +#: ../src/globals.c:128 +msgid "Specified File" +msgstr "" + +#: ../src/globals.c:128 +msgid "Auto Location" +msgstr "" + +#: ../src/globals.c:131 +msgid "Restore Window Setup:" +msgstr "" + +#: ../src/globals.c:132 +msgid "Restore window size and layout" +msgstr "" + +#: ../src/globals.c:133 +msgid "Add a Default Map Layer:" +msgstr "" + +#: ../src/globals.c:134 +msgid "" +"The default map layer added is defined by the Layer Defaults. Use the menu " +"Edit->Layer Defaults->Map... to change the map type and other values." +msgstr "" + +#: ../src/globals.c:135 +msgid "Startup Method:" +msgstr "" + +#: ../src/globals.c:136 +msgid "Startup File:" +msgstr "" + +#: ../src/globals.c:137 +msgid "" +"The default file to load on startup. Only applies when the startup method is " +"set to 'Specified File'" +msgstr "" + +#: ../src/globals.c:138 +msgid "Check For New Version:" +msgstr "" + +#: ../src/globals.c:139 +msgid "Periodically check to see if a new version of Viking is available" +msgstr "" + +#. Defaults for the options are setup here +#: ../src/globals.c:176 +msgid "General" +msgstr "" + +#. New Tab +#: ../src/globals.c:204 +msgid "Startup" +msgstr "" + +#. New Tab +#: ../src/globals.c:222 +msgid "Export/External" +msgstr "" + +#. 'Advanced' Properties +#: ../src/globals.c:249 +msgid "Advanced" +msgstr "" + +#. Webtools +#: ../src/google.c:39 +msgid "Google" +msgstr "" + +#. If there is an actual description field it will overwrite this value +#: ../src/gpx.c:264 +#, c-format +msgid "Created by: %s" +msgstr "" + +#: ../src/datasource_bfilter.c:43 +msgid "Max number of points:" +msgstr "" + +#: ../src/datasource_bfilter.c:84 +msgid "Simplify All Tracks..." +msgstr "" + +#: ../src/datasource_bfilter.c:85 +msgid "Simplified Tracks" +msgstr "" + +#. { VIK_LAYER_NUM_TYPES, "compressmethod", VIK_LAYER_PARAM_UINT, VIK_LAYER_GROUP_NONE, N_("Simplify Method:"), VIK_LAYER_WIDGET_COMBOBOX, compress_method, NULL, NULL, NULL, NULL, NULL }, +#: ../src/datasource_bfilter.c:111 +msgid "Error Factor:" +msgstr "" + +#: ../src/datasource_bfilter.c:112 +msgid "" +"Specifies the maximum allowable error that may be introduced by removing a " +"single point by the crosstrack method. See the manual or GPSBabel Simplify " +"Filter documentation for more detail." +msgstr "" + +#: ../src/datasource_bfilter.c:166 +msgid "Compress Tracks..." +msgstr "" + +#: ../src/datasource_bfilter.c:167 +msgid "Compressed Tracks" +msgstr "" + +#: ../src/datasource_bfilter.c:197 ../src/datasource_bfilter.c:198 +msgid "Remove Duplicate Waypoints" +msgstr "" + +#: ../src/datasource_bfilter.c:221 +msgid "Manual filter:" +msgstr "" + +#: ../src/datasource_bfilter.c:222 +msgid "Manual filter command: e.g. 'swap'." +msgstr "" + +#: ../src/datasource_bfilter.c:233 ../src/datasource_bfilter.c:234 +msgid "Manual filter" +msgstr "" + +#: ../src/datasource_bfilter.c:262 +msgid "Waypoints Inside This" +msgstr "" + +#: ../src/datasource_bfilter.c:263 ../src/datasource_bfilter.c:292 +msgid "Polygonized Layer" +msgstr "" + +#: ../src/datasource_bfilter.c:291 +msgid "Waypoints Outside This" +msgstr "" + +#: ../src/datasource_file.c:61 +msgid "Import file with GPSBabel" +msgstr "" + +#: ../src/datasource_file.c:62 +msgid "Imported file" +msgstr "" + +#. The file selector +#: ../src/datasource_file.c:129 +msgid "File:" +msgstr "" + +#: ../src/datasource_file.c:130 +msgid "File to import" +msgstr "" + +#: ../src/datasource_file.c:137 +msgid "All files" +msgstr "" + +#. The file format selector +#: ../src/datasource_file.c:144 ../src/datasource_url.c:106 +msgid "File type:" +msgstr "" + +#: ../src/datasource_file.c:189 +#, c-format +msgid "using babel args '%s' and file '%s'" +msgstr "" + +#: ../src/datasource_gc.c:67 +msgid "Download Geocaches" +msgstr "" + +#: ../src/datasource_gc.c:68 +msgid "Geocaching.com Caches" +msgstr "" + +#: ../src/datasource_gc.c:86 +msgid "geocaching.com username:" +msgstr "" + +#: ../src/datasource_gc.c:87 +msgid "geocaching.com password:" +msgstr "" + +#: ../src/datasource_gc.c:92 ../src/vikwindow.c:3502 +msgid "Geocaching" +msgstr "" + +#: ../src/datasource_gc.c:128 +#, c-format +msgid "" +"Can't find %s or %s in path! Check that you have installed it correctly." +msgstr "" + +#: ../src/datasource_gc.c:190 +msgid "Number geocaches:" +msgstr "" + +#: ../src/datasource_gc.c:192 +msgid "Centered around:" +msgstr "Centred around:" + +#: ../src/datasource_gc.c:231 +msgid "Broken input - using some defaults" +msgstr "" + +#: ../src/datasource_geotag.c:51 +msgid "Create Waypoints from Geotagged Images" +msgstr "" + +#: ../src/datasource_geotag.c:52 +msgid "Geotagged Images" +msgstr "" + +#: ../src/datasource_geotag.c:102 ../src/datasource_geojson.c:93 +#: ../src/vikfileentry.c:171 ../src/vikwindow.c:3533 ../src/vikwindow.c:3610 +#: ../src/vikwindow.c:3641 ../src/vikwindow.c:4356 ../src/vikwindow.c:4649 +msgid "All" +msgstr "" + +#: ../src/datasource_geotag.c:107 ../src/vikfileentry.c:115 +#: ../src/viktrwlayer_geotag.c:637 ../src/vikwindow.c:3518 +#: ../src/vikwindow.c:4377 +msgid "JPG" +msgstr "" + +#: ../src/datasource_geotag.c:168 +#, c-format +msgid "Unable to create waypoint from %s" +msgstr "" + +#: ../src/datasource_geojson.c:46 +msgid "Acquire from GeoJSON" +msgstr "" + +#: ../src/datasource_geojson.c:47 ../src/datasource_geojson.c:98 +msgid "GeoJSON" +msgstr "" + +#: ../src/datasource_geojson.c:152 +#, c-format +msgid "Unable to import from: %s" +msgstr "" + +#: ../src/datasource_gps.c:54 +msgid "Acquire from GPS" +msgstr "" + +#: ../src/datasource_gps.c:55 +msgid "Acquired from GPS" +msgstr "" + +#: ../src/datasource_gps.c:258 +#, c-format +msgid "using cmd '%s' and file '%s'\n" +msgstr "" + +#: ../src/datasource_gps.c:353 ../src/vikgpslayer.c:966 +#, c-format +msgid "Downloading %d waypoint..." +msgid_plural "Downloading %d waypoints..." +msgstr[0] "" +msgstr[1] "" + +#: ../src/datasource_gps.c:358 ../src/vikgpslayer.c:971 +#, c-format +msgid "Downloading %d trackpoint..." +msgid_plural "Downloading %d trackpoints..." +msgstr[0] "" +msgstr[1] "" + +#: ../src/datasource_gps.c:363 ../src/vikgpslayer.c:976 +#, c-format +msgid "Downloading %d routepoint..." +msgid_plural "Downloading %d routepoints..." +msgstr[0] "" +msgstr[1] "" + +#: ../src/datasource_gps.c:386 ../src/datasource_gps.c:393 +#: ../src/datasource_gps.c:400 +#, c-format +msgid "Downloaded %d out of %d %s..." +msgstr "" + +#: ../src/datasource_gps.c:388 ../src/datasource_gps.c:395 +#: ../src/datasource_gps.c:402 +#, c-format +msgid "Downloaded %d %s." +msgstr "" + +#: ../src/datasource_gps.c:416 ../src/vikgpslayer.c:1134 +#, c-format +msgid "GPS Device: %s" +msgstr "" + +#: ../src/datasource_gps.c:428 ../src/vikgpslayer.c:1214 +msgid "Status: Working..." +msgstr "" + +#. NB gps_layer_inst_init() is performed after parameter registeration +#. thus to give the protocols some potential values use the old static list +#. TODO: find another way to use gps_layer_inst_init()? +#: ../src/datasource_gps.c:584 ../src/vikgpslayer.c:216 +msgid "GPS Protocol:" +msgstr "" + +#. List reassigned at runtime +#: ../src/datasource_gps.c:609 ../src/vikgpslayer.c:217 +msgid "Serial Port:" +msgstr "" + +#: ../src/datasource_gps.c:659 +msgid "" +"Turn Off After Transfer\n" +"(Garmin/NAViLink Only)" +msgstr "" + +#: ../src/datasource_gps.c:666 +msgid "Tracks:" +msgstr "" + +#: ../src/datasource_gps.c:673 +msgid "Routes:" +msgstr "" + +#: ../src/datasource_gps.c:680 +msgid "Waypoints:" +msgstr "" + +#: ../src/datasource_gps.c:756 ../src/vikgpslayer.c:1509 +msgid "GPS device: N/A" +msgstr "" + +#: ../src/datasource_osm.c:53 ../src/datasource_osm.c:54 +msgid "OSM traces" +msgstr "" + +#: ../src/datasource_osm.c:89 +msgid "Page number:" +msgstr "" + +#: ../src/datasource_osm_my_traces.c:59 ../src/datasource_osm_my_traces.c:60 +msgid "OSM My Traces" +msgstr "" + +#: ../src/datasource_osm_my_traces.c:106 ../src/osm-traces.c:684 +msgid "Email/username:" +msgstr "" + +#: ../src/datasource_osm_my_traces.c:111 +msgid "The email or username used to login to OSM" +msgstr "" + +#: ../src/datasource_osm_my_traces.c:113 ../src/osm-traces.c:692 +msgid "Password:" +msgstr "" + +#: ../src/datasource_osm_my_traces.c:116 +msgid "The password used to login to OSM" +msgstr "" + +#: ../src/datasource_osm_my_traces.c:427 ../src/viktrwlayer.c:689 +msgid "Description" +msgstr "" + +#: ../src/datasource_osm_my_traces.c:442 +msgid "Privacy" +msgstr "" + +#: ../src/datasource_osm_my_traces.c:449 +msgid "Within Current View" +msgstr "" + +#: ../src/datasource_osm_my_traces.c:516 +msgid "GPS Traces" +msgstr "" + +#: ../src/datasource_osm_my_traces.c:518 +msgid "None found!" +msgstr "" + +#: ../src/datasource_osm_my_traces.c:569 +msgid "Ensure the OSM access token preferences are setup." +msgstr "" + +#: ../src/datasource_osm_my_traces.c:645 +msgid "My OSM Traces" +msgstr "" + +#. Report errors to the status bar +#: ../src/datasource_osm_my_traces.c:667 +#, c-format +msgid "Unable to get trace: %s" +msgstr "" + +#: ../src/datasource_routing.c:56 ../src/datasource_routing.c:57 +msgid "Directions" +msgstr "" + +#: ../src/datasource_routing.c:90 +msgid "No routing engines with directions available" +msgstr "" + +#. Engine selector +#: ../src/datasource_routing.c:99 +msgid "Engine:" +msgstr "" + +#. From and To entries +#: ../src/datasource_routing.c:104 +msgid "From:" +msgstr "" + +#: ../src/datasource_routing.c:105 +msgid "To:" +msgstr "" + +#: ../src/datasource_url.c:48 +msgid "Acquire from URL" +msgstr "" + +#: ../src/datasource_url.c:49 +msgid "URL" +msgstr "" + +#: ../src/datasource_url.c:101 +msgid "URL:" +msgstr "" + +#. Only GPX (not using GPSbabel) +#: ../src/datasource_url.c:133 ../src/vikfileentry.c:161 +#: ../src/vikwindow.c:3513 ../src/vikwindow.c:3603 +msgid "GPX" +msgstr "" + +#: ../src/datasource_wikipedia.c:32 +msgid "Create Waypoints from Wikipedia Articles" +msgstr "" + +#: ../src/datasource_wikipedia.c:33 +msgid "Wikipedia Waypoints" +msgstr "" + +#: ../src/dem.c:66 ../src/dem.c:80 +msgid "Invalid DEM" +msgstr "" + +#: ../src/dem.c:122 +msgid "Invalid DEM header" +msgstr "" + +#: ../src/dem.c:191 ../src/dem.c:204 +msgid "Incorrect DEM Class B record: expected 1" +msgstr "" + +#: ../src/dem.c:289 ../src/download.c:176 +#, c-format +msgid "Couldn't map file %s: %s" +msgstr "" + +#: ../src/download.c:130 +msgid "Tile age (days):" +msgstr "" + +#: ../src/download.c:406 +#, c-format +msgid "Download error: %s" +msgstr "" + +#: ../src/download.c:490 +msgid "couldn't open temp file" +msgstr "" + +#: ../src/file.c:458 ../src/file.c:463 +#, c-format +msgid "Draw mode '%s' no more supported" +msgstr "" + +#: ../src/geotag_exif.c:621 +msgid "Not enough memory." +msgstr "" + +#: ../src/geotag_exif.c:639 +msgid "Setting a value for this tag is unsupported!" +msgstr "" + +#: ../src/geotag_exif.c:658 +#, c-format +msgid "Too few components specified (need %d, found %d)\n" +msgstr "" + +#: ../src/geotag_exif.c:662 +msgid "Numeric value expected\n" +msgstr "" + +#: ../src/geotag_exif.c:670 +msgid "This shouldn't happen!" +msgstr "" + +#: ../src/geotag_exif.c:740 +msgid "Not yet implemented!" +msgstr "" + +#: ../src/geotag_exif.c:753 +msgid "Warning; Too many components specified!" +msgstr "" + +#: ../src/osm-traces.c:87 +msgid "Identifiable (public w/ timestamps)" +msgstr "" + +#: ../src/osm-traces.c:88 +msgid "Trackable (private w/ timestamps)" +msgstr "" + +#: ../src/osm-traces.c:89 +msgid "Public" +msgstr "" + +#: ../src/osm-traces.c:90 +msgid "Private" +msgstr "" + +#: ../src/osm-traces.c:108 +msgid "Access Token:" +msgstr "" + +#: ../src/osm-traces.c:108 +msgid "Get New OSM Access Tokens" +msgstr "" + +#: ../src/osm-traces.c:109 +msgid "Access Token Key:" +msgstr "" + +#: ../src/osm-traces.c:110 +msgid "Access Token Secret:" +msgstr "" + +#: ../src/osm-traces.c:111 +msgid "OSM username:" +msgstr "" + +#: ../src/osm-traces.c:112 +msgid "OSM password:" +msgstr "" + +#. Check to really override existing values... +#: ../src/osm-traces.c:263 +msgid "Do you want to overwrite existing values?" +msgstr "" + +#: ../src/osm-traces.c:275 +msgid "Not able to generate OSM request tokens." +msgstr "" + +#: ../src/osm-traces.c:299 +msgid "" +"Waiting for authorization approval.\n" +"Ensure you have granted access at the website before continuing here." +msgstr "" + +#: ../src/osm-traces.c:315 +msgid "No Authorization." +msgstr "" + +#: ../src/osm-traces.c:354 +msgid "" +"OSM Username and Password preferences are not required anymore. You can now " +"remove them." +msgstr "" + +#. Preferences +#: ../src/osm-traces.c:379 +msgid "OpenStreetMap Traces" +msgstr "" + +#: ../src/osm-traces.c:504 +#, c-format +msgid "failed to upload data: HTTP response is %ld" +msgstr "" + +#: ../src/osm-traces.c:509 +#, c-format +msgid "curl_easy_getinfo failed: %d" +msgstr "" + +#: ../src/osm-traces.c:514 +#, c-format +msgid "curl request failed: %s" +msgstr "" + +#. Success +#: ../src/osm-traces.c:592 +msgid "Uploaded to OSM" +msgstr "" + +#: ../src/osm-traces.c:596 +msgid "" +"FAILED TO UPLOAD DATA TO OSM - Ensure the OSM access token preferences are " +"setup." +msgstr "" + +#: ../src/osm-traces.c:599 +msgid "FAILED TO UPLOAD DATA TO OSM - CURL PROBLEM" +msgstr "" + +#: ../src/osm-traces.c:602 +msgid "FAILED TO UPLOAD DATA TO OSM" +msgstr "" + +#: ../src/osm-traces.c:602 +msgid "HTTP response code" +msgstr "" + +#: ../src/osm-traces.c:610 +#, c-format +msgid "failed to unlink temporary file: %s" +msgstr "" + +#: ../src/osm-traces.c:664 +msgid "OSM upload" +msgstr "" + +#: ../src/osm-traces.c:689 +msgid "" +"The email/username used as login\n" +"Enter the email/username you use to login into www.openstreetmap.org." +"" +msgstr "" + +#: ../src/osm-traces.c:697 +msgid "" +"The password used to login\n" +"Enter the password you use to login into www.openstreetmap.org." +msgstr "" + +#: ../src/osm-traces.c:703 +msgid "File's name:" +msgstr "" + +#: ../src/osm-traces.c:713 +msgid "" +"The name of the file on OSM\n" +"This is the name of the file created on the server.This is not the " +"name of the local file." +msgstr "" + +#: ../src/osm-traces.c:717 ../src/viktrwlayer_wpwin.c:197 +#: ../src/viktrwlayer_wpwin.c:199 +msgid "Description:" +msgstr "" + +#: ../src/osm-traces.c:731 +msgid "The description of the trace" +msgstr "" + +#: ../src/osm-traces.c:734 +msgid "Anonymize Times:" +msgstr "" + +#: ../src/osm-traces.c:739 +msgid "" +"Anonymize times of the trace.\n" +"You may choose to make the trace identifiable, yet mask the actual " +"real time values" +msgstr "" + +#: ../src/osm-traces.c:743 +msgid "Tags:" +msgstr "" + +#: ../src/osm-traces.c:751 +msgid "The tags associated to the trace" +msgstr "" + +#: ../src/osm-traces.c:816 +#, c-format +msgid "Uploading %s to OSM" +msgstr "" + +#: ../src/mapcache.c:67 +msgid "Map cache memory size (MB):" +msgstr "" + +#. NB Can have a couple hundred fonts loaded when using system directories +#. So ATM don't list them all - otherwise need better GUI feedback display. +#: ../src/mapnik_interface.cpp:324 +#, c-format +msgid "" +"%s %s\n" +"Plugins=%sFonts loaded=%d" +msgstr "" + +#: ../src/mapnik_interface.cpp:325 ../src/vikmapniklayer.c:278 +msgid "Mapnik" +msgstr "" + +#: ../src/print.c:51 ../src/viktrwlayer.c:572 +msgid "None" +msgstr "" + +#: ../src/print.c:52 +msgid "Horizontally" +msgstr "" + +#: ../src/print.c:53 +msgid "Vertically" +msgstr "" + +#: ../src/print.c:54 +msgid "Both" +msgstr "" + +#: ../src/print.c:118 +msgid "Image Settings" +msgstr "" + +#: ../src/print.c:551 +msgid "done" +msgstr "" + +#. Page Size +#: ../src/print.c:580 +msgid "_Adjust Page Size and Orientation" +msgstr "" + +#: ../src/print.c:596 +msgid "C_enter:" +msgstr "" + +#. ignore page margins +#: ../src/print.c:614 +msgid "Ignore Page _Margins" +msgstr "" + +#: ../src/print.c:633 +msgid "Image S_ize:" +msgstr "" + +#: ../src/ui_util.c:88 +#, c-format +msgid "Could not launch web browser. %s" +msgstr "" + +#: ../src/ui_util.c:101 +#, c-format +msgid "Could not create new email. %s" +msgstr "" + +#: ../src/vikcoordlayer.c:57 +msgid "Color:" +msgstr "Colour:" + +#: ../src/vikcoordlayer.c:58 +msgid "Minutes Width:" +msgstr "" + +#: ../src/vikcoordlayer.c:59 +msgid "Line Thickness:" +msgstr "" + +#: ../src/vikcoordlayer.c:66 +msgid "Coordinate" +msgstr "" + +#: ../src/main.c:92 +#, c-format +msgid "Ignoring Xlib error: error code %d request code %d\n" +msgstr "" + +#: ../src/main.c:111 +msgid "Enable debug output" +msgstr "" + +#: ../src/main.c:112 +msgid "Enable verbose output" +msgstr "" + +#: ../src/main.c:113 +msgid "Show version" +msgstr "" + +#: ../src/main.c:114 +msgid "Latitude in decimal degrees" +msgstr "" + +#: ../src/main.c:115 +msgid "Longitude in decimal degrees" +msgstr "" + +#: ../src/main.c:116 +msgid "Zoom Level (OSM). Value can be 0 - 22" +msgstr "" + +#: ../src/main.c:117 +msgid "Add a map layer by id value. Use 0 for the default map." +msgstr "" + +#: ../src/main.c:160 +#, c-format +msgid "" +"%s %s\n" +"Copyright (c) 2003-2008 Evan Battaglia\n" +"Copyright (c) 2008-%s Viking's contributors\n" +msgstr "" + +#: ../src/osm.c:50 +msgid "OpenStreetMap (Mapnik)" +msgstr "" + +#: ../src/osm.c:65 +msgid "OpenStreetMap (Cycle)" +msgstr "" + +#: ../src/osm.c:79 +msgid "OpenStreetMap (Transport)" +msgstr "" + +#: ../src/osm.c:95 +msgid "OpenStreetMap (Humanitarian)" +msgstr "" + +#: ../src/osm.c:111 +msgid "On Disk OSM Tile Format" +msgstr "" + +#: ../src/osm.c:121 +msgid "MBTiles File" +msgstr "" + +#: ../src/osm.c:132 +msgid "OSM Metatiles" +msgstr "" + +#: ../src/osm.c:146 +msgid "Mapbox Outdoors" +msgstr "" + +#: ../src/osm.c:153 +msgid "Mapbox Specific" +msgstr "" + +#: ../src/osm.c:170 +msgid "OSM (view)" +msgstr "" + +#: ../src/osm.c:174 +msgid "OSM (edit)" +msgstr "" + +#. Note the use of positional parameters +#: ../src/osm.c:179 +msgid "OSM (query)" +msgstr "" + +#: ../src/osm.c:183 +msgid "OSM (render)" +msgstr "" + +#. Example: http://127.0.0.1:8111/load_and_zoom?left=8.19&right=8.20&top=48.605&bottom=48.590&select=node413602999 +#. JOSM or merkaartor must already be running with remote interface enabled +#: ../src/osm.c:190 +msgid "Local port 8111 (eg JOSM)" +msgstr "" + +#: ../src/osm.c:195 +msgid "Geofabrik Map Compare" +msgstr "" + +#: ../src/osm.c:203 +msgid "OpenStreetMap Notes" +msgstr "" + +#. Not really OSM but can't be bothered to create somewhere else to put it... +#: ../src/osm.c:221 +msgid "Wikimedia Toolserver GeoHack" +msgstr "" + +#: ../src/preferences.c:195 +msgid "Preferences" +msgstr "" + +#: ../src/toolbar.c:91 ../src/toolbar.c:92 +msgid "System Default" +msgstr "" + +#: ../src/toolbar.c:91 ../src/viktrwlayer.c:563 +msgid "Small" +msgstr "" + +#: ../src/toolbar.c:91 ../src/viktrwlayer.c:564 +msgid "Medium" +msgstr "" + +#: ../src/toolbar.c:91 ../src/viktrwlayer.c:565 +msgid "Large" +msgstr "" + +#: ../src/toolbar.c:92 +msgid "Icons Only" +msgstr "" + +#: ../src/toolbar.c:92 +msgid "Text Only" +msgstr "" + +#: ../src/toolbar.c:92 +msgid "Icons and Text" +msgstr "" + +#: ../src/toolbar.c:106 +msgid "Append to Menu:" +msgstr "" + +#: ../src/toolbar.c:107 +msgid "Pack the toolbar to the main menu to save vertical space" +msgstr "" + +#: ../src/toolbar.c:108 +msgid "Icon Size:" +msgstr "" + +#: ../src/toolbar.c:110 +msgid "Icon Style:" +msgstr "" + +#: ../src/toolbar.c:112 +msgid "Customize:" +msgstr "" + +#: ../src/toolbar.c:112 +msgid "Customize Buttons" +msgstr "" + +#. Preferences +#: ../src/toolbar.c:145 +msgid "Toolbar" +msgstr "" + +#: ../src/toolbar.c:312 +msgid "_Customize" +msgstr "" + +#: ../src/toolbar.c:641 +msgid "Separator" +msgstr "" + +#: ../src/toolbar.c:642 +msgid "--- Separator ---" +msgstr "" + +#: ../src/toolbar.c:1007 +msgid "Customize Toolbar" +msgstr "" + +#: ../src/toolbar.c:1028 +msgid "" +"Select items to be displayed on the toolbar. Items can be reordered by drag " +"and drop." +msgstr "" + +#: ../src/toolbar.c:1044 +msgid "Available Items" +msgstr "" + +#: ../src/toolbar.c:1065 +msgid "Displayed Items" +msgstr "" + +#: ../src/viklayer_defaults.c:232 +#, c-format +msgid "Could not open file: %s" +msgstr "" + +#: ../src/viklayer_defaults.c:304 +msgid "Layer Defaults" +msgstr "" + +#: ../src/uibuilder.c:196 +msgid "Take care that this password will be stored clearly in a plain file." +msgstr "" + +#: ../src/uibuilder.c:628 ../src/viktrwlayer_export.c:188 +#: ../src/viktrwlayer_export.c:304 ../src/vikwindow.c:3666 +#: ../src/vikwindow.c:4408 +#, c-format +msgid "The file \"%s\" exists, do you wish to overwrite it?" +msgstr "" + +#: ../src/vikaggregatelayer.c:41 +msgid "Aggregate" +msgstr "" + +#: ../src/vikaggregatelayer.c:528 ../src/viktrwlayer.c:11700 +#, c-format +msgid "%s: Waypoint List" +msgstr "" + +#: ../src/vikaggregatelayer.c:570 +msgid "Search by Date" +msgstr "" + +#: ../src/vikaggregatelayer.c:576 +msgid "No items found with the requested date." +msgstr "" + +#: ../src/vikaggregatelayer.c:615 ../src/viktrwlayer.c:11691 +#, c-format +msgid "%s: Track and Route List" +msgstr "" + +#: ../src/vikaggregatelayer.c:681 ../src/viktrwlayer.c:8346 +#: ../src/viktrwlayer.c:8417 ../src/viktrwlayer.c:8494 +msgid "_Visibility" +msgstr "" + +#: ../src/vikaggregatelayer.c:686 +msgid "_Show All" +msgstr "" + +#: ../src/vikaggregatelayer.c:692 +msgid "_Hide All" +msgstr "" + +#: ../src/vikaggregatelayer.c:698 ../src/viktrwlayer.c:8363 +#: ../src/viktrwlayer.c:8434 ../src/viktrwlayer.c:8511 +msgid "_Toggle" +msgstr "" + +#: ../src/vikaggregatelayer.c:705 ../src/viktrwlayer.c:8532 +msgid "_Sort" +msgstr "" + +#: ../src/vikaggregatelayer.c:711 ../src/viktrwlayer.c:8538 +msgid "Name _Ascending" +msgstr "" + +#: ../src/vikaggregatelayer.c:717 ../src/viktrwlayer.c:8544 +msgid "Name _Descending" +msgstr "" + +#: ../src/vikaggregatelayer.c:723 ../src/viktrwlayer.c:575 +#: ../src/viktrwlayer.c:8550 +msgid "Date Ascending" +msgstr "" + +#: ../src/vikaggregatelayer.c:729 ../src/viktrwlayer.c:576 +#: ../src/viktrwlayer.c:8556 +msgid "Date Descending" +msgstr "" + +#: ../src/vikaggregatelayer.c:735 ../src/viktrwlayer.c:8445 +#: ../src/viktrwlayer.c:8523 ../src/viktrwlayer.c:8595 +#: ../src/viktrwlayer_tracklist.c:296 +msgid "_Statistics" +msgstr "" + +#: ../src/vikaggregatelayer.c:740 ../src/viktrwlayer.c:4533 +msgid "Track _List..." +msgstr "" + +#: ../src/vikaggregatelayer.c:746 ../src/viktrwlayer.c:4540 +msgid "_Waypoint List..." +msgstr "" + +#: ../src/vikaggregatelayer.c:753 +msgid "Searc_h" +msgstr "" + +#: ../src/vikaggregatelayer.c:759 +msgid "By _Date..." +msgstr "" + +#: ../src/vikaggregatelayer.c:762 +msgid "Find the first item with a specified date" +msgstr "" + +#: ../src/vikaggregatelayer.c:765 +msgid "Load E_xternal Layers" +msgstr "" + +#. Could have a more complicated tooltip that numbers each type of layers, +#. but for now a simple overall count +#: ../src/vikaggregatelayer.c:1011 +#, c-format +msgid "One layer" +msgid_plural "%d layers" +msgstr[0] "" +msgstr[1] "" + +#: ../src/vikaggregatelayer.c:1014 +#, c-format +msgid "Empty" +msgstr "" + +#: ../src/vikdemlayer.c:86 +msgid "SRTM Global 90m (3 arcsec)" +msgstr "" + +#: ../src/vikdemlayer.c:94 +msgid "Absolute height" +msgstr "" + +#: ../src/vikdemlayer.c:95 +msgid "Height gradient" +msgstr "" + +#: ../src/vikdemlayer.c:120 +msgid "DEM Files:" +msgstr "" + +#: ../src/vikdemlayer.c:121 +msgid "Download Source:" +msgstr "" + +#: ../src/vikdemlayer.c:122 +msgid "Min Elev Color:" +msgstr "Min Elev Colour" + +#: ../src/vikdemlayer.c:123 ../src/viktrwlayer_wpwin.c:207 +msgid "Type:" +msgstr "" + +#: ../src/vikdemlayer.c:124 +msgid "Min Elev:" +msgstr "" + +#: ../src/vikdemlayer.c:125 +msgid "Max Elev:" +msgstr "" + +#: ../src/vikdemlayer.c:137 +msgid "_DEM Download" +msgstr "" + +#: ../src/vikdemlayer.c:137 +msgid "DEM Download" +msgstr "" + +#: ../src/vikdemlayer.c:192 +msgid "DEM" +msgstr "" + +#: ../src/vikdemlayer.c:304 +#, c-format +msgid "Number of files: %d" +msgstr "" + +#: ../src/vikdemlayer.c:446 +msgid "DEM Loading" +msgstr "" + +#: ../src/vikdemlayer.c:927 +#, c-format +msgid "No SRTM data available for %f, %f" +msgstr "" + +#: ../src/vikdemlayer.c:948 +#, c-format +msgid "DEM download failure for %f, %f" +msgstr "" + +#: ../src/vikdemlayer.c:954 +#, c-format +msgid "DEM write failure for %s" +msgstr "" + +#. Probably not over any land... +#: ../src/vikdemlayer.c:1201 +msgid "No DEM File Available" +msgstr "" + +#: ../src/vikdemlayer.c:1220 +#, c-format +msgid "" +"\n" +"Source: %s\n" +"\n" +"DEM File: %s\n" +"DEM File Timestamp: %s" +msgstr "" + +#: ../src/vikdemlayer.c:1224 +#, c-format +msgid "" +"Source: %s\n" +"\n" +"No DEM File!" +msgstr "" + +#: ../src/vikdemlayer.c:1264 +#, c-format +msgid "Downloading DEM %s" +msgstr "" + +#: ../src/vikdemlayer.c:1289 +msgid "_Show DEM File Information" +msgstr "" + +#: ../src/vikfileentry.c:72 +msgid "Browse..." +msgstr "" + +#: ../src/vikfileentry.c:103 +msgid "Choose file" +msgstr "" + +#: ../src/vikfileentry.c:120 ../src/vikwindow.c:4372 +msgid "PNG" +msgstr "" + +#: ../src/vikfileentry.c:125 +msgid "TIFF" +msgstr "" + +#: ../src/vikfileentry.c:133 +msgid "MBTiles" +msgstr "" + +#: ../src/vikfileentry.c:142 +msgid "XML" +msgstr "" + +#: ../src/vikfileentry.c:149 +msgid "MML" +msgstr "" + +#: ../src/vikfileentry.c:154 +msgid "MSS" +msgstr "" + +#: ../src/vikfilelist.c:49 +msgid "Choose file(s)" +msgstr "" + +#: ../src/vikfilelist.c:182 +msgid "Add..." +msgstr "" + +#: ../src/vikfilelist.c:183 +msgid "Delete" +msgstr "" + +#: ../src/vikgeoreflayer.c:97 +msgid "_Georef Move Map" +msgstr "" + +#: ../src/vikgeoreflayer.c:97 +msgid "Georef Move Map" +msgstr "" + +#: ../src/vikgeoreflayer.c:106 +msgid "Georef Z_oom Tool" +msgstr "" + +#: ../src/vikgeoreflayer.c:106 +msgid "Georef Zoom Tool" +msgstr "" + +#: ../src/vikgeoreflayer.c:117 +msgid "GeoRef Map" +msgstr "" + +#: ../src/vikgeoreflayer.c:214 +msgid "Auto Read World Files:" +msgstr "" + +#: ../src/vikgeoreflayer.c:215 +msgid "" +"Automatically attempt to read associated world file of a new image for a " +"GeoRef layer" +msgstr "" + +#: ../src/vikgeoreflayer.c:511 ../src/vikgeoreflayer.c:797 +#: ../src/vikmapslayer.c:1174 +#, c-format +msgid "Couldn't open image file: %s" +msgstr "" + +#: ../src/vikgeoreflayer.c:607 ../src/vikgeoreflayer.c:633 +msgid "Choose World file" +msgstr "" + +#: ../src/vikgeoreflayer.c:619 +msgid "The World file you requested could not be opened for reading." +msgstr "" + +#: ../src/vikgeoreflayer.c:621 +msgid "Unexpected end of file reading World file." +msgstr "" + +#: ../src/vikgeoreflayer.c:646 +msgid "The file you requested could not be opened for writing." +msgstr "" + +#: ../src/vikgeoreflayer.c:782 +msgid "Lower right corner values may not be consistent with upper right values" +msgstr "" + +#: ../src/vikgeoreflayer.c:806 +#, c-format +msgid "Invalid image size: %s" +msgstr "" + +#: ../src/vikgeoreflayer.c:831 ../src/viklayer.c:561 ../src/vikwindow.c:4891 +msgid "Layer Properties" +msgstr "" + +#: ../src/vikgeoreflayer.c:852 +msgid "World File Parameters:" +msgstr "World File Parameters:" + +#: ../src/vikgeoreflayer.c:853 +msgid "Load From File..." +msgstr "" + +#: ../src/vikgeoreflayer.c:858 +msgid "Corner pixel easting:" +msgstr "" + +#: ../src/vikgeoreflayer.c:860 +msgid "the UTM \"easting\" value of the upper-left corner pixel of the map" +msgstr "" + +#: ../src/vikgeoreflayer.c:862 +msgid "Corner pixel northing:" +msgstr "" + +#: ../src/vikgeoreflayer.c:864 +msgid "the UTM \"northing\" value of the upper-left corner pixel of the map" +msgstr "" + +#: ../src/vikgeoreflayer.c:866 +msgid "X (easting) scale (mpp): " +msgstr "" + +#: ../src/vikgeoreflayer.c:867 +msgid "Y (northing) scale (mpp): " +msgstr "" + +#: ../src/vikgeoreflayer.c:870 +msgid "the scale of the map in the X direction (meters per pixel)" +msgstr "" + +#: ../src/vikgeoreflayer.c:872 +msgid "the scale of the map in the Y direction (meters per pixel)" +msgstr "" + +#: ../src/vikgeoreflayer.c:874 +msgid "Map Image:" +msgstr "" + +#: ../src/vikgeoreflayer.c:919 +msgid "Upper left latitude:" +msgstr "" + +#: ../src/vikgeoreflayer.c:921 +msgid "Upper left longitude:" +msgstr "" + +#: ../src/vikgeoreflayer.c:923 +msgid "Lower right latitude:" +msgstr "" + +#: ../src/vikgeoreflayer.c:925 +msgid "Lower right longitude:" +msgstr "" + +#: ../src/vikgeoreflayer.c:937 +msgid "Calculate MPP values from coordinates" +msgstr "" + +#: ../src/vikgeoreflayer.c:938 +msgid "" +"Enter all corner coordinates before calculating the MPP values from the " +"image size" +msgstr "" + +#: ../src/vikgeoreflayer.c:948 +msgid "UTM" +msgstr "" + +#: ../src/vikgeoreflayer.c:949 +msgid "Latitude/Longitude" +msgstr "" + +#: ../src/vikgeoreflayer.c:957 ../src/vikmapniklayer.c:82 +#: ../src/vikmapslayer.c:158 +msgid "Alpha:" +msgstr "" + +#. Now with icons +#: ../src/vikgeoreflayer.c:1062 +msgid "_Zoom to Fit Map" +msgstr "" + +#: ../src/vikgeoreflayer.c:1068 +msgid "_Goto Map Center" +msgstr "" + +#: ../src/vikgeoreflayer.c:1074 +msgid "_Export to World File" +msgstr "" + +#: ../src/vikgoto.c:98 +msgid "No goto tool available." +msgstr "" + +#: ../src/vikgoto.c:295 +msgid "goto" +msgstr "" + +#: ../src/vikgoto.c:297 +msgid "goto provider:" +msgstr "" + +#: ../src/vikgoto.c:312 +msgid "Enter address or place name:" +msgstr "" + +#: ../src/vikgoto.c:487 +msgid "Locality" +msgstr "" + +#: ../src/vikgpslayer.c:137 +msgid "Data Mode" +msgstr "" + +#: ../src/vikgpslayer.c:139 +msgid "Realtime Tracking Mode" +msgstr "" + +#: ../src/vikgpslayer.c:176 +msgid "Keep vehicle at center" +msgstr "" + +#: ../src/vikgpslayer.c:177 +msgid "Keep vehicle on screen" +msgstr "" + +#: ../src/vikgpslayer.c:178 +msgid "Disable" +msgstr "" + +#: ../src/vikgpslayer.c:218 +msgid "Download Tracks:" +msgstr "" + +#: ../src/vikgpslayer.c:219 +msgid "Upload Tracks:" +msgstr "" + +#: ../src/vikgpslayer.c:220 +msgid "Download Routes:" +msgstr "" + +#: ../src/vikgpslayer.c:221 +msgid "Upload Routes:" +msgstr "" + +#: ../src/vikgpslayer.c:222 +msgid "Download Waypoints:" +msgstr "" + +#: ../src/vikgpslayer.c:223 +msgid "Upload Waypoints:" +msgstr "" + +#: ../src/vikgpslayer.c:225 +msgid "Recording tracks" +msgstr "" + +#: ../src/vikgpslayer.c:226 +msgid "Jump to current position on start" +msgstr "" + +#: ../src/vikgpslayer.c:227 +msgid "Moving Map Method:" +msgstr "" + +#: ../src/vikgpslayer.c:228 +msgid "Update Statusbar:" +msgstr "" + +#: ../src/vikgpslayer.c:228 +msgid "Display information in the statusbar on GPS updates" +msgstr "" + +#: ../src/vikgpslayer.c:229 +msgid "Auto Connect" +msgstr "" + +#: ../src/vikgpslayer.c:229 +msgid "Automatically connect to GPSD" +msgstr "" + +#: ../src/vikgpslayer.c:230 +msgid "Gpsd Host:" +msgstr "" + +#: ../src/vikgpslayer.c:231 +msgid "Gpsd Port:" +msgstr "" + +#: ../src/vikgpslayer.c:232 +msgid "Gpsd Retry Interval (seconds):" +msgstr "" + +#: ../src/vikgpslayer.c:254 +msgid "GPS" +msgstr "" + +#: ../src/vikgpslayer.c:320 ../src/vikgpslayer.c:1504 +msgid "GPS Download" +msgstr "" + +#: ../src/vikgpslayer.c:320 ../src/vikgpslayer.c:1504 ../src/viktrwlayer.c:3993 +msgid "GPS Upload" +msgstr "" + +#: ../src/vikgpslayer.c:322 +msgid "GPS Realtime Tracking" +msgstr "" + +#: ../src/vikgpslayer.c:458 +msgid "Connected" +msgstr "" + +#: ../src/vikgpslayer.c:460 +msgid "Disconnected" +msgstr "" + +#: ../src/vikgpslayer.c:554 +msgid "Unknown GPS Protocol" +msgstr "" + +#: ../src/vikgpslayer.c:572 +msgid "Unknown serial port device" +msgstr "" + +#: ../src/vikgpslayer.c:691 +#, c-format +msgid "%s: unknown parameter" +msgstr "" + +#. Now with icons +#: ../src/vikgpslayer.c:794 +msgid "_Upload to GPS" +msgstr "" + +#: ../src/vikgpslayer.c:800 +msgid "Download from _GPS" +msgstr "" + +#: ../src/vikgpslayer.c:821 +msgid "Empty _Realtime" +msgstr "" + +#: ../src/vikgpslayer.c:828 +msgid "E_mpty Upload" +msgstr "" + +#: ../src/vikgpslayer.c:834 +msgid "_Empty Download" +msgstr "" + +#: ../src/vikgpslayer.c:840 +msgid "Empty _All" +msgstr "" + +#: ../src/vikgpslayer.c:852 +#, c-format +msgid "Unexpected number of disconnected handlers: %d" +msgstr "" + +#: ../src/vikgpslayer.c:995 +#, c-format +msgid "Uploading %d waypoint..." +msgid_plural "Uploading %d waypoints..." +msgstr[0] "" +msgstr[1] "" + +#: ../src/vikgpslayer.c:1000 +#, c-format +msgid "Uploading %d trackpoint..." +msgid_plural "Uploading %d trackpoints..." +msgstr[0] "" +msgstr[1] "" + +#: ../src/vikgpslayer.c:1005 +#, c-format +msgid "Uploading %d routepoint..." +msgid_plural "Uploading %d routepoints..." +msgstr[0] "" +msgstr[1] "" + +#: ../src/vikgpslayer.c:1034 +#, c-format +msgid "Downloaded %d out of %d waypoint..." +msgid_plural "Downloaded %d out of %d waypoints..." +msgstr[0] "" +msgstr[1] "" + +#: ../src/vikgpslayer.c:1040 +#, c-format +msgid "Downloaded %d out of %d trackpoint..." +msgid_plural "Downloaded %d out of %d trackpoints..." +msgstr[0] "" +msgstr[1] "" + +#: ../src/vikgpslayer.c:1046 +#, c-format +msgid "Downloaded %d out of %d routepoint..." +msgid_plural "Downloaded %d out of %d routepoints..." +msgstr[0] "" +msgstr[1] "" + +#: ../src/vikgpslayer.c:1056 +#, c-format +msgid "Uploaded %d out of %d waypoint..." +msgid_plural "Uploaded %d out of %d waypoints..." +msgstr[0] "" +msgstr[1] "" + +#: ../src/vikgpslayer.c:1062 +#, c-format +msgid "Uploaded %d out of %d trackpoint..." +msgid_plural "Uploaded %d out of %d trackpoints..." +msgstr[0] "" +msgstr[1] "" + +#: ../src/vikgpslayer.c:1068 +#, c-format +msgid "Uploaded %d out of %d routepoint..." +msgid_plural "Uploaded %d out of %d routepoints..." +msgstr[0] "" +msgstr[1] "" + +#: ../src/vikgpslayer.c:1079 +#, c-format +msgid "Downloaded %d waypoint" +msgid_plural "Downloaded %d waypoints" +msgstr[0] "" +msgstr[1] "" + +#: ../src/vikgpslayer.c:1085 +#, c-format +msgid "Downloaded %d trackpoint" +msgid_plural "Downloaded %d trackpoints" +msgstr[0] "" +msgstr[1] "" + +#: ../src/vikgpslayer.c:1091 +#, c-format +msgid "Downloaded %d routepoint" +msgid_plural "Downloaded %d routepoints" +msgstr[0] "" +msgstr[1] "" + +#: ../src/vikgpslayer.c:1101 +#, c-format +msgid "Uploaded %d waypoint" +msgid_plural "Uploaded %d waypoints" +msgstr[0] "" +msgstr[1] "" + +#: ../src/vikgpslayer.c:1107 +#, c-format +msgid "Uploaded %d trackpoint" +msgid_plural "Uploaded %d trackpoints" +msgstr[0] "" +msgstr[1] "" + +#: ../src/vikgpslayer.c:1113 +#, c-format +msgid "Uploaded %d routepoint" +msgid_plural "Uploaded %d routepoints" +msgstr[0] "" +msgstr[1] "" + +#: ../src/vikgpslayer.c:1363 +msgid "Error: No result." +msgstr "" + +#: ../src/vikgpslayer.c:1471 +msgid "Warning - GPS Upload items may overwrite each other" +msgstr "" + +#: ../src/vikgpslayer.c:1506 +msgid "Status: detecting gpsbabel" +msgstr "Status: detecting gpsbabel" + +#: ../src/vikgpslayer.c:1533 +msgid "No GPS items selected for transfer." +msgstr "" + +#: ../src/vikgpslayer.c:1546 +msgid "Could not turn off device." +msgstr "" + +#: ../src/vikgpslayer.c:1589 +msgid "Are you sure you want to delete GPS Upload data?" +msgstr "" + +#: ../src/vikgpslayer.c:1602 +msgid "Are you sure you want to delete GPS Download data?" +msgstr "" + +#: ../src/vikgpslayer.c:1616 +msgid "Are you sure you want to delete GPS Realtime data?" +msgstr "" + +#: ../src/vikgpslayer.c:1630 +msgid "Are you sure you want to delete All GPS data?" +msgstr "" + +#: ../src/vikgpslayer.c:2004 +#, c-format +msgid "" +"Failed to connect to gpsd at %s (port %s)\n" +"Should Viking keep trying (every %d seconds)?" +msgstr "" + +#: ../src/viklayerspanel.c:73 +msgid "C_ut" +msgstr "" + +#: ../src/viklayerspanel.c:74 ../src/vikwindow.c:4882 +msgid "_Copy" +msgstr "" + +#: ../src/viklayerspanel.c:75 ../src/vikwindow.c:4883 +msgid "_Paste" +msgstr "" + +#: ../src/viklayerspanel.c:76 ../src/vikwindow.c:4884 +msgid "_Delete" +msgstr "" + +#: ../src/viklayerspanel.c:154 +msgid "New Layer" +msgstr "" + +#: ../src/viklayerspanel.c:347 +msgid "Top Layer" +msgstr "" + +#: ../src/viklayerspanel.c:363 +msgid "Add new layer" +msgstr "" + +#: ../src/viklayerspanel.c:370 ../src/vikwindow.c:4884 +msgid "Remove selected layer" +msgstr "" + +#: ../src/viklayerspanel.c:377 +msgid "Move selected layer up" +msgstr "" + +#: ../src/viklayerspanel.c:384 +msgid "Move selected layer down" +msgstr "" + +#: ../src/viklayerspanel.c:391 ../src/vikwindow.c:4881 +msgid "Cut selected layer" +msgstr "" + +#: ../src/viklayerspanel.c:398 ../src/vikwindow.c:4882 +msgid "Copy selected layer" +msgstr "" + +#: ../src/viklayerspanel.c:405 ../src/vikwindow.c:4883 +msgid "" +"Paste layer into selected container layer or otherwise above selected layer" +msgstr "" + +#: ../src/viklayerspanel.c:502 +msgid "New name can not be blank." +msgstr "" + +#: ../src/viklayerspanel.c:751 +msgid "Aggregate Layers have no settable properties." +msgstr "" + +#: ../src/viklayerspanel.c:798 +msgid "You cannot cut the Top Layer." +msgstr "" + +#: ../src/viklayerspanel.c:843 +#, c-format +msgid "Are you sure you want to delete %s?" +msgstr "" + +#: ../src/viklayerspanel.c:863 +msgid "You cannot delete the Top Layer." +msgstr "" + +#: ../src/vikmapniklayer.c:78 +msgid "CSS (MML) Config File:" +msgstr "" + +#: ../src/vikmapniklayer.c:79 +msgid "CartoCSS configuration file" +msgstr "" + +#: ../src/vikmapniklayer.c:80 +msgid "XML Config File:" +msgstr "" + +#: ../src/vikmapniklayer.c:81 +msgid "Mapnik XML configuration file" +msgstr "" + +#: ../src/vikmapniklayer.c:84 +msgid "Use File Cache:" +msgstr "" + +#: ../src/vikmapniklayer.c:86 +msgid "File Cache Directory:" +msgstr "" + +#: ../src/vikmapniklayer.c:122 +msgid "_Mapnik Features" +msgstr "" + +#: ../src/vikmapniklayer.c:122 +msgid "Mapnik Features" +msgstr "" + +#: ../src/vikmapniklayer.c:140 +msgid "Mapnik Rendering" +msgstr "" + +#. Changing these values only applies before first mapnik layer is 'created' +#: ../src/vikmapniklayer.c:258 +msgid "Plugins Directory:" +msgstr "" + +#: ../src/vikmapniklayer.c:258 ../src/vikmapniklayer.c:259 +#: ../src/vikmapniklayer.c:260 ../src/vikmapniklayer.c:261 +msgid "You need to restart Viking for a change to this value to be used" +msgstr "" + +#: ../src/vikmapniklayer.c:259 +msgid "Fonts Directory:" +msgstr "" + +#: ../src/vikmapniklayer.c:260 +msgid "Recurse Fonts Directory:" +msgstr "" + +#: ../src/vikmapniklayer.c:261 +msgid "Rerender Timeout (hours):" +msgstr "" + +#. Changeable any time +#: ../src/vikmapniklayer.c:263 +msgid "CartoCSS:" +msgstr "" + +#: ../src/vikmapniklayer.c:263 +msgid "The program to convert CartoCSS files into Mapnik XML" +msgstr "" + +#: ../src/vikmapniklayer.c:506 +msgid "Running" +msgstr "" + +#: ../src/vikmapniklayer.c:525 +#, c-format +msgid "" +"Error running carto command:\n" +"%s" +msgstr "" + +#: ../src/vikmapniklayer.c:561 +msgid " completed in " +msgstr "" + +#: ../src/vikmapniklayer.c:561 +msgid "seconds" +msgstr "" + +#: ../src/vikmapniklayer.c:611 ../src/vikmapniklayer.c:979 +#, c-format +msgid "" +"Mapnik error loading configuration file:\n" +"%s" +msgstr "" + +#: ../src/vikmapniklayer.c:749 +#, c-format +msgid "Mapnik Render %d:%d:%d %s" +msgstr "" + +#: ../src/vikmapniklayer.c:840 +msgid "Mapnik Rendering must be in Mercator mode" +msgstr "" + +#: ../src/vikmapniklayer.c:997 +msgid "Mapnik Information" +msgstr "" + +#: ../src/vikmapniklayer.c:1031 +msgid "_Flush Memory Cache" +msgstr "" + +#: ../src/vikmapniklayer.c:1044 +msgid "_Run Carto Command" +msgstr "" + +#: ../src/vikmapniklayer.c:1102 ../src/vikmapslayer.c:2029 +#, c-format +msgid "Tile File Timestamp: %s" +msgstr "" + +#: ../src/vikmapniklayer.c:1105 ../src/vikmapslayer.c:2032 +msgid "Tile File Timestamp: Not Available" +msgstr "" + +#: ../src/vikmapniklayer.c:1120 +#, c-format +msgid "Rendering time %.2f seconds" +msgstr "" + +#: ../src/vikmapniklayer.c:1124 ../src/vikmapslayer.c:2042 +msgid "Tile Information" +msgstr "" + +#: ../src/vikmapniklayer.c:1145 +msgid "_Rerender Tile" +msgstr "" + +#: ../src/vikmapniklayer.c:1150 +msgid "_Info" +msgstr "" + +#. ******* MAPZOOMS ******** +#: ../src/vikmapslayer.c:96 +msgid "Use Viking Zoom Level" +msgstr "" + +#: ../src/vikmapslayer.c:146 +msgid "OSM" +msgstr "" + +#. NB mode => id - But can't break file format just to rename something better +#: ../src/vikmapslayer.c:152 +msgid "Map Type:" +msgstr "" + +#: ../src/vikmapslayer.c:153 +msgid "Maps Directory:" +msgstr "" + +#: ../src/vikmapslayer.c:154 +msgid "Cache Layout:" +msgstr "" + +#: ../src/vikmapslayer.c:155 +msgid "This determines the tile storage layout on disk" +msgstr "" + +#: ../src/vikmapslayer.c:156 +msgid "Map File:" +msgstr "" + +#: ../src/vikmapslayer.c:157 +msgid "An MBTiles file. Only applies when the map type method is 'MBTiles'" +msgstr "" + +#: ../src/vikmapslayer.c:159 +msgid "Control the Alpha value for transparency effects" +msgstr "" + +#: ../src/vikmapslayer.c:160 +msgid "Autodownload maps:" +msgstr "" + +#: ../src/vikmapslayer.c:161 +msgid "Autodownload Only Gets Missing Maps:" +msgstr "" + +#: ../src/vikmapslayer.c:162 +msgid "" +"Using this option avoids attempting to update already acquired tiles. This " +"can be useful if you want to restrict the network usage, without having to " +"resort to manual control. Only applies when 'Autodownload Maps' is on." +msgstr "" + +#: ../src/vikmapslayer.c:163 +msgid "Zoom Level:" +msgstr "" + +#: ../src/vikmapslayer.c:164 +msgid "" +"Determines the method of displaying map tiles for the current zoom level. " +"'Viking Zoom Level' uses the best matching level, otherwise setting a fixed " +"value will always use map tiles of the specified value regardless of the " +"actual zoom level." +msgstr "" + +#: ../src/vikmapslayer.c:197 +msgid "_Maps Download" +msgstr "" + +#: ../src/vikmapslayer.c:197 +msgid "Maps Download" +msgstr "" + +#: ../src/vikmapslayer.c:213 ../src/vikutils.c:895 +msgid "Map" +msgstr "" + +#: ../src/vikmapslayer.c:306 +msgid "Default map layer directory:" +msgstr "" + +#: ../src/vikmapslayer.c:306 +msgid "Choose a directory to store cached Map tiles for this layer" +msgstr "" + +#: ../src/vikmapslayer.c:436 ../src/vikmapslayer.c:633 +msgid "Unknown map type" +msgstr "" + +#: ../src/vikmapslayer.c:664 +msgid "Unknown Map Zoom" +msgstr "" + +#: ../src/vikmapslayer.c:833 +#, c-format +msgid "Failed to open MBTiles file: %s" +msgstr "" + +#: ../src/vikmapslayer.c:856 +#, c-format +msgid "" +"New map cannot be displayed in the current drawmode.\n" +"Select \"%s\" from View menu to view it." +msgstr "" + +#: ../src/vikmapslayer.c:1314 +#, c-format +msgid "" +"Cowardly refusing to draw tiles or existence of tiles beyond %d zoom out " +"factor" +msgstr "" + +#. TODO: ?? count up the number of download errors somehow... +#: ../src/vikmapslayer.c:1667 +msgid "Failed to download tile" +msgstr "" + +#: ../src/vikmapslayer.c:1673 +msgid "Unable to save tile" +msgstr "" + +#: ../src/vikmapslayer.c:1799 +#, c-format +msgid "Redownloading up to %d %s map..." +msgid_plural "Redownloading up to %d %s maps..." +msgstr[0] "" +msgstr[1] "" + +#: ../src/vikmapslayer.c:1801 +#, c-format +msgid "Redownloading %d %s map..." +msgid_plural "Redownloading %d %s maps..." +msgstr[0] "" +msgstr[1] "" + +#: ../src/vikmapslayer.c:1805 ../src/vikmapslayer.c:1890 +#, c-format +msgid "Downloading %d %s map..." +msgid_plural "Downloading %d %s maps..." +msgstr[0] "" +msgstr[1] "" + +#: ../src/vikmapslayer.c:1969 +msgid "YES" +msgstr "" + +#: ../src/vikmapslayer.c:1973 ../src/vikmapslayer.c:1977 +msgid "NO" +msgstr "" + +#. NB Also handles .jpg automatically due to pixbuf_new_from () support - although just print png for now. +#: ../src/vikmapslayer.c:1980 +#, c-format +msgid "Source: %s (%d%s%d%s%d.%s %s)" +msgstr "" + +#: ../src/vikmapslayer.c:1983 +msgid "Source: Not available" +msgstr "" + +#: ../src/vikmapslayer.c:2000 +msgid "Source: file://" +msgstr "" + +#: ../src/vikmapslayer.c:2012 +#, c-format +msgid "Source: %s" +msgstr "" + +#: ../src/vikmapslayer.c:2038 +#, c-format +msgid "Tile File: %s [Not Available]" +msgstr "" + +#: ../src/vikmapslayer.c:2086 +msgid "Redownload _Bad Map(s)" +msgstr "" + +#: ../src/vikmapslayer.c:2090 +msgid "Redownload _New Map(s)" +msgstr "" + +#: ../src/vikmapslayer.c:2094 +msgid "Redownload _All Map(s)" +msgstr "" + +#: ../src/vikmapslayer.c:2099 +msgid "_Show Tile Information" +msgstr "" + +#: ../src/vikmapslayer.c:2166 +#, c-format +msgid "" +"Wrong drawmode for this map.\n" +"Select \"%s\" from View menu and try again." +msgstr "" + +#: ../src/vikmapslayer.c:2171 +msgid "Wrong zoom level for this map." +msgstr "" + +#: ../src/vikmapslayer.c:2334 +msgid "Zoom Start:" +msgstr "" + +#: ../src/vikmapslayer.c:2341 +msgid "Zoom End:" +msgstr "" + +#: ../src/vikmapslayer.c:2347 +msgid "Download Maps Method:" +msgstr "" + +#. redownload method - needs to align with REDOWNLOAD* macro values +#: ../src/vikmapslayer.c:2419 +msgid "Missing" +msgstr "" + +#: ../src/vikmapslayer.c:2419 +msgid "Bad" +msgstr "" + +#: ../src/vikmapslayer.c:2419 +msgid "New" +msgstr "" + +#: ../src/vikmapslayer.c:2419 +msgid "Reload All" +msgstr "" + +#: ../src/vikmapslayer.c:2421 +msgid "Download for Zoom Levels" +msgstr "" + +#: ../src/vikmapslayer.c:2461 +#, c-format +msgid "" +"You are not allowed to download more than %d tiles in one go (requested %d)" +msgstr "" + +#: ../src/vikmapslayer.c:2469 +#, c-format +msgid "Do you really want to download %d tiles?" +msgstr "" + +#. Now with icons +#: ../src/vikmapslayer.c:2509 +msgid "Download _Missing Onscreen Maps" +msgstr "" + +#: ../src/vikmapslayer.c:2516 +msgid "Download _New Onscreen Maps" +msgstr "" + +#: ../src/vikmapslayer.c:2523 +msgid "Reload _All Onscreen Maps" +msgstr "" + +#: ../src/vikmapslayer.c:2529 +msgid "Download Maps in _Zoom Levels..." +msgstr "" + +#: ../src/vikmapslayer.c:2539 +msgid "_Open MBTiles Files" +msgstr "" + +#: ../src/vikmapslayer.c:2554 +msgid "Flush Map Cache" +msgstr "" + +#: ../src/vikrouting.c:54 +msgid "Default engine:" +msgstr "" + +#: ../src/vikrouting.c:68 +msgid "Routing" +msgstr "" + +#: ../src/viktreeview.c:347 +msgid "Layer Name" +msgstr "" + +#: ../src/viktreeview.c:924 +#, c-format +msgid "delete data from %s\n" +msgstr "" + +#: ../src/viktrwlayer.c:427 +msgid "Create _Waypoint" +msgstr "" + +#: ../src/viktrwlayer.c:427 +msgid "Create Waypoint" +msgstr "" + +#: ../src/viktrwlayer.c:437 +msgid "Edit _Track" +msgstr "" + +#: ../src/viktrwlayer.c:437 +msgid "Edit Track" +msgstr "" + +#: ../src/viktrwlayer.c:449 +msgid "Edit _Route" +msgstr "" + +#: ../src/viktrwlayer.c:449 +msgid "Edit Route" +msgstr "" + +#: ../src/viktrwlayer.c:460 +msgid "Route _Finder" +msgstr "" + +#: ../src/viktrwlayer.c:460 +msgid "Route Finder" +msgstr "" + +#: ../src/viktrwlayer.c:471 +msgid "Splitter" +msgstr "" + +#: ../src/viktrwlayer.c:482 +msgid "_Edit Waypoint" +msgstr "" + +#: ../src/viktrwlayer.c:482 +msgid "Edit Waypoint" +msgstr "" + +#: ../src/viktrwlayer.c:495 +msgid "Edit Trac_kpoint" +msgstr "" + +#: ../src/viktrwlayer.c:495 +msgid "Edit Trackpoint" +msgstr "" + +#. a pixbuf for this one is already made globally available +#: ../src/viktrwlayer.c:508 +msgid "Show P_icture" +msgstr "" + +#: ../src/viktrwlayer.c:508 +msgid "Show Picture" +msgstr "" + +#: ../src/viktrwlayer.c:531 +msgid "Waypoint Images" +msgstr "" + +#: ../src/viktrwlayer.c:531 +msgid "Tracks Advanced" +msgstr "" + +#: ../src/viktrwlayer.c:531 +msgid "Metadata" +msgstr "" + +#: ../src/viktrwlayer.c:531 +msgid "Filesystem" +msgstr "" + +#: ../src/viktrwlayer.c:534 +msgid "Draw by Track" +msgstr "" + +#: ../src/viktrwlayer.c:534 +msgid "Draw by Speed" +msgstr "" + +#: ../src/viktrwlayer.c:534 +msgid "All Tracks Same Color" +msgstr "" + +#: ../src/viktrwlayer.c:535 +msgid "Filled Square" +msgstr "" + +#: ../src/viktrwlayer.c:535 +msgid "Square" +msgstr "" + +#: ../src/viktrwlayer.c:535 +msgid "Circle" +msgstr "" + +#: ../src/viktrwlayer.c:535 +msgid "X" +msgstr "" + +#: ../src/viktrwlayer.c:561 +msgid "Extra Extra Small" +msgstr "" + +#: ../src/viktrwlayer.c:562 +msgid "Extra Small" +msgstr "" + +#: ../src/viktrwlayer.c:566 +msgid "Extra Large" +msgstr "" + +#: ../src/viktrwlayer.c:567 +msgid "Extra Extra Large" +msgstr "" + +#: ../src/viktrwlayer.c:573 +msgid "Name Ascending" +msgstr "" + +#: ../src/viktrwlayer.c:574 +msgid "Name Descending" +msgstr "" + +#: ../src/viktrwlayer.c:582 ../src/viktrwlayer_propwin.c:3319 +msgid "No" +msgstr "" + +#: ../src/viktrwlayer.c:583 +msgid "Yes" +msgstr "" + +#: ../src/viktrwlayer.c:584 +msgid "No write" +msgstr "" + +#: ../src/viktrwlayer.c:649 ../src/viktrwlayer.c:673 +msgid "Draw Labels" +msgstr "" + +#: ../src/viktrwlayer.c:650 +msgid "Note: the individual track controls what labels may be displayed" +msgstr "" + +#: ../src/viktrwlayer.c:651 +msgid "Track Labels Font Size:" +msgstr "" + +#: ../src/viktrwlayer.c:652 +msgid "Track Drawing Mode:" +msgstr "" + +#: ../src/viktrwlayer.c:653 +msgid "All Tracks Color:" +msgstr "All Tracks Colour:" + +#: ../src/viktrwlayer.c:654 +msgid "The color used when 'All Tracks Same Color' drawing mode is selected" +msgstr "The colour used when 'All Tracks Same Colour' drawing mode is selected" + +#: ../src/viktrwlayer.c:655 +msgid "Draw Track Lines" +msgstr "" + +#: ../src/viktrwlayer.c:656 +msgid "Track Thickness:" +msgstr "" + +#: ../src/viktrwlayer.c:657 +msgid "Draw Track Direction" +msgstr "" + +#: ../src/viktrwlayer.c:658 +msgid "Direction Size:" +msgstr "" + +#: ../src/viktrwlayer.c:659 +msgid "Draw Trackpoints" +msgstr "" + +#: ../src/viktrwlayer.c:660 +msgid "Trackpoint Size:" +msgstr "" + +#: ../src/viktrwlayer.c:661 +msgid "Draw Elevation" +msgstr "" + +#: ../src/viktrwlayer.c:662 +msgid "Draw Elevation Height %:" +msgstr "" + +#: ../src/viktrwlayer.c:663 +msgid "Draw Stops" +msgstr "" + +#: ../src/viktrwlayer.c:664 +msgid "" +"Whether to draw a marker when trackpoints are at the same position but over " +"the minimum stop length apart in time" +msgstr "" + +#: ../src/viktrwlayer.c:665 +msgid "Min Stop Length (seconds):" +msgstr "" + +#: ../src/viktrwlayer.c:667 +msgid "Track BG Thickness:" +msgstr "" + +#: ../src/viktrwlayer.c:668 +msgid "Track Background Color" +msgstr "Track Background Colour" + +#: ../src/viktrwlayer.c:669 +msgid "Draw by Speed Factor (%):" +msgstr "" + +#: ../src/viktrwlayer.c:670 +msgid "" +"The percentage factor away from the average speed determining the color used" +msgstr "" +"The percentage factor away from the average speed determining the colour used" + +#: ../src/viktrwlayer.c:671 +msgid "Track Sort Order:" +msgstr "" + +#: ../src/viktrwlayer.c:674 +msgid "Waypoint Font Size:" +msgstr "" + +#: ../src/viktrwlayer.c:675 +msgid "Waypoint Color:" +msgstr "Waypoint Colour:" + +#: ../src/viktrwlayer.c:676 +msgid "Waypoint Text:" +msgstr "" + +#: ../src/viktrwlayer.c:677 +msgid "Background:" +msgstr "" + +#: ../src/viktrwlayer.c:678 +msgid "Fake BG Color Translucency:" +msgstr "Fake BG Colour Translucency:" + +#: ../src/viktrwlayer.c:679 +msgid "Waypoint marker:" +msgstr "" + +#: ../src/viktrwlayer.c:680 +msgid "Waypoint size:" +msgstr "" + +#: ../src/viktrwlayer.c:681 +msgid "Draw Waypoint Symbols:" +msgstr "" + +#: ../src/viktrwlayer.c:682 +msgid "Waypoint Sort Order:" +msgstr "" + +#: ../src/viktrwlayer.c:684 +msgid "Draw Waypoint Images" +msgstr "" + +#: ../src/viktrwlayer.c:685 +msgid "Image Size (pixels):" +msgstr "" + +#: ../src/viktrwlayer.c:686 +msgid "Image Alpha:" +msgstr "" + +#: ../src/viktrwlayer.c:687 +msgid "Image Memory Cache Size:" +msgstr "" + +#: ../src/viktrwlayer.c:690 +msgid "Author" +msgstr "" + +#: ../src/viktrwlayer.c:691 +msgid "Creation Time" +msgstr "" + +#: ../src/viktrwlayer.c:692 +msgid "Keywords" +msgstr "" + +#: ../src/viktrwlayer.c:693 +msgid "External layer:" +msgstr "" + +#: ../src/viktrwlayer.c:693 +msgid "" +"Layer data stored in the Viking file, in an external file, or in an external " +"file but changes are not written to the file (file only loaded at startup)" +msgstr "" + +#: ../src/viktrwlayer.c:694 +msgid "Save layer as:" +msgstr "" + +#: ../src/viktrwlayer.c:694 +msgid "Specify where layer should be saved. Overwrites file if it exists." +msgstr "" + +#: ../src/viktrwlayer.c:798 +msgid "TrackWaypoint" +msgstr "" + +#: ../src/viktrwlayer.c:1999 ../src/viktrwlayer_propwin.c:1469 +#: ../src/viktrwlayer_propwin.c:1471 ../src/vikutils.c:299 +#: ../src/vikutils.c:326 +msgid "miles" +msgstr "" + +#: ../src/viktrwlayer.c:2002 ../src/viktrwlayer_propwin.c:1475 +#: ../src/viktrwlayer_propwin.c:1477 ../src/vikutils.c:303 +#: ../src/vikutils.c:330 +msgid "NM" +msgstr "" + +#. VIK_UNITS_DISTANCE_KILOMETRES: +#: ../src/viktrwlayer.c:2006 ../src/viktrwlayer_propwin.c:1482 +#: ../src/viktrwlayer_propwin.c:1484 ../src/vikutils.c:308 +#: ../src/vikutils.c:335 +msgid "km" +msgstr "" + +#: ../src/viktrwlayer.c:2121 +msgid "start/end" +msgstr "" + +#: ../src/viktrwlayer.c:2133 +msgid "start" +msgstr "" + +#: ../src/viktrwlayer.c:2142 +msgid "end" +msgstr "" + +#: ../src/viktrwlayer.c:3103 +#, c-format +msgid " in %d:%02d hrs:mins" +msgstr "" + +#: ../src/viktrwlayer.c:3107 +#, c-format +msgid "" +"\n" +"%sTotal Length %.1f %s%s" +msgstr "" + +#: ../src/viktrwlayer.c:3131 +#, c-format +msgid "" +"\n" +"Total route length %.1f %s" +msgstr "" + +#: ../src/viktrwlayer.c:3136 +#, c-format +msgid "Tracks: %d - Waypoints: %d - Routes: %d%s%s" +msgstr "" + +#: ../src/viktrwlayer.c:3155 +#, c-format +msgid "Tracks: %d" +msgstr "" + +#: ../src/viktrwlayer.c:3165 +#, c-format +msgid "Routes: %d" +msgstr "" + +#: ../src/viktrwlayer.c:3195 +#, c-format +msgid "- %d:%02d hrs:mins" +msgstr "" + +#: ../src/viktrwlayer.c:3202 +#, c-format +msgid "%s%.1f km %s" +msgstr "" + +#: ../src/viktrwlayer.c:3205 +#, c-format +msgid "%s%.1f miles %s" +msgstr "" + +#: ../src/viktrwlayer.c:3208 +#, c-format +msgid "%s%.1f NM %s" +msgstr "" + +#: ../src/viktrwlayer.c:3222 +#, c-format +msgid "Waypoints: %d" +msgstr "" + +#: ../src/viktrwlayer.c:3279 +#, c-format +msgid "Wpt: Alt %dft" +msgstr "" + +#. VIK_UNITS_HEIGHT_METRES: +#: ../src/viktrwlayer.c:3283 +#, c-format +msgid "Wpt: Alt %dm" +msgstr "" + +#. Add comment if available +#: ../src/viktrwlayer.c:3298 +#, c-format +msgid "%s | %s %s | Comment: %s" +msgstr "" + +#: ../src/viktrwlayer.c:3300 +#, c-format +msgid "%s | %s %s" +msgstr "" + +#: ../src/viktrwlayer.c:3562 ../src/viktrwlayer.c:3591 +msgid "This layer has no waypoints or trackpoints." +msgstr "" + +#: ../src/viktrwlayer.c:3598 ../src/viktrwlayer.c:3607 +#: ../src/viktrwlayer.c:3616 ../src/viktrwlayer.c:3625 +#: ../src/viktrwlayer.c:3634 ../src/viktrwlayer.c:3642 +msgid "Export Layer" +msgstr "" + +#: ../src/viktrwlayer.c:3671 +msgid "Export Route as GPX" +msgstr "" + +#: ../src/viktrwlayer.c:3673 +msgid "Export Track as GPX" +msgstr "" + +#: ../src/viktrwlayer.c:3693 +msgid "Find" +msgstr "" + +#: ../src/viktrwlayer.c:3703 +msgid "Waypoint Name:" +msgstr "" + +#: ../src/viktrwlayer.c:3720 +msgid "Waypoint not found in this layer." +msgstr "" + +#: ../src/viktrwlayer.c:3989 +msgid "Can not upload invisible track." +msgstr "" + +#: ../src/viktrwlayer.c:4082 ../src/viktrwlayer.c:10512 +msgid "Track" +msgstr "" + +#: ../src/viktrwlayer.c:4107 ../src/viktrwlayer.c:10599 +msgid "Route" +msgstr "" + +#: ../src/viktrwlayer.c:4194 +msgid "Externa_l" +msgstr "" + +#: ../src/viktrwlayer.c:4216 ../src/viktrwlayer.c:8456 +#: ../src/viktrwlayer.c:8574 +msgid "_Finish Route" +msgstr "" + +#: ../src/viktrwlayer.c:4218 ../src/viktrwlayer.c:8380 +#: ../src/viktrwlayer.c:8572 +msgid "_Finish Track" +msgstr "" + +#. Now with icons +#: ../src/viktrwlayer.c:4230 +msgid "_View Layer" +msgstr "" + +#: ../src/viktrwlayer.c:4237 +msgid "V_iew" +msgstr "" + +#: ../src/viktrwlayer.c:4243 +msgid "View All _Tracks" +msgstr "" + +#: ../src/viktrwlayer.c:4248 +msgid "View All _Routes" +msgstr "" + +#: ../src/viktrwlayer.c:4253 +msgid "View All _Waypoints" +msgstr "" + +#: ../src/viktrwlayer.c:4258 +msgid "_Goto Center of Layer" +msgstr "" + +#: ../src/viktrwlayer.c:4264 ../src/viktrwlayer.c:8321 +msgid "Goto _Waypoint..." +msgstr "" + +#: ../src/viktrwlayer.c:4270 +msgid "_Export Layer" +msgstr "" + +#: ../src/viktrwlayer.c:4276 +msgid "Export as GPS_Point..." +msgstr "" + +#: ../src/viktrwlayer.c:4281 +msgid "Export as GPS_Mapper..." +msgstr "" + +#: ../src/viktrwlayer.c:4286 +msgid "Export as _GPX..." +msgstr "" + +#: ../src/viktrwlayer.c:4292 +msgid "Export as _KML..." +msgstr "" + +#: ../src/viktrwlayer.c:4299 +msgid "Export as GEO_JSON..." +msgstr "" + +#: ../src/viktrwlayer.c:4306 +msgid "Export via GPSbabel..." +msgstr "" + +#: ../src/viktrwlayer.c:4312 +#, c-format +msgid "Open with External Program_1: %s" +msgstr "" + +#: ../src/viktrwlayer.c:4319 +#, c-format +msgid "Open with External Program_2: %s" +msgstr "" + +#: ../src/viktrwlayer.c:4327 ../src/vikwindow.c:4825 +msgid "_New" +msgstr "" + +#: ../src/viktrwlayer.c:4333 +msgid "New _Waypoint..." +msgstr "" + +#: ../src/viktrwlayer.c:4339 +msgid "New _Track" +msgstr "" + +#: ../src/viktrwlayer.c:4347 +msgid "New _Route" +msgstr "" + +#: ../src/viktrwlayer.c:4356 ../src/viktrwlayer.c:8232 +#: ../src/viktrwlayer.c:9003 +msgid "Geotag _Images..." +msgstr "" + +#: ../src/viktrwlayer.c:4363 +msgid "_Acquire" +msgstr "" + +#: ../src/viktrwlayer.c:4369 ../src/vikwindow.c:4904 +msgid "From _GPS..." +msgstr "" + +#. FIXME: only add menu when at least a routing engine has support for Directions +#: ../src/viktrwlayer.c:4375 +msgid "From _Directions..." +msgstr "" + +#: ../src/viktrwlayer.c:4381 +msgid "From _OSM Traces..." +msgstr "" + +#: ../src/viktrwlayer.c:4386 +msgid "From _My OSM Traces..." +msgstr "" + +#: ../src/viktrwlayer.c:4392 ../src/vikwindow.c:4844 +msgid "From _URL..." +msgstr "" + +#: ../src/viktrwlayer.c:4399 ../src/vikwindow.c:4846 +msgid "From _Wikipedia Waypoints" +msgstr "" + +#: ../src/viktrwlayer.c:4405 +msgid "Within _Layer Bounds" +msgstr "" + +#: ../src/viktrwlayer.c:4411 +msgid "Within _Current View" +msgstr "" + +#: ../src/viktrwlayer.c:4419 +msgid "From Geo_caching..." +msgstr "" + +#: ../src/viktrwlayer.c:4426 ../src/vikwindow.c:4842 +msgid "From Geotagged _Images..." +msgstr "" + +#: ../src/viktrwlayer.c:4433 +msgid "From _File..." +msgstr "" + +#: ../src/viktrwlayer.c:4436 ../src/vikwindow.c:4905 +msgid "Import File With GPS_Babel..." +msgstr "" + +#: ../src/viktrwlayer.c:4443 ../src/viktrwlayer.c:8905 +msgid "_Upload" +msgstr "" + +#: ../src/viktrwlayer.c:4449 +msgid "Upload to _GPS..." +msgstr "" + +#: ../src/viktrwlayer.c:4456 ../src/viktrwlayer.c:8973 +msgid "Upload to _OSM..." +msgstr "" + +#: ../src/viktrwlayer.c:4464 +msgid "De_lete" +msgstr "" + +#: ../src/viktrwlayer.c:4470 +msgid "Delete All _Tracks" +msgstr "" + +#: ../src/viktrwlayer.c:4477 +msgid "Delete Tracks _From Selection..." +msgstr "" + +#: ../src/viktrwlayer.c:4484 ../src/viktrwlayer.c:8481 +msgid "Delete _All Routes" +msgstr "" + +#: ../src/viktrwlayer.c:4491 ../src/viktrwlayer.c:8487 +msgid "_Delete Routes From Selection..." +msgstr "" + +#: ../src/viktrwlayer.c:4498 +msgid "Delete All _Waypoints" +msgstr "" + +#: ../src/viktrwlayer.c:4505 +msgid "Delete Waypoints From _Selection..." +msgstr "" + +#: ../src/viktrwlayer.c:4512 ../src/viktrwlayer.c:8339 +msgid "Delete Duplicate Waypoints" +msgstr "" + +#: ../src/viktrwlayer.c:5198 +#, c-format +msgid "Are you sure you want to delete all tracks in %s?" +msgstr "" + +#: ../src/viktrwlayer.c:5211 +#, c-format +msgid "Are you sure you want to delete all routes in %s?" +msgstr "" + +#: ../src/viktrwlayer.c:5221 +#, c-format +msgid "Are you sure you want to delete all waypoints in %s?" +msgstr "" + +#: ../src/viktrwlayer.c:5238 +#, c-format +msgid "Are you sure you want to delete the waypoint \"%s\"?" +msgstr "" + +#: ../src/viktrwlayer.c:5254 +#, c-format +msgid "Are you sure you want to delete the track \"%s\"?" +msgstr "" + +#: ../src/viktrwlayer.c:5271 +#, c-format +msgid "Are you sure you want to delete the route \"%s\"?" +msgstr "" + +#: ../src/viktrwlayer.c:5527 ../src/viktrwlayer.c:6373 +msgid "" +"Converting a track to a route removes extra track data such as segments, " +"timestamps, etc...\n" +"Do you want to continue?" +msgstr "" + +#: ../src/viktrwlayer.c:5631 +msgid "No DEM layers available, thus no DEM values can be applied." +msgstr "" + +#: ../src/viktrwlayer.c:5651 ../src/viktrwlayer.c:5692 +#, c-format +msgid "%ld point adjusted" +msgid_plural "%ld points adjusted" +msgstr[0] "" +msgstr[1] "" + +#: ../src/viktrwlayer.c:5736 +#, c-format +msgid "%ld waypoint changed" +msgid_plural "%ld waypoints changed" +msgstr[0] "" +msgstr[1] "" + +#: ../src/viktrwlayer.c:5917 +#, c-format +msgid "" +"Refining a track with many points (%d) is unlikely to yield sensible " +"results. Do you want to Continue?" +msgstr "" + +#. Select engine from dialog +#: ../src/viktrwlayer.c:5925 +msgid "Refine Route with Routing Engine..." +msgstr "" + +#: ../src/viktrwlayer.c:5933 +msgid "Select routing engine" +msgstr "" + +#: ../src/viktrwlayer.c:6158 +msgid "Failed. No other tracks with timestamps in this layer found" +msgstr "" + +#: ../src/viktrwlayer.c:6160 +msgid "Failed. No other tracks without timestamps in this layer found" +msgstr "" + +#: ../src/viktrwlayer.c:6179 +msgid "Merge with..." +msgstr "" + +#: ../src/viktrwlayer.c:6180 +msgid "Select route to merge with" +msgstr "" + +#: ../src/viktrwlayer.c:6180 +msgid "Select track to merge with" +msgstr "" + +#: ../src/viktrwlayer.c:6264 ../src/viktrwlayer.c:6346 +msgid "Append Route" +msgstr "" + +#: ../src/viktrwlayer.c:6264 ../src/viktrwlayer.c:6346 +msgid "Append Track" +msgstr "" + +#: ../src/viktrwlayer.c:6265 +msgid "Select the route to append after the current route" +msgstr "" + +#: ../src/viktrwlayer.c:6266 +msgid "Select the track to append after the current track" +msgstr "" + +#: ../src/viktrwlayer.c:6347 +msgid "Select the track to append after the current route" +msgstr "" + +#: ../src/viktrwlayer.c:6348 +msgid "Select the route to append after the current track" +msgstr "" + +#: ../src/viktrwlayer.c:6414 +#, c-format +msgid "%d segment merged" +msgid_plural "%d segments merged" +msgstr[0] "" +msgstr[1] "" + +#: ../src/viktrwlayer.c:6430 +msgid "Failed. This track does not have timestamp" +msgstr "" + +#: ../src/viktrwlayer.c:6442 +msgid "Failed. No other track in this layer has timestamp" +msgstr "" + +#: ../src/viktrwlayer.c:6449 +msgid "Merge Threshold..." +msgstr "" + +#: ../src/viktrwlayer.c:6450 +msgid "Merge when time between tracks less than:" +msgstr "" + +#: ../src/viktrwlayer.c:6580 +msgid "Split Threshold..." +msgstr "" + +#: ../src/viktrwlayer.c:6581 +msgid "Split when time between trackpoints exceeds:" +msgstr "" + +#: ../src/viktrwlayer.c:6598 +#, c-format +msgid "" +"Can not split track due to trackpoints not ordered in time - such as at %s.\n" +"\n" +"Goto this trackpoint?" +msgstr "" + +#: ../src/viktrwlayer.c:6668 +msgid "Split Every Nth Point" +msgstr "" + +#: ../src/viktrwlayer.c:6669 +msgid "Split on every Nth point:" +msgstr "" + +#: ../src/viktrwlayer.c:6779 +msgid "Can not split track as it has no segments" +msgstr "" + +#: ../src/viktrwlayer.c:6861 ../src/viktrwlayer.c:6891 +#, c-format +msgid "Deleted %ld point" +msgid_plural "Deleted %ld points" +msgstr[0] "" +msgstr[1] "" + +#: ../src/viktrwlayer.c:6966 ../src/viktrwlayer.c:10989 +#: ../src/viktrwlayer_waypointlist.c:214 +#, c-format +msgid "Could not launch %s to open file." +msgstr "" + +#: ../src/viktrwlayer.c:6992 ../src/viktrwlayer.c:7113 +msgid "This track has no date information." +msgstr "" + +#: ../src/viktrwlayer.c:7006 ../src/viktrwlayer.c:7136 +msgid "This waypoint has no date information." +msgstr "" + +#: ../src/viktrwlayer.c:7030 +#, c-format +msgid "Could not launch %s" +msgstr "" + +#: ../src/viktrwlayer.c:7269 +msgid "Internal Error in vik_trw_layer_uniquify_tracks" +msgstr "" + +#: ../src/viktrwlayer.c:7374 ../src/viktrwlayer.c:7424 +#: ../src/viktrwlayer.c:7587 +msgid "" +"Multiple entries with the same name exist. This method only works with " +"unique names. Force unique names now?" +msgstr "" + +#: ../src/viktrwlayer.c:7385 +msgid "No tracks found" +msgstr "" + +#: ../src/viktrwlayer.c:7393 ../src/viktrwlayer.c:7443 +#: ../src/viktrwlayer.c:7607 +msgid "Delete Selection" +msgstr "" + +#: ../src/viktrwlayer.c:7394 +msgid "Select tracks to delete" +msgstr "" + +#: ../src/viktrwlayer.c:7435 +msgid "No routes found" +msgstr "" + +#: ../src/viktrwlayer.c:7444 +msgid "Select routes to delete" +msgstr "" + +#: ../src/viktrwlayer.c:7550 +msgid "Internal Error in vik_trw_layer_uniquify_waypoints" +msgstr "" + +#: ../src/viktrwlayer.c:7597 +msgid "No waypoints found" +msgstr "" + +#: ../src/viktrwlayer.c:7608 +msgid "Select waypoints to delete" +msgstr "" + +#: ../src/viktrwlayer.c:7691 +#, c-format +msgid "%ld waypoint deleted" +msgid_plural "%ld waypoints deleted" +msgstr[0] "" +msgstr[1] "" + +#: ../src/viktrwlayer.c:7697 +msgid "No duplicates found" +msgstr "" + +#: ../src/viktrwlayer.c:8028 +#, c-format +msgid "" +"A waypoint with the name \"%s\" already exists. Really rename to the same " +"name?" +msgstr "" + +#: ../src/viktrwlayer.c:8058 +#, c-format +msgid "" +"A track with the name \"%s\" already exists. Really rename to the same name?" +msgstr "" + +#: ../src/viktrwlayer.c:8095 +#, c-format +msgid "" +"A route with the name \"%s\" already exists. Really rename to the same name?" +msgstr "" + +#: ../src/viktrwlayer.c:8215 ../src/viktrwlayer.c:8602 +msgid "_Goto" +msgstr "" + +#: ../src/viktrwlayer.c:8226 +msgid "_Visit Geocache Webpage" +msgstr "" + +#: ../src/viktrwlayer.c:8235 +msgid "Geotag multiple images against this waypoint" +msgstr "" + +#: ../src/viktrwlayer.c:8245 ../src/viktrwlayer_waypointlist.c:352 +msgid "_Show Picture..." +msgstr "" + +#: ../src/viktrwlayer.c:8253 +msgid "Update Geotag on _Image" +msgstr "" + +#: ../src/viktrwlayer.c:8259 +msgid "_Update" +msgstr "" + +#: ../src/viktrwlayer.c:8264 +msgid "Update and _Keep File Timestamp" +msgstr "" + +#: ../src/viktrwlayer.c:8276 +msgid "Visit _Webpage" +msgstr "" + +#: ../src/viktrwlayer.c:8306 +msgid "_New Waypoint..." +msgstr "" + +#: ../src/viktrwlayer.c:8315 +msgid "_View All Waypoints" +msgstr "" + +#: ../src/viktrwlayer.c:8327 +msgid "Delete _All Waypoints" +msgstr "" + +#: ../src/viktrwlayer.c:8333 +msgid "_Delete Waypoints From Selection..." +msgstr "" + +#: ../src/viktrwlayer.c:8351 +msgid "_Show All Waypoints" +msgstr "" + +#: ../src/viktrwlayer.c:8357 +msgid "_Hide All Waypoints" +msgstr "" + +#: ../src/viktrwlayer.c:8369 +msgid "_List Waypoints..." +msgstr "" + +#: ../src/viktrwlayer.c:8390 +msgid "_View All Tracks" +msgstr "" + +#: ../src/viktrwlayer.c:8396 +msgid "_New Track" +msgstr "" + +#: ../src/viktrwlayer.c:8404 +msgid "Delete _All Tracks" +msgstr "" + +#: ../src/viktrwlayer.c:8410 +msgid "_Delete Tracks From Selection..." +msgstr "" + +#: ../src/viktrwlayer.c:8422 +msgid "_Show All Tracks" +msgstr "" + +#: ../src/viktrwlayer.c:8428 +msgid "_Hide All Tracks" +msgstr "" + +#: ../src/viktrwlayer.c:8439 +msgid "_List Tracks..." +msgstr "" + +#: ../src/viktrwlayer.c:8467 +msgid "_View All Routes" +msgstr "" + +#: ../src/viktrwlayer.c:8473 +msgid "_New Route" +msgstr "" + +#: ../src/viktrwlayer.c:8499 +msgid "_Show All Routes" +msgstr "" + +#: ../src/viktrwlayer.c:8505 +msgid "_Hide All Routes" +msgstr "" + +#: ../src/viktrwlayer.c:8516 +msgid "_List Routes..." +msgstr "" + +#: ../src/viktrwlayer.c:8587 +msgid "_View Track" +msgstr "" + +#: ../src/viktrwlayer.c:8589 +msgid "_View Route" +msgstr "" + +#: ../src/viktrwlayer.c:8608 +msgid "_Startpoint" +msgstr "" + +#: ../src/viktrwlayer.c:8614 +msgid "\"_Center\"" +msgstr "" + +#: ../src/viktrwlayer.c:8620 +msgid "_Endpoint" +msgstr "" + +#: ../src/viktrwlayer.c:8626 +msgid "_Highest Altitude" +msgstr "" + +#: ../src/viktrwlayer.c:8632 +msgid "_Lowest Altitude" +msgstr "" + +#: ../src/viktrwlayer.c:8640 +msgid "_Maximum Speed" +msgstr "" + +#: ../src/viktrwlayer.c:8646 +msgid "_Date" +msgstr "" + +#: ../src/viktrwlayer.c:8655 +msgid "Co_mbine" +msgstr "" + +#: ../src/viktrwlayer.c:8663 +msgid "_Merge By Time..." +msgstr "" + +#: ../src/viktrwlayer.c:8668 +msgid "Merge _Segments" +msgstr "" + +#: ../src/viktrwlayer.c:8675 +msgid "Merge _With Other Tracks..." +msgstr "" + +#: ../src/viktrwlayer.c:8682 +msgid "_Append Track..." +msgstr "" + +#: ../src/viktrwlayer.c:8684 +msgid "_Append Route..." +msgstr "" + +#: ../src/viktrwlayer.c:8690 +msgid "Append _Route..." +msgstr "" + +#: ../src/viktrwlayer.c:8692 +msgid "Append _Track..." +msgstr "" + +#: ../src/viktrwlayer.c:8699 +msgid "_Split" +msgstr "" + +#: ../src/viktrwlayer.c:8707 +msgid "_Split By Time..." +msgstr "" + +#. ATM always enable this entry - don't want to have to analyse the track before displaying the menu - to keep the menu speedy +#: ../src/viktrwlayer.c:8713 +msgid "Split Se_gments" +msgstr "" + +#: ../src/viktrwlayer.c:8719 +msgid "Split By _Number of Points..." +msgstr "" + +#: ../src/viktrwlayer.c:8724 +msgid "Split at _Trackpoint" +msgstr "" + +#: ../src/viktrwlayer.c:8732 +msgid "_Insert Points" +msgstr "" + +#: ../src/viktrwlayer.c:8738 +msgid "Insert Point _Before Selected Point" +msgstr "" + +#: ../src/viktrwlayer.c:8745 +msgid "Insert Point _After Selected Point" +msgstr "" + +#: ../src/viktrwlayer.c:8754 +msgid "Delete Poi_nts" +msgstr "" + +#: ../src/viktrwlayer.c:8760 +msgid "Delete _Selected Point" +msgstr "" + +#: ../src/viktrwlayer.c:8768 +msgid "Delete Points With The Same _Position" +msgstr "" + +#: ../src/viktrwlayer.c:8773 +msgid "Delete Points With The Same _Time" +msgstr "" + +#: ../src/viktrwlayer.c:8780 ../src/viktrwlayer.c:9029 +msgid "_Transform" +msgstr "" + +#: ../src/viktrwlayer.c:8788 ../src/viktrwlayer.c:9037 +msgid "_Apply DEM Data" +msgstr "" + +#: ../src/viktrwlayer.c:8793 ../src/viktrwlayer.c:9042 +msgid "_Overwrite" +msgstr "" + +#: ../src/viktrwlayer.c:8796 ../src/viktrwlayer.c:9045 +msgid "Overwrite any existing elevation values with DEM values" +msgstr "" + +#: ../src/viktrwlayer.c:8799 ../src/viktrwlayer.c:9048 +msgid "_Keep Existing" +msgstr "" + +#: ../src/viktrwlayer.c:8802 ../src/viktrwlayer.c:9051 +msgid "Keep existing elevation values, only attempt for missing values" +msgstr "" + +#: ../src/viktrwlayer.c:8807 +msgid "_Smooth Missing Elevation Data" +msgstr "" + +#: ../src/viktrwlayer.c:8812 +msgid "_Interpolated" +msgstr "" + +#: ../src/viktrwlayer.c:8815 +msgid "" +"Interpolate between known elevation values to derive values for the missing " +"elevations" +msgstr "" + +#: ../src/viktrwlayer.c:8818 +msgid "_Flat" +msgstr "" + +#: ../src/viktrwlayer.c:8821 +msgid "Set unknown elevation values to the last known value" +msgstr "" + +#: ../src/viktrwlayer.c:8825 +msgid "C_onvert to a Route" +msgstr "" + +#: ../src/viktrwlayer.c:8827 +msgid "C_onvert to a Track" +msgstr "" + +#: ../src/viktrwlayer.c:8835 +msgid "_Anonymize Times" +msgstr "" + +#: ../src/viktrwlayer.c:8838 +msgid "Shift timestamps to a relative offset from 1901-01-01" +msgstr "" + +#: ../src/viktrwlayer.c:8841 +msgid "_Interpolate Times" +msgstr "" + +#: ../src/viktrwlayer.c:8844 +msgid "" +"Reset trackpoint timestamps between the first and last points such that " +"track is traveled at equal speed" +msgstr "" + +#: ../src/viktrwlayer.c:8849 +msgid "_Reverse Track" +msgstr "" + +#: ../src/viktrwlayer.c:8851 +msgid "_Reverse Route" +msgstr "" + +#: ../src/viktrwlayer.c:8858 +msgid "Refine Route..." +msgstr "" + +#: ../src/viktrwlayer.c:8868 +msgid "Down_load Maps Along Track..." +msgstr "" + +#: ../src/viktrwlayer.c:8870 +msgid "Down_load Maps Along Route..." +msgstr "" + +#: ../src/viktrwlayer.c:8878 +msgid "_Export Track as GPX..." +msgstr "" + +#: ../src/viktrwlayer.c:8880 +msgid "_Export Route as GPX..." +msgstr "" + +#: ../src/viktrwlayer.c:8887 +msgid "E_xtend Track End" +msgstr "" + +#: ../src/viktrwlayer.c:8889 +msgid "E_xtend Route End" +msgstr "" + +#: ../src/viktrwlayer.c:8896 +msgid "Extend _Using Route Finder" +msgstr "" + +#: ../src/viktrwlayer.c:8911 +msgid "_Upload to GPS..." +msgstr "" + +#: ../src/viktrwlayer.c:8926 +msgid "_Diary" +msgstr "" + +#: ../src/viktrwlayer.c:8930 +msgid "Open diary program at this date" +msgstr "" + +#: ../src/viktrwlayer.c:8935 +msgid "_Astronomy" +msgstr "" + +#: ../src/viktrwlayer.c:8938 +msgid "Open astronomy program at this date and location" +msgstr "" + +#: ../src/viktrwlayer.c:8962 +msgid "_View Google Directions" +msgstr "" + +#: ../src/viktrwlayer.c:8984 +msgid "Use with _Filter" +msgstr "" + +#: ../src/viktrwlayer.c:9018 +msgid "_Edit Trackpoint" +msgstr "" + +#: ../src/viktrwlayer.c:10116 +#, c-format +msgid " - Gain %dm:Loss %dm" +msgstr "" + +#: ../src/viktrwlayer.c:10118 +#, c-format +msgid " - Gain %dft:Loss %dft" +msgstr "" + +#: ../src/viktrwlayer.c:10123 +#, c-format +msgid " - Bearing %3.1f° - Step %s" +msgstr "" + +#: ../src/viktrwlayer.c:10232 +#, c-format +msgid "Querying %s for route between (%.3f, %.3f) and (%.3f, %.3f)." +msgstr "" + +#: ../src/viktrwlayer.c:10248 +#, c-format +msgid "%s returned route between (%.3f, %.3f) and (%.3f, %.3f)." +msgstr "" + +#: ../src/viktrwlayer.c:10251 +#, c-format +msgid "Error getting route from %s." +msgstr "" + +#: ../src/viktrwlayer.c:11070 +#, c-format +msgid "Creating %d Image Thumbnails..." +msgstr "" + +#: ../src/viktrwlayer.c:11560 +msgid "No map layer in use. Create one first" +msgstr "" + +#: ../src/viktrwlayer.c:11679 +#, c-format +msgid "%s: Track List" +msgstr "" + +#: ../src/viktrwlayer.c:11681 +#, c-format +msgid "%s: Route List" +msgstr "" + +#: ../src/viktrwlayer.c:11734 +#, c-format +msgid "" +"Could not write external layer %s to %s, please fix and save before exiting " +"or data will be lost" +msgstr "" + +#: ../src/viktrwlayer.c:11782 +#, c-format +msgid "WARNING: issues encountered loading external layer %s from %s" +msgstr "" + +#: ../src/viktrwlayer_export.c:47 +msgid "Auto Device GPX Simplify:" +msgstr "" + +#: ../src/viktrwlayer_export.c:48 +msgid "" +"GPX saves to certain devices will be simplified for device compatibility." +msgstr "" + +#: ../src/viktrwlayer_export.c:125 +#, c-format +msgid "Export of GPX file simplified using point limit: %d" +msgstr "" + +#: ../src/viktrwlayer_export.c:206 ../src/viktrwlayer_export.c:323 +#: ../src/vikwindow.c:3694 +msgid "The filename you requested could not be opened for writing." +msgstr "" + +#: ../src/viktrwlayer_export.c:226 +#, c-format +msgid "Could not launch %s." +msgstr "" + +#: ../src/viktrwlayer_export.c:234 +msgid "Could not create temporary file for export." +msgstr "" + +#: ../src/viktrwlayer_export.c:268 +msgid "File format:" +msgstr "" + +#: ../src/viktrwlayer_export.c:276 +msgid "Select the file format." +msgstr "" + +#: ../src/viktrwlayer_export.c:281 +msgid "" +"Select the information to process.\n" +"Warning: the behavior of these switches is highly dependent of the file " +"format selected.\n" +"Please, refer to GPSbabel if unsure." +msgstr "" + +#: ../src/viktrwlayer_export.c:308 +msgid "You did not select a valid file format." +msgstr "" + +#: ../src/viktrwlayer_propwin.c:915 ../src/viktrwlayer_propwin.c:3381 +#: ../src/viktrwlayer_propwin.c:3417 ../src/viktrwlayer_propwin.c:3457 +#: ../src/viktrwlayer_propwin.c:3509 ../src/viktrwlayer_propwin.c:3527 +#: ../src/viktrwlayer_propwin.c:3600 ../src/viktrwlayer_propwin.c:3601 +#: ../src/viktrwlayer_propwin.c:3602 ../src/viktrwlayer_propwin.c:3611 +#: ../src/viktrwlayer_propwin.c:3612 ../src/viktrwlayer_propwin.c:3629 +#: ../src/viktrwlayer_propwin.c:3630 ../src/viktrwlayer_propwin.c:3644 +#: ../src/viktrwlayer_propwin.c:3645 ../src/viktrwlayer_propwin.c:3646 +#: ../src/viktrwlayer_propwin.c:3660 ../src/viktrwlayer_propwin.c:3661 +#: ../src/viktrwlayer_propwin.c:3662 ../src/viktrwlayer_propwin.c:3676 +#: ../src/viktrwlayer_propwin.c:3677 ../src/viktrwlayer_propwin.c:3678 +#: ../src/viktrwlayer_propwin.c:3695 ../src/viktrwlayer_propwin.c:3696 +#: ../src/viktrwlayer_analysis.c:293 +#, c-format +msgid "No Data" +msgstr "" + +#: ../src/viktrwlayer_propwin.c:960 ../src/viktrwlayer_propwin.c:1245 +#, c-format +msgid "%.1f kph" +msgstr "" + +#: ../src/viktrwlayer_propwin.c:963 ../src/viktrwlayer_propwin.c:1248 +#: ../src/viktrwlayer_analysis.c:352 +#, c-format +msgid "%.1f mph" +msgstr "" + +#: ../src/viktrwlayer_propwin.c:966 ../src/viktrwlayer_propwin.c:1251 +#, c-format +msgid "%.1f knots" +msgstr "" + +#: ../src/viktrwlayer_propwin.c:969 ../src/viktrwlayer_propwin.c:1254 +#, c-format +msgid "%.1f s/km" +msgstr "" + +#: ../src/viktrwlayer_propwin.c:972 ../src/viktrwlayer_propwin.c:1257 +#: ../src/viktrwlayer_analysis.c:389 ../src/viktrwlayer_analysis.c:392 +#, c-format +msgid "%.1f min/km" +msgstr "" + +#: ../src/viktrwlayer_propwin.c:975 ../src/viktrwlayer_propwin.c:1260 +#, c-format +msgid "%.1f sec/mi" +msgstr "" + +#: ../src/viktrwlayer_propwin.c:978 ../src/viktrwlayer_propwin.c:1263 +#: ../src/viktrwlayer_analysis.c:409 ../src/viktrwlayer_analysis.c:412 +#, c-format +msgid "%.1f min/mi" +msgstr "" + +#. VIK_UNITS_SPEED_METRES_PER_SECOND: +#: ../src/viktrwlayer_propwin.c:982 ../src/viktrwlayer_propwin.c:1267 +#, c-format +msgid "%.1f m/s" +msgstr "" + +#. Minutes +#: ../src/viktrwlayer_propwin.c:1411 +msgid "mins" +msgstr "" + +#. Hours +#: ../src/viktrwlayer_propwin.c:1418 +msgid "h" +msgstr "" + +#. Days +#: ../src/viktrwlayer_propwin.c:1424 +msgid "d" +msgstr "" + +#. Weeks +#: ../src/viktrwlayer_propwin.c:1429 +msgid "w" +msgstr "" + +#. 'Months' +#: ../src/viktrwlayer_propwin.c:1433 +msgid "M" +msgstr "" + +#: ../src/viktrwlayer_propwin.c:2051 ../src/viktrwlayer_analysis.c:303 +#, c-format +msgid "%.1f miles" +msgstr "" + +#: ../src/viktrwlayer_propwin.c:2054 ../src/viktrwlayer_analysis.c:306 +#, c-format +msgid "%.1f NM" +msgstr "" + +#. VIK_UNITS_DISTANCE_KILOMETRES +#: ../src/viktrwlayer_propwin.c:2057 ../src/viktrwlayer_analysis.c:310 +#, c-format +msgid "%.1f km" +msgstr "" + +#: ../src/viktrwlayer_propwin.c:3083 +msgid "Failed spliting track. Track unchanged" +msgstr "" + +#: ../src/viktrwlayer_propwin.c:3234 ../src/viktrwlayer_propwin.c:3744 +#, c-format +msgid "%s - Track Properties" +msgstr "" + +#: ../src/viktrwlayer_propwin.c:3239 +msgid "Split at _Marker" +msgstr "" + +#: ../src/viktrwlayer_propwin.c:3240 +msgid "Split _Segments" +msgstr "" + +#: ../src/viktrwlayer_propwin.c:3241 +msgid "_Reverse" +msgstr "" + +#: ../src/viktrwlayer_propwin.c:3242 +msgid "_Delete Dupl." +msgstr "" + +#: ../src/viktrwlayer_propwin.c:3269 +msgid "Comment:" +msgstr "" + +#: ../src/viktrwlayer_propwin.c:3270 +msgid "Description:" +msgstr "" + +#: ../src/viktrwlayer_propwin.c:3271 +#, fuzzy +msgid "Source:" +msgstr "Colour:" + +#: ../src/viktrwlayer_propwin.c:3272 +#, fuzzy +msgid "Type:" +msgstr "Colour:" + +#: ../src/viktrwlayer_propwin.c:3273 +msgid "Color:" +msgstr "Colour:" + +#: ../src/viktrwlayer_propwin.c:3274 +msgid "Draw Name:" +msgstr "" + +#: ../src/viktrwlayer_propwin.c:3275 +msgid "Distance Labels:" +msgstr "" + +#: ../src/viktrwlayer_propwin.c:3278 +msgid "Track Length:" +msgstr "" + +#: ../src/viktrwlayer_propwin.c:3279 +msgid "Trackpoints:" +msgstr "" + +#: ../src/viktrwlayer_propwin.c:3280 +msgid "Segments:" +msgstr "" + +#: ../src/viktrwlayer_propwin.c:3281 +msgid "Duplicate Points:" +msgstr "" + +#: ../src/viktrwlayer_propwin.c:3282 +msgid "Max Speed:" +msgstr "" + +#: ../src/viktrwlayer_propwin.c:3283 +msgid "Avg. Speed:" +msgstr "" + +#: ../src/viktrwlayer_propwin.c:3284 +msgid "Moving Avg. Speed:" +msgstr "" + +#: ../src/viktrwlayer_propwin.c:3285 +msgid "Avg. Dist. Between TPs:" +msgstr "" + +#: ../src/viktrwlayer_propwin.c:3286 +msgid "Elevation Range:" +msgstr "" + +#: ../src/viktrwlayer_propwin.c:3287 +msgid "Total Elevation Gain/Loss:" +msgstr "" + +#: ../src/viktrwlayer_propwin.c:3288 +msgid "Start:" +msgstr "" + +#: ../src/viktrwlayer_propwin.c:3289 +msgid "End:" +msgstr "" + +#: ../src/viktrwlayer_propwin.c:3290 +msgid "Duration:" +msgstr "" + +#: ../src/viktrwlayer_propwin.c:3320 +msgid "Centre" +msgstr "" + +#: ../src/viktrwlayer_propwin.c:3321 +msgid "Start only" +msgstr "" + +#: ../src/viktrwlayer_propwin.c:3322 +msgid "End only" +msgstr "" + +#: ../src/viktrwlayer_propwin.c:3323 +msgid "Start and End" +msgstr "" + +#: ../src/viktrwlayer_propwin.c:3324 +msgid "Centre, Start and End" +msgstr "" + +#: ../src/viktrwlayer_propwin.c:3336 +msgid "Maximum number of distance labels to be shown" +msgstr "" + +#: ../src/viktrwlayer_propwin.c:3340 +msgid "Properties" +msgstr "" + +#: ../src/viktrwlayer_propwin.c:3584 +#, c-format +msgid "%d minutes - %d minutes moving" +msgstr "" + +#: ../src/viktrwlayer_propwin.c:3596 +#, c-format +msgid "%s total - %s in segments" +msgstr "" + +#: ../src/viktrwlayer_propwin.c:3607 ../src/viktrwlayer_analysis.c:622 +msgid "Statistics" +msgstr "" + +#: ../src/viktrwlayer_propwin.c:3613 ../src/viktrwlayer_propwin.c:3680 +msgid "Show D_EM" +msgstr "" + +#: ../src/viktrwlayer_propwin.c:3615 ../src/viktrwlayer_propwin.c:3631 +#: ../src/viktrwlayer_propwin.c:3647 ../src/viktrwlayer_propwin.c:3697 +msgid "Show _GPS Speed" +msgstr "" + +#: ../src/viktrwlayer_propwin.c:3617 ../src/viktrwlayer_propwin.c:3633 +#: ../src/viktrwlayer_propwin.c:3665 ../src/viktrwlayer_propwin.c:3699 +msgid "Track Distance:" +msgstr "" + +#: ../src/viktrwlayer_propwin.c:3618 ../src/viktrwlayer_propwin.c:3684 +msgid "Track Height:" +msgstr "" + +#: ../src/viktrwlayer_propwin.c:3624 +msgid "Elevation-distance" +msgstr "" + +#: ../src/viktrwlayer_propwin.c:3634 +msgid "Track Gradient:" +msgstr "" + +#: ../src/viktrwlayer_propwin.c:3639 +msgid "Gradient-distance" +msgstr "" + +#: ../src/viktrwlayer_propwin.c:3649 ../src/viktrwlayer_propwin.c:3666 +#: ../src/viktrwlayer_propwin.c:3683 +msgid "Track Time:" +msgstr "" + +#: ../src/viktrwlayer_propwin.c:3650 ../src/viktrwlayer_propwin.c:3700 +msgid "Track Speed:" +msgstr "" + +#: ../src/viktrwlayer_propwin.c:3651 ../src/viktrwlayer_propwin.c:3667 +#: ../src/viktrwlayer_propwin.c:3685 +msgid "Time/Date:" +msgstr "" + +#: ../src/viktrwlayer_propwin.c:3655 +msgid "Speed-time" +msgstr "" + +#: ../src/viktrwlayer_propwin.c:3663 ../src/viktrwlayer_propwin.c:3679 +msgid "Show S_peed" +msgstr "" + +#: ../src/viktrwlayer_propwin.c:3671 +msgid "Distance-time" +msgstr "" + +#: ../src/viktrwlayer_propwin.c:3690 +msgid "Elevation-time" +msgstr "" + +#: ../src/viktrwlayer_propwin.c:3705 +msgid "Speed-distance" +msgstr "" + +#: ../src/viktrwlayer_tpwin.c:190 ../src/viktrwlayer_wpwin.c:66 +msgid "Date/Time Edit" +msgstr "" + +#: ../src/viktrwlayer_tpwin.c:242 +msgid "Name:" +msgstr "" + +#: ../src/viktrwlayer_tpwin.c:243 +msgid "Latitude:" +msgstr "" + +#: ../src/viktrwlayer_tpwin.c:244 +msgid "Longitude:" +msgstr "" + +#: ../src/viktrwlayer_tpwin.c:245 +msgid "Altitude:" +msgstr "" + +#: ../src/viktrwlayer_tpwin.c:246 +msgid "Course:" +msgstr "" + +#: ../src/viktrwlayer_tpwin.c:247 +msgid "Timestamp:" +msgstr "" + +#: ../src/viktrwlayer_tpwin.c:248 +msgid "Time:" +msgstr "" + +#: ../src/viktrwlayer_tpwin.c:249 +msgid "Distance Difference:" +msgstr "" + +#: ../src/viktrwlayer_tpwin.c:250 +msgid "Time Difference:" +msgstr "" + +#: ../src/viktrwlayer_tpwin.c:251 +msgid "\"Speed\" Between:" +msgstr "" + +#: ../src/viktrwlayer_tpwin.c:252 +msgid "Speed:" +msgstr "" + +#: ../src/viktrwlayer_tpwin.c:253 +msgid "VDOP:" +msgstr "" + +#: ../src/viktrwlayer_tpwin.c:254 +msgid "HDOP:" +msgstr "" + +#: ../src/viktrwlayer_tpwin.c:255 +msgid "PDOP:" +msgstr "" + +#: ../src/viktrwlayer_tpwin.c:256 +msgid "SAT/FIX:" +msgstr "" + +#: ../src/viktrwlayer_tpwin.c:263 ../src/viktrwlayer_tpwin.c:408 +#: ../src/viktrwlayer_tpwin.c:622 +msgid "Trackpoint" +msgstr "" + +#: ../src/viktrwlayer_tpwin.c:266 +msgid "_Insert After" +msgstr "" + +#: ../src/viktrwlayer_tpwin.c:268 +msgid "Split Here" +msgstr "" + +#: ../src/viktrwlayer_tracklist.c:262 ../src/viktrwlayer_waypointlist.c:306 +msgid "_Copy Data" +msgstr "" + +#. +#. item = gtk_image_menu_item_new_with_mnemonic ( _("_Select") ); +#. gtk_image_menu_item_set_image ( (GtkImageMenuItem*)item, gtk_image_new_from_stock (GTK_STOCK_FIND, GTK_ICON_SIZE_MENU) ); +#. g_signal_connect_swapped ( G_OBJECT(item), "activate", G_CALLBACK(trw_layer_track_select), values ); +#. gtk_menu_shell_append (GTK_MENU_SHELL (menu), item); +#. gtk_widget_show ( item ); +#. +#. ATM view auto selects, so don't bother with separate select menu entry +#. +#. item = gtk_image_menu_item_new_with_mnemonic ( _("_Select") ); +#. gtk_image_menu_item_set_image ( (GtkImageMenuItem*)item, gtk_image_new_from_stock (GTK_STOCK_FIND, GTK_ICON_SIZE_MENU) ); +#. g_signal_connect_swapped ( G_OBJECT(item), "activate", G_CALLBACK(trw_layer_waypoint_select), values ); +#. gtk_menu_shell_append (GTK_MENU_SHELL (menu), item); +#. gtk_widget_show ( item ); +#. +#. AUTO SELECT NOT TRUE YET... +#. ATM view auto selects, so don't bother with separate select menu entry +#: ../src/viktrwlayer_tracklist.c:290 ../src/viktrwlayer_waypointlist.c:341 +#: ../src/vikwindow.c:4816 +msgid "_View" +msgstr "" + +#. Insert column for the layer name when viewing multi layers +#: ../src/viktrwlayer_tracklist.c:613 ../src/viktrwlayer_waypointlist.c:609 +msgid "Layer" +msgstr "" + +#: ../src/viktrwlayer_tracklist.c:627 ../src/viktrwlayer_waypointlist.c:624 +msgid "Date" +msgstr "" + +#: ../src/viktrwlayer_tracklist.c:631 ../src/viktrwlayer_waypointlist.c:628 +msgid "Visible" +msgstr "" + +#: ../src/viktrwlayer_tracklist.c:639 +msgid "" +"Distance\n" +"(miles)" +msgstr "" + +#: ../src/viktrwlayer_tracklist.c:642 +msgid "" +"Distance\n" +"(NM)" +msgstr "" + +#: ../src/viktrwlayer_tracklist.c:645 +msgid "" +"Distance\n" +"(km)" +msgstr "" + +#: ../src/viktrwlayer_tracklist.c:651 +msgid "" +"Length\n" +"(minutes)" +msgstr "" + +#: ../src/viktrwlayer_tracklist.c:660 ../src/vikutils.c:93 +msgid "sec/mi" +msgstr "" + +#: ../src/viktrwlayer_tracklist.c:666 +#, c-format +msgid "" +"Av. Speed\n" +"(%s)" +msgstr "" + +#. Apply own formatting of the data +#: ../src/viktrwlayer_tracklist.c:671 +#, c-format +msgid "" +"Max Speed\n" +"(%s)" +msgstr "" + +#: ../src/viktrwlayer_tracklist.c:679 ../src/viktrwlayer_waypointlist.c:637 +msgid "" +"Max Height\n" +"(Feet)" +msgstr "" + +#: ../src/viktrwlayer_tracklist.c:681 ../src/viktrwlayer_waypointlist.c:639 +msgid "" +"Max Height\n" +"(Metres)" +msgstr "" + +#: ../src/viktrwlayer_waypointlist.c:312 +msgid "Copy Data (with _positions)" +msgstr "" + +#: ../src/viktrwlayer_waypointlist.c:633 +msgid "Comment" +msgstr "" + +#: ../src/viktrwlayer_waypointlist.c:643 +msgid "Symbol" +msgstr "" + +#: ../src/viktrwlayer_wpwin.c:93 ../src/viktrwlayer_wpwin.c:302 +msgid "True" +msgstr "" + +#: ../src/viktrwlayer_wpwin.c:122 +msgid "Waypoint Properties" +msgstr "" + +#: ../src/viktrwlayer_wpwin.c:164 +msgid "Name:" +msgstr "" + +#: ../src/viktrwlayer_wpwin.c:181 +msgid "Altitude:" +msgstr "" + +#: ../src/viktrwlayer_wpwin.c:186 ../src/viktrwlayer_wpwin.c:188 +msgid "Comment:" +msgstr "" + +#: ../src/viktrwlayer_wpwin.c:202 +msgid "Source:" +msgstr "" + +#: ../src/viktrwlayer_wpwin.c:212 +msgid "Image:" +msgstr "" + +#: ../src/viktrwlayer_wpwin.c:217 +msgid "Symbol:" +msgstr "" + +#: ../src/viktrwlayer_wpwin.c:226 +msgid "(none)" +msgstr "" + +#. Geotag Info [readonly] +#: ../src/viktrwlayer_wpwin.c:272 +msgid "Has Geotag" +msgstr "" + +#: ../src/viktrwlayer_wpwin.c:279 +msgid "Consistent Position" +msgstr "" + +#. ATM the direction value box is always shown, even when there is no information. +#. It would be nice to be able to hide it until the 'Add' has been performed, +#. however I've not been able to achieve this. +#. Thus simply sensistizing it instead. +#: ../src/viktrwlayer_wpwin.c:292 +msgid "Image Direction:" +msgstr "" + +#: ../src/viktrwlayer_wpwin.c:300 +msgid "Magnetic" +msgstr "" + +#: ../src/viktrwlayer_wpwin.c:320 +msgid "Time:" +msgstr "" + +#. TODO: other checks (isalpha or whatever ) +#: ../src/viktrwlayer_wpwin.c:386 +msgid "Please enter a name for the waypoint." +msgstr "" + +#: ../src/viktrwlayer_geotag.c:320 ../src/viktrwlayer_geotag.c:460 +#, c-format +msgid "Failed updating EXIF on %s" +msgstr "" + +#: ../src/viktrwlayer_geotag.c:562 +#, c-format +msgid "Geotagging %d Images..." +msgstr "" + +#: ../src/viktrwlayer_geotag.c:630 +msgid "Geotag Images" +msgstr "" + +#: ../src/viktrwlayer_geotag.c:640 +msgid "Images" +msgstr "" + +#: ../src/viktrwlayer_geotag.c:645 +msgid "Overwrite Existing Waypoints:" +msgstr "" + +#: ../src/viktrwlayer_geotag.c:648 +msgid "Overwrite Existing GPS Information:" +msgstr "" + +#: ../src/viktrwlayer_geotag.c:650 +msgid "Keep File Modification Timestamp:" +msgstr "" + +#: ../src/viktrwlayer_geotag.c:684 +msgid "Create Waypoints:" +msgstr "" + +#: ../src/viktrwlayer_geotag.c:693 +msgid "Write EXIF:" +msgstr "" + +#: ../src/viktrwlayer_geotag.c:705 +msgid "Automatic Image Direction:" +msgstr "" + +#: ../src/viktrwlayer_geotag.c:707 +msgid "Set image direction based on a heading derived from the track" +msgstr "" + +#: ../src/viktrwlayer_geotag.c:710 +msgid "Interpolate Between Track Segments:" +msgstr "" + +#: ../src/viktrwlayer_geotag.c:715 +msgid "Image Time Offset (Seconds):" +msgstr "" + +#: ../src/viktrwlayer_geotag.c:718 +msgid "" +"The number of seconds to ADD to the photos time to make it match the GPS " +"data. Calculate this with (GPS - Photo). Can be negative or positive. Useful " +"to adjust times when a camera's timestamp was incorrect." +msgstr "" + +#: ../src/viktrwlayer_geotag.c:721 +msgid "Image Timezone:" +msgstr "" + +#: ../src/viktrwlayer_geotag.c:724 +msgid "" +"The timezone that was used when the images were created. For example, if a " +"camera is set to AWST or +8:00 hours. Enter +8:00 here so that the correct " +"adjustment to the images' time can be made. GPS data is always in UTC." +msgstr "" + +#: ../src/viktrwlayer_geotag.c:728 +#, c-format +msgid "Using waypoint: %s" +msgstr "" + +#: ../src/viktrwlayer_geotag.c:742 +#, c-format +msgid "Using track: %s" +msgstr "" + +#: ../src/viktrwlayer_geotag.c:744 +#, c-format +msgid "Using all tracks in: %s" +msgstr "" + +#: ../src/viktrwlayer_analysis.c:214 +msgid "Number of Tracks" +msgstr "" + +#: ../src/viktrwlayer_analysis.c:215 +msgid "Date Range" +msgstr "" + +#: ../src/viktrwlayer_analysis.c:216 +msgid "Total Length" +msgstr "" + +#: ../src/viktrwlayer_analysis.c:217 +msgid "Average Length" +msgstr "" + +#: ../src/viktrwlayer_analysis.c:218 +msgid "Eddington number" +msgstr "" + +#. No.4: Extended display only +#: ../src/viktrwlayer_analysis.c:219 +msgid "Max Speed" +msgstr "" + +#: ../src/viktrwlayer_analysis.c:220 +msgid "Avg. Speed" +msgstr "" + +#: ../src/viktrwlayer_analysis.c:221 +msgid "Minimum Altitude" +msgstr "" + +#: ../src/viktrwlayer_analysis.c:222 +msgid "Maximum Altitude" +msgstr "" + +#: ../src/viktrwlayer_analysis.c:223 +msgid "Total Elevation Gain/Loss" +msgstr "" + +#: ../src/viktrwlayer_analysis.c:224 +msgid "Avg. Elevation Gain/Loss" +msgstr "" + +#: ../src/viktrwlayer_analysis.c:225 +msgid "Total Duration" +msgstr "" + +#: ../src/viktrwlayer_analysis.c:226 +msgid "Avg. Duration" +msgstr "" + +#: ../src/viktrwlayer_analysis.c:317 +#, c-format +msgid "%.2f miles" +msgstr "" + +#: ../src/viktrwlayer_analysis.c:320 +#, c-format +msgid "%.2f NM" +msgstr "" + +#. VIK_UNITS_DISTANCE_KILOMETRES +#: ../src/viktrwlayer_analysis.c:324 +#, c-format +msgid "%.2f km" +msgstr "" + +#: ../src/viktrwlayer_analysis.c:361 +#, c-format +msgid "%.2f m/s" +msgstr "" + +#: ../src/viktrwlayer_analysis.c:370 ../src/viktrwlayer_analysis.c:373 +#, c-format +msgid "%.2f knots" +msgstr "" + +#: ../src/viktrwlayer_analysis.c:379 ../src/viktrwlayer_analysis.c:382 +#, c-format +msgid "%d s/km" +msgstr "" + +#: ../src/viktrwlayer_analysis.c:399 ../src/viktrwlayer_analysis.c:402 +#, c-format +msgid "%d sec/mi" +msgstr "" + +#: ../src/viktrwlayer_analysis.c:420 ../src/viktrwlayer_analysis.c:423 +#, c-format +msgid "%.2f km/h" +msgstr "" + +#: ../src/viktrwlayer_analysis.c:434 ../src/viktrwlayer_analysis.c:440 +#, c-format +msgid "%d feet" +msgstr "" + +#: ../src/viktrwlayer_analysis.c:445 ../src/viktrwlayer_analysis.c:447 +#, c-format +msgid "%d feet / %d feet" +msgstr "" + +#: ../src/viktrwlayer_analysis.c:452 ../src/viktrwlayer_analysis.c:458 +#, c-format +msgid "%d m" +msgstr "" + +#: ../src/viktrwlayer_analysis.c:463 ../src/viktrwlayer_analysis.c:465 +#, c-format +msgid "%d m / %d m" +msgstr "" + +#: ../src/viktrwlayer_analysis.c:477 +#, c-format +msgid "%d:%02d:%02d days:hrs:mins" +msgstr "" + +#: ../src/viktrwlayer_analysis.c:484 +#, c-format +msgid "%d:%02d hrs:mins" +msgstr "" + +#: ../src/viktrwlayer_analysis.c:658 +msgid "Include Invisible Items" +msgstr "" + +#: ../src/vikstatus.c:129 +msgid "Current number of background tasks. Click to see the background jobs." +msgstr "" + +#: ../src/vikstatus.c:134 +msgid "Current zoom level. Click to select a new one." +msgstr "" + +#: ../src/vikstatus.c:141 +msgid "Left click to clear the message. Right click to copy the message." +msgstr "" + +#: ../src/vikutils.c:108 +msgid "GPSD" +msgstr "" + +#. GPS Preamble +#: ../src/vikutils.c:109 +msgid "Trkpt" +msgstr "" + +#: ../src/vikutils.c:160 +#, c-format +msgid "%sSpeed%s %.1f%s" +msgstr "" + +#. Go for 2dp as expect low values for vertical speeds +#: ../src/vikutils.c:214 +#, c-format +msgid "%sClimb%s %.2f%s" +msgstr "" + +#: ../src/vikutils.c:223 +#, c-format +msgid "%sAlt %dfeet" +msgstr "" + +#. VIK_UNITS_HEIGHT_METRES: +#: ../src/vikutils.c:227 +#, c-format +msgid "%sAlt %dm" +msgstr "" + +#: ../src/vikutils.c:235 +#, c-format +msgid "%sCourse %03d°" +msgstr "" + +#: ../src/vikutils.c:249 +msgid "yards" +msgstr "" + +#. VIK_UNITS_DISTANCE_KILOMETRES: +#: ../src/vikutils.c:253 +msgid "m" +msgstr "" + +#: ../src/vikutils.c:257 +#, c-format +msgid "%sDistance diff %d%s" +msgstr "" + +#: ../src/vikutils.c:272 +#, c-format +msgid "%sTime %s" +msgstr "" + +#: ../src/vikutils.c:281 +#, c-format +msgid "%sTime diff %lds" +msgstr "" + +#: ../src/vikutils.c:287 +#, c-format +msgid "%sNo. of Sats %d" +msgstr "" + +#: ../src/vikutils.c:312 +#, c-format +msgid "%sTo End %.2f%s" +msgstr "" + +#: ../src/vikutils.c:339 +#, c-format +msgid "%sDistance along %.2f%s" +msgstr "" + +#: ../src/vikutils.c:359 +#, c-format +msgid "%sTrack: %s" +msgstr "" + +#: ../src/vikutils.c:396 +#, c-format +msgid "" +"There is a newer version of Viking available: %s\n" +"\n" +"Do you wish to go to Viking's website now?" +msgstr "" + +#: ../src/vikutils.c:526 +msgid "" +"This appears to be Viking's very first run.\n" +"\n" +"Do you wish to enable automatic internet features?\n" +"\n" +"Individual settings can be controlled in the Preferences." +msgstr "" + +#: ../src/vikwaypoint.c:37 +msgid "Waypoint" +msgstr "" + +#: ../src/vikwebtool_datasource.c:352 +msgid "Search Term" +msgstr "" + +#. TODO get rid of this as this is unnecessary duplication... +#: ../src/vikwindow.c:258 +msgid "Pan" +msgstr "" + +#: ../src/vikwindow.c:258 +msgid "Zoom" +msgstr "" + +#: ../src/vikwindow.c:258 +msgid "Ruler" +msgstr "" + +#: ../src/vikwindow.c:258 +msgid "Select" +msgstr "" + +#: ../src/vikwindow.c:368 +msgid "This is Viking " +msgstr "" + +#: ../src/vikwindow.c:457 +msgid "Location lookup aborted" +msgstr "" + +#: ../src/vikwindow.c:477 +#, c-format +msgid "Location found: %s" +msgstr "" + +#: ../src/vikwindow.c:486 +msgid "Unable to determine location" +msgstr "" + +#: ../src/vikwindow.c:495 +msgid "Determining location" +msgstr "" + +#: ../src/vikwindow.c:525 +#, c-format +msgid "Location found via geoclue" +msgstr "" + +#: ../src/vikwindow.c:546 +msgid "Default Map" +msgstr "" + +#: ../src/vikwindow.c:557 ../src/vikwindow.c:3938 +msgid "Trying to determine location..." +msgstr "" + +#. Create tooltip +#: ../src/vikwindow.c:723 +msgid "Select zoom level" +msgstr "" + +#: ../src/vikwindow.c:1176 +#, c-format +msgid "" +"Do you want to save the changes you made to the document \"%s\"?\n" +"\n" +"Your changes will be lost if you don't save them." +msgstr "" + +#: ../src/vikwindow.c:1180 +msgid "Don't Save" +msgstr "" + +#: ../src/vikwindow.c:1268 +msgid "mpp" +msgstr "" + +#: ../src/vikwindow.c:1268 +msgid "pixelfact" +msgstr "" + +#: ../src/vikwindow.c:1467 +#, c-format +msgid "%s %s %dm" +msgstr "" + +#: ../src/vikwindow.c:1469 +#, c-format +msgid "%s %s %dft" +msgstr "" + +#: ../src/vikwindow.c:1472 +#, c-format +msgid "%s %s" +msgstr "" + +#: ../src/vikwindow.c:1929 +msgid "_Ruler" +msgstr "" + +#: ../src/vikwindow.c:1929 +msgid "Ruler Tool" +msgstr "" + +#: ../src/vikwindow.c:2204 ../src/vikwindow.c:4818 +msgid "_Zoom" +msgstr "" + +#: ../src/vikwindow.c:2204 +msgid "Zoom Tool" +msgstr "" + +#: ../src/vikwindow.c:2271 ../src/vikwindow.c:4819 +msgid "_Pan" +msgstr "" + +#: ../src/vikwindow.c:2271 +msgid "Pan Tool" +msgstr "" + +#: ../src/vikwindow.c:2425 +msgid "_Select" +msgstr "" + +#: ../src/vikwindow.c:2425 +msgid "Select Tool" +msgstr "" + +#: ../src/vikwindow.c:2615 +msgid "You must select a layer to show its properties." +msgstr "" + +#. No error to show, so unlikely this will get called +#: ../src/vikwindow.c:2629 +msgid "The help system is not available." +msgstr "" + +#. Main error path +#: ../src/vikwindow.c:2632 +#, c-format +msgid "" +"Help is not available because: %s.\n" +"Ensure a Mime Type ghelp handler program is installed (e.g. yelp)." +msgstr "" + +#: ../src/vikwindow.c:2865 +msgid "You must select a layer to delete." +msgstr "" + +#: ../src/vikwindow.c:3171 +msgid "Untitled" +msgstr "" + +#: ../src/vikwindow.c:3300 +#, c-format +msgid "Unable to add '%s' to the list of recently used documents" +msgstr "" + +#: ../src/vikwindow.c:3391 +msgid "The file you requested could not be opened." +msgstr "" + +#: ../src/vikwindow.c:3394 +msgid "" +"GPSBabel is required to load files of this type or GPSBabel encountered " +"problems." +msgstr "" + +#: ../src/vikwindow.c:3397 +#, c-format +msgid "Unable to load malformed GPX file %s" +msgstr "" + +#: ../src/vikwindow.c:3400 +#, c-format +msgid "Unsupported file type for %s" +msgstr "" + +#. Since we can process .vik files with issues just show a warning in the status bar +#. Not that a user can do much about it... or tells them what this issue is yet... +#: ../src/vikwindow.c:3406 +#, c-format +msgid "WARNING: issues encountered loading %s" +msgstr "" + +#: ../src/vikwindow.c:3489 +msgid "Please select a GPS data file to open. " +msgstr "" + +#: ../src/vikwindow.c:3508 +msgid "Google Earth" +msgstr "" + +#: ../src/vikwindow.c:3523 ../src/vikwindow.c:3646 ../src/viking.desktop.in.h:1 +msgid "Viking" +msgstr "" + +#: ../src/vikwindow.c:3594 ../src/vikwindow.c:4632 +msgid "Open File" +msgstr "" + +#: ../src/vikwindow.c:3630 +msgid "Save as Viking File." +msgstr "" + +#: ../src/vikwindow.c:3757 +#, c-format +msgid "Exporting to file: %s" +msgstr "" + +#. Confirm what happened. +#: ../src/vikwindow.c:3774 +#, c-format +msgid "Exported files: %d" +msgstr "" + +#: ../src/vikwindow.c:3786 +msgid "Nothing to Export!" +msgstr "" + +#: ../src/vikwindow.c:3790 +msgid "Export to directory" +msgstr "" + +#: ../src/vikwindow.c:3809 +msgid "Could not convert all files" +msgstr "" + +#: ../src/vikwindow.c:3851 +msgid "File not accessible" +msgstr "" + +#: ../src/vikwindow.c:3854 +msgid "No Viking File" +msgstr "" + +#: ../src/vikwindow.c:3998 +msgid "This layer has no configurable properties." +msgstr "" + +#: ../src/vikwindow.c:4080 +msgid "Are you sure you wish to delete all layers?" +msgstr "" + +#. Try harder... +#: ../src/vikwindow.c:4126 ../src/vikwindow.c:4132 +msgid "Generating image file..." +msgstr "" + +#: ../src/vikwindow.c:4154 +msgid "" +"Failed to generate internal image.\n" +"\n" +"Try creating a smaller image." +msgstr "" + +#: ../src/vikwindow.c:4175 +msgid "Image file generated." +msgstr "" + +#: ../src/vikwindow.c:4177 +msgid "Failed to generate image file." +msgstr "" + +#: ../src/vikwindow.c:4246 +#, c-format +msgid "Unable to write to file %s: %s" +msgstr "" + +#: ../src/vikwindow.c:4284 +msgid "" +"Viewable region outside allowable pixel size bounds for image. Clipping " +"width/height values." +msgstr "" + +#: ../src/vikwindow.c:4309 +#, c-format +msgid "Total area: %ldm x %ldm (%.3f sq. km)" +msgstr "" + +#: ../src/vikwindow.c:4312 +#, c-format +msgid "Total area: %ldm x %ldm (%.3f sq. miles)" +msgstr "" + +#: ../src/vikwindow.c:4315 +#, c-format +msgid "Total area: %ldm x %ldm (%.3f sq. NM)" +msgstr "" + +#. Single file +#: ../src/vikwindow.c:4343 +msgid "Save Image" +msgstr "" + +#: ../src/vikwindow.c:4364 ../src/vikwindow.c:4641 +msgid "KMZ" +msgstr "" + +#: ../src/vikwindow.c:4417 +msgid "You must be in UTM mode to use this feature" +msgstr "" + +#: ../src/vikwindow.c:4421 +msgid "Choose a directory to hold images" +msgstr "" + +#. todo: default for answers inside VikWindow or static (thruout instance) +#: ../src/vikwindow.c:4441 +msgid "Save to Image File" +msgstr "" + +#: ../src/vikwindow.c:4457 +msgid "Width (pixels):" +msgstr "" + +#: ../src/vikwindow.c:4459 +msgid "Height (pixels):" +msgstr "" + +#: ../src/vikwindow.c:4462 +msgid "" +"WARNING: USING LARGE IMAGES OVER 10000x10000\n" +"MAY CRASH THE PROGRAM!" +msgstr "" + +#: ../src/vikwindow.c:4464 +msgid "Zoom (meters per pixel):" +msgstr "Zoom (metres per pixel):" + +#: ../src/vikwindow.c:4480 +msgid "Area in current viewable window" +msgstr "" + +#: ../src/vikwindow.c:4490 +msgid "Save as PNG" +msgstr "" + +#: ../src/vikwindow.c:4491 +msgid "Save as JPEG" +msgstr "" + +#: ../src/vikwindow.c:4520 +msgid "East-west image tiles:" +msgstr "" + +#: ../src/vikwindow.c:4522 +msgid "North-south image tiles:" +msgstr "" + +#: ../src/vikwindow.c:4619 +msgid "This feature is not available in UTM mode" +msgstr "" + +#: ../src/vikwindow.c:4658 +#, c-format +msgid "Unable to import %s." +msgstr "" + +#: ../src/vikwindow.c:4749 +msgid "Choose a background color" +msgstr "Choose a background colour" + +#: ../src/vikwindow.c:4765 +msgid "Choose a track highlight color" +msgstr "Choose a track highlight colour" + +#: ../src/vikwindow.c:4814 +msgid "_File" +msgstr "" + +#: ../src/vikwindow.c:4815 +msgid "_Edit" +msgstr "" + +#: ../src/vikwindow.c:4817 +msgid "_Show" +msgstr "" + +#: ../src/vikwindow.c:4820 +msgid "_Layers" +msgstr "" + +#: ../src/vikwindow.c:4821 +msgid "_Tools" +msgstr "" + +#: ../src/vikwindow.c:4822 +msgid "_Webtools" +msgstr "" + +#: ../src/vikwindow.c:4823 ../src/vikwindow.c:4893 +msgid "_Help" +msgstr "" + +#: ../src/vikwindow.c:4825 +msgid "New file" +msgstr "" + +#: ../src/vikwindow.c:4826 +msgid "_Open..." +msgstr "" + +#: ../src/vikwindow.c:4826 +msgid "Open a file" +msgstr "" + +#: ../src/vikwindow.c:4827 +msgid "Open _Recent File" +msgstr "" + +#: ../src/vikwindow.c:4828 +msgid "Append _File..." +msgstr "" + +#: ../src/vikwindow.c:4828 +msgid "Append data from a different file" +msgstr "" + +#: ../src/vikwindow.c:4829 +msgid "Open GPX as External _Layer..." +msgstr "" + +#: ../src/vikwindow.c:4829 +msgid "Open a GPX file as an external layer" +msgstr "" + +#: ../src/vikwindow.c:4830 +msgid "_Export All" +msgstr "" + +#: ../src/vikwindow.c:4830 +msgid "Export All TrackWaypoint Layers" +msgstr "" + +#: ../src/vikwindow.c:4831 +msgid "_GPX..." +msgstr "" + +#: ../src/vikwindow.c:4831 +msgid "Export as GPX" +msgstr "" + +#: ../src/vikwindow.c:4832 +msgid "A_cquire" +msgstr "" + +#: ../src/vikwindow.c:4833 +msgid "_Directions..." +msgstr "" + +#: ../src/vikwindow.c:4833 +msgid "Get driving directions" +msgstr "" + +#: ../src/vikwindow.c:4835 +msgid "_OSM Traces..." +msgstr "" + +#: ../src/vikwindow.c:4835 +msgid "Get traces from OpenStreetMap" +msgstr "" + +#: ../src/vikwindow.c:4836 +msgid "_My OSM Traces..." +msgstr "" + +#: ../src/vikwindow.c:4836 +msgid "Get Your Own Traces from OpenStreetMap" +msgstr "" + +#: ../src/vikwindow.c:4839 +msgid "Geo_caches..." +msgstr "" + +#: ../src/vikwindow.c:4839 +msgid "Get Geocaches from geocaching.com" +msgstr "" + +#: ../src/vikwindow.c:4842 +msgid "Create waypoints from geotagged images" +msgstr "" + +#: ../src/vikwindow.c:4844 +msgid "Get a file from a URL" +msgstr "" + +#: ../src/vikwindow.c:4846 +msgid "Create waypoints from Wikipedia items in the current view" +msgstr "" + +#: ../src/vikwindow.c:4848 +msgid "_Save" +msgstr "" + +#: ../src/vikwindow.c:4848 +msgid "Save the file" +msgstr "" + +#: ../src/vikwindow.c:4849 +msgid "Save _As..." +msgstr "" + +#: ../src/vikwindow.c:4849 +msgid "Save the file under different name" +msgstr "" + +#: ../src/vikwindow.c:4850 +msgid "Properties..." +msgstr "" + +#: ../src/vikwindow.c:4850 +msgid "File Properties" +msgstr "" + +#: ../src/vikwindow.c:4852 +msgid "Import KMZ _Map File..." +msgstr "" + +#: ../src/vikwindow.c:4852 +msgid "Import a KMZ file" +msgstr "" + +#: ../src/vikwindow.c:4853 +msgid "Generate _KMZ Map File..." +msgstr "" + +#: ../src/vikwindow.c:4853 +msgid "Generate a KMZ file with an overlay of the current view" +msgstr "" + +#: ../src/vikwindow.c:4855 +msgid "_Generate Image File..." +msgstr "" + +#: ../src/vikwindow.c:4855 +msgid "Save a snapshot of the workspace into a file" +msgstr "" + +#: ../src/vikwindow.c:4856 +msgid "Generate _Directory of Images..." +msgstr "" + +#: ../src/vikwindow.c:4856 +msgid "Generate _Directory of Images" +msgstr "" + +#: ../src/vikwindow.c:4857 +msgid "_Print..." +msgstr "" + +#: ../src/vikwindow.c:4857 +msgid "Print maps" +msgstr "" + +#: ../src/vikwindow.c:4858 +msgid "E_xit" +msgstr "" + +#: ../src/vikwindow.c:4858 +msgid "Exit the program" +msgstr "" + +#: ../src/vikwindow.c:4859 +msgid "Save and Exit" +msgstr "" + +#: ../src/vikwindow.c:4859 +msgid "Save and Exit the program" +msgstr "" + +#: ../src/vikwindow.c:4861 +msgid "Go to the Pre_vious Location" +msgstr "" + +#: ../src/vikwindow.c:4861 +msgid "Go to the previous location" +msgstr "" + +#: ../src/vikwindow.c:4862 +msgid "Go to the _Next Location" +msgstr "" + +#: ../src/vikwindow.c:4862 +msgid "Go to the next location" +msgstr "" + +#: ../src/vikwindow.c:4863 +msgid "Go to the _Default Location" +msgstr "" + +#: ../src/vikwindow.c:4863 +msgid "Go to the default location" +msgstr "" + +#: ../src/vikwindow.c:4864 +msgid "Go to the _Auto Location" +msgstr "" + +#: ../src/vikwindow.c:4864 +msgid "Go to a location via automatic lookup" +msgstr "" + +#: ../src/vikwindow.c:4865 +msgid "Go to _Location..." +msgstr "" + +#: ../src/vikwindow.c:4865 +msgid "Go to address/place using text search" +msgstr "" + +#: ../src/vikwindow.c:4866 +msgid "_Go to Lat/Lon..." +msgstr "" + +#: ../src/vikwindow.c:4866 +msgid "Go to arbitrary lat/lon coordinate" +msgstr "" + +#: ../src/vikwindow.c:4867 +msgid "Go to UTM..." +msgstr "" + +#: ../src/vikwindow.c:4867 +msgid "Go to arbitrary UTM coordinate" +msgstr "" + +#: ../src/vikwindow.c:4868 +msgid "Go to Today" +msgstr "" + +#: ../src/vikwindow.c:4868 +msgid "Go to today on the calendar" +msgstr "" + +#: ../src/vikwindow.c:4869 +msgid "_Refresh" +msgstr "" + +#: ../src/vikwindow.c:4869 +msgid "Refresh any maps displayed" +msgstr "" + +#: ../src/vikwindow.c:4870 +msgid "Set _Highlight Color..." +msgstr "Set _Highlight Colour..." + +#: ../src/vikwindow.c:4870 +msgid "Set Highlight Color" +msgstr "" + +#: ../src/vikwindow.c:4871 +msgid "Set Bac_kground Color..." +msgstr "Set Bac_kground Colour..." + +#: ../src/vikwindow.c:4871 +msgid "Set Background Color" +msgstr "" + +#: ../src/vikwindow.c:4872 +msgid "Zoom _In" +msgstr "" + +#: ../src/vikwindow.c:4872 +msgid "Zoom In" +msgstr "" + +#: ../src/vikwindow.c:4873 +msgid "Zoom _Out" +msgstr "" + +#: ../src/vikwindow.c:4873 +msgid "Zoom Out" +msgstr "" + +#: ../src/vikwindow.c:4874 +msgid "Zoom _To..." +msgstr "" + +#: ../src/vikwindow.c:4874 +msgid "Zoom To" +msgstr "" + +#: ../src/vikwindow.c:4875 +msgid "Pan _North" +msgstr "" + +#: ../src/vikwindow.c:4876 +msgid "Pan _East" +msgstr "" + +#: ../src/vikwindow.c:4877 +msgid "Pan _South" +msgstr "" + +#: ../src/vikwindow.c:4878 +msgid "Pan _West" +msgstr "" + +#: ../src/vikwindow.c:4879 +msgid "Background _Jobs" +msgstr "" + +#: ../src/vikwindow.c:4879 +msgid "Background Jobs" +msgstr "" + +#: ../src/vikwindow.c:4881 +msgid "Cu_t" +msgstr "" + +#: ../src/vikwindow.c:4885 +msgid "Delete All" +msgstr "" + +#: ../src/vikwindow.c:4886 +msgid "Copy Centre _Location" +msgstr "" + +#: ../src/vikwindow.c:4887 +msgid "_Flush Map Cache" +msgstr "" + +#: ../src/vikwindow.c:4888 +msgid "_Set the Default Location" +msgstr "" + +#: ../src/vikwindow.c:4888 +msgid "Set the Default Location to the current position" +msgstr "" + +#: ../src/vikwindow.c:4889 +msgid "_Preferences" +msgstr "" + +#: ../src/vikwindow.c:4889 +msgid "Program Preferences" +msgstr "" + +#: ../src/vikwindow.c:4890 +msgid "_Layer Defaults" +msgstr "" + +#: ../src/vikwindow.c:4891 +msgid "_Properties" +msgstr "" + +#: ../src/vikwindow.c:4893 +msgid "Help" +msgstr "" + +#: ../src/vikwindow.c:4894 +msgid "_About" +msgstr "" + +#: ../src/vikwindow.c:4894 +msgid "About" +msgstr "" + +#: ../src/vikwindow.c:4903 +msgid "_KML..." +msgstr "" + +#: ../src/vikwindow.c:4903 +msgid "Export as KML" +msgstr "" + +#: ../src/vikwindow.c:4904 +msgid "Transfer data from a GPS device" +msgstr "" + +#: ../src/vikwindow.c:4905 +msgid "Import file via GPSBabel converter" +msgstr "" + +#: ../src/vikwindow.c:4909 +msgid "Import Geo_JSON File..." +msgstr "" + +#: ../src/vikwindow.c:4909 +msgid "Import GeoJSON file" +msgstr "" + +#: ../src/vikwindow.c:4914 +msgid "_UTM Mode" +msgstr "" + +#: ../src/vikwindow.c:4915 +msgid "_Expedia Mode" +msgstr "" + +#: ../src/vikwindow.c:4916 +msgid "_Mercator Mode" +msgstr "" + +#: ../src/vikwindow.c:4917 +msgid "Lat_/Lon Mode" +msgstr "" + +#: ../src/vikwindow.c:4921 +msgid "Show _Scale" +msgstr "" + +#: ../src/vikwindow.c:4921 +msgid "Show Scale" +msgstr "" + +#: ../src/vikwindow.c:4922 +msgid "Show _Center Mark" +msgstr "" + +#: ../src/vikwindow.c:4922 +msgid "Show Center Mark" +msgstr "Show Centre Mark" + +#: ../src/vikwindow.c:4923 +msgid "Show _Highlight" +msgstr "" + +#: ../src/vikwindow.c:4923 +msgid "Show Highlight" +msgstr "" + +#: ../src/vikwindow.c:4924 +msgid "_Full Screen" +msgstr "" + +#: ../src/vikwindow.c:4924 +msgid "Activate full screen mode" +msgstr "" + +#: ../src/vikwindow.c:4925 +msgid "Show Side _Panel" +msgstr "" + +#: ../src/vikwindow.c:4925 +msgid "Show Side Panel" +msgstr "" + +#: ../src/vikwindow.c:4926 +msgid "Show Status_bar" +msgstr "" + +#: ../src/vikwindow.c:4926 +msgid "Show Statusbar" +msgstr "" + +#: ../src/vikwindow.c:4927 +msgid "Show _Toolbar" +msgstr "" + +#: ../src/vikwindow.c:4927 +msgid "Show Toolbar" +msgstr "" + +#: ../src/vikwindow.c:4928 +msgid "Show _Menu" +msgstr "" + +#: ../src/vikwindow.c:4928 +msgid "Show Menu" +msgstr "" + +#: ../src/vikwindow.c:4929 +msgid "Show Side Panel B_uttons" +msgstr "" + +#: ../src/vikwindow.c:4929 +msgid "Show Side Panel Buttons" +msgstr "" + +#: ../src/vikwindow.c:4930 +msgid "Show Side Panel Ca_lendar" +msgstr "" + +#: ../src/vikwindow.c:4930 +msgid "Show Side Panel Calendar" +msgstr "" + +#: ../src/vikwindow.c:5064 +#, c-format +msgid "New _%s Layer" +msgstr "" + +#: ../src/vikwindow.c:5114 +msgid "..." +msgstr "" + +#: ../src/viking.desktop.in.h:2 +msgid "GPS Data Manager" +msgstr "" + +#: ../src/viking.desktop.in.h:3 +msgid "Map Based GPS Data Manager (live data capable)." +msgstr "" + +#: ../src/libjpeg/jpeg-data.c:205 +msgid "Data does not follow JPEG specification." +msgstr "" + +#: ../src/libjpeg/jpeg-data.c:302 +#, c-format +msgid "Path '%s' invalid." +msgstr "" + +#: ../src/libjpeg/jpeg-data.c:320 +#, c-format +msgid "Could not read '%s'." +msgstr "" diff --git a/po/es.po b/po/es.po new file mode 100644 index 0000000..ac426a9 --- /dev/null +++ b/po/es.po @@ -0,0 +1,6159 @@ +# Spanish translation for viking +# Copyright (c) 2007 Rosetta Contributors and Canonical Ltd 2007 +# This file is distributed under the same license as the viking package. +# FIRST AUTHOR , 2007. +# +msgid "" +msgstr "" +"Project-Id-Version: viking\n" +"Report-Msgid-Bugs-To: \n" +"POT-Creation-Date: 2019-01-19 12:53+0000\n" +"PO-Revision-Date: 2012-11-04 20:58+0000\n" +"Last-Translator: Aiguanachein \n" +"Language-Team: Spanish \n" +"Language: es\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-Launchpad-Export-Date: 2018-12-21 17:32+0000\n" +"X-Generator: Launchpad (build 18847)\n" + +#: ../src/acquire.c:106 ../src/vikgpslayer.c:1367 +msgid "Done." +msgstr "Hecho." + +#: ../src/acquire.c:115 +msgid "No data." +msgstr "Sin datos." + +#: ../src/acquire.c:167 ../src/acquire.c:415 +msgid "Error: acquisition failed." +msgstr "Error: Fallo en la adquisión" + +#: ../src/acquire.c:339 +msgid "Working..." +msgstr "Trabajando..." + +#. This shouldn't happen... +#: ../src/acquire.c:406 +msgid "" +"Unable to create command\n" +"Acquire method failed." +msgstr "" + +#: ../src/acquire.c:513 +msgid "_Filter" +msgstr "" + +#: ../src/acquire.c:528 +#, c-format +msgid "Filter with %s" +msgstr "" + +#: ../src/acquire.c:545 +msgid "Filter" +msgstr "" + +#: ../src/babel.c:640 +msgid "GPSBabel:" +msgstr "" + +#: ../src/babel.c:641 +msgid "" +"Allow setting the specific instance of GPSBabel. You must restart Viking for " +"this value to take effect." +msgstr "" + +#: ../src/babel_ui.c:79 +msgid "Select a file format" +msgstr "" + +#: ../src/babel_ui.c:144 ../src/viktrwlayer.c:531 ../src/viktrwlayer.c:2882 +msgid "Tracks" +msgstr "Rutas" + +#: ../src/babel_ui.c:149 ../src/viktrwlayer.c:2892 +msgid "Routes" +msgstr "" + +#. ***** PARAMETERS ***** +#: ../src/babel_ui.c:154 ../src/viktrwlayer.c:531 ../src/viktrwlayer.c:2887 +msgid "Waypoints" +msgstr "Waypoints" + +#: ../src/background.c:64 +#, c-format +msgid "%d items" +msgstr "%d elementos" + +#: ../src/background.c:287 +msgid "Threads:" +msgstr "" + +#: ../src/background.c:288 +msgid "" +"Number of threads to use for Mapnik tasks. You need to restart Viking for a " +"change to this value to be used" +msgstr "" + +#: ../src/background.c:361 +msgid "Job" +msgstr "Tarea" + +#: ../src/background.c:365 +msgid "Progress" +msgstr "En proceso" + +#: ../src/background.c:373 +msgid "Viking Background Jobs" +msgstr "Tareas en segundo plano de Viking" + +#: ../src/bing.c:42 +msgid "Bing Aerial" +msgstr "" + +#: ../src/bing.c:48 +msgid "Bing" +msgstr "" + +#. VIK_GTK_WINDOW_FROM_WIDGET(vp) +#: ../src/bingmapsource.c:514 +msgid "Bing attribution Loading" +msgstr "" + +#: ../src/clipboard.c:95 +msgid "paste failed" +msgstr "fallo el pegado" + +#: ../src/clipboard.c:105 +msgid "wrong clipboard data size" +msgstr "tamaño de los datos del portapapeles incorrecto" + +#: ../src/clipboard.c:124 +#, c-format +msgid "" +"The clipboard contains sublayer data for %s layers. You must select a layer " +"of this type to paste the clipboard data." +msgstr "" +"El portapapeles contiene datos de subcapa para %s capas. Elija una capa de " +"este tipo para pegar los datos del portapapeles." + +#: ../src/clipboard.c:264 +msgid "" +"In order to paste a waypoint, please select an appropriate layer to paste " +"into." +msgstr "Por favor, seleccione una capa apropiada para pegar el waypoint." + +#: ../src/dialog.c:60 +msgid "Go to Lat/Lon" +msgstr "Ir a Lat/Lon" + +#: ../src/dialog.c:69 ../src/viktrwlayer_wpwin.c:173 +msgid "Latitude:" +msgstr "Latitud:" + +#: ../src/dialog.c:72 ../src/viktrwlayer_wpwin.c:177 +msgid "Longitude:" +msgstr "Longitud:" + +#: ../src/dialog.c:102 +msgid "Go to UTM" +msgstr "Ir hacia UTM" + +#: ../src/dialog.c:114 +msgid "Northing:" +msgstr "Despl. N:" + +#: ../src/dialog.c:117 +msgid "Easting:" +msgstr "Despl. E:" + +#: ../src/dialog.c:121 ../src/vikgeoreflayer.c:902 +msgid "Zone:" +msgstr "Zona:" + +#: ../src/dialog.c:124 ../src/vikgeoreflayer.c:904 +msgid "Letter:" +msgstr "Carta:" + +#: ../src/dialog.c:246 ../src/geonamessearch.c:238 +#: ../src/datasource_osm_my_traces.c:505 +msgid "Nothing was selected" +msgstr "Nada fue seleccionado" + +#: ../src/dialog.c:254 +msgid "Add Route" +msgstr "" + +#: ../src/dialog.c:254 +msgid "Add Track" +msgstr "Añadir ruta" + +#: ../src/dialog.c:262 +msgid "Route Name:" +msgstr "" + +#: ../src/dialog.c:262 +msgid "Track Name:" +msgstr "Nombre de ruta:" + +#: ../src/dialog.c:282 +msgid "Please enter a name for the track." +msgstr "Por favor, introduzca el nombre de la ruta." + +#: ../src/dialog.c:311 +msgid "Today" +msgstr "" + +#: ../src/dialog.c:393 +msgid "Zoom Factors..." +msgstr "Factor de acercamiento" + +#: ../src/dialog.c:407 +msgid "Zoom factor (in meters per pixel):" +msgstr "Factor de zoom (en metros por pixel)" + +#: ../src/dialog.c:408 +msgid "X (easting): " +msgstr "X (despl. E): " + +#: ../src/dialog.c:409 +msgid "Y (northing): " +msgstr "Y (despl. N): " + +#: ../src/dialog.c:414 +msgid "X and Y zoom factors must be equal" +msgstr "Mantener factores de zoom X e Y iguales" + +#: ../src/dialog.c:469 +msgid "1 min" +msgstr "1 min" + +#: ../src/dialog.c:470 +msgid "1 hour" +msgstr "1 hora" + +#: ../src/dialog.c:471 +msgid "1 day" +msgstr "1 día" + +#: ../src/dialog.c:472 +msgid "Custom (in minutes):" +msgstr "Personalizado (minutos):" + +#: ../src/dialog.c:608 +#, c-format +msgid "" +"2003-2008, Evan Battaglia\n" +"2008-%s, Viking's contributors" +msgstr "" + +#: ../src/dialog.c:609 +msgid "GPS Data and Topo Analyzer, Explorer, and Manager." +msgstr "Analizador, Explorador y Gestor de datos topológicos y GPS." + +#: ../src/dialog.c:610 +msgid "" +"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.\n" +"\n" +"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.\n" +"\n" +"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., 59 Temple " +"Place, Suite 330, Boston, MA 02111-1307, USA" +msgstr "" +"Este programa es software libre; puedes redistribuirlo , y / o modificarlo " +"bajo los terminos de la licencia Publica (GNU) publicada por la Free " +"Software Foundation; la versión 2 de la licencia , o alguna version " +"posterior.\n" +"\n" +"Este programa es distribuido con la esperanza de que pueda ser usado, PERO " +"SIN NINGUNA GARANTIA;sin que se encuentre implicada garantias de MERCADEO " +"para un proposito particular. Revisa la licencia publica GNU para mas " +"detalles.\n" +"\n" +"Tu deberas de recibir una copia de la licencia publica general GNU General " +"Public License en este programa; en caso contrario, escribe a la Free " +"Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA " +"02111-1307, USA" + +#: ../src/dialog.c:703 +msgid "Translation is coordinated on http://launchpad.net/viking" +msgstr "La traducción se coordina en http://launchpad.net/viking" + +#: ../src/dialog.c:713 +msgid "Download along track" +msgstr "Descargar a lo largo de la ruta" + +#: ../src/dialog.c:720 +msgid "Map type:" +msgstr "Tipo de mapa:" + +#: ../src/dialog.c:726 +msgid "Zoom level:" +msgstr "Nivel de zoom:" + +#: ../src/dialog.c:766 +#, c-format +msgid "The map data is licensed: %s." +msgstr "Los datos del mapa están bajo licencia: %s" + +#: ../src/dialog.c:769 +#, c-format +msgid "" +"The data provided by '%s' are licensed under the following license: " +"%s." +msgstr "" + +#: ../src/dialog.c:773 +msgid "Open license" +msgstr "Licencia libre" + +#: ../src/expedia.c:54 +msgid "Expedia Street Maps" +msgstr "Mapas de calles Expedia" + +#: ../src/expedia.c:82 +msgid "Invalid expedia altitude" +msgstr "Altitud Expedia no válida" + +#: ../src/expedia.c:113 +#, c-format +msgid "" +"Couldn't open EXPEDIA image file (right after successful download! Please " +"report and delete image file!): %s" +msgstr "" +"No se puede abrir la imagen de Expedia a pesar de haber sido descargada. Por " +"favor, informe del error y borre el fichero de imagen: %s" + +#: ../src/expedia.c:126 +#, c-format +msgid "" +"Couldn't save EXPEDIA image file (right after successful download! Please " +"report and delete image file!): %s" +msgstr "" +"No se puede guardar la imagen de Expedia a pesar de haber sido descargada. " +"Por favor informe del error y borre el fichero de imagen: %s" + +#: ../src/geonamessearch.c:115 +msgid "Search" +msgstr "Buscar" + +#: ../src/geonamessearch.c:117 +msgid "No entries found!" +msgstr "¡No se encontraron resultados!" + +#. NB could allow columns to be shifted around by doing this after each new +#. gtk_tree_view_column_set_reorderable ( column, TRUE ); +#. However I don't think is that useful, so I haven't put it in +#: ../src/geonamessearch.c:171 ../src/datasource_osm_my_traces.c:422 +#: ../src/viktrwlayer_tracklist.c:621 ../src/viktrwlayer_waypointlist.c:618 +msgid "Name" +msgstr "" + +#: ../src/geonamessearch.c:176 +msgid "Feature" +msgstr "" + +#: ../src/geonamessearch.c:181 ../src/datasource_osm_my_traces.c:437 +msgid "Lat/Lon" +msgstr "" + +#: ../src/geonamessearch.c:264 ../src/googlesearch.c:101 ../src/vikgoto.c:430 +msgid "couldn't map temp file" +msgstr "No se ha podido trazar el mapa del archivo temporal" + +#: ../src/geonamessearch.c:459 +msgid "Select articles" +msgstr "" + +#: ../src/geonamessearch.c:459 +msgid "Select the articles you want to add." +msgstr "" + +#: ../src/geonamessearch.c:475 +msgid "city" +msgstr "" + +#: ../src/geonamessearch.c:477 +msgid "edu" +msgstr "" + +#: ../src/geonamessearch.c:479 +msgid "airport" +msgstr "" + +#: ../src/geonamessearch.c:481 +msgid "mountain" +msgstr "" + +#: ../src/geonamessearch.c:483 +msgid "forest" +msgstr "" + +#: ../src/geonamessearch.c:485 +msgid "church" +msgstr "" + +#: ../src/geojson.c:74 +#, c-format +msgid "%s command failed: %s" +msgstr "" + +#: ../src/geojson.c:146 ../src/gpx.c:1317 +#, c-format +msgid "failed to open temporary file: %s" +msgstr "fallo al abrir fichero temporal: %s" + +#: ../src/globals.c:67 +msgid "DDD" +msgstr "" + +#: ../src/globals.c:67 +msgid "DMM" +msgstr "" + +#: ../src/globals.c:67 +msgid "DMS" +msgstr "" + +#: ../src/globals.c:67 +msgid "Raw" +msgstr "" + +#: ../src/globals.c:68 +msgid "Kilometres" +msgstr "" + +#: ../src/globals.c:68 +msgid "Miles" +msgstr "" + +#: ../src/globals.c:68 +msgid "Nautical Miles" +msgstr "" + +#. VIK_UNITS_SPEED_KILOMETRES_PER_HOUR: +#: ../src/globals.c:69 ../src/viktrwlayer_tracklist.c:655 ../src/vikutils.c:100 +msgid "km/h" +msgstr "" + +#: ../src/globals.c:69 ../src/viktrwlayer_tracklist.c:656 ../src/vikutils.c:78 +msgid "mph" +msgstr "" + +#. VIK_UNITS_SPEED_METRES_PER_SECOND: +#: ../src/globals.c:69 ../src/viktrwlayer_tracklist.c:663 ../src/vikutils.c:81 +msgid "m/s" +msgstr "" + +#: ../src/globals.c:69 ../src/viktrwlayer_tracklist.c:657 ../src/vikutils.c:84 +msgid "knots" +msgstr "" + +#: ../src/globals.c:69 ../src/viktrwlayer_tracklist.c:658 ../src/vikutils.c:87 +msgid "s/km" +msgstr "" + +#: ../src/globals.c:69 ../src/viktrwlayer_tracklist.c:659 ../src/vikutils.c:90 +msgid "min/km" +msgstr "" + +#: ../src/globals.c:69 +msgid "s/mi" +msgstr "" + +#: ../src/globals.c:69 ../src/viktrwlayer_tracklist.c:661 ../src/vikutils.c:96 +msgid "min/mi" +msgstr "" + +#: ../src/globals.c:70 +msgid "Metres" +msgstr "" + +#: ../src/globals.c:70 +msgid "Feet" +msgstr "" + +#: ../src/globals.c:73 +msgid "Locale" +msgstr "" + +#: ../src/globals.c:73 +msgid "World" +msgstr "" + +#: ../src/globals.c:73 +msgid "UTC" +msgstr "" + +#: ../src/globals.c:76 +msgid "Degree format:" +msgstr "Formato de aceptación" + +#: ../src/globals.c:77 +msgid "Distance units:" +msgstr "Unidades de distancia" + +#: ../src/globals.c:78 +msgid "Speed units:" +msgstr "Unidades de velocidad" + +#: ../src/globals.c:79 +msgid "Height units:" +msgstr "Unidades de altura" + +#: ../src/globals.c:80 +msgid "Use large waypoint icons:" +msgstr "Usar iconos grandes para Waypoints" + +#: ../src/globals.c:81 +msgid "Default latitude:" +msgstr "Latitud por defecto" + +#: ../src/globals.c:82 +msgid "Default longitude:" +msgstr "Longitud por defecto" + +#: ../src/globals.c:83 +msgid "Time Display:" +msgstr "" + +#: ../src/globals.c:84 +msgid "" +"Display times according to the reference frame. Locale is the user's system " +"setting. World is relative to the location of the object." +msgstr "" + +#: ../src/globals.c:90 +msgid "Alphabetical" +msgstr "" + +#: ../src/globals.c:90 ../src/datasource_osm_my_traces.c:432 +msgid "Time" +msgstr "" + +#: ../src/globals.c:90 +msgid "Creation" +msgstr "" + +#: ../src/globals.c:91 +msgid "Title Case" +msgstr "" + +#: ../src/globals.c:91 +msgid "Lowercase" +msgstr "" + +#: ../src/globals.c:94 +msgid "KML File Export Units:" +msgstr "" + +#: ../src/globals.c:95 +msgid "GPX Track Order:" +msgstr "" + +#: ../src/globals.c:96 +msgid "GPX Waypoint Symbols:" +msgstr "" + +#: ../src/globals.c:97 +msgid "" +"Save GPX Waypoint Symbol names in the specified case. May be useful for " +"compatibility with various devices" +msgstr "" + +#: ../src/globals.c:98 +msgid "GPX Creator:" +msgstr "" + +#: ../src/globals.c:99 +msgid "" +"The creator value when writing a GPX file. Otherwise when blank a default is " +"used." +msgstr "" + +#: ../src/globals.c:104 +msgid "Image Viewer:" +msgstr "Visor de imágenes:" + +#: ../src/globals.c:109 +msgid "External GPX Program 1:" +msgstr "" + +#: ../src/globals.c:110 +msgid "External GPX Program 2:" +msgstr "" + +#: ../src/globals.c:113 +msgid "Absolute" +msgstr "" + +#: ../src/globals.c:113 +msgid "Relative" +msgstr "" + +#: ../src/globals.c:117 +msgid "Save File Reference Mode:" +msgstr "" + +#: ../src/globals.c:118 +msgid "" +"When saving a Viking .vik file, this determines how the directory paths of " +"filenames are written." +msgstr "" + +#: ../src/globals.c:119 +msgid "Ask for Name before Track Creation:" +msgstr "" + +#: ../src/globals.c:120 +msgid "Show Tooltip during Track Creation:" +msgstr "" + +#: ../src/globals.c:121 +msgid "The number of recent files:" +msgstr "" + +#: ../src/globals.c:122 +msgid "" +"Only applies to new windows or on application restart. -1 means all " +"available files." +msgstr "" + +#: ../src/globals.c:123 +#, fuzzy +msgid "Open files in selected layer:" +msgstr "Remover la capa seleccionada" + +#: ../src/globals.c:124 +msgid "Open files (but not .vik ones) into the selected TrackWaypoint layer." +msgstr "" + +#: ../src/globals.c:125 +msgid "Show calendar day names:" +msgstr "" + +#: ../src/globals.c:128 +msgid "Home Location" +msgstr "" + +#: ../src/globals.c:128 +msgid "Last Location" +msgstr "" + +#: ../src/globals.c:128 +msgid "Specified File" +msgstr "" + +#: ../src/globals.c:128 +msgid "Auto Location" +msgstr "" + +#: ../src/globals.c:131 +msgid "Restore Window Setup:" +msgstr "" + +#: ../src/globals.c:132 +msgid "Restore window size and layout" +msgstr "" + +#: ../src/globals.c:133 +msgid "Add a Default Map Layer:" +msgstr "" + +#: ../src/globals.c:134 +msgid "" +"The default map layer added is defined by the Layer Defaults. Use the menu " +"Edit->Layer Defaults->Map... to change the map type and other values." +msgstr "" + +#: ../src/globals.c:135 +msgid "Startup Method:" +msgstr "" + +#: ../src/globals.c:136 +msgid "Startup File:" +msgstr "" + +#: ../src/globals.c:137 +msgid "" +"The default file to load on startup. Only applies when the startup method is " +"set to 'Specified File'" +msgstr "" + +#: ../src/globals.c:138 +msgid "Check For New Version:" +msgstr "" + +#: ../src/globals.c:139 +msgid "Periodically check to see if a new version of Viking is available" +msgstr "" + +#. Defaults for the options are setup here +#: ../src/globals.c:176 +msgid "General" +msgstr "" + +#. New Tab +#: ../src/globals.c:204 +msgid "Startup" +msgstr "" + +#. New Tab +#: ../src/globals.c:222 +msgid "Export/External" +msgstr "" + +#. 'Advanced' Properties +#: ../src/globals.c:249 +msgid "Advanced" +msgstr "" + +#. Webtools +#: ../src/google.c:39 +msgid "Google" +msgstr "Google" + +#. If there is an actual description field it will overwrite this value +#: ../src/gpx.c:264 +#, c-format +msgid "Created by: %s" +msgstr "" + +#: ../src/datasource_bfilter.c:43 +msgid "Max number of points:" +msgstr "Máximo número de puntos:" + +#: ../src/datasource_bfilter.c:84 +msgid "Simplify All Tracks..." +msgstr "" + +#: ../src/datasource_bfilter.c:85 +msgid "Simplified Tracks" +msgstr "Rutas simplificadas" + +#. { VIK_LAYER_NUM_TYPES, "compressmethod", VIK_LAYER_PARAM_UINT, VIK_LAYER_GROUP_NONE, N_("Simplify Method:"), VIK_LAYER_WIDGET_COMBOBOX, compress_method, NULL, NULL, NULL, NULL, NULL }, +#: ../src/datasource_bfilter.c:111 +msgid "Error Factor:" +msgstr "" + +#: ../src/datasource_bfilter.c:112 +msgid "" +"Specifies the maximum allowable error that may be introduced by removing a " +"single point by the crosstrack method. See the manual or GPSBabel Simplify " +"Filter documentation for more detail." +msgstr "" + +#: ../src/datasource_bfilter.c:166 +msgid "Compress Tracks..." +msgstr "" + +#: ../src/datasource_bfilter.c:167 +msgid "Compressed Tracks" +msgstr "" + +#: ../src/datasource_bfilter.c:197 ../src/datasource_bfilter.c:198 +msgid "Remove Duplicate Waypoints" +msgstr "Eliminar waypoints duplicados" + +#: ../src/datasource_bfilter.c:221 +msgid "Manual filter:" +msgstr "" + +#: ../src/datasource_bfilter.c:222 +msgid "Manual filter command: e.g. 'swap'." +msgstr "" + +#: ../src/datasource_bfilter.c:233 ../src/datasource_bfilter.c:234 +msgid "Manual filter" +msgstr "" + +#: ../src/datasource_bfilter.c:262 +msgid "Waypoints Inside This" +msgstr "Waypoints en el interior" + +#: ../src/datasource_bfilter.c:263 ../src/datasource_bfilter.c:292 +msgid "Polygonized Layer" +msgstr "Capa Poligonizada" + +#: ../src/datasource_bfilter.c:291 +msgid "Waypoints Outside This" +msgstr "Waypoints en el exterior" + +#: ../src/datasource_file.c:61 +msgid "Import file with GPSBabel" +msgstr "Importar archivo con GPSBabel" + +#: ../src/datasource_file.c:62 +msgid "Imported file" +msgstr "Archivo importado" + +#. The file selector +#: ../src/datasource_file.c:129 +msgid "File:" +msgstr "" + +#: ../src/datasource_file.c:130 +msgid "File to import" +msgstr "" + +#: ../src/datasource_file.c:137 +msgid "All files" +msgstr "" + +#. The file format selector +#: ../src/datasource_file.c:144 ../src/datasource_url.c:106 +msgid "File type:" +msgstr "" + +#: ../src/datasource_file.c:189 +#, c-format +msgid "using babel args '%s' and file '%s'" +msgstr "" + +#: ../src/datasource_gc.c:67 +msgid "Download Geocaches" +msgstr "Descargar geocachés" + +#: ../src/datasource_gc.c:68 +msgid "Geocaching.com Caches" +msgstr "Cachés de Geocaching.com" + +#: ../src/datasource_gc.c:86 +msgid "geocaching.com username:" +msgstr "Nombre de usuario de geocaching.com" + +#: ../src/datasource_gc.c:87 +msgid "geocaching.com password:" +msgstr "Contraseña de geocaching.com" + +#: ../src/datasource_gc.c:92 ../src/vikwindow.c:3502 +msgid "Geocaching" +msgstr "" + +#: ../src/datasource_gc.c:128 +#, c-format +msgid "" +"Can't find %s or %s in path! Check that you have installed it correctly." +msgstr "" + +#: ../src/datasource_gc.c:190 +msgid "Number geocaches:" +msgstr "Número de geocachés:" + +#: ../src/datasource_gc.c:192 +msgid "Centered around:" +msgstr "Centrado alrededor de:" + +#: ../src/datasource_gc.c:231 +msgid "Broken input - using some defaults" +msgstr "" + +#: ../src/datasource_geotag.c:51 +msgid "Create Waypoints from Geotagged Images" +msgstr "" + +#: ../src/datasource_geotag.c:52 +msgid "Geotagged Images" +msgstr "" + +#: ../src/datasource_geotag.c:102 ../src/datasource_geojson.c:93 +#: ../src/vikfileentry.c:171 ../src/vikwindow.c:3533 ../src/vikwindow.c:3610 +#: ../src/vikwindow.c:3641 ../src/vikwindow.c:4356 ../src/vikwindow.c:4649 +msgid "All" +msgstr "" + +#: ../src/datasource_geotag.c:107 ../src/vikfileentry.c:115 +#: ../src/viktrwlayer_geotag.c:637 ../src/vikwindow.c:3518 +#: ../src/vikwindow.c:4377 +msgid "JPG" +msgstr "" + +#: ../src/datasource_geotag.c:168 +#, c-format +msgid "Unable to create waypoint from %s" +msgstr "" + +#: ../src/datasource_geojson.c:46 +msgid "Acquire from GeoJSON" +msgstr "" + +#: ../src/datasource_geojson.c:47 ../src/datasource_geojson.c:98 +msgid "GeoJSON" +msgstr "" + +#: ../src/datasource_geojson.c:152 +#, c-format +msgid "Unable to import from: %s" +msgstr "" + +#: ../src/datasource_gps.c:54 +msgid "Acquire from GPS" +msgstr "Adquirir desde GPS" + +#: ../src/datasource_gps.c:55 +msgid "Acquired from GPS" +msgstr "Adquirido desde GPS" + +#: ../src/datasource_gps.c:258 +#, c-format +msgid "using cmd '%s' and file '%s'\n" +msgstr "" + +#: ../src/datasource_gps.c:353 ../src/vikgpslayer.c:966 +#, c-format +msgid "Downloading %d waypoint..." +msgid_plural "Downloading %d waypoints..." +msgstr[0] "Descargando %d waypoint..." +msgstr[1] "Descargando %d waypoints..." + +#: ../src/datasource_gps.c:358 ../src/vikgpslayer.c:971 +#, c-format +msgid "Downloading %d trackpoint..." +msgid_plural "Downloading %d trackpoints..." +msgstr[0] "Descargando %d traza" +msgstr[1] "Descargando %d trazas" + +#: ../src/datasource_gps.c:363 ../src/vikgpslayer.c:976 +#, c-format +msgid "Downloading %d routepoint..." +msgid_plural "Downloading %d routepoints..." +msgstr[0] "" +msgstr[1] "" + +#: ../src/datasource_gps.c:386 ../src/datasource_gps.c:393 +#: ../src/datasource_gps.c:400 +#, c-format +msgid "Downloaded %d out of %d %s..." +msgstr "Descargados %d de %d %s..." + +#: ../src/datasource_gps.c:388 ../src/datasource_gps.c:395 +#: ../src/datasource_gps.c:402 +#, c-format +msgid "Downloaded %d %s." +msgstr "Descargados %d %s." + +#: ../src/datasource_gps.c:416 ../src/vikgpslayer.c:1134 +#, c-format +msgid "GPS Device: %s" +msgstr "Dispositivo GPS: %s" + +#: ../src/datasource_gps.c:428 ../src/vikgpslayer.c:1214 +msgid "Status: Working..." +msgstr "" + +#. NB gps_layer_inst_init() is performed after parameter registeration +#. thus to give the protocols some potential values use the old static list +#. TODO: find another way to use gps_layer_inst_init()? +#: ../src/datasource_gps.c:584 ../src/vikgpslayer.c:216 +msgid "GPS Protocol:" +msgstr "Protocolo GPS:" + +#. List reassigned at runtime +#: ../src/datasource_gps.c:609 ../src/vikgpslayer.c:217 +msgid "Serial Port:" +msgstr "Puerto serie:" + +#: ../src/datasource_gps.c:659 +msgid "" +"Turn Off After Transfer\n" +"(Garmin/NAViLink Only)" +msgstr "" +"Girar después del cambio\n" +"(Garmin/NAViLink Sólo)" + +#: ../src/datasource_gps.c:666 +msgid "Tracks:" +msgstr "" + +#: ../src/datasource_gps.c:673 +msgid "Routes:" +msgstr "" + +#: ../src/datasource_gps.c:680 +msgid "Waypoints:" +msgstr "" + +#: ../src/datasource_gps.c:756 ../src/vikgpslayer.c:1509 +msgid "GPS device: N/A" +msgstr "Dispositivo GPS: (no disponible)" + +#: ../src/datasource_osm.c:53 ../src/datasource_osm.c:54 +msgid "OSM traces" +msgstr "Trazas de OSM" + +#: ../src/datasource_osm.c:89 +msgid "Page number:" +msgstr "" + +#: ../src/datasource_osm_my_traces.c:59 ../src/datasource_osm_my_traces.c:60 +msgid "OSM My Traces" +msgstr "" + +#: ../src/datasource_osm_my_traces.c:106 ../src/osm-traces.c:684 +#, fuzzy +msgid "Email/username:" +msgstr "Usuario OSM:" + +#: ../src/datasource_osm_my_traces.c:111 +msgid "The email or username used to login to OSM" +msgstr "" + +#: ../src/datasource_osm_my_traces.c:113 ../src/osm-traces.c:692 +msgid "Password:" +msgstr "Contraseña:" + +#: ../src/datasource_osm_my_traces.c:116 +msgid "The password used to login to OSM" +msgstr "" + +#: ../src/datasource_osm_my_traces.c:427 ../src/viktrwlayer.c:689 +msgid "Description" +msgstr "" + +#: ../src/datasource_osm_my_traces.c:442 +msgid "Privacy" +msgstr "" + +#: ../src/datasource_osm_my_traces.c:449 +msgid "Within Current View" +msgstr "" + +#: ../src/datasource_osm_my_traces.c:516 +msgid "GPS Traces" +msgstr "" + +#: ../src/datasource_osm_my_traces.c:518 +msgid "None found!" +msgstr "" + +#: ../src/datasource_osm_my_traces.c:569 +msgid "Ensure the OSM access token preferences are setup." +msgstr "" + +#: ../src/datasource_osm_my_traces.c:645 +msgid "My OSM Traces" +msgstr "" + +#. Report errors to the status bar +#: ../src/datasource_osm_my_traces.c:667 +#, c-format +msgid "Unable to get trace: %s" +msgstr "" + +#: ../src/datasource_routing.c:56 ../src/datasource_routing.c:57 +msgid "Directions" +msgstr "" + +#: ../src/datasource_routing.c:90 +msgid "No routing engines with directions available" +msgstr "" + +#. Engine selector +#: ../src/datasource_routing.c:99 +msgid "Engine:" +msgstr "" + +#. From and To entries +#: ../src/datasource_routing.c:104 +msgid "From:" +msgstr "Desde:" + +#: ../src/datasource_routing.c:105 +msgid "To:" +msgstr "Hasta:" + +#: ../src/datasource_url.c:48 +msgid "Acquire from URL" +msgstr "" + +#: ../src/datasource_url.c:49 +msgid "URL" +msgstr "" + +#: ../src/datasource_url.c:101 +msgid "URL:" +msgstr "" + +#. Only GPX (not using GPSbabel) +#: ../src/datasource_url.c:133 ../src/vikfileentry.c:161 +#: ../src/vikwindow.c:3513 ../src/vikwindow.c:3603 +msgid "GPX" +msgstr "" + +#: ../src/datasource_wikipedia.c:32 +msgid "Create Waypoints from Wikipedia Articles" +msgstr "" + +#: ../src/datasource_wikipedia.c:33 +msgid "Wikipedia Waypoints" +msgstr "" + +#: ../src/dem.c:66 ../src/dem.c:80 +msgid "Invalid DEM" +msgstr "DEM no válido" + +#: ../src/dem.c:122 +msgid "Invalid DEM header" +msgstr "Cabecera DEM no válida" + +#: ../src/dem.c:191 ../src/dem.c:204 +msgid "Incorrect DEM Class B record: expected 1" +msgstr "Registro DEM de clase B incorrecto: se esperaba 1" + +#: ../src/dem.c:289 ../src/download.c:176 +#, c-format +msgid "Couldn't map file %s: %s" +msgstr "No se encuentra el archivo de mapa %s:%s" + +#: ../src/download.c:130 +msgid "Tile age (days):" +msgstr "" + +#: ../src/download.c:406 +#, c-format +msgid "Download error: %s" +msgstr "Error en descarga: %s" + +#: ../src/download.c:490 +msgid "couldn't open temp file" +msgstr "No se ha podido abrir el archivo temporal" + +#: ../src/file.c:458 ../src/file.c:463 +#, c-format +msgid "Draw mode '%s' no more supported" +msgstr "El modo de dibujo '%s' no es soportado ya" + +#: ../src/geotag_exif.c:621 +msgid "Not enough memory." +msgstr "" + +#: ../src/geotag_exif.c:639 +msgid "Setting a value for this tag is unsupported!" +msgstr "" + +#: ../src/geotag_exif.c:658 +#, c-format +msgid "Too few components specified (need %d, found %d)\n" +msgstr "" + +#: ../src/geotag_exif.c:662 +msgid "Numeric value expected\n" +msgstr "Se espera un valor numérico\n" + +#: ../src/geotag_exif.c:670 +msgid "This shouldn't happen!" +msgstr "¡Esto no debería suceder!" + +#: ../src/geotag_exif.c:740 +msgid "Not yet implemented!" +msgstr "¡No implementado aún!" + +#: ../src/geotag_exif.c:753 +msgid "Warning; Too many components specified!" +msgstr "" + +#: ../src/osm-traces.c:87 +msgid "Identifiable (public w/ timestamps)" +msgstr "Identificable (público c/ timestamps)" + +#: ../src/osm-traces.c:88 +msgid "Trackable (private w/ timestamps)" +msgstr "Trazable (privado con fecha y hora)" + +#: ../src/osm-traces.c:89 +msgid "Public" +msgstr "Pública" + +#: ../src/osm-traces.c:90 +msgid "Private" +msgstr "Privado" + +#: ../src/osm-traces.c:108 +msgid "Access Token:" +msgstr "" + +#: ../src/osm-traces.c:108 +msgid "Get New OSM Access Tokens" +msgstr "" + +#: ../src/osm-traces.c:109 +msgid "Access Token Key:" +msgstr "" + +#: ../src/osm-traces.c:110 +msgid "Access Token Secret:" +msgstr "" + +#: ../src/osm-traces.c:111 +msgid "OSM username:" +msgstr "Usuario OSM:" + +#: ../src/osm-traces.c:112 +msgid "OSM password:" +msgstr "Contraseña OSM:" + +#. Check to really override existing values... +#: ../src/osm-traces.c:263 +msgid "Do you want to overwrite existing values?" +msgstr "" + +#: ../src/osm-traces.c:275 +msgid "Not able to generate OSM request tokens." +msgstr "" + +#: ../src/osm-traces.c:299 +msgid "" +"Waiting for authorization approval.\n" +"Ensure you have granted access at the website before continuing here." +msgstr "" + +#: ../src/osm-traces.c:315 +msgid "No Authorization." +msgstr "" + +#: ../src/osm-traces.c:354 +msgid "" +"OSM Username and Password preferences are not required anymore. You can now " +"remove them." +msgstr "" + +#. Preferences +#: ../src/osm-traces.c:379 +msgid "OpenStreetMap Traces" +msgstr "Trazas OpenStreetMap" + +#: ../src/osm-traces.c:504 +#, c-format +msgid "failed to upload data: HTTP response is %ld" +msgstr "fallo al enviar datos: la respuesta HTTP es %ld" + +#: ../src/osm-traces.c:509 +#, c-format +msgid "curl_easy_getinfo failed: %d" +msgstr "fallo en la llamada a la función curl_easy_getinfo(): %d" + +#: ../src/osm-traces.c:514 +#, c-format +msgid "curl request failed: %s" +msgstr "fallo en petición curl: %s" + +#. Success +#: ../src/osm-traces.c:592 +msgid "Uploaded to OSM" +msgstr "Subido a OSM" + +#: ../src/osm-traces.c:596 +msgid "" +"FAILED TO UPLOAD DATA TO OSM - Ensure the OSM access token preferences are " +"setup." +msgstr "" + +#: ../src/osm-traces.c:599 +msgid "FAILED TO UPLOAD DATA TO OSM - CURL PROBLEM" +msgstr "" + +#: ../src/osm-traces.c:602 +msgid "FAILED TO UPLOAD DATA TO OSM" +msgstr "" + +#: ../src/osm-traces.c:602 +msgid "HTTP response code" +msgstr "Código de respuesta HTTP" + +#: ../src/osm-traces.c:610 +#, c-format +msgid "failed to unlink temporary file: %s" +msgstr "fallo al borrar fichero temporal: %s" + +#: ../src/osm-traces.c:664 +msgid "OSM upload" +msgstr "Enviar a OSM" + +#: ../src/osm-traces.c:689 +#, fuzzy +msgid "" +"The email/username used as login\n" +"Enter the email/username you use to login into www.openstreetmap.org." +"" +msgstr "" +"El correo electronico usado para el login\n" +"Introduzca el correo electronico usado para iniciar sesión en www." +"openstreetmap.org." + +#: ../src/osm-traces.c:697 +msgid "" +"The password used to login\n" +"Enter the password you use to login into www.openstreetmap.org." +msgstr "" +"La clave usada para login\n" +"Introduzca la clave usada para iniciar sesión en www.openstreetmap." +"org." + +#: ../src/osm-traces.c:703 +msgid "File's name:" +msgstr "Nombre del fichero:" + +#: ../src/osm-traces.c:713 +msgid "" +"The name of the file on OSM\n" +"This is the name of the file created on the server.This is not the " +"name of the local file." +msgstr "" +"El nombre del archivo usado en OSM\n" +"Este es el nombre del archivo creado en el servidor. Este no es el " +"nombre del archivo local." + +#: ../src/osm-traces.c:717 ../src/viktrwlayer_wpwin.c:197 +#: ../src/viktrwlayer_wpwin.c:199 +msgid "Description:" +msgstr "Descripción:" + +#: ../src/osm-traces.c:731 +msgid "The description of the trace" +msgstr "La descripción de la traza" + +#: ../src/osm-traces.c:734 +msgid "Anonymize Times:" +msgstr "" + +#: ../src/osm-traces.c:739 +msgid "" +"Anonymize times of the trace.\n" +"You may choose to make the trace identifiable, yet mask the actual " +"real time values" +msgstr "" + +#: ../src/osm-traces.c:743 +msgid "Tags:" +msgstr "Etiquetas:" + +#: ../src/osm-traces.c:751 +msgid "The tags associated to the trace" +msgstr "Las etiquetas asociadas a la traza" + +#: ../src/osm-traces.c:816 +#, c-format +msgid "Uploading %s to OSM" +msgstr "Enviando %s a OSM" + +#: ../src/mapcache.c:67 +msgid "Map cache memory size (MB):" +msgstr "" + +#. NB Can have a couple hundred fonts loaded when using system directories +#. So ATM don't list them all - otherwise need better GUI feedback display. +#: ../src/mapnik_interface.cpp:324 +#, c-format +msgid "" +"%s %s\n" +"Plugins=%sFonts loaded=%d" +msgstr "" + +#: ../src/mapnik_interface.cpp:325 ../src/vikmapniklayer.c:278 +msgid "Mapnik" +msgstr "" + +#: ../src/print.c:51 ../src/viktrwlayer.c:572 +msgid "None" +msgstr "Ninguno" + +#: ../src/print.c:52 +msgid "Horizontally" +msgstr "Horizontal" + +#: ../src/print.c:53 +msgid "Vertically" +msgstr "Vertical" + +#: ../src/print.c:54 +msgid "Both" +msgstr "Ambos" + +#: ../src/print.c:118 +msgid "Image Settings" +msgstr "Ajustes de imagen" + +#: ../src/print.c:551 +msgid "done" +msgstr "hecho" + +#. Page Size +#: ../src/print.c:580 +msgid "_Adjust Page Size and Orientation" +msgstr "_Ajustar el tamaño y la orientación de la página" + +#: ../src/print.c:596 +msgid "C_enter:" +msgstr "C_entrado:" + +#. ignore page margins +#: ../src/print.c:614 +msgid "Ignore Page _Margins" +msgstr "Ignorar los _márgenes de la página" + +#: ../src/print.c:633 +msgid "Image S_ize:" +msgstr "_Tamaño de imagen" + +#: ../src/ui_util.c:88 +#, c-format +msgid "Could not launch web browser. %s" +msgstr "" + +#: ../src/ui_util.c:101 +#, c-format +msgid "Could not create new email. %s" +msgstr "" + +#: ../src/vikcoordlayer.c:57 +msgid "Color:" +msgstr "Color:" + +#: ../src/vikcoordlayer.c:58 +msgid "Minutes Width:" +msgstr "Ancho (minutos):" + +#: ../src/vikcoordlayer.c:59 +msgid "Line Thickness:" +msgstr "Ancho de línea:" + +#: ../src/vikcoordlayer.c:66 +msgid "Coordinate" +msgstr "" + +#: ../src/main.c:92 +#, c-format +msgid "Ignoring Xlib error: error code %d request code %d\n" +msgstr "" + +#: ../src/main.c:111 +msgid "Enable debug output" +msgstr "no puedo activar la salida" + +#: ../src/main.c:112 +msgid "Enable verbose output" +msgstr "salida verbosa activada" + +#: ../src/main.c:113 +msgid "Show version" +msgstr "Mostrar versión" + +#: ../src/main.c:114 +msgid "Latitude in decimal degrees" +msgstr "" + +#: ../src/main.c:115 +msgid "Longitude in decimal degrees" +msgstr "" + +#: ../src/main.c:116 +msgid "Zoom Level (OSM). Value can be 0 - 22" +msgstr "" + +#: ../src/main.c:117 +msgid "Add a map layer by id value. Use 0 for the default map." +msgstr "" + +#: ../src/main.c:160 +#, c-format +msgid "" +"%s %s\n" +"Copyright (c) 2003-2008 Evan Battaglia\n" +"Copyright (c) 2008-%s Viking's contributors\n" +msgstr "" + +#: ../src/osm.c:50 +#, fuzzy +msgid "OpenStreetMap (Mapnik)" +msgstr "Trazas OpenStreetMap" + +#: ../src/osm.c:65 +#, fuzzy +msgid "OpenStreetMap (Cycle)" +msgstr "Trazas OpenStreetMap" + +#: ../src/osm.c:79 +#, fuzzy +msgid "OpenStreetMap (Transport)" +msgstr "Trazas OpenStreetMap" + +#: ../src/osm.c:95 +#, fuzzy +msgid "OpenStreetMap (Humanitarian)" +msgstr "Trazas OpenStreetMap" + +#: ../src/osm.c:111 +msgid "On Disk OSM Tile Format" +msgstr "" + +#: ../src/osm.c:121 +msgid "MBTiles File" +msgstr "" + +#: ../src/osm.c:132 +msgid "OSM Metatiles" +msgstr "" + +#: ../src/osm.c:146 +msgid "Mapbox Outdoors" +msgstr "" + +#: ../src/osm.c:153 +msgid "Mapbox Specific" +msgstr "" + +#: ../src/osm.c:170 +msgid "OSM (view)" +msgstr "Vista OSM" + +#: ../src/osm.c:174 +msgid "OSM (edit)" +msgstr "Edicion OSM" + +#. Note the use of positional parameters +#: ../src/osm.c:179 +msgid "OSM (query)" +msgstr "" + +#: ../src/osm.c:183 +msgid "OSM (render)" +msgstr "Renderizado OSM" + +#. Example: http://127.0.0.1:8111/load_and_zoom?left=8.19&right=8.20&top=48.605&bottom=48.590&select=node413602999 +#. JOSM or merkaartor must already be running with remote interface enabled +#: ../src/osm.c:190 +msgid "Local port 8111 (eg JOSM)" +msgstr "" + +#: ../src/osm.c:195 +msgid "Geofabrik Map Compare" +msgstr "" + +#: ../src/osm.c:203 +msgid "OpenStreetMap Notes" +msgstr "" + +#. Not really OSM but can't be bothered to create somewhere else to put it... +#: ../src/osm.c:221 +msgid "Wikimedia Toolserver GeoHack" +msgstr "" + +#: ../src/preferences.c:195 +msgid "Preferences" +msgstr "Preferencias" + +#: ../src/toolbar.c:91 ../src/toolbar.c:92 +msgid "System Default" +msgstr "" + +#: ../src/toolbar.c:91 ../src/viktrwlayer.c:563 +msgid "Small" +msgstr "" + +#: ../src/toolbar.c:91 ../src/viktrwlayer.c:564 +msgid "Medium" +msgstr "" + +#: ../src/toolbar.c:91 ../src/viktrwlayer.c:565 +msgid "Large" +msgstr "" + +#: ../src/toolbar.c:92 +msgid "Icons Only" +msgstr "" + +#: ../src/toolbar.c:92 +msgid "Text Only" +msgstr "" + +#: ../src/toolbar.c:92 +msgid "Icons and Text" +msgstr "" + +#: ../src/toolbar.c:106 +msgid "Append to Menu:" +msgstr "" + +#: ../src/toolbar.c:107 +msgid "Pack the toolbar to the main menu to save vertical space" +msgstr "" + +#: ../src/toolbar.c:108 +msgid "Icon Size:" +msgstr "" + +#: ../src/toolbar.c:110 +msgid "Icon Style:" +msgstr "" + +#: ../src/toolbar.c:112 +msgid "Customize:" +msgstr "" + +#: ../src/toolbar.c:112 +msgid "Customize Buttons" +msgstr "" + +#. Preferences +#: ../src/toolbar.c:145 +msgid "Toolbar" +msgstr "" + +#: ../src/toolbar.c:312 +msgid "_Customize" +msgstr "" + +#: ../src/toolbar.c:641 +msgid "Separator" +msgstr "" + +#: ../src/toolbar.c:642 +msgid "--- Separator ---" +msgstr "" + +#: ../src/toolbar.c:1007 +msgid "Customize Toolbar" +msgstr "" + +#: ../src/toolbar.c:1028 +msgid "" +"Select items to be displayed on the toolbar. Items can be reordered by drag " +"and drop." +msgstr "" + +#: ../src/toolbar.c:1044 +msgid "Available Items" +msgstr "" + +#: ../src/toolbar.c:1065 +msgid "Displayed Items" +msgstr "" + +#: ../src/viklayer_defaults.c:232 +#, c-format +msgid "Could not open file: %s" +msgstr "" + +#: ../src/viklayer_defaults.c:304 +msgid "Layer Defaults" +msgstr "" + +#: ../src/uibuilder.c:196 +msgid "Take care that this password will be stored clearly in a plain file." +msgstr "verifica que este password se borre en el archivo plano" + +#: ../src/uibuilder.c:628 ../src/viktrwlayer_export.c:188 +#: ../src/viktrwlayer_export.c:304 ../src/vikwindow.c:3666 +#: ../src/vikwindow.c:4408 +#, c-format +msgid "The file \"%s\" exists, do you wish to overwrite it?" +msgstr "El fichero \"%s\" existe. ¿Desea sobreescribirlo?" + +#: ../src/vikaggregatelayer.c:41 +msgid "Aggregate" +msgstr "" + +#: ../src/vikaggregatelayer.c:528 ../src/viktrwlayer.c:11700 +#, c-format +msgid "%s: Waypoint List" +msgstr "" + +#: ../src/vikaggregatelayer.c:570 +msgid "Search by Date" +msgstr "" + +#: ../src/vikaggregatelayer.c:576 +msgid "No items found with the requested date." +msgstr "" + +#: ../src/vikaggregatelayer.c:615 ../src/viktrwlayer.c:11691 +#, c-format +msgid "%s: Track and Route List" +msgstr "" + +#: ../src/vikaggregatelayer.c:681 ../src/viktrwlayer.c:8346 +#: ../src/viktrwlayer.c:8417 ../src/viktrwlayer.c:8494 +msgid "_Visibility" +msgstr "" + +#: ../src/vikaggregatelayer.c:686 +msgid "_Show All" +msgstr "" + +#: ../src/vikaggregatelayer.c:692 +msgid "_Hide All" +msgstr "" + +#: ../src/vikaggregatelayer.c:698 ../src/viktrwlayer.c:8363 +#: ../src/viktrwlayer.c:8434 ../src/viktrwlayer.c:8511 +msgid "_Toggle" +msgstr "" + +#: ../src/vikaggregatelayer.c:705 ../src/viktrwlayer.c:8532 +msgid "_Sort" +msgstr "" + +#: ../src/vikaggregatelayer.c:711 ../src/viktrwlayer.c:8538 +msgid "Name _Ascending" +msgstr "" + +#: ../src/vikaggregatelayer.c:717 ../src/viktrwlayer.c:8544 +msgid "Name _Descending" +msgstr "" + +#: ../src/vikaggregatelayer.c:723 ../src/viktrwlayer.c:575 +#: ../src/viktrwlayer.c:8550 +msgid "Date Ascending" +msgstr "" + +#: ../src/vikaggregatelayer.c:729 ../src/viktrwlayer.c:576 +#: ../src/viktrwlayer.c:8556 +msgid "Date Descending" +msgstr "" + +#: ../src/vikaggregatelayer.c:735 ../src/viktrwlayer.c:8445 +#: ../src/viktrwlayer.c:8523 ../src/viktrwlayer.c:8595 +#: ../src/viktrwlayer_tracklist.c:296 +msgid "_Statistics" +msgstr "" + +#: ../src/vikaggregatelayer.c:740 ../src/viktrwlayer.c:4533 +msgid "Track _List..." +msgstr "" + +#: ../src/vikaggregatelayer.c:746 ../src/viktrwlayer.c:4540 +msgid "_Waypoint List..." +msgstr "" + +#: ../src/vikaggregatelayer.c:753 +msgid "Searc_h" +msgstr "" + +#: ../src/vikaggregatelayer.c:759 +msgid "By _Date..." +msgstr "" + +#: ../src/vikaggregatelayer.c:762 +msgid "Find the first item with a specified date" +msgstr "" + +#: ../src/vikaggregatelayer.c:765 +msgid "Load E_xternal Layers" +msgstr "" + +#. Could have a more complicated tooltip that numbers each type of layers, +#. but for now a simple overall count +#: ../src/vikaggregatelayer.c:1011 +#, c-format +msgid "One layer" +msgid_plural "%d layers" +msgstr[0] "" +msgstr[1] "" + +#: ../src/vikaggregatelayer.c:1014 +#, fuzzy, c-format +msgid "Empty" +msgstr "Todo vacío" + +#: ../src/vikdemlayer.c:86 +msgid "SRTM Global 90m (3 arcsec)" +msgstr "" + +#: ../src/vikdemlayer.c:94 +msgid "Absolute height" +msgstr "Altura Absoluta" + +#: ../src/vikdemlayer.c:95 +msgid "Height gradient" +msgstr "Gradiente de Altura" + +#: ../src/vikdemlayer.c:120 +msgid "DEM Files:" +msgstr "Ficheros DEM:" + +#: ../src/vikdemlayer.c:121 +msgid "Download Source:" +msgstr "Fuentes de descarga:" + +#: ../src/vikdemlayer.c:122 +msgid "Min Elev Color:" +msgstr "Color para la elevación mínima" + +#: ../src/vikdemlayer.c:123 ../src/viktrwlayer_wpwin.c:207 +msgid "Type:" +msgstr "Tipo:" + +#: ../src/vikdemlayer.c:124 +msgid "Min Elev:" +msgstr "Elev. min.:" + +#: ../src/vikdemlayer.c:125 +msgid "Max Elev:" +msgstr "Elev. max.:" + +#: ../src/vikdemlayer.c:137 +msgid "_DEM Download" +msgstr "" + +#: ../src/vikdemlayer.c:137 +msgid "DEM Download" +msgstr "" + +#: ../src/vikdemlayer.c:192 +msgid "DEM" +msgstr "" + +#: ../src/vikdemlayer.c:304 +#, c-format +msgid "Number of files: %d" +msgstr "Número de ficheros: %d" + +#: ../src/vikdemlayer.c:446 +msgid "DEM Loading" +msgstr "Cargando DEM" + +#: ../src/vikdemlayer.c:927 +#, c-format +msgid "No SRTM data available for %f, %f" +msgstr "Ningun dato SRTM disponible para %f, %f" + +#: ../src/vikdemlayer.c:948 +#, c-format +msgid "DEM download failure for %f, %f" +msgstr "" + +#: ../src/vikdemlayer.c:954 +#, c-format +msgid "DEM write failure for %s" +msgstr "" + +#. Probably not over any land... +#: ../src/vikdemlayer.c:1201 +msgid "No DEM File Available" +msgstr "" + +#: ../src/vikdemlayer.c:1220 +#, c-format +msgid "" +"\n" +"Source: %s\n" +"\n" +"DEM File: %s\n" +"DEM File Timestamp: %s" +msgstr "" + +#: ../src/vikdemlayer.c:1224 +#, c-format +msgid "" +"Source: %s\n" +"\n" +"No DEM File!" +msgstr "" + +#: ../src/vikdemlayer.c:1264 +#, c-format +msgid "Downloading DEM %s" +msgstr "Descargando DEM %s" + +#: ../src/vikdemlayer.c:1289 +msgid "_Show DEM File Information" +msgstr "" + +#: ../src/vikfileentry.c:72 +msgid "Browse..." +msgstr "Examinar..." + +#: ../src/vikfileentry.c:103 +msgid "Choose file" +msgstr "Elegir fichero" + +#: ../src/vikfileentry.c:120 ../src/vikwindow.c:4372 +msgid "PNG" +msgstr "" + +#: ../src/vikfileentry.c:125 +msgid "TIFF" +msgstr "" + +#: ../src/vikfileentry.c:133 +msgid "MBTiles" +msgstr "" + +#: ../src/vikfileentry.c:142 +msgid "XML" +msgstr "" + +#: ../src/vikfileentry.c:149 +msgid "MML" +msgstr "" + +#: ../src/vikfileentry.c:154 +msgid "MSS" +msgstr "" + +#: ../src/vikfilelist.c:49 +msgid "Choose file(s)" +msgstr "Elegir fichero(s)" + +#: ../src/vikfilelist.c:182 +msgid "Add..." +msgstr "Añadir…" + +#: ../src/vikfilelist.c:183 +msgid "Delete" +msgstr "Borrar" + +#: ../src/vikgeoreflayer.c:97 +msgid "_Georef Move Map" +msgstr "" + +#: ../src/vikgeoreflayer.c:97 +msgid "Georef Move Map" +msgstr "Mover mapa Georef" + +#: ../src/vikgeoreflayer.c:106 +msgid "Georef Z_oom Tool" +msgstr "" + +#: ../src/vikgeoreflayer.c:106 +msgid "Georef Zoom Tool" +msgstr "Zoom Georef" + +#: ../src/vikgeoreflayer.c:117 +msgid "GeoRef Map" +msgstr "" + +#: ../src/vikgeoreflayer.c:214 +msgid "Auto Read World Files:" +msgstr "" + +#: ../src/vikgeoreflayer.c:215 +msgid "" +"Automatically attempt to read associated world file of a new image for a " +"GeoRef layer" +msgstr "" + +#: ../src/vikgeoreflayer.c:511 ../src/vikgeoreflayer.c:797 +#: ../src/vikmapslayer.c:1174 +#, c-format +msgid "Couldn't open image file: %s" +msgstr "No se ha podido abrir el fichero de imagen: %s" + +#: ../src/vikgeoreflayer.c:607 ../src/vikgeoreflayer.c:633 +msgid "Choose World file" +msgstr "Elegir fichero World" + +#: ../src/vikgeoreflayer.c:619 +msgid "The World file you requested could not be opened for reading." +msgstr "El fichero World seleccionado no se ha podido abrir para lectura." + +#: ../src/vikgeoreflayer.c:621 +msgid "Unexpected end of file reading World file." +msgstr "Final de fichero inesperado mientras se leía el fichero World." + +#: ../src/vikgeoreflayer.c:646 +msgid "The file you requested could not be opened for writing." +msgstr "El fichero seleccionado no se ha podido abrir para escritura." + +#: ../src/vikgeoreflayer.c:782 +msgid "Lower right corner values may not be consistent with upper right values" +msgstr "" + +#: ../src/vikgeoreflayer.c:806 +#, c-format +msgid "Invalid image size: %s" +msgstr "" + +#: ../src/vikgeoreflayer.c:831 ../src/viklayer.c:561 ../src/vikwindow.c:4891 +msgid "Layer Properties" +msgstr "Propiedades de capa" + +#: ../src/vikgeoreflayer.c:852 +msgid "World File Parameters:" +msgstr "Parámetros de fichero World:" + +#: ../src/vikgeoreflayer.c:853 +msgid "Load From File..." +msgstr "Cargar desde archivo..." + +#: ../src/vikgeoreflayer.c:858 +msgid "Corner pixel easting:" +msgstr "Despl. E de la esquina" + +#: ../src/vikgeoreflayer.c:860 +msgid "the UTM \"easting\" value of the upper-left corner pixel of the map" +msgstr "" + +#: ../src/vikgeoreflayer.c:862 +msgid "Corner pixel northing:" +msgstr "Despl. N de la esquina" + +#: ../src/vikgeoreflayer.c:864 +msgid "the UTM \"northing\" value of the upper-left corner pixel of the map" +msgstr "" + +#: ../src/vikgeoreflayer.c:866 +msgid "X (easting) scale (mpp): " +msgstr "Escala X (desp. E, metros/píxel): " + +#: ../src/vikgeoreflayer.c:867 +msgid "Y (northing) scale (mpp): " +msgstr "Escala Y (desp. N, metros/píxel): " + +#: ../src/vikgeoreflayer.c:870 +msgid "the scale of the map in the X direction (meters per pixel)" +msgstr "la escala del mapa en la dirección X (metros por pixel)" + +#: ../src/vikgeoreflayer.c:872 +msgid "the scale of the map in the Y direction (meters per pixel)" +msgstr "la escala del mapa en la dirección Y (metros por pixel)" + +#: ../src/vikgeoreflayer.c:874 +msgid "Map Image:" +msgstr "Imagen de mapa:" + +#: ../src/vikgeoreflayer.c:919 +msgid "Upper left latitude:" +msgstr "" + +#: ../src/vikgeoreflayer.c:921 +msgid "Upper left longitude:" +msgstr "" + +#: ../src/vikgeoreflayer.c:923 +msgid "Lower right latitude:" +msgstr "" + +#: ../src/vikgeoreflayer.c:925 +msgid "Lower right longitude:" +msgstr "" + +#: ../src/vikgeoreflayer.c:937 +msgid "Calculate MPP values from coordinates" +msgstr "" + +#: ../src/vikgeoreflayer.c:938 +msgid "" +"Enter all corner coordinates before calculating the MPP values from the " +"image size" +msgstr "" + +#: ../src/vikgeoreflayer.c:948 +msgid "UTM" +msgstr "" + +#: ../src/vikgeoreflayer.c:949 +msgid "Latitude/Longitude" +msgstr "" + +#: ../src/vikgeoreflayer.c:957 ../src/vikmapniklayer.c:82 +#: ../src/vikmapslayer.c:158 +msgid "Alpha:" +msgstr "Alfa:" + +#. Now with icons +#: ../src/vikgeoreflayer.c:1062 +msgid "_Zoom to Fit Map" +msgstr "_Zoom para ajustar mapa" + +#: ../src/vikgeoreflayer.c:1068 +msgid "_Goto Map Center" +msgstr "_Ir al centro del mapa" + +#: ../src/vikgeoreflayer.c:1074 +msgid "_Export to World File" +msgstr "_Exportar hacia Archivo Mundial" + +#: ../src/vikgoto.c:98 +msgid "No goto tool available." +msgstr "La herramienta \"ir a\" no esta disponible" + +#: ../src/vikgoto.c:295 +msgid "goto" +msgstr "ir a" + +#: ../src/vikgoto.c:297 +msgid "goto provider:" +msgstr "proveedor \"ir a\"" + +#: ../src/vikgoto.c:312 +msgid "Enter address or place name:" +msgstr "Introduzca la dirección o nombre del lugar:" + +#: ../src/vikgoto.c:487 +msgid "Locality" +msgstr "" + +#: ../src/vikgpslayer.c:137 +msgid "Data Mode" +msgstr "" + +#: ../src/vikgpslayer.c:139 +msgid "Realtime Tracking Mode" +msgstr "" + +#: ../src/vikgpslayer.c:176 +msgid "Keep vehicle at center" +msgstr "" + +#: ../src/vikgpslayer.c:177 +msgid "Keep vehicle on screen" +msgstr "" + +#: ../src/vikgpslayer.c:178 +msgid "Disable" +msgstr "" + +#: ../src/vikgpslayer.c:218 +msgid "Download Tracks:" +msgstr "" + +#: ../src/vikgpslayer.c:219 +msgid "Upload Tracks:" +msgstr "" + +#: ../src/vikgpslayer.c:220 +msgid "Download Routes:" +msgstr "" + +#: ../src/vikgpslayer.c:221 +msgid "Upload Routes:" +msgstr "" + +#: ../src/vikgpslayer.c:222 +msgid "Download Waypoints:" +msgstr "" + +#: ../src/vikgpslayer.c:223 +msgid "Upload Waypoints:" +msgstr "" + +#: ../src/vikgpslayer.c:225 +msgid "Recording tracks" +msgstr "Grabando rutas" + +#: ../src/vikgpslayer.c:226 +msgid "Jump to current position on start" +msgstr "Saltar a la posición actual al comienzo" + +#: ../src/vikgpslayer.c:227 +msgid "Moving Map Method:" +msgstr "Metodo de movimiento de mapas" + +#: ../src/vikgpslayer.c:228 +msgid "Update Statusbar:" +msgstr "" + +#: ../src/vikgpslayer.c:228 +msgid "Display information in the statusbar on GPS updates" +msgstr "" + +#: ../src/vikgpslayer.c:229 +msgid "Auto Connect" +msgstr "" + +#: ../src/vikgpslayer.c:229 +msgid "Automatically connect to GPSD" +msgstr "" + +#: ../src/vikgpslayer.c:230 +msgid "Gpsd Host:" +msgstr "Servidor gpsd:" + +#: ../src/vikgpslayer.c:231 +msgid "Gpsd Port:" +msgstr "Puerto gpsd:" + +#: ../src/vikgpslayer.c:232 +msgid "Gpsd Retry Interval (seconds):" +msgstr "Intervalo de reconexión de Gpsd (segundos)" + +#: ../src/vikgpslayer.c:254 +msgid "GPS" +msgstr "" + +#: ../src/vikgpslayer.c:320 ../src/vikgpslayer.c:1504 +msgid "GPS Download" +msgstr "Descargar desde GPS" + +#: ../src/vikgpslayer.c:320 ../src/vikgpslayer.c:1504 ../src/viktrwlayer.c:3993 +msgid "GPS Upload" +msgstr "Enviar al GPS" + +#: ../src/vikgpslayer.c:322 +msgid "GPS Realtime Tracking" +msgstr "Seguimiento GPS en tiempo real" + +#: ../src/vikgpslayer.c:458 +msgid "Connected" +msgstr "" + +#: ../src/vikgpslayer.c:460 +msgid "Disconnected" +msgstr "" + +#: ../src/vikgpslayer.c:554 +msgid "Unknown GPS Protocol" +msgstr "Protocolo GPS desconocido" + +#: ../src/vikgpslayer.c:572 +msgid "Unknown serial port device" +msgstr "Puerto serie desconocido" + +#: ../src/vikgpslayer.c:691 +#, c-format +msgid "%s: unknown parameter" +msgstr "Parámetro desconocido: %s" + +#. Now with icons +#: ../src/vikgpslayer.c:794 +msgid "_Upload to GPS" +msgstr "_Subir a GPS" + +#: ../src/vikgpslayer.c:800 +msgid "Download from _GPS" +msgstr "Descargar desde _GPS" + +#: ../src/vikgpslayer.c:821 +msgid "Empty _Realtime" +msgstr "Vaciar en tiempo real" + +#: ../src/vikgpslayer.c:828 +msgid "E_mpty Upload" +msgstr "Subida vacía" + +#: ../src/vikgpslayer.c:834 +msgid "_Empty Download" +msgstr "Descarga vacía" + +#: ../src/vikgpslayer.c:840 +msgid "Empty _All" +msgstr "Todo vacío" + +#: ../src/vikgpslayer.c:852 +#, c-format +msgid "Unexpected number of disconnected handlers: %d" +msgstr "Número inesperado de manejadores desconectados: %d" + +#: ../src/vikgpslayer.c:995 +#, c-format +msgid "Uploading %d waypoint..." +msgid_plural "Uploading %d waypoints..." +msgstr[0] "Subiendo %d waypoint..." +msgstr[1] "Subiendo %d waypoints..." + +#: ../src/vikgpslayer.c:1000 +#, c-format +msgid "Uploading %d trackpoint..." +msgid_plural "Uploading %d trackpoints..." +msgstr[0] "Subiendo %d traza..." +msgstr[1] "Subiendo %d trazas..." + +#: ../src/vikgpslayer.c:1005 +#, c-format +msgid "Uploading %d routepoint..." +msgid_plural "Uploading %d routepoints..." +msgstr[0] "" +msgstr[1] "" + +#: ../src/vikgpslayer.c:1034 +#, c-format +msgid "Downloaded %d out of %d waypoint..." +msgid_plural "Downloaded %d out of %d waypoints..." +msgstr[0] "Descargado %d de %d waypoint..." +msgstr[1] "Descargados %d de %d waypoints..." + +#: ../src/vikgpslayer.c:1040 +#, c-format +msgid "Downloaded %d out of %d trackpoint..." +msgid_plural "Downloaded %d out of %d trackpoints..." +msgstr[0] "Descargada %d de %d traza..." +msgstr[1] "Descargadas %d de %d trazas..." + +#: ../src/vikgpslayer.c:1046 +#, c-format +msgid "Downloaded %d out of %d routepoint..." +msgid_plural "Downloaded %d out of %d routepoints..." +msgstr[0] "" +msgstr[1] "" + +#: ../src/vikgpslayer.c:1056 +#, c-format +msgid "Uploaded %d out of %d waypoint..." +msgid_plural "Uploaded %d out of %d waypoints..." +msgstr[0] "Subida %d de %d waypoint..." +msgstr[1] "Subidas %d de %d waypoints..." + +#: ../src/vikgpslayer.c:1062 +#, c-format +msgid "Uploaded %d out of %d trackpoint..." +msgid_plural "Uploaded %d out of %d trackpoints..." +msgstr[0] "Subida %d de %d trza..." +msgstr[1] "Subidas %d de %d trazas..." + +#: ../src/vikgpslayer.c:1068 +#, c-format +msgid "Uploaded %d out of %d routepoint..." +msgid_plural "Uploaded %d out of %d routepoints..." +msgstr[0] "" +msgstr[1] "" + +#: ../src/vikgpslayer.c:1079 +#, c-format +msgid "Downloaded %d waypoint" +msgid_plural "Downloaded %d waypoints" +msgstr[0] "Descargado %d waypoint" +msgstr[1] "Descargados %d waypoints" + +#: ../src/vikgpslayer.c:1085 +#, c-format +msgid "Downloaded %d trackpoint" +msgid_plural "Downloaded %d trackpoints" +msgstr[0] "Descargada %d traza" +msgstr[1] "Descargadas %d trazas" + +#: ../src/vikgpslayer.c:1091 +#, c-format +msgid "Downloaded %d routepoint" +msgid_plural "Downloaded %d routepoints" +msgstr[0] "" +msgstr[1] "" + +#: ../src/vikgpslayer.c:1101 +#, c-format +msgid "Uploaded %d waypoint" +msgid_plural "Uploaded %d waypoints" +msgstr[0] "Subido %d waypoint" +msgstr[1] "Subidos %d waypoints" + +#: ../src/vikgpslayer.c:1107 +#, c-format +msgid "Uploaded %d trackpoint" +msgid_plural "Uploaded %d trackpoints" +msgstr[0] "Subida %d traza" +msgstr[1] "Subidas %d trazas" + +#: ../src/vikgpslayer.c:1113 +#, c-format +msgid "Uploaded %d routepoint" +msgid_plural "Uploaded %d routepoints" +msgstr[0] "" +msgstr[1] "" + +#: ../src/vikgpslayer.c:1363 +msgid "Error: No result." +msgstr "" + +#: ../src/vikgpslayer.c:1471 +msgid "Warning - GPS Upload items may overwrite each other" +msgstr "" + +#: ../src/vikgpslayer.c:1506 +msgid "Status: detecting gpsbabel" +msgstr "Conectando a gpsbabel" + +#: ../src/vikgpslayer.c:1533 +msgid "No GPS items selected for transfer." +msgstr "" + +#: ../src/vikgpslayer.c:1546 +msgid "Could not turn off device." +msgstr "" + +#: ../src/vikgpslayer.c:1589 +msgid "Are you sure you want to delete GPS Upload data?" +msgstr "" + +#: ../src/vikgpslayer.c:1602 +msgid "Are you sure you want to delete GPS Download data?" +msgstr "" + +#: ../src/vikgpslayer.c:1616 +msgid "Are you sure you want to delete GPS Realtime data?" +msgstr "" + +#: ../src/vikgpslayer.c:1630 +msgid "Are you sure you want to delete All GPS data?" +msgstr "" + +#: ../src/vikgpslayer.c:2004 +#, c-format +msgid "" +"Failed to connect to gpsd at %s (port %s)\n" +"Should Viking keep trying (every %d seconds)?" +msgstr "" + +#: ../src/viklayerspanel.c:73 +msgid "C_ut" +msgstr "" + +#: ../src/viklayerspanel.c:74 ../src/vikwindow.c:4882 +msgid "_Copy" +msgstr "_Copiar" + +#: ../src/viklayerspanel.c:75 ../src/vikwindow.c:4883 +msgid "_Paste" +msgstr "_Pegar" + +#: ../src/viklayerspanel.c:76 ../src/vikwindow.c:4884 +msgid "_Delete" +msgstr "_Borrar" + +#: ../src/viklayerspanel.c:154 +msgid "New Layer" +msgstr "" + +#: ../src/viklayerspanel.c:347 +msgid "Top Layer" +msgstr "Capa principal" + +#: ../src/viklayerspanel.c:363 +msgid "Add new layer" +msgstr "Añadir nueva capa" + +#: ../src/viklayerspanel.c:370 ../src/vikwindow.c:4884 +msgid "Remove selected layer" +msgstr "Remover la capa seleccionada" + +#: ../src/viklayerspanel.c:377 +msgid "Move selected layer up" +msgstr "Mover la capa seleccionada" + +#: ../src/viklayerspanel.c:384 +msgid "Move selected layer down" +msgstr "Mover la capa seleccionada abajo" + +#: ../src/viklayerspanel.c:391 ../src/vikwindow.c:4881 +msgid "Cut selected layer" +msgstr "Cortar la capa seleccionada" + +#: ../src/viklayerspanel.c:398 ../src/vikwindow.c:4882 +msgid "Copy selected layer" +msgstr "Copiar la capa seleccionada" + +#: ../src/viklayerspanel.c:405 ../src/vikwindow.c:4883 +msgid "" +"Paste layer into selected container layer or otherwise above selected layer" +msgstr "" + +#: ../src/viklayerspanel.c:502 +msgid "New name can not be blank." +msgstr "" + +#: ../src/viklayerspanel.c:751 +msgid "Aggregate Layers have no settable properties." +msgstr "Las capas de agregación no tienen propiedades modificables." + +#: ../src/viklayerspanel.c:798 +msgid "You cannot cut the Top Layer." +msgstr "No se puede cortar la capa principal." + +#: ../src/viklayerspanel.c:843 +#, c-format +msgid "Are you sure you want to delete %s?" +msgstr "" + +#: ../src/viklayerspanel.c:863 +msgid "You cannot delete the Top Layer." +msgstr "No se puede borrar la capa principal." + +#: ../src/vikmapniklayer.c:78 +msgid "CSS (MML) Config File:" +msgstr "" + +#: ../src/vikmapniklayer.c:79 +msgid "CartoCSS configuration file" +msgstr "" + +#: ../src/vikmapniklayer.c:80 +msgid "XML Config File:" +msgstr "" + +#: ../src/vikmapniklayer.c:81 +msgid "Mapnik XML configuration file" +msgstr "" + +#: ../src/vikmapniklayer.c:84 +msgid "Use File Cache:" +msgstr "" + +#: ../src/vikmapniklayer.c:86 +msgid "File Cache Directory:" +msgstr "" + +#: ../src/vikmapniklayer.c:122 +msgid "_Mapnik Features" +msgstr "" + +#: ../src/vikmapniklayer.c:122 +msgid "Mapnik Features" +msgstr "" + +#: ../src/vikmapniklayer.c:140 +msgid "Mapnik Rendering" +msgstr "" + +#. Changing these values only applies before first mapnik layer is 'created' +#: ../src/vikmapniklayer.c:258 +msgid "Plugins Directory:" +msgstr "" + +#: ../src/vikmapniklayer.c:258 ../src/vikmapniklayer.c:259 +#: ../src/vikmapniklayer.c:260 ../src/vikmapniklayer.c:261 +msgid "You need to restart Viking for a change to this value to be used" +msgstr "" + +#: ../src/vikmapniklayer.c:259 +msgid "Fonts Directory:" +msgstr "" + +#: ../src/vikmapniklayer.c:260 +msgid "Recurse Fonts Directory:" +msgstr "" + +#: ../src/vikmapniklayer.c:261 +msgid "Rerender Timeout (hours):" +msgstr "" + +#. Changeable any time +#: ../src/vikmapniklayer.c:263 +msgid "CartoCSS:" +msgstr "" + +#: ../src/vikmapniklayer.c:263 +msgid "The program to convert CartoCSS files into Mapnik XML" +msgstr "" + +#: ../src/vikmapniklayer.c:506 +msgid "Running" +msgstr "" + +#: ../src/vikmapniklayer.c:525 +#, c-format +msgid "" +"Error running carto command:\n" +"%s" +msgstr "" + +#: ../src/vikmapniklayer.c:561 +msgid " completed in " +msgstr "" + +#: ../src/vikmapniklayer.c:561 +msgid "seconds" +msgstr "" + +#: ../src/vikmapniklayer.c:611 ../src/vikmapniklayer.c:979 +#, c-format +msgid "" +"Mapnik error loading configuration file:\n" +"%s" +msgstr "" + +#: ../src/vikmapniklayer.c:749 +#, c-format +msgid "Mapnik Render %d:%d:%d %s" +msgstr "" + +#: ../src/vikmapniklayer.c:840 +msgid "Mapnik Rendering must be in Mercator mode" +msgstr "" + +#: ../src/vikmapniklayer.c:997 +msgid "Mapnik Information" +msgstr "" + +#: ../src/vikmapniklayer.c:1031 +msgid "_Flush Memory Cache" +msgstr "" + +#: ../src/vikmapniklayer.c:1044 +msgid "_Run Carto Command" +msgstr "" + +#: ../src/vikmapniklayer.c:1102 ../src/vikmapslayer.c:2029 +#, c-format +msgid "Tile File Timestamp: %s" +msgstr "" + +#: ../src/vikmapniklayer.c:1105 ../src/vikmapslayer.c:2032 +msgid "Tile File Timestamp: Not Available" +msgstr "" + +#: ../src/vikmapniklayer.c:1120 +#, c-format +msgid "Rendering time %.2f seconds" +msgstr "" + +#: ../src/vikmapniklayer.c:1124 ../src/vikmapslayer.c:2042 +msgid "Tile Information" +msgstr "" + +#: ../src/vikmapniklayer.c:1145 +msgid "_Rerender Tile" +msgstr "" + +#: ../src/vikmapniklayer.c:1150 +msgid "_Info" +msgstr "" + +#. ******* MAPZOOMS ******** +#: ../src/vikmapslayer.c:96 +msgid "Use Viking Zoom Level" +msgstr "Usar nivel de zoom de Viking" + +#: ../src/vikmapslayer.c:146 +msgid "OSM" +msgstr "" + +#. NB mode => id - But can't break file format just to rename something better +#: ../src/vikmapslayer.c:152 +msgid "Map Type:" +msgstr "Tipo de mapa:" + +#: ../src/vikmapslayer.c:153 +msgid "Maps Directory:" +msgstr "Directorio de Mapas:" + +#: ../src/vikmapslayer.c:154 +msgid "Cache Layout:" +msgstr "" + +#: ../src/vikmapslayer.c:155 +msgid "This determines the tile storage layout on disk" +msgstr "" + +#: ../src/vikmapslayer.c:156 +msgid "Map File:" +msgstr "" + +#: ../src/vikmapslayer.c:157 +msgid "An MBTiles file. Only applies when the map type method is 'MBTiles'" +msgstr "" + +#: ../src/vikmapslayer.c:159 +msgid "Control the Alpha value for transparency effects" +msgstr "" + +#: ../src/vikmapslayer.c:160 +msgid "Autodownload maps:" +msgstr "Autodescargar mapas:" + +#: ../src/vikmapslayer.c:161 +msgid "Autodownload Only Gets Missing Maps:" +msgstr "" + +#: ../src/vikmapslayer.c:162 +msgid "" +"Using this option avoids attempting to update already acquired tiles. This " +"can be useful if you want to restrict the network usage, without having to " +"resort to manual control. Only applies when 'Autodownload Maps' is on." +msgstr "" + +#: ../src/vikmapslayer.c:163 +msgid "Zoom Level:" +msgstr "Nivel de zoom:" + +#: ../src/vikmapslayer.c:164 +msgid "" +"Determines the method of displaying map tiles for the current zoom level. " +"'Viking Zoom Level' uses the best matching level, otherwise setting a fixed " +"value will always use map tiles of the specified value regardless of the " +"actual zoom level." +msgstr "" + +#: ../src/vikmapslayer.c:197 +msgid "_Maps Download" +msgstr "" + +#: ../src/vikmapslayer.c:197 +msgid "Maps Download" +msgstr "Descarga de mapas" + +#: ../src/vikmapslayer.c:213 ../src/vikutils.c:895 +msgid "Map" +msgstr "Mapa" + +#: ../src/vikmapslayer.c:306 +msgid "Default map layer directory:" +msgstr "" + +#: ../src/vikmapslayer.c:306 +msgid "Choose a directory to store cached Map tiles for this layer" +msgstr "" + +#: ../src/vikmapslayer.c:436 ../src/vikmapslayer.c:633 +msgid "Unknown map type" +msgstr "Tipo de mapa desconocido" + +#: ../src/vikmapslayer.c:664 +msgid "Unknown Map Zoom" +msgstr "Nivel de zoom de mapa desconocido" + +#: ../src/vikmapslayer.c:833 +#, c-format +msgid "Failed to open MBTiles file: %s" +msgstr "" + +#: ../src/vikmapslayer.c:856 +#, c-format +msgid "" +"New map cannot be displayed in the current drawmode.\n" +"Select \"%s\" from View menu to view it." +msgstr "" +"El nuevo mapa no puede ser visualizado en el modo actual.\n" +"Seleccione \"%s\" en el menu Ver para mostrarlo." + +#: ../src/vikmapslayer.c:1314 +#, c-format +msgid "" +"Cowardly refusing to draw tiles or existence of tiles beyond %d zoom out " +"factor" +msgstr "" +"Evitando pusilánimemente el dibujado de teselas o existencia de teselas mas " +"alla del factor de zoom %d" + +#. TODO: ?? count up the number of download errors somehow... +#: ../src/vikmapslayer.c:1667 +msgid "Failed to download tile" +msgstr "" + +#: ../src/vikmapslayer.c:1673 +msgid "Unable to save tile" +msgstr "" + +#: ../src/vikmapslayer.c:1799 +#, c-format +msgid "Redownloading up to %d %s map..." +msgid_plural "Redownloading up to %d %s maps..." +msgstr[0] "Descargando arriba de %d%s mapas" +msgstr[1] "Descargando arriba de %d%s mapas" + +#: ../src/vikmapslayer.c:1801 +#, c-format +msgid "Redownloading %d %s map..." +msgid_plural "Redownloading %d %s maps..." +msgstr[0] "Redescargando %d %s mapa..." +msgstr[1] "Redescargando %d %s mapas..." + +#: ../src/vikmapslayer.c:1805 ../src/vikmapslayer.c:1890 +#, c-format +msgid "Downloading %d %s map..." +msgid_plural "Downloading %d %s maps..." +msgstr[0] "Descargando mapa %d (%s)..." +msgstr[1] "Descargando mapas %d (%s)..." + +#: ../src/vikmapslayer.c:1969 +msgid "YES" +msgstr "" + +#: ../src/vikmapslayer.c:1973 ../src/vikmapslayer.c:1977 +msgid "NO" +msgstr "" + +#. NB Also handles .jpg automatically due to pixbuf_new_from () support - although just print png for now. +#: ../src/vikmapslayer.c:1980 +#, c-format +msgid "Source: %s (%d%s%d%s%d.%s %s)" +msgstr "" + +#: ../src/vikmapslayer.c:1983 +msgid "Source: Not available" +msgstr "" + +#: ../src/vikmapslayer.c:2000 +msgid "Source: file://" +msgstr "" + +#: ../src/vikmapslayer.c:2012 +#, c-format +msgid "Source: %s" +msgstr "" + +#: ../src/vikmapslayer.c:2038 +#, c-format +msgid "Tile File: %s [Not Available]" +msgstr "" + +#: ../src/vikmapslayer.c:2086 +msgid "Redownload _Bad Map(s)" +msgstr "Descargar de nuevo mapas incorrectos" + +#: ../src/vikmapslayer.c:2090 +msgid "Redownload _New Map(s)" +msgstr "Descargar de nuevo los mapas nuevos" + +#: ../src/vikmapslayer.c:2094 +msgid "Redownload _All Map(s)" +msgstr "Cargar de nuevo todos los mapas" + +#: ../src/vikmapslayer.c:2099 +msgid "_Show Tile Information" +msgstr "" + +#: ../src/vikmapslayer.c:2166 +#, c-format +msgid "" +"Wrong drawmode for this map.\n" +"Select \"%s\" from View menu and try again." +msgstr "" +"El modo de dibujado es incorrecto para este mapa.\n" +"Seleccione \"%s\" en el menú Ver e inténtelo de nuevo." + +#: ../src/vikmapslayer.c:2171 +msgid "Wrong zoom level for this map." +msgstr "Nivel de zoom incorrecto para este mapa." + +#: ../src/vikmapslayer.c:2334 +msgid "Zoom Start:" +msgstr "" + +#: ../src/vikmapslayer.c:2341 +msgid "Zoom End:" +msgstr "" + +#: ../src/vikmapslayer.c:2347 +msgid "Download Maps Method:" +msgstr "" + +#. redownload method - needs to align with REDOWNLOAD* macro values +#: ../src/vikmapslayer.c:2419 +msgid "Missing" +msgstr "" + +#: ../src/vikmapslayer.c:2419 +msgid "Bad" +msgstr "" + +#: ../src/vikmapslayer.c:2419 +msgid "New" +msgstr "" + +#: ../src/vikmapslayer.c:2419 +msgid "Reload All" +msgstr "" + +#: ../src/vikmapslayer.c:2421 +msgid "Download for Zoom Levels" +msgstr "" + +#: ../src/vikmapslayer.c:2461 +#, c-format +msgid "" +"You are not allowed to download more than %d tiles in one go (requested %d)" +msgstr "" + +#: ../src/vikmapslayer.c:2469 +#, c-format +msgid "Do you really want to download %d tiles?" +msgstr "" + +#. Now with icons +#: ../src/vikmapslayer.c:2509 +msgid "Download _Missing Onscreen Maps" +msgstr "Descargar mapas incorrectos en pantalla" + +#: ../src/vikmapslayer.c:2516 +msgid "Download _New Onscreen Maps" +msgstr "Descargar mapas nuevos en pantalla" + +#: ../src/vikmapslayer.c:2523 +msgid "Reload _All Onscreen Maps" +msgstr "Recargar todos los mapas en pantalla" + +#: ../src/vikmapslayer.c:2529 +msgid "Download Maps in _Zoom Levels..." +msgstr "" + +#: ../src/vikmapslayer.c:2539 +#, fuzzy +msgid "_Open MBTiles Files" +msgstr "Abrir fichero reciente" + +#: ../src/vikmapslayer.c:2554 +msgid "Flush Map Cache" +msgstr "" + +#: ../src/vikrouting.c:54 +msgid "Default engine:" +msgstr "" + +#: ../src/vikrouting.c:68 +msgid "Routing" +msgstr "" + +#: ../src/viktreeview.c:347 +msgid "Layer Name" +msgstr "Nombre de capa" + +#: ../src/viktreeview.c:924 +#, c-format +msgid "delete data from %s\n" +msgstr "borrar datos de %s\n" + +#: ../src/viktrwlayer.c:427 +msgid "Create _Waypoint" +msgstr "" + +#: ../src/viktrwlayer.c:427 +msgid "Create Waypoint" +msgstr "Crear waypoint" + +#: ../src/viktrwlayer.c:437 +#, fuzzy +msgid "Edit _Track" +msgstr "Editar punto de ruta" + +#: ../src/viktrwlayer.c:437 +#, fuzzy +msgid "Edit Track" +msgstr "Editar punto de ruta" + +#: ../src/viktrwlayer.c:449 +msgid "Edit _Route" +msgstr "" + +#: ../src/viktrwlayer.c:449 +#, fuzzy +msgid "Edit Route" +msgstr "Editar waypoint" + +#: ../src/viktrwlayer.c:460 +msgid "Route _Finder" +msgstr "" + +#: ../src/viktrwlayer.c:460 +msgid "Route Finder" +msgstr "" + +#: ../src/viktrwlayer.c:471 +#, fuzzy +msgid "Splitter" +msgstr "Dividir aquí" + +#: ../src/viktrwlayer.c:482 +msgid "_Edit Waypoint" +msgstr "" + +#: ../src/viktrwlayer.c:482 +msgid "Edit Waypoint" +msgstr "Editar waypoint" + +#: ../src/viktrwlayer.c:495 +msgid "Edit Trac_kpoint" +msgstr "" + +#: ../src/viktrwlayer.c:495 +msgid "Edit Trackpoint" +msgstr "Editar punto de ruta" + +#. a pixbuf for this one is already made globally available +#: ../src/viktrwlayer.c:508 +msgid "Show P_icture" +msgstr "" + +#: ../src/viktrwlayer.c:508 +msgid "Show Picture" +msgstr "Mostrar imagen" + +#: ../src/viktrwlayer.c:531 +msgid "Waypoint Images" +msgstr "Imágenes de waypoints" + +#: ../src/viktrwlayer.c:531 +msgid "Tracks Advanced" +msgstr "" + +#: ../src/viktrwlayer.c:531 +msgid "Metadata" +msgstr "" + +#: ../src/viktrwlayer.c:531 +msgid "Filesystem" +msgstr "" + +#: ../src/viktrwlayer.c:534 +msgid "Draw by Track" +msgstr "Dbujar por ruta" + +#: ../src/viktrwlayer.c:534 +msgid "Draw by Speed" +msgstr "" + +#: ../src/viktrwlayer.c:534 +msgid "All Tracks Same Color" +msgstr "" + +#: ../src/viktrwlayer.c:535 +msgid "Filled Square" +msgstr "Cuadro relleno" + +#: ../src/viktrwlayer.c:535 +msgid "Square" +msgstr "Cuadrado" + +#: ../src/viktrwlayer.c:535 +msgid "Circle" +msgstr "Círculo" + +#: ../src/viktrwlayer.c:535 +msgid "X" +msgstr "X" + +#: ../src/viktrwlayer.c:561 +msgid "Extra Extra Small" +msgstr "" + +#: ../src/viktrwlayer.c:562 +msgid "Extra Small" +msgstr "" + +#: ../src/viktrwlayer.c:566 +msgid "Extra Large" +msgstr "" + +#: ../src/viktrwlayer.c:567 +msgid "Extra Extra Large" +msgstr "" + +#: ../src/viktrwlayer.c:573 +msgid "Name Ascending" +msgstr "" + +#: ../src/viktrwlayer.c:574 +msgid "Name Descending" +msgstr "" + +#: ../src/viktrwlayer.c:582 ../src/viktrwlayer_propwin.c:3319 +msgid "No" +msgstr "" + +#: ../src/viktrwlayer.c:583 +msgid "Yes" +msgstr "" + +#: ../src/viktrwlayer.c:584 +msgid "No write" +msgstr "" + +#: ../src/viktrwlayer.c:649 ../src/viktrwlayer.c:673 +msgid "Draw Labels" +msgstr "Dibujar etiquetas" + +#: ../src/viktrwlayer.c:650 +msgid "Note: the individual track controls what labels may be displayed" +msgstr "" + +#: ../src/viktrwlayer.c:651 +msgid "Track Labels Font Size:" +msgstr "" + +#: ../src/viktrwlayer.c:652 +msgid "Track Drawing Mode:" +msgstr "Modo de dibujo de rutas:" + +#: ../src/viktrwlayer.c:653 +msgid "All Tracks Color:" +msgstr "" + +#: ../src/viktrwlayer.c:654 +msgid "The color used when 'All Tracks Same Color' drawing mode is selected" +msgstr "" + +#: ../src/viktrwlayer.c:655 +msgid "Draw Track Lines" +msgstr "Dibujar líneas de ruta" + +#: ../src/viktrwlayer.c:656 +msgid "Track Thickness:" +msgstr "Ancho de ruta:" + +#: ../src/viktrwlayer.c:657 +msgid "Draw Track Direction" +msgstr "" + +#: ../src/viktrwlayer.c:658 +msgid "Direction Size:" +msgstr "" + +#: ../src/viktrwlayer.c:659 +msgid "Draw Trackpoints" +msgstr "Dibujar puntos de rutas" + +#: ../src/viktrwlayer.c:660 +msgid "Trackpoint Size:" +msgstr "" + +#: ../src/viktrwlayer.c:661 +msgid "Draw Elevation" +msgstr "Dibujar elevación" + +#: ../src/viktrwlayer.c:662 +msgid "Draw Elevation Height %:" +msgstr "Dibujar elevación %d:" + +#: ../src/viktrwlayer.c:663 +msgid "Draw Stops" +msgstr "Dibujar paradas" + +#: ../src/viktrwlayer.c:664 +msgid "" +"Whether to draw a marker when trackpoints are at the same position but over " +"the minimum stop length apart in time" +msgstr "" + +#: ../src/viktrwlayer.c:665 +msgid "Min Stop Length (seconds):" +msgstr "Duración min. de parada (segundos):" + +#: ../src/viktrwlayer.c:667 +msgid "Track BG Thickness:" +msgstr "Ancho de fondo de ruta:" + +#: ../src/viktrwlayer.c:668 +msgid "Track Background Color" +msgstr "Color de fondo de ruta" + +#: ../src/viktrwlayer.c:669 +msgid "Draw by Speed Factor (%):" +msgstr "" + +#: ../src/viktrwlayer.c:670 +msgid "" +"The percentage factor away from the average speed determining the color used" +msgstr "" + +#: ../src/viktrwlayer.c:671 +msgid "Track Sort Order:" +msgstr "" + +#: ../src/viktrwlayer.c:674 +msgid "Waypoint Font Size:" +msgstr "" + +#: ../src/viktrwlayer.c:675 +msgid "Waypoint Color:" +msgstr "Color de waypoint:" + +#: ../src/viktrwlayer.c:676 +msgid "Waypoint Text:" +msgstr "Texto de waypoint:" + +#: ../src/viktrwlayer.c:677 +msgid "Background:" +msgstr "Fondo:" + +#: ../src/viktrwlayer.c:678 +msgid "Fake BG Color Translucency:" +msgstr "Color de transparencia simulada:" + +#: ../src/viktrwlayer.c:679 +msgid "Waypoint marker:" +msgstr "Marcador de waypoint:" + +#: ../src/viktrwlayer.c:680 +msgid "Waypoint size:" +msgstr "Tamaño de waypoint:" + +#: ../src/viktrwlayer.c:681 +msgid "Draw Waypoint Symbols:" +msgstr "Dibujar símbolos de waypoint:" + +#: ../src/viktrwlayer.c:682 +msgid "Waypoint Sort Order:" +msgstr "" + +#: ../src/viktrwlayer.c:684 +msgid "Draw Waypoint Images" +msgstr "Dibujar imágenes de waypoint:" + +#: ../src/viktrwlayer.c:685 +msgid "Image Size (pixels):" +msgstr "Tamaño de imagen (pixels):" + +#: ../src/viktrwlayer.c:686 +msgid "Image Alpha:" +msgstr "Factor alfa de imagen:" + +#: ../src/viktrwlayer.c:687 +msgid "Image Memory Cache Size:" +msgstr "Tamaño de la caché de imágenes:" + +#: ../src/viktrwlayer.c:690 +msgid "Author" +msgstr "" + +#: ../src/viktrwlayer.c:691 +msgid "Creation Time" +msgstr "" + +#: ../src/viktrwlayer.c:692 +msgid "Keywords" +msgstr "" + +#: ../src/viktrwlayer.c:693 +msgid "External layer:" +msgstr "" + +#: ../src/viktrwlayer.c:693 +msgid "" +"Layer data stored in the Viking file, in an external file, or in an external " +"file but changes are not written to the file (file only loaded at startup)" +msgstr "" + +#: ../src/viktrwlayer.c:694 +msgid "Save layer as:" +msgstr "" + +#: ../src/viktrwlayer.c:694 +msgid "Specify where layer should be saved. Overwrites file if it exists." +msgstr "" + +#: ../src/viktrwlayer.c:798 +msgid "TrackWaypoint" +msgstr "" + +#: ../src/viktrwlayer.c:1999 ../src/viktrwlayer_propwin.c:1469 +#: ../src/viktrwlayer_propwin.c:1471 ../src/vikutils.c:299 +#: ../src/vikutils.c:326 +msgid "miles" +msgstr "" + +#: ../src/viktrwlayer.c:2002 ../src/viktrwlayer_propwin.c:1475 +#: ../src/viktrwlayer_propwin.c:1477 ../src/vikutils.c:303 +#: ../src/vikutils.c:330 +msgid "NM" +msgstr "" + +#. VIK_UNITS_DISTANCE_KILOMETRES: +#: ../src/viktrwlayer.c:2006 ../src/viktrwlayer_propwin.c:1482 +#: ../src/viktrwlayer_propwin.c:1484 ../src/vikutils.c:308 +#: ../src/vikutils.c:335 +msgid "km" +msgstr "" + +#: ../src/viktrwlayer.c:2121 +msgid "start/end" +msgstr "" + +#: ../src/viktrwlayer.c:2133 +msgid "start" +msgstr "" + +#: ../src/viktrwlayer.c:2142 +msgid "end" +msgstr "" + +#: ../src/viktrwlayer.c:3103 +#, c-format +msgid " in %d:%02d hrs:mins" +msgstr " en %d:%02d hrs:mins" + +#: ../src/viktrwlayer.c:3107 +#, c-format +msgid "" +"\n" +"%sTotal Length %.1f %s%s" +msgstr "" +"\n" +"%s Longitud Total %.1f %s%s" + +#: ../src/viktrwlayer.c:3131 +#, c-format +msgid "" +"\n" +"Total route length %.1f %s" +msgstr "" + +#: ../src/viktrwlayer.c:3136 +#, c-format +msgid "Tracks: %d - Waypoints: %d - Routes: %d%s%s" +msgstr "" + +#: ../src/viktrwlayer.c:3155 +#, c-format +msgid "Tracks: %d" +msgstr "" + +#: ../src/viktrwlayer.c:3165 +#, c-format +msgid "Routes: %d" +msgstr "" + +#: ../src/viktrwlayer.c:3195 +#, c-format +msgid "- %d:%02d hrs:mins" +msgstr "- %d:%02d hrs:mins" + +#: ../src/viktrwlayer.c:3202 +#, c-format +msgid "%s%.1f km %s" +msgstr "%s%.1f km %s" + +#: ../src/viktrwlayer.c:3205 +#, c-format +msgid "%s%.1f miles %s" +msgstr "%s%.1f millas %s" + +#: ../src/viktrwlayer.c:3208 +#, c-format +msgid "%s%.1f NM %s" +msgstr "" + +#: ../src/viktrwlayer.c:3222 +#, c-format +msgid "Waypoints: %d" +msgstr "" + +#: ../src/viktrwlayer.c:3279 +#, c-format +msgid "Wpt: Alt %dft" +msgstr "" + +#. VIK_UNITS_HEIGHT_METRES: +#: ../src/viktrwlayer.c:3283 +#, c-format +msgid "Wpt: Alt %dm" +msgstr "" + +#. Add comment if available +#: ../src/viktrwlayer.c:3298 +#, c-format +msgid "%s | %s %s | Comment: %s" +msgstr "" + +#: ../src/viktrwlayer.c:3300 +#, c-format +msgid "%s | %s %s" +msgstr "" + +#: ../src/viktrwlayer.c:3562 ../src/viktrwlayer.c:3591 +msgid "This layer has no waypoints or trackpoints." +msgstr "Esta capa no tiene waypoints ni puntos de ruta." + +#: ../src/viktrwlayer.c:3598 ../src/viktrwlayer.c:3607 +#: ../src/viktrwlayer.c:3616 ../src/viktrwlayer.c:3625 +#: ../src/viktrwlayer.c:3634 ../src/viktrwlayer.c:3642 +msgid "Export Layer" +msgstr "Exportar capa" + +#: ../src/viktrwlayer.c:3671 +msgid "Export Route as GPX" +msgstr "" + +#: ../src/viktrwlayer.c:3673 +msgid "Export Track as GPX" +msgstr "Exportar traza como GPX" + +#: ../src/viktrwlayer.c:3693 +msgid "Find" +msgstr "Buscar" + +#: ../src/viktrwlayer.c:3703 +msgid "Waypoint Name:" +msgstr "Nombre del waypoint:" + +#: ../src/viktrwlayer.c:3720 +msgid "Waypoint not found in this layer." +msgstr "Waypoint no encontrado en esta capa." + +#: ../src/viktrwlayer.c:3989 +msgid "Can not upload invisible track." +msgstr "" + +#: ../src/viktrwlayer.c:4082 ../src/viktrwlayer.c:10512 +msgid "Track" +msgstr "Traza" + +#: ../src/viktrwlayer.c:4107 ../src/viktrwlayer.c:10599 +msgid "Route" +msgstr "" + +#: ../src/viktrwlayer.c:4194 +msgid "Externa_l" +msgstr "" + +#: ../src/viktrwlayer.c:4216 ../src/viktrwlayer.c:8456 +#: ../src/viktrwlayer.c:8574 +msgid "_Finish Route" +msgstr "" + +#: ../src/viktrwlayer.c:4218 ../src/viktrwlayer.c:8380 +#: ../src/viktrwlayer.c:8572 +msgid "_Finish Track" +msgstr "" + +#. Now with icons +#: ../src/viktrwlayer.c:4230 +msgid "_View Layer" +msgstr "Ver capa" + +#: ../src/viktrwlayer.c:4237 +msgid "V_iew" +msgstr "" + +#: ../src/viktrwlayer.c:4243 +msgid "View All _Tracks" +msgstr "" + +#: ../src/viktrwlayer.c:4248 +msgid "View All _Routes" +msgstr "" + +#: ../src/viktrwlayer.c:4253 +msgid "View All _Waypoints" +msgstr "" + +#: ../src/viktrwlayer.c:4258 +msgid "_Goto Center of Layer" +msgstr "Ir al centro de la capa" + +#: ../src/viktrwlayer.c:4264 ../src/viktrwlayer.c:8321 +msgid "Goto _Waypoint..." +msgstr "" + +#: ../src/viktrwlayer.c:4270 +msgid "_Export Layer" +msgstr "Exportar capa" + +#: ../src/viktrwlayer.c:4276 +msgid "Export as GPS_Point..." +msgstr "" + +#: ../src/viktrwlayer.c:4281 +msgid "Export as GPS_Mapper..." +msgstr "" + +#: ../src/viktrwlayer.c:4286 +msgid "Export as _GPX..." +msgstr "" + +#: ../src/viktrwlayer.c:4292 +msgid "Export as _KML..." +msgstr "" + +#: ../src/viktrwlayer.c:4299 +msgid "Export as GEO_JSON..." +msgstr "" + +#: ../src/viktrwlayer.c:4306 +msgid "Export via GPSbabel..." +msgstr "" + +#: ../src/viktrwlayer.c:4312 +#, c-format +msgid "Open with External Program_1: %s" +msgstr "" + +#: ../src/viktrwlayer.c:4319 +#, c-format +msgid "Open with External Program_2: %s" +msgstr "" + +#: ../src/viktrwlayer.c:4327 ../src/vikwindow.c:4825 +msgid "_New" +msgstr "_Nuevo" + +#: ../src/viktrwlayer.c:4333 +msgid "New _Waypoint..." +msgstr "" + +#: ../src/viktrwlayer.c:4339 +msgid "New _Track" +msgstr "" + +#: ../src/viktrwlayer.c:4347 +msgid "New _Route" +msgstr "" + +#: ../src/viktrwlayer.c:4356 ../src/viktrwlayer.c:8232 +#: ../src/viktrwlayer.c:9003 +msgid "Geotag _Images..." +msgstr "" + +#: ../src/viktrwlayer.c:4363 +msgid "_Acquire" +msgstr "" + +#: ../src/viktrwlayer.c:4369 ../src/vikwindow.c:4904 +msgid "From _GPS..." +msgstr "Desde _GPS..." + +#. FIXME: only add menu when at least a routing engine has support for Directions +#: ../src/viktrwlayer.c:4375 +msgid "From _Directions..." +msgstr "" + +#: ../src/viktrwlayer.c:4381 +msgid "From _OSM Traces..." +msgstr "" + +#: ../src/viktrwlayer.c:4386 +msgid "From _My OSM Traces..." +msgstr "" + +#: ../src/viktrwlayer.c:4392 ../src/vikwindow.c:4844 +msgid "From _URL..." +msgstr "" + +#: ../src/viktrwlayer.c:4399 ../src/vikwindow.c:4846 +msgid "From _Wikipedia Waypoints" +msgstr "" + +#: ../src/viktrwlayer.c:4405 +msgid "Within _Layer Bounds" +msgstr "Dentro de los límites de la capa" + +#: ../src/viktrwlayer.c:4411 +msgid "Within _Current View" +msgstr "Dentro de la vista actual" + +#: ../src/viktrwlayer.c:4419 +msgid "From Geo_caching..." +msgstr "" + +#: ../src/viktrwlayer.c:4426 ../src/vikwindow.c:4842 +msgid "From Geotagged _Images..." +msgstr "" + +#: ../src/viktrwlayer.c:4433 +msgid "From _File..." +msgstr "" + +#: ../src/viktrwlayer.c:4436 ../src/vikwindow.c:4905 +msgid "Import File With GPS_Babel..." +msgstr "" + +#: ../src/viktrwlayer.c:4443 ../src/viktrwlayer.c:8905 +msgid "_Upload" +msgstr "" + +#: ../src/viktrwlayer.c:4449 +msgid "Upload to _GPS..." +msgstr "" + +#: ../src/viktrwlayer.c:4456 ../src/viktrwlayer.c:8973 +msgid "Upload to _OSM..." +msgstr "" + +#: ../src/viktrwlayer.c:4464 +msgid "De_lete" +msgstr "" + +#: ../src/viktrwlayer.c:4470 +msgid "Delete All _Tracks" +msgstr "" + +#: ../src/viktrwlayer.c:4477 +msgid "Delete Tracks _From Selection..." +msgstr "" + +#: ../src/viktrwlayer.c:4484 ../src/viktrwlayer.c:8481 +msgid "Delete _All Routes" +msgstr "" + +#: ../src/viktrwlayer.c:4491 ../src/viktrwlayer.c:8487 +msgid "_Delete Routes From Selection..." +msgstr "" + +#: ../src/viktrwlayer.c:4498 +msgid "Delete All _Waypoints" +msgstr "" + +#: ../src/viktrwlayer.c:4505 +msgid "Delete Waypoints From _Selection..." +msgstr "" + +#: ../src/viktrwlayer.c:4512 ../src/viktrwlayer.c:8339 +#, fuzzy +msgid "Delete Duplicate Waypoints" +msgstr "Eliminar waypoints duplicados" + +#: ../src/viktrwlayer.c:5198 +#, c-format +msgid "Are you sure you want to delete all tracks in %s?" +msgstr "" + +#: ../src/viktrwlayer.c:5211 +#, c-format +msgid "Are you sure you want to delete all routes in %s?" +msgstr "" + +#: ../src/viktrwlayer.c:5221 +#, c-format +msgid "Are you sure you want to delete all waypoints in %s?" +msgstr "" + +#: ../src/viktrwlayer.c:5238 +#, c-format +msgid "Are you sure you want to delete the waypoint \"%s\"?" +msgstr "" + +#: ../src/viktrwlayer.c:5254 +#, c-format +msgid "Are you sure you want to delete the track \"%s\"?" +msgstr "" + +#: ../src/viktrwlayer.c:5271 +#, c-format +msgid "Are you sure you want to delete the route \"%s\"?" +msgstr "" + +#: ../src/viktrwlayer.c:5527 ../src/viktrwlayer.c:6373 +msgid "" +"Converting a track to a route removes extra track data such as segments, " +"timestamps, etc...\n" +"Do you want to continue?" +msgstr "" + +#: ../src/viktrwlayer.c:5631 +msgid "No DEM layers available, thus no DEM values can be applied." +msgstr "" + +#: ../src/viktrwlayer.c:5651 ../src/viktrwlayer.c:5692 +#, c-format +msgid "%ld point adjusted" +msgid_plural "%ld points adjusted" +msgstr[0] "" +msgstr[1] "" + +#: ../src/viktrwlayer.c:5736 +#, c-format +msgid "%ld waypoint changed" +msgid_plural "%ld waypoints changed" +msgstr[0] "" +msgstr[1] "" + +#: ../src/viktrwlayer.c:5917 +#, c-format +msgid "" +"Refining a track with many points (%d) is unlikely to yield sensible " +"results. Do you want to Continue?" +msgstr "" + +#. Select engine from dialog +#: ../src/viktrwlayer.c:5925 +msgid "Refine Route with Routing Engine..." +msgstr "" + +#: ../src/viktrwlayer.c:5933 +msgid "Select routing engine" +msgstr "" + +#: ../src/viktrwlayer.c:6158 +msgid "Failed. No other tracks with timestamps in this layer found" +msgstr "" + +#: ../src/viktrwlayer.c:6160 +msgid "Failed. No other tracks without timestamps in this layer found" +msgstr "" + +#: ../src/viktrwlayer.c:6179 +msgid "Merge with..." +msgstr "Unido con..." + +#: ../src/viktrwlayer.c:6180 +msgid "Select route to merge with" +msgstr "" + +#: ../src/viktrwlayer.c:6180 +msgid "Select track to merge with" +msgstr "Track seleccionado unido con..." + +#: ../src/viktrwlayer.c:6264 ../src/viktrwlayer.c:6346 +msgid "Append Route" +msgstr "" + +#: ../src/viktrwlayer.c:6264 ../src/viktrwlayer.c:6346 +msgid "Append Track" +msgstr "" + +#: ../src/viktrwlayer.c:6265 +msgid "Select the route to append after the current route" +msgstr "" + +#: ../src/viktrwlayer.c:6266 +msgid "Select the track to append after the current track" +msgstr "" + +#: ../src/viktrwlayer.c:6347 +msgid "Select the track to append after the current route" +msgstr "" + +#: ../src/viktrwlayer.c:6348 +msgid "Select the route to append after the current track" +msgstr "" + +#: ../src/viktrwlayer.c:6414 +#, c-format +msgid "%d segment merged" +msgid_plural "%d segments merged" +msgstr[0] "" +msgstr[1] "" + +#: ../src/viktrwlayer.c:6430 +msgid "Failed. This track does not have timestamp" +msgstr "Fallo: Este track no tiene tiempo de registro" + +#: ../src/viktrwlayer.c:6442 +msgid "Failed. No other track in this layer has timestamp" +msgstr "Fallo: no existe otro track con tiempo de registro" + +#: ../src/viktrwlayer.c:6449 +msgid "Merge Threshold..." +msgstr "Umbral de fusionado..." + +#: ../src/viktrwlayer.c:6450 +msgid "Merge when time between tracks less than:" +msgstr "Fusionar cuando el tiempo entre trazas de menos de:" + +#: ../src/viktrwlayer.c:6580 +msgid "Split Threshold..." +msgstr "Umbral de división..." + +#: ../src/viktrwlayer.c:6581 +msgid "Split when time between trackpoints exceeds:" +msgstr "Dividir cuando el intervalo entre puntos exceda:" + +#: ../src/viktrwlayer.c:6598 +#, c-format +msgid "" +"Can not split track due to trackpoints not ordered in time - such as at %s.\n" +"\n" +"Goto this trackpoint?" +msgstr "" + +#: ../src/viktrwlayer.c:6668 +msgid "Split Every Nth Point" +msgstr "Separar cada punto N-ésimo:" + +#: ../src/viktrwlayer.c:6669 +msgid "Split on every Nth point:" +msgstr "Separar en cada punto N-ésimo:" + +#: ../src/viktrwlayer.c:6779 +msgid "Can not split track as it has no segments" +msgstr "" + +#: ../src/viktrwlayer.c:6861 ../src/viktrwlayer.c:6891 +#, c-format +msgid "Deleted %ld point" +msgid_plural "Deleted %ld points" +msgstr[0] "" +msgstr[1] "" + +#: ../src/viktrwlayer.c:6966 ../src/viktrwlayer.c:10989 +#: ../src/viktrwlayer_waypointlist.c:214 +#, c-format +msgid "Could not launch %s to open file." +msgstr "" + +#: ../src/viktrwlayer.c:6992 ../src/viktrwlayer.c:7113 +msgid "This track has no date information." +msgstr "" + +#: ../src/viktrwlayer.c:7006 ../src/viktrwlayer.c:7136 +msgid "This waypoint has no date information." +msgstr "" + +#: ../src/viktrwlayer.c:7030 +#, c-format +msgid "Could not launch %s" +msgstr "" + +#: ../src/viktrwlayer.c:7269 +msgid "Internal Error in vik_trw_layer_uniquify_tracks" +msgstr "" + +#: ../src/viktrwlayer.c:7374 ../src/viktrwlayer.c:7424 +#: ../src/viktrwlayer.c:7587 +msgid "" +"Multiple entries with the same name exist. This method only works with " +"unique names. Force unique names now?" +msgstr "" + +#: ../src/viktrwlayer.c:7385 +msgid "No tracks found" +msgstr "" + +#: ../src/viktrwlayer.c:7393 ../src/viktrwlayer.c:7443 +#: ../src/viktrwlayer.c:7607 +msgid "Delete Selection" +msgstr "" + +#: ../src/viktrwlayer.c:7394 +msgid "Select tracks to delete" +msgstr "Seleccione pistas a eliminar" + +#: ../src/viktrwlayer.c:7435 +msgid "No routes found" +msgstr "" + +#: ../src/viktrwlayer.c:7444 +msgid "Select routes to delete" +msgstr "" + +#: ../src/viktrwlayer.c:7550 +msgid "Internal Error in vik_trw_layer_uniquify_waypoints" +msgstr "" + +#: ../src/viktrwlayer.c:7597 +msgid "No waypoints found" +msgstr "" + +#: ../src/viktrwlayer.c:7608 +msgid "Select waypoints to delete" +msgstr "" + +#: ../src/viktrwlayer.c:7691 +#, c-format +msgid "%ld waypoint deleted" +msgid_plural "%ld waypoints deleted" +msgstr[0] "" +msgstr[1] "" + +#: ../src/viktrwlayer.c:7697 +#, fuzzy +msgid "No duplicates found" +msgstr "¡No se encontraron resultados!" + +#: ../src/viktrwlayer.c:8028 +#, c-format +msgid "" +"A waypoint with the name \"%s\" already exists. Really rename to the same " +"name?" +msgstr "" + +#: ../src/viktrwlayer.c:8058 +#, c-format +msgid "" +"A track with the name \"%s\" already exists. Really rename to the same name?" +msgstr "" + +#: ../src/viktrwlayer.c:8095 +#, c-format +msgid "" +"A route with the name \"%s\" already exists. Really rename to the same name?" +msgstr "" + +#: ../src/viktrwlayer.c:8215 ../src/viktrwlayer.c:8602 +msgid "_Goto" +msgstr "_Ir a" + +#: ../src/viktrwlayer.c:8226 +msgid "_Visit Geocache Webpage" +msgstr "Visitar página de Geocache" + +#: ../src/viktrwlayer.c:8235 +msgid "Geotag multiple images against this waypoint" +msgstr "" + +#: ../src/viktrwlayer.c:8245 ../src/viktrwlayer_waypointlist.c:352 +msgid "_Show Picture..." +msgstr "" + +#: ../src/viktrwlayer.c:8253 +msgid "Update Geotag on _Image" +msgstr "" + +#: ../src/viktrwlayer.c:8259 +msgid "_Update" +msgstr "" + +#: ../src/viktrwlayer.c:8264 +msgid "Update and _Keep File Timestamp" +msgstr "" + +#: ../src/viktrwlayer.c:8276 +msgid "Visit _Webpage" +msgstr "" + +#: ../src/viktrwlayer.c:8306 +msgid "_New Waypoint..." +msgstr "" + +#: ../src/viktrwlayer.c:8315 +msgid "_View All Waypoints" +msgstr "" + +#: ../src/viktrwlayer.c:8327 +msgid "Delete _All Waypoints" +msgstr "" + +#: ../src/viktrwlayer.c:8333 +msgid "_Delete Waypoints From Selection..." +msgstr "" + +#: ../src/viktrwlayer.c:8351 +msgid "_Show All Waypoints" +msgstr "" + +#: ../src/viktrwlayer.c:8357 +msgid "_Hide All Waypoints" +msgstr "" + +#: ../src/viktrwlayer.c:8369 +msgid "_List Waypoints..." +msgstr "" + +#: ../src/viktrwlayer.c:8390 +msgid "_View All Tracks" +msgstr "" + +#: ../src/viktrwlayer.c:8396 +msgid "_New Track" +msgstr "" + +#: ../src/viktrwlayer.c:8404 +msgid "Delete _All Tracks" +msgstr "" + +#: ../src/viktrwlayer.c:8410 +msgid "_Delete Tracks From Selection..." +msgstr "" + +#: ../src/viktrwlayer.c:8422 +msgid "_Show All Tracks" +msgstr "" + +#: ../src/viktrwlayer.c:8428 +msgid "_Hide All Tracks" +msgstr "" + +#: ../src/viktrwlayer.c:8439 +msgid "_List Tracks..." +msgstr "" + +#: ../src/viktrwlayer.c:8467 +msgid "_View All Routes" +msgstr "" + +#: ../src/viktrwlayer.c:8473 +msgid "_New Route" +msgstr "" + +#: ../src/viktrwlayer.c:8499 +msgid "_Show All Routes" +msgstr "" + +#: ../src/viktrwlayer.c:8505 +msgid "_Hide All Routes" +msgstr "" + +#: ../src/viktrwlayer.c:8516 +msgid "_List Routes..." +msgstr "" + +#: ../src/viktrwlayer.c:8587 +msgid "_View Track" +msgstr "Ver traza" + +#: ../src/viktrwlayer.c:8589 +msgid "_View Route" +msgstr "" + +#: ../src/viktrwlayer.c:8608 +msgid "_Startpoint" +msgstr "Punto de inicio" + +#: ../src/viktrwlayer.c:8614 +msgid "\"_Center\"" +msgstr "Centrar" + +#: ../src/viktrwlayer.c:8620 +msgid "_Endpoint" +msgstr "Fin" + +#: ../src/viktrwlayer.c:8626 +msgid "_Highest Altitude" +msgstr "Altitud superior" + +#: ../src/viktrwlayer.c:8632 +msgid "_Lowest Altitude" +msgstr "Altitud inferior" + +#: ../src/viktrwlayer.c:8640 +msgid "_Maximum Speed" +msgstr "Velocidad máxima" + +#: ../src/viktrwlayer.c:8646 +msgid "_Date" +msgstr "" + +#: ../src/viktrwlayer.c:8655 +msgid "Co_mbine" +msgstr "" + +#: ../src/viktrwlayer.c:8663 +msgid "_Merge By Time..." +msgstr "" + +#: ../src/viktrwlayer.c:8668 +msgid "Merge _Segments" +msgstr "" + +#: ../src/viktrwlayer.c:8675 +msgid "Merge _With Other Tracks..." +msgstr "Mezclar con otras trazas" + +#: ../src/viktrwlayer.c:8682 +msgid "_Append Track..." +msgstr "" + +#: ../src/viktrwlayer.c:8684 +msgid "_Append Route..." +msgstr "" + +#: ../src/viktrwlayer.c:8690 +msgid "Append _Route..." +msgstr "" + +#: ../src/viktrwlayer.c:8692 +msgid "Append _Track..." +msgstr "" + +#: ../src/viktrwlayer.c:8699 +msgid "_Split" +msgstr "" + +#: ../src/viktrwlayer.c:8707 +msgid "_Split By Time..." +msgstr "" + +#. ATM always enable this entry - don't want to have to analyse the track before displaying the menu - to keep the menu speedy +#: ../src/viktrwlayer.c:8713 +msgid "Split Se_gments" +msgstr "" + +#: ../src/viktrwlayer.c:8719 +msgid "Split By _Number of Points..." +msgstr "" + +#: ../src/viktrwlayer.c:8724 +msgid "Split at _Trackpoint" +msgstr "" + +#: ../src/viktrwlayer.c:8732 +msgid "_Insert Points" +msgstr "" + +#: ../src/viktrwlayer.c:8738 +msgid "Insert Point _Before Selected Point" +msgstr "" + +#: ../src/viktrwlayer.c:8745 +msgid "Insert Point _After Selected Point" +msgstr "" + +#: ../src/viktrwlayer.c:8754 +msgid "Delete Poi_nts" +msgstr "" + +#: ../src/viktrwlayer.c:8760 +msgid "Delete _Selected Point" +msgstr "" + +#: ../src/viktrwlayer.c:8768 +msgid "Delete Points With The Same _Position" +msgstr "" + +#: ../src/viktrwlayer.c:8773 +msgid "Delete Points With The Same _Time" +msgstr "" + +#: ../src/viktrwlayer.c:8780 ../src/viktrwlayer.c:9029 +msgid "_Transform" +msgstr "" + +#: ../src/viktrwlayer.c:8788 ../src/viktrwlayer.c:9037 +msgid "_Apply DEM Data" +msgstr "Aplicar datos DEM" + +#: ../src/viktrwlayer.c:8793 ../src/viktrwlayer.c:9042 +msgid "_Overwrite" +msgstr "" + +#: ../src/viktrwlayer.c:8796 ../src/viktrwlayer.c:9045 +msgid "Overwrite any existing elevation values with DEM values" +msgstr "" + +#: ../src/viktrwlayer.c:8799 ../src/viktrwlayer.c:9048 +msgid "_Keep Existing" +msgstr "" + +#: ../src/viktrwlayer.c:8802 ../src/viktrwlayer.c:9051 +msgid "Keep existing elevation values, only attempt for missing values" +msgstr "" + +#: ../src/viktrwlayer.c:8807 +msgid "_Smooth Missing Elevation Data" +msgstr "" + +#: ../src/viktrwlayer.c:8812 +msgid "_Interpolated" +msgstr "" + +#: ../src/viktrwlayer.c:8815 +msgid "" +"Interpolate between known elevation values to derive values for the missing " +"elevations" +msgstr "" + +#: ../src/viktrwlayer.c:8818 +msgid "_Flat" +msgstr "" + +#: ../src/viktrwlayer.c:8821 +msgid "Set unknown elevation values to the last known value" +msgstr "" + +#: ../src/viktrwlayer.c:8825 +msgid "C_onvert to a Route" +msgstr "" + +#: ../src/viktrwlayer.c:8827 +msgid "C_onvert to a Track" +msgstr "" + +#: ../src/viktrwlayer.c:8835 +msgid "_Anonymize Times" +msgstr "" + +#: ../src/viktrwlayer.c:8838 +msgid "Shift timestamps to a relative offset from 1901-01-01" +msgstr "" + +#: ../src/viktrwlayer.c:8841 +msgid "_Interpolate Times" +msgstr "" + +#: ../src/viktrwlayer.c:8844 +msgid "" +"Reset trackpoint timestamps between the first and last points such that " +"track is traveled at equal speed" +msgstr "" + +#: ../src/viktrwlayer.c:8849 +msgid "_Reverse Track" +msgstr "" + +#: ../src/viktrwlayer.c:8851 +msgid "_Reverse Route" +msgstr "" + +#: ../src/viktrwlayer.c:8858 +msgid "Refine Route..." +msgstr "" + +#: ../src/viktrwlayer.c:8868 +msgid "Down_load Maps Along Track..." +msgstr "Descargar mapas a lo largo de la traza" + +#: ../src/viktrwlayer.c:8870 +msgid "Down_load Maps Along Route..." +msgstr "" + +#: ../src/viktrwlayer.c:8878 +msgid "_Export Track as GPX..." +msgstr "" + +#: ../src/viktrwlayer.c:8880 +msgid "_Export Route as GPX..." +msgstr "" + +#: ../src/viktrwlayer.c:8887 +msgid "E_xtend Track End" +msgstr "Extender al final de la traza" + +#: ../src/viktrwlayer.c:8889 +msgid "E_xtend Route End" +msgstr "" + +#: ../src/viktrwlayer.c:8896 +msgid "Extend _Using Route Finder" +msgstr "" + +#: ../src/viktrwlayer.c:8911 +msgid "_Upload to GPS..." +msgstr "" + +#: ../src/viktrwlayer.c:8926 +msgid "_Diary" +msgstr "" + +#: ../src/viktrwlayer.c:8930 +msgid "Open diary program at this date" +msgstr "" + +#: ../src/viktrwlayer.c:8935 +msgid "_Astronomy" +msgstr "" + +#: ../src/viktrwlayer.c:8938 +msgid "Open astronomy program at this date and location" +msgstr "" + +#: ../src/viktrwlayer.c:8962 +msgid "_View Google Directions" +msgstr "Ver Direcciones de Google" + +#: ../src/viktrwlayer.c:8984 +msgid "Use with _Filter" +msgstr "Usar con filtro" + +#: ../src/viktrwlayer.c:9018 +msgid "_Edit Trackpoint" +msgstr "" + +#: ../src/viktrwlayer.c:10116 +#, c-format +msgid " - Gain %dm:Loss %dm" +msgstr "" + +#: ../src/viktrwlayer.c:10118 +#, c-format +msgid " - Gain %dft:Loss %dft" +msgstr "" + +#: ../src/viktrwlayer.c:10123 +#, c-format +msgid " - Bearing %3.1f° - Step %s" +msgstr "" + +#: ../src/viktrwlayer.c:10232 +#, c-format +msgid "Querying %s for route between (%.3f, %.3f) and (%.3f, %.3f)." +msgstr "" + +#: ../src/viktrwlayer.c:10248 +#, c-format +msgid "%s returned route between (%.3f, %.3f) and (%.3f, %.3f)." +msgstr "" + +#: ../src/viktrwlayer.c:10251 +#, c-format +msgid "Error getting route from %s." +msgstr "" + +#: ../src/viktrwlayer.c:11070 +#, c-format +msgid "Creating %d Image Thumbnails..." +msgstr "Creando %d miniaturas..." + +#: ../src/viktrwlayer.c:11560 +msgid "No map layer in use. Create one first" +msgstr "No hay una capa de mapa en uso. Cree una primero" + +#: ../src/viktrwlayer.c:11679 +#, c-format +msgid "%s: Track List" +msgstr "" + +#: ../src/viktrwlayer.c:11681 +#, c-format +msgid "%s: Route List" +msgstr "" + +#: ../src/viktrwlayer.c:11734 +#, c-format +msgid "" +"Could not write external layer %s to %s, please fix and save before exiting " +"or data will be lost" +msgstr "" + +#: ../src/viktrwlayer.c:11782 +#, c-format +msgid "WARNING: issues encountered loading external layer %s from %s" +msgstr "" + +#: ../src/viktrwlayer_export.c:47 +msgid "Auto Device GPX Simplify:" +msgstr "" + +#: ../src/viktrwlayer_export.c:48 +msgid "" +"GPX saves to certain devices will be simplified for device compatibility." +msgstr "" + +#: ../src/viktrwlayer_export.c:125 +#, c-format +msgid "Export of GPX file simplified using point limit: %d" +msgstr "" + +#: ../src/viktrwlayer_export.c:206 ../src/viktrwlayer_export.c:323 +#: ../src/vikwindow.c:3694 +msgid "The filename you requested could not be opened for writing." +msgstr "El fichero seleccionado no se puede abrir para escritura." + +#: ../src/viktrwlayer_export.c:226 +#, c-format +msgid "Could not launch %s." +msgstr "" + +#: ../src/viktrwlayer_export.c:234 +msgid "Could not create temporary file for export." +msgstr "" + +#: ../src/viktrwlayer_export.c:268 +msgid "File format:" +msgstr "" + +#: ../src/viktrwlayer_export.c:276 +msgid "Select the file format." +msgstr "" + +#: ../src/viktrwlayer_export.c:281 +msgid "" +"Select the information to process.\n" +"Warning: the behavior of these switches is highly dependent of the file " +"format selected.\n" +"Please, refer to GPSbabel if unsure." +msgstr "" + +#: ../src/viktrwlayer_export.c:308 +msgid "You did not select a valid file format." +msgstr "" + +#: ../src/viktrwlayer_propwin.c:915 ../src/viktrwlayer_propwin.c:3381 +#: ../src/viktrwlayer_propwin.c:3417 ../src/viktrwlayer_propwin.c:3457 +#: ../src/viktrwlayer_propwin.c:3509 ../src/viktrwlayer_propwin.c:3527 +#: ../src/viktrwlayer_propwin.c:3600 ../src/viktrwlayer_propwin.c:3601 +#: ../src/viktrwlayer_propwin.c:3602 ../src/viktrwlayer_propwin.c:3611 +#: ../src/viktrwlayer_propwin.c:3612 ../src/viktrwlayer_propwin.c:3629 +#: ../src/viktrwlayer_propwin.c:3630 ../src/viktrwlayer_propwin.c:3644 +#: ../src/viktrwlayer_propwin.c:3645 ../src/viktrwlayer_propwin.c:3646 +#: ../src/viktrwlayer_propwin.c:3660 ../src/viktrwlayer_propwin.c:3661 +#: ../src/viktrwlayer_propwin.c:3662 ../src/viktrwlayer_propwin.c:3676 +#: ../src/viktrwlayer_propwin.c:3677 ../src/viktrwlayer_propwin.c:3678 +#: ../src/viktrwlayer_propwin.c:3695 ../src/viktrwlayer_propwin.c:3696 +#: ../src/viktrwlayer_analysis.c:293 +#, c-format +msgid "No Data" +msgstr "Sin datos" + +#: ../src/viktrwlayer_propwin.c:960 ../src/viktrwlayer_propwin.c:1245 +#, c-format +msgid "%.1f kph" +msgstr "" + +#: ../src/viktrwlayer_propwin.c:963 ../src/viktrwlayer_propwin.c:1248 +#: ../src/viktrwlayer_analysis.c:352 +#, c-format +msgid "%.1f mph" +msgstr "" + +#: ../src/viktrwlayer_propwin.c:966 ../src/viktrwlayer_propwin.c:1251 +#, c-format +msgid "%.1f knots" +msgstr "" + +#: ../src/viktrwlayer_propwin.c:969 ../src/viktrwlayer_propwin.c:1254 +#, fuzzy, c-format +msgid "%.1f s/km" +msgstr "%s%.1f km %s" + +#: ../src/viktrwlayer_propwin.c:972 ../src/viktrwlayer_propwin.c:1257 +#: ../src/viktrwlayer_analysis.c:389 ../src/viktrwlayer_analysis.c:392 +#, fuzzy, c-format +msgid "%.1f min/km" +msgstr "1 min" + +#: ../src/viktrwlayer_propwin.c:975 ../src/viktrwlayer_propwin.c:1260 +#, c-format +msgid "%.1f sec/mi" +msgstr "" + +#: ../src/viktrwlayer_propwin.c:978 ../src/viktrwlayer_propwin.c:1263 +#: ../src/viktrwlayer_analysis.c:409 ../src/viktrwlayer_analysis.c:412 +#, fuzzy, c-format +msgid "%.1f min/mi" +msgstr "1 min" + +#. VIK_UNITS_SPEED_METRES_PER_SECOND: +#: ../src/viktrwlayer_propwin.c:982 ../src/viktrwlayer_propwin.c:1267 +#, c-format +msgid "%.1f m/s" +msgstr "" + +#. Minutes +#: ../src/viktrwlayer_propwin.c:1411 +msgid "mins" +msgstr "" + +#. Hours +#: ../src/viktrwlayer_propwin.c:1418 +msgid "h" +msgstr "" + +#. Days +#: ../src/viktrwlayer_propwin.c:1424 +msgid "d" +msgstr "" + +#. Weeks +#: ../src/viktrwlayer_propwin.c:1429 +msgid "w" +msgstr "" + +#. 'Months' +#: ../src/viktrwlayer_propwin.c:1433 +msgid "M" +msgstr "" + +#: ../src/viktrwlayer_propwin.c:2051 ../src/viktrwlayer_analysis.c:303 +#, c-format +msgid "%.1f miles" +msgstr "" + +#: ../src/viktrwlayer_propwin.c:2054 ../src/viktrwlayer_analysis.c:306 +#, c-format +msgid "%.1f NM" +msgstr "" + +#. VIK_UNITS_DISTANCE_KILOMETRES +#: ../src/viktrwlayer_propwin.c:2057 ../src/viktrwlayer_analysis.c:310 +#, c-format +msgid "%.1f km" +msgstr "" + +#: ../src/viktrwlayer_propwin.c:3083 +msgid "Failed spliting track. Track unchanged" +msgstr "falla en la operacion del spliting . Track no modificado" + +#: ../src/viktrwlayer_propwin.c:3234 ../src/viktrwlayer_propwin.c:3744 +#, c-format +msgid "%s - Track Properties" +msgstr "%s - Propiedades de ruta" + +#: ../src/viktrwlayer_propwin.c:3239 +msgid "Split at _Marker" +msgstr "" + +#: ../src/viktrwlayer_propwin.c:3240 +msgid "Split _Segments" +msgstr "" + +#: ../src/viktrwlayer_propwin.c:3241 +msgid "_Reverse" +msgstr "" + +#: ../src/viktrwlayer_propwin.c:3242 +msgid "_Delete Dupl." +msgstr "" + +#: ../src/viktrwlayer_propwin.c:3269 +msgid "Comment:" +msgstr "Comentario:" + +#: ../src/viktrwlayer_propwin.c:3270 +msgid "Description:" +msgstr "" + +#: ../src/viktrwlayer_propwin.c:3271 +#, fuzzy +msgid "Source:" +msgstr "Comienzo:" + +#: ../src/viktrwlayer_propwin.c:3272 +#, fuzzy +msgid "Type:" +msgstr "Tiempo:" + +#: ../src/viktrwlayer_propwin.c:3273 +msgid "Color:" +msgstr "" + +#: ../src/viktrwlayer_propwin.c:3274 +msgid "Draw Name:" +msgstr "" + +#: ../src/viktrwlayer_propwin.c:3275 +msgid "Distance Labels:" +msgstr "" + +#: ../src/viktrwlayer_propwin.c:3278 +msgid "Track Length:" +msgstr "Longitud de ruta:" + +#: ../src/viktrwlayer_propwin.c:3279 +msgid "Trackpoints:" +msgstr "Puntos de ruta:" + +#: ../src/viktrwlayer_propwin.c:3280 +msgid "Segments:" +msgstr "Segmentos:" + +#: ../src/viktrwlayer_propwin.c:3281 +msgid "Duplicate Points:" +msgstr "Puntos duplicados:" + +#: ../src/viktrwlayer_propwin.c:3282 +msgid "Max Speed:" +msgstr "Velocidad max.:" + +#: ../src/viktrwlayer_propwin.c:3283 +msgid "Avg. Speed:" +msgstr "Velocidad media:" + +#: ../src/viktrwlayer_propwin.c:3284 +msgid "Moving Avg. Speed:" +msgstr "" + +#: ../src/viktrwlayer_propwin.c:3285 +msgid "Avg. Dist. Between TPs:" +msgstr "Dist. media entre puntos:" + +#: ../src/viktrwlayer_propwin.c:3286 +msgid "Elevation Range:" +msgstr "Horquilla de elevación:" + +#: ../src/viktrwlayer_propwin.c:3287 +msgid "Total Elevation Gain/Loss:" +msgstr "Diferencia total de elevación:" + +#: ../src/viktrwlayer_propwin.c:3288 +msgid "Start:" +msgstr "Comienzo:" + +#: ../src/viktrwlayer_propwin.c:3289 +msgid "End:" +msgstr "Fin:" + +#: ../src/viktrwlayer_propwin.c:3290 +msgid "Duration:" +msgstr "Duración:" + +#: ../src/viktrwlayer_propwin.c:3320 +msgid "Centre" +msgstr "" + +#: ../src/viktrwlayer_propwin.c:3321 +msgid "Start only" +msgstr "" + +#: ../src/viktrwlayer_propwin.c:3322 +msgid "End only" +msgstr "" + +#: ../src/viktrwlayer_propwin.c:3323 +msgid "Start and End" +msgstr "" + +#: ../src/viktrwlayer_propwin.c:3324 +msgid "Centre, Start and End" +msgstr "" + +#: ../src/viktrwlayer_propwin.c:3336 +msgid "Maximum number of distance labels to be shown" +msgstr "" + +#: ../src/viktrwlayer_propwin.c:3340 +msgid "Properties" +msgstr "" + +#: ../src/viktrwlayer_propwin.c:3584 +#, c-format +msgid "%d minutes - %d minutes moving" +msgstr "" + +#: ../src/viktrwlayer_propwin.c:3596 +#, c-format +msgid "%s total - %s in segments" +msgstr "" + +#: ../src/viktrwlayer_propwin.c:3607 ../src/viktrwlayer_analysis.c:622 +msgid "Statistics" +msgstr "Estadisticas" + +#: ../src/viktrwlayer_propwin.c:3613 ../src/viktrwlayer_propwin.c:3680 +msgid "Show D_EM" +msgstr "" + +#: ../src/viktrwlayer_propwin.c:3615 ../src/viktrwlayer_propwin.c:3631 +#: ../src/viktrwlayer_propwin.c:3647 ../src/viktrwlayer_propwin.c:3697 +msgid "Show _GPS Speed" +msgstr "" + +#: ../src/viktrwlayer_propwin.c:3617 ../src/viktrwlayer_propwin.c:3633 +#: ../src/viktrwlayer_propwin.c:3665 ../src/viktrwlayer_propwin.c:3699 +msgid "Track Distance:" +msgstr "Distancia del Track:" + +#: ../src/viktrwlayer_propwin.c:3618 ../src/viktrwlayer_propwin.c:3684 +msgid "Track Height:" +msgstr "" + +#: ../src/viktrwlayer_propwin.c:3624 +msgid "Elevation-distance" +msgstr "Elevación-distancia" + +#: ../src/viktrwlayer_propwin.c:3634 +msgid "Track Gradient:" +msgstr "" + +#: ../src/viktrwlayer_propwin.c:3639 +msgid "Gradient-distance" +msgstr "" + +#: ../src/viktrwlayer_propwin.c:3649 ../src/viktrwlayer_propwin.c:3666 +#: ../src/viktrwlayer_propwin.c:3683 +msgid "Track Time:" +msgstr "Tiempo del Track:" + +#: ../src/viktrwlayer_propwin.c:3650 ../src/viktrwlayer_propwin.c:3700 +msgid "Track Speed:" +msgstr "" + +#: ../src/viktrwlayer_propwin.c:3651 ../src/viktrwlayer_propwin.c:3667 +#: ../src/viktrwlayer_propwin.c:3685 +msgid "Time/Date:" +msgstr "" + +#: ../src/viktrwlayer_propwin.c:3655 +msgid "Speed-time" +msgstr "Velocidad-tiempo" + +#: ../src/viktrwlayer_propwin.c:3663 ../src/viktrwlayer_propwin.c:3679 +msgid "Show S_peed" +msgstr "" + +#: ../src/viktrwlayer_propwin.c:3671 +msgid "Distance-time" +msgstr "" + +#: ../src/viktrwlayer_propwin.c:3690 +msgid "Elevation-time" +msgstr "" + +#: ../src/viktrwlayer_propwin.c:3705 +msgid "Speed-distance" +msgstr "" + +#: ../src/viktrwlayer_tpwin.c:190 ../src/viktrwlayer_wpwin.c:66 +msgid "Date/Time Edit" +msgstr "" + +#: ../src/viktrwlayer_tpwin.c:242 +msgid "Name:" +msgstr "" + +#: ../src/viktrwlayer_tpwin.c:243 +msgid "Latitude:" +msgstr "Latitud:" + +#: ../src/viktrwlayer_tpwin.c:244 +msgid "Longitude:" +msgstr "Longitud:" + +#: ../src/viktrwlayer_tpwin.c:245 +msgid "Altitude:" +msgstr "Altitud:" + +#: ../src/viktrwlayer_tpwin.c:246 +msgid "Course:" +msgstr "" + +#: ../src/viktrwlayer_tpwin.c:247 +msgid "Timestamp:" +msgstr "Instante temporal:" + +#: ../src/viktrwlayer_tpwin.c:248 +msgid "Time:" +msgstr "Tiempo:" + +#: ../src/viktrwlayer_tpwin.c:249 +msgid "Distance Difference:" +msgstr "Diferencia en distancia:" + +#: ../src/viktrwlayer_tpwin.c:250 +msgid "Time Difference:" +msgstr "Diferencia en tiempo:" + +#: ../src/viktrwlayer_tpwin.c:251 +msgid "\"Speed\" Between:" +msgstr "\"Velocidad\" entre:" + +#: ../src/viktrwlayer_tpwin.c:252 +msgid "Speed:" +msgstr "" + +#: ../src/viktrwlayer_tpwin.c:253 +msgid "VDOP:" +msgstr "VDOP:" + +#: ../src/viktrwlayer_tpwin.c:254 +msgid "HDOP:" +msgstr "HDOP:" + +#: ../src/viktrwlayer_tpwin.c:255 +msgid "PDOP:" +msgstr "PDOP:" + +#: ../src/viktrwlayer_tpwin.c:256 +msgid "SAT/FIX:" +msgstr "Configurar / Establecer: " + +#: ../src/viktrwlayer_tpwin.c:263 ../src/viktrwlayer_tpwin.c:408 +#: ../src/viktrwlayer_tpwin.c:622 +msgid "Trackpoint" +msgstr "Punto de ruta" + +#: ../src/viktrwlayer_tpwin.c:266 +msgid "_Insert After" +msgstr "Insertar después" + +#: ../src/viktrwlayer_tpwin.c:268 +msgid "Split Here" +msgstr "Dividir aquí" + +#: ../src/viktrwlayer_tracklist.c:262 ../src/viktrwlayer_waypointlist.c:306 +msgid "_Copy Data" +msgstr "" + +#. +#. item = gtk_image_menu_item_new_with_mnemonic ( _("_Select") ); +#. gtk_image_menu_item_set_image ( (GtkImageMenuItem*)item, gtk_image_new_from_stock (GTK_STOCK_FIND, GTK_ICON_SIZE_MENU) ); +#. g_signal_connect_swapped ( G_OBJECT(item), "activate", G_CALLBACK(trw_layer_track_select), values ); +#. gtk_menu_shell_append (GTK_MENU_SHELL (menu), item); +#. gtk_widget_show ( item ); +#. +#. ATM view auto selects, so don't bother with separate select menu entry +#. +#. item = gtk_image_menu_item_new_with_mnemonic ( _("_Select") ); +#. gtk_image_menu_item_set_image ( (GtkImageMenuItem*)item, gtk_image_new_from_stock (GTK_STOCK_FIND, GTK_ICON_SIZE_MENU) ); +#. g_signal_connect_swapped ( G_OBJECT(item), "activate", G_CALLBACK(trw_layer_waypoint_select), values ); +#. gtk_menu_shell_append (GTK_MENU_SHELL (menu), item); +#. gtk_widget_show ( item ); +#. +#. AUTO SELECT NOT TRUE YET... +#. ATM view auto selects, so don't bother with separate select menu entry +#: ../src/viktrwlayer_tracklist.c:290 ../src/viktrwlayer_waypointlist.c:341 +#: ../src/vikwindow.c:4816 +msgid "_View" +msgstr "_Ver" + +#. Insert column for the layer name when viewing multi layers +#: ../src/viktrwlayer_tracklist.c:613 ../src/viktrwlayer_waypointlist.c:609 +msgid "Layer" +msgstr "" + +#: ../src/viktrwlayer_tracklist.c:627 ../src/viktrwlayer_waypointlist.c:624 +msgid "Date" +msgstr "" + +#: ../src/viktrwlayer_tracklist.c:631 ../src/viktrwlayer_waypointlist.c:628 +msgid "Visible" +msgstr "" + +#: ../src/viktrwlayer_tracklist.c:639 +msgid "" +"Distance\n" +"(miles)" +msgstr "" + +#: ../src/viktrwlayer_tracklist.c:642 +msgid "" +"Distance\n" +"(NM)" +msgstr "" + +#: ../src/viktrwlayer_tracklist.c:645 +msgid "" +"Distance\n" +"(km)" +msgstr "" + +#: ../src/viktrwlayer_tracklist.c:651 +msgid "" +"Length\n" +"(minutes)" +msgstr "" + +#: ../src/viktrwlayer_tracklist.c:660 ../src/vikutils.c:93 +msgid "sec/mi" +msgstr "" + +#: ../src/viktrwlayer_tracklist.c:666 +#, c-format +msgid "" +"Av. Speed\n" +"(%s)" +msgstr "" + +#. Apply own formatting of the data +#: ../src/viktrwlayer_tracklist.c:671 +#, c-format +msgid "" +"Max Speed\n" +"(%s)" +msgstr "" + +#: ../src/viktrwlayer_tracklist.c:679 ../src/viktrwlayer_waypointlist.c:637 +msgid "" +"Max Height\n" +"(Feet)" +msgstr "" + +#: ../src/viktrwlayer_tracklist.c:681 ../src/viktrwlayer_waypointlist.c:639 +msgid "" +"Max Height\n" +"(Metres)" +msgstr "" + +#: ../src/viktrwlayer_waypointlist.c:312 +msgid "Copy Data (with _positions)" +msgstr "" + +#: ../src/viktrwlayer_waypointlist.c:633 +msgid "Comment" +msgstr "" + +#: ../src/viktrwlayer_waypointlist.c:643 +msgid "Symbol" +msgstr "" + +#: ../src/viktrwlayer_wpwin.c:93 ../src/viktrwlayer_wpwin.c:302 +msgid "True" +msgstr "" + +#: ../src/viktrwlayer_wpwin.c:122 +msgid "Waypoint Properties" +msgstr "Propiedades del punto de ruta (Waypoint)" + +#: ../src/viktrwlayer_wpwin.c:164 +msgid "Name:" +msgstr "Nombre:" + +#: ../src/viktrwlayer_wpwin.c:181 +msgid "Altitude:" +msgstr "Altitud:" + +#: ../src/viktrwlayer_wpwin.c:186 ../src/viktrwlayer_wpwin.c:188 +msgid "Comment:" +msgstr "Comentario:" + +#: ../src/viktrwlayer_wpwin.c:202 +#, fuzzy +msgid "Source:" +msgstr "Fuentes de descarga:" + +#: ../src/viktrwlayer_wpwin.c:212 +msgid "Image:" +msgstr "Imagen:" + +#: ../src/viktrwlayer_wpwin.c:217 +msgid "Symbol:" +msgstr "Símbolo:" + +#: ../src/viktrwlayer_wpwin.c:226 +msgid "(none)" +msgstr "(nada)" + +#. Geotag Info [readonly] +#: ../src/viktrwlayer_wpwin.c:272 +msgid "Has Geotag" +msgstr "" + +#: ../src/viktrwlayer_wpwin.c:279 +msgid "Consistent Position" +msgstr "" + +#. ATM the direction value box is always shown, even when there is no information. +#. It would be nice to be able to hide it until the 'Add' has been performed, +#. however I've not been able to achieve this. +#. Thus simply sensistizing it instead. +#: ../src/viktrwlayer_wpwin.c:292 +#, fuzzy +msgid "Image Direction:" +msgstr "Ajustes de imagen" + +#: ../src/viktrwlayer_wpwin.c:300 +msgid "Magnetic" +msgstr "" + +#: ../src/viktrwlayer_wpwin.c:320 +msgid "Time:" +msgstr "" + +#. TODO: other checks (isalpha or whatever ) +#: ../src/viktrwlayer_wpwin.c:386 +msgid "Please enter a name for the waypoint." +msgstr "Por favor, introduzca el nombre del waypoint." + +#: ../src/viktrwlayer_geotag.c:320 ../src/viktrwlayer_geotag.c:460 +#, c-format +msgid "Failed updating EXIF on %s" +msgstr "" + +#: ../src/viktrwlayer_geotag.c:562 +#, c-format +msgid "Geotagging %d Images..." +msgstr "" + +#: ../src/viktrwlayer_geotag.c:630 +msgid "Geotag Images" +msgstr "" + +#: ../src/viktrwlayer_geotag.c:640 +msgid "Images" +msgstr "" + +#: ../src/viktrwlayer_geotag.c:645 +msgid "Overwrite Existing Waypoints:" +msgstr "" + +#: ../src/viktrwlayer_geotag.c:648 +msgid "Overwrite Existing GPS Information:" +msgstr "" + +#: ../src/viktrwlayer_geotag.c:650 +msgid "Keep File Modification Timestamp:" +msgstr "" + +#: ../src/viktrwlayer_geotag.c:684 +msgid "Create Waypoints:" +msgstr "" + +#: ../src/viktrwlayer_geotag.c:693 +msgid "Write EXIF:" +msgstr "Escribir EXIF:" + +#: ../src/viktrwlayer_geotag.c:705 +msgid "Automatic Image Direction:" +msgstr "" + +#: ../src/viktrwlayer_geotag.c:707 +msgid "Set image direction based on a heading derived from the track" +msgstr "" + +#: ../src/viktrwlayer_geotag.c:710 +msgid "Interpolate Between Track Segments:" +msgstr "" + +#: ../src/viktrwlayer_geotag.c:715 +msgid "Image Time Offset (Seconds):" +msgstr "" + +#: ../src/viktrwlayer_geotag.c:718 +msgid "" +"The number of seconds to ADD to the photos time to make it match the GPS " +"data. Calculate this with (GPS - Photo). Can be negative or positive. Useful " +"to adjust times when a camera's timestamp was incorrect." +msgstr "" + +#: ../src/viktrwlayer_geotag.c:721 +msgid "Image Timezone:" +msgstr "" + +#: ../src/viktrwlayer_geotag.c:724 +msgid "" +"The timezone that was used when the images were created. For example, if a " +"camera is set to AWST or +8:00 hours. Enter +8:00 here so that the correct " +"adjustment to the images' time can be made. GPS data is always in UTC." +msgstr "" + +#: ../src/viktrwlayer_geotag.c:728 +#, c-format +msgid "Using waypoint: %s" +msgstr "" + +#: ../src/viktrwlayer_geotag.c:742 +#, c-format +msgid "Using track: %s" +msgstr "" + +#: ../src/viktrwlayer_geotag.c:744 +#, c-format +msgid "Using all tracks in: %s" +msgstr "" + +#: ../src/viktrwlayer_analysis.c:214 +msgid "Number of Tracks" +msgstr "" + +#: ../src/viktrwlayer_analysis.c:215 +msgid "Date Range" +msgstr "" + +#: ../src/viktrwlayer_analysis.c:216 +msgid "Total Length" +msgstr "" + +#: ../src/viktrwlayer_analysis.c:217 +msgid "Average Length" +msgstr "" + +#: ../src/viktrwlayer_analysis.c:218 +msgid "Eddington number" +msgstr "" + +#. No.4: Extended display only +#: ../src/viktrwlayer_analysis.c:219 +msgid "Max Speed" +msgstr "" + +#: ../src/viktrwlayer_analysis.c:220 +msgid "Avg. Speed" +msgstr "" + +#: ../src/viktrwlayer_analysis.c:221 +msgid "Minimum Altitude" +msgstr "" + +#: ../src/viktrwlayer_analysis.c:222 +msgid "Maximum Altitude" +msgstr "" + +#: ../src/viktrwlayer_analysis.c:223 +msgid "Total Elevation Gain/Loss" +msgstr "" + +#: ../src/viktrwlayer_analysis.c:224 +msgid "Avg. Elevation Gain/Loss" +msgstr "" + +#: ../src/viktrwlayer_analysis.c:225 +msgid "Total Duration" +msgstr "" + +#: ../src/viktrwlayer_analysis.c:226 +msgid "Avg. Duration" +msgstr "" + +#: ../src/viktrwlayer_analysis.c:317 +#, c-format +msgid "%.2f miles" +msgstr "" + +#: ../src/viktrwlayer_analysis.c:320 +#, c-format +msgid "%.2f NM" +msgstr "" + +#. VIK_UNITS_DISTANCE_KILOMETRES +#: ../src/viktrwlayer_analysis.c:324 +#, c-format +msgid "%.2f km" +msgstr "" + +#: ../src/viktrwlayer_analysis.c:361 +#, c-format +msgid "%.2f m/s" +msgstr "" + +#: ../src/viktrwlayer_analysis.c:370 ../src/viktrwlayer_analysis.c:373 +#, c-format +msgid "%.2f knots" +msgstr "" + +#: ../src/viktrwlayer_analysis.c:379 ../src/viktrwlayer_analysis.c:382 +#, c-format +msgid "%d s/km" +msgstr "" + +#: ../src/viktrwlayer_analysis.c:399 ../src/viktrwlayer_analysis.c:402 +#, c-format +msgid "%d sec/mi" +msgstr "" + +#: ../src/viktrwlayer_analysis.c:420 ../src/viktrwlayer_analysis.c:423 +#, c-format +msgid "%.2f km/h" +msgstr "" + +#: ../src/viktrwlayer_analysis.c:434 ../src/viktrwlayer_analysis.c:440 +#, c-format +msgid "%d feet" +msgstr "" + +#: ../src/viktrwlayer_analysis.c:445 ../src/viktrwlayer_analysis.c:447 +#, c-format +msgid "%d feet / %d feet" +msgstr "" + +#: ../src/viktrwlayer_analysis.c:452 ../src/viktrwlayer_analysis.c:458 +#, c-format +msgid "%d m" +msgstr "" + +#: ../src/viktrwlayer_analysis.c:463 ../src/viktrwlayer_analysis.c:465 +#, c-format +msgid "%d m / %d m" +msgstr "" + +#: ../src/viktrwlayer_analysis.c:477 +#, c-format +msgid "%d:%02d:%02d days:hrs:mins" +msgstr "" + +#: ../src/viktrwlayer_analysis.c:484 +#, c-format +msgid "%d:%02d hrs:mins" +msgstr "" + +#: ../src/viktrwlayer_analysis.c:658 +msgid "Include Invisible Items" +msgstr "" + +#: ../src/vikstatus.c:129 +msgid "Current number of background tasks. Click to see the background jobs." +msgstr "" + +#: ../src/vikstatus.c:134 +msgid "Current zoom level. Click to select a new one." +msgstr "" + +#: ../src/vikstatus.c:141 +msgid "Left click to clear the message. Right click to copy the message." +msgstr "" + +#: ../src/vikutils.c:108 +msgid "GPSD" +msgstr "" + +#. GPS Preamble +#: ../src/vikutils.c:109 +msgid "Trkpt" +msgstr "" + +#: ../src/vikutils.c:160 +#, c-format +msgid "%sSpeed%s %.1f%s" +msgstr "" + +#. Go for 2dp as expect low values for vertical speeds +#: ../src/vikutils.c:214 +#, c-format +msgid "%sClimb%s %.2f%s" +msgstr "" + +#: ../src/vikutils.c:223 +#, c-format +msgid "%sAlt %dfeet" +msgstr "" + +#. VIK_UNITS_HEIGHT_METRES: +#: ../src/vikutils.c:227 +#, c-format +msgid "%sAlt %dm" +msgstr "" + +#: ../src/vikutils.c:235 +#, c-format +msgid "%sCourse %03d°" +msgstr "" + +#: ../src/vikutils.c:249 +msgid "yards" +msgstr "" + +#. VIK_UNITS_DISTANCE_KILOMETRES: +#: ../src/vikutils.c:253 +msgid "m" +msgstr "" + +#: ../src/vikutils.c:257 +#, c-format +msgid "%sDistance diff %d%s" +msgstr "" + +#: ../src/vikutils.c:272 +#, c-format +msgid "%sTime %s" +msgstr "" + +#: ../src/vikutils.c:281 +#, c-format +msgid "%sTime diff %lds" +msgstr "" + +#: ../src/vikutils.c:287 +#, c-format +msgid "%sNo. of Sats %d" +msgstr "" + +#: ../src/vikutils.c:312 +#, c-format +msgid "%sTo End %.2f%s" +msgstr "" + +#: ../src/vikutils.c:339 +#, c-format +msgid "%sDistance along %.2f%s" +msgstr "" + +#: ../src/vikutils.c:359 +#, c-format +msgid "%sTrack: %s" +msgstr "" + +#: ../src/vikutils.c:396 +#, c-format +msgid "" +"There is a newer version of Viking available: %s\n" +"\n" +"Do you wish to go to Viking's website now?" +msgstr "" + +#: ../src/vikutils.c:526 +msgid "" +"This appears to be Viking's very first run.\n" +"\n" +"Do you wish to enable automatic internet features?\n" +"\n" +"Individual settings can be controlled in the Preferences." +msgstr "" + +#: ../src/vikwaypoint.c:37 +msgid "Waypoint" +msgstr "" + +#: ../src/vikwebtool_datasource.c:352 +msgid "Search Term" +msgstr "" + +#. TODO get rid of this as this is unnecessary duplication... +#: ../src/vikwindow.c:258 +msgid "Pan" +msgstr "Desplazar" + +#: ../src/vikwindow.c:258 +msgid "Zoom" +msgstr "Zoom" + +#: ../src/vikwindow.c:258 +msgid "Ruler" +msgstr "Regla" + +#: ../src/vikwindow.c:258 +msgid "Select" +msgstr "" + +#: ../src/vikwindow.c:368 +msgid "This is Viking " +msgstr "" + +#: ../src/vikwindow.c:457 +msgid "Location lookup aborted" +msgstr "" + +#: ../src/vikwindow.c:477 +#, c-format +msgid "Location found: %s" +msgstr "" + +#: ../src/vikwindow.c:486 +msgid "Unable to determine location" +msgstr "" + +#: ../src/vikwindow.c:495 +msgid "Determining location" +msgstr "" + +#: ../src/vikwindow.c:525 +#, c-format +msgid "Location found via geoclue" +msgstr "" + +#: ../src/vikwindow.c:546 +msgid "Default Map" +msgstr "" + +#: ../src/vikwindow.c:557 ../src/vikwindow.c:3938 +msgid "Trying to determine location..." +msgstr "" + +#. Create tooltip +#: ../src/vikwindow.c:723 +msgid "Select zoom level" +msgstr "" + +#: ../src/vikwindow.c:1176 +#, c-format +msgid "" +"Do you want to save the changes you made to the document \"%s\"?\n" +"\n" +"Your changes will be lost if you don't save them." +msgstr "" +"¿Desea grabar los cambios en el documento \"%s\"?\n" +"\n" +"Sus cambios se perderán si no los graba." + +#: ../src/vikwindow.c:1180 +msgid "Don't Save" +msgstr "No guardar" + +#: ../src/vikwindow.c:1268 +msgid "mpp" +msgstr "metros/pixel" + +#: ../src/vikwindow.c:1268 +msgid "pixelfact" +msgstr "factor de pixel" + +#: ../src/vikwindow.c:1467 +#, c-format +msgid "%s %s %dm" +msgstr "%s%s%dm" + +#: ../src/vikwindow.c:1469 +#, c-format +msgid "%s %s %dft" +msgstr "%s %s %dpiés" + +#: ../src/vikwindow.c:1472 +#, c-format +msgid "%s %s" +msgstr "%s%s" + +#: ../src/vikwindow.c:1929 +msgid "_Ruler" +msgstr "_Regla" + +#: ../src/vikwindow.c:1929 +msgid "Ruler Tool" +msgstr "Herramienta regla" + +#: ../src/vikwindow.c:2204 ../src/vikwindow.c:4818 +msgid "_Zoom" +msgstr "_Zoom" + +#: ../src/vikwindow.c:2204 +msgid "Zoom Tool" +msgstr "Herramienta zoom" + +#: ../src/vikwindow.c:2271 ../src/vikwindow.c:4819 +msgid "_Pan" +msgstr "_Desplazar" + +#: ../src/vikwindow.c:2271 +msgid "Pan Tool" +msgstr "Herramienta de paneo" + +#: ../src/vikwindow.c:2425 +msgid "_Select" +msgstr "" + +#: ../src/vikwindow.c:2425 +msgid "Select Tool" +msgstr "" + +#: ../src/vikwindow.c:2615 +msgid "You must select a layer to show its properties." +msgstr "Debe seleccionar una capa para mostrar sus propiedades." + +#. No error to show, so unlikely this will get called +#: ../src/vikwindow.c:2629 +msgid "The help system is not available." +msgstr "" + +#. Main error path +#: ../src/vikwindow.c:2632 +#, c-format +msgid "" +"Help is not available because: %s.\n" +"Ensure a Mime Type ghelp handler program is installed (e.g. yelp)." +msgstr "" + +#: ../src/vikwindow.c:2865 +msgid "You must select a layer to delete." +msgstr "Debe seleccionar una capa que borrar." + +#: ../src/vikwindow.c:3171 +msgid "Untitled" +msgstr "Sin nombre" + +#: ../src/vikwindow.c:3300 +#, c-format +msgid "Unable to add '%s' to the list of recently used documents" +msgstr "" +"Imposibilitado de agregar '%s' a la lista de los documentos recientemente " +"usados" + +#: ../src/vikwindow.c:3391 +msgid "The file you requested could not be opened." +msgstr "El fichero seleccionado no se puede abrir" + +#: ../src/vikwindow.c:3394 +msgid "" +"GPSBabel is required to load files of this type or GPSBabel encountered " +"problems." +msgstr "" + +#: ../src/vikwindow.c:3397 +#, c-format +msgid "Unable to load malformed GPX file %s" +msgstr "" + +#: ../src/vikwindow.c:3400 +#, c-format +msgid "Unsupported file type for %s" +msgstr "" + +#. Since we can process .vik files with issues just show a warning in the status bar +#. Not that a user can do much about it... or tells them what this issue is yet... +#: ../src/vikwindow.c:3406 +#, c-format +msgid "WARNING: issues encountered loading %s" +msgstr "" + +#: ../src/vikwindow.c:3489 +msgid "Please select a GPS data file to open. " +msgstr "Por favor seleccione un fichero GPS que abrir. " + +#: ../src/vikwindow.c:3508 +msgid "Google Earth" +msgstr "" + +#: ../src/vikwindow.c:3523 ../src/vikwindow.c:3646 ../src/viking.desktop.in.h:1 +msgid "Viking" +msgstr "Vikingo" + +#: ../src/vikwindow.c:3594 ../src/vikwindow.c:4632 +msgid "Open File" +msgstr "" + +#: ../src/vikwindow.c:3630 +msgid "Save as Viking File." +msgstr "Guardar como archivo Viking." + +#: ../src/vikwindow.c:3757 +#, c-format +msgid "Exporting to file: %s" +msgstr "" + +#. Confirm what happened. +#: ../src/vikwindow.c:3774 +#, c-format +msgid "Exported files: %d" +msgstr "" + +#: ../src/vikwindow.c:3786 +msgid "Nothing to Export!" +msgstr "" + +#: ../src/vikwindow.c:3790 +msgid "Export to directory" +msgstr "" + +#: ../src/vikwindow.c:3809 +msgid "Could not convert all files" +msgstr "" + +#: ../src/vikwindow.c:3851 +msgid "File not accessible" +msgstr "" + +#: ../src/vikwindow.c:3854 +msgid "No Viking File" +msgstr "" + +#: ../src/vikwindow.c:3998 +msgid "This layer has no configurable properties." +msgstr "" + +#: ../src/vikwindow.c:4080 +msgid "Are you sure you wish to delete all layers?" +msgstr "¿Está seguro de que desea borrar todas las capas?" + +#. Try harder... +#: ../src/vikwindow.c:4126 ../src/vikwindow.c:4132 +msgid "Generating image file..." +msgstr "" + +#: ../src/vikwindow.c:4154 +msgid "" +"Failed to generate internal image.\n" +"\n" +"Try creating a smaller image." +msgstr "" + +#: ../src/vikwindow.c:4175 +msgid "Image file generated." +msgstr "" + +#: ../src/vikwindow.c:4177 +msgid "Failed to generate image file." +msgstr "" + +#: ../src/vikwindow.c:4246 +#, c-format +msgid "Unable to write to file %s: %s" +msgstr "" + +#: ../src/vikwindow.c:4284 +msgid "" +"Viewable region outside allowable pixel size bounds for image. Clipping " +"width/height values." +msgstr "" +"La región visible fuera esta fuera de los valores permitidos para los " +"límites de la imagen. Se limitarán el ancho y el alto." + +#: ../src/vikwindow.c:4309 +#, c-format +msgid "Total area: %ldm x %ldm (%.3f sq. km)" +msgstr "Area total: %ldm x %ldm (%.3f km cuadrados)" + +#: ../src/vikwindow.c:4312 +#, c-format +msgid "Total area: %ldm x %ldm (%.3f sq. miles)" +msgstr "Area total: %ldm x %ldm (%.3f sq. miles)" + +#: ../src/vikwindow.c:4315 +#, c-format +msgid "Total area: %ldm x %ldm (%.3f sq. NM)" +msgstr "" + +#. Single file +#: ../src/vikwindow.c:4343 +msgid "Save Image" +msgstr "Guardar imagen" + +#: ../src/vikwindow.c:4364 ../src/vikwindow.c:4641 +msgid "KMZ" +msgstr "" + +#: ../src/vikwindow.c:4417 +msgid "You must be in UTM mode to use this feature" +msgstr "Debe estar en modo UTM para usar esta función" + +#: ../src/vikwindow.c:4421 +msgid "Choose a directory to hold images" +msgstr "Elije un directorio para colocar las imagenes" + +#. todo: default for answers inside VikWindow or static (thruout instance) +#: ../src/vikwindow.c:4441 +msgid "Save to Image File" +msgstr "Guardar como imagen" + +#: ../src/vikwindow.c:4457 +msgid "Width (pixels):" +msgstr "Ancho (pixels):" + +#: ../src/vikwindow.c:4459 +msgid "Height (pixels):" +msgstr "Alto (pixels):" + +#: ../src/vikwindow.c:4462 +msgid "" +"WARNING: USING LARGE IMAGES OVER 10000x10000\n" +"MAY CRASH THE PROGRAM!" +msgstr "" + +#: ../src/vikwindow.c:4464 +msgid "Zoom (meters per pixel):" +msgstr "Zoom (metros/pixel):" + +#: ../src/vikwindow.c:4480 +msgid "Area in current viewable window" +msgstr "Area en ventana visible" + +#: ../src/vikwindow.c:4490 +msgid "Save as PNG" +msgstr "Guardar como PNG" + +#: ../src/vikwindow.c:4491 +msgid "Save as JPEG" +msgstr "Guardar como JPEG" + +#: ../src/vikwindow.c:4520 +msgid "East-west image tiles:" +msgstr "Teselas de imagen E-W:" + +#: ../src/vikwindow.c:4522 +msgid "North-south image tiles:" +msgstr "Teselas de imagen N-S:" + +#: ../src/vikwindow.c:4619 +msgid "This feature is not available in UTM mode" +msgstr "" + +#: ../src/vikwindow.c:4658 +#, c-format +msgid "Unable to import %s." +msgstr "" + +#: ../src/vikwindow.c:4749 +msgid "Choose a background color" +msgstr "Escoja un color de fondo" + +#: ../src/vikwindow.c:4765 +msgid "Choose a track highlight color" +msgstr "" + +#: ../src/vikwindow.c:4814 +msgid "_File" +msgstr "_Archivo" + +#: ../src/vikwindow.c:4815 +msgid "_Edit" +msgstr "_Editar" + +#: ../src/vikwindow.c:4817 +msgid "_Show" +msgstr "_Mostrar" + +#: ../src/vikwindow.c:4820 +msgid "_Layers" +msgstr "_Capas" + +#: ../src/vikwindow.c:4821 +msgid "_Tools" +msgstr "_Herramientas" + +#: ../src/vikwindow.c:4822 +msgid "_Webtools" +msgstr "_Herramientas WEB" + +#: ../src/vikwindow.c:4823 ../src/vikwindow.c:4893 +msgid "_Help" +msgstr "A_yuda" + +#: ../src/vikwindow.c:4825 +msgid "New file" +msgstr "Archivo nuevo" + +#: ../src/vikwindow.c:4826 +msgid "_Open..." +msgstr "_Abrir…" + +#: ../src/vikwindow.c:4826 +msgid "Open a file" +msgstr "Abrir un archivo" + +#: ../src/vikwindow.c:4827 +msgid "Open _Recent File" +msgstr "Abrir fichero reciente" + +#: ../src/vikwindow.c:4828 +msgid "Append _File..." +msgstr "Añadir fichero" + +#: ../src/vikwindow.c:4828 +msgid "Append data from a different file" +msgstr "Añadir datos de otro fichero" + +#: ../src/vikwindow.c:4829 +msgid "Open GPX as External _Layer..." +msgstr "" + +#: ../src/vikwindow.c:4829 +msgid "Open a GPX file as an external layer" +msgstr "" + +#: ../src/vikwindow.c:4830 +msgid "_Export All" +msgstr "" + +#: ../src/vikwindow.c:4830 +msgid "Export All TrackWaypoint Layers" +msgstr "" + +#: ../src/vikwindow.c:4831 +msgid "_GPX..." +msgstr "" + +#: ../src/vikwindow.c:4831 +msgid "Export as GPX" +msgstr "" + +#: ../src/vikwindow.c:4832 +msgid "A_cquire" +msgstr "A_dquirir" + +#: ../src/vikwindow.c:4833 +msgid "_Directions..." +msgstr "" + +#: ../src/vikwindow.c:4833 +msgid "Get driving directions" +msgstr "" + +#: ../src/vikwindow.c:4835 +msgid "_OSM Traces..." +msgstr "" + +#: ../src/vikwindow.c:4835 +msgid "Get traces from OpenStreetMap" +msgstr "" + +#: ../src/vikwindow.c:4836 +msgid "_My OSM Traces..." +msgstr "" + +#: ../src/vikwindow.c:4836 +msgid "Get Your Own Traces from OpenStreetMap" +msgstr "" + +#: ../src/vikwindow.c:4839 +msgid "Geo_caches..." +msgstr "Geocaches" + +#: ../src/vikwindow.c:4839 +msgid "Get Geocaches from geocaching.com" +msgstr "Obtener geocachés de geocaching.com" + +#: ../src/vikwindow.c:4842 +msgid "Create waypoints from geotagged images" +msgstr "" + +#: ../src/vikwindow.c:4844 +msgid "Get a file from a URL" +msgstr "" + +#: ../src/vikwindow.c:4846 +msgid "Create waypoints from Wikipedia items in the current view" +msgstr "" + +#: ../src/vikwindow.c:4848 +msgid "_Save" +msgstr "_Guardar" + +#: ../src/vikwindow.c:4848 +msgid "Save the file" +msgstr "Guardar el fichero" + +#: ../src/vikwindow.c:4849 +msgid "Save _As..." +msgstr "Guardar _como..." + +#: ../src/vikwindow.c:4849 +msgid "Save the file under different name" +msgstr "Guardar el fichero con otro nombre" + +#: ../src/vikwindow.c:4850 +msgid "Properties..." +msgstr "" + +#: ../src/vikwindow.c:4850 +msgid "File Properties" +msgstr "" + +#: ../src/vikwindow.c:4852 +msgid "Import KMZ _Map File..." +msgstr "" + +#: ../src/vikwindow.c:4852 +msgid "Import a KMZ file" +msgstr "" + +#: ../src/vikwindow.c:4853 +msgid "Generate _KMZ Map File..." +msgstr "" + +#: ../src/vikwindow.c:4853 +msgid "Generate a KMZ file with an overlay of the current view" +msgstr "" + +#: ../src/vikwindow.c:4855 +msgid "_Generate Image File..." +msgstr "Generar i_magen..." + +#: ../src/vikwindow.c:4855 +msgid "Save a snapshot of the workspace into a file" +msgstr "Guardar una imagen del area de trabajo en un fichero" + +#: ../src/vikwindow.c:4856 +msgid "Generate _Directory of Images..." +msgstr "Generar _directorio de imágenes..." + +#: ../src/vikwindow.c:4856 +msgid "Generate _Directory of Images" +msgstr "" + +#: ../src/vikwindow.c:4857 +msgid "_Print..." +msgstr "_Imprimir…" + +#: ../src/vikwindow.c:4857 +msgid "Print maps" +msgstr "Imprimir mapas" + +#: ../src/vikwindow.c:4858 +msgid "E_xit" +msgstr "_Salir" + +#: ../src/vikwindow.c:4858 +msgid "Exit the program" +msgstr "Salir del programa" + +#: ../src/vikwindow.c:4859 +msgid "Save and Exit" +msgstr "Guardar y salir" + +#: ../src/vikwindow.c:4859 +msgid "Save and Exit the program" +msgstr "Guardar el fichero y salir de Viking" + +#: ../src/vikwindow.c:4861 +msgid "Go to the Pre_vious Location" +msgstr "" + +#: ../src/vikwindow.c:4861 +msgid "Go to the previous location" +msgstr "" + +#: ../src/vikwindow.c:4862 +msgid "Go to the _Next Location" +msgstr "" + +#: ../src/vikwindow.c:4862 +msgid "Go to the next location" +msgstr "" + +#: ../src/vikwindow.c:4863 +msgid "Go to the _Default Location" +msgstr "Ir a la localización por defecto" + +#: ../src/vikwindow.c:4863 +msgid "Go to the default location" +msgstr "Ir a la localización por defecto" + +#: ../src/vikwindow.c:4864 +#, fuzzy +msgid "Go to the _Auto Location" +msgstr "Ir a la localización por defecto" + +#: ../src/vikwindow.c:4864 +msgid "Go to a location via automatic lookup" +msgstr "" + +#: ../src/vikwindow.c:4865 +msgid "Go to _Location..." +msgstr "Ir a localización..." + +#: ../src/vikwindow.c:4865 +msgid "Go to address/place using text search" +msgstr "Ir a la direccion/posición usada por la busqueda de texto" + +#: ../src/vikwindow.c:4866 +msgid "_Go to Lat/Lon..." +msgstr "_Ir a Lat/Lon..." + +#: ../src/vikwindow.c:4866 +msgid "Go to arbitrary lat/lon coordinate" +msgstr "Ir a una lat/lon arbitraria" + +#: ../src/vikwindow.c:4867 +msgid "Go to UTM..." +msgstr "Ir a UTM..." + +#: ../src/vikwindow.c:4867 +msgid "Go to arbitrary UTM coordinate" +msgstr "Ir a una coordenada UTM arbitraria" + +#: ../src/vikwindow.c:4868 +#, fuzzy +msgid "Go to Today" +msgstr "Ir hacia UTM" + +#: ../src/vikwindow.c:4868 +msgid "Go to today on the calendar" +msgstr "" + +#: ../src/vikwindow.c:4869 +msgid "_Refresh" +msgstr "" + +#: ../src/vikwindow.c:4869 +msgid "Refresh any maps displayed" +msgstr "" + +#: ../src/vikwindow.c:4870 +msgid "Set _Highlight Color..." +msgstr "" + +#: ../src/vikwindow.c:4870 +msgid "Set Highlight Color" +msgstr "" + +#: ../src/vikwindow.c:4871 +msgid "Set Bac_kground Color..." +msgstr "Poner color de fondo" + +#: ../src/vikwindow.c:4871 +msgid "Set Background Color" +msgstr "" + +#: ../src/vikwindow.c:4872 +msgid "Zoom _In" +msgstr "_Ampliar" + +#: ../src/vikwindow.c:4872 +msgid "Zoom In" +msgstr "" + +#: ../src/vikwindow.c:4873 +msgid "Zoom _Out" +msgstr "_Reducir" + +#: ../src/vikwindow.c:4873 +msgid "Zoom Out" +msgstr "" + +#: ../src/vikwindow.c:4874 +msgid "Zoom _To..." +msgstr "Acercar/alejar a..." + +#: ../src/vikwindow.c:4874 +msgid "Zoom To" +msgstr "" + +#: ../src/vikwindow.c:4875 +msgid "Pan _North" +msgstr "Girar hacia el Norte" + +#: ../src/vikwindow.c:4876 +msgid "Pan _East" +msgstr "Girar hacia el Este" + +#: ../src/vikwindow.c:4877 +msgid "Pan _South" +msgstr "Girar hacia el Sur" + +#: ../src/vikwindow.c:4878 +msgid "Pan _West" +msgstr "Girar hacia el Oeste" + +#: ../src/vikwindow.c:4879 +msgid "Background _Jobs" +msgstr "_Tareas en segundo plano" + +#: ../src/vikwindow.c:4879 +msgid "Background Jobs" +msgstr "" + +#: ../src/vikwindow.c:4881 +msgid "Cu_t" +msgstr "Cor_tar" + +#: ../src/vikwindow.c:4885 +msgid "Delete All" +msgstr "Borrar todo" + +#: ../src/vikwindow.c:4886 +msgid "Copy Centre _Location" +msgstr "" + +#: ../src/vikwindow.c:4887 +msgid "_Flush Map Cache" +msgstr "Vaciar caché de mapas" + +#: ../src/vikwindow.c:4888 +msgid "_Set the Default Location" +msgstr "Establecer como localización por defecto" + +#: ../src/vikwindow.c:4888 +msgid "Set the Default Location to the current position" +msgstr "Establecer la localización actual como localización por defecto" + +#: ../src/vikwindow.c:4889 +msgid "_Preferences" +msgstr "_Preferencias" + +#: ../src/vikwindow.c:4889 +msgid "Program Preferences" +msgstr "" + +#: ../src/vikwindow.c:4890 +msgid "_Layer Defaults" +msgstr "" + +#: ../src/vikwindow.c:4891 +msgid "_Properties" +msgstr "P_ropiedades" + +#: ../src/vikwindow.c:4893 +msgid "Help" +msgstr "" + +#: ../src/vikwindow.c:4894 +msgid "_About" +msgstr "_Acerca de..." + +#: ../src/vikwindow.c:4894 +msgid "About" +msgstr "" + +#: ../src/vikwindow.c:4903 +msgid "_KML..." +msgstr "" + +#: ../src/vikwindow.c:4903 +msgid "Export as KML" +msgstr "" + +#: ../src/vikwindow.c:4904 +msgid "Transfer data from a GPS device" +msgstr "Transferir datos desde un dispositivo GPS" + +#: ../src/vikwindow.c:4905 +msgid "Import file via GPSBabel converter" +msgstr "" + +#: ../src/vikwindow.c:4909 +msgid "Import Geo_JSON File..." +msgstr "" + +#: ../src/vikwindow.c:4909 +msgid "Import GeoJSON file" +msgstr "" + +#: ../src/vikwindow.c:4914 +msgid "_UTM Mode" +msgstr "Modo _UTM" + +#: ../src/vikwindow.c:4915 +msgid "_Expedia Mode" +msgstr "Modo _Expedia" + +#: ../src/vikwindow.c:4916 +msgid "_Mercator Mode" +msgstr "Modo _Mercator" + +#: ../src/vikwindow.c:4917 +msgid "Lat_/Lon Mode" +msgstr "Modo de Lat/Lon" + +#: ../src/vikwindow.c:4921 +msgid "Show _Scale" +msgstr "Mostrar escala" + +#: ../src/vikwindow.c:4921 +msgid "Show Scale" +msgstr "Mostrar escala" + +#: ../src/vikwindow.c:4922 +msgid "Show _Center Mark" +msgstr "Mostrar marca de centro" + +#: ../src/vikwindow.c:4922 +msgid "Show Center Mark" +msgstr "Mostrar marca central" + +#: ../src/vikwindow.c:4923 +msgid "Show _Highlight" +msgstr "" + +#: ../src/vikwindow.c:4923 +msgid "Show Highlight" +msgstr "" + +#: ../src/vikwindow.c:4924 +msgid "_Full Screen" +msgstr "_Pantalla completa" + +#: ../src/vikwindow.c:4924 +msgid "Activate full screen mode" +msgstr "Activando el modo de pantalla completa" + +#: ../src/vikwindow.c:4925 +msgid "Show Side _Panel" +msgstr "Mostrar panel lateral" + +#: ../src/vikwindow.c:4925 +msgid "Show Side Panel" +msgstr "Muestra el panel lateral" + +#: ../src/vikwindow.c:4926 +msgid "Show Status_bar" +msgstr "Mostrar barra de estado" + +#: ../src/vikwindow.c:4926 +msgid "Show Statusbar" +msgstr "Mostrar barra de estado" + +#: ../src/vikwindow.c:4927 +msgid "Show _Toolbar" +msgstr "Mostrar Barra de _Herramientas" + +#: ../src/vikwindow.c:4927 +msgid "Show Toolbar" +msgstr "Mostrar Barra de Herramientas" + +#: ../src/vikwindow.c:4928 +msgid "Show _Menu" +msgstr "Mostrar Menú" + +#: ../src/vikwindow.c:4928 +msgid "Show Menu" +msgstr "Mostrar Menú" + +#: ../src/vikwindow.c:4929 +#, fuzzy +msgid "Show Side Panel B_uttons" +msgstr "Muestra el panel lateral" + +#: ../src/vikwindow.c:4929 +#, fuzzy +msgid "Show Side Panel Buttons" +msgstr "Muestra el panel lateral" + +#: ../src/vikwindow.c:4930 +#, fuzzy +msgid "Show Side Panel Ca_lendar" +msgstr "Muestra el panel lateral" + +#: ../src/vikwindow.c:4930 +#, fuzzy +msgid "Show Side Panel Calendar" +msgstr "Muestra el panel lateral" + +#: ../src/vikwindow.c:5064 +#, c-format +msgid "New _%s Layer" +msgstr "" + +#: ../src/vikwindow.c:5114 +#, fuzzy +msgid "..." +msgstr "Añadir…" + +#: ../src/viking.desktop.in.h:2 +msgid "GPS Data Manager" +msgstr "Administrador de datos GPS" + +#: ../src/viking.desktop.in.h:3 +msgid "Map Based GPS Data Manager (live data capable)." +msgstr "" +"Mapa basado en el administrador de datos GPS (Capacidad de datos en tiempo " +"real)" + +#: ../src/libjpeg/jpeg-data.c:205 +msgid "Data does not follow JPEG specification." +msgstr "" + +#: ../src/libjpeg/jpeg-data.c:302 +#, c-format +msgid "Path '%s' invalid." +msgstr "" + +#: ../src/libjpeg/jpeg-data.c:320 +#, c-format +msgid "Could not read '%s'." +msgstr "" + +#~ msgid "Polygonzied Layer" +#~ msgstr "Capa poligonal" + +#~ msgid "Email:" +#~ msgstr "Correo-e:" + +#~ msgid "I don't know that place. Do you want another goto?" +#~ msgstr "No conozco ese lugar. Desea realizar otro \"ir a\"" + +#~ msgid "Error: couldn't find gpsbabel." +#~ msgstr "Error: gpsbabel no encontrado" + +#~ msgid "Create Track" +#~ msgstr "Crear ruta" diff --git a/po/eu.po b/po/eu.po new file mode 100644 index 0000000..83ca8d0 --- /dev/null +++ b/po/eu.po @@ -0,0 +1,6326 @@ +# Basque translation for viking +# Copyright (c) 2013 Rosetta Contributors and Canonical Ltd 2013 +# This file is distributed under the same license as the viking package. +# FIRST AUTHOR , 2013. +# +msgid "" +msgstr "" +"Project-Id-Version: viking\n" +"Report-Msgid-Bugs-To: \n" +"POT-Creation-Date: 2019-01-19 12:53+0000\n" +"PO-Revision-Date: 2016-04-10 22:51+0000\n" +"Last-Translator: Alexander Gabilondo \n" +"Language-Team: Basque \n" +"Language: eu\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-Launchpad-Export-Date: 2018-12-21 17:32+0000\n" +"X-Generator: Launchpad (build 18847)\n" + +#: ../src/acquire.c:106 ../src/vikgpslayer.c:1367 +msgid "Done." +msgstr "Eginda." + +#: ../src/acquire.c:115 +msgid "No data." +msgstr "Daturik ez." + +#: ../src/acquire.c:167 ../src/acquire.c:415 +msgid "Error: acquisition failed." +msgstr "Errorea: eskuratzeak huts egin du." + +#: ../src/acquire.c:339 +msgid "Working..." +msgstr "Lanean..." + +#. This shouldn't happen... +#: ../src/acquire.c:406 +msgid "" +"Unable to create command\n" +"Acquire method failed." +msgstr "" +"Ezin da komandoa sortu\n" +"eskuratze-metodoak huts egin du." + +#: ../src/acquire.c:513 +msgid "_Filter" +msgstr "_Iragazkia" + +#: ../src/acquire.c:528 +#, c-format +msgid "Filter with %s" +msgstr "Iragazi honen bidez %s" + +#: ../src/acquire.c:545 +msgid "Filter" +msgstr "Iragazi" + +#: ../src/babel.c:640 +msgid "GPSBabel:" +msgstr "GPSBabel:" + +#: ../src/babel.c:641 +msgid "" +"Allow setting the specific instance of GPSBabel. You must restart Viking for " +"this value to take effect." +msgstr "" +"Baimendu GPSBabel en instantzia propioa ezartzen. Balioa hau aktibatzeko " +"Viking berrabiarazi behar duzu." + +#: ../src/babel_ui.c:79 +msgid "Select a file format" +msgstr "Hautatu fitxategi formatua" + +#: ../src/babel_ui.c:144 ../src/viktrwlayer.c:531 ../src/viktrwlayer.c:2882 +msgid "Tracks" +msgstr "Arrastoak" + +#: ../src/babel_ui.c:149 ../src/viktrwlayer.c:2892 +msgid "Routes" +msgstr "Ibilbideak" + +#. ***** PARAMETERS ***** +#: ../src/babel_ui.c:154 ../src/viktrwlayer.c:531 ../src/viktrwlayer.c:2887 +msgid "Waypoints" +msgstr "Bide-puntuak" + +#: ../src/background.c:64 +#, c-format +msgid "%d items" +msgstr "%d elementuak" + +#: ../src/background.c:287 +msgid "Threads:" +msgstr "Hariak:" + +#: ../src/background.c:288 +msgid "" +"Number of threads to use for Mapnik tasks. You need to restart Viking for a " +"change to this value to be used" +msgstr "" +"Mapnik-en atazetan erabiltzeko hari kopurua. Balioa hau aktibatzeko Viking " +"berrabiarazi behar duzu." + +#: ../src/background.c:361 +msgid "Job" +msgstr "Lana" + +#: ../src/background.c:365 +msgid "Progress" +msgstr "Aurrerapena" + +#: ../src/background.c:373 +msgid "Viking Background Jobs" +msgstr "Viking atzeko planoko lanak" + +#: ../src/bing.c:42 +msgid "Bing Aerial" +msgstr "Bing Aerial" + +#: ../src/bing.c:48 +msgid "Bing" +msgstr "Bing" + +#. VIK_GTK_WINDOW_FROM_WIDGET(vp) +#: ../src/bingmapsource.c:514 +msgid "Bing attribution Loading" +msgstr "Bing atributuak kargatzen" + +#: ../src/clipboard.c:95 +msgid "paste failed" +msgstr "Errorea itsastean" + +#: ../src/clipboard.c:105 +msgid "wrong clipboard data size" +msgstr "arbeleko datuen tamaina okerra" + +#: ../src/clipboard.c:124 +#, c-format +msgid "" +"The clipboard contains sublayer data for %s layers. You must select a layer " +"of this type to paste the clipboard data." +msgstr "" +"Arbelak %s geruzaren azpigeruza-datuak ditu. Hautatu behar duzu mota " +"horretako geruza arbeleko datuak itsasteko." + +#: ../src/clipboard.c:264 +msgid "" +"In order to paste a waypoint, please select an appropriate layer to paste " +"into." +msgstr "Hautatu geruza egokia bide-puntu bat itsasteko." + +#: ../src/dialog.c:60 +msgid "Go to Lat/Lon" +msgstr "Joan latit/longitudera" + +#: ../src/dialog.c:69 ../src/viktrwlayer_wpwin.c:173 +msgid "Latitude:" +msgstr "Latitudea:" + +#: ../src/dialog.c:72 ../src/viktrwlayer_wpwin.c:177 +msgid "Longitude:" +msgstr "Longitudea:" + +#: ../src/dialog.c:102 +msgid "Go to UTM" +msgstr "" +"Joan UTM-ra (Universal Transverse Mercator coordinate system horretara; " +"Mercator-ren trebeseko koordenada sistema unibertsal horretara))" + +#: ../src/dialog.c:114 +msgid "Northing:" +msgstr "Iparra:" + +#: ../src/dialog.c:117 +msgid "Easting:" +msgstr "Ekialdea:" + +#: ../src/dialog.c:121 ../src/vikgeoreflayer.c:902 +msgid "Zone:" +msgstr "Zona:" + +#: ../src/dialog.c:124 ../src/vikgeoreflayer.c:904 +msgid "Letter:" +msgstr "Hizkia:" + +#: ../src/dialog.c:246 ../src/geonamessearch.c:238 +#: ../src/datasource_osm_my_traces.c:505 +msgid "Nothing was selected" +msgstr "Ez zegoen ezer hautatuta" + +#: ../src/dialog.c:254 +msgid "Add Route" +msgstr "Gehitu ibilbidea" + +#: ../src/dialog.c:254 +msgid "Add Track" +msgstr "Gehitu arrastoa" + +#: ../src/dialog.c:262 +msgid "Route Name:" +msgstr "Ibilbidearen izena:" + +#: ../src/dialog.c:262 +msgid "Track Name:" +msgstr "Arrastoaren izena:" + +#: ../src/dialog.c:282 +msgid "Please enter a name for the track." +msgstr "Eman izen bat arrastoari." + +#: ../src/dialog.c:311 +msgid "Today" +msgstr "Gaur" + +#: ../src/dialog.c:393 +msgid "Zoom Factors..." +msgstr "Zoom faktoreak..." + +#: ../src/dialog.c:407 +msgid "Zoom factor (in meters per pixel):" +msgstr "Zoom faktorea (metro/pixeleko)" + +#: ../src/dialog.c:408 +msgid "X (easting): " +msgstr "X (ekialdea): " + +#: ../src/dialog.c:409 +msgid "Y (northing): " +msgstr "Y (iparra): " + +#: ../src/dialog.c:414 +msgid "X and Y zoom factors must be equal" +msgstr "X eta Y zoom-faktoreak berdinak izan behar dute" + +#: ../src/dialog.c:469 +msgid "1 min" +msgstr "Minutu 1" + +#: ../src/dialog.c:470 +msgid "1 hour" +msgstr "Ordu 1" + +#: ../src/dialog.c:471 +msgid "1 day" +msgstr "Egun 1" + +#: ../src/dialog.c:472 +msgid "Custom (in minutes):" +msgstr "Pertsonalizatua (minututan):" + +#: ../src/dialog.c:608 +#, c-format +msgid "" +"2003-2008, Evan Battaglia\n" +"2008-%s, Viking's contributors" +msgstr "" + +#: ../src/dialog.c:609 +msgid "GPS Data and Topo Analyzer, Explorer, and Manager." +msgstr "GPS Data eta Topo Analyzer, Explorer eta Manager." + +#: ../src/dialog.c:610 +msgid "" +"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.\n" +"\n" +"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.\n" +"\n" +"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., 59 Temple " +"Place, Suite 330, Boston, MA 02111-1307, USA" +msgstr "" +"Programa hau software librea da; birbanatu edo eta aldatu dezakezu " +"Software Librearen Fundazioak argitaratutako GNU General Public License-aren " +"baldintzapean; baita ere Lizentziaren 2. edo ondorengo bertsioak.\n" +"\n" +"Programa hau banatu da erabilgarria izan dadin, baina INOLAKO BERMERIK " +"GABE; ez merkatal erabilpenerako ez eta erabilpen pertsonalerako. Xehetasun " +"gehiago GNU General Public License-an aurki ditzakezu.\n" +"\n" +"Programa honekin batera, GNU General Public License-aren kopia bat jaso " +"beharko zenuke; bestela, Software Librearen Fundazioari idatzi, Inc., 59 " +"Temple Place, Suite 330, Boston, MA 02111-1307, USA" + +#: ../src/dialog.c:703 +msgid "Translation is coordinated on http://launchpad.net/viking" +msgstr "Itzulpen koordinatuta dago http://launchpad.net/viking orrian" + +#: ../src/dialog.c:713 +msgid "Download along track" +msgstr "Deskargatu zeharkako arrastoa" + +#: ../src/dialog.c:720 +msgid "Map type:" +msgstr "Mapa mota:" + +#: ../src/dialog.c:726 +msgid "Zoom level:" +msgstr "Zoom maila:" + +#: ../src/dialog.c:766 +#, c-format +msgid "The map data is licensed: %s." +msgstr "Maparen datuek lizentzia hau dute: %s." + +#: ../src/dialog.c:769 +#, c-format +msgid "" +"The data provided by '%s' are licensed under the following license: " +"%s." +msgstr "'%s' hornitzailearen datuek lizentzia hau dute: %s." + +#: ../src/dialog.c:773 +msgid "Open license" +msgstr "Lizentzia irekia" + +#: ../src/expedia.c:54 +msgid "Expedia Street Maps" +msgstr "Expedia Street Maps" + +#: ../src/expedia.c:82 +msgid "Invalid expedia altitude" +msgstr "Expedia altitudea ez da baliozkoa" + +#: ../src/expedia.c:113 +#, c-format +msgid "" +"Couldn't open EXPEDIA image file (right after successful download! Please " +"report and delete image file!): %s" +msgstr "" +"Ezin da ireki EXPEDIA irudi-fitxategia (hain justu arrakastaz deskargatu " +"ondoren! Informatu eta ezabatu irudi-fitxategai!): %s" + +#: ../src/expedia.c:126 +#, c-format +msgid "" +"Couldn't save EXPEDIA image file (right after successful download! Please " +"report and delete image file!): %s" +msgstr "" +"Ezin da gorde EXPEDIA irudi-fitxategia (hain justu arrakastaz deskargatu " +"ondoren! Informatu eta ezabatu irudi-fitxategai!): %s" + +#: ../src/geonamessearch.c:115 +msgid "Search" +msgstr "Bilatu" + +#: ../src/geonamessearch.c:117 +msgid "No entries found!" +msgstr "Ez da sarrerarik aurkitu!" + +#. NB could allow columns to be shifted around by doing this after each new +#. gtk_tree_view_column_set_reorderable ( column, TRUE ); +#. However I don't think is that useful, so I haven't put it in +#: ../src/geonamessearch.c:171 ../src/datasource_osm_my_traces.c:422 +#: ../src/viktrwlayer_tracklist.c:621 ../src/viktrwlayer_waypointlist.c:618 +msgid "Name" +msgstr "Izena" + +#: ../src/geonamessearch.c:176 +msgid "Feature" +msgstr "Ezaugarri" + +#: ../src/geonamessearch.c:181 ../src/datasource_osm_my_traces.c:437 +msgid "Lat/Lon" +msgstr "Lat/Lon" + +#: ../src/geonamessearch.c:264 ../src/googlesearch.c:101 ../src/vikgoto.c:430 +msgid "couldn't map temp file" +msgstr "ezin esleitu aldi baterako fitxategia" + +#: ../src/geonamessearch.c:459 +#, fuzzy +msgid "Select articles" +msgstr "Hautatu fitxategi formatua" + +#: ../src/geonamessearch.c:459 +#, fuzzy +msgid "Select the articles you want to add." +msgstr "Hautatu fitxategi-formatua." + +#: ../src/geonamessearch.c:475 +msgid "city" +msgstr "" + +#: ../src/geonamessearch.c:477 +#, fuzzy +msgid "edu" +msgstr "bukaera" + +#: ../src/geonamessearch.c:479 +msgid "airport" +msgstr "" + +#: ../src/geonamessearch.c:481 +msgid "mountain" +msgstr "" + +#: ../src/geonamessearch.c:483 +msgid "forest" +msgstr "" + +#: ../src/geonamessearch.c:485 +msgid "church" +msgstr "" + +#: ../src/geojson.c:74 +#, c-format +msgid "%s command failed: %s" +msgstr "%s komandoak huts egin du: %s" + +#: ../src/geojson.c:146 ../src/gpx.c:1317 +#, c-format +msgid "failed to open temporary file: %s" +msgstr "Errorea aldi baterako fitxategia irikitzean: %s" + +#: ../src/globals.c:67 +msgid "DDD" +msgstr "" + +#: ../src/globals.c:67 +#, fuzzy +msgid "DMM" +msgstr "DEM" + +#: ../src/globals.c:67 +#, fuzzy +msgid "DMS" +msgstr "DEM" + +#: ../src/globals.c:67 +msgid "Raw" +msgstr "Raw" + +#: ../src/globals.c:68 +msgid "Kilometres" +msgstr "Kilometroak" + +#: ../src/globals.c:68 +msgid "Miles" +msgstr "Miliak" + +#: ../src/globals.c:68 +msgid "Nautical Miles" +msgstr "Itsas milia" + +#. VIK_UNITS_SPEED_KILOMETRES_PER_HOUR: +#: ../src/globals.c:69 ../src/viktrwlayer_tracklist.c:655 ../src/vikutils.c:100 +msgid "km/h" +msgstr "km/h" + +#: ../src/globals.c:69 ../src/viktrwlayer_tracklist.c:656 ../src/vikutils.c:78 +msgid "mph" +msgstr "mph" + +#. VIK_UNITS_SPEED_METRES_PER_SECOND: +#: ../src/globals.c:69 ../src/viktrwlayer_tracklist.c:663 ../src/vikutils.c:81 +msgid "m/s" +msgstr "m/s" + +#: ../src/globals.c:69 ../src/viktrwlayer_tracklist.c:657 ../src/vikutils.c:84 +msgid "knots" +msgstr "korapilo" + +#: ../src/globals.c:69 ../src/viktrwlayer_tracklist.c:658 ../src/vikutils.c:87 +msgid "s/km" +msgstr "" + +#: ../src/globals.c:69 ../src/viktrwlayer_tracklist.c:659 ../src/vikutils.c:90 +msgid "min/km" +msgstr "" + +#: ../src/globals.c:69 +msgid "s/mi" +msgstr "" + +#: ../src/globals.c:69 ../src/viktrwlayer_tracklist.c:661 ../src/vikutils.c:96 +msgid "min/mi" +msgstr "" + +#: ../src/globals.c:70 +#, fuzzy +msgid "Metres" +msgstr "Kilometroak" + +#: ../src/globals.c:70 +msgid "Feet" +msgstr "" + +#: ../src/globals.c:73 +msgid "Locale" +msgstr "Tokikoa" + +#: ../src/globals.c:73 +msgid "World" +msgstr "Mundua" + +#: ../src/globals.c:73 +msgid "UTC" +msgstr "UTC" + +#: ../src/globals.c:76 +msgid "Degree format:" +msgstr "Gradu-formatua" + +#: ../src/globals.c:77 +msgid "Distance units:" +msgstr "Distantzia-unitateak:" + +#: ../src/globals.c:78 +msgid "Speed units:" +msgstr "Abiadura-unitateak:" + +#: ../src/globals.c:79 +msgid "Height units:" +msgstr "Alturera-unitateak:" + +#: ../src/globals.c:80 +msgid "Use large waypoint icons:" +msgstr "Erabili bide-puntu ikono handiak:" + +#: ../src/globals.c:81 +msgid "Default latitude:" +msgstr "Lehenetsitako latitudea:" + +#: ../src/globals.c:82 +msgid "Default longitude:" +msgstr "Lehenetsitako longitudea:" + +#: ../src/globals.c:83 +msgid "Time Display:" +msgstr "Bistaratu denbora:" + +#: ../src/globals.c:84 +msgid "" +"Display times according to the reference frame. Locale is the user's system " +"setting. World is relative to the location of the object." +msgstr "" +"Bistaratu denborak erreferentziako fotogramaren arabera. Tokikoa da " +"erabiltzailearen sistemaren ezarpenena. Mundukoa da objektuaren " +"kokapenarenari dagokiona." + +#: ../src/globals.c:90 +msgid "Alphabetical" +msgstr "Alfabetikoa" + +#: ../src/globals.c:90 ../src/datasource_osm_my_traces.c:432 +msgid "Time" +msgstr "Denbora" + +#: ../src/globals.c:90 +msgid "Creation" +msgstr "Sorrera" + +#: ../src/globals.c:91 +msgid "Title Case" +msgstr "Izenburuaren maiuskula/minuskula" + +#: ../src/globals.c:91 +msgid "Lowercase" +msgstr "Minuskulaz" + +#: ../src/globals.c:94 +msgid "KML File Export Units:" +msgstr "KML fitxategien esportazio unitateak:" + +#: ../src/globals.c:95 +msgid "GPX Track Order:" +msgstr "GPXaren arrastoaren agindua:" + +#: ../src/globals.c:96 +msgid "GPX Waypoint Symbols:" +msgstr "GPX arrastoaren ikurrak:" + +#: ../src/globals.c:97 +msgid "" +"Save GPX Waypoint Symbol names in the specified case. May be useful for " +"compatibility with various devices" +msgstr "" +"Gorde GPX arrastoaren ikurren izenak dagokien tokian. Erabilgarria izan " +"daiteke gailuen bateragarritasunerako." + +#: ../src/globals.c:98 +#, fuzzy +msgid "GPX Creator:" +msgstr "Sorrera" + +#: ../src/globals.c:99 +msgid "" +"The creator value when writing a GPX file. Otherwise when blank a default is " +"used." +msgstr "" + +#: ../src/globals.c:104 +msgid "Image Viewer:" +msgstr "Irudi-ikustailea:" + +#: ../src/globals.c:109 +msgid "External GPX Program 1:" +msgstr "GPX kanpoko programa 1:" + +#: ../src/globals.c:110 +msgid "External GPX Program 2:" +msgstr "GPX kanpoko programa 2:" + +#: ../src/globals.c:113 +msgid "Absolute" +msgstr "Absolutua" + +#: ../src/globals.c:113 +msgid "Relative" +msgstr "Erlatiboa" + +#: ../src/globals.c:117 +msgid "Save File Reference Mode:" +msgstr "Gorde fitxategien erreferentzia modua:" + +#: ../src/globals.c:118 +msgid "" +"When saving a Viking .vik file, this determines how the directory paths of " +"filenames are written." +msgstr "" +"Viking .vik fitxategi bat gordetzean, honek zehazten du fitxategi-izenen " +"direktorio-bidea nola idatzi." + +#: ../src/globals.c:119 +msgid "Ask for Name before Track Creation:" +msgstr "Eskatu izena arrastoa sortu aurretik:" + +#: ../src/globals.c:120 +msgid "Show Tooltip during Track Creation:" +msgstr "Erakutsi argibideak arrastoa sortzean" + +#: ../src/globals.c:121 +msgid "The number of recent files:" +msgstr "Azken fitxategien kopurua:" + +#: ../src/globals.c:122 +msgid "" +"Only applies to new windows or on application restart. -1 means all " +"available files." +msgstr "" +"Bakarrik aplikatzen da leiho berrietan edo aplikazioa berrabiaraztean. -1 " +"datuak erabilgarri diren fitxategi guztiak adierazten du." + +#: ../src/globals.c:123 +#, fuzzy +msgid "Open files in selected layer:" +msgstr "Ezabatu hautatutako geruza" + +#: ../src/globals.c:124 +msgid "Open files (but not .vik ones) into the selected TrackWaypoint layer." +msgstr "" + +#: ../src/globals.c:125 +msgid "Show calendar day names:" +msgstr "" + +#: ../src/globals.c:128 +msgid "Home Location" +msgstr "Etxeko kokapena" + +#: ../src/globals.c:128 +msgid "Last Location" +msgstr "Azken kokapena" + +#: ../src/globals.c:128 +msgid "Specified File" +msgstr "Fitxategi zehatza" + +#: ../src/globals.c:128 +msgid "Auto Location" +msgstr "Kokapen automatikoa" + +#: ../src/globals.c:131 +msgid "Restore Window Setup:" +msgstr "Berreskuratu leihoaren ezarpenak" + +#: ../src/globals.c:132 +msgid "Restore window size and layout" +msgstr "Berreskuratu leihoaren tamaina eta diseinua" + +#: ../src/globals.c:133 +msgid "Add a Default Map Layer:" +msgstr "Gehitu mapa-geruza lehenetsia" + +#: ../src/globals.c:134 +msgid "" +"The default map layer added is defined by the Layer Defaults. Use the menu " +"Edit->Layer Defaults->Map... to change the map type and other values." +msgstr "" +"Gehitutako mapa-geruza lehenetsia lehenetsitako geruzetan definitua dago. " +"Mapa mota eta bestelako balioak aldatzeko egin: Editatu-> Geruza lehenetsiak " +"> Mapa" + +#: ../src/globals.c:135 +msgid "Startup Method:" +msgstr "Abio-metodoa" + +#: ../src/globals.c:136 +msgid "Startup File:" +msgstr "Abioko fitxategia" + +#: ../src/globals.c:137 +msgid "" +"The default file to load on startup. Only applies when the startup method is " +"set to 'Specified File'" +msgstr "" +"Abiatzean ireki behar den fitxategi lehenetsia. Bakarrik aplikatzen da " +"abioko metodoan \"fitxategi zehatza\" ezarrita dagoenean." + +#: ../src/globals.c:138 +msgid "Check For New Version:" +msgstr "Begiratu bertsio berria ote dagoen." + +#: ../src/globals.c:139 +msgid "Periodically check to see if a new version of Viking is available" +msgstr "Begiratu periodikoki ea Viking-en bertsio berririk ote dagoen." + +#. Defaults for the options are setup here +#: ../src/globals.c:176 +msgid "General" +msgstr "Orokorra" + +#. New Tab +#: ../src/globals.c:204 +msgid "Startup" +msgstr "Abioa" + +#. New Tab +#: ../src/globals.c:222 +msgid "Export/External" +msgstr "Esportatu/Kanpokoa" + +#. 'Advanced' Properties +#: ../src/globals.c:249 +msgid "Advanced" +msgstr "Aurreratua" + +#. Webtools +#: ../src/google.c:39 +msgid "Google" +msgstr "Google" + +#. If there is an actual description field it will overwrite this value +#: ../src/gpx.c:264 +#, c-format +msgid "Created by: %s" +msgstr "" + +#: ../src/datasource_bfilter.c:43 +msgid "Max number of points:" +msgstr "Gehienezko puntu-kopurua" + +#: ../src/datasource_bfilter.c:84 +msgid "Simplify All Tracks..." +msgstr "Sinplifikatu arrasto guztiak..." + +#: ../src/datasource_bfilter.c:85 +msgid "Simplified Tracks" +msgstr "Sinplifikatutako arrastoak" + +#. { VIK_LAYER_NUM_TYPES, "compressmethod", VIK_LAYER_PARAM_UINT, VIK_LAYER_GROUP_NONE, N_("Simplify Method:"), VIK_LAYER_WIDGET_COMBOBOX, compress_method, NULL, NULL, NULL, NULL, NULL }, +#: ../src/datasource_bfilter.c:111 +msgid "Error Factor:" +msgstr "Errorearen faktorea:" + +#: ../src/datasource_bfilter.c:112 +msgid "" +"Specifies the maximum allowable error that may be introduced by removing a " +"single point by the crosstrack method. See the manual or GPSBabel Simplify " +"Filter documentation for more detail." +msgstr "" +"Crosstrack metodoaren bidez puntu bakarra ezabatuz sar daitekeen gehienezko " +"errorea zehazten du. Argibide gehiagorako begiratu PPSBabel Simplifiy " +"Filterren dokumentazioa." + +#: ../src/datasource_bfilter.c:166 +msgid "Compress Tracks..." +msgstr "Konprimitu arrastoak..." + +#: ../src/datasource_bfilter.c:167 +msgid "Compressed Tracks" +msgstr "Konprimitutako arrastoak" + +#: ../src/datasource_bfilter.c:197 ../src/datasource_bfilter.c:198 +msgid "Remove Duplicate Waypoints" +msgstr "Ezabatu bikoiztutak bide-puntuak" + +#: ../src/datasource_bfilter.c:221 +msgid "Manual filter:" +msgstr "Eskuzko iragazkia:" + +#: ../src/datasource_bfilter.c:222 +msgid "Manual filter command: e.g. 'swap'." +msgstr "Eskuzko iragazkiaren komandoa: ad. 'swap'" + +#: ../src/datasource_bfilter.c:233 ../src/datasource_bfilter.c:234 +msgid "Manual filter" +msgstr "Eskuzko iragazkia" + +#: ../src/datasource_bfilter.c:262 +msgid "Waypoints Inside This" +msgstr "Bide-puntuak honen barnean" + +#: ../src/datasource_bfilter.c:263 ../src/datasource_bfilter.c:292 +msgid "Polygonized Layer" +msgstr "Poligono-geruza" + +#: ../src/datasource_bfilter.c:291 +msgid "Waypoints Outside This" +msgstr "Bide-puntuak honen kanpoan" + +#: ../src/datasource_file.c:61 +msgid "Import file with GPSBabel" +msgstr "Inportatu irudia GPSBabel-en bidez" + +#: ../src/datasource_file.c:62 +msgid "Imported file" +msgstr "Inportatutako fitxategia" + +#. The file selector +#: ../src/datasource_file.c:129 +msgid "File:" +msgstr "Fitxategia:" + +#: ../src/datasource_file.c:130 +msgid "File to import" +msgstr "Inportatzeko fitxategia" + +#: ../src/datasource_file.c:137 +msgid "All files" +msgstr "Fitxategi guztiak" + +#. The file format selector +#: ../src/datasource_file.c:144 ../src/datasource_url.c:106 +msgid "File type:" +msgstr "Fitxategi mota:" + +#: ../src/datasource_file.c:189 +#, c-format +msgid "using babel args '%s' and file '%s'" +msgstr "Erabiltzen Babel argumentuak '%s' eta fitxategia '%s'" + +#: ../src/datasource_gc.c:67 +msgid "Download Geocaches" +msgstr "Deskargatu Geocache-ak" + +#: ../src/datasource_gc.c:68 +msgid "Geocaching.com Caches" +msgstr "Geocaching.com Cache-ak" + +#: ../src/datasource_gc.c:86 +msgid "geocaching.com username:" +msgstr "geocaching.com erabiltzaile-izena:" + +#: ../src/datasource_gc.c:87 +msgid "geocaching.com password:" +msgstr "geocaching.com pasahitza:" + +#: ../src/datasource_gc.c:92 ../src/vikwindow.c:3502 +msgid "Geocaching" +msgstr "Geocaching" + +#: ../src/datasource_gc.c:128 +#, c-format +msgid "" +"Can't find %s or %s in path! Check that you have installed it correctly." +msgstr "Ezin da aurkitu %s edo %s kokalekuan! Egiaztatu ongi instalatu duzula." + +#: ../src/datasource_gc.c:190 +msgid "Number geocaches:" +msgstr "geocahes-zenbakia:" + +#: ../src/datasource_gc.c:192 +msgid "Centered around:" +msgstr "Zentratuta inguruan:" + +#: ../src/datasource_gc.c:231 +msgid "Broken input - using some defaults" +msgstr "Hautsitako sarrera - lehenetsitako batzuk erabiltzen" + +#: ../src/datasource_geotag.c:51 +msgid "Create Waypoints from Geotagged Images" +msgstr "Sortu bide-puntuak geo-etiketatutako irudietatik" + +#: ../src/datasource_geotag.c:52 +msgid "Geotagged Images" +msgstr "Geo-etiketatutako irudiak" + +#: ../src/datasource_geotag.c:102 ../src/datasource_geojson.c:93 +#: ../src/vikfileentry.c:171 ../src/vikwindow.c:3533 ../src/vikwindow.c:3610 +#: ../src/vikwindow.c:3641 ../src/vikwindow.c:4356 ../src/vikwindow.c:4649 +msgid "All" +msgstr "Guztiak" + +#: ../src/datasource_geotag.c:107 ../src/vikfileentry.c:115 +#: ../src/viktrwlayer_geotag.c:637 ../src/vikwindow.c:3518 +#: ../src/vikwindow.c:4377 +msgid "JPG" +msgstr "JPG" + +#: ../src/datasource_geotag.c:168 +#, c-format +msgid "Unable to create waypoint from %s" +msgstr "Ezin da bide-punturik sortu %s-tik" + +#: ../src/datasource_geojson.c:46 +msgid "Acquire from GeoJSON" +msgstr "Eskuratu GeoJSON-tik" + +#: ../src/datasource_geojson.c:47 ../src/datasource_geojson.c:98 +msgid "GeoJSON" +msgstr "GeoJSON" + +#: ../src/datasource_geojson.c:152 +#, c-format +msgid "Unable to import from: %s" +msgstr "Ezin da hemendik inportatu: %s" + +#: ../src/datasource_gps.c:54 +msgid "Acquire from GPS" +msgstr "Eskuratu GPStik" + +#: ../src/datasource_gps.c:55 +msgid "Acquired from GPS" +msgstr "GPStik eskuratua" + +#: ../src/datasource_gps.c:258 +#, c-format +msgid "using cmd '%s' and file '%s'\n" +msgstr "cmd '%s' eta '%s' fitxategia erabitzen\n" + +#: ../src/datasource_gps.c:353 ../src/vikgpslayer.c:966 +#, c-format +msgid "Downloading %d waypoint..." +msgid_plural "Downloading %d waypoints..." +msgstr[0] "Deskargatzen %d bide-puntua..." +msgstr[1] "Deskargatzen %d bide-puntuak..." + +#: ../src/datasource_gps.c:358 ../src/vikgpslayer.c:971 +#, c-format +msgid "Downloading %d trackpoint..." +msgid_plural "Downloading %d trackpoints..." +msgstr[0] "Deskargatzen %d arrasto-puntua..." +msgstr[1] "Deskargatzen %d arrasto-puntuak..." + +#: ../src/datasource_gps.c:363 ../src/vikgpslayer.c:976 +#, c-format +msgid "Downloading %d routepoint..." +msgid_plural "Downloading %d routepoints..." +msgstr[0] "Deskargatzen %d ibilbide-puntua..." +msgstr[1] "Deskargatzen %d ibilbide-puntuak..." + +#: ../src/datasource_gps.c:386 ../src/datasource_gps.c:393 +#: ../src/datasource_gps.c:400 +#, c-format +msgid "Downloaded %d out of %d %s..." +msgstr "%d horietatik %d %s deskargaturik..." + +#: ../src/datasource_gps.c:388 ../src/datasource_gps.c:395 +#: ../src/datasource_gps.c:402 +#, c-format +msgid "Downloaded %d %s." +msgstr "Deskargatuak %d %s." + +#: ../src/datasource_gps.c:416 ../src/vikgpslayer.c:1134 +#, c-format +msgid "GPS Device: %s" +msgstr "GPS gailua: %s" + +#: ../src/datasource_gps.c:428 ../src/vikgpslayer.c:1214 +msgid "Status: Working..." +msgstr "Orain: lanean..." + +#. NB gps_layer_inst_init() is performed after parameter registeration +#. thus to give the protocols some potential values use the old static list +#. TODO: find another way to use gps_layer_inst_init()? +#: ../src/datasource_gps.c:584 ../src/vikgpslayer.c:216 +msgid "GPS Protocol:" +msgstr "GPS protokoloa:" + +#. List reassigned at runtime +#: ../src/datasource_gps.c:609 ../src/vikgpslayer.c:217 +msgid "Serial Port:" +msgstr "Serie-ataka:" + +#: ../src/datasource_gps.c:659 +msgid "" +"Turn Off After Transfer\n" +"(Garmin/NAViLink Only)" +msgstr "" +"Itzali transferitu eta gero\n" +"(bakarrik Garmin/NAVlink)" + +#: ../src/datasource_gps.c:666 +msgid "Tracks:" +msgstr "Arrastoak:" + +#: ../src/datasource_gps.c:673 +msgid "Routes:" +msgstr "Ibilbideak:" + +#: ../src/datasource_gps.c:680 +msgid "Waypoints:" +msgstr "Bide-puntuak:" + +#: ../src/datasource_gps.c:756 ../src/vikgpslayer.c:1509 +msgid "GPS device: N/A" +msgstr "GPS gailua: ez dago eskuragarri" + +#: ../src/datasource_osm.c:53 ../src/datasource_osm.c:54 +msgid "OSM traces" +msgstr "OSM arrastoak" + +#: ../src/datasource_osm.c:89 +msgid "Page number:" +msgstr "Orrialde-zenbakia:" + +#: ../src/datasource_osm_my_traces.c:59 ../src/datasource_osm_my_traces.c:60 +msgid "OSM My Traces" +msgstr "OSM My Traces (OpenStreetMap-eko Nire Arrastoak)" + +#: ../src/datasource_osm_my_traces.c:106 ../src/osm-traces.c:684 +#, fuzzy +msgid "Email/username:" +msgstr "Erabiltzailea:" + +#: ../src/datasource_osm_my_traces.c:111 +msgid "The email or username used to login to OSM" +msgstr "OSM-en sartzeko erabiltzen duzun posta-helbidea edo erabiltzaile-izena" + +#: ../src/datasource_osm_my_traces.c:113 ../src/osm-traces.c:692 +msgid "Password:" +msgstr "Pasahitza:" + +#: ../src/datasource_osm_my_traces.c:116 +msgid "The password used to login to OSM" +msgstr "OSM-en sartzeko erabilitako pasahitza" + +#: ../src/datasource_osm_my_traces.c:427 ../src/viktrwlayer.c:689 +msgid "Description" +msgstr "Deskribapena" + +#: ../src/datasource_osm_my_traces.c:442 +msgid "Privacy" +msgstr "Pribatutasuna" + +#: ../src/datasource_osm_my_traces.c:449 +msgid "Within Current View" +msgstr "Uneko ikuspegi barruan" + +#: ../src/datasource_osm_my_traces.c:516 +msgid "GPS Traces" +msgstr "GPS-arrastoak" + +#: ../src/datasource_osm_my_traces.c:518 +msgid "None found!" +msgstr "Ez da ezer aurkitu!" + +#: ../src/datasource_osm_my_traces.c:569 +msgid "Ensure the OSM access token preferences are setup." +msgstr "" + +#: ../src/datasource_osm_my_traces.c:645 +msgid "My OSM Traces" +msgstr "My OSM Traces (Nire OSM arrastoak)" + +#. Report errors to the status bar +#: ../src/datasource_osm_my_traces.c:667 +#, c-format +msgid "Unable to get trace: %s" +msgstr "Ezin izan da arrastoa lortu: %s" + +#: ../src/datasource_routing.c:56 ../src/datasource_routing.c:57 +msgid "Directions" +msgstr "Norabideak" + +#: ../src/datasource_routing.c:90 +msgid "No routing engines with directions available" +msgstr "" + +#. Engine selector +#: ../src/datasource_routing.c:99 +msgid "Engine:" +msgstr "Motorea:" + +#. From and To entries +#: ../src/datasource_routing.c:104 +msgid "From:" +msgstr "Nondik:" + +#: ../src/datasource_routing.c:105 +msgid "To:" +msgstr "Nora:" + +#: ../src/datasource_url.c:48 +msgid "Acquire from URL" +msgstr "Eskuratu URL bidez" + +#: ../src/datasource_url.c:49 +msgid "URL" +msgstr "URLa" + +#: ../src/datasource_url.c:101 +msgid "URL:" +msgstr "URLa:" + +#. Only GPX (not using GPSbabel) +#: ../src/datasource_url.c:133 ../src/vikfileentry.c:161 +#: ../src/vikwindow.c:3513 ../src/vikwindow.c:3603 +msgid "GPX" +msgstr "GPX" + +#: ../src/datasource_wikipedia.c:32 +msgid "Create Waypoints from Wikipedia Articles" +msgstr "Sortu bide-puntuak Wikipedia artikuluetatik" + +#: ../src/datasource_wikipedia.c:33 +msgid "Wikipedia Waypoints" +msgstr "Wikipediako bide-puntuak" + +#: ../src/dem.c:66 ../src/dem.c:80 +msgid "Invalid DEM" +msgstr "Ez da onartzeko moduko DEM (Digital Elevation Model)" + +#: ../src/dem.c:122 +msgid "Invalid DEM header" +msgstr "Ez da onartzeko moduko DEM burua (Digital Elevation Model)" + +#: ../src/dem.c:191 ../src/dem.c:204 +msgid "Incorrect DEM Class B record: expected 1" +msgstr "DEM Class B erregistro okerra: itxaroten 1" + +#: ../src/dem.c:289 ../src/download.c:176 +#, c-format +msgid "Couldn't map file %s: %s" +msgstr "Ezin da aurkitu mapa-fitxategia %s: %s" + +#: ../src/download.c:130 +msgid "Tile age (days):" +msgstr "Lauzen adina (egunak):" + +#: ../src/download.c:406 +#, c-format +msgid "Download error: %s" +msgstr "Deskarga-errorea: %s" + +#: ../src/download.c:490 +msgid "couldn't open temp file" +msgstr "Ezin da aldi baterako fitxategia ireki" + +#: ../src/file.c:458 ../src/file.c:463 +#, c-format +msgid "Draw mode '%s' no more supported" +msgstr "Marrazketa modua '%s' ez da gehiago onartzen" + +#: ../src/geotag_exif.c:621 +msgid "Not enough memory." +msgstr "Memoria nahikorik ez." + +#: ../src/geotag_exif.c:639 +msgid "Setting a value for this tag is unsupported!" +msgstr "Etiketa honetarako balio bat ezartzeko zerbitzurik ez dago!" + +#: ../src/geotag_exif.c:658 +#, c-format +msgid "Too few components specified (need %d, found %d)\n" +msgstr "Osagai gutxiegi zehaztu dira (%d behar ziren, %d topatu dira)\n" + +#: ../src/geotag_exif.c:662 +msgid "Numeric value expected\n" +msgstr "Balio numerikoa espero zen\n" + +#: ../src/geotag_exif.c:670 +msgid "This shouldn't happen!" +msgstr "Hau ez luke gertatu behar!" + +#: ../src/geotag_exif.c:740 +msgid "Not yet implemented!" +msgstr "Oraindik ez dago egikaritua!" + +#: ../src/geotag_exif.c:753 +msgid "Warning; Too many components specified!" +msgstr "Kontuz; osagai gehiegi zehaztuta!" + +#: ../src/osm-traces.c:87 +msgid "Identifiable (public w/ timestamps)" +msgstr "Identifikagarria (publikoa, data-zigilu eta guzti)" + +#: ../src/osm-traces.c:88 +msgid "Trackable (private w/ timestamps)" +msgstr "Arrastogarria (pribatua, data-zigilu eta guzti)" + +#: ../src/osm-traces.c:89 +msgid "Public" +msgstr "Publikoa" + +#: ../src/osm-traces.c:90 +msgid "Private" +msgstr "Pribatua" + +#: ../src/osm-traces.c:108 +msgid "Access Token:" +msgstr "" + +#: ../src/osm-traces.c:108 +msgid "Get New OSM Access Tokens" +msgstr "" + +#: ../src/osm-traces.c:109 +msgid "Access Token Key:" +msgstr "" + +#: ../src/osm-traces.c:110 +msgid "Access Token Secret:" +msgstr "" + +#: ../src/osm-traces.c:111 +msgid "OSM username:" +msgstr "OSM erabiltzaile-izena:" + +#: ../src/osm-traces.c:112 +msgid "OSM password:" +msgstr "OSM pasahitza:" + +#. Check to really override existing values... +#: ../src/osm-traces.c:263 +msgid "Do you want to overwrite existing values?" +msgstr "" + +#: ../src/osm-traces.c:275 +msgid "Not able to generate OSM request tokens." +msgstr "" + +#: ../src/osm-traces.c:299 +msgid "" +"Waiting for authorization approval.\n" +"Ensure you have granted access at the website before continuing here." +msgstr "" + +#: ../src/osm-traces.c:315 +#, fuzzy +msgid "No Authorization." +msgstr "Kokapen automatikoa" + +#: ../src/osm-traces.c:354 +msgid "" +"OSM Username and Password preferences are not required anymore. You can now " +"remove them." +msgstr "" + +#. Preferences +#: ../src/osm-traces.c:379 +msgid "OpenStreetMap Traces" +msgstr "OpenStreetMap arrastoak" + +#: ../src/osm-traces.c:504 +#, c-format +msgid "failed to upload data: HTTP response is %ld" +msgstr "Errorea datuak kargatzean: HTTP erantzuna %ld da" + +#: ../src/osm-traces.c:509 +#, c-format +msgid "curl_easy_getinfo failed: %d" +msgstr "curl_easy_getinfo errorea: %d" + +#: ../src/osm-traces.c:514 +#, c-format +msgid "curl request failed: %s" +msgstr "curl eskaera-errorea: %s" + +#. Success +#: ../src/osm-traces.c:592 +msgid "Uploaded to OSM" +msgstr "OSMera kargatuta" + +#: ../src/osm-traces.c:596 +msgid "" +"FAILED TO UPLOAD DATA TO OSM - Ensure the OSM access token preferences are " +"setup." +msgstr "" + +#: ../src/osm-traces.c:599 +msgid "FAILED TO UPLOAD DATA TO OSM - CURL PROBLEM" +msgstr "Errorea OSMera datuak kargatzean- curl errorea" + +#: ../src/osm-traces.c:602 +msgid "FAILED TO UPLOAD DATA TO OSM" +msgstr "Errorea OSMera datuak kargatzean" + +#: ../src/osm-traces.c:602 +msgid "HTTP response code" +msgstr "HTTP erantzun-kodea" + +#: ../src/osm-traces.c:610 +#, c-format +msgid "failed to unlink temporary file: %s" +msgstr "Errorea aldi baterako fitxategia desesteketzen: %s" + +#: ../src/osm-traces.c:664 +msgid "OSM upload" +msgstr "OSM karga" + +#: ../src/osm-traces.c:689 +#, fuzzy +msgid "" +"The email/username used as login\n" +"Enter the email/username you use to login into www.openstreetmap.org." +"" +msgstr "" +"Sartzeko idatzi helbide elektonikoa\n" +"Idatzi www.openstreetmap.org orrian sartzeko erabiltzen duzun helbide " +"elektronikoa." + +#: ../src/osm-traces.c:697 +msgid "" +"The password used to login\n" +"Enter the password you use to login into www.openstreetmap.org." +msgstr "" +"Sartzeko idatzi pasahitza\n" +"Idatzi www.openstreetmap.org orrian sartzeko erabiltzen duzun " +"pasahitza." + +#: ../src/osm-traces.c:703 +msgid "File's name:" +msgstr "Fitxategiaren izena:" + +#: ../src/osm-traces.c:713 +msgid "" +"The name of the file on OSM\n" +"This is the name of the file created on the server.This is not the " +"name of the local file." +msgstr "" +"OSMko fitxategiaren izena\n" +"Hau da zerbitzarian sortutako fitxategiaren izena. Hau ez da errore " +"lokalaren izena." + +#: ../src/osm-traces.c:717 ../src/viktrwlayer_wpwin.c:197 +#: ../src/viktrwlayer_wpwin.c:199 +msgid "Description:" +msgstr "Deskripzioa:" + +#: ../src/osm-traces.c:731 +msgid "The description of the trace" +msgstr "Arrastoaren deskripzioa" + +#: ../src/osm-traces.c:734 +msgid "Anonymize Times:" +msgstr "Garbitu denborak:" + +#: ../src/osm-traces.c:739 +msgid "" +"Anonymize times of the trace.\n" +"You may choose to make the trace identifiable, yet mask the actual " +"real time values" +msgstr "" +"Ezkutatu arrastoaren denborak\n" +"Aukera honen bidez arrastoa identifikagarria izango da nahiz eta " +"denbora errealeko datuak ezkutatu" + +#: ../src/osm-traces.c:743 +msgid "Tags:" +msgstr "Etiketak:" + +#: ../src/osm-traces.c:751 +msgid "The tags associated to the trace" +msgstr "Arrastoari asoziatutako etiketak" + +#: ../src/osm-traces.c:816 +#, c-format +msgid "Uploading %s to OSM" +msgstr "%s OSMera kargatzen" + +#: ../src/mapcache.c:67 +msgid "Map cache memory size (MB):" +msgstr "Maparen cache-memoriaren tamaina (MB)" + +#. NB Can have a couple hundred fonts loaded when using system directories +#. So ATM don't list them all - otherwise need better GUI feedback display. +#: ../src/mapnik_interface.cpp:324 +#, c-format +msgid "" +"%s %s\n" +"Plugins=%sFonts loaded=%d" +msgstr "" +"%s %s\n" +"Pluginak=%sFonts loaded=%d" + +#: ../src/mapnik_interface.cpp:325 ../src/vikmapniklayer.c:278 +msgid "Mapnik" +msgstr "Mapnik" + +#: ../src/print.c:51 ../src/viktrwlayer.c:572 +msgid "None" +msgstr "Bat ere ez" + +#: ../src/print.c:52 +msgid "Horizontally" +msgstr "Horizontalki" + +#: ../src/print.c:53 +msgid "Vertically" +msgstr "Bertikalki" + +#: ../src/print.c:54 +msgid "Both" +msgstr "Biak" + +#: ../src/print.c:118 +msgid "Image Settings" +msgstr "Irudi-ezarpenak" + +#: ../src/print.c:551 +msgid "done" +msgstr "eginda" + +#. Page Size +#: ../src/print.c:580 +msgid "_Adjust Page Size and Orientation" +msgstr "_Doitu orriaren tamaina eta orientazioa" + +#: ../src/print.c:596 +msgid "C_enter:" +msgstr "_Zentratuta:" + +#. ignore page margins +#: ../src/print.c:614 +msgid "Ignore Page _Margins" +msgstr "Ez ikusi egin orrialdeko _marjinei" + +#: ../src/print.c:633 +msgid "Image S_ize:" +msgstr "Irudiaren tamaina" + +#: ../src/ui_util.c:88 +#, c-format +msgid "Could not launch web browser. %s" +msgstr "Ezin da web-nabigatzailea abiarazi. %s" + +#: ../src/ui_util.c:101 +#, c-format +msgid "Could not create new email. %s" +msgstr "Ezin da sortu posta-mezu berririk. %s" + +#: ../src/vikcoordlayer.c:57 +msgid "Color:" +msgstr "Kolorea:" + +#: ../src/vikcoordlayer.c:58 +msgid "Minutes Width:" +msgstr "Zabalera minututan:" + +#: ../src/vikcoordlayer.c:59 +msgid "Line Thickness:" +msgstr "Marraren lodiera" + +#: ../src/vikcoordlayer.c:66 +msgid "Coordinate" +msgstr "Koordenatua" + +#: ../src/main.c:92 +#, c-format +msgid "Ignoring Xlib error: error code %d request code %d\n" +msgstr "Ez ikusia egiten Xlib errorea: errore-kodea %d eskaera-kodea %d\n" + +#: ../src/main.c:111 +msgid "Enable debug output" +msgstr "Gaitu arazketaren irteera" + +#: ../src/main.c:112 +msgid "Enable verbose output" +msgstr "Gaitu irteera xehatua" + +#: ../src/main.c:113 +msgid "Show version" +msgstr "Erakutsi bertsioa" + +#: ../src/main.c:114 +msgid "Latitude in decimal degrees" +msgstr "Latitudea gradu dezimaletan" + +#: ../src/main.c:115 +msgid "Longitude in decimal degrees" +msgstr "Longitudea gradu dezimaletan" + +#: ../src/main.c:116 +msgid "Zoom Level (OSM). Value can be 0 - 22" +msgstr "Zoom maila (OSM). Balioa 0-22 bitartean" + +#: ../src/main.c:117 +msgid "Add a map layer by id value. Use 0 for the default map." +msgstr "" +"Gehitu mapa geruza id balioaren bidez. Erabili 0 lehenetsitako maparentzat." + +#: ../src/main.c:160 +#, c-format +msgid "" +"%s %s\n" +"Copyright (c) 2003-2008 Evan Battaglia\n" +"Copyright (c) 2008-%s Viking's contributors\n" +msgstr "" + +#: ../src/osm.c:50 +#, fuzzy +msgid "OpenStreetMap (Mapnik)" +msgstr "OpenStreetMap arrastoak" + +#: ../src/osm.c:65 +#, fuzzy +msgid "OpenStreetMap (Cycle)" +msgstr "OpenStreetMap arrastoak" + +#: ../src/osm.c:79 +#, fuzzy +msgid "OpenStreetMap (Transport)" +msgstr "OpenStreetMap arrastoak" + +#: ../src/osm.c:95 +#, fuzzy +msgid "OpenStreetMap (Humanitarian)" +msgstr "OpenStreetMap arrastoak" + +#: ../src/osm.c:111 +msgid "On Disk OSM Tile Format" +msgstr "On Disk OSM lauza formatua" + +#: ../src/osm.c:121 +msgid "MBTiles File" +msgstr "MBTiles fitxategia" + +#: ../src/osm.c:132 +msgid "OSM Metatiles" +msgstr "OSM meta lauzak" + +#: ../src/osm.c:146 +msgid "Mapbox Outdoors" +msgstr "" + +#: ../src/osm.c:153 +msgid "Mapbox Specific" +msgstr "" + +#: ../src/osm.c:170 +msgid "OSM (view)" +msgstr "OSM (ikusi)" + +#: ../src/osm.c:174 +msgid "OSM (edit)" +msgstr "OSM (editatu)" + +#. Note the use of positional parameters +#: ../src/osm.c:179 +msgid "OSM (query)" +msgstr "OSM (kontsula)" + +#: ../src/osm.c:183 +msgid "OSM (render)" +msgstr "OSM (errendatu)" + +#. Example: http://127.0.0.1:8111/load_and_zoom?left=8.19&right=8.20&top=48.605&bottom=48.590&select=node413602999 +#. JOSM or merkaartor must already be running with remote interface enabled +#: ../src/osm.c:190 +msgid "Local port 8111 (eg JOSM)" +msgstr "8111 ataka lokala (e.b. JOSM)" + +#: ../src/osm.c:195 +msgid "Geofabrik Map Compare" +msgstr "Geofabrik maparen konparazioa" + +#: ../src/osm.c:203 +msgid "OpenStreetMap Notes" +msgstr "OpenStreetMap-en oharrak" + +#. Not really OSM but can't be bothered to create somewhere else to put it... +#: ../src/osm.c:221 +msgid "Wikimedia Toolserver GeoHack" +msgstr "Wikimedia Toolserver GeoHack" + +#: ../src/preferences.c:195 +msgid "Preferences" +msgstr "Hobespenak" + +#: ../src/toolbar.c:91 ../src/toolbar.c:92 +msgid "System Default" +msgstr "Sistemak lehenetsia" + +#: ../src/toolbar.c:91 ../src/viktrwlayer.c:563 +msgid "Small" +msgstr "Txikia" + +#: ../src/toolbar.c:91 ../src/viktrwlayer.c:564 +msgid "Medium" +msgstr "Ertaina" + +#: ../src/toolbar.c:91 ../src/viktrwlayer.c:565 +msgid "Large" +msgstr "Handia" + +#: ../src/toolbar.c:92 +msgid "Icons Only" +msgstr "Ikonoak bakarrik" + +#: ../src/toolbar.c:92 +msgid "Text Only" +msgstr "Testua bakarrik" + +#: ../src/toolbar.c:92 +msgid "Icons and Text" +msgstr "Ikonoak eta testua" + +#: ../src/toolbar.c:106 +msgid "Append to Menu:" +msgstr "Gehitu menura:" + +#: ../src/toolbar.c:107 +msgid "Pack the toolbar to the main menu to save vertical space" +msgstr "Elkartu tresna-barra eta menu nagusia espazio bertikala irabazteko" + +#: ../src/toolbar.c:108 +msgid "Icon Size:" +msgstr "Ikonoen tamaina:" + +#: ../src/toolbar.c:110 +msgid "Icon Style:" +msgstr "Ikonoen estiloa:" + +#: ../src/toolbar.c:112 +msgid "Customize:" +msgstr "Pertsonalizatu:" + +#: ../src/toolbar.c:112 +msgid "Customize Buttons" +msgstr "Botoi pertsonalizatuak" + +#. Preferences +#: ../src/toolbar.c:145 +msgid "Toolbar" +msgstr "Tresna-barra" + +#: ../src/toolbar.c:312 +msgid "_Customize" +msgstr "_Pertsonalizatu" + +#: ../src/toolbar.c:641 +msgid "Separator" +msgstr "Bereizlea" + +#: ../src/toolbar.c:642 +msgid "--- Separator ---" +msgstr "--- Bereizlea ---" + +#: ../src/toolbar.c:1007 +msgid "Customize Toolbar" +msgstr "Pertsonalizatu tresna-barra" + +#: ../src/toolbar.c:1028 +msgid "" +"Select items to be displayed on the toolbar. Items can be reordered by drag " +"and drop." +msgstr "" +"Hautatu tresna-barran erakutsiko diren elementuak. Elementuak arrastatu eta " +"jareginez berrantola daitezke." + +#: ../src/toolbar.c:1044 +msgid "Available Items" +msgstr "Elementu erabilgarriak" + +#: ../src/toolbar.c:1065 +msgid "Displayed Items" +msgstr "Bistaratutako elementuak" + +#: ../src/viklayer_defaults.c:232 +#, c-format +msgid "Could not open file: %s" +msgstr "Ezin da fitxategia ireki: %s" + +#: ../src/viklayer_defaults.c:304 +msgid "Layer Defaults" +msgstr "Lehenetsitako geruzak" + +#: ../src/uibuilder.c:196 +msgid "Take care that this password will be stored clearly in a plain file." +msgstr "Kontuan izan pasahitza fitxategi arrunt batean gordeko dela." + +#: ../src/uibuilder.c:628 ../src/viktrwlayer_export.c:188 +#: ../src/viktrwlayer_export.c:304 ../src/vikwindow.c:3666 +#: ../src/vikwindow.c:4408 +#, c-format +msgid "The file \"%s\" exists, do you wish to overwrite it?" +msgstr "Lehendik badago \"%s\" izeneko fitxategia, gainidatzi nahi duzu?" + +#: ../src/vikaggregatelayer.c:41 +msgid "Aggregate" +msgstr "Agregatu" + +#: ../src/vikaggregatelayer.c:528 ../src/viktrwlayer.c:11700 +#, c-format +msgid "%s: Waypoint List" +msgstr "%s: bidepuntuen zerrenda" + +#: ../src/vikaggregatelayer.c:570 +msgid "Search by Date" +msgstr "Dataren araberako bilaketa" + +#: ../src/vikaggregatelayer.c:576 +msgid "No items found with the requested date." +msgstr "Eskatutako datan ez dago elementurik." + +#: ../src/vikaggregatelayer.c:615 ../src/viktrwlayer.c:11691 +#, c-format +msgid "%s: Track and Route List" +msgstr "%s: Arrasto eta ibilbideen zerrenda" + +#: ../src/vikaggregatelayer.c:681 ../src/viktrwlayer.c:8346 +#: ../src/viktrwlayer.c:8417 ../src/viktrwlayer.c:8494 +msgid "_Visibility" +msgstr "_Ikusgaitasuna" + +#: ../src/vikaggregatelayer.c:686 +msgid "_Show All" +msgstr "_Erakutsi denak" + +#: ../src/vikaggregatelayer.c:692 +msgid "_Hide All" +msgstr "_Ezkutatu denak" + +#: ../src/vikaggregatelayer.c:698 ../src/viktrwlayer.c:8363 +#: ../src/viktrwlayer.c:8434 ../src/viktrwlayer.c:8511 +msgid "_Toggle" +msgstr "_Txandakatu" + +#: ../src/vikaggregatelayer.c:705 ../src/viktrwlayer.c:8532 +msgid "_Sort" +msgstr "_Ordenatu" + +#: ../src/vikaggregatelayer.c:711 ../src/viktrwlayer.c:8538 +msgid "Name _Ascending" +msgstr "Alfabetikoki gora" + +#: ../src/vikaggregatelayer.c:717 ../src/viktrwlayer.c:8544 +msgid "Name _Descending" +msgstr "Alfabetikoki behera" + +#: ../src/vikaggregatelayer.c:723 ../src/viktrwlayer.c:575 +#: ../src/viktrwlayer.c:8550 +msgid "Date Ascending" +msgstr "Dataren arabera, gorantz" + +#: ../src/vikaggregatelayer.c:729 ../src/viktrwlayer.c:576 +#: ../src/viktrwlayer.c:8556 +msgid "Date Descending" +msgstr "Dataren arabera, beherantz" + +#: ../src/vikaggregatelayer.c:735 ../src/viktrwlayer.c:8445 +#: ../src/viktrwlayer.c:8523 ../src/viktrwlayer.c:8595 +#: ../src/viktrwlayer_tracklist.c:296 +msgid "_Statistics" +msgstr "_Estatistikak" + +#: ../src/vikaggregatelayer.c:740 ../src/viktrwlayer.c:4533 +msgid "Track _List..." +msgstr "Arrastoen zerrenda" + +#: ../src/vikaggregatelayer.c:746 ../src/viktrwlayer.c:4540 +msgid "_Waypoint List..." +msgstr "_Bidepuntuen zerrenda_" + +#: ../src/vikaggregatelayer.c:753 +msgid "Searc_h" +msgstr "Bilaketa" + +#: ../src/vikaggregatelayer.c:759 +msgid "By _Date..." +msgstr "_Dataren arabera..." + +#: ../src/vikaggregatelayer.c:762 +msgid "Find the first item with a specified date" +msgstr "Bilatu zehaztutako data duen lehenengo elementua" + +#: ../src/vikaggregatelayer.c:765 +msgid "Load E_xternal Layers" +msgstr "" + +#. Could have a more complicated tooltip that numbers each type of layers, +#. but for now a simple overall count +#: ../src/vikaggregatelayer.c:1011 +#, c-format +msgid "One layer" +msgid_plural "%d layers" +msgstr[0] "Geruza bat" +msgstr[1] "geruza" + +#: ../src/vikaggregatelayer.c:1014 +#, fuzzy, c-format +msgid "Empty" +msgstr "Dena hutsa" + +#: ../src/vikdemlayer.c:86 +msgid "SRTM Global 90m (3 arcsec)" +msgstr "" + +#: ../src/vikdemlayer.c:94 +msgid "Absolute height" +msgstr "Altuera absolutua" + +#: ../src/vikdemlayer.c:95 +msgid "Height gradient" +msgstr "Altuera-gradientea" + +#: ../src/vikdemlayer.c:120 +msgid "DEM Files:" +msgstr "DEM fitxategiak:" + +#: ../src/vikdemlayer.c:121 +msgid "Download Source:" +msgstr "Deskargatu iturria:" + +#: ../src/vikdemlayer.c:122 +msgid "Min Elev Color:" +msgstr "Altuera txikienaren kolorea" + +#: ../src/vikdemlayer.c:123 ../src/viktrwlayer_wpwin.c:207 +msgid "Type:" +msgstr "Mota:" + +#: ../src/vikdemlayer.c:124 +msgid "Min Elev:" +msgstr "Altuera txikiena" + +#: ../src/vikdemlayer.c:125 +msgid "Max Elev:" +msgstr "Alturera handiena" + +#: ../src/vikdemlayer.c:137 +msgid "_DEM Download" +msgstr "_DEM deskarga" + +#: ../src/vikdemlayer.c:137 +msgid "DEM Download" +msgstr "DEM deskarga" + +#: ../src/vikdemlayer.c:192 +msgid "DEM" +msgstr "DEM" + +#: ../src/vikdemlayer.c:304 +#, c-format +msgid "Number of files: %d" +msgstr "Fitxategi-kopura: %d" + +#: ../src/vikdemlayer.c:446 +msgid "DEM Loading" +msgstr "DEM kargatzen" + +#: ../src/vikdemlayer.c:927 +#, c-format +msgid "No SRTM data available for %f, %f" +msgstr "SRTM data ez baliozkoa hemen %f, %f" + +#: ../src/vikdemlayer.c:948 +#, c-format +msgid "DEM download failure for %f, %f" +msgstr "DEM deskargaren errorea %f-n, %f" + +#: ../src/vikdemlayer.c:954 +#, c-format +msgid "DEM write failure for %s" +msgstr "DEM idazketaren errorea %s-n" + +#. Probably not over any land... +#: ../src/vikdemlayer.c:1201 +msgid "No DEM File Available" +msgstr "Ez dago DEM fitxategirik eskuragarri" + +#: ../src/vikdemlayer.c:1220 +#, c-format +msgid "" +"\n" +"Source: %s\n" +"\n" +"DEM File: %s\n" +"DEM File Timestamp: %s" +msgstr "" +"\n" +"Iturria: %s\n" +"\n" +"DEM fitxategia: %s\n" +"DEM fitxategiaren denbora-marka: %s" + +#: ../src/vikdemlayer.c:1224 +#, c-format +msgid "" +"Source: %s\n" +"\n" +"No DEM File!" +msgstr "" +"Iturria: %s\n" +"\n" +"Ez dago DEM fitxategirik." + +#: ../src/vikdemlayer.c:1264 +#, c-format +msgid "Downloading DEM %s" +msgstr "DEM deskargatzen %s" + +#: ../src/vikdemlayer.c:1289 +msgid "_Show DEM File Information" +msgstr "_Erakutsi DEM fitxategiaren informazioa" + +#: ../src/vikfileentry.c:72 +msgid "Browse..." +msgstr "Arakatu..." + +#: ../src/vikfileentry.c:103 +msgid "Choose file" +msgstr "Aukeratu fitxategia" + +#: ../src/vikfileentry.c:120 ../src/vikwindow.c:4372 +msgid "PNG" +msgstr "PNG" + +#: ../src/vikfileentry.c:125 +msgid "TIFF" +msgstr "TIFF" + +#: ../src/vikfileentry.c:133 +msgid "MBTiles" +msgstr "MBTiles" + +#: ../src/vikfileentry.c:142 +msgid "XML" +msgstr "XML" + +#: ../src/vikfileentry.c:149 +msgid "MML" +msgstr "MML" + +#: ../src/vikfileentry.c:154 +msgid "MSS" +msgstr "MSS" + +#: ../src/vikfilelist.c:49 +msgid "Choose file(s)" +msgstr "Aukeratu fitxategia(k)" + +#: ../src/vikfilelist.c:182 +msgid "Add..." +msgstr "Gehitu..." + +#: ../src/vikfilelist.c:183 +msgid "Delete" +msgstr "Ezabatu" + +#: ../src/vikgeoreflayer.c:97 +msgid "_Georef Move Map" +msgstr "_Georef Move Map" + +#: ../src/vikgeoreflayer.c:97 +msgid "Georef Move Map" +msgstr "Georef Move Map" + +#: ../src/vikgeoreflayer.c:106 +msgid "Georef Z_oom Tool" +msgstr "Georef zoom-tresna" + +#: ../src/vikgeoreflayer.c:106 +msgid "Georef Zoom Tool" +msgstr "Georef zoom-tresna" + +#: ../src/vikgeoreflayer.c:117 +msgid "GeoRef Map" +msgstr "GeoRef Map" + +#: ../src/vikgeoreflayer.c:214 +msgid "Auto Read World Files:" +msgstr "Irakurri automatikoki munduko mapak:" + +#: ../src/vikgeoreflayer.c:215 +msgid "" +"Automatically attempt to read associated world file of a new image for a " +"GeoRef layer" +msgstr "" +"Saiatu automatikoki irakurtzen irudi berriari asoziatutako mundu-mapa " +"fitxategia GeoRef geruzan" + +#: ../src/vikgeoreflayer.c:511 ../src/vikgeoreflayer.c:797 +#: ../src/vikmapslayer.c:1174 +#, c-format +msgid "Couldn't open image file: %s" +msgstr "Ezin da irudi-fitxategia ireki: %s" + +#: ../src/vikgeoreflayer.c:607 ../src/vikgeoreflayer.c:633 +msgid "Choose World file" +msgstr "Aukeratu Mundua fitxategia" + +#: ../src/vikgeoreflayer.c:619 +msgid "The World file you requested could not be opened for reading." +msgstr "Aukeratu duzun Mundua fitxategia ezin da ireki irakurtzeko." + +#: ../src/vikgeoreflayer.c:621 +msgid "Unexpected end of file reading World file." +msgstr "Mundua fitxategia irakurtzean ustegabeko bukaera" + +#: ../src/vikgeoreflayer.c:646 +msgid "The file you requested could not be opened for writing." +msgstr "Eskatu duzun fitxategia ezin da ireki idazteko." + +#: ../src/vikgeoreflayer.c:782 +msgid "Lower right corner values may not be consistent with upper right values" +msgstr "" +"Baliteke beheko eskuin izkinaren balioak eta goiko eskuinekoarenak " +"kontsistenteak ez izatea" + +#: ../src/vikgeoreflayer.c:806 +#, c-format +msgid "Invalid image size: %s" +msgstr "Irudiaren tamaina ez da baliozkoa: %s" + +#: ../src/vikgeoreflayer.c:831 ../src/viklayer.c:561 ../src/vikwindow.c:4891 +msgid "Layer Properties" +msgstr "Geruza-propietateak" + +#: ../src/vikgeoreflayer.c:852 +msgid "World File Parameters:" +msgstr "Mundua fitxategiaren parametroak:" + +#: ../src/vikgeoreflayer.c:853 +msgid "Load From File..." +msgstr "Kargatu fitxategitik..." + +#: ../src/vikgeoreflayer.c:858 +msgid "Corner pixel easting:" +msgstr "Izkinako pixela ekialdean lerrokatzen:" + +#: ../src/vikgeoreflayer.c:860 +msgid "the UTM \"easting\" value of the upper-left corner pixel of the map" +msgstr "Maparen goiko ezkerreko izkinako pixelaren UTMren ekialdeko balioa" + +#: ../src/vikgeoreflayer.c:862 +msgid "Corner pixel northing:" +msgstr "Izkinako pixela iparrean lerrokatzen:" + +#: ../src/vikgeoreflayer.c:864 +msgid "the UTM \"northing\" value of the upper-left corner pixel of the map" +msgstr "Maparen goiko ezkerreko izkinako pixelaren UTMren iparraldeko balioa." + +#: ../src/vikgeoreflayer.c:866 +msgid "X (easting) scale (mpp): " +msgstr "X (ekialde) eskala (mpp) " + +#: ../src/vikgeoreflayer.c:867 +msgid "Y (northing) scale (mpp): " +msgstr "Y (iparra) eskala (mpp) " + +#: ../src/vikgeoreflayer.c:870 +msgid "the scale of the map in the X direction (meters per pixel)" +msgstr "Maparen eskala X norabidean (pixeleko metroak)" + +#: ../src/vikgeoreflayer.c:872 +msgid "the scale of the map in the Y direction (meters per pixel)" +msgstr "Maparen eskala Y norabidean (pixeleko metroak)" + +#: ../src/vikgeoreflayer.c:874 +msgid "Map Image:" +msgstr "Mapa-irudia" + +#: ../src/vikgeoreflayer.c:919 +msgid "Upper left latitude:" +msgstr "Goiko ezkerreko latitudea:" + +#: ../src/vikgeoreflayer.c:921 +msgid "Upper left longitude:" +msgstr "Goiko ezkerreko longitudea:" + +#: ../src/vikgeoreflayer.c:923 +msgid "Lower right latitude:" +msgstr "Beheko eskuineko latitudea:" + +#: ../src/vikgeoreflayer.c:925 +msgid "Lower right longitude:" +msgstr "Beheko eskuineko longitudea:" + +#: ../src/vikgeoreflayer.c:937 +msgid "Calculate MPP values from coordinates" +msgstr "Kalkulatu koordenatuen MPP balioak" + +#: ../src/vikgeoreflayer.c:938 +msgid "" +"Enter all corner coordinates before calculating the MPP values from the " +"image size" +msgstr "" +"Sartu izkin guztien koordinatuak irudiaren tamainaren MPP balioak kalkulatu " +"aurretik" + +#: ../src/vikgeoreflayer.c:948 +msgid "UTM" +msgstr "UTM" + +#: ../src/vikgeoreflayer.c:949 +msgid "Latitude/Longitude" +msgstr "Latitudea/Longitudea" + +#: ../src/vikgeoreflayer.c:957 ../src/vikmapniklayer.c:82 +#: ../src/vikmapslayer.c:158 +msgid "Alpha:" +msgstr "Alfa:" + +#. Now with icons +#: ../src/vikgeoreflayer.c:1062 +msgid "_Zoom to Fit Map" +msgstr "_Zoom egin mapa doitzeko" + +#: ../src/vikgeoreflayer.c:1068 +msgid "_Goto Map Center" +msgstr "_Joan maparen erdira" + +#: ../src/vikgeoreflayer.c:1074 +msgid "_Export to World File" +msgstr "_Esportatu Mundua fitxategira" + +#: ../src/vikgoto.c:98 +msgid "No goto tool available." +msgstr "Joan-tresna ezin da erabili" + +#: ../src/vikgoto.c:295 +msgid "goto" +msgstr "Joan" + +#: ../src/vikgoto.c:297 +msgid "goto provider:" +msgstr "Jo zerbitzu-hornitzailearengana:" + +#: ../src/vikgoto.c:312 +msgid "Enter address or place name:" +msgstr "Sartu helbidea edo toki-izena" + +#: ../src/vikgoto.c:487 +msgid "Locality" +msgstr "Tokia" + +#: ../src/vikgpslayer.c:137 +msgid "Data Mode" +msgstr "Datu modua" + +#: ../src/vikgpslayer.c:139 +msgid "Realtime Tracking Mode" +msgstr "Denbora errealeko arrastoa modua" + +#: ../src/vikgpslayer.c:176 +msgid "Keep vehicle at center" +msgstr "Mantendu ibilgailua erdian" + +#: ../src/vikgpslayer.c:177 +msgid "Keep vehicle on screen" +msgstr "Mantendu ibilgailua pantailan" + +#: ../src/vikgpslayer.c:178 +msgid "Disable" +msgstr "Ezgaitu" + +#: ../src/vikgpslayer.c:218 +msgid "Download Tracks:" +msgstr "Deskargatu arrastoak:" + +#: ../src/vikgpslayer.c:219 +msgid "Upload Tracks:" +msgstr "Kargatu arratoak:" + +#: ../src/vikgpslayer.c:220 +msgid "Download Routes:" +msgstr "Deskargatu ibilbideak:" + +#: ../src/vikgpslayer.c:221 +msgid "Upload Routes:" +msgstr "Kargatu ibilbideak:" + +#: ../src/vikgpslayer.c:222 +msgid "Download Waypoints:" +msgstr "Deskargatu bide-puntuak:" + +#: ../src/vikgpslayer.c:223 +msgid "Upload Waypoints:" +msgstr "Kargatu bide-puntuak:" + +#: ../src/vikgpslayer.c:225 +msgid "Recording tracks" +msgstr "Arrastoak grabatzen" + +#: ../src/vikgpslayer.c:226 +msgid "Jump to current position on start" +msgstr "Jauzi egin uneko posiziora abiatzean" + +#: ../src/vikgpslayer.c:227 +msgid "Moving Map Method:" +msgstr "Mapa-mugikorra metodoa:" + +#: ../src/vikgpslayer.c:228 +msgid "Update Statusbar:" +msgstr "Eguneratu egoera-barra" + +#: ../src/vikgpslayer.c:228 +msgid "Display information in the statusbar on GPS updates" +msgstr "GPSaren egunertzeen informazioa erakutsi egoera-barran" + +#: ../src/vikgpslayer.c:229 +#, fuzzy +msgid "Auto Connect" +msgstr "Kokapen automatikoa" + +#: ../src/vikgpslayer.c:229 +msgid "Automatically connect to GPSD" +msgstr "" + +#: ../src/vikgpslayer.c:230 +msgid "Gpsd Host:" +msgstr "Gpsd-ostalaria:" + +#: ../src/vikgpslayer.c:231 +msgid "Gpsd Port:" +msgstr "Gpsd-ataka:" + +#: ../src/vikgpslayer.c:232 +msgid "Gpsd Retry Interval (seconds):" +msgstr "Gpsd berritzeko interbaloa (segundoak):" + +#: ../src/vikgpslayer.c:254 +msgid "GPS" +msgstr "GPSa" + +#: ../src/vikgpslayer.c:320 ../src/vikgpslayer.c:1504 +msgid "GPS Download" +msgstr "GPS deskarga" + +#: ../src/vikgpslayer.c:320 ../src/vikgpslayer.c:1504 ../src/viktrwlayer.c:3993 +msgid "GPS Upload" +msgstr "GPS karga" + +#: ../src/vikgpslayer.c:322 +msgid "GPS Realtime Tracking" +msgstr "GPS denbora errealeko arrastoa" + +#: ../src/vikgpslayer.c:458 +msgid "Connected" +msgstr "" + +#: ../src/vikgpslayer.c:460 +msgid "Disconnected" +msgstr "" + +#: ../src/vikgpslayer.c:554 +msgid "Unknown GPS Protocol" +msgstr "GPS-protokolo ezezaguna" + +#: ../src/vikgpslayer.c:572 +msgid "Unknown serial port device" +msgstr "serie-atakako gailu ezezaguna" + +#: ../src/vikgpslayer.c:691 +#, c-format +msgid "%s: unknown parameter" +msgstr "%s: parametro ezezaguna" + +#. Now with icons +#: ../src/vikgpslayer.c:794 +msgid "_Upload to GPS" +msgstr "_GPSra kargatu" + +#: ../src/vikgpslayer.c:800 +msgid "Download from _GPS" +msgstr "_GPStik deskargatu" + +#: ../src/vikgpslayer.c:821 +msgid "Empty _Realtime" +msgstr "Hustu benetako_denbora" + +#: ../src/vikgpslayer.c:828 +msgid "E_mpty Upload" +msgstr "Karga hutsa" + +#: ../src/vikgpslayer.c:834 +msgid "_Empty Download" +msgstr "Deskarga hutsa" + +#: ../src/vikgpslayer.c:840 +msgid "Empty _All" +msgstr "Dena hutsa" + +#: ../src/vikgpslayer.c:852 +#, c-format +msgid "Unexpected number of disconnected handlers: %d" +msgstr "Deskonektatutako gailu kopuru ustegabea: %d" + +#: ../src/vikgpslayer.c:995 +#, c-format +msgid "Uploading %d waypoint..." +msgid_plural "Uploading %d waypoints..." +msgstr[0] "%d bide-puntua kargatzen..." +msgstr[1] "%d bide-puntuak kargatzen..." + +#: ../src/vikgpslayer.c:1000 +#, c-format +msgid "Uploading %d trackpoint..." +msgid_plural "Uploading %d trackpoints..." +msgstr[0] "%d arrastoa kargatzen..." +msgstr[1] "%d arrastoak kargatzen..." + +#: ../src/vikgpslayer.c:1005 +#, c-format +msgid "Uploading %d routepoint..." +msgid_plural "Uploading %d routepoints..." +msgstr[0] "%d ibilbide-puntua kargatzen..." +msgstr[1] "%d ibilbide-puntu kargatzen..." + +#: ../src/vikgpslayer.c:1034 +#, c-format +msgid "Downloaded %d out of %d waypoint..." +msgid_plural "Downloaded %d out of %d waypoints..." +msgstr[0] "%d/%d bide-puntu deskargatuta..." +msgstr[1] "%d/%d bide-puntu deskargatuta..." + +#: ../src/vikgpslayer.c:1040 +#, c-format +msgid "Downloaded %d out of %d trackpoint..." +msgid_plural "Downloaded %d out of %d trackpoints..." +msgstr[0] "%d/%d arrasto-puntu deskargatuta..." +msgstr[1] "%d/%d arrasto-puntu deskargatuta..." + +#: ../src/vikgpslayer.c:1046 +#, c-format +msgid "Downloaded %d out of %d routepoint..." +msgid_plural "Downloaded %d out of %d routepoints..." +msgstr[0] "%d/%d ibilbide-puntu deskargatuta..." +msgstr[1] "%d/%d ibilbide-puntu deskargatuta..." + +#: ../src/vikgpslayer.c:1056 +#, c-format +msgid "Uploaded %d out of %d waypoint..." +msgid_plural "Uploaded %d out of %d waypoints..." +msgstr[0] "%d/%d bide-puntu kargatuta..." +msgstr[1] "%d/%d bide-puntu kargatuta..." + +#: ../src/vikgpslayer.c:1062 +#, c-format +msgid "Uploaded %d out of %d trackpoint..." +msgid_plural "Uploaded %d out of %d trackpoints..." +msgstr[0] "%d/%d arrasto-puntu kargatuta..." +msgstr[1] "%d/%d arrasto-puntu kargatuta..." + +#: ../src/vikgpslayer.c:1068 +#, c-format +msgid "Uploaded %d out of %d routepoint..." +msgid_plural "Uploaded %d out of %d routepoints..." +msgstr[0] "%d/%d ibilbide-puntu kargatuta..." +msgstr[1] "%d/%d ibilbide-puntu kargatuta..." + +#: ../src/vikgpslayer.c:1079 +#, c-format +msgid "Downloaded %d waypoint" +msgid_plural "Downloaded %d waypoints" +msgstr[0] "%d bide-puntu deskargatuta" +msgstr[1] "%d bide-puntuak deskargatuta" + +#: ../src/vikgpslayer.c:1085 +#, c-format +msgid "Downloaded %d trackpoint" +msgid_plural "Downloaded %d trackpoints" +msgstr[0] "%d arrasto-puntu deskargatuta" +msgstr[1] "%d arrasto-puntu deskargatuta" + +#: ../src/vikgpslayer.c:1091 +#, c-format +msgid "Downloaded %d routepoint" +msgid_plural "Downloaded %d routepoints" +msgstr[0] "%d ibilbide-puntu deskargatuta" +msgstr[1] "%d ibilbide-puntu deskargatuta" + +#: ../src/vikgpslayer.c:1101 +#, c-format +msgid "Uploaded %d waypoint" +msgid_plural "Uploaded %d waypoints" +msgstr[0] "%d bide-puntu kargatuta" +msgstr[1] "%d bide-puntu kargatuta" + +#: ../src/vikgpslayer.c:1107 +#, c-format +msgid "Uploaded %d trackpoint" +msgid_plural "Uploaded %d trackpoints" +msgstr[0] "%d arrasto-puntu kargatuta" +msgstr[1] "%d arrasto-puntu kargatuta" + +#: ../src/vikgpslayer.c:1113 +#, c-format +msgid "Uploaded %d routepoint" +msgid_plural "Uploaded %d routepoints" +msgstr[0] "%d ibilbide-puntu kargatuta" +msgstr[1] "%d ibilbide-puntu kargatuta" + +#: ../src/vikgpslayer.c:1363 +msgid "Error: No result." +msgstr "" + +#: ../src/vikgpslayer.c:1471 +msgid "Warning - GPS Upload items may overwrite each other" +msgstr "Kontuz - kargatutako GPS-elementuek beste batzuk gainidatz ditzakete" + +#: ../src/vikgpslayer.c:1506 +msgid "Status: detecting gpsbabel" +msgstr "Egoera: gpsbabel bilatzen" + +#: ../src/vikgpslayer.c:1533 +msgid "No GPS items selected for transfer." +msgstr "Ez dago GPS-elementu hautaturik transferitzeko" + +#: ../src/vikgpslayer.c:1546 +msgid "Could not turn off device." +msgstr "Ezin da gailua itzali" + +#: ../src/vikgpslayer.c:1589 +msgid "Are you sure you want to delete GPS Upload data?" +msgstr "Seguru zaude ezabatu nahi dituzula kargatutako GPS datuak?" + +#: ../src/vikgpslayer.c:1602 +msgid "Are you sure you want to delete GPS Download data?" +msgstr "Seguru zaude ezabatu nahi dituzula deskargatutako GPS datuak?" + +#: ../src/vikgpslayer.c:1616 +msgid "Are you sure you want to delete GPS Realtime data?" +msgstr "Seguru zaude ezabatu nahi dituzula kargatutako GPS Realtime datuak?" + +#: ../src/vikgpslayer.c:1630 +msgid "Are you sure you want to delete All GPS data?" +msgstr "Seguru zaude ezabatu nahi dituzula GPS datu guztiak?" + +#: ../src/vikgpslayer.c:2004 +#, c-format +msgid "" +"Failed to connect to gpsd at %s (port %s)\n" +"Should Viking keep trying (every %d seconds)?" +msgstr "" + +#: ../src/viklayerspanel.c:73 +msgid "C_ut" +msgstr "E_baki" + +#: ../src/viklayerspanel.c:74 ../src/vikwindow.c:4882 +msgid "_Copy" +msgstr "_Kopiatu" + +#: ../src/viklayerspanel.c:75 ../src/vikwindow.c:4883 +msgid "_Paste" +msgstr "_Itsatsi" + +#: ../src/viklayerspanel.c:76 ../src/vikwindow.c:4884 +msgid "_Delete" +msgstr "_Ezabatu" + +#: ../src/viklayerspanel.c:154 +msgid "New Layer" +msgstr "Geruza berria" + +#: ../src/viklayerspanel.c:347 +msgid "Top Layer" +msgstr "Goiko geruza" + +#: ../src/viklayerspanel.c:363 +msgid "Add new layer" +msgstr "Gehitu geruza berria" + +#: ../src/viklayerspanel.c:370 ../src/vikwindow.c:4884 +msgid "Remove selected layer" +msgstr "Ezabatu hautatutako geruza" + +#: ../src/viklayerspanel.c:377 +msgid "Move selected layer up" +msgstr "Mugitu gora hautatutako geruza" + +#: ../src/viklayerspanel.c:384 +msgid "Move selected layer down" +msgstr "Mugitu behera hautatutako geruza" + +#: ../src/viklayerspanel.c:391 ../src/vikwindow.c:4881 +msgid "Cut selected layer" +msgstr "Moztu hautatutako geruza" + +#: ../src/viklayerspanel.c:398 ../src/vikwindow.c:4882 +msgid "Copy selected layer" +msgstr "Kopiatu hautatutako geruza" + +#: ../src/viklayerspanel.c:405 ../src/vikwindow.c:4883 +msgid "" +"Paste layer into selected container layer or otherwise above selected layer" +msgstr "" +"Itsatsi geruza hautatutako edukiontzian edo bestela hautatutako geruzaren " +"gainean." + +#: ../src/viklayerspanel.c:502 +msgid "New name can not be blank." +msgstr "Izena ezin duzu hutsik utzi" + +#: ../src/viklayerspanel.c:751 +msgid "Aggregate Layers have no settable properties." +msgstr "Gehitutako geruzek ez dute propietate konfiguragarririk" + +#: ../src/viklayerspanel.c:798 +msgid "You cannot cut the Top Layer." +msgstr "Ezin duzu moztu goiko geruza" + +#: ../src/viklayerspanel.c:843 +#, c-format +msgid "Are you sure you want to delete %s?" +msgstr "Ziur zaude %s ezabatu nahi duzula?" + +#: ../src/viklayerspanel.c:863 +msgid "You cannot delete the Top Layer." +msgstr "Ezin duzu ezabatu goiko geruza" + +#: ../src/vikmapniklayer.c:78 +msgid "CSS (MML) Config File:" +msgstr "CSS (MML) ezarpen fitxategia:" + +#: ../src/vikmapniklayer.c:79 +msgid "CartoCSS configuration file" +msgstr "CartoCSS ezarpen fitxategia:" + +#: ../src/vikmapniklayer.c:80 +msgid "XML Config File:" +msgstr "XML ezarpen fitxategia:" + +#: ../src/vikmapniklayer.c:81 +msgid "Mapnik XML configuration file" +msgstr "Mapnik XML ezarpen fitxategia:" + +#: ../src/vikmapniklayer.c:84 +msgid "Use File Cache:" +msgstr "Erabili fitxategiaren cachea:" + +#: ../src/vikmapniklayer.c:86 +msgid "File Cache Directory:" +msgstr "Fitxategiaren cachearen direktorioa:" + +#: ../src/vikmapniklayer.c:122 +msgid "_Mapnik Features" +msgstr "_Mapnik zereginak" + +#: ../src/vikmapniklayer.c:122 +msgid "Mapnik Features" +msgstr "Mapnik zereginak" + +#: ../src/vikmapniklayer.c:140 +msgid "Mapnik Rendering" +msgstr "Mapnik errenderizatzea" + +#. Changing these values only applies before first mapnik layer is 'created' +#: ../src/vikmapniklayer.c:258 +msgid "Plugins Directory:" +msgstr "Pluginen direktorioa:" + +#: ../src/vikmapniklayer.c:258 ../src/vikmapniklayer.c:259 +#: ../src/vikmapniklayer.c:260 ../src/vikmapniklayer.c:261 +msgid "You need to restart Viking for a change to this value to be used" +msgstr "Viking berrabiarazi behar duzu balioaren aldaketa erabiltzeko" + +#: ../src/vikmapniklayer.c:259 +msgid "Fonts Directory:" +msgstr "Letra-tipoen direktorioa:" + +#: ../src/vikmapniklayer.c:260 +msgid "Recurse Fonts Directory:" +msgstr "Recurse letra-tipoen direktorioa:" + +#: ../src/vikmapniklayer.c:261 +msgid "Rerender Timeout (hours):" +msgstr "Errenderatzearen denbora-muga (orduak):" + +#. Changeable any time +#: ../src/vikmapniklayer.c:263 +msgid "CartoCSS:" +msgstr "CartoCSS:" + +#: ../src/vikmapniklayer.c:263 +msgid "The program to convert CartoCSS files into Mapnik XML" +msgstr "CartoCSS fitxategiak Mapnik XML bihurtzeko programa" + +#: ../src/vikmapniklayer.c:506 +msgid "Running" +msgstr "Exekutatzen" + +#: ../src/vikmapniklayer.c:525 +#, c-format +msgid "" +"Error running carto command:\n" +"%s" +msgstr "" +"Errorea carto komando exekutatzean:\n" +"%s" + +#: ../src/vikmapniklayer.c:561 +msgid " completed in " +msgstr " osatua " + +#: ../src/vikmapniklayer.c:561 +msgid "seconds" +msgstr "segundotan" + +#: ../src/vikmapniklayer.c:611 ../src/vikmapniklayer.c:979 +#, c-format +msgid "" +"Mapnik error loading configuration file:\n" +"%s" +msgstr "" +"Mapnik errorea ezarpen-fitxategia kargatzean:\n" +"%s" + +#: ../src/vikmapniklayer.c:749 +#, c-format +msgid "Mapnik Render %d:%d:%d %s" +msgstr "Manpnik errendatzea %d:%d:%d %s" + +#: ../src/vikmapniklayer.c:840 +msgid "Mapnik Rendering must be in Mercator mode" +msgstr "Mapnik errendatzea" + +#: ../src/vikmapniklayer.c:997 +msgid "Mapnik Information" +msgstr "Mapnik informazioa" + +#: ../src/vikmapniklayer.c:1031 +msgid "_Flush Memory Cache" +msgstr "Garbitu memoriaren cachea" + +#: ../src/vikmapniklayer.c:1044 +msgid "_Run Carto Command" +msgstr "Exekutatu carto komandoa" + +#: ../src/vikmapniklayer.c:1102 ../src/vikmapslayer.c:2029 +#, c-format +msgid "Tile File Timestamp: %s" +msgstr "Lauza fitxategiaren data-marka: %s" + +#: ../src/vikmapniklayer.c:1105 ../src/vikmapslayer.c:2032 +msgid "Tile File Timestamp: Not Available" +msgstr "Lauza fitxategiaren data-marka: Ez eskuragarria" + +#: ../src/vikmapniklayer.c:1120 +#, c-format +msgid "Rendering time %.2f seconds" +msgstr "Errendatze-denbora %.2f segundo" + +#: ../src/vikmapniklayer.c:1124 ../src/vikmapslayer.c:2042 +msgid "Tile Information" +msgstr "Lauzaren informazioa" + +#: ../src/vikmapniklayer.c:1145 +msgid "_Rerender Tile" +msgstr "Errendatze-lauza" + +#: ../src/vikmapniklayer.c:1150 +msgid "_Info" +msgstr "_Informazioa" + +#. ******* MAPZOOMS ******** +#: ../src/vikmapslayer.c:96 +msgid "Use Viking Zoom Level" +msgstr "Erabili Viking Zoom Level" + +#: ../src/vikmapslayer.c:146 +msgid "OSM" +msgstr "OSM" + +#. NB mode => id - But can't break file format just to rename something better +#: ../src/vikmapslayer.c:152 +msgid "Map Type:" +msgstr "Mapa mota" + +#: ../src/vikmapslayer.c:153 +msgid "Maps Directory:" +msgstr "Mapen direktorioa" + +#: ../src/vikmapslayer.c:154 +msgid "Cache Layout:" +msgstr "Cachearen diseinua:" + +#: ../src/vikmapslayer.c:155 +msgid "This determines the tile storage layout on disk" +msgstr "Honek lauzaren diskoko biltegiratze-diseinua zehazten du" + +#: ../src/vikmapslayer.c:156 +msgid "Map File:" +msgstr "Mapa fitxategia:" + +#: ../src/vikmapslayer.c:157 +msgid "An MBTiles file. Only applies when the map type method is 'MBTiles'" +msgstr "" +"MBTiles fitxategia. Bakarrik aplikatzen da mapa motaren metodoa 'MBTiles' " +"denean" + +#: ../src/vikmapslayer.c:159 +msgid "Control the Alpha value for transparency effects" +msgstr "Kontrolatu Alfa-balioa gardentasun efektuetarako" + +#: ../src/vikmapslayer.c:160 +msgid "Autodownload maps:" +msgstr "Autodeskargatu mapak:" + +#: ../src/vikmapslayer.c:161 +msgid "Autodownload Only Gets Missing Maps:" +msgstr "Autodeskargatu galdutako mapak bakarrik:" + +#: ../src/vikmapslayer.c:162 +msgid "" +"Using this option avoids attempting to update already acquired tiles. This " +"can be useful if you want to restrict the network usage, without having to " +"resort to manual control. Only applies when 'Autodownload Maps' is on." +msgstr "" +"Aukera hau erabilita saihets dezakezu lehendik eskuratutako lauzak " +"eguneratzea. Aukera interesgarria konexioaren erabilera murriztu nahi " +"baduzu. Erabili bakarrik 'Autodeskargatu mapak' aktibatuta dagoenean." + +#: ../src/vikmapslayer.c:163 +msgid "Zoom Level:" +msgstr "Zoom-maila:" + +#: ../src/vikmapslayer.c:164 +msgid "" +"Determines the method of displaying map tiles for the current zoom level. " +"'Viking Zoom Level' uses the best matching level, otherwise setting a fixed " +"value will always use map tiles of the specified value regardless of the " +"actual zoom level." +msgstr "" +"Ebazten du zein metodo erabili mapako lauzak erakusteko erabiltzen ari den " +"zoomarekin. 'Viking Zoom maila' horrek erabiltzen du zoom mailarik egokiena, " +"bestela, ezarriz gero balio jakin bat, beti erabiliko ditu neurri jakin " +"horretako mapa-lauzak, orain dagoen zoom mailari ez-ikusiarena eginez." + +#: ../src/vikmapslayer.c:197 +msgid "_Maps Download" +msgstr "_Deskargatu mapak" + +#: ../src/vikmapslayer.c:197 +msgid "Maps Download" +msgstr "Deskargatu mapak" + +#: ../src/vikmapslayer.c:213 ../src/vikutils.c:895 +msgid "Map" +msgstr "Mapa" + +#: ../src/vikmapslayer.c:306 +msgid "Default map layer directory:" +msgstr "Mapa-geruza lehenetsien direktorioa" + +#: ../src/vikmapslayer.c:306 +msgid "Choose a directory to store cached Map tiles for this layer" +msgstr "Aukeratu direktorio bat gordetzeko geruza honetako mapa-lauzak" + +#: ../src/vikmapslayer.c:436 ../src/vikmapslayer.c:633 +msgid "Unknown map type" +msgstr "Mapa mota ezezaguna" + +#: ../src/vikmapslayer.c:664 +msgid "Unknown Map Zoom" +msgstr "Mapa zoom ezezaguna" + +#: ../src/vikmapslayer.c:833 +#, c-format +msgid "Failed to open MBTiles file: %s" +msgstr "Huts egin du MBTiles fitxategia irekitzen: %s" + +#: ../src/vikmapslayer.c:856 +#, c-format +msgid "" +"New map cannot be displayed in the current drawmode.\n" +"Select \"%s\" from View menu to view it." +msgstr "" +"Mapa berria ezin da bistaratu uneko marrazketa-moduan.\n" +"Hautatu menuko Ikusi ataleko \"%s\" ondo ikusteko." + +#: ../src/vikmapslayer.c:1314 +#, c-format +msgid "" +"Cowardly refusing to draw tiles or existence of tiles beyond %d zoom out " +"factor" +msgstr "" +"Era koldar batean uko egiten mapa-lauzak marrazteari edo bestela, badaude " +"mapa-lauzak %d zoom faktore horren harago" + +#. TODO: ?? count up the number of download errors somehow... +#: ../src/vikmapslayer.c:1667 +msgid "Failed to download tile" +msgstr "Huts egin du fitxategia deskargatzen" + +#: ../src/vikmapslayer.c:1673 +msgid "Unable to save tile" +msgstr "Ezin da lauza gorde" + +#: ../src/vikmapslayer.c:1799 +#, c-format +msgid "Redownloading up to %d %s map..." +msgid_plural "Redownloading up to %d %s maps..." +msgstr[0] "Berriro deskargatzen %d %s maparaino..." +msgstr[1] "Berriro deskargatzen %d %s mapetaraino..." + +#: ../src/vikmapslayer.c:1801 +#, c-format +msgid "Redownloading %d %s map..." +msgid_plural "Redownloading %d %s maps..." +msgstr[0] "Berriro deskargatzen %d %s mapa..." +msgstr[1] "Berriro deskargatzen %d %s mapak..." + +#: ../src/vikmapslayer.c:1805 ../src/vikmapslayer.c:1890 +#, c-format +msgid "Downloading %d %s map..." +msgid_plural "Downloading %d %s maps..." +msgstr[0] "Deskargatzen %d %s mapa..." +msgstr[1] "Deskargatzen %d %s mapak..." + +#: ../src/vikmapslayer.c:1969 +msgid "YES" +msgstr "BAI" + +#: ../src/vikmapslayer.c:1973 ../src/vikmapslayer.c:1977 +msgid "NO" +msgstr "EZ" + +#. NB Also handles .jpg automatically due to pixbuf_new_from () support - although just print png for now. +#: ../src/vikmapslayer.c:1980 +#, c-format +msgid "Source: %s (%d%s%d%s%d.%s %s)" +msgstr "" + +#: ../src/vikmapslayer.c:1983 +msgid "Source: Not available" +msgstr "Iturburua: ezin da eskuratu" + +#: ../src/vikmapslayer.c:2000 +#, fuzzy +msgid "Source: file://" +msgstr "Iturburua: ezin da eskuratu" + +#: ../src/vikmapslayer.c:2012 +#, c-format +msgid "Source: %s" +msgstr "" + +#: ../src/vikmapslayer.c:2038 +#, fuzzy, c-format +msgid "Tile File: %s [Not Available]" +msgstr "Lauza fitxategiaren data-marka: Ez eskuragarria" + +#: ../src/vikmapslayer.c:2086 +msgid "Redownload _Bad Map(s)" +msgstr "Kargatu berriro mapa _kaxkarra(k)" + +#: ../src/vikmapslayer.c:2090 +msgid "Redownload _New Map(s)" +msgstr "Kargatu berriro mapa _berria(k)" + +#: ../src/vikmapslayer.c:2094 +msgid "Redownload _All Map(s)" +msgstr "Kargatu berriro mapa _guztia(k)" + +#: ../src/vikmapslayer.c:2099 +msgid "_Show Tile Information" +msgstr "_Erakutsi lauzen informazioa" + +#: ../src/vikmapslayer.c:2166 +#, c-format +msgid "" +"Wrong drawmode for this map.\n" +"Select \"%s\" from View menu and try again." +msgstr "" +"Marrazteko moduaren akatsa mapa honetan\n" +"Hautatu \"%s\" menuko Ikusi atalean eta saiatu berriz." + +#: ../src/vikmapslayer.c:2171 +msgid "Wrong zoom level for this map." +msgstr "Zoom maila okerra mapa honentzat" + +#: ../src/vikmapslayer.c:2334 +msgid "Zoom Start:" +msgstr "Zoomaren hasiera:" + +#: ../src/vikmapslayer.c:2341 +msgid "Zoom End:" +msgstr "Zoomaren bukaera:" + +#: ../src/vikmapslayer.c:2347 +msgid "Download Maps Method:" +msgstr "Mapak deskargatzeko metodoa:" + +#. redownload method - needs to align with REDOWNLOAD* macro values +#: ../src/vikmapslayer.c:2419 +msgid "Missing" +msgstr "Ez dago" + +#: ../src/vikmapslayer.c:2419 +msgid "Bad" +msgstr "Txarra" + +#: ../src/vikmapslayer.c:2419 +msgid "New" +msgstr "Berria" + +#: ../src/vikmapslayer.c:2419 +msgid "Reload All" +msgstr "Berireki dena" + +#: ../src/vikmapslayer.c:2421 +msgid "Download for Zoom Levels" +msgstr "Deskargatu zoom-mailak" + +#: ../src/vikmapslayer.c:2461 +#, c-format +msgid "" +"You are not allowed to download more than %d tiles in one go (requested %d)" +msgstr "Ezin duzu deskargatu %d lauza baino gehiago aldi batean (eskaera %d)" + +#: ../src/vikmapslayer.c:2469 +#, c-format +msgid "Do you really want to download %d tiles?" +msgstr "Benetan nahi duzu %d lauza deskargatu?" + +#. Now with icons +#: ../src/vikmapslayer.c:2509 +msgid "Download _Missing Onscreen Maps" +msgstr "Kargatu _Galdutako pantailako mapak" + +#: ../src/vikmapslayer.c:2516 +msgid "Download _New Onscreen Maps" +msgstr "Kargatu pantailako mapa _berriak" + +#: ../src/vikmapslayer.c:2523 +msgid "Reload _All Onscreen Maps" +msgstr "Berriro kargatu pantailako mapa _guztiak" + +#: ../src/vikmapslayer.c:2529 +msgid "Download Maps in _Zoom Levels..." +msgstr "Deskargatu mapak _Zoom mailetan..." + +#: ../src/vikmapslayer.c:2539 +#, fuzzy +msgid "_Open MBTiles Files" +msgstr "MBTiles fitxategia" + +#: ../src/vikmapslayer.c:2554 +msgid "Flush Map Cache" +msgstr "Garbitu mapen cachea" + +#: ../src/vikrouting.c:54 +msgid "Default engine:" +msgstr "Lehenetsitako motorea:" + +#: ../src/vikrouting.c:68 +msgid "Routing" +msgstr "Bideratzen" + +#: ../src/viktreeview.c:347 +msgid "Layer Name" +msgstr "Geruza-izena" + +#: ../src/viktreeview.c:924 +#, c-format +msgid "delete data from %s\n" +msgstr "ezabatu datuak hemendik %s\n" + +#: ../src/viktrwlayer.c:427 +msgid "Create _Waypoint" +msgstr "Sortu _bide-puntua" + +#: ../src/viktrwlayer.c:427 +msgid "Create Waypoint" +msgstr "Sortu bide-puntua" + +#: ../src/viktrwlayer.c:437 +#, fuzzy +msgid "Edit _Track" +msgstr "Editatu arrasto-puntua" + +#: ../src/viktrwlayer.c:437 +#, fuzzy +msgid "Edit Track" +msgstr "Editatu arrasto-puntua" + +#: ../src/viktrwlayer.c:449 +#, fuzzy +msgid "Edit _Route" +msgstr "Gehitu ibilbidea" + +#: ../src/viktrwlayer.c:449 +#, fuzzy +msgid "Edit Route" +msgstr "Gehitu ibilbidea" + +#: ../src/viktrwlayer.c:460 +msgid "Route _Finder" +msgstr "Ibilbideen _bilatzailea" + +#: ../src/viktrwlayer.c:460 +msgid "Route Finder" +msgstr "Ibilbideen bilatzailea" + +#: ../src/viktrwlayer.c:471 +#, fuzzy +msgid "Splitter" +msgstr "Moztu hemen" + +#: ../src/viktrwlayer.c:482 +msgid "_Edit Waypoint" +msgstr "_Editatu bide-puntua" + +#: ../src/viktrwlayer.c:482 +msgid "Edit Waypoint" +msgstr "Editatu bide-puntua" + +#: ../src/viktrwlayer.c:495 +msgid "Edit Trac_kpoint" +msgstr "Editatu _arrasto-puntua" + +#: ../src/viktrwlayer.c:495 +msgid "Edit Trackpoint" +msgstr "Editatu arrasto-puntua" + +#. a pixbuf for this one is already made globally available +#: ../src/viktrwlayer.c:508 +msgid "Show P_icture" +msgstr "Ikusi _irudia" + +#: ../src/viktrwlayer.c:508 +msgid "Show Picture" +msgstr "Ikusi irudia" + +#: ../src/viktrwlayer.c:531 +msgid "Waypoint Images" +msgstr "Bide-puntu irudiak" + +#: ../src/viktrwlayer.c:531 +msgid "Tracks Advanced" +msgstr "Arrasto aurreratuak" + +#: ../src/viktrwlayer.c:531 +msgid "Metadata" +msgstr "Metadatuak" + +#: ../src/viktrwlayer.c:531 +#, fuzzy +msgid "Filesystem" +msgstr "Fitxategi mota:" + +#: ../src/viktrwlayer.c:534 +msgid "Draw by Track" +msgstr "Irudikatu arrastoaren bidez" + +#: ../src/viktrwlayer.c:534 +msgid "Draw by Speed" +msgstr "Irudikatu abiaduraren bidez" + +#: ../src/viktrwlayer.c:534 +msgid "All Tracks Same Color" +msgstr "Arrasto guztiek kolore bera" + +#: ../src/viktrwlayer.c:535 +msgid "Filled Square" +msgstr "Karratu betea" + +#: ../src/viktrwlayer.c:535 +msgid "Square" +msgstr "Karratua" + +#: ../src/viktrwlayer.c:535 +msgid "Circle" +msgstr "Zirkulua" + +#: ../src/viktrwlayer.c:535 +msgid "X" +msgstr "X" + +#: ../src/viktrwlayer.c:561 +msgid "Extra Extra Small" +msgstr "Txiki txiki txikia" + +#: ../src/viktrwlayer.c:562 +msgid "Extra Small" +msgstr "Txiki txikia" + +#: ../src/viktrwlayer.c:566 +msgid "Extra Large" +msgstr "Handi handia" + +#: ../src/viktrwlayer.c:567 +msgid "Extra Extra Large" +msgstr "Handi handi handia" + +#: ../src/viktrwlayer.c:573 +msgid "Name Ascending" +msgstr "Alfabetikoki gora" + +#: ../src/viktrwlayer.c:574 +msgid "Name Descending" +msgstr "Alfabetikoki behera" + +#: ../src/viktrwlayer.c:582 ../src/viktrwlayer_propwin.c:3319 +msgid "No" +msgstr "Ez" + +#: ../src/viktrwlayer.c:583 +msgid "Yes" +msgstr "" + +#: ../src/viktrwlayer.c:584 +msgid "No write" +msgstr "" + +#: ../src/viktrwlayer.c:649 ../src/viktrwlayer.c:673 +msgid "Draw Labels" +msgstr "Marraztu etiketak" + +#: ../src/viktrwlayer.c:650 +msgid "Note: the individual track controls what labels may be displayed" +msgstr "Oharra: erakutsi daitezkeen etiketen arrastoen kontrolak" + +#: ../src/viktrwlayer.c:651 +msgid "Track Labels Font Size:" +msgstr "Arrastoen etiketen letra-motaren tamaina" + +#: ../src/viktrwlayer.c:652 +msgid "Track Drawing Mode:" +msgstr "Arrasto-marrazketa modua" + +#: ../src/viktrwlayer.c:653 +msgid "All Tracks Color:" +msgstr "Kolore guztietako arrastoak:" + +#: ../src/viktrwlayer.c:654 +msgid "The color used when 'All Tracks Same Color' drawing mode is selected" +msgstr "" +"'Arrasto guztiek kolore bera' marrazketa moduan erabili beharreko kolorea " +"hautatu da" + +#: ../src/viktrwlayer.c:655 +msgid "Draw Track Lines" +msgstr "Marraztu arrasto-lerroak" + +#: ../src/viktrwlayer.c:656 +msgid "Track Thickness:" +msgstr "Arrastoaren lodiera" + +#: ../src/viktrwlayer.c:657 +msgid "Draw Track Direction" +msgstr "Marraztu arrastoaren norabidea" + +#: ../src/viktrwlayer.c:658 +msgid "Direction Size:" +msgstr "Norabidearen tamaina:" + +#: ../src/viktrwlayer.c:659 +msgid "Draw Trackpoints" +msgstr "Marraztu arrasto-puntuak" + +#: ../src/viktrwlayer.c:660 +msgid "Trackpoint Size:" +msgstr "Arrasto-puntuaren tamaina" + +#: ../src/viktrwlayer.c:661 +msgid "Draw Elevation" +msgstr "Marraztu altitudea" + +#: ../src/viktrwlayer.c:662 +msgid "Draw Elevation Height %:" +msgstr "Marraztu altitudearen altuera %:" + +#: ../src/viktrwlayer.c:663 +msgid "Draw Stops" +msgstr "Marraztu geldialdiak" + +#: ../src/viktrwlayer.c:664 +msgid "" +"Whether to draw a marker when trackpoints are at the same position but over " +"the minimum stop length apart in time" +msgstr "" +"Ea marraztu ala ez marraztu markatzaile bat arrasto-puntuak leku berean " +"daudenean baina geldiune jakin baten iraupena gainditu baldin bada" + +#: ../src/viktrwlayer.c:665 +msgid "Min Stop Length (seconds):" +msgstr "Geldialdiaren luzera minimoa (segundoak)" + +#: ../src/viktrwlayer.c:667 +msgid "Track BG Thickness:" +msgstr "Arrastoaren atzeko planoaren lodiera" + +#: ../src/viktrwlayer.c:668 +msgid "Track Background Color" +msgstr "Arrastoaren atzeko planoaren kolorea" + +#: ../src/viktrwlayer.c:669 +msgid "Draw by Speed Factor (%):" +msgstr "Marraztu abiadura faktorearen bidez (%):" + +#: ../src/viktrwlayer.c:670 +msgid "" +"The percentage factor away from the average speed determining the color used" +msgstr "Batez besteko abiadurarekiko faktoreak zehazten du erabilitako kolorea" + +#: ../src/viktrwlayer.c:671 +msgid "Track Sort Order:" +msgstr "Arrastoen ordena:" + +#: ../src/viktrwlayer.c:674 +msgid "Waypoint Font Size:" +msgstr "Bide-puntuaren letra-mota" + +#: ../src/viktrwlayer.c:675 +msgid "Waypoint Color:" +msgstr "Bide-puntuaren kolorea" + +#: ../src/viktrwlayer.c:676 +msgid "Waypoint Text:" +msgstr "Bide-puntuaren testua:" + +#: ../src/viktrwlayer.c:677 +msgid "Background:" +msgstr "Atzeko planoa:" + +#: ../src/viktrwlayer.c:678 +msgid "Fake BG Color Translucency:" +msgstr "Balizko BG Color gardentasuna:" + +#: ../src/viktrwlayer.c:679 +msgid "Waypoint marker:" +msgstr "Bide-puntuaren markatzailea:" + +#: ../src/viktrwlayer.c:680 +msgid "Waypoint size:" +msgstr "Bide-puntuaren tamaina:" + +#: ../src/viktrwlayer.c:681 +msgid "Draw Waypoint Symbols:" +msgstr "Marraztu bide-puntuen ikurrak:" + +#: ../src/viktrwlayer.c:682 +msgid "Waypoint Sort Order:" +msgstr "Bide-puntuen ordena:" + +#: ../src/viktrwlayer.c:684 +msgid "Draw Waypoint Images" +msgstr "Marraztu bide-puntuen irudiak:" + +#: ../src/viktrwlayer.c:685 +msgid "Image Size (pixels):" +msgstr "Irudiaren tamaina (pixelak):" + +#: ../src/viktrwlayer.c:686 +msgid "Image Alpha:" +msgstr "Irudiaren alfa:" + +#: ../src/viktrwlayer.c:687 +msgid "Image Memory Cache Size:" +msgstr "Irudiaren cache-memoriaren tamaina:" + +#: ../src/viktrwlayer.c:690 +msgid "Author" +msgstr "Egilea" + +#: ../src/viktrwlayer.c:691 +msgid "Creation Time" +msgstr "Sortze-data" + +#: ../src/viktrwlayer.c:692 +msgid "Keywords" +msgstr "Hitz gakoak" + +#: ../src/viktrwlayer.c:693 +#, fuzzy +msgid "External layer:" +msgstr "Kanpokoa" + +#: ../src/viktrwlayer.c:693 +msgid "" +"Layer data stored in the Viking file, in an external file, or in an external " +"file but changes are not written to the file (file only loaded at startup)" +msgstr "" + +#: ../src/viktrwlayer.c:694 +#, fuzzy +msgid "Save layer as:" +msgstr "Geruza bat" + +#: ../src/viktrwlayer.c:694 +msgid "Specify where layer should be saved. Overwrites file if it exists." +msgstr "" + +#: ../src/viktrwlayer.c:798 +msgid "TrackWaypoint" +msgstr "Arrasto-puntua" + +#: ../src/viktrwlayer.c:1999 ../src/viktrwlayer_propwin.c:1469 +#: ../src/viktrwlayer_propwin.c:1471 ../src/vikutils.c:299 +#: ../src/vikutils.c:326 +msgid "miles" +msgstr "milia" + +#: ../src/viktrwlayer.c:2002 ../src/viktrwlayer_propwin.c:1475 +#: ../src/viktrwlayer_propwin.c:1477 ../src/vikutils.c:303 +#: ../src/vikutils.c:330 +msgid "NM" +msgstr "NM" + +#. VIK_UNITS_DISTANCE_KILOMETRES: +#: ../src/viktrwlayer.c:2006 ../src/viktrwlayer_propwin.c:1482 +#: ../src/viktrwlayer_propwin.c:1484 ../src/vikutils.c:308 +#: ../src/vikutils.c:335 +msgid "km" +msgstr "km" + +#: ../src/viktrwlayer.c:2121 +msgid "start/end" +msgstr "hasiera/bukaera" + +#: ../src/viktrwlayer.c:2133 +msgid "start" +msgstr "hasiera" + +#: ../src/viktrwlayer.c:2142 +msgid "end" +msgstr "bukaera" + +#: ../src/viktrwlayer.c:3103 +#, c-format +msgid " in %d:%02d hrs:mins" +msgstr " %d:%02d ordu:min" + +#: ../src/viktrwlayer.c:3107 +#, c-format +msgid "" +"\n" +"%sTotal Length %.1f %s%s" +msgstr "" +"\n" +"Luzera %sOsoa %.1f %s%s" + +#: ../src/viktrwlayer.c:3131 +#, c-format +msgid "" +"\n" +"Total route length %.1f %s" +msgstr "" +"\n" +"Ibilbidearen luzera denetara %.1f %s" + +#: ../src/viktrwlayer.c:3136 +#, c-format +msgid "Tracks: %d - Waypoints: %d - Routes: %d%s%s" +msgstr "Arrastoak: %d - Bide-puntuak: %d - Ibilbideak: %d%s%s" + +#: ../src/viktrwlayer.c:3155 +#, c-format +msgid "Tracks: %d" +msgstr "Arrastoak: %d" + +#: ../src/viktrwlayer.c:3165 +#, c-format +msgid "Routes: %d" +msgstr "Ibilbideak: %d" + +#: ../src/viktrwlayer.c:3195 +#, c-format +msgid "- %d:%02d hrs:mins" +msgstr "- %d:%02d ordu:min" + +#: ../src/viktrwlayer.c:3202 +#, c-format +msgid "%s%.1f km %s" +msgstr "%s%.1f km %s" + +#: ../src/viktrwlayer.c:3205 +#, c-format +msgid "%s%.1f miles %s" +msgstr "%s%.1f milia %s" + +#: ../src/viktrwlayer.c:3208 +#, c-format +msgid "%s%.1f NM %s" +msgstr "%s%.1f NM %s" + +#: ../src/viktrwlayer.c:3222 +#, c-format +msgid "Waypoints: %d" +msgstr "Bide-puntuak: %d" + +#: ../src/viktrwlayer.c:3279 +#, c-format +msgid "Wpt: Alt %dft" +msgstr "Bide-puntu: Alt %d oin" + +#. VIK_UNITS_HEIGHT_METRES: +#: ../src/viktrwlayer.c:3283 +#, c-format +msgid "Wpt: Alt %dm" +msgstr "Bide-puntu: Alt %d m" + +#. Add comment if available +#: ../src/viktrwlayer.c:3298 +#, c-format +msgid "%s | %s %s | Comment: %s" +msgstr "%s | %s %s | Iruzkina: %s" + +#: ../src/viktrwlayer.c:3300 +#, c-format +msgid "%s | %s %s" +msgstr "%s | %s %s" + +#: ../src/viktrwlayer.c:3562 ../src/viktrwlayer.c:3591 +msgid "This layer has no waypoints or trackpoints." +msgstr "Geruza honek ez dauka bide-punturik ez arrato-punturik" + +#: ../src/viktrwlayer.c:3598 ../src/viktrwlayer.c:3607 +#: ../src/viktrwlayer.c:3616 ../src/viktrwlayer.c:3625 +#: ../src/viktrwlayer.c:3634 ../src/viktrwlayer.c:3642 +msgid "Export Layer" +msgstr "Esportatu geruza" + +#: ../src/viktrwlayer.c:3671 +msgid "Export Route as GPX" +msgstr "Esportatu ibilbidea GPX formatura" + +#: ../src/viktrwlayer.c:3673 +msgid "Export Track as GPX" +msgstr "Esportatu arrastoa GPX formatuan." + +#: ../src/viktrwlayer.c:3693 +msgid "Find" +msgstr "Aurkitu" + +#: ../src/viktrwlayer.c:3703 +msgid "Waypoint Name:" +msgstr "Bide-puntuaren izena:" + +#: ../src/viktrwlayer.c:3720 +msgid "Waypoint not found in this layer." +msgstr "Bide-puntua ez da aurkitu geruza honetan." + +#: ../src/viktrwlayer.c:3989 +msgid "Can not upload invisible track." +msgstr "Ezin da kargatu arrato ikustezina." + +#: ../src/viktrwlayer.c:4082 ../src/viktrwlayer.c:10512 +msgid "Track" +msgstr "Arrastoa" + +#: ../src/viktrwlayer.c:4107 ../src/viktrwlayer.c:10599 +msgid "Route" +msgstr "Ibilbidea" + +#: ../src/viktrwlayer.c:4194 +msgid "Externa_l" +msgstr "Kanpokoa" + +#: ../src/viktrwlayer.c:4216 ../src/viktrwlayer.c:8456 +#: ../src/viktrwlayer.c:8574 +msgid "_Finish Route" +msgstr "_Bukatu ibilbidea" + +#: ../src/viktrwlayer.c:4218 ../src/viktrwlayer.c:8380 +#: ../src/viktrwlayer.c:8572 +msgid "_Finish Track" +msgstr "_Bukatu arrastoa" + +#. Now with icons +#: ../src/viktrwlayer.c:4230 +msgid "_View Layer" +msgstr "_Ikusi geruza" + +#: ../src/viktrwlayer.c:4237 +msgid "V_iew" +msgstr "_Ikusi" + +#: ../src/viktrwlayer.c:4243 +msgid "View All _Tracks" +msgstr "_Ikusi arrasto guztiak" + +#: ../src/viktrwlayer.c:4248 +msgid "View All _Routes" +msgstr "_Ikusi ibilbide guztiak" + +#: ../src/viktrwlayer.c:4253 +msgid "View All _Waypoints" +msgstr "_Ikusi bide-puntu guztiak" + +#: ../src/viktrwlayer.c:4258 +msgid "_Goto Center of Layer" +msgstr "_Joan geruzaren erdira" + +#: ../src/viktrwlayer.c:4264 ../src/viktrwlayer.c:8321 +msgid "Goto _Waypoint..." +msgstr "_Joan bide-puntura" + +#: ../src/viktrwlayer.c:4270 +msgid "_Export Layer" +msgstr "_Esportatu geruza" + +#: ../src/viktrwlayer.c:4276 +msgid "Export as GPS_Point..." +msgstr "Esportatu GPS_Point gisa..." + +#: ../src/viktrwlayer.c:4281 +msgid "Export as GPS_Mapper..." +msgstr "Esportatu GPS_Mapper gisa..." + +#: ../src/viktrwlayer.c:4286 +msgid "Export as _GPX..." +msgstr "_Esportatu GPX gisa..." + +#: ../src/viktrwlayer.c:4292 +msgid "Export as _KML..." +msgstr "_Esportatu KML gisa..." + +#: ../src/viktrwlayer.c:4299 +msgid "Export as GEO_JSON..." +msgstr "Esportatu GEO_JSON formatura" + +#: ../src/viktrwlayer.c:4306 +msgid "Export via GPSbabel..." +msgstr "Esportatu GPSBabel bidez" + +#: ../src/viktrwlayer.c:4312 +#, c-format +msgid "Open with External Program_1: %s" +msgstr "Ireki kanpoko programa baten bidez_1: %s" + +#: ../src/viktrwlayer.c:4319 +#, c-format +msgid "Open with External Program_2: %s" +msgstr "Ireki kanpoko programa baten bidez_2: %s" + +#: ../src/viktrwlayer.c:4327 ../src/vikwindow.c:4825 +msgid "_New" +msgstr "_Berria" + +#: ../src/viktrwlayer.c:4333 +msgid "New _Waypoint..." +msgstr "Bide-puntu berria" + +#: ../src/viktrwlayer.c:4339 +msgid "New _Track" +msgstr "_Arrasto berria" + +#: ../src/viktrwlayer.c:4347 +msgid "New _Route" +msgstr "_Ibilbide berria" + +#: ../src/viktrwlayer.c:4356 ../src/viktrwlayer.c:8232 +#: ../src/viktrwlayer.c:9003 +msgid "Geotag _Images..." +msgstr "_Geo-etiketatutako irudiak..." + +#: ../src/viktrwlayer.c:4363 +msgid "_Acquire" +msgstr "_Eskuratu" + +#: ../src/viktrwlayer.c:4369 ../src/vikwindow.c:4904 +msgid "From _GPS..." +msgstr "_GPStik" + +#. FIXME: only add menu when at least a routing engine has support for Directions +#: ../src/viktrwlayer.c:4375 +msgid "From _Directions..." +msgstr "_Helbideetatik..." + +#: ../src/viktrwlayer.c:4381 +msgid "From _OSM Traces..." +msgstr "_OSM Traces-etik..." + +#: ../src/viktrwlayer.c:4386 +msgid "From _My OSM Traces..." +msgstr "_My OSM Traces-etik..." + +#: ../src/viktrwlayer.c:4392 ../src/vikwindow.c:4844 +msgid "From _URL..." +msgstr "URLtik" + +#: ../src/viktrwlayer.c:4399 ../src/vikwindow.c:4846 +msgid "From _Wikipedia Waypoints" +msgstr "Wikipedia Waypoints-etik" + +#: ../src/viktrwlayer.c:4405 +msgid "Within _Layer Bounds" +msgstr "Geruzaren mugen barruan" + +#: ../src/viktrwlayer.c:4411 +msgid "Within _Current View" +msgstr "Uneko ikuspegiaren barruan" + +#: ../src/viktrwlayer.c:4419 +msgid "From Geo_caching..." +msgstr "Geo_cachin-etik..." + +#: ../src/viktrwlayer.c:4426 ../src/vikwindow.c:4842 +msgid "From Geotagged _Images..." +msgstr "Geotagged _Images-etik..." + +#: ../src/viktrwlayer.c:4433 +msgid "From _File..." +msgstr "Fitxategitik..." + +#: ../src/viktrwlayer.c:4436 ../src/vikwindow.c:4905 +msgid "Import File With GPS_Babel..." +msgstr "Inportatu datuak GPSBabel-en bidez..." + +#: ../src/viktrwlayer.c:4443 ../src/viktrwlayer.c:8905 +msgid "_Upload" +msgstr "_Kargatu" + +#: ../src/viktrwlayer.c:4449 +msgid "Upload to _GPS..." +msgstr "_Kargatu GPSra..." + +#: ../src/viktrwlayer.c:4456 ../src/viktrwlayer.c:8973 +msgid "Upload to _OSM..." +msgstr "_Kargatu OSMra..." + +#: ../src/viktrwlayer.c:4464 +msgid "De_lete" +msgstr "_Ezabatu" + +#: ../src/viktrwlayer.c:4470 +msgid "Delete All _Tracks" +msgstr "_Ezabatu arrasto guztiak" + +#: ../src/viktrwlayer.c:4477 +msgid "Delete Tracks _From Selection..." +msgstr "_Ezabatu hautatutako arrastoak" + +#: ../src/viktrwlayer.c:4484 ../src/viktrwlayer.c:8481 +msgid "Delete _All Routes" +msgstr "_Ezabatu ibilbide guztiak" + +#: ../src/viktrwlayer.c:4491 ../src/viktrwlayer.c:8487 +msgid "_Delete Routes From Selection..." +msgstr "_Ezabatu hautatutako ibilbideak..." + +#: ../src/viktrwlayer.c:4498 +msgid "Delete All _Waypoints" +msgstr "_Ezabatu bide-puntu guztiak" + +#: ../src/viktrwlayer.c:4505 +msgid "Delete Waypoints From _Selection..." +msgstr "_Ezabatu hautatutako bide-puntuak..." + +#: ../src/viktrwlayer.c:4512 ../src/viktrwlayer.c:8339 +#, fuzzy +msgid "Delete Duplicate Waypoints" +msgstr "Ezabatu bikoiztutak bide-puntuak" + +#: ../src/viktrwlayer.c:5198 +#, c-format +msgid "Are you sure you want to delete all tracks in %s?" +msgstr "Seguru zaude %s-ko arrasto guztiak ezabatu nahi dituzula?" + +#: ../src/viktrwlayer.c:5211 +#, c-format +msgid "Are you sure you want to delete all routes in %s?" +msgstr "Seguru zaude %s-ko ibilbide guztiak ezabatu nahi dituzula?" + +#: ../src/viktrwlayer.c:5221 +#, c-format +msgid "Are you sure you want to delete all waypoints in %s?" +msgstr "Seguru zaude %s-ko bide-puntu guztiak ezabatu nahi dituzula?" + +#: ../src/viktrwlayer.c:5238 +#, c-format +msgid "Are you sure you want to delete the waypoint \"%s\"?" +msgstr "Seguru zaude \"%s\" bideko puntua ezabatu nahi duzula?" + +#: ../src/viktrwlayer.c:5254 +#, c-format +msgid "Are you sure you want to delete the track \"%s\"?" +msgstr "Seguru zaude \"%s\" arrastoa ezabatu nahi duzula?" + +#: ../src/viktrwlayer.c:5271 +#, c-format +msgid "Are you sure you want to delete the route \"%s\"?" +msgstr "Seguru zaude \"%s\" ibilbidea ezabatu nahi duzula?" + +#: ../src/viktrwlayer.c:5527 ../src/viktrwlayer.c:6373 +msgid "" +"Converting a track to a route removes extra track data such as segments, " +"timestamps, etc...\n" +"Do you want to continue?" +msgstr "" +"Arrasto bat ibilbidea bihurtzean arrastoaren hainbat datu, hala nola " +"segmentuak, denborak eta abar galduko dira.\n" +"Aurrera egin nahi duzu?" + +#: ../src/viktrwlayer.c:5631 +msgid "No DEM layers available, thus no DEM values can be applied." +msgstr "Ez dago DEM geruzarik eskuragarri, beraz ezin da DEM baliorik aplikatu" + +#: ../src/viktrwlayer.c:5651 ../src/viktrwlayer.c:5692 +#, c-format +msgid "%ld point adjusted" +msgid_plural "%ld points adjusted" +msgstr[0] "%ld puntua doitua" +msgstr[1] "%ld puntuak doituak" + +#: ../src/viktrwlayer.c:5736 +#, c-format +msgid "%ld waypoint changed" +msgid_plural "%ld waypoints changed" +msgstr[0] "%ld bide-puntua aldatua" +msgstr[1] "%ld bide-puntuak aldatuak" + +#: ../src/viktrwlayer.c:5917 +#, c-format +msgid "" +"Refining a track with many points (%d) is unlikely to yield sensible " +"results. Do you want to Continue?" +msgstr "" +"Puntu asko (%d) dituen arrasto baten bereizmena handitzea ez ohi du emaitza " +"onik ematen. Jarraitu nahi duzu?" + +#. Select engine from dialog +#: ../src/viktrwlayer.c:5925 +msgid "Refine Route with Routing Engine..." +msgstr "Zehaztu arrastoa bideratze-motorearekin..." + +#: ../src/viktrwlayer.c:5933 +msgid "Select routing engine" +msgstr "Hautatu bideratze-motorea" + +#: ../src/viktrwlayer.c:6158 +msgid "Failed. No other tracks with timestamps in this layer found" +msgstr "" +"Errorea. Ez da topatu denbora-datuak dituen beste arrastorik geruza honetan" + +#: ../src/viktrwlayer.c:6160 +msgid "Failed. No other tracks without timestamps in this layer found" +msgstr "" +"Errorea. Ez da topatu denbora-daturik gabeko beste arrastorik geruza honetan" + +#: ../src/viktrwlayer.c:6179 +msgid "Merge with..." +msgstr "Batu honekin..." + +#: ../src/viktrwlayer.c:6180 +msgid "Select route to merge with" +msgstr "Hautatu ibilbidea batzeko honekin" + +#: ../src/viktrwlayer.c:6180 +msgid "Select track to merge with" +msgstr "Hautatu arrastoa batzeko honekin" + +#: ../src/viktrwlayer.c:6264 ../src/viktrwlayer.c:6346 +msgid "Append Route" +msgstr "Erantsi ibilbidea" + +#: ../src/viktrwlayer.c:6264 ../src/viktrwlayer.c:6346 +msgid "Append Track" +msgstr "Erantsi arrastoa" + +#: ../src/viktrwlayer.c:6265 +msgid "Select the route to append after the current route" +msgstr "Hautatu ibilbidea uneko ibilbidearen ostean eransteko" + +#: ../src/viktrwlayer.c:6266 +msgid "Select the track to append after the current track" +msgstr "Hautatu arrastoa uneko arrastoaren ostean eransteko" + +#: ../src/viktrwlayer.c:6347 +msgid "Select the track to append after the current route" +msgstr "Hautatu arrastoa uneko ibilbidearen ostean eransteko" + +#: ../src/viktrwlayer.c:6348 +msgid "Select the route to append after the current track" +msgstr "Hautatu ibilbidea uneko arrastoaren ostean eransteko" + +#: ../src/viktrwlayer.c:6414 +#, c-format +msgid "%d segment merged" +msgid_plural "%d segments merged" +msgstr[0] "%d segmentua batuta" +msgstr[1] "%d segmentuak batuta" + +#: ../src/viktrwlayer.c:6430 +msgid "Failed. This track does not have timestamp" +msgstr "Errorea. Arrasto honek ez dauka denbora-daturik" + +#: ../src/viktrwlayer.c:6442 +msgid "Failed. No other track in this layer has timestamp" +msgstr "Errorea. Geruza honetan denbora-daturik duen beste arrastorik ez dago." + +#: ../src/viktrwlayer.c:6449 +msgid "Merge Threshold..." +msgstr "Batzeko mugak..." + +#: ../src/viktrwlayer.c:6450 +msgid "Merge when time between tracks less than:" +msgstr "Batu arrastoen arteko denbora hau baino txikiagoa denean:" + +#: ../src/viktrwlayer.c:6580 +msgid "Split Threshold..." +msgstr "Zatitzeko mugak..." + +#: ../src/viktrwlayer.c:6581 +msgid "Split when time between trackpoints exceeds:" +msgstr "Zatitu arrasto-puntuen arteko denbora hau baino handiagoa denean:" + +#: ../src/viktrwlayer.c:6598 +#, c-format +msgid "" +"Can not split track due to trackpoints not ordered in time - such as at %s.\n" +"\n" +"Goto this trackpoint?" +msgstr "" +"Ezin da arrastoa zatitu arrasto puntuak ez daudelako denboran ordenatuak - " +"%s kasuan bezala\n" +"\n" +"Joan nahi duzu arrasto-puntu honetara?" + +#: ../src/viktrwlayer.c:6668 +msgid "Split Every Nth Point" +msgstr "Zatitu n-puntuka" + +#: ../src/viktrwlayer.c:6669 +msgid "Split on every Nth point:" +msgstr "Zatitu n-puntuka" + +#: ../src/viktrwlayer.c:6779 +msgid "Can not split track as it has no segments" +msgstr "Ezin da zatitu arratoa segmenturik ez badu" + +#: ../src/viktrwlayer.c:6861 ../src/viktrwlayer.c:6891 +#, c-format +msgid "Deleted %ld point" +msgid_plural "Deleted %ld points" +msgstr[0] "%ld puntua ezabau da" +msgstr[1] "%ld puntuak ezabatu dira" + +#: ../src/viktrwlayer.c:6966 ../src/viktrwlayer.c:10989 +#: ../src/viktrwlayer_waypointlist.c:214 +#, c-format +msgid "Could not launch %s to open file." +msgstr "Ezin dut %s abiatu fitxategia irekitzeko" + +#: ../src/viktrwlayer.c:6992 ../src/viktrwlayer.c:7113 +msgid "This track has no date information." +msgstr "Arrasto honek ez dauka dataren gaineko infomaziorik" + +#: ../src/viktrwlayer.c:7006 ../src/viktrwlayer.c:7136 +msgid "This waypoint has no date information." +msgstr "Bide-puntu honek ez dauka dataren gaineko infomaziorik" + +#: ../src/viktrwlayer.c:7030 +#, c-format +msgid "Could not launch %s" +msgstr "Ezin da %s abiarazi" + +#: ../src/viktrwlayer.c:7269 +msgid "Internal Error in vik_trw_layer_uniquify_tracks" +msgstr "Barne errorea bertan: vik_trw_layer_uniquify_tracks" + +#: ../src/viktrwlayer.c:7374 ../src/viktrwlayer.c:7424 +#: ../src/viktrwlayer.c:7587 +msgid "" +"Multiple entries with the same name exist. This method only works with " +"unique names. Force unique names now?" +msgstr "" +"Izen bereko hainbat sarrera daude. Metodo honek soilik izan bakarrarekin lan " +"egiten du. Behartu izan bakarra orain?" + +#: ../src/viktrwlayer.c:7385 +msgid "No tracks found" +msgstr "Ez da arrastorik aurkitu" + +#: ../src/viktrwlayer.c:7393 ../src/viktrwlayer.c:7443 +#: ../src/viktrwlayer.c:7607 +msgid "Delete Selection" +msgstr "Ezabatu hautapena" + +#: ../src/viktrwlayer.c:7394 +msgid "Select tracks to delete" +msgstr "Hautatu ezabatu beharreko arrastoak" + +#: ../src/viktrwlayer.c:7435 +msgid "No routes found" +msgstr "Ez da ibilbiderik aurkitu" + +#: ../src/viktrwlayer.c:7444 +msgid "Select routes to delete" +msgstr "Hautatu ezabatu beharreko ibilbideak" + +#: ../src/viktrwlayer.c:7550 +msgid "Internal Error in vik_trw_layer_uniquify_waypoints" +msgstr "Barne-errorea hemen: vik_trw_layer_uniquify_waypoints" + +#: ../src/viktrwlayer.c:7597 +msgid "No waypoints found" +msgstr "Ez da bide-punturik aurkitu" + +#: ../src/viktrwlayer.c:7608 +msgid "Select waypoints to delete" +msgstr "Hautatu ezabatu beharreko bide-puntuak" + +#: ../src/viktrwlayer.c:7691 +#, fuzzy, c-format +msgid "%ld waypoint deleted" +msgid_plural "%ld waypoints deleted" +msgstr[0] "%ld bide-puntua aldatua" +msgstr[1] "%ld bide-puntuak aldatuak" + +#: ../src/viktrwlayer.c:7697 +#, fuzzy +msgid "No duplicates found" +msgstr "Ez da ibilbiderik aurkitu" + +#: ../src/viktrwlayer.c:8028 +#, c-format +msgid "" +"A waypoint with the name \"%s\" already exists. Really rename to the same " +"name?" +msgstr "" +"Lehendik badago \"%s\" izeneko bide-puntua. Benetan nahi duzu izen berarekin " +"berrizendatu?" + +#: ../src/viktrwlayer.c:8058 +#, c-format +msgid "" +"A track with the name \"%s\" already exists. Really rename to the same name?" +msgstr "" +"Lehendik badago \"%s\" izeneko arrastoa. Benetan izen berarekin " +"berrizendatu nahi duzu?" + +#: ../src/viktrwlayer.c:8095 +#, c-format +msgid "" +"A route with the name \"%s\" already exists. Really rename to the same name?" +msgstr "" +"Lehendik badago \"%s\" izeneko ibilbidea. Benetan izen berarekin " +"berrizendatu nahi duzu?" + +#: ../src/viktrwlayer.c:8215 ../src/viktrwlayer.c:8602 +msgid "_Goto" +msgstr "_Joan hona" + +#: ../src/viktrwlayer.c:8226 +msgid "_Visit Geocache Webpage" +msgstr "_Bisitatu Geocache web-orria" + +#: ../src/viktrwlayer.c:8235 +msgid "Geotag multiple images against this waypoint" +msgstr "Geoetiketatu irudiak bide-puntu honekin" + +#: ../src/viktrwlayer.c:8245 ../src/viktrwlayer_waypointlist.c:352 +msgid "_Show Picture..." +msgstr "_Erakutsi irudia..." + +#: ../src/viktrwlayer.c:8253 +msgid "Update Geotag on _Image" +msgstr "_Eguneratu irudiaren Geo-etiketa" + +#: ../src/viktrwlayer.c:8259 +msgid "_Update" +msgstr "_Eguneratu" + +#: ../src/viktrwlayer.c:8264 +msgid "Update and _Keep File Timestamp" +msgstr "Eguneratu eta mantendu fitxategien denbora-markak" + +#: ../src/viktrwlayer.c:8276 +msgid "Visit _Webpage" +msgstr "_Bisitatu web-orria" + +#: ../src/viktrwlayer.c:8306 +msgid "_New Waypoint..." +msgstr "_Bide-puntu berria" + +#: ../src/viktrwlayer.c:8315 +msgid "_View All Waypoints" +msgstr "_Ikusi bideko puntu guztiak" + +#: ../src/viktrwlayer.c:8327 +msgid "Delete _All Waypoints" +msgstr "_Ezabatu bideko puntu guztiak" + +#: ../src/viktrwlayer.c:8333 +msgid "_Delete Waypoints From Selection..." +msgstr "_Ezabatu hautatuako bide-puntu guztiak" + +#: ../src/viktrwlayer.c:8351 +msgid "_Show All Waypoints" +msgstr "_Erakutsi bideko puntu guztiak." + +#: ../src/viktrwlayer.c:8357 +msgid "_Hide All Waypoints" +msgstr "_Ezkutatu bideko puntu guztiak." + +#: ../src/viktrwlayer.c:8369 +msgid "_List Waypoints..." +msgstr "Zerrendatu bide-puntuak..." + +#: ../src/viktrwlayer.c:8390 +msgid "_View All Tracks" +msgstr "_Ikusi arrasto guztiak" + +#: ../src/viktrwlayer.c:8396 +msgid "_New Track" +msgstr "_Arrasto berria" + +#: ../src/viktrwlayer.c:8404 +msgid "Delete _All Tracks" +msgstr "_Ezabatu arrasto guztiak" + +#: ../src/viktrwlayer.c:8410 +msgid "_Delete Tracks From Selection..." +msgstr "_Ezabatu hautatutako arrasto guztiak" + +#: ../src/viktrwlayer.c:8422 +msgid "_Show All Tracks" +msgstr "_Erakutsi arrasto guztiak" + +#: ../src/viktrwlayer.c:8428 +msgid "_Hide All Tracks" +msgstr "_Ezkutatu arrasto guztiak" + +#: ../src/viktrwlayer.c:8439 +msgid "_List Tracks..." +msgstr "_Zerrendatu arrastoak..." + +#: ../src/viktrwlayer.c:8467 +msgid "_View All Routes" +msgstr "_Ikusi ibilbide guztiak" + +#: ../src/viktrwlayer.c:8473 +msgid "_New Route" +msgstr "_Ibilbide berria" + +#: ../src/viktrwlayer.c:8499 +msgid "_Show All Routes" +msgstr "_Erakutsi ibilbide guztiak" + +#: ../src/viktrwlayer.c:8505 +msgid "_Hide All Routes" +msgstr "_Ezkutatu ibilbide guztiak" + +#: ../src/viktrwlayer.c:8516 +msgid "_List Routes..." +msgstr "_Zerrendatu ibilbideak..." + +#: ../src/viktrwlayer.c:8587 +msgid "_View Track" +msgstr "_Ikusi arrastoa" + +#: ../src/viktrwlayer.c:8589 +msgid "_View Route" +msgstr "_Ikusi ibilbidea" + +#: ../src/viktrwlayer.c:8608 +msgid "_Startpoint" +msgstr "_Hasierako puntua" + +#: ../src/viktrwlayer.c:8614 +msgid "\"_Center\"" +msgstr "_Erdia" + +#: ../src/viktrwlayer.c:8620 +msgid "_Endpoint" +msgstr "_Bukaerako puntua" + +#: ../src/viktrwlayer.c:8626 +msgid "_Highest Altitude" +msgstr "_Altituderik handiena" + +#: ../src/viktrwlayer.c:8632 +msgid "_Lowest Altitude" +msgstr "_Altituderik txikiena" + +#: ../src/viktrwlayer.c:8640 +msgid "_Maximum Speed" +msgstr "_Abiadurarik handiena" + +#: ../src/viktrwlayer.c:8646 +#, fuzzy +msgid "_Date" +msgstr "Eguna" + +#: ../src/viktrwlayer.c:8655 +msgid "Co_mbine" +msgstr "_Konbinatu" + +#: ../src/viktrwlayer.c:8663 +msgid "_Merge By Time..." +msgstr "_Batu denboraren arabera" + +#: ../src/viktrwlayer.c:8668 +msgid "Merge _Segments" +msgstr "_Batu segmentuak" + +#: ../src/viktrwlayer.c:8675 +msgid "Merge _With Other Tracks..." +msgstr "_Batu beste arrastoekin" + +#: ../src/viktrwlayer.c:8682 +msgid "_Append Track..." +msgstr "_Erantsi arrastoa" + +#: ../src/viktrwlayer.c:8684 +msgid "_Append Route..." +msgstr "_Erantsi ibilbidea..." + +#: ../src/viktrwlayer.c:8690 +msgid "Append _Route..." +msgstr "Erantsi ibilbidea" + +#: ../src/viktrwlayer.c:8692 +msgid "Append _Track..." +msgstr "_Erantsi arrastoa" + +#: ../src/viktrwlayer.c:8699 +msgid "_Split" +msgstr "_Zatitu" + +#: ../src/viktrwlayer.c:8707 +msgid "_Split By Time..." +msgstr "_Zatitu denboraren arabera..." + +#. ATM always enable this entry - don't want to have to analyse the track before displaying the menu - to keep the menu speedy +#: ../src/viktrwlayer.c:8713 +msgid "Split Se_gments" +msgstr "_Zatitu segmentuak" + +#: ../src/viktrwlayer.c:8719 +msgid "Split By _Number of Points..." +msgstr "_Zatitu puntu-kopuruaren arabera" + +#: ../src/viktrwlayer.c:8724 +msgid "Split at _Trackpoint" +msgstr "_Zatitu arrato-puntuan" + +#: ../src/viktrwlayer.c:8732 +msgid "_Insert Points" +msgstr "_Txertatu puntuak" + +#: ../src/viktrwlayer.c:8738 +msgid "Insert Point _Before Selected Point" +msgstr "Txertatu puntua hautatutako puntuaren aurrean" + +#: ../src/viktrwlayer.c:8745 +msgid "Insert Point _After Selected Point" +msgstr "Txertatu puntua hautatutako puntuaren atzean" + +#: ../src/viktrwlayer.c:8754 +msgid "Delete Poi_nts" +msgstr "_Ezabatu puntuak" + +#: ../src/viktrwlayer.c:8760 +msgid "Delete _Selected Point" +msgstr "Ezabatu hautatutako puntuak" + +#: ../src/viktrwlayer.c:8768 +msgid "Delete Points With The Same _Position" +msgstr "_Ezabatu posizio bereko puntuak" + +#: ../src/viktrwlayer.c:8773 +msgid "Delete Points With The Same _Time" +msgstr "_Ezabatu une bereko puntuak" + +#: ../src/viktrwlayer.c:8780 ../src/viktrwlayer.c:9029 +msgid "_Transform" +msgstr "_Eraldatu" + +#: ../src/viktrwlayer.c:8788 ../src/viktrwlayer.c:9037 +msgid "_Apply DEM Data" +msgstr "_Aplikatu DEM datuak" + +#: ../src/viktrwlayer.c:8793 ../src/viktrwlayer.c:9042 +msgid "_Overwrite" +msgstr "_Gainidatzi" + +#: ../src/viktrwlayer.c:8796 ../src/viktrwlayer.c:9045 +msgid "Overwrite any existing elevation values with DEM values" +msgstr "Gainidatzi dauden altuera datu guztiak DEM balioekin" + +#: ../src/viktrwlayer.c:8799 ../src/viktrwlayer.c:9048 +msgid "_Keep Existing" +msgstr "_Mantendu daudenak" + +#: ../src/viktrwlayer.c:8802 ../src/viktrwlayer.c:9051 +msgid "Keep existing elevation values, only attempt for missing values" +msgstr "Mantendu dauden altuera-balioak, falta diren balioak izan ezik." + +#: ../src/viktrwlayer.c:8807 +msgid "_Smooth Missing Elevation Data" +msgstr "_Leundu galdutako altuera datuak" + +#: ../src/viktrwlayer.c:8812 +msgid "_Interpolated" +msgstr "_Interpolatua" + +#: ../src/viktrwlayer.c:8815 +msgid "" +"Interpolate between known elevation values to derive values for the missing " +"elevations" +msgstr "" +"Interpolatu altuera datu ezagunen artean osatzeko falta diren altuera-datuak" + +#: ../src/viktrwlayer.c:8818 +msgid "_Flat" +msgstr "_Lautu" + +#: ../src/viktrwlayer.c:8821 +msgid "Set unknown elevation values to the last known value" +msgstr "Egokitu altuera datu ezezagunak ezagutzen den azken datuari" + +#: ../src/viktrwlayer.c:8825 +msgid "C_onvert to a Route" +msgstr "Ibilbidea bihurtu" + +#: ../src/viktrwlayer.c:8827 +msgid "C_onvert to a Track" +msgstr "_Arrastoa bihurtu" + +#: ../src/viktrwlayer.c:8835 +msgid "_Anonymize Times" +msgstr "_Ezkutatu denborak" + +#: ../src/viktrwlayer.c:8838 +msgid "Shift timestamps to a relative offset from 1901-01-01" +msgstr "Desplazatu denbora-markak 1901-01-01 datari erreferentzia eginez" + +#: ../src/viktrwlayer.c:8841 +msgid "_Interpolate Times" +msgstr "_Interpolatu denborak" + +#: ../src/viktrwlayer.c:8844 +msgid "" +"Reset trackpoint timestamps between the first and last points such that " +"track is traveled at equal speed" +msgstr "" +"Berrezarri arrasto-puntuen denbora-markak lehenengo eta azkeneko puntuen " +"artean arrastoa abiadura berean erreproduzitzen den bitartean" + +#: ../src/viktrwlayer.c:8849 +msgid "_Reverse Track" +msgstr "_Alderantzizkatu arrastoa" + +#: ../src/viktrwlayer.c:8851 +msgid "_Reverse Route" +msgstr "_Alderantzizkatu ibilbidea" + +#: ../src/viktrwlayer.c:8858 +msgid "Refine Route..." +msgstr "Findu arrastoa..." + +#: ../src/viktrwlayer.c:8868 +msgid "Down_load Maps Along Track..." +msgstr "_Deskargatu arrastoko mapak" + +#: ../src/viktrwlayer.c:8870 +msgid "Down_load Maps Along Route..." +msgstr "_Deskargatu ibilbideko mapak" + +#: ../src/viktrwlayer.c:8878 +msgid "_Export Track as GPX..." +msgstr "_Esportatu arrastoa GPX gisa..." + +#: ../src/viktrwlayer.c:8880 +msgid "_Export Route as GPX..." +msgstr "_Esportatu ibilbidea GPX gisa..." + +#: ../src/viktrwlayer.c:8887 +msgid "E_xtend Track End" +msgstr "_Luzatu arrastoaren bukaera" + +#: ../src/viktrwlayer.c:8889 +msgid "E_xtend Route End" +msgstr "_Luzatu ibilbidearen bukaera" + +#: ../src/viktrwlayer.c:8896 +msgid "Extend _Using Route Finder" +msgstr "_Luzatu ibilbide-bilatzailearen bidez" + +#: ../src/viktrwlayer.c:8911 +msgid "_Upload to GPS..." +msgstr "_GPSra kargatu" + +#: ../src/viktrwlayer.c:8926 +msgid "_Diary" +msgstr "_Agenda" + +#: ../src/viktrwlayer.c:8930 +msgid "Open diary program at this date" +msgstr "Ireki agenda aplikazioa data honetan" + +#: ../src/viktrwlayer.c:8935 +msgid "_Astronomy" +msgstr "_Astronomia" + +#: ../src/viktrwlayer.c:8938 +msgid "Open astronomy program at this date and location" +msgstr "Irekin astronomia aplikazioa data eta leku honetarako" + +#: ../src/viktrwlayer.c:8962 +msgid "_View Google Directions" +msgstr "_Ikusi Google Directions" + +#: ../src/viktrwlayer.c:8984 +msgid "Use with _Filter" +msgstr "_Iragazkia erabili" + +#: ../src/viktrwlayer.c:9018 +msgid "_Edit Trackpoint" +msgstr "_Editatu arrasto-puntua" + +#: ../src/viktrwlayer.c:10116 +#, c-format +msgid " - Gain %dm:Loss %dm" +msgstr " - Lortu %dm:Galdu %dm" + +#: ../src/viktrwlayer.c:10118 +#, c-format +msgid " - Gain %dft:Loss %dft" +msgstr " - Lortu %dft:Galdu %dft" + +#: ../src/viktrwlayer.c:10123 +#, c-format +msgid " - Bearing %3.1f° - Step %s" +msgstr " - Portaera: %3.1f° - Urratsa: %s" + +#: ../src/viktrwlayer.c:10232 +#, c-format +msgid "Querying %s for route between (%.3f, %.3f) and (%.3f, %.3f)." +msgstr "%s kontsultatzen (%.3f, %.3f) eta (%.3f, %.3f) arteko ibilbiderako." + +#: ../src/viktrwlayer.c:10248 +#, c-format +msgid "%s returned route between (%.3f, %.3f) and (%.3f, %.3f)." +msgstr "%s itzulerako ibilbidea (%.3f, %.3f) eta (%.3f, %.3f) puntuen artean." + +#: ../src/viktrwlayer.c:10251 +#, c-format +msgid "Error getting route from %s." +msgstr "Errorea %s-tik ibilbidea lortzen." + +#: ../src/viktrwlayer.c:11070 +#, c-format +msgid "Creating %d Image Thumbnails..." +msgstr "%d irudiaren miniaturak sortzen" + +#: ../src/viktrwlayer.c:11560 +msgid "No map layer in use. Create one first" +msgstr "Ez dago mapa-geruzarik. Sortu bat lehenago" + +#: ../src/viktrwlayer.c:11679 +#, c-format +msgid "%s: Track List" +msgstr "%s: arrastoen zerrenda" + +#: ../src/viktrwlayer.c:11681 +#, c-format +msgid "%s: Route List" +msgstr "%s: ibilbideen zerrenda" + +#: ../src/viktrwlayer.c:11734 +#, c-format +msgid "" +"Could not write external layer %s to %s, please fix and save before exiting " +"or data will be lost" +msgstr "" + +#: ../src/viktrwlayer.c:11782 +#, fuzzy, c-format +msgid "WARNING: issues encountered loading external layer %s from %s" +msgstr "Kontuz: erroreak %s kargatzean" + +#: ../src/viktrwlayer_export.c:47 +msgid "Auto Device GPX Simplify:" +msgstr "" + +#: ../src/viktrwlayer_export.c:48 +msgid "" +"GPX saves to certain devices will be simplified for device compatibility." +msgstr "" + +#: ../src/viktrwlayer_export.c:125 +#, c-format +msgid "Export of GPX file simplified using point limit: %d" +msgstr "" + +#: ../src/viktrwlayer_export.c:206 ../src/viktrwlayer_export.c:323 +#: ../src/vikwindow.c:3694 +msgid "The filename you requested could not be opened for writing." +msgstr "Eskatu duzun fitxategia ezin da ireki idazteko" + +#: ../src/viktrwlayer_export.c:226 +#, c-format +msgid "Could not launch %s." +msgstr "Ezin izan da %s abiatu." + +#: ../src/viktrwlayer_export.c:234 +msgid "Could not create temporary file for export." +msgstr "Ezin da esportatzeko aldi baterako fitxategia sortu" + +#: ../src/viktrwlayer_export.c:268 +msgid "File format:" +msgstr "Fitxategi-formatua:" + +#: ../src/viktrwlayer_export.c:276 +msgid "Select the file format." +msgstr "Hautatu fitxategi-formatua." + +#: ../src/viktrwlayer_export.c:281 +msgid "" +"Select the information to process.\n" +"Warning: the behavior of these switches is highly dependent of the file " +"format selected.\n" +"Please, refer to GPSbabel if unsure." +msgstr "" +"Hautatu prozesatu behar den informazioa.\n" +"Kontuz: parametro horien jokabidea hautatutako formatuaren menpekoa da.\n" +"Seguru ez ba zaude kontsultatu GPSBabel ." + +#: ../src/viktrwlayer_export.c:308 +msgid "You did not select a valid file format." +msgstr "Ez duzu hautatu baliozko fitxategi-formaturik." + +#: ../src/viktrwlayer_propwin.c:915 ../src/viktrwlayer_propwin.c:3381 +#: ../src/viktrwlayer_propwin.c:3417 ../src/viktrwlayer_propwin.c:3457 +#: ../src/viktrwlayer_propwin.c:3509 ../src/viktrwlayer_propwin.c:3527 +#: ../src/viktrwlayer_propwin.c:3600 ../src/viktrwlayer_propwin.c:3601 +#: ../src/viktrwlayer_propwin.c:3602 ../src/viktrwlayer_propwin.c:3611 +#: ../src/viktrwlayer_propwin.c:3612 ../src/viktrwlayer_propwin.c:3629 +#: ../src/viktrwlayer_propwin.c:3630 ../src/viktrwlayer_propwin.c:3644 +#: ../src/viktrwlayer_propwin.c:3645 ../src/viktrwlayer_propwin.c:3646 +#: ../src/viktrwlayer_propwin.c:3660 ../src/viktrwlayer_propwin.c:3661 +#: ../src/viktrwlayer_propwin.c:3662 ../src/viktrwlayer_propwin.c:3676 +#: ../src/viktrwlayer_propwin.c:3677 ../src/viktrwlayer_propwin.c:3678 +#: ../src/viktrwlayer_propwin.c:3695 ../src/viktrwlayer_propwin.c:3696 +#: ../src/viktrwlayer_analysis.c:293 +#, c-format +msgid "No Data" +msgstr "Daturik ez" + +#: ../src/viktrwlayer_propwin.c:960 ../src/viktrwlayer_propwin.c:1245 +#, c-format +msgid "%.1f kph" +msgstr "%.1f k/h" + +#: ../src/viktrwlayer_propwin.c:963 ../src/viktrwlayer_propwin.c:1248 +#: ../src/viktrwlayer_analysis.c:352 +#, c-format +msgid "%.1f mph" +msgstr "%.1f m/h" + +#: ../src/viktrwlayer_propwin.c:966 ../src/viktrwlayer_propwin.c:1251 +#, c-format +msgid "%.1f knots" +msgstr "%.1f korapilo" + +#: ../src/viktrwlayer_propwin.c:969 ../src/viktrwlayer_propwin.c:1254 +#, fuzzy, c-format +msgid "%.1f s/km" +msgstr "%.1f km" + +#: ../src/viktrwlayer_propwin.c:972 ../src/viktrwlayer_propwin.c:1257 +#: ../src/viktrwlayer_analysis.c:389 ../src/viktrwlayer_analysis.c:392 +#, fuzzy, c-format +msgid "%.1f min/km" +msgstr "%.1f km" + +#: ../src/viktrwlayer_propwin.c:975 ../src/viktrwlayer_propwin.c:1260 +#, fuzzy, c-format +msgid "%.1f sec/mi" +msgstr "%.1f milia" + +#: ../src/viktrwlayer_propwin.c:978 ../src/viktrwlayer_propwin.c:1263 +#: ../src/viktrwlayer_analysis.c:409 ../src/viktrwlayer_analysis.c:412 +#, fuzzy, c-format +msgid "%.1f min/mi" +msgstr "%.1f m/s" + +#. VIK_UNITS_SPEED_METRES_PER_SECOND: +#: ../src/viktrwlayer_propwin.c:982 ../src/viktrwlayer_propwin.c:1267 +#, c-format +msgid "%.1f m/s" +msgstr "%.1f m/s" + +#. Minutes +#: ../src/viktrwlayer_propwin.c:1411 +msgid "mins" +msgstr "min" + +#. Hours +#: ../src/viktrwlayer_propwin.c:1418 +msgid "h" +msgstr "o" + +#. Days +#: ../src/viktrwlayer_propwin.c:1424 +msgid "d" +msgstr "eg" + +#. Weeks +#: ../src/viktrwlayer_propwin.c:1429 +msgid "w" +msgstr "aste" + +#. 'Months' +#: ../src/viktrwlayer_propwin.c:1433 +msgid "M" +msgstr "hil" + +#: ../src/viktrwlayer_propwin.c:2051 ../src/viktrwlayer_analysis.c:303 +#, c-format +msgid "%.1f miles" +msgstr "%.1f milia" + +#: ../src/viktrwlayer_propwin.c:2054 ../src/viktrwlayer_analysis.c:306 +#, c-format +msgid "%.1f NM" +msgstr "%.1f NM" + +#. VIK_UNITS_DISTANCE_KILOMETRES +#: ../src/viktrwlayer_propwin.c:2057 ../src/viktrwlayer_analysis.c:310 +#, c-format +msgid "%.1f km" +msgstr "%.1f km" + +#: ../src/viktrwlayer_propwin.c:3083 +msgid "Failed spliting track. Track unchanged" +msgstr "Errorea arraztoa zatitzen. Arrastoa ez da aldatu" + +#: ../src/viktrwlayer_propwin.c:3234 ../src/viktrwlayer_propwin.c:3744 +#, c-format +msgid "%s - Track Properties" +msgstr "%s - arrastoaren propietatateak" + +#: ../src/viktrwlayer_propwin.c:3239 +msgid "Split at _Marker" +msgstr "_Zatitu markatzailean" + +#: ../src/viktrwlayer_propwin.c:3240 +msgid "Split _Segments" +msgstr "_Zatitu segmentuak" + +#: ../src/viktrwlayer_propwin.c:3241 +msgid "_Reverse" +msgstr "_Alderantzikatu" + +#: ../src/viktrwlayer_propwin.c:3242 +msgid "_Delete Dupl." +msgstr "_Ezabatu bikoiztutakoak" + +#: ../src/viktrwlayer_propwin.c:3269 +msgid "Comment:" +msgstr "Iruzkina:" + +#: ../src/viktrwlayer_propwin.c:3270 +msgid "Description:" +msgstr "Deskribapena:" + +#: ../src/viktrwlayer_propwin.c:3271 +#, fuzzy +msgid "Source:" +msgstr "Norabidea::" + +#: ../src/viktrwlayer_propwin.c:3272 +#, fuzzy +msgid "Type:" +msgstr "Denbora:" + +#: ../src/viktrwlayer_propwin.c:3273 +msgid "Color:" +msgstr "Kolorea::" + +#: ../src/viktrwlayer_propwin.c:3274 +msgid "Draw Name:" +msgstr "Marraztu izena:" + +#: ../src/viktrwlayer_propwin.c:3275 +msgid "Distance Labels:" +msgstr "Distantzia-etiketak:" + +#: ../src/viktrwlayer_propwin.c:3278 +msgid "Track Length:" +msgstr "Arrastoaren luzera::" + +#: ../src/viktrwlayer_propwin.c:3279 +msgid "Trackpoints:" +msgstr "Arrasto-puntuak:" + +#: ../src/viktrwlayer_propwin.c:3280 +msgid "Segments:" +msgstr "Segmentuak:" + +#: ../src/viktrwlayer_propwin.c:3281 +msgid "Duplicate Points:" +msgstr "Bikoiztutako puntuak:" + +#: ../src/viktrwlayer_propwin.c:3282 +msgid "Max Speed:" +msgstr "Abiadura handiena:" + +#: ../src/viktrwlayer_propwin.c:3283 +msgid "Avg. Speed:" +msgstr "Batez besteko abiadura:" + +#: ../src/viktrwlayer_propwin.c:3284 +msgid "Moving Avg. Speed:" +msgstr "Batez besteko abiadura mugimenduan:" + +#: ../src/viktrwlayer_propwin.c:3285 +msgid "Avg. Dist. Between TPs:" +msgstr "Arrasto-puntuen batez besteko distantzia:" + +#: ../src/viktrwlayer_propwin.c:3286 +msgid "Elevation Range:" +msgstr "Altitude-tartea:" + +#: ../src/viktrwlayer_propwin.c:3287 +msgid "Total Elevation Gain/Loss:" +msgstr "Altitudea denetara Lortua/Galdua:" + +#: ../src/viktrwlayer_propwin.c:3288 +msgid "Start:" +msgstr "CopyHasi:" + +#: ../src/viktrwlayer_propwin.c:3289 +msgid "End:" +msgstr "Bukaera:" + +#: ../src/viktrwlayer_propwin.c:3290 +msgid "Duration:" +msgstr "Iraupena:" + +#: ../src/viktrwlayer_propwin.c:3320 +msgid "Centre" +msgstr "Erdiko gunea" + +#: ../src/viktrwlayer_propwin.c:3321 +msgid "Start only" +msgstr "Hasiera bakarrik" + +#: ../src/viktrwlayer_propwin.c:3322 +msgid "End only" +msgstr "Bukaera bakarrik" + +#: ../src/viktrwlayer_propwin.c:3323 +msgid "Start and End" +msgstr "Hasiera eta bukaera" + +#: ../src/viktrwlayer_propwin.c:3324 +msgid "Centre, Start and End" +msgstr "Erdiko gunea, hasiera eta bukaera" + +#: ../src/viktrwlayer_propwin.c:3336 +msgid "Maximum number of distance labels to be shown" +msgstr "Erakutsi behar den distantzia-etiketen gehienezko kopurua" + +#: ../src/viktrwlayer_propwin.c:3340 +msgid "Properties" +msgstr "Propietateak" + +#: ../src/viktrwlayer_propwin.c:3584 +#, c-format +msgid "%d minutes - %d minutes moving" +msgstr "%d minutu - %d minutu mugitzen" + +#: ../src/viktrwlayer_propwin.c:3596 +#, c-format +msgid "%s total - %s in segments" +msgstr "%s denetara - %s segmentutan" + +#: ../src/viktrwlayer_propwin.c:3607 ../src/viktrwlayer_analysis.c:622 +msgid "Statistics" +msgstr "Estatistikak" + +#: ../src/viktrwlayer_propwin.c:3613 ../src/viktrwlayer_propwin.c:3680 +msgid "Show D_EM" +msgstr "_Erakutsi DEM" + +#: ../src/viktrwlayer_propwin.c:3615 ../src/viktrwlayer_propwin.c:3631 +#: ../src/viktrwlayer_propwin.c:3647 ../src/viktrwlayer_propwin.c:3697 +msgid "Show _GPS Speed" +msgstr "_Erakutsi GPS-abiadura" + +#: ../src/viktrwlayer_propwin.c:3617 ../src/viktrwlayer_propwin.c:3633 +#: ../src/viktrwlayer_propwin.c:3665 ../src/viktrwlayer_propwin.c:3699 +msgid "Track Distance:" +msgstr "Arrastoaren distantzia:" + +#: ../src/viktrwlayer_propwin.c:3618 ../src/viktrwlayer_propwin.c:3684 +msgid "Track Height:" +msgstr "Arrastoaren altuera:" + +#: ../src/viktrwlayer_propwin.c:3624 +msgid "Elevation-distance" +msgstr "Altuera-distantzia" + +#: ../src/viktrwlayer_propwin.c:3634 +msgid "Track Gradient:" +msgstr "Arrastoaren gradientea:" + +#: ../src/viktrwlayer_propwin.c:3639 +msgid "Gradient-distance" +msgstr "Gradiente-distantzia" + +#: ../src/viktrwlayer_propwin.c:3649 ../src/viktrwlayer_propwin.c:3666 +#: ../src/viktrwlayer_propwin.c:3683 +msgid "Track Time:" +msgstr "Arrastoaren denbora:" + +#: ../src/viktrwlayer_propwin.c:3650 ../src/viktrwlayer_propwin.c:3700 +msgid "Track Speed:" +msgstr "Arrastoaren abiadura:" + +#: ../src/viktrwlayer_propwin.c:3651 ../src/viktrwlayer_propwin.c:3667 +#: ../src/viktrwlayer_propwin.c:3685 +msgid "Time/Date:" +msgstr "Denbora/Data:" + +#: ../src/viktrwlayer_propwin.c:3655 +msgid "Speed-time" +msgstr "Abiadura-denbora" + +#: ../src/viktrwlayer_propwin.c:3663 ../src/viktrwlayer_propwin.c:3679 +msgid "Show S_peed" +msgstr "_Erakutsi abiadura" + +#: ../src/viktrwlayer_propwin.c:3671 +msgid "Distance-time" +msgstr "Distantzia-denbora" + +#: ../src/viktrwlayer_propwin.c:3690 +msgid "Elevation-time" +msgstr "Altuera-denbora" + +#: ../src/viktrwlayer_propwin.c:3705 +msgid "Speed-distance" +msgstr "Abiadura-distantzia" + +#: ../src/viktrwlayer_tpwin.c:190 ../src/viktrwlayer_wpwin.c:66 +msgid "Date/Time Edit" +msgstr "Data/Denbora editatu" + +#: ../src/viktrwlayer_tpwin.c:242 +msgid "Name:" +msgstr "Izena:" + +#: ../src/viktrwlayer_tpwin.c:243 +msgid "Latitude:" +msgstr "Latitudea:" + +#: ../src/viktrwlayer_tpwin.c:244 +msgid "Longitude:" +msgstr "Longitudea:" + +#: ../src/viktrwlayer_tpwin.c:245 +msgid "Altitude:" +msgstr "Altitudea:" + +#: ../src/viktrwlayer_tpwin.c:246 +msgid "Course:" +msgstr "Norabidea::" + +#: ../src/viktrwlayer_tpwin.c:247 +msgid "Timestamp:" +msgstr "Denbora-marka:" + +#: ../src/viktrwlayer_tpwin.c:248 +msgid "Time:" +msgstr "Denbora:" + +#: ../src/viktrwlayer_tpwin.c:249 +msgid "Distance Difference:" +msgstr "Distantzia aldea:" + +#: ../src/viktrwlayer_tpwin.c:250 +msgid "Time Difference:" +msgstr "Denbora aldea:" + +#: ../src/viktrwlayer_tpwin.c:251 +msgid "\"Speed\" Between:" +msgstr "\"Lastertasuna\" hauen artean:" + +#: ../src/viktrwlayer_tpwin.c:252 +msgid "Speed:" +msgstr "Abiadura:" + +#: ../src/viktrwlayer_tpwin.c:253 +msgid "VDOP:" +msgstr "" +"VDOP (Vertical Dilution of Position; Kokapenaren diluzio bertikala):" + +#: ../src/viktrwlayer_tpwin.c:254 +msgid "HDOP:" +msgstr "" +"HDOP (Horizontal Dilution of Position; Kokapenaren diluzio horizontala):" + +#: ../src/viktrwlayer_tpwin.c:255 +msgid "PDOP:" +msgstr "" +"PDOP (Position Dilution of Precision; Kokapenaren zehaztasunezko " +"diluzioa):" + +#: ../src/viktrwlayer_tpwin.c:256 +msgid "SAT/FIX:" +msgstr "SAT/FIX (konpondu satelitearekikoa):" + +#: ../src/viktrwlayer_tpwin.c:263 ../src/viktrwlayer_tpwin.c:408 +#: ../src/viktrwlayer_tpwin.c:622 +msgid "Trackpoint" +msgstr "Arrasto-puntua" + +#: ../src/viktrwlayer_tpwin.c:266 +msgid "_Insert After" +msgstr "_Txertatu ondoren" + +#: ../src/viktrwlayer_tpwin.c:268 +msgid "Split Here" +msgstr "Moztu hemen" + +#: ../src/viktrwlayer_tracklist.c:262 ../src/viktrwlayer_waypointlist.c:306 +msgid "_Copy Data" +msgstr "Kopiatu datuak" + +#. +#. item = gtk_image_menu_item_new_with_mnemonic ( _("_Select") ); +#. gtk_image_menu_item_set_image ( (GtkImageMenuItem*)item, gtk_image_new_from_stock (GTK_STOCK_FIND, GTK_ICON_SIZE_MENU) ); +#. g_signal_connect_swapped ( G_OBJECT(item), "activate", G_CALLBACK(trw_layer_track_select), values ); +#. gtk_menu_shell_append (GTK_MENU_SHELL (menu), item); +#. gtk_widget_show ( item ); +#. +#. ATM view auto selects, so don't bother with separate select menu entry +#. +#. item = gtk_image_menu_item_new_with_mnemonic ( _("_Select") ); +#. gtk_image_menu_item_set_image ( (GtkImageMenuItem*)item, gtk_image_new_from_stock (GTK_STOCK_FIND, GTK_ICON_SIZE_MENU) ); +#. g_signal_connect_swapped ( G_OBJECT(item), "activate", G_CALLBACK(trw_layer_waypoint_select), values ); +#. gtk_menu_shell_append (GTK_MENU_SHELL (menu), item); +#. gtk_widget_show ( item ); +#. +#. AUTO SELECT NOT TRUE YET... +#. ATM view auto selects, so don't bother with separate select menu entry +#: ../src/viktrwlayer_tracklist.c:290 ../src/viktrwlayer_waypointlist.c:341 +#: ../src/vikwindow.c:4816 +msgid "_View" +msgstr "_Ikusi" + +#. Insert column for the layer name when viewing multi layers +#: ../src/viktrwlayer_tracklist.c:613 ../src/viktrwlayer_waypointlist.c:609 +msgid "Layer" +msgstr "Geruza" + +#: ../src/viktrwlayer_tracklist.c:627 ../src/viktrwlayer_waypointlist.c:624 +msgid "Date" +msgstr "Eguna" + +#: ../src/viktrwlayer_tracklist.c:631 ../src/viktrwlayer_waypointlist.c:628 +msgid "Visible" +msgstr "Agerian" + +#: ../src/viktrwlayer_tracklist.c:639 +msgid "" +"Distance\n" +"(miles)" +msgstr "" +"Distantzia\n" +"(miliak)" + +#: ../src/viktrwlayer_tracklist.c:642 +#, fuzzy +msgid "" +"Distance\n" +"(NM)" +msgstr "Distantzia" + +#: ../src/viktrwlayer_tracklist.c:645 +msgid "" +"Distance\n" +"(km)" +msgstr "Distantzia" + +#: ../src/viktrwlayer_tracklist.c:651 +msgid "" +"Length\n" +"(minutes)" +msgstr "" +"Iraupena\n" +"(minutuak)" + +#: ../src/viktrwlayer_tracklist.c:660 ../src/vikutils.c:93 +msgid "sec/mi" +msgstr "" + +#: ../src/viktrwlayer_tracklist.c:666 +#, c-format +msgid "" +"Av. Speed\n" +"(%s)" +msgstr "" +"Batez besteko abiadura\n" +"(%s)" + +#. Apply own formatting of the data +#: ../src/viktrwlayer_tracklist.c:671 +#, c-format +msgid "" +"Max Speed\n" +"(%s)" +msgstr "" +"Abiadura handiena\n" +"(%s)" + +#: ../src/viktrwlayer_tracklist.c:679 ../src/viktrwlayer_waypointlist.c:637 +msgid "" +"Max Height\n" +"(Feet)" +msgstr "" +"Altuera handiena\n" +"(oinak)" + +#: ../src/viktrwlayer_tracklist.c:681 ../src/viktrwlayer_waypointlist.c:639 +msgid "" +"Max Height\n" +"(Metres)" +msgstr "" +"Altuera handiena\n" +"(metroak)" + +#: ../src/viktrwlayer_waypointlist.c:312 +msgid "Copy Data (with _positions)" +msgstr "Kopiatu datuak (kokapenekin)" + +#: ../src/viktrwlayer_waypointlist.c:633 +msgid "Comment" +msgstr "Iruzkina" + +#: ../src/viktrwlayer_waypointlist.c:643 +msgid "Symbol" +msgstr "Ikurra" + +#: ../src/viktrwlayer_wpwin.c:93 ../src/viktrwlayer_wpwin.c:302 +msgid "True" +msgstr "" + +#: ../src/viktrwlayer_wpwin.c:122 +msgid "Waypoint Properties" +msgstr "Bide-puntuaren propietateak" + +#: ../src/viktrwlayer_wpwin.c:164 +msgid "Name:" +msgstr "Izena:" + +#: ../src/viktrwlayer_wpwin.c:181 +msgid "Altitude:" +msgstr "Altitudea:" + +#: ../src/viktrwlayer_wpwin.c:186 ../src/viktrwlayer_wpwin.c:188 +msgid "Comment:" +msgstr "Iruzkina:" + +#: ../src/viktrwlayer_wpwin.c:202 +#, fuzzy +msgid "Source:" +msgstr "Deskargatu iturria:" + +#: ../src/viktrwlayer_wpwin.c:212 +msgid "Image:" +msgstr "Irudia:" + +#: ../src/viktrwlayer_wpwin.c:217 +msgid "Symbol:" +msgstr "Ikurra:" + +#: ../src/viktrwlayer_wpwin.c:226 +msgid "(none)" +msgstr "(bat ere ez)" + +#. Geotag Info [readonly] +#: ../src/viktrwlayer_wpwin.c:272 +msgid "Has Geotag" +msgstr "Has geoetiketa" + +#: ../src/viktrwlayer_wpwin.c:279 +msgid "Consistent Position" +msgstr "Kokapen koherentea" + +#. ATM the direction value box is always shown, even when there is no information. +#. It would be nice to be able to hide it until the 'Add' has been performed, +#. however I've not been able to achieve this. +#. Thus simply sensistizing it instead. +#: ../src/viktrwlayer_wpwin.c:292 +#, fuzzy +msgid "Image Direction:" +msgstr "Irudiaren denbora-zona" + +#: ../src/viktrwlayer_wpwin.c:300 +msgid "Magnetic" +msgstr "" + +#: ../src/viktrwlayer_wpwin.c:320 +msgid "Time:" +msgstr "Ordua:" + +#. TODO: other checks (isalpha or whatever ) +#: ../src/viktrwlayer_wpwin.c:386 +msgid "Please enter a name for the waypoint." +msgstr "Eman iezaiozu izen bat bide-puntuari, mesedez." + +#: ../src/viktrwlayer_geotag.c:320 ../src/viktrwlayer_geotag.c:460 +#, c-format +msgid "Failed updating EXIF on %s" +msgstr "Huts egin du kargatzen EXIF %s-n" + +#: ../src/viktrwlayer_geotag.c:562 +#, c-format +msgid "Geotagging %d Images..." +msgstr "%d irudiak geo-etiketatzen..." + +#: ../src/viktrwlayer_geotag.c:630 +msgid "Geotag Images" +msgstr "Geo-etiketatu irudiak" + +#: ../src/viktrwlayer_geotag.c:640 +msgid "Images" +msgstr "Irudiak" + +#: ../src/viktrwlayer_geotag.c:645 +msgid "Overwrite Existing Waypoints:" +msgstr "Gainidatzi dauden bide-puntuak" + +#: ../src/viktrwlayer_geotag.c:648 +msgid "Overwrite Existing GPS Information:" +msgstr "Gainidatzi dagoen GPS-informazioa" + +#: ../src/viktrwlayer_geotag.c:650 +msgid "Keep File Modification Timestamp:" +msgstr "Mantendu fitxategi aldatuaren denbora-marka:" + +#: ../src/viktrwlayer_geotag.c:684 +msgid "Create Waypoints:" +msgstr "Sortu bide-puntuak:" + +#: ../src/viktrwlayer_geotag.c:693 +msgid "Write EXIF:" +msgstr "Idatzi EXIF:" + +#: ../src/viktrwlayer_geotag.c:705 +msgid "Automatic Image Direction:" +msgstr "" + +#: ../src/viktrwlayer_geotag.c:707 +msgid "Set image direction based on a heading derived from the track" +msgstr "" + +#: ../src/viktrwlayer_geotag.c:710 +msgid "Interpolate Between Track Segments:" +msgstr "Interpolatu arraso-segmentuen artean" + +#: ../src/viktrwlayer_geotag.c:715 +msgid "Image Time Offset (Seconds):" +msgstr "Irudiarekiko denbora jauzia (segundoak):" + +#: ../src/viktrwlayer_geotag.c:718 +msgid "" +"The number of seconds to ADD to the photos time to make it match the GPS " +"data. Calculate this with (GPS - Photo). Can be negative or positive. Useful " +"to adjust times when a camera's timestamp was incorrect." +msgstr "" +"Argazkien denbora-marketara GEHITU beharreko segundo kopurua GPS datuekin " +"bat egiteko. Kalkula ezazu (GPS - Photo) hori erabiliz. Positibo zein " +"negatibo izan daiteke. Erabilgarria oso argazki-kameraren denbora-zigiluak " +"huts egin duenean." + +#: ../src/viktrwlayer_geotag.c:721 +msgid "Image Timezone:" +msgstr "Irudiaren denbora-zona" + +#: ../src/viktrwlayer_geotag.c:724 +msgid "" +"The timezone that was used when the images were created. For example, if a " +"camera is set to AWST or +8:00 hours. Enter +8:00 here so that the correct " +"adjustment to the images' time can be made. GPS data is always in UTC." +msgstr "" +"Ordu-zonaldea erabili izan da irudiak sortzerakoan. Esate baterako, kamera " +"batean lehenetsita baldin badago +8:00 ordua, sartu +8:00 hemen ere eta " +"horrela konponduko dituzu aurretik behar bada egin dituzun beste doiketa " +"batzuk. GPS datuak beti daude UTC (Ordu Unibertsal Koordinatua) horren " +"arabera doiturik." + +#: ../src/viktrwlayer_geotag.c:728 +#, c-format +msgid "Using waypoint: %s" +msgstr "Erabiltzen ari den bide-puntua: %s" + +#: ../src/viktrwlayer_geotag.c:742 +#, c-format +msgid "Using track: %s" +msgstr "Arrastoa erabiltzen: %s" + +#: ../src/viktrwlayer_geotag.c:744 +#, c-format +msgid "Using all tracks in: %s" +msgstr "Hemengo arrasto guztiak erabiltzen: %s" + +#: ../src/viktrwlayer_analysis.c:214 +msgid "Number of Tracks" +msgstr "Arrasto-kopurua" + +#: ../src/viktrwlayer_analysis.c:215 +msgid "Date Range" +msgstr "Data-bitartea" + +#: ../src/viktrwlayer_analysis.c:216 +msgid "Total Length" +msgstr "Luzera denetara" + +#: ../src/viktrwlayer_analysis.c:217 +msgid "Average Length" +msgstr "Batez besteko luzera" + +#: ../src/viktrwlayer_analysis.c:218 +msgid "Eddington number" +msgstr "" + +#. No.4: Extended display only +#: ../src/viktrwlayer_analysis.c:219 +msgid "Max Speed" +msgstr "Abiadura handiena" + +#: ../src/viktrwlayer_analysis.c:220 +msgid "Avg. Speed" +msgstr "Batez besteko abiadura" + +#: ../src/viktrwlayer_analysis.c:221 +msgid "Minimum Altitude" +msgstr "Altuera txikiena" + +#: ../src/viktrwlayer_analysis.c:222 +msgid "Maximum Altitude" +msgstr "Altuera handiena" + +#: ../src/viktrwlayer_analysis.c:223 +msgid "Total Elevation Gain/Loss" +msgstr "Altuera denetara Galdu/Irabaziak" + +#: ../src/viktrwlayer_analysis.c:224 +msgid "Avg. Elevation Gain/Loss" +msgstr "Batez besteko altuera Galdu/Irabaziak" + +#: ../src/viktrwlayer_analysis.c:225 +msgid "Total Duration" +msgstr "Iraupena denetara" + +#: ../src/viktrwlayer_analysis.c:226 +msgid "Avg. Duration" +msgstr "Batez besteko iraupena" + +#: ../src/viktrwlayer_analysis.c:317 +#, c-format +msgid "%.2f miles" +msgstr "%.2f milia" + +#: ../src/viktrwlayer_analysis.c:320 +#, fuzzy, c-format +msgid "%.2f NM" +msgstr "%.1f NM" + +#. VIK_UNITS_DISTANCE_KILOMETRES +#: ../src/viktrwlayer_analysis.c:324 +#, c-format +msgid "%.2f km" +msgstr "%.2f km" + +#: ../src/viktrwlayer_analysis.c:361 +#, c-format +msgid "%.2f m/s" +msgstr "%.2f m/s" + +#: ../src/viktrwlayer_analysis.c:370 ../src/viktrwlayer_analysis.c:373 +#, c-format +msgid "%.2f knots" +msgstr "%.2f korapilo" + +#: ../src/viktrwlayer_analysis.c:379 ../src/viktrwlayer_analysis.c:382 +#, c-format +msgid "%d s/km" +msgstr "" + +#: ../src/viktrwlayer_analysis.c:399 ../src/viktrwlayer_analysis.c:402 +#, c-format +msgid "%d sec/mi" +msgstr "" + +#: ../src/viktrwlayer_analysis.c:420 ../src/viktrwlayer_analysis.c:423 +#, c-format +msgid "%.2f km/h" +msgstr "%.2f km/h" + +#: ../src/viktrwlayer_analysis.c:434 ../src/viktrwlayer_analysis.c:440 +#, c-format +msgid "%d feet" +msgstr "%d oin" + +#: ../src/viktrwlayer_analysis.c:445 ../src/viktrwlayer_analysis.c:447 +#, c-format +msgid "%d feet / %d feet" +msgstr "%d oin / %d oin" + +#: ../src/viktrwlayer_analysis.c:452 ../src/viktrwlayer_analysis.c:458 +#, c-format +msgid "%d m" +msgstr "%d m" + +#: ../src/viktrwlayer_analysis.c:463 ../src/viktrwlayer_analysis.c:465 +#, c-format +msgid "%d m / %d m" +msgstr "%d m / %d m" + +#: ../src/viktrwlayer_analysis.c:477 +#, c-format +msgid "%d:%02d:%02d days:hrs:mins" +msgstr "%d:%02d:%02d egun:ordu:min" + +#: ../src/viktrwlayer_analysis.c:484 +#, c-format +msgid "%d:%02d hrs:mins" +msgstr "%d:%02d ordu:min" + +#: ../src/viktrwlayer_analysis.c:658 +msgid "Include Invisible Items" +msgstr "Gehitu elementu ikusezinak" + +#: ../src/vikstatus.c:129 +msgid "Current number of background tasks. Click to see the background jobs." +msgstr "Atzeko planoko uneko atazen kopurua. Egin klik atzeko atazak ikusteko." + +#: ../src/vikstatus.c:134 +msgid "Current zoom level. Click to select a new one." +msgstr "Uneko zoom maila. Klikatu beste bat hautatzeko." + +#: ../src/vikstatus.c:141 +msgid "Left click to clear the message. Right click to copy the message." +msgstr "Ezker klik mezua garbitzeko. Eskuin klik mezua kopiatzeko." + +#: ../src/vikutils.c:108 +msgid "GPSD" +msgstr "GPSD" + +#. GPS Preamble +#: ../src/vikutils.c:109 +msgid "Trkpt" +msgstr "Arrasto-puntua" + +#: ../src/vikutils.c:160 +#, c-format +msgid "%sSpeed%s %.1f%s" +msgstr "%sAbiadura%s %.1f%s" + +#. Go for 2dp as expect low values for vertical speeds +#: ../src/vikutils.c:214 +#, c-format +msgid "%sClimb%s %.2f%s" +msgstr "%sJauzi%s %.2f%s" + +#: ../src/vikutils.c:223 +#, c-format +msgid "%sAlt %dfeet" +msgstr "%sAlt %doin" + +#. VIK_UNITS_HEIGHT_METRES: +#: ../src/vikutils.c:227 +#, c-format +msgid "%sAlt %dm" +msgstr "%sAlt %dm" + +#: ../src/vikutils.c:235 +#, c-format +msgid "%sCourse %03d°" +msgstr "%sNorabidea %03d°" + +#: ../src/vikutils.c:249 +msgid "yards" +msgstr "yarda" + +#. VIK_UNITS_DISTANCE_KILOMETRES: +#: ../src/vikutils.c:253 +msgid "m" +msgstr "m" + +#: ../src/vikutils.c:257 +#, c-format +msgid "%sDistance diff %d%s" +msgstr "%sDistantzia aldea %d%s" + +#: ../src/vikutils.c:272 +#, c-format +msgid "%sTime %s" +msgstr "%sDenbora %s" + +#: ../src/vikutils.c:281 +#, c-format +msgid "%sTime diff %lds" +msgstr "%sDenbora aldea %lds" + +#: ../src/vikutils.c:287 +#, c-format +msgid "%sNo. of Sats %d" +msgstr "%sSatelite-kopurua %d" + +#: ../src/vikutils.c:312 +#, c-format +msgid "%sTo End %.2f%s" +msgstr "%sbukatzeko %.2f%s" + +#: ../src/vikutils.c:339 +#, c-format +msgid "%sDistance along %.2f%s" +msgstr "%sDistantzia denetara %.2f%s" + +#: ../src/vikutils.c:359 +#, c-format +msgid "%sTrack: %s" +msgstr "%sArrastoa: %s" + +#: ../src/vikutils.c:396 +#, c-format +msgid "" +"There is a newer version of Viking available: %s\n" +"\n" +"Do you wish to go to Viking's website now?" +msgstr "" +"Vikign bertsio berria dago eskuragarri: %s\n" +"Joan nahi duzu orain Viking-en web-orrira." + +#: ../src/vikutils.c:526 +msgid "" +"This appears to be Viking's very first run.\n" +"\n" +"Do you wish to enable automatic internet features?\n" +"\n" +"Individual settings can be controlled in the Preferences." +msgstr "" +"Badirudi hau dela Viking exekutatzen den estreinako aldia.\n" +"\n" +"Nahi duzu interneteko eginbide automatikoak gaitzea?\n" +"\n" +"Nork bere ezarpenak egokitu ditzake hobespenetan." + +#: ../src/vikwaypoint.c:37 +msgid "Waypoint" +msgstr "Bide-puntua" + +#: ../src/vikwebtool_datasource.c:352 +msgid "Search Term" +msgstr "Bilaketa-terminoa" + +#. TODO get rid of this as this is unnecessary duplication... +#: ../src/vikwindow.c:258 +msgid "Pan" +msgstr "Desplazamendua" + +#: ../src/vikwindow.c:258 +msgid "Zoom" +msgstr "Zooma" + +#: ../src/vikwindow.c:258 +msgid "Ruler" +msgstr "Erregela" + +#: ../src/vikwindow.c:258 +msgid "Select" +msgstr "Hautatu" + +#: ../src/vikwindow.c:368 +msgid "This is Viking " +msgstr "" + +#: ../src/vikwindow.c:457 +msgid "Location lookup aborted" +msgstr "Kokapen-bilaketa etenda" + +#: ../src/vikwindow.c:477 +#, c-format +msgid "Location found: %s" +msgstr "Kokapena aurkitu: %s" + +#: ../src/vikwindow.c:486 +msgid "Unable to determine location" +msgstr "Ezin da kokapena zehaztu" + +#: ../src/vikwindow.c:495 +msgid "Determining location" +msgstr "Kokapena zehazten" + +#: ../src/vikwindow.c:525 +#, fuzzy, c-format +msgid "Location found via geoclue" +msgstr "Kokapena aurkitu: %s" + +#: ../src/vikwindow.c:546 +msgid "Default Map" +msgstr "Mapa lehenetsia" + +#: ../src/vikwindow.c:557 ../src/vikwindow.c:3938 +msgid "Trying to determine location..." +msgstr "Kokapena zehazten..." + +#. Create tooltip +#: ../src/vikwindow.c:723 +msgid "Select zoom level" +msgstr "Hautatu zoom-maila" + +#: ../src/vikwindow.c:1176 +#, c-format +msgid "" +"Do you want to save the changes you made to the document \"%s\"?\n" +"\n" +"Your changes will be lost if you don't save them." +msgstr "" +"Gorde nahi duzu \"%s\" dokumentuan egindako aldaketak?\n" +"\n" +"Zuk egindako aldaketak gal daitezke gordetzen ez baduzu." + +#: ../src/vikwindow.c:1180 +msgid "Don't Save" +msgstr "Ez gorde" + +#: ../src/vikwindow.c:1268 +msgid "mpp" +msgstr "mpp" + +#: ../src/vikwindow.c:1268 +msgid "pixelfact" +msgstr "pixel-faktorea" + +#: ../src/vikwindow.c:1467 +#, c-format +msgid "%s %s %dm" +msgstr "%s %s %dm" + +#: ../src/vikwindow.c:1469 +#, c-format +msgid "%s %s %dft" +msgstr "%s %s %doin" + +#: ../src/vikwindow.c:1472 +#, c-format +msgid "%s %s" +msgstr "%s %s" + +#: ../src/vikwindow.c:1929 +msgid "_Ruler" +msgstr "_Erregela" + +#: ../src/vikwindow.c:1929 +msgid "Ruler Tool" +msgstr "Erregela-tresna" + +#: ../src/vikwindow.c:2204 ../src/vikwindow.c:4818 +msgid "_Zoom" +msgstr "_Zooma" + +#: ../src/vikwindow.c:2204 +msgid "Zoom Tool" +msgstr "Zoom tresna" + +#: ../src/vikwindow.c:2271 ../src/vikwindow.c:4819 +msgid "_Pan" +msgstr "_Desplazamendu" + +#: ../src/vikwindow.c:2271 +msgid "Pan Tool" +msgstr "Desplazamentu tresna" + +#: ../src/vikwindow.c:2425 +msgid "_Select" +msgstr "_Hautatu" + +#: ../src/vikwindow.c:2425 +msgid "Select Tool" +msgstr "Hautatze-tresna" + +#: ../src/vikwindow.c:2615 +msgid "You must select a layer to show its properties." +msgstr "Aurekatu geruza bat bere propietateak ikusteko." + +#. No error to show, so unlikely this will get called +#: ../src/vikwindow.c:2629 +msgid "The help system is not available." +msgstr "Laguntza sistema ez dago eskuragarri." + +#. Main error path +#: ../src/vikwindow.c:2632 +#, c-format +msgid "" +"Help is not available because: %s.\n" +"Ensure a Mime Type ghelp handler program is installed (e.g. yelp)." +msgstr "" +"Laguntza ez dago eskuragarri honengatik: %s\n" +"Instalatu ghelp laguntza kudeatzen duen Mime motatako programa bat (hala " +"nola yelp)." + +#: ../src/vikwindow.c:2865 +msgid "You must select a layer to delete." +msgstr "Aukeratu behar duzu ezabatu nahi duzun geruza." + +#: ../src/vikwindow.c:3171 +msgid "Untitled" +msgstr "Titulugabea" + +#: ../src/vikwindow.c:3300 +#, c-format +msgid "Unable to add '%s' to the list of recently used documents" +msgstr "Ezin da '%s' gehitu erabili berri diren dokumentuen zerrendara" + +#: ../src/vikwindow.c:3391 +msgid "The file you requested could not be opened." +msgstr "Eskatu duzun fitxategia ezin da ireki." + +#: ../src/vikwindow.c:3394 +msgid "" +"GPSBabel is required to load files of this type or GPSBabel encountered " +"problems." +msgstr "" +"GPSBabel eskatzen du mota horretako fitxategiak kargatzeko edo GPSBabel-ek " +"arazoak izan ditu." + +#: ../src/vikwindow.c:3397 +#, c-format +msgid "Unable to load malformed GPX file %s" +msgstr "Ezin da gaizki eratutako %s GPX fitxategia kargatu" + +#: ../src/vikwindow.c:3400 +#, c-format +msgid "Unsupported file type for %s" +msgstr "Onartzen ez den fitxategi mota %s" + +#. Since we can process .vik files with issues just show a warning in the status bar +#. Not that a user can do much about it... or tells them what this issue is yet... +#: ../src/vikwindow.c:3406 +#, c-format +msgid "WARNING: issues encountered loading %s" +msgstr "Kontuz: erroreak %s kargatzean" + +#: ../src/vikwindow.c:3489 +msgid "Please select a GPS data file to open. " +msgstr "Hautatu GPS datu-fitxategia irekitzeko. " + +#: ../src/vikwindow.c:3508 +msgid "Google Earth" +msgstr "Google Earth" + +#: ../src/vikwindow.c:3523 ../src/vikwindow.c:3646 ../src/viking.desktop.in.h:1 +msgid "Viking" +msgstr "Viking" + +#: ../src/vikwindow.c:3594 ../src/vikwindow.c:4632 +msgid "Open File" +msgstr "Ireki fitxategia" + +#: ../src/vikwindow.c:3630 +msgid "Save as Viking File." +msgstr "Gorde Viking fitxategi gisa" + +#: ../src/vikwindow.c:3757 +#, c-format +msgid "Exporting to file: %s" +msgstr "Esportatzen fitxategira: %s" + +#. Confirm what happened. +#: ../src/vikwindow.c:3774 +#, c-format +msgid "Exported files: %d" +msgstr "Esportatutako fitxategiak: %d" + +#: ../src/vikwindow.c:3786 +msgid "Nothing to Export!" +msgstr "Ez dago ezer esportatzeko!" + +#: ../src/vikwindow.c:3790 +msgid "Export to directory" +msgstr "Esportatu direktoriora" + +#: ../src/vikwindow.c:3809 +msgid "Could not convert all files" +msgstr "Ezin dira bihurtu fitxategi guztiak" + +#: ../src/vikwindow.c:3851 +msgid "File not accessible" +msgstr "Fitxategia ezin da atzitu" + +#: ../src/vikwindow.c:3854 +msgid "No Viking File" +msgstr "Ez da Viking fitxategia" + +#: ../src/vikwindow.c:3998 +msgid "This layer has no configurable properties." +msgstr "Geruzak ez dauka ezartzeko ezaugarririk" + +#: ../src/vikwindow.c:4080 +msgid "Are you sure you wish to delete all layers?" +msgstr "Seguru zaude geruza guztiak ezabatu nahi dituzula?" + +#. Try harder... +#: ../src/vikwindow.c:4126 ../src/vikwindow.c:4132 +msgid "Generating image file..." +msgstr "Irudi-fitxategia sortzen..." + +#: ../src/vikwindow.c:4154 +msgid "" +"Failed to generate internal image.\n" +"\n" +"Try creating a smaller image." +msgstr "" +"Errorea barne irudi-fitxategia sortzen.\n" +"\n" +"Saiatu irudi txikiagoa sortzen." + +#: ../src/vikwindow.c:4175 +msgid "Image file generated." +msgstr "Irudi-fitxategia sortu da." + +#: ../src/vikwindow.c:4177 +msgid "Failed to generate image file." +msgstr "Ezin izan da irudi-fitxategia sortu." + +#: ../src/vikwindow.c:4246 +#, c-format +msgid "Unable to write to file %s: %s" +msgstr "Ezin da idatzi %s fitxategian: %s" + +#: ../src/vikwindow.c:4284 +msgid "" +"Viewable region outside allowable pixel size bounds for image. Clipping " +"width/height values." +msgstr "" +"Ikusgai dagoen erregioa onartzen den irudiaren mugatik kanpo dago. Txikitu " +"luze-zabaleraren balioak." + +#: ../src/vikwindow.c:4309 +#, c-format +msgid "Total area: %ldm x %ldm (%.3f sq. km)" +msgstr "Area osoa: %ldm x %ldm (%.3f km koadro)" + +#: ../src/vikwindow.c:4312 +#, c-format +msgid "Total area: %ldm x %ldm (%.3f sq. miles)" +msgstr "Area osoa: %ldm x %ldm (%.3f milia koadro)" + +#: ../src/vikwindow.c:4315 +#, c-format +msgid "Total area: %ldm x %ldm (%.3f sq. NM)" +msgstr "Area osoa: %ldm x %ldm (%.3f sq. NM)" + +#. Single file +#: ../src/vikwindow.c:4343 +msgid "Save Image" +msgstr "Gorde irudia" + +#: ../src/vikwindow.c:4364 ../src/vikwindow.c:4641 +msgid "KMZ" +msgstr "KMZ" + +#: ../src/vikwindow.c:4417 +msgid "You must be in UTM mode to use this feature" +msgstr "Eginbide hau erabili ahal izateko UTM moeuan egon behar zara." + +#: ../src/vikwindow.c:4421 +msgid "Choose a directory to hold images" +msgstr "Hautatu direktorio bat irudiak sartzeko" + +#. todo: default for answers inside VikWindow or static (thruout instance) +#: ../src/vikwindow.c:4441 +msgid "Save to Image File" +msgstr "Gorde irudi-fitxategian" + +#: ../src/vikwindow.c:4457 +msgid "Width (pixels):" +msgstr "Zabalera (pixel):" + +#: ../src/vikwindow.c:4459 +msgid "Height (pixels):" +msgstr "Altuera (pixeletan):" + +#: ../src/vikwindow.c:4462 +msgid "" +"WARNING: USING LARGE IMAGES OVER 10000x10000\n" +"MAY CRASH THE PROGRAM!" +msgstr "" +"Kontuz! 10000x10000 pixel edo handiagoak diren irudiak erabiltzeak\n" +"programa blokea dezake." + +#: ../src/vikwindow.c:4464 +msgid "Zoom (meters per pixel):" +msgstr "Zooma (metroak pixeleko):" + +#: ../src/vikwindow.c:4480 +msgid "Area in current viewable window" +msgstr "Area ikusgai den huneko leihoan" + +#: ../src/vikwindow.c:4490 +msgid "Save as PNG" +msgstr "Gorde PNG gisa" + +#: ../src/vikwindow.c:4491 +msgid "Save as JPEG" +msgstr "Gorde JPEG gisa" + +#: ../src/vikwindow.c:4520 +msgid "East-west image tiles:" +msgstr "Ekialde-mendebalde irudi-lauzak" + +#: ../src/vikwindow.c:4522 +msgid "North-south image tiles:" +msgstr "Iparra-Hegoa irudi-lauzak" + +#: ../src/vikwindow.c:4619 +msgid "This feature is not available in UTM mode" +msgstr "Ataza hau ez da egingarria UTM moduan" + +#: ../src/vikwindow.c:4658 +#, c-format +msgid "Unable to import %s." +msgstr "Ezin da %s inportatu." + +#: ../src/vikwindow.c:4749 +msgid "Choose a background color" +msgstr "Aukeratu atzeko planoko kolorea" + +#: ../src/vikwindow.c:4765 +msgid "Choose a track highlight color" +msgstr "Aukeratu arrastoa nabarmentzeko kolorea" + +#: ../src/vikwindow.c:4814 +msgid "_File" +msgstr "_Fitxategia" + +#: ../src/vikwindow.c:4815 +msgid "_Edit" +msgstr "_Editatu" + +#: ../src/vikwindow.c:4817 +msgid "_Show" +msgstr "_Erakutsi" + +#: ../src/vikwindow.c:4820 +msgid "_Layers" +msgstr "_Geruzak" + +#: ../src/vikwindow.c:4821 +msgid "_Tools" +msgstr "_Tresnak" + +#: ../src/vikwindow.c:4822 +msgid "_Webtools" +msgstr "_Web-tresnak" + +#: ../src/vikwindow.c:4823 ../src/vikwindow.c:4893 +msgid "_Help" +msgstr "_Laguntza" + +#: ../src/vikwindow.c:4825 +msgid "New file" +msgstr "Fitxategi berria" + +#: ../src/vikwindow.c:4826 +msgid "_Open..." +msgstr "_Ireki..." + +#: ../src/vikwindow.c:4826 +msgid "Open a file" +msgstr "Ireki fitxategi bat" + +#: ../src/vikwindow.c:4827 +msgid "Open _Recent File" +msgstr "Azken fitxategiak" + +#: ../src/vikwindow.c:4828 +msgid "Append _File..." +msgstr "Gehitu fitxategia..." + +#: ../src/vikwindow.c:4828 +msgid "Append data from a different file" +msgstr "Gehitu datuak beste fitxategi batetik" + +#: ../src/vikwindow.c:4829 +msgid "Open GPX as External _Layer..." +msgstr "" + +#: ../src/vikwindow.c:4829 +msgid "Open a GPX file as an external layer" +msgstr "" + +#: ../src/vikwindow.c:4830 +msgid "_Export All" +msgstr "_Esportatu guztia" + +#: ../src/vikwindow.c:4830 +msgid "Export All TrackWaypoint Layers" +msgstr "Esportatu Arrasto-puntuen geruza guztiak" + +#: ../src/vikwindow.c:4831 +msgid "_GPX..." +msgstr "_GPX..." + +#: ../src/vikwindow.c:4831 +msgid "Export as GPX" +msgstr "GPX moduan esportatu" + +#: ../src/vikwindow.c:4832 +msgid "A_cquire" +msgstr "Eskuratu" + +#: ../src/vikwindow.c:4833 +msgid "_Directions..." +msgstr "_Helbideak..." + +#: ../src/vikwindow.c:4833 +msgid "Get driving directions" +msgstr "Lortu norabideak" + +#: ../src/vikwindow.c:4835 +msgid "_OSM Traces..." +msgstr "_OSM Traces..." + +#: ../src/vikwindow.c:4835 +msgid "Get traces from OpenStreetMap" +msgstr "Lortu arrastoak OpenStreetMap-etik" + +#: ../src/vikwindow.c:4836 +msgid "_My OSM Traces..." +msgstr "_My OSM Traces..." + +#: ../src/vikwindow.c:4836 +msgid "Get Your Own Traces from OpenStreetMap" +msgstr "Lortu zure arrastoak OpenStreetMaps-etik" + +#: ../src/vikwindow.c:4839 +msgid "Geo_caches..." +msgstr "Geo_cache-ak..." + +#: ../src/vikwindow.c:4839 +msgid "Get Geocaches from geocaching.com" +msgstr "Lortu Geocache-ak geocaching.com orritik" + +#: ../src/vikwindow.c:4842 +msgid "Create waypoints from geotagged images" +msgstr "Sortu bide-puntuak geo-etiketatutako irudietatik" + +#: ../src/vikwindow.c:4844 +msgid "Get a file from a URL" +msgstr "Lortu fitxategia URL batetik" + +#: ../src/vikwindow.c:4846 +msgid "Create waypoints from Wikipedia items in the current view" +msgstr "Sortu bide-puntuak Wikipedia elementuetatik uneko ikuspegian" + +#: ../src/vikwindow.c:4848 +msgid "_Save" +msgstr "_Gorde" + +#: ../src/vikwindow.c:4848 +msgid "Save the file" +msgstr "Gorde fitxategia" + +#: ../src/vikwindow.c:4849 +msgid "Save _As..." +msgstr "Gorde _honela..." + +#: ../src/vikwindow.c:4849 +msgid "Save the file under different name" +msgstr "Gorde fitxategia beste izen batez" + +#: ../src/vikwindow.c:4850 +msgid "Properties..." +msgstr "Propietateak..." + +#: ../src/vikwindow.c:4850 +msgid "File Properties" +msgstr "Fitxategiaren propietateak" + +#: ../src/vikwindow.c:4852 +msgid "Import KMZ _Map File..." +msgstr "Inportatu KMZ mapa-fitxategia..." + +#: ../src/vikwindow.c:4852 +msgid "Import a KMZ file" +msgstr "Inportatu KMZ fitxategia" + +#: ../src/vikwindow.c:4853 +msgid "Generate _KMZ Map File..." +msgstr "Sortu _KMZ mapa-fitxategia" + +#: ../src/vikwindow.c:4853 +msgid "Generate a KMZ file with an overlay of the current view" +msgstr "Sortu KMZ fitxategia uneko ikuspegiaren gainean" + +#: ../src/vikwindow.c:4855 +msgid "_Generate Image File..." +msgstr "_Sortu irudi-fitxategia..." + +#: ../src/vikwindow.c:4855 +msgid "Save a snapshot of the workspace into a file" +msgstr "Gorde lan-arearen pantaila-argazkia fitxategi batean" + +#: ../src/vikwindow.c:4856 +msgid "Generate _Directory of Images..." +msgstr "Sortu irudi-direktorio bat" + +#: ../src/vikwindow.c:4856 +msgid "Generate _Directory of Images" +msgstr "Sortu irudi-direktorioa" + +#: ../src/vikwindow.c:4857 +msgid "_Print..." +msgstr "_Inprimatu..." + +#: ../src/vikwindow.c:4857 +msgid "Print maps" +msgstr "Inprimatu mapak" + +#: ../src/vikwindow.c:4858 +msgid "E_xit" +msgstr "I_rten" + +#: ../src/vikwindow.c:4858 +msgid "Exit the program" +msgstr "Irten programatik" + +#: ../src/vikwindow.c:4859 +msgid "Save and Exit" +msgstr "Gorde eta irten" + +#: ../src/vikwindow.c:4859 +msgid "Save and Exit the program" +msgstr "Gorde eta irten programatik" + +#: ../src/vikwindow.c:4861 +msgid "Go to the Pre_vious Location" +msgstr "Joan aurreko kokalekura" + +#: ../src/vikwindow.c:4861 +msgid "Go to the previous location" +msgstr "Joan aurreko kokalekura" + +#: ../src/vikwindow.c:4862 +msgid "Go to the _Next Location" +msgstr "Joan hurrengo kokalekura" + +#: ../src/vikwindow.c:4862 +msgid "Go to the next location" +msgstr "Joan hurrengo kokalekura" + +#: ../src/vikwindow.c:4863 +msgid "Go to the _Default Location" +msgstr "Joan lehenetsitako kokalekura" + +#: ../src/vikwindow.c:4863 +msgid "Go to the default location" +msgstr "Joan lehenetsitako kokalekura" + +#: ../src/vikwindow.c:4864 +#, fuzzy +msgid "Go to the _Auto Location" +msgstr "Joan hurrengo kokalekura" + +#: ../src/vikwindow.c:4864 +msgid "Go to a location via automatic lookup" +msgstr "" + +#: ../src/vikwindow.c:4865 +msgid "Go to _Location..." +msgstr "Joan kokalekura..." + +#: ../src/vikwindow.c:4865 +msgid "Go to address/place using text search" +msgstr "Joan helbidera/tokira testu bilaketaren bidez" + +#: ../src/vikwindow.c:4866 +msgid "_Go to Lat/Lon..." +msgstr "_Joan Lat/Lon kokalekura..." + +#: ../src/vikwindow.c:4866 +msgid "Go to arbitrary lat/lon coordinate" +msgstr "Joan lat/lon kokaleku arbitrario batera" + +#: ../src/vikwindow.c:4867 +msgid "Go to UTM..." +msgstr "Joan UTMra...." + +#: ../src/vikwindow.c:4867 +msgid "Go to arbitrary UTM coordinate" +msgstr "Joan UTM koordinatu arbitrario batera" + +#: ../src/vikwindow.c:4868 +#, fuzzy +msgid "Go to Today" +msgstr "" +"Joan UTM-ra (Universal Transverse Mercator coordinate system horretara; " +"Mercator-ren trebeseko koordenada sistema unibertsal horretara))" + +#: ../src/vikwindow.c:4868 +msgid "Go to today on the calendar" +msgstr "" + +#: ../src/vikwindow.c:4869 +msgid "_Refresh" +msgstr "_Freskatu" + +#: ../src/vikwindow.c:4869 +msgid "Refresh any maps displayed" +msgstr "Freskatu bistaratutako mapa guztiak" + +#: ../src/vikwindow.c:4870 +msgid "Set _Highlight Color..." +msgstr "Ezarri nabarmentzeko kolorea..." + +#: ../src/vikwindow.c:4870 +msgid "Set Highlight Color" +msgstr "Ezarri kolore nabarmena" + +#: ../src/vikwindow.c:4871 +msgid "Set Bac_kground Color..." +msgstr "Ezarri atzeko planoko kolorea" + +#: ../src/vikwindow.c:4871 +msgid "Set Background Color" +msgstr "Ezarri atzeko planoaren kolorea" + +#: ../src/vikwindow.c:4872 +msgid "Zoom _In" +msgstr "_Handiagotu" + +#: ../src/vikwindow.c:4872 +msgid "Zoom In" +msgstr "Handiagotu" + +#: ../src/vikwindow.c:4873 +msgid "Zoom _Out" +msgstr "_Txikiagotu" + +#: ../src/vikwindow.c:4873 +msgid "Zoom Out" +msgstr "Txikiagotu" + +#: ../src/vikwindow.c:4874 +msgid "Zoom _To..." +msgstr "Zoom hona..." + +#: ../src/vikwindow.c:4874 +msgid "Zoom To" +msgstr "Handiagotu" + +#: ../src/vikwindow.c:4875 +msgid "Pan _North" +msgstr "Desplazatu iparrera" + +#: ../src/vikwindow.c:4876 +msgid "Pan _East" +msgstr "Desplazatu ekialdera" + +#: ../src/vikwindow.c:4877 +msgid "Pan _South" +msgstr "Desplazatu hegoaldera" + +#: ../src/vikwindow.c:4878 +msgid "Pan _West" +msgstr "Desplazatu mendebaldera" + +#: ../src/vikwindow.c:4879 +msgid "Background _Jobs" +msgstr "Atzeko planoko lanak" + +#: ../src/vikwindow.c:4879 +msgid "Background Jobs" +msgstr "Atzeko planoaren lanak" + +#: ../src/vikwindow.c:4881 +msgid "Cu_t" +msgstr "_Ebaki" + +#: ../src/vikwindow.c:4885 +msgid "Delete All" +msgstr "Ezabatu guztiak" + +#: ../src/vikwindow.c:4886 +msgid "Copy Centre _Location" +msgstr "Kopiatu erdiko kokalekua" + +#: ../src/vikwindow.c:4887 +msgid "_Flush Map Cache" +msgstr "_Hustu mapen cache-a" + +#: ../src/vikwindow.c:4888 +msgid "_Set the Default Location" +msgstr "_Ezarri lehenetsitako kokalekua" + +#: ../src/vikwindow.c:4888 +msgid "Set the Default Location to the current position" +msgstr "_Ezarri lehenetsitako kokalekua uneko posizioan" + +#: ../src/vikwindow.c:4889 +msgid "_Preferences" +msgstr "_Hobespenak" + +#: ../src/vikwindow.c:4889 +msgid "Program Preferences" +msgstr "Aplikazioaren hobespenak" + +#: ../src/vikwindow.c:4890 +msgid "_Layer Defaults" +msgstr "_Lehenetsitako geruzak" + +#: ../src/vikwindow.c:4891 +msgid "_Properties" +msgstr "_Propietateak" + +#: ../src/vikwindow.c:4893 +msgid "Help" +msgstr "Laguntza" + +#: ../src/vikwindow.c:4894 +msgid "_About" +msgstr "Honi _buruz" + +#: ../src/vikwindow.c:4894 +msgid "About" +msgstr "Honi buruz" + +#: ../src/vikwindow.c:4903 +msgid "_KML..." +msgstr "_KML..." + +#: ../src/vikwindow.c:4903 +msgid "Export as KML" +msgstr "KML moduan esportatu" + +#: ../src/vikwindow.c:4904 +msgid "Transfer data from a GPS device" +msgstr "Ekarri datuak GPS batetik" + +#: ../src/vikwindow.c:4905 +msgid "Import file via GPSBabel converter" +msgstr "Inportatu datuak GPSBabel bihurgailuaren bidez" + +#: ../src/vikwindow.c:4909 +msgid "Import Geo_JSON File..." +msgstr "Inportatu Geo_JSON fitxategia..." + +#: ../src/vikwindow.c:4909 +msgid "Import GeoJSON file" +msgstr "Inportatu Geo_JSON fitxategia" + +#: ../src/vikwindow.c:4914 +msgid "_UTM Mode" +msgstr "_UTM modua" + +#: ../src/vikwindow.c:4915 +msgid "_Expedia Mode" +msgstr "_Expedia modua" + +#: ../src/vikwindow.c:4916 +msgid "_Mercator Mode" +msgstr "_Mercator modua" + +#: ../src/vikwindow.c:4917 +msgid "Lat_/Lon Mode" +msgstr "Lat_/Lon modua" + +#: ../src/vikwindow.c:4921 +msgid "Show _Scale" +msgstr "Erakutsi eskala" + +#: ../src/vikwindow.c:4921 +msgid "Show Scale" +msgstr "Erakutsi eskala" + +#: ../src/vikwindow.c:4922 +msgid "Show _Center Mark" +msgstr "Erakutsi erdiko marka" + +#: ../src/vikwindow.c:4922 +msgid "Show Center Mark" +msgstr "Erakutsi erdiko marka" + +#: ../src/vikwindow.c:4923 +msgid "Show _Highlight" +msgstr "Erakutsi nabarmen" + +#: ../src/vikwindow.c:4923 +msgid "Show Highlight" +msgstr "Erakutsi nabarmen" + +#: ../src/vikwindow.c:4924 +msgid "_Full Screen" +msgstr "_Pantaila osoa" + +#: ../src/vikwindow.c:4924 +msgid "Activate full screen mode" +msgstr "Aktibatu pantaila osoa modua" + +#: ../src/vikwindow.c:4925 +msgid "Show Side _Panel" +msgstr "Erakutsi alboko panela" + +#: ../src/vikwindow.c:4925 +msgid "Show Side Panel" +msgstr "Erakutsi alboko panela" + +#: ../src/vikwindow.c:4926 +msgid "Show Status_bar" +msgstr "Erakutsi egoera-barra" + +#: ../src/vikwindow.c:4926 +msgid "Show Statusbar" +msgstr "Erakutsi egoera-barra" + +#: ../src/vikwindow.c:4927 +msgid "Show _Toolbar" +msgstr "Erakutsi _tresna-barra" + +#: ../src/vikwindow.c:4927 +msgid "Show Toolbar" +msgstr "Erakutsi tresna barra" + +#: ../src/vikwindow.c:4928 +msgid "Show _Menu" +msgstr "Erakutsi _menua" + +#: ../src/vikwindow.c:4928 +msgid "Show Menu" +msgstr "Erakutsi menua" + +#: ../src/vikwindow.c:4929 +#, fuzzy +msgid "Show Side Panel B_uttons" +msgstr "Erakutsi alboko panela" + +#: ../src/vikwindow.c:4929 +#, fuzzy +msgid "Show Side Panel Buttons" +msgstr "Erakutsi alboko panela" + +#: ../src/vikwindow.c:4930 +#, fuzzy +msgid "Show Side Panel Ca_lendar" +msgstr "Erakutsi alboko panela" + +#: ../src/vikwindow.c:4930 +#, fuzzy +msgid "Show Side Panel Calendar" +msgstr "Erakutsi alboko panela" + +#: ../src/vikwindow.c:5064 +#, c-format +msgid "New _%s Layer" +msgstr "_%s geruza berria" + +#: ../src/vikwindow.c:5114 +#, fuzzy +msgid "..." +msgstr "Gehitu..." + +#: ../src/viking.desktop.in.h:2 +msgid "GPS Data Manager" +msgstr "GPS datu-kudeatzailea" + +#: ../src/viking.desktop.in.h:3 +msgid "Map Based GPS Data Manager (live data capable)." +msgstr "" +"GPS Data Manager horretan oinarrituriko mapa (bat-bateko datuak zuzenean " +"erabiltzeko gai)." + +#: ../src/libjpeg/jpeg-data.c:205 +msgid "Data does not follow JPEG specification." +msgstr "Datuek ez dute JPEG espezifikazioak betetzen." + +#: ../src/libjpeg/jpeg-data.c:302 +#, c-format +msgid "Path '%s' invalid." +msgstr "'%s' ez baliozko bide-izena" + +#: ../src/libjpeg/jpeg-data.c:320 +#, c-format +msgid "Could not read '%s'." +msgstr "Ezin da irakurri '%s'." + +#~ msgid "en" +#~ msgstr "en" + +#~ msgid "Polygonzied Layer" +#~ msgstr "Poligono-geruza" + +#~ msgid "Email:" +#~ msgstr "E-posta:" + +#~ msgid "I don't know that place. Do you want another goto?" +#~ msgstr "Ez dut toki hori ezagutzen. Beste toki batera joan nahi duzu?" + +#~ msgid "Service request failure. Do you want another goto?" +#~ msgstr "Zerbitzu eskaeraren errorea. Beste leku batera joan nahi duzu?" + +#~ msgid "Error: couldn't find gpsbabel." +#~ msgstr "Errorea: Ezin da aurkitu gpsbabel" + +#~ msgid "Create _Track" +#~ msgstr "Sortu _arrastoa" + +#~ msgid "Create Track" +#~ msgstr "Sortu arrastoa" + +#~ msgid "Create _Route" +#~ msgstr "Sortu _ibilbidea" + +#~ msgid "Create Route" +#~ msgstr "Sortu ibilbidea" + +#~ msgid "%.2f knots\n" +#~ msgstr "%.2f korapilo\n" diff --git a/po/fi.po b/po/fi.po new file mode 100644 index 0000000..ff5c889 --- /dev/null +++ b/po/fi.po @@ -0,0 +1,6176 @@ +# Finnish messages for viking +# Copyright © 2009 Rosetta Contributors and Canonical Ltd 2009 +# This file is distributed under the same license as the viking package. +# Jorma Karvonen , 2012. +# +msgid "" +msgstr "" +"Project-Id-Version: viking\n" +"Report-Msgid-Bugs-To: \n" +"POT-Creation-Date: 2019-01-19 12:53+0000\n" +"PO-Revision-Date: 2012-11-13 23:03+0000\n" +"Last-Translator: Jorma Karvonen \n" +"Language-Team: Finnish \n" +"Language: fi\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-Launchpad-Export-Date: 2018-12-21 17:32+0000\n" +"X-Generator: Launchpad (build 18847)\n" + +#: ../src/acquire.c:106 ../src/vikgpslayer.c:1367 +msgid "Done." +msgstr "Valmis." + +#: ../src/acquire.c:115 +msgid "No data." +msgstr "Ei tietoja." + +#: ../src/acquire.c:167 ../src/acquire.c:415 +msgid "Error: acquisition failed." +msgstr "Virhe: hankinta epäonnistui." + +#: ../src/acquire.c:339 +msgid "Working..." +msgstr "Työn alla..." + +#. This shouldn't happen... +#: ../src/acquire.c:406 +msgid "" +"Unable to create command\n" +"Acquire method failed." +msgstr "" + +#: ../src/acquire.c:513 +msgid "_Filter" +msgstr "" + +#: ../src/acquire.c:528 +#, c-format +msgid "Filter with %s" +msgstr "" + +#: ../src/acquire.c:545 +msgid "Filter" +msgstr "" + +#: ../src/babel.c:640 +msgid "GPSBabel:" +msgstr "" + +#: ../src/babel.c:641 +msgid "" +"Allow setting the specific instance of GPSBabel. You must restart Viking for " +"this value to take effect." +msgstr "" + +#: ../src/babel_ui.c:79 +msgid "Select a file format" +msgstr "" + +#: ../src/babel_ui.c:144 ../src/viktrwlayer.c:531 ../src/viktrwlayer.c:2882 +msgid "Tracks" +msgstr "Reitit" + +#: ../src/babel_ui.c:149 ../src/viktrwlayer.c:2892 +msgid "Routes" +msgstr "" + +#. ***** PARAMETERS ***** +#: ../src/babel_ui.c:154 ../src/viktrwlayer.c:531 ../src/viktrwlayer.c:2887 +msgid "Waypoints" +msgstr "Välietapit" + +#: ../src/background.c:64 +#, c-format +msgid "%d items" +msgstr "%d alkiota" + +#: ../src/background.c:287 +msgid "Threads:" +msgstr "" + +#: ../src/background.c:288 +msgid "" +"Number of threads to use for Mapnik tasks. You need to restart Viking for a " +"change to this value to be used" +msgstr "" + +#: ../src/background.c:361 +msgid "Job" +msgstr "Työ" + +#: ../src/background.c:365 +msgid "Progress" +msgstr "Edistyminen" + +#: ../src/background.c:373 +msgid "Viking Background Jobs" +msgstr "Viking-taustatyöt" + +#: ../src/bing.c:42 +msgid "Bing Aerial" +msgstr "" + +#: ../src/bing.c:48 +msgid "Bing" +msgstr "Bing" + +#. VIK_GTK_WINDOW_FROM_WIDGET(vp) +#: ../src/bingmapsource.c:514 +msgid "Bing attribution Loading" +msgstr "Bing-attribuuttilataus" + +#: ../src/clipboard.c:95 +msgid "paste failed" +msgstr "liittäminen epäonnistui" + +#: ../src/clipboard.c:105 +msgid "wrong clipboard data size" +msgstr "virheellinen leikepöytätietojen koko" + +#: ../src/clipboard.c:124 +#, c-format +msgid "" +"The clipboard contains sublayer data for %s layers. You must select a layer " +"of this type to paste the clipboard data." +msgstr "" +"Leikepöytä sisältää alikerrostietoja %s:lle kerrokselle. Sinun on valittava " +"tämän tyyppinen kerros leikepöytätietojen liittämiseksi." + +#: ../src/clipboard.c:264 +msgid "" +"In order to paste a waypoint, please select an appropriate layer to paste " +"into." +msgstr "Välietapin liittämiseksi valitse sopiva kerros liittämiskohteeksi." + +#: ../src/dialog.c:60 +msgid "Go to Lat/Lon" +msgstr "Siirry leveysp./pituusp." + +#: ../src/dialog.c:69 ../src/viktrwlayer_wpwin.c:173 +msgid "Latitude:" +msgstr "Leveyspiiri:" + +#: ../src/dialog.c:72 ../src/viktrwlayer_wpwin.c:177 +msgid "Longitude:" +msgstr "Pituuspiiri:" + +#: ../src/dialog.c:102 +msgid "Go to UTM" +msgstr "Siirry UTM:ään" + +#: ../src/dialog.c:114 +msgid "Northing:" +msgstr "Pohjoista leveyttä:" + +#: ../src/dialog.c:117 +msgid "Easting:" +msgstr "Itäistä pituutta:" + +#: ../src/dialog.c:121 ../src/vikgeoreflayer.c:902 +msgid "Zone:" +msgstr "Vyöhyke:" + +#: ../src/dialog.c:124 ../src/vikgeoreflayer.c:904 +msgid "Letter:" +msgstr "Kirjain:" + +#: ../src/dialog.c:246 ../src/geonamessearch.c:238 +#: ../src/datasource_osm_my_traces.c:505 +msgid "Nothing was selected" +msgstr "Mitään ei ole valittu" + +#: ../src/dialog.c:254 +msgid "Add Route" +msgstr "" + +#: ../src/dialog.c:254 +msgid "Add Track" +msgstr "Lisää reitti" + +#: ../src/dialog.c:262 +msgid "Route Name:" +msgstr "" + +#: ../src/dialog.c:262 +msgid "Track Name:" +msgstr "Reittinimi:" + +#: ../src/dialog.c:282 +msgid "Please enter a name for the track." +msgstr "Kirjoita reitin nimi." + +#: ../src/dialog.c:311 +msgid "Today" +msgstr "" + +#: ../src/dialog.c:393 +msgid "Zoom Factors..." +msgstr "Loitonnus-/lähennystekijät..." + +#: ../src/dialog.c:407 +msgid "Zoom factor (in meters per pixel):" +msgstr "Loitonnus-/lähennystekijä (metreissä per pikseli):" + +#: ../src/dialog.c:408 +msgid "X (easting): " +msgstr "X (itäistä pituutta): " + +#: ../src/dialog.c:409 +msgid "Y (northing): " +msgstr "Y (pohjoista leveyttä): " + +#: ../src/dialog.c:414 +msgid "X and Y zoom factors must be equal" +msgstr "X- ja Y-loitonnus/lähennystekijöiden on oltava yhtä suuria" + +#: ../src/dialog.c:469 +msgid "1 min" +msgstr "1 min." + +#: ../src/dialog.c:470 +msgid "1 hour" +msgstr "1 tunti" + +#: ../src/dialog.c:471 +msgid "1 day" +msgstr "1 päivä" + +#: ../src/dialog.c:472 +msgid "Custom (in minutes):" +msgstr "Oma (minuuteissa):" + +#: ../src/dialog.c:608 +#, c-format +msgid "" +"2003-2008, Evan Battaglia\n" +"2008-%s, Viking's contributors" +msgstr "" + +#: ../src/dialog.c:609 +msgid "GPS Data and Topo Analyzer, Explorer, and Manager." +msgstr "GPS-tieto- ja topologia-analysoija, -selain ja -hallintaohjelma" + +#: ../src/dialog.c:610 +msgid "" +"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.\n" +"\n" +"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.\n" +"\n" +"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., 59 Temple " +"Place, Suite 330, Boston, MA 02111-1307, USA" +msgstr "" +"Tämä ohjelma on vapaaohjelmisto; voitte levittää edelleen ja/tai \n" +"muuttaa sitä Free Software Foundationin julkaiseman GNU General Public\n" +"Licensen ehtojen mukaisesti; joko version 2, tai (valintanne mukaan)\n" +"minkä tahansa myöhemmän version.\n" +"\n" +"Tätä ohjelmaa levitetään siinä toivossa, että se olisi hyödyllinen,\n" +"mutta TAKUUTA EI OLE; ei edes KAUPALLISESTI HYVÄKSYTTÄVÄSTÄ LAADUSTA\n" +"tai SOPIVUUDESTA TIETTYYN TARKOITUKSEEN. Katsokaa lisätietoja GNU\n" +"General Public Licensestä.\n" +"\n" +"\"Olette saaneet kopion GNU General Public Licensestä tämän\n" +"ohjelman mukana. Ellette saaneet, kirjoittakaa osoitteeseen\n" +"Free Software Foundation, Inc., 59 Temple Place, Suite 330,\n" +"Boston, MA 02111-1307, USA." + +#: ../src/dialog.c:703 +msgid "Translation is coordinated on http://launchpad.net/viking" +msgstr "Kotoistamiset koordinoi http://launchpad.net/viking" + +#: ../src/dialog.c:713 +msgid "Download along track" +msgstr "Lataa reittiä pitkin" + +#: ../src/dialog.c:720 +msgid "Map type:" +msgstr "Karttatyyppi:" + +#: ../src/dialog.c:726 +msgid "Zoom level:" +msgstr "Loitonnus-/lähennystaso:" + +#: ../src/dialog.c:766 +#, c-format +msgid "The map data is licensed: %s." +msgstr "Karttatiedot on lisensoitu: %s." + +#: ../src/dialog.c:769 +#, c-format +msgid "" +"The data provided by '%s' are licensed under the following license: " +"%s." +msgstr "" + +#: ../src/dialog.c:773 +msgid "Open license" +msgstr "Avaa lisenssi" + +#: ../src/expedia.c:54 +msgid "Expedia Street Maps" +msgstr "Expedia Street-kartat" + +#: ../src/expedia.c:82 +msgid "Invalid expedia altitude" +msgstr "Virheellinen expedia-korkeus" + +#: ../src/expedia.c:113 +#, c-format +msgid "" +"Couldn't open EXPEDIA image file (right after successful download! Please " +"report and delete image file!): %s" +msgstr "" +"EXPEDIA-kuvatiedoston avaus epäonnistui (heti onnistuneen latauksen jälkeen! " +"Ilmoita ja poista kuvatiedosto!): %s" + +#: ../src/expedia.c:126 +#, c-format +msgid "" +"Couldn't save EXPEDIA image file (right after successful download! Please " +"report and delete image file!): %s" +msgstr "" +"EXPEDIA-kuvatiedoston tallentaminen epäonnistui (heti onnistuneen latauksen " +"jälkeen! Ilmoita ja poista kuvatiedosto!): %s" + +#: ../src/geonamessearch.c:115 +msgid "Search" +msgstr "Etsi" + +#: ../src/geonamessearch.c:117 +msgid "No entries found!" +msgstr "Kohteita ei löytynyt!" + +#. NB could allow columns to be shifted around by doing this after each new +#. gtk_tree_view_column_set_reorderable ( column, TRUE ); +#. However I don't think is that useful, so I haven't put it in +#: ../src/geonamessearch.c:171 ../src/datasource_osm_my_traces.c:422 +#: ../src/viktrwlayer_tracklist.c:621 ../src/viktrwlayer_waypointlist.c:618 +msgid "Name" +msgstr "" + +#: ../src/geonamessearch.c:176 +msgid "Feature" +msgstr "" + +#: ../src/geonamessearch.c:181 ../src/datasource_osm_my_traces.c:437 +msgid "Lat/Lon" +msgstr "" + +#: ../src/geonamessearch.c:264 ../src/googlesearch.c:101 ../src/vikgoto.c:430 +msgid "couldn't map temp file" +msgstr "tilapäisen tiedoston kartoittaminen epäonnistui" + +#: ../src/geonamessearch.c:459 +#, fuzzy +msgid "Select articles" +msgstr "Valintatyökalu" + +#: ../src/geonamessearch.c:459 +msgid "Select the articles you want to add." +msgstr "" + +#: ../src/geonamessearch.c:475 +msgid "city" +msgstr "" + +#: ../src/geonamessearch.c:477 +msgid "edu" +msgstr "" + +#: ../src/geonamessearch.c:479 +msgid "airport" +msgstr "" + +#: ../src/geonamessearch.c:481 +msgid "mountain" +msgstr "" + +#: ../src/geonamessearch.c:483 +msgid "forest" +msgstr "" + +#: ../src/geonamessearch.c:485 +msgid "church" +msgstr "" + +#: ../src/geojson.c:74 +#, c-format +msgid "%s command failed: %s" +msgstr "" + +#: ../src/geojson.c:146 ../src/gpx.c:1317 +#, c-format +msgid "failed to open temporary file: %s" +msgstr "tilapäisen tiedoston avaaminen epäonnistui: %s" + +#: ../src/globals.c:67 +msgid "DDD" +msgstr "" + +#: ../src/globals.c:67 +msgid "DMM" +msgstr "" + +#: ../src/globals.c:67 +msgid "DMS" +msgstr "" + +#: ../src/globals.c:67 +msgid "Raw" +msgstr "" + +#: ../src/globals.c:68 +msgid "Kilometres" +msgstr "" + +#: ../src/globals.c:68 +msgid "Miles" +msgstr "" + +#: ../src/globals.c:68 +msgid "Nautical Miles" +msgstr "" + +#. VIK_UNITS_SPEED_KILOMETRES_PER_HOUR: +#: ../src/globals.c:69 ../src/viktrwlayer_tracklist.c:655 ../src/vikutils.c:100 +msgid "km/h" +msgstr "" + +#: ../src/globals.c:69 ../src/viktrwlayer_tracklist.c:656 ../src/vikutils.c:78 +msgid "mph" +msgstr "" + +#. VIK_UNITS_SPEED_METRES_PER_SECOND: +#: ../src/globals.c:69 ../src/viktrwlayer_tracklist.c:663 ../src/vikutils.c:81 +msgid "m/s" +msgstr "" + +#: ../src/globals.c:69 ../src/viktrwlayer_tracklist.c:657 ../src/vikutils.c:84 +msgid "knots" +msgstr "" + +#: ../src/globals.c:69 ../src/viktrwlayer_tracklist.c:658 ../src/vikutils.c:87 +msgid "s/km" +msgstr "" + +#: ../src/globals.c:69 ../src/viktrwlayer_tracklist.c:659 ../src/vikutils.c:90 +msgid "min/km" +msgstr "" + +#: ../src/globals.c:69 +msgid "s/mi" +msgstr "" + +#: ../src/globals.c:69 ../src/viktrwlayer_tracklist.c:661 ../src/vikutils.c:96 +msgid "min/mi" +msgstr "" + +#: ../src/globals.c:70 +msgid "Metres" +msgstr "" + +#: ../src/globals.c:70 +msgid "Feet" +msgstr "" + +#: ../src/globals.c:73 +msgid "Locale" +msgstr "" + +#: ../src/globals.c:73 +msgid "World" +msgstr "" + +#: ../src/globals.c:73 +msgid "UTC" +msgstr "" + +#: ../src/globals.c:76 +msgid "Degree format:" +msgstr "Astemuoto:" + +#: ../src/globals.c:77 +msgid "Distance units:" +msgstr "Etäisyysyksiköt:" + +#: ../src/globals.c:78 +msgid "Speed units:" +msgstr "Nopeusyksiköt:" + +#: ../src/globals.c:79 +msgid "Height units:" +msgstr "Korkeusyksiköt:" + +#: ../src/globals.c:80 +msgid "Use large waypoint icons:" +msgstr "Käytä suurikokoisia välietappikuvakkeita:" + +#: ../src/globals.c:81 +msgid "Default latitude:" +msgstr "Oletusleveysaste:" + +#: ../src/globals.c:82 +msgid "Default longitude:" +msgstr "Oletuspituusaste:" + +#: ../src/globals.c:83 +msgid "Time Display:" +msgstr "" + +#: ../src/globals.c:84 +msgid "" +"Display times according to the reference frame. Locale is the user's system " +"setting. World is relative to the location of the object." +msgstr "" + +#: ../src/globals.c:90 +msgid "Alphabetical" +msgstr "" + +#: ../src/globals.c:90 ../src/datasource_osm_my_traces.c:432 +msgid "Time" +msgstr "" + +#: ../src/globals.c:90 +msgid "Creation" +msgstr "" + +#: ../src/globals.c:91 +msgid "Title Case" +msgstr "" + +#: ../src/globals.c:91 +msgid "Lowercase" +msgstr "" + +#: ../src/globals.c:94 +msgid "KML File Export Units:" +msgstr "KML-tiedostovientiyksiköt:" + +#: ../src/globals.c:95 +msgid "GPX Track Order:" +msgstr "" + +#: ../src/globals.c:96 +msgid "GPX Waypoint Symbols:" +msgstr "" + +#: ../src/globals.c:97 +msgid "" +"Save GPX Waypoint Symbol names in the specified case. May be useful for " +"compatibility with various devices" +msgstr "" + +#: ../src/globals.c:98 +msgid "GPX Creator:" +msgstr "" + +#: ../src/globals.c:99 +msgid "" +"The creator value when writing a GPX file. Otherwise when blank a default is " +"used." +msgstr "" + +#: ../src/globals.c:104 +msgid "Image Viewer:" +msgstr "Kuvaselain:" + +#: ../src/globals.c:109 +msgid "External GPX Program 1:" +msgstr "Ulkoinen GPX-ohjelma 1:" + +#: ../src/globals.c:110 +msgid "External GPX Program 2:" +msgstr "Ulkoinen GPX-ohjelma 2:" + +#: ../src/globals.c:113 +msgid "Absolute" +msgstr "" + +#: ../src/globals.c:113 +msgid "Relative" +msgstr "" + +#: ../src/globals.c:117 +msgid "Save File Reference Mode:" +msgstr "" + +#: ../src/globals.c:118 +msgid "" +"When saving a Viking .vik file, this determines how the directory paths of " +"filenames are written." +msgstr "" + +#: ../src/globals.c:119 +msgid "Ask for Name before Track Creation:" +msgstr "" + +#: ../src/globals.c:120 +msgid "Show Tooltip during Track Creation:" +msgstr "" + +#: ../src/globals.c:121 +msgid "The number of recent files:" +msgstr "" + +#: ../src/globals.c:122 +msgid "" +"Only applies to new windows or on application restart. -1 means all " +"available files." +msgstr "" + +#: ../src/globals.c:123 +#, fuzzy +msgid "Open files in selected layer:" +msgstr "Siirrä valittu kerros" + +#: ../src/globals.c:124 +msgid "Open files (but not .vik ones) into the selected TrackWaypoint layer." +msgstr "" + +#: ../src/globals.c:125 +msgid "Show calendar day names:" +msgstr "" + +#: ../src/globals.c:128 +msgid "Home Location" +msgstr "" + +#: ../src/globals.c:128 +msgid "Last Location" +msgstr "" + +#: ../src/globals.c:128 +msgid "Specified File" +msgstr "" + +#: ../src/globals.c:128 +msgid "Auto Location" +msgstr "" + +#: ../src/globals.c:131 +msgid "Restore Window Setup:" +msgstr "" + +#: ../src/globals.c:132 +msgid "Restore window size and layout" +msgstr "" + +#: ../src/globals.c:133 +msgid "Add a Default Map Layer:" +msgstr "" + +#: ../src/globals.c:134 +msgid "" +"The default map layer added is defined by the Layer Defaults. Use the menu " +"Edit->Layer Defaults->Map... to change the map type and other values." +msgstr "" + +#: ../src/globals.c:135 +msgid "Startup Method:" +msgstr "" + +#: ../src/globals.c:136 +msgid "Startup File:" +msgstr "" + +#: ../src/globals.c:137 +msgid "" +"The default file to load on startup. Only applies when the startup method is " +"set to 'Specified File'" +msgstr "" + +#: ../src/globals.c:138 +msgid "Check For New Version:" +msgstr "" + +#: ../src/globals.c:139 +msgid "Periodically check to see if a new version of Viking is available" +msgstr "" + +#. Defaults for the options are setup here +#: ../src/globals.c:176 +msgid "General" +msgstr "Yleistä" + +#. New Tab +#: ../src/globals.c:204 +msgid "Startup" +msgstr "" + +#. New Tab +#: ../src/globals.c:222 +msgid "Export/External" +msgstr "Vie/Ulkoinen" + +#. 'Advanced' Properties +#: ../src/globals.c:249 +msgid "Advanced" +msgstr "" + +#. Webtools +#: ../src/google.c:39 +msgid "Google" +msgstr "Google" + +#. If there is an actual description field it will overwrite this value +#: ../src/gpx.c:264 +#, c-format +msgid "Created by: %s" +msgstr "" + +#: ../src/datasource_bfilter.c:43 +msgid "Max number of points:" +msgstr "Pisteiden enimmäismäärä:" + +#: ../src/datasource_bfilter.c:84 +msgid "Simplify All Tracks..." +msgstr "Yksinkertaista kaikkia reittejä..." + +#: ../src/datasource_bfilter.c:85 +msgid "Simplified Tracks" +msgstr "Yksinkertaistetut reitit" + +#. { VIK_LAYER_NUM_TYPES, "compressmethod", VIK_LAYER_PARAM_UINT, VIK_LAYER_GROUP_NONE, N_("Simplify Method:"), VIK_LAYER_WIDGET_COMBOBOX, compress_method, NULL, NULL, NULL, NULL, NULL }, +#: ../src/datasource_bfilter.c:111 +msgid "Error Factor:" +msgstr "" + +#: ../src/datasource_bfilter.c:112 +msgid "" +"Specifies the maximum allowable error that may be introduced by removing a " +"single point by the crosstrack method. See the manual or GPSBabel Simplify " +"Filter documentation for more detail." +msgstr "" + +#: ../src/datasource_bfilter.c:166 +msgid "Compress Tracks..." +msgstr "" + +#: ../src/datasource_bfilter.c:167 +msgid "Compressed Tracks" +msgstr "" + +#: ../src/datasource_bfilter.c:197 ../src/datasource_bfilter.c:198 +msgid "Remove Duplicate Waypoints" +msgstr "Poista välietappien kaksoiskappaleet" + +#: ../src/datasource_bfilter.c:221 +msgid "Manual filter:" +msgstr "" + +#: ../src/datasource_bfilter.c:222 +msgid "Manual filter command: e.g. 'swap'." +msgstr "" + +#: ../src/datasource_bfilter.c:233 ../src/datasource_bfilter.c:234 +msgid "Manual filter" +msgstr "" + +#: ../src/datasource_bfilter.c:262 +msgid "Waypoints Inside This" +msgstr "Poista välietapit tämän sisältä" + +#: ../src/datasource_bfilter.c:263 ../src/datasource_bfilter.c:292 +msgid "Polygonized Layer" +msgstr "Monikulmaistettu kerros" + +#: ../src/datasource_bfilter.c:291 +msgid "Waypoints Outside This" +msgstr "Välietapit tämän ulkopuolella" + +#: ../src/datasource_file.c:61 +msgid "Import file with GPSBabel" +msgstr "Tuo tiedosto GPSBabel-ohjelmalla" + +#: ../src/datasource_file.c:62 +msgid "Imported file" +msgstr "Tuotu tiedosto" + +#. The file selector +#: ../src/datasource_file.c:129 +msgid "File:" +msgstr "Tiedosto:" + +#: ../src/datasource_file.c:130 +msgid "File to import" +msgstr "Tuotava tiedosto" + +#: ../src/datasource_file.c:137 +msgid "All files" +msgstr "Kaikki tiedostot" + +#. The file format selector +#: ../src/datasource_file.c:144 ../src/datasource_url.c:106 +msgid "File type:" +msgstr "Tiedostotyyppi:" + +# Tämä on debug-sanoma +#: ../src/datasource_file.c:189 +#, c-format +msgid "using babel args '%s' and file '%s'" +msgstr "käytetään babel-argumentteja ’%s’ ja tiedostoa ’%s’" + +#: ../src/datasource_gc.c:67 +msgid "Download Geocaches" +msgstr "Lataa geokätköt" + +#: ../src/datasource_gc.c:68 +msgid "Geocaching.com Caches" +msgstr "Geocaching.com-kätköt" + +#: ../src/datasource_gc.c:86 +msgid "geocaching.com username:" +msgstr "geocaching.com-käyttäjänimi:" + +#: ../src/datasource_gc.c:87 +msgid "geocaching.com password:" +msgstr "geocaching.com-salasana:" + +#: ../src/datasource_gc.c:92 ../src/vikwindow.c:3502 +msgid "Geocaching" +msgstr "Geokätkyily" + +#: ../src/datasource_gc.c:128 +#, c-format +msgid "" +"Can't find %s or %s in path! Check that you have installed it correctly." +msgstr "" +"Kohteiden %s tai %s löytäminen polussa epäonnistui! Tarkista, että olet " +"asentanut sen oikein." + +#: ../src/datasource_gc.c:190 +msgid "Number geocaches:" +msgstr "Geokätköjen lukumäärä:" + +#: ../src/datasource_gc.c:192 +msgid "Centered around:" +msgstr "Keskitetty ympärille:" + +#: ../src/datasource_gc.c:231 +msgid "Broken input - using some defaults" +msgstr "Rikkinäinen syöte - käytetään joitakin oletusarvoja" + +#: ../src/datasource_geotag.c:51 +msgid "Create Waypoints from Geotagged Images" +msgstr "Luo välietapit Geotagged-kuvista" + +#: ../src/datasource_geotag.c:52 +msgid "Geotagged Images" +msgstr "Geotagged-kuvat" + +#: ../src/datasource_geotag.c:102 ../src/datasource_geojson.c:93 +#: ../src/vikfileentry.c:171 ../src/vikwindow.c:3533 ../src/vikwindow.c:3610 +#: ../src/vikwindow.c:3641 ../src/vikwindow.c:4356 ../src/vikwindow.c:4649 +msgid "All" +msgstr "Kaikki" + +#: ../src/datasource_geotag.c:107 ../src/vikfileentry.c:115 +#: ../src/viktrwlayer_geotag.c:637 ../src/vikwindow.c:3518 +#: ../src/vikwindow.c:4377 +msgid "JPG" +msgstr "JPG" + +#: ../src/datasource_geotag.c:168 +#, c-format +msgid "Unable to create waypoint from %s" +msgstr "Välietapin luominen kohteesta %s epäonnistui" + +#: ../src/datasource_geojson.c:46 +msgid "Acquire from GeoJSON" +msgstr "" + +#: ../src/datasource_geojson.c:47 ../src/datasource_geojson.c:98 +msgid "GeoJSON" +msgstr "" + +#: ../src/datasource_geojson.c:152 +#, c-format +msgid "Unable to import from: %s" +msgstr "" + +#: ../src/datasource_gps.c:54 +msgid "Acquire from GPS" +msgstr "Hanki GPS:stä" + +#: ../src/datasource_gps.c:55 +msgid "Acquired from GPS" +msgstr "Hankittu GPS:stä" + +#: ../src/datasource_gps.c:258 +#, c-format +msgid "using cmd '%s' and file '%s'\n" +msgstr "" + +#: ../src/datasource_gps.c:353 ../src/vikgpslayer.c:966 +#, c-format +msgid "Downloading %d waypoint..." +msgid_plural "Downloading %d waypoints..." +msgstr[0] "Ladataan %d välietappi..." +msgstr[1] "Ladataan %d välietappia..." + +#: ../src/datasource_gps.c:358 ../src/vikgpslayer.c:971 +#, c-format +msgid "Downloading %d trackpoint..." +msgid_plural "Downloading %d trackpoints..." +msgstr[0] "Ladataan %d reittipiste..." +msgstr[1] "Ladataan %d reittipisteet..." + +#: ../src/datasource_gps.c:363 ../src/vikgpslayer.c:976 +#, c-format +msgid "Downloading %d routepoint..." +msgid_plural "Downloading %d routepoints..." +msgstr[0] "" +msgstr[1] "" + +#: ../src/datasource_gps.c:386 ../src/datasource_gps.c:393 +#: ../src/datasource_gps.c:400 +#, c-format +msgid "Downloaded %d out of %d %s..." +msgstr "Ladattu %d / %d %s..." + +#: ../src/datasource_gps.c:388 ../src/datasource_gps.c:395 +#: ../src/datasource_gps.c:402 +#, c-format +msgid "Downloaded %d %s." +msgstr "Ladattu %d %s." + +#: ../src/datasource_gps.c:416 ../src/vikgpslayer.c:1134 +#, c-format +msgid "GPS Device: %s" +msgstr "GPS-laite: %s" + +#: ../src/datasource_gps.c:428 ../src/vikgpslayer.c:1214 +msgid "Status: Working..." +msgstr "" + +#. NB gps_layer_inst_init() is performed after parameter registeration +#. thus to give the protocols some potential values use the old static list +#. TODO: find another way to use gps_layer_inst_init()? +#: ../src/datasource_gps.c:584 ../src/vikgpslayer.c:216 +msgid "GPS Protocol:" +msgstr "GPS-yhteyskäytäntö:" + +#. List reassigned at runtime +#: ../src/datasource_gps.c:609 ../src/vikgpslayer.c:217 +msgid "Serial Port:" +msgstr "Sarjaportti:" + +#: ../src/datasource_gps.c:659 +msgid "" +"Turn Off After Transfer\n" +"(Garmin/NAViLink Only)" +msgstr "" +"Käännä pois päältä siirron jälkeen\n" +"(Vain Garmin/NAViLink)" + +#: ../src/datasource_gps.c:666 +msgid "Tracks:" +msgstr "Reitit:" + +#: ../src/datasource_gps.c:673 +msgid "Routes:" +msgstr "" + +#: ../src/datasource_gps.c:680 +msgid "Waypoints:" +msgstr "Välietapit:" + +#: ../src/datasource_gps.c:756 ../src/vikgpslayer.c:1509 +msgid "GPS device: N/A" +msgstr "GPS-laite: Ei saatavilla" + +#: ../src/datasource_osm.c:53 ../src/datasource_osm.c:54 +msgid "OSM traces" +msgstr "OSM-jäljet:" + +#: ../src/datasource_osm.c:89 +msgid "Page number:" +msgstr "Sivunumero:" + +#: ../src/datasource_osm_my_traces.c:59 ../src/datasource_osm_my_traces.c:60 +msgid "OSM My Traces" +msgstr "" + +#: ../src/datasource_osm_my_traces.c:106 ../src/osm-traces.c:684 +#, fuzzy +msgid "Email/username:" +msgstr "OSM-käyttäjänimi:" + +#: ../src/datasource_osm_my_traces.c:111 +msgid "The email or username used to login to OSM" +msgstr "" + +#: ../src/datasource_osm_my_traces.c:113 ../src/osm-traces.c:692 +msgid "Password:" +msgstr "Salasana:" + +#: ../src/datasource_osm_my_traces.c:116 +msgid "The password used to login to OSM" +msgstr "" + +#: ../src/datasource_osm_my_traces.c:427 ../src/viktrwlayer.c:689 +msgid "Description" +msgstr "" + +#: ../src/datasource_osm_my_traces.c:442 +msgid "Privacy" +msgstr "" + +#: ../src/datasource_osm_my_traces.c:449 +msgid "Within Current View" +msgstr "" + +#: ../src/datasource_osm_my_traces.c:516 +msgid "GPS Traces" +msgstr "" + +#: ../src/datasource_osm_my_traces.c:518 +msgid "None found!" +msgstr "" + +#: ../src/datasource_osm_my_traces.c:569 +msgid "Ensure the OSM access token preferences are setup." +msgstr "" + +#: ../src/datasource_osm_my_traces.c:645 +msgid "My OSM Traces" +msgstr "" + +#. Report errors to the status bar +#: ../src/datasource_osm_my_traces.c:667 +#, c-format +msgid "Unable to get trace: %s" +msgstr "" + +#: ../src/datasource_routing.c:56 ../src/datasource_routing.c:57 +msgid "Directions" +msgstr "" + +#: ../src/datasource_routing.c:90 +msgid "No routing engines with directions available" +msgstr "" + +#. Engine selector +#: ../src/datasource_routing.c:99 +msgid "Engine:" +msgstr "" + +#. From and To entries +#: ../src/datasource_routing.c:104 +msgid "From:" +msgstr "Mistä:" + +#: ../src/datasource_routing.c:105 +msgid "To:" +msgstr "Mihin:" + +#: ../src/datasource_url.c:48 +msgid "Acquire from URL" +msgstr "" + +#: ../src/datasource_url.c:49 +msgid "URL" +msgstr "" + +#: ../src/datasource_url.c:101 +msgid "URL:" +msgstr "" + +#. Only GPX (not using GPSbabel) +#: ../src/datasource_url.c:133 ../src/vikfileentry.c:161 +#: ../src/vikwindow.c:3513 ../src/vikwindow.c:3603 +msgid "GPX" +msgstr "GPX" + +#: ../src/datasource_wikipedia.c:32 +msgid "Create Waypoints from Wikipedia Articles" +msgstr "" + +#: ../src/datasource_wikipedia.c:33 +msgid "Wikipedia Waypoints" +msgstr "" + +#: ../src/dem.c:66 ../src/dem.c:80 +msgid "Invalid DEM" +msgstr "Virheellinen DEM" + +#: ../src/dem.c:122 +msgid "Invalid DEM header" +msgstr "Virheellinen DEM-otsake" + +#: ../src/dem.c:191 ../src/dem.c:204 +msgid "Incorrect DEM Class B record: expected 1" +msgstr "Virheellinen DEM Class B-tietue, odotettiin 1" + +#: ../src/dem.c:289 ../src/download.c:176 +#, c-format +msgid "Couldn't map file %s: %s" +msgstr "Tiedoston %s kartoittaminen epäonnistui: %s" + +#: ../src/download.c:130 +msgid "Tile age (days):" +msgstr "" + +#: ../src/download.c:406 +#, c-format +msgid "Download error: %s" +msgstr "Latausvirhe: %s" + +#: ../src/download.c:490 +msgid "couldn't open temp file" +msgstr "tilapäisen tiedoston avaaminen epäonnistui" + +#: ../src/file.c:458 ../src/file.c:463 +#, c-format +msgid "Draw mode '%s' no more supported" +msgstr "Piirrostilaa ’%s’ ei enää tueta" + +#: ../src/geotag_exif.c:621 +msgid "Not enough memory." +msgstr "Muisti ei riitä." + +#: ../src/geotag_exif.c:639 +msgid "Setting a value for this tag is unsupported!" +msgstr "Arvon asettamista tälle tunnisteelle ei tueta!" + +#: ../src/geotag_exif.c:658 +#, c-format +msgid "Too few components specified (need %d, found %d)\n" +msgstr "Määritelty liian vähän komponentteja (tarvitaan %d, löytyi %d)\n" + +#: ../src/geotag_exif.c:662 +msgid "Numeric value expected\n" +msgstr "Odotettiin numeroarvoa\n" + +#: ../src/geotag_exif.c:670 +msgid "This shouldn't happen!" +msgstr "Tätä ei pitäisi tapahtua!" + +#: ../src/geotag_exif.c:740 +msgid "Not yet implemented!" +msgstr "Ei ole vielä toteutettu!" + +#: ../src/geotag_exif.c:753 +msgid "Warning; Too many components specified!" +msgstr "Varoitus; Liian monta komponenttia määritelty!" + +#: ../src/osm-traces.c:87 +msgid "Identifiable (public w/ timestamps)" +msgstr "Tunnistettava (julkiset w/ aikaleimat)" + +#: ../src/osm-traces.c:88 +msgid "Trackable (private w/ timestamps)" +msgstr "Reititettävä (yksityiset w/ aikaleimat)" + +#: ../src/osm-traces.c:89 +msgid "Public" +msgstr "Julkinen" + +#: ../src/osm-traces.c:90 +msgid "Private" +msgstr "Yksityinen" + +#: ../src/osm-traces.c:108 +msgid "Access Token:" +msgstr "" + +#: ../src/osm-traces.c:108 +msgid "Get New OSM Access Tokens" +msgstr "" + +#: ../src/osm-traces.c:109 +msgid "Access Token Key:" +msgstr "" + +#: ../src/osm-traces.c:110 +msgid "Access Token Secret:" +msgstr "" + +#: ../src/osm-traces.c:111 +msgid "OSM username:" +msgstr "OSM-käyttäjänimi:" + +#: ../src/osm-traces.c:112 +msgid "OSM password:" +msgstr "OSM-salasana:" + +#. Check to really override existing values... +#: ../src/osm-traces.c:263 +msgid "Do you want to overwrite existing values?" +msgstr "" + +#: ../src/osm-traces.c:275 +msgid "Not able to generate OSM request tokens." +msgstr "" + +#: ../src/osm-traces.c:299 +msgid "" +"Waiting for authorization approval.\n" +"Ensure you have granted access at the website before continuing here." +msgstr "" + +#: ../src/osm-traces.c:315 +msgid "No Authorization." +msgstr "" + +#: ../src/osm-traces.c:354 +msgid "" +"OSM Username and Password preferences are not required anymore. You can now " +"remove them." +msgstr "" + +#. Preferences +#: ../src/osm-traces.c:379 +msgid "OpenStreetMap Traces" +msgstr "OpenStreetMap-jäljet" + +#: ../src/osm-traces.c:504 +#, c-format +msgid "failed to upload data: HTTP response is %ld" +msgstr "tietojen kopioiminen palvelimelle epäonnistui: HTTP-vastaus on %ld" + +#: ../src/osm-traces.c:509 +#, c-format +msgid "curl_easy_getinfo failed: %d" +msgstr "curl_easy_getinfo epäonnistui: %d" + +#: ../src/osm-traces.c:514 +#, c-format +msgid "curl request failed: %s" +msgstr "curl-pyyntö epäonnistui: %s" + +#. Success +#: ../src/osm-traces.c:592 +msgid "Uploaded to OSM" +msgstr "Kopioitu OSM-palvelimelle" + +#: ../src/osm-traces.c:596 +msgid "" +"FAILED TO UPLOAD DATA TO OSM - Ensure the OSM access token preferences are " +"setup." +msgstr "" + +#: ../src/osm-traces.c:599 +msgid "FAILED TO UPLOAD DATA TO OSM - CURL PROBLEM" +msgstr "TIETOJEN KOPIOIMINEN OSM-PALVELIMELLE EPÄONNISTUI - CURL-PULMA" + +#: ../src/osm-traces.c:602 +msgid "FAILED TO UPLOAD DATA TO OSM" +msgstr "TIETOJEN KOPIOIMINEN OSM-PALVELIMELLE EPÄONNISTUI" + +#: ../src/osm-traces.c:602 +msgid "HTTP response code" +msgstr "HTTP-vastauskoodi" + +#: ../src/osm-traces.c:610 +#, c-format +msgid "failed to unlink temporary file: %s" +msgstr "unlink-toiminto tilapäiselle tiedostolle epäonnistui: %s" + +#: ../src/osm-traces.c:664 +msgid "OSM upload" +msgstr "OSM-kopiointi palvelimelle" + +#: ../src/osm-traces.c:689 +#, fuzzy +msgid "" +"The email/username used as login\n" +"Enter the email/username you use to login into www.openstreetmap.org." +"" +msgstr "" +"Sähköpostiosoitetta käytetty kirjautumiseen\n" +"Kirjoita sähköpostiosoite, jota käytät kirjautumiseen sivustolle www." +"openstreetmap.org." + +#: ../src/osm-traces.c:697 +msgid "" +"The password used to login\n" +"Enter the password you use to login into www.openstreetmap.org." +msgstr "" +"Salasanaa käytetty kirjautumiseen\n" +"Kirjoita salasana, jota käytät kirjautumiseen sivustolle www." +"openstreetmap.org." + +#: ../src/osm-traces.c:703 +msgid "File's name:" +msgstr "Tiedoston nimi:" + +#: ../src/osm-traces.c:713 +msgid "" +"The name of the file on OSM\n" +"This is the name of the file created on the server.This is not the " +"name of the local file." +msgstr "" +"Tiedoston nimi OSM:ssä\n" +"Tämä on palvelimella luodun tiedoston nimi. Tämä ei ole paikallisen " +"tiedoston nimi." + +#: ../src/osm-traces.c:717 ../src/viktrwlayer_wpwin.c:197 +#: ../src/viktrwlayer_wpwin.c:199 +msgid "Description:" +msgstr "Kuvaus:" + +#: ../src/osm-traces.c:731 +msgid "The description of the trace" +msgstr "Jäljen kuvaus" + +#: ../src/osm-traces.c:734 +msgid "Anonymize Times:" +msgstr "" + +#: ../src/osm-traces.c:739 +msgid "" +"Anonymize times of the trace.\n" +"You may choose to make the trace identifiable, yet mask the actual " +"real time values" +msgstr "" + +#: ../src/osm-traces.c:743 +msgid "Tags:" +msgstr "Tunnisteet:" + +#: ../src/osm-traces.c:751 +msgid "The tags associated to the trace" +msgstr "Jälkeen liitetyt tunnisteet" + +#: ../src/osm-traces.c:816 +#, c-format +msgid "Uploading %s to OSM" +msgstr "Kopioidaan %s OSM-palvelimelle" + +#: ../src/mapcache.c:67 +msgid "Map cache memory size (MB):" +msgstr "" + +#. NB Can have a couple hundred fonts loaded when using system directories +#. So ATM don't list them all - otherwise need better GUI feedback display. +#: ../src/mapnik_interface.cpp:324 +#, c-format +msgid "" +"%s %s\n" +"Plugins=%sFonts loaded=%d" +msgstr "" + +#: ../src/mapnik_interface.cpp:325 ../src/vikmapniklayer.c:278 +msgid "Mapnik" +msgstr "" + +#: ../src/print.c:51 ../src/viktrwlayer.c:572 +msgid "None" +msgstr "Ei mitään" + +#: ../src/print.c:52 +msgid "Horizontally" +msgstr "Vaakasuoraan" + +#: ../src/print.c:53 +msgid "Vertically" +msgstr "Pystysuoraan" + +#: ../src/print.c:54 +msgid "Both" +msgstr "Molemmat" + +#: ../src/print.c:118 +msgid "Image Settings" +msgstr "Kuva-asetukset" + +#: ../src/print.c:551 +msgid "done" +msgstr "valmis" + +#. Page Size +#: ../src/print.c:580 +msgid "_Adjust Page Size and Orientation" +msgstr "_Säädä kuvakoko ja suuntaus" + +#: ../src/print.c:596 +msgid "C_enter:" +msgstr "K_eskitä:" + +#. ignore page margins +#: ../src/print.c:614 +msgid "Ignore Page _Margins" +msgstr "Ohita sivu_marginaalit" + +#: ../src/print.c:633 +msgid "Image S_ize:" +msgstr "_Kuvakoko:" + +#: ../src/ui_util.c:88 +#, c-format +msgid "Could not launch web browser. %s" +msgstr "" + +#: ../src/ui_util.c:101 +#, c-format +msgid "Could not create new email. %s" +msgstr "" + +#: ../src/vikcoordlayer.c:57 +msgid "Color:" +msgstr "Väri:" + +#: ../src/vikcoordlayer.c:58 +msgid "Minutes Width:" +msgstr "Minuuttipituus:" + +#: ../src/vikcoordlayer.c:59 +msgid "Line Thickness:" +msgstr "Viivan paksuus:" + +#: ../src/vikcoordlayer.c:66 +msgid "Coordinate" +msgstr "" + +#: ../src/main.c:92 +#, c-format +msgid "Ignoring Xlib error: error code %d request code %d\n" +msgstr "" + +#: ../src/main.c:111 +msgid "Enable debug output" +msgstr "Ota käyttöön vianjäljitystulostus" + +#: ../src/main.c:112 +msgid "Enable verbose output" +msgstr "Ota käyttöön lavea tulostus" + +#: ../src/main.c:113 +msgid "Show version" +msgstr "Näytä versio" + +#: ../src/main.c:114 +msgid "Latitude in decimal degrees" +msgstr "" + +#: ../src/main.c:115 +msgid "Longitude in decimal degrees" +msgstr "" + +#: ../src/main.c:116 +msgid "Zoom Level (OSM). Value can be 0 - 22" +msgstr "" + +#: ../src/main.c:117 +msgid "Add a map layer by id value. Use 0 for the default map." +msgstr "" + +#: ../src/main.c:160 +#, c-format +msgid "" +"%s %s\n" +"Copyright (c) 2003-2008 Evan Battaglia\n" +"Copyright (c) 2008-%s Viking's contributors\n" +msgstr "" + +#: ../src/osm.c:50 +#, fuzzy +msgid "OpenStreetMap (Mapnik)" +msgstr "OpenStreetMap-jäljet" + +#: ../src/osm.c:65 +#, fuzzy +msgid "OpenStreetMap (Cycle)" +msgstr "OpenStreetMap-jäljet" + +#: ../src/osm.c:79 +#, fuzzy +msgid "OpenStreetMap (Transport)" +msgstr "OpenStreetMap-jäljet" + +#: ../src/osm.c:95 +#, fuzzy +msgid "OpenStreetMap (Humanitarian)" +msgstr "OpenStreetMap-jäljet" + +#: ../src/osm.c:111 +msgid "On Disk OSM Tile Format" +msgstr "" + +#: ../src/osm.c:121 +msgid "MBTiles File" +msgstr "" + +#: ../src/osm.c:132 +msgid "OSM Metatiles" +msgstr "" + +#: ../src/osm.c:146 +msgid "Mapbox Outdoors" +msgstr "" + +#: ../src/osm.c:153 +msgid "Mapbox Specific" +msgstr "" + +#: ../src/osm.c:170 +msgid "OSM (view)" +msgstr "OSM (näkymä)" + +#: ../src/osm.c:174 +msgid "OSM (edit)" +msgstr "OSM (muokkaa)" + +#. Note the use of positional parameters +#: ../src/osm.c:179 +msgid "OSM (query)" +msgstr "" + +#: ../src/osm.c:183 +msgid "OSM (render)" +msgstr "OSM (renderoi)" + +#. Example: http://127.0.0.1:8111/load_and_zoom?left=8.19&right=8.20&top=48.605&bottom=48.590&select=node413602999 +#. JOSM or merkaartor must already be running with remote interface enabled +#: ../src/osm.c:190 +msgid "Local port 8111 (eg JOSM)" +msgstr "Paikallinen portti 8111 (esim.: JOSM)" + +#: ../src/osm.c:195 +msgid "Geofabrik Map Compare" +msgstr "" + +#: ../src/osm.c:203 +msgid "OpenStreetMap Notes" +msgstr "" + +#. Not really OSM but can't be bothered to create somewhere else to put it... +#: ../src/osm.c:221 +msgid "Wikimedia Toolserver GeoHack" +msgstr "" + +#: ../src/preferences.c:195 +msgid "Preferences" +msgstr "Asetukset" + +#: ../src/toolbar.c:91 ../src/toolbar.c:92 +msgid "System Default" +msgstr "" + +#: ../src/toolbar.c:91 ../src/viktrwlayer.c:563 +msgid "Small" +msgstr "" + +#: ../src/toolbar.c:91 ../src/viktrwlayer.c:564 +msgid "Medium" +msgstr "" + +#: ../src/toolbar.c:91 ../src/viktrwlayer.c:565 +msgid "Large" +msgstr "" + +#: ../src/toolbar.c:92 +msgid "Icons Only" +msgstr "" + +#: ../src/toolbar.c:92 +msgid "Text Only" +msgstr "" + +#: ../src/toolbar.c:92 +msgid "Icons and Text" +msgstr "" + +#: ../src/toolbar.c:106 +msgid "Append to Menu:" +msgstr "" + +#: ../src/toolbar.c:107 +msgid "Pack the toolbar to the main menu to save vertical space" +msgstr "" + +#: ../src/toolbar.c:108 +msgid "Icon Size:" +msgstr "" + +#: ../src/toolbar.c:110 +msgid "Icon Style:" +msgstr "" + +#: ../src/toolbar.c:112 +msgid "Customize:" +msgstr "" + +#: ../src/toolbar.c:112 +msgid "Customize Buttons" +msgstr "" + +#. Preferences +#: ../src/toolbar.c:145 +msgid "Toolbar" +msgstr "" + +#: ../src/toolbar.c:312 +msgid "_Customize" +msgstr "" + +#: ../src/toolbar.c:641 +msgid "Separator" +msgstr "" + +#: ../src/toolbar.c:642 +msgid "--- Separator ---" +msgstr "" + +#: ../src/toolbar.c:1007 +msgid "Customize Toolbar" +msgstr "" + +#: ../src/toolbar.c:1028 +msgid "" +"Select items to be displayed on the toolbar. Items can be reordered by drag " +"and drop." +msgstr "" + +#: ../src/toolbar.c:1044 +msgid "Available Items" +msgstr "" + +#: ../src/toolbar.c:1065 +msgid "Displayed Items" +msgstr "" + +#: ../src/viklayer_defaults.c:232 +#, c-format +msgid "Could not open file: %s" +msgstr "" + +#: ../src/viklayer_defaults.c:304 +msgid "Layer Defaults" +msgstr "" + +#: ../src/uibuilder.c:196 +msgid "Take care that this password will be stored clearly in a plain file." +msgstr "" +"Muista, että tämä salasana tallennetaan salaamattomaan tekstitiedostoon." + +#: ../src/uibuilder.c:628 ../src/viktrwlayer_export.c:188 +#: ../src/viktrwlayer_export.c:304 ../src/vikwindow.c:3666 +#: ../src/vikwindow.c:4408 +#, c-format +msgid "The file \"%s\" exists, do you wish to overwrite it?" +msgstr "Tiedosto ”%s” on olemassa, haluatko korvata sen?" + +#: ../src/vikaggregatelayer.c:41 +msgid "Aggregate" +msgstr "" + +#: ../src/vikaggregatelayer.c:528 ../src/viktrwlayer.c:11700 +#, c-format +msgid "%s: Waypoint List" +msgstr "" + +#: ../src/vikaggregatelayer.c:570 +msgid "Search by Date" +msgstr "" + +#: ../src/vikaggregatelayer.c:576 +msgid "No items found with the requested date." +msgstr "" + +#: ../src/vikaggregatelayer.c:615 ../src/viktrwlayer.c:11691 +#, c-format +msgid "%s: Track and Route List" +msgstr "" + +#: ../src/vikaggregatelayer.c:681 ../src/viktrwlayer.c:8346 +#: ../src/viktrwlayer.c:8417 ../src/viktrwlayer.c:8494 +msgid "_Visibility" +msgstr "" + +#: ../src/vikaggregatelayer.c:686 +msgid "_Show All" +msgstr "" + +#: ../src/vikaggregatelayer.c:692 +msgid "_Hide All" +msgstr "" + +#: ../src/vikaggregatelayer.c:698 ../src/viktrwlayer.c:8363 +#: ../src/viktrwlayer.c:8434 ../src/viktrwlayer.c:8511 +msgid "_Toggle" +msgstr "" + +#: ../src/vikaggregatelayer.c:705 ../src/viktrwlayer.c:8532 +msgid "_Sort" +msgstr "" + +#: ../src/vikaggregatelayer.c:711 ../src/viktrwlayer.c:8538 +msgid "Name _Ascending" +msgstr "" + +#: ../src/vikaggregatelayer.c:717 ../src/viktrwlayer.c:8544 +msgid "Name _Descending" +msgstr "" + +#: ../src/vikaggregatelayer.c:723 ../src/viktrwlayer.c:575 +#: ../src/viktrwlayer.c:8550 +msgid "Date Ascending" +msgstr "" + +#: ../src/vikaggregatelayer.c:729 ../src/viktrwlayer.c:576 +#: ../src/viktrwlayer.c:8556 +msgid "Date Descending" +msgstr "" + +#: ../src/vikaggregatelayer.c:735 ../src/viktrwlayer.c:8445 +#: ../src/viktrwlayer.c:8523 ../src/viktrwlayer.c:8595 +#: ../src/viktrwlayer_tracklist.c:296 +msgid "_Statistics" +msgstr "" + +#: ../src/vikaggregatelayer.c:740 ../src/viktrwlayer.c:4533 +msgid "Track _List..." +msgstr "" + +#: ../src/vikaggregatelayer.c:746 ../src/viktrwlayer.c:4540 +msgid "_Waypoint List..." +msgstr "" + +#: ../src/vikaggregatelayer.c:753 +msgid "Searc_h" +msgstr "" + +#: ../src/vikaggregatelayer.c:759 +msgid "By _Date..." +msgstr "" + +#: ../src/vikaggregatelayer.c:762 +msgid "Find the first item with a specified date" +msgstr "" + +#: ../src/vikaggregatelayer.c:765 +msgid "Load E_xternal Layers" +msgstr "" + +#. Could have a more complicated tooltip that numbers each type of layers, +#. but for now a simple overall count +#: ../src/vikaggregatelayer.c:1011 +#, c-format +msgid "One layer" +msgid_plural "%d layers" +msgstr[0] "" +msgstr[1] "" + +#: ../src/vikaggregatelayer.c:1014 +#, fuzzy, c-format +msgid "Empty" +msgstr "Tyhjennä K_aikki" + +#: ../src/vikdemlayer.c:86 +msgid "SRTM Global 90m (3 arcsec)" +msgstr "" + +#: ../src/vikdemlayer.c:94 +msgid "Absolute height" +msgstr "Absoluuttinen korkeus" + +#: ../src/vikdemlayer.c:95 +msgid "Height gradient" +msgstr "Korkeuskaltevuus" + +#: ../src/vikdemlayer.c:120 +msgid "DEM Files:" +msgstr "DEM-tiedostot:" + +#: ../src/vikdemlayer.c:121 +msgid "Download Source:" +msgstr "Latauslähde:" + +#: ../src/vikdemlayer.c:122 +msgid "Min Elev Color:" +msgstr "Alimman korkeusaseman väri" + +#: ../src/vikdemlayer.c:123 ../src/viktrwlayer_wpwin.c:207 +msgid "Type:" +msgstr "Tyyppi:" + +#: ../src/vikdemlayer.c:124 +msgid "Min Elev:" +msgstr "Alin korkeusasema:" + +#: ../src/vikdemlayer.c:125 +msgid "Max Elev:" +msgstr "Ylin korkeusasema:" + +#: ../src/vikdemlayer.c:137 +msgid "_DEM Download" +msgstr "" + +#: ../src/vikdemlayer.c:137 +msgid "DEM Download" +msgstr "" + +#: ../src/vikdemlayer.c:192 +msgid "DEM" +msgstr "" + +#: ../src/vikdemlayer.c:304 +#, c-format +msgid "Number of files: %d" +msgstr "Tiedostojen lukumäärä: %d" + +#: ../src/vikdemlayer.c:446 +msgid "DEM Loading" +msgstr "DEM-lataus" + +#: ../src/vikdemlayer.c:927 +#, c-format +msgid "No SRTM data available for %f, %f" +msgstr "SRTM-tietoja ei ole käytettävissä kohteelle %f, %f" + +#: ../src/vikdemlayer.c:948 +#, c-format +msgid "DEM download failure for %f, %f" +msgstr "" + +#: ../src/vikdemlayer.c:954 +#, c-format +msgid "DEM write failure for %s" +msgstr "" + +#. Probably not over any land... +#: ../src/vikdemlayer.c:1201 +msgid "No DEM File Available" +msgstr "" + +#: ../src/vikdemlayer.c:1220 +#, c-format +msgid "" +"\n" +"Source: %s\n" +"\n" +"DEM File: %s\n" +"DEM File Timestamp: %s" +msgstr "" + +#: ../src/vikdemlayer.c:1224 +#, c-format +msgid "" +"Source: %s\n" +"\n" +"No DEM File!" +msgstr "" + +#: ../src/vikdemlayer.c:1264 +#, c-format +msgid "Downloading DEM %s" +msgstr "Ladataan DEM %s" + +#: ../src/vikdemlayer.c:1289 +msgid "_Show DEM File Information" +msgstr "" + +#: ../src/vikfileentry.c:72 +msgid "Browse..." +msgstr "Selaa..." + +#: ../src/vikfileentry.c:103 +msgid "Choose file" +msgstr "Valitse tiedosto" + +#: ../src/vikfileentry.c:120 ../src/vikwindow.c:4372 +msgid "PNG" +msgstr "" + +#: ../src/vikfileentry.c:125 +msgid "TIFF" +msgstr "" + +#: ../src/vikfileentry.c:133 +msgid "MBTiles" +msgstr "" + +#: ../src/vikfileentry.c:142 +msgid "XML" +msgstr "" + +#: ../src/vikfileentry.c:149 +msgid "MML" +msgstr "" + +#: ../src/vikfileentry.c:154 +msgid "MSS" +msgstr "" + +#: ../src/vikfilelist.c:49 +msgid "Choose file(s)" +msgstr "Valitse tiedostot" + +#: ../src/vikfilelist.c:182 +msgid "Add..." +msgstr "Lisää..." + +#: ../src/vikfilelist.c:183 +msgid "Delete" +msgstr "Poista" + +#: ../src/vikgeoreflayer.c:97 +msgid "_Georef Move Map" +msgstr "" + +#: ../src/vikgeoreflayer.c:97 +msgid "Georef Move Map" +msgstr "Georef-siirtokartta" + +#: ../src/vikgeoreflayer.c:106 +msgid "Georef Z_oom Tool" +msgstr "" + +#: ../src/vikgeoreflayer.c:106 +msgid "Georef Zoom Tool" +msgstr "Georef-loitonnus-/lähennystyökalu" + +#: ../src/vikgeoreflayer.c:117 +msgid "GeoRef Map" +msgstr "" + +#: ../src/vikgeoreflayer.c:214 +msgid "Auto Read World Files:" +msgstr "" + +#: ../src/vikgeoreflayer.c:215 +msgid "" +"Automatically attempt to read associated world file of a new image for a " +"GeoRef layer" +msgstr "" + +#: ../src/vikgeoreflayer.c:511 ../src/vikgeoreflayer.c:797 +#: ../src/vikmapslayer.c:1174 +#, c-format +msgid "Couldn't open image file: %s" +msgstr "Kuvatiedoston avaus epäonnistui: %s" + +#: ../src/vikgeoreflayer.c:607 ../src/vikgeoreflayer.c:633 +msgid "Choose World file" +msgstr "Valitse World-tiedosto" + +#: ../src/vikgeoreflayer.c:619 +msgid "The World file you requested could not be opened for reading." +msgstr "Pyytämäsi World-tiedoston avaus lukemista varten epäonnistui." + +#: ../src/vikgeoreflayer.c:621 +msgid "Unexpected end of file reading World file." +msgstr "World-tiedoston lukemisen odottamaton loppu." + +#: ../src/vikgeoreflayer.c:646 +msgid "The file you requested could not be opened for writing." +msgstr "Pyytämäsi tiedoston avaus kirjoittamista varten epäonnistui." + +#: ../src/vikgeoreflayer.c:782 +msgid "Lower right corner values may not be consistent with upper right values" +msgstr "" + +#: ../src/vikgeoreflayer.c:806 +#, c-format +msgid "Invalid image size: %s" +msgstr "" + +#: ../src/vikgeoreflayer.c:831 ../src/viklayer.c:561 ../src/vikwindow.c:4891 +msgid "Layer Properties" +msgstr "Kerrosominaisuudet" + +#: ../src/vikgeoreflayer.c:852 +msgid "World File Parameters:" +msgstr "Loitonna/lähennä (metriä per pikseli):" + +#: ../src/vikgeoreflayer.c:853 +msgid "Load From File..." +msgstr "Lataa tiedostosta..." + +#: ../src/vikgeoreflayer.c:858 +msgid "Corner pixel easting:" +msgstr "Kulmapikselin itäinen pituusaste:" + +#: ../src/vikgeoreflayer.c:860 +msgid "the UTM \"easting\" value of the upper-left corner pixel of the map" +msgstr "" + +#: ../src/vikgeoreflayer.c:862 +msgid "Corner pixel northing:" +msgstr "Kulmapikselin pohjoinen leveysaste:" + +#: ../src/vikgeoreflayer.c:864 +msgid "the UTM \"northing\" value of the upper-left corner pixel of the map" +msgstr "" + +#: ../src/vikgeoreflayer.c:866 +msgid "X (easting) scale (mpp): " +msgstr "X (itäistä pituutta)-skaala (mpp): " + +#: ../src/vikgeoreflayer.c:867 +msgid "Y (northing) scale (mpp): " +msgstr "Y (pohjoista leveyttä)-skaala (mpp): " + +#: ../src/vikgeoreflayer.c:870 +msgid "the scale of the map in the X direction (meters per pixel)" +msgstr "karttaskaala X-suunnassa (metriä per pikseli)" + +#: ../src/vikgeoreflayer.c:872 +msgid "the scale of the map in the Y direction (meters per pixel)" +msgstr "karttaskaala Y-suunnassa (metriä per pikseli)" + +#: ../src/vikgeoreflayer.c:874 +msgid "Map Image:" +msgstr "Karttakuva:" + +#: ../src/vikgeoreflayer.c:919 +msgid "Upper left latitude:" +msgstr "" + +#: ../src/vikgeoreflayer.c:921 +msgid "Upper left longitude:" +msgstr "" + +#: ../src/vikgeoreflayer.c:923 +msgid "Lower right latitude:" +msgstr "" + +#: ../src/vikgeoreflayer.c:925 +msgid "Lower right longitude:" +msgstr "" + +#: ../src/vikgeoreflayer.c:937 +msgid "Calculate MPP values from coordinates" +msgstr "" + +#: ../src/vikgeoreflayer.c:938 +msgid "" +"Enter all corner coordinates before calculating the MPP values from the " +"image size" +msgstr "" + +#: ../src/vikgeoreflayer.c:948 +msgid "UTM" +msgstr "" + +#: ../src/vikgeoreflayer.c:949 +msgid "Latitude/Longitude" +msgstr "" + +#: ../src/vikgeoreflayer.c:957 ../src/vikmapniklayer.c:82 +#: ../src/vikmapslayer.c:158 +msgid "Alpha:" +msgstr "Alfa:" + +#. Now with icons +#: ../src/vikgeoreflayer.c:1062 +msgid "_Zoom to Fit Map" +msgstr "_Loitonna/Lähennä sopimaan karttaan" + +#: ../src/vikgeoreflayer.c:1068 +msgid "_Goto Map Center" +msgstr "_Siirry karttakeskustaan" + +#: ../src/vikgeoreflayer.c:1074 +msgid "_Export to World File" +msgstr "_World-tiedoston vienti" + +#: ../src/vikgoto.c:98 +msgid "No goto tool available." +msgstr "Siirtymistyökalua ei ole käytettävissä." + +#: ../src/vikgoto.c:295 +msgid "goto" +msgstr "siirry" + +#: ../src/vikgoto.c:297 +msgid "goto provider:" +msgstr "siirtymistarjoaja:" + +#: ../src/vikgoto.c:312 +msgid "Enter address or place name:" +msgstr "Kirjoita osoite tai paikan nimi:" + +#: ../src/vikgoto.c:487 +msgid "Locality" +msgstr "" + +#: ../src/vikgpslayer.c:137 +msgid "Data Mode" +msgstr "" + +#: ../src/vikgpslayer.c:139 +msgid "Realtime Tracking Mode" +msgstr "" + +#: ../src/vikgpslayer.c:176 +msgid "Keep vehicle at center" +msgstr "" + +#: ../src/vikgpslayer.c:177 +msgid "Keep vehicle on screen" +msgstr "" + +#: ../src/vikgpslayer.c:178 +msgid "Disable" +msgstr "" + +#: ../src/vikgpslayer.c:218 +msgid "Download Tracks:" +msgstr "Lataa reitit:" + +#: ../src/vikgpslayer.c:219 +msgid "Upload Tracks:" +msgstr "Kopioi reitit palvelimelle:" + +#: ../src/vikgpslayer.c:220 +msgid "Download Routes:" +msgstr "" + +#: ../src/vikgpslayer.c:221 +msgid "Upload Routes:" +msgstr "" + +#: ../src/vikgpslayer.c:222 +msgid "Download Waypoints:" +msgstr "Lataa välietapit:" + +#: ../src/vikgpslayer.c:223 +msgid "Upload Waypoints:" +msgstr "Kopioi välietapit palvelimelle:" + +#: ../src/vikgpslayer.c:225 +msgid "Recording tracks" +msgstr "Tallennetaan reittejä" + +#: ../src/vikgpslayer.c:226 +msgid "Jump to current position on start" +msgstr "Hyppää alussa nykyiseen sijaintiin" + +#: ../src/vikgpslayer.c:227 +msgid "Moving Map Method:" +msgstr "Siirretään kartta-menetelmä:" + +#: ../src/vikgpslayer.c:228 +msgid "Update Statusbar:" +msgstr "" + +#: ../src/vikgpslayer.c:228 +msgid "Display information in the statusbar on GPS updates" +msgstr "" + +#: ../src/vikgpslayer.c:229 +msgid "Auto Connect" +msgstr "" + +#: ../src/vikgpslayer.c:229 +msgid "Automatically connect to GPSD" +msgstr "" + +#: ../src/vikgpslayer.c:230 +msgid "Gpsd Host:" +msgstr "Gpsd-tietokone:" + +#: ../src/vikgpslayer.c:231 +msgid "Gpsd Port:" +msgstr "Gpsd-portti:" + +#: ../src/vikgpslayer.c:232 +msgid "Gpsd Retry Interval (seconds):" +msgstr "Gpsd-toistoväli (sekuntia):" + +#: ../src/vikgpslayer.c:254 +msgid "GPS" +msgstr "" + +#: ../src/vikgpslayer.c:320 ../src/vikgpslayer.c:1504 +msgid "GPS Download" +msgstr "GPS-lataus" + +#: ../src/vikgpslayer.c:320 ../src/vikgpslayer.c:1504 ../src/viktrwlayer.c:3993 +msgid "GPS Upload" +msgstr "GPS-kopiointi palvelimelle" + +#: ../src/vikgpslayer.c:322 +msgid "GPS Realtime Tracking" +msgstr "GPS-tosiaikareititys" + +#: ../src/vikgpslayer.c:458 +msgid "Connected" +msgstr "" + +#: ../src/vikgpslayer.c:460 +msgid "Disconnected" +msgstr "" + +#: ../src/vikgpslayer.c:554 +msgid "Unknown GPS Protocol" +msgstr "Tuntematon GPS-yhteyskäytäntö" + +#: ../src/vikgpslayer.c:572 +msgid "Unknown serial port device" +msgstr "Tuntematon sarjaporttilaite" + +#: ../src/vikgpslayer.c:691 +#, c-format +msgid "%s: unknown parameter" +msgstr "%s: tuntematon parametri" + +#. Now with icons +#: ../src/vikgpslayer.c:794 +msgid "_Upload to GPS" +msgstr "Kopioi_daan GPS-palvelimelle" + +#: ../src/vikgpslayer.c:800 +msgid "Download from _GPS" +msgstr "Lataa _GPS:stä" + +#: ../src/vikgpslayer.c:821 +msgid "Empty _Realtime" +msgstr "Tyhje_nna tosiaika" + +#: ../src/vikgpslayer.c:828 +msgid "E_mpty Upload" +msgstr "Tyhjennä _kopioiminen palvelimelle" + +#: ../src/vikgpslayer.c:834 +msgid "_Empty Download" +msgstr "Ty_hjennä lataus" + +#: ../src/vikgpslayer.c:840 +msgid "Empty _All" +msgstr "Tyhjennä K_aikki" + +#: ../src/vikgpslayer.c:852 +#, c-format +msgid "Unexpected number of disconnected handlers: %d" +msgstr "Odottamaton irtikytkettyjen käsittelijöiden lukumäärä: %d" + +#: ../src/vikgpslayer.c:995 +#, c-format +msgid "Uploading %d waypoint..." +msgid_plural "Uploading %d waypoints..." +msgstr[0] "Kopioidaan %d välietappi palvelimelle..." +msgstr[1] "Kopioidaan %d välietappia palvelimelle..." + +#: ../src/vikgpslayer.c:1000 +#, c-format +msgid "Uploading %d trackpoint..." +msgid_plural "Uploading %d trackpoints..." +msgstr[0] "Kopioidaan %d reittipiste palvelimelle..." +msgstr[1] "Kopioidaan %d reittipistettä palvelimelle..." + +#: ../src/vikgpslayer.c:1005 +#, c-format +msgid "Uploading %d routepoint..." +msgid_plural "Uploading %d routepoints..." +msgstr[0] "" +msgstr[1] "" + +#: ../src/vikgpslayer.c:1034 +#, c-format +msgid "Downloaded %d out of %d waypoint..." +msgid_plural "Downloaded %d out of %d waypoints..." +msgstr[0] "Ladattu %d / %d välietappi..." +msgstr[1] "Ladattu %d / %d välietappia..." + +#: ../src/vikgpslayer.c:1040 +#, c-format +msgid "Downloaded %d out of %d trackpoint..." +msgid_plural "Downloaded %d out of %d trackpoints..." +msgstr[0] "Ladattu %d / %d reittipiste..." +msgstr[1] "Ladattu %d / %d reittipistettä..." + +#: ../src/vikgpslayer.c:1046 +#, c-format +msgid "Downloaded %d out of %d routepoint..." +msgid_plural "Downloaded %d out of %d routepoints..." +msgstr[0] "" +msgstr[1] "" + +#: ../src/vikgpslayer.c:1056 +#, c-format +msgid "Uploaded %d out of %d waypoint..." +msgid_plural "Uploaded %d out of %d waypoints..." +msgstr[0] "Kopioitu %d / %d välietappi palvelimelle..." +msgstr[1] "Kopioitu %d / %d välietappia palvelimelle..." + +#: ../src/vikgpslayer.c:1062 +#, c-format +msgid "Uploaded %d out of %d trackpoint..." +msgid_plural "Uploaded %d out of %d trackpoints..." +msgstr[0] "Kopioitu %d / %d reittipiste palvelimelle..." +msgstr[1] "Kopioitu %d / %d reittipistettä palvelimelle..." + +#: ../src/vikgpslayer.c:1068 +#, c-format +msgid "Uploaded %d out of %d routepoint..." +msgid_plural "Uploaded %d out of %d routepoints..." +msgstr[0] "" +msgstr[1] "" + +#: ../src/vikgpslayer.c:1079 +#, c-format +msgid "Downloaded %d waypoint" +msgid_plural "Downloaded %d waypoints" +msgstr[0] "Ladattiin %d välietappi" +msgstr[1] "Ladattiin %d välietappia" + +#: ../src/vikgpslayer.c:1085 +#, c-format +msgid "Downloaded %d trackpoint" +msgid_plural "Downloaded %d trackpoints" +msgstr[0] "Ladattiin %d reittipiste" +msgstr[1] "Ladattiin %d reittipistettä" + +#: ../src/vikgpslayer.c:1091 +#, c-format +msgid "Downloaded %d routepoint" +msgid_plural "Downloaded %d routepoints" +msgstr[0] "" +msgstr[1] "" + +#: ../src/vikgpslayer.c:1101 +#, c-format +msgid "Uploaded %d waypoint" +msgid_plural "Uploaded %d waypoints" +msgstr[0] "Kopioitu %d välietappi palvelimelle" +msgstr[1] "Kopioitu %d välietappia palvelimelle" + +#: ../src/vikgpslayer.c:1107 +#, c-format +msgid "Uploaded %d trackpoint" +msgid_plural "Uploaded %d trackpoints" +msgstr[0] "Kopioitu %d reittipiste palvelimelle" +msgstr[1] "Kopioitu %d reittipistettä palvelimelle" + +#: ../src/vikgpslayer.c:1113 +#, c-format +msgid "Uploaded %d routepoint" +msgid_plural "Uploaded %d routepoints" +msgstr[0] "" +msgstr[1] "" + +#: ../src/vikgpslayer.c:1363 +msgid "Error: No result." +msgstr "" + +#: ../src/vikgpslayer.c:1471 +msgid "Warning - GPS Upload items may overwrite each other" +msgstr "" + +#: ../src/vikgpslayer.c:1506 +msgid "Status: detecting gpsbabel" +msgstr "Tila: havaittiin gpsbabel" + +#: ../src/vikgpslayer.c:1533 +msgid "No GPS items selected for transfer." +msgstr "" + +#: ../src/vikgpslayer.c:1546 +msgid "Could not turn off device." +msgstr "" + +#: ../src/vikgpslayer.c:1589 +msgid "Are you sure you want to delete GPS Upload data?" +msgstr "Oletko varma, että haluat poistaa palvelimelle kopioidut GPS-tiedot?" + +#: ../src/vikgpslayer.c:1602 +msgid "Are you sure you want to delete GPS Download data?" +msgstr "Oletko varma, että haluat poistaa GPS-ladatut tiedot?" + +#: ../src/vikgpslayer.c:1616 +msgid "Are you sure you want to delete GPS Realtime data?" +msgstr "Oletko varma, että haluat poistaa GPS-tosiaikatiedot?" + +#: ../src/vikgpslayer.c:1630 +msgid "Are you sure you want to delete All GPS data?" +msgstr "Oletko varma, että haluat poistaa kaikki GPS-tiedot?" + +#: ../src/vikgpslayer.c:2004 +#, c-format +msgid "" +"Failed to connect to gpsd at %s (port %s)\n" +"Should Viking keep trying (every %d seconds)?" +msgstr "" + +#: ../src/viklayerspanel.c:73 +msgid "C_ut" +msgstr "" + +#: ../src/viklayerspanel.c:74 ../src/vikwindow.c:4882 +msgid "_Copy" +msgstr "Kop_ioi" + +#: ../src/viklayerspanel.c:75 ../src/vikwindow.c:4883 +msgid "_Paste" +msgstr "_Liitä" + +#: ../src/viklayerspanel.c:76 ../src/vikwindow.c:4884 +msgid "_Delete" +msgstr "_Poista" + +#: ../src/viklayerspanel.c:154 +msgid "New Layer" +msgstr "" + +#: ../src/viklayerspanel.c:347 +msgid "Top Layer" +msgstr "Ylin kerros" + +#: ../src/viklayerspanel.c:363 +msgid "Add new layer" +msgstr "Lisää uusi kerros" + +#: ../src/viklayerspanel.c:370 ../src/vikwindow.c:4884 +msgid "Remove selected layer" +msgstr "Siirrä valittu kerros" + +#: ../src/viklayerspanel.c:377 +msgid "Move selected layer up" +msgstr "Siirrä valittua kerrosta ylöspäin" + +#: ../src/viklayerspanel.c:384 +msgid "Move selected layer down" +msgstr "Siirrä valittua kerrosta alaspäin" + +#: ../src/viklayerspanel.c:391 ../src/vikwindow.c:4881 +msgid "Cut selected layer" +msgstr "Leikkaa valittu kerros" + +#: ../src/viklayerspanel.c:398 ../src/vikwindow.c:4882 +msgid "Copy selected layer" +msgstr "Kopioi valittu kerros" + +#: ../src/viklayerspanel.c:405 ../src/vikwindow.c:4883 +msgid "" +"Paste layer into selected container layer or otherwise above selected layer" +msgstr "" + +#: ../src/viklayerspanel.c:502 +msgid "New name can not be blank." +msgstr "" + +#: ../src/viklayerspanel.c:751 +msgid "Aggregate Layers have no settable properties." +msgstr "Aggregate-kerroksissa ei ole asetettavia ominaisuuksia." + +#: ../src/viklayerspanel.c:798 +msgid "You cannot cut the Top Layer." +msgstr "Et voi leikata ylintä kerrosta." + +#: ../src/viklayerspanel.c:843 +#, c-format +msgid "Are you sure you want to delete %s?" +msgstr "Oletko varma, että haluat poistaa kohteen %s?" + +#: ../src/viklayerspanel.c:863 +msgid "You cannot delete the Top Layer." +msgstr "Et voi poistaa ylintä kerrosta." + +#: ../src/vikmapniklayer.c:78 +msgid "CSS (MML) Config File:" +msgstr "" + +#: ../src/vikmapniklayer.c:79 +msgid "CartoCSS configuration file" +msgstr "" + +#: ../src/vikmapniklayer.c:80 +msgid "XML Config File:" +msgstr "" + +#: ../src/vikmapniklayer.c:81 +msgid "Mapnik XML configuration file" +msgstr "" + +#: ../src/vikmapniklayer.c:84 +msgid "Use File Cache:" +msgstr "" + +#: ../src/vikmapniklayer.c:86 +msgid "File Cache Directory:" +msgstr "" + +#: ../src/vikmapniklayer.c:122 +msgid "_Mapnik Features" +msgstr "" + +#: ../src/vikmapniklayer.c:122 +msgid "Mapnik Features" +msgstr "" + +#: ../src/vikmapniklayer.c:140 +msgid "Mapnik Rendering" +msgstr "" + +#. Changing these values only applies before first mapnik layer is 'created' +#: ../src/vikmapniklayer.c:258 +msgid "Plugins Directory:" +msgstr "" + +#: ../src/vikmapniklayer.c:258 ../src/vikmapniklayer.c:259 +#: ../src/vikmapniklayer.c:260 ../src/vikmapniklayer.c:261 +msgid "You need to restart Viking for a change to this value to be used" +msgstr "" + +#: ../src/vikmapniklayer.c:259 +msgid "Fonts Directory:" +msgstr "" + +#: ../src/vikmapniklayer.c:260 +msgid "Recurse Fonts Directory:" +msgstr "" + +#: ../src/vikmapniklayer.c:261 +msgid "Rerender Timeout (hours):" +msgstr "" + +#. Changeable any time +#: ../src/vikmapniklayer.c:263 +msgid "CartoCSS:" +msgstr "" + +#: ../src/vikmapniklayer.c:263 +msgid "The program to convert CartoCSS files into Mapnik XML" +msgstr "" + +#: ../src/vikmapniklayer.c:506 +msgid "Running" +msgstr "" + +#: ../src/vikmapniklayer.c:525 +#, c-format +msgid "" +"Error running carto command:\n" +"%s" +msgstr "" + +#: ../src/vikmapniklayer.c:561 +msgid " completed in " +msgstr "" + +#: ../src/vikmapniklayer.c:561 +msgid "seconds" +msgstr "" + +#: ../src/vikmapniklayer.c:611 ../src/vikmapniklayer.c:979 +#, c-format +msgid "" +"Mapnik error loading configuration file:\n" +"%s" +msgstr "" + +#: ../src/vikmapniklayer.c:749 +#, c-format +msgid "Mapnik Render %d:%d:%d %s" +msgstr "" + +#: ../src/vikmapniklayer.c:840 +msgid "Mapnik Rendering must be in Mercator mode" +msgstr "" + +#: ../src/vikmapniklayer.c:997 +msgid "Mapnik Information" +msgstr "" + +#: ../src/vikmapniklayer.c:1031 +msgid "_Flush Memory Cache" +msgstr "" + +#: ../src/vikmapniklayer.c:1044 +msgid "_Run Carto Command" +msgstr "" + +#: ../src/vikmapniklayer.c:1102 ../src/vikmapslayer.c:2029 +#, c-format +msgid "Tile File Timestamp: %s" +msgstr "" + +#: ../src/vikmapniklayer.c:1105 ../src/vikmapslayer.c:2032 +msgid "Tile File Timestamp: Not Available" +msgstr "" + +#: ../src/vikmapniklayer.c:1120 +#, c-format +msgid "Rendering time %.2f seconds" +msgstr "" + +#: ../src/vikmapniklayer.c:1124 ../src/vikmapslayer.c:2042 +msgid "Tile Information" +msgstr "" + +#: ../src/vikmapniklayer.c:1145 +msgid "_Rerender Tile" +msgstr "" + +#: ../src/vikmapniklayer.c:1150 +msgid "_Info" +msgstr "" + +#. ******* MAPZOOMS ******** +#: ../src/vikmapslayer.c:96 +msgid "Use Viking Zoom Level" +msgstr "Käytä Viking-loitonnus-/lähentämistasoa" + +#: ../src/vikmapslayer.c:146 +msgid "OSM" +msgstr "" + +#. NB mode => id - But can't break file format just to rename something better +#: ../src/vikmapslayer.c:152 +msgid "Map Type:" +msgstr "Karttatyyppi:" + +#: ../src/vikmapslayer.c:153 +msgid "Maps Directory:" +msgstr "Karttahakemisto:" + +#: ../src/vikmapslayer.c:154 +msgid "Cache Layout:" +msgstr "" + +#: ../src/vikmapslayer.c:155 +msgid "This determines the tile storage layout on disk" +msgstr "" + +#: ../src/vikmapslayer.c:156 +msgid "Map File:" +msgstr "" + +#: ../src/vikmapslayer.c:157 +msgid "An MBTiles file. Only applies when the map type method is 'MBTiles'" +msgstr "" + +#: ../src/vikmapslayer.c:159 +msgid "Control the Alpha value for transparency effects" +msgstr "" + +#: ../src/vikmapslayer.c:160 +msgid "Autodownload maps:" +msgstr "Lataa kartat automaattisesti:" + +#: ../src/vikmapslayer.c:161 +msgid "Autodownload Only Gets Missing Maps:" +msgstr "" + +#: ../src/vikmapslayer.c:162 +msgid "" +"Using this option avoids attempting to update already acquired tiles. This " +"can be useful if you want to restrict the network usage, without having to " +"resort to manual control. Only applies when 'Autodownload Maps' is on." +msgstr "" + +#: ../src/vikmapslayer.c:163 +msgid "Zoom Level:" +msgstr "Loitonnus-/lähentämistaso:" + +#: ../src/vikmapslayer.c:164 +msgid "" +"Determines the method of displaying map tiles for the current zoom level. " +"'Viking Zoom Level' uses the best matching level, otherwise setting a fixed " +"value will always use map tiles of the specified value regardless of the " +"actual zoom level." +msgstr "" + +#: ../src/vikmapslayer.c:197 +msgid "_Maps Download" +msgstr "" + +#: ../src/vikmapslayer.c:197 +msgid "Maps Download" +msgstr "Kartat ladattu" + +#: ../src/vikmapslayer.c:213 ../src/vikutils.c:895 +msgid "Map" +msgstr "Kartta" + +#: ../src/vikmapslayer.c:306 +msgid "Default map layer directory:" +msgstr "" + +#: ../src/vikmapslayer.c:306 +msgid "Choose a directory to store cached Map tiles for this layer" +msgstr "" + +#: ../src/vikmapslayer.c:436 ../src/vikmapslayer.c:633 +msgid "Unknown map type" +msgstr "Tuntematon karttatyyppi" + +#: ../src/vikmapslayer.c:664 +msgid "Unknown Map Zoom" +msgstr "Tuntematon karttaloitonnus/-lähennys" + +#: ../src/vikmapslayer.c:833 +#, c-format +msgid "Failed to open MBTiles file: %s" +msgstr "" + +#: ../src/vikmapslayer.c:856 +#, c-format +msgid "" +"New map cannot be displayed in the current drawmode.\n" +"Select \"%s\" from View menu to view it." +msgstr "" +"Uutta karttaa ei voida näyttää nykyisessä piirrostilassa.\n" +"Valitse ”%s” Näkymä-valikosta sen katsomiseksi." + +#: ../src/vikmapslayer.c:1314 +#, c-format +msgid "" +"Cowardly refusing to draw tiles or existence of tiles beyond %d zoom out " +"factor" +msgstr "" +"Raukkamaisesti kieltäydytään tiilien piirtämisestä tai tiilien esiintyminen " +"on loitonnus-/lähentämistekijän %d takana" + +#. TODO: ?? count up the number of download errors somehow... +#: ../src/vikmapslayer.c:1667 +msgid "Failed to download tile" +msgstr "" + +#: ../src/vikmapslayer.c:1673 +msgid "Unable to save tile" +msgstr "" + +#: ../src/vikmapslayer.c:1799 +#, c-format +msgid "Redownloading up to %d %s map..." +msgid_plural "Redownloading up to %d %s maps..." +msgstr[0] "Ladataan uudelleen korkeintaan %d %s kartta..." +msgstr[1] "Ladataan uudelleen kokeintaan %d %s karttaa..." + +#: ../src/vikmapslayer.c:1801 +#, c-format +msgid "Redownloading %d %s map..." +msgid_plural "Redownloading %d %s maps..." +msgstr[0] "Ladataan uudelleen %d %s kartta..." +msgstr[1] "Ladataan uudelleen %d %s karttaa..." + +#: ../src/vikmapslayer.c:1805 ../src/vikmapslayer.c:1890 +#, c-format +msgid "Downloading %d %s map..." +msgid_plural "Downloading %d %s maps..." +msgstr[0] "Ladataan %d %s kartta..." +msgstr[1] "Ladataan %d %s karttaa..." + +#: ../src/vikmapslayer.c:1969 +msgid "YES" +msgstr "" + +#: ../src/vikmapslayer.c:1973 ../src/vikmapslayer.c:1977 +msgid "NO" +msgstr "" + +#. NB Also handles .jpg automatically due to pixbuf_new_from () support - although just print png for now. +#: ../src/vikmapslayer.c:1980 +#, c-format +msgid "Source: %s (%d%s%d%s%d.%s %s)" +msgstr "" + +#: ../src/vikmapslayer.c:1983 +msgid "Source: Not available" +msgstr "" + +#: ../src/vikmapslayer.c:2000 +msgid "Source: file://" +msgstr "" + +#: ../src/vikmapslayer.c:2012 +#, c-format +msgid "Source: %s" +msgstr "" + +#: ../src/vikmapslayer.c:2038 +#, c-format +msgid "Tile File: %s [Not Available]" +msgstr "" + +#: ../src/vikmapslayer.c:2086 +msgid "Redownload _Bad Map(s)" +msgstr "Lataa uu_delleen huonot kartat" + +#: ../src/vikmapslayer.c:2090 +msgid "Redownload _New Map(s)" +msgstr "Lataa uudelleen _uudet kartat" + +#: ../src/vikmapslayer.c:2094 +msgid "Redownload _All Map(s)" +msgstr "Lataa _uudelleen kaikki kartat" + +#: ../src/vikmapslayer.c:2099 +msgid "_Show Tile Information" +msgstr "" + +#: ../src/vikmapslayer.c:2166 +#, c-format +msgid "" +"Wrong drawmode for this map.\n" +"Select \"%s\" from View menu and try again." +msgstr "" +"Väärä piirrostila tälle kartalle.\n" +"Valitse ”%s” Näkymä-valikosta ja yritä uudelleen." + +#: ../src/vikmapslayer.c:2171 +msgid "Wrong zoom level for this map." +msgstr "Väärä loitonnus-/lähennystaso tälle kartalle." + +#: ../src/vikmapslayer.c:2334 +msgid "Zoom Start:" +msgstr "" + +#: ../src/vikmapslayer.c:2341 +msgid "Zoom End:" +msgstr "" + +#: ../src/vikmapslayer.c:2347 +msgid "Download Maps Method:" +msgstr "" + +#. redownload method - needs to align with REDOWNLOAD* macro values +#: ../src/vikmapslayer.c:2419 +msgid "Missing" +msgstr "" + +#: ../src/vikmapslayer.c:2419 +msgid "Bad" +msgstr "" + +#: ../src/vikmapslayer.c:2419 +msgid "New" +msgstr "" + +#: ../src/vikmapslayer.c:2419 +msgid "Reload All" +msgstr "" + +#: ../src/vikmapslayer.c:2421 +msgid "Download for Zoom Levels" +msgstr "" + +#: ../src/vikmapslayer.c:2461 +#, c-format +msgid "" +"You are not allowed to download more than %d tiles in one go (requested %d)" +msgstr "" + +#: ../src/vikmapslayer.c:2469 +#, c-format +msgid "Do you really want to download %d tiles?" +msgstr "" + +#. Now with icons +#: ../src/vikmapslayer.c:2509 +msgid "Download _Missing Onscreen Maps" +msgstr "Lataa _puuttuva näytön kartat" + +#: ../src/vikmapslayer.c:2516 +msgid "Download _New Onscreen Maps" +msgstr "Lataa uu_det näytön kartat" + +#: ../src/vikmapslayer.c:2523 +msgid "Reload _All Onscreen Maps" +msgstr "Lat_aa uudelleen kaikki näytön kartat" + +#: ../src/vikmapslayer.c:2529 +msgid "Download Maps in _Zoom Levels..." +msgstr "" + +#: ../src/vikmapslayer.c:2539 +#, fuzzy +msgid "_Open MBTiles Files" +msgstr "A_vaa äskeinen tiedosto" + +#: ../src/vikmapslayer.c:2554 +msgid "Flush Map Cache" +msgstr "" + +#: ../src/vikrouting.c:54 +msgid "Default engine:" +msgstr "" + +#: ../src/vikrouting.c:68 +msgid "Routing" +msgstr "" + +#: ../src/viktreeview.c:347 +msgid "Layer Name" +msgstr "Kerrosnimi" + +#: ../src/viktreeview.c:924 +#, c-format +msgid "delete data from %s\n" +msgstr "poista tiedot kohteesta %s\n" + +#: ../src/viktrwlayer.c:427 +msgid "Create _Waypoint" +msgstr "" + +#: ../src/viktrwlayer.c:427 +msgid "Create Waypoint" +msgstr "Luo välietappi" + +#: ../src/viktrwlayer.c:437 +#, fuzzy +msgid "Edit _Track" +msgstr "Muokkaa reittipistettä" + +#: ../src/viktrwlayer.c:437 +#, fuzzy +msgid "Edit Track" +msgstr "Muokkaa reittipistettä" + +#: ../src/viktrwlayer.c:449 +msgid "Edit _Route" +msgstr "" + +#: ../src/viktrwlayer.c:449 +#, fuzzy +msgid "Edit Route" +msgstr "Muokkaa välietappia" + +#: ../src/viktrwlayer.c:460 +msgid "Route _Finder" +msgstr "" + +#: ../src/viktrwlayer.c:460 +msgid "Route Finder" +msgstr "Reittietsijä" + +#: ../src/viktrwlayer.c:471 +#, fuzzy +msgid "Splitter" +msgstr "Jaa osiin tässä" + +#: ../src/viktrwlayer.c:482 +msgid "_Edit Waypoint" +msgstr "" + +#: ../src/viktrwlayer.c:482 +msgid "Edit Waypoint" +msgstr "Muokkaa välietappia" + +#: ../src/viktrwlayer.c:495 +msgid "Edit Trac_kpoint" +msgstr "" + +#: ../src/viktrwlayer.c:495 +msgid "Edit Trackpoint" +msgstr "Muokkaa reittipistettä" + +#. a pixbuf for this one is already made globally available +#: ../src/viktrwlayer.c:508 +msgid "Show P_icture" +msgstr "" + +#: ../src/viktrwlayer.c:508 +msgid "Show Picture" +msgstr "Näytä kuva" + +#: ../src/viktrwlayer.c:531 +msgid "Waypoint Images" +msgstr "Välietappikuvat" + +#: ../src/viktrwlayer.c:531 +msgid "Tracks Advanced" +msgstr "" + +#: ../src/viktrwlayer.c:531 +msgid "Metadata" +msgstr "" + +#: ../src/viktrwlayer.c:531 +#, fuzzy +msgid "Filesystem" +msgstr "Tiedostotyyppi:" + +#: ../src/viktrwlayer.c:534 +msgid "Draw by Track" +msgstr "Piirrä reitin mukaan" + +#: ../src/viktrwlayer.c:534 +msgid "Draw by Speed" +msgstr "" + +#: ../src/viktrwlayer.c:534 +msgid "All Tracks Same Color" +msgstr "" + +#: ../src/viktrwlayer.c:535 +msgid "Filled Square" +msgstr "Täytetty nelikulmio" + +#: ../src/viktrwlayer.c:535 +msgid "Square" +msgstr "Nelikulmio" + +#: ../src/viktrwlayer.c:535 +msgid "Circle" +msgstr "Ympyrä" + +#: ../src/viktrwlayer.c:535 +msgid "X" +msgstr "X" + +#: ../src/viktrwlayer.c:561 +msgid "Extra Extra Small" +msgstr "" + +#: ../src/viktrwlayer.c:562 +msgid "Extra Small" +msgstr "" + +#: ../src/viktrwlayer.c:566 +msgid "Extra Large" +msgstr "" + +#: ../src/viktrwlayer.c:567 +msgid "Extra Extra Large" +msgstr "" + +#: ../src/viktrwlayer.c:573 +msgid "Name Ascending" +msgstr "" + +#: ../src/viktrwlayer.c:574 +msgid "Name Descending" +msgstr "" + +#: ../src/viktrwlayer.c:582 ../src/viktrwlayer_propwin.c:3319 +msgid "No" +msgstr "" + +#: ../src/viktrwlayer.c:583 +msgid "Yes" +msgstr "" + +#: ../src/viktrwlayer.c:584 +msgid "No write" +msgstr "" + +#: ../src/viktrwlayer.c:649 ../src/viktrwlayer.c:673 +msgid "Draw Labels" +msgstr "Piirrä nimiöt" + +#: ../src/viktrwlayer.c:650 +msgid "Note: the individual track controls what labels may be displayed" +msgstr "" + +#: ../src/viktrwlayer.c:651 +msgid "Track Labels Font Size:" +msgstr "" + +#: ../src/viktrwlayer.c:652 +msgid "Track Drawing Mode:" +msgstr "Reittipiirrostila:" + +#: ../src/viktrwlayer.c:653 +msgid "All Tracks Color:" +msgstr "" + +#: ../src/viktrwlayer.c:654 +msgid "The color used when 'All Tracks Same Color' drawing mode is selected" +msgstr "" + +#: ../src/viktrwlayer.c:655 +msgid "Draw Track Lines" +msgstr "Piirrä reittiviivat" + +#: ../src/viktrwlayer.c:656 +msgid "Track Thickness:" +msgstr "Reittipaksuus:" + +#: ../src/viktrwlayer.c:657 +msgid "Draw Track Direction" +msgstr "" + +#: ../src/viktrwlayer.c:658 +msgid "Direction Size:" +msgstr "" + +#: ../src/viktrwlayer.c:659 +msgid "Draw Trackpoints" +msgstr "Piirrä reittipisteet" + +#: ../src/viktrwlayer.c:660 +msgid "Trackpoint Size:" +msgstr "" + +#: ../src/viktrwlayer.c:661 +msgid "Draw Elevation" +msgstr "Piirrä korkeusasema" + +#: ../src/viktrwlayer.c:662 +msgid "Draw Elevation Height %:" +msgstr "Piirrä korkeusaseman korkeus %:" + +#: ../src/viktrwlayer.c:663 +msgid "Draw Stops" +msgstr "Piirrä pysähdykset" + +#: ../src/viktrwlayer.c:664 +msgid "" +"Whether to draw a marker when trackpoints are at the same position but over " +"the minimum stop length apart in time" +msgstr "" + +#: ../src/viktrwlayer.c:665 +msgid "Min Stop Length (seconds):" +msgstr "Pienin pysähdyspituus (sekunteina):" + +#: ../src/viktrwlayer.c:667 +msgid "Track BG Thickness:" +msgstr "Reitin taustapaksuus:" + +#: ../src/viktrwlayer.c:668 +msgid "Track Background Color" +msgstr "Reitin taustaväri" + +#: ../src/viktrwlayer.c:669 +msgid "Draw by Speed Factor (%):" +msgstr "" + +#: ../src/viktrwlayer.c:670 +msgid "" +"The percentage factor away from the average speed determining the color used" +msgstr "" + +#: ../src/viktrwlayer.c:671 +msgid "Track Sort Order:" +msgstr "" + +#: ../src/viktrwlayer.c:674 +msgid "Waypoint Font Size:" +msgstr "" + +#: ../src/viktrwlayer.c:675 +msgid "Waypoint Color:" +msgstr "Välietapin väri:" + +#: ../src/viktrwlayer.c:676 +msgid "Waypoint Text:" +msgstr "Välietappiteksti:" + +#: ../src/viktrwlayer.c:677 +msgid "Background:" +msgstr "Tausta:" + +#: ../src/viktrwlayer.c:678 +msgid "Fake BG Color Translucency:" +msgstr "Teeskennelty taustavärin ĺäpikuultavuus:" + +#: ../src/viktrwlayer.c:679 +msgid "Waypoint marker:" +msgstr "Välietappimerkki:" + +#: ../src/viktrwlayer.c:680 +msgid "Waypoint size:" +msgstr "Välietapin koko:" + +#: ../src/viktrwlayer.c:681 +msgid "Draw Waypoint Symbols:" +msgstr "Piirrä välietappisymbolit:" + +#: ../src/viktrwlayer.c:682 +msgid "Waypoint Sort Order:" +msgstr "" + +#: ../src/viktrwlayer.c:684 +msgid "Draw Waypoint Images" +msgstr "Piirrä välietappikuvat" + +#: ../src/viktrwlayer.c:685 +msgid "Image Size (pixels):" +msgstr "Kuvakoko (pikseliä):" + +#: ../src/viktrwlayer.c:686 +msgid "Image Alpha:" +msgstr "Kuva-alfa:" + +#: ../src/viktrwlayer.c:687 +msgid "Image Memory Cache Size:" +msgstr "Kuvamuistin välimuistikoko:" + +#: ../src/viktrwlayer.c:690 +msgid "Author" +msgstr "" + +#: ../src/viktrwlayer.c:691 +msgid "Creation Time" +msgstr "" + +#: ../src/viktrwlayer.c:692 +msgid "Keywords" +msgstr "" + +#: ../src/viktrwlayer.c:693 +msgid "External layer:" +msgstr "" + +#: ../src/viktrwlayer.c:693 +msgid "" +"Layer data stored in the Viking file, in an external file, or in an external " +"file but changes are not written to the file (file only loaded at startup)" +msgstr "" + +#: ../src/viktrwlayer.c:694 +msgid "Save layer as:" +msgstr "" + +#: ../src/viktrwlayer.c:694 +msgid "Specify where layer should be saved. Overwrites file if it exists." +msgstr "" + +#: ../src/viktrwlayer.c:798 +msgid "TrackWaypoint" +msgstr "" + +#: ../src/viktrwlayer.c:1999 ../src/viktrwlayer_propwin.c:1469 +#: ../src/viktrwlayer_propwin.c:1471 ../src/vikutils.c:299 +#: ../src/vikutils.c:326 +msgid "miles" +msgstr "" + +#: ../src/viktrwlayer.c:2002 ../src/viktrwlayer_propwin.c:1475 +#: ../src/viktrwlayer_propwin.c:1477 ../src/vikutils.c:303 +#: ../src/vikutils.c:330 +msgid "NM" +msgstr "" + +#. VIK_UNITS_DISTANCE_KILOMETRES: +#: ../src/viktrwlayer.c:2006 ../src/viktrwlayer_propwin.c:1482 +#: ../src/viktrwlayer_propwin.c:1484 ../src/vikutils.c:308 +#: ../src/vikutils.c:335 +msgid "km" +msgstr "" + +#: ../src/viktrwlayer.c:2121 +msgid "start/end" +msgstr "" + +#: ../src/viktrwlayer.c:2133 +msgid "start" +msgstr "" + +#: ../src/viktrwlayer.c:2142 +msgid "end" +msgstr "" + +#: ../src/viktrwlayer.c:3103 +#, c-format +msgid " in %d:%02d hrs:mins" +msgstr " ajassa %d:%02d tuntia:minuuttia" + +#: ../src/viktrwlayer.c:3107 +#, c-format +msgid "" +"\n" +"%sTotal Length %.1f %s%s" +msgstr "" +"\n" +"%sKokonaispituus %.1f %s%s" + +#: ../src/viktrwlayer.c:3131 +#, c-format +msgid "" +"\n" +"Total route length %.1f %s" +msgstr "" + +#: ../src/viktrwlayer.c:3136 +#, c-format +msgid "Tracks: %d - Waypoints: %d - Routes: %d%s%s" +msgstr "" + +#: ../src/viktrwlayer.c:3155 +#, c-format +msgid "Tracks: %d" +msgstr "" + +#: ../src/viktrwlayer.c:3165 +#, c-format +msgid "Routes: %d" +msgstr "" + +#: ../src/viktrwlayer.c:3195 +#, c-format +msgid "- %d:%02d hrs:mins" +msgstr "- %d:%02d tuntia:minuuttia" + +#: ../src/viktrwlayer.c:3202 +#, c-format +msgid "%s%.1f km %s" +msgstr "%s%.1f km %s" + +#: ../src/viktrwlayer.c:3205 +#, c-format +msgid "%s%.1f miles %s" +msgstr "%s%.1f mailia %s" + +#: ../src/viktrwlayer.c:3208 +#, c-format +msgid "%s%.1f NM %s" +msgstr "" + +#: ../src/viktrwlayer.c:3222 +#, c-format +msgid "Waypoints: %d" +msgstr "" + +#: ../src/viktrwlayer.c:3279 +#, c-format +msgid "Wpt: Alt %dft" +msgstr "Wpt: Korkeus %d jalkaa" + +#. VIK_UNITS_HEIGHT_METRES: +#: ../src/viktrwlayer.c:3283 +#, c-format +msgid "Wpt: Alt %dm" +msgstr "Wpt: Korkeus %d m" + +#. Add comment if available +#: ../src/viktrwlayer.c:3298 +#, c-format +msgid "%s | %s %s | Comment: %s" +msgstr "%s | %s %s | Kommentti: %s" + +#: ../src/viktrwlayer.c:3300 +#, c-format +msgid "%s | %s %s" +msgstr "%s | %s %s" + +#: ../src/viktrwlayer.c:3562 ../src/viktrwlayer.c:3591 +msgid "This layer has no waypoints or trackpoints." +msgstr "Tässä kerroksessa ei ole välietappeja tai reittipisteitä." + +#: ../src/viktrwlayer.c:3598 ../src/viktrwlayer.c:3607 +#: ../src/viktrwlayer.c:3616 ../src/viktrwlayer.c:3625 +#: ../src/viktrwlayer.c:3634 ../src/viktrwlayer.c:3642 +msgid "Export Layer" +msgstr "Vie kerros" + +#: ../src/viktrwlayer.c:3671 +msgid "Export Route as GPX" +msgstr "" + +#: ../src/viktrwlayer.c:3673 +msgid "Export Track as GPX" +msgstr "Vie reitti GPX:nä" + +#: ../src/viktrwlayer.c:3693 +msgid "Find" +msgstr "Etsi" + +#: ../src/viktrwlayer.c:3703 +msgid "Waypoint Name:" +msgstr "Välietapin nimi:" + +#: ../src/viktrwlayer.c:3720 +msgid "Waypoint not found in this layer." +msgstr "Välietappia ei löytynyt tässä kerroksessa." + +#: ../src/viktrwlayer.c:3989 +msgid "Can not upload invisible track." +msgstr "" + +#: ../src/viktrwlayer.c:4082 ../src/viktrwlayer.c:10512 +msgid "Track" +msgstr "Reitti" + +#: ../src/viktrwlayer.c:4107 ../src/viktrwlayer.c:10599 +msgid "Route" +msgstr "" + +#: ../src/viktrwlayer.c:4194 +msgid "Externa_l" +msgstr "" + +#: ../src/viktrwlayer.c:4216 ../src/viktrwlayer.c:8456 +#: ../src/viktrwlayer.c:8574 +msgid "_Finish Route" +msgstr "" + +#: ../src/viktrwlayer.c:4218 ../src/viktrwlayer.c:8380 +#: ../src/viktrwlayer.c:8572 +msgid "_Finish Track" +msgstr "" + +#. Now with icons +#: ../src/viktrwlayer.c:4230 +msgid "_View Layer" +msgstr "_Näkymäkerros" + +#: ../src/viktrwlayer.c:4237 +msgid "V_iew" +msgstr "" + +#: ../src/viktrwlayer.c:4243 +msgid "View All _Tracks" +msgstr "" + +#: ../src/viktrwlayer.c:4248 +msgid "View All _Routes" +msgstr "" + +#: ../src/viktrwlayer.c:4253 +msgid "View All _Waypoints" +msgstr "" + +#: ../src/viktrwlayer.c:4258 +msgid "_Goto Center of Layer" +msgstr "Sii_rry kerroksen keskustaan" + +#: ../src/viktrwlayer.c:4264 ../src/viktrwlayer.c:8321 +msgid "Goto _Waypoint..." +msgstr "Siirry _välietappiin..." + +#: ../src/viktrwlayer.c:4270 +msgid "_Export Layer" +msgstr "_Vie kerros" + +#: ../src/viktrwlayer.c:4276 +msgid "Export as GPS_Point..." +msgstr "Vie tyyppinä GPS_Point..." + +#: ../src/viktrwlayer.c:4281 +msgid "Export as GPS_Mapper..." +msgstr "Vie tyyppinä GPS_Mapper..." + +#: ../src/viktrwlayer.c:4286 +msgid "Export as _GPX..." +msgstr "Vie tyyppinä _GPX..." + +#: ../src/viktrwlayer.c:4292 +msgid "Export as _KML..." +msgstr "Vie tyyppinä _KML..." + +#: ../src/viktrwlayer.c:4299 +msgid "Export as GEO_JSON..." +msgstr "" + +#: ../src/viktrwlayer.c:4306 +msgid "Export via GPSbabel..." +msgstr "" + +#: ../src/viktrwlayer.c:4312 +#, c-format +msgid "Open with External Program_1: %s" +msgstr "" + +#: ../src/viktrwlayer.c:4319 +#, c-format +msgid "Open with External Program_2: %s" +msgstr "" + +#: ../src/viktrwlayer.c:4327 ../src/vikwindow.c:4825 +msgid "_New" +msgstr "_Uusi" + +#: ../src/viktrwlayer.c:4333 +msgid "New _Waypoint..." +msgstr "" + +#: ../src/viktrwlayer.c:4339 +msgid "New _Track" +msgstr "" + +#: ../src/viktrwlayer.c:4347 +msgid "New _Route" +msgstr "" + +#: ../src/viktrwlayer.c:4356 ../src/viktrwlayer.c:8232 +#: ../src/viktrwlayer.c:9003 +msgid "Geotag _Images..." +msgstr "Geotag-_kuvat..." + +#: ../src/viktrwlayer.c:4363 +msgid "_Acquire" +msgstr "" + +#: ../src/viktrwlayer.c:4369 ../src/vikwindow.c:4904 +msgid "From _GPS..." +msgstr "_GPS:stä..." + +#. FIXME: only add menu when at least a routing engine has support for Directions +#: ../src/viktrwlayer.c:4375 +msgid "From _Directions..." +msgstr "" + +#: ../src/viktrwlayer.c:4381 +msgid "From _OSM Traces..." +msgstr "_OSM-jäljistä..." + +#: ../src/viktrwlayer.c:4386 +msgid "From _My OSM Traces..." +msgstr "" + +#: ../src/viktrwlayer.c:4392 ../src/vikwindow.c:4844 +msgid "From _URL..." +msgstr "" + +#: ../src/viktrwlayer.c:4399 ../src/vikwindow.c:4846 +msgid "From _Wikipedia Waypoints" +msgstr "" + +#: ../src/viktrwlayer.c:4405 +msgid "Within _Layer Bounds" +msgstr "Kerr_osrajojen sisällä" + +#: ../src/viktrwlayer.c:4411 +msgid "Within _Current View" +msgstr "Nykyisen nä_kymän sisällä" + +#: ../src/viktrwlayer.c:4419 +msgid "From Geo_caching..." +msgstr "Geo_kätköistä..." + +#: ../src/viktrwlayer.c:4426 ../src/vikwindow.c:4842 +msgid "From Geotagged _Images..." +msgstr "Geotagged-_kuvista..." + +#: ../src/viktrwlayer.c:4433 +msgid "From _File..." +msgstr "" + +#: ../src/viktrwlayer.c:4436 ../src/vikwindow.c:4905 +msgid "Import File With GPS_Babel..." +msgstr "Tuo tiedosto ohjelmalla GPS_Babel..." + +#: ../src/viktrwlayer.c:4443 ../src/viktrwlayer.c:8905 +msgid "_Upload" +msgstr "" + +#: ../src/viktrwlayer.c:4449 +msgid "Upload to _GPS..." +msgstr "" + +#: ../src/viktrwlayer.c:4456 ../src/viktrwlayer.c:8973 +msgid "Upload to _OSM..." +msgstr "Kopioi _OSM-palvelimelle..." + +#: ../src/viktrwlayer.c:4464 +msgid "De_lete" +msgstr "Po_ista" + +#: ../src/viktrwlayer.c:4470 +msgid "Delete All _Tracks" +msgstr "Poista kaikki _reitit" + +#: ../src/viktrwlayer.c:4477 +msgid "Delete Tracks _From Selection..." +msgstr "_Poista reitit valinnasta..." + +#: ../src/viktrwlayer.c:4484 ../src/viktrwlayer.c:8481 +msgid "Delete _All Routes" +msgstr "" + +#: ../src/viktrwlayer.c:4491 ../src/viktrwlayer.c:8487 +msgid "_Delete Routes From Selection..." +msgstr "" + +#: ../src/viktrwlayer.c:4498 +msgid "Delete All _Waypoints" +msgstr "Poista _kaikki välietapit" + +#: ../src/viktrwlayer.c:4505 +msgid "Delete Waypoints From _Selection..." +msgstr "Poista _välietapit valinnasta..." + +#: ../src/viktrwlayer.c:4512 ../src/viktrwlayer.c:8339 +#, fuzzy +msgid "Delete Duplicate Waypoints" +msgstr "Poista välietappien kaksoiskappaleet" + +#: ../src/viktrwlayer.c:5198 +#, c-format +msgid "Are you sure you want to delete all tracks in %s?" +msgstr "Oletko varma, että haluat poistaa kaikki reitit kohteessa %s?" + +#: ../src/viktrwlayer.c:5211 +#, c-format +msgid "Are you sure you want to delete all routes in %s?" +msgstr "" + +#: ../src/viktrwlayer.c:5221 +#, c-format +msgid "Are you sure you want to delete all waypoints in %s?" +msgstr "Oletko varma, että haluat poistaa kaikki välietapit kohteessa %s?" + +#: ../src/viktrwlayer.c:5238 +#, c-format +msgid "Are you sure you want to delete the waypoint \"%s\"?" +msgstr "" + +#: ../src/viktrwlayer.c:5254 +#, c-format +msgid "Are you sure you want to delete the track \"%s\"?" +msgstr "" + +#: ../src/viktrwlayer.c:5271 +#, c-format +msgid "Are you sure you want to delete the route \"%s\"?" +msgstr "" + +#: ../src/viktrwlayer.c:5527 ../src/viktrwlayer.c:6373 +msgid "" +"Converting a track to a route removes extra track data such as segments, " +"timestamps, etc...\n" +"Do you want to continue?" +msgstr "" + +#: ../src/viktrwlayer.c:5631 +msgid "No DEM layers available, thus no DEM values can be applied." +msgstr "" + +#: ../src/viktrwlayer.c:5651 ../src/viktrwlayer.c:5692 +#, c-format +msgid "%ld point adjusted" +msgid_plural "%ld points adjusted" +msgstr[0] "" +msgstr[1] "" + +#: ../src/viktrwlayer.c:5736 +#, c-format +msgid "%ld waypoint changed" +msgid_plural "%ld waypoints changed" +msgstr[0] "" +msgstr[1] "" + +#: ../src/viktrwlayer.c:5917 +#, c-format +msgid "" +"Refining a track with many points (%d) is unlikely to yield sensible " +"results. Do you want to Continue?" +msgstr "" + +#. Select engine from dialog +#: ../src/viktrwlayer.c:5925 +msgid "Refine Route with Routing Engine..." +msgstr "" + +#: ../src/viktrwlayer.c:5933 +msgid "Select routing engine" +msgstr "" + +#: ../src/viktrwlayer.c:6158 +msgid "Failed. No other tracks with timestamps in this layer found" +msgstr "Epäonnistui. Tästä kerroksesta ei löytynyt reittejä aikaleimoilla" + +#: ../src/viktrwlayer.c:6160 +msgid "Failed. No other tracks without timestamps in this layer found" +msgstr "" +"Epäonnistui. Tästä kerroksesta ei löytynyt muita reittejä ilman aikaleimoja" + +#: ../src/viktrwlayer.c:6179 +msgid "Merge with..." +msgstr "Yhdistetty kohteeseen..." + +#: ../src/viktrwlayer.c:6180 +msgid "Select route to merge with" +msgstr "" + +#: ../src/viktrwlayer.c:6180 +msgid "Select track to merge with" +msgstr "Valitse reitti, joka yhdistetään" + +#: ../src/viktrwlayer.c:6264 ../src/viktrwlayer.c:6346 +msgid "Append Route" +msgstr "" + +#: ../src/viktrwlayer.c:6264 ../src/viktrwlayer.c:6346 +msgid "Append Track" +msgstr "" + +#: ../src/viktrwlayer.c:6265 +msgid "Select the route to append after the current route" +msgstr "" + +#: ../src/viktrwlayer.c:6266 +msgid "Select the track to append after the current track" +msgstr "" + +#: ../src/viktrwlayer.c:6347 +msgid "Select the track to append after the current route" +msgstr "" + +#: ../src/viktrwlayer.c:6348 +msgid "Select the route to append after the current track" +msgstr "" + +#: ../src/viktrwlayer.c:6414 +#, c-format +msgid "%d segment merged" +msgid_plural "%d segments merged" +msgstr[0] "" +msgstr[1] "" + +#: ../src/viktrwlayer.c:6430 +msgid "Failed. This track does not have timestamp" +msgstr "Epäonnistui. Tällä reitillä ei ole aikaleimaa" + +#: ../src/viktrwlayer.c:6442 +msgid "Failed. No other track in this layer has timestamp" +msgstr "" +"Epäonnistui. Millään muulla reitillä tässä kerroksessa ei ole aikaleimaa" + +#: ../src/viktrwlayer.c:6449 +msgid "Merge Threshold..." +msgstr "Yhdistämiskynnys..." + +#: ../src/viktrwlayer.c:6450 +msgid "Merge when time between tracks less than:" +msgstr "Yhdistä, kun aika reittien välillä on pienempi kuin:" + +#: ../src/viktrwlayer.c:6580 +msgid "Split Threshold..." +msgstr "Halkaise kynnys..." + +#: ../src/viktrwlayer.c:6581 +msgid "Split when time between trackpoints exceeds:" +msgstr "Jaa kahtia kun reittipisteiden välinen aika ylittää:" + +#: ../src/viktrwlayer.c:6598 +#, c-format +msgid "" +"Can not split track due to trackpoints not ordered in time - such as at %s.\n" +"\n" +"Goto this trackpoint?" +msgstr "" + +#: ../src/viktrwlayer.c:6668 +msgid "Split Every Nth Point" +msgstr "Jaa osiin joka N. piste" + +#: ../src/viktrwlayer.c:6669 +msgid "Split on every Nth point:" +msgstr "Jaa osiin joka N. pisteellä:" + +#: ../src/viktrwlayer.c:6779 +msgid "Can not split track as it has no segments" +msgstr "" + +#: ../src/viktrwlayer.c:6861 ../src/viktrwlayer.c:6891 +#, c-format +msgid "Deleted %ld point" +msgid_plural "Deleted %ld points" +msgstr[0] "" +msgstr[1] "" + +#: ../src/viktrwlayer.c:6966 ../src/viktrwlayer.c:10989 +#: ../src/viktrwlayer_waypointlist.c:214 +#, c-format +msgid "Could not launch %s to open file." +msgstr "Kohteen %s käynnistäminen tiedoston avaamiseksi epäonnistui." + +#: ../src/viktrwlayer.c:6992 ../src/viktrwlayer.c:7113 +msgid "This track has no date information." +msgstr "" + +#: ../src/viktrwlayer.c:7006 ../src/viktrwlayer.c:7136 +msgid "This waypoint has no date information." +msgstr "" + +#: ../src/viktrwlayer.c:7030 +#, c-format +msgid "Could not launch %s" +msgstr "" + +#: ../src/viktrwlayer.c:7269 +msgid "Internal Error in vik_trw_layer_uniquify_tracks" +msgstr "" + +#: ../src/viktrwlayer.c:7374 ../src/viktrwlayer.c:7424 +#: ../src/viktrwlayer.c:7587 +msgid "" +"Multiple entries with the same name exist. This method only works with " +"unique names. Force unique names now?" +msgstr "" + +#: ../src/viktrwlayer.c:7385 +msgid "No tracks found" +msgstr "Reittejä ei löytynyt" + +#: ../src/viktrwlayer.c:7393 ../src/viktrwlayer.c:7443 +#: ../src/viktrwlayer.c:7607 +msgid "Delete Selection" +msgstr "Poista valinta" + +#: ../src/viktrwlayer.c:7394 +msgid "Select tracks to delete" +msgstr "Valitse poistettavat reitit" + +#: ../src/viktrwlayer.c:7435 +msgid "No routes found" +msgstr "" + +#: ../src/viktrwlayer.c:7444 +msgid "Select routes to delete" +msgstr "" + +#: ../src/viktrwlayer.c:7550 +msgid "Internal Error in vik_trw_layer_uniquify_waypoints" +msgstr "" + +#: ../src/viktrwlayer.c:7597 +msgid "No waypoints found" +msgstr "Välietappeja ei löytynyt" + +#: ../src/viktrwlayer.c:7608 +msgid "Select waypoints to delete" +msgstr "Valitse poistettavat välietapit" + +#: ../src/viktrwlayer.c:7691 +#, fuzzy, c-format +msgid "%ld waypoint deleted" +msgid_plural "%ld waypoints deleted" +msgstr[0] "Valitse poistettavat välietapit" +msgstr[1] "Valitse poistettavat välietapit" + +#: ../src/viktrwlayer.c:7697 +#, fuzzy +msgid "No duplicates found" +msgstr "Välietappeja ei löytynyt" + +#: ../src/viktrwlayer.c:8028 +#, c-format +msgid "" +"A waypoint with the name \"%s\" already exists. Really rename to the same " +"name?" +msgstr "" + +#: ../src/viktrwlayer.c:8058 +#, c-format +msgid "" +"A track with the name \"%s\" already exists. Really rename to the same name?" +msgstr "" + +#: ../src/viktrwlayer.c:8095 +#, c-format +msgid "" +"A route with the name \"%s\" already exists. Really rename to the same name?" +msgstr "" + +#: ../src/viktrwlayer.c:8215 ../src/viktrwlayer.c:8602 +msgid "_Goto" +msgstr "_Siirry" + +#: ../src/viktrwlayer.c:8226 +msgid "_Visit Geocache Webpage" +msgstr "_Vieraile Geocache-webbisivulla" + +#: ../src/viktrwlayer.c:8235 +msgid "Geotag multiple images against this waypoint" +msgstr "" + +#: ../src/viktrwlayer.c:8245 ../src/viktrwlayer_waypointlist.c:352 +msgid "_Show Picture..." +msgstr "Näytä k_uva" + +#: ../src/viktrwlayer.c:8253 +msgid "Update Geotag on _Image" +msgstr "Päivitä Geotag-tunnistetta _kuvassa" + +#: ../src/viktrwlayer.c:8259 +msgid "_Update" +msgstr "_Päivitä" + +#: ../src/viktrwlayer.c:8264 +msgid "Update and _Keep File Timestamp" +msgstr "Päivitä ja pidä tiedostoaikaleima" + +#: ../src/viktrwlayer.c:8276 +msgid "Visit _Webpage" +msgstr "" + +#: ../src/viktrwlayer.c:8306 +msgid "_New Waypoint..." +msgstr "_Uusi välietappi..." + +#: ../src/viktrwlayer.c:8315 +msgid "_View All Waypoints" +msgstr "Ka_tso kaikkia välietappeja" + +#: ../src/viktrwlayer.c:8327 +msgid "Delete _All Waypoints" +msgstr "Poist_a kaikki välietapit" + +#: ../src/viktrwlayer.c:8333 +msgid "_Delete Waypoints From Selection..." +msgstr "_Poista välietapit valinnasta..." + +#: ../src/viktrwlayer.c:8351 +msgid "_Show All Waypoints" +msgstr "" + +#: ../src/viktrwlayer.c:8357 +msgid "_Hide All Waypoints" +msgstr "" + +#: ../src/viktrwlayer.c:8369 +msgid "_List Waypoints..." +msgstr "" + +#: ../src/viktrwlayer.c:8390 +msgid "_View All Tracks" +msgstr "Katso kaikk_ia reittejä" + +#: ../src/viktrwlayer.c:8396 +msgid "_New Track" +msgstr "" + +#: ../src/viktrwlayer.c:8404 +msgid "Delete _All Tracks" +msgstr "Poi_sta kaikki reitit" + +#: ../src/viktrwlayer.c:8410 +msgid "_Delete Tracks From Selection..." +msgstr "_Poista reitit valinnasta..." + +#: ../src/viktrwlayer.c:8422 +msgid "_Show All Tracks" +msgstr "" + +#: ../src/viktrwlayer.c:8428 +msgid "_Hide All Tracks" +msgstr "" + +#: ../src/viktrwlayer.c:8439 +msgid "_List Tracks..." +msgstr "" + +#: ../src/viktrwlayer.c:8467 +msgid "_View All Routes" +msgstr "" + +#: ../src/viktrwlayer.c:8473 +msgid "_New Route" +msgstr "" + +#: ../src/viktrwlayer.c:8499 +msgid "_Show All Routes" +msgstr "" + +#: ../src/viktrwlayer.c:8505 +msgid "_Hide All Routes" +msgstr "" + +#: ../src/viktrwlayer.c:8516 +msgid "_List Routes..." +msgstr "" + +#: ../src/viktrwlayer.c:8587 +msgid "_View Track" +msgstr "Näkymä_reitti" + +#: ../src/viktrwlayer.c:8589 +msgid "_View Route" +msgstr "" + +#: ../src/viktrwlayer.c:8608 +msgid "_Startpoint" +msgstr "_Alkupiste" + +#: ../src/viktrwlayer.c:8614 +msgid "\"_Center\"" +msgstr "”_Keskipiste”" + +#: ../src/viktrwlayer.c:8620 +msgid "_Endpoint" +msgstr "L_oppupiste" + +#: ../src/viktrwlayer.c:8626 +msgid "_Highest Altitude" +msgstr "Korkein ko_hta" + +#: ../src/viktrwlayer.c:8632 +msgid "_Lowest Altitude" +msgstr "Ali_n kohta" + +#: ../src/viktrwlayer.c:8640 +msgid "_Maximum Speed" +msgstr "_Enimmäisnopeus" + +#: ../src/viktrwlayer.c:8646 +msgid "_Date" +msgstr "" + +#: ../src/viktrwlayer.c:8655 +msgid "Co_mbine" +msgstr "" + +#: ../src/viktrwlayer.c:8663 +msgid "_Merge By Time..." +msgstr "Y_hdistä ajan perusteella..." + +#: ../src/viktrwlayer.c:8668 +msgid "Merge _Segments" +msgstr "" + +#: ../src/viktrwlayer.c:8675 +msgid "Merge _With Other Tracks..." +msgstr "Yhdistä _muiden reittien kanssa..." + +#: ../src/viktrwlayer.c:8682 +msgid "_Append Track..." +msgstr "" + +#: ../src/viktrwlayer.c:8684 +msgid "_Append Route..." +msgstr "" + +#: ../src/viktrwlayer.c:8690 +msgid "Append _Route..." +msgstr "" + +#: ../src/viktrwlayer.c:8692 +msgid "Append _Track..." +msgstr "" + +#: ../src/viktrwlayer.c:8699 +msgid "_Split" +msgstr "" + +#: ../src/viktrwlayer.c:8707 +msgid "_Split By Time..." +msgstr "_Jaa osiin ajan mukaan..." + +#. ATM always enable this entry - don't want to have to analyse the track before displaying the menu - to keep the menu speedy +#: ../src/viktrwlayer.c:8713 +msgid "Split Se_gments" +msgstr "" + +#: ../src/viktrwlayer.c:8719 +msgid "Split By _Number of Points..." +msgstr "J_aa osiin pisteiden määrän mukaan..." + +#: ../src/viktrwlayer.c:8724 +msgid "Split at _Trackpoint" +msgstr "" + +#: ../src/viktrwlayer.c:8732 +msgid "_Insert Points" +msgstr "" + +#: ../src/viktrwlayer.c:8738 +msgid "Insert Point _Before Selected Point" +msgstr "" + +#: ../src/viktrwlayer.c:8745 +msgid "Insert Point _After Selected Point" +msgstr "" + +#: ../src/viktrwlayer.c:8754 +msgid "Delete Poi_nts" +msgstr "" + +#: ../src/viktrwlayer.c:8760 +msgid "Delete _Selected Point" +msgstr "" + +#: ../src/viktrwlayer.c:8768 +msgid "Delete Points With The Same _Position" +msgstr "" + +#: ../src/viktrwlayer.c:8773 +msgid "Delete Points With The Same _Time" +msgstr "" + +#: ../src/viktrwlayer.c:8780 ../src/viktrwlayer.c:9029 +msgid "_Transform" +msgstr "" + +#: ../src/viktrwlayer.c:8788 ../src/viktrwlayer.c:9037 +msgid "_Apply DEM Data" +msgstr "_Käytä DEM-tietoja" + +#: ../src/viktrwlayer.c:8793 ../src/viktrwlayer.c:9042 +msgid "_Overwrite" +msgstr "" + +#: ../src/viktrwlayer.c:8796 ../src/viktrwlayer.c:9045 +msgid "Overwrite any existing elevation values with DEM values" +msgstr "" + +#: ../src/viktrwlayer.c:8799 ../src/viktrwlayer.c:9048 +msgid "_Keep Existing" +msgstr "" + +#: ../src/viktrwlayer.c:8802 ../src/viktrwlayer.c:9051 +msgid "Keep existing elevation values, only attempt for missing values" +msgstr "" + +#: ../src/viktrwlayer.c:8807 +msgid "_Smooth Missing Elevation Data" +msgstr "" + +#: ../src/viktrwlayer.c:8812 +msgid "_Interpolated" +msgstr "" + +#: ../src/viktrwlayer.c:8815 +msgid "" +"Interpolate between known elevation values to derive values for the missing " +"elevations" +msgstr "" + +#: ../src/viktrwlayer.c:8818 +msgid "_Flat" +msgstr "" + +#: ../src/viktrwlayer.c:8821 +msgid "Set unknown elevation values to the last known value" +msgstr "" + +#: ../src/viktrwlayer.c:8825 +msgid "C_onvert to a Route" +msgstr "" + +#: ../src/viktrwlayer.c:8827 +msgid "C_onvert to a Track" +msgstr "" + +#: ../src/viktrwlayer.c:8835 +msgid "_Anonymize Times" +msgstr "" + +#: ../src/viktrwlayer.c:8838 +msgid "Shift timestamps to a relative offset from 1901-01-01" +msgstr "" + +#: ../src/viktrwlayer.c:8841 +msgid "_Interpolate Times" +msgstr "" + +#: ../src/viktrwlayer.c:8844 +msgid "" +"Reset trackpoint timestamps between the first and last points such that " +"track is traveled at equal speed" +msgstr "" + +#: ../src/viktrwlayer.c:8849 +msgid "_Reverse Track" +msgstr "Kään_teinen reitti" + +#: ../src/viktrwlayer.c:8851 +msgid "_Reverse Route" +msgstr "" + +#: ../src/viktrwlayer.c:8858 +msgid "Refine Route..." +msgstr "" + +#: ../src/viktrwlayer.c:8868 +msgid "Down_load Maps Along Track..." +msgstr "_Lataa kartat reitin varrelta..." + +#: ../src/viktrwlayer.c:8870 +msgid "Down_load Maps Along Route..." +msgstr "" + +#: ../src/viktrwlayer.c:8878 +msgid "_Export Track as GPX..." +msgstr "" + +#: ../src/viktrwlayer.c:8880 +msgid "_Export Route as GPX..." +msgstr "" + +#: ../src/viktrwlayer.c:8887 +msgid "E_xtend Track End" +msgstr "Laaj_enna reitin loppu" + +#: ../src/viktrwlayer.c:8889 +msgid "E_xtend Route End" +msgstr "" + +#: ../src/viktrwlayer.c:8896 +msgid "Extend _Using Route Finder" +msgstr "Laaj_enna käyttäen reittietsijää" + +#: ../src/viktrwlayer.c:8911 +msgid "_Upload to GPS..." +msgstr "" + +#: ../src/viktrwlayer.c:8926 +msgid "_Diary" +msgstr "" + +#: ../src/viktrwlayer.c:8930 +msgid "Open diary program at this date" +msgstr "" + +#: ../src/viktrwlayer.c:8935 +msgid "_Astronomy" +msgstr "" + +#: ../src/viktrwlayer.c:8938 +msgid "Open astronomy program at this date and location" +msgstr "" + +#: ../src/viktrwlayer.c:8962 +msgid "_View Google Directions" +msgstr "_Katso Google-ajo-ohjeita" + +#: ../src/viktrwlayer.c:8984 +msgid "Use with _Filter" +msgstr "Käytä suo_dattimen kera" + +#: ../src/viktrwlayer.c:9018 +msgid "_Edit Trackpoint" +msgstr "M_uokkaa reittipistettä" + +#: ../src/viktrwlayer.c:10116 +#, c-format +msgid " - Gain %dm:Loss %dm" +msgstr " - Hyöty %d m:Tappio %d m" + +#: ../src/viktrwlayer.c:10118 +#, c-format +msgid " - Gain %dft:Loss %dft" +msgstr " - Hyöty %d jalkaa:Tappio %d jalkaa" + +#: ../src/viktrwlayer.c:10123 +#, c-format +msgid " - Bearing %3.1f° - Step %s" +msgstr "" + +#: ../src/viktrwlayer.c:10232 +#, c-format +msgid "Querying %s for route between (%.3f, %.3f) and (%.3f, %.3f)." +msgstr "" + +#: ../src/viktrwlayer.c:10248 +#, c-format +msgid "%s returned route between (%.3f, %.3f) and (%.3f, %.3f)." +msgstr "" + +#: ../src/viktrwlayer.c:10251 +#, c-format +msgid "Error getting route from %s." +msgstr "" + +#: ../src/viktrwlayer.c:11070 +#, c-format +msgid "Creating %d Image Thumbnails..." +msgstr "Luodaan %d pienoiskuvaa..." + +#: ../src/viktrwlayer.c:11560 +msgid "No map layer in use. Create one first" +msgstr "Yhtään karttakerrosta ei ole käytössä. Luo ensin yksi" + +#: ../src/viktrwlayer.c:11679 +#, c-format +msgid "%s: Track List" +msgstr "" + +#: ../src/viktrwlayer.c:11681 +#, c-format +msgid "%s: Route List" +msgstr "" + +#: ../src/viktrwlayer.c:11734 +#, c-format +msgid "" +"Could not write external layer %s to %s, please fix and save before exiting " +"or data will be lost" +msgstr "" + +#: ../src/viktrwlayer.c:11782 +#, c-format +msgid "WARNING: issues encountered loading external layer %s from %s" +msgstr "" + +#: ../src/viktrwlayer_export.c:47 +msgid "Auto Device GPX Simplify:" +msgstr "" + +#: ../src/viktrwlayer_export.c:48 +msgid "" +"GPX saves to certain devices will be simplified for device compatibility." +msgstr "" + +#: ../src/viktrwlayer_export.c:125 +#, c-format +msgid "Export of GPX file simplified using point limit: %d" +msgstr "" + +#: ../src/viktrwlayer_export.c:206 ../src/viktrwlayer_export.c:323 +#: ../src/vikwindow.c:3694 +msgid "The filename you requested could not be opened for writing." +msgstr "Pyytämäsi tiedostonimen avaus kirjoittamista varten epäonnistui." + +#: ../src/viktrwlayer_export.c:226 +#, c-format +msgid "Could not launch %s." +msgstr "Kohteen %s käynnistäminen epäonnistui." + +#: ../src/viktrwlayer_export.c:234 +msgid "Could not create temporary file for export." +msgstr "Tilapäisen tiedoston luominen vientiä varten epäonnistui." + +#: ../src/viktrwlayer_export.c:268 +msgid "File format:" +msgstr "" + +#: ../src/viktrwlayer_export.c:276 +msgid "Select the file format." +msgstr "" + +#: ../src/viktrwlayer_export.c:281 +msgid "" +"Select the information to process.\n" +"Warning: the behavior of these switches is highly dependent of the file " +"format selected.\n" +"Please, refer to GPSbabel if unsure." +msgstr "" + +#: ../src/viktrwlayer_export.c:308 +msgid "You did not select a valid file format." +msgstr "" + +#: ../src/viktrwlayer_propwin.c:915 ../src/viktrwlayer_propwin.c:3381 +#: ../src/viktrwlayer_propwin.c:3417 ../src/viktrwlayer_propwin.c:3457 +#: ../src/viktrwlayer_propwin.c:3509 ../src/viktrwlayer_propwin.c:3527 +#: ../src/viktrwlayer_propwin.c:3600 ../src/viktrwlayer_propwin.c:3601 +#: ../src/viktrwlayer_propwin.c:3602 ../src/viktrwlayer_propwin.c:3611 +#: ../src/viktrwlayer_propwin.c:3612 ../src/viktrwlayer_propwin.c:3629 +#: ../src/viktrwlayer_propwin.c:3630 ../src/viktrwlayer_propwin.c:3644 +#: ../src/viktrwlayer_propwin.c:3645 ../src/viktrwlayer_propwin.c:3646 +#: ../src/viktrwlayer_propwin.c:3660 ../src/viktrwlayer_propwin.c:3661 +#: ../src/viktrwlayer_propwin.c:3662 ../src/viktrwlayer_propwin.c:3676 +#: ../src/viktrwlayer_propwin.c:3677 ../src/viktrwlayer_propwin.c:3678 +#: ../src/viktrwlayer_propwin.c:3695 ../src/viktrwlayer_propwin.c:3696 +#: ../src/viktrwlayer_analysis.c:293 +#, c-format +msgid "No Data" +msgstr "Ei tietoja" + +#: ../src/viktrwlayer_propwin.c:960 ../src/viktrwlayer_propwin.c:1245 +#, c-format +msgid "%.1f kph" +msgstr "%.1f km/h" + +#: ../src/viktrwlayer_propwin.c:963 ../src/viktrwlayer_propwin.c:1248 +#: ../src/viktrwlayer_analysis.c:352 +#, c-format +msgid "%.1f mph" +msgstr "%.1f mph" + +#: ../src/viktrwlayer_propwin.c:966 ../src/viktrwlayer_propwin.c:1251 +#, c-format +msgid "%.1f knots" +msgstr "%.1f solmua" + +#: ../src/viktrwlayer_propwin.c:969 ../src/viktrwlayer_propwin.c:1254 +#, fuzzy, c-format +msgid "%.1f s/km" +msgstr "%.1f km" + +#: ../src/viktrwlayer_propwin.c:972 ../src/viktrwlayer_propwin.c:1257 +#: ../src/viktrwlayer_analysis.c:389 ../src/viktrwlayer_analysis.c:392 +#, fuzzy, c-format +msgid "%.1f min/km" +msgstr "%.1f km" + +#: ../src/viktrwlayer_propwin.c:975 ../src/viktrwlayer_propwin.c:1260 +#, fuzzy, c-format +msgid "%.1f sec/mi" +msgstr "%.1f mailia" + +#: ../src/viktrwlayer_propwin.c:978 ../src/viktrwlayer_propwin.c:1263 +#: ../src/viktrwlayer_analysis.c:409 ../src/viktrwlayer_analysis.c:412 +#, fuzzy, c-format +msgid "%.1f min/mi" +msgstr "%.1f m/s" + +#. VIK_UNITS_SPEED_METRES_PER_SECOND: +#: ../src/viktrwlayer_propwin.c:982 ../src/viktrwlayer_propwin.c:1267 +#, c-format +msgid "%.1f m/s" +msgstr "%.1f m/s" + +#. Minutes +#: ../src/viktrwlayer_propwin.c:1411 +msgid "mins" +msgstr "" + +#. Hours +#: ../src/viktrwlayer_propwin.c:1418 +msgid "h" +msgstr "" + +#. Days +#: ../src/viktrwlayer_propwin.c:1424 +msgid "d" +msgstr "" + +#. Weeks +#: ../src/viktrwlayer_propwin.c:1429 +msgid "w" +msgstr "" + +#. 'Months' +#: ../src/viktrwlayer_propwin.c:1433 +msgid "M" +msgstr "" + +#: ../src/viktrwlayer_propwin.c:2051 ../src/viktrwlayer_analysis.c:303 +#, c-format +msgid "%.1f miles" +msgstr "%.1f mailia" + +#: ../src/viktrwlayer_propwin.c:2054 ../src/viktrwlayer_analysis.c:306 +#, c-format +msgid "%.1f NM" +msgstr "" + +#. VIK_UNITS_DISTANCE_KILOMETRES +#: ../src/viktrwlayer_propwin.c:2057 ../src/viktrwlayer_analysis.c:310 +#, c-format +msgid "%.1f km" +msgstr "%.1f km" + +#: ../src/viktrwlayer_propwin.c:3083 +msgid "Failed spliting track. Track unchanged" +msgstr "Reitin jakaminen osiin epäonnistui. Reitti on muuttumaton" + +#: ../src/viktrwlayer_propwin.c:3234 ../src/viktrwlayer_propwin.c:3744 +#, c-format +msgid "%s - Track Properties" +msgstr "%s - Reittiominaisuudet" + +#: ../src/viktrwlayer_propwin.c:3239 +msgid "Split at _Marker" +msgstr "Jaa osiin _merkitsijän kohdalta" + +#: ../src/viktrwlayer_propwin.c:3240 +msgid "Split _Segments" +msgstr "Jaa osiin se_gmentit" + +#: ../src/viktrwlayer_propwin.c:3241 +msgid "_Reverse" +msgstr "Kää_nteinen" + +#: ../src/viktrwlayer_propwin.c:3242 +msgid "_Delete Dupl." +msgstr "Po_ista kaksoiskappale" + +#: ../src/viktrwlayer_propwin.c:3269 +msgid "Comment:" +msgstr "Kommentti:" + +#: ../src/viktrwlayer_propwin.c:3270 +msgid "Description:" +msgstr "" + +#: ../src/viktrwlayer_propwin.c:3271 +#, fuzzy +msgid "Source:" +msgstr "Alku:" + +#: ../src/viktrwlayer_propwin.c:3272 +#, fuzzy +msgid "Type:" +msgstr "Aika:" + +#: ../src/viktrwlayer_propwin.c:3273 +msgid "Color:" +msgstr "" + +#: ../src/viktrwlayer_propwin.c:3274 +msgid "Draw Name:" +msgstr "" + +#: ../src/viktrwlayer_propwin.c:3275 +msgid "Distance Labels:" +msgstr "" + +#: ../src/viktrwlayer_propwin.c:3278 +msgid "Track Length:" +msgstr "Reittipituus:" + +#: ../src/viktrwlayer_propwin.c:3279 +msgid "Trackpoints:" +msgstr "Reittipisteet:" + +#: ../src/viktrwlayer_propwin.c:3280 +msgid "Segments:" +msgstr "Segmentit:" + +#: ../src/viktrwlayer_propwin.c:3281 +msgid "Duplicate Points:" +msgstr "Pisteiden kaksoiskappaleet:" + +#: ../src/viktrwlayer_propwin.c:3282 +msgid "Max Speed:" +msgstr "Enimmäisnopeus:" + +#: ../src/viktrwlayer_propwin.c:3283 +msgid "Avg. Speed:" +msgstr "Keskinopeus:" + +#: ../src/viktrwlayer_propwin.c:3284 +msgid "Moving Avg. Speed:" +msgstr "Siirrytään keskinopeudella:" + +#: ../src/viktrwlayer_propwin.c:3285 +msgid "Avg. Dist. Between TPs:" +msgstr "Keskimääräinen etäisyys reittipisteiden välillä" + +#: ../src/viktrwlayer_propwin.c:3286 +msgid "Elevation Range:" +msgstr "Korkeusasema-alue:" + +#: ../src/viktrwlayer_propwin.c:3287 +msgid "Total Elevation Gain/Loss:" +msgstr "Kokonaiskorkeusaseman hyöty/tappio:" + +#: ../src/viktrwlayer_propwin.c:3288 +msgid "Start:" +msgstr "Alku:" + +#: ../src/viktrwlayer_propwin.c:3289 +msgid "End:" +msgstr "Loppu:" + +#: ../src/viktrwlayer_propwin.c:3290 +msgid "Duration:" +msgstr "Kesto:" + +#: ../src/viktrwlayer_propwin.c:3320 +msgid "Centre" +msgstr "" + +#: ../src/viktrwlayer_propwin.c:3321 +msgid "Start only" +msgstr "" + +#: ../src/viktrwlayer_propwin.c:3322 +msgid "End only" +msgstr "" + +#: ../src/viktrwlayer_propwin.c:3323 +msgid "Start and End" +msgstr "" + +#: ../src/viktrwlayer_propwin.c:3324 +msgid "Centre, Start and End" +msgstr "" + +#: ../src/viktrwlayer_propwin.c:3336 +msgid "Maximum number of distance labels to be shown" +msgstr "" + +#: ../src/viktrwlayer_propwin.c:3340 +msgid "Properties" +msgstr "" + +#: ../src/viktrwlayer_propwin.c:3584 +#, c-format +msgid "%d minutes - %d minutes moving" +msgstr "" + +#: ../src/viktrwlayer_propwin.c:3596 +#, c-format +msgid "%s total - %s in segments" +msgstr "" + +#: ../src/viktrwlayer_propwin.c:3607 ../src/viktrwlayer_analysis.c:622 +msgid "Statistics" +msgstr "Tilastot" + +#: ../src/viktrwlayer_propwin.c:3613 ../src/viktrwlayer_propwin.c:3680 +msgid "Show D_EM" +msgstr "Näytä D_EM" + +#: ../src/viktrwlayer_propwin.c:3615 ../src/viktrwlayer_propwin.c:3631 +#: ../src/viktrwlayer_propwin.c:3647 ../src/viktrwlayer_propwin.c:3697 +msgid "Show _GPS Speed" +msgstr "Näytä _GPS-nopeus" + +#: ../src/viktrwlayer_propwin.c:3617 ../src/viktrwlayer_propwin.c:3633 +#: ../src/viktrwlayer_propwin.c:3665 ../src/viktrwlayer_propwin.c:3699 +msgid "Track Distance:" +msgstr "Reittietäisyys:" + +#: ../src/viktrwlayer_propwin.c:3618 ../src/viktrwlayer_propwin.c:3684 +msgid "Track Height:" +msgstr "Reittikorkeus:" + +#: ../src/viktrwlayer_propwin.c:3624 +msgid "Elevation-distance" +msgstr "Korkeusasema-etäisyys" + +#: ../src/viktrwlayer_propwin.c:3634 +msgid "Track Gradient:" +msgstr "" + +#: ../src/viktrwlayer_propwin.c:3639 +msgid "Gradient-distance" +msgstr "" + +#: ../src/viktrwlayer_propwin.c:3649 ../src/viktrwlayer_propwin.c:3666 +#: ../src/viktrwlayer_propwin.c:3683 +msgid "Track Time:" +msgstr "Reittiaika:" + +#: ../src/viktrwlayer_propwin.c:3650 ../src/viktrwlayer_propwin.c:3700 +msgid "Track Speed:" +msgstr "Reittinopeus:" + +#: ../src/viktrwlayer_propwin.c:3651 ../src/viktrwlayer_propwin.c:3667 +#: ../src/viktrwlayer_propwin.c:3685 +msgid "Time/Date:" +msgstr "" + +#: ../src/viktrwlayer_propwin.c:3655 +msgid "Speed-time" +msgstr "Nopeusaika" + +#: ../src/viktrwlayer_propwin.c:3663 ../src/viktrwlayer_propwin.c:3679 +msgid "Show S_peed" +msgstr "Näytä no_peus" + +#: ../src/viktrwlayer_propwin.c:3671 +msgid "Distance-time" +msgstr "Etäisyysaika" + +#: ../src/viktrwlayer_propwin.c:3690 +msgid "Elevation-time" +msgstr "Korkeusasema-aika" + +#: ../src/viktrwlayer_propwin.c:3705 +msgid "Speed-distance" +msgstr "Nopeusetäisyys" + +#: ../src/viktrwlayer_tpwin.c:190 ../src/viktrwlayer_wpwin.c:66 +msgid "Date/Time Edit" +msgstr "" + +#: ../src/viktrwlayer_tpwin.c:242 +msgid "Name:" +msgstr "" + +#: ../src/viktrwlayer_tpwin.c:243 +msgid "Latitude:" +msgstr "Leveysaste:" + +#: ../src/viktrwlayer_tpwin.c:244 +msgid "Longitude:" +msgstr "Pituusaste:" + +#: ../src/viktrwlayer_tpwin.c:245 +msgid "Altitude:" +msgstr "Korkeus:" + +#: ../src/viktrwlayer_tpwin.c:246 +msgid "Course:" +msgstr "" + +#: ../src/viktrwlayer_tpwin.c:247 +msgid "Timestamp:" +msgstr "Aikaleima:" + +#: ../src/viktrwlayer_tpwin.c:248 +msgid "Time:" +msgstr "Aika:" + +#: ../src/viktrwlayer_tpwin.c:249 +msgid "Distance Difference:" +msgstr "Etäisyysero:" + +#: ../src/viktrwlayer_tpwin.c:250 +msgid "Time Difference:" +msgstr "Aikaero:" + +#: ../src/viktrwlayer_tpwin.c:251 +msgid "\"Speed\" Between:" +msgstr "”Nopeus” välillä:" + +#: ../src/viktrwlayer_tpwin.c:252 +msgid "Speed:" +msgstr "" + +#: ../src/viktrwlayer_tpwin.c:253 +msgid "VDOP:" +msgstr "VDOP:" + +#: ../src/viktrwlayer_tpwin.c:254 +msgid "HDOP:" +msgstr "HDOP:" + +#: ../src/viktrwlayer_tpwin.c:255 +msgid "PDOP:" +msgstr "PDOP:" + +#: ../src/viktrwlayer_tpwin.c:256 +msgid "SAT/FIX:" +msgstr "SAT/FIX:" + +#: ../src/viktrwlayer_tpwin.c:263 ../src/viktrwlayer_tpwin.c:408 +#: ../src/viktrwlayer_tpwin.c:622 +msgid "Trackpoint" +msgstr "Reittipiste" + +#: ../src/viktrwlayer_tpwin.c:266 +msgid "_Insert After" +msgstr "L_isää jälkeen" + +#: ../src/viktrwlayer_tpwin.c:268 +msgid "Split Here" +msgstr "Jaa osiin tässä" + +#: ../src/viktrwlayer_tracklist.c:262 ../src/viktrwlayer_waypointlist.c:306 +msgid "_Copy Data" +msgstr "" + +#. +#. item = gtk_image_menu_item_new_with_mnemonic ( _("_Select") ); +#. gtk_image_menu_item_set_image ( (GtkImageMenuItem*)item, gtk_image_new_from_stock (GTK_STOCK_FIND, GTK_ICON_SIZE_MENU) ); +#. g_signal_connect_swapped ( G_OBJECT(item), "activate", G_CALLBACK(trw_layer_track_select), values ); +#. gtk_menu_shell_append (GTK_MENU_SHELL (menu), item); +#. gtk_widget_show ( item ); +#. +#. ATM view auto selects, so don't bother with separate select menu entry +#. +#. item = gtk_image_menu_item_new_with_mnemonic ( _("_Select") ); +#. gtk_image_menu_item_set_image ( (GtkImageMenuItem*)item, gtk_image_new_from_stock (GTK_STOCK_FIND, GTK_ICON_SIZE_MENU) ); +#. g_signal_connect_swapped ( G_OBJECT(item), "activate", G_CALLBACK(trw_layer_waypoint_select), values ); +#. gtk_menu_shell_append (GTK_MENU_SHELL (menu), item); +#. gtk_widget_show ( item ); +#. +#. AUTO SELECT NOT TRUE YET... +#. ATM view auto selects, so don't bother with separate select menu entry +#: ../src/viktrwlayer_tracklist.c:290 ../src/viktrwlayer_waypointlist.c:341 +#: ../src/vikwindow.c:4816 +msgid "_View" +msgstr "_Näkymä" + +#. Insert column for the layer name when viewing multi layers +#: ../src/viktrwlayer_tracklist.c:613 ../src/viktrwlayer_waypointlist.c:609 +msgid "Layer" +msgstr "" + +#: ../src/viktrwlayer_tracklist.c:627 ../src/viktrwlayer_waypointlist.c:624 +msgid "Date" +msgstr "" + +#: ../src/viktrwlayer_tracklist.c:631 ../src/viktrwlayer_waypointlist.c:628 +msgid "Visible" +msgstr "" + +#: ../src/viktrwlayer_tracklist.c:639 +msgid "" +"Distance\n" +"(miles)" +msgstr "" + +#: ../src/viktrwlayer_tracklist.c:642 +#, fuzzy +msgid "" +"Distance\n" +"(NM)" +msgstr "Etäisyysaika" + +#: ../src/viktrwlayer_tracklist.c:645 +msgid "" +"Distance\n" +"(km)" +msgstr "" + +#: ../src/viktrwlayer_tracklist.c:651 +msgid "" +"Length\n" +"(minutes)" +msgstr "" + +#: ../src/viktrwlayer_tracklist.c:660 ../src/vikutils.c:93 +msgid "sec/mi" +msgstr "" + +#: ../src/viktrwlayer_tracklist.c:666 +#, c-format +msgid "" +"Av. Speed\n" +"(%s)" +msgstr "" + +#. Apply own formatting of the data +#: ../src/viktrwlayer_tracklist.c:671 +#, c-format +msgid "" +"Max Speed\n" +"(%s)" +msgstr "" + +#: ../src/viktrwlayer_tracklist.c:679 ../src/viktrwlayer_waypointlist.c:637 +msgid "" +"Max Height\n" +"(Feet)" +msgstr "" + +#: ../src/viktrwlayer_tracklist.c:681 ../src/viktrwlayer_waypointlist.c:639 +msgid "" +"Max Height\n" +"(Metres)" +msgstr "" + +#: ../src/viktrwlayer_waypointlist.c:312 +msgid "Copy Data (with _positions)" +msgstr "" + +#: ../src/viktrwlayer_waypointlist.c:633 +msgid "Comment" +msgstr "" + +#: ../src/viktrwlayer_waypointlist.c:643 +msgid "Symbol" +msgstr "" + +#: ../src/viktrwlayer_wpwin.c:93 ../src/viktrwlayer_wpwin.c:302 +msgid "True" +msgstr "" + +#: ../src/viktrwlayer_wpwin.c:122 +msgid "Waypoint Properties" +msgstr "Välietappiominaisuudet" + +#: ../src/viktrwlayer_wpwin.c:164 +msgid "Name:" +msgstr "Nimi:" + +#: ../src/viktrwlayer_wpwin.c:181 +msgid "Altitude:" +msgstr "Korkeusasema:" + +#: ../src/viktrwlayer_wpwin.c:186 ../src/viktrwlayer_wpwin.c:188 +msgid "Comment:" +msgstr "Kommentti:" + +#: ../src/viktrwlayer_wpwin.c:202 +#, fuzzy +msgid "Source:" +msgstr "Latauslähde:" + +#: ../src/viktrwlayer_wpwin.c:212 +msgid "Image:" +msgstr "Kuva:" + +#: ../src/viktrwlayer_wpwin.c:217 +msgid "Symbol:" +msgstr "Symboli:" + +#: ../src/viktrwlayer_wpwin.c:226 +msgid "(none)" +msgstr "(ei mitään)" + +#. Geotag Info [readonly] +#: ../src/viktrwlayer_wpwin.c:272 +msgid "Has Geotag" +msgstr "" + +#: ../src/viktrwlayer_wpwin.c:279 +msgid "Consistent Position" +msgstr "" + +#. ATM the direction value box is always shown, even when there is no information. +#. It would be nice to be able to hide it until the 'Add' has been performed, +#. however I've not been able to achieve this. +#. Thus simply sensistizing it instead. +#: ../src/viktrwlayer_wpwin.c:292 +#, fuzzy +msgid "Image Direction:" +msgstr "Kuvan aikavyöhyke:" + +#: ../src/viktrwlayer_wpwin.c:300 +msgid "Magnetic" +msgstr "" + +#: ../src/viktrwlayer_wpwin.c:320 +msgid "Time:" +msgstr "" + +#. TODO: other checks (isalpha or whatever ) +#: ../src/viktrwlayer_wpwin.c:386 +msgid "Please enter a name for the waypoint." +msgstr "Kirjoita välietapin nimi." + +#: ../src/viktrwlayer_geotag.c:320 ../src/viktrwlayer_geotag.c:460 +#, c-format +msgid "Failed updating EXIF on %s" +msgstr "" + +#: ../src/viktrwlayer_geotag.c:562 +#, c-format +msgid "Geotagging %d Images..." +msgstr "Merkitään Geotageilla %d kuvaa..." + +#: ../src/viktrwlayer_geotag.c:630 +msgid "Geotag Images" +msgstr "Geotag-kuvat" + +#: ../src/viktrwlayer_geotag.c:640 +msgid "Images" +msgstr "Kuvat" + +#: ../src/viktrwlayer_geotag.c:645 +msgid "Overwrite Existing Waypoints:" +msgstr "" + +#: ../src/viktrwlayer_geotag.c:648 +msgid "Overwrite Existing GPS Information:" +msgstr "Korvaa olemassa olevat GPS-tiedot:" + +#: ../src/viktrwlayer_geotag.c:650 +msgid "Keep File Modification Timestamp:" +msgstr "Säilytä tiedoston muokkausaikaleima:" + +#: ../src/viktrwlayer_geotag.c:684 +msgid "Create Waypoints:" +msgstr "Luo välietapit:" + +#: ../src/viktrwlayer_geotag.c:693 +msgid "Write EXIF:" +msgstr "Kirjoita EXIF:" + +#: ../src/viktrwlayer_geotag.c:705 +msgid "Automatic Image Direction:" +msgstr "" + +#: ../src/viktrwlayer_geotag.c:707 +msgid "Set image direction based on a heading derived from the track" +msgstr "" + +#: ../src/viktrwlayer_geotag.c:710 +msgid "Interpolate Between Track Segments:" +msgstr "Interpoloidaan reittisegmenttien välillä:" + +#: ../src/viktrwlayer_geotag.c:715 +msgid "Image Time Offset (Seconds):" +msgstr "Kuva-aikasiirros (sekuntia):" + +#: ../src/viktrwlayer_geotag.c:718 +msgid "" +"The number of seconds to ADD to the photos time to make it match the GPS " +"data. Calculate this with (GPS - Photo). Can be negative or positive. Useful " +"to adjust times when a camera's timestamp was incorrect." +msgstr "" +"Sekuntimäärä, joka täytyy LISÄTÄ valokuvan aikaa, jotta se täsmää GPS-" +"tietoihin. Laske tämä (GPS-Photo)-ohjelmalla. Lukema voi olla negatiivinen " +"tai positiivinen. Se on hyödyllinen säädettäessa aikoja, kun kameran " +"aikaleima on virheellinen." + +#: ../src/viktrwlayer_geotag.c:721 +msgid "Image Timezone:" +msgstr "Kuvan aikavyöhyke:" + +#: ../src/viktrwlayer_geotag.c:724 +msgid "" +"The timezone that was used when the images were created. For example, if a " +"camera is set to AWST or +8:00 hours. Enter +8:00 here so that the correct " +"adjustment to the images' time can be made. GPS data is always in UTC." +msgstr "" +"Aikavyöhyke, jota käytettiin kuvia luotaessa. Esimerkiksi, jos kameraan on " +"asetettu AWST tai +8:00 tuntia, Kirjoita +8:00 tänne, jotta kuvien aikaan " +"voidaan tehdä oikea säätö. GPS-tiedot ovat aina UTC-ajassa." + +#: ../src/viktrwlayer_geotag.c:728 +#, c-format +msgid "Using waypoint: %s" +msgstr "" + +#: ../src/viktrwlayer_geotag.c:742 +#, c-format +msgid "Using track: %s" +msgstr "Käytetään reittiä: %s" + +#: ../src/viktrwlayer_geotag.c:744 +#, c-format +msgid "Using all tracks in: %s" +msgstr "Käytetään kaikki reitit kohteessa: %s" + +#: ../src/viktrwlayer_analysis.c:214 +msgid "Number of Tracks" +msgstr "" + +#: ../src/viktrwlayer_analysis.c:215 +msgid "Date Range" +msgstr "" + +#: ../src/viktrwlayer_analysis.c:216 +msgid "Total Length" +msgstr "" + +#: ../src/viktrwlayer_analysis.c:217 +msgid "Average Length" +msgstr "" + +#: ../src/viktrwlayer_analysis.c:218 +msgid "Eddington number" +msgstr "" + +#. No.4: Extended display only +#: ../src/viktrwlayer_analysis.c:219 +msgid "Max Speed" +msgstr "" + +#: ../src/viktrwlayer_analysis.c:220 +msgid "Avg. Speed" +msgstr "" + +#: ../src/viktrwlayer_analysis.c:221 +msgid "Minimum Altitude" +msgstr "" + +#: ../src/viktrwlayer_analysis.c:222 +msgid "Maximum Altitude" +msgstr "" + +#: ../src/viktrwlayer_analysis.c:223 +msgid "Total Elevation Gain/Loss" +msgstr "" + +#: ../src/viktrwlayer_analysis.c:224 +msgid "Avg. Elevation Gain/Loss" +msgstr "" + +#: ../src/viktrwlayer_analysis.c:225 +msgid "Total Duration" +msgstr "" + +#: ../src/viktrwlayer_analysis.c:226 +msgid "Avg. Duration" +msgstr "" + +#: ../src/viktrwlayer_analysis.c:317 +#, c-format +msgid "%.2f miles" +msgstr "" + +#: ../src/viktrwlayer_analysis.c:320 +#, c-format +msgid "%.2f NM" +msgstr "" + +#. VIK_UNITS_DISTANCE_KILOMETRES +#: ../src/viktrwlayer_analysis.c:324 +#, c-format +msgid "%.2f km" +msgstr "" + +#: ../src/viktrwlayer_analysis.c:361 +#, c-format +msgid "%.2f m/s" +msgstr "" + +#: ../src/viktrwlayer_analysis.c:370 ../src/viktrwlayer_analysis.c:373 +#, c-format +msgid "%.2f knots" +msgstr "" + +#: ../src/viktrwlayer_analysis.c:379 ../src/viktrwlayer_analysis.c:382 +#, c-format +msgid "%d s/km" +msgstr "" + +#: ../src/viktrwlayer_analysis.c:399 ../src/viktrwlayer_analysis.c:402 +#, c-format +msgid "%d sec/mi" +msgstr "" + +#: ../src/viktrwlayer_analysis.c:420 ../src/viktrwlayer_analysis.c:423 +#, c-format +msgid "%.2f km/h" +msgstr "" + +#: ../src/viktrwlayer_analysis.c:434 ../src/viktrwlayer_analysis.c:440 +#, c-format +msgid "%d feet" +msgstr "" + +#: ../src/viktrwlayer_analysis.c:445 ../src/viktrwlayer_analysis.c:447 +#, c-format +msgid "%d feet / %d feet" +msgstr "" + +#: ../src/viktrwlayer_analysis.c:452 ../src/viktrwlayer_analysis.c:458 +#, c-format +msgid "%d m" +msgstr "" + +#: ../src/viktrwlayer_analysis.c:463 ../src/viktrwlayer_analysis.c:465 +#, c-format +msgid "%d m / %d m" +msgstr "" + +#: ../src/viktrwlayer_analysis.c:477 +#, c-format +msgid "%d:%02d:%02d days:hrs:mins" +msgstr "" + +#: ../src/viktrwlayer_analysis.c:484 +#, c-format +msgid "%d:%02d hrs:mins" +msgstr "" + +#: ../src/viktrwlayer_analysis.c:658 +msgid "Include Invisible Items" +msgstr "" + +#: ../src/vikstatus.c:129 +msgid "Current number of background tasks. Click to see the background jobs." +msgstr "" + +#: ../src/vikstatus.c:134 +msgid "Current zoom level. Click to select a new one." +msgstr "" + +#: ../src/vikstatus.c:141 +msgid "Left click to clear the message. Right click to copy the message." +msgstr "" + +#: ../src/vikutils.c:108 +msgid "GPSD" +msgstr "" + +#. GPS Preamble +#: ../src/vikutils.c:109 +msgid "Trkpt" +msgstr "" + +#: ../src/vikutils.c:160 +#, c-format +msgid "%sSpeed%s %.1f%s" +msgstr "" + +#. Go for 2dp as expect low values for vertical speeds +#: ../src/vikutils.c:214 +#, c-format +msgid "%sClimb%s %.2f%s" +msgstr "" + +#: ../src/vikutils.c:223 +#, c-format +msgid "%sAlt %dfeet" +msgstr "" + +#. VIK_UNITS_HEIGHT_METRES: +#: ../src/vikutils.c:227 +#, c-format +msgid "%sAlt %dm" +msgstr "" + +#: ../src/vikutils.c:235 +#, c-format +msgid "%sCourse %03d°" +msgstr "" + +#: ../src/vikutils.c:249 +msgid "yards" +msgstr "" + +#. VIK_UNITS_DISTANCE_KILOMETRES: +#: ../src/vikutils.c:253 +msgid "m" +msgstr "" + +#: ../src/vikutils.c:257 +#, c-format +msgid "%sDistance diff %d%s" +msgstr "" + +#: ../src/vikutils.c:272 +#, c-format +msgid "%sTime %s" +msgstr "" + +#: ../src/vikutils.c:281 +#, c-format +msgid "%sTime diff %lds" +msgstr "" + +#: ../src/vikutils.c:287 +#, c-format +msgid "%sNo. of Sats %d" +msgstr "" + +#: ../src/vikutils.c:312 +#, c-format +msgid "%sTo End %.2f%s" +msgstr "" + +#: ../src/vikutils.c:339 +#, c-format +msgid "%sDistance along %.2f%s" +msgstr "" + +#: ../src/vikutils.c:359 +#, c-format +msgid "%sTrack: %s" +msgstr "" + +#: ../src/vikutils.c:396 +#, c-format +msgid "" +"There is a newer version of Viking available: %s\n" +"\n" +"Do you wish to go to Viking's website now?" +msgstr "" + +#: ../src/vikutils.c:526 +msgid "" +"This appears to be Viking's very first run.\n" +"\n" +"Do you wish to enable automatic internet features?\n" +"\n" +"Individual settings can be controlled in the Preferences." +msgstr "" + +#: ../src/vikwaypoint.c:37 +msgid "Waypoint" +msgstr "" + +#: ../src/vikwebtool_datasource.c:352 +msgid "Search Term" +msgstr "" + +#. TODO get rid of this as this is unnecessary duplication... +#: ../src/vikwindow.c:258 +msgid "Pan" +msgstr "Vaakavieritä" + +#: ../src/vikwindow.c:258 +msgid "Zoom" +msgstr "Loitonna/lähennä" + +#: ../src/vikwindow.c:258 +msgid "Ruler" +msgstr "Viivotin" + +#: ../src/vikwindow.c:258 +msgid "Select" +msgstr "Valitse" + +#: ../src/vikwindow.c:368 +msgid "This is Viking " +msgstr "" + +#: ../src/vikwindow.c:457 +msgid "Location lookup aborted" +msgstr "" + +#: ../src/vikwindow.c:477 +#, c-format +msgid "Location found: %s" +msgstr "" + +#: ../src/vikwindow.c:486 +msgid "Unable to determine location" +msgstr "" + +#: ../src/vikwindow.c:495 +msgid "Determining location" +msgstr "" + +#: ../src/vikwindow.c:525 +#, c-format +msgid "Location found via geoclue" +msgstr "" + +#: ../src/vikwindow.c:546 +msgid "Default Map" +msgstr "" + +#: ../src/vikwindow.c:557 ../src/vikwindow.c:3938 +msgid "Trying to determine location..." +msgstr "" + +#. Create tooltip +#: ../src/vikwindow.c:723 +msgid "Select zoom level" +msgstr "" + +#: ../src/vikwindow.c:1176 +#, c-format +msgid "" +"Do you want to save the changes you made to the document \"%s\"?\n" +"\n" +"Your changes will be lost if you don't save them." +msgstr "" +"Haluatko tallentaa asiakirjaan ”%s” tehdyt muutokset?\n" +"\n" +"Muutoksesi katoavat, jos et tallenna niitä." + +#: ../src/vikwindow.c:1180 +msgid "Don't Save" +msgstr "Älä tallenna" + +#: ../src/vikwindow.c:1268 +msgid "mpp" +msgstr "mpp" + +#: ../src/vikwindow.c:1268 +msgid "pixelfact" +msgstr "pikselitieto" + +#: ../src/vikwindow.c:1467 +#, c-format +msgid "%s %s %dm" +msgstr "%s %s %d m" + +#: ../src/vikwindow.c:1469 +#, c-format +msgid "%s %s %dft" +msgstr "%s %s %d jalkaa" + +#: ../src/vikwindow.c:1472 +#, c-format +msgid "%s %s" +msgstr "%s %s" + +#: ../src/vikwindow.c:1929 +msgid "_Ruler" +msgstr "V_iivotin" + +#: ../src/vikwindow.c:1929 +msgid "Ruler Tool" +msgstr "Viivotintyökalu" + +#: ../src/vikwindow.c:2204 ../src/vikwindow.c:4818 +msgid "_Zoom" +msgstr "_Loitonna/lähennä" + +#: ../src/vikwindow.c:2204 +msgid "Zoom Tool" +msgstr "Suurennuslasi" + +#: ../src/vikwindow.c:2271 ../src/vikwindow.c:4819 +msgid "_Pan" +msgstr "_Vaakavieritä" + +#: ../src/vikwindow.c:2271 +msgid "Pan Tool" +msgstr "Vaakavieritystyökalu" + +#: ../src/vikwindow.c:2425 +msgid "_Select" +msgstr "Valit_se" + +#: ../src/vikwindow.c:2425 +msgid "Select Tool" +msgstr "Valintatyökalu" + +#: ../src/vikwindow.c:2615 +msgid "You must select a layer to show its properties." +msgstr "Kerros on valittava sen ominaisuuksien näyttämiseksi." + +#. No error to show, so unlikely this will get called +#: ../src/vikwindow.c:2629 +msgid "The help system is not available." +msgstr "" + +#. Main error path +#: ../src/vikwindow.c:2632 +#, c-format +msgid "" +"Help is not available because: %s.\n" +"Ensure a Mime Type ghelp handler program is installed (e.g. yelp)." +msgstr "" + +#: ../src/vikwindow.c:2865 +msgid "You must select a layer to delete." +msgstr "Kerros on valittava poistamista varten." + +#: ../src/vikwindow.c:3171 +msgid "Untitled" +msgstr "Otsikoton" + +#: ../src/vikwindow.c:3300 +#, c-format +msgid "Unable to add '%s' to the list of recently used documents" +msgstr "" +"Asiakirjan ’%s’ lisääminen äskettäin käytettyjen asiakirjojen luetteloon " +"epäonnistui" + +#: ../src/vikwindow.c:3391 +msgid "The file you requested could not be opened." +msgstr "Pyytämäsi tiedoston avaaminen epäonnistui." + +#: ../src/vikwindow.c:3394 +msgid "" +"GPSBabel is required to load files of this type or GPSBabel encountered " +"problems." +msgstr "" +"GPSBabel tarvitaan tämän tyyppisten tiedostojen lataamiseen tai GPSBabel " +"kohtasi pulmia." + +#: ../src/vikwindow.c:3397 +#, c-format +msgid "Unable to load malformed GPX file %s" +msgstr "" + +#: ../src/vikwindow.c:3400 +#, c-format +msgid "Unsupported file type for %s" +msgstr "Tukematon tiedostotyyppi kohteelle %s" + +#. Since we can process .vik files with issues just show a warning in the status bar +#. Not that a user can do much about it... or tells them what this issue is yet... +#: ../src/vikwindow.c:3406 +#, c-format +msgid "WARNING: issues encountered loading %s" +msgstr "" + +#: ../src/vikwindow.c:3489 +msgid "Please select a GPS data file to open. " +msgstr "Valitse avattava GPS-datatiedosto. " + +#: ../src/vikwindow.c:3508 +msgid "Google Earth" +msgstr "Google Earth" + +#: ../src/vikwindow.c:3523 ../src/vikwindow.c:3646 ../src/viking.desktop.in.h:1 +msgid "Viking" +msgstr "Viikinki" + +#: ../src/vikwindow.c:3594 ../src/vikwindow.c:4632 +msgid "Open File" +msgstr "" + +#: ../src/vikwindow.c:3630 +msgid "Save as Viking File." +msgstr "Tallenna Viking-tiedostona." + +#: ../src/vikwindow.c:3757 +#, c-format +msgid "Exporting to file: %s" +msgstr "" + +#. Confirm what happened. +#: ../src/vikwindow.c:3774 +#, c-format +msgid "Exported files: %d" +msgstr "" + +#: ../src/vikwindow.c:3786 +msgid "Nothing to Export!" +msgstr "" + +#: ../src/vikwindow.c:3790 +msgid "Export to directory" +msgstr "" + +#: ../src/vikwindow.c:3809 +msgid "Could not convert all files" +msgstr "" + +#: ../src/vikwindow.c:3851 +msgid "File not accessible" +msgstr "" + +#: ../src/vikwindow.c:3854 +msgid "No Viking File" +msgstr "" + +#: ../src/vikwindow.c:3998 +msgid "This layer has no configurable properties." +msgstr "" + +#: ../src/vikwindow.c:4080 +msgid "Are you sure you wish to delete all layers?" +msgstr "Oletko varma, että haluat poistaa kaikki kerrokset?" + +#. Try harder... +#: ../src/vikwindow.c:4126 ../src/vikwindow.c:4132 +msgid "Generating image file..." +msgstr "" + +#: ../src/vikwindow.c:4154 +msgid "" +"Failed to generate internal image.\n" +"\n" +"Try creating a smaller image." +msgstr "" + +#: ../src/vikwindow.c:4175 +msgid "Image file generated." +msgstr "" + +#: ../src/vikwindow.c:4177 +msgid "Failed to generate image file." +msgstr "" + +#: ../src/vikwindow.c:4246 +#, c-format +msgid "Unable to write to file %s: %s" +msgstr "" + +#: ../src/vikwindow.c:4284 +msgid "" +"Viewable region outside allowable pixel size bounds for image. Clipping " +"width/height values." +msgstr "" +"Katsottava alue kuvan sallittavan pikselikokorajojen ulkopuolella. Leikataan " +"leveys/korkeus-arvoja." + +#: ../src/vikwindow.c:4309 +#, c-format +msgid "Total area: %ldm x %ldm (%.3f sq. km)" +msgstr "Kokonaisalue: %ldm x %ldm (%.3f neliökilometriä)" + +#: ../src/vikwindow.c:4312 +#, c-format +msgid "Total area: %ldm x %ldm (%.3f sq. miles)" +msgstr "Kokonaisalue: %ldm x %ldm (%.3f neliömailia)" + +#: ../src/vikwindow.c:4315 +#, c-format +msgid "Total area: %ldm x %ldm (%.3f sq. NM)" +msgstr "" + +#. Single file +#: ../src/vikwindow.c:4343 +msgid "Save Image" +msgstr "Tallenna kuva" + +#: ../src/vikwindow.c:4364 ../src/vikwindow.c:4641 +msgid "KMZ" +msgstr "" + +#: ../src/vikwindow.c:4417 +msgid "You must be in UTM mode to use this feature" +msgstr "Tätä ominaisuutta voi käyttää vain UTM-tilassa" + +#: ../src/vikwindow.c:4421 +msgid "Choose a directory to hold images" +msgstr "Valitse hakemisto kuvien säilyttämiseen" + +#. todo: default for answers inside VikWindow or static (thruout instance) +#: ../src/vikwindow.c:4441 +msgid "Save to Image File" +msgstr "Tallenna kuvatiedostoon" + +#: ../src/vikwindow.c:4457 +msgid "Width (pixels):" +msgstr "Leveys (pikseliä):" + +#: ../src/vikwindow.c:4459 +msgid "Height (pixels):" +msgstr "Korkeus (pikseliä):" + +#: ../src/vikwindow.c:4462 +msgid "" +"WARNING: USING LARGE IMAGES OVER 10000x10000\n" +"MAY CRASH THE PROGRAM!" +msgstr "" + +#: ../src/vikwindow.c:4464 +msgid "Zoom (meters per pixel):" +msgstr "Loitonna/lähennä (metriä per pikseli):" + +#: ../src/vikwindow.c:4480 +msgid "Area in current viewable window" +msgstr "Alue nykyisin katsottavassa ikkunassa" + +#: ../src/vikwindow.c:4490 +msgid "Save as PNG" +msgstr "Tallenna PNG-tiedostona" + +#: ../src/vikwindow.c:4491 +msgid "Save as JPEG" +msgstr "Tallenna JPEG-tiedostona" + +#: ../src/vikwindow.c:4520 +msgid "East-west image tiles:" +msgstr "Itä-länsi-kuvatiilit:" + +#: ../src/vikwindow.c:4522 +msgid "North-south image tiles:" +msgstr "Pohjois-etelä-kuvatiilit:" + +#: ../src/vikwindow.c:4619 +msgid "This feature is not available in UTM mode" +msgstr "" + +#: ../src/vikwindow.c:4658 +#, c-format +msgid "Unable to import %s." +msgstr "" + +#: ../src/vikwindow.c:4749 +msgid "Choose a background color" +msgstr "Valitse taustaväri" + +#: ../src/vikwindow.c:4765 +msgid "Choose a track highlight color" +msgstr "Valitse reitin korotustväri" + +#: ../src/vikwindow.c:4814 +msgid "_File" +msgstr "_Tiedosto" + +#: ../src/vikwindow.c:4815 +msgid "_Edit" +msgstr "_Muokkaa" + +#: ../src/vikwindow.c:4817 +msgid "_Show" +msgstr "_Näytä" + +#: ../src/vikwindow.c:4820 +msgid "_Layers" +msgstr "_Kerrokset" + +#: ../src/vikwindow.c:4821 +msgid "_Tools" +msgstr "_Työkalut" + +#: ../src/vikwindow.c:4822 +msgid "_Webtools" +msgstr "_Webbityökalut" + +#: ../src/vikwindow.c:4823 ../src/vikwindow.c:4893 +msgid "_Help" +msgstr "_Opaste" + +#: ../src/vikwindow.c:4825 +msgid "New file" +msgstr "Uusi tiedosto" + +#: ../src/vikwindow.c:4826 +msgid "_Open..." +msgstr "_Avaa..." + +#: ../src/vikwindow.c:4826 +msgid "Open a file" +msgstr "Avaa tiedosto" + +#: ../src/vikwindow.c:4827 +msgid "Open _Recent File" +msgstr "A_vaa äskeinen tiedosto" + +#: ../src/vikwindow.c:4828 +msgid "Append _File..." +msgstr "Liitä tie_dosto..." + +#: ../src/vikwindow.c:4828 +msgid "Append data from a different file" +msgstr "Liitä tietoja eri tiedostosta" + +#: ../src/vikwindow.c:4829 +msgid "Open GPX as External _Layer..." +msgstr "" + +#: ../src/vikwindow.c:4829 +msgid "Open a GPX file as an external layer" +msgstr "" + +#: ../src/vikwindow.c:4830 +msgid "_Export All" +msgstr "" + +#: ../src/vikwindow.c:4830 +msgid "Export All TrackWaypoint Layers" +msgstr "" + +#: ../src/vikwindow.c:4831 +msgid "_GPX..." +msgstr "" + +#: ../src/vikwindow.c:4831 +msgid "Export as GPX" +msgstr "" + +#: ../src/vikwindow.c:4832 +msgid "A_cquire" +msgstr "H_anki" + +#: ../src/vikwindow.c:4833 +msgid "_Directions..." +msgstr "" + +#: ../src/vikwindow.c:4833 +msgid "Get driving directions" +msgstr "" + +#: ../src/vikwindow.c:4835 +msgid "_OSM Traces..." +msgstr "_OSM-jäljet..." + +#: ../src/vikwindow.c:4835 +msgid "Get traces from OpenStreetMap" +msgstr "Hae jäljet ohjelmasta OpenStreetMap" + +#: ../src/vikwindow.c:4836 +msgid "_My OSM Traces..." +msgstr "" + +#: ../src/vikwindow.c:4836 +msgid "Get Your Own Traces from OpenStreetMap" +msgstr "" + +#: ../src/vikwindow.c:4839 +msgid "Geo_caches..." +msgstr "Geo_kätköt..." + +#: ../src/vikwindow.c:4839 +msgid "Get Geocaches from geocaching.com" +msgstr "Hae geokätköt osoitteesta geocaching.com" + +#: ../src/vikwindow.c:4842 +msgid "Create waypoints from geotagged images" +msgstr "Luo välietapit geotagged-kuvista" + +#: ../src/vikwindow.c:4844 +msgid "Get a file from a URL" +msgstr "" + +#: ../src/vikwindow.c:4846 +msgid "Create waypoints from Wikipedia items in the current view" +msgstr "" + +#: ../src/vikwindow.c:4848 +msgid "_Save" +msgstr "Talle_nna" + +#: ../src/vikwindow.c:4848 +msgid "Save the file" +msgstr "Tallenna tiedosto" + +#: ../src/vikwindow.c:4849 +msgid "Save _As..." +msgstr "Tall_enna nimellä..." + +#: ../src/vikwindow.c:4849 +msgid "Save the file under different name" +msgstr "Tallenna tiedosto eri nimellä" + +#: ../src/vikwindow.c:4850 +msgid "Properties..." +msgstr "" + +#: ../src/vikwindow.c:4850 +msgid "File Properties" +msgstr "" + +#: ../src/vikwindow.c:4852 +msgid "Import KMZ _Map File..." +msgstr "" + +#: ../src/vikwindow.c:4852 +msgid "Import a KMZ file" +msgstr "" + +#: ../src/vikwindow.c:4853 +msgid "Generate _KMZ Map File..." +msgstr "" + +#: ../src/vikwindow.c:4853 +msgid "Generate a KMZ file with an overlay of the current view" +msgstr "" + +#: ../src/vikwindow.c:4855 +msgid "_Generate Image File..." +msgstr "T_uota kuvatiedosto..." + +#: ../src/vikwindow.c:4855 +msgid "Save a snapshot of the workspace into a file" +msgstr "Tallenna työtilan kuvakaappaus tiedostoon" + +#: ../src/vikwindow.c:4856 +msgid "Generate _Directory of Images..." +msgstr "Tuota ku_vahakemisto..." + +#: ../src/vikwindow.c:4856 +msgid "Generate _Directory of Images" +msgstr "" + +#: ../src/vikwindow.c:4857 +msgid "_Print..." +msgstr "_Tulosta..." + +#: ../src/vikwindow.c:4857 +msgid "Print maps" +msgstr "Tulosta karttoja" + +#: ../src/vikwindow.c:4858 +msgid "E_xit" +msgstr "P_oistu" + +#: ../src/vikwindow.c:4858 +msgid "Exit the program" +msgstr "Poistu ohjelmasta" + +#: ../src/vikwindow.c:4859 +msgid "Save and Exit" +msgstr "Tallenna ja poistu" + +#: ../src/vikwindow.c:4859 +msgid "Save and Exit the program" +msgstr "Tallenna ja poistu ohjelmasta" + +#: ../src/vikwindow.c:4861 +msgid "Go to the Pre_vious Location" +msgstr "" + +#: ../src/vikwindow.c:4861 +msgid "Go to the previous location" +msgstr "" + +#: ../src/vikwindow.c:4862 +msgid "Go to the _Next Location" +msgstr "" + +#: ../src/vikwindow.c:4862 +msgid "Go to the next location" +msgstr "" + +#: ../src/vikwindow.c:4863 +msgid "Go to the _Default Location" +msgstr "Siirry _oletusijaintiin" + +#: ../src/vikwindow.c:4863 +msgid "Go to the default location" +msgstr "Siirry oletussijaintiin" + +#: ../src/vikwindow.c:4864 +#, fuzzy +msgid "Go to the _Auto Location" +msgstr "Siirry _oletusijaintiin" + +#: ../src/vikwindow.c:4864 +msgid "Go to a location via automatic lookup" +msgstr "" + +#: ../src/vikwindow.c:4865 +msgid "Go to _Location..." +msgstr "_Siirry sijaintiin..." + +#: ../src/vikwindow.c:4865 +msgid "Go to address/place using text search" +msgstr "Siirry osoitteesen/paikkaan käyttäen tekstihakua" + +#: ../src/vikwindow.c:4866 +msgid "_Go to Lat/Lon..." +msgstr "_Siirry leveyspiirille/pituuspiirille..." + +#: ../src/vikwindow.c:4866 +msgid "Go to arbitrary lat/lon coordinate" +msgstr "Siirry satunnaiseen leveysp./pituusp. koordinaattiin" + +#: ../src/vikwindow.c:4867 +msgid "Go to UTM..." +msgstr "Siirry UTM:ään..." + +#: ../src/vikwindow.c:4867 +msgid "Go to arbitrary UTM coordinate" +msgstr "Siirry satunnaiseen UTM-koordinaattiin" + +#: ../src/vikwindow.c:4868 +#, fuzzy +msgid "Go to Today" +msgstr "Siirry UTM:ään" + +#: ../src/vikwindow.c:4868 +msgid "Go to today on the calendar" +msgstr "" + +#: ../src/vikwindow.c:4869 +msgid "_Refresh" +msgstr "" + +#: ../src/vikwindow.c:4869 +msgid "Refresh any maps displayed" +msgstr "" + +#: ../src/vikwindow.c:4870 +msgid "Set _Highlight Color..." +msgstr "Aseta _korostusväri..." + +#: ../src/vikwindow.c:4870 +msgid "Set Highlight Color" +msgstr "" + +#: ../src/vikwindow.c:4871 +msgid "Set Bac_kground Color..." +msgstr "Aseta tausta_väri..." + +#: ../src/vikwindow.c:4871 +msgid "Set Background Color" +msgstr "" + +#: ../src/vikwindow.c:4872 +msgid "Zoom _In" +msgstr "Lä_hennä" + +#: ../src/vikwindow.c:4872 +msgid "Zoom In" +msgstr "" + +#: ../src/vikwindow.c:4873 +msgid "Zoom _Out" +msgstr "Loi_tonna" + +#: ../src/vikwindow.c:4873 +msgid "Zoom Out" +msgstr "" + +#: ../src/vikwindow.c:4874 +msgid "Zoom _To..." +msgstr "Loitonna/lähennä _kohteeseen..." + +#: ../src/vikwindow.c:4874 +msgid "Zoom To" +msgstr "" + +#: ../src/vikwindow.c:4875 +msgid "Pan _North" +msgstr "V_ieritä pohjoiseen" + +#: ../src/vikwindow.c:4876 +msgid "Pan _East" +msgstr "Vi_eritä itään" + +#: ../src/vikwindow.c:4877 +msgid "Pan _South" +msgstr "Vieri_tä etelään" + +#: ../src/vikwindow.c:4878 +msgid "Pan _West" +msgstr "Vieritä _länteen" + +#: ../src/vikwindow.c:4879 +msgid "Background _Jobs" +msgstr "Ta_ustatyöt" + +#: ../src/vikwindow.c:4879 +msgid "Background Jobs" +msgstr "" + +#: ../src/vikwindow.c:4881 +msgid "Cu_t" +msgstr "Leikk_aa" + +#: ../src/vikwindow.c:4885 +msgid "Delete All" +msgstr "Poista kaikki" + +#: ../src/vikwindow.c:4886 +msgid "Copy Centre _Location" +msgstr "" + +#: ../src/vikwindow.c:4887 +msgid "_Flush Map Cache" +msgstr "_Tyhjennä karttavälimuisti" + +#: ../src/vikwindow.c:4888 +msgid "_Set the Default Location" +msgstr "_Aseta oletussijainti" + +#: ../src/vikwindow.c:4888 +msgid "Set the Default Location to the current position" +msgstr "Aseta oletussijainniksi nykyinen sijainti" + +#: ../src/vikwindow.c:4889 +msgid "_Preferences" +msgstr "A_setukset" + +#: ../src/vikwindow.c:4889 +msgid "Program Preferences" +msgstr "" + +#: ../src/vikwindow.c:4890 +msgid "_Layer Defaults" +msgstr "" + +#: ../src/vikwindow.c:4891 +msgid "_Properties" +msgstr "Ominaisuu_det" + +#: ../src/vikwindow.c:4893 +msgid "Help" +msgstr "" + +#: ../src/vikwindow.c:4894 +msgid "_About" +msgstr "O_hjelmasta" + +#: ../src/vikwindow.c:4894 +msgid "About" +msgstr "" + +#: ../src/vikwindow.c:4903 +msgid "_KML..." +msgstr "" + +#: ../src/vikwindow.c:4903 +msgid "Export as KML" +msgstr "" + +#: ../src/vikwindow.c:4904 +msgid "Transfer data from a GPS device" +msgstr "Siirrä tietoa GPS-laitteesta" + +#: ../src/vikwindow.c:4905 +msgid "Import file via GPSBabel converter" +msgstr "Tuo tiedosto GPSBabel-muuntimen kautta" + +#: ../src/vikwindow.c:4909 +msgid "Import Geo_JSON File..." +msgstr "" + +#: ../src/vikwindow.c:4909 +msgid "Import GeoJSON file" +msgstr "" + +#: ../src/vikwindow.c:4914 +msgid "_UTM Mode" +msgstr "_UTM-tila" + +#: ../src/vikwindow.c:4915 +msgid "_Expedia Mode" +msgstr "_Expedia-tila" + +#: ../src/vikwindow.c:4916 +msgid "_Mercator Mode" +msgstr "_Mercator-tila" + +#: ../src/vikwindow.c:4917 +msgid "Lat_/Lon Mode" +msgstr "Le_veysaste-/pituuastetila" + +#: ../src/vikwindow.c:4921 +msgid "Show _Scale" +msgstr "Näytä _skaala" + +#: ../src/vikwindow.c:4921 +msgid "Show Scale" +msgstr "Näytä skaala" + +#: ../src/vikwindow.c:4922 +msgid "Show _Center Mark" +msgstr "Näytä k_eskusmerkki" + +#: ../src/vikwindow.c:4922 +msgid "Show Center Mark" +msgstr "Näytä keskusmerkki" + +#: ../src/vikwindow.c:4923 +msgid "Show _Highlight" +msgstr "Näytä _korostus" + +#: ../src/vikwindow.c:4923 +msgid "Show Highlight" +msgstr "Näytä korostus" + +#: ../src/vikwindow.c:4924 +msgid "_Full Screen" +msgstr "K_okonäyttö" + +#: ../src/vikwindow.c:4924 +msgid "Activate full screen mode" +msgstr "Aktivoi kokonäyttötila" + +#: ../src/vikwindow.c:4925 +msgid "Show Side _Panel" +msgstr "Näytä siv_upaneeli" + +#: ../src/vikwindow.c:4925 +msgid "Show Side Panel" +msgstr "Näytä sivupaneeli" + +#: ../src/vikwindow.c:4926 +msgid "Show Status_bar" +msgstr "Näytä tilapal_kki" + +#: ../src/vikwindow.c:4926 +msgid "Show Statusbar" +msgstr "Näytä tilapalkki" + +#: ../src/vikwindow.c:4927 +msgid "Show _Toolbar" +msgstr "Näytä _työkalupalkki" + +#: ../src/vikwindow.c:4927 +msgid "Show Toolbar" +msgstr "Näytä työkalupalkki" + +#: ../src/vikwindow.c:4928 +msgid "Show _Menu" +msgstr "Näytä _Valikko" + +#: ../src/vikwindow.c:4928 +msgid "Show Menu" +msgstr "Näytä valikko" + +#: ../src/vikwindow.c:4929 +#, fuzzy +msgid "Show Side Panel B_uttons" +msgstr "Näytä sivupaneeli" + +#: ../src/vikwindow.c:4929 +#, fuzzy +msgid "Show Side Panel Buttons" +msgstr "Näytä sivupaneeli" + +#: ../src/vikwindow.c:4930 +#, fuzzy +msgid "Show Side Panel Ca_lendar" +msgstr "Näytä sivupaneeli" + +#: ../src/vikwindow.c:4930 +#, fuzzy +msgid "Show Side Panel Calendar" +msgstr "Näytä sivupaneeli" + +#: ../src/vikwindow.c:5064 +#, c-format +msgid "New _%s Layer" +msgstr "" + +#: ../src/vikwindow.c:5114 +#, fuzzy +msgid "..." +msgstr "Lisää..." + +#: ../src/viking.desktop.in.h:2 +msgid "GPS Data Manager" +msgstr "GPS-tietohallinta" + +#: ../src/viking.desktop.in.h:3 +msgid "Map Based GPS Data Manager (live data capable)." +msgstr "Karttaperustaienn GPS-datahallinta (livetietokykyinen)." + +#: ../src/libjpeg/jpeg-data.c:205 +msgid "Data does not follow JPEG specification." +msgstr "Tiedot eivät noudata JPEF-määrittelyä." + +#: ../src/libjpeg/jpeg-data.c:302 +#, c-format +msgid "Path '%s' invalid." +msgstr "Polku ’%s’ on virheellinen." + +#: ../src/libjpeg/jpeg-data.c:320 +#, c-format +msgid "Could not read '%s'." +msgstr "Kohteen ’%s’ lukeminen epäonnistui." + +# Tämä on varmaan typo ? +#~ msgid "Polygonzied Layer" +#~ msgstr "Monikulmaistettu kerros" + +#~ msgid "Email:" +#~ msgstr "Sähköpostiosoite:" + +#~ msgid "I don't know that place. Do you want another goto?" +#~ msgstr "En tunne paikkaa. Haluatko siirtyä muualle?" + +#~ msgid "Error: couldn't find gpsbabel." +#~ msgstr "Virhe: ohjelman gpsbabel löytyminen epäonnistui." + +#~ msgid "Create Track" +#~ msgstr "Luo reitti" diff --git a/po/fr.po b/po/fr.po new file mode 100644 index 0000000..1011338 --- /dev/null +++ b/po/fr.po @@ -0,0 +1,6242 @@ +# French translation for viking +# +msgid "" +msgstr "" +"Project-Id-Version: Viking\n" +"Report-Msgid-Bugs-To: \n" +"POT-Creation-Date: 2019-01-19 12:53+0000\n" +"PO-Revision-Date: 2016-01-10 16:41+0000\n" +"Last-Translator: Djiboun \n" +"Language-Team: \n" +"Language: \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-Launchpad-Export-Date: 2018-12-21 17:32+0000\n" +"X-Generator: Launchpad (build 18847)\n" +"X-Poedit-Language: French\n" + +#: ../src/acquire.c:106 ../src/vikgpslayer.c:1367 +msgid "Done." +msgstr "Fait." + +#: ../src/acquire.c:115 +msgid "No data." +msgstr "Aucune donnée." + +#: ../src/acquire.c:167 ../src/acquire.c:415 +msgid "Error: acquisition failed." +msgstr "Erreur : échec d'acquisition" + +#: ../src/acquire.c:339 +msgid "Working..." +msgstr "Traitement..." + +#. This shouldn't happen... +#: ../src/acquire.c:406 +msgid "" +"Unable to create command\n" +"Acquire method failed." +msgstr "" +"Impossible de créer la commande\n" +"Échec d'acquisition." + +#: ../src/acquire.c:513 +msgid "_Filter" +msgstr "_Filtre" + +#: ../src/acquire.c:528 +#, c-format +msgid "Filter with %s" +msgstr "Filtrer avec %s" + +#: ../src/acquire.c:545 +msgid "Filter" +msgstr "Filtre" + +#: ../src/babel.c:640 +msgid "GPSBabel:" +msgstr "" + +#: ../src/babel.c:641 +msgid "" +"Allow setting the specific instance of GPSBabel. You must restart Viking for " +"this value to take effect." +msgstr "" + +#: ../src/babel_ui.c:79 +msgid "Select a file format" +msgstr "" + +#: ../src/babel_ui.c:144 ../src/viktrwlayer.c:531 ../src/viktrwlayer.c:2882 +msgid "Tracks" +msgstr "Traces" + +#: ../src/babel_ui.c:149 ../src/viktrwlayer.c:2892 +msgid "Routes" +msgstr "Itinéraires" + +#. ***** PARAMETERS ***** +#: ../src/babel_ui.c:154 ../src/viktrwlayer.c:531 ../src/viktrwlayer.c:2887 +msgid "Waypoints" +msgstr "Waypoints" + +#: ../src/background.c:64 +#, c-format +msgid "%d items" +msgstr "%d éléments" + +#: ../src/background.c:287 +msgid "Threads:" +msgstr "" + +#: ../src/background.c:288 +msgid "" +"Number of threads to use for Mapnik tasks. You need to restart Viking for a " +"change to this value to be used" +msgstr "" + +#: ../src/background.c:361 +msgid "Job" +msgstr "Tâche" + +#: ../src/background.c:365 +msgid "Progress" +msgstr "Progression" + +#: ../src/background.c:373 +msgid "Viking Background Jobs" +msgstr "Tâches de fond" + +#: ../src/bing.c:42 +msgid "Bing Aerial" +msgstr "" + +#: ../src/bing.c:48 +msgid "Bing" +msgstr "Bing" + +#. VIK_GTK_WINDOW_FROM_WIDGET(vp) +#: ../src/bingmapsource.c:514 +msgid "Bing attribution Loading" +msgstr "Chargement des attributions Bing" + +#: ../src/clipboard.c:95 +msgid "paste failed" +msgstr "collage échoué" + +#: ../src/clipboard.c:105 +msgid "wrong clipboard data size" +msgstr "taille du presse-papier incorrecte" + +#: ../src/clipboard.c:124 +#, c-format +msgid "" +"The clipboard contains sublayer data for %s layers. You must select a layer " +"of this type to paste the clipboard data." +msgstr "" +"Le presse-papier contient des données de sous-calque pour %s calques. Vous " +"devez choisir un calque de ce type pour coller les données du presse-papier." + +#: ../src/clipboard.c:264 +msgid "" +"In order to paste a waypoint, please select an appropriate layer to paste " +"into." +msgstr "Pour copier un waypoint, sélectionner un calque approprié." + +#: ../src/dialog.c:60 +msgid "Go to Lat/Lon" +msgstr "Aller à Lat/Lon" + +#: ../src/dialog.c:69 ../src/viktrwlayer_wpwin.c:173 +msgid "Latitude:" +msgstr "Latitude :" + +#: ../src/dialog.c:72 ../src/viktrwlayer_wpwin.c:177 +msgid "Longitude:" +msgstr "Longitude :" + +#: ../src/dialog.c:102 +msgid "Go to UTM" +msgstr "Aller à une coordonnée UTM" + +#: ../src/dialog.c:114 +msgid "Northing:" +msgstr "Northing :" + +#: ../src/dialog.c:117 +msgid "Easting:" +msgstr "Easting :" + +#: ../src/dialog.c:121 ../src/vikgeoreflayer.c:902 +msgid "Zone:" +msgstr "Zone :" + +#: ../src/dialog.c:124 ../src/vikgeoreflayer.c:904 +msgid "Letter:" +msgstr "Lettre :" + +#: ../src/dialog.c:246 ../src/geonamessearch.c:238 +#: ../src/datasource_osm_my_traces.c:505 +msgid "Nothing was selected" +msgstr "Rien n'était sélectionné" + +#: ../src/dialog.c:254 +msgid "Add Route" +msgstr "Ajouter un itinéraire" + +#: ../src/dialog.c:254 +msgid "Add Track" +msgstr "Ajouter une trace" + +#: ../src/dialog.c:262 +msgid "Route Name:" +msgstr "Nom d'itinéraire :" + +#: ../src/dialog.c:262 +msgid "Track Name:" +msgstr "Nom de la trace :" + +#: ../src/dialog.c:282 +msgid "Please enter a name for the track." +msgstr "Entrez un nom pour la trace." + +#: ../src/dialog.c:311 +msgid "Today" +msgstr "" + +#: ../src/dialog.c:393 +msgid "Zoom Factors..." +msgstr "Facteurs de zoom…" + +#: ../src/dialog.c:407 +msgid "Zoom factor (in meters per pixel):" +msgstr "Facteur de zoom (en mètres par pixel) :" + +#: ../src/dialog.c:408 +msgid "X (easting): " +msgstr "X (est) " + +#: ../src/dialog.c:409 +msgid "Y (northing): " +msgstr "Y (nord) " + +#: ../src/dialog.c:414 +msgid "X and Y zoom factors must be equal" +msgstr "Les facteurs X et Y doivent être égaux" + +#: ../src/dialog.c:469 +msgid "1 min" +msgstr "1 minute" + +#: ../src/dialog.c:470 +msgid "1 hour" +msgstr "1 heure" + +#: ../src/dialog.c:471 +msgid "1 day" +msgstr "1 jour" + +#: ../src/dialog.c:472 +msgid "Custom (in minutes):" +msgstr "Personalisé (en minutes)" + +#: ../src/dialog.c:608 +#, c-format +msgid "" +"2003-2008, Evan Battaglia\n" +"2008-%s, Viking's contributors" +msgstr "" + +#: ../src/dialog.c:609 +msgid "GPS Data and Topo Analyzer, Explorer, and Manager." +msgstr "Analyse de topo, gestion de données GPS" + +#: ../src/dialog.c:610 +msgid "" +"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.\n" +"\n" +"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.\n" +"\n" +"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., 59 Temple " +"Place, Suite 330, Boston, MA 02111-1307, USA" +msgstr "" +"Ce programme est un logiciel libre: vous pouvez le redistribuer et/ou le " +"modifier selon les termes de la \"GNU General Public License\", tels que " +"publiés par la \"Free Software Foundation\"; soit la version 2 de cette " +"licence ou (à votre choix) toute version ultérieure.\n" +"\n" +"Ce programme est distribué dans l'espoir qu'il sera utile, mais SANS AUCUNE " +"GARANTIE, ni explicite ni implicite; sans même les garanties de " +"commercialisation ou d'adaptation dans un but spécifique.\n" +"\n" +"Se référer à la \"GNU General Public License\" pour plus de détails.\n" +"\n" +"Vous devriez avoir reçu une copie de la \"GNU General Public License\" en " +"même temps que ce programme; sinon, écrivez a la \"Free Software Foundation, " +"Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307, USA\"" + +#: ../src/dialog.c:703 +msgid "Translation is coordinated on http://launchpad.net/viking" +msgstr "Les traductions sont coordonées sur http://launchpad.net/viking" + +#: ../src/dialog.c:713 +msgid "Download along track" +msgstr "Télécharger le long de la trace" + +#: ../src/dialog.c:720 +msgid "Map type:" +msgstr "Type de carte :" + +#: ../src/dialog.c:726 +msgid "Zoom level:" +msgstr "Niveau de zoom :" + +#: ../src/dialog.c:766 +#, c-format +msgid "The map data is licensed: %s." +msgstr "La carte est sous licence : %s." + +#: ../src/dialog.c:769 +#, c-format +msgid "" +"The data provided by '%s' are licensed under the following license: " +"%s." +msgstr "" + +#: ../src/dialog.c:773 +msgid "Open license" +msgstr "Ouvrir la licence" + +#: ../src/expedia.c:54 +msgid "Expedia Street Maps" +msgstr "Expedia Street Maps" + +#: ../src/expedia.c:82 +msgid "Invalid expedia altitude" +msgstr "Altitude invalide (expedia)" + +#: ../src/expedia.c:113 +#, c-format +msgid "" +"Couldn't open EXPEDIA image file (right after successful download! Please " +"report and delete image file!): %s" +msgstr "" +"Impossible d'ouvrir l'image EXPEDIA (juste après un téléchargement " +"fructueux ! Rapportez l'information et détruisez le fichier) : %s" + +#: ../src/expedia.c:126 +#, c-format +msgid "" +"Couldn't save EXPEDIA image file (right after successful download! Please " +"report and delete image file!): %s" +msgstr "" +"Impossible d'enregistrer l'image EXPEDIA (juste après un téléchargement " +"fructueux ! Rapportez l'information et détruisez le fichier) : %s" + +#: ../src/geonamessearch.c:115 +msgid "Search" +msgstr "Rechercher" + +#: ../src/geonamessearch.c:117 +msgid "No entries found!" +msgstr "Aucune entrée trouvée !" + +#. NB could allow columns to be shifted around by doing this after each new +#. gtk_tree_view_column_set_reorderable ( column, TRUE ); +#. However I don't think is that useful, so I haven't put it in +#: ../src/geonamessearch.c:171 ../src/datasource_osm_my_traces.c:422 +#: ../src/viktrwlayer_tracklist.c:621 ../src/viktrwlayer_waypointlist.c:618 +msgid "Name" +msgstr "Nom" + +#: ../src/geonamessearch.c:176 +msgid "Feature" +msgstr "Fonctionnalité" + +#: ../src/geonamessearch.c:181 ../src/datasource_osm_my_traces.c:437 +msgid "Lat/Lon" +msgstr "Lat/Lon" + +#: ../src/geonamessearch.c:264 ../src/googlesearch.c:101 ../src/vikgoto.c:430 +msgid "couldn't map temp file" +msgstr "Impossible d'ouvrir le fichier de carte" + +#: ../src/geonamessearch.c:459 +#, fuzzy +msgid "Select articles" +msgstr "Outil de sélection" + +#: ../src/geonamessearch.c:459 +msgid "Select the articles you want to add." +msgstr "" + +#: ../src/geonamessearch.c:475 +msgid "city" +msgstr "" + +#: ../src/geonamessearch.c:477 +#, fuzzy +msgid "edu" +msgstr "arrivée" + +#: ../src/geonamessearch.c:479 +msgid "airport" +msgstr "" + +#: ../src/geonamessearch.c:481 +msgid "mountain" +msgstr "" + +#: ../src/geonamessearch.c:483 +msgid "forest" +msgstr "" + +#: ../src/geonamessearch.c:485 +msgid "church" +msgstr "" + +#: ../src/geojson.c:74 +#, c-format +msgid "%s command failed: %s" +msgstr "" + +#: ../src/geojson.c:146 ../src/gpx.c:1317 +#, c-format +msgid "failed to open temporary file: %s" +msgstr "Impossible d'ouvrir le fichier temporaire %s" + +#: ../src/globals.c:67 +msgid "DDD" +msgstr "" + +#: ../src/globals.c:67 +msgid "DMM" +msgstr "" + +#: ../src/globals.c:67 +msgid "DMS" +msgstr "" + +#: ../src/globals.c:67 +msgid "Raw" +msgstr "" + +#: ../src/globals.c:68 +msgid "Kilometres" +msgstr "" + +#: ../src/globals.c:68 +msgid "Miles" +msgstr "" + +#: ../src/globals.c:68 +msgid "Nautical Miles" +msgstr "" + +#. VIK_UNITS_SPEED_KILOMETRES_PER_HOUR: +#: ../src/globals.c:69 ../src/viktrwlayer_tracklist.c:655 ../src/vikutils.c:100 +msgid "km/h" +msgstr "km/h" + +#: ../src/globals.c:69 ../src/viktrwlayer_tracklist.c:656 ../src/vikutils.c:78 +msgid "mph" +msgstr "mi/h" + +#. VIK_UNITS_SPEED_METRES_PER_SECOND: +#: ../src/globals.c:69 ../src/viktrwlayer_tracklist.c:663 ../src/vikutils.c:81 +msgid "m/s" +msgstr "m/s" + +#: ../src/globals.c:69 ../src/viktrwlayer_tracklist.c:657 ../src/vikutils.c:84 +msgid "knots" +msgstr "nœuds" + +#: ../src/globals.c:69 ../src/viktrwlayer_tracklist.c:658 ../src/vikutils.c:87 +msgid "s/km" +msgstr "" + +#: ../src/globals.c:69 ../src/viktrwlayer_tracklist.c:659 ../src/vikutils.c:90 +msgid "min/km" +msgstr "" + +#: ../src/globals.c:69 +msgid "s/mi" +msgstr "" + +#: ../src/globals.c:69 ../src/viktrwlayer_tracklist.c:661 ../src/vikutils.c:96 +msgid "min/mi" +msgstr "" + +#: ../src/globals.c:70 +msgid "Metres" +msgstr "" + +#: ../src/globals.c:70 +msgid "Feet" +msgstr "" + +#: ../src/globals.c:73 +msgid "Locale" +msgstr "" + +#: ../src/globals.c:73 +msgid "World" +msgstr "" + +#: ../src/globals.c:73 +msgid "UTC" +msgstr "" + +#: ../src/globals.c:76 +msgid "Degree format:" +msgstr "Format des degrées :" + +#: ../src/globals.c:77 +msgid "Distance units:" +msgstr "Unité de distance:" + +#: ../src/globals.c:78 +msgid "Speed units:" +msgstr "Unité de vitesse:" + +#: ../src/globals.c:79 +msgid "Height units:" +msgstr "Unité d'altitude:" + +#: ../src/globals.c:80 +msgid "Use large waypoint icons:" +msgstr "Utiliser de grandes icones pour les waypoints :" + +#: ../src/globals.c:81 +msgid "Default latitude:" +msgstr "Latitude par défaut:" + +#: ../src/globals.c:82 +msgid "Default longitude:" +msgstr "Longitude par défaut:" + +#: ../src/globals.c:83 +msgid "Time Display:" +msgstr "" + +#: ../src/globals.c:84 +msgid "" +"Display times according to the reference frame. Locale is the user's system " +"setting. World is relative to the location of the object." +msgstr "" + +#: ../src/globals.c:90 +msgid "Alphabetical" +msgstr "Ordre alphabétique" + +#: ../src/globals.c:90 ../src/datasource_osm_my_traces.c:432 +msgid "Time" +msgstr "Temps" + +#: ../src/globals.c:90 +msgid "Creation" +msgstr "Création" + +#: ../src/globals.c:91 +msgid "Title Case" +msgstr "Casse de Titre" + +#: ../src/globals.c:91 +msgid "Lowercase" +msgstr "Minuscule" + +#: ../src/globals.c:94 +msgid "KML File Export Units:" +msgstr "Unités pour les exports fichiers KML :" + +#: ../src/globals.c:95 +msgid "GPX Track Order:" +msgstr "Ordre des traces GPX :" + +#: ../src/globals.c:96 +msgid "GPX Waypoint Symbols:" +msgstr "Symboles des points GPX" + +#: ../src/globals.c:97 +msgid "" +"Save GPX Waypoint Symbol names in the specified case. May be useful for " +"compatibility with various devices" +msgstr "" + +#: ../src/globals.c:98 +#, fuzzy +msgid "GPX Creator:" +msgstr "Création" + +#: ../src/globals.c:99 +msgid "" +"The creator value when writing a GPX file. Otherwise when blank a default is " +"used." +msgstr "" + +#: ../src/globals.c:104 +msgid "Image Viewer:" +msgstr "Visionneur d'images :" + +#: ../src/globals.c:109 +msgid "External GPX Program 1:" +msgstr "Programme 1 GPX externe" + +#: ../src/globals.c:110 +msgid "External GPX Program 2:" +msgstr "Programme 2 GPX externe" + +#: ../src/globals.c:113 +msgid "Absolute" +msgstr "Absolu" + +#: ../src/globals.c:113 +msgid "Relative" +msgstr "Relative" + +#: ../src/globals.c:117 +msgid "Save File Reference Mode:" +msgstr "" + +#: ../src/globals.c:118 +msgid "" +"When saving a Viking .vik file, this determines how the directory paths of " +"filenames are written." +msgstr "" + +#: ../src/globals.c:119 +msgid "Ask for Name before Track Creation:" +msgstr "" + +#: ../src/globals.c:120 +msgid "Show Tooltip during Track Creation:" +msgstr "Afficher l'info-bulle lors de la création de la trace" + +#: ../src/globals.c:121 +msgid "The number of recent files:" +msgstr "" + +#: ../src/globals.c:122 +msgid "" +"Only applies to new windows or on application restart. -1 means all " +"available files." +msgstr "" + +#: ../src/globals.c:123 +#, fuzzy +msgid "Open files in selected layer:" +msgstr "Supprimer le calque sélectionné" + +#: ../src/globals.c:124 +msgid "Open files (but not .vik ones) into the selected TrackWaypoint layer." +msgstr "" + +#: ../src/globals.c:125 +msgid "Show calendar day names:" +msgstr "" + +#: ../src/globals.c:128 +msgid "Home Location" +msgstr "Position d'origine" + +#: ../src/globals.c:128 +msgid "Last Location" +msgstr "Dernière position" + +#: ../src/globals.c:128 +msgid "Specified File" +msgstr "Fichier spécifié" + +#: ../src/globals.c:128 +msgid "Auto Location" +msgstr "Emplacement automatique" + +#: ../src/globals.c:131 +msgid "Restore Window Setup:" +msgstr "" + +#: ../src/globals.c:132 +msgid "Restore window size and layout" +msgstr "" + +#: ../src/globals.c:133 +msgid "Add a Default Map Layer:" +msgstr "Ajouter une couche de carte par défaut" + +#: ../src/globals.c:134 +msgid "" +"The default map layer added is defined by the Layer Defaults. Use the menu " +"Edit->Layer Defaults->Map... to change the map type and other values." +msgstr "" + +#: ../src/globals.c:135 +msgid "Startup Method:" +msgstr "Méthode de démarrage" + +#: ../src/globals.c:136 +msgid "Startup File:" +msgstr "Fichier de démarrage" + +#: ../src/globals.c:137 +msgid "" +"The default file to load on startup. Only applies when the startup method is " +"set to 'Specified File'" +msgstr "" + +#: ../src/globals.c:138 +msgid "Check For New Version:" +msgstr "Vérifier une nouvelle version" + +#: ../src/globals.c:139 +msgid "Periodically check to see if a new version of Viking is available" +msgstr "" +"Vérifier périodiquement si une nouvelle version de Viking est disponible" + +#. Defaults for the options are setup here +#: ../src/globals.c:176 +msgid "General" +msgstr "Général" + +#. New Tab +#: ../src/globals.c:204 +msgid "Startup" +msgstr "Démarrage" + +#. New Tab +#: ../src/globals.c:222 +msgid "Export/External" +msgstr "Export/Externe" + +#. 'Advanced' Properties +#: ../src/globals.c:249 +msgid "Advanced" +msgstr "Options avancées" + +#. Webtools +#: ../src/google.c:39 +msgid "Google" +msgstr "Google" + +#. If there is an actual description field it will overwrite this value +#: ../src/gpx.c:264 +#, c-format +msgid "Created by: %s" +msgstr "" + +#: ../src/datasource_bfilter.c:43 +msgid "Max number of points:" +msgstr "Nombre maximum de points :" + +#: ../src/datasource_bfilter.c:84 +msgid "Simplify All Tracks..." +msgstr "Simplifie Toutes les Traces" + +#: ../src/datasource_bfilter.c:85 +msgid "Simplified Tracks" +msgstr "Traces simplifiées" + +#. { VIK_LAYER_NUM_TYPES, "compressmethod", VIK_LAYER_PARAM_UINT, VIK_LAYER_GROUP_NONE, N_("Simplify Method:"), VIK_LAYER_WIDGET_COMBOBOX, compress_method, NULL, NULL, NULL, NULL, NULL }, +#: ../src/datasource_bfilter.c:111 +msgid "Error Factor:" +msgstr "" + +#: ../src/datasource_bfilter.c:112 +msgid "" +"Specifies the maximum allowable error that may be introduced by removing a " +"single point by the crosstrack method. See the manual or GPSBabel Simplify " +"Filter documentation for more detail." +msgstr "" + +#: ../src/datasource_bfilter.c:166 +msgid "Compress Tracks..." +msgstr "" + +#: ../src/datasource_bfilter.c:167 +msgid "Compressed Tracks" +msgstr "" + +#: ../src/datasource_bfilter.c:197 ../src/datasource_bfilter.c:198 +msgid "Remove Duplicate Waypoints" +msgstr "Supprimer les waypoints dupliqués" + +#: ../src/datasource_bfilter.c:221 +msgid "Manual filter:" +msgstr "" + +#: ../src/datasource_bfilter.c:222 +msgid "Manual filter command: e.g. 'swap'." +msgstr "" + +#: ../src/datasource_bfilter.c:233 ../src/datasource_bfilter.c:234 +msgid "Manual filter" +msgstr "" + +#: ../src/datasource_bfilter.c:262 +msgid "Waypoints Inside This" +msgstr "Waypoints à l'intérieur" + +#: ../src/datasource_bfilter.c:263 ../src/datasource_bfilter.c:292 +msgid "Polygonized Layer" +msgstr "" + +#: ../src/datasource_bfilter.c:291 +msgid "Waypoints Outside This" +msgstr "" + +#: ../src/datasource_file.c:61 +msgid "Import file with GPSBabel" +msgstr "Importer un fichier avec GPSBabel" + +#: ../src/datasource_file.c:62 +msgid "Imported file" +msgstr "Fichier importé" + +#. The file selector +#: ../src/datasource_file.c:129 +msgid "File:" +msgstr "Fichier :" + +#: ../src/datasource_file.c:130 +msgid "File to import" +msgstr "Fichier à importer" + +#: ../src/datasource_file.c:137 +msgid "All files" +msgstr "Tous les fichiers" + +#. The file format selector +#: ../src/datasource_file.c:144 ../src/datasource_url.c:106 +msgid "File type:" +msgstr "Type de fichier :" + +#: ../src/datasource_file.c:189 +#, c-format +msgid "using babel args '%s' and file '%s'" +msgstr "utilisation des arguments babel '%s' et du fichier '%s'" + +#: ../src/datasource_gc.c:67 +msgid "Download Geocaches" +msgstr "Télécharger des Geocaches" + +#: ../src/datasource_gc.c:68 +msgid "Geocaching.com Caches" +msgstr "Caches geocaching.com" + +#: ../src/datasource_gc.c:86 +msgid "geocaching.com username:" +msgstr "Nom d'utilisateur geocaching.com :" + +#: ../src/datasource_gc.c:87 +msgid "geocaching.com password:" +msgstr "Mot de passe geocaching.com :" + +#: ../src/datasource_gc.c:92 ../src/vikwindow.c:3502 +msgid "Geocaching" +msgstr "Geocaching" + +#: ../src/datasource_gc.c:128 +#, c-format +msgid "" +"Can't find %s or %s in path! Check that you have installed it correctly." +msgstr "" +"Impossible de trouver %s ou %s dans le PATH ! Vérifiez qu'il est " +"correctement installé." + +#: ../src/datasource_gc.c:190 +msgid "Number geocaches:" +msgstr "Nombre de geocaches :" + +#: ../src/datasource_gc.c:192 +msgid "Centered around:" +msgstr "Centré autour de :" + +#: ../src/datasource_gc.c:231 +msgid "Broken input - using some defaults" +msgstr "" + +#: ../src/datasource_geotag.c:51 +msgid "Create Waypoints from Geotagged Images" +msgstr "Créer des Waypoints à partir des images géolocalisées" + +#: ../src/datasource_geotag.c:52 +msgid "Geotagged Images" +msgstr "Images géolocalisées" + +#: ../src/datasource_geotag.c:102 ../src/datasource_geojson.c:93 +#: ../src/vikfileentry.c:171 ../src/vikwindow.c:3533 ../src/vikwindow.c:3610 +#: ../src/vikwindow.c:3641 ../src/vikwindow.c:4356 ../src/vikwindow.c:4649 +msgid "All" +msgstr "Tous" + +#: ../src/datasource_geotag.c:107 ../src/vikfileentry.c:115 +#: ../src/viktrwlayer_geotag.c:637 ../src/vikwindow.c:3518 +#: ../src/vikwindow.c:4377 +msgid "JPG" +msgstr "JPG" + +#: ../src/datasource_geotag.c:168 +#, c-format +msgid "Unable to create waypoint from %s" +msgstr "Impossible de créer de waypoint à partir de %s" + +#: ../src/datasource_geojson.c:46 +msgid "Acquire from GeoJSON" +msgstr "" + +#: ../src/datasource_geojson.c:47 ../src/datasource_geojson.c:98 +msgid "GeoJSON" +msgstr "" + +#: ../src/datasource_geojson.c:152 +#, c-format +msgid "Unable to import from: %s" +msgstr "" + +#: ../src/datasource_gps.c:54 +msgid "Acquire from GPS" +msgstr "Acquisition depuis le GPS" + +#: ../src/datasource_gps.c:55 +msgid "Acquired from GPS" +msgstr "Acquis depuis le GPS" + +#: ../src/datasource_gps.c:258 +#, c-format +msgid "using cmd '%s' and file '%s'\n" +msgstr "" + +#: ../src/datasource_gps.c:353 ../src/vikgpslayer.c:966 +#, c-format +msgid "Downloading %d waypoint..." +msgid_plural "Downloading %d waypoints..." +msgstr[0] "Téléchargement de %d point d'intérêt..." +msgstr[1] "Téléchargement de %d points d'intérêt..." + +#: ../src/datasource_gps.c:358 ../src/vikgpslayer.c:971 +#, c-format +msgid "Downloading %d trackpoint..." +msgid_plural "Downloading %d trackpoints..." +msgstr[0] "Téléchargement de %d point de route..." +msgstr[1] "Téléchargement de %d points de route..." + +#: ../src/datasource_gps.c:363 ../src/vikgpslayer.c:976 +#, c-format +msgid "Downloading %d routepoint..." +msgid_plural "Downloading %d routepoints..." +msgstr[0] "Téléchargement de %d point de route..." +msgstr[1] "Téléchargement de %d points de route..." + +#: ../src/datasource_gps.c:386 ../src/datasource_gps.c:393 +#: ../src/datasource_gps.c:400 +#, c-format +msgid "Downloaded %d out of %d %s..." +msgstr "%d sur %d %s téléchargés" + +#: ../src/datasource_gps.c:388 ../src/datasource_gps.c:395 +#: ../src/datasource_gps.c:402 +#, c-format +msgid "Downloaded %d %s." +msgstr "%d %s téléchargés" + +#: ../src/datasource_gps.c:416 ../src/vikgpslayer.c:1134 +#, c-format +msgid "GPS Device: %s" +msgstr "Appareil GPS : %s" + +#: ../src/datasource_gps.c:428 ../src/vikgpslayer.c:1214 +msgid "Status: Working..." +msgstr "Etat : Travail..." + +#. NB gps_layer_inst_init() is performed after parameter registeration +#. thus to give the protocols some potential values use the old static list +#. TODO: find another way to use gps_layer_inst_init()? +#: ../src/datasource_gps.c:584 ../src/vikgpslayer.c:216 +msgid "GPS Protocol:" +msgstr "Protocole GPS :" + +#. List reassigned at runtime +#: ../src/datasource_gps.c:609 ../src/vikgpslayer.c:217 +msgid "Serial Port:" +msgstr "Port série :" + +#: ../src/datasource_gps.c:659 +msgid "" +"Turn Off After Transfer\n" +"(Garmin/NAViLink Only)" +msgstr "" +"Eteindre après transfert\n" +"(Garmin/NAViLink seulement)" + +#: ../src/datasource_gps.c:666 +msgid "Tracks:" +msgstr "Traces :" + +#: ../src/datasource_gps.c:673 +msgid "Routes:" +msgstr "Itinéraires :" + +#: ../src/datasource_gps.c:680 +msgid "Waypoints:" +msgstr "Waypoints :" + +#: ../src/datasource_gps.c:756 ../src/vikgpslayer.c:1509 +msgid "GPS device: N/A" +msgstr "Appareil GPS : N/A" + +#: ../src/datasource_osm.c:53 ../src/datasource_osm.c:54 +msgid "OSM traces" +msgstr "Traces OSM" + +#: ../src/datasource_osm.c:89 +msgid "Page number:" +msgstr "Numéro de page :" + +#: ../src/datasource_osm_my_traces.c:59 ../src/datasource_osm_my_traces.c:60 +msgid "OSM My Traces" +msgstr "Mes Traces OSM" + +#: ../src/datasource_osm_my_traces.c:106 ../src/osm-traces.c:684 +#, fuzzy +msgid "Email/username:" +msgstr "Nom d'utilisateur :" + +#: ../src/datasource_osm_my_traces.c:111 +msgid "The email or username used to login to OSM" +msgstr "L'adresse mail ou l'identifiant utilisé pour s'authentifier sur OSM" + +#: ../src/datasource_osm_my_traces.c:113 ../src/osm-traces.c:692 +msgid "Password:" +msgstr "Mot de passe :" + +#: ../src/datasource_osm_my_traces.c:116 +msgid "The password used to login to OSM" +msgstr "Le mot de passe utilisé pour s'autentifier sur OSM" + +#: ../src/datasource_osm_my_traces.c:427 ../src/viktrwlayer.c:689 +msgid "Description" +msgstr "Description" + +#: ../src/datasource_osm_my_traces.c:442 +msgid "Privacy" +msgstr "Confidentialité" + +#: ../src/datasource_osm_my_traces.c:449 +msgid "Within Current View" +msgstr "Dans la Vue Courante" + +#: ../src/datasource_osm_my_traces.c:516 +msgid "GPS Traces" +msgstr "Traces GPS" + +#: ../src/datasource_osm_my_traces.c:518 +msgid "None found!" +msgstr "Aucun résultat !" + +#: ../src/datasource_osm_my_traces.c:569 +msgid "Ensure the OSM access token preferences are setup." +msgstr "" + +#: ../src/datasource_osm_my_traces.c:645 +msgid "My OSM Traces" +msgstr "Mes traces OSM" + +#. Report errors to the status bar +#: ../src/datasource_osm_my_traces.c:667 +#, c-format +msgid "Unable to get trace: %s" +msgstr "Impossible d'obtenir la trace : %s" + +#: ../src/datasource_routing.c:56 ../src/datasource_routing.c:57 +msgid "Directions" +msgstr "" + +#: ../src/datasource_routing.c:90 +msgid "No routing engines with directions available" +msgstr "" + +#. Engine selector +#: ../src/datasource_routing.c:99 +msgid "Engine:" +msgstr "Moteur :" + +#. From and To entries +#: ../src/datasource_routing.c:104 +msgid "From:" +msgstr "De :" + +#: ../src/datasource_routing.c:105 +msgid "To:" +msgstr "À :" + +#: ../src/datasource_url.c:48 +msgid "Acquire from URL" +msgstr "" + +#: ../src/datasource_url.c:49 +msgid "URL" +msgstr "" + +#: ../src/datasource_url.c:101 +msgid "URL:" +msgstr "" + +#. Only GPX (not using GPSbabel) +#: ../src/datasource_url.c:133 ../src/vikfileentry.c:161 +#: ../src/vikwindow.c:3513 ../src/vikwindow.c:3603 +msgid "GPX" +msgstr "GPX" + +#: ../src/datasource_wikipedia.c:32 +msgid "Create Waypoints from Wikipedia Articles" +msgstr "Créer des Waypoints depuis les articles Wikipedia" + +#: ../src/datasource_wikipedia.c:33 +msgid "Wikipedia Waypoints" +msgstr "Wikipedia Waypoints" + +#: ../src/dem.c:66 ../src/dem.c:80 +msgid "Invalid DEM" +msgstr "DEM invalide" + +#: ../src/dem.c:122 +msgid "Invalid DEM header" +msgstr "Entête DEM invalide" + +#: ../src/dem.c:191 ../src/dem.c:204 +msgid "Incorrect DEM Class B record: expected 1" +msgstr "Enregistrement DEM Class B incorrect: la valeur devrait être 1" + +#: ../src/dem.c:289 ../src/download.c:176 +#, c-format +msgid "Couldn't map file %s: %s" +msgstr "Impossible de cartographier le fichier %s : %s" + +#: ../src/download.c:130 +msgid "Tile age (days):" +msgstr "Age de la tuile (jours) :" + +#: ../src/download.c:406 +#, c-format +msgid "Download error: %s" +msgstr "Erreur de téléchargement : %s" + +#: ../src/download.c:490 +msgid "couldn't open temp file" +msgstr "Impossible d'ouvrir le fichier temporaire" + +#: ../src/file.c:458 ../src/file.c:463 +#, c-format +msgid "Draw mode '%s' no more supported" +msgstr "Le mode d'affichage '%s' n'est plus supporté" + +#: ../src/geotag_exif.c:621 +msgid "Not enough memory." +msgstr "Mémoire insuffisante." + +#: ../src/geotag_exif.c:639 +msgid "Setting a value for this tag is unsupported!" +msgstr "" + +#: ../src/geotag_exif.c:658 +#, c-format +msgid "Too few components specified (need %d, found %d)\n" +msgstr "Trop peu de composants spécifiés (%d requis, %d trouvés)\n" + +#: ../src/geotag_exif.c:662 +msgid "Numeric value expected\n" +msgstr "Valeur numérique attendue\n" + +#: ../src/geotag_exif.c:670 +msgid "This shouldn't happen!" +msgstr "Cela ne devrait pas se produire !" + +#: ../src/geotag_exif.c:740 +msgid "Not yet implemented!" +msgstr "Pas encore implémenté !" + +#: ../src/geotag_exif.c:753 +msgid "Warning; Too many components specified!" +msgstr "Attention; Trop de composants spécifiés !" + +#: ../src/osm-traces.c:87 +msgid "Identifiable (public w/ timestamps)" +msgstr "" +"Identifiable (affiché dans la liste des traces et comme identifiable, points " +"ordonnés avec les dates)" + +#: ../src/osm-traces.c:88 +msgid "Trackable (private w/ timestamps)" +msgstr "" +"Pistable (partagé seulement anonymement, points ordonnés avec les dates)" + +#: ../src/osm-traces.c:89 +msgid "Public" +msgstr "Public" + +#: ../src/osm-traces.c:90 +msgid "Private" +msgstr "Privé" + +#: ../src/osm-traces.c:108 +msgid "Access Token:" +msgstr "" + +#: ../src/osm-traces.c:108 +msgid "Get New OSM Access Tokens" +msgstr "" + +#: ../src/osm-traces.c:109 +msgid "Access Token Key:" +msgstr "" + +#: ../src/osm-traces.c:110 +msgid "Access Token Secret:" +msgstr "" + +#: ../src/osm-traces.c:111 +msgid "OSM username:" +msgstr "Nom d'utilisateur OSM :" + +#: ../src/osm-traces.c:112 +msgid "OSM password:" +msgstr "Mot de passe OSM :" + +#. Check to really override existing values... +#: ../src/osm-traces.c:263 +msgid "Do you want to overwrite existing values?" +msgstr "" + +#: ../src/osm-traces.c:275 +msgid "Not able to generate OSM request tokens." +msgstr "" + +#: ../src/osm-traces.c:299 +msgid "" +"Waiting for authorization approval.\n" +"Ensure you have granted access at the website before continuing here." +msgstr "" + +#: ../src/osm-traces.c:315 +#, fuzzy +msgid "No Authorization." +msgstr "Emplacement automatique" + +#: ../src/osm-traces.c:354 +msgid "" +"OSM Username and Password preferences are not required anymore. You can now " +"remove them." +msgstr "" + +#. Preferences +#: ../src/osm-traces.c:379 +msgid "OpenStreetMap Traces" +msgstr "Traces OpenStreetMap" + +#: ../src/osm-traces.c:504 +#, c-format +msgid "failed to upload data: HTTP response is %ld" +msgstr "Impossible d'uploader : la réponse HTTP est %ld" + +#: ../src/osm-traces.c:509 +#, c-format +msgid "curl_easy_getinfo failed: %d" +msgstr "curl_easy_getinfo a échoué : %d" + +#: ../src/osm-traces.c:514 +#, c-format +msgid "curl request failed: %s" +msgstr "Échec lors de la requête curl : %s" + +#. Success +#: ../src/osm-traces.c:592 +msgid "Uploaded to OSM" +msgstr "Envoyé à OSM" + +#: ../src/osm-traces.c:596 +msgid "" +"FAILED TO UPLOAD DATA TO OSM - Ensure the OSM access token preferences are " +"setup." +msgstr "" + +#: ../src/osm-traces.c:599 +msgid "FAILED TO UPLOAD DATA TO OSM - CURL PROBLEM" +msgstr "ERREUR D'ENVOI DES DONNEES VERS OSM - PROBLEME AVEC CURL" + +#: ../src/osm-traces.c:602 +msgid "FAILED TO UPLOAD DATA TO OSM" +msgstr "ERREUR D'ENVOI DES DONNEES VERS OSM" + +#: ../src/osm-traces.c:602 +msgid "HTTP response code" +msgstr "Code réponse HTTP" + +#: ../src/osm-traces.c:610 +#, c-format +msgid "failed to unlink temporary file: %s" +msgstr "Impossible de supprimer le fichier temporaire \"%s\"" + +#: ../src/osm-traces.c:664 +msgid "OSM upload" +msgstr "Émission vers OSM" + +#: ../src/osm-traces.c:689 +#, fuzzy +msgid "" +"The email/username used as login\n" +"Enter the email/username you use to login into www.openstreetmap.org." +"" +msgstr "" +"Adresse e-mail ou nom d'utilisateur\n" +"Entrer l'adresse e-mail ou le nom d'utilisateur que vous utilisez sur " +"www.openstreetmap.org." + +#: ../src/osm-traces.c:697 +msgid "" +"The password used to login\n" +"Enter the password you use to login into www.openstreetmap.org." +msgstr "" +"Mot de passe\n" +"Entrer le mot de passe que vous utilisez sur www.openstreetmap.org." + +#: ../src/osm-traces.c:703 +msgid "File's name:" +msgstr "Nom du fichier :" + +#: ../src/osm-traces.c:713 +msgid "" +"The name of the file on OSM\n" +"This is the name of the file created on the server.This is not the " +"name of the local file." +msgstr "" +"Nom du fichier sur OSM\n" +"Ceci est le nom du fichier créé sur le serveur OSM et non pas le nom " +"du fichier local." + +#: ../src/osm-traces.c:717 ../src/viktrwlayer_wpwin.c:197 +#: ../src/viktrwlayer_wpwin.c:199 +msgid "Description:" +msgstr "Description :" + +#: ../src/osm-traces.c:731 +msgid "The description of the trace" +msgstr "Description de la trace" + +#: ../src/osm-traces.c:734 +msgid "Anonymize Times:" +msgstr "" + +#: ../src/osm-traces.c:739 +msgid "" +"Anonymize times of the trace.\n" +"You may choose to make the trace identifiable, yet mask the actual " +"real time values" +msgstr "" +"Rend les données horaires de la trace confidentielles.\n" +"\n" +"Vous pouvez choisir de rendre la trace identifiable, mais en masquant " +"les heures réelles." + +#: ../src/osm-traces.c:743 +msgid "Tags:" +msgstr "Étiquettes :" + +#: ../src/osm-traces.c:751 +msgid "The tags associated to the trace" +msgstr "Étiquettes associées à la trace" + +#: ../src/osm-traces.c:816 +#, c-format +msgid "Uploading %s to OSM" +msgstr "Émission de %s vers OSM" + +#: ../src/mapcache.c:67 +msgid "Map cache memory size (MB):" +msgstr "Taille du cache mémoire des cartes (Mio) :" + +#. NB Can have a couple hundred fonts loaded when using system directories +#. So ATM don't list them all - otherwise need better GUI feedback display. +#: ../src/mapnik_interface.cpp:324 +#, c-format +msgid "" +"%s %s\n" +"Plugins=%sFonts loaded=%d" +msgstr "" + +#: ../src/mapnik_interface.cpp:325 ../src/vikmapniklayer.c:278 +msgid "Mapnik" +msgstr "" + +#: ../src/print.c:51 ../src/viktrwlayer.c:572 +msgid "None" +msgstr "Aucun" + +#: ../src/print.c:52 +msgid "Horizontally" +msgstr "Horizontalement" + +#: ../src/print.c:53 +msgid "Vertically" +msgstr "Verticalement" + +#: ../src/print.c:54 +msgid "Both" +msgstr "Les deux" + +#: ../src/print.c:118 +msgid "Image Settings" +msgstr "Paramètres de l'image" + +#: ../src/print.c:551 +msgid "done" +msgstr "terminé" + +#. Page Size +#: ../src/print.c:580 +msgid "_Adjust Page Size and Orientation" +msgstr "_Ajuster la taille de l'orientation de la page" + +#: ../src/print.c:596 +msgid "C_enter:" +msgstr "C_entrer :" + +#. ignore page margins +#: ../src/print.c:614 +msgid "Ignore Page _Margins" +msgstr "Ignorer les _marges de page" + +#: ../src/print.c:633 +msgid "Image S_ize:" +msgstr "Taille de l'_image :" + +#: ../src/ui_util.c:88 +#, c-format +msgid "Could not launch web browser. %s" +msgstr "Impossible de lancer le navigateur. %s" + +#: ../src/ui_util.c:101 +#, c-format +msgid "Could not create new email. %s" +msgstr "Impossible de créer un nouvel e-mail. %s" + +#: ../src/vikcoordlayer.c:57 +msgid "Color:" +msgstr "Couleur :" + +#: ../src/vikcoordlayer.c:58 +msgid "Minutes Width:" +msgstr "Écartement en minutes :" + +#: ../src/vikcoordlayer.c:59 +msgid "Line Thickness:" +msgstr "Épaisseur de la ligne :" + +#: ../src/vikcoordlayer.c:66 +msgid "Coordinate" +msgstr "Coordonnée" + +#: ../src/main.c:92 +#, c-format +msgid "Ignoring Xlib error: error code %d request code %d\n" +msgstr "" + +#: ../src/main.c:111 +msgid "Enable debug output" +msgstr "Activer la sortie de débogage" + +#: ../src/main.c:112 +msgid "Enable verbose output" +msgstr "Autoriser le mode bavard sur la sortie" + +#: ../src/main.c:113 +msgid "Show version" +msgstr "Affiche la version" + +#: ../src/main.c:114 +msgid "Latitude in decimal degrees" +msgstr "" + +#: ../src/main.c:115 +msgid "Longitude in decimal degrees" +msgstr "" + +#: ../src/main.c:116 +msgid "Zoom Level (OSM). Value can be 0 - 22" +msgstr "" + +#: ../src/main.c:117 +msgid "Add a map layer by id value. Use 0 for the default map." +msgstr "" + +#: ../src/main.c:160 +#, c-format +msgid "" +"%s %s\n" +"Copyright (c) 2003-2008 Evan Battaglia\n" +"Copyright (c) 2008-%s Viking's contributors\n" +msgstr "" + +#: ../src/osm.c:50 +#, fuzzy +msgid "OpenStreetMap (Mapnik)" +msgstr "Traces OpenStreetMap" + +#: ../src/osm.c:65 +#, fuzzy +msgid "OpenStreetMap (Cycle)" +msgstr "Traces OpenStreetMap" + +#: ../src/osm.c:79 +#, fuzzy +msgid "OpenStreetMap (Transport)" +msgstr "Traces OpenStreetMap" + +#: ../src/osm.c:95 +#, fuzzy +msgid "OpenStreetMap (Humanitarian)" +msgstr "Traces OpenStreetMap" + +#: ../src/osm.c:111 +msgid "On Disk OSM Tile Format" +msgstr "Format des tuiles OSM sur disque" + +#: ../src/osm.c:121 +msgid "MBTiles File" +msgstr "" + +#: ../src/osm.c:132 +msgid "OSM Metatiles" +msgstr "" + +#: ../src/osm.c:146 +msgid "Mapbox Outdoors" +msgstr "" + +#: ../src/osm.c:153 +msgid "Mapbox Specific" +msgstr "" + +#: ../src/osm.c:170 +msgid "OSM (view)" +msgstr "OSM (voir)" + +#: ../src/osm.c:174 +msgid "OSM (edit)" +msgstr "OSM (éditer)" + +#. Note the use of positional parameters +#: ../src/osm.c:179 +msgid "OSM (query)" +msgstr "" + +#: ../src/osm.c:183 +msgid "OSM (render)" +msgstr "OSM (recalculer)" + +#. Example: http://127.0.0.1:8111/load_and_zoom?left=8.19&right=8.20&top=48.605&bottom=48.590&select=node413602999 +#. JOSM or merkaartor must already be running with remote interface enabled +#: ../src/osm.c:190 +msgid "Local port 8111 (eg JOSM)" +msgstr "Port local 8111 (ex. JOSM)" + +#: ../src/osm.c:195 +msgid "Geofabrik Map Compare" +msgstr "" + +#: ../src/osm.c:203 +msgid "OpenStreetMap Notes" +msgstr "Notes Openstreetmap" + +#. Not really OSM but can't be bothered to create somewhere else to put it... +#: ../src/osm.c:221 +msgid "Wikimedia Toolserver GeoHack" +msgstr "" + +#: ../src/preferences.c:195 +msgid "Preferences" +msgstr "Préférences" + +#: ../src/toolbar.c:91 ../src/toolbar.c:92 +msgid "System Default" +msgstr "" + +#: ../src/toolbar.c:91 ../src/viktrwlayer.c:563 +msgid "Small" +msgstr "Petit" + +#: ../src/toolbar.c:91 ../src/viktrwlayer.c:564 +msgid "Medium" +msgstr "Moyen" + +#: ../src/toolbar.c:91 ../src/viktrwlayer.c:565 +msgid "Large" +msgstr "Grand" + +#: ../src/toolbar.c:92 +msgid "Icons Only" +msgstr "" + +#: ../src/toolbar.c:92 +msgid "Text Only" +msgstr "" + +#: ../src/toolbar.c:92 +msgid "Icons and Text" +msgstr "" + +#: ../src/toolbar.c:106 +msgid "Append to Menu:" +msgstr "" + +#: ../src/toolbar.c:107 +msgid "Pack the toolbar to the main menu to save vertical space" +msgstr "" + +#: ../src/toolbar.c:108 +msgid "Icon Size:" +msgstr "" + +#: ../src/toolbar.c:110 +msgid "Icon Style:" +msgstr "" + +#: ../src/toolbar.c:112 +msgid "Customize:" +msgstr "" + +#: ../src/toolbar.c:112 +msgid "Customize Buttons" +msgstr "" + +#. Preferences +#: ../src/toolbar.c:145 +msgid "Toolbar" +msgstr "" + +#: ../src/toolbar.c:312 +msgid "_Customize" +msgstr "" + +#: ../src/toolbar.c:641 +msgid "Separator" +msgstr "" + +#: ../src/toolbar.c:642 +msgid "--- Separator ---" +msgstr "" + +#: ../src/toolbar.c:1007 +msgid "Customize Toolbar" +msgstr "" + +#: ../src/toolbar.c:1028 +msgid "" +"Select items to be displayed on the toolbar. Items can be reordered by drag " +"and drop." +msgstr "" + +#: ../src/toolbar.c:1044 +msgid "Available Items" +msgstr "" + +#: ../src/toolbar.c:1065 +msgid "Displayed Items" +msgstr "" + +#: ../src/viklayer_defaults.c:232 +#, c-format +msgid "Could not open file: %s" +msgstr "Impossible d'ouvrir le fichier : %s" + +#: ../src/viklayer_defaults.c:304 +msgid "Layer Defaults" +msgstr "Paramètres par défaut du calque" + +#: ../src/uibuilder.c:196 +msgid "Take care that this password will be stored clearly in a plain file." +msgstr "Attention, ce mot de passe sera stocké en clair dans un fichier teste." + +#: ../src/uibuilder.c:628 ../src/viktrwlayer_export.c:188 +#: ../src/viktrwlayer_export.c:304 ../src/vikwindow.c:3666 +#: ../src/vikwindow.c:4408 +#, c-format +msgid "The file \"%s\" exists, do you wish to overwrite it?" +msgstr "Le fichier \"%s\" existe déjà. Voulez-vous le remplacer ?" + +#: ../src/vikaggregatelayer.c:41 +msgid "Aggregate" +msgstr "Regroupement" + +#: ../src/vikaggregatelayer.c:528 ../src/viktrwlayer.c:11700 +#, c-format +msgid "%s: Waypoint List" +msgstr "" + +#: ../src/vikaggregatelayer.c:570 +msgid "Search by Date" +msgstr "" + +#: ../src/vikaggregatelayer.c:576 +msgid "No items found with the requested date." +msgstr "" + +#: ../src/vikaggregatelayer.c:615 ../src/viktrwlayer.c:11691 +#, c-format +msgid "%s: Track and Route List" +msgstr "%s : Liste des routes et des traces" + +#: ../src/vikaggregatelayer.c:681 ../src/viktrwlayer.c:8346 +#: ../src/viktrwlayer.c:8417 ../src/viktrwlayer.c:8494 +msgid "_Visibility" +msgstr "_Visibilité" + +#: ../src/vikaggregatelayer.c:686 +msgid "_Show All" +msgstr "_Tout afficher" + +#: ../src/vikaggregatelayer.c:692 +msgid "_Hide All" +msgstr "_Cacher tout" + +#: ../src/vikaggregatelayer.c:698 ../src/viktrwlayer.c:8363 +#: ../src/viktrwlayer.c:8434 ../src/viktrwlayer.c:8511 +msgid "_Toggle" +msgstr "_Basculer" + +#: ../src/vikaggregatelayer.c:705 ../src/viktrwlayer.c:8532 +msgid "_Sort" +msgstr "_Trier" + +#: ../src/vikaggregatelayer.c:711 ../src/viktrwlayer.c:8538 +msgid "Name _Ascending" +msgstr "Nom _Croissant" + +#: ../src/vikaggregatelayer.c:717 ../src/viktrwlayer.c:8544 +msgid "Name _Descending" +msgstr "Nom _Décroissant" + +#: ../src/vikaggregatelayer.c:723 ../src/viktrwlayer.c:575 +#: ../src/viktrwlayer.c:8550 +msgid "Date Ascending" +msgstr "" + +#: ../src/vikaggregatelayer.c:729 ../src/viktrwlayer.c:576 +#: ../src/viktrwlayer.c:8556 +msgid "Date Descending" +msgstr "" + +#: ../src/vikaggregatelayer.c:735 ../src/viktrwlayer.c:8445 +#: ../src/viktrwlayer.c:8523 ../src/viktrwlayer.c:8595 +#: ../src/viktrwlayer_tracklist.c:296 +msgid "_Statistics" +msgstr "_Statistiques" + +#: ../src/vikaggregatelayer.c:740 ../src/viktrwlayer.c:4533 +msgid "Track _List..." +msgstr "_Liste des traces" + +#: ../src/vikaggregatelayer.c:746 ../src/viktrwlayer.c:4540 +msgid "_Waypoint List..." +msgstr "" + +#: ../src/vikaggregatelayer.c:753 +msgid "Searc_h" +msgstr "" + +#: ../src/vikaggregatelayer.c:759 +msgid "By _Date..." +msgstr "" + +#: ../src/vikaggregatelayer.c:762 +msgid "Find the first item with a specified date" +msgstr "" + +#: ../src/vikaggregatelayer.c:765 +msgid "Load E_xternal Layers" +msgstr "" + +#. Could have a more complicated tooltip that numbers each type of layers, +#. but for now a simple overall count +#: ../src/vikaggregatelayer.c:1011 +#, c-format +msgid "One layer" +msgid_plural "%d layers" +msgstr[0] "" +msgstr[1] "" + +#: ../src/vikaggregatelayer.c:1014 +#, fuzzy, c-format +msgid "Empty" +msgstr "_Tout vider" + +#: ../src/vikdemlayer.c:86 +msgid "SRTM Global 90m (3 arcsec)" +msgstr "" + +#: ../src/vikdemlayer.c:94 +msgid "Absolute height" +msgstr "Altitude absolue" + +#: ../src/vikdemlayer.c:95 +msgid "Height gradient" +msgstr "Gradient" + +#: ../src/vikdemlayer.c:120 +msgid "DEM Files:" +msgstr "Fichiers DEM :" + +#: ../src/vikdemlayer.c:121 +msgid "Download Source:" +msgstr "Télécharger à partir de :" + +#: ../src/vikdemlayer.c:122 +msgid "Min Elev Color:" +msgstr "Couleur Altitude minimale :" + +#: ../src/vikdemlayer.c:123 ../src/viktrwlayer_wpwin.c:207 +msgid "Type:" +msgstr "Type:" + +#: ../src/vikdemlayer.c:124 +msgid "Min Elev:" +msgstr "Altitude minimale :" + +#: ../src/vikdemlayer.c:125 +msgid "Max Elev:" +msgstr "Altitude maximale :" + +#: ../src/vikdemlayer.c:137 +msgid "_DEM Download" +msgstr "" + +#: ../src/vikdemlayer.c:137 +msgid "DEM Download" +msgstr "" + +#: ../src/vikdemlayer.c:192 +msgid "DEM" +msgstr "" + +#: ../src/vikdemlayer.c:304 +#, c-format +msgid "Number of files: %d" +msgstr "Nombre de fichiers : %d" + +#: ../src/vikdemlayer.c:446 +msgid "DEM Loading" +msgstr "Chargement DEM" + +#: ../src/vikdemlayer.c:927 +#, c-format +msgid "No SRTM data available for %f, %f" +msgstr "Aucune donnée SRTM disponible pour %f, %f" + +#: ../src/vikdemlayer.c:948 +#, c-format +msgid "DEM download failure for %f, %f" +msgstr "" + +#: ../src/vikdemlayer.c:954 +#, c-format +msgid "DEM write failure for %s" +msgstr "" + +#. Probably not over any land... +#: ../src/vikdemlayer.c:1201 +msgid "No DEM File Available" +msgstr "" + +#: ../src/vikdemlayer.c:1220 +#, c-format +msgid "" +"\n" +"Source: %s\n" +"\n" +"DEM File: %s\n" +"DEM File Timestamp: %s" +msgstr "" + +#: ../src/vikdemlayer.c:1224 +#, c-format +msgid "" +"Source: %s\n" +"\n" +"No DEM File!" +msgstr "" + +#: ../src/vikdemlayer.c:1264 +#, c-format +msgid "Downloading DEM %s" +msgstr "Téléchargement du DEM %s" + +#: ../src/vikdemlayer.c:1289 +msgid "_Show DEM File Information" +msgstr "" + +#: ../src/vikfileentry.c:72 +msgid "Browse..." +msgstr "Parcourir…" + +#: ../src/vikfileentry.c:103 +msgid "Choose file" +msgstr "Sélectionner un fichier" + +#: ../src/vikfileentry.c:120 ../src/vikwindow.c:4372 +msgid "PNG" +msgstr "PNG" + +#: ../src/vikfileentry.c:125 +msgid "TIFF" +msgstr "" + +#: ../src/vikfileentry.c:133 +msgid "MBTiles" +msgstr "" + +#: ../src/vikfileentry.c:142 +msgid "XML" +msgstr "" + +#: ../src/vikfileentry.c:149 +msgid "MML" +msgstr "" + +#: ../src/vikfileentry.c:154 +msgid "MSS" +msgstr "" + +#: ../src/vikfilelist.c:49 +msgid "Choose file(s)" +msgstr "Sélectionner un ou des fichiers" + +#: ../src/vikfilelist.c:182 +msgid "Add..." +msgstr "Ajouter…" + +#: ../src/vikfilelist.c:183 +msgid "Delete" +msgstr "Détruire" + +#: ../src/vikgeoreflayer.c:97 +msgid "_Georef Move Map" +msgstr "" + +#: ../src/vikgeoreflayer.c:97 +msgid "Georef Move Map" +msgstr "Déplacer la carte" + +#: ../src/vikgeoreflayer.c:106 +msgid "Georef Z_oom Tool" +msgstr "" + +#: ../src/vikgeoreflayer.c:106 +msgid "Georef Zoom Tool" +msgstr "Zoom" + +#: ../src/vikgeoreflayer.c:117 +msgid "GeoRef Map" +msgstr "Carte" + +#: ../src/vikgeoreflayer.c:214 +msgid "Auto Read World Files:" +msgstr "" + +#: ../src/vikgeoreflayer.c:215 +msgid "" +"Automatically attempt to read associated world file of a new image for a " +"GeoRef layer" +msgstr "" + +#: ../src/vikgeoreflayer.c:511 ../src/vikgeoreflayer.c:797 +#: ../src/vikmapslayer.c:1174 +#, c-format +msgid "Couldn't open image file: %s" +msgstr "Impossible d'ouvrir le fichier : %s" + +#: ../src/vikgeoreflayer.c:607 ../src/vikgeoreflayer.c:633 +msgid "Choose World file" +msgstr "Sélectionner un fichier World" + +#: ../src/vikgeoreflayer.c:619 +msgid "The World file you requested could not be opened for reading." +msgstr "Le fichier choisi ne peut être ouvert en lecture." + +#: ../src/vikgeoreflayer.c:621 +msgid "Unexpected end of file reading World file." +msgstr "Fin de fichier World inattendue." + +#: ../src/vikgeoreflayer.c:646 +msgid "The file you requested could not be opened for writing." +msgstr "Le fichier choisi ne peut être ouvert en écriture." + +#: ../src/vikgeoreflayer.c:782 +msgid "Lower right corner values may not be consistent with upper right values" +msgstr "" + +#: ../src/vikgeoreflayer.c:806 +#, c-format +msgid "Invalid image size: %s" +msgstr "" + +#: ../src/vikgeoreflayer.c:831 ../src/viklayer.c:561 ../src/vikwindow.c:4891 +msgid "Layer Properties" +msgstr "Propriétés du calque" + +#: ../src/vikgeoreflayer.c:852 +msgid "World File Parameters:" +msgstr "Paramètres du fichier World :" + +#: ../src/vikgeoreflayer.c:853 +msgid "Load From File..." +msgstr "Chargement depuis un fichier…" + +#: ../src/vikgeoreflayer.c:858 +msgid "Corner pixel easting:" +msgstr "Pixel référence à l'est:" + +#: ../src/vikgeoreflayer.c:860 +msgid "the UTM \"easting\" value of the upper-left corner pixel of the map" +msgstr "" + +#: ../src/vikgeoreflayer.c:862 +msgid "Corner pixel northing:" +msgstr "Pixel référence au nord:" + +#: ../src/vikgeoreflayer.c:864 +msgid "the UTM \"northing\" value of the upper-left corner pixel of the map" +msgstr "" + +#: ../src/vikgeoreflayer.c:866 +msgid "X (easting) scale (mpp): " +msgstr "Echelle X (est) (mpp) : " + +#: ../src/vikgeoreflayer.c:867 +msgid "Y (northing) scale (mpp): " +msgstr "Echelle Y (nord) (mètres par pixel): " + +#: ../src/vikgeoreflayer.c:870 +msgid "the scale of the map in the X direction (meters per pixel)" +msgstr "Echelle horizontale (X) de la carte (mètres par pixel):" + +#: ../src/vikgeoreflayer.c:872 +msgid "the scale of the map in the Y direction (meters per pixel)" +msgstr "Echelle verticale (Y) de la carte (mètres par pixel):" + +#: ../src/vikgeoreflayer.c:874 +msgid "Map Image:" +msgstr "Image carte :" + +#: ../src/vikgeoreflayer.c:919 +msgid "Upper left latitude:" +msgstr "" + +#: ../src/vikgeoreflayer.c:921 +msgid "Upper left longitude:" +msgstr "" + +#: ../src/vikgeoreflayer.c:923 +msgid "Lower right latitude:" +msgstr "" + +#: ../src/vikgeoreflayer.c:925 +msgid "Lower right longitude:" +msgstr "" + +#: ../src/vikgeoreflayer.c:937 +msgid "Calculate MPP values from coordinates" +msgstr "" + +#: ../src/vikgeoreflayer.c:938 +msgid "" +"Enter all corner coordinates before calculating the MPP values from the " +"image size" +msgstr "" + +#: ../src/vikgeoreflayer.c:948 +msgid "UTM" +msgstr "" + +#: ../src/vikgeoreflayer.c:949 +msgid "Latitude/Longitude" +msgstr "" + +#: ../src/vikgeoreflayer.c:957 ../src/vikmapniklayer.c:82 +#: ../src/vikmapslayer.c:158 +msgid "Alpha:" +msgstr "Transparence :" + +#. Now with icons +#: ../src/vikgeoreflayer.c:1062 +msgid "_Zoom to Fit Map" +msgstr "_Zoomer sur la carte" + +#: ../src/vikgeoreflayer.c:1068 +msgid "_Goto Map Center" +msgstr "_Aller au centre de la carte" + +#: ../src/vikgeoreflayer.c:1074 +msgid "_Export to World File" +msgstr "_Exporter vers fichier World" + +#: ../src/vikgoto.c:98 +msgid "No goto tool available." +msgstr "Aucun outil Goto disponible." + +#: ../src/vikgoto.c:295 +msgid "goto" +msgstr "Aller à" + +#: ../src/vikgoto.c:297 +msgid "goto provider:" +msgstr "Moteur de recherche:" + +#: ../src/vikgoto.c:312 +msgid "Enter address or place name:" +msgstr "Saisir une adresse ou un nom de lieu :" + +#: ../src/vikgoto.c:487 +msgid "Locality" +msgstr "Lieu" + +#: ../src/vikgpslayer.c:137 +msgid "Data Mode" +msgstr "Mode données" + +#: ../src/vikgpslayer.c:139 +msgid "Realtime Tracking Mode" +msgstr "Mode Localisation Temps-réel" + +#: ../src/vikgpslayer.c:176 +msgid "Keep vehicle at center" +msgstr "Garde le véhicule au centre" + +#: ../src/vikgpslayer.c:177 +msgid "Keep vehicle on screen" +msgstr "Garde le véhicule à l'écran" + +#: ../src/vikgpslayer.c:178 +msgid "Disable" +msgstr "Désactivé" + +#: ../src/vikgpslayer.c:218 +msgid "Download Tracks:" +msgstr "Télécharger des traces" + +#: ../src/vikgpslayer.c:219 +msgid "Upload Tracks:" +msgstr "Envoyer des traces" + +#: ../src/vikgpslayer.c:220 +msgid "Download Routes:" +msgstr "Télécharger des routes" + +#: ../src/vikgpslayer.c:221 +msgid "Upload Routes:" +msgstr "Envoyer des routes" + +#: ../src/vikgpslayer.c:222 +msgid "Download Waypoints:" +msgstr "Télécharger des points" + +#: ../src/vikgpslayer.c:223 +msgid "Upload Waypoints:" +msgstr "Envoyer des points" + +#: ../src/vikgpslayer.c:225 +msgid "Recording tracks" +msgstr "Enregistrement des traces" + +#: ../src/vikgpslayer.c:226 +msgid "Jump to current position on start" +msgstr "Avancer à la position courante au démarrage" + +#: ../src/vikgpslayer.c:227 +msgid "Moving Map Method:" +msgstr "Méthode de déplacement de la carte :" + +#: ../src/vikgpslayer.c:228 +msgid "Update Statusbar:" +msgstr "Mettre à jour la barre de status" + +#: ../src/vikgpslayer.c:228 +msgid "Display information in the statusbar on GPS updates" +msgstr "" + +#: ../src/vikgpslayer.c:229 +#, fuzzy +msgid "Auto Connect" +msgstr "Emplacement automatique" + +#: ../src/vikgpslayer.c:229 +msgid "Automatically connect to GPSD" +msgstr "" + +#: ../src/vikgpslayer.c:230 +msgid "Gpsd Host:" +msgstr "Hôte gpsd :" + +#: ../src/vikgpslayer.c:231 +msgid "Gpsd Port:" +msgstr "Port gpsd :" + +#: ../src/vikgpslayer.c:232 +msgid "Gpsd Retry Interval (seconds):" +msgstr "Interval de recherche de GPSD (secondes) :" + +#: ../src/vikgpslayer.c:254 +msgid "GPS" +msgstr "GPS" + +#: ../src/vikgpslayer.c:320 ../src/vikgpslayer.c:1504 +msgid "GPS Download" +msgstr "Réception depuis GPS" + +#: ../src/vikgpslayer.c:320 ../src/vikgpslayer.c:1504 ../src/viktrwlayer.c:3993 +msgid "GPS Upload" +msgstr "Émission vers GPS" + +#: ../src/vikgpslayer.c:322 +msgid "GPS Realtime Tracking" +msgstr "Suivi en temps réel des traces GPS" + +#: ../src/vikgpslayer.c:458 +msgid "Connected" +msgstr "" + +#: ../src/vikgpslayer.c:460 +msgid "Disconnected" +msgstr "" + +#: ../src/vikgpslayer.c:554 +msgid "Unknown GPS Protocol" +msgstr "Protocole GPS inconnu" + +#: ../src/vikgpslayer.c:572 +msgid "Unknown serial port device" +msgstr "Port série inconnu" + +#: ../src/vikgpslayer.c:691 +#, c-format +msgid "%s: unknown parameter" +msgstr "Paramètre inconnu : %s" + +#. Now with icons +#: ../src/vikgpslayer.c:794 +msgid "_Upload to GPS" +msgstr "_Téléverser vers le GPS" + +#: ../src/vikgpslayer.c:800 +msgid "Download from _GPS" +msgstr "Télécharger depuis le _GPS" + +#: ../src/vikgpslayer.c:821 +msgid "Empty _Realtime" +msgstr "Vider le temps-_réel" + +#: ../src/vikgpslayer.c:828 +msgid "E_mpty Upload" +msgstr "Télé_versement vide" + +#: ../src/vikgpslayer.c:834 +msgid "_Empty Download" +msgstr "Ré_ception vide" + +#: ../src/vikgpslayer.c:840 +msgid "Empty _All" +msgstr "_Tout vider" + +#: ../src/vikgpslayer.c:852 +#, c-format +msgid "Unexpected number of disconnected handlers: %d" +msgstr "" + +#: ../src/vikgpslayer.c:995 +#, c-format +msgid "Uploading %d waypoint..." +msgid_plural "Uploading %d waypoints..." +msgstr[0] "Envoie de %d point d'intérêt..." +msgstr[1] "Envoie de %d points d'intérêt..." + +#: ../src/vikgpslayer.c:1000 +#, c-format +msgid "Uploading %d trackpoint..." +msgid_plural "Uploading %d trackpoints..." +msgstr[0] "Envoi de %d point ..." +msgstr[1] "Envoi de %d points ..." + +#: ../src/vikgpslayer.c:1005 +#, c-format +msgid "Uploading %d routepoint..." +msgid_plural "Uploading %d routepoints..." +msgstr[0] "Envoi de %d point d'itinéraire ..." +msgstr[1] "Envoi de %d points d'itinéraire ..." + +#: ../src/vikgpslayer.c:1034 +#, c-format +msgid "Downloaded %d out of %d waypoint..." +msgid_plural "Downloaded %d out of %d waypoints..." +msgstr[0] "%d sur %d position téléchargée…" +msgstr[1] "%d sur %d positions téléchargées…" + +#: ../src/vikgpslayer.c:1040 +#, c-format +msgid "Downloaded %d out of %d trackpoint..." +msgid_plural "Downloaded %d out of %d trackpoints..." +msgstr[0] "%d sur %d point de trace téléchargé…" +msgstr[1] "%d sur %d points de trace téléchargés…" + +#: ../src/vikgpslayer.c:1046 +#, c-format +msgid "Downloaded %d out of %d routepoint..." +msgid_plural "Downloaded %d out of %d routepoints..." +msgstr[0] "" +msgstr[1] "" + +#: ../src/vikgpslayer.c:1056 +#, c-format +msgid "Uploaded %d out of %d waypoint..." +msgid_plural "Uploaded %d out of %d waypoints..." +msgstr[0] "%d sur %d waypoint émis…" +msgstr[1] "%d sur %d waypoints émis…" + +#: ../src/vikgpslayer.c:1062 +#, c-format +msgid "Uploaded %d out of %d trackpoint..." +msgid_plural "Uploaded %d out of %d trackpoints..." +msgstr[0] "%d sur %d point de trace envoyé …" +msgstr[1] "%d sur %d points de trace envoyés …" + +#: ../src/vikgpslayer.c:1068 +#, c-format +msgid "Uploaded %d out of %d routepoint..." +msgid_plural "Uploaded %d out of %d routepoints..." +msgstr[0] "" +msgstr[1] "" + +#: ../src/vikgpslayer.c:1079 +#, c-format +msgid "Downloaded %d waypoint" +msgid_plural "Downloaded %d waypoints" +msgstr[0] "%d waypoint téléchargé" +msgstr[1] "%d waypoints téléchargés" + +#: ../src/vikgpslayer.c:1085 +#, c-format +msgid "Downloaded %d trackpoint" +msgid_plural "Downloaded %d trackpoints" +msgstr[0] "%d point de trace téléchargé" +msgstr[1] "%d points de trace téléchargés" + +#: ../src/vikgpslayer.c:1091 +#, c-format +msgid "Downloaded %d routepoint" +msgid_plural "Downloaded %d routepoints" +msgstr[0] "" +msgstr[1] "" + +#: ../src/vikgpslayer.c:1101 +#, c-format +msgid "Uploaded %d waypoint" +msgid_plural "Uploaded %d waypoints" +msgstr[0] "%d waypoint émis" +msgstr[1] "%d waypoints émis" + +#: ../src/vikgpslayer.c:1107 +#, c-format +msgid "Uploaded %d trackpoint" +msgid_plural "Uploaded %d trackpoints" +msgstr[0] "%d point de trace envoyé" +msgstr[1] "%d points de trace envoyés" + +#: ../src/vikgpslayer.c:1113 +#, c-format +msgid "Uploaded %d routepoint" +msgid_plural "Uploaded %d routepoints" +msgstr[0] "" +msgstr[1] "" + +#: ../src/vikgpslayer.c:1363 +msgid "Error: No result." +msgstr "" + +#: ../src/vikgpslayer.c:1471 +msgid "Warning - GPS Upload items may overwrite each other" +msgstr "" + +#: ../src/vikgpslayer.c:1506 +msgid "Status: detecting gpsbabel" +msgstr "Etat : détection gpsbabel en cours" + +#: ../src/vikgpslayer.c:1533 +msgid "No GPS items selected for transfer." +msgstr "Aucun élément GPS n'est sélectionné pour le transfert." + +#: ../src/vikgpslayer.c:1546 +msgid "Could not turn off device." +msgstr "Ne pas éteindre le périphérique." + +#: ../src/vikgpslayer.c:1589 +msgid "Are you sure you want to delete GPS Upload data?" +msgstr "Etes-vous sûr de vouloir supprimer les données GPS envoyées ?" + +#: ../src/vikgpslayer.c:1602 +msgid "Are you sure you want to delete GPS Download data?" +msgstr "Etes-vous sûr de vouloir supprimer les données GPS téléchargées ?" + +#: ../src/vikgpslayer.c:1616 +msgid "Are you sure you want to delete GPS Realtime data?" +msgstr "Etes-vous sûr de vouloir supprimer les données GPS \"Realtime\" ?" + +#: ../src/vikgpslayer.c:1630 +msgid "Are you sure you want to delete All GPS data?" +msgstr "Etes-vous sûr de vouloir supprimer toutes les données GPS ?" + +#: ../src/vikgpslayer.c:2004 +#, c-format +msgid "" +"Failed to connect to gpsd at %s (port %s)\n" +"Should Viking keep trying (every %d seconds)?" +msgstr "" + +#: ../src/viklayerspanel.c:73 +msgid "C_ut" +msgstr "Co_uper" + +#: ../src/viklayerspanel.c:74 ../src/vikwindow.c:4882 +msgid "_Copy" +msgstr "Co_pier" + +#: ../src/viklayerspanel.c:75 ../src/vikwindow.c:4883 +msgid "_Paste" +msgstr "C_oller" + +#: ../src/viklayerspanel.c:76 ../src/vikwindow.c:4884 +msgid "_Delete" +msgstr "_Effacer" + +#: ../src/viklayerspanel.c:154 +msgid "New Layer" +msgstr "Nouveau calque" + +#: ../src/viklayerspanel.c:347 +msgid "Top Layer" +msgstr "Calque maître" + +#: ../src/viklayerspanel.c:363 +msgid "Add new layer" +msgstr "Ajouter un nouveau calque" + +#: ../src/viklayerspanel.c:370 ../src/vikwindow.c:4884 +msgid "Remove selected layer" +msgstr "Supprimer le calque sélectionné" + +#: ../src/viklayerspanel.c:377 +msgid "Move selected layer up" +msgstr "Déplacer vers le haut le calque sélectionné" + +#: ../src/viklayerspanel.c:384 +msgid "Move selected layer down" +msgstr "Déplacer vers le bas le calque sélectionné" + +#: ../src/viklayerspanel.c:391 ../src/vikwindow.c:4881 +msgid "Cut selected layer" +msgstr "Couper le calque sélectionné" + +#: ../src/viklayerspanel.c:398 ../src/vikwindow.c:4882 +msgid "Copy selected layer" +msgstr "Copier le calque sélectionné" + +#: ../src/viklayerspanel.c:405 ../src/vikwindow.c:4883 +msgid "" +"Paste layer into selected container layer or otherwise above selected layer" +msgstr "" +"Copiez le calque dans le calque conteneur sélectionné ou sinon sur le calque " +"sélectionné" + +#: ../src/viklayerspanel.c:502 +msgid "New name can not be blank." +msgstr "Le nouveau nom ne peut pas être vide." + +#: ../src/viklayerspanel.c:751 +msgid "Aggregate Layers have no settable properties." +msgstr "Les calques aggrégés n'ont pas de propriétés." + +#: ../src/viklayerspanel.c:798 +msgid "You cannot cut the Top Layer." +msgstr "Impossible de couper le calque maître" + +#: ../src/viklayerspanel.c:843 +#, c-format +msgid "Are you sure you want to delete %s?" +msgstr "Êtes-vous sûr de vouloir supprimer %s ?" + +#: ../src/viklayerspanel.c:863 +msgid "You cannot delete the Top Layer." +msgstr "Impossible de supprimer le calque maître" + +#: ../src/vikmapniklayer.c:78 +msgid "CSS (MML) Config File:" +msgstr "" + +#: ../src/vikmapniklayer.c:79 +msgid "CartoCSS configuration file" +msgstr "" + +#: ../src/vikmapniklayer.c:80 +msgid "XML Config File:" +msgstr "" + +#: ../src/vikmapniklayer.c:81 +msgid "Mapnik XML configuration file" +msgstr "" + +#: ../src/vikmapniklayer.c:84 +msgid "Use File Cache:" +msgstr "" + +#: ../src/vikmapniklayer.c:86 +msgid "File Cache Directory:" +msgstr "" + +#: ../src/vikmapniklayer.c:122 +msgid "_Mapnik Features" +msgstr "" + +#: ../src/vikmapniklayer.c:122 +msgid "Mapnik Features" +msgstr "" + +#: ../src/vikmapniklayer.c:140 +msgid "Mapnik Rendering" +msgstr "" + +#. Changing these values only applies before first mapnik layer is 'created' +#: ../src/vikmapniklayer.c:258 +msgid "Plugins Directory:" +msgstr "" + +#: ../src/vikmapniklayer.c:258 ../src/vikmapniklayer.c:259 +#: ../src/vikmapniklayer.c:260 ../src/vikmapniklayer.c:261 +msgid "You need to restart Viking for a change to this value to be used" +msgstr "" + +#: ../src/vikmapniklayer.c:259 +msgid "Fonts Directory:" +msgstr "" + +#: ../src/vikmapniklayer.c:260 +msgid "Recurse Fonts Directory:" +msgstr "" + +#: ../src/vikmapniklayer.c:261 +msgid "Rerender Timeout (hours):" +msgstr "" + +#. Changeable any time +#: ../src/vikmapniklayer.c:263 +msgid "CartoCSS:" +msgstr "" + +#: ../src/vikmapniklayer.c:263 +msgid "The program to convert CartoCSS files into Mapnik XML" +msgstr "" + +#: ../src/vikmapniklayer.c:506 +msgid "Running" +msgstr "" + +#: ../src/vikmapniklayer.c:525 +#, c-format +msgid "" +"Error running carto command:\n" +"%s" +msgstr "" + +#: ../src/vikmapniklayer.c:561 +msgid " completed in " +msgstr "" + +#: ../src/vikmapniklayer.c:561 +msgid "seconds" +msgstr "" + +#: ../src/vikmapniklayer.c:611 ../src/vikmapniklayer.c:979 +#, c-format +msgid "" +"Mapnik error loading configuration file:\n" +"%s" +msgstr "" + +#: ../src/vikmapniklayer.c:749 +#, c-format +msgid "Mapnik Render %d:%d:%d %s" +msgstr "" + +#: ../src/vikmapniklayer.c:840 +msgid "Mapnik Rendering must be in Mercator mode" +msgstr "" + +#: ../src/vikmapniklayer.c:997 +msgid "Mapnik Information" +msgstr "" + +#: ../src/vikmapniklayer.c:1031 +msgid "_Flush Memory Cache" +msgstr "" + +#: ../src/vikmapniklayer.c:1044 +msgid "_Run Carto Command" +msgstr "" + +#: ../src/vikmapniklayer.c:1102 ../src/vikmapslayer.c:2029 +#, c-format +msgid "Tile File Timestamp: %s" +msgstr "" + +#: ../src/vikmapniklayer.c:1105 ../src/vikmapslayer.c:2032 +msgid "Tile File Timestamp: Not Available" +msgstr "" + +#: ../src/vikmapniklayer.c:1120 +#, c-format +msgid "Rendering time %.2f seconds" +msgstr "" + +#: ../src/vikmapniklayer.c:1124 ../src/vikmapslayer.c:2042 +msgid "Tile Information" +msgstr "" + +#: ../src/vikmapniklayer.c:1145 +msgid "_Rerender Tile" +msgstr "" + +#: ../src/vikmapniklayer.c:1150 +msgid "_Info" +msgstr "" + +#. ******* MAPZOOMS ******** +#: ../src/vikmapslayer.c:96 +msgid "Use Viking Zoom Level" +msgstr "Utiliser le zoom courant" + +#: ../src/vikmapslayer.c:146 +msgid "OSM" +msgstr "" + +#. NB mode => id - But can't break file format just to rename something better +#: ../src/vikmapslayer.c:152 +msgid "Map Type:" +msgstr "Type de carte :" + +#: ../src/vikmapslayer.c:153 +msgid "Maps Directory:" +msgstr "Répertoire des cartes :" + +#: ../src/vikmapslayer.c:154 +msgid "Cache Layout:" +msgstr "" + +#: ../src/vikmapslayer.c:155 +msgid "This determines the tile storage layout on disk" +msgstr "" + +#: ../src/vikmapslayer.c:156 +msgid "Map File:" +msgstr "" + +#: ../src/vikmapslayer.c:157 +msgid "An MBTiles file. Only applies when the map type method is 'MBTiles'" +msgstr "" + +#: ../src/vikmapslayer.c:159 +msgid "Control the Alpha value for transparency effects" +msgstr "Contrôle la valeur Alpha pour les effets de transparence" + +#: ../src/vikmapslayer.c:160 +msgid "Autodownload maps:" +msgstr "Téléchargement automatique :" + +#: ../src/vikmapslayer.c:161 +msgid "Autodownload Only Gets Missing Maps:" +msgstr "" + +#: ../src/vikmapslayer.c:162 +msgid "" +"Using this option avoids attempting to update already acquired tiles. This " +"can be useful if you want to restrict the network usage, without having to " +"resort to manual control. Only applies when 'Autodownload Maps' is on." +msgstr "" +"L'usage de cette option empêche les tentatives de mise à jour des tuiles " +"déjà acquises. Cela peut être utile si vous souhaitez réduire l'utilisation " +"du réseau, sans avoir recours à un contrôle manuel. Ne s'applique que " +"lorsque l'option 'Téléchargement automatique des cartes' est active." + +#: ../src/vikmapslayer.c:163 +msgid "Zoom Level:" +msgstr "Zoom :" + +#: ../src/vikmapslayer.c:164 +msgid "" +"Determines the method of displaying map tiles for the current zoom level. " +"'Viking Zoom Level' uses the best matching level, otherwise setting a fixed " +"value will always use map tiles of the specified value regardless of the " +"actual zoom level." +msgstr "" +"Précise la méthode d'affichage des tuiles pour le niveau de zoom en cours. " +"\"Niveau de zoom Viking\" adapte au mieux le niveau de zoom des tuiles. Dans " +"le cas contraire, en fixant la valeur, les tuiles seront affichées au niveau " +"de zoom spécifié, quel que soit le niveau de zoom utilisé." + +#: ../src/vikmapslayer.c:197 +msgid "_Maps Download" +msgstr "_Téléchargement des cartes" + +#: ../src/vikmapslayer.c:197 +msgid "Maps Download" +msgstr "Téléchargement des cartes" + +#: ../src/vikmapslayer.c:213 ../src/vikutils.c:895 +msgid "Map" +msgstr "Carte" + +#: ../src/vikmapslayer.c:306 +msgid "Default map layer directory:" +msgstr "Dossier par défaut des calques de carte :" + +#: ../src/vikmapslayer.c:306 +msgid "Choose a directory to store cached Map tiles for this layer" +msgstr "" +"Choisir un dossier pour enregistrer les tuiles de carte mises en mémoire-" +"cache pour ce calque" + +#: ../src/vikmapslayer.c:436 ../src/vikmapslayer.c:633 +msgid "Unknown map type" +msgstr "Type de carte inconnu" + +#: ../src/vikmapslayer.c:664 +msgid "Unknown Map Zoom" +msgstr "Zoom de carte inconnu" + +#: ../src/vikmapslayer.c:833 +#, c-format +msgid "Failed to open MBTiles file: %s" +msgstr "" + +#: ../src/vikmapslayer.c:856 +#, c-format +msgid "" +"New map cannot be displayed in the current drawmode.\n" +"Select \"%s\" from View menu to view it." +msgstr "" +"La nouvelle carte ne peut pas être affichée avec le mode actuel.\n" +"Sélectionner \"%s\" dans le menu Vue pour voir cette carte." + +#: ../src/vikmapslayer.c:1314 +#, c-format +msgid "" +"Cowardly refusing to draw tiles or existence of tiles beyond %d zoom out " +"factor" +msgstr "Impossible d'afficher des cases en dessous du facteur de zoom %d." + +#. TODO: ?? count up the number of download errors somehow... +#: ../src/vikmapslayer.c:1667 +msgid "Failed to download tile" +msgstr "" + +#: ../src/vikmapslayer.c:1673 +msgid "Unable to save tile" +msgstr "" + +#: ../src/vikmapslayer.c:1799 +#, c-format +msgid "Redownloading up to %d %s map..." +msgid_plural "Redownloading up to %d %s maps..." +msgstr[0] "" +msgstr[1] "" + +#: ../src/vikmapslayer.c:1801 +#, c-format +msgid "Redownloading %d %s map..." +msgid_plural "Redownloading %d %s maps..." +msgstr[0] "" +msgstr[1] "" + +#: ../src/vikmapslayer.c:1805 ../src/vikmapslayer.c:1890 +#, c-format +msgid "Downloading %d %s map..." +msgid_plural "Downloading %d %s maps..." +msgstr[0] "Téléchargement de %d carte %s…" +msgstr[1] "Téléchargement de %d cartes %s…" + +#: ../src/vikmapslayer.c:1969 +msgid "YES" +msgstr "" + +#: ../src/vikmapslayer.c:1973 ../src/vikmapslayer.c:1977 +msgid "NO" +msgstr "" + +#. NB Also handles .jpg automatically due to pixbuf_new_from () support - although just print png for now. +#: ../src/vikmapslayer.c:1980 +#, c-format +msgid "Source: %s (%d%s%d%s%d.%s %s)" +msgstr "" + +#: ../src/vikmapslayer.c:1983 +msgid "Source: Not available" +msgstr "" + +#: ../src/vikmapslayer.c:2000 +msgid "Source: file://" +msgstr "" + +#: ../src/vikmapslayer.c:2012 +#, c-format +msgid "Source: %s" +msgstr "" + +#: ../src/vikmapslayer.c:2038 +#, fuzzy, c-format +msgid "Tile File: %s [Not Available]" +msgstr "Le système d'aide n'est pas disponible." + +#: ../src/vikmapslayer.c:2086 +msgid "Redownload _Bad Map(s)" +msgstr "Retélécharger les _mauvaises cartes" + +#: ../src/vikmapslayer.c:2090 +msgid "Redownload _New Map(s)" +msgstr "Retélécharger les _nouvelles cartes" + +#: ../src/vikmapslayer.c:2094 +msgid "Redownload _All Map(s)" +msgstr "Retélécharger _toutes les cartes" + +#: ../src/vikmapslayer.c:2099 +msgid "_Show Tile Information" +msgstr "_Afficher les informations de la tuile" + +#: ../src/vikmapslayer.c:2166 +#, c-format +msgid "" +"Wrong drawmode for this map.\n" +"Select \"%s\" from View menu and try again." +msgstr "" +"Mauvais mode d'affichage pour cette carte.\n" +"Sélectionner \"%s\" dans le menu Vue et re-essayer." + +#: ../src/vikmapslayer.c:2171 +msgid "Wrong zoom level for this map." +msgstr "Mauvais niveau de zoom pour cette carte." + +#: ../src/vikmapslayer.c:2334 +msgid "Zoom Start:" +msgstr "Zoom initial :" + +#: ../src/vikmapslayer.c:2341 +msgid "Zoom End:" +msgstr "Zoom final :" + +#: ../src/vikmapslayer.c:2347 +msgid "Download Maps Method:" +msgstr "" + +#. redownload method - needs to align with REDOWNLOAD* macro values +#: ../src/vikmapslayer.c:2419 +msgid "Missing" +msgstr "Manquant" + +#: ../src/vikmapslayer.c:2419 +msgid "Bad" +msgstr "Mauvais" + +#: ../src/vikmapslayer.c:2419 +msgid "New" +msgstr "Nouveau" + +#: ../src/vikmapslayer.c:2419 +msgid "Reload All" +msgstr "Tout recharger" + +#: ../src/vikmapslayer.c:2421 +msgid "Download for Zoom Levels" +msgstr "" + +#: ../src/vikmapslayer.c:2461 +#, c-format +msgid "" +"You are not allowed to download more than %d tiles in one go (requested %d)" +msgstr "" +"Vous n'êtes pas autorisé(e) à télécharger plus de %d tuiles à la fois " +"(requête %d)" + +#: ../src/vikmapslayer.c:2469 +#, c-format +msgid "Do you really want to download %d tiles?" +msgstr "Souhaitez-vous vraiment télécharger %d tuiles ?" + +#. Now with icons +#: ../src/vikmapslayer.c:2509 +msgid "Download _Missing Onscreen Maps" +msgstr "Télécharger les cartes _manquantes à l'écran" + +#: ../src/vikmapslayer.c:2516 +msgid "Download _New Onscreen Maps" +msgstr "Télécharger les _nouvelles cartes à l'écran" + +#: ../src/vikmapslayer.c:2523 +msgid "Reload _All Onscreen Maps" +msgstr "R_afraîchir toutes les cartes à l'écran" + +#: ../src/vikmapslayer.c:2529 +msgid "Download Maps in _Zoom Levels..." +msgstr "" + +#: ../src/vikmapslayer.c:2539 +#, fuzzy +msgid "_Open MBTiles Files" +msgstr "Ouvrir un fichier _récent" + +#: ../src/vikmapslayer.c:2554 +msgid "Flush Map Cache" +msgstr "" + +#: ../src/vikrouting.c:54 +msgid "Default engine:" +msgstr "Moteur par défaut :" + +#: ../src/vikrouting.c:68 +msgid "Routing" +msgstr "" + +#: ../src/viktreeview.c:347 +msgid "Layer Name" +msgstr "Nom du calque" + +#: ../src/viktreeview.c:924 +#, c-format +msgid "delete data from %s\n" +msgstr "Suppression des données de %s\n" + +#: ../src/viktrwlayer.c:427 +msgid "Create _Waypoint" +msgstr "Créer un _Waypoint" + +#: ../src/viktrwlayer.c:427 +msgid "Create Waypoint" +msgstr "Créer un waypoint" + +#: ../src/viktrwlayer.c:437 +#, fuzzy +msgid "Edit _Track" +msgstr "Éditer un point de trace" + +#: ../src/viktrwlayer.c:437 +#, fuzzy +msgid "Edit Track" +msgstr "Éditer un point de trace" + +#: ../src/viktrwlayer.c:449 +#, fuzzy +msgid "Edit _Route" +msgstr "Ajouter un itinéraire" + +#: ../src/viktrwlayer.c:449 +#, fuzzy +msgid "Edit Route" +msgstr "Ajouter un itinéraire" + +#: ../src/viktrwlayer.c:460 +msgid "Route _Finder" +msgstr "Calculateur d'_Itinéraire" + +#: ../src/viktrwlayer.c:460 +msgid "Route Finder" +msgstr "Calculateur d'Itinéraire" + +#: ../src/viktrwlayer.c:471 +#, fuzzy +msgid "Splitter" +msgstr "Découper ici" + +#: ../src/viktrwlayer.c:482 +msgid "_Edit Waypoint" +msgstr "_Éditer un Waypoint" + +#: ../src/viktrwlayer.c:482 +msgid "Edit Waypoint" +msgstr "Éditer un waypoint" + +#: ../src/viktrwlayer.c:495 +msgid "Edit Trac_kpoint" +msgstr "Éditer un _point de trace" + +#: ../src/viktrwlayer.c:495 +msgid "Edit Trackpoint" +msgstr "Éditer un point de trace" + +#. a pixbuf for this one is already made globally available +#: ../src/viktrwlayer.c:508 +msgid "Show P_icture" +msgstr "Afficher l'_Image" + +#: ../src/viktrwlayer.c:508 +msgid "Show Picture" +msgstr "Afficher une image" + +#: ../src/viktrwlayer.c:531 +msgid "Waypoint Images" +msgstr "Format des waypoints" + +#: ../src/viktrwlayer.c:531 +msgid "Tracks Advanced" +msgstr "Options de trace avancées" + +#: ../src/viktrwlayer.c:531 +msgid "Metadata" +msgstr "" + +#: ../src/viktrwlayer.c:531 +#, fuzzy +msgid "Filesystem" +msgstr "Type de fichier :" + +#: ../src/viktrwlayer.c:534 +msgid "Draw by Track" +msgstr "Afficher par trace" + +#: ../src/viktrwlayer.c:534 +msgid "Draw by Speed" +msgstr "Afficher par vitesse" + +#: ../src/viktrwlayer.c:534 +msgid "All Tracks Same Color" +msgstr "Même couleur pour toutes les Traces" + +#: ../src/viktrwlayer.c:535 +msgid "Filled Square" +msgstr "Carré plein" + +#: ../src/viktrwlayer.c:535 +msgid "Square" +msgstr "Carré" + +#: ../src/viktrwlayer.c:535 +msgid "Circle" +msgstr "Cercle" + +#: ../src/viktrwlayer.c:535 +msgid "X" +msgstr "X" + +#: ../src/viktrwlayer.c:561 +msgid "Extra Extra Small" +msgstr "Très Très Petit" + +#: ../src/viktrwlayer.c:562 +msgid "Extra Small" +msgstr "Très Petit" + +#: ../src/viktrwlayer.c:566 +msgid "Extra Large" +msgstr "Très Grand" + +#: ../src/viktrwlayer.c:567 +msgid "Extra Extra Large" +msgstr "Très Très Grand" + +#: ../src/viktrwlayer.c:573 +msgid "Name Ascending" +msgstr "" + +#: ../src/viktrwlayer.c:574 +msgid "Name Descending" +msgstr "" + +#: ../src/viktrwlayer.c:582 ../src/viktrwlayer_propwin.c:3319 +msgid "No" +msgstr "" + +#: ../src/viktrwlayer.c:583 +msgid "Yes" +msgstr "" + +#: ../src/viktrwlayer.c:584 +msgid "No write" +msgstr "" + +#: ../src/viktrwlayer.c:649 ../src/viktrwlayer.c:673 +msgid "Draw Labels" +msgstr "Dessiner les étiquettes" + +#: ../src/viktrwlayer.c:650 +msgid "Note: the individual track controls what labels may be displayed" +msgstr "" + +#: ../src/viktrwlayer.c:651 +msgid "Track Labels Font Size:" +msgstr "" + +#: ../src/viktrwlayer.c:652 +msgid "Track Drawing Mode:" +msgstr "Mode de tracé  :" + +#: ../src/viktrwlayer.c:653 +msgid "All Tracks Color:" +msgstr "Couleur de l'ensemble des traces :" + +#: ../src/viktrwlayer.c:654 +msgid "The color used when 'All Tracks Same Color' drawing mode is selected" +msgstr "La couleur utilisée dans le mode \"Toutes les Traces de Même Couleur\"" + +#: ../src/viktrwlayer.c:655 +msgid "Draw Track Lines" +msgstr "Dessiner les lignes" + +#: ../src/viktrwlayer.c:656 +msgid "Track Thickness:" +msgstr "Épaisseur de la trace :" + +#: ../src/viktrwlayer.c:657 +msgid "Draw Track Direction" +msgstr "" + +#: ../src/viktrwlayer.c:658 +msgid "Direction Size:" +msgstr "" + +#: ../src/viktrwlayer.c:659 +msgid "Draw Trackpoints" +msgstr "Dessiner les points" + +#: ../src/viktrwlayer.c:660 +msgid "Trackpoint Size:" +msgstr "Taille des points :" + +#: ../src/viktrwlayer.c:661 +msgid "Draw Elevation" +msgstr "Représenter l'altitude" + +#: ../src/viktrwlayer.c:662 +msgid "Draw Elevation Height %:" +msgstr "%age de hauteur pour représenter l'altitude" + +#: ../src/viktrwlayer.c:663 +msgid "Draw Stops" +msgstr "Représenter les arrêts" + +#: ../src/viktrwlayer.c:664 +msgid "" +"Whether to draw a marker when trackpoints are at the same position but over " +"the minimum stop length apart in time" +msgstr "" + +#: ../src/viktrwlayer.c:665 +msgid "Min Stop Length (seconds):" +msgstr "Temps minimum d'arrêt (secondes) :" + +#: ../src/viktrwlayer.c:667 +msgid "Track BG Thickness:" +msgstr "Épaisseur de la ligne en arrière-plan :" + +#: ../src/viktrwlayer.c:668 +msgid "Track Background Color" +msgstr "Couleur d'arrière-plan de la ligne" + +#: ../src/viktrwlayer.c:669 +msgid "Draw by Speed Factor (%):" +msgstr "" + +#: ../src/viktrwlayer.c:670 +msgid "" +"The percentage factor away from the average speed determining the color used" +msgstr "" + +#: ../src/viktrwlayer.c:671 +msgid "Track Sort Order:" +msgstr "Ordre de tri des traces" + +#: ../src/viktrwlayer.c:674 +msgid "Waypoint Font Size:" +msgstr "Taille de la police des waypoints :" + +#: ../src/viktrwlayer.c:675 +msgid "Waypoint Color:" +msgstr "Couleur :" + +#: ../src/viktrwlayer.c:676 +msgid "Waypoint Text:" +msgstr "Texte :" + +#: ../src/viktrwlayer.c:677 +msgid "Background:" +msgstr "Arrière-plan :" + +#: ../src/viktrwlayer.c:678 +msgid "Fake BG Color Translucency:" +msgstr "Transparence de la couleur d'arrière-plan :" + +#: ../src/viktrwlayer.c:679 +msgid "Waypoint marker:" +msgstr "Marqueur :" + +#: ../src/viktrwlayer.c:680 +msgid "Waypoint size:" +msgstr "Taille :" + +#: ../src/viktrwlayer.c:681 +msgid "Draw Waypoint Symbols:" +msgstr "Afficher les symboles :" + +#: ../src/viktrwlayer.c:682 +msgid "Waypoint Sort Order:" +msgstr "" + +#: ../src/viktrwlayer.c:684 +msgid "Draw Waypoint Images" +msgstr "Afficher les images :" + +#: ../src/viktrwlayer.c:685 +msgid "Image Size (pixels):" +msgstr "Taille de l'image (pixels) :" + +#: ../src/viktrwlayer.c:686 +msgid "Image Alpha:" +msgstr "Transparence :" + +#: ../src/viktrwlayer.c:687 +msgid "Image Memory Cache Size:" +msgstr "Taille du cache des images :" + +#: ../src/viktrwlayer.c:690 +msgid "Author" +msgstr "" + +#: ../src/viktrwlayer.c:691 +msgid "Creation Time" +msgstr "" + +#: ../src/viktrwlayer.c:692 +msgid "Keywords" +msgstr "" + +#: ../src/viktrwlayer.c:693 +msgid "External layer:" +msgstr "" + +#: ../src/viktrwlayer.c:693 +msgid "" +"Layer data stored in the Viking file, in an external file, or in an external " +"file but changes are not written to the file (file only loaded at startup)" +msgstr "" + +#: ../src/viktrwlayer.c:694 +msgid "Save layer as:" +msgstr "" + +#: ../src/viktrwlayer.c:694 +msgid "Specify where layer should be saved. Overwrites file if it exists." +msgstr "" + +#: ../src/viktrwlayer.c:798 +msgid "TrackWaypoint" +msgstr "Point de cheminement de la trace" + +#: ../src/viktrwlayer.c:1999 ../src/viktrwlayer_propwin.c:1469 +#: ../src/viktrwlayer_propwin.c:1471 ../src/vikutils.c:299 +#: ../src/vikutils.c:326 +msgid "miles" +msgstr "miles" + +#: ../src/viktrwlayer.c:2002 ../src/viktrwlayer_propwin.c:1475 +#: ../src/viktrwlayer_propwin.c:1477 ../src/vikutils.c:303 +#: ../src/vikutils.c:330 +msgid "NM" +msgstr "" + +#. VIK_UNITS_DISTANCE_KILOMETRES: +#: ../src/viktrwlayer.c:2006 ../src/viktrwlayer_propwin.c:1482 +#: ../src/viktrwlayer_propwin.c:1484 ../src/vikutils.c:308 +#: ../src/vikutils.c:335 +msgid "km" +msgstr "km" + +#: ../src/viktrwlayer.c:2121 +msgid "start/end" +msgstr "départ/arrivée" + +#: ../src/viktrwlayer.c:2133 +msgid "start" +msgstr "départ" + +#: ../src/viktrwlayer.c:2142 +msgid "end" +msgstr "arrivée" + +#: ../src/viktrwlayer.c:3103 +#, c-format +msgid " in %d:%02d hrs:mins" +msgstr " en %d:%02d h:min" + +#: ../src/viktrwlayer.c:3107 +#, c-format +msgid "" +"\n" +"%sTotal Length %.1f %s%s" +msgstr "" +"\n" +"%sDistance totale %.1f %s%s" + +#: ../src/viktrwlayer.c:3131 +#, c-format +msgid "" +"\n" +"Total route length %.1f %s" +msgstr "" + +#: ../src/viktrwlayer.c:3136 +#, c-format +msgid "Tracks: %d - Waypoints: %d - Routes: %d%s%s" +msgstr "" + +#: ../src/viktrwlayer.c:3155 +#, c-format +msgid "Tracks: %d" +msgstr "Traces : %d" + +#: ../src/viktrwlayer.c:3165 +#, c-format +msgid "Routes: %d" +msgstr "Itinéraires : %d" + +#: ../src/viktrwlayer.c:3195 +#, c-format +msgid "- %d:%02d hrs:mins" +msgstr "- %d:%02d hrs:mins" + +#: ../src/viktrwlayer.c:3202 +#, c-format +msgid "%s%.1f km %s" +msgstr "%s%.1f km %s" + +#: ../src/viktrwlayer.c:3205 +#, c-format +msgid "%s%.1f miles %s" +msgstr "%s%.1f miles %s" + +#: ../src/viktrwlayer.c:3208 +#, c-format +msgid "%s%.1f NM %s" +msgstr "" + +#: ../src/viktrwlayer.c:3222 +#, c-format +msgid "Waypoints: %d" +msgstr "Waypoints : %d" + +#: ../src/viktrwlayer.c:3279 +#, c-format +msgid "Wpt: Alt %dft" +msgstr "" + +#. VIK_UNITS_HEIGHT_METRES: +#: ../src/viktrwlayer.c:3283 +#, c-format +msgid "Wpt: Alt %dm" +msgstr "" + +#. Add comment if available +#: ../src/viktrwlayer.c:3298 +#, c-format +msgid "%s | %s %s | Comment: %s" +msgstr "%s | %s %s | Commentaires : %s" + +#: ../src/viktrwlayer.c:3300 +#, c-format +msgid "%s | %s %s" +msgstr "%s | %s %s" + +#: ../src/viktrwlayer.c:3562 ../src/viktrwlayer.c:3591 +msgid "This layer has no waypoints or trackpoints." +msgstr "Ce calque n'a pas de waypoints ou de traces." + +#: ../src/viktrwlayer.c:3598 ../src/viktrwlayer.c:3607 +#: ../src/viktrwlayer.c:3616 ../src/viktrwlayer.c:3625 +#: ../src/viktrwlayer.c:3634 ../src/viktrwlayer.c:3642 +msgid "Export Layer" +msgstr "Exporter le calque" + +#: ../src/viktrwlayer.c:3671 +msgid "Export Route as GPX" +msgstr "" + +#: ../src/viktrwlayer.c:3673 +msgid "Export Track as GPX" +msgstr "Exporter la trace vers un fichier GPX" + +#: ../src/viktrwlayer.c:3693 +msgid "Find" +msgstr "Rechercher" + +#: ../src/viktrwlayer.c:3703 +msgid "Waypoint Name:" +msgstr "Nom du waypoint :" + +#: ../src/viktrwlayer.c:3720 +msgid "Waypoint not found in this layer." +msgstr "Aucun waypoint trouvé sur ce calque." + +#: ../src/viktrwlayer.c:3989 +msgid "Can not upload invisible track." +msgstr "L'envoi d'une trace invisible est impossible." + +#: ../src/viktrwlayer.c:4082 ../src/viktrwlayer.c:10512 +msgid "Track" +msgstr "Trace" + +#: ../src/viktrwlayer.c:4107 ../src/viktrwlayer.c:10599 +msgid "Route" +msgstr "Itinéraire" + +#: ../src/viktrwlayer.c:4194 +msgid "Externa_l" +msgstr "" + +#: ../src/viktrwlayer.c:4216 ../src/viktrwlayer.c:8456 +#: ../src/viktrwlayer.c:8574 +msgid "_Finish Route" +msgstr "_Terminer Itinéraire" + +#: ../src/viktrwlayer.c:4218 ../src/viktrwlayer.c:8380 +#: ../src/viktrwlayer.c:8572 +msgid "_Finish Track" +msgstr "_Terminer la trace" + +#. Now with icons +#: ../src/viktrwlayer.c:4230 +msgid "_View Layer" +msgstr "_Afficher Couche" + +#: ../src/viktrwlayer.c:4237 +msgid "V_iew" +msgstr "A_fficher" + +#: ../src/viktrwlayer.c:4243 +msgid "View All _Tracks" +msgstr "Afficher toutes les _traces" + +#: ../src/viktrwlayer.c:4248 +msgid "View All _Routes" +msgstr "Voir tous les _Itinéraires" + +#: ../src/viktrwlayer.c:4253 +msgid "View All _Waypoints" +msgstr "Afficher tous les _Waypoints" + +#: ../src/viktrwlayer.c:4258 +msgid "_Goto Center of Layer" +msgstr "_Aller au centre du calque" + +#: ../src/viktrwlayer.c:4264 ../src/viktrwlayer.c:8321 +msgid "Goto _Waypoint..." +msgstr "Aller au _point de cheminement..." + +#: ../src/viktrwlayer.c:4270 +msgid "_Export Layer" +msgstr "_Exporter le calque" + +#: ../src/viktrwlayer.c:4276 +msgid "Export as GPS_Point..." +msgstr "Experter en _point GPS..." + +#: ../src/viktrwlayer.c:4281 +msgid "Export as GPS_Mapper..." +msgstr "" + +#: ../src/viktrwlayer.c:4286 +msgid "Export as _GPX..." +msgstr "Exporter en _GPX ..." + +#: ../src/viktrwlayer.c:4292 +msgid "Export as _KML..." +msgstr "Exporter en _KML ..." + +#: ../src/viktrwlayer.c:4299 +msgid "Export as GEO_JSON..." +msgstr "" + +#: ../src/viktrwlayer.c:4306 +msgid "Export via GPSbabel..." +msgstr "" + +#: ../src/viktrwlayer.c:4312 +#, c-format +msgid "Open with External Program_1: %s" +msgstr "" + +#: ../src/viktrwlayer.c:4319 +#, c-format +msgid "Open with External Program_2: %s" +msgstr "" + +#: ../src/viktrwlayer.c:4327 ../src/vikwindow.c:4825 +msgid "_New" +msgstr "_Nouveau" + +#: ../src/viktrwlayer.c:4333 +msgid "New _Waypoint..." +msgstr "Nouveau _point de cheminement..." + +#: ../src/viktrwlayer.c:4339 +msgid "New _Track" +msgstr "Nouvelle _Trace" + +#: ../src/viktrwlayer.c:4347 +msgid "New _Route" +msgstr "Nouvel Itinéraire" + +#: ../src/viktrwlayer.c:4356 ../src/viktrwlayer.c:8232 +#: ../src/viktrwlayer.c:9003 +msgid "Geotag _Images..." +msgstr "" + +#: ../src/viktrwlayer.c:4363 +msgid "_Acquire" +msgstr "_Acquisition" + +#: ../src/viktrwlayer.c:4369 ../src/vikwindow.c:4904 +msgid "From _GPS..." +msgstr "À partir d'un _GPS..." + +#. FIXME: only add menu when at least a routing engine has support for Directions +#: ../src/viktrwlayer.c:4375 +msgid "From _Directions..." +msgstr "" + +#: ../src/viktrwlayer.c:4381 +msgid "From _OSM Traces..." +msgstr "Depuis Traces _OSM..." + +#: ../src/viktrwlayer.c:4386 +msgid "From _My OSM Traces..." +msgstr "Depuis _Mes Traces OSM..." + +#: ../src/viktrwlayer.c:4392 ../src/vikwindow.c:4844 +msgid "From _URL..." +msgstr "" + +#: ../src/viktrwlayer.c:4399 ../src/vikwindow.c:4846 +msgid "From _Wikipedia Waypoints" +msgstr "Depuis les Points d'Intérêt _Wikipedia" + +#: ../src/viktrwlayer.c:4405 +msgid "Within _Layer Bounds" +msgstr "A _l'intérieur du calque courant" + +#: ../src/viktrwlayer.c:4411 +msgid "Within _Current View" +msgstr "A l'intérieur de la vue _courrante" + +#: ../src/viktrwlayer.c:4419 +msgid "From Geo_caching..." +msgstr "Depuis Geo_caching..." + +#: ../src/viktrwlayer.c:4426 ../src/vikwindow.c:4842 +msgid "From Geotagged _Images..." +msgstr "Depuis _Images Géoréférencées..." + +#: ../src/viktrwlayer.c:4433 +msgid "From _File..." +msgstr "Depuis _Fichier..." + +#: ../src/viktrwlayer.c:4436 ../src/vikwindow.c:4905 +msgid "Import File With GPS_Babel..." +msgstr "Importer un fichier avec GPS_Babel ..." + +#: ../src/viktrwlayer.c:4443 ../src/viktrwlayer.c:8905 +msgid "_Upload" +msgstr "_Envoyer" + +#: ../src/viktrwlayer.c:4449 +msgid "Upload to _GPS..." +msgstr "Envoyer au _GPS..." + +#: ../src/viktrwlayer.c:4456 ../src/viktrwlayer.c:8973 +msgid "Upload to _OSM..." +msgstr "Envoyer à _OSM..." + +#: ../src/viktrwlayer.c:4464 +msgid "De_lete" +msgstr "_Supprimer" + +#: ../src/viktrwlayer.c:4470 +msgid "Delete All _Tracks" +msgstr "Supprimer toutes les _Traces" + +#: ../src/viktrwlayer.c:4477 +msgid "Delete Tracks _From Selection..." +msgstr "Supprimer les Traces _de la Sélection" + +#: ../src/viktrwlayer.c:4484 ../src/viktrwlayer.c:8481 +msgid "Delete _All Routes" +msgstr "Supprimer _tous les itinéraires" + +#: ../src/viktrwlayer.c:4491 ../src/viktrwlayer.c:8487 +msgid "_Delete Routes From Selection..." +msgstr "_Supprimer tous les itinéraires depuis la sélection" + +#: ../src/viktrwlayer.c:4498 +msgid "Delete All _Waypoints" +msgstr "Supprimer tous les _Waypoints" + +#: ../src/viktrwlayer.c:4505 +msgid "Delete Waypoints From _Selection..." +msgstr "Supprimer les Waypoints de la _Sélection" + +#: ../src/viktrwlayer.c:4512 ../src/viktrwlayer.c:8339 +#, fuzzy +msgid "Delete Duplicate Waypoints" +msgstr "Supprimer les waypoints dupliqués" + +#: ../src/viktrwlayer.c:5198 +#, c-format +msgid "Are you sure you want to delete all tracks in %s?" +msgstr "Êtes-vous certain de vouloir supprimer toutes les traces de %s ?" + +#: ../src/viktrwlayer.c:5211 +#, c-format +msgid "Are you sure you want to delete all routes in %s?" +msgstr "Êtes-vous certain de vouloir supprimer tous les itinéraires dans %s ?" + +#: ../src/viktrwlayer.c:5221 +#, c-format +msgid "Are you sure you want to delete all waypoints in %s?" +msgstr "Êtes-vous certain de vouloir supprimer tous les waypoints de %s ?" + +#: ../src/viktrwlayer.c:5238 +#, c-format +msgid "Are you sure you want to delete the waypoint \"%s\"?" +msgstr "" +"Êtes-vous certain de vouloir supprimer le point de cheminement « %s » ?" + +#: ../src/viktrwlayer.c:5254 +#, c-format +msgid "Are you sure you want to delete the track \"%s\"?" +msgstr "Êtes-vous certain de vouloir supprimer la trace \"%s\" ?" + +#: ../src/viktrwlayer.c:5271 +#, c-format +msgid "Are you sure you want to delete the route \"%s\"?" +msgstr "Êtes-vous certain de vouloir supprimer l'itinéraire %s ?" + +#: ../src/viktrwlayer.c:5527 ../src/viktrwlayer.c:6373 +msgid "" +"Converting a track to a route removes extra track data such as segments, " +"timestamps, etc...\n" +"Do you want to continue?" +msgstr "" +"La conversion d'une trace en itinéraire efface les données spécifiques aux " +"traces telles que les segments, horodatage, etc...\n" +"Souhaitez-vous continuer ?" + +#: ../src/viktrwlayer.c:5631 +msgid "No DEM layers available, thus no DEM values can be applied." +msgstr "" + +#: ../src/viktrwlayer.c:5651 ../src/viktrwlayer.c:5692 +#, c-format +msgid "%ld point adjusted" +msgid_plural "%ld points adjusted" +msgstr[0] "%ld point ajusté" +msgstr[1] "%ld points ajustés" + +#: ../src/viktrwlayer.c:5736 +#, c-format +msgid "%ld waypoint changed" +msgid_plural "%ld waypoints changed" +msgstr[0] "%ld point de cheminement modifié" +msgstr[1] "%ld points de cheminement modifiés" + +#: ../src/viktrwlayer.c:5917 +#, c-format +msgid "" +"Refining a track with many points (%d) is unlikely to yield sensible " +"results. Do you want to Continue?" +msgstr "" +"Affiner une trace avec de nombreux points (%d) a peu de chances d'aboutir à " +"un résultat intéressant. Souhaitez-vous continuer ?" + +#. Select engine from dialog +#: ../src/viktrwlayer.c:5925 +msgid "Refine Route with Routing Engine..." +msgstr "Affiner l'itinéraire avec ..." + +#: ../src/viktrwlayer.c:5933 +msgid "Select routing engine" +msgstr "" + +#: ../src/viktrwlayer.c:6158 +msgid "Failed. No other tracks with timestamps in this layer found" +msgstr "" +"Échec. Aucune autre trace avec horodatage n'a été trouvée dans ce calque" + +#: ../src/viktrwlayer.c:6160 +msgid "Failed. No other tracks without timestamps in this layer found" +msgstr "" +"Échec. Aucune autre trace sans horodatage n'a été trouvée dans ce calque" + +#: ../src/viktrwlayer.c:6179 +msgid "Merge with..." +msgstr "Fusionner avec..." + +#: ../src/viktrwlayer.c:6180 +msgid "Select route to merge with" +msgstr "Sélectionner un itinéraire avec lequel fusionner" + +#: ../src/viktrwlayer.c:6180 +msgid "Select track to merge with" +msgstr "Sélectionner la trace avec laquelle fusionner." + +#: ../src/viktrwlayer.c:6264 ../src/viktrwlayer.c:6346 +msgid "Append Route" +msgstr "Joindre un itinéraire" + +#: ../src/viktrwlayer.c:6264 ../src/viktrwlayer.c:6346 +msgid "Append Track" +msgstr "" + +#: ../src/viktrwlayer.c:6265 +msgid "Select the route to append after the current route" +msgstr "Sélectionnez un itinéraire à joindre à l'itinéraire en cours" + +#: ../src/viktrwlayer.c:6266 +msgid "Select the track to append after the current track" +msgstr "Sélectionnez la trace à joindre à la trace en cours" + +#: ../src/viktrwlayer.c:6347 +msgid "Select the track to append after the current route" +msgstr "Sélectionnez la trace à joindre à l'itinéraire en cours" + +#: ../src/viktrwlayer.c:6348 +msgid "Select the route to append after the current track" +msgstr "Sélectionnez l'itinéraire à joindre à la trace en cours" + +#: ../src/viktrwlayer.c:6414 +#, c-format +msgid "%d segment merged" +msgid_plural "%d segments merged" +msgstr[0] "%d segment fusionné" +msgstr[1] "%d segments fusionnés" + +#: ../src/viktrwlayer.c:6430 +msgid "Failed. This track does not have timestamp" +msgstr "Echec. Cette trace n'a pas d'information de temps." + +#: ../src/viktrwlayer.c:6442 +msgid "Failed. No other track in this layer has timestamp" +msgstr "Echec. Aucune autre trace dans ce calque n'a d'information temporelle." + +#: ../src/viktrwlayer.c:6449 +msgid "Merge Threshold..." +msgstr "Distance de fusionnement…" + +#: ../src/viktrwlayer.c:6450 +msgid "Merge when time between tracks less than:" +msgstr "Fusionner quand le temps entre les points est moins que :" + +#: ../src/viktrwlayer.c:6580 +msgid "Split Threshold..." +msgstr "Distance de séparation…" + +#: ../src/viktrwlayer.c:6581 +msgid "Split when time between trackpoints exceeds:" +msgstr "Découper quand le temps entre les points dépasse :" + +#: ../src/viktrwlayer.c:6598 +#, c-format +msgid "" +"Can not split track due to trackpoints not ordered in time - such as at %s.\n" +"\n" +"Goto this trackpoint?" +msgstr "" + +#: ../src/viktrwlayer.c:6668 +msgid "Split Every Nth Point" +msgstr "" + +#: ../src/viktrwlayer.c:6669 +msgid "Split on every Nth point:" +msgstr "" + +#: ../src/viktrwlayer.c:6779 +msgid "Can not split track as it has no segments" +msgstr "Impossible de découper la trace car elle n'a aucun segment" + +#: ../src/viktrwlayer.c:6861 ../src/viktrwlayer.c:6891 +#, c-format +msgid "Deleted %ld point" +msgid_plural "Deleted %ld points" +msgstr[0] "%ld point supprimé" +msgstr[1] "%ld points supprimés" + +#: ../src/viktrwlayer.c:6966 ../src/viktrwlayer.c:10989 +#: ../src/viktrwlayer_waypointlist.c:214 +#, c-format +msgid "Could not launch %s to open file." +msgstr "" + +#: ../src/viktrwlayer.c:6992 ../src/viktrwlayer.c:7113 +msgid "This track has no date information." +msgstr "" + +#: ../src/viktrwlayer.c:7006 ../src/viktrwlayer.c:7136 +msgid "This waypoint has no date information." +msgstr "" + +#: ../src/viktrwlayer.c:7030 +#, c-format +msgid "Could not launch %s" +msgstr "" + +#: ../src/viktrwlayer.c:7269 +msgid "Internal Error in vik_trw_layer_uniquify_tracks" +msgstr "Erreur interne dans \"vik_trw_layer_uniquify_tracks\"" + +#: ../src/viktrwlayer.c:7374 ../src/viktrwlayer.c:7424 +#: ../src/viktrwlayer.c:7587 +msgid "" +"Multiple entries with the same name exist. This method only works with " +"unique names. Force unique names now?" +msgstr "" + +#: ../src/viktrwlayer.c:7385 +msgid "No tracks found" +msgstr "Aucune trace n'a été trouvée" + +#: ../src/viktrwlayer.c:7393 ../src/viktrwlayer.c:7443 +#: ../src/viktrwlayer.c:7607 +msgid "Delete Selection" +msgstr "Supprimer la sélection" + +#: ../src/viktrwlayer.c:7394 +msgid "Select tracks to delete" +msgstr "Sélectionnez la trace à supprimer" + +#: ../src/viktrwlayer.c:7435 +msgid "No routes found" +msgstr "Aucun itinéraire trouvé" + +#: ../src/viktrwlayer.c:7444 +msgid "Select routes to delete" +msgstr "Sélectionner les itinéraires à supprimer" + +#: ../src/viktrwlayer.c:7550 +msgid "Internal Error in vik_trw_layer_uniquify_waypoints" +msgstr "" + +#: ../src/viktrwlayer.c:7597 +msgid "No waypoints found" +msgstr "Aucun point de cheminement trouvé" + +#: ../src/viktrwlayer.c:7608 +msgid "Select waypoints to delete" +msgstr "Sélectionnez le point de cheminement à supprimer" + +#: ../src/viktrwlayer.c:7691 +#, fuzzy, c-format +msgid "%ld waypoint deleted" +msgid_plural "%ld waypoints deleted" +msgstr[0] "%ld point de cheminement modifié" +msgstr[1] "%ld points de cheminement modifiés" + +#: ../src/viktrwlayer.c:7697 +#, fuzzy +msgid "No duplicates found" +msgstr "Aucun itinéraire trouvé" + +#: ../src/viktrwlayer.c:8028 +#, c-format +msgid "" +"A waypoint with the name \"%s\" already exists. Really rename to the same " +"name?" +msgstr "" +"Un point de cheminement nommé « %s » existe déjà. Souhaitez-vous conserver " +"le même nom ?" + +#: ../src/viktrwlayer.c:8058 +#, c-format +msgid "" +"A track with the name \"%s\" already exists. Really rename to the same name?" +msgstr "" +"Il existe déjà une trace avec le nom \"%s\". Souhaitez-vous vraiment " +"utiliser le même nom ?" + +#: ../src/viktrwlayer.c:8095 +#, c-format +msgid "" +"A route with the name \"%s\" already exists. Really rename to the same name?" +msgstr "" +"Un itinéraire avec le nom \"%s\" existe déjà. Faut-il réellement renommer " +"avec le même nom ?" + +#: ../src/viktrwlayer.c:8215 ../src/viktrwlayer.c:8602 +msgid "_Goto" +msgstr "_Aller à" + +#: ../src/viktrwlayer.c:8226 +msgid "_Visit Geocache Webpage" +msgstr "_Ouvrir la page web de Geocache" + +#: ../src/viktrwlayer.c:8235 +msgid "Geotag multiple images against this waypoint" +msgstr "" + +#: ../src/viktrwlayer.c:8245 ../src/viktrwlayer_waypointlist.c:352 +msgid "_Show Picture..." +msgstr "_Afficher la photo..." + +#: ../src/viktrwlayer.c:8253 +msgid "Update Geotag on _Image" +msgstr "" + +#: ../src/viktrwlayer.c:8259 +msgid "_Update" +msgstr "Mettre à jo_ur" + +#: ../src/viktrwlayer.c:8264 +msgid "Update and _Keep File Timestamp" +msgstr "" + +#: ../src/viktrwlayer.c:8276 +msgid "Visit _Webpage" +msgstr "" + +#: ../src/viktrwlayer.c:8306 +msgid "_New Waypoint..." +msgstr "Nouveau Waypoint" + +#: ../src/viktrwlayer.c:8315 +msgid "_View All Waypoints" +msgstr "_Afficher tous les points de cheminement" + +#: ../src/viktrwlayer.c:8327 +msgid "Delete _All Waypoints" +msgstr "Supprimer tous les points de cheminement" + +#: ../src/viktrwlayer.c:8333 +msgid "_Delete Waypoints From Selection..." +msgstr "Supprimer les points de cheminement de la sélection" + +#: ../src/viktrwlayer.c:8351 +msgid "_Show All Waypoints" +msgstr "_Afficher tous les points de cheminement" + +#: ../src/viktrwlayer.c:8357 +msgid "_Hide All Waypoints" +msgstr "_Masquer tous les points de cheminement" + +#: ../src/viktrwlayer.c:8369 +msgid "_List Waypoints..." +msgstr "" + +#: ../src/viktrwlayer.c:8390 +msgid "_View All Tracks" +msgstr "_Voir toutes les traces" + +#: ../src/viktrwlayer.c:8396 +msgid "_New Track" +msgstr "_Nouvelle Trace" + +#: ../src/viktrwlayer.c:8404 +msgid "Delete _All Tracks" +msgstr "Supprimer toutes les tr_aces" + +#: ../src/viktrwlayer.c:8410 +msgid "_Delete Tracks From Selection..." +msgstr "Supprimer les traces _de la sélection ..." + +#: ../src/viktrwlayer.c:8422 +msgid "_Show All Tracks" +msgstr "_Afficher toutes les traces" + +#: ../src/viktrwlayer.c:8428 +msgid "_Hide All Tracks" +msgstr "_Masquer toutes les traces" + +#: ../src/viktrwlayer.c:8439 +msgid "_List Tracks..." +msgstr "_Liste des traces ..." + +#: ../src/viktrwlayer.c:8467 +msgid "_View All Routes" +msgstr "_Voir tous les itinéraires" + +#: ../src/viktrwlayer.c:8473 +msgid "_New Route" +msgstr "_Nouvel Itinéraire" + +#: ../src/viktrwlayer.c:8499 +msgid "_Show All Routes" +msgstr "Afficher tou_s les itinéraires" + +#: ../src/viktrwlayer.c:8505 +msgid "_Hide All Routes" +msgstr "_Masquer tous les itinéraires" + +#: ../src/viktrwlayer.c:8516 +msgid "_List Routes..." +msgstr "_Listes des itinéraires ..." + +#: ../src/viktrwlayer.c:8587 +msgid "_View Track" +msgstr "_Voir Trace" + +#: ../src/viktrwlayer.c:8589 +msgid "_View Route" +msgstr "_Voir l'Itinéraire" + +#: ../src/viktrwlayer.c:8608 +msgid "_Startpoint" +msgstr "_Premier point" + +#: ../src/viktrwlayer.c:8614 +msgid "\"_Center\"" +msgstr "_Centre" + +#: ../src/viktrwlayer.c:8620 +msgid "_Endpoint" +msgstr "_Dernier point" + +#: ../src/viktrwlayer.c:8626 +msgid "_Highest Altitude" +msgstr "Plus _Haute Altitude" + +#: ../src/viktrwlayer.c:8632 +msgid "_Lowest Altitude" +msgstr "P_lus Basse Altitude" + +#: ../src/viktrwlayer.c:8640 +msgid "_Maximum Speed" +msgstr "Vitesse _Maximale" + +#: ../src/viktrwlayer.c:8646 +#, fuzzy +msgid "_Date" +msgstr "Date" + +#: ../src/viktrwlayer.c:8655 +msgid "Co_mbine" +msgstr "Co_mbiner" + +#: ../src/viktrwlayer.c:8663 +msgid "_Merge By Time..." +msgstr "Fusionner par te_mps..." + +#: ../src/viktrwlayer.c:8668 +msgid "Merge _Segments" +msgstr "Fusionner les _segments" + +#: ../src/viktrwlayer.c:8675 +msgid "Merge _With Other Tracks..." +msgstr "Fusionner _avec d'autre traces..." + +#: ../src/viktrwlayer.c:8682 +msgid "_Append Track..." +msgstr "_Joindre une tr_ace..." + +#: ../src/viktrwlayer.c:8684 +msgid "_Append Route..." +msgstr "Joindre un itinér_aire..." + +#: ../src/viktrwlayer.c:8690 +msgid "Append _Route..." +msgstr "Joind_re un itinéraire ..." + +#: ../src/viktrwlayer.c:8692 +msgid "Append _Track..." +msgstr "Joindre une _trace ..." + +#: ../src/viktrwlayer.c:8699 +msgid "_Split" +msgstr "" + +#: ../src/viktrwlayer.c:8707 +msgid "_Split By Time..." +msgstr "" + +#. ATM always enable this entry - don't want to have to analyse the track before displaying the menu - to keep the menu speedy +#: ../src/viktrwlayer.c:8713 +msgid "Split Se_gments" +msgstr "" + +#: ../src/viktrwlayer.c:8719 +msgid "Split By _Number of Points..." +msgstr "" + +#: ../src/viktrwlayer.c:8724 +msgid "Split at _Trackpoint" +msgstr "" + +#: ../src/viktrwlayer.c:8732 +msgid "_Insert Points" +msgstr "_Insérer des points" + +#: ../src/viktrwlayer.c:8738 +msgid "Insert Point _Before Selected Point" +msgstr "Insérer un point avant le point sélectionné" + +#: ../src/viktrwlayer.c:8745 +msgid "Insert Point _After Selected Point" +msgstr "Insérer un point _après le point sélectionné" + +#: ../src/viktrwlayer.c:8754 +msgid "Delete Poi_nts" +msgstr "Supprimer les poi_nts" + +#: ../src/viktrwlayer.c:8760 +msgid "Delete _Selected Point" +msgstr "Supprimer les points _sélectionnés" + +#: ../src/viktrwlayer.c:8768 +msgid "Delete Points With The Same _Position" +msgstr "Supprimer les points avec la même _position" + +#: ../src/viktrwlayer.c:8773 +msgid "Delete Points With The Same _Time" +msgstr "Supprimer les points avec le même horoda_tage" + +#: ../src/viktrwlayer.c:8780 ../src/viktrwlayer.c:9029 +msgid "_Transform" +msgstr "_Transformer" + +#: ../src/viktrwlayer.c:8788 ../src/viktrwlayer.c:9037 +msgid "_Apply DEM Data" +msgstr "_Appliquer les altitudes du DEM" + +#: ../src/viktrwlayer.c:8793 ../src/viktrwlayer.c:9042 +msgid "_Overwrite" +msgstr "" + +#: ../src/viktrwlayer.c:8796 ../src/viktrwlayer.c:9045 +msgid "Overwrite any existing elevation values with DEM values" +msgstr "" + +#: ../src/viktrwlayer.c:8799 ../src/viktrwlayer.c:9048 +msgid "_Keep Existing" +msgstr "Conserver" + +#: ../src/viktrwlayer.c:8802 ../src/viktrwlayer.c:9051 +msgid "Keep existing elevation values, only attempt for missing values" +msgstr "" + +#: ../src/viktrwlayer.c:8807 +msgid "_Smooth Missing Elevation Data" +msgstr "" + +#: ../src/viktrwlayer.c:8812 +msgid "_Interpolated" +msgstr "" + +#: ../src/viktrwlayer.c:8815 +msgid "" +"Interpolate between known elevation values to derive values for the missing " +"elevations" +msgstr "" + +#: ../src/viktrwlayer.c:8818 +msgid "_Flat" +msgstr "_Plat" + +#: ../src/viktrwlayer.c:8821 +msgid "Set unknown elevation values to the last known value" +msgstr "Fixer les valeurs d'altitude inconnues avec la dernière valeur connue" + +#: ../src/viktrwlayer.c:8825 +msgid "C_onvert to a Route" +msgstr "C_onvertir en itinéraire" + +#: ../src/viktrwlayer.c:8827 +msgid "C_onvert to a Track" +msgstr "C_onvertir en trace" + +#: ../src/viktrwlayer.c:8835 +msgid "_Anonymize Times" +msgstr "" + +#: ../src/viktrwlayer.c:8838 +msgid "Shift timestamps to a relative offset from 1901-01-01" +msgstr "" + +#: ../src/viktrwlayer.c:8841 +msgid "_Interpolate Times" +msgstr "" + +#: ../src/viktrwlayer.c:8844 +msgid "" +"Reset trackpoint timestamps between the first and last points such that " +"track is traveled at equal speed" +msgstr "" + +#: ../src/viktrwlayer.c:8849 +msgid "_Reverse Track" +msgstr "Inve_rser la trace" + +#: ../src/viktrwlayer.c:8851 +msgid "_Reverse Route" +msgstr "Renverser l'itinéraire" + +#: ../src/viktrwlayer.c:8858 +msgid "Refine Route..." +msgstr "Affiner l'itinéraire ..." + +#: ../src/viktrwlayer.c:8868 +msgid "Down_load Maps Along Track..." +msgstr "Télécharger _les cartes le long de la trace…" + +#: ../src/viktrwlayer.c:8870 +msgid "Down_load Maps Along Route..." +msgstr "Té_lécharger les cartes le long de l'itinéraire..." + +#: ../src/viktrwlayer.c:8878 +msgid "_Export Track as GPX..." +msgstr "_Exporter la trace en GPX ..." + +#: ../src/viktrwlayer.c:8880 +msgid "_Export Route as GPX..." +msgstr "_Exporter l'itinéraire en GPX..." + +#: ../src/viktrwlayer.c:8887 +msgid "E_xtend Track End" +msgstr "Etendre l'e_xtrémité de la trace" + +#: ../src/viktrwlayer.c:8889 +msgid "E_xtend Route End" +msgstr "Étendre l'extrémité de l'itinéraire" + +#: ../src/viktrwlayer.c:8896 +msgid "Extend _Using Route Finder" +msgstr "Étendre en _utilisant le calculateur d'itinéraire" + +#: ../src/viktrwlayer.c:8911 +msgid "_Upload to GPS..." +msgstr "Envoyer a_u GPS..." + +#: ../src/viktrwlayer.c:8926 +msgid "_Diary" +msgstr "" + +#: ../src/viktrwlayer.c:8930 +msgid "Open diary program at this date" +msgstr "" + +#: ../src/viktrwlayer.c:8935 +msgid "_Astronomy" +msgstr "" + +#: ../src/viktrwlayer.c:8938 +msgid "Open astronomy program at this date and location" +msgstr "" + +#: ../src/viktrwlayer.c:8962 +msgid "_View Google Directions" +msgstr "_Voir les indications de direction Google" + +#: ../src/viktrwlayer.c:8984 +msgid "Use with _Filter" +msgstr "Utiliser avec un _filtre" + +#: ../src/viktrwlayer.c:9018 +msgid "_Edit Trackpoint" +msgstr "" + +#: ../src/viktrwlayer.c:10116 +#, c-format +msgid " - Gain %dm:Loss %dm" +msgstr "" + +#: ../src/viktrwlayer.c:10118 +#, c-format +msgid " - Gain %dft:Loss %dft" +msgstr "" + +#: ../src/viktrwlayer.c:10123 +#, c-format +msgid " - Bearing %3.1f° - Step %s" +msgstr "" + +#: ../src/viktrwlayer.c:10232 +#, c-format +msgid "Querying %s for route between (%.3f, %.3f) and (%.3f, %.3f)." +msgstr "" + +#: ../src/viktrwlayer.c:10248 +#, c-format +msgid "%s returned route between (%.3f, %.3f) and (%.3f, %.3f)." +msgstr "" + +#: ../src/viktrwlayer.c:10251 +#, c-format +msgid "Error getting route from %s." +msgstr "" + +#: ../src/viktrwlayer.c:11070 +#, c-format +msgid "Creating %d Image Thumbnails..." +msgstr "Création de %d miniatures…" + +#: ../src/viktrwlayer.c:11560 +msgid "No map layer in use. Create one first" +msgstr "Aucun calque de carte actif. Veuillez en créer un nouveau." + +#: ../src/viktrwlayer.c:11679 +#, c-format +msgid "%s: Track List" +msgstr "%s : Liste des traces" + +#: ../src/viktrwlayer.c:11681 +#, c-format +msgid "%s: Route List" +msgstr "%s : Liste d'itinéraires" + +#: ../src/viktrwlayer.c:11734 +#, c-format +msgid "" +"Could not write external layer %s to %s, please fix and save before exiting " +"or data will be lost" +msgstr "" + +#: ../src/viktrwlayer.c:11782 +#, c-format +msgid "WARNING: issues encountered loading external layer %s from %s" +msgstr "" + +#: ../src/viktrwlayer_export.c:47 +msgid "Auto Device GPX Simplify:" +msgstr "" + +#: ../src/viktrwlayer_export.c:48 +msgid "" +"GPX saves to certain devices will be simplified for device compatibility." +msgstr "" + +#: ../src/viktrwlayer_export.c:125 +#, c-format +msgid "Export of GPX file simplified using point limit: %d" +msgstr "" + +#: ../src/viktrwlayer_export.c:206 ../src/viktrwlayer_export.c:323 +#: ../src/vikwindow.c:3694 +msgid "The filename you requested could not be opened for writing." +msgstr "Le fichier choisi ne peut être ouvert en écriture." + +#: ../src/viktrwlayer_export.c:226 +#, c-format +msgid "Could not launch %s." +msgstr "Impossible de charger %s." + +#: ../src/viktrwlayer_export.c:234 +msgid "Could not create temporary file for export." +msgstr "Impossible de créer de fichier temporaire pour l'export." + +#: ../src/viktrwlayer_export.c:268 +msgid "File format:" +msgstr "" + +#: ../src/viktrwlayer_export.c:276 +msgid "Select the file format." +msgstr "" + +#: ../src/viktrwlayer_export.c:281 +msgid "" +"Select the information to process.\n" +"Warning: the behavior of these switches is highly dependent of the file " +"format selected.\n" +"Please, refer to GPSbabel if unsure." +msgstr "" + +#: ../src/viktrwlayer_export.c:308 +msgid "You did not select a valid file format." +msgstr "" + +#: ../src/viktrwlayer_propwin.c:915 ../src/viktrwlayer_propwin.c:3381 +#: ../src/viktrwlayer_propwin.c:3417 ../src/viktrwlayer_propwin.c:3457 +#: ../src/viktrwlayer_propwin.c:3509 ../src/viktrwlayer_propwin.c:3527 +#: ../src/viktrwlayer_propwin.c:3600 ../src/viktrwlayer_propwin.c:3601 +#: ../src/viktrwlayer_propwin.c:3602 ../src/viktrwlayer_propwin.c:3611 +#: ../src/viktrwlayer_propwin.c:3612 ../src/viktrwlayer_propwin.c:3629 +#: ../src/viktrwlayer_propwin.c:3630 ../src/viktrwlayer_propwin.c:3644 +#: ../src/viktrwlayer_propwin.c:3645 ../src/viktrwlayer_propwin.c:3646 +#: ../src/viktrwlayer_propwin.c:3660 ../src/viktrwlayer_propwin.c:3661 +#: ../src/viktrwlayer_propwin.c:3662 ../src/viktrwlayer_propwin.c:3676 +#: ../src/viktrwlayer_propwin.c:3677 ../src/viktrwlayer_propwin.c:3678 +#: ../src/viktrwlayer_propwin.c:3695 ../src/viktrwlayer_propwin.c:3696 +#: ../src/viktrwlayer_analysis.c:293 +#, c-format +msgid "No Data" +msgstr "Pas de données" + +#: ../src/viktrwlayer_propwin.c:960 ../src/viktrwlayer_propwin.c:1245 +#, c-format +msgid "%.1f kph" +msgstr "%.1f km/h" + +#: ../src/viktrwlayer_propwin.c:963 ../src/viktrwlayer_propwin.c:1248 +#: ../src/viktrwlayer_analysis.c:352 +#, c-format +msgid "%.1f mph" +msgstr "%.1f mi/h" + +#: ../src/viktrwlayer_propwin.c:966 ../src/viktrwlayer_propwin.c:1251 +#, c-format +msgid "%.1f knots" +msgstr "%.1f nœuds" + +#: ../src/viktrwlayer_propwin.c:969 ../src/viktrwlayer_propwin.c:1254 +#, fuzzy, c-format +msgid "%.1f s/km" +msgstr "%.1f km" + +#: ../src/viktrwlayer_propwin.c:972 ../src/viktrwlayer_propwin.c:1257 +#: ../src/viktrwlayer_analysis.c:389 ../src/viktrwlayer_analysis.c:392 +#, fuzzy, c-format +msgid "%.1f min/km" +msgstr "%.1f km" + +#: ../src/viktrwlayer_propwin.c:975 ../src/viktrwlayer_propwin.c:1260 +#, fuzzy, c-format +msgid "%.1f sec/mi" +msgstr "%.1f miles" + +#: ../src/viktrwlayer_propwin.c:978 ../src/viktrwlayer_propwin.c:1263 +#: ../src/viktrwlayer_analysis.c:409 ../src/viktrwlayer_analysis.c:412 +#, fuzzy, c-format +msgid "%.1f min/mi" +msgstr "%.1f m/s" + +#. VIK_UNITS_SPEED_METRES_PER_SECOND: +#: ../src/viktrwlayer_propwin.c:982 ../src/viktrwlayer_propwin.c:1267 +#, c-format +msgid "%.1f m/s" +msgstr "%.1f m/s" + +#. Minutes +#: ../src/viktrwlayer_propwin.c:1411 +msgid "mins" +msgstr "" + +#. Hours +#: ../src/viktrwlayer_propwin.c:1418 +msgid "h" +msgstr "" + +#. Days +#: ../src/viktrwlayer_propwin.c:1424 +msgid "d" +msgstr "" + +#. Weeks +#: ../src/viktrwlayer_propwin.c:1429 +msgid "w" +msgstr "" + +#. 'Months' +#: ../src/viktrwlayer_propwin.c:1433 +msgid "M" +msgstr "" + +#: ../src/viktrwlayer_propwin.c:2051 ../src/viktrwlayer_analysis.c:303 +#, c-format +msgid "%.1f miles" +msgstr "%.1f miles" + +#: ../src/viktrwlayer_propwin.c:2054 ../src/viktrwlayer_analysis.c:306 +#, c-format +msgid "%.1f NM" +msgstr "" + +#. VIK_UNITS_DISTANCE_KILOMETRES +#: ../src/viktrwlayer_propwin.c:2057 ../src/viktrwlayer_analysis.c:310 +#, c-format +msgid "%.1f km" +msgstr "%.1f km" + +#: ../src/viktrwlayer_propwin.c:3083 +msgid "Failed spliting track. Track unchanged" +msgstr "Impossible de séparer la trace, qui n'a pas été modifiée." + +#: ../src/viktrwlayer_propwin.c:3234 ../src/viktrwlayer_propwin.c:3744 +#, c-format +msgid "%s - Track Properties" +msgstr "%s - Propriétés de la trace" + +#: ../src/viktrwlayer_propwin.c:3239 +msgid "Split at _Marker" +msgstr "" + +#: ../src/viktrwlayer_propwin.c:3240 +msgid "Split _Segments" +msgstr "" + +#: ../src/viktrwlayer_propwin.c:3241 +msgid "_Reverse" +msgstr "Inve_rser" + +#: ../src/viktrwlayer_propwin.c:3242 +msgid "_Delete Dupl." +msgstr "" + +#: ../src/viktrwlayer_propwin.c:3269 +msgid "Comment:" +msgstr "Commentaire :" + +#: ../src/viktrwlayer_propwin.c:3270 +msgid "Description:" +msgstr "Description :" + +#: ../src/viktrwlayer_propwin.c:3271 +#, fuzzy +msgid "Source:" +msgstr "Départ :" + +#: ../src/viktrwlayer_propwin.c:3272 +#, fuzzy +msgid "Type:" +msgstr "Heure :" + +#: ../src/viktrwlayer_propwin.c:3273 +msgid "Color:" +msgstr "Couleur :" + +#: ../src/viktrwlayer_propwin.c:3274 +msgid "Draw Name:" +msgstr "" + +#: ../src/viktrwlayer_propwin.c:3275 +msgid "Distance Labels:" +msgstr "" + +#: ../src/viktrwlayer_propwin.c:3278 +msgid "Track Length:" +msgstr "Longueur :" + +#: ../src/viktrwlayer_propwin.c:3279 +msgid "Trackpoints:" +msgstr "Nombre de points :" + +#: ../src/viktrwlayer_propwin.c:3280 +msgid "Segments:" +msgstr "Segments :" + +#: ../src/viktrwlayer_propwin.c:3281 +msgid "Duplicate Points:" +msgstr "Points dupliqués :" + +#: ../src/viktrwlayer_propwin.c:3282 +msgid "Max Speed:" +msgstr "Vitesse maximale :" + +#: ../src/viktrwlayer_propwin.c:3283 +msgid "Avg. Speed:" +msgstr "Vitesse moyenne :" + +#: ../src/viktrwlayer_propwin.c:3284 +msgid "Moving Avg. Speed:" +msgstr "" + +#: ../src/viktrwlayer_propwin.c:3285 +msgid "Avg. Dist. Between TPs:" +msgstr "Distance moyenne entre points :" + +#: ../src/viktrwlayer_propwin.c:3286 +msgid "Elevation Range:" +msgstr "Altitudes atteintes :" + +#: ../src/viktrwlayer_propwin.c:3287 +msgid "Total Elevation Gain/Loss:" +msgstr "Dénivelé total :" + +#: ../src/viktrwlayer_propwin.c:3288 +msgid "Start:" +msgstr "Départ :" + +#: ../src/viktrwlayer_propwin.c:3289 +msgid "End:" +msgstr "Arrivée :" + +#: ../src/viktrwlayer_propwin.c:3290 +msgid "Duration:" +msgstr "Durée :" + +#: ../src/viktrwlayer_propwin.c:3320 +msgid "Centre" +msgstr "" + +#: ../src/viktrwlayer_propwin.c:3321 +msgid "Start only" +msgstr "Départ seulement" + +#: ../src/viktrwlayer_propwin.c:3322 +msgid "End only" +msgstr "" + +#: ../src/viktrwlayer_propwin.c:3323 +msgid "Start and End" +msgstr "Départ et arrivée" + +#: ../src/viktrwlayer_propwin.c:3324 +msgid "Centre, Start and End" +msgstr "" + +#: ../src/viktrwlayer_propwin.c:3336 +msgid "Maximum number of distance labels to be shown" +msgstr "" + +#: ../src/viktrwlayer_propwin.c:3340 +msgid "Properties" +msgstr "Propriétés" + +#: ../src/viktrwlayer_propwin.c:3584 +#, c-format +msgid "%d minutes - %d minutes moving" +msgstr "" + +#: ../src/viktrwlayer_propwin.c:3596 +#, c-format +msgid "%s total - %s in segments" +msgstr "" + +#: ../src/viktrwlayer_propwin.c:3607 ../src/viktrwlayer_analysis.c:622 +msgid "Statistics" +msgstr "Statistiques" + +#: ../src/viktrwlayer_propwin.c:3613 ../src/viktrwlayer_propwin.c:3680 +msgid "Show D_EM" +msgstr "" + +#: ../src/viktrwlayer_propwin.c:3615 ../src/viktrwlayer_propwin.c:3631 +#: ../src/viktrwlayer_propwin.c:3647 ../src/viktrwlayer_propwin.c:3697 +msgid "Show _GPS Speed" +msgstr "" + +#: ../src/viktrwlayer_propwin.c:3617 ../src/viktrwlayer_propwin.c:3633 +#: ../src/viktrwlayer_propwin.c:3665 ../src/viktrwlayer_propwin.c:3699 +msgid "Track Distance:" +msgstr "Distance :" + +#: ../src/viktrwlayer_propwin.c:3618 ../src/viktrwlayer_propwin.c:3684 +msgid "Track Height:" +msgstr "Altitude :" + +#: ../src/viktrwlayer_propwin.c:3624 +msgid "Elevation-distance" +msgstr "Dénivelée/distance" + +#: ../src/viktrwlayer_propwin.c:3634 +msgid "Track Gradient:" +msgstr "Pente :" + +#: ../src/viktrwlayer_propwin.c:3639 +msgid "Gradient-distance" +msgstr "" + +#: ../src/viktrwlayer_propwin.c:3649 ../src/viktrwlayer_propwin.c:3666 +#: ../src/viktrwlayer_propwin.c:3683 +msgid "Track Time:" +msgstr "Durée de la trace :" + +#: ../src/viktrwlayer_propwin.c:3650 ../src/viktrwlayer_propwin.c:3700 +msgid "Track Speed:" +msgstr "Vitesse :" + +#: ../src/viktrwlayer_propwin.c:3651 ../src/viktrwlayer_propwin.c:3667 +#: ../src/viktrwlayer_propwin.c:3685 +msgid "Time/Date:" +msgstr "" + +#: ../src/viktrwlayer_propwin.c:3655 +msgid "Speed-time" +msgstr "Vitesse/temps" + +#: ../src/viktrwlayer_propwin.c:3663 ../src/viktrwlayer_propwin.c:3679 +msgid "Show S_peed" +msgstr "Afficher la vite_sse" + +#: ../src/viktrwlayer_propwin.c:3671 +msgid "Distance-time" +msgstr "Distance/temps" + +#: ../src/viktrwlayer_propwin.c:3690 +msgid "Elevation-time" +msgstr "Altitude/temps" + +#: ../src/viktrwlayer_propwin.c:3705 +msgid "Speed-distance" +msgstr "Vitesse/distance" + +#: ../src/viktrwlayer_tpwin.c:190 ../src/viktrwlayer_wpwin.c:66 +msgid "Date/Time Edit" +msgstr "" + +#: ../src/viktrwlayer_tpwin.c:242 +msgid "Name:" +msgstr "" + +#: ../src/viktrwlayer_tpwin.c:243 +msgid "Latitude:" +msgstr "Latitude :" + +#: ../src/viktrwlayer_tpwin.c:244 +msgid "Longitude:" +msgstr "Longitude :" + +#: ../src/viktrwlayer_tpwin.c:245 +msgid "Altitude:" +msgstr "Altitude :" + +#: ../src/viktrwlayer_tpwin.c:246 +msgid "Course:" +msgstr "" + +#: ../src/viktrwlayer_tpwin.c:247 +msgid "Timestamp:" +msgstr "Timestamp :" + +#: ../src/viktrwlayer_tpwin.c:248 +msgid "Time:" +msgstr "Heure :" + +#: ../src/viktrwlayer_tpwin.c:249 +msgid "Distance Difference:" +msgstr "Distance :" + +#: ../src/viktrwlayer_tpwin.c:250 +msgid "Time Difference:" +msgstr "Temps :" + +#: ../src/viktrwlayer_tpwin.c:251 +msgid "\"Speed\" Between:" +msgstr "Vitesse :" + +#: ../src/viktrwlayer_tpwin.c:252 +msgid "Speed:" +msgstr "Vitesse :" + +#: ../src/viktrwlayer_tpwin.c:253 +msgid "VDOP:" +msgstr "VDOP:" + +#: ../src/viktrwlayer_tpwin.c:254 +msgid "HDOP:" +msgstr "HDOP:" + +#: ../src/viktrwlayer_tpwin.c:255 +msgid "PDOP:" +msgstr "PDOP:" + +#: ../src/viktrwlayer_tpwin.c:256 +msgid "SAT/FIX:" +msgstr "SAT/FIX:" + +#: ../src/viktrwlayer_tpwin.c:263 ../src/viktrwlayer_tpwin.c:408 +#: ../src/viktrwlayer_tpwin.c:622 +msgid "Trackpoint" +msgstr "Point" + +#: ../src/viktrwlayer_tpwin.c:266 +msgid "_Insert After" +msgstr "_Insérer Après" + +#: ../src/viktrwlayer_tpwin.c:268 +msgid "Split Here" +msgstr "Découper ici" + +#: ../src/viktrwlayer_tracklist.c:262 ../src/viktrwlayer_waypointlist.c:306 +msgid "_Copy Data" +msgstr "" + +#. +#. item = gtk_image_menu_item_new_with_mnemonic ( _("_Select") ); +#. gtk_image_menu_item_set_image ( (GtkImageMenuItem*)item, gtk_image_new_from_stock (GTK_STOCK_FIND, GTK_ICON_SIZE_MENU) ); +#. g_signal_connect_swapped ( G_OBJECT(item), "activate", G_CALLBACK(trw_layer_track_select), values ); +#. gtk_menu_shell_append (GTK_MENU_SHELL (menu), item); +#. gtk_widget_show ( item ); +#. +#. ATM view auto selects, so don't bother with separate select menu entry +#. +#. item = gtk_image_menu_item_new_with_mnemonic ( _("_Select") ); +#. gtk_image_menu_item_set_image ( (GtkImageMenuItem*)item, gtk_image_new_from_stock (GTK_STOCK_FIND, GTK_ICON_SIZE_MENU) ); +#. g_signal_connect_swapped ( G_OBJECT(item), "activate", G_CALLBACK(trw_layer_waypoint_select), values ); +#. gtk_menu_shell_append (GTK_MENU_SHELL (menu), item); +#. gtk_widget_show ( item ); +#. +#. AUTO SELECT NOT TRUE YET... +#. ATM view auto selects, so don't bother with separate select menu entry +#: ../src/viktrwlayer_tracklist.c:290 ../src/viktrwlayer_waypointlist.c:341 +#: ../src/vikwindow.c:4816 +msgid "_View" +msgstr "_Vue" + +#. Insert column for the layer name when viewing multi layers +#: ../src/viktrwlayer_tracklist.c:613 ../src/viktrwlayer_waypointlist.c:609 +msgid "Layer" +msgstr "Calque" + +#: ../src/viktrwlayer_tracklist.c:627 ../src/viktrwlayer_waypointlist.c:624 +msgid "Date" +msgstr "Date" + +#: ../src/viktrwlayer_tracklist.c:631 ../src/viktrwlayer_waypointlist.c:628 +msgid "Visible" +msgstr "Visible" + +#: ../src/viktrwlayer_tracklist.c:639 +msgid "" +"Distance\n" +"(miles)" +msgstr "" +"Distance\n" +"(miles)" + +#: ../src/viktrwlayer_tracklist.c:642 +#, fuzzy +msgid "" +"Distance\n" +"(NM)" +msgstr "" +"Distance\n" +"(km)" + +#: ../src/viktrwlayer_tracklist.c:645 +msgid "" +"Distance\n" +"(km)" +msgstr "" +"Distance\n" +"(km)" + +#: ../src/viktrwlayer_tracklist.c:651 +msgid "" +"Length\n" +"(minutes)" +msgstr "" +"Durée\n" +"(minutes)" + +#: ../src/viktrwlayer_tracklist.c:660 ../src/vikutils.c:93 +msgid "sec/mi" +msgstr "" + +#: ../src/viktrwlayer_tracklist.c:666 +#, c-format +msgid "" +"Av. Speed\n" +"(%s)" +msgstr "" +"Vitesse moy.\n" +"(%s)" + +#. Apply own formatting of the data +#: ../src/viktrwlayer_tracklist.c:671 +#, c-format +msgid "" +"Max Speed\n" +"(%s)" +msgstr "" +"Vitesse max\n" +"(%s)" + +#: ../src/viktrwlayer_tracklist.c:679 ../src/viktrwlayer_waypointlist.c:637 +msgid "" +"Max Height\n" +"(Feet)" +msgstr "" +"Altitude max\n" +"(pieds)" + +#: ../src/viktrwlayer_tracklist.c:681 ../src/viktrwlayer_waypointlist.c:639 +msgid "" +"Max Height\n" +"(Metres)" +msgstr "" +"Altitude max\n" +"(mètres)" + +#: ../src/viktrwlayer_waypointlist.c:312 +msgid "Copy Data (with _positions)" +msgstr "" + +#: ../src/viktrwlayer_waypointlist.c:633 +msgid "Comment" +msgstr "" + +#: ../src/viktrwlayer_waypointlist.c:643 +msgid "Symbol" +msgstr "" + +#: ../src/viktrwlayer_wpwin.c:93 ../src/viktrwlayer_wpwin.c:302 +msgid "True" +msgstr "" + +#: ../src/viktrwlayer_wpwin.c:122 +msgid "Waypoint Properties" +msgstr "Propriétés du point d'intérêt" + +#: ../src/viktrwlayer_wpwin.c:164 +msgid "Name:" +msgstr "Nom :" + +#: ../src/viktrwlayer_wpwin.c:181 +msgid "Altitude:" +msgstr "Altitude :" + +#: ../src/viktrwlayer_wpwin.c:186 ../src/viktrwlayer_wpwin.c:188 +msgid "Comment:" +msgstr "Commentaire :" + +#: ../src/viktrwlayer_wpwin.c:202 +#, fuzzy +msgid "Source:" +msgstr "Télécharger à partir de :" + +#: ../src/viktrwlayer_wpwin.c:212 +msgid "Image:" +msgstr "Image :" + +#: ../src/viktrwlayer_wpwin.c:217 +msgid "Symbol:" +msgstr "Symbole :" + +#: ../src/viktrwlayer_wpwin.c:226 +msgid "(none)" +msgstr "(aucun)" + +#. Geotag Info [readonly] +#: ../src/viktrwlayer_wpwin.c:272 +msgid "Has Geotag" +msgstr "" + +#: ../src/viktrwlayer_wpwin.c:279 +msgid "Consistent Position" +msgstr "" + +#. ATM the direction value box is always shown, even when there is no information. +#. It would be nice to be able to hide it until the 'Add' has been performed, +#. however I've not been able to achieve this. +#. Thus simply sensistizing it instead. +#: ../src/viktrwlayer_wpwin.c:292 +#, fuzzy +msgid "Image Direction:" +msgstr "Paramètres de l'image" + +#: ../src/viktrwlayer_wpwin.c:300 +msgid "Magnetic" +msgstr "" + +#: ../src/viktrwlayer_wpwin.c:320 +msgid "Time:" +msgstr "Temps:" + +#. TODO: other checks (isalpha or whatever ) +#: ../src/viktrwlayer_wpwin.c:386 +msgid "Please enter a name for the waypoint." +msgstr "Entrez un nom pour le point d'intérêt." + +#: ../src/viktrwlayer_geotag.c:320 ../src/viktrwlayer_geotag.c:460 +#, c-format +msgid "Failed updating EXIF on %s" +msgstr "" + +#: ../src/viktrwlayer_geotag.c:562 +#, c-format +msgid "Geotagging %d Images..." +msgstr "" + +#: ../src/viktrwlayer_geotag.c:630 +msgid "Geotag Images" +msgstr "" + +#: ../src/viktrwlayer_geotag.c:640 +msgid "Images" +msgstr "Photos" + +#: ../src/viktrwlayer_geotag.c:645 +msgid "Overwrite Existing Waypoints:" +msgstr "" + +#: ../src/viktrwlayer_geotag.c:648 +msgid "Overwrite Existing GPS Information:" +msgstr "" + +#: ../src/viktrwlayer_geotag.c:650 +msgid "Keep File Modification Timestamp:" +msgstr "" + +#: ../src/viktrwlayer_geotag.c:684 +msgid "Create Waypoints:" +msgstr "Créer des points de cheminement :" + +#: ../src/viktrwlayer_geotag.c:693 +msgid "Write EXIF:" +msgstr "Ajouter les informations EXIF :" + +#: ../src/viktrwlayer_geotag.c:705 +msgid "Automatic Image Direction:" +msgstr "" + +#: ../src/viktrwlayer_geotag.c:707 +msgid "Set image direction based on a heading derived from the track" +msgstr "" + +#: ../src/viktrwlayer_geotag.c:710 +msgid "Interpolate Between Track Segments:" +msgstr "Interpolation entre les segments de la trace :" + +#: ../src/viktrwlayer_geotag.c:715 +msgid "Image Time Offset (Seconds):" +msgstr "" + +#: ../src/viktrwlayer_geotag.c:718 +msgid "" +"The number of seconds to ADD to the photos time to make it match the GPS " +"data. Calculate this with (GPS - Photo). Can be negative or positive. Useful " +"to adjust times when a camera's timestamp was incorrect." +msgstr "" + +#: ../src/viktrwlayer_geotag.c:721 +msgid "Image Timezone:" +msgstr "" + +#: ../src/viktrwlayer_geotag.c:724 +msgid "" +"The timezone that was used when the images were created. For example, if a " +"camera is set to AWST or +8:00 hours. Enter +8:00 here so that the correct " +"adjustment to the images' time can be made. GPS data is always in UTC." +msgstr "" + +#: ../src/viktrwlayer_geotag.c:728 +#, c-format +msgid "Using waypoint: %s" +msgstr "" + +#: ../src/viktrwlayer_geotag.c:742 +#, c-format +msgid "Using track: %s" +msgstr "Utilise la trace : %s" + +#: ../src/viktrwlayer_geotag.c:744 +#, c-format +msgid "Using all tracks in: %s" +msgstr "Utilise l'ensemble des traces dans : %s" + +#: ../src/viktrwlayer_analysis.c:214 +msgid "Number of Tracks" +msgstr "Nombre de traces" + +#: ../src/viktrwlayer_analysis.c:215 +msgid "Date Range" +msgstr "Plage de dates" + +#: ../src/viktrwlayer_analysis.c:216 +msgid "Total Length" +msgstr "Distance totale" + +#: ../src/viktrwlayer_analysis.c:217 +msgid "Average Length" +msgstr "Distance moyenne" + +#: ../src/viktrwlayer_analysis.c:218 +msgid "Eddington number" +msgstr "" + +#. No.4: Extended display only +#: ../src/viktrwlayer_analysis.c:219 +msgid "Max Speed" +msgstr "Vitesse Max." + +#: ../src/viktrwlayer_analysis.c:220 +msgid "Avg. Speed" +msgstr "Vitesse moy." + +#: ../src/viktrwlayer_analysis.c:221 +msgid "Minimum Altitude" +msgstr "Altitude minimum" + +#: ../src/viktrwlayer_analysis.c:222 +msgid "Maximum Altitude" +msgstr "Altitude maximum" + +#: ../src/viktrwlayer_analysis.c:223 +msgid "Total Elevation Gain/Loss" +msgstr "" + +#: ../src/viktrwlayer_analysis.c:224 +msgid "Avg. Elevation Gain/Loss" +msgstr "" + +#: ../src/viktrwlayer_analysis.c:225 +msgid "Total Duration" +msgstr "Durée totale" + +#: ../src/viktrwlayer_analysis.c:226 +msgid "Avg. Duration" +msgstr "Durée moyenne" + +#: ../src/viktrwlayer_analysis.c:317 +#, c-format +msgid "%.2f miles" +msgstr "%.2f miles" + +#: ../src/viktrwlayer_analysis.c:320 +#, fuzzy, c-format +msgid "%.2f NM" +msgstr "%.2f km" + +#. VIK_UNITS_DISTANCE_KILOMETRES +#: ../src/viktrwlayer_analysis.c:324 +#, c-format +msgid "%.2f km" +msgstr "%.2f km" + +#: ../src/viktrwlayer_analysis.c:361 +#, c-format +msgid "%.2f m/s" +msgstr "%.2f m/s" + +#: ../src/viktrwlayer_analysis.c:370 ../src/viktrwlayer_analysis.c:373 +#, c-format +msgid "%.2f knots" +msgstr "%.2f nœuds" + +#: ../src/viktrwlayer_analysis.c:379 ../src/viktrwlayer_analysis.c:382 +#, c-format +msgid "%d s/km" +msgstr "" + +#: ../src/viktrwlayer_analysis.c:399 ../src/viktrwlayer_analysis.c:402 +#, c-format +msgid "%d sec/mi" +msgstr "" + +#: ../src/viktrwlayer_analysis.c:420 ../src/viktrwlayer_analysis.c:423 +#, c-format +msgid "%.2f km/h" +msgstr "%.2f km/h" + +#: ../src/viktrwlayer_analysis.c:434 ../src/viktrwlayer_analysis.c:440 +#, c-format +msgid "%d feet" +msgstr "%d pieds" + +#: ../src/viktrwlayer_analysis.c:445 ../src/viktrwlayer_analysis.c:447 +#, c-format +msgid "%d feet / %d feet" +msgstr "" + +#: ../src/viktrwlayer_analysis.c:452 ../src/viktrwlayer_analysis.c:458 +#, c-format +msgid "%d m" +msgstr "%d m" + +#: ../src/viktrwlayer_analysis.c:463 ../src/viktrwlayer_analysis.c:465 +#, c-format +msgid "%d m / %d m" +msgstr "%d m / %d m" + +#: ../src/viktrwlayer_analysis.c:477 +#, c-format +msgid "%d:%02d:%02d days:hrs:mins" +msgstr "%d:%02d:%02d j:h:min" + +#: ../src/viktrwlayer_analysis.c:484 +#, c-format +msgid "%d:%02d hrs:mins" +msgstr "%d:%02d h:min" + +#: ../src/viktrwlayer_analysis.c:658 +msgid "Include Invisible Items" +msgstr "Inclure les éléments invisibles" + +#: ../src/vikstatus.c:129 +msgid "Current number of background tasks. Click to see the background jobs." +msgstr "" + +#: ../src/vikstatus.c:134 +msgid "Current zoom level. Click to select a new one." +msgstr "" + +#: ../src/vikstatus.c:141 +msgid "Left click to clear the message. Right click to copy the message." +msgstr "" + +#: ../src/vikutils.c:108 +msgid "GPSD" +msgstr "GPSD" + +#. GPS Preamble +#: ../src/vikutils.c:109 +msgid "Trkpt" +msgstr "" + +#: ../src/vikutils.c:160 +#, c-format +msgid "%sSpeed%s %.1f%s" +msgstr "%sVitesse%s %.1f%s" + +#. Go for 2dp as expect low values for vertical speeds +#: ../src/vikutils.c:214 +#, c-format +msgid "%sClimb%s %.2f%s" +msgstr "" + +#: ../src/vikutils.c:223 +#, c-format +msgid "%sAlt %dfeet" +msgstr "%sAlt %dpieds" + +#. VIK_UNITS_HEIGHT_METRES: +#: ../src/vikutils.c:227 +#, c-format +msgid "%sAlt %dm" +msgstr "%sAlt %dm" + +#: ../src/vikutils.c:235 +#, c-format +msgid "%sCourse %03d°" +msgstr "" + +#: ../src/vikutils.c:249 +msgid "yards" +msgstr "yards" + +#. VIK_UNITS_DISTANCE_KILOMETRES: +#: ../src/vikutils.c:253 +msgid "m" +msgstr "m" + +#: ../src/vikutils.c:257 +#, c-format +msgid "%sDistance diff %d%s" +msgstr "" + +#: ../src/vikutils.c:272 +#, c-format +msgid "%sTime %s" +msgstr "%sTemps %s" + +#: ../src/vikutils.c:281 +#, c-format +msgid "%sTime diff %lds" +msgstr "" + +#: ../src/vikutils.c:287 +#, c-format +msgid "%sNo. of Sats %d" +msgstr "" + +#: ../src/vikutils.c:312 +#, c-format +msgid "%sTo End %.2f%s" +msgstr "" + +#: ../src/vikutils.c:339 +#, c-format +msgid "%sDistance along %.2f%s" +msgstr "" + +#: ../src/vikutils.c:359 +#, c-format +msgid "%sTrack: %s" +msgstr "" + +#: ../src/vikutils.c:396 +#, c-format +msgid "" +"There is a newer version of Viking available: %s\n" +"\n" +"Do you wish to go to Viking's website now?" +msgstr "" +"Il y a une nouvelle version de Viking disponible : %s\n" +"Souhaitez-vous aller sur le site de Viking maintenant ?" + +#: ../src/vikutils.c:526 +msgid "" +"This appears to be Viking's very first run.\n" +"\n" +"Do you wish to enable automatic internet features?\n" +"\n" +"Individual settings can be controlled in the Preferences." +msgstr "" +"Il semble que ce soit le tout premier lancement de Viking.\n" +"\n" +"Souhaitez-vous activer les fonctions automatiques en ligne ?\n" +"\n" +"Vous pourrez contrôler les paramètres individuels dans les Préférences." + +#: ../src/vikwaypoint.c:37 +msgid "Waypoint" +msgstr "Point de cheminement" + +#: ../src/vikwebtool_datasource.c:352 +msgid "Search Term" +msgstr "" + +#. TODO get rid of this as this is unnecessary duplication... +#: ../src/vikwindow.c:258 +msgid "Pan" +msgstr "Déplacer" + +#: ../src/vikwindow.c:258 +msgid "Zoom" +msgstr "Zoom" + +#: ../src/vikwindow.c:258 +msgid "Ruler" +msgstr "Règle" + +#: ../src/vikwindow.c:258 +msgid "Select" +msgstr "Sélectionnez" + +#: ../src/vikwindow.c:368 +msgid "This is Viking " +msgstr "" + +#: ../src/vikwindow.c:457 +msgid "Location lookup aborted" +msgstr "" + +#: ../src/vikwindow.c:477 +#, c-format +msgid "Location found: %s" +msgstr "Position trouvée : %s" + +#: ../src/vikwindow.c:486 +msgid "Unable to determine location" +msgstr "Impossible de trouver la position" + +#: ../src/vikwindow.c:495 +msgid "Determining location" +msgstr "" + +#: ../src/vikwindow.c:525 +#, fuzzy, c-format +msgid "Location found via geoclue" +msgstr "Position trouvée : %s" + +#: ../src/vikwindow.c:546 +msgid "Default Map" +msgstr "Carte par défaut" + +#: ../src/vikwindow.c:557 ../src/vikwindow.c:3938 +msgid "Trying to determine location..." +msgstr "" + +#. Create tooltip +#: ../src/vikwindow.c:723 +msgid "Select zoom level" +msgstr "" + +#: ../src/vikwindow.c:1176 +#, c-format +msgid "" +"Do you want to save the changes you made to the document \"%s\"?\n" +"\n" +"Your changes will be lost if you don't save them." +msgstr "" +"Voulez-vous enregistrer les changements fait au fichier \"%s\" ?\n" +"\n" +"Ces changements seront perdus si vous ne les enregistrez pas." + +#: ../src/vikwindow.c:1180 +msgid "Don't Save" +msgstr "Ne pas enregistrer" + +#: ../src/vikwindow.c:1268 +msgid "mpp" +msgstr "mètres par pixel" + +#: ../src/vikwindow.c:1268 +msgid "pixelfact" +msgstr "" + +#: ../src/vikwindow.c:1467 +#, c-format +msgid "%s %s %dm" +msgstr "%s %s %dm" + +#: ../src/vikwindow.c:1469 +#, c-format +msgid "%s %s %dft" +msgstr "" + +#: ../src/vikwindow.c:1472 +#, c-format +msgid "%s %s" +msgstr "%s %s" + +#: ../src/vikwindow.c:1929 +msgid "_Ruler" +msgstr "_Règle" + +#: ../src/vikwindow.c:1929 +msgid "Ruler Tool" +msgstr "Règle" + +#: ../src/vikwindow.c:2204 ../src/vikwindow.c:4818 +msgid "_Zoom" +msgstr "_Zoom" + +#: ../src/vikwindow.c:2204 +msgid "Zoom Tool" +msgstr "Outil de zoom" + +#: ../src/vikwindow.c:2271 ../src/vikwindow.c:4819 +msgid "_Pan" +msgstr "_Déplacer" + +#: ../src/vikwindow.c:2271 +msgid "Pan Tool" +msgstr "Outil de déplacement" + +#: ../src/vikwindow.c:2425 +msgid "_Select" +msgstr "_Sélectionner" + +#: ../src/vikwindow.c:2425 +msgid "Select Tool" +msgstr "Outil de sélection" + +#: ../src/vikwindow.c:2615 +msgid "You must select a layer to show its properties." +msgstr "Vous devez sélectionner un calque pour afficher ses propriétés" + +#. No error to show, so unlikely this will get called +#: ../src/vikwindow.c:2629 +msgid "The help system is not available." +msgstr "Le système d'aide n'est pas disponible." + +#. Main error path +#: ../src/vikwindow.c:2632 +#, c-format +msgid "" +"Help is not available because: %s.\n" +"Ensure a Mime Type ghelp handler program is installed (e.g. yelp)." +msgstr "" + +#: ../src/vikwindow.c:2865 +msgid "You must select a layer to delete." +msgstr "Vous devez sélectionner un calque à supprimer." + +#: ../src/vikwindow.c:3171 +msgid "Untitled" +msgstr "SansTitre" + +#: ../src/vikwindow.c:3300 +#, c-format +msgid "Unable to add '%s' to the list of recently used documents" +msgstr "Impossible de rajouter '%s' à la liste des documents récents" + +#: ../src/vikwindow.c:3391 +msgid "The file you requested could not be opened." +msgstr "Le fichier choisi ne peut pas être ouvert." + +#: ../src/vikwindow.c:3394 +msgid "" +"GPSBabel is required to load files of this type or GPSBabel encountered " +"problems." +msgstr "" + +#: ../src/vikwindow.c:3397 +#, c-format +msgid "Unable to load malformed GPX file %s" +msgstr "" + +#: ../src/vikwindow.c:3400 +#, c-format +msgid "Unsupported file type for %s" +msgstr "Format du fichier %s non pris en charge" + +#. Since we can process .vik files with issues just show a warning in the status bar +#. Not that a user can do much about it... or tells them what this issue is yet... +#: ../src/vikwindow.c:3406 +#, c-format +msgid "WARNING: issues encountered loading %s" +msgstr "" + +#: ../src/vikwindow.c:3489 +msgid "Please select a GPS data file to open. " +msgstr "Sélectionner un fichier GPS à ouvrir. " + +#: ../src/vikwindow.c:3508 +msgid "Google Earth" +msgstr "Google Earth" + +#: ../src/vikwindow.c:3523 ../src/vikwindow.c:3646 ../src/viking.desktop.in.h:1 +msgid "Viking" +msgstr "Viking" + +#: ../src/vikwindow.c:3594 ../src/vikwindow.c:4632 +msgid "Open File" +msgstr "" + +#: ../src/vikwindow.c:3630 +msgid "Save as Viking File." +msgstr "Enregistrer en tant que fichier Viking." + +#: ../src/vikwindow.c:3757 +#, c-format +msgid "Exporting to file: %s" +msgstr "" + +#. Confirm what happened. +#: ../src/vikwindow.c:3774 +#, c-format +msgid "Exported files: %d" +msgstr "" + +#: ../src/vikwindow.c:3786 +msgid "Nothing to Export!" +msgstr "Rien à exporter !" + +#: ../src/vikwindow.c:3790 +msgid "Export to directory" +msgstr "Exporter vers le dossier" + +#: ../src/vikwindow.c:3809 +msgid "Could not convert all files" +msgstr "Impossible de convertir tous les fichiers" + +#: ../src/vikwindow.c:3851 +msgid "File not accessible" +msgstr "Fichier inaccessible" + +#: ../src/vikwindow.c:3854 +msgid "No Viking File" +msgstr "Aucun fichier Viking" + +#: ../src/vikwindow.c:3998 +msgid "This layer has no configurable properties." +msgstr "" + +#: ../src/vikwindow.c:4080 +msgid "Are you sure you wish to delete all layers?" +msgstr "Voulez-vous vraiment supprimer tous les calques ?" + +#. Try harder... +#: ../src/vikwindow.c:4126 ../src/vikwindow.c:4132 +msgid "Generating image file..." +msgstr "Et pendant ce temps-là ..." + +#: ../src/vikwindow.c:4154 +msgid "" +"Failed to generate internal image.\n" +"\n" +"Try creating a smaller image." +msgstr "" + +#: ../src/vikwindow.c:4175 +msgid "Image file generated." +msgstr "" + +#: ../src/vikwindow.c:4177 +msgid "Failed to generate image file." +msgstr "" + +#: ../src/vikwindow.c:4246 +#, c-format +msgid "Unable to write to file %s: %s" +msgstr "" + +#: ../src/vikwindow.c:4284 +msgid "" +"Viewable region outside allowable pixel size bounds for image. Clipping " +"width/height values." +msgstr "" +"La région visible est de taille supérieure à la taille maximale possible " +"d'une image. La largeur et la longueur de l'image générée sont donc " +"tronquées." + +#: ../src/vikwindow.c:4309 +#, c-format +msgid "Total area: %ldm x %ldm (%.3f sq. km)" +msgstr "Surface totale %ldm x %ldm (%.3f km²)" + +#: ../src/vikwindow.c:4312 +#, c-format +msgid "Total area: %ldm x %ldm (%.3f sq. miles)" +msgstr "" + +#: ../src/vikwindow.c:4315 +#, c-format +msgid "Total area: %ldm x %ldm (%.3f sq. NM)" +msgstr "" + +#. Single file +#: ../src/vikwindow.c:4343 +msgid "Save Image" +msgstr "Enregistrer l'image" + +#: ../src/vikwindow.c:4364 ../src/vikwindow.c:4641 +msgid "KMZ" +msgstr "" + +#: ../src/vikwindow.c:4417 +msgid "You must be in UTM mode to use this feature" +msgstr "Vous devez être en mode UTM pour utiliser cette fonctionalité" + +#: ../src/vikwindow.c:4421 +msgid "Choose a directory to hold images" +msgstr "Sélectionner un répertoire pour stocker les images" + +#. todo: default for answers inside VikWindow or static (thruout instance) +#: ../src/vikwindow.c:4441 +msgid "Save to Image File" +msgstr "Enregistrer dans un fichier image" + +#: ../src/vikwindow.c:4457 +msgid "Width (pixels):" +msgstr "Largeur (pixels) :" + +#: ../src/vikwindow.c:4459 +msgid "Height (pixels):" +msgstr "Hauteur (pixels) :" + +#: ../src/vikwindow.c:4462 +msgid "" +"WARNING: USING LARGE IMAGES OVER 10000x10000\n" +"MAY CRASH THE PROGRAM!" +msgstr "" + +#: ../src/vikwindow.c:4464 +msgid "Zoom (meters per pixel):" +msgstr "Zoom (mètres par pixel) :" + +#: ../src/vikwindow.c:4480 +msgid "Area in current viewable window" +msgstr "Surface visible dans la fenêtre principale" + +#: ../src/vikwindow.c:4490 +msgid "Save as PNG" +msgstr "Enregistrer en tant que PNG" + +#: ../src/vikwindow.c:4491 +msgid "Save as JPEG" +msgstr "Enregistrer en tant que JPEG" + +#: ../src/vikwindow.c:4520 +msgid "East-west image tiles:" +msgstr "Nombre d'image est-ouest" + +#: ../src/vikwindow.c:4522 +msgid "North-south image tiles:" +msgstr "Nombre d'images nord-sud" + +#: ../src/vikwindow.c:4619 +msgid "This feature is not available in UTM mode" +msgstr "" + +#: ../src/vikwindow.c:4658 +#, c-format +msgid "Unable to import %s." +msgstr "" + +#: ../src/vikwindow.c:4749 +msgid "Choose a background color" +msgstr "Choisir une couleur de fond" + +#: ../src/vikwindow.c:4765 +msgid "Choose a track highlight color" +msgstr "Choix de la couleur de surbrillance" + +#: ../src/vikwindow.c:4814 +msgid "_File" +msgstr "_Fichier" + +#: ../src/vikwindow.c:4815 +msgid "_Edit" +msgstr "É_dition" + +#: ../src/vikwindow.c:4817 +msgid "_Show" +msgstr "_Afficher" + +#: ../src/vikwindow.c:4820 +msgid "_Layers" +msgstr "_Calques" + +#: ../src/vikwindow.c:4821 +msgid "_Tools" +msgstr "_Outils" + +#: ../src/vikwindow.c:4822 +msgid "_Webtools" +msgstr "_Outils web" + +#: ../src/vikwindow.c:4823 ../src/vikwindow.c:4893 +msgid "_Help" +msgstr "Aid_e" + +#: ../src/vikwindow.c:4825 +msgid "New file" +msgstr "Nouveau fichier" + +#: ../src/vikwindow.c:4826 +msgid "_Open..." +msgstr "_Ouvrir..." + +#: ../src/vikwindow.c:4826 +msgid "Open a file" +msgstr "Ouvrir un fichier" + +#: ../src/vikwindow.c:4827 +msgid "Open _Recent File" +msgstr "Ouvrir un fichier _récent" + +#: ../src/vikwindow.c:4828 +msgid "Append _File..." +msgstr "Joindre un fichier..." + +#: ../src/vikwindow.c:4828 +msgid "Append data from a different file" +msgstr "Ajouter des données d'un autre fichier" + +#: ../src/vikwindow.c:4829 +msgid "Open GPX as External _Layer..." +msgstr "" + +#: ../src/vikwindow.c:4829 +msgid "Open a GPX file as an external layer" +msgstr "" + +#: ../src/vikwindow.c:4830 +msgid "_Export All" +msgstr "" + +#: ../src/vikwindow.c:4830 +msgid "Export All TrackWaypoint Layers" +msgstr "" + +#: ../src/vikwindow.c:4831 +msgid "_GPX..." +msgstr "_GPX ..." + +#: ../src/vikwindow.c:4831 +msgid "Export as GPX" +msgstr "Exporter en GPX" + +#: ../src/vikwindow.c:4832 +msgid "A_cquire" +msgstr "_Récupérer" + +#: ../src/vikwindow.c:4833 +msgid "_Directions..." +msgstr "_Directions ..." + +#: ../src/vikwindow.c:4833 +msgid "Get driving directions" +msgstr "" + +#: ../src/vikwindow.c:4835 +msgid "_OSM Traces..." +msgstr "" + +#: ../src/vikwindow.c:4835 +msgid "Get traces from OpenStreetMap" +msgstr "" + +#: ../src/vikwindow.c:4836 +msgid "_My OSM Traces..." +msgstr "" + +#: ../src/vikwindow.c:4836 +msgid "Get Your Own Traces from OpenStreetMap" +msgstr "" + +#: ../src/vikwindow.c:4839 +msgid "Geo_caches..." +msgstr "Geo_caches..." + +#: ../src/vikwindow.c:4839 +msgid "Get Geocaches from geocaching.com" +msgstr "Récupérer des Geocaches à partir de geocaching.com" + +#: ../src/vikwindow.c:4842 +msgid "Create waypoints from geotagged images" +msgstr "" + +#: ../src/vikwindow.c:4844 +msgid "Get a file from a URL" +msgstr "" + +#: ../src/vikwindow.c:4846 +msgid "Create waypoints from Wikipedia items in the current view" +msgstr "" + +#: ../src/vikwindow.c:4848 +msgid "_Save" +msgstr "_Enregistrer" + +#: ../src/vikwindow.c:4848 +msgid "Save the file" +msgstr "Enregistrer le fichier" + +#: ../src/vikwindow.c:4849 +msgid "Save _As..." +msgstr "Enregistrer _sous..." + +#: ../src/vikwindow.c:4849 +msgid "Save the file under different name" +msgstr "Enregistrer le fichier sous un nom différent" + +#: ../src/vikwindow.c:4850 +msgid "Properties..." +msgstr "Propriétés …" + +#: ../src/vikwindow.c:4850 +msgid "File Properties" +msgstr "Propriétés du fichier" + +#: ../src/vikwindow.c:4852 +msgid "Import KMZ _Map File..." +msgstr "" + +#: ../src/vikwindow.c:4852 +msgid "Import a KMZ file" +msgstr "" + +#: ../src/vikwindow.c:4853 +msgid "Generate _KMZ Map File..." +msgstr "" + +#: ../src/vikwindow.c:4853 +msgid "Generate a KMZ file with an overlay of the current view" +msgstr "" + +#: ../src/vikwindow.c:4855 +msgid "_Generate Image File..." +msgstr "Enregistrer dans un fichier _image..." + +#: ../src/vikwindow.c:4855 +msgid "Save a snapshot of the workspace into a file" +msgstr "Enregistre une copie d'écran dans un fichier" + +#: ../src/vikwindow.c:4856 +msgid "Generate _Directory of Images..." +msgstr "Générer un _répertoire d'images..." + +#: ../src/vikwindow.c:4856 +msgid "Generate _Directory of Images" +msgstr "" + +#: ../src/vikwindow.c:4857 +msgid "_Print..." +msgstr "_Imprimer…" + +#: ../src/vikwindow.c:4857 +msgid "Print maps" +msgstr "Imprimer les cartes" + +#: ../src/vikwindow.c:4858 +msgid "E_xit" +msgstr "_Quitter" + +#: ../src/vikwindow.c:4858 +msgid "Exit the program" +msgstr "Quitter le programme" + +#: ../src/vikwindow.c:4859 +msgid "Save and Exit" +msgstr "Enregistrer et quitter" + +#: ../src/vikwindow.c:4859 +msgid "Save and Exit the program" +msgstr "Enregistrer et quitter le programme" + +#: ../src/vikwindow.c:4861 +msgid "Go to the Pre_vious Location" +msgstr "" + +#: ../src/vikwindow.c:4861 +msgid "Go to the previous location" +msgstr "" + +#: ../src/vikwindow.c:4862 +msgid "Go to the _Next Location" +msgstr "" + +#: ../src/vikwindow.c:4862 +msgid "Go to the next location" +msgstr "" + +#: ../src/vikwindow.c:4863 +msgid "Go to the _Default Location" +msgstr "Aller à la position par _défaut" + +#: ../src/vikwindow.c:4863 +msgid "Go to the default location" +msgstr "Aller à la position par _défaut" + +#: ../src/vikwindow.c:4864 +#, fuzzy +msgid "Go to the _Auto Location" +msgstr "Aller à la position par _défaut" + +#: ../src/vikwindow.c:4864 +msgid "Go to a location via automatic lookup" +msgstr "" + +#: ../src/vikwindow.c:4865 +msgid "Go to _Location..." +msgstr "Aller à la _position..." + +#: ../src/vikwindow.c:4865 +msgid "Go to address/place using text search" +msgstr "Aller à une adresse/lieu en utilisant une recherche textuelle" + +#: ../src/vikwindow.c:4866 +msgid "_Go to Lat/Lon..." +msgstr "Choisir la _latitude/longitude…" + +#: ../src/vikwindow.c:4866 +msgid "Go to arbitrary lat/lon coordinate" +msgstr "Aller à une coordonnée lat/lon donnée" + +#: ../src/vikwindow.c:4867 +msgid "Go to UTM..." +msgstr "Choisir une coordonnée UTM…" + +#: ../src/vikwindow.c:4867 +msgid "Go to arbitrary UTM coordinate" +msgstr "Aller à une coordonnée UTM donnée" + +#: ../src/vikwindow.c:4868 +#, fuzzy +msgid "Go to Today" +msgstr "Aller à une coordonnée UTM" + +#: ../src/vikwindow.c:4868 +msgid "Go to today on the calendar" +msgstr "" + +#: ../src/vikwindow.c:4869 +msgid "_Refresh" +msgstr "" + +#: ../src/vikwindow.c:4869 +msgid "Refresh any maps displayed" +msgstr "" + +#: ../src/vikwindow.c:4870 +msgid "Set _Highlight Color..." +msgstr "" + +#: ../src/vikwindow.c:4870 +msgid "Set Highlight Color" +msgstr "" + +#: ../src/vikwindow.c:4871 +msgid "Set Bac_kground Color..." +msgstr "Modifier la _couleur de fond…" + +#: ../src/vikwindow.c:4871 +msgid "Set Background Color" +msgstr "" + +#: ../src/vikwindow.c:4872 +msgid "Zoom _In" +msgstr "Zoom _avant" + +#: ../src/vikwindow.c:4872 +msgid "Zoom In" +msgstr "" + +#: ../src/vikwindow.c:4873 +msgid "Zoom _Out" +msgstr "Zoom a_rrière" + +#: ../src/vikwindow.c:4873 +msgid "Zoom Out" +msgstr "" + +#: ../src/vikwindow.c:4874 +msgid "Zoom _To..." +msgstr "_Zoom…" + +#: ../src/vikwindow.c:4874 +msgid "Zoom To" +msgstr "" + +#: ../src/vikwindow.c:4875 +msgid "Pan _North" +msgstr "Déplacer vers le _Nord" + +#: ../src/vikwindow.c:4876 +msgid "Pan _East" +msgstr "Déplacer vers l'_Est" + +#: ../src/vikwindow.c:4877 +msgid "Pan _South" +msgstr "Déplacer vers le _Sud" + +#: ../src/vikwindow.c:4878 +msgid "Pan _West" +msgstr "Déplacer vers l'_Ouest" + +#: ../src/vikwindow.c:4879 +msgid "Background _Jobs" +msgstr "Tâches de fond" + +#: ../src/vikwindow.c:4879 +msgid "Background Jobs" +msgstr "" + +#: ../src/vikwindow.c:4881 +msgid "Cu_t" +msgstr "Co_uper" + +#: ../src/vikwindow.c:4885 +msgid "Delete All" +msgstr "Tout effacer" + +#: ../src/vikwindow.c:4886 +msgid "Copy Centre _Location" +msgstr "" + +#: ../src/vikwindow.c:4887 +msgid "_Flush Map Cache" +msgstr "Vider le cache des cartes" + +#: ../src/vikwindow.c:4888 +msgid "_Set the Default Location" +msgstr "_Fixer la position par défaut" + +#: ../src/vikwindow.c:4888 +msgid "Set the Default Location to the current position" +msgstr "Fixer la position par défaut à la position courante" + +#: ../src/vikwindow.c:4889 +msgid "_Preferences" +msgstr "_Préférences" + +#: ../src/vikwindow.c:4889 +msgid "Program Preferences" +msgstr "" + +#: ../src/vikwindow.c:4890 +msgid "_Layer Defaults" +msgstr "" + +#: ../src/vikwindow.c:4891 +msgid "_Properties" +msgstr "Propriétés" + +#: ../src/vikwindow.c:4893 +msgid "Help" +msgstr "" + +#: ../src/vikwindow.c:4894 +msgid "_About" +msgstr "À _propos" + +#: ../src/vikwindow.c:4894 +msgid "About" +msgstr "" + +#: ../src/vikwindow.c:4903 +msgid "_KML..." +msgstr "_KML ..." + +#: ../src/vikwindow.c:4903 +msgid "Export as KML" +msgstr "Exporter en KML" + +#: ../src/vikwindow.c:4904 +msgid "Transfer data from a GPS device" +msgstr "Récupérer des données d'un GPS" + +#: ../src/vikwindow.c:4905 +msgid "Import file via GPSBabel converter" +msgstr "" + +#: ../src/vikwindow.c:4909 +msgid "Import Geo_JSON File..." +msgstr "" + +#: ../src/vikwindow.c:4909 +msgid "Import GeoJSON file" +msgstr "" + +#: ../src/vikwindow.c:4914 +msgid "_UTM Mode" +msgstr "Mode _UTM" + +#: ../src/vikwindow.c:4915 +msgid "_Expedia Mode" +msgstr "Mode _Expedia" + +#: ../src/vikwindow.c:4916 +msgid "_Mercator Mode" +msgstr "Mode _Mercator" + +#: ../src/vikwindow.c:4917 +msgid "Lat_/Lon Mode" +msgstr "Mode Lat_/Lon" + +#: ../src/vikwindow.c:4921 +msgid "Show _Scale" +msgstr "Afficher _Echelle" + +#: ../src/vikwindow.c:4921 +msgid "Show Scale" +msgstr "Afficher l'échelle" + +#: ../src/vikwindow.c:4922 +msgid "Show _Center Mark" +msgstr "Afficher la croix _centrale" + +#: ../src/vikwindow.c:4922 +msgid "Show Center Mark" +msgstr "Afficher la croix centrale" + +#: ../src/vikwindow.c:4923 +msgid "Show _Highlight" +msgstr "" + +#: ../src/vikwindow.c:4923 +msgid "Show Highlight" +msgstr "" + +#: ../src/vikwindow.c:4924 +msgid "_Full Screen" +msgstr "_Plein écran" + +#: ../src/vikwindow.c:4924 +msgid "Activate full screen mode" +msgstr "Activer le mode plein écran" + +#: ../src/vikwindow.c:4925 +msgid "Show Side _Panel" +msgstr "Afficher _Panneau Latéral" + +#: ../src/vikwindow.c:4925 +msgid "Show Side Panel" +msgstr "Afficher le panneau latéral" + +#: ../src/vikwindow.c:4926 +msgid "Show Status_bar" +msgstr "Afficher la _barre de statut" + +#: ../src/vikwindow.c:4926 +msgid "Show Statusbar" +msgstr "Afficher la barre de statut" + +#: ../src/vikwindow.c:4927 +msgid "Show _Toolbar" +msgstr "Afficher la barre d'ou_tils" + +#: ../src/vikwindow.c:4927 +msgid "Show Toolbar" +msgstr "Afficher la barre d'outils" + +#: ../src/vikwindow.c:4928 +msgid "Show _Menu" +msgstr "" + +#: ../src/vikwindow.c:4928 +msgid "Show Menu" +msgstr "Afficher le menu" + +#: ../src/vikwindow.c:4929 +#, fuzzy +msgid "Show Side Panel B_uttons" +msgstr "Afficher le panneau latéral" + +#: ../src/vikwindow.c:4929 +#, fuzzy +msgid "Show Side Panel Buttons" +msgstr "Afficher le panneau latéral" + +#: ../src/vikwindow.c:4930 +#, fuzzy +msgid "Show Side Panel Ca_lendar" +msgstr "Afficher le panneau latéral" + +#: ../src/vikwindow.c:4930 +#, fuzzy +msgid "Show Side Panel Calendar" +msgstr "Afficher le panneau latéral" + +#: ../src/vikwindow.c:5064 +#, c-format +msgid "New _%s Layer" +msgstr "Nouvelle couche %s" + +#: ../src/vikwindow.c:5114 +#, fuzzy +msgid "..." +msgstr "Ajouter…" + +#: ../src/viking.desktop.in.h:2 +msgid "GPS Data Manager" +msgstr "Gestionnaire de données GPS" + +#: ../src/viking.desktop.in.h:3 +msgid "Map Based GPS Data Manager (live data capable)." +msgstr "" +"Gestionnaire de données GPS basées sur des cartes (possibilité de données en " +"direct)" + +#: ../src/libjpeg/jpeg-data.c:205 +msgid "Data does not follow JPEG specification." +msgstr "" + +#: ../src/libjpeg/jpeg-data.c:302 +#, c-format +msgid "Path '%s' invalid." +msgstr "" + +#: ../src/libjpeg/jpeg-data.c:320 +#, c-format +msgid "Could not read '%s'." +msgstr "" + +#~ msgid "en" +#~ msgstr "Anglais" + +#~ msgid "Polygonzied Layer" +#~ msgstr "Calque polygonial" + +#~ msgid "Email:" +#~ msgstr "Email :" + +#~ msgid "I don't know that place. Do you want another goto?" +#~ msgstr "" +#~ "Je ne connais pas ce lieu. Souhaitez-vous faire une nouvelle recherche?" + +#~ msgid "Error: couldn't find gpsbabel." +#~ msgstr "Erreur: impossible de trouver gpsbabel." + +#~ msgid "Create _Track" +#~ msgstr "Créer une _Trace" + +#~ msgid "Create Track" +#~ msgstr "Créer une trace" + +#~ msgid "Create _Route" +#~ msgstr "Créer un itiné_raire" + +#~ msgid "Create Route" +#~ msgstr "Créer un itinéraire" + +#~ msgid "%.2f knots\n" +#~ msgstr "%.2f nœuds\n" diff --git a/po/he.po b/po/he.po new file mode 100644 index 0000000..57bea5e --- /dev/null +++ b/po/he.po @@ -0,0 +1,6071 @@ +# Hebrew translation for viking +# Copyright (c) 2008 Rosetta Contributors and Canonical Ltd 2008 +# This file is distributed under the same license as the viking package. +# FIRST AUTHOR , 2008. +# +msgid "" +msgstr "" +"Project-Id-Version: viking\n" +"Report-Msgid-Bugs-To: \n" +"POT-Creation-Date: 2019-01-19 12:53+0000\n" +"PO-Revision-Date: 2008-08-18 20:47+0000\n" +"Last-Translator: Krylov Ilya \n" +"Language-Team: Hebrew \n" +"Language: he\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-Launchpad-Export-Date: 2018-12-21 17:32+0000\n" +"X-Generator: Launchpad (build 18847)\n" + +#: ../src/acquire.c:106 ../src/vikgpslayer.c:1367 +msgid "Done." +msgstr "" + +#: ../src/acquire.c:115 +msgid "No data." +msgstr "" + +#: ../src/acquire.c:167 ../src/acquire.c:415 +msgid "Error: acquisition failed." +msgstr "" + +#: ../src/acquire.c:339 +msgid "Working..." +msgstr "עובד..." + +#. This shouldn't happen... +#: ../src/acquire.c:406 +msgid "" +"Unable to create command\n" +"Acquire method failed." +msgstr "" + +#: ../src/acquire.c:513 +msgid "_Filter" +msgstr "" + +#: ../src/acquire.c:528 +#, c-format +msgid "Filter with %s" +msgstr "" + +#: ../src/acquire.c:545 +msgid "Filter" +msgstr "" + +#: ../src/babel.c:640 +msgid "GPSBabel:" +msgstr "" + +#: ../src/babel.c:641 +msgid "" +"Allow setting the specific instance of GPSBabel. You must restart Viking for " +"this value to take effect." +msgstr "" + +#: ../src/babel_ui.c:79 +msgid "Select a file format" +msgstr "" + +#: ../src/babel_ui.c:144 ../src/viktrwlayer.c:531 ../src/viktrwlayer.c:2882 +msgid "Tracks" +msgstr "" + +#: ../src/babel_ui.c:149 ../src/viktrwlayer.c:2892 +msgid "Routes" +msgstr "" + +#. ***** PARAMETERS ***** +#: ../src/babel_ui.c:154 ../src/viktrwlayer.c:531 ../src/viktrwlayer.c:2887 +msgid "Waypoints" +msgstr "" + +#: ../src/background.c:64 +#, c-format +msgid "%d items" +msgstr "" + +#: ../src/background.c:287 +msgid "Threads:" +msgstr "" + +#: ../src/background.c:288 +msgid "" +"Number of threads to use for Mapnik tasks. You need to restart Viking for a " +"change to this value to be used" +msgstr "" + +#: ../src/background.c:361 +msgid "Job" +msgstr "" + +#: ../src/background.c:365 +msgid "Progress" +msgstr "" + +#: ../src/background.c:373 +msgid "Viking Background Jobs" +msgstr "" + +#: ../src/bing.c:42 +msgid "Bing Aerial" +msgstr "" + +#: ../src/bing.c:48 +msgid "Bing" +msgstr "" + +#. VIK_GTK_WINDOW_FROM_WIDGET(vp) +#: ../src/bingmapsource.c:514 +msgid "Bing attribution Loading" +msgstr "" + +#: ../src/clipboard.c:95 +msgid "paste failed" +msgstr "" + +#: ../src/clipboard.c:105 +msgid "wrong clipboard data size" +msgstr "" + +#: ../src/clipboard.c:124 +#, c-format +msgid "" +"The clipboard contains sublayer data for %s layers. You must select a layer " +"of this type to paste the clipboard data." +msgstr "" + +#: ../src/clipboard.c:264 +msgid "" +"In order to paste a waypoint, please select an appropriate layer to paste " +"into." +msgstr "" + +#: ../src/dialog.c:60 +msgid "Go to Lat/Lon" +msgstr "" + +#: ../src/dialog.c:69 ../src/viktrwlayer_wpwin.c:173 +msgid "Latitude:" +msgstr "" + +#: ../src/dialog.c:72 ../src/viktrwlayer_wpwin.c:177 +msgid "Longitude:" +msgstr "" + +#: ../src/dialog.c:102 +msgid "Go to UTM" +msgstr "" + +#: ../src/dialog.c:114 +msgid "Northing:" +msgstr "" + +#: ../src/dialog.c:117 +msgid "Easting:" +msgstr "" + +#: ../src/dialog.c:121 ../src/vikgeoreflayer.c:902 +msgid "Zone:" +msgstr "" + +#: ../src/dialog.c:124 ../src/vikgeoreflayer.c:904 +msgid "Letter:" +msgstr "" + +#: ../src/dialog.c:246 ../src/geonamessearch.c:238 +#: ../src/datasource_osm_my_traces.c:505 +msgid "Nothing was selected" +msgstr "" + +#: ../src/dialog.c:254 +msgid "Add Route" +msgstr "" + +#: ../src/dialog.c:254 +msgid "Add Track" +msgstr "" + +#: ../src/dialog.c:262 +msgid "Route Name:" +msgstr "" + +#: ../src/dialog.c:262 +msgid "Track Name:" +msgstr "" + +#: ../src/dialog.c:282 +msgid "Please enter a name for the track." +msgstr "" + +#: ../src/dialog.c:311 +msgid "Today" +msgstr "" + +#: ../src/dialog.c:393 +msgid "Zoom Factors..." +msgstr "" + +#: ../src/dialog.c:407 +msgid "Zoom factor (in meters per pixel):" +msgstr "" + +#: ../src/dialog.c:408 +msgid "X (easting): " +msgstr "" + +#: ../src/dialog.c:409 +msgid "Y (northing): " +msgstr "" + +#: ../src/dialog.c:414 +msgid "X and Y zoom factors must be equal" +msgstr "" + +#: ../src/dialog.c:469 +msgid "1 min" +msgstr "" + +#: ../src/dialog.c:470 +msgid "1 hour" +msgstr "" + +#: ../src/dialog.c:471 +msgid "1 day" +msgstr "" + +#: ../src/dialog.c:472 +msgid "Custom (in minutes):" +msgstr "" + +#: ../src/dialog.c:608 +#, c-format +msgid "" +"2003-2008, Evan Battaglia\n" +"2008-%s, Viking's contributors" +msgstr "" + +#: ../src/dialog.c:609 +msgid "GPS Data and Topo Analyzer, Explorer, and Manager." +msgstr "" + +#: ../src/dialog.c:610 +msgid "" +"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.\n" +"\n" +"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.\n" +"\n" +"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., 59 Temple " +"Place, Suite 330, Boston, MA 02111-1307, USA" +msgstr "" + +#: ../src/dialog.c:703 +msgid "Translation is coordinated on http://launchpad.net/viking" +msgstr "" + +#: ../src/dialog.c:713 +msgid "Download along track" +msgstr "" + +#: ../src/dialog.c:720 +msgid "Map type:" +msgstr "" + +#: ../src/dialog.c:726 +msgid "Zoom level:" +msgstr "" + +#: ../src/dialog.c:766 +#, c-format +msgid "The map data is licensed: %s." +msgstr "" + +#: ../src/dialog.c:769 +#, c-format +msgid "" +"The data provided by '%s' are licensed under the following license: " +"%s." +msgstr "" + +#: ../src/dialog.c:773 +msgid "Open license" +msgstr "" + +#: ../src/expedia.c:54 +msgid "Expedia Street Maps" +msgstr "" + +#: ../src/expedia.c:82 +msgid "Invalid expedia altitude" +msgstr "" + +#: ../src/expedia.c:113 +#, c-format +msgid "" +"Couldn't open EXPEDIA image file (right after successful download! Please " +"report and delete image file!): %s" +msgstr "" + +#: ../src/expedia.c:126 +#, c-format +msgid "" +"Couldn't save EXPEDIA image file (right after successful download! Please " +"report and delete image file!): %s" +msgstr "" + +#: ../src/geonamessearch.c:115 +msgid "Search" +msgstr "" + +#: ../src/geonamessearch.c:117 +msgid "No entries found!" +msgstr "" + +#. NB could allow columns to be shifted around by doing this after each new +#. gtk_tree_view_column_set_reorderable ( column, TRUE ); +#. However I don't think is that useful, so I haven't put it in +#: ../src/geonamessearch.c:171 ../src/datasource_osm_my_traces.c:422 +#: ../src/viktrwlayer_tracklist.c:621 ../src/viktrwlayer_waypointlist.c:618 +msgid "Name" +msgstr "" + +#: ../src/geonamessearch.c:176 +msgid "Feature" +msgstr "" + +#: ../src/geonamessearch.c:181 ../src/datasource_osm_my_traces.c:437 +msgid "Lat/Lon" +msgstr "" + +#: ../src/geonamessearch.c:264 ../src/googlesearch.c:101 ../src/vikgoto.c:430 +msgid "couldn't map temp file" +msgstr "" + +#: ../src/geonamessearch.c:459 +msgid "Select articles" +msgstr "" + +#: ../src/geonamessearch.c:459 +msgid "Select the articles you want to add." +msgstr "" + +#: ../src/geonamessearch.c:475 +msgid "city" +msgstr "" + +#: ../src/geonamessearch.c:477 +msgid "edu" +msgstr "" + +#: ../src/geonamessearch.c:479 +msgid "airport" +msgstr "" + +#: ../src/geonamessearch.c:481 +msgid "mountain" +msgstr "" + +#: ../src/geonamessearch.c:483 +msgid "forest" +msgstr "" + +#: ../src/geonamessearch.c:485 +msgid "church" +msgstr "" + +#: ../src/geojson.c:74 +#, c-format +msgid "%s command failed: %s" +msgstr "" + +#: ../src/geojson.c:146 ../src/gpx.c:1317 +#, c-format +msgid "failed to open temporary file: %s" +msgstr "" + +#: ../src/globals.c:67 +msgid "DDD" +msgstr "" + +#: ../src/globals.c:67 +msgid "DMM" +msgstr "" + +#: ../src/globals.c:67 +msgid "DMS" +msgstr "" + +#: ../src/globals.c:67 +msgid "Raw" +msgstr "" + +#: ../src/globals.c:68 +msgid "Kilometres" +msgstr "" + +#: ../src/globals.c:68 +msgid "Miles" +msgstr "" + +#: ../src/globals.c:68 +msgid "Nautical Miles" +msgstr "" + +#. VIK_UNITS_SPEED_KILOMETRES_PER_HOUR: +#: ../src/globals.c:69 ../src/viktrwlayer_tracklist.c:655 ../src/vikutils.c:100 +msgid "km/h" +msgstr "" + +#: ../src/globals.c:69 ../src/viktrwlayer_tracklist.c:656 ../src/vikutils.c:78 +msgid "mph" +msgstr "" + +#. VIK_UNITS_SPEED_METRES_PER_SECOND: +#: ../src/globals.c:69 ../src/viktrwlayer_tracklist.c:663 ../src/vikutils.c:81 +msgid "m/s" +msgstr "" + +#: ../src/globals.c:69 ../src/viktrwlayer_tracklist.c:657 ../src/vikutils.c:84 +msgid "knots" +msgstr "" + +#: ../src/globals.c:69 ../src/viktrwlayer_tracklist.c:658 ../src/vikutils.c:87 +msgid "s/km" +msgstr "" + +#: ../src/globals.c:69 ../src/viktrwlayer_tracklist.c:659 ../src/vikutils.c:90 +msgid "min/km" +msgstr "" + +#: ../src/globals.c:69 +msgid "s/mi" +msgstr "" + +#: ../src/globals.c:69 ../src/viktrwlayer_tracklist.c:661 ../src/vikutils.c:96 +msgid "min/mi" +msgstr "" + +#: ../src/globals.c:70 +msgid "Metres" +msgstr "" + +#: ../src/globals.c:70 +msgid "Feet" +msgstr "" + +#: ../src/globals.c:73 +msgid "Locale" +msgstr "" + +#: ../src/globals.c:73 +msgid "World" +msgstr "" + +#: ../src/globals.c:73 +msgid "UTC" +msgstr "" + +#: ../src/globals.c:76 +msgid "Degree format:" +msgstr "" + +#: ../src/globals.c:77 +msgid "Distance units:" +msgstr "" + +#: ../src/globals.c:78 +msgid "Speed units:" +msgstr "" + +#: ../src/globals.c:79 +msgid "Height units:" +msgstr "" + +#: ../src/globals.c:80 +msgid "Use large waypoint icons:" +msgstr "" + +#: ../src/globals.c:81 +msgid "Default latitude:" +msgstr "" + +#: ../src/globals.c:82 +msgid "Default longitude:" +msgstr "" + +#: ../src/globals.c:83 +msgid "Time Display:" +msgstr "" + +#: ../src/globals.c:84 +msgid "" +"Display times according to the reference frame. Locale is the user's system " +"setting. World is relative to the location of the object." +msgstr "" + +#: ../src/globals.c:90 +msgid "Alphabetical" +msgstr "" + +#: ../src/globals.c:90 ../src/datasource_osm_my_traces.c:432 +msgid "Time" +msgstr "" + +#: ../src/globals.c:90 +msgid "Creation" +msgstr "" + +#: ../src/globals.c:91 +msgid "Title Case" +msgstr "" + +#: ../src/globals.c:91 +msgid "Lowercase" +msgstr "" + +#: ../src/globals.c:94 +msgid "KML File Export Units:" +msgstr "" + +#: ../src/globals.c:95 +msgid "GPX Track Order:" +msgstr "" + +#: ../src/globals.c:96 +msgid "GPX Waypoint Symbols:" +msgstr "" + +#: ../src/globals.c:97 +msgid "" +"Save GPX Waypoint Symbol names in the specified case. May be useful for " +"compatibility with various devices" +msgstr "" + +#: ../src/globals.c:98 +msgid "GPX Creator:" +msgstr "" + +#: ../src/globals.c:99 +msgid "" +"The creator value when writing a GPX file. Otherwise when blank a default is " +"used." +msgstr "" + +#: ../src/globals.c:104 +msgid "Image Viewer:" +msgstr "" + +#: ../src/globals.c:109 +msgid "External GPX Program 1:" +msgstr "" + +#: ../src/globals.c:110 +msgid "External GPX Program 2:" +msgstr "" + +#: ../src/globals.c:113 +msgid "Absolute" +msgstr "" + +#: ../src/globals.c:113 +msgid "Relative" +msgstr "" + +#: ../src/globals.c:117 +msgid "Save File Reference Mode:" +msgstr "" + +#: ../src/globals.c:118 +msgid "" +"When saving a Viking .vik file, this determines how the directory paths of " +"filenames are written." +msgstr "" + +#: ../src/globals.c:119 +msgid "Ask for Name before Track Creation:" +msgstr "" + +#: ../src/globals.c:120 +msgid "Show Tooltip during Track Creation:" +msgstr "" + +#: ../src/globals.c:121 +msgid "The number of recent files:" +msgstr "" + +#: ../src/globals.c:122 +msgid "" +"Only applies to new windows or on application restart. -1 means all " +"available files." +msgstr "" + +#: ../src/globals.c:123 +msgid "Open files in selected layer:" +msgstr "" + +#: ../src/globals.c:124 +msgid "Open files (but not .vik ones) into the selected TrackWaypoint layer." +msgstr "" + +#: ../src/globals.c:125 +msgid "Show calendar day names:" +msgstr "" + +#: ../src/globals.c:128 +msgid "Home Location" +msgstr "" + +#: ../src/globals.c:128 +msgid "Last Location" +msgstr "" + +#: ../src/globals.c:128 +msgid "Specified File" +msgstr "" + +#: ../src/globals.c:128 +msgid "Auto Location" +msgstr "" + +#: ../src/globals.c:131 +msgid "Restore Window Setup:" +msgstr "" + +#: ../src/globals.c:132 +msgid "Restore window size and layout" +msgstr "" + +#: ../src/globals.c:133 +msgid "Add a Default Map Layer:" +msgstr "" + +#: ../src/globals.c:134 +msgid "" +"The default map layer added is defined by the Layer Defaults. Use the menu " +"Edit->Layer Defaults->Map... to change the map type and other values." +msgstr "" + +#: ../src/globals.c:135 +msgid "Startup Method:" +msgstr "" + +#: ../src/globals.c:136 +msgid "Startup File:" +msgstr "" + +#: ../src/globals.c:137 +msgid "" +"The default file to load on startup. Only applies when the startup method is " +"set to 'Specified File'" +msgstr "" + +#: ../src/globals.c:138 +msgid "Check For New Version:" +msgstr "" + +#: ../src/globals.c:139 +msgid "Periodically check to see if a new version of Viking is available" +msgstr "" + +#. Defaults for the options are setup here +#: ../src/globals.c:176 +msgid "General" +msgstr "" + +#. New Tab +#: ../src/globals.c:204 +msgid "Startup" +msgstr "" + +#. New Tab +#: ../src/globals.c:222 +msgid "Export/External" +msgstr "" + +#. 'Advanced' Properties +#: ../src/globals.c:249 +msgid "Advanced" +msgstr "" + +#. Webtools +#: ../src/google.c:39 +msgid "Google" +msgstr "" + +#. If there is an actual description field it will overwrite this value +#: ../src/gpx.c:264 +#, c-format +msgid "Created by: %s" +msgstr "" + +#: ../src/datasource_bfilter.c:43 +msgid "Max number of points:" +msgstr "" + +#: ../src/datasource_bfilter.c:84 +msgid "Simplify All Tracks..." +msgstr "" + +#: ../src/datasource_bfilter.c:85 +msgid "Simplified Tracks" +msgstr "" + +#. { VIK_LAYER_NUM_TYPES, "compressmethod", VIK_LAYER_PARAM_UINT, VIK_LAYER_GROUP_NONE, N_("Simplify Method:"), VIK_LAYER_WIDGET_COMBOBOX, compress_method, NULL, NULL, NULL, NULL, NULL }, +#: ../src/datasource_bfilter.c:111 +msgid "Error Factor:" +msgstr "" + +#: ../src/datasource_bfilter.c:112 +msgid "" +"Specifies the maximum allowable error that may be introduced by removing a " +"single point by the crosstrack method. See the manual or GPSBabel Simplify " +"Filter documentation for more detail." +msgstr "" + +#: ../src/datasource_bfilter.c:166 +msgid "Compress Tracks..." +msgstr "" + +#: ../src/datasource_bfilter.c:167 +msgid "Compressed Tracks" +msgstr "" + +#: ../src/datasource_bfilter.c:197 ../src/datasource_bfilter.c:198 +msgid "Remove Duplicate Waypoints" +msgstr "" + +#: ../src/datasource_bfilter.c:221 +msgid "Manual filter:" +msgstr "" + +#: ../src/datasource_bfilter.c:222 +msgid "Manual filter command: e.g. 'swap'." +msgstr "" + +#: ../src/datasource_bfilter.c:233 ../src/datasource_bfilter.c:234 +msgid "Manual filter" +msgstr "" + +#: ../src/datasource_bfilter.c:262 +msgid "Waypoints Inside This" +msgstr "" + +#: ../src/datasource_bfilter.c:263 ../src/datasource_bfilter.c:292 +msgid "Polygonized Layer" +msgstr "" + +#: ../src/datasource_bfilter.c:291 +msgid "Waypoints Outside This" +msgstr "" + +#: ../src/datasource_file.c:61 +msgid "Import file with GPSBabel" +msgstr "" + +#: ../src/datasource_file.c:62 +msgid "Imported file" +msgstr "" + +#. The file selector +#: ../src/datasource_file.c:129 +msgid "File:" +msgstr "" + +#: ../src/datasource_file.c:130 +msgid "File to import" +msgstr "" + +#: ../src/datasource_file.c:137 +msgid "All files" +msgstr "" + +#. The file format selector +#: ../src/datasource_file.c:144 ../src/datasource_url.c:106 +msgid "File type:" +msgstr "" + +#: ../src/datasource_file.c:189 +#, c-format +msgid "using babel args '%s' and file '%s'" +msgstr "" + +#: ../src/datasource_gc.c:67 +msgid "Download Geocaches" +msgstr "" + +#: ../src/datasource_gc.c:68 +msgid "Geocaching.com Caches" +msgstr "" + +#: ../src/datasource_gc.c:86 +msgid "geocaching.com username:" +msgstr "" + +#: ../src/datasource_gc.c:87 +msgid "geocaching.com password:" +msgstr "" + +#: ../src/datasource_gc.c:92 ../src/vikwindow.c:3502 +msgid "Geocaching" +msgstr "" + +#: ../src/datasource_gc.c:128 +#, c-format +msgid "" +"Can't find %s or %s in path! Check that you have installed it correctly." +msgstr "" + +#: ../src/datasource_gc.c:190 +msgid "Number geocaches:" +msgstr "" + +#: ../src/datasource_gc.c:192 +msgid "Centered around:" +msgstr "" + +#: ../src/datasource_gc.c:231 +msgid "Broken input - using some defaults" +msgstr "" + +#: ../src/datasource_geotag.c:51 +msgid "Create Waypoints from Geotagged Images" +msgstr "" + +#: ../src/datasource_geotag.c:52 +msgid "Geotagged Images" +msgstr "" + +#: ../src/datasource_geotag.c:102 ../src/datasource_geojson.c:93 +#: ../src/vikfileentry.c:171 ../src/vikwindow.c:3533 ../src/vikwindow.c:3610 +#: ../src/vikwindow.c:3641 ../src/vikwindow.c:4356 ../src/vikwindow.c:4649 +msgid "All" +msgstr "" + +#: ../src/datasource_geotag.c:107 ../src/vikfileentry.c:115 +#: ../src/viktrwlayer_geotag.c:637 ../src/vikwindow.c:3518 +#: ../src/vikwindow.c:4377 +msgid "JPG" +msgstr "" + +#: ../src/datasource_geotag.c:168 +#, c-format +msgid "Unable to create waypoint from %s" +msgstr "" + +#: ../src/datasource_geojson.c:46 +msgid "Acquire from GeoJSON" +msgstr "" + +#: ../src/datasource_geojson.c:47 ../src/datasource_geojson.c:98 +msgid "GeoJSON" +msgstr "" + +#: ../src/datasource_geojson.c:152 +#, c-format +msgid "Unable to import from: %s" +msgstr "" + +#: ../src/datasource_gps.c:54 +msgid "Acquire from GPS" +msgstr "" + +#: ../src/datasource_gps.c:55 +msgid "Acquired from GPS" +msgstr "" + +#: ../src/datasource_gps.c:258 +#, c-format +msgid "using cmd '%s' and file '%s'\n" +msgstr "" + +#: ../src/datasource_gps.c:353 ../src/vikgpslayer.c:966 +#, c-format +msgid "Downloading %d waypoint..." +msgid_plural "Downloading %d waypoints..." +msgstr[0] "" +msgstr[1] "" + +#: ../src/datasource_gps.c:358 ../src/vikgpslayer.c:971 +#, c-format +msgid "Downloading %d trackpoint..." +msgid_plural "Downloading %d trackpoints..." +msgstr[0] "" +msgstr[1] "" + +#: ../src/datasource_gps.c:363 ../src/vikgpslayer.c:976 +#, c-format +msgid "Downloading %d routepoint..." +msgid_plural "Downloading %d routepoints..." +msgstr[0] "" +msgstr[1] "" + +#: ../src/datasource_gps.c:386 ../src/datasource_gps.c:393 +#: ../src/datasource_gps.c:400 +#, c-format +msgid "Downloaded %d out of %d %s..." +msgstr "" + +#: ../src/datasource_gps.c:388 ../src/datasource_gps.c:395 +#: ../src/datasource_gps.c:402 +#, c-format +msgid "Downloaded %d %s." +msgstr "" + +#: ../src/datasource_gps.c:416 ../src/vikgpslayer.c:1134 +#, c-format +msgid "GPS Device: %s" +msgstr "" + +#: ../src/datasource_gps.c:428 ../src/vikgpslayer.c:1214 +msgid "Status: Working..." +msgstr "" + +#. NB gps_layer_inst_init() is performed after parameter registeration +#. thus to give the protocols some potential values use the old static list +#. TODO: find another way to use gps_layer_inst_init()? +#: ../src/datasource_gps.c:584 ../src/vikgpslayer.c:216 +msgid "GPS Protocol:" +msgstr "" + +#. List reassigned at runtime +#: ../src/datasource_gps.c:609 ../src/vikgpslayer.c:217 +msgid "Serial Port:" +msgstr "" + +#: ../src/datasource_gps.c:659 +msgid "" +"Turn Off After Transfer\n" +"(Garmin/NAViLink Only)" +msgstr "" + +#: ../src/datasource_gps.c:666 +msgid "Tracks:" +msgstr "" + +#: ../src/datasource_gps.c:673 +msgid "Routes:" +msgstr "" + +#: ../src/datasource_gps.c:680 +msgid "Waypoints:" +msgstr "" + +#: ../src/datasource_gps.c:756 ../src/vikgpslayer.c:1509 +msgid "GPS device: N/A" +msgstr "" + +#: ../src/datasource_osm.c:53 ../src/datasource_osm.c:54 +msgid "OSM traces" +msgstr "" + +#: ../src/datasource_osm.c:89 +msgid "Page number:" +msgstr "" + +#: ../src/datasource_osm_my_traces.c:59 ../src/datasource_osm_my_traces.c:60 +msgid "OSM My Traces" +msgstr "" + +#: ../src/datasource_osm_my_traces.c:106 ../src/osm-traces.c:684 +msgid "Email/username:" +msgstr "" + +#: ../src/datasource_osm_my_traces.c:111 +msgid "The email or username used to login to OSM" +msgstr "" + +#: ../src/datasource_osm_my_traces.c:113 ../src/osm-traces.c:692 +msgid "Password:" +msgstr "" + +#: ../src/datasource_osm_my_traces.c:116 +msgid "The password used to login to OSM" +msgstr "" + +#: ../src/datasource_osm_my_traces.c:427 ../src/viktrwlayer.c:689 +msgid "Description" +msgstr "" + +#: ../src/datasource_osm_my_traces.c:442 +msgid "Privacy" +msgstr "" + +#: ../src/datasource_osm_my_traces.c:449 +msgid "Within Current View" +msgstr "" + +#: ../src/datasource_osm_my_traces.c:516 +msgid "GPS Traces" +msgstr "" + +#: ../src/datasource_osm_my_traces.c:518 +msgid "None found!" +msgstr "" + +#: ../src/datasource_osm_my_traces.c:569 +msgid "Ensure the OSM access token preferences are setup." +msgstr "" + +#: ../src/datasource_osm_my_traces.c:645 +msgid "My OSM Traces" +msgstr "" + +#. Report errors to the status bar +#: ../src/datasource_osm_my_traces.c:667 +#, c-format +msgid "Unable to get trace: %s" +msgstr "" + +#: ../src/datasource_routing.c:56 ../src/datasource_routing.c:57 +msgid "Directions" +msgstr "" + +#: ../src/datasource_routing.c:90 +msgid "No routing engines with directions available" +msgstr "" + +#. Engine selector +#: ../src/datasource_routing.c:99 +msgid "Engine:" +msgstr "" + +#. From and To entries +#: ../src/datasource_routing.c:104 +msgid "From:" +msgstr "" + +#: ../src/datasource_routing.c:105 +msgid "To:" +msgstr "" + +#: ../src/datasource_url.c:48 +msgid "Acquire from URL" +msgstr "" + +#: ../src/datasource_url.c:49 +msgid "URL" +msgstr "" + +#: ../src/datasource_url.c:101 +msgid "URL:" +msgstr "" + +#. Only GPX (not using GPSbabel) +#: ../src/datasource_url.c:133 ../src/vikfileentry.c:161 +#: ../src/vikwindow.c:3513 ../src/vikwindow.c:3603 +msgid "GPX" +msgstr "" + +#: ../src/datasource_wikipedia.c:32 +msgid "Create Waypoints from Wikipedia Articles" +msgstr "" + +#: ../src/datasource_wikipedia.c:33 +msgid "Wikipedia Waypoints" +msgstr "" + +#: ../src/dem.c:66 ../src/dem.c:80 +msgid "Invalid DEM" +msgstr "" + +#: ../src/dem.c:122 +msgid "Invalid DEM header" +msgstr "" + +#: ../src/dem.c:191 ../src/dem.c:204 +msgid "Incorrect DEM Class B record: expected 1" +msgstr "" + +#: ../src/dem.c:289 ../src/download.c:176 +#, c-format +msgid "Couldn't map file %s: %s" +msgstr "" + +#: ../src/download.c:130 +msgid "Tile age (days):" +msgstr "" + +#: ../src/download.c:406 +#, c-format +msgid "Download error: %s" +msgstr "" + +#: ../src/download.c:490 +msgid "couldn't open temp file" +msgstr "" + +#: ../src/file.c:458 ../src/file.c:463 +#, c-format +msgid "Draw mode '%s' no more supported" +msgstr "" + +#: ../src/geotag_exif.c:621 +msgid "Not enough memory." +msgstr "" + +#: ../src/geotag_exif.c:639 +msgid "Setting a value for this tag is unsupported!" +msgstr "" + +#: ../src/geotag_exif.c:658 +#, c-format +msgid "Too few components specified (need %d, found %d)\n" +msgstr "" + +#: ../src/geotag_exif.c:662 +msgid "Numeric value expected\n" +msgstr "" + +#: ../src/geotag_exif.c:670 +msgid "This shouldn't happen!" +msgstr "" + +#: ../src/geotag_exif.c:740 +msgid "Not yet implemented!" +msgstr "" + +#: ../src/geotag_exif.c:753 +msgid "Warning; Too many components specified!" +msgstr "" + +#: ../src/osm-traces.c:87 +msgid "Identifiable (public w/ timestamps)" +msgstr "" + +#: ../src/osm-traces.c:88 +msgid "Trackable (private w/ timestamps)" +msgstr "" + +#: ../src/osm-traces.c:89 +msgid "Public" +msgstr "" + +#: ../src/osm-traces.c:90 +msgid "Private" +msgstr "" + +#: ../src/osm-traces.c:108 +msgid "Access Token:" +msgstr "" + +#: ../src/osm-traces.c:108 +msgid "Get New OSM Access Tokens" +msgstr "" + +#: ../src/osm-traces.c:109 +msgid "Access Token Key:" +msgstr "" + +#: ../src/osm-traces.c:110 +msgid "Access Token Secret:" +msgstr "" + +#: ../src/osm-traces.c:111 +msgid "OSM username:" +msgstr "" + +#: ../src/osm-traces.c:112 +msgid "OSM password:" +msgstr "" + +#. Check to really override existing values... +#: ../src/osm-traces.c:263 +msgid "Do you want to overwrite existing values?" +msgstr "" + +#: ../src/osm-traces.c:275 +msgid "Not able to generate OSM request tokens." +msgstr "" + +#: ../src/osm-traces.c:299 +msgid "" +"Waiting for authorization approval.\n" +"Ensure you have granted access at the website before continuing here." +msgstr "" + +#: ../src/osm-traces.c:315 +msgid "No Authorization." +msgstr "" + +#: ../src/osm-traces.c:354 +msgid "" +"OSM Username and Password preferences are not required anymore. You can now " +"remove them." +msgstr "" + +#. Preferences +#: ../src/osm-traces.c:379 +msgid "OpenStreetMap Traces" +msgstr "" + +#: ../src/osm-traces.c:504 +#, c-format +msgid "failed to upload data: HTTP response is %ld" +msgstr "" + +#: ../src/osm-traces.c:509 +#, c-format +msgid "curl_easy_getinfo failed: %d" +msgstr "" + +#: ../src/osm-traces.c:514 +#, c-format +msgid "curl request failed: %s" +msgstr "" + +#. Success +#: ../src/osm-traces.c:592 +msgid "Uploaded to OSM" +msgstr "" + +#: ../src/osm-traces.c:596 +msgid "" +"FAILED TO UPLOAD DATA TO OSM - Ensure the OSM access token preferences are " +"setup." +msgstr "" + +#: ../src/osm-traces.c:599 +msgid "FAILED TO UPLOAD DATA TO OSM - CURL PROBLEM" +msgstr "" + +#: ../src/osm-traces.c:602 +msgid "FAILED TO UPLOAD DATA TO OSM" +msgstr "" + +#: ../src/osm-traces.c:602 +msgid "HTTP response code" +msgstr "" + +#: ../src/osm-traces.c:610 +#, c-format +msgid "failed to unlink temporary file: %s" +msgstr "" + +#: ../src/osm-traces.c:664 +msgid "OSM upload" +msgstr "" + +#: ../src/osm-traces.c:689 +msgid "" +"The email/username used as login\n" +"Enter the email/username you use to login into www.openstreetmap.org." +"" +msgstr "" + +#: ../src/osm-traces.c:697 +msgid "" +"The password used to login\n" +"Enter the password you use to login into www.openstreetmap.org." +msgstr "" + +#: ../src/osm-traces.c:703 +msgid "File's name:" +msgstr "" + +#: ../src/osm-traces.c:713 +msgid "" +"The name of the file on OSM\n" +"This is the name of the file created on the server.This is not the " +"name of the local file." +msgstr "" + +#: ../src/osm-traces.c:717 ../src/viktrwlayer_wpwin.c:197 +#: ../src/viktrwlayer_wpwin.c:199 +msgid "Description:" +msgstr "" + +#: ../src/osm-traces.c:731 +msgid "The description of the trace" +msgstr "" + +#: ../src/osm-traces.c:734 +msgid "Anonymize Times:" +msgstr "" + +#: ../src/osm-traces.c:739 +msgid "" +"Anonymize times of the trace.\n" +"You may choose to make the trace identifiable, yet mask the actual " +"real time values" +msgstr "" + +#: ../src/osm-traces.c:743 +msgid "Tags:" +msgstr "" + +#: ../src/osm-traces.c:751 +msgid "The tags associated to the trace" +msgstr "" + +#: ../src/osm-traces.c:816 +#, c-format +msgid "Uploading %s to OSM" +msgstr "" + +#: ../src/mapcache.c:67 +msgid "Map cache memory size (MB):" +msgstr "" + +#. NB Can have a couple hundred fonts loaded when using system directories +#. So ATM don't list them all - otherwise need better GUI feedback display. +#: ../src/mapnik_interface.cpp:324 +#, c-format +msgid "" +"%s %s\n" +"Plugins=%sFonts loaded=%d" +msgstr "" + +#: ../src/mapnik_interface.cpp:325 ../src/vikmapniklayer.c:278 +msgid "Mapnik" +msgstr "" + +#: ../src/print.c:51 ../src/viktrwlayer.c:572 +msgid "None" +msgstr "" + +#: ../src/print.c:52 +msgid "Horizontally" +msgstr "" + +#: ../src/print.c:53 +msgid "Vertically" +msgstr "" + +#: ../src/print.c:54 +msgid "Both" +msgstr "" + +#: ../src/print.c:118 +msgid "Image Settings" +msgstr "" + +#: ../src/print.c:551 +msgid "done" +msgstr "" + +#. Page Size +#: ../src/print.c:580 +msgid "_Adjust Page Size and Orientation" +msgstr "" + +#: ../src/print.c:596 +msgid "C_enter:" +msgstr "" + +#. ignore page margins +#: ../src/print.c:614 +msgid "Ignore Page _Margins" +msgstr "" + +#: ../src/print.c:633 +msgid "Image S_ize:" +msgstr "" + +#: ../src/ui_util.c:88 +#, c-format +msgid "Could not launch web browser. %s" +msgstr "" + +#: ../src/ui_util.c:101 +#, c-format +msgid "Could not create new email. %s" +msgstr "" + +#: ../src/vikcoordlayer.c:57 +msgid "Color:" +msgstr "" + +#: ../src/vikcoordlayer.c:58 +msgid "Minutes Width:" +msgstr "" + +#: ../src/vikcoordlayer.c:59 +msgid "Line Thickness:" +msgstr "" + +#: ../src/vikcoordlayer.c:66 +msgid "Coordinate" +msgstr "" + +#: ../src/main.c:92 +#, c-format +msgid "Ignoring Xlib error: error code %d request code %d\n" +msgstr "" + +#: ../src/main.c:111 +msgid "Enable debug output" +msgstr "" + +#: ../src/main.c:112 +msgid "Enable verbose output" +msgstr "" + +#: ../src/main.c:113 +msgid "Show version" +msgstr "" + +#: ../src/main.c:114 +msgid "Latitude in decimal degrees" +msgstr "" + +#: ../src/main.c:115 +msgid "Longitude in decimal degrees" +msgstr "" + +#: ../src/main.c:116 +msgid "Zoom Level (OSM). Value can be 0 - 22" +msgstr "" + +#: ../src/main.c:117 +msgid "Add a map layer by id value. Use 0 for the default map." +msgstr "" + +#: ../src/main.c:160 +#, c-format +msgid "" +"%s %s\n" +"Copyright (c) 2003-2008 Evan Battaglia\n" +"Copyright (c) 2008-%s Viking's contributors\n" +msgstr "" + +#: ../src/osm.c:50 +msgid "OpenStreetMap (Mapnik)" +msgstr "" + +#: ../src/osm.c:65 +msgid "OpenStreetMap (Cycle)" +msgstr "" + +#: ../src/osm.c:79 +msgid "OpenStreetMap (Transport)" +msgstr "" + +#: ../src/osm.c:95 +msgid "OpenStreetMap (Humanitarian)" +msgstr "" + +#: ../src/osm.c:111 +msgid "On Disk OSM Tile Format" +msgstr "" + +#: ../src/osm.c:121 +msgid "MBTiles File" +msgstr "" + +#: ../src/osm.c:132 +msgid "OSM Metatiles" +msgstr "" + +#: ../src/osm.c:146 +msgid "Mapbox Outdoors" +msgstr "" + +#: ../src/osm.c:153 +msgid "Mapbox Specific" +msgstr "" + +#: ../src/osm.c:170 +msgid "OSM (view)" +msgstr "" + +#: ../src/osm.c:174 +msgid "OSM (edit)" +msgstr "" + +#. Note the use of positional parameters +#: ../src/osm.c:179 +msgid "OSM (query)" +msgstr "" + +#: ../src/osm.c:183 +msgid "OSM (render)" +msgstr "" + +#. Example: http://127.0.0.1:8111/load_and_zoom?left=8.19&right=8.20&top=48.605&bottom=48.590&select=node413602999 +#. JOSM or merkaartor must already be running with remote interface enabled +#: ../src/osm.c:190 +msgid "Local port 8111 (eg JOSM)" +msgstr "" + +#: ../src/osm.c:195 +msgid "Geofabrik Map Compare" +msgstr "" + +#: ../src/osm.c:203 +msgid "OpenStreetMap Notes" +msgstr "" + +#. Not really OSM but can't be bothered to create somewhere else to put it... +#: ../src/osm.c:221 +msgid "Wikimedia Toolserver GeoHack" +msgstr "" + +#: ../src/preferences.c:195 +msgid "Preferences" +msgstr "" + +#: ../src/toolbar.c:91 ../src/toolbar.c:92 +msgid "System Default" +msgstr "" + +#: ../src/toolbar.c:91 ../src/viktrwlayer.c:563 +msgid "Small" +msgstr "" + +#: ../src/toolbar.c:91 ../src/viktrwlayer.c:564 +msgid "Medium" +msgstr "" + +#: ../src/toolbar.c:91 ../src/viktrwlayer.c:565 +msgid "Large" +msgstr "" + +#: ../src/toolbar.c:92 +msgid "Icons Only" +msgstr "" + +#: ../src/toolbar.c:92 +msgid "Text Only" +msgstr "" + +#: ../src/toolbar.c:92 +msgid "Icons and Text" +msgstr "" + +#: ../src/toolbar.c:106 +msgid "Append to Menu:" +msgstr "" + +#: ../src/toolbar.c:107 +msgid "Pack the toolbar to the main menu to save vertical space" +msgstr "" + +#: ../src/toolbar.c:108 +msgid "Icon Size:" +msgstr "" + +#: ../src/toolbar.c:110 +msgid "Icon Style:" +msgstr "" + +#: ../src/toolbar.c:112 +msgid "Customize:" +msgstr "" + +#: ../src/toolbar.c:112 +msgid "Customize Buttons" +msgstr "" + +#. Preferences +#: ../src/toolbar.c:145 +msgid "Toolbar" +msgstr "" + +#: ../src/toolbar.c:312 +msgid "_Customize" +msgstr "" + +#: ../src/toolbar.c:641 +msgid "Separator" +msgstr "" + +#: ../src/toolbar.c:642 +msgid "--- Separator ---" +msgstr "" + +#: ../src/toolbar.c:1007 +msgid "Customize Toolbar" +msgstr "" + +#: ../src/toolbar.c:1028 +msgid "" +"Select items to be displayed on the toolbar. Items can be reordered by drag " +"and drop." +msgstr "" + +#: ../src/toolbar.c:1044 +msgid "Available Items" +msgstr "" + +#: ../src/toolbar.c:1065 +msgid "Displayed Items" +msgstr "" + +#: ../src/viklayer_defaults.c:232 +#, c-format +msgid "Could not open file: %s" +msgstr "" + +#: ../src/viklayer_defaults.c:304 +msgid "Layer Defaults" +msgstr "" + +#: ../src/uibuilder.c:196 +msgid "Take care that this password will be stored clearly in a plain file." +msgstr "" + +#: ../src/uibuilder.c:628 ../src/viktrwlayer_export.c:188 +#: ../src/viktrwlayer_export.c:304 ../src/vikwindow.c:3666 +#: ../src/vikwindow.c:4408 +#, c-format +msgid "The file \"%s\" exists, do you wish to overwrite it?" +msgstr "" + +#: ../src/vikaggregatelayer.c:41 +msgid "Aggregate" +msgstr "" + +#: ../src/vikaggregatelayer.c:528 ../src/viktrwlayer.c:11700 +#, c-format +msgid "%s: Waypoint List" +msgstr "" + +#: ../src/vikaggregatelayer.c:570 +msgid "Search by Date" +msgstr "" + +#: ../src/vikaggregatelayer.c:576 +msgid "No items found with the requested date." +msgstr "" + +#: ../src/vikaggregatelayer.c:615 ../src/viktrwlayer.c:11691 +#, c-format +msgid "%s: Track and Route List" +msgstr "" + +#: ../src/vikaggregatelayer.c:681 ../src/viktrwlayer.c:8346 +#: ../src/viktrwlayer.c:8417 ../src/viktrwlayer.c:8494 +msgid "_Visibility" +msgstr "" + +#: ../src/vikaggregatelayer.c:686 +msgid "_Show All" +msgstr "" + +#: ../src/vikaggregatelayer.c:692 +msgid "_Hide All" +msgstr "" + +#: ../src/vikaggregatelayer.c:698 ../src/viktrwlayer.c:8363 +#: ../src/viktrwlayer.c:8434 ../src/viktrwlayer.c:8511 +msgid "_Toggle" +msgstr "" + +#: ../src/vikaggregatelayer.c:705 ../src/viktrwlayer.c:8532 +msgid "_Sort" +msgstr "" + +#: ../src/vikaggregatelayer.c:711 ../src/viktrwlayer.c:8538 +msgid "Name _Ascending" +msgstr "" + +#: ../src/vikaggregatelayer.c:717 ../src/viktrwlayer.c:8544 +msgid "Name _Descending" +msgstr "" + +#: ../src/vikaggregatelayer.c:723 ../src/viktrwlayer.c:575 +#: ../src/viktrwlayer.c:8550 +msgid "Date Ascending" +msgstr "" + +#: ../src/vikaggregatelayer.c:729 ../src/viktrwlayer.c:576 +#: ../src/viktrwlayer.c:8556 +msgid "Date Descending" +msgstr "" + +#: ../src/vikaggregatelayer.c:735 ../src/viktrwlayer.c:8445 +#: ../src/viktrwlayer.c:8523 ../src/viktrwlayer.c:8595 +#: ../src/viktrwlayer_tracklist.c:296 +msgid "_Statistics" +msgstr "" + +#: ../src/vikaggregatelayer.c:740 ../src/viktrwlayer.c:4533 +msgid "Track _List..." +msgstr "" + +#: ../src/vikaggregatelayer.c:746 ../src/viktrwlayer.c:4540 +msgid "_Waypoint List..." +msgstr "" + +#: ../src/vikaggregatelayer.c:753 +msgid "Searc_h" +msgstr "" + +#: ../src/vikaggregatelayer.c:759 +msgid "By _Date..." +msgstr "" + +#: ../src/vikaggregatelayer.c:762 +msgid "Find the first item with a specified date" +msgstr "" + +#: ../src/vikaggregatelayer.c:765 +msgid "Load E_xternal Layers" +msgstr "" + +#. Could have a more complicated tooltip that numbers each type of layers, +#. but for now a simple overall count +#: ../src/vikaggregatelayer.c:1011 +#, c-format +msgid "One layer" +msgid_plural "%d layers" +msgstr[0] "" +msgstr[1] "" + +#: ../src/vikaggregatelayer.c:1014 +#, c-format +msgid "Empty" +msgstr "" + +#: ../src/vikdemlayer.c:86 +msgid "SRTM Global 90m (3 arcsec)" +msgstr "" + +#: ../src/vikdemlayer.c:94 +msgid "Absolute height" +msgstr "" + +#: ../src/vikdemlayer.c:95 +msgid "Height gradient" +msgstr "" + +#: ../src/vikdemlayer.c:120 +msgid "DEM Files:" +msgstr "" + +#: ../src/vikdemlayer.c:121 +msgid "Download Source:" +msgstr "" + +#: ../src/vikdemlayer.c:122 +msgid "Min Elev Color:" +msgstr "" + +#: ../src/vikdemlayer.c:123 ../src/viktrwlayer_wpwin.c:207 +msgid "Type:" +msgstr "" + +#: ../src/vikdemlayer.c:124 +msgid "Min Elev:" +msgstr "" + +#: ../src/vikdemlayer.c:125 +msgid "Max Elev:" +msgstr "" + +#: ../src/vikdemlayer.c:137 +msgid "_DEM Download" +msgstr "" + +#: ../src/vikdemlayer.c:137 +msgid "DEM Download" +msgstr "" + +#: ../src/vikdemlayer.c:192 +msgid "DEM" +msgstr "" + +#: ../src/vikdemlayer.c:304 +#, c-format +msgid "Number of files: %d" +msgstr "" + +#: ../src/vikdemlayer.c:446 +msgid "DEM Loading" +msgstr "" + +#: ../src/vikdemlayer.c:927 +#, c-format +msgid "No SRTM data available for %f, %f" +msgstr "" + +#: ../src/vikdemlayer.c:948 +#, c-format +msgid "DEM download failure for %f, %f" +msgstr "" + +#: ../src/vikdemlayer.c:954 +#, c-format +msgid "DEM write failure for %s" +msgstr "" + +#. Probably not over any land... +#: ../src/vikdemlayer.c:1201 +msgid "No DEM File Available" +msgstr "" + +#: ../src/vikdemlayer.c:1220 +#, c-format +msgid "" +"\n" +"Source: %s\n" +"\n" +"DEM File: %s\n" +"DEM File Timestamp: %s" +msgstr "" + +#: ../src/vikdemlayer.c:1224 +#, c-format +msgid "" +"Source: %s\n" +"\n" +"No DEM File!" +msgstr "" + +#: ../src/vikdemlayer.c:1264 +#, c-format +msgid "Downloading DEM %s" +msgstr "" + +#: ../src/vikdemlayer.c:1289 +msgid "_Show DEM File Information" +msgstr "" + +#: ../src/vikfileentry.c:72 +msgid "Browse..." +msgstr "" + +#: ../src/vikfileentry.c:103 +msgid "Choose file" +msgstr "" + +#: ../src/vikfileentry.c:120 ../src/vikwindow.c:4372 +msgid "PNG" +msgstr "" + +#: ../src/vikfileentry.c:125 +msgid "TIFF" +msgstr "" + +#: ../src/vikfileentry.c:133 +msgid "MBTiles" +msgstr "" + +#: ../src/vikfileentry.c:142 +msgid "XML" +msgstr "" + +#: ../src/vikfileentry.c:149 +msgid "MML" +msgstr "" + +#: ../src/vikfileentry.c:154 +msgid "MSS" +msgstr "" + +#: ../src/vikfilelist.c:49 +msgid "Choose file(s)" +msgstr "" + +#: ../src/vikfilelist.c:182 +msgid "Add..." +msgstr "" + +#: ../src/vikfilelist.c:183 +msgid "Delete" +msgstr "" + +#: ../src/vikgeoreflayer.c:97 +msgid "_Georef Move Map" +msgstr "" + +#: ../src/vikgeoreflayer.c:97 +msgid "Georef Move Map" +msgstr "" + +#: ../src/vikgeoreflayer.c:106 +msgid "Georef Z_oom Tool" +msgstr "" + +#: ../src/vikgeoreflayer.c:106 +msgid "Georef Zoom Tool" +msgstr "" + +#: ../src/vikgeoreflayer.c:117 +msgid "GeoRef Map" +msgstr "" + +#: ../src/vikgeoreflayer.c:214 +msgid "Auto Read World Files:" +msgstr "" + +#: ../src/vikgeoreflayer.c:215 +msgid "" +"Automatically attempt to read associated world file of a new image for a " +"GeoRef layer" +msgstr "" + +#: ../src/vikgeoreflayer.c:511 ../src/vikgeoreflayer.c:797 +#: ../src/vikmapslayer.c:1174 +#, c-format +msgid "Couldn't open image file: %s" +msgstr "" + +#: ../src/vikgeoreflayer.c:607 ../src/vikgeoreflayer.c:633 +msgid "Choose World file" +msgstr "" + +#: ../src/vikgeoreflayer.c:619 +msgid "The World file you requested could not be opened for reading." +msgstr "" + +#: ../src/vikgeoreflayer.c:621 +msgid "Unexpected end of file reading World file." +msgstr "" + +#: ../src/vikgeoreflayer.c:646 +msgid "The file you requested could not be opened for writing." +msgstr "" + +#: ../src/vikgeoreflayer.c:782 +msgid "Lower right corner values may not be consistent with upper right values" +msgstr "" + +#: ../src/vikgeoreflayer.c:806 +#, c-format +msgid "Invalid image size: %s" +msgstr "" + +#: ../src/vikgeoreflayer.c:831 ../src/viklayer.c:561 ../src/vikwindow.c:4891 +msgid "Layer Properties" +msgstr "" + +#: ../src/vikgeoreflayer.c:852 +msgid "World File Parameters:" +msgstr "" + +#: ../src/vikgeoreflayer.c:853 +msgid "Load From File..." +msgstr "" + +#: ../src/vikgeoreflayer.c:858 +msgid "Corner pixel easting:" +msgstr "" + +#: ../src/vikgeoreflayer.c:860 +msgid "the UTM \"easting\" value of the upper-left corner pixel of the map" +msgstr "" + +#: ../src/vikgeoreflayer.c:862 +msgid "Corner pixel northing:" +msgstr "" + +#: ../src/vikgeoreflayer.c:864 +msgid "the UTM \"northing\" value of the upper-left corner pixel of the map" +msgstr "" + +#: ../src/vikgeoreflayer.c:866 +msgid "X (easting) scale (mpp): " +msgstr "" + +#: ../src/vikgeoreflayer.c:867 +msgid "Y (northing) scale (mpp): " +msgstr "" + +#: ../src/vikgeoreflayer.c:870 +msgid "the scale of the map in the X direction (meters per pixel)" +msgstr "" + +#: ../src/vikgeoreflayer.c:872 +msgid "the scale of the map in the Y direction (meters per pixel)" +msgstr "" + +#: ../src/vikgeoreflayer.c:874 +msgid "Map Image:" +msgstr "" + +#: ../src/vikgeoreflayer.c:919 +msgid "Upper left latitude:" +msgstr "" + +#: ../src/vikgeoreflayer.c:921 +msgid "Upper left longitude:" +msgstr "" + +#: ../src/vikgeoreflayer.c:923 +msgid "Lower right latitude:" +msgstr "" + +#: ../src/vikgeoreflayer.c:925 +msgid "Lower right longitude:" +msgstr "" + +#: ../src/vikgeoreflayer.c:937 +msgid "Calculate MPP values from coordinates" +msgstr "" + +#: ../src/vikgeoreflayer.c:938 +msgid "" +"Enter all corner coordinates before calculating the MPP values from the " +"image size" +msgstr "" + +#: ../src/vikgeoreflayer.c:948 +msgid "UTM" +msgstr "" + +#: ../src/vikgeoreflayer.c:949 +msgid "Latitude/Longitude" +msgstr "" + +#: ../src/vikgeoreflayer.c:957 ../src/vikmapniklayer.c:82 +#: ../src/vikmapslayer.c:158 +msgid "Alpha:" +msgstr "" + +#. Now with icons +#: ../src/vikgeoreflayer.c:1062 +msgid "_Zoom to Fit Map" +msgstr "" + +#: ../src/vikgeoreflayer.c:1068 +msgid "_Goto Map Center" +msgstr "" + +#: ../src/vikgeoreflayer.c:1074 +msgid "_Export to World File" +msgstr "" + +#: ../src/vikgoto.c:98 +msgid "No goto tool available." +msgstr "" + +#: ../src/vikgoto.c:295 +msgid "goto" +msgstr "" + +#: ../src/vikgoto.c:297 +msgid "goto provider:" +msgstr "" + +#: ../src/vikgoto.c:312 +msgid "Enter address or place name:" +msgstr "" + +#: ../src/vikgoto.c:487 +msgid "Locality" +msgstr "" + +#: ../src/vikgpslayer.c:137 +msgid "Data Mode" +msgstr "" + +#: ../src/vikgpslayer.c:139 +msgid "Realtime Tracking Mode" +msgstr "" + +#: ../src/vikgpslayer.c:176 +msgid "Keep vehicle at center" +msgstr "" + +#: ../src/vikgpslayer.c:177 +msgid "Keep vehicle on screen" +msgstr "" + +#: ../src/vikgpslayer.c:178 +msgid "Disable" +msgstr "" + +#: ../src/vikgpslayer.c:218 +msgid "Download Tracks:" +msgstr "" + +#: ../src/vikgpslayer.c:219 +msgid "Upload Tracks:" +msgstr "" + +#: ../src/vikgpslayer.c:220 +msgid "Download Routes:" +msgstr "" + +#: ../src/vikgpslayer.c:221 +msgid "Upload Routes:" +msgstr "" + +#: ../src/vikgpslayer.c:222 +msgid "Download Waypoints:" +msgstr "" + +#: ../src/vikgpslayer.c:223 +msgid "Upload Waypoints:" +msgstr "" + +#: ../src/vikgpslayer.c:225 +msgid "Recording tracks" +msgstr "" + +#: ../src/vikgpslayer.c:226 +msgid "Jump to current position on start" +msgstr "" + +#: ../src/vikgpslayer.c:227 +msgid "Moving Map Method:" +msgstr "" + +#: ../src/vikgpslayer.c:228 +msgid "Update Statusbar:" +msgstr "" + +#: ../src/vikgpslayer.c:228 +msgid "Display information in the statusbar on GPS updates" +msgstr "" + +#: ../src/vikgpslayer.c:229 +msgid "Auto Connect" +msgstr "" + +#: ../src/vikgpslayer.c:229 +msgid "Automatically connect to GPSD" +msgstr "" + +#: ../src/vikgpslayer.c:230 +msgid "Gpsd Host:" +msgstr "" + +#: ../src/vikgpslayer.c:231 +msgid "Gpsd Port:" +msgstr "" + +#: ../src/vikgpslayer.c:232 +msgid "Gpsd Retry Interval (seconds):" +msgstr "" + +#: ../src/vikgpslayer.c:254 +msgid "GPS" +msgstr "" + +#: ../src/vikgpslayer.c:320 ../src/vikgpslayer.c:1504 +msgid "GPS Download" +msgstr "" + +#: ../src/vikgpslayer.c:320 ../src/vikgpslayer.c:1504 ../src/viktrwlayer.c:3993 +msgid "GPS Upload" +msgstr "" + +#: ../src/vikgpslayer.c:322 +msgid "GPS Realtime Tracking" +msgstr "" + +#: ../src/vikgpslayer.c:458 +msgid "Connected" +msgstr "" + +#: ../src/vikgpslayer.c:460 +msgid "Disconnected" +msgstr "" + +#: ../src/vikgpslayer.c:554 +msgid "Unknown GPS Protocol" +msgstr "" + +#: ../src/vikgpslayer.c:572 +msgid "Unknown serial port device" +msgstr "" + +#: ../src/vikgpslayer.c:691 +#, c-format +msgid "%s: unknown parameter" +msgstr "" + +#. Now with icons +#: ../src/vikgpslayer.c:794 +msgid "_Upload to GPS" +msgstr "" + +#: ../src/vikgpslayer.c:800 +msgid "Download from _GPS" +msgstr "" + +#: ../src/vikgpslayer.c:821 +msgid "Empty _Realtime" +msgstr "" + +#: ../src/vikgpslayer.c:828 +msgid "E_mpty Upload" +msgstr "" + +#: ../src/vikgpslayer.c:834 +msgid "_Empty Download" +msgstr "" + +#: ../src/vikgpslayer.c:840 +msgid "Empty _All" +msgstr "" + +#: ../src/vikgpslayer.c:852 +#, c-format +msgid "Unexpected number of disconnected handlers: %d" +msgstr "" + +#: ../src/vikgpslayer.c:995 +#, c-format +msgid "Uploading %d waypoint..." +msgid_plural "Uploading %d waypoints..." +msgstr[0] "" +msgstr[1] "" + +#: ../src/vikgpslayer.c:1000 +#, c-format +msgid "Uploading %d trackpoint..." +msgid_plural "Uploading %d trackpoints..." +msgstr[0] "" +msgstr[1] "" + +#: ../src/vikgpslayer.c:1005 +#, c-format +msgid "Uploading %d routepoint..." +msgid_plural "Uploading %d routepoints..." +msgstr[0] "" +msgstr[1] "" + +#: ../src/vikgpslayer.c:1034 +#, c-format +msgid "Downloaded %d out of %d waypoint..." +msgid_plural "Downloaded %d out of %d waypoints..." +msgstr[0] "" +msgstr[1] "" + +#: ../src/vikgpslayer.c:1040 +#, c-format +msgid "Downloaded %d out of %d trackpoint..." +msgid_plural "Downloaded %d out of %d trackpoints..." +msgstr[0] "" +msgstr[1] "" + +#: ../src/vikgpslayer.c:1046 +#, c-format +msgid "Downloaded %d out of %d routepoint..." +msgid_plural "Downloaded %d out of %d routepoints..." +msgstr[0] "" +msgstr[1] "" + +#: ../src/vikgpslayer.c:1056 +#, c-format +msgid "Uploaded %d out of %d waypoint..." +msgid_plural "Uploaded %d out of %d waypoints..." +msgstr[0] "" +msgstr[1] "" + +#: ../src/vikgpslayer.c:1062 +#, c-format +msgid "Uploaded %d out of %d trackpoint..." +msgid_plural "Uploaded %d out of %d trackpoints..." +msgstr[0] "" +msgstr[1] "" + +#: ../src/vikgpslayer.c:1068 +#, c-format +msgid "Uploaded %d out of %d routepoint..." +msgid_plural "Uploaded %d out of %d routepoints..." +msgstr[0] "" +msgstr[1] "" + +#: ../src/vikgpslayer.c:1079 +#, c-format +msgid "Downloaded %d waypoint" +msgid_plural "Downloaded %d waypoints" +msgstr[0] "" +msgstr[1] "" + +#: ../src/vikgpslayer.c:1085 +#, c-format +msgid "Downloaded %d trackpoint" +msgid_plural "Downloaded %d trackpoints" +msgstr[0] "" +msgstr[1] "" + +#: ../src/vikgpslayer.c:1091 +#, c-format +msgid "Downloaded %d routepoint" +msgid_plural "Downloaded %d routepoints" +msgstr[0] "" +msgstr[1] "" + +#: ../src/vikgpslayer.c:1101 +#, c-format +msgid "Uploaded %d waypoint" +msgid_plural "Uploaded %d waypoints" +msgstr[0] "" +msgstr[1] "" + +#: ../src/vikgpslayer.c:1107 +#, c-format +msgid "Uploaded %d trackpoint" +msgid_plural "Uploaded %d trackpoints" +msgstr[0] "" +msgstr[1] "" + +#: ../src/vikgpslayer.c:1113 +#, c-format +msgid "Uploaded %d routepoint" +msgid_plural "Uploaded %d routepoints" +msgstr[0] "" +msgstr[1] "" + +#: ../src/vikgpslayer.c:1363 +msgid "Error: No result." +msgstr "" + +#: ../src/vikgpslayer.c:1471 +msgid "Warning - GPS Upload items may overwrite each other" +msgstr "" + +#: ../src/vikgpslayer.c:1506 +msgid "Status: detecting gpsbabel" +msgstr "" + +#: ../src/vikgpslayer.c:1533 +msgid "No GPS items selected for transfer." +msgstr "" + +#: ../src/vikgpslayer.c:1546 +msgid "Could not turn off device." +msgstr "" + +#: ../src/vikgpslayer.c:1589 +msgid "Are you sure you want to delete GPS Upload data?" +msgstr "" + +#: ../src/vikgpslayer.c:1602 +msgid "Are you sure you want to delete GPS Download data?" +msgstr "" + +#: ../src/vikgpslayer.c:1616 +msgid "Are you sure you want to delete GPS Realtime data?" +msgstr "" + +#: ../src/vikgpslayer.c:1630 +msgid "Are you sure you want to delete All GPS data?" +msgstr "" + +#: ../src/vikgpslayer.c:2004 +#, c-format +msgid "" +"Failed to connect to gpsd at %s (port %s)\n" +"Should Viking keep trying (every %d seconds)?" +msgstr "" + +#: ../src/viklayerspanel.c:73 +msgid "C_ut" +msgstr "" + +#: ../src/viklayerspanel.c:74 ../src/vikwindow.c:4882 +msgid "_Copy" +msgstr "" + +#: ../src/viklayerspanel.c:75 ../src/vikwindow.c:4883 +msgid "_Paste" +msgstr "" + +#: ../src/viklayerspanel.c:76 ../src/vikwindow.c:4884 +msgid "_Delete" +msgstr "" + +#: ../src/viklayerspanel.c:154 +msgid "New Layer" +msgstr "" + +#: ../src/viklayerspanel.c:347 +msgid "Top Layer" +msgstr "" + +#: ../src/viklayerspanel.c:363 +msgid "Add new layer" +msgstr "" + +#: ../src/viklayerspanel.c:370 ../src/vikwindow.c:4884 +msgid "Remove selected layer" +msgstr "" + +#: ../src/viklayerspanel.c:377 +msgid "Move selected layer up" +msgstr "" + +#: ../src/viklayerspanel.c:384 +msgid "Move selected layer down" +msgstr "" + +#: ../src/viklayerspanel.c:391 ../src/vikwindow.c:4881 +msgid "Cut selected layer" +msgstr "" + +#: ../src/viklayerspanel.c:398 ../src/vikwindow.c:4882 +msgid "Copy selected layer" +msgstr "" + +#: ../src/viklayerspanel.c:405 ../src/vikwindow.c:4883 +msgid "" +"Paste layer into selected container layer or otherwise above selected layer" +msgstr "" + +#: ../src/viklayerspanel.c:502 +msgid "New name can not be blank." +msgstr "" + +#: ../src/viklayerspanel.c:751 +msgid "Aggregate Layers have no settable properties." +msgstr "" + +#: ../src/viklayerspanel.c:798 +msgid "You cannot cut the Top Layer." +msgstr "" + +#: ../src/viklayerspanel.c:843 +#, c-format +msgid "Are you sure you want to delete %s?" +msgstr "" + +#: ../src/viklayerspanel.c:863 +msgid "You cannot delete the Top Layer." +msgstr "" + +#: ../src/vikmapniklayer.c:78 +msgid "CSS (MML) Config File:" +msgstr "" + +#: ../src/vikmapniklayer.c:79 +msgid "CartoCSS configuration file" +msgstr "" + +#: ../src/vikmapniklayer.c:80 +msgid "XML Config File:" +msgstr "" + +#: ../src/vikmapniklayer.c:81 +msgid "Mapnik XML configuration file" +msgstr "" + +#: ../src/vikmapniklayer.c:84 +msgid "Use File Cache:" +msgstr "" + +#: ../src/vikmapniklayer.c:86 +msgid "File Cache Directory:" +msgstr "" + +#: ../src/vikmapniklayer.c:122 +msgid "_Mapnik Features" +msgstr "" + +#: ../src/vikmapniklayer.c:122 +msgid "Mapnik Features" +msgstr "" + +#: ../src/vikmapniklayer.c:140 +msgid "Mapnik Rendering" +msgstr "" + +#. Changing these values only applies before first mapnik layer is 'created' +#: ../src/vikmapniklayer.c:258 +msgid "Plugins Directory:" +msgstr "" + +#: ../src/vikmapniklayer.c:258 ../src/vikmapniklayer.c:259 +#: ../src/vikmapniklayer.c:260 ../src/vikmapniklayer.c:261 +msgid "You need to restart Viking for a change to this value to be used" +msgstr "" + +#: ../src/vikmapniklayer.c:259 +msgid "Fonts Directory:" +msgstr "" + +#: ../src/vikmapniklayer.c:260 +msgid "Recurse Fonts Directory:" +msgstr "" + +#: ../src/vikmapniklayer.c:261 +msgid "Rerender Timeout (hours):" +msgstr "" + +#. Changeable any time +#: ../src/vikmapniklayer.c:263 +msgid "CartoCSS:" +msgstr "" + +#: ../src/vikmapniklayer.c:263 +msgid "The program to convert CartoCSS files into Mapnik XML" +msgstr "" + +#: ../src/vikmapniklayer.c:506 +msgid "Running" +msgstr "" + +#: ../src/vikmapniklayer.c:525 +#, c-format +msgid "" +"Error running carto command:\n" +"%s" +msgstr "" + +#: ../src/vikmapniklayer.c:561 +msgid " completed in " +msgstr "" + +#: ../src/vikmapniklayer.c:561 +msgid "seconds" +msgstr "" + +#: ../src/vikmapniklayer.c:611 ../src/vikmapniklayer.c:979 +#, c-format +msgid "" +"Mapnik error loading configuration file:\n" +"%s" +msgstr "" + +#: ../src/vikmapniklayer.c:749 +#, c-format +msgid "Mapnik Render %d:%d:%d %s" +msgstr "" + +#: ../src/vikmapniklayer.c:840 +msgid "Mapnik Rendering must be in Mercator mode" +msgstr "" + +#: ../src/vikmapniklayer.c:997 +msgid "Mapnik Information" +msgstr "" + +#: ../src/vikmapniklayer.c:1031 +msgid "_Flush Memory Cache" +msgstr "" + +#: ../src/vikmapniklayer.c:1044 +msgid "_Run Carto Command" +msgstr "" + +#: ../src/vikmapniklayer.c:1102 ../src/vikmapslayer.c:2029 +#, c-format +msgid "Tile File Timestamp: %s" +msgstr "" + +#: ../src/vikmapniklayer.c:1105 ../src/vikmapslayer.c:2032 +msgid "Tile File Timestamp: Not Available" +msgstr "" + +#: ../src/vikmapniklayer.c:1120 +#, c-format +msgid "Rendering time %.2f seconds" +msgstr "" + +#: ../src/vikmapniklayer.c:1124 ../src/vikmapslayer.c:2042 +msgid "Tile Information" +msgstr "" + +#: ../src/vikmapniklayer.c:1145 +msgid "_Rerender Tile" +msgstr "" + +#: ../src/vikmapniklayer.c:1150 +msgid "_Info" +msgstr "" + +#. ******* MAPZOOMS ******** +#: ../src/vikmapslayer.c:96 +msgid "Use Viking Zoom Level" +msgstr "" + +#: ../src/vikmapslayer.c:146 +msgid "OSM" +msgstr "" + +#. NB mode => id - But can't break file format just to rename something better +#: ../src/vikmapslayer.c:152 +msgid "Map Type:" +msgstr "" + +#: ../src/vikmapslayer.c:153 +msgid "Maps Directory:" +msgstr "" + +#: ../src/vikmapslayer.c:154 +msgid "Cache Layout:" +msgstr "" + +#: ../src/vikmapslayer.c:155 +msgid "This determines the tile storage layout on disk" +msgstr "" + +#: ../src/vikmapslayer.c:156 +msgid "Map File:" +msgstr "" + +#: ../src/vikmapslayer.c:157 +msgid "An MBTiles file. Only applies when the map type method is 'MBTiles'" +msgstr "" + +#: ../src/vikmapslayer.c:159 +msgid "Control the Alpha value for transparency effects" +msgstr "" + +#: ../src/vikmapslayer.c:160 +msgid "Autodownload maps:" +msgstr "" + +#: ../src/vikmapslayer.c:161 +msgid "Autodownload Only Gets Missing Maps:" +msgstr "" + +#: ../src/vikmapslayer.c:162 +msgid "" +"Using this option avoids attempting to update already acquired tiles. This " +"can be useful if you want to restrict the network usage, without having to " +"resort to manual control. Only applies when 'Autodownload Maps' is on." +msgstr "" + +#: ../src/vikmapslayer.c:163 +msgid "Zoom Level:" +msgstr "" + +#: ../src/vikmapslayer.c:164 +msgid "" +"Determines the method of displaying map tiles for the current zoom level. " +"'Viking Zoom Level' uses the best matching level, otherwise setting a fixed " +"value will always use map tiles of the specified value regardless of the " +"actual zoom level." +msgstr "" + +#: ../src/vikmapslayer.c:197 +msgid "_Maps Download" +msgstr "" + +#: ../src/vikmapslayer.c:197 +msgid "Maps Download" +msgstr "" + +#: ../src/vikmapslayer.c:213 ../src/vikutils.c:895 +msgid "Map" +msgstr "" + +#: ../src/vikmapslayer.c:306 +msgid "Default map layer directory:" +msgstr "" + +#: ../src/vikmapslayer.c:306 +msgid "Choose a directory to store cached Map tiles for this layer" +msgstr "" + +#: ../src/vikmapslayer.c:436 ../src/vikmapslayer.c:633 +msgid "Unknown map type" +msgstr "" + +#: ../src/vikmapslayer.c:664 +msgid "Unknown Map Zoom" +msgstr "" + +#: ../src/vikmapslayer.c:833 +#, c-format +msgid "Failed to open MBTiles file: %s" +msgstr "" + +#: ../src/vikmapslayer.c:856 +#, c-format +msgid "" +"New map cannot be displayed in the current drawmode.\n" +"Select \"%s\" from View menu to view it." +msgstr "" + +#: ../src/vikmapslayer.c:1314 +#, c-format +msgid "" +"Cowardly refusing to draw tiles or existence of tiles beyond %d zoom out " +"factor" +msgstr "" + +#. TODO: ?? count up the number of download errors somehow... +#: ../src/vikmapslayer.c:1667 +msgid "Failed to download tile" +msgstr "" + +#: ../src/vikmapslayer.c:1673 +msgid "Unable to save tile" +msgstr "" + +#: ../src/vikmapslayer.c:1799 +#, c-format +msgid "Redownloading up to %d %s map..." +msgid_plural "Redownloading up to %d %s maps..." +msgstr[0] "" +msgstr[1] "" + +#: ../src/vikmapslayer.c:1801 +#, c-format +msgid "Redownloading %d %s map..." +msgid_plural "Redownloading %d %s maps..." +msgstr[0] "" +msgstr[1] "" + +#: ../src/vikmapslayer.c:1805 ../src/vikmapslayer.c:1890 +#, c-format +msgid "Downloading %d %s map..." +msgid_plural "Downloading %d %s maps..." +msgstr[0] "" +msgstr[1] "" + +#: ../src/vikmapslayer.c:1969 +msgid "YES" +msgstr "" + +#: ../src/vikmapslayer.c:1973 ../src/vikmapslayer.c:1977 +msgid "NO" +msgstr "" + +#. NB Also handles .jpg automatically due to pixbuf_new_from () support - although just print png for now. +#: ../src/vikmapslayer.c:1980 +#, c-format +msgid "Source: %s (%d%s%d%s%d.%s %s)" +msgstr "" + +#: ../src/vikmapslayer.c:1983 +msgid "Source: Not available" +msgstr "" + +#: ../src/vikmapslayer.c:2000 +msgid "Source: file://" +msgstr "" + +#: ../src/vikmapslayer.c:2012 +#, c-format +msgid "Source: %s" +msgstr "" + +#: ../src/vikmapslayer.c:2038 +#, c-format +msgid "Tile File: %s [Not Available]" +msgstr "" + +#: ../src/vikmapslayer.c:2086 +msgid "Redownload _Bad Map(s)" +msgstr "" + +#: ../src/vikmapslayer.c:2090 +msgid "Redownload _New Map(s)" +msgstr "" + +#: ../src/vikmapslayer.c:2094 +msgid "Redownload _All Map(s)" +msgstr "" + +#: ../src/vikmapslayer.c:2099 +msgid "_Show Tile Information" +msgstr "" + +#: ../src/vikmapslayer.c:2166 +#, c-format +msgid "" +"Wrong drawmode for this map.\n" +"Select \"%s\" from View menu and try again." +msgstr "" + +#: ../src/vikmapslayer.c:2171 +msgid "Wrong zoom level for this map." +msgstr "" + +#: ../src/vikmapslayer.c:2334 +msgid "Zoom Start:" +msgstr "" + +#: ../src/vikmapslayer.c:2341 +msgid "Zoom End:" +msgstr "" + +#: ../src/vikmapslayer.c:2347 +msgid "Download Maps Method:" +msgstr "" + +#. redownload method - needs to align with REDOWNLOAD* macro values +#: ../src/vikmapslayer.c:2419 +msgid "Missing" +msgstr "" + +#: ../src/vikmapslayer.c:2419 +msgid "Bad" +msgstr "" + +#: ../src/vikmapslayer.c:2419 +msgid "New" +msgstr "" + +#: ../src/vikmapslayer.c:2419 +msgid "Reload All" +msgstr "" + +#: ../src/vikmapslayer.c:2421 +msgid "Download for Zoom Levels" +msgstr "" + +#: ../src/vikmapslayer.c:2461 +#, c-format +msgid "" +"You are not allowed to download more than %d tiles in one go (requested %d)" +msgstr "" + +#: ../src/vikmapslayer.c:2469 +#, c-format +msgid "Do you really want to download %d tiles?" +msgstr "" + +#. Now with icons +#: ../src/vikmapslayer.c:2509 +msgid "Download _Missing Onscreen Maps" +msgstr "" + +#: ../src/vikmapslayer.c:2516 +msgid "Download _New Onscreen Maps" +msgstr "" + +#: ../src/vikmapslayer.c:2523 +msgid "Reload _All Onscreen Maps" +msgstr "" + +#: ../src/vikmapslayer.c:2529 +msgid "Download Maps in _Zoom Levels..." +msgstr "" + +#: ../src/vikmapslayer.c:2539 +msgid "_Open MBTiles Files" +msgstr "" + +#: ../src/vikmapslayer.c:2554 +msgid "Flush Map Cache" +msgstr "" + +#: ../src/vikrouting.c:54 +msgid "Default engine:" +msgstr "" + +#: ../src/vikrouting.c:68 +msgid "Routing" +msgstr "" + +#: ../src/viktreeview.c:347 +msgid "Layer Name" +msgstr "" + +#: ../src/viktreeview.c:924 +#, c-format +msgid "delete data from %s\n" +msgstr "" + +#: ../src/viktrwlayer.c:427 +msgid "Create _Waypoint" +msgstr "" + +#: ../src/viktrwlayer.c:427 +msgid "Create Waypoint" +msgstr "" + +#: ../src/viktrwlayer.c:437 +msgid "Edit _Track" +msgstr "" + +#: ../src/viktrwlayer.c:437 +msgid "Edit Track" +msgstr "" + +#: ../src/viktrwlayer.c:449 +msgid "Edit _Route" +msgstr "" + +#: ../src/viktrwlayer.c:449 +msgid "Edit Route" +msgstr "" + +#: ../src/viktrwlayer.c:460 +msgid "Route _Finder" +msgstr "" + +#: ../src/viktrwlayer.c:460 +msgid "Route Finder" +msgstr "" + +#: ../src/viktrwlayer.c:471 +msgid "Splitter" +msgstr "" + +#: ../src/viktrwlayer.c:482 +msgid "_Edit Waypoint" +msgstr "" + +#: ../src/viktrwlayer.c:482 +msgid "Edit Waypoint" +msgstr "" + +#: ../src/viktrwlayer.c:495 +msgid "Edit Trac_kpoint" +msgstr "" + +#: ../src/viktrwlayer.c:495 +msgid "Edit Trackpoint" +msgstr "" + +#. a pixbuf for this one is already made globally available +#: ../src/viktrwlayer.c:508 +msgid "Show P_icture" +msgstr "" + +#: ../src/viktrwlayer.c:508 +msgid "Show Picture" +msgstr "" + +#: ../src/viktrwlayer.c:531 +msgid "Waypoint Images" +msgstr "" + +#: ../src/viktrwlayer.c:531 +msgid "Tracks Advanced" +msgstr "" + +#: ../src/viktrwlayer.c:531 +msgid "Metadata" +msgstr "" + +#: ../src/viktrwlayer.c:531 +msgid "Filesystem" +msgstr "" + +#: ../src/viktrwlayer.c:534 +msgid "Draw by Track" +msgstr "" + +#: ../src/viktrwlayer.c:534 +msgid "Draw by Speed" +msgstr "" + +#: ../src/viktrwlayer.c:534 +msgid "All Tracks Same Color" +msgstr "" + +#: ../src/viktrwlayer.c:535 +msgid "Filled Square" +msgstr "" + +#: ../src/viktrwlayer.c:535 +msgid "Square" +msgstr "" + +#: ../src/viktrwlayer.c:535 +msgid "Circle" +msgstr "" + +#: ../src/viktrwlayer.c:535 +msgid "X" +msgstr "" + +#: ../src/viktrwlayer.c:561 +msgid "Extra Extra Small" +msgstr "" + +#: ../src/viktrwlayer.c:562 +msgid "Extra Small" +msgstr "" + +#: ../src/viktrwlayer.c:566 +msgid "Extra Large" +msgstr "" + +#: ../src/viktrwlayer.c:567 +msgid "Extra Extra Large" +msgstr "" + +#: ../src/viktrwlayer.c:573 +msgid "Name Ascending" +msgstr "" + +#: ../src/viktrwlayer.c:574 +msgid "Name Descending" +msgstr "" + +#: ../src/viktrwlayer.c:582 ../src/viktrwlayer_propwin.c:3319 +msgid "No" +msgstr "" + +#: ../src/viktrwlayer.c:583 +msgid "Yes" +msgstr "" + +#: ../src/viktrwlayer.c:584 +msgid "No write" +msgstr "" + +#: ../src/viktrwlayer.c:649 ../src/viktrwlayer.c:673 +msgid "Draw Labels" +msgstr "" + +#: ../src/viktrwlayer.c:650 +msgid "Note: the individual track controls what labels may be displayed" +msgstr "" + +#: ../src/viktrwlayer.c:651 +msgid "Track Labels Font Size:" +msgstr "" + +#: ../src/viktrwlayer.c:652 +msgid "Track Drawing Mode:" +msgstr "" + +#: ../src/viktrwlayer.c:653 +msgid "All Tracks Color:" +msgstr "" + +#: ../src/viktrwlayer.c:654 +msgid "The color used when 'All Tracks Same Color' drawing mode is selected" +msgstr "" + +#: ../src/viktrwlayer.c:655 +msgid "Draw Track Lines" +msgstr "" + +#: ../src/viktrwlayer.c:656 +msgid "Track Thickness:" +msgstr "" + +#: ../src/viktrwlayer.c:657 +msgid "Draw Track Direction" +msgstr "" + +#: ../src/viktrwlayer.c:658 +msgid "Direction Size:" +msgstr "" + +#: ../src/viktrwlayer.c:659 +msgid "Draw Trackpoints" +msgstr "" + +#: ../src/viktrwlayer.c:660 +msgid "Trackpoint Size:" +msgstr "" + +#: ../src/viktrwlayer.c:661 +msgid "Draw Elevation" +msgstr "" + +#: ../src/viktrwlayer.c:662 +msgid "Draw Elevation Height %:" +msgstr "" + +#: ../src/viktrwlayer.c:663 +msgid "Draw Stops" +msgstr "" + +#: ../src/viktrwlayer.c:664 +msgid "" +"Whether to draw a marker when trackpoints are at the same position but over " +"the minimum stop length apart in time" +msgstr "" + +#: ../src/viktrwlayer.c:665 +msgid "Min Stop Length (seconds):" +msgstr "" + +#: ../src/viktrwlayer.c:667 +msgid "Track BG Thickness:" +msgstr "" + +#: ../src/viktrwlayer.c:668 +msgid "Track Background Color" +msgstr "" + +#: ../src/viktrwlayer.c:669 +msgid "Draw by Speed Factor (%):" +msgstr "" + +#: ../src/viktrwlayer.c:670 +msgid "" +"The percentage factor away from the average speed determining the color used" +msgstr "" + +#: ../src/viktrwlayer.c:671 +msgid "Track Sort Order:" +msgstr "" + +#: ../src/viktrwlayer.c:674 +msgid "Waypoint Font Size:" +msgstr "" + +#: ../src/viktrwlayer.c:675 +msgid "Waypoint Color:" +msgstr "" + +#: ../src/viktrwlayer.c:676 +msgid "Waypoint Text:" +msgstr "" + +#: ../src/viktrwlayer.c:677 +msgid "Background:" +msgstr "" + +#: ../src/viktrwlayer.c:678 +msgid "Fake BG Color Translucency:" +msgstr "" + +#: ../src/viktrwlayer.c:679 +msgid "Waypoint marker:" +msgstr "" + +#: ../src/viktrwlayer.c:680 +msgid "Waypoint size:" +msgstr "" + +#: ../src/viktrwlayer.c:681 +msgid "Draw Waypoint Symbols:" +msgstr "" + +#: ../src/viktrwlayer.c:682 +msgid "Waypoint Sort Order:" +msgstr "" + +#: ../src/viktrwlayer.c:684 +msgid "Draw Waypoint Images" +msgstr "" + +#: ../src/viktrwlayer.c:685 +msgid "Image Size (pixels):" +msgstr "" + +#: ../src/viktrwlayer.c:686 +msgid "Image Alpha:" +msgstr "" + +#: ../src/viktrwlayer.c:687 +msgid "Image Memory Cache Size:" +msgstr "" + +#: ../src/viktrwlayer.c:690 +msgid "Author" +msgstr "" + +#: ../src/viktrwlayer.c:691 +msgid "Creation Time" +msgstr "" + +#: ../src/viktrwlayer.c:692 +msgid "Keywords" +msgstr "" + +#: ../src/viktrwlayer.c:693 +msgid "External layer:" +msgstr "" + +#: ../src/viktrwlayer.c:693 +msgid "" +"Layer data stored in the Viking file, in an external file, or in an external " +"file but changes are not written to the file (file only loaded at startup)" +msgstr "" + +#: ../src/viktrwlayer.c:694 +msgid "Save layer as:" +msgstr "" + +#: ../src/viktrwlayer.c:694 +msgid "Specify where layer should be saved. Overwrites file if it exists." +msgstr "" + +#: ../src/viktrwlayer.c:798 +msgid "TrackWaypoint" +msgstr "" + +#: ../src/viktrwlayer.c:1999 ../src/viktrwlayer_propwin.c:1469 +#: ../src/viktrwlayer_propwin.c:1471 ../src/vikutils.c:299 +#: ../src/vikutils.c:326 +msgid "miles" +msgstr "" + +#: ../src/viktrwlayer.c:2002 ../src/viktrwlayer_propwin.c:1475 +#: ../src/viktrwlayer_propwin.c:1477 ../src/vikutils.c:303 +#: ../src/vikutils.c:330 +msgid "NM" +msgstr "" + +#. VIK_UNITS_DISTANCE_KILOMETRES: +#: ../src/viktrwlayer.c:2006 ../src/viktrwlayer_propwin.c:1482 +#: ../src/viktrwlayer_propwin.c:1484 ../src/vikutils.c:308 +#: ../src/vikutils.c:335 +msgid "km" +msgstr "" + +#: ../src/viktrwlayer.c:2121 +msgid "start/end" +msgstr "" + +#: ../src/viktrwlayer.c:2133 +msgid "start" +msgstr "" + +#: ../src/viktrwlayer.c:2142 +msgid "end" +msgstr "" + +#: ../src/viktrwlayer.c:3103 +#, c-format +msgid " in %d:%02d hrs:mins" +msgstr "" + +#: ../src/viktrwlayer.c:3107 +#, c-format +msgid "" +"\n" +"%sTotal Length %.1f %s%s" +msgstr "" + +#: ../src/viktrwlayer.c:3131 +#, c-format +msgid "" +"\n" +"Total route length %.1f %s" +msgstr "" + +#: ../src/viktrwlayer.c:3136 +#, c-format +msgid "Tracks: %d - Waypoints: %d - Routes: %d%s%s" +msgstr "" + +#: ../src/viktrwlayer.c:3155 +#, c-format +msgid "Tracks: %d" +msgstr "" + +#: ../src/viktrwlayer.c:3165 +#, c-format +msgid "Routes: %d" +msgstr "" + +#: ../src/viktrwlayer.c:3195 +#, c-format +msgid "- %d:%02d hrs:mins" +msgstr "" + +#: ../src/viktrwlayer.c:3202 +#, c-format +msgid "%s%.1f km %s" +msgstr "" + +#: ../src/viktrwlayer.c:3205 +#, c-format +msgid "%s%.1f miles %s" +msgstr "" + +#: ../src/viktrwlayer.c:3208 +#, c-format +msgid "%s%.1f NM %s" +msgstr "" + +#: ../src/viktrwlayer.c:3222 +#, c-format +msgid "Waypoints: %d" +msgstr "" + +#: ../src/viktrwlayer.c:3279 +#, c-format +msgid "Wpt: Alt %dft" +msgstr "" + +#. VIK_UNITS_HEIGHT_METRES: +#: ../src/viktrwlayer.c:3283 +#, c-format +msgid "Wpt: Alt %dm" +msgstr "" + +#. Add comment if available +#: ../src/viktrwlayer.c:3298 +#, c-format +msgid "%s | %s %s | Comment: %s" +msgstr "" + +#: ../src/viktrwlayer.c:3300 +#, c-format +msgid "%s | %s %s" +msgstr "" + +#: ../src/viktrwlayer.c:3562 ../src/viktrwlayer.c:3591 +msgid "This layer has no waypoints or trackpoints." +msgstr "" + +#: ../src/viktrwlayer.c:3598 ../src/viktrwlayer.c:3607 +#: ../src/viktrwlayer.c:3616 ../src/viktrwlayer.c:3625 +#: ../src/viktrwlayer.c:3634 ../src/viktrwlayer.c:3642 +msgid "Export Layer" +msgstr "" + +#: ../src/viktrwlayer.c:3671 +msgid "Export Route as GPX" +msgstr "" + +#: ../src/viktrwlayer.c:3673 +msgid "Export Track as GPX" +msgstr "" + +#: ../src/viktrwlayer.c:3693 +msgid "Find" +msgstr "" + +#: ../src/viktrwlayer.c:3703 +msgid "Waypoint Name:" +msgstr "" + +#: ../src/viktrwlayer.c:3720 +msgid "Waypoint not found in this layer." +msgstr "" + +#: ../src/viktrwlayer.c:3989 +msgid "Can not upload invisible track." +msgstr "" + +#: ../src/viktrwlayer.c:4082 ../src/viktrwlayer.c:10512 +msgid "Track" +msgstr "" + +#: ../src/viktrwlayer.c:4107 ../src/viktrwlayer.c:10599 +msgid "Route" +msgstr "" + +#: ../src/viktrwlayer.c:4194 +msgid "Externa_l" +msgstr "" + +#: ../src/viktrwlayer.c:4216 ../src/viktrwlayer.c:8456 +#: ../src/viktrwlayer.c:8574 +msgid "_Finish Route" +msgstr "" + +#: ../src/viktrwlayer.c:4218 ../src/viktrwlayer.c:8380 +#: ../src/viktrwlayer.c:8572 +msgid "_Finish Track" +msgstr "" + +#. Now with icons +#: ../src/viktrwlayer.c:4230 +msgid "_View Layer" +msgstr "" + +#: ../src/viktrwlayer.c:4237 +msgid "V_iew" +msgstr "" + +#: ../src/viktrwlayer.c:4243 +msgid "View All _Tracks" +msgstr "" + +#: ../src/viktrwlayer.c:4248 +msgid "View All _Routes" +msgstr "" + +#: ../src/viktrwlayer.c:4253 +msgid "View All _Waypoints" +msgstr "" + +#: ../src/viktrwlayer.c:4258 +msgid "_Goto Center of Layer" +msgstr "" + +#: ../src/viktrwlayer.c:4264 ../src/viktrwlayer.c:8321 +msgid "Goto _Waypoint..." +msgstr "" + +#: ../src/viktrwlayer.c:4270 +msgid "_Export Layer" +msgstr "" + +#: ../src/viktrwlayer.c:4276 +msgid "Export as GPS_Point..." +msgstr "" + +#: ../src/viktrwlayer.c:4281 +msgid "Export as GPS_Mapper..." +msgstr "" + +#: ../src/viktrwlayer.c:4286 +msgid "Export as _GPX..." +msgstr "" + +#: ../src/viktrwlayer.c:4292 +msgid "Export as _KML..." +msgstr "" + +#: ../src/viktrwlayer.c:4299 +msgid "Export as GEO_JSON..." +msgstr "" + +#: ../src/viktrwlayer.c:4306 +msgid "Export via GPSbabel..." +msgstr "" + +#: ../src/viktrwlayer.c:4312 +#, c-format +msgid "Open with External Program_1: %s" +msgstr "" + +#: ../src/viktrwlayer.c:4319 +#, c-format +msgid "Open with External Program_2: %s" +msgstr "" + +#: ../src/viktrwlayer.c:4327 ../src/vikwindow.c:4825 +msgid "_New" +msgstr "" + +#: ../src/viktrwlayer.c:4333 +msgid "New _Waypoint..." +msgstr "" + +#: ../src/viktrwlayer.c:4339 +msgid "New _Track" +msgstr "" + +#: ../src/viktrwlayer.c:4347 +msgid "New _Route" +msgstr "" + +#: ../src/viktrwlayer.c:4356 ../src/viktrwlayer.c:8232 +#: ../src/viktrwlayer.c:9003 +msgid "Geotag _Images..." +msgstr "" + +#: ../src/viktrwlayer.c:4363 +msgid "_Acquire" +msgstr "" + +#: ../src/viktrwlayer.c:4369 ../src/vikwindow.c:4904 +msgid "From _GPS..." +msgstr "" + +#. FIXME: only add menu when at least a routing engine has support for Directions +#: ../src/viktrwlayer.c:4375 +msgid "From _Directions..." +msgstr "" + +#: ../src/viktrwlayer.c:4381 +msgid "From _OSM Traces..." +msgstr "" + +#: ../src/viktrwlayer.c:4386 +msgid "From _My OSM Traces..." +msgstr "" + +#: ../src/viktrwlayer.c:4392 ../src/vikwindow.c:4844 +msgid "From _URL..." +msgstr "" + +#: ../src/viktrwlayer.c:4399 ../src/vikwindow.c:4846 +msgid "From _Wikipedia Waypoints" +msgstr "" + +#: ../src/viktrwlayer.c:4405 +msgid "Within _Layer Bounds" +msgstr "" + +#: ../src/viktrwlayer.c:4411 +msgid "Within _Current View" +msgstr "" + +#: ../src/viktrwlayer.c:4419 +msgid "From Geo_caching..." +msgstr "" + +#: ../src/viktrwlayer.c:4426 ../src/vikwindow.c:4842 +msgid "From Geotagged _Images..." +msgstr "" + +#: ../src/viktrwlayer.c:4433 +msgid "From _File..." +msgstr "" + +#: ../src/viktrwlayer.c:4436 ../src/vikwindow.c:4905 +msgid "Import File With GPS_Babel..." +msgstr "" + +#: ../src/viktrwlayer.c:4443 ../src/viktrwlayer.c:8905 +msgid "_Upload" +msgstr "" + +#: ../src/viktrwlayer.c:4449 +msgid "Upload to _GPS..." +msgstr "" + +#: ../src/viktrwlayer.c:4456 ../src/viktrwlayer.c:8973 +msgid "Upload to _OSM..." +msgstr "" + +#: ../src/viktrwlayer.c:4464 +msgid "De_lete" +msgstr "" + +#: ../src/viktrwlayer.c:4470 +msgid "Delete All _Tracks" +msgstr "" + +#: ../src/viktrwlayer.c:4477 +msgid "Delete Tracks _From Selection..." +msgstr "" + +#: ../src/viktrwlayer.c:4484 ../src/viktrwlayer.c:8481 +msgid "Delete _All Routes" +msgstr "" + +#: ../src/viktrwlayer.c:4491 ../src/viktrwlayer.c:8487 +msgid "_Delete Routes From Selection..." +msgstr "" + +#: ../src/viktrwlayer.c:4498 +msgid "Delete All _Waypoints" +msgstr "" + +#: ../src/viktrwlayer.c:4505 +msgid "Delete Waypoints From _Selection..." +msgstr "" + +#: ../src/viktrwlayer.c:4512 ../src/viktrwlayer.c:8339 +msgid "Delete Duplicate Waypoints" +msgstr "" + +#: ../src/viktrwlayer.c:5198 +#, c-format +msgid "Are you sure you want to delete all tracks in %s?" +msgstr "" + +#: ../src/viktrwlayer.c:5211 +#, c-format +msgid "Are you sure you want to delete all routes in %s?" +msgstr "" + +#: ../src/viktrwlayer.c:5221 +#, c-format +msgid "Are you sure you want to delete all waypoints in %s?" +msgstr "" + +#: ../src/viktrwlayer.c:5238 +#, c-format +msgid "Are you sure you want to delete the waypoint \"%s\"?" +msgstr "" + +#: ../src/viktrwlayer.c:5254 +#, c-format +msgid "Are you sure you want to delete the track \"%s\"?" +msgstr "" + +#: ../src/viktrwlayer.c:5271 +#, c-format +msgid "Are you sure you want to delete the route \"%s\"?" +msgstr "" + +#: ../src/viktrwlayer.c:5527 ../src/viktrwlayer.c:6373 +msgid "" +"Converting a track to a route removes extra track data such as segments, " +"timestamps, etc...\n" +"Do you want to continue?" +msgstr "" + +#: ../src/viktrwlayer.c:5631 +msgid "No DEM layers available, thus no DEM values can be applied." +msgstr "" + +#: ../src/viktrwlayer.c:5651 ../src/viktrwlayer.c:5692 +#, c-format +msgid "%ld point adjusted" +msgid_plural "%ld points adjusted" +msgstr[0] "" +msgstr[1] "" + +#: ../src/viktrwlayer.c:5736 +#, c-format +msgid "%ld waypoint changed" +msgid_plural "%ld waypoints changed" +msgstr[0] "" +msgstr[1] "" + +#: ../src/viktrwlayer.c:5917 +#, c-format +msgid "" +"Refining a track with many points (%d) is unlikely to yield sensible " +"results. Do you want to Continue?" +msgstr "" + +#. Select engine from dialog +#: ../src/viktrwlayer.c:5925 +msgid "Refine Route with Routing Engine..." +msgstr "" + +#: ../src/viktrwlayer.c:5933 +msgid "Select routing engine" +msgstr "" + +#: ../src/viktrwlayer.c:6158 +msgid "Failed. No other tracks with timestamps in this layer found" +msgstr "" + +#: ../src/viktrwlayer.c:6160 +msgid "Failed. No other tracks without timestamps in this layer found" +msgstr "" + +#: ../src/viktrwlayer.c:6179 +msgid "Merge with..." +msgstr "" + +#: ../src/viktrwlayer.c:6180 +msgid "Select route to merge with" +msgstr "" + +#: ../src/viktrwlayer.c:6180 +msgid "Select track to merge with" +msgstr "" + +#: ../src/viktrwlayer.c:6264 ../src/viktrwlayer.c:6346 +msgid "Append Route" +msgstr "" + +#: ../src/viktrwlayer.c:6264 ../src/viktrwlayer.c:6346 +msgid "Append Track" +msgstr "" + +#: ../src/viktrwlayer.c:6265 +msgid "Select the route to append after the current route" +msgstr "" + +#: ../src/viktrwlayer.c:6266 +msgid "Select the track to append after the current track" +msgstr "" + +#: ../src/viktrwlayer.c:6347 +msgid "Select the track to append after the current route" +msgstr "" + +#: ../src/viktrwlayer.c:6348 +msgid "Select the route to append after the current track" +msgstr "" + +#: ../src/viktrwlayer.c:6414 +#, c-format +msgid "%d segment merged" +msgid_plural "%d segments merged" +msgstr[0] "" +msgstr[1] "" + +#: ../src/viktrwlayer.c:6430 +msgid "Failed. This track does not have timestamp" +msgstr "" + +#: ../src/viktrwlayer.c:6442 +msgid "Failed. No other track in this layer has timestamp" +msgstr "" + +#: ../src/viktrwlayer.c:6449 +msgid "Merge Threshold..." +msgstr "" + +#: ../src/viktrwlayer.c:6450 +msgid "Merge when time between tracks less than:" +msgstr "" + +#: ../src/viktrwlayer.c:6580 +msgid "Split Threshold..." +msgstr "" + +#: ../src/viktrwlayer.c:6581 +msgid "Split when time between trackpoints exceeds:" +msgstr "" + +#: ../src/viktrwlayer.c:6598 +#, c-format +msgid "" +"Can not split track due to trackpoints not ordered in time - such as at %s.\n" +"\n" +"Goto this trackpoint?" +msgstr "" + +#: ../src/viktrwlayer.c:6668 +msgid "Split Every Nth Point" +msgstr "" + +#: ../src/viktrwlayer.c:6669 +msgid "Split on every Nth point:" +msgstr "" + +#: ../src/viktrwlayer.c:6779 +msgid "Can not split track as it has no segments" +msgstr "" + +#: ../src/viktrwlayer.c:6861 ../src/viktrwlayer.c:6891 +#, c-format +msgid "Deleted %ld point" +msgid_plural "Deleted %ld points" +msgstr[0] "" +msgstr[1] "" + +#: ../src/viktrwlayer.c:6966 ../src/viktrwlayer.c:10989 +#: ../src/viktrwlayer_waypointlist.c:214 +#, c-format +msgid "Could not launch %s to open file." +msgstr "" + +#: ../src/viktrwlayer.c:6992 ../src/viktrwlayer.c:7113 +msgid "This track has no date information." +msgstr "" + +#: ../src/viktrwlayer.c:7006 ../src/viktrwlayer.c:7136 +msgid "This waypoint has no date information." +msgstr "" + +#: ../src/viktrwlayer.c:7030 +#, c-format +msgid "Could not launch %s" +msgstr "" + +#: ../src/viktrwlayer.c:7269 +msgid "Internal Error in vik_trw_layer_uniquify_tracks" +msgstr "" + +#: ../src/viktrwlayer.c:7374 ../src/viktrwlayer.c:7424 +#: ../src/viktrwlayer.c:7587 +msgid "" +"Multiple entries with the same name exist. This method only works with " +"unique names. Force unique names now?" +msgstr "" + +#: ../src/viktrwlayer.c:7385 +msgid "No tracks found" +msgstr "" + +#: ../src/viktrwlayer.c:7393 ../src/viktrwlayer.c:7443 +#: ../src/viktrwlayer.c:7607 +msgid "Delete Selection" +msgstr "" + +#: ../src/viktrwlayer.c:7394 +msgid "Select tracks to delete" +msgstr "" + +#: ../src/viktrwlayer.c:7435 +msgid "No routes found" +msgstr "" + +#: ../src/viktrwlayer.c:7444 +msgid "Select routes to delete" +msgstr "" + +#: ../src/viktrwlayer.c:7550 +msgid "Internal Error in vik_trw_layer_uniquify_waypoints" +msgstr "" + +#: ../src/viktrwlayer.c:7597 +msgid "No waypoints found" +msgstr "" + +#: ../src/viktrwlayer.c:7608 +msgid "Select waypoints to delete" +msgstr "" + +#: ../src/viktrwlayer.c:7691 +#, c-format +msgid "%ld waypoint deleted" +msgid_plural "%ld waypoints deleted" +msgstr[0] "" +msgstr[1] "" + +#: ../src/viktrwlayer.c:7697 +msgid "No duplicates found" +msgstr "" + +#: ../src/viktrwlayer.c:8028 +#, c-format +msgid "" +"A waypoint with the name \"%s\" already exists. Really rename to the same " +"name?" +msgstr "" + +#: ../src/viktrwlayer.c:8058 +#, c-format +msgid "" +"A track with the name \"%s\" already exists. Really rename to the same name?" +msgstr "" + +#: ../src/viktrwlayer.c:8095 +#, c-format +msgid "" +"A route with the name \"%s\" already exists. Really rename to the same name?" +msgstr "" + +#: ../src/viktrwlayer.c:8215 ../src/viktrwlayer.c:8602 +msgid "_Goto" +msgstr "" + +#: ../src/viktrwlayer.c:8226 +msgid "_Visit Geocache Webpage" +msgstr "" + +#: ../src/viktrwlayer.c:8235 +msgid "Geotag multiple images against this waypoint" +msgstr "" + +#: ../src/viktrwlayer.c:8245 ../src/viktrwlayer_waypointlist.c:352 +msgid "_Show Picture..." +msgstr "" + +#: ../src/viktrwlayer.c:8253 +msgid "Update Geotag on _Image" +msgstr "" + +#: ../src/viktrwlayer.c:8259 +msgid "_Update" +msgstr "" + +#: ../src/viktrwlayer.c:8264 +msgid "Update and _Keep File Timestamp" +msgstr "" + +#: ../src/viktrwlayer.c:8276 +msgid "Visit _Webpage" +msgstr "" + +#: ../src/viktrwlayer.c:8306 +msgid "_New Waypoint..." +msgstr "" + +#: ../src/viktrwlayer.c:8315 +msgid "_View All Waypoints" +msgstr "" + +#: ../src/viktrwlayer.c:8327 +msgid "Delete _All Waypoints" +msgstr "" + +#: ../src/viktrwlayer.c:8333 +msgid "_Delete Waypoints From Selection..." +msgstr "" + +#: ../src/viktrwlayer.c:8351 +msgid "_Show All Waypoints" +msgstr "" + +#: ../src/viktrwlayer.c:8357 +msgid "_Hide All Waypoints" +msgstr "" + +#: ../src/viktrwlayer.c:8369 +msgid "_List Waypoints..." +msgstr "" + +#: ../src/viktrwlayer.c:8390 +msgid "_View All Tracks" +msgstr "" + +#: ../src/viktrwlayer.c:8396 +msgid "_New Track" +msgstr "" + +#: ../src/viktrwlayer.c:8404 +msgid "Delete _All Tracks" +msgstr "" + +#: ../src/viktrwlayer.c:8410 +msgid "_Delete Tracks From Selection..." +msgstr "" + +#: ../src/viktrwlayer.c:8422 +msgid "_Show All Tracks" +msgstr "" + +#: ../src/viktrwlayer.c:8428 +msgid "_Hide All Tracks" +msgstr "" + +#: ../src/viktrwlayer.c:8439 +msgid "_List Tracks..." +msgstr "" + +#: ../src/viktrwlayer.c:8467 +msgid "_View All Routes" +msgstr "" + +#: ../src/viktrwlayer.c:8473 +msgid "_New Route" +msgstr "" + +#: ../src/viktrwlayer.c:8499 +msgid "_Show All Routes" +msgstr "" + +#: ../src/viktrwlayer.c:8505 +msgid "_Hide All Routes" +msgstr "" + +#: ../src/viktrwlayer.c:8516 +msgid "_List Routes..." +msgstr "" + +#: ../src/viktrwlayer.c:8587 +msgid "_View Track" +msgstr "" + +#: ../src/viktrwlayer.c:8589 +msgid "_View Route" +msgstr "" + +#: ../src/viktrwlayer.c:8608 +msgid "_Startpoint" +msgstr "" + +#: ../src/viktrwlayer.c:8614 +msgid "\"_Center\"" +msgstr "" + +#: ../src/viktrwlayer.c:8620 +msgid "_Endpoint" +msgstr "" + +#: ../src/viktrwlayer.c:8626 +msgid "_Highest Altitude" +msgstr "" + +#: ../src/viktrwlayer.c:8632 +msgid "_Lowest Altitude" +msgstr "" + +#: ../src/viktrwlayer.c:8640 +msgid "_Maximum Speed" +msgstr "" + +#: ../src/viktrwlayer.c:8646 +msgid "_Date" +msgstr "" + +#: ../src/viktrwlayer.c:8655 +msgid "Co_mbine" +msgstr "" + +#: ../src/viktrwlayer.c:8663 +msgid "_Merge By Time..." +msgstr "" + +#: ../src/viktrwlayer.c:8668 +msgid "Merge _Segments" +msgstr "" + +#: ../src/viktrwlayer.c:8675 +msgid "Merge _With Other Tracks..." +msgstr "" + +#: ../src/viktrwlayer.c:8682 +msgid "_Append Track..." +msgstr "" + +#: ../src/viktrwlayer.c:8684 +msgid "_Append Route..." +msgstr "" + +#: ../src/viktrwlayer.c:8690 +msgid "Append _Route..." +msgstr "" + +#: ../src/viktrwlayer.c:8692 +msgid "Append _Track..." +msgstr "" + +#: ../src/viktrwlayer.c:8699 +msgid "_Split" +msgstr "" + +#: ../src/viktrwlayer.c:8707 +msgid "_Split By Time..." +msgstr "" + +#. ATM always enable this entry - don't want to have to analyse the track before displaying the menu - to keep the menu speedy +#: ../src/viktrwlayer.c:8713 +msgid "Split Se_gments" +msgstr "" + +#: ../src/viktrwlayer.c:8719 +msgid "Split By _Number of Points..." +msgstr "" + +#: ../src/viktrwlayer.c:8724 +msgid "Split at _Trackpoint" +msgstr "" + +#: ../src/viktrwlayer.c:8732 +msgid "_Insert Points" +msgstr "" + +#: ../src/viktrwlayer.c:8738 +msgid "Insert Point _Before Selected Point" +msgstr "" + +#: ../src/viktrwlayer.c:8745 +msgid "Insert Point _After Selected Point" +msgstr "" + +#: ../src/viktrwlayer.c:8754 +msgid "Delete Poi_nts" +msgstr "" + +#: ../src/viktrwlayer.c:8760 +msgid "Delete _Selected Point" +msgstr "" + +#: ../src/viktrwlayer.c:8768 +msgid "Delete Points With The Same _Position" +msgstr "" + +#: ../src/viktrwlayer.c:8773 +msgid "Delete Points With The Same _Time" +msgstr "" + +#: ../src/viktrwlayer.c:8780 ../src/viktrwlayer.c:9029 +msgid "_Transform" +msgstr "" + +#: ../src/viktrwlayer.c:8788 ../src/viktrwlayer.c:9037 +msgid "_Apply DEM Data" +msgstr "" + +#: ../src/viktrwlayer.c:8793 ../src/viktrwlayer.c:9042 +msgid "_Overwrite" +msgstr "" + +#: ../src/viktrwlayer.c:8796 ../src/viktrwlayer.c:9045 +msgid "Overwrite any existing elevation values with DEM values" +msgstr "" + +#: ../src/viktrwlayer.c:8799 ../src/viktrwlayer.c:9048 +msgid "_Keep Existing" +msgstr "" + +#: ../src/viktrwlayer.c:8802 ../src/viktrwlayer.c:9051 +msgid "Keep existing elevation values, only attempt for missing values" +msgstr "" + +#: ../src/viktrwlayer.c:8807 +msgid "_Smooth Missing Elevation Data" +msgstr "" + +#: ../src/viktrwlayer.c:8812 +msgid "_Interpolated" +msgstr "" + +#: ../src/viktrwlayer.c:8815 +msgid "" +"Interpolate between known elevation values to derive values for the missing " +"elevations" +msgstr "" + +#: ../src/viktrwlayer.c:8818 +msgid "_Flat" +msgstr "" + +#: ../src/viktrwlayer.c:8821 +msgid "Set unknown elevation values to the last known value" +msgstr "" + +#: ../src/viktrwlayer.c:8825 +msgid "C_onvert to a Route" +msgstr "" + +#: ../src/viktrwlayer.c:8827 +msgid "C_onvert to a Track" +msgstr "" + +#: ../src/viktrwlayer.c:8835 +msgid "_Anonymize Times" +msgstr "" + +#: ../src/viktrwlayer.c:8838 +msgid "Shift timestamps to a relative offset from 1901-01-01" +msgstr "" + +#: ../src/viktrwlayer.c:8841 +msgid "_Interpolate Times" +msgstr "" + +#: ../src/viktrwlayer.c:8844 +msgid "" +"Reset trackpoint timestamps between the first and last points such that " +"track is traveled at equal speed" +msgstr "" + +#: ../src/viktrwlayer.c:8849 +msgid "_Reverse Track" +msgstr "" + +#: ../src/viktrwlayer.c:8851 +msgid "_Reverse Route" +msgstr "" + +#: ../src/viktrwlayer.c:8858 +msgid "Refine Route..." +msgstr "" + +#: ../src/viktrwlayer.c:8868 +msgid "Down_load Maps Along Track..." +msgstr "" + +#: ../src/viktrwlayer.c:8870 +msgid "Down_load Maps Along Route..." +msgstr "" + +#: ../src/viktrwlayer.c:8878 +msgid "_Export Track as GPX..." +msgstr "" + +#: ../src/viktrwlayer.c:8880 +msgid "_Export Route as GPX..." +msgstr "" + +#: ../src/viktrwlayer.c:8887 +msgid "E_xtend Track End" +msgstr "" + +#: ../src/viktrwlayer.c:8889 +msgid "E_xtend Route End" +msgstr "" + +#: ../src/viktrwlayer.c:8896 +msgid "Extend _Using Route Finder" +msgstr "" + +#: ../src/viktrwlayer.c:8911 +msgid "_Upload to GPS..." +msgstr "" + +#: ../src/viktrwlayer.c:8926 +msgid "_Diary" +msgstr "" + +#: ../src/viktrwlayer.c:8930 +msgid "Open diary program at this date" +msgstr "" + +#: ../src/viktrwlayer.c:8935 +msgid "_Astronomy" +msgstr "" + +#: ../src/viktrwlayer.c:8938 +msgid "Open astronomy program at this date and location" +msgstr "" + +#: ../src/viktrwlayer.c:8962 +msgid "_View Google Directions" +msgstr "" + +#: ../src/viktrwlayer.c:8984 +msgid "Use with _Filter" +msgstr "" + +#: ../src/viktrwlayer.c:9018 +msgid "_Edit Trackpoint" +msgstr "" + +#: ../src/viktrwlayer.c:10116 +#, c-format +msgid " - Gain %dm:Loss %dm" +msgstr "" + +#: ../src/viktrwlayer.c:10118 +#, c-format +msgid " - Gain %dft:Loss %dft" +msgstr "" + +#: ../src/viktrwlayer.c:10123 +#, c-format +msgid " - Bearing %3.1f° - Step %s" +msgstr "" + +#: ../src/viktrwlayer.c:10232 +#, c-format +msgid "Querying %s for route between (%.3f, %.3f) and (%.3f, %.3f)." +msgstr "" + +#: ../src/viktrwlayer.c:10248 +#, c-format +msgid "%s returned route between (%.3f, %.3f) and (%.3f, %.3f)." +msgstr "" + +#: ../src/viktrwlayer.c:10251 +#, c-format +msgid "Error getting route from %s." +msgstr "" + +#: ../src/viktrwlayer.c:11070 +#, c-format +msgid "Creating %d Image Thumbnails..." +msgstr "" + +#: ../src/viktrwlayer.c:11560 +msgid "No map layer in use. Create one first" +msgstr "" + +#: ../src/viktrwlayer.c:11679 +#, c-format +msgid "%s: Track List" +msgstr "" + +#: ../src/viktrwlayer.c:11681 +#, c-format +msgid "%s: Route List" +msgstr "" + +#: ../src/viktrwlayer.c:11734 +#, c-format +msgid "" +"Could not write external layer %s to %s, please fix and save before exiting " +"or data will be lost" +msgstr "" + +#: ../src/viktrwlayer.c:11782 +#, c-format +msgid "WARNING: issues encountered loading external layer %s from %s" +msgstr "" + +#: ../src/viktrwlayer_export.c:47 +msgid "Auto Device GPX Simplify:" +msgstr "" + +#: ../src/viktrwlayer_export.c:48 +msgid "" +"GPX saves to certain devices will be simplified for device compatibility." +msgstr "" + +#: ../src/viktrwlayer_export.c:125 +#, c-format +msgid "Export of GPX file simplified using point limit: %d" +msgstr "" + +#: ../src/viktrwlayer_export.c:206 ../src/viktrwlayer_export.c:323 +#: ../src/vikwindow.c:3694 +msgid "The filename you requested could not be opened for writing." +msgstr "" + +#: ../src/viktrwlayer_export.c:226 +#, c-format +msgid "Could not launch %s." +msgstr "" + +#: ../src/viktrwlayer_export.c:234 +msgid "Could not create temporary file for export." +msgstr "" + +#: ../src/viktrwlayer_export.c:268 +msgid "File format:" +msgstr "" + +#: ../src/viktrwlayer_export.c:276 +msgid "Select the file format." +msgstr "" + +#: ../src/viktrwlayer_export.c:281 +msgid "" +"Select the information to process.\n" +"Warning: the behavior of these switches is highly dependent of the file " +"format selected.\n" +"Please, refer to GPSbabel if unsure." +msgstr "" + +#: ../src/viktrwlayer_export.c:308 +msgid "You did not select a valid file format." +msgstr "" + +#: ../src/viktrwlayer_propwin.c:915 ../src/viktrwlayer_propwin.c:3381 +#: ../src/viktrwlayer_propwin.c:3417 ../src/viktrwlayer_propwin.c:3457 +#: ../src/viktrwlayer_propwin.c:3509 ../src/viktrwlayer_propwin.c:3527 +#: ../src/viktrwlayer_propwin.c:3600 ../src/viktrwlayer_propwin.c:3601 +#: ../src/viktrwlayer_propwin.c:3602 ../src/viktrwlayer_propwin.c:3611 +#: ../src/viktrwlayer_propwin.c:3612 ../src/viktrwlayer_propwin.c:3629 +#: ../src/viktrwlayer_propwin.c:3630 ../src/viktrwlayer_propwin.c:3644 +#: ../src/viktrwlayer_propwin.c:3645 ../src/viktrwlayer_propwin.c:3646 +#: ../src/viktrwlayer_propwin.c:3660 ../src/viktrwlayer_propwin.c:3661 +#: ../src/viktrwlayer_propwin.c:3662 ../src/viktrwlayer_propwin.c:3676 +#: ../src/viktrwlayer_propwin.c:3677 ../src/viktrwlayer_propwin.c:3678 +#: ../src/viktrwlayer_propwin.c:3695 ../src/viktrwlayer_propwin.c:3696 +#: ../src/viktrwlayer_analysis.c:293 +#, c-format +msgid "No Data" +msgstr "" + +#: ../src/viktrwlayer_propwin.c:960 ../src/viktrwlayer_propwin.c:1245 +#, c-format +msgid "%.1f kph" +msgstr "" + +#: ../src/viktrwlayer_propwin.c:963 ../src/viktrwlayer_propwin.c:1248 +#: ../src/viktrwlayer_analysis.c:352 +#, c-format +msgid "%.1f mph" +msgstr "" + +#: ../src/viktrwlayer_propwin.c:966 ../src/viktrwlayer_propwin.c:1251 +#, c-format +msgid "%.1f knots" +msgstr "" + +#: ../src/viktrwlayer_propwin.c:969 ../src/viktrwlayer_propwin.c:1254 +#, c-format +msgid "%.1f s/km" +msgstr "" + +#: ../src/viktrwlayer_propwin.c:972 ../src/viktrwlayer_propwin.c:1257 +#: ../src/viktrwlayer_analysis.c:389 ../src/viktrwlayer_analysis.c:392 +#, c-format +msgid "%.1f min/km" +msgstr "" + +#: ../src/viktrwlayer_propwin.c:975 ../src/viktrwlayer_propwin.c:1260 +#, c-format +msgid "%.1f sec/mi" +msgstr "" + +#: ../src/viktrwlayer_propwin.c:978 ../src/viktrwlayer_propwin.c:1263 +#: ../src/viktrwlayer_analysis.c:409 ../src/viktrwlayer_analysis.c:412 +#, c-format +msgid "%.1f min/mi" +msgstr "" + +#. VIK_UNITS_SPEED_METRES_PER_SECOND: +#: ../src/viktrwlayer_propwin.c:982 ../src/viktrwlayer_propwin.c:1267 +#, c-format +msgid "%.1f m/s" +msgstr "" + +#. Minutes +#: ../src/viktrwlayer_propwin.c:1411 +msgid "mins" +msgstr "" + +#. Hours +#: ../src/viktrwlayer_propwin.c:1418 +msgid "h" +msgstr "" + +#. Days +#: ../src/viktrwlayer_propwin.c:1424 +msgid "d" +msgstr "" + +#. Weeks +#: ../src/viktrwlayer_propwin.c:1429 +msgid "w" +msgstr "" + +#. 'Months' +#: ../src/viktrwlayer_propwin.c:1433 +msgid "M" +msgstr "" + +#: ../src/viktrwlayer_propwin.c:2051 ../src/viktrwlayer_analysis.c:303 +#, c-format +msgid "%.1f miles" +msgstr "" + +#: ../src/viktrwlayer_propwin.c:2054 ../src/viktrwlayer_analysis.c:306 +#, c-format +msgid "%.1f NM" +msgstr "" + +#. VIK_UNITS_DISTANCE_KILOMETRES +#: ../src/viktrwlayer_propwin.c:2057 ../src/viktrwlayer_analysis.c:310 +#, c-format +msgid "%.1f km" +msgstr "" + +#: ../src/viktrwlayer_propwin.c:3083 +msgid "Failed spliting track. Track unchanged" +msgstr "" + +#: ../src/viktrwlayer_propwin.c:3234 ../src/viktrwlayer_propwin.c:3744 +#, c-format +msgid "%s - Track Properties" +msgstr "" + +#: ../src/viktrwlayer_propwin.c:3239 +msgid "Split at _Marker" +msgstr "" + +#: ../src/viktrwlayer_propwin.c:3240 +msgid "Split _Segments" +msgstr "" + +#: ../src/viktrwlayer_propwin.c:3241 +msgid "_Reverse" +msgstr "" + +#: ../src/viktrwlayer_propwin.c:3242 +msgid "_Delete Dupl." +msgstr "" + +#: ../src/viktrwlayer_propwin.c:3269 +msgid "Comment:" +msgstr "" + +#: ../src/viktrwlayer_propwin.c:3270 +msgid "Description:" +msgstr "" + +#: ../src/viktrwlayer_propwin.c:3271 +msgid "Source:" +msgstr "" + +#: ../src/viktrwlayer_propwin.c:3272 +msgid "Type:" +msgstr "" + +#: ../src/viktrwlayer_propwin.c:3273 +msgid "Color:" +msgstr "" + +#: ../src/viktrwlayer_propwin.c:3274 +msgid "Draw Name:" +msgstr "" + +#: ../src/viktrwlayer_propwin.c:3275 +msgid "Distance Labels:" +msgstr "" + +#: ../src/viktrwlayer_propwin.c:3278 +msgid "Track Length:" +msgstr "" + +#: ../src/viktrwlayer_propwin.c:3279 +msgid "Trackpoints:" +msgstr "" + +#: ../src/viktrwlayer_propwin.c:3280 +msgid "Segments:" +msgstr "" + +#: ../src/viktrwlayer_propwin.c:3281 +msgid "Duplicate Points:" +msgstr "" + +#: ../src/viktrwlayer_propwin.c:3282 +msgid "Max Speed:" +msgstr "" + +#: ../src/viktrwlayer_propwin.c:3283 +msgid "Avg. Speed:" +msgstr "" + +#: ../src/viktrwlayer_propwin.c:3284 +msgid "Moving Avg. Speed:" +msgstr "" + +#: ../src/viktrwlayer_propwin.c:3285 +msgid "Avg. Dist. Between TPs:" +msgstr "" + +#: ../src/viktrwlayer_propwin.c:3286 +msgid "Elevation Range:" +msgstr "" + +#: ../src/viktrwlayer_propwin.c:3287 +msgid "Total Elevation Gain/Loss:" +msgstr "" + +#: ../src/viktrwlayer_propwin.c:3288 +msgid "Start:" +msgstr "" + +#: ../src/viktrwlayer_propwin.c:3289 +msgid "End:" +msgstr "" + +#: ../src/viktrwlayer_propwin.c:3290 +msgid "Duration:" +msgstr "" + +#: ../src/viktrwlayer_propwin.c:3320 +msgid "Centre" +msgstr "" + +#: ../src/viktrwlayer_propwin.c:3321 +msgid "Start only" +msgstr "" + +#: ../src/viktrwlayer_propwin.c:3322 +msgid "End only" +msgstr "" + +#: ../src/viktrwlayer_propwin.c:3323 +msgid "Start and End" +msgstr "" + +#: ../src/viktrwlayer_propwin.c:3324 +msgid "Centre, Start and End" +msgstr "" + +#: ../src/viktrwlayer_propwin.c:3336 +msgid "Maximum number of distance labels to be shown" +msgstr "" + +#: ../src/viktrwlayer_propwin.c:3340 +msgid "Properties" +msgstr "" + +#: ../src/viktrwlayer_propwin.c:3584 +#, c-format +msgid "%d minutes - %d minutes moving" +msgstr "" + +#: ../src/viktrwlayer_propwin.c:3596 +#, c-format +msgid "%s total - %s in segments" +msgstr "" + +#: ../src/viktrwlayer_propwin.c:3607 ../src/viktrwlayer_analysis.c:622 +msgid "Statistics" +msgstr "" + +#: ../src/viktrwlayer_propwin.c:3613 ../src/viktrwlayer_propwin.c:3680 +msgid "Show D_EM" +msgstr "" + +#: ../src/viktrwlayer_propwin.c:3615 ../src/viktrwlayer_propwin.c:3631 +#: ../src/viktrwlayer_propwin.c:3647 ../src/viktrwlayer_propwin.c:3697 +msgid "Show _GPS Speed" +msgstr "" + +#: ../src/viktrwlayer_propwin.c:3617 ../src/viktrwlayer_propwin.c:3633 +#: ../src/viktrwlayer_propwin.c:3665 ../src/viktrwlayer_propwin.c:3699 +msgid "Track Distance:" +msgstr "" + +#: ../src/viktrwlayer_propwin.c:3618 ../src/viktrwlayer_propwin.c:3684 +msgid "Track Height:" +msgstr "" + +#: ../src/viktrwlayer_propwin.c:3624 +msgid "Elevation-distance" +msgstr "" + +#: ../src/viktrwlayer_propwin.c:3634 +msgid "Track Gradient:" +msgstr "" + +#: ../src/viktrwlayer_propwin.c:3639 +msgid "Gradient-distance" +msgstr "" + +#: ../src/viktrwlayer_propwin.c:3649 ../src/viktrwlayer_propwin.c:3666 +#: ../src/viktrwlayer_propwin.c:3683 +msgid "Track Time:" +msgstr "" + +#: ../src/viktrwlayer_propwin.c:3650 ../src/viktrwlayer_propwin.c:3700 +msgid "Track Speed:" +msgstr "" + +#: ../src/viktrwlayer_propwin.c:3651 ../src/viktrwlayer_propwin.c:3667 +#: ../src/viktrwlayer_propwin.c:3685 +msgid "Time/Date:" +msgstr "" + +#: ../src/viktrwlayer_propwin.c:3655 +msgid "Speed-time" +msgstr "" + +#: ../src/viktrwlayer_propwin.c:3663 ../src/viktrwlayer_propwin.c:3679 +msgid "Show S_peed" +msgstr "" + +#: ../src/viktrwlayer_propwin.c:3671 +msgid "Distance-time" +msgstr "" + +#: ../src/viktrwlayer_propwin.c:3690 +msgid "Elevation-time" +msgstr "" + +#: ../src/viktrwlayer_propwin.c:3705 +msgid "Speed-distance" +msgstr "" + +#: ../src/viktrwlayer_tpwin.c:190 ../src/viktrwlayer_wpwin.c:66 +msgid "Date/Time Edit" +msgstr "" + +#: ../src/viktrwlayer_tpwin.c:242 +msgid "Name:" +msgstr "" + +#: ../src/viktrwlayer_tpwin.c:243 +msgid "Latitude:" +msgstr "" + +#: ../src/viktrwlayer_tpwin.c:244 +msgid "Longitude:" +msgstr "" + +#: ../src/viktrwlayer_tpwin.c:245 +msgid "Altitude:" +msgstr "" + +#: ../src/viktrwlayer_tpwin.c:246 +msgid "Course:" +msgstr "" + +#: ../src/viktrwlayer_tpwin.c:247 +msgid "Timestamp:" +msgstr "" + +#: ../src/viktrwlayer_tpwin.c:248 +msgid "Time:" +msgstr "" + +#: ../src/viktrwlayer_tpwin.c:249 +msgid "Distance Difference:" +msgstr "" + +#: ../src/viktrwlayer_tpwin.c:250 +msgid "Time Difference:" +msgstr "" + +#: ../src/viktrwlayer_tpwin.c:251 +msgid "\"Speed\" Between:" +msgstr "" + +#: ../src/viktrwlayer_tpwin.c:252 +msgid "Speed:" +msgstr "" + +#: ../src/viktrwlayer_tpwin.c:253 +msgid "VDOP:" +msgstr "" + +#: ../src/viktrwlayer_tpwin.c:254 +msgid "HDOP:" +msgstr "" + +#: ../src/viktrwlayer_tpwin.c:255 +msgid "PDOP:" +msgstr "" + +#: ../src/viktrwlayer_tpwin.c:256 +msgid "SAT/FIX:" +msgstr "" + +#: ../src/viktrwlayer_tpwin.c:263 ../src/viktrwlayer_tpwin.c:408 +#: ../src/viktrwlayer_tpwin.c:622 +msgid "Trackpoint" +msgstr "" + +#: ../src/viktrwlayer_tpwin.c:266 +msgid "_Insert After" +msgstr "" + +#: ../src/viktrwlayer_tpwin.c:268 +msgid "Split Here" +msgstr "" + +#: ../src/viktrwlayer_tracklist.c:262 ../src/viktrwlayer_waypointlist.c:306 +msgid "_Copy Data" +msgstr "" + +#. +#. item = gtk_image_menu_item_new_with_mnemonic ( _("_Select") ); +#. gtk_image_menu_item_set_image ( (GtkImageMenuItem*)item, gtk_image_new_from_stock (GTK_STOCK_FIND, GTK_ICON_SIZE_MENU) ); +#. g_signal_connect_swapped ( G_OBJECT(item), "activate", G_CALLBACK(trw_layer_track_select), values ); +#. gtk_menu_shell_append (GTK_MENU_SHELL (menu), item); +#. gtk_widget_show ( item ); +#. +#. ATM view auto selects, so don't bother with separate select menu entry +#. +#. item = gtk_image_menu_item_new_with_mnemonic ( _("_Select") ); +#. gtk_image_menu_item_set_image ( (GtkImageMenuItem*)item, gtk_image_new_from_stock (GTK_STOCK_FIND, GTK_ICON_SIZE_MENU) ); +#. g_signal_connect_swapped ( G_OBJECT(item), "activate", G_CALLBACK(trw_layer_waypoint_select), values ); +#. gtk_menu_shell_append (GTK_MENU_SHELL (menu), item); +#. gtk_widget_show ( item ); +#. +#. AUTO SELECT NOT TRUE YET... +#. ATM view auto selects, so don't bother with separate select menu entry +#: ../src/viktrwlayer_tracklist.c:290 ../src/viktrwlayer_waypointlist.c:341 +#: ../src/vikwindow.c:4816 +msgid "_View" +msgstr "" + +#. Insert column for the layer name when viewing multi layers +#: ../src/viktrwlayer_tracklist.c:613 ../src/viktrwlayer_waypointlist.c:609 +msgid "Layer" +msgstr "" + +#: ../src/viktrwlayer_tracklist.c:627 ../src/viktrwlayer_waypointlist.c:624 +msgid "Date" +msgstr "" + +#: ../src/viktrwlayer_tracklist.c:631 ../src/viktrwlayer_waypointlist.c:628 +msgid "Visible" +msgstr "" + +#: ../src/viktrwlayer_tracklist.c:639 +msgid "" +"Distance\n" +"(miles)" +msgstr "" + +#: ../src/viktrwlayer_tracklist.c:642 +msgid "" +"Distance\n" +"(NM)" +msgstr "" + +#: ../src/viktrwlayer_tracklist.c:645 +msgid "" +"Distance\n" +"(km)" +msgstr "" + +#: ../src/viktrwlayer_tracklist.c:651 +msgid "" +"Length\n" +"(minutes)" +msgstr "" + +#: ../src/viktrwlayer_tracklist.c:660 ../src/vikutils.c:93 +msgid "sec/mi" +msgstr "" + +#: ../src/viktrwlayer_tracklist.c:666 +#, c-format +msgid "" +"Av. Speed\n" +"(%s)" +msgstr "" + +#. Apply own formatting of the data +#: ../src/viktrwlayer_tracklist.c:671 +#, c-format +msgid "" +"Max Speed\n" +"(%s)" +msgstr "" + +#: ../src/viktrwlayer_tracklist.c:679 ../src/viktrwlayer_waypointlist.c:637 +msgid "" +"Max Height\n" +"(Feet)" +msgstr "" + +#: ../src/viktrwlayer_tracklist.c:681 ../src/viktrwlayer_waypointlist.c:639 +msgid "" +"Max Height\n" +"(Metres)" +msgstr "" + +#: ../src/viktrwlayer_waypointlist.c:312 +msgid "Copy Data (with _positions)" +msgstr "" + +#: ../src/viktrwlayer_waypointlist.c:633 +msgid "Comment" +msgstr "" + +#: ../src/viktrwlayer_waypointlist.c:643 +msgid "Symbol" +msgstr "" + +#: ../src/viktrwlayer_wpwin.c:93 ../src/viktrwlayer_wpwin.c:302 +msgid "True" +msgstr "" + +#: ../src/viktrwlayer_wpwin.c:122 +msgid "Waypoint Properties" +msgstr "" + +#: ../src/viktrwlayer_wpwin.c:164 +msgid "Name:" +msgstr "" + +#: ../src/viktrwlayer_wpwin.c:181 +msgid "Altitude:" +msgstr "" + +#: ../src/viktrwlayer_wpwin.c:186 ../src/viktrwlayer_wpwin.c:188 +msgid "Comment:" +msgstr "" + +#: ../src/viktrwlayer_wpwin.c:202 +msgid "Source:" +msgstr "" + +#: ../src/viktrwlayer_wpwin.c:212 +msgid "Image:" +msgstr "" + +#: ../src/viktrwlayer_wpwin.c:217 +msgid "Symbol:" +msgstr "" + +#: ../src/viktrwlayer_wpwin.c:226 +msgid "(none)" +msgstr "" + +#. Geotag Info [readonly] +#: ../src/viktrwlayer_wpwin.c:272 +msgid "Has Geotag" +msgstr "" + +#: ../src/viktrwlayer_wpwin.c:279 +msgid "Consistent Position" +msgstr "" + +#. ATM the direction value box is always shown, even when there is no information. +#. It would be nice to be able to hide it until the 'Add' has been performed, +#. however I've not been able to achieve this. +#. Thus simply sensistizing it instead. +#: ../src/viktrwlayer_wpwin.c:292 +msgid "Image Direction:" +msgstr "" + +#: ../src/viktrwlayer_wpwin.c:300 +msgid "Magnetic" +msgstr "" + +#: ../src/viktrwlayer_wpwin.c:320 +msgid "Time:" +msgstr "" + +#. TODO: other checks (isalpha or whatever ) +#: ../src/viktrwlayer_wpwin.c:386 +msgid "Please enter a name for the waypoint." +msgstr "" + +#: ../src/viktrwlayer_geotag.c:320 ../src/viktrwlayer_geotag.c:460 +#, c-format +msgid "Failed updating EXIF on %s" +msgstr "" + +#: ../src/viktrwlayer_geotag.c:562 +#, c-format +msgid "Geotagging %d Images..." +msgstr "" + +#: ../src/viktrwlayer_geotag.c:630 +msgid "Geotag Images" +msgstr "" + +#: ../src/viktrwlayer_geotag.c:640 +msgid "Images" +msgstr "" + +#: ../src/viktrwlayer_geotag.c:645 +msgid "Overwrite Existing Waypoints:" +msgstr "" + +#: ../src/viktrwlayer_geotag.c:648 +msgid "Overwrite Existing GPS Information:" +msgstr "" + +#: ../src/viktrwlayer_geotag.c:650 +msgid "Keep File Modification Timestamp:" +msgstr "" + +#: ../src/viktrwlayer_geotag.c:684 +msgid "Create Waypoints:" +msgstr "" + +#: ../src/viktrwlayer_geotag.c:693 +msgid "Write EXIF:" +msgstr "" + +#: ../src/viktrwlayer_geotag.c:705 +msgid "Automatic Image Direction:" +msgstr "" + +#: ../src/viktrwlayer_geotag.c:707 +msgid "Set image direction based on a heading derived from the track" +msgstr "" + +#: ../src/viktrwlayer_geotag.c:710 +msgid "Interpolate Between Track Segments:" +msgstr "" + +#: ../src/viktrwlayer_geotag.c:715 +msgid "Image Time Offset (Seconds):" +msgstr "" + +#: ../src/viktrwlayer_geotag.c:718 +msgid "" +"The number of seconds to ADD to the photos time to make it match the GPS " +"data. Calculate this with (GPS - Photo). Can be negative or positive. Useful " +"to adjust times when a camera's timestamp was incorrect." +msgstr "" + +#: ../src/viktrwlayer_geotag.c:721 +msgid "Image Timezone:" +msgstr "" + +#: ../src/viktrwlayer_geotag.c:724 +msgid "" +"The timezone that was used when the images were created. For example, if a " +"camera is set to AWST or +8:00 hours. Enter +8:00 here so that the correct " +"adjustment to the images' time can be made. GPS data is always in UTC." +msgstr "" + +#: ../src/viktrwlayer_geotag.c:728 +#, c-format +msgid "Using waypoint: %s" +msgstr "" + +#: ../src/viktrwlayer_geotag.c:742 +#, c-format +msgid "Using track: %s" +msgstr "" + +#: ../src/viktrwlayer_geotag.c:744 +#, c-format +msgid "Using all tracks in: %s" +msgstr "" + +#: ../src/viktrwlayer_analysis.c:214 +msgid "Number of Tracks" +msgstr "" + +#: ../src/viktrwlayer_analysis.c:215 +msgid "Date Range" +msgstr "" + +#: ../src/viktrwlayer_analysis.c:216 +msgid "Total Length" +msgstr "" + +#: ../src/viktrwlayer_analysis.c:217 +msgid "Average Length" +msgstr "" + +#: ../src/viktrwlayer_analysis.c:218 +msgid "Eddington number" +msgstr "" + +#. No.4: Extended display only +#: ../src/viktrwlayer_analysis.c:219 +msgid "Max Speed" +msgstr "" + +#: ../src/viktrwlayer_analysis.c:220 +msgid "Avg. Speed" +msgstr "" + +#: ../src/viktrwlayer_analysis.c:221 +msgid "Minimum Altitude" +msgstr "" + +#: ../src/viktrwlayer_analysis.c:222 +msgid "Maximum Altitude" +msgstr "" + +#: ../src/viktrwlayer_analysis.c:223 +msgid "Total Elevation Gain/Loss" +msgstr "" + +#: ../src/viktrwlayer_analysis.c:224 +msgid "Avg. Elevation Gain/Loss" +msgstr "" + +#: ../src/viktrwlayer_analysis.c:225 +msgid "Total Duration" +msgstr "" + +#: ../src/viktrwlayer_analysis.c:226 +msgid "Avg. Duration" +msgstr "" + +#: ../src/viktrwlayer_analysis.c:317 +#, c-format +msgid "%.2f miles" +msgstr "" + +#: ../src/viktrwlayer_analysis.c:320 +#, c-format +msgid "%.2f NM" +msgstr "" + +#. VIK_UNITS_DISTANCE_KILOMETRES +#: ../src/viktrwlayer_analysis.c:324 +#, c-format +msgid "%.2f km" +msgstr "" + +#: ../src/viktrwlayer_analysis.c:361 +#, c-format +msgid "%.2f m/s" +msgstr "" + +#: ../src/viktrwlayer_analysis.c:370 ../src/viktrwlayer_analysis.c:373 +#, c-format +msgid "%.2f knots" +msgstr "" + +#: ../src/viktrwlayer_analysis.c:379 ../src/viktrwlayer_analysis.c:382 +#, c-format +msgid "%d s/km" +msgstr "" + +#: ../src/viktrwlayer_analysis.c:399 ../src/viktrwlayer_analysis.c:402 +#, c-format +msgid "%d sec/mi" +msgstr "" + +#: ../src/viktrwlayer_analysis.c:420 ../src/viktrwlayer_analysis.c:423 +#, c-format +msgid "%.2f km/h" +msgstr "" + +#: ../src/viktrwlayer_analysis.c:434 ../src/viktrwlayer_analysis.c:440 +#, c-format +msgid "%d feet" +msgstr "" + +#: ../src/viktrwlayer_analysis.c:445 ../src/viktrwlayer_analysis.c:447 +#, c-format +msgid "%d feet / %d feet" +msgstr "" + +#: ../src/viktrwlayer_analysis.c:452 ../src/viktrwlayer_analysis.c:458 +#, c-format +msgid "%d m" +msgstr "" + +#: ../src/viktrwlayer_analysis.c:463 ../src/viktrwlayer_analysis.c:465 +#, c-format +msgid "%d m / %d m" +msgstr "" + +#: ../src/viktrwlayer_analysis.c:477 +#, c-format +msgid "%d:%02d:%02d days:hrs:mins" +msgstr "" + +#: ../src/viktrwlayer_analysis.c:484 +#, c-format +msgid "%d:%02d hrs:mins" +msgstr "" + +#: ../src/viktrwlayer_analysis.c:658 +msgid "Include Invisible Items" +msgstr "" + +#: ../src/vikstatus.c:129 +msgid "Current number of background tasks. Click to see the background jobs." +msgstr "" + +#: ../src/vikstatus.c:134 +msgid "Current zoom level. Click to select a new one." +msgstr "" + +#: ../src/vikstatus.c:141 +msgid "Left click to clear the message. Right click to copy the message." +msgstr "" + +#: ../src/vikutils.c:108 +msgid "GPSD" +msgstr "" + +#. GPS Preamble +#: ../src/vikutils.c:109 +msgid "Trkpt" +msgstr "" + +#: ../src/vikutils.c:160 +#, c-format +msgid "%sSpeed%s %.1f%s" +msgstr "" + +#. Go for 2dp as expect low values for vertical speeds +#: ../src/vikutils.c:214 +#, c-format +msgid "%sClimb%s %.2f%s" +msgstr "" + +#: ../src/vikutils.c:223 +#, c-format +msgid "%sAlt %dfeet" +msgstr "" + +#. VIK_UNITS_HEIGHT_METRES: +#: ../src/vikutils.c:227 +#, c-format +msgid "%sAlt %dm" +msgstr "" + +#: ../src/vikutils.c:235 +#, c-format +msgid "%sCourse %03d°" +msgstr "" + +#: ../src/vikutils.c:249 +msgid "yards" +msgstr "" + +#. VIK_UNITS_DISTANCE_KILOMETRES: +#: ../src/vikutils.c:253 +msgid "m" +msgstr "" + +#: ../src/vikutils.c:257 +#, c-format +msgid "%sDistance diff %d%s" +msgstr "" + +#: ../src/vikutils.c:272 +#, c-format +msgid "%sTime %s" +msgstr "" + +#: ../src/vikutils.c:281 +#, c-format +msgid "%sTime diff %lds" +msgstr "" + +#: ../src/vikutils.c:287 +#, c-format +msgid "%sNo. of Sats %d" +msgstr "" + +#: ../src/vikutils.c:312 +#, c-format +msgid "%sTo End %.2f%s" +msgstr "" + +#: ../src/vikutils.c:339 +#, c-format +msgid "%sDistance along %.2f%s" +msgstr "" + +#: ../src/vikutils.c:359 +#, c-format +msgid "%sTrack: %s" +msgstr "" + +#: ../src/vikutils.c:396 +#, c-format +msgid "" +"There is a newer version of Viking available: %s\n" +"\n" +"Do you wish to go to Viking's website now?" +msgstr "" + +#: ../src/vikutils.c:526 +msgid "" +"This appears to be Viking's very first run.\n" +"\n" +"Do you wish to enable automatic internet features?\n" +"\n" +"Individual settings can be controlled in the Preferences." +msgstr "" + +#: ../src/vikwaypoint.c:37 +msgid "Waypoint" +msgstr "" + +#: ../src/vikwebtool_datasource.c:352 +msgid "Search Term" +msgstr "" + +#. TODO get rid of this as this is unnecessary duplication... +#: ../src/vikwindow.c:258 +msgid "Pan" +msgstr "" + +#: ../src/vikwindow.c:258 +msgid "Zoom" +msgstr "" + +#: ../src/vikwindow.c:258 +msgid "Ruler" +msgstr "" + +#: ../src/vikwindow.c:258 +msgid "Select" +msgstr "" + +#: ../src/vikwindow.c:368 +msgid "This is Viking " +msgstr "" + +#: ../src/vikwindow.c:457 +msgid "Location lookup aborted" +msgstr "" + +#: ../src/vikwindow.c:477 +#, c-format +msgid "Location found: %s" +msgstr "" + +#: ../src/vikwindow.c:486 +msgid "Unable to determine location" +msgstr "" + +#: ../src/vikwindow.c:495 +msgid "Determining location" +msgstr "" + +#: ../src/vikwindow.c:525 +#, c-format +msgid "Location found via geoclue" +msgstr "" + +#: ../src/vikwindow.c:546 +msgid "Default Map" +msgstr "" + +#: ../src/vikwindow.c:557 ../src/vikwindow.c:3938 +msgid "Trying to determine location..." +msgstr "" + +#. Create tooltip +#: ../src/vikwindow.c:723 +msgid "Select zoom level" +msgstr "" + +#: ../src/vikwindow.c:1176 +#, c-format +msgid "" +"Do you want to save the changes you made to the document \"%s\"?\n" +"\n" +"Your changes will be lost if you don't save them." +msgstr "" + +#: ../src/vikwindow.c:1180 +msgid "Don't Save" +msgstr "" + +#: ../src/vikwindow.c:1268 +msgid "mpp" +msgstr "" + +#: ../src/vikwindow.c:1268 +msgid "pixelfact" +msgstr "" + +#: ../src/vikwindow.c:1467 +#, c-format +msgid "%s %s %dm" +msgstr "" + +#: ../src/vikwindow.c:1469 +#, c-format +msgid "%s %s %dft" +msgstr "" + +#: ../src/vikwindow.c:1472 +#, c-format +msgid "%s %s" +msgstr "" + +#: ../src/vikwindow.c:1929 +msgid "_Ruler" +msgstr "" + +#: ../src/vikwindow.c:1929 +msgid "Ruler Tool" +msgstr "" + +#: ../src/vikwindow.c:2204 ../src/vikwindow.c:4818 +msgid "_Zoom" +msgstr "" + +#: ../src/vikwindow.c:2204 +msgid "Zoom Tool" +msgstr "" + +#: ../src/vikwindow.c:2271 ../src/vikwindow.c:4819 +msgid "_Pan" +msgstr "" + +#: ../src/vikwindow.c:2271 +msgid "Pan Tool" +msgstr "" + +#: ../src/vikwindow.c:2425 +msgid "_Select" +msgstr "" + +#: ../src/vikwindow.c:2425 +msgid "Select Tool" +msgstr "" + +#: ../src/vikwindow.c:2615 +msgid "You must select a layer to show its properties." +msgstr "" + +#. No error to show, so unlikely this will get called +#: ../src/vikwindow.c:2629 +msgid "The help system is not available." +msgstr "" + +#. Main error path +#: ../src/vikwindow.c:2632 +#, c-format +msgid "" +"Help is not available because: %s.\n" +"Ensure a Mime Type ghelp handler program is installed (e.g. yelp)." +msgstr "" + +#: ../src/vikwindow.c:2865 +msgid "You must select a layer to delete." +msgstr "" + +#: ../src/vikwindow.c:3171 +msgid "Untitled" +msgstr "" + +#: ../src/vikwindow.c:3300 +#, c-format +msgid "Unable to add '%s' to the list of recently used documents" +msgstr "" + +#: ../src/vikwindow.c:3391 +msgid "The file you requested could not be opened." +msgstr "" + +#: ../src/vikwindow.c:3394 +msgid "" +"GPSBabel is required to load files of this type or GPSBabel encountered " +"problems." +msgstr "" + +#: ../src/vikwindow.c:3397 +#, c-format +msgid "Unable to load malformed GPX file %s" +msgstr "" + +#: ../src/vikwindow.c:3400 +#, c-format +msgid "Unsupported file type for %s" +msgstr "" + +#. Since we can process .vik files with issues just show a warning in the status bar +#. Not that a user can do much about it... or tells them what this issue is yet... +#: ../src/vikwindow.c:3406 +#, c-format +msgid "WARNING: issues encountered loading %s" +msgstr "" + +#: ../src/vikwindow.c:3489 +msgid "Please select a GPS data file to open. " +msgstr "" + +#: ../src/vikwindow.c:3508 +msgid "Google Earth" +msgstr "" + +#: ../src/vikwindow.c:3523 ../src/vikwindow.c:3646 ../src/viking.desktop.in.h:1 +msgid "Viking" +msgstr "" + +#: ../src/vikwindow.c:3594 ../src/vikwindow.c:4632 +msgid "Open File" +msgstr "" + +#: ../src/vikwindow.c:3630 +msgid "Save as Viking File." +msgstr "" + +#: ../src/vikwindow.c:3757 +#, c-format +msgid "Exporting to file: %s" +msgstr "" + +#. Confirm what happened. +#: ../src/vikwindow.c:3774 +#, c-format +msgid "Exported files: %d" +msgstr "" + +#: ../src/vikwindow.c:3786 +msgid "Nothing to Export!" +msgstr "" + +#: ../src/vikwindow.c:3790 +msgid "Export to directory" +msgstr "" + +#: ../src/vikwindow.c:3809 +msgid "Could not convert all files" +msgstr "" + +#: ../src/vikwindow.c:3851 +msgid "File not accessible" +msgstr "" + +#: ../src/vikwindow.c:3854 +msgid "No Viking File" +msgstr "" + +#: ../src/vikwindow.c:3998 +msgid "This layer has no configurable properties." +msgstr "" + +#: ../src/vikwindow.c:4080 +msgid "Are you sure you wish to delete all layers?" +msgstr "" + +#. Try harder... +#: ../src/vikwindow.c:4126 ../src/vikwindow.c:4132 +msgid "Generating image file..." +msgstr "" + +#: ../src/vikwindow.c:4154 +msgid "" +"Failed to generate internal image.\n" +"\n" +"Try creating a smaller image." +msgstr "" + +#: ../src/vikwindow.c:4175 +msgid "Image file generated." +msgstr "" + +#: ../src/vikwindow.c:4177 +msgid "Failed to generate image file." +msgstr "" + +#: ../src/vikwindow.c:4246 +#, c-format +msgid "Unable to write to file %s: %s" +msgstr "" + +#: ../src/vikwindow.c:4284 +msgid "" +"Viewable region outside allowable pixel size bounds for image. Clipping " +"width/height values." +msgstr "" + +#: ../src/vikwindow.c:4309 +#, c-format +msgid "Total area: %ldm x %ldm (%.3f sq. km)" +msgstr "" + +#: ../src/vikwindow.c:4312 +#, c-format +msgid "Total area: %ldm x %ldm (%.3f sq. miles)" +msgstr "" + +#: ../src/vikwindow.c:4315 +#, c-format +msgid "Total area: %ldm x %ldm (%.3f sq. NM)" +msgstr "" + +#. Single file +#: ../src/vikwindow.c:4343 +msgid "Save Image" +msgstr "" + +#: ../src/vikwindow.c:4364 ../src/vikwindow.c:4641 +msgid "KMZ" +msgstr "" + +#: ../src/vikwindow.c:4417 +msgid "You must be in UTM mode to use this feature" +msgstr "" + +#: ../src/vikwindow.c:4421 +msgid "Choose a directory to hold images" +msgstr "" + +#. todo: default for answers inside VikWindow or static (thruout instance) +#: ../src/vikwindow.c:4441 +msgid "Save to Image File" +msgstr "" + +#: ../src/vikwindow.c:4457 +msgid "Width (pixels):" +msgstr "" + +#: ../src/vikwindow.c:4459 +msgid "Height (pixels):" +msgstr "" + +#: ../src/vikwindow.c:4462 +msgid "" +"WARNING: USING LARGE IMAGES OVER 10000x10000\n" +"MAY CRASH THE PROGRAM!" +msgstr "" + +#: ../src/vikwindow.c:4464 +msgid "Zoom (meters per pixel):" +msgstr "" + +#: ../src/vikwindow.c:4480 +msgid "Area in current viewable window" +msgstr "" + +#: ../src/vikwindow.c:4490 +msgid "Save as PNG" +msgstr "" + +#: ../src/vikwindow.c:4491 +msgid "Save as JPEG" +msgstr "" + +#: ../src/vikwindow.c:4520 +msgid "East-west image tiles:" +msgstr "" + +#: ../src/vikwindow.c:4522 +msgid "North-south image tiles:" +msgstr "" + +#: ../src/vikwindow.c:4619 +msgid "This feature is not available in UTM mode" +msgstr "" + +#: ../src/vikwindow.c:4658 +#, c-format +msgid "Unable to import %s." +msgstr "" + +#: ../src/vikwindow.c:4749 +msgid "Choose a background color" +msgstr "" + +#: ../src/vikwindow.c:4765 +msgid "Choose a track highlight color" +msgstr "" + +#: ../src/vikwindow.c:4814 +msgid "_File" +msgstr "" + +#: ../src/vikwindow.c:4815 +msgid "_Edit" +msgstr "" + +#: ../src/vikwindow.c:4817 +msgid "_Show" +msgstr "" + +#: ../src/vikwindow.c:4820 +msgid "_Layers" +msgstr "" + +#: ../src/vikwindow.c:4821 +msgid "_Tools" +msgstr "" + +#: ../src/vikwindow.c:4822 +msgid "_Webtools" +msgstr "" + +#: ../src/vikwindow.c:4823 ../src/vikwindow.c:4893 +msgid "_Help" +msgstr "" + +#: ../src/vikwindow.c:4825 +msgid "New file" +msgstr "" + +#: ../src/vikwindow.c:4826 +msgid "_Open..." +msgstr "" + +#: ../src/vikwindow.c:4826 +msgid "Open a file" +msgstr "" + +#: ../src/vikwindow.c:4827 +msgid "Open _Recent File" +msgstr "" + +#: ../src/vikwindow.c:4828 +msgid "Append _File..." +msgstr "" + +#: ../src/vikwindow.c:4828 +msgid "Append data from a different file" +msgstr "" + +#: ../src/vikwindow.c:4829 +msgid "Open GPX as External _Layer..." +msgstr "" + +#: ../src/vikwindow.c:4829 +msgid "Open a GPX file as an external layer" +msgstr "" + +#: ../src/vikwindow.c:4830 +msgid "_Export All" +msgstr "" + +#: ../src/vikwindow.c:4830 +msgid "Export All TrackWaypoint Layers" +msgstr "" + +#: ../src/vikwindow.c:4831 +msgid "_GPX..." +msgstr "" + +#: ../src/vikwindow.c:4831 +msgid "Export as GPX" +msgstr "" + +#: ../src/vikwindow.c:4832 +msgid "A_cquire" +msgstr "" + +#: ../src/vikwindow.c:4833 +msgid "_Directions..." +msgstr "" + +#: ../src/vikwindow.c:4833 +msgid "Get driving directions" +msgstr "" + +#: ../src/vikwindow.c:4835 +msgid "_OSM Traces..." +msgstr "" + +#: ../src/vikwindow.c:4835 +msgid "Get traces from OpenStreetMap" +msgstr "" + +#: ../src/vikwindow.c:4836 +msgid "_My OSM Traces..." +msgstr "" + +#: ../src/vikwindow.c:4836 +msgid "Get Your Own Traces from OpenStreetMap" +msgstr "" + +#: ../src/vikwindow.c:4839 +msgid "Geo_caches..." +msgstr "" + +#: ../src/vikwindow.c:4839 +msgid "Get Geocaches from geocaching.com" +msgstr "" + +#: ../src/vikwindow.c:4842 +msgid "Create waypoints from geotagged images" +msgstr "" + +#: ../src/vikwindow.c:4844 +msgid "Get a file from a URL" +msgstr "" + +#: ../src/vikwindow.c:4846 +msgid "Create waypoints from Wikipedia items in the current view" +msgstr "" + +#: ../src/vikwindow.c:4848 +msgid "_Save" +msgstr "" + +#: ../src/vikwindow.c:4848 +msgid "Save the file" +msgstr "" + +#: ../src/vikwindow.c:4849 +msgid "Save _As..." +msgstr "" + +#: ../src/vikwindow.c:4849 +msgid "Save the file under different name" +msgstr "" + +#: ../src/vikwindow.c:4850 +msgid "Properties..." +msgstr "" + +#: ../src/vikwindow.c:4850 +msgid "File Properties" +msgstr "" + +#: ../src/vikwindow.c:4852 +msgid "Import KMZ _Map File..." +msgstr "" + +#: ../src/vikwindow.c:4852 +msgid "Import a KMZ file" +msgstr "" + +#: ../src/vikwindow.c:4853 +msgid "Generate _KMZ Map File..." +msgstr "" + +#: ../src/vikwindow.c:4853 +msgid "Generate a KMZ file with an overlay of the current view" +msgstr "" + +#: ../src/vikwindow.c:4855 +msgid "_Generate Image File..." +msgstr "" + +#: ../src/vikwindow.c:4855 +msgid "Save a snapshot of the workspace into a file" +msgstr "" + +#: ../src/vikwindow.c:4856 +msgid "Generate _Directory of Images..." +msgstr "" + +#: ../src/vikwindow.c:4856 +msgid "Generate _Directory of Images" +msgstr "" + +#: ../src/vikwindow.c:4857 +msgid "_Print..." +msgstr "" + +#: ../src/vikwindow.c:4857 +msgid "Print maps" +msgstr "" + +#: ../src/vikwindow.c:4858 +msgid "E_xit" +msgstr "" + +#: ../src/vikwindow.c:4858 +msgid "Exit the program" +msgstr "" + +#: ../src/vikwindow.c:4859 +msgid "Save and Exit" +msgstr "" + +#: ../src/vikwindow.c:4859 +msgid "Save and Exit the program" +msgstr "" + +#: ../src/vikwindow.c:4861 +msgid "Go to the Pre_vious Location" +msgstr "" + +#: ../src/vikwindow.c:4861 +msgid "Go to the previous location" +msgstr "" + +#: ../src/vikwindow.c:4862 +msgid "Go to the _Next Location" +msgstr "" + +#: ../src/vikwindow.c:4862 +msgid "Go to the next location" +msgstr "" + +#: ../src/vikwindow.c:4863 +msgid "Go to the _Default Location" +msgstr "" + +#: ../src/vikwindow.c:4863 +msgid "Go to the default location" +msgstr "" + +#: ../src/vikwindow.c:4864 +msgid "Go to the _Auto Location" +msgstr "" + +#: ../src/vikwindow.c:4864 +msgid "Go to a location via automatic lookup" +msgstr "" + +#: ../src/vikwindow.c:4865 +msgid "Go to _Location..." +msgstr "" + +#: ../src/vikwindow.c:4865 +msgid "Go to address/place using text search" +msgstr "" + +#: ../src/vikwindow.c:4866 +msgid "_Go to Lat/Lon..." +msgstr "" + +#: ../src/vikwindow.c:4866 +msgid "Go to arbitrary lat/lon coordinate" +msgstr "" + +#: ../src/vikwindow.c:4867 +msgid "Go to UTM..." +msgstr "" + +#: ../src/vikwindow.c:4867 +msgid "Go to arbitrary UTM coordinate" +msgstr "" + +#: ../src/vikwindow.c:4868 +msgid "Go to Today" +msgstr "" + +#: ../src/vikwindow.c:4868 +msgid "Go to today on the calendar" +msgstr "" + +#: ../src/vikwindow.c:4869 +msgid "_Refresh" +msgstr "" + +#: ../src/vikwindow.c:4869 +msgid "Refresh any maps displayed" +msgstr "" + +#: ../src/vikwindow.c:4870 +msgid "Set _Highlight Color..." +msgstr "" + +#: ../src/vikwindow.c:4870 +msgid "Set Highlight Color" +msgstr "" + +#: ../src/vikwindow.c:4871 +msgid "Set Bac_kground Color..." +msgstr "" + +#: ../src/vikwindow.c:4871 +msgid "Set Background Color" +msgstr "" + +#: ../src/vikwindow.c:4872 +msgid "Zoom _In" +msgstr "" + +#: ../src/vikwindow.c:4872 +msgid "Zoom In" +msgstr "" + +#: ../src/vikwindow.c:4873 +msgid "Zoom _Out" +msgstr "" + +#: ../src/vikwindow.c:4873 +msgid "Zoom Out" +msgstr "" + +#: ../src/vikwindow.c:4874 +msgid "Zoom _To..." +msgstr "" + +#: ../src/vikwindow.c:4874 +msgid "Zoom To" +msgstr "" + +#: ../src/vikwindow.c:4875 +msgid "Pan _North" +msgstr "" + +#: ../src/vikwindow.c:4876 +msgid "Pan _East" +msgstr "" + +#: ../src/vikwindow.c:4877 +msgid "Pan _South" +msgstr "" + +#: ../src/vikwindow.c:4878 +msgid "Pan _West" +msgstr "" + +#: ../src/vikwindow.c:4879 +msgid "Background _Jobs" +msgstr "" + +#: ../src/vikwindow.c:4879 +msgid "Background Jobs" +msgstr "" + +#: ../src/vikwindow.c:4881 +msgid "Cu_t" +msgstr "" + +#: ../src/vikwindow.c:4885 +msgid "Delete All" +msgstr "" + +#: ../src/vikwindow.c:4886 +msgid "Copy Centre _Location" +msgstr "" + +#: ../src/vikwindow.c:4887 +msgid "_Flush Map Cache" +msgstr "" + +#: ../src/vikwindow.c:4888 +msgid "_Set the Default Location" +msgstr "" + +#: ../src/vikwindow.c:4888 +msgid "Set the Default Location to the current position" +msgstr "" + +#: ../src/vikwindow.c:4889 +msgid "_Preferences" +msgstr "" + +#: ../src/vikwindow.c:4889 +msgid "Program Preferences" +msgstr "" + +#: ../src/vikwindow.c:4890 +msgid "_Layer Defaults" +msgstr "" + +#: ../src/vikwindow.c:4891 +msgid "_Properties" +msgstr "" + +#: ../src/vikwindow.c:4893 +msgid "Help" +msgstr "" + +#: ../src/vikwindow.c:4894 +msgid "_About" +msgstr "" + +#: ../src/vikwindow.c:4894 +msgid "About" +msgstr "" + +#: ../src/vikwindow.c:4903 +msgid "_KML..." +msgstr "" + +#: ../src/vikwindow.c:4903 +msgid "Export as KML" +msgstr "" + +#: ../src/vikwindow.c:4904 +msgid "Transfer data from a GPS device" +msgstr "" + +#: ../src/vikwindow.c:4905 +msgid "Import file via GPSBabel converter" +msgstr "" + +#: ../src/vikwindow.c:4909 +msgid "Import Geo_JSON File..." +msgstr "" + +#: ../src/vikwindow.c:4909 +msgid "Import GeoJSON file" +msgstr "" + +#: ../src/vikwindow.c:4914 +msgid "_UTM Mode" +msgstr "" + +#: ../src/vikwindow.c:4915 +msgid "_Expedia Mode" +msgstr "" + +#: ../src/vikwindow.c:4916 +msgid "_Mercator Mode" +msgstr "" + +#: ../src/vikwindow.c:4917 +msgid "Lat_/Lon Mode" +msgstr "" + +#: ../src/vikwindow.c:4921 +msgid "Show _Scale" +msgstr "" + +#: ../src/vikwindow.c:4921 +msgid "Show Scale" +msgstr "" + +#: ../src/vikwindow.c:4922 +msgid "Show _Center Mark" +msgstr "" + +#: ../src/vikwindow.c:4922 +msgid "Show Center Mark" +msgstr "" + +#: ../src/vikwindow.c:4923 +msgid "Show _Highlight" +msgstr "" + +#: ../src/vikwindow.c:4923 +msgid "Show Highlight" +msgstr "" + +#: ../src/vikwindow.c:4924 +msgid "_Full Screen" +msgstr "" + +#: ../src/vikwindow.c:4924 +msgid "Activate full screen mode" +msgstr "" + +#: ../src/vikwindow.c:4925 +msgid "Show Side _Panel" +msgstr "" + +#: ../src/vikwindow.c:4925 +msgid "Show Side Panel" +msgstr "" + +#: ../src/vikwindow.c:4926 +msgid "Show Status_bar" +msgstr "" + +#: ../src/vikwindow.c:4926 +msgid "Show Statusbar" +msgstr "" + +#: ../src/vikwindow.c:4927 +msgid "Show _Toolbar" +msgstr "" + +#: ../src/vikwindow.c:4927 +msgid "Show Toolbar" +msgstr "" + +#: ../src/vikwindow.c:4928 +msgid "Show _Menu" +msgstr "" + +#: ../src/vikwindow.c:4928 +msgid "Show Menu" +msgstr "" + +#: ../src/vikwindow.c:4929 +msgid "Show Side Panel B_uttons" +msgstr "" + +#: ../src/vikwindow.c:4929 +msgid "Show Side Panel Buttons" +msgstr "" + +#: ../src/vikwindow.c:4930 +msgid "Show Side Panel Ca_lendar" +msgstr "" + +#: ../src/vikwindow.c:4930 +msgid "Show Side Panel Calendar" +msgstr "" + +#: ../src/vikwindow.c:5064 +#, c-format +msgid "New _%s Layer" +msgstr "" + +#: ../src/vikwindow.c:5114 +msgid "..." +msgstr "" + +#: ../src/viking.desktop.in.h:2 +msgid "GPS Data Manager" +msgstr "" + +#: ../src/viking.desktop.in.h:3 +msgid "Map Based GPS Data Manager (live data capable)." +msgstr "" + +#: ../src/libjpeg/jpeg-data.c:205 +msgid "Data does not follow JPEG specification." +msgstr "" + +#: ../src/libjpeg/jpeg-data.c:302 +#, c-format +msgid "Path '%s' invalid." +msgstr "" + +#: ../src/libjpeg/jpeg-data.c:320 +#, c-format +msgid "Could not read '%s'." +msgstr "" diff --git a/po/hu.po b/po/hu.po new file mode 100644 index 0000000..5ea724b --- /dev/null +++ b/po/hu.po @@ -0,0 +1,6151 @@ +# Hungarian translation for viking +# Copyright (c) 2010 Rosetta Contributors and Canonical Ltd 2010 +# This file is distributed under the same license as the viking package. +# FIRST AUTHOR , 2010. +# +msgid "" +msgstr "" +"Project-Id-Version: viking\n" +"Report-Msgid-Bugs-To: \n" +"POT-Creation-Date: 2019-01-19 12:53+0000\n" +"PO-Revision-Date: 2011-09-26 17:52+0000\n" +"Last-Translator: Balló György \n" +"Language-Team: Hungarian \n" +"Language: hu\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-Launchpad-Export-Date: 2018-12-21 17:32+0000\n" +"X-Generator: Launchpad (build 18847)\n" + +#: ../src/acquire.c:106 ../src/vikgpslayer.c:1367 +msgid "Done." +msgstr "Kész." + +#: ../src/acquire.c:115 +msgid "No data." +msgstr "Nincs adat." + +#: ../src/acquire.c:167 ../src/acquire.c:415 +msgid "Error: acquisition failed." +msgstr "Hiba: beszerzés sikertelen." + +#: ../src/acquire.c:339 +msgid "Working..." +msgstr "Dolgozom…" + +#. This shouldn't happen... +#: ../src/acquire.c:406 +msgid "" +"Unable to create command\n" +"Acquire method failed." +msgstr "" + +#: ../src/acquire.c:513 +msgid "_Filter" +msgstr "" + +#: ../src/acquire.c:528 +#, c-format +msgid "Filter with %s" +msgstr "" + +#: ../src/acquire.c:545 +msgid "Filter" +msgstr "" + +#: ../src/babel.c:640 +msgid "GPSBabel:" +msgstr "" + +#: ../src/babel.c:641 +msgid "" +"Allow setting the specific instance of GPSBabel. You must restart Viking for " +"this value to take effect." +msgstr "" + +#: ../src/babel_ui.c:79 +msgid "Select a file format" +msgstr "" + +#: ../src/babel_ui.c:144 ../src/viktrwlayer.c:531 ../src/viktrwlayer.c:2882 +msgid "Tracks" +msgstr "Nyomvonalak" + +#: ../src/babel_ui.c:149 ../src/viktrwlayer.c:2892 +msgid "Routes" +msgstr "" + +#. ***** PARAMETERS ***** +#: ../src/babel_ui.c:154 ../src/viktrwlayer.c:531 ../src/viktrwlayer.c:2887 +msgid "Waypoints" +msgstr "Útpontok" + +#: ../src/background.c:64 +#, c-format +msgid "%d items" +msgstr "%d elem" + +#: ../src/background.c:287 +msgid "Threads:" +msgstr "" + +#: ../src/background.c:288 +msgid "" +"Number of threads to use for Mapnik tasks. You need to restart Viking for a " +"change to this value to be used" +msgstr "" + +#: ../src/background.c:361 +msgid "Job" +msgstr "Munka" + +#: ../src/background.c:365 +msgid "Progress" +msgstr "Folyamat" + +#: ../src/background.c:373 +msgid "Viking Background Jobs" +msgstr "Viking háttérmunkák" + +#: ../src/bing.c:42 +msgid "Bing Aerial" +msgstr "" + +#: ../src/bing.c:48 +msgid "Bing" +msgstr "" + +#. VIK_GTK_WINDOW_FROM_WIDGET(vp) +#: ../src/bingmapsource.c:514 +msgid "Bing attribution Loading" +msgstr "" + +#: ../src/clipboard.c:95 +msgid "paste failed" +msgstr "beillesztés sikertelen" + +#: ../src/clipboard.c:105 +msgid "wrong clipboard data size" +msgstr "rossz vágólap adatméret" + +#: ../src/clipboard.c:124 +#, c-format +msgid "" +"The clipboard contains sublayer data for %s layers. You must select a layer " +"of this type to paste the clipboard data." +msgstr "" +"A vágólap alréteg adatokat tartalmaz a(z) %s réteghez. A vágólapon található " +"adatok beillesztéséhez ki kell választania egy ilyen típusú réteget." + +#: ../src/clipboard.c:264 +msgid "" +"In order to paste a waypoint, please select an appropriate layer to paste " +"into." +msgstr "Útpont beillesztéséhez ki kell választania egy megfelelő réteget." + +#: ../src/dialog.c:60 +msgid "Go to Lat/Lon" +msgstr "Ugrás Szél./Hossz.-ra" + +#: ../src/dialog.c:69 ../src/viktrwlayer_wpwin.c:173 +msgid "Latitude:" +msgstr "Földrajzi szélesség:" + +#: ../src/dialog.c:72 ../src/viktrwlayer_wpwin.c:177 +msgid "Longitude:" +msgstr "Földrajzi hosszúság:" + +#: ../src/dialog.c:102 +msgid "Go to UTM" +msgstr "Ugrás UTM-re" + +#: ../src/dialog.c:114 +msgid "Northing:" +msgstr "Északi:" + +#: ../src/dialog.c:117 +msgid "Easting:" +msgstr "Keleti:" + +#: ../src/dialog.c:121 ../src/vikgeoreflayer.c:902 +msgid "Zone:" +msgstr "Zóna:" + +#: ../src/dialog.c:124 ../src/vikgeoreflayer.c:904 +msgid "Letter:" +msgstr "Betű:" + +#: ../src/dialog.c:246 ../src/geonamessearch.c:238 +#: ../src/datasource_osm_my_traces.c:505 +msgid "Nothing was selected" +msgstr "Nincs kiválasztva semmi" + +#: ../src/dialog.c:254 +msgid "Add Route" +msgstr "" + +#: ../src/dialog.c:254 +msgid "Add Track" +msgstr "Nyomvonal hozzáadása" + +#: ../src/dialog.c:262 +msgid "Route Name:" +msgstr "" + +#: ../src/dialog.c:262 +msgid "Track Name:" +msgstr "Nyomvonal neve:" + +#: ../src/dialog.c:282 +msgid "Please enter a name for the track." +msgstr "Adjon meg egy nevet a nyomvonalnak." + +#: ../src/dialog.c:311 +msgid "Today" +msgstr "" + +#: ../src/dialog.c:393 +msgid "Zoom Factors..." +msgstr "Nagyítási tényezők..." + +#: ../src/dialog.c:407 +msgid "Zoom factor (in meters per pixel):" +msgstr "Nagyítási tényező (méter/képpontban)" + +#: ../src/dialog.c:408 +msgid "X (easting): " +msgstr "X (keleti): " + +#: ../src/dialog.c:409 +msgid "Y (northing): " +msgstr "Y (északi): " + +#: ../src/dialog.c:414 +msgid "X and Y zoom factors must be equal" +msgstr "Az X és Y nagyítási tényezők legyenek egyenlők" + +#: ../src/dialog.c:469 +msgid "1 min" +msgstr "1 perc" + +#: ../src/dialog.c:470 +msgid "1 hour" +msgstr "1 óra" + +#: ../src/dialog.c:471 +msgid "1 day" +msgstr "1 nap" + +#: ../src/dialog.c:472 +msgid "Custom (in minutes):" +msgstr "Egyéni (percben):" + +#: ../src/dialog.c:608 +#, c-format +msgid "" +"2003-2008, Evan Battaglia\n" +"2008-%s, Viking's contributors" +msgstr "" + +#: ../src/dialog.c:609 +msgid "GPS Data and Topo Analyzer, Explorer, and Manager." +msgstr "GPS adat- és topográfiai elemző, böngésző és kezelő." + +#: ../src/dialog.c:610 +msgid "" +"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.\n" +"\n" +"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.\n" +"\n" +"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., 59 Temple " +"Place, Suite 330, Boston, MA 02111-1307, USA" +msgstr "" +"Ez a program szabad szoftver; továbbadható és/vagy módosítható a Free " +"Software Foundation által kiadott GNU General Public License 2-es vagy " +"(választása szerint) bármely újabb változatának irányelvei szerint.\n" +"\n" +"Ezt a programot abban a reményben terjesztjük, hogy hasznos lesz, de " +"MINDENFÉLE GARANCIA NÉLKÜL; még hallgatólagos garancia sem vonatkozik az " +"ELADHATÓSÁGRA vagy ALKALMASSÁGÁRA EGY ADOTT CÉLRA. További részletekért lásd " +"a GNU General Public License-t.\n" +"\n" +"Önnek ezzel a programmal együtt meg kellett kapnia a GNU General Public " +"License egy példányát; ha nem, írjon a Free Software Foundation, Inc.-nek, " +"59 Temple Place, Suite 330, Boston, MA 02111-1307, USA" + +#: ../src/dialog.c:703 +msgid "Translation is coordinated on http://launchpad.net/viking" +msgstr "" +"A fordítás koordinálása a http://launchpad.net/viking weboldalon történik" + +#: ../src/dialog.c:713 +msgid "Download along track" +msgstr "Letöltés a nyomvonal mentén" + +#: ../src/dialog.c:720 +msgid "Map type:" +msgstr "Térképtípus:" + +#: ../src/dialog.c:726 +msgid "Zoom level:" +msgstr "Nagyítási szint:" + +#: ../src/dialog.c:766 +#, c-format +msgid "The map data is licensed: %s." +msgstr "A térképadatokra a következő licenc vonatkozik: %s." + +#: ../src/dialog.c:769 +#, c-format +msgid "" +"The data provided by '%s' are licensed under the following license: " +"%s." +msgstr "" + +#: ../src/dialog.c:773 +msgid "Open license" +msgstr "Szabad licenc" + +#: ../src/expedia.c:54 +msgid "Expedia Street Maps" +msgstr "Expedia utcatérképek" + +#: ../src/expedia.c:82 +msgid "Invalid expedia altitude" +msgstr "Érvénytelen expedia magasság" + +#: ../src/expedia.c:113 +#, c-format +msgid "" +"Couldn't open EXPEDIA image file (right after successful download! Please " +"report and delete image file!): %s" +msgstr "" +"Az EXPEDIA képfájl nem nyitható meg (közvetlenül sikeres letöltés után! " +"Jelentse és törölje a képfájlt!): %s" + +#: ../src/expedia.c:126 +#, c-format +msgid "" +"Couldn't save EXPEDIA image file (right after successful download! Please " +"report and delete image file!): %s" +msgstr "" +"Az EXPEDIA képfájl nem menthető (közvetlenül sikeres letöltés után! Jelentse " +"és törölje a képfájlt!): %s" + +#: ../src/geonamessearch.c:115 +msgid "Search" +msgstr "Keresés" + +#: ../src/geonamessearch.c:117 +msgid "No entries found!" +msgstr "Nem található bejegyzés!" + +#. NB could allow columns to be shifted around by doing this after each new +#. gtk_tree_view_column_set_reorderable ( column, TRUE ); +#. However I don't think is that useful, so I haven't put it in +#: ../src/geonamessearch.c:171 ../src/datasource_osm_my_traces.c:422 +#: ../src/viktrwlayer_tracklist.c:621 ../src/viktrwlayer_waypointlist.c:618 +msgid "Name" +msgstr "" + +#: ../src/geonamessearch.c:176 +msgid "Feature" +msgstr "" + +#: ../src/geonamessearch.c:181 ../src/datasource_osm_my_traces.c:437 +msgid "Lat/Lon" +msgstr "" + +#: ../src/geonamessearch.c:264 ../src/googlesearch.c:101 ../src/vikgoto.c:430 +msgid "couldn't map temp file" +msgstr "az átmeneti fájl nem található" + +#: ../src/geonamessearch.c:459 +msgid "Select articles" +msgstr "" + +#: ../src/geonamessearch.c:459 +msgid "Select the articles you want to add." +msgstr "" + +#: ../src/geonamessearch.c:475 +msgid "city" +msgstr "" + +#: ../src/geonamessearch.c:477 +msgid "edu" +msgstr "" + +#: ../src/geonamessearch.c:479 +msgid "airport" +msgstr "" + +#: ../src/geonamessearch.c:481 +msgid "mountain" +msgstr "" + +#: ../src/geonamessearch.c:483 +msgid "forest" +msgstr "" + +#: ../src/geonamessearch.c:485 +msgid "church" +msgstr "" + +#: ../src/geojson.c:74 +#, c-format +msgid "%s command failed: %s" +msgstr "" + +#: ../src/geojson.c:146 ../src/gpx.c:1317 +#, c-format +msgid "failed to open temporary file: %s" +msgstr "az átmeneti fájl nem nyitható meg: %s" + +#: ../src/globals.c:67 +msgid "DDD" +msgstr "" + +#: ../src/globals.c:67 +msgid "DMM" +msgstr "" + +#: ../src/globals.c:67 +msgid "DMS" +msgstr "" + +#: ../src/globals.c:67 +msgid "Raw" +msgstr "" + +#: ../src/globals.c:68 +msgid "Kilometres" +msgstr "" + +#: ../src/globals.c:68 +msgid "Miles" +msgstr "" + +#: ../src/globals.c:68 +msgid "Nautical Miles" +msgstr "" + +#. VIK_UNITS_SPEED_KILOMETRES_PER_HOUR: +#: ../src/globals.c:69 ../src/viktrwlayer_tracklist.c:655 ../src/vikutils.c:100 +msgid "km/h" +msgstr "" + +#: ../src/globals.c:69 ../src/viktrwlayer_tracklist.c:656 ../src/vikutils.c:78 +msgid "mph" +msgstr "" + +#. VIK_UNITS_SPEED_METRES_PER_SECOND: +#: ../src/globals.c:69 ../src/viktrwlayer_tracklist.c:663 ../src/vikutils.c:81 +msgid "m/s" +msgstr "" + +#: ../src/globals.c:69 ../src/viktrwlayer_tracklist.c:657 ../src/vikutils.c:84 +msgid "knots" +msgstr "" + +#: ../src/globals.c:69 ../src/viktrwlayer_tracklist.c:658 ../src/vikutils.c:87 +msgid "s/km" +msgstr "" + +#: ../src/globals.c:69 ../src/viktrwlayer_tracklist.c:659 ../src/vikutils.c:90 +msgid "min/km" +msgstr "" + +#: ../src/globals.c:69 +msgid "s/mi" +msgstr "" + +#: ../src/globals.c:69 ../src/viktrwlayer_tracklist.c:661 ../src/vikutils.c:96 +msgid "min/mi" +msgstr "" + +#: ../src/globals.c:70 +msgid "Metres" +msgstr "" + +#: ../src/globals.c:70 +msgid "Feet" +msgstr "" + +#: ../src/globals.c:73 +msgid "Locale" +msgstr "" + +#: ../src/globals.c:73 +msgid "World" +msgstr "" + +#: ../src/globals.c:73 +msgid "UTC" +msgstr "" + +#: ../src/globals.c:76 +msgid "Degree format:" +msgstr "Fok formátuma:" + +#: ../src/globals.c:77 +msgid "Distance units:" +msgstr "Távolság egysége:" + +#: ../src/globals.c:78 +msgid "Speed units:" +msgstr "Sebesség egysége:" + +#: ../src/globals.c:79 +msgid "Height units:" +msgstr "Magasság egysége:" + +#: ../src/globals.c:80 +msgid "Use large waypoint icons:" +msgstr "Nagy útpontikonok használata:" + +#: ../src/globals.c:81 +msgid "Default latitude:" +msgstr "Alapértelmezett szélesség:" + +#: ../src/globals.c:82 +msgid "Default longitude:" +msgstr "Alapértelmezett hosszúság:" + +#: ../src/globals.c:83 +msgid "Time Display:" +msgstr "" + +#: ../src/globals.c:84 +msgid "" +"Display times according to the reference frame. Locale is the user's system " +"setting. World is relative to the location of the object." +msgstr "" + +#: ../src/globals.c:90 +msgid "Alphabetical" +msgstr "" + +#: ../src/globals.c:90 ../src/datasource_osm_my_traces.c:432 +msgid "Time" +msgstr "" + +#: ../src/globals.c:90 +msgid "Creation" +msgstr "" + +#: ../src/globals.c:91 +msgid "Title Case" +msgstr "" + +#: ../src/globals.c:91 +msgid "Lowercase" +msgstr "" + +#: ../src/globals.c:94 +msgid "KML File Export Units:" +msgstr "" + +#: ../src/globals.c:95 +msgid "GPX Track Order:" +msgstr "" + +#: ../src/globals.c:96 +msgid "GPX Waypoint Symbols:" +msgstr "" + +#: ../src/globals.c:97 +msgid "" +"Save GPX Waypoint Symbol names in the specified case. May be useful for " +"compatibility with various devices" +msgstr "" + +#: ../src/globals.c:98 +msgid "GPX Creator:" +msgstr "" + +#: ../src/globals.c:99 +msgid "" +"The creator value when writing a GPX file. Otherwise when blank a default is " +"used." +msgstr "" + +#: ../src/globals.c:104 +msgid "Image Viewer:" +msgstr "" + +#: ../src/globals.c:109 +msgid "External GPX Program 1:" +msgstr "" + +#: ../src/globals.c:110 +msgid "External GPX Program 2:" +msgstr "" + +#: ../src/globals.c:113 +msgid "Absolute" +msgstr "" + +#: ../src/globals.c:113 +msgid "Relative" +msgstr "" + +#: ../src/globals.c:117 +msgid "Save File Reference Mode:" +msgstr "" + +#: ../src/globals.c:118 +msgid "" +"When saving a Viking .vik file, this determines how the directory paths of " +"filenames are written." +msgstr "" + +#: ../src/globals.c:119 +msgid "Ask for Name before Track Creation:" +msgstr "" + +#: ../src/globals.c:120 +msgid "Show Tooltip during Track Creation:" +msgstr "" + +#: ../src/globals.c:121 +msgid "The number of recent files:" +msgstr "" + +#: ../src/globals.c:122 +msgid "" +"Only applies to new windows or on application restart. -1 means all " +"available files." +msgstr "" + +#: ../src/globals.c:123 +#, fuzzy +msgid "Open files in selected layer:" +msgstr "Kiválasztott réteg eltávolítása" + +#: ../src/globals.c:124 +msgid "Open files (but not .vik ones) into the selected TrackWaypoint layer." +msgstr "" + +#: ../src/globals.c:125 +msgid "Show calendar day names:" +msgstr "" + +#: ../src/globals.c:128 +msgid "Home Location" +msgstr "" + +#: ../src/globals.c:128 +msgid "Last Location" +msgstr "" + +#: ../src/globals.c:128 +msgid "Specified File" +msgstr "" + +#: ../src/globals.c:128 +msgid "Auto Location" +msgstr "" + +#: ../src/globals.c:131 +msgid "Restore Window Setup:" +msgstr "" + +#: ../src/globals.c:132 +msgid "Restore window size and layout" +msgstr "" + +#: ../src/globals.c:133 +msgid "Add a Default Map Layer:" +msgstr "" + +#: ../src/globals.c:134 +msgid "" +"The default map layer added is defined by the Layer Defaults. Use the menu " +"Edit->Layer Defaults->Map... to change the map type and other values." +msgstr "" + +#: ../src/globals.c:135 +msgid "Startup Method:" +msgstr "" + +#: ../src/globals.c:136 +msgid "Startup File:" +msgstr "" + +#: ../src/globals.c:137 +msgid "" +"The default file to load on startup. Only applies when the startup method is " +"set to 'Specified File'" +msgstr "" + +#: ../src/globals.c:138 +msgid "Check For New Version:" +msgstr "" + +#: ../src/globals.c:139 +msgid "Periodically check to see if a new version of Viking is available" +msgstr "" + +#. Defaults for the options are setup here +#: ../src/globals.c:176 +msgid "General" +msgstr "" + +#. New Tab +#: ../src/globals.c:204 +msgid "Startup" +msgstr "" + +#. New Tab +#: ../src/globals.c:222 +msgid "Export/External" +msgstr "" + +#. 'Advanced' Properties +#: ../src/globals.c:249 +msgid "Advanced" +msgstr "" + +#. Webtools +#: ../src/google.c:39 +msgid "Google" +msgstr "Google" + +#. If there is an actual description field it will overwrite this value +#: ../src/gpx.c:264 +#, c-format +msgid "Created by: %s" +msgstr "" + +#: ../src/datasource_bfilter.c:43 +msgid "Max number of points:" +msgstr "Pontok maximális száma:" + +#: ../src/datasource_bfilter.c:84 +msgid "Simplify All Tracks..." +msgstr "" + +#: ../src/datasource_bfilter.c:85 +msgid "Simplified Tracks" +msgstr "Egyszerűsített nyomvonalak" + +#. { VIK_LAYER_NUM_TYPES, "compressmethod", VIK_LAYER_PARAM_UINT, VIK_LAYER_GROUP_NONE, N_("Simplify Method:"), VIK_LAYER_WIDGET_COMBOBOX, compress_method, NULL, NULL, NULL, NULL, NULL }, +#: ../src/datasource_bfilter.c:111 +msgid "Error Factor:" +msgstr "" + +#: ../src/datasource_bfilter.c:112 +msgid "" +"Specifies the maximum allowable error that may be introduced by removing a " +"single point by the crosstrack method. See the manual or GPSBabel Simplify " +"Filter documentation for more detail." +msgstr "" + +#: ../src/datasource_bfilter.c:166 +msgid "Compress Tracks..." +msgstr "" + +#: ../src/datasource_bfilter.c:167 +msgid "Compressed Tracks" +msgstr "" + +#: ../src/datasource_bfilter.c:197 ../src/datasource_bfilter.c:198 +msgid "Remove Duplicate Waypoints" +msgstr "Kettőzött útpontok eltávolítása" + +#: ../src/datasource_bfilter.c:221 +msgid "Manual filter:" +msgstr "" + +#: ../src/datasource_bfilter.c:222 +msgid "Manual filter command: e.g. 'swap'." +msgstr "" + +#: ../src/datasource_bfilter.c:233 ../src/datasource_bfilter.c:234 +msgid "Manual filter" +msgstr "" + +#: ../src/datasource_bfilter.c:262 +msgid "Waypoints Inside This" +msgstr "Útpontok ezen belül" + +#: ../src/datasource_bfilter.c:263 ../src/datasource_bfilter.c:292 +msgid "Polygonized Layer" +msgstr "Poligonizált réteg" + +#: ../src/datasource_bfilter.c:291 +msgid "Waypoints Outside This" +msgstr "Útpontok ezen kívül" + +#: ../src/datasource_file.c:61 +msgid "Import file with GPSBabel" +msgstr "" + +#: ../src/datasource_file.c:62 +msgid "Imported file" +msgstr "" + +#. The file selector +#: ../src/datasource_file.c:129 +msgid "File:" +msgstr "" + +#: ../src/datasource_file.c:130 +msgid "File to import" +msgstr "" + +#: ../src/datasource_file.c:137 +msgid "All files" +msgstr "" + +#. The file format selector +#: ../src/datasource_file.c:144 ../src/datasource_url.c:106 +msgid "File type:" +msgstr "" + +#: ../src/datasource_file.c:189 +#, c-format +msgid "using babel args '%s' and file '%s'" +msgstr "" + +#: ../src/datasource_gc.c:67 +msgid "Download Geocaches" +msgstr "Geoládák letöltése" + +#: ../src/datasource_gc.c:68 +msgid "Geocaching.com Caches" +msgstr "Geocaching.com ládák" + +#: ../src/datasource_gc.c:86 +msgid "geocaching.com username:" +msgstr "geocaching.com felhasználónév:" + +#: ../src/datasource_gc.c:87 +msgid "geocaching.com password:" +msgstr "geocaching.com jelszó:" + +#: ../src/datasource_gc.c:92 ../src/vikwindow.c:3502 +msgid "Geocaching" +msgstr "" + +#: ../src/datasource_gc.c:128 +#, c-format +msgid "" +"Can't find %s or %s in path! Check that you have installed it correctly." +msgstr "" + +#: ../src/datasource_gc.c:190 +msgid "Number geocaches:" +msgstr "Geoládák száma:" + +#: ../src/datasource_gc.c:192 +msgid "Centered around:" +msgstr "Középre igazítva:" + +#: ../src/datasource_gc.c:231 +msgid "Broken input - using some defaults" +msgstr "" + +#: ../src/datasource_geotag.c:51 +msgid "Create Waypoints from Geotagged Images" +msgstr "" + +#: ../src/datasource_geotag.c:52 +msgid "Geotagged Images" +msgstr "" + +#: ../src/datasource_geotag.c:102 ../src/datasource_geojson.c:93 +#: ../src/vikfileentry.c:171 ../src/vikwindow.c:3533 ../src/vikwindow.c:3610 +#: ../src/vikwindow.c:3641 ../src/vikwindow.c:4356 ../src/vikwindow.c:4649 +msgid "All" +msgstr "" + +#: ../src/datasource_geotag.c:107 ../src/vikfileentry.c:115 +#: ../src/viktrwlayer_geotag.c:637 ../src/vikwindow.c:3518 +#: ../src/vikwindow.c:4377 +msgid "JPG" +msgstr "" + +#: ../src/datasource_geotag.c:168 +#, c-format +msgid "Unable to create waypoint from %s" +msgstr "" + +#: ../src/datasource_geojson.c:46 +msgid "Acquire from GeoJSON" +msgstr "" + +#: ../src/datasource_geojson.c:47 ../src/datasource_geojson.c:98 +msgid "GeoJSON" +msgstr "" + +#: ../src/datasource_geojson.c:152 +#, c-format +msgid "Unable to import from: %s" +msgstr "" + +#: ../src/datasource_gps.c:54 +msgid "Acquire from GPS" +msgstr "Beszerzés GPS-ről" + +#: ../src/datasource_gps.c:55 +msgid "Acquired from GPS" +msgstr "GPS-ről beszerezve" + +#: ../src/datasource_gps.c:258 +#, c-format +msgid "using cmd '%s' and file '%s'\n" +msgstr "" + +#: ../src/datasource_gps.c:353 ../src/vikgpslayer.c:966 +#, c-format +msgid "Downloading %d waypoint..." +msgid_plural "Downloading %d waypoints..." +msgstr[0] "%d útpont letöltése..." +msgstr[1] "%d útpont letöltése..." + +#: ../src/datasource_gps.c:358 ../src/vikgpslayer.c:971 +#, c-format +msgid "Downloading %d trackpoint..." +msgid_plural "Downloading %d trackpoints..." +msgstr[0] "%d nyompont letöltése..." +msgstr[1] "%d nyompont letöltése..." + +#: ../src/datasource_gps.c:363 ../src/vikgpslayer.c:976 +#, c-format +msgid "Downloading %d routepoint..." +msgid_plural "Downloading %d routepoints..." +msgstr[0] "" +msgstr[1] "" + +#: ../src/datasource_gps.c:386 ../src/datasource_gps.c:393 +#: ../src/datasource_gps.c:400 +#, c-format +msgid "Downloaded %d out of %d %s..." +msgstr "A(z) %d-ból %d %s letöltve..." + +#: ../src/datasource_gps.c:388 ../src/datasource_gps.c:395 +#: ../src/datasource_gps.c:402 +#, c-format +msgid "Downloaded %d %s." +msgstr "%d %s letöltve." + +#: ../src/datasource_gps.c:416 ../src/vikgpslayer.c:1134 +#, c-format +msgid "GPS Device: %s" +msgstr "GPS eszköz: %s" + +#: ../src/datasource_gps.c:428 ../src/vikgpslayer.c:1214 +msgid "Status: Working..." +msgstr "" + +#. NB gps_layer_inst_init() is performed after parameter registeration +#. thus to give the protocols some potential values use the old static list +#. TODO: find another way to use gps_layer_inst_init()? +#: ../src/datasource_gps.c:584 ../src/vikgpslayer.c:216 +msgid "GPS Protocol:" +msgstr "GPS protokoll:" + +#. List reassigned at runtime +#: ../src/datasource_gps.c:609 ../src/vikgpslayer.c:217 +msgid "Serial Port:" +msgstr "Soros port:" + +#: ../src/datasource_gps.c:659 +msgid "" +"Turn Off After Transfer\n" +"(Garmin/NAViLink Only)" +msgstr "" +"Kikapcsolás átvitel után\n" +"(csak Garmin/NAViLink esetén)" + +#: ../src/datasource_gps.c:666 +msgid "Tracks:" +msgstr "" + +#: ../src/datasource_gps.c:673 +msgid "Routes:" +msgstr "" + +#: ../src/datasource_gps.c:680 +msgid "Waypoints:" +msgstr "" + +#: ../src/datasource_gps.c:756 ../src/vikgpslayer.c:1509 +msgid "GPS device: N/A" +msgstr "GPS eszköz: N/A" + +#: ../src/datasource_osm.c:53 ../src/datasource_osm.c:54 +msgid "OSM traces" +msgstr "" + +#: ../src/datasource_osm.c:89 +msgid "Page number:" +msgstr "" + +#: ../src/datasource_osm_my_traces.c:59 ../src/datasource_osm_my_traces.c:60 +msgid "OSM My Traces" +msgstr "" + +#: ../src/datasource_osm_my_traces.c:106 ../src/osm-traces.c:684 +#, fuzzy +msgid "Email/username:" +msgstr "OSM felhasználónév:" + +#: ../src/datasource_osm_my_traces.c:111 +msgid "The email or username used to login to OSM" +msgstr "" + +#: ../src/datasource_osm_my_traces.c:113 ../src/osm-traces.c:692 +msgid "Password:" +msgstr "Jelszó:" + +#: ../src/datasource_osm_my_traces.c:116 +msgid "The password used to login to OSM" +msgstr "" + +#: ../src/datasource_osm_my_traces.c:427 ../src/viktrwlayer.c:689 +msgid "Description" +msgstr "" + +#: ../src/datasource_osm_my_traces.c:442 +msgid "Privacy" +msgstr "" + +#: ../src/datasource_osm_my_traces.c:449 +msgid "Within Current View" +msgstr "" + +#: ../src/datasource_osm_my_traces.c:516 +msgid "GPS Traces" +msgstr "" + +#: ../src/datasource_osm_my_traces.c:518 +msgid "None found!" +msgstr "" + +#: ../src/datasource_osm_my_traces.c:569 +msgid "Ensure the OSM access token preferences are setup." +msgstr "" + +#: ../src/datasource_osm_my_traces.c:645 +msgid "My OSM Traces" +msgstr "" + +#. Report errors to the status bar +#: ../src/datasource_osm_my_traces.c:667 +#, c-format +msgid "Unable to get trace: %s" +msgstr "" + +#: ../src/datasource_routing.c:56 ../src/datasource_routing.c:57 +msgid "Directions" +msgstr "" + +#: ../src/datasource_routing.c:90 +msgid "No routing engines with directions available" +msgstr "" + +#. Engine selector +#: ../src/datasource_routing.c:99 +msgid "Engine:" +msgstr "" + +#. From and To entries +#: ../src/datasource_routing.c:104 +msgid "From:" +msgstr "Innen:" + +#: ../src/datasource_routing.c:105 +msgid "To:" +msgstr "Ide:" + +#: ../src/datasource_url.c:48 +msgid "Acquire from URL" +msgstr "" + +#: ../src/datasource_url.c:49 +msgid "URL" +msgstr "" + +#: ../src/datasource_url.c:101 +msgid "URL:" +msgstr "" + +#. Only GPX (not using GPSbabel) +#: ../src/datasource_url.c:133 ../src/vikfileentry.c:161 +#: ../src/vikwindow.c:3513 ../src/vikwindow.c:3603 +msgid "GPX" +msgstr "" + +#: ../src/datasource_wikipedia.c:32 +msgid "Create Waypoints from Wikipedia Articles" +msgstr "" + +#: ../src/datasource_wikipedia.c:33 +msgid "Wikipedia Waypoints" +msgstr "" + +#: ../src/dem.c:66 ../src/dem.c:80 +msgid "Invalid DEM" +msgstr "DEM érvénytelen" + +#: ../src/dem.c:122 +msgid "Invalid DEM header" +msgstr "Érvénytelen DEM fejléc" + +#: ../src/dem.c:191 ../src/dem.c:204 +msgid "Incorrect DEM Class B record: expected 1" +msgstr "Hibás DEM Class B rekord: a várt érték: 1" + +#: ../src/dem.c:289 ../src/download.c:176 +#, c-format +msgid "Couldn't map file %s: %s" +msgstr "A(z) %s fájl nem található: %s" + +#: ../src/download.c:130 +msgid "Tile age (days):" +msgstr "" + +#: ../src/download.c:406 +#, c-format +msgid "Download error: %s" +msgstr "Letöltési hiba: %s" + +#: ../src/download.c:490 +msgid "couldn't open temp file" +msgstr "az átmeneti fájl nem nyitható meg" + +#: ../src/file.c:458 ../src/file.c:463 +#, c-format +msgid "Draw mode '%s' no more supported" +msgstr "A(z) '%s' rajzolási mód nem támogatott többé" + +#: ../src/geotag_exif.c:621 +msgid "Not enough memory." +msgstr "" + +#: ../src/geotag_exif.c:639 +msgid "Setting a value for this tag is unsupported!" +msgstr "" + +#: ../src/geotag_exif.c:658 +#, c-format +msgid "Too few components specified (need %d, found %d)\n" +msgstr "" + +#: ../src/geotag_exif.c:662 +msgid "Numeric value expected\n" +msgstr "" + +#: ../src/geotag_exif.c:670 +msgid "This shouldn't happen!" +msgstr "" + +#: ../src/geotag_exif.c:740 +msgid "Not yet implemented!" +msgstr "" + +#: ../src/geotag_exif.c:753 +msgid "Warning; Too many components specified!" +msgstr "" + +#: ../src/osm-traces.c:87 +msgid "Identifiable (public w/ timestamps)" +msgstr "Azonosítható (nyilvános időbélyegek nélkül)" + +#: ../src/osm-traces.c:88 +msgid "Trackable (private w/ timestamps)" +msgstr "Nyomon követhető (privát időbélyegek nélkül)" + +#: ../src/osm-traces.c:89 +msgid "Public" +msgstr "Nyilvános" + +#: ../src/osm-traces.c:90 +msgid "Private" +msgstr "Privát" + +#: ../src/osm-traces.c:108 +msgid "Access Token:" +msgstr "" + +#: ../src/osm-traces.c:108 +msgid "Get New OSM Access Tokens" +msgstr "" + +#: ../src/osm-traces.c:109 +msgid "Access Token Key:" +msgstr "" + +#: ../src/osm-traces.c:110 +msgid "Access Token Secret:" +msgstr "" + +#: ../src/osm-traces.c:111 +msgid "OSM username:" +msgstr "OSM felhasználónév:" + +#: ../src/osm-traces.c:112 +msgid "OSM password:" +msgstr "OSM jelszó:" + +#. Check to really override existing values... +#: ../src/osm-traces.c:263 +msgid "Do you want to overwrite existing values?" +msgstr "" + +#: ../src/osm-traces.c:275 +msgid "Not able to generate OSM request tokens." +msgstr "" + +#: ../src/osm-traces.c:299 +msgid "" +"Waiting for authorization approval.\n" +"Ensure you have granted access at the website before continuing here." +msgstr "" + +#: ../src/osm-traces.c:315 +msgid "No Authorization." +msgstr "" + +#: ../src/osm-traces.c:354 +msgid "" +"OSM Username and Password preferences are not required anymore. You can now " +"remove them." +msgstr "" + +#. Preferences +#: ../src/osm-traces.c:379 +msgid "OpenStreetMap Traces" +msgstr "" + +#: ../src/osm-traces.c:504 +#, c-format +msgid "failed to upload data: HTTP response is %ld" +msgstr "adatok feltöltése sikertelen: a HTTP válasz: %ld" + +#: ../src/osm-traces.c:509 +#, c-format +msgid "curl_easy_getinfo failed: %d" +msgstr "curl_easy_getinfo sikertelen: %d" + +#: ../src/osm-traces.c:514 +#, c-format +msgid "curl request failed: %s" +msgstr "curl kérés sikertelen: %s" + +#. Success +#: ../src/osm-traces.c:592 +msgid "Uploaded to OSM" +msgstr "" + +#: ../src/osm-traces.c:596 +msgid "" +"FAILED TO UPLOAD DATA TO OSM - Ensure the OSM access token preferences are " +"setup." +msgstr "" + +#: ../src/osm-traces.c:599 +msgid "FAILED TO UPLOAD DATA TO OSM - CURL PROBLEM" +msgstr "" + +#: ../src/osm-traces.c:602 +msgid "FAILED TO UPLOAD DATA TO OSM" +msgstr "" + +#: ../src/osm-traces.c:602 +msgid "HTTP response code" +msgstr "" + +#: ../src/osm-traces.c:610 +#, c-format +msgid "failed to unlink temporary file: %s" +msgstr "az átmeneti fájl nem törölhető: %s" + +#: ../src/osm-traces.c:664 +msgid "OSM upload" +msgstr "OSM feltöltés" + +#: ../src/osm-traces.c:689 +#, fuzzy +msgid "" +"The email/username used as login\n" +"Enter the email/username you use to login into www.openstreetmap.org." +"" +msgstr "" +"A bejelentkezéshez használt e-mail\n" +"Adja meg az e-mail címét, amelyet a bejelentkezéshez használ a www." +"openstreetmap.org webhelyen." + +#: ../src/osm-traces.c:697 +msgid "" +"The password used to login\n" +"Enter the password you use to login into www.openstreetmap.org." +msgstr "" +"A bejelentkezéshez használt jelszó\n" +"Adja meg a jelszavát, amelyet a bejelentkezéshez használ a www." +"openstreetmap.org webhelyen." + +#: ../src/osm-traces.c:703 +msgid "File's name:" +msgstr "Fájl neve:" + +#: ../src/osm-traces.c:713 +msgid "" +"The name of the file on OSM\n" +"This is the name of the file created on the server.This is not the " +"name of the local file." +msgstr "" +"A fájl neve az OSM-en\n" +"A szerveren létrehozandó fájl neve. Ez nem a helyi fájl neve." + +#: ../src/osm-traces.c:717 ../src/viktrwlayer_wpwin.c:197 +#: ../src/viktrwlayer_wpwin.c:199 +msgid "Description:" +msgstr "Leírás:" + +#: ../src/osm-traces.c:731 +msgid "The description of the trace" +msgstr "A nyomvonal leírása" + +#: ../src/osm-traces.c:734 +msgid "Anonymize Times:" +msgstr "" + +#: ../src/osm-traces.c:739 +msgid "" +"Anonymize times of the trace.\n" +"You may choose to make the trace identifiable, yet mask the actual " +"real time values" +msgstr "" + +#: ../src/osm-traces.c:743 +msgid "Tags:" +msgstr "Címkék:" + +#: ../src/osm-traces.c:751 +msgid "The tags associated to the trace" +msgstr "A nyomvonalhoz társított címkék" + +#: ../src/osm-traces.c:816 +#, c-format +msgid "Uploading %s to OSM" +msgstr "%s feltöltése az OSM-re" + +#: ../src/mapcache.c:67 +msgid "Map cache memory size (MB):" +msgstr "" + +#. NB Can have a couple hundred fonts loaded when using system directories +#. So ATM don't list them all - otherwise need better GUI feedback display. +#: ../src/mapnik_interface.cpp:324 +#, c-format +msgid "" +"%s %s\n" +"Plugins=%sFonts loaded=%d" +msgstr "" + +#: ../src/mapnik_interface.cpp:325 ../src/vikmapniklayer.c:278 +msgid "Mapnik" +msgstr "" + +#: ../src/print.c:51 ../src/viktrwlayer.c:572 +msgid "None" +msgstr "Egyik sem" + +#: ../src/print.c:52 +msgid "Horizontally" +msgstr "Vízszintesen" + +#: ../src/print.c:53 +msgid "Vertically" +msgstr "Függőlegesen" + +#: ../src/print.c:54 +msgid "Both" +msgstr "Mindkettő" + +#: ../src/print.c:118 +msgid "Image Settings" +msgstr "Képbeállítások" + +#: ../src/print.c:551 +msgid "done" +msgstr "kész" + +#. Page Size +#: ../src/print.c:580 +msgid "_Adjust Page Size and Orientation" +msgstr "Lapmé_ret és tájolás beállítása" + +#: ../src/print.c:596 +msgid "C_enter:" +msgstr "_Középre:" + +#. ignore page margins +#: ../src/print.c:614 +msgid "Ignore Page _Margins" +msgstr "Lapmargók f_igyelmen kívül hagyása" + +#: ../src/print.c:633 +msgid "Image S_ize:" +msgstr "Kép_méret:" + +#: ../src/ui_util.c:88 +#, c-format +msgid "Could not launch web browser. %s" +msgstr "" + +#: ../src/ui_util.c:101 +#, c-format +msgid "Could not create new email. %s" +msgstr "" + +#: ../src/vikcoordlayer.c:57 +msgid "Color:" +msgstr "Szín:" + +#: ../src/vikcoordlayer.c:58 +msgid "Minutes Width:" +msgstr "Perc szélessége:" + +#: ../src/vikcoordlayer.c:59 +msgid "Line Thickness:" +msgstr "Vonal vastagsága:" + +#: ../src/vikcoordlayer.c:66 +msgid "Coordinate" +msgstr "" + +#: ../src/main.c:92 +#, c-format +msgid "Ignoring Xlib error: error code %d request code %d\n" +msgstr "" + +#: ../src/main.c:111 +msgid "Enable debug output" +msgstr "Hibakeresési kimenet engedélyezése" + +#: ../src/main.c:112 +msgid "Enable verbose output" +msgstr "Részletes üzenetek bekapcsolása" + +#: ../src/main.c:113 +msgid "Show version" +msgstr "Verziószám megjelenítése" + +#: ../src/main.c:114 +msgid "Latitude in decimal degrees" +msgstr "" + +#: ../src/main.c:115 +msgid "Longitude in decimal degrees" +msgstr "" + +#: ../src/main.c:116 +msgid "Zoom Level (OSM). Value can be 0 - 22" +msgstr "" + +#: ../src/main.c:117 +msgid "Add a map layer by id value. Use 0 for the default map." +msgstr "" + +#: ../src/main.c:160 +#, c-format +msgid "" +"%s %s\n" +"Copyright (c) 2003-2008 Evan Battaglia\n" +"Copyright (c) 2008-%s Viking's contributors\n" +msgstr "" + +#: ../src/osm.c:50 +msgid "OpenStreetMap (Mapnik)" +msgstr "" + +#: ../src/osm.c:65 +msgid "OpenStreetMap (Cycle)" +msgstr "" + +#: ../src/osm.c:79 +msgid "OpenStreetMap (Transport)" +msgstr "" + +#: ../src/osm.c:95 +msgid "OpenStreetMap (Humanitarian)" +msgstr "" + +#: ../src/osm.c:111 +msgid "On Disk OSM Tile Format" +msgstr "" + +#: ../src/osm.c:121 +msgid "MBTiles File" +msgstr "" + +#: ../src/osm.c:132 +msgid "OSM Metatiles" +msgstr "" + +#: ../src/osm.c:146 +msgid "Mapbox Outdoors" +msgstr "" + +#: ../src/osm.c:153 +msgid "Mapbox Specific" +msgstr "" + +#: ../src/osm.c:170 +msgid "OSM (view)" +msgstr "OSM (megtekintés)" + +#: ../src/osm.c:174 +msgid "OSM (edit)" +msgstr "OSM (szerkesztés)" + +#. Note the use of positional parameters +#: ../src/osm.c:179 +msgid "OSM (query)" +msgstr "" + +#: ../src/osm.c:183 +msgid "OSM (render)" +msgstr "OSM (renderelés)" + +#. Example: http://127.0.0.1:8111/load_and_zoom?left=8.19&right=8.20&top=48.605&bottom=48.590&select=node413602999 +#. JOSM or merkaartor must already be running with remote interface enabled +#: ../src/osm.c:190 +msgid "Local port 8111 (eg JOSM)" +msgstr "" + +#: ../src/osm.c:195 +msgid "Geofabrik Map Compare" +msgstr "" + +#: ../src/osm.c:203 +msgid "OpenStreetMap Notes" +msgstr "" + +#. Not really OSM but can't be bothered to create somewhere else to put it... +#: ../src/osm.c:221 +msgid "Wikimedia Toolserver GeoHack" +msgstr "" + +#: ../src/preferences.c:195 +msgid "Preferences" +msgstr "Beállítások" + +#: ../src/toolbar.c:91 ../src/toolbar.c:92 +msgid "System Default" +msgstr "" + +#: ../src/toolbar.c:91 ../src/viktrwlayer.c:563 +msgid "Small" +msgstr "" + +#: ../src/toolbar.c:91 ../src/viktrwlayer.c:564 +msgid "Medium" +msgstr "" + +#: ../src/toolbar.c:91 ../src/viktrwlayer.c:565 +msgid "Large" +msgstr "" + +#: ../src/toolbar.c:92 +msgid "Icons Only" +msgstr "" + +#: ../src/toolbar.c:92 +msgid "Text Only" +msgstr "" + +#: ../src/toolbar.c:92 +msgid "Icons and Text" +msgstr "" + +#: ../src/toolbar.c:106 +msgid "Append to Menu:" +msgstr "" + +#: ../src/toolbar.c:107 +msgid "Pack the toolbar to the main menu to save vertical space" +msgstr "" + +#: ../src/toolbar.c:108 +msgid "Icon Size:" +msgstr "" + +#: ../src/toolbar.c:110 +msgid "Icon Style:" +msgstr "" + +#: ../src/toolbar.c:112 +msgid "Customize:" +msgstr "" + +#: ../src/toolbar.c:112 +msgid "Customize Buttons" +msgstr "" + +#. Preferences +#: ../src/toolbar.c:145 +msgid "Toolbar" +msgstr "" + +#: ../src/toolbar.c:312 +msgid "_Customize" +msgstr "" + +#: ../src/toolbar.c:641 +msgid "Separator" +msgstr "" + +#: ../src/toolbar.c:642 +msgid "--- Separator ---" +msgstr "" + +#: ../src/toolbar.c:1007 +msgid "Customize Toolbar" +msgstr "" + +#: ../src/toolbar.c:1028 +msgid "" +"Select items to be displayed on the toolbar. Items can be reordered by drag " +"and drop." +msgstr "" + +#: ../src/toolbar.c:1044 +msgid "Available Items" +msgstr "" + +#: ../src/toolbar.c:1065 +msgid "Displayed Items" +msgstr "" + +#: ../src/viklayer_defaults.c:232 +#, c-format +msgid "Could not open file: %s" +msgstr "" + +#: ../src/viklayer_defaults.c:304 +msgid "Layer Defaults" +msgstr "" + +#: ../src/uibuilder.c:196 +msgid "Take care that this password will be stored clearly in a plain file." +msgstr "Ügyeljen arra, hogy ez a jelszó egy sima fájlban kerül eltárolásra." + +#: ../src/uibuilder.c:628 ../src/viktrwlayer_export.c:188 +#: ../src/viktrwlayer_export.c:304 ../src/vikwindow.c:3666 +#: ../src/vikwindow.c:4408 +#, c-format +msgid "The file \"%s\" exists, do you wish to overwrite it?" +msgstr "A(z) \"%s\" fájl már létezik. Kívánja felülírni?" + +#: ../src/vikaggregatelayer.c:41 +msgid "Aggregate" +msgstr "" + +#: ../src/vikaggregatelayer.c:528 ../src/viktrwlayer.c:11700 +#, c-format +msgid "%s: Waypoint List" +msgstr "" + +#: ../src/vikaggregatelayer.c:570 +msgid "Search by Date" +msgstr "" + +#: ../src/vikaggregatelayer.c:576 +msgid "No items found with the requested date." +msgstr "" + +#: ../src/vikaggregatelayer.c:615 ../src/viktrwlayer.c:11691 +#, c-format +msgid "%s: Track and Route List" +msgstr "" + +#: ../src/vikaggregatelayer.c:681 ../src/viktrwlayer.c:8346 +#: ../src/viktrwlayer.c:8417 ../src/viktrwlayer.c:8494 +msgid "_Visibility" +msgstr "" + +#: ../src/vikaggregatelayer.c:686 +msgid "_Show All" +msgstr "" + +#: ../src/vikaggregatelayer.c:692 +msgid "_Hide All" +msgstr "" + +#: ../src/vikaggregatelayer.c:698 ../src/viktrwlayer.c:8363 +#: ../src/viktrwlayer.c:8434 ../src/viktrwlayer.c:8511 +msgid "_Toggle" +msgstr "" + +#: ../src/vikaggregatelayer.c:705 ../src/viktrwlayer.c:8532 +msgid "_Sort" +msgstr "" + +#: ../src/vikaggregatelayer.c:711 ../src/viktrwlayer.c:8538 +msgid "Name _Ascending" +msgstr "" + +#: ../src/vikaggregatelayer.c:717 ../src/viktrwlayer.c:8544 +msgid "Name _Descending" +msgstr "" + +#: ../src/vikaggregatelayer.c:723 ../src/viktrwlayer.c:575 +#: ../src/viktrwlayer.c:8550 +msgid "Date Ascending" +msgstr "" + +#: ../src/vikaggregatelayer.c:729 ../src/viktrwlayer.c:576 +#: ../src/viktrwlayer.c:8556 +msgid "Date Descending" +msgstr "" + +#: ../src/vikaggregatelayer.c:735 ../src/viktrwlayer.c:8445 +#: ../src/viktrwlayer.c:8523 ../src/viktrwlayer.c:8595 +#: ../src/viktrwlayer_tracklist.c:296 +msgid "_Statistics" +msgstr "" + +#: ../src/vikaggregatelayer.c:740 ../src/viktrwlayer.c:4533 +msgid "Track _List..." +msgstr "" + +#: ../src/vikaggregatelayer.c:746 ../src/viktrwlayer.c:4540 +msgid "_Waypoint List..." +msgstr "" + +#: ../src/vikaggregatelayer.c:753 +msgid "Searc_h" +msgstr "" + +#: ../src/vikaggregatelayer.c:759 +msgid "By _Date..." +msgstr "" + +#: ../src/vikaggregatelayer.c:762 +msgid "Find the first item with a specified date" +msgstr "" + +#: ../src/vikaggregatelayer.c:765 +msgid "Load E_xternal Layers" +msgstr "" + +#. Could have a more complicated tooltip that numbers each type of layers, +#. but for now a simple overall count +#: ../src/vikaggregatelayer.c:1011 +#, c-format +msgid "One layer" +msgid_plural "%d layers" +msgstr[0] "" +msgstr[1] "" + +#: ../src/vikaggregatelayer.c:1014 +#, fuzzy, c-format +msgid "Empty" +msgstr "Ö_sszes ürítése" + +#: ../src/vikdemlayer.c:86 +msgid "SRTM Global 90m (3 arcsec)" +msgstr "" + +#: ../src/vikdemlayer.c:94 +msgid "Absolute height" +msgstr "Abszolút magasság" + +#: ../src/vikdemlayer.c:95 +msgid "Height gradient" +msgstr "Magassági grádiens" + +#: ../src/vikdemlayer.c:120 +msgid "DEM Files:" +msgstr "DEM fájlok:" + +#: ../src/vikdemlayer.c:121 +msgid "Download Source:" +msgstr "Forrás letöltése:" + +#: ../src/vikdemlayer.c:122 +msgid "Min Elev Color:" +msgstr "Min. magasság színe:" + +#: ../src/vikdemlayer.c:123 ../src/viktrwlayer_wpwin.c:207 +msgid "Type:" +msgstr "Típus:" + +#: ../src/vikdemlayer.c:124 +msgid "Min Elev:" +msgstr "Min. magasság:" + +#: ../src/vikdemlayer.c:125 +msgid "Max Elev:" +msgstr "Max. magasság:" + +#: ../src/vikdemlayer.c:137 +msgid "_DEM Download" +msgstr "" + +#: ../src/vikdemlayer.c:137 +msgid "DEM Download" +msgstr "" + +#: ../src/vikdemlayer.c:192 +msgid "DEM" +msgstr "" + +#: ../src/vikdemlayer.c:304 +#, c-format +msgid "Number of files: %d" +msgstr "Fájlok száma: %d" + +#: ../src/vikdemlayer.c:446 +msgid "DEM Loading" +msgstr "DEM betöltése" + +#: ../src/vikdemlayer.c:927 +#, c-format +msgid "No SRTM data available for %f, %f" +msgstr "Nem érhető el SRTM adat a következőhöz: %f, %f" + +#: ../src/vikdemlayer.c:948 +#, c-format +msgid "DEM download failure for %f, %f" +msgstr "" + +#: ../src/vikdemlayer.c:954 +#, c-format +msgid "DEM write failure for %s" +msgstr "" + +#. Probably not over any land... +#: ../src/vikdemlayer.c:1201 +msgid "No DEM File Available" +msgstr "" + +#: ../src/vikdemlayer.c:1220 +#, c-format +msgid "" +"\n" +"Source: %s\n" +"\n" +"DEM File: %s\n" +"DEM File Timestamp: %s" +msgstr "" + +#: ../src/vikdemlayer.c:1224 +#, c-format +msgid "" +"Source: %s\n" +"\n" +"No DEM File!" +msgstr "" + +#: ../src/vikdemlayer.c:1264 +#, c-format +msgid "Downloading DEM %s" +msgstr "%s DEM letöltése" + +#: ../src/vikdemlayer.c:1289 +msgid "_Show DEM File Information" +msgstr "" + +#: ../src/vikfileentry.c:72 +msgid "Browse..." +msgstr "Tallózás…" + +#: ../src/vikfileentry.c:103 +msgid "Choose file" +msgstr "Válasszon fájlt" + +#: ../src/vikfileentry.c:120 ../src/vikwindow.c:4372 +msgid "PNG" +msgstr "" + +#: ../src/vikfileentry.c:125 +msgid "TIFF" +msgstr "" + +#: ../src/vikfileentry.c:133 +msgid "MBTiles" +msgstr "" + +#: ../src/vikfileentry.c:142 +msgid "XML" +msgstr "" + +#: ../src/vikfileentry.c:149 +msgid "MML" +msgstr "" + +#: ../src/vikfileentry.c:154 +msgid "MSS" +msgstr "" + +#: ../src/vikfilelist.c:49 +msgid "Choose file(s)" +msgstr "Válasszon fájl(oka)t" + +#: ../src/vikfilelist.c:182 +msgid "Add..." +msgstr "Hozzáadás..." + +#: ../src/vikfilelist.c:183 +msgid "Delete" +msgstr "Törlés" + +#: ../src/vikgeoreflayer.c:97 +msgid "_Georef Move Map" +msgstr "" + +#: ../src/vikgeoreflayer.c:97 +msgid "Georef Move Map" +msgstr "Georef térkép mozgatása" + +#: ../src/vikgeoreflayer.c:106 +msgid "Georef Z_oom Tool" +msgstr "" + +#: ../src/vikgeoreflayer.c:106 +msgid "Georef Zoom Tool" +msgstr "Georef nagyítóeszköz" + +#: ../src/vikgeoreflayer.c:117 +msgid "GeoRef Map" +msgstr "" + +#: ../src/vikgeoreflayer.c:214 +msgid "Auto Read World Files:" +msgstr "" + +#: ../src/vikgeoreflayer.c:215 +msgid "" +"Automatically attempt to read associated world file of a new image for a " +"GeoRef layer" +msgstr "" + +#: ../src/vikgeoreflayer.c:511 ../src/vikgeoreflayer.c:797 +#: ../src/vikmapslayer.c:1174 +#, c-format +msgid "Couldn't open image file: %s" +msgstr "A képfájl nem nyitható meg: %s" + +#: ../src/vikgeoreflayer.c:607 ../src/vikgeoreflayer.c:633 +msgid "Choose World file" +msgstr "Világfájl kiválasztása" + +#: ../src/vikgeoreflayer.c:619 +msgid "The World file you requested could not be opened for reading." +msgstr "A kért világfájl nem nyitható meg olvasásra." + +#: ../src/vikgeoreflayer.c:621 +msgid "Unexpected end of file reading World file." +msgstr "Váratlan fájlvége a világfájl olvasásakor." + +#: ../src/vikgeoreflayer.c:646 +msgid "The file you requested could not be opened for writing." +msgstr "A kért fájl nem nyitható meg írásra." + +#: ../src/vikgeoreflayer.c:782 +msgid "Lower right corner values may not be consistent with upper right values" +msgstr "" + +#: ../src/vikgeoreflayer.c:806 +#, c-format +msgid "Invalid image size: %s" +msgstr "" + +#: ../src/vikgeoreflayer.c:831 ../src/viklayer.c:561 ../src/vikwindow.c:4891 +msgid "Layer Properties" +msgstr "Réteg tulajdonságai" + +#: ../src/vikgeoreflayer.c:852 +msgid "World File Parameters:" +msgstr "Világfájl paraméterei:" + +#: ../src/vikgeoreflayer.c:853 +msgid "Load From File..." +msgstr "Betöltés fájlból..." + +#: ../src/vikgeoreflayer.c:858 +msgid "Corner pixel easting:" +msgstr "Sarokképpont keleti:" + +#: ../src/vikgeoreflayer.c:860 +msgid "the UTM \"easting\" value of the upper-left corner pixel of the map" +msgstr "" + +#: ../src/vikgeoreflayer.c:862 +msgid "Corner pixel northing:" +msgstr "Sarokképpont északi:" + +#: ../src/vikgeoreflayer.c:864 +msgid "the UTM \"northing\" value of the upper-left corner pixel of the map" +msgstr "" + +#: ../src/vikgeoreflayer.c:866 +msgid "X (easting) scale (mpp): " +msgstr "X (keleti) méretarány (mpp): " + +#: ../src/vikgeoreflayer.c:867 +msgid "Y (northing) scale (mpp): " +msgstr "Y (északi) méretarány (mpp): " + +#: ../src/vikgeoreflayer.c:870 +msgid "the scale of the map in the X direction (meters per pixel)" +msgstr "a térkép méretaránya X irányban (méter/képpontban)" + +#: ../src/vikgeoreflayer.c:872 +msgid "the scale of the map in the Y direction (meters per pixel)" +msgstr "a térkép méretaránya Y irányban (méter/képpontban)" + +#: ../src/vikgeoreflayer.c:874 +msgid "Map Image:" +msgstr "Térkép:" + +#: ../src/vikgeoreflayer.c:919 +msgid "Upper left latitude:" +msgstr "" + +#: ../src/vikgeoreflayer.c:921 +msgid "Upper left longitude:" +msgstr "" + +#: ../src/vikgeoreflayer.c:923 +msgid "Lower right latitude:" +msgstr "" + +#: ../src/vikgeoreflayer.c:925 +msgid "Lower right longitude:" +msgstr "" + +#: ../src/vikgeoreflayer.c:937 +msgid "Calculate MPP values from coordinates" +msgstr "" + +#: ../src/vikgeoreflayer.c:938 +msgid "" +"Enter all corner coordinates before calculating the MPP values from the " +"image size" +msgstr "" + +#: ../src/vikgeoreflayer.c:948 +msgid "UTM" +msgstr "" + +#: ../src/vikgeoreflayer.c:949 +msgid "Latitude/Longitude" +msgstr "" + +#: ../src/vikgeoreflayer.c:957 ../src/vikmapniklayer.c:82 +#: ../src/vikmapslayer.c:158 +msgid "Alpha:" +msgstr "Alfa:" + +#. Now with icons +#: ../src/vikgeoreflayer.c:1062 +msgid "_Zoom to Fit Map" +msgstr "_Nézet illesztése a térképhez" + +#: ../src/vikgeoreflayer.c:1068 +msgid "_Goto Map Center" +msgstr "_Ugrás a térkép közepére" + +#: ../src/vikgeoreflayer.c:1074 +msgid "_Export to World File" +msgstr "_Exportálás a világfájlba" + +#: ../src/vikgoto.c:98 +msgid "No goto tool available." +msgstr "Nem érhető el ugró eszköz." + +#: ../src/vikgoto.c:295 +msgid "goto" +msgstr "ugrás" + +#: ../src/vikgoto.c:297 +msgid "goto provider:" +msgstr "ugrás nyújtója:" + +#: ../src/vikgoto.c:312 +msgid "Enter address or place name:" +msgstr "Adja meg a cím vagy hely nevét:" + +#: ../src/vikgoto.c:487 +msgid "Locality" +msgstr "" + +#: ../src/vikgpslayer.c:137 +msgid "Data Mode" +msgstr "" + +#: ../src/vikgpslayer.c:139 +msgid "Realtime Tracking Mode" +msgstr "" + +#: ../src/vikgpslayer.c:176 +msgid "Keep vehicle at center" +msgstr "" + +#: ../src/vikgpslayer.c:177 +msgid "Keep vehicle on screen" +msgstr "" + +#: ../src/vikgpslayer.c:178 +msgid "Disable" +msgstr "" + +#: ../src/vikgpslayer.c:218 +msgid "Download Tracks:" +msgstr "" + +#: ../src/vikgpslayer.c:219 +msgid "Upload Tracks:" +msgstr "" + +#: ../src/vikgpslayer.c:220 +msgid "Download Routes:" +msgstr "" + +#: ../src/vikgpslayer.c:221 +msgid "Upload Routes:" +msgstr "" + +#: ../src/vikgpslayer.c:222 +msgid "Download Waypoints:" +msgstr "" + +#: ../src/vikgpslayer.c:223 +msgid "Upload Waypoints:" +msgstr "" + +#: ../src/vikgpslayer.c:225 +msgid "Recording tracks" +msgstr "Nyomvonalak rögzítése" + +#: ../src/vikgpslayer.c:226 +msgid "Jump to current position on start" +msgstr "Ugrás a jelenlegi pozícióra indításkor" + +#: ../src/vikgpslayer.c:227 +msgid "Moving Map Method:" +msgstr "Térképmozgatási módszer" + +#: ../src/vikgpslayer.c:228 +msgid "Update Statusbar:" +msgstr "" + +#: ../src/vikgpslayer.c:228 +msgid "Display information in the statusbar on GPS updates" +msgstr "" + +#: ../src/vikgpslayer.c:229 +msgid "Auto Connect" +msgstr "" + +#: ../src/vikgpslayer.c:229 +msgid "Automatically connect to GPSD" +msgstr "" + +#: ../src/vikgpslayer.c:230 +msgid "Gpsd Host:" +msgstr "Gpsd gazda:" + +#: ../src/vikgpslayer.c:231 +msgid "Gpsd Port:" +msgstr "Gpsd port:" + +#: ../src/vikgpslayer.c:232 +msgid "Gpsd Retry Interval (seconds):" +msgstr "Gpsd újrapróbálkozás intervalluma (másodperc):" + +#: ../src/vikgpslayer.c:254 +msgid "GPS" +msgstr "" + +#: ../src/vikgpslayer.c:320 ../src/vikgpslayer.c:1504 +msgid "GPS Download" +msgstr "GPS letöltés" + +#: ../src/vikgpslayer.c:320 ../src/vikgpslayer.c:1504 ../src/viktrwlayer.c:3993 +msgid "GPS Upload" +msgstr "GPS feltöltés" + +#: ../src/vikgpslayer.c:322 +msgid "GPS Realtime Tracking" +msgstr "GPS valós idejű nyomkövetés" + +#: ../src/vikgpslayer.c:458 +msgid "Connected" +msgstr "" + +#: ../src/vikgpslayer.c:460 +msgid "Disconnected" +msgstr "" + +#: ../src/vikgpslayer.c:554 +msgid "Unknown GPS Protocol" +msgstr "Ismeretlen GPS protokoll" + +#: ../src/vikgpslayer.c:572 +msgid "Unknown serial port device" +msgstr "Ismeretlen soros port eszköz" + +#: ../src/vikgpslayer.c:691 +#, c-format +msgid "%s: unknown parameter" +msgstr "%s: ismeretlen paraméter" + +#. Now with icons +#: ../src/vikgpslayer.c:794 +msgid "_Upload to GPS" +msgstr "_Feltöltés GPS-re" + +#: ../src/vikgpslayer.c:800 +msgid "Download from _GPS" +msgstr "Letöltés _GPS-ről" + +#: ../src/vikgpslayer.c:821 +msgid "Empty _Realtime" +msgstr "_Valós idő ürítése" + +#: ../src/vikgpslayer.c:828 +msgid "E_mpty Upload" +msgstr "Feltöltés ürí_tése" + +#: ../src/vikgpslayer.c:834 +msgid "_Empty Download" +msgstr "Letöltés ü_rítése" + +#: ../src/vikgpslayer.c:840 +msgid "Empty _All" +msgstr "Ö_sszes ürítése" + +#: ../src/vikgpslayer.c:852 +#, c-format +msgid "Unexpected number of disconnected handlers: %d" +msgstr "Váratlan számú szétkapcsolódott kezelő: %d" + +#: ../src/vikgpslayer.c:995 +#, c-format +msgid "Uploading %d waypoint..." +msgid_plural "Uploading %d waypoints..." +msgstr[0] "%d útpont feltöltése..." +msgstr[1] "%d útpont feltöltése..." + +#: ../src/vikgpslayer.c:1000 +#, c-format +msgid "Uploading %d trackpoint..." +msgid_plural "Uploading %d trackpoints..." +msgstr[0] "%d nyompont feltöltése..." +msgstr[1] "%d nyompont feltöltése..." + +#: ../src/vikgpslayer.c:1005 +#, c-format +msgid "Uploading %d routepoint..." +msgid_plural "Uploading %d routepoints..." +msgstr[0] "" +msgstr[1] "" + +#: ../src/vikgpslayer.c:1034 +#, c-format +msgid "Downloaded %d out of %d waypoint..." +msgid_plural "Downloaded %d out of %d waypoints..." +msgstr[0] "%d útpont letöltve a(z) %d-ból..." +msgstr[1] "%d útpont letöltve a(z) %d-ból..." + +#: ../src/vikgpslayer.c:1040 +#, c-format +msgid "Downloaded %d out of %d trackpoint..." +msgid_plural "Downloaded %d out of %d trackpoints..." +msgstr[0] "%d nyompont letöltve a(z) %d-ból..." +msgstr[1] "%d nyompont letöltve a(z) %d-ból..." + +#: ../src/vikgpslayer.c:1046 +#, c-format +msgid "Downloaded %d out of %d routepoint..." +msgid_plural "Downloaded %d out of %d routepoints..." +msgstr[0] "" +msgstr[1] "" + +#: ../src/vikgpslayer.c:1056 +#, c-format +msgid "Uploaded %d out of %d waypoint..." +msgid_plural "Uploaded %d out of %d waypoints..." +msgstr[0] "%d útpont feltöltve a(z) %d-ból..." +msgstr[1] "%d útpont feltöltve a(z) %d-ból..." + +#: ../src/vikgpslayer.c:1062 +#, c-format +msgid "Uploaded %d out of %d trackpoint..." +msgid_plural "Uploaded %d out of %d trackpoints..." +msgstr[0] "%d nyompont feltöltve a(z) %d-ból..." +msgstr[1] "%d nyompont feltöltve a(z) %d-ból..." + +#: ../src/vikgpslayer.c:1068 +#, c-format +msgid "Uploaded %d out of %d routepoint..." +msgid_plural "Uploaded %d out of %d routepoints..." +msgstr[0] "" +msgstr[1] "" + +#: ../src/vikgpslayer.c:1079 +#, c-format +msgid "Downloaded %d waypoint" +msgid_plural "Downloaded %d waypoints" +msgstr[0] "%d útpont letöltve" +msgstr[1] "%d útpont letöltve" + +#: ../src/vikgpslayer.c:1085 +#, c-format +msgid "Downloaded %d trackpoint" +msgid_plural "Downloaded %d trackpoints" +msgstr[0] "%d nyompont letöltve" +msgstr[1] "%d nyompont letöltve" + +#: ../src/vikgpslayer.c:1091 +#, c-format +msgid "Downloaded %d routepoint" +msgid_plural "Downloaded %d routepoints" +msgstr[0] "" +msgstr[1] "" + +#: ../src/vikgpslayer.c:1101 +#, c-format +msgid "Uploaded %d waypoint" +msgid_plural "Uploaded %d waypoints" +msgstr[0] "%d útpont feltöltve" +msgstr[1] "%d útpont feltöltve" + +#: ../src/vikgpslayer.c:1107 +#, c-format +msgid "Uploaded %d trackpoint" +msgid_plural "Uploaded %d trackpoints" +msgstr[0] "%d nyompont feltöltve" +msgstr[1] "%d nyompont feltöltve" + +#: ../src/vikgpslayer.c:1113 +#, c-format +msgid "Uploaded %d routepoint" +msgid_plural "Uploaded %d routepoints" +msgstr[0] "" +msgstr[1] "" + +#: ../src/vikgpslayer.c:1363 +msgid "Error: No result." +msgstr "" + +#: ../src/vikgpslayer.c:1471 +msgid "Warning - GPS Upload items may overwrite each other" +msgstr "" + +#: ../src/vikgpslayer.c:1506 +msgid "Status: detecting gpsbabel" +msgstr "Állapot: gpsbabel detektálása" + +#: ../src/vikgpslayer.c:1533 +msgid "No GPS items selected for transfer." +msgstr "" + +#: ../src/vikgpslayer.c:1546 +msgid "Could not turn off device." +msgstr "" + +#: ../src/vikgpslayer.c:1589 +msgid "Are you sure you want to delete GPS Upload data?" +msgstr "" + +#: ../src/vikgpslayer.c:1602 +msgid "Are you sure you want to delete GPS Download data?" +msgstr "" + +#: ../src/vikgpslayer.c:1616 +msgid "Are you sure you want to delete GPS Realtime data?" +msgstr "" + +#: ../src/vikgpslayer.c:1630 +msgid "Are you sure you want to delete All GPS data?" +msgstr "" + +#: ../src/vikgpslayer.c:2004 +#, c-format +msgid "" +"Failed to connect to gpsd at %s (port %s)\n" +"Should Viking keep trying (every %d seconds)?" +msgstr "" + +#: ../src/viklayerspanel.c:73 +msgid "C_ut" +msgstr "" + +#: ../src/viklayerspanel.c:74 ../src/vikwindow.c:4882 +msgid "_Copy" +msgstr "_Másolás" + +#: ../src/viklayerspanel.c:75 ../src/vikwindow.c:4883 +msgid "_Paste" +msgstr "_Beillesztés" + +#: ../src/viklayerspanel.c:76 ../src/vikwindow.c:4884 +msgid "_Delete" +msgstr "_Törlés" + +#: ../src/viklayerspanel.c:154 +msgid "New Layer" +msgstr "" + +#: ../src/viklayerspanel.c:347 +msgid "Top Layer" +msgstr "Legfelső réteg" + +#: ../src/viklayerspanel.c:363 +msgid "Add new layer" +msgstr "Új réteg hozzáadása" + +#: ../src/viklayerspanel.c:370 ../src/vikwindow.c:4884 +msgid "Remove selected layer" +msgstr "Kiválasztott réteg eltávolítása" + +#: ../src/viklayerspanel.c:377 +msgid "Move selected layer up" +msgstr "Kiválasztott réteg feljebb mozgatása" + +#: ../src/viklayerspanel.c:384 +msgid "Move selected layer down" +msgstr "Kiválasztott réteg lejjebb mozgatása" + +#: ../src/viklayerspanel.c:391 ../src/vikwindow.c:4881 +msgid "Cut selected layer" +msgstr "Kiválasztott réteg kivágása" + +#: ../src/viklayerspanel.c:398 ../src/vikwindow.c:4882 +msgid "Copy selected layer" +msgstr "Kiválasztott réteg másolása" + +#: ../src/viklayerspanel.c:405 ../src/vikwindow.c:4883 +msgid "" +"Paste layer into selected container layer or otherwise above selected layer" +msgstr "" + +#: ../src/viklayerspanel.c:502 +msgid "New name can not be blank." +msgstr "" + +#: ../src/viklayerspanel.c:751 +msgid "Aggregate Layers have no settable properties." +msgstr "A csoportosító rétegeknek nincs beállítható tulajdonsága." + +#: ../src/viklayerspanel.c:798 +msgid "You cannot cut the Top Layer." +msgstr "A legfelső réteg nem vágható ki." + +#: ../src/viklayerspanel.c:843 +#, c-format +msgid "Are you sure you want to delete %s?" +msgstr "" + +#: ../src/viklayerspanel.c:863 +msgid "You cannot delete the Top Layer." +msgstr "A legfelső réteg nem törölhető." + +#: ../src/vikmapniklayer.c:78 +msgid "CSS (MML) Config File:" +msgstr "" + +#: ../src/vikmapniklayer.c:79 +msgid "CartoCSS configuration file" +msgstr "" + +#: ../src/vikmapniklayer.c:80 +msgid "XML Config File:" +msgstr "" + +#: ../src/vikmapniklayer.c:81 +msgid "Mapnik XML configuration file" +msgstr "" + +#: ../src/vikmapniklayer.c:84 +msgid "Use File Cache:" +msgstr "" + +#: ../src/vikmapniklayer.c:86 +msgid "File Cache Directory:" +msgstr "" + +#: ../src/vikmapniklayer.c:122 +msgid "_Mapnik Features" +msgstr "" + +#: ../src/vikmapniklayer.c:122 +msgid "Mapnik Features" +msgstr "" + +#: ../src/vikmapniklayer.c:140 +msgid "Mapnik Rendering" +msgstr "" + +#. Changing these values only applies before first mapnik layer is 'created' +#: ../src/vikmapniklayer.c:258 +msgid "Plugins Directory:" +msgstr "" + +#: ../src/vikmapniklayer.c:258 ../src/vikmapniklayer.c:259 +#: ../src/vikmapniklayer.c:260 ../src/vikmapniklayer.c:261 +msgid "You need to restart Viking for a change to this value to be used" +msgstr "" + +#: ../src/vikmapniklayer.c:259 +msgid "Fonts Directory:" +msgstr "" + +#: ../src/vikmapniklayer.c:260 +msgid "Recurse Fonts Directory:" +msgstr "" + +#: ../src/vikmapniklayer.c:261 +msgid "Rerender Timeout (hours):" +msgstr "" + +#. Changeable any time +#: ../src/vikmapniklayer.c:263 +msgid "CartoCSS:" +msgstr "" + +#: ../src/vikmapniklayer.c:263 +msgid "The program to convert CartoCSS files into Mapnik XML" +msgstr "" + +#: ../src/vikmapniklayer.c:506 +msgid "Running" +msgstr "" + +#: ../src/vikmapniklayer.c:525 +#, c-format +msgid "" +"Error running carto command:\n" +"%s" +msgstr "" + +#: ../src/vikmapniklayer.c:561 +msgid " completed in " +msgstr "" + +#: ../src/vikmapniklayer.c:561 +msgid "seconds" +msgstr "" + +#: ../src/vikmapniklayer.c:611 ../src/vikmapniklayer.c:979 +#, c-format +msgid "" +"Mapnik error loading configuration file:\n" +"%s" +msgstr "" + +#: ../src/vikmapniklayer.c:749 +#, c-format +msgid "Mapnik Render %d:%d:%d %s" +msgstr "" + +#: ../src/vikmapniklayer.c:840 +msgid "Mapnik Rendering must be in Mercator mode" +msgstr "" + +#: ../src/vikmapniklayer.c:997 +msgid "Mapnik Information" +msgstr "" + +#: ../src/vikmapniklayer.c:1031 +msgid "_Flush Memory Cache" +msgstr "" + +#: ../src/vikmapniklayer.c:1044 +msgid "_Run Carto Command" +msgstr "" + +#: ../src/vikmapniklayer.c:1102 ../src/vikmapslayer.c:2029 +#, c-format +msgid "Tile File Timestamp: %s" +msgstr "" + +#: ../src/vikmapniklayer.c:1105 ../src/vikmapslayer.c:2032 +msgid "Tile File Timestamp: Not Available" +msgstr "" + +#: ../src/vikmapniklayer.c:1120 +#, c-format +msgid "Rendering time %.2f seconds" +msgstr "" + +#: ../src/vikmapniklayer.c:1124 ../src/vikmapslayer.c:2042 +msgid "Tile Information" +msgstr "" + +#: ../src/vikmapniklayer.c:1145 +msgid "_Rerender Tile" +msgstr "" + +#: ../src/vikmapniklayer.c:1150 +msgid "_Info" +msgstr "" + +#. ******* MAPZOOMS ******** +#: ../src/vikmapslayer.c:96 +msgid "Use Viking Zoom Level" +msgstr "Viking nagyítási szint használata" + +#: ../src/vikmapslayer.c:146 +msgid "OSM" +msgstr "" + +#. NB mode => id - But can't break file format just to rename something better +#: ../src/vikmapslayer.c:152 +msgid "Map Type:" +msgstr "Térképtípus:" + +#: ../src/vikmapslayer.c:153 +msgid "Maps Directory:" +msgstr "Térkép könyvtára:" + +#: ../src/vikmapslayer.c:154 +msgid "Cache Layout:" +msgstr "" + +#: ../src/vikmapslayer.c:155 +msgid "This determines the tile storage layout on disk" +msgstr "" + +#: ../src/vikmapslayer.c:156 +msgid "Map File:" +msgstr "" + +#: ../src/vikmapslayer.c:157 +msgid "An MBTiles file. Only applies when the map type method is 'MBTiles'" +msgstr "" + +#: ../src/vikmapslayer.c:159 +msgid "Control the Alpha value for transparency effects" +msgstr "" + +#: ../src/vikmapslayer.c:160 +msgid "Autodownload maps:" +msgstr "Térkép automatikus letöltése:" + +#: ../src/vikmapslayer.c:161 +msgid "Autodownload Only Gets Missing Maps:" +msgstr "" + +#: ../src/vikmapslayer.c:162 +msgid "" +"Using this option avoids attempting to update already acquired tiles. This " +"can be useful if you want to restrict the network usage, without having to " +"resort to manual control. Only applies when 'Autodownload Maps' is on." +msgstr "" + +#: ../src/vikmapslayer.c:163 +msgid "Zoom Level:" +msgstr "Nagyítási szint:" + +#: ../src/vikmapslayer.c:164 +msgid "" +"Determines the method of displaying map tiles for the current zoom level. " +"'Viking Zoom Level' uses the best matching level, otherwise setting a fixed " +"value will always use map tiles of the specified value regardless of the " +"actual zoom level." +msgstr "" + +#: ../src/vikmapslayer.c:197 +msgid "_Maps Download" +msgstr "" + +#: ../src/vikmapslayer.c:197 +msgid "Maps Download" +msgstr "Térkép letöltése" + +#: ../src/vikmapslayer.c:213 ../src/vikutils.c:895 +msgid "Map" +msgstr "Térkép" + +#: ../src/vikmapslayer.c:306 +msgid "Default map layer directory:" +msgstr "" + +#: ../src/vikmapslayer.c:306 +msgid "Choose a directory to store cached Map tiles for this layer" +msgstr "" + +#: ../src/vikmapslayer.c:436 ../src/vikmapslayer.c:633 +msgid "Unknown map type" +msgstr "Ismeretlen térképtípus" + +#: ../src/vikmapslayer.c:664 +msgid "Unknown Map Zoom" +msgstr "Ismeretlen térképnagyítás" + +#: ../src/vikmapslayer.c:833 +#, c-format +msgid "Failed to open MBTiles file: %s" +msgstr "" + +#: ../src/vikmapslayer.c:856 +#, c-format +msgid "" +"New map cannot be displayed in the current drawmode.\n" +"Select \"%s\" from View menu to view it." +msgstr "" +"Az új térkép nem jeleníthető meg a jelenlegi rajzolási módban.\n" +"Megtekintéséhez válassza a(z) \"%s\" módot a Nézet menüből." + +#: ../src/vikmapslayer.c:1314 +#, c-format +msgid "" +"Cowardly refusing to draw tiles or existence of tiles beyond %d zoom out " +"factor" +msgstr "" +"Gyáván megtagadta, hogy rajzoljon csempéket, vagy hogy létezik csempe %d " +"kicsinyítési tényezőn túl" + +#. TODO: ?? count up the number of download errors somehow... +#: ../src/vikmapslayer.c:1667 +msgid "Failed to download tile" +msgstr "" + +#: ../src/vikmapslayer.c:1673 +msgid "Unable to save tile" +msgstr "" + +#: ../src/vikmapslayer.c:1799 +#, c-format +msgid "Redownloading up to %d %s map..." +msgid_plural "Redownloading up to %d %s maps..." +msgstr[0] "Legfeljebb %d %s térkép újbóli letöltése..." +msgstr[1] "Legfeljebb %d %s térkép újbóli letöltése..." + +#: ../src/vikmapslayer.c:1801 +#, c-format +msgid "Redownloading %d %s map..." +msgid_plural "Redownloading %d %s maps..." +msgstr[0] "%d %s térkép újbóli letöltése..." +msgstr[1] "%d %s térkép újbóli letöltése..." + +#: ../src/vikmapslayer.c:1805 ../src/vikmapslayer.c:1890 +#, c-format +msgid "Downloading %d %s map..." +msgid_plural "Downloading %d %s maps..." +msgstr[0] "%d %s térkép letöltése..." +msgstr[1] "%d %s térkép letöltése..." + +#: ../src/vikmapslayer.c:1969 +msgid "YES" +msgstr "" + +#: ../src/vikmapslayer.c:1973 ../src/vikmapslayer.c:1977 +msgid "NO" +msgstr "" + +#. NB Also handles .jpg automatically due to pixbuf_new_from () support - although just print png for now. +#: ../src/vikmapslayer.c:1980 +#, c-format +msgid "Source: %s (%d%s%d%s%d.%s %s)" +msgstr "" + +#: ../src/vikmapslayer.c:1983 +msgid "Source: Not available" +msgstr "" + +#: ../src/vikmapslayer.c:2000 +msgid "Source: file://" +msgstr "" + +#: ../src/vikmapslayer.c:2012 +#, c-format +msgid "Source: %s" +msgstr "" + +#: ../src/vikmapslayer.c:2038 +#, c-format +msgid "Tile File: %s [Not Available]" +msgstr "" + +#: ../src/vikmapslayer.c:2086 +msgid "Redownload _Bad Map(s)" +msgstr "_Rossz térkép(ek) újbóli letöltése" + +#: ../src/vikmapslayer.c:2090 +msgid "Redownload _New Map(s)" +msgstr "Ú_j térkép(ek) újbóli letöltése" + +#: ../src/vikmapslayer.c:2094 +msgid "Redownload _All Map(s)" +msgstr "Ö_sszes térkép újbóli letöltése" + +#: ../src/vikmapslayer.c:2099 +msgid "_Show Tile Information" +msgstr "" + +#: ../src/vikmapslayer.c:2166 +#, c-format +msgid "" +"Wrong drawmode for this map.\n" +"Select \"%s\" from View menu and try again." +msgstr "" +"Rossz rajzolási mód a térképhez.\n" +"Válassza a(z) \"%s\" módot a Nézet menüből, és próbálja újra." + +#: ../src/vikmapslayer.c:2171 +msgid "Wrong zoom level for this map." +msgstr "Rossz nagyítási szint a térképhez." + +#: ../src/vikmapslayer.c:2334 +msgid "Zoom Start:" +msgstr "" + +#: ../src/vikmapslayer.c:2341 +msgid "Zoom End:" +msgstr "" + +#: ../src/vikmapslayer.c:2347 +msgid "Download Maps Method:" +msgstr "" + +#. redownload method - needs to align with REDOWNLOAD* macro values +#: ../src/vikmapslayer.c:2419 +msgid "Missing" +msgstr "" + +#: ../src/vikmapslayer.c:2419 +msgid "Bad" +msgstr "" + +#: ../src/vikmapslayer.c:2419 +msgid "New" +msgstr "" + +#: ../src/vikmapslayer.c:2419 +msgid "Reload All" +msgstr "" + +#: ../src/vikmapslayer.c:2421 +msgid "Download for Zoom Levels" +msgstr "" + +#: ../src/vikmapslayer.c:2461 +#, c-format +msgid "" +"You are not allowed to download more than %d tiles in one go (requested %d)" +msgstr "" + +#: ../src/vikmapslayer.c:2469 +#, c-format +msgid "Do you really want to download %d tiles?" +msgstr "" + +#. Now with icons +#: ../src/vikmapslayer.c:2509 +msgid "Download _Missing Onscreen Maps" +msgstr "Képernyőről _hiányzó térképrészletek letöltése" + +#: ../src/vikmapslayer.c:2516 +msgid "Download _New Onscreen Maps" +msgstr "Képernyőn lévő ú_j térképrészletek letöltése" + +#: ../src/vikmapslayer.c:2523 +msgid "Reload _All Onscreen Maps" +msgstr "Képernyőn lévő ö_sszes térképrészlet újratöltése" + +#: ../src/vikmapslayer.c:2529 +msgid "Download Maps in _Zoom Levels..." +msgstr "" + +#: ../src/vikmapslayer.c:2539 +#, fuzzy +msgid "_Open MBTiles Files" +msgstr "_Legutóbbi fájl megnyitása" + +#: ../src/vikmapslayer.c:2554 +msgid "Flush Map Cache" +msgstr "" + +#: ../src/vikrouting.c:54 +msgid "Default engine:" +msgstr "" + +#: ../src/vikrouting.c:68 +msgid "Routing" +msgstr "" + +#: ../src/viktreeview.c:347 +msgid "Layer Name" +msgstr "Réteg neve" + +#: ../src/viktreeview.c:924 +#, c-format +msgid "delete data from %s\n" +msgstr "adatok törlése innen: %s\n" + +#: ../src/viktrwlayer.c:427 +msgid "Create _Waypoint" +msgstr "" + +#: ../src/viktrwlayer.c:427 +msgid "Create Waypoint" +msgstr "Útpont létrehozása" + +#: ../src/viktrwlayer.c:437 +#, fuzzy +msgid "Edit _Track" +msgstr "Nyompont szerkesztése" + +#: ../src/viktrwlayer.c:437 +#, fuzzy +msgid "Edit Track" +msgstr "Nyompont szerkesztése" + +#: ../src/viktrwlayer.c:449 +msgid "Edit _Route" +msgstr "" + +#: ../src/viktrwlayer.c:449 +#, fuzzy +msgid "Edit Route" +msgstr "Útpont szerkesztése" + +#: ../src/viktrwlayer.c:460 +msgid "Route _Finder" +msgstr "" + +#: ../src/viktrwlayer.c:460 +msgid "Route Finder" +msgstr "" + +#: ../src/viktrwlayer.c:471 +#, fuzzy +msgid "Splitter" +msgstr "Kettévágás itt" + +#: ../src/viktrwlayer.c:482 +msgid "_Edit Waypoint" +msgstr "" + +#: ../src/viktrwlayer.c:482 +msgid "Edit Waypoint" +msgstr "Útpont szerkesztése" + +#: ../src/viktrwlayer.c:495 +msgid "Edit Trac_kpoint" +msgstr "" + +#: ../src/viktrwlayer.c:495 +msgid "Edit Trackpoint" +msgstr "Nyompont szerkesztése" + +#. a pixbuf for this one is already made globally available +#: ../src/viktrwlayer.c:508 +msgid "Show P_icture" +msgstr "" + +#: ../src/viktrwlayer.c:508 +msgid "Show Picture" +msgstr "Kép megjelenítése" + +#: ../src/viktrwlayer.c:531 +msgid "Waypoint Images" +msgstr "Útpont képek" + +#: ../src/viktrwlayer.c:531 +msgid "Tracks Advanced" +msgstr "" + +#: ../src/viktrwlayer.c:531 +msgid "Metadata" +msgstr "" + +#: ../src/viktrwlayer.c:531 +msgid "Filesystem" +msgstr "" + +#: ../src/viktrwlayer.c:534 +msgid "Draw by Track" +msgstr "Rajzolás nyomvonal szerint" + +#: ../src/viktrwlayer.c:534 +msgid "Draw by Speed" +msgstr "" + +#: ../src/viktrwlayer.c:534 +msgid "All Tracks Same Color" +msgstr "" + +#: ../src/viktrwlayer.c:535 +msgid "Filled Square" +msgstr "Kitöltött négyzet" + +#: ../src/viktrwlayer.c:535 +msgid "Square" +msgstr "Négyzet" + +#: ../src/viktrwlayer.c:535 +msgid "Circle" +msgstr "Kör" + +#: ../src/viktrwlayer.c:535 +msgid "X" +msgstr "X" + +#: ../src/viktrwlayer.c:561 +msgid "Extra Extra Small" +msgstr "" + +#: ../src/viktrwlayer.c:562 +msgid "Extra Small" +msgstr "" + +#: ../src/viktrwlayer.c:566 +msgid "Extra Large" +msgstr "" + +#: ../src/viktrwlayer.c:567 +msgid "Extra Extra Large" +msgstr "" + +#: ../src/viktrwlayer.c:573 +msgid "Name Ascending" +msgstr "" + +#: ../src/viktrwlayer.c:574 +msgid "Name Descending" +msgstr "" + +#: ../src/viktrwlayer.c:582 ../src/viktrwlayer_propwin.c:3319 +msgid "No" +msgstr "" + +#: ../src/viktrwlayer.c:583 +msgid "Yes" +msgstr "" + +#: ../src/viktrwlayer.c:584 +msgid "No write" +msgstr "" + +#: ../src/viktrwlayer.c:649 ../src/viktrwlayer.c:673 +msgid "Draw Labels" +msgstr "Címkék rajzolása" + +#: ../src/viktrwlayer.c:650 +msgid "Note: the individual track controls what labels may be displayed" +msgstr "" + +#: ../src/viktrwlayer.c:651 +msgid "Track Labels Font Size:" +msgstr "" + +#: ../src/viktrwlayer.c:652 +msgid "Track Drawing Mode:" +msgstr "Nyomvonal rajzolási módja:" + +#: ../src/viktrwlayer.c:653 +msgid "All Tracks Color:" +msgstr "" + +#: ../src/viktrwlayer.c:654 +msgid "The color used when 'All Tracks Same Color' drawing mode is selected" +msgstr "" + +#: ../src/viktrwlayer.c:655 +msgid "Draw Track Lines" +msgstr "Nyomvonal vonalainak rajzolása" + +#: ../src/viktrwlayer.c:656 +msgid "Track Thickness:" +msgstr "Nyomvonal vastagsága:" + +#: ../src/viktrwlayer.c:657 +msgid "Draw Track Direction" +msgstr "" + +#: ../src/viktrwlayer.c:658 +msgid "Direction Size:" +msgstr "" + +#: ../src/viktrwlayer.c:659 +msgid "Draw Trackpoints" +msgstr "Nyompontok rajzolása" + +#: ../src/viktrwlayer.c:660 +msgid "Trackpoint Size:" +msgstr "" + +#: ../src/viktrwlayer.c:661 +msgid "Draw Elevation" +msgstr "Magasság rajzolása" + +#: ../src/viktrwlayer.c:662 +msgid "Draw Elevation Height %:" +msgstr "Magasság rajzolása %:" + +#: ../src/viktrwlayer.c:663 +msgid "Draw Stops" +msgstr "Rajzolás megállítása" + +#: ../src/viktrwlayer.c:664 +msgid "" +"Whether to draw a marker when trackpoints are at the same position but over " +"the minimum stop length apart in time" +msgstr "" + +#: ../src/viktrwlayer.c:665 +msgid "Min Stop Length (seconds):" +msgstr "Minimális megállítási hossz (másodperc):" + +#: ../src/viktrwlayer.c:667 +msgid "Track BG Thickness:" +msgstr "Nyomvonal hátterének vastagsága" + +#: ../src/viktrwlayer.c:668 +msgid "Track Background Color" +msgstr "Nyomvonal háttérszíne" + +#: ../src/viktrwlayer.c:669 +msgid "Draw by Speed Factor (%):" +msgstr "" + +#: ../src/viktrwlayer.c:670 +msgid "" +"The percentage factor away from the average speed determining the color used" +msgstr "" + +#: ../src/viktrwlayer.c:671 +msgid "Track Sort Order:" +msgstr "" + +#: ../src/viktrwlayer.c:674 +msgid "Waypoint Font Size:" +msgstr "" + +#: ../src/viktrwlayer.c:675 +msgid "Waypoint Color:" +msgstr "Útpont színe:" + +#: ../src/viktrwlayer.c:676 +msgid "Waypoint Text:" +msgstr "Útpont szövege:" + +#: ../src/viktrwlayer.c:677 +msgid "Background:" +msgstr "Háttér:" + +#: ../src/viktrwlayer.c:678 +msgid "Fake BG Color Translucency:" +msgstr "Hamis háttérszín-átlátszóság:" + +#: ../src/viktrwlayer.c:679 +msgid "Waypoint marker:" +msgstr "Útpont-jelölő:" + +#: ../src/viktrwlayer.c:680 +msgid "Waypoint size:" +msgstr "Útpont mérete:" + +#: ../src/viktrwlayer.c:681 +msgid "Draw Waypoint Symbols:" +msgstr "Útpont-szimbólumok rajzolása" + +#: ../src/viktrwlayer.c:682 +msgid "Waypoint Sort Order:" +msgstr "" + +#: ../src/viktrwlayer.c:684 +msgid "Draw Waypoint Images" +msgstr "Útpont-képek rajzolása" + +#: ../src/viktrwlayer.c:685 +msgid "Image Size (pixels):" +msgstr "Képméret (képpont):" + +#: ../src/viktrwlayer.c:686 +msgid "Image Alpha:" +msgstr "Kép alfa:" + +#: ../src/viktrwlayer.c:687 +msgid "Image Memory Cache Size:" +msgstr "Képmemória-gyorsítótár mérete:" + +#: ../src/viktrwlayer.c:690 +msgid "Author" +msgstr "" + +#: ../src/viktrwlayer.c:691 +msgid "Creation Time" +msgstr "" + +#: ../src/viktrwlayer.c:692 +msgid "Keywords" +msgstr "" + +#: ../src/viktrwlayer.c:693 +msgid "External layer:" +msgstr "" + +#: ../src/viktrwlayer.c:693 +msgid "" +"Layer data stored in the Viking file, in an external file, or in an external " +"file but changes are not written to the file (file only loaded at startup)" +msgstr "" + +#: ../src/viktrwlayer.c:694 +msgid "Save layer as:" +msgstr "" + +#: ../src/viktrwlayer.c:694 +msgid "Specify where layer should be saved. Overwrites file if it exists." +msgstr "" + +#: ../src/viktrwlayer.c:798 +msgid "TrackWaypoint" +msgstr "" + +#: ../src/viktrwlayer.c:1999 ../src/viktrwlayer_propwin.c:1469 +#: ../src/viktrwlayer_propwin.c:1471 ../src/vikutils.c:299 +#: ../src/vikutils.c:326 +msgid "miles" +msgstr "" + +#: ../src/viktrwlayer.c:2002 ../src/viktrwlayer_propwin.c:1475 +#: ../src/viktrwlayer_propwin.c:1477 ../src/vikutils.c:303 +#: ../src/vikutils.c:330 +msgid "NM" +msgstr "" + +#. VIK_UNITS_DISTANCE_KILOMETRES: +#: ../src/viktrwlayer.c:2006 ../src/viktrwlayer_propwin.c:1482 +#: ../src/viktrwlayer_propwin.c:1484 ../src/vikutils.c:308 +#: ../src/vikutils.c:335 +msgid "km" +msgstr "" + +#: ../src/viktrwlayer.c:2121 +msgid "start/end" +msgstr "" + +#: ../src/viktrwlayer.c:2133 +msgid "start" +msgstr "" + +#: ../src/viktrwlayer.c:2142 +msgid "end" +msgstr "" + +#: ../src/viktrwlayer.c:3103 +#, c-format +msgid " in %d:%02d hrs:mins" +msgstr " ezen belül: %d:%02d óra:perc" + +#: ../src/viktrwlayer.c:3107 +#, c-format +msgid "" +"\n" +"%sTotal Length %.1f %s%s" +msgstr "" +"\n" +"%sTeljes hossz %.1f %s%s" + +#: ../src/viktrwlayer.c:3131 +#, c-format +msgid "" +"\n" +"Total route length %.1f %s" +msgstr "" + +#: ../src/viktrwlayer.c:3136 +#, c-format +msgid "Tracks: %d - Waypoints: %d - Routes: %d%s%s" +msgstr "" + +#: ../src/viktrwlayer.c:3155 +#, c-format +msgid "Tracks: %d" +msgstr "" + +#: ../src/viktrwlayer.c:3165 +#, c-format +msgid "Routes: %d" +msgstr "" + +#: ../src/viktrwlayer.c:3195 +#, c-format +msgid "- %d:%02d hrs:mins" +msgstr "- %d:%02d óra:perc" + +#: ../src/viktrwlayer.c:3202 +#, c-format +msgid "%s%.1f km %s" +msgstr "%s%.1f km %s" + +#: ../src/viktrwlayer.c:3205 +#, c-format +msgid "%s%.1f miles %s" +msgstr "%s%.1f mérföld %s" + +#: ../src/viktrwlayer.c:3208 +#, c-format +msgid "%s%.1f NM %s" +msgstr "" + +#: ../src/viktrwlayer.c:3222 +#, c-format +msgid "Waypoints: %d" +msgstr "" + +#: ../src/viktrwlayer.c:3279 +#, c-format +msgid "Wpt: Alt %dft" +msgstr "" + +#. VIK_UNITS_HEIGHT_METRES: +#: ../src/viktrwlayer.c:3283 +#, c-format +msgid "Wpt: Alt %dm" +msgstr "" + +#. Add comment if available +#: ../src/viktrwlayer.c:3298 +#, c-format +msgid "%s | %s %s | Comment: %s" +msgstr "" + +#: ../src/viktrwlayer.c:3300 +#, c-format +msgid "%s | %s %s" +msgstr "" + +#: ../src/viktrwlayer.c:3562 ../src/viktrwlayer.c:3591 +msgid "This layer has no waypoints or trackpoints." +msgstr "Ez a réteg nem tartalmaz útpontot vagy nyompontot." + +#: ../src/viktrwlayer.c:3598 ../src/viktrwlayer.c:3607 +#: ../src/viktrwlayer.c:3616 ../src/viktrwlayer.c:3625 +#: ../src/viktrwlayer.c:3634 ../src/viktrwlayer.c:3642 +msgid "Export Layer" +msgstr "Réteg exportálása" + +#: ../src/viktrwlayer.c:3671 +msgid "Export Route as GPX" +msgstr "" + +#: ../src/viktrwlayer.c:3673 +msgid "Export Track as GPX" +msgstr "Nyomvonal exportálása GPX-be" + +#: ../src/viktrwlayer.c:3693 +msgid "Find" +msgstr "Keresés" + +#: ../src/viktrwlayer.c:3703 +msgid "Waypoint Name:" +msgstr "Útpont neve:" + +#: ../src/viktrwlayer.c:3720 +msgid "Waypoint not found in this layer." +msgstr "Nem található útpont ezen a rétegen." + +#: ../src/viktrwlayer.c:3989 +msgid "Can not upload invisible track." +msgstr "" + +#: ../src/viktrwlayer.c:4082 ../src/viktrwlayer.c:10512 +msgid "Track" +msgstr "Nyomvonal" + +#: ../src/viktrwlayer.c:4107 ../src/viktrwlayer.c:10599 +msgid "Route" +msgstr "" + +#: ../src/viktrwlayer.c:4194 +msgid "Externa_l" +msgstr "" + +#: ../src/viktrwlayer.c:4216 ../src/viktrwlayer.c:8456 +#: ../src/viktrwlayer.c:8574 +msgid "_Finish Route" +msgstr "" + +#: ../src/viktrwlayer.c:4218 ../src/viktrwlayer.c:8380 +#: ../src/viktrwlayer.c:8572 +msgid "_Finish Track" +msgstr "" + +#. Now with icons +#: ../src/viktrwlayer.c:4230 +msgid "_View Layer" +msgstr "_Réteg megjelenítése" + +#: ../src/viktrwlayer.c:4237 +msgid "V_iew" +msgstr "" + +#: ../src/viktrwlayer.c:4243 +msgid "View All _Tracks" +msgstr "" + +#: ../src/viktrwlayer.c:4248 +msgid "View All _Routes" +msgstr "" + +#: ../src/viktrwlayer.c:4253 +msgid "View All _Waypoints" +msgstr "" + +#: ../src/viktrwlayer.c:4258 +msgid "_Goto Center of Layer" +msgstr "_Ugrás a réteg közepére" + +#: ../src/viktrwlayer.c:4264 ../src/viktrwlayer.c:8321 +msgid "Goto _Waypoint..." +msgstr "" + +#: ../src/viktrwlayer.c:4270 +msgid "_Export Layer" +msgstr "Réteg _exportálása" + +#: ../src/viktrwlayer.c:4276 +msgid "Export as GPS_Point..." +msgstr "" + +#: ../src/viktrwlayer.c:4281 +msgid "Export as GPS_Mapper..." +msgstr "" + +#: ../src/viktrwlayer.c:4286 +msgid "Export as _GPX..." +msgstr "" + +#: ../src/viktrwlayer.c:4292 +msgid "Export as _KML..." +msgstr "" + +#: ../src/viktrwlayer.c:4299 +msgid "Export as GEO_JSON..." +msgstr "" + +#: ../src/viktrwlayer.c:4306 +msgid "Export via GPSbabel..." +msgstr "" + +#: ../src/viktrwlayer.c:4312 +#, c-format +msgid "Open with External Program_1: %s" +msgstr "" + +#: ../src/viktrwlayer.c:4319 +#, c-format +msgid "Open with External Program_2: %s" +msgstr "" + +#: ../src/viktrwlayer.c:4327 ../src/vikwindow.c:4825 +msgid "_New" +msgstr "Ú_j" + +#: ../src/viktrwlayer.c:4333 +msgid "New _Waypoint..." +msgstr "" + +#: ../src/viktrwlayer.c:4339 +msgid "New _Track" +msgstr "" + +#: ../src/viktrwlayer.c:4347 +msgid "New _Route" +msgstr "" + +#: ../src/viktrwlayer.c:4356 ../src/viktrwlayer.c:8232 +#: ../src/viktrwlayer.c:9003 +msgid "Geotag _Images..." +msgstr "" + +#: ../src/viktrwlayer.c:4363 +msgid "_Acquire" +msgstr "" + +#: ../src/viktrwlayer.c:4369 ../src/vikwindow.c:4904 +msgid "From _GPS..." +msgstr "_GPS-ről..." + +#. FIXME: only add menu when at least a routing engine has support for Directions +#: ../src/viktrwlayer.c:4375 +msgid "From _Directions..." +msgstr "" + +#: ../src/viktrwlayer.c:4381 +msgid "From _OSM Traces..." +msgstr "" + +#: ../src/viktrwlayer.c:4386 +msgid "From _My OSM Traces..." +msgstr "" + +#: ../src/viktrwlayer.c:4392 ../src/vikwindow.c:4844 +msgid "From _URL..." +msgstr "" + +#: ../src/viktrwlayer.c:4399 ../src/vikwindow.c:4846 +msgid "From _Wikipedia Waypoints" +msgstr "" + +#: ../src/viktrwlayer.c:4405 +msgid "Within _Layer Bounds" +msgstr "_Réteg határain belül" + +#: ../src/viktrwlayer.c:4411 +msgid "Within _Current View" +msgstr "_Jelenlegi nézeten belül" + +#: ../src/viktrwlayer.c:4419 +msgid "From Geo_caching..." +msgstr "" + +#: ../src/viktrwlayer.c:4426 ../src/vikwindow.c:4842 +msgid "From Geotagged _Images..." +msgstr "" + +#: ../src/viktrwlayer.c:4433 +msgid "From _File..." +msgstr "" + +#: ../src/viktrwlayer.c:4436 ../src/vikwindow.c:4905 +msgid "Import File With GPS_Babel..." +msgstr "" + +#: ../src/viktrwlayer.c:4443 ../src/viktrwlayer.c:8905 +msgid "_Upload" +msgstr "" + +#: ../src/viktrwlayer.c:4449 +msgid "Upload to _GPS..." +msgstr "" + +#: ../src/viktrwlayer.c:4456 ../src/viktrwlayer.c:8973 +msgid "Upload to _OSM..." +msgstr "" + +#: ../src/viktrwlayer.c:4464 +msgid "De_lete" +msgstr "" + +#: ../src/viktrwlayer.c:4470 +msgid "Delete All _Tracks" +msgstr "" + +#: ../src/viktrwlayer.c:4477 +msgid "Delete Tracks _From Selection..." +msgstr "" + +#: ../src/viktrwlayer.c:4484 ../src/viktrwlayer.c:8481 +msgid "Delete _All Routes" +msgstr "" + +#: ../src/viktrwlayer.c:4491 ../src/viktrwlayer.c:8487 +msgid "_Delete Routes From Selection..." +msgstr "" + +#: ../src/viktrwlayer.c:4498 +msgid "Delete All _Waypoints" +msgstr "" + +#: ../src/viktrwlayer.c:4505 +msgid "Delete Waypoints From _Selection..." +msgstr "" + +#: ../src/viktrwlayer.c:4512 ../src/viktrwlayer.c:8339 +#, fuzzy +msgid "Delete Duplicate Waypoints" +msgstr "Kettőzött útpontok eltávolítása" + +#: ../src/viktrwlayer.c:5198 +#, c-format +msgid "Are you sure you want to delete all tracks in %s?" +msgstr "" + +#: ../src/viktrwlayer.c:5211 +#, c-format +msgid "Are you sure you want to delete all routes in %s?" +msgstr "" + +#: ../src/viktrwlayer.c:5221 +#, c-format +msgid "Are you sure you want to delete all waypoints in %s?" +msgstr "" + +#: ../src/viktrwlayer.c:5238 +#, c-format +msgid "Are you sure you want to delete the waypoint \"%s\"?" +msgstr "" + +#: ../src/viktrwlayer.c:5254 +#, c-format +msgid "Are you sure you want to delete the track \"%s\"?" +msgstr "" + +#: ../src/viktrwlayer.c:5271 +#, c-format +msgid "Are you sure you want to delete the route \"%s\"?" +msgstr "" + +#: ../src/viktrwlayer.c:5527 ../src/viktrwlayer.c:6373 +msgid "" +"Converting a track to a route removes extra track data such as segments, " +"timestamps, etc...\n" +"Do you want to continue?" +msgstr "" + +#: ../src/viktrwlayer.c:5631 +msgid "No DEM layers available, thus no DEM values can be applied." +msgstr "" + +#: ../src/viktrwlayer.c:5651 ../src/viktrwlayer.c:5692 +#, c-format +msgid "%ld point adjusted" +msgid_plural "%ld points adjusted" +msgstr[0] "" +msgstr[1] "" + +#: ../src/viktrwlayer.c:5736 +#, c-format +msgid "%ld waypoint changed" +msgid_plural "%ld waypoints changed" +msgstr[0] "" +msgstr[1] "" + +#: ../src/viktrwlayer.c:5917 +#, c-format +msgid "" +"Refining a track with many points (%d) is unlikely to yield sensible " +"results. Do you want to Continue?" +msgstr "" + +#. Select engine from dialog +#: ../src/viktrwlayer.c:5925 +msgid "Refine Route with Routing Engine..." +msgstr "" + +#: ../src/viktrwlayer.c:5933 +msgid "Select routing engine" +msgstr "" + +#: ../src/viktrwlayer.c:6158 +msgid "Failed. No other tracks with timestamps in this layer found" +msgstr "" + +#: ../src/viktrwlayer.c:6160 +msgid "Failed. No other tracks without timestamps in this layer found" +msgstr "" + +#: ../src/viktrwlayer.c:6179 +msgid "Merge with..." +msgstr "Egyesítés..." + +#: ../src/viktrwlayer.c:6180 +msgid "Select route to merge with" +msgstr "" + +#: ../src/viktrwlayer.c:6180 +msgid "Select track to merge with" +msgstr "Nyomvonal kiválasztása az egyesítéshez" + +#: ../src/viktrwlayer.c:6264 ../src/viktrwlayer.c:6346 +msgid "Append Route" +msgstr "" + +#: ../src/viktrwlayer.c:6264 ../src/viktrwlayer.c:6346 +msgid "Append Track" +msgstr "" + +#: ../src/viktrwlayer.c:6265 +msgid "Select the route to append after the current route" +msgstr "" + +#: ../src/viktrwlayer.c:6266 +msgid "Select the track to append after the current track" +msgstr "" + +#: ../src/viktrwlayer.c:6347 +msgid "Select the track to append after the current route" +msgstr "" + +#: ../src/viktrwlayer.c:6348 +msgid "Select the route to append after the current track" +msgstr "" + +#: ../src/viktrwlayer.c:6414 +#, c-format +msgid "%d segment merged" +msgid_plural "%d segments merged" +msgstr[0] "" +msgstr[1] "" + +#: ../src/viktrwlayer.c:6430 +msgid "Failed. This track does not have timestamp" +msgstr "Sikertelen. Ez a nyomvonal nem tartalmaz időbélyeget" + +#: ../src/viktrwlayer.c:6442 +msgid "Failed. No other track in this layer has timestamp" +msgstr "" +"Sikertelen. Nincs más nyomvonal ezen a rétegen, amely tartalmaz időbélyeget" + +#: ../src/viktrwlayer.c:6449 +msgid "Merge Threshold..." +msgstr "Egyesítési küszöb..." + +#: ../src/viktrwlayer.c:6450 +msgid "Merge when time between tracks less than:" +msgstr "Egyesítés, ha az időeltérés a nyomvonalak között kevesebb mint:" + +#: ../src/viktrwlayer.c:6580 +msgid "Split Threshold..." +msgstr "Vágási küszöb..." + +#: ../src/viktrwlayer.c:6581 +msgid "Split when time between trackpoints exceeds:" +msgstr "Kettévágás, ha az időeltérés a nyompontok között meghaladja:" + +#: ../src/viktrwlayer.c:6598 +#, c-format +msgid "" +"Can not split track due to trackpoints not ordered in time - such as at %s.\n" +"\n" +"Goto this trackpoint?" +msgstr "" + +#: ../src/viktrwlayer.c:6668 +msgid "Split Every Nth Point" +msgstr "Kettévágás minden x-edik pontnál" + +#: ../src/viktrwlayer.c:6669 +msgid "Split on every Nth point:" +msgstr "Kettévágás minden x-edik pontnál:" + +#: ../src/viktrwlayer.c:6779 +msgid "Can not split track as it has no segments" +msgstr "" + +#: ../src/viktrwlayer.c:6861 ../src/viktrwlayer.c:6891 +#, c-format +msgid "Deleted %ld point" +msgid_plural "Deleted %ld points" +msgstr[0] "" +msgstr[1] "" + +#: ../src/viktrwlayer.c:6966 ../src/viktrwlayer.c:10989 +#: ../src/viktrwlayer_waypointlist.c:214 +#, c-format +msgid "Could not launch %s to open file." +msgstr "" + +#: ../src/viktrwlayer.c:6992 ../src/viktrwlayer.c:7113 +msgid "This track has no date information." +msgstr "" + +#: ../src/viktrwlayer.c:7006 ../src/viktrwlayer.c:7136 +msgid "This waypoint has no date information." +msgstr "" + +#: ../src/viktrwlayer.c:7030 +#, c-format +msgid "Could not launch %s" +msgstr "" + +#: ../src/viktrwlayer.c:7269 +msgid "Internal Error in vik_trw_layer_uniquify_tracks" +msgstr "" + +#: ../src/viktrwlayer.c:7374 ../src/viktrwlayer.c:7424 +#: ../src/viktrwlayer.c:7587 +msgid "" +"Multiple entries with the same name exist. This method only works with " +"unique names. Force unique names now?" +msgstr "" + +#: ../src/viktrwlayer.c:7385 +msgid "No tracks found" +msgstr "" + +#: ../src/viktrwlayer.c:7393 ../src/viktrwlayer.c:7443 +#: ../src/viktrwlayer.c:7607 +msgid "Delete Selection" +msgstr "" + +#: ../src/viktrwlayer.c:7394 +msgid "Select tracks to delete" +msgstr "" + +#: ../src/viktrwlayer.c:7435 +msgid "No routes found" +msgstr "" + +#: ../src/viktrwlayer.c:7444 +msgid "Select routes to delete" +msgstr "" + +#: ../src/viktrwlayer.c:7550 +msgid "Internal Error in vik_trw_layer_uniquify_waypoints" +msgstr "" + +#: ../src/viktrwlayer.c:7597 +msgid "No waypoints found" +msgstr "" + +#: ../src/viktrwlayer.c:7608 +msgid "Select waypoints to delete" +msgstr "" + +#: ../src/viktrwlayer.c:7691 +#, c-format +msgid "%ld waypoint deleted" +msgid_plural "%ld waypoints deleted" +msgstr[0] "" +msgstr[1] "" + +#: ../src/viktrwlayer.c:7697 +#, fuzzy +msgid "No duplicates found" +msgstr "Nem található bejegyzés!" + +#: ../src/viktrwlayer.c:8028 +#, c-format +msgid "" +"A waypoint with the name \"%s\" already exists. Really rename to the same " +"name?" +msgstr "" + +#: ../src/viktrwlayer.c:8058 +#, c-format +msgid "" +"A track with the name \"%s\" already exists. Really rename to the same name?" +msgstr "" + +#: ../src/viktrwlayer.c:8095 +#, c-format +msgid "" +"A route with the name \"%s\" already exists. Really rename to the same name?" +msgstr "" + +#: ../src/viktrwlayer.c:8215 ../src/viktrwlayer.c:8602 +msgid "_Goto" +msgstr "_Ugrás" + +#: ../src/viktrwlayer.c:8226 +msgid "_Visit Geocache Webpage" +msgstr "Geocache weboldal _meglátogatása" + +#: ../src/viktrwlayer.c:8235 +msgid "Geotag multiple images against this waypoint" +msgstr "" + +#: ../src/viktrwlayer.c:8245 ../src/viktrwlayer_waypointlist.c:352 +msgid "_Show Picture..." +msgstr "" + +#: ../src/viktrwlayer.c:8253 +msgid "Update Geotag on _Image" +msgstr "" + +#: ../src/viktrwlayer.c:8259 +msgid "_Update" +msgstr "" + +#: ../src/viktrwlayer.c:8264 +msgid "Update and _Keep File Timestamp" +msgstr "" + +#: ../src/viktrwlayer.c:8276 +msgid "Visit _Webpage" +msgstr "" + +#: ../src/viktrwlayer.c:8306 +msgid "_New Waypoint..." +msgstr "" + +#: ../src/viktrwlayer.c:8315 +msgid "_View All Waypoints" +msgstr "" + +#: ../src/viktrwlayer.c:8327 +msgid "Delete _All Waypoints" +msgstr "" + +#: ../src/viktrwlayer.c:8333 +msgid "_Delete Waypoints From Selection..." +msgstr "" + +#: ../src/viktrwlayer.c:8351 +msgid "_Show All Waypoints" +msgstr "" + +#: ../src/viktrwlayer.c:8357 +msgid "_Hide All Waypoints" +msgstr "" + +#: ../src/viktrwlayer.c:8369 +msgid "_List Waypoints..." +msgstr "" + +#: ../src/viktrwlayer.c:8390 +msgid "_View All Tracks" +msgstr "" + +#: ../src/viktrwlayer.c:8396 +msgid "_New Track" +msgstr "" + +#: ../src/viktrwlayer.c:8404 +msgid "Delete _All Tracks" +msgstr "" + +#: ../src/viktrwlayer.c:8410 +msgid "_Delete Tracks From Selection..." +msgstr "" + +#: ../src/viktrwlayer.c:8422 +msgid "_Show All Tracks" +msgstr "" + +#: ../src/viktrwlayer.c:8428 +msgid "_Hide All Tracks" +msgstr "" + +#: ../src/viktrwlayer.c:8439 +msgid "_List Tracks..." +msgstr "" + +#: ../src/viktrwlayer.c:8467 +msgid "_View All Routes" +msgstr "" + +#: ../src/viktrwlayer.c:8473 +msgid "_New Route" +msgstr "" + +#: ../src/viktrwlayer.c:8499 +msgid "_Show All Routes" +msgstr "" + +#: ../src/viktrwlayer.c:8505 +msgid "_Hide All Routes" +msgstr "" + +#: ../src/viktrwlayer.c:8516 +msgid "_List Routes..." +msgstr "" + +#: ../src/viktrwlayer.c:8587 +msgid "_View Track" +msgstr "_Nyomvonal megjelenítése" + +#: ../src/viktrwlayer.c:8589 +msgid "_View Route" +msgstr "" + +#: ../src/viktrwlayer.c:8608 +msgid "_Startpoint" +msgstr "_Kezdőpont" + +#: ../src/viktrwlayer.c:8614 +msgid "\"_Center\"" +msgstr "\"_Középpont\"" + +#: ../src/viktrwlayer.c:8620 +msgid "_Endpoint" +msgstr "_Végpont" + +#: ../src/viktrwlayer.c:8626 +msgid "_Highest Altitude" +msgstr "_Legnagyobb magasság" + +#: ../src/viktrwlayer.c:8632 +msgid "_Lowest Altitude" +msgstr "L_egalacsonyabb magasság" + +#: ../src/viktrwlayer.c:8640 +msgid "_Maximum Speed" +msgstr "_Maximális sebesség" + +#: ../src/viktrwlayer.c:8646 +msgid "_Date" +msgstr "" + +#: ../src/viktrwlayer.c:8655 +msgid "Co_mbine" +msgstr "" + +#: ../src/viktrwlayer.c:8663 +msgid "_Merge By Time..." +msgstr "" + +#: ../src/viktrwlayer.c:8668 +msgid "Merge _Segments" +msgstr "" + +#: ../src/viktrwlayer.c:8675 +msgid "Merge _With Other Tracks..." +msgstr "Egyesítés _más nyomvonalakkal..." + +#: ../src/viktrwlayer.c:8682 +msgid "_Append Track..." +msgstr "" + +#: ../src/viktrwlayer.c:8684 +msgid "_Append Route..." +msgstr "" + +#: ../src/viktrwlayer.c:8690 +msgid "Append _Route..." +msgstr "" + +#: ../src/viktrwlayer.c:8692 +msgid "Append _Track..." +msgstr "" + +#: ../src/viktrwlayer.c:8699 +msgid "_Split" +msgstr "" + +#: ../src/viktrwlayer.c:8707 +msgid "_Split By Time..." +msgstr "" + +#. ATM always enable this entry - don't want to have to analyse the track before displaying the menu - to keep the menu speedy +#: ../src/viktrwlayer.c:8713 +msgid "Split Se_gments" +msgstr "" + +#: ../src/viktrwlayer.c:8719 +msgid "Split By _Number of Points..." +msgstr "" + +#: ../src/viktrwlayer.c:8724 +msgid "Split at _Trackpoint" +msgstr "" + +#: ../src/viktrwlayer.c:8732 +msgid "_Insert Points" +msgstr "" + +#: ../src/viktrwlayer.c:8738 +msgid "Insert Point _Before Selected Point" +msgstr "" + +#: ../src/viktrwlayer.c:8745 +msgid "Insert Point _After Selected Point" +msgstr "" + +#: ../src/viktrwlayer.c:8754 +msgid "Delete Poi_nts" +msgstr "" + +#: ../src/viktrwlayer.c:8760 +msgid "Delete _Selected Point" +msgstr "" + +#: ../src/viktrwlayer.c:8768 +msgid "Delete Points With The Same _Position" +msgstr "" + +#: ../src/viktrwlayer.c:8773 +msgid "Delete Points With The Same _Time" +msgstr "" + +#: ../src/viktrwlayer.c:8780 ../src/viktrwlayer.c:9029 +msgid "_Transform" +msgstr "" + +#: ../src/viktrwlayer.c:8788 ../src/viktrwlayer.c:9037 +msgid "_Apply DEM Data" +msgstr "DEM adatok _alkalmazása" + +#: ../src/viktrwlayer.c:8793 ../src/viktrwlayer.c:9042 +msgid "_Overwrite" +msgstr "" + +#: ../src/viktrwlayer.c:8796 ../src/viktrwlayer.c:9045 +msgid "Overwrite any existing elevation values with DEM values" +msgstr "" + +#: ../src/viktrwlayer.c:8799 ../src/viktrwlayer.c:9048 +msgid "_Keep Existing" +msgstr "" + +#: ../src/viktrwlayer.c:8802 ../src/viktrwlayer.c:9051 +msgid "Keep existing elevation values, only attempt for missing values" +msgstr "" + +#: ../src/viktrwlayer.c:8807 +msgid "_Smooth Missing Elevation Data" +msgstr "" + +#: ../src/viktrwlayer.c:8812 +msgid "_Interpolated" +msgstr "" + +#: ../src/viktrwlayer.c:8815 +msgid "" +"Interpolate between known elevation values to derive values for the missing " +"elevations" +msgstr "" + +#: ../src/viktrwlayer.c:8818 +msgid "_Flat" +msgstr "" + +#: ../src/viktrwlayer.c:8821 +msgid "Set unknown elevation values to the last known value" +msgstr "" + +#: ../src/viktrwlayer.c:8825 +msgid "C_onvert to a Route" +msgstr "" + +#: ../src/viktrwlayer.c:8827 +msgid "C_onvert to a Track" +msgstr "" + +#: ../src/viktrwlayer.c:8835 +msgid "_Anonymize Times" +msgstr "" + +#: ../src/viktrwlayer.c:8838 +msgid "Shift timestamps to a relative offset from 1901-01-01" +msgstr "" + +#: ../src/viktrwlayer.c:8841 +msgid "_Interpolate Times" +msgstr "" + +#: ../src/viktrwlayer.c:8844 +msgid "" +"Reset trackpoint timestamps between the first and last points such that " +"track is traveled at equal speed" +msgstr "" + +#: ../src/viktrwlayer.c:8849 +msgid "_Reverse Track" +msgstr "" + +#: ../src/viktrwlayer.c:8851 +msgid "_Reverse Route" +msgstr "" + +#: ../src/viktrwlayer.c:8858 +msgid "Refine Route..." +msgstr "" + +#: ../src/viktrwlayer.c:8868 +msgid "Down_load Maps Along Track..." +msgstr "Térképek le_töltése a nyomvonal mentén..." + +#: ../src/viktrwlayer.c:8870 +msgid "Down_load Maps Along Route..." +msgstr "" + +#: ../src/viktrwlayer.c:8878 +msgid "_Export Track as GPX..." +msgstr "" + +#: ../src/viktrwlayer.c:8880 +msgid "_Export Route as GPX..." +msgstr "" + +#: ../src/viktrwlayer.c:8887 +msgid "E_xtend Track End" +msgstr "Nyomvonal végének ki_bővítése" + +#: ../src/viktrwlayer.c:8889 +msgid "E_xtend Route End" +msgstr "" + +#: ../src/viktrwlayer.c:8896 +msgid "Extend _Using Route Finder" +msgstr "" + +#: ../src/viktrwlayer.c:8911 +msgid "_Upload to GPS..." +msgstr "" + +#: ../src/viktrwlayer.c:8926 +msgid "_Diary" +msgstr "" + +#: ../src/viktrwlayer.c:8930 +msgid "Open diary program at this date" +msgstr "" + +#: ../src/viktrwlayer.c:8935 +msgid "_Astronomy" +msgstr "" + +#: ../src/viktrwlayer.c:8938 +msgid "Open astronomy program at this date and location" +msgstr "" + +#: ../src/viktrwlayer.c:8962 +msgid "_View Google Directions" +msgstr "Google útvonaltervező _megjelenítése" + +#: ../src/viktrwlayer.c:8984 +msgid "Use with _Filter" +msgstr "Használat _szűrővel" + +#: ../src/viktrwlayer.c:9018 +msgid "_Edit Trackpoint" +msgstr "" + +#: ../src/viktrwlayer.c:10116 +#, c-format +msgid " - Gain %dm:Loss %dm" +msgstr "" + +#: ../src/viktrwlayer.c:10118 +#, c-format +msgid " - Gain %dft:Loss %dft" +msgstr "" + +#: ../src/viktrwlayer.c:10123 +#, c-format +msgid " - Bearing %3.1f° - Step %s" +msgstr "" + +#: ../src/viktrwlayer.c:10232 +#, c-format +msgid "Querying %s for route between (%.3f, %.3f) and (%.3f, %.3f)." +msgstr "" + +#: ../src/viktrwlayer.c:10248 +#, c-format +msgid "%s returned route between (%.3f, %.3f) and (%.3f, %.3f)." +msgstr "" + +#: ../src/viktrwlayer.c:10251 +#, c-format +msgid "Error getting route from %s." +msgstr "" + +#: ../src/viktrwlayer.c:11070 +#, c-format +msgid "Creating %d Image Thumbnails..." +msgstr "%d kép-miniatűr létrehozása..." + +#: ../src/viktrwlayer.c:11560 +msgid "No map layer in use. Create one first" +msgstr "Nincs térképréteg használatban. Először hozzon létre egyet" + +#: ../src/viktrwlayer.c:11679 +#, c-format +msgid "%s: Track List" +msgstr "" + +#: ../src/viktrwlayer.c:11681 +#, c-format +msgid "%s: Route List" +msgstr "" + +#: ../src/viktrwlayer.c:11734 +#, c-format +msgid "" +"Could not write external layer %s to %s, please fix and save before exiting " +"or data will be lost" +msgstr "" + +#: ../src/viktrwlayer.c:11782 +#, c-format +msgid "WARNING: issues encountered loading external layer %s from %s" +msgstr "" + +#: ../src/viktrwlayer_export.c:47 +msgid "Auto Device GPX Simplify:" +msgstr "" + +#: ../src/viktrwlayer_export.c:48 +msgid "" +"GPX saves to certain devices will be simplified for device compatibility." +msgstr "" + +#: ../src/viktrwlayer_export.c:125 +#, c-format +msgid "Export of GPX file simplified using point limit: %d" +msgstr "" + +#: ../src/viktrwlayer_export.c:206 ../src/viktrwlayer_export.c:323 +#: ../src/vikwindow.c:3694 +msgid "The filename you requested could not be opened for writing." +msgstr "A megadott fájlnév nem nyitható meg olvasásra." + +#: ../src/viktrwlayer_export.c:226 +#, c-format +msgid "Could not launch %s." +msgstr "" + +#: ../src/viktrwlayer_export.c:234 +msgid "Could not create temporary file for export." +msgstr "" + +#: ../src/viktrwlayer_export.c:268 +msgid "File format:" +msgstr "" + +#: ../src/viktrwlayer_export.c:276 +msgid "Select the file format." +msgstr "" + +#: ../src/viktrwlayer_export.c:281 +msgid "" +"Select the information to process.\n" +"Warning: the behavior of these switches is highly dependent of the file " +"format selected.\n" +"Please, refer to GPSbabel if unsure." +msgstr "" + +#: ../src/viktrwlayer_export.c:308 +msgid "You did not select a valid file format." +msgstr "" + +#: ../src/viktrwlayer_propwin.c:915 ../src/viktrwlayer_propwin.c:3381 +#: ../src/viktrwlayer_propwin.c:3417 ../src/viktrwlayer_propwin.c:3457 +#: ../src/viktrwlayer_propwin.c:3509 ../src/viktrwlayer_propwin.c:3527 +#: ../src/viktrwlayer_propwin.c:3600 ../src/viktrwlayer_propwin.c:3601 +#: ../src/viktrwlayer_propwin.c:3602 ../src/viktrwlayer_propwin.c:3611 +#: ../src/viktrwlayer_propwin.c:3612 ../src/viktrwlayer_propwin.c:3629 +#: ../src/viktrwlayer_propwin.c:3630 ../src/viktrwlayer_propwin.c:3644 +#: ../src/viktrwlayer_propwin.c:3645 ../src/viktrwlayer_propwin.c:3646 +#: ../src/viktrwlayer_propwin.c:3660 ../src/viktrwlayer_propwin.c:3661 +#: ../src/viktrwlayer_propwin.c:3662 ../src/viktrwlayer_propwin.c:3676 +#: ../src/viktrwlayer_propwin.c:3677 ../src/viktrwlayer_propwin.c:3678 +#: ../src/viktrwlayer_propwin.c:3695 ../src/viktrwlayer_propwin.c:3696 +#: ../src/viktrwlayer_analysis.c:293 +#, c-format +msgid "No Data" +msgstr "Nincs adat" + +#: ../src/viktrwlayer_propwin.c:960 ../src/viktrwlayer_propwin.c:1245 +#, c-format +msgid "%.1f kph" +msgstr "" + +#: ../src/viktrwlayer_propwin.c:963 ../src/viktrwlayer_propwin.c:1248 +#: ../src/viktrwlayer_analysis.c:352 +#, c-format +msgid "%.1f mph" +msgstr "" + +#: ../src/viktrwlayer_propwin.c:966 ../src/viktrwlayer_propwin.c:1251 +#, c-format +msgid "%.1f knots" +msgstr "" + +#: ../src/viktrwlayer_propwin.c:969 ../src/viktrwlayer_propwin.c:1254 +#, fuzzy, c-format +msgid "%.1f s/km" +msgstr "%s%.1f km %s" + +#: ../src/viktrwlayer_propwin.c:972 ../src/viktrwlayer_propwin.c:1257 +#: ../src/viktrwlayer_analysis.c:389 ../src/viktrwlayer_analysis.c:392 +#, fuzzy, c-format +msgid "%.1f min/km" +msgstr "1 perc" + +#: ../src/viktrwlayer_propwin.c:975 ../src/viktrwlayer_propwin.c:1260 +#, c-format +msgid "%.1f sec/mi" +msgstr "" + +#: ../src/viktrwlayer_propwin.c:978 ../src/viktrwlayer_propwin.c:1263 +#: ../src/viktrwlayer_analysis.c:409 ../src/viktrwlayer_analysis.c:412 +#, fuzzy, c-format +msgid "%.1f min/mi" +msgstr "1 perc" + +#. VIK_UNITS_SPEED_METRES_PER_SECOND: +#: ../src/viktrwlayer_propwin.c:982 ../src/viktrwlayer_propwin.c:1267 +#, c-format +msgid "%.1f m/s" +msgstr "" + +#. Minutes +#: ../src/viktrwlayer_propwin.c:1411 +msgid "mins" +msgstr "" + +#. Hours +#: ../src/viktrwlayer_propwin.c:1418 +msgid "h" +msgstr "" + +#. Days +#: ../src/viktrwlayer_propwin.c:1424 +msgid "d" +msgstr "" + +#. Weeks +#: ../src/viktrwlayer_propwin.c:1429 +msgid "w" +msgstr "" + +#. 'Months' +#: ../src/viktrwlayer_propwin.c:1433 +msgid "M" +msgstr "" + +#: ../src/viktrwlayer_propwin.c:2051 ../src/viktrwlayer_analysis.c:303 +#, c-format +msgid "%.1f miles" +msgstr "" + +#: ../src/viktrwlayer_propwin.c:2054 ../src/viktrwlayer_analysis.c:306 +#, c-format +msgid "%.1f NM" +msgstr "" + +#. VIK_UNITS_DISTANCE_KILOMETRES +#: ../src/viktrwlayer_propwin.c:2057 ../src/viktrwlayer_analysis.c:310 +#, c-format +msgid "%.1f km" +msgstr "" + +#: ../src/viktrwlayer_propwin.c:3083 +msgid "Failed spliting track. Track unchanged" +msgstr "Nyomvonal kettévágása sikertelen. A nyomvonal nem módosult" + +#: ../src/viktrwlayer_propwin.c:3234 ../src/viktrwlayer_propwin.c:3744 +#, c-format +msgid "%s - Track Properties" +msgstr "%s - Nyomvonal tulajdonságai" + +#: ../src/viktrwlayer_propwin.c:3239 +msgid "Split at _Marker" +msgstr "" + +#: ../src/viktrwlayer_propwin.c:3240 +msgid "Split _Segments" +msgstr "" + +#: ../src/viktrwlayer_propwin.c:3241 +msgid "_Reverse" +msgstr "" + +#: ../src/viktrwlayer_propwin.c:3242 +msgid "_Delete Dupl." +msgstr "" + +#: ../src/viktrwlayer_propwin.c:3269 +msgid "Comment:" +msgstr "Megjegyzés:" + +#: ../src/viktrwlayer_propwin.c:3270 +msgid "Description:" +msgstr "" + +#: ../src/viktrwlayer_propwin.c:3271 +#, fuzzy +msgid "Source:" +msgstr "Kezdet:" + +#: ../src/viktrwlayer_propwin.c:3272 +#, fuzzy +msgid "Type:" +msgstr "Idő:" + +#: ../src/viktrwlayer_propwin.c:3273 +msgid "Color:" +msgstr "" + +#: ../src/viktrwlayer_propwin.c:3274 +msgid "Draw Name:" +msgstr "" + +#: ../src/viktrwlayer_propwin.c:3275 +msgid "Distance Labels:" +msgstr "" + +#: ../src/viktrwlayer_propwin.c:3278 +msgid "Track Length:" +msgstr "Nyomvonal hossza:" + +#: ../src/viktrwlayer_propwin.c:3279 +msgid "Trackpoints:" +msgstr "Nyompontok:" + +#: ../src/viktrwlayer_propwin.c:3280 +msgid "Segments:" +msgstr "Szakaszok:" + +#: ../src/viktrwlayer_propwin.c:3281 +msgid "Duplicate Points:" +msgstr "Kettőzött pontok:" + +#: ../src/viktrwlayer_propwin.c:3282 +msgid "Max Speed:" +msgstr "Max. sebesség:" + +#: ../src/viktrwlayer_propwin.c:3283 +msgid "Avg. Speed:" +msgstr "Átlagsebesség:" + +#: ../src/viktrwlayer_propwin.c:3284 +msgid "Moving Avg. Speed:" +msgstr "" + +#: ../src/viktrwlayer_propwin.c:3285 +msgid "Avg. Dist. Between TPs:" +msgstr "Átlagos távolság nyompontok között:" + +#: ../src/viktrwlayer_propwin.c:3286 +msgid "Elevation Range:" +msgstr "Magassági szintkülönbség:" + +#: ../src/viktrwlayer_propwin.c:3287 +msgid "Total Elevation Gain/Loss:" +msgstr "Teljes magassági szintnyereség/-veszteség:" + +#: ../src/viktrwlayer_propwin.c:3288 +msgid "Start:" +msgstr "Kezdet:" + +#: ../src/viktrwlayer_propwin.c:3289 +msgid "End:" +msgstr "Vége:" + +#: ../src/viktrwlayer_propwin.c:3290 +msgid "Duration:" +msgstr "Időtartam:" + +#: ../src/viktrwlayer_propwin.c:3320 +msgid "Centre" +msgstr "" + +#: ../src/viktrwlayer_propwin.c:3321 +msgid "Start only" +msgstr "" + +#: ../src/viktrwlayer_propwin.c:3322 +msgid "End only" +msgstr "" + +#: ../src/viktrwlayer_propwin.c:3323 +msgid "Start and End" +msgstr "" + +#: ../src/viktrwlayer_propwin.c:3324 +msgid "Centre, Start and End" +msgstr "" + +#: ../src/viktrwlayer_propwin.c:3336 +msgid "Maximum number of distance labels to be shown" +msgstr "" + +#: ../src/viktrwlayer_propwin.c:3340 +msgid "Properties" +msgstr "" + +#: ../src/viktrwlayer_propwin.c:3584 +#, c-format +msgid "%d minutes - %d minutes moving" +msgstr "" + +#: ../src/viktrwlayer_propwin.c:3596 +#, c-format +msgid "%s total - %s in segments" +msgstr "" + +#: ../src/viktrwlayer_propwin.c:3607 ../src/viktrwlayer_analysis.c:622 +msgid "Statistics" +msgstr "Statisztika" + +#: ../src/viktrwlayer_propwin.c:3613 ../src/viktrwlayer_propwin.c:3680 +msgid "Show D_EM" +msgstr "" + +#: ../src/viktrwlayer_propwin.c:3615 ../src/viktrwlayer_propwin.c:3631 +#: ../src/viktrwlayer_propwin.c:3647 ../src/viktrwlayer_propwin.c:3697 +msgid "Show _GPS Speed" +msgstr "" + +#: ../src/viktrwlayer_propwin.c:3617 ../src/viktrwlayer_propwin.c:3633 +#: ../src/viktrwlayer_propwin.c:3665 ../src/viktrwlayer_propwin.c:3699 +msgid "Track Distance:" +msgstr "Nyomvonal távolsága:" + +#: ../src/viktrwlayer_propwin.c:3618 ../src/viktrwlayer_propwin.c:3684 +msgid "Track Height:" +msgstr "" + +#: ../src/viktrwlayer_propwin.c:3624 +msgid "Elevation-distance" +msgstr "Magasság-távolság" + +#: ../src/viktrwlayer_propwin.c:3634 +msgid "Track Gradient:" +msgstr "" + +#: ../src/viktrwlayer_propwin.c:3639 +msgid "Gradient-distance" +msgstr "" + +#: ../src/viktrwlayer_propwin.c:3649 ../src/viktrwlayer_propwin.c:3666 +#: ../src/viktrwlayer_propwin.c:3683 +msgid "Track Time:" +msgstr "Nyomvonal időtartama:" + +#: ../src/viktrwlayer_propwin.c:3650 ../src/viktrwlayer_propwin.c:3700 +msgid "Track Speed:" +msgstr "" + +#: ../src/viktrwlayer_propwin.c:3651 ../src/viktrwlayer_propwin.c:3667 +#: ../src/viktrwlayer_propwin.c:3685 +msgid "Time/Date:" +msgstr "" + +#: ../src/viktrwlayer_propwin.c:3655 +msgid "Speed-time" +msgstr "Sebesség-idő" + +#: ../src/viktrwlayer_propwin.c:3663 ../src/viktrwlayer_propwin.c:3679 +msgid "Show S_peed" +msgstr "" + +#: ../src/viktrwlayer_propwin.c:3671 +msgid "Distance-time" +msgstr "" + +#: ../src/viktrwlayer_propwin.c:3690 +msgid "Elevation-time" +msgstr "" + +#: ../src/viktrwlayer_propwin.c:3705 +msgid "Speed-distance" +msgstr "" + +#: ../src/viktrwlayer_tpwin.c:190 ../src/viktrwlayer_wpwin.c:66 +msgid "Date/Time Edit" +msgstr "" + +#: ../src/viktrwlayer_tpwin.c:242 +msgid "Name:" +msgstr "" + +#: ../src/viktrwlayer_tpwin.c:243 +msgid "Latitude:" +msgstr "Földrajzi szélesség:" + +#: ../src/viktrwlayer_tpwin.c:244 +msgid "Longitude:" +msgstr "Földrajzi hosszúság:" + +#: ../src/viktrwlayer_tpwin.c:245 +msgid "Altitude:" +msgstr "Tengerszint feletti magasság:" + +#: ../src/viktrwlayer_tpwin.c:246 +msgid "Course:" +msgstr "" + +#: ../src/viktrwlayer_tpwin.c:247 +msgid "Timestamp:" +msgstr "Időbélyeg:" + +#: ../src/viktrwlayer_tpwin.c:248 +msgid "Time:" +msgstr "Idő:" + +#: ../src/viktrwlayer_tpwin.c:249 +msgid "Distance Difference:" +msgstr "Távolság eltérése:" + +#: ../src/viktrwlayer_tpwin.c:250 +msgid "Time Difference:" +msgstr "Idő eltérése:" + +#: ../src/viktrwlayer_tpwin.c:251 +msgid "\"Speed\" Between:" +msgstr "\"Sebesség\" közötte:" + +#: ../src/viktrwlayer_tpwin.c:252 +msgid "Speed:" +msgstr "" + +#: ../src/viktrwlayer_tpwin.c:253 +msgid "VDOP:" +msgstr "VDOP:" + +#: ../src/viktrwlayer_tpwin.c:254 +msgid "HDOP:" +msgstr "HDOP:" + +#: ../src/viktrwlayer_tpwin.c:255 +msgid "PDOP:" +msgstr "PDOP:" + +#: ../src/viktrwlayer_tpwin.c:256 +msgid "SAT/FIX:" +msgstr "SAT/FIX:" + +#: ../src/viktrwlayer_tpwin.c:263 ../src/viktrwlayer_tpwin.c:408 +#: ../src/viktrwlayer_tpwin.c:622 +msgid "Trackpoint" +msgstr "Nyompont" + +#: ../src/viktrwlayer_tpwin.c:266 +msgid "_Insert After" +msgstr "_Beszúrás utána" + +#: ../src/viktrwlayer_tpwin.c:268 +msgid "Split Here" +msgstr "Kettévágás itt" + +#: ../src/viktrwlayer_tracklist.c:262 ../src/viktrwlayer_waypointlist.c:306 +msgid "_Copy Data" +msgstr "" + +#. +#. item = gtk_image_menu_item_new_with_mnemonic ( _("_Select") ); +#. gtk_image_menu_item_set_image ( (GtkImageMenuItem*)item, gtk_image_new_from_stock (GTK_STOCK_FIND, GTK_ICON_SIZE_MENU) ); +#. g_signal_connect_swapped ( G_OBJECT(item), "activate", G_CALLBACK(trw_layer_track_select), values ); +#. gtk_menu_shell_append (GTK_MENU_SHELL (menu), item); +#. gtk_widget_show ( item ); +#. +#. ATM view auto selects, so don't bother with separate select menu entry +#. +#. item = gtk_image_menu_item_new_with_mnemonic ( _("_Select") ); +#. gtk_image_menu_item_set_image ( (GtkImageMenuItem*)item, gtk_image_new_from_stock (GTK_STOCK_FIND, GTK_ICON_SIZE_MENU) ); +#. g_signal_connect_swapped ( G_OBJECT(item), "activate", G_CALLBACK(trw_layer_waypoint_select), values ); +#. gtk_menu_shell_append (GTK_MENU_SHELL (menu), item); +#. gtk_widget_show ( item ); +#. +#. AUTO SELECT NOT TRUE YET... +#. ATM view auto selects, so don't bother with separate select menu entry +#: ../src/viktrwlayer_tracklist.c:290 ../src/viktrwlayer_waypointlist.c:341 +#: ../src/vikwindow.c:4816 +msgid "_View" +msgstr "_Nézet" + +#. Insert column for the layer name when viewing multi layers +#: ../src/viktrwlayer_tracklist.c:613 ../src/viktrwlayer_waypointlist.c:609 +msgid "Layer" +msgstr "" + +#: ../src/viktrwlayer_tracklist.c:627 ../src/viktrwlayer_waypointlist.c:624 +msgid "Date" +msgstr "" + +#: ../src/viktrwlayer_tracklist.c:631 ../src/viktrwlayer_waypointlist.c:628 +msgid "Visible" +msgstr "" + +#: ../src/viktrwlayer_tracklist.c:639 +msgid "" +"Distance\n" +"(miles)" +msgstr "" + +#: ../src/viktrwlayer_tracklist.c:642 +msgid "" +"Distance\n" +"(NM)" +msgstr "" + +#: ../src/viktrwlayer_tracklist.c:645 +msgid "" +"Distance\n" +"(km)" +msgstr "" + +#: ../src/viktrwlayer_tracklist.c:651 +msgid "" +"Length\n" +"(minutes)" +msgstr "" + +#: ../src/viktrwlayer_tracklist.c:660 ../src/vikutils.c:93 +msgid "sec/mi" +msgstr "" + +#: ../src/viktrwlayer_tracklist.c:666 +#, c-format +msgid "" +"Av. Speed\n" +"(%s)" +msgstr "" + +#. Apply own formatting of the data +#: ../src/viktrwlayer_tracklist.c:671 +#, c-format +msgid "" +"Max Speed\n" +"(%s)" +msgstr "" + +#: ../src/viktrwlayer_tracklist.c:679 ../src/viktrwlayer_waypointlist.c:637 +msgid "" +"Max Height\n" +"(Feet)" +msgstr "" + +#: ../src/viktrwlayer_tracklist.c:681 ../src/viktrwlayer_waypointlist.c:639 +msgid "" +"Max Height\n" +"(Metres)" +msgstr "" + +#: ../src/viktrwlayer_waypointlist.c:312 +msgid "Copy Data (with _positions)" +msgstr "" + +#: ../src/viktrwlayer_waypointlist.c:633 +msgid "Comment" +msgstr "" + +#: ../src/viktrwlayer_waypointlist.c:643 +msgid "Symbol" +msgstr "" + +#: ../src/viktrwlayer_wpwin.c:93 ../src/viktrwlayer_wpwin.c:302 +msgid "True" +msgstr "" + +#: ../src/viktrwlayer_wpwin.c:122 +msgid "Waypoint Properties" +msgstr "Útpont tulajdonságai" + +#: ../src/viktrwlayer_wpwin.c:164 +msgid "Name:" +msgstr "Név:" + +#: ../src/viktrwlayer_wpwin.c:181 +msgid "Altitude:" +msgstr "Magasság:" + +#: ../src/viktrwlayer_wpwin.c:186 ../src/viktrwlayer_wpwin.c:188 +msgid "Comment:" +msgstr "Megjegyzés:" + +#: ../src/viktrwlayer_wpwin.c:202 +#, fuzzy +msgid "Source:" +msgstr "Forrás letöltése:" + +#: ../src/viktrwlayer_wpwin.c:212 +msgid "Image:" +msgstr "Kép:" + +#: ../src/viktrwlayer_wpwin.c:217 +msgid "Symbol:" +msgstr "Szimbólum:" + +#: ../src/viktrwlayer_wpwin.c:226 +msgid "(none)" +msgstr "(nincs)" + +#. Geotag Info [readonly] +#: ../src/viktrwlayer_wpwin.c:272 +msgid "Has Geotag" +msgstr "" + +#: ../src/viktrwlayer_wpwin.c:279 +msgid "Consistent Position" +msgstr "" + +#. ATM the direction value box is always shown, even when there is no information. +#. It would be nice to be able to hide it until the 'Add' has been performed, +#. however I've not been able to achieve this. +#. Thus simply sensistizing it instead. +#: ../src/viktrwlayer_wpwin.c:292 +#, fuzzy +msgid "Image Direction:" +msgstr "Képbeállítások" + +#: ../src/viktrwlayer_wpwin.c:300 +msgid "Magnetic" +msgstr "" + +#: ../src/viktrwlayer_wpwin.c:320 +msgid "Time:" +msgstr "" + +#. TODO: other checks (isalpha or whatever ) +#: ../src/viktrwlayer_wpwin.c:386 +msgid "Please enter a name for the waypoint." +msgstr "Adjon meg egy nevet az útpontnak." + +#: ../src/viktrwlayer_geotag.c:320 ../src/viktrwlayer_geotag.c:460 +#, c-format +msgid "Failed updating EXIF on %s" +msgstr "" + +#: ../src/viktrwlayer_geotag.c:562 +#, c-format +msgid "Geotagging %d Images..." +msgstr "" + +#: ../src/viktrwlayer_geotag.c:630 +msgid "Geotag Images" +msgstr "" + +#: ../src/viktrwlayer_geotag.c:640 +msgid "Images" +msgstr "" + +#: ../src/viktrwlayer_geotag.c:645 +msgid "Overwrite Existing Waypoints:" +msgstr "" + +#: ../src/viktrwlayer_geotag.c:648 +msgid "Overwrite Existing GPS Information:" +msgstr "" + +#: ../src/viktrwlayer_geotag.c:650 +msgid "Keep File Modification Timestamp:" +msgstr "" + +#: ../src/viktrwlayer_geotag.c:684 +msgid "Create Waypoints:" +msgstr "" + +#: ../src/viktrwlayer_geotag.c:693 +msgid "Write EXIF:" +msgstr "" + +#: ../src/viktrwlayer_geotag.c:705 +msgid "Automatic Image Direction:" +msgstr "" + +#: ../src/viktrwlayer_geotag.c:707 +msgid "Set image direction based on a heading derived from the track" +msgstr "" + +#: ../src/viktrwlayer_geotag.c:710 +msgid "Interpolate Between Track Segments:" +msgstr "" + +#: ../src/viktrwlayer_geotag.c:715 +msgid "Image Time Offset (Seconds):" +msgstr "" + +#: ../src/viktrwlayer_geotag.c:718 +msgid "" +"The number of seconds to ADD to the photos time to make it match the GPS " +"data. Calculate this with (GPS - Photo). Can be negative or positive. Useful " +"to adjust times when a camera's timestamp was incorrect." +msgstr "" + +#: ../src/viktrwlayer_geotag.c:721 +msgid "Image Timezone:" +msgstr "" + +#: ../src/viktrwlayer_geotag.c:724 +msgid "" +"The timezone that was used when the images were created. For example, if a " +"camera is set to AWST or +8:00 hours. Enter +8:00 here so that the correct " +"adjustment to the images' time can be made. GPS data is always in UTC." +msgstr "" + +#: ../src/viktrwlayer_geotag.c:728 +#, c-format +msgid "Using waypoint: %s" +msgstr "" + +#: ../src/viktrwlayer_geotag.c:742 +#, c-format +msgid "Using track: %s" +msgstr "" + +#: ../src/viktrwlayer_geotag.c:744 +#, c-format +msgid "Using all tracks in: %s" +msgstr "" + +#: ../src/viktrwlayer_analysis.c:214 +msgid "Number of Tracks" +msgstr "" + +#: ../src/viktrwlayer_analysis.c:215 +msgid "Date Range" +msgstr "" + +#: ../src/viktrwlayer_analysis.c:216 +msgid "Total Length" +msgstr "" + +#: ../src/viktrwlayer_analysis.c:217 +msgid "Average Length" +msgstr "" + +#: ../src/viktrwlayer_analysis.c:218 +msgid "Eddington number" +msgstr "" + +#. No.4: Extended display only +#: ../src/viktrwlayer_analysis.c:219 +msgid "Max Speed" +msgstr "" + +#: ../src/viktrwlayer_analysis.c:220 +msgid "Avg. Speed" +msgstr "" + +#: ../src/viktrwlayer_analysis.c:221 +msgid "Minimum Altitude" +msgstr "" + +#: ../src/viktrwlayer_analysis.c:222 +msgid "Maximum Altitude" +msgstr "" + +#: ../src/viktrwlayer_analysis.c:223 +msgid "Total Elevation Gain/Loss" +msgstr "" + +#: ../src/viktrwlayer_analysis.c:224 +msgid "Avg. Elevation Gain/Loss" +msgstr "" + +#: ../src/viktrwlayer_analysis.c:225 +msgid "Total Duration" +msgstr "" + +#: ../src/viktrwlayer_analysis.c:226 +msgid "Avg. Duration" +msgstr "" + +#: ../src/viktrwlayer_analysis.c:317 +#, c-format +msgid "%.2f miles" +msgstr "" + +#: ../src/viktrwlayer_analysis.c:320 +#, c-format +msgid "%.2f NM" +msgstr "" + +#. VIK_UNITS_DISTANCE_KILOMETRES +#: ../src/viktrwlayer_analysis.c:324 +#, c-format +msgid "%.2f km" +msgstr "" + +#: ../src/viktrwlayer_analysis.c:361 +#, c-format +msgid "%.2f m/s" +msgstr "" + +#: ../src/viktrwlayer_analysis.c:370 ../src/viktrwlayer_analysis.c:373 +#, c-format +msgid "%.2f knots" +msgstr "" + +#: ../src/viktrwlayer_analysis.c:379 ../src/viktrwlayer_analysis.c:382 +#, c-format +msgid "%d s/km" +msgstr "" + +#: ../src/viktrwlayer_analysis.c:399 ../src/viktrwlayer_analysis.c:402 +#, c-format +msgid "%d sec/mi" +msgstr "" + +#: ../src/viktrwlayer_analysis.c:420 ../src/viktrwlayer_analysis.c:423 +#, c-format +msgid "%.2f km/h" +msgstr "" + +#: ../src/viktrwlayer_analysis.c:434 ../src/viktrwlayer_analysis.c:440 +#, c-format +msgid "%d feet" +msgstr "" + +#: ../src/viktrwlayer_analysis.c:445 ../src/viktrwlayer_analysis.c:447 +#, c-format +msgid "%d feet / %d feet" +msgstr "" + +#: ../src/viktrwlayer_analysis.c:452 ../src/viktrwlayer_analysis.c:458 +#, c-format +msgid "%d m" +msgstr "" + +#: ../src/viktrwlayer_analysis.c:463 ../src/viktrwlayer_analysis.c:465 +#, c-format +msgid "%d m / %d m" +msgstr "" + +#: ../src/viktrwlayer_analysis.c:477 +#, c-format +msgid "%d:%02d:%02d days:hrs:mins" +msgstr "" + +#: ../src/viktrwlayer_analysis.c:484 +#, c-format +msgid "%d:%02d hrs:mins" +msgstr "" + +#: ../src/viktrwlayer_analysis.c:658 +msgid "Include Invisible Items" +msgstr "" + +#: ../src/vikstatus.c:129 +msgid "Current number of background tasks. Click to see the background jobs." +msgstr "" + +#: ../src/vikstatus.c:134 +msgid "Current zoom level. Click to select a new one." +msgstr "" + +#: ../src/vikstatus.c:141 +msgid "Left click to clear the message. Right click to copy the message." +msgstr "" + +#: ../src/vikutils.c:108 +msgid "GPSD" +msgstr "" + +#. GPS Preamble +#: ../src/vikutils.c:109 +msgid "Trkpt" +msgstr "" + +#: ../src/vikutils.c:160 +#, c-format +msgid "%sSpeed%s %.1f%s" +msgstr "" + +#. Go for 2dp as expect low values for vertical speeds +#: ../src/vikutils.c:214 +#, c-format +msgid "%sClimb%s %.2f%s" +msgstr "" + +#: ../src/vikutils.c:223 +#, c-format +msgid "%sAlt %dfeet" +msgstr "" + +#. VIK_UNITS_HEIGHT_METRES: +#: ../src/vikutils.c:227 +#, c-format +msgid "%sAlt %dm" +msgstr "" + +#: ../src/vikutils.c:235 +#, c-format +msgid "%sCourse %03d°" +msgstr "" + +#: ../src/vikutils.c:249 +msgid "yards" +msgstr "" + +#. VIK_UNITS_DISTANCE_KILOMETRES: +#: ../src/vikutils.c:253 +msgid "m" +msgstr "" + +#: ../src/vikutils.c:257 +#, c-format +msgid "%sDistance diff %d%s" +msgstr "" + +#: ../src/vikutils.c:272 +#, c-format +msgid "%sTime %s" +msgstr "" + +#: ../src/vikutils.c:281 +#, c-format +msgid "%sTime diff %lds" +msgstr "" + +#: ../src/vikutils.c:287 +#, c-format +msgid "%sNo. of Sats %d" +msgstr "" + +#: ../src/vikutils.c:312 +#, c-format +msgid "%sTo End %.2f%s" +msgstr "" + +#: ../src/vikutils.c:339 +#, c-format +msgid "%sDistance along %.2f%s" +msgstr "" + +#: ../src/vikutils.c:359 +#, c-format +msgid "%sTrack: %s" +msgstr "" + +#: ../src/vikutils.c:396 +#, c-format +msgid "" +"There is a newer version of Viking available: %s\n" +"\n" +"Do you wish to go to Viking's website now?" +msgstr "" + +#: ../src/vikutils.c:526 +msgid "" +"This appears to be Viking's very first run.\n" +"\n" +"Do you wish to enable automatic internet features?\n" +"\n" +"Individual settings can be controlled in the Preferences." +msgstr "" + +#: ../src/vikwaypoint.c:37 +msgid "Waypoint" +msgstr "" + +#: ../src/vikwebtool_datasource.c:352 +msgid "Search Term" +msgstr "" + +#. TODO get rid of this as this is unnecessary duplication... +#: ../src/vikwindow.c:258 +msgid "Pan" +msgstr "Elmozdítás" + +#: ../src/vikwindow.c:258 +msgid "Zoom" +msgstr "Nagyítás" + +#: ../src/vikwindow.c:258 +msgid "Ruler" +msgstr "Vonalzó" + +#: ../src/vikwindow.c:258 +msgid "Select" +msgstr "" + +#: ../src/vikwindow.c:368 +msgid "This is Viking " +msgstr "" + +#: ../src/vikwindow.c:457 +msgid "Location lookup aborted" +msgstr "" + +#: ../src/vikwindow.c:477 +#, c-format +msgid "Location found: %s" +msgstr "" + +#: ../src/vikwindow.c:486 +msgid "Unable to determine location" +msgstr "" + +#: ../src/vikwindow.c:495 +msgid "Determining location" +msgstr "" + +#: ../src/vikwindow.c:525 +#, c-format +msgid "Location found via geoclue" +msgstr "" + +#: ../src/vikwindow.c:546 +msgid "Default Map" +msgstr "" + +#: ../src/vikwindow.c:557 ../src/vikwindow.c:3938 +msgid "Trying to determine location..." +msgstr "" + +#. Create tooltip +#: ../src/vikwindow.c:723 +msgid "Select zoom level" +msgstr "" + +#: ../src/vikwindow.c:1176 +#, c-format +msgid "" +"Do you want to save the changes you made to the document \"%s\"?\n" +"\n" +"Your changes will be lost if you don't save them." +msgstr "" +"Szeretné menteni a(z) \"%s\" dokumentum módosításait?\n" +"\n" +"Módosításai elvesznek, ha nem menti el azokat." + +#: ../src/vikwindow.c:1180 +msgid "Don't Save" +msgstr "Ne mentse" + +#: ../src/vikwindow.c:1268 +msgid "mpp" +msgstr "mpp" + +#: ../src/vikwindow.c:1268 +msgid "pixelfact" +msgstr "pixelfact" + +#: ../src/vikwindow.c:1467 +#, c-format +msgid "%s %s %dm" +msgstr "%s %s %dm" + +#: ../src/vikwindow.c:1469 +#, c-format +msgid "%s %s %dft" +msgstr "%s %s %dft" + +#: ../src/vikwindow.c:1472 +#, c-format +msgid "%s %s" +msgstr "%s %s" + +#: ../src/vikwindow.c:1929 +msgid "_Ruler" +msgstr "_Vonalzó" + +#: ../src/vikwindow.c:1929 +msgid "Ruler Tool" +msgstr "Vonalzó eszköz" + +#: ../src/vikwindow.c:2204 ../src/vikwindow.c:4818 +msgid "_Zoom" +msgstr "Na_gyítási szint" + +#: ../src/vikwindow.c:2204 +msgid "Zoom Tool" +msgstr "Nagyító eszköz" + +#: ../src/vikwindow.c:2271 ../src/vikwindow.c:4819 +msgid "_Pan" +msgstr "_Mozgatás" + +#: ../src/vikwindow.c:2271 +msgid "Pan Tool" +msgstr "Mozgató eszköz" + +#: ../src/vikwindow.c:2425 +msgid "_Select" +msgstr "" + +#: ../src/vikwindow.c:2425 +msgid "Select Tool" +msgstr "" + +#: ../src/vikwindow.c:2615 +msgid "You must select a layer to show its properties." +msgstr "Ki kell választania egy réteget tulajdonságai megtekintéséhez." + +#. No error to show, so unlikely this will get called +#: ../src/vikwindow.c:2629 +msgid "The help system is not available." +msgstr "" + +#. Main error path +#: ../src/vikwindow.c:2632 +#, c-format +msgid "" +"Help is not available because: %s.\n" +"Ensure a Mime Type ghelp handler program is installed (e.g. yelp)." +msgstr "" + +#: ../src/vikwindow.c:2865 +msgid "You must select a layer to delete." +msgstr "A törléshez ki kell választania egy réteget" + +#: ../src/vikwindow.c:3171 +msgid "Untitled" +msgstr "Névtelen" + +#: ../src/vikwindow.c:3300 +#, c-format +msgid "Unable to add '%s' to the list of recently used documents" +msgstr "" +"A(z) \"%s\" nem adható hozzá a legutóbb megnyitott dokumentumok listájához." + +#: ../src/vikwindow.c:3391 +msgid "The file you requested could not be opened." +msgstr "A megadott fájl nem nyitható meg." + +#: ../src/vikwindow.c:3394 +msgid "" +"GPSBabel is required to load files of this type or GPSBabel encountered " +"problems." +msgstr "" + +#: ../src/vikwindow.c:3397 +#, c-format +msgid "Unable to load malformed GPX file %s" +msgstr "" + +#: ../src/vikwindow.c:3400 +#, c-format +msgid "Unsupported file type for %s" +msgstr "" + +#. Since we can process .vik files with issues just show a warning in the status bar +#. Not that a user can do much about it... or tells them what this issue is yet... +#: ../src/vikwindow.c:3406 +#, c-format +msgid "WARNING: issues encountered loading %s" +msgstr "" + +#: ../src/vikwindow.c:3489 +msgid "Please select a GPS data file to open. " +msgstr "A megnyitáshoz válasszon egy GPS adatfájlt. " + +#: ../src/vikwindow.c:3508 +msgid "Google Earth" +msgstr "" + +#: ../src/vikwindow.c:3523 ../src/vikwindow.c:3646 ../src/viking.desktop.in.h:1 +msgid "Viking" +msgstr "Viking" + +#: ../src/vikwindow.c:3594 ../src/vikwindow.c:4632 +msgid "Open File" +msgstr "" + +#: ../src/vikwindow.c:3630 +msgid "Save as Viking File." +msgstr "Mentés mint Viking fájl." + +#: ../src/vikwindow.c:3757 +#, c-format +msgid "Exporting to file: %s" +msgstr "" + +#. Confirm what happened. +#: ../src/vikwindow.c:3774 +#, c-format +msgid "Exported files: %d" +msgstr "" + +#: ../src/vikwindow.c:3786 +msgid "Nothing to Export!" +msgstr "" + +#: ../src/vikwindow.c:3790 +msgid "Export to directory" +msgstr "" + +#: ../src/vikwindow.c:3809 +msgid "Could not convert all files" +msgstr "" + +#: ../src/vikwindow.c:3851 +msgid "File not accessible" +msgstr "" + +#: ../src/vikwindow.c:3854 +msgid "No Viking File" +msgstr "" + +#: ../src/vikwindow.c:3998 +msgid "This layer has no configurable properties." +msgstr "" + +#: ../src/vikwindow.c:4080 +msgid "Are you sure you wish to delete all layers?" +msgstr "Biztosan törölni szeretné az összes réteget?" + +#. Try harder... +#: ../src/vikwindow.c:4126 ../src/vikwindow.c:4132 +msgid "Generating image file..." +msgstr "" + +#: ../src/vikwindow.c:4154 +msgid "" +"Failed to generate internal image.\n" +"\n" +"Try creating a smaller image." +msgstr "" + +#: ../src/vikwindow.c:4175 +msgid "Image file generated." +msgstr "" + +#: ../src/vikwindow.c:4177 +msgid "Failed to generate image file." +msgstr "" + +#: ../src/vikwindow.c:4246 +#, c-format +msgid "Unable to write to file %s: %s" +msgstr "" + +#: ../src/vikwindow.c:4284 +msgid "" +"Viewable region outside allowable pixel size bounds for image. Clipping " +"width/height values." +msgstr "" +"A látható terület meghaladja a képhez megengedett pixelméret határait. " +"Szélesség/magasság értékek csökkentése." + +#: ../src/vikwindow.c:4309 +#, c-format +msgid "Total area: %ldm x %ldm (%.3f sq. km)" +msgstr "Teljes terület: %ldm x %ldm (%.3f négyzetkm)" + +#: ../src/vikwindow.c:4312 +#, c-format +msgid "Total area: %ldm x %ldm (%.3f sq. miles)" +msgstr "Total area: %ldm x %ldm (%.3f négyzetmérföld)" + +#: ../src/vikwindow.c:4315 +#, c-format +msgid "Total area: %ldm x %ldm (%.3f sq. NM)" +msgstr "" + +#. Single file +#: ../src/vikwindow.c:4343 +msgid "Save Image" +msgstr "Kép mentése" + +#: ../src/vikwindow.c:4364 ../src/vikwindow.c:4641 +msgid "KMZ" +msgstr "" + +#: ../src/vikwindow.c:4417 +msgid "You must be in UTM mode to use this feature" +msgstr "A funkció használatához UTM módban kell lennie" + +#: ../src/vikwindow.c:4421 +msgid "Choose a directory to hold images" +msgstr "Válasszon egy könyvtárat a képek tárolásához" + +#. todo: default for answers inside VikWindow or static (thruout instance) +#: ../src/vikwindow.c:4441 +msgid "Save to Image File" +msgstr "Mentés képfájlba" + +#: ../src/vikwindow.c:4457 +msgid "Width (pixels):" +msgstr "Szélesség (képpont):" + +#: ../src/vikwindow.c:4459 +msgid "Height (pixels):" +msgstr "Magasság (képpont):" + +#: ../src/vikwindow.c:4462 +msgid "" +"WARNING: USING LARGE IMAGES OVER 10000x10000\n" +"MAY CRASH THE PROGRAM!" +msgstr "" + +#: ../src/vikwindow.c:4464 +msgid "Zoom (meters per pixel):" +msgstr "Nagyítás (méter/képpont):" + +#: ../src/vikwindow.c:4480 +msgid "Area in current viewable window" +msgstr "Terület a jelenleg látható ablakban" + +#: ../src/vikwindow.c:4490 +msgid "Save as PNG" +msgstr "Mentés mint PNG" + +#: ../src/vikwindow.c:4491 +msgid "Save as JPEG" +msgstr "Mentés mint JPEG" + +#: ../src/vikwindow.c:4520 +msgid "East-west image tiles:" +msgstr "Kelet-nyugat képcsempék:" + +#: ../src/vikwindow.c:4522 +msgid "North-south image tiles:" +msgstr "Észak-dél képcsempék:" + +#: ../src/vikwindow.c:4619 +msgid "This feature is not available in UTM mode" +msgstr "" + +#: ../src/vikwindow.c:4658 +#, c-format +msgid "Unable to import %s." +msgstr "" + +#: ../src/vikwindow.c:4749 +msgid "Choose a background color" +msgstr "Háttérszín választása" + +#: ../src/vikwindow.c:4765 +msgid "Choose a track highlight color" +msgstr "" + +#: ../src/vikwindow.c:4814 +msgid "_File" +msgstr "_Fájl" + +#: ../src/vikwindow.c:4815 +msgid "_Edit" +msgstr "S_zerkesztés" + +#: ../src/vikwindow.c:4817 +msgid "_Show" +msgstr "_Megjelenítés" + +#: ../src/vikwindow.c:4820 +msgid "_Layers" +msgstr "_Rétegek" + +#: ../src/vikwindow.c:4821 +msgid "_Tools" +msgstr "_Eszközök" + +#: ../src/vikwindow.c:4822 +msgid "_Webtools" +msgstr "_Webes eszközök" + +#: ../src/vikwindow.c:4823 ../src/vikwindow.c:4893 +msgid "_Help" +msgstr "_Súgó" + +#: ../src/vikwindow.c:4825 +msgid "New file" +msgstr "Új fájl" + +#: ../src/vikwindow.c:4826 +msgid "_Open..." +msgstr "_Megnyitás..." + +#: ../src/vikwindow.c:4826 +msgid "Open a file" +msgstr "Fájl megnyitása" + +#: ../src/vikwindow.c:4827 +msgid "Open _Recent File" +msgstr "_Legutóbbi fájl megnyitása" + +#: ../src/vikwindow.c:4828 +msgid "Append _File..." +msgstr "_Fájl hozzáfűzése..." + +#: ../src/vikwindow.c:4828 +msgid "Append data from a different file" +msgstr "Adatok hozzáfűzése egy másik fájlból" + +#: ../src/vikwindow.c:4829 +msgid "Open GPX as External _Layer..." +msgstr "" + +#: ../src/vikwindow.c:4829 +msgid "Open a GPX file as an external layer" +msgstr "" + +#: ../src/vikwindow.c:4830 +msgid "_Export All" +msgstr "" + +#: ../src/vikwindow.c:4830 +msgid "Export All TrackWaypoint Layers" +msgstr "" + +#: ../src/vikwindow.c:4831 +msgid "_GPX..." +msgstr "" + +#: ../src/vikwindow.c:4831 +msgid "Export as GPX" +msgstr "" + +#: ../src/vikwindow.c:4832 +msgid "A_cquire" +msgstr "_Beszerzés" + +#: ../src/vikwindow.c:4833 +msgid "_Directions..." +msgstr "" + +#: ../src/vikwindow.c:4833 +msgid "Get driving directions" +msgstr "" + +#: ../src/vikwindow.c:4835 +msgid "_OSM Traces..." +msgstr "" + +#: ../src/vikwindow.c:4835 +msgid "Get traces from OpenStreetMap" +msgstr "" + +#: ../src/vikwindow.c:4836 +msgid "_My OSM Traces..." +msgstr "" + +#: ../src/vikwindow.c:4836 +msgid "Get Your Own Traces from OpenStreetMap" +msgstr "" + +#: ../src/vikwindow.c:4839 +msgid "Geo_caches..." +msgstr "Geo_ládák..." + +#: ../src/vikwindow.c:4839 +msgid "Get Geocaches from geocaching.com" +msgstr "Geoládák lekérése a geocaching.com webhelyről" + +#: ../src/vikwindow.c:4842 +msgid "Create waypoints from geotagged images" +msgstr "" + +#: ../src/vikwindow.c:4844 +msgid "Get a file from a URL" +msgstr "" + +#: ../src/vikwindow.c:4846 +msgid "Create waypoints from Wikipedia items in the current view" +msgstr "" + +#: ../src/vikwindow.c:4848 +msgid "_Save" +msgstr "M_entés" + +#: ../src/vikwindow.c:4848 +msgid "Save the file" +msgstr "A fájl mentése" + +#: ../src/vikwindow.c:4849 +msgid "Save _As..." +msgstr "Men_tés másként..." + +#: ../src/vikwindow.c:4849 +msgid "Save the file under different name" +msgstr "A fájl mentése más néven" + +#: ../src/vikwindow.c:4850 +msgid "Properties..." +msgstr "" + +#: ../src/vikwindow.c:4850 +msgid "File Properties" +msgstr "" + +#: ../src/vikwindow.c:4852 +msgid "Import KMZ _Map File..." +msgstr "" + +#: ../src/vikwindow.c:4852 +msgid "Import a KMZ file" +msgstr "" + +#: ../src/vikwindow.c:4853 +msgid "Generate _KMZ Map File..." +msgstr "" + +#: ../src/vikwindow.c:4853 +msgid "Generate a KMZ file with an overlay of the current view" +msgstr "" + +#: ../src/vikwindow.c:4855 +msgid "_Generate Image File..." +msgstr "Képfájl _generálása..." + +#: ../src/vikwindow.c:4855 +msgid "Save a snapshot of the workspace into a file" +msgstr "Pillanatkép mentése a munkaterületről fájlba" + +#: ../src/vikwindow.c:4856 +msgid "Generate _Directory of Images..." +msgstr "Ké_pek könyvtárának generálása..." + +#: ../src/vikwindow.c:4856 +msgid "Generate _Directory of Images" +msgstr "" + +#: ../src/vikwindow.c:4857 +msgid "_Print..." +msgstr "_Nyomtatás..." + +#: ../src/vikwindow.c:4857 +msgid "Print maps" +msgstr "Térkép nyomtatása" + +#: ../src/vikwindow.c:4858 +msgid "E_xit" +msgstr "_Kilépés" + +#: ../src/vikwindow.c:4858 +msgid "Exit the program" +msgstr "Kilépés a programból" + +#: ../src/vikwindow.c:4859 +msgid "Save and Exit" +msgstr "Mentés és kilépés" + +#: ../src/vikwindow.c:4859 +msgid "Save and Exit the program" +msgstr "Mentés és kilépés a programból" + +#: ../src/vikwindow.c:4861 +msgid "Go to the Pre_vious Location" +msgstr "" + +#: ../src/vikwindow.c:4861 +msgid "Go to the previous location" +msgstr "" + +#: ../src/vikwindow.c:4862 +msgid "Go to the _Next Location" +msgstr "" + +#: ../src/vikwindow.c:4862 +msgid "Go to the next location" +msgstr "" + +#: ../src/vikwindow.c:4863 +msgid "Go to the _Default Location" +msgstr "Ugrás az _alapértelmezett helyre" + +#: ../src/vikwindow.c:4863 +msgid "Go to the default location" +msgstr "Ugrás az alapértelmezett helyre" + +#: ../src/vikwindow.c:4864 +#, fuzzy +msgid "Go to the _Auto Location" +msgstr "Ugrás az _alapértelmezett helyre" + +#: ../src/vikwindow.c:4864 +msgid "Go to a location via automatic lookup" +msgstr "" + +#: ../src/vikwindow.c:4865 +msgid "Go to _Location..." +msgstr "Ugrás _helyre..." + +#: ../src/vikwindow.c:4865 +msgid "Go to address/place using text search" +msgstr "Ugrás címre/helyre szöveges kereső használatával" + +#: ../src/vikwindow.c:4866 +msgid "_Go to Lat/Lon..." +msgstr "Ugrás _szél./hossz.-ra..." + +#: ../src/vikwindow.c:4866 +msgid "Go to arbitrary lat/lon coordinate" +msgstr "Ugrás egy megadott földrajzi szélességi/hosszúsági koordinátára" + +#: ../src/vikwindow.c:4867 +msgid "Go to UTM..." +msgstr "Ugrás U_TM-re..." + +#: ../src/vikwindow.c:4867 +msgid "Go to arbitrary UTM coordinate" +msgstr "Ugrás egy megadott UTM koordinátára" + +#: ../src/vikwindow.c:4868 +#, fuzzy +msgid "Go to Today" +msgstr "Ugrás UTM-re" + +#: ../src/vikwindow.c:4868 +msgid "Go to today on the calendar" +msgstr "" + +#: ../src/vikwindow.c:4869 +msgid "_Refresh" +msgstr "" + +#: ../src/vikwindow.c:4869 +msgid "Refresh any maps displayed" +msgstr "" + +#: ../src/vikwindow.c:4870 +msgid "Set _Highlight Color..." +msgstr "" + +#: ../src/vikwindow.c:4870 +msgid "Set Highlight Color" +msgstr "" + +#: ../src/vikwindow.c:4871 +msgid "Set Bac_kground Color..." +msgstr "_Háttérszín beállítása..." + +#: ../src/vikwindow.c:4871 +msgid "Set Background Color" +msgstr "" + +#: ../src/vikwindow.c:4872 +msgid "Zoom _In" +msgstr "_Nagyítás" + +#: ../src/vikwindow.c:4872 +msgid "Zoom In" +msgstr "" + +#: ../src/vikwindow.c:4873 +msgid "Zoom _Out" +msgstr "_Kicsinyítés" + +#: ../src/vikwindow.c:4873 +msgid "Zoom Out" +msgstr "" + +#: ../src/vikwindow.c:4874 +msgid "Zoom _To..." +msgstr "N_agyítás..." + +#: ../src/vikwindow.c:4874 +msgid "Zoom To" +msgstr "" + +#: ../src/vikwindow.c:4875 +msgid "Pan _North" +msgstr "Mozgatás é_szak felé" + +#: ../src/vikwindow.c:4876 +msgid "Pan _East" +msgstr "Mozgatás _kelet felé" + +#: ../src/vikwindow.c:4877 +msgid "Pan _South" +msgstr "Mozgatás _dél felé" + +#: ../src/vikwindow.c:4878 +msgid "Pan _West" +msgstr "Mozgatás _nyugat felé" + +#: ../src/vikwindow.c:4879 +msgid "Background _Jobs" +msgstr "_Háttérmunkák" + +#: ../src/vikwindow.c:4879 +msgid "Background Jobs" +msgstr "" + +#: ../src/vikwindow.c:4881 +msgid "Cu_t" +msgstr "_Kivágás" + +#: ../src/vikwindow.c:4885 +msgid "Delete All" +msgstr "Összes törlése" + +#: ../src/vikwindow.c:4886 +msgid "Copy Centre _Location" +msgstr "" + +#: ../src/vikwindow.c:4887 +msgid "_Flush Map Cache" +msgstr "Térkép-_gyorsítótár kiürítése" + +#: ../src/vikwindow.c:4888 +msgid "_Set the Default Location" +msgstr "_Alapértelmezett hely beállítása" + +#: ../src/vikwindow.c:4888 +msgid "Set the Default Location to the current position" +msgstr "Alapértelmezett hely beállítása a jelenlegi pozícióra" + +#: ../src/vikwindow.c:4889 +msgid "_Preferences" +msgstr "B_eállítások" + +#: ../src/vikwindow.c:4889 +msgid "Program Preferences" +msgstr "" + +#: ../src/vikwindow.c:4890 +msgid "_Layer Defaults" +msgstr "" + +#: ../src/vikwindow.c:4891 +msgid "_Properties" +msgstr "_Tulajdonságok" + +#: ../src/vikwindow.c:4893 +msgid "Help" +msgstr "" + +#: ../src/vikwindow.c:4894 +msgid "_About" +msgstr "_Névjegy" + +#: ../src/vikwindow.c:4894 +msgid "About" +msgstr "" + +#: ../src/vikwindow.c:4903 +msgid "_KML..." +msgstr "" + +#: ../src/vikwindow.c:4903 +msgid "Export as KML" +msgstr "" + +#: ../src/vikwindow.c:4904 +msgid "Transfer data from a GPS device" +msgstr "Adatok áttöltése GPS eszközről" + +#: ../src/vikwindow.c:4905 +msgid "Import file via GPSBabel converter" +msgstr "" + +#: ../src/vikwindow.c:4909 +msgid "Import Geo_JSON File..." +msgstr "" + +#: ../src/vikwindow.c:4909 +msgid "Import GeoJSON file" +msgstr "" + +#: ../src/vikwindow.c:4914 +msgid "_UTM Mode" +msgstr "_UTM mód" + +#: ../src/vikwindow.c:4915 +msgid "_Expedia Mode" +msgstr "_Expedia mód" + +#: ../src/vikwindow.c:4916 +msgid "_Mercator Mode" +msgstr "_Mercator mód" + +#: ../src/vikwindow.c:4917 +msgid "Lat_/Lon Mode" +msgstr "Szél._/Hossz. mód" + +#: ../src/vikwindow.c:4921 +msgid "Show _Scale" +msgstr "_Méretarány megjelenítése" + +#: ../src/vikwindow.c:4921 +msgid "Show Scale" +msgstr "Aránymérték megjelenítése" + +#: ../src/vikwindow.c:4922 +msgid "Show _Center Mark" +msgstr "_Középjelölő megjelenítése" + +#: ../src/vikwindow.c:4922 +msgid "Show Center Mark" +msgstr "Középjelölő megjelenítése" + +#: ../src/vikwindow.c:4923 +msgid "Show _Highlight" +msgstr "" + +#: ../src/vikwindow.c:4923 +msgid "Show Highlight" +msgstr "" + +#: ../src/vikwindow.c:4924 +msgid "_Full Screen" +msgstr "_Teljes képernyő" + +#: ../src/vikwindow.c:4924 +msgid "Activate full screen mode" +msgstr "Teljes képernyő mód aktiválása" + +#: ../src/vikwindow.c:4925 +msgid "Show Side _Panel" +msgstr "_Oldalpanel megjelenítése" + +#: ../src/vikwindow.c:4925 +msgid "Show Side Panel" +msgstr "Oldalpanel megjelenítése" + +#: ../src/vikwindow.c:4926 +msgid "Show Status_bar" +msgstr "Á_llapotsor megjelenítése" + +#: ../src/vikwindow.c:4926 +msgid "Show Statusbar" +msgstr "Állapotsor megjelenítése" + +#: ../src/vikwindow.c:4927 +msgid "Show _Toolbar" +msgstr "_Eszköztár megjelenítése" + +#: ../src/vikwindow.c:4927 +msgid "Show Toolbar" +msgstr "Eszköztár megjelenítése" + +#: ../src/vikwindow.c:4928 +msgid "Show _Menu" +msgstr "_Menü megjelenítése" + +#: ../src/vikwindow.c:4928 +msgid "Show Menu" +msgstr "Menü megjelenítése" + +#: ../src/vikwindow.c:4929 +#, fuzzy +msgid "Show Side Panel B_uttons" +msgstr "Oldalpanel megjelenítése" + +#: ../src/vikwindow.c:4929 +#, fuzzy +msgid "Show Side Panel Buttons" +msgstr "Oldalpanel megjelenítése" + +#: ../src/vikwindow.c:4930 +#, fuzzy +msgid "Show Side Panel Ca_lendar" +msgstr "Oldalpanel megjelenítése" + +#: ../src/vikwindow.c:4930 +#, fuzzy +msgid "Show Side Panel Calendar" +msgstr "Oldalpanel megjelenítése" + +#: ../src/vikwindow.c:5064 +#, c-format +msgid "New _%s Layer" +msgstr "" + +#: ../src/vikwindow.c:5114 +#, fuzzy +msgid "..." +msgstr "Hozzáadás..." + +#: ../src/viking.desktop.in.h:2 +msgid "GPS Data Manager" +msgstr "GPS adatkezelő" + +#: ../src/viking.desktop.in.h:3 +msgid "Map Based GPS Data Manager (live data capable)." +msgstr "Térképalapú GPS adatkezelő (élő adatátvitelre képes)." + +#: ../src/libjpeg/jpeg-data.c:205 +msgid "Data does not follow JPEG specification." +msgstr "" + +#: ../src/libjpeg/jpeg-data.c:302 +#, c-format +msgid "Path '%s' invalid." +msgstr "" + +#: ../src/libjpeg/jpeg-data.c:320 +#, c-format +msgid "Could not read '%s'." +msgstr "" + +#~ msgid "Polygonzied Layer" +#~ msgstr "Poligonizált réteg" + +#~ msgid "Email:" +#~ msgstr "E-mail:" + +#~ msgid "I don't know that place. Do you want another goto?" +#~ msgstr "Nem ismerem ezt a helyet. Szeretne másik ugrást?" + +#~ msgid "Error: couldn't find gpsbabel." +#~ msgstr "Hiba: a gpsbabel nem található." + +#~ msgid "Create Track" +#~ msgstr "Nyomvonal létrehozása" diff --git a/po/id.po b/po/id.po new file mode 100644 index 0000000..04129ab --- /dev/null +++ b/po/id.po @@ -0,0 +1,6089 @@ +# Indonesian translation for viking +# Copyright (c) 2009 Rosetta Contributors and Canonical Ltd 2009 +# This file is distributed under the same license as the viking package. +# Andika Triwidada , 2009. +msgid "" +msgstr "" +"Project-Id-Version: viking\n" +"Report-Msgid-Bugs-To: \n" +"POT-Creation-Date: 2019-01-19 12:53+0000\n" +"PO-Revision-Date: 2011-01-10 15:38+0000\n" +"Last-Translator: Arief Setiadi Wibowo \n" +"Language-Team: Indonesian \n" +"Language: id\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" +"X-Launchpad-Export-Date: 2018-12-21 17:32+0000\n" +"X-Generator: Launchpad (build 18847)\n" + +#: ../src/acquire.c:106 ../src/vikgpslayer.c:1367 +msgid "Done." +msgstr "Selesai." + +#: ../src/acquire.c:115 +msgid "No data." +msgstr "Tidak ada data" + +#: ../src/acquire.c:167 ../src/acquire.c:415 +msgid "Error: acquisition failed." +msgstr "Galat: akuisisi gagal." + +#: ../src/acquire.c:339 +msgid "Working..." +msgstr "Sedang Bekerja..." + +#. This shouldn't happen... +#: ../src/acquire.c:406 +msgid "" +"Unable to create command\n" +"Acquire method failed." +msgstr "" + +#: ../src/acquire.c:513 +msgid "_Filter" +msgstr "" + +#: ../src/acquire.c:528 +#, c-format +msgid "Filter with %s" +msgstr "" + +#: ../src/acquire.c:545 +msgid "Filter" +msgstr "" + +#: ../src/babel.c:640 +msgid "GPSBabel:" +msgstr "" + +#: ../src/babel.c:641 +msgid "" +"Allow setting the specific instance of GPSBabel. You must restart Viking for " +"this value to take effect." +msgstr "" + +#: ../src/babel_ui.c:79 +msgid "Select a file format" +msgstr "" + +#: ../src/babel_ui.c:144 ../src/viktrwlayer.c:531 ../src/viktrwlayer.c:2882 +msgid "Tracks" +msgstr "" + +#: ../src/babel_ui.c:149 ../src/viktrwlayer.c:2892 +msgid "Routes" +msgstr "" + +#. ***** PARAMETERS ***** +#: ../src/babel_ui.c:154 ../src/viktrwlayer.c:531 ../src/viktrwlayer.c:2887 +msgid "Waypoints" +msgstr "" + +#: ../src/background.c:64 +#, c-format +msgid "%d items" +msgstr "%d objek" + +#: ../src/background.c:287 +msgid "Threads:" +msgstr "" + +#: ../src/background.c:288 +msgid "" +"Number of threads to use for Mapnik tasks. You need to restart Viking for a " +"change to this value to be used" +msgstr "" + +#: ../src/background.c:361 +msgid "Job" +msgstr "Tugas" + +#: ../src/background.c:365 +msgid "Progress" +msgstr "Kemajuan" + +#: ../src/background.c:373 +msgid "Viking Background Jobs" +msgstr "Viking Background Jobs" + +#: ../src/bing.c:42 +msgid "Bing Aerial" +msgstr "" + +#: ../src/bing.c:48 +msgid "Bing" +msgstr "" + +#. VIK_GTK_WINDOW_FROM_WIDGET(vp) +#: ../src/bingmapsource.c:514 +msgid "Bing attribution Loading" +msgstr "" + +#: ../src/clipboard.c:95 +msgid "paste failed" +msgstr "tempel gagal" + +#: ../src/clipboard.c:105 +msgid "wrong clipboard data size" +msgstr "ukuran data papan tempel salah" + +#: ../src/clipboard.c:124 +#, c-format +msgid "" +"The clipboard contains sublayer data for %s layers. You must select a layer " +"of this type to paste the clipboard data." +msgstr "" + +#: ../src/clipboard.c:264 +msgid "" +"In order to paste a waypoint, please select an appropriate layer to paste " +"into." +msgstr "" + +#: ../src/dialog.c:60 +msgid "Go to Lat/Lon" +msgstr "Ke Lintang/Bujur" + +#: ../src/dialog.c:69 ../src/viktrwlayer_wpwin.c:173 +msgid "Latitude:" +msgstr "Lintang:" + +#: ../src/dialog.c:72 ../src/viktrwlayer_wpwin.c:177 +msgid "Longitude:" +msgstr "Bujur:" + +#: ../src/dialog.c:102 +msgid "Go to UTM" +msgstr "Ke UTM" + +#: ../src/dialog.c:114 +msgid "Northing:" +msgstr "" + +#: ../src/dialog.c:117 +msgid "Easting:" +msgstr "" + +#: ../src/dialog.c:121 ../src/vikgeoreflayer.c:902 +msgid "Zone:" +msgstr "Zona:" + +#: ../src/dialog.c:124 ../src/vikgeoreflayer.c:904 +msgid "Letter:" +msgstr "Huruf:" + +#: ../src/dialog.c:246 ../src/geonamessearch.c:238 +#: ../src/datasource_osm_my_traces.c:505 +msgid "Nothing was selected" +msgstr "Tak ada yang dipilih" + +#: ../src/dialog.c:254 +msgid "Add Route" +msgstr "" + +#: ../src/dialog.c:254 +msgid "Add Track" +msgstr "Tambah Trek" + +#: ../src/dialog.c:262 +msgid "Route Name:" +msgstr "" + +#: ../src/dialog.c:262 +msgid "Track Name:" +msgstr "Nama Trek:" + +#: ../src/dialog.c:282 +msgid "Please enter a name for the track." +msgstr "Silahkan masukkan nama bagi trek." + +#: ../src/dialog.c:311 +msgid "Today" +msgstr "" + +#: ../src/dialog.c:393 +msgid "Zoom Factors..." +msgstr "Faktor Pembesaran..." + +#: ../src/dialog.c:407 +msgid "Zoom factor (in meters per pixel):" +msgstr "" + +#: ../src/dialog.c:408 +msgid "X (easting): " +msgstr "" + +#: ../src/dialog.c:409 +msgid "Y (northing): " +msgstr "" + +#: ../src/dialog.c:414 +msgid "X and Y zoom factors must be equal" +msgstr "Faktor pembesaran X dan Y mesti sama" + +#: ../src/dialog.c:469 +msgid "1 min" +msgstr "1 menit" + +#: ../src/dialog.c:470 +msgid "1 hour" +msgstr "1 jam" + +#: ../src/dialog.c:471 +msgid "1 day" +msgstr "1 hari" + +#: ../src/dialog.c:472 +msgid "Custom (in minutes):" +msgstr "Kustom (dalam menit):" + +#: ../src/dialog.c:608 +#, c-format +msgid "" +"2003-2008, Evan Battaglia\n" +"2008-%s, Viking's contributors" +msgstr "" + +#: ../src/dialog.c:609 +msgid "GPS Data and Topo Analyzer, Explorer, and Manager." +msgstr "Penganalisis, Penjelajah, dan Pengelola Data dan Topo GPS." + +#: ../src/dialog.c:610 +msgid "" +"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.\n" +"\n" +"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.\n" +"\n" +"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., 59 Temple " +"Place, Suite 330, Boston, MA 02111-1307, USA" +msgstr "" + +#: ../src/dialog.c:703 +msgid "Translation is coordinated on http://launchpad.net/viking" +msgstr "" + +#: ../src/dialog.c:713 +msgid "Download along track" +msgstr "" + +#: ../src/dialog.c:720 +msgid "Map type:" +msgstr "Tipe peta:" + +#: ../src/dialog.c:726 +msgid "Zoom level:" +msgstr "Tingkat pembesaran:" + +#: ../src/dialog.c:766 +#, c-format +msgid "The map data is licensed: %s." +msgstr "" + +#: ../src/dialog.c:769 +#, c-format +msgid "" +"The data provided by '%s' are licensed under the following license: " +"%s." +msgstr "" + +#: ../src/dialog.c:773 +msgid "Open license" +msgstr "" + +#: ../src/expedia.c:54 +msgid "Expedia Street Maps" +msgstr "Peta Jalan Expedia" + +#: ../src/expedia.c:82 +msgid "Invalid expedia altitude" +msgstr "Ketinggian expedia tak valid" + +#: ../src/expedia.c:113 +#, c-format +msgid "" +"Couldn't open EXPEDIA image file (right after successful download! Please " +"report and delete image file!): %s" +msgstr "" +"Tak bisa membuka berkas citra EXPEDIA (tepat setelah pengunduhan yang " +"sukses! Silahkan laporkan dan hapus berkas citra!): %s" + +#: ../src/expedia.c:126 +#, c-format +msgid "" +"Couldn't save EXPEDIA image file (right after successful download! Please " +"report and delete image file!): %s" +msgstr "" +"Tak bisa menyimpan berkas citra EXPEDIA (tepat setelah pengunduhan yang " +"sukses! Silahkan laporkan dan hapus berkas citra!): %s" + +#: ../src/geonamessearch.c:115 +msgid "Search" +msgstr "Cari" + +#: ../src/geonamessearch.c:117 +msgid "No entries found!" +msgstr "Tak ada entri ditemukan!" + +#. NB could allow columns to be shifted around by doing this after each new +#. gtk_tree_view_column_set_reorderable ( column, TRUE ); +#. However I don't think is that useful, so I haven't put it in +#: ../src/geonamessearch.c:171 ../src/datasource_osm_my_traces.c:422 +#: ../src/viktrwlayer_tracklist.c:621 ../src/viktrwlayer_waypointlist.c:618 +msgid "Name" +msgstr "" + +#: ../src/geonamessearch.c:176 +msgid "Feature" +msgstr "" + +#: ../src/geonamessearch.c:181 ../src/datasource_osm_my_traces.c:437 +msgid "Lat/Lon" +msgstr "" + +#: ../src/geonamessearch.c:264 ../src/googlesearch.c:101 ../src/vikgoto.c:430 +msgid "couldn't map temp file" +msgstr "tak bisa memetakan berkas temp" + +#: ../src/geonamessearch.c:459 +msgid "Select articles" +msgstr "" + +#: ../src/geonamessearch.c:459 +msgid "Select the articles you want to add." +msgstr "" + +#: ../src/geonamessearch.c:475 +msgid "city" +msgstr "" + +#: ../src/geonamessearch.c:477 +msgid "edu" +msgstr "" + +#: ../src/geonamessearch.c:479 +msgid "airport" +msgstr "" + +#: ../src/geonamessearch.c:481 +msgid "mountain" +msgstr "" + +#: ../src/geonamessearch.c:483 +msgid "forest" +msgstr "" + +#: ../src/geonamessearch.c:485 +msgid "church" +msgstr "" + +#: ../src/geojson.c:74 +#, c-format +msgid "%s command failed: %s" +msgstr "" + +#: ../src/geojson.c:146 ../src/gpx.c:1317 +#, c-format +msgid "failed to open temporary file: %s" +msgstr "" + +#: ../src/globals.c:67 +msgid "DDD" +msgstr "" + +#: ../src/globals.c:67 +msgid "DMM" +msgstr "" + +#: ../src/globals.c:67 +msgid "DMS" +msgstr "" + +#: ../src/globals.c:67 +msgid "Raw" +msgstr "" + +#: ../src/globals.c:68 +msgid "Kilometres" +msgstr "" + +#: ../src/globals.c:68 +msgid "Miles" +msgstr "" + +#: ../src/globals.c:68 +msgid "Nautical Miles" +msgstr "" + +#. VIK_UNITS_SPEED_KILOMETRES_PER_HOUR: +#: ../src/globals.c:69 ../src/viktrwlayer_tracklist.c:655 ../src/vikutils.c:100 +msgid "km/h" +msgstr "" + +#: ../src/globals.c:69 ../src/viktrwlayer_tracklist.c:656 ../src/vikutils.c:78 +msgid "mph" +msgstr "" + +#. VIK_UNITS_SPEED_METRES_PER_SECOND: +#: ../src/globals.c:69 ../src/viktrwlayer_tracklist.c:663 ../src/vikutils.c:81 +msgid "m/s" +msgstr "" + +#: ../src/globals.c:69 ../src/viktrwlayer_tracklist.c:657 ../src/vikutils.c:84 +msgid "knots" +msgstr "" + +#: ../src/globals.c:69 ../src/viktrwlayer_tracklist.c:658 ../src/vikutils.c:87 +msgid "s/km" +msgstr "" + +#: ../src/globals.c:69 ../src/viktrwlayer_tracklist.c:659 ../src/vikutils.c:90 +msgid "min/km" +msgstr "" + +#: ../src/globals.c:69 +msgid "s/mi" +msgstr "" + +#: ../src/globals.c:69 ../src/viktrwlayer_tracklist.c:661 ../src/vikutils.c:96 +msgid "min/mi" +msgstr "" + +#: ../src/globals.c:70 +msgid "Metres" +msgstr "" + +#: ../src/globals.c:70 +msgid "Feet" +msgstr "" + +#: ../src/globals.c:73 +msgid "Locale" +msgstr "" + +#: ../src/globals.c:73 +msgid "World" +msgstr "" + +#: ../src/globals.c:73 +msgid "UTC" +msgstr "" + +#: ../src/globals.c:76 +msgid "Degree format:" +msgstr "Format derajat:" + +#: ../src/globals.c:77 +msgid "Distance units:" +msgstr "Jarak unit:" + +#: ../src/globals.c:78 +msgid "Speed units:" +msgstr "Kecepatan unit:" + +#: ../src/globals.c:79 +msgid "Height units:" +msgstr "Tinggi unit:" + +#: ../src/globals.c:80 +msgid "Use large waypoint icons:" +msgstr "" + +#: ../src/globals.c:81 +msgid "Default latitude:" +msgstr "" + +#: ../src/globals.c:82 +msgid "Default longitude:" +msgstr "" + +#: ../src/globals.c:83 +msgid "Time Display:" +msgstr "" + +#: ../src/globals.c:84 +msgid "" +"Display times according to the reference frame. Locale is the user's system " +"setting. World is relative to the location of the object." +msgstr "" + +#: ../src/globals.c:90 +msgid "Alphabetical" +msgstr "" + +#: ../src/globals.c:90 ../src/datasource_osm_my_traces.c:432 +msgid "Time" +msgstr "" + +#: ../src/globals.c:90 +msgid "Creation" +msgstr "" + +#: ../src/globals.c:91 +msgid "Title Case" +msgstr "" + +#: ../src/globals.c:91 +msgid "Lowercase" +msgstr "" + +#: ../src/globals.c:94 +msgid "KML File Export Units:" +msgstr "" + +#: ../src/globals.c:95 +msgid "GPX Track Order:" +msgstr "" + +#: ../src/globals.c:96 +msgid "GPX Waypoint Symbols:" +msgstr "" + +#: ../src/globals.c:97 +msgid "" +"Save GPX Waypoint Symbol names in the specified case. May be useful for " +"compatibility with various devices" +msgstr "" + +#: ../src/globals.c:98 +msgid "GPX Creator:" +msgstr "" + +#: ../src/globals.c:99 +msgid "" +"The creator value when writing a GPX file. Otherwise when blank a default is " +"used." +msgstr "" + +#: ../src/globals.c:104 +msgid "Image Viewer:" +msgstr "" + +#: ../src/globals.c:109 +msgid "External GPX Program 1:" +msgstr "" + +#: ../src/globals.c:110 +msgid "External GPX Program 2:" +msgstr "" + +#: ../src/globals.c:113 +msgid "Absolute" +msgstr "" + +#: ../src/globals.c:113 +msgid "Relative" +msgstr "" + +#: ../src/globals.c:117 +msgid "Save File Reference Mode:" +msgstr "" + +#: ../src/globals.c:118 +msgid "" +"When saving a Viking .vik file, this determines how the directory paths of " +"filenames are written." +msgstr "" + +#: ../src/globals.c:119 +msgid "Ask for Name before Track Creation:" +msgstr "" + +#: ../src/globals.c:120 +msgid "Show Tooltip during Track Creation:" +msgstr "" + +#: ../src/globals.c:121 +msgid "The number of recent files:" +msgstr "" + +#: ../src/globals.c:122 +msgid "" +"Only applies to new windows or on application restart. -1 means all " +"available files." +msgstr "" + +#: ../src/globals.c:123 +msgid "Open files in selected layer:" +msgstr "" + +#: ../src/globals.c:124 +msgid "Open files (but not .vik ones) into the selected TrackWaypoint layer." +msgstr "" + +#: ../src/globals.c:125 +msgid "Show calendar day names:" +msgstr "" + +#: ../src/globals.c:128 +msgid "Home Location" +msgstr "" + +#: ../src/globals.c:128 +msgid "Last Location" +msgstr "" + +#: ../src/globals.c:128 +msgid "Specified File" +msgstr "" + +#: ../src/globals.c:128 +msgid "Auto Location" +msgstr "" + +#: ../src/globals.c:131 +msgid "Restore Window Setup:" +msgstr "" + +#: ../src/globals.c:132 +msgid "Restore window size and layout" +msgstr "" + +#: ../src/globals.c:133 +msgid "Add a Default Map Layer:" +msgstr "" + +#: ../src/globals.c:134 +msgid "" +"The default map layer added is defined by the Layer Defaults. Use the menu " +"Edit->Layer Defaults->Map... to change the map type and other values." +msgstr "" + +#: ../src/globals.c:135 +msgid "Startup Method:" +msgstr "" + +#: ../src/globals.c:136 +msgid "Startup File:" +msgstr "" + +#: ../src/globals.c:137 +msgid "" +"The default file to load on startup. Only applies when the startup method is " +"set to 'Specified File'" +msgstr "" + +#: ../src/globals.c:138 +msgid "Check For New Version:" +msgstr "" + +#: ../src/globals.c:139 +msgid "Periodically check to see if a new version of Viking is available" +msgstr "" + +#. Defaults for the options are setup here +#: ../src/globals.c:176 +msgid "General" +msgstr "" + +#. New Tab +#: ../src/globals.c:204 +msgid "Startup" +msgstr "" + +#. New Tab +#: ../src/globals.c:222 +msgid "Export/External" +msgstr "" + +#. 'Advanced' Properties +#: ../src/globals.c:249 +msgid "Advanced" +msgstr "" + +#. Webtools +#: ../src/google.c:39 +msgid "Google" +msgstr "Google" + +#. If there is an actual description field it will overwrite this value +#: ../src/gpx.c:264 +#, c-format +msgid "Created by: %s" +msgstr "" + +#: ../src/datasource_bfilter.c:43 +msgid "Max number of points:" +msgstr "" + +#: ../src/datasource_bfilter.c:84 +msgid "Simplify All Tracks..." +msgstr "" + +#: ../src/datasource_bfilter.c:85 +msgid "Simplified Tracks" +msgstr "Lintasan Yang Disederhanakan" + +#. { VIK_LAYER_NUM_TYPES, "compressmethod", VIK_LAYER_PARAM_UINT, VIK_LAYER_GROUP_NONE, N_("Simplify Method:"), VIK_LAYER_WIDGET_COMBOBOX, compress_method, NULL, NULL, NULL, NULL, NULL }, +#: ../src/datasource_bfilter.c:111 +msgid "Error Factor:" +msgstr "" + +#: ../src/datasource_bfilter.c:112 +msgid "" +"Specifies the maximum allowable error that may be introduced by removing a " +"single point by the crosstrack method. See the manual or GPSBabel Simplify " +"Filter documentation for more detail." +msgstr "" + +#: ../src/datasource_bfilter.c:166 +msgid "Compress Tracks..." +msgstr "" + +#: ../src/datasource_bfilter.c:167 +msgid "Compressed Tracks" +msgstr "" + +#: ../src/datasource_bfilter.c:197 ../src/datasource_bfilter.c:198 +msgid "Remove Duplicate Waypoints" +msgstr "" + +#: ../src/datasource_bfilter.c:221 +msgid "Manual filter:" +msgstr "" + +#: ../src/datasource_bfilter.c:222 +msgid "Manual filter command: e.g. 'swap'." +msgstr "" + +#: ../src/datasource_bfilter.c:233 ../src/datasource_bfilter.c:234 +msgid "Manual filter" +msgstr "" + +#: ../src/datasource_bfilter.c:262 +msgid "Waypoints Inside This" +msgstr "" + +#: ../src/datasource_bfilter.c:263 ../src/datasource_bfilter.c:292 +msgid "Polygonized Layer" +msgstr "" + +#: ../src/datasource_bfilter.c:291 +msgid "Waypoints Outside This" +msgstr "" + +#: ../src/datasource_file.c:61 +msgid "Import file with GPSBabel" +msgstr "" + +#: ../src/datasource_file.c:62 +msgid "Imported file" +msgstr "" + +#. The file selector +#: ../src/datasource_file.c:129 +msgid "File:" +msgstr "" + +#: ../src/datasource_file.c:130 +msgid "File to import" +msgstr "" + +#: ../src/datasource_file.c:137 +msgid "All files" +msgstr "" + +#. The file format selector +#: ../src/datasource_file.c:144 ../src/datasource_url.c:106 +msgid "File type:" +msgstr "" + +#: ../src/datasource_file.c:189 +#, c-format +msgid "using babel args '%s' and file '%s'" +msgstr "" + +#: ../src/datasource_gc.c:67 +msgid "Download Geocaches" +msgstr "" + +#: ../src/datasource_gc.c:68 +msgid "Geocaching.com Caches" +msgstr "" + +#: ../src/datasource_gc.c:86 +msgid "geocaching.com username:" +msgstr "nama pengguna geocaching.com:" + +#: ../src/datasource_gc.c:87 +msgid "geocaching.com password:" +msgstr "kata sandi geocaching.com:" + +#: ../src/datasource_gc.c:92 ../src/vikwindow.c:3502 +msgid "Geocaching" +msgstr "" + +#: ../src/datasource_gc.c:128 +#, c-format +msgid "" +"Can't find %s or %s in path! Check that you have installed it correctly." +msgstr "" + +#: ../src/datasource_gc.c:190 +msgid "Number geocaches:" +msgstr "" + +#: ../src/datasource_gc.c:192 +msgid "Centered around:" +msgstr "Berpusat di sekitar:" + +#: ../src/datasource_gc.c:231 +msgid "Broken input - using some defaults" +msgstr "" + +#: ../src/datasource_geotag.c:51 +msgid "Create Waypoints from Geotagged Images" +msgstr "" + +#: ../src/datasource_geotag.c:52 +msgid "Geotagged Images" +msgstr "" + +#: ../src/datasource_geotag.c:102 ../src/datasource_geojson.c:93 +#: ../src/vikfileentry.c:171 ../src/vikwindow.c:3533 ../src/vikwindow.c:3610 +#: ../src/vikwindow.c:3641 ../src/vikwindow.c:4356 ../src/vikwindow.c:4649 +msgid "All" +msgstr "" + +#: ../src/datasource_geotag.c:107 ../src/vikfileentry.c:115 +#: ../src/viktrwlayer_geotag.c:637 ../src/vikwindow.c:3518 +#: ../src/vikwindow.c:4377 +msgid "JPG" +msgstr "" + +#: ../src/datasource_geotag.c:168 +#, c-format +msgid "Unable to create waypoint from %s" +msgstr "" + +#: ../src/datasource_geojson.c:46 +msgid "Acquire from GeoJSON" +msgstr "" + +#: ../src/datasource_geojson.c:47 ../src/datasource_geojson.c:98 +msgid "GeoJSON" +msgstr "" + +#: ../src/datasource_geojson.c:152 +#, c-format +msgid "Unable to import from: %s" +msgstr "" + +#: ../src/datasource_gps.c:54 +msgid "Acquire from GPS" +msgstr "Ambil dari GPS" + +#: ../src/datasource_gps.c:55 +msgid "Acquired from GPS" +msgstr "Diperoleh dari GPS" + +#: ../src/datasource_gps.c:258 +#, c-format +msgid "using cmd '%s' and file '%s'\n" +msgstr "" + +#: ../src/datasource_gps.c:353 ../src/vikgpslayer.c:966 +#, c-format +msgid "Downloading %d waypoint..." +msgid_plural "Downloading %d waypoints..." +msgstr[0] "Mengunduh %d waypoint..." + +#: ../src/datasource_gps.c:358 ../src/vikgpslayer.c:971 +#, c-format +msgid "Downloading %d trackpoint..." +msgid_plural "Downloading %d trackpoints..." +msgstr[0] "Mengunduh %d trackpoint..." + +#: ../src/datasource_gps.c:363 ../src/vikgpslayer.c:976 +#, c-format +msgid "Downloading %d routepoint..." +msgid_plural "Downloading %d routepoints..." +msgstr[0] "" +msgstr[1] "" + +#: ../src/datasource_gps.c:386 ../src/datasource_gps.c:393 +#: ../src/datasource_gps.c:400 +#, c-format +msgid "Downloaded %d out of %d %s..." +msgstr "Diunduh %d dari %d %s..." + +#: ../src/datasource_gps.c:388 ../src/datasource_gps.c:395 +#: ../src/datasource_gps.c:402 +#, c-format +msgid "Downloaded %d %s." +msgstr "Diunduh %d %s." + +#: ../src/datasource_gps.c:416 ../src/vikgpslayer.c:1134 +#, c-format +msgid "GPS Device: %s" +msgstr "Perangkat GPS: %s" + +#: ../src/datasource_gps.c:428 ../src/vikgpslayer.c:1214 +msgid "Status: Working..." +msgstr "" + +#. NB gps_layer_inst_init() is performed after parameter registeration +#. thus to give the protocols some potential values use the old static list +#. TODO: find another way to use gps_layer_inst_init()? +#: ../src/datasource_gps.c:584 ../src/vikgpslayer.c:216 +msgid "GPS Protocol:" +msgstr "Protokol GPS:" + +#. List reassigned at runtime +#: ../src/datasource_gps.c:609 ../src/vikgpslayer.c:217 +msgid "Serial Port:" +msgstr "Port Serial:" + +#: ../src/datasource_gps.c:659 +msgid "" +"Turn Off After Transfer\n" +"(Garmin/NAViLink Only)" +msgstr "" + +#: ../src/datasource_gps.c:666 +msgid "Tracks:" +msgstr "" + +#: ../src/datasource_gps.c:673 +msgid "Routes:" +msgstr "" + +#: ../src/datasource_gps.c:680 +msgid "Waypoints:" +msgstr "" + +#: ../src/datasource_gps.c:756 ../src/vikgpslayer.c:1509 +msgid "GPS device: N/A" +msgstr "Perangkat GPS: N/A" + +#: ../src/datasource_osm.c:53 ../src/datasource_osm.c:54 +msgid "OSM traces" +msgstr "" + +#: ../src/datasource_osm.c:89 +msgid "Page number:" +msgstr "" + +#: ../src/datasource_osm_my_traces.c:59 ../src/datasource_osm_my_traces.c:60 +msgid "OSM My Traces" +msgstr "" + +#: ../src/datasource_osm_my_traces.c:106 ../src/osm-traces.c:684 +#, fuzzy +msgid "Email/username:" +msgstr "Nama pengguna OSM:" + +#: ../src/datasource_osm_my_traces.c:111 +msgid "The email or username used to login to OSM" +msgstr "" + +#: ../src/datasource_osm_my_traces.c:113 ../src/osm-traces.c:692 +msgid "Password:" +msgstr "Kata sandi:" + +#: ../src/datasource_osm_my_traces.c:116 +msgid "The password used to login to OSM" +msgstr "" + +#: ../src/datasource_osm_my_traces.c:427 ../src/viktrwlayer.c:689 +msgid "Description" +msgstr "" + +#: ../src/datasource_osm_my_traces.c:442 +msgid "Privacy" +msgstr "" + +#: ../src/datasource_osm_my_traces.c:449 +msgid "Within Current View" +msgstr "" + +#: ../src/datasource_osm_my_traces.c:516 +msgid "GPS Traces" +msgstr "" + +#: ../src/datasource_osm_my_traces.c:518 +msgid "None found!" +msgstr "" + +#: ../src/datasource_osm_my_traces.c:569 +msgid "Ensure the OSM access token preferences are setup." +msgstr "" + +#: ../src/datasource_osm_my_traces.c:645 +msgid "My OSM Traces" +msgstr "" + +#. Report errors to the status bar +#: ../src/datasource_osm_my_traces.c:667 +#, c-format +msgid "Unable to get trace: %s" +msgstr "" + +#: ../src/datasource_routing.c:56 ../src/datasource_routing.c:57 +msgid "Directions" +msgstr "" + +#: ../src/datasource_routing.c:90 +msgid "No routing engines with directions available" +msgstr "" + +#. Engine selector +#: ../src/datasource_routing.c:99 +msgid "Engine:" +msgstr "" + +#. From and To entries +#: ../src/datasource_routing.c:104 +msgid "From:" +msgstr "Dari:" + +#: ../src/datasource_routing.c:105 +msgid "To:" +msgstr "Ke:" + +#: ../src/datasource_url.c:48 +msgid "Acquire from URL" +msgstr "" + +#: ../src/datasource_url.c:49 +msgid "URL" +msgstr "" + +#: ../src/datasource_url.c:101 +msgid "URL:" +msgstr "" + +#. Only GPX (not using GPSbabel) +#: ../src/datasource_url.c:133 ../src/vikfileentry.c:161 +#: ../src/vikwindow.c:3513 ../src/vikwindow.c:3603 +msgid "GPX" +msgstr "" + +#: ../src/datasource_wikipedia.c:32 +msgid "Create Waypoints from Wikipedia Articles" +msgstr "" + +#: ../src/datasource_wikipedia.c:33 +msgid "Wikipedia Waypoints" +msgstr "" + +#: ../src/dem.c:66 ../src/dem.c:80 +msgid "Invalid DEM" +msgstr "" + +#: ../src/dem.c:122 +msgid "Invalid DEM header" +msgstr "" + +#: ../src/dem.c:191 ../src/dem.c:204 +msgid "Incorrect DEM Class B record: expected 1" +msgstr "" + +#: ../src/dem.c:289 ../src/download.c:176 +#, c-format +msgid "Couldn't map file %s: %s" +msgstr "" + +#: ../src/download.c:130 +msgid "Tile age (days):" +msgstr "" + +#: ../src/download.c:406 +#, c-format +msgid "Download error: %s" +msgstr "Galat pengunduhan: %s" + +#: ../src/download.c:490 +msgid "couldn't open temp file" +msgstr "tak bisa membuka berkas temp" + +#: ../src/file.c:458 ../src/file.c:463 +#, c-format +msgid "Draw mode '%s' no more supported" +msgstr "" + +#: ../src/geotag_exif.c:621 +msgid "Not enough memory." +msgstr "" + +#: ../src/geotag_exif.c:639 +msgid "Setting a value for this tag is unsupported!" +msgstr "" + +#: ../src/geotag_exif.c:658 +#, c-format +msgid "Too few components specified (need %d, found %d)\n" +msgstr "" + +#: ../src/geotag_exif.c:662 +msgid "Numeric value expected\n" +msgstr "" + +#: ../src/geotag_exif.c:670 +msgid "This shouldn't happen!" +msgstr "" + +#: ../src/geotag_exif.c:740 +msgid "Not yet implemented!" +msgstr "" + +#: ../src/geotag_exif.c:753 +msgid "Warning; Too many components specified!" +msgstr "" + +#: ../src/osm-traces.c:87 +msgid "Identifiable (public w/ timestamps)" +msgstr "" + +#: ../src/osm-traces.c:88 +msgid "Trackable (private w/ timestamps)" +msgstr "" + +#: ../src/osm-traces.c:89 +msgid "Public" +msgstr "Publik" + +#: ../src/osm-traces.c:90 +msgid "Private" +msgstr "" + +#: ../src/osm-traces.c:108 +msgid "Access Token:" +msgstr "" + +#: ../src/osm-traces.c:108 +msgid "Get New OSM Access Tokens" +msgstr "" + +#: ../src/osm-traces.c:109 +msgid "Access Token Key:" +msgstr "" + +#: ../src/osm-traces.c:110 +msgid "Access Token Secret:" +msgstr "" + +#: ../src/osm-traces.c:111 +msgid "OSM username:" +msgstr "Nama pengguna OSM:" + +#: ../src/osm-traces.c:112 +msgid "OSM password:" +msgstr "Kata sandi OSM:" + +#. Check to really override existing values... +#: ../src/osm-traces.c:263 +msgid "Do you want to overwrite existing values?" +msgstr "" + +#: ../src/osm-traces.c:275 +msgid "Not able to generate OSM request tokens." +msgstr "" + +#: ../src/osm-traces.c:299 +msgid "" +"Waiting for authorization approval.\n" +"Ensure you have granted access at the website before continuing here." +msgstr "" + +#: ../src/osm-traces.c:315 +msgid "No Authorization." +msgstr "" + +#: ../src/osm-traces.c:354 +msgid "" +"OSM Username and Password preferences are not required anymore. You can now " +"remove them." +msgstr "" + +#. Preferences +#: ../src/osm-traces.c:379 +msgid "OpenStreetMap Traces" +msgstr "" + +#: ../src/osm-traces.c:504 +#, c-format +msgid "failed to upload data: HTTP response is %ld" +msgstr "gagal mengunggah data: jawaban HTTP adalah %ld" + +#: ../src/osm-traces.c:509 +#, c-format +msgid "curl_easy_getinfo failed: %d" +msgstr "" + +#: ../src/osm-traces.c:514 +#, c-format +msgid "curl request failed: %s" +msgstr "" + +#. Success +#: ../src/osm-traces.c:592 +msgid "Uploaded to OSM" +msgstr "" + +#: ../src/osm-traces.c:596 +msgid "" +"FAILED TO UPLOAD DATA TO OSM - Ensure the OSM access token preferences are " +"setup." +msgstr "" + +#: ../src/osm-traces.c:599 +msgid "FAILED TO UPLOAD DATA TO OSM - CURL PROBLEM" +msgstr "" + +#: ../src/osm-traces.c:602 +msgid "FAILED TO UPLOAD DATA TO OSM" +msgstr "" + +#: ../src/osm-traces.c:602 +msgid "HTTP response code" +msgstr "" + +#: ../src/osm-traces.c:610 +#, c-format +msgid "failed to unlink temporary file: %s" +msgstr "" + +#: ../src/osm-traces.c:664 +msgid "OSM upload" +msgstr "Unggah OSM" + +#: ../src/osm-traces.c:689 +msgid "" +"The email/username used as login\n" +"Enter the email/username you use to login into www.openstreetmap.org." +"" +msgstr "" + +#: ../src/osm-traces.c:697 +msgid "" +"The password used to login\n" +"Enter the password you use to login into www.openstreetmap.org." +msgstr "" + +#: ../src/osm-traces.c:703 +msgid "File's name:" +msgstr "Nama berkas:" + +#: ../src/osm-traces.c:713 +msgid "" +"The name of the file on OSM\n" +"This is the name of the file created on the server.This is not the " +"name of the local file." +msgstr "" + +#: ../src/osm-traces.c:717 ../src/viktrwlayer_wpwin.c:197 +#: ../src/viktrwlayer_wpwin.c:199 +msgid "Description:" +msgstr "Keterangan:" + +#: ../src/osm-traces.c:731 +msgid "The description of the trace" +msgstr "" + +#: ../src/osm-traces.c:734 +msgid "Anonymize Times:" +msgstr "" + +#: ../src/osm-traces.c:739 +msgid "" +"Anonymize times of the trace.\n" +"You may choose to make the trace identifiable, yet mask the actual " +"real time values" +msgstr "" + +#: ../src/osm-traces.c:743 +msgid "Tags:" +msgstr "Tag:" + +#: ../src/osm-traces.c:751 +msgid "The tags associated to the trace" +msgstr "" + +#: ../src/osm-traces.c:816 +#, c-format +msgid "Uploading %s to OSM" +msgstr "" + +#: ../src/mapcache.c:67 +msgid "Map cache memory size (MB):" +msgstr "" + +#. NB Can have a couple hundred fonts loaded when using system directories +#. So ATM don't list them all - otherwise need better GUI feedback display. +#: ../src/mapnik_interface.cpp:324 +#, c-format +msgid "" +"%s %s\n" +"Plugins=%sFonts loaded=%d" +msgstr "" + +#: ../src/mapnik_interface.cpp:325 ../src/vikmapniklayer.c:278 +msgid "Mapnik" +msgstr "" + +#: ../src/print.c:51 ../src/viktrwlayer.c:572 +msgid "None" +msgstr "Tak Satupun" + +#: ../src/print.c:52 +msgid "Horizontally" +msgstr "Arah Datar" + +#: ../src/print.c:53 +msgid "Vertically" +msgstr "Arah Tegak" + +#: ../src/print.c:54 +msgid "Both" +msgstr "Keduanya" + +#: ../src/print.c:118 +msgid "Image Settings" +msgstr "Tatanan Citra" + +#: ../src/print.c:551 +msgid "done" +msgstr "beres" + +#. Page Size +#: ../src/print.c:580 +msgid "_Adjust Page Size and Orientation" +msgstr "" + +#: ../src/print.c:596 +msgid "C_enter:" +msgstr "Pusa_t:" + +#. ignore page margins +#: ../src/print.c:614 +msgid "Ignore Page _Margins" +msgstr "" + +#: ../src/print.c:633 +msgid "Image S_ize:" +msgstr "U_kuran Citra:" + +#: ../src/ui_util.c:88 +#, c-format +msgid "Could not launch web browser. %s" +msgstr "" + +#: ../src/ui_util.c:101 +#, c-format +msgid "Could not create new email. %s" +msgstr "" + +#: ../src/vikcoordlayer.c:57 +msgid "Color:" +msgstr "Warna:" + +#: ../src/vikcoordlayer.c:58 +msgid "Minutes Width:" +msgstr "" + +#: ../src/vikcoordlayer.c:59 +msgid "Line Thickness:" +msgstr "Tebal Garis:" + +#: ../src/vikcoordlayer.c:66 +msgid "Coordinate" +msgstr "" + +#: ../src/main.c:92 +#, c-format +msgid "Ignoring Xlib error: error code %d request code %d\n" +msgstr "" + +#: ../src/main.c:111 +msgid "Enable debug output" +msgstr "" + +#: ../src/main.c:112 +msgid "Enable verbose output" +msgstr "" + +#: ../src/main.c:113 +msgid "Show version" +msgstr "Tampilkan versi" + +#: ../src/main.c:114 +msgid "Latitude in decimal degrees" +msgstr "" + +#: ../src/main.c:115 +msgid "Longitude in decimal degrees" +msgstr "" + +#: ../src/main.c:116 +msgid "Zoom Level (OSM). Value can be 0 - 22" +msgstr "" + +#: ../src/main.c:117 +msgid "Add a map layer by id value. Use 0 for the default map." +msgstr "" + +#: ../src/main.c:160 +#, c-format +msgid "" +"%s %s\n" +"Copyright (c) 2003-2008 Evan Battaglia\n" +"Copyright (c) 2008-%s Viking's contributors\n" +msgstr "" + +#: ../src/osm.c:50 +msgid "OpenStreetMap (Mapnik)" +msgstr "" + +#: ../src/osm.c:65 +msgid "OpenStreetMap (Cycle)" +msgstr "" + +#: ../src/osm.c:79 +msgid "OpenStreetMap (Transport)" +msgstr "" + +#: ../src/osm.c:95 +msgid "OpenStreetMap (Humanitarian)" +msgstr "" + +#: ../src/osm.c:111 +msgid "On Disk OSM Tile Format" +msgstr "" + +#: ../src/osm.c:121 +msgid "MBTiles File" +msgstr "" + +#: ../src/osm.c:132 +msgid "OSM Metatiles" +msgstr "" + +#: ../src/osm.c:146 +msgid "Mapbox Outdoors" +msgstr "" + +#: ../src/osm.c:153 +msgid "Mapbox Specific" +msgstr "" + +#: ../src/osm.c:170 +msgid "OSM (view)" +msgstr "OSM (tilik)" + +#: ../src/osm.c:174 +msgid "OSM (edit)" +msgstr "OSM (sunting)" + +#. Note the use of positional parameters +#: ../src/osm.c:179 +msgid "OSM (query)" +msgstr "" + +#: ../src/osm.c:183 +msgid "OSM (render)" +msgstr "OSM (render)" + +#. Example: http://127.0.0.1:8111/load_and_zoom?left=8.19&right=8.20&top=48.605&bottom=48.590&select=node413602999 +#. JOSM or merkaartor must already be running with remote interface enabled +#: ../src/osm.c:190 +msgid "Local port 8111 (eg JOSM)" +msgstr "" + +#: ../src/osm.c:195 +msgid "Geofabrik Map Compare" +msgstr "" + +#: ../src/osm.c:203 +msgid "OpenStreetMap Notes" +msgstr "" + +#. Not really OSM but can't be bothered to create somewhere else to put it... +#: ../src/osm.c:221 +msgid "Wikimedia Toolserver GeoHack" +msgstr "" + +#: ../src/preferences.c:195 +msgid "Preferences" +msgstr "" + +#: ../src/toolbar.c:91 ../src/toolbar.c:92 +msgid "System Default" +msgstr "" + +#: ../src/toolbar.c:91 ../src/viktrwlayer.c:563 +msgid "Small" +msgstr "" + +#: ../src/toolbar.c:91 ../src/viktrwlayer.c:564 +msgid "Medium" +msgstr "" + +#: ../src/toolbar.c:91 ../src/viktrwlayer.c:565 +msgid "Large" +msgstr "" + +#: ../src/toolbar.c:92 +msgid "Icons Only" +msgstr "" + +#: ../src/toolbar.c:92 +msgid "Text Only" +msgstr "" + +#: ../src/toolbar.c:92 +msgid "Icons and Text" +msgstr "" + +#: ../src/toolbar.c:106 +msgid "Append to Menu:" +msgstr "" + +#: ../src/toolbar.c:107 +msgid "Pack the toolbar to the main menu to save vertical space" +msgstr "" + +#: ../src/toolbar.c:108 +msgid "Icon Size:" +msgstr "" + +#: ../src/toolbar.c:110 +msgid "Icon Style:" +msgstr "" + +#: ../src/toolbar.c:112 +msgid "Customize:" +msgstr "" + +#: ../src/toolbar.c:112 +msgid "Customize Buttons" +msgstr "" + +#. Preferences +#: ../src/toolbar.c:145 +msgid "Toolbar" +msgstr "" + +#: ../src/toolbar.c:312 +msgid "_Customize" +msgstr "" + +#: ../src/toolbar.c:641 +msgid "Separator" +msgstr "" + +#: ../src/toolbar.c:642 +msgid "--- Separator ---" +msgstr "" + +#: ../src/toolbar.c:1007 +msgid "Customize Toolbar" +msgstr "" + +#: ../src/toolbar.c:1028 +msgid "" +"Select items to be displayed on the toolbar. Items can be reordered by drag " +"and drop." +msgstr "" + +#: ../src/toolbar.c:1044 +msgid "Available Items" +msgstr "" + +#: ../src/toolbar.c:1065 +msgid "Displayed Items" +msgstr "" + +#: ../src/viklayer_defaults.c:232 +#, c-format +msgid "Could not open file: %s" +msgstr "" + +#: ../src/viklayer_defaults.c:304 +msgid "Layer Defaults" +msgstr "" + +#: ../src/uibuilder.c:196 +msgid "Take care that this password will be stored clearly in a plain file." +msgstr "" + +#: ../src/uibuilder.c:628 ../src/viktrwlayer_export.c:188 +#: ../src/viktrwlayer_export.c:304 ../src/vikwindow.c:3666 +#: ../src/vikwindow.c:4408 +#, c-format +msgid "The file \"%s\" exists, do you wish to overwrite it?" +msgstr "" + +#: ../src/vikaggregatelayer.c:41 +msgid "Aggregate" +msgstr "" + +#: ../src/vikaggregatelayer.c:528 ../src/viktrwlayer.c:11700 +#, c-format +msgid "%s: Waypoint List" +msgstr "" + +#: ../src/vikaggregatelayer.c:570 +msgid "Search by Date" +msgstr "" + +#: ../src/vikaggregatelayer.c:576 +msgid "No items found with the requested date." +msgstr "" + +#: ../src/vikaggregatelayer.c:615 ../src/viktrwlayer.c:11691 +#, c-format +msgid "%s: Track and Route List" +msgstr "" + +#: ../src/vikaggregatelayer.c:681 ../src/viktrwlayer.c:8346 +#: ../src/viktrwlayer.c:8417 ../src/viktrwlayer.c:8494 +msgid "_Visibility" +msgstr "" + +#: ../src/vikaggregatelayer.c:686 +msgid "_Show All" +msgstr "" + +#: ../src/vikaggregatelayer.c:692 +msgid "_Hide All" +msgstr "" + +#: ../src/vikaggregatelayer.c:698 ../src/viktrwlayer.c:8363 +#: ../src/viktrwlayer.c:8434 ../src/viktrwlayer.c:8511 +msgid "_Toggle" +msgstr "" + +#: ../src/vikaggregatelayer.c:705 ../src/viktrwlayer.c:8532 +msgid "_Sort" +msgstr "" + +#: ../src/vikaggregatelayer.c:711 ../src/viktrwlayer.c:8538 +msgid "Name _Ascending" +msgstr "" + +#: ../src/vikaggregatelayer.c:717 ../src/viktrwlayer.c:8544 +msgid "Name _Descending" +msgstr "" + +#: ../src/vikaggregatelayer.c:723 ../src/viktrwlayer.c:575 +#: ../src/viktrwlayer.c:8550 +msgid "Date Ascending" +msgstr "" + +#: ../src/vikaggregatelayer.c:729 ../src/viktrwlayer.c:576 +#: ../src/viktrwlayer.c:8556 +msgid "Date Descending" +msgstr "" + +#: ../src/vikaggregatelayer.c:735 ../src/viktrwlayer.c:8445 +#: ../src/viktrwlayer.c:8523 ../src/viktrwlayer.c:8595 +#: ../src/viktrwlayer_tracklist.c:296 +msgid "_Statistics" +msgstr "" + +#: ../src/vikaggregatelayer.c:740 ../src/viktrwlayer.c:4533 +msgid "Track _List..." +msgstr "" + +#: ../src/vikaggregatelayer.c:746 ../src/viktrwlayer.c:4540 +msgid "_Waypoint List..." +msgstr "" + +#: ../src/vikaggregatelayer.c:753 +msgid "Searc_h" +msgstr "" + +#: ../src/vikaggregatelayer.c:759 +msgid "By _Date..." +msgstr "" + +#: ../src/vikaggregatelayer.c:762 +msgid "Find the first item with a specified date" +msgstr "" + +#: ../src/vikaggregatelayer.c:765 +msgid "Load E_xternal Layers" +msgstr "" + +#. Could have a more complicated tooltip that numbers each type of layers, +#. but for now a simple overall count +#: ../src/vikaggregatelayer.c:1011 +#, c-format +msgid "One layer" +msgid_plural "%d layers" +msgstr[0] "" +msgstr[1] "" + +#: ../src/vikaggregatelayer.c:1014 +#, c-format +msgid "Empty" +msgstr "" + +#: ../src/vikdemlayer.c:86 +msgid "SRTM Global 90m (3 arcsec)" +msgstr "" + +#: ../src/vikdemlayer.c:94 +msgid "Absolute height" +msgstr "" + +#: ../src/vikdemlayer.c:95 +msgid "Height gradient" +msgstr "" + +#: ../src/vikdemlayer.c:120 +msgid "DEM Files:" +msgstr "" + +#: ../src/vikdemlayer.c:121 +msgid "Download Source:" +msgstr "Sumber Unduh:" + +#: ../src/vikdemlayer.c:122 +msgid "Min Elev Color:" +msgstr "" + +#: ../src/vikdemlayer.c:123 ../src/viktrwlayer_wpwin.c:207 +msgid "Type:" +msgstr "" + +#: ../src/vikdemlayer.c:124 +msgid "Min Elev:" +msgstr "Tinggi Min:" + +#: ../src/vikdemlayer.c:125 +msgid "Max Elev:" +msgstr "Tinggi Maks:" + +#: ../src/vikdemlayer.c:137 +msgid "_DEM Download" +msgstr "" + +#: ../src/vikdemlayer.c:137 +msgid "DEM Download" +msgstr "" + +#: ../src/vikdemlayer.c:192 +msgid "DEM" +msgstr "" + +#: ../src/vikdemlayer.c:304 +#, c-format +msgid "Number of files: %d" +msgstr "" + +#: ../src/vikdemlayer.c:446 +msgid "DEM Loading" +msgstr "" + +#: ../src/vikdemlayer.c:927 +#, c-format +msgid "No SRTM data available for %f, %f" +msgstr "" + +#: ../src/vikdemlayer.c:948 +#, c-format +msgid "DEM download failure for %f, %f" +msgstr "" + +#: ../src/vikdemlayer.c:954 +#, c-format +msgid "DEM write failure for %s" +msgstr "" + +#. Probably not over any land... +#: ../src/vikdemlayer.c:1201 +msgid "No DEM File Available" +msgstr "" + +#: ../src/vikdemlayer.c:1220 +#, c-format +msgid "" +"\n" +"Source: %s\n" +"\n" +"DEM File: %s\n" +"DEM File Timestamp: %s" +msgstr "" + +#: ../src/vikdemlayer.c:1224 +#, c-format +msgid "" +"Source: %s\n" +"\n" +"No DEM File!" +msgstr "" + +#: ../src/vikdemlayer.c:1264 +#, c-format +msgid "Downloading DEM %s" +msgstr "" + +#: ../src/vikdemlayer.c:1289 +msgid "_Show DEM File Information" +msgstr "" + +#: ../src/vikfileentry.c:72 +msgid "Browse..." +msgstr "Ramban..." + +#: ../src/vikfileentry.c:103 +msgid "Choose file" +msgstr "Pilih berkas" + +#: ../src/vikfileentry.c:120 ../src/vikwindow.c:4372 +msgid "PNG" +msgstr "" + +#: ../src/vikfileentry.c:125 +msgid "TIFF" +msgstr "" + +#: ../src/vikfileentry.c:133 +msgid "MBTiles" +msgstr "" + +#: ../src/vikfileentry.c:142 +msgid "XML" +msgstr "" + +#: ../src/vikfileentry.c:149 +msgid "MML" +msgstr "" + +#: ../src/vikfileentry.c:154 +msgid "MSS" +msgstr "" + +#: ../src/vikfilelist.c:49 +msgid "Choose file(s)" +msgstr "Pilih berkas-berkas" + +#: ../src/vikfilelist.c:182 +msgid "Add..." +msgstr "Tambah..." + +#: ../src/vikfilelist.c:183 +msgid "Delete" +msgstr "Hapus" + +#: ../src/vikgeoreflayer.c:97 +msgid "_Georef Move Map" +msgstr "" + +#: ../src/vikgeoreflayer.c:97 +msgid "Georef Move Map" +msgstr "" + +#: ../src/vikgeoreflayer.c:106 +msgid "Georef Z_oom Tool" +msgstr "" + +#: ../src/vikgeoreflayer.c:106 +msgid "Georef Zoom Tool" +msgstr "" + +#: ../src/vikgeoreflayer.c:117 +msgid "GeoRef Map" +msgstr "" + +#: ../src/vikgeoreflayer.c:214 +msgid "Auto Read World Files:" +msgstr "" + +#: ../src/vikgeoreflayer.c:215 +msgid "" +"Automatically attempt to read associated world file of a new image for a " +"GeoRef layer" +msgstr "" + +#: ../src/vikgeoreflayer.c:511 ../src/vikgeoreflayer.c:797 +#: ../src/vikmapslayer.c:1174 +#, c-format +msgid "Couldn't open image file: %s" +msgstr "" + +#: ../src/vikgeoreflayer.c:607 ../src/vikgeoreflayer.c:633 +msgid "Choose World file" +msgstr "" + +#: ../src/vikgeoreflayer.c:619 +msgid "The World file you requested could not be opened for reading." +msgstr "" + +#: ../src/vikgeoreflayer.c:621 +msgid "Unexpected end of file reading World file." +msgstr "" + +#: ../src/vikgeoreflayer.c:646 +msgid "The file you requested could not be opened for writing." +msgstr "" + +#: ../src/vikgeoreflayer.c:782 +msgid "Lower right corner values may not be consistent with upper right values" +msgstr "" + +#: ../src/vikgeoreflayer.c:806 +#, c-format +msgid "Invalid image size: %s" +msgstr "" + +#: ../src/vikgeoreflayer.c:831 ../src/viklayer.c:561 ../src/vikwindow.c:4891 +msgid "Layer Properties" +msgstr "" + +#: ../src/vikgeoreflayer.c:852 +msgid "World File Parameters:" +msgstr "" + +#: ../src/vikgeoreflayer.c:853 +msgid "Load From File..." +msgstr "Muat Dari Berkas..." + +#: ../src/vikgeoreflayer.c:858 +msgid "Corner pixel easting:" +msgstr "" + +#: ../src/vikgeoreflayer.c:860 +msgid "the UTM \"easting\" value of the upper-left corner pixel of the map" +msgstr "" + +#: ../src/vikgeoreflayer.c:862 +msgid "Corner pixel northing:" +msgstr "" + +#: ../src/vikgeoreflayer.c:864 +msgid "the UTM \"northing\" value of the upper-left corner pixel of the map" +msgstr "" + +#: ../src/vikgeoreflayer.c:866 +msgid "X (easting) scale (mpp): " +msgstr "" + +#: ../src/vikgeoreflayer.c:867 +msgid "Y (northing) scale (mpp): " +msgstr "" + +#: ../src/vikgeoreflayer.c:870 +msgid "the scale of the map in the X direction (meters per pixel)" +msgstr "" + +#: ../src/vikgeoreflayer.c:872 +msgid "the scale of the map in the Y direction (meters per pixel)" +msgstr "" + +#: ../src/vikgeoreflayer.c:874 +msgid "Map Image:" +msgstr "Citra Peta:" + +#: ../src/vikgeoreflayer.c:919 +msgid "Upper left latitude:" +msgstr "" + +#: ../src/vikgeoreflayer.c:921 +msgid "Upper left longitude:" +msgstr "" + +#: ../src/vikgeoreflayer.c:923 +msgid "Lower right latitude:" +msgstr "" + +#: ../src/vikgeoreflayer.c:925 +msgid "Lower right longitude:" +msgstr "" + +#: ../src/vikgeoreflayer.c:937 +msgid "Calculate MPP values from coordinates" +msgstr "" + +#: ../src/vikgeoreflayer.c:938 +msgid "" +"Enter all corner coordinates before calculating the MPP values from the " +"image size" +msgstr "" + +#: ../src/vikgeoreflayer.c:948 +msgid "UTM" +msgstr "" + +#: ../src/vikgeoreflayer.c:949 +msgid "Latitude/Longitude" +msgstr "" + +#: ../src/vikgeoreflayer.c:957 ../src/vikmapniklayer.c:82 +#: ../src/vikmapslayer.c:158 +msgid "Alpha:" +msgstr "" + +#. Now with icons +#: ../src/vikgeoreflayer.c:1062 +msgid "_Zoom to Fit Map" +msgstr "" + +#: ../src/vikgeoreflayer.c:1068 +msgid "_Goto Map Center" +msgstr "" + +#: ../src/vikgeoreflayer.c:1074 +msgid "_Export to World File" +msgstr "" + +#: ../src/vikgoto.c:98 +msgid "No goto tool available." +msgstr "" + +#: ../src/vikgoto.c:295 +msgid "goto" +msgstr "" + +#: ../src/vikgoto.c:297 +msgid "goto provider:" +msgstr "" + +#: ../src/vikgoto.c:312 +msgid "Enter address or place name:" +msgstr "Masukkan alamat atau nama tempat:" + +#: ../src/vikgoto.c:487 +msgid "Locality" +msgstr "" + +#: ../src/vikgpslayer.c:137 +msgid "Data Mode" +msgstr "" + +#: ../src/vikgpslayer.c:139 +msgid "Realtime Tracking Mode" +msgstr "" + +#: ../src/vikgpslayer.c:176 +msgid "Keep vehicle at center" +msgstr "" + +#: ../src/vikgpslayer.c:177 +msgid "Keep vehicle on screen" +msgstr "" + +#: ../src/vikgpslayer.c:178 +msgid "Disable" +msgstr "" + +#: ../src/vikgpslayer.c:218 +msgid "Download Tracks:" +msgstr "" + +#: ../src/vikgpslayer.c:219 +msgid "Upload Tracks:" +msgstr "" + +#: ../src/vikgpslayer.c:220 +msgid "Download Routes:" +msgstr "" + +#: ../src/vikgpslayer.c:221 +msgid "Upload Routes:" +msgstr "" + +#: ../src/vikgpslayer.c:222 +msgid "Download Waypoints:" +msgstr "" + +#: ../src/vikgpslayer.c:223 +msgid "Upload Waypoints:" +msgstr "" + +#: ../src/vikgpslayer.c:225 +msgid "Recording tracks" +msgstr "Mencatat jejak" + +#: ../src/vikgpslayer.c:226 +msgid "Jump to current position on start" +msgstr "" + +#: ../src/vikgpslayer.c:227 +msgid "Moving Map Method:" +msgstr "" + +#: ../src/vikgpslayer.c:228 +msgid "Update Statusbar:" +msgstr "" + +#: ../src/vikgpslayer.c:228 +msgid "Display information in the statusbar on GPS updates" +msgstr "" + +#: ../src/vikgpslayer.c:229 +msgid "Auto Connect" +msgstr "" + +#: ../src/vikgpslayer.c:229 +msgid "Automatically connect to GPSD" +msgstr "" + +#: ../src/vikgpslayer.c:230 +msgid "Gpsd Host:" +msgstr "Host Gpsd:" + +#: ../src/vikgpslayer.c:231 +msgid "Gpsd Port:" +msgstr "Port Gpsd:" + +#: ../src/vikgpslayer.c:232 +msgid "Gpsd Retry Interval (seconds):" +msgstr "Selang Coba Ulang Gpsd (detik):" + +#: ../src/vikgpslayer.c:254 +msgid "GPS" +msgstr "" + +#: ../src/vikgpslayer.c:320 ../src/vikgpslayer.c:1504 +msgid "GPS Download" +msgstr "Unduhan GPS" + +#: ../src/vikgpslayer.c:320 ../src/vikgpslayer.c:1504 ../src/viktrwlayer.c:3993 +msgid "GPS Upload" +msgstr "Unggahan GPS" + +#: ../src/vikgpslayer.c:322 +msgid "GPS Realtime Tracking" +msgstr "" + +#: ../src/vikgpslayer.c:458 +msgid "Connected" +msgstr "" + +#: ../src/vikgpslayer.c:460 +msgid "Disconnected" +msgstr "" + +#: ../src/vikgpslayer.c:554 +msgid "Unknown GPS Protocol" +msgstr "Protokol GPS Tak Dikenal" + +#: ../src/vikgpslayer.c:572 +msgid "Unknown serial port device" +msgstr "Perangkat port serial tak dikenal" + +#: ../src/vikgpslayer.c:691 +#, c-format +msgid "%s: unknown parameter" +msgstr "%s: parameter tak dikenal" + +#. Now with icons +#: ../src/vikgpslayer.c:794 +msgid "_Upload to GPS" +msgstr "" + +#: ../src/vikgpslayer.c:800 +msgid "Download from _GPS" +msgstr "" + +#: ../src/vikgpslayer.c:821 +msgid "Empty _Realtime" +msgstr "" + +#: ../src/vikgpslayer.c:828 +msgid "E_mpty Upload" +msgstr "" + +#: ../src/vikgpslayer.c:834 +msgid "_Empty Download" +msgstr "" + +#: ../src/vikgpslayer.c:840 +msgid "Empty _All" +msgstr "" + +#: ../src/vikgpslayer.c:852 +#, c-format +msgid "Unexpected number of disconnected handlers: %d" +msgstr "" + +#: ../src/vikgpslayer.c:995 +#, c-format +msgid "Uploading %d waypoint..." +msgid_plural "Uploading %d waypoints..." +msgstr[0] "" +msgstr[1] "" + +#: ../src/vikgpslayer.c:1000 +#, c-format +msgid "Uploading %d trackpoint..." +msgid_plural "Uploading %d trackpoints..." +msgstr[0] "" +msgstr[1] "" + +#: ../src/vikgpslayer.c:1005 +#, c-format +msgid "Uploading %d routepoint..." +msgid_plural "Uploading %d routepoints..." +msgstr[0] "" +msgstr[1] "" + +#: ../src/vikgpslayer.c:1034 +#, c-format +msgid "Downloaded %d out of %d waypoint..." +msgid_plural "Downloaded %d out of %d waypoints..." +msgstr[0] "" +msgstr[1] "" + +#: ../src/vikgpslayer.c:1040 +#, c-format +msgid "Downloaded %d out of %d trackpoint..." +msgid_plural "Downloaded %d out of %d trackpoints..." +msgstr[0] "" +msgstr[1] "" + +#: ../src/vikgpslayer.c:1046 +#, c-format +msgid "Downloaded %d out of %d routepoint..." +msgid_plural "Downloaded %d out of %d routepoints..." +msgstr[0] "" +msgstr[1] "" + +#: ../src/vikgpslayer.c:1056 +#, c-format +msgid "Uploaded %d out of %d waypoint..." +msgid_plural "Uploaded %d out of %d waypoints..." +msgstr[0] "" +msgstr[1] "" + +#: ../src/vikgpslayer.c:1062 +#, c-format +msgid "Uploaded %d out of %d trackpoint..." +msgid_plural "Uploaded %d out of %d trackpoints..." +msgstr[0] "" +msgstr[1] "" + +#: ../src/vikgpslayer.c:1068 +#, c-format +msgid "Uploaded %d out of %d routepoint..." +msgid_plural "Uploaded %d out of %d routepoints..." +msgstr[0] "" +msgstr[1] "" + +#: ../src/vikgpslayer.c:1079 +#, c-format +msgid "Downloaded %d waypoint" +msgid_plural "Downloaded %d waypoints" +msgstr[0] "" +msgstr[1] "" + +#: ../src/vikgpslayer.c:1085 +#, c-format +msgid "Downloaded %d trackpoint" +msgid_plural "Downloaded %d trackpoints" +msgstr[0] "" +msgstr[1] "" + +#: ../src/vikgpslayer.c:1091 +#, c-format +msgid "Downloaded %d routepoint" +msgid_plural "Downloaded %d routepoints" +msgstr[0] "" +msgstr[1] "" + +#: ../src/vikgpslayer.c:1101 +#, c-format +msgid "Uploaded %d waypoint" +msgid_plural "Uploaded %d waypoints" +msgstr[0] "" +msgstr[1] "" + +#: ../src/vikgpslayer.c:1107 +#, c-format +msgid "Uploaded %d trackpoint" +msgid_plural "Uploaded %d trackpoints" +msgstr[0] "" +msgstr[1] "" + +#: ../src/vikgpslayer.c:1113 +#, c-format +msgid "Uploaded %d routepoint" +msgid_plural "Uploaded %d routepoints" +msgstr[0] "" +msgstr[1] "" + +#: ../src/vikgpslayer.c:1363 +msgid "Error: No result." +msgstr "" + +#: ../src/vikgpslayer.c:1471 +msgid "Warning - GPS Upload items may overwrite each other" +msgstr "" + +#: ../src/vikgpslayer.c:1506 +msgid "Status: detecting gpsbabel" +msgstr "Status: mendeteksi gpsbabel" + +#: ../src/vikgpslayer.c:1533 +msgid "No GPS items selected for transfer." +msgstr "" + +#: ../src/vikgpslayer.c:1546 +msgid "Could not turn off device." +msgstr "" + +#: ../src/vikgpslayer.c:1589 +msgid "Are you sure you want to delete GPS Upload data?" +msgstr "" + +#: ../src/vikgpslayer.c:1602 +msgid "Are you sure you want to delete GPS Download data?" +msgstr "" + +#: ../src/vikgpslayer.c:1616 +msgid "Are you sure you want to delete GPS Realtime data?" +msgstr "" + +#: ../src/vikgpslayer.c:1630 +msgid "Are you sure you want to delete All GPS data?" +msgstr "" + +#: ../src/vikgpslayer.c:2004 +#, c-format +msgid "" +"Failed to connect to gpsd at %s (port %s)\n" +"Should Viking keep trying (every %d seconds)?" +msgstr "" + +#: ../src/viklayerspanel.c:73 +msgid "C_ut" +msgstr "" + +#: ../src/viklayerspanel.c:74 ../src/vikwindow.c:4882 +msgid "_Copy" +msgstr "Salin" + +#: ../src/viklayerspanel.c:75 ../src/vikwindow.c:4883 +msgid "_Paste" +msgstr "Tempel" + +#: ../src/viklayerspanel.c:76 ../src/vikwindow.c:4884 +msgid "_Delete" +msgstr "Hapus" + +#: ../src/viklayerspanel.c:154 +msgid "New Layer" +msgstr "" + +#: ../src/viklayerspanel.c:347 +msgid "Top Layer" +msgstr "Lapis Puncak" + +#: ../src/viklayerspanel.c:363 +msgid "Add new layer" +msgstr "" + +#: ../src/viklayerspanel.c:370 ../src/vikwindow.c:4884 +msgid "Remove selected layer" +msgstr "" + +#: ../src/viklayerspanel.c:377 +msgid "Move selected layer up" +msgstr "" + +#: ../src/viklayerspanel.c:384 +msgid "Move selected layer down" +msgstr "" + +#: ../src/viklayerspanel.c:391 ../src/vikwindow.c:4881 +msgid "Cut selected layer" +msgstr "" + +#: ../src/viklayerspanel.c:398 ../src/vikwindow.c:4882 +msgid "Copy selected layer" +msgstr "" + +#: ../src/viklayerspanel.c:405 ../src/vikwindow.c:4883 +msgid "" +"Paste layer into selected container layer or otherwise above selected layer" +msgstr "" + +#: ../src/viklayerspanel.c:502 +msgid "New name can not be blank." +msgstr "" + +#: ../src/viklayerspanel.c:751 +msgid "Aggregate Layers have no settable properties." +msgstr "" + +#: ../src/viklayerspanel.c:798 +msgid "You cannot cut the Top Layer." +msgstr "" + +#: ../src/viklayerspanel.c:843 +#, c-format +msgid "Are you sure you want to delete %s?" +msgstr "" + +#: ../src/viklayerspanel.c:863 +msgid "You cannot delete the Top Layer." +msgstr "" + +#: ../src/vikmapniklayer.c:78 +msgid "CSS (MML) Config File:" +msgstr "" + +#: ../src/vikmapniklayer.c:79 +msgid "CartoCSS configuration file" +msgstr "" + +#: ../src/vikmapniklayer.c:80 +msgid "XML Config File:" +msgstr "" + +#: ../src/vikmapniklayer.c:81 +msgid "Mapnik XML configuration file" +msgstr "" + +#: ../src/vikmapniklayer.c:84 +msgid "Use File Cache:" +msgstr "" + +#: ../src/vikmapniklayer.c:86 +msgid "File Cache Directory:" +msgstr "" + +#: ../src/vikmapniklayer.c:122 +msgid "_Mapnik Features" +msgstr "" + +#: ../src/vikmapniklayer.c:122 +msgid "Mapnik Features" +msgstr "" + +#: ../src/vikmapniklayer.c:140 +msgid "Mapnik Rendering" +msgstr "" + +#. Changing these values only applies before first mapnik layer is 'created' +#: ../src/vikmapniklayer.c:258 +msgid "Plugins Directory:" +msgstr "" + +#: ../src/vikmapniklayer.c:258 ../src/vikmapniklayer.c:259 +#: ../src/vikmapniklayer.c:260 ../src/vikmapniklayer.c:261 +msgid "You need to restart Viking for a change to this value to be used" +msgstr "" + +#: ../src/vikmapniklayer.c:259 +msgid "Fonts Directory:" +msgstr "" + +#: ../src/vikmapniklayer.c:260 +msgid "Recurse Fonts Directory:" +msgstr "" + +#: ../src/vikmapniklayer.c:261 +msgid "Rerender Timeout (hours):" +msgstr "" + +#. Changeable any time +#: ../src/vikmapniklayer.c:263 +msgid "CartoCSS:" +msgstr "" + +#: ../src/vikmapniklayer.c:263 +msgid "The program to convert CartoCSS files into Mapnik XML" +msgstr "" + +#: ../src/vikmapniklayer.c:506 +msgid "Running" +msgstr "" + +#: ../src/vikmapniklayer.c:525 +#, c-format +msgid "" +"Error running carto command:\n" +"%s" +msgstr "" + +#: ../src/vikmapniklayer.c:561 +msgid " completed in " +msgstr "" + +#: ../src/vikmapniklayer.c:561 +msgid "seconds" +msgstr "" + +#: ../src/vikmapniklayer.c:611 ../src/vikmapniklayer.c:979 +#, c-format +msgid "" +"Mapnik error loading configuration file:\n" +"%s" +msgstr "" + +#: ../src/vikmapniklayer.c:749 +#, c-format +msgid "Mapnik Render %d:%d:%d %s" +msgstr "" + +#: ../src/vikmapniklayer.c:840 +msgid "Mapnik Rendering must be in Mercator mode" +msgstr "" + +#: ../src/vikmapniklayer.c:997 +msgid "Mapnik Information" +msgstr "" + +#: ../src/vikmapniklayer.c:1031 +msgid "_Flush Memory Cache" +msgstr "" + +#: ../src/vikmapniklayer.c:1044 +msgid "_Run Carto Command" +msgstr "" + +#: ../src/vikmapniklayer.c:1102 ../src/vikmapslayer.c:2029 +#, c-format +msgid "Tile File Timestamp: %s" +msgstr "" + +#: ../src/vikmapniklayer.c:1105 ../src/vikmapslayer.c:2032 +msgid "Tile File Timestamp: Not Available" +msgstr "" + +#: ../src/vikmapniklayer.c:1120 +#, c-format +msgid "Rendering time %.2f seconds" +msgstr "" + +#: ../src/vikmapniklayer.c:1124 ../src/vikmapslayer.c:2042 +msgid "Tile Information" +msgstr "" + +#: ../src/vikmapniklayer.c:1145 +msgid "_Rerender Tile" +msgstr "" + +#: ../src/vikmapniklayer.c:1150 +msgid "_Info" +msgstr "" + +#. ******* MAPZOOMS ******** +#: ../src/vikmapslayer.c:96 +msgid "Use Viking Zoom Level" +msgstr "" + +#: ../src/vikmapslayer.c:146 +msgid "OSM" +msgstr "" + +#. NB mode => id - But can't break file format just to rename something better +#: ../src/vikmapslayer.c:152 +msgid "Map Type:" +msgstr "Tipe Peta:" + +#: ../src/vikmapslayer.c:153 +msgid "Maps Directory:" +msgstr "" + +#: ../src/vikmapslayer.c:154 +msgid "Cache Layout:" +msgstr "" + +#: ../src/vikmapslayer.c:155 +msgid "This determines the tile storage layout on disk" +msgstr "" + +#: ../src/vikmapslayer.c:156 +msgid "Map File:" +msgstr "" + +#: ../src/vikmapslayer.c:157 +msgid "An MBTiles file. Only applies when the map type method is 'MBTiles'" +msgstr "" + +#: ../src/vikmapslayer.c:159 +msgid "Control the Alpha value for transparency effects" +msgstr "" + +#: ../src/vikmapslayer.c:160 +msgid "Autodownload maps:" +msgstr "" + +#: ../src/vikmapslayer.c:161 +msgid "Autodownload Only Gets Missing Maps:" +msgstr "" + +#: ../src/vikmapslayer.c:162 +msgid "" +"Using this option avoids attempting to update already acquired tiles. This " +"can be useful if you want to restrict the network usage, without having to " +"resort to manual control. Only applies when 'Autodownload Maps' is on." +msgstr "" + +#: ../src/vikmapslayer.c:163 +msgid "Zoom Level:" +msgstr "Tingkat Zum:" + +#: ../src/vikmapslayer.c:164 +msgid "" +"Determines the method of displaying map tiles for the current zoom level. " +"'Viking Zoom Level' uses the best matching level, otherwise setting a fixed " +"value will always use map tiles of the specified value regardless of the " +"actual zoom level." +msgstr "" + +#: ../src/vikmapslayer.c:197 +msgid "_Maps Download" +msgstr "" + +#: ../src/vikmapslayer.c:197 +msgid "Maps Download" +msgstr "" + +#: ../src/vikmapslayer.c:213 ../src/vikutils.c:895 +msgid "Map" +msgstr "Peta" + +#: ../src/vikmapslayer.c:306 +msgid "Default map layer directory:" +msgstr "" + +#: ../src/vikmapslayer.c:306 +msgid "Choose a directory to store cached Map tiles for this layer" +msgstr "" + +#: ../src/vikmapslayer.c:436 ../src/vikmapslayer.c:633 +msgid "Unknown map type" +msgstr "" + +#: ../src/vikmapslayer.c:664 +msgid "Unknown Map Zoom" +msgstr "" + +#: ../src/vikmapslayer.c:833 +#, c-format +msgid "Failed to open MBTiles file: %s" +msgstr "" + +#: ../src/vikmapslayer.c:856 +#, c-format +msgid "" +"New map cannot be displayed in the current drawmode.\n" +"Select \"%s\" from View menu to view it." +msgstr "" + +#: ../src/vikmapslayer.c:1314 +#, c-format +msgid "" +"Cowardly refusing to draw tiles or existence of tiles beyond %d zoom out " +"factor" +msgstr "" + +#. TODO: ?? count up the number of download errors somehow... +#: ../src/vikmapslayer.c:1667 +msgid "Failed to download tile" +msgstr "" + +#: ../src/vikmapslayer.c:1673 +msgid "Unable to save tile" +msgstr "" + +#: ../src/vikmapslayer.c:1799 +#, c-format +msgid "Redownloading up to %d %s map..." +msgid_plural "Redownloading up to %d %s maps..." +msgstr[0] "" +msgstr[1] "" + +#: ../src/vikmapslayer.c:1801 +#, c-format +msgid "Redownloading %d %s map..." +msgid_plural "Redownloading %d %s maps..." +msgstr[0] "" +msgstr[1] "" + +#: ../src/vikmapslayer.c:1805 ../src/vikmapslayer.c:1890 +#, c-format +msgid "Downloading %d %s map..." +msgid_plural "Downloading %d %s maps..." +msgstr[0] "" +msgstr[1] "" + +#: ../src/vikmapslayer.c:1969 +msgid "YES" +msgstr "" + +#: ../src/vikmapslayer.c:1973 ../src/vikmapslayer.c:1977 +msgid "NO" +msgstr "" + +#. NB Also handles .jpg automatically due to pixbuf_new_from () support - although just print png for now. +#: ../src/vikmapslayer.c:1980 +#, c-format +msgid "Source: %s (%d%s%d%s%d.%s %s)" +msgstr "" + +#: ../src/vikmapslayer.c:1983 +msgid "Source: Not available" +msgstr "" + +#: ../src/vikmapslayer.c:2000 +msgid "Source: file://" +msgstr "" + +#: ../src/vikmapslayer.c:2012 +#, c-format +msgid "Source: %s" +msgstr "" + +#: ../src/vikmapslayer.c:2038 +#, c-format +msgid "Tile File: %s [Not Available]" +msgstr "" + +#: ../src/vikmapslayer.c:2086 +msgid "Redownload _Bad Map(s)" +msgstr "" + +#: ../src/vikmapslayer.c:2090 +msgid "Redownload _New Map(s)" +msgstr "" + +#: ../src/vikmapslayer.c:2094 +msgid "Redownload _All Map(s)" +msgstr "" + +#: ../src/vikmapslayer.c:2099 +msgid "_Show Tile Information" +msgstr "" + +#: ../src/vikmapslayer.c:2166 +#, c-format +msgid "" +"Wrong drawmode for this map.\n" +"Select \"%s\" from View menu and try again." +msgstr "" + +#: ../src/vikmapslayer.c:2171 +msgid "Wrong zoom level for this map." +msgstr "" + +#: ../src/vikmapslayer.c:2334 +msgid "Zoom Start:" +msgstr "" + +#: ../src/vikmapslayer.c:2341 +msgid "Zoom End:" +msgstr "" + +#: ../src/vikmapslayer.c:2347 +msgid "Download Maps Method:" +msgstr "" + +#. redownload method - needs to align with REDOWNLOAD* macro values +#: ../src/vikmapslayer.c:2419 +msgid "Missing" +msgstr "" + +#: ../src/vikmapslayer.c:2419 +msgid "Bad" +msgstr "" + +#: ../src/vikmapslayer.c:2419 +msgid "New" +msgstr "" + +#: ../src/vikmapslayer.c:2419 +msgid "Reload All" +msgstr "" + +#: ../src/vikmapslayer.c:2421 +msgid "Download for Zoom Levels" +msgstr "" + +#: ../src/vikmapslayer.c:2461 +#, c-format +msgid "" +"You are not allowed to download more than %d tiles in one go (requested %d)" +msgstr "" + +#: ../src/vikmapslayer.c:2469 +#, c-format +msgid "Do you really want to download %d tiles?" +msgstr "" + +#. Now with icons +#: ../src/vikmapslayer.c:2509 +msgid "Download _Missing Onscreen Maps" +msgstr "" + +#: ../src/vikmapslayer.c:2516 +msgid "Download _New Onscreen Maps" +msgstr "" + +#: ../src/vikmapslayer.c:2523 +msgid "Reload _All Onscreen Maps" +msgstr "" + +#: ../src/vikmapslayer.c:2529 +msgid "Download Maps in _Zoom Levels..." +msgstr "" + +#: ../src/vikmapslayer.c:2539 +#, fuzzy +msgid "_Open MBTiles Files" +msgstr "Buka berkas" + +#: ../src/vikmapslayer.c:2554 +msgid "Flush Map Cache" +msgstr "" + +#: ../src/vikrouting.c:54 +msgid "Default engine:" +msgstr "" + +#: ../src/vikrouting.c:68 +msgid "Routing" +msgstr "" + +#: ../src/viktreeview.c:347 +msgid "Layer Name" +msgstr "Nama Lapisan" + +#: ../src/viktreeview.c:924 +#, c-format +msgid "delete data from %s\n" +msgstr "" + +#: ../src/viktrwlayer.c:427 +msgid "Create _Waypoint" +msgstr "" + +#: ../src/viktrwlayer.c:427 +msgid "Create Waypoint" +msgstr "" + +#: ../src/viktrwlayer.c:437 +#, fuzzy +msgid "Edit _Track" +msgstr "Tambah Trek" + +#: ../src/viktrwlayer.c:437 +#, fuzzy +msgid "Edit Track" +msgstr "Tambah Trek" + +#: ../src/viktrwlayer.c:449 +msgid "Edit _Route" +msgstr "" + +#: ../src/viktrwlayer.c:449 +msgid "Edit Route" +msgstr "" + +#: ../src/viktrwlayer.c:460 +msgid "Route _Finder" +msgstr "" + +#: ../src/viktrwlayer.c:460 +msgid "Route Finder" +msgstr "" + +#: ../src/viktrwlayer.c:471 +msgid "Splitter" +msgstr "" + +#: ../src/viktrwlayer.c:482 +msgid "_Edit Waypoint" +msgstr "" + +#: ../src/viktrwlayer.c:482 +msgid "Edit Waypoint" +msgstr "" + +#: ../src/viktrwlayer.c:495 +msgid "Edit Trac_kpoint" +msgstr "" + +#: ../src/viktrwlayer.c:495 +msgid "Edit Trackpoint" +msgstr "" + +#. a pixbuf for this one is already made globally available +#: ../src/viktrwlayer.c:508 +msgid "Show P_icture" +msgstr "" + +#: ../src/viktrwlayer.c:508 +msgid "Show Picture" +msgstr "" + +#: ../src/viktrwlayer.c:531 +msgid "Waypoint Images" +msgstr "" + +#: ../src/viktrwlayer.c:531 +msgid "Tracks Advanced" +msgstr "" + +#: ../src/viktrwlayer.c:531 +msgid "Metadata" +msgstr "" + +#: ../src/viktrwlayer.c:531 +msgid "Filesystem" +msgstr "" + +#: ../src/viktrwlayer.c:534 +msgid "Draw by Track" +msgstr "" + +#: ../src/viktrwlayer.c:534 +msgid "Draw by Speed" +msgstr "" + +#: ../src/viktrwlayer.c:534 +msgid "All Tracks Same Color" +msgstr "" + +#: ../src/viktrwlayer.c:535 +msgid "Filled Square" +msgstr "" + +#: ../src/viktrwlayer.c:535 +msgid "Square" +msgstr "Kotak" + +#: ../src/viktrwlayer.c:535 +msgid "Circle" +msgstr "Bulat" + +#: ../src/viktrwlayer.c:535 +msgid "X" +msgstr "X" + +#: ../src/viktrwlayer.c:561 +msgid "Extra Extra Small" +msgstr "" + +#: ../src/viktrwlayer.c:562 +msgid "Extra Small" +msgstr "" + +#: ../src/viktrwlayer.c:566 +msgid "Extra Large" +msgstr "" + +#: ../src/viktrwlayer.c:567 +msgid "Extra Extra Large" +msgstr "" + +#: ../src/viktrwlayer.c:573 +msgid "Name Ascending" +msgstr "" + +#: ../src/viktrwlayer.c:574 +msgid "Name Descending" +msgstr "" + +#: ../src/viktrwlayer.c:582 ../src/viktrwlayer_propwin.c:3319 +msgid "No" +msgstr "" + +#: ../src/viktrwlayer.c:583 +msgid "Yes" +msgstr "" + +#: ../src/viktrwlayer.c:584 +msgid "No write" +msgstr "" + +#: ../src/viktrwlayer.c:649 ../src/viktrwlayer.c:673 +msgid "Draw Labels" +msgstr "" + +#: ../src/viktrwlayer.c:650 +msgid "Note: the individual track controls what labels may be displayed" +msgstr "" + +#: ../src/viktrwlayer.c:651 +msgid "Track Labels Font Size:" +msgstr "" + +#: ../src/viktrwlayer.c:652 +msgid "Track Drawing Mode:" +msgstr "" + +#: ../src/viktrwlayer.c:653 +msgid "All Tracks Color:" +msgstr "" + +#: ../src/viktrwlayer.c:654 +msgid "The color used when 'All Tracks Same Color' drawing mode is selected" +msgstr "" + +#: ../src/viktrwlayer.c:655 +msgid "Draw Track Lines" +msgstr "" + +#: ../src/viktrwlayer.c:656 +msgid "Track Thickness:" +msgstr "" + +#: ../src/viktrwlayer.c:657 +msgid "Draw Track Direction" +msgstr "" + +#: ../src/viktrwlayer.c:658 +msgid "Direction Size:" +msgstr "" + +#: ../src/viktrwlayer.c:659 +msgid "Draw Trackpoints" +msgstr "" + +#: ../src/viktrwlayer.c:660 +msgid "Trackpoint Size:" +msgstr "" + +#: ../src/viktrwlayer.c:661 +msgid "Draw Elevation" +msgstr "" + +#: ../src/viktrwlayer.c:662 +msgid "Draw Elevation Height %:" +msgstr "" + +#: ../src/viktrwlayer.c:663 +msgid "Draw Stops" +msgstr "" + +#: ../src/viktrwlayer.c:664 +msgid "" +"Whether to draw a marker when trackpoints are at the same position but over " +"the minimum stop length apart in time" +msgstr "" + +#: ../src/viktrwlayer.c:665 +msgid "Min Stop Length (seconds):" +msgstr "" + +#: ../src/viktrwlayer.c:667 +msgid "Track BG Thickness:" +msgstr "" + +#: ../src/viktrwlayer.c:668 +msgid "Track Background Color" +msgstr "" + +#: ../src/viktrwlayer.c:669 +msgid "Draw by Speed Factor (%):" +msgstr "" + +#: ../src/viktrwlayer.c:670 +msgid "" +"The percentage factor away from the average speed determining the color used" +msgstr "" + +#: ../src/viktrwlayer.c:671 +msgid "Track Sort Order:" +msgstr "" + +#: ../src/viktrwlayer.c:674 +msgid "Waypoint Font Size:" +msgstr "" + +#: ../src/viktrwlayer.c:675 +msgid "Waypoint Color:" +msgstr "" + +#: ../src/viktrwlayer.c:676 +msgid "Waypoint Text:" +msgstr "" + +#: ../src/viktrwlayer.c:677 +msgid "Background:" +msgstr "" + +#: ../src/viktrwlayer.c:678 +msgid "Fake BG Color Translucency:" +msgstr "" + +#: ../src/viktrwlayer.c:679 +msgid "Waypoint marker:" +msgstr "" + +#: ../src/viktrwlayer.c:680 +msgid "Waypoint size:" +msgstr "" + +#: ../src/viktrwlayer.c:681 +msgid "Draw Waypoint Symbols:" +msgstr "" + +#: ../src/viktrwlayer.c:682 +msgid "Waypoint Sort Order:" +msgstr "" + +#: ../src/viktrwlayer.c:684 +msgid "Draw Waypoint Images" +msgstr "" + +#: ../src/viktrwlayer.c:685 +msgid "Image Size (pixels):" +msgstr "" + +#: ../src/viktrwlayer.c:686 +msgid "Image Alpha:" +msgstr "" + +#: ../src/viktrwlayer.c:687 +msgid "Image Memory Cache Size:" +msgstr "" + +#: ../src/viktrwlayer.c:690 +msgid "Author" +msgstr "" + +#: ../src/viktrwlayer.c:691 +msgid "Creation Time" +msgstr "" + +#: ../src/viktrwlayer.c:692 +msgid "Keywords" +msgstr "" + +#: ../src/viktrwlayer.c:693 +msgid "External layer:" +msgstr "" + +#: ../src/viktrwlayer.c:693 +msgid "" +"Layer data stored in the Viking file, in an external file, or in an external " +"file but changes are not written to the file (file only loaded at startup)" +msgstr "" + +#: ../src/viktrwlayer.c:694 +msgid "Save layer as:" +msgstr "" + +#: ../src/viktrwlayer.c:694 +msgid "Specify where layer should be saved. Overwrites file if it exists." +msgstr "" + +#: ../src/viktrwlayer.c:798 +msgid "TrackWaypoint" +msgstr "" + +#: ../src/viktrwlayer.c:1999 ../src/viktrwlayer_propwin.c:1469 +#: ../src/viktrwlayer_propwin.c:1471 ../src/vikutils.c:299 +#: ../src/vikutils.c:326 +msgid "miles" +msgstr "" + +#: ../src/viktrwlayer.c:2002 ../src/viktrwlayer_propwin.c:1475 +#: ../src/viktrwlayer_propwin.c:1477 ../src/vikutils.c:303 +#: ../src/vikutils.c:330 +msgid "NM" +msgstr "" + +#. VIK_UNITS_DISTANCE_KILOMETRES: +#: ../src/viktrwlayer.c:2006 ../src/viktrwlayer_propwin.c:1482 +#: ../src/viktrwlayer_propwin.c:1484 ../src/vikutils.c:308 +#: ../src/vikutils.c:335 +msgid "km" +msgstr "" + +#: ../src/viktrwlayer.c:2121 +msgid "start/end" +msgstr "" + +#: ../src/viktrwlayer.c:2133 +msgid "start" +msgstr "" + +#: ../src/viktrwlayer.c:2142 +msgid "end" +msgstr "" + +#: ../src/viktrwlayer.c:3103 +#, c-format +msgid " in %d:%02d hrs:mins" +msgstr "" + +#: ../src/viktrwlayer.c:3107 +#, c-format +msgid "" +"\n" +"%sTotal Length %.1f %s%s" +msgstr "" + +#: ../src/viktrwlayer.c:3131 +#, c-format +msgid "" +"\n" +"Total route length %.1f %s" +msgstr "" + +#: ../src/viktrwlayer.c:3136 +#, c-format +msgid "Tracks: %d - Waypoints: %d - Routes: %d%s%s" +msgstr "" + +#: ../src/viktrwlayer.c:3155 +#, c-format +msgid "Tracks: %d" +msgstr "" + +#: ../src/viktrwlayer.c:3165 +#, c-format +msgid "Routes: %d" +msgstr "" + +#: ../src/viktrwlayer.c:3195 +#, c-format +msgid "- %d:%02d hrs:mins" +msgstr "" + +#: ../src/viktrwlayer.c:3202 +#, c-format +msgid "%s%.1f km %s" +msgstr "" + +#: ../src/viktrwlayer.c:3205 +#, c-format +msgid "%s%.1f miles %s" +msgstr "" + +#: ../src/viktrwlayer.c:3208 +#, c-format +msgid "%s%.1f NM %s" +msgstr "" + +#: ../src/viktrwlayer.c:3222 +#, c-format +msgid "Waypoints: %d" +msgstr "" + +#: ../src/viktrwlayer.c:3279 +#, c-format +msgid "Wpt: Alt %dft" +msgstr "" + +#. VIK_UNITS_HEIGHT_METRES: +#: ../src/viktrwlayer.c:3283 +#, c-format +msgid "Wpt: Alt %dm" +msgstr "" + +#. Add comment if available +#: ../src/viktrwlayer.c:3298 +#, c-format +msgid "%s | %s %s | Comment: %s" +msgstr "" + +#: ../src/viktrwlayer.c:3300 +#, c-format +msgid "%s | %s %s" +msgstr "" + +#: ../src/viktrwlayer.c:3562 ../src/viktrwlayer.c:3591 +msgid "This layer has no waypoints or trackpoints." +msgstr "" + +#: ../src/viktrwlayer.c:3598 ../src/viktrwlayer.c:3607 +#: ../src/viktrwlayer.c:3616 ../src/viktrwlayer.c:3625 +#: ../src/viktrwlayer.c:3634 ../src/viktrwlayer.c:3642 +msgid "Export Layer" +msgstr "" + +#: ../src/viktrwlayer.c:3671 +msgid "Export Route as GPX" +msgstr "" + +#: ../src/viktrwlayer.c:3673 +msgid "Export Track as GPX" +msgstr "" + +#: ../src/viktrwlayer.c:3693 +msgid "Find" +msgstr "" + +#: ../src/viktrwlayer.c:3703 +msgid "Waypoint Name:" +msgstr "" + +#: ../src/viktrwlayer.c:3720 +msgid "Waypoint not found in this layer." +msgstr "" + +#: ../src/viktrwlayer.c:3989 +msgid "Can not upload invisible track." +msgstr "" + +#: ../src/viktrwlayer.c:4082 ../src/viktrwlayer.c:10512 +msgid "Track" +msgstr "" + +#: ../src/viktrwlayer.c:4107 ../src/viktrwlayer.c:10599 +msgid "Route" +msgstr "" + +#: ../src/viktrwlayer.c:4194 +msgid "Externa_l" +msgstr "" + +#: ../src/viktrwlayer.c:4216 ../src/viktrwlayer.c:8456 +#: ../src/viktrwlayer.c:8574 +msgid "_Finish Route" +msgstr "" + +#: ../src/viktrwlayer.c:4218 ../src/viktrwlayer.c:8380 +#: ../src/viktrwlayer.c:8572 +msgid "_Finish Track" +msgstr "" + +#. Now with icons +#: ../src/viktrwlayer.c:4230 +msgid "_View Layer" +msgstr "" + +#: ../src/viktrwlayer.c:4237 +msgid "V_iew" +msgstr "" + +#: ../src/viktrwlayer.c:4243 +msgid "View All _Tracks" +msgstr "" + +#: ../src/viktrwlayer.c:4248 +msgid "View All _Routes" +msgstr "" + +#: ../src/viktrwlayer.c:4253 +msgid "View All _Waypoints" +msgstr "" + +#: ../src/viktrwlayer.c:4258 +msgid "_Goto Center of Layer" +msgstr "" + +#: ../src/viktrwlayer.c:4264 ../src/viktrwlayer.c:8321 +msgid "Goto _Waypoint..." +msgstr "" + +#: ../src/viktrwlayer.c:4270 +msgid "_Export Layer" +msgstr "" + +#: ../src/viktrwlayer.c:4276 +msgid "Export as GPS_Point..." +msgstr "" + +#: ../src/viktrwlayer.c:4281 +msgid "Export as GPS_Mapper..." +msgstr "" + +#: ../src/viktrwlayer.c:4286 +msgid "Export as _GPX..." +msgstr "" + +#: ../src/viktrwlayer.c:4292 +msgid "Export as _KML..." +msgstr "" + +#: ../src/viktrwlayer.c:4299 +msgid "Export as GEO_JSON..." +msgstr "" + +#: ../src/viktrwlayer.c:4306 +msgid "Export via GPSbabel..." +msgstr "" + +#: ../src/viktrwlayer.c:4312 +#, c-format +msgid "Open with External Program_1: %s" +msgstr "" + +#: ../src/viktrwlayer.c:4319 +#, c-format +msgid "Open with External Program_2: %s" +msgstr "" + +#: ../src/viktrwlayer.c:4327 ../src/vikwindow.c:4825 +msgid "_New" +msgstr "Baru" + +#: ../src/viktrwlayer.c:4333 +msgid "New _Waypoint..." +msgstr "" + +#: ../src/viktrwlayer.c:4339 +msgid "New _Track" +msgstr "" + +#: ../src/viktrwlayer.c:4347 +msgid "New _Route" +msgstr "" + +#: ../src/viktrwlayer.c:4356 ../src/viktrwlayer.c:8232 +#: ../src/viktrwlayer.c:9003 +msgid "Geotag _Images..." +msgstr "" + +#: ../src/viktrwlayer.c:4363 +msgid "_Acquire" +msgstr "" + +#: ../src/viktrwlayer.c:4369 ../src/vikwindow.c:4904 +msgid "From _GPS..." +msgstr "Dari _GPS..." + +#. FIXME: only add menu when at least a routing engine has support for Directions +#: ../src/viktrwlayer.c:4375 +msgid "From _Directions..." +msgstr "" + +#: ../src/viktrwlayer.c:4381 +msgid "From _OSM Traces..." +msgstr "" + +#: ../src/viktrwlayer.c:4386 +msgid "From _My OSM Traces..." +msgstr "" + +#: ../src/viktrwlayer.c:4392 ../src/vikwindow.c:4844 +msgid "From _URL..." +msgstr "" + +#: ../src/viktrwlayer.c:4399 ../src/vikwindow.c:4846 +msgid "From _Wikipedia Waypoints" +msgstr "" + +#: ../src/viktrwlayer.c:4405 +msgid "Within _Layer Bounds" +msgstr "" + +#: ../src/viktrwlayer.c:4411 +msgid "Within _Current View" +msgstr "" + +#: ../src/viktrwlayer.c:4419 +msgid "From Geo_caching..." +msgstr "" + +#: ../src/viktrwlayer.c:4426 ../src/vikwindow.c:4842 +msgid "From Geotagged _Images..." +msgstr "" + +#: ../src/viktrwlayer.c:4433 +msgid "From _File..." +msgstr "" + +#: ../src/viktrwlayer.c:4436 ../src/vikwindow.c:4905 +msgid "Import File With GPS_Babel..." +msgstr "" + +#: ../src/viktrwlayer.c:4443 ../src/viktrwlayer.c:8905 +msgid "_Upload" +msgstr "" + +#: ../src/viktrwlayer.c:4449 +msgid "Upload to _GPS..." +msgstr "" + +#: ../src/viktrwlayer.c:4456 ../src/viktrwlayer.c:8973 +msgid "Upload to _OSM..." +msgstr "" + +#: ../src/viktrwlayer.c:4464 +msgid "De_lete" +msgstr "" + +#: ../src/viktrwlayer.c:4470 +msgid "Delete All _Tracks" +msgstr "" + +#: ../src/viktrwlayer.c:4477 +msgid "Delete Tracks _From Selection..." +msgstr "" + +#: ../src/viktrwlayer.c:4484 ../src/viktrwlayer.c:8481 +msgid "Delete _All Routes" +msgstr "" + +#: ../src/viktrwlayer.c:4491 ../src/viktrwlayer.c:8487 +msgid "_Delete Routes From Selection..." +msgstr "" + +#: ../src/viktrwlayer.c:4498 +msgid "Delete All _Waypoints" +msgstr "" + +#: ../src/viktrwlayer.c:4505 +msgid "Delete Waypoints From _Selection..." +msgstr "" + +#: ../src/viktrwlayer.c:4512 ../src/viktrwlayer.c:8339 +msgid "Delete Duplicate Waypoints" +msgstr "" + +#: ../src/viktrwlayer.c:5198 +#, c-format +msgid "Are you sure you want to delete all tracks in %s?" +msgstr "" + +#: ../src/viktrwlayer.c:5211 +#, c-format +msgid "Are you sure you want to delete all routes in %s?" +msgstr "" + +#: ../src/viktrwlayer.c:5221 +#, c-format +msgid "Are you sure you want to delete all waypoints in %s?" +msgstr "" + +#: ../src/viktrwlayer.c:5238 +#, c-format +msgid "Are you sure you want to delete the waypoint \"%s\"?" +msgstr "" + +#: ../src/viktrwlayer.c:5254 +#, c-format +msgid "Are you sure you want to delete the track \"%s\"?" +msgstr "" + +#: ../src/viktrwlayer.c:5271 +#, c-format +msgid "Are you sure you want to delete the route \"%s\"?" +msgstr "" + +#: ../src/viktrwlayer.c:5527 ../src/viktrwlayer.c:6373 +msgid "" +"Converting a track to a route removes extra track data such as segments, " +"timestamps, etc...\n" +"Do you want to continue?" +msgstr "" + +#: ../src/viktrwlayer.c:5631 +msgid "No DEM layers available, thus no DEM values can be applied." +msgstr "" + +#: ../src/viktrwlayer.c:5651 ../src/viktrwlayer.c:5692 +#, c-format +msgid "%ld point adjusted" +msgid_plural "%ld points adjusted" +msgstr[0] "" +msgstr[1] "" + +#: ../src/viktrwlayer.c:5736 +#, c-format +msgid "%ld waypoint changed" +msgid_plural "%ld waypoints changed" +msgstr[0] "" +msgstr[1] "" + +#: ../src/viktrwlayer.c:5917 +#, c-format +msgid "" +"Refining a track with many points (%d) is unlikely to yield sensible " +"results. Do you want to Continue?" +msgstr "" + +#. Select engine from dialog +#: ../src/viktrwlayer.c:5925 +msgid "Refine Route with Routing Engine..." +msgstr "" + +#: ../src/viktrwlayer.c:5933 +msgid "Select routing engine" +msgstr "" + +#: ../src/viktrwlayer.c:6158 +msgid "Failed. No other tracks with timestamps in this layer found" +msgstr "" + +#: ../src/viktrwlayer.c:6160 +msgid "Failed. No other tracks without timestamps in this layer found" +msgstr "" + +#: ../src/viktrwlayer.c:6179 +msgid "Merge with..." +msgstr "" + +#: ../src/viktrwlayer.c:6180 +msgid "Select route to merge with" +msgstr "" + +#: ../src/viktrwlayer.c:6180 +msgid "Select track to merge with" +msgstr "" + +#: ../src/viktrwlayer.c:6264 ../src/viktrwlayer.c:6346 +msgid "Append Route" +msgstr "" + +#: ../src/viktrwlayer.c:6264 ../src/viktrwlayer.c:6346 +msgid "Append Track" +msgstr "" + +#: ../src/viktrwlayer.c:6265 +msgid "Select the route to append after the current route" +msgstr "" + +#: ../src/viktrwlayer.c:6266 +msgid "Select the track to append after the current track" +msgstr "" + +#: ../src/viktrwlayer.c:6347 +msgid "Select the track to append after the current route" +msgstr "" + +#: ../src/viktrwlayer.c:6348 +msgid "Select the route to append after the current track" +msgstr "" + +#: ../src/viktrwlayer.c:6414 +#, c-format +msgid "%d segment merged" +msgid_plural "%d segments merged" +msgstr[0] "" +msgstr[1] "" + +#: ../src/viktrwlayer.c:6430 +msgid "Failed. This track does not have timestamp" +msgstr "" + +#: ../src/viktrwlayer.c:6442 +msgid "Failed. No other track in this layer has timestamp" +msgstr "" + +#: ../src/viktrwlayer.c:6449 +msgid "Merge Threshold..." +msgstr "" + +#: ../src/viktrwlayer.c:6450 +msgid "Merge when time between tracks less than:" +msgstr "" + +#: ../src/viktrwlayer.c:6580 +msgid "Split Threshold..." +msgstr "" + +#: ../src/viktrwlayer.c:6581 +msgid "Split when time between trackpoints exceeds:" +msgstr "" + +#: ../src/viktrwlayer.c:6598 +#, c-format +msgid "" +"Can not split track due to trackpoints not ordered in time - such as at %s.\n" +"\n" +"Goto this trackpoint?" +msgstr "" + +#: ../src/viktrwlayer.c:6668 +msgid "Split Every Nth Point" +msgstr "" + +#: ../src/viktrwlayer.c:6669 +msgid "Split on every Nth point:" +msgstr "" + +#: ../src/viktrwlayer.c:6779 +msgid "Can not split track as it has no segments" +msgstr "" + +#: ../src/viktrwlayer.c:6861 ../src/viktrwlayer.c:6891 +#, c-format +msgid "Deleted %ld point" +msgid_plural "Deleted %ld points" +msgstr[0] "" +msgstr[1] "" + +#: ../src/viktrwlayer.c:6966 ../src/viktrwlayer.c:10989 +#: ../src/viktrwlayer_waypointlist.c:214 +#, c-format +msgid "Could not launch %s to open file." +msgstr "" + +#: ../src/viktrwlayer.c:6992 ../src/viktrwlayer.c:7113 +msgid "This track has no date information." +msgstr "" + +#: ../src/viktrwlayer.c:7006 ../src/viktrwlayer.c:7136 +msgid "This waypoint has no date information." +msgstr "" + +#: ../src/viktrwlayer.c:7030 +#, c-format +msgid "Could not launch %s" +msgstr "" + +#: ../src/viktrwlayer.c:7269 +msgid "Internal Error in vik_trw_layer_uniquify_tracks" +msgstr "" + +#: ../src/viktrwlayer.c:7374 ../src/viktrwlayer.c:7424 +#: ../src/viktrwlayer.c:7587 +msgid "" +"Multiple entries with the same name exist. This method only works with " +"unique names. Force unique names now?" +msgstr "" + +#: ../src/viktrwlayer.c:7385 +msgid "No tracks found" +msgstr "" + +#: ../src/viktrwlayer.c:7393 ../src/viktrwlayer.c:7443 +#: ../src/viktrwlayer.c:7607 +msgid "Delete Selection" +msgstr "" + +#: ../src/viktrwlayer.c:7394 +msgid "Select tracks to delete" +msgstr "" + +#: ../src/viktrwlayer.c:7435 +msgid "No routes found" +msgstr "" + +#: ../src/viktrwlayer.c:7444 +msgid "Select routes to delete" +msgstr "" + +#: ../src/viktrwlayer.c:7550 +msgid "Internal Error in vik_trw_layer_uniquify_waypoints" +msgstr "" + +#: ../src/viktrwlayer.c:7597 +msgid "No waypoints found" +msgstr "" + +#: ../src/viktrwlayer.c:7608 +msgid "Select waypoints to delete" +msgstr "" + +#: ../src/viktrwlayer.c:7691 +#, c-format +msgid "%ld waypoint deleted" +msgid_plural "%ld waypoints deleted" +msgstr[0] "" + +#: ../src/viktrwlayer.c:7697 +#, fuzzy +msgid "No duplicates found" +msgstr "Tak ada entri ditemukan!" + +#: ../src/viktrwlayer.c:8028 +#, c-format +msgid "" +"A waypoint with the name \"%s\" already exists. Really rename to the same " +"name?" +msgstr "" + +#: ../src/viktrwlayer.c:8058 +#, c-format +msgid "" +"A track with the name \"%s\" already exists. Really rename to the same name?" +msgstr "" + +#: ../src/viktrwlayer.c:8095 +#, c-format +msgid "" +"A route with the name \"%s\" already exists. Really rename to the same name?" +msgstr "" + +#: ../src/viktrwlayer.c:8215 ../src/viktrwlayer.c:8602 +msgid "_Goto" +msgstr "" + +#: ../src/viktrwlayer.c:8226 +msgid "_Visit Geocache Webpage" +msgstr "" + +#: ../src/viktrwlayer.c:8235 +msgid "Geotag multiple images against this waypoint" +msgstr "" + +#: ../src/viktrwlayer.c:8245 ../src/viktrwlayer_waypointlist.c:352 +msgid "_Show Picture..." +msgstr "" + +#: ../src/viktrwlayer.c:8253 +msgid "Update Geotag on _Image" +msgstr "" + +#: ../src/viktrwlayer.c:8259 +msgid "_Update" +msgstr "" + +#: ../src/viktrwlayer.c:8264 +msgid "Update and _Keep File Timestamp" +msgstr "" + +#: ../src/viktrwlayer.c:8276 +msgid "Visit _Webpage" +msgstr "" + +#: ../src/viktrwlayer.c:8306 +msgid "_New Waypoint..." +msgstr "" + +#: ../src/viktrwlayer.c:8315 +msgid "_View All Waypoints" +msgstr "" + +#: ../src/viktrwlayer.c:8327 +msgid "Delete _All Waypoints" +msgstr "" + +#: ../src/viktrwlayer.c:8333 +msgid "_Delete Waypoints From Selection..." +msgstr "" + +#: ../src/viktrwlayer.c:8351 +msgid "_Show All Waypoints" +msgstr "" + +#: ../src/viktrwlayer.c:8357 +msgid "_Hide All Waypoints" +msgstr "" + +#: ../src/viktrwlayer.c:8369 +msgid "_List Waypoints..." +msgstr "" + +#: ../src/viktrwlayer.c:8390 +msgid "_View All Tracks" +msgstr "" + +#: ../src/viktrwlayer.c:8396 +msgid "_New Track" +msgstr "" + +#: ../src/viktrwlayer.c:8404 +msgid "Delete _All Tracks" +msgstr "" + +#: ../src/viktrwlayer.c:8410 +msgid "_Delete Tracks From Selection..." +msgstr "" + +#: ../src/viktrwlayer.c:8422 +msgid "_Show All Tracks" +msgstr "" + +#: ../src/viktrwlayer.c:8428 +msgid "_Hide All Tracks" +msgstr "" + +#: ../src/viktrwlayer.c:8439 +msgid "_List Tracks..." +msgstr "" + +#: ../src/viktrwlayer.c:8467 +msgid "_View All Routes" +msgstr "" + +#: ../src/viktrwlayer.c:8473 +msgid "_New Route" +msgstr "" + +#: ../src/viktrwlayer.c:8499 +msgid "_Show All Routes" +msgstr "" + +#: ../src/viktrwlayer.c:8505 +msgid "_Hide All Routes" +msgstr "" + +#: ../src/viktrwlayer.c:8516 +msgid "_List Routes..." +msgstr "" + +#: ../src/viktrwlayer.c:8587 +msgid "_View Track" +msgstr "" + +#: ../src/viktrwlayer.c:8589 +msgid "_View Route" +msgstr "" + +#: ../src/viktrwlayer.c:8608 +msgid "_Startpoint" +msgstr "" + +#: ../src/viktrwlayer.c:8614 +msgid "\"_Center\"" +msgstr "" + +#: ../src/viktrwlayer.c:8620 +msgid "_Endpoint" +msgstr "" + +#: ../src/viktrwlayer.c:8626 +msgid "_Highest Altitude" +msgstr "" + +#: ../src/viktrwlayer.c:8632 +msgid "_Lowest Altitude" +msgstr "" + +#: ../src/viktrwlayer.c:8640 +msgid "_Maximum Speed" +msgstr "" + +#: ../src/viktrwlayer.c:8646 +msgid "_Date" +msgstr "" + +#: ../src/viktrwlayer.c:8655 +msgid "Co_mbine" +msgstr "" + +#: ../src/viktrwlayer.c:8663 +msgid "_Merge By Time..." +msgstr "" + +#: ../src/viktrwlayer.c:8668 +msgid "Merge _Segments" +msgstr "" + +#: ../src/viktrwlayer.c:8675 +msgid "Merge _With Other Tracks..." +msgstr "" + +#: ../src/viktrwlayer.c:8682 +msgid "_Append Track..." +msgstr "" + +#: ../src/viktrwlayer.c:8684 +msgid "_Append Route..." +msgstr "" + +#: ../src/viktrwlayer.c:8690 +msgid "Append _Route..." +msgstr "" + +#: ../src/viktrwlayer.c:8692 +msgid "Append _Track..." +msgstr "" + +#: ../src/viktrwlayer.c:8699 +msgid "_Split" +msgstr "" + +#: ../src/viktrwlayer.c:8707 +msgid "_Split By Time..." +msgstr "" + +#. ATM always enable this entry - don't want to have to analyse the track before displaying the menu - to keep the menu speedy +#: ../src/viktrwlayer.c:8713 +msgid "Split Se_gments" +msgstr "" + +#: ../src/viktrwlayer.c:8719 +msgid "Split By _Number of Points..." +msgstr "" + +#: ../src/viktrwlayer.c:8724 +msgid "Split at _Trackpoint" +msgstr "" + +#: ../src/viktrwlayer.c:8732 +msgid "_Insert Points" +msgstr "" + +#: ../src/viktrwlayer.c:8738 +msgid "Insert Point _Before Selected Point" +msgstr "" + +#: ../src/viktrwlayer.c:8745 +msgid "Insert Point _After Selected Point" +msgstr "" + +#: ../src/viktrwlayer.c:8754 +msgid "Delete Poi_nts" +msgstr "" + +#: ../src/viktrwlayer.c:8760 +msgid "Delete _Selected Point" +msgstr "" + +#: ../src/viktrwlayer.c:8768 +msgid "Delete Points With The Same _Position" +msgstr "" + +#: ../src/viktrwlayer.c:8773 +msgid "Delete Points With The Same _Time" +msgstr "" + +#: ../src/viktrwlayer.c:8780 ../src/viktrwlayer.c:9029 +msgid "_Transform" +msgstr "" + +#: ../src/viktrwlayer.c:8788 ../src/viktrwlayer.c:9037 +msgid "_Apply DEM Data" +msgstr "" + +#: ../src/viktrwlayer.c:8793 ../src/viktrwlayer.c:9042 +msgid "_Overwrite" +msgstr "" + +#: ../src/viktrwlayer.c:8796 ../src/viktrwlayer.c:9045 +msgid "Overwrite any existing elevation values with DEM values" +msgstr "" + +#: ../src/viktrwlayer.c:8799 ../src/viktrwlayer.c:9048 +msgid "_Keep Existing" +msgstr "" + +#: ../src/viktrwlayer.c:8802 ../src/viktrwlayer.c:9051 +msgid "Keep existing elevation values, only attempt for missing values" +msgstr "" + +#: ../src/viktrwlayer.c:8807 +msgid "_Smooth Missing Elevation Data" +msgstr "" + +#: ../src/viktrwlayer.c:8812 +msgid "_Interpolated" +msgstr "" + +#: ../src/viktrwlayer.c:8815 +msgid "" +"Interpolate between known elevation values to derive values for the missing " +"elevations" +msgstr "" + +#: ../src/viktrwlayer.c:8818 +msgid "_Flat" +msgstr "" + +#: ../src/viktrwlayer.c:8821 +msgid "Set unknown elevation values to the last known value" +msgstr "" + +#: ../src/viktrwlayer.c:8825 +msgid "C_onvert to a Route" +msgstr "" + +#: ../src/viktrwlayer.c:8827 +msgid "C_onvert to a Track" +msgstr "" + +#: ../src/viktrwlayer.c:8835 +msgid "_Anonymize Times" +msgstr "" + +#: ../src/viktrwlayer.c:8838 +msgid "Shift timestamps to a relative offset from 1901-01-01" +msgstr "" + +#: ../src/viktrwlayer.c:8841 +msgid "_Interpolate Times" +msgstr "" + +#: ../src/viktrwlayer.c:8844 +msgid "" +"Reset trackpoint timestamps between the first and last points such that " +"track is traveled at equal speed" +msgstr "" + +#: ../src/viktrwlayer.c:8849 +msgid "_Reverse Track" +msgstr "" + +#: ../src/viktrwlayer.c:8851 +msgid "_Reverse Route" +msgstr "" + +#: ../src/viktrwlayer.c:8858 +msgid "Refine Route..." +msgstr "" + +#: ../src/viktrwlayer.c:8868 +msgid "Down_load Maps Along Track..." +msgstr "" + +#: ../src/viktrwlayer.c:8870 +msgid "Down_load Maps Along Route..." +msgstr "" + +#: ../src/viktrwlayer.c:8878 +msgid "_Export Track as GPX..." +msgstr "" + +#: ../src/viktrwlayer.c:8880 +msgid "_Export Route as GPX..." +msgstr "" + +#: ../src/viktrwlayer.c:8887 +msgid "E_xtend Track End" +msgstr "" + +#: ../src/viktrwlayer.c:8889 +msgid "E_xtend Route End" +msgstr "" + +#: ../src/viktrwlayer.c:8896 +msgid "Extend _Using Route Finder" +msgstr "" + +#: ../src/viktrwlayer.c:8911 +msgid "_Upload to GPS..." +msgstr "" + +#: ../src/viktrwlayer.c:8926 +msgid "_Diary" +msgstr "" + +#: ../src/viktrwlayer.c:8930 +msgid "Open diary program at this date" +msgstr "" + +#: ../src/viktrwlayer.c:8935 +msgid "_Astronomy" +msgstr "" + +#: ../src/viktrwlayer.c:8938 +msgid "Open astronomy program at this date and location" +msgstr "" + +#: ../src/viktrwlayer.c:8962 +msgid "_View Google Directions" +msgstr "" + +#: ../src/viktrwlayer.c:8984 +msgid "Use with _Filter" +msgstr "" + +#: ../src/viktrwlayer.c:9018 +msgid "_Edit Trackpoint" +msgstr "" + +#: ../src/viktrwlayer.c:10116 +#, c-format +msgid " - Gain %dm:Loss %dm" +msgstr "" + +#: ../src/viktrwlayer.c:10118 +#, c-format +msgid " - Gain %dft:Loss %dft" +msgstr "" + +#: ../src/viktrwlayer.c:10123 +#, c-format +msgid " - Bearing %3.1f° - Step %s" +msgstr "" + +#: ../src/viktrwlayer.c:10232 +#, c-format +msgid "Querying %s for route between (%.3f, %.3f) and (%.3f, %.3f)." +msgstr "" + +#: ../src/viktrwlayer.c:10248 +#, c-format +msgid "%s returned route between (%.3f, %.3f) and (%.3f, %.3f)." +msgstr "" + +#: ../src/viktrwlayer.c:10251 +#, c-format +msgid "Error getting route from %s." +msgstr "" + +#: ../src/viktrwlayer.c:11070 +#, c-format +msgid "Creating %d Image Thumbnails..." +msgstr "" + +#: ../src/viktrwlayer.c:11560 +msgid "No map layer in use. Create one first" +msgstr "" + +#: ../src/viktrwlayer.c:11679 +#, c-format +msgid "%s: Track List" +msgstr "" + +#: ../src/viktrwlayer.c:11681 +#, c-format +msgid "%s: Route List" +msgstr "" + +#: ../src/viktrwlayer.c:11734 +#, c-format +msgid "" +"Could not write external layer %s to %s, please fix and save before exiting " +"or data will be lost" +msgstr "" + +#: ../src/viktrwlayer.c:11782 +#, c-format +msgid "WARNING: issues encountered loading external layer %s from %s" +msgstr "" + +#: ../src/viktrwlayer_export.c:47 +msgid "Auto Device GPX Simplify:" +msgstr "" + +#: ../src/viktrwlayer_export.c:48 +msgid "" +"GPX saves to certain devices will be simplified for device compatibility." +msgstr "" + +#: ../src/viktrwlayer_export.c:125 +#, c-format +msgid "Export of GPX file simplified using point limit: %d" +msgstr "" + +#: ../src/viktrwlayer_export.c:206 ../src/viktrwlayer_export.c:323 +#: ../src/vikwindow.c:3694 +msgid "The filename you requested could not be opened for writing." +msgstr "" + +#: ../src/viktrwlayer_export.c:226 +#, c-format +msgid "Could not launch %s." +msgstr "" + +#: ../src/viktrwlayer_export.c:234 +msgid "Could not create temporary file for export." +msgstr "" + +#: ../src/viktrwlayer_export.c:268 +msgid "File format:" +msgstr "" + +#: ../src/viktrwlayer_export.c:276 +msgid "Select the file format." +msgstr "" + +#: ../src/viktrwlayer_export.c:281 +msgid "" +"Select the information to process.\n" +"Warning: the behavior of these switches is highly dependent of the file " +"format selected.\n" +"Please, refer to GPSbabel if unsure." +msgstr "" + +#: ../src/viktrwlayer_export.c:308 +msgid "You did not select a valid file format." +msgstr "" + +#: ../src/viktrwlayer_propwin.c:915 ../src/viktrwlayer_propwin.c:3381 +#: ../src/viktrwlayer_propwin.c:3417 ../src/viktrwlayer_propwin.c:3457 +#: ../src/viktrwlayer_propwin.c:3509 ../src/viktrwlayer_propwin.c:3527 +#: ../src/viktrwlayer_propwin.c:3600 ../src/viktrwlayer_propwin.c:3601 +#: ../src/viktrwlayer_propwin.c:3602 ../src/viktrwlayer_propwin.c:3611 +#: ../src/viktrwlayer_propwin.c:3612 ../src/viktrwlayer_propwin.c:3629 +#: ../src/viktrwlayer_propwin.c:3630 ../src/viktrwlayer_propwin.c:3644 +#: ../src/viktrwlayer_propwin.c:3645 ../src/viktrwlayer_propwin.c:3646 +#: ../src/viktrwlayer_propwin.c:3660 ../src/viktrwlayer_propwin.c:3661 +#: ../src/viktrwlayer_propwin.c:3662 ../src/viktrwlayer_propwin.c:3676 +#: ../src/viktrwlayer_propwin.c:3677 ../src/viktrwlayer_propwin.c:3678 +#: ../src/viktrwlayer_propwin.c:3695 ../src/viktrwlayer_propwin.c:3696 +#: ../src/viktrwlayer_analysis.c:293 +#, c-format +msgid "No Data" +msgstr "Tiada Data" + +#: ../src/viktrwlayer_propwin.c:960 ../src/viktrwlayer_propwin.c:1245 +#, c-format +msgid "%.1f kph" +msgstr "" + +#: ../src/viktrwlayer_propwin.c:963 ../src/viktrwlayer_propwin.c:1248 +#: ../src/viktrwlayer_analysis.c:352 +#, c-format +msgid "%.1f mph" +msgstr "" + +#: ../src/viktrwlayer_propwin.c:966 ../src/viktrwlayer_propwin.c:1251 +#, c-format +msgid "%.1f knots" +msgstr "" + +#: ../src/viktrwlayer_propwin.c:969 ../src/viktrwlayer_propwin.c:1254 +#, c-format +msgid "%.1f s/km" +msgstr "" + +#: ../src/viktrwlayer_propwin.c:972 ../src/viktrwlayer_propwin.c:1257 +#: ../src/viktrwlayer_analysis.c:389 ../src/viktrwlayer_analysis.c:392 +#, fuzzy, c-format +msgid "%.1f min/km" +msgstr "1 menit" + +#: ../src/viktrwlayer_propwin.c:975 ../src/viktrwlayer_propwin.c:1260 +#, c-format +msgid "%.1f sec/mi" +msgstr "" + +#: ../src/viktrwlayer_propwin.c:978 ../src/viktrwlayer_propwin.c:1263 +#: ../src/viktrwlayer_analysis.c:409 ../src/viktrwlayer_analysis.c:412 +#, fuzzy, c-format +msgid "%.1f min/mi" +msgstr "1 menit" + +#. VIK_UNITS_SPEED_METRES_PER_SECOND: +#: ../src/viktrwlayer_propwin.c:982 ../src/viktrwlayer_propwin.c:1267 +#, c-format +msgid "%.1f m/s" +msgstr "" + +#. Minutes +#: ../src/viktrwlayer_propwin.c:1411 +msgid "mins" +msgstr "" + +#. Hours +#: ../src/viktrwlayer_propwin.c:1418 +msgid "h" +msgstr "" + +#. Days +#: ../src/viktrwlayer_propwin.c:1424 +msgid "d" +msgstr "" + +#. Weeks +#: ../src/viktrwlayer_propwin.c:1429 +msgid "w" +msgstr "" + +#. 'Months' +#: ../src/viktrwlayer_propwin.c:1433 +msgid "M" +msgstr "" + +#: ../src/viktrwlayer_propwin.c:2051 ../src/viktrwlayer_analysis.c:303 +#, c-format +msgid "%.1f miles" +msgstr "" + +#: ../src/viktrwlayer_propwin.c:2054 ../src/viktrwlayer_analysis.c:306 +#, c-format +msgid "%.1f NM" +msgstr "" + +#. VIK_UNITS_DISTANCE_KILOMETRES +#: ../src/viktrwlayer_propwin.c:2057 ../src/viktrwlayer_analysis.c:310 +#, c-format +msgid "%.1f km" +msgstr "" + +#: ../src/viktrwlayer_propwin.c:3083 +msgid "Failed spliting track. Track unchanged" +msgstr "" + +#: ../src/viktrwlayer_propwin.c:3234 ../src/viktrwlayer_propwin.c:3744 +#, c-format +msgid "%s - Track Properties" +msgstr "" + +#: ../src/viktrwlayer_propwin.c:3239 +msgid "Split at _Marker" +msgstr "" + +#: ../src/viktrwlayer_propwin.c:3240 +msgid "Split _Segments" +msgstr "" + +#: ../src/viktrwlayer_propwin.c:3241 +msgid "_Reverse" +msgstr "" + +#: ../src/viktrwlayer_propwin.c:3242 +msgid "_Delete Dupl." +msgstr "" + +#: ../src/viktrwlayer_propwin.c:3269 +msgid "Comment:" +msgstr "Komentar:" + +#: ../src/viktrwlayer_propwin.c:3270 +msgid "Description:" +msgstr "" + +#: ../src/viktrwlayer_propwin.c:3271 +#, fuzzy +msgid "Source:" +msgstr "Awal:" + +#: ../src/viktrwlayer_propwin.c:3272 +#, fuzzy +msgid "Type:" +msgstr "Waktu:" + +#: ../src/viktrwlayer_propwin.c:3273 +msgid "Color:" +msgstr "" + +#: ../src/viktrwlayer_propwin.c:3274 +msgid "Draw Name:" +msgstr "" + +#: ../src/viktrwlayer_propwin.c:3275 +msgid "Distance Labels:" +msgstr "" + +#: ../src/viktrwlayer_propwin.c:3278 +msgid "Track Length:" +msgstr "Panjang Lintasan:" + +#: ../src/viktrwlayer_propwin.c:3279 +msgid "Trackpoints:" +msgstr "" + +#: ../src/viktrwlayer_propwin.c:3280 +msgid "Segments:" +msgstr "" + +#: ../src/viktrwlayer_propwin.c:3281 +msgid "Duplicate Points:" +msgstr "" + +#: ../src/viktrwlayer_propwin.c:3282 +msgid "Max Speed:" +msgstr "Laju Maks:" + +#: ../src/viktrwlayer_propwin.c:3283 +msgid "Avg. Speed:" +msgstr "Laju Rerata:" + +#: ../src/viktrwlayer_propwin.c:3284 +msgid "Moving Avg. Speed:" +msgstr "" + +#: ../src/viktrwlayer_propwin.c:3285 +msgid "Avg. Dist. Between TPs:" +msgstr "" + +#: ../src/viktrwlayer_propwin.c:3286 +msgid "Elevation Range:" +msgstr "" + +#: ../src/viktrwlayer_propwin.c:3287 +msgid "Total Elevation Gain/Loss:" +msgstr "" + +#: ../src/viktrwlayer_propwin.c:3288 +msgid "Start:" +msgstr "Awal:" + +#: ../src/viktrwlayer_propwin.c:3289 +msgid "End:" +msgstr "Akhir:" + +#: ../src/viktrwlayer_propwin.c:3290 +msgid "Duration:" +msgstr "Durasi:" + +#: ../src/viktrwlayer_propwin.c:3320 +msgid "Centre" +msgstr "" + +#: ../src/viktrwlayer_propwin.c:3321 +msgid "Start only" +msgstr "" + +#: ../src/viktrwlayer_propwin.c:3322 +msgid "End only" +msgstr "" + +#: ../src/viktrwlayer_propwin.c:3323 +msgid "Start and End" +msgstr "" + +#: ../src/viktrwlayer_propwin.c:3324 +msgid "Centre, Start and End" +msgstr "" + +#: ../src/viktrwlayer_propwin.c:3336 +msgid "Maximum number of distance labels to be shown" +msgstr "" + +#: ../src/viktrwlayer_propwin.c:3340 +msgid "Properties" +msgstr "" + +#: ../src/viktrwlayer_propwin.c:3584 +#, c-format +msgid "%d minutes - %d minutes moving" +msgstr "" + +#: ../src/viktrwlayer_propwin.c:3596 +#, c-format +msgid "%s total - %s in segments" +msgstr "" + +#: ../src/viktrwlayer_propwin.c:3607 ../src/viktrwlayer_analysis.c:622 +msgid "Statistics" +msgstr "Statistik" + +#: ../src/viktrwlayer_propwin.c:3613 ../src/viktrwlayer_propwin.c:3680 +msgid "Show D_EM" +msgstr "" + +#: ../src/viktrwlayer_propwin.c:3615 ../src/viktrwlayer_propwin.c:3631 +#: ../src/viktrwlayer_propwin.c:3647 ../src/viktrwlayer_propwin.c:3697 +msgid "Show _GPS Speed" +msgstr "" + +#: ../src/viktrwlayer_propwin.c:3617 ../src/viktrwlayer_propwin.c:3633 +#: ../src/viktrwlayer_propwin.c:3665 ../src/viktrwlayer_propwin.c:3699 +msgid "Track Distance:" +msgstr "Jarak Lintasan:" + +#: ../src/viktrwlayer_propwin.c:3618 ../src/viktrwlayer_propwin.c:3684 +msgid "Track Height:" +msgstr "" + +#: ../src/viktrwlayer_propwin.c:3624 +msgid "Elevation-distance" +msgstr "" + +#: ../src/viktrwlayer_propwin.c:3634 +msgid "Track Gradient:" +msgstr "" + +#: ../src/viktrwlayer_propwin.c:3639 +msgid "Gradient-distance" +msgstr "" + +#: ../src/viktrwlayer_propwin.c:3649 ../src/viktrwlayer_propwin.c:3666 +#: ../src/viktrwlayer_propwin.c:3683 +msgid "Track Time:" +msgstr "" + +#: ../src/viktrwlayer_propwin.c:3650 ../src/viktrwlayer_propwin.c:3700 +msgid "Track Speed:" +msgstr "" + +#: ../src/viktrwlayer_propwin.c:3651 ../src/viktrwlayer_propwin.c:3667 +#: ../src/viktrwlayer_propwin.c:3685 +msgid "Time/Date:" +msgstr "" + +#: ../src/viktrwlayer_propwin.c:3655 +msgid "Speed-time" +msgstr "" + +#: ../src/viktrwlayer_propwin.c:3663 ../src/viktrwlayer_propwin.c:3679 +msgid "Show S_peed" +msgstr "" + +#: ../src/viktrwlayer_propwin.c:3671 +msgid "Distance-time" +msgstr "" + +#: ../src/viktrwlayer_propwin.c:3690 +msgid "Elevation-time" +msgstr "" + +#: ../src/viktrwlayer_propwin.c:3705 +msgid "Speed-distance" +msgstr "" + +#: ../src/viktrwlayer_tpwin.c:190 ../src/viktrwlayer_wpwin.c:66 +msgid "Date/Time Edit" +msgstr "" + +#: ../src/viktrwlayer_tpwin.c:242 +msgid "Name:" +msgstr "" + +#: ../src/viktrwlayer_tpwin.c:243 +msgid "Latitude:" +msgstr "Lintang:" + +#: ../src/viktrwlayer_tpwin.c:244 +msgid "Longitude:" +msgstr "Bujur:" + +#: ../src/viktrwlayer_tpwin.c:245 +msgid "Altitude:" +msgstr "Ketinggian:" + +#: ../src/viktrwlayer_tpwin.c:246 +msgid "Course:" +msgstr "" + +#: ../src/viktrwlayer_tpwin.c:247 +msgid "Timestamp:" +msgstr "" + +#: ../src/viktrwlayer_tpwin.c:248 +msgid "Time:" +msgstr "Waktu:" + +#: ../src/viktrwlayer_tpwin.c:249 +msgid "Distance Difference:" +msgstr "Beda Jarak:" + +#: ../src/viktrwlayer_tpwin.c:250 +msgid "Time Difference:" +msgstr "Beda Waktu:" + +#: ../src/viktrwlayer_tpwin.c:251 +msgid "\"Speed\" Between:" +msgstr "" + +#: ../src/viktrwlayer_tpwin.c:252 +msgid "Speed:" +msgstr "" + +#: ../src/viktrwlayer_tpwin.c:253 +msgid "VDOP:" +msgstr "VDOP:" + +#: ../src/viktrwlayer_tpwin.c:254 +msgid "HDOP:" +msgstr "HDOP:" + +#: ../src/viktrwlayer_tpwin.c:255 +msgid "PDOP:" +msgstr "PDOP:" + +#: ../src/viktrwlayer_tpwin.c:256 +msgid "SAT/FIX:" +msgstr "" + +#: ../src/viktrwlayer_tpwin.c:263 ../src/viktrwlayer_tpwin.c:408 +#: ../src/viktrwlayer_tpwin.c:622 +msgid "Trackpoint" +msgstr "" + +#: ../src/viktrwlayer_tpwin.c:266 +msgid "_Insert After" +msgstr "" + +#: ../src/viktrwlayer_tpwin.c:268 +msgid "Split Here" +msgstr "" + +#: ../src/viktrwlayer_tracklist.c:262 ../src/viktrwlayer_waypointlist.c:306 +msgid "_Copy Data" +msgstr "" + +#. +#. item = gtk_image_menu_item_new_with_mnemonic ( _("_Select") ); +#. gtk_image_menu_item_set_image ( (GtkImageMenuItem*)item, gtk_image_new_from_stock (GTK_STOCK_FIND, GTK_ICON_SIZE_MENU) ); +#. g_signal_connect_swapped ( G_OBJECT(item), "activate", G_CALLBACK(trw_layer_track_select), values ); +#. gtk_menu_shell_append (GTK_MENU_SHELL (menu), item); +#. gtk_widget_show ( item ); +#. +#. ATM view auto selects, so don't bother with separate select menu entry +#. +#. item = gtk_image_menu_item_new_with_mnemonic ( _("_Select") ); +#. gtk_image_menu_item_set_image ( (GtkImageMenuItem*)item, gtk_image_new_from_stock (GTK_STOCK_FIND, GTK_ICON_SIZE_MENU) ); +#. g_signal_connect_swapped ( G_OBJECT(item), "activate", G_CALLBACK(trw_layer_waypoint_select), values ); +#. gtk_menu_shell_append (GTK_MENU_SHELL (menu), item); +#. gtk_widget_show ( item ); +#. +#. AUTO SELECT NOT TRUE YET... +#. ATM view auto selects, so don't bother with separate select menu entry +#: ../src/viktrwlayer_tracklist.c:290 ../src/viktrwlayer_waypointlist.c:341 +#: ../src/vikwindow.c:4816 +msgid "_View" +msgstr "_Tilik" + +#. Insert column for the layer name when viewing multi layers +#: ../src/viktrwlayer_tracklist.c:613 ../src/viktrwlayer_waypointlist.c:609 +msgid "Layer" +msgstr "" + +#: ../src/viktrwlayer_tracklist.c:627 ../src/viktrwlayer_waypointlist.c:624 +msgid "Date" +msgstr "" + +#: ../src/viktrwlayer_tracklist.c:631 ../src/viktrwlayer_waypointlist.c:628 +msgid "Visible" +msgstr "" + +#: ../src/viktrwlayer_tracklist.c:639 +msgid "" +"Distance\n" +"(miles)" +msgstr "" + +#: ../src/viktrwlayer_tracklist.c:642 +msgid "" +"Distance\n" +"(NM)" +msgstr "" + +#: ../src/viktrwlayer_tracklist.c:645 +msgid "" +"Distance\n" +"(km)" +msgstr "" + +#: ../src/viktrwlayer_tracklist.c:651 +msgid "" +"Length\n" +"(minutes)" +msgstr "" + +#: ../src/viktrwlayer_tracklist.c:660 ../src/vikutils.c:93 +msgid "sec/mi" +msgstr "" + +#: ../src/viktrwlayer_tracklist.c:666 +#, c-format +msgid "" +"Av. Speed\n" +"(%s)" +msgstr "" + +#. Apply own formatting of the data +#: ../src/viktrwlayer_tracklist.c:671 +#, c-format +msgid "" +"Max Speed\n" +"(%s)" +msgstr "" + +#: ../src/viktrwlayer_tracklist.c:679 ../src/viktrwlayer_waypointlist.c:637 +msgid "" +"Max Height\n" +"(Feet)" +msgstr "" + +#: ../src/viktrwlayer_tracklist.c:681 ../src/viktrwlayer_waypointlist.c:639 +msgid "" +"Max Height\n" +"(Metres)" +msgstr "" + +#: ../src/viktrwlayer_waypointlist.c:312 +msgid "Copy Data (with _positions)" +msgstr "" + +#: ../src/viktrwlayer_waypointlist.c:633 +msgid "Comment" +msgstr "" + +#: ../src/viktrwlayer_waypointlist.c:643 +msgid "Symbol" +msgstr "" + +#: ../src/viktrwlayer_wpwin.c:93 ../src/viktrwlayer_wpwin.c:302 +msgid "True" +msgstr "" + +#: ../src/viktrwlayer_wpwin.c:122 +msgid "Waypoint Properties" +msgstr "Sifat Waypoint" + +#: ../src/viktrwlayer_wpwin.c:164 +msgid "Name:" +msgstr "Nama:" + +#: ../src/viktrwlayer_wpwin.c:181 +msgid "Altitude:" +msgstr "Ketinggian:" + +#: ../src/viktrwlayer_wpwin.c:186 ../src/viktrwlayer_wpwin.c:188 +msgid "Comment:" +msgstr "Komentar:" + +#: ../src/viktrwlayer_wpwin.c:202 +#, fuzzy +msgid "Source:" +msgstr "Sumber Unduh:" + +#: ../src/viktrwlayer_wpwin.c:212 +msgid "Image:" +msgstr "Citra:" + +#: ../src/viktrwlayer_wpwin.c:217 +msgid "Symbol:" +msgstr "Simbol:" + +#: ../src/viktrwlayer_wpwin.c:226 +msgid "(none)" +msgstr "(tak ada)" + +#. Geotag Info [readonly] +#: ../src/viktrwlayer_wpwin.c:272 +msgid "Has Geotag" +msgstr "" + +#: ../src/viktrwlayer_wpwin.c:279 +msgid "Consistent Position" +msgstr "" + +#. ATM the direction value box is always shown, even when there is no information. +#. It would be nice to be able to hide it until the 'Add' has been performed, +#. however I've not been able to achieve this. +#. Thus simply sensistizing it instead. +#: ../src/viktrwlayer_wpwin.c:292 +#, fuzzy +msgid "Image Direction:" +msgstr "Tatanan Citra" + +#: ../src/viktrwlayer_wpwin.c:300 +msgid "Magnetic" +msgstr "" + +#: ../src/viktrwlayer_wpwin.c:320 +msgid "Time:" +msgstr "" + +#. TODO: other checks (isalpha or whatever ) +#: ../src/viktrwlayer_wpwin.c:386 +msgid "Please enter a name for the waypoint." +msgstr "Silahkan masukkan nama bagi waypoint." + +#: ../src/viktrwlayer_geotag.c:320 ../src/viktrwlayer_geotag.c:460 +#, c-format +msgid "Failed updating EXIF on %s" +msgstr "" + +#: ../src/viktrwlayer_geotag.c:562 +#, c-format +msgid "Geotagging %d Images..." +msgstr "" + +#: ../src/viktrwlayer_geotag.c:630 +msgid "Geotag Images" +msgstr "" + +#: ../src/viktrwlayer_geotag.c:640 +msgid "Images" +msgstr "" + +#: ../src/viktrwlayer_geotag.c:645 +msgid "Overwrite Existing Waypoints:" +msgstr "" + +#: ../src/viktrwlayer_geotag.c:648 +msgid "Overwrite Existing GPS Information:" +msgstr "" + +#: ../src/viktrwlayer_geotag.c:650 +msgid "Keep File Modification Timestamp:" +msgstr "" + +#: ../src/viktrwlayer_geotag.c:684 +msgid "Create Waypoints:" +msgstr "" + +#: ../src/viktrwlayer_geotag.c:693 +msgid "Write EXIF:" +msgstr "" + +#: ../src/viktrwlayer_geotag.c:705 +msgid "Automatic Image Direction:" +msgstr "" + +#: ../src/viktrwlayer_geotag.c:707 +msgid "Set image direction based on a heading derived from the track" +msgstr "" + +#: ../src/viktrwlayer_geotag.c:710 +msgid "Interpolate Between Track Segments:" +msgstr "" + +#: ../src/viktrwlayer_geotag.c:715 +msgid "Image Time Offset (Seconds):" +msgstr "" + +#: ../src/viktrwlayer_geotag.c:718 +msgid "" +"The number of seconds to ADD to the photos time to make it match the GPS " +"data. Calculate this with (GPS - Photo). Can be negative or positive. Useful " +"to adjust times when a camera's timestamp was incorrect." +msgstr "" + +#: ../src/viktrwlayer_geotag.c:721 +msgid "Image Timezone:" +msgstr "" + +#: ../src/viktrwlayer_geotag.c:724 +msgid "" +"The timezone that was used when the images were created. For example, if a " +"camera is set to AWST or +8:00 hours. Enter +8:00 here so that the correct " +"adjustment to the images' time can be made. GPS data is always in UTC." +msgstr "" + +#: ../src/viktrwlayer_geotag.c:728 +#, c-format +msgid "Using waypoint: %s" +msgstr "" + +#: ../src/viktrwlayer_geotag.c:742 +#, c-format +msgid "Using track: %s" +msgstr "" + +#: ../src/viktrwlayer_geotag.c:744 +#, c-format +msgid "Using all tracks in: %s" +msgstr "" + +#: ../src/viktrwlayer_analysis.c:214 +msgid "Number of Tracks" +msgstr "" + +#: ../src/viktrwlayer_analysis.c:215 +msgid "Date Range" +msgstr "" + +#: ../src/viktrwlayer_analysis.c:216 +msgid "Total Length" +msgstr "" + +#: ../src/viktrwlayer_analysis.c:217 +msgid "Average Length" +msgstr "" + +#: ../src/viktrwlayer_analysis.c:218 +msgid "Eddington number" +msgstr "" + +#. No.4: Extended display only +#: ../src/viktrwlayer_analysis.c:219 +msgid "Max Speed" +msgstr "" + +#: ../src/viktrwlayer_analysis.c:220 +msgid "Avg. Speed" +msgstr "" + +#: ../src/viktrwlayer_analysis.c:221 +msgid "Minimum Altitude" +msgstr "" + +#: ../src/viktrwlayer_analysis.c:222 +msgid "Maximum Altitude" +msgstr "" + +#: ../src/viktrwlayer_analysis.c:223 +msgid "Total Elevation Gain/Loss" +msgstr "" + +#: ../src/viktrwlayer_analysis.c:224 +msgid "Avg. Elevation Gain/Loss" +msgstr "" + +#: ../src/viktrwlayer_analysis.c:225 +msgid "Total Duration" +msgstr "" + +#: ../src/viktrwlayer_analysis.c:226 +msgid "Avg. Duration" +msgstr "" + +#: ../src/viktrwlayer_analysis.c:317 +#, c-format +msgid "%.2f miles" +msgstr "" + +#: ../src/viktrwlayer_analysis.c:320 +#, c-format +msgid "%.2f NM" +msgstr "" + +#. VIK_UNITS_DISTANCE_KILOMETRES +#: ../src/viktrwlayer_analysis.c:324 +#, c-format +msgid "%.2f km" +msgstr "" + +#: ../src/viktrwlayer_analysis.c:361 +#, c-format +msgid "%.2f m/s" +msgstr "" + +#: ../src/viktrwlayer_analysis.c:370 ../src/viktrwlayer_analysis.c:373 +#, c-format +msgid "%.2f knots" +msgstr "" + +#: ../src/viktrwlayer_analysis.c:379 ../src/viktrwlayer_analysis.c:382 +#, c-format +msgid "%d s/km" +msgstr "" + +#: ../src/viktrwlayer_analysis.c:399 ../src/viktrwlayer_analysis.c:402 +#, c-format +msgid "%d sec/mi" +msgstr "" + +#: ../src/viktrwlayer_analysis.c:420 ../src/viktrwlayer_analysis.c:423 +#, c-format +msgid "%.2f km/h" +msgstr "" + +#: ../src/viktrwlayer_analysis.c:434 ../src/viktrwlayer_analysis.c:440 +#, c-format +msgid "%d feet" +msgstr "" + +#: ../src/viktrwlayer_analysis.c:445 ../src/viktrwlayer_analysis.c:447 +#, c-format +msgid "%d feet / %d feet" +msgstr "" + +#: ../src/viktrwlayer_analysis.c:452 ../src/viktrwlayer_analysis.c:458 +#, c-format +msgid "%d m" +msgstr "" + +#: ../src/viktrwlayer_analysis.c:463 ../src/viktrwlayer_analysis.c:465 +#, c-format +msgid "%d m / %d m" +msgstr "" + +#: ../src/viktrwlayer_analysis.c:477 +#, c-format +msgid "%d:%02d:%02d days:hrs:mins" +msgstr "" + +#: ../src/viktrwlayer_analysis.c:484 +#, c-format +msgid "%d:%02d hrs:mins" +msgstr "" + +#: ../src/viktrwlayer_analysis.c:658 +msgid "Include Invisible Items" +msgstr "" + +#: ../src/vikstatus.c:129 +msgid "Current number of background tasks. Click to see the background jobs." +msgstr "" + +#: ../src/vikstatus.c:134 +msgid "Current zoom level. Click to select a new one." +msgstr "" + +#: ../src/vikstatus.c:141 +msgid "Left click to clear the message. Right click to copy the message." +msgstr "" + +#: ../src/vikutils.c:108 +msgid "GPSD" +msgstr "" + +#. GPS Preamble +#: ../src/vikutils.c:109 +msgid "Trkpt" +msgstr "" + +#: ../src/vikutils.c:160 +#, c-format +msgid "%sSpeed%s %.1f%s" +msgstr "" + +#. Go for 2dp as expect low values for vertical speeds +#: ../src/vikutils.c:214 +#, c-format +msgid "%sClimb%s %.2f%s" +msgstr "" + +#: ../src/vikutils.c:223 +#, c-format +msgid "%sAlt %dfeet" +msgstr "" + +#. VIK_UNITS_HEIGHT_METRES: +#: ../src/vikutils.c:227 +#, c-format +msgid "%sAlt %dm" +msgstr "" + +#: ../src/vikutils.c:235 +#, c-format +msgid "%sCourse %03d°" +msgstr "" + +#: ../src/vikutils.c:249 +msgid "yards" +msgstr "" + +#. VIK_UNITS_DISTANCE_KILOMETRES: +#: ../src/vikutils.c:253 +msgid "m" +msgstr "" + +#: ../src/vikutils.c:257 +#, c-format +msgid "%sDistance diff %d%s" +msgstr "" + +#: ../src/vikutils.c:272 +#, c-format +msgid "%sTime %s" +msgstr "" + +#: ../src/vikutils.c:281 +#, c-format +msgid "%sTime diff %lds" +msgstr "" + +#: ../src/vikutils.c:287 +#, c-format +msgid "%sNo. of Sats %d" +msgstr "" + +#: ../src/vikutils.c:312 +#, c-format +msgid "%sTo End %.2f%s" +msgstr "" + +#: ../src/vikutils.c:339 +#, c-format +msgid "%sDistance along %.2f%s" +msgstr "" + +#: ../src/vikutils.c:359 +#, c-format +msgid "%sTrack: %s" +msgstr "" + +#: ../src/vikutils.c:396 +#, c-format +msgid "" +"There is a newer version of Viking available: %s\n" +"\n" +"Do you wish to go to Viking's website now?" +msgstr "" + +#: ../src/vikutils.c:526 +msgid "" +"This appears to be Viking's very first run.\n" +"\n" +"Do you wish to enable automatic internet features?\n" +"\n" +"Individual settings can be controlled in the Preferences." +msgstr "" + +#: ../src/vikwaypoint.c:37 +msgid "Waypoint" +msgstr "" + +#: ../src/vikwebtool_datasource.c:352 +msgid "Search Term" +msgstr "" + +#. TODO get rid of this as this is unnecessary duplication... +#: ../src/vikwindow.c:258 +msgid "Pan" +msgstr "" + +#: ../src/vikwindow.c:258 +msgid "Zoom" +msgstr "Zum" + +#: ../src/vikwindow.c:258 +msgid "Ruler" +msgstr "" + +#: ../src/vikwindow.c:258 +msgid "Select" +msgstr "" + +#: ../src/vikwindow.c:368 +msgid "This is Viking " +msgstr "" + +#: ../src/vikwindow.c:457 +msgid "Location lookup aborted" +msgstr "" + +#: ../src/vikwindow.c:477 +#, c-format +msgid "Location found: %s" +msgstr "" + +#: ../src/vikwindow.c:486 +msgid "Unable to determine location" +msgstr "" + +#: ../src/vikwindow.c:495 +msgid "Determining location" +msgstr "" + +#: ../src/vikwindow.c:525 +#, c-format +msgid "Location found via geoclue" +msgstr "" + +#: ../src/vikwindow.c:546 +msgid "Default Map" +msgstr "" + +#: ../src/vikwindow.c:557 ../src/vikwindow.c:3938 +msgid "Trying to determine location..." +msgstr "" + +#. Create tooltip +#: ../src/vikwindow.c:723 +msgid "Select zoom level" +msgstr "" + +#: ../src/vikwindow.c:1176 +#, c-format +msgid "" +"Do you want to save the changes you made to the document \"%s\"?\n" +"\n" +"Your changes will be lost if you don't save them." +msgstr "" + +#: ../src/vikwindow.c:1180 +msgid "Don't Save" +msgstr "Jangan Simpan" + +#: ../src/vikwindow.c:1268 +msgid "mpp" +msgstr "" + +#: ../src/vikwindow.c:1268 +msgid "pixelfact" +msgstr "" + +#: ../src/vikwindow.c:1467 +#, c-format +msgid "%s %s %dm" +msgstr "%s %s %dm" + +#: ../src/vikwindow.c:1469 +#, c-format +msgid "%s %s %dft" +msgstr "" + +#: ../src/vikwindow.c:1472 +#, c-format +msgid "%s %s" +msgstr "%s %s" + +#: ../src/vikwindow.c:1929 +msgid "_Ruler" +msgstr "Pengga_ris" + +#: ../src/vikwindow.c:1929 +msgid "Ruler Tool" +msgstr "Penggaris" + +#: ../src/vikwindow.c:2204 ../src/vikwindow.c:4818 +msgid "_Zoom" +msgstr "_Zum" + +#: ../src/vikwindow.c:2204 +msgid "Zoom Tool" +msgstr "Pembesaran" + +#: ../src/vikwindow.c:2271 ../src/vikwindow.c:4819 +msgid "_Pan" +msgstr "" + +#: ../src/vikwindow.c:2271 +msgid "Pan Tool" +msgstr "Penggeseran" + +#: ../src/vikwindow.c:2425 +msgid "_Select" +msgstr "" + +#: ../src/vikwindow.c:2425 +msgid "Select Tool" +msgstr "" + +#: ../src/vikwindow.c:2615 +msgid "You must select a layer to show its properties." +msgstr "" + +#. No error to show, so unlikely this will get called +#: ../src/vikwindow.c:2629 +msgid "The help system is not available." +msgstr "" + +#. Main error path +#: ../src/vikwindow.c:2632 +#, c-format +msgid "" +"Help is not available because: %s.\n" +"Ensure a Mime Type ghelp handler program is installed (e.g. yelp)." +msgstr "" + +#: ../src/vikwindow.c:2865 +msgid "You must select a layer to delete." +msgstr "" + +#: ../src/vikwindow.c:3171 +msgid "Untitled" +msgstr "" + +#: ../src/vikwindow.c:3300 +#, c-format +msgid "Unable to add '%s' to the list of recently used documents" +msgstr "" + +#: ../src/vikwindow.c:3391 +msgid "The file you requested could not be opened." +msgstr "" + +#: ../src/vikwindow.c:3394 +msgid "" +"GPSBabel is required to load files of this type or GPSBabel encountered " +"problems." +msgstr "" + +#: ../src/vikwindow.c:3397 +#, c-format +msgid "Unable to load malformed GPX file %s" +msgstr "" + +#: ../src/vikwindow.c:3400 +#, c-format +msgid "Unsupported file type for %s" +msgstr "" + +#. Since we can process .vik files with issues just show a warning in the status bar +#. Not that a user can do much about it... or tells them what this issue is yet... +#: ../src/vikwindow.c:3406 +#, c-format +msgid "WARNING: issues encountered loading %s" +msgstr "" + +#: ../src/vikwindow.c:3489 +msgid "Please select a GPS data file to open. " +msgstr "" + +#: ../src/vikwindow.c:3508 +msgid "Google Earth" +msgstr "" + +#: ../src/vikwindow.c:3523 ../src/vikwindow.c:3646 ../src/viking.desktop.in.h:1 +msgid "Viking" +msgstr "Viking" + +#: ../src/vikwindow.c:3594 ../src/vikwindow.c:4632 +msgid "Open File" +msgstr "" + +#: ../src/vikwindow.c:3630 +msgid "Save as Viking File." +msgstr "" + +#: ../src/vikwindow.c:3757 +#, c-format +msgid "Exporting to file: %s" +msgstr "" + +#. Confirm what happened. +#: ../src/vikwindow.c:3774 +#, c-format +msgid "Exported files: %d" +msgstr "" + +#: ../src/vikwindow.c:3786 +msgid "Nothing to Export!" +msgstr "" + +#: ../src/vikwindow.c:3790 +msgid "Export to directory" +msgstr "" + +#: ../src/vikwindow.c:3809 +msgid "Could not convert all files" +msgstr "" + +#: ../src/vikwindow.c:3851 +msgid "File not accessible" +msgstr "" + +#: ../src/vikwindow.c:3854 +msgid "No Viking File" +msgstr "" + +#: ../src/vikwindow.c:3998 +msgid "This layer has no configurable properties." +msgstr "" + +#: ../src/vikwindow.c:4080 +msgid "Are you sure you wish to delete all layers?" +msgstr "" + +#. Try harder... +#: ../src/vikwindow.c:4126 ../src/vikwindow.c:4132 +msgid "Generating image file..." +msgstr "" + +#: ../src/vikwindow.c:4154 +msgid "" +"Failed to generate internal image.\n" +"\n" +"Try creating a smaller image." +msgstr "" + +#: ../src/vikwindow.c:4175 +msgid "Image file generated." +msgstr "" + +#: ../src/vikwindow.c:4177 +msgid "Failed to generate image file." +msgstr "" + +#: ../src/vikwindow.c:4246 +#, c-format +msgid "Unable to write to file %s: %s" +msgstr "" + +#: ../src/vikwindow.c:4284 +msgid "" +"Viewable region outside allowable pixel size bounds for image. Clipping " +"width/height values." +msgstr "" + +#: ../src/vikwindow.c:4309 +#, c-format +msgid "Total area: %ldm x %ldm (%.3f sq. km)" +msgstr "" + +#: ../src/vikwindow.c:4312 +#, c-format +msgid "Total area: %ldm x %ldm (%.3f sq. miles)" +msgstr "" + +#: ../src/vikwindow.c:4315 +#, c-format +msgid "Total area: %ldm x %ldm (%.3f sq. NM)" +msgstr "" + +#. Single file +#: ../src/vikwindow.c:4343 +msgid "Save Image" +msgstr "Simpan Citra" + +#: ../src/vikwindow.c:4364 ../src/vikwindow.c:4641 +msgid "KMZ" +msgstr "" + +#: ../src/vikwindow.c:4417 +msgid "You must be in UTM mode to use this feature" +msgstr "" + +#: ../src/vikwindow.c:4421 +msgid "Choose a directory to hold images" +msgstr "" + +#. todo: default for answers inside VikWindow or static (thruout instance) +#: ../src/vikwindow.c:4441 +msgid "Save to Image File" +msgstr "Simpan ke Berkas Citra" + +#: ../src/vikwindow.c:4457 +msgid "Width (pixels):" +msgstr "Lebar (piksel):" + +#: ../src/vikwindow.c:4459 +msgid "Height (pixels):" +msgstr "Tinggi (piksel):" + +#: ../src/vikwindow.c:4462 +msgid "" +"WARNING: USING LARGE IMAGES OVER 10000x10000\n" +"MAY CRASH THE PROGRAM!" +msgstr "" + +#: ../src/vikwindow.c:4464 +msgid "Zoom (meters per pixel):" +msgstr "Zum (meter per piksel):" + +#: ../src/vikwindow.c:4480 +msgid "Area in current viewable window" +msgstr "Wilayah di jendela yang kini terlihat" + +#: ../src/vikwindow.c:4490 +msgid "Save as PNG" +msgstr "Simpan sebagai PNG" + +#: ../src/vikwindow.c:4491 +msgid "Save as JPEG" +msgstr "Simpan sebagai JPEG" + +#: ../src/vikwindow.c:4520 +msgid "East-west image tiles:" +msgstr "" + +#: ../src/vikwindow.c:4522 +msgid "North-south image tiles:" +msgstr "" + +#: ../src/vikwindow.c:4619 +msgid "This feature is not available in UTM mode" +msgstr "" + +#: ../src/vikwindow.c:4658 +#, c-format +msgid "Unable to import %s." +msgstr "" + +#: ../src/vikwindow.c:4749 +msgid "Choose a background color" +msgstr "" + +#: ../src/vikwindow.c:4765 +msgid "Choose a track highlight color" +msgstr "" + +#: ../src/vikwindow.c:4814 +msgid "_File" +msgstr "Berkas" + +#: ../src/vikwindow.c:4815 +msgid "_Edit" +msgstr "_Edit" + +#: ../src/vikwindow.c:4817 +msgid "_Show" +msgstr "" + +#: ../src/vikwindow.c:4820 +msgid "_Layers" +msgstr "_Lapisan" + +#: ../src/vikwindow.c:4821 +msgid "_Tools" +msgstr "_Perkakas" + +#: ../src/vikwindow.c:4822 +msgid "_Webtools" +msgstr "" + +#: ../src/vikwindow.c:4823 ../src/vikwindow.c:4893 +msgid "_Help" +msgstr "Bantuan" + +#: ../src/vikwindow.c:4825 +msgid "New file" +msgstr "Berkas baru" + +#: ../src/vikwindow.c:4826 +msgid "_Open..." +msgstr "Buka..." + +#: ../src/vikwindow.c:4826 +msgid "Open a file" +msgstr "Buka berkas" + +#: ../src/vikwindow.c:4827 +msgid "Open _Recent File" +msgstr "" + +#: ../src/vikwindow.c:4828 +msgid "Append _File..." +msgstr "Tambahi Berkas..." + +#: ../src/vikwindow.c:4828 +msgid "Append data from a different file" +msgstr "Tambahkan data dari berkas berbeda" + +#: ../src/vikwindow.c:4829 +msgid "Open GPX as External _Layer..." +msgstr "" + +#: ../src/vikwindow.c:4829 +msgid "Open a GPX file as an external layer" +msgstr "" + +#: ../src/vikwindow.c:4830 +msgid "_Export All" +msgstr "" + +#: ../src/vikwindow.c:4830 +msgid "Export All TrackWaypoint Layers" +msgstr "" + +#: ../src/vikwindow.c:4831 +msgid "_GPX..." +msgstr "" + +#: ../src/vikwindow.c:4831 +msgid "Export as GPX" +msgstr "" + +#: ../src/vikwindow.c:4832 +msgid "A_cquire" +msgstr "" + +#: ../src/vikwindow.c:4833 +msgid "_Directions..." +msgstr "" + +#: ../src/vikwindow.c:4833 +msgid "Get driving directions" +msgstr "" + +#: ../src/vikwindow.c:4835 +msgid "_OSM Traces..." +msgstr "" + +#: ../src/vikwindow.c:4835 +msgid "Get traces from OpenStreetMap" +msgstr "" + +#: ../src/vikwindow.c:4836 +msgid "_My OSM Traces..." +msgstr "" + +#: ../src/vikwindow.c:4836 +msgid "Get Your Own Traces from OpenStreetMap" +msgstr "" + +#: ../src/vikwindow.c:4839 +msgid "Geo_caches..." +msgstr "" + +#: ../src/vikwindow.c:4839 +msgid "Get Geocaches from geocaching.com" +msgstr "" + +#: ../src/vikwindow.c:4842 +msgid "Create waypoints from geotagged images" +msgstr "" + +#: ../src/vikwindow.c:4844 +msgid "Get a file from a URL" +msgstr "" + +#: ../src/vikwindow.c:4846 +msgid "Create waypoints from Wikipedia items in the current view" +msgstr "" + +#: ../src/vikwindow.c:4848 +msgid "_Save" +msgstr "_Simpan" + +#: ../src/vikwindow.c:4848 +msgid "Save the file" +msgstr "Simpan berkas" + +#: ../src/vikwindow.c:4849 +msgid "Save _As..." +msgstr "Simpan Seb_agai..." + +#: ../src/vikwindow.c:4849 +msgid "Save the file under different name" +msgstr "Simpan berkas dengan nama berbeda" + +#: ../src/vikwindow.c:4850 +msgid "Properties..." +msgstr "" + +#: ../src/vikwindow.c:4850 +msgid "File Properties" +msgstr "" + +#: ../src/vikwindow.c:4852 +msgid "Import KMZ _Map File..." +msgstr "" + +#: ../src/vikwindow.c:4852 +msgid "Import a KMZ file" +msgstr "" + +#: ../src/vikwindow.c:4853 +msgid "Generate _KMZ Map File..." +msgstr "" + +#: ../src/vikwindow.c:4853 +msgid "Generate a KMZ file with an overlay of the current view" +msgstr "" + +#: ../src/vikwindow.c:4855 +msgid "_Generate Image File..." +msgstr "" + +#: ../src/vikwindow.c:4855 +msgid "Save a snapshot of the workspace into a file" +msgstr "" + +#: ../src/vikwindow.c:4856 +msgid "Generate _Directory of Images..." +msgstr "" + +#: ../src/vikwindow.c:4856 +msgid "Generate _Directory of Images" +msgstr "" + +#: ../src/vikwindow.c:4857 +msgid "_Print..." +msgstr "Cetak..." + +#: ../src/vikwindow.c:4857 +msgid "Print maps" +msgstr "Cetak peta" + +#: ../src/vikwindow.c:4858 +msgid "E_xit" +msgstr "Keluar" + +#: ../src/vikwindow.c:4858 +msgid "Exit the program" +msgstr "Keluar dari program" + +#: ../src/vikwindow.c:4859 +msgid "Save and Exit" +msgstr "Simpan dan Keluar" + +#: ../src/vikwindow.c:4859 +msgid "Save and Exit the program" +msgstr "Simpan lalu keluar dari program" + +#: ../src/vikwindow.c:4861 +msgid "Go to the Pre_vious Location" +msgstr "" + +#: ../src/vikwindow.c:4861 +msgid "Go to the previous location" +msgstr "" + +#: ../src/vikwindow.c:4862 +msgid "Go to the _Next Location" +msgstr "" + +#: ../src/vikwindow.c:4862 +msgid "Go to the next location" +msgstr "" + +#: ../src/vikwindow.c:4863 +msgid "Go to the _Default Location" +msgstr "" + +#: ../src/vikwindow.c:4863 +msgid "Go to the default location" +msgstr "" + +#: ../src/vikwindow.c:4864 +msgid "Go to the _Auto Location" +msgstr "" + +#: ../src/vikwindow.c:4864 +msgid "Go to a location via automatic lookup" +msgstr "" + +#: ../src/vikwindow.c:4865 +msgid "Go to _Location..." +msgstr "" + +#: ../src/vikwindow.c:4865 +msgid "Go to address/place using text search" +msgstr "Ke alamat/tempat memakai pencarian teks" + +#: ../src/vikwindow.c:4866 +msgid "_Go to Lat/Lon..." +msgstr "Pergi ke Lintang/Bujur..." + +#: ../src/vikwindow.c:4866 +msgid "Go to arbitrary lat/lon coordinate" +msgstr "Pergi ke sebarang koordinat lintang/bujur" + +#: ../src/vikwindow.c:4867 +msgid "Go to UTM..." +msgstr "Pergi ke UTM..." + +#: ../src/vikwindow.c:4867 +msgid "Go to arbitrary UTM coordinate" +msgstr "Pergi ke sebarang koordinat UTM" + +#: ../src/vikwindow.c:4868 +#, fuzzy +msgid "Go to Today" +msgstr "Ke UTM" + +#: ../src/vikwindow.c:4868 +msgid "Go to today on the calendar" +msgstr "" + +#: ../src/vikwindow.c:4869 +msgid "_Refresh" +msgstr "" + +#: ../src/vikwindow.c:4869 +msgid "Refresh any maps displayed" +msgstr "" + +#: ../src/vikwindow.c:4870 +msgid "Set _Highlight Color..." +msgstr "" + +#: ../src/vikwindow.c:4870 +msgid "Set Highlight Color" +msgstr "" + +#: ../src/vikwindow.c:4871 +msgid "Set Bac_kground Color..." +msgstr "" + +#: ../src/vikwindow.c:4871 +msgid "Set Background Color" +msgstr "" + +#: ../src/vikwindow.c:4872 +msgid "Zoom _In" +msgstr "Perbesar" + +#: ../src/vikwindow.c:4872 +msgid "Zoom In" +msgstr "" + +#: ../src/vikwindow.c:4873 +msgid "Zoom _Out" +msgstr "Perkecil" + +#: ../src/vikwindow.c:4873 +msgid "Zoom Out" +msgstr "" + +#: ../src/vikwindow.c:4874 +msgid "Zoom _To..." +msgstr "Pembesaran Ke..." + +#: ../src/vikwindow.c:4874 +msgid "Zoom To" +msgstr "" + +#: ../src/vikwindow.c:4875 +msgid "Pan _North" +msgstr "" + +#: ../src/vikwindow.c:4876 +msgid "Pan _East" +msgstr "" + +#: ../src/vikwindow.c:4877 +msgid "Pan _South" +msgstr "" + +#: ../src/vikwindow.c:4878 +msgid "Pan _West" +msgstr "" + +#: ../src/vikwindow.c:4879 +msgid "Background _Jobs" +msgstr "" + +#: ../src/vikwindow.c:4879 +msgid "Background Jobs" +msgstr "" + +#: ../src/vikwindow.c:4881 +msgid "Cu_t" +msgstr "Potong" + +#: ../src/vikwindow.c:4885 +msgid "Delete All" +msgstr "Hapus Semua" + +#: ../src/vikwindow.c:4886 +msgid "Copy Centre _Location" +msgstr "" + +#: ../src/vikwindow.c:4887 +msgid "_Flush Map Cache" +msgstr "" + +#: ../src/vikwindow.c:4888 +msgid "_Set the Default Location" +msgstr "" + +#: ../src/vikwindow.c:4888 +msgid "Set the Default Location to the current position" +msgstr "" + +#: ../src/vikwindow.c:4889 +msgid "_Preferences" +msgstr "" + +#: ../src/vikwindow.c:4889 +msgid "Program Preferences" +msgstr "" + +#: ../src/vikwindow.c:4890 +msgid "_Layer Defaults" +msgstr "" + +#: ../src/vikwindow.c:4891 +msgid "_Properties" +msgstr "_Properti" + +#: ../src/vikwindow.c:4893 +msgid "Help" +msgstr "" + +#: ../src/vikwindow.c:4894 +msgid "_About" +msgstr "Ihw_al" + +#: ../src/vikwindow.c:4894 +msgid "About" +msgstr "" + +#: ../src/vikwindow.c:4903 +msgid "_KML..." +msgstr "" + +#: ../src/vikwindow.c:4903 +msgid "Export as KML" +msgstr "" + +#: ../src/vikwindow.c:4904 +msgid "Transfer data from a GPS device" +msgstr "Ambil data dari perangkat GPS" + +#: ../src/vikwindow.c:4905 +msgid "Import file via GPSBabel converter" +msgstr "" + +#: ../src/vikwindow.c:4909 +msgid "Import Geo_JSON File..." +msgstr "" + +#: ../src/vikwindow.c:4909 +msgid "Import GeoJSON file" +msgstr "" + +#: ../src/vikwindow.c:4914 +msgid "_UTM Mode" +msgstr "Mode _UTM" + +#: ../src/vikwindow.c:4915 +msgid "_Expedia Mode" +msgstr "Mode _Expedia" + +#: ../src/vikwindow.c:4916 +msgid "_Mercator Mode" +msgstr "Mode _Mercator" + +#: ../src/vikwindow.c:4917 +msgid "Lat_/Lon Mode" +msgstr "" + +#: ../src/vikwindow.c:4921 +msgid "Show _Scale" +msgstr "" + +#: ../src/vikwindow.c:4921 +msgid "Show Scale" +msgstr "Tampilkan Skala" + +#: ../src/vikwindow.c:4922 +msgid "Show _Center Mark" +msgstr "" + +#: ../src/vikwindow.c:4922 +msgid "Show Center Mark" +msgstr "Tampilkan Tanda Pusat" + +#: ../src/vikwindow.c:4923 +msgid "Show _Highlight" +msgstr "" + +#: ../src/vikwindow.c:4923 +msgid "Show Highlight" +msgstr "" + +#: ../src/vikwindow.c:4924 +msgid "_Full Screen" +msgstr "Layar Penuh" + +#: ../src/vikwindow.c:4924 +msgid "Activate full screen mode" +msgstr "Aktifkan mode layar penuh" + +#: ../src/vikwindow.c:4925 +msgid "Show Side _Panel" +msgstr "" + +#: ../src/vikwindow.c:4925 +msgid "Show Side Panel" +msgstr "Tampilkan Panel Sisi" + +#: ../src/vikwindow.c:4926 +msgid "Show Status_bar" +msgstr "" + +#: ../src/vikwindow.c:4926 +msgid "Show Statusbar" +msgstr "" + +#: ../src/vikwindow.c:4927 +msgid "Show _Toolbar" +msgstr "" + +#: ../src/vikwindow.c:4927 +msgid "Show Toolbar" +msgstr "" + +#: ../src/vikwindow.c:4928 +msgid "Show _Menu" +msgstr "" + +#: ../src/vikwindow.c:4928 +msgid "Show Menu" +msgstr "" + +#: ../src/vikwindow.c:4929 +#, fuzzy +msgid "Show Side Panel B_uttons" +msgstr "Tampilkan Panel Sisi" + +#: ../src/vikwindow.c:4929 +#, fuzzy +msgid "Show Side Panel Buttons" +msgstr "Tampilkan Panel Sisi" + +#: ../src/vikwindow.c:4930 +#, fuzzy +msgid "Show Side Panel Ca_lendar" +msgstr "Tampilkan Panel Sisi" + +#: ../src/vikwindow.c:4930 +#, fuzzy +msgid "Show Side Panel Calendar" +msgstr "Tampilkan Panel Sisi" + +#: ../src/vikwindow.c:5064 +#, c-format +msgid "New _%s Layer" +msgstr "" + +#: ../src/vikwindow.c:5114 +#, fuzzy +msgid "..." +msgstr "Tambah..." + +#: ../src/viking.desktop.in.h:2 +msgid "GPS Data Manager" +msgstr "Pengelola Data GPS" + +#: ../src/viking.desktop.in.h:3 +msgid "Map Based GPS Data Manager (live data capable)." +msgstr "Pengelola Data GPS Berbasis Peta (mampu menangani data live)." + +#: ../src/libjpeg/jpeg-data.c:205 +msgid "Data does not follow JPEG specification." +msgstr "" + +#: ../src/libjpeg/jpeg-data.c:302 +#, c-format +msgid "Path '%s' invalid." +msgstr "" + +#: ../src/libjpeg/jpeg-data.c:320 +#, c-format +msgid "Could not read '%s'." +msgstr "" + +#~ msgid "Email:" +#~ msgstr "Email:" diff --git a/po/it.po b/po/it.po new file mode 100644 index 0000000..be08d95 --- /dev/null +++ b/po/it.po @@ -0,0 +1,6183 @@ +# Italian translation for viking +# Copyright (c) 2008 Rosetta Contributors and Canonical Ltd 2008 +# This file is distributed under the same license as the viking package. +# FIRST AUTHOR , 2008. +# +msgid "" +msgstr "" +"Project-Id-Version: viking\n" +"Report-Msgid-Bugs-To: \n" +"POT-Creation-Date: 2019-01-19 12:53+0000\n" +"PO-Revision-Date: 2013-06-30 07:58+0000\n" +"Last-Translator: Cristian Marchi \n" +"Language-Team: Italian \n" +"Language: it\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-Launchpad-Export-Date: 2018-12-21 17:32+0000\n" +"X-Generator: Launchpad (build 18847)\n" + +#: ../src/acquire.c:106 ../src/vikgpslayer.c:1367 +msgid "Done." +msgstr "Fatto." + +#: ../src/acquire.c:115 +msgid "No data." +msgstr "Nessun dato." + +#: ../src/acquire.c:167 ../src/acquire.c:415 +msgid "Error: acquisition failed." +msgstr "Errore: acquisizione non riuscita." + +#: ../src/acquire.c:339 +msgid "Working..." +msgstr "In esecuzione..." + +#. This shouldn't happen... +#: ../src/acquire.c:406 +msgid "" +"Unable to create command\n" +"Acquire method failed." +msgstr "Questo non dovrebbe accadere..." + +#: ../src/acquire.c:513 +msgid "_Filter" +msgstr "_Filtra" + +#: ../src/acquire.c:528 +#, c-format +msgid "Filter with %s" +msgstr "Filtra con %s" + +#: ../src/acquire.c:545 +msgid "Filter" +msgstr "Filtra" + +#: ../src/babel.c:640 +msgid "GPSBabel:" +msgstr "" + +#: ../src/babel.c:641 +msgid "" +"Allow setting the specific instance of GPSBabel. You must restart Viking for " +"this value to take effect." +msgstr "" + +#: ../src/babel_ui.c:79 +msgid "Select a file format" +msgstr "" + +#: ../src/babel_ui.c:144 ../src/viktrwlayer.c:531 ../src/viktrwlayer.c:2882 +msgid "Tracks" +msgstr "Tracciati" + +#: ../src/babel_ui.c:149 ../src/viktrwlayer.c:2892 +msgid "Routes" +msgstr "" + +#. ***** PARAMETERS ***** +#: ../src/babel_ui.c:154 ../src/viktrwlayer.c:531 ../src/viktrwlayer.c:2887 +msgid "Waypoints" +msgstr "Waypoint" + +#: ../src/background.c:64 +#, c-format +msgid "%d items" +msgstr "%d elementi" + +#: ../src/background.c:287 +msgid "Threads:" +msgstr "" + +#: ../src/background.c:288 +msgid "" +"Number of threads to use for Mapnik tasks. You need to restart Viking for a " +"change to this value to be used" +msgstr "" + +#: ../src/background.c:361 +msgid "Job" +msgstr "Lavoro" + +#: ../src/background.c:365 +msgid "Progress" +msgstr "Avanzamento" + +#: ../src/background.c:373 +msgid "Viking Background Jobs" +msgstr "Processi in background di Viking" + +#: ../src/bing.c:42 +msgid "Bing Aerial" +msgstr "" + +#: ../src/bing.c:48 +msgid "Bing" +msgstr "Bing" + +#. VIK_GTK_WINDOW_FROM_WIDGET(vp) +#: ../src/bingmapsource.c:514 +msgid "Bing attribution Loading" +msgstr "Caricamento attributi di Bing" + +#: ../src/clipboard.c:95 +msgid "paste failed" +msgstr "Impossibile incollare" + +#: ../src/clipboard.c:105 +msgid "wrong clipboard data size" +msgstr "dimensione dei dati negli appunti sbagliata" + +#: ../src/clipboard.c:124 +#, c-format +msgid "" +"The clipboard contains sublayer data for %s layers. You must select a layer " +"of this type to paste the clipboard data." +msgstr "" +"La clipboard contiene dati di sottolivello per i livelli %s. Devi " +"selezionare un livello di questo tipo per incollare i dati della clipboard." + +#: ../src/clipboard.c:264 +msgid "" +"In order to paste a waypoint, please select an appropriate layer to paste " +"into." +msgstr "" +"Per incollare un waypoint, selezionare un livello appropriato in cui " +"incollarlo." + +#: ../src/dialog.c:60 +msgid "Go to Lat/Lon" +msgstr "Vai a Lat/Lon" + +#: ../src/dialog.c:69 ../src/viktrwlayer_wpwin.c:173 +msgid "Latitude:" +msgstr "Latitudine:" + +#: ../src/dialog.c:72 ../src/viktrwlayer_wpwin.c:177 +msgid "Longitude:" +msgstr "Longitudine:" + +#: ../src/dialog.c:102 +msgid "Go to UTM" +msgstr "Vai a UTM" + +#: ../src/dialog.c:114 +msgid "Northing:" +msgstr "" +"Copy text \t\r\n" +"Northing:" + +#: ../src/dialog.c:117 +msgid "Easting:" +msgstr "Easting:" + +#: ../src/dialog.c:121 ../src/vikgeoreflayer.c:902 +msgid "Zone:" +msgstr "Zona:" + +#: ../src/dialog.c:124 ../src/vikgeoreflayer.c:904 +msgid "Letter:" +msgstr "Lettera:" + +#: ../src/dialog.c:246 ../src/geonamessearch.c:238 +#: ../src/datasource_osm_my_traces.c:505 +msgid "Nothing was selected" +msgstr "Niente di selezionato" + +#: ../src/dialog.c:254 +msgid "Add Route" +msgstr "" + +#: ../src/dialog.c:254 +msgid "Add Track" +msgstr "Aggiungi traccia" + +#: ../src/dialog.c:262 +msgid "Route Name:" +msgstr "" + +#: ../src/dialog.c:262 +msgid "Track Name:" +msgstr "Nome traccia:" + +#: ../src/dialog.c:282 +msgid "Please enter a name for the track." +msgstr "Inserire un nome per la traccia." + +#: ../src/dialog.c:311 +msgid "Today" +msgstr "" + +#: ../src/dialog.c:393 +msgid "Zoom Factors..." +msgstr "Fattori di zoom..." + +#: ../src/dialog.c:407 +msgid "Zoom factor (in meters per pixel):" +msgstr "Fattore di ingrandimento (in merti per pixel):" + +#: ../src/dialog.c:408 +msgid "X (easting): " +msgstr "X (easting) " + +#: ../src/dialog.c:409 +msgid "Y (northing): " +msgstr "Y (northing): " + +#: ../src/dialog.c:414 +msgid "X and Y zoom factors must be equal" +msgstr "I fattori di zoom di X e Y devono essere uguali" + +#: ../src/dialog.c:469 +msgid "1 min" +msgstr "1 min" + +#: ../src/dialog.c:470 +msgid "1 hour" +msgstr "1 ora" + +#: ../src/dialog.c:471 +msgid "1 day" +msgstr "1 giorno" + +#: ../src/dialog.c:472 +msgid "Custom (in minutes):" +msgstr "Personalizzato (in minuti)" + +#: ../src/dialog.c:608 +#, c-format +msgid "" +"2003-2008, Evan Battaglia\n" +"2008-%s, Viking's contributors" +msgstr "" + +#: ../src/dialog.c:609 +msgid "GPS Data and Topo Analyzer, Explorer, and Manager." +msgstr "Gestione, esplorazione, analisi topografica e GPS." + +#: ../src/dialog.c:610 +msgid "" +"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.\n" +"\n" +"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.\n" +"\n" +"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., 59 Temple " +"Place, Suite 330, Boston, MA 02111-1307, USA" +msgstr "" +"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.\n" +"\n" +"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.\n" +"\n" +"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., 59 Temple " +"Place, Suite 330, Boston, MA 02111-1307, USA" + +#: ../src/dialog.c:703 +msgid "Translation is coordinated on http://launchpad.net/viking" +msgstr "Le traduzioni vengono coordinate su http://launchpad.net/viking" + +#: ../src/dialog.c:713 +msgid "Download along track" +msgstr "Scarica lungo il tracciato" + +#: ../src/dialog.c:720 +msgid "Map type:" +msgstr "Tipo di mappa:" + +#: ../src/dialog.c:726 +msgid "Zoom level:" +msgstr "Livello di ingrandimento:" + +#: ../src/dialog.c:766 +#, c-format +msgid "The map data is licensed: %s." +msgstr "La mappa dei dati è protetta da licenza: %s." + +#: ../src/dialog.c:769 +#, c-format +msgid "" +"The data provided by '%s' are licensed under the following license: " +"%s." +msgstr "" + +#: ../src/dialog.c:773 +msgid "Open license" +msgstr "Apri licenza" + +#: ../src/expedia.c:54 +msgid "Expedia Street Maps" +msgstr "Mappe stradali di Expedia" + +#: ../src/expedia.c:82 +msgid "Invalid expedia altitude" +msgstr "Altitudine di expedia non valida" + +#: ../src/expedia.c:113 +#, c-format +msgid "" +"Couldn't open EXPEDIA image file (right after successful download! Please " +"report and delete image file!): %s" +msgstr "" +"Impossibile aprire il file immagine di EXPEDIA (successivamente ad un " +"download corretto! Se pregato di segnalarci questo fatto e di cancellare il " +"file!): %s" + +#: ../src/expedia.c:126 +#, c-format +msgid "" +"Couldn't save EXPEDIA image file (right after successful download! Please " +"report and delete image file!): %s" +msgstr "" +"Impossibile salvare il file immagine di EXPEDIA (successivamente ad un " +"download corretto! Se pregato di segnalarci questo fatto e di cancellare il " +"file!): %s" + +#: ../src/geonamessearch.c:115 +msgid "Search" +msgstr "Cerca" + +#: ../src/geonamessearch.c:117 +msgid "No entries found!" +msgstr "Nessuna voce trovata!" + +#. NB could allow columns to be shifted around by doing this after each new +#. gtk_tree_view_column_set_reorderable ( column, TRUE ); +#. However I don't think is that useful, so I haven't put it in +#: ../src/geonamessearch.c:171 ../src/datasource_osm_my_traces.c:422 +#: ../src/viktrwlayer_tracklist.c:621 ../src/viktrwlayer_waypointlist.c:618 +msgid "Name" +msgstr "" + +#: ../src/geonamessearch.c:176 +msgid "Feature" +msgstr "Funzionalità" + +#: ../src/geonamessearch.c:181 ../src/datasource_osm_my_traces.c:437 +msgid "Lat/Lon" +msgstr "Lat/Lon" + +#: ../src/geonamessearch.c:264 ../src/googlesearch.c:101 ../src/vikgoto.c:430 +msgid "couldn't map temp file" +msgstr "Imopssibile mappare il file temporaneo" + +#: ../src/geonamessearch.c:459 +#, fuzzy +msgid "Select articles" +msgstr "Strumento di Selezione" + +#: ../src/geonamessearch.c:459 +msgid "Select the articles you want to add." +msgstr "" + +#: ../src/geonamessearch.c:475 +msgid "city" +msgstr "" + +#: ../src/geonamessearch.c:477 +#, fuzzy +msgid "edu" +msgstr "Media" + +#: ../src/geonamessearch.c:479 +msgid "airport" +msgstr "" + +#: ../src/geonamessearch.c:481 +msgid "mountain" +msgstr "" + +#: ../src/geonamessearch.c:483 +msgid "forest" +msgstr "" + +#: ../src/geonamessearch.c:485 +msgid "church" +msgstr "" + +#: ../src/geojson.c:74 +#, c-format +msgid "%s command failed: %s" +msgstr "" + +#: ../src/geojson.c:146 ../src/gpx.c:1317 +#, c-format +msgid "failed to open temporary file: %s" +msgstr "Apertura del file temporaneo %s fallita." + +#: ../src/globals.c:67 +msgid "DDD" +msgstr "" + +#: ../src/globals.c:67 +#, fuzzy +msgid "DMM" +msgstr "DEM" + +#: ../src/globals.c:67 +#, fuzzy +msgid "DMS" +msgstr "DEM" + +#: ../src/globals.c:67 +msgid "Raw" +msgstr "" + +#: ../src/globals.c:68 +msgid "Kilometres" +msgstr "" + +#: ../src/globals.c:68 +msgid "Miles" +msgstr "" + +#: ../src/globals.c:68 +msgid "Nautical Miles" +msgstr "" + +#. VIK_UNITS_SPEED_KILOMETRES_PER_HOUR: +#: ../src/globals.c:69 ../src/viktrwlayer_tracklist.c:655 ../src/vikutils.c:100 +msgid "km/h" +msgstr "" + +#: ../src/globals.c:69 ../src/viktrwlayer_tracklist.c:656 ../src/vikutils.c:78 +msgid "mph" +msgstr "" + +#. VIK_UNITS_SPEED_METRES_PER_SECOND: +#: ../src/globals.c:69 ../src/viktrwlayer_tracklist.c:663 ../src/vikutils.c:81 +msgid "m/s" +msgstr "" + +#: ../src/globals.c:69 ../src/viktrwlayer_tracklist.c:657 ../src/vikutils.c:84 +msgid "knots" +msgstr "" + +#: ../src/globals.c:69 ../src/viktrwlayer_tracklist.c:658 ../src/vikutils.c:87 +msgid "s/km" +msgstr "" + +#: ../src/globals.c:69 ../src/viktrwlayer_tracklist.c:659 ../src/vikutils.c:90 +msgid "min/km" +msgstr "" + +#: ../src/globals.c:69 +msgid "s/mi" +msgstr "" + +#: ../src/globals.c:69 ../src/viktrwlayer_tracklist.c:661 ../src/vikutils.c:96 +msgid "min/mi" +msgstr "" + +#: ../src/globals.c:70 +msgid "Metres" +msgstr "" + +#: ../src/globals.c:70 +msgid "Feet" +msgstr "" + +#: ../src/globals.c:73 +msgid "Locale" +msgstr "" + +#: ../src/globals.c:73 +msgid "World" +msgstr "" + +#: ../src/globals.c:73 +msgid "UTC" +msgstr "" + +#: ../src/globals.c:76 +msgid "Degree format:" +msgstr "Formato gradi:" + +#: ../src/globals.c:77 +msgid "Distance units:" +msgstr "Unità di distanza:" + +#: ../src/globals.c:78 +msgid "Speed units:" +msgstr "Unità di velocità:" + +#: ../src/globals.c:79 +msgid "Height units:" +msgstr "Unità di altezza:" + +#: ../src/globals.c:80 +msgid "Use large waypoint icons:" +msgstr "Usa icone grandi per i waypoint:" + +#: ../src/globals.c:81 +msgid "Default latitude:" +msgstr "Latitudine predefinita:" + +#: ../src/globals.c:82 +msgid "Default longitude:" +msgstr "Longitudine predefinita:" + +#: ../src/globals.c:83 +msgid "Time Display:" +msgstr "" + +#: ../src/globals.c:84 +msgid "" +"Display times according to the reference frame. Locale is the user's system " +"setting. World is relative to the location of the object." +msgstr "" + +#: ../src/globals.c:90 +msgid "Alphabetical" +msgstr "" + +#: ../src/globals.c:90 ../src/datasource_osm_my_traces.c:432 +msgid "Time" +msgstr "" + +#: ../src/globals.c:90 +msgid "Creation" +msgstr "" + +#: ../src/globals.c:91 +msgid "Title Case" +msgstr "" + +#: ../src/globals.c:91 +msgid "Lowercase" +msgstr "" + +#: ../src/globals.c:94 +msgid "KML File Export Units:" +msgstr "Unità di Esportazione dei file KML:" + +#: ../src/globals.c:95 +msgid "GPX Track Order:" +msgstr "" + +#: ../src/globals.c:96 +msgid "GPX Waypoint Symbols:" +msgstr "" + +#: ../src/globals.c:97 +msgid "" +"Save GPX Waypoint Symbol names in the specified case. May be useful for " +"compatibility with various devices" +msgstr "" + +#: ../src/globals.c:98 +msgid "GPX Creator:" +msgstr "" + +#: ../src/globals.c:99 +msgid "" +"The creator value when writing a GPX file. Otherwise when blank a default is " +"used." +msgstr "" + +#: ../src/globals.c:104 +msgid "Image Viewer:" +msgstr "Visualizzatore di immagine:" + +#: ../src/globals.c:109 +msgid "External GPX Program 1:" +msgstr "Programma GPX esterno 1:" + +#: ../src/globals.c:110 +msgid "External GPX Program 2:" +msgstr "Programma GPX esterno 2:" + +#: ../src/globals.c:113 +msgid "Absolute" +msgstr "" + +#: ../src/globals.c:113 +msgid "Relative" +msgstr "" + +#: ../src/globals.c:117 +msgid "Save File Reference Mode:" +msgstr "" + +#: ../src/globals.c:118 +msgid "" +"When saving a Viking .vik file, this determines how the directory paths of " +"filenames are written." +msgstr "" + +#: ../src/globals.c:119 +msgid "Ask for Name before Track Creation:" +msgstr "" + +#: ../src/globals.c:120 +msgid "Show Tooltip during Track Creation:" +msgstr "" + +#: ../src/globals.c:121 +msgid "The number of recent files:" +msgstr "" + +#: ../src/globals.c:122 +msgid "" +"Only applies to new windows or on application restart. -1 means all " +"available files." +msgstr "" + +#: ../src/globals.c:123 +#, fuzzy +msgid "Open files in selected layer:" +msgstr "Elimina livello selezionato" + +#: ../src/globals.c:124 +msgid "Open files (but not .vik ones) into the selected TrackWaypoint layer." +msgstr "" + +#: ../src/globals.c:125 +msgid "Show calendar day names:" +msgstr "" + +#: ../src/globals.c:128 +msgid "Home Location" +msgstr "" + +#: ../src/globals.c:128 +msgid "Last Location" +msgstr "" + +#: ../src/globals.c:128 +msgid "Specified File" +msgstr "" + +#: ../src/globals.c:128 +msgid "Auto Location" +msgstr "" + +#: ../src/globals.c:131 +msgid "Restore Window Setup:" +msgstr "" + +#: ../src/globals.c:132 +msgid "Restore window size and layout" +msgstr "" + +#: ../src/globals.c:133 +msgid "Add a Default Map Layer:" +msgstr "" + +#: ../src/globals.c:134 +msgid "" +"The default map layer added is defined by the Layer Defaults. Use the menu " +"Edit->Layer Defaults->Map... to change the map type and other values." +msgstr "" + +#: ../src/globals.c:135 +msgid "Startup Method:" +msgstr "" + +#: ../src/globals.c:136 +msgid "Startup File:" +msgstr "" + +#: ../src/globals.c:137 +msgid "" +"The default file to load on startup. Only applies when the startup method is " +"set to 'Specified File'" +msgstr "" + +#: ../src/globals.c:138 +msgid "Check For New Version:" +msgstr "" + +#: ../src/globals.c:139 +msgid "Periodically check to see if a new version of Viking is available" +msgstr "" + +#. Defaults for the options are setup here +#: ../src/globals.c:176 +msgid "General" +msgstr "Generale" + +#. New Tab +#: ../src/globals.c:204 +msgid "Startup" +msgstr "" + +#. New Tab +#: ../src/globals.c:222 +msgid "Export/External" +msgstr "Esporta/Esterno" + +#. 'Advanced' Properties +#: ../src/globals.c:249 +msgid "Advanced" +msgstr "" + +#. Webtools +#: ../src/google.c:39 +msgid "Google" +msgstr "Google" + +#. If there is an actual description field it will overwrite this value +#: ../src/gpx.c:264 +#, c-format +msgid "Created by: %s" +msgstr "" + +#: ../src/datasource_bfilter.c:43 +msgid "Max number of points:" +msgstr "Numero massimo di punti:" + +#: ../src/datasource_bfilter.c:84 +msgid "Simplify All Tracks..." +msgstr "Semplifica Tutti i Tracciati..." + +#: ../src/datasource_bfilter.c:85 +msgid "Simplified Tracks" +msgstr "Tracciati Semplificati" + +#. { VIK_LAYER_NUM_TYPES, "compressmethod", VIK_LAYER_PARAM_UINT, VIK_LAYER_GROUP_NONE, N_("Simplify Method:"), VIK_LAYER_WIDGET_COMBOBOX, compress_method, NULL, NULL, NULL, NULL, NULL }, +#: ../src/datasource_bfilter.c:111 +msgid "Error Factor:" +msgstr "" + +#: ../src/datasource_bfilter.c:112 +msgid "" +"Specifies the maximum allowable error that may be introduced by removing a " +"single point by the crosstrack method. See the manual or GPSBabel Simplify " +"Filter documentation for more detail." +msgstr "" + +#: ../src/datasource_bfilter.c:166 +msgid "Compress Tracks..." +msgstr "" + +#: ../src/datasource_bfilter.c:167 +msgid "Compressed Tracks" +msgstr "" + +#: ../src/datasource_bfilter.c:197 ../src/datasource_bfilter.c:198 +msgid "Remove Duplicate Waypoints" +msgstr "Rimuovi waypoint doppi" + +#: ../src/datasource_bfilter.c:221 +msgid "Manual filter:" +msgstr "" + +#: ../src/datasource_bfilter.c:222 +msgid "Manual filter command: e.g. 'swap'." +msgstr "" + +#: ../src/datasource_bfilter.c:233 ../src/datasource_bfilter.c:234 +msgid "Manual filter" +msgstr "" + +#: ../src/datasource_bfilter.c:262 +msgid "Waypoints Inside This" +msgstr "Waypoint all'interno di questo" + +#: ../src/datasource_bfilter.c:263 ../src/datasource_bfilter.c:292 +msgid "Polygonized Layer" +msgstr "Livelli Poligonizzati" + +#: ../src/datasource_bfilter.c:291 +msgid "Waypoints Outside This" +msgstr "Waypoint all'esterno di questo" + +#: ../src/datasource_file.c:61 +msgid "Import file with GPSBabel" +msgstr "Importa file con GPBBabel" + +#: ../src/datasource_file.c:62 +msgid "Imported file" +msgstr "File importato" + +#. The file selector +#: ../src/datasource_file.c:129 +msgid "File:" +msgstr "File:" + +#: ../src/datasource_file.c:130 +msgid "File to import" +msgstr "File da importare" + +#: ../src/datasource_file.c:137 +msgid "All files" +msgstr "Tutti i file" + +#. The file format selector +#: ../src/datasource_file.c:144 ../src/datasource_url.c:106 +msgid "File type:" +msgstr "Tipo di file:" + +#: ../src/datasource_file.c:189 +#, c-format +msgid "using babel args '%s' and file '%s'" +msgstr "uso degli argomenti babel '%s' e file '%s'" + +#: ../src/datasource_gc.c:67 +msgid "Download Geocaches" +msgstr "Scarica Geocache" + +#: ../src/datasource_gc.c:68 +msgid "Geocaching.com Caches" +msgstr "Cache di Geocaching.com" + +#: ../src/datasource_gc.c:86 +msgid "geocaching.com username:" +msgstr "Nome utente di geocaching.com:" + +#: ../src/datasource_gc.c:87 +msgid "geocaching.com password:" +msgstr "Password di geocaching.com:" + +#: ../src/datasource_gc.c:92 ../src/vikwindow.c:3502 +msgid "Geocaching" +msgstr "Geocaching" + +#: ../src/datasource_gc.c:128 +#, c-format +msgid "" +"Can't find %s or %s in path! Check that you have installed it correctly." +msgstr "" +"Impossibile trovare %s o %s nel percorso! Controlla siano installati " +"correttamente." + +#: ../src/datasource_gc.c:190 +msgid "Number geocaches:" +msgstr "Numero geocache:" + +#: ../src/datasource_gc.c:192 +msgid "Centered around:" +msgstr "Centrata su:" + +#: ../src/datasource_gc.c:231 +msgid "Broken input - using some defaults" +msgstr "Input corrotto - uso quelli predefiniti" + +#: ../src/datasource_geotag.c:51 +msgid "Create Waypoints from Geotagged Images" +msgstr "Crea Punti di Transito da Immagini Georeferenziate" + +#: ../src/datasource_geotag.c:52 +msgid "Geotagged Images" +msgstr "Immagini Georeferenziate" + +#: ../src/datasource_geotag.c:102 ../src/datasource_geojson.c:93 +#: ../src/vikfileentry.c:171 ../src/vikwindow.c:3533 ../src/vikwindow.c:3610 +#: ../src/vikwindow.c:3641 ../src/vikwindow.c:4356 ../src/vikwindow.c:4649 +msgid "All" +msgstr "Tutti" + +#: ../src/datasource_geotag.c:107 ../src/vikfileentry.c:115 +#: ../src/viktrwlayer_geotag.c:637 ../src/vikwindow.c:3518 +#: ../src/vikwindow.c:4377 +msgid "JPG" +msgstr "JPG" + +#: ../src/datasource_geotag.c:168 +#, c-format +msgid "Unable to create waypoint from %s" +msgstr "Impossibile creare il punto di transito da %s" + +#: ../src/datasource_geojson.c:46 +msgid "Acquire from GeoJSON" +msgstr "" + +#: ../src/datasource_geojson.c:47 ../src/datasource_geojson.c:98 +msgid "GeoJSON" +msgstr "" + +#: ../src/datasource_geojson.c:152 +#, c-format +msgid "Unable to import from: %s" +msgstr "" + +#: ../src/datasource_gps.c:54 +msgid "Acquire from GPS" +msgstr "Acquisisci dal GPS" + +#: ../src/datasource_gps.c:55 +msgid "Acquired from GPS" +msgstr "Aquisiti dal GPS" + +#: ../src/datasource_gps.c:258 +#, c-format +msgid "using cmd '%s' and file '%s'\n" +msgstr "" + +#: ../src/datasource_gps.c:353 ../src/vikgpslayer.c:966 +#, c-format +msgid "Downloading %d waypoint..." +msgid_plural "Downloading %d waypoints..." +msgstr[0] "Download in corso di %d waypoint" +msgstr[1] "Download in corso di %d waypoint" + +#: ../src/datasource_gps.c:358 ../src/vikgpslayer.c:971 +#, c-format +msgid "Downloading %d trackpoint..." +msgid_plural "Downloading %d trackpoints..." +msgstr[0] "Download in corso di %d trackpoint" +msgstr[1] "Download in corso di %d trackpoint" + +#: ../src/datasource_gps.c:363 ../src/vikgpslayer.c:976 +#, c-format +msgid "Downloading %d routepoint..." +msgid_plural "Downloading %d routepoints..." +msgstr[0] "" +msgstr[1] "" + +#: ../src/datasource_gps.c:386 ../src/datasource_gps.c:393 +#: ../src/datasource_gps.c:400 +#, c-format +msgid "Downloaded %d out of %d %s..." +msgstr "Scaricati %d di %d %s" + +#: ../src/datasource_gps.c:388 ../src/datasource_gps.c:395 +#: ../src/datasource_gps.c:402 +#, c-format +msgid "Downloaded %d %s." +msgstr "Scaricati %d %s." + +#: ../src/datasource_gps.c:416 ../src/vikgpslayer.c:1134 +#, c-format +msgid "GPS Device: %s" +msgstr "Dispositivo GPS: %s" + +#: ../src/datasource_gps.c:428 ../src/vikgpslayer.c:1214 +msgid "Status: Working..." +msgstr "" + +#. NB gps_layer_inst_init() is performed after parameter registeration +#. thus to give the protocols some potential values use the old static list +#. TODO: find another way to use gps_layer_inst_init()? +#: ../src/datasource_gps.c:584 ../src/vikgpslayer.c:216 +msgid "GPS Protocol:" +msgstr "Protocollo GPS:" + +#. List reassigned at runtime +#: ../src/datasource_gps.c:609 ../src/vikgpslayer.c:217 +msgid "Serial Port:" +msgstr "Porta seriale:" + +#: ../src/datasource_gps.c:659 +msgid "" +"Turn Off After Transfer\n" +"(Garmin/NAViLink Only)" +msgstr "" +"Spegni al termine del trasferimento\n" +"(solo Garmin/NAViLink)" + +#: ../src/datasource_gps.c:666 +msgid "Tracks:" +msgstr "Tracciati:" + +#: ../src/datasource_gps.c:673 +msgid "Routes:" +msgstr "" + +#: ../src/datasource_gps.c:680 +msgid "Waypoints:" +msgstr "Punti di Transito:" + +#: ../src/datasource_gps.c:756 ../src/vikgpslayer.c:1509 +msgid "GPS device: N/A" +msgstr "Dipositivo GPS: N/D" + +#: ../src/datasource_osm.c:53 ../src/datasource_osm.c:54 +msgid "OSM traces" +msgstr "Tracce OSM" + +#: ../src/datasource_osm.c:89 +msgid "Page number:" +msgstr "Numero della pagina:" + +#: ../src/datasource_osm_my_traces.c:59 ../src/datasource_osm_my_traces.c:60 +msgid "OSM My Traces" +msgstr "" + +#: ../src/datasource_osm_my_traces.c:106 ../src/osm-traces.c:684 +#, fuzzy +msgid "Email/username:" +msgstr "Nome utente:" + +#: ../src/datasource_osm_my_traces.c:111 +msgid "The email or username used to login to OSM" +msgstr "L'indirizzo email o il nome utente utilizzato per l'accesso a OSM" + +#: ../src/datasource_osm_my_traces.c:113 ../src/osm-traces.c:692 +msgid "Password:" +msgstr "Password:" + +#: ../src/datasource_osm_my_traces.c:116 +msgid "The password used to login to OSM" +msgstr "La password per l'accesso a OSM" + +#: ../src/datasource_osm_my_traces.c:427 ../src/viktrwlayer.c:689 +msgid "Description" +msgstr "Descrizione" + +#: ../src/datasource_osm_my_traces.c:442 +msgid "Privacy" +msgstr "Privacy" + +#: ../src/datasource_osm_my_traces.c:449 +msgid "Within Current View" +msgstr "" + +#: ../src/datasource_osm_my_traces.c:516 +msgid "GPS Traces" +msgstr "" + +#: ../src/datasource_osm_my_traces.c:518 +msgid "None found!" +msgstr "" + +#: ../src/datasource_osm_my_traces.c:569 +msgid "Ensure the OSM access token preferences are setup." +msgstr "" + +#: ../src/datasource_osm_my_traces.c:645 +msgid "My OSM Traces" +msgstr "" + +#. Report errors to the status bar +#: ../src/datasource_osm_my_traces.c:667 +#, c-format +msgid "Unable to get trace: %s" +msgstr "" + +#: ../src/datasource_routing.c:56 ../src/datasource_routing.c:57 +msgid "Directions" +msgstr "" + +#: ../src/datasource_routing.c:90 +msgid "No routing engines with directions available" +msgstr "" + +#. Engine selector +#: ../src/datasource_routing.c:99 +msgid "Engine:" +msgstr "" + +#. From and To entries +#: ../src/datasource_routing.c:104 +msgid "From:" +msgstr "Da:" + +#: ../src/datasource_routing.c:105 +msgid "To:" +msgstr "A:" + +#: ../src/datasource_url.c:48 +msgid "Acquire from URL" +msgstr "" + +#: ../src/datasource_url.c:49 +msgid "URL" +msgstr "" + +#: ../src/datasource_url.c:101 +msgid "URL:" +msgstr "" + +#. Only GPX (not using GPSbabel) +#: ../src/datasource_url.c:133 ../src/vikfileentry.c:161 +#: ../src/vikwindow.c:3513 ../src/vikwindow.c:3603 +msgid "GPX" +msgstr "GPX" + +#: ../src/datasource_wikipedia.c:32 +msgid "Create Waypoints from Wikipedia Articles" +msgstr "" + +#: ../src/datasource_wikipedia.c:33 +msgid "Wikipedia Waypoints" +msgstr "" + +#: ../src/dem.c:66 ../src/dem.c:80 +msgid "Invalid DEM" +msgstr "DEM non valido" + +#: ../src/dem.c:122 +msgid "Invalid DEM header" +msgstr "Header DEM non valido" + +#: ../src/dem.c:191 ../src/dem.c:204 +msgid "Incorrect DEM Class B record: expected 1" +msgstr "DEM Classe B non corretta: attesa 1" + +#: ../src/dem.c:289 ../src/download.c:176 +#, c-format +msgid "Couldn't map file %s: %s" +msgstr "Impossibile mappare il file %s: %s" + +#: ../src/download.c:130 +msgid "Tile age (days):" +msgstr "" + +#: ../src/download.c:406 +#, c-format +msgid "Download error: %s" +msgstr "Errore durante il download: %s" + +#: ../src/download.c:490 +msgid "couldn't open temp file" +msgstr "Impossibile aprire il file temporaneo" + +#: ../src/file.c:458 ../src/file.c:463 +#, c-format +msgid "Draw mode '%s' no more supported" +msgstr "Modalità '%s' non più supportata" + +#: ../src/geotag_exif.c:621 +msgid "Not enough memory." +msgstr "Memoria insufficiente." + +#: ../src/geotag_exif.c:639 +msgid "Setting a value for this tag is unsupported!" +msgstr "L'impostazione di un valore per questo tag non è supportato!" + +#: ../src/geotag_exif.c:658 +#, c-format +msgid "Too few components specified (need %d, found %d)\n" +msgstr "Troppo pochi componenti specificati (necessari %d, trovati %d)\n" + +#: ../src/geotag_exif.c:662 +msgid "Numeric value expected\n" +msgstr "Valore numerico atteso\n" + +#: ../src/geotag_exif.c:670 +msgid "This shouldn't happen!" +msgstr "Questo non dovrebbe accadere!" + +#: ../src/geotag_exif.c:740 +msgid "Not yet implemented!" +msgstr "Non ancora implementato" + +#: ../src/geotag_exif.c:753 +msgid "Warning; Too many components specified!" +msgstr "Attenzione; Troppi componenti specificati!" + +#: ../src/osm-traces.c:87 +msgid "Identifiable (public w/ timestamps)" +msgstr "Identificabili (strada pubblica/ marcatori temporali)" + +#: ../src/osm-traces.c:88 +msgid "Trackable (private w/ timestamps)" +msgstr "Tracciabile (strada privata/ marcatori temporali)" + +#: ../src/osm-traces.c:89 +msgid "Public" +msgstr "Pubblico" + +#: ../src/osm-traces.c:90 +msgid "Private" +msgstr "Privato" + +#: ../src/osm-traces.c:108 +msgid "Access Token:" +msgstr "" + +#: ../src/osm-traces.c:108 +msgid "Get New OSM Access Tokens" +msgstr "" + +#: ../src/osm-traces.c:109 +msgid "Access Token Key:" +msgstr "" + +#: ../src/osm-traces.c:110 +msgid "Access Token Secret:" +msgstr "" + +#: ../src/osm-traces.c:111 +msgid "OSM username:" +msgstr "Username OSM:" + +#: ../src/osm-traces.c:112 +msgid "OSM password:" +msgstr "Password OSM:" + +#. Check to really override existing values... +#: ../src/osm-traces.c:263 +msgid "Do you want to overwrite existing values?" +msgstr "" + +#: ../src/osm-traces.c:275 +msgid "Not able to generate OSM request tokens." +msgstr "" + +#: ../src/osm-traces.c:299 +msgid "" +"Waiting for authorization approval.\n" +"Ensure you have granted access at the website before continuing here." +msgstr "" + +#: ../src/osm-traces.c:315 +msgid "No Authorization." +msgstr "" + +#: ../src/osm-traces.c:354 +msgid "" +"OSM Username and Password preferences are not required anymore. You can now " +"remove them." +msgstr "" + +#. Preferences +#: ../src/osm-traces.c:379 +msgid "OpenStreetMap Traces" +msgstr "Tracce OpenStreetMap" + +#: ../src/osm-traces.c:504 +#, c-format +msgid "failed to upload data: HTTP response is %ld" +msgstr "Impossibile effettuare l'upload: la risposta HTTP è %ld" + +#: ../src/osm-traces.c:509 +#, c-format +msgid "curl_easy_getinfo failed: %d" +msgstr "errore di curl_easy_getinfo: %d" + +#: ../src/osm-traces.c:514 +#, c-format +msgid "curl request failed: %s" +msgstr "Errore di curl request: %s" + +#. Success +#: ../src/osm-traces.c:592 +msgid "Uploaded to OSM" +msgstr "Caricato su OSM" + +#: ../src/osm-traces.c:596 +msgid "" +"FAILED TO UPLOAD DATA TO OSM - Ensure the OSM access token preferences are " +"setup." +msgstr "" + +#: ../src/osm-traces.c:599 +msgid "FAILED TO UPLOAD DATA TO OSM - CURL PROBLEM" +msgstr "CARICAMENTO DEI DATI ALL'OSM NON RIUSCITA - PROBLEMA CURL" + +#: ../src/osm-traces.c:602 +msgid "FAILED TO UPLOAD DATA TO OSM" +msgstr "CARICAMENTO DEI DATI ALL'OSM NON RIUSCITO" + +#: ../src/osm-traces.c:602 +msgid "HTTP response code" +msgstr "Codice di risposta HTTP" + +#: ../src/osm-traces.c:610 +#, c-format +msgid "failed to unlink temporary file: %s" +msgstr "Impossibile eseguire l'unlink del file temporaneo: %s" + +#: ../src/osm-traces.c:664 +msgid "OSM upload" +msgstr "upload OSM" + +#: ../src/osm-traces.c:689 +#, fuzzy +msgid "" +"The email/username used as login\n" +"Enter the email/username you use to login into www.openstreetmap.org." +"" +msgstr "" +"L'indirizzo email utilizzata per effettuare il login\n" +"Inserisci l'indirizzo email utilizzato per effettuare il login di www." +"openstreetmap.org." + +#: ../src/osm-traces.c:697 +msgid "" +"The password used to login\n" +"Enter the password you use to login into www.openstreetmap.org." +msgstr "" +"La password utilizzata per effettuare il login\n" +"Inserisci la password che utilizzi per effettuare il login su www." +"openstreetmap.org." + +#: ../src/osm-traces.c:703 +msgid "File's name:" +msgstr "Nome del file:" + +#: ../src/osm-traces.c:713 +msgid "" +"The name of the file on OSM\n" +"This is the name of the file created on the server.This is not the " +"name of the local file." +msgstr "" +"Il nome del file su OSM\n" +"Questo è il nome del file creato sul server. Questo non è il nome del " +"file in locale" + +#: ../src/osm-traces.c:717 ../src/viktrwlayer_wpwin.c:197 +#: ../src/viktrwlayer_wpwin.c:199 +msgid "Description:" +msgstr "Descrizione:" + +#: ../src/osm-traces.c:731 +msgid "The description of the trace" +msgstr "La descrizione della traccia" + +#: ../src/osm-traces.c:734 +msgid "Anonymize Times:" +msgstr "" + +#: ../src/osm-traces.c:739 +msgid "" +"Anonymize times of the trace.\n" +"You may choose to make the trace identifiable, yet mask the actual " +"real time values" +msgstr "" + +#: ../src/osm-traces.c:743 +msgid "Tags:" +msgstr "Tag:" + +#: ../src/osm-traces.c:751 +msgid "The tags associated to the trace" +msgstr "I tag associati alla traccia" + +#: ../src/osm-traces.c:816 +#, c-format +msgid "Uploading %s to OSM" +msgstr "Caricamento di %s su OSM" + +#: ../src/mapcache.c:67 +msgid "Map cache memory size (MB):" +msgstr "" + +#. NB Can have a couple hundred fonts loaded when using system directories +#. So ATM don't list them all - otherwise need better GUI feedback display. +#: ../src/mapnik_interface.cpp:324 +#, c-format +msgid "" +"%s %s\n" +"Plugins=%sFonts loaded=%d" +msgstr "" + +#: ../src/mapnik_interface.cpp:325 ../src/vikmapniklayer.c:278 +msgid "Mapnik" +msgstr "" + +#: ../src/print.c:51 ../src/viktrwlayer.c:572 +msgid "None" +msgstr "Nessuno" + +#: ../src/print.c:52 +msgid "Horizontally" +msgstr "Orizzontalmente" + +#: ../src/print.c:53 +msgid "Vertically" +msgstr "Verticalmente" + +#: ../src/print.c:54 +msgid "Both" +msgstr "Entrambi" + +#: ../src/print.c:118 +msgid "Image Settings" +msgstr "Impostazioni dell'immagine" + +#: ../src/print.c:551 +msgid "done" +msgstr "fatto" + +#. Page Size +#: ../src/print.c:580 +msgid "_Adjust Page Size and Orientation" +msgstr "Regol_a la dimensione e l'orientamento pagina" + +#: ../src/print.c:596 +msgid "C_enter:" +msgstr "C_entro:" + +#. ignore page margins +#: ../src/print.c:614 +msgid "Ignore Page _Margins" +msgstr "Ignora i _margini della pagina" + +#: ../src/print.c:633 +msgid "Image S_ize:" +msgstr "Dimen_sione immagine:" + +#: ../src/ui_util.c:88 +#, c-format +msgid "Could not launch web browser. %s" +msgstr "" + +#: ../src/ui_util.c:101 +#, c-format +msgid "Could not create new email. %s" +msgstr "" + +#: ../src/vikcoordlayer.c:57 +msgid "Color:" +msgstr "Colore:" + +#: ../src/vikcoordlayer.c:58 +msgid "Minutes Width:" +msgstr "Larghezza minuti:" + +#: ../src/vikcoordlayer.c:59 +msgid "Line Thickness:" +msgstr "Spessore della linea:" + +#: ../src/vikcoordlayer.c:66 +msgid "Coordinate" +msgstr "" + +#: ../src/main.c:92 +#, c-format +msgid "Ignoring Xlib error: error code %d request code %d\n" +msgstr "" + +#: ../src/main.c:111 +msgid "Enable debug output" +msgstr "Abilita output di debug" + +#: ../src/main.c:112 +msgid "Enable verbose output" +msgstr "Abilita output prolisso" + +#: ../src/main.c:113 +msgid "Show version" +msgstr "Mostra versione" + +#: ../src/main.c:114 +msgid "Latitude in decimal degrees" +msgstr "" + +#: ../src/main.c:115 +msgid "Longitude in decimal degrees" +msgstr "" + +#: ../src/main.c:116 +msgid "Zoom Level (OSM). Value can be 0 - 22" +msgstr "" + +#: ../src/main.c:117 +msgid "Add a map layer by id value. Use 0 for the default map." +msgstr "" + +#: ../src/main.c:160 +#, c-format +msgid "" +"%s %s\n" +"Copyright (c) 2003-2008 Evan Battaglia\n" +"Copyright (c) 2008-%s Viking's contributors\n" +msgstr "" + +#: ../src/osm.c:50 +#, fuzzy +msgid "OpenStreetMap (Mapnik)" +msgstr "Tracce OpenStreetMap" + +#: ../src/osm.c:65 +#, fuzzy +msgid "OpenStreetMap (Cycle)" +msgstr "Tracce OpenStreetMap" + +#: ../src/osm.c:79 +#, fuzzy +msgid "OpenStreetMap (Transport)" +msgstr "Tracce OpenStreetMap" + +#: ../src/osm.c:95 +#, fuzzy +msgid "OpenStreetMap (Humanitarian)" +msgstr "Tracce OpenStreetMap" + +#: ../src/osm.c:111 +msgid "On Disk OSM Tile Format" +msgstr "" + +#: ../src/osm.c:121 +msgid "MBTiles File" +msgstr "" + +#: ../src/osm.c:132 +msgid "OSM Metatiles" +msgstr "" + +#: ../src/osm.c:146 +msgid "Mapbox Outdoors" +msgstr "" + +#: ../src/osm.c:153 +msgid "Mapbox Specific" +msgstr "" + +#: ../src/osm.c:170 +msgid "OSM (view)" +msgstr "OSM (visualizza)" + +#: ../src/osm.c:174 +msgid "OSM (edit)" +msgstr "OSM (modifica)" + +#. Note the use of positional parameters +#: ../src/osm.c:179 +msgid "OSM (query)" +msgstr "" + +#: ../src/osm.c:183 +msgid "OSM (render)" +msgstr "OSM (disegna)" + +#. Example: http://127.0.0.1:8111/load_and_zoom?left=8.19&right=8.20&top=48.605&bottom=48.590&select=node413602999 +#. JOSM or merkaartor must already be running with remote interface enabled +#: ../src/osm.c:190 +msgid "Local port 8111 (eg JOSM)" +msgstr "Porta locale 8111 (per esempio JOSM)" + +#: ../src/osm.c:195 +msgid "Geofabrik Map Compare" +msgstr "" + +#: ../src/osm.c:203 +msgid "OpenStreetMap Notes" +msgstr "" + +#. Not really OSM but can't be bothered to create somewhere else to put it... +#: ../src/osm.c:221 +msgid "Wikimedia Toolserver GeoHack" +msgstr "" + +#: ../src/preferences.c:195 +msgid "Preferences" +msgstr "Preferenze" + +#: ../src/toolbar.c:91 ../src/toolbar.c:92 +msgid "System Default" +msgstr "" + +#: ../src/toolbar.c:91 ../src/viktrwlayer.c:563 +msgid "Small" +msgstr "Piccola" + +#: ../src/toolbar.c:91 ../src/viktrwlayer.c:564 +msgid "Medium" +msgstr "Media" + +#: ../src/toolbar.c:91 ../src/viktrwlayer.c:565 +msgid "Large" +msgstr "Grande" + +#: ../src/toolbar.c:92 +msgid "Icons Only" +msgstr "" + +#: ../src/toolbar.c:92 +msgid "Text Only" +msgstr "" + +#: ../src/toolbar.c:92 +msgid "Icons and Text" +msgstr "" + +#: ../src/toolbar.c:106 +msgid "Append to Menu:" +msgstr "" + +#: ../src/toolbar.c:107 +msgid "Pack the toolbar to the main menu to save vertical space" +msgstr "" + +#: ../src/toolbar.c:108 +msgid "Icon Size:" +msgstr "" + +#: ../src/toolbar.c:110 +msgid "Icon Style:" +msgstr "" + +#: ../src/toolbar.c:112 +msgid "Customize:" +msgstr "" + +#: ../src/toolbar.c:112 +msgid "Customize Buttons" +msgstr "" + +#. Preferences +#: ../src/toolbar.c:145 +msgid "Toolbar" +msgstr "" + +#: ../src/toolbar.c:312 +msgid "_Customize" +msgstr "" + +#: ../src/toolbar.c:641 +msgid "Separator" +msgstr "" + +#: ../src/toolbar.c:642 +msgid "--- Separator ---" +msgstr "" + +#: ../src/toolbar.c:1007 +msgid "Customize Toolbar" +msgstr "" + +#: ../src/toolbar.c:1028 +msgid "" +"Select items to be displayed on the toolbar. Items can be reordered by drag " +"and drop." +msgstr "" + +#: ../src/toolbar.c:1044 +msgid "Available Items" +msgstr "" + +#: ../src/toolbar.c:1065 +msgid "Displayed Items" +msgstr "" + +#: ../src/viklayer_defaults.c:232 +#, c-format +msgid "Could not open file: %s" +msgstr "" + +#: ../src/viklayer_defaults.c:304 +msgid "Layer Defaults" +msgstr "" + +#: ../src/uibuilder.c:196 +msgid "Take care that this password will be stored clearly in a plain file." +msgstr "" +"Attenzione, questa password verrà memorizzata in chiaro in un file di testo." + +#: ../src/uibuilder.c:628 ../src/viktrwlayer_export.c:188 +#: ../src/viktrwlayer_export.c:304 ../src/vikwindow.c:3666 +#: ../src/vikwindow.c:4408 +#, c-format +msgid "The file \"%s\" exists, do you wish to overwrite it?" +msgstr "Il file \"%s\" esiste già; sovrascriverlo?" + +#: ../src/vikaggregatelayer.c:41 +msgid "Aggregate" +msgstr "" + +#: ../src/vikaggregatelayer.c:528 ../src/viktrwlayer.c:11700 +#, c-format +msgid "%s: Waypoint List" +msgstr "" + +#: ../src/vikaggregatelayer.c:570 +msgid "Search by Date" +msgstr "" + +#: ../src/vikaggregatelayer.c:576 +msgid "No items found with the requested date." +msgstr "" + +#: ../src/vikaggregatelayer.c:615 ../src/viktrwlayer.c:11691 +#, c-format +msgid "%s: Track and Route List" +msgstr "" + +#: ../src/vikaggregatelayer.c:681 ../src/viktrwlayer.c:8346 +#: ../src/viktrwlayer.c:8417 ../src/viktrwlayer.c:8494 +msgid "_Visibility" +msgstr "" + +#: ../src/vikaggregatelayer.c:686 +msgid "_Show All" +msgstr "" + +#: ../src/vikaggregatelayer.c:692 +msgid "_Hide All" +msgstr "" + +#: ../src/vikaggregatelayer.c:698 ../src/viktrwlayer.c:8363 +#: ../src/viktrwlayer.c:8434 ../src/viktrwlayer.c:8511 +msgid "_Toggle" +msgstr "" + +#: ../src/vikaggregatelayer.c:705 ../src/viktrwlayer.c:8532 +msgid "_Sort" +msgstr "" + +#: ../src/vikaggregatelayer.c:711 ../src/viktrwlayer.c:8538 +msgid "Name _Ascending" +msgstr "" + +#: ../src/vikaggregatelayer.c:717 ../src/viktrwlayer.c:8544 +msgid "Name _Descending" +msgstr "" + +#: ../src/vikaggregatelayer.c:723 ../src/viktrwlayer.c:575 +#: ../src/viktrwlayer.c:8550 +msgid "Date Ascending" +msgstr "" + +#: ../src/vikaggregatelayer.c:729 ../src/viktrwlayer.c:576 +#: ../src/viktrwlayer.c:8556 +msgid "Date Descending" +msgstr "" + +#: ../src/vikaggregatelayer.c:735 ../src/viktrwlayer.c:8445 +#: ../src/viktrwlayer.c:8523 ../src/viktrwlayer.c:8595 +#: ../src/viktrwlayer_tracklist.c:296 +msgid "_Statistics" +msgstr "" + +#: ../src/vikaggregatelayer.c:740 ../src/viktrwlayer.c:4533 +msgid "Track _List..." +msgstr "" + +#: ../src/vikaggregatelayer.c:746 ../src/viktrwlayer.c:4540 +msgid "_Waypoint List..." +msgstr "" + +#: ../src/vikaggregatelayer.c:753 +msgid "Searc_h" +msgstr "" + +#: ../src/vikaggregatelayer.c:759 +msgid "By _Date..." +msgstr "" + +#: ../src/vikaggregatelayer.c:762 +msgid "Find the first item with a specified date" +msgstr "" + +#: ../src/vikaggregatelayer.c:765 +msgid "Load E_xternal Layers" +msgstr "" + +#. Could have a more complicated tooltip that numbers each type of layers, +#. but for now a simple overall count +#: ../src/vikaggregatelayer.c:1011 +#, c-format +msgid "One layer" +msgid_plural "%d layers" +msgstr[0] "" +msgstr[1] "" + +#: ../src/vikaggregatelayer.c:1014 +#, fuzzy, c-format +msgid "Empty" +msgstr "Svuota Tutto (_A)" + +#: ../src/vikdemlayer.c:86 +msgid "SRTM Global 90m (3 arcsec)" +msgstr "" + +#: ../src/vikdemlayer.c:94 +msgid "Absolute height" +msgstr "Altezza assoluta" + +#: ../src/vikdemlayer.c:95 +msgid "Height gradient" +msgstr "Gradiente di altezza" + +#: ../src/vikdemlayer.c:120 +msgid "DEM Files:" +msgstr "File DEM:" + +#: ../src/vikdemlayer.c:121 +msgid "Download Source:" +msgstr "Fonte di scaricamento:" + +#: ../src/vikdemlayer.c:122 +msgid "Min Elev Color:" +msgstr "Colore elevazione minima:" + +#: ../src/vikdemlayer.c:123 ../src/viktrwlayer_wpwin.c:207 +msgid "Type:" +msgstr "Tipo:" + +#: ../src/vikdemlayer.c:124 +msgid "Min Elev:" +msgstr "Elev. minima:" + +#: ../src/vikdemlayer.c:125 +msgid "Max Elev:" +msgstr "Elev. massima:" + +#: ../src/vikdemlayer.c:137 +msgid "_DEM Download" +msgstr "Scarica _DEM" + +#: ../src/vikdemlayer.c:137 +msgid "DEM Download" +msgstr "Scarica DEM" + +#: ../src/vikdemlayer.c:192 +msgid "DEM" +msgstr "DEM" + +#: ../src/vikdemlayer.c:304 +#, c-format +msgid "Number of files: %d" +msgstr "Numero di file: %d" + +#: ../src/vikdemlayer.c:446 +msgid "DEM Loading" +msgstr "Caricamento DEM" + +#: ../src/vikdemlayer.c:927 +#, c-format +msgid "No SRTM data available for %f, %f" +msgstr "Dati SRTM non disponibili per %f, %f" + +#: ../src/vikdemlayer.c:948 +#, c-format +msgid "DEM download failure for %f, %f" +msgstr "" + +#: ../src/vikdemlayer.c:954 +#, c-format +msgid "DEM write failure for %s" +msgstr "" + +#. Probably not over any land... +#: ../src/vikdemlayer.c:1201 +msgid "No DEM File Available" +msgstr "" + +#: ../src/vikdemlayer.c:1220 +#, c-format +msgid "" +"\n" +"Source: %s\n" +"\n" +"DEM File: %s\n" +"DEM File Timestamp: %s" +msgstr "" + +#: ../src/vikdemlayer.c:1224 +#, c-format +msgid "" +"Source: %s\n" +"\n" +"No DEM File!" +msgstr "" + +#: ../src/vikdemlayer.c:1264 +#, c-format +msgid "Downloading DEM %s" +msgstr "Download di DEM %s in corso" + +#: ../src/vikdemlayer.c:1289 +msgid "_Show DEM File Information" +msgstr "" + +#: ../src/vikfileentry.c:72 +msgid "Browse..." +msgstr "Sfoglia..." + +#: ../src/vikfileentry.c:103 +msgid "Choose file" +msgstr "Selezionare il file" + +#: ../src/vikfileentry.c:120 ../src/vikwindow.c:4372 +msgid "PNG" +msgstr "" + +#: ../src/vikfileentry.c:125 +msgid "TIFF" +msgstr "" + +#: ../src/vikfileentry.c:133 +msgid "MBTiles" +msgstr "" + +#: ../src/vikfileentry.c:142 +msgid "XML" +msgstr "" + +#: ../src/vikfileentry.c:149 +msgid "MML" +msgstr "" + +#: ../src/vikfileentry.c:154 +msgid "MSS" +msgstr "" + +#: ../src/vikfilelist.c:49 +msgid "Choose file(s)" +msgstr "Selezionare file" + +#: ../src/vikfilelist.c:182 +msgid "Add..." +msgstr "Aggiungi..." + +#: ../src/vikfilelist.c:183 +msgid "Delete" +msgstr "Elimina" + +#: ../src/vikgeoreflayer.c:97 +msgid "_Georef Move Map" +msgstr "" + +#: ../src/vikgeoreflayer.c:97 +msgid "Georef Move Map" +msgstr "Sposta mappa Georef" + +#: ../src/vikgeoreflayer.c:106 +msgid "Georef Z_oom Tool" +msgstr "" + +#: ../src/vikgeoreflayer.c:106 +msgid "Georef Zoom Tool" +msgstr "Strumento di Zoom Georef" + +#: ../src/vikgeoreflayer.c:117 +msgid "GeoRef Map" +msgstr "" + +#: ../src/vikgeoreflayer.c:214 +msgid "Auto Read World Files:" +msgstr "" + +#: ../src/vikgeoreflayer.c:215 +msgid "" +"Automatically attempt to read associated world file of a new image for a " +"GeoRef layer" +msgstr "" + +#: ../src/vikgeoreflayer.c:511 ../src/vikgeoreflayer.c:797 +#: ../src/vikmapslayer.c:1174 +#, c-format +msgid "Couldn't open image file: %s" +msgstr "Impossibile aprire il file immagine: %s" + +#: ../src/vikgeoreflayer.c:607 ../src/vikgeoreflayer.c:633 +msgid "Choose World file" +msgstr "Seleziona \"World File\"" + +#: ../src/vikgeoreflayer.c:619 +msgid "The World file you requested could not be opened for reading." +msgstr "Il World File richiesto non può essere aperto per la lettura." + +#: ../src/vikgeoreflayer.c:621 +msgid "Unexpected end of file reading World file." +msgstr "Fine del file inattesa durante la lettura del World File." + +#: ../src/vikgeoreflayer.c:646 +msgid "The file you requested could not be opened for writing." +msgstr "" +"Non è stato possibile aprire il file richiesto in modalità di scrittura" + +#: ../src/vikgeoreflayer.c:782 +msgid "Lower right corner values may not be consistent with upper right values" +msgstr "" + +#: ../src/vikgeoreflayer.c:806 +#, c-format +msgid "Invalid image size: %s" +msgstr "" + +#: ../src/vikgeoreflayer.c:831 ../src/viklayer.c:561 ../src/vikwindow.c:4891 +msgid "Layer Properties" +msgstr "Proprietà del livello" + +#: ../src/vikgeoreflayer.c:852 +msgid "World File Parameters:" +msgstr "Parametri del World File:" + +#: ../src/vikgeoreflayer.c:853 +msgid "Load From File..." +msgstr "Carica da file..." + +#: ../src/vikgeoreflayer.c:858 +msgid "Corner pixel easting:" +msgstr "Allineamento angolo verso est in pixel:" + +#: ../src/vikgeoreflayer.c:860 +msgid "the UTM \"easting\" value of the upper-left corner pixel of the map" +msgstr "" + +#: ../src/vikgeoreflayer.c:862 +msgid "Corner pixel northing:" +msgstr "Allineamento angolo verso nord in pixel:" + +#: ../src/vikgeoreflayer.c:864 +msgid "the UTM \"northing\" value of the upper-left corner pixel of the map" +msgstr "" + +#: ../src/vikgeoreflayer.c:866 +msgid "X (easting) scale (mpp): " +msgstr "scala X (easting) (mpp): " + +#: ../src/vikgeoreflayer.c:867 +msgid "Y (northing) scale (mpp): " +msgstr "Scala Y (northing mpp): " + +#: ../src/vikgeoreflayer.c:870 +msgid "the scale of the map in the X direction (meters per pixel)" +msgstr "Scala della mappa nella direxione X (metri per pixel)" + +#: ../src/vikgeoreflayer.c:872 +msgid "the scale of the map in the Y direction (meters per pixel)" +msgstr "Scala della mappa nella direxione Y (metri per pixel)" + +#: ../src/vikgeoreflayer.c:874 +msgid "Map Image:" +msgstr "Immagine della mappa:" + +#: ../src/vikgeoreflayer.c:919 +msgid "Upper left latitude:" +msgstr "" + +#: ../src/vikgeoreflayer.c:921 +msgid "Upper left longitude:" +msgstr "" + +#: ../src/vikgeoreflayer.c:923 +msgid "Lower right latitude:" +msgstr "" + +#: ../src/vikgeoreflayer.c:925 +msgid "Lower right longitude:" +msgstr "" + +#: ../src/vikgeoreflayer.c:937 +msgid "Calculate MPP values from coordinates" +msgstr "" + +#: ../src/vikgeoreflayer.c:938 +msgid "" +"Enter all corner coordinates before calculating the MPP values from the " +"image size" +msgstr "" + +#: ../src/vikgeoreflayer.c:948 +msgid "UTM" +msgstr "" + +#: ../src/vikgeoreflayer.c:949 +msgid "Latitude/Longitude" +msgstr "" + +#: ../src/vikgeoreflayer.c:957 ../src/vikmapniklayer.c:82 +#: ../src/vikmapslayer.c:158 +msgid "Alpha:" +msgstr "Alpha:" + +#. Now with icons +#: ../src/vikgeoreflayer.c:1062 +msgid "_Zoom to Fit Map" +msgstr "_Zoom per adattare la mappa" + +#: ../src/vikgeoreflayer.c:1068 +msgid "_Goto Map Center" +msgstr "_Va al _centro della mappa" + +#: ../src/vikgeoreflayer.c:1074 +msgid "_Export to World File" +msgstr "_Esporta al File del Mondo" + +#: ../src/vikgoto.c:98 +msgid "No goto tool available." +msgstr "Non è disponibile alcuno strumento \"vai a\"." + +#: ../src/vikgoto.c:295 +msgid "goto" +msgstr "Vai a" + +#: ../src/vikgoto.c:297 +msgid "goto provider:" +msgstr "vai al fornitore:" + +#: ../src/vikgoto.c:312 +msgid "Enter address or place name:" +msgstr "Digita l'indirizzo oppure il nome di un luogo" + +#: ../src/vikgoto.c:487 +msgid "Locality" +msgstr "" + +#: ../src/vikgpslayer.c:137 +msgid "Data Mode" +msgstr "Modalità dati" + +#: ../src/vikgpslayer.c:139 +msgid "Realtime Tracking Mode" +msgstr "" + +#: ../src/vikgpslayer.c:176 +msgid "Keep vehicle at center" +msgstr "Mantieni il veicolo al centro" + +#: ../src/vikgpslayer.c:177 +msgid "Keep vehicle on screen" +msgstr "Mantieni il veicolo nello schermo" + +#: ../src/vikgpslayer.c:178 +msgid "Disable" +msgstr "Disabilita" + +#: ../src/vikgpslayer.c:218 +msgid "Download Tracks:" +msgstr "Scarica i Tracciati:" + +#: ../src/vikgpslayer.c:219 +msgid "Upload Tracks:" +msgstr "Carica i Tracciati:" + +#: ../src/vikgpslayer.c:220 +msgid "Download Routes:" +msgstr "" + +#: ../src/vikgpslayer.c:221 +msgid "Upload Routes:" +msgstr "" + +#: ../src/vikgpslayer.c:222 +msgid "Download Waypoints:" +msgstr "Scarica i Punti di Transito:" + +#: ../src/vikgpslayer.c:223 +msgid "Upload Waypoints:" +msgstr "Carica i Punti di Transito:" + +#: ../src/vikgpslayer.c:225 +msgid "Recording tracks" +msgstr "Registra i tracciati" + +#: ../src/vikgpslayer.c:226 +msgid "Jump to current position on start" +msgstr "All'avvio salta alla posizione corrente" + +#: ../src/vikgpslayer.c:227 +msgid "Moving Map Method:" +msgstr "Metodo di spostamento mappa:" + +#: ../src/vikgpslayer.c:228 +msgid "Update Statusbar:" +msgstr "" + +#: ../src/vikgpslayer.c:228 +msgid "Display information in the statusbar on GPS updates" +msgstr "" + +#: ../src/vikgpslayer.c:229 +msgid "Auto Connect" +msgstr "" + +#: ../src/vikgpslayer.c:229 +msgid "Automatically connect to GPSD" +msgstr "" + +#: ../src/vikgpslayer.c:230 +msgid "Gpsd Host:" +msgstr "Host Gpsd:" + +#: ../src/vikgpslayer.c:231 +msgid "Gpsd Port:" +msgstr "Porta di Gpsd:" + +#: ../src/vikgpslayer.c:232 +msgid "Gpsd Retry Interval (seconds):" +msgstr "Intervallo di Prova Gpsd (secondi):" + +#: ../src/vikgpslayer.c:254 +msgid "GPS" +msgstr "GPS" + +#: ../src/vikgpslayer.c:320 ../src/vikgpslayer.c:1504 +msgid "GPS Download" +msgstr "Download GPS" + +#: ../src/vikgpslayer.c:320 ../src/vikgpslayer.c:1504 ../src/viktrwlayer.c:3993 +msgid "GPS Upload" +msgstr "Upload GPS" + +#: ../src/vikgpslayer.c:322 +msgid "GPS Realtime Tracking" +msgstr "Tracciamento GPS in Tempo Reale" + +#: ../src/vikgpslayer.c:458 +msgid "Connected" +msgstr "" + +#: ../src/vikgpslayer.c:460 +msgid "Disconnected" +msgstr "" + +#: ../src/vikgpslayer.c:554 +msgid "Unknown GPS Protocol" +msgstr "Protocollo GPS sconosciuto" + +#: ../src/vikgpslayer.c:572 +msgid "Unknown serial port device" +msgstr "Porta seriale del dispositivo sconosciuta" + +#: ../src/vikgpslayer.c:691 +#, c-format +msgid "%s: unknown parameter" +msgstr "%s: parametro sconosciuto" + +#. Now with icons +#: ../src/vikgpslayer.c:794 +msgid "_Upload to GPS" +msgstr "Carica al GPS (_U)" + +#: ../src/vikgpslayer.c:800 +msgid "Download from _GPS" +msgstr "Scarica dal _GPS" + +#: ../src/vikgpslayer.c:821 +msgid "Empty _Realtime" +msgstr "Svuota Tempo _Reale" + +#: ../src/vikgpslayer.c:828 +msgid "E_mpty Upload" +msgstr "Svuota il Carica_mento" + +#: ../src/vikgpslayer.c:834 +msgid "_Empty Download" +msgstr "Svuota lo Scaricamento (_E)" + +#: ../src/vikgpslayer.c:840 +msgid "Empty _All" +msgstr "Svuota Tutto (_A)" + +#: ../src/vikgpslayer.c:852 +#, c-format +msgid "Unexpected number of disconnected handlers: %d" +msgstr "Numero inatteso di gestori disconnessi: %d" + +#: ../src/vikgpslayer.c:995 +#, c-format +msgid "Uploading %d waypoint..." +msgid_plural "Uploading %d waypoints..." +msgstr[0] "Upload di %d waypoint in corso..." +msgstr[1] "Upload di %d waypoint in corso..." + +#: ../src/vikgpslayer.c:1000 +#, c-format +msgid "Uploading %d trackpoint..." +msgid_plural "Uploading %d trackpoints..." +msgstr[0] "Caricamento di %d punto del tracciato in corso..." +msgstr[1] "Caricamento di %d punti del tracciato in corso..." + +#: ../src/vikgpslayer.c:1005 +#, c-format +msgid "Uploading %d routepoint..." +msgid_plural "Uploading %d routepoints..." +msgstr[0] "" +msgstr[1] "" + +#: ../src/vikgpslayer.c:1034 +#, c-format +msgid "Downloaded %d out of %d waypoint..." +msgid_plural "Downloaded %d out of %d waypoints..." +msgstr[0] "Scaricati %d waypoint su %d..." +msgstr[1] "Scaricati %d waypoint su %d..." + +#: ../src/vikgpslayer.c:1040 +#, c-format +msgid "Downloaded %d out of %d trackpoint..." +msgid_plural "Downloaded %d out of %d trackpoints..." +msgstr[0] "Scaricato %d punto del tracciato su %d..." +msgstr[1] "Scaricati %d punti del tracciato su %d..." + +#: ../src/vikgpslayer.c:1046 +#, c-format +msgid "Downloaded %d out of %d routepoint..." +msgid_plural "Downloaded %d out of %d routepoints..." +msgstr[0] "" +msgstr[1] "" + +#: ../src/vikgpslayer.c:1056 +#, c-format +msgid "Uploaded %d out of %d waypoint..." +msgid_plural "Uploaded %d out of %d waypoints..." +msgstr[0] "Caricati %d di %d waypoint..." +msgstr[1] "Caricati %d di of %d waypoint..." + +#: ../src/vikgpslayer.c:1062 +#, c-format +msgid "Uploaded %d out of %d trackpoint..." +msgid_plural "Uploaded %d out of %d trackpoints..." +msgstr[0] "Caricato %d di %d punto del tracciato..." +msgstr[1] "Caricati %d di %d punti del tracciato..." + +#: ../src/vikgpslayer.c:1068 +#, c-format +msgid "Uploaded %d out of %d routepoint..." +msgid_plural "Uploaded %d out of %d routepoints..." +msgstr[0] "" +msgstr[1] "" + +#: ../src/vikgpslayer.c:1079 +#, c-format +msgid "Downloaded %d waypoint" +msgid_plural "Downloaded %d waypoints" +msgstr[0] "Scaricati %d waypoint" +msgstr[1] "Scaricati %d waypoint" + +#: ../src/vikgpslayer.c:1085 +#, c-format +msgid "Downloaded %d trackpoint" +msgid_plural "Downloaded %d trackpoints" +msgstr[0] "Scaricato %d punto del tracciato" +msgstr[1] "Scaricati %d punti del tracciato" + +#: ../src/vikgpslayer.c:1091 +#, c-format +msgid "Downloaded %d routepoint" +msgid_plural "Downloaded %d routepoints" +msgstr[0] "" +msgstr[1] "" + +#: ../src/vikgpslayer.c:1101 +#, c-format +msgid "Uploaded %d waypoint" +msgid_plural "Uploaded %d waypoints" +msgstr[0] "Caricati %d waypoint" +msgstr[1] "Caricati %d waypoint" + +#: ../src/vikgpslayer.c:1107 +#, c-format +msgid "Uploaded %d trackpoint" +msgid_plural "Uploaded %d trackpoints" +msgstr[0] "Caricato %d punto del tracciato" +msgstr[1] "Caricati %d punti del tracciato" + +#: ../src/vikgpslayer.c:1113 +#, c-format +msgid "Uploaded %d routepoint" +msgid_plural "Uploaded %d routepoints" +msgstr[0] "" +msgstr[1] "" + +#: ../src/vikgpslayer.c:1363 +msgid "Error: No result." +msgstr "" + +#: ../src/vikgpslayer.c:1471 +msgid "Warning - GPS Upload items may overwrite each other" +msgstr "" + +#: ../src/vikgpslayer.c:1506 +msgid "Status: detecting gpsbabel" +msgstr "Stato: rilevazione di gpsbabel in corso" + +#: ../src/vikgpslayer.c:1533 +msgid "No GPS items selected for transfer." +msgstr "Nessun elemento GPS selezionato per il trasferimento." + +#: ../src/vikgpslayer.c:1546 +msgid "Could not turn off device." +msgstr "Impossibile spegnere il dispositivo" + +#: ../src/vikgpslayer.c:1589 +msgid "Are you sure you want to delete GPS Upload data?" +msgstr "Sei sicuro di voler eliminare i dati GPS Caricati?" + +#: ../src/vikgpslayer.c:1602 +msgid "Are you sure you want to delete GPS Download data?" +msgstr "Sei sicuro di voler eliminare i dati GPS Scaricati?" + +#: ../src/vikgpslayer.c:1616 +msgid "Are you sure you want to delete GPS Realtime data?" +msgstr "Sei sicuro di voler eliminare i dati GPS in Tempo Reale?" + +#: ../src/vikgpslayer.c:1630 +msgid "Are you sure you want to delete All GPS data?" +msgstr "Sei sicuro di voler eliminare Tutti i dati GPS?" + +#: ../src/vikgpslayer.c:2004 +#, c-format +msgid "" +"Failed to connect to gpsd at %s (port %s)\n" +"Should Viking keep trying (every %d seconds)?" +msgstr "" + +#: ../src/viklayerspanel.c:73 +msgid "C_ut" +msgstr "" + +#: ../src/viklayerspanel.c:74 ../src/vikwindow.c:4882 +msgid "_Copy" +msgstr "_Copia" + +#: ../src/viklayerspanel.c:75 ../src/vikwindow.c:4883 +msgid "_Paste" +msgstr "Inco_lla" + +#: ../src/viklayerspanel.c:76 ../src/vikwindow.c:4884 +msgid "_Delete" +msgstr "_Elimina" + +#: ../src/viklayerspanel.c:154 +msgid "New Layer" +msgstr "" + +#: ../src/viklayerspanel.c:347 +msgid "Top Layer" +msgstr "Livello superiore" + +#: ../src/viklayerspanel.c:363 +msgid "Add new layer" +msgstr "Aggiunge un nuovo livelle" + +#: ../src/viklayerspanel.c:370 ../src/vikwindow.c:4884 +msgid "Remove selected layer" +msgstr "Elimina livello selezionato" + +#: ../src/viklayerspanel.c:377 +msgid "Move selected layer up" +msgstr "Sposta il livello selezionato in su" + +#: ../src/viklayerspanel.c:384 +msgid "Move selected layer down" +msgstr "Sposta il livello selezionato in giù" + +#: ../src/viklayerspanel.c:391 ../src/vikwindow.c:4881 +msgid "Cut selected layer" +msgstr "Taglia il livello selezionato" + +#: ../src/viklayerspanel.c:398 ../src/vikwindow.c:4882 +msgid "Copy selected layer" +msgstr "Copia il livello selezionato" + +#: ../src/viklayerspanel.c:405 ../src/vikwindow.c:4883 +msgid "" +"Paste layer into selected container layer or otherwise above selected layer" +msgstr "" + +#: ../src/viklayerspanel.c:502 +msgid "New name can not be blank." +msgstr "" + +#: ../src/viklayerspanel.c:751 +msgid "Aggregate Layers have no settable properties." +msgstr "I livelli aggregati non hanno proprietà modificabili." + +#: ../src/viklayerspanel.c:798 +msgid "You cannot cut the Top Layer." +msgstr "Impossibile tagliare il livello superiore." + +#: ../src/viklayerspanel.c:843 +#, c-format +msgid "Are you sure you want to delete %s?" +msgstr "Sei sicuro di voler eliminare %s?" + +#: ../src/viklayerspanel.c:863 +msgid "You cannot delete the Top Layer." +msgstr "Impossibile eliminare il livello superiore." + +#: ../src/vikmapniklayer.c:78 +msgid "CSS (MML) Config File:" +msgstr "" + +#: ../src/vikmapniklayer.c:79 +msgid "CartoCSS configuration file" +msgstr "" + +#: ../src/vikmapniklayer.c:80 +msgid "XML Config File:" +msgstr "" + +#: ../src/vikmapniklayer.c:81 +msgid "Mapnik XML configuration file" +msgstr "" + +#: ../src/vikmapniklayer.c:84 +msgid "Use File Cache:" +msgstr "" + +#: ../src/vikmapniklayer.c:86 +msgid "File Cache Directory:" +msgstr "" + +#: ../src/vikmapniklayer.c:122 +msgid "_Mapnik Features" +msgstr "" + +#: ../src/vikmapniklayer.c:122 +msgid "Mapnik Features" +msgstr "" + +#: ../src/vikmapniklayer.c:140 +msgid "Mapnik Rendering" +msgstr "" + +#. Changing these values only applies before first mapnik layer is 'created' +#: ../src/vikmapniklayer.c:258 +msgid "Plugins Directory:" +msgstr "" + +#: ../src/vikmapniklayer.c:258 ../src/vikmapniklayer.c:259 +#: ../src/vikmapniklayer.c:260 ../src/vikmapniklayer.c:261 +msgid "You need to restart Viking for a change to this value to be used" +msgstr "" + +#: ../src/vikmapniklayer.c:259 +msgid "Fonts Directory:" +msgstr "" + +#: ../src/vikmapniklayer.c:260 +msgid "Recurse Fonts Directory:" +msgstr "" + +#: ../src/vikmapniklayer.c:261 +msgid "Rerender Timeout (hours):" +msgstr "" + +#. Changeable any time +#: ../src/vikmapniklayer.c:263 +msgid "CartoCSS:" +msgstr "" + +#: ../src/vikmapniklayer.c:263 +msgid "The program to convert CartoCSS files into Mapnik XML" +msgstr "" + +#: ../src/vikmapniklayer.c:506 +msgid "Running" +msgstr "" + +#: ../src/vikmapniklayer.c:525 +#, c-format +msgid "" +"Error running carto command:\n" +"%s" +msgstr "" + +#: ../src/vikmapniklayer.c:561 +msgid " completed in " +msgstr "" + +#: ../src/vikmapniklayer.c:561 +msgid "seconds" +msgstr "" + +#: ../src/vikmapniklayer.c:611 ../src/vikmapniklayer.c:979 +#, c-format +msgid "" +"Mapnik error loading configuration file:\n" +"%s" +msgstr "" + +#: ../src/vikmapniklayer.c:749 +#, c-format +msgid "Mapnik Render %d:%d:%d %s" +msgstr "" + +#: ../src/vikmapniklayer.c:840 +msgid "Mapnik Rendering must be in Mercator mode" +msgstr "" + +#: ../src/vikmapniklayer.c:997 +msgid "Mapnik Information" +msgstr "" + +#: ../src/vikmapniklayer.c:1031 +msgid "_Flush Memory Cache" +msgstr "" + +#: ../src/vikmapniklayer.c:1044 +msgid "_Run Carto Command" +msgstr "" + +#: ../src/vikmapniklayer.c:1102 ../src/vikmapslayer.c:2029 +#, c-format +msgid "Tile File Timestamp: %s" +msgstr "" + +#: ../src/vikmapniklayer.c:1105 ../src/vikmapslayer.c:2032 +msgid "Tile File Timestamp: Not Available" +msgstr "" + +#: ../src/vikmapniklayer.c:1120 +#, c-format +msgid "Rendering time %.2f seconds" +msgstr "" + +#: ../src/vikmapniklayer.c:1124 ../src/vikmapslayer.c:2042 +msgid "Tile Information" +msgstr "" + +#: ../src/vikmapniklayer.c:1145 +msgid "_Rerender Tile" +msgstr "" + +#: ../src/vikmapniklayer.c:1150 +msgid "_Info" +msgstr "" + +#. ******* MAPZOOMS ******** +#: ../src/vikmapslayer.c:96 +msgid "Use Viking Zoom Level" +msgstr "Usa il livello di Zoom di Viking" + +#: ../src/vikmapslayer.c:146 +msgid "OSM" +msgstr "" + +#. NB mode => id - But can't break file format just to rename something better +#: ../src/vikmapslayer.c:152 +msgid "Map Type:" +msgstr "Tipo di mappa:" + +#: ../src/vikmapslayer.c:153 +msgid "Maps Directory:" +msgstr "Cartella delle mappe" + +#: ../src/vikmapslayer.c:154 +msgid "Cache Layout:" +msgstr "" + +#: ../src/vikmapslayer.c:155 +msgid "This determines the tile storage layout on disk" +msgstr "" + +#: ../src/vikmapslayer.c:156 +msgid "Map File:" +msgstr "" + +#: ../src/vikmapslayer.c:157 +msgid "An MBTiles file. Only applies when the map type method is 'MBTiles'" +msgstr "" + +#: ../src/vikmapslayer.c:159 +msgid "Control the Alpha value for transparency effects" +msgstr "" + +#: ../src/vikmapslayer.c:160 +msgid "Autodownload maps:" +msgstr "Scarica le mappe automaticamente:" + +#: ../src/vikmapslayer.c:161 +msgid "Autodownload Only Gets Missing Maps:" +msgstr "" + +#: ../src/vikmapslayer.c:162 +msgid "" +"Using this option avoids attempting to update already acquired tiles. This " +"can be useful if you want to restrict the network usage, without having to " +"resort to manual control. Only applies when 'Autodownload Maps' is on." +msgstr "" + +#: ../src/vikmapslayer.c:163 +msgid "Zoom Level:" +msgstr "Livello di Zoom:" + +#: ../src/vikmapslayer.c:164 +msgid "" +"Determines the method of displaying map tiles for the current zoom level. " +"'Viking Zoom Level' uses the best matching level, otherwise setting a fixed " +"value will always use map tiles of the specified value regardless of the " +"actual zoom level." +msgstr "" + +#: ../src/vikmapslayer.c:197 +msgid "_Maps Download" +msgstr "" + +#: ../src/vikmapslayer.c:197 +msgid "Maps Download" +msgstr "Scarica mappe" + +#: ../src/vikmapslayer.c:213 ../src/vikutils.c:895 +msgid "Map" +msgstr "Mappa" + +#: ../src/vikmapslayer.c:306 +msgid "Default map layer directory:" +msgstr "" + +#: ../src/vikmapslayer.c:306 +msgid "Choose a directory to store cached Map tiles for this layer" +msgstr "" + +#: ../src/vikmapslayer.c:436 ../src/vikmapslayer.c:633 +msgid "Unknown map type" +msgstr "Tipo di mappa sconosciuto" + +#: ../src/vikmapslayer.c:664 +msgid "Unknown Map Zoom" +msgstr "Zoom di mappa sconosciuto" + +#: ../src/vikmapslayer.c:833 +#, c-format +msgid "Failed to open MBTiles file: %s" +msgstr "" + +#: ../src/vikmapslayer.c:856 +#, c-format +msgid "" +"New map cannot be displayed in the current drawmode.\n" +"Select \"%s\" from View menu to view it." +msgstr "" +"La nuova mappa non può essere visualizzata nella modalità di disegno " +"corrente.\n" +"Seleziona \"%s\" dal menu Visualizza per visualizzarla." + +#: ../src/vikmapslayer.c:1314 +#, c-format +msgid "" +"Cowardly refusing to draw tiles or existence of tiles beyond %d zoom out " +"factor" +msgstr "" +"Rappresentazione o esistenza di celle impossibile oltre il fattore di zoom %d" + +#. TODO: ?? count up the number of download errors somehow... +#: ../src/vikmapslayer.c:1667 +msgid "Failed to download tile" +msgstr "" + +#: ../src/vikmapslayer.c:1673 +msgid "Unable to save tile" +msgstr "" + +#: ../src/vikmapslayer.c:1799 +#, c-format +msgid "Redownloading up to %d %s map..." +msgid_plural "Redownloading up to %d %s maps..." +msgstr[0] "Sto scaricando nuovamente fino a %d %s mappa..." +msgstr[1] "Sto scaricando nuovamente fino a %d %s mappe..." + +#: ../src/vikmapslayer.c:1801 +#, c-format +msgid "Redownloading %d %s map..." +msgid_plural "Redownloading %d %s maps..." +msgstr[0] "Sto scaricando nuovamente fino a %d %s mappa..." +msgstr[1] "Sto scaricando nuovamente fino a %d %s mappe..." + +#: ../src/vikmapslayer.c:1805 ../src/vikmapslayer.c:1890 +#, c-format +msgid "Downloading %d %s map..." +msgid_plural "Downloading %d %s maps..." +msgstr[0] "Scaricamento %d %s mappa..." +msgstr[1] "Scaricamento %d %s mappe..." + +#: ../src/vikmapslayer.c:1969 +msgid "YES" +msgstr "" + +#: ../src/vikmapslayer.c:1973 ../src/vikmapslayer.c:1977 +msgid "NO" +msgstr "" + +#. NB Also handles .jpg automatically due to pixbuf_new_from () support - although just print png for now. +#: ../src/vikmapslayer.c:1980 +#, c-format +msgid "Source: %s (%d%s%d%s%d.%s %s)" +msgstr "" + +#: ../src/vikmapslayer.c:1983 +msgid "Source: Not available" +msgstr "" + +#: ../src/vikmapslayer.c:2000 +msgid "Source: file://" +msgstr "" + +#: ../src/vikmapslayer.c:2012 +#, c-format +msgid "Source: %s" +msgstr "" + +#: ../src/vikmapslayer.c:2038 +#, c-format +msgid "Tile File: %s [Not Available]" +msgstr "" + +#: ../src/vikmapslayer.c:2086 +msgid "Redownload _Bad Map(s)" +msgstr "Riscarica la(e) Mappa(e) Difettosa(e) (_B)" + +#: ../src/vikmapslayer.c:2090 +msgid "Redownload _New Map(s)" +msgstr "Riscarica la(e) _Nuova(e) Mappa(e)" + +#: ../src/vikmapslayer.c:2094 +msgid "Redownload _All Map(s)" +msgstr "Riscarica Tutta(e) la(e) Mappa(e) (_A)" + +#: ../src/vikmapslayer.c:2099 +msgid "_Show Tile Information" +msgstr "" + +#: ../src/vikmapslayer.c:2166 +#, c-format +msgid "" +"Wrong drawmode for this map.\n" +"Select \"%s\" from View menu and try again." +msgstr "" +"Modalità di disegno non valida per questa mappa.\n" +"Seleziona \"%s\" dal menu Visualizza e riprova." + +#: ../src/vikmapslayer.c:2171 +msgid "Wrong zoom level for this map." +msgstr "Livello di zoom errato per questa mappa." + +#: ../src/vikmapslayer.c:2334 +msgid "Zoom Start:" +msgstr "" + +#: ../src/vikmapslayer.c:2341 +msgid "Zoom End:" +msgstr "" + +#: ../src/vikmapslayer.c:2347 +msgid "Download Maps Method:" +msgstr "" + +#. redownload method - needs to align with REDOWNLOAD* macro values +#: ../src/vikmapslayer.c:2419 +msgid "Missing" +msgstr "" + +#: ../src/vikmapslayer.c:2419 +msgid "Bad" +msgstr "" + +#: ../src/vikmapslayer.c:2419 +msgid "New" +msgstr "" + +#: ../src/vikmapslayer.c:2419 +msgid "Reload All" +msgstr "" + +#: ../src/vikmapslayer.c:2421 +msgid "Download for Zoom Levels" +msgstr "" + +#: ../src/vikmapslayer.c:2461 +#, c-format +msgid "" +"You are not allowed to download more than %d tiles in one go (requested %d)" +msgstr "" + +#: ../src/vikmapslayer.c:2469 +#, c-format +msgid "Do you really want to download %d tiles?" +msgstr "" + +#. Now with icons +#: ../src/vikmapslayer.c:2509 +msgid "Download _Missing Onscreen Maps" +msgstr "Scarica le Mappe _Mancanti a Schermo" + +#: ../src/vikmapslayer.c:2516 +msgid "Download _New Onscreen Maps" +msgstr "Scarica Nuove Mappe a Schermo" + +#: ../src/vikmapslayer.c:2523 +msgid "Reload _All Onscreen Maps" +msgstr "Ricarica Tutte le Mappe a Schermo (_A)" + +#: ../src/vikmapslayer.c:2529 +msgid "Download Maps in _Zoom Levels..." +msgstr "" + +#: ../src/vikmapslayer.c:2539 +#, fuzzy +msgid "_Open MBTiles Files" +msgstr "Apri file _recente" + +#: ../src/vikmapslayer.c:2554 +msgid "Flush Map Cache" +msgstr "" + +#: ../src/vikrouting.c:54 +msgid "Default engine:" +msgstr "" + +#: ../src/vikrouting.c:68 +msgid "Routing" +msgstr "" + +#: ../src/viktreeview.c:347 +msgid "Layer Name" +msgstr "Nome del livello" + +#: ../src/viktreeview.c:924 +#, c-format +msgid "delete data from %s\n" +msgstr "Elimina dati da %s\n" + +#: ../src/viktrwlayer.c:427 +msgid "Create _Waypoint" +msgstr "" + +#: ../src/viktrwlayer.c:427 +msgid "Create Waypoint" +msgstr "Crea Waypoint" + +#: ../src/viktrwlayer.c:437 +#, fuzzy +msgid "Edit _Track" +msgstr "Modifica il Punto del Tracciato" + +#: ../src/viktrwlayer.c:437 +#, fuzzy +msgid "Edit Track" +msgstr "Modifica il Punto del Tracciato" + +#: ../src/viktrwlayer.c:449 +msgid "Edit _Route" +msgstr "" + +#: ../src/viktrwlayer.c:449 +#, fuzzy +msgid "Edit Route" +msgstr "Modifica Waypoint" + +#: ../src/viktrwlayer.c:460 +msgid "Route _Finder" +msgstr "" + +#: ../src/viktrwlayer.c:460 +msgid "Route Finder" +msgstr "Trova Percorso" + +#: ../src/viktrwlayer.c:471 +#, fuzzy +msgid "Splitter" +msgstr "Suddividi qui" + +#: ../src/viktrwlayer.c:482 +msgid "_Edit Waypoint" +msgstr "" + +#: ../src/viktrwlayer.c:482 +msgid "Edit Waypoint" +msgstr "Modifica Waypoint" + +#: ../src/viktrwlayer.c:495 +msgid "Edit Trac_kpoint" +msgstr "" + +#: ../src/viktrwlayer.c:495 +msgid "Edit Trackpoint" +msgstr "Modifica il Punto del Tracciato" + +#. a pixbuf for this one is already made globally available +#: ../src/viktrwlayer.c:508 +msgid "Show P_icture" +msgstr "" + +#: ../src/viktrwlayer.c:508 +msgid "Show Picture" +msgstr "Visualizza immagine" + +#: ../src/viktrwlayer.c:531 +msgid "Waypoint Images" +msgstr "Immagini dei Waypoint" + +#: ../src/viktrwlayer.c:531 +msgid "Tracks Advanced" +msgstr "" + +#: ../src/viktrwlayer.c:531 +msgid "Metadata" +msgstr "" + +#: ../src/viktrwlayer.c:531 +#, fuzzy +msgid "Filesystem" +msgstr "Tipo di file:" + +#: ../src/viktrwlayer.c:534 +msgid "Draw by Track" +msgstr "Disegna da Traccia" + +#: ../src/viktrwlayer.c:534 +msgid "Draw by Speed" +msgstr "" + +#: ../src/viktrwlayer.c:534 +msgid "All Tracks Same Color" +msgstr "" + +#: ../src/viktrwlayer.c:535 +msgid "Filled Square" +msgstr "Quadrato riempito" + +#: ../src/viktrwlayer.c:535 +msgid "Square" +msgstr "Quadrato" + +#: ../src/viktrwlayer.c:535 +msgid "Circle" +msgstr "Cerchio" + +#: ../src/viktrwlayer.c:535 +msgid "X" +msgstr "X" + +#: ../src/viktrwlayer.c:561 +msgid "Extra Extra Small" +msgstr "Piccolissima" + +#: ../src/viktrwlayer.c:562 +msgid "Extra Small" +msgstr "Molto piccola" + +#: ../src/viktrwlayer.c:566 +msgid "Extra Large" +msgstr "Molto grande" + +#: ../src/viktrwlayer.c:567 +msgid "Extra Extra Large" +msgstr "Grandissima" + +#: ../src/viktrwlayer.c:573 +msgid "Name Ascending" +msgstr "" + +#: ../src/viktrwlayer.c:574 +msgid "Name Descending" +msgstr "" + +#: ../src/viktrwlayer.c:582 ../src/viktrwlayer_propwin.c:3319 +msgid "No" +msgstr "" + +#: ../src/viktrwlayer.c:583 +msgid "Yes" +msgstr "" + +#: ../src/viktrwlayer.c:584 +msgid "No write" +msgstr "" + +#: ../src/viktrwlayer.c:649 ../src/viktrwlayer.c:673 +msgid "Draw Labels" +msgstr "Disegna Etichette" + +#: ../src/viktrwlayer.c:650 +msgid "Note: the individual track controls what labels may be displayed" +msgstr "" + +#: ../src/viktrwlayer.c:651 +msgid "Track Labels Font Size:" +msgstr "" + +#: ../src/viktrwlayer.c:652 +msgid "Track Drawing Mode:" +msgstr "Modalità di Disegno del Tracciato:" + +#: ../src/viktrwlayer.c:653 +msgid "All Tracks Color:" +msgstr "" + +#: ../src/viktrwlayer.c:654 +msgid "The color used when 'All Tracks Same Color' drawing mode is selected" +msgstr "" + +#: ../src/viktrwlayer.c:655 +msgid "Draw Track Lines" +msgstr "Disegna le Linee del Tracciato" + +#: ../src/viktrwlayer.c:656 +msgid "Track Thickness:" +msgstr "Spessore del Tracciato:" + +#: ../src/viktrwlayer.c:657 +msgid "Draw Track Direction" +msgstr "" + +#: ../src/viktrwlayer.c:658 +msgid "Direction Size:" +msgstr "" + +#: ../src/viktrwlayer.c:659 +msgid "Draw Trackpoints" +msgstr "Disegna i Punti del Tracciato" + +#: ../src/viktrwlayer.c:660 +msgid "Trackpoint Size:" +msgstr "" + +#: ../src/viktrwlayer.c:661 +msgid "Draw Elevation" +msgstr "Disegna elevazione" + +#: ../src/viktrwlayer.c:662 +msgid "Draw Elevation Height %:" +msgstr "Disegna altezza dell'elevazione %:" + +#: ../src/viktrwlayer.c:663 +msgid "Draw Stops" +msgstr "Disegna stop" + +#: ../src/viktrwlayer.c:664 +msgid "" +"Whether to draw a marker when trackpoints are at the same position but over " +"the minimum stop length apart in time" +msgstr "" + +#: ../src/viktrwlayer.c:665 +msgid "Min Stop Length (seconds):" +msgstr "Lunghezza Minima Stop (secondi):" + +#: ../src/viktrwlayer.c:667 +msgid "Track BG Thickness:" +msgstr "Spessore dello Sfondo del Tracciato:" + +#: ../src/viktrwlayer.c:668 +msgid "Track Background Color" +msgstr "Colore di Sfondo del Tracciato" + +#: ../src/viktrwlayer.c:669 +msgid "Draw by Speed Factor (%):" +msgstr "" + +#: ../src/viktrwlayer.c:670 +msgid "" +"The percentage factor away from the average speed determining the color used" +msgstr "" + +#: ../src/viktrwlayer.c:671 +msgid "Track Sort Order:" +msgstr "" + +#: ../src/viktrwlayer.c:674 +msgid "Waypoint Font Size:" +msgstr "" + +#: ../src/viktrwlayer.c:675 +msgid "Waypoint Color:" +msgstr "Colore del Waypoint:" + +#: ../src/viktrwlayer.c:676 +msgid "Waypoint Text:" +msgstr "Testo del Waypoint:" + +#: ../src/viktrwlayer.c:677 +msgid "Background:" +msgstr "Sfondo:" + +#: ../src/viktrwlayer.c:678 +msgid "Fake BG Color Translucency:" +msgstr "Trasparenza del colore di sfondo finta" + +#: ../src/viktrwlayer.c:679 +msgid "Waypoint marker:" +msgstr "Marker waypoint:" + +#: ../src/viktrwlayer.c:680 +msgid "Waypoint size:" +msgstr "Dimensione del Waypoint:" + +#: ../src/viktrwlayer.c:681 +msgid "Draw Waypoint Symbols:" +msgstr "Disegna simboli dei Waypoint:" + +#: ../src/viktrwlayer.c:682 +msgid "Waypoint Sort Order:" +msgstr "" + +#: ../src/viktrwlayer.c:684 +msgid "Draw Waypoint Images" +msgstr "Disegna immagini del Waypoint" + +#: ../src/viktrwlayer.c:685 +msgid "Image Size (pixels):" +msgstr "Dimensione immagine (pixel):" + +#: ../src/viktrwlayer.c:686 +msgid "Image Alpha:" +msgstr "Alpha immagine:" + +#: ../src/viktrwlayer.c:687 +msgid "Image Memory Cache Size:" +msgstr "Dimensione della memoria cache per l'immagine:" + +#: ../src/viktrwlayer.c:690 +msgid "Author" +msgstr "" + +#: ../src/viktrwlayer.c:691 +msgid "Creation Time" +msgstr "" + +#: ../src/viktrwlayer.c:692 +msgid "Keywords" +msgstr "" + +#: ../src/viktrwlayer.c:693 +msgid "External layer:" +msgstr "" + +#: ../src/viktrwlayer.c:693 +msgid "" +"Layer data stored in the Viking file, in an external file, or in an external " +"file but changes are not written to the file (file only loaded at startup)" +msgstr "" + +#: ../src/viktrwlayer.c:694 +msgid "Save layer as:" +msgstr "" + +#: ../src/viktrwlayer.c:694 +msgid "Specify where layer should be saved. Overwrites file if it exists." +msgstr "" + +#: ../src/viktrwlayer.c:798 +msgid "TrackWaypoint" +msgstr "" + +#: ../src/viktrwlayer.c:1999 ../src/viktrwlayer_propwin.c:1469 +#: ../src/viktrwlayer_propwin.c:1471 ../src/vikutils.c:299 +#: ../src/vikutils.c:326 +msgid "miles" +msgstr "" + +#: ../src/viktrwlayer.c:2002 ../src/viktrwlayer_propwin.c:1475 +#: ../src/viktrwlayer_propwin.c:1477 ../src/vikutils.c:303 +#: ../src/vikutils.c:330 +msgid "NM" +msgstr "" + +#. VIK_UNITS_DISTANCE_KILOMETRES: +#: ../src/viktrwlayer.c:2006 ../src/viktrwlayer_propwin.c:1482 +#: ../src/viktrwlayer_propwin.c:1484 ../src/vikutils.c:308 +#: ../src/vikutils.c:335 +msgid "km" +msgstr "" + +#: ../src/viktrwlayer.c:2121 +msgid "start/end" +msgstr "" + +#: ../src/viktrwlayer.c:2133 +msgid "start" +msgstr "" + +#: ../src/viktrwlayer.c:2142 +msgid "end" +msgstr "" + +#: ../src/viktrwlayer.c:3103 +#, c-format +msgid " in %d:%02d hrs:mins" +msgstr " in %d:%02d ore:minuti" + +#: ../src/viktrwlayer.c:3107 +#, c-format +msgid "" +"\n" +"%sTotal Length %.1f %s%s" +msgstr "" +"\n" +"%sLunghezza totale %.1f %s%s" + +#: ../src/viktrwlayer.c:3131 +#, c-format +msgid "" +"\n" +"Total route length %.1f %s" +msgstr "" + +#: ../src/viktrwlayer.c:3136 +#, c-format +msgid "Tracks: %d - Waypoints: %d - Routes: %d%s%s" +msgstr "" + +#: ../src/viktrwlayer.c:3155 +#, c-format +msgid "Tracks: %d" +msgstr "" + +#: ../src/viktrwlayer.c:3165 +#, c-format +msgid "Routes: %d" +msgstr "" + +#: ../src/viktrwlayer.c:3195 +#, c-format +msgid "- %d:%02d hrs:mins" +msgstr "- %d:%02d ore:minuti" + +#: ../src/viktrwlayer.c:3202 +#, c-format +msgid "%s%.1f km %s" +msgstr "%s%.1f km %s" + +#: ../src/viktrwlayer.c:3205 +#, c-format +msgid "%s%.1f miles %s" +msgstr "%s%.1f miglia %s" + +#: ../src/viktrwlayer.c:3208 +#, c-format +msgid "%s%.1f NM %s" +msgstr "" + +#: ../src/viktrwlayer.c:3222 +#, c-format +msgid "Waypoints: %d" +msgstr "" + +#: ../src/viktrwlayer.c:3279 +#, c-format +msgid "Wpt: Alt %dft" +msgstr "Punto panoramico: Altitudine %dft" + +#. VIK_UNITS_HEIGHT_METRES: +#: ../src/viktrwlayer.c:3283 +#, c-format +msgid "Wpt: Alt %dm" +msgstr "Punto panoramico: Altitudine %dm" + +#. Add comment if available +#: ../src/viktrwlayer.c:3298 +#, c-format +msgid "%s | %s %s | Comment: %s" +msgstr "%s | %s %s | Commento: %s" + +#: ../src/viktrwlayer.c:3300 +#, c-format +msgid "%s | %s %s" +msgstr "" + +#: ../src/viktrwlayer.c:3562 ../src/viktrwlayer.c:3591 +msgid "This layer has no waypoints or trackpoints." +msgstr "Questo livello non ha punti di transito o punti del tracciato." + +#: ../src/viktrwlayer.c:3598 ../src/viktrwlayer.c:3607 +#: ../src/viktrwlayer.c:3616 ../src/viktrwlayer.c:3625 +#: ../src/viktrwlayer.c:3634 ../src/viktrwlayer.c:3642 +msgid "Export Layer" +msgstr "Esporta livello" + +#: ../src/viktrwlayer.c:3671 +msgid "Export Route as GPX" +msgstr "" + +#: ../src/viktrwlayer.c:3673 +msgid "Export Track as GPX" +msgstr "Esporta il Tracciato come GPX" + +#: ../src/viktrwlayer.c:3693 +msgid "Find" +msgstr "Trova" + +#: ../src/viktrwlayer.c:3703 +msgid "Waypoint Name:" +msgstr "Nome del Waypoint:" + +#: ../src/viktrwlayer.c:3720 +msgid "Waypoint not found in this layer." +msgstr "Waypoint non trovato in questo livello." + +#: ../src/viktrwlayer.c:3989 +msgid "Can not upload invisible track." +msgstr "" + +#: ../src/viktrwlayer.c:4082 ../src/viktrwlayer.c:10512 +msgid "Track" +msgstr "Tracciato" + +#: ../src/viktrwlayer.c:4107 ../src/viktrwlayer.c:10599 +msgid "Route" +msgstr "" + +#: ../src/viktrwlayer.c:4194 +msgid "Externa_l" +msgstr "" + +#: ../src/viktrwlayer.c:4216 ../src/viktrwlayer.c:8456 +#: ../src/viktrwlayer.c:8574 +msgid "_Finish Route" +msgstr "" + +#: ../src/viktrwlayer.c:4218 ../src/viktrwlayer.c:8380 +#: ../src/viktrwlayer.c:8572 +msgid "_Finish Track" +msgstr "" + +#. Now with icons +#: ../src/viktrwlayer.c:4230 +msgid "_View Layer" +msgstr "_Visualizza Livello" + +#: ../src/viktrwlayer.c:4237 +msgid "V_iew" +msgstr "" + +#: ../src/viktrwlayer.c:4243 +msgid "View All _Tracks" +msgstr "" + +#: ../src/viktrwlayer.c:4248 +msgid "View All _Routes" +msgstr "" + +#: ../src/viktrwlayer.c:4253 +msgid "View All _Waypoints" +msgstr "" + +#: ../src/viktrwlayer.c:4258 +msgid "_Goto Center of Layer" +msgstr "" + +#: ../src/viktrwlayer.c:4264 ../src/viktrwlayer.c:8321 +msgid "Goto _Waypoint..." +msgstr "Vai al Punto di Transito... (_W)" + +#: ../src/viktrwlayer.c:4270 +msgid "_Export Layer" +msgstr "_Esporta livello" + +#: ../src/viktrwlayer.c:4276 +msgid "Export as GPS_Point..." +msgstr "Esporta come GPS_Point..." + +#: ../src/viktrwlayer.c:4281 +msgid "Export as GPS_Mapper..." +msgstr "Esporta come GPS_Mapper..." + +#: ../src/viktrwlayer.c:4286 +msgid "Export as _GPX..." +msgstr "Esporta come _GPX..." + +#: ../src/viktrwlayer.c:4292 +msgid "Export as _KML..." +msgstr "Esporta come _KML..." + +#: ../src/viktrwlayer.c:4299 +msgid "Export as GEO_JSON..." +msgstr "" + +#: ../src/viktrwlayer.c:4306 +msgid "Export via GPSbabel..." +msgstr "" + +#: ../src/viktrwlayer.c:4312 +#, c-format +msgid "Open with External Program_1: %s" +msgstr "" + +#: ../src/viktrwlayer.c:4319 +#, c-format +msgid "Open with External Program_2: %s" +msgstr "" + +#: ../src/viktrwlayer.c:4327 ../src/vikwindow.c:4825 +msgid "_New" +msgstr "_Nuovo" + +#: ../src/viktrwlayer.c:4333 +msgid "New _Waypoint..." +msgstr "" + +#: ../src/viktrwlayer.c:4339 +msgid "New _Track" +msgstr "" + +#: ../src/viktrwlayer.c:4347 +msgid "New _Route" +msgstr "" + +#: ../src/viktrwlayer.c:4356 ../src/viktrwlayer.c:8232 +#: ../src/viktrwlayer.c:9003 +msgid "Geotag _Images..." +msgstr "_Immagini Georeferenziate..." + +#: ../src/viktrwlayer.c:4363 +msgid "_Acquire" +msgstr "" + +#: ../src/viktrwlayer.c:4369 ../src/vikwindow.c:4904 +msgid "From _GPS..." +msgstr "Da _GPS..." + +#. FIXME: only add menu when at least a routing engine has support for Directions +#: ../src/viktrwlayer.c:4375 +msgid "From _Directions..." +msgstr "" + +#: ../src/viktrwlayer.c:4381 +msgid "From _OSM Traces..." +msgstr "Dalle Tracce _OSM..." + +#: ../src/viktrwlayer.c:4386 +msgid "From _My OSM Traces..." +msgstr "" + +#: ../src/viktrwlayer.c:4392 ../src/vikwindow.c:4844 +msgid "From _URL..." +msgstr "" + +#: ../src/viktrwlayer.c:4399 ../src/vikwindow.c:4846 +msgid "From _Wikipedia Waypoints" +msgstr "" + +#: ../src/viktrwlayer.c:4405 +msgid "Within _Layer Bounds" +msgstr "Dentro i Confini dei _Livelli" + +#: ../src/viktrwlayer.c:4411 +msgid "Within _Current View" +msgstr "Dentro la Vista _Corrente" + +#: ../src/viktrwlayer.c:4419 +msgid "From Geo_caching..." +msgstr "Da Geo_caching..." + +#: ../src/viktrwlayer.c:4426 ../src/vikwindow.c:4842 +msgid "From Geotagged _Images..." +msgstr "Dalle _Immagini Georeferenziate..." + +#: ../src/viktrwlayer.c:4433 +msgid "From _File..." +msgstr "" + +#: ../src/viktrwlayer.c:4436 ../src/vikwindow.c:4905 +msgid "Import File With GPS_Babel..." +msgstr "Importa il File con GPS_Babel..." + +#: ../src/viktrwlayer.c:4443 ../src/viktrwlayer.c:8905 +msgid "_Upload" +msgstr "" + +#: ../src/viktrwlayer.c:4449 +msgid "Upload to _GPS..." +msgstr "" + +#: ../src/viktrwlayer.c:4456 ../src/viktrwlayer.c:8973 +msgid "Upload to _OSM..." +msgstr "" + +#: ../src/viktrwlayer.c:4464 +msgid "De_lete" +msgstr "E_limina" + +#: ../src/viktrwlayer.c:4470 +msgid "Delete All _Tracks" +msgstr "Elimina Tutti i _Tracciati" + +#: ../src/viktrwlayer.c:4477 +msgid "Delete Tracks _From Selection..." +msgstr "Elimina Tutti i _Tracciati dalla Selezione..." + +#: ../src/viktrwlayer.c:4484 ../src/viktrwlayer.c:8481 +msgid "Delete _All Routes" +msgstr "" + +#: ../src/viktrwlayer.c:4491 ../src/viktrwlayer.c:8487 +msgid "_Delete Routes From Selection..." +msgstr "" + +#: ../src/viktrwlayer.c:4498 +msgid "Delete All _Waypoints" +msgstr "Elimina Tutti i Punti di Transito (_W)" + +#: ../src/viktrwlayer.c:4505 +msgid "Delete Waypoints From _Selection..." +msgstr "Elimina i Punti di Transito dalla _Selezione..." + +#: ../src/viktrwlayer.c:4512 ../src/viktrwlayer.c:8339 +#, fuzzy +msgid "Delete Duplicate Waypoints" +msgstr "Rimuovi waypoint doppi" + +#: ../src/viktrwlayer.c:5198 +#, c-format +msgid "Are you sure you want to delete all tracks in %s?" +msgstr "Sei sicuro di voler eliminare tutti i tracciati in %s?" + +#: ../src/viktrwlayer.c:5211 +#, c-format +msgid "Are you sure you want to delete all routes in %s?" +msgstr "" + +#: ../src/viktrwlayer.c:5221 +#, c-format +msgid "Are you sure you want to delete all waypoints in %s?" +msgstr "Sei sicuro di voler eliminare tutti i punti di transito in %s?" + +#: ../src/viktrwlayer.c:5238 +#, c-format +msgid "Are you sure you want to delete the waypoint \"%s\"?" +msgstr "" + +#: ../src/viktrwlayer.c:5254 +#, c-format +msgid "Are you sure you want to delete the track \"%s\"?" +msgstr "" + +#: ../src/viktrwlayer.c:5271 +#, c-format +msgid "Are you sure you want to delete the route \"%s\"?" +msgstr "" + +#: ../src/viktrwlayer.c:5527 ../src/viktrwlayer.c:6373 +msgid "" +"Converting a track to a route removes extra track data such as segments, " +"timestamps, etc...\n" +"Do you want to continue?" +msgstr "" + +#: ../src/viktrwlayer.c:5631 +msgid "No DEM layers available, thus no DEM values can be applied." +msgstr "" + +#: ../src/viktrwlayer.c:5651 ../src/viktrwlayer.c:5692 +#, c-format +msgid "%ld point adjusted" +msgid_plural "%ld points adjusted" +msgstr[0] "" +msgstr[1] "" + +#: ../src/viktrwlayer.c:5736 +#, c-format +msgid "%ld waypoint changed" +msgid_plural "%ld waypoints changed" +msgstr[0] "" +msgstr[1] "" + +#: ../src/viktrwlayer.c:5917 +#, c-format +msgid "" +"Refining a track with many points (%d) is unlikely to yield sensible " +"results. Do you want to Continue?" +msgstr "" + +#. Select engine from dialog +#: ../src/viktrwlayer.c:5925 +msgid "Refine Route with Routing Engine..." +msgstr "" + +#: ../src/viktrwlayer.c:5933 +msgid "Select routing engine" +msgstr "" + +#: ../src/viktrwlayer.c:6158 +msgid "Failed. No other tracks with timestamps in this layer found" +msgstr "" +"Non riuscito. Non sono stati trovati altri tracciati con le marcature " +"temporali in questo livello" + +#: ../src/viktrwlayer.c:6160 +msgid "Failed. No other tracks without timestamps in this layer found" +msgstr "" +"Non riuscito. Non sono stati trovati altri tracciati senza le marcature " +"temporali in questo livello" + +#: ../src/viktrwlayer.c:6179 +msgid "Merge with..." +msgstr "Unisci con..." + +#: ../src/viktrwlayer.c:6180 +msgid "Select route to merge with" +msgstr "" + +#: ../src/viktrwlayer.c:6180 +msgid "Select track to merge with" +msgstr "Selezionare il tracciato con cui unire" + +#: ../src/viktrwlayer.c:6264 ../src/viktrwlayer.c:6346 +msgid "Append Route" +msgstr "" + +#: ../src/viktrwlayer.c:6264 ../src/viktrwlayer.c:6346 +msgid "Append Track" +msgstr "" + +#: ../src/viktrwlayer.c:6265 +msgid "Select the route to append after the current route" +msgstr "" + +#: ../src/viktrwlayer.c:6266 +msgid "Select the track to append after the current track" +msgstr "" + +#: ../src/viktrwlayer.c:6347 +msgid "Select the track to append after the current route" +msgstr "" + +#: ../src/viktrwlayer.c:6348 +msgid "Select the route to append after the current track" +msgstr "" + +#: ../src/viktrwlayer.c:6414 +#, c-format +msgid "%d segment merged" +msgid_plural "%d segments merged" +msgstr[0] "" +msgstr[1] "" + +#: ../src/viktrwlayer.c:6430 +msgid "Failed. This track does not have timestamp" +msgstr "Fallito. Questo tracciato non ha un timestamp" + +#: ../src/viktrwlayer.c:6442 +msgid "Failed. No other track in this layer has timestamp" +msgstr "Fallito. Nessun altro tracciato in questo livello ha un timestamp" + +#: ../src/viktrwlayer.c:6449 +msgid "Merge Threshold..." +msgstr "Soglia di unione..." + +#: ../src/viktrwlayer.c:6450 +msgid "Merge when time between tracks less than:" +msgstr "Unisci quando il tempo tra i tracciati è minore di:" + +#: ../src/viktrwlayer.c:6580 +msgid "Split Threshold..." +msgstr "Soglia di divisione..." + +#: ../src/viktrwlayer.c:6581 +msgid "Split when time between trackpoints exceeds:" +msgstr "Dividi quando il tempo tra i trackpoint supera i:" + +#: ../src/viktrwlayer.c:6598 +#, c-format +msgid "" +"Can not split track due to trackpoints not ordered in time - such as at %s.\n" +"\n" +"Goto this trackpoint?" +msgstr "" + +#: ../src/viktrwlayer.c:6668 +msgid "Split Every Nth Point" +msgstr "Dividi Ogni Punto Nord" + +#: ../src/viktrwlayer.c:6669 +msgid "Split on every Nth point:" +msgstr "Dividi su Ogni Punto Nord:" + +#: ../src/viktrwlayer.c:6779 +msgid "Can not split track as it has no segments" +msgstr "" + +#: ../src/viktrwlayer.c:6861 ../src/viktrwlayer.c:6891 +#, c-format +msgid "Deleted %ld point" +msgid_plural "Deleted %ld points" +msgstr[0] "" +msgstr[1] "" + +#: ../src/viktrwlayer.c:6966 ../src/viktrwlayer.c:10989 +#: ../src/viktrwlayer_waypointlist.c:214 +#, c-format +msgid "Could not launch %s to open file." +msgstr "Impossibile lanciare %s per aprire il file." + +#: ../src/viktrwlayer.c:6992 ../src/viktrwlayer.c:7113 +msgid "This track has no date information." +msgstr "" + +#: ../src/viktrwlayer.c:7006 ../src/viktrwlayer.c:7136 +msgid "This waypoint has no date information." +msgstr "" + +#: ../src/viktrwlayer.c:7030 +#, c-format +msgid "Could not launch %s" +msgstr "" + +#: ../src/viktrwlayer.c:7269 +msgid "Internal Error in vik_trw_layer_uniquify_tracks" +msgstr "" + +#: ../src/viktrwlayer.c:7374 ../src/viktrwlayer.c:7424 +#: ../src/viktrwlayer.c:7587 +msgid "" +"Multiple entries with the same name exist. This method only works with " +"unique names. Force unique names now?" +msgstr "" + +#: ../src/viktrwlayer.c:7385 +msgid "No tracks found" +msgstr "Nessun tracciato trovato" + +#: ../src/viktrwlayer.c:7393 ../src/viktrwlayer.c:7443 +#: ../src/viktrwlayer.c:7607 +msgid "Delete Selection" +msgstr "Elimina Selezione" + +#: ../src/viktrwlayer.c:7394 +msgid "Select tracks to delete" +msgstr "Seleziona i tracciati da eliminare" + +#: ../src/viktrwlayer.c:7435 +msgid "No routes found" +msgstr "" + +#: ../src/viktrwlayer.c:7444 +msgid "Select routes to delete" +msgstr "" + +#: ../src/viktrwlayer.c:7550 +msgid "Internal Error in vik_trw_layer_uniquify_waypoints" +msgstr "" + +#: ../src/viktrwlayer.c:7597 +msgid "No waypoints found" +msgstr "Waypoint non trovati" + +#: ../src/viktrwlayer.c:7608 +msgid "Select waypoints to delete" +msgstr "Seleziona i punti di transito da eliminare" + +#: ../src/viktrwlayer.c:7691 +#, fuzzy, c-format +msgid "%ld waypoint deleted" +msgid_plural "%ld waypoints deleted" +msgstr[0] "Seleziona i punti di transito da eliminare" +msgstr[1] "Seleziona i punti di transito da eliminare" + +#: ../src/viktrwlayer.c:7697 +#, fuzzy +msgid "No duplicates found" +msgstr "Waypoint non trovati" + +#: ../src/viktrwlayer.c:8028 +#, c-format +msgid "" +"A waypoint with the name \"%s\" already exists. Really rename to the same " +"name?" +msgstr "" + +#: ../src/viktrwlayer.c:8058 +#, c-format +msgid "" +"A track with the name \"%s\" already exists. Really rename to the same name?" +msgstr "" + +#: ../src/viktrwlayer.c:8095 +#, c-format +msgid "" +"A route with the name \"%s\" already exists. Really rename to the same name?" +msgstr "" + +#: ../src/viktrwlayer.c:8215 ../src/viktrwlayer.c:8602 +msgid "_Goto" +msgstr "V_ai a" + +#: ../src/viktrwlayer.c:8226 +msgid "_Visit Geocache Webpage" +msgstr "_Visita la pagina Web di Geocache" + +#: ../src/viktrwlayer.c:8235 +msgid "Geotag multiple images against this waypoint" +msgstr "" + +#: ../src/viktrwlayer.c:8245 ../src/viktrwlayer_waypointlist.c:352 +msgid "_Show Picture..." +msgstr "Mostra Fotografia... (_S)" + +#: ../src/viktrwlayer.c:8253 +msgid "Update Geotag on _Image" +msgstr "Aggiorna Georeferenza sull'_Immagine" + +#: ../src/viktrwlayer.c:8259 +msgid "_Update" +msgstr "Aggiorna (_U)" + +#: ../src/viktrwlayer.c:8264 +msgid "Update and _Keep File Timestamp" +msgstr "Aggiorna e Mantieni il File dell'Orario Impresso (_K)" + +#: ../src/viktrwlayer.c:8276 +msgid "Visit _Webpage" +msgstr "" + +#: ../src/viktrwlayer.c:8306 +msgid "_New Waypoint..." +msgstr "_Nuovo Punto di Transito..." + +#: ../src/viktrwlayer.c:8315 +msgid "_View All Waypoints" +msgstr "_Visualizza Tutti i Punti di Transito" + +#: ../src/viktrwlayer.c:8327 +msgid "Delete _All Waypoints" +msgstr "Elmina Tutti i Waypoint (_A)" + +#: ../src/viktrwlayer.c:8333 +msgid "_Delete Waypoints From Selection..." +msgstr "Elimina (_D) i Punti di Transito dalla Selezione..." + +#: ../src/viktrwlayer.c:8351 +msgid "_Show All Waypoints" +msgstr "" + +#: ../src/viktrwlayer.c:8357 +msgid "_Hide All Waypoints" +msgstr "" + +#: ../src/viktrwlayer.c:8369 +msgid "_List Waypoints..." +msgstr "" + +#: ../src/viktrwlayer.c:8390 +msgid "_View All Tracks" +msgstr "_Visualizza Tutti i Tracciati" + +#: ../src/viktrwlayer.c:8396 +msgid "_New Track" +msgstr "" + +#: ../src/viktrwlayer.c:8404 +msgid "Delete _All Tracks" +msgstr "Elimina Tutti i Tracciati (_A)" + +#: ../src/viktrwlayer.c:8410 +msgid "_Delete Tracks From Selection..." +msgstr "Elimina (_D) i Tracciati dalla Selezione..." + +#: ../src/viktrwlayer.c:8422 +msgid "_Show All Tracks" +msgstr "" + +#: ../src/viktrwlayer.c:8428 +msgid "_Hide All Tracks" +msgstr "" + +#: ../src/viktrwlayer.c:8439 +msgid "_List Tracks..." +msgstr "" + +#: ../src/viktrwlayer.c:8467 +msgid "_View All Routes" +msgstr "" + +#: ../src/viktrwlayer.c:8473 +msgid "_New Route" +msgstr "" + +#: ../src/viktrwlayer.c:8499 +msgid "_Show All Routes" +msgstr "" + +#: ../src/viktrwlayer.c:8505 +msgid "_Hide All Routes" +msgstr "" + +#: ../src/viktrwlayer.c:8516 +msgid "_List Routes..." +msgstr "" + +#: ../src/viktrwlayer.c:8587 +msgid "_View Track" +msgstr "_Visualizza tracciato" + +#: ../src/viktrwlayer.c:8589 +msgid "_View Route" +msgstr "" + +#: ../src/viktrwlayer.c:8608 +msgid "_Startpoint" +msgstr "Punto _iniziale" + +#: ../src/viktrwlayer.c:8614 +msgid "\"_Center\"" +msgstr "\"_Centra\"" + +#: ../src/viktrwlayer.c:8620 +msgid "_Endpoint" +msgstr "Punto _finale" + +#: ../src/viktrwlayer.c:8626 +msgid "_Highest Altitude" +msgstr "Altitudine Più Alta (_H)" + +#: ../src/viktrwlayer.c:8632 +msgid "_Lowest Altitude" +msgstr "Altitudine Più Bassa (_L)" + +#: ../src/viktrwlayer.c:8640 +msgid "_Maximum Speed" +msgstr "Velocità _massima" + +#: ../src/viktrwlayer.c:8646 +msgid "_Date" +msgstr "" + +#: ../src/viktrwlayer.c:8655 +msgid "Co_mbine" +msgstr "" + +#: ../src/viktrwlayer.c:8663 +msgid "_Merge By Time..." +msgstr "Unisci per Orario... (_M)" + +#: ../src/viktrwlayer.c:8668 +msgid "Merge _Segments" +msgstr "" + +#: ../src/viktrwlayer.c:8675 +msgid "Merge _With Other Tracks..." +msgstr "Unisci Con (_W) Altri Tracciati..." + +#: ../src/viktrwlayer.c:8682 +msgid "_Append Track..." +msgstr "" + +#: ../src/viktrwlayer.c:8684 +msgid "_Append Route..." +msgstr "" + +#: ../src/viktrwlayer.c:8690 +msgid "Append _Route..." +msgstr "" + +#: ../src/viktrwlayer.c:8692 +msgid "Append _Track..." +msgstr "" + +#: ../src/viktrwlayer.c:8699 +msgid "_Split" +msgstr "" + +#: ../src/viktrwlayer.c:8707 +msgid "_Split By Time..." +msgstr "Dividi per Orario... (_S)" + +#. ATM always enable this entry - don't want to have to analyse the track before displaying the menu - to keep the menu speedy +#: ../src/viktrwlayer.c:8713 +msgid "Split Se_gments" +msgstr "" + +#: ../src/viktrwlayer.c:8719 +msgid "Split By _Number of Points..." +msgstr "Dividi per _Numero di Punti..." + +#: ../src/viktrwlayer.c:8724 +msgid "Split at _Trackpoint" +msgstr "" + +#: ../src/viktrwlayer.c:8732 +msgid "_Insert Points" +msgstr "" + +#: ../src/viktrwlayer.c:8738 +msgid "Insert Point _Before Selected Point" +msgstr "" + +#: ../src/viktrwlayer.c:8745 +msgid "Insert Point _After Selected Point" +msgstr "" + +#: ../src/viktrwlayer.c:8754 +msgid "Delete Poi_nts" +msgstr "" + +#: ../src/viktrwlayer.c:8760 +msgid "Delete _Selected Point" +msgstr "" + +#: ../src/viktrwlayer.c:8768 +msgid "Delete Points With The Same _Position" +msgstr "" + +#: ../src/viktrwlayer.c:8773 +msgid "Delete Points With The Same _Time" +msgstr "" + +#: ../src/viktrwlayer.c:8780 ../src/viktrwlayer.c:9029 +msgid "_Transform" +msgstr "" + +#: ../src/viktrwlayer.c:8788 ../src/viktrwlayer.c:9037 +msgid "_Apply DEM Data" +msgstr "_Applica dati DEM" + +#: ../src/viktrwlayer.c:8793 ../src/viktrwlayer.c:9042 +msgid "_Overwrite" +msgstr "" + +#: ../src/viktrwlayer.c:8796 ../src/viktrwlayer.c:9045 +msgid "Overwrite any existing elevation values with DEM values" +msgstr "" + +#: ../src/viktrwlayer.c:8799 ../src/viktrwlayer.c:9048 +msgid "_Keep Existing" +msgstr "" + +#: ../src/viktrwlayer.c:8802 ../src/viktrwlayer.c:9051 +msgid "Keep existing elevation values, only attempt for missing values" +msgstr "" + +#: ../src/viktrwlayer.c:8807 +msgid "_Smooth Missing Elevation Data" +msgstr "" + +#: ../src/viktrwlayer.c:8812 +msgid "_Interpolated" +msgstr "" + +#: ../src/viktrwlayer.c:8815 +msgid "" +"Interpolate between known elevation values to derive values for the missing " +"elevations" +msgstr "" + +#: ../src/viktrwlayer.c:8818 +msgid "_Flat" +msgstr "" + +#: ../src/viktrwlayer.c:8821 +msgid "Set unknown elevation values to the last known value" +msgstr "" + +#: ../src/viktrwlayer.c:8825 +msgid "C_onvert to a Route" +msgstr "" + +#: ../src/viktrwlayer.c:8827 +msgid "C_onvert to a Track" +msgstr "" + +#: ../src/viktrwlayer.c:8835 +msgid "_Anonymize Times" +msgstr "" + +#: ../src/viktrwlayer.c:8838 +msgid "Shift timestamps to a relative offset from 1901-01-01" +msgstr "" + +#: ../src/viktrwlayer.c:8841 +msgid "_Interpolate Times" +msgstr "" + +#: ../src/viktrwlayer.c:8844 +msgid "" +"Reset trackpoint timestamps between the first and last points such that " +"track is traveled at equal speed" +msgstr "" + +#: ../src/viktrwlayer.c:8849 +msgid "_Reverse Track" +msgstr "Inverti il Tracciato (_R)" + +#: ../src/viktrwlayer.c:8851 +msgid "_Reverse Route" +msgstr "" + +#: ../src/viktrwlayer.c:8858 +msgid "Refine Route..." +msgstr "" + +#: ../src/viktrwlayer.c:8868 +msgid "Down_load Maps Along Track..." +msgstr "Scarica _le Mappe Lungo il Tracciato..." + +#: ../src/viktrwlayer.c:8870 +msgid "Down_load Maps Along Route..." +msgstr "" + +#: ../src/viktrwlayer.c:8878 +msgid "_Export Track as GPX..." +msgstr "" + +#: ../src/viktrwlayer.c:8880 +msgid "_Export Route as GPX..." +msgstr "" + +#: ../src/viktrwlayer.c:8887 +msgid "E_xtend Track End" +msgstr "Estendi il Tracciato fino al Termine (_x)" + +#: ../src/viktrwlayer.c:8889 +msgid "E_xtend Route End" +msgstr "" + +#: ../src/viktrwlayer.c:8896 +msgid "Extend _Using Route Finder" +msgstr "Estendi _Usando il Percorso di Ricerca" + +#: ../src/viktrwlayer.c:8911 +msgid "_Upload to GPS..." +msgstr "" + +#: ../src/viktrwlayer.c:8926 +msgid "_Diary" +msgstr "" + +#: ../src/viktrwlayer.c:8930 +msgid "Open diary program at this date" +msgstr "" + +#: ../src/viktrwlayer.c:8935 +msgid "_Astronomy" +msgstr "" + +#: ../src/viktrwlayer.c:8938 +msgid "Open astronomy program at this date and location" +msgstr "" + +#: ../src/viktrwlayer.c:8962 +msgid "_View Google Directions" +msgstr "_Visualizza Direzioni Google" + +#: ../src/viktrwlayer.c:8984 +msgid "Use with _Filter" +msgstr "Utilizza con _filtro" + +#: ../src/viktrwlayer.c:9018 +msgid "_Edit Trackpoint" +msgstr "Modifica il Punto del Tracciato (_E)" + +#: ../src/viktrwlayer.c:10116 +#, c-format +msgid " - Gain %dm:Loss %dm" +msgstr " - Miglioramento %dm:Perdita %dm" + +#: ../src/viktrwlayer.c:10118 +#, c-format +msgid " - Gain %dft:Loss %dft" +msgstr " - Miglioramento %dft:Perdita %dft" + +#: ../src/viktrwlayer.c:10123 +#, c-format +msgid " - Bearing %3.1f° - Step %s" +msgstr "" + +#: ../src/viktrwlayer.c:10232 +#, c-format +msgid "Querying %s for route between (%.3f, %.3f) and (%.3f, %.3f)." +msgstr "" + +#: ../src/viktrwlayer.c:10248 +#, c-format +msgid "%s returned route between (%.3f, %.3f) and (%.3f, %.3f)." +msgstr "" + +#: ../src/viktrwlayer.c:10251 +#, c-format +msgid "Error getting route from %s." +msgstr "" + +#: ../src/viktrwlayer.c:11070 +#, c-format +msgid "Creating %d Image Thumbnails..." +msgstr "Creazione di %d miniature..." + +#: ../src/viktrwlayer.c:11560 +msgid "No map layer in use. Create one first" +msgstr "Nessun livello di mappa in uso. Creane uno prima" + +#: ../src/viktrwlayer.c:11679 +#, c-format +msgid "%s: Track List" +msgstr "" + +#: ../src/viktrwlayer.c:11681 +#, c-format +msgid "%s: Route List" +msgstr "" + +#: ../src/viktrwlayer.c:11734 +#, c-format +msgid "" +"Could not write external layer %s to %s, please fix and save before exiting " +"or data will be lost" +msgstr "" + +#: ../src/viktrwlayer.c:11782 +#, c-format +msgid "WARNING: issues encountered loading external layer %s from %s" +msgstr "" + +#: ../src/viktrwlayer_export.c:47 +msgid "Auto Device GPX Simplify:" +msgstr "" + +#: ../src/viktrwlayer_export.c:48 +msgid "" +"GPX saves to certain devices will be simplified for device compatibility." +msgstr "" + +#: ../src/viktrwlayer_export.c:125 +#, c-format +msgid "Export of GPX file simplified using point limit: %d" +msgstr "" + +#: ../src/viktrwlayer_export.c:206 ../src/viktrwlayer_export.c:323 +#: ../src/vikwindow.c:3694 +msgid "The filename you requested could not be opened for writing." +msgstr "Non è stato possibile aprire il file richiesto in scrittura." + +#: ../src/viktrwlayer_export.c:226 +#, c-format +msgid "Could not launch %s." +msgstr "Impossibile lanciare %s." + +#: ../src/viktrwlayer_export.c:234 +msgid "Could not create temporary file for export." +msgstr "Impossibile creare il file temporaneo per l'esportazione." + +#: ../src/viktrwlayer_export.c:268 +msgid "File format:" +msgstr "" + +#: ../src/viktrwlayer_export.c:276 +msgid "Select the file format." +msgstr "" + +#: ../src/viktrwlayer_export.c:281 +msgid "" +"Select the information to process.\n" +"Warning: the behavior of these switches is highly dependent of the file " +"format selected.\n" +"Please, refer to GPSbabel if unsure." +msgstr "" + +#: ../src/viktrwlayer_export.c:308 +msgid "You did not select a valid file format." +msgstr "" + +#: ../src/viktrwlayer_propwin.c:915 ../src/viktrwlayer_propwin.c:3381 +#: ../src/viktrwlayer_propwin.c:3417 ../src/viktrwlayer_propwin.c:3457 +#: ../src/viktrwlayer_propwin.c:3509 ../src/viktrwlayer_propwin.c:3527 +#: ../src/viktrwlayer_propwin.c:3600 ../src/viktrwlayer_propwin.c:3601 +#: ../src/viktrwlayer_propwin.c:3602 ../src/viktrwlayer_propwin.c:3611 +#: ../src/viktrwlayer_propwin.c:3612 ../src/viktrwlayer_propwin.c:3629 +#: ../src/viktrwlayer_propwin.c:3630 ../src/viktrwlayer_propwin.c:3644 +#: ../src/viktrwlayer_propwin.c:3645 ../src/viktrwlayer_propwin.c:3646 +#: ../src/viktrwlayer_propwin.c:3660 ../src/viktrwlayer_propwin.c:3661 +#: ../src/viktrwlayer_propwin.c:3662 ../src/viktrwlayer_propwin.c:3676 +#: ../src/viktrwlayer_propwin.c:3677 ../src/viktrwlayer_propwin.c:3678 +#: ../src/viktrwlayer_propwin.c:3695 ../src/viktrwlayer_propwin.c:3696 +#: ../src/viktrwlayer_analysis.c:293 +#, c-format +msgid "No Data" +msgstr "Nessun dato" + +#: ../src/viktrwlayer_propwin.c:960 ../src/viktrwlayer_propwin.c:1245 +#, c-format +msgid "%.1f kph" +msgstr "%.1f km/h" + +#: ../src/viktrwlayer_propwin.c:963 ../src/viktrwlayer_propwin.c:1248 +#: ../src/viktrwlayer_analysis.c:352 +#, c-format +msgid "%.1f mph" +msgstr "%.1f miglia/h" + +#: ../src/viktrwlayer_propwin.c:966 ../src/viktrwlayer_propwin.c:1251 +#, c-format +msgid "%.1f knots" +msgstr "%.1f nodi" + +#: ../src/viktrwlayer_propwin.c:969 ../src/viktrwlayer_propwin.c:1254 +#, fuzzy, c-format +msgid "%.1f s/km" +msgstr "%.1f km" + +#: ../src/viktrwlayer_propwin.c:972 ../src/viktrwlayer_propwin.c:1257 +#: ../src/viktrwlayer_analysis.c:389 ../src/viktrwlayer_analysis.c:392 +#, fuzzy, c-format +msgid "%.1f min/km" +msgstr "%.1f km" + +#: ../src/viktrwlayer_propwin.c:975 ../src/viktrwlayer_propwin.c:1260 +#, fuzzy, c-format +msgid "%.1f sec/mi" +msgstr "%.1f miglia" + +#: ../src/viktrwlayer_propwin.c:978 ../src/viktrwlayer_propwin.c:1263 +#: ../src/viktrwlayer_analysis.c:409 ../src/viktrwlayer_analysis.c:412 +#, fuzzy, c-format +msgid "%.1f min/mi" +msgstr "%.1f m/s" + +#. VIK_UNITS_SPEED_METRES_PER_SECOND: +#: ../src/viktrwlayer_propwin.c:982 ../src/viktrwlayer_propwin.c:1267 +#, c-format +msgid "%.1f m/s" +msgstr "%.1f m/s" + +#. Minutes +#: ../src/viktrwlayer_propwin.c:1411 +msgid "mins" +msgstr "" + +#. Hours +#: ../src/viktrwlayer_propwin.c:1418 +msgid "h" +msgstr "" + +#. Days +#: ../src/viktrwlayer_propwin.c:1424 +msgid "d" +msgstr "" + +#. Weeks +#: ../src/viktrwlayer_propwin.c:1429 +msgid "w" +msgstr "" + +#. 'Months' +#: ../src/viktrwlayer_propwin.c:1433 +msgid "M" +msgstr "" + +#: ../src/viktrwlayer_propwin.c:2051 ../src/viktrwlayer_analysis.c:303 +#, c-format +msgid "%.1f miles" +msgstr "%.1f miglia" + +#: ../src/viktrwlayer_propwin.c:2054 ../src/viktrwlayer_analysis.c:306 +#, c-format +msgid "%.1f NM" +msgstr "" + +#. VIK_UNITS_DISTANCE_KILOMETRES +#: ../src/viktrwlayer_propwin.c:2057 ../src/viktrwlayer_analysis.c:310 +#, c-format +msgid "%.1f km" +msgstr "%.1f km" + +#: ../src/viktrwlayer_propwin.c:3083 +msgid "Failed spliting track. Track unchanged" +msgstr "Divisione del tracciato non riuscita. Tracciato invariato" + +#: ../src/viktrwlayer_propwin.c:3234 ../src/viktrwlayer_propwin.c:3744 +#, c-format +msgid "%s - Track Properties" +msgstr "%s - Proprietà del tracciato" + +#: ../src/viktrwlayer_propwin.c:3239 +msgid "Split at _Marker" +msgstr "Dividi al _Marcatore" + +#: ../src/viktrwlayer_propwin.c:3240 +msgid "Split _Segments" +msgstr "Dividi _Segmenti" + +#: ../src/viktrwlayer_propwin.c:3241 +msgid "_Reverse" +msgstr "Inverti (_R)" + +#: ../src/viktrwlayer_propwin.c:3242 +msgid "_Delete Dupl." +msgstr "Elimina _Duplicati" + +#: ../src/viktrwlayer_propwin.c:3269 +msgid "Comment:" +msgstr "Commento:" + +#: ../src/viktrwlayer_propwin.c:3270 +msgid "Description:" +msgstr "" + +#: ../src/viktrwlayer_propwin.c:3271 +#, fuzzy +msgid "Source:" +msgstr "Inizio:" + +#: ../src/viktrwlayer_propwin.c:3272 +#, fuzzy +msgid "Type:" +msgstr "Tempo:" + +#: ../src/viktrwlayer_propwin.c:3273 +msgid "Color:" +msgstr "" + +#: ../src/viktrwlayer_propwin.c:3274 +msgid "Draw Name:" +msgstr "" + +#: ../src/viktrwlayer_propwin.c:3275 +msgid "Distance Labels:" +msgstr "" + +#: ../src/viktrwlayer_propwin.c:3278 +msgid "Track Length:" +msgstr "Lunghezza tracciato:" + +#: ../src/viktrwlayer_propwin.c:3279 +msgid "Trackpoints:" +msgstr "Trackpoints:" + +#: ../src/viktrwlayer_propwin.c:3280 +msgid "Segments:" +msgstr "Segmenti:" + +#: ../src/viktrwlayer_propwin.c:3281 +msgid "Duplicate Points:" +msgstr "Punti duplicati:" + +#: ../src/viktrwlayer_propwin.c:3282 +msgid "Max Speed:" +msgstr "Velocità massima:" + +#: ../src/viktrwlayer_propwin.c:3283 +msgid "Avg. Speed:" +msgstr "Velocità media:" + +#: ../src/viktrwlayer_propwin.c:3284 +msgid "Moving Avg. Speed:" +msgstr "Velocità Media di Spostamento:" + +#: ../src/viktrwlayer_propwin.c:3285 +msgid "Avg. Dist. Between TPs:" +msgstr "Distanza media fra TrackPoint:" + +#: ../src/viktrwlayer_propwin.c:3286 +msgid "Elevation Range:" +msgstr "Intervallo di quota:" + +#: ../src/viktrwlayer_propwin.c:3287 +msgid "Total Elevation Gain/Loss:" +msgstr "Dislivello totale/Perdita:" + +#: ../src/viktrwlayer_propwin.c:3288 +msgid "Start:" +msgstr "Inizio:" + +#: ../src/viktrwlayer_propwin.c:3289 +msgid "End:" +msgstr "Fine:" + +#: ../src/viktrwlayer_propwin.c:3290 +msgid "Duration:" +msgstr "Durata:" + +#: ../src/viktrwlayer_propwin.c:3320 +msgid "Centre" +msgstr "" + +#: ../src/viktrwlayer_propwin.c:3321 +msgid "Start only" +msgstr "" + +#: ../src/viktrwlayer_propwin.c:3322 +msgid "End only" +msgstr "" + +#: ../src/viktrwlayer_propwin.c:3323 +msgid "Start and End" +msgstr "" + +#: ../src/viktrwlayer_propwin.c:3324 +msgid "Centre, Start and End" +msgstr "" + +#: ../src/viktrwlayer_propwin.c:3336 +msgid "Maximum number of distance labels to be shown" +msgstr "" + +#: ../src/viktrwlayer_propwin.c:3340 +msgid "Properties" +msgstr "" + +#: ../src/viktrwlayer_propwin.c:3584 +#, c-format +msgid "%d minutes - %d minutes moving" +msgstr "" + +#: ../src/viktrwlayer_propwin.c:3596 +#, c-format +msgid "%s total - %s in segments" +msgstr "" + +#: ../src/viktrwlayer_propwin.c:3607 ../src/viktrwlayer_analysis.c:622 +msgid "Statistics" +msgstr "Statistiche" + +#: ../src/viktrwlayer_propwin.c:3613 ../src/viktrwlayer_propwin.c:3680 +msgid "Show D_EM" +msgstr "Mostra D_EM" + +#: ../src/viktrwlayer_propwin.c:3615 ../src/viktrwlayer_propwin.c:3631 +#: ../src/viktrwlayer_propwin.c:3647 ../src/viktrwlayer_propwin.c:3697 +msgid "Show _GPS Speed" +msgstr "Mostra la Velocità _GPS" + +#: ../src/viktrwlayer_propwin.c:3617 ../src/viktrwlayer_propwin.c:3633 +#: ../src/viktrwlayer_propwin.c:3665 ../src/viktrwlayer_propwin.c:3699 +msgid "Track Distance:" +msgstr "Distanza tracciato:" + +#: ../src/viktrwlayer_propwin.c:3618 ../src/viktrwlayer_propwin.c:3684 +msgid "Track Height:" +msgstr "Altezza del Tracciato:" + +#: ../src/viktrwlayer_propwin.c:3624 +msgid "Elevation-distance" +msgstr "Elevazione-distanza" + +#: ../src/viktrwlayer_propwin.c:3634 +msgid "Track Gradient:" +msgstr "" + +#: ../src/viktrwlayer_propwin.c:3639 +msgid "Gradient-distance" +msgstr "" + +#: ../src/viktrwlayer_propwin.c:3649 ../src/viktrwlayer_propwin.c:3666 +#: ../src/viktrwlayer_propwin.c:3683 +msgid "Track Time:" +msgstr "Durata tracciato:" + +#: ../src/viktrwlayer_propwin.c:3650 ../src/viktrwlayer_propwin.c:3700 +msgid "Track Speed:" +msgstr "Velocità del Tracciato:" + +#: ../src/viktrwlayer_propwin.c:3651 ../src/viktrwlayer_propwin.c:3667 +#: ../src/viktrwlayer_propwin.c:3685 +msgid "Time/Date:" +msgstr "" + +#: ../src/viktrwlayer_propwin.c:3655 +msgid "Speed-time" +msgstr "Velocità-tempo" + +#: ../src/viktrwlayer_propwin.c:3663 ../src/viktrwlayer_propwin.c:3679 +msgid "Show S_peed" +msgstr "Mostra la Velocità (_p)" + +#: ../src/viktrwlayer_propwin.c:3671 +msgid "Distance-time" +msgstr "" + +#: ../src/viktrwlayer_propwin.c:3690 +msgid "Elevation-time" +msgstr "" + +#: ../src/viktrwlayer_propwin.c:3705 +msgid "Speed-distance" +msgstr "" + +#: ../src/viktrwlayer_tpwin.c:190 ../src/viktrwlayer_wpwin.c:66 +msgid "Date/Time Edit" +msgstr "" + +#: ../src/viktrwlayer_tpwin.c:242 +msgid "Name:" +msgstr "" + +#: ../src/viktrwlayer_tpwin.c:243 +msgid "Latitude:" +msgstr "Latitudine:" + +#: ../src/viktrwlayer_tpwin.c:244 +msgid "Longitude:" +msgstr "Longitudine:" + +#: ../src/viktrwlayer_tpwin.c:245 +msgid "Altitude:" +msgstr "Altitudine:" + +#: ../src/viktrwlayer_tpwin.c:246 +msgid "Course:" +msgstr "" + +#: ../src/viktrwlayer_tpwin.c:247 +msgid "Timestamp:" +msgstr "Timestamp:" + +#: ../src/viktrwlayer_tpwin.c:248 +msgid "Time:" +msgstr "Tempo:" + +#: ../src/viktrwlayer_tpwin.c:249 +msgid "Distance Difference:" +msgstr "Differenza di distanza:" + +#: ../src/viktrwlayer_tpwin.c:250 +msgid "Time Difference:" +msgstr "Differenza di tempo:" + +#: ../src/viktrwlayer_tpwin.c:251 +msgid "\"Speed\" Between:" +msgstr "\"Velocità\" tra:" + +#: ../src/viktrwlayer_tpwin.c:252 +msgid "Speed:" +msgstr "" + +#: ../src/viktrwlayer_tpwin.c:253 +msgid "VDOP:" +msgstr "VDOP:" + +#: ../src/viktrwlayer_tpwin.c:254 +msgid "HDOP:" +msgstr "HDOP:" + +#: ../src/viktrwlayer_tpwin.c:255 +msgid "PDOP:" +msgstr "PDOP:" + +#: ../src/viktrwlayer_tpwin.c:256 +msgid "SAT/FIX:" +msgstr "SAT/FIX:" + +#: ../src/viktrwlayer_tpwin.c:263 ../src/viktrwlayer_tpwin.c:408 +#: ../src/viktrwlayer_tpwin.c:622 +msgid "Trackpoint" +msgstr "Trackpoint" + +#: ../src/viktrwlayer_tpwin.c:266 +msgid "_Insert After" +msgstr "_Inserisci dopo" + +#: ../src/viktrwlayer_tpwin.c:268 +msgid "Split Here" +msgstr "Suddividi qui" + +#: ../src/viktrwlayer_tracklist.c:262 ../src/viktrwlayer_waypointlist.c:306 +msgid "_Copy Data" +msgstr "" + +#. +#. item = gtk_image_menu_item_new_with_mnemonic ( _("_Select") ); +#. gtk_image_menu_item_set_image ( (GtkImageMenuItem*)item, gtk_image_new_from_stock (GTK_STOCK_FIND, GTK_ICON_SIZE_MENU) ); +#. g_signal_connect_swapped ( G_OBJECT(item), "activate", G_CALLBACK(trw_layer_track_select), values ); +#. gtk_menu_shell_append (GTK_MENU_SHELL (menu), item); +#. gtk_widget_show ( item ); +#. +#. ATM view auto selects, so don't bother with separate select menu entry +#. +#. item = gtk_image_menu_item_new_with_mnemonic ( _("_Select") ); +#. gtk_image_menu_item_set_image ( (GtkImageMenuItem*)item, gtk_image_new_from_stock (GTK_STOCK_FIND, GTK_ICON_SIZE_MENU) ); +#. g_signal_connect_swapped ( G_OBJECT(item), "activate", G_CALLBACK(trw_layer_waypoint_select), values ); +#. gtk_menu_shell_append (GTK_MENU_SHELL (menu), item); +#. gtk_widget_show ( item ); +#. +#. AUTO SELECT NOT TRUE YET... +#. ATM view auto selects, so don't bother with separate select menu entry +#: ../src/viktrwlayer_tracklist.c:290 ../src/viktrwlayer_waypointlist.c:341 +#: ../src/vikwindow.c:4816 +msgid "_View" +msgstr "_Visualizza" + +#. Insert column for the layer name when viewing multi layers +#: ../src/viktrwlayer_tracklist.c:613 ../src/viktrwlayer_waypointlist.c:609 +msgid "Layer" +msgstr "" + +#: ../src/viktrwlayer_tracklist.c:627 ../src/viktrwlayer_waypointlist.c:624 +msgid "Date" +msgstr "" + +#: ../src/viktrwlayer_tracklist.c:631 ../src/viktrwlayer_waypointlist.c:628 +msgid "Visible" +msgstr "" + +#: ../src/viktrwlayer_tracklist.c:639 +msgid "" +"Distance\n" +"(miles)" +msgstr "" + +#: ../src/viktrwlayer_tracklist.c:642 +msgid "" +"Distance\n" +"(NM)" +msgstr "" + +#: ../src/viktrwlayer_tracklist.c:645 +msgid "" +"Distance\n" +"(km)" +msgstr "" + +#: ../src/viktrwlayer_tracklist.c:651 +msgid "" +"Length\n" +"(minutes)" +msgstr "" + +#: ../src/viktrwlayer_tracklist.c:660 ../src/vikutils.c:93 +msgid "sec/mi" +msgstr "" + +#: ../src/viktrwlayer_tracklist.c:666 +#, c-format +msgid "" +"Av. Speed\n" +"(%s)" +msgstr "" + +#. Apply own formatting of the data +#: ../src/viktrwlayer_tracklist.c:671 +#, c-format +msgid "" +"Max Speed\n" +"(%s)" +msgstr "" + +#: ../src/viktrwlayer_tracklist.c:679 ../src/viktrwlayer_waypointlist.c:637 +msgid "" +"Max Height\n" +"(Feet)" +msgstr "" + +#: ../src/viktrwlayer_tracklist.c:681 ../src/viktrwlayer_waypointlist.c:639 +msgid "" +"Max Height\n" +"(Metres)" +msgstr "" + +#: ../src/viktrwlayer_waypointlist.c:312 +msgid "Copy Data (with _positions)" +msgstr "" + +#: ../src/viktrwlayer_waypointlist.c:633 +msgid "Comment" +msgstr "" + +#: ../src/viktrwlayer_waypointlist.c:643 +msgid "Symbol" +msgstr "" + +#: ../src/viktrwlayer_wpwin.c:93 ../src/viktrwlayer_wpwin.c:302 +msgid "True" +msgstr "" + +#: ../src/viktrwlayer_wpwin.c:122 +msgid "Waypoint Properties" +msgstr "Proprietà Waypoint" + +#: ../src/viktrwlayer_wpwin.c:164 +msgid "Name:" +msgstr "Nome:" + +#: ../src/viktrwlayer_wpwin.c:181 +msgid "Altitude:" +msgstr "Altitudine:" + +#: ../src/viktrwlayer_wpwin.c:186 ../src/viktrwlayer_wpwin.c:188 +msgid "Comment:" +msgstr "Commento:" + +#: ../src/viktrwlayer_wpwin.c:202 +#, fuzzy +msgid "Source:" +msgstr "Fonte di scaricamento:" + +#: ../src/viktrwlayer_wpwin.c:212 +msgid "Image:" +msgstr "Immagine:" + +#: ../src/viktrwlayer_wpwin.c:217 +msgid "Symbol:" +msgstr "Simbolo:" + +#: ../src/viktrwlayer_wpwin.c:226 +msgid "(none)" +msgstr "(nessuno)" + +#. Geotag Info [readonly] +#: ../src/viktrwlayer_wpwin.c:272 +msgid "Has Geotag" +msgstr "" + +#: ../src/viktrwlayer_wpwin.c:279 +msgid "Consistent Position" +msgstr "" + +#. ATM the direction value box is always shown, even when there is no information. +#. It would be nice to be able to hide it until the 'Add' has been performed, +#. however I've not been able to achieve this. +#. Thus simply sensistizing it instead. +#: ../src/viktrwlayer_wpwin.c:292 +#, fuzzy +msgid "Image Direction:" +msgstr "Fuso Orario dell'Immagine:" + +#: ../src/viktrwlayer_wpwin.c:300 +msgid "Magnetic" +msgstr "" + +#: ../src/viktrwlayer_wpwin.c:320 +msgid "Time:" +msgstr "" + +#. TODO: other checks (isalpha or whatever ) +#: ../src/viktrwlayer_wpwin.c:386 +msgid "Please enter a name for the waypoint." +msgstr "Inserire un nome per il waypoint." + +#: ../src/viktrwlayer_geotag.c:320 ../src/viktrwlayer_geotag.c:460 +#, c-format +msgid "Failed updating EXIF on %s" +msgstr "" + +#: ../src/viktrwlayer_geotag.c:562 +#, c-format +msgid "Geotagging %d Images..." +msgstr "Georeferenziate %d immagini..." + +#: ../src/viktrwlayer_geotag.c:630 +msgid "Geotag Images" +msgstr "Georeferenzia le Immagini" + +#: ../src/viktrwlayer_geotag.c:640 +msgid "Images" +msgstr "Immagini" + +#: ../src/viktrwlayer_geotag.c:645 +msgid "Overwrite Existing Waypoints:" +msgstr "" + +#: ../src/viktrwlayer_geotag.c:648 +msgid "Overwrite Existing GPS Information:" +msgstr "Sovrascrivi le Informazioni GPS Esistenti:" + +#: ../src/viktrwlayer_geotag.c:650 +msgid "Keep File Modification Timestamp:" +msgstr "Mantieni il File di Modifica dell'Ora Impressa" + +#: ../src/viktrwlayer_geotag.c:684 +msgid "Create Waypoints:" +msgstr "Crea i Punti di Transito:" + +#: ../src/viktrwlayer_geotag.c:693 +msgid "Write EXIF:" +msgstr "Scrittura EXIF:" + +#: ../src/viktrwlayer_geotag.c:705 +msgid "Automatic Image Direction:" +msgstr "" + +#: ../src/viktrwlayer_geotag.c:707 +msgid "Set image direction based on a heading derived from the track" +msgstr "" + +#: ../src/viktrwlayer_geotag.c:710 +msgid "Interpolate Between Track Segments:" +msgstr "Interpolazione Tra i Segmenti del Tracciato:" + +#: ../src/viktrwlayer_geotag.c:715 +msgid "Image Time Offset (Seconds):" +msgstr "" + +#: ../src/viktrwlayer_geotag.c:718 +msgid "" +"The number of seconds to ADD to the photos time to make it match the GPS " +"data. Calculate this with (GPS - Photo). Can be negative or positive. Useful " +"to adjust times when a camera's timestamp was incorrect." +msgstr "" +"Il numero di secondi da aggiungere all'orario delle foto in modo che " +"corrisponda ai dati GPS. Questo è calcolato con (GPS - Photo). Può essere " +"positivo o negativo. Utile per regolare gli orari quando quelli impressi da " +"una fotocamera non erano corretti." + +#: ../src/viktrwlayer_geotag.c:721 +msgid "Image Timezone:" +msgstr "Fuso Orario dell'Immagine:" + +#: ../src/viktrwlayer_geotag.c:724 +msgid "" +"The timezone that was used when the images were created. For example, if a " +"camera is set to AWST or +8:00 hours. Enter +8:00 here so that the correct " +"adjustment to the images' time can be made. GPS data is always in UTC." +msgstr "" +"Il fuso orario che è stato utilizzato quando le immagini sono state create. " +"Ad esempio, se una fotocamera è impostata su AWST o +8:00 ore. Inserisci qui " +"+8:00 in modo che possa essere fatta la corretta regolazione sull'ora delle " +"immagini. I dati GPS sono sempre in UTC." + +#: ../src/viktrwlayer_geotag.c:728 +#, c-format +msgid "Using waypoint: %s" +msgstr "" + +#: ../src/viktrwlayer_geotag.c:742 +#, c-format +msgid "Using track: %s" +msgstr "Utilizza il tracciato: %s" + +#: ../src/viktrwlayer_geotag.c:744 +#, c-format +msgid "Using all tracks in: %s" +msgstr "Utilizza tutti i tracciati: %s" + +#: ../src/viktrwlayer_analysis.c:214 +msgid "Number of Tracks" +msgstr "" + +#: ../src/viktrwlayer_analysis.c:215 +msgid "Date Range" +msgstr "" + +#: ../src/viktrwlayer_analysis.c:216 +msgid "Total Length" +msgstr "" + +#: ../src/viktrwlayer_analysis.c:217 +msgid "Average Length" +msgstr "" + +#: ../src/viktrwlayer_analysis.c:218 +msgid "Eddington number" +msgstr "" + +#. No.4: Extended display only +#: ../src/viktrwlayer_analysis.c:219 +msgid "Max Speed" +msgstr "" + +#: ../src/viktrwlayer_analysis.c:220 +msgid "Avg. Speed" +msgstr "" + +#: ../src/viktrwlayer_analysis.c:221 +msgid "Minimum Altitude" +msgstr "" + +#: ../src/viktrwlayer_analysis.c:222 +msgid "Maximum Altitude" +msgstr "" + +#: ../src/viktrwlayer_analysis.c:223 +msgid "Total Elevation Gain/Loss" +msgstr "" + +#: ../src/viktrwlayer_analysis.c:224 +msgid "Avg. Elevation Gain/Loss" +msgstr "" + +#: ../src/viktrwlayer_analysis.c:225 +msgid "Total Duration" +msgstr "" + +#: ../src/viktrwlayer_analysis.c:226 +msgid "Avg. Duration" +msgstr "" + +#: ../src/viktrwlayer_analysis.c:317 +#, c-format +msgid "%.2f miles" +msgstr "" + +#: ../src/viktrwlayer_analysis.c:320 +#, c-format +msgid "%.2f NM" +msgstr "" + +#. VIK_UNITS_DISTANCE_KILOMETRES +#: ../src/viktrwlayer_analysis.c:324 +#, c-format +msgid "%.2f km" +msgstr "" + +#: ../src/viktrwlayer_analysis.c:361 +#, c-format +msgid "%.2f m/s" +msgstr "" + +#: ../src/viktrwlayer_analysis.c:370 ../src/viktrwlayer_analysis.c:373 +#, c-format +msgid "%.2f knots" +msgstr "" + +#: ../src/viktrwlayer_analysis.c:379 ../src/viktrwlayer_analysis.c:382 +#, c-format +msgid "%d s/km" +msgstr "" + +#: ../src/viktrwlayer_analysis.c:399 ../src/viktrwlayer_analysis.c:402 +#, c-format +msgid "%d sec/mi" +msgstr "" + +#: ../src/viktrwlayer_analysis.c:420 ../src/viktrwlayer_analysis.c:423 +#, c-format +msgid "%.2f km/h" +msgstr "" + +#: ../src/viktrwlayer_analysis.c:434 ../src/viktrwlayer_analysis.c:440 +#, c-format +msgid "%d feet" +msgstr "" + +#: ../src/viktrwlayer_analysis.c:445 ../src/viktrwlayer_analysis.c:447 +#, c-format +msgid "%d feet / %d feet" +msgstr "" + +#: ../src/viktrwlayer_analysis.c:452 ../src/viktrwlayer_analysis.c:458 +#, c-format +msgid "%d m" +msgstr "" + +#: ../src/viktrwlayer_analysis.c:463 ../src/viktrwlayer_analysis.c:465 +#, c-format +msgid "%d m / %d m" +msgstr "" + +#: ../src/viktrwlayer_analysis.c:477 +#, c-format +msgid "%d:%02d:%02d days:hrs:mins" +msgstr "" + +#: ../src/viktrwlayer_analysis.c:484 +#, c-format +msgid "%d:%02d hrs:mins" +msgstr "" + +#: ../src/viktrwlayer_analysis.c:658 +msgid "Include Invisible Items" +msgstr "" + +#: ../src/vikstatus.c:129 +msgid "Current number of background tasks. Click to see the background jobs." +msgstr "" + +#: ../src/vikstatus.c:134 +msgid "Current zoom level. Click to select a new one." +msgstr "" + +#: ../src/vikstatus.c:141 +msgid "Left click to clear the message. Right click to copy the message." +msgstr "" + +#: ../src/vikutils.c:108 +msgid "GPSD" +msgstr "" + +#. GPS Preamble +#: ../src/vikutils.c:109 +msgid "Trkpt" +msgstr "" + +#: ../src/vikutils.c:160 +#, c-format +msgid "%sSpeed%s %.1f%s" +msgstr "" + +#. Go for 2dp as expect low values for vertical speeds +#: ../src/vikutils.c:214 +#, c-format +msgid "%sClimb%s %.2f%s" +msgstr "" + +#: ../src/vikutils.c:223 +#, c-format +msgid "%sAlt %dfeet" +msgstr "" + +#. VIK_UNITS_HEIGHT_METRES: +#: ../src/vikutils.c:227 +#, c-format +msgid "%sAlt %dm" +msgstr "" + +#: ../src/vikutils.c:235 +#, c-format +msgid "%sCourse %03d°" +msgstr "" + +#: ../src/vikutils.c:249 +msgid "yards" +msgstr "" + +#. VIK_UNITS_DISTANCE_KILOMETRES: +#: ../src/vikutils.c:253 +msgid "m" +msgstr "" + +#: ../src/vikutils.c:257 +#, c-format +msgid "%sDistance diff %d%s" +msgstr "" + +#: ../src/vikutils.c:272 +#, c-format +msgid "%sTime %s" +msgstr "" + +#: ../src/vikutils.c:281 +#, c-format +msgid "%sTime diff %lds" +msgstr "" + +#: ../src/vikutils.c:287 +#, c-format +msgid "%sNo. of Sats %d" +msgstr "" + +#: ../src/vikutils.c:312 +#, c-format +msgid "%sTo End %.2f%s" +msgstr "" + +#: ../src/vikutils.c:339 +#, c-format +msgid "%sDistance along %.2f%s" +msgstr "" + +#: ../src/vikutils.c:359 +#, c-format +msgid "%sTrack: %s" +msgstr "" + +#: ../src/vikutils.c:396 +#, c-format +msgid "" +"There is a newer version of Viking available: %s\n" +"\n" +"Do you wish to go to Viking's website now?" +msgstr "" + +#: ../src/vikutils.c:526 +msgid "" +"This appears to be Viking's very first run.\n" +"\n" +"Do you wish to enable automatic internet features?\n" +"\n" +"Individual settings can be controlled in the Preferences." +msgstr "" + +#: ../src/vikwaypoint.c:37 +msgid "Waypoint" +msgstr "" + +#: ../src/vikwebtool_datasource.c:352 +msgid "Search Term" +msgstr "" + +#. TODO get rid of this as this is unnecessary duplication... +#: ../src/vikwindow.c:258 +msgid "Pan" +msgstr "Scorri" + +#: ../src/vikwindow.c:258 +msgid "Zoom" +msgstr "Zoom" + +#: ../src/vikwindow.c:258 +msgid "Ruler" +msgstr "Righello" + +#: ../src/vikwindow.c:258 +msgid "Select" +msgstr "Seleziona" + +#: ../src/vikwindow.c:368 +msgid "This is Viking " +msgstr "" + +#: ../src/vikwindow.c:457 +msgid "Location lookup aborted" +msgstr "" + +#: ../src/vikwindow.c:477 +#, c-format +msgid "Location found: %s" +msgstr "" + +#: ../src/vikwindow.c:486 +msgid "Unable to determine location" +msgstr "" + +#: ../src/vikwindow.c:495 +msgid "Determining location" +msgstr "" + +#: ../src/vikwindow.c:525 +#, c-format +msgid "Location found via geoclue" +msgstr "" + +#: ../src/vikwindow.c:546 +msgid "Default Map" +msgstr "" + +#: ../src/vikwindow.c:557 ../src/vikwindow.c:3938 +msgid "Trying to determine location..." +msgstr "" + +#. Create tooltip +#: ../src/vikwindow.c:723 +msgid "Select zoom level" +msgstr "" + +#: ../src/vikwindow.c:1176 +#, c-format +msgid "" +"Do you want to save the changes you made to the document \"%s\"?\n" +"\n" +"Your changes will be lost if you don't save them." +msgstr "" +"Desideri salvare le modifiche effettuate al documento \"%s\"?\n" +"\n" +"Le modifiche effettuate saranno perse se non salvate." + +#: ../src/vikwindow.c:1180 +msgid "Don't Save" +msgstr "Non salvare" + +#: ../src/vikwindow.c:1268 +msgid "mpp" +msgstr "mpp" + +#: ../src/vikwindow.c:1268 +msgid "pixelfact" +msgstr "pixelfact" + +#: ../src/vikwindow.c:1467 +#, c-format +msgid "%s %s %dm" +msgstr "%s %s %dm" + +#: ../src/vikwindow.c:1469 +#, c-format +msgid "%s %s %dft" +msgstr "%s %s %dft" + +#: ../src/vikwindow.c:1472 +#, c-format +msgid "%s %s" +msgstr "%s %s" + +#: ../src/vikwindow.c:1929 +msgid "_Ruler" +msgstr "_Righello" + +#: ../src/vikwindow.c:1929 +msgid "Ruler Tool" +msgstr "Strumento righello" + +#: ../src/vikwindow.c:2204 ../src/vikwindow.c:4818 +msgid "_Zoom" +msgstr "_Zoom" + +#: ../src/vikwindow.c:2204 +msgid "Zoom Tool" +msgstr "Strumento di Zoom" + +#: ../src/vikwindow.c:2271 ../src/vikwindow.c:4819 +msgid "_Pan" +msgstr "_Scorri" + +#: ../src/vikwindow.c:2271 +msgid "Pan Tool" +msgstr "Strumento di scorrimento" + +#: ../src/vikwindow.c:2425 +msgid "_Select" +msgstr "_Seleziona" + +#: ../src/vikwindow.c:2425 +msgid "Select Tool" +msgstr "Strumento di Selezione" + +#: ../src/vikwindow.c:2615 +msgid "You must select a layer to show its properties." +msgstr "Selezionare un livello per vederne le proprietà." + +#. No error to show, so unlikely this will get called +#: ../src/vikwindow.c:2629 +msgid "The help system is not available." +msgstr "" + +#. Main error path +#: ../src/vikwindow.c:2632 +#, c-format +msgid "" +"Help is not available because: %s.\n" +"Ensure a Mime Type ghelp handler program is installed (e.g. yelp)." +msgstr "" + +#: ../src/vikwindow.c:2865 +msgid "You must select a layer to delete." +msgstr "Selezionare un livello per l'eliminazione." + +#: ../src/vikwindow.c:3171 +msgid "Untitled" +msgstr "Senza titolo" + +#: ../src/vikwindow.c:3300 +#, c-format +msgid "Unable to add '%s' to the list of recently used documents" +msgstr "Impossibile aggiungere \"%s\" alla lista dei documenti recenti." + +#: ../src/vikwindow.c:3391 +msgid "The file you requested could not be opened." +msgstr "Il file richiesto non può essere aperto." + +#: ../src/vikwindow.c:3394 +msgid "" +"GPSBabel is required to load files of this type or GPSBabel encountered " +"problems." +msgstr "" +"Per caricare i file di questo tipo è richiesto GPSBabel oppure GPSBabel ha " +"rilevato dei problemi." + +#: ../src/vikwindow.c:3397 +#, c-format +msgid "Unable to load malformed GPX file %s" +msgstr "" + +#: ../src/vikwindow.c:3400 +#, c-format +msgid "Unsupported file type for %s" +msgstr "Tipo di file non supportato per %s" + +#. Since we can process .vik files with issues just show a warning in the status bar +#. Not that a user can do much about it... or tells them what this issue is yet... +#: ../src/vikwindow.c:3406 +#, c-format +msgid "WARNING: issues encountered loading %s" +msgstr "" + +#: ../src/vikwindow.c:3489 +msgid "Please select a GPS data file to open. " +msgstr "Selezionare un archivio GPS da aprire. " + +#: ../src/vikwindow.c:3508 +msgid "Google Earth" +msgstr "Google Earth" + +#: ../src/vikwindow.c:3523 ../src/vikwindow.c:3646 ../src/viking.desktop.in.h:1 +msgid "Viking" +msgstr "Viking" + +#: ../src/vikwindow.c:3594 ../src/vikwindow.c:4632 +msgid "Open File" +msgstr "" + +#: ../src/vikwindow.c:3630 +msgid "Save as Viking File." +msgstr "Salva come file di Viking." + +#: ../src/vikwindow.c:3757 +#, c-format +msgid "Exporting to file: %s" +msgstr "" + +#. Confirm what happened. +#: ../src/vikwindow.c:3774 +#, c-format +msgid "Exported files: %d" +msgstr "" + +#: ../src/vikwindow.c:3786 +msgid "Nothing to Export!" +msgstr "" + +#: ../src/vikwindow.c:3790 +msgid "Export to directory" +msgstr "" + +#: ../src/vikwindow.c:3809 +msgid "Could not convert all files" +msgstr "" + +#: ../src/vikwindow.c:3851 +msgid "File not accessible" +msgstr "" + +#: ../src/vikwindow.c:3854 +msgid "No Viking File" +msgstr "" + +#: ../src/vikwindow.c:3998 +msgid "This layer has no configurable properties." +msgstr "" + +#: ../src/vikwindow.c:4080 +msgid "Are you sure you wish to delete all layers?" +msgstr "Desideri veramente eliminare tutti i livelli?" + +#. Try harder... +#: ../src/vikwindow.c:4126 ../src/vikwindow.c:4132 +msgid "Generating image file..." +msgstr "" + +#: ../src/vikwindow.c:4154 +msgid "" +"Failed to generate internal image.\n" +"\n" +"Try creating a smaller image." +msgstr "" + +#: ../src/vikwindow.c:4175 +msgid "Image file generated." +msgstr "" + +#: ../src/vikwindow.c:4177 +msgid "Failed to generate image file." +msgstr "" + +#: ../src/vikwindow.c:4246 +#, c-format +msgid "Unable to write to file %s: %s" +msgstr "" + +#: ../src/vikwindow.c:4284 +msgid "" +"Viewable region outside allowable pixel size bounds for image. Clipping " +"width/height values." +msgstr "" +"Regione visibile fuori dal bordo della dimensione pixel consentita per " +"l'immagine. Regolazione dei valori larghezza/altezza." + +#: ../src/vikwindow.c:4309 +#, c-format +msgid "Total area: %ldm x %ldm (%.3f sq. km)" +msgstr "Area Totale: %ldm x %ldm (%.3f kmq)" + +#: ../src/vikwindow.c:4312 +#, c-format +msgid "Total area: %ldm x %ldm (%.3f sq. miles)" +msgstr "Area totale: %ldm x %ldm (%.3f miglia quadrate)" + +#: ../src/vikwindow.c:4315 +#, c-format +msgid "Total area: %ldm x %ldm (%.3f sq. NM)" +msgstr "" + +#. Single file +#: ../src/vikwindow.c:4343 +msgid "Save Image" +msgstr "Salva immagine" + +#: ../src/vikwindow.c:4364 ../src/vikwindow.c:4641 +msgid "KMZ" +msgstr "" + +#: ../src/vikwindow.c:4417 +msgid "You must be in UTM mode to use this feature" +msgstr "Si deve essere in modalità UTM per utilizzare questa funzione" + +#: ../src/vikwindow.c:4421 +msgid "Choose a directory to hold images" +msgstr "Selezionare una cartella dove conservare le immagini" + +#. todo: default for answers inside VikWindow or static (thruout instance) +#: ../src/vikwindow.c:4441 +msgid "Save to Image File" +msgstr "Salva come file immagine" + +#: ../src/vikwindow.c:4457 +msgid "Width (pixels):" +msgstr "Larghezza (pixel):" + +#: ../src/vikwindow.c:4459 +msgid "Height (pixels):" +msgstr "Altezza (pixel):" + +#: ../src/vikwindow.c:4462 +msgid "" +"WARNING: USING LARGE IMAGES OVER 10000x10000\n" +"MAY CRASH THE PROGRAM!" +msgstr "" + +#: ../src/vikwindow.c:4464 +msgid "Zoom (meters per pixel):" +msgstr "Zoom (metri per pixel):" + +#: ../src/vikwindow.c:4480 +msgid "Area in current viewable window" +msgstr "Area nella finestra visibile" + +#: ../src/vikwindow.c:4490 +msgid "Save as PNG" +msgstr "Salva come PNG" + +#: ../src/vikwindow.c:4491 +msgid "Save as JPEG" +msgstr "Salva come JPEG" + +#: ../src/vikwindow.c:4520 +msgid "East-west image tiles:" +msgstr "Celle dell'immagine est-ovest:" + +#: ../src/vikwindow.c:4522 +msgid "North-south image tiles:" +msgstr "Celle dell'immagine nord-sud:" + +#: ../src/vikwindow.c:4619 +msgid "This feature is not available in UTM mode" +msgstr "" + +#: ../src/vikwindow.c:4658 +#, c-format +msgid "Unable to import %s." +msgstr "" + +#: ../src/vikwindow.c:4749 +msgid "Choose a background color" +msgstr "Selezionare un colore di sfondo" + +#: ../src/vikwindow.c:4765 +msgid "Choose a track highlight color" +msgstr "Scegli un colore di evidenziazione del tracciato" + +#: ../src/vikwindow.c:4814 +msgid "_File" +msgstr "_File" + +#: ../src/vikwindow.c:4815 +msgid "_Edit" +msgstr "_Modifica" + +#: ../src/vikwindow.c:4817 +msgid "_Show" +msgstr "Mo_stra" + +#: ../src/vikwindow.c:4820 +msgid "_Layers" +msgstr "_Livelli" + +#: ../src/vikwindow.c:4821 +msgid "_Tools" +msgstr "S_trumenti" + +#: ../src/vikwindow.c:4822 +msgid "_Webtools" +msgstr "_Strumenti Web" + +#: ../src/vikwindow.c:4823 ../src/vikwindow.c:4893 +msgid "_Help" +msgstr "Aiuto (_H)" + +#: ../src/vikwindow.c:4825 +msgid "New file" +msgstr "Nuovo file" + +#: ../src/vikwindow.c:4826 +msgid "_Open..." +msgstr "_Apri..." + +#: ../src/vikwindow.c:4826 +msgid "Open a file" +msgstr "Apri un file" + +#: ../src/vikwindow.c:4827 +msgid "Open _Recent File" +msgstr "Apri file _recente" + +#: ../src/vikwindow.c:4828 +msgid "Append _File..." +msgstr "A_ppendi file..." + +#: ../src/vikwindow.c:4828 +msgid "Append data from a different file" +msgstr "Appende i dati da un file differente" + +#: ../src/vikwindow.c:4829 +msgid "Open GPX as External _Layer..." +msgstr "" + +#: ../src/vikwindow.c:4829 +msgid "Open a GPX file as an external layer" +msgstr "" + +#: ../src/vikwindow.c:4830 +msgid "_Export All" +msgstr "" + +#: ../src/vikwindow.c:4830 +msgid "Export All TrackWaypoint Layers" +msgstr "" + +#: ../src/vikwindow.c:4831 +msgid "_GPX..." +msgstr "" + +#: ../src/vikwindow.c:4831 +msgid "Export as GPX" +msgstr "" + +#: ../src/vikwindow.c:4832 +msgid "A_cquire" +msgstr "A_cquisisci" + +#: ../src/vikwindow.c:4833 +msgid "_Directions..." +msgstr "" + +#: ../src/vikwindow.c:4833 +msgid "Get driving directions" +msgstr "" + +#: ../src/vikwindow.c:4835 +msgid "_OSM Traces..." +msgstr "Tracce _OSM" + +#: ../src/vikwindow.c:4835 +msgid "Get traces from OpenStreetMap" +msgstr "Ottieni tracce da OpenStreetMap" + +#: ../src/vikwindow.c:4836 +msgid "_My OSM Traces..." +msgstr "" + +#: ../src/vikwindow.c:4836 +msgid "Get Your Own Traces from OpenStreetMap" +msgstr "" + +#: ../src/vikwindow.c:4839 +msgid "Geo_caches..." +msgstr "Geo_caches" + +#: ../src/vikwindow.c:4839 +msgid "Get Geocaches from geocaching.com" +msgstr "Ottieni Geocaches da geocaching.com" + +#: ../src/vikwindow.c:4842 +msgid "Create waypoints from geotagged images" +msgstr "Crea i punti di transito dalle immagini georeferenziate" + +#: ../src/vikwindow.c:4844 +msgid "Get a file from a URL" +msgstr "" + +#: ../src/vikwindow.c:4846 +msgid "Create waypoints from Wikipedia items in the current view" +msgstr "" + +#: ../src/vikwindow.c:4848 +msgid "_Save" +msgstr "_Salva" + +#: ../src/vikwindow.c:4848 +msgid "Save the file" +msgstr "Salva il file" + +#: ../src/vikwindow.c:4849 +msgid "Save _As..." +msgstr "S_alva con nome..." + +#: ../src/vikwindow.c:4849 +msgid "Save the file under different name" +msgstr "Salva il file con un nome differente" + +#: ../src/vikwindow.c:4850 +msgid "Properties..." +msgstr "" + +#: ../src/vikwindow.c:4850 +msgid "File Properties" +msgstr "" + +#: ../src/vikwindow.c:4852 +msgid "Import KMZ _Map File..." +msgstr "" + +#: ../src/vikwindow.c:4852 +msgid "Import a KMZ file" +msgstr "" + +#: ../src/vikwindow.c:4853 +msgid "Generate _KMZ Map File..." +msgstr "" + +#: ../src/vikwindow.c:4853 +msgid "Generate a KMZ file with an overlay of the current view" +msgstr "" + +#: ../src/vikwindow.c:4855 +msgid "_Generate Image File..." +msgstr "_Genera file immagine..." + +#: ../src/vikwindow.c:4855 +msgid "Save a snapshot of the workspace into a file" +msgstr "Salva una schermata della pagina in un file" + +#: ../src/vikwindow.c:4856 +msgid "Generate _Directory of Images..." +msgstr "Genera _cartella di immagini..." + +#: ../src/vikwindow.c:4856 +msgid "Generate _Directory of Images" +msgstr "" + +#: ../src/vikwindow.c:4857 +msgid "_Print..." +msgstr "Stam_pa" + +#: ../src/vikwindow.c:4857 +msgid "Print maps" +msgstr "Stampa mappe" + +#: ../src/vikwindow.c:4858 +msgid "E_xit" +msgstr "_Esci" + +#: ../src/vikwindow.c:4858 +msgid "Exit the program" +msgstr "Esce dal programma" + +#: ../src/vikwindow.c:4859 +msgid "Save and Exit" +msgstr "Salva ed esci" + +#: ../src/vikwindow.c:4859 +msgid "Save and Exit the program" +msgstr "Salva ed esce dal programma" + +#: ../src/vikwindow.c:4861 +msgid "Go to the Pre_vious Location" +msgstr "" + +#: ../src/vikwindow.c:4861 +msgid "Go to the previous location" +msgstr "" + +#: ../src/vikwindow.c:4862 +msgid "Go to the _Next Location" +msgstr "" + +#: ../src/vikwindow.c:4862 +msgid "Go to the next location" +msgstr "" + +#: ../src/vikwindow.c:4863 +msgid "Go to the _Default Location" +msgstr "Vai alla posizione pre_definita" + +#: ../src/vikwindow.c:4863 +msgid "Go to the default location" +msgstr "Va alla posizione predefinita" + +#: ../src/vikwindow.c:4864 +#, fuzzy +msgid "Go to the _Auto Location" +msgstr "Vai alla posizione pre_definita" + +#: ../src/vikwindow.c:4864 +msgid "Go to a location via automatic lookup" +msgstr "" + +#: ../src/vikwindow.c:4865 +msgid "Go to _Location..." +msgstr "Vai alla _posizione..." + +#: ../src/vikwindow.c:4865 +msgid "Go to address/place using text search" +msgstr "Va all'indirizzo/posizione usando la ricerca testuale" + +#: ../src/vikwindow.c:4866 +msgid "_Go to Lat/Lon..." +msgstr "_Vai a Lat/Lon..." + +#: ../src/vikwindow.c:4866 +msgid "Go to arbitrary lat/lon coordinate" +msgstr "Va alle coordinate lat/lon arbitrarie" + +#: ../src/vikwindow.c:4867 +msgid "Go to UTM..." +msgstr "Vai a UTM..." + +#: ../src/vikwindow.c:4867 +msgid "Go to arbitrary UTM coordinate" +msgstr "Va alle coordinate UTM arbitrarie" + +#: ../src/vikwindow.c:4868 +#, fuzzy +msgid "Go to Today" +msgstr "Vai a UTM" + +#: ../src/vikwindow.c:4868 +msgid "Go to today on the calendar" +msgstr "" + +#: ../src/vikwindow.c:4869 +msgid "_Refresh" +msgstr "" + +#: ../src/vikwindow.c:4869 +msgid "Refresh any maps displayed" +msgstr "" + +#: ../src/vikwindow.c:4870 +msgid "Set _Highlight Color..." +msgstr "Imposta il Colore di Evidenziazione (_H)..." + +#: ../src/vikwindow.c:4870 +msgid "Set Highlight Color" +msgstr "" + +#: ../src/vikwindow.c:4871 +msgid "Set Bac_kground Color..." +msgstr "Imposta colore dello s_fondo" + +#: ../src/vikwindow.c:4871 +msgid "Set Background Color" +msgstr "" + +#: ../src/vikwindow.c:4872 +msgid "Zoom _In" +msgstr "Aumenta _ingrandimento" + +#: ../src/vikwindow.c:4872 +msgid "Zoom In" +msgstr "" + +#: ../src/vikwindow.c:4873 +msgid "Zoom _Out" +msgstr "Riduci ingrandiment_o" + +#: ../src/vikwindow.c:4873 +msgid "Zoom Out" +msgstr "" + +#: ../src/vikwindow.c:4874 +msgid "Zoom _To..." +msgstr "Ingran_disci a..." + +#: ../src/vikwindow.c:4874 +msgid "Zoom To" +msgstr "" + +#: ../src/vikwindow.c:4875 +msgid "Pan _North" +msgstr "Pan _Nord" + +#: ../src/vikwindow.c:4876 +msgid "Pan _East" +msgstr "Pan _Est" + +#: ../src/vikwindow.c:4877 +msgid "Pan _South" +msgstr "Pan _Sud" + +#: ../src/vikwindow.c:4878 +msgid "Pan _West" +msgstr "Pan Ovest (_W)" + +#: ../src/vikwindow.c:4879 +msgid "Background _Jobs" +msgstr "_Lavori in background" + +#: ../src/vikwindow.c:4879 +msgid "Background Jobs" +msgstr "" + +#: ../src/vikwindow.c:4881 +msgid "Cu_t" +msgstr "_Taglia" + +#: ../src/vikwindow.c:4885 +msgid "Delete All" +msgstr "Elimina tutto" + +#: ../src/vikwindow.c:4886 +msgid "Copy Centre _Location" +msgstr "" + +#: ../src/vikwindow.c:4887 +msgid "_Flush Map Cache" +msgstr "Aggiorna la cache della mappe" + +#: ../src/vikwindow.c:4888 +msgid "_Set the Default Location" +msgstr "Imposta la posizione p_redefinita" + +#: ../src/vikwindow.c:4888 +msgid "Set the Default Location to the current position" +msgstr "Imposta la posizione predefinita alla posizione corrente" + +#: ../src/vikwindow.c:4889 +msgid "_Preferences" +msgstr "_Preferenze" + +#: ../src/vikwindow.c:4889 +msgid "Program Preferences" +msgstr "" + +#: ../src/vikwindow.c:4890 +msgid "_Layer Defaults" +msgstr "" + +#: ../src/vikwindow.c:4891 +msgid "_Properties" +msgstr "_Proprietà" + +#: ../src/vikwindow.c:4893 +msgid "Help" +msgstr "" + +#: ../src/vikwindow.c:4894 +msgid "_About" +msgstr "Inform_azioni" + +#: ../src/vikwindow.c:4894 +msgid "About" +msgstr "" + +#: ../src/vikwindow.c:4903 +msgid "_KML..." +msgstr "" + +#: ../src/vikwindow.c:4903 +msgid "Export as KML" +msgstr "" + +#: ../src/vikwindow.c:4904 +msgid "Transfer data from a GPS device" +msgstr "Trasferisce i dati da un dispositivo GPS" + +#: ../src/vikwindow.c:4905 +msgid "Import file via GPSBabel converter" +msgstr "Importa il file con il convertitore GPSBabel" + +#: ../src/vikwindow.c:4909 +msgid "Import Geo_JSON File..." +msgstr "" + +#: ../src/vikwindow.c:4909 +msgid "Import GeoJSON file" +msgstr "" + +#: ../src/vikwindow.c:4914 +msgid "_UTM Mode" +msgstr "Modalità _UTM" + +#: ../src/vikwindow.c:4915 +msgid "_Expedia Mode" +msgstr "Modalità _Expedia" + +#: ../src/vikwindow.c:4916 +msgid "_Mercator Mode" +msgstr "Modalità _Mercatore" + +#: ../src/vikwindow.c:4917 +msgid "Lat_/Lon Mode" +msgstr "Modalità Lat_/Lon" + +#: ../src/vikwindow.c:4921 +msgid "Show _Scale" +msgstr "Mostra _scala" + +#: ../src/vikwindow.c:4921 +msgid "Show Scale" +msgstr "Mostra la scala" + +#: ../src/vikwindow.c:4922 +msgid "Show _Center Mark" +msgstr "Mostra il Marcatore _Centrale" + +#: ../src/vikwindow.c:4922 +msgid "Show Center Mark" +msgstr "Mostra segnale centrale" + +#: ../src/vikwindow.c:4923 +msgid "Show _Highlight" +msgstr "Mostra Evidenziazione (_H)" + +#: ../src/vikwindow.c:4923 +msgid "Show Highlight" +msgstr "Mostra Evidenziazione" + +#: ../src/vikwindow.c:4924 +msgid "_Full Screen" +msgstr "Sc_hermo intero" + +#: ../src/vikwindow.c:4924 +msgid "Activate full screen mode" +msgstr "Attiva la modalità a schermo intero" + +#: ../src/vikwindow.c:4925 +msgid "Show Side _Panel" +msgstr "Mostra _pannello laterale" + +#: ../src/vikwindow.c:4925 +msgid "Show Side Panel" +msgstr "Mostra il pannello laterale" + +#: ../src/vikwindow.c:4926 +msgid "Show Status_bar" +msgstr "Mostra _barra di stato" + +#: ../src/vikwindow.c:4926 +msgid "Show Statusbar" +msgstr "Mostra la barra di stato" + +#: ../src/vikwindow.c:4927 +msgid "Show _Toolbar" +msgstr "Mostra barra s_trumenti" + +#: ../src/vikwindow.c:4927 +msgid "Show Toolbar" +msgstr "Mostra la barra degli strumenti" + +#: ../src/vikwindow.c:4928 +msgid "Show _Menu" +msgstr "Mostra _menu" + +#: ../src/vikwindow.c:4928 +msgid "Show Menu" +msgstr "Mostra il menu" + +#: ../src/vikwindow.c:4929 +#, fuzzy +msgid "Show Side Panel B_uttons" +msgstr "Mostra il pannello laterale" + +#: ../src/vikwindow.c:4929 +#, fuzzy +msgid "Show Side Panel Buttons" +msgstr "Mostra il pannello laterale" + +#: ../src/vikwindow.c:4930 +#, fuzzy +msgid "Show Side Panel Ca_lendar" +msgstr "Mostra il pannello laterale" + +#: ../src/vikwindow.c:4930 +#, fuzzy +msgid "Show Side Panel Calendar" +msgstr "Mostra il pannello laterale" + +#: ../src/vikwindow.c:5064 +#, c-format +msgid "New _%s Layer" +msgstr "" + +#: ../src/vikwindow.c:5114 +#, fuzzy +msgid "..." +msgstr "Aggiungi..." + +#: ../src/viking.desktop.in.h:2 +msgid "GPS Data Manager" +msgstr "Gestore dati GPS" + +#: ../src/viking.desktop.in.h:3 +msgid "Map Based GPS Data Manager (live data capable)." +msgstr "Gestore dati GPS basato su mappa (dati in tempo reale)." + +#: ../src/libjpeg/jpeg-data.c:205 +msgid "Data does not follow JPEG specification." +msgstr "Il dato non segue la specifica JPEG." + +#: ../src/libjpeg/jpeg-data.c:302 +#, c-format +msgid "Path '%s' invalid." +msgstr "Percorso '%s' non valido." + +#: ../src/libjpeg/jpeg-data.c:320 +#, c-format +msgid "Could not read '%s'." +msgstr "Impossibile leggere '%s'." + +#~ msgid "Polygonzied Layer" +#~ msgstr "Strato a poligoni" + +#~ msgid "Email:" +#~ msgstr "Email:" + +#~ msgid "I don't know that place. Do you want another goto?" +#~ msgstr "Non conosco quel posto. Vuoi andare in un altro?" + +#~ msgid "Error: couldn't find gpsbabel." +#~ msgstr "Errore: impossibile trovare gpsbabel." + +#~ msgid "Create Track" +#~ msgstr "Crea il Tracciato" diff --git a/po/ja.po b/po/ja.po new file mode 100644 index 0000000..60f3a2f --- /dev/null +++ b/po/ja.po @@ -0,0 +1,6077 @@ +# Japanese translation for viking +# Copyright (c) 2008 Rosetta Contributors and Canonical Ltd 2008 +# This file is distributed under the same license as the viking package. +# FIRST AUTHOR , 2008. +# +msgid "" +msgstr "" +"Project-Id-Version: viking\n" +"Report-Msgid-Bugs-To: \n" +"POT-Creation-Date: 2019-01-19 12:53+0000\n" +"PO-Revision-Date: 2010-09-07 09:24+0000\n" +"Last-Translator: Guilhem Bonnefille \n" +"Language-Team: Japanese \n" +"Language: ja\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" +"X-Launchpad-Export-Date: 2018-12-21 17:32+0000\n" +"X-Generator: Launchpad (build 18847)\n" + +#: ../src/acquire.c:106 ../src/vikgpslayer.c:1367 +msgid "Done." +msgstr "完了。" + +#: ../src/acquire.c:115 +msgid "No data." +msgstr "" + +#: ../src/acquire.c:167 ../src/acquire.c:415 +msgid "Error: acquisition failed." +msgstr "エラー: 取得失敗。" + +#: ../src/acquire.c:339 +msgid "Working..." +msgstr "処理中..." + +#. This shouldn't happen... +#: ../src/acquire.c:406 +msgid "" +"Unable to create command\n" +"Acquire method failed." +msgstr "" + +#: ../src/acquire.c:513 +msgid "_Filter" +msgstr "" + +#: ../src/acquire.c:528 +#, c-format +msgid "Filter with %s" +msgstr "" + +#: ../src/acquire.c:545 +msgid "Filter" +msgstr "" + +#: ../src/babel.c:640 +msgid "GPSBabel:" +msgstr "" + +#: ../src/babel.c:641 +msgid "" +"Allow setting the specific instance of GPSBabel. You must restart Viking for " +"this value to take effect." +msgstr "" + +#: ../src/babel_ui.c:79 +msgid "Select a file format" +msgstr "" + +#: ../src/babel_ui.c:144 ../src/viktrwlayer.c:531 ../src/viktrwlayer.c:2882 +msgid "Tracks" +msgstr "" + +#: ../src/babel_ui.c:149 ../src/viktrwlayer.c:2892 +msgid "Routes" +msgstr "" + +#. ***** PARAMETERS ***** +#: ../src/babel_ui.c:154 ../src/viktrwlayer.c:531 ../src/viktrwlayer.c:2887 +msgid "Waypoints" +msgstr "" + +#: ../src/background.c:64 +#, c-format +msgid "%d items" +msgstr "" + +#: ../src/background.c:287 +msgid "Threads:" +msgstr "" + +#: ../src/background.c:288 +msgid "" +"Number of threads to use for Mapnik tasks. You need to restart Viking for a " +"change to this value to be used" +msgstr "" + +#: ../src/background.c:361 +msgid "Job" +msgstr "ジョブ" + +#: ../src/background.c:365 +msgid "Progress" +msgstr "進捗状況" + +#: ../src/background.c:373 +msgid "Viking Background Jobs" +msgstr "Viking バックグラウンドジョブ" + +#: ../src/bing.c:42 +msgid "Bing Aerial" +msgstr "" + +#: ../src/bing.c:48 +msgid "Bing" +msgstr "" + +#. VIK_GTK_WINDOW_FROM_WIDGET(vp) +#: ../src/bingmapsource.c:514 +msgid "Bing attribution Loading" +msgstr "" + +#: ../src/clipboard.c:95 +msgid "paste failed" +msgstr "貼り付け失敗" + +#: ../src/clipboard.c:105 +msgid "wrong clipboard data size" +msgstr "" + +#: ../src/clipboard.c:124 +#, c-format +msgid "" +"The clipboard contains sublayer data for %s layers. You must select a layer " +"of this type to paste the clipboard data." +msgstr "" + +#: ../src/clipboard.c:264 +msgid "" +"In order to paste a waypoint, please select an appropriate layer to paste " +"into." +msgstr "" + +#: ../src/dialog.c:60 +msgid "Go to Lat/Lon" +msgstr "" + +#: ../src/dialog.c:69 ../src/viktrwlayer_wpwin.c:173 +msgid "Latitude:" +msgstr "緯度:" + +#: ../src/dialog.c:72 ../src/viktrwlayer_wpwin.c:177 +msgid "Longitude:" +msgstr "経度:" + +#: ../src/dialog.c:102 +msgid "Go to UTM" +msgstr "" + +#: ../src/dialog.c:114 +msgid "Northing:" +msgstr "" + +#: ../src/dialog.c:117 +msgid "Easting:" +msgstr "" + +#: ../src/dialog.c:121 ../src/vikgeoreflayer.c:902 +msgid "Zone:" +msgstr "" + +#: ../src/dialog.c:124 ../src/vikgeoreflayer.c:904 +msgid "Letter:" +msgstr "レター:" + +#: ../src/dialog.c:246 ../src/geonamessearch.c:238 +#: ../src/datasource_osm_my_traces.c:505 +msgid "Nothing was selected" +msgstr "" + +#: ../src/dialog.c:254 +msgid "Add Route" +msgstr "" + +#: ../src/dialog.c:254 +msgid "Add Track" +msgstr "" + +#: ../src/dialog.c:262 +msgid "Route Name:" +msgstr "" + +#: ../src/dialog.c:262 +msgid "Track Name:" +msgstr "" + +#: ../src/dialog.c:282 +msgid "Please enter a name for the track." +msgstr "" + +#: ../src/dialog.c:311 +msgid "Today" +msgstr "" + +#: ../src/dialog.c:393 +msgid "Zoom Factors..." +msgstr "" + +#: ../src/dialog.c:407 +msgid "Zoom factor (in meters per pixel):" +msgstr "" + +#: ../src/dialog.c:408 +msgid "X (easting): " +msgstr "" + +#: ../src/dialog.c:409 +msgid "Y (northing): " +msgstr "" + +#: ../src/dialog.c:414 +msgid "X and Y zoom factors must be equal" +msgstr "" + +#: ../src/dialog.c:469 +msgid "1 min" +msgstr "1分" + +#: ../src/dialog.c:470 +msgid "1 hour" +msgstr "1 時間" + +#: ../src/dialog.c:471 +msgid "1 day" +msgstr "1日" + +#: ../src/dialog.c:472 +msgid "Custom (in minutes):" +msgstr "" + +#: ../src/dialog.c:608 +#, c-format +msgid "" +"2003-2008, Evan Battaglia\n" +"2008-%s, Viking's contributors" +msgstr "" + +#: ../src/dialog.c:609 +msgid "GPS Data and Topo Analyzer, Explorer, and Manager." +msgstr "" + +#: ../src/dialog.c:610 +msgid "" +"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.\n" +"\n" +"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.\n" +"\n" +"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., 59 Temple " +"Place, Suite 330, Boston, MA 02111-1307, USA" +msgstr "" + +#: ../src/dialog.c:703 +msgid "Translation is coordinated on http://launchpad.net/viking" +msgstr "" + +#: ../src/dialog.c:713 +msgid "Download along track" +msgstr "" + +#: ../src/dialog.c:720 +msgid "Map type:" +msgstr "マップタイプ:" + +#: ../src/dialog.c:726 +msgid "Zoom level:" +msgstr "ズームレベル:" + +#: ../src/dialog.c:766 +#, c-format +msgid "The map data is licensed: %s." +msgstr "" + +#: ../src/dialog.c:769 +#, c-format +msgid "" +"The data provided by '%s' are licensed under the following license: " +"%s." +msgstr "" + +#: ../src/dialog.c:773 +msgid "Open license" +msgstr "" + +#: ../src/expedia.c:54 +msgid "Expedia Street Maps" +msgstr "" + +#: ../src/expedia.c:82 +msgid "Invalid expedia altitude" +msgstr "" + +#: ../src/expedia.c:113 +#, c-format +msgid "" +"Couldn't open EXPEDIA image file (right after successful download! Please " +"report and delete image file!): %s" +msgstr "" + +#: ../src/expedia.c:126 +#, c-format +msgid "" +"Couldn't save EXPEDIA image file (right after successful download! Please " +"report and delete image file!): %s" +msgstr "" + +#: ../src/geonamessearch.c:115 +msgid "Search" +msgstr "検索" + +#: ../src/geonamessearch.c:117 +msgid "No entries found!" +msgstr "" + +#. NB could allow columns to be shifted around by doing this after each new +#. gtk_tree_view_column_set_reorderable ( column, TRUE ); +#. However I don't think is that useful, so I haven't put it in +#: ../src/geonamessearch.c:171 ../src/datasource_osm_my_traces.c:422 +#: ../src/viktrwlayer_tracklist.c:621 ../src/viktrwlayer_waypointlist.c:618 +msgid "Name" +msgstr "" + +#: ../src/geonamessearch.c:176 +msgid "Feature" +msgstr "" + +#: ../src/geonamessearch.c:181 ../src/datasource_osm_my_traces.c:437 +msgid "Lat/Lon" +msgstr "" + +#: ../src/geonamessearch.c:264 ../src/googlesearch.c:101 ../src/vikgoto.c:430 +msgid "couldn't map temp file" +msgstr "" + +#: ../src/geonamessearch.c:459 +msgid "Select articles" +msgstr "" + +#: ../src/geonamessearch.c:459 +msgid "Select the articles you want to add." +msgstr "" + +#: ../src/geonamessearch.c:475 +msgid "city" +msgstr "" + +#: ../src/geonamessearch.c:477 +msgid "edu" +msgstr "" + +#: ../src/geonamessearch.c:479 +msgid "airport" +msgstr "" + +#: ../src/geonamessearch.c:481 +msgid "mountain" +msgstr "" + +#: ../src/geonamessearch.c:483 +msgid "forest" +msgstr "" + +#: ../src/geonamessearch.c:485 +msgid "church" +msgstr "" + +#: ../src/geojson.c:74 +#, c-format +msgid "%s command failed: %s" +msgstr "" + +#: ../src/geojson.c:146 ../src/gpx.c:1317 +#, c-format +msgid "failed to open temporary file: %s" +msgstr "" + +#: ../src/globals.c:67 +msgid "DDD" +msgstr "" + +#: ../src/globals.c:67 +msgid "DMM" +msgstr "" + +#: ../src/globals.c:67 +msgid "DMS" +msgstr "" + +#: ../src/globals.c:67 +msgid "Raw" +msgstr "" + +#: ../src/globals.c:68 +msgid "Kilometres" +msgstr "" + +#: ../src/globals.c:68 +msgid "Miles" +msgstr "" + +#: ../src/globals.c:68 +msgid "Nautical Miles" +msgstr "" + +#. VIK_UNITS_SPEED_KILOMETRES_PER_HOUR: +#: ../src/globals.c:69 ../src/viktrwlayer_tracklist.c:655 ../src/vikutils.c:100 +msgid "km/h" +msgstr "" + +#: ../src/globals.c:69 ../src/viktrwlayer_tracklist.c:656 ../src/vikutils.c:78 +msgid "mph" +msgstr "" + +#. VIK_UNITS_SPEED_METRES_PER_SECOND: +#: ../src/globals.c:69 ../src/viktrwlayer_tracklist.c:663 ../src/vikutils.c:81 +msgid "m/s" +msgstr "" + +#: ../src/globals.c:69 ../src/viktrwlayer_tracklist.c:657 ../src/vikutils.c:84 +msgid "knots" +msgstr "" + +#: ../src/globals.c:69 ../src/viktrwlayer_tracklist.c:658 ../src/vikutils.c:87 +msgid "s/km" +msgstr "" + +#: ../src/globals.c:69 ../src/viktrwlayer_tracklist.c:659 ../src/vikutils.c:90 +msgid "min/km" +msgstr "" + +#: ../src/globals.c:69 +msgid "s/mi" +msgstr "" + +#: ../src/globals.c:69 ../src/viktrwlayer_tracklist.c:661 ../src/vikutils.c:96 +msgid "min/mi" +msgstr "" + +#: ../src/globals.c:70 +msgid "Metres" +msgstr "" + +#: ../src/globals.c:70 +msgid "Feet" +msgstr "" + +#: ../src/globals.c:73 +msgid "Locale" +msgstr "" + +#: ../src/globals.c:73 +msgid "World" +msgstr "" + +#: ../src/globals.c:73 +msgid "UTC" +msgstr "" + +#: ../src/globals.c:76 +msgid "Degree format:" +msgstr "" + +#: ../src/globals.c:77 +msgid "Distance units:" +msgstr "" + +#: ../src/globals.c:78 +msgid "Speed units:" +msgstr "" + +#: ../src/globals.c:79 +msgid "Height units:" +msgstr "" + +#: ../src/globals.c:80 +msgid "Use large waypoint icons:" +msgstr "" + +#: ../src/globals.c:81 +msgid "Default latitude:" +msgstr "" + +#: ../src/globals.c:82 +msgid "Default longitude:" +msgstr "" + +#: ../src/globals.c:83 +msgid "Time Display:" +msgstr "" + +#: ../src/globals.c:84 +msgid "" +"Display times according to the reference frame. Locale is the user's system " +"setting. World is relative to the location of the object." +msgstr "" + +#: ../src/globals.c:90 +msgid "Alphabetical" +msgstr "" + +#: ../src/globals.c:90 ../src/datasource_osm_my_traces.c:432 +msgid "Time" +msgstr "" + +#: ../src/globals.c:90 +msgid "Creation" +msgstr "" + +#: ../src/globals.c:91 +msgid "Title Case" +msgstr "" + +#: ../src/globals.c:91 +msgid "Lowercase" +msgstr "" + +#: ../src/globals.c:94 +msgid "KML File Export Units:" +msgstr "" + +#: ../src/globals.c:95 +msgid "GPX Track Order:" +msgstr "" + +#: ../src/globals.c:96 +msgid "GPX Waypoint Symbols:" +msgstr "" + +#: ../src/globals.c:97 +msgid "" +"Save GPX Waypoint Symbol names in the specified case. May be useful for " +"compatibility with various devices" +msgstr "" + +#: ../src/globals.c:98 +msgid "GPX Creator:" +msgstr "" + +#: ../src/globals.c:99 +msgid "" +"The creator value when writing a GPX file. Otherwise when blank a default is " +"used." +msgstr "" + +#: ../src/globals.c:104 +msgid "Image Viewer:" +msgstr "" + +#: ../src/globals.c:109 +msgid "External GPX Program 1:" +msgstr "" + +#: ../src/globals.c:110 +msgid "External GPX Program 2:" +msgstr "" + +#: ../src/globals.c:113 +msgid "Absolute" +msgstr "" + +#: ../src/globals.c:113 +msgid "Relative" +msgstr "" + +#: ../src/globals.c:117 +msgid "Save File Reference Mode:" +msgstr "" + +#: ../src/globals.c:118 +msgid "" +"When saving a Viking .vik file, this determines how the directory paths of " +"filenames are written." +msgstr "" + +#: ../src/globals.c:119 +msgid "Ask for Name before Track Creation:" +msgstr "" + +#: ../src/globals.c:120 +msgid "Show Tooltip during Track Creation:" +msgstr "" + +#: ../src/globals.c:121 +msgid "The number of recent files:" +msgstr "" + +#: ../src/globals.c:122 +msgid "" +"Only applies to new windows or on application restart. -1 means all " +"available files." +msgstr "" + +#: ../src/globals.c:123 +msgid "Open files in selected layer:" +msgstr "" + +#: ../src/globals.c:124 +msgid "Open files (but not .vik ones) into the selected TrackWaypoint layer." +msgstr "" + +#: ../src/globals.c:125 +msgid "Show calendar day names:" +msgstr "" + +#: ../src/globals.c:128 +msgid "Home Location" +msgstr "" + +#: ../src/globals.c:128 +msgid "Last Location" +msgstr "" + +#: ../src/globals.c:128 +msgid "Specified File" +msgstr "" + +#: ../src/globals.c:128 +msgid "Auto Location" +msgstr "" + +#: ../src/globals.c:131 +msgid "Restore Window Setup:" +msgstr "" + +#: ../src/globals.c:132 +msgid "Restore window size and layout" +msgstr "" + +#: ../src/globals.c:133 +msgid "Add a Default Map Layer:" +msgstr "" + +#: ../src/globals.c:134 +msgid "" +"The default map layer added is defined by the Layer Defaults. Use the menu " +"Edit->Layer Defaults->Map... to change the map type and other values." +msgstr "" + +#: ../src/globals.c:135 +msgid "Startup Method:" +msgstr "" + +#: ../src/globals.c:136 +msgid "Startup File:" +msgstr "" + +#: ../src/globals.c:137 +msgid "" +"The default file to load on startup. Only applies when the startup method is " +"set to 'Specified File'" +msgstr "" + +#: ../src/globals.c:138 +msgid "Check For New Version:" +msgstr "" + +#: ../src/globals.c:139 +msgid "Periodically check to see if a new version of Viking is available" +msgstr "" + +#. Defaults for the options are setup here +#: ../src/globals.c:176 +msgid "General" +msgstr "" + +#. New Tab +#: ../src/globals.c:204 +msgid "Startup" +msgstr "" + +#. New Tab +#: ../src/globals.c:222 +msgid "Export/External" +msgstr "" + +#. 'Advanced' Properties +#: ../src/globals.c:249 +msgid "Advanced" +msgstr "" + +#. Webtools +#: ../src/google.c:39 +msgid "Google" +msgstr "" + +#. If there is an actual description field it will overwrite this value +#: ../src/gpx.c:264 +#, c-format +msgid "Created by: %s" +msgstr "" + +#: ../src/datasource_bfilter.c:43 +msgid "Max number of points:" +msgstr "" + +#: ../src/datasource_bfilter.c:84 +msgid "Simplify All Tracks..." +msgstr "" + +#: ../src/datasource_bfilter.c:85 +msgid "Simplified Tracks" +msgstr "" + +#. { VIK_LAYER_NUM_TYPES, "compressmethod", VIK_LAYER_PARAM_UINT, VIK_LAYER_GROUP_NONE, N_("Simplify Method:"), VIK_LAYER_WIDGET_COMBOBOX, compress_method, NULL, NULL, NULL, NULL, NULL }, +#: ../src/datasource_bfilter.c:111 +msgid "Error Factor:" +msgstr "" + +#: ../src/datasource_bfilter.c:112 +msgid "" +"Specifies the maximum allowable error that may be introduced by removing a " +"single point by the crosstrack method. See the manual or GPSBabel Simplify " +"Filter documentation for more detail." +msgstr "" + +#: ../src/datasource_bfilter.c:166 +msgid "Compress Tracks..." +msgstr "" + +#: ../src/datasource_bfilter.c:167 +msgid "Compressed Tracks" +msgstr "" + +#: ../src/datasource_bfilter.c:197 ../src/datasource_bfilter.c:198 +msgid "Remove Duplicate Waypoints" +msgstr "" + +#: ../src/datasource_bfilter.c:221 +msgid "Manual filter:" +msgstr "" + +#: ../src/datasource_bfilter.c:222 +msgid "Manual filter command: e.g. 'swap'." +msgstr "" + +#: ../src/datasource_bfilter.c:233 ../src/datasource_bfilter.c:234 +msgid "Manual filter" +msgstr "" + +#: ../src/datasource_bfilter.c:262 +msgid "Waypoints Inside This" +msgstr "" + +#: ../src/datasource_bfilter.c:263 ../src/datasource_bfilter.c:292 +msgid "Polygonized Layer" +msgstr "" + +#: ../src/datasource_bfilter.c:291 +msgid "Waypoints Outside This" +msgstr "" + +#: ../src/datasource_file.c:61 +msgid "Import file with GPSBabel" +msgstr "" + +#: ../src/datasource_file.c:62 +msgid "Imported file" +msgstr "" + +#. The file selector +#: ../src/datasource_file.c:129 +msgid "File:" +msgstr "" + +#: ../src/datasource_file.c:130 +msgid "File to import" +msgstr "" + +#: ../src/datasource_file.c:137 +msgid "All files" +msgstr "" + +#. The file format selector +#: ../src/datasource_file.c:144 ../src/datasource_url.c:106 +msgid "File type:" +msgstr "" + +#: ../src/datasource_file.c:189 +#, c-format +msgid "using babel args '%s' and file '%s'" +msgstr "" + +#: ../src/datasource_gc.c:67 +msgid "Download Geocaches" +msgstr "" + +#: ../src/datasource_gc.c:68 +msgid "Geocaching.com Caches" +msgstr "" + +#: ../src/datasource_gc.c:86 +msgid "geocaching.com username:" +msgstr "" + +#: ../src/datasource_gc.c:87 +msgid "geocaching.com password:" +msgstr "" + +#: ../src/datasource_gc.c:92 ../src/vikwindow.c:3502 +msgid "Geocaching" +msgstr "" + +#: ../src/datasource_gc.c:128 +#, c-format +msgid "" +"Can't find %s or %s in path! Check that you have installed it correctly." +msgstr "" + +#: ../src/datasource_gc.c:190 +msgid "Number geocaches:" +msgstr "" + +#: ../src/datasource_gc.c:192 +msgid "Centered around:" +msgstr "" + +#: ../src/datasource_gc.c:231 +msgid "Broken input - using some defaults" +msgstr "" + +#: ../src/datasource_geotag.c:51 +msgid "Create Waypoints from Geotagged Images" +msgstr "" + +#: ../src/datasource_geotag.c:52 +msgid "Geotagged Images" +msgstr "" + +#: ../src/datasource_geotag.c:102 ../src/datasource_geojson.c:93 +#: ../src/vikfileentry.c:171 ../src/vikwindow.c:3533 ../src/vikwindow.c:3610 +#: ../src/vikwindow.c:3641 ../src/vikwindow.c:4356 ../src/vikwindow.c:4649 +msgid "All" +msgstr "" + +#: ../src/datasource_geotag.c:107 ../src/vikfileentry.c:115 +#: ../src/viktrwlayer_geotag.c:637 ../src/vikwindow.c:3518 +#: ../src/vikwindow.c:4377 +msgid "JPG" +msgstr "" + +#: ../src/datasource_geotag.c:168 +#, c-format +msgid "Unable to create waypoint from %s" +msgstr "" + +#: ../src/datasource_geojson.c:46 +msgid "Acquire from GeoJSON" +msgstr "" + +#: ../src/datasource_geojson.c:47 ../src/datasource_geojson.c:98 +msgid "GeoJSON" +msgstr "" + +#: ../src/datasource_geojson.c:152 +#, c-format +msgid "Unable to import from: %s" +msgstr "" + +#: ../src/datasource_gps.c:54 +msgid "Acquire from GPS" +msgstr "" + +#: ../src/datasource_gps.c:55 +msgid "Acquired from GPS" +msgstr "" + +#: ../src/datasource_gps.c:258 +#, c-format +msgid "using cmd '%s' and file '%s'\n" +msgstr "" + +#: ../src/datasource_gps.c:353 ../src/vikgpslayer.c:966 +#, c-format +msgid "Downloading %d waypoint..." +msgid_plural "Downloading %d waypoints..." +msgstr[0] "" +msgstr[1] "" + +#: ../src/datasource_gps.c:358 ../src/vikgpslayer.c:971 +#, c-format +msgid "Downloading %d trackpoint..." +msgid_plural "Downloading %d trackpoints..." +msgstr[0] "" +msgstr[1] "" + +#: ../src/datasource_gps.c:363 ../src/vikgpslayer.c:976 +#, c-format +msgid "Downloading %d routepoint..." +msgid_plural "Downloading %d routepoints..." +msgstr[0] "" +msgstr[1] "" + +#: ../src/datasource_gps.c:386 ../src/datasource_gps.c:393 +#: ../src/datasource_gps.c:400 +#, c-format +msgid "Downloaded %d out of %d %s..." +msgstr "" + +#: ../src/datasource_gps.c:388 ../src/datasource_gps.c:395 +#: ../src/datasource_gps.c:402 +#, c-format +msgid "Downloaded %d %s." +msgstr "" + +#: ../src/datasource_gps.c:416 ../src/vikgpslayer.c:1134 +#, c-format +msgid "GPS Device: %s" +msgstr "" + +#: ../src/datasource_gps.c:428 ../src/vikgpslayer.c:1214 +msgid "Status: Working..." +msgstr "" + +#. NB gps_layer_inst_init() is performed after parameter registeration +#. thus to give the protocols some potential values use the old static list +#. TODO: find another way to use gps_layer_inst_init()? +#: ../src/datasource_gps.c:584 ../src/vikgpslayer.c:216 +msgid "GPS Protocol:" +msgstr "" + +#. List reassigned at runtime +#: ../src/datasource_gps.c:609 ../src/vikgpslayer.c:217 +msgid "Serial Port:" +msgstr "" + +#: ../src/datasource_gps.c:659 +msgid "" +"Turn Off After Transfer\n" +"(Garmin/NAViLink Only)" +msgstr "" + +#: ../src/datasource_gps.c:666 +msgid "Tracks:" +msgstr "" + +#: ../src/datasource_gps.c:673 +msgid "Routes:" +msgstr "" + +#: ../src/datasource_gps.c:680 +msgid "Waypoints:" +msgstr "" + +#: ../src/datasource_gps.c:756 ../src/vikgpslayer.c:1509 +msgid "GPS device: N/A" +msgstr "" + +#: ../src/datasource_osm.c:53 ../src/datasource_osm.c:54 +msgid "OSM traces" +msgstr "" + +#: ../src/datasource_osm.c:89 +msgid "Page number:" +msgstr "" + +#: ../src/datasource_osm_my_traces.c:59 ../src/datasource_osm_my_traces.c:60 +msgid "OSM My Traces" +msgstr "" + +#: ../src/datasource_osm_my_traces.c:106 ../src/osm-traces.c:684 +msgid "Email/username:" +msgstr "" + +#: ../src/datasource_osm_my_traces.c:111 +msgid "The email or username used to login to OSM" +msgstr "" + +#: ../src/datasource_osm_my_traces.c:113 ../src/osm-traces.c:692 +msgid "Password:" +msgstr "パスワード:" + +#: ../src/datasource_osm_my_traces.c:116 +msgid "The password used to login to OSM" +msgstr "" + +#: ../src/datasource_osm_my_traces.c:427 ../src/viktrwlayer.c:689 +msgid "Description" +msgstr "" + +#: ../src/datasource_osm_my_traces.c:442 +msgid "Privacy" +msgstr "" + +#: ../src/datasource_osm_my_traces.c:449 +msgid "Within Current View" +msgstr "" + +#: ../src/datasource_osm_my_traces.c:516 +msgid "GPS Traces" +msgstr "" + +#: ../src/datasource_osm_my_traces.c:518 +msgid "None found!" +msgstr "" + +#: ../src/datasource_osm_my_traces.c:569 +msgid "Ensure the OSM access token preferences are setup." +msgstr "" + +#: ../src/datasource_osm_my_traces.c:645 +msgid "My OSM Traces" +msgstr "" + +#. Report errors to the status bar +#: ../src/datasource_osm_my_traces.c:667 +#, c-format +msgid "Unable to get trace: %s" +msgstr "" + +#: ../src/datasource_routing.c:56 ../src/datasource_routing.c:57 +msgid "Directions" +msgstr "" + +#: ../src/datasource_routing.c:90 +msgid "No routing engines with directions available" +msgstr "" + +#. Engine selector +#: ../src/datasource_routing.c:99 +msgid "Engine:" +msgstr "" + +#. From and To entries +#: ../src/datasource_routing.c:104 +msgid "From:" +msgstr "" + +#: ../src/datasource_routing.c:105 +msgid "To:" +msgstr "" + +#: ../src/datasource_url.c:48 +msgid "Acquire from URL" +msgstr "" + +#: ../src/datasource_url.c:49 +msgid "URL" +msgstr "" + +#: ../src/datasource_url.c:101 +msgid "URL:" +msgstr "" + +#. Only GPX (not using GPSbabel) +#: ../src/datasource_url.c:133 ../src/vikfileentry.c:161 +#: ../src/vikwindow.c:3513 ../src/vikwindow.c:3603 +msgid "GPX" +msgstr "" + +#: ../src/datasource_wikipedia.c:32 +msgid "Create Waypoints from Wikipedia Articles" +msgstr "" + +#: ../src/datasource_wikipedia.c:33 +msgid "Wikipedia Waypoints" +msgstr "" + +#: ../src/dem.c:66 ../src/dem.c:80 +msgid "Invalid DEM" +msgstr "" + +#: ../src/dem.c:122 +msgid "Invalid DEM header" +msgstr "" + +#: ../src/dem.c:191 ../src/dem.c:204 +msgid "Incorrect DEM Class B record: expected 1" +msgstr "" + +#: ../src/dem.c:289 ../src/download.c:176 +#, c-format +msgid "Couldn't map file %s: %s" +msgstr "" + +#: ../src/download.c:130 +msgid "Tile age (days):" +msgstr "" + +#: ../src/download.c:406 +#, c-format +msgid "Download error: %s" +msgstr "" + +#: ../src/download.c:490 +msgid "couldn't open temp file" +msgstr "" + +#: ../src/file.c:458 ../src/file.c:463 +#, c-format +msgid "Draw mode '%s' no more supported" +msgstr "" + +#: ../src/geotag_exif.c:621 +msgid "Not enough memory." +msgstr "" + +#: ../src/geotag_exif.c:639 +msgid "Setting a value for this tag is unsupported!" +msgstr "" + +#: ../src/geotag_exif.c:658 +#, c-format +msgid "Too few components specified (need %d, found %d)\n" +msgstr "" + +#: ../src/geotag_exif.c:662 +msgid "Numeric value expected\n" +msgstr "" + +#: ../src/geotag_exif.c:670 +msgid "This shouldn't happen!" +msgstr "" + +#: ../src/geotag_exif.c:740 +msgid "Not yet implemented!" +msgstr "" + +#: ../src/geotag_exif.c:753 +msgid "Warning; Too many components specified!" +msgstr "" + +#: ../src/osm-traces.c:87 +msgid "Identifiable (public w/ timestamps)" +msgstr "" + +#: ../src/osm-traces.c:88 +msgid "Trackable (private w/ timestamps)" +msgstr "" + +#: ../src/osm-traces.c:89 +msgid "Public" +msgstr "公開" + +#: ../src/osm-traces.c:90 +msgid "Private" +msgstr "" + +#: ../src/osm-traces.c:108 +msgid "Access Token:" +msgstr "" + +#: ../src/osm-traces.c:108 +msgid "Get New OSM Access Tokens" +msgstr "" + +#: ../src/osm-traces.c:109 +msgid "Access Token Key:" +msgstr "" + +#: ../src/osm-traces.c:110 +msgid "Access Token Secret:" +msgstr "" + +#: ../src/osm-traces.c:111 +msgid "OSM username:" +msgstr "" + +#: ../src/osm-traces.c:112 +msgid "OSM password:" +msgstr "" + +#. Check to really override existing values... +#: ../src/osm-traces.c:263 +msgid "Do you want to overwrite existing values?" +msgstr "" + +#: ../src/osm-traces.c:275 +msgid "Not able to generate OSM request tokens." +msgstr "" + +#: ../src/osm-traces.c:299 +msgid "" +"Waiting for authorization approval.\n" +"Ensure you have granted access at the website before continuing here." +msgstr "" + +#: ../src/osm-traces.c:315 +msgid "No Authorization." +msgstr "" + +#: ../src/osm-traces.c:354 +msgid "" +"OSM Username and Password preferences are not required anymore. You can now " +"remove them." +msgstr "" + +#. Preferences +#: ../src/osm-traces.c:379 +msgid "OpenStreetMap Traces" +msgstr "" + +#: ../src/osm-traces.c:504 +#, c-format +msgid "failed to upload data: HTTP response is %ld" +msgstr "" + +#: ../src/osm-traces.c:509 +#, c-format +msgid "curl_easy_getinfo failed: %d" +msgstr "" + +#: ../src/osm-traces.c:514 +#, c-format +msgid "curl request failed: %s" +msgstr "" + +#. Success +#: ../src/osm-traces.c:592 +msgid "Uploaded to OSM" +msgstr "" + +#: ../src/osm-traces.c:596 +msgid "" +"FAILED TO UPLOAD DATA TO OSM - Ensure the OSM access token preferences are " +"setup." +msgstr "" + +#: ../src/osm-traces.c:599 +msgid "FAILED TO UPLOAD DATA TO OSM - CURL PROBLEM" +msgstr "" + +#: ../src/osm-traces.c:602 +msgid "FAILED TO UPLOAD DATA TO OSM" +msgstr "" + +#: ../src/osm-traces.c:602 +msgid "HTTP response code" +msgstr "" + +#: ../src/osm-traces.c:610 +#, c-format +msgid "failed to unlink temporary file: %s" +msgstr "" + +#: ../src/osm-traces.c:664 +msgid "OSM upload" +msgstr "" + +#: ../src/osm-traces.c:689 +msgid "" +"The email/username used as login\n" +"Enter the email/username you use to login into www.openstreetmap.org." +"" +msgstr "" + +#: ../src/osm-traces.c:697 +msgid "" +"The password used to login\n" +"Enter the password you use to login into www.openstreetmap.org." +msgstr "" + +#: ../src/osm-traces.c:703 +msgid "File's name:" +msgstr "" + +#: ../src/osm-traces.c:713 +msgid "" +"The name of the file on OSM\n" +"This is the name of the file created on the server.This is not the " +"name of the local file." +msgstr "" + +#: ../src/osm-traces.c:717 ../src/viktrwlayer_wpwin.c:197 +#: ../src/viktrwlayer_wpwin.c:199 +msgid "Description:" +msgstr "説明:" + +#: ../src/osm-traces.c:731 +msgid "The description of the trace" +msgstr "" + +#: ../src/osm-traces.c:734 +msgid "Anonymize Times:" +msgstr "" + +#: ../src/osm-traces.c:739 +msgid "" +"Anonymize times of the trace.\n" +"You may choose to make the trace identifiable, yet mask the actual " +"real time values" +msgstr "" + +#: ../src/osm-traces.c:743 +msgid "Tags:" +msgstr "タグ:" + +#: ../src/osm-traces.c:751 +msgid "The tags associated to the trace" +msgstr "" + +#: ../src/osm-traces.c:816 +#, c-format +msgid "Uploading %s to OSM" +msgstr "" + +#: ../src/mapcache.c:67 +msgid "Map cache memory size (MB):" +msgstr "" + +#. NB Can have a couple hundred fonts loaded when using system directories +#. So ATM don't list them all - otherwise need better GUI feedback display. +#: ../src/mapnik_interface.cpp:324 +#, c-format +msgid "" +"%s %s\n" +"Plugins=%sFonts loaded=%d" +msgstr "" + +#: ../src/mapnik_interface.cpp:325 ../src/vikmapniklayer.c:278 +msgid "Mapnik" +msgstr "" + +#: ../src/print.c:51 ../src/viktrwlayer.c:572 +msgid "None" +msgstr "なし" + +#: ../src/print.c:52 +msgid "Horizontally" +msgstr "水平方向" + +#: ../src/print.c:53 +msgid "Vertically" +msgstr "垂直方向" + +#: ../src/print.c:54 +msgid "Both" +msgstr "両方" + +#: ../src/print.c:118 +msgid "Image Settings" +msgstr "画像の設定" + +#: ../src/print.c:551 +msgid "done" +msgstr "完了" + +#. Page Size +#: ../src/print.c:580 +msgid "_Adjust Page Size and Orientation" +msgstr "" + +#: ../src/print.c:596 +msgid "C_enter:" +msgstr "中央(_E):" + +#. ignore page margins +#: ../src/print.c:614 +msgid "Ignore Page _Margins" +msgstr "" + +#: ../src/print.c:633 +msgid "Image S_ize:" +msgstr "" + +#: ../src/ui_util.c:88 +#, c-format +msgid "Could not launch web browser. %s" +msgstr "" + +#: ../src/ui_util.c:101 +#, c-format +msgid "Could not create new email. %s" +msgstr "" + +#: ../src/vikcoordlayer.c:57 +msgid "Color:" +msgstr "色:" + +#: ../src/vikcoordlayer.c:58 +msgid "Minutes Width:" +msgstr "" + +#: ../src/vikcoordlayer.c:59 +msgid "Line Thickness:" +msgstr "" + +#: ../src/vikcoordlayer.c:66 +msgid "Coordinate" +msgstr "" + +#: ../src/main.c:92 +#, c-format +msgid "Ignoring Xlib error: error code %d request code %d\n" +msgstr "" + +#: ../src/main.c:111 +msgid "Enable debug output" +msgstr "" + +#: ../src/main.c:112 +msgid "Enable verbose output" +msgstr "" + +#: ../src/main.c:113 +msgid "Show version" +msgstr "" + +#: ../src/main.c:114 +msgid "Latitude in decimal degrees" +msgstr "" + +#: ../src/main.c:115 +msgid "Longitude in decimal degrees" +msgstr "" + +#: ../src/main.c:116 +msgid "Zoom Level (OSM). Value can be 0 - 22" +msgstr "" + +#: ../src/main.c:117 +msgid "Add a map layer by id value. Use 0 for the default map." +msgstr "" + +#: ../src/main.c:160 +#, c-format +msgid "" +"%s %s\n" +"Copyright (c) 2003-2008 Evan Battaglia\n" +"Copyright (c) 2008-%s Viking's contributors\n" +msgstr "" + +#: ../src/osm.c:50 +msgid "OpenStreetMap (Mapnik)" +msgstr "" + +#: ../src/osm.c:65 +msgid "OpenStreetMap (Cycle)" +msgstr "" + +#: ../src/osm.c:79 +msgid "OpenStreetMap (Transport)" +msgstr "" + +#: ../src/osm.c:95 +msgid "OpenStreetMap (Humanitarian)" +msgstr "" + +#: ../src/osm.c:111 +msgid "On Disk OSM Tile Format" +msgstr "" + +#: ../src/osm.c:121 +msgid "MBTiles File" +msgstr "" + +#: ../src/osm.c:132 +msgid "OSM Metatiles" +msgstr "" + +#: ../src/osm.c:146 +msgid "Mapbox Outdoors" +msgstr "" + +#: ../src/osm.c:153 +msgid "Mapbox Specific" +msgstr "" + +#: ../src/osm.c:170 +msgid "OSM (view)" +msgstr "" + +#: ../src/osm.c:174 +msgid "OSM (edit)" +msgstr "" + +#. Note the use of positional parameters +#: ../src/osm.c:179 +msgid "OSM (query)" +msgstr "" + +#: ../src/osm.c:183 +msgid "OSM (render)" +msgstr "" + +#. Example: http://127.0.0.1:8111/load_and_zoom?left=8.19&right=8.20&top=48.605&bottom=48.590&select=node413602999 +#. JOSM or merkaartor must already be running with remote interface enabled +#: ../src/osm.c:190 +msgid "Local port 8111 (eg JOSM)" +msgstr "" + +#: ../src/osm.c:195 +msgid "Geofabrik Map Compare" +msgstr "" + +#: ../src/osm.c:203 +msgid "OpenStreetMap Notes" +msgstr "" + +#. Not really OSM but can't be bothered to create somewhere else to put it... +#: ../src/osm.c:221 +msgid "Wikimedia Toolserver GeoHack" +msgstr "" + +#: ../src/preferences.c:195 +msgid "Preferences" +msgstr "" + +#: ../src/toolbar.c:91 ../src/toolbar.c:92 +msgid "System Default" +msgstr "" + +#: ../src/toolbar.c:91 ../src/viktrwlayer.c:563 +msgid "Small" +msgstr "" + +#: ../src/toolbar.c:91 ../src/viktrwlayer.c:564 +msgid "Medium" +msgstr "" + +#: ../src/toolbar.c:91 ../src/viktrwlayer.c:565 +msgid "Large" +msgstr "" + +#: ../src/toolbar.c:92 +msgid "Icons Only" +msgstr "" + +#: ../src/toolbar.c:92 +msgid "Text Only" +msgstr "" + +#: ../src/toolbar.c:92 +msgid "Icons and Text" +msgstr "" + +#: ../src/toolbar.c:106 +msgid "Append to Menu:" +msgstr "" + +#: ../src/toolbar.c:107 +msgid "Pack the toolbar to the main menu to save vertical space" +msgstr "" + +#: ../src/toolbar.c:108 +msgid "Icon Size:" +msgstr "" + +#: ../src/toolbar.c:110 +msgid "Icon Style:" +msgstr "" + +#: ../src/toolbar.c:112 +msgid "Customize:" +msgstr "" + +#: ../src/toolbar.c:112 +msgid "Customize Buttons" +msgstr "" + +#. Preferences +#: ../src/toolbar.c:145 +msgid "Toolbar" +msgstr "" + +#: ../src/toolbar.c:312 +msgid "_Customize" +msgstr "" + +#: ../src/toolbar.c:641 +msgid "Separator" +msgstr "" + +#: ../src/toolbar.c:642 +msgid "--- Separator ---" +msgstr "" + +#: ../src/toolbar.c:1007 +msgid "Customize Toolbar" +msgstr "" + +#: ../src/toolbar.c:1028 +msgid "" +"Select items to be displayed on the toolbar. Items can be reordered by drag " +"and drop." +msgstr "" + +#: ../src/toolbar.c:1044 +msgid "Available Items" +msgstr "" + +#: ../src/toolbar.c:1065 +msgid "Displayed Items" +msgstr "" + +#: ../src/viklayer_defaults.c:232 +#, c-format +msgid "Could not open file: %s" +msgstr "" + +#: ../src/viklayer_defaults.c:304 +msgid "Layer Defaults" +msgstr "" + +#: ../src/uibuilder.c:196 +msgid "Take care that this password will be stored clearly in a plain file." +msgstr "" + +#: ../src/uibuilder.c:628 ../src/viktrwlayer_export.c:188 +#: ../src/viktrwlayer_export.c:304 ../src/vikwindow.c:3666 +#: ../src/vikwindow.c:4408 +#, c-format +msgid "The file \"%s\" exists, do you wish to overwrite it?" +msgstr "" + +#: ../src/vikaggregatelayer.c:41 +msgid "Aggregate" +msgstr "" + +#: ../src/vikaggregatelayer.c:528 ../src/viktrwlayer.c:11700 +#, c-format +msgid "%s: Waypoint List" +msgstr "" + +#: ../src/vikaggregatelayer.c:570 +msgid "Search by Date" +msgstr "" + +#: ../src/vikaggregatelayer.c:576 +msgid "No items found with the requested date." +msgstr "" + +#: ../src/vikaggregatelayer.c:615 ../src/viktrwlayer.c:11691 +#, c-format +msgid "%s: Track and Route List" +msgstr "" + +#: ../src/vikaggregatelayer.c:681 ../src/viktrwlayer.c:8346 +#: ../src/viktrwlayer.c:8417 ../src/viktrwlayer.c:8494 +msgid "_Visibility" +msgstr "" + +#: ../src/vikaggregatelayer.c:686 +msgid "_Show All" +msgstr "" + +#: ../src/vikaggregatelayer.c:692 +msgid "_Hide All" +msgstr "" + +#: ../src/vikaggregatelayer.c:698 ../src/viktrwlayer.c:8363 +#: ../src/viktrwlayer.c:8434 ../src/viktrwlayer.c:8511 +msgid "_Toggle" +msgstr "" + +#: ../src/vikaggregatelayer.c:705 ../src/viktrwlayer.c:8532 +msgid "_Sort" +msgstr "" + +#: ../src/vikaggregatelayer.c:711 ../src/viktrwlayer.c:8538 +msgid "Name _Ascending" +msgstr "" + +#: ../src/vikaggregatelayer.c:717 ../src/viktrwlayer.c:8544 +msgid "Name _Descending" +msgstr "" + +#: ../src/vikaggregatelayer.c:723 ../src/viktrwlayer.c:575 +#: ../src/viktrwlayer.c:8550 +msgid "Date Ascending" +msgstr "" + +#: ../src/vikaggregatelayer.c:729 ../src/viktrwlayer.c:576 +#: ../src/viktrwlayer.c:8556 +msgid "Date Descending" +msgstr "" + +#: ../src/vikaggregatelayer.c:735 ../src/viktrwlayer.c:8445 +#: ../src/viktrwlayer.c:8523 ../src/viktrwlayer.c:8595 +#: ../src/viktrwlayer_tracklist.c:296 +msgid "_Statistics" +msgstr "" + +#: ../src/vikaggregatelayer.c:740 ../src/viktrwlayer.c:4533 +msgid "Track _List..." +msgstr "" + +#: ../src/vikaggregatelayer.c:746 ../src/viktrwlayer.c:4540 +msgid "_Waypoint List..." +msgstr "" + +#: ../src/vikaggregatelayer.c:753 +msgid "Searc_h" +msgstr "" + +#: ../src/vikaggregatelayer.c:759 +msgid "By _Date..." +msgstr "" + +#: ../src/vikaggregatelayer.c:762 +msgid "Find the first item with a specified date" +msgstr "" + +#: ../src/vikaggregatelayer.c:765 +msgid "Load E_xternal Layers" +msgstr "" + +#. Could have a more complicated tooltip that numbers each type of layers, +#. but for now a simple overall count +#: ../src/vikaggregatelayer.c:1011 +#, c-format +msgid "One layer" +msgid_plural "%d layers" +msgstr[0] "" +msgstr[1] "" + +#: ../src/vikaggregatelayer.c:1014 +#, c-format +msgid "Empty" +msgstr "" + +#: ../src/vikdemlayer.c:86 +msgid "SRTM Global 90m (3 arcsec)" +msgstr "" + +#: ../src/vikdemlayer.c:94 +msgid "Absolute height" +msgstr "" + +#: ../src/vikdemlayer.c:95 +msgid "Height gradient" +msgstr "" + +#: ../src/vikdemlayer.c:120 +msgid "DEM Files:" +msgstr "" + +#: ../src/vikdemlayer.c:121 +msgid "Download Source:" +msgstr "" + +#: ../src/vikdemlayer.c:122 +msgid "Min Elev Color:" +msgstr "" + +#: ../src/vikdemlayer.c:123 ../src/viktrwlayer_wpwin.c:207 +msgid "Type:" +msgstr "" + +#: ../src/vikdemlayer.c:124 +msgid "Min Elev:" +msgstr "" + +#: ../src/vikdemlayer.c:125 +msgid "Max Elev:" +msgstr "" + +#: ../src/vikdemlayer.c:137 +msgid "_DEM Download" +msgstr "" + +#: ../src/vikdemlayer.c:137 +msgid "DEM Download" +msgstr "" + +#: ../src/vikdemlayer.c:192 +msgid "DEM" +msgstr "" + +#: ../src/vikdemlayer.c:304 +#, c-format +msgid "Number of files: %d" +msgstr "" + +#: ../src/vikdemlayer.c:446 +msgid "DEM Loading" +msgstr "" + +#: ../src/vikdemlayer.c:927 +#, c-format +msgid "No SRTM data available for %f, %f" +msgstr "" + +#: ../src/vikdemlayer.c:948 +#, c-format +msgid "DEM download failure for %f, %f" +msgstr "" + +#: ../src/vikdemlayer.c:954 +#, c-format +msgid "DEM write failure for %s" +msgstr "" + +#. Probably not over any land... +#: ../src/vikdemlayer.c:1201 +msgid "No DEM File Available" +msgstr "" + +#: ../src/vikdemlayer.c:1220 +#, c-format +msgid "" +"\n" +"Source: %s\n" +"\n" +"DEM File: %s\n" +"DEM File Timestamp: %s" +msgstr "" + +#: ../src/vikdemlayer.c:1224 +#, c-format +msgid "" +"Source: %s\n" +"\n" +"No DEM File!" +msgstr "" + +#: ../src/vikdemlayer.c:1264 +#, c-format +msgid "Downloading DEM %s" +msgstr "" + +#: ../src/vikdemlayer.c:1289 +msgid "_Show DEM File Information" +msgstr "" + +#: ../src/vikfileentry.c:72 +msgid "Browse..." +msgstr "" + +#: ../src/vikfileentry.c:103 +msgid "Choose file" +msgstr "" + +#: ../src/vikfileentry.c:120 ../src/vikwindow.c:4372 +msgid "PNG" +msgstr "" + +#: ../src/vikfileentry.c:125 +msgid "TIFF" +msgstr "" + +#: ../src/vikfileentry.c:133 +msgid "MBTiles" +msgstr "" + +#: ../src/vikfileentry.c:142 +msgid "XML" +msgstr "" + +#: ../src/vikfileentry.c:149 +msgid "MML" +msgstr "" + +#: ../src/vikfileentry.c:154 +msgid "MSS" +msgstr "" + +#: ../src/vikfilelist.c:49 +msgid "Choose file(s)" +msgstr "" + +#: ../src/vikfilelist.c:182 +msgid "Add..." +msgstr "" + +#: ../src/vikfilelist.c:183 +msgid "Delete" +msgstr "" + +#: ../src/vikgeoreflayer.c:97 +msgid "_Georef Move Map" +msgstr "" + +#: ../src/vikgeoreflayer.c:97 +msgid "Georef Move Map" +msgstr "" + +#: ../src/vikgeoreflayer.c:106 +msgid "Georef Z_oom Tool" +msgstr "" + +#: ../src/vikgeoreflayer.c:106 +msgid "Georef Zoom Tool" +msgstr "" + +#: ../src/vikgeoreflayer.c:117 +msgid "GeoRef Map" +msgstr "" + +#: ../src/vikgeoreflayer.c:214 +msgid "Auto Read World Files:" +msgstr "" + +#: ../src/vikgeoreflayer.c:215 +msgid "" +"Automatically attempt to read associated world file of a new image for a " +"GeoRef layer" +msgstr "" + +#: ../src/vikgeoreflayer.c:511 ../src/vikgeoreflayer.c:797 +#: ../src/vikmapslayer.c:1174 +#, c-format +msgid "Couldn't open image file: %s" +msgstr "" + +#: ../src/vikgeoreflayer.c:607 ../src/vikgeoreflayer.c:633 +msgid "Choose World file" +msgstr "" + +#: ../src/vikgeoreflayer.c:619 +msgid "The World file you requested could not be opened for reading." +msgstr "" + +#: ../src/vikgeoreflayer.c:621 +msgid "Unexpected end of file reading World file." +msgstr "" + +#: ../src/vikgeoreflayer.c:646 +msgid "The file you requested could not be opened for writing." +msgstr "" + +#: ../src/vikgeoreflayer.c:782 +msgid "Lower right corner values may not be consistent with upper right values" +msgstr "" + +#: ../src/vikgeoreflayer.c:806 +#, c-format +msgid "Invalid image size: %s" +msgstr "" + +#: ../src/vikgeoreflayer.c:831 ../src/viklayer.c:561 ../src/vikwindow.c:4891 +msgid "Layer Properties" +msgstr "" + +#: ../src/vikgeoreflayer.c:852 +msgid "World File Parameters:" +msgstr "" + +#: ../src/vikgeoreflayer.c:853 +msgid "Load From File..." +msgstr "" + +#: ../src/vikgeoreflayer.c:858 +msgid "Corner pixel easting:" +msgstr "" + +#: ../src/vikgeoreflayer.c:860 +msgid "the UTM \"easting\" value of the upper-left corner pixel of the map" +msgstr "" + +#: ../src/vikgeoreflayer.c:862 +msgid "Corner pixel northing:" +msgstr "" + +#: ../src/vikgeoreflayer.c:864 +msgid "the UTM \"northing\" value of the upper-left corner pixel of the map" +msgstr "" + +#: ../src/vikgeoreflayer.c:866 +msgid "X (easting) scale (mpp): " +msgstr "" + +#: ../src/vikgeoreflayer.c:867 +msgid "Y (northing) scale (mpp): " +msgstr "" + +#: ../src/vikgeoreflayer.c:870 +msgid "the scale of the map in the X direction (meters per pixel)" +msgstr "" + +#: ../src/vikgeoreflayer.c:872 +msgid "the scale of the map in the Y direction (meters per pixel)" +msgstr "" + +#: ../src/vikgeoreflayer.c:874 +msgid "Map Image:" +msgstr "" + +#: ../src/vikgeoreflayer.c:919 +msgid "Upper left latitude:" +msgstr "" + +#: ../src/vikgeoreflayer.c:921 +msgid "Upper left longitude:" +msgstr "" + +#: ../src/vikgeoreflayer.c:923 +msgid "Lower right latitude:" +msgstr "" + +#: ../src/vikgeoreflayer.c:925 +msgid "Lower right longitude:" +msgstr "" + +#: ../src/vikgeoreflayer.c:937 +msgid "Calculate MPP values from coordinates" +msgstr "" + +#: ../src/vikgeoreflayer.c:938 +msgid "" +"Enter all corner coordinates before calculating the MPP values from the " +"image size" +msgstr "" + +#: ../src/vikgeoreflayer.c:948 +msgid "UTM" +msgstr "" + +#: ../src/vikgeoreflayer.c:949 +msgid "Latitude/Longitude" +msgstr "" + +#: ../src/vikgeoreflayer.c:957 ../src/vikmapniklayer.c:82 +#: ../src/vikmapslayer.c:158 +msgid "Alpha:" +msgstr "" + +#. Now with icons +#: ../src/vikgeoreflayer.c:1062 +msgid "_Zoom to Fit Map" +msgstr "" + +#: ../src/vikgeoreflayer.c:1068 +msgid "_Goto Map Center" +msgstr "" + +#: ../src/vikgeoreflayer.c:1074 +msgid "_Export to World File" +msgstr "" + +#: ../src/vikgoto.c:98 +msgid "No goto tool available." +msgstr "" + +#: ../src/vikgoto.c:295 +msgid "goto" +msgstr "" + +#: ../src/vikgoto.c:297 +msgid "goto provider:" +msgstr "" + +#: ../src/vikgoto.c:312 +msgid "Enter address or place name:" +msgstr "" + +#: ../src/vikgoto.c:487 +msgid "Locality" +msgstr "" + +#: ../src/vikgpslayer.c:137 +msgid "Data Mode" +msgstr "" + +#: ../src/vikgpslayer.c:139 +msgid "Realtime Tracking Mode" +msgstr "" + +#: ../src/vikgpslayer.c:176 +msgid "Keep vehicle at center" +msgstr "" + +#: ../src/vikgpslayer.c:177 +msgid "Keep vehicle on screen" +msgstr "" + +#: ../src/vikgpslayer.c:178 +msgid "Disable" +msgstr "" + +#: ../src/vikgpslayer.c:218 +msgid "Download Tracks:" +msgstr "" + +#: ../src/vikgpslayer.c:219 +msgid "Upload Tracks:" +msgstr "" + +#: ../src/vikgpslayer.c:220 +msgid "Download Routes:" +msgstr "" + +#: ../src/vikgpslayer.c:221 +msgid "Upload Routes:" +msgstr "" + +#: ../src/vikgpslayer.c:222 +msgid "Download Waypoints:" +msgstr "" + +#: ../src/vikgpslayer.c:223 +msgid "Upload Waypoints:" +msgstr "" + +#: ../src/vikgpslayer.c:225 +msgid "Recording tracks" +msgstr "" + +#: ../src/vikgpslayer.c:226 +msgid "Jump to current position on start" +msgstr "" + +#: ../src/vikgpslayer.c:227 +msgid "Moving Map Method:" +msgstr "" + +#: ../src/vikgpslayer.c:228 +msgid "Update Statusbar:" +msgstr "" + +#: ../src/vikgpslayer.c:228 +msgid "Display information in the statusbar on GPS updates" +msgstr "" + +#: ../src/vikgpslayer.c:229 +msgid "Auto Connect" +msgstr "" + +#: ../src/vikgpslayer.c:229 +msgid "Automatically connect to GPSD" +msgstr "" + +#: ../src/vikgpslayer.c:230 +msgid "Gpsd Host:" +msgstr "" + +#: ../src/vikgpslayer.c:231 +msgid "Gpsd Port:" +msgstr "" + +#: ../src/vikgpslayer.c:232 +msgid "Gpsd Retry Interval (seconds):" +msgstr "" + +#: ../src/vikgpslayer.c:254 +msgid "GPS" +msgstr "" + +#: ../src/vikgpslayer.c:320 ../src/vikgpslayer.c:1504 +msgid "GPS Download" +msgstr "" + +#: ../src/vikgpslayer.c:320 ../src/vikgpslayer.c:1504 ../src/viktrwlayer.c:3993 +msgid "GPS Upload" +msgstr "" + +#: ../src/vikgpslayer.c:322 +msgid "GPS Realtime Tracking" +msgstr "" + +#: ../src/vikgpslayer.c:458 +msgid "Connected" +msgstr "" + +#: ../src/vikgpslayer.c:460 +msgid "Disconnected" +msgstr "" + +#: ../src/vikgpslayer.c:554 +msgid "Unknown GPS Protocol" +msgstr "" + +#: ../src/vikgpslayer.c:572 +msgid "Unknown serial port device" +msgstr "" + +#: ../src/vikgpslayer.c:691 +#, c-format +msgid "%s: unknown parameter" +msgstr "" + +#. Now with icons +#: ../src/vikgpslayer.c:794 +msgid "_Upload to GPS" +msgstr "" + +#: ../src/vikgpslayer.c:800 +msgid "Download from _GPS" +msgstr "" + +#: ../src/vikgpslayer.c:821 +msgid "Empty _Realtime" +msgstr "" + +#: ../src/vikgpslayer.c:828 +msgid "E_mpty Upload" +msgstr "" + +#: ../src/vikgpslayer.c:834 +msgid "_Empty Download" +msgstr "" + +#: ../src/vikgpslayer.c:840 +msgid "Empty _All" +msgstr "" + +#: ../src/vikgpslayer.c:852 +#, c-format +msgid "Unexpected number of disconnected handlers: %d" +msgstr "" + +#: ../src/vikgpslayer.c:995 +#, c-format +msgid "Uploading %d waypoint..." +msgid_plural "Uploading %d waypoints..." +msgstr[0] "" +msgstr[1] "" + +#: ../src/vikgpslayer.c:1000 +#, c-format +msgid "Uploading %d trackpoint..." +msgid_plural "Uploading %d trackpoints..." +msgstr[0] "" +msgstr[1] "" + +#: ../src/vikgpslayer.c:1005 +#, c-format +msgid "Uploading %d routepoint..." +msgid_plural "Uploading %d routepoints..." +msgstr[0] "" +msgstr[1] "" + +#: ../src/vikgpslayer.c:1034 +#, c-format +msgid "Downloaded %d out of %d waypoint..." +msgid_plural "Downloaded %d out of %d waypoints..." +msgstr[0] "" +msgstr[1] "" + +#: ../src/vikgpslayer.c:1040 +#, c-format +msgid "Downloaded %d out of %d trackpoint..." +msgid_plural "Downloaded %d out of %d trackpoints..." +msgstr[0] "" +msgstr[1] "" + +#: ../src/vikgpslayer.c:1046 +#, c-format +msgid "Downloaded %d out of %d routepoint..." +msgid_plural "Downloaded %d out of %d routepoints..." +msgstr[0] "" +msgstr[1] "" + +#: ../src/vikgpslayer.c:1056 +#, c-format +msgid "Uploaded %d out of %d waypoint..." +msgid_plural "Uploaded %d out of %d waypoints..." +msgstr[0] "" +msgstr[1] "" + +#: ../src/vikgpslayer.c:1062 +#, c-format +msgid "Uploaded %d out of %d trackpoint..." +msgid_plural "Uploaded %d out of %d trackpoints..." +msgstr[0] "" +msgstr[1] "" + +#: ../src/vikgpslayer.c:1068 +#, c-format +msgid "Uploaded %d out of %d routepoint..." +msgid_plural "Uploaded %d out of %d routepoints..." +msgstr[0] "" +msgstr[1] "" + +#: ../src/vikgpslayer.c:1079 +#, c-format +msgid "Downloaded %d waypoint" +msgid_plural "Downloaded %d waypoints" +msgstr[0] "" +msgstr[1] "" + +#: ../src/vikgpslayer.c:1085 +#, c-format +msgid "Downloaded %d trackpoint" +msgid_plural "Downloaded %d trackpoints" +msgstr[0] "" +msgstr[1] "" + +#: ../src/vikgpslayer.c:1091 +#, c-format +msgid "Downloaded %d routepoint" +msgid_plural "Downloaded %d routepoints" +msgstr[0] "" +msgstr[1] "" + +#: ../src/vikgpslayer.c:1101 +#, c-format +msgid "Uploaded %d waypoint" +msgid_plural "Uploaded %d waypoints" +msgstr[0] "" +msgstr[1] "" + +#: ../src/vikgpslayer.c:1107 +#, c-format +msgid "Uploaded %d trackpoint" +msgid_plural "Uploaded %d trackpoints" +msgstr[0] "" +msgstr[1] "" + +#: ../src/vikgpslayer.c:1113 +#, c-format +msgid "Uploaded %d routepoint" +msgid_plural "Uploaded %d routepoints" +msgstr[0] "" +msgstr[1] "" + +#: ../src/vikgpslayer.c:1363 +msgid "Error: No result." +msgstr "" + +#: ../src/vikgpslayer.c:1471 +msgid "Warning - GPS Upload items may overwrite each other" +msgstr "" + +#: ../src/vikgpslayer.c:1506 +msgid "Status: detecting gpsbabel" +msgstr "状態: gpsbableを探しています" + +#: ../src/vikgpslayer.c:1533 +msgid "No GPS items selected for transfer." +msgstr "" + +#: ../src/vikgpslayer.c:1546 +msgid "Could not turn off device." +msgstr "" + +#: ../src/vikgpslayer.c:1589 +msgid "Are you sure you want to delete GPS Upload data?" +msgstr "" + +#: ../src/vikgpslayer.c:1602 +msgid "Are you sure you want to delete GPS Download data?" +msgstr "" + +#: ../src/vikgpslayer.c:1616 +msgid "Are you sure you want to delete GPS Realtime data?" +msgstr "" + +#: ../src/vikgpslayer.c:1630 +msgid "Are you sure you want to delete All GPS data?" +msgstr "" + +#: ../src/vikgpslayer.c:2004 +#, c-format +msgid "" +"Failed to connect to gpsd at %s (port %s)\n" +"Should Viking keep trying (every %d seconds)?" +msgstr "" + +#: ../src/viklayerspanel.c:73 +msgid "C_ut" +msgstr "" + +#: ../src/viklayerspanel.c:74 ../src/vikwindow.c:4882 +msgid "_Copy" +msgstr "" + +#: ../src/viklayerspanel.c:75 ../src/vikwindow.c:4883 +msgid "_Paste" +msgstr "" + +#: ../src/viklayerspanel.c:76 ../src/vikwindow.c:4884 +msgid "_Delete" +msgstr "" + +#: ../src/viklayerspanel.c:154 +msgid "New Layer" +msgstr "" + +#: ../src/viklayerspanel.c:347 +msgid "Top Layer" +msgstr "" + +#: ../src/viklayerspanel.c:363 +msgid "Add new layer" +msgstr "" + +#: ../src/viklayerspanel.c:370 ../src/vikwindow.c:4884 +msgid "Remove selected layer" +msgstr "" + +#: ../src/viklayerspanel.c:377 +msgid "Move selected layer up" +msgstr "" + +#: ../src/viklayerspanel.c:384 +msgid "Move selected layer down" +msgstr "" + +#: ../src/viklayerspanel.c:391 ../src/vikwindow.c:4881 +msgid "Cut selected layer" +msgstr "" + +#: ../src/viklayerspanel.c:398 ../src/vikwindow.c:4882 +msgid "Copy selected layer" +msgstr "" + +#: ../src/viklayerspanel.c:405 ../src/vikwindow.c:4883 +msgid "" +"Paste layer into selected container layer or otherwise above selected layer" +msgstr "" + +#: ../src/viklayerspanel.c:502 +msgid "New name can not be blank." +msgstr "" + +#: ../src/viklayerspanel.c:751 +msgid "Aggregate Layers have no settable properties." +msgstr "" + +#: ../src/viklayerspanel.c:798 +msgid "You cannot cut the Top Layer." +msgstr "" + +#: ../src/viklayerspanel.c:843 +#, c-format +msgid "Are you sure you want to delete %s?" +msgstr "" + +#: ../src/viklayerspanel.c:863 +msgid "You cannot delete the Top Layer." +msgstr "" + +#: ../src/vikmapniklayer.c:78 +msgid "CSS (MML) Config File:" +msgstr "" + +#: ../src/vikmapniklayer.c:79 +msgid "CartoCSS configuration file" +msgstr "" + +#: ../src/vikmapniklayer.c:80 +msgid "XML Config File:" +msgstr "" + +#: ../src/vikmapniklayer.c:81 +msgid "Mapnik XML configuration file" +msgstr "" + +#: ../src/vikmapniklayer.c:84 +msgid "Use File Cache:" +msgstr "" + +#: ../src/vikmapniklayer.c:86 +msgid "File Cache Directory:" +msgstr "" + +#: ../src/vikmapniklayer.c:122 +msgid "_Mapnik Features" +msgstr "" + +#: ../src/vikmapniklayer.c:122 +msgid "Mapnik Features" +msgstr "" + +#: ../src/vikmapniklayer.c:140 +msgid "Mapnik Rendering" +msgstr "" + +#. Changing these values only applies before first mapnik layer is 'created' +#: ../src/vikmapniklayer.c:258 +msgid "Plugins Directory:" +msgstr "" + +#: ../src/vikmapniklayer.c:258 ../src/vikmapniklayer.c:259 +#: ../src/vikmapniklayer.c:260 ../src/vikmapniklayer.c:261 +msgid "You need to restart Viking for a change to this value to be used" +msgstr "" + +#: ../src/vikmapniklayer.c:259 +msgid "Fonts Directory:" +msgstr "" + +#: ../src/vikmapniklayer.c:260 +msgid "Recurse Fonts Directory:" +msgstr "" + +#: ../src/vikmapniklayer.c:261 +msgid "Rerender Timeout (hours):" +msgstr "" + +#. Changeable any time +#: ../src/vikmapniklayer.c:263 +msgid "CartoCSS:" +msgstr "" + +#: ../src/vikmapniklayer.c:263 +msgid "The program to convert CartoCSS files into Mapnik XML" +msgstr "" + +#: ../src/vikmapniklayer.c:506 +msgid "Running" +msgstr "" + +#: ../src/vikmapniklayer.c:525 +#, c-format +msgid "" +"Error running carto command:\n" +"%s" +msgstr "" + +#: ../src/vikmapniklayer.c:561 +msgid " completed in " +msgstr "" + +#: ../src/vikmapniklayer.c:561 +msgid "seconds" +msgstr "" + +#: ../src/vikmapniklayer.c:611 ../src/vikmapniklayer.c:979 +#, c-format +msgid "" +"Mapnik error loading configuration file:\n" +"%s" +msgstr "" + +#: ../src/vikmapniklayer.c:749 +#, c-format +msgid "Mapnik Render %d:%d:%d %s" +msgstr "" + +#: ../src/vikmapniklayer.c:840 +msgid "Mapnik Rendering must be in Mercator mode" +msgstr "" + +#: ../src/vikmapniklayer.c:997 +msgid "Mapnik Information" +msgstr "" + +#: ../src/vikmapniklayer.c:1031 +msgid "_Flush Memory Cache" +msgstr "" + +#: ../src/vikmapniklayer.c:1044 +msgid "_Run Carto Command" +msgstr "" + +#: ../src/vikmapniklayer.c:1102 ../src/vikmapslayer.c:2029 +#, c-format +msgid "Tile File Timestamp: %s" +msgstr "" + +#: ../src/vikmapniklayer.c:1105 ../src/vikmapslayer.c:2032 +msgid "Tile File Timestamp: Not Available" +msgstr "" + +#: ../src/vikmapniklayer.c:1120 +#, c-format +msgid "Rendering time %.2f seconds" +msgstr "" + +#: ../src/vikmapniklayer.c:1124 ../src/vikmapslayer.c:2042 +msgid "Tile Information" +msgstr "" + +#: ../src/vikmapniklayer.c:1145 +msgid "_Rerender Tile" +msgstr "" + +#: ../src/vikmapniklayer.c:1150 +msgid "_Info" +msgstr "" + +#. ******* MAPZOOMS ******** +#: ../src/vikmapslayer.c:96 +msgid "Use Viking Zoom Level" +msgstr "" + +#: ../src/vikmapslayer.c:146 +msgid "OSM" +msgstr "" + +#. NB mode => id - But can't break file format just to rename something better +#: ../src/vikmapslayer.c:152 +msgid "Map Type:" +msgstr "" + +#: ../src/vikmapslayer.c:153 +msgid "Maps Directory:" +msgstr "" + +#: ../src/vikmapslayer.c:154 +msgid "Cache Layout:" +msgstr "" + +#: ../src/vikmapslayer.c:155 +msgid "This determines the tile storage layout on disk" +msgstr "" + +#: ../src/vikmapslayer.c:156 +msgid "Map File:" +msgstr "" + +#: ../src/vikmapslayer.c:157 +msgid "An MBTiles file. Only applies when the map type method is 'MBTiles'" +msgstr "" + +#: ../src/vikmapslayer.c:159 +msgid "Control the Alpha value for transparency effects" +msgstr "" + +#: ../src/vikmapslayer.c:160 +msgid "Autodownload maps:" +msgstr "" + +#: ../src/vikmapslayer.c:161 +msgid "Autodownload Only Gets Missing Maps:" +msgstr "" + +#: ../src/vikmapslayer.c:162 +msgid "" +"Using this option avoids attempting to update already acquired tiles. This " +"can be useful if you want to restrict the network usage, without having to " +"resort to manual control. Only applies when 'Autodownload Maps' is on." +msgstr "" + +#: ../src/vikmapslayer.c:163 +msgid "Zoom Level:" +msgstr "" + +#: ../src/vikmapslayer.c:164 +msgid "" +"Determines the method of displaying map tiles for the current zoom level. " +"'Viking Zoom Level' uses the best matching level, otherwise setting a fixed " +"value will always use map tiles of the specified value regardless of the " +"actual zoom level." +msgstr "" + +#: ../src/vikmapslayer.c:197 +msgid "_Maps Download" +msgstr "" + +#: ../src/vikmapslayer.c:197 +msgid "Maps Download" +msgstr "" + +#: ../src/vikmapslayer.c:213 ../src/vikutils.c:895 +msgid "Map" +msgstr "" + +#: ../src/vikmapslayer.c:306 +msgid "Default map layer directory:" +msgstr "" + +#: ../src/vikmapslayer.c:306 +msgid "Choose a directory to store cached Map tiles for this layer" +msgstr "" + +#: ../src/vikmapslayer.c:436 ../src/vikmapslayer.c:633 +msgid "Unknown map type" +msgstr "" + +#: ../src/vikmapslayer.c:664 +msgid "Unknown Map Zoom" +msgstr "" + +#: ../src/vikmapslayer.c:833 +#, c-format +msgid "Failed to open MBTiles file: %s" +msgstr "" + +#: ../src/vikmapslayer.c:856 +#, c-format +msgid "" +"New map cannot be displayed in the current drawmode.\n" +"Select \"%s\" from View menu to view it." +msgstr "" + +#: ../src/vikmapslayer.c:1314 +#, c-format +msgid "" +"Cowardly refusing to draw tiles or existence of tiles beyond %d zoom out " +"factor" +msgstr "" + +#. TODO: ?? count up the number of download errors somehow... +#: ../src/vikmapslayer.c:1667 +msgid "Failed to download tile" +msgstr "" + +#: ../src/vikmapslayer.c:1673 +msgid "Unable to save tile" +msgstr "" + +#: ../src/vikmapslayer.c:1799 +#, c-format +msgid "Redownloading up to %d %s map..." +msgid_plural "Redownloading up to %d %s maps..." +msgstr[0] "" +msgstr[1] "" + +#: ../src/vikmapslayer.c:1801 +#, c-format +msgid "Redownloading %d %s map..." +msgid_plural "Redownloading %d %s maps..." +msgstr[0] "" +msgstr[1] "" + +#: ../src/vikmapslayer.c:1805 ../src/vikmapslayer.c:1890 +#, c-format +msgid "Downloading %d %s map..." +msgid_plural "Downloading %d %s maps..." +msgstr[0] "" +msgstr[1] "" + +#: ../src/vikmapslayer.c:1969 +msgid "YES" +msgstr "" + +#: ../src/vikmapslayer.c:1973 ../src/vikmapslayer.c:1977 +msgid "NO" +msgstr "" + +#. NB Also handles .jpg automatically due to pixbuf_new_from () support - although just print png for now. +#: ../src/vikmapslayer.c:1980 +#, c-format +msgid "Source: %s (%d%s%d%s%d.%s %s)" +msgstr "" + +#: ../src/vikmapslayer.c:1983 +msgid "Source: Not available" +msgstr "" + +#: ../src/vikmapslayer.c:2000 +msgid "Source: file://" +msgstr "" + +#: ../src/vikmapslayer.c:2012 +#, c-format +msgid "Source: %s" +msgstr "" + +#: ../src/vikmapslayer.c:2038 +#, c-format +msgid "Tile File: %s [Not Available]" +msgstr "" + +#: ../src/vikmapslayer.c:2086 +msgid "Redownload _Bad Map(s)" +msgstr "" + +#: ../src/vikmapslayer.c:2090 +msgid "Redownload _New Map(s)" +msgstr "" + +#: ../src/vikmapslayer.c:2094 +msgid "Redownload _All Map(s)" +msgstr "" + +#: ../src/vikmapslayer.c:2099 +msgid "_Show Tile Information" +msgstr "" + +#: ../src/vikmapslayer.c:2166 +#, c-format +msgid "" +"Wrong drawmode for this map.\n" +"Select \"%s\" from View menu and try again." +msgstr "" + +#: ../src/vikmapslayer.c:2171 +msgid "Wrong zoom level for this map." +msgstr "" + +#: ../src/vikmapslayer.c:2334 +msgid "Zoom Start:" +msgstr "" + +#: ../src/vikmapslayer.c:2341 +msgid "Zoom End:" +msgstr "" + +#: ../src/vikmapslayer.c:2347 +msgid "Download Maps Method:" +msgstr "" + +#. redownload method - needs to align with REDOWNLOAD* macro values +#: ../src/vikmapslayer.c:2419 +msgid "Missing" +msgstr "" + +#: ../src/vikmapslayer.c:2419 +msgid "Bad" +msgstr "" + +#: ../src/vikmapslayer.c:2419 +msgid "New" +msgstr "" + +#: ../src/vikmapslayer.c:2419 +msgid "Reload All" +msgstr "" + +#: ../src/vikmapslayer.c:2421 +msgid "Download for Zoom Levels" +msgstr "" + +#: ../src/vikmapslayer.c:2461 +#, c-format +msgid "" +"You are not allowed to download more than %d tiles in one go (requested %d)" +msgstr "" + +#: ../src/vikmapslayer.c:2469 +#, c-format +msgid "Do you really want to download %d tiles?" +msgstr "" + +#. Now with icons +#: ../src/vikmapslayer.c:2509 +msgid "Download _Missing Onscreen Maps" +msgstr "" + +#: ../src/vikmapslayer.c:2516 +msgid "Download _New Onscreen Maps" +msgstr "" + +#: ../src/vikmapslayer.c:2523 +msgid "Reload _All Onscreen Maps" +msgstr "" + +#: ../src/vikmapslayer.c:2529 +msgid "Download Maps in _Zoom Levels..." +msgstr "" + +#: ../src/vikmapslayer.c:2539 +msgid "_Open MBTiles Files" +msgstr "" + +#: ../src/vikmapslayer.c:2554 +msgid "Flush Map Cache" +msgstr "" + +#: ../src/vikrouting.c:54 +msgid "Default engine:" +msgstr "" + +#: ../src/vikrouting.c:68 +msgid "Routing" +msgstr "" + +#: ../src/viktreeview.c:347 +msgid "Layer Name" +msgstr "" + +#: ../src/viktreeview.c:924 +#, c-format +msgid "delete data from %s\n" +msgstr "" + +#: ../src/viktrwlayer.c:427 +msgid "Create _Waypoint" +msgstr "" + +#: ../src/viktrwlayer.c:427 +msgid "Create Waypoint" +msgstr "" + +#: ../src/viktrwlayer.c:437 +msgid "Edit _Track" +msgstr "" + +#: ../src/viktrwlayer.c:437 +msgid "Edit Track" +msgstr "" + +#: ../src/viktrwlayer.c:449 +msgid "Edit _Route" +msgstr "" + +#: ../src/viktrwlayer.c:449 +msgid "Edit Route" +msgstr "" + +#: ../src/viktrwlayer.c:460 +msgid "Route _Finder" +msgstr "" + +#: ../src/viktrwlayer.c:460 +msgid "Route Finder" +msgstr "" + +#: ../src/viktrwlayer.c:471 +msgid "Splitter" +msgstr "" + +#: ../src/viktrwlayer.c:482 +msgid "_Edit Waypoint" +msgstr "" + +#: ../src/viktrwlayer.c:482 +msgid "Edit Waypoint" +msgstr "" + +#: ../src/viktrwlayer.c:495 +msgid "Edit Trac_kpoint" +msgstr "" + +#: ../src/viktrwlayer.c:495 +msgid "Edit Trackpoint" +msgstr "" + +#. a pixbuf for this one is already made globally available +#: ../src/viktrwlayer.c:508 +msgid "Show P_icture" +msgstr "" + +#: ../src/viktrwlayer.c:508 +msgid "Show Picture" +msgstr "" + +#: ../src/viktrwlayer.c:531 +msgid "Waypoint Images" +msgstr "" + +#: ../src/viktrwlayer.c:531 +msgid "Tracks Advanced" +msgstr "" + +#: ../src/viktrwlayer.c:531 +msgid "Metadata" +msgstr "" + +#: ../src/viktrwlayer.c:531 +msgid "Filesystem" +msgstr "" + +#: ../src/viktrwlayer.c:534 +msgid "Draw by Track" +msgstr "" + +#: ../src/viktrwlayer.c:534 +msgid "Draw by Speed" +msgstr "" + +#: ../src/viktrwlayer.c:534 +msgid "All Tracks Same Color" +msgstr "" + +#: ../src/viktrwlayer.c:535 +msgid "Filled Square" +msgstr "" + +#: ../src/viktrwlayer.c:535 +msgid "Square" +msgstr "" + +#: ../src/viktrwlayer.c:535 +msgid "Circle" +msgstr "" + +#: ../src/viktrwlayer.c:535 +msgid "X" +msgstr "" + +#: ../src/viktrwlayer.c:561 +msgid "Extra Extra Small" +msgstr "" + +#: ../src/viktrwlayer.c:562 +msgid "Extra Small" +msgstr "" + +#: ../src/viktrwlayer.c:566 +msgid "Extra Large" +msgstr "" + +#: ../src/viktrwlayer.c:567 +msgid "Extra Extra Large" +msgstr "" + +#: ../src/viktrwlayer.c:573 +msgid "Name Ascending" +msgstr "" + +#: ../src/viktrwlayer.c:574 +msgid "Name Descending" +msgstr "" + +#: ../src/viktrwlayer.c:582 ../src/viktrwlayer_propwin.c:3319 +msgid "No" +msgstr "" + +#: ../src/viktrwlayer.c:583 +msgid "Yes" +msgstr "" + +#: ../src/viktrwlayer.c:584 +msgid "No write" +msgstr "" + +#: ../src/viktrwlayer.c:649 ../src/viktrwlayer.c:673 +msgid "Draw Labels" +msgstr "" + +#: ../src/viktrwlayer.c:650 +msgid "Note: the individual track controls what labels may be displayed" +msgstr "" + +#: ../src/viktrwlayer.c:651 +msgid "Track Labels Font Size:" +msgstr "" + +#: ../src/viktrwlayer.c:652 +msgid "Track Drawing Mode:" +msgstr "" + +#: ../src/viktrwlayer.c:653 +msgid "All Tracks Color:" +msgstr "" + +#: ../src/viktrwlayer.c:654 +msgid "The color used when 'All Tracks Same Color' drawing mode is selected" +msgstr "" + +#: ../src/viktrwlayer.c:655 +msgid "Draw Track Lines" +msgstr "" + +#: ../src/viktrwlayer.c:656 +msgid "Track Thickness:" +msgstr "" + +#: ../src/viktrwlayer.c:657 +msgid "Draw Track Direction" +msgstr "" + +#: ../src/viktrwlayer.c:658 +msgid "Direction Size:" +msgstr "" + +#: ../src/viktrwlayer.c:659 +msgid "Draw Trackpoints" +msgstr "" + +#: ../src/viktrwlayer.c:660 +msgid "Trackpoint Size:" +msgstr "" + +#: ../src/viktrwlayer.c:661 +msgid "Draw Elevation" +msgstr "" + +#: ../src/viktrwlayer.c:662 +msgid "Draw Elevation Height %:" +msgstr "" + +#: ../src/viktrwlayer.c:663 +msgid "Draw Stops" +msgstr "" + +#: ../src/viktrwlayer.c:664 +msgid "" +"Whether to draw a marker when trackpoints are at the same position but over " +"the minimum stop length apart in time" +msgstr "" + +#: ../src/viktrwlayer.c:665 +msgid "Min Stop Length (seconds):" +msgstr "" + +#: ../src/viktrwlayer.c:667 +msgid "Track BG Thickness:" +msgstr "" + +#: ../src/viktrwlayer.c:668 +msgid "Track Background Color" +msgstr "" + +#: ../src/viktrwlayer.c:669 +msgid "Draw by Speed Factor (%):" +msgstr "" + +#: ../src/viktrwlayer.c:670 +msgid "" +"The percentage factor away from the average speed determining the color used" +msgstr "" + +#: ../src/viktrwlayer.c:671 +msgid "Track Sort Order:" +msgstr "" + +#: ../src/viktrwlayer.c:674 +msgid "Waypoint Font Size:" +msgstr "" + +#: ../src/viktrwlayer.c:675 +msgid "Waypoint Color:" +msgstr "" + +#: ../src/viktrwlayer.c:676 +msgid "Waypoint Text:" +msgstr "" + +#: ../src/viktrwlayer.c:677 +msgid "Background:" +msgstr "" + +#: ../src/viktrwlayer.c:678 +msgid "Fake BG Color Translucency:" +msgstr "" + +#: ../src/viktrwlayer.c:679 +msgid "Waypoint marker:" +msgstr "" + +#: ../src/viktrwlayer.c:680 +msgid "Waypoint size:" +msgstr "" + +#: ../src/viktrwlayer.c:681 +msgid "Draw Waypoint Symbols:" +msgstr "" + +#: ../src/viktrwlayer.c:682 +msgid "Waypoint Sort Order:" +msgstr "" + +#: ../src/viktrwlayer.c:684 +msgid "Draw Waypoint Images" +msgstr "" + +#: ../src/viktrwlayer.c:685 +msgid "Image Size (pixels):" +msgstr "" + +#: ../src/viktrwlayer.c:686 +msgid "Image Alpha:" +msgstr "" + +#: ../src/viktrwlayer.c:687 +msgid "Image Memory Cache Size:" +msgstr "" + +#: ../src/viktrwlayer.c:690 +msgid "Author" +msgstr "" + +#: ../src/viktrwlayer.c:691 +msgid "Creation Time" +msgstr "" + +#: ../src/viktrwlayer.c:692 +msgid "Keywords" +msgstr "" + +#: ../src/viktrwlayer.c:693 +msgid "External layer:" +msgstr "" + +#: ../src/viktrwlayer.c:693 +msgid "" +"Layer data stored in the Viking file, in an external file, or in an external " +"file but changes are not written to the file (file only loaded at startup)" +msgstr "" + +#: ../src/viktrwlayer.c:694 +msgid "Save layer as:" +msgstr "" + +#: ../src/viktrwlayer.c:694 +msgid "Specify where layer should be saved. Overwrites file if it exists." +msgstr "" + +#: ../src/viktrwlayer.c:798 +msgid "TrackWaypoint" +msgstr "" + +#: ../src/viktrwlayer.c:1999 ../src/viktrwlayer_propwin.c:1469 +#: ../src/viktrwlayer_propwin.c:1471 ../src/vikutils.c:299 +#: ../src/vikutils.c:326 +msgid "miles" +msgstr "" + +#: ../src/viktrwlayer.c:2002 ../src/viktrwlayer_propwin.c:1475 +#: ../src/viktrwlayer_propwin.c:1477 ../src/vikutils.c:303 +#: ../src/vikutils.c:330 +msgid "NM" +msgstr "" + +#. VIK_UNITS_DISTANCE_KILOMETRES: +#: ../src/viktrwlayer.c:2006 ../src/viktrwlayer_propwin.c:1482 +#: ../src/viktrwlayer_propwin.c:1484 ../src/vikutils.c:308 +#: ../src/vikutils.c:335 +msgid "km" +msgstr "" + +#: ../src/viktrwlayer.c:2121 +msgid "start/end" +msgstr "" + +#: ../src/viktrwlayer.c:2133 +msgid "start" +msgstr "" + +#: ../src/viktrwlayer.c:2142 +msgid "end" +msgstr "" + +#: ../src/viktrwlayer.c:3103 +#, c-format +msgid " in %d:%02d hrs:mins" +msgstr "" + +#: ../src/viktrwlayer.c:3107 +#, c-format +msgid "" +"\n" +"%sTotal Length %.1f %s%s" +msgstr "" + +#: ../src/viktrwlayer.c:3131 +#, c-format +msgid "" +"\n" +"Total route length %.1f %s" +msgstr "" + +#: ../src/viktrwlayer.c:3136 +#, c-format +msgid "Tracks: %d - Waypoints: %d - Routes: %d%s%s" +msgstr "" + +#: ../src/viktrwlayer.c:3155 +#, c-format +msgid "Tracks: %d" +msgstr "" + +#: ../src/viktrwlayer.c:3165 +#, c-format +msgid "Routes: %d" +msgstr "" + +#: ../src/viktrwlayer.c:3195 +#, c-format +msgid "- %d:%02d hrs:mins" +msgstr "" + +#: ../src/viktrwlayer.c:3202 +#, c-format +msgid "%s%.1f km %s" +msgstr "" + +#: ../src/viktrwlayer.c:3205 +#, c-format +msgid "%s%.1f miles %s" +msgstr "" + +#: ../src/viktrwlayer.c:3208 +#, c-format +msgid "%s%.1f NM %s" +msgstr "" + +#: ../src/viktrwlayer.c:3222 +#, c-format +msgid "Waypoints: %d" +msgstr "" + +#: ../src/viktrwlayer.c:3279 +#, c-format +msgid "Wpt: Alt %dft" +msgstr "" + +#. VIK_UNITS_HEIGHT_METRES: +#: ../src/viktrwlayer.c:3283 +#, c-format +msgid "Wpt: Alt %dm" +msgstr "" + +#. Add comment if available +#: ../src/viktrwlayer.c:3298 +#, c-format +msgid "%s | %s %s | Comment: %s" +msgstr "" + +#: ../src/viktrwlayer.c:3300 +#, c-format +msgid "%s | %s %s" +msgstr "" + +#: ../src/viktrwlayer.c:3562 ../src/viktrwlayer.c:3591 +msgid "This layer has no waypoints or trackpoints." +msgstr "" + +#: ../src/viktrwlayer.c:3598 ../src/viktrwlayer.c:3607 +#: ../src/viktrwlayer.c:3616 ../src/viktrwlayer.c:3625 +#: ../src/viktrwlayer.c:3634 ../src/viktrwlayer.c:3642 +msgid "Export Layer" +msgstr "" + +#: ../src/viktrwlayer.c:3671 +msgid "Export Route as GPX" +msgstr "" + +#: ../src/viktrwlayer.c:3673 +msgid "Export Track as GPX" +msgstr "" + +#: ../src/viktrwlayer.c:3693 +msgid "Find" +msgstr "" + +#: ../src/viktrwlayer.c:3703 +msgid "Waypoint Name:" +msgstr "" + +#: ../src/viktrwlayer.c:3720 +msgid "Waypoint not found in this layer." +msgstr "" + +#: ../src/viktrwlayer.c:3989 +msgid "Can not upload invisible track." +msgstr "" + +#: ../src/viktrwlayer.c:4082 ../src/viktrwlayer.c:10512 +msgid "Track" +msgstr "" + +#: ../src/viktrwlayer.c:4107 ../src/viktrwlayer.c:10599 +msgid "Route" +msgstr "" + +#: ../src/viktrwlayer.c:4194 +msgid "Externa_l" +msgstr "" + +#: ../src/viktrwlayer.c:4216 ../src/viktrwlayer.c:8456 +#: ../src/viktrwlayer.c:8574 +msgid "_Finish Route" +msgstr "" + +#: ../src/viktrwlayer.c:4218 ../src/viktrwlayer.c:8380 +#: ../src/viktrwlayer.c:8572 +msgid "_Finish Track" +msgstr "" + +#. Now with icons +#: ../src/viktrwlayer.c:4230 +msgid "_View Layer" +msgstr "" + +#: ../src/viktrwlayer.c:4237 +msgid "V_iew" +msgstr "" + +#: ../src/viktrwlayer.c:4243 +msgid "View All _Tracks" +msgstr "" + +#: ../src/viktrwlayer.c:4248 +msgid "View All _Routes" +msgstr "" + +#: ../src/viktrwlayer.c:4253 +msgid "View All _Waypoints" +msgstr "" + +#: ../src/viktrwlayer.c:4258 +msgid "_Goto Center of Layer" +msgstr "" + +#: ../src/viktrwlayer.c:4264 ../src/viktrwlayer.c:8321 +msgid "Goto _Waypoint..." +msgstr "" + +#: ../src/viktrwlayer.c:4270 +msgid "_Export Layer" +msgstr "" + +#: ../src/viktrwlayer.c:4276 +msgid "Export as GPS_Point..." +msgstr "" + +#: ../src/viktrwlayer.c:4281 +msgid "Export as GPS_Mapper..." +msgstr "" + +#: ../src/viktrwlayer.c:4286 +msgid "Export as _GPX..." +msgstr "" + +#: ../src/viktrwlayer.c:4292 +msgid "Export as _KML..." +msgstr "" + +#: ../src/viktrwlayer.c:4299 +msgid "Export as GEO_JSON..." +msgstr "" + +#: ../src/viktrwlayer.c:4306 +msgid "Export via GPSbabel..." +msgstr "" + +#: ../src/viktrwlayer.c:4312 +#, c-format +msgid "Open with External Program_1: %s" +msgstr "" + +#: ../src/viktrwlayer.c:4319 +#, c-format +msgid "Open with External Program_2: %s" +msgstr "" + +#: ../src/viktrwlayer.c:4327 ../src/vikwindow.c:4825 +msgid "_New" +msgstr "" + +#: ../src/viktrwlayer.c:4333 +msgid "New _Waypoint..." +msgstr "" + +#: ../src/viktrwlayer.c:4339 +msgid "New _Track" +msgstr "" + +#: ../src/viktrwlayer.c:4347 +msgid "New _Route" +msgstr "" + +#: ../src/viktrwlayer.c:4356 ../src/viktrwlayer.c:8232 +#: ../src/viktrwlayer.c:9003 +msgid "Geotag _Images..." +msgstr "" + +#: ../src/viktrwlayer.c:4363 +msgid "_Acquire" +msgstr "" + +#: ../src/viktrwlayer.c:4369 ../src/vikwindow.c:4904 +msgid "From _GPS..." +msgstr "" + +#. FIXME: only add menu when at least a routing engine has support for Directions +#: ../src/viktrwlayer.c:4375 +msgid "From _Directions..." +msgstr "" + +#: ../src/viktrwlayer.c:4381 +msgid "From _OSM Traces..." +msgstr "" + +#: ../src/viktrwlayer.c:4386 +msgid "From _My OSM Traces..." +msgstr "" + +#: ../src/viktrwlayer.c:4392 ../src/vikwindow.c:4844 +msgid "From _URL..." +msgstr "" + +#: ../src/viktrwlayer.c:4399 ../src/vikwindow.c:4846 +msgid "From _Wikipedia Waypoints" +msgstr "" + +#: ../src/viktrwlayer.c:4405 +msgid "Within _Layer Bounds" +msgstr "" + +#: ../src/viktrwlayer.c:4411 +msgid "Within _Current View" +msgstr "" + +#: ../src/viktrwlayer.c:4419 +msgid "From Geo_caching..." +msgstr "" + +#: ../src/viktrwlayer.c:4426 ../src/vikwindow.c:4842 +msgid "From Geotagged _Images..." +msgstr "" + +#: ../src/viktrwlayer.c:4433 +msgid "From _File..." +msgstr "" + +#: ../src/viktrwlayer.c:4436 ../src/vikwindow.c:4905 +msgid "Import File With GPS_Babel..." +msgstr "" + +#: ../src/viktrwlayer.c:4443 ../src/viktrwlayer.c:8905 +msgid "_Upload" +msgstr "" + +#: ../src/viktrwlayer.c:4449 +msgid "Upload to _GPS..." +msgstr "" + +#: ../src/viktrwlayer.c:4456 ../src/viktrwlayer.c:8973 +msgid "Upload to _OSM..." +msgstr "" + +#: ../src/viktrwlayer.c:4464 +msgid "De_lete" +msgstr "" + +#: ../src/viktrwlayer.c:4470 +msgid "Delete All _Tracks" +msgstr "" + +#: ../src/viktrwlayer.c:4477 +msgid "Delete Tracks _From Selection..." +msgstr "" + +#: ../src/viktrwlayer.c:4484 ../src/viktrwlayer.c:8481 +msgid "Delete _All Routes" +msgstr "" + +#: ../src/viktrwlayer.c:4491 ../src/viktrwlayer.c:8487 +msgid "_Delete Routes From Selection..." +msgstr "" + +#: ../src/viktrwlayer.c:4498 +msgid "Delete All _Waypoints" +msgstr "" + +#: ../src/viktrwlayer.c:4505 +msgid "Delete Waypoints From _Selection..." +msgstr "" + +#: ../src/viktrwlayer.c:4512 ../src/viktrwlayer.c:8339 +msgid "Delete Duplicate Waypoints" +msgstr "" + +#: ../src/viktrwlayer.c:5198 +#, c-format +msgid "Are you sure you want to delete all tracks in %s?" +msgstr "" + +#: ../src/viktrwlayer.c:5211 +#, c-format +msgid "Are you sure you want to delete all routes in %s?" +msgstr "" + +#: ../src/viktrwlayer.c:5221 +#, c-format +msgid "Are you sure you want to delete all waypoints in %s?" +msgstr "" + +#: ../src/viktrwlayer.c:5238 +#, c-format +msgid "Are you sure you want to delete the waypoint \"%s\"?" +msgstr "" + +#: ../src/viktrwlayer.c:5254 +#, c-format +msgid "Are you sure you want to delete the track \"%s\"?" +msgstr "" + +#: ../src/viktrwlayer.c:5271 +#, c-format +msgid "Are you sure you want to delete the route \"%s\"?" +msgstr "" + +#: ../src/viktrwlayer.c:5527 ../src/viktrwlayer.c:6373 +msgid "" +"Converting a track to a route removes extra track data such as segments, " +"timestamps, etc...\n" +"Do you want to continue?" +msgstr "" + +#: ../src/viktrwlayer.c:5631 +msgid "No DEM layers available, thus no DEM values can be applied." +msgstr "" + +#: ../src/viktrwlayer.c:5651 ../src/viktrwlayer.c:5692 +#, c-format +msgid "%ld point adjusted" +msgid_plural "%ld points adjusted" +msgstr[0] "" +msgstr[1] "" + +#: ../src/viktrwlayer.c:5736 +#, c-format +msgid "%ld waypoint changed" +msgid_plural "%ld waypoints changed" +msgstr[0] "" +msgstr[1] "" + +#: ../src/viktrwlayer.c:5917 +#, c-format +msgid "" +"Refining a track with many points (%d) is unlikely to yield sensible " +"results. Do you want to Continue?" +msgstr "" + +#. Select engine from dialog +#: ../src/viktrwlayer.c:5925 +msgid "Refine Route with Routing Engine..." +msgstr "" + +#: ../src/viktrwlayer.c:5933 +msgid "Select routing engine" +msgstr "" + +#: ../src/viktrwlayer.c:6158 +msgid "Failed. No other tracks with timestamps in this layer found" +msgstr "" + +#: ../src/viktrwlayer.c:6160 +msgid "Failed. No other tracks without timestamps in this layer found" +msgstr "" + +#: ../src/viktrwlayer.c:6179 +msgid "Merge with..." +msgstr "" + +#: ../src/viktrwlayer.c:6180 +msgid "Select route to merge with" +msgstr "" + +#: ../src/viktrwlayer.c:6180 +msgid "Select track to merge with" +msgstr "" + +#: ../src/viktrwlayer.c:6264 ../src/viktrwlayer.c:6346 +msgid "Append Route" +msgstr "" + +#: ../src/viktrwlayer.c:6264 ../src/viktrwlayer.c:6346 +msgid "Append Track" +msgstr "" + +#: ../src/viktrwlayer.c:6265 +msgid "Select the route to append after the current route" +msgstr "" + +#: ../src/viktrwlayer.c:6266 +msgid "Select the track to append after the current track" +msgstr "" + +#: ../src/viktrwlayer.c:6347 +msgid "Select the track to append after the current route" +msgstr "" + +#: ../src/viktrwlayer.c:6348 +msgid "Select the route to append after the current track" +msgstr "" + +#: ../src/viktrwlayer.c:6414 +#, c-format +msgid "%d segment merged" +msgid_plural "%d segments merged" +msgstr[0] "" +msgstr[1] "" + +#: ../src/viktrwlayer.c:6430 +msgid "Failed. This track does not have timestamp" +msgstr "" + +#: ../src/viktrwlayer.c:6442 +msgid "Failed. No other track in this layer has timestamp" +msgstr "" + +#: ../src/viktrwlayer.c:6449 +msgid "Merge Threshold..." +msgstr "" + +#: ../src/viktrwlayer.c:6450 +msgid "Merge when time between tracks less than:" +msgstr "" + +#: ../src/viktrwlayer.c:6580 +msgid "Split Threshold..." +msgstr "" + +#: ../src/viktrwlayer.c:6581 +msgid "Split when time between trackpoints exceeds:" +msgstr "" + +#: ../src/viktrwlayer.c:6598 +#, c-format +msgid "" +"Can not split track due to trackpoints not ordered in time - such as at %s.\n" +"\n" +"Goto this trackpoint?" +msgstr "" + +#: ../src/viktrwlayer.c:6668 +msgid "Split Every Nth Point" +msgstr "" + +#: ../src/viktrwlayer.c:6669 +msgid "Split on every Nth point:" +msgstr "" + +#: ../src/viktrwlayer.c:6779 +msgid "Can not split track as it has no segments" +msgstr "" + +#: ../src/viktrwlayer.c:6861 ../src/viktrwlayer.c:6891 +#, c-format +msgid "Deleted %ld point" +msgid_plural "Deleted %ld points" +msgstr[0] "" +msgstr[1] "" + +#: ../src/viktrwlayer.c:6966 ../src/viktrwlayer.c:10989 +#: ../src/viktrwlayer_waypointlist.c:214 +#, c-format +msgid "Could not launch %s to open file." +msgstr "" + +#: ../src/viktrwlayer.c:6992 ../src/viktrwlayer.c:7113 +msgid "This track has no date information." +msgstr "" + +#: ../src/viktrwlayer.c:7006 ../src/viktrwlayer.c:7136 +msgid "This waypoint has no date information." +msgstr "" + +#: ../src/viktrwlayer.c:7030 +#, c-format +msgid "Could not launch %s" +msgstr "" + +#: ../src/viktrwlayer.c:7269 +msgid "Internal Error in vik_trw_layer_uniquify_tracks" +msgstr "" + +#: ../src/viktrwlayer.c:7374 ../src/viktrwlayer.c:7424 +#: ../src/viktrwlayer.c:7587 +msgid "" +"Multiple entries with the same name exist. This method only works with " +"unique names. Force unique names now?" +msgstr "" + +#: ../src/viktrwlayer.c:7385 +msgid "No tracks found" +msgstr "" + +#: ../src/viktrwlayer.c:7393 ../src/viktrwlayer.c:7443 +#: ../src/viktrwlayer.c:7607 +msgid "Delete Selection" +msgstr "" + +#: ../src/viktrwlayer.c:7394 +msgid "Select tracks to delete" +msgstr "" + +#: ../src/viktrwlayer.c:7435 +msgid "No routes found" +msgstr "" + +#: ../src/viktrwlayer.c:7444 +msgid "Select routes to delete" +msgstr "" + +#: ../src/viktrwlayer.c:7550 +msgid "Internal Error in vik_trw_layer_uniquify_waypoints" +msgstr "" + +#: ../src/viktrwlayer.c:7597 +msgid "No waypoints found" +msgstr "" + +#: ../src/viktrwlayer.c:7608 +msgid "Select waypoints to delete" +msgstr "" + +#: ../src/viktrwlayer.c:7691 +#, c-format +msgid "%ld waypoint deleted" +msgid_plural "%ld waypoints deleted" +msgstr[0] "" + +#: ../src/viktrwlayer.c:7697 +msgid "No duplicates found" +msgstr "" + +#: ../src/viktrwlayer.c:8028 +#, c-format +msgid "" +"A waypoint with the name \"%s\" already exists. Really rename to the same " +"name?" +msgstr "" + +#: ../src/viktrwlayer.c:8058 +#, c-format +msgid "" +"A track with the name \"%s\" already exists. Really rename to the same name?" +msgstr "" + +#: ../src/viktrwlayer.c:8095 +#, c-format +msgid "" +"A route with the name \"%s\" already exists. Really rename to the same name?" +msgstr "" + +#: ../src/viktrwlayer.c:8215 ../src/viktrwlayer.c:8602 +msgid "_Goto" +msgstr "" + +#: ../src/viktrwlayer.c:8226 +msgid "_Visit Geocache Webpage" +msgstr "" + +#: ../src/viktrwlayer.c:8235 +msgid "Geotag multiple images against this waypoint" +msgstr "" + +#: ../src/viktrwlayer.c:8245 ../src/viktrwlayer_waypointlist.c:352 +msgid "_Show Picture..." +msgstr "" + +#: ../src/viktrwlayer.c:8253 +msgid "Update Geotag on _Image" +msgstr "" + +#: ../src/viktrwlayer.c:8259 +msgid "_Update" +msgstr "" + +#: ../src/viktrwlayer.c:8264 +msgid "Update and _Keep File Timestamp" +msgstr "" + +#: ../src/viktrwlayer.c:8276 +msgid "Visit _Webpage" +msgstr "" + +#: ../src/viktrwlayer.c:8306 +msgid "_New Waypoint..." +msgstr "" + +#: ../src/viktrwlayer.c:8315 +msgid "_View All Waypoints" +msgstr "" + +#: ../src/viktrwlayer.c:8327 +msgid "Delete _All Waypoints" +msgstr "" + +#: ../src/viktrwlayer.c:8333 +msgid "_Delete Waypoints From Selection..." +msgstr "" + +#: ../src/viktrwlayer.c:8351 +msgid "_Show All Waypoints" +msgstr "" + +#: ../src/viktrwlayer.c:8357 +msgid "_Hide All Waypoints" +msgstr "" + +#: ../src/viktrwlayer.c:8369 +msgid "_List Waypoints..." +msgstr "" + +#: ../src/viktrwlayer.c:8390 +msgid "_View All Tracks" +msgstr "" + +#: ../src/viktrwlayer.c:8396 +msgid "_New Track" +msgstr "" + +#: ../src/viktrwlayer.c:8404 +msgid "Delete _All Tracks" +msgstr "" + +#: ../src/viktrwlayer.c:8410 +msgid "_Delete Tracks From Selection..." +msgstr "" + +#: ../src/viktrwlayer.c:8422 +msgid "_Show All Tracks" +msgstr "" + +#: ../src/viktrwlayer.c:8428 +msgid "_Hide All Tracks" +msgstr "" + +#: ../src/viktrwlayer.c:8439 +msgid "_List Tracks..." +msgstr "" + +#: ../src/viktrwlayer.c:8467 +msgid "_View All Routes" +msgstr "" + +#: ../src/viktrwlayer.c:8473 +msgid "_New Route" +msgstr "" + +#: ../src/viktrwlayer.c:8499 +msgid "_Show All Routes" +msgstr "" + +#: ../src/viktrwlayer.c:8505 +msgid "_Hide All Routes" +msgstr "" + +#: ../src/viktrwlayer.c:8516 +msgid "_List Routes..." +msgstr "" + +#: ../src/viktrwlayer.c:8587 +msgid "_View Track" +msgstr "" + +#: ../src/viktrwlayer.c:8589 +msgid "_View Route" +msgstr "" + +#: ../src/viktrwlayer.c:8608 +msgid "_Startpoint" +msgstr "" + +#: ../src/viktrwlayer.c:8614 +msgid "\"_Center\"" +msgstr "" + +#: ../src/viktrwlayer.c:8620 +msgid "_Endpoint" +msgstr "" + +#: ../src/viktrwlayer.c:8626 +msgid "_Highest Altitude" +msgstr "" + +#: ../src/viktrwlayer.c:8632 +msgid "_Lowest Altitude" +msgstr "" + +#: ../src/viktrwlayer.c:8640 +msgid "_Maximum Speed" +msgstr "" + +#: ../src/viktrwlayer.c:8646 +msgid "_Date" +msgstr "" + +#: ../src/viktrwlayer.c:8655 +msgid "Co_mbine" +msgstr "" + +#: ../src/viktrwlayer.c:8663 +msgid "_Merge By Time..." +msgstr "" + +#: ../src/viktrwlayer.c:8668 +msgid "Merge _Segments" +msgstr "" + +#: ../src/viktrwlayer.c:8675 +msgid "Merge _With Other Tracks..." +msgstr "" + +#: ../src/viktrwlayer.c:8682 +msgid "_Append Track..." +msgstr "" + +#: ../src/viktrwlayer.c:8684 +msgid "_Append Route..." +msgstr "" + +#: ../src/viktrwlayer.c:8690 +msgid "Append _Route..." +msgstr "" + +#: ../src/viktrwlayer.c:8692 +msgid "Append _Track..." +msgstr "" + +#: ../src/viktrwlayer.c:8699 +msgid "_Split" +msgstr "" + +#: ../src/viktrwlayer.c:8707 +msgid "_Split By Time..." +msgstr "" + +#. ATM always enable this entry - don't want to have to analyse the track before displaying the menu - to keep the menu speedy +#: ../src/viktrwlayer.c:8713 +msgid "Split Se_gments" +msgstr "" + +#: ../src/viktrwlayer.c:8719 +msgid "Split By _Number of Points..." +msgstr "" + +#: ../src/viktrwlayer.c:8724 +msgid "Split at _Trackpoint" +msgstr "" + +#: ../src/viktrwlayer.c:8732 +msgid "_Insert Points" +msgstr "" + +#: ../src/viktrwlayer.c:8738 +msgid "Insert Point _Before Selected Point" +msgstr "" + +#: ../src/viktrwlayer.c:8745 +msgid "Insert Point _After Selected Point" +msgstr "" + +#: ../src/viktrwlayer.c:8754 +msgid "Delete Poi_nts" +msgstr "" + +#: ../src/viktrwlayer.c:8760 +msgid "Delete _Selected Point" +msgstr "" + +#: ../src/viktrwlayer.c:8768 +msgid "Delete Points With The Same _Position" +msgstr "" + +#: ../src/viktrwlayer.c:8773 +msgid "Delete Points With The Same _Time" +msgstr "" + +#: ../src/viktrwlayer.c:8780 ../src/viktrwlayer.c:9029 +msgid "_Transform" +msgstr "" + +#: ../src/viktrwlayer.c:8788 ../src/viktrwlayer.c:9037 +msgid "_Apply DEM Data" +msgstr "" + +#: ../src/viktrwlayer.c:8793 ../src/viktrwlayer.c:9042 +msgid "_Overwrite" +msgstr "" + +#: ../src/viktrwlayer.c:8796 ../src/viktrwlayer.c:9045 +msgid "Overwrite any existing elevation values with DEM values" +msgstr "" + +#: ../src/viktrwlayer.c:8799 ../src/viktrwlayer.c:9048 +msgid "_Keep Existing" +msgstr "" + +#: ../src/viktrwlayer.c:8802 ../src/viktrwlayer.c:9051 +msgid "Keep existing elevation values, only attempt for missing values" +msgstr "" + +#: ../src/viktrwlayer.c:8807 +msgid "_Smooth Missing Elevation Data" +msgstr "" + +#: ../src/viktrwlayer.c:8812 +msgid "_Interpolated" +msgstr "" + +#: ../src/viktrwlayer.c:8815 +msgid "" +"Interpolate between known elevation values to derive values for the missing " +"elevations" +msgstr "" + +#: ../src/viktrwlayer.c:8818 +msgid "_Flat" +msgstr "" + +#: ../src/viktrwlayer.c:8821 +msgid "Set unknown elevation values to the last known value" +msgstr "" + +#: ../src/viktrwlayer.c:8825 +msgid "C_onvert to a Route" +msgstr "" + +#: ../src/viktrwlayer.c:8827 +msgid "C_onvert to a Track" +msgstr "" + +#: ../src/viktrwlayer.c:8835 +msgid "_Anonymize Times" +msgstr "" + +#: ../src/viktrwlayer.c:8838 +msgid "Shift timestamps to a relative offset from 1901-01-01" +msgstr "" + +#: ../src/viktrwlayer.c:8841 +msgid "_Interpolate Times" +msgstr "" + +#: ../src/viktrwlayer.c:8844 +msgid "" +"Reset trackpoint timestamps between the first and last points such that " +"track is traveled at equal speed" +msgstr "" + +#: ../src/viktrwlayer.c:8849 +msgid "_Reverse Track" +msgstr "" + +#: ../src/viktrwlayer.c:8851 +msgid "_Reverse Route" +msgstr "" + +#: ../src/viktrwlayer.c:8858 +msgid "Refine Route..." +msgstr "" + +#: ../src/viktrwlayer.c:8868 +msgid "Down_load Maps Along Track..." +msgstr "" + +#: ../src/viktrwlayer.c:8870 +msgid "Down_load Maps Along Route..." +msgstr "" + +#: ../src/viktrwlayer.c:8878 +msgid "_Export Track as GPX..." +msgstr "" + +#: ../src/viktrwlayer.c:8880 +msgid "_Export Route as GPX..." +msgstr "" + +#: ../src/viktrwlayer.c:8887 +msgid "E_xtend Track End" +msgstr "" + +#: ../src/viktrwlayer.c:8889 +msgid "E_xtend Route End" +msgstr "" + +#: ../src/viktrwlayer.c:8896 +msgid "Extend _Using Route Finder" +msgstr "" + +#: ../src/viktrwlayer.c:8911 +msgid "_Upload to GPS..." +msgstr "" + +#: ../src/viktrwlayer.c:8926 +msgid "_Diary" +msgstr "" + +#: ../src/viktrwlayer.c:8930 +msgid "Open diary program at this date" +msgstr "" + +#: ../src/viktrwlayer.c:8935 +msgid "_Astronomy" +msgstr "" + +#: ../src/viktrwlayer.c:8938 +msgid "Open astronomy program at this date and location" +msgstr "" + +#: ../src/viktrwlayer.c:8962 +msgid "_View Google Directions" +msgstr "" + +#: ../src/viktrwlayer.c:8984 +msgid "Use with _Filter" +msgstr "" + +#: ../src/viktrwlayer.c:9018 +msgid "_Edit Trackpoint" +msgstr "" + +#: ../src/viktrwlayer.c:10116 +#, c-format +msgid " - Gain %dm:Loss %dm" +msgstr "" + +#: ../src/viktrwlayer.c:10118 +#, c-format +msgid " - Gain %dft:Loss %dft" +msgstr "" + +#: ../src/viktrwlayer.c:10123 +#, c-format +msgid " - Bearing %3.1f° - Step %s" +msgstr "" + +#: ../src/viktrwlayer.c:10232 +#, c-format +msgid "Querying %s for route between (%.3f, %.3f) and (%.3f, %.3f)." +msgstr "" + +#: ../src/viktrwlayer.c:10248 +#, c-format +msgid "%s returned route between (%.3f, %.3f) and (%.3f, %.3f)." +msgstr "" + +#: ../src/viktrwlayer.c:10251 +#, c-format +msgid "Error getting route from %s." +msgstr "" + +#: ../src/viktrwlayer.c:11070 +#, c-format +msgid "Creating %d Image Thumbnails..." +msgstr "" + +#: ../src/viktrwlayer.c:11560 +msgid "No map layer in use. Create one first" +msgstr "" + +#: ../src/viktrwlayer.c:11679 +#, c-format +msgid "%s: Track List" +msgstr "" + +#: ../src/viktrwlayer.c:11681 +#, c-format +msgid "%s: Route List" +msgstr "" + +#: ../src/viktrwlayer.c:11734 +#, c-format +msgid "" +"Could not write external layer %s to %s, please fix and save before exiting " +"or data will be lost" +msgstr "" + +#: ../src/viktrwlayer.c:11782 +#, c-format +msgid "WARNING: issues encountered loading external layer %s from %s" +msgstr "" + +#: ../src/viktrwlayer_export.c:47 +msgid "Auto Device GPX Simplify:" +msgstr "" + +#: ../src/viktrwlayer_export.c:48 +msgid "" +"GPX saves to certain devices will be simplified for device compatibility." +msgstr "" + +#: ../src/viktrwlayer_export.c:125 +#, c-format +msgid "Export of GPX file simplified using point limit: %d" +msgstr "" + +#: ../src/viktrwlayer_export.c:206 ../src/viktrwlayer_export.c:323 +#: ../src/vikwindow.c:3694 +msgid "The filename you requested could not be opened for writing." +msgstr "" + +#: ../src/viktrwlayer_export.c:226 +#, c-format +msgid "Could not launch %s." +msgstr "" + +#: ../src/viktrwlayer_export.c:234 +msgid "Could not create temporary file for export." +msgstr "" + +#: ../src/viktrwlayer_export.c:268 +msgid "File format:" +msgstr "" + +#: ../src/viktrwlayer_export.c:276 +msgid "Select the file format." +msgstr "" + +#: ../src/viktrwlayer_export.c:281 +msgid "" +"Select the information to process.\n" +"Warning: the behavior of these switches is highly dependent of the file " +"format selected.\n" +"Please, refer to GPSbabel if unsure." +msgstr "" + +#: ../src/viktrwlayer_export.c:308 +msgid "You did not select a valid file format." +msgstr "" + +#: ../src/viktrwlayer_propwin.c:915 ../src/viktrwlayer_propwin.c:3381 +#: ../src/viktrwlayer_propwin.c:3417 ../src/viktrwlayer_propwin.c:3457 +#: ../src/viktrwlayer_propwin.c:3509 ../src/viktrwlayer_propwin.c:3527 +#: ../src/viktrwlayer_propwin.c:3600 ../src/viktrwlayer_propwin.c:3601 +#: ../src/viktrwlayer_propwin.c:3602 ../src/viktrwlayer_propwin.c:3611 +#: ../src/viktrwlayer_propwin.c:3612 ../src/viktrwlayer_propwin.c:3629 +#: ../src/viktrwlayer_propwin.c:3630 ../src/viktrwlayer_propwin.c:3644 +#: ../src/viktrwlayer_propwin.c:3645 ../src/viktrwlayer_propwin.c:3646 +#: ../src/viktrwlayer_propwin.c:3660 ../src/viktrwlayer_propwin.c:3661 +#: ../src/viktrwlayer_propwin.c:3662 ../src/viktrwlayer_propwin.c:3676 +#: ../src/viktrwlayer_propwin.c:3677 ../src/viktrwlayer_propwin.c:3678 +#: ../src/viktrwlayer_propwin.c:3695 ../src/viktrwlayer_propwin.c:3696 +#: ../src/viktrwlayer_analysis.c:293 +#, c-format +msgid "No Data" +msgstr "" + +#: ../src/viktrwlayer_propwin.c:960 ../src/viktrwlayer_propwin.c:1245 +#, c-format +msgid "%.1f kph" +msgstr "" + +#: ../src/viktrwlayer_propwin.c:963 ../src/viktrwlayer_propwin.c:1248 +#: ../src/viktrwlayer_analysis.c:352 +#, c-format +msgid "%.1f mph" +msgstr "" + +#: ../src/viktrwlayer_propwin.c:966 ../src/viktrwlayer_propwin.c:1251 +#, c-format +msgid "%.1f knots" +msgstr "" + +#: ../src/viktrwlayer_propwin.c:969 ../src/viktrwlayer_propwin.c:1254 +#, c-format +msgid "%.1f s/km" +msgstr "" + +#: ../src/viktrwlayer_propwin.c:972 ../src/viktrwlayer_propwin.c:1257 +#: ../src/viktrwlayer_analysis.c:389 ../src/viktrwlayer_analysis.c:392 +#, fuzzy, c-format +msgid "%.1f min/km" +msgstr "1分" + +#: ../src/viktrwlayer_propwin.c:975 ../src/viktrwlayer_propwin.c:1260 +#, c-format +msgid "%.1f sec/mi" +msgstr "" + +#: ../src/viktrwlayer_propwin.c:978 ../src/viktrwlayer_propwin.c:1263 +#: ../src/viktrwlayer_analysis.c:409 ../src/viktrwlayer_analysis.c:412 +#, fuzzy, c-format +msgid "%.1f min/mi" +msgstr "1分" + +#. VIK_UNITS_SPEED_METRES_PER_SECOND: +#: ../src/viktrwlayer_propwin.c:982 ../src/viktrwlayer_propwin.c:1267 +#, c-format +msgid "%.1f m/s" +msgstr "" + +#. Minutes +#: ../src/viktrwlayer_propwin.c:1411 +msgid "mins" +msgstr "" + +#. Hours +#: ../src/viktrwlayer_propwin.c:1418 +msgid "h" +msgstr "" + +#. Days +#: ../src/viktrwlayer_propwin.c:1424 +msgid "d" +msgstr "" + +#. Weeks +#: ../src/viktrwlayer_propwin.c:1429 +msgid "w" +msgstr "" + +#. 'Months' +#: ../src/viktrwlayer_propwin.c:1433 +msgid "M" +msgstr "" + +#: ../src/viktrwlayer_propwin.c:2051 ../src/viktrwlayer_analysis.c:303 +#, c-format +msgid "%.1f miles" +msgstr "" + +#: ../src/viktrwlayer_propwin.c:2054 ../src/viktrwlayer_analysis.c:306 +#, c-format +msgid "%.1f NM" +msgstr "" + +#. VIK_UNITS_DISTANCE_KILOMETRES +#: ../src/viktrwlayer_propwin.c:2057 ../src/viktrwlayer_analysis.c:310 +#, c-format +msgid "%.1f km" +msgstr "" + +#: ../src/viktrwlayer_propwin.c:3083 +msgid "Failed spliting track. Track unchanged" +msgstr "" + +#: ../src/viktrwlayer_propwin.c:3234 ../src/viktrwlayer_propwin.c:3744 +#, c-format +msgid "%s - Track Properties" +msgstr "" + +#: ../src/viktrwlayer_propwin.c:3239 +msgid "Split at _Marker" +msgstr "" + +#: ../src/viktrwlayer_propwin.c:3240 +msgid "Split _Segments" +msgstr "" + +#: ../src/viktrwlayer_propwin.c:3241 +msgid "_Reverse" +msgstr "" + +#: ../src/viktrwlayer_propwin.c:3242 +msgid "_Delete Dupl." +msgstr "" + +#: ../src/viktrwlayer_propwin.c:3269 +msgid "Comment:" +msgstr "" + +#: ../src/viktrwlayer_propwin.c:3270 +msgid "Description:" +msgstr "" + +#: ../src/viktrwlayer_propwin.c:3271 +msgid "Source:" +msgstr "" + +#: ../src/viktrwlayer_propwin.c:3272 +msgid "Type:" +msgstr "" + +#: ../src/viktrwlayer_propwin.c:3273 +msgid "Color:" +msgstr "" + +#: ../src/viktrwlayer_propwin.c:3274 +msgid "Draw Name:" +msgstr "" + +#: ../src/viktrwlayer_propwin.c:3275 +msgid "Distance Labels:" +msgstr "" + +#: ../src/viktrwlayer_propwin.c:3278 +msgid "Track Length:" +msgstr "" + +#: ../src/viktrwlayer_propwin.c:3279 +msgid "Trackpoints:" +msgstr "" + +#: ../src/viktrwlayer_propwin.c:3280 +msgid "Segments:" +msgstr "" + +#: ../src/viktrwlayer_propwin.c:3281 +msgid "Duplicate Points:" +msgstr "" + +#: ../src/viktrwlayer_propwin.c:3282 +msgid "Max Speed:" +msgstr "" + +#: ../src/viktrwlayer_propwin.c:3283 +msgid "Avg. Speed:" +msgstr "" + +#: ../src/viktrwlayer_propwin.c:3284 +msgid "Moving Avg. Speed:" +msgstr "" + +#: ../src/viktrwlayer_propwin.c:3285 +msgid "Avg. Dist. Between TPs:" +msgstr "" + +#: ../src/viktrwlayer_propwin.c:3286 +msgid "Elevation Range:" +msgstr "" + +#: ../src/viktrwlayer_propwin.c:3287 +msgid "Total Elevation Gain/Loss:" +msgstr "" + +#: ../src/viktrwlayer_propwin.c:3288 +msgid "Start:" +msgstr "" + +#: ../src/viktrwlayer_propwin.c:3289 +msgid "End:" +msgstr "" + +#: ../src/viktrwlayer_propwin.c:3290 +msgid "Duration:" +msgstr "" + +#: ../src/viktrwlayer_propwin.c:3320 +msgid "Centre" +msgstr "" + +#: ../src/viktrwlayer_propwin.c:3321 +msgid "Start only" +msgstr "" + +#: ../src/viktrwlayer_propwin.c:3322 +msgid "End only" +msgstr "" + +#: ../src/viktrwlayer_propwin.c:3323 +msgid "Start and End" +msgstr "" + +#: ../src/viktrwlayer_propwin.c:3324 +msgid "Centre, Start and End" +msgstr "" + +#: ../src/viktrwlayer_propwin.c:3336 +msgid "Maximum number of distance labels to be shown" +msgstr "" + +#: ../src/viktrwlayer_propwin.c:3340 +msgid "Properties" +msgstr "" + +#: ../src/viktrwlayer_propwin.c:3584 +#, c-format +msgid "%d minutes - %d minutes moving" +msgstr "" + +#: ../src/viktrwlayer_propwin.c:3596 +#, c-format +msgid "%s total - %s in segments" +msgstr "" + +#: ../src/viktrwlayer_propwin.c:3607 ../src/viktrwlayer_analysis.c:622 +msgid "Statistics" +msgstr "" + +#: ../src/viktrwlayer_propwin.c:3613 ../src/viktrwlayer_propwin.c:3680 +msgid "Show D_EM" +msgstr "" + +#: ../src/viktrwlayer_propwin.c:3615 ../src/viktrwlayer_propwin.c:3631 +#: ../src/viktrwlayer_propwin.c:3647 ../src/viktrwlayer_propwin.c:3697 +msgid "Show _GPS Speed" +msgstr "" + +#: ../src/viktrwlayer_propwin.c:3617 ../src/viktrwlayer_propwin.c:3633 +#: ../src/viktrwlayer_propwin.c:3665 ../src/viktrwlayer_propwin.c:3699 +msgid "Track Distance:" +msgstr "" + +#: ../src/viktrwlayer_propwin.c:3618 ../src/viktrwlayer_propwin.c:3684 +msgid "Track Height:" +msgstr "" + +#: ../src/viktrwlayer_propwin.c:3624 +msgid "Elevation-distance" +msgstr "" + +#: ../src/viktrwlayer_propwin.c:3634 +msgid "Track Gradient:" +msgstr "" + +#: ../src/viktrwlayer_propwin.c:3639 +msgid "Gradient-distance" +msgstr "" + +#: ../src/viktrwlayer_propwin.c:3649 ../src/viktrwlayer_propwin.c:3666 +#: ../src/viktrwlayer_propwin.c:3683 +msgid "Track Time:" +msgstr "" + +#: ../src/viktrwlayer_propwin.c:3650 ../src/viktrwlayer_propwin.c:3700 +msgid "Track Speed:" +msgstr "" + +#: ../src/viktrwlayer_propwin.c:3651 ../src/viktrwlayer_propwin.c:3667 +#: ../src/viktrwlayer_propwin.c:3685 +msgid "Time/Date:" +msgstr "" + +#: ../src/viktrwlayer_propwin.c:3655 +msgid "Speed-time" +msgstr "" + +#: ../src/viktrwlayer_propwin.c:3663 ../src/viktrwlayer_propwin.c:3679 +msgid "Show S_peed" +msgstr "" + +#: ../src/viktrwlayer_propwin.c:3671 +msgid "Distance-time" +msgstr "" + +#: ../src/viktrwlayer_propwin.c:3690 +msgid "Elevation-time" +msgstr "" + +#: ../src/viktrwlayer_propwin.c:3705 +msgid "Speed-distance" +msgstr "" + +#: ../src/viktrwlayer_tpwin.c:190 ../src/viktrwlayer_wpwin.c:66 +msgid "Date/Time Edit" +msgstr "" + +#: ../src/viktrwlayer_tpwin.c:242 +msgid "Name:" +msgstr "" + +#: ../src/viktrwlayer_tpwin.c:243 +msgid "Latitude:" +msgstr "" + +#: ../src/viktrwlayer_tpwin.c:244 +msgid "Longitude:" +msgstr "" + +#: ../src/viktrwlayer_tpwin.c:245 +msgid "Altitude:" +msgstr "" + +#: ../src/viktrwlayer_tpwin.c:246 +msgid "Course:" +msgstr "" + +#: ../src/viktrwlayer_tpwin.c:247 +msgid "Timestamp:" +msgstr "" + +#: ../src/viktrwlayer_tpwin.c:248 +msgid "Time:" +msgstr "" + +#: ../src/viktrwlayer_tpwin.c:249 +msgid "Distance Difference:" +msgstr "" + +#: ../src/viktrwlayer_tpwin.c:250 +msgid "Time Difference:" +msgstr "" + +#: ../src/viktrwlayer_tpwin.c:251 +msgid "\"Speed\" Between:" +msgstr "" + +#: ../src/viktrwlayer_tpwin.c:252 +msgid "Speed:" +msgstr "" + +#: ../src/viktrwlayer_tpwin.c:253 +msgid "VDOP:" +msgstr "" + +#: ../src/viktrwlayer_tpwin.c:254 +msgid "HDOP:" +msgstr "" + +#: ../src/viktrwlayer_tpwin.c:255 +msgid "PDOP:" +msgstr "" + +#: ../src/viktrwlayer_tpwin.c:256 +msgid "SAT/FIX:" +msgstr "" + +#: ../src/viktrwlayer_tpwin.c:263 ../src/viktrwlayer_tpwin.c:408 +#: ../src/viktrwlayer_tpwin.c:622 +msgid "Trackpoint" +msgstr "" + +#: ../src/viktrwlayer_tpwin.c:266 +msgid "_Insert After" +msgstr "" + +#: ../src/viktrwlayer_tpwin.c:268 +msgid "Split Here" +msgstr "" + +#: ../src/viktrwlayer_tracklist.c:262 ../src/viktrwlayer_waypointlist.c:306 +msgid "_Copy Data" +msgstr "" + +#. +#. item = gtk_image_menu_item_new_with_mnemonic ( _("_Select") ); +#. gtk_image_menu_item_set_image ( (GtkImageMenuItem*)item, gtk_image_new_from_stock (GTK_STOCK_FIND, GTK_ICON_SIZE_MENU) ); +#. g_signal_connect_swapped ( G_OBJECT(item), "activate", G_CALLBACK(trw_layer_track_select), values ); +#. gtk_menu_shell_append (GTK_MENU_SHELL (menu), item); +#. gtk_widget_show ( item ); +#. +#. ATM view auto selects, so don't bother with separate select menu entry +#. +#. item = gtk_image_menu_item_new_with_mnemonic ( _("_Select") ); +#. gtk_image_menu_item_set_image ( (GtkImageMenuItem*)item, gtk_image_new_from_stock (GTK_STOCK_FIND, GTK_ICON_SIZE_MENU) ); +#. g_signal_connect_swapped ( G_OBJECT(item), "activate", G_CALLBACK(trw_layer_waypoint_select), values ); +#. gtk_menu_shell_append (GTK_MENU_SHELL (menu), item); +#. gtk_widget_show ( item ); +#. +#. AUTO SELECT NOT TRUE YET... +#. ATM view auto selects, so don't bother with separate select menu entry +#: ../src/viktrwlayer_tracklist.c:290 ../src/viktrwlayer_waypointlist.c:341 +#: ../src/vikwindow.c:4816 +msgid "_View" +msgstr "" + +#. Insert column for the layer name when viewing multi layers +#: ../src/viktrwlayer_tracklist.c:613 ../src/viktrwlayer_waypointlist.c:609 +msgid "Layer" +msgstr "" + +#: ../src/viktrwlayer_tracklist.c:627 ../src/viktrwlayer_waypointlist.c:624 +msgid "Date" +msgstr "" + +#: ../src/viktrwlayer_tracklist.c:631 ../src/viktrwlayer_waypointlist.c:628 +msgid "Visible" +msgstr "" + +#: ../src/viktrwlayer_tracklist.c:639 +msgid "" +"Distance\n" +"(miles)" +msgstr "" + +#: ../src/viktrwlayer_tracklist.c:642 +msgid "" +"Distance\n" +"(NM)" +msgstr "" + +#: ../src/viktrwlayer_tracklist.c:645 +msgid "" +"Distance\n" +"(km)" +msgstr "" + +#: ../src/viktrwlayer_tracklist.c:651 +msgid "" +"Length\n" +"(minutes)" +msgstr "" + +#: ../src/viktrwlayer_tracklist.c:660 ../src/vikutils.c:93 +msgid "sec/mi" +msgstr "" + +#: ../src/viktrwlayer_tracklist.c:666 +#, c-format +msgid "" +"Av. Speed\n" +"(%s)" +msgstr "" + +#. Apply own formatting of the data +#: ../src/viktrwlayer_tracklist.c:671 +#, c-format +msgid "" +"Max Speed\n" +"(%s)" +msgstr "" + +#: ../src/viktrwlayer_tracklist.c:679 ../src/viktrwlayer_waypointlist.c:637 +msgid "" +"Max Height\n" +"(Feet)" +msgstr "" + +#: ../src/viktrwlayer_tracklist.c:681 ../src/viktrwlayer_waypointlist.c:639 +msgid "" +"Max Height\n" +"(Metres)" +msgstr "" + +#: ../src/viktrwlayer_waypointlist.c:312 +msgid "Copy Data (with _positions)" +msgstr "" + +#: ../src/viktrwlayer_waypointlist.c:633 +msgid "Comment" +msgstr "" + +#: ../src/viktrwlayer_waypointlist.c:643 +msgid "Symbol" +msgstr "" + +#: ../src/viktrwlayer_wpwin.c:93 ../src/viktrwlayer_wpwin.c:302 +msgid "True" +msgstr "" + +#: ../src/viktrwlayer_wpwin.c:122 +msgid "Waypoint Properties" +msgstr "" + +#: ../src/viktrwlayer_wpwin.c:164 +msgid "Name:" +msgstr "名前:" + +#: ../src/viktrwlayer_wpwin.c:181 +msgid "Altitude:" +msgstr "高度:" + +#: ../src/viktrwlayer_wpwin.c:186 ../src/viktrwlayer_wpwin.c:188 +msgid "Comment:" +msgstr "コメント:" + +#: ../src/viktrwlayer_wpwin.c:202 +msgid "Source:" +msgstr "" + +#: ../src/viktrwlayer_wpwin.c:212 +msgid "Image:" +msgstr "画像:" + +#: ../src/viktrwlayer_wpwin.c:217 +msgid "Symbol:" +msgstr "" + +#: ../src/viktrwlayer_wpwin.c:226 +msgid "(none)" +msgstr "(なし)" + +#. Geotag Info [readonly] +#: ../src/viktrwlayer_wpwin.c:272 +msgid "Has Geotag" +msgstr "" + +#: ../src/viktrwlayer_wpwin.c:279 +msgid "Consistent Position" +msgstr "" + +#. ATM the direction value box is always shown, even when there is no information. +#. It would be nice to be able to hide it until the 'Add' has been performed, +#. however I've not been able to achieve this. +#. Thus simply sensistizing it instead. +#: ../src/viktrwlayer_wpwin.c:292 +#, fuzzy +msgid "Image Direction:" +msgstr "画像の設定" + +#: ../src/viktrwlayer_wpwin.c:300 +msgid "Magnetic" +msgstr "" + +#: ../src/viktrwlayer_wpwin.c:320 +msgid "Time:" +msgstr "" + +#. TODO: other checks (isalpha or whatever ) +#: ../src/viktrwlayer_wpwin.c:386 +msgid "Please enter a name for the waypoint." +msgstr "" + +#: ../src/viktrwlayer_geotag.c:320 ../src/viktrwlayer_geotag.c:460 +#, c-format +msgid "Failed updating EXIF on %s" +msgstr "" + +#: ../src/viktrwlayer_geotag.c:562 +#, c-format +msgid "Geotagging %d Images..." +msgstr "" + +#: ../src/viktrwlayer_geotag.c:630 +msgid "Geotag Images" +msgstr "" + +#: ../src/viktrwlayer_geotag.c:640 +msgid "Images" +msgstr "" + +#: ../src/viktrwlayer_geotag.c:645 +msgid "Overwrite Existing Waypoints:" +msgstr "" + +#: ../src/viktrwlayer_geotag.c:648 +msgid "Overwrite Existing GPS Information:" +msgstr "" + +#: ../src/viktrwlayer_geotag.c:650 +msgid "Keep File Modification Timestamp:" +msgstr "" + +#: ../src/viktrwlayer_geotag.c:684 +msgid "Create Waypoints:" +msgstr "" + +#: ../src/viktrwlayer_geotag.c:693 +msgid "Write EXIF:" +msgstr "" + +#: ../src/viktrwlayer_geotag.c:705 +msgid "Automatic Image Direction:" +msgstr "" + +#: ../src/viktrwlayer_geotag.c:707 +msgid "Set image direction based on a heading derived from the track" +msgstr "" + +#: ../src/viktrwlayer_geotag.c:710 +msgid "Interpolate Between Track Segments:" +msgstr "" + +#: ../src/viktrwlayer_geotag.c:715 +msgid "Image Time Offset (Seconds):" +msgstr "" + +#: ../src/viktrwlayer_geotag.c:718 +msgid "" +"The number of seconds to ADD to the photos time to make it match the GPS " +"data. Calculate this with (GPS - Photo). Can be negative or positive. Useful " +"to adjust times when a camera's timestamp was incorrect." +msgstr "" + +#: ../src/viktrwlayer_geotag.c:721 +msgid "Image Timezone:" +msgstr "" + +#: ../src/viktrwlayer_geotag.c:724 +msgid "" +"The timezone that was used when the images were created. For example, if a " +"camera is set to AWST or +8:00 hours. Enter +8:00 here so that the correct " +"adjustment to the images' time can be made. GPS data is always in UTC." +msgstr "" + +#: ../src/viktrwlayer_geotag.c:728 +#, c-format +msgid "Using waypoint: %s" +msgstr "" + +#: ../src/viktrwlayer_geotag.c:742 +#, c-format +msgid "Using track: %s" +msgstr "" + +#: ../src/viktrwlayer_geotag.c:744 +#, c-format +msgid "Using all tracks in: %s" +msgstr "" + +#: ../src/viktrwlayer_analysis.c:214 +msgid "Number of Tracks" +msgstr "" + +#: ../src/viktrwlayer_analysis.c:215 +msgid "Date Range" +msgstr "" + +#: ../src/viktrwlayer_analysis.c:216 +msgid "Total Length" +msgstr "" + +#: ../src/viktrwlayer_analysis.c:217 +msgid "Average Length" +msgstr "" + +#: ../src/viktrwlayer_analysis.c:218 +msgid "Eddington number" +msgstr "" + +#. No.4: Extended display only +#: ../src/viktrwlayer_analysis.c:219 +msgid "Max Speed" +msgstr "" + +#: ../src/viktrwlayer_analysis.c:220 +msgid "Avg. Speed" +msgstr "" + +#: ../src/viktrwlayer_analysis.c:221 +msgid "Minimum Altitude" +msgstr "" + +#: ../src/viktrwlayer_analysis.c:222 +msgid "Maximum Altitude" +msgstr "" + +#: ../src/viktrwlayer_analysis.c:223 +msgid "Total Elevation Gain/Loss" +msgstr "" + +#: ../src/viktrwlayer_analysis.c:224 +msgid "Avg. Elevation Gain/Loss" +msgstr "" + +#: ../src/viktrwlayer_analysis.c:225 +msgid "Total Duration" +msgstr "" + +#: ../src/viktrwlayer_analysis.c:226 +msgid "Avg. Duration" +msgstr "" + +#: ../src/viktrwlayer_analysis.c:317 +#, c-format +msgid "%.2f miles" +msgstr "" + +#: ../src/viktrwlayer_analysis.c:320 +#, c-format +msgid "%.2f NM" +msgstr "" + +#. VIK_UNITS_DISTANCE_KILOMETRES +#: ../src/viktrwlayer_analysis.c:324 +#, c-format +msgid "%.2f km" +msgstr "" + +#: ../src/viktrwlayer_analysis.c:361 +#, c-format +msgid "%.2f m/s" +msgstr "" + +#: ../src/viktrwlayer_analysis.c:370 ../src/viktrwlayer_analysis.c:373 +#, c-format +msgid "%.2f knots" +msgstr "" + +#: ../src/viktrwlayer_analysis.c:379 ../src/viktrwlayer_analysis.c:382 +#, c-format +msgid "%d s/km" +msgstr "" + +#: ../src/viktrwlayer_analysis.c:399 ../src/viktrwlayer_analysis.c:402 +#, c-format +msgid "%d sec/mi" +msgstr "" + +#: ../src/viktrwlayer_analysis.c:420 ../src/viktrwlayer_analysis.c:423 +#, c-format +msgid "%.2f km/h" +msgstr "" + +#: ../src/viktrwlayer_analysis.c:434 ../src/viktrwlayer_analysis.c:440 +#, c-format +msgid "%d feet" +msgstr "" + +#: ../src/viktrwlayer_analysis.c:445 ../src/viktrwlayer_analysis.c:447 +#, c-format +msgid "%d feet / %d feet" +msgstr "" + +#: ../src/viktrwlayer_analysis.c:452 ../src/viktrwlayer_analysis.c:458 +#, c-format +msgid "%d m" +msgstr "" + +#: ../src/viktrwlayer_analysis.c:463 ../src/viktrwlayer_analysis.c:465 +#, c-format +msgid "%d m / %d m" +msgstr "" + +#: ../src/viktrwlayer_analysis.c:477 +#, c-format +msgid "%d:%02d:%02d days:hrs:mins" +msgstr "" + +#: ../src/viktrwlayer_analysis.c:484 +#, c-format +msgid "%d:%02d hrs:mins" +msgstr "" + +#: ../src/viktrwlayer_analysis.c:658 +msgid "Include Invisible Items" +msgstr "" + +#: ../src/vikstatus.c:129 +msgid "Current number of background tasks. Click to see the background jobs." +msgstr "" + +#: ../src/vikstatus.c:134 +msgid "Current zoom level. Click to select a new one." +msgstr "" + +#: ../src/vikstatus.c:141 +msgid "Left click to clear the message. Right click to copy the message." +msgstr "" + +#: ../src/vikutils.c:108 +msgid "GPSD" +msgstr "" + +#. GPS Preamble +#: ../src/vikutils.c:109 +msgid "Trkpt" +msgstr "" + +#: ../src/vikutils.c:160 +#, c-format +msgid "%sSpeed%s %.1f%s" +msgstr "" + +#. Go for 2dp as expect low values for vertical speeds +#: ../src/vikutils.c:214 +#, c-format +msgid "%sClimb%s %.2f%s" +msgstr "" + +#: ../src/vikutils.c:223 +#, c-format +msgid "%sAlt %dfeet" +msgstr "" + +#. VIK_UNITS_HEIGHT_METRES: +#: ../src/vikutils.c:227 +#, c-format +msgid "%sAlt %dm" +msgstr "" + +#: ../src/vikutils.c:235 +#, c-format +msgid "%sCourse %03d°" +msgstr "" + +#: ../src/vikutils.c:249 +msgid "yards" +msgstr "" + +#. VIK_UNITS_DISTANCE_KILOMETRES: +#: ../src/vikutils.c:253 +msgid "m" +msgstr "" + +#: ../src/vikutils.c:257 +#, c-format +msgid "%sDistance diff %d%s" +msgstr "" + +#: ../src/vikutils.c:272 +#, c-format +msgid "%sTime %s" +msgstr "" + +#: ../src/vikutils.c:281 +#, c-format +msgid "%sTime diff %lds" +msgstr "" + +#: ../src/vikutils.c:287 +#, c-format +msgid "%sNo. of Sats %d" +msgstr "" + +#: ../src/vikutils.c:312 +#, c-format +msgid "%sTo End %.2f%s" +msgstr "" + +#: ../src/vikutils.c:339 +#, c-format +msgid "%sDistance along %.2f%s" +msgstr "" + +#: ../src/vikutils.c:359 +#, c-format +msgid "%sTrack: %s" +msgstr "" + +#: ../src/vikutils.c:396 +#, c-format +msgid "" +"There is a newer version of Viking available: %s\n" +"\n" +"Do you wish to go to Viking's website now?" +msgstr "" + +#: ../src/vikutils.c:526 +msgid "" +"This appears to be Viking's very first run.\n" +"\n" +"Do you wish to enable automatic internet features?\n" +"\n" +"Individual settings can be controlled in the Preferences." +msgstr "" + +#: ../src/vikwaypoint.c:37 +msgid "Waypoint" +msgstr "" + +#: ../src/vikwebtool_datasource.c:352 +msgid "Search Term" +msgstr "" + +#. TODO get rid of this as this is unnecessary duplication... +#: ../src/vikwindow.c:258 +msgid "Pan" +msgstr "" + +#: ../src/vikwindow.c:258 +msgid "Zoom" +msgstr "" + +#: ../src/vikwindow.c:258 +msgid "Ruler" +msgstr "" + +#: ../src/vikwindow.c:258 +msgid "Select" +msgstr "" + +#: ../src/vikwindow.c:368 +msgid "This is Viking " +msgstr "" + +#: ../src/vikwindow.c:457 +msgid "Location lookup aborted" +msgstr "" + +#: ../src/vikwindow.c:477 +#, c-format +msgid "Location found: %s" +msgstr "" + +#: ../src/vikwindow.c:486 +msgid "Unable to determine location" +msgstr "" + +#: ../src/vikwindow.c:495 +msgid "Determining location" +msgstr "" + +#: ../src/vikwindow.c:525 +#, c-format +msgid "Location found via geoclue" +msgstr "" + +#: ../src/vikwindow.c:546 +msgid "Default Map" +msgstr "" + +#: ../src/vikwindow.c:557 ../src/vikwindow.c:3938 +msgid "Trying to determine location..." +msgstr "" + +#. Create tooltip +#: ../src/vikwindow.c:723 +msgid "Select zoom level" +msgstr "" + +#: ../src/vikwindow.c:1176 +#, c-format +msgid "" +"Do you want to save the changes you made to the document \"%s\"?\n" +"\n" +"Your changes will be lost if you don't save them." +msgstr "" + +#: ../src/vikwindow.c:1180 +msgid "Don't Save" +msgstr "" + +#: ../src/vikwindow.c:1268 +msgid "mpp" +msgstr "" + +#: ../src/vikwindow.c:1268 +msgid "pixelfact" +msgstr "" + +#: ../src/vikwindow.c:1467 +#, c-format +msgid "%s %s %dm" +msgstr "" + +#: ../src/vikwindow.c:1469 +#, c-format +msgid "%s %s %dft" +msgstr "" + +#: ../src/vikwindow.c:1472 +#, c-format +msgid "%s %s" +msgstr "" + +#: ../src/vikwindow.c:1929 +msgid "_Ruler" +msgstr "" + +#: ../src/vikwindow.c:1929 +msgid "Ruler Tool" +msgstr "" + +#: ../src/vikwindow.c:2204 ../src/vikwindow.c:4818 +msgid "_Zoom" +msgstr "" + +#: ../src/vikwindow.c:2204 +msgid "Zoom Tool" +msgstr "" + +#: ../src/vikwindow.c:2271 ../src/vikwindow.c:4819 +msgid "_Pan" +msgstr "" + +#: ../src/vikwindow.c:2271 +msgid "Pan Tool" +msgstr "" + +#: ../src/vikwindow.c:2425 +msgid "_Select" +msgstr "" + +#: ../src/vikwindow.c:2425 +msgid "Select Tool" +msgstr "" + +#: ../src/vikwindow.c:2615 +msgid "You must select a layer to show its properties." +msgstr "" + +#. No error to show, so unlikely this will get called +#: ../src/vikwindow.c:2629 +msgid "The help system is not available." +msgstr "" + +#. Main error path +#: ../src/vikwindow.c:2632 +#, c-format +msgid "" +"Help is not available because: %s.\n" +"Ensure a Mime Type ghelp handler program is installed (e.g. yelp)." +msgstr "" + +#: ../src/vikwindow.c:2865 +msgid "You must select a layer to delete." +msgstr "" + +#: ../src/vikwindow.c:3171 +msgid "Untitled" +msgstr "" + +#: ../src/vikwindow.c:3300 +#, c-format +msgid "Unable to add '%s' to the list of recently used documents" +msgstr "" + +#: ../src/vikwindow.c:3391 +msgid "The file you requested could not be opened." +msgstr "" + +#: ../src/vikwindow.c:3394 +msgid "" +"GPSBabel is required to load files of this type or GPSBabel encountered " +"problems." +msgstr "" + +#: ../src/vikwindow.c:3397 +#, c-format +msgid "Unable to load malformed GPX file %s" +msgstr "" + +#: ../src/vikwindow.c:3400 +#, c-format +msgid "Unsupported file type for %s" +msgstr "" + +#. Since we can process .vik files with issues just show a warning in the status bar +#. Not that a user can do much about it... or tells them what this issue is yet... +#: ../src/vikwindow.c:3406 +#, c-format +msgid "WARNING: issues encountered loading %s" +msgstr "" + +#: ../src/vikwindow.c:3489 +msgid "Please select a GPS data file to open. " +msgstr "" + +#: ../src/vikwindow.c:3508 +msgid "Google Earth" +msgstr "" + +#: ../src/vikwindow.c:3523 ../src/vikwindow.c:3646 ../src/viking.desktop.in.h:1 +msgid "Viking" +msgstr "" + +#: ../src/vikwindow.c:3594 ../src/vikwindow.c:4632 +msgid "Open File" +msgstr "" + +#: ../src/vikwindow.c:3630 +msgid "Save as Viking File." +msgstr "" + +#: ../src/vikwindow.c:3757 +#, c-format +msgid "Exporting to file: %s" +msgstr "" + +#. Confirm what happened. +#: ../src/vikwindow.c:3774 +#, c-format +msgid "Exported files: %d" +msgstr "" + +#: ../src/vikwindow.c:3786 +msgid "Nothing to Export!" +msgstr "" + +#: ../src/vikwindow.c:3790 +msgid "Export to directory" +msgstr "" + +#: ../src/vikwindow.c:3809 +msgid "Could not convert all files" +msgstr "" + +#: ../src/vikwindow.c:3851 +msgid "File not accessible" +msgstr "" + +#: ../src/vikwindow.c:3854 +msgid "No Viking File" +msgstr "" + +#: ../src/vikwindow.c:3998 +msgid "This layer has no configurable properties." +msgstr "" + +#: ../src/vikwindow.c:4080 +msgid "Are you sure you wish to delete all layers?" +msgstr "" + +#. Try harder... +#: ../src/vikwindow.c:4126 ../src/vikwindow.c:4132 +msgid "Generating image file..." +msgstr "" + +#: ../src/vikwindow.c:4154 +msgid "" +"Failed to generate internal image.\n" +"\n" +"Try creating a smaller image." +msgstr "" + +#: ../src/vikwindow.c:4175 +msgid "Image file generated." +msgstr "" + +#: ../src/vikwindow.c:4177 +msgid "Failed to generate image file." +msgstr "" + +#: ../src/vikwindow.c:4246 +#, c-format +msgid "Unable to write to file %s: %s" +msgstr "" + +#: ../src/vikwindow.c:4284 +msgid "" +"Viewable region outside allowable pixel size bounds for image. Clipping " +"width/height values." +msgstr "" + +#: ../src/vikwindow.c:4309 +#, c-format +msgid "Total area: %ldm x %ldm (%.3f sq. km)" +msgstr "" + +#: ../src/vikwindow.c:4312 +#, c-format +msgid "Total area: %ldm x %ldm (%.3f sq. miles)" +msgstr "" + +#: ../src/vikwindow.c:4315 +#, c-format +msgid "Total area: %ldm x %ldm (%.3f sq. NM)" +msgstr "" + +#. Single file +#: ../src/vikwindow.c:4343 +msgid "Save Image" +msgstr "" + +#: ../src/vikwindow.c:4364 ../src/vikwindow.c:4641 +msgid "KMZ" +msgstr "" + +#: ../src/vikwindow.c:4417 +msgid "You must be in UTM mode to use this feature" +msgstr "" + +#: ../src/vikwindow.c:4421 +msgid "Choose a directory to hold images" +msgstr "" + +#. todo: default for answers inside VikWindow or static (thruout instance) +#: ../src/vikwindow.c:4441 +msgid "Save to Image File" +msgstr "" + +#: ../src/vikwindow.c:4457 +msgid "Width (pixels):" +msgstr "" + +#: ../src/vikwindow.c:4459 +msgid "Height (pixels):" +msgstr "" + +#: ../src/vikwindow.c:4462 +msgid "" +"WARNING: USING LARGE IMAGES OVER 10000x10000\n" +"MAY CRASH THE PROGRAM!" +msgstr "" + +#: ../src/vikwindow.c:4464 +msgid "Zoom (meters per pixel):" +msgstr "" + +#: ../src/vikwindow.c:4480 +msgid "Area in current viewable window" +msgstr "" + +#: ../src/vikwindow.c:4490 +msgid "Save as PNG" +msgstr "" + +#: ../src/vikwindow.c:4491 +msgid "Save as JPEG" +msgstr "" + +#: ../src/vikwindow.c:4520 +msgid "East-west image tiles:" +msgstr "" + +#: ../src/vikwindow.c:4522 +msgid "North-south image tiles:" +msgstr "" + +#: ../src/vikwindow.c:4619 +msgid "This feature is not available in UTM mode" +msgstr "" + +#: ../src/vikwindow.c:4658 +#, c-format +msgid "Unable to import %s." +msgstr "" + +#: ../src/vikwindow.c:4749 +msgid "Choose a background color" +msgstr "" + +#: ../src/vikwindow.c:4765 +msgid "Choose a track highlight color" +msgstr "" + +#: ../src/vikwindow.c:4814 +msgid "_File" +msgstr "" + +#: ../src/vikwindow.c:4815 +msgid "_Edit" +msgstr "" + +#: ../src/vikwindow.c:4817 +msgid "_Show" +msgstr "" + +#: ../src/vikwindow.c:4820 +msgid "_Layers" +msgstr "" + +#: ../src/vikwindow.c:4821 +msgid "_Tools" +msgstr "" + +#: ../src/vikwindow.c:4822 +msgid "_Webtools" +msgstr "" + +#: ../src/vikwindow.c:4823 ../src/vikwindow.c:4893 +msgid "_Help" +msgstr "" + +#: ../src/vikwindow.c:4825 +msgid "New file" +msgstr "" + +#: ../src/vikwindow.c:4826 +msgid "_Open..." +msgstr "" + +#: ../src/vikwindow.c:4826 +msgid "Open a file" +msgstr "" + +#: ../src/vikwindow.c:4827 +msgid "Open _Recent File" +msgstr "" + +#: ../src/vikwindow.c:4828 +msgid "Append _File..." +msgstr "" + +#: ../src/vikwindow.c:4828 +msgid "Append data from a different file" +msgstr "" + +#: ../src/vikwindow.c:4829 +msgid "Open GPX as External _Layer..." +msgstr "" + +#: ../src/vikwindow.c:4829 +msgid "Open a GPX file as an external layer" +msgstr "" + +#: ../src/vikwindow.c:4830 +msgid "_Export All" +msgstr "" + +#: ../src/vikwindow.c:4830 +msgid "Export All TrackWaypoint Layers" +msgstr "" + +#: ../src/vikwindow.c:4831 +msgid "_GPX..." +msgstr "" + +#: ../src/vikwindow.c:4831 +msgid "Export as GPX" +msgstr "" + +#: ../src/vikwindow.c:4832 +msgid "A_cquire" +msgstr "" + +#: ../src/vikwindow.c:4833 +msgid "_Directions..." +msgstr "" + +#: ../src/vikwindow.c:4833 +msgid "Get driving directions" +msgstr "" + +#: ../src/vikwindow.c:4835 +msgid "_OSM Traces..." +msgstr "" + +#: ../src/vikwindow.c:4835 +msgid "Get traces from OpenStreetMap" +msgstr "" + +#: ../src/vikwindow.c:4836 +msgid "_My OSM Traces..." +msgstr "" + +#: ../src/vikwindow.c:4836 +msgid "Get Your Own Traces from OpenStreetMap" +msgstr "" + +#: ../src/vikwindow.c:4839 +msgid "Geo_caches..." +msgstr "" + +#: ../src/vikwindow.c:4839 +msgid "Get Geocaches from geocaching.com" +msgstr "" + +#: ../src/vikwindow.c:4842 +msgid "Create waypoints from geotagged images" +msgstr "" + +#: ../src/vikwindow.c:4844 +msgid "Get a file from a URL" +msgstr "" + +#: ../src/vikwindow.c:4846 +msgid "Create waypoints from Wikipedia items in the current view" +msgstr "" + +#: ../src/vikwindow.c:4848 +msgid "_Save" +msgstr "" + +#: ../src/vikwindow.c:4848 +msgid "Save the file" +msgstr "" + +#: ../src/vikwindow.c:4849 +msgid "Save _As..." +msgstr "" + +#: ../src/vikwindow.c:4849 +msgid "Save the file under different name" +msgstr "" + +#: ../src/vikwindow.c:4850 +msgid "Properties..." +msgstr "" + +#: ../src/vikwindow.c:4850 +msgid "File Properties" +msgstr "" + +#: ../src/vikwindow.c:4852 +msgid "Import KMZ _Map File..." +msgstr "" + +#: ../src/vikwindow.c:4852 +msgid "Import a KMZ file" +msgstr "" + +#: ../src/vikwindow.c:4853 +msgid "Generate _KMZ Map File..." +msgstr "" + +#: ../src/vikwindow.c:4853 +msgid "Generate a KMZ file with an overlay of the current view" +msgstr "" + +#: ../src/vikwindow.c:4855 +msgid "_Generate Image File..." +msgstr "" + +#: ../src/vikwindow.c:4855 +msgid "Save a snapshot of the workspace into a file" +msgstr "" + +#: ../src/vikwindow.c:4856 +msgid "Generate _Directory of Images..." +msgstr "" + +#: ../src/vikwindow.c:4856 +msgid "Generate _Directory of Images" +msgstr "" + +#: ../src/vikwindow.c:4857 +msgid "_Print..." +msgstr "" + +#: ../src/vikwindow.c:4857 +msgid "Print maps" +msgstr "" + +#: ../src/vikwindow.c:4858 +msgid "E_xit" +msgstr "" + +#: ../src/vikwindow.c:4858 +msgid "Exit the program" +msgstr "" + +#: ../src/vikwindow.c:4859 +msgid "Save and Exit" +msgstr "" + +#: ../src/vikwindow.c:4859 +msgid "Save and Exit the program" +msgstr "" + +#: ../src/vikwindow.c:4861 +msgid "Go to the Pre_vious Location" +msgstr "" + +#: ../src/vikwindow.c:4861 +msgid "Go to the previous location" +msgstr "" + +#: ../src/vikwindow.c:4862 +msgid "Go to the _Next Location" +msgstr "" + +#: ../src/vikwindow.c:4862 +msgid "Go to the next location" +msgstr "" + +#: ../src/vikwindow.c:4863 +msgid "Go to the _Default Location" +msgstr "" + +#: ../src/vikwindow.c:4863 +msgid "Go to the default location" +msgstr "" + +#: ../src/vikwindow.c:4864 +msgid "Go to the _Auto Location" +msgstr "" + +#: ../src/vikwindow.c:4864 +msgid "Go to a location via automatic lookup" +msgstr "" + +#: ../src/vikwindow.c:4865 +msgid "Go to _Location..." +msgstr "" + +#: ../src/vikwindow.c:4865 +msgid "Go to address/place using text search" +msgstr "" + +#: ../src/vikwindow.c:4866 +msgid "_Go to Lat/Lon..." +msgstr "" + +#: ../src/vikwindow.c:4866 +msgid "Go to arbitrary lat/lon coordinate" +msgstr "" + +#: ../src/vikwindow.c:4867 +msgid "Go to UTM..." +msgstr "" + +#: ../src/vikwindow.c:4867 +msgid "Go to arbitrary UTM coordinate" +msgstr "" + +#: ../src/vikwindow.c:4868 +msgid "Go to Today" +msgstr "" + +#: ../src/vikwindow.c:4868 +msgid "Go to today on the calendar" +msgstr "" + +#: ../src/vikwindow.c:4869 +msgid "_Refresh" +msgstr "" + +#: ../src/vikwindow.c:4869 +msgid "Refresh any maps displayed" +msgstr "" + +#: ../src/vikwindow.c:4870 +msgid "Set _Highlight Color..." +msgstr "" + +#: ../src/vikwindow.c:4870 +msgid "Set Highlight Color" +msgstr "" + +#: ../src/vikwindow.c:4871 +msgid "Set Bac_kground Color..." +msgstr "" + +#: ../src/vikwindow.c:4871 +msgid "Set Background Color" +msgstr "" + +#: ../src/vikwindow.c:4872 +msgid "Zoom _In" +msgstr "" + +#: ../src/vikwindow.c:4872 +msgid "Zoom In" +msgstr "" + +#: ../src/vikwindow.c:4873 +msgid "Zoom _Out" +msgstr "" + +#: ../src/vikwindow.c:4873 +msgid "Zoom Out" +msgstr "" + +#: ../src/vikwindow.c:4874 +msgid "Zoom _To..." +msgstr "" + +#: ../src/vikwindow.c:4874 +msgid "Zoom To" +msgstr "" + +#: ../src/vikwindow.c:4875 +msgid "Pan _North" +msgstr "" + +#: ../src/vikwindow.c:4876 +msgid "Pan _East" +msgstr "" + +#: ../src/vikwindow.c:4877 +msgid "Pan _South" +msgstr "" + +#: ../src/vikwindow.c:4878 +msgid "Pan _West" +msgstr "" + +#: ../src/vikwindow.c:4879 +msgid "Background _Jobs" +msgstr "" + +#: ../src/vikwindow.c:4879 +msgid "Background Jobs" +msgstr "" + +#: ../src/vikwindow.c:4881 +msgid "Cu_t" +msgstr "" + +#: ../src/vikwindow.c:4885 +msgid "Delete All" +msgstr "" + +#: ../src/vikwindow.c:4886 +msgid "Copy Centre _Location" +msgstr "" + +#: ../src/vikwindow.c:4887 +msgid "_Flush Map Cache" +msgstr "" + +#: ../src/vikwindow.c:4888 +msgid "_Set the Default Location" +msgstr "" + +#: ../src/vikwindow.c:4888 +msgid "Set the Default Location to the current position" +msgstr "" + +#: ../src/vikwindow.c:4889 +msgid "_Preferences" +msgstr "" + +#: ../src/vikwindow.c:4889 +msgid "Program Preferences" +msgstr "" + +#: ../src/vikwindow.c:4890 +msgid "_Layer Defaults" +msgstr "" + +#: ../src/vikwindow.c:4891 +msgid "_Properties" +msgstr "" + +#: ../src/vikwindow.c:4893 +msgid "Help" +msgstr "" + +#: ../src/vikwindow.c:4894 +msgid "_About" +msgstr "" + +#: ../src/vikwindow.c:4894 +msgid "About" +msgstr "" + +#: ../src/vikwindow.c:4903 +msgid "_KML..." +msgstr "" + +#: ../src/vikwindow.c:4903 +msgid "Export as KML" +msgstr "" + +#: ../src/vikwindow.c:4904 +msgid "Transfer data from a GPS device" +msgstr "" + +#: ../src/vikwindow.c:4905 +msgid "Import file via GPSBabel converter" +msgstr "" + +#: ../src/vikwindow.c:4909 +msgid "Import Geo_JSON File..." +msgstr "" + +#: ../src/vikwindow.c:4909 +msgid "Import GeoJSON file" +msgstr "" + +#: ../src/vikwindow.c:4914 +msgid "_UTM Mode" +msgstr "" + +#: ../src/vikwindow.c:4915 +msgid "_Expedia Mode" +msgstr "" + +#: ../src/vikwindow.c:4916 +msgid "_Mercator Mode" +msgstr "" + +#: ../src/vikwindow.c:4917 +msgid "Lat_/Lon Mode" +msgstr "" + +#: ../src/vikwindow.c:4921 +msgid "Show _Scale" +msgstr "" + +#: ../src/vikwindow.c:4921 +msgid "Show Scale" +msgstr "" + +#: ../src/vikwindow.c:4922 +msgid "Show _Center Mark" +msgstr "" + +#: ../src/vikwindow.c:4922 +msgid "Show Center Mark" +msgstr "" + +#: ../src/vikwindow.c:4923 +msgid "Show _Highlight" +msgstr "" + +#: ../src/vikwindow.c:4923 +msgid "Show Highlight" +msgstr "" + +#: ../src/vikwindow.c:4924 +msgid "_Full Screen" +msgstr "" + +#: ../src/vikwindow.c:4924 +msgid "Activate full screen mode" +msgstr "" + +#: ../src/vikwindow.c:4925 +msgid "Show Side _Panel" +msgstr "" + +#: ../src/vikwindow.c:4925 +msgid "Show Side Panel" +msgstr "" + +#: ../src/vikwindow.c:4926 +msgid "Show Status_bar" +msgstr "" + +#: ../src/vikwindow.c:4926 +msgid "Show Statusbar" +msgstr "" + +#: ../src/vikwindow.c:4927 +msgid "Show _Toolbar" +msgstr "" + +#: ../src/vikwindow.c:4927 +msgid "Show Toolbar" +msgstr "" + +#: ../src/vikwindow.c:4928 +msgid "Show _Menu" +msgstr "" + +#: ../src/vikwindow.c:4928 +msgid "Show Menu" +msgstr "" + +#: ../src/vikwindow.c:4929 +msgid "Show Side Panel B_uttons" +msgstr "" + +#: ../src/vikwindow.c:4929 +msgid "Show Side Panel Buttons" +msgstr "" + +#: ../src/vikwindow.c:4930 +msgid "Show Side Panel Ca_lendar" +msgstr "" + +#: ../src/vikwindow.c:4930 +msgid "Show Side Panel Calendar" +msgstr "" + +#: ../src/vikwindow.c:5064 +#, c-format +msgid "New _%s Layer" +msgstr "" + +#: ../src/vikwindow.c:5114 +msgid "..." +msgstr "" + +#: ../src/viking.desktop.in.h:2 +msgid "GPS Data Manager" +msgstr "" + +#: ../src/viking.desktop.in.h:3 +msgid "Map Based GPS Data Manager (live data capable)." +msgstr "" + +#: ../src/libjpeg/jpeg-data.c:205 +msgid "Data does not follow JPEG specification." +msgstr "" + +#: ../src/libjpeg/jpeg-data.c:302 +#, c-format +msgid "Path '%s' invalid." +msgstr "" + +#: ../src/libjpeg/jpeg-data.c:320 +#, c-format +msgid "Could not read '%s'." +msgstr "" + +#~ msgid "Email:" +#~ msgstr "Eメール:" + +#~ msgid "Error: couldn't find gpsbabel." +#~ msgstr "エラー: gpsbabelを見つけることができませんでした。" diff --git a/po/jv.po b/po/jv.po new file mode 100644 index 0000000..6bceb13 --- /dev/null +++ b/po/jv.po @@ -0,0 +1,6071 @@ +# Javanese translation for viking +# Copyright (c) 2011 Rosetta Contributors and Canonical Ltd 2011 +# This file is distributed under the same license as the viking package. +# FIRST AUTHOR , 2011. +# +msgid "" +msgstr "" +"Project-Id-Version: viking\n" +"Report-Msgid-Bugs-To: \n" +"POT-Creation-Date: 2019-01-19 12:53+0000\n" +"PO-Revision-Date: 2011-01-10 15:37+0000\n" +"Last-Translator: FULL NAME \n" +"Language-Team: Javanese \n" +"Language: jv\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" +"X-Launchpad-Export-Date: 2018-12-21 17:32+0000\n" +"X-Generator: Launchpad (build 18847)\n" + +#: ../src/acquire.c:106 ../src/vikgpslayer.c:1367 +msgid "Done." +msgstr "" + +#: ../src/acquire.c:115 +msgid "No data." +msgstr "" + +#: ../src/acquire.c:167 ../src/acquire.c:415 +msgid "Error: acquisition failed." +msgstr "" + +#: ../src/acquire.c:339 +msgid "Working..." +msgstr "" + +#. This shouldn't happen... +#: ../src/acquire.c:406 +msgid "" +"Unable to create command\n" +"Acquire method failed." +msgstr "" + +#: ../src/acquire.c:513 +msgid "_Filter" +msgstr "" + +#: ../src/acquire.c:528 +#, c-format +msgid "Filter with %s" +msgstr "" + +#: ../src/acquire.c:545 +msgid "Filter" +msgstr "" + +#: ../src/babel.c:640 +msgid "GPSBabel:" +msgstr "" + +#: ../src/babel.c:641 +msgid "" +"Allow setting the specific instance of GPSBabel. You must restart Viking for " +"this value to take effect." +msgstr "" + +#: ../src/babel_ui.c:79 +msgid "Select a file format" +msgstr "" + +#: ../src/babel_ui.c:144 ../src/viktrwlayer.c:531 ../src/viktrwlayer.c:2882 +msgid "Tracks" +msgstr "" + +#: ../src/babel_ui.c:149 ../src/viktrwlayer.c:2892 +msgid "Routes" +msgstr "" + +#. ***** PARAMETERS ***** +#: ../src/babel_ui.c:154 ../src/viktrwlayer.c:531 ../src/viktrwlayer.c:2887 +msgid "Waypoints" +msgstr "" + +#: ../src/background.c:64 +#, c-format +msgid "%d items" +msgstr "" + +#: ../src/background.c:287 +msgid "Threads:" +msgstr "" + +#: ../src/background.c:288 +msgid "" +"Number of threads to use for Mapnik tasks. You need to restart Viking for a " +"change to this value to be used" +msgstr "" + +#: ../src/background.c:361 +msgid "Job" +msgstr "" + +#: ../src/background.c:365 +msgid "Progress" +msgstr "" + +#: ../src/background.c:373 +msgid "Viking Background Jobs" +msgstr "" + +#: ../src/bing.c:42 +msgid "Bing Aerial" +msgstr "" + +#: ../src/bing.c:48 +msgid "Bing" +msgstr "" + +#. VIK_GTK_WINDOW_FROM_WIDGET(vp) +#: ../src/bingmapsource.c:514 +msgid "Bing attribution Loading" +msgstr "" + +#: ../src/clipboard.c:95 +msgid "paste failed" +msgstr "" + +#: ../src/clipboard.c:105 +msgid "wrong clipboard data size" +msgstr "" + +#: ../src/clipboard.c:124 +#, c-format +msgid "" +"The clipboard contains sublayer data for %s layers. You must select a layer " +"of this type to paste the clipboard data." +msgstr "" + +#: ../src/clipboard.c:264 +msgid "" +"In order to paste a waypoint, please select an appropriate layer to paste " +"into." +msgstr "" + +#: ../src/dialog.c:60 +msgid "Go to Lat/Lon" +msgstr "" + +#: ../src/dialog.c:69 ../src/viktrwlayer_wpwin.c:173 +msgid "Latitude:" +msgstr "" + +#: ../src/dialog.c:72 ../src/viktrwlayer_wpwin.c:177 +msgid "Longitude:" +msgstr "" + +#: ../src/dialog.c:102 +msgid "Go to UTM" +msgstr "" + +#: ../src/dialog.c:114 +msgid "Northing:" +msgstr "" + +#: ../src/dialog.c:117 +msgid "Easting:" +msgstr "" + +#: ../src/dialog.c:121 ../src/vikgeoreflayer.c:902 +msgid "Zone:" +msgstr "" + +#: ../src/dialog.c:124 ../src/vikgeoreflayer.c:904 +msgid "Letter:" +msgstr "" + +#: ../src/dialog.c:246 ../src/geonamessearch.c:238 +#: ../src/datasource_osm_my_traces.c:505 +msgid "Nothing was selected" +msgstr "" + +#: ../src/dialog.c:254 +msgid "Add Route" +msgstr "" + +#: ../src/dialog.c:254 +msgid "Add Track" +msgstr "" + +#: ../src/dialog.c:262 +msgid "Route Name:" +msgstr "" + +#: ../src/dialog.c:262 +msgid "Track Name:" +msgstr "" + +#: ../src/dialog.c:282 +msgid "Please enter a name for the track." +msgstr "" + +#: ../src/dialog.c:311 +msgid "Today" +msgstr "" + +#: ../src/dialog.c:393 +msgid "Zoom Factors..." +msgstr "" + +#: ../src/dialog.c:407 +msgid "Zoom factor (in meters per pixel):" +msgstr "" + +#: ../src/dialog.c:408 +msgid "X (easting): " +msgstr "" + +#: ../src/dialog.c:409 +msgid "Y (northing): " +msgstr "" + +#: ../src/dialog.c:414 +msgid "X and Y zoom factors must be equal" +msgstr "" + +#: ../src/dialog.c:469 +msgid "1 min" +msgstr "" + +#: ../src/dialog.c:470 +msgid "1 hour" +msgstr "" + +#: ../src/dialog.c:471 +msgid "1 day" +msgstr "" + +#: ../src/dialog.c:472 +msgid "Custom (in minutes):" +msgstr "" + +#: ../src/dialog.c:608 +#, c-format +msgid "" +"2003-2008, Evan Battaglia\n" +"2008-%s, Viking's contributors" +msgstr "" + +#: ../src/dialog.c:609 +msgid "GPS Data and Topo Analyzer, Explorer, and Manager." +msgstr "" + +#: ../src/dialog.c:610 +msgid "" +"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.\n" +"\n" +"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.\n" +"\n" +"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., 59 Temple " +"Place, Suite 330, Boston, MA 02111-1307, USA" +msgstr "" + +#: ../src/dialog.c:703 +msgid "Translation is coordinated on http://launchpad.net/viking" +msgstr "" + +#: ../src/dialog.c:713 +msgid "Download along track" +msgstr "" + +#: ../src/dialog.c:720 +msgid "Map type:" +msgstr "" + +#: ../src/dialog.c:726 +msgid "Zoom level:" +msgstr "" + +#: ../src/dialog.c:766 +#, c-format +msgid "The map data is licensed: %s." +msgstr "" + +#: ../src/dialog.c:769 +#, c-format +msgid "" +"The data provided by '%s' are licensed under the following license: " +"%s." +msgstr "" + +#: ../src/dialog.c:773 +msgid "Open license" +msgstr "" + +#: ../src/expedia.c:54 +msgid "Expedia Street Maps" +msgstr "" + +#: ../src/expedia.c:82 +msgid "Invalid expedia altitude" +msgstr "" + +#: ../src/expedia.c:113 +#, c-format +msgid "" +"Couldn't open EXPEDIA image file (right after successful download! Please " +"report and delete image file!): %s" +msgstr "" + +#: ../src/expedia.c:126 +#, c-format +msgid "" +"Couldn't save EXPEDIA image file (right after successful download! Please " +"report and delete image file!): %s" +msgstr "" + +#: ../src/geonamessearch.c:115 +msgid "Search" +msgstr "" + +#: ../src/geonamessearch.c:117 +msgid "No entries found!" +msgstr "" + +#. NB could allow columns to be shifted around by doing this after each new +#. gtk_tree_view_column_set_reorderable ( column, TRUE ); +#. However I don't think is that useful, so I haven't put it in +#: ../src/geonamessearch.c:171 ../src/datasource_osm_my_traces.c:422 +#: ../src/viktrwlayer_tracklist.c:621 ../src/viktrwlayer_waypointlist.c:618 +msgid "Name" +msgstr "" + +#: ../src/geonamessearch.c:176 +msgid "Feature" +msgstr "" + +#: ../src/geonamessearch.c:181 ../src/datasource_osm_my_traces.c:437 +msgid "Lat/Lon" +msgstr "" + +#: ../src/geonamessearch.c:264 ../src/googlesearch.c:101 ../src/vikgoto.c:430 +msgid "couldn't map temp file" +msgstr "" + +#: ../src/geonamessearch.c:459 +msgid "Select articles" +msgstr "" + +#: ../src/geonamessearch.c:459 +msgid "Select the articles you want to add." +msgstr "" + +#: ../src/geonamessearch.c:475 +msgid "city" +msgstr "" + +#: ../src/geonamessearch.c:477 +msgid "edu" +msgstr "" + +#: ../src/geonamessearch.c:479 +msgid "airport" +msgstr "" + +#: ../src/geonamessearch.c:481 +msgid "mountain" +msgstr "" + +#: ../src/geonamessearch.c:483 +msgid "forest" +msgstr "" + +#: ../src/geonamessearch.c:485 +msgid "church" +msgstr "" + +#: ../src/geojson.c:74 +#, c-format +msgid "%s command failed: %s" +msgstr "" + +#: ../src/geojson.c:146 ../src/gpx.c:1317 +#, c-format +msgid "failed to open temporary file: %s" +msgstr "" + +#: ../src/globals.c:67 +msgid "DDD" +msgstr "" + +#: ../src/globals.c:67 +msgid "DMM" +msgstr "" + +#: ../src/globals.c:67 +msgid "DMS" +msgstr "" + +#: ../src/globals.c:67 +msgid "Raw" +msgstr "" + +#: ../src/globals.c:68 +msgid "Kilometres" +msgstr "" + +#: ../src/globals.c:68 +msgid "Miles" +msgstr "" + +#: ../src/globals.c:68 +msgid "Nautical Miles" +msgstr "" + +#. VIK_UNITS_SPEED_KILOMETRES_PER_HOUR: +#: ../src/globals.c:69 ../src/viktrwlayer_tracklist.c:655 ../src/vikutils.c:100 +msgid "km/h" +msgstr "" + +#: ../src/globals.c:69 ../src/viktrwlayer_tracklist.c:656 ../src/vikutils.c:78 +msgid "mph" +msgstr "" + +#. VIK_UNITS_SPEED_METRES_PER_SECOND: +#: ../src/globals.c:69 ../src/viktrwlayer_tracklist.c:663 ../src/vikutils.c:81 +msgid "m/s" +msgstr "" + +#: ../src/globals.c:69 ../src/viktrwlayer_tracklist.c:657 ../src/vikutils.c:84 +msgid "knots" +msgstr "" + +#: ../src/globals.c:69 ../src/viktrwlayer_tracklist.c:658 ../src/vikutils.c:87 +msgid "s/km" +msgstr "" + +#: ../src/globals.c:69 ../src/viktrwlayer_tracklist.c:659 ../src/vikutils.c:90 +msgid "min/km" +msgstr "" + +#: ../src/globals.c:69 +msgid "s/mi" +msgstr "" + +#: ../src/globals.c:69 ../src/viktrwlayer_tracklist.c:661 ../src/vikutils.c:96 +msgid "min/mi" +msgstr "" + +#: ../src/globals.c:70 +msgid "Metres" +msgstr "" + +#: ../src/globals.c:70 +msgid "Feet" +msgstr "" + +#: ../src/globals.c:73 +msgid "Locale" +msgstr "" + +#: ../src/globals.c:73 +msgid "World" +msgstr "" + +#: ../src/globals.c:73 +msgid "UTC" +msgstr "" + +#: ../src/globals.c:76 +msgid "Degree format:" +msgstr "" + +#: ../src/globals.c:77 +msgid "Distance units:" +msgstr "" + +#: ../src/globals.c:78 +msgid "Speed units:" +msgstr "" + +#: ../src/globals.c:79 +msgid "Height units:" +msgstr "" + +#: ../src/globals.c:80 +msgid "Use large waypoint icons:" +msgstr "" + +#: ../src/globals.c:81 +msgid "Default latitude:" +msgstr "" + +#: ../src/globals.c:82 +msgid "Default longitude:" +msgstr "" + +#: ../src/globals.c:83 +msgid "Time Display:" +msgstr "" + +#: ../src/globals.c:84 +msgid "" +"Display times according to the reference frame. Locale is the user's system " +"setting. World is relative to the location of the object." +msgstr "" + +#: ../src/globals.c:90 +msgid "Alphabetical" +msgstr "" + +#: ../src/globals.c:90 ../src/datasource_osm_my_traces.c:432 +msgid "Time" +msgstr "" + +#: ../src/globals.c:90 +msgid "Creation" +msgstr "" + +#: ../src/globals.c:91 +msgid "Title Case" +msgstr "" + +#: ../src/globals.c:91 +msgid "Lowercase" +msgstr "" + +#: ../src/globals.c:94 +msgid "KML File Export Units:" +msgstr "" + +#: ../src/globals.c:95 +msgid "GPX Track Order:" +msgstr "" + +#: ../src/globals.c:96 +msgid "GPX Waypoint Symbols:" +msgstr "" + +#: ../src/globals.c:97 +msgid "" +"Save GPX Waypoint Symbol names in the specified case. May be useful for " +"compatibility with various devices" +msgstr "" + +#: ../src/globals.c:98 +msgid "GPX Creator:" +msgstr "" + +#: ../src/globals.c:99 +msgid "" +"The creator value when writing a GPX file. Otherwise when blank a default is " +"used." +msgstr "" + +#: ../src/globals.c:104 +msgid "Image Viewer:" +msgstr "" + +#: ../src/globals.c:109 +msgid "External GPX Program 1:" +msgstr "" + +#: ../src/globals.c:110 +msgid "External GPX Program 2:" +msgstr "" + +#: ../src/globals.c:113 +msgid "Absolute" +msgstr "" + +#: ../src/globals.c:113 +msgid "Relative" +msgstr "" + +#: ../src/globals.c:117 +msgid "Save File Reference Mode:" +msgstr "" + +#: ../src/globals.c:118 +msgid "" +"When saving a Viking .vik file, this determines how the directory paths of " +"filenames are written." +msgstr "" + +#: ../src/globals.c:119 +msgid "Ask for Name before Track Creation:" +msgstr "" + +#: ../src/globals.c:120 +msgid "Show Tooltip during Track Creation:" +msgstr "" + +#: ../src/globals.c:121 +msgid "The number of recent files:" +msgstr "" + +#: ../src/globals.c:122 +msgid "" +"Only applies to new windows or on application restart. -1 means all " +"available files." +msgstr "" + +#: ../src/globals.c:123 +msgid "Open files in selected layer:" +msgstr "" + +#: ../src/globals.c:124 +msgid "Open files (but not .vik ones) into the selected TrackWaypoint layer." +msgstr "" + +#: ../src/globals.c:125 +msgid "Show calendar day names:" +msgstr "" + +#: ../src/globals.c:128 +msgid "Home Location" +msgstr "" + +#: ../src/globals.c:128 +msgid "Last Location" +msgstr "" + +#: ../src/globals.c:128 +msgid "Specified File" +msgstr "" + +#: ../src/globals.c:128 +msgid "Auto Location" +msgstr "" + +#: ../src/globals.c:131 +msgid "Restore Window Setup:" +msgstr "" + +#: ../src/globals.c:132 +msgid "Restore window size and layout" +msgstr "" + +#: ../src/globals.c:133 +msgid "Add a Default Map Layer:" +msgstr "" + +#: ../src/globals.c:134 +msgid "" +"The default map layer added is defined by the Layer Defaults. Use the menu " +"Edit->Layer Defaults->Map... to change the map type and other values." +msgstr "" + +#: ../src/globals.c:135 +msgid "Startup Method:" +msgstr "" + +#: ../src/globals.c:136 +msgid "Startup File:" +msgstr "" + +#: ../src/globals.c:137 +msgid "" +"The default file to load on startup. Only applies when the startup method is " +"set to 'Specified File'" +msgstr "" + +#: ../src/globals.c:138 +msgid "Check For New Version:" +msgstr "" + +#: ../src/globals.c:139 +msgid "Periodically check to see if a new version of Viking is available" +msgstr "" + +#. Defaults for the options are setup here +#: ../src/globals.c:176 +msgid "General" +msgstr "" + +#. New Tab +#: ../src/globals.c:204 +msgid "Startup" +msgstr "" + +#. New Tab +#: ../src/globals.c:222 +msgid "Export/External" +msgstr "" + +#. 'Advanced' Properties +#: ../src/globals.c:249 +msgid "Advanced" +msgstr "" + +#. Webtools +#: ../src/google.c:39 +msgid "Google" +msgstr "" + +#. If there is an actual description field it will overwrite this value +#: ../src/gpx.c:264 +#, c-format +msgid "Created by: %s" +msgstr "" + +#: ../src/datasource_bfilter.c:43 +msgid "Max number of points:" +msgstr "" + +#: ../src/datasource_bfilter.c:84 +msgid "Simplify All Tracks..." +msgstr "" + +#: ../src/datasource_bfilter.c:85 +msgid "Simplified Tracks" +msgstr "" + +#. { VIK_LAYER_NUM_TYPES, "compressmethod", VIK_LAYER_PARAM_UINT, VIK_LAYER_GROUP_NONE, N_("Simplify Method:"), VIK_LAYER_WIDGET_COMBOBOX, compress_method, NULL, NULL, NULL, NULL, NULL }, +#: ../src/datasource_bfilter.c:111 +msgid "Error Factor:" +msgstr "" + +#: ../src/datasource_bfilter.c:112 +msgid "" +"Specifies the maximum allowable error that may be introduced by removing a " +"single point by the crosstrack method. See the manual or GPSBabel Simplify " +"Filter documentation for more detail." +msgstr "" + +#: ../src/datasource_bfilter.c:166 +msgid "Compress Tracks..." +msgstr "" + +#: ../src/datasource_bfilter.c:167 +msgid "Compressed Tracks" +msgstr "" + +#: ../src/datasource_bfilter.c:197 ../src/datasource_bfilter.c:198 +msgid "Remove Duplicate Waypoints" +msgstr "" + +#: ../src/datasource_bfilter.c:221 +msgid "Manual filter:" +msgstr "" + +#: ../src/datasource_bfilter.c:222 +msgid "Manual filter command: e.g. 'swap'." +msgstr "" + +#: ../src/datasource_bfilter.c:233 ../src/datasource_bfilter.c:234 +msgid "Manual filter" +msgstr "" + +#: ../src/datasource_bfilter.c:262 +msgid "Waypoints Inside This" +msgstr "" + +#: ../src/datasource_bfilter.c:263 ../src/datasource_bfilter.c:292 +msgid "Polygonized Layer" +msgstr "" + +#: ../src/datasource_bfilter.c:291 +msgid "Waypoints Outside This" +msgstr "" + +#: ../src/datasource_file.c:61 +msgid "Import file with GPSBabel" +msgstr "" + +#: ../src/datasource_file.c:62 +msgid "Imported file" +msgstr "" + +#. The file selector +#: ../src/datasource_file.c:129 +msgid "File:" +msgstr "" + +#: ../src/datasource_file.c:130 +msgid "File to import" +msgstr "" + +#: ../src/datasource_file.c:137 +msgid "All files" +msgstr "" + +#. The file format selector +#: ../src/datasource_file.c:144 ../src/datasource_url.c:106 +msgid "File type:" +msgstr "" + +#: ../src/datasource_file.c:189 +#, c-format +msgid "using babel args '%s' and file '%s'" +msgstr "" + +#: ../src/datasource_gc.c:67 +msgid "Download Geocaches" +msgstr "" + +#: ../src/datasource_gc.c:68 +msgid "Geocaching.com Caches" +msgstr "" + +#: ../src/datasource_gc.c:86 +msgid "geocaching.com username:" +msgstr "" + +#: ../src/datasource_gc.c:87 +msgid "geocaching.com password:" +msgstr "" + +#: ../src/datasource_gc.c:92 ../src/vikwindow.c:3502 +msgid "Geocaching" +msgstr "" + +#: ../src/datasource_gc.c:128 +#, c-format +msgid "" +"Can't find %s or %s in path! Check that you have installed it correctly." +msgstr "" + +#: ../src/datasource_gc.c:190 +msgid "Number geocaches:" +msgstr "" + +#: ../src/datasource_gc.c:192 +msgid "Centered around:" +msgstr "" + +#: ../src/datasource_gc.c:231 +msgid "Broken input - using some defaults" +msgstr "" + +#: ../src/datasource_geotag.c:51 +msgid "Create Waypoints from Geotagged Images" +msgstr "" + +#: ../src/datasource_geotag.c:52 +msgid "Geotagged Images" +msgstr "" + +#: ../src/datasource_geotag.c:102 ../src/datasource_geojson.c:93 +#: ../src/vikfileentry.c:171 ../src/vikwindow.c:3533 ../src/vikwindow.c:3610 +#: ../src/vikwindow.c:3641 ../src/vikwindow.c:4356 ../src/vikwindow.c:4649 +msgid "All" +msgstr "" + +#: ../src/datasource_geotag.c:107 ../src/vikfileentry.c:115 +#: ../src/viktrwlayer_geotag.c:637 ../src/vikwindow.c:3518 +#: ../src/vikwindow.c:4377 +msgid "JPG" +msgstr "" + +#: ../src/datasource_geotag.c:168 +#, c-format +msgid "Unable to create waypoint from %s" +msgstr "" + +#: ../src/datasource_geojson.c:46 +msgid "Acquire from GeoJSON" +msgstr "" + +#: ../src/datasource_geojson.c:47 ../src/datasource_geojson.c:98 +msgid "GeoJSON" +msgstr "" + +#: ../src/datasource_geojson.c:152 +#, c-format +msgid "Unable to import from: %s" +msgstr "" + +#: ../src/datasource_gps.c:54 +msgid "Acquire from GPS" +msgstr "" + +#: ../src/datasource_gps.c:55 +msgid "Acquired from GPS" +msgstr "" + +#: ../src/datasource_gps.c:258 +#, c-format +msgid "using cmd '%s' and file '%s'\n" +msgstr "" + +#: ../src/datasource_gps.c:353 ../src/vikgpslayer.c:966 +#, c-format +msgid "Downloading %d waypoint..." +msgid_plural "Downloading %d waypoints..." +msgstr[0] "" +msgstr[1] "" + +#: ../src/datasource_gps.c:358 ../src/vikgpslayer.c:971 +#, c-format +msgid "Downloading %d trackpoint..." +msgid_plural "Downloading %d trackpoints..." +msgstr[0] "" +msgstr[1] "" + +#: ../src/datasource_gps.c:363 ../src/vikgpslayer.c:976 +#, c-format +msgid "Downloading %d routepoint..." +msgid_plural "Downloading %d routepoints..." +msgstr[0] "" +msgstr[1] "" + +#: ../src/datasource_gps.c:386 ../src/datasource_gps.c:393 +#: ../src/datasource_gps.c:400 +#, c-format +msgid "Downloaded %d out of %d %s..." +msgstr "" + +#: ../src/datasource_gps.c:388 ../src/datasource_gps.c:395 +#: ../src/datasource_gps.c:402 +#, c-format +msgid "Downloaded %d %s." +msgstr "" + +#: ../src/datasource_gps.c:416 ../src/vikgpslayer.c:1134 +#, c-format +msgid "GPS Device: %s" +msgstr "" + +#: ../src/datasource_gps.c:428 ../src/vikgpslayer.c:1214 +msgid "Status: Working..." +msgstr "" + +#. NB gps_layer_inst_init() is performed after parameter registeration +#. thus to give the protocols some potential values use the old static list +#. TODO: find another way to use gps_layer_inst_init()? +#: ../src/datasource_gps.c:584 ../src/vikgpslayer.c:216 +msgid "GPS Protocol:" +msgstr "" + +#. List reassigned at runtime +#: ../src/datasource_gps.c:609 ../src/vikgpslayer.c:217 +msgid "Serial Port:" +msgstr "" + +#: ../src/datasource_gps.c:659 +msgid "" +"Turn Off After Transfer\n" +"(Garmin/NAViLink Only)" +msgstr "" + +#: ../src/datasource_gps.c:666 +msgid "Tracks:" +msgstr "" + +#: ../src/datasource_gps.c:673 +msgid "Routes:" +msgstr "" + +#: ../src/datasource_gps.c:680 +msgid "Waypoints:" +msgstr "" + +#: ../src/datasource_gps.c:756 ../src/vikgpslayer.c:1509 +msgid "GPS device: N/A" +msgstr "" + +#: ../src/datasource_osm.c:53 ../src/datasource_osm.c:54 +msgid "OSM traces" +msgstr "" + +#: ../src/datasource_osm.c:89 +msgid "Page number:" +msgstr "" + +#: ../src/datasource_osm_my_traces.c:59 ../src/datasource_osm_my_traces.c:60 +msgid "OSM My Traces" +msgstr "" + +#: ../src/datasource_osm_my_traces.c:106 ../src/osm-traces.c:684 +msgid "Email/username:" +msgstr "" + +#: ../src/datasource_osm_my_traces.c:111 +msgid "The email or username used to login to OSM" +msgstr "" + +#: ../src/datasource_osm_my_traces.c:113 ../src/osm-traces.c:692 +msgid "Password:" +msgstr "" + +#: ../src/datasource_osm_my_traces.c:116 +msgid "The password used to login to OSM" +msgstr "" + +#: ../src/datasource_osm_my_traces.c:427 ../src/viktrwlayer.c:689 +msgid "Description" +msgstr "" + +#: ../src/datasource_osm_my_traces.c:442 +msgid "Privacy" +msgstr "" + +#: ../src/datasource_osm_my_traces.c:449 +msgid "Within Current View" +msgstr "" + +#: ../src/datasource_osm_my_traces.c:516 +msgid "GPS Traces" +msgstr "" + +#: ../src/datasource_osm_my_traces.c:518 +msgid "None found!" +msgstr "" + +#: ../src/datasource_osm_my_traces.c:569 +msgid "Ensure the OSM access token preferences are setup." +msgstr "" + +#: ../src/datasource_osm_my_traces.c:645 +msgid "My OSM Traces" +msgstr "" + +#. Report errors to the status bar +#: ../src/datasource_osm_my_traces.c:667 +#, c-format +msgid "Unable to get trace: %s" +msgstr "" + +#: ../src/datasource_routing.c:56 ../src/datasource_routing.c:57 +msgid "Directions" +msgstr "" + +#: ../src/datasource_routing.c:90 +msgid "No routing engines with directions available" +msgstr "" + +#. Engine selector +#: ../src/datasource_routing.c:99 +msgid "Engine:" +msgstr "" + +#. From and To entries +#: ../src/datasource_routing.c:104 +msgid "From:" +msgstr "" + +#: ../src/datasource_routing.c:105 +msgid "To:" +msgstr "" + +#: ../src/datasource_url.c:48 +msgid "Acquire from URL" +msgstr "" + +#: ../src/datasource_url.c:49 +msgid "URL" +msgstr "" + +#: ../src/datasource_url.c:101 +msgid "URL:" +msgstr "" + +#. Only GPX (not using GPSbabel) +#: ../src/datasource_url.c:133 ../src/vikfileentry.c:161 +#: ../src/vikwindow.c:3513 ../src/vikwindow.c:3603 +msgid "GPX" +msgstr "" + +#: ../src/datasource_wikipedia.c:32 +msgid "Create Waypoints from Wikipedia Articles" +msgstr "" + +#: ../src/datasource_wikipedia.c:33 +msgid "Wikipedia Waypoints" +msgstr "" + +#: ../src/dem.c:66 ../src/dem.c:80 +msgid "Invalid DEM" +msgstr "" + +#: ../src/dem.c:122 +msgid "Invalid DEM header" +msgstr "" + +#: ../src/dem.c:191 ../src/dem.c:204 +msgid "Incorrect DEM Class B record: expected 1" +msgstr "" + +#: ../src/dem.c:289 ../src/download.c:176 +#, c-format +msgid "Couldn't map file %s: %s" +msgstr "" + +#: ../src/download.c:130 +msgid "Tile age (days):" +msgstr "" + +#: ../src/download.c:406 +#, c-format +msgid "Download error: %s" +msgstr "" + +#: ../src/download.c:490 +msgid "couldn't open temp file" +msgstr "" + +#: ../src/file.c:458 ../src/file.c:463 +#, c-format +msgid "Draw mode '%s' no more supported" +msgstr "" + +#: ../src/geotag_exif.c:621 +msgid "Not enough memory." +msgstr "" + +#: ../src/geotag_exif.c:639 +msgid "Setting a value for this tag is unsupported!" +msgstr "" + +#: ../src/geotag_exif.c:658 +#, c-format +msgid "Too few components specified (need %d, found %d)\n" +msgstr "" + +#: ../src/geotag_exif.c:662 +msgid "Numeric value expected\n" +msgstr "" + +#: ../src/geotag_exif.c:670 +msgid "This shouldn't happen!" +msgstr "" + +#: ../src/geotag_exif.c:740 +msgid "Not yet implemented!" +msgstr "" + +#: ../src/geotag_exif.c:753 +msgid "Warning; Too many components specified!" +msgstr "" + +#: ../src/osm-traces.c:87 +msgid "Identifiable (public w/ timestamps)" +msgstr "" + +#: ../src/osm-traces.c:88 +msgid "Trackable (private w/ timestamps)" +msgstr "" + +#: ../src/osm-traces.c:89 +msgid "Public" +msgstr "" + +#: ../src/osm-traces.c:90 +msgid "Private" +msgstr "" + +#: ../src/osm-traces.c:108 +msgid "Access Token:" +msgstr "" + +#: ../src/osm-traces.c:108 +msgid "Get New OSM Access Tokens" +msgstr "" + +#: ../src/osm-traces.c:109 +msgid "Access Token Key:" +msgstr "" + +#: ../src/osm-traces.c:110 +msgid "Access Token Secret:" +msgstr "" + +#: ../src/osm-traces.c:111 +msgid "OSM username:" +msgstr "" + +#: ../src/osm-traces.c:112 +msgid "OSM password:" +msgstr "" + +#. Check to really override existing values... +#: ../src/osm-traces.c:263 +msgid "Do you want to overwrite existing values?" +msgstr "" + +#: ../src/osm-traces.c:275 +msgid "Not able to generate OSM request tokens." +msgstr "" + +#: ../src/osm-traces.c:299 +msgid "" +"Waiting for authorization approval.\n" +"Ensure you have granted access at the website before continuing here." +msgstr "" + +#: ../src/osm-traces.c:315 +msgid "No Authorization." +msgstr "" + +#: ../src/osm-traces.c:354 +msgid "" +"OSM Username and Password preferences are not required anymore. You can now " +"remove them." +msgstr "" + +#. Preferences +#: ../src/osm-traces.c:379 +msgid "OpenStreetMap Traces" +msgstr "" + +#: ../src/osm-traces.c:504 +#, c-format +msgid "failed to upload data: HTTP response is %ld" +msgstr "" + +#: ../src/osm-traces.c:509 +#, c-format +msgid "curl_easy_getinfo failed: %d" +msgstr "" + +#: ../src/osm-traces.c:514 +#, c-format +msgid "curl request failed: %s" +msgstr "" + +#. Success +#: ../src/osm-traces.c:592 +msgid "Uploaded to OSM" +msgstr "" + +#: ../src/osm-traces.c:596 +msgid "" +"FAILED TO UPLOAD DATA TO OSM - Ensure the OSM access token preferences are " +"setup." +msgstr "" + +#: ../src/osm-traces.c:599 +msgid "FAILED TO UPLOAD DATA TO OSM - CURL PROBLEM" +msgstr "" + +#: ../src/osm-traces.c:602 +msgid "FAILED TO UPLOAD DATA TO OSM" +msgstr "" + +#: ../src/osm-traces.c:602 +msgid "HTTP response code" +msgstr "" + +#: ../src/osm-traces.c:610 +#, c-format +msgid "failed to unlink temporary file: %s" +msgstr "" + +#: ../src/osm-traces.c:664 +msgid "OSM upload" +msgstr "" + +#: ../src/osm-traces.c:689 +msgid "" +"The email/username used as login\n" +"Enter the email/username you use to login into www.openstreetmap.org." +"" +msgstr "" + +#: ../src/osm-traces.c:697 +msgid "" +"The password used to login\n" +"Enter the password you use to login into www.openstreetmap.org." +msgstr "" + +#: ../src/osm-traces.c:703 +msgid "File's name:" +msgstr "" + +#: ../src/osm-traces.c:713 +msgid "" +"The name of the file on OSM\n" +"This is the name of the file created on the server.This is not the " +"name of the local file." +msgstr "" + +#: ../src/osm-traces.c:717 ../src/viktrwlayer_wpwin.c:197 +#: ../src/viktrwlayer_wpwin.c:199 +msgid "Description:" +msgstr "" + +#: ../src/osm-traces.c:731 +msgid "The description of the trace" +msgstr "" + +#: ../src/osm-traces.c:734 +msgid "Anonymize Times:" +msgstr "" + +#: ../src/osm-traces.c:739 +msgid "" +"Anonymize times of the trace.\n" +"You may choose to make the trace identifiable, yet mask the actual " +"real time values" +msgstr "" + +#: ../src/osm-traces.c:743 +msgid "Tags:" +msgstr "" + +#: ../src/osm-traces.c:751 +msgid "The tags associated to the trace" +msgstr "" + +#: ../src/osm-traces.c:816 +#, c-format +msgid "Uploading %s to OSM" +msgstr "" + +#: ../src/mapcache.c:67 +msgid "Map cache memory size (MB):" +msgstr "" + +#. NB Can have a couple hundred fonts loaded when using system directories +#. So ATM don't list them all - otherwise need better GUI feedback display. +#: ../src/mapnik_interface.cpp:324 +#, c-format +msgid "" +"%s %s\n" +"Plugins=%sFonts loaded=%d" +msgstr "" + +#: ../src/mapnik_interface.cpp:325 ../src/vikmapniklayer.c:278 +msgid "Mapnik" +msgstr "" + +#: ../src/print.c:51 ../src/viktrwlayer.c:572 +msgid "None" +msgstr "" + +#: ../src/print.c:52 +msgid "Horizontally" +msgstr "" + +#: ../src/print.c:53 +msgid "Vertically" +msgstr "" + +#: ../src/print.c:54 +msgid "Both" +msgstr "" + +#: ../src/print.c:118 +msgid "Image Settings" +msgstr "" + +#: ../src/print.c:551 +msgid "done" +msgstr "" + +#. Page Size +#: ../src/print.c:580 +msgid "_Adjust Page Size and Orientation" +msgstr "" + +#: ../src/print.c:596 +msgid "C_enter:" +msgstr "" + +#. ignore page margins +#: ../src/print.c:614 +msgid "Ignore Page _Margins" +msgstr "" + +#: ../src/print.c:633 +msgid "Image S_ize:" +msgstr "" + +#: ../src/ui_util.c:88 +#, c-format +msgid "Could not launch web browser. %s" +msgstr "" + +#: ../src/ui_util.c:101 +#, c-format +msgid "Could not create new email. %s" +msgstr "" + +#: ../src/vikcoordlayer.c:57 +msgid "Color:" +msgstr "" + +#: ../src/vikcoordlayer.c:58 +msgid "Minutes Width:" +msgstr "" + +#: ../src/vikcoordlayer.c:59 +msgid "Line Thickness:" +msgstr "" + +#: ../src/vikcoordlayer.c:66 +msgid "Coordinate" +msgstr "" + +#: ../src/main.c:92 +#, c-format +msgid "Ignoring Xlib error: error code %d request code %d\n" +msgstr "" + +#: ../src/main.c:111 +msgid "Enable debug output" +msgstr "" + +#: ../src/main.c:112 +msgid "Enable verbose output" +msgstr "" + +#: ../src/main.c:113 +msgid "Show version" +msgstr "" + +#: ../src/main.c:114 +msgid "Latitude in decimal degrees" +msgstr "" + +#: ../src/main.c:115 +msgid "Longitude in decimal degrees" +msgstr "" + +#: ../src/main.c:116 +msgid "Zoom Level (OSM). Value can be 0 - 22" +msgstr "" + +#: ../src/main.c:117 +msgid "Add a map layer by id value. Use 0 for the default map." +msgstr "" + +#: ../src/main.c:160 +#, c-format +msgid "" +"%s %s\n" +"Copyright (c) 2003-2008 Evan Battaglia\n" +"Copyright (c) 2008-%s Viking's contributors\n" +msgstr "" + +#: ../src/osm.c:50 +msgid "OpenStreetMap (Mapnik)" +msgstr "" + +#: ../src/osm.c:65 +msgid "OpenStreetMap (Cycle)" +msgstr "" + +#: ../src/osm.c:79 +msgid "OpenStreetMap (Transport)" +msgstr "" + +#: ../src/osm.c:95 +msgid "OpenStreetMap (Humanitarian)" +msgstr "" + +#: ../src/osm.c:111 +msgid "On Disk OSM Tile Format" +msgstr "" + +#: ../src/osm.c:121 +msgid "MBTiles File" +msgstr "" + +#: ../src/osm.c:132 +msgid "OSM Metatiles" +msgstr "" + +#: ../src/osm.c:146 +msgid "Mapbox Outdoors" +msgstr "" + +#: ../src/osm.c:153 +msgid "Mapbox Specific" +msgstr "" + +#: ../src/osm.c:170 +msgid "OSM (view)" +msgstr "" + +#: ../src/osm.c:174 +msgid "OSM (edit)" +msgstr "" + +#. Note the use of positional parameters +#: ../src/osm.c:179 +msgid "OSM (query)" +msgstr "" + +#: ../src/osm.c:183 +msgid "OSM (render)" +msgstr "" + +#. Example: http://127.0.0.1:8111/load_and_zoom?left=8.19&right=8.20&top=48.605&bottom=48.590&select=node413602999 +#. JOSM or merkaartor must already be running with remote interface enabled +#: ../src/osm.c:190 +msgid "Local port 8111 (eg JOSM)" +msgstr "" + +#: ../src/osm.c:195 +msgid "Geofabrik Map Compare" +msgstr "" + +#: ../src/osm.c:203 +msgid "OpenStreetMap Notes" +msgstr "" + +#. Not really OSM but can't be bothered to create somewhere else to put it... +#: ../src/osm.c:221 +msgid "Wikimedia Toolserver GeoHack" +msgstr "" + +#: ../src/preferences.c:195 +msgid "Preferences" +msgstr "" + +#: ../src/toolbar.c:91 ../src/toolbar.c:92 +msgid "System Default" +msgstr "" + +#: ../src/toolbar.c:91 ../src/viktrwlayer.c:563 +msgid "Small" +msgstr "" + +#: ../src/toolbar.c:91 ../src/viktrwlayer.c:564 +msgid "Medium" +msgstr "" + +#: ../src/toolbar.c:91 ../src/viktrwlayer.c:565 +msgid "Large" +msgstr "" + +#: ../src/toolbar.c:92 +msgid "Icons Only" +msgstr "" + +#: ../src/toolbar.c:92 +msgid "Text Only" +msgstr "" + +#: ../src/toolbar.c:92 +msgid "Icons and Text" +msgstr "" + +#: ../src/toolbar.c:106 +msgid "Append to Menu:" +msgstr "" + +#: ../src/toolbar.c:107 +msgid "Pack the toolbar to the main menu to save vertical space" +msgstr "" + +#: ../src/toolbar.c:108 +msgid "Icon Size:" +msgstr "" + +#: ../src/toolbar.c:110 +msgid "Icon Style:" +msgstr "" + +#: ../src/toolbar.c:112 +msgid "Customize:" +msgstr "" + +#: ../src/toolbar.c:112 +msgid "Customize Buttons" +msgstr "" + +#. Preferences +#: ../src/toolbar.c:145 +msgid "Toolbar" +msgstr "" + +#: ../src/toolbar.c:312 +msgid "_Customize" +msgstr "" + +#: ../src/toolbar.c:641 +msgid "Separator" +msgstr "" + +#: ../src/toolbar.c:642 +msgid "--- Separator ---" +msgstr "" + +#: ../src/toolbar.c:1007 +msgid "Customize Toolbar" +msgstr "" + +#: ../src/toolbar.c:1028 +msgid "" +"Select items to be displayed on the toolbar. Items can be reordered by drag " +"and drop." +msgstr "" + +#: ../src/toolbar.c:1044 +msgid "Available Items" +msgstr "" + +#: ../src/toolbar.c:1065 +msgid "Displayed Items" +msgstr "" + +#: ../src/viklayer_defaults.c:232 +#, c-format +msgid "Could not open file: %s" +msgstr "" + +#: ../src/viklayer_defaults.c:304 +msgid "Layer Defaults" +msgstr "" + +#: ../src/uibuilder.c:196 +msgid "Take care that this password will be stored clearly in a plain file." +msgstr "" + +#: ../src/uibuilder.c:628 ../src/viktrwlayer_export.c:188 +#: ../src/viktrwlayer_export.c:304 ../src/vikwindow.c:3666 +#: ../src/vikwindow.c:4408 +#, c-format +msgid "The file \"%s\" exists, do you wish to overwrite it?" +msgstr "" + +#: ../src/vikaggregatelayer.c:41 +msgid "Aggregate" +msgstr "" + +#: ../src/vikaggregatelayer.c:528 ../src/viktrwlayer.c:11700 +#, c-format +msgid "%s: Waypoint List" +msgstr "" + +#: ../src/vikaggregatelayer.c:570 +msgid "Search by Date" +msgstr "" + +#: ../src/vikaggregatelayer.c:576 +msgid "No items found with the requested date." +msgstr "" + +#: ../src/vikaggregatelayer.c:615 ../src/viktrwlayer.c:11691 +#, c-format +msgid "%s: Track and Route List" +msgstr "" + +#: ../src/vikaggregatelayer.c:681 ../src/viktrwlayer.c:8346 +#: ../src/viktrwlayer.c:8417 ../src/viktrwlayer.c:8494 +msgid "_Visibility" +msgstr "" + +#: ../src/vikaggregatelayer.c:686 +msgid "_Show All" +msgstr "" + +#: ../src/vikaggregatelayer.c:692 +msgid "_Hide All" +msgstr "" + +#: ../src/vikaggregatelayer.c:698 ../src/viktrwlayer.c:8363 +#: ../src/viktrwlayer.c:8434 ../src/viktrwlayer.c:8511 +msgid "_Toggle" +msgstr "" + +#: ../src/vikaggregatelayer.c:705 ../src/viktrwlayer.c:8532 +msgid "_Sort" +msgstr "" + +#: ../src/vikaggregatelayer.c:711 ../src/viktrwlayer.c:8538 +msgid "Name _Ascending" +msgstr "" + +#: ../src/vikaggregatelayer.c:717 ../src/viktrwlayer.c:8544 +msgid "Name _Descending" +msgstr "" + +#: ../src/vikaggregatelayer.c:723 ../src/viktrwlayer.c:575 +#: ../src/viktrwlayer.c:8550 +msgid "Date Ascending" +msgstr "" + +#: ../src/vikaggregatelayer.c:729 ../src/viktrwlayer.c:576 +#: ../src/viktrwlayer.c:8556 +msgid "Date Descending" +msgstr "" + +#: ../src/vikaggregatelayer.c:735 ../src/viktrwlayer.c:8445 +#: ../src/viktrwlayer.c:8523 ../src/viktrwlayer.c:8595 +#: ../src/viktrwlayer_tracklist.c:296 +msgid "_Statistics" +msgstr "" + +#: ../src/vikaggregatelayer.c:740 ../src/viktrwlayer.c:4533 +msgid "Track _List..." +msgstr "" + +#: ../src/vikaggregatelayer.c:746 ../src/viktrwlayer.c:4540 +msgid "_Waypoint List..." +msgstr "" + +#: ../src/vikaggregatelayer.c:753 +msgid "Searc_h" +msgstr "" + +#: ../src/vikaggregatelayer.c:759 +msgid "By _Date..." +msgstr "" + +#: ../src/vikaggregatelayer.c:762 +msgid "Find the first item with a specified date" +msgstr "" + +#: ../src/vikaggregatelayer.c:765 +msgid "Load E_xternal Layers" +msgstr "" + +#. Could have a more complicated tooltip that numbers each type of layers, +#. but for now a simple overall count +#: ../src/vikaggregatelayer.c:1011 +#, c-format +msgid "One layer" +msgid_plural "%d layers" +msgstr[0] "" +msgstr[1] "" + +#: ../src/vikaggregatelayer.c:1014 +#, c-format +msgid "Empty" +msgstr "" + +#: ../src/vikdemlayer.c:86 +msgid "SRTM Global 90m (3 arcsec)" +msgstr "" + +#: ../src/vikdemlayer.c:94 +msgid "Absolute height" +msgstr "" + +#: ../src/vikdemlayer.c:95 +msgid "Height gradient" +msgstr "" + +#: ../src/vikdemlayer.c:120 +msgid "DEM Files:" +msgstr "" + +#: ../src/vikdemlayer.c:121 +msgid "Download Source:" +msgstr "" + +#: ../src/vikdemlayer.c:122 +msgid "Min Elev Color:" +msgstr "" + +#: ../src/vikdemlayer.c:123 ../src/viktrwlayer_wpwin.c:207 +msgid "Type:" +msgstr "" + +#: ../src/vikdemlayer.c:124 +msgid "Min Elev:" +msgstr "" + +#: ../src/vikdemlayer.c:125 +msgid "Max Elev:" +msgstr "" + +#: ../src/vikdemlayer.c:137 +msgid "_DEM Download" +msgstr "" + +#: ../src/vikdemlayer.c:137 +msgid "DEM Download" +msgstr "" + +#: ../src/vikdemlayer.c:192 +msgid "DEM" +msgstr "" + +#: ../src/vikdemlayer.c:304 +#, c-format +msgid "Number of files: %d" +msgstr "" + +#: ../src/vikdemlayer.c:446 +msgid "DEM Loading" +msgstr "" + +#: ../src/vikdemlayer.c:927 +#, c-format +msgid "No SRTM data available for %f, %f" +msgstr "" + +#: ../src/vikdemlayer.c:948 +#, c-format +msgid "DEM download failure for %f, %f" +msgstr "" + +#: ../src/vikdemlayer.c:954 +#, c-format +msgid "DEM write failure for %s" +msgstr "" + +#. Probably not over any land... +#: ../src/vikdemlayer.c:1201 +msgid "No DEM File Available" +msgstr "" + +#: ../src/vikdemlayer.c:1220 +#, c-format +msgid "" +"\n" +"Source: %s\n" +"\n" +"DEM File: %s\n" +"DEM File Timestamp: %s" +msgstr "" + +#: ../src/vikdemlayer.c:1224 +#, c-format +msgid "" +"Source: %s\n" +"\n" +"No DEM File!" +msgstr "" + +#: ../src/vikdemlayer.c:1264 +#, c-format +msgid "Downloading DEM %s" +msgstr "" + +#: ../src/vikdemlayer.c:1289 +msgid "_Show DEM File Information" +msgstr "" + +#: ../src/vikfileentry.c:72 +msgid "Browse..." +msgstr "" + +#: ../src/vikfileentry.c:103 +msgid "Choose file" +msgstr "" + +#: ../src/vikfileentry.c:120 ../src/vikwindow.c:4372 +msgid "PNG" +msgstr "" + +#: ../src/vikfileentry.c:125 +msgid "TIFF" +msgstr "" + +#: ../src/vikfileentry.c:133 +msgid "MBTiles" +msgstr "" + +#: ../src/vikfileentry.c:142 +msgid "XML" +msgstr "" + +#: ../src/vikfileentry.c:149 +msgid "MML" +msgstr "" + +#: ../src/vikfileentry.c:154 +msgid "MSS" +msgstr "" + +#: ../src/vikfilelist.c:49 +msgid "Choose file(s)" +msgstr "" + +#: ../src/vikfilelist.c:182 +msgid "Add..." +msgstr "" + +#: ../src/vikfilelist.c:183 +msgid "Delete" +msgstr "" + +#: ../src/vikgeoreflayer.c:97 +msgid "_Georef Move Map" +msgstr "" + +#: ../src/vikgeoreflayer.c:97 +msgid "Georef Move Map" +msgstr "" + +#: ../src/vikgeoreflayer.c:106 +msgid "Georef Z_oom Tool" +msgstr "" + +#: ../src/vikgeoreflayer.c:106 +msgid "Georef Zoom Tool" +msgstr "" + +#: ../src/vikgeoreflayer.c:117 +msgid "GeoRef Map" +msgstr "" + +#: ../src/vikgeoreflayer.c:214 +msgid "Auto Read World Files:" +msgstr "" + +#: ../src/vikgeoreflayer.c:215 +msgid "" +"Automatically attempt to read associated world file of a new image for a " +"GeoRef layer" +msgstr "" + +#: ../src/vikgeoreflayer.c:511 ../src/vikgeoreflayer.c:797 +#: ../src/vikmapslayer.c:1174 +#, c-format +msgid "Couldn't open image file: %s" +msgstr "" + +#: ../src/vikgeoreflayer.c:607 ../src/vikgeoreflayer.c:633 +msgid "Choose World file" +msgstr "" + +#: ../src/vikgeoreflayer.c:619 +msgid "The World file you requested could not be opened for reading." +msgstr "" + +#: ../src/vikgeoreflayer.c:621 +msgid "Unexpected end of file reading World file." +msgstr "" + +#: ../src/vikgeoreflayer.c:646 +msgid "The file you requested could not be opened for writing." +msgstr "" + +#: ../src/vikgeoreflayer.c:782 +msgid "Lower right corner values may not be consistent with upper right values" +msgstr "" + +#: ../src/vikgeoreflayer.c:806 +#, c-format +msgid "Invalid image size: %s" +msgstr "" + +#: ../src/vikgeoreflayer.c:831 ../src/viklayer.c:561 ../src/vikwindow.c:4891 +msgid "Layer Properties" +msgstr "" + +#: ../src/vikgeoreflayer.c:852 +msgid "World File Parameters:" +msgstr "" + +#: ../src/vikgeoreflayer.c:853 +msgid "Load From File..." +msgstr "" + +#: ../src/vikgeoreflayer.c:858 +msgid "Corner pixel easting:" +msgstr "" + +#: ../src/vikgeoreflayer.c:860 +msgid "the UTM \"easting\" value of the upper-left corner pixel of the map" +msgstr "" + +#: ../src/vikgeoreflayer.c:862 +msgid "Corner pixel northing:" +msgstr "" + +#: ../src/vikgeoreflayer.c:864 +msgid "the UTM \"northing\" value of the upper-left corner pixel of the map" +msgstr "" + +#: ../src/vikgeoreflayer.c:866 +msgid "X (easting) scale (mpp): " +msgstr "" + +#: ../src/vikgeoreflayer.c:867 +msgid "Y (northing) scale (mpp): " +msgstr "" + +#: ../src/vikgeoreflayer.c:870 +msgid "the scale of the map in the X direction (meters per pixel)" +msgstr "" + +#: ../src/vikgeoreflayer.c:872 +msgid "the scale of the map in the Y direction (meters per pixel)" +msgstr "" + +#: ../src/vikgeoreflayer.c:874 +msgid "Map Image:" +msgstr "" + +#: ../src/vikgeoreflayer.c:919 +msgid "Upper left latitude:" +msgstr "" + +#: ../src/vikgeoreflayer.c:921 +msgid "Upper left longitude:" +msgstr "" + +#: ../src/vikgeoreflayer.c:923 +msgid "Lower right latitude:" +msgstr "" + +#: ../src/vikgeoreflayer.c:925 +msgid "Lower right longitude:" +msgstr "" + +#: ../src/vikgeoreflayer.c:937 +msgid "Calculate MPP values from coordinates" +msgstr "" + +#: ../src/vikgeoreflayer.c:938 +msgid "" +"Enter all corner coordinates before calculating the MPP values from the " +"image size" +msgstr "" + +#: ../src/vikgeoreflayer.c:948 +msgid "UTM" +msgstr "" + +#: ../src/vikgeoreflayer.c:949 +msgid "Latitude/Longitude" +msgstr "" + +#: ../src/vikgeoreflayer.c:957 ../src/vikmapniklayer.c:82 +#: ../src/vikmapslayer.c:158 +msgid "Alpha:" +msgstr "" + +#. Now with icons +#: ../src/vikgeoreflayer.c:1062 +msgid "_Zoom to Fit Map" +msgstr "" + +#: ../src/vikgeoreflayer.c:1068 +msgid "_Goto Map Center" +msgstr "" + +#: ../src/vikgeoreflayer.c:1074 +msgid "_Export to World File" +msgstr "" + +#: ../src/vikgoto.c:98 +msgid "No goto tool available." +msgstr "" + +#: ../src/vikgoto.c:295 +msgid "goto" +msgstr "" + +#: ../src/vikgoto.c:297 +msgid "goto provider:" +msgstr "" + +#: ../src/vikgoto.c:312 +msgid "Enter address or place name:" +msgstr "" + +#: ../src/vikgoto.c:487 +msgid "Locality" +msgstr "" + +#: ../src/vikgpslayer.c:137 +msgid "Data Mode" +msgstr "" + +#: ../src/vikgpslayer.c:139 +msgid "Realtime Tracking Mode" +msgstr "" + +#: ../src/vikgpslayer.c:176 +msgid "Keep vehicle at center" +msgstr "" + +#: ../src/vikgpslayer.c:177 +msgid "Keep vehicle on screen" +msgstr "" + +#: ../src/vikgpslayer.c:178 +msgid "Disable" +msgstr "" + +#: ../src/vikgpslayer.c:218 +msgid "Download Tracks:" +msgstr "" + +#: ../src/vikgpslayer.c:219 +msgid "Upload Tracks:" +msgstr "" + +#: ../src/vikgpslayer.c:220 +msgid "Download Routes:" +msgstr "" + +#: ../src/vikgpslayer.c:221 +msgid "Upload Routes:" +msgstr "" + +#: ../src/vikgpslayer.c:222 +msgid "Download Waypoints:" +msgstr "" + +#: ../src/vikgpslayer.c:223 +msgid "Upload Waypoints:" +msgstr "" + +#: ../src/vikgpslayer.c:225 +msgid "Recording tracks" +msgstr "" + +#: ../src/vikgpslayer.c:226 +msgid "Jump to current position on start" +msgstr "" + +#: ../src/vikgpslayer.c:227 +msgid "Moving Map Method:" +msgstr "" + +#: ../src/vikgpslayer.c:228 +msgid "Update Statusbar:" +msgstr "" + +#: ../src/vikgpslayer.c:228 +msgid "Display information in the statusbar on GPS updates" +msgstr "" + +#: ../src/vikgpslayer.c:229 +msgid "Auto Connect" +msgstr "" + +#: ../src/vikgpslayer.c:229 +msgid "Automatically connect to GPSD" +msgstr "" + +#: ../src/vikgpslayer.c:230 +msgid "Gpsd Host:" +msgstr "" + +#: ../src/vikgpslayer.c:231 +msgid "Gpsd Port:" +msgstr "" + +#: ../src/vikgpslayer.c:232 +msgid "Gpsd Retry Interval (seconds):" +msgstr "" + +#: ../src/vikgpslayer.c:254 +msgid "GPS" +msgstr "" + +#: ../src/vikgpslayer.c:320 ../src/vikgpslayer.c:1504 +msgid "GPS Download" +msgstr "" + +#: ../src/vikgpslayer.c:320 ../src/vikgpslayer.c:1504 ../src/viktrwlayer.c:3993 +msgid "GPS Upload" +msgstr "" + +#: ../src/vikgpslayer.c:322 +msgid "GPS Realtime Tracking" +msgstr "" + +#: ../src/vikgpslayer.c:458 +msgid "Connected" +msgstr "" + +#: ../src/vikgpslayer.c:460 +msgid "Disconnected" +msgstr "" + +#: ../src/vikgpslayer.c:554 +msgid "Unknown GPS Protocol" +msgstr "" + +#: ../src/vikgpslayer.c:572 +msgid "Unknown serial port device" +msgstr "" + +#: ../src/vikgpslayer.c:691 +#, c-format +msgid "%s: unknown parameter" +msgstr "" + +#. Now with icons +#: ../src/vikgpslayer.c:794 +msgid "_Upload to GPS" +msgstr "" + +#: ../src/vikgpslayer.c:800 +msgid "Download from _GPS" +msgstr "" + +#: ../src/vikgpslayer.c:821 +msgid "Empty _Realtime" +msgstr "" + +#: ../src/vikgpslayer.c:828 +msgid "E_mpty Upload" +msgstr "" + +#: ../src/vikgpslayer.c:834 +msgid "_Empty Download" +msgstr "" + +#: ../src/vikgpslayer.c:840 +msgid "Empty _All" +msgstr "" + +#: ../src/vikgpslayer.c:852 +#, c-format +msgid "Unexpected number of disconnected handlers: %d" +msgstr "" + +#: ../src/vikgpslayer.c:995 +#, c-format +msgid "Uploading %d waypoint..." +msgid_plural "Uploading %d waypoints..." +msgstr[0] "" +msgstr[1] "" + +#: ../src/vikgpslayer.c:1000 +#, c-format +msgid "Uploading %d trackpoint..." +msgid_plural "Uploading %d trackpoints..." +msgstr[0] "" +msgstr[1] "" + +#: ../src/vikgpslayer.c:1005 +#, c-format +msgid "Uploading %d routepoint..." +msgid_plural "Uploading %d routepoints..." +msgstr[0] "" +msgstr[1] "" + +#: ../src/vikgpslayer.c:1034 +#, c-format +msgid "Downloaded %d out of %d waypoint..." +msgid_plural "Downloaded %d out of %d waypoints..." +msgstr[0] "" +msgstr[1] "" + +#: ../src/vikgpslayer.c:1040 +#, c-format +msgid "Downloaded %d out of %d trackpoint..." +msgid_plural "Downloaded %d out of %d trackpoints..." +msgstr[0] "" +msgstr[1] "" + +#: ../src/vikgpslayer.c:1046 +#, c-format +msgid "Downloaded %d out of %d routepoint..." +msgid_plural "Downloaded %d out of %d routepoints..." +msgstr[0] "" +msgstr[1] "" + +#: ../src/vikgpslayer.c:1056 +#, c-format +msgid "Uploaded %d out of %d waypoint..." +msgid_plural "Uploaded %d out of %d waypoints..." +msgstr[0] "" +msgstr[1] "" + +#: ../src/vikgpslayer.c:1062 +#, c-format +msgid "Uploaded %d out of %d trackpoint..." +msgid_plural "Uploaded %d out of %d trackpoints..." +msgstr[0] "" +msgstr[1] "" + +#: ../src/vikgpslayer.c:1068 +#, c-format +msgid "Uploaded %d out of %d routepoint..." +msgid_plural "Uploaded %d out of %d routepoints..." +msgstr[0] "" +msgstr[1] "" + +#: ../src/vikgpslayer.c:1079 +#, c-format +msgid "Downloaded %d waypoint" +msgid_plural "Downloaded %d waypoints" +msgstr[0] "" +msgstr[1] "" + +#: ../src/vikgpslayer.c:1085 +#, c-format +msgid "Downloaded %d trackpoint" +msgid_plural "Downloaded %d trackpoints" +msgstr[0] "" +msgstr[1] "" + +#: ../src/vikgpslayer.c:1091 +#, c-format +msgid "Downloaded %d routepoint" +msgid_plural "Downloaded %d routepoints" +msgstr[0] "" +msgstr[1] "" + +#: ../src/vikgpslayer.c:1101 +#, c-format +msgid "Uploaded %d waypoint" +msgid_plural "Uploaded %d waypoints" +msgstr[0] "" +msgstr[1] "" + +#: ../src/vikgpslayer.c:1107 +#, c-format +msgid "Uploaded %d trackpoint" +msgid_plural "Uploaded %d trackpoints" +msgstr[0] "" +msgstr[1] "" + +#: ../src/vikgpslayer.c:1113 +#, c-format +msgid "Uploaded %d routepoint" +msgid_plural "Uploaded %d routepoints" +msgstr[0] "" +msgstr[1] "" + +#: ../src/vikgpslayer.c:1363 +msgid "Error: No result." +msgstr "" + +#: ../src/vikgpslayer.c:1471 +msgid "Warning - GPS Upload items may overwrite each other" +msgstr "" + +#: ../src/vikgpslayer.c:1506 +msgid "Status: detecting gpsbabel" +msgstr "" + +#: ../src/vikgpslayer.c:1533 +msgid "No GPS items selected for transfer." +msgstr "" + +#: ../src/vikgpslayer.c:1546 +msgid "Could not turn off device." +msgstr "" + +#: ../src/vikgpslayer.c:1589 +msgid "Are you sure you want to delete GPS Upload data?" +msgstr "" + +#: ../src/vikgpslayer.c:1602 +msgid "Are you sure you want to delete GPS Download data?" +msgstr "" + +#: ../src/vikgpslayer.c:1616 +msgid "Are you sure you want to delete GPS Realtime data?" +msgstr "" + +#: ../src/vikgpslayer.c:1630 +msgid "Are you sure you want to delete All GPS data?" +msgstr "" + +#: ../src/vikgpslayer.c:2004 +#, c-format +msgid "" +"Failed to connect to gpsd at %s (port %s)\n" +"Should Viking keep trying (every %d seconds)?" +msgstr "" + +#: ../src/viklayerspanel.c:73 +msgid "C_ut" +msgstr "" + +#: ../src/viklayerspanel.c:74 ../src/vikwindow.c:4882 +msgid "_Copy" +msgstr "" + +#: ../src/viklayerspanel.c:75 ../src/vikwindow.c:4883 +msgid "_Paste" +msgstr "" + +#: ../src/viklayerspanel.c:76 ../src/vikwindow.c:4884 +msgid "_Delete" +msgstr "" + +#: ../src/viklayerspanel.c:154 +msgid "New Layer" +msgstr "" + +#: ../src/viklayerspanel.c:347 +msgid "Top Layer" +msgstr "" + +#: ../src/viklayerspanel.c:363 +msgid "Add new layer" +msgstr "" + +#: ../src/viklayerspanel.c:370 ../src/vikwindow.c:4884 +msgid "Remove selected layer" +msgstr "" + +#: ../src/viklayerspanel.c:377 +msgid "Move selected layer up" +msgstr "" + +#: ../src/viklayerspanel.c:384 +msgid "Move selected layer down" +msgstr "" + +#: ../src/viklayerspanel.c:391 ../src/vikwindow.c:4881 +msgid "Cut selected layer" +msgstr "" + +#: ../src/viklayerspanel.c:398 ../src/vikwindow.c:4882 +msgid "Copy selected layer" +msgstr "" + +#: ../src/viklayerspanel.c:405 ../src/vikwindow.c:4883 +msgid "" +"Paste layer into selected container layer or otherwise above selected layer" +msgstr "" + +#: ../src/viklayerspanel.c:502 +msgid "New name can not be blank." +msgstr "" + +#: ../src/viklayerspanel.c:751 +msgid "Aggregate Layers have no settable properties." +msgstr "" + +#: ../src/viklayerspanel.c:798 +msgid "You cannot cut the Top Layer." +msgstr "" + +#: ../src/viklayerspanel.c:843 +#, c-format +msgid "Are you sure you want to delete %s?" +msgstr "" + +#: ../src/viklayerspanel.c:863 +msgid "You cannot delete the Top Layer." +msgstr "" + +#: ../src/vikmapniklayer.c:78 +msgid "CSS (MML) Config File:" +msgstr "" + +#: ../src/vikmapniklayer.c:79 +msgid "CartoCSS configuration file" +msgstr "" + +#: ../src/vikmapniklayer.c:80 +msgid "XML Config File:" +msgstr "" + +#: ../src/vikmapniklayer.c:81 +msgid "Mapnik XML configuration file" +msgstr "" + +#: ../src/vikmapniklayer.c:84 +msgid "Use File Cache:" +msgstr "" + +#: ../src/vikmapniklayer.c:86 +msgid "File Cache Directory:" +msgstr "" + +#: ../src/vikmapniklayer.c:122 +msgid "_Mapnik Features" +msgstr "" + +#: ../src/vikmapniklayer.c:122 +msgid "Mapnik Features" +msgstr "" + +#: ../src/vikmapniklayer.c:140 +msgid "Mapnik Rendering" +msgstr "" + +#. Changing these values only applies before first mapnik layer is 'created' +#: ../src/vikmapniklayer.c:258 +msgid "Plugins Directory:" +msgstr "" + +#: ../src/vikmapniklayer.c:258 ../src/vikmapniklayer.c:259 +#: ../src/vikmapniklayer.c:260 ../src/vikmapniklayer.c:261 +msgid "You need to restart Viking for a change to this value to be used" +msgstr "" + +#: ../src/vikmapniklayer.c:259 +msgid "Fonts Directory:" +msgstr "" + +#: ../src/vikmapniklayer.c:260 +msgid "Recurse Fonts Directory:" +msgstr "" + +#: ../src/vikmapniklayer.c:261 +msgid "Rerender Timeout (hours):" +msgstr "" + +#. Changeable any time +#: ../src/vikmapniklayer.c:263 +msgid "CartoCSS:" +msgstr "" + +#: ../src/vikmapniklayer.c:263 +msgid "The program to convert CartoCSS files into Mapnik XML" +msgstr "" + +#: ../src/vikmapniklayer.c:506 +msgid "Running" +msgstr "" + +#: ../src/vikmapniklayer.c:525 +#, c-format +msgid "" +"Error running carto command:\n" +"%s" +msgstr "" + +#: ../src/vikmapniklayer.c:561 +msgid " completed in " +msgstr "" + +#: ../src/vikmapniklayer.c:561 +msgid "seconds" +msgstr "" + +#: ../src/vikmapniklayer.c:611 ../src/vikmapniklayer.c:979 +#, c-format +msgid "" +"Mapnik error loading configuration file:\n" +"%s" +msgstr "" + +#: ../src/vikmapniklayer.c:749 +#, c-format +msgid "Mapnik Render %d:%d:%d %s" +msgstr "" + +#: ../src/vikmapniklayer.c:840 +msgid "Mapnik Rendering must be in Mercator mode" +msgstr "" + +#: ../src/vikmapniklayer.c:997 +msgid "Mapnik Information" +msgstr "" + +#: ../src/vikmapniklayer.c:1031 +msgid "_Flush Memory Cache" +msgstr "" + +#: ../src/vikmapniklayer.c:1044 +msgid "_Run Carto Command" +msgstr "" + +#: ../src/vikmapniklayer.c:1102 ../src/vikmapslayer.c:2029 +#, c-format +msgid "Tile File Timestamp: %s" +msgstr "" + +#: ../src/vikmapniklayer.c:1105 ../src/vikmapslayer.c:2032 +msgid "Tile File Timestamp: Not Available" +msgstr "" + +#: ../src/vikmapniklayer.c:1120 +#, c-format +msgid "Rendering time %.2f seconds" +msgstr "" + +#: ../src/vikmapniklayer.c:1124 ../src/vikmapslayer.c:2042 +msgid "Tile Information" +msgstr "" + +#: ../src/vikmapniklayer.c:1145 +msgid "_Rerender Tile" +msgstr "" + +#: ../src/vikmapniklayer.c:1150 +msgid "_Info" +msgstr "" + +#. ******* MAPZOOMS ******** +#: ../src/vikmapslayer.c:96 +msgid "Use Viking Zoom Level" +msgstr "" + +#: ../src/vikmapslayer.c:146 +msgid "OSM" +msgstr "" + +#. NB mode => id - But can't break file format just to rename something better +#: ../src/vikmapslayer.c:152 +msgid "Map Type:" +msgstr "" + +#: ../src/vikmapslayer.c:153 +msgid "Maps Directory:" +msgstr "" + +#: ../src/vikmapslayer.c:154 +msgid "Cache Layout:" +msgstr "" + +#: ../src/vikmapslayer.c:155 +msgid "This determines the tile storage layout on disk" +msgstr "" + +#: ../src/vikmapslayer.c:156 +msgid "Map File:" +msgstr "" + +#: ../src/vikmapslayer.c:157 +msgid "An MBTiles file. Only applies when the map type method is 'MBTiles'" +msgstr "" + +#: ../src/vikmapslayer.c:159 +msgid "Control the Alpha value for transparency effects" +msgstr "" + +#: ../src/vikmapslayer.c:160 +msgid "Autodownload maps:" +msgstr "" + +#: ../src/vikmapslayer.c:161 +msgid "Autodownload Only Gets Missing Maps:" +msgstr "" + +#: ../src/vikmapslayer.c:162 +msgid "" +"Using this option avoids attempting to update already acquired tiles. This " +"can be useful if you want to restrict the network usage, without having to " +"resort to manual control. Only applies when 'Autodownload Maps' is on." +msgstr "" + +#: ../src/vikmapslayer.c:163 +msgid "Zoom Level:" +msgstr "" + +#: ../src/vikmapslayer.c:164 +msgid "" +"Determines the method of displaying map tiles for the current zoom level. " +"'Viking Zoom Level' uses the best matching level, otherwise setting a fixed " +"value will always use map tiles of the specified value regardless of the " +"actual zoom level." +msgstr "" + +#: ../src/vikmapslayer.c:197 +msgid "_Maps Download" +msgstr "" + +#: ../src/vikmapslayer.c:197 +msgid "Maps Download" +msgstr "" + +#: ../src/vikmapslayer.c:213 ../src/vikutils.c:895 +msgid "Map" +msgstr "" + +#: ../src/vikmapslayer.c:306 +msgid "Default map layer directory:" +msgstr "" + +#: ../src/vikmapslayer.c:306 +msgid "Choose a directory to store cached Map tiles for this layer" +msgstr "" + +#: ../src/vikmapslayer.c:436 ../src/vikmapslayer.c:633 +msgid "Unknown map type" +msgstr "" + +#: ../src/vikmapslayer.c:664 +msgid "Unknown Map Zoom" +msgstr "" + +#: ../src/vikmapslayer.c:833 +#, c-format +msgid "Failed to open MBTiles file: %s" +msgstr "" + +#: ../src/vikmapslayer.c:856 +#, c-format +msgid "" +"New map cannot be displayed in the current drawmode.\n" +"Select \"%s\" from View menu to view it." +msgstr "" + +#: ../src/vikmapslayer.c:1314 +#, c-format +msgid "" +"Cowardly refusing to draw tiles or existence of tiles beyond %d zoom out " +"factor" +msgstr "" + +#. TODO: ?? count up the number of download errors somehow... +#: ../src/vikmapslayer.c:1667 +msgid "Failed to download tile" +msgstr "" + +#: ../src/vikmapslayer.c:1673 +msgid "Unable to save tile" +msgstr "" + +#: ../src/vikmapslayer.c:1799 +#, c-format +msgid "Redownloading up to %d %s map..." +msgid_plural "Redownloading up to %d %s maps..." +msgstr[0] "" +msgstr[1] "" + +#: ../src/vikmapslayer.c:1801 +#, c-format +msgid "Redownloading %d %s map..." +msgid_plural "Redownloading %d %s maps..." +msgstr[0] "" +msgstr[1] "" + +#: ../src/vikmapslayer.c:1805 ../src/vikmapslayer.c:1890 +#, c-format +msgid "Downloading %d %s map..." +msgid_plural "Downloading %d %s maps..." +msgstr[0] "" +msgstr[1] "" + +#: ../src/vikmapslayer.c:1969 +msgid "YES" +msgstr "" + +#: ../src/vikmapslayer.c:1973 ../src/vikmapslayer.c:1977 +msgid "NO" +msgstr "" + +#. NB Also handles .jpg automatically due to pixbuf_new_from () support - although just print png for now. +#: ../src/vikmapslayer.c:1980 +#, c-format +msgid "Source: %s (%d%s%d%s%d.%s %s)" +msgstr "" + +#: ../src/vikmapslayer.c:1983 +msgid "Source: Not available" +msgstr "" + +#: ../src/vikmapslayer.c:2000 +msgid "Source: file://" +msgstr "" + +#: ../src/vikmapslayer.c:2012 +#, c-format +msgid "Source: %s" +msgstr "" + +#: ../src/vikmapslayer.c:2038 +#, c-format +msgid "Tile File: %s [Not Available]" +msgstr "" + +#: ../src/vikmapslayer.c:2086 +msgid "Redownload _Bad Map(s)" +msgstr "" + +#: ../src/vikmapslayer.c:2090 +msgid "Redownload _New Map(s)" +msgstr "" + +#: ../src/vikmapslayer.c:2094 +msgid "Redownload _All Map(s)" +msgstr "" + +#: ../src/vikmapslayer.c:2099 +msgid "_Show Tile Information" +msgstr "" + +#: ../src/vikmapslayer.c:2166 +#, c-format +msgid "" +"Wrong drawmode for this map.\n" +"Select \"%s\" from View menu and try again." +msgstr "" + +#: ../src/vikmapslayer.c:2171 +msgid "Wrong zoom level for this map." +msgstr "" + +#: ../src/vikmapslayer.c:2334 +msgid "Zoom Start:" +msgstr "" + +#: ../src/vikmapslayer.c:2341 +msgid "Zoom End:" +msgstr "" + +#: ../src/vikmapslayer.c:2347 +msgid "Download Maps Method:" +msgstr "" + +#. redownload method - needs to align with REDOWNLOAD* macro values +#: ../src/vikmapslayer.c:2419 +msgid "Missing" +msgstr "" + +#: ../src/vikmapslayer.c:2419 +msgid "Bad" +msgstr "" + +#: ../src/vikmapslayer.c:2419 +msgid "New" +msgstr "" + +#: ../src/vikmapslayer.c:2419 +msgid "Reload All" +msgstr "" + +#: ../src/vikmapslayer.c:2421 +msgid "Download for Zoom Levels" +msgstr "" + +#: ../src/vikmapslayer.c:2461 +#, c-format +msgid "" +"You are not allowed to download more than %d tiles in one go (requested %d)" +msgstr "" + +#: ../src/vikmapslayer.c:2469 +#, c-format +msgid "Do you really want to download %d tiles?" +msgstr "" + +#. Now with icons +#: ../src/vikmapslayer.c:2509 +msgid "Download _Missing Onscreen Maps" +msgstr "" + +#: ../src/vikmapslayer.c:2516 +msgid "Download _New Onscreen Maps" +msgstr "" + +#: ../src/vikmapslayer.c:2523 +msgid "Reload _All Onscreen Maps" +msgstr "" + +#: ../src/vikmapslayer.c:2529 +msgid "Download Maps in _Zoom Levels..." +msgstr "" + +#: ../src/vikmapslayer.c:2539 +msgid "_Open MBTiles Files" +msgstr "" + +#: ../src/vikmapslayer.c:2554 +msgid "Flush Map Cache" +msgstr "" + +#: ../src/vikrouting.c:54 +msgid "Default engine:" +msgstr "" + +#: ../src/vikrouting.c:68 +msgid "Routing" +msgstr "" + +#: ../src/viktreeview.c:347 +msgid "Layer Name" +msgstr "" + +#: ../src/viktreeview.c:924 +#, c-format +msgid "delete data from %s\n" +msgstr "" + +#: ../src/viktrwlayer.c:427 +msgid "Create _Waypoint" +msgstr "" + +#: ../src/viktrwlayer.c:427 +msgid "Create Waypoint" +msgstr "" + +#: ../src/viktrwlayer.c:437 +msgid "Edit _Track" +msgstr "" + +#: ../src/viktrwlayer.c:437 +msgid "Edit Track" +msgstr "" + +#: ../src/viktrwlayer.c:449 +msgid "Edit _Route" +msgstr "" + +#: ../src/viktrwlayer.c:449 +msgid "Edit Route" +msgstr "" + +#: ../src/viktrwlayer.c:460 +msgid "Route _Finder" +msgstr "" + +#: ../src/viktrwlayer.c:460 +msgid "Route Finder" +msgstr "" + +#: ../src/viktrwlayer.c:471 +msgid "Splitter" +msgstr "" + +#: ../src/viktrwlayer.c:482 +msgid "_Edit Waypoint" +msgstr "" + +#: ../src/viktrwlayer.c:482 +msgid "Edit Waypoint" +msgstr "" + +#: ../src/viktrwlayer.c:495 +msgid "Edit Trac_kpoint" +msgstr "" + +#: ../src/viktrwlayer.c:495 +msgid "Edit Trackpoint" +msgstr "" + +#. a pixbuf for this one is already made globally available +#: ../src/viktrwlayer.c:508 +msgid "Show P_icture" +msgstr "" + +#: ../src/viktrwlayer.c:508 +msgid "Show Picture" +msgstr "" + +#: ../src/viktrwlayer.c:531 +msgid "Waypoint Images" +msgstr "" + +#: ../src/viktrwlayer.c:531 +msgid "Tracks Advanced" +msgstr "" + +#: ../src/viktrwlayer.c:531 +msgid "Metadata" +msgstr "" + +#: ../src/viktrwlayer.c:531 +msgid "Filesystem" +msgstr "" + +#: ../src/viktrwlayer.c:534 +msgid "Draw by Track" +msgstr "" + +#: ../src/viktrwlayer.c:534 +msgid "Draw by Speed" +msgstr "" + +#: ../src/viktrwlayer.c:534 +msgid "All Tracks Same Color" +msgstr "" + +#: ../src/viktrwlayer.c:535 +msgid "Filled Square" +msgstr "" + +#: ../src/viktrwlayer.c:535 +msgid "Square" +msgstr "" + +#: ../src/viktrwlayer.c:535 +msgid "Circle" +msgstr "" + +#: ../src/viktrwlayer.c:535 +msgid "X" +msgstr "" + +#: ../src/viktrwlayer.c:561 +msgid "Extra Extra Small" +msgstr "" + +#: ../src/viktrwlayer.c:562 +msgid "Extra Small" +msgstr "" + +#: ../src/viktrwlayer.c:566 +msgid "Extra Large" +msgstr "" + +#: ../src/viktrwlayer.c:567 +msgid "Extra Extra Large" +msgstr "" + +#: ../src/viktrwlayer.c:573 +msgid "Name Ascending" +msgstr "" + +#: ../src/viktrwlayer.c:574 +msgid "Name Descending" +msgstr "" + +#: ../src/viktrwlayer.c:582 ../src/viktrwlayer_propwin.c:3319 +msgid "No" +msgstr "" + +#: ../src/viktrwlayer.c:583 +msgid "Yes" +msgstr "" + +#: ../src/viktrwlayer.c:584 +msgid "No write" +msgstr "" + +#: ../src/viktrwlayer.c:649 ../src/viktrwlayer.c:673 +msgid "Draw Labels" +msgstr "" + +#: ../src/viktrwlayer.c:650 +msgid "Note: the individual track controls what labels may be displayed" +msgstr "" + +#: ../src/viktrwlayer.c:651 +msgid "Track Labels Font Size:" +msgstr "" + +#: ../src/viktrwlayer.c:652 +msgid "Track Drawing Mode:" +msgstr "" + +#: ../src/viktrwlayer.c:653 +msgid "All Tracks Color:" +msgstr "" + +#: ../src/viktrwlayer.c:654 +msgid "The color used when 'All Tracks Same Color' drawing mode is selected" +msgstr "" + +#: ../src/viktrwlayer.c:655 +msgid "Draw Track Lines" +msgstr "" + +#: ../src/viktrwlayer.c:656 +msgid "Track Thickness:" +msgstr "" + +#: ../src/viktrwlayer.c:657 +msgid "Draw Track Direction" +msgstr "" + +#: ../src/viktrwlayer.c:658 +msgid "Direction Size:" +msgstr "" + +#: ../src/viktrwlayer.c:659 +msgid "Draw Trackpoints" +msgstr "" + +#: ../src/viktrwlayer.c:660 +msgid "Trackpoint Size:" +msgstr "" + +#: ../src/viktrwlayer.c:661 +msgid "Draw Elevation" +msgstr "" + +#: ../src/viktrwlayer.c:662 +msgid "Draw Elevation Height %:" +msgstr "" + +#: ../src/viktrwlayer.c:663 +msgid "Draw Stops" +msgstr "" + +#: ../src/viktrwlayer.c:664 +msgid "" +"Whether to draw a marker when trackpoints are at the same position but over " +"the minimum stop length apart in time" +msgstr "" + +#: ../src/viktrwlayer.c:665 +msgid "Min Stop Length (seconds):" +msgstr "" + +#: ../src/viktrwlayer.c:667 +msgid "Track BG Thickness:" +msgstr "" + +#: ../src/viktrwlayer.c:668 +msgid "Track Background Color" +msgstr "" + +#: ../src/viktrwlayer.c:669 +msgid "Draw by Speed Factor (%):" +msgstr "" + +#: ../src/viktrwlayer.c:670 +msgid "" +"The percentage factor away from the average speed determining the color used" +msgstr "" + +#: ../src/viktrwlayer.c:671 +msgid "Track Sort Order:" +msgstr "" + +#: ../src/viktrwlayer.c:674 +msgid "Waypoint Font Size:" +msgstr "" + +#: ../src/viktrwlayer.c:675 +msgid "Waypoint Color:" +msgstr "" + +#: ../src/viktrwlayer.c:676 +msgid "Waypoint Text:" +msgstr "" + +#: ../src/viktrwlayer.c:677 +msgid "Background:" +msgstr "" + +#: ../src/viktrwlayer.c:678 +msgid "Fake BG Color Translucency:" +msgstr "" + +#: ../src/viktrwlayer.c:679 +msgid "Waypoint marker:" +msgstr "" + +#: ../src/viktrwlayer.c:680 +msgid "Waypoint size:" +msgstr "" + +#: ../src/viktrwlayer.c:681 +msgid "Draw Waypoint Symbols:" +msgstr "" + +#: ../src/viktrwlayer.c:682 +msgid "Waypoint Sort Order:" +msgstr "" + +#: ../src/viktrwlayer.c:684 +msgid "Draw Waypoint Images" +msgstr "" + +#: ../src/viktrwlayer.c:685 +msgid "Image Size (pixels):" +msgstr "" + +#: ../src/viktrwlayer.c:686 +msgid "Image Alpha:" +msgstr "" + +#: ../src/viktrwlayer.c:687 +msgid "Image Memory Cache Size:" +msgstr "" + +#: ../src/viktrwlayer.c:690 +msgid "Author" +msgstr "" + +#: ../src/viktrwlayer.c:691 +msgid "Creation Time" +msgstr "" + +#: ../src/viktrwlayer.c:692 +msgid "Keywords" +msgstr "" + +#: ../src/viktrwlayer.c:693 +msgid "External layer:" +msgstr "" + +#: ../src/viktrwlayer.c:693 +msgid "" +"Layer data stored in the Viking file, in an external file, or in an external " +"file but changes are not written to the file (file only loaded at startup)" +msgstr "" + +#: ../src/viktrwlayer.c:694 +msgid "Save layer as:" +msgstr "" + +#: ../src/viktrwlayer.c:694 +msgid "Specify where layer should be saved. Overwrites file if it exists." +msgstr "" + +#: ../src/viktrwlayer.c:798 +msgid "TrackWaypoint" +msgstr "" + +#: ../src/viktrwlayer.c:1999 ../src/viktrwlayer_propwin.c:1469 +#: ../src/viktrwlayer_propwin.c:1471 ../src/vikutils.c:299 +#: ../src/vikutils.c:326 +msgid "miles" +msgstr "" + +#: ../src/viktrwlayer.c:2002 ../src/viktrwlayer_propwin.c:1475 +#: ../src/viktrwlayer_propwin.c:1477 ../src/vikutils.c:303 +#: ../src/vikutils.c:330 +msgid "NM" +msgstr "" + +#. VIK_UNITS_DISTANCE_KILOMETRES: +#: ../src/viktrwlayer.c:2006 ../src/viktrwlayer_propwin.c:1482 +#: ../src/viktrwlayer_propwin.c:1484 ../src/vikutils.c:308 +#: ../src/vikutils.c:335 +msgid "km" +msgstr "" + +#: ../src/viktrwlayer.c:2121 +msgid "start/end" +msgstr "" + +#: ../src/viktrwlayer.c:2133 +msgid "start" +msgstr "" + +#: ../src/viktrwlayer.c:2142 +msgid "end" +msgstr "" + +#: ../src/viktrwlayer.c:3103 +#, c-format +msgid " in %d:%02d hrs:mins" +msgstr "" + +#: ../src/viktrwlayer.c:3107 +#, c-format +msgid "" +"\n" +"%sTotal Length %.1f %s%s" +msgstr "" + +#: ../src/viktrwlayer.c:3131 +#, c-format +msgid "" +"\n" +"Total route length %.1f %s" +msgstr "" + +#: ../src/viktrwlayer.c:3136 +#, c-format +msgid "Tracks: %d - Waypoints: %d - Routes: %d%s%s" +msgstr "" + +#: ../src/viktrwlayer.c:3155 +#, c-format +msgid "Tracks: %d" +msgstr "" + +#: ../src/viktrwlayer.c:3165 +#, c-format +msgid "Routes: %d" +msgstr "" + +#: ../src/viktrwlayer.c:3195 +#, c-format +msgid "- %d:%02d hrs:mins" +msgstr "" + +#: ../src/viktrwlayer.c:3202 +#, c-format +msgid "%s%.1f km %s" +msgstr "" + +#: ../src/viktrwlayer.c:3205 +#, c-format +msgid "%s%.1f miles %s" +msgstr "" + +#: ../src/viktrwlayer.c:3208 +#, c-format +msgid "%s%.1f NM %s" +msgstr "" + +#: ../src/viktrwlayer.c:3222 +#, c-format +msgid "Waypoints: %d" +msgstr "" + +#: ../src/viktrwlayer.c:3279 +#, c-format +msgid "Wpt: Alt %dft" +msgstr "" + +#. VIK_UNITS_HEIGHT_METRES: +#: ../src/viktrwlayer.c:3283 +#, c-format +msgid "Wpt: Alt %dm" +msgstr "" + +#. Add comment if available +#: ../src/viktrwlayer.c:3298 +#, c-format +msgid "%s | %s %s | Comment: %s" +msgstr "" + +#: ../src/viktrwlayer.c:3300 +#, c-format +msgid "%s | %s %s" +msgstr "" + +#: ../src/viktrwlayer.c:3562 ../src/viktrwlayer.c:3591 +msgid "This layer has no waypoints or trackpoints." +msgstr "" + +#: ../src/viktrwlayer.c:3598 ../src/viktrwlayer.c:3607 +#: ../src/viktrwlayer.c:3616 ../src/viktrwlayer.c:3625 +#: ../src/viktrwlayer.c:3634 ../src/viktrwlayer.c:3642 +msgid "Export Layer" +msgstr "" + +#: ../src/viktrwlayer.c:3671 +msgid "Export Route as GPX" +msgstr "" + +#: ../src/viktrwlayer.c:3673 +msgid "Export Track as GPX" +msgstr "" + +#: ../src/viktrwlayer.c:3693 +msgid "Find" +msgstr "" + +#: ../src/viktrwlayer.c:3703 +msgid "Waypoint Name:" +msgstr "" + +#: ../src/viktrwlayer.c:3720 +msgid "Waypoint not found in this layer." +msgstr "" + +#: ../src/viktrwlayer.c:3989 +msgid "Can not upload invisible track." +msgstr "" + +#: ../src/viktrwlayer.c:4082 ../src/viktrwlayer.c:10512 +msgid "Track" +msgstr "" + +#: ../src/viktrwlayer.c:4107 ../src/viktrwlayer.c:10599 +msgid "Route" +msgstr "" + +#: ../src/viktrwlayer.c:4194 +msgid "Externa_l" +msgstr "" + +#: ../src/viktrwlayer.c:4216 ../src/viktrwlayer.c:8456 +#: ../src/viktrwlayer.c:8574 +msgid "_Finish Route" +msgstr "" + +#: ../src/viktrwlayer.c:4218 ../src/viktrwlayer.c:8380 +#: ../src/viktrwlayer.c:8572 +msgid "_Finish Track" +msgstr "" + +#. Now with icons +#: ../src/viktrwlayer.c:4230 +msgid "_View Layer" +msgstr "" + +#: ../src/viktrwlayer.c:4237 +msgid "V_iew" +msgstr "" + +#: ../src/viktrwlayer.c:4243 +msgid "View All _Tracks" +msgstr "" + +#: ../src/viktrwlayer.c:4248 +msgid "View All _Routes" +msgstr "" + +#: ../src/viktrwlayer.c:4253 +msgid "View All _Waypoints" +msgstr "" + +#: ../src/viktrwlayer.c:4258 +msgid "_Goto Center of Layer" +msgstr "" + +#: ../src/viktrwlayer.c:4264 ../src/viktrwlayer.c:8321 +msgid "Goto _Waypoint..." +msgstr "" + +#: ../src/viktrwlayer.c:4270 +msgid "_Export Layer" +msgstr "" + +#: ../src/viktrwlayer.c:4276 +msgid "Export as GPS_Point..." +msgstr "" + +#: ../src/viktrwlayer.c:4281 +msgid "Export as GPS_Mapper..." +msgstr "" + +#: ../src/viktrwlayer.c:4286 +msgid "Export as _GPX..." +msgstr "" + +#: ../src/viktrwlayer.c:4292 +msgid "Export as _KML..." +msgstr "" + +#: ../src/viktrwlayer.c:4299 +msgid "Export as GEO_JSON..." +msgstr "" + +#: ../src/viktrwlayer.c:4306 +msgid "Export via GPSbabel..." +msgstr "" + +#: ../src/viktrwlayer.c:4312 +#, c-format +msgid "Open with External Program_1: %s" +msgstr "" + +#: ../src/viktrwlayer.c:4319 +#, c-format +msgid "Open with External Program_2: %s" +msgstr "" + +#: ../src/viktrwlayer.c:4327 ../src/vikwindow.c:4825 +msgid "_New" +msgstr "" + +#: ../src/viktrwlayer.c:4333 +msgid "New _Waypoint..." +msgstr "" + +#: ../src/viktrwlayer.c:4339 +msgid "New _Track" +msgstr "" + +#: ../src/viktrwlayer.c:4347 +msgid "New _Route" +msgstr "" + +#: ../src/viktrwlayer.c:4356 ../src/viktrwlayer.c:8232 +#: ../src/viktrwlayer.c:9003 +msgid "Geotag _Images..." +msgstr "" + +#: ../src/viktrwlayer.c:4363 +msgid "_Acquire" +msgstr "" + +#: ../src/viktrwlayer.c:4369 ../src/vikwindow.c:4904 +msgid "From _GPS..." +msgstr "" + +#. FIXME: only add menu when at least a routing engine has support for Directions +#: ../src/viktrwlayer.c:4375 +msgid "From _Directions..." +msgstr "" + +#: ../src/viktrwlayer.c:4381 +msgid "From _OSM Traces..." +msgstr "" + +#: ../src/viktrwlayer.c:4386 +msgid "From _My OSM Traces..." +msgstr "" + +#: ../src/viktrwlayer.c:4392 ../src/vikwindow.c:4844 +msgid "From _URL..." +msgstr "" + +#: ../src/viktrwlayer.c:4399 ../src/vikwindow.c:4846 +msgid "From _Wikipedia Waypoints" +msgstr "" + +#: ../src/viktrwlayer.c:4405 +msgid "Within _Layer Bounds" +msgstr "" + +#: ../src/viktrwlayer.c:4411 +msgid "Within _Current View" +msgstr "" + +#: ../src/viktrwlayer.c:4419 +msgid "From Geo_caching..." +msgstr "" + +#: ../src/viktrwlayer.c:4426 ../src/vikwindow.c:4842 +msgid "From Geotagged _Images..." +msgstr "" + +#: ../src/viktrwlayer.c:4433 +msgid "From _File..." +msgstr "" + +#: ../src/viktrwlayer.c:4436 ../src/vikwindow.c:4905 +msgid "Import File With GPS_Babel..." +msgstr "" + +#: ../src/viktrwlayer.c:4443 ../src/viktrwlayer.c:8905 +msgid "_Upload" +msgstr "" + +#: ../src/viktrwlayer.c:4449 +msgid "Upload to _GPS..." +msgstr "" + +#: ../src/viktrwlayer.c:4456 ../src/viktrwlayer.c:8973 +msgid "Upload to _OSM..." +msgstr "" + +#: ../src/viktrwlayer.c:4464 +msgid "De_lete" +msgstr "" + +#: ../src/viktrwlayer.c:4470 +msgid "Delete All _Tracks" +msgstr "" + +#: ../src/viktrwlayer.c:4477 +msgid "Delete Tracks _From Selection..." +msgstr "" + +#: ../src/viktrwlayer.c:4484 ../src/viktrwlayer.c:8481 +msgid "Delete _All Routes" +msgstr "" + +#: ../src/viktrwlayer.c:4491 ../src/viktrwlayer.c:8487 +msgid "_Delete Routes From Selection..." +msgstr "" + +#: ../src/viktrwlayer.c:4498 +msgid "Delete All _Waypoints" +msgstr "" + +#: ../src/viktrwlayer.c:4505 +msgid "Delete Waypoints From _Selection..." +msgstr "" + +#: ../src/viktrwlayer.c:4512 ../src/viktrwlayer.c:8339 +msgid "Delete Duplicate Waypoints" +msgstr "" + +#: ../src/viktrwlayer.c:5198 +#, c-format +msgid "Are you sure you want to delete all tracks in %s?" +msgstr "" + +#: ../src/viktrwlayer.c:5211 +#, c-format +msgid "Are you sure you want to delete all routes in %s?" +msgstr "" + +#: ../src/viktrwlayer.c:5221 +#, c-format +msgid "Are you sure you want to delete all waypoints in %s?" +msgstr "" + +#: ../src/viktrwlayer.c:5238 +#, c-format +msgid "Are you sure you want to delete the waypoint \"%s\"?" +msgstr "" + +#: ../src/viktrwlayer.c:5254 +#, c-format +msgid "Are you sure you want to delete the track \"%s\"?" +msgstr "" + +#: ../src/viktrwlayer.c:5271 +#, c-format +msgid "Are you sure you want to delete the route \"%s\"?" +msgstr "" + +#: ../src/viktrwlayer.c:5527 ../src/viktrwlayer.c:6373 +msgid "" +"Converting a track to a route removes extra track data such as segments, " +"timestamps, etc...\n" +"Do you want to continue?" +msgstr "" + +#: ../src/viktrwlayer.c:5631 +msgid "No DEM layers available, thus no DEM values can be applied." +msgstr "" + +#: ../src/viktrwlayer.c:5651 ../src/viktrwlayer.c:5692 +#, c-format +msgid "%ld point adjusted" +msgid_plural "%ld points adjusted" +msgstr[0] "" +msgstr[1] "" + +#: ../src/viktrwlayer.c:5736 +#, c-format +msgid "%ld waypoint changed" +msgid_plural "%ld waypoints changed" +msgstr[0] "" +msgstr[1] "" + +#: ../src/viktrwlayer.c:5917 +#, c-format +msgid "" +"Refining a track with many points (%d) is unlikely to yield sensible " +"results. Do you want to Continue?" +msgstr "" + +#. Select engine from dialog +#: ../src/viktrwlayer.c:5925 +msgid "Refine Route with Routing Engine..." +msgstr "" + +#: ../src/viktrwlayer.c:5933 +msgid "Select routing engine" +msgstr "" + +#: ../src/viktrwlayer.c:6158 +msgid "Failed. No other tracks with timestamps in this layer found" +msgstr "" + +#: ../src/viktrwlayer.c:6160 +msgid "Failed. No other tracks without timestamps in this layer found" +msgstr "" + +#: ../src/viktrwlayer.c:6179 +msgid "Merge with..." +msgstr "" + +#: ../src/viktrwlayer.c:6180 +msgid "Select route to merge with" +msgstr "" + +#: ../src/viktrwlayer.c:6180 +msgid "Select track to merge with" +msgstr "" + +#: ../src/viktrwlayer.c:6264 ../src/viktrwlayer.c:6346 +msgid "Append Route" +msgstr "" + +#: ../src/viktrwlayer.c:6264 ../src/viktrwlayer.c:6346 +msgid "Append Track" +msgstr "" + +#: ../src/viktrwlayer.c:6265 +msgid "Select the route to append after the current route" +msgstr "" + +#: ../src/viktrwlayer.c:6266 +msgid "Select the track to append after the current track" +msgstr "" + +#: ../src/viktrwlayer.c:6347 +msgid "Select the track to append after the current route" +msgstr "" + +#: ../src/viktrwlayer.c:6348 +msgid "Select the route to append after the current track" +msgstr "" + +#: ../src/viktrwlayer.c:6414 +#, c-format +msgid "%d segment merged" +msgid_plural "%d segments merged" +msgstr[0] "" +msgstr[1] "" + +#: ../src/viktrwlayer.c:6430 +msgid "Failed. This track does not have timestamp" +msgstr "" + +#: ../src/viktrwlayer.c:6442 +msgid "Failed. No other track in this layer has timestamp" +msgstr "" + +#: ../src/viktrwlayer.c:6449 +msgid "Merge Threshold..." +msgstr "" + +#: ../src/viktrwlayer.c:6450 +msgid "Merge when time between tracks less than:" +msgstr "" + +#: ../src/viktrwlayer.c:6580 +msgid "Split Threshold..." +msgstr "" + +#: ../src/viktrwlayer.c:6581 +msgid "Split when time between trackpoints exceeds:" +msgstr "" + +#: ../src/viktrwlayer.c:6598 +#, c-format +msgid "" +"Can not split track due to trackpoints not ordered in time - such as at %s.\n" +"\n" +"Goto this trackpoint?" +msgstr "" + +#: ../src/viktrwlayer.c:6668 +msgid "Split Every Nth Point" +msgstr "" + +#: ../src/viktrwlayer.c:6669 +msgid "Split on every Nth point:" +msgstr "" + +#: ../src/viktrwlayer.c:6779 +msgid "Can not split track as it has no segments" +msgstr "" + +#: ../src/viktrwlayer.c:6861 ../src/viktrwlayer.c:6891 +#, c-format +msgid "Deleted %ld point" +msgid_plural "Deleted %ld points" +msgstr[0] "" +msgstr[1] "" + +#: ../src/viktrwlayer.c:6966 ../src/viktrwlayer.c:10989 +#: ../src/viktrwlayer_waypointlist.c:214 +#, c-format +msgid "Could not launch %s to open file." +msgstr "" + +#: ../src/viktrwlayer.c:6992 ../src/viktrwlayer.c:7113 +msgid "This track has no date information." +msgstr "" + +#: ../src/viktrwlayer.c:7006 ../src/viktrwlayer.c:7136 +msgid "This waypoint has no date information." +msgstr "" + +#: ../src/viktrwlayer.c:7030 +#, c-format +msgid "Could not launch %s" +msgstr "" + +#: ../src/viktrwlayer.c:7269 +msgid "Internal Error in vik_trw_layer_uniquify_tracks" +msgstr "" + +#: ../src/viktrwlayer.c:7374 ../src/viktrwlayer.c:7424 +#: ../src/viktrwlayer.c:7587 +msgid "" +"Multiple entries with the same name exist. This method only works with " +"unique names. Force unique names now?" +msgstr "" + +#: ../src/viktrwlayer.c:7385 +msgid "No tracks found" +msgstr "" + +#: ../src/viktrwlayer.c:7393 ../src/viktrwlayer.c:7443 +#: ../src/viktrwlayer.c:7607 +msgid "Delete Selection" +msgstr "" + +#: ../src/viktrwlayer.c:7394 +msgid "Select tracks to delete" +msgstr "" + +#: ../src/viktrwlayer.c:7435 +msgid "No routes found" +msgstr "" + +#: ../src/viktrwlayer.c:7444 +msgid "Select routes to delete" +msgstr "" + +#: ../src/viktrwlayer.c:7550 +msgid "Internal Error in vik_trw_layer_uniquify_waypoints" +msgstr "" + +#: ../src/viktrwlayer.c:7597 +msgid "No waypoints found" +msgstr "" + +#: ../src/viktrwlayer.c:7608 +msgid "Select waypoints to delete" +msgstr "" + +#: ../src/viktrwlayer.c:7691 +#, c-format +msgid "%ld waypoint deleted" +msgid_plural "%ld waypoints deleted" +msgstr[0] "" +msgstr[1] "" + +#: ../src/viktrwlayer.c:7697 +msgid "No duplicates found" +msgstr "" + +#: ../src/viktrwlayer.c:8028 +#, c-format +msgid "" +"A waypoint with the name \"%s\" already exists. Really rename to the same " +"name?" +msgstr "" + +#: ../src/viktrwlayer.c:8058 +#, c-format +msgid "" +"A track with the name \"%s\" already exists. Really rename to the same name?" +msgstr "" + +#: ../src/viktrwlayer.c:8095 +#, c-format +msgid "" +"A route with the name \"%s\" already exists. Really rename to the same name?" +msgstr "" + +#: ../src/viktrwlayer.c:8215 ../src/viktrwlayer.c:8602 +msgid "_Goto" +msgstr "" + +#: ../src/viktrwlayer.c:8226 +msgid "_Visit Geocache Webpage" +msgstr "" + +#: ../src/viktrwlayer.c:8235 +msgid "Geotag multiple images against this waypoint" +msgstr "" + +#: ../src/viktrwlayer.c:8245 ../src/viktrwlayer_waypointlist.c:352 +msgid "_Show Picture..." +msgstr "" + +#: ../src/viktrwlayer.c:8253 +msgid "Update Geotag on _Image" +msgstr "" + +#: ../src/viktrwlayer.c:8259 +msgid "_Update" +msgstr "" + +#: ../src/viktrwlayer.c:8264 +msgid "Update and _Keep File Timestamp" +msgstr "" + +#: ../src/viktrwlayer.c:8276 +msgid "Visit _Webpage" +msgstr "" + +#: ../src/viktrwlayer.c:8306 +msgid "_New Waypoint..." +msgstr "" + +#: ../src/viktrwlayer.c:8315 +msgid "_View All Waypoints" +msgstr "" + +#: ../src/viktrwlayer.c:8327 +msgid "Delete _All Waypoints" +msgstr "" + +#: ../src/viktrwlayer.c:8333 +msgid "_Delete Waypoints From Selection..." +msgstr "" + +#: ../src/viktrwlayer.c:8351 +msgid "_Show All Waypoints" +msgstr "" + +#: ../src/viktrwlayer.c:8357 +msgid "_Hide All Waypoints" +msgstr "" + +#: ../src/viktrwlayer.c:8369 +msgid "_List Waypoints..." +msgstr "" + +#: ../src/viktrwlayer.c:8390 +msgid "_View All Tracks" +msgstr "" + +#: ../src/viktrwlayer.c:8396 +msgid "_New Track" +msgstr "" + +#: ../src/viktrwlayer.c:8404 +msgid "Delete _All Tracks" +msgstr "" + +#: ../src/viktrwlayer.c:8410 +msgid "_Delete Tracks From Selection..." +msgstr "" + +#: ../src/viktrwlayer.c:8422 +msgid "_Show All Tracks" +msgstr "" + +#: ../src/viktrwlayer.c:8428 +msgid "_Hide All Tracks" +msgstr "" + +#: ../src/viktrwlayer.c:8439 +msgid "_List Tracks..." +msgstr "" + +#: ../src/viktrwlayer.c:8467 +msgid "_View All Routes" +msgstr "" + +#: ../src/viktrwlayer.c:8473 +msgid "_New Route" +msgstr "" + +#: ../src/viktrwlayer.c:8499 +msgid "_Show All Routes" +msgstr "" + +#: ../src/viktrwlayer.c:8505 +msgid "_Hide All Routes" +msgstr "" + +#: ../src/viktrwlayer.c:8516 +msgid "_List Routes..." +msgstr "" + +#: ../src/viktrwlayer.c:8587 +msgid "_View Track" +msgstr "" + +#: ../src/viktrwlayer.c:8589 +msgid "_View Route" +msgstr "" + +#: ../src/viktrwlayer.c:8608 +msgid "_Startpoint" +msgstr "" + +#: ../src/viktrwlayer.c:8614 +msgid "\"_Center\"" +msgstr "" + +#: ../src/viktrwlayer.c:8620 +msgid "_Endpoint" +msgstr "" + +#: ../src/viktrwlayer.c:8626 +msgid "_Highest Altitude" +msgstr "" + +#: ../src/viktrwlayer.c:8632 +msgid "_Lowest Altitude" +msgstr "" + +#: ../src/viktrwlayer.c:8640 +msgid "_Maximum Speed" +msgstr "" + +#: ../src/viktrwlayer.c:8646 +msgid "_Date" +msgstr "" + +#: ../src/viktrwlayer.c:8655 +msgid "Co_mbine" +msgstr "" + +#: ../src/viktrwlayer.c:8663 +msgid "_Merge By Time..." +msgstr "" + +#: ../src/viktrwlayer.c:8668 +msgid "Merge _Segments" +msgstr "" + +#: ../src/viktrwlayer.c:8675 +msgid "Merge _With Other Tracks..." +msgstr "" + +#: ../src/viktrwlayer.c:8682 +msgid "_Append Track..." +msgstr "" + +#: ../src/viktrwlayer.c:8684 +msgid "_Append Route..." +msgstr "" + +#: ../src/viktrwlayer.c:8690 +msgid "Append _Route..." +msgstr "" + +#: ../src/viktrwlayer.c:8692 +msgid "Append _Track..." +msgstr "" + +#: ../src/viktrwlayer.c:8699 +msgid "_Split" +msgstr "" + +#: ../src/viktrwlayer.c:8707 +msgid "_Split By Time..." +msgstr "" + +#. ATM always enable this entry - don't want to have to analyse the track before displaying the menu - to keep the menu speedy +#: ../src/viktrwlayer.c:8713 +msgid "Split Se_gments" +msgstr "" + +#: ../src/viktrwlayer.c:8719 +msgid "Split By _Number of Points..." +msgstr "" + +#: ../src/viktrwlayer.c:8724 +msgid "Split at _Trackpoint" +msgstr "" + +#: ../src/viktrwlayer.c:8732 +msgid "_Insert Points" +msgstr "" + +#: ../src/viktrwlayer.c:8738 +msgid "Insert Point _Before Selected Point" +msgstr "" + +#: ../src/viktrwlayer.c:8745 +msgid "Insert Point _After Selected Point" +msgstr "" + +#: ../src/viktrwlayer.c:8754 +msgid "Delete Poi_nts" +msgstr "" + +#: ../src/viktrwlayer.c:8760 +msgid "Delete _Selected Point" +msgstr "" + +#: ../src/viktrwlayer.c:8768 +msgid "Delete Points With The Same _Position" +msgstr "" + +#: ../src/viktrwlayer.c:8773 +msgid "Delete Points With The Same _Time" +msgstr "" + +#: ../src/viktrwlayer.c:8780 ../src/viktrwlayer.c:9029 +msgid "_Transform" +msgstr "" + +#: ../src/viktrwlayer.c:8788 ../src/viktrwlayer.c:9037 +msgid "_Apply DEM Data" +msgstr "" + +#: ../src/viktrwlayer.c:8793 ../src/viktrwlayer.c:9042 +msgid "_Overwrite" +msgstr "" + +#: ../src/viktrwlayer.c:8796 ../src/viktrwlayer.c:9045 +msgid "Overwrite any existing elevation values with DEM values" +msgstr "" + +#: ../src/viktrwlayer.c:8799 ../src/viktrwlayer.c:9048 +msgid "_Keep Existing" +msgstr "" + +#: ../src/viktrwlayer.c:8802 ../src/viktrwlayer.c:9051 +msgid "Keep existing elevation values, only attempt for missing values" +msgstr "" + +#: ../src/viktrwlayer.c:8807 +msgid "_Smooth Missing Elevation Data" +msgstr "" + +#: ../src/viktrwlayer.c:8812 +msgid "_Interpolated" +msgstr "" + +#: ../src/viktrwlayer.c:8815 +msgid "" +"Interpolate between known elevation values to derive values for the missing " +"elevations" +msgstr "" + +#: ../src/viktrwlayer.c:8818 +msgid "_Flat" +msgstr "" + +#: ../src/viktrwlayer.c:8821 +msgid "Set unknown elevation values to the last known value" +msgstr "" + +#: ../src/viktrwlayer.c:8825 +msgid "C_onvert to a Route" +msgstr "" + +#: ../src/viktrwlayer.c:8827 +msgid "C_onvert to a Track" +msgstr "" + +#: ../src/viktrwlayer.c:8835 +msgid "_Anonymize Times" +msgstr "" + +#: ../src/viktrwlayer.c:8838 +msgid "Shift timestamps to a relative offset from 1901-01-01" +msgstr "" + +#: ../src/viktrwlayer.c:8841 +msgid "_Interpolate Times" +msgstr "" + +#: ../src/viktrwlayer.c:8844 +msgid "" +"Reset trackpoint timestamps between the first and last points such that " +"track is traveled at equal speed" +msgstr "" + +#: ../src/viktrwlayer.c:8849 +msgid "_Reverse Track" +msgstr "" + +#: ../src/viktrwlayer.c:8851 +msgid "_Reverse Route" +msgstr "" + +#: ../src/viktrwlayer.c:8858 +msgid "Refine Route..." +msgstr "" + +#: ../src/viktrwlayer.c:8868 +msgid "Down_load Maps Along Track..." +msgstr "" + +#: ../src/viktrwlayer.c:8870 +msgid "Down_load Maps Along Route..." +msgstr "" + +#: ../src/viktrwlayer.c:8878 +msgid "_Export Track as GPX..." +msgstr "" + +#: ../src/viktrwlayer.c:8880 +msgid "_Export Route as GPX..." +msgstr "" + +#: ../src/viktrwlayer.c:8887 +msgid "E_xtend Track End" +msgstr "" + +#: ../src/viktrwlayer.c:8889 +msgid "E_xtend Route End" +msgstr "" + +#: ../src/viktrwlayer.c:8896 +msgid "Extend _Using Route Finder" +msgstr "" + +#: ../src/viktrwlayer.c:8911 +msgid "_Upload to GPS..." +msgstr "" + +#: ../src/viktrwlayer.c:8926 +msgid "_Diary" +msgstr "" + +#: ../src/viktrwlayer.c:8930 +msgid "Open diary program at this date" +msgstr "" + +#: ../src/viktrwlayer.c:8935 +msgid "_Astronomy" +msgstr "" + +#: ../src/viktrwlayer.c:8938 +msgid "Open astronomy program at this date and location" +msgstr "" + +#: ../src/viktrwlayer.c:8962 +msgid "_View Google Directions" +msgstr "" + +#: ../src/viktrwlayer.c:8984 +msgid "Use with _Filter" +msgstr "" + +#: ../src/viktrwlayer.c:9018 +msgid "_Edit Trackpoint" +msgstr "" + +#: ../src/viktrwlayer.c:10116 +#, c-format +msgid " - Gain %dm:Loss %dm" +msgstr "" + +#: ../src/viktrwlayer.c:10118 +#, c-format +msgid " - Gain %dft:Loss %dft" +msgstr "" + +#: ../src/viktrwlayer.c:10123 +#, c-format +msgid " - Bearing %3.1f° - Step %s" +msgstr "" + +#: ../src/viktrwlayer.c:10232 +#, c-format +msgid "Querying %s for route between (%.3f, %.3f) and (%.3f, %.3f)." +msgstr "" + +#: ../src/viktrwlayer.c:10248 +#, c-format +msgid "%s returned route between (%.3f, %.3f) and (%.3f, %.3f)." +msgstr "" + +#: ../src/viktrwlayer.c:10251 +#, c-format +msgid "Error getting route from %s." +msgstr "" + +#: ../src/viktrwlayer.c:11070 +#, c-format +msgid "Creating %d Image Thumbnails..." +msgstr "" + +#: ../src/viktrwlayer.c:11560 +msgid "No map layer in use. Create one first" +msgstr "" + +#: ../src/viktrwlayer.c:11679 +#, c-format +msgid "%s: Track List" +msgstr "" + +#: ../src/viktrwlayer.c:11681 +#, c-format +msgid "%s: Route List" +msgstr "" + +#: ../src/viktrwlayer.c:11734 +#, c-format +msgid "" +"Could not write external layer %s to %s, please fix and save before exiting " +"or data will be lost" +msgstr "" + +#: ../src/viktrwlayer.c:11782 +#, c-format +msgid "WARNING: issues encountered loading external layer %s from %s" +msgstr "" + +#: ../src/viktrwlayer_export.c:47 +msgid "Auto Device GPX Simplify:" +msgstr "" + +#: ../src/viktrwlayer_export.c:48 +msgid "" +"GPX saves to certain devices will be simplified for device compatibility." +msgstr "" + +#: ../src/viktrwlayer_export.c:125 +#, c-format +msgid "Export of GPX file simplified using point limit: %d" +msgstr "" + +#: ../src/viktrwlayer_export.c:206 ../src/viktrwlayer_export.c:323 +#: ../src/vikwindow.c:3694 +msgid "The filename you requested could not be opened for writing." +msgstr "" + +#: ../src/viktrwlayer_export.c:226 +#, c-format +msgid "Could not launch %s." +msgstr "" + +#: ../src/viktrwlayer_export.c:234 +msgid "Could not create temporary file for export." +msgstr "" + +#: ../src/viktrwlayer_export.c:268 +msgid "File format:" +msgstr "" + +#: ../src/viktrwlayer_export.c:276 +msgid "Select the file format." +msgstr "" + +#: ../src/viktrwlayer_export.c:281 +msgid "" +"Select the information to process.\n" +"Warning: the behavior of these switches is highly dependent of the file " +"format selected.\n" +"Please, refer to GPSbabel if unsure." +msgstr "" + +#: ../src/viktrwlayer_export.c:308 +msgid "You did not select a valid file format." +msgstr "" + +#: ../src/viktrwlayer_propwin.c:915 ../src/viktrwlayer_propwin.c:3381 +#: ../src/viktrwlayer_propwin.c:3417 ../src/viktrwlayer_propwin.c:3457 +#: ../src/viktrwlayer_propwin.c:3509 ../src/viktrwlayer_propwin.c:3527 +#: ../src/viktrwlayer_propwin.c:3600 ../src/viktrwlayer_propwin.c:3601 +#: ../src/viktrwlayer_propwin.c:3602 ../src/viktrwlayer_propwin.c:3611 +#: ../src/viktrwlayer_propwin.c:3612 ../src/viktrwlayer_propwin.c:3629 +#: ../src/viktrwlayer_propwin.c:3630 ../src/viktrwlayer_propwin.c:3644 +#: ../src/viktrwlayer_propwin.c:3645 ../src/viktrwlayer_propwin.c:3646 +#: ../src/viktrwlayer_propwin.c:3660 ../src/viktrwlayer_propwin.c:3661 +#: ../src/viktrwlayer_propwin.c:3662 ../src/viktrwlayer_propwin.c:3676 +#: ../src/viktrwlayer_propwin.c:3677 ../src/viktrwlayer_propwin.c:3678 +#: ../src/viktrwlayer_propwin.c:3695 ../src/viktrwlayer_propwin.c:3696 +#: ../src/viktrwlayer_analysis.c:293 +#, c-format +msgid "No Data" +msgstr "" + +#: ../src/viktrwlayer_propwin.c:960 ../src/viktrwlayer_propwin.c:1245 +#, c-format +msgid "%.1f kph" +msgstr "" + +#: ../src/viktrwlayer_propwin.c:963 ../src/viktrwlayer_propwin.c:1248 +#: ../src/viktrwlayer_analysis.c:352 +#, c-format +msgid "%.1f mph" +msgstr "" + +#: ../src/viktrwlayer_propwin.c:966 ../src/viktrwlayer_propwin.c:1251 +#, c-format +msgid "%.1f knots" +msgstr "" + +#: ../src/viktrwlayer_propwin.c:969 ../src/viktrwlayer_propwin.c:1254 +#, c-format +msgid "%.1f s/km" +msgstr "" + +#: ../src/viktrwlayer_propwin.c:972 ../src/viktrwlayer_propwin.c:1257 +#: ../src/viktrwlayer_analysis.c:389 ../src/viktrwlayer_analysis.c:392 +#, c-format +msgid "%.1f min/km" +msgstr "" + +#: ../src/viktrwlayer_propwin.c:975 ../src/viktrwlayer_propwin.c:1260 +#, c-format +msgid "%.1f sec/mi" +msgstr "" + +#: ../src/viktrwlayer_propwin.c:978 ../src/viktrwlayer_propwin.c:1263 +#: ../src/viktrwlayer_analysis.c:409 ../src/viktrwlayer_analysis.c:412 +#, c-format +msgid "%.1f min/mi" +msgstr "" + +#. VIK_UNITS_SPEED_METRES_PER_SECOND: +#: ../src/viktrwlayer_propwin.c:982 ../src/viktrwlayer_propwin.c:1267 +#, c-format +msgid "%.1f m/s" +msgstr "" + +#. Minutes +#: ../src/viktrwlayer_propwin.c:1411 +msgid "mins" +msgstr "" + +#. Hours +#: ../src/viktrwlayer_propwin.c:1418 +msgid "h" +msgstr "" + +#. Days +#: ../src/viktrwlayer_propwin.c:1424 +msgid "d" +msgstr "" + +#. Weeks +#: ../src/viktrwlayer_propwin.c:1429 +msgid "w" +msgstr "" + +#. 'Months' +#: ../src/viktrwlayer_propwin.c:1433 +msgid "M" +msgstr "" + +#: ../src/viktrwlayer_propwin.c:2051 ../src/viktrwlayer_analysis.c:303 +#, c-format +msgid "%.1f miles" +msgstr "" + +#: ../src/viktrwlayer_propwin.c:2054 ../src/viktrwlayer_analysis.c:306 +#, c-format +msgid "%.1f NM" +msgstr "" + +#. VIK_UNITS_DISTANCE_KILOMETRES +#: ../src/viktrwlayer_propwin.c:2057 ../src/viktrwlayer_analysis.c:310 +#, c-format +msgid "%.1f km" +msgstr "" + +#: ../src/viktrwlayer_propwin.c:3083 +msgid "Failed spliting track. Track unchanged" +msgstr "" + +#: ../src/viktrwlayer_propwin.c:3234 ../src/viktrwlayer_propwin.c:3744 +#, c-format +msgid "%s - Track Properties" +msgstr "" + +#: ../src/viktrwlayer_propwin.c:3239 +msgid "Split at _Marker" +msgstr "" + +#: ../src/viktrwlayer_propwin.c:3240 +msgid "Split _Segments" +msgstr "" + +#: ../src/viktrwlayer_propwin.c:3241 +msgid "_Reverse" +msgstr "" + +#: ../src/viktrwlayer_propwin.c:3242 +msgid "_Delete Dupl." +msgstr "" + +#: ../src/viktrwlayer_propwin.c:3269 +msgid "Comment:" +msgstr "" + +#: ../src/viktrwlayer_propwin.c:3270 +msgid "Description:" +msgstr "" + +#: ../src/viktrwlayer_propwin.c:3271 +msgid "Source:" +msgstr "" + +#: ../src/viktrwlayer_propwin.c:3272 +msgid "Type:" +msgstr "" + +#: ../src/viktrwlayer_propwin.c:3273 +msgid "Color:" +msgstr "" + +#: ../src/viktrwlayer_propwin.c:3274 +msgid "Draw Name:" +msgstr "" + +#: ../src/viktrwlayer_propwin.c:3275 +msgid "Distance Labels:" +msgstr "" + +#: ../src/viktrwlayer_propwin.c:3278 +msgid "Track Length:" +msgstr "" + +#: ../src/viktrwlayer_propwin.c:3279 +msgid "Trackpoints:" +msgstr "" + +#: ../src/viktrwlayer_propwin.c:3280 +msgid "Segments:" +msgstr "" + +#: ../src/viktrwlayer_propwin.c:3281 +msgid "Duplicate Points:" +msgstr "" + +#: ../src/viktrwlayer_propwin.c:3282 +msgid "Max Speed:" +msgstr "" + +#: ../src/viktrwlayer_propwin.c:3283 +msgid "Avg. Speed:" +msgstr "" + +#: ../src/viktrwlayer_propwin.c:3284 +msgid "Moving Avg. Speed:" +msgstr "" + +#: ../src/viktrwlayer_propwin.c:3285 +msgid "Avg. Dist. Between TPs:" +msgstr "" + +#: ../src/viktrwlayer_propwin.c:3286 +msgid "Elevation Range:" +msgstr "" + +#: ../src/viktrwlayer_propwin.c:3287 +msgid "Total Elevation Gain/Loss:" +msgstr "" + +#: ../src/viktrwlayer_propwin.c:3288 +msgid "Start:" +msgstr "" + +#: ../src/viktrwlayer_propwin.c:3289 +msgid "End:" +msgstr "" + +#: ../src/viktrwlayer_propwin.c:3290 +msgid "Duration:" +msgstr "" + +#: ../src/viktrwlayer_propwin.c:3320 +msgid "Centre" +msgstr "" + +#: ../src/viktrwlayer_propwin.c:3321 +msgid "Start only" +msgstr "" + +#: ../src/viktrwlayer_propwin.c:3322 +msgid "End only" +msgstr "" + +#: ../src/viktrwlayer_propwin.c:3323 +msgid "Start and End" +msgstr "" + +#: ../src/viktrwlayer_propwin.c:3324 +msgid "Centre, Start and End" +msgstr "" + +#: ../src/viktrwlayer_propwin.c:3336 +msgid "Maximum number of distance labels to be shown" +msgstr "" + +#: ../src/viktrwlayer_propwin.c:3340 +msgid "Properties" +msgstr "" + +#: ../src/viktrwlayer_propwin.c:3584 +#, c-format +msgid "%d minutes - %d minutes moving" +msgstr "" + +#: ../src/viktrwlayer_propwin.c:3596 +#, c-format +msgid "%s total - %s in segments" +msgstr "" + +#: ../src/viktrwlayer_propwin.c:3607 ../src/viktrwlayer_analysis.c:622 +msgid "Statistics" +msgstr "" + +#: ../src/viktrwlayer_propwin.c:3613 ../src/viktrwlayer_propwin.c:3680 +msgid "Show D_EM" +msgstr "" + +#: ../src/viktrwlayer_propwin.c:3615 ../src/viktrwlayer_propwin.c:3631 +#: ../src/viktrwlayer_propwin.c:3647 ../src/viktrwlayer_propwin.c:3697 +msgid "Show _GPS Speed" +msgstr "" + +#: ../src/viktrwlayer_propwin.c:3617 ../src/viktrwlayer_propwin.c:3633 +#: ../src/viktrwlayer_propwin.c:3665 ../src/viktrwlayer_propwin.c:3699 +msgid "Track Distance:" +msgstr "" + +#: ../src/viktrwlayer_propwin.c:3618 ../src/viktrwlayer_propwin.c:3684 +msgid "Track Height:" +msgstr "" + +#: ../src/viktrwlayer_propwin.c:3624 +msgid "Elevation-distance" +msgstr "" + +#: ../src/viktrwlayer_propwin.c:3634 +msgid "Track Gradient:" +msgstr "" + +#: ../src/viktrwlayer_propwin.c:3639 +msgid "Gradient-distance" +msgstr "" + +#: ../src/viktrwlayer_propwin.c:3649 ../src/viktrwlayer_propwin.c:3666 +#: ../src/viktrwlayer_propwin.c:3683 +msgid "Track Time:" +msgstr "" + +#: ../src/viktrwlayer_propwin.c:3650 ../src/viktrwlayer_propwin.c:3700 +msgid "Track Speed:" +msgstr "" + +#: ../src/viktrwlayer_propwin.c:3651 ../src/viktrwlayer_propwin.c:3667 +#: ../src/viktrwlayer_propwin.c:3685 +msgid "Time/Date:" +msgstr "" + +#: ../src/viktrwlayer_propwin.c:3655 +msgid "Speed-time" +msgstr "" + +#: ../src/viktrwlayer_propwin.c:3663 ../src/viktrwlayer_propwin.c:3679 +msgid "Show S_peed" +msgstr "" + +#: ../src/viktrwlayer_propwin.c:3671 +msgid "Distance-time" +msgstr "" + +#: ../src/viktrwlayer_propwin.c:3690 +msgid "Elevation-time" +msgstr "" + +#: ../src/viktrwlayer_propwin.c:3705 +msgid "Speed-distance" +msgstr "" + +#: ../src/viktrwlayer_tpwin.c:190 ../src/viktrwlayer_wpwin.c:66 +msgid "Date/Time Edit" +msgstr "" + +#: ../src/viktrwlayer_tpwin.c:242 +msgid "Name:" +msgstr "" + +#: ../src/viktrwlayer_tpwin.c:243 +msgid "Latitude:" +msgstr "" + +#: ../src/viktrwlayer_tpwin.c:244 +msgid "Longitude:" +msgstr "" + +#: ../src/viktrwlayer_tpwin.c:245 +msgid "Altitude:" +msgstr "" + +#: ../src/viktrwlayer_tpwin.c:246 +msgid "Course:" +msgstr "" + +#: ../src/viktrwlayer_tpwin.c:247 +msgid "Timestamp:" +msgstr "" + +#: ../src/viktrwlayer_tpwin.c:248 +msgid "Time:" +msgstr "" + +#: ../src/viktrwlayer_tpwin.c:249 +msgid "Distance Difference:" +msgstr "" + +#: ../src/viktrwlayer_tpwin.c:250 +msgid "Time Difference:" +msgstr "" + +#: ../src/viktrwlayer_tpwin.c:251 +msgid "\"Speed\" Between:" +msgstr "" + +#: ../src/viktrwlayer_tpwin.c:252 +msgid "Speed:" +msgstr "" + +#: ../src/viktrwlayer_tpwin.c:253 +msgid "VDOP:" +msgstr "" + +#: ../src/viktrwlayer_tpwin.c:254 +msgid "HDOP:" +msgstr "" + +#: ../src/viktrwlayer_tpwin.c:255 +msgid "PDOP:" +msgstr "" + +#: ../src/viktrwlayer_tpwin.c:256 +msgid "SAT/FIX:" +msgstr "" + +#: ../src/viktrwlayer_tpwin.c:263 ../src/viktrwlayer_tpwin.c:408 +#: ../src/viktrwlayer_tpwin.c:622 +msgid "Trackpoint" +msgstr "" + +#: ../src/viktrwlayer_tpwin.c:266 +msgid "_Insert After" +msgstr "" + +#: ../src/viktrwlayer_tpwin.c:268 +msgid "Split Here" +msgstr "" + +#: ../src/viktrwlayer_tracklist.c:262 ../src/viktrwlayer_waypointlist.c:306 +msgid "_Copy Data" +msgstr "" + +#. +#. item = gtk_image_menu_item_new_with_mnemonic ( _("_Select") ); +#. gtk_image_menu_item_set_image ( (GtkImageMenuItem*)item, gtk_image_new_from_stock (GTK_STOCK_FIND, GTK_ICON_SIZE_MENU) ); +#. g_signal_connect_swapped ( G_OBJECT(item), "activate", G_CALLBACK(trw_layer_track_select), values ); +#. gtk_menu_shell_append (GTK_MENU_SHELL (menu), item); +#. gtk_widget_show ( item ); +#. +#. ATM view auto selects, so don't bother with separate select menu entry +#. +#. item = gtk_image_menu_item_new_with_mnemonic ( _("_Select") ); +#. gtk_image_menu_item_set_image ( (GtkImageMenuItem*)item, gtk_image_new_from_stock (GTK_STOCK_FIND, GTK_ICON_SIZE_MENU) ); +#. g_signal_connect_swapped ( G_OBJECT(item), "activate", G_CALLBACK(trw_layer_waypoint_select), values ); +#. gtk_menu_shell_append (GTK_MENU_SHELL (menu), item); +#. gtk_widget_show ( item ); +#. +#. AUTO SELECT NOT TRUE YET... +#. ATM view auto selects, so don't bother with separate select menu entry +#: ../src/viktrwlayer_tracklist.c:290 ../src/viktrwlayer_waypointlist.c:341 +#: ../src/vikwindow.c:4816 +msgid "_View" +msgstr "" + +#. Insert column for the layer name when viewing multi layers +#: ../src/viktrwlayer_tracklist.c:613 ../src/viktrwlayer_waypointlist.c:609 +msgid "Layer" +msgstr "" + +#: ../src/viktrwlayer_tracklist.c:627 ../src/viktrwlayer_waypointlist.c:624 +msgid "Date" +msgstr "" + +#: ../src/viktrwlayer_tracklist.c:631 ../src/viktrwlayer_waypointlist.c:628 +msgid "Visible" +msgstr "" + +#: ../src/viktrwlayer_tracklist.c:639 +msgid "" +"Distance\n" +"(miles)" +msgstr "" + +#: ../src/viktrwlayer_tracklist.c:642 +msgid "" +"Distance\n" +"(NM)" +msgstr "" + +#: ../src/viktrwlayer_tracklist.c:645 +msgid "" +"Distance\n" +"(km)" +msgstr "" + +#: ../src/viktrwlayer_tracklist.c:651 +msgid "" +"Length\n" +"(minutes)" +msgstr "" + +#: ../src/viktrwlayer_tracklist.c:660 ../src/vikutils.c:93 +msgid "sec/mi" +msgstr "" + +#: ../src/viktrwlayer_tracklist.c:666 +#, c-format +msgid "" +"Av. Speed\n" +"(%s)" +msgstr "" + +#. Apply own formatting of the data +#: ../src/viktrwlayer_tracklist.c:671 +#, c-format +msgid "" +"Max Speed\n" +"(%s)" +msgstr "" + +#: ../src/viktrwlayer_tracklist.c:679 ../src/viktrwlayer_waypointlist.c:637 +msgid "" +"Max Height\n" +"(Feet)" +msgstr "" + +#: ../src/viktrwlayer_tracklist.c:681 ../src/viktrwlayer_waypointlist.c:639 +msgid "" +"Max Height\n" +"(Metres)" +msgstr "" + +#: ../src/viktrwlayer_waypointlist.c:312 +msgid "Copy Data (with _positions)" +msgstr "" + +#: ../src/viktrwlayer_waypointlist.c:633 +msgid "Comment" +msgstr "" + +#: ../src/viktrwlayer_waypointlist.c:643 +msgid "Symbol" +msgstr "" + +#: ../src/viktrwlayer_wpwin.c:93 ../src/viktrwlayer_wpwin.c:302 +msgid "True" +msgstr "" + +#: ../src/viktrwlayer_wpwin.c:122 +msgid "Waypoint Properties" +msgstr "" + +#: ../src/viktrwlayer_wpwin.c:164 +msgid "Name:" +msgstr "" + +#: ../src/viktrwlayer_wpwin.c:181 +msgid "Altitude:" +msgstr "" + +#: ../src/viktrwlayer_wpwin.c:186 ../src/viktrwlayer_wpwin.c:188 +msgid "Comment:" +msgstr "" + +#: ../src/viktrwlayer_wpwin.c:202 +msgid "Source:" +msgstr "" + +#: ../src/viktrwlayer_wpwin.c:212 +msgid "Image:" +msgstr "" + +#: ../src/viktrwlayer_wpwin.c:217 +msgid "Symbol:" +msgstr "" + +#: ../src/viktrwlayer_wpwin.c:226 +msgid "(none)" +msgstr "" + +#. Geotag Info [readonly] +#: ../src/viktrwlayer_wpwin.c:272 +msgid "Has Geotag" +msgstr "" + +#: ../src/viktrwlayer_wpwin.c:279 +msgid "Consistent Position" +msgstr "" + +#. ATM the direction value box is always shown, even when there is no information. +#. It would be nice to be able to hide it until the 'Add' has been performed, +#. however I've not been able to achieve this. +#. Thus simply sensistizing it instead. +#: ../src/viktrwlayer_wpwin.c:292 +msgid "Image Direction:" +msgstr "" + +#: ../src/viktrwlayer_wpwin.c:300 +msgid "Magnetic" +msgstr "" + +#: ../src/viktrwlayer_wpwin.c:320 +msgid "Time:" +msgstr "" + +#. TODO: other checks (isalpha or whatever ) +#: ../src/viktrwlayer_wpwin.c:386 +msgid "Please enter a name for the waypoint." +msgstr "" + +#: ../src/viktrwlayer_geotag.c:320 ../src/viktrwlayer_geotag.c:460 +#, c-format +msgid "Failed updating EXIF on %s" +msgstr "" + +#: ../src/viktrwlayer_geotag.c:562 +#, c-format +msgid "Geotagging %d Images..." +msgstr "" + +#: ../src/viktrwlayer_geotag.c:630 +msgid "Geotag Images" +msgstr "" + +#: ../src/viktrwlayer_geotag.c:640 +msgid "Images" +msgstr "" + +#: ../src/viktrwlayer_geotag.c:645 +msgid "Overwrite Existing Waypoints:" +msgstr "" + +#: ../src/viktrwlayer_geotag.c:648 +msgid "Overwrite Existing GPS Information:" +msgstr "" + +#: ../src/viktrwlayer_geotag.c:650 +msgid "Keep File Modification Timestamp:" +msgstr "" + +#: ../src/viktrwlayer_geotag.c:684 +msgid "Create Waypoints:" +msgstr "" + +#: ../src/viktrwlayer_geotag.c:693 +msgid "Write EXIF:" +msgstr "" + +#: ../src/viktrwlayer_geotag.c:705 +msgid "Automatic Image Direction:" +msgstr "" + +#: ../src/viktrwlayer_geotag.c:707 +msgid "Set image direction based on a heading derived from the track" +msgstr "" + +#: ../src/viktrwlayer_geotag.c:710 +msgid "Interpolate Between Track Segments:" +msgstr "" + +#: ../src/viktrwlayer_geotag.c:715 +msgid "Image Time Offset (Seconds):" +msgstr "" + +#: ../src/viktrwlayer_geotag.c:718 +msgid "" +"The number of seconds to ADD to the photos time to make it match the GPS " +"data. Calculate this with (GPS - Photo). Can be negative or positive. Useful " +"to adjust times when a camera's timestamp was incorrect." +msgstr "" + +#: ../src/viktrwlayer_geotag.c:721 +msgid "Image Timezone:" +msgstr "" + +#: ../src/viktrwlayer_geotag.c:724 +msgid "" +"The timezone that was used when the images were created. For example, if a " +"camera is set to AWST or +8:00 hours. Enter +8:00 here so that the correct " +"adjustment to the images' time can be made. GPS data is always in UTC." +msgstr "" + +#: ../src/viktrwlayer_geotag.c:728 +#, c-format +msgid "Using waypoint: %s" +msgstr "" + +#: ../src/viktrwlayer_geotag.c:742 +#, c-format +msgid "Using track: %s" +msgstr "" + +#: ../src/viktrwlayer_geotag.c:744 +#, c-format +msgid "Using all tracks in: %s" +msgstr "" + +#: ../src/viktrwlayer_analysis.c:214 +msgid "Number of Tracks" +msgstr "" + +#: ../src/viktrwlayer_analysis.c:215 +msgid "Date Range" +msgstr "" + +#: ../src/viktrwlayer_analysis.c:216 +msgid "Total Length" +msgstr "" + +#: ../src/viktrwlayer_analysis.c:217 +msgid "Average Length" +msgstr "" + +#: ../src/viktrwlayer_analysis.c:218 +msgid "Eddington number" +msgstr "" + +#. No.4: Extended display only +#: ../src/viktrwlayer_analysis.c:219 +msgid "Max Speed" +msgstr "" + +#: ../src/viktrwlayer_analysis.c:220 +msgid "Avg. Speed" +msgstr "" + +#: ../src/viktrwlayer_analysis.c:221 +msgid "Minimum Altitude" +msgstr "" + +#: ../src/viktrwlayer_analysis.c:222 +msgid "Maximum Altitude" +msgstr "" + +#: ../src/viktrwlayer_analysis.c:223 +msgid "Total Elevation Gain/Loss" +msgstr "" + +#: ../src/viktrwlayer_analysis.c:224 +msgid "Avg. Elevation Gain/Loss" +msgstr "" + +#: ../src/viktrwlayer_analysis.c:225 +msgid "Total Duration" +msgstr "" + +#: ../src/viktrwlayer_analysis.c:226 +msgid "Avg. Duration" +msgstr "" + +#: ../src/viktrwlayer_analysis.c:317 +#, c-format +msgid "%.2f miles" +msgstr "" + +#: ../src/viktrwlayer_analysis.c:320 +#, c-format +msgid "%.2f NM" +msgstr "" + +#. VIK_UNITS_DISTANCE_KILOMETRES +#: ../src/viktrwlayer_analysis.c:324 +#, c-format +msgid "%.2f km" +msgstr "" + +#: ../src/viktrwlayer_analysis.c:361 +#, c-format +msgid "%.2f m/s" +msgstr "" + +#: ../src/viktrwlayer_analysis.c:370 ../src/viktrwlayer_analysis.c:373 +#, c-format +msgid "%.2f knots" +msgstr "" + +#: ../src/viktrwlayer_analysis.c:379 ../src/viktrwlayer_analysis.c:382 +#, c-format +msgid "%d s/km" +msgstr "" + +#: ../src/viktrwlayer_analysis.c:399 ../src/viktrwlayer_analysis.c:402 +#, c-format +msgid "%d sec/mi" +msgstr "" + +#: ../src/viktrwlayer_analysis.c:420 ../src/viktrwlayer_analysis.c:423 +#, c-format +msgid "%.2f km/h" +msgstr "" + +#: ../src/viktrwlayer_analysis.c:434 ../src/viktrwlayer_analysis.c:440 +#, c-format +msgid "%d feet" +msgstr "" + +#: ../src/viktrwlayer_analysis.c:445 ../src/viktrwlayer_analysis.c:447 +#, c-format +msgid "%d feet / %d feet" +msgstr "" + +#: ../src/viktrwlayer_analysis.c:452 ../src/viktrwlayer_analysis.c:458 +#, c-format +msgid "%d m" +msgstr "" + +#: ../src/viktrwlayer_analysis.c:463 ../src/viktrwlayer_analysis.c:465 +#, c-format +msgid "%d m / %d m" +msgstr "" + +#: ../src/viktrwlayer_analysis.c:477 +#, c-format +msgid "%d:%02d:%02d days:hrs:mins" +msgstr "" + +#: ../src/viktrwlayer_analysis.c:484 +#, c-format +msgid "%d:%02d hrs:mins" +msgstr "" + +#: ../src/viktrwlayer_analysis.c:658 +msgid "Include Invisible Items" +msgstr "" + +#: ../src/vikstatus.c:129 +msgid "Current number of background tasks. Click to see the background jobs." +msgstr "" + +#: ../src/vikstatus.c:134 +msgid "Current zoom level. Click to select a new one." +msgstr "" + +#: ../src/vikstatus.c:141 +msgid "Left click to clear the message. Right click to copy the message." +msgstr "" + +#: ../src/vikutils.c:108 +msgid "GPSD" +msgstr "" + +#. GPS Preamble +#: ../src/vikutils.c:109 +msgid "Trkpt" +msgstr "" + +#: ../src/vikutils.c:160 +#, c-format +msgid "%sSpeed%s %.1f%s" +msgstr "" + +#. Go for 2dp as expect low values for vertical speeds +#: ../src/vikutils.c:214 +#, c-format +msgid "%sClimb%s %.2f%s" +msgstr "" + +#: ../src/vikutils.c:223 +#, c-format +msgid "%sAlt %dfeet" +msgstr "" + +#. VIK_UNITS_HEIGHT_METRES: +#: ../src/vikutils.c:227 +#, c-format +msgid "%sAlt %dm" +msgstr "" + +#: ../src/vikutils.c:235 +#, c-format +msgid "%sCourse %03d°" +msgstr "" + +#: ../src/vikutils.c:249 +msgid "yards" +msgstr "" + +#. VIK_UNITS_DISTANCE_KILOMETRES: +#: ../src/vikutils.c:253 +msgid "m" +msgstr "" + +#: ../src/vikutils.c:257 +#, c-format +msgid "%sDistance diff %d%s" +msgstr "" + +#: ../src/vikutils.c:272 +#, c-format +msgid "%sTime %s" +msgstr "" + +#: ../src/vikutils.c:281 +#, c-format +msgid "%sTime diff %lds" +msgstr "" + +#: ../src/vikutils.c:287 +#, c-format +msgid "%sNo. of Sats %d" +msgstr "" + +#: ../src/vikutils.c:312 +#, c-format +msgid "%sTo End %.2f%s" +msgstr "" + +#: ../src/vikutils.c:339 +#, c-format +msgid "%sDistance along %.2f%s" +msgstr "" + +#: ../src/vikutils.c:359 +#, c-format +msgid "%sTrack: %s" +msgstr "" + +#: ../src/vikutils.c:396 +#, c-format +msgid "" +"There is a newer version of Viking available: %s\n" +"\n" +"Do you wish to go to Viking's website now?" +msgstr "" + +#: ../src/vikutils.c:526 +msgid "" +"This appears to be Viking's very first run.\n" +"\n" +"Do you wish to enable automatic internet features?\n" +"\n" +"Individual settings can be controlled in the Preferences." +msgstr "" + +#: ../src/vikwaypoint.c:37 +msgid "Waypoint" +msgstr "" + +#: ../src/vikwebtool_datasource.c:352 +msgid "Search Term" +msgstr "" + +#. TODO get rid of this as this is unnecessary duplication... +#: ../src/vikwindow.c:258 +msgid "Pan" +msgstr "" + +#: ../src/vikwindow.c:258 +msgid "Zoom" +msgstr "" + +#: ../src/vikwindow.c:258 +msgid "Ruler" +msgstr "" + +#: ../src/vikwindow.c:258 +msgid "Select" +msgstr "" + +#: ../src/vikwindow.c:368 +msgid "This is Viking " +msgstr "" + +#: ../src/vikwindow.c:457 +msgid "Location lookup aborted" +msgstr "" + +#: ../src/vikwindow.c:477 +#, c-format +msgid "Location found: %s" +msgstr "" + +#: ../src/vikwindow.c:486 +msgid "Unable to determine location" +msgstr "" + +#: ../src/vikwindow.c:495 +msgid "Determining location" +msgstr "" + +#: ../src/vikwindow.c:525 +#, c-format +msgid "Location found via geoclue" +msgstr "" + +#: ../src/vikwindow.c:546 +msgid "Default Map" +msgstr "" + +#: ../src/vikwindow.c:557 ../src/vikwindow.c:3938 +msgid "Trying to determine location..." +msgstr "" + +#. Create tooltip +#: ../src/vikwindow.c:723 +msgid "Select zoom level" +msgstr "" + +#: ../src/vikwindow.c:1176 +#, c-format +msgid "" +"Do you want to save the changes you made to the document \"%s\"?\n" +"\n" +"Your changes will be lost if you don't save them." +msgstr "" + +#: ../src/vikwindow.c:1180 +msgid "Don't Save" +msgstr "" + +#: ../src/vikwindow.c:1268 +msgid "mpp" +msgstr "" + +#: ../src/vikwindow.c:1268 +msgid "pixelfact" +msgstr "" + +#: ../src/vikwindow.c:1467 +#, c-format +msgid "%s %s %dm" +msgstr "" + +#: ../src/vikwindow.c:1469 +#, c-format +msgid "%s %s %dft" +msgstr "" + +#: ../src/vikwindow.c:1472 +#, c-format +msgid "%s %s" +msgstr "" + +#: ../src/vikwindow.c:1929 +msgid "_Ruler" +msgstr "" + +#: ../src/vikwindow.c:1929 +msgid "Ruler Tool" +msgstr "" + +#: ../src/vikwindow.c:2204 ../src/vikwindow.c:4818 +msgid "_Zoom" +msgstr "" + +#: ../src/vikwindow.c:2204 +msgid "Zoom Tool" +msgstr "" + +#: ../src/vikwindow.c:2271 ../src/vikwindow.c:4819 +msgid "_Pan" +msgstr "" + +#: ../src/vikwindow.c:2271 +msgid "Pan Tool" +msgstr "" + +#: ../src/vikwindow.c:2425 +msgid "_Select" +msgstr "" + +#: ../src/vikwindow.c:2425 +msgid "Select Tool" +msgstr "" + +#: ../src/vikwindow.c:2615 +msgid "You must select a layer to show its properties." +msgstr "" + +#. No error to show, so unlikely this will get called +#: ../src/vikwindow.c:2629 +msgid "The help system is not available." +msgstr "" + +#. Main error path +#: ../src/vikwindow.c:2632 +#, c-format +msgid "" +"Help is not available because: %s.\n" +"Ensure a Mime Type ghelp handler program is installed (e.g. yelp)." +msgstr "" + +#: ../src/vikwindow.c:2865 +msgid "You must select a layer to delete." +msgstr "" + +#: ../src/vikwindow.c:3171 +msgid "Untitled" +msgstr "" + +#: ../src/vikwindow.c:3300 +#, c-format +msgid "Unable to add '%s' to the list of recently used documents" +msgstr "" + +#: ../src/vikwindow.c:3391 +msgid "The file you requested could not be opened." +msgstr "" + +#: ../src/vikwindow.c:3394 +msgid "" +"GPSBabel is required to load files of this type or GPSBabel encountered " +"problems." +msgstr "" + +#: ../src/vikwindow.c:3397 +#, c-format +msgid "Unable to load malformed GPX file %s" +msgstr "" + +#: ../src/vikwindow.c:3400 +#, c-format +msgid "Unsupported file type for %s" +msgstr "" + +#. Since we can process .vik files with issues just show a warning in the status bar +#. Not that a user can do much about it... or tells them what this issue is yet... +#: ../src/vikwindow.c:3406 +#, c-format +msgid "WARNING: issues encountered loading %s" +msgstr "" + +#: ../src/vikwindow.c:3489 +msgid "Please select a GPS data file to open. " +msgstr "" + +#: ../src/vikwindow.c:3508 +msgid "Google Earth" +msgstr "" + +#: ../src/vikwindow.c:3523 ../src/vikwindow.c:3646 ../src/viking.desktop.in.h:1 +msgid "Viking" +msgstr "" + +#: ../src/vikwindow.c:3594 ../src/vikwindow.c:4632 +msgid "Open File" +msgstr "" + +#: ../src/vikwindow.c:3630 +msgid "Save as Viking File." +msgstr "" + +#: ../src/vikwindow.c:3757 +#, c-format +msgid "Exporting to file: %s" +msgstr "" + +#. Confirm what happened. +#: ../src/vikwindow.c:3774 +#, c-format +msgid "Exported files: %d" +msgstr "" + +#: ../src/vikwindow.c:3786 +msgid "Nothing to Export!" +msgstr "" + +#: ../src/vikwindow.c:3790 +msgid "Export to directory" +msgstr "" + +#: ../src/vikwindow.c:3809 +msgid "Could not convert all files" +msgstr "" + +#: ../src/vikwindow.c:3851 +msgid "File not accessible" +msgstr "" + +#: ../src/vikwindow.c:3854 +msgid "No Viking File" +msgstr "" + +#: ../src/vikwindow.c:3998 +msgid "This layer has no configurable properties." +msgstr "" + +#: ../src/vikwindow.c:4080 +msgid "Are you sure you wish to delete all layers?" +msgstr "" + +#. Try harder... +#: ../src/vikwindow.c:4126 ../src/vikwindow.c:4132 +msgid "Generating image file..." +msgstr "" + +#: ../src/vikwindow.c:4154 +msgid "" +"Failed to generate internal image.\n" +"\n" +"Try creating a smaller image." +msgstr "" + +#: ../src/vikwindow.c:4175 +msgid "Image file generated." +msgstr "" + +#: ../src/vikwindow.c:4177 +msgid "Failed to generate image file." +msgstr "" + +#: ../src/vikwindow.c:4246 +#, c-format +msgid "Unable to write to file %s: %s" +msgstr "" + +#: ../src/vikwindow.c:4284 +msgid "" +"Viewable region outside allowable pixel size bounds for image. Clipping " +"width/height values." +msgstr "" + +#: ../src/vikwindow.c:4309 +#, c-format +msgid "Total area: %ldm x %ldm (%.3f sq. km)" +msgstr "" + +#: ../src/vikwindow.c:4312 +#, c-format +msgid "Total area: %ldm x %ldm (%.3f sq. miles)" +msgstr "" + +#: ../src/vikwindow.c:4315 +#, c-format +msgid "Total area: %ldm x %ldm (%.3f sq. NM)" +msgstr "" + +#. Single file +#: ../src/vikwindow.c:4343 +msgid "Save Image" +msgstr "" + +#: ../src/vikwindow.c:4364 ../src/vikwindow.c:4641 +msgid "KMZ" +msgstr "" + +#: ../src/vikwindow.c:4417 +msgid "You must be in UTM mode to use this feature" +msgstr "" + +#: ../src/vikwindow.c:4421 +msgid "Choose a directory to hold images" +msgstr "" + +#. todo: default for answers inside VikWindow or static (thruout instance) +#: ../src/vikwindow.c:4441 +msgid "Save to Image File" +msgstr "" + +#: ../src/vikwindow.c:4457 +msgid "Width (pixels):" +msgstr "" + +#: ../src/vikwindow.c:4459 +msgid "Height (pixels):" +msgstr "" + +#: ../src/vikwindow.c:4462 +msgid "" +"WARNING: USING LARGE IMAGES OVER 10000x10000\n" +"MAY CRASH THE PROGRAM!" +msgstr "" + +#: ../src/vikwindow.c:4464 +msgid "Zoom (meters per pixel):" +msgstr "" + +#: ../src/vikwindow.c:4480 +msgid "Area in current viewable window" +msgstr "" + +#: ../src/vikwindow.c:4490 +msgid "Save as PNG" +msgstr "" + +#: ../src/vikwindow.c:4491 +msgid "Save as JPEG" +msgstr "" + +#: ../src/vikwindow.c:4520 +msgid "East-west image tiles:" +msgstr "" + +#: ../src/vikwindow.c:4522 +msgid "North-south image tiles:" +msgstr "" + +#: ../src/vikwindow.c:4619 +msgid "This feature is not available in UTM mode" +msgstr "" + +#: ../src/vikwindow.c:4658 +#, c-format +msgid "Unable to import %s." +msgstr "" + +#: ../src/vikwindow.c:4749 +msgid "Choose a background color" +msgstr "" + +#: ../src/vikwindow.c:4765 +msgid "Choose a track highlight color" +msgstr "" + +#: ../src/vikwindow.c:4814 +msgid "_File" +msgstr "" + +#: ../src/vikwindow.c:4815 +msgid "_Edit" +msgstr "" + +#: ../src/vikwindow.c:4817 +msgid "_Show" +msgstr "" + +#: ../src/vikwindow.c:4820 +msgid "_Layers" +msgstr "" + +#: ../src/vikwindow.c:4821 +msgid "_Tools" +msgstr "" + +#: ../src/vikwindow.c:4822 +msgid "_Webtools" +msgstr "" + +#: ../src/vikwindow.c:4823 ../src/vikwindow.c:4893 +msgid "_Help" +msgstr "" + +#: ../src/vikwindow.c:4825 +msgid "New file" +msgstr "" + +#: ../src/vikwindow.c:4826 +msgid "_Open..." +msgstr "" + +#: ../src/vikwindow.c:4826 +msgid "Open a file" +msgstr "" + +#: ../src/vikwindow.c:4827 +msgid "Open _Recent File" +msgstr "" + +#: ../src/vikwindow.c:4828 +msgid "Append _File..." +msgstr "" + +#: ../src/vikwindow.c:4828 +msgid "Append data from a different file" +msgstr "" + +#: ../src/vikwindow.c:4829 +msgid "Open GPX as External _Layer..." +msgstr "" + +#: ../src/vikwindow.c:4829 +msgid "Open a GPX file as an external layer" +msgstr "" + +#: ../src/vikwindow.c:4830 +msgid "_Export All" +msgstr "" + +#: ../src/vikwindow.c:4830 +msgid "Export All TrackWaypoint Layers" +msgstr "" + +#: ../src/vikwindow.c:4831 +msgid "_GPX..." +msgstr "" + +#: ../src/vikwindow.c:4831 +msgid "Export as GPX" +msgstr "" + +#: ../src/vikwindow.c:4832 +msgid "A_cquire" +msgstr "" + +#: ../src/vikwindow.c:4833 +msgid "_Directions..." +msgstr "" + +#: ../src/vikwindow.c:4833 +msgid "Get driving directions" +msgstr "" + +#: ../src/vikwindow.c:4835 +msgid "_OSM Traces..." +msgstr "" + +#: ../src/vikwindow.c:4835 +msgid "Get traces from OpenStreetMap" +msgstr "" + +#: ../src/vikwindow.c:4836 +msgid "_My OSM Traces..." +msgstr "" + +#: ../src/vikwindow.c:4836 +msgid "Get Your Own Traces from OpenStreetMap" +msgstr "" + +#: ../src/vikwindow.c:4839 +msgid "Geo_caches..." +msgstr "" + +#: ../src/vikwindow.c:4839 +msgid "Get Geocaches from geocaching.com" +msgstr "" + +#: ../src/vikwindow.c:4842 +msgid "Create waypoints from geotagged images" +msgstr "" + +#: ../src/vikwindow.c:4844 +msgid "Get a file from a URL" +msgstr "" + +#: ../src/vikwindow.c:4846 +msgid "Create waypoints from Wikipedia items in the current view" +msgstr "" + +#: ../src/vikwindow.c:4848 +msgid "_Save" +msgstr "" + +#: ../src/vikwindow.c:4848 +msgid "Save the file" +msgstr "" + +#: ../src/vikwindow.c:4849 +msgid "Save _As..." +msgstr "" + +#: ../src/vikwindow.c:4849 +msgid "Save the file under different name" +msgstr "" + +#: ../src/vikwindow.c:4850 +msgid "Properties..." +msgstr "" + +#: ../src/vikwindow.c:4850 +msgid "File Properties" +msgstr "" + +#: ../src/vikwindow.c:4852 +msgid "Import KMZ _Map File..." +msgstr "" + +#: ../src/vikwindow.c:4852 +msgid "Import a KMZ file" +msgstr "" + +#: ../src/vikwindow.c:4853 +msgid "Generate _KMZ Map File..." +msgstr "" + +#: ../src/vikwindow.c:4853 +msgid "Generate a KMZ file with an overlay of the current view" +msgstr "" + +#: ../src/vikwindow.c:4855 +msgid "_Generate Image File..." +msgstr "" + +#: ../src/vikwindow.c:4855 +msgid "Save a snapshot of the workspace into a file" +msgstr "" + +#: ../src/vikwindow.c:4856 +msgid "Generate _Directory of Images..." +msgstr "" + +#: ../src/vikwindow.c:4856 +msgid "Generate _Directory of Images" +msgstr "" + +#: ../src/vikwindow.c:4857 +msgid "_Print..." +msgstr "" + +#: ../src/vikwindow.c:4857 +msgid "Print maps" +msgstr "" + +#: ../src/vikwindow.c:4858 +msgid "E_xit" +msgstr "" + +#: ../src/vikwindow.c:4858 +msgid "Exit the program" +msgstr "" + +#: ../src/vikwindow.c:4859 +msgid "Save and Exit" +msgstr "" + +#: ../src/vikwindow.c:4859 +msgid "Save and Exit the program" +msgstr "" + +#: ../src/vikwindow.c:4861 +msgid "Go to the Pre_vious Location" +msgstr "" + +#: ../src/vikwindow.c:4861 +msgid "Go to the previous location" +msgstr "" + +#: ../src/vikwindow.c:4862 +msgid "Go to the _Next Location" +msgstr "" + +#: ../src/vikwindow.c:4862 +msgid "Go to the next location" +msgstr "" + +#: ../src/vikwindow.c:4863 +msgid "Go to the _Default Location" +msgstr "" + +#: ../src/vikwindow.c:4863 +msgid "Go to the default location" +msgstr "" + +#: ../src/vikwindow.c:4864 +msgid "Go to the _Auto Location" +msgstr "" + +#: ../src/vikwindow.c:4864 +msgid "Go to a location via automatic lookup" +msgstr "" + +#: ../src/vikwindow.c:4865 +msgid "Go to _Location..." +msgstr "" + +#: ../src/vikwindow.c:4865 +msgid "Go to address/place using text search" +msgstr "" + +#: ../src/vikwindow.c:4866 +msgid "_Go to Lat/Lon..." +msgstr "" + +#: ../src/vikwindow.c:4866 +msgid "Go to arbitrary lat/lon coordinate" +msgstr "" + +#: ../src/vikwindow.c:4867 +msgid "Go to UTM..." +msgstr "" + +#: ../src/vikwindow.c:4867 +msgid "Go to arbitrary UTM coordinate" +msgstr "" + +#: ../src/vikwindow.c:4868 +msgid "Go to Today" +msgstr "" + +#: ../src/vikwindow.c:4868 +msgid "Go to today on the calendar" +msgstr "" + +#: ../src/vikwindow.c:4869 +msgid "_Refresh" +msgstr "" + +#: ../src/vikwindow.c:4869 +msgid "Refresh any maps displayed" +msgstr "" + +#: ../src/vikwindow.c:4870 +msgid "Set _Highlight Color..." +msgstr "" + +#: ../src/vikwindow.c:4870 +msgid "Set Highlight Color" +msgstr "" + +#: ../src/vikwindow.c:4871 +msgid "Set Bac_kground Color..." +msgstr "" + +#: ../src/vikwindow.c:4871 +msgid "Set Background Color" +msgstr "" + +#: ../src/vikwindow.c:4872 +msgid "Zoom _In" +msgstr "" + +#: ../src/vikwindow.c:4872 +msgid "Zoom In" +msgstr "" + +#: ../src/vikwindow.c:4873 +msgid "Zoom _Out" +msgstr "" + +#: ../src/vikwindow.c:4873 +msgid "Zoom Out" +msgstr "" + +#: ../src/vikwindow.c:4874 +msgid "Zoom _To..." +msgstr "" + +#: ../src/vikwindow.c:4874 +msgid "Zoom To" +msgstr "" + +#: ../src/vikwindow.c:4875 +msgid "Pan _North" +msgstr "" + +#: ../src/vikwindow.c:4876 +msgid "Pan _East" +msgstr "" + +#: ../src/vikwindow.c:4877 +msgid "Pan _South" +msgstr "" + +#: ../src/vikwindow.c:4878 +msgid "Pan _West" +msgstr "" + +#: ../src/vikwindow.c:4879 +msgid "Background _Jobs" +msgstr "" + +#: ../src/vikwindow.c:4879 +msgid "Background Jobs" +msgstr "" + +#: ../src/vikwindow.c:4881 +msgid "Cu_t" +msgstr "" + +#: ../src/vikwindow.c:4885 +msgid "Delete All" +msgstr "" + +#: ../src/vikwindow.c:4886 +msgid "Copy Centre _Location" +msgstr "" + +#: ../src/vikwindow.c:4887 +msgid "_Flush Map Cache" +msgstr "" + +#: ../src/vikwindow.c:4888 +msgid "_Set the Default Location" +msgstr "" + +#: ../src/vikwindow.c:4888 +msgid "Set the Default Location to the current position" +msgstr "" + +#: ../src/vikwindow.c:4889 +msgid "_Preferences" +msgstr "" + +#: ../src/vikwindow.c:4889 +msgid "Program Preferences" +msgstr "" + +#: ../src/vikwindow.c:4890 +msgid "_Layer Defaults" +msgstr "" + +#: ../src/vikwindow.c:4891 +msgid "_Properties" +msgstr "" + +#: ../src/vikwindow.c:4893 +msgid "Help" +msgstr "" + +#: ../src/vikwindow.c:4894 +msgid "_About" +msgstr "" + +#: ../src/vikwindow.c:4894 +msgid "About" +msgstr "" + +#: ../src/vikwindow.c:4903 +msgid "_KML..." +msgstr "" + +#: ../src/vikwindow.c:4903 +msgid "Export as KML" +msgstr "" + +#: ../src/vikwindow.c:4904 +msgid "Transfer data from a GPS device" +msgstr "" + +#: ../src/vikwindow.c:4905 +msgid "Import file via GPSBabel converter" +msgstr "" + +#: ../src/vikwindow.c:4909 +msgid "Import Geo_JSON File..." +msgstr "" + +#: ../src/vikwindow.c:4909 +msgid "Import GeoJSON file" +msgstr "" + +#: ../src/vikwindow.c:4914 +msgid "_UTM Mode" +msgstr "" + +#: ../src/vikwindow.c:4915 +msgid "_Expedia Mode" +msgstr "" + +#: ../src/vikwindow.c:4916 +msgid "_Mercator Mode" +msgstr "" + +#: ../src/vikwindow.c:4917 +msgid "Lat_/Lon Mode" +msgstr "" + +#: ../src/vikwindow.c:4921 +msgid "Show _Scale" +msgstr "" + +#: ../src/vikwindow.c:4921 +msgid "Show Scale" +msgstr "" + +#: ../src/vikwindow.c:4922 +msgid "Show _Center Mark" +msgstr "" + +#: ../src/vikwindow.c:4922 +msgid "Show Center Mark" +msgstr "" + +#: ../src/vikwindow.c:4923 +msgid "Show _Highlight" +msgstr "" + +#: ../src/vikwindow.c:4923 +msgid "Show Highlight" +msgstr "" + +#: ../src/vikwindow.c:4924 +msgid "_Full Screen" +msgstr "" + +#: ../src/vikwindow.c:4924 +msgid "Activate full screen mode" +msgstr "" + +#: ../src/vikwindow.c:4925 +msgid "Show Side _Panel" +msgstr "" + +#: ../src/vikwindow.c:4925 +msgid "Show Side Panel" +msgstr "" + +#: ../src/vikwindow.c:4926 +msgid "Show Status_bar" +msgstr "" + +#: ../src/vikwindow.c:4926 +msgid "Show Statusbar" +msgstr "" + +#: ../src/vikwindow.c:4927 +msgid "Show _Toolbar" +msgstr "" + +#: ../src/vikwindow.c:4927 +msgid "Show Toolbar" +msgstr "" + +#: ../src/vikwindow.c:4928 +msgid "Show _Menu" +msgstr "" + +#: ../src/vikwindow.c:4928 +msgid "Show Menu" +msgstr "" + +#: ../src/vikwindow.c:4929 +msgid "Show Side Panel B_uttons" +msgstr "" + +#: ../src/vikwindow.c:4929 +msgid "Show Side Panel Buttons" +msgstr "" + +#: ../src/vikwindow.c:4930 +msgid "Show Side Panel Ca_lendar" +msgstr "" + +#: ../src/vikwindow.c:4930 +msgid "Show Side Panel Calendar" +msgstr "" + +#: ../src/vikwindow.c:5064 +#, c-format +msgid "New _%s Layer" +msgstr "" + +#: ../src/vikwindow.c:5114 +msgid "..." +msgstr "" + +#: ../src/viking.desktop.in.h:2 +msgid "GPS Data Manager" +msgstr "" + +#: ../src/viking.desktop.in.h:3 +msgid "Map Based GPS Data Manager (live data capable)." +msgstr "" + +#: ../src/libjpeg/jpeg-data.c:205 +msgid "Data does not follow JPEG specification." +msgstr "" + +#: ../src/libjpeg/jpeg-data.c:302 +#, c-format +msgid "Path '%s' invalid." +msgstr "" + +#: ../src/libjpeg/jpeg-data.c:320 +#, c-format +msgid "Could not read '%s'." +msgstr "" diff --git a/po/ko.po b/po/ko.po new file mode 100644 index 0000000..be58c67 --- /dev/null +++ b/po/ko.po @@ -0,0 +1,6070 @@ +# Korean translation for viking +# Copyright (c) 2014 Rosetta Contributors and Canonical Ltd 2014 +# This file is distributed under the same license as the viking package. +# FIRST AUTHOR , 2014. +# +msgid "" +msgstr "" +"Project-Id-Version: viking\n" +"Report-Msgid-Bugs-To: \n" +"POT-Creation-Date: 2019-01-19 12:53+0000\n" +"PO-Revision-Date: 2014-07-09 02:55+0000\n" +"Last-Translator: myziny \n" +"Language-Team: Korean \n" +"Language: ko\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" +"X-Launchpad-Export-Date: 2018-12-21 17:32+0000\n" +"X-Generator: Launchpad (build 18847)\n" + +#: ../src/acquire.c:106 ../src/vikgpslayer.c:1367 +msgid "Done." +msgstr "" + +#: ../src/acquire.c:115 +msgid "No data." +msgstr "" + +#: ../src/acquire.c:167 ../src/acquire.c:415 +msgid "Error: acquisition failed." +msgstr "" + +#: ../src/acquire.c:339 +msgid "Working..." +msgstr "" + +#. This shouldn't happen... +#: ../src/acquire.c:406 +msgid "" +"Unable to create command\n" +"Acquire method failed." +msgstr "" + +#: ../src/acquire.c:513 +msgid "_Filter" +msgstr "필터(_F)" + +#: ../src/acquire.c:528 +#, c-format +msgid "Filter with %s" +msgstr "" + +#: ../src/acquire.c:545 +msgid "Filter" +msgstr "" + +#: ../src/babel.c:640 +msgid "GPSBabel:" +msgstr "" + +#: ../src/babel.c:641 +msgid "" +"Allow setting the specific instance of GPSBabel. You must restart Viking for " +"this value to take effect." +msgstr "" + +#: ../src/babel_ui.c:79 +msgid "Select a file format" +msgstr "" + +#: ../src/babel_ui.c:144 ../src/viktrwlayer.c:531 ../src/viktrwlayer.c:2882 +msgid "Tracks" +msgstr "" + +#: ../src/babel_ui.c:149 ../src/viktrwlayer.c:2892 +msgid "Routes" +msgstr "" + +#. ***** PARAMETERS ***** +#: ../src/babel_ui.c:154 ../src/viktrwlayer.c:531 ../src/viktrwlayer.c:2887 +msgid "Waypoints" +msgstr "" + +#: ../src/background.c:64 +#, c-format +msgid "%d items" +msgstr "" + +#: ../src/background.c:287 +msgid "Threads:" +msgstr "" + +#: ../src/background.c:288 +msgid "" +"Number of threads to use for Mapnik tasks. You need to restart Viking for a " +"change to this value to be used" +msgstr "" + +#: ../src/background.c:361 +msgid "Job" +msgstr "작업" + +#: ../src/background.c:365 +msgid "Progress" +msgstr "진행중" + +#: ../src/background.c:373 +msgid "Viking Background Jobs" +msgstr "" + +#: ../src/bing.c:42 +msgid "Bing Aerial" +msgstr "" + +#: ../src/bing.c:48 +msgid "Bing" +msgstr "" + +#. VIK_GTK_WINDOW_FROM_WIDGET(vp) +#: ../src/bingmapsource.c:514 +msgid "Bing attribution Loading" +msgstr "" + +#: ../src/clipboard.c:95 +msgid "paste failed" +msgstr "" + +#: ../src/clipboard.c:105 +msgid "wrong clipboard data size" +msgstr "" + +#: ../src/clipboard.c:124 +#, c-format +msgid "" +"The clipboard contains sublayer data for %s layers. You must select a layer " +"of this type to paste the clipboard data." +msgstr "" + +#: ../src/clipboard.c:264 +msgid "" +"In order to paste a waypoint, please select an appropriate layer to paste " +"into." +msgstr "" + +#: ../src/dialog.c:60 +msgid "Go to Lat/Lon" +msgstr "" + +#: ../src/dialog.c:69 ../src/viktrwlayer_wpwin.c:173 +msgid "Latitude:" +msgstr "위도:" + +#: ../src/dialog.c:72 ../src/viktrwlayer_wpwin.c:177 +msgid "Longitude:" +msgstr "" + +#: ../src/dialog.c:102 +msgid "Go to UTM" +msgstr "" + +#: ../src/dialog.c:114 +msgid "Northing:" +msgstr "" + +#: ../src/dialog.c:117 +msgid "Easting:" +msgstr "" + +#: ../src/dialog.c:121 ../src/vikgeoreflayer.c:902 +msgid "Zone:" +msgstr "" + +#: ../src/dialog.c:124 ../src/vikgeoreflayer.c:904 +msgid "Letter:" +msgstr "" + +#: ../src/dialog.c:246 ../src/geonamessearch.c:238 +#: ../src/datasource_osm_my_traces.c:505 +msgid "Nothing was selected" +msgstr "" + +#: ../src/dialog.c:254 +msgid "Add Route" +msgstr "" + +#: ../src/dialog.c:254 +msgid "Add Track" +msgstr "" + +#: ../src/dialog.c:262 +msgid "Route Name:" +msgstr "" + +#: ../src/dialog.c:262 +msgid "Track Name:" +msgstr "" + +#: ../src/dialog.c:282 +msgid "Please enter a name for the track." +msgstr "" + +#: ../src/dialog.c:311 +msgid "Today" +msgstr "" + +#: ../src/dialog.c:393 +msgid "Zoom Factors..." +msgstr "" + +#: ../src/dialog.c:407 +msgid "Zoom factor (in meters per pixel):" +msgstr "" + +#: ../src/dialog.c:408 +msgid "X (easting): " +msgstr "" + +#: ../src/dialog.c:409 +msgid "Y (northing): " +msgstr "" + +#: ../src/dialog.c:414 +msgid "X and Y zoom factors must be equal" +msgstr "" + +#: ../src/dialog.c:469 +msgid "1 min" +msgstr "" + +#: ../src/dialog.c:470 +msgid "1 hour" +msgstr "" + +#: ../src/dialog.c:471 +msgid "1 day" +msgstr "" + +#: ../src/dialog.c:472 +msgid "Custom (in minutes):" +msgstr "" + +#: ../src/dialog.c:608 +#, c-format +msgid "" +"2003-2008, Evan Battaglia\n" +"2008-%s, Viking's contributors" +msgstr "" + +#: ../src/dialog.c:609 +msgid "GPS Data and Topo Analyzer, Explorer, and Manager." +msgstr "" + +#: ../src/dialog.c:610 +msgid "" +"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.\n" +"\n" +"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.\n" +"\n" +"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., 59 Temple " +"Place, Suite 330, Boston, MA 02111-1307, USA" +msgstr "" + +#: ../src/dialog.c:703 +msgid "Translation is coordinated on http://launchpad.net/viking" +msgstr "" + +#: ../src/dialog.c:713 +msgid "Download along track" +msgstr "" + +#: ../src/dialog.c:720 +msgid "Map type:" +msgstr "" + +#: ../src/dialog.c:726 +msgid "Zoom level:" +msgstr "" + +#: ../src/dialog.c:766 +#, c-format +msgid "The map data is licensed: %s." +msgstr "" + +#: ../src/dialog.c:769 +#, c-format +msgid "" +"The data provided by '%s' are licensed under the following license: " +"%s." +msgstr "" + +#: ../src/dialog.c:773 +msgid "Open license" +msgstr "" + +#: ../src/expedia.c:54 +msgid "Expedia Street Maps" +msgstr "" + +#: ../src/expedia.c:82 +msgid "Invalid expedia altitude" +msgstr "" + +#: ../src/expedia.c:113 +#, c-format +msgid "" +"Couldn't open EXPEDIA image file (right after successful download! Please " +"report and delete image file!): %s" +msgstr "" + +#: ../src/expedia.c:126 +#, c-format +msgid "" +"Couldn't save EXPEDIA image file (right after successful download! Please " +"report and delete image file!): %s" +msgstr "" + +#: ../src/geonamessearch.c:115 +msgid "Search" +msgstr "" + +#: ../src/geonamessearch.c:117 +msgid "No entries found!" +msgstr "" + +#. NB could allow columns to be shifted around by doing this after each new +#. gtk_tree_view_column_set_reorderable ( column, TRUE ); +#. However I don't think is that useful, so I haven't put it in +#: ../src/geonamessearch.c:171 ../src/datasource_osm_my_traces.c:422 +#: ../src/viktrwlayer_tracklist.c:621 ../src/viktrwlayer_waypointlist.c:618 +msgid "Name" +msgstr "" + +#: ../src/geonamessearch.c:176 +msgid "Feature" +msgstr "" + +#: ../src/geonamessearch.c:181 ../src/datasource_osm_my_traces.c:437 +msgid "Lat/Lon" +msgstr "" + +#: ../src/geonamessearch.c:264 ../src/googlesearch.c:101 ../src/vikgoto.c:430 +msgid "couldn't map temp file" +msgstr "" + +#: ../src/geonamessearch.c:459 +msgid "Select articles" +msgstr "" + +#: ../src/geonamessearch.c:459 +msgid "Select the articles you want to add." +msgstr "" + +#: ../src/geonamessearch.c:475 +msgid "city" +msgstr "" + +#: ../src/geonamessearch.c:477 +msgid "edu" +msgstr "" + +#: ../src/geonamessearch.c:479 +msgid "airport" +msgstr "" + +#: ../src/geonamessearch.c:481 +msgid "mountain" +msgstr "" + +#: ../src/geonamessearch.c:483 +msgid "forest" +msgstr "" + +#: ../src/geonamessearch.c:485 +msgid "church" +msgstr "" + +#: ../src/geojson.c:74 +#, c-format +msgid "%s command failed: %s" +msgstr "" + +#: ../src/geojson.c:146 ../src/gpx.c:1317 +#, c-format +msgid "failed to open temporary file: %s" +msgstr "" + +#: ../src/globals.c:67 +msgid "DDD" +msgstr "" + +#: ../src/globals.c:67 +msgid "DMM" +msgstr "" + +#: ../src/globals.c:67 +msgid "DMS" +msgstr "" + +#: ../src/globals.c:67 +msgid "Raw" +msgstr "" + +#: ../src/globals.c:68 +msgid "Kilometres" +msgstr "" + +#: ../src/globals.c:68 +msgid "Miles" +msgstr "" + +#: ../src/globals.c:68 +msgid "Nautical Miles" +msgstr "" + +#. VIK_UNITS_SPEED_KILOMETRES_PER_HOUR: +#: ../src/globals.c:69 ../src/viktrwlayer_tracklist.c:655 ../src/vikutils.c:100 +msgid "km/h" +msgstr "" + +#: ../src/globals.c:69 ../src/viktrwlayer_tracklist.c:656 ../src/vikutils.c:78 +msgid "mph" +msgstr "" + +#. VIK_UNITS_SPEED_METRES_PER_SECOND: +#: ../src/globals.c:69 ../src/viktrwlayer_tracklist.c:663 ../src/vikutils.c:81 +msgid "m/s" +msgstr "" + +#: ../src/globals.c:69 ../src/viktrwlayer_tracklist.c:657 ../src/vikutils.c:84 +msgid "knots" +msgstr "" + +#: ../src/globals.c:69 ../src/viktrwlayer_tracklist.c:658 ../src/vikutils.c:87 +msgid "s/km" +msgstr "" + +#: ../src/globals.c:69 ../src/viktrwlayer_tracklist.c:659 ../src/vikutils.c:90 +msgid "min/km" +msgstr "" + +#: ../src/globals.c:69 +msgid "s/mi" +msgstr "" + +#: ../src/globals.c:69 ../src/viktrwlayer_tracklist.c:661 ../src/vikutils.c:96 +msgid "min/mi" +msgstr "" + +#: ../src/globals.c:70 +msgid "Metres" +msgstr "" + +#: ../src/globals.c:70 +msgid "Feet" +msgstr "" + +#: ../src/globals.c:73 +msgid "Locale" +msgstr "" + +#: ../src/globals.c:73 +msgid "World" +msgstr "" + +#: ../src/globals.c:73 +msgid "UTC" +msgstr "" + +#: ../src/globals.c:76 +msgid "Degree format:" +msgstr "" + +#: ../src/globals.c:77 +msgid "Distance units:" +msgstr "" + +#: ../src/globals.c:78 +msgid "Speed units:" +msgstr "" + +#: ../src/globals.c:79 +msgid "Height units:" +msgstr "" + +#: ../src/globals.c:80 +msgid "Use large waypoint icons:" +msgstr "" + +#: ../src/globals.c:81 +msgid "Default latitude:" +msgstr "" + +#: ../src/globals.c:82 +msgid "Default longitude:" +msgstr "" + +#: ../src/globals.c:83 +msgid "Time Display:" +msgstr "" + +#: ../src/globals.c:84 +msgid "" +"Display times according to the reference frame. Locale is the user's system " +"setting. World is relative to the location of the object." +msgstr "" + +#: ../src/globals.c:90 +msgid "Alphabetical" +msgstr "" + +#: ../src/globals.c:90 ../src/datasource_osm_my_traces.c:432 +msgid "Time" +msgstr "" + +#: ../src/globals.c:90 +msgid "Creation" +msgstr "" + +#: ../src/globals.c:91 +msgid "Title Case" +msgstr "" + +#: ../src/globals.c:91 +msgid "Lowercase" +msgstr "" + +#: ../src/globals.c:94 +msgid "KML File Export Units:" +msgstr "" + +#: ../src/globals.c:95 +msgid "GPX Track Order:" +msgstr "" + +#: ../src/globals.c:96 +msgid "GPX Waypoint Symbols:" +msgstr "" + +#: ../src/globals.c:97 +msgid "" +"Save GPX Waypoint Symbol names in the specified case. May be useful for " +"compatibility with various devices" +msgstr "" + +#: ../src/globals.c:98 +msgid "GPX Creator:" +msgstr "" + +#: ../src/globals.c:99 +msgid "" +"The creator value when writing a GPX file. Otherwise when blank a default is " +"used." +msgstr "" + +#: ../src/globals.c:104 +msgid "Image Viewer:" +msgstr "" + +#: ../src/globals.c:109 +msgid "External GPX Program 1:" +msgstr "" + +#: ../src/globals.c:110 +msgid "External GPX Program 2:" +msgstr "" + +#: ../src/globals.c:113 +msgid "Absolute" +msgstr "" + +#: ../src/globals.c:113 +msgid "Relative" +msgstr "" + +#: ../src/globals.c:117 +msgid "Save File Reference Mode:" +msgstr "" + +#: ../src/globals.c:118 +msgid "" +"When saving a Viking .vik file, this determines how the directory paths of " +"filenames are written." +msgstr "" + +#: ../src/globals.c:119 +msgid "Ask for Name before Track Creation:" +msgstr "" + +#: ../src/globals.c:120 +msgid "Show Tooltip during Track Creation:" +msgstr "" + +#: ../src/globals.c:121 +msgid "The number of recent files:" +msgstr "" + +#: ../src/globals.c:122 +msgid "" +"Only applies to new windows or on application restart. -1 means all " +"available files." +msgstr "" + +#: ../src/globals.c:123 +msgid "Open files in selected layer:" +msgstr "" + +#: ../src/globals.c:124 +msgid "Open files (but not .vik ones) into the selected TrackWaypoint layer." +msgstr "" + +#: ../src/globals.c:125 +msgid "Show calendar day names:" +msgstr "" + +#: ../src/globals.c:128 +msgid "Home Location" +msgstr "" + +#: ../src/globals.c:128 +msgid "Last Location" +msgstr "" + +#: ../src/globals.c:128 +msgid "Specified File" +msgstr "" + +#: ../src/globals.c:128 +msgid "Auto Location" +msgstr "" + +#: ../src/globals.c:131 +msgid "Restore Window Setup:" +msgstr "" + +#: ../src/globals.c:132 +msgid "Restore window size and layout" +msgstr "" + +#: ../src/globals.c:133 +msgid "Add a Default Map Layer:" +msgstr "" + +#: ../src/globals.c:134 +msgid "" +"The default map layer added is defined by the Layer Defaults. Use the menu " +"Edit->Layer Defaults->Map... to change the map type and other values." +msgstr "" + +#: ../src/globals.c:135 +msgid "Startup Method:" +msgstr "" + +#: ../src/globals.c:136 +msgid "Startup File:" +msgstr "" + +#: ../src/globals.c:137 +msgid "" +"The default file to load on startup. Only applies when the startup method is " +"set to 'Specified File'" +msgstr "" + +#: ../src/globals.c:138 +msgid "Check For New Version:" +msgstr "" + +#: ../src/globals.c:139 +msgid "Periodically check to see if a new version of Viking is available" +msgstr "" + +#. Defaults for the options are setup here +#: ../src/globals.c:176 +msgid "General" +msgstr "" + +#. New Tab +#: ../src/globals.c:204 +msgid "Startup" +msgstr "" + +#. New Tab +#: ../src/globals.c:222 +msgid "Export/External" +msgstr "" + +#. 'Advanced' Properties +#: ../src/globals.c:249 +msgid "Advanced" +msgstr "" + +#. Webtools +#: ../src/google.c:39 +msgid "Google" +msgstr "" + +#. If there is an actual description field it will overwrite this value +#: ../src/gpx.c:264 +#, c-format +msgid "Created by: %s" +msgstr "" + +#: ../src/datasource_bfilter.c:43 +msgid "Max number of points:" +msgstr "" + +#: ../src/datasource_bfilter.c:84 +msgid "Simplify All Tracks..." +msgstr "" + +#: ../src/datasource_bfilter.c:85 +msgid "Simplified Tracks" +msgstr "" + +#. { VIK_LAYER_NUM_TYPES, "compressmethod", VIK_LAYER_PARAM_UINT, VIK_LAYER_GROUP_NONE, N_("Simplify Method:"), VIK_LAYER_WIDGET_COMBOBOX, compress_method, NULL, NULL, NULL, NULL, NULL }, +#: ../src/datasource_bfilter.c:111 +msgid "Error Factor:" +msgstr "" + +#: ../src/datasource_bfilter.c:112 +msgid "" +"Specifies the maximum allowable error that may be introduced by removing a " +"single point by the crosstrack method. See the manual or GPSBabel Simplify " +"Filter documentation for more detail." +msgstr "" + +#: ../src/datasource_bfilter.c:166 +msgid "Compress Tracks..." +msgstr "" + +#: ../src/datasource_bfilter.c:167 +msgid "Compressed Tracks" +msgstr "" + +#: ../src/datasource_bfilter.c:197 ../src/datasource_bfilter.c:198 +msgid "Remove Duplicate Waypoints" +msgstr "" + +#: ../src/datasource_bfilter.c:221 +msgid "Manual filter:" +msgstr "" + +#: ../src/datasource_bfilter.c:222 +msgid "Manual filter command: e.g. 'swap'." +msgstr "" + +#: ../src/datasource_bfilter.c:233 ../src/datasource_bfilter.c:234 +msgid "Manual filter" +msgstr "" + +#: ../src/datasource_bfilter.c:262 +msgid "Waypoints Inside This" +msgstr "" + +#: ../src/datasource_bfilter.c:263 ../src/datasource_bfilter.c:292 +msgid "Polygonized Layer" +msgstr "" + +#: ../src/datasource_bfilter.c:291 +msgid "Waypoints Outside This" +msgstr "" + +#: ../src/datasource_file.c:61 +msgid "Import file with GPSBabel" +msgstr "" + +#: ../src/datasource_file.c:62 +msgid "Imported file" +msgstr "" + +#. The file selector +#: ../src/datasource_file.c:129 +msgid "File:" +msgstr "" + +#: ../src/datasource_file.c:130 +msgid "File to import" +msgstr "" + +#: ../src/datasource_file.c:137 +msgid "All files" +msgstr "" + +#. The file format selector +#: ../src/datasource_file.c:144 ../src/datasource_url.c:106 +msgid "File type:" +msgstr "" + +#: ../src/datasource_file.c:189 +#, c-format +msgid "using babel args '%s' and file '%s'" +msgstr "" + +#: ../src/datasource_gc.c:67 +msgid "Download Geocaches" +msgstr "" + +#: ../src/datasource_gc.c:68 +msgid "Geocaching.com Caches" +msgstr "" + +#: ../src/datasource_gc.c:86 +msgid "geocaching.com username:" +msgstr "" + +#: ../src/datasource_gc.c:87 +msgid "geocaching.com password:" +msgstr "" + +#: ../src/datasource_gc.c:92 ../src/vikwindow.c:3502 +msgid "Geocaching" +msgstr "" + +#: ../src/datasource_gc.c:128 +#, c-format +msgid "" +"Can't find %s or %s in path! Check that you have installed it correctly." +msgstr "" + +#: ../src/datasource_gc.c:190 +msgid "Number geocaches:" +msgstr "" + +#: ../src/datasource_gc.c:192 +msgid "Centered around:" +msgstr "" + +#: ../src/datasource_gc.c:231 +msgid "Broken input - using some defaults" +msgstr "" + +#: ../src/datasource_geotag.c:51 +msgid "Create Waypoints from Geotagged Images" +msgstr "" + +#: ../src/datasource_geotag.c:52 +msgid "Geotagged Images" +msgstr "" + +#: ../src/datasource_geotag.c:102 ../src/datasource_geojson.c:93 +#: ../src/vikfileentry.c:171 ../src/vikwindow.c:3533 ../src/vikwindow.c:3610 +#: ../src/vikwindow.c:3641 ../src/vikwindow.c:4356 ../src/vikwindow.c:4649 +msgid "All" +msgstr "" + +#: ../src/datasource_geotag.c:107 ../src/vikfileentry.c:115 +#: ../src/viktrwlayer_geotag.c:637 ../src/vikwindow.c:3518 +#: ../src/vikwindow.c:4377 +msgid "JPG" +msgstr "" + +#: ../src/datasource_geotag.c:168 +#, c-format +msgid "Unable to create waypoint from %s" +msgstr "" + +#: ../src/datasource_geojson.c:46 +msgid "Acquire from GeoJSON" +msgstr "" + +#: ../src/datasource_geojson.c:47 ../src/datasource_geojson.c:98 +msgid "GeoJSON" +msgstr "" + +#: ../src/datasource_geojson.c:152 +#, c-format +msgid "Unable to import from: %s" +msgstr "" + +#: ../src/datasource_gps.c:54 +msgid "Acquire from GPS" +msgstr "" + +#: ../src/datasource_gps.c:55 +msgid "Acquired from GPS" +msgstr "" + +#: ../src/datasource_gps.c:258 +#, c-format +msgid "using cmd '%s' and file '%s'\n" +msgstr "" + +#: ../src/datasource_gps.c:353 ../src/vikgpslayer.c:966 +#, c-format +msgid "Downloading %d waypoint..." +msgid_plural "Downloading %d waypoints..." +msgstr[0] "" +msgstr[1] "" + +#: ../src/datasource_gps.c:358 ../src/vikgpslayer.c:971 +#, c-format +msgid "Downloading %d trackpoint..." +msgid_plural "Downloading %d trackpoints..." +msgstr[0] "" +msgstr[1] "" + +#: ../src/datasource_gps.c:363 ../src/vikgpslayer.c:976 +#, c-format +msgid "Downloading %d routepoint..." +msgid_plural "Downloading %d routepoints..." +msgstr[0] "" +msgstr[1] "" + +#: ../src/datasource_gps.c:386 ../src/datasource_gps.c:393 +#: ../src/datasource_gps.c:400 +#, c-format +msgid "Downloaded %d out of %d %s..." +msgstr "" + +#: ../src/datasource_gps.c:388 ../src/datasource_gps.c:395 +#: ../src/datasource_gps.c:402 +#, c-format +msgid "Downloaded %d %s." +msgstr "" + +#: ../src/datasource_gps.c:416 ../src/vikgpslayer.c:1134 +#, c-format +msgid "GPS Device: %s" +msgstr "" + +#: ../src/datasource_gps.c:428 ../src/vikgpslayer.c:1214 +msgid "Status: Working..." +msgstr "" + +#. NB gps_layer_inst_init() is performed after parameter registeration +#. thus to give the protocols some potential values use the old static list +#. TODO: find another way to use gps_layer_inst_init()? +#: ../src/datasource_gps.c:584 ../src/vikgpslayer.c:216 +msgid "GPS Protocol:" +msgstr "" + +#. List reassigned at runtime +#: ../src/datasource_gps.c:609 ../src/vikgpslayer.c:217 +msgid "Serial Port:" +msgstr "" + +#: ../src/datasource_gps.c:659 +msgid "" +"Turn Off After Transfer\n" +"(Garmin/NAViLink Only)" +msgstr "" + +#: ../src/datasource_gps.c:666 +msgid "Tracks:" +msgstr "" + +#: ../src/datasource_gps.c:673 +msgid "Routes:" +msgstr "" + +#: ../src/datasource_gps.c:680 +msgid "Waypoints:" +msgstr "" + +#: ../src/datasource_gps.c:756 ../src/vikgpslayer.c:1509 +msgid "GPS device: N/A" +msgstr "" + +#: ../src/datasource_osm.c:53 ../src/datasource_osm.c:54 +msgid "OSM traces" +msgstr "" + +#: ../src/datasource_osm.c:89 +msgid "Page number:" +msgstr "" + +#: ../src/datasource_osm_my_traces.c:59 ../src/datasource_osm_my_traces.c:60 +msgid "OSM My Traces" +msgstr "" + +#: ../src/datasource_osm_my_traces.c:106 ../src/osm-traces.c:684 +msgid "Email/username:" +msgstr "" + +#: ../src/datasource_osm_my_traces.c:111 +msgid "The email or username used to login to OSM" +msgstr "" + +#: ../src/datasource_osm_my_traces.c:113 ../src/osm-traces.c:692 +msgid "Password:" +msgstr "" + +#: ../src/datasource_osm_my_traces.c:116 +msgid "The password used to login to OSM" +msgstr "" + +#: ../src/datasource_osm_my_traces.c:427 ../src/viktrwlayer.c:689 +msgid "Description" +msgstr "" + +#: ../src/datasource_osm_my_traces.c:442 +msgid "Privacy" +msgstr "" + +#: ../src/datasource_osm_my_traces.c:449 +msgid "Within Current View" +msgstr "" + +#: ../src/datasource_osm_my_traces.c:516 +msgid "GPS Traces" +msgstr "" + +#: ../src/datasource_osm_my_traces.c:518 +msgid "None found!" +msgstr "" + +#: ../src/datasource_osm_my_traces.c:569 +msgid "Ensure the OSM access token preferences are setup." +msgstr "" + +#: ../src/datasource_osm_my_traces.c:645 +msgid "My OSM Traces" +msgstr "" + +#. Report errors to the status bar +#: ../src/datasource_osm_my_traces.c:667 +#, c-format +msgid "Unable to get trace: %s" +msgstr "" + +#: ../src/datasource_routing.c:56 ../src/datasource_routing.c:57 +msgid "Directions" +msgstr "" + +#: ../src/datasource_routing.c:90 +msgid "No routing engines with directions available" +msgstr "" + +#. Engine selector +#: ../src/datasource_routing.c:99 +msgid "Engine:" +msgstr "" + +#. From and To entries +#: ../src/datasource_routing.c:104 +msgid "From:" +msgstr "" + +#: ../src/datasource_routing.c:105 +msgid "To:" +msgstr "" + +#: ../src/datasource_url.c:48 +msgid "Acquire from URL" +msgstr "" + +#: ../src/datasource_url.c:49 +msgid "URL" +msgstr "" + +#: ../src/datasource_url.c:101 +msgid "URL:" +msgstr "" + +#. Only GPX (not using GPSbabel) +#: ../src/datasource_url.c:133 ../src/vikfileentry.c:161 +#: ../src/vikwindow.c:3513 ../src/vikwindow.c:3603 +msgid "GPX" +msgstr "" + +#: ../src/datasource_wikipedia.c:32 +msgid "Create Waypoints from Wikipedia Articles" +msgstr "" + +#: ../src/datasource_wikipedia.c:33 +msgid "Wikipedia Waypoints" +msgstr "" + +#: ../src/dem.c:66 ../src/dem.c:80 +msgid "Invalid DEM" +msgstr "" + +#: ../src/dem.c:122 +msgid "Invalid DEM header" +msgstr "" + +#: ../src/dem.c:191 ../src/dem.c:204 +msgid "Incorrect DEM Class B record: expected 1" +msgstr "" + +#: ../src/dem.c:289 ../src/download.c:176 +#, c-format +msgid "Couldn't map file %s: %s" +msgstr "" + +#: ../src/download.c:130 +msgid "Tile age (days):" +msgstr "" + +#: ../src/download.c:406 +#, c-format +msgid "Download error: %s" +msgstr "" + +#: ../src/download.c:490 +msgid "couldn't open temp file" +msgstr "" + +#: ../src/file.c:458 ../src/file.c:463 +#, c-format +msgid "Draw mode '%s' no more supported" +msgstr "" + +#: ../src/geotag_exif.c:621 +msgid "Not enough memory." +msgstr "" + +#: ../src/geotag_exif.c:639 +msgid "Setting a value for this tag is unsupported!" +msgstr "" + +#: ../src/geotag_exif.c:658 +#, c-format +msgid "Too few components specified (need %d, found %d)\n" +msgstr "" + +#: ../src/geotag_exif.c:662 +msgid "Numeric value expected\n" +msgstr "" + +#: ../src/geotag_exif.c:670 +msgid "This shouldn't happen!" +msgstr "" + +#: ../src/geotag_exif.c:740 +msgid "Not yet implemented!" +msgstr "" + +#: ../src/geotag_exif.c:753 +msgid "Warning; Too many components specified!" +msgstr "" + +#: ../src/osm-traces.c:87 +msgid "Identifiable (public w/ timestamps)" +msgstr "" + +#: ../src/osm-traces.c:88 +msgid "Trackable (private w/ timestamps)" +msgstr "" + +#: ../src/osm-traces.c:89 +msgid "Public" +msgstr "" + +#: ../src/osm-traces.c:90 +msgid "Private" +msgstr "" + +#: ../src/osm-traces.c:108 +msgid "Access Token:" +msgstr "" + +#: ../src/osm-traces.c:108 +msgid "Get New OSM Access Tokens" +msgstr "" + +#: ../src/osm-traces.c:109 +msgid "Access Token Key:" +msgstr "" + +#: ../src/osm-traces.c:110 +msgid "Access Token Secret:" +msgstr "" + +#: ../src/osm-traces.c:111 +msgid "OSM username:" +msgstr "" + +#: ../src/osm-traces.c:112 +msgid "OSM password:" +msgstr "" + +#. Check to really override existing values... +#: ../src/osm-traces.c:263 +msgid "Do you want to overwrite existing values?" +msgstr "" + +#: ../src/osm-traces.c:275 +msgid "Not able to generate OSM request tokens." +msgstr "" + +#: ../src/osm-traces.c:299 +msgid "" +"Waiting for authorization approval.\n" +"Ensure you have granted access at the website before continuing here." +msgstr "" + +#: ../src/osm-traces.c:315 +msgid "No Authorization." +msgstr "" + +#: ../src/osm-traces.c:354 +msgid "" +"OSM Username and Password preferences are not required anymore. You can now " +"remove them." +msgstr "" + +#. Preferences +#: ../src/osm-traces.c:379 +msgid "OpenStreetMap Traces" +msgstr "" + +#: ../src/osm-traces.c:504 +#, c-format +msgid "failed to upload data: HTTP response is %ld" +msgstr "" + +#: ../src/osm-traces.c:509 +#, c-format +msgid "curl_easy_getinfo failed: %d" +msgstr "" + +#: ../src/osm-traces.c:514 +#, c-format +msgid "curl request failed: %s" +msgstr "" + +#. Success +#: ../src/osm-traces.c:592 +msgid "Uploaded to OSM" +msgstr "" + +#: ../src/osm-traces.c:596 +msgid "" +"FAILED TO UPLOAD DATA TO OSM - Ensure the OSM access token preferences are " +"setup." +msgstr "" + +#: ../src/osm-traces.c:599 +msgid "FAILED TO UPLOAD DATA TO OSM - CURL PROBLEM" +msgstr "" + +#: ../src/osm-traces.c:602 +msgid "FAILED TO UPLOAD DATA TO OSM" +msgstr "" + +#: ../src/osm-traces.c:602 +msgid "HTTP response code" +msgstr "" + +#: ../src/osm-traces.c:610 +#, c-format +msgid "failed to unlink temporary file: %s" +msgstr "" + +#: ../src/osm-traces.c:664 +msgid "OSM upload" +msgstr "" + +#: ../src/osm-traces.c:689 +msgid "" +"The email/username used as login\n" +"Enter the email/username you use to login into www.openstreetmap.org." +"" +msgstr "" + +#: ../src/osm-traces.c:697 +msgid "" +"The password used to login\n" +"Enter the password you use to login into www.openstreetmap.org." +msgstr "" + +#: ../src/osm-traces.c:703 +msgid "File's name:" +msgstr "" + +#: ../src/osm-traces.c:713 +msgid "" +"The name of the file on OSM\n" +"This is the name of the file created on the server.This is not the " +"name of the local file." +msgstr "" + +#: ../src/osm-traces.c:717 ../src/viktrwlayer_wpwin.c:197 +#: ../src/viktrwlayer_wpwin.c:199 +msgid "Description:" +msgstr "" + +#: ../src/osm-traces.c:731 +msgid "The description of the trace" +msgstr "" + +#: ../src/osm-traces.c:734 +msgid "Anonymize Times:" +msgstr "" + +#: ../src/osm-traces.c:739 +msgid "" +"Anonymize times of the trace.\n" +"You may choose to make the trace identifiable, yet mask the actual " +"real time values" +msgstr "" + +#: ../src/osm-traces.c:743 +msgid "Tags:" +msgstr "" + +#: ../src/osm-traces.c:751 +msgid "The tags associated to the trace" +msgstr "" + +#: ../src/osm-traces.c:816 +#, c-format +msgid "Uploading %s to OSM" +msgstr "" + +#: ../src/mapcache.c:67 +msgid "Map cache memory size (MB):" +msgstr "" + +#. NB Can have a couple hundred fonts loaded when using system directories +#. So ATM don't list them all - otherwise need better GUI feedback display. +#: ../src/mapnik_interface.cpp:324 +#, c-format +msgid "" +"%s %s\n" +"Plugins=%sFonts loaded=%d" +msgstr "" + +#: ../src/mapnik_interface.cpp:325 ../src/vikmapniklayer.c:278 +msgid "Mapnik" +msgstr "" + +#: ../src/print.c:51 ../src/viktrwlayer.c:572 +msgid "None" +msgstr "" + +#: ../src/print.c:52 +msgid "Horizontally" +msgstr "" + +#: ../src/print.c:53 +msgid "Vertically" +msgstr "" + +#: ../src/print.c:54 +msgid "Both" +msgstr "" + +#: ../src/print.c:118 +msgid "Image Settings" +msgstr "" + +#: ../src/print.c:551 +msgid "done" +msgstr "" + +#. Page Size +#: ../src/print.c:580 +msgid "_Adjust Page Size and Orientation" +msgstr "" + +#: ../src/print.c:596 +msgid "C_enter:" +msgstr "" + +#. ignore page margins +#: ../src/print.c:614 +msgid "Ignore Page _Margins" +msgstr "" + +#: ../src/print.c:633 +msgid "Image S_ize:" +msgstr "" + +#: ../src/ui_util.c:88 +#, c-format +msgid "Could not launch web browser. %s" +msgstr "" + +#: ../src/ui_util.c:101 +#, c-format +msgid "Could not create new email. %s" +msgstr "" + +#: ../src/vikcoordlayer.c:57 +msgid "Color:" +msgstr "" + +#: ../src/vikcoordlayer.c:58 +msgid "Minutes Width:" +msgstr "" + +#: ../src/vikcoordlayer.c:59 +msgid "Line Thickness:" +msgstr "" + +#: ../src/vikcoordlayer.c:66 +msgid "Coordinate" +msgstr "" + +#: ../src/main.c:92 +#, c-format +msgid "Ignoring Xlib error: error code %d request code %d\n" +msgstr "" + +#: ../src/main.c:111 +msgid "Enable debug output" +msgstr "" + +#: ../src/main.c:112 +msgid "Enable verbose output" +msgstr "" + +#: ../src/main.c:113 +msgid "Show version" +msgstr "" + +#: ../src/main.c:114 +msgid "Latitude in decimal degrees" +msgstr "" + +#: ../src/main.c:115 +msgid "Longitude in decimal degrees" +msgstr "" + +#: ../src/main.c:116 +msgid "Zoom Level (OSM). Value can be 0 - 22" +msgstr "" + +#: ../src/main.c:117 +msgid "Add a map layer by id value. Use 0 for the default map." +msgstr "" + +#: ../src/main.c:160 +#, c-format +msgid "" +"%s %s\n" +"Copyright (c) 2003-2008 Evan Battaglia\n" +"Copyright (c) 2008-%s Viking's contributors\n" +msgstr "" + +#: ../src/osm.c:50 +msgid "OpenStreetMap (Mapnik)" +msgstr "" + +#: ../src/osm.c:65 +msgid "OpenStreetMap (Cycle)" +msgstr "" + +#: ../src/osm.c:79 +msgid "OpenStreetMap (Transport)" +msgstr "" + +#: ../src/osm.c:95 +msgid "OpenStreetMap (Humanitarian)" +msgstr "" + +#: ../src/osm.c:111 +msgid "On Disk OSM Tile Format" +msgstr "" + +#: ../src/osm.c:121 +msgid "MBTiles File" +msgstr "" + +#: ../src/osm.c:132 +msgid "OSM Metatiles" +msgstr "" + +#: ../src/osm.c:146 +msgid "Mapbox Outdoors" +msgstr "" + +#: ../src/osm.c:153 +msgid "Mapbox Specific" +msgstr "" + +#: ../src/osm.c:170 +msgid "OSM (view)" +msgstr "" + +#: ../src/osm.c:174 +msgid "OSM (edit)" +msgstr "" + +#. Note the use of positional parameters +#: ../src/osm.c:179 +msgid "OSM (query)" +msgstr "" + +#: ../src/osm.c:183 +msgid "OSM (render)" +msgstr "" + +#. Example: http://127.0.0.1:8111/load_and_zoom?left=8.19&right=8.20&top=48.605&bottom=48.590&select=node413602999 +#. JOSM or merkaartor must already be running with remote interface enabled +#: ../src/osm.c:190 +msgid "Local port 8111 (eg JOSM)" +msgstr "" + +#: ../src/osm.c:195 +msgid "Geofabrik Map Compare" +msgstr "" + +#: ../src/osm.c:203 +msgid "OpenStreetMap Notes" +msgstr "" + +#. Not really OSM but can't be bothered to create somewhere else to put it... +#: ../src/osm.c:221 +msgid "Wikimedia Toolserver GeoHack" +msgstr "" + +#: ../src/preferences.c:195 +msgid "Preferences" +msgstr "" + +#: ../src/toolbar.c:91 ../src/toolbar.c:92 +msgid "System Default" +msgstr "" + +#: ../src/toolbar.c:91 ../src/viktrwlayer.c:563 +msgid "Small" +msgstr "" + +#: ../src/toolbar.c:91 ../src/viktrwlayer.c:564 +msgid "Medium" +msgstr "" + +#: ../src/toolbar.c:91 ../src/viktrwlayer.c:565 +msgid "Large" +msgstr "" + +#: ../src/toolbar.c:92 +msgid "Icons Only" +msgstr "" + +#: ../src/toolbar.c:92 +msgid "Text Only" +msgstr "" + +#: ../src/toolbar.c:92 +msgid "Icons and Text" +msgstr "" + +#: ../src/toolbar.c:106 +msgid "Append to Menu:" +msgstr "" + +#: ../src/toolbar.c:107 +msgid "Pack the toolbar to the main menu to save vertical space" +msgstr "" + +#: ../src/toolbar.c:108 +msgid "Icon Size:" +msgstr "" + +#: ../src/toolbar.c:110 +msgid "Icon Style:" +msgstr "" + +#: ../src/toolbar.c:112 +msgid "Customize:" +msgstr "" + +#: ../src/toolbar.c:112 +msgid "Customize Buttons" +msgstr "" + +#. Preferences +#: ../src/toolbar.c:145 +msgid "Toolbar" +msgstr "" + +#: ../src/toolbar.c:312 +msgid "_Customize" +msgstr "" + +#: ../src/toolbar.c:641 +msgid "Separator" +msgstr "" + +#: ../src/toolbar.c:642 +msgid "--- Separator ---" +msgstr "" + +#: ../src/toolbar.c:1007 +msgid "Customize Toolbar" +msgstr "" + +#: ../src/toolbar.c:1028 +msgid "" +"Select items to be displayed on the toolbar. Items can be reordered by drag " +"and drop." +msgstr "" + +#: ../src/toolbar.c:1044 +msgid "Available Items" +msgstr "" + +#: ../src/toolbar.c:1065 +msgid "Displayed Items" +msgstr "" + +#: ../src/viklayer_defaults.c:232 +#, c-format +msgid "Could not open file: %s" +msgstr "" + +#: ../src/viklayer_defaults.c:304 +msgid "Layer Defaults" +msgstr "" + +#: ../src/uibuilder.c:196 +msgid "Take care that this password will be stored clearly in a plain file." +msgstr "" + +#: ../src/uibuilder.c:628 ../src/viktrwlayer_export.c:188 +#: ../src/viktrwlayer_export.c:304 ../src/vikwindow.c:3666 +#: ../src/vikwindow.c:4408 +#, c-format +msgid "The file \"%s\" exists, do you wish to overwrite it?" +msgstr "" + +#: ../src/vikaggregatelayer.c:41 +msgid "Aggregate" +msgstr "" + +#: ../src/vikaggregatelayer.c:528 ../src/viktrwlayer.c:11700 +#, c-format +msgid "%s: Waypoint List" +msgstr "" + +#: ../src/vikaggregatelayer.c:570 +msgid "Search by Date" +msgstr "" + +#: ../src/vikaggregatelayer.c:576 +msgid "No items found with the requested date." +msgstr "" + +#: ../src/vikaggregatelayer.c:615 ../src/viktrwlayer.c:11691 +#, c-format +msgid "%s: Track and Route List" +msgstr "" + +#: ../src/vikaggregatelayer.c:681 ../src/viktrwlayer.c:8346 +#: ../src/viktrwlayer.c:8417 ../src/viktrwlayer.c:8494 +msgid "_Visibility" +msgstr "" + +#: ../src/vikaggregatelayer.c:686 +msgid "_Show All" +msgstr "" + +#: ../src/vikaggregatelayer.c:692 +msgid "_Hide All" +msgstr "" + +#: ../src/vikaggregatelayer.c:698 ../src/viktrwlayer.c:8363 +#: ../src/viktrwlayer.c:8434 ../src/viktrwlayer.c:8511 +msgid "_Toggle" +msgstr "" + +#: ../src/vikaggregatelayer.c:705 ../src/viktrwlayer.c:8532 +msgid "_Sort" +msgstr "" + +#: ../src/vikaggregatelayer.c:711 ../src/viktrwlayer.c:8538 +msgid "Name _Ascending" +msgstr "" + +#: ../src/vikaggregatelayer.c:717 ../src/viktrwlayer.c:8544 +msgid "Name _Descending" +msgstr "" + +#: ../src/vikaggregatelayer.c:723 ../src/viktrwlayer.c:575 +#: ../src/viktrwlayer.c:8550 +msgid "Date Ascending" +msgstr "" + +#: ../src/vikaggregatelayer.c:729 ../src/viktrwlayer.c:576 +#: ../src/viktrwlayer.c:8556 +msgid "Date Descending" +msgstr "" + +#: ../src/vikaggregatelayer.c:735 ../src/viktrwlayer.c:8445 +#: ../src/viktrwlayer.c:8523 ../src/viktrwlayer.c:8595 +#: ../src/viktrwlayer_tracklist.c:296 +msgid "_Statistics" +msgstr "" + +#: ../src/vikaggregatelayer.c:740 ../src/viktrwlayer.c:4533 +msgid "Track _List..." +msgstr "" + +#: ../src/vikaggregatelayer.c:746 ../src/viktrwlayer.c:4540 +msgid "_Waypoint List..." +msgstr "" + +#: ../src/vikaggregatelayer.c:753 +msgid "Searc_h" +msgstr "" + +#: ../src/vikaggregatelayer.c:759 +msgid "By _Date..." +msgstr "" + +#: ../src/vikaggregatelayer.c:762 +msgid "Find the first item with a specified date" +msgstr "" + +#: ../src/vikaggregatelayer.c:765 +msgid "Load E_xternal Layers" +msgstr "" + +#. Could have a more complicated tooltip that numbers each type of layers, +#. but for now a simple overall count +#: ../src/vikaggregatelayer.c:1011 +#, c-format +msgid "One layer" +msgid_plural "%d layers" +msgstr[0] "" +msgstr[1] "" + +#: ../src/vikaggregatelayer.c:1014 +#, c-format +msgid "Empty" +msgstr "" + +#: ../src/vikdemlayer.c:86 +msgid "SRTM Global 90m (3 arcsec)" +msgstr "" + +#: ../src/vikdemlayer.c:94 +msgid "Absolute height" +msgstr "" + +#: ../src/vikdemlayer.c:95 +msgid "Height gradient" +msgstr "" + +#: ../src/vikdemlayer.c:120 +msgid "DEM Files:" +msgstr "" + +#: ../src/vikdemlayer.c:121 +msgid "Download Source:" +msgstr "" + +#: ../src/vikdemlayer.c:122 +msgid "Min Elev Color:" +msgstr "" + +#: ../src/vikdemlayer.c:123 ../src/viktrwlayer_wpwin.c:207 +msgid "Type:" +msgstr "" + +#: ../src/vikdemlayer.c:124 +msgid "Min Elev:" +msgstr "" + +#: ../src/vikdemlayer.c:125 +msgid "Max Elev:" +msgstr "" + +#: ../src/vikdemlayer.c:137 +msgid "_DEM Download" +msgstr "" + +#: ../src/vikdemlayer.c:137 +msgid "DEM Download" +msgstr "" + +#: ../src/vikdemlayer.c:192 +msgid "DEM" +msgstr "" + +#: ../src/vikdemlayer.c:304 +#, c-format +msgid "Number of files: %d" +msgstr "" + +#: ../src/vikdemlayer.c:446 +msgid "DEM Loading" +msgstr "" + +#: ../src/vikdemlayer.c:927 +#, c-format +msgid "No SRTM data available for %f, %f" +msgstr "" + +#: ../src/vikdemlayer.c:948 +#, c-format +msgid "DEM download failure for %f, %f" +msgstr "" + +#: ../src/vikdemlayer.c:954 +#, c-format +msgid "DEM write failure for %s" +msgstr "" + +#. Probably not over any land... +#: ../src/vikdemlayer.c:1201 +msgid "No DEM File Available" +msgstr "" + +#: ../src/vikdemlayer.c:1220 +#, c-format +msgid "" +"\n" +"Source: %s\n" +"\n" +"DEM File: %s\n" +"DEM File Timestamp: %s" +msgstr "" + +#: ../src/vikdemlayer.c:1224 +#, c-format +msgid "" +"Source: %s\n" +"\n" +"No DEM File!" +msgstr "" + +#: ../src/vikdemlayer.c:1264 +#, c-format +msgid "Downloading DEM %s" +msgstr "" + +#: ../src/vikdemlayer.c:1289 +msgid "_Show DEM File Information" +msgstr "" + +#: ../src/vikfileentry.c:72 +msgid "Browse..." +msgstr "" + +#: ../src/vikfileentry.c:103 +msgid "Choose file" +msgstr "" + +#: ../src/vikfileentry.c:120 ../src/vikwindow.c:4372 +msgid "PNG" +msgstr "" + +#: ../src/vikfileentry.c:125 +msgid "TIFF" +msgstr "" + +#: ../src/vikfileentry.c:133 +msgid "MBTiles" +msgstr "" + +#: ../src/vikfileentry.c:142 +msgid "XML" +msgstr "" + +#: ../src/vikfileentry.c:149 +msgid "MML" +msgstr "" + +#: ../src/vikfileentry.c:154 +msgid "MSS" +msgstr "" + +#: ../src/vikfilelist.c:49 +msgid "Choose file(s)" +msgstr "" + +#: ../src/vikfilelist.c:182 +msgid "Add..." +msgstr "" + +#: ../src/vikfilelist.c:183 +msgid "Delete" +msgstr "" + +#: ../src/vikgeoreflayer.c:97 +msgid "_Georef Move Map" +msgstr "" + +#: ../src/vikgeoreflayer.c:97 +msgid "Georef Move Map" +msgstr "" + +#: ../src/vikgeoreflayer.c:106 +msgid "Georef Z_oom Tool" +msgstr "" + +#: ../src/vikgeoreflayer.c:106 +msgid "Georef Zoom Tool" +msgstr "" + +#: ../src/vikgeoreflayer.c:117 +msgid "GeoRef Map" +msgstr "" + +#: ../src/vikgeoreflayer.c:214 +msgid "Auto Read World Files:" +msgstr "" + +#: ../src/vikgeoreflayer.c:215 +msgid "" +"Automatically attempt to read associated world file of a new image for a " +"GeoRef layer" +msgstr "" + +#: ../src/vikgeoreflayer.c:511 ../src/vikgeoreflayer.c:797 +#: ../src/vikmapslayer.c:1174 +#, c-format +msgid "Couldn't open image file: %s" +msgstr "" + +#: ../src/vikgeoreflayer.c:607 ../src/vikgeoreflayer.c:633 +msgid "Choose World file" +msgstr "" + +#: ../src/vikgeoreflayer.c:619 +msgid "The World file you requested could not be opened for reading." +msgstr "" + +#: ../src/vikgeoreflayer.c:621 +msgid "Unexpected end of file reading World file." +msgstr "" + +#: ../src/vikgeoreflayer.c:646 +msgid "The file you requested could not be opened for writing." +msgstr "" + +#: ../src/vikgeoreflayer.c:782 +msgid "Lower right corner values may not be consistent with upper right values" +msgstr "" + +#: ../src/vikgeoreflayer.c:806 +#, c-format +msgid "Invalid image size: %s" +msgstr "" + +#: ../src/vikgeoreflayer.c:831 ../src/viklayer.c:561 ../src/vikwindow.c:4891 +msgid "Layer Properties" +msgstr "" + +#: ../src/vikgeoreflayer.c:852 +msgid "World File Parameters:" +msgstr "" + +#: ../src/vikgeoreflayer.c:853 +msgid "Load From File..." +msgstr "" + +#: ../src/vikgeoreflayer.c:858 +msgid "Corner pixel easting:" +msgstr "" + +#: ../src/vikgeoreflayer.c:860 +msgid "the UTM \"easting\" value of the upper-left corner pixel of the map" +msgstr "" + +#: ../src/vikgeoreflayer.c:862 +msgid "Corner pixel northing:" +msgstr "" + +#: ../src/vikgeoreflayer.c:864 +msgid "the UTM \"northing\" value of the upper-left corner pixel of the map" +msgstr "" + +#: ../src/vikgeoreflayer.c:866 +msgid "X (easting) scale (mpp): " +msgstr "" + +#: ../src/vikgeoreflayer.c:867 +msgid "Y (northing) scale (mpp): " +msgstr "" + +#: ../src/vikgeoreflayer.c:870 +msgid "the scale of the map in the X direction (meters per pixel)" +msgstr "" + +#: ../src/vikgeoreflayer.c:872 +msgid "the scale of the map in the Y direction (meters per pixel)" +msgstr "" + +#: ../src/vikgeoreflayer.c:874 +msgid "Map Image:" +msgstr "" + +#: ../src/vikgeoreflayer.c:919 +msgid "Upper left latitude:" +msgstr "" + +#: ../src/vikgeoreflayer.c:921 +msgid "Upper left longitude:" +msgstr "" + +#: ../src/vikgeoreflayer.c:923 +msgid "Lower right latitude:" +msgstr "" + +#: ../src/vikgeoreflayer.c:925 +msgid "Lower right longitude:" +msgstr "" + +#: ../src/vikgeoreflayer.c:937 +msgid "Calculate MPP values from coordinates" +msgstr "" + +#: ../src/vikgeoreflayer.c:938 +msgid "" +"Enter all corner coordinates before calculating the MPP values from the " +"image size" +msgstr "" + +#: ../src/vikgeoreflayer.c:948 +msgid "UTM" +msgstr "" + +#: ../src/vikgeoreflayer.c:949 +msgid "Latitude/Longitude" +msgstr "" + +#: ../src/vikgeoreflayer.c:957 ../src/vikmapniklayer.c:82 +#: ../src/vikmapslayer.c:158 +msgid "Alpha:" +msgstr "" + +#. Now with icons +#: ../src/vikgeoreflayer.c:1062 +msgid "_Zoom to Fit Map" +msgstr "" + +#: ../src/vikgeoreflayer.c:1068 +msgid "_Goto Map Center" +msgstr "" + +#: ../src/vikgeoreflayer.c:1074 +msgid "_Export to World File" +msgstr "" + +#: ../src/vikgoto.c:98 +msgid "No goto tool available." +msgstr "" + +#: ../src/vikgoto.c:295 +msgid "goto" +msgstr "" + +#: ../src/vikgoto.c:297 +msgid "goto provider:" +msgstr "" + +#: ../src/vikgoto.c:312 +msgid "Enter address or place name:" +msgstr "" + +#: ../src/vikgoto.c:487 +msgid "Locality" +msgstr "" + +#: ../src/vikgpslayer.c:137 +msgid "Data Mode" +msgstr "" + +#: ../src/vikgpslayer.c:139 +msgid "Realtime Tracking Mode" +msgstr "" + +#: ../src/vikgpslayer.c:176 +msgid "Keep vehicle at center" +msgstr "" + +#: ../src/vikgpslayer.c:177 +msgid "Keep vehicle on screen" +msgstr "" + +#: ../src/vikgpslayer.c:178 +msgid "Disable" +msgstr "" + +#: ../src/vikgpslayer.c:218 +msgid "Download Tracks:" +msgstr "" + +#: ../src/vikgpslayer.c:219 +msgid "Upload Tracks:" +msgstr "" + +#: ../src/vikgpslayer.c:220 +msgid "Download Routes:" +msgstr "" + +#: ../src/vikgpslayer.c:221 +msgid "Upload Routes:" +msgstr "" + +#: ../src/vikgpslayer.c:222 +msgid "Download Waypoints:" +msgstr "" + +#: ../src/vikgpslayer.c:223 +msgid "Upload Waypoints:" +msgstr "" + +#: ../src/vikgpslayer.c:225 +msgid "Recording tracks" +msgstr "" + +#: ../src/vikgpslayer.c:226 +msgid "Jump to current position on start" +msgstr "" + +#: ../src/vikgpslayer.c:227 +msgid "Moving Map Method:" +msgstr "" + +#: ../src/vikgpslayer.c:228 +msgid "Update Statusbar:" +msgstr "" + +#: ../src/vikgpslayer.c:228 +msgid "Display information in the statusbar on GPS updates" +msgstr "" + +#: ../src/vikgpslayer.c:229 +msgid "Auto Connect" +msgstr "" + +#: ../src/vikgpslayer.c:229 +msgid "Automatically connect to GPSD" +msgstr "" + +#: ../src/vikgpslayer.c:230 +msgid "Gpsd Host:" +msgstr "" + +#: ../src/vikgpslayer.c:231 +msgid "Gpsd Port:" +msgstr "" + +#: ../src/vikgpslayer.c:232 +msgid "Gpsd Retry Interval (seconds):" +msgstr "" + +#: ../src/vikgpslayer.c:254 +msgid "GPS" +msgstr "" + +#: ../src/vikgpslayer.c:320 ../src/vikgpslayer.c:1504 +msgid "GPS Download" +msgstr "" + +#: ../src/vikgpslayer.c:320 ../src/vikgpslayer.c:1504 ../src/viktrwlayer.c:3993 +msgid "GPS Upload" +msgstr "" + +#: ../src/vikgpslayer.c:322 +msgid "GPS Realtime Tracking" +msgstr "" + +#: ../src/vikgpslayer.c:458 +msgid "Connected" +msgstr "" + +#: ../src/vikgpslayer.c:460 +msgid "Disconnected" +msgstr "" + +#: ../src/vikgpslayer.c:554 +msgid "Unknown GPS Protocol" +msgstr "" + +#: ../src/vikgpslayer.c:572 +msgid "Unknown serial port device" +msgstr "" + +#: ../src/vikgpslayer.c:691 +#, c-format +msgid "%s: unknown parameter" +msgstr "" + +#. Now with icons +#: ../src/vikgpslayer.c:794 +msgid "_Upload to GPS" +msgstr "" + +#: ../src/vikgpslayer.c:800 +msgid "Download from _GPS" +msgstr "" + +#: ../src/vikgpslayer.c:821 +msgid "Empty _Realtime" +msgstr "" + +#: ../src/vikgpslayer.c:828 +msgid "E_mpty Upload" +msgstr "" + +#: ../src/vikgpslayer.c:834 +msgid "_Empty Download" +msgstr "" + +#: ../src/vikgpslayer.c:840 +msgid "Empty _All" +msgstr "" + +#: ../src/vikgpslayer.c:852 +#, c-format +msgid "Unexpected number of disconnected handlers: %d" +msgstr "" + +#: ../src/vikgpslayer.c:995 +#, c-format +msgid "Uploading %d waypoint..." +msgid_plural "Uploading %d waypoints..." +msgstr[0] "" +msgstr[1] "" + +#: ../src/vikgpslayer.c:1000 +#, c-format +msgid "Uploading %d trackpoint..." +msgid_plural "Uploading %d trackpoints..." +msgstr[0] "" +msgstr[1] "" + +#: ../src/vikgpslayer.c:1005 +#, c-format +msgid "Uploading %d routepoint..." +msgid_plural "Uploading %d routepoints..." +msgstr[0] "" +msgstr[1] "" + +#: ../src/vikgpslayer.c:1034 +#, c-format +msgid "Downloaded %d out of %d waypoint..." +msgid_plural "Downloaded %d out of %d waypoints..." +msgstr[0] "" +msgstr[1] "" + +#: ../src/vikgpslayer.c:1040 +#, c-format +msgid "Downloaded %d out of %d trackpoint..." +msgid_plural "Downloaded %d out of %d trackpoints..." +msgstr[0] "" +msgstr[1] "" + +#: ../src/vikgpslayer.c:1046 +#, c-format +msgid "Downloaded %d out of %d routepoint..." +msgid_plural "Downloaded %d out of %d routepoints..." +msgstr[0] "" +msgstr[1] "" + +#: ../src/vikgpslayer.c:1056 +#, c-format +msgid "Uploaded %d out of %d waypoint..." +msgid_plural "Uploaded %d out of %d waypoints..." +msgstr[0] "" +msgstr[1] "" + +#: ../src/vikgpslayer.c:1062 +#, c-format +msgid "Uploaded %d out of %d trackpoint..." +msgid_plural "Uploaded %d out of %d trackpoints..." +msgstr[0] "" +msgstr[1] "" + +#: ../src/vikgpslayer.c:1068 +#, c-format +msgid "Uploaded %d out of %d routepoint..." +msgid_plural "Uploaded %d out of %d routepoints..." +msgstr[0] "" +msgstr[1] "" + +#: ../src/vikgpslayer.c:1079 +#, c-format +msgid "Downloaded %d waypoint" +msgid_plural "Downloaded %d waypoints" +msgstr[0] "" +msgstr[1] "" + +#: ../src/vikgpslayer.c:1085 +#, c-format +msgid "Downloaded %d trackpoint" +msgid_plural "Downloaded %d trackpoints" +msgstr[0] "" +msgstr[1] "" + +#: ../src/vikgpslayer.c:1091 +#, c-format +msgid "Downloaded %d routepoint" +msgid_plural "Downloaded %d routepoints" +msgstr[0] "" +msgstr[1] "" + +#: ../src/vikgpslayer.c:1101 +#, c-format +msgid "Uploaded %d waypoint" +msgid_plural "Uploaded %d waypoints" +msgstr[0] "" +msgstr[1] "" + +#: ../src/vikgpslayer.c:1107 +#, c-format +msgid "Uploaded %d trackpoint" +msgid_plural "Uploaded %d trackpoints" +msgstr[0] "" +msgstr[1] "" + +#: ../src/vikgpslayer.c:1113 +#, c-format +msgid "Uploaded %d routepoint" +msgid_plural "Uploaded %d routepoints" +msgstr[0] "" +msgstr[1] "" + +#: ../src/vikgpslayer.c:1363 +msgid "Error: No result." +msgstr "" + +#: ../src/vikgpslayer.c:1471 +msgid "Warning - GPS Upload items may overwrite each other" +msgstr "" + +#: ../src/vikgpslayer.c:1506 +msgid "Status: detecting gpsbabel" +msgstr "" + +#: ../src/vikgpslayer.c:1533 +msgid "No GPS items selected for transfer." +msgstr "" + +#: ../src/vikgpslayer.c:1546 +msgid "Could not turn off device." +msgstr "" + +#: ../src/vikgpslayer.c:1589 +msgid "Are you sure you want to delete GPS Upload data?" +msgstr "" + +#: ../src/vikgpslayer.c:1602 +msgid "Are you sure you want to delete GPS Download data?" +msgstr "" + +#: ../src/vikgpslayer.c:1616 +msgid "Are you sure you want to delete GPS Realtime data?" +msgstr "" + +#: ../src/vikgpslayer.c:1630 +msgid "Are you sure you want to delete All GPS data?" +msgstr "" + +#: ../src/vikgpslayer.c:2004 +#, c-format +msgid "" +"Failed to connect to gpsd at %s (port %s)\n" +"Should Viking keep trying (every %d seconds)?" +msgstr "" + +#: ../src/viklayerspanel.c:73 +msgid "C_ut" +msgstr "" + +#: ../src/viklayerspanel.c:74 ../src/vikwindow.c:4882 +msgid "_Copy" +msgstr "" + +#: ../src/viklayerspanel.c:75 ../src/vikwindow.c:4883 +msgid "_Paste" +msgstr "" + +#: ../src/viklayerspanel.c:76 ../src/vikwindow.c:4884 +msgid "_Delete" +msgstr "" + +#: ../src/viklayerspanel.c:154 +msgid "New Layer" +msgstr "" + +#: ../src/viklayerspanel.c:347 +msgid "Top Layer" +msgstr "" + +#: ../src/viklayerspanel.c:363 +msgid "Add new layer" +msgstr "" + +#: ../src/viklayerspanel.c:370 ../src/vikwindow.c:4884 +msgid "Remove selected layer" +msgstr "" + +#: ../src/viklayerspanel.c:377 +msgid "Move selected layer up" +msgstr "" + +#: ../src/viklayerspanel.c:384 +msgid "Move selected layer down" +msgstr "" + +#: ../src/viklayerspanel.c:391 ../src/vikwindow.c:4881 +msgid "Cut selected layer" +msgstr "" + +#: ../src/viklayerspanel.c:398 ../src/vikwindow.c:4882 +msgid "Copy selected layer" +msgstr "" + +#: ../src/viklayerspanel.c:405 ../src/vikwindow.c:4883 +msgid "" +"Paste layer into selected container layer or otherwise above selected layer" +msgstr "" + +#: ../src/viklayerspanel.c:502 +msgid "New name can not be blank." +msgstr "" + +#: ../src/viklayerspanel.c:751 +msgid "Aggregate Layers have no settable properties." +msgstr "" + +#: ../src/viklayerspanel.c:798 +msgid "You cannot cut the Top Layer." +msgstr "" + +#: ../src/viklayerspanel.c:843 +#, c-format +msgid "Are you sure you want to delete %s?" +msgstr "" + +#: ../src/viklayerspanel.c:863 +msgid "You cannot delete the Top Layer." +msgstr "" + +#: ../src/vikmapniklayer.c:78 +msgid "CSS (MML) Config File:" +msgstr "" + +#: ../src/vikmapniklayer.c:79 +msgid "CartoCSS configuration file" +msgstr "" + +#: ../src/vikmapniklayer.c:80 +msgid "XML Config File:" +msgstr "" + +#: ../src/vikmapniklayer.c:81 +msgid "Mapnik XML configuration file" +msgstr "" + +#: ../src/vikmapniklayer.c:84 +msgid "Use File Cache:" +msgstr "" + +#: ../src/vikmapniklayer.c:86 +msgid "File Cache Directory:" +msgstr "" + +#: ../src/vikmapniklayer.c:122 +msgid "_Mapnik Features" +msgstr "" + +#: ../src/vikmapniklayer.c:122 +msgid "Mapnik Features" +msgstr "" + +#: ../src/vikmapniklayer.c:140 +msgid "Mapnik Rendering" +msgstr "" + +#. Changing these values only applies before first mapnik layer is 'created' +#: ../src/vikmapniklayer.c:258 +msgid "Plugins Directory:" +msgstr "" + +#: ../src/vikmapniklayer.c:258 ../src/vikmapniklayer.c:259 +#: ../src/vikmapniklayer.c:260 ../src/vikmapniklayer.c:261 +msgid "You need to restart Viking for a change to this value to be used" +msgstr "" + +#: ../src/vikmapniklayer.c:259 +msgid "Fonts Directory:" +msgstr "" + +#: ../src/vikmapniklayer.c:260 +msgid "Recurse Fonts Directory:" +msgstr "" + +#: ../src/vikmapniklayer.c:261 +msgid "Rerender Timeout (hours):" +msgstr "" + +#. Changeable any time +#: ../src/vikmapniklayer.c:263 +msgid "CartoCSS:" +msgstr "" + +#: ../src/vikmapniklayer.c:263 +msgid "The program to convert CartoCSS files into Mapnik XML" +msgstr "" + +#: ../src/vikmapniklayer.c:506 +msgid "Running" +msgstr "" + +#: ../src/vikmapniklayer.c:525 +#, c-format +msgid "" +"Error running carto command:\n" +"%s" +msgstr "" + +#: ../src/vikmapniklayer.c:561 +msgid " completed in " +msgstr "" + +#: ../src/vikmapniklayer.c:561 +msgid "seconds" +msgstr "" + +#: ../src/vikmapniklayer.c:611 ../src/vikmapniklayer.c:979 +#, c-format +msgid "" +"Mapnik error loading configuration file:\n" +"%s" +msgstr "" + +#: ../src/vikmapniklayer.c:749 +#, c-format +msgid "Mapnik Render %d:%d:%d %s" +msgstr "" + +#: ../src/vikmapniklayer.c:840 +msgid "Mapnik Rendering must be in Mercator mode" +msgstr "" + +#: ../src/vikmapniklayer.c:997 +msgid "Mapnik Information" +msgstr "" + +#: ../src/vikmapniklayer.c:1031 +msgid "_Flush Memory Cache" +msgstr "" + +#: ../src/vikmapniklayer.c:1044 +msgid "_Run Carto Command" +msgstr "" + +#: ../src/vikmapniklayer.c:1102 ../src/vikmapslayer.c:2029 +#, c-format +msgid "Tile File Timestamp: %s" +msgstr "" + +#: ../src/vikmapniklayer.c:1105 ../src/vikmapslayer.c:2032 +msgid "Tile File Timestamp: Not Available" +msgstr "" + +#: ../src/vikmapniklayer.c:1120 +#, c-format +msgid "Rendering time %.2f seconds" +msgstr "" + +#: ../src/vikmapniklayer.c:1124 ../src/vikmapslayer.c:2042 +msgid "Tile Information" +msgstr "" + +#: ../src/vikmapniklayer.c:1145 +msgid "_Rerender Tile" +msgstr "" + +#: ../src/vikmapniklayer.c:1150 +msgid "_Info" +msgstr "" + +#. ******* MAPZOOMS ******** +#: ../src/vikmapslayer.c:96 +msgid "Use Viking Zoom Level" +msgstr "" + +#: ../src/vikmapslayer.c:146 +msgid "OSM" +msgstr "" + +#. NB mode => id - But can't break file format just to rename something better +#: ../src/vikmapslayer.c:152 +msgid "Map Type:" +msgstr "" + +#: ../src/vikmapslayer.c:153 +msgid "Maps Directory:" +msgstr "" + +#: ../src/vikmapslayer.c:154 +msgid "Cache Layout:" +msgstr "" + +#: ../src/vikmapslayer.c:155 +msgid "This determines the tile storage layout on disk" +msgstr "" + +#: ../src/vikmapslayer.c:156 +msgid "Map File:" +msgstr "" + +#: ../src/vikmapslayer.c:157 +msgid "An MBTiles file. Only applies when the map type method is 'MBTiles'" +msgstr "" + +#: ../src/vikmapslayer.c:159 +msgid "Control the Alpha value for transparency effects" +msgstr "" + +#: ../src/vikmapslayer.c:160 +msgid "Autodownload maps:" +msgstr "" + +#: ../src/vikmapslayer.c:161 +msgid "Autodownload Only Gets Missing Maps:" +msgstr "" + +#: ../src/vikmapslayer.c:162 +msgid "" +"Using this option avoids attempting to update already acquired tiles. This " +"can be useful if you want to restrict the network usage, without having to " +"resort to manual control. Only applies when 'Autodownload Maps' is on." +msgstr "" + +#: ../src/vikmapslayer.c:163 +msgid "Zoom Level:" +msgstr "" + +#: ../src/vikmapslayer.c:164 +msgid "" +"Determines the method of displaying map tiles for the current zoom level. " +"'Viking Zoom Level' uses the best matching level, otherwise setting a fixed " +"value will always use map tiles of the specified value regardless of the " +"actual zoom level." +msgstr "" + +#: ../src/vikmapslayer.c:197 +msgid "_Maps Download" +msgstr "" + +#: ../src/vikmapslayer.c:197 +msgid "Maps Download" +msgstr "" + +#: ../src/vikmapslayer.c:213 ../src/vikutils.c:895 +msgid "Map" +msgstr "" + +#: ../src/vikmapslayer.c:306 +msgid "Default map layer directory:" +msgstr "" + +#: ../src/vikmapslayer.c:306 +msgid "Choose a directory to store cached Map tiles for this layer" +msgstr "" + +#: ../src/vikmapslayer.c:436 ../src/vikmapslayer.c:633 +msgid "Unknown map type" +msgstr "" + +#: ../src/vikmapslayer.c:664 +msgid "Unknown Map Zoom" +msgstr "" + +#: ../src/vikmapslayer.c:833 +#, c-format +msgid "Failed to open MBTiles file: %s" +msgstr "" + +#: ../src/vikmapslayer.c:856 +#, c-format +msgid "" +"New map cannot be displayed in the current drawmode.\n" +"Select \"%s\" from View menu to view it." +msgstr "" + +#: ../src/vikmapslayer.c:1314 +#, c-format +msgid "" +"Cowardly refusing to draw tiles or existence of tiles beyond %d zoom out " +"factor" +msgstr "" + +#. TODO: ?? count up the number of download errors somehow... +#: ../src/vikmapslayer.c:1667 +msgid "Failed to download tile" +msgstr "" + +#: ../src/vikmapslayer.c:1673 +msgid "Unable to save tile" +msgstr "" + +#: ../src/vikmapslayer.c:1799 +#, c-format +msgid "Redownloading up to %d %s map..." +msgid_plural "Redownloading up to %d %s maps..." +msgstr[0] "" +msgstr[1] "" + +#: ../src/vikmapslayer.c:1801 +#, c-format +msgid "Redownloading %d %s map..." +msgid_plural "Redownloading %d %s maps..." +msgstr[0] "" +msgstr[1] "" + +#: ../src/vikmapslayer.c:1805 ../src/vikmapslayer.c:1890 +#, c-format +msgid "Downloading %d %s map..." +msgid_plural "Downloading %d %s maps..." +msgstr[0] "" +msgstr[1] "" + +#: ../src/vikmapslayer.c:1969 +msgid "YES" +msgstr "" + +#: ../src/vikmapslayer.c:1973 ../src/vikmapslayer.c:1977 +msgid "NO" +msgstr "" + +#. NB Also handles .jpg automatically due to pixbuf_new_from () support - although just print png for now. +#: ../src/vikmapslayer.c:1980 +#, c-format +msgid "Source: %s (%d%s%d%s%d.%s %s)" +msgstr "" + +#: ../src/vikmapslayer.c:1983 +msgid "Source: Not available" +msgstr "" + +#: ../src/vikmapslayer.c:2000 +msgid "Source: file://" +msgstr "" + +#: ../src/vikmapslayer.c:2012 +#, c-format +msgid "Source: %s" +msgstr "" + +#: ../src/vikmapslayer.c:2038 +#, c-format +msgid "Tile File: %s [Not Available]" +msgstr "" + +#: ../src/vikmapslayer.c:2086 +msgid "Redownload _Bad Map(s)" +msgstr "" + +#: ../src/vikmapslayer.c:2090 +msgid "Redownload _New Map(s)" +msgstr "" + +#: ../src/vikmapslayer.c:2094 +msgid "Redownload _All Map(s)" +msgstr "" + +#: ../src/vikmapslayer.c:2099 +msgid "_Show Tile Information" +msgstr "" + +#: ../src/vikmapslayer.c:2166 +#, c-format +msgid "" +"Wrong drawmode for this map.\n" +"Select \"%s\" from View menu and try again." +msgstr "" + +#: ../src/vikmapslayer.c:2171 +msgid "Wrong zoom level for this map." +msgstr "" + +#: ../src/vikmapslayer.c:2334 +msgid "Zoom Start:" +msgstr "" + +#: ../src/vikmapslayer.c:2341 +msgid "Zoom End:" +msgstr "" + +#: ../src/vikmapslayer.c:2347 +msgid "Download Maps Method:" +msgstr "" + +#. redownload method - needs to align with REDOWNLOAD* macro values +#: ../src/vikmapslayer.c:2419 +msgid "Missing" +msgstr "" + +#: ../src/vikmapslayer.c:2419 +msgid "Bad" +msgstr "" + +#: ../src/vikmapslayer.c:2419 +msgid "New" +msgstr "" + +#: ../src/vikmapslayer.c:2419 +msgid "Reload All" +msgstr "" + +#: ../src/vikmapslayer.c:2421 +msgid "Download for Zoom Levels" +msgstr "" + +#: ../src/vikmapslayer.c:2461 +#, c-format +msgid "" +"You are not allowed to download more than %d tiles in one go (requested %d)" +msgstr "" + +#: ../src/vikmapslayer.c:2469 +#, c-format +msgid "Do you really want to download %d tiles?" +msgstr "" + +#. Now with icons +#: ../src/vikmapslayer.c:2509 +msgid "Download _Missing Onscreen Maps" +msgstr "" + +#: ../src/vikmapslayer.c:2516 +msgid "Download _New Onscreen Maps" +msgstr "" + +#: ../src/vikmapslayer.c:2523 +msgid "Reload _All Onscreen Maps" +msgstr "" + +#: ../src/vikmapslayer.c:2529 +msgid "Download Maps in _Zoom Levels..." +msgstr "" + +#: ../src/vikmapslayer.c:2539 +msgid "_Open MBTiles Files" +msgstr "" + +#: ../src/vikmapslayer.c:2554 +msgid "Flush Map Cache" +msgstr "" + +#: ../src/vikrouting.c:54 +msgid "Default engine:" +msgstr "" + +#: ../src/vikrouting.c:68 +msgid "Routing" +msgstr "" + +#: ../src/viktreeview.c:347 +msgid "Layer Name" +msgstr "" + +#: ../src/viktreeview.c:924 +#, c-format +msgid "delete data from %s\n" +msgstr "" + +#: ../src/viktrwlayer.c:427 +msgid "Create _Waypoint" +msgstr "" + +#: ../src/viktrwlayer.c:427 +msgid "Create Waypoint" +msgstr "" + +#: ../src/viktrwlayer.c:437 +msgid "Edit _Track" +msgstr "" + +#: ../src/viktrwlayer.c:437 +msgid "Edit Track" +msgstr "" + +#: ../src/viktrwlayer.c:449 +msgid "Edit _Route" +msgstr "" + +#: ../src/viktrwlayer.c:449 +msgid "Edit Route" +msgstr "" + +#: ../src/viktrwlayer.c:460 +msgid "Route _Finder" +msgstr "" + +#: ../src/viktrwlayer.c:460 +msgid "Route Finder" +msgstr "" + +#: ../src/viktrwlayer.c:471 +msgid "Splitter" +msgstr "" + +#: ../src/viktrwlayer.c:482 +msgid "_Edit Waypoint" +msgstr "" + +#: ../src/viktrwlayer.c:482 +msgid "Edit Waypoint" +msgstr "" + +#: ../src/viktrwlayer.c:495 +msgid "Edit Trac_kpoint" +msgstr "" + +#: ../src/viktrwlayer.c:495 +msgid "Edit Trackpoint" +msgstr "" + +#. a pixbuf for this one is already made globally available +#: ../src/viktrwlayer.c:508 +msgid "Show P_icture" +msgstr "" + +#: ../src/viktrwlayer.c:508 +msgid "Show Picture" +msgstr "" + +#: ../src/viktrwlayer.c:531 +msgid "Waypoint Images" +msgstr "" + +#: ../src/viktrwlayer.c:531 +msgid "Tracks Advanced" +msgstr "" + +#: ../src/viktrwlayer.c:531 +msgid "Metadata" +msgstr "" + +#: ../src/viktrwlayer.c:531 +msgid "Filesystem" +msgstr "" + +#: ../src/viktrwlayer.c:534 +msgid "Draw by Track" +msgstr "" + +#: ../src/viktrwlayer.c:534 +msgid "Draw by Speed" +msgstr "" + +#: ../src/viktrwlayer.c:534 +msgid "All Tracks Same Color" +msgstr "" + +#: ../src/viktrwlayer.c:535 +msgid "Filled Square" +msgstr "" + +#: ../src/viktrwlayer.c:535 +msgid "Square" +msgstr "" + +#: ../src/viktrwlayer.c:535 +msgid "Circle" +msgstr "" + +#: ../src/viktrwlayer.c:535 +msgid "X" +msgstr "" + +#: ../src/viktrwlayer.c:561 +msgid "Extra Extra Small" +msgstr "" + +#: ../src/viktrwlayer.c:562 +msgid "Extra Small" +msgstr "" + +#: ../src/viktrwlayer.c:566 +msgid "Extra Large" +msgstr "" + +#: ../src/viktrwlayer.c:567 +msgid "Extra Extra Large" +msgstr "" + +#: ../src/viktrwlayer.c:573 +msgid "Name Ascending" +msgstr "" + +#: ../src/viktrwlayer.c:574 +msgid "Name Descending" +msgstr "" + +#: ../src/viktrwlayer.c:582 ../src/viktrwlayer_propwin.c:3319 +msgid "No" +msgstr "" + +#: ../src/viktrwlayer.c:583 +msgid "Yes" +msgstr "" + +#: ../src/viktrwlayer.c:584 +msgid "No write" +msgstr "" + +#: ../src/viktrwlayer.c:649 ../src/viktrwlayer.c:673 +msgid "Draw Labels" +msgstr "" + +#: ../src/viktrwlayer.c:650 +msgid "Note: the individual track controls what labels may be displayed" +msgstr "" + +#: ../src/viktrwlayer.c:651 +msgid "Track Labels Font Size:" +msgstr "" + +#: ../src/viktrwlayer.c:652 +msgid "Track Drawing Mode:" +msgstr "" + +#: ../src/viktrwlayer.c:653 +msgid "All Tracks Color:" +msgstr "" + +#: ../src/viktrwlayer.c:654 +msgid "The color used when 'All Tracks Same Color' drawing mode is selected" +msgstr "" + +#: ../src/viktrwlayer.c:655 +msgid "Draw Track Lines" +msgstr "" + +#: ../src/viktrwlayer.c:656 +msgid "Track Thickness:" +msgstr "" + +#: ../src/viktrwlayer.c:657 +msgid "Draw Track Direction" +msgstr "" + +#: ../src/viktrwlayer.c:658 +msgid "Direction Size:" +msgstr "" + +#: ../src/viktrwlayer.c:659 +msgid "Draw Trackpoints" +msgstr "" + +#: ../src/viktrwlayer.c:660 +msgid "Trackpoint Size:" +msgstr "" + +#: ../src/viktrwlayer.c:661 +msgid "Draw Elevation" +msgstr "" + +#: ../src/viktrwlayer.c:662 +msgid "Draw Elevation Height %:" +msgstr "" + +#: ../src/viktrwlayer.c:663 +msgid "Draw Stops" +msgstr "" + +#: ../src/viktrwlayer.c:664 +msgid "" +"Whether to draw a marker when trackpoints are at the same position but over " +"the minimum stop length apart in time" +msgstr "" + +#: ../src/viktrwlayer.c:665 +msgid "Min Stop Length (seconds):" +msgstr "" + +#: ../src/viktrwlayer.c:667 +msgid "Track BG Thickness:" +msgstr "" + +#: ../src/viktrwlayer.c:668 +msgid "Track Background Color" +msgstr "" + +#: ../src/viktrwlayer.c:669 +msgid "Draw by Speed Factor (%):" +msgstr "" + +#: ../src/viktrwlayer.c:670 +msgid "" +"The percentage factor away from the average speed determining the color used" +msgstr "" + +#: ../src/viktrwlayer.c:671 +msgid "Track Sort Order:" +msgstr "" + +#: ../src/viktrwlayer.c:674 +msgid "Waypoint Font Size:" +msgstr "" + +#: ../src/viktrwlayer.c:675 +msgid "Waypoint Color:" +msgstr "" + +#: ../src/viktrwlayer.c:676 +msgid "Waypoint Text:" +msgstr "" + +#: ../src/viktrwlayer.c:677 +msgid "Background:" +msgstr "" + +#: ../src/viktrwlayer.c:678 +msgid "Fake BG Color Translucency:" +msgstr "" + +#: ../src/viktrwlayer.c:679 +msgid "Waypoint marker:" +msgstr "" + +#: ../src/viktrwlayer.c:680 +msgid "Waypoint size:" +msgstr "" + +#: ../src/viktrwlayer.c:681 +msgid "Draw Waypoint Symbols:" +msgstr "" + +#: ../src/viktrwlayer.c:682 +msgid "Waypoint Sort Order:" +msgstr "" + +#: ../src/viktrwlayer.c:684 +msgid "Draw Waypoint Images" +msgstr "" + +#: ../src/viktrwlayer.c:685 +msgid "Image Size (pixels):" +msgstr "" + +#: ../src/viktrwlayer.c:686 +msgid "Image Alpha:" +msgstr "" + +#: ../src/viktrwlayer.c:687 +msgid "Image Memory Cache Size:" +msgstr "" + +#: ../src/viktrwlayer.c:690 +msgid "Author" +msgstr "" + +#: ../src/viktrwlayer.c:691 +msgid "Creation Time" +msgstr "" + +#: ../src/viktrwlayer.c:692 +msgid "Keywords" +msgstr "" + +#: ../src/viktrwlayer.c:693 +msgid "External layer:" +msgstr "" + +#: ../src/viktrwlayer.c:693 +msgid "" +"Layer data stored in the Viking file, in an external file, or in an external " +"file but changes are not written to the file (file only loaded at startup)" +msgstr "" + +#: ../src/viktrwlayer.c:694 +msgid "Save layer as:" +msgstr "" + +#: ../src/viktrwlayer.c:694 +msgid "Specify where layer should be saved. Overwrites file if it exists." +msgstr "" + +#: ../src/viktrwlayer.c:798 +msgid "TrackWaypoint" +msgstr "" + +#: ../src/viktrwlayer.c:1999 ../src/viktrwlayer_propwin.c:1469 +#: ../src/viktrwlayer_propwin.c:1471 ../src/vikutils.c:299 +#: ../src/vikutils.c:326 +msgid "miles" +msgstr "" + +#: ../src/viktrwlayer.c:2002 ../src/viktrwlayer_propwin.c:1475 +#: ../src/viktrwlayer_propwin.c:1477 ../src/vikutils.c:303 +#: ../src/vikutils.c:330 +msgid "NM" +msgstr "" + +#. VIK_UNITS_DISTANCE_KILOMETRES: +#: ../src/viktrwlayer.c:2006 ../src/viktrwlayer_propwin.c:1482 +#: ../src/viktrwlayer_propwin.c:1484 ../src/vikutils.c:308 +#: ../src/vikutils.c:335 +msgid "km" +msgstr "" + +#: ../src/viktrwlayer.c:2121 +msgid "start/end" +msgstr "" + +#: ../src/viktrwlayer.c:2133 +msgid "start" +msgstr "" + +#: ../src/viktrwlayer.c:2142 +msgid "end" +msgstr "" + +#: ../src/viktrwlayer.c:3103 +#, c-format +msgid " in %d:%02d hrs:mins" +msgstr "" + +#: ../src/viktrwlayer.c:3107 +#, c-format +msgid "" +"\n" +"%sTotal Length %.1f %s%s" +msgstr "" + +#: ../src/viktrwlayer.c:3131 +#, c-format +msgid "" +"\n" +"Total route length %.1f %s" +msgstr "" + +#: ../src/viktrwlayer.c:3136 +#, c-format +msgid "Tracks: %d - Waypoints: %d - Routes: %d%s%s" +msgstr "" + +#: ../src/viktrwlayer.c:3155 +#, c-format +msgid "Tracks: %d" +msgstr "" + +#: ../src/viktrwlayer.c:3165 +#, c-format +msgid "Routes: %d" +msgstr "" + +#: ../src/viktrwlayer.c:3195 +#, c-format +msgid "- %d:%02d hrs:mins" +msgstr "" + +#: ../src/viktrwlayer.c:3202 +#, c-format +msgid "%s%.1f km %s" +msgstr "" + +#: ../src/viktrwlayer.c:3205 +#, c-format +msgid "%s%.1f miles %s" +msgstr "" + +#: ../src/viktrwlayer.c:3208 +#, c-format +msgid "%s%.1f NM %s" +msgstr "" + +#: ../src/viktrwlayer.c:3222 +#, c-format +msgid "Waypoints: %d" +msgstr "" + +#: ../src/viktrwlayer.c:3279 +#, c-format +msgid "Wpt: Alt %dft" +msgstr "" + +#. VIK_UNITS_HEIGHT_METRES: +#: ../src/viktrwlayer.c:3283 +#, c-format +msgid "Wpt: Alt %dm" +msgstr "" + +#. Add comment if available +#: ../src/viktrwlayer.c:3298 +#, c-format +msgid "%s | %s %s | Comment: %s" +msgstr "" + +#: ../src/viktrwlayer.c:3300 +#, c-format +msgid "%s | %s %s" +msgstr "" + +#: ../src/viktrwlayer.c:3562 ../src/viktrwlayer.c:3591 +msgid "This layer has no waypoints or trackpoints." +msgstr "" + +#: ../src/viktrwlayer.c:3598 ../src/viktrwlayer.c:3607 +#: ../src/viktrwlayer.c:3616 ../src/viktrwlayer.c:3625 +#: ../src/viktrwlayer.c:3634 ../src/viktrwlayer.c:3642 +msgid "Export Layer" +msgstr "" + +#: ../src/viktrwlayer.c:3671 +msgid "Export Route as GPX" +msgstr "" + +#: ../src/viktrwlayer.c:3673 +msgid "Export Track as GPX" +msgstr "" + +#: ../src/viktrwlayer.c:3693 +msgid "Find" +msgstr "" + +#: ../src/viktrwlayer.c:3703 +msgid "Waypoint Name:" +msgstr "" + +#: ../src/viktrwlayer.c:3720 +msgid "Waypoint not found in this layer." +msgstr "" + +#: ../src/viktrwlayer.c:3989 +msgid "Can not upload invisible track." +msgstr "" + +#: ../src/viktrwlayer.c:4082 ../src/viktrwlayer.c:10512 +msgid "Track" +msgstr "" + +#: ../src/viktrwlayer.c:4107 ../src/viktrwlayer.c:10599 +msgid "Route" +msgstr "" + +#: ../src/viktrwlayer.c:4194 +msgid "Externa_l" +msgstr "" + +#: ../src/viktrwlayer.c:4216 ../src/viktrwlayer.c:8456 +#: ../src/viktrwlayer.c:8574 +msgid "_Finish Route" +msgstr "" + +#: ../src/viktrwlayer.c:4218 ../src/viktrwlayer.c:8380 +#: ../src/viktrwlayer.c:8572 +msgid "_Finish Track" +msgstr "" + +#. Now with icons +#: ../src/viktrwlayer.c:4230 +msgid "_View Layer" +msgstr "" + +#: ../src/viktrwlayer.c:4237 +msgid "V_iew" +msgstr "" + +#: ../src/viktrwlayer.c:4243 +msgid "View All _Tracks" +msgstr "" + +#: ../src/viktrwlayer.c:4248 +msgid "View All _Routes" +msgstr "" + +#: ../src/viktrwlayer.c:4253 +msgid "View All _Waypoints" +msgstr "" + +#: ../src/viktrwlayer.c:4258 +msgid "_Goto Center of Layer" +msgstr "" + +#: ../src/viktrwlayer.c:4264 ../src/viktrwlayer.c:8321 +msgid "Goto _Waypoint..." +msgstr "" + +#: ../src/viktrwlayer.c:4270 +msgid "_Export Layer" +msgstr "" + +#: ../src/viktrwlayer.c:4276 +msgid "Export as GPS_Point..." +msgstr "" + +#: ../src/viktrwlayer.c:4281 +msgid "Export as GPS_Mapper..." +msgstr "" + +#: ../src/viktrwlayer.c:4286 +msgid "Export as _GPX..." +msgstr "" + +#: ../src/viktrwlayer.c:4292 +msgid "Export as _KML..." +msgstr "" + +#: ../src/viktrwlayer.c:4299 +msgid "Export as GEO_JSON..." +msgstr "" + +#: ../src/viktrwlayer.c:4306 +msgid "Export via GPSbabel..." +msgstr "" + +#: ../src/viktrwlayer.c:4312 +#, c-format +msgid "Open with External Program_1: %s" +msgstr "" + +#: ../src/viktrwlayer.c:4319 +#, c-format +msgid "Open with External Program_2: %s" +msgstr "" + +#: ../src/viktrwlayer.c:4327 ../src/vikwindow.c:4825 +msgid "_New" +msgstr "" + +#: ../src/viktrwlayer.c:4333 +msgid "New _Waypoint..." +msgstr "" + +#: ../src/viktrwlayer.c:4339 +msgid "New _Track" +msgstr "" + +#: ../src/viktrwlayer.c:4347 +msgid "New _Route" +msgstr "" + +#: ../src/viktrwlayer.c:4356 ../src/viktrwlayer.c:8232 +#: ../src/viktrwlayer.c:9003 +msgid "Geotag _Images..." +msgstr "" + +#: ../src/viktrwlayer.c:4363 +msgid "_Acquire" +msgstr "" + +#: ../src/viktrwlayer.c:4369 ../src/vikwindow.c:4904 +msgid "From _GPS..." +msgstr "" + +#. FIXME: only add menu when at least a routing engine has support for Directions +#: ../src/viktrwlayer.c:4375 +msgid "From _Directions..." +msgstr "" + +#: ../src/viktrwlayer.c:4381 +msgid "From _OSM Traces..." +msgstr "" + +#: ../src/viktrwlayer.c:4386 +msgid "From _My OSM Traces..." +msgstr "" + +#: ../src/viktrwlayer.c:4392 ../src/vikwindow.c:4844 +msgid "From _URL..." +msgstr "" + +#: ../src/viktrwlayer.c:4399 ../src/vikwindow.c:4846 +msgid "From _Wikipedia Waypoints" +msgstr "" + +#: ../src/viktrwlayer.c:4405 +msgid "Within _Layer Bounds" +msgstr "" + +#: ../src/viktrwlayer.c:4411 +msgid "Within _Current View" +msgstr "" + +#: ../src/viktrwlayer.c:4419 +msgid "From Geo_caching..." +msgstr "" + +#: ../src/viktrwlayer.c:4426 ../src/vikwindow.c:4842 +msgid "From Geotagged _Images..." +msgstr "" + +#: ../src/viktrwlayer.c:4433 +msgid "From _File..." +msgstr "" + +#: ../src/viktrwlayer.c:4436 ../src/vikwindow.c:4905 +msgid "Import File With GPS_Babel..." +msgstr "" + +#: ../src/viktrwlayer.c:4443 ../src/viktrwlayer.c:8905 +msgid "_Upload" +msgstr "" + +#: ../src/viktrwlayer.c:4449 +msgid "Upload to _GPS..." +msgstr "" + +#: ../src/viktrwlayer.c:4456 ../src/viktrwlayer.c:8973 +msgid "Upload to _OSM..." +msgstr "" + +#: ../src/viktrwlayer.c:4464 +msgid "De_lete" +msgstr "" + +#: ../src/viktrwlayer.c:4470 +msgid "Delete All _Tracks" +msgstr "" + +#: ../src/viktrwlayer.c:4477 +msgid "Delete Tracks _From Selection..." +msgstr "" + +#: ../src/viktrwlayer.c:4484 ../src/viktrwlayer.c:8481 +msgid "Delete _All Routes" +msgstr "" + +#: ../src/viktrwlayer.c:4491 ../src/viktrwlayer.c:8487 +msgid "_Delete Routes From Selection..." +msgstr "" + +#: ../src/viktrwlayer.c:4498 +msgid "Delete All _Waypoints" +msgstr "" + +#: ../src/viktrwlayer.c:4505 +msgid "Delete Waypoints From _Selection..." +msgstr "" + +#: ../src/viktrwlayer.c:4512 ../src/viktrwlayer.c:8339 +msgid "Delete Duplicate Waypoints" +msgstr "" + +#: ../src/viktrwlayer.c:5198 +#, c-format +msgid "Are you sure you want to delete all tracks in %s?" +msgstr "" + +#: ../src/viktrwlayer.c:5211 +#, c-format +msgid "Are you sure you want to delete all routes in %s?" +msgstr "" + +#: ../src/viktrwlayer.c:5221 +#, c-format +msgid "Are you sure you want to delete all waypoints in %s?" +msgstr "" + +#: ../src/viktrwlayer.c:5238 +#, c-format +msgid "Are you sure you want to delete the waypoint \"%s\"?" +msgstr "" + +#: ../src/viktrwlayer.c:5254 +#, c-format +msgid "Are you sure you want to delete the track \"%s\"?" +msgstr "" + +#: ../src/viktrwlayer.c:5271 +#, c-format +msgid "Are you sure you want to delete the route \"%s\"?" +msgstr "" + +#: ../src/viktrwlayer.c:5527 ../src/viktrwlayer.c:6373 +msgid "" +"Converting a track to a route removes extra track data such as segments, " +"timestamps, etc...\n" +"Do you want to continue?" +msgstr "" + +#: ../src/viktrwlayer.c:5631 +msgid "No DEM layers available, thus no DEM values can be applied." +msgstr "" + +#: ../src/viktrwlayer.c:5651 ../src/viktrwlayer.c:5692 +#, c-format +msgid "%ld point adjusted" +msgid_plural "%ld points adjusted" +msgstr[0] "" +msgstr[1] "" + +#: ../src/viktrwlayer.c:5736 +#, c-format +msgid "%ld waypoint changed" +msgid_plural "%ld waypoints changed" +msgstr[0] "" +msgstr[1] "" + +#: ../src/viktrwlayer.c:5917 +#, c-format +msgid "" +"Refining a track with many points (%d) is unlikely to yield sensible " +"results. Do you want to Continue?" +msgstr "" + +#. Select engine from dialog +#: ../src/viktrwlayer.c:5925 +msgid "Refine Route with Routing Engine..." +msgstr "" + +#: ../src/viktrwlayer.c:5933 +msgid "Select routing engine" +msgstr "" + +#: ../src/viktrwlayer.c:6158 +msgid "Failed. No other tracks with timestamps in this layer found" +msgstr "" + +#: ../src/viktrwlayer.c:6160 +msgid "Failed. No other tracks without timestamps in this layer found" +msgstr "" + +#: ../src/viktrwlayer.c:6179 +msgid "Merge with..." +msgstr "" + +#: ../src/viktrwlayer.c:6180 +msgid "Select route to merge with" +msgstr "" + +#: ../src/viktrwlayer.c:6180 +msgid "Select track to merge with" +msgstr "" + +#: ../src/viktrwlayer.c:6264 ../src/viktrwlayer.c:6346 +msgid "Append Route" +msgstr "" + +#: ../src/viktrwlayer.c:6264 ../src/viktrwlayer.c:6346 +msgid "Append Track" +msgstr "" + +#: ../src/viktrwlayer.c:6265 +msgid "Select the route to append after the current route" +msgstr "" + +#: ../src/viktrwlayer.c:6266 +msgid "Select the track to append after the current track" +msgstr "" + +#: ../src/viktrwlayer.c:6347 +msgid "Select the track to append after the current route" +msgstr "" + +#: ../src/viktrwlayer.c:6348 +msgid "Select the route to append after the current track" +msgstr "" + +#: ../src/viktrwlayer.c:6414 +#, c-format +msgid "%d segment merged" +msgid_plural "%d segments merged" +msgstr[0] "" +msgstr[1] "" + +#: ../src/viktrwlayer.c:6430 +msgid "Failed. This track does not have timestamp" +msgstr "" + +#: ../src/viktrwlayer.c:6442 +msgid "Failed. No other track in this layer has timestamp" +msgstr "" + +#: ../src/viktrwlayer.c:6449 +msgid "Merge Threshold..." +msgstr "" + +#: ../src/viktrwlayer.c:6450 +msgid "Merge when time between tracks less than:" +msgstr "" + +#: ../src/viktrwlayer.c:6580 +msgid "Split Threshold..." +msgstr "" + +#: ../src/viktrwlayer.c:6581 +msgid "Split when time between trackpoints exceeds:" +msgstr "" + +#: ../src/viktrwlayer.c:6598 +#, c-format +msgid "" +"Can not split track due to trackpoints not ordered in time - such as at %s.\n" +"\n" +"Goto this trackpoint?" +msgstr "" + +#: ../src/viktrwlayer.c:6668 +msgid "Split Every Nth Point" +msgstr "" + +#: ../src/viktrwlayer.c:6669 +msgid "Split on every Nth point:" +msgstr "" + +#: ../src/viktrwlayer.c:6779 +msgid "Can not split track as it has no segments" +msgstr "" + +#: ../src/viktrwlayer.c:6861 ../src/viktrwlayer.c:6891 +#, c-format +msgid "Deleted %ld point" +msgid_plural "Deleted %ld points" +msgstr[0] "" +msgstr[1] "" + +#: ../src/viktrwlayer.c:6966 ../src/viktrwlayer.c:10989 +#: ../src/viktrwlayer_waypointlist.c:214 +#, c-format +msgid "Could not launch %s to open file." +msgstr "" + +#: ../src/viktrwlayer.c:6992 ../src/viktrwlayer.c:7113 +msgid "This track has no date information." +msgstr "" + +#: ../src/viktrwlayer.c:7006 ../src/viktrwlayer.c:7136 +msgid "This waypoint has no date information." +msgstr "" + +#: ../src/viktrwlayer.c:7030 +#, c-format +msgid "Could not launch %s" +msgstr "" + +#: ../src/viktrwlayer.c:7269 +msgid "Internal Error in vik_trw_layer_uniquify_tracks" +msgstr "" + +#: ../src/viktrwlayer.c:7374 ../src/viktrwlayer.c:7424 +#: ../src/viktrwlayer.c:7587 +msgid "" +"Multiple entries with the same name exist. This method only works with " +"unique names. Force unique names now?" +msgstr "" + +#: ../src/viktrwlayer.c:7385 +msgid "No tracks found" +msgstr "" + +#: ../src/viktrwlayer.c:7393 ../src/viktrwlayer.c:7443 +#: ../src/viktrwlayer.c:7607 +msgid "Delete Selection" +msgstr "" + +#: ../src/viktrwlayer.c:7394 +msgid "Select tracks to delete" +msgstr "" + +#: ../src/viktrwlayer.c:7435 +msgid "No routes found" +msgstr "" + +#: ../src/viktrwlayer.c:7444 +msgid "Select routes to delete" +msgstr "" + +#: ../src/viktrwlayer.c:7550 +msgid "Internal Error in vik_trw_layer_uniquify_waypoints" +msgstr "" + +#: ../src/viktrwlayer.c:7597 +msgid "No waypoints found" +msgstr "" + +#: ../src/viktrwlayer.c:7608 +msgid "Select waypoints to delete" +msgstr "" + +#: ../src/viktrwlayer.c:7691 +#, c-format +msgid "%ld waypoint deleted" +msgid_plural "%ld waypoints deleted" +msgstr[0] "" + +#: ../src/viktrwlayer.c:7697 +msgid "No duplicates found" +msgstr "" + +#: ../src/viktrwlayer.c:8028 +#, c-format +msgid "" +"A waypoint with the name \"%s\" already exists. Really rename to the same " +"name?" +msgstr "" + +#: ../src/viktrwlayer.c:8058 +#, c-format +msgid "" +"A track with the name \"%s\" already exists. Really rename to the same name?" +msgstr "" + +#: ../src/viktrwlayer.c:8095 +#, c-format +msgid "" +"A route with the name \"%s\" already exists. Really rename to the same name?" +msgstr "" + +#: ../src/viktrwlayer.c:8215 ../src/viktrwlayer.c:8602 +msgid "_Goto" +msgstr "" + +#: ../src/viktrwlayer.c:8226 +msgid "_Visit Geocache Webpage" +msgstr "" + +#: ../src/viktrwlayer.c:8235 +msgid "Geotag multiple images against this waypoint" +msgstr "" + +#: ../src/viktrwlayer.c:8245 ../src/viktrwlayer_waypointlist.c:352 +msgid "_Show Picture..." +msgstr "" + +#: ../src/viktrwlayer.c:8253 +msgid "Update Geotag on _Image" +msgstr "" + +#: ../src/viktrwlayer.c:8259 +msgid "_Update" +msgstr "" + +#: ../src/viktrwlayer.c:8264 +msgid "Update and _Keep File Timestamp" +msgstr "" + +#: ../src/viktrwlayer.c:8276 +msgid "Visit _Webpage" +msgstr "" + +#: ../src/viktrwlayer.c:8306 +msgid "_New Waypoint..." +msgstr "" + +#: ../src/viktrwlayer.c:8315 +msgid "_View All Waypoints" +msgstr "" + +#: ../src/viktrwlayer.c:8327 +msgid "Delete _All Waypoints" +msgstr "" + +#: ../src/viktrwlayer.c:8333 +msgid "_Delete Waypoints From Selection..." +msgstr "" + +#: ../src/viktrwlayer.c:8351 +msgid "_Show All Waypoints" +msgstr "" + +#: ../src/viktrwlayer.c:8357 +msgid "_Hide All Waypoints" +msgstr "" + +#: ../src/viktrwlayer.c:8369 +msgid "_List Waypoints..." +msgstr "" + +#: ../src/viktrwlayer.c:8390 +msgid "_View All Tracks" +msgstr "" + +#: ../src/viktrwlayer.c:8396 +msgid "_New Track" +msgstr "" + +#: ../src/viktrwlayer.c:8404 +msgid "Delete _All Tracks" +msgstr "" + +#: ../src/viktrwlayer.c:8410 +msgid "_Delete Tracks From Selection..." +msgstr "" + +#: ../src/viktrwlayer.c:8422 +msgid "_Show All Tracks" +msgstr "" + +#: ../src/viktrwlayer.c:8428 +msgid "_Hide All Tracks" +msgstr "" + +#: ../src/viktrwlayer.c:8439 +msgid "_List Tracks..." +msgstr "" + +#: ../src/viktrwlayer.c:8467 +msgid "_View All Routes" +msgstr "" + +#: ../src/viktrwlayer.c:8473 +msgid "_New Route" +msgstr "" + +#: ../src/viktrwlayer.c:8499 +msgid "_Show All Routes" +msgstr "" + +#: ../src/viktrwlayer.c:8505 +msgid "_Hide All Routes" +msgstr "" + +#: ../src/viktrwlayer.c:8516 +msgid "_List Routes..." +msgstr "" + +#: ../src/viktrwlayer.c:8587 +msgid "_View Track" +msgstr "" + +#: ../src/viktrwlayer.c:8589 +msgid "_View Route" +msgstr "" + +#: ../src/viktrwlayer.c:8608 +msgid "_Startpoint" +msgstr "" + +#: ../src/viktrwlayer.c:8614 +msgid "\"_Center\"" +msgstr "" + +#: ../src/viktrwlayer.c:8620 +msgid "_Endpoint" +msgstr "" + +#: ../src/viktrwlayer.c:8626 +msgid "_Highest Altitude" +msgstr "" + +#: ../src/viktrwlayer.c:8632 +msgid "_Lowest Altitude" +msgstr "" + +#: ../src/viktrwlayer.c:8640 +msgid "_Maximum Speed" +msgstr "" + +#: ../src/viktrwlayer.c:8646 +msgid "_Date" +msgstr "" + +#: ../src/viktrwlayer.c:8655 +msgid "Co_mbine" +msgstr "" + +#: ../src/viktrwlayer.c:8663 +msgid "_Merge By Time..." +msgstr "" + +#: ../src/viktrwlayer.c:8668 +msgid "Merge _Segments" +msgstr "" + +#: ../src/viktrwlayer.c:8675 +msgid "Merge _With Other Tracks..." +msgstr "" + +#: ../src/viktrwlayer.c:8682 +msgid "_Append Track..." +msgstr "" + +#: ../src/viktrwlayer.c:8684 +msgid "_Append Route..." +msgstr "" + +#: ../src/viktrwlayer.c:8690 +msgid "Append _Route..." +msgstr "" + +#: ../src/viktrwlayer.c:8692 +msgid "Append _Track..." +msgstr "" + +#: ../src/viktrwlayer.c:8699 +msgid "_Split" +msgstr "" + +#: ../src/viktrwlayer.c:8707 +msgid "_Split By Time..." +msgstr "" + +#. ATM always enable this entry - don't want to have to analyse the track before displaying the menu - to keep the menu speedy +#: ../src/viktrwlayer.c:8713 +msgid "Split Se_gments" +msgstr "" + +#: ../src/viktrwlayer.c:8719 +msgid "Split By _Number of Points..." +msgstr "" + +#: ../src/viktrwlayer.c:8724 +msgid "Split at _Trackpoint" +msgstr "" + +#: ../src/viktrwlayer.c:8732 +msgid "_Insert Points" +msgstr "" + +#: ../src/viktrwlayer.c:8738 +msgid "Insert Point _Before Selected Point" +msgstr "" + +#: ../src/viktrwlayer.c:8745 +msgid "Insert Point _After Selected Point" +msgstr "" + +#: ../src/viktrwlayer.c:8754 +msgid "Delete Poi_nts" +msgstr "" + +#: ../src/viktrwlayer.c:8760 +msgid "Delete _Selected Point" +msgstr "" + +#: ../src/viktrwlayer.c:8768 +msgid "Delete Points With The Same _Position" +msgstr "" + +#: ../src/viktrwlayer.c:8773 +msgid "Delete Points With The Same _Time" +msgstr "" + +#: ../src/viktrwlayer.c:8780 ../src/viktrwlayer.c:9029 +msgid "_Transform" +msgstr "" + +#: ../src/viktrwlayer.c:8788 ../src/viktrwlayer.c:9037 +msgid "_Apply DEM Data" +msgstr "" + +#: ../src/viktrwlayer.c:8793 ../src/viktrwlayer.c:9042 +msgid "_Overwrite" +msgstr "" + +#: ../src/viktrwlayer.c:8796 ../src/viktrwlayer.c:9045 +msgid "Overwrite any existing elevation values with DEM values" +msgstr "" + +#: ../src/viktrwlayer.c:8799 ../src/viktrwlayer.c:9048 +msgid "_Keep Existing" +msgstr "" + +#: ../src/viktrwlayer.c:8802 ../src/viktrwlayer.c:9051 +msgid "Keep existing elevation values, only attempt for missing values" +msgstr "" + +#: ../src/viktrwlayer.c:8807 +msgid "_Smooth Missing Elevation Data" +msgstr "" + +#: ../src/viktrwlayer.c:8812 +msgid "_Interpolated" +msgstr "" + +#: ../src/viktrwlayer.c:8815 +msgid "" +"Interpolate between known elevation values to derive values for the missing " +"elevations" +msgstr "" + +#: ../src/viktrwlayer.c:8818 +msgid "_Flat" +msgstr "" + +#: ../src/viktrwlayer.c:8821 +msgid "Set unknown elevation values to the last known value" +msgstr "" + +#: ../src/viktrwlayer.c:8825 +msgid "C_onvert to a Route" +msgstr "" + +#: ../src/viktrwlayer.c:8827 +msgid "C_onvert to a Track" +msgstr "" + +#: ../src/viktrwlayer.c:8835 +msgid "_Anonymize Times" +msgstr "" + +#: ../src/viktrwlayer.c:8838 +msgid "Shift timestamps to a relative offset from 1901-01-01" +msgstr "" + +#: ../src/viktrwlayer.c:8841 +msgid "_Interpolate Times" +msgstr "" + +#: ../src/viktrwlayer.c:8844 +msgid "" +"Reset trackpoint timestamps between the first and last points such that " +"track is traveled at equal speed" +msgstr "" + +#: ../src/viktrwlayer.c:8849 +msgid "_Reverse Track" +msgstr "" + +#: ../src/viktrwlayer.c:8851 +msgid "_Reverse Route" +msgstr "" + +#: ../src/viktrwlayer.c:8858 +msgid "Refine Route..." +msgstr "" + +#: ../src/viktrwlayer.c:8868 +msgid "Down_load Maps Along Track..." +msgstr "" + +#: ../src/viktrwlayer.c:8870 +msgid "Down_load Maps Along Route..." +msgstr "" + +#: ../src/viktrwlayer.c:8878 +msgid "_Export Track as GPX..." +msgstr "" + +#: ../src/viktrwlayer.c:8880 +msgid "_Export Route as GPX..." +msgstr "" + +#: ../src/viktrwlayer.c:8887 +msgid "E_xtend Track End" +msgstr "" + +#: ../src/viktrwlayer.c:8889 +msgid "E_xtend Route End" +msgstr "" + +#: ../src/viktrwlayer.c:8896 +msgid "Extend _Using Route Finder" +msgstr "" + +#: ../src/viktrwlayer.c:8911 +msgid "_Upload to GPS..." +msgstr "" + +#: ../src/viktrwlayer.c:8926 +msgid "_Diary" +msgstr "" + +#: ../src/viktrwlayer.c:8930 +msgid "Open diary program at this date" +msgstr "" + +#: ../src/viktrwlayer.c:8935 +msgid "_Astronomy" +msgstr "" + +#: ../src/viktrwlayer.c:8938 +msgid "Open astronomy program at this date and location" +msgstr "" + +#: ../src/viktrwlayer.c:8962 +msgid "_View Google Directions" +msgstr "" + +#: ../src/viktrwlayer.c:8984 +msgid "Use with _Filter" +msgstr "" + +#: ../src/viktrwlayer.c:9018 +msgid "_Edit Trackpoint" +msgstr "" + +#: ../src/viktrwlayer.c:10116 +#, c-format +msgid " - Gain %dm:Loss %dm" +msgstr "" + +#: ../src/viktrwlayer.c:10118 +#, c-format +msgid " - Gain %dft:Loss %dft" +msgstr "" + +#: ../src/viktrwlayer.c:10123 +#, c-format +msgid " - Bearing %3.1f° - Step %s" +msgstr "" + +#: ../src/viktrwlayer.c:10232 +#, c-format +msgid "Querying %s for route between (%.3f, %.3f) and (%.3f, %.3f)." +msgstr "" + +#: ../src/viktrwlayer.c:10248 +#, c-format +msgid "%s returned route between (%.3f, %.3f) and (%.3f, %.3f)." +msgstr "" + +#: ../src/viktrwlayer.c:10251 +#, c-format +msgid "Error getting route from %s." +msgstr "" + +#: ../src/viktrwlayer.c:11070 +#, c-format +msgid "Creating %d Image Thumbnails..." +msgstr "" + +#: ../src/viktrwlayer.c:11560 +msgid "No map layer in use. Create one first" +msgstr "" + +#: ../src/viktrwlayer.c:11679 +#, c-format +msgid "%s: Track List" +msgstr "" + +#: ../src/viktrwlayer.c:11681 +#, c-format +msgid "%s: Route List" +msgstr "" + +#: ../src/viktrwlayer.c:11734 +#, c-format +msgid "" +"Could not write external layer %s to %s, please fix and save before exiting " +"or data will be lost" +msgstr "" + +#: ../src/viktrwlayer.c:11782 +#, c-format +msgid "WARNING: issues encountered loading external layer %s from %s" +msgstr "" + +#: ../src/viktrwlayer_export.c:47 +msgid "Auto Device GPX Simplify:" +msgstr "" + +#: ../src/viktrwlayer_export.c:48 +msgid "" +"GPX saves to certain devices will be simplified for device compatibility." +msgstr "" + +#: ../src/viktrwlayer_export.c:125 +#, c-format +msgid "Export of GPX file simplified using point limit: %d" +msgstr "" + +#: ../src/viktrwlayer_export.c:206 ../src/viktrwlayer_export.c:323 +#: ../src/vikwindow.c:3694 +msgid "The filename you requested could not be opened for writing." +msgstr "" + +#: ../src/viktrwlayer_export.c:226 +#, c-format +msgid "Could not launch %s." +msgstr "" + +#: ../src/viktrwlayer_export.c:234 +msgid "Could not create temporary file for export." +msgstr "" + +#: ../src/viktrwlayer_export.c:268 +msgid "File format:" +msgstr "" + +#: ../src/viktrwlayer_export.c:276 +msgid "Select the file format." +msgstr "" + +#: ../src/viktrwlayer_export.c:281 +msgid "" +"Select the information to process.\n" +"Warning: the behavior of these switches is highly dependent of the file " +"format selected.\n" +"Please, refer to GPSbabel if unsure." +msgstr "" + +#: ../src/viktrwlayer_export.c:308 +msgid "You did not select a valid file format." +msgstr "" + +#: ../src/viktrwlayer_propwin.c:915 ../src/viktrwlayer_propwin.c:3381 +#: ../src/viktrwlayer_propwin.c:3417 ../src/viktrwlayer_propwin.c:3457 +#: ../src/viktrwlayer_propwin.c:3509 ../src/viktrwlayer_propwin.c:3527 +#: ../src/viktrwlayer_propwin.c:3600 ../src/viktrwlayer_propwin.c:3601 +#: ../src/viktrwlayer_propwin.c:3602 ../src/viktrwlayer_propwin.c:3611 +#: ../src/viktrwlayer_propwin.c:3612 ../src/viktrwlayer_propwin.c:3629 +#: ../src/viktrwlayer_propwin.c:3630 ../src/viktrwlayer_propwin.c:3644 +#: ../src/viktrwlayer_propwin.c:3645 ../src/viktrwlayer_propwin.c:3646 +#: ../src/viktrwlayer_propwin.c:3660 ../src/viktrwlayer_propwin.c:3661 +#: ../src/viktrwlayer_propwin.c:3662 ../src/viktrwlayer_propwin.c:3676 +#: ../src/viktrwlayer_propwin.c:3677 ../src/viktrwlayer_propwin.c:3678 +#: ../src/viktrwlayer_propwin.c:3695 ../src/viktrwlayer_propwin.c:3696 +#: ../src/viktrwlayer_analysis.c:293 +#, c-format +msgid "No Data" +msgstr "" + +#: ../src/viktrwlayer_propwin.c:960 ../src/viktrwlayer_propwin.c:1245 +#, c-format +msgid "%.1f kph" +msgstr "" + +#: ../src/viktrwlayer_propwin.c:963 ../src/viktrwlayer_propwin.c:1248 +#: ../src/viktrwlayer_analysis.c:352 +#, c-format +msgid "%.1f mph" +msgstr "" + +#: ../src/viktrwlayer_propwin.c:966 ../src/viktrwlayer_propwin.c:1251 +#, c-format +msgid "%.1f knots" +msgstr "" + +#: ../src/viktrwlayer_propwin.c:969 ../src/viktrwlayer_propwin.c:1254 +#, c-format +msgid "%.1f s/km" +msgstr "" + +#: ../src/viktrwlayer_propwin.c:972 ../src/viktrwlayer_propwin.c:1257 +#: ../src/viktrwlayer_analysis.c:389 ../src/viktrwlayer_analysis.c:392 +#, c-format +msgid "%.1f min/km" +msgstr "" + +#: ../src/viktrwlayer_propwin.c:975 ../src/viktrwlayer_propwin.c:1260 +#, c-format +msgid "%.1f sec/mi" +msgstr "" + +#: ../src/viktrwlayer_propwin.c:978 ../src/viktrwlayer_propwin.c:1263 +#: ../src/viktrwlayer_analysis.c:409 ../src/viktrwlayer_analysis.c:412 +#, c-format +msgid "%.1f min/mi" +msgstr "" + +#. VIK_UNITS_SPEED_METRES_PER_SECOND: +#: ../src/viktrwlayer_propwin.c:982 ../src/viktrwlayer_propwin.c:1267 +#, c-format +msgid "%.1f m/s" +msgstr "" + +#. Minutes +#: ../src/viktrwlayer_propwin.c:1411 +msgid "mins" +msgstr "" + +#. Hours +#: ../src/viktrwlayer_propwin.c:1418 +msgid "h" +msgstr "" + +#. Days +#: ../src/viktrwlayer_propwin.c:1424 +msgid "d" +msgstr "" + +#. Weeks +#: ../src/viktrwlayer_propwin.c:1429 +msgid "w" +msgstr "" + +#. 'Months' +#: ../src/viktrwlayer_propwin.c:1433 +msgid "M" +msgstr "" + +#: ../src/viktrwlayer_propwin.c:2051 ../src/viktrwlayer_analysis.c:303 +#, c-format +msgid "%.1f miles" +msgstr "" + +#: ../src/viktrwlayer_propwin.c:2054 ../src/viktrwlayer_analysis.c:306 +#, c-format +msgid "%.1f NM" +msgstr "" + +#. VIK_UNITS_DISTANCE_KILOMETRES +#: ../src/viktrwlayer_propwin.c:2057 ../src/viktrwlayer_analysis.c:310 +#, c-format +msgid "%.1f km" +msgstr "" + +#: ../src/viktrwlayer_propwin.c:3083 +msgid "Failed spliting track. Track unchanged" +msgstr "" + +#: ../src/viktrwlayer_propwin.c:3234 ../src/viktrwlayer_propwin.c:3744 +#, c-format +msgid "%s - Track Properties" +msgstr "" + +#: ../src/viktrwlayer_propwin.c:3239 +msgid "Split at _Marker" +msgstr "" + +#: ../src/viktrwlayer_propwin.c:3240 +msgid "Split _Segments" +msgstr "" + +#: ../src/viktrwlayer_propwin.c:3241 +msgid "_Reverse" +msgstr "" + +#: ../src/viktrwlayer_propwin.c:3242 +msgid "_Delete Dupl." +msgstr "" + +#: ../src/viktrwlayer_propwin.c:3269 +msgid "Comment:" +msgstr "" + +#: ../src/viktrwlayer_propwin.c:3270 +msgid "Description:" +msgstr "" + +#: ../src/viktrwlayer_propwin.c:3271 +msgid "Source:" +msgstr "" + +#: ../src/viktrwlayer_propwin.c:3272 +msgid "Type:" +msgstr "" + +#: ../src/viktrwlayer_propwin.c:3273 +msgid "Color:" +msgstr "" + +#: ../src/viktrwlayer_propwin.c:3274 +msgid "Draw Name:" +msgstr "" + +#: ../src/viktrwlayer_propwin.c:3275 +msgid "Distance Labels:" +msgstr "" + +#: ../src/viktrwlayer_propwin.c:3278 +msgid "Track Length:" +msgstr "" + +#: ../src/viktrwlayer_propwin.c:3279 +msgid "Trackpoints:" +msgstr "" + +#: ../src/viktrwlayer_propwin.c:3280 +msgid "Segments:" +msgstr "" + +#: ../src/viktrwlayer_propwin.c:3281 +msgid "Duplicate Points:" +msgstr "" + +#: ../src/viktrwlayer_propwin.c:3282 +msgid "Max Speed:" +msgstr "" + +#: ../src/viktrwlayer_propwin.c:3283 +msgid "Avg. Speed:" +msgstr "" + +#: ../src/viktrwlayer_propwin.c:3284 +msgid "Moving Avg. Speed:" +msgstr "" + +#: ../src/viktrwlayer_propwin.c:3285 +msgid "Avg. Dist. Between TPs:" +msgstr "" + +#: ../src/viktrwlayer_propwin.c:3286 +msgid "Elevation Range:" +msgstr "" + +#: ../src/viktrwlayer_propwin.c:3287 +msgid "Total Elevation Gain/Loss:" +msgstr "" + +#: ../src/viktrwlayer_propwin.c:3288 +msgid "Start:" +msgstr "" + +#: ../src/viktrwlayer_propwin.c:3289 +msgid "End:" +msgstr "" + +#: ../src/viktrwlayer_propwin.c:3290 +msgid "Duration:" +msgstr "" + +#: ../src/viktrwlayer_propwin.c:3320 +msgid "Centre" +msgstr "" + +#: ../src/viktrwlayer_propwin.c:3321 +msgid "Start only" +msgstr "" + +#: ../src/viktrwlayer_propwin.c:3322 +msgid "End only" +msgstr "" + +#: ../src/viktrwlayer_propwin.c:3323 +msgid "Start and End" +msgstr "" + +#: ../src/viktrwlayer_propwin.c:3324 +msgid "Centre, Start and End" +msgstr "" + +#: ../src/viktrwlayer_propwin.c:3336 +msgid "Maximum number of distance labels to be shown" +msgstr "" + +#: ../src/viktrwlayer_propwin.c:3340 +msgid "Properties" +msgstr "" + +#: ../src/viktrwlayer_propwin.c:3584 +#, c-format +msgid "%d minutes - %d minutes moving" +msgstr "" + +#: ../src/viktrwlayer_propwin.c:3596 +#, c-format +msgid "%s total - %s in segments" +msgstr "" + +#: ../src/viktrwlayer_propwin.c:3607 ../src/viktrwlayer_analysis.c:622 +msgid "Statistics" +msgstr "" + +#: ../src/viktrwlayer_propwin.c:3613 ../src/viktrwlayer_propwin.c:3680 +msgid "Show D_EM" +msgstr "" + +#: ../src/viktrwlayer_propwin.c:3615 ../src/viktrwlayer_propwin.c:3631 +#: ../src/viktrwlayer_propwin.c:3647 ../src/viktrwlayer_propwin.c:3697 +msgid "Show _GPS Speed" +msgstr "" + +#: ../src/viktrwlayer_propwin.c:3617 ../src/viktrwlayer_propwin.c:3633 +#: ../src/viktrwlayer_propwin.c:3665 ../src/viktrwlayer_propwin.c:3699 +msgid "Track Distance:" +msgstr "" + +#: ../src/viktrwlayer_propwin.c:3618 ../src/viktrwlayer_propwin.c:3684 +msgid "Track Height:" +msgstr "" + +#: ../src/viktrwlayer_propwin.c:3624 +msgid "Elevation-distance" +msgstr "" + +#: ../src/viktrwlayer_propwin.c:3634 +msgid "Track Gradient:" +msgstr "" + +#: ../src/viktrwlayer_propwin.c:3639 +msgid "Gradient-distance" +msgstr "" + +#: ../src/viktrwlayer_propwin.c:3649 ../src/viktrwlayer_propwin.c:3666 +#: ../src/viktrwlayer_propwin.c:3683 +msgid "Track Time:" +msgstr "" + +#: ../src/viktrwlayer_propwin.c:3650 ../src/viktrwlayer_propwin.c:3700 +msgid "Track Speed:" +msgstr "" + +#: ../src/viktrwlayer_propwin.c:3651 ../src/viktrwlayer_propwin.c:3667 +#: ../src/viktrwlayer_propwin.c:3685 +msgid "Time/Date:" +msgstr "" + +#: ../src/viktrwlayer_propwin.c:3655 +msgid "Speed-time" +msgstr "" + +#: ../src/viktrwlayer_propwin.c:3663 ../src/viktrwlayer_propwin.c:3679 +msgid "Show S_peed" +msgstr "" + +#: ../src/viktrwlayer_propwin.c:3671 +msgid "Distance-time" +msgstr "" + +#: ../src/viktrwlayer_propwin.c:3690 +msgid "Elevation-time" +msgstr "" + +#: ../src/viktrwlayer_propwin.c:3705 +msgid "Speed-distance" +msgstr "" + +#: ../src/viktrwlayer_tpwin.c:190 ../src/viktrwlayer_wpwin.c:66 +msgid "Date/Time Edit" +msgstr "" + +#: ../src/viktrwlayer_tpwin.c:242 +msgid "Name:" +msgstr "" + +#: ../src/viktrwlayer_tpwin.c:243 +msgid "Latitude:" +msgstr "" + +#: ../src/viktrwlayer_tpwin.c:244 +msgid "Longitude:" +msgstr "" + +#: ../src/viktrwlayer_tpwin.c:245 +msgid "Altitude:" +msgstr "" + +#: ../src/viktrwlayer_tpwin.c:246 +msgid "Course:" +msgstr "" + +#: ../src/viktrwlayer_tpwin.c:247 +msgid "Timestamp:" +msgstr "" + +#: ../src/viktrwlayer_tpwin.c:248 +msgid "Time:" +msgstr "" + +#: ../src/viktrwlayer_tpwin.c:249 +msgid "Distance Difference:" +msgstr "" + +#: ../src/viktrwlayer_tpwin.c:250 +msgid "Time Difference:" +msgstr "" + +#: ../src/viktrwlayer_tpwin.c:251 +msgid "\"Speed\" Between:" +msgstr "" + +#: ../src/viktrwlayer_tpwin.c:252 +msgid "Speed:" +msgstr "" + +#: ../src/viktrwlayer_tpwin.c:253 +msgid "VDOP:" +msgstr "" + +#: ../src/viktrwlayer_tpwin.c:254 +msgid "HDOP:" +msgstr "" + +#: ../src/viktrwlayer_tpwin.c:255 +msgid "PDOP:" +msgstr "" + +#: ../src/viktrwlayer_tpwin.c:256 +msgid "SAT/FIX:" +msgstr "" + +#: ../src/viktrwlayer_tpwin.c:263 ../src/viktrwlayer_tpwin.c:408 +#: ../src/viktrwlayer_tpwin.c:622 +msgid "Trackpoint" +msgstr "" + +#: ../src/viktrwlayer_tpwin.c:266 +msgid "_Insert After" +msgstr "" + +#: ../src/viktrwlayer_tpwin.c:268 +msgid "Split Here" +msgstr "" + +#: ../src/viktrwlayer_tracklist.c:262 ../src/viktrwlayer_waypointlist.c:306 +msgid "_Copy Data" +msgstr "" + +#. +#. item = gtk_image_menu_item_new_with_mnemonic ( _("_Select") ); +#. gtk_image_menu_item_set_image ( (GtkImageMenuItem*)item, gtk_image_new_from_stock (GTK_STOCK_FIND, GTK_ICON_SIZE_MENU) ); +#. g_signal_connect_swapped ( G_OBJECT(item), "activate", G_CALLBACK(trw_layer_track_select), values ); +#. gtk_menu_shell_append (GTK_MENU_SHELL (menu), item); +#. gtk_widget_show ( item ); +#. +#. ATM view auto selects, so don't bother with separate select menu entry +#. +#. item = gtk_image_menu_item_new_with_mnemonic ( _("_Select") ); +#. gtk_image_menu_item_set_image ( (GtkImageMenuItem*)item, gtk_image_new_from_stock (GTK_STOCK_FIND, GTK_ICON_SIZE_MENU) ); +#. g_signal_connect_swapped ( G_OBJECT(item), "activate", G_CALLBACK(trw_layer_waypoint_select), values ); +#. gtk_menu_shell_append (GTK_MENU_SHELL (menu), item); +#. gtk_widget_show ( item ); +#. +#. AUTO SELECT NOT TRUE YET... +#. ATM view auto selects, so don't bother with separate select menu entry +#: ../src/viktrwlayer_tracklist.c:290 ../src/viktrwlayer_waypointlist.c:341 +#: ../src/vikwindow.c:4816 +msgid "_View" +msgstr "" + +#. Insert column for the layer name when viewing multi layers +#: ../src/viktrwlayer_tracklist.c:613 ../src/viktrwlayer_waypointlist.c:609 +msgid "Layer" +msgstr "" + +#: ../src/viktrwlayer_tracklist.c:627 ../src/viktrwlayer_waypointlist.c:624 +msgid "Date" +msgstr "" + +#: ../src/viktrwlayer_tracklist.c:631 ../src/viktrwlayer_waypointlist.c:628 +msgid "Visible" +msgstr "" + +#: ../src/viktrwlayer_tracklist.c:639 +msgid "" +"Distance\n" +"(miles)" +msgstr "" + +#: ../src/viktrwlayer_tracklist.c:642 +msgid "" +"Distance\n" +"(NM)" +msgstr "" + +#: ../src/viktrwlayer_tracklist.c:645 +msgid "" +"Distance\n" +"(km)" +msgstr "" + +#: ../src/viktrwlayer_tracklist.c:651 +msgid "" +"Length\n" +"(minutes)" +msgstr "" + +#: ../src/viktrwlayer_tracklist.c:660 ../src/vikutils.c:93 +msgid "sec/mi" +msgstr "" + +#: ../src/viktrwlayer_tracklist.c:666 +#, c-format +msgid "" +"Av. Speed\n" +"(%s)" +msgstr "" + +#. Apply own formatting of the data +#: ../src/viktrwlayer_tracklist.c:671 +#, c-format +msgid "" +"Max Speed\n" +"(%s)" +msgstr "" + +#: ../src/viktrwlayer_tracklist.c:679 ../src/viktrwlayer_waypointlist.c:637 +msgid "" +"Max Height\n" +"(Feet)" +msgstr "" + +#: ../src/viktrwlayer_tracklist.c:681 ../src/viktrwlayer_waypointlist.c:639 +msgid "" +"Max Height\n" +"(Metres)" +msgstr "" + +#: ../src/viktrwlayer_waypointlist.c:312 +msgid "Copy Data (with _positions)" +msgstr "" + +#: ../src/viktrwlayer_waypointlist.c:633 +msgid "Comment" +msgstr "" + +#: ../src/viktrwlayer_waypointlist.c:643 +msgid "Symbol" +msgstr "" + +#: ../src/viktrwlayer_wpwin.c:93 ../src/viktrwlayer_wpwin.c:302 +msgid "True" +msgstr "" + +#: ../src/viktrwlayer_wpwin.c:122 +msgid "Waypoint Properties" +msgstr "" + +#: ../src/viktrwlayer_wpwin.c:164 +msgid "Name:" +msgstr "" + +#: ../src/viktrwlayer_wpwin.c:181 +msgid "Altitude:" +msgstr "" + +#: ../src/viktrwlayer_wpwin.c:186 ../src/viktrwlayer_wpwin.c:188 +msgid "Comment:" +msgstr "" + +#: ../src/viktrwlayer_wpwin.c:202 +msgid "Source:" +msgstr "" + +#: ../src/viktrwlayer_wpwin.c:212 +msgid "Image:" +msgstr "" + +#: ../src/viktrwlayer_wpwin.c:217 +msgid "Symbol:" +msgstr "" + +#: ../src/viktrwlayer_wpwin.c:226 +msgid "(none)" +msgstr "" + +#. Geotag Info [readonly] +#: ../src/viktrwlayer_wpwin.c:272 +msgid "Has Geotag" +msgstr "" + +#: ../src/viktrwlayer_wpwin.c:279 +msgid "Consistent Position" +msgstr "" + +#. ATM the direction value box is always shown, even when there is no information. +#. It would be nice to be able to hide it until the 'Add' has been performed, +#. however I've not been able to achieve this. +#. Thus simply sensistizing it instead. +#: ../src/viktrwlayer_wpwin.c:292 +msgid "Image Direction:" +msgstr "" + +#: ../src/viktrwlayer_wpwin.c:300 +msgid "Magnetic" +msgstr "" + +#: ../src/viktrwlayer_wpwin.c:320 +msgid "Time:" +msgstr "" + +#. TODO: other checks (isalpha or whatever ) +#: ../src/viktrwlayer_wpwin.c:386 +msgid "Please enter a name for the waypoint." +msgstr "" + +#: ../src/viktrwlayer_geotag.c:320 ../src/viktrwlayer_geotag.c:460 +#, c-format +msgid "Failed updating EXIF on %s" +msgstr "" + +#: ../src/viktrwlayer_geotag.c:562 +#, c-format +msgid "Geotagging %d Images..." +msgstr "" + +#: ../src/viktrwlayer_geotag.c:630 +msgid "Geotag Images" +msgstr "" + +#: ../src/viktrwlayer_geotag.c:640 +msgid "Images" +msgstr "" + +#: ../src/viktrwlayer_geotag.c:645 +msgid "Overwrite Existing Waypoints:" +msgstr "" + +#: ../src/viktrwlayer_geotag.c:648 +msgid "Overwrite Existing GPS Information:" +msgstr "" + +#: ../src/viktrwlayer_geotag.c:650 +msgid "Keep File Modification Timestamp:" +msgstr "" + +#: ../src/viktrwlayer_geotag.c:684 +msgid "Create Waypoints:" +msgstr "" + +#: ../src/viktrwlayer_geotag.c:693 +msgid "Write EXIF:" +msgstr "" + +#: ../src/viktrwlayer_geotag.c:705 +msgid "Automatic Image Direction:" +msgstr "" + +#: ../src/viktrwlayer_geotag.c:707 +msgid "Set image direction based on a heading derived from the track" +msgstr "" + +#: ../src/viktrwlayer_geotag.c:710 +msgid "Interpolate Between Track Segments:" +msgstr "" + +#: ../src/viktrwlayer_geotag.c:715 +msgid "Image Time Offset (Seconds):" +msgstr "" + +#: ../src/viktrwlayer_geotag.c:718 +msgid "" +"The number of seconds to ADD to the photos time to make it match the GPS " +"data. Calculate this with (GPS - Photo). Can be negative or positive. Useful " +"to adjust times when a camera's timestamp was incorrect." +msgstr "" + +#: ../src/viktrwlayer_geotag.c:721 +msgid "Image Timezone:" +msgstr "" + +#: ../src/viktrwlayer_geotag.c:724 +msgid "" +"The timezone that was used when the images were created. For example, if a " +"camera is set to AWST or +8:00 hours. Enter +8:00 here so that the correct " +"adjustment to the images' time can be made. GPS data is always in UTC." +msgstr "" + +#: ../src/viktrwlayer_geotag.c:728 +#, c-format +msgid "Using waypoint: %s" +msgstr "" + +#: ../src/viktrwlayer_geotag.c:742 +#, c-format +msgid "Using track: %s" +msgstr "" + +#: ../src/viktrwlayer_geotag.c:744 +#, c-format +msgid "Using all tracks in: %s" +msgstr "" + +#: ../src/viktrwlayer_analysis.c:214 +msgid "Number of Tracks" +msgstr "" + +#: ../src/viktrwlayer_analysis.c:215 +msgid "Date Range" +msgstr "" + +#: ../src/viktrwlayer_analysis.c:216 +msgid "Total Length" +msgstr "" + +#: ../src/viktrwlayer_analysis.c:217 +msgid "Average Length" +msgstr "" + +#: ../src/viktrwlayer_analysis.c:218 +msgid "Eddington number" +msgstr "" + +#. No.4: Extended display only +#: ../src/viktrwlayer_analysis.c:219 +msgid "Max Speed" +msgstr "" + +#: ../src/viktrwlayer_analysis.c:220 +msgid "Avg. Speed" +msgstr "" + +#: ../src/viktrwlayer_analysis.c:221 +msgid "Minimum Altitude" +msgstr "" + +#: ../src/viktrwlayer_analysis.c:222 +msgid "Maximum Altitude" +msgstr "" + +#: ../src/viktrwlayer_analysis.c:223 +msgid "Total Elevation Gain/Loss" +msgstr "" + +#: ../src/viktrwlayer_analysis.c:224 +msgid "Avg. Elevation Gain/Loss" +msgstr "" + +#: ../src/viktrwlayer_analysis.c:225 +msgid "Total Duration" +msgstr "" + +#: ../src/viktrwlayer_analysis.c:226 +msgid "Avg. Duration" +msgstr "" + +#: ../src/viktrwlayer_analysis.c:317 +#, c-format +msgid "%.2f miles" +msgstr "" + +#: ../src/viktrwlayer_analysis.c:320 +#, c-format +msgid "%.2f NM" +msgstr "" + +#. VIK_UNITS_DISTANCE_KILOMETRES +#: ../src/viktrwlayer_analysis.c:324 +#, c-format +msgid "%.2f km" +msgstr "" + +#: ../src/viktrwlayer_analysis.c:361 +#, c-format +msgid "%.2f m/s" +msgstr "" + +#: ../src/viktrwlayer_analysis.c:370 ../src/viktrwlayer_analysis.c:373 +#, c-format +msgid "%.2f knots" +msgstr "" + +#: ../src/viktrwlayer_analysis.c:379 ../src/viktrwlayer_analysis.c:382 +#, c-format +msgid "%d s/km" +msgstr "" + +#: ../src/viktrwlayer_analysis.c:399 ../src/viktrwlayer_analysis.c:402 +#, c-format +msgid "%d sec/mi" +msgstr "" + +#: ../src/viktrwlayer_analysis.c:420 ../src/viktrwlayer_analysis.c:423 +#, c-format +msgid "%.2f km/h" +msgstr "" + +#: ../src/viktrwlayer_analysis.c:434 ../src/viktrwlayer_analysis.c:440 +#, c-format +msgid "%d feet" +msgstr "" + +#: ../src/viktrwlayer_analysis.c:445 ../src/viktrwlayer_analysis.c:447 +#, c-format +msgid "%d feet / %d feet" +msgstr "" + +#: ../src/viktrwlayer_analysis.c:452 ../src/viktrwlayer_analysis.c:458 +#, c-format +msgid "%d m" +msgstr "" + +#: ../src/viktrwlayer_analysis.c:463 ../src/viktrwlayer_analysis.c:465 +#, c-format +msgid "%d m / %d m" +msgstr "" + +#: ../src/viktrwlayer_analysis.c:477 +#, c-format +msgid "%d:%02d:%02d days:hrs:mins" +msgstr "" + +#: ../src/viktrwlayer_analysis.c:484 +#, c-format +msgid "%d:%02d hrs:mins" +msgstr "" + +#: ../src/viktrwlayer_analysis.c:658 +msgid "Include Invisible Items" +msgstr "" + +#: ../src/vikstatus.c:129 +msgid "Current number of background tasks. Click to see the background jobs." +msgstr "" + +#: ../src/vikstatus.c:134 +msgid "Current zoom level. Click to select a new one." +msgstr "" + +#: ../src/vikstatus.c:141 +msgid "Left click to clear the message. Right click to copy the message." +msgstr "" + +#: ../src/vikutils.c:108 +msgid "GPSD" +msgstr "" + +#. GPS Preamble +#: ../src/vikutils.c:109 +msgid "Trkpt" +msgstr "" + +#: ../src/vikutils.c:160 +#, c-format +msgid "%sSpeed%s %.1f%s" +msgstr "" + +#. Go for 2dp as expect low values for vertical speeds +#: ../src/vikutils.c:214 +#, c-format +msgid "%sClimb%s %.2f%s" +msgstr "" + +#: ../src/vikutils.c:223 +#, c-format +msgid "%sAlt %dfeet" +msgstr "" + +#. VIK_UNITS_HEIGHT_METRES: +#: ../src/vikutils.c:227 +#, c-format +msgid "%sAlt %dm" +msgstr "" + +#: ../src/vikutils.c:235 +#, c-format +msgid "%sCourse %03d°" +msgstr "" + +#: ../src/vikutils.c:249 +msgid "yards" +msgstr "" + +#. VIK_UNITS_DISTANCE_KILOMETRES: +#: ../src/vikutils.c:253 +msgid "m" +msgstr "" + +#: ../src/vikutils.c:257 +#, c-format +msgid "%sDistance diff %d%s" +msgstr "" + +#: ../src/vikutils.c:272 +#, c-format +msgid "%sTime %s" +msgstr "" + +#: ../src/vikutils.c:281 +#, c-format +msgid "%sTime diff %lds" +msgstr "" + +#: ../src/vikutils.c:287 +#, c-format +msgid "%sNo. of Sats %d" +msgstr "" + +#: ../src/vikutils.c:312 +#, c-format +msgid "%sTo End %.2f%s" +msgstr "" + +#: ../src/vikutils.c:339 +#, c-format +msgid "%sDistance along %.2f%s" +msgstr "" + +#: ../src/vikutils.c:359 +#, c-format +msgid "%sTrack: %s" +msgstr "" + +#: ../src/vikutils.c:396 +#, c-format +msgid "" +"There is a newer version of Viking available: %s\n" +"\n" +"Do you wish to go to Viking's website now?" +msgstr "" + +#: ../src/vikutils.c:526 +msgid "" +"This appears to be Viking's very first run.\n" +"\n" +"Do you wish to enable automatic internet features?\n" +"\n" +"Individual settings can be controlled in the Preferences." +msgstr "" + +#: ../src/vikwaypoint.c:37 +msgid "Waypoint" +msgstr "" + +#: ../src/vikwebtool_datasource.c:352 +msgid "Search Term" +msgstr "" + +#. TODO get rid of this as this is unnecessary duplication... +#: ../src/vikwindow.c:258 +msgid "Pan" +msgstr "" + +#: ../src/vikwindow.c:258 +msgid "Zoom" +msgstr "" + +#: ../src/vikwindow.c:258 +msgid "Ruler" +msgstr "" + +#: ../src/vikwindow.c:258 +msgid "Select" +msgstr "" + +#: ../src/vikwindow.c:368 +msgid "This is Viking " +msgstr "" + +#: ../src/vikwindow.c:457 +msgid "Location lookup aborted" +msgstr "" + +#: ../src/vikwindow.c:477 +#, c-format +msgid "Location found: %s" +msgstr "" + +#: ../src/vikwindow.c:486 +msgid "Unable to determine location" +msgstr "" + +#: ../src/vikwindow.c:495 +msgid "Determining location" +msgstr "" + +#: ../src/vikwindow.c:525 +#, c-format +msgid "Location found via geoclue" +msgstr "" + +#: ../src/vikwindow.c:546 +msgid "Default Map" +msgstr "" + +#: ../src/vikwindow.c:557 ../src/vikwindow.c:3938 +msgid "Trying to determine location..." +msgstr "" + +#. Create tooltip +#: ../src/vikwindow.c:723 +msgid "Select zoom level" +msgstr "" + +#: ../src/vikwindow.c:1176 +#, c-format +msgid "" +"Do you want to save the changes you made to the document \"%s\"?\n" +"\n" +"Your changes will be lost if you don't save them." +msgstr "" + +#: ../src/vikwindow.c:1180 +msgid "Don't Save" +msgstr "" + +#: ../src/vikwindow.c:1268 +msgid "mpp" +msgstr "" + +#: ../src/vikwindow.c:1268 +msgid "pixelfact" +msgstr "" + +#: ../src/vikwindow.c:1467 +#, c-format +msgid "%s %s %dm" +msgstr "" + +#: ../src/vikwindow.c:1469 +#, c-format +msgid "%s %s %dft" +msgstr "" + +#: ../src/vikwindow.c:1472 +#, c-format +msgid "%s %s" +msgstr "" + +#: ../src/vikwindow.c:1929 +msgid "_Ruler" +msgstr "" + +#: ../src/vikwindow.c:1929 +msgid "Ruler Tool" +msgstr "" + +#: ../src/vikwindow.c:2204 ../src/vikwindow.c:4818 +msgid "_Zoom" +msgstr "" + +#: ../src/vikwindow.c:2204 +msgid "Zoom Tool" +msgstr "" + +#: ../src/vikwindow.c:2271 ../src/vikwindow.c:4819 +msgid "_Pan" +msgstr "" + +#: ../src/vikwindow.c:2271 +msgid "Pan Tool" +msgstr "" + +#: ../src/vikwindow.c:2425 +msgid "_Select" +msgstr "" + +#: ../src/vikwindow.c:2425 +msgid "Select Tool" +msgstr "" + +#: ../src/vikwindow.c:2615 +msgid "You must select a layer to show its properties." +msgstr "" + +#. No error to show, so unlikely this will get called +#: ../src/vikwindow.c:2629 +msgid "The help system is not available." +msgstr "" + +#. Main error path +#: ../src/vikwindow.c:2632 +#, c-format +msgid "" +"Help is not available because: %s.\n" +"Ensure a Mime Type ghelp handler program is installed (e.g. yelp)." +msgstr "" + +#: ../src/vikwindow.c:2865 +msgid "You must select a layer to delete." +msgstr "" + +#: ../src/vikwindow.c:3171 +msgid "Untitled" +msgstr "" + +#: ../src/vikwindow.c:3300 +#, c-format +msgid "Unable to add '%s' to the list of recently used documents" +msgstr "" + +#: ../src/vikwindow.c:3391 +msgid "The file you requested could not be opened." +msgstr "" + +#: ../src/vikwindow.c:3394 +msgid "" +"GPSBabel is required to load files of this type or GPSBabel encountered " +"problems." +msgstr "" + +#: ../src/vikwindow.c:3397 +#, c-format +msgid "Unable to load malformed GPX file %s" +msgstr "" + +#: ../src/vikwindow.c:3400 +#, c-format +msgid "Unsupported file type for %s" +msgstr "" + +#. Since we can process .vik files with issues just show a warning in the status bar +#. Not that a user can do much about it... or tells them what this issue is yet... +#: ../src/vikwindow.c:3406 +#, c-format +msgid "WARNING: issues encountered loading %s" +msgstr "" + +#: ../src/vikwindow.c:3489 +msgid "Please select a GPS data file to open. " +msgstr "" + +#: ../src/vikwindow.c:3508 +msgid "Google Earth" +msgstr "" + +#: ../src/vikwindow.c:3523 ../src/vikwindow.c:3646 ../src/viking.desktop.in.h:1 +msgid "Viking" +msgstr "" + +#: ../src/vikwindow.c:3594 ../src/vikwindow.c:4632 +msgid "Open File" +msgstr "" + +#: ../src/vikwindow.c:3630 +msgid "Save as Viking File." +msgstr "" + +#: ../src/vikwindow.c:3757 +#, c-format +msgid "Exporting to file: %s" +msgstr "" + +#. Confirm what happened. +#: ../src/vikwindow.c:3774 +#, c-format +msgid "Exported files: %d" +msgstr "" + +#: ../src/vikwindow.c:3786 +msgid "Nothing to Export!" +msgstr "" + +#: ../src/vikwindow.c:3790 +msgid "Export to directory" +msgstr "" + +#: ../src/vikwindow.c:3809 +msgid "Could not convert all files" +msgstr "" + +#: ../src/vikwindow.c:3851 +msgid "File not accessible" +msgstr "" + +#: ../src/vikwindow.c:3854 +msgid "No Viking File" +msgstr "" + +#: ../src/vikwindow.c:3998 +msgid "This layer has no configurable properties." +msgstr "" + +#: ../src/vikwindow.c:4080 +msgid "Are you sure you wish to delete all layers?" +msgstr "" + +#. Try harder... +#: ../src/vikwindow.c:4126 ../src/vikwindow.c:4132 +msgid "Generating image file..." +msgstr "" + +#: ../src/vikwindow.c:4154 +msgid "" +"Failed to generate internal image.\n" +"\n" +"Try creating a smaller image." +msgstr "" + +#: ../src/vikwindow.c:4175 +msgid "Image file generated." +msgstr "" + +#: ../src/vikwindow.c:4177 +msgid "Failed to generate image file." +msgstr "" + +#: ../src/vikwindow.c:4246 +#, c-format +msgid "Unable to write to file %s: %s" +msgstr "" + +#: ../src/vikwindow.c:4284 +msgid "" +"Viewable region outside allowable pixel size bounds for image. Clipping " +"width/height values." +msgstr "" + +#: ../src/vikwindow.c:4309 +#, c-format +msgid "Total area: %ldm x %ldm (%.3f sq. km)" +msgstr "" + +#: ../src/vikwindow.c:4312 +#, c-format +msgid "Total area: %ldm x %ldm (%.3f sq. miles)" +msgstr "" + +#: ../src/vikwindow.c:4315 +#, c-format +msgid "Total area: %ldm x %ldm (%.3f sq. NM)" +msgstr "" + +#. Single file +#: ../src/vikwindow.c:4343 +msgid "Save Image" +msgstr "" + +#: ../src/vikwindow.c:4364 ../src/vikwindow.c:4641 +msgid "KMZ" +msgstr "" + +#: ../src/vikwindow.c:4417 +msgid "You must be in UTM mode to use this feature" +msgstr "" + +#: ../src/vikwindow.c:4421 +msgid "Choose a directory to hold images" +msgstr "" + +#. todo: default for answers inside VikWindow or static (thruout instance) +#: ../src/vikwindow.c:4441 +msgid "Save to Image File" +msgstr "" + +#: ../src/vikwindow.c:4457 +msgid "Width (pixels):" +msgstr "" + +#: ../src/vikwindow.c:4459 +msgid "Height (pixels):" +msgstr "" + +#: ../src/vikwindow.c:4462 +msgid "" +"WARNING: USING LARGE IMAGES OVER 10000x10000\n" +"MAY CRASH THE PROGRAM!" +msgstr "" + +#: ../src/vikwindow.c:4464 +msgid "Zoom (meters per pixel):" +msgstr "" + +#: ../src/vikwindow.c:4480 +msgid "Area in current viewable window" +msgstr "" + +#: ../src/vikwindow.c:4490 +msgid "Save as PNG" +msgstr "" + +#: ../src/vikwindow.c:4491 +msgid "Save as JPEG" +msgstr "" + +#: ../src/vikwindow.c:4520 +msgid "East-west image tiles:" +msgstr "" + +#: ../src/vikwindow.c:4522 +msgid "North-south image tiles:" +msgstr "" + +#: ../src/vikwindow.c:4619 +msgid "This feature is not available in UTM mode" +msgstr "" + +#: ../src/vikwindow.c:4658 +#, c-format +msgid "Unable to import %s." +msgstr "" + +#: ../src/vikwindow.c:4749 +msgid "Choose a background color" +msgstr "" + +#: ../src/vikwindow.c:4765 +msgid "Choose a track highlight color" +msgstr "" + +#: ../src/vikwindow.c:4814 +msgid "_File" +msgstr "" + +#: ../src/vikwindow.c:4815 +msgid "_Edit" +msgstr "" + +#: ../src/vikwindow.c:4817 +msgid "_Show" +msgstr "" + +#: ../src/vikwindow.c:4820 +msgid "_Layers" +msgstr "" + +#: ../src/vikwindow.c:4821 +msgid "_Tools" +msgstr "" + +#: ../src/vikwindow.c:4822 +msgid "_Webtools" +msgstr "" + +#: ../src/vikwindow.c:4823 ../src/vikwindow.c:4893 +msgid "_Help" +msgstr "" + +#: ../src/vikwindow.c:4825 +msgid "New file" +msgstr "" + +#: ../src/vikwindow.c:4826 +msgid "_Open..." +msgstr "" + +#: ../src/vikwindow.c:4826 +msgid "Open a file" +msgstr "" + +#: ../src/vikwindow.c:4827 +msgid "Open _Recent File" +msgstr "" + +#: ../src/vikwindow.c:4828 +msgid "Append _File..." +msgstr "" + +#: ../src/vikwindow.c:4828 +msgid "Append data from a different file" +msgstr "" + +#: ../src/vikwindow.c:4829 +msgid "Open GPX as External _Layer..." +msgstr "" + +#: ../src/vikwindow.c:4829 +msgid "Open a GPX file as an external layer" +msgstr "" + +#: ../src/vikwindow.c:4830 +msgid "_Export All" +msgstr "" + +#: ../src/vikwindow.c:4830 +msgid "Export All TrackWaypoint Layers" +msgstr "" + +#: ../src/vikwindow.c:4831 +msgid "_GPX..." +msgstr "" + +#: ../src/vikwindow.c:4831 +msgid "Export as GPX" +msgstr "" + +#: ../src/vikwindow.c:4832 +msgid "A_cquire" +msgstr "" + +#: ../src/vikwindow.c:4833 +msgid "_Directions..." +msgstr "" + +#: ../src/vikwindow.c:4833 +msgid "Get driving directions" +msgstr "" + +#: ../src/vikwindow.c:4835 +msgid "_OSM Traces..." +msgstr "" + +#: ../src/vikwindow.c:4835 +msgid "Get traces from OpenStreetMap" +msgstr "" + +#: ../src/vikwindow.c:4836 +msgid "_My OSM Traces..." +msgstr "" + +#: ../src/vikwindow.c:4836 +msgid "Get Your Own Traces from OpenStreetMap" +msgstr "" + +#: ../src/vikwindow.c:4839 +msgid "Geo_caches..." +msgstr "" + +#: ../src/vikwindow.c:4839 +msgid "Get Geocaches from geocaching.com" +msgstr "" + +#: ../src/vikwindow.c:4842 +msgid "Create waypoints from geotagged images" +msgstr "" + +#: ../src/vikwindow.c:4844 +msgid "Get a file from a URL" +msgstr "" + +#: ../src/vikwindow.c:4846 +msgid "Create waypoints from Wikipedia items in the current view" +msgstr "" + +#: ../src/vikwindow.c:4848 +msgid "_Save" +msgstr "" + +#: ../src/vikwindow.c:4848 +msgid "Save the file" +msgstr "" + +#: ../src/vikwindow.c:4849 +msgid "Save _As..." +msgstr "" + +#: ../src/vikwindow.c:4849 +msgid "Save the file under different name" +msgstr "" + +#: ../src/vikwindow.c:4850 +msgid "Properties..." +msgstr "" + +#: ../src/vikwindow.c:4850 +msgid "File Properties" +msgstr "" + +#: ../src/vikwindow.c:4852 +msgid "Import KMZ _Map File..." +msgstr "" + +#: ../src/vikwindow.c:4852 +msgid "Import a KMZ file" +msgstr "" + +#: ../src/vikwindow.c:4853 +msgid "Generate _KMZ Map File..." +msgstr "" + +#: ../src/vikwindow.c:4853 +msgid "Generate a KMZ file with an overlay of the current view" +msgstr "" + +#: ../src/vikwindow.c:4855 +msgid "_Generate Image File..." +msgstr "" + +#: ../src/vikwindow.c:4855 +msgid "Save a snapshot of the workspace into a file" +msgstr "" + +#: ../src/vikwindow.c:4856 +msgid "Generate _Directory of Images..." +msgstr "" + +#: ../src/vikwindow.c:4856 +msgid "Generate _Directory of Images" +msgstr "" + +#: ../src/vikwindow.c:4857 +msgid "_Print..." +msgstr "" + +#: ../src/vikwindow.c:4857 +msgid "Print maps" +msgstr "" + +#: ../src/vikwindow.c:4858 +msgid "E_xit" +msgstr "" + +#: ../src/vikwindow.c:4858 +msgid "Exit the program" +msgstr "" + +#: ../src/vikwindow.c:4859 +msgid "Save and Exit" +msgstr "" + +#: ../src/vikwindow.c:4859 +msgid "Save and Exit the program" +msgstr "" + +#: ../src/vikwindow.c:4861 +msgid "Go to the Pre_vious Location" +msgstr "" + +#: ../src/vikwindow.c:4861 +msgid "Go to the previous location" +msgstr "" + +#: ../src/vikwindow.c:4862 +msgid "Go to the _Next Location" +msgstr "" + +#: ../src/vikwindow.c:4862 +msgid "Go to the next location" +msgstr "" + +#: ../src/vikwindow.c:4863 +msgid "Go to the _Default Location" +msgstr "" + +#: ../src/vikwindow.c:4863 +msgid "Go to the default location" +msgstr "" + +#: ../src/vikwindow.c:4864 +msgid "Go to the _Auto Location" +msgstr "" + +#: ../src/vikwindow.c:4864 +msgid "Go to a location via automatic lookup" +msgstr "" + +#: ../src/vikwindow.c:4865 +msgid "Go to _Location..." +msgstr "" + +#: ../src/vikwindow.c:4865 +msgid "Go to address/place using text search" +msgstr "" + +#: ../src/vikwindow.c:4866 +msgid "_Go to Lat/Lon..." +msgstr "" + +#: ../src/vikwindow.c:4866 +msgid "Go to arbitrary lat/lon coordinate" +msgstr "" + +#: ../src/vikwindow.c:4867 +msgid "Go to UTM..." +msgstr "" + +#: ../src/vikwindow.c:4867 +msgid "Go to arbitrary UTM coordinate" +msgstr "" + +#: ../src/vikwindow.c:4868 +msgid "Go to Today" +msgstr "" + +#: ../src/vikwindow.c:4868 +msgid "Go to today on the calendar" +msgstr "" + +#: ../src/vikwindow.c:4869 +msgid "_Refresh" +msgstr "" + +#: ../src/vikwindow.c:4869 +msgid "Refresh any maps displayed" +msgstr "" + +#: ../src/vikwindow.c:4870 +msgid "Set _Highlight Color..." +msgstr "" + +#: ../src/vikwindow.c:4870 +msgid "Set Highlight Color" +msgstr "" + +#: ../src/vikwindow.c:4871 +msgid "Set Bac_kground Color..." +msgstr "" + +#: ../src/vikwindow.c:4871 +msgid "Set Background Color" +msgstr "" + +#: ../src/vikwindow.c:4872 +msgid "Zoom _In" +msgstr "" + +#: ../src/vikwindow.c:4872 +msgid "Zoom In" +msgstr "" + +#: ../src/vikwindow.c:4873 +msgid "Zoom _Out" +msgstr "" + +#: ../src/vikwindow.c:4873 +msgid "Zoom Out" +msgstr "" + +#: ../src/vikwindow.c:4874 +msgid "Zoom _To..." +msgstr "" + +#: ../src/vikwindow.c:4874 +msgid "Zoom To" +msgstr "" + +#: ../src/vikwindow.c:4875 +msgid "Pan _North" +msgstr "" + +#: ../src/vikwindow.c:4876 +msgid "Pan _East" +msgstr "" + +#: ../src/vikwindow.c:4877 +msgid "Pan _South" +msgstr "" + +#: ../src/vikwindow.c:4878 +msgid "Pan _West" +msgstr "" + +#: ../src/vikwindow.c:4879 +msgid "Background _Jobs" +msgstr "" + +#: ../src/vikwindow.c:4879 +msgid "Background Jobs" +msgstr "" + +#: ../src/vikwindow.c:4881 +msgid "Cu_t" +msgstr "" + +#: ../src/vikwindow.c:4885 +msgid "Delete All" +msgstr "" + +#: ../src/vikwindow.c:4886 +msgid "Copy Centre _Location" +msgstr "" + +#: ../src/vikwindow.c:4887 +msgid "_Flush Map Cache" +msgstr "" + +#: ../src/vikwindow.c:4888 +msgid "_Set the Default Location" +msgstr "" + +#: ../src/vikwindow.c:4888 +msgid "Set the Default Location to the current position" +msgstr "" + +#: ../src/vikwindow.c:4889 +msgid "_Preferences" +msgstr "" + +#: ../src/vikwindow.c:4889 +msgid "Program Preferences" +msgstr "" + +#: ../src/vikwindow.c:4890 +msgid "_Layer Defaults" +msgstr "" + +#: ../src/vikwindow.c:4891 +msgid "_Properties" +msgstr "" + +#: ../src/vikwindow.c:4893 +msgid "Help" +msgstr "" + +#: ../src/vikwindow.c:4894 +msgid "_About" +msgstr "" + +#: ../src/vikwindow.c:4894 +msgid "About" +msgstr "" + +#: ../src/vikwindow.c:4903 +msgid "_KML..." +msgstr "" + +#: ../src/vikwindow.c:4903 +msgid "Export as KML" +msgstr "" + +#: ../src/vikwindow.c:4904 +msgid "Transfer data from a GPS device" +msgstr "" + +#: ../src/vikwindow.c:4905 +msgid "Import file via GPSBabel converter" +msgstr "" + +#: ../src/vikwindow.c:4909 +msgid "Import Geo_JSON File..." +msgstr "" + +#: ../src/vikwindow.c:4909 +msgid "Import GeoJSON file" +msgstr "" + +#: ../src/vikwindow.c:4914 +msgid "_UTM Mode" +msgstr "" + +#: ../src/vikwindow.c:4915 +msgid "_Expedia Mode" +msgstr "" + +#: ../src/vikwindow.c:4916 +msgid "_Mercator Mode" +msgstr "" + +#: ../src/vikwindow.c:4917 +msgid "Lat_/Lon Mode" +msgstr "" + +#: ../src/vikwindow.c:4921 +msgid "Show _Scale" +msgstr "" + +#: ../src/vikwindow.c:4921 +msgid "Show Scale" +msgstr "" + +#: ../src/vikwindow.c:4922 +msgid "Show _Center Mark" +msgstr "" + +#: ../src/vikwindow.c:4922 +msgid "Show Center Mark" +msgstr "" + +#: ../src/vikwindow.c:4923 +msgid "Show _Highlight" +msgstr "" + +#: ../src/vikwindow.c:4923 +msgid "Show Highlight" +msgstr "" + +#: ../src/vikwindow.c:4924 +msgid "_Full Screen" +msgstr "" + +#: ../src/vikwindow.c:4924 +msgid "Activate full screen mode" +msgstr "" + +#: ../src/vikwindow.c:4925 +msgid "Show Side _Panel" +msgstr "" + +#: ../src/vikwindow.c:4925 +msgid "Show Side Panel" +msgstr "" + +#: ../src/vikwindow.c:4926 +msgid "Show Status_bar" +msgstr "" + +#: ../src/vikwindow.c:4926 +msgid "Show Statusbar" +msgstr "" + +#: ../src/vikwindow.c:4927 +msgid "Show _Toolbar" +msgstr "" + +#: ../src/vikwindow.c:4927 +msgid "Show Toolbar" +msgstr "" + +#: ../src/vikwindow.c:4928 +msgid "Show _Menu" +msgstr "" + +#: ../src/vikwindow.c:4928 +msgid "Show Menu" +msgstr "" + +#: ../src/vikwindow.c:4929 +msgid "Show Side Panel B_uttons" +msgstr "" + +#: ../src/vikwindow.c:4929 +msgid "Show Side Panel Buttons" +msgstr "" + +#: ../src/vikwindow.c:4930 +msgid "Show Side Panel Ca_lendar" +msgstr "" + +#: ../src/vikwindow.c:4930 +msgid "Show Side Panel Calendar" +msgstr "" + +#: ../src/vikwindow.c:5064 +#, c-format +msgid "New _%s Layer" +msgstr "" + +#: ../src/vikwindow.c:5114 +msgid "..." +msgstr "" + +#: ../src/viking.desktop.in.h:2 +msgid "GPS Data Manager" +msgstr "" + +#: ../src/viking.desktop.in.h:3 +msgid "Map Based GPS Data Manager (live data capable)." +msgstr "" + +#: ../src/libjpeg/jpeg-data.c:205 +msgid "Data does not follow JPEG specification." +msgstr "" + +#: ../src/libjpeg/jpeg-data.c:302 +#, c-format +msgid "Path '%s' invalid." +msgstr "" + +#: ../src/libjpeg/jpeg-data.c:320 +#, c-format +msgid "Could not read '%s'." +msgstr "" diff --git a/po/ku.po b/po/ku.po new file mode 100644 index 0000000..9f81a97 --- /dev/null +++ b/po/ku.po @@ -0,0 +1,6071 @@ +# Kurdish translation for viking +# Copyright (c) 2017 Rosetta Contributors and Canonical Ltd 2017 +# This file is distributed under the same license as the viking package. +# FIRST AUTHOR , 2017. +# +msgid "" +msgstr "" +"Project-Id-Version: viking\n" +"Report-Msgid-Bugs-To: \n" +"POT-Creation-Date: 2019-01-19 12:53+0000\n" +"PO-Revision-Date: 2017-01-31 19:47+0000\n" +"Last-Translator: Rokar ✌ \n" +"Language-Team: Kurdish \n" +"Language: ku\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-Launchpad-Export-Date: 2018-12-21 17:32+0000\n" +"X-Generator: Launchpad (build 18847)\n" + +#: ../src/acquire.c:106 ../src/vikgpslayer.c:1367 +msgid "Done." +msgstr "Bi dawî hat." + +#: ../src/acquire.c:115 +msgid "No data." +msgstr "" + +#: ../src/acquire.c:167 ../src/acquire.c:415 +msgid "Error: acquisition failed." +msgstr "" + +#: ../src/acquire.c:339 +msgid "Working..." +msgstr "" + +#. This shouldn't happen... +#: ../src/acquire.c:406 +msgid "" +"Unable to create command\n" +"Acquire method failed." +msgstr "" + +#: ../src/acquire.c:513 +msgid "_Filter" +msgstr "" + +#: ../src/acquire.c:528 +#, c-format +msgid "Filter with %s" +msgstr "" + +#: ../src/acquire.c:545 +msgid "Filter" +msgstr "Parzûn" + +#: ../src/babel.c:640 +msgid "GPSBabel:" +msgstr "" + +#: ../src/babel.c:641 +msgid "" +"Allow setting the specific instance of GPSBabel. You must restart Viking for " +"this value to take effect." +msgstr "" + +#: ../src/babel_ui.c:79 +msgid "Select a file format" +msgstr "" + +#: ../src/babel_ui.c:144 ../src/viktrwlayer.c:531 ../src/viktrwlayer.c:2882 +msgid "Tracks" +msgstr "" + +#: ../src/babel_ui.c:149 ../src/viktrwlayer.c:2892 +msgid "Routes" +msgstr "" + +#. ***** PARAMETERS ***** +#: ../src/babel_ui.c:154 ../src/viktrwlayer.c:531 ../src/viktrwlayer.c:2887 +msgid "Waypoints" +msgstr "" + +#: ../src/background.c:64 +#, c-format +msgid "%d items" +msgstr "" + +#: ../src/background.c:287 +msgid "Threads:" +msgstr "" + +#: ../src/background.c:288 +msgid "" +"Number of threads to use for Mapnik tasks. You need to restart Viking for a " +"change to this value to be used" +msgstr "" + +#: ../src/background.c:361 +msgid "Job" +msgstr "" + +#: ../src/background.c:365 +msgid "Progress" +msgstr "" + +#: ../src/background.c:373 +msgid "Viking Background Jobs" +msgstr "" + +#: ../src/bing.c:42 +msgid "Bing Aerial" +msgstr "" + +#: ../src/bing.c:48 +msgid "Bing" +msgstr "" + +#. VIK_GTK_WINDOW_FROM_WIDGET(vp) +#: ../src/bingmapsource.c:514 +msgid "Bing attribution Loading" +msgstr "" + +#: ../src/clipboard.c:95 +msgid "paste failed" +msgstr "" + +#: ../src/clipboard.c:105 +msgid "wrong clipboard data size" +msgstr "" + +#: ../src/clipboard.c:124 +#, c-format +msgid "" +"The clipboard contains sublayer data for %s layers. You must select a layer " +"of this type to paste the clipboard data." +msgstr "" + +#: ../src/clipboard.c:264 +msgid "" +"In order to paste a waypoint, please select an appropriate layer to paste " +"into." +msgstr "" + +#: ../src/dialog.c:60 +msgid "Go to Lat/Lon" +msgstr "" + +#: ../src/dialog.c:69 ../src/viktrwlayer_wpwin.c:173 +msgid "Latitude:" +msgstr "" + +#: ../src/dialog.c:72 ../src/viktrwlayer_wpwin.c:177 +msgid "Longitude:" +msgstr "" + +#: ../src/dialog.c:102 +msgid "Go to UTM" +msgstr "" + +#: ../src/dialog.c:114 +msgid "Northing:" +msgstr "" + +#: ../src/dialog.c:117 +msgid "Easting:" +msgstr "" + +#: ../src/dialog.c:121 ../src/vikgeoreflayer.c:902 +msgid "Zone:" +msgstr "" + +#: ../src/dialog.c:124 ../src/vikgeoreflayer.c:904 +msgid "Letter:" +msgstr "" + +#: ../src/dialog.c:246 ../src/geonamessearch.c:238 +#: ../src/datasource_osm_my_traces.c:505 +msgid "Nothing was selected" +msgstr "" + +#: ../src/dialog.c:254 +msgid "Add Route" +msgstr "" + +#: ../src/dialog.c:254 +msgid "Add Track" +msgstr "" + +#: ../src/dialog.c:262 +msgid "Route Name:" +msgstr "" + +#: ../src/dialog.c:262 +msgid "Track Name:" +msgstr "" + +#: ../src/dialog.c:282 +msgid "Please enter a name for the track." +msgstr "" + +#: ../src/dialog.c:311 +msgid "Today" +msgstr "" + +#: ../src/dialog.c:393 +msgid "Zoom Factors..." +msgstr "" + +#: ../src/dialog.c:407 +msgid "Zoom factor (in meters per pixel):" +msgstr "" + +#: ../src/dialog.c:408 +msgid "X (easting): " +msgstr "" + +#: ../src/dialog.c:409 +msgid "Y (northing): " +msgstr "" + +#: ../src/dialog.c:414 +msgid "X and Y zoom factors must be equal" +msgstr "" + +#: ../src/dialog.c:469 +msgid "1 min" +msgstr "" + +#: ../src/dialog.c:470 +msgid "1 hour" +msgstr "" + +#: ../src/dialog.c:471 +msgid "1 day" +msgstr "" + +#: ../src/dialog.c:472 +msgid "Custom (in minutes):" +msgstr "" + +#: ../src/dialog.c:608 +#, c-format +msgid "" +"2003-2008, Evan Battaglia\n" +"2008-%s, Viking's contributors" +msgstr "" + +#: ../src/dialog.c:609 +msgid "GPS Data and Topo Analyzer, Explorer, and Manager." +msgstr "" + +#: ../src/dialog.c:610 +msgid "" +"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.\n" +"\n" +"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.\n" +"\n" +"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., 59 Temple " +"Place, Suite 330, Boston, MA 02111-1307, USA" +msgstr "" + +#: ../src/dialog.c:703 +msgid "Translation is coordinated on http://launchpad.net/viking" +msgstr "" + +#: ../src/dialog.c:713 +msgid "Download along track" +msgstr "" + +#: ../src/dialog.c:720 +msgid "Map type:" +msgstr "" + +#: ../src/dialog.c:726 +msgid "Zoom level:" +msgstr "" + +#: ../src/dialog.c:766 +#, c-format +msgid "The map data is licensed: %s." +msgstr "" + +#: ../src/dialog.c:769 +#, c-format +msgid "" +"The data provided by '%s' are licensed under the following license: " +"%s." +msgstr "" + +#: ../src/dialog.c:773 +msgid "Open license" +msgstr "" + +#: ../src/expedia.c:54 +msgid "Expedia Street Maps" +msgstr "" + +#: ../src/expedia.c:82 +msgid "Invalid expedia altitude" +msgstr "" + +#: ../src/expedia.c:113 +#, c-format +msgid "" +"Couldn't open EXPEDIA image file (right after successful download! Please " +"report and delete image file!): %s" +msgstr "" + +#: ../src/expedia.c:126 +#, c-format +msgid "" +"Couldn't save EXPEDIA image file (right after successful download! Please " +"report and delete image file!): %s" +msgstr "" + +#: ../src/geonamessearch.c:115 +msgid "Search" +msgstr "" + +#: ../src/geonamessearch.c:117 +msgid "No entries found!" +msgstr "" + +#. NB could allow columns to be shifted around by doing this after each new +#. gtk_tree_view_column_set_reorderable ( column, TRUE ); +#. However I don't think is that useful, so I haven't put it in +#: ../src/geonamessearch.c:171 ../src/datasource_osm_my_traces.c:422 +#: ../src/viktrwlayer_tracklist.c:621 ../src/viktrwlayer_waypointlist.c:618 +msgid "Name" +msgstr "" + +#: ../src/geonamessearch.c:176 +msgid "Feature" +msgstr "" + +#: ../src/geonamessearch.c:181 ../src/datasource_osm_my_traces.c:437 +msgid "Lat/Lon" +msgstr "" + +#: ../src/geonamessearch.c:264 ../src/googlesearch.c:101 ../src/vikgoto.c:430 +msgid "couldn't map temp file" +msgstr "" + +#: ../src/geonamessearch.c:459 +msgid "Select articles" +msgstr "" + +#: ../src/geonamessearch.c:459 +msgid "Select the articles you want to add." +msgstr "" + +#: ../src/geonamessearch.c:475 +msgid "city" +msgstr "" + +#: ../src/geonamessearch.c:477 +msgid "edu" +msgstr "" + +#: ../src/geonamessearch.c:479 +msgid "airport" +msgstr "" + +#: ../src/geonamessearch.c:481 +msgid "mountain" +msgstr "" + +#: ../src/geonamessearch.c:483 +msgid "forest" +msgstr "" + +#: ../src/geonamessearch.c:485 +msgid "church" +msgstr "" + +#: ../src/geojson.c:74 +#, c-format +msgid "%s command failed: %s" +msgstr "" + +#: ../src/geojson.c:146 ../src/gpx.c:1317 +#, c-format +msgid "failed to open temporary file: %s" +msgstr "" + +#: ../src/globals.c:67 +msgid "DDD" +msgstr "" + +#: ../src/globals.c:67 +msgid "DMM" +msgstr "" + +#: ../src/globals.c:67 +msgid "DMS" +msgstr "" + +#: ../src/globals.c:67 +msgid "Raw" +msgstr "" + +#: ../src/globals.c:68 +msgid "Kilometres" +msgstr "" + +#: ../src/globals.c:68 +msgid "Miles" +msgstr "" + +#: ../src/globals.c:68 +msgid "Nautical Miles" +msgstr "" + +#. VIK_UNITS_SPEED_KILOMETRES_PER_HOUR: +#: ../src/globals.c:69 ../src/viktrwlayer_tracklist.c:655 ../src/vikutils.c:100 +msgid "km/h" +msgstr "" + +#: ../src/globals.c:69 ../src/viktrwlayer_tracklist.c:656 ../src/vikutils.c:78 +msgid "mph" +msgstr "" + +#. VIK_UNITS_SPEED_METRES_PER_SECOND: +#: ../src/globals.c:69 ../src/viktrwlayer_tracklist.c:663 ../src/vikutils.c:81 +msgid "m/s" +msgstr "" + +#: ../src/globals.c:69 ../src/viktrwlayer_tracklist.c:657 ../src/vikutils.c:84 +msgid "knots" +msgstr "" + +#: ../src/globals.c:69 ../src/viktrwlayer_tracklist.c:658 ../src/vikutils.c:87 +msgid "s/km" +msgstr "" + +#: ../src/globals.c:69 ../src/viktrwlayer_tracklist.c:659 ../src/vikutils.c:90 +msgid "min/km" +msgstr "" + +#: ../src/globals.c:69 +msgid "s/mi" +msgstr "" + +#: ../src/globals.c:69 ../src/viktrwlayer_tracklist.c:661 ../src/vikutils.c:96 +msgid "min/mi" +msgstr "" + +#: ../src/globals.c:70 +msgid "Metres" +msgstr "" + +#: ../src/globals.c:70 +msgid "Feet" +msgstr "" + +#: ../src/globals.c:73 +msgid "Locale" +msgstr "" + +#: ../src/globals.c:73 +msgid "World" +msgstr "" + +#: ../src/globals.c:73 +msgid "UTC" +msgstr "" + +#: ../src/globals.c:76 +msgid "Degree format:" +msgstr "" + +#: ../src/globals.c:77 +msgid "Distance units:" +msgstr "" + +#: ../src/globals.c:78 +msgid "Speed units:" +msgstr "" + +#: ../src/globals.c:79 +msgid "Height units:" +msgstr "" + +#: ../src/globals.c:80 +msgid "Use large waypoint icons:" +msgstr "" + +#: ../src/globals.c:81 +msgid "Default latitude:" +msgstr "" + +#: ../src/globals.c:82 +msgid "Default longitude:" +msgstr "" + +#: ../src/globals.c:83 +msgid "Time Display:" +msgstr "" + +#: ../src/globals.c:84 +msgid "" +"Display times according to the reference frame. Locale is the user's system " +"setting. World is relative to the location of the object." +msgstr "" + +#: ../src/globals.c:90 +msgid "Alphabetical" +msgstr "" + +#: ../src/globals.c:90 ../src/datasource_osm_my_traces.c:432 +msgid "Time" +msgstr "" + +#: ../src/globals.c:90 +msgid "Creation" +msgstr "" + +#: ../src/globals.c:91 +msgid "Title Case" +msgstr "" + +#: ../src/globals.c:91 +msgid "Lowercase" +msgstr "" + +#: ../src/globals.c:94 +msgid "KML File Export Units:" +msgstr "" + +#: ../src/globals.c:95 +msgid "GPX Track Order:" +msgstr "" + +#: ../src/globals.c:96 +msgid "GPX Waypoint Symbols:" +msgstr "" + +#: ../src/globals.c:97 +msgid "" +"Save GPX Waypoint Symbol names in the specified case. May be useful for " +"compatibility with various devices" +msgstr "" + +#: ../src/globals.c:98 +msgid "GPX Creator:" +msgstr "" + +#: ../src/globals.c:99 +msgid "" +"The creator value when writing a GPX file. Otherwise when blank a default is " +"used." +msgstr "" + +#: ../src/globals.c:104 +msgid "Image Viewer:" +msgstr "" + +#: ../src/globals.c:109 +msgid "External GPX Program 1:" +msgstr "" + +#: ../src/globals.c:110 +msgid "External GPX Program 2:" +msgstr "" + +#: ../src/globals.c:113 +msgid "Absolute" +msgstr "" + +#: ../src/globals.c:113 +msgid "Relative" +msgstr "" + +#: ../src/globals.c:117 +msgid "Save File Reference Mode:" +msgstr "" + +#: ../src/globals.c:118 +msgid "" +"When saving a Viking .vik file, this determines how the directory paths of " +"filenames are written." +msgstr "" + +#: ../src/globals.c:119 +msgid "Ask for Name before Track Creation:" +msgstr "" + +#: ../src/globals.c:120 +msgid "Show Tooltip during Track Creation:" +msgstr "" + +#: ../src/globals.c:121 +msgid "The number of recent files:" +msgstr "" + +#: ../src/globals.c:122 +msgid "" +"Only applies to new windows or on application restart. -1 means all " +"available files." +msgstr "" + +#: ../src/globals.c:123 +msgid "Open files in selected layer:" +msgstr "" + +#: ../src/globals.c:124 +msgid "Open files (but not .vik ones) into the selected TrackWaypoint layer." +msgstr "" + +#: ../src/globals.c:125 +msgid "Show calendar day names:" +msgstr "" + +#: ../src/globals.c:128 +msgid "Home Location" +msgstr "" + +#: ../src/globals.c:128 +msgid "Last Location" +msgstr "" + +#: ../src/globals.c:128 +msgid "Specified File" +msgstr "" + +#: ../src/globals.c:128 +msgid "Auto Location" +msgstr "" + +#: ../src/globals.c:131 +msgid "Restore Window Setup:" +msgstr "" + +#: ../src/globals.c:132 +msgid "Restore window size and layout" +msgstr "" + +#: ../src/globals.c:133 +msgid "Add a Default Map Layer:" +msgstr "" + +#: ../src/globals.c:134 +msgid "" +"The default map layer added is defined by the Layer Defaults. Use the menu " +"Edit->Layer Defaults->Map... to change the map type and other values." +msgstr "" + +#: ../src/globals.c:135 +msgid "Startup Method:" +msgstr "" + +#: ../src/globals.c:136 +msgid "Startup File:" +msgstr "" + +#: ../src/globals.c:137 +msgid "" +"The default file to load on startup. Only applies when the startup method is " +"set to 'Specified File'" +msgstr "" + +#: ../src/globals.c:138 +msgid "Check For New Version:" +msgstr "" + +#: ../src/globals.c:139 +msgid "Periodically check to see if a new version of Viking is available" +msgstr "" + +#. Defaults for the options are setup here +#: ../src/globals.c:176 +msgid "General" +msgstr "" + +#. New Tab +#: ../src/globals.c:204 +msgid "Startup" +msgstr "" + +#. New Tab +#: ../src/globals.c:222 +msgid "Export/External" +msgstr "" + +#. 'Advanced' Properties +#: ../src/globals.c:249 +msgid "Advanced" +msgstr "" + +#. Webtools +#: ../src/google.c:39 +msgid "Google" +msgstr "" + +#. If there is an actual description field it will overwrite this value +#: ../src/gpx.c:264 +#, c-format +msgid "Created by: %s" +msgstr "" + +#: ../src/datasource_bfilter.c:43 +msgid "Max number of points:" +msgstr "" + +#: ../src/datasource_bfilter.c:84 +msgid "Simplify All Tracks..." +msgstr "" + +#: ../src/datasource_bfilter.c:85 +msgid "Simplified Tracks" +msgstr "" + +#. { VIK_LAYER_NUM_TYPES, "compressmethod", VIK_LAYER_PARAM_UINT, VIK_LAYER_GROUP_NONE, N_("Simplify Method:"), VIK_LAYER_WIDGET_COMBOBOX, compress_method, NULL, NULL, NULL, NULL, NULL }, +#: ../src/datasource_bfilter.c:111 +msgid "Error Factor:" +msgstr "" + +#: ../src/datasource_bfilter.c:112 +msgid "" +"Specifies the maximum allowable error that may be introduced by removing a " +"single point by the crosstrack method. See the manual or GPSBabel Simplify " +"Filter documentation for more detail." +msgstr "" + +#: ../src/datasource_bfilter.c:166 +msgid "Compress Tracks..." +msgstr "" + +#: ../src/datasource_bfilter.c:167 +msgid "Compressed Tracks" +msgstr "" + +#: ../src/datasource_bfilter.c:197 ../src/datasource_bfilter.c:198 +msgid "Remove Duplicate Waypoints" +msgstr "" + +#: ../src/datasource_bfilter.c:221 +msgid "Manual filter:" +msgstr "" + +#: ../src/datasource_bfilter.c:222 +msgid "Manual filter command: e.g. 'swap'." +msgstr "" + +#: ../src/datasource_bfilter.c:233 ../src/datasource_bfilter.c:234 +msgid "Manual filter" +msgstr "" + +#: ../src/datasource_bfilter.c:262 +msgid "Waypoints Inside This" +msgstr "" + +#: ../src/datasource_bfilter.c:263 ../src/datasource_bfilter.c:292 +msgid "Polygonized Layer" +msgstr "" + +#: ../src/datasource_bfilter.c:291 +msgid "Waypoints Outside This" +msgstr "" + +#: ../src/datasource_file.c:61 +msgid "Import file with GPSBabel" +msgstr "" + +#: ../src/datasource_file.c:62 +msgid "Imported file" +msgstr "" + +#. The file selector +#: ../src/datasource_file.c:129 +msgid "File:" +msgstr "" + +#: ../src/datasource_file.c:130 +msgid "File to import" +msgstr "" + +#: ../src/datasource_file.c:137 +msgid "All files" +msgstr "" + +#. The file format selector +#: ../src/datasource_file.c:144 ../src/datasource_url.c:106 +msgid "File type:" +msgstr "" + +#: ../src/datasource_file.c:189 +#, c-format +msgid "using babel args '%s' and file '%s'" +msgstr "" + +#: ../src/datasource_gc.c:67 +msgid "Download Geocaches" +msgstr "" + +#: ../src/datasource_gc.c:68 +msgid "Geocaching.com Caches" +msgstr "" + +#: ../src/datasource_gc.c:86 +msgid "geocaching.com username:" +msgstr "" + +#: ../src/datasource_gc.c:87 +msgid "geocaching.com password:" +msgstr "" + +#: ../src/datasource_gc.c:92 ../src/vikwindow.c:3502 +msgid "Geocaching" +msgstr "" + +#: ../src/datasource_gc.c:128 +#, c-format +msgid "" +"Can't find %s or %s in path! Check that you have installed it correctly." +msgstr "" + +#: ../src/datasource_gc.c:190 +msgid "Number geocaches:" +msgstr "" + +#: ../src/datasource_gc.c:192 +msgid "Centered around:" +msgstr "" + +#: ../src/datasource_gc.c:231 +msgid "Broken input - using some defaults" +msgstr "" + +#: ../src/datasource_geotag.c:51 +msgid "Create Waypoints from Geotagged Images" +msgstr "" + +#: ../src/datasource_geotag.c:52 +msgid "Geotagged Images" +msgstr "" + +#: ../src/datasource_geotag.c:102 ../src/datasource_geojson.c:93 +#: ../src/vikfileentry.c:171 ../src/vikwindow.c:3533 ../src/vikwindow.c:3610 +#: ../src/vikwindow.c:3641 ../src/vikwindow.c:4356 ../src/vikwindow.c:4649 +msgid "All" +msgstr "" + +#: ../src/datasource_geotag.c:107 ../src/vikfileentry.c:115 +#: ../src/viktrwlayer_geotag.c:637 ../src/vikwindow.c:3518 +#: ../src/vikwindow.c:4377 +msgid "JPG" +msgstr "" + +#: ../src/datasource_geotag.c:168 +#, c-format +msgid "Unable to create waypoint from %s" +msgstr "" + +#: ../src/datasource_geojson.c:46 +msgid "Acquire from GeoJSON" +msgstr "" + +#: ../src/datasource_geojson.c:47 ../src/datasource_geojson.c:98 +msgid "GeoJSON" +msgstr "" + +#: ../src/datasource_geojson.c:152 +#, c-format +msgid "Unable to import from: %s" +msgstr "" + +#: ../src/datasource_gps.c:54 +msgid "Acquire from GPS" +msgstr "" + +#: ../src/datasource_gps.c:55 +msgid "Acquired from GPS" +msgstr "" + +#: ../src/datasource_gps.c:258 +#, c-format +msgid "using cmd '%s' and file '%s'\n" +msgstr "" + +#: ../src/datasource_gps.c:353 ../src/vikgpslayer.c:966 +#, c-format +msgid "Downloading %d waypoint..." +msgid_plural "Downloading %d waypoints..." +msgstr[0] "" +msgstr[1] "" + +#: ../src/datasource_gps.c:358 ../src/vikgpslayer.c:971 +#, c-format +msgid "Downloading %d trackpoint..." +msgid_plural "Downloading %d trackpoints..." +msgstr[0] "" +msgstr[1] "" + +#: ../src/datasource_gps.c:363 ../src/vikgpslayer.c:976 +#, c-format +msgid "Downloading %d routepoint..." +msgid_plural "Downloading %d routepoints..." +msgstr[0] "" +msgstr[1] "" + +#: ../src/datasource_gps.c:386 ../src/datasource_gps.c:393 +#: ../src/datasource_gps.c:400 +#, c-format +msgid "Downloaded %d out of %d %s..." +msgstr "" + +#: ../src/datasource_gps.c:388 ../src/datasource_gps.c:395 +#: ../src/datasource_gps.c:402 +#, c-format +msgid "Downloaded %d %s." +msgstr "" + +#: ../src/datasource_gps.c:416 ../src/vikgpslayer.c:1134 +#, c-format +msgid "GPS Device: %s" +msgstr "" + +#: ../src/datasource_gps.c:428 ../src/vikgpslayer.c:1214 +msgid "Status: Working..." +msgstr "" + +#. NB gps_layer_inst_init() is performed after parameter registeration +#. thus to give the protocols some potential values use the old static list +#. TODO: find another way to use gps_layer_inst_init()? +#: ../src/datasource_gps.c:584 ../src/vikgpslayer.c:216 +msgid "GPS Protocol:" +msgstr "" + +#. List reassigned at runtime +#: ../src/datasource_gps.c:609 ../src/vikgpslayer.c:217 +msgid "Serial Port:" +msgstr "" + +#: ../src/datasource_gps.c:659 +msgid "" +"Turn Off After Transfer\n" +"(Garmin/NAViLink Only)" +msgstr "" + +#: ../src/datasource_gps.c:666 +msgid "Tracks:" +msgstr "" + +#: ../src/datasource_gps.c:673 +msgid "Routes:" +msgstr "" + +#: ../src/datasource_gps.c:680 +msgid "Waypoints:" +msgstr "" + +#: ../src/datasource_gps.c:756 ../src/vikgpslayer.c:1509 +msgid "GPS device: N/A" +msgstr "" + +#: ../src/datasource_osm.c:53 ../src/datasource_osm.c:54 +msgid "OSM traces" +msgstr "" + +#: ../src/datasource_osm.c:89 +msgid "Page number:" +msgstr "" + +#: ../src/datasource_osm_my_traces.c:59 ../src/datasource_osm_my_traces.c:60 +msgid "OSM My Traces" +msgstr "" + +#: ../src/datasource_osm_my_traces.c:106 ../src/osm-traces.c:684 +msgid "Email/username:" +msgstr "" + +#: ../src/datasource_osm_my_traces.c:111 +msgid "The email or username used to login to OSM" +msgstr "" + +#: ../src/datasource_osm_my_traces.c:113 ../src/osm-traces.c:692 +msgid "Password:" +msgstr "" + +#: ../src/datasource_osm_my_traces.c:116 +msgid "The password used to login to OSM" +msgstr "" + +#: ../src/datasource_osm_my_traces.c:427 ../src/viktrwlayer.c:689 +msgid "Description" +msgstr "" + +#: ../src/datasource_osm_my_traces.c:442 +msgid "Privacy" +msgstr "" + +#: ../src/datasource_osm_my_traces.c:449 +msgid "Within Current View" +msgstr "" + +#: ../src/datasource_osm_my_traces.c:516 +msgid "GPS Traces" +msgstr "" + +#: ../src/datasource_osm_my_traces.c:518 +msgid "None found!" +msgstr "" + +#: ../src/datasource_osm_my_traces.c:569 +msgid "Ensure the OSM access token preferences are setup." +msgstr "" + +#: ../src/datasource_osm_my_traces.c:645 +msgid "My OSM Traces" +msgstr "" + +#. Report errors to the status bar +#: ../src/datasource_osm_my_traces.c:667 +#, c-format +msgid "Unable to get trace: %s" +msgstr "" + +#: ../src/datasource_routing.c:56 ../src/datasource_routing.c:57 +msgid "Directions" +msgstr "" + +#: ../src/datasource_routing.c:90 +msgid "No routing engines with directions available" +msgstr "" + +#. Engine selector +#: ../src/datasource_routing.c:99 +msgid "Engine:" +msgstr "" + +#. From and To entries +#: ../src/datasource_routing.c:104 +msgid "From:" +msgstr "" + +#: ../src/datasource_routing.c:105 +msgid "To:" +msgstr "" + +#: ../src/datasource_url.c:48 +msgid "Acquire from URL" +msgstr "" + +#: ../src/datasource_url.c:49 +msgid "URL" +msgstr "" + +#: ../src/datasource_url.c:101 +msgid "URL:" +msgstr "" + +#. Only GPX (not using GPSbabel) +#: ../src/datasource_url.c:133 ../src/vikfileentry.c:161 +#: ../src/vikwindow.c:3513 ../src/vikwindow.c:3603 +msgid "GPX" +msgstr "" + +#: ../src/datasource_wikipedia.c:32 +msgid "Create Waypoints from Wikipedia Articles" +msgstr "" + +#: ../src/datasource_wikipedia.c:33 +msgid "Wikipedia Waypoints" +msgstr "" + +#: ../src/dem.c:66 ../src/dem.c:80 +msgid "Invalid DEM" +msgstr "" + +#: ../src/dem.c:122 +msgid "Invalid DEM header" +msgstr "" + +#: ../src/dem.c:191 ../src/dem.c:204 +msgid "Incorrect DEM Class B record: expected 1" +msgstr "" + +#: ../src/dem.c:289 ../src/download.c:176 +#, c-format +msgid "Couldn't map file %s: %s" +msgstr "" + +#: ../src/download.c:130 +msgid "Tile age (days):" +msgstr "" + +#: ../src/download.c:406 +#, c-format +msgid "Download error: %s" +msgstr "" + +#: ../src/download.c:490 +msgid "couldn't open temp file" +msgstr "" + +#: ../src/file.c:458 ../src/file.c:463 +#, c-format +msgid "Draw mode '%s' no more supported" +msgstr "" + +#: ../src/geotag_exif.c:621 +msgid "Not enough memory." +msgstr "" + +#: ../src/geotag_exif.c:639 +msgid "Setting a value for this tag is unsupported!" +msgstr "" + +#: ../src/geotag_exif.c:658 +#, c-format +msgid "Too few components specified (need %d, found %d)\n" +msgstr "" + +#: ../src/geotag_exif.c:662 +msgid "Numeric value expected\n" +msgstr "" + +#: ../src/geotag_exif.c:670 +msgid "This shouldn't happen!" +msgstr "" + +#: ../src/geotag_exif.c:740 +msgid "Not yet implemented!" +msgstr "" + +#: ../src/geotag_exif.c:753 +msgid "Warning; Too many components specified!" +msgstr "" + +#: ../src/osm-traces.c:87 +msgid "Identifiable (public w/ timestamps)" +msgstr "" + +#: ../src/osm-traces.c:88 +msgid "Trackable (private w/ timestamps)" +msgstr "" + +#: ../src/osm-traces.c:89 +msgid "Public" +msgstr "" + +#: ../src/osm-traces.c:90 +msgid "Private" +msgstr "" + +#: ../src/osm-traces.c:108 +msgid "Access Token:" +msgstr "" + +#: ../src/osm-traces.c:108 +msgid "Get New OSM Access Tokens" +msgstr "" + +#: ../src/osm-traces.c:109 +msgid "Access Token Key:" +msgstr "" + +#: ../src/osm-traces.c:110 +msgid "Access Token Secret:" +msgstr "" + +#: ../src/osm-traces.c:111 +msgid "OSM username:" +msgstr "" + +#: ../src/osm-traces.c:112 +msgid "OSM password:" +msgstr "" + +#. Check to really override existing values... +#: ../src/osm-traces.c:263 +msgid "Do you want to overwrite existing values?" +msgstr "" + +#: ../src/osm-traces.c:275 +msgid "Not able to generate OSM request tokens." +msgstr "" + +#: ../src/osm-traces.c:299 +msgid "" +"Waiting for authorization approval.\n" +"Ensure you have granted access at the website before continuing here." +msgstr "" + +#: ../src/osm-traces.c:315 +msgid "No Authorization." +msgstr "" + +#: ../src/osm-traces.c:354 +msgid "" +"OSM Username and Password preferences are not required anymore. You can now " +"remove them." +msgstr "" + +#. Preferences +#: ../src/osm-traces.c:379 +msgid "OpenStreetMap Traces" +msgstr "" + +#: ../src/osm-traces.c:504 +#, c-format +msgid "failed to upload data: HTTP response is %ld" +msgstr "" + +#: ../src/osm-traces.c:509 +#, c-format +msgid "curl_easy_getinfo failed: %d" +msgstr "" + +#: ../src/osm-traces.c:514 +#, c-format +msgid "curl request failed: %s" +msgstr "" + +#. Success +#: ../src/osm-traces.c:592 +msgid "Uploaded to OSM" +msgstr "" + +#: ../src/osm-traces.c:596 +msgid "" +"FAILED TO UPLOAD DATA TO OSM - Ensure the OSM access token preferences are " +"setup." +msgstr "" + +#: ../src/osm-traces.c:599 +msgid "FAILED TO UPLOAD DATA TO OSM - CURL PROBLEM" +msgstr "" + +#: ../src/osm-traces.c:602 +msgid "FAILED TO UPLOAD DATA TO OSM" +msgstr "" + +#: ../src/osm-traces.c:602 +msgid "HTTP response code" +msgstr "" + +#: ../src/osm-traces.c:610 +#, c-format +msgid "failed to unlink temporary file: %s" +msgstr "" + +#: ../src/osm-traces.c:664 +msgid "OSM upload" +msgstr "" + +#: ../src/osm-traces.c:689 +msgid "" +"The email/username used as login\n" +"Enter the email/username you use to login into www.openstreetmap.org." +"" +msgstr "" + +#: ../src/osm-traces.c:697 +msgid "" +"The password used to login\n" +"Enter the password you use to login into www.openstreetmap.org." +msgstr "" + +#: ../src/osm-traces.c:703 +msgid "File's name:" +msgstr "" + +#: ../src/osm-traces.c:713 +msgid "" +"The name of the file on OSM\n" +"This is the name of the file created on the server.This is not the " +"name of the local file." +msgstr "" + +#: ../src/osm-traces.c:717 ../src/viktrwlayer_wpwin.c:197 +#: ../src/viktrwlayer_wpwin.c:199 +msgid "Description:" +msgstr "" + +#: ../src/osm-traces.c:731 +msgid "The description of the trace" +msgstr "" + +#: ../src/osm-traces.c:734 +msgid "Anonymize Times:" +msgstr "" + +#: ../src/osm-traces.c:739 +msgid "" +"Anonymize times of the trace.\n" +"You may choose to make the trace identifiable, yet mask the actual " +"real time values" +msgstr "" + +#: ../src/osm-traces.c:743 +msgid "Tags:" +msgstr "" + +#: ../src/osm-traces.c:751 +msgid "The tags associated to the trace" +msgstr "" + +#: ../src/osm-traces.c:816 +#, c-format +msgid "Uploading %s to OSM" +msgstr "" + +#: ../src/mapcache.c:67 +msgid "Map cache memory size (MB):" +msgstr "" + +#. NB Can have a couple hundred fonts loaded when using system directories +#. So ATM don't list them all - otherwise need better GUI feedback display. +#: ../src/mapnik_interface.cpp:324 +#, c-format +msgid "" +"%s %s\n" +"Plugins=%sFonts loaded=%d" +msgstr "" + +#: ../src/mapnik_interface.cpp:325 ../src/vikmapniklayer.c:278 +msgid "Mapnik" +msgstr "" + +#: ../src/print.c:51 ../src/viktrwlayer.c:572 +msgid "None" +msgstr "" + +#: ../src/print.c:52 +msgid "Horizontally" +msgstr "" + +#: ../src/print.c:53 +msgid "Vertically" +msgstr "" + +#: ../src/print.c:54 +msgid "Both" +msgstr "" + +#: ../src/print.c:118 +msgid "Image Settings" +msgstr "" + +#: ../src/print.c:551 +msgid "done" +msgstr "" + +#. Page Size +#: ../src/print.c:580 +msgid "_Adjust Page Size and Orientation" +msgstr "" + +#: ../src/print.c:596 +msgid "C_enter:" +msgstr "" + +#. ignore page margins +#: ../src/print.c:614 +msgid "Ignore Page _Margins" +msgstr "" + +#: ../src/print.c:633 +msgid "Image S_ize:" +msgstr "" + +#: ../src/ui_util.c:88 +#, c-format +msgid "Could not launch web browser. %s" +msgstr "" + +#: ../src/ui_util.c:101 +#, c-format +msgid "Could not create new email. %s" +msgstr "" + +#: ../src/vikcoordlayer.c:57 +msgid "Color:" +msgstr "" + +#: ../src/vikcoordlayer.c:58 +msgid "Minutes Width:" +msgstr "" + +#: ../src/vikcoordlayer.c:59 +msgid "Line Thickness:" +msgstr "" + +#: ../src/vikcoordlayer.c:66 +msgid "Coordinate" +msgstr "" + +#: ../src/main.c:92 +#, c-format +msgid "Ignoring Xlib error: error code %d request code %d\n" +msgstr "" + +#: ../src/main.c:111 +msgid "Enable debug output" +msgstr "" + +#: ../src/main.c:112 +msgid "Enable verbose output" +msgstr "" + +#: ../src/main.c:113 +msgid "Show version" +msgstr "" + +#: ../src/main.c:114 +msgid "Latitude in decimal degrees" +msgstr "" + +#: ../src/main.c:115 +msgid "Longitude in decimal degrees" +msgstr "" + +#: ../src/main.c:116 +msgid "Zoom Level (OSM). Value can be 0 - 22" +msgstr "" + +#: ../src/main.c:117 +msgid "Add a map layer by id value. Use 0 for the default map." +msgstr "" + +#: ../src/main.c:160 +#, c-format +msgid "" +"%s %s\n" +"Copyright (c) 2003-2008 Evan Battaglia\n" +"Copyright (c) 2008-%s Viking's contributors\n" +msgstr "" + +#: ../src/osm.c:50 +msgid "OpenStreetMap (Mapnik)" +msgstr "" + +#: ../src/osm.c:65 +msgid "OpenStreetMap (Cycle)" +msgstr "" + +#: ../src/osm.c:79 +msgid "OpenStreetMap (Transport)" +msgstr "" + +#: ../src/osm.c:95 +msgid "OpenStreetMap (Humanitarian)" +msgstr "" + +#: ../src/osm.c:111 +msgid "On Disk OSM Tile Format" +msgstr "" + +#: ../src/osm.c:121 +msgid "MBTiles File" +msgstr "" + +#: ../src/osm.c:132 +msgid "OSM Metatiles" +msgstr "" + +#: ../src/osm.c:146 +msgid "Mapbox Outdoors" +msgstr "" + +#: ../src/osm.c:153 +msgid "Mapbox Specific" +msgstr "" + +#: ../src/osm.c:170 +msgid "OSM (view)" +msgstr "" + +#: ../src/osm.c:174 +msgid "OSM (edit)" +msgstr "" + +#. Note the use of positional parameters +#: ../src/osm.c:179 +msgid "OSM (query)" +msgstr "" + +#: ../src/osm.c:183 +msgid "OSM (render)" +msgstr "" + +#. Example: http://127.0.0.1:8111/load_and_zoom?left=8.19&right=8.20&top=48.605&bottom=48.590&select=node413602999 +#. JOSM or merkaartor must already be running with remote interface enabled +#: ../src/osm.c:190 +msgid "Local port 8111 (eg JOSM)" +msgstr "" + +#: ../src/osm.c:195 +msgid "Geofabrik Map Compare" +msgstr "" + +#: ../src/osm.c:203 +msgid "OpenStreetMap Notes" +msgstr "" + +#. Not really OSM but can't be bothered to create somewhere else to put it... +#: ../src/osm.c:221 +msgid "Wikimedia Toolserver GeoHack" +msgstr "" + +#: ../src/preferences.c:195 +msgid "Preferences" +msgstr "" + +#: ../src/toolbar.c:91 ../src/toolbar.c:92 +msgid "System Default" +msgstr "" + +#: ../src/toolbar.c:91 ../src/viktrwlayer.c:563 +msgid "Small" +msgstr "" + +#: ../src/toolbar.c:91 ../src/viktrwlayer.c:564 +msgid "Medium" +msgstr "" + +#: ../src/toolbar.c:91 ../src/viktrwlayer.c:565 +msgid "Large" +msgstr "" + +#: ../src/toolbar.c:92 +msgid "Icons Only" +msgstr "" + +#: ../src/toolbar.c:92 +msgid "Text Only" +msgstr "" + +#: ../src/toolbar.c:92 +msgid "Icons and Text" +msgstr "" + +#: ../src/toolbar.c:106 +msgid "Append to Menu:" +msgstr "" + +#: ../src/toolbar.c:107 +msgid "Pack the toolbar to the main menu to save vertical space" +msgstr "" + +#: ../src/toolbar.c:108 +msgid "Icon Size:" +msgstr "" + +#: ../src/toolbar.c:110 +msgid "Icon Style:" +msgstr "" + +#: ../src/toolbar.c:112 +msgid "Customize:" +msgstr "" + +#: ../src/toolbar.c:112 +msgid "Customize Buttons" +msgstr "" + +#. Preferences +#: ../src/toolbar.c:145 +msgid "Toolbar" +msgstr "" + +#: ../src/toolbar.c:312 +msgid "_Customize" +msgstr "" + +#: ../src/toolbar.c:641 +msgid "Separator" +msgstr "" + +#: ../src/toolbar.c:642 +msgid "--- Separator ---" +msgstr "" + +#: ../src/toolbar.c:1007 +msgid "Customize Toolbar" +msgstr "" + +#: ../src/toolbar.c:1028 +msgid "" +"Select items to be displayed on the toolbar. Items can be reordered by drag " +"and drop." +msgstr "" + +#: ../src/toolbar.c:1044 +msgid "Available Items" +msgstr "" + +#: ../src/toolbar.c:1065 +msgid "Displayed Items" +msgstr "" + +#: ../src/viklayer_defaults.c:232 +#, c-format +msgid "Could not open file: %s" +msgstr "" + +#: ../src/viklayer_defaults.c:304 +msgid "Layer Defaults" +msgstr "" + +#: ../src/uibuilder.c:196 +msgid "Take care that this password will be stored clearly in a plain file." +msgstr "" + +#: ../src/uibuilder.c:628 ../src/viktrwlayer_export.c:188 +#: ../src/viktrwlayer_export.c:304 ../src/vikwindow.c:3666 +#: ../src/vikwindow.c:4408 +#, c-format +msgid "The file \"%s\" exists, do you wish to overwrite it?" +msgstr "" + +#: ../src/vikaggregatelayer.c:41 +msgid "Aggregate" +msgstr "" + +#: ../src/vikaggregatelayer.c:528 ../src/viktrwlayer.c:11700 +#, c-format +msgid "%s: Waypoint List" +msgstr "" + +#: ../src/vikaggregatelayer.c:570 +msgid "Search by Date" +msgstr "" + +#: ../src/vikaggregatelayer.c:576 +msgid "No items found with the requested date." +msgstr "" + +#: ../src/vikaggregatelayer.c:615 ../src/viktrwlayer.c:11691 +#, c-format +msgid "%s: Track and Route List" +msgstr "" + +#: ../src/vikaggregatelayer.c:681 ../src/viktrwlayer.c:8346 +#: ../src/viktrwlayer.c:8417 ../src/viktrwlayer.c:8494 +msgid "_Visibility" +msgstr "" + +#: ../src/vikaggregatelayer.c:686 +msgid "_Show All" +msgstr "" + +#: ../src/vikaggregatelayer.c:692 +msgid "_Hide All" +msgstr "" + +#: ../src/vikaggregatelayer.c:698 ../src/viktrwlayer.c:8363 +#: ../src/viktrwlayer.c:8434 ../src/viktrwlayer.c:8511 +msgid "_Toggle" +msgstr "" + +#: ../src/vikaggregatelayer.c:705 ../src/viktrwlayer.c:8532 +msgid "_Sort" +msgstr "" + +#: ../src/vikaggregatelayer.c:711 ../src/viktrwlayer.c:8538 +msgid "Name _Ascending" +msgstr "" + +#: ../src/vikaggregatelayer.c:717 ../src/viktrwlayer.c:8544 +msgid "Name _Descending" +msgstr "" + +#: ../src/vikaggregatelayer.c:723 ../src/viktrwlayer.c:575 +#: ../src/viktrwlayer.c:8550 +msgid "Date Ascending" +msgstr "" + +#: ../src/vikaggregatelayer.c:729 ../src/viktrwlayer.c:576 +#: ../src/viktrwlayer.c:8556 +msgid "Date Descending" +msgstr "" + +#: ../src/vikaggregatelayer.c:735 ../src/viktrwlayer.c:8445 +#: ../src/viktrwlayer.c:8523 ../src/viktrwlayer.c:8595 +#: ../src/viktrwlayer_tracklist.c:296 +msgid "_Statistics" +msgstr "" + +#: ../src/vikaggregatelayer.c:740 ../src/viktrwlayer.c:4533 +msgid "Track _List..." +msgstr "" + +#: ../src/vikaggregatelayer.c:746 ../src/viktrwlayer.c:4540 +msgid "_Waypoint List..." +msgstr "" + +#: ../src/vikaggregatelayer.c:753 +msgid "Searc_h" +msgstr "" + +#: ../src/vikaggregatelayer.c:759 +msgid "By _Date..." +msgstr "" + +#: ../src/vikaggregatelayer.c:762 +msgid "Find the first item with a specified date" +msgstr "" + +#: ../src/vikaggregatelayer.c:765 +msgid "Load E_xternal Layers" +msgstr "" + +#. Could have a more complicated tooltip that numbers each type of layers, +#. but for now a simple overall count +#: ../src/vikaggregatelayer.c:1011 +#, c-format +msgid "One layer" +msgid_plural "%d layers" +msgstr[0] "" +msgstr[1] "" + +#: ../src/vikaggregatelayer.c:1014 +#, c-format +msgid "Empty" +msgstr "" + +#: ../src/vikdemlayer.c:86 +msgid "SRTM Global 90m (3 arcsec)" +msgstr "" + +#: ../src/vikdemlayer.c:94 +msgid "Absolute height" +msgstr "" + +#: ../src/vikdemlayer.c:95 +msgid "Height gradient" +msgstr "" + +#: ../src/vikdemlayer.c:120 +msgid "DEM Files:" +msgstr "" + +#: ../src/vikdemlayer.c:121 +msgid "Download Source:" +msgstr "" + +#: ../src/vikdemlayer.c:122 +msgid "Min Elev Color:" +msgstr "" + +#: ../src/vikdemlayer.c:123 ../src/viktrwlayer_wpwin.c:207 +msgid "Type:" +msgstr "" + +#: ../src/vikdemlayer.c:124 +msgid "Min Elev:" +msgstr "" + +#: ../src/vikdemlayer.c:125 +msgid "Max Elev:" +msgstr "" + +#: ../src/vikdemlayer.c:137 +msgid "_DEM Download" +msgstr "" + +#: ../src/vikdemlayer.c:137 +msgid "DEM Download" +msgstr "" + +#: ../src/vikdemlayer.c:192 +msgid "DEM" +msgstr "" + +#: ../src/vikdemlayer.c:304 +#, c-format +msgid "Number of files: %d" +msgstr "" + +#: ../src/vikdemlayer.c:446 +msgid "DEM Loading" +msgstr "" + +#: ../src/vikdemlayer.c:927 +#, c-format +msgid "No SRTM data available for %f, %f" +msgstr "" + +#: ../src/vikdemlayer.c:948 +#, c-format +msgid "DEM download failure for %f, %f" +msgstr "" + +#: ../src/vikdemlayer.c:954 +#, c-format +msgid "DEM write failure for %s" +msgstr "" + +#. Probably not over any land... +#: ../src/vikdemlayer.c:1201 +msgid "No DEM File Available" +msgstr "" + +#: ../src/vikdemlayer.c:1220 +#, c-format +msgid "" +"\n" +"Source: %s\n" +"\n" +"DEM File: %s\n" +"DEM File Timestamp: %s" +msgstr "" + +#: ../src/vikdemlayer.c:1224 +#, c-format +msgid "" +"Source: %s\n" +"\n" +"No DEM File!" +msgstr "" + +#: ../src/vikdemlayer.c:1264 +#, c-format +msgid "Downloading DEM %s" +msgstr "" + +#: ../src/vikdemlayer.c:1289 +msgid "_Show DEM File Information" +msgstr "" + +#: ../src/vikfileentry.c:72 +msgid "Browse..." +msgstr "" + +#: ../src/vikfileentry.c:103 +msgid "Choose file" +msgstr "" + +#: ../src/vikfileentry.c:120 ../src/vikwindow.c:4372 +msgid "PNG" +msgstr "" + +#: ../src/vikfileentry.c:125 +msgid "TIFF" +msgstr "" + +#: ../src/vikfileentry.c:133 +msgid "MBTiles" +msgstr "" + +#: ../src/vikfileentry.c:142 +msgid "XML" +msgstr "" + +#: ../src/vikfileentry.c:149 +msgid "MML" +msgstr "" + +#: ../src/vikfileentry.c:154 +msgid "MSS" +msgstr "" + +#: ../src/vikfilelist.c:49 +msgid "Choose file(s)" +msgstr "" + +#: ../src/vikfilelist.c:182 +msgid "Add..." +msgstr "" + +#: ../src/vikfilelist.c:183 +msgid "Delete" +msgstr "" + +#: ../src/vikgeoreflayer.c:97 +msgid "_Georef Move Map" +msgstr "" + +#: ../src/vikgeoreflayer.c:97 +msgid "Georef Move Map" +msgstr "" + +#: ../src/vikgeoreflayer.c:106 +msgid "Georef Z_oom Tool" +msgstr "" + +#: ../src/vikgeoreflayer.c:106 +msgid "Georef Zoom Tool" +msgstr "" + +#: ../src/vikgeoreflayer.c:117 +msgid "GeoRef Map" +msgstr "" + +#: ../src/vikgeoreflayer.c:214 +msgid "Auto Read World Files:" +msgstr "" + +#: ../src/vikgeoreflayer.c:215 +msgid "" +"Automatically attempt to read associated world file of a new image for a " +"GeoRef layer" +msgstr "" + +#: ../src/vikgeoreflayer.c:511 ../src/vikgeoreflayer.c:797 +#: ../src/vikmapslayer.c:1174 +#, c-format +msgid "Couldn't open image file: %s" +msgstr "" + +#: ../src/vikgeoreflayer.c:607 ../src/vikgeoreflayer.c:633 +msgid "Choose World file" +msgstr "" + +#: ../src/vikgeoreflayer.c:619 +msgid "The World file you requested could not be opened for reading." +msgstr "" + +#: ../src/vikgeoreflayer.c:621 +msgid "Unexpected end of file reading World file." +msgstr "" + +#: ../src/vikgeoreflayer.c:646 +msgid "The file you requested could not be opened for writing." +msgstr "" + +#: ../src/vikgeoreflayer.c:782 +msgid "Lower right corner values may not be consistent with upper right values" +msgstr "" + +#: ../src/vikgeoreflayer.c:806 +#, c-format +msgid "Invalid image size: %s" +msgstr "" + +#: ../src/vikgeoreflayer.c:831 ../src/viklayer.c:561 ../src/vikwindow.c:4891 +msgid "Layer Properties" +msgstr "" + +#: ../src/vikgeoreflayer.c:852 +msgid "World File Parameters:" +msgstr "" + +#: ../src/vikgeoreflayer.c:853 +msgid "Load From File..." +msgstr "" + +#: ../src/vikgeoreflayer.c:858 +msgid "Corner pixel easting:" +msgstr "" + +#: ../src/vikgeoreflayer.c:860 +msgid "the UTM \"easting\" value of the upper-left corner pixel of the map" +msgstr "" + +#: ../src/vikgeoreflayer.c:862 +msgid "Corner pixel northing:" +msgstr "" + +#: ../src/vikgeoreflayer.c:864 +msgid "the UTM \"northing\" value of the upper-left corner pixel of the map" +msgstr "" + +#: ../src/vikgeoreflayer.c:866 +msgid "X (easting) scale (mpp): " +msgstr "" + +#: ../src/vikgeoreflayer.c:867 +msgid "Y (northing) scale (mpp): " +msgstr "" + +#: ../src/vikgeoreflayer.c:870 +msgid "the scale of the map in the X direction (meters per pixel)" +msgstr "" + +#: ../src/vikgeoreflayer.c:872 +msgid "the scale of the map in the Y direction (meters per pixel)" +msgstr "" + +#: ../src/vikgeoreflayer.c:874 +msgid "Map Image:" +msgstr "" + +#: ../src/vikgeoreflayer.c:919 +msgid "Upper left latitude:" +msgstr "" + +#: ../src/vikgeoreflayer.c:921 +msgid "Upper left longitude:" +msgstr "" + +#: ../src/vikgeoreflayer.c:923 +msgid "Lower right latitude:" +msgstr "" + +#: ../src/vikgeoreflayer.c:925 +msgid "Lower right longitude:" +msgstr "" + +#: ../src/vikgeoreflayer.c:937 +msgid "Calculate MPP values from coordinates" +msgstr "" + +#: ../src/vikgeoreflayer.c:938 +msgid "" +"Enter all corner coordinates before calculating the MPP values from the " +"image size" +msgstr "" + +#: ../src/vikgeoreflayer.c:948 +msgid "UTM" +msgstr "" + +#: ../src/vikgeoreflayer.c:949 +msgid "Latitude/Longitude" +msgstr "" + +#: ../src/vikgeoreflayer.c:957 ../src/vikmapniklayer.c:82 +#: ../src/vikmapslayer.c:158 +msgid "Alpha:" +msgstr "" + +#. Now with icons +#: ../src/vikgeoreflayer.c:1062 +msgid "_Zoom to Fit Map" +msgstr "" + +#: ../src/vikgeoreflayer.c:1068 +msgid "_Goto Map Center" +msgstr "" + +#: ../src/vikgeoreflayer.c:1074 +msgid "_Export to World File" +msgstr "" + +#: ../src/vikgoto.c:98 +msgid "No goto tool available." +msgstr "" + +#: ../src/vikgoto.c:295 +msgid "goto" +msgstr "" + +#: ../src/vikgoto.c:297 +msgid "goto provider:" +msgstr "" + +#: ../src/vikgoto.c:312 +msgid "Enter address or place name:" +msgstr "" + +#: ../src/vikgoto.c:487 +msgid "Locality" +msgstr "" + +#: ../src/vikgpslayer.c:137 +msgid "Data Mode" +msgstr "" + +#: ../src/vikgpslayer.c:139 +msgid "Realtime Tracking Mode" +msgstr "" + +#: ../src/vikgpslayer.c:176 +msgid "Keep vehicle at center" +msgstr "" + +#: ../src/vikgpslayer.c:177 +msgid "Keep vehicle on screen" +msgstr "" + +#: ../src/vikgpslayer.c:178 +msgid "Disable" +msgstr "" + +#: ../src/vikgpslayer.c:218 +msgid "Download Tracks:" +msgstr "" + +#: ../src/vikgpslayer.c:219 +msgid "Upload Tracks:" +msgstr "" + +#: ../src/vikgpslayer.c:220 +msgid "Download Routes:" +msgstr "" + +#: ../src/vikgpslayer.c:221 +msgid "Upload Routes:" +msgstr "" + +#: ../src/vikgpslayer.c:222 +msgid "Download Waypoints:" +msgstr "" + +#: ../src/vikgpslayer.c:223 +msgid "Upload Waypoints:" +msgstr "" + +#: ../src/vikgpslayer.c:225 +msgid "Recording tracks" +msgstr "" + +#: ../src/vikgpslayer.c:226 +msgid "Jump to current position on start" +msgstr "" + +#: ../src/vikgpslayer.c:227 +msgid "Moving Map Method:" +msgstr "" + +#: ../src/vikgpslayer.c:228 +msgid "Update Statusbar:" +msgstr "" + +#: ../src/vikgpslayer.c:228 +msgid "Display information in the statusbar on GPS updates" +msgstr "" + +#: ../src/vikgpslayer.c:229 +msgid "Auto Connect" +msgstr "" + +#: ../src/vikgpslayer.c:229 +msgid "Automatically connect to GPSD" +msgstr "" + +#: ../src/vikgpslayer.c:230 +msgid "Gpsd Host:" +msgstr "" + +#: ../src/vikgpslayer.c:231 +msgid "Gpsd Port:" +msgstr "" + +#: ../src/vikgpslayer.c:232 +msgid "Gpsd Retry Interval (seconds):" +msgstr "" + +#: ../src/vikgpslayer.c:254 +msgid "GPS" +msgstr "" + +#: ../src/vikgpslayer.c:320 ../src/vikgpslayer.c:1504 +msgid "GPS Download" +msgstr "" + +#: ../src/vikgpslayer.c:320 ../src/vikgpslayer.c:1504 ../src/viktrwlayer.c:3993 +msgid "GPS Upload" +msgstr "" + +#: ../src/vikgpslayer.c:322 +msgid "GPS Realtime Tracking" +msgstr "" + +#: ../src/vikgpslayer.c:458 +msgid "Connected" +msgstr "" + +#: ../src/vikgpslayer.c:460 +msgid "Disconnected" +msgstr "" + +#: ../src/vikgpslayer.c:554 +msgid "Unknown GPS Protocol" +msgstr "" + +#: ../src/vikgpslayer.c:572 +msgid "Unknown serial port device" +msgstr "" + +#: ../src/vikgpslayer.c:691 +#, c-format +msgid "%s: unknown parameter" +msgstr "" + +#. Now with icons +#: ../src/vikgpslayer.c:794 +msgid "_Upload to GPS" +msgstr "" + +#: ../src/vikgpslayer.c:800 +msgid "Download from _GPS" +msgstr "" + +#: ../src/vikgpslayer.c:821 +msgid "Empty _Realtime" +msgstr "" + +#: ../src/vikgpslayer.c:828 +msgid "E_mpty Upload" +msgstr "" + +#: ../src/vikgpslayer.c:834 +msgid "_Empty Download" +msgstr "" + +#: ../src/vikgpslayer.c:840 +msgid "Empty _All" +msgstr "" + +#: ../src/vikgpslayer.c:852 +#, c-format +msgid "Unexpected number of disconnected handlers: %d" +msgstr "" + +#: ../src/vikgpslayer.c:995 +#, c-format +msgid "Uploading %d waypoint..." +msgid_plural "Uploading %d waypoints..." +msgstr[0] "" +msgstr[1] "" + +#: ../src/vikgpslayer.c:1000 +#, c-format +msgid "Uploading %d trackpoint..." +msgid_plural "Uploading %d trackpoints..." +msgstr[0] "" +msgstr[1] "" + +#: ../src/vikgpslayer.c:1005 +#, c-format +msgid "Uploading %d routepoint..." +msgid_plural "Uploading %d routepoints..." +msgstr[0] "" +msgstr[1] "" + +#: ../src/vikgpslayer.c:1034 +#, c-format +msgid "Downloaded %d out of %d waypoint..." +msgid_plural "Downloaded %d out of %d waypoints..." +msgstr[0] "" +msgstr[1] "" + +#: ../src/vikgpslayer.c:1040 +#, c-format +msgid "Downloaded %d out of %d trackpoint..." +msgid_plural "Downloaded %d out of %d trackpoints..." +msgstr[0] "" +msgstr[1] "" + +#: ../src/vikgpslayer.c:1046 +#, c-format +msgid "Downloaded %d out of %d routepoint..." +msgid_plural "Downloaded %d out of %d routepoints..." +msgstr[0] "" +msgstr[1] "" + +#: ../src/vikgpslayer.c:1056 +#, c-format +msgid "Uploaded %d out of %d waypoint..." +msgid_plural "Uploaded %d out of %d waypoints..." +msgstr[0] "" +msgstr[1] "" + +#: ../src/vikgpslayer.c:1062 +#, c-format +msgid "Uploaded %d out of %d trackpoint..." +msgid_plural "Uploaded %d out of %d trackpoints..." +msgstr[0] "" +msgstr[1] "" + +#: ../src/vikgpslayer.c:1068 +#, c-format +msgid "Uploaded %d out of %d routepoint..." +msgid_plural "Uploaded %d out of %d routepoints..." +msgstr[0] "" +msgstr[1] "" + +#: ../src/vikgpslayer.c:1079 +#, c-format +msgid "Downloaded %d waypoint" +msgid_plural "Downloaded %d waypoints" +msgstr[0] "" +msgstr[1] "" + +#: ../src/vikgpslayer.c:1085 +#, c-format +msgid "Downloaded %d trackpoint" +msgid_plural "Downloaded %d trackpoints" +msgstr[0] "" +msgstr[1] "" + +#: ../src/vikgpslayer.c:1091 +#, c-format +msgid "Downloaded %d routepoint" +msgid_plural "Downloaded %d routepoints" +msgstr[0] "" +msgstr[1] "" + +#: ../src/vikgpslayer.c:1101 +#, c-format +msgid "Uploaded %d waypoint" +msgid_plural "Uploaded %d waypoints" +msgstr[0] "" +msgstr[1] "" + +#: ../src/vikgpslayer.c:1107 +#, c-format +msgid "Uploaded %d trackpoint" +msgid_plural "Uploaded %d trackpoints" +msgstr[0] "" +msgstr[1] "" + +#: ../src/vikgpslayer.c:1113 +#, c-format +msgid "Uploaded %d routepoint" +msgid_plural "Uploaded %d routepoints" +msgstr[0] "" +msgstr[1] "" + +#: ../src/vikgpslayer.c:1363 +msgid "Error: No result." +msgstr "" + +#: ../src/vikgpslayer.c:1471 +msgid "Warning - GPS Upload items may overwrite each other" +msgstr "" + +#: ../src/vikgpslayer.c:1506 +msgid "Status: detecting gpsbabel" +msgstr "" + +#: ../src/vikgpslayer.c:1533 +msgid "No GPS items selected for transfer." +msgstr "" + +#: ../src/vikgpslayer.c:1546 +msgid "Could not turn off device." +msgstr "" + +#: ../src/vikgpslayer.c:1589 +msgid "Are you sure you want to delete GPS Upload data?" +msgstr "" + +#: ../src/vikgpslayer.c:1602 +msgid "Are you sure you want to delete GPS Download data?" +msgstr "" + +#: ../src/vikgpslayer.c:1616 +msgid "Are you sure you want to delete GPS Realtime data?" +msgstr "" + +#: ../src/vikgpslayer.c:1630 +msgid "Are you sure you want to delete All GPS data?" +msgstr "" + +#: ../src/vikgpslayer.c:2004 +#, c-format +msgid "" +"Failed to connect to gpsd at %s (port %s)\n" +"Should Viking keep trying (every %d seconds)?" +msgstr "" + +#: ../src/viklayerspanel.c:73 +msgid "C_ut" +msgstr "" + +#: ../src/viklayerspanel.c:74 ../src/vikwindow.c:4882 +msgid "_Copy" +msgstr "" + +#: ../src/viklayerspanel.c:75 ../src/vikwindow.c:4883 +msgid "_Paste" +msgstr "" + +#: ../src/viklayerspanel.c:76 ../src/vikwindow.c:4884 +msgid "_Delete" +msgstr "" + +#: ../src/viklayerspanel.c:154 +msgid "New Layer" +msgstr "" + +#: ../src/viklayerspanel.c:347 +msgid "Top Layer" +msgstr "" + +#: ../src/viklayerspanel.c:363 +msgid "Add new layer" +msgstr "" + +#: ../src/viklayerspanel.c:370 ../src/vikwindow.c:4884 +msgid "Remove selected layer" +msgstr "" + +#: ../src/viklayerspanel.c:377 +msgid "Move selected layer up" +msgstr "" + +#: ../src/viklayerspanel.c:384 +msgid "Move selected layer down" +msgstr "" + +#: ../src/viklayerspanel.c:391 ../src/vikwindow.c:4881 +msgid "Cut selected layer" +msgstr "" + +#: ../src/viklayerspanel.c:398 ../src/vikwindow.c:4882 +msgid "Copy selected layer" +msgstr "" + +#: ../src/viklayerspanel.c:405 ../src/vikwindow.c:4883 +msgid "" +"Paste layer into selected container layer or otherwise above selected layer" +msgstr "" + +#: ../src/viklayerspanel.c:502 +msgid "New name can not be blank." +msgstr "" + +#: ../src/viklayerspanel.c:751 +msgid "Aggregate Layers have no settable properties." +msgstr "" + +#: ../src/viklayerspanel.c:798 +msgid "You cannot cut the Top Layer." +msgstr "" + +#: ../src/viklayerspanel.c:843 +#, c-format +msgid "Are you sure you want to delete %s?" +msgstr "" + +#: ../src/viklayerspanel.c:863 +msgid "You cannot delete the Top Layer." +msgstr "" + +#: ../src/vikmapniklayer.c:78 +msgid "CSS (MML) Config File:" +msgstr "" + +#: ../src/vikmapniklayer.c:79 +msgid "CartoCSS configuration file" +msgstr "" + +#: ../src/vikmapniklayer.c:80 +msgid "XML Config File:" +msgstr "" + +#: ../src/vikmapniklayer.c:81 +msgid "Mapnik XML configuration file" +msgstr "" + +#: ../src/vikmapniklayer.c:84 +msgid "Use File Cache:" +msgstr "" + +#: ../src/vikmapniklayer.c:86 +msgid "File Cache Directory:" +msgstr "" + +#: ../src/vikmapniklayer.c:122 +msgid "_Mapnik Features" +msgstr "" + +#: ../src/vikmapniklayer.c:122 +msgid "Mapnik Features" +msgstr "" + +#: ../src/vikmapniklayer.c:140 +msgid "Mapnik Rendering" +msgstr "" + +#. Changing these values only applies before first mapnik layer is 'created' +#: ../src/vikmapniklayer.c:258 +msgid "Plugins Directory:" +msgstr "" + +#: ../src/vikmapniklayer.c:258 ../src/vikmapniklayer.c:259 +#: ../src/vikmapniklayer.c:260 ../src/vikmapniklayer.c:261 +msgid "You need to restart Viking for a change to this value to be used" +msgstr "" + +#: ../src/vikmapniklayer.c:259 +msgid "Fonts Directory:" +msgstr "" + +#: ../src/vikmapniklayer.c:260 +msgid "Recurse Fonts Directory:" +msgstr "" + +#: ../src/vikmapniklayer.c:261 +msgid "Rerender Timeout (hours):" +msgstr "" + +#. Changeable any time +#: ../src/vikmapniklayer.c:263 +msgid "CartoCSS:" +msgstr "" + +#: ../src/vikmapniklayer.c:263 +msgid "The program to convert CartoCSS files into Mapnik XML" +msgstr "" + +#: ../src/vikmapniklayer.c:506 +msgid "Running" +msgstr "" + +#: ../src/vikmapniklayer.c:525 +#, c-format +msgid "" +"Error running carto command:\n" +"%s" +msgstr "" + +#: ../src/vikmapniklayer.c:561 +msgid " completed in " +msgstr "" + +#: ../src/vikmapniklayer.c:561 +msgid "seconds" +msgstr "" + +#: ../src/vikmapniklayer.c:611 ../src/vikmapniklayer.c:979 +#, c-format +msgid "" +"Mapnik error loading configuration file:\n" +"%s" +msgstr "" + +#: ../src/vikmapniklayer.c:749 +#, c-format +msgid "Mapnik Render %d:%d:%d %s" +msgstr "" + +#: ../src/vikmapniklayer.c:840 +msgid "Mapnik Rendering must be in Mercator mode" +msgstr "" + +#: ../src/vikmapniklayer.c:997 +msgid "Mapnik Information" +msgstr "" + +#: ../src/vikmapniklayer.c:1031 +msgid "_Flush Memory Cache" +msgstr "" + +#: ../src/vikmapniklayer.c:1044 +msgid "_Run Carto Command" +msgstr "" + +#: ../src/vikmapniklayer.c:1102 ../src/vikmapslayer.c:2029 +#, c-format +msgid "Tile File Timestamp: %s" +msgstr "" + +#: ../src/vikmapniklayer.c:1105 ../src/vikmapslayer.c:2032 +msgid "Tile File Timestamp: Not Available" +msgstr "" + +#: ../src/vikmapniklayer.c:1120 +#, c-format +msgid "Rendering time %.2f seconds" +msgstr "" + +#: ../src/vikmapniklayer.c:1124 ../src/vikmapslayer.c:2042 +msgid "Tile Information" +msgstr "" + +#: ../src/vikmapniklayer.c:1145 +msgid "_Rerender Tile" +msgstr "" + +#: ../src/vikmapniklayer.c:1150 +msgid "_Info" +msgstr "" + +#. ******* MAPZOOMS ******** +#: ../src/vikmapslayer.c:96 +msgid "Use Viking Zoom Level" +msgstr "" + +#: ../src/vikmapslayer.c:146 +msgid "OSM" +msgstr "" + +#. NB mode => id - But can't break file format just to rename something better +#: ../src/vikmapslayer.c:152 +msgid "Map Type:" +msgstr "" + +#: ../src/vikmapslayer.c:153 +msgid "Maps Directory:" +msgstr "" + +#: ../src/vikmapslayer.c:154 +msgid "Cache Layout:" +msgstr "" + +#: ../src/vikmapslayer.c:155 +msgid "This determines the tile storage layout on disk" +msgstr "" + +#: ../src/vikmapslayer.c:156 +msgid "Map File:" +msgstr "" + +#: ../src/vikmapslayer.c:157 +msgid "An MBTiles file. Only applies when the map type method is 'MBTiles'" +msgstr "" + +#: ../src/vikmapslayer.c:159 +msgid "Control the Alpha value for transparency effects" +msgstr "" + +#: ../src/vikmapslayer.c:160 +msgid "Autodownload maps:" +msgstr "" + +#: ../src/vikmapslayer.c:161 +msgid "Autodownload Only Gets Missing Maps:" +msgstr "" + +#: ../src/vikmapslayer.c:162 +msgid "" +"Using this option avoids attempting to update already acquired tiles. This " +"can be useful if you want to restrict the network usage, without having to " +"resort to manual control. Only applies when 'Autodownload Maps' is on." +msgstr "" + +#: ../src/vikmapslayer.c:163 +msgid "Zoom Level:" +msgstr "" + +#: ../src/vikmapslayer.c:164 +msgid "" +"Determines the method of displaying map tiles for the current zoom level. " +"'Viking Zoom Level' uses the best matching level, otherwise setting a fixed " +"value will always use map tiles of the specified value regardless of the " +"actual zoom level." +msgstr "" + +#: ../src/vikmapslayer.c:197 +msgid "_Maps Download" +msgstr "" + +#: ../src/vikmapslayer.c:197 +msgid "Maps Download" +msgstr "" + +#: ../src/vikmapslayer.c:213 ../src/vikutils.c:895 +msgid "Map" +msgstr "" + +#: ../src/vikmapslayer.c:306 +msgid "Default map layer directory:" +msgstr "" + +#: ../src/vikmapslayer.c:306 +msgid "Choose a directory to store cached Map tiles for this layer" +msgstr "" + +#: ../src/vikmapslayer.c:436 ../src/vikmapslayer.c:633 +msgid "Unknown map type" +msgstr "" + +#: ../src/vikmapslayer.c:664 +msgid "Unknown Map Zoom" +msgstr "" + +#: ../src/vikmapslayer.c:833 +#, c-format +msgid "Failed to open MBTiles file: %s" +msgstr "" + +#: ../src/vikmapslayer.c:856 +#, c-format +msgid "" +"New map cannot be displayed in the current drawmode.\n" +"Select \"%s\" from View menu to view it." +msgstr "" + +#: ../src/vikmapslayer.c:1314 +#, c-format +msgid "" +"Cowardly refusing to draw tiles or existence of tiles beyond %d zoom out " +"factor" +msgstr "" + +#. TODO: ?? count up the number of download errors somehow... +#: ../src/vikmapslayer.c:1667 +msgid "Failed to download tile" +msgstr "" + +#: ../src/vikmapslayer.c:1673 +msgid "Unable to save tile" +msgstr "" + +#: ../src/vikmapslayer.c:1799 +#, c-format +msgid "Redownloading up to %d %s map..." +msgid_plural "Redownloading up to %d %s maps..." +msgstr[0] "" +msgstr[1] "" + +#: ../src/vikmapslayer.c:1801 +#, c-format +msgid "Redownloading %d %s map..." +msgid_plural "Redownloading %d %s maps..." +msgstr[0] "" +msgstr[1] "" + +#: ../src/vikmapslayer.c:1805 ../src/vikmapslayer.c:1890 +#, c-format +msgid "Downloading %d %s map..." +msgid_plural "Downloading %d %s maps..." +msgstr[0] "" +msgstr[1] "" + +#: ../src/vikmapslayer.c:1969 +msgid "YES" +msgstr "" + +#: ../src/vikmapslayer.c:1973 ../src/vikmapslayer.c:1977 +msgid "NO" +msgstr "" + +#. NB Also handles .jpg automatically due to pixbuf_new_from () support - although just print png for now. +#: ../src/vikmapslayer.c:1980 +#, c-format +msgid "Source: %s (%d%s%d%s%d.%s %s)" +msgstr "" + +#: ../src/vikmapslayer.c:1983 +msgid "Source: Not available" +msgstr "" + +#: ../src/vikmapslayer.c:2000 +msgid "Source: file://" +msgstr "" + +#: ../src/vikmapslayer.c:2012 +#, c-format +msgid "Source: %s" +msgstr "" + +#: ../src/vikmapslayer.c:2038 +#, c-format +msgid "Tile File: %s [Not Available]" +msgstr "" + +#: ../src/vikmapslayer.c:2086 +msgid "Redownload _Bad Map(s)" +msgstr "" + +#: ../src/vikmapslayer.c:2090 +msgid "Redownload _New Map(s)" +msgstr "" + +#: ../src/vikmapslayer.c:2094 +msgid "Redownload _All Map(s)" +msgstr "" + +#: ../src/vikmapslayer.c:2099 +msgid "_Show Tile Information" +msgstr "" + +#: ../src/vikmapslayer.c:2166 +#, c-format +msgid "" +"Wrong drawmode for this map.\n" +"Select \"%s\" from View menu and try again." +msgstr "" + +#: ../src/vikmapslayer.c:2171 +msgid "Wrong zoom level for this map." +msgstr "" + +#: ../src/vikmapslayer.c:2334 +msgid "Zoom Start:" +msgstr "" + +#: ../src/vikmapslayer.c:2341 +msgid "Zoom End:" +msgstr "" + +#: ../src/vikmapslayer.c:2347 +msgid "Download Maps Method:" +msgstr "" + +#. redownload method - needs to align with REDOWNLOAD* macro values +#: ../src/vikmapslayer.c:2419 +msgid "Missing" +msgstr "" + +#: ../src/vikmapslayer.c:2419 +msgid "Bad" +msgstr "" + +#: ../src/vikmapslayer.c:2419 +msgid "New" +msgstr "" + +#: ../src/vikmapslayer.c:2419 +msgid "Reload All" +msgstr "" + +#: ../src/vikmapslayer.c:2421 +msgid "Download for Zoom Levels" +msgstr "" + +#: ../src/vikmapslayer.c:2461 +#, c-format +msgid "" +"You are not allowed to download more than %d tiles in one go (requested %d)" +msgstr "" + +#: ../src/vikmapslayer.c:2469 +#, c-format +msgid "Do you really want to download %d tiles?" +msgstr "" + +#. Now with icons +#: ../src/vikmapslayer.c:2509 +msgid "Download _Missing Onscreen Maps" +msgstr "" + +#: ../src/vikmapslayer.c:2516 +msgid "Download _New Onscreen Maps" +msgstr "" + +#: ../src/vikmapslayer.c:2523 +msgid "Reload _All Onscreen Maps" +msgstr "" + +#: ../src/vikmapslayer.c:2529 +msgid "Download Maps in _Zoom Levels..." +msgstr "" + +#: ../src/vikmapslayer.c:2539 +msgid "_Open MBTiles Files" +msgstr "" + +#: ../src/vikmapslayer.c:2554 +msgid "Flush Map Cache" +msgstr "" + +#: ../src/vikrouting.c:54 +msgid "Default engine:" +msgstr "" + +#: ../src/vikrouting.c:68 +msgid "Routing" +msgstr "" + +#: ../src/viktreeview.c:347 +msgid "Layer Name" +msgstr "" + +#: ../src/viktreeview.c:924 +#, c-format +msgid "delete data from %s\n" +msgstr "" + +#: ../src/viktrwlayer.c:427 +msgid "Create _Waypoint" +msgstr "" + +#: ../src/viktrwlayer.c:427 +msgid "Create Waypoint" +msgstr "" + +#: ../src/viktrwlayer.c:437 +msgid "Edit _Track" +msgstr "" + +#: ../src/viktrwlayer.c:437 +msgid "Edit Track" +msgstr "" + +#: ../src/viktrwlayer.c:449 +msgid "Edit _Route" +msgstr "" + +#: ../src/viktrwlayer.c:449 +msgid "Edit Route" +msgstr "" + +#: ../src/viktrwlayer.c:460 +msgid "Route _Finder" +msgstr "" + +#: ../src/viktrwlayer.c:460 +msgid "Route Finder" +msgstr "" + +#: ../src/viktrwlayer.c:471 +msgid "Splitter" +msgstr "" + +#: ../src/viktrwlayer.c:482 +msgid "_Edit Waypoint" +msgstr "" + +#: ../src/viktrwlayer.c:482 +msgid "Edit Waypoint" +msgstr "" + +#: ../src/viktrwlayer.c:495 +msgid "Edit Trac_kpoint" +msgstr "" + +#: ../src/viktrwlayer.c:495 +msgid "Edit Trackpoint" +msgstr "" + +#. a pixbuf for this one is already made globally available +#: ../src/viktrwlayer.c:508 +msgid "Show P_icture" +msgstr "" + +#: ../src/viktrwlayer.c:508 +msgid "Show Picture" +msgstr "" + +#: ../src/viktrwlayer.c:531 +msgid "Waypoint Images" +msgstr "" + +#: ../src/viktrwlayer.c:531 +msgid "Tracks Advanced" +msgstr "" + +#: ../src/viktrwlayer.c:531 +msgid "Metadata" +msgstr "" + +#: ../src/viktrwlayer.c:531 +msgid "Filesystem" +msgstr "" + +#: ../src/viktrwlayer.c:534 +msgid "Draw by Track" +msgstr "" + +#: ../src/viktrwlayer.c:534 +msgid "Draw by Speed" +msgstr "" + +#: ../src/viktrwlayer.c:534 +msgid "All Tracks Same Color" +msgstr "" + +#: ../src/viktrwlayer.c:535 +msgid "Filled Square" +msgstr "" + +#: ../src/viktrwlayer.c:535 +msgid "Square" +msgstr "" + +#: ../src/viktrwlayer.c:535 +msgid "Circle" +msgstr "" + +#: ../src/viktrwlayer.c:535 +msgid "X" +msgstr "" + +#: ../src/viktrwlayer.c:561 +msgid "Extra Extra Small" +msgstr "" + +#: ../src/viktrwlayer.c:562 +msgid "Extra Small" +msgstr "" + +#: ../src/viktrwlayer.c:566 +msgid "Extra Large" +msgstr "" + +#: ../src/viktrwlayer.c:567 +msgid "Extra Extra Large" +msgstr "" + +#: ../src/viktrwlayer.c:573 +msgid "Name Ascending" +msgstr "" + +#: ../src/viktrwlayer.c:574 +msgid "Name Descending" +msgstr "" + +#: ../src/viktrwlayer.c:582 ../src/viktrwlayer_propwin.c:3319 +msgid "No" +msgstr "" + +#: ../src/viktrwlayer.c:583 +msgid "Yes" +msgstr "" + +#: ../src/viktrwlayer.c:584 +msgid "No write" +msgstr "" + +#: ../src/viktrwlayer.c:649 ../src/viktrwlayer.c:673 +msgid "Draw Labels" +msgstr "" + +#: ../src/viktrwlayer.c:650 +msgid "Note: the individual track controls what labels may be displayed" +msgstr "" + +#: ../src/viktrwlayer.c:651 +msgid "Track Labels Font Size:" +msgstr "" + +#: ../src/viktrwlayer.c:652 +msgid "Track Drawing Mode:" +msgstr "" + +#: ../src/viktrwlayer.c:653 +msgid "All Tracks Color:" +msgstr "" + +#: ../src/viktrwlayer.c:654 +msgid "The color used when 'All Tracks Same Color' drawing mode is selected" +msgstr "" + +#: ../src/viktrwlayer.c:655 +msgid "Draw Track Lines" +msgstr "" + +#: ../src/viktrwlayer.c:656 +msgid "Track Thickness:" +msgstr "" + +#: ../src/viktrwlayer.c:657 +msgid "Draw Track Direction" +msgstr "" + +#: ../src/viktrwlayer.c:658 +msgid "Direction Size:" +msgstr "" + +#: ../src/viktrwlayer.c:659 +msgid "Draw Trackpoints" +msgstr "" + +#: ../src/viktrwlayer.c:660 +msgid "Trackpoint Size:" +msgstr "" + +#: ../src/viktrwlayer.c:661 +msgid "Draw Elevation" +msgstr "" + +#: ../src/viktrwlayer.c:662 +msgid "Draw Elevation Height %:" +msgstr "" + +#: ../src/viktrwlayer.c:663 +msgid "Draw Stops" +msgstr "" + +#: ../src/viktrwlayer.c:664 +msgid "" +"Whether to draw a marker when trackpoints are at the same position but over " +"the minimum stop length apart in time" +msgstr "" + +#: ../src/viktrwlayer.c:665 +msgid "Min Stop Length (seconds):" +msgstr "" + +#: ../src/viktrwlayer.c:667 +msgid "Track BG Thickness:" +msgstr "" + +#: ../src/viktrwlayer.c:668 +msgid "Track Background Color" +msgstr "" + +#: ../src/viktrwlayer.c:669 +msgid "Draw by Speed Factor (%):" +msgstr "" + +#: ../src/viktrwlayer.c:670 +msgid "" +"The percentage factor away from the average speed determining the color used" +msgstr "" + +#: ../src/viktrwlayer.c:671 +msgid "Track Sort Order:" +msgstr "" + +#: ../src/viktrwlayer.c:674 +msgid "Waypoint Font Size:" +msgstr "" + +#: ../src/viktrwlayer.c:675 +msgid "Waypoint Color:" +msgstr "" + +#: ../src/viktrwlayer.c:676 +msgid "Waypoint Text:" +msgstr "" + +#: ../src/viktrwlayer.c:677 +msgid "Background:" +msgstr "" + +#: ../src/viktrwlayer.c:678 +msgid "Fake BG Color Translucency:" +msgstr "" + +#: ../src/viktrwlayer.c:679 +msgid "Waypoint marker:" +msgstr "" + +#: ../src/viktrwlayer.c:680 +msgid "Waypoint size:" +msgstr "" + +#: ../src/viktrwlayer.c:681 +msgid "Draw Waypoint Symbols:" +msgstr "" + +#: ../src/viktrwlayer.c:682 +msgid "Waypoint Sort Order:" +msgstr "" + +#: ../src/viktrwlayer.c:684 +msgid "Draw Waypoint Images" +msgstr "" + +#: ../src/viktrwlayer.c:685 +msgid "Image Size (pixels):" +msgstr "" + +#: ../src/viktrwlayer.c:686 +msgid "Image Alpha:" +msgstr "" + +#: ../src/viktrwlayer.c:687 +msgid "Image Memory Cache Size:" +msgstr "" + +#: ../src/viktrwlayer.c:690 +msgid "Author" +msgstr "" + +#: ../src/viktrwlayer.c:691 +msgid "Creation Time" +msgstr "" + +#: ../src/viktrwlayer.c:692 +msgid "Keywords" +msgstr "" + +#: ../src/viktrwlayer.c:693 +msgid "External layer:" +msgstr "" + +#: ../src/viktrwlayer.c:693 +msgid "" +"Layer data stored in the Viking file, in an external file, or in an external " +"file but changes are not written to the file (file only loaded at startup)" +msgstr "" + +#: ../src/viktrwlayer.c:694 +msgid "Save layer as:" +msgstr "" + +#: ../src/viktrwlayer.c:694 +msgid "Specify where layer should be saved. Overwrites file if it exists." +msgstr "" + +#: ../src/viktrwlayer.c:798 +msgid "TrackWaypoint" +msgstr "" + +#: ../src/viktrwlayer.c:1999 ../src/viktrwlayer_propwin.c:1469 +#: ../src/viktrwlayer_propwin.c:1471 ../src/vikutils.c:299 +#: ../src/vikutils.c:326 +msgid "miles" +msgstr "" + +#: ../src/viktrwlayer.c:2002 ../src/viktrwlayer_propwin.c:1475 +#: ../src/viktrwlayer_propwin.c:1477 ../src/vikutils.c:303 +#: ../src/vikutils.c:330 +msgid "NM" +msgstr "" + +#. VIK_UNITS_DISTANCE_KILOMETRES: +#: ../src/viktrwlayer.c:2006 ../src/viktrwlayer_propwin.c:1482 +#: ../src/viktrwlayer_propwin.c:1484 ../src/vikutils.c:308 +#: ../src/vikutils.c:335 +msgid "km" +msgstr "" + +#: ../src/viktrwlayer.c:2121 +msgid "start/end" +msgstr "" + +#: ../src/viktrwlayer.c:2133 +msgid "start" +msgstr "" + +#: ../src/viktrwlayer.c:2142 +msgid "end" +msgstr "" + +#: ../src/viktrwlayer.c:3103 +#, c-format +msgid " in %d:%02d hrs:mins" +msgstr "" + +#: ../src/viktrwlayer.c:3107 +#, c-format +msgid "" +"\n" +"%sTotal Length %.1f %s%s" +msgstr "" + +#: ../src/viktrwlayer.c:3131 +#, c-format +msgid "" +"\n" +"Total route length %.1f %s" +msgstr "" + +#: ../src/viktrwlayer.c:3136 +#, c-format +msgid "Tracks: %d - Waypoints: %d - Routes: %d%s%s" +msgstr "" + +#: ../src/viktrwlayer.c:3155 +#, c-format +msgid "Tracks: %d" +msgstr "" + +#: ../src/viktrwlayer.c:3165 +#, c-format +msgid "Routes: %d" +msgstr "" + +#: ../src/viktrwlayer.c:3195 +#, c-format +msgid "- %d:%02d hrs:mins" +msgstr "" + +#: ../src/viktrwlayer.c:3202 +#, c-format +msgid "%s%.1f km %s" +msgstr "" + +#: ../src/viktrwlayer.c:3205 +#, c-format +msgid "%s%.1f miles %s" +msgstr "" + +#: ../src/viktrwlayer.c:3208 +#, c-format +msgid "%s%.1f NM %s" +msgstr "" + +#: ../src/viktrwlayer.c:3222 +#, c-format +msgid "Waypoints: %d" +msgstr "" + +#: ../src/viktrwlayer.c:3279 +#, c-format +msgid "Wpt: Alt %dft" +msgstr "" + +#. VIK_UNITS_HEIGHT_METRES: +#: ../src/viktrwlayer.c:3283 +#, c-format +msgid "Wpt: Alt %dm" +msgstr "" + +#. Add comment if available +#: ../src/viktrwlayer.c:3298 +#, c-format +msgid "%s | %s %s | Comment: %s" +msgstr "" + +#: ../src/viktrwlayer.c:3300 +#, c-format +msgid "%s | %s %s" +msgstr "" + +#: ../src/viktrwlayer.c:3562 ../src/viktrwlayer.c:3591 +msgid "This layer has no waypoints or trackpoints." +msgstr "" + +#: ../src/viktrwlayer.c:3598 ../src/viktrwlayer.c:3607 +#: ../src/viktrwlayer.c:3616 ../src/viktrwlayer.c:3625 +#: ../src/viktrwlayer.c:3634 ../src/viktrwlayer.c:3642 +msgid "Export Layer" +msgstr "" + +#: ../src/viktrwlayer.c:3671 +msgid "Export Route as GPX" +msgstr "" + +#: ../src/viktrwlayer.c:3673 +msgid "Export Track as GPX" +msgstr "" + +#: ../src/viktrwlayer.c:3693 +msgid "Find" +msgstr "" + +#: ../src/viktrwlayer.c:3703 +msgid "Waypoint Name:" +msgstr "" + +#: ../src/viktrwlayer.c:3720 +msgid "Waypoint not found in this layer." +msgstr "" + +#: ../src/viktrwlayer.c:3989 +msgid "Can not upload invisible track." +msgstr "" + +#: ../src/viktrwlayer.c:4082 ../src/viktrwlayer.c:10512 +msgid "Track" +msgstr "" + +#: ../src/viktrwlayer.c:4107 ../src/viktrwlayer.c:10599 +msgid "Route" +msgstr "" + +#: ../src/viktrwlayer.c:4194 +msgid "Externa_l" +msgstr "" + +#: ../src/viktrwlayer.c:4216 ../src/viktrwlayer.c:8456 +#: ../src/viktrwlayer.c:8574 +msgid "_Finish Route" +msgstr "" + +#: ../src/viktrwlayer.c:4218 ../src/viktrwlayer.c:8380 +#: ../src/viktrwlayer.c:8572 +msgid "_Finish Track" +msgstr "" + +#. Now with icons +#: ../src/viktrwlayer.c:4230 +msgid "_View Layer" +msgstr "" + +#: ../src/viktrwlayer.c:4237 +msgid "V_iew" +msgstr "" + +#: ../src/viktrwlayer.c:4243 +msgid "View All _Tracks" +msgstr "" + +#: ../src/viktrwlayer.c:4248 +msgid "View All _Routes" +msgstr "" + +#: ../src/viktrwlayer.c:4253 +msgid "View All _Waypoints" +msgstr "" + +#: ../src/viktrwlayer.c:4258 +msgid "_Goto Center of Layer" +msgstr "" + +#: ../src/viktrwlayer.c:4264 ../src/viktrwlayer.c:8321 +msgid "Goto _Waypoint..." +msgstr "" + +#: ../src/viktrwlayer.c:4270 +msgid "_Export Layer" +msgstr "" + +#: ../src/viktrwlayer.c:4276 +msgid "Export as GPS_Point..." +msgstr "" + +#: ../src/viktrwlayer.c:4281 +msgid "Export as GPS_Mapper..." +msgstr "" + +#: ../src/viktrwlayer.c:4286 +msgid "Export as _GPX..." +msgstr "" + +#: ../src/viktrwlayer.c:4292 +msgid "Export as _KML..." +msgstr "" + +#: ../src/viktrwlayer.c:4299 +msgid "Export as GEO_JSON..." +msgstr "" + +#: ../src/viktrwlayer.c:4306 +msgid "Export via GPSbabel..." +msgstr "" + +#: ../src/viktrwlayer.c:4312 +#, c-format +msgid "Open with External Program_1: %s" +msgstr "" + +#: ../src/viktrwlayer.c:4319 +#, c-format +msgid "Open with External Program_2: %s" +msgstr "" + +#: ../src/viktrwlayer.c:4327 ../src/vikwindow.c:4825 +msgid "_New" +msgstr "" + +#: ../src/viktrwlayer.c:4333 +msgid "New _Waypoint..." +msgstr "" + +#: ../src/viktrwlayer.c:4339 +msgid "New _Track" +msgstr "" + +#: ../src/viktrwlayer.c:4347 +msgid "New _Route" +msgstr "" + +#: ../src/viktrwlayer.c:4356 ../src/viktrwlayer.c:8232 +#: ../src/viktrwlayer.c:9003 +msgid "Geotag _Images..." +msgstr "" + +#: ../src/viktrwlayer.c:4363 +msgid "_Acquire" +msgstr "" + +#: ../src/viktrwlayer.c:4369 ../src/vikwindow.c:4904 +msgid "From _GPS..." +msgstr "" + +#. FIXME: only add menu when at least a routing engine has support for Directions +#: ../src/viktrwlayer.c:4375 +msgid "From _Directions..." +msgstr "" + +#: ../src/viktrwlayer.c:4381 +msgid "From _OSM Traces..." +msgstr "" + +#: ../src/viktrwlayer.c:4386 +msgid "From _My OSM Traces..." +msgstr "" + +#: ../src/viktrwlayer.c:4392 ../src/vikwindow.c:4844 +msgid "From _URL..." +msgstr "" + +#: ../src/viktrwlayer.c:4399 ../src/vikwindow.c:4846 +msgid "From _Wikipedia Waypoints" +msgstr "" + +#: ../src/viktrwlayer.c:4405 +msgid "Within _Layer Bounds" +msgstr "" + +#: ../src/viktrwlayer.c:4411 +msgid "Within _Current View" +msgstr "" + +#: ../src/viktrwlayer.c:4419 +msgid "From Geo_caching..." +msgstr "" + +#: ../src/viktrwlayer.c:4426 ../src/vikwindow.c:4842 +msgid "From Geotagged _Images..." +msgstr "" + +#: ../src/viktrwlayer.c:4433 +msgid "From _File..." +msgstr "" + +#: ../src/viktrwlayer.c:4436 ../src/vikwindow.c:4905 +msgid "Import File With GPS_Babel..." +msgstr "" + +#: ../src/viktrwlayer.c:4443 ../src/viktrwlayer.c:8905 +msgid "_Upload" +msgstr "" + +#: ../src/viktrwlayer.c:4449 +msgid "Upload to _GPS..." +msgstr "" + +#: ../src/viktrwlayer.c:4456 ../src/viktrwlayer.c:8973 +msgid "Upload to _OSM..." +msgstr "" + +#: ../src/viktrwlayer.c:4464 +msgid "De_lete" +msgstr "" + +#: ../src/viktrwlayer.c:4470 +msgid "Delete All _Tracks" +msgstr "" + +#: ../src/viktrwlayer.c:4477 +msgid "Delete Tracks _From Selection..." +msgstr "" + +#: ../src/viktrwlayer.c:4484 ../src/viktrwlayer.c:8481 +msgid "Delete _All Routes" +msgstr "" + +#: ../src/viktrwlayer.c:4491 ../src/viktrwlayer.c:8487 +msgid "_Delete Routes From Selection..." +msgstr "" + +#: ../src/viktrwlayer.c:4498 +msgid "Delete All _Waypoints" +msgstr "" + +#: ../src/viktrwlayer.c:4505 +msgid "Delete Waypoints From _Selection..." +msgstr "" + +#: ../src/viktrwlayer.c:4512 ../src/viktrwlayer.c:8339 +msgid "Delete Duplicate Waypoints" +msgstr "" + +#: ../src/viktrwlayer.c:5198 +#, c-format +msgid "Are you sure you want to delete all tracks in %s?" +msgstr "" + +#: ../src/viktrwlayer.c:5211 +#, c-format +msgid "Are you sure you want to delete all routes in %s?" +msgstr "" + +#: ../src/viktrwlayer.c:5221 +#, c-format +msgid "Are you sure you want to delete all waypoints in %s?" +msgstr "" + +#: ../src/viktrwlayer.c:5238 +#, c-format +msgid "Are you sure you want to delete the waypoint \"%s\"?" +msgstr "" + +#: ../src/viktrwlayer.c:5254 +#, c-format +msgid "Are you sure you want to delete the track \"%s\"?" +msgstr "" + +#: ../src/viktrwlayer.c:5271 +#, c-format +msgid "Are you sure you want to delete the route \"%s\"?" +msgstr "" + +#: ../src/viktrwlayer.c:5527 ../src/viktrwlayer.c:6373 +msgid "" +"Converting a track to a route removes extra track data such as segments, " +"timestamps, etc...\n" +"Do you want to continue?" +msgstr "" + +#: ../src/viktrwlayer.c:5631 +msgid "No DEM layers available, thus no DEM values can be applied." +msgstr "" + +#: ../src/viktrwlayer.c:5651 ../src/viktrwlayer.c:5692 +#, c-format +msgid "%ld point adjusted" +msgid_plural "%ld points adjusted" +msgstr[0] "" +msgstr[1] "" + +#: ../src/viktrwlayer.c:5736 +#, c-format +msgid "%ld waypoint changed" +msgid_plural "%ld waypoints changed" +msgstr[0] "" +msgstr[1] "" + +#: ../src/viktrwlayer.c:5917 +#, c-format +msgid "" +"Refining a track with many points (%d) is unlikely to yield sensible " +"results. Do you want to Continue?" +msgstr "" + +#. Select engine from dialog +#: ../src/viktrwlayer.c:5925 +msgid "Refine Route with Routing Engine..." +msgstr "" + +#: ../src/viktrwlayer.c:5933 +msgid "Select routing engine" +msgstr "" + +#: ../src/viktrwlayer.c:6158 +msgid "Failed. No other tracks with timestamps in this layer found" +msgstr "" + +#: ../src/viktrwlayer.c:6160 +msgid "Failed. No other tracks without timestamps in this layer found" +msgstr "" + +#: ../src/viktrwlayer.c:6179 +msgid "Merge with..." +msgstr "" + +#: ../src/viktrwlayer.c:6180 +msgid "Select route to merge with" +msgstr "" + +#: ../src/viktrwlayer.c:6180 +msgid "Select track to merge with" +msgstr "" + +#: ../src/viktrwlayer.c:6264 ../src/viktrwlayer.c:6346 +msgid "Append Route" +msgstr "" + +#: ../src/viktrwlayer.c:6264 ../src/viktrwlayer.c:6346 +msgid "Append Track" +msgstr "" + +#: ../src/viktrwlayer.c:6265 +msgid "Select the route to append after the current route" +msgstr "" + +#: ../src/viktrwlayer.c:6266 +msgid "Select the track to append after the current track" +msgstr "" + +#: ../src/viktrwlayer.c:6347 +msgid "Select the track to append after the current route" +msgstr "" + +#: ../src/viktrwlayer.c:6348 +msgid "Select the route to append after the current track" +msgstr "" + +#: ../src/viktrwlayer.c:6414 +#, c-format +msgid "%d segment merged" +msgid_plural "%d segments merged" +msgstr[0] "" +msgstr[1] "" + +#: ../src/viktrwlayer.c:6430 +msgid "Failed. This track does not have timestamp" +msgstr "" + +#: ../src/viktrwlayer.c:6442 +msgid "Failed. No other track in this layer has timestamp" +msgstr "" + +#: ../src/viktrwlayer.c:6449 +msgid "Merge Threshold..." +msgstr "" + +#: ../src/viktrwlayer.c:6450 +msgid "Merge when time between tracks less than:" +msgstr "" + +#: ../src/viktrwlayer.c:6580 +msgid "Split Threshold..." +msgstr "" + +#: ../src/viktrwlayer.c:6581 +msgid "Split when time between trackpoints exceeds:" +msgstr "" + +#: ../src/viktrwlayer.c:6598 +#, c-format +msgid "" +"Can not split track due to trackpoints not ordered in time - such as at %s.\n" +"\n" +"Goto this trackpoint?" +msgstr "" + +#: ../src/viktrwlayer.c:6668 +msgid "Split Every Nth Point" +msgstr "" + +#: ../src/viktrwlayer.c:6669 +msgid "Split on every Nth point:" +msgstr "" + +#: ../src/viktrwlayer.c:6779 +msgid "Can not split track as it has no segments" +msgstr "" + +#: ../src/viktrwlayer.c:6861 ../src/viktrwlayer.c:6891 +#, c-format +msgid "Deleted %ld point" +msgid_plural "Deleted %ld points" +msgstr[0] "" +msgstr[1] "" + +#: ../src/viktrwlayer.c:6966 ../src/viktrwlayer.c:10989 +#: ../src/viktrwlayer_waypointlist.c:214 +#, c-format +msgid "Could not launch %s to open file." +msgstr "" + +#: ../src/viktrwlayer.c:6992 ../src/viktrwlayer.c:7113 +msgid "This track has no date information." +msgstr "" + +#: ../src/viktrwlayer.c:7006 ../src/viktrwlayer.c:7136 +msgid "This waypoint has no date information." +msgstr "" + +#: ../src/viktrwlayer.c:7030 +#, c-format +msgid "Could not launch %s" +msgstr "" + +#: ../src/viktrwlayer.c:7269 +msgid "Internal Error in vik_trw_layer_uniquify_tracks" +msgstr "" + +#: ../src/viktrwlayer.c:7374 ../src/viktrwlayer.c:7424 +#: ../src/viktrwlayer.c:7587 +msgid "" +"Multiple entries with the same name exist. This method only works with " +"unique names. Force unique names now?" +msgstr "" + +#: ../src/viktrwlayer.c:7385 +msgid "No tracks found" +msgstr "" + +#: ../src/viktrwlayer.c:7393 ../src/viktrwlayer.c:7443 +#: ../src/viktrwlayer.c:7607 +msgid "Delete Selection" +msgstr "" + +#: ../src/viktrwlayer.c:7394 +msgid "Select tracks to delete" +msgstr "" + +#: ../src/viktrwlayer.c:7435 +msgid "No routes found" +msgstr "" + +#: ../src/viktrwlayer.c:7444 +msgid "Select routes to delete" +msgstr "" + +#: ../src/viktrwlayer.c:7550 +msgid "Internal Error in vik_trw_layer_uniquify_waypoints" +msgstr "" + +#: ../src/viktrwlayer.c:7597 +msgid "No waypoints found" +msgstr "" + +#: ../src/viktrwlayer.c:7608 +msgid "Select waypoints to delete" +msgstr "" + +#: ../src/viktrwlayer.c:7691 +#, c-format +msgid "%ld waypoint deleted" +msgid_plural "%ld waypoints deleted" +msgstr[0] "" +msgstr[1] "" + +#: ../src/viktrwlayer.c:7697 +msgid "No duplicates found" +msgstr "" + +#: ../src/viktrwlayer.c:8028 +#, c-format +msgid "" +"A waypoint with the name \"%s\" already exists. Really rename to the same " +"name?" +msgstr "" + +#: ../src/viktrwlayer.c:8058 +#, c-format +msgid "" +"A track with the name \"%s\" already exists. Really rename to the same name?" +msgstr "" + +#: ../src/viktrwlayer.c:8095 +#, c-format +msgid "" +"A route with the name \"%s\" already exists. Really rename to the same name?" +msgstr "" + +#: ../src/viktrwlayer.c:8215 ../src/viktrwlayer.c:8602 +msgid "_Goto" +msgstr "" + +#: ../src/viktrwlayer.c:8226 +msgid "_Visit Geocache Webpage" +msgstr "" + +#: ../src/viktrwlayer.c:8235 +msgid "Geotag multiple images against this waypoint" +msgstr "" + +#: ../src/viktrwlayer.c:8245 ../src/viktrwlayer_waypointlist.c:352 +msgid "_Show Picture..." +msgstr "" + +#: ../src/viktrwlayer.c:8253 +msgid "Update Geotag on _Image" +msgstr "" + +#: ../src/viktrwlayer.c:8259 +msgid "_Update" +msgstr "" + +#: ../src/viktrwlayer.c:8264 +msgid "Update and _Keep File Timestamp" +msgstr "" + +#: ../src/viktrwlayer.c:8276 +msgid "Visit _Webpage" +msgstr "" + +#: ../src/viktrwlayer.c:8306 +msgid "_New Waypoint..." +msgstr "" + +#: ../src/viktrwlayer.c:8315 +msgid "_View All Waypoints" +msgstr "" + +#: ../src/viktrwlayer.c:8327 +msgid "Delete _All Waypoints" +msgstr "" + +#: ../src/viktrwlayer.c:8333 +msgid "_Delete Waypoints From Selection..." +msgstr "" + +#: ../src/viktrwlayer.c:8351 +msgid "_Show All Waypoints" +msgstr "" + +#: ../src/viktrwlayer.c:8357 +msgid "_Hide All Waypoints" +msgstr "" + +#: ../src/viktrwlayer.c:8369 +msgid "_List Waypoints..." +msgstr "" + +#: ../src/viktrwlayer.c:8390 +msgid "_View All Tracks" +msgstr "" + +#: ../src/viktrwlayer.c:8396 +msgid "_New Track" +msgstr "" + +#: ../src/viktrwlayer.c:8404 +msgid "Delete _All Tracks" +msgstr "" + +#: ../src/viktrwlayer.c:8410 +msgid "_Delete Tracks From Selection..." +msgstr "" + +#: ../src/viktrwlayer.c:8422 +msgid "_Show All Tracks" +msgstr "" + +#: ../src/viktrwlayer.c:8428 +msgid "_Hide All Tracks" +msgstr "" + +#: ../src/viktrwlayer.c:8439 +msgid "_List Tracks..." +msgstr "" + +#: ../src/viktrwlayer.c:8467 +msgid "_View All Routes" +msgstr "" + +#: ../src/viktrwlayer.c:8473 +msgid "_New Route" +msgstr "" + +#: ../src/viktrwlayer.c:8499 +msgid "_Show All Routes" +msgstr "" + +#: ../src/viktrwlayer.c:8505 +msgid "_Hide All Routes" +msgstr "" + +#: ../src/viktrwlayer.c:8516 +msgid "_List Routes..." +msgstr "" + +#: ../src/viktrwlayer.c:8587 +msgid "_View Track" +msgstr "" + +#: ../src/viktrwlayer.c:8589 +msgid "_View Route" +msgstr "" + +#: ../src/viktrwlayer.c:8608 +msgid "_Startpoint" +msgstr "" + +#: ../src/viktrwlayer.c:8614 +msgid "\"_Center\"" +msgstr "" + +#: ../src/viktrwlayer.c:8620 +msgid "_Endpoint" +msgstr "" + +#: ../src/viktrwlayer.c:8626 +msgid "_Highest Altitude" +msgstr "" + +#: ../src/viktrwlayer.c:8632 +msgid "_Lowest Altitude" +msgstr "" + +#: ../src/viktrwlayer.c:8640 +msgid "_Maximum Speed" +msgstr "" + +#: ../src/viktrwlayer.c:8646 +msgid "_Date" +msgstr "" + +#: ../src/viktrwlayer.c:8655 +msgid "Co_mbine" +msgstr "" + +#: ../src/viktrwlayer.c:8663 +msgid "_Merge By Time..." +msgstr "" + +#: ../src/viktrwlayer.c:8668 +msgid "Merge _Segments" +msgstr "" + +#: ../src/viktrwlayer.c:8675 +msgid "Merge _With Other Tracks..." +msgstr "" + +#: ../src/viktrwlayer.c:8682 +msgid "_Append Track..." +msgstr "" + +#: ../src/viktrwlayer.c:8684 +msgid "_Append Route..." +msgstr "" + +#: ../src/viktrwlayer.c:8690 +msgid "Append _Route..." +msgstr "" + +#: ../src/viktrwlayer.c:8692 +msgid "Append _Track..." +msgstr "" + +#: ../src/viktrwlayer.c:8699 +msgid "_Split" +msgstr "" + +#: ../src/viktrwlayer.c:8707 +msgid "_Split By Time..." +msgstr "" + +#. ATM always enable this entry - don't want to have to analyse the track before displaying the menu - to keep the menu speedy +#: ../src/viktrwlayer.c:8713 +msgid "Split Se_gments" +msgstr "" + +#: ../src/viktrwlayer.c:8719 +msgid "Split By _Number of Points..." +msgstr "" + +#: ../src/viktrwlayer.c:8724 +msgid "Split at _Trackpoint" +msgstr "" + +#: ../src/viktrwlayer.c:8732 +msgid "_Insert Points" +msgstr "" + +#: ../src/viktrwlayer.c:8738 +msgid "Insert Point _Before Selected Point" +msgstr "" + +#: ../src/viktrwlayer.c:8745 +msgid "Insert Point _After Selected Point" +msgstr "" + +#: ../src/viktrwlayer.c:8754 +msgid "Delete Poi_nts" +msgstr "" + +#: ../src/viktrwlayer.c:8760 +msgid "Delete _Selected Point" +msgstr "" + +#: ../src/viktrwlayer.c:8768 +msgid "Delete Points With The Same _Position" +msgstr "" + +#: ../src/viktrwlayer.c:8773 +msgid "Delete Points With The Same _Time" +msgstr "" + +#: ../src/viktrwlayer.c:8780 ../src/viktrwlayer.c:9029 +msgid "_Transform" +msgstr "" + +#: ../src/viktrwlayer.c:8788 ../src/viktrwlayer.c:9037 +msgid "_Apply DEM Data" +msgstr "" + +#: ../src/viktrwlayer.c:8793 ../src/viktrwlayer.c:9042 +msgid "_Overwrite" +msgstr "" + +#: ../src/viktrwlayer.c:8796 ../src/viktrwlayer.c:9045 +msgid "Overwrite any existing elevation values with DEM values" +msgstr "" + +#: ../src/viktrwlayer.c:8799 ../src/viktrwlayer.c:9048 +msgid "_Keep Existing" +msgstr "" + +#: ../src/viktrwlayer.c:8802 ../src/viktrwlayer.c:9051 +msgid "Keep existing elevation values, only attempt for missing values" +msgstr "" + +#: ../src/viktrwlayer.c:8807 +msgid "_Smooth Missing Elevation Data" +msgstr "" + +#: ../src/viktrwlayer.c:8812 +msgid "_Interpolated" +msgstr "" + +#: ../src/viktrwlayer.c:8815 +msgid "" +"Interpolate between known elevation values to derive values for the missing " +"elevations" +msgstr "" + +#: ../src/viktrwlayer.c:8818 +msgid "_Flat" +msgstr "" + +#: ../src/viktrwlayer.c:8821 +msgid "Set unknown elevation values to the last known value" +msgstr "" + +#: ../src/viktrwlayer.c:8825 +msgid "C_onvert to a Route" +msgstr "" + +#: ../src/viktrwlayer.c:8827 +msgid "C_onvert to a Track" +msgstr "" + +#: ../src/viktrwlayer.c:8835 +msgid "_Anonymize Times" +msgstr "" + +#: ../src/viktrwlayer.c:8838 +msgid "Shift timestamps to a relative offset from 1901-01-01" +msgstr "" + +#: ../src/viktrwlayer.c:8841 +msgid "_Interpolate Times" +msgstr "" + +#: ../src/viktrwlayer.c:8844 +msgid "" +"Reset trackpoint timestamps between the first and last points such that " +"track is traveled at equal speed" +msgstr "" + +#: ../src/viktrwlayer.c:8849 +msgid "_Reverse Track" +msgstr "" + +#: ../src/viktrwlayer.c:8851 +msgid "_Reverse Route" +msgstr "" + +#: ../src/viktrwlayer.c:8858 +msgid "Refine Route..." +msgstr "" + +#: ../src/viktrwlayer.c:8868 +msgid "Down_load Maps Along Track..." +msgstr "" + +#: ../src/viktrwlayer.c:8870 +msgid "Down_load Maps Along Route..." +msgstr "" + +#: ../src/viktrwlayer.c:8878 +msgid "_Export Track as GPX..." +msgstr "" + +#: ../src/viktrwlayer.c:8880 +msgid "_Export Route as GPX..." +msgstr "" + +#: ../src/viktrwlayer.c:8887 +msgid "E_xtend Track End" +msgstr "" + +#: ../src/viktrwlayer.c:8889 +msgid "E_xtend Route End" +msgstr "" + +#: ../src/viktrwlayer.c:8896 +msgid "Extend _Using Route Finder" +msgstr "" + +#: ../src/viktrwlayer.c:8911 +msgid "_Upload to GPS..." +msgstr "" + +#: ../src/viktrwlayer.c:8926 +msgid "_Diary" +msgstr "" + +#: ../src/viktrwlayer.c:8930 +msgid "Open diary program at this date" +msgstr "" + +#: ../src/viktrwlayer.c:8935 +msgid "_Astronomy" +msgstr "" + +#: ../src/viktrwlayer.c:8938 +msgid "Open astronomy program at this date and location" +msgstr "" + +#: ../src/viktrwlayer.c:8962 +msgid "_View Google Directions" +msgstr "" + +#: ../src/viktrwlayer.c:8984 +msgid "Use with _Filter" +msgstr "" + +#: ../src/viktrwlayer.c:9018 +msgid "_Edit Trackpoint" +msgstr "" + +#: ../src/viktrwlayer.c:10116 +#, c-format +msgid " - Gain %dm:Loss %dm" +msgstr "" + +#: ../src/viktrwlayer.c:10118 +#, c-format +msgid " - Gain %dft:Loss %dft" +msgstr "" + +#: ../src/viktrwlayer.c:10123 +#, c-format +msgid " - Bearing %3.1f° - Step %s" +msgstr "" + +#: ../src/viktrwlayer.c:10232 +#, c-format +msgid "Querying %s for route between (%.3f, %.3f) and (%.3f, %.3f)." +msgstr "" + +#: ../src/viktrwlayer.c:10248 +#, c-format +msgid "%s returned route between (%.3f, %.3f) and (%.3f, %.3f)." +msgstr "" + +#: ../src/viktrwlayer.c:10251 +#, c-format +msgid "Error getting route from %s." +msgstr "" + +#: ../src/viktrwlayer.c:11070 +#, c-format +msgid "Creating %d Image Thumbnails..." +msgstr "" + +#: ../src/viktrwlayer.c:11560 +msgid "No map layer in use. Create one first" +msgstr "" + +#: ../src/viktrwlayer.c:11679 +#, c-format +msgid "%s: Track List" +msgstr "" + +#: ../src/viktrwlayer.c:11681 +#, c-format +msgid "%s: Route List" +msgstr "" + +#: ../src/viktrwlayer.c:11734 +#, c-format +msgid "" +"Could not write external layer %s to %s, please fix and save before exiting " +"or data will be lost" +msgstr "" + +#: ../src/viktrwlayer.c:11782 +#, c-format +msgid "WARNING: issues encountered loading external layer %s from %s" +msgstr "" + +#: ../src/viktrwlayer_export.c:47 +msgid "Auto Device GPX Simplify:" +msgstr "" + +#: ../src/viktrwlayer_export.c:48 +msgid "" +"GPX saves to certain devices will be simplified for device compatibility." +msgstr "" + +#: ../src/viktrwlayer_export.c:125 +#, c-format +msgid "Export of GPX file simplified using point limit: %d" +msgstr "" + +#: ../src/viktrwlayer_export.c:206 ../src/viktrwlayer_export.c:323 +#: ../src/vikwindow.c:3694 +msgid "The filename you requested could not be opened for writing." +msgstr "" + +#: ../src/viktrwlayer_export.c:226 +#, c-format +msgid "Could not launch %s." +msgstr "" + +#: ../src/viktrwlayer_export.c:234 +msgid "Could not create temporary file for export." +msgstr "" + +#: ../src/viktrwlayer_export.c:268 +msgid "File format:" +msgstr "" + +#: ../src/viktrwlayer_export.c:276 +msgid "Select the file format." +msgstr "" + +#: ../src/viktrwlayer_export.c:281 +msgid "" +"Select the information to process.\n" +"Warning: the behavior of these switches is highly dependent of the file " +"format selected.\n" +"Please, refer to GPSbabel if unsure." +msgstr "" + +#: ../src/viktrwlayer_export.c:308 +msgid "You did not select a valid file format." +msgstr "" + +#: ../src/viktrwlayer_propwin.c:915 ../src/viktrwlayer_propwin.c:3381 +#: ../src/viktrwlayer_propwin.c:3417 ../src/viktrwlayer_propwin.c:3457 +#: ../src/viktrwlayer_propwin.c:3509 ../src/viktrwlayer_propwin.c:3527 +#: ../src/viktrwlayer_propwin.c:3600 ../src/viktrwlayer_propwin.c:3601 +#: ../src/viktrwlayer_propwin.c:3602 ../src/viktrwlayer_propwin.c:3611 +#: ../src/viktrwlayer_propwin.c:3612 ../src/viktrwlayer_propwin.c:3629 +#: ../src/viktrwlayer_propwin.c:3630 ../src/viktrwlayer_propwin.c:3644 +#: ../src/viktrwlayer_propwin.c:3645 ../src/viktrwlayer_propwin.c:3646 +#: ../src/viktrwlayer_propwin.c:3660 ../src/viktrwlayer_propwin.c:3661 +#: ../src/viktrwlayer_propwin.c:3662 ../src/viktrwlayer_propwin.c:3676 +#: ../src/viktrwlayer_propwin.c:3677 ../src/viktrwlayer_propwin.c:3678 +#: ../src/viktrwlayer_propwin.c:3695 ../src/viktrwlayer_propwin.c:3696 +#: ../src/viktrwlayer_analysis.c:293 +#, c-format +msgid "No Data" +msgstr "" + +#: ../src/viktrwlayer_propwin.c:960 ../src/viktrwlayer_propwin.c:1245 +#, c-format +msgid "%.1f kph" +msgstr "" + +#: ../src/viktrwlayer_propwin.c:963 ../src/viktrwlayer_propwin.c:1248 +#: ../src/viktrwlayer_analysis.c:352 +#, c-format +msgid "%.1f mph" +msgstr "" + +#: ../src/viktrwlayer_propwin.c:966 ../src/viktrwlayer_propwin.c:1251 +#, c-format +msgid "%.1f knots" +msgstr "" + +#: ../src/viktrwlayer_propwin.c:969 ../src/viktrwlayer_propwin.c:1254 +#, c-format +msgid "%.1f s/km" +msgstr "" + +#: ../src/viktrwlayer_propwin.c:972 ../src/viktrwlayer_propwin.c:1257 +#: ../src/viktrwlayer_analysis.c:389 ../src/viktrwlayer_analysis.c:392 +#, c-format +msgid "%.1f min/km" +msgstr "" + +#: ../src/viktrwlayer_propwin.c:975 ../src/viktrwlayer_propwin.c:1260 +#, c-format +msgid "%.1f sec/mi" +msgstr "" + +#: ../src/viktrwlayer_propwin.c:978 ../src/viktrwlayer_propwin.c:1263 +#: ../src/viktrwlayer_analysis.c:409 ../src/viktrwlayer_analysis.c:412 +#, c-format +msgid "%.1f min/mi" +msgstr "" + +#. VIK_UNITS_SPEED_METRES_PER_SECOND: +#: ../src/viktrwlayer_propwin.c:982 ../src/viktrwlayer_propwin.c:1267 +#, c-format +msgid "%.1f m/s" +msgstr "" + +#. Minutes +#: ../src/viktrwlayer_propwin.c:1411 +msgid "mins" +msgstr "" + +#. Hours +#: ../src/viktrwlayer_propwin.c:1418 +msgid "h" +msgstr "" + +#. Days +#: ../src/viktrwlayer_propwin.c:1424 +msgid "d" +msgstr "" + +#. Weeks +#: ../src/viktrwlayer_propwin.c:1429 +msgid "w" +msgstr "" + +#. 'Months' +#: ../src/viktrwlayer_propwin.c:1433 +msgid "M" +msgstr "" + +#: ../src/viktrwlayer_propwin.c:2051 ../src/viktrwlayer_analysis.c:303 +#, c-format +msgid "%.1f miles" +msgstr "" + +#: ../src/viktrwlayer_propwin.c:2054 ../src/viktrwlayer_analysis.c:306 +#, c-format +msgid "%.1f NM" +msgstr "" + +#. VIK_UNITS_DISTANCE_KILOMETRES +#: ../src/viktrwlayer_propwin.c:2057 ../src/viktrwlayer_analysis.c:310 +#, c-format +msgid "%.1f km" +msgstr "" + +#: ../src/viktrwlayer_propwin.c:3083 +msgid "Failed spliting track. Track unchanged" +msgstr "" + +#: ../src/viktrwlayer_propwin.c:3234 ../src/viktrwlayer_propwin.c:3744 +#, c-format +msgid "%s - Track Properties" +msgstr "" + +#: ../src/viktrwlayer_propwin.c:3239 +msgid "Split at _Marker" +msgstr "" + +#: ../src/viktrwlayer_propwin.c:3240 +msgid "Split _Segments" +msgstr "" + +#: ../src/viktrwlayer_propwin.c:3241 +msgid "_Reverse" +msgstr "" + +#: ../src/viktrwlayer_propwin.c:3242 +msgid "_Delete Dupl." +msgstr "" + +#: ../src/viktrwlayer_propwin.c:3269 +msgid "Comment:" +msgstr "" + +#: ../src/viktrwlayer_propwin.c:3270 +msgid "Description:" +msgstr "" + +#: ../src/viktrwlayer_propwin.c:3271 +msgid "Source:" +msgstr "" + +#: ../src/viktrwlayer_propwin.c:3272 +msgid "Type:" +msgstr "" + +#: ../src/viktrwlayer_propwin.c:3273 +msgid "Color:" +msgstr "" + +#: ../src/viktrwlayer_propwin.c:3274 +msgid "Draw Name:" +msgstr "" + +#: ../src/viktrwlayer_propwin.c:3275 +msgid "Distance Labels:" +msgstr "" + +#: ../src/viktrwlayer_propwin.c:3278 +msgid "Track Length:" +msgstr "" + +#: ../src/viktrwlayer_propwin.c:3279 +msgid "Trackpoints:" +msgstr "" + +#: ../src/viktrwlayer_propwin.c:3280 +msgid "Segments:" +msgstr "" + +#: ../src/viktrwlayer_propwin.c:3281 +msgid "Duplicate Points:" +msgstr "" + +#: ../src/viktrwlayer_propwin.c:3282 +msgid "Max Speed:" +msgstr "" + +#: ../src/viktrwlayer_propwin.c:3283 +msgid "Avg. Speed:" +msgstr "" + +#: ../src/viktrwlayer_propwin.c:3284 +msgid "Moving Avg. Speed:" +msgstr "" + +#: ../src/viktrwlayer_propwin.c:3285 +msgid "Avg. Dist. Between TPs:" +msgstr "" + +#: ../src/viktrwlayer_propwin.c:3286 +msgid "Elevation Range:" +msgstr "" + +#: ../src/viktrwlayer_propwin.c:3287 +msgid "Total Elevation Gain/Loss:" +msgstr "" + +#: ../src/viktrwlayer_propwin.c:3288 +msgid "Start:" +msgstr "" + +#: ../src/viktrwlayer_propwin.c:3289 +msgid "End:" +msgstr "" + +#: ../src/viktrwlayer_propwin.c:3290 +msgid "Duration:" +msgstr "" + +#: ../src/viktrwlayer_propwin.c:3320 +msgid "Centre" +msgstr "" + +#: ../src/viktrwlayer_propwin.c:3321 +msgid "Start only" +msgstr "" + +#: ../src/viktrwlayer_propwin.c:3322 +msgid "End only" +msgstr "" + +#: ../src/viktrwlayer_propwin.c:3323 +msgid "Start and End" +msgstr "" + +#: ../src/viktrwlayer_propwin.c:3324 +msgid "Centre, Start and End" +msgstr "" + +#: ../src/viktrwlayer_propwin.c:3336 +msgid "Maximum number of distance labels to be shown" +msgstr "" + +#: ../src/viktrwlayer_propwin.c:3340 +msgid "Properties" +msgstr "" + +#: ../src/viktrwlayer_propwin.c:3584 +#, c-format +msgid "%d minutes - %d minutes moving" +msgstr "" + +#: ../src/viktrwlayer_propwin.c:3596 +#, c-format +msgid "%s total - %s in segments" +msgstr "" + +#: ../src/viktrwlayer_propwin.c:3607 ../src/viktrwlayer_analysis.c:622 +msgid "Statistics" +msgstr "" + +#: ../src/viktrwlayer_propwin.c:3613 ../src/viktrwlayer_propwin.c:3680 +msgid "Show D_EM" +msgstr "" + +#: ../src/viktrwlayer_propwin.c:3615 ../src/viktrwlayer_propwin.c:3631 +#: ../src/viktrwlayer_propwin.c:3647 ../src/viktrwlayer_propwin.c:3697 +msgid "Show _GPS Speed" +msgstr "" + +#: ../src/viktrwlayer_propwin.c:3617 ../src/viktrwlayer_propwin.c:3633 +#: ../src/viktrwlayer_propwin.c:3665 ../src/viktrwlayer_propwin.c:3699 +msgid "Track Distance:" +msgstr "" + +#: ../src/viktrwlayer_propwin.c:3618 ../src/viktrwlayer_propwin.c:3684 +msgid "Track Height:" +msgstr "" + +#: ../src/viktrwlayer_propwin.c:3624 +msgid "Elevation-distance" +msgstr "" + +#: ../src/viktrwlayer_propwin.c:3634 +msgid "Track Gradient:" +msgstr "" + +#: ../src/viktrwlayer_propwin.c:3639 +msgid "Gradient-distance" +msgstr "" + +#: ../src/viktrwlayer_propwin.c:3649 ../src/viktrwlayer_propwin.c:3666 +#: ../src/viktrwlayer_propwin.c:3683 +msgid "Track Time:" +msgstr "" + +#: ../src/viktrwlayer_propwin.c:3650 ../src/viktrwlayer_propwin.c:3700 +msgid "Track Speed:" +msgstr "" + +#: ../src/viktrwlayer_propwin.c:3651 ../src/viktrwlayer_propwin.c:3667 +#: ../src/viktrwlayer_propwin.c:3685 +msgid "Time/Date:" +msgstr "" + +#: ../src/viktrwlayer_propwin.c:3655 +msgid "Speed-time" +msgstr "" + +#: ../src/viktrwlayer_propwin.c:3663 ../src/viktrwlayer_propwin.c:3679 +msgid "Show S_peed" +msgstr "" + +#: ../src/viktrwlayer_propwin.c:3671 +msgid "Distance-time" +msgstr "" + +#: ../src/viktrwlayer_propwin.c:3690 +msgid "Elevation-time" +msgstr "" + +#: ../src/viktrwlayer_propwin.c:3705 +msgid "Speed-distance" +msgstr "" + +#: ../src/viktrwlayer_tpwin.c:190 ../src/viktrwlayer_wpwin.c:66 +msgid "Date/Time Edit" +msgstr "" + +#: ../src/viktrwlayer_tpwin.c:242 +msgid "Name:" +msgstr "" + +#: ../src/viktrwlayer_tpwin.c:243 +msgid "Latitude:" +msgstr "" + +#: ../src/viktrwlayer_tpwin.c:244 +msgid "Longitude:" +msgstr "" + +#: ../src/viktrwlayer_tpwin.c:245 +msgid "Altitude:" +msgstr "" + +#: ../src/viktrwlayer_tpwin.c:246 +msgid "Course:" +msgstr "" + +#: ../src/viktrwlayer_tpwin.c:247 +msgid "Timestamp:" +msgstr "" + +#: ../src/viktrwlayer_tpwin.c:248 +msgid "Time:" +msgstr "" + +#: ../src/viktrwlayer_tpwin.c:249 +msgid "Distance Difference:" +msgstr "" + +#: ../src/viktrwlayer_tpwin.c:250 +msgid "Time Difference:" +msgstr "" + +#: ../src/viktrwlayer_tpwin.c:251 +msgid "\"Speed\" Between:" +msgstr "" + +#: ../src/viktrwlayer_tpwin.c:252 +msgid "Speed:" +msgstr "" + +#: ../src/viktrwlayer_tpwin.c:253 +msgid "VDOP:" +msgstr "" + +#: ../src/viktrwlayer_tpwin.c:254 +msgid "HDOP:" +msgstr "" + +#: ../src/viktrwlayer_tpwin.c:255 +msgid "PDOP:" +msgstr "" + +#: ../src/viktrwlayer_tpwin.c:256 +msgid "SAT/FIX:" +msgstr "" + +#: ../src/viktrwlayer_tpwin.c:263 ../src/viktrwlayer_tpwin.c:408 +#: ../src/viktrwlayer_tpwin.c:622 +msgid "Trackpoint" +msgstr "" + +#: ../src/viktrwlayer_tpwin.c:266 +msgid "_Insert After" +msgstr "" + +#: ../src/viktrwlayer_tpwin.c:268 +msgid "Split Here" +msgstr "" + +#: ../src/viktrwlayer_tracklist.c:262 ../src/viktrwlayer_waypointlist.c:306 +msgid "_Copy Data" +msgstr "" + +#. +#. item = gtk_image_menu_item_new_with_mnemonic ( _("_Select") ); +#. gtk_image_menu_item_set_image ( (GtkImageMenuItem*)item, gtk_image_new_from_stock (GTK_STOCK_FIND, GTK_ICON_SIZE_MENU) ); +#. g_signal_connect_swapped ( G_OBJECT(item), "activate", G_CALLBACK(trw_layer_track_select), values ); +#. gtk_menu_shell_append (GTK_MENU_SHELL (menu), item); +#. gtk_widget_show ( item ); +#. +#. ATM view auto selects, so don't bother with separate select menu entry +#. +#. item = gtk_image_menu_item_new_with_mnemonic ( _("_Select") ); +#. gtk_image_menu_item_set_image ( (GtkImageMenuItem*)item, gtk_image_new_from_stock (GTK_STOCK_FIND, GTK_ICON_SIZE_MENU) ); +#. g_signal_connect_swapped ( G_OBJECT(item), "activate", G_CALLBACK(trw_layer_waypoint_select), values ); +#. gtk_menu_shell_append (GTK_MENU_SHELL (menu), item); +#. gtk_widget_show ( item ); +#. +#. AUTO SELECT NOT TRUE YET... +#. ATM view auto selects, so don't bother with separate select menu entry +#: ../src/viktrwlayer_tracklist.c:290 ../src/viktrwlayer_waypointlist.c:341 +#: ../src/vikwindow.c:4816 +msgid "_View" +msgstr "" + +#. Insert column for the layer name when viewing multi layers +#: ../src/viktrwlayer_tracklist.c:613 ../src/viktrwlayer_waypointlist.c:609 +msgid "Layer" +msgstr "" + +#: ../src/viktrwlayer_tracklist.c:627 ../src/viktrwlayer_waypointlist.c:624 +msgid "Date" +msgstr "" + +#: ../src/viktrwlayer_tracklist.c:631 ../src/viktrwlayer_waypointlist.c:628 +msgid "Visible" +msgstr "" + +#: ../src/viktrwlayer_tracklist.c:639 +msgid "" +"Distance\n" +"(miles)" +msgstr "" + +#: ../src/viktrwlayer_tracklist.c:642 +msgid "" +"Distance\n" +"(NM)" +msgstr "" + +#: ../src/viktrwlayer_tracklist.c:645 +msgid "" +"Distance\n" +"(km)" +msgstr "" + +#: ../src/viktrwlayer_tracklist.c:651 +msgid "" +"Length\n" +"(minutes)" +msgstr "" + +#: ../src/viktrwlayer_tracklist.c:660 ../src/vikutils.c:93 +msgid "sec/mi" +msgstr "" + +#: ../src/viktrwlayer_tracklist.c:666 +#, c-format +msgid "" +"Av. Speed\n" +"(%s)" +msgstr "" + +#. Apply own formatting of the data +#: ../src/viktrwlayer_tracklist.c:671 +#, c-format +msgid "" +"Max Speed\n" +"(%s)" +msgstr "" + +#: ../src/viktrwlayer_tracklist.c:679 ../src/viktrwlayer_waypointlist.c:637 +msgid "" +"Max Height\n" +"(Feet)" +msgstr "" + +#: ../src/viktrwlayer_tracklist.c:681 ../src/viktrwlayer_waypointlist.c:639 +msgid "" +"Max Height\n" +"(Metres)" +msgstr "" + +#: ../src/viktrwlayer_waypointlist.c:312 +msgid "Copy Data (with _positions)" +msgstr "" + +#: ../src/viktrwlayer_waypointlist.c:633 +msgid "Comment" +msgstr "" + +#: ../src/viktrwlayer_waypointlist.c:643 +msgid "Symbol" +msgstr "" + +#: ../src/viktrwlayer_wpwin.c:93 ../src/viktrwlayer_wpwin.c:302 +msgid "True" +msgstr "" + +#: ../src/viktrwlayer_wpwin.c:122 +msgid "Waypoint Properties" +msgstr "" + +#: ../src/viktrwlayer_wpwin.c:164 +msgid "Name:" +msgstr "" + +#: ../src/viktrwlayer_wpwin.c:181 +msgid "Altitude:" +msgstr "" + +#: ../src/viktrwlayer_wpwin.c:186 ../src/viktrwlayer_wpwin.c:188 +msgid "Comment:" +msgstr "" + +#: ../src/viktrwlayer_wpwin.c:202 +msgid "Source:" +msgstr "" + +#: ../src/viktrwlayer_wpwin.c:212 +msgid "Image:" +msgstr "" + +#: ../src/viktrwlayer_wpwin.c:217 +msgid "Symbol:" +msgstr "" + +#: ../src/viktrwlayer_wpwin.c:226 +msgid "(none)" +msgstr "" + +#. Geotag Info [readonly] +#: ../src/viktrwlayer_wpwin.c:272 +msgid "Has Geotag" +msgstr "" + +#: ../src/viktrwlayer_wpwin.c:279 +msgid "Consistent Position" +msgstr "" + +#. ATM the direction value box is always shown, even when there is no information. +#. It would be nice to be able to hide it until the 'Add' has been performed, +#. however I've not been able to achieve this. +#. Thus simply sensistizing it instead. +#: ../src/viktrwlayer_wpwin.c:292 +msgid "Image Direction:" +msgstr "" + +#: ../src/viktrwlayer_wpwin.c:300 +msgid "Magnetic" +msgstr "" + +#: ../src/viktrwlayer_wpwin.c:320 +msgid "Time:" +msgstr "" + +#. TODO: other checks (isalpha or whatever ) +#: ../src/viktrwlayer_wpwin.c:386 +msgid "Please enter a name for the waypoint." +msgstr "" + +#: ../src/viktrwlayer_geotag.c:320 ../src/viktrwlayer_geotag.c:460 +#, c-format +msgid "Failed updating EXIF on %s" +msgstr "" + +#: ../src/viktrwlayer_geotag.c:562 +#, c-format +msgid "Geotagging %d Images..." +msgstr "" + +#: ../src/viktrwlayer_geotag.c:630 +msgid "Geotag Images" +msgstr "" + +#: ../src/viktrwlayer_geotag.c:640 +msgid "Images" +msgstr "" + +#: ../src/viktrwlayer_geotag.c:645 +msgid "Overwrite Existing Waypoints:" +msgstr "" + +#: ../src/viktrwlayer_geotag.c:648 +msgid "Overwrite Existing GPS Information:" +msgstr "" + +#: ../src/viktrwlayer_geotag.c:650 +msgid "Keep File Modification Timestamp:" +msgstr "" + +#: ../src/viktrwlayer_geotag.c:684 +msgid "Create Waypoints:" +msgstr "" + +#: ../src/viktrwlayer_geotag.c:693 +msgid "Write EXIF:" +msgstr "" + +#: ../src/viktrwlayer_geotag.c:705 +msgid "Automatic Image Direction:" +msgstr "" + +#: ../src/viktrwlayer_geotag.c:707 +msgid "Set image direction based on a heading derived from the track" +msgstr "" + +#: ../src/viktrwlayer_geotag.c:710 +msgid "Interpolate Between Track Segments:" +msgstr "" + +#: ../src/viktrwlayer_geotag.c:715 +msgid "Image Time Offset (Seconds):" +msgstr "" + +#: ../src/viktrwlayer_geotag.c:718 +msgid "" +"The number of seconds to ADD to the photos time to make it match the GPS " +"data. Calculate this with (GPS - Photo). Can be negative or positive. Useful " +"to adjust times when a camera's timestamp was incorrect." +msgstr "" + +#: ../src/viktrwlayer_geotag.c:721 +msgid "Image Timezone:" +msgstr "" + +#: ../src/viktrwlayer_geotag.c:724 +msgid "" +"The timezone that was used when the images were created. For example, if a " +"camera is set to AWST or +8:00 hours. Enter +8:00 here so that the correct " +"adjustment to the images' time can be made. GPS data is always in UTC." +msgstr "" + +#: ../src/viktrwlayer_geotag.c:728 +#, c-format +msgid "Using waypoint: %s" +msgstr "" + +#: ../src/viktrwlayer_geotag.c:742 +#, c-format +msgid "Using track: %s" +msgstr "" + +#: ../src/viktrwlayer_geotag.c:744 +#, c-format +msgid "Using all tracks in: %s" +msgstr "" + +#: ../src/viktrwlayer_analysis.c:214 +msgid "Number of Tracks" +msgstr "" + +#: ../src/viktrwlayer_analysis.c:215 +msgid "Date Range" +msgstr "" + +#: ../src/viktrwlayer_analysis.c:216 +msgid "Total Length" +msgstr "" + +#: ../src/viktrwlayer_analysis.c:217 +msgid "Average Length" +msgstr "" + +#: ../src/viktrwlayer_analysis.c:218 +msgid "Eddington number" +msgstr "" + +#. No.4: Extended display only +#: ../src/viktrwlayer_analysis.c:219 +msgid "Max Speed" +msgstr "" + +#: ../src/viktrwlayer_analysis.c:220 +msgid "Avg. Speed" +msgstr "" + +#: ../src/viktrwlayer_analysis.c:221 +msgid "Minimum Altitude" +msgstr "" + +#: ../src/viktrwlayer_analysis.c:222 +msgid "Maximum Altitude" +msgstr "" + +#: ../src/viktrwlayer_analysis.c:223 +msgid "Total Elevation Gain/Loss" +msgstr "" + +#: ../src/viktrwlayer_analysis.c:224 +msgid "Avg. Elevation Gain/Loss" +msgstr "" + +#: ../src/viktrwlayer_analysis.c:225 +msgid "Total Duration" +msgstr "" + +#: ../src/viktrwlayer_analysis.c:226 +msgid "Avg. Duration" +msgstr "" + +#: ../src/viktrwlayer_analysis.c:317 +#, c-format +msgid "%.2f miles" +msgstr "" + +#: ../src/viktrwlayer_analysis.c:320 +#, c-format +msgid "%.2f NM" +msgstr "" + +#. VIK_UNITS_DISTANCE_KILOMETRES +#: ../src/viktrwlayer_analysis.c:324 +#, c-format +msgid "%.2f km" +msgstr "" + +#: ../src/viktrwlayer_analysis.c:361 +#, c-format +msgid "%.2f m/s" +msgstr "" + +#: ../src/viktrwlayer_analysis.c:370 ../src/viktrwlayer_analysis.c:373 +#, c-format +msgid "%.2f knots" +msgstr "" + +#: ../src/viktrwlayer_analysis.c:379 ../src/viktrwlayer_analysis.c:382 +#, c-format +msgid "%d s/km" +msgstr "" + +#: ../src/viktrwlayer_analysis.c:399 ../src/viktrwlayer_analysis.c:402 +#, c-format +msgid "%d sec/mi" +msgstr "" + +#: ../src/viktrwlayer_analysis.c:420 ../src/viktrwlayer_analysis.c:423 +#, c-format +msgid "%.2f km/h" +msgstr "" + +#: ../src/viktrwlayer_analysis.c:434 ../src/viktrwlayer_analysis.c:440 +#, c-format +msgid "%d feet" +msgstr "" + +#: ../src/viktrwlayer_analysis.c:445 ../src/viktrwlayer_analysis.c:447 +#, c-format +msgid "%d feet / %d feet" +msgstr "" + +#: ../src/viktrwlayer_analysis.c:452 ../src/viktrwlayer_analysis.c:458 +#, c-format +msgid "%d m" +msgstr "" + +#: ../src/viktrwlayer_analysis.c:463 ../src/viktrwlayer_analysis.c:465 +#, c-format +msgid "%d m / %d m" +msgstr "" + +#: ../src/viktrwlayer_analysis.c:477 +#, c-format +msgid "%d:%02d:%02d days:hrs:mins" +msgstr "" + +#: ../src/viktrwlayer_analysis.c:484 +#, c-format +msgid "%d:%02d hrs:mins" +msgstr "" + +#: ../src/viktrwlayer_analysis.c:658 +msgid "Include Invisible Items" +msgstr "" + +#: ../src/vikstatus.c:129 +msgid "Current number of background tasks. Click to see the background jobs." +msgstr "" + +#: ../src/vikstatus.c:134 +msgid "Current zoom level. Click to select a new one." +msgstr "" + +#: ../src/vikstatus.c:141 +msgid "Left click to clear the message. Right click to copy the message." +msgstr "" + +#: ../src/vikutils.c:108 +msgid "GPSD" +msgstr "" + +#. GPS Preamble +#: ../src/vikutils.c:109 +msgid "Trkpt" +msgstr "" + +#: ../src/vikutils.c:160 +#, c-format +msgid "%sSpeed%s %.1f%s" +msgstr "" + +#. Go for 2dp as expect low values for vertical speeds +#: ../src/vikutils.c:214 +#, c-format +msgid "%sClimb%s %.2f%s" +msgstr "" + +#: ../src/vikutils.c:223 +#, c-format +msgid "%sAlt %dfeet" +msgstr "" + +#. VIK_UNITS_HEIGHT_METRES: +#: ../src/vikutils.c:227 +#, c-format +msgid "%sAlt %dm" +msgstr "" + +#: ../src/vikutils.c:235 +#, c-format +msgid "%sCourse %03d°" +msgstr "" + +#: ../src/vikutils.c:249 +msgid "yards" +msgstr "" + +#. VIK_UNITS_DISTANCE_KILOMETRES: +#: ../src/vikutils.c:253 +msgid "m" +msgstr "" + +#: ../src/vikutils.c:257 +#, c-format +msgid "%sDistance diff %d%s" +msgstr "" + +#: ../src/vikutils.c:272 +#, c-format +msgid "%sTime %s" +msgstr "" + +#: ../src/vikutils.c:281 +#, c-format +msgid "%sTime diff %lds" +msgstr "" + +#: ../src/vikutils.c:287 +#, c-format +msgid "%sNo. of Sats %d" +msgstr "" + +#: ../src/vikutils.c:312 +#, c-format +msgid "%sTo End %.2f%s" +msgstr "" + +#: ../src/vikutils.c:339 +#, c-format +msgid "%sDistance along %.2f%s" +msgstr "" + +#: ../src/vikutils.c:359 +#, c-format +msgid "%sTrack: %s" +msgstr "" + +#: ../src/vikutils.c:396 +#, c-format +msgid "" +"There is a newer version of Viking available: %s\n" +"\n" +"Do you wish to go to Viking's website now?" +msgstr "" + +#: ../src/vikutils.c:526 +msgid "" +"This appears to be Viking's very first run.\n" +"\n" +"Do you wish to enable automatic internet features?\n" +"\n" +"Individual settings can be controlled in the Preferences." +msgstr "" + +#: ../src/vikwaypoint.c:37 +msgid "Waypoint" +msgstr "" + +#: ../src/vikwebtool_datasource.c:352 +msgid "Search Term" +msgstr "" + +#. TODO get rid of this as this is unnecessary duplication... +#: ../src/vikwindow.c:258 +msgid "Pan" +msgstr "" + +#: ../src/vikwindow.c:258 +msgid "Zoom" +msgstr "" + +#: ../src/vikwindow.c:258 +msgid "Ruler" +msgstr "" + +#: ../src/vikwindow.c:258 +msgid "Select" +msgstr "" + +#: ../src/vikwindow.c:368 +msgid "This is Viking " +msgstr "" + +#: ../src/vikwindow.c:457 +msgid "Location lookup aborted" +msgstr "" + +#: ../src/vikwindow.c:477 +#, c-format +msgid "Location found: %s" +msgstr "" + +#: ../src/vikwindow.c:486 +msgid "Unable to determine location" +msgstr "" + +#: ../src/vikwindow.c:495 +msgid "Determining location" +msgstr "" + +#: ../src/vikwindow.c:525 +#, c-format +msgid "Location found via geoclue" +msgstr "" + +#: ../src/vikwindow.c:546 +msgid "Default Map" +msgstr "" + +#: ../src/vikwindow.c:557 ../src/vikwindow.c:3938 +msgid "Trying to determine location..." +msgstr "" + +#. Create tooltip +#: ../src/vikwindow.c:723 +msgid "Select zoom level" +msgstr "" + +#: ../src/vikwindow.c:1176 +#, c-format +msgid "" +"Do you want to save the changes you made to the document \"%s\"?\n" +"\n" +"Your changes will be lost if you don't save them." +msgstr "" + +#: ../src/vikwindow.c:1180 +msgid "Don't Save" +msgstr "" + +#: ../src/vikwindow.c:1268 +msgid "mpp" +msgstr "" + +#: ../src/vikwindow.c:1268 +msgid "pixelfact" +msgstr "" + +#: ../src/vikwindow.c:1467 +#, c-format +msgid "%s %s %dm" +msgstr "" + +#: ../src/vikwindow.c:1469 +#, c-format +msgid "%s %s %dft" +msgstr "" + +#: ../src/vikwindow.c:1472 +#, c-format +msgid "%s %s" +msgstr "" + +#: ../src/vikwindow.c:1929 +msgid "_Ruler" +msgstr "" + +#: ../src/vikwindow.c:1929 +msgid "Ruler Tool" +msgstr "" + +#: ../src/vikwindow.c:2204 ../src/vikwindow.c:4818 +msgid "_Zoom" +msgstr "" + +#: ../src/vikwindow.c:2204 +msgid "Zoom Tool" +msgstr "" + +#: ../src/vikwindow.c:2271 ../src/vikwindow.c:4819 +msgid "_Pan" +msgstr "" + +#: ../src/vikwindow.c:2271 +msgid "Pan Tool" +msgstr "" + +#: ../src/vikwindow.c:2425 +msgid "_Select" +msgstr "" + +#: ../src/vikwindow.c:2425 +msgid "Select Tool" +msgstr "" + +#: ../src/vikwindow.c:2615 +msgid "You must select a layer to show its properties." +msgstr "" + +#. No error to show, so unlikely this will get called +#: ../src/vikwindow.c:2629 +msgid "The help system is not available." +msgstr "" + +#. Main error path +#: ../src/vikwindow.c:2632 +#, c-format +msgid "" +"Help is not available because: %s.\n" +"Ensure a Mime Type ghelp handler program is installed (e.g. yelp)." +msgstr "" + +#: ../src/vikwindow.c:2865 +msgid "You must select a layer to delete." +msgstr "" + +#: ../src/vikwindow.c:3171 +msgid "Untitled" +msgstr "" + +#: ../src/vikwindow.c:3300 +#, c-format +msgid "Unable to add '%s' to the list of recently used documents" +msgstr "" + +#: ../src/vikwindow.c:3391 +msgid "The file you requested could not be opened." +msgstr "" + +#: ../src/vikwindow.c:3394 +msgid "" +"GPSBabel is required to load files of this type or GPSBabel encountered " +"problems." +msgstr "" + +#: ../src/vikwindow.c:3397 +#, c-format +msgid "Unable to load malformed GPX file %s" +msgstr "" + +#: ../src/vikwindow.c:3400 +#, c-format +msgid "Unsupported file type for %s" +msgstr "" + +#. Since we can process .vik files with issues just show a warning in the status bar +#. Not that a user can do much about it... or tells them what this issue is yet... +#: ../src/vikwindow.c:3406 +#, c-format +msgid "WARNING: issues encountered loading %s" +msgstr "" + +#: ../src/vikwindow.c:3489 +msgid "Please select a GPS data file to open. " +msgstr "" + +#: ../src/vikwindow.c:3508 +msgid "Google Earth" +msgstr "" + +#: ../src/vikwindow.c:3523 ../src/vikwindow.c:3646 ../src/viking.desktop.in.h:1 +msgid "Viking" +msgstr "" + +#: ../src/vikwindow.c:3594 ../src/vikwindow.c:4632 +msgid "Open File" +msgstr "" + +#: ../src/vikwindow.c:3630 +msgid "Save as Viking File." +msgstr "" + +#: ../src/vikwindow.c:3757 +#, c-format +msgid "Exporting to file: %s" +msgstr "" + +#. Confirm what happened. +#: ../src/vikwindow.c:3774 +#, c-format +msgid "Exported files: %d" +msgstr "" + +#: ../src/vikwindow.c:3786 +msgid "Nothing to Export!" +msgstr "" + +#: ../src/vikwindow.c:3790 +msgid "Export to directory" +msgstr "" + +#: ../src/vikwindow.c:3809 +msgid "Could not convert all files" +msgstr "" + +#: ../src/vikwindow.c:3851 +msgid "File not accessible" +msgstr "" + +#: ../src/vikwindow.c:3854 +msgid "No Viking File" +msgstr "" + +#: ../src/vikwindow.c:3998 +msgid "This layer has no configurable properties." +msgstr "" + +#: ../src/vikwindow.c:4080 +msgid "Are you sure you wish to delete all layers?" +msgstr "" + +#. Try harder... +#: ../src/vikwindow.c:4126 ../src/vikwindow.c:4132 +msgid "Generating image file..." +msgstr "" + +#: ../src/vikwindow.c:4154 +msgid "" +"Failed to generate internal image.\n" +"\n" +"Try creating a smaller image." +msgstr "" + +#: ../src/vikwindow.c:4175 +msgid "Image file generated." +msgstr "" + +#: ../src/vikwindow.c:4177 +msgid "Failed to generate image file." +msgstr "" + +#: ../src/vikwindow.c:4246 +#, c-format +msgid "Unable to write to file %s: %s" +msgstr "" + +#: ../src/vikwindow.c:4284 +msgid "" +"Viewable region outside allowable pixel size bounds for image. Clipping " +"width/height values." +msgstr "" + +#: ../src/vikwindow.c:4309 +#, c-format +msgid "Total area: %ldm x %ldm (%.3f sq. km)" +msgstr "" + +#: ../src/vikwindow.c:4312 +#, c-format +msgid "Total area: %ldm x %ldm (%.3f sq. miles)" +msgstr "" + +#: ../src/vikwindow.c:4315 +#, c-format +msgid "Total area: %ldm x %ldm (%.3f sq. NM)" +msgstr "" + +#. Single file +#: ../src/vikwindow.c:4343 +msgid "Save Image" +msgstr "" + +#: ../src/vikwindow.c:4364 ../src/vikwindow.c:4641 +msgid "KMZ" +msgstr "" + +#: ../src/vikwindow.c:4417 +msgid "You must be in UTM mode to use this feature" +msgstr "" + +#: ../src/vikwindow.c:4421 +msgid "Choose a directory to hold images" +msgstr "" + +#. todo: default for answers inside VikWindow or static (thruout instance) +#: ../src/vikwindow.c:4441 +msgid "Save to Image File" +msgstr "" + +#: ../src/vikwindow.c:4457 +msgid "Width (pixels):" +msgstr "" + +#: ../src/vikwindow.c:4459 +msgid "Height (pixels):" +msgstr "" + +#: ../src/vikwindow.c:4462 +msgid "" +"WARNING: USING LARGE IMAGES OVER 10000x10000\n" +"MAY CRASH THE PROGRAM!" +msgstr "" + +#: ../src/vikwindow.c:4464 +msgid "Zoom (meters per pixel):" +msgstr "" + +#: ../src/vikwindow.c:4480 +msgid "Area in current viewable window" +msgstr "" + +#: ../src/vikwindow.c:4490 +msgid "Save as PNG" +msgstr "" + +#: ../src/vikwindow.c:4491 +msgid "Save as JPEG" +msgstr "" + +#: ../src/vikwindow.c:4520 +msgid "East-west image tiles:" +msgstr "" + +#: ../src/vikwindow.c:4522 +msgid "North-south image tiles:" +msgstr "" + +#: ../src/vikwindow.c:4619 +msgid "This feature is not available in UTM mode" +msgstr "" + +#: ../src/vikwindow.c:4658 +#, c-format +msgid "Unable to import %s." +msgstr "" + +#: ../src/vikwindow.c:4749 +msgid "Choose a background color" +msgstr "" + +#: ../src/vikwindow.c:4765 +msgid "Choose a track highlight color" +msgstr "" + +#: ../src/vikwindow.c:4814 +msgid "_File" +msgstr "" + +#: ../src/vikwindow.c:4815 +msgid "_Edit" +msgstr "" + +#: ../src/vikwindow.c:4817 +msgid "_Show" +msgstr "" + +#: ../src/vikwindow.c:4820 +msgid "_Layers" +msgstr "" + +#: ../src/vikwindow.c:4821 +msgid "_Tools" +msgstr "" + +#: ../src/vikwindow.c:4822 +msgid "_Webtools" +msgstr "" + +#: ../src/vikwindow.c:4823 ../src/vikwindow.c:4893 +msgid "_Help" +msgstr "" + +#: ../src/vikwindow.c:4825 +msgid "New file" +msgstr "" + +#: ../src/vikwindow.c:4826 +msgid "_Open..." +msgstr "" + +#: ../src/vikwindow.c:4826 +msgid "Open a file" +msgstr "" + +#: ../src/vikwindow.c:4827 +msgid "Open _Recent File" +msgstr "" + +#: ../src/vikwindow.c:4828 +msgid "Append _File..." +msgstr "" + +#: ../src/vikwindow.c:4828 +msgid "Append data from a different file" +msgstr "" + +#: ../src/vikwindow.c:4829 +msgid "Open GPX as External _Layer..." +msgstr "" + +#: ../src/vikwindow.c:4829 +msgid "Open a GPX file as an external layer" +msgstr "" + +#: ../src/vikwindow.c:4830 +msgid "_Export All" +msgstr "" + +#: ../src/vikwindow.c:4830 +msgid "Export All TrackWaypoint Layers" +msgstr "" + +#: ../src/vikwindow.c:4831 +msgid "_GPX..." +msgstr "" + +#: ../src/vikwindow.c:4831 +msgid "Export as GPX" +msgstr "" + +#: ../src/vikwindow.c:4832 +msgid "A_cquire" +msgstr "" + +#: ../src/vikwindow.c:4833 +msgid "_Directions..." +msgstr "" + +#: ../src/vikwindow.c:4833 +msgid "Get driving directions" +msgstr "" + +#: ../src/vikwindow.c:4835 +msgid "_OSM Traces..." +msgstr "" + +#: ../src/vikwindow.c:4835 +msgid "Get traces from OpenStreetMap" +msgstr "" + +#: ../src/vikwindow.c:4836 +msgid "_My OSM Traces..." +msgstr "" + +#: ../src/vikwindow.c:4836 +msgid "Get Your Own Traces from OpenStreetMap" +msgstr "" + +#: ../src/vikwindow.c:4839 +msgid "Geo_caches..." +msgstr "" + +#: ../src/vikwindow.c:4839 +msgid "Get Geocaches from geocaching.com" +msgstr "" + +#: ../src/vikwindow.c:4842 +msgid "Create waypoints from geotagged images" +msgstr "" + +#: ../src/vikwindow.c:4844 +msgid "Get a file from a URL" +msgstr "" + +#: ../src/vikwindow.c:4846 +msgid "Create waypoints from Wikipedia items in the current view" +msgstr "" + +#: ../src/vikwindow.c:4848 +msgid "_Save" +msgstr "" + +#: ../src/vikwindow.c:4848 +msgid "Save the file" +msgstr "" + +#: ../src/vikwindow.c:4849 +msgid "Save _As..." +msgstr "" + +#: ../src/vikwindow.c:4849 +msgid "Save the file under different name" +msgstr "" + +#: ../src/vikwindow.c:4850 +msgid "Properties..." +msgstr "" + +#: ../src/vikwindow.c:4850 +msgid "File Properties" +msgstr "" + +#: ../src/vikwindow.c:4852 +msgid "Import KMZ _Map File..." +msgstr "" + +#: ../src/vikwindow.c:4852 +msgid "Import a KMZ file" +msgstr "" + +#: ../src/vikwindow.c:4853 +msgid "Generate _KMZ Map File..." +msgstr "" + +#: ../src/vikwindow.c:4853 +msgid "Generate a KMZ file with an overlay of the current view" +msgstr "" + +#: ../src/vikwindow.c:4855 +msgid "_Generate Image File..." +msgstr "" + +#: ../src/vikwindow.c:4855 +msgid "Save a snapshot of the workspace into a file" +msgstr "" + +#: ../src/vikwindow.c:4856 +msgid "Generate _Directory of Images..." +msgstr "" + +#: ../src/vikwindow.c:4856 +msgid "Generate _Directory of Images" +msgstr "" + +#: ../src/vikwindow.c:4857 +msgid "_Print..." +msgstr "" + +#: ../src/vikwindow.c:4857 +msgid "Print maps" +msgstr "" + +#: ../src/vikwindow.c:4858 +msgid "E_xit" +msgstr "" + +#: ../src/vikwindow.c:4858 +msgid "Exit the program" +msgstr "" + +#: ../src/vikwindow.c:4859 +msgid "Save and Exit" +msgstr "" + +#: ../src/vikwindow.c:4859 +msgid "Save and Exit the program" +msgstr "" + +#: ../src/vikwindow.c:4861 +msgid "Go to the Pre_vious Location" +msgstr "" + +#: ../src/vikwindow.c:4861 +msgid "Go to the previous location" +msgstr "" + +#: ../src/vikwindow.c:4862 +msgid "Go to the _Next Location" +msgstr "" + +#: ../src/vikwindow.c:4862 +msgid "Go to the next location" +msgstr "" + +#: ../src/vikwindow.c:4863 +msgid "Go to the _Default Location" +msgstr "" + +#: ../src/vikwindow.c:4863 +msgid "Go to the default location" +msgstr "" + +#: ../src/vikwindow.c:4864 +msgid "Go to the _Auto Location" +msgstr "" + +#: ../src/vikwindow.c:4864 +msgid "Go to a location via automatic lookup" +msgstr "" + +#: ../src/vikwindow.c:4865 +msgid "Go to _Location..." +msgstr "" + +#: ../src/vikwindow.c:4865 +msgid "Go to address/place using text search" +msgstr "" + +#: ../src/vikwindow.c:4866 +msgid "_Go to Lat/Lon..." +msgstr "" + +#: ../src/vikwindow.c:4866 +msgid "Go to arbitrary lat/lon coordinate" +msgstr "" + +#: ../src/vikwindow.c:4867 +msgid "Go to UTM..." +msgstr "" + +#: ../src/vikwindow.c:4867 +msgid "Go to arbitrary UTM coordinate" +msgstr "" + +#: ../src/vikwindow.c:4868 +msgid "Go to Today" +msgstr "" + +#: ../src/vikwindow.c:4868 +msgid "Go to today on the calendar" +msgstr "" + +#: ../src/vikwindow.c:4869 +msgid "_Refresh" +msgstr "" + +#: ../src/vikwindow.c:4869 +msgid "Refresh any maps displayed" +msgstr "" + +#: ../src/vikwindow.c:4870 +msgid "Set _Highlight Color..." +msgstr "" + +#: ../src/vikwindow.c:4870 +msgid "Set Highlight Color" +msgstr "" + +#: ../src/vikwindow.c:4871 +msgid "Set Bac_kground Color..." +msgstr "" + +#: ../src/vikwindow.c:4871 +msgid "Set Background Color" +msgstr "" + +#: ../src/vikwindow.c:4872 +msgid "Zoom _In" +msgstr "" + +#: ../src/vikwindow.c:4872 +msgid "Zoom In" +msgstr "" + +#: ../src/vikwindow.c:4873 +msgid "Zoom _Out" +msgstr "" + +#: ../src/vikwindow.c:4873 +msgid "Zoom Out" +msgstr "" + +#: ../src/vikwindow.c:4874 +msgid "Zoom _To..." +msgstr "" + +#: ../src/vikwindow.c:4874 +msgid "Zoom To" +msgstr "" + +#: ../src/vikwindow.c:4875 +msgid "Pan _North" +msgstr "" + +#: ../src/vikwindow.c:4876 +msgid "Pan _East" +msgstr "" + +#: ../src/vikwindow.c:4877 +msgid "Pan _South" +msgstr "" + +#: ../src/vikwindow.c:4878 +msgid "Pan _West" +msgstr "" + +#: ../src/vikwindow.c:4879 +msgid "Background _Jobs" +msgstr "" + +#: ../src/vikwindow.c:4879 +msgid "Background Jobs" +msgstr "" + +#: ../src/vikwindow.c:4881 +msgid "Cu_t" +msgstr "" + +#: ../src/vikwindow.c:4885 +msgid "Delete All" +msgstr "" + +#: ../src/vikwindow.c:4886 +msgid "Copy Centre _Location" +msgstr "" + +#: ../src/vikwindow.c:4887 +msgid "_Flush Map Cache" +msgstr "" + +#: ../src/vikwindow.c:4888 +msgid "_Set the Default Location" +msgstr "" + +#: ../src/vikwindow.c:4888 +msgid "Set the Default Location to the current position" +msgstr "" + +#: ../src/vikwindow.c:4889 +msgid "_Preferences" +msgstr "" + +#: ../src/vikwindow.c:4889 +msgid "Program Preferences" +msgstr "" + +#: ../src/vikwindow.c:4890 +msgid "_Layer Defaults" +msgstr "" + +#: ../src/vikwindow.c:4891 +msgid "_Properties" +msgstr "" + +#: ../src/vikwindow.c:4893 +msgid "Help" +msgstr "" + +#: ../src/vikwindow.c:4894 +msgid "_About" +msgstr "" + +#: ../src/vikwindow.c:4894 +msgid "About" +msgstr "" + +#: ../src/vikwindow.c:4903 +msgid "_KML..." +msgstr "" + +#: ../src/vikwindow.c:4903 +msgid "Export as KML" +msgstr "" + +#: ../src/vikwindow.c:4904 +msgid "Transfer data from a GPS device" +msgstr "" + +#: ../src/vikwindow.c:4905 +msgid "Import file via GPSBabel converter" +msgstr "" + +#: ../src/vikwindow.c:4909 +msgid "Import Geo_JSON File..." +msgstr "" + +#: ../src/vikwindow.c:4909 +msgid "Import GeoJSON file" +msgstr "" + +#: ../src/vikwindow.c:4914 +msgid "_UTM Mode" +msgstr "" + +#: ../src/vikwindow.c:4915 +msgid "_Expedia Mode" +msgstr "" + +#: ../src/vikwindow.c:4916 +msgid "_Mercator Mode" +msgstr "" + +#: ../src/vikwindow.c:4917 +msgid "Lat_/Lon Mode" +msgstr "" + +#: ../src/vikwindow.c:4921 +msgid "Show _Scale" +msgstr "" + +#: ../src/vikwindow.c:4921 +msgid "Show Scale" +msgstr "" + +#: ../src/vikwindow.c:4922 +msgid "Show _Center Mark" +msgstr "" + +#: ../src/vikwindow.c:4922 +msgid "Show Center Mark" +msgstr "" + +#: ../src/vikwindow.c:4923 +msgid "Show _Highlight" +msgstr "" + +#: ../src/vikwindow.c:4923 +msgid "Show Highlight" +msgstr "" + +#: ../src/vikwindow.c:4924 +msgid "_Full Screen" +msgstr "" + +#: ../src/vikwindow.c:4924 +msgid "Activate full screen mode" +msgstr "" + +#: ../src/vikwindow.c:4925 +msgid "Show Side _Panel" +msgstr "" + +#: ../src/vikwindow.c:4925 +msgid "Show Side Panel" +msgstr "" + +#: ../src/vikwindow.c:4926 +msgid "Show Status_bar" +msgstr "" + +#: ../src/vikwindow.c:4926 +msgid "Show Statusbar" +msgstr "" + +#: ../src/vikwindow.c:4927 +msgid "Show _Toolbar" +msgstr "" + +#: ../src/vikwindow.c:4927 +msgid "Show Toolbar" +msgstr "" + +#: ../src/vikwindow.c:4928 +msgid "Show _Menu" +msgstr "" + +#: ../src/vikwindow.c:4928 +msgid "Show Menu" +msgstr "" + +#: ../src/vikwindow.c:4929 +msgid "Show Side Panel B_uttons" +msgstr "" + +#: ../src/vikwindow.c:4929 +msgid "Show Side Panel Buttons" +msgstr "" + +#: ../src/vikwindow.c:4930 +msgid "Show Side Panel Ca_lendar" +msgstr "" + +#: ../src/vikwindow.c:4930 +msgid "Show Side Panel Calendar" +msgstr "" + +#: ../src/vikwindow.c:5064 +#, c-format +msgid "New _%s Layer" +msgstr "" + +#: ../src/vikwindow.c:5114 +msgid "..." +msgstr "" + +#: ../src/viking.desktop.in.h:2 +msgid "GPS Data Manager" +msgstr "" + +#: ../src/viking.desktop.in.h:3 +msgid "Map Based GPS Data Manager (live data capable)." +msgstr "" + +#: ../src/libjpeg/jpeg-data.c:205 +msgid "Data does not follow JPEG specification." +msgstr "" + +#: ../src/libjpeg/jpeg-data.c:302 +#, c-format +msgid "Path '%s' invalid." +msgstr "" + +#: ../src/libjpeg/jpeg-data.c:320 +#, c-format +msgid "Could not read '%s'." +msgstr "" diff --git a/po/lt.po b/po/lt.po new file mode 100644 index 0000000..e699969 --- /dev/null +++ b/po/lt.po @@ -0,0 +1,6147 @@ +# Lithuanian translation for viking +# Copyright (c) 2008 Rosetta Contributors and Canonical Ltd 2008 +# This file is distributed under the same license as the viking package. +# FIRST AUTHOR , 2008. +# +msgid "" +msgstr "" +"Project-Id-Version: viking\n" +"Report-Msgid-Bugs-To: \n" +"POT-Creation-Date: 2019-01-19 12:53+0000\n" +"PO-Revision-Date: 2013-05-17 10:46+0000\n" +"Last-Translator: Mantas Kriaučiūnas \n" +"Language-Team: Lithuanian \n" +"Language: lt\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" +"X-Launchpad-Export-Date: 2018-12-21 17:32+0000\n" +"X-Generator: Launchpad (build 18847)\n" + +#: ../src/acquire.c:106 ../src/vikgpslayer.c:1367 +msgid "Done." +msgstr "Baigta." + +#: ../src/acquire.c:115 +msgid "No data." +msgstr "" + +#: ../src/acquire.c:167 ../src/acquire.c:415 +msgid "Error: acquisition failed." +msgstr "Klaida: pasiekti nepavyko." + +#: ../src/acquire.c:339 +msgid "Working..." +msgstr "Vykdoma..." + +#. This shouldn't happen... +#: ../src/acquire.c:406 +msgid "" +"Unable to create command\n" +"Acquire method failed." +msgstr "" + +#: ../src/acquire.c:513 +msgid "_Filter" +msgstr "" + +#: ../src/acquire.c:528 +#, c-format +msgid "Filter with %s" +msgstr "" + +#: ../src/acquire.c:545 +msgid "Filter" +msgstr "" + +#: ../src/babel.c:640 +msgid "GPSBabel:" +msgstr "" + +#: ../src/babel.c:641 +msgid "" +"Allow setting the specific instance of GPSBabel. You must restart Viking for " +"this value to take effect." +msgstr "" + +#: ../src/babel_ui.c:79 +msgid "Select a file format" +msgstr "" + +#: ../src/babel_ui.c:144 ../src/viktrwlayer.c:531 ../src/viktrwlayer.c:2882 +msgid "Tracks" +msgstr "Keliai" + +#: ../src/babel_ui.c:149 ../src/viktrwlayer.c:2892 +msgid "Routes" +msgstr "" + +#. ***** PARAMETERS ***** +#: ../src/babel_ui.c:154 ../src/viktrwlayer.c:531 ../src/viktrwlayer.c:2887 +msgid "Waypoints" +msgstr "Maršruto taškai" + +#: ../src/background.c:64 +#, c-format +msgid "%d items" +msgstr "%d dalykai" + +#: ../src/background.c:287 +msgid "Threads:" +msgstr "" + +#: ../src/background.c:288 +msgid "" +"Number of threads to use for Mapnik tasks. You need to restart Viking for a " +"change to this value to be used" +msgstr "" + +#: ../src/background.c:361 +msgid "Job" +msgstr "Užduotis" + +#: ../src/background.c:365 +msgid "Progress" +msgstr "Eiga" + +#: ../src/background.c:373 +msgid "Viking Background Jobs" +msgstr "Viking fono darbai" + +#: ../src/bing.c:42 +msgid "Bing Aerial" +msgstr "" + +#: ../src/bing.c:48 +msgid "Bing" +msgstr "" + +#. VIK_GTK_WINDOW_FROM_WIDGET(vp) +#: ../src/bingmapsource.c:514 +msgid "Bing attribution Loading" +msgstr "" + +#: ../src/clipboard.c:95 +msgid "paste failed" +msgstr "įterpti nepavyko" + +#: ../src/clipboard.c:105 +msgid "wrong clipboard data size" +msgstr "Klaidingas iškarpos duomenų dydis" + +#: ../src/clipboard.c:124 +#, c-format +msgid "" +"The clipboard contains sublayer data for %s layers. You must select a layer " +"of this type to paste the clipboard data." +msgstr "" + +#: ../src/clipboard.c:264 +msgid "" +"In order to paste a waypoint, please select an appropriate layer to paste " +"into." +msgstr "Pasirinkite tinkamą sluoksnį, kad įterptumėte maršruto tašką." + +#: ../src/dialog.c:60 +msgid "Go to Lat/Lon" +msgstr "Eiti į Pla/Ilg" + +#: ../src/dialog.c:69 ../src/viktrwlayer_wpwin.c:173 +msgid "Latitude:" +msgstr "Platuma:" + +#: ../src/dialog.c:72 ../src/viktrwlayer_wpwin.c:177 +msgid "Longitude:" +msgstr "Ilguma:" + +#: ../src/dialog.c:102 +msgid "Go to UTM" +msgstr "" + +#: ../src/dialog.c:114 +msgid "Northing:" +msgstr "Šiaurės kryptis:" + +#: ../src/dialog.c:117 +msgid "Easting:" +msgstr "Rytų kryptis:" + +#: ../src/dialog.c:121 ../src/vikgeoreflayer.c:902 +msgid "Zone:" +msgstr "Zona" + +#: ../src/dialog.c:124 ../src/vikgeoreflayer.c:904 +msgid "Letter:" +msgstr "Raidė:" + +#: ../src/dialog.c:246 ../src/geonamessearch.c:238 +#: ../src/datasource_osm_my_traces.c:505 +msgid "Nothing was selected" +msgstr "Niekas nepasirinkta" + +#: ../src/dialog.c:254 +msgid "Add Route" +msgstr "" + +#: ../src/dialog.c:254 +msgid "Add Track" +msgstr "Pridėti kelią" + +#: ../src/dialog.c:262 +msgid "Route Name:" +msgstr "" + +#: ../src/dialog.c:262 +msgid "Track Name:" +msgstr "Kelio pavadinimas:" + +#: ../src/dialog.c:282 +msgid "Please enter a name for the track." +msgstr "Įveskite kelio pavadinimą." + +#: ../src/dialog.c:311 +msgid "Today" +msgstr "" + +#: ../src/dialog.c:393 +msgid "Zoom Factors..." +msgstr "Mastelio veiksniai..." + +#: ../src/dialog.c:407 +msgid "Zoom factor (in meters per pixel):" +msgstr "" + +#: ../src/dialog.c:408 +msgid "X (easting): " +msgstr "X (rytinis): " + +#: ../src/dialog.c:409 +msgid "Y (northing): " +msgstr "Y (šiaurinis): " + +#: ../src/dialog.c:414 +msgid "X and Y zoom factors must be equal" +msgstr "X ir Y mastelio veiksniai privalo būti lygūs" + +#: ../src/dialog.c:469 +msgid "1 min" +msgstr "1 minutė" + +#: ../src/dialog.c:470 +msgid "1 hour" +msgstr "1 valanda" + +#: ../src/dialog.c:471 +msgid "1 day" +msgstr "1 diena" + +#: ../src/dialog.c:472 +msgid "Custom (in minutes):" +msgstr "Kita (minutėmis)" + +#: ../src/dialog.c:608 +#, c-format +msgid "" +"2003-2008, Evan Battaglia\n" +"2008-%s, Viking's contributors" +msgstr "" + +#: ../src/dialog.c:609 +msgid "GPS Data and Topo Analyzer, Explorer, and Manager." +msgstr "GPS duomenų ir topografijos analizatorius, tyrėjas ir vedlys" + +#: ../src/dialog.c:610 +msgid "" +"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.\n" +"\n" +"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.\n" +"\n" +"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., 59 Temple " +"Place, Suite 330, Boston, MA 02111-1307, USA" +msgstr "" +"Ši programa yra laisva programinė įranga; ją galite pakartotinai platinti ir/" +"arba keisti pagal GNU General Public License kaippaskelbė Free Software " +"Foundation; arba bet kuri 2 licencijosversija, arba (Jūsų pasirinkimu) bet " +"kuri vėlesnė versija.\n" +"\n" +"Ši programa yra platinama tikintis, kad ji bus naudinga, tačiauBE JOKIOS " +"GARANTIJOS; netgi be numanomos garantijosKOMERCINIAM arba TINKAMUMO TAM " +"TIKRAM TIKSLUI.Daugiau informacijos rasite GNU General Public License.\n" +"\n" +"Jūs turėtumėte gauti GNU General Public License kopiją kartu sušia programa; " +"jei ne, rašykite į Free Software Foundation, Inc.,59 Temple Place, Suite " +"330, Boston, MA 02111-1307 USA" + +#: ../src/dialog.c:703 +msgid "Translation is coordinated on http://launchpad.net/viking" +msgstr "" + +#: ../src/dialog.c:713 +msgid "Download along track" +msgstr "Atsiųsti išilgai kelio" + +#: ../src/dialog.c:720 +msgid "Map type:" +msgstr "Žemėlapio tipas:" + +#: ../src/dialog.c:726 +msgid "Zoom level:" +msgstr "Mastelio lygis:" + +#: ../src/dialog.c:766 +#, c-format +msgid "The map data is licensed: %s." +msgstr "" + +#: ../src/dialog.c:769 +#, c-format +msgid "" +"The data provided by '%s' are licensed under the following license: " +"%s." +msgstr "" + +#: ../src/dialog.c:773 +msgid "Open license" +msgstr "" + +#: ../src/expedia.c:54 +msgid "Expedia Street Maps" +msgstr "Expedia gatvių žemėlapiai" + +#: ../src/expedia.c:82 +msgid "Invalid expedia altitude" +msgstr "Negalimas expedia aukštis" + +#: ../src/expedia.c:113 +#, c-format +msgid "" +"Couldn't open EXPEDIA image file (right after successful download! Please " +"report and delete image file!): %s" +msgstr "" +"Neįmanoma atverti EXPEDIA atvaizdo failo (iškart po sėkmingo atsisiuntimo! " +"Praneškite ir ištrinkite atvaizdo failą!): %s" + +#: ../src/expedia.c:126 +#, c-format +msgid "" +"Couldn't save EXPEDIA image file (right after successful download! Please " +"report and delete image file!): %s" +msgstr "" +"Neįmanoma išsaugoti EXPEDIA atvaizdo failo (iškart po sėkmingo atsisiuntimo! " +"Praneškite ir ištrinkite atvaizdo failą!): %s" + +#: ../src/geonamessearch.c:115 +msgid "Search" +msgstr "Paieška" + +#: ../src/geonamessearch.c:117 +msgid "No entries found!" +msgstr "Įrašų nerasta!" + +#. NB could allow columns to be shifted around by doing this after each new +#. gtk_tree_view_column_set_reorderable ( column, TRUE ); +#. However I don't think is that useful, so I haven't put it in +#: ../src/geonamessearch.c:171 ../src/datasource_osm_my_traces.c:422 +#: ../src/viktrwlayer_tracklist.c:621 ../src/viktrwlayer_waypointlist.c:618 +msgid "Name" +msgstr "" + +#: ../src/geonamessearch.c:176 +msgid "Feature" +msgstr "" + +#: ../src/geonamessearch.c:181 ../src/datasource_osm_my_traces.c:437 +msgid "Lat/Lon" +msgstr "" + +#: ../src/geonamessearch.c:264 ../src/googlesearch.c:101 ../src/vikgoto.c:430 +msgid "couldn't map temp file" +msgstr "neįmanoma išdėstyti laikino failo" + +#: ../src/geonamessearch.c:459 +msgid "Select articles" +msgstr "" + +#: ../src/geonamessearch.c:459 +msgid "Select the articles you want to add." +msgstr "" + +#: ../src/geonamessearch.c:475 +msgid "city" +msgstr "" + +#: ../src/geonamessearch.c:477 +msgid "edu" +msgstr "" + +#: ../src/geonamessearch.c:479 +msgid "airport" +msgstr "" + +#: ../src/geonamessearch.c:481 +msgid "mountain" +msgstr "" + +#: ../src/geonamessearch.c:483 +msgid "forest" +msgstr "" + +#: ../src/geonamessearch.c:485 +msgid "church" +msgstr "" + +#: ../src/geojson.c:74 +#, c-format +msgid "%s command failed: %s" +msgstr "" + +#: ../src/geojson.c:146 ../src/gpx.c:1317 +#, c-format +msgid "failed to open temporary file: %s" +msgstr "nepavyko atverti laikino failo: %s" + +#: ../src/globals.c:67 +msgid "DDD" +msgstr "" + +#: ../src/globals.c:67 +msgid "DMM" +msgstr "" + +#: ../src/globals.c:67 +msgid "DMS" +msgstr "" + +#: ../src/globals.c:67 +msgid "Raw" +msgstr "" + +#: ../src/globals.c:68 +msgid "Kilometres" +msgstr "" + +#: ../src/globals.c:68 +msgid "Miles" +msgstr "" + +#: ../src/globals.c:68 +msgid "Nautical Miles" +msgstr "" + +#. VIK_UNITS_SPEED_KILOMETRES_PER_HOUR: +#: ../src/globals.c:69 ../src/viktrwlayer_tracklist.c:655 ../src/vikutils.c:100 +msgid "km/h" +msgstr "" + +#: ../src/globals.c:69 ../src/viktrwlayer_tracklist.c:656 ../src/vikutils.c:78 +msgid "mph" +msgstr "" + +#. VIK_UNITS_SPEED_METRES_PER_SECOND: +#: ../src/globals.c:69 ../src/viktrwlayer_tracklist.c:663 ../src/vikutils.c:81 +msgid "m/s" +msgstr "" + +#: ../src/globals.c:69 ../src/viktrwlayer_tracklist.c:657 ../src/vikutils.c:84 +msgid "knots" +msgstr "" + +#: ../src/globals.c:69 ../src/viktrwlayer_tracklist.c:658 ../src/vikutils.c:87 +msgid "s/km" +msgstr "" + +#: ../src/globals.c:69 ../src/viktrwlayer_tracklist.c:659 ../src/vikutils.c:90 +msgid "min/km" +msgstr "" + +#: ../src/globals.c:69 +msgid "s/mi" +msgstr "" + +#: ../src/globals.c:69 ../src/viktrwlayer_tracklist.c:661 ../src/vikutils.c:96 +msgid "min/mi" +msgstr "" + +#: ../src/globals.c:70 +msgid "Metres" +msgstr "" + +#: ../src/globals.c:70 +msgid "Feet" +msgstr "" + +#: ../src/globals.c:73 +msgid "Locale" +msgstr "" + +#: ../src/globals.c:73 +msgid "World" +msgstr "" + +#: ../src/globals.c:73 +msgid "UTC" +msgstr "" + +#: ../src/globals.c:76 +msgid "Degree format:" +msgstr "Laipsnių formatas:" + +#: ../src/globals.c:77 +msgid "Distance units:" +msgstr "" + +#: ../src/globals.c:78 +msgid "Speed units:" +msgstr "Greičio matavimo vienetas:" + +#: ../src/globals.c:79 +msgid "Height units:" +msgstr "Aukščio matavimo vienetas:" + +#: ../src/globals.c:80 +msgid "Use large waypoint icons:" +msgstr "" + +#: ../src/globals.c:81 +msgid "Default latitude:" +msgstr "" + +#: ../src/globals.c:82 +msgid "Default longitude:" +msgstr "" + +#: ../src/globals.c:83 +msgid "Time Display:" +msgstr "" + +#: ../src/globals.c:84 +msgid "" +"Display times according to the reference frame. Locale is the user's system " +"setting. World is relative to the location of the object." +msgstr "" + +#: ../src/globals.c:90 +msgid "Alphabetical" +msgstr "" + +#: ../src/globals.c:90 ../src/datasource_osm_my_traces.c:432 +msgid "Time" +msgstr "" + +#: ../src/globals.c:90 +msgid "Creation" +msgstr "" + +#: ../src/globals.c:91 +msgid "Title Case" +msgstr "" + +#: ../src/globals.c:91 +msgid "Lowercase" +msgstr "" + +#: ../src/globals.c:94 +msgid "KML File Export Units:" +msgstr "" + +#: ../src/globals.c:95 +msgid "GPX Track Order:" +msgstr "" + +#: ../src/globals.c:96 +msgid "GPX Waypoint Symbols:" +msgstr "" + +#: ../src/globals.c:97 +msgid "" +"Save GPX Waypoint Symbol names in the specified case. May be useful for " +"compatibility with various devices" +msgstr "" + +#: ../src/globals.c:98 +msgid "GPX Creator:" +msgstr "" + +#: ../src/globals.c:99 +msgid "" +"The creator value when writing a GPX file. Otherwise when blank a default is " +"used." +msgstr "" + +#: ../src/globals.c:104 +msgid "Image Viewer:" +msgstr "" + +#: ../src/globals.c:109 +msgid "External GPX Program 1:" +msgstr "" + +#: ../src/globals.c:110 +msgid "External GPX Program 2:" +msgstr "" + +#: ../src/globals.c:113 +msgid "Absolute" +msgstr "" + +#: ../src/globals.c:113 +msgid "Relative" +msgstr "" + +#: ../src/globals.c:117 +msgid "Save File Reference Mode:" +msgstr "" + +#: ../src/globals.c:118 +msgid "" +"When saving a Viking .vik file, this determines how the directory paths of " +"filenames are written." +msgstr "" + +#: ../src/globals.c:119 +msgid "Ask for Name before Track Creation:" +msgstr "" + +#: ../src/globals.c:120 +msgid "Show Tooltip during Track Creation:" +msgstr "" + +#: ../src/globals.c:121 +msgid "The number of recent files:" +msgstr "" + +#: ../src/globals.c:122 +msgid "" +"Only applies to new windows or on application restart. -1 means all " +"available files." +msgstr "" + +#: ../src/globals.c:123 +#, fuzzy +msgid "Open files in selected layer:" +msgstr "Pašalinti pažymėtą sluoksnį" + +#: ../src/globals.c:124 +msgid "Open files (but not .vik ones) into the selected TrackWaypoint layer." +msgstr "" + +#: ../src/globals.c:125 +msgid "Show calendar day names:" +msgstr "" + +#: ../src/globals.c:128 +msgid "Home Location" +msgstr "" + +#: ../src/globals.c:128 +msgid "Last Location" +msgstr "" + +#: ../src/globals.c:128 +msgid "Specified File" +msgstr "" + +#: ../src/globals.c:128 +msgid "Auto Location" +msgstr "" + +#: ../src/globals.c:131 +msgid "Restore Window Setup:" +msgstr "" + +#: ../src/globals.c:132 +msgid "Restore window size and layout" +msgstr "" + +#: ../src/globals.c:133 +msgid "Add a Default Map Layer:" +msgstr "" + +#: ../src/globals.c:134 +msgid "" +"The default map layer added is defined by the Layer Defaults. Use the menu " +"Edit->Layer Defaults->Map... to change the map type and other values." +msgstr "" + +#: ../src/globals.c:135 +msgid "Startup Method:" +msgstr "" + +#: ../src/globals.c:136 +msgid "Startup File:" +msgstr "" + +#: ../src/globals.c:137 +msgid "" +"The default file to load on startup. Only applies when the startup method is " +"set to 'Specified File'" +msgstr "" + +#: ../src/globals.c:138 +msgid "Check For New Version:" +msgstr "" + +#: ../src/globals.c:139 +msgid "Periodically check to see if a new version of Viking is available" +msgstr "" + +#. Defaults for the options are setup here +#: ../src/globals.c:176 +msgid "General" +msgstr "" + +#. New Tab +#: ../src/globals.c:204 +msgid "Startup" +msgstr "" + +#. New Tab +#: ../src/globals.c:222 +msgid "Export/External" +msgstr "" + +#. 'Advanced' Properties +#: ../src/globals.c:249 +msgid "Advanced" +msgstr "" + +#. Webtools +#: ../src/google.c:39 +msgid "Google" +msgstr "Google" + +#. If there is an actual description field it will overwrite this value +#: ../src/gpx.c:264 +#, c-format +msgid "Created by: %s" +msgstr "" + +#: ../src/datasource_bfilter.c:43 +msgid "Max number of points:" +msgstr "Didžiausias taškų skaičius:" + +#: ../src/datasource_bfilter.c:84 +msgid "Simplify All Tracks..." +msgstr "" + +#: ../src/datasource_bfilter.c:85 +msgid "Simplified Tracks" +msgstr "Supaprastinti keliai" + +#. { VIK_LAYER_NUM_TYPES, "compressmethod", VIK_LAYER_PARAM_UINT, VIK_LAYER_GROUP_NONE, N_("Simplify Method:"), VIK_LAYER_WIDGET_COMBOBOX, compress_method, NULL, NULL, NULL, NULL, NULL }, +#: ../src/datasource_bfilter.c:111 +msgid "Error Factor:" +msgstr "" + +#: ../src/datasource_bfilter.c:112 +msgid "" +"Specifies the maximum allowable error that may be introduced by removing a " +"single point by the crosstrack method. See the manual or GPSBabel Simplify " +"Filter documentation for more detail." +msgstr "" + +#: ../src/datasource_bfilter.c:166 +msgid "Compress Tracks..." +msgstr "" + +#: ../src/datasource_bfilter.c:167 +msgid "Compressed Tracks" +msgstr "" + +#: ../src/datasource_bfilter.c:197 ../src/datasource_bfilter.c:198 +msgid "Remove Duplicate Waypoints" +msgstr "Pašalinti dubliuotus maršruto taškus" + +#: ../src/datasource_bfilter.c:221 +msgid "Manual filter:" +msgstr "" + +#: ../src/datasource_bfilter.c:222 +msgid "Manual filter command: e.g. 'swap'." +msgstr "" + +#: ../src/datasource_bfilter.c:233 ../src/datasource_bfilter.c:234 +msgid "Manual filter" +msgstr "" + +#: ../src/datasource_bfilter.c:262 +msgid "Waypoints Inside This" +msgstr "Maršruto taškai viduje" + +#: ../src/datasource_bfilter.c:263 ../src/datasource_bfilter.c:292 +msgid "Polygonized Layer" +msgstr "" + +#: ../src/datasource_bfilter.c:291 +msgid "Waypoints Outside This" +msgstr "Maršruto taškai išorėje" + +#: ../src/datasource_file.c:61 +msgid "Import file with GPSBabel" +msgstr "" + +#: ../src/datasource_file.c:62 +msgid "Imported file" +msgstr "" + +#. The file selector +#: ../src/datasource_file.c:129 +msgid "File:" +msgstr "" + +#: ../src/datasource_file.c:130 +msgid "File to import" +msgstr "" + +#: ../src/datasource_file.c:137 +msgid "All files" +msgstr "" + +#. The file format selector +#: ../src/datasource_file.c:144 ../src/datasource_url.c:106 +msgid "File type:" +msgstr "" + +#: ../src/datasource_file.c:189 +#, c-format +msgid "using babel args '%s' and file '%s'" +msgstr "" + +#: ../src/datasource_gc.c:67 +msgid "Download Geocaches" +msgstr "Atsiųsti Geocaches" + +#: ../src/datasource_gc.c:68 +msgid "Geocaching.com Caches" +msgstr "Geocaching.com atsargos" + +#: ../src/datasource_gc.c:86 +msgid "geocaching.com username:" +msgstr "geocaching.com vartotojo vardas:" + +#: ../src/datasource_gc.c:87 +msgid "geocaching.com password:" +msgstr "geocaching.com slaptažodis:" + +#: ../src/datasource_gc.c:92 ../src/vikwindow.c:3502 +msgid "Geocaching" +msgstr "" + +#: ../src/datasource_gc.c:128 +#, c-format +msgid "" +"Can't find %s or %s in path! Check that you have installed it correctly." +msgstr "" + +#: ../src/datasource_gc.c:190 +msgid "Number geocaches:" +msgstr "Geocaches skaičius:" + +#: ../src/datasource_gc.c:192 +msgid "Centered around:" +msgstr "Centruotas apie:" + +#: ../src/datasource_gc.c:231 +msgid "Broken input - using some defaults" +msgstr "" + +#: ../src/datasource_geotag.c:51 +msgid "Create Waypoints from Geotagged Images" +msgstr "" + +#: ../src/datasource_geotag.c:52 +msgid "Geotagged Images" +msgstr "" + +#: ../src/datasource_geotag.c:102 ../src/datasource_geojson.c:93 +#: ../src/vikfileentry.c:171 ../src/vikwindow.c:3533 ../src/vikwindow.c:3610 +#: ../src/vikwindow.c:3641 ../src/vikwindow.c:4356 ../src/vikwindow.c:4649 +msgid "All" +msgstr "" + +#: ../src/datasource_geotag.c:107 ../src/vikfileentry.c:115 +#: ../src/viktrwlayer_geotag.c:637 ../src/vikwindow.c:3518 +#: ../src/vikwindow.c:4377 +msgid "JPG" +msgstr "" + +#: ../src/datasource_geotag.c:168 +#, c-format +msgid "Unable to create waypoint from %s" +msgstr "" + +#: ../src/datasource_geojson.c:46 +msgid "Acquire from GeoJSON" +msgstr "" + +#: ../src/datasource_geojson.c:47 ../src/datasource_geojson.c:98 +msgid "GeoJSON" +msgstr "" + +#: ../src/datasource_geojson.c:152 +#, c-format +msgid "Unable to import from: %s" +msgstr "" + +#: ../src/datasource_gps.c:54 +msgid "Acquire from GPS" +msgstr "Gauti duomenis iš GPS" + +#: ../src/datasource_gps.c:55 +msgid "Acquired from GPS" +msgstr "Gaunami duomenys iš GPS" + +#: ../src/datasource_gps.c:258 +#, c-format +msgid "using cmd '%s' and file '%s'\n" +msgstr "" + +#: ../src/datasource_gps.c:353 ../src/vikgpslayer.c:966 +#, c-format +msgid "Downloading %d waypoint..." +msgid_plural "Downloading %d waypoints..." +msgstr[0] "Atsiunčiamas %d maršruto taškas..." +msgstr[1] "Atsiunčiami %d maršruto taškai..." +msgstr[2] "Atsiunčiama %d maršruto taškų..." + +#: ../src/datasource_gps.c:358 ../src/vikgpslayer.c:971 +#, c-format +msgid "Downloading %d trackpoint..." +msgid_plural "Downloading %d trackpoints..." +msgstr[0] "Atsiunčiamas %d kelio taškas..." +msgstr[1] "Atsiunčiami %d kelio taškai..." +msgstr[2] "Atsiunčiama %d kelio taškų..." + +#: ../src/datasource_gps.c:363 ../src/vikgpslayer.c:976 +#, c-format +msgid "Downloading %d routepoint..." +msgid_plural "Downloading %d routepoints..." +msgstr[0] "" +msgstr[1] "" + +#: ../src/datasource_gps.c:386 ../src/datasource_gps.c:393 +#: ../src/datasource_gps.c:400 +#, c-format +msgid "Downloaded %d out of %d %s..." +msgstr "Atsiųsta %d iš %d %s..." + +#: ../src/datasource_gps.c:388 ../src/datasource_gps.c:395 +#: ../src/datasource_gps.c:402 +#, c-format +msgid "Downloaded %d %s." +msgstr "Atsiųsta %d %s." + +#: ../src/datasource_gps.c:416 ../src/vikgpslayer.c:1134 +#, c-format +msgid "GPS Device: %s" +msgstr "GPS įrenginys: %s" + +#: ../src/datasource_gps.c:428 ../src/vikgpslayer.c:1214 +msgid "Status: Working..." +msgstr "" + +#. NB gps_layer_inst_init() is performed after parameter registeration +#. thus to give the protocols some potential values use the old static list +#. TODO: find another way to use gps_layer_inst_init()? +#: ../src/datasource_gps.c:584 ../src/vikgpslayer.c:216 +msgid "GPS Protocol:" +msgstr "GPS protokolas:" + +#. List reassigned at runtime +#: ../src/datasource_gps.c:609 ../src/vikgpslayer.c:217 +msgid "Serial Port:" +msgstr "Nuoseklusis prievadas:" + +#: ../src/datasource_gps.c:659 +msgid "" +"Turn Off After Transfer\n" +"(Garmin/NAViLink Only)" +msgstr "" + +#: ../src/datasource_gps.c:666 +msgid "Tracks:" +msgstr "" + +#: ../src/datasource_gps.c:673 +msgid "Routes:" +msgstr "" + +#: ../src/datasource_gps.c:680 +msgid "Waypoints:" +msgstr "" + +#: ../src/datasource_gps.c:756 ../src/vikgpslayer.c:1509 +msgid "GPS device: N/A" +msgstr "GPS įrenginys: N/D" + +#: ../src/datasource_osm.c:53 ../src/datasource_osm.c:54 +msgid "OSM traces" +msgstr "" + +#: ../src/datasource_osm.c:89 +msgid "Page number:" +msgstr "" + +#: ../src/datasource_osm_my_traces.c:59 ../src/datasource_osm_my_traces.c:60 +msgid "OSM My Traces" +msgstr "" + +#: ../src/datasource_osm_my_traces.c:106 ../src/osm-traces.c:684 +#, fuzzy +msgid "Email/username:" +msgstr "OSM vartotojas:" + +#: ../src/datasource_osm_my_traces.c:111 +msgid "The email or username used to login to OSM" +msgstr "" + +#: ../src/datasource_osm_my_traces.c:113 ../src/osm-traces.c:692 +msgid "Password:" +msgstr "Slaptažodis:" + +#: ../src/datasource_osm_my_traces.c:116 +msgid "The password used to login to OSM" +msgstr "" + +#: ../src/datasource_osm_my_traces.c:427 ../src/viktrwlayer.c:689 +msgid "Description" +msgstr "" + +#: ../src/datasource_osm_my_traces.c:442 +msgid "Privacy" +msgstr "" + +#: ../src/datasource_osm_my_traces.c:449 +msgid "Within Current View" +msgstr "" + +#: ../src/datasource_osm_my_traces.c:516 +msgid "GPS Traces" +msgstr "" + +#: ../src/datasource_osm_my_traces.c:518 +msgid "None found!" +msgstr "" + +#: ../src/datasource_osm_my_traces.c:569 +msgid "Ensure the OSM access token preferences are setup." +msgstr "" + +#: ../src/datasource_osm_my_traces.c:645 +msgid "My OSM Traces" +msgstr "" + +#. Report errors to the status bar +#: ../src/datasource_osm_my_traces.c:667 +#, c-format +msgid "Unable to get trace: %s" +msgstr "" + +#: ../src/datasource_routing.c:56 ../src/datasource_routing.c:57 +msgid "Directions" +msgstr "" + +#: ../src/datasource_routing.c:90 +msgid "No routing engines with directions available" +msgstr "" + +#. Engine selector +#: ../src/datasource_routing.c:99 +msgid "Engine:" +msgstr "" + +#. From and To entries +#: ../src/datasource_routing.c:104 +msgid "From:" +msgstr "Nuo:" + +#: ../src/datasource_routing.c:105 +msgid "To:" +msgstr "Iki:" + +#: ../src/datasource_url.c:48 +msgid "Acquire from URL" +msgstr "" + +#: ../src/datasource_url.c:49 +msgid "URL" +msgstr "" + +#: ../src/datasource_url.c:101 +msgid "URL:" +msgstr "" + +#. Only GPX (not using GPSbabel) +#: ../src/datasource_url.c:133 ../src/vikfileentry.c:161 +#: ../src/vikwindow.c:3513 ../src/vikwindow.c:3603 +msgid "GPX" +msgstr "" + +#: ../src/datasource_wikipedia.c:32 +msgid "Create Waypoints from Wikipedia Articles" +msgstr "" + +#: ../src/datasource_wikipedia.c:33 +msgid "Wikipedia Waypoints" +msgstr "" + +#: ../src/dem.c:66 ../src/dem.c:80 +msgid "Invalid DEM" +msgstr "Klaidingas DEM" + +#: ../src/dem.c:122 +msgid "Invalid DEM header" +msgstr "Klaidinga DEM antraštė" + +#: ../src/dem.c:191 ../src/dem.c:204 +msgid "Incorrect DEM Class B record: expected 1" +msgstr "Neteisingas DEM B klasės įrašas: sulauktas 1" + +#: ../src/dem.c:289 ../src/download.c:176 +#, c-format +msgid "Couldn't map file %s: %s" +msgstr "Neįmanoma išdėstyti failo %s: %s" + +#: ../src/download.c:130 +msgid "Tile age (days):" +msgstr "" + +#: ../src/download.c:406 +#, c-format +msgid "Download error: %s" +msgstr "Atsiuntimo klaida: %s" + +#: ../src/download.c:490 +msgid "couldn't open temp file" +msgstr "neįmanoma atverti laikinos bylos" + +#: ../src/file.c:458 ../src/file.c:463 +#, c-format +msgid "Draw mode '%s' no more supported" +msgstr "Braižymo režimas '%s' daugiau nepalaikomas" + +#: ../src/geotag_exif.c:621 +msgid "Not enough memory." +msgstr "" + +#: ../src/geotag_exif.c:639 +msgid "Setting a value for this tag is unsupported!" +msgstr "" + +#: ../src/geotag_exif.c:658 +#, c-format +msgid "Too few components specified (need %d, found %d)\n" +msgstr "" + +#: ../src/geotag_exif.c:662 +msgid "Numeric value expected\n" +msgstr "" + +#: ../src/geotag_exif.c:670 +msgid "This shouldn't happen!" +msgstr "" + +#: ../src/geotag_exif.c:740 +msgid "Not yet implemented!" +msgstr "" + +#: ../src/geotag_exif.c:753 +msgid "Warning; Too many components specified!" +msgstr "" + +#: ../src/osm-traces.c:87 +msgid "Identifiable (public w/ timestamps)" +msgstr "" + +#: ../src/osm-traces.c:88 +msgid "Trackable (private w/ timestamps)" +msgstr "" + +#: ../src/osm-traces.c:89 +msgid "Public" +msgstr "Viešas" + +#: ../src/osm-traces.c:90 +msgid "Private" +msgstr "Privatus" + +#: ../src/osm-traces.c:108 +msgid "Access Token:" +msgstr "" + +#: ../src/osm-traces.c:108 +msgid "Get New OSM Access Tokens" +msgstr "" + +#: ../src/osm-traces.c:109 +msgid "Access Token Key:" +msgstr "" + +#: ../src/osm-traces.c:110 +msgid "Access Token Secret:" +msgstr "" + +#: ../src/osm-traces.c:111 +msgid "OSM username:" +msgstr "OSM vartotojas:" + +#: ../src/osm-traces.c:112 +msgid "OSM password:" +msgstr "OSM slaptažodis:" + +#. Check to really override existing values... +#: ../src/osm-traces.c:263 +msgid "Do you want to overwrite existing values?" +msgstr "" + +#: ../src/osm-traces.c:275 +msgid "Not able to generate OSM request tokens." +msgstr "" + +#: ../src/osm-traces.c:299 +msgid "" +"Waiting for authorization approval.\n" +"Ensure you have granted access at the website before continuing here." +msgstr "" + +#: ../src/osm-traces.c:315 +msgid "No Authorization." +msgstr "" + +#: ../src/osm-traces.c:354 +msgid "" +"OSM Username and Password preferences are not required anymore. You can now " +"remove them." +msgstr "" + +#. Preferences +#: ../src/osm-traces.c:379 +msgid "OpenStreetMap Traces" +msgstr "" + +#: ../src/osm-traces.c:504 +#, c-format +msgid "failed to upload data: HTTP response is %ld" +msgstr "nepavyko išsiųsti duomenų: HTTP atsakas yra %ld" + +#: ../src/osm-traces.c:509 +#, c-format +msgid "curl_easy_getinfo failed: %d" +msgstr "Nepavyko curl_easy_getinfo: %d" + +#: ../src/osm-traces.c:514 +#, c-format +msgid "curl request failed: %s" +msgstr "curl užklausa nepavyko: %s" + +#. Success +#: ../src/osm-traces.c:592 +msgid "Uploaded to OSM" +msgstr "" + +#: ../src/osm-traces.c:596 +msgid "" +"FAILED TO UPLOAD DATA TO OSM - Ensure the OSM access token preferences are " +"setup." +msgstr "" + +#: ../src/osm-traces.c:599 +msgid "FAILED TO UPLOAD DATA TO OSM - CURL PROBLEM" +msgstr "" + +#: ../src/osm-traces.c:602 +msgid "FAILED TO UPLOAD DATA TO OSM" +msgstr "" + +#: ../src/osm-traces.c:602 +msgid "HTTP response code" +msgstr "" + +#: ../src/osm-traces.c:610 +#, c-format +msgid "failed to unlink temporary file: %s" +msgstr "nepavyko atjungti laikinojo failo: %s" + +#: ../src/osm-traces.c:664 +msgid "OSM upload" +msgstr "OSM išsiuntimas" + +#: ../src/osm-traces.c:689 +msgid "" +"The email/username used as login\n" +"Enter the email/username you use to login into www.openstreetmap.org." +"" +msgstr "" + +#: ../src/osm-traces.c:697 +msgid "" +"The password used to login\n" +"Enter the password you use to login into www.openstreetmap.org." +msgstr "" + +#: ../src/osm-traces.c:703 +msgid "File's name:" +msgstr "Failo pavadinimas:" + +#: ../src/osm-traces.c:713 +msgid "" +"The name of the file on OSM\n" +"This is the name of the file created on the server.This is not the " +"name of the local file." +msgstr "" + +#: ../src/osm-traces.c:717 ../src/viktrwlayer_wpwin.c:197 +#: ../src/viktrwlayer_wpwin.c:199 +msgid "Description:" +msgstr "Aprašymas:" + +#: ../src/osm-traces.c:731 +msgid "The description of the trace" +msgstr "Takelio aprašas" + +#: ../src/osm-traces.c:734 +msgid "Anonymize Times:" +msgstr "" + +#: ../src/osm-traces.c:739 +msgid "" +"Anonymize times of the trace.\n" +"You may choose to make the trace identifiable, yet mask the actual " +"real time values" +msgstr "" + +#: ../src/osm-traces.c:743 +msgid "Tags:" +msgstr "Žymos:" + +#: ../src/osm-traces.c:751 +msgid "The tags associated to the trace" +msgstr "Žyma surišta su takeliu" + +#: ../src/osm-traces.c:816 +#, c-format +msgid "Uploading %s to OSM" +msgstr "Išsiunčiamas %s į OSM" + +#: ../src/mapcache.c:67 +msgid "Map cache memory size (MB):" +msgstr "" + +#. NB Can have a couple hundred fonts loaded when using system directories +#. So ATM don't list them all - otherwise need better GUI feedback display. +#: ../src/mapnik_interface.cpp:324 +#, c-format +msgid "" +"%s %s\n" +"Plugins=%sFonts loaded=%d" +msgstr "" + +#: ../src/mapnik_interface.cpp:325 ../src/vikmapniklayer.c:278 +msgid "Mapnik" +msgstr "" + +#: ../src/print.c:51 ../src/viktrwlayer.c:572 +msgid "None" +msgstr "Nėra" + +#: ../src/print.c:52 +msgid "Horizontally" +msgstr "Horizontaliai" + +#: ../src/print.c:53 +msgid "Vertically" +msgstr "Vertikaliai" + +#: ../src/print.c:54 +msgid "Both" +msgstr "Abu" + +#: ../src/print.c:118 +msgid "Image Settings" +msgstr "Paveikslėlio parametrai" + +#: ../src/print.c:551 +msgid "done" +msgstr "Atlikta" + +#. Page Size +#: ../src/print.c:580 +msgid "_Adjust Page Size and Orientation" +msgstr "_Keisti puslapio dydį ir padėtį" + +#: ../src/print.c:596 +msgid "C_enter:" +msgstr "C_entras:" + +#. ignore page margins +#: ../src/print.c:614 +msgid "Ignore Page _Margins" +msgstr "Nepaisyti puslapio _paraščių" + +#: ../src/print.c:633 +msgid "Image S_ize:" +msgstr "Atvaizdo _dydis:" + +#: ../src/ui_util.c:88 +#, c-format +msgid "Could not launch web browser. %s" +msgstr "" + +#: ../src/ui_util.c:101 +#, c-format +msgid "Could not create new email. %s" +msgstr "" + +#: ../src/vikcoordlayer.c:57 +msgid "Color:" +msgstr "Spalva:" + +#: ../src/vikcoordlayer.c:58 +msgid "Minutes Width:" +msgstr "Minučių plotis:" + +#: ../src/vikcoordlayer.c:59 +msgid "Line Thickness:" +msgstr "Linijos storis:" + +#: ../src/vikcoordlayer.c:66 +msgid "Coordinate" +msgstr "" + +#: ../src/main.c:92 +#, c-format +msgid "Ignoring Xlib error: error code %d request code %d\n" +msgstr "" + +#: ../src/main.c:111 +msgid "Enable debug output" +msgstr "Įjungti klaidų aptikimo išvedimus" + +#: ../src/main.c:112 +msgid "Enable verbose output" +msgstr "Įjungti daugiakalbį išvedimą" + +#: ../src/main.c:113 +msgid "Show version" +msgstr "Rodyti versiją" + +#: ../src/main.c:114 +msgid "Latitude in decimal degrees" +msgstr "" + +#: ../src/main.c:115 +msgid "Longitude in decimal degrees" +msgstr "" + +#: ../src/main.c:116 +msgid "Zoom Level (OSM). Value can be 0 - 22" +msgstr "" + +#: ../src/main.c:117 +msgid "Add a map layer by id value. Use 0 for the default map." +msgstr "" + +#: ../src/main.c:160 +#, c-format +msgid "" +"%s %s\n" +"Copyright (c) 2003-2008 Evan Battaglia\n" +"Copyright (c) 2008-%s Viking's contributors\n" +msgstr "" + +#: ../src/osm.c:50 +msgid "OpenStreetMap (Mapnik)" +msgstr "" + +#: ../src/osm.c:65 +msgid "OpenStreetMap (Cycle)" +msgstr "" + +#: ../src/osm.c:79 +msgid "OpenStreetMap (Transport)" +msgstr "" + +#: ../src/osm.c:95 +msgid "OpenStreetMap (Humanitarian)" +msgstr "" + +#: ../src/osm.c:111 +msgid "On Disk OSM Tile Format" +msgstr "" + +#: ../src/osm.c:121 +msgid "MBTiles File" +msgstr "" + +#: ../src/osm.c:132 +msgid "OSM Metatiles" +msgstr "" + +#: ../src/osm.c:146 +msgid "Mapbox Outdoors" +msgstr "" + +#: ../src/osm.c:153 +msgid "Mapbox Specific" +msgstr "" + +#: ../src/osm.c:170 +msgid "OSM (view)" +msgstr "OSM (peržiūra)" + +#: ../src/osm.c:174 +msgid "OSM (edit)" +msgstr "OSM (taisa)" + +#. Note the use of positional parameters +#: ../src/osm.c:179 +msgid "OSM (query)" +msgstr "" + +#: ../src/osm.c:183 +msgid "OSM (render)" +msgstr "OSM (teikti)" + +#. Example: http://127.0.0.1:8111/load_and_zoom?left=8.19&right=8.20&top=48.605&bottom=48.590&select=node413602999 +#. JOSM or merkaartor must already be running with remote interface enabled +#: ../src/osm.c:190 +msgid "Local port 8111 (eg JOSM)" +msgstr "" + +#: ../src/osm.c:195 +msgid "Geofabrik Map Compare" +msgstr "" + +#: ../src/osm.c:203 +msgid "OpenStreetMap Notes" +msgstr "" + +#. Not really OSM but can't be bothered to create somewhere else to put it... +#: ../src/osm.c:221 +msgid "Wikimedia Toolserver GeoHack" +msgstr "" + +#: ../src/preferences.c:195 +msgid "Preferences" +msgstr "Nustatymai" + +#: ../src/toolbar.c:91 ../src/toolbar.c:92 +msgid "System Default" +msgstr "" + +#: ../src/toolbar.c:91 ../src/viktrwlayer.c:563 +msgid "Small" +msgstr "" + +#: ../src/toolbar.c:91 ../src/viktrwlayer.c:564 +msgid "Medium" +msgstr "" + +#: ../src/toolbar.c:91 ../src/viktrwlayer.c:565 +msgid "Large" +msgstr "" + +#: ../src/toolbar.c:92 +msgid "Icons Only" +msgstr "" + +#: ../src/toolbar.c:92 +msgid "Text Only" +msgstr "" + +#: ../src/toolbar.c:92 +msgid "Icons and Text" +msgstr "" + +#: ../src/toolbar.c:106 +msgid "Append to Menu:" +msgstr "" + +#: ../src/toolbar.c:107 +msgid "Pack the toolbar to the main menu to save vertical space" +msgstr "" + +#: ../src/toolbar.c:108 +msgid "Icon Size:" +msgstr "" + +#: ../src/toolbar.c:110 +msgid "Icon Style:" +msgstr "" + +#: ../src/toolbar.c:112 +msgid "Customize:" +msgstr "" + +#: ../src/toolbar.c:112 +msgid "Customize Buttons" +msgstr "" + +#. Preferences +#: ../src/toolbar.c:145 +msgid "Toolbar" +msgstr "" + +#: ../src/toolbar.c:312 +msgid "_Customize" +msgstr "" + +#: ../src/toolbar.c:641 +msgid "Separator" +msgstr "" + +#: ../src/toolbar.c:642 +msgid "--- Separator ---" +msgstr "" + +#: ../src/toolbar.c:1007 +msgid "Customize Toolbar" +msgstr "" + +#: ../src/toolbar.c:1028 +msgid "" +"Select items to be displayed on the toolbar. Items can be reordered by drag " +"and drop." +msgstr "" + +#: ../src/toolbar.c:1044 +msgid "Available Items" +msgstr "" + +#: ../src/toolbar.c:1065 +msgid "Displayed Items" +msgstr "" + +#: ../src/viklayer_defaults.c:232 +#, c-format +msgid "Could not open file: %s" +msgstr "" + +#: ../src/viklayer_defaults.c:304 +msgid "Layer Defaults" +msgstr "" + +#: ../src/uibuilder.c:196 +msgid "Take care that this password will be stored clearly in a plain file." +msgstr "" +"Būkite atidus, nes šis slaptažodis bus išsaugotas tiesiog paprastame faile." + +#: ../src/uibuilder.c:628 ../src/viktrwlayer_export.c:188 +#: ../src/viktrwlayer_export.c:304 ../src/vikwindow.c:3666 +#: ../src/vikwindow.c:4408 +#, c-format +msgid "The file \"%s\" exists, do you wish to overwrite it?" +msgstr "Failas \"%s\" jau yra, ar norite pakeisti?" + +#: ../src/vikaggregatelayer.c:41 +msgid "Aggregate" +msgstr "" + +#: ../src/vikaggregatelayer.c:528 ../src/viktrwlayer.c:11700 +#, c-format +msgid "%s: Waypoint List" +msgstr "" + +#: ../src/vikaggregatelayer.c:570 +msgid "Search by Date" +msgstr "" + +#: ../src/vikaggregatelayer.c:576 +msgid "No items found with the requested date." +msgstr "" + +#: ../src/vikaggregatelayer.c:615 ../src/viktrwlayer.c:11691 +#, c-format +msgid "%s: Track and Route List" +msgstr "" + +#: ../src/vikaggregatelayer.c:681 ../src/viktrwlayer.c:8346 +#: ../src/viktrwlayer.c:8417 ../src/viktrwlayer.c:8494 +msgid "_Visibility" +msgstr "" + +#: ../src/vikaggregatelayer.c:686 +msgid "_Show All" +msgstr "" + +#: ../src/vikaggregatelayer.c:692 +msgid "_Hide All" +msgstr "" + +#: ../src/vikaggregatelayer.c:698 ../src/viktrwlayer.c:8363 +#: ../src/viktrwlayer.c:8434 ../src/viktrwlayer.c:8511 +msgid "_Toggle" +msgstr "" + +#: ../src/vikaggregatelayer.c:705 ../src/viktrwlayer.c:8532 +msgid "_Sort" +msgstr "" + +#: ../src/vikaggregatelayer.c:711 ../src/viktrwlayer.c:8538 +msgid "Name _Ascending" +msgstr "" + +#: ../src/vikaggregatelayer.c:717 ../src/viktrwlayer.c:8544 +msgid "Name _Descending" +msgstr "" + +#: ../src/vikaggregatelayer.c:723 ../src/viktrwlayer.c:575 +#: ../src/viktrwlayer.c:8550 +msgid "Date Ascending" +msgstr "" + +#: ../src/vikaggregatelayer.c:729 ../src/viktrwlayer.c:576 +#: ../src/viktrwlayer.c:8556 +msgid "Date Descending" +msgstr "" + +#: ../src/vikaggregatelayer.c:735 ../src/viktrwlayer.c:8445 +#: ../src/viktrwlayer.c:8523 ../src/viktrwlayer.c:8595 +#: ../src/viktrwlayer_tracklist.c:296 +msgid "_Statistics" +msgstr "" + +#: ../src/vikaggregatelayer.c:740 ../src/viktrwlayer.c:4533 +msgid "Track _List..." +msgstr "" + +#: ../src/vikaggregatelayer.c:746 ../src/viktrwlayer.c:4540 +msgid "_Waypoint List..." +msgstr "" + +#: ../src/vikaggregatelayer.c:753 +msgid "Searc_h" +msgstr "" + +#: ../src/vikaggregatelayer.c:759 +msgid "By _Date..." +msgstr "" + +#: ../src/vikaggregatelayer.c:762 +msgid "Find the first item with a specified date" +msgstr "" + +#: ../src/vikaggregatelayer.c:765 +msgid "Load E_xternal Layers" +msgstr "" + +#. Could have a more complicated tooltip that numbers each type of layers, +#. but for now a simple overall count +#: ../src/vikaggregatelayer.c:1011 +#, c-format +msgid "One layer" +msgid_plural "%d layers" +msgstr[0] "" +msgstr[1] "" + +#: ../src/vikaggregatelayer.c:1014 +#, c-format +msgid "Empty" +msgstr "" + +#: ../src/vikdemlayer.c:86 +msgid "SRTM Global 90m (3 arcsec)" +msgstr "" + +#: ../src/vikdemlayer.c:94 +msgid "Absolute height" +msgstr "" + +#: ../src/vikdemlayer.c:95 +msgid "Height gradient" +msgstr "" + +#: ../src/vikdemlayer.c:120 +msgid "DEM Files:" +msgstr "DEM failai:" + +#: ../src/vikdemlayer.c:121 +msgid "Download Source:" +msgstr "Atsisiuntimų šaltinis:" + +#: ../src/vikdemlayer.c:122 +msgid "Min Elev Color:" +msgstr "" + +#: ../src/vikdemlayer.c:123 ../src/viktrwlayer_wpwin.c:207 +msgid "Type:" +msgstr "Tipas:" + +#: ../src/vikdemlayer.c:124 +msgid "Min Elev:" +msgstr "Min aukštis:" + +#: ../src/vikdemlayer.c:125 +msgid "Max Elev:" +msgstr "Max aukštis:" + +#: ../src/vikdemlayer.c:137 +msgid "_DEM Download" +msgstr "" + +#: ../src/vikdemlayer.c:137 +msgid "DEM Download" +msgstr "" + +#: ../src/vikdemlayer.c:192 +msgid "DEM" +msgstr "" + +#: ../src/vikdemlayer.c:304 +#, c-format +msgid "Number of files: %d" +msgstr "Failų skaičius: %d" + +#: ../src/vikdemlayer.c:446 +msgid "DEM Loading" +msgstr "" + +#: ../src/vikdemlayer.c:927 +#, c-format +msgid "No SRTM data available for %f, %f" +msgstr "Negalimi SRTM duomenys %f, %f" + +#: ../src/vikdemlayer.c:948 +#, c-format +msgid "DEM download failure for %f, %f" +msgstr "" + +#: ../src/vikdemlayer.c:954 +#, c-format +msgid "DEM write failure for %s" +msgstr "" + +#. Probably not over any land... +#: ../src/vikdemlayer.c:1201 +msgid "No DEM File Available" +msgstr "" + +#: ../src/vikdemlayer.c:1220 +#, c-format +msgid "" +"\n" +"Source: %s\n" +"\n" +"DEM File: %s\n" +"DEM File Timestamp: %s" +msgstr "" + +#: ../src/vikdemlayer.c:1224 +#, c-format +msgid "" +"Source: %s\n" +"\n" +"No DEM File!" +msgstr "" + +#: ../src/vikdemlayer.c:1264 +#, c-format +msgid "Downloading DEM %s" +msgstr "Atsiunčiamas DEM %s" + +#: ../src/vikdemlayer.c:1289 +msgid "_Show DEM File Information" +msgstr "" + +#: ../src/vikfileentry.c:72 +msgid "Browse..." +msgstr "Naršyti..." + +#: ../src/vikfileentry.c:103 +msgid "Choose file" +msgstr "Pasirinkite failą" + +#: ../src/vikfileentry.c:120 ../src/vikwindow.c:4372 +msgid "PNG" +msgstr "" + +#: ../src/vikfileentry.c:125 +msgid "TIFF" +msgstr "" + +#: ../src/vikfileentry.c:133 +msgid "MBTiles" +msgstr "" + +#: ../src/vikfileentry.c:142 +msgid "XML" +msgstr "" + +#: ../src/vikfileentry.c:149 +msgid "MML" +msgstr "" + +#: ../src/vikfileentry.c:154 +msgid "MSS" +msgstr "" + +#: ../src/vikfilelist.c:49 +msgid "Choose file(s)" +msgstr "Pasirinkite failą(us)" + +#: ../src/vikfilelist.c:182 +msgid "Add..." +msgstr "Pridėti..." + +#: ../src/vikfilelist.c:183 +msgid "Delete" +msgstr "Ištrinti" + +#: ../src/vikgeoreflayer.c:97 +msgid "_Georef Move Map" +msgstr "" + +#: ../src/vikgeoreflayer.c:97 +msgid "Georef Move Map" +msgstr "Georef judantis žemėlapis" + +#: ../src/vikgeoreflayer.c:106 +msgid "Georef Z_oom Tool" +msgstr "" + +#: ../src/vikgeoreflayer.c:106 +msgid "Georef Zoom Tool" +msgstr "Georef mastelio įrankis" + +#: ../src/vikgeoreflayer.c:117 +msgid "GeoRef Map" +msgstr "" + +#: ../src/vikgeoreflayer.c:214 +msgid "Auto Read World Files:" +msgstr "" + +#: ../src/vikgeoreflayer.c:215 +msgid "" +"Automatically attempt to read associated world file of a new image for a " +"GeoRef layer" +msgstr "" + +#: ../src/vikgeoreflayer.c:511 ../src/vikgeoreflayer.c:797 +#: ../src/vikmapslayer.c:1174 +#, c-format +msgid "Couldn't open image file: %s" +msgstr "Nepavyko atverti atvaizdo failo: %s" + +#: ../src/vikgeoreflayer.c:607 ../src/vikgeoreflayer.c:633 +msgid "Choose World file" +msgstr "Pasirinkti World failą" + +#: ../src/vikgeoreflayer.c:619 +msgid "The World file you requested could not be opened for reading." +msgstr "World failo, kurio pareikalavote, neįmanoma atverti skaitymui." + +#: ../src/vikgeoreflayer.c:621 +msgid "Unexpected end of file reading World file." +msgstr "Netikėta World failo skaitymo pabaiga." + +#: ../src/vikgeoreflayer.c:646 +msgid "The file you requested could not be opened for writing." +msgstr "Failas, kurio pareikalavote, negali būti atvertas rašymui." + +#: ../src/vikgeoreflayer.c:782 +msgid "Lower right corner values may not be consistent with upper right values" +msgstr "" + +#: ../src/vikgeoreflayer.c:806 +#, c-format +msgid "Invalid image size: %s" +msgstr "" + +#: ../src/vikgeoreflayer.c:831 ../src/viklayer.c:561 ../src/vikwindow.c:4891 +msgid "Layer Properties" +msgstr "Sluoksnio ypatybės" + +#: ../src/vikgeoreflayer.c:852 +msgid "World File Parameters:" +msgstr "World failo parametrai:" + +#: ../src/vikgeoreflayer.c:853 +msgid "Load From File..." +msgstr "Įkelti iš failo..." + +#: ../src/vikgeoreflayer.c:858 +msgid "Corner pixel easting:" +msgstr "Kraštinis rytų taškas:" + +#: ../src/vikgeoreflayer.c:860 +msgid "the UTM \"easting\" value of the upper-left corner pixel of the map" +msgstr "" + +#: ../src/vikgeoreflayer.c:862 +msgid "Corner pixel northing:" +msgstr "Kraštinis šiaurės taškas:" + +#: ../src/vikgeoreflayer.c:864 +msgid "the UTM \"northing\" value of the upper-left corner pixel of the map" +msgstr "" + +#: ../src/vikgeoreflayer.c:866 +msgid "X (easting) scale (mpp): " +msgstr "X (rytinė) padala (mpp): " + +#: ../src/vikgeoreflayer.c:867 +msgid "Y (northing) scale (mpp): " +msgstr "Y (šiaurinė) padala (mpp): " + +#: ../src/vikgeoreflayer.c:870 +msgid "the scale of the map in the X direction (meters per pixel)" +msgstr "" + +#: ../src/vikgeoreflayer.c:872 +msgid "the scale of the map in the Y direction (meters per pixel)" +msgstr "" + +#: ../src/vikgeoreflayer.c:874 +msgid "Map Image:" +msgstr "Žemėlapio atvaizdas:" + +#: ../src/vikgeoreflayer.c:919 +msgid "Upper left latitude:" +msgstr "" + +#: ../src/vikgeoreflayer.c:921 +msgid "Upper left longitude:" +msgstr "" + +#: ../src/vikgeoreflayer.c:923 +msgid "Lower right latitude:" +msgstr "" + +#: ../src/vikgeoreflayer.c:925 +msgid "Lower right longitude:" +msgstr "" + +#: ../src/vikgeoreflayer.c:937 +msgid "Calculate MPP values from coordinates" +msgstr "" + +#: ../src/vikgeoreflayer.c:938 +msgid "" +"Enter all corner coordinates before calculating the MPP values from the " +"image size" +msgstr "" + +#: ../src/vikgeoreflayer.c:948 +msgid "UTM" +msgstr "" + +#: ../src/vikgeoreflayer.c:949 +msgid "Latitude/Longitude" +msgstr "" + +#: ../src/vikgeoreflayer.c:957 ../src/vikmapniklayer.c:82 +#: ../src/vikmapslayer.c:158 +msgid "Alpha:" +msgstr "Alfa:" + +#. Now with icons +#: ../src/vikgeoreflayer.c:1062 +msgid "_Zoom to Fit Map" +msgstr "" + +#: ../src/vikgeoreflayer.c:1068 +msgid "_Goto Map Center" +msgstr "" + +#: ../src/vikgeoreflayer.c:1074 +msgid "_Export to World File" +msgstr "" + +#: ../src/vikgoto.c:98 +msgid "No goto tool available." +msgstr "" + +#: ../src/vikgoto.c:295 +msgid "goto" +msgstr "" + +#: ../src/vikgoto.c:297 +msgid "goto provider:" +msgstr "" + +#: ../src/vikgoto.c:312 +msgid "Enter address or place name:" +msgstr "Įveskite adresą ar vietos pavadinimą:" + +#: ../src/vikgoto.c:487 +msgid "Locality" +msgstr "" + +#: ../src/vikgpslayer.c:137 +msgid "Data Mode" +msgstr "" + +#: ../src/vikgpslayer.c:139 +msgid "Realtime Tracking Mode" +msgstr "" + +#: ../src/vikgpslayer.c:176 +msgid "Keep vehicle at center" +msgstr "" + +#: ../src/vikgpslayer.c:177 +msgid "Keep vehicle on screen" +msgstr "" + +#: ../src/vikgpslayer.c:178 +msgid "Disable" +msgstr "" + +#: ../src/vikgpslayer.c:218 +msgid "Download Tracks:" +msgstr "" + +#: ../src/vikgpslayer.c:219 +msgid "Upload Tracks:" +msgstr "" + +#: ../src/vikgpslayer.c:220 +msgid "Download Routes:" +msgstr "" + +#: ../src/vikgpslayer.c:221 +msgid "Upload Routes:" +msgstr "" + +#: ../src/vikgpslayer.c:222 +msgid "Download Waypoints:" +msgstr "" + +#: ../src/vikgpslayer.c:223 +msgid "Upload Waypoints:" +msgstr "" + +#: ../src/vikgpslayer.c:225 +msgid "Recording tracks" +msgstr "Įrašomi keliai" + +#: ../src/vikgpslayer.c:226 +msgid "Jump to current position on start" +msgstr "Peršokti į esamą vietą paleidus programą" + +#: ../src/vikgpslayer.c:227 +msgid "Moving Map Method:" +msgstr "Perkeliamo žemėlapio metodas:" + +#: ../src/vikgpslayer.c:228 +msgid "Update Statusbar:" +msgstr "" + +#: ../src/vikgpslayer.c:228 +msgid "Display information in the statusbar on GPS updates" +msgstr "" + +#: ../src/vikgpslayer.c:229 +msgid "Auto Connect" +msgstr "" + +#: ../src/vikgpslayer.c:229 +msgid "Automatically connect to GPSD" +msgstr "" + +#: ../src/vikgpslayer.c:230 +msgid "Gpsd Host:" +msgstr "Gpsd šeimininkas:" + +#: ../src/vikgpslayer.c:231 +msgid "Gpsd Port:" +msgstr "Gpsd prievadas:" + +#: ../src/vikgpslayer.c:232 +msgid "Gpsd Retry Interval (seconds):" +msgstr "Gpsd bandymų intervalas (sekundėmis):" + +#: ../src/vikgpslayer.c:254 +msgid "GPS" +msgstr "" + +#: ../src/vikgpslayer.c:320 ../src/vikgpslayer.c:1504 +msgid "GPS Download" +msgstr "GPS atsiuntimas" + +#: ../src/vikgpslayer.c:320 ../src/vikgpslayer.c:1504 ../src/viktrwlayer.c:3993 +msgid "GPS Upload" +msgstr "GPS išsiuntimas" + +#: ../src/vikgpslayer.c:322 +msgid "GPS Realtime Tracking" +msgstr "GPS realaus laiko sekimas" + +#: ../src/vikgpslayer.c:458 +msgid "Connected" +msgstr "" + +#: ../src/vikgpslayer.c:460 +msgid "Disconnected" +msgstr "" + +#: ../src/vikgpslayer.c:554 +msgid "Unknown GPS Protocol" +msgstr "Nežinomas GPS protokolas" + +#: ../src/vikgpslayer.c:572 +msgid "Unknown serial port device" +msgstr "Nežinomas įrenginio nuoseklusis prievadas" + +#: ../src/vikgpslayer.c:691 +#, c-format +msgid "%s: unknown parameter" +msgstr "%s: nežinomas parametras" + +#. Now with icons +#: ../src/vikgpslayer.c:794 +msgid "_Upload to GPS" +msgstr "Į_kelti į GPS" + +#: ../src/vikgpslayer.c:800 +msgid "Download from _GPS" +msgstr "" + +#: ../src/vikgpslayer.c:821 +msgid "Empty _Realtime" +msgstr "" + +#: ../src/vikgpslayer.c:828 +msgid "E_mpty Upload" +msgstr "" + +#: ../src/vikgpslayer.c:834 +msgid "_Empty Download" +msgstr "" + +#: ../src/vikgpslayer.c:840 +msgid "Empty _All" +msgstr "" + +#: ../src/vikgpslayer.c:852 +#, c-format +msgid "Unexpected number of disconnected handlers: %d" +msgstr "" + +#: ../src/vikgpslayer.c:995 +#, c-format +msgid "Uploading %d waypoint..." +msgid_plural "Uploading %d waypoints..." +msgstr[0] "Išsiunčiamas %d maršruto taškas..." +msgstr[1] "Išsiunčiami %d maršruto taškai..." +msgstr[2] "Išsiunčiama %d maršruto taškų..." + +#: ../src/vikgpslayer.c:1000 +#, c-format +msgid "Uploading %d trackpoint..." +msgid_plural "Uploading %d trackpoints..." +msgstr[0] "Išsiunčiamas %d kelio taškas..." +msgstr[1] "Išsiunčiami %d kelio taškai..." +msgstr[2] "Išsiunčiama %d kelio taškų..." + +#: ../src/vikgpslayer.c:1005 +#, c-format +msgid "Uploading %d routepoint..." +msgid_plural "Uploading %d routepoints..." +msgstr[0] "" +msgstr[1] "" + +#: ../src/vikgpslayer.c:1034 +#, c-format +msgid "Downloaded %d out of %d waypoint..." +msgid_plural "Downloaded %d out of %d waypoints..." +msgstr[0] "Atsiųstas %d iš %d maršruto taškų..." +msgstr[1] "Atsiųsti %d iš %d maršruto taškų..." +msgstr[2] "Atsiųsta %d iš %d maršruto taškų..." + +#: ../src/vikgpslayer.c:1040 +#, c-format +msgid "Downloaded %d out of %d trackpoint..." +msgid_plural "Downloaded %d out of %d trackpoints..." +msgstr[0] "Atsiųstas %d iš %d kelio taškų..." +msgstr[1] "Atsiųsti %d iš %d kelio taškų..." +msgstr[2] "Atsiųsta %d iš %d kelio taškų..." + +#: ../src/vikgpslayer.c:1046 +#, c-format +msgid "Downloaded %d out of %d routepoint..." +msgid_plural "Downloaded %d out of %d routepoints..." +msgstr[0] "" +msgstr[1] "" + +#: ../src/vikgpslayer.c:1056 +#, c-format +msgid "Uploaded %d out of %d waypoint..." +msgid_plural "Uploaded %d out of %d waypoints..." +msgstr[0] "Išsiųstas %d iš %d maršruto taškų..." +msgstr[1] "Išsiųsti %d iš %d maršruto taškų..." +msgstr[2] "Išsiųsta %d iš %d maršruto taškų..." + +#: ../src/vikgpslayer.c:1062 +#, c-format +msgid "Uploaded %d out of %d trackpoint..." +msgid_plural "Uploaded %d out of %d trackpoints..." +msgstr[0] "Išsiųstas %d iš %d kelio taškų..." +msgstr[1] "Išsiųsti %d iš %d kelio taškų..." +msgstr[2] "Išsiųsta %d iš %d kelio taškų..." + +#: ../src/vikgpslayer.c:1068 +#, c-format +msgid "Uploaded %d out of %d routepoint..." +msgid_plural "Uploaded %d out of %d routepoints..." +msgstr[0] "" +msgstr[1] "" + +#: ../src/vikgpslayer.c:1079 +#, c-format +msgid "Downloaded %d waypoint" +msgid_plural "Downloaded %d waypoints" +msgstr[0] "Atsiųstas %d maršruto taškas" +msgstr[1] "Atsiųsti %d maršruto taškai" +msgstr[2] "Atsiųsta %d maršruto taškų" + +#: ../src/vikgpslayer.c:1085 +#, c-format +msgid "Downloaded %d trackpoint" +msgid_plural "Downloaded %d trackpoints" +msgstr[0] "Atsiųstas %d kelio taškas" +msgstr[1] "Atsiųsti %d kelio taškai" +msgstr[2] "Atsiųsta %d kelio taškų" + +#: ../src/vikgpslayer.c:1091 +#, c-format +msgid "Downloaded %d routepoint" +msgid_plural "Downloaded %d routepoints" +msgstr[0] "" +msgstr[1] "" + +#: ../src/vikgpslayer.c:1101 +#, c-format +msgid "Uploaded %d waypoint" +msgid_plural "Uploaded %d waypoints" +msgstr[0] "Išsiųstas %d maršruto taškas" +msgstr[1] "Išsiųsti %d maršruto taškai" +msgstr[2] "Išsiųsta %d maršruto taškų" + +#: ../src/vikgpslayer.c:1107 +#, c-format +msgid "Uploaded %d trackpoint" +msgid_plural "Uploaded %d trackpoints" +msgstr[0] "Išsiųstas %d kelio taškas" +msgstr[1] "Išsiųsti %d kelio taškai" +msgstr[2] "Išsiųsta %d kelio taškų" + +#: ../src/vikgpslayer.c:1113 +#, c-format +msgid "Uploaded %d routepoint" +msgid_plural "Uploaded %d routepoints" +msgstr[0] "" +msgstr[1] "" + +#: ../src/vikgpslayer.c:1363 +msgid "Error: No result." +msgstr "" + +#: ../src/vikgpslayer.c:1471 +msgid "Warning - GPS Upload items may overwrite each other" +msgstr "" + +#: ../src/vikgpslayer.c:1506 +msgid "Status: detecting gpsbabel" +msgstr "Būsena: aptinkamas gpsbabel" + +#: ../src/vikgpslayer.c:1533 +msgid "No GPS items selected for transfer." +msgstr "" + +#: ../src/vikgpslayer.c:1546 +msgid "Could not turn off device." +msgstr "" + +#: ../src/vikgpslayer.c:1589 +msgid "Are you sure you want to delete GPS Upload data?" +msgstr "" + +#: ../src/vikgpslayer.c:1602 +msgid "Are you sure you want to delete GPS Download data?" +msgstr "" + +#: ../src/vikgpslayer.c:1616 +msgid "Are you sure you want to delete GPS Realtime data?" +msgstr "" + +#: ../src/vikgpslayer.c:1630 +msgid "Are you sure you want to delete All GPS data?" +msgstr "" + +#: ../src/vikgpslayer.c:2004 +#, c-format +msgid "" +"Failed to connect to gpsd at %s (port %s)\n" +"Should Viking keep trying (every %d seconds)?" +msgstr "" + +#: ../src/viklayerspanel.c:73 +msgid "C_ut" +msgstr "" + +#: ../src/viklayerspanel.c:74 ../src/vikwindow.c:4882 +msgid "_Copy" +msgstr "_Kopijuoti" + +#: ../src/viklayerspanel.c:75 ../src/vikwindow.c:4883 +msgid "_Paste" +msgstr "Į_terpti" + +#: ../src/viklayerspanel.c:76 ../src/vikwindow.c:4884 +msgid "_Delete" +msgstr "_Ištrinti" + +#: ../src/viklayerspanel.c:154 +msgid "New Layer" +msgstr "" + +#: ../src/viklayerspanel.c:347 +msgid "Top Layer" +msgstr "Viršutinis sluoksnis" + +#: ../src/viklayerspanel.c:363 +msgid "Add new layer" +msgstr "Pridėti naują sluoksnį" + +#: ../src/viklayerspanel.c:370 ../src/vikwindow.c:4884 +msgid "Remove selected layer" +msgstr "Pašalinti pažymėtą sluoksnį" + +#: ../src/viklayerspanel.c:377 +msgid "Move selected layer up" +msgstr "" + +#: ../src/viklayerspanel.c:384 +msgid "Move selected layer down" +msgstr "" + +#: ../src/viklayerspanel.c:391 ../src/vikwindow.c:4881 +msgid "Cut selected layer" +msgstr "Iškirpti pasirinktą sluoksnį" + +#: ../src/viklayerspanel.c:398 ../src/vikwindow.c:4882 +msgid "Copy selected layer" +msgstr "Kopijuoti pasirinktą sluoksnį" + +#: ../src/viklayerspanel.c:405 ../src/vikwindow.c:4883 +msgid "" +"Paste layer into selected container layer or otherwise above selected layer" +msgstr "" + +#: ../src/viklayerspanel.c:502 +msgid "New name can not be blank." +msgstr "" + +#: ../src/viklayerspanel.c:751 +msgid "Aggregate Layers have no settable properties." +msgstr "Bendri sluoksniai neturi nustatomų ypatybių." + +#: ../src/viklayerspanel.c:798 +msgid "You cannot cut the Top Layer." +msgstr "Jūs negalite iškirpti viršutinio sluoksnio." + +#: ../src/viklayerspanel.c:843 +#, c-format +msgid "Are you sure you want to delete %s?" +msgstr "" + +#: ../src/viklayerspanel.c:863 +msgid "You cannot delete the Top Layer." +msgstr "Jūs negalite ištrinti viršutinio sluoksnio." + +#: ../src/vikmapniklayer.c:78 +msgid "CSS (MML) Config File:" +msgstr "" + +#: ../src/vikmapniklayer.c:79 +msgid "CartoCSS configuration file" +msgstr "" + +#: ../src/vikmapniklayer.c:80 +msgid "XML Config File:" +msgstr "" + +#: ../src/vikmapniklayer.c:81 +msgid "Mapnik XML configuration file" +msgstr "" + +#: ../src/vikmapniklayer.c:84 +msgid "Use File Cache:" +msgstr "" + +#: ../src/vikmapniklayer.c:86 +msgid "File Cache Directory:" +msgstr "" + +#: ../src/vikmapniklayer.c:122 +msgid "_Mapnik Features" +msgstr "" + +#: ../src/vikmapniklayer.c:122 +msgid "Mapnik Features" +msgstr "" + +#: ../src/vikmapniklayer.c:140 +msgid "Mapnik Rendering" +msgstr "" + +#. Changing these values only applies before first mapnik layer is 'created' +#: ../src/vikmapniklayer.c:258 +msgid "Plugins Directory:" +msgstr "" + +#: ../src/vikmapniklayer.c:258 ../src/vikmapniklayer.c:259 +#: ../src/vikmapniklayer.c:260 ../src/vikmapniklayer.c:261 +msgid "You need to restart Viking for a change to this value to be used" +msgstr "" + +#: ../src/vikmapniklayer.c:259 +msgid "Fonts Directory:" +msgstr "" + +#: ../src/vikmapniklayer.c:260 +msgid "Recurse Fonts Directory:" +msgstr "" + +#: ../src/vikmapniklayer.c:261 +msgid "Rerender Timeout (hours):" +msgstr "" + +#. Changeable any time +#: ../src/vikmapniklayer.c:263 +msgid "CartoCSS:" +msgstr "" + +#: ../src/vikmapniklayer.c:263 +msgid "The program to convert CartoCSS files into Mapnik XML" +msgstr "" + +#: ../src/vikmapniklayer.c:506 +msgid "Running" +msgstr "" + +#: ../src/vikmapniklayer.c:525 +#, c-format +msgid "" +"Error running carto command:\n" +"%s" +msgstr "" + +#: ../src/vikmapniklayer.c:561 +msgid " completed in " +msgstr "" + +#: ../src/vikmapniklayer.c:561 +msgid "seconds" +msgstr "" + +#: ../src/vikmapniklayer.c:611 ../src/vikmapniklayer.c:979 +#, c-format +msgid "" +"Mapnik error loading configuration file:\n" +"%s" +msgstr "" + +#: ../src/vikmapniklayer.c:749 +#, c-format +msgid "Mapnik Render %d:%d:%d %s" +msgstr "" + +#: ../src/vikmapniklayer.c:840 +msgid "Mapnik Rendering must be in Mercator mode" +msgstr "" + +#: ../src/vikmapniklayer.c:997 +msgid "Mapnik Information" +msgstr "" + +#: ../src/vikmapniklayer.c:1031 +msgid "_Flush Memory Cache" +msgstr "" + +#: ../src/vikmapniklayer.c:1044 +msgid "_Run Carto Command" +msgstr "" + +#: ../src/vikmapniklayer.c:1102 ../src/vikmapslayer.c:2029 +#, c-format +msgid "Tile File Timestamp: %s" +msgstr "" + +#: ../src/vikmapniklayer.c:1105 ../src/vikmapslayer.c:2032 +msgid "Tile File Timestamp: Not Available" +msgstr "" + +#: ../src/vikmapniklayer.c:1120 +#, c-format +msgid "Rendering time %.2f seconds" +msgstr "" + +#: ../src/vikmapniklayer.c:1124 ../src/vikmapslayer.c:2042 +msgid "Tile Information" +msgstr "" + +#: ../src/vikmapniklayer.c:1145 +msgid "_Rerender Tile" +msgstr "" + +#: ../src/vikmapniklayer.c:1150 +msgid "_Info" +msgstr "" + +#. ******* MAPZOOMS ******** +#: ../src/vikmapslayer.c:96 +msgid "Use Viking Zoom Level" +msgstr "Naudoti Viking mastelio lygį" + +#: ../src/vikmapslayer.c:146 +msgid "OSM" +msgstr "" + +#. NB mode => id - But can't break file format just to rename something better +#: ../src/vikmapslayer.c:152 +msgid "Map Type:" +msgstr "Žemėlapio tipas:" + +#: ../src/vikmapslayer.c:153 +msgid "Maps Directory:" +msgstr "Žemėlapių katalogas:" + +#: ../src/vikmapslayer.c:154 +msgid "Cache Layout:" +msgstr "" + +#: ../src/vikmapslayer.c:155 +msgid "This determines the tile storage layout on disk" +msgstr "" + +#: ../src/vikmapslayer.c:156 +msgid "Map File:" +msgstr "" + +#: ../src/vikmapslayer.c:157 +msgid "An MBTiles file. Only applies when the map type method is 'MBTiles'" +msgstr "" + +#: ../src/vikmapslayer.c:159 +msgid "Control the Alpha value for transparency effects" +msgstr "" + +#: ../src/vikmapslayer.c:160 +msgid "Autodownload maps:" +msgstr "Automatiškai atsiųsti žemėlapiai:" + +#: ../src/vikmapslayer.c:161 +msgid "Autodownload Only Gets Missing Maps:" +msgstr "" + +#: ../src/vikmapslayer.c:162 +msgid "" +"Using this option avoids attempting to update already acquired tiles. This " +"can be useful if you want to restrict the network usage, without having to " +"resort to manual control. Only applies when 'Autodownload Maps' is on." +msgstr "" + +#: ../src/vikmapslayer.c:163 +msgid "Zoom Level:" +msgstr "Mastelio lygis:" + +#: ../src/vikmapslayer.c:164 +msgid "" +"Determines the method of displaying map tiles for the current zoom level. " +"'Viking Zoom Level' uses the best matching level, otherwise setting a fixed " +"value will always use map tiles of the specified value regardless of the " +"actual zoom level." +msgstr "" + +#: ../src/vikmapslayer.c:197 +msgid "_Maps Download" +msgstr "" + +#: ../src/vikmapslayer.c:197 +msgid "Maps Download" +msgstr "Atsiųsti žemėlapiai" + +#: ../src/vikmapslayer.c:213 ../src/vikutils.c:895 +msgid "Map" +msgstr "Žemėlapis" + +#: ../src/vikmapslayer.c:306 +msgid "Default map layer directory:" +msgstr "" + +#: ../src/vikmapslayer.c:306 +msgid "Choose a directory to store cached Map tiles for this layer" +msgstr "" + +#: ../src/vikmapslayer.c:436 ../src/vikmapslayer.c:633 +msgid "Unknown map type" +msgstr "Nežinomas žemėlapio tipas" + +#: ../src/vikmapslayer.c:664 +msgid "Unknown Map Zoom" +msgstr "Nežinomas žemėlapio mastelis" + +#: ../src/vikmapslayer.c:833 +#, c-format +msgid "Failed to open MBTiles file: %s" +msgstr "" + +#: ../src/vikmapslayer.c:856 +#, c-format +msgid "" +"New map cannot be displayed in the current drawmode.\n" +"Select \"%s\" from View menu to view it." +msgstr "" +"Naujas žemėlapis neįmanoma parodyti dabartiniame braižymo režime.\n" +"Pasirinkite \"%s\" iš Rodyti meniu, kad galėtumėte peržiūrėti jį." + +#: ../src/vikmapslayer.c:1314 +#, c-format +msgid "" +"Cowardly refusing to draw tiles or existence of tiles beyond %d zoom out " +"factor" +msgstr "" +"Bailiai atsisakyti brėžti kvadratus arba esančius kvadratų už %d mastelio " +"faktoriaus" + +#. TODO: ?? count up the number of download errors somehow... +#: ../src/vikmapslayer.c:1667 +msgid "Failed to download tile" +msgstr "" + +#: ../src/vikmapslayer.c:1673 +msgid "Unable to save tile" +msgstr "" + +#: ../src/vikmapslayer.c:1799 +#, c-format +msgid "Redownloading up to %d %s map..." +msgid_plural "Redownloading up to %d %s maps..." +msgstr[0] "Pakartotinai atsiunčiama iki %d %s žemėlapio..." +msgstr[1] "Pakartotinai atsiunčiama iki %d %s žemėlapių..." +msgstr[2] "Pakartotinai atsiunčiama iki %d %s žemėlapių..." + +#: ../src/vikmapslayer.c:1801 +#, c-format +msgid "Redownloading %d %s map..." +msgid_plural "Redownloading %d %s maps..." +msgstr[0] "Pakartotinai atsiunčiamas %d %s žemėlapis..." +msgstr[1] "Pakartotinai atsiunčiami %d %s žemėlapiai..." +msgstr[2] "Pakartotinai atsiunčiama %d %s žemėlapių..." + +#: ../src/vikmapslayer.c:1805 ../src/vikmapslayer.c:1890 +#, c-format +msgid "Downloading %d %s map..." +msgid_plural "Downloading %d %s maps..." +msgstr[0] "Atsiunčiamas %d %s žemėlapis..." +msgstr[1] "Atsiunčiami %d %s žemėlapiai..." +msgstr[2] "Atsiunčiama %d %s žemėlapių..." + +#: ../src/vikmapslayer.c:1969 +msgid "YES" +msgstr "" + +#: ../src/vikmapslayer.c:1973 ../src/vikmapslayer.c:1977 +msgid "NO" +msgstr "" + +#. NB Also handles .jpg automatically due to pixbuf_new_from () support - although just print png for now. +#: ../src/vikmapslayer.c:1980 +#, c-format +msgid "Source: %s (%d%s%d%s%d.%s %s)" +msgstr "" + +#: ../src/vikmapslayer.c:1983 +msgid "Source: Not available" +msgstr "" + +#: ../src/vikmapslayer.c:2000 +msgid "Source: file://" +msgstr "" + +#: ../src/vikmapslayer.c:2012 +#, c-format +msgid "Source: %s" +msgstr "" + +#: ../src/vikmapslayer.c:2038 +#, c-format +msgid "Tile File: %s [Not Available]" +msgstr "" + +#: ../src/vikmapslayer.c:2086 +msgid "Redownload _Bad Map(s)" +msgstr "" + +#: ../src/vikmapslayer.c:2090 +msgid "Redownload _New Map(s)" +msgstr "" + +#: ../src/vikmapslayer.c:2094 +msgid "Redownload _All Map(s)" +msgstr "" + +#: ../src/vikmapslayer.c:2099 +msgid "_Show Tile Information" +msgstr "" + +#: ../src/vikmapslayer.c:2166 +#, c-format +msgid "" +"Wrong drawmode for this map.\n" +"Select \"%s\" from View menu and try again." +msgstr "" +"Klaidingas šio žemėlapio braižymo režimas.\n" +"Pasirinkite iš meniu \"%s\" ir bandykite dar kartą." + +#: ../src/vikmapslayer.c:2171 +msgid "Wrong zoom level for this map." +msgstr "Klaidingas šio žemėlapio mastelio lygis." + +#: ../src/vikmapslayer.c:2334 +msgid "Zoom Start:" +msgstr "" + +#: ../src/vikmapslayer.c:2341 +msgid "Zoom End:" +msgstr "" + +#: ../src/vikmapslayer.c:2347 +msgid "Download Maps Method:" +msgstr "" + +#. redownload method - needs to align with REDOWNLOAD* macro values +#: ../src/vikmapslayer.c:2419 +msgid "Missing" +msgstr "" + +#: ../src/vikmapslayer.c:2419 +msgid "Bad" +msgstr "" + +#: ../src/vikmapslayer.c:2419 +msgid "New" +msgstr "" + +#: ../src/vikmapslayer.c:2419 +msgid "Reload All" +msgstr "" + +#: ../src/vikmapslayer.c:2421 +msgid "Download for Zoom Levels" +msgstr "" + +#: ../src/vikmapslayer.c:2461 +#, c-format +msgid "" +"You are not allowed to download more than %d tiles in one go (requested %d)" +msgstr "" + +#: ../src/vikmapslayer.c:2469 +#, c-format +msgid "Do you really want to download %d tiles?" +msgstr "" + +#. Now with icons +#: ../src/vikmapslayer.c:2509 +msgid "Download _Missing Onscreen Maps" +msgstr "" + +#: ../src/vikmapslayer.c:2516 +msgid "Download _New Onscreen Maps" +msgstr "" + +#: ../src/vikmapslayer.c:2523 +msgid "Reload _All Onscreen Maps" +msgstr "" + +#: ../src/vikmapslayer.c:2529 +msgid "Download Maps in _Zoom Levels..." +msgstr "" + +#: ../src/vikmapslayer.c:2539 +#, fuzzy +msgid "_Open MBTiles Files" +msgstr "Atverti failą" + +#: ../src/vikmapslayer.c:2554 +msgid "Flush Map Cache" +msgstr "" + +#: ../src/vikrouting.c:54 +msgid "Default engine:" +msgstr "" + +#: ../src/vikrouting.c:68 +msgid "Routing" +msgstr "" + +#: ../src/viktreeview.c:347 +msgid "Layer Name" +msgstr "Sluoksnio pavadinimas" + +#: ../src/viktreeview.c:924 +#, c-format +msgid "delete data from %s\n" +msgstr "ištrinti duomenis iš %s\n" + +#: ../src/viktrwlayer.c:427 +msgid "Create _Waypoint" +msgstr "" + +#: ../src/viktrwlayer.c:427 +msgid "Create Waypoint" +msgstr "Sukurti maršruto tašką" + +#: ../src/viktrwlayer.c:437 +#, fuzzy +msgid "Edit _Track" +msgstr "Keisti kelio taškus" + +#: ../src/viktrwlayer.c:437 +#, fuzzy +msgid "Edit Track" +msgstr "Keisti kelio taškus" + +#: ../src/viktrwlayer.c:449 +msgid "Edit _Route" +msgstr "" + +#: ../src/viktrwlayer.c:449 +#, fuzzy +msgid "Edit Route" +msgstr "Keisti maršruto taškus" + +#: ../src/viktrwlayer.c:460 +msgid "Route _Finder" +msgstr "" + +#: ../src/viktrwlayer.c:460 +msgid "Route Finder" +msgstr "" + +#: ../src/viktrwlayer.c:471 +#, fuzzy +msgid "Splitter" +msgstr "Skaidyti čia" + +#: ../src/viktrwlayer.c:482 +msgid "_Edit Waypoint" +msgstr "" + +#: ../src/viktrwlayer.c:482 +msgid "Edit Waypoint" +msgstr "Keisti maršruto taškus" + +#: ../src/viktrwlayer.c:495 +msgid "Edit Trac_kpoint" +msgstr "" + +#: ../src/viktrwlayer.c:495 +msgid "Edit Trackpoint" +msgstr "Keisti kelio taškus" + +#. a pixbuf for this one is already made globally available +#: ../src/viktrwlayer.c:508 +msgid "Show P_icture" +msgstr "" + +#: ../src/viktrwlayer.c:508 +msgid "Show Picture" +msgstr "Rodyti nuotrauką" + +#: ../src/viktrwlayer.c:531 +msgid "Waypoint Images" +msgstr "Maršruto taškų atvaizdai" + +#: ../src/viktrwlayer.c:531 +msgid "Tracks Advanced" +msgstr "" + +#: ../src/viktrwlayer.c:531 +msgid "Metadata" +msgstr "" + +#: ../src/viktrwlayer.c:531 +msgid "Filesystem" +msgstr "" + +#: ../src/viktrwlayer.c:534 +msgid "Draw by Track" +msgstr "Brėžti pagal kelią" + +#: ../src/viktrwlayer.c:534 +msgid "Draw by Speed" +msgstr "" + +#: ../src/viktrwlayer.c:534 +msgid "All Tracks Same Color" +msgstr "" + +#: ../src/viktrwlayer.c:535 +msgid "Filled Square" +msgstr "Užpildytas kvadratas" + +#: ../src/viktrwlayer.c:535 +msgid "Square" +msgstr "Kvadratas" + +#: ../src/viktrwlayer.c:535 +msgid "Circle" +msgstr "Apskritimas" + +#: ../src/viktrwlayer.c:535 +msgid "X" +msgstr "X" + +#: ../src/viktrwlayer.c:561 +msgid "Extra Extra Small" +msgstr "" + +#: ../src/viktrwlayer.c:562 +msgid "Extra Small" +msgstr "" + +#: ../src/viktrwlayer.c:566 +msgid "Extra Large" +msgstr "" + +#: ../src/viktrwlayer.c:567 +msgid "Extra Extra Large" +msgstr "" + +#: ../src/viktrwlayer.c:573 +msgid "Name Ascending" +msgstr "" + +#: ../src/viktrwlayer.c:574 +msgid "Name Descending" +msgstr "" + +#: ../src/viktrwlayer.c:582 ../src/viktrwlayer_propwin.c:3319 +msgid "No" +msgstr "" + +#: ../src/viktrwlayer.c:583 +msgid "Yes" +msgstr "" + +#: ../src/viktrwlayer.c:584 +msgid "No write" +msgstr "" + +#: ../src/viktrwlayer.c:649 ../src/viktrwlayer.c:673 +msgid "Draw Labels" +msgstr "Brėžinio kortelės" + +#: ../src/viktrwlayer.c:650 +msgid "Note: the individual track controls what labels may be displayed" +msgstr "" + +#: ../src/viktrwlayer.c:651 +msgid "Track Labels Font Size:" +msgstr "" + +#: ../src/viktrwlayer.c:652 +msgid "Track Drawing Mode:" +msgstr "Kelio brėžimo režimas:" + +#: ../src/viktrwlayer.c:653 +msgid "All Tracks Color:" +msgstr "" + +#: ../src/viktrwlayer.c:654 +msgid "The color used when 'All Tracks Same Color' drawing mode is selected" +msgstr "" + +#: ../src/viktrwlayer.c:655 +msgid "Draw Track Lines" +msgstr "Brėžti kelio linijas" + +#: ../src/viktrwlayer.c:656 +msgid "Track Thickness:" +msgstr "Kelio storis:" + +#: ../src/viktrwlayer.c:657 +msgid "Draw Track Direction" +msgstr "" + +#: ../src/viktrwlayer.c:658 +msgid "Direction Size:" +msgstr "" + +#: ../src/viktrwlayer.c:659 +msgid "Draw Trackpoints" +msgstr "Brėžti kelio taškus" + +#: ../src/viktrwlayer.c:660 +msgid "Trackpoint Size:" +msgstr "" + +#: ../src/viktrwlayer.c:661 +msgid "Draw Elevation" +msgstr "Brėžti aukštį" + +#: ../src/viktrwlayer.c:662 +msgid "Draw Elevation Height %:" +msgstr "Brėžiamas kilimo aukštis %:" + +#: ../src/viktrwlayer.c:663 +msgid "Draw Stops" +msgstr "Brėžimas sustabdytas" + +#: ../src/viktrwlayer.c:664 +msgid "" +"Whether to draw a marker when trackpoints are at the same position but over " +"the minimum stop length apart in time" +msgstr "" + +#: ../src/viktrwlayer.c:665 +msgid "Min Stop Length (seconds):" +msgstr "Min sustojimo laikas (sekundėmis):" + +#: ../src/viktrwlayer.c:667 +msgid "Track BG Thickness:" +msgstr "Kelio fono storis:" + +#: ../src/viktrwlayer.c:668 +msgid "Track Background Color" +msgstr "Kelio fono spalva" + +#: ../src/viktrwlayer.c:669 +msgid "Draw by Speed Factor (%):" +msgstr "" + +#: ../src/viktrwlayer.c:670 +msgid "" +"The percentage factor away from the average speed determining the color used" +msgstr "" + +#: ../src/viktrwlayer.c:671 +msgid "Track Sort Order:" +msgstr "" + +#: ../src/viktrwlayer.c:674 +msgid "Waypoint Font Size:" +msgstr "" + +#: ../src/viktrwlayer.c:675 +msgid "Waypoint Color:" +msgstr "Maršruto taško spalva:" + +#: ../src/viktrwlayer.c:676 +msgid "Waypoint Text:" +msgstr "Maršruto taško tekstas:" + +#: ../src/viktrwlayer.c:677 +msgid "Background:" +msgstr "Fonas:" + +#: ../src/viktrwlayer.c:678 +msgid "Fake BG Color Translucency:" +msgstr "Netinkamas fono spalvos skaidrumas:" + +#: ../src/viktrwlayer.c:679 +msgid "Waypoint marker:" +msgstr "Maršruto taško žymeklis:" + +#: ../src/viktrwlayer.c:680 +msgid "Waypoint size:" +msgstr "Maršruto taško dydis:" + +#: ../src/viktrwlayer.c:681 +msgid "Draw Waypoint Symbols:" +msgstr "Brėžti maršruto taško simbolius:" + +#: ../src/viktrwlayer.c:682 +msgid "Waypoint Sort Order:" +msgstr "" + +#: ../src/viktrwlayer.c:684 +msgid "Draw Waypoint Images" +msgstr "Brėžti maršruto taško atvaizdus" + +#: ../src/viktrwlayer.c:685 +msgid "Image Size (pixels):" +msgstr "Atvaizdo dydis (taškais):" + +#: ../src/viktrwlayer.c:686 +msgid "Image Alpha:" +msgstr "Alfa atvaizdas:" + +#: ../src/viktrwlayer.c:687 +msgid "Image Memory Cache Size:" +msgstr "Atvaizdi spartinančiosios atminties dydis:" + +#: ../src/viktrwlayer.c:690 +msgid "Author" +msgstr "" + +#: ../src/viktrwlayer.c:691 +msgid "Creation Time" +msgstr "" + +#: ../src/viktrwlayer.c:692 +msgid "Keywords" +msgstr "" + +#: ../src/viktrwlayer.c:693 +msgid "External layer:" +msgstr "" + +#: ../src/viktrwlayer.c:693 +msgid "" +"Layer data stored in the Viking file, in an external file, or in an external " +"file but changes are not written to the file (file only loaded at startup)" +msgstr "" + +#: ../src/viktrwlayer.c:694 +msgid "Save layer as:" +msgstr "" + +#: ../src/viktrwlayer.c:694 +msgid "Specify where layer should be saved. Overwrites file if it exists." +msgstr "" + +#: ../src/viktrwlayer.c:798 +msgid "TrackWaypoint" +msgstr "" + +#: ../src/viktrwlayer.c:1999 ../src/viktrwlayer_propwin.c:1469 +#: ../src/viktrwlayer_propwin.c:1471 ../src/vikutils.c:299 +#: ../src/vikutils.c:326 +msgid "miles" +msgstr "" + +#: ../src/viktrwlayer.c:2002 ../src/viktrwlayer_propwin.c:1475 +#: ../src/viktrwlayer_propwin.c:1477 ../src/vikutils.c:303 +#: ../src/vikutils.c:330 +msgid "NM" +msgstr "" + +#. VIK_UNITS_DISTANCE_KILOMETRES: +#: ../src/viktrwlayer.c:2006 ../src/viktrwlayer_propwin.c:1482 +#: ../src/viktrwlayer_propwin.c:1484 ../src/vikutils.c:308 +#: ../src/vikutils.c:335 +msgid "km" +msgstr "" + +#: ../src/viktrwlayer.c:2121 +msgid "start/end" +msgstr "" + +#: ../src/viktrwlayer.c:2133 +msgid "start" +msgstr "" + +#: ../src/viktrwlayer.c:2142 +msgid "end" +msgstr "" + +#: ../src/viktrwlayer.c:3103 +#, c-format +msgid " in %d:%02d hrs:mins" +msgstr "" + +#: ../src/viktrwlayer.c:3107 +#, c-format +msgid "" +"\n" +"%sTotal Length %.1f %s%s" +msgstr "" + +#: ../src/viktrwlayer.c:3131 +#, c-format +msgid "" +"\n" +"Total route length %.1f %s" +msgstr "" + +#: ../src/viktrwlayer.c:3136 +#, c-format +msgid "Tracks: %d - Waypoints: %d - Routes: %d%s%s" +msgstr "" + +#: ../src/viktrwlayer.c:3155 +#, c-format +msgid "Tracks: %d" +msgstr "" + +#: ../src/viktrwlayer.c:3165 +#, c-format +msgid "Routes: %d" +msgstr "" + +#: ../src/viktrwlayer.c:3195 +#, c-format +msgid "- %d:%02d hrs:mins" +msgstr "" + +#: ../src/viktrwlayer.c:3202 +#, c-format +msgid "%s%.1f km %s" +msgstr "" + +#: ../src/viktrwlayer.c:3205 +#, c-format +msgid "%s%.1f miles %s" +msgstr "" + +#: ../src/viktrwlayer.c:3208 +#, c-format +msgid "%s%.1f NM %s" +msgstr "" + +#: ../src/viktrwlayer.c:3222 +#, c-format +msgid "Waypoints: %d" +msgstr "" + +#: ../src/viktrwlayer.c:3279 +#, c-format +msgid "Wpt: Alt %dft" +msgstr "" + +#. VIK_UNITS_HEIGHT_METRES: +#: ../src/viktrwlayer.c:3283 +#, c-format +msgid "Wpt: Alt %dm" +msgstr "" + +#. Add comment if available +#: ../src/viktrwlayer.c:3298 +#, c-format +msgid "%s | %s %s | Comment: %s" +msgstr "" + +#: ../src/viktrwlayer.c:3300 +#, c-format +msgid "%s | %s %s" +msgstr "" + +#: ../src/viktrwlayer.c:3562 ../src/viktrwlayer.c:3591 +msgid "This layer has no waypoints or trackpoints." +msgstr "Šis sluoksnis neturi maršruto ir kelio taškų." + +#: ../src/viktrwlayer.c:3598 ../src/viktrwlayer.c:3607 +#: ../src/viktrwlayer.c:3616 ../src/viktrwlayer.c:3625 +#: ../src/viktrwlayer.c:3634 ../src/viktrwlayer.c:3642 +msgid "Export Layer" +msgstr "Eksportavimo sluoksnis" + +#: ../src/viktrwlayer.c:3671 +msgid "Export Route as GPX" +msgstr "" + +#: ../src/viktrwlayer.c:3673 +msgid "Export Track as GPX" +msgstr "" + +#: ../src/viktrwlayer.c:3693 +msgid "Find" +msgstr "Rasti" + +#: ../src/viktrwlayer.c:3703 +msgid "Waypoint Name:" +msgstr "Maršruto taško pavadinimas:" + +#: ../src/viktrwlayer.c:3720 +msgid "Waypoint not found in this layer." +msgstr "Maršruto taškas nerastas šiame sluoksnyje." + +#: ../src/viktrwlayer.c:3989 +msgid "Can not upload invisible track." +msgstr "" + +#: ../src/viktrwlayer.c:4082 ../src/viktrwlayer.c:10512 +msgid "Track" +msgstr "" + +#: ../src/viktrwlayer.c:4107 ../src/viktrwlayer.c:10599 +msgid "Route" +msgstr "" + +#: ../src/viktrwlayer.c:4194 +msgid "Externa_l" +msgstr "" + +#: ../src/viktrwlayer.c:4216 ../src/viktrwlayer.c:8456 +#: ../src/viktrwlayer.c:8574 +msgid "_Finish Route" +msgstr "" + +#: ../src/viktrwlayer.c:4218 ../src/viktrwlayer.c:8380 +#: ../src/viktrwlayer.c:8572 +msgid "_Finish Track" +msgstr "" + +#. Now with icons +#: ../src/viktrwlayer.c:4230 +msgid "_View Layer" +msgstr "" + +#: ../src/viktrwlayer.c:4237 +msgid "V_iew" +msgstr "" + +#: ../src/viktrwlayer.c:4243 +msgid "View All _Tracks" +msgstr "" + +#: ../src/viktrwlayer.c:4248 +msgid "View All _Routes" +msgstr "" + +#: ../src/viktrwlayer.c:4253 +msgid "View All _Waypoints" +msgstr "" + +#: ../src/viktrwlayer.c:4258 +msgid "_Goto Center of Layer" +msgstr "" + +#: ../src/viktrwlayer.c:4264 ../src/viktrwlayer.c:8321 +msgid "Goto _Waypoint..." +msgstr "" + +#: ../src/viktrwlayer.c:4270 +msgid "_Export Layer" +msgstr "" + +#: ../src/viktrwlayer.c:4276 +msgid "Export as GPS_Point..." +msgstr "" + +#: ../src/viktrwlayer.c:4281 +msgid "Export as GPS_Mapper..." +msgstr "" + +#: ../src/viktrwlayer.c:4286 +msgid "Export as _GPX..." +msgstr "" + +#: ../src/viktrwlayer.c:4292 +msgid "Export as _KML..." +msgstr "" + +#: ../src/viktrwlayer.c:4299 +msgid "Export as GEO_JSON..." +msgstr "" + +#: ../src/viktrwlayer.c:4306 +msgid "Export via GPSbabel..." +msgstr "" + +#: ../src/viktrwlayer.c:4312 +#, c-format +msgid "Open with External Program_1: %s" +msgstr "" + +#: ../src/viktrwlayer.c:4319 +#, c-format +msgid "Open with External Program_2: %s" +msgstr "" + +#: ../src/viktrwlayer.c:4327 ../src/vikwindow.c:4825 +msgid "_New" +msgstr "_Nauja" + +#: ../src/viktrwlayer.c:4333 +msgid "New _Waypoint..." +msgstr "" + +#: ../src/viktrwlayer.c:4339 +msgid "New _Track" +msgstr "" + +#: ../src/viktrwlayer.c:4347 +msgid "New _Route" +msgstr "" + +#: ../src/viktrwlayer.c:4356 ../src/viktrwlayer.c:8232 +#: ../src/viktrwlayer.c:9003 +msgid "Geotag _Images..." +msgstr "" + +#: ../src/viktrwlayer.c:4363 +msgid "_Acquire" +msgstr "" + +#: ../src/viktrwlayer.c:4369 ../src/vikwindow.c:4904 +msgid "From _GPS..." +msgstr "Iš _GPS..." + +#. FIXME: only add menu when at least a routing engine has support for Directions +#: ../src/viktrwlayer.c:4375 +msgid "From _Directions..." +msgstr "" + +#: ../src/viktrwlayer.c:4381 +msgid "From _OSM Traces..." +msgstr "" + +#: ../src/viktrwlayer.c:4386 +msgid "From _My OSM Traces..." +msgstr "" + +#: ../src/viktrwlayer.c:4392 ../src/vikwindow.c:4844 +msgid "From _URL..." +msgstr "" + +#: ../src/viktrwlayer.c:4399 ../src/vikwindow.c:4846 +msgid "From _Wikipedia Waypoints" +msgstr "" + +#: ../src/viktrwlayer.c:4405 +msgid "Within _Layer Bounds" +msgstr "" + +#: ../src/viktrwlayer.c:4411 +msgid "Within _Current View" +msgstr "" + +#: ../src/viktrwlayer.c:4419 +msgid "From Geo_caching..." +msgstr "" + +#: ../src/viktrwlayer.c:4426 ../src/vikwindow.c:4842 +msgid "From Geotagged _Images..." +msgstr "" + +#: ../src/viktrwlayer.c:4433 +msgid "From _File..." +msgstr "" + +#: ../src/viktrwlayer.c:4436 ../src/vikwindow.c:4905 +msgid "Import File With GPS_Babel..." +msgstr "" + +#: ../src/viktrwlayer.c:4443 ../src/viktrwlayer.c:8905 +msgid "_Upload" +msgstr "" + +#: ../src/viktrwlayer.c:4449 +msgid "Upload to _GPS..." +msgstr "" + +#: ../src/viktrwlayer.c:4456 ../src/viktrwlayer.c:8973 +msgid "Upload to _OSM..." +msgstr "" + +#: ../src/viktrwlayer.c:4464 +msgid "De_lete" +msgstr "" + +#: ../src/viktrwlayer.c:4470 +msgid "Delete All _Tracks" +msgstr "" + +#: ../src/viktrwlayer.c:4477 +msgid "Delete Tracks _From Selection..." +msgstr "" + +#: ../src/viktrwlayer.c:4484 ../src/viktrwlayer.c:8481 +msgid "Delete _All Routes" +msgstr "" + +#: ../src/viktrwlayer.c:4491 ../src/viktrwlayer.c:8487 +msgid "_Delete Routes From Selection..." +msgstr "" + +#: ../src/viktrwlayer.c:4498 +msgid "Delete All _Waypoints" +msgstr "" + +#: ../src/viktrwlayer.c:4505 +msgid "Delete Waypoints From _Selection..." +msgstr "" + +#: ../src/viktrwlayer.c:4512 ../src/viktrwlayer.c:8339 +#, fuzzy +msgid "Delete Duplicate Waypoints" +msgstr "Pašalinti dubliuotus maršruto taškus" + +#: ../src/viktrwlayer.c:5198 +#, c-format +msgid "Are you sure you want to delete all tracks in %s?" +msgstr "" + +#: ../src/viktrwlayer.c:5211 +#, c-format +msgid "Are you sure you want to delete all routes in %s?" +msgstr "" + +#: ../src/viktrwlayer.c:5221 +#, c-format +msgid "Are you sure you want to delete all waypoints in %s?" +msgstr "" + +#: ../src/viktrwlayer.c:5238 +#, c-format +msgid "Are you sure you want to delete the waypoint \"%s\"?" +msgstr "" + +#: ../src/viktrwlayer.c:5254 +#, c-format +msgid "Are you sure you want to delete the track \"%s\"?" +msgstr "" + +#: ../src/viktrwlayer.c:5271 +#, c-format +msgid "Are you sure you want to delete the route \"%s\"?" +msgstr "" + +#: ../src/viktrwlayer.c:5527 ../src/viktrwlayer.c:6373 +msgid "" +"Converting a track to a route removes extra track data such as segments, " +"timestamps, etc...\n" +"Do you want to continue?" +msgstr "" + +#: ../src/viktrwlayer.c:5631 +msgid "No DEM layers available, thus no DEM values can be applied." +msgstr "" + +#: ../src/viktrwlayer.c:5651 ../src/viktrwlayer.c:5692 +#, c-format +msgid "%ld point adjusted" +msgid_plural "%ld points adjusted" +msgstr[0] "" +msgstr[1] "" + +#: ../src/viktrwlayer.c:5736 +#, c-format +msgid "%ld waypoint changed" +msgid_plural "%ld waypoints changed" +msgstr[0] "" +msgstr[1] "" + +#: ../src/viktrwlayer.c:5917 +#, c-format +msgid "" +"Refining a track with many points (%d) is unlikely to yield sensible " +"results. Do you want to Continue?" +msgstr "" + +#. Select engine from dialog +#: ../src/viktrwlayer.c:5925 +msgid "Refine Route with Routing Engine..." +msgstr "" + +#: ../src/viktrwlayer.c:5933 +msgid "Select routing engine" +msgstr "" + +#: ../src/viktrwlayer.c:6158 +msgid "Failed. No other tracks with timestamps in this layer found" +msgstr "" + +#: ../src/viktrwlayer.c:6160 +msgid "Failed. No other tracks without timestamps in this layer found" +msgstr "" + +#: ../src/viktrwlayer.c:6179 +msgid "Merge with..." +msgstr "Sujungti su..." + +#: ../src/viktrwlayer.c:6180 +msgid "Select route to merge with" +msgstr "" + +#: ../src/viktrwlayer.c:6180 +msgid "Select track to merge with" +msgstr "Pasirinkite kelią sujungimui su" + +#: ../src/viktrwlayer.c:6264 ../src/viktrwlayer.c:6346 +msgid "Append Route" +msgstr "" + +#: ../src/viktrwlayer.c:6264 ../src/viktrwlayer.c:6346 +msgid "Append Track" +msgstr "" + +#: ../src/viktrwlayer.c:6265 +msgid "Select the route to append after the current route" +msgstr "" + +#: ../src/viktrwlayer.c:6266 +msgid "Select the track to append after the current track" +msgstr "" + +#: ../src/viktrwlayer.c:6347 +msgid "Select the track to append after the current route" +msgstr "" + +#: ../src/viktrwlayer.c:6348 +msgid "Select the route to append after the current track" +msgstr "" + +#: ../src/viktrwlayer.c:6414 +#, c-format +msgid "%d segment merged" +msgid_plural "%d segments merged" +msgstr[0] "" +msgstr[1] "" + +#: ../src/viktrwlayer.c:6430 +msgid "Failed. This track does not have timestamp" +msgstr "Nepavyko. Šis kelias neturi laiko žymų" + +#: ../src/viktrwlayer.c:6442 +msgid "Failed. No other track in this layer has timestamp" +msgstr "Nepavyko. Jokie kiti keliai neturi laiko žymų šiame sluoksnyje" + +#: ../src/viktrwlayer.c:6449 +msgid "Merge Threshold..." +msgstr "Sujungti slenkstį..." + +#: ../src/viktrwlayer.c:6450 +msgid "Merge when time between tracks less than:" +msgstr "Sujungti, jei tarp laiko ir kelių mažiau negu:" + +#: ../src/viktrwlayer.c:6580 +msgid "Split Threshold..." +msgstr "Išskirti slengstį..." + +#: ../src/viktrwlayer.c:6581 +msgid "Split when time between trackpoints exceeds:" +msgstr "Skaidyti, jei tarp laiko ir kelio taškų viršyjama:" + +#: ../src/viktrwlayer.c:6598 +#, c-format +msgid "" +"Can not split track due to trackpoints not ordered in time - such as at %s.\n" +"\n" +"Goto this trackpoint?" +msgstr "" + +#: ../src/viktrwlayer.c:6668 +msgid "Split Every Nth Point" +msgstr "" + +#: ../src/viktrwlayer.c:6669 +msgid "Split on every Nth point:" +msgstr "" + +#: ../src/viktrwlayer.c:6779 +msgid "Can not split track as it has no segments" +msgstr "" + +#: ../src/viktrwlayer.c:6861 ../src/viktrwlayer.c:6891 +#, c-format +msgid "Deleted %ld point" +msgid_plural "Deleted %ld points" +msgstr[0] "" +msgstr[1] "" + +#: ../src/viktrwlayer.c:6966 ../src/viktrwlayer.c:10989 +#: ../src/viktrwlayer_waypointlist.c:214 +#, c-format +msgid "Could not launch %s to open file." +msgstr "" + +#: ../src/viktrwlayer.c:6992 ../src/viktrwlayer.c:7113 +msgid "This track has no date information." +msgstr "" + +#: ../src/viktrwlayer.c:7006 ../src/viktrwlayer.c:7136 +msgid "This waypoint has no date information." +msgstr "" + +#: ../src/viktrwlayer.c:7030 +#, c-format +msgid "Could not launch %s" +msgstr "" + +#: ../src/viktrwlayer.c:7269 +msgid "Internal Error in vik_trw_layer_uniquify_tracks" +msgstr "" + +#: ../src/viktrwlayer.c:7374 ../src/viktrwlayer.c:7424 +#: ../src/viktrwlayer.c:7587 +msgid "" +"Multiple entries with the same name exist. This method only works with " +"unique names. Force unique names now?" +msgstr "" + +#: ../src/viktrwlayer.c:7385 +msgid "No tracks found" +msgstr "" + +#: ../src/viktrwlayer.c:7393 ../src/viktrwlayer.c:7443 +#: ../src/viktrwlayer.c:7607 +msgid "Delete Selection" +msgstr "" + +#: ../src/viktrwlayer.c:7394 +msgid "Select tracks to delete" +msgstr "" + +#: ../src/viktrwlayer.c:7435 +msgid "No routes found" +msgstr "" + +#: ../src/viktrwlayer.c:7444 +msgid "Select routes to delete" +msgstr "" + +#: ../src/viktrwlayer.c:7550 +msgid "Internal Error in vik_trw_layer_uniquify_waypoints" +msgstr "" + +#: ../src/viktrwlayer.c:7597 +msgid "No waypoints found" +msgstr "" + +#: ../src/viktrwlayer.c:7608 +msgid "Select waypoints to delete" +msgstr "" + +#: ../src/viktrwlayer.c:7691 +#, c-format +msgid "%ld waypoint deleted" +msgid_plural "%ld waypoints deleted" +msgstr[0] "" +msgstr[1] "" +msgstr[2] "" + +#: ../src/viktrwlayer.c:7697 +#, fuzzy +msgid "No duplicates found" +msgstr "Įrašų nerasta!" + +#: ../src/viktrwlayer.c:8028 +#, c-format +msgid "" +"A waypoint with the name \"%s\" already exists. Really rename to the same " +"name?" +msgstr "" + +#: ../src/viktrwlayer.c:8058 +#, c-format +msgid "" +"A track with the name \"%s\" already exists. Really rename to the same name?" +msgstr "" + +#: ../src/viktrwlayer.c:8095 +#, c-format +msgid "" +"A route with the name \"%s\" already exists. Really rename to the same name?" +msgstr "" + +#: ../src/viktrwlayer.c:8215 ../src/viktrwlayer.c:8602 +msgid "_Goto" +msgstr "" + +#: ../src/viktrwlayer.c:8226 +msgid "_Visit Geocache Webpage" +msgstr "" + +#: ../src/viktrwlayer.c:8235 +msgid "Geotag multiple images against this waypoint" +msgstr "" + +#: ../src/viktrwlayer.c:8245 ../src/viktrwlayer_waypointlist.c:352 +msgid "_Show Picture..." +msgstr "" + +#: ../src/viktrwlayer.c:8253 +msgid "Update Geotag on _Image" +msgstr "" + +#: ../src/viktrwlayer.c:8259 +msgid "_Update" +msgstr "" + +#: ../src/viktrwlayer.c:8264 +msgid "Update and _Keep File Timestamp" +msgstr "" + +#: ../src/viktrwlayer.c:8276 +msgid "Visit _Webpage" +msgstr "" + +#: ../src/viktrwlayer.c:8306 +msgid "_New Waypoint..." +msgstr "" + +#: ../src/viktrwlayer.c:8315 +msgid "_View All Waypoints" +msgstr "" + +#: ../src/viktrwlayer.c:8327 +msgid "Delete _All Waypoints" +msgstr "" + +#: ../src/viktrwlayer.c:8333 +msgid "_Delete Waypoints From Selection..." +msgstr "" + +#: ../src/viktrwlayer.c:8351 +msgid "_Show All Waypoints" +msgstr "" + +#: ../src/viktrwlayer.c:8357 +msgid "_Hide All Waypoints" +msgstr "" + +#: ../src/viktrwlayer.c:8369 +msgid "_List Waypoints..." +msgstr "" + +#: ../src/viktrwlayer.c:8390 +msgid "_View All Tracks" +msgstr "" + +#: ../src/viktrwlayer.c:8396 +msgid "_New Track" +msgstr "" + +#: ../src/viktrwlayer.c:8404 +msgid "Delete _All Tracks" +msgstr "" + +#: ../src/viktrwlayer.c:8410 +msgid "_Delete Tracks From Selection..." +msgstr "" + +#: ../src/viktrwlayer.c:8422 +msgid "_Show All Tracks" +msgstr "" + +#: ../src/viktrwlayer.c:8428 +msgid "_Hide All Tracks" +msgstr "" + +#: ../src/viktrwlayer.c:8439 +msgid "_List Tracks..." +msgstr "" + +#: ../src/viktrwlayer.c:8467 +msgid "_View All Routes" +msgstr "" + +#: ../src/viktrwlayer.c:8473 +msgid "_New Route" +msgstr "" + +#: ../src/viktrwlayer.c:8499 +msgid "_Show All Routes" +msgstr "" + +#: ../src/viktrwlayer.c:8505 +msgid "_Hide All Routes" +msgstr "" + +#: ../src/viktrwlayer.c:8516 +msgid "_List Routes..." +msgstr "" + +#: ../src/viktrwlayer.c:8587 +msgid "_View Track" +msgstr "" + +#: ../src/viktrwlayer.c:8589 +msgid "_View Route" +msgstr "" + +#: ../src/viktrwlayer.c:8608 +msgid "_Startpoint" +msgstr "" + +#: ../src/viktrwlayer.c:8614 +msgid "\"_Center\"" +msgstr "" + +#: ../src/viktrwlayer.c:8620 +msgid "_Endpoint" +msgstr "" + +#: ../src/viktrwlayer.c:8626 +msgid "_Highest Altitude" +msgstr "" + +#: ../src/viktrwlayer.c:8632 +msgid "_Lowest Altitude" +msgstr "" + +#: ../src/viktrwlayer.c:8640 +msgid "_Maximum Speed" +msgstr "" + +#: ../src/viktrwlayer.c:8646 +msgid "_Date" +msgstr "" + +#: ../src/viktrwlayer.c:8655 +msgid "Co_mbine" +msgstr "" + +#: ../src/viktrwlayer.c:8663 +msgid "_Merge By Time..." +msgstr "" + +#: ../src/viktrwlayer.c:8668 +msgid "Merge _Segments" +msgstr "" + +#: ../src/viktrwlayer.c:8675 +msgid "Merge _With Other Tracks..." +msgstr "" + +#: ../src/viktrwlayer.c:8682 +msgid "_Append Track..." +msgstr "" + +#: ../src/viktrwlayer.c:8684 +msgid "_Append Route..." +msgstr "" + +#: ../src/viktrwlayer.c:8690 +msgid "Append _Route..." +msgstr "" + +#: ../src/viktrwlayer.c:8692 +msgid "Append _Track..." +msgstr "" + +#: ../src/viktrwlayer.c:8699 +msgid "_Split" +msgstr "" + +#: ../src/viktrwlayer.c:8707 +msgid "_Split By Time..." +msgstr "" + +#. ATM always enable this entry - don't want to have to analyse the track before displaying the menu - to keep the menu speedy +#: ../src/viktrwlayer.c:8713 +msgid "Split Se_gments" +msgstr "" + +#: ../src/viktrwlayer.c:8719 +msgid "Split By _Number of Points..." +msgstr "" + +#: ../src/viktrwlayer.c:8724 +msgid "Split at _Trackpoint" +msgstr "" + +#: ../src/viktrwlayer.c:8732 +msgid "_Insert Points" +msgstr "" + +#: ../src/viktrwlayer.c:8738 +msgid "Insert Point _Before Selected Point" +msgstr "" + +#: ../src/viktrwlayer.c:8745 +msgid "Insert Point _After Selected Point" +msgstr "" + +#: ../src/viktrwlayer.c:8754 +msgid "Delete Poi_nts" +msgstr "" + +#: ../src/viktrwlayer.c:8760 +msgid "Delete _Selected Point" +msgstr "" + +#: ../src/viktrwlayer.c:8768 +msgid "Delete Points With The Same _Position" +msgstr "" + +#: ../src/viktrwlayer.c:8773 +msgid "Delete Points With The Same _Time" +msgstr "" + +#: ../src/viktrwlayer.c:8780 ../src/viktrwlayer.c:9029 +msgid "_Transform" +msgstr "" + +#: ../src/viktrwlayer.c:8788 ../src/viktrwlayer.c:9037 +msgid "_Apply DEM Data" +msgstr "" + +#: ../src/viktrwlayer.c:8793 ../src/viktrwlayer.c:9042 +msgid "_Overwrite" +msgstr "" + +#: ../src/viktrwlayer.c:8796 ../src/viktrwlayer.c:9045 +msgid "Overwrite any existing elevation values with DEM values" +msgstr "" + +#: ../src/viktrwlayer.c:8799 ../src/viktrwlayer.c:9048 +msgid "_Keep Existing" +msgstr "" + +#: ../src/viktrwlayer.c:8802 ../src/viktrwlayer.c:9051 +msgid "Keep existing elevation values, only attempt for missing values" +msgstr "" + +#: ../src/viktrwlayer.c:8807 +msgid "_Smooth Missing Elevation Data" +msgstr "" + +#: ../src/viktrwlayer.c:8812 +msgid "_Interpolated" +msgstr "" + +#: ../src/viktrwlayer.c:8815 +msgid "" +"Interpolate between known elevation values to derive values for the missing " +"elevations" +msgstr "" + +#: ../src/viktrwlayer.c:8818 +msgid "_Flat" +msgstr "" + +#: ../src/viktrwlayer.c:8821 +msgid "Set unknown elevation values to the last known value" +msgstr "" + +#: ../src/viktrwlayer.c:8825 +msgid "C_onvert to a Route" +msgstr "" + +#: ../src/viktrwlayer.c:8827 +msgid "C_onvert to a Track" +msgstr "" + +#: ../src/viktrwlayer.c:8835 +msgid "_Anonymize Times" +msgstr "" + +#: ../src/viktrwlayer.c:8838 +msgid "Shift timestamps to a relative offset from 1901-01-01" +msgstr "" + +#: ../src/viktrwlayer.c:8841 +msgid "_Interpolate Times" +msgstr "" + +#: ../src/viktrwlayer.c:8844 +msgid "" +"Reset trackpoint timestamps between the first and last points such that " +"track is traveled at equal speed" +msgstr "" + +#: ../src/viktrwlayer.c:8849 +msgid "_Reverse Track" +msgstr "" + +#: ../src/viktrwlayer.c:8851 +msgid "_Reverse Route" +msgstr "" + +#: ../src/viktrwlayer.c:8858 +msgid "Refine Route..." +msgstr "" + +#: ../src/viktrwlayer.c:8868 +msgid "Down_load Maps Along Track..." +msgstr "" + +#: ../src/viktrwlayer.c:8870 +msgid "Down_load Maps Along Route..." +msgstr "" + +#: ../src/viktrwlayer.c:8878 +msgid "_Export Track as GPX..." +msgstr "" + +#: ../src/viktrwlayer.c:8880 +msgid "_Export Route as GPX..." +msgstr "" + +#: ../src/viktrwlayer.c:8887 +msgid "E_xtend Track End" +msgstr "" + +#: ../src/viktrwlayer.c:8889 +msgid "E_xtend Route End" +msgstr "" + +#: ../src/viktrwlayer.c:8896 +msgid "Extend _Using Route Finder" +msgstr "" + +#: ../src/viktrwlayer.c:8911 +msgid "_Upload to GPS..." +msgstr "" + +#: ../src/viktrwlayer.c:8926 +msgid "_Diary" +msgstr "" + +#: ../src/viktrwlayer.c:8930 +msgid "Open diary program at this date" +msgstr "" + +#: ../src/viktrwlayer.c:8935 +msgid "_Astronomy" +msgstr "" + +#: ../src/viktrwlayer.c:8938 +msgid "Open astronomy program at this date and location" +msgstr "" + +#: ../src/viktrwlayer.c:8962 +msgid "_View Google Directions" +msgstr "" + +#: ../src/viktrwlayer.c:8984 +msgid "Use with _Filter" +msgstr "" + +#: ../src/viktrwlayer.c:9018 +msgid "_Edit Trackpoint" +msgstr "" + +#: ../src/viktrwlayer.c:10116 +#, c-format +msgid " - Gain %dm:Loss %dm" +msgstr "" + +#: ../src/viktrwlayer.c:10118 +#, c-format +msgid " - Gain %dft:Loss %dft" +msgstr "" + +#: ../src/viktrwlayer.c:10123 +#, c-format +msgid " - Bearing %3.1f° - Step %s" +msgstr "" + +#: ../src/viktrwlayer.c:10232 +#, c-format +msgid "Querying %s for route between (%.3f, %.3f) and (%.3f, %.3f)." +msgstr "" + +#: ../src/viktrwlayer.c:10248 +#, c-format +msgid "%s returned route between (%.3f, %.3f) and (%.3f, %.3f)." +msgstr "" + +#: ../src/viktrwlayer.c:10251 +#, c-format +msgid "Error getting route from %s." +msgstr "" + +#: ../src/viktrwlayer.c:11070 +#, c-format +msgid "Creating %d Image Thumbnails..." +msgstr "Sukūriamos %d atvaizdo miniatiūros..." + +#: ../src/viktrwlayer.c:11560 +msgid "No map layer in use. Create one first" +msgstr "Nėra naudojamų žemėlapio sluoksnių. Sukurkite." + +#: ../src/viktrwlayer.c:11679 +#, c-format +msgid "%s: Track List" +msgstr "" + +#: ../src/viktrwlayer.c:11681 +#, c-format +msgid "%s: Route List" +msgstr "" + +#: ../src/viktrwlayer.c:11734 +#, c-format +msgid "" +"Could not write external layer %s to %s, please fix and save before exiting " +"or data will be lost" +msgstr "" + +#: ../src/viktrwlayer.c:11782 +#, c-format +msgid "WARNING: issues encountered loading external layer %s from %s" +msgstr "" + +#: ../src/viktrwlayer_export.c:47 +msgid "Auto Device GPX Simplify:" +msgstr "" + +#: ../src/viktrwlayer_export.c:48 +msgid "" +"GPX saves to certain devices will be simplified for device compatibility." +msgstr "" + +#: ../src/viktrwlayer_export.c:125 +#, c-format +msgid "Export of GPX file simplified using point limit: %d" +msgstr "" + +#: ../src/viktrwlayer_export.c:206 ../src/viktrwlayer_export.c:323 +#: ../src/vikwindow.c:3694 +msgid "The filename you requested could not be opened for writing." +msgstr "Failas, kurio pareikalavote, negali būti atvertas rašymui." + +#: ../src/viktrwlayer_export.c:226 +#, c-format +msgid "Could not launch %s." +msgstr "" + +#: ../src/viktrwlayer_export.c:234 +msgid "Could not create temporary file for export." +msgstr "" + +#: ../src/viktrwlayer_export.c:268 +msgid "File format:" +msgstr "" + +#: ../src/viktrwlayer_export.c:276 +msgid "Select the file format." +msgstr "" + +#: ../src/viktrwlayer_export.c:281 +msgid "" +"Select the information to process.\n" +"Warning: the behavior of these switches is highly dependent of the file " +"format selected.\n" +"Please, refer to GPSbabel if unsure." +msgstr "" + +#: ../src/viktrwlayer_export.c:308 +msgid "You did not select a valid file format." +msgstr "" + +#: ../src/viktrwlayer_propwin.c:915 ../src/viktrwlayer_propwin.c:3381 +#: ../src/viktrwlayer_propwin.c:3417 ../src/viktrwlayer_propwin.c:3457 +#: ../src/viktrwlayer_propwin.c:3509 ../src/viktrwlayer_propwin.c:3527 +#: ../src/viktrwlayer_propwin.c:3600 ../src/viktrwlayer_propwin.c:3601 +#: ../src/viktrwlayer_propwin.c:3602 ../src/viktrwlayer_propwin.c:3611 +#: ../src/viktrwlayer_propwin.c:3612 ../src/viktrwlayer_propwin.c:3629 +#: ../src/viktrwlayer_propwin.c:3630 ../src/viktrwlayer_propwin.c:3644 +#: ../src/viktrwlayer_propwin.c:3645 ../src/viktrwlayer_propwin.c:3646 +#: ../src/viktrwlayer_propwin.c:3660 ../src/viktrwlayer_propwin.c:3661 +#: ../src/viktrwlayer_propwin.c:3662 ../src/viktrwlayer_propwin.c:3676 +#: ../src/viktrwlayer_propwin.c:3677 ../src/viktrwlayer_propwin.c:3678 +#: ../src/viktrwlayer_propwin.c:3695 ../src/viktrwlayer_propwin.c:3696 +#: ../src/viktrwlayer_analysis.c:293 +#, c-format +msgid "No Data" +msgstr "Nėra duomenų" + +#: ../src/viktrwlayer_propwin.c:960 ../src/viktrwlayer_propwin.c:1245 +#, c-format +msgid "%.1f kph" +msgstr "" + +#: ../src/viktrwlayer_propwin.c:963 ../src/viktrwlayer_propwin.c:1248 +#: ../src/viktrwlayer_analysis.c:352 +#, c-format +msgid "%.1f mph" +msgstr "" + +#: ../src/viktrwlayer_propwin.c:966 ../src/viktrwlayer_propwin.c:1251 +#, c-format +msgid "%.1f knots" +msgstr "" + +#: ../src/viktrwlayer_propwin.c:969 ../src/viktrwlayer_propwin.c:1254 +#, c-format +msgid "%.1f s/km" +msgstr "" + +#: ../src/viktrwlayer_propwin.c:972 ../src/viktrwlayer_propwin.c:1257 +#: ../src/viktrwlayer_analysis.c:389 ../src/viktrwlayer_analysis.c:392 +#, fuzzy, c-format +msgid "%.1f min/km" +msgstr "1 minutė" + +#: ../src/viktrwlayer_propwin.c:975 ../src/viktrwlayer_propwin.c:1260 +#, c-format +msgid "%.1f sec/mi" +msgstr "" + +#: ../src/viktrwlayer_propwin.c:978 ../src/viktrwlayer_propwin.c:1263 +#: ../src/viktrwlayer_analysis.c:409 ../src/viktrwlayer_analysis.c:412 +#, fuzzy, c-format +msgid "%.1f min/mi" +msgstr "1 minutė" + +#. VIK_UNITS_SPEED_METRES_PER_SECOND: +#: ../src/viktrwlayer_propwin.c:982 ../src/viktrwlayer_propwin.c:1267 +#, c-format +msgid "%.1f m/s" +msgstr "" + +#. Minutes +#: ../src/viktrwlayer_propwin.c:1411 +msgid "mins" +msgstr "" + +#. Hours +#: ../src/viktrwlayer_propwin.c:1418 +msgid "h" +msgstr "" + +#. Days +#: ../src/viktrwlayer_propwin.c:1424 +msgid "d" +msgstr "" + +#. Weeks +#: ../src/viktrwlayer_propwin.c:1429 +msgid "w" +msgstr "" + +#. 'Months' +#: ../src/viktrwlayer_propwin.c:1433 +msgid "M" +msgstr "" + +#: ../src/viktrwlayer_propwin.c:2051 ../src/viktrwlayer_analysis.c:303 +#, c-format +msgid "%.1f miles" +msgstr "" + +#: ../src/viktrwlayer_propwin.c:2054 ../src/viktrwlayer_analysis.c:306 +#, c-format +msgid "%.1f NM" +msgstr "" + +#. VIK_UNITS_DISTANCE_KILOMETRES +#: ../src/viktrwlayer_propwin.c:2057 ../src/viktrwlayer_analysis.c:310 +#, c-format +msgid "%.1f km" +msgstr "" + +#: ../src/viktrwlayer_propwin.c:3083 +msgid "Failed spliting track. Track unchanged" +msgstr "Nepavyko atskirti kelio. Kelias liko nepakeistas." + +#: ../src/viktrwlayer_propwin.c:3234 ../src/viktrwlayer_propwin.c:3744 +#, c-format +msgid "%s - Track Properties" +msgstr "%s - Kelio ypatybės" + +#: ../src/viktrwlayer_propwin.c:3239 +msgid "Split at _Marker" +msgstr "" + +#: ../src/viktrwlayer_propwin.c:3240 +msgid "Split _Segments" +msgstr "" + +#: ../src/viktrwlayer_propwin.c:3241 +msgid "_Reverse" +msgstr "" + +#: ../src/viktrwlayer_propwin.c:3242 +msgid "_Delete Dupl." +msgstr "" + +#: ../src/viktrwlayer_propwin.c:3269 +msgid "Comment:" +msgstr "Komentaras:" + +#: ../src/viktrwlayer_propwin.c:3270 +msgid "Description:" +msgstr "" + +#: ../src/viktrwlayer_propwin.c:3271 +#, fuzzy +msgid "Source:" +msgstr "Pradžia:" + +#: ../src/viktrwlayer_propwin.c:3272 +#, fuzzy +msgid "Type:" +msgstr "Laikas:" + +#: ../src/viktrwlayer_propwin.c:3273 +msgid "Color:" +msgstr "" + +#: ../src/viktrwlayer_propwin.c:3274 +msgid "Draw Name:" +msgstr "" + +#: ../src/viktrwlayer_propwin.c:3275 +msgid "Distance Labels:" +msgstr "" + +#: ../src/viktrwlayer_propwin.c:3278 +msgid "Track Length:" +msgstr "Kelio ilgis:" + +#: ../src/viktrwlayer_propwin.c:3279 +msgid "Trackpoints:" +msgstr "Kelio taškai:" + +#: ../src/viktrwlayer_propwin.c:3280 +msgid "Segments:" +msgstr "Atkarpos:" + +#: ../src/viktrwlayer_propwin.c:3281 +msgid "Duplicate Points:" +msgstr "Sudubliuoti taškai:" + +#: ../src/viktrwlayer_propwin.c:3282 +msgid "Max Speed:" +msgstr "Didžiausias greitis:" + +#: ../src/viktrwlayer_propwin.c:3283 +msgid "Avg. Speed:" +msgstr "Vidutinis greitis:" + +#: ../src/viktrwlayer_propwin.c:3284 +msgid "Moving Avg. Speed:" +msgstr "" + +#: ../src/viktrwlayer_propwin.c:3285 +msgid "Avg. Dist. Between TPs:" +msgstr "Vid. nuot. tarp :" + +#: ../src/viktrwlayer_propwin.c:3286 +msgid "Elevation Range:" +msgstr "Aukščio intervalas:" + +#: ../src/viktrwlayer_propwin.c:3287 +msgid "Total Elevation Gain/Loss:" +msgstr "Visas aukščio intervalas:" + +#: ../src/viktrwlayer_propwin.c:3288 +msgid "Start:" +msgstr "Pradžia:" + +#: ../src/viktrwlayer_propwin.c:3289 +msgid "End:" +msgstr "Pabaiga:" + +#: ../src/viktrwlayer_propwin.c:3290 +msgid "Duration:" +msgstr "Trukmė:" + +#: ../src/viktrwlayer_propwin.c:3320 +msgid "Centre" +msgstr "" + +#: ../src/viktrwlayer_propwin.c:3321 +msgid "Start only" +msgstr "" + +#: ../src/viktrwlayer_propwin.c:3322 +msgid "End only" +msgstr "" + +#: ../src/viktrwlayer_propwin.c:3323 +msgid "Start and End" +msgstr "" + +#: ../src/viktrwlayer_propwin.c:3324 +msgid "Centre, Start and End" +msgstr "" + +#: ../src/viktrwlayer_propwin.c:3336 +msgid "Maximum number of distance labels to be shown" +msgstr "" + +#: ../src/viktrwlayer_propwin.c:3340 +msgid "Properties" +msgstr "" + +#: ../src/viktrwlayer_propwin.c:3584 +#, c-format +msgid "%d minutes - %d minutes moving" +msgstr "" + +#: ../src/viktrwlayer_propwin.c:3596 +#, c-format +msgid "%s total - %s in segments" +msgstr "" + +#: ../src/viktrwlayer_propwin.c:3607 ../src/viktrwlayer_analysis.c:622 +msgid "Statistics" +msgstr "Statistika" + +#: ../src/viktrwlayer_propwin.c:3613 ../src/viktrwlayer_propwin.c:3680 +msgid "Show D_EM" +msgstr "" + +#: ../src/viktrwlayer_propwin.c:3615 ../src/viktrwlayer_propwin.c:3631 +#: ../src/viktrwlayer_propwin.c:3647 ../src/viktrwlayer_propwin.c:3697 +msgid "Show _GPS Speed" +msgstr "" + +#: ../src/viktrwlayer_propwin.c:3617 ../src/viktrwlayer_propwin.c:3633 +#: ../src/viktrwlayer_propwin.c:3665 ../src/viktrwlayer_propwin.c:3699 +msgid "Track Distance:" +msgstr "Kelio nuotolis:" + +#: ../src/viktrwlayer_propwin.c:3618 ../src/viktrwlayer_propwin.c:3684 +msgid "Track Height:" +msgstr "" + +#: ../src/viktrwlayer_propwin.c:3624 +msgid "Elevation-distance" +msgstr "Aukštis-nuotolis" + +#: ../src/viktrwlayer_propwin.c:3634 +msgid "Track Gradient:" +msgstr "" + +#: ../src/viktrwlayer_propwin.c:3639 +msgid "Gradient-distance" +msgstr "" + +#: ../src/viktrwlayer_propwin.c:3649 ../src/viktrwlayer_propwin.c:3666 +#: ../src/viktrwlayer_propwin.c:3683 +msgid "Track Time:" +msgstr "Kelio laikas:" + +#: ../src/viktrwlayer_propwin.c:3650 ../src/viktrwlayer_propwin.c:3700 +msgid "Track Speed:" +msgstr "" + +#: ../src/viktrwlayer_propwin.c:3651 ../src/viktrwlayer_propwin.c:3667 +#: ../src/viktrwlayer_propwin.c:3685 +msgid "Time/Date:" +msgstr "" + +#: ../src/viktrwlayer_propwin.c:3655 +msgid "Speed-time" +msgstr "Greitis-laikas" + +#: ../src/viktrwlayer_propwin.c:3663 ../src/viktrwlayer_propwin.c:3679 +msgid "Show S_peed" +msgstr "" + +#: ../src/viktrwlayer_propwin.c:3671 +msgid "Distance-time" +msgstr "" + +#: ../src/viktrwlayer_propwin.c:3690 +msgid "Elevation-time" +msgstr "" + +#: ../src/viktrwlayer_propwin.c:3705 +msgid "Speed-distance" +msgstr "" + +#: ../src/viktrwlayer_tpwin.c:190 ../src/viktrwlayer_wpwin.c:66 +msgid "Date/Time Edit" +msgstr "" + +#: ../src/viktrwlayer_tpwin.c:242 +msgid "Name:" +msgstr "" + +#: ../src/viktrwlayer_tpwin.c:243 +msgid "Latitude:" +msgstr "Platuma:" + +#: ../src/viktrwlayer_tpwin.c:244 +msgid "Longitude:" +msgstr "Ilguma:" + +#: ../src/viktrwlayer_tpwin.c:245 +msgid "Altitude:" +msgstr "Aukštis:" + +#: ../src/viktrwlayer_tpwin.c:246 +msgid "Course:" +msgstr "" + +#: ../src/viktrwlayer_tpwin.c:247 +msgid "Timestamp:" +msgstr "Laiko žyma:" + +#: ../src/viktrwlayer_tpwin.c:248 +msgid "Time:" +msgstr "Laikas:" + +#: ../src/viktrwlayer_tpwin.c:249 +msgid "Distance Difference:" +msgstr "Nuotolio skirtumas:" + +#: ../src/viktrwlayer_tpwin.c:250 +msgid "Time Difference:" +msgstr "Laiko skirtumas:" + +#: ../src/viktrwlayer_tpwin.c:251 +msgid "\"Speed\" Between:" +msgstr "\"Greitis\" tarp:" + +#: ../src/viktrwlayer_tpwin.c:252 +msgid "Speed:" +msgstr "" + +#: ../src/viktrwlayer_tpwin.c:253 +msgid "VDOP:" +msgstr "" + +#: ../src/viktrwlayer_tpwin.c:254 +msgid "HDOP:" +msgstr "" + +#: ../src/viktrwlayer_tpwin.c:255 +msgid "PDOP:" +msgstr "" + +#: ../src/viktrwlayer_tpwin.c:256 +msgid "SAT/FIX:" +msgstr "" + +#: ../src/viktrwlayer_tpwin.c:263 ../src/viktrwlayer_tpwin.c:408 +#: ../src/viktrwlayer_tpwin.c:622 +msgid "Trackpoint" +msgstr "Kelio taškas" + +#: ../src/viktrwlayer_tpwin.c:266 +msgid "_Insert After" +msgstr "" + +#: ../src/viktrwlayer_tpwin.c:268 +msgid "Split Here" +msgstr "Skaidyti čia" + +#: ../src/viktrwlayer_tracklist.c:262 ../src/viktrwlayer_waypointlist.c:306 +msgid "_Copy Data" +msgstr "" + +#. +#. item = gtk_image_menu_item_new_with_mnemonic ( _("_Select") ); +#. gtk_image_menu_item_set_image ( (GtkImageMenuItem*)item, gtk_image_new_from_stock (GTK_STOCK_FIND, GTK_ICON_SIZE_MENU) ); +#. g_signal_connect_swapped ( G_OBJECT(item), "activate", G_CALLBACK(trw_layer_track_select), values ); +#. gtk_menu_shell_append (GTK_MENU_SHELL (menu), item); +#. gtk_widget_show ( item ); +#. +#. ATM view auto selects, so don't bother with separate select menu entry +#. +#. item = gtk_image_menu_item_new_with_mnemonic ( _("_Select") ); +#. gtk_image_menu_item_set_image ( (GtkImageMenuItem*)item, gtk_image_new_from_stock (GTK_STOCK_FIND, GTK_ICON_SIZE_MENU) ); +#. g_signal_connect_swapped ( G_OBJECT(item), "activate", G_CALLBACK(trw_layer_waypoint_select), values ); +#. gtk_menu_shell_append (GTK_MENU_SHELL (menu), item); +#. gtk_widget_show ( item ); +#. +#. AUTO SELECT NOT TRUE YET... +#. ATM view auto selects, so don't bother with separate select menu entry +#: ../src/viktrwlayer_tracklist.c:290 ../src/viktrwlayer_waypointlist.c:341 +#: ../src/vikwindow.c:4816 +msgid "_View" +msgstr "_Rodymas" + +#. Insert column for the layer name when viewing multi layers +#: ../src/viktrwlayer_tracklist.c:613 ../src/viktrwlayer_waypointlist.c:609 +msgid "Layer" +msgstr "" + +#: ../src/viktrwlayer_tracklist.c:627 ../src/viktrwlayer_waypointlist.c:624 +msgid "Date" +msgstr "" + +#: ../src/viktrwlayer_tracklist.c:631 ../src/viktrwlayer_waypointlist.c:628 +msgid "Visible" +msgstr "" + +#: ../src/viktrwlayer_tracklist.c:639 +msgid "" +"Distance\n" +"(miles)" +msgstr "" + +#: ../src/viktrwlayer_tracklist.c:642 +msgid "" +"Distance\n" +"(NM)" +msgstr "" + +#: ../src/viktrwlayer_tracklist.c:645 +msgid "" +"Distance\n" +"(km)" +msgstr "" + +#: ../src/viktrwlayer_tracklist.c:651 +msgid "" +"Length\n" +"(minutes)" +msgstr "" + +#: ../src/viktrwlayer_tracklist.c:660 ../src/vikutils.c:93 +msgid "sec/mi" +msgstr "" + +#: ../src/viktrwlayer_tracklist.c:666 +#, c-format +msgid "" +"Av. Speed\n" +"(%s)" +msgstr "" + +#. Apply own formatting of the data +#: ../src/viktrwlayer_tracklist.c:671 +#, c-format +msgid "" +"Max Speed\n" +"(%s)" +msgstr "" + +#: ../src/viktrwlayer_tracklist.c:679 ../src/viktrwlayer_waypointlist.c:637 +msgid "" +"Max Height\n" +"(Feet)" +msgstr "" + +#: ../src/viktrwlayer_tracklist.c:681 ../src/viktrwlayer_waypointlist.c:639 +msgid "" +"Max Height\n" +"(Metres)" +msgstr "" + +#: ../src/viktrwlayer_waypointlist.c:312 +msgid "Copy Data (with _positions)" +msgstr "" + +#: ../src/viktrwlayer_waypointlist.c:633 +msgid "Comment" +msgstr "" + +#: ../src/viktrwlayer_waypointlist.c:643 +msgid "Symbol" +msgstr "" + +#: ../src/viktrwlayer_wpwin.c:93 ../src/viktrwlayer_wpwin.c:302 +msgid "True" +msgstr "" + +#: ../src/viktrwlayer_wpwin.c:122 +msgid "Waypoint Properties" +msgstr "Maršruto taško ypatybės" + +#: ../src/viktrwlayer_wpwin.c:164 +msgid "Name:" +msgstr "Pavadinimas:" + +#: ../src/viktrwlayer_wpwin.c:181 +msgid "Altitude:" +msgstr "Aukštis:" + +#: ../src/viktrwlayer_wpwin.c:186 ../src/viktrwlayer_wpwin.c:188 +msgid "Comment:" +msgstr "Komentaras:" + +#: ../src/viktrwlayer_wpwin.c:202 +#, fuzzy +msgid "Source:" +msgstr "Atsisiuntimų šaltinis:" + +#: ../src/viktrwlayer_wpwin.c:212 +msgid "Image:" +msgstr "Paveikslas:" + +#: ../src/viktrwlayer_wpwin.c:217 +msgid "Symbol:" +msgstr "Simbolis:" + +#: ../src/viktrwlayer_wpwin.c:226 +msgid "(none)" +msgstr "(nėra)" + +#. Geotag Info [readonly] +#: ../src/viktrwlayer_wpwin.c:272 +msgid "Has Geotag" +msgstr "" + +#: ../src/viktrwlayer_wpwin.c:279 +msgid "Consistent Position" +msgstr "" + +#. ATM the direction value box is always shown, even when there is no information. +#. It would be nice to be able to hide it until the 'Add' has been performed, +#. however I've not been able to achieve this. +#. Thus simply sensistizing it instead. +#: ../src/viktrwlayer_wpwin.c:292 +#, fuzzy +msgid "Image Direction:" +msgstr "Paveikslėlio parametrai" + +#: ../src/viktrwlayer_wpwin.c:300 +msgid "Magnetic" +msgstr "" + +#: ../src/viktrwlayer_wpwin.c:320 +msgid "Time:" +msgstr "" + +#. TODO: other checks (isalpha or whatever ) +#: ../src/viktrwlayer_wpwin.c:386 +msgid "Please enter a name for the waypoint." +msgstr "Įveskite maršruto taško pavadinimą." + +#: ../src/viktrwlayer_geotag.c:320 ../src/viktrwlayer_geotag.c:460 +#, c-format +msgid "Failed updating EXIF on %s" +msgstr "" + +#: ../src/viktrwlayer_geotag.c:562 +#, c-format +msgid "Geotagging %d Images..." +msgstr "" + +#: ../src/viktrwlayer_geotag.c:630 +msgid "Geotag Images" +msgstr "" + +#: ../src/viktrwlayer_geotag.c:640 +msgid "Images" +msgstr "" + +#: ../src/viktrwlayer_geotag.c:645 +msgid "Overwrite Existing Waypoints:" +msgstr "" + +#: ../src/viktrwlayer_geotag.c:648 +msgid "Overwrite Existing GPS Information:" +msgstr "" + +#: ../src/viktrwlayer_geotag.c:650 +msgid "Keep File Modification Timestamp:" +msgstr "" + +#: ../src/viktrwlayer_geotag.c:684 +msgid "Create Waypoints:" +msgstr "" + +#: ../src/viktrwlayer_geotag.c:693 +msgid "Write EXIF:" +msgstr "" + +#: ../src/viktrwlayer_geotag.c:705 +msgid "Automatic Image Direction:" +msgstr "" + +#: ../src/viktrwlayer_geotag.c:707 +msgid "Set image direction based on a heading derived from the track" +msgstr "" + +#: ../src/viktrwlayer_geotag.c:710 +msgid "Interpolate Between Track Segments:" +msgstr "" + +#: ../src/viktrwlayer_geotag.c:715 +msgid "Image Time Offset (Seconds):" +msgstr "" + +#: ../src/viktrwlayer_geotag.c:718 +msgid "" +"The number of seconds to ADD to the photos time to make it match the GPS " +"data. Calculate this with (GPS - Photo). Can be negative or positive. Useful " +"to adjust times when a camera's timestamp was incorrect." +msgstr "" + +#: ../src/viktrwlayer_geotag.c:721 +msgid "Image Timezone:" +msgstr "" + +#: ../src/viktrwlayer_geotag.c:724 +msgid "" +"The timezone that was used when the images were created. For example, if a " +"camera is set to AWST or +8:00 hours. Enter +8:00 here so that the correct " +"adjustment to the images' time can be made. GPS data is always in UTC." +msgstr "" + +#: ../src/viktrwlayer_geotag.c:728 +#, c-format +msgid "Using waypoint: %s" +msgstr "" + +#: ../src/viktrwlayer_geotag.c:742 +#, c-format +msgid "Using track: %s" +msgstr "" + +#: ../src/viktrwlayer_geotag.c:744 +#, c-format +msgid "Using all tracks in: %s" +msgstr "" + +#: ../src/viktrwlayer_analysis.c:214 +msgid "Number of Tracks" +msgstr "" + +#: ../src/viktrwlayer_analysis.c:215 +msgid "Date Range" +msgstr "" + +#: ../src/viktrwlayer_analysis.c:216 +msgid "Total Length" +msgstr "" + +#: ../src/viktrwlayer_analysis.c:217 +msgid "Average Length" +msgstr "" + +#: ../src/viktrwlayer_analysis.c:218 +msgid "Eddington number" +msgstr "" + +#. No.4: Extended display only +#: ../src/viktrwlayer_analysis.c:219 +msgid "Max Speed" +msgstr "" + +#: ../src/viktrwlayer_analysis.c:220 +msgid "Avg. Speed" +msgstr "" + +#: ../src/viktrwlayer_analysis.c:221 +msgid "Minimum Altitude" +msgstr "" + +#: ../src/viktrwlayer_analysis.c:222 +msgid "Maximum Altitude" +msgstr "" + +#: ../src/viktrwlayer_analysis.c:223 +msgid "Total Elevation Gain/Loss" +msgstr "" + +#: ../src/viktrwlayer_analysis.c:224 +msgid "Avg. Elevation Gain/Loss" +msgstr "" + +#: ../src/viktrwlayer_analysis.c:225 +msgid "Total Duration" +msgstr "" + +#: ../src/viktrwlayer_analysis.c:226 +msgid "Avg. Duration" +msgstr "" + +#: ../src/viktrwlayer_analysis.c:317 +#, c-format +msgid "%.2f miles" +msgstr "" + +#: ../src/viktrwlayer_analysis.c:320 +#, c-format +msgid "%.2f NM" +msgstr "" + +#. VIK_UNITS_DISTANCE_KILOMETRES +#: ../src/viktrwlayer_analysis.c:324 +#, c-format +msgid "%.2f km" +msgstr "" + +#: ../src/viktrwlayer_analysis.c:361 +#, c-format +msgid "%.2f m/s" +msgstr "" + +#: ../src/viktrwlayer_analysis.c:370 ../src/viktrwlayer_analysis.c:373 +#, c-format +msgid "%.2f knots" +msgstr "" + +#: ../src/viktrwlayer_analysis.c:379 ../src/viktrwlayer_analysis.c:382 +#, c-format +msgid "%d s/km" +msgstr "" + +#: ../src/viktrwlayer_analysis.c:399 ../src/viktrwlayer_analysis.c:402 +#, c-format +msgid "%d sec/mi" +msgstr "" + +#: ../src/viktrwlayer_analysis.c:420 ../src/viktrwlayer_analysis.c:423 +#, c-format +msgid "%.2f km/h" +msgstr "" + +#: ../src/viktrwlayer_analysis.c:434 ../src/viktrwlayer_analysis.c:440 +#, c-format +msgid "%d feet" +msgstr "" + +#: ../src/viktrwlayer_analysis.c:445 ../src/viktrwlayer_analysis.c:447 +#, c-format +msgid "%d feet / %d feet" +msgstr "" + +#: ../src/viktrwlayer_analysis.c:452 ../src/viktrwlayer_analysis.c:458 +#, c-format +msgid "%d m" +msgstr "" + +#: ../src/viktrwlayer_analysis.c:463 ../src/viktrwlayer_analysis.c:465 +#, c-format +msgid "%d m / %d m" +msgstr "" + +#: ../src/viktrwlayer_analysis.c:477 +#, c-format +msgid "%d:%02d:%02d days:hrs:mins" +msgstr "" + +#: ../src/viktrwlayer_analysis.c:484 +#, c-format +msgid "%d:%02d hrs:mins" +msgstr "" + +#: ../src/viktrwlayer_analysis.c:658 +msgid "Include Invisible Items" +msgstr "" + +#: ../src/vikstatus.c:129 +msgid "Current number of background tasks. Click to see the background jobs." +msgstr "" + +#: ../src/vikstatus.c:134 +msgid "Current zoom level. Click to select a new one." +msgstr "" + +#: ../src/vikstatus.c:141 +msgid "Left click to clear the message. Right click to copy the message." +msgstr "" + +#: ../src/vikutils.c:108 +msgid "GPSD" +msgstr "" + +#. GPS Preamble +#: ../src/vikutils.c:109 +msgid "Trkpt" +msgstr "" + +#: ../src/vikutils.c:160 +#, c-format +msgid "%sSpeed%s %.1f%s" +msgstr "" + +#. Go for 2dp as expect low values for vertical speeds +#: ../src/vikutils.c:214 +#, c-format +msgid "%sClimb%s %.2f%s" +msgstr "" + +#: ../src/vikutils.c:223 +#, c-format +msgid "%sAlt %dfeet" +msgstr "" + +#. VIK_UNITS_HEIGHT_METRES: +#: ../src/vikutils.c:227 +#, c-format +msgid "%sAlt %dm" +msgstr "" + +#: ../src/vikutils.c:235 +#, c-format +msgid "%sCourse %03d°" +msgstr "" + +#: ../src/vikutils.c:249 +msgid "yards" +msgstr "" + +#. VIK_UNITS_DISTANCE_KILOMETRES: +#: ../src/vikutils.c:253 +msgid "m" +msgstr "" + +#: ../src/vikutils.c:257 +#, c-format +msgid "%sDistance diff %d%s" +msgstr "" + +#: ../src/vikutils.c:272 +#, c-format +msgid "%sTime %s" +msgstr "" + +#: ../src/vikutils.c:281 +#, c-format +msgid "%sTime diff %lds" +msgstr "" + +#: ../src/vikutils.c:287 +#, c-format +msgid "%sNo. of Sats %d" +msgstr "" + +#: ../src/vikutils.c:312 +#, c-format +msgid "%sTo End %.2f%s" +msgstr "" + +#: ../src/vikutils.c:339 +#, c-format +msgid "%sDistance along %.2f%s" +msgstr "" + +#: ../src/vikutils.c:359 +#, c-format +msgid "%sTrack: %s" +msgstr "" + +#: ../src/vikutils.c:396 +#, c-format +msgid "" +"There is a newer version of Viking available: %s\n" +"\n" +"Do you wish to go to Viking's website now?" +msgstr "" + +#: ../src/vikutils.c:526 +msgid "" +"This appears to be Viking's very first run.\n" +"\n" +"Do you wish to enable automatic internet features?\n" +"\n" +"Individual settings can be controlled in the Preferences." +msgstr "" + +#: ../src/vikwaypoint.c:37 +msgid "Waypoint" +msgstr "" + +#: ../src/vikwebtool_datasource.c:352 +msgid "Search Term" +msgstr "" + +#. TODO get rid of this as this is unnecessary duplication... +#: ../src/vikwindow.c:258 +msgid "Pan" +msgstr "Perkėlimas" + +#: ../src/vikwindow.c:258 +msgid "Zoom" +msgstr "Mastelis" + +#: ../src/vikwindow.c:258 +msgid "Ruler" +msgstr "Liniuotė" + +#: ../src/vikwindow.c:258 +msgid "Select" +msgstr "" + +#: ../src/vikwindow.c:368 +msgid "This is Viking " +msgstr "" + +#: ../src/vikwindow.c:457 +msgid "Location lookup aborted" +msgstr "" + +#: ../src/vikwindow.c:477 +#, c-format +msgid "Location found: %s" +msgstr "" + +#: ../src/vikwindow.c:486 +msgid "Unable to determine location" +msgstr "" + +#: ../src/vikwindow.c:495 +msgid "Determining location" +msgstr "" + +#: ../src/vikwindow.c:525 +#, c-format +msgid "Location found via geoclue" +msgstr "" + +#: ../src/vikwindow.c:546 +msgid "Default Map" +msgstr "" + +#: ../src/vikwindow.c:557 ../src/vikwindow.c:3938 +msgid "Trying to determine location..." +msgstr "" + +#. Create tooltip +#: ../src/vikwindow.c:723 +msgid "Select zoom level" +msgstr "" + +#: ../src/vikwindow.c:1176 +#, c-format +msgid "" +"Do you want to save the changes you made to the document \"%s\"?\n" +"\n" +"Your changes will be lost if you don't save them." +msgstr "" +"Ar norite išsaugoti dokumento pakeitimus \"%s\"?\n" +"\n" +"Jūsų pakeitimai dings, jeigu jų neišsaugosite." + +#: ../src/vikwindow.c:1180 +msgid "Don't Save" +msgstr "Neišsaugoti" + +#: ../src/vikwindow.c:1268 +msgid "mpp" +msgstr "mpp" + +#: ../src/vikwindow.c:1268 +msgid "pixelfact" +msgstr "Tikrasis taškas" + +#: ../src/vikwindow.c:1467 +#, c-format +msgid "%s %s %dm" +msgstr "%s %s %dm" + +#: ../src/vikwindow.c:1469 +#, c-format +msgid "%s %s %dft" +msgstr "" + +#: ../src/vikwindow.c:1472 +#, c-format +msgid "%s %s" +msgstr "%s %s" + +#: ../src/vikwindow.c:1929 +msgid "_Ruler" +msgstr "_Liniuotė" + +#: ../src/vikwindow.c:1929 +msgid "Ruler Tool" +msgstr "Matavimo įrankis" + +#: ../src/vikwindow.c:2204 ../src/vikwindow.c:4818 +msgid "_Zoom" +msgstr "_Mastelis" + +#: ../src/vikwindow.c:2204 +msgid "Zoom Tool" +msgstr "Mastelio įrankis" + +#: ../src/vikwindow.c:2271 ../src/vikwindow.c:4819 +msgid "_Pan" +msgstr "_Perkėlimas" + +#: ../src/vikwindow.c:2271 +msgid "Pan Tool" +msgstr "Perkėlimo įrankis" + +#: ../src/vikwindow.c:2425 +msgid "_Select" +msgstr "" + +#: ../src/vikwindow.c:2425 +msgid "Select Tool" +msgstr "" + +#: ../src/vikwindow.c:2615 +msgid "You must select a layer to show its properties." +msgstr "Turite pasirinkti sluoksnį, kad pamatytumėte jo ypatybes." + +#. No error to show, so unlikely this will get called +#: ../src/vikwindow.c:2629 +msgid "The help system is not available." +msgstr "" + +#. Main error path +#: ../src/vikwindow.c:2632 +#, c-format +msgid "" +"Help is not available because: %s.\n" +"Ensure a Mime Type ghelp handler program is installed (e.g. yelp)." +msgstr "" + +#: ../src/vikwindow.c:2865 +msgid "You must select a layer to delete." +msgstr "Turite pasirinkti sluoksnį, kad ištrintumėte." + +#: ../src/vikwindow.c:3171 +msgid "Untitled" +msgstr "Be pavadinimo" + +#: ../src/vikwindow.c:3300 +#, c-format +msgid "Unable to add '%s' to the list of recently used documents" +msgstr "" + +#: ../src/vikwindow.c:3391 +msgid "The file you requested could not be opened." +msgstr "Užklaustos failo neįmanoma atverti." + +#: ../src/vikwindow.c:3394 +msgid "" +"GPSBabel is required to load files of this type or GPSBabel encountered " +"problems." +msgstr "" + +#: ../src/vikwindow.c:3397 +#, c-format +msgid "Unable to load malformed GPX file %s" +msgstr "" + +#: ../src/vikwindow.c:3400 +#, c-format +msgid "Unsupported file type for %s" +msgstr "" + +#. Since we can process .vik files with issues just show a warning in the status bar +#. Not that a user can do much about it... or tells them what this issue is yet... +#: ../src/vikwindow.c:3406 +#, c-format +msgid "WARNING: issues encountered loading %s" +msgstr "" + +#: ../src/vikwindow.c:3489 +msgid "Please select a GPS data file to open. " +msgstr "Pasirinkite atverimui GPS duomenų failą. " + +#: ../src/vikwindow.c:3508 +msgid "Google Earth" +msgstr "" + +#: ../src/vikwindow.c:3523 ../src/vikwindow.c:3646 ../src/viking.desktop.in.h:1 +msgid "Viking" +msgstr "Viking" + +#: ../src/vikwindow.c:3594 ../src/vikwindow.c:4632 +msgid "Open File" +msgstr "" + +#: ../src/vikwindow.c:3630 +msgid "Save as Viking File." +msgstr "Išsaugoti kaip Viking failą" + +#: ../src/vikwindow.c:3757 +#, c-format +msgid "Exporting to file: %s" +msgstr "" + +#. Confirm what happened. +#: ../src/vikwindow.c:3774 +#, c-format +msgid "Exported files: %d" +msgstr "" + +#: ../src/vikwindow.c:3786 +msgid "Nothing to Export!" +msgstr "" + +#: ../src/vikwindow.c:3790 +msgid "Export to directory" +msgstr "" + +#: ../src/vikwindow.c:3809 +msgid "Could not convert all files" +msgstr "" + +#: ../src/vikwindow.c:3851 +msgid "File not accessible" +msgstr "" + +#: ../src/vikwindow.c:3854 +msgid "No Viking File" +msgstr "" + +#: ../src/vikwindow.c:3998 +msgid "This layer has no configurable properties." +msgstr "" + +#: ../src/vikwindow.c:4080 +msgid "Are you sure you wish to delete all layers?" +msgstr "Ar tikrai norite ištrinti visus sluoksnius?" + +#. Try harder... +#: ../src/vikwindow.c:4126 ../src/vikwindow.c:4132 +msgid "Generating image file..." +msgstr "" + +#: ../src/vikwindow.c:4154 +msgid "" +"Failed to generate internal image.\n" +"\n" +"Try creating a smaller image." +msgstr "" + +#: ../src/vikwindow.c:4175 +msgid "Image file generated." +msgstr "" + +#: ../src/vikwindow.c:4177 +msgid "Failed to generate image file." +msgstr "" + +#: ../src/vikwindow.c:4246 +#, c-format +msgid "Unable to write to file %s: %s" +msgstr "" + +#: ../src/vikwindow.c:4284 +msgid "" +"Viewable region outside allowable pixel size bounds for image. Clipping " +"width/height values." +msgstr "" +"Matoma sritis už leidžiamo taško nustato atvaizdo ribas. Kerpamas pločio/" +"aukščio vertės." + +#: ../src/vikwindow.c:4309 +#, c-format +msgid "Total area: %ldm x %ldm (%.3f sq. km)" +msgstr "Visas plotas: %ldm x %ldm (%.3f kv. km)" + +#: ../src/vikwindow.c:4312 +#, c-format +msgid "Total area: %ldm x %ldm (%.3f sq. miles)" +msgstr "" + +#: ../src/vikwindow.c:4315 +#, c-format +msgid "Total area: %ldm x %ldm (%.3f sq. NM)" +msgstr "" + +#. Single file +#: ../src/vikwindow.c:4343 +msgid "Save Image" +msgstr "Išsaugoti atvaizdą" + +#: ../src/vikwindow.c:4364 ../src/vikwindow.c:4641 +msgid "KMZ" +msgstr "" + +#: ../src/vikwindow.c:4417 +msgid "You must be in UTM mode to use this feature" +msgstr "Jūs privalote būti UTM režime, kad galėtumėte naudoti šias ypatybes." + +#: ../src/vikwindow.c:4421 +msgid "Choose a directory to hold images" +msgstr "Pasirinkite aplankalą atvaizdams saugoti" + +#. todo: default for answers inside VikWindow or static (thruout instance) +#: ../src/vikwindow.c:4441 +msgid "Save to Image File" +msgstr "Išsaugoti atvaizdą į failą" + +#: ../src/vikwindow.c:4457 +msgid "Width (pixels):" +msgstr "Plotis (taškais)" + +#: ../src/vikwindow.c:4459 +msgid "Height (pixels):" +msgstr "Aukštis (taškais)" + +#: ../src/vikwindow.c:4462 +msgid "" +"WARNING: USING LARGE IMAGES OVER 10000x10000\n" +"MAY CRASH THE PROGRAM!" +msgstr "" + +#: ../src/vikwindow.c:4464 +msgid "Zoom (meters per pixel):" +msgstr "Mastelis (metrai į tašką):" + +#: ../src/vikwindow.c:4480 +msgid "Area in current viewable window" +msgstr "Plotas matomame lange" + +#: ../src/vikwindow.c:4490 +msgid "Save as PNG" +msgstr "Išsaugoti kaip PNG" + +#: ../src/vikwindow.c:4491 +msgid "Save as JPEG" +msgstr "Išsaugoti kaip JPEG" + +#: ../src/vikwindow.c:4520 +msgid "East-west image tiles:" +msgstr "Rytiniai-vakariniai atvaizdų kvadratai:" + +#: ../src/vikwindow.c:4522 +msgid "North-south image tiles:" +msgstr "Šiauriniai-pietiniai atvaizdų kvadratai:" + +#: ../src/vikwindow.c:4619 +msgid "This feature is not available in UTM mode" +msgstr "" + +#: ../src/vikwindow.c:4658 +#, c-format +msgid "Unable to import %s." +msgstr "" + +#: ../src/vikwindow.c:4749 +msgid "Choose a background color" +msgstr "Keisti fono spalvą" + +#: ../src/vikwindow.c:4765 +msgid "Choose a track highlight color" +msgstr "" + +#: ../src/vikwindow.c:4814 +msgid "_File" +msgstr "_Failas" + +#: ../src/vikwindow.c:4815 +msgid "_Edit" +msgstr "_Keisti" + +#: ../src/vikwindow.c:4817 +msgid "_Show" +msgstr "" + +#: ../src/vikwindow.c:4820 +msgid "_Layers" +msgstr "_Sluoksniai" + +#: ../src/vikwindow.c:4821 +msgid "_Tools" +msgstr "Į_rankiai" + +#: ../src/vikwindow.c:4822 +msgid "_Webtools" +msgstr "_Web įrankiai" + +#: ../src/vikwindow.c:4823 ../src/vikwindow.c:4893 +msgid "_Help" +msgstr "_Pagalba" + +#: ../src/vikwindow.c:4825 +msgid "New file" +msgstr "Naujas failas" + +#: ../src/vikwindow.c:4826 +msgid "_Open..." +msgstr "_Atverti..." + +#: ../src/vikwindow.c:4826 +msgid "Open a file" +msgstr "Atverti failą" + +#: ../src/vikwindow.c:4827 +msgid "Open _Recent File" +msgstr "" + +#: ../src/vikwindow.c:4828 +msgid "Append _File..." +msgstr "_Pridėti failą..." + +#: ../src/vikwindow.c:4828 +msgid "Append data from a different file" +msgstr "Pridėti duomenis iš kito failo" + +#: ../src/vikwindow.c:4829 +msgid "Open GPX as External _Layer..." +msgstr "" + +#: ../src/vikwindow.c:4829 +msgid "Open a GPX file as an external layer" +msgstr "" + +#: ../src/vikwindow.c:4830 +msgid "_Export All" +msgstr "" + +#: ../src/vikwindow.c:4830 +msgid "Export All TrackWaypoint Layers" +msgstr "" + +#: ../src/vikwindow.c:4831 +msgid "_GPX..." +msgstr "" + +#: ../src/vikwindow.c:4831 +msgid "Export as GPX" +msgstr "" + +#: ../src/vikwindow.c:4832 +msgid "A_cquire" +msgstr "_Gauti duomenis" + +#: ../src/vikwindow.c:4833 +msgid "_Directions..." +msgstr "" + +#: ../src/vikwindow.c:4833 +msgid "Get driving directions" +msgstr "" + +#: ../src/vikwindow.c:4835 +msgid "_OSM Traces..." +msgstr "" + +#: ../src/vikwindow.c:4835 +msgid "Get traces from OpenStreetMap" +msgstr "" + +#: ../src/vikwindow.c:4836 +msgid "_My OSM Traces..." +msgstr "" + +#: ../src/vikwindow.c:4836 +msgid "Get Your Own Traces from OpenStreetMap" +msgstr "" + +#: ../src/vikwindow.c:4839 +msgid "Geo_caches..." +msgstr "" + +#: ../src/vikwindow.c:4839 +msgid "Get Geocaches from geocaching.com" +msgstr "Gauti Geocaches iš geocaching.com" + +#: ../src/vikwindow.c:4842 +msgid "Create waypoints from geotagged images" +msgstr "" + +#: ../src/vikwindow.c:4844 +msgid "Get a file from a URL" +msgstr "" + +#: ../src/vikwindow.c:4846 +msgid "Create waypoints from Wikipedia items in the current view" +msgstr "" + +#: ../src/vikwindow.c:4848 +msgid "_Save" +msgstr "Į_rašyti" + +#: ../src/vikwindow.c:4848 +msgid "Save the file" +msgstr "Įrašyti failą" + +#: ../src/vikwindow.c:4849 +msgid "Save _As..." +msgstr "Įrašyti _kaip..." + +#: ../src/vikwindow.c:4849 +msgid "Save the file under different name" +msgstr "Įrašyti failą kitu pavadinimu" + +#: ../src/vikwindow.c:4850 +msgid "Properties..." +msgstr "" + +#: ../src/vikwindow.c:4850 +msgid "File Properties" +msgstr "" + +#: ../src/vikwindow.c:4852 +msgid "Import KMZ _Map File..." +msgstr "" + +#: ../src/vikwindow.c:4852 +msgid "Import a KMZ file" +msgstr "" + +#: ../src/vikwindow.c:4853 +msgid "Generate _KMZ Map File..." +msgstr "" + +#: ../src/vikwindow.c:4853 +msgid "Generate a KMZ file with an overlay of the current view" +msgstr "" + +#: ../src/vikwindow.c:4855 +msgid "_Generate Image File..." +msgstr "_Sukurti atvaizdo failą..." + +#: ../src/vikwindow.c:4855 +msgid "Save a snapshot of the workspace into a file" +msgstr "Išsaugoti darbo aplinkos atvaizdą į failą" + +#: ../src/vikwindow.c:4856 +msgid "Generate _Directory of Images..." +msgstr "Sukurti a_tvaizdų aplankalą..." + +#: ../src/vikwindow.c:4856 +msgid "Generate _Directory of Images" +msgstr "" + +#: ../src/vikwindow.c:4857 +msgid "_Print..." +msgstr "_Spausdinti" + +#: ../src/vikwindow.c:4857 +msgid "Print maps" +msgstr "Spausdinti žemėlapius" + +#: ../src/vikwindow.c:4858 +msgid "E_xit" +msgstr "Iš_eiti" + +#: ../src/vikwindow.c:4858 +msgid "Exit the program" +msgstr "Išeiti iš programos" + +#: ../src/vikwindow.c:4859 +msgid "Save and Exit" +msgstr "Išsa_ugoti ir Išeiti" + +#: ../src/vikwindow.c:4859 +msgid "Save and Exit the program" +msgstr "Išsaugoti ir Išeiti iš programos" + +#: ../src/vikwindow.c:4861 +msgid "Go to the Pre_vious Location" +msgstr "" + +#: ../src/vikwindow.c:4861 +msgid "Go to the previous location" +msgstr "" + +#: ../src/vikwindow.c:4862 +msgid "Go to the _Next Location" +msgstr "" + +#: ../src/vikwindow.c:4862 +msgid "Go to the next location" +msgstr "" + +#: ../src/vikwindow.c:4863 +msgid "Go to the _Default Location" +msgstr "" + +#: ../src/vikwindow.c:4863 +msgid "Go to the default location" +msgstr "" + +#: ../src/vikwindow.c:4864 +msgid "Go to the _Auto Location" +msgstr "" + +#: ../src/vikwindow.c:4864 +msgid "Go to a location via automatic lookup" +msgstr "" + +#: ../src/vikwindow.c:4865 +msgid "Go to _Location..." +msgstr "" + +#: ../src/vikwindow.c:4865 +msgid "Go to address/place using text search" +msgstr "Eiti į adresą/vietą naudojant tekstinę paiešką" + +#: ../src/vikwindow.c:4866 +msgid "_Go to Lat/Lon..." +msgstr "Eiti į Platumą/Ilgumą..." + +#: ../src/vikwindow.c:4866 +msgid "Go to arbitrary lat/lon coordinate" +msgstr "Eiti į pasirinktas pla/ilg koordinates" + +#: ../src/vikwindow.c:4867 +msgid "Go to UTM..." +msgstr "Eiti į UTM..." + +#: ../src/vikwindow.c:4867 +msgid "Go to arbitrary UTM coordinate" +msgstr "Eiti į pasirinktas UTM koordinates" + +#: ../src/vikwindow.c:4868 +#, fuzzy +msgid "Go to Today" +msgstr "Eiti į UTM..." + +#: ../src/vikwindow.c:4868 +msgid "Go to today on the calendar" +msgstr "" + +#: ../src/vikwindow.c:4869 +msgid "_Refresh" +msgstr "" + +#: ../src/vikwindow.c:4869 +msgid "Refresh any maps displayed" +msgstr "" + +#: ../src/vikwindow.c:4870 +msgid "Set _Highlight Color..." +msgstr "" + +#: ../src/vikwindow.c:4870 +msgid "Set Highlight Color" +msgstr "" + +#: ../src/vikwindow.c:4871 +msgid "Set Bac_kground Color..." +msgstr "" + +#: ../src/vikwindow.c:4871 +msgid "Set Background Color" +msgstr "" + +#: ../src/vikwindow.c:4872 +msgid "Zoom _In" +msgstr "_Didinti" + +#: ../src/vikwindow.c:4872 +msgid "Zoom In" +msgstr "" + +#: ../src/vikwindow.c:4873 +msgid "Zoom _Out" +msgstr "M_ažinti" + +#: ../src/vikwindow.c:4873 +msgid "Zoom Out" +msgstr "" + +#: ../src/vikwindow.c:4874 +msgid "Zoom _To..." +msgstr "Didinti _iki..." + +#: ../src/vikwindow.c:4874 +msgid "Zoom To" +msgstr "" + +#: ../src/vikwindow.c:4875 +msgid "Pan _North" +msgstr "" + +#: ../src/vikwindow.c:4876 +msgid "Pan _East" +msgstr "" + +#: ../src/vikwindow.c:4877 +msgid "Pan _South" +msgstr "" + +#: ../src/vikwindow.c:4878 +msgid "Pan _West" +msgstr "" + +#: ../src/vikwindow.c:4879 +msgid "Background _Jobs" +msgstr "Fono _darbai" + +#: ../src/vikwindow.c:4879 +msgid "Background Jobs" +msgstr "" + +#: ../src/vikwindow.c:4881 +msgid "Cu_t" +msgstr "_Iškirpti" + +#: ../src/vikwindow.c:4885 +msgid "Delete All" +msgstr "Ištrinti visus" + +#: ../src/vikwindow.c:4886 +msgid "Copy Centre _Location" +msgstr "" + +#: ../src/vikwindow.c:4887 +msgid "_Flush Map Cache" +msgstr "" + +#: ../src/vikwindow.c:4888 +msgid "_Set the Default Location" +msgstr "" + +#: ../src/vikwindow.c:4888 +msgid "Set the Default Location to the current position" +msgstr "" + +#: ../src/vikwindow.c:4889 +msgid "_Preferences" +msgstr "_Nustatymai" + +#: ../src/vikwindow.c:4889 +msgid "Program Preferences" +msgstr "" + +#: ../src/vikwindow.c:4890 +msgid "_Layer Defaults" +msgstr "" + +#: ../src/vikwindow.c:4891 +msgid "_Properties" +msgstr "_Ypatybės" + +#: ../src/vikwindow.c:4893 +msgid "Help" +msgstr "" + +#: ../src/vikwindow.c:4894 +msgid "_About" +msgstr "_Apie" + +#: ../src/vikwindow.c:4894 +msgid "About" +msgstr "" + +#: ../src/vikwindow.c:4903 +msgid "_KML..." +msgstr "" + +#: ../src/vikwindow.c:4903 +msgid "Export as KML" +msgstr "" + +#: ../src/vikwindow.c:4904 +msgid "Transfer data from a GPS device" +msgstr "Perkelti duomenis iš GPS įrenginio" + +#: ../src/vikwindow.c:4905 +msgid "Import file via GPSBabel converter" +msgstr "" + +#: ../src/vikwindow.c:4909 +msgid "Import Geo_JSON File..." +msgstr "" + +#: ../src/vikwindow.c:4909 +msgid "Import GeoJSON file" +msgstr "" + +#: ../src/vikwindow.c:4914 +msgid "_UTM Mode" +msgstr "_UTM režimas" + +#: ../src/vikwindow.c:4915 +msgid "_Expedia Mode" +msgstr "_Expedia režimas" + +#: ../src/vikwindow.c:4916 +msgid "_Mercator Mode" +msgstr "_Merkatorinis režimas" + +#: ../src/vikwindow.c:4917 +msgid "Lat_/Lon Mode" +msgstr "" + +#: ../src/vikwindow.c:4921 +msgid "Show _Scale" +msgstr "" + +#: ../src/vikwindow.c:4921 +msgid "Show Scale" +msgstr "Rodyti padalas" + +#: ../src/vikwindow.c:4922 +msgid "Show _Center Mark" +msgstr "" + +#: ../src/vikwindow.c:4922 +msgid "Show Center Mark" +msgstr "Rodyti centrinį žymeklį" + +#: ../src/vikwindow.c:4923 +msgid "Show _Highlight" +msgstr "" + +#: ../src/vikwindow.c:4923 +msgid "Show Highlight" +msgstr "" + +#: ../src/vikwindow.c:4924 +msgid "_Full Screen" +msgstr "Visas ekranas" + +#: ../src/vikwindow.c:4924 +msgid "Activate full screen mode" +msgstr "Viso ekrano režimas" + +#: ../src/vikwindow.c:4925 +msgid "Show Side _Panel" +msgstr "" + +#: ../src/vikwindow.c:4925 +msgid "Show Side Panel" +msgstr "Rodyti šoninį skydelį" + +#: ../src/vikwindow.c:4926 +msgid "Show Status_bar" +msgstr "" + +#: ../src/vikwindow.c:4926 +msgid "Show Statusbar" +msgstr "" + +#: ../src/vikwindow.c:4927 +msgid "Show _Toolbar" +msgstr "Rodyti įran_kių juostą" + +#: ../src/vikwindow.c:4927 +msgid "Show Toolbar" +msgstr "Rodyti įrankių juostą" + +#: ../src/vikwindow.c:4928 +msgid "Show _Menu" +msgstr "" + +#: ../src/vikwindow.c:4928 +msgid "Show Menu" +msgstr "" + +#: ../src/vikwindow.c:4929 +#, fuzzy +msgid "Show Side Panel B_uttons" +msgstr "Rodyti šoninį skydelį" + +#: ../src/vikwindow.c:4929 +#, fuzzy +msgid "Show Side Panel Buttons" +msgstr "Rodyti šoninį skydelį" + +#: ../src/vikwindow.c:4930 +#, fuzzy +msgid "Show Side Panel Ca_lendar" +msgstr "Rodyti šoninį skydelį" + +#: ../src/vikwindow.c:4930 +#, fuzzy +msgid "Show Side Panel Calendar" +msgstr "Rodyti šoninį skydelį" + +#: ../src/vikwindow.c:5064 +#, c-format +msgid "New _%s Layer" +msgstr "" + +#: ../src/vikwindow.c:5114 +#, fuzzy +msgid "..." +msgstr "Pridėti..." + +#: ../src/viking.desktop.in.h:2 +msgid "GPS Data Manager" +msgstr "GPS duomenų vedlys" + +#: ../src/viking.desktop.in.h:3 +msgid "Map Based GPS Data Manager (live data capable)." +msgstr "Žemėlapiais paremtas GPS duomenų vedlys (duomenys realiu laiku)." + +#: ../src/libjpeg/jpeg-data.c:205 +msgid "Data does not follow JPEG specification." +msgstr "" + +#: ../src/libjpeg/jpeg-data.c:302 +#, c-format +msgid "Path '%s' invalid." +msgstr "" + +#: ../src/libjpeg/jpeg-data.c:320 +#, c-format +msgid "Could not read '%s'." +msgstr "" + +#~ msgid "Polygonzied Layer" +#~ msgstr "Apjungtas sluoksnis" + +#~ msgid "Email:" +#~ msgstr "El. paštas:" + +#~ msgid "Error: couldn't find gpsbabel." +#~ msgstr "Klaida: neįmanoma surasti gpsbabel." + +#~ msgid "Create Track" +#~ msgstr "Sukurti kelią" diff --git a/po/lv.po b/po/lv.po new file mode 100644 index 0000000..5558717 --- /dev/null +++ b/po/lv.po @@ -0,0 +1,6072 @@ +# Latvian translation for viking +# Copyright (c) 2008 Rosetta Contributors and Canonical Ltd 2008 +# This file is distributed under the same license as the viking package. +# FIRST AUTHOR , 2008. +# +msgid "" +msgstr "" +"Project-Id-Version: viking\n" +"Report-Msgid-Bugs-To: \n" +"POT-Creation-Date: 2019-01-19 12:53+0000\n" +"PO-Revision-Date: 2008-09-30 12:59+0000\n" +"Last-Translator: Viesturs Zariņš \n" +"Language-Team: Latvian \n" +"Language: lv\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" +"X-Launchpad-Export-Date: 2018-12-21 17:32+0000\n" +"X-Generator: Launchpad (build 18847)\n" + +#: ../src/acquire.c:106 ../src/vikgpslayer.c:1367 +msgid "Done." +msgstr "Gatavs." + +#: ../src/acquire.c:115 +msgid "No data." +msgstr "" + +#: ../src/acquire.c:167 ../src/acquire.c:415 +msgid "Error: acquisition failed." +msgstr "Kļūda: iegūšana neizdevās." + +#: ../src/acquire.c:339 +msgid "Working..." +msgstr "Strādā..." + +#. This shouldn't happen... +#: ../src/acquire.c:406 +msgid "" +"Unable to create command\n" +"Acquire method failed." +msgstr "" + +#: ../src/acquire.c:513 +msgid "_Filter" +msgstr "" + +#: ../src/acquire.c:528 +#, c-format +msgid "Filter with %s" +msgstr "" + +#: ../src/acquire.c:545 +msgid "Filter" +msgstr "" + +#: ../src/babel.c:640 +msgid "GPSBabel:" +msgstr "" + +#: ../src/babel.c:641 +msgid "" +"Allow setting the specific instance of GPSBabel. You must restart Viking for " +"this value to take effect." +msgstr "" + +#: ../src/babel_ui.c:79 +msgid "Select a file format" +msgstr "" + +#: ../src/babel_ui.c:144 ../src/viktrwlayer.c:531 ../src/viktrwlayer.c:2882 +msgid "Tracks" +msgstr "" + +#: ../src/babel_ui.c:149 ../src/viktrwlayer.c:2892 +msgid "Routes" +msgstr "" + +#. ***** PARAMETERS ***** +#: ../src/babel_ui.c:154 ../src/viktrwlayer.c:531 ../src/viktrwlayer.c:2887 +msgid "Waypoints" +msgstr "" + +#: ../src/background.c:64 +#, c-format +msgid "%d items" +msgstr "%d ieraksti" + +#: ../src/background.c:287 +msgid "Threads:" +msgstr "" + +#: ../src/background.c:288 +msgid "" +"Number of threads to use for Mapnik tasks. You need to restart Viking for a " +"change to this value to be used" +msgstr "" + +#: ../src/background.c:361 +msgid "Job" +msgstr "Darbs" + +#: ../src/background.c:365 +msgid "Progress" +msgstr "Progress" + +#: ../src/background.c:373 +msgid "Viking Background Jobs" +msgstr "Viking fona darbi" + +#: ../src/bing.c:42 +msgid "Bing Aerial" +msgstr "" + +#: ../src/bing.c:48 +msgid "Bing" +msgstr "" + +#. VIK_GTK_WINDOW_FROM_WIDGET(vp) +#: ../src/bingmapsource.c:514 +msgid "Bing attribution Loading" +msgstr "" + +#: ../src/clipboard.c:95 +msgid "paste failed" +msgstr "neizdevās ielīmēt" + +#: ../src/clipboard.c:105 +msgid "wrong clipboard data size" +msgstr "nepareizs starpliktuves datu izmērs" + +#: ../src/clipboard.c:124 +#, c-format +msgid "" +"The clipboard contains sublayer data for %s layers. You must select a layer " +"of this type to paste the clipboard data." +msgstr "" + +#: ../src/clipboard.c:264 +msgid "" +"In order to paste a waypoint, please select an appropriate layer to paste " +"into." +msgstr "" + +#: ../src/dialog.c:60 +msgid "Go to Lat/Lon" +msgstr "" + +#: ../src/dialog.c:69 ../src/viktrwlayer_wpwin.c:173 +msgid "Latitude:" +msgstr "" + +#: ../src/dialog.c:72 ../src/viktrwlayer_wpwin.c:177 +msgid "Longitude:" +msgstr "" + +#: ../src/dialog.c:102 +msgid "Go to UTM" +msgstr "" + +#: ../src/dialog.c:114 +msgid "Northing:" +msgstr "" + +#: ../src/dialog.c:117 +msgid "Easting:" +msgstr "" + +#: ../src/dialog.c:121 ../src/vikgeoreflayer.c:902 +msgid "Zone:" +msgstr "" + +#: ../src/dialog.c:124 ../src/vikgeoreflayer.c:904 +msgid "Letter:" +msgstr "" + +#: ../src/dialog.c:246 ../src/geonamessearch.c:238 +#: ../src/datasource_osm_my_traces.c:505 +msgid "Nothing was selected" +msgstr "" + +#: ../src/dialog.c:254 +msgid "Add Route" +msgstr "" + +#: ../src/dialog.c:254 +msgid "Add Track" +msgstr "" + +#: ../src/dialog.c:262 +msgid "Route Name:" +msgstr "" + +#: ../src/dialog.c:262 +msgid "Track Name:" +msgstr "" + +#: ../src/dialog.c:282 +msgid "Please enter a name for the track." +msgstr "" + +#: ../src/dialog.c:311 +msgid "Today" +msgstr "" + +#: ../src/dialog.c:393 +msgid "Zoom Factors..." +msgstr "" + +#: ../src/dialog.c:407 +msgid "Zoom factor (in meters per pixel):" +msgstr "" + +#: ../src/dialog.c:408 +msgid "X (easting): " +msgstr "" + +#: ../src/dialog.c:409 +msgid "Y (northing): " +msgstr "" + +#: ../src/dialog.c:414 +msgid "X and Y zoom factors must be equal" +msgstr "" + +#: ../src/dialog.c:469 +msgid "1 min" +msgstr "" + +#: ../src/dialog.c:470 +msgid "1 hour" +msgstr "" + +#: ../src/dialog.c:471 +msgid "1 day" +msgstr "" + +#: ../src/dialog.c:472 +msgid "Custom (in minutes):" +msgstr "" + +#: ../src/dialog.c:608 +#, c-format +msgid "" +"2003-2008, Evan Battaglia\n" +"2008-%s, Viking's contributors" +msgstr "" + +#: ../src/dialog.c:609 +msgid "GPS Data and Topo Analyzer, Explorer, and Manager." +msgstr "" + +#: ../src/dialog.c:610 +msgid "" +"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.\n" +"\n" +"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.\n" +"\n" +"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., 59 Temple " +"Place, Suite 330, Boston, MA 02111-1307, USA" +msgstr "" + +#: ../src/dialog.c:703 +msgid "Translation is coordinated on http://launchpad.net/viking" +msgstr "" + +#: ../src/dialog.c:713 +msgid "Download along track" +msgstr "" + +#: ../src/dialog.c:720 +msgid "Map type:" +msgstr "" + +#: ../src/dialog.c:726 +msgid "Zoom level:" +msgstr "" + +#: ../src/dialog.c:766 +#, c-format +msgid "The map data is licensed: %s." +msgstr "" + +#: ../src/dialog.c:769 +#, c-format +msgid "" +"The data provided by '%s' are licensed under the following license: " +"%s." +msgstr "" + +#: ../src/dialog.c:773 +msgid "Open license" +msgstr "" + +#: ../src/expedia.c:54 +msgid "Expedia Street Maps" +msgstr "" + +#: ../src/expedia.c:82 +msgid "Invalid expedia altitude" +msgstr "" + +#: ../src/expedia.c:113 +#, c-format +msgid "" +"Couldn't open EXPEDIA image file (right after successful download! Please " +"report and delete image file!): %s" +msgstr "" + +#: ../src/expedia.c:126 +#, c-format +msgid "" +"Couldn't save EXPEDIA image file (right after successful download! Please " +"report and delete image file!): %s" +msgstr "" + +#: ../src/geonamessearch.c:115 +msgid "Search" +msgstr "" + +#: ../src/geonamessearch.c:117 +msgid "No entries found!" +msgstr "" + +#. NB could allow columns to be shifted around by doing this after each new +#. gtk_tree_view_column_set_reorderable ( column, TRUE ); +#. However I don't think is that useful, so I haven't put it in +#: ../src/geonamessearch.c:171 ../src/datasource_osm_my_traces.c:422 +#: ../src/viktrwlayer_tracklist.c:621 ../src/viktrwlayer_waypointlist.c:618 +msgid "Name" +msgstr "" + +#: ../src/geonamessearch.c:176 +msgid "Feature" +msgstr "" + +#: ../src/geonamessearch.c:181 ../src/datasource_osm_my_traces.c:437 +msgid "Lat/Lon" +msgstr "" + +#: ../src/geonamessearch.c:264 ../src/googlesearch.c:101 ../src/vikgoto.c:430 +msgid "couldn't map temp file" +msgstr "" + +#: ../src/geonamessearch.c:459 +msgid "Select articles" +msgstr "" + +#: ../src/geonamessearch.c:459 +msgid "Select the articles you want to add." +msgstr "" + +#: ../src/geonamessearch.c:475 +msgid "city" +msgstr "" + +#: ../src/geonamessearch.c:477 +msgid "edu" +msgstr "" + +#: ../src/geonamessearch.c:479 +msgid "airport" +msgstr "" + +#: ../src/geonamessearch.c:481 +msgid "mountain" +msgstr "" + +#: ../src/geonamessearch.c:483 +msgid "forest" +msgstr "" + +#: ../src/geonamessearch.c:485 +msgid "church" +msgstr "" + +#: ../src/geojson.c:74 +#, c-format +msgid "%s command failed: %s" +msgstr "" + +#: ../src/geojson.c:146 ../src/gpx.c:1317 +#, c-format +msgid "failed to open temporary file: %s" +msgstr "" + +#: ../src/globals.c:67 +msgid "DDD" +msgstr "" + +#: ../src/globals.c:67 +msgid "DMM" +msgstr "" + +#: ../src/globals.c:67 +msgid "DMS" +msgstr "" + +#: ../src/globals.c:67 +msgid "Raw" +msgstr "" + +#: ../src/globals.c:68 +msgid "Kilometres" +msgstr "" + +#: ../src/globals.c:68 +msgid "Miles" +msgstr "" + +#: ../src/globals.c:68 +msgid "Nautical Miles" +msgstr "" + +#. VIK_UNITS_SPEED_KILOMETRES_PER_HOUR: +#: ../src/globals.c:69 ../src/viktrwlayer_tracklist.c:655 ../src/vikutils.c:100 +msgid "km/h" +msgstr "" + +#: ../src/globals.c:69 ../src/viktrwlayer_tracklist.c:656 ../src/vikutils.c:78 +msgid "mph" +msgstr "" + +#. VIK_UNITS_SPEED_METRES_PER_SECOND: +#: ../src/globals.c:69 ../src/viktrwlayer_tracklist.c:663 ../src/vikutils.c:81 +msgid "m/s" +msgstr "" + +#: ../src/globals.c:69 ../src/viktrwlayer_tracklist.c:657 ../src/vikutils.c:84 +msgid "knots" +msgstr "" + +#: ../src/globals.c:69 ../src/viktrwlayer_tracklist.c:658 ../src/vikutils.c:87 +msgid "s/km" +msgstr "" + +#: ../src/globals.c:69 ../src/viktrwlayer_tracklist.c:659 ../src/vikutils.c:90 +msgid "min/km" +msgstr "" + +#: ../src/globals.c:69 +msgid "s/mi" +msgstr "" + +#: ../src/globals.c:69 ../src/viktrwlayer_tracklist.c:661 ../src/vikutils.c:96 +msgid "min/mi" +msgstr "" + +#: ../src/globals.c:70 +msgid "Metres" +msgstr "" + +#: ../src/globals.c:70 +msgid "Feet" +msgstr "" + +#: ../src/globals.c:73 +msgid "Locale" +msgstr "" + +#: ../src/globals.c:73 +msgid "World" +msgstr "" + +#: ../src/globals.c:73 +msgid "UTC" +msgstr "" + +#: ../src/globals.c:76 +msgid "Degree format:" +msgstr "" + +#: ../src/globals.c:77 +msgid "Distance units:" +msgstr "" + +#: ../src/globals.c:78 +msgid "Speed units:" +msgstr "" + +#: ../src/globals.c:79 +msgid "Height units:" +msgstr "" + +#: ../src/globals.c:80 +msgid "Use large waypoint icons:" +msgstr "" + +#: ../src/globals.c:81 +msgid "Default latitude:" +msgstr "" + +#: ../src/globals.c:82 +msgid "Default longitude:" +msgstr "" + +#: ../src/globals.c:83 +msgid "Time Display:" +msgstr "" + +#: ../src/globals.c:84 +msgid "" +"Display times according to the reference frame. Locale is the user's system " +"setting. World is relative to the location of the object." +msgstr "" + +#: ../src/globals.c:90 +msgid "Alphabetical" +msgstr "" + +#: ../src/globals.c:90 ../src/datasource_osm_my_traces.c:432 +msgid "Time" +msgstr "" + +#: ../src/globals.c:90 +msgid "Creation" +msgstr "" + +#: ../src/globals.c:91 +msgid "Title Case" +msgstr "" + +#: ../src/globals.c:91 +msgid "Lowercase" +msgstr "" + +#: ../src/globals.c:94 +msgid "KML File Export Units:" +msgstr "" + +#: ../src/globals.c:95 +msgid "GPX Track Order:" +msgstr "" + +#: ../src/globals.c:96 +msgid "GPX Waypoint Symbols:" +msgstr "" + +#: ../src/globals.c:97 +msgid "" +"Save GPX Waypoint Symbol names in the specified case. May be useful for " +"compatibility with various devices" +msgstr "" + +#: ../src/globals.c:98 +msgid "GPX Creator:" +msgstr "" + +#: ../src/globals.c:99 +msgid "" +"The creator value when writing a GPX file. Otherwise when blank a default is " +"used." +msgstr "" + +#: ../src/globals.c:104 +msgid "Image Viewer:" +msgstr "" + +#: ../src/globals.c:109 +msgid "External GPX Program 1:" +msgstr "" + +#: ../src/globals.c:110 +msgid "External GPX Program 2:" +msgstr "" + +#: ../src/globals.c:113 +msgid "Absolute" +msgstr "" + +#: ../src/globals.c:113 +msgid "Relative" +msgstr "" + +#: ../src/globals.c:117 +msgid "Save File Reference Mode:" +msgstr "" + +#: ../src/globals.c:118 +msgid "" +"When saving a Viking .vik file, this determines how the directory paths of " +"filenames are written." +msgstr "" + +#: ../src/globals.c:119 +msgid "Ask for Name before Track Creation:" +msgstr "" + +#: ../src/globals.c:120 +msgid "Show Tooltip during Track Creation:" +msgstr "" + +#: ../src/globals.c:121 +msgid "The number of recent files:" +msgstr "" + +#: ../src/globals.c:122 +msgid "" +"Only applies to new windows or on application restart. -1 means all " +"available files." +msgstr "" + +#: ../src/globals.c:123 +msgid "Open files in selected layer:" +msgstr "" + +#: ../src/globals.c:124 +msgid "Open files (but not .vik ones) into the selected TrackWaypoint layer." +msgstr "" + +#: ../src/globals.c:125 +msgid "Show calendar day names:" +msgstr "" + +#: ../src/globals.c:128 +msgid "Home Location" +msgstr "" + +#: ../src/globals.c:128 +msgid "Last Location" +msgstr "" + +#: ../src/globals.c:128 +msgid "Specified File" +msgstr "" + +#: ../src/globals.c:128 +msgid "Auto Location" +msgstr "" + +#: ../src/globals.c:131 +msgid "Restore Window Setup:" +msgstr "" + +#: ../src/globals.c:132 +msgid "Restore window size and layout" +msgstr "" + +#: ../src/globals.c:133 +msgid "Add a Default Map Layer:" +msgstr "" + +#: ../src/globals.c:134 +msgid "" +"The default map layer added is defined by the Layer Defaults. Use the menu " +"Edit->Layer Defaults->Map... to change the map type and other values." +msgstr "" + +#: ../src/globals.c:135 +msgid "Startup Method:" +msgstr "" + +#: ../src/globals.c:136 +msgid "Startup File:" +msgstr "" + +#: ../src/globals.c:137 +msgid "" +"The default file to load on startup. Only applies when the startup method is " +"set to 'Specified File'" +msgstr "" + +#: ../src/globals.c:138 +msgid "Check For New Version:" +msgstr "" + +#: ../src/globals.c:139 +msgid "Periodically check to see if a new version of Viking is available" +msgstr "" + +#. Defaults for the options are setup here +#: ../src/globals.c:176 +msgid "General" +msgstr "" + +#. New Tab +#: ../src/globals.c:204 +msgid "Startup" +msgstr "" + +#. New Tab +#: ../src/globals.c:222 +msgid "Export/External" +msgstr "" + +#. 'Advanced' Properties +#: ../src/globals.c:249 +msgid "Advanced" +msgstr "" + +#. Webtools +#: ../src/google.c:39 +msgid "Google" +msgstr "" + +#. If there is an actual description field it will overwrite this value +#: ../src/gpx.c:264 +#, c-format +msgid "Created by: %s" +msgstr "" + +#: ../src/datasource_bfilter.c:43 +msgid "Max number of points:" +msgstr "" + +#: ../src/datasource_bfilter.c:84 +msgid "Simplify All Tracks..." +msgstr "" + +#: ../src/datasource_bfilter.c:85 +msgid "Simplified Tracks" +msgstr "" + +#. { VIK_LAYER_NUM_TYPES, "compressmethod", VIK_LAYER_PARAM_UINT, VIK_LAYER_GROUP_NONE, N_("Simplify Method:"), VIK_LAYER_WIDGET_COMBOBOX, compress_method, NULL, NULL, NULL, NULL, NULL }, +#: ../src/datasource_bfilter.c:111 +msgid "Error Factor:" +msgstr "" + +#: ../src/datasource_bfilter.c:112 +msgid "" +"Specifies the maximum allowable error that may be introduced by removing a " +"single point by the crosstrack method. See the manual or GPSBabel Simplify " +"Filter documentation for more detail." +msgstr "" + +#: ../src/datasource_bfilter.c:166 +msgid "Compress Tracks..." +msgstr "" + +#: ../src/datasource_bfilter.c:167 +msgid "Compressed Tracks" +msgstr "" + +#: ../src/datasource_bfilter.c:197 ../src/datasource_bfilter.c:198 +msgid "Remove Duplicate Waypoints" +msgstr "" + +#: ../src/datasource_bfilter.c:221 +msgid "Manual filter:" +msgstr "" + +#: ../src/datasource_bfilter.c:222 +msgid "Manual filter command: e.g. 'swap'." +msgstr "" + +#: ../src/datasource_bfilter.c:233 ../src/datasource_bfilter.c:234 +msgid "Manual filter" +msgstr "" + +#: ../src/datasource_bfilter.c:262 +msgid "Waypoints Inside This" +msgstr "" + +#: ../src/datasource_bfilter.c:263 ../src/datasource_bfilter.c:292 +msgid "Polygonized Layer" +msgstr "" + +#: ../src/datasource_bfilter.c:291 +msgid "Waypoints Outside This" +msgstr "" + +#: ../src/datasource_file.c:61 +msgid "Import file with GPSBabel" +msgstr "" + +#: ../src/datasource_file.c:62 +msgid "Imported file" +msgstr "" + +#. The file selector +#: ../src/datasource_file.c:129 +msgid "File:" +msgstr "" + +#: ../src/datasource_file.c:130 +msgid "File to import" +msgstr "" + +#: ../src/datasource_file.c:137 +msgid "All files" +msgstr "" + +#. The file format selector +#: ../src/datasource_file.c:144 ../src/datasource_url.c:106 +msgid "File type:" +msgstr "" + +#: ../src/datasource_file.c:189 +#, c-format +msgid "using babel args '%s' and file '%s'" +msgstr "" + +#: ../src/datasource_gc.c:67 +msgid "Download Geocaches" +msgstr "" + +#: ../src/datasource_gc.c:68 +msgid "Geocaching.com Caches" +msgstr "" + +#: ../src/datasource_gc.c:86 +msgid "geocaching.com username:" +msgstr "" + +#: ../src/datasource_gc.c:87 +msgid "geocaching.com password:" +msgstr "" + +#: ../src/datasource_gc.c:92 ../src/vikwindow.c:3502 +msgid "Geocaching" +msgstr "" + +#: ../src/datasource_gc.c:128 +#, c-format +msgid "" +"Can't find %s or %s in path! Check that you have installed it correctly." +msgstr "" + +#: ../src/datasource_gc.c:190 +msgid "Number geocaches:" +msgstr "" + +#: ../src/datasource_gc.c:192 +msgid "Centered around:" +msgstr "" + +#: ../src/datasource_gc.c:231 +msgid "Broken input - using some defaults" +msgstr "" + +#: ../src/datasource_geotag.c:51 +msgid "Create Waypoints from Geotagged Images" +msgstr "" + +#: ../src/datasource_geotag.c:52 +msgid "Geotagged Images" +msgstr "" + +#: ../src/datasource_geotag.c:102 ../src/datasource_geojson.c:93 +#: ../src/vikfileentry.c:171 ../src/vikwindow.c:3533 ../src/vikwindow.c:3610 +#: ../src/vikwindow.c:3641 ../src/vikwindow.c:4356 ../src/vikwindow.c:4649 +msgid "All" +msgstr "" + +#: ../src/datasource_geotag.c:107 ../src/vikfileentry.c:115 +#: ../src/viktrwlayer_geotag.c:637 ../src/vikwindow.c:3518 +#: ../src/vikwindow.c:4377 +msgid "JPG" +msgstr "" + +#: ../src/datasource_geotag.c:168 +#, c-format +msgid "Unable to create waypoint from %s" +msgstr "" + +#: ../src/datasource_geojson.c:46 +msgid "Acquire from GeoJSON" +msgstr "" + +#: ../src/datasource_geojson.c:47 ../src/datasource_geojson.c:98 +msgid "GeoJSON" +msgstr "" + +#: ../src/datasource_geojson.c:152 +#, c-format +msgid "Unable to import from: %s" +msgstr "" + +#: ../src/datasource_gps.c:54 +msgid "Acquire from GPS" +msgstr "" + +#: ../src/datasource_gps.c:55 +msgid "Acquired from GPS" +msgstr "" + +#: ../src/datasource_gps.c:258 +#, c-format +msgid "using cmd '%s' and file '%s'\n" +msgstr "" + +#: ../src/datasource_gps.c:353 ../src/vikgpslayer.c:966 +#, c-format +msgid "Downloading %d waypoint..." +msgid_plural "Downloading %d waypoints..." +msgstr[0] "" +msgstr[1] "" + +#: ../src/datasource_gps.c:358 ../src/vikgpslayer.c:971 +#, c-format +msgid "Downloading %d trackpoint..." +msgid_plural "Downloading %d trackpoints..." +msgstr[0] "" +msgstr[1] "" + +#: ../src/datasource_gps.c:363 ../src/vikgpslayer.c:976 +#, c-format +msgid "Downloading %d routepoint..." +msgid_plural "Downloading %d routepoints..." +msgstr[0] "" +msgstr[1] "" + +#: ../src/datasource_gps.c:386 ../src/datasource_gps.c:393 +#: ../src/datasource_gps.c:400 +#, c-format +msgid "Downloaded %d out of %d %s..." +msgstr "" + +#: ../src/datasource_gps.c:388 ../src/datasource_gps.c:395 +#: ../src/datasource_gps.c:402 +#, c-format +msgid "Downloaded %d %s." +msgstr "" + +#: ../src/datasource_gps.c:416 ../src/vikgpslayer.c:1134 +#, c-format +msgid "GPS Device: %s" +msgstr "" + +#: ../src/datasource_gps.c:428 ../src/vikgpslayer.c:1214 +msgid "Status: Working..." +msgstr "" + +#. NB gps_layer_inst_init() is performed after parameter registeration +#. thus to give the protocols some potential values use the old static list +#. TODO: find another way to use gps_layer_inst_init()? +#: ../src/datasource_gps.c:584 ../src/vikgpslayer.c:216 +msgid "GPS Protocol:" +msgstr "" + +#. List reassigned at runtime +#: ../src/datasource_gps.c:609 ../src/vikgpslayer.c:217 +msgid "Serial Port:" +msgstr "" + +#: ../src/datasource_gps.c:659 +msgid "" +"Turn Off After Transfer\n" +"(Garmin/NAViLink Only)" +msgstr "" + +#: ../src/datasource_gps.c:666 +msgid "Tracks:" +msgstr "" + +#: ../src/datasource_gps.c:673 +msgid "Routes:" +msgstr "" + +#: ../src/datasource_gps.c:680 +msgid "Waypoints:" +msgstr "" + +#: ../src/datasource_gps.c:756 ../src/vikgpslayer.c:1509 +msgid "GPS device: N/A" +msgstr "" + +#: ../src/datasource_osm.c:53 ../src/datasource_osm.c:54 +msgid "OSM traces" +msgstr "" + +#: ../src/datasource_osm.c:89 +msgid "Page number:" +msgstr "" + +#: ../src/datasource_osm_my_traces.c:59 ../src/datasource_osm_my_traces.c:60 +msgid "OSM My Traces" +msgstr "" + +#: ../src/datasource_osm_my_traces.c:106 ../src/osm-traces.c:684 +msgid "Email/username:" +msgstr "" + +#: ../src/datasource_osm_my_traces.c:111 +msgid "The email or username used to login to OSM" +msgstr "" + +#: ../src/datasource_osm_my_traces.c:113 ../src/osm-traces.c:692 +msgid "Password:" +msgstr "" + +#: ../src/datasource_osm_my_traces.c:116 +msgid "The password used to login to OSM" +msgstr "" + +#: ../src/datasource_osm_my_traces.c:427 ../src/viktrwlayer.c:689 +msgid "Description" +msgstr "" + +#: ../src/datasource_osm_my_traces.c:442 +msgid "Privacy" +msgstr "" + +#: ../src/datasource_osm_my_traces.c:449 +msgid "Within Current View" +msgstr "" + +#: ../src/datasource_osm_my_traces.c:516 +msgid "GPS Traces" +msgstr "" + +#: ../src/datasource_osm_my_traces.c:518 +msgid "None found!" +msgstr "" + +#: ../src/datasource_osm_my_traces.c:569 +msgid "Ensure the OSM access token preferences are setup." +msgstr "" + +#: ../src/datasource_osm_my_traces.c:645 +msgid "My OSM Traces" +msgstr "" + +#. Report errors to the status bar +#: ../src/datasource_osm_my_traces.c:667 +#, c-format +msgid "Unable to get trace: %s" +msgstr "" + +#: ../src/datasource_routing.c:56 ../src/datasource_routing.c:57 +msgid "Directions" +msgstr "" + +#: ../src/datasource_routing.c:90 +msgid "No routing engines with directions available" +msgstr "" + +#. Engine selector +#: ../src/datasource_routing.c:99 +msgid "Engine:" +msgstr "" + +#. From and To entries +#: ../src/datasource_routing.c:104 +msgid "From:" +msgstr "" + +#: ../src/datasource_routing.c:105 +msgid "To:" +msgstr "" + +#: ../src/datasource_url.c:48 +msgid "Acquire from URL" +msgstr "" + +#: ../src/datasource_url.c:49 +msgid "URL" +msgstr "" + +#: ../src/datasource_url.c:101 +msgid "URL:" +msgstr "" + +#. Only GPX (not using GPSbabel) +#: ../src/datasource_url.c:133 ../src/vikfileentry.c:161 +#: ../src/vikwindow.c:3513 ../src/vikwindow.c:3603 +msgid "GPX" +msgstr "" + +#: ../src/datasource_wikipedia.c:32 +msgid "Create Waypoints from Wikipedia Articles" +msgstr "" + +#: ../src/datasource_wikipedia.c:33 +msgid "Wikipedia Waypoints" +msgstr "" + +#: ../src/dem.c:66 ../src/dem.c:80 +msgid "Invalid DEM" +msgstr "" + +#: ../src/dem.c:122 +msgid "Invalid DEM header" +msgstr "" + +#: ../src/dem.c:191 ../src/dem.c:204 +msgid "Incorrect DEM Class B record: expected 1" +msgstr "" + +#: ../src/dem.c:289 ../src/download.c:176 +#, c-format +msgid "Couldn't map file %s: %s" +msgstr "" + +#: ../src/download.c:130 +msgid "Tile age (days):" +msgstr "" + +#: ../src/download.c:406 +#, c-format +msgid "Download error: %s" +msgstr "" + +#: ../src/download.c:490 +msgid "couldn't open temp file" +msgstr "" + +#: ../src/file.c:458 ../src/file.c:463 +#, c-format +msgid "Draw mode '%s' no more supported" +msgstr "" + +#: ../src/geotag_exif.c:621 +msgid "Not enough memory." +msgstr "" + +#: ../src/geotag_exif.c:639 +msgid "Setting a value for this tag is unsupported!" +msgstr "" + +#: ../src/geotag_exif.c:658 +#, c-format +msgid "Too few components specified (need %d, found %d)\n" +msgstr "" + +#: ../src/geotag_exif.c:662 +msgid "Numeric value expected\n" +msgstr "" + +#: ../src/geotag_exif.c:670 +msgid "This shouldn't happen!" +msgstr "" + +#: ../src/geotag_exif.c:740 +msgid "Not yet implemented!" +msgstr "" + +#: ../src/geotag_exif.c:753 +msgid "Warning; Too many components specified!" +msgstr "" + +#: ../src/osm-traces.c:87 +msgid "Identifiable (public w/ timestamps)" +msgstr "" + +#: ../src/osm-traces.c:88 +msgid "Trackable (private w/ timestamps)" +msgstr "" + +#: ../src/osm-traces.c:89 +msgid "Public" +msgstr "" + +#: ../src/osm-traces.c:90 +msgid "Private" +msgstr "" + +#: ../src/osm-traces.c:108 +msgid "Access Token:" +msgstr "" + +#: ../src/osm-traces.c:108 +msgid "Get New OSM Access Tokens" +msgstr "" + +#: ../src/osm-traces.c:109 +msgid "Access Token Key:" +msgstr "" + +#: ../src/osm-traces.c:110 +msgid "Access Token Secret:" +msgstr "" + +#: ../src/osm-traces.c:111 +msgid "OSM username:" +msgstr "" + +#: ../src/osm-traces.c:112 +msgid "OSM password:" +msgstr "" + +#. Check to really override existing values... +#: ../src/osm-traces.c:263 +msgid "Do you want to overwrite existing values?" +msgstr "" + +#: ../src/osm-traces.c:275 +msgid "Not able to generate OSM request tokens." +msgstr "" + +#: ../src/osm-traces.c:299 +msgid "" +"Waiting for authorization approval.\n" +"Ensure you have granted access at the website before continuing here." +msgstr "" + +#: ../src/osm-traces.c:315 +msgid "No Authorization." +msgstr "" + +#: ../src/osm-traces.c:354 +msgid "" +"OSM Username and Password preferences are not required anymore. You can now " +"remove them." +msgstr "" + +#. Preferences +#: ../src/osm-traces.c:379 +msgid "OpenStreetMap Traces" +msgstr "" + +#: ../src/osm-traces.c:504 +#, c-format +msgid "failed to upload data: HTTP response is %ld" +msgstr "" + +#: ../src/osm-traces.c:509 +#, c-format +msgid "curl_easy_getinfo failed: %d" +msgstr "" + +#: ../src/osm-traces.c:514 +#, c-format +msgid "curl request failed: %s" +msgstr "" + +#. Success +#: ../src/osm-traces.c:592 +msgid "Uploaded to OSM" +msgstr "" + +#: ../src/osm-traces.c:596 +msgid "" +"FAILED TO UPLOAD DATA TO OSM - Ensure the OSM access token preferences are " +"setup." +msgstr "" + +#: ../src/osm-traces.c:599 +msgid "FAILED TO UPLOAD DATA TO OSM - CURL PROBLEM" +msgstr "" + +#: ../src/osm-traces.c:602 +msgid "FAILED TO UPLOAD DATA TO OSM" +msgstr "" + +#: ../src/osm-traces.c:602 +msgid "HTTP response code" +msgstr "" + +#: ../src/osm-traces.c:610 +#, c-format +msgid "failed to unlink temporary file: %s" +msgstr "" + +#: ../src/osm-traces.c:664 +msgid "OSM upload" +msgstr "" + +#: ../src/osm-traces.c:689 +msgid "" +"The email/username used as login\n" +"Enter the email/username you use to login into www.openstreetmap.org." +"" +msgstr "" + +#: ../src/osm-traces.c:697 +msgid "" +"The password used to login\n" +"Enter the password you use to login into www.openstreetmap.org." +msgstr "" + +#: ../src/osm-traces.c:703 +msgid "File's name:" +msgstr "" + +#: ../src/osm-traces.c:713 +msgid "" +"The name of the file on OSM\n" +"This is the name of the file created on the server.This is not the " +"name of the local file." +msgstr "" + +#: ../src/osm-traces.c:717 ../src/viktrwlayer_wpwin.c:197 +#: ../src/viktrwlayer_wpwin.c:199 +msgid "Description:" +msgstr "" + +#: ../src/osm-traces.c:731 +msgid "The description of the trace" +msgstr "" + +#: ../src/osm-traces.c:734 +msgid "Anonymize Times:" +msgstr "" + +#: ../src/osm-traces.c:739 +msgid "" +"Anonymize times of the trace.\n" +"You may choose to make the trace identifiable, yet mask the actual " +"real time values" +msgstr "" + +#: ../src/osm-traces.c:743 +msgid "Tags:" +msgstr "" + +#: ../src/osm-traces.c:751 +msgid "The tags associated to the trace" +msgstr "" + +#: ../src/osm-traces.c:816 +#, c-format +msgid "Uploading %s to OSM" +msgstr "" + +#: ../src/mapcache.c:67 +msgid "Map cache memory size (MB):" +msgstr "" + +#. NB Can have a couple hundred fonts loaded when using system directories +#. So ATM don't list them all - otherwise need better GUI feedback display. +#: ../src/mapnik_interface.cpp:324 +#, c-format +msgid "" +"%s %s\n" +"Plugins=%sFonts loaded=%d" +msgstr "" + +#: ../src/mapnik_interface.cpp:325 ../src/vikmapniklayer.c:278 +msgid "Mapnik" +msgstr "" + +#: ../src/print.c:51 ../src/viktrwlayer.c:572 +msgid "None" +msgstr "" + +#: ../src/print.c:52 +msgid "Horizontally" +msgstr "" + +#: ../src/print.c:53 +msgid "Vertically" +msgstr "" + +#: ../src/print.c:54 +msgid "Both" +msgstr "" + +#: ../src/print.c:118 +msgid "Image Settings" +msgstr "" + +#: ../src/print.c:551 +msgid "done" +msgstr "" + +#. Page Size +#: ../src/print.c:580 +msgid "_Adjust Page Size and Orientation" +msgstr "" + +#: ../src/print.c:596 +msgid "C_enter:" +msgstr "" + +#. ignore page margins +#: ../src/print.c:614 +msgid "Ignore Page _Margins" +msgstr "" + +#: ../src/print.c:633 +msgid "Image S_ize:" +msgstr "" + +#: ../src/ui_util.c:88 +#, c-format +msgid "Could not launch web browser. %s" +msgstr "" + +#: ../src/ui_util.c:101 +#, c-format +msgid "Could not create new email. %s" +msgstr "" + +#: ../src/vikcoordlayer.c:57 +msgid "Color:" +msgstr "" + +#: ../src/vikcoordlayer.c:58 +msgid "Minutes Width:" +msgstr "" + +#: ../src/vikcoordlayer.c:59 +msgid "Line Thickness:" +msgstr "" + +#: ../src/vikcoordlayer.c:66 +msgid "Coordinate" +msgstr "" + +#: ../src/main.c:92 +#, c-format +msgid "Ignoring Xlib error: error code %d request code %d\n" +msgstr "" + +#: ../src/main.c:111 +msgid "Enable debug output" +msgstr "" + +#: ../src/main.c:112 +msgid "Enable verbose output" +msgstr "" + +#: ../src/main.c:113 +msgid "Show version" +msgstr "" + +#: ../src/main.c:114 +msgid "Latitude in decimal degrees" +msgstr "" + +#: ../src/main.c:115 +msgid "Longitude in decimal degrees" +msgstr "" + +#: ../src/main.c:116 +msgid "Zoom Level (OSM). Value can be 0 - 22" +msgstr "" + +#: ../src/main.c:117 +msgid "Add a map layer by id value. Use 0 for the default map." +msgstr "" + +#: ../src/main.c:160 +#, c-format +msgid "" +"%s %s\n" +"Copyright (c) 2003-2008 Evan Battaglia\n" +"Copyright (c) 2008-%s Viking's contributors\n" +msgstr "" + +#: ../src/osm.c:50 +msgid "OpenStreetMap (Mapnik)" +msgstr "" + +#: ../src/osm.c:65 +msgid "OpenStreetMap (Cycle)" +msgstr "" + +#: ../src/osm.c:79 +msgid "OpenStreetMap (Transport)" +msgstr "" + +#: ../src/osm.c:95 +msgid "OpenStreetMap (Humanitarian)" +msgstr "" + +#: ../src/osm.c:111 +msgid "On Disk OSM Tile Format" +msgstr "" + +#: ../src/osm.c:121 +msgid "MBTiles File" +msgstr "" + +#: ../src/osm.c:132 +msgid "OSM Metatiles" +msgstr "" + +#: ../src/osm.c:146 +msgid "Mapbox Outdoors" +msgstr "" + +#: ../src/osm.c:153 +msgid "Mapbox Specific" +msgstr "" + +#: ../src/osm.c:170 +msgid "OSM (view)" +msgstr "" + +#: ../src/osm.c:174 +msgid "OSM (edit)" +msgstr "" + +#. Note the use of positional parameters +#: ../src/osm.c:179 +msgid "OSM (query)" +msgstr "" + +#: ../src/osm.c:183 +msgid "OSM (render)" +msgstr "" + +#. Example: http://127.0.0.1:8111/load_and_zoom?left=8.19&right=8.20&top=48.605&bottom=48.590&select=node413602999 +#. JOSM or merkaartor must already be running with remote interface enabled +#: ../src/osm.c:190 +msgid "Local port 8111 (eg JOSM)" +msgstr "" + +#: ../src/osm.c:195 +msgid "Geofabrik Map Compare" +msgstr "" + +#: ../src/osm.c:203 +msgid "OpenStreetMap Notes" +msgstr "" + +#. Not really OSM but can't be bothered to create somewhere else to put it... +#: ../src/osm.c:221 +msgid "Wikimedia Toolserver GeoHack" +msgstr "" + +#: ../src/preferences.c:195 +msgid "Preferences" +msgstr "" + +#: ../src/toolbar.c:91 ../src/toolbar.c:92 +msgid "System Default" +msgstr "" + +#: ../src/toolbar.c:91 ../src/viktrwlayer.c:563 +msgid "Small" +msgstr "" + +#: ../src/toolbar.c:91 ../src/viktrwlayer.c:564 +msgid "Medium" +msgstr "" + +#: ../src/toolbar.c:91 ../src/viktrwlayer.c:565 +msgid "Large" +msgstr "" + +#: ../src/toolbar.c:92 +msgid "Icons Only" +msgstr "" + +#: ../src/toolbar.c:92 +msgid "Text Only" +msgstr "" + +#: ../src/toolbar.c:92 +msgid "Icons and Text" +msgstr "" + +#: ../src/toolbar.c:106 +msgid "Append to Menu:" +msgstr "" + +#: ../src/toolbar.c:107 +msgid "Pack the toolbar to the main menu to save vertical space" +msgstr "" + +#: ../src/toolbar.c:108 +msgid "Icon Size:" +msgstr "" + +#: ../src/toolbar.c:110 +msgid "Icon Style:" +msgstr "" + +#: ../src/toolbar.c:112 +msgid "Customize:" +msgstr "" + +#: ../src/toolbar.c:112 +msgid "Customize Buttons" +msgstr "" + +#. Preferences +#: ../src/toolbar.c:145 +msgid "Toolbar" +msgstr "" + +#: ../src/toolbar.c:312 +msgid "_Customize" +msgstr "" + +#: ../src/toolbar.c:641 +msgid "Separator" +msgstr "" + +#: ../src/toolbar.c:642 +msgid "--- Separator ---" +msgstr "" + +#: ../src/toolbar.c:1007 +msgid "Customize Toolbar" +msgstr "" + +#: ../src/toolbar.c:1028 +msgid "" +"Select items to be displayed on the toolbar. Items can be reordered by drag " +"and drop." +msgstr "" + +#: ../src/toolbar.c:1044 +msgid "Available Items" +msgstr "" + +#: ../src/toolbar.c:1065 +msgid "Displayed Items" +msgstr "" + +#: ../src/viklayer_defaults.c:232 +#, c-format +msgid "Could not open file: %s" +msgstr "" + +#: ../src/viklayer_defaults.c:304 +msgid "Layer Defaults" +msgstr "" + +#: ../src/uibuilder.c:196 +msgid "Take care that this password will be stored clearly in a plain file." +msgstr "" + +#: ../src/uibuilder.c:628 ../src/viktrwlayer_export.c:188 +#: ../src/viktrwlayer_export.c:304 ../src/vikwindow.c:3666 +#: ../src/vikwindow.c:4408 +#, c-format +msgid "The file \"%s\" exists, do you wish to overwrite it?" +msgstr "" + +#: ../src/vikaggregatelayer.c:41 +msgid "Aggregate" +msgstr "" + +#: ../src/vikaggregatelayer.c:528 ../src/viktrwlayer.c:11700 +#, c-format +msgid "%s: Waypoint List" +msgstr "" + +#: ../src/vikaggregatelayer.c:570 +msgid "Search by Date" +msgstr "" + +#: ../src/vikaggregatelayer.c:576 +msgid "No items found with the requested date." +msgstr "" + +#: ../src/vikaggregatelayer.c:615 ../src/viktrwlayer.c:11691 +#, c-format +msgid "%s: Track and Route List" +msgstr "" + +#: ../src/vikaggregatelayer.c:681 ../src/viktrwlayer.c:8346 +#: ../src/viktrwlayer.c:8417 ../src/viktrwlayer.c:8494 +msgid "_Visibility" +msgstr "" + +#: ../src/vikaggregatelayer.c:686 +msgid "_Show All" +msgstr "" + +#: ../src/vikaggregatelayer.c:692 +msgid "_Hide All" +msgstr "" + +#: ../src/vikaggregatelayer.c:698 ../src/viktrwlayer.c:8363 +#: ../src/viktrwlayer.c:8434 ../src/viktrwlayer.c:8511 +msgid "_Toggle" +msgstr "" + +#: ../src/vikaggregatelayer.c:705 ../src/viktrwlayer.c:8532 +msgid "_Sort" +msgstr "" + +#: ../src/vikaggregatelayer.c:711 ../src/viktrwlayer.c:8538 +msgid "Name _Ascending" +msgstr "" + +#: ../src/vikaggregatelayer.c:717 ../src/viktrwlayer.c:8544 +msgid "Name _Descending" +msgstr "" + +#: ../src/vikaggregatelayer.c:723 ../src/viktrwlayer.c:575 +#: ../src/viktrwlayer.c:8550 +msgid "Date Ascending" +msgstr "" + +#: ../src/vikaggregatelayer.c:729 ../src/viktrwlayer.c:576 +#: ../src/viktrwlayer.c:8556 +msgid "Date Descending" +msgstr "" + +#: ../src/vikaggregatelayer.c:735 ../src/viktrwlayer.c:8445 +#: ../src/viktrwlayer.c:8523 ../src/viktrwlayer.c:8595 +#: ../src/viktrwlayer_tracklist.c:296 +msgid "_Statistics" +msgstr "" + +#: ../src/vikaggregatelayer.c:740 ../src/viktrwlayer.c:4533 +msgid "Track _List..." +msgstr "" + +#: ../src/vikaggregatelayer.c:746 ../src/viktrwlayer.c:4540 +msgid "_Waypoint List..." +msgstr "" + +#: ../src/vikaggregatelayer.c:753 +msgid "Searc_h" +msgstr "" + +#: ../src/vikaggregatelayer.c:759 +msgid "By _Date..." +msgstr "" + +#: ../src/vikaggregatelayer.c:762 +msgid "Find the first item with a specified date" +msgstr "" + +#: ../src/vikaggregatelayer.c:765 +msgid "Load E_xternal Layers" +msgstr "" + +#. Could have a more complicated tooltip that numbers each type of layers, +#. but for now a simple overall count +#: ../src/vikaggregatelayer.c:1011 +#, c-format +msgid "One layer" +msgid_plural "%d layers" +msgstr[0] "" +msgstr[1] "" + +#: ../src/vikaggregatelayer.c:1014 +#, c-format +msgid "Empty" +msgstr "" + +#: ../src/vikdemlayer.c:86 +msgid "SRTM Global 90m (3 arcsec)" +msgstr "" + +#: ../src/vikdemlayer.c:94 +msgid "Absolute height" +msgstr "" + +#: ../src/vikdemlayer.c:95 +msgid "Height gradient" +msgstr "" + +#: ../src/vikdemlayer.c:120 +msgid "DEM Files:" +msgstr "" + +#: ../src/vikdemlayer.c:121 +msgid "Download Source:" +msgstr "" + +#: ../src/vikdemlayer.c:122 +msgid "Min Elev Color:" +msgstr "" + +#: ../src/vikdemlayer.c:123 ../src/viktrwlayer_wpwin.c:207 +msgid "Type:" +msgstr "" + +#: ../src/vikdemlayer.c:124 +msgid "Min Elev:" +msgstr "" + +#: ../src/vikdemlayer.c:125 +msgid "Max Elev:" +msgstr "" + +#: ../src/vikdemlayer.c:137 +msgid "_DEM Download" +msgstr "" + +#: ../src/vikdemlayer.c:137 +msgid "DEM Download" +msgstr "" + +#: ../src/vikdemlayer.c:192 +msgid "DEM" +msgstr "" + +#: ../src/vikdemlayer.c:304 +#, c-format +msgid "Number of files: %d" +msgstr "" + +#: ../src/vikdemlayer.c:446 +msgid "DEM Loading" +msgstr "" + +#: ../src/vikdemlayer.c:927 +#, c-format +msgid "No SRTM data available for %f, %f" +msgstr "" + +#: ../src/vikdemlayer.c:948 +#, c-format +msgid "DEM download failure for %f, %f" +msgstr "" + +#: ../src/vikdemlayer.c:954 +#, c-format +msgid "DEM write failure for %s" +msgstr "" + +#. Probably not over any land... +#: ../src/vikdemlayer.c:1201 +msgid "No DEM File Available" +msgstr "" + +#: ../src/vikdemlayer.c:1220 +#, c-format +msgid "" +"\n" +"Source: %s\n" +"\n" +"DEM File: %s\n" +"DEM File Timestamp: %s" +msgstr "" + +#: ../src/vikdemlayer.c:1224 +#, c-format +msgid "" +"Source: %s\n" +"\n" +"No DEM File!" +msgstr "" + +#: ../src/vikdemlayer.c:1264 +#, c-format +msgid "Downloading DEM %s" +msgstr "" + +#: ../src/vikdemlayer.c:1289 +msgid "_Show DEM File Information" +msgstr "" + +#: ../src/vikfileentry.c:72 +msgid "Browse..." +msgstr "" + +#: ../src/vikfileentry.c:103 +msgid "Choose file" +msgstr "" + +#: ../src/vikfileentry.c:120 ../src/vikwindow.c:4372 +msgid "PNG" +msgstr "" + +#: ../src/vikfileentry.c:125 +msgid "TIFF" +msgstr "" + +#: ../src/vikfileentry.c:133 +msgid "MBTiles" +msgstr "" + +#: ../src/vikfileentry.c:142 +msgid "XML" +msgstr "" + +#: ../src/vikfileentry.c:149 +msgid "MML" +msgstr "" + +#: ../src/vikfileentry.c:154 +msgid "MSS" +msgstr "" + +#: ../src/vikfilelist.c:49 +msgid "Choose file(s)" +msgstr "" + +#: ../src/vikfilelist.c:182 +msgid "Add..." +msgstr "" + +#: ../src/vikfilelist.c:183 +msgid "Delete" +msgstr "" + +#: ../src/vikgeoreflayer.c:97 +msgid "_Georef Move Map" +msgstr "" + +#: ../src/vikgeoreflayer.c:97 +msgid "Georef Move Map" +msgstr "" + +#: ../src/vikgeoreflayer.c:106 +msgid "Georef Z_oom Tool" +msgstr "" + +#: ../src/vikgeoreflayer.c:106 +msgid "Georef Zoom Tool" +msgstr "" + +#: ../src/vikgeoreflayer.c:117 +msgid "GeoRef Map" +msgstr "" + +#: ../src/vikgeoreflayer.c:214 +msgid "Auto Read World Files:" +msgstr "" + +#: ../src/vikgeoreflayer.c:215 +msgid "" +"Automatically attempt to read associated world file of a new image for a " +"GeoRef layer" +msgstr "" + +#: ../src/vikgeoreflayer.c:511 ../src/vikgeoreflayer.c:797 +#: ../src/vikmapslayer.c:1174 +#, c-format +msgid "Couldn't open image file: %s" +msgstr "" + +#: ../src/vikgeoreflayer.c:607 ../src/vikgeoreflayer.c:633 +msgid "Choose World file" +msgstr "" + +#: ../src/vikgeoreflayer.c:619 +msgid "The World file you requested could not be opened for reading." +msgstr "" + +#: ../src/vikgeoreflayer.c:621 +msgid "Unexpected end of file reading World file." +msgstr "" + +#: ../src/vikgeoreflayer.c:646 +msgid "The file you requested could not be opened for writing." +msgstr "" + +#: ../src/vikgeoreflayer.c:782 +msgid "Lower right corner values may not be consistent with upper right values" +msgstr "" + +#: ../src/vikgeoreflayer.c:806 +#, c-format +msgid "Invalid image size: %s" +msgstr "" + +#: ../src/vikgeoreflayer.c:831 ../src/viklayer.c:561 ../src/vikwindow.c:4891 +msgid "Layer Properties" +msgstr "" + +#: ../src/vikgeoreflayer.c:852 +msgid "World File Parameters:" +msgstr "" + +#: ../src/vikgeoreflayer.c:853 +msgid "Load From File..." +msgstr "" + +#: ../src/vikgeoreflayer.c:858 +msgid "Corner pixel easting:" +msgstr "" + +#: ../src/vikgeoreflayer.c:860 +msgid "the UTM \"easting\" value of the upper-left corner pixel of the map" +msgstr "" + +#: ../src/vikgeoreflayer.c:862 +msgid "Corner pixel northing:" +msgstr "" + +#: ../src/vikgeoreflayer.c:864 +msgid "the UTM \"northing\" value of the upper-left corner pixel of the map" +msgstr "" + +#: ../src/vikgeoreflayer.c:866 +msgid "X (easting) scale (mpp): " +msgstr "" + +#: ../src/vikgeoreflayer.c:867 +msgid "Y (northing) scale (mpp): " +msgstr "" + +#: ../src/vikgeoreflayer.c:870 +msgid "the scale of the map in the X direction (meters per pixel)" +msgstr "" + +#: ../src/vikgeoreflayer.c:872 +msgid "the scale of the map in the Y direction (meters per pixel)" +msgstr "" + +#: ../src/vikgeoreflayer.c:874 +msgid "Map Image:" +msgstr "" + +#: ../src/vikgeoreflayer.c:919 +msgid "Upper left latitude:" +msgstr "" + +#: ../src/vikgeoreflayer.c:921 +msgid "Upper left longitude:" +msgstr "" + +#: ../src/vikgeoreflayer.c:923 +msgid "Lower right latitude:" +msgstr "" + +#: ../src/vikgeoreflayer.c:925 +msgid "Lower right longitude:" +msgstr "" + +#: ../src/vikgeoreflayer.c:937 +msgid "Calculate MPP values from coordinates" +msgstr "" + +#: ../src/vikgeoreflayer.c:938 +msgid "" +"Enter all corner coordinates before calculating the MPP values from the " +"image size" +msgstr "" + +#: ../src/vikgeoreflayer.c:948 +msgid "UTM" +msgstr "" + +#: ../src/vikgeoreflayer.c:949 +msgid "Latitude/Longitude" +msgstr "" + +#: ../src/vikgeoreflayer.c:957 ../src/vikmapniklayer.c:82 +#: ../src/vikmapslayer.c:158 +msgid "Alpha:" +msgstr "" + +#. Now with icons +#: ../src/vikgeoreflayer.c:1062 +msgid "_Zoom to Fit Map" +msgstr "" + +#: ../src/vikgeoreflayer.c:1068 +msgid "_Goto Map Center" +msgstr "" + +#: ../src/vikgeoreflayer.c:1074 +msgid "_Export to World File" +msgstr "" + +#: ../src/vikgoto.c:98 +msgid "No goto tool available." +msgstr "" + +#: ../src/vikgoto.c:295 +msgid "goto" +msgstr "" + +#: ../src/vikgoto.c:297 +msgid "goto provider:" +msgstr "" + +#: ../src/vikgoto.c:312 +msgid "Enter address or place name:" +msgstr "" + +#: ../src/vikgoto.c:487 +msgid "Locality" +msgstr "" + +#: ../src/vikgpslayer.c:137 +msgid "Data Mode" +msgstr "" + +#: ../src/vikgpslayer.c:139 +msgid "Realtime Tracking Mode" +msgstr "" + +#: ../src/vikgpslayer.c:176 +msgid "Keep vehicle at center" +msgstr "" + +#: ../src/vikgpslayer.c:177 +msgid "Keep vehicle on screen" +msgstr "" + +#: ../src/vikgpslayer.c:178 +msgid "Disable" +msgstr "" + +#: ../src/vikgpslayer.c:218 +msgid "Download Tracks:" +msgstr "" + +#: ../src/vikgpslayer.c:219 +msgid "Upload Tracks:" +msgstr "" + +#: ../src/vikgpslayer.c:220 +msgid "Download Routes:" +msgstr "" + +#: ../src/vikgpslayer.c:221 +msgid "Upload Routes:" +msgstr "" + +#: ../src/vikgpslayer.c:222 +msgid "Download Waypoints:" +msgstr "" + +#: ../src/vikgpslayer.c:223 +msgid "Upload Waypoints:" +msgstr "" + +#: ../src/vikgpslayer.c:225 +msgid "Recording tracks" +msgstr "" + +#: ../src/vikgpslayer.c:226 +msgid "Jump to current position on start" +msgstr "" + +#: ../src/vikgpslayer.c:227 +msgid "Moving Map Method:" +msgstr "" + +#: ../src/vikgpslayer.c:228 +msgid "Update Statusbar:" +msgstr "" + +#: ../src/vikgpslayer.c:228 +msgid "Display information in the statusbar on GPS updates" +msgstr "" + +#: ../src/vikgpslayer.c:229 +msgid "Auto Connect" +msgstr "" + +#: ../src/vikgpslayer.c:229 +msgid "Automatically connect to GPSD" +msgstr "" + +#: ../src/vikgpslayer.c:230 +msgid "Gpsd Host:" +msgstr "" + +#: ../src/vikgpslayer.c:231 +msgid "Gpsd Port:" +msgstr "" + +#: ../src/vikgpslayer.c:232 +msgid "Gpsd Retry Interval (seconds):" +msgstr "" + +#: ../src/vikgpslayer.c:254 +msgid "GPS" +msgstr "" + +#: ../src/vikgpslayer.c:320 ../src/vikgpslayer.c:1504 +msgid "GPS Download" +msgstr "" + +#: ../src/vikgpslayer.c:320 ../src/vikgpslayer.c:1504 ../src/viktrwlayer.c:3993 +msgid "GPS Upload" +msgstr "" + +#: ../src/vikgpslayer.c:322 +msgid "GPS Realtime Tracking" +msgstr "" + +#: ../src/vikgpslayer.c:458 +msgid "Connected" +msgstr "" + +#: ../src/vikgpslayer.c:460 +msgid "Disconnected" +msgstr "" + +#: ../src/vikgpslayer.c:554 +msgid "Unknown GPS Protocol" +msgstr "" + +#: ../src/vikgpslayer.c:572 +msgid "Unknown serial port device" +msgstr "" + +#: ../src/vikgpslayer.c:691 +#, c-format +msgid "%s: unknown parameter" +msgstr "" + +#. Now with icons +#: ../src/vikgpslayer.c:794 +msgid "_Upload to GPS" +msgstr "" + +#: ../src/vikgpslayer.c:800 +msgid "Download from _GPS" +msgstr "" + +#: ../src/vikgpslayer.c:821 +msgid "Empty _Realtime" +msgstr "" + +#: ../src/vikgpslayer.c:828 +msgid "E_mpty Upload" +msgstr "" + +#: ../src/vikgpslayer.c:834 +msgid "_Empty Download" +msgstr "" + +#: ../src/vikgpslayer.c:840 +msgid "Empty _All" +msgstr "" + +#: ../src/vikgpslayer.c:852 +#, c-format +msgid "Unexpected number of disconnected handlers: %d" +msgstr "" + +#: ../src/vikgpslayer.c:995 +#, c-format +msgid "Uploading %d waypoint..." +msgid_plural "Uploading %d waypoints..." +msgstr[0] "" +msgstr[1] "" + +#: ../src/vikgpslayer.c:1000 +#, c-format +msgid "Uploading %d trackpoint..." +msgid_plural "Uploading %d trackpoints..." +msgstr[0] "" +msgstr[1] "" + +#: ../src/vikgpslayer.c:1005 +#, c-format +msgid "Uploading %d routepoint..." +msgid_plural "Uploading %d routepoints..." +msgstr[0] "" +msgstr[1] "" + +#: ../src/vikgpslayer.c:1034 +#, c-format +msgid "Downloaded %d out of %d waypoint..." +msgid_plural "Downloaded %d out of %d waypoints..." +msgstr[0] "" +msgstr[1] "" + +#: ../src/vikgpslayer.c:1040 +#, c-format +msgid "Downloaded %d out of %d trackpoint..." +msgid_plural "Downloaded %d out of %d trackpoints..." +msgstr[0] "" +msgstr[1] "" + +#: ../src/vikgpslayer.c:1046 +#, c-format +msgid "Downloaded %d out of %d routepoint..." +msgid_plural "Downloaded %d out of %d routepoints..." +msgstr[0] "" +msgstr[1] "" + +#: ../src/vikgpslayer.c:1056 +#, c-format +msgid "Uploaded %d out of %d waypoint..." +msgid_plural "Uploaded %d out of %d waypoints..." +msgstr[0] "" +msgstr[1] "" + +#: ../src/vikgpslayer.c:1062 +#, c-format +msgid "Uploaded %d out of %d trackpoint..." +msgid_plural "Uploaded %d out of %d trackpoints..." +msgstr[0] "" +msgstr[1] "" + +#: ../src/vikgpslayer.c:1068 +#, c-format +msgid "Uploaded %d out of %d routepoint..." +msgid_plural "Uploaded %d out of %d routepoints..." +msgstr[0] "" +msgstr[1] "" + +#: ../src/vikgpslayer.c:1079 +#, c-format +msgid "Downloaded %d waypoint" +msgid_plural "Downloaded %d waypoints" +msgstr[0] "" +msgstr[1] "" + +#: ../src/vikgpslayer.c:1085 +#, c-format +msgid "Downloaded %d trackpoint" +msgid_plural "Downloaded %d trackpoints" +msgstr[0] "" +msgstr[1] "" + +#: ../src/vikgpslayer.c:1091 +#, c-format +msgid "Downloaded %d routepoint" +msgid_plural "Downloaded %d routepoints" +msgstr[0] "" +msgstr[1] "" + +#: ../src/vikgpslayer.c:1101 +#, c-format +msgid "Uploaded %d waypoint" +msgid_plural "Uploaded %d waypoints" +msgstr[0] "" +msgstr[1] "" + +#: ../src/vikgpslayer.c:1107 +#, c-format +msgid "Uploaded %d trackpoint" +msgid_plural "Uploaded %d trackpoints" +msgstr[0] "" +msgstr[1] "" + +#: ../src/vikgpslayer.c:1113 +#, c-format +msgid "Uploaded %d routepoint" +msgid_plural "Uploaded %d routepoints" +msgstr[0] "" +msgstr[1] "" + +#: ../src/vikgpslayer.c:1363 +msgid "Error: No result." +msgstr "" + +#: ../src/vikgpslayer.c:1471 +msgid "Warning - GPS Upload items may overwrite each other" +msgstr "" + +#: ../src/vikgpslayer.c:1506 +msgid "Status: detecting gpsbabel" +msgstr "Statuss: nosaka gpsbabel" + +#: ../src/vikgpslayer.c:1533 +msgid "No GPS items selected for transfer." +msgstr "" + +#: ../src/vikgpslayer.c:1546 +msgid "Could not turn off device." +msgstr "" + +#: ../src/vikgpslayer.c:1589 +msgid "Are you sure you want to delete GPS Upload data?" +msgstr "" + +#: ../src/vikgpslayer.c:1602 +msgid "Are you sure you want to delete GPS Download data?" +msgstr "" + +#: ../src/vikgpslayer.c:1616 +msgid "Are you sure you want to delete GPS Realtime data?" +msgstr "" + +#: ../src/vikgpslayer.c:1630 +msgid "Are you sure you want to delete All GPS data?" +msgstr "" + +#: ../src/vikgpslayer.c:2004 +#, c-format +msgid "" +"Failed to connect to gpsd at %s (port %s)\n" +"Should Viking keep trying (every %d seconds)?" +msgstr "" + +#: ../src/viklayerspanel.c:73 +msgid "C_ut" +msgstr "" + +#: ../src/viklayerspanel.c:74 ../src/vikwindow.c:4882 +msgid "_Copy" +msgstr "" + +#: ../src/viklayerspanel.c:75 ../src/vikwindow.c:4883 +msgid "_Paste" +msgstr "" + +#: ../src/viklayerspanel.c:76 ../src/vikwindow.c:4884 +msgid "_Delete" +msgstr "" + +#: ../src/viklayerspanel.c:154 +msgid "New Layer" +msgstr "" + +#: ../src/viklayerspanel.c:347 +msgid "Top Layer" +msgstr "" + +#: ../src/viklayerspanel.c:363 +msgid "Add new layer" +msgstr "" + +#: ../src/viklayerspanel.c:370 ../src/vikwindow.c:4884 +msgid "Remove selected layer" +msgstr "" + +#: ../src/viklayerspanel.c:377 +msgid "Move selected layer up" +msgstr "" + +#: ../src/viklayerspanel.c:384 +msgid "Move selected layer down" +msgstr "" + +#: ../src/viklayerspanel.c:391 ../src/vikwindow.c:4881 +msgid "Cut selected layer" +msgstr "" + +#: ../src/viklayerspanel.c:398 ../src/vikwindow.c:4882 +msgid "Copy selected layer" +msgstr "" + +#: ../src/viklayerspanel.c:405 ../src/vikwindow.c:4883 +msgid "" +"Paste layer into selected container layer or otherwise above selected layer" +msgstr "" + +#: ../src/viklayerspanel.c:502 +msgid "New name can not be blank." +msgstr "" + +#: ../src/viklayerspanel.c:751 +msgid "Aggregate Layers have no settable properties." +msgstr "" + +#: ../src/viklayerspanel.c:798 +msgid "You cannot cut the Top Layer." +msgstr "" + +#: ../src/viklayerspanel.c:843 +#, c-format +msgid "Are you sure you want to delete %s?" +msgstr "" + +#: ../src/viklayerspanel.c:863 +msgid "You cannot delete the Top Layer." +msgstr "" + +#: ../src/vikmapniklayer.c:78 +msgid "CSS (MML) Config File:" +msgstr "" + +#: ../src/vikmapniklayer.c:79 +msgid "CartoCSS configuration file" +msgstr "" + +#: ../src/vikmapniklayer.c:80 +msgid "XML Config File:" +msgstr "" + +#: ../src/vikmapniklayer.c:81 +msgid "Mapnik XML configuration file" +msgstr "" + +#: ../src/vikmapniklayer.c:84 +msgid "Use File Cache:" +msgstr "" + +#: ../src/vikmapniklayer.c:86 +msgid "File Cache Directory:" +msgstr "" + +#: ../src/vikmapniklayer.c:122 +msgid "_Mapnik Features" +msgstr "" + +#: ../src/vikmapniklayer.c:122 +msgid "Mapnik Features" +msgstr "" + +#: ../src/vikmapniklayer.c:140 +msgid "Mapnik Rendering" +msgstr "" + +#. Changing these values only applies before first mapnik layer is 'created' +#: ../src/vikmapniklayer.c:258 +msgid "Plugins Directory:" +msgstr "" + +#: ../src/vikmapniklayer.c:258 ../src/vikmapniklayer.c:259 +#: ../src/vikmapniklayer.c:260 ../src/vikmapniklayer.c:261 +msgid "You need to restart Viking for a change to this value to be used" +msgstr "" + +#: ../src/vikmapniklayer.c:259 +msgid "Fonts Directory:" +msgstr "" + +#: ../src/vikmapniklayer.c:260 +msgid "Recurse Fonts Directory:" +msgstr "" + +#: ../src/vikmapniklayer.c:261 +msgid "Rerender Timeout (hours):" +msgstr "" + +#. Changeable any time +#: ../src/vikmapniklayer.c:263 +msgid "CartoCSS:" +msgstr "" + +#: ../src/vikmapniklayer.c:263 +msgid "The program to convert CartoCSS files into Mapnik XML" +msgstr "" + +#: ../src/vikmapniklayer.c:506 +msgid "Running" +msgstr "" + +#: ../src/vikmapniklayer.c:525 +#, c-format +msgid "" +"Error running carto command:\n" +"%s" +msgstr "" + +#: ../src/vikmapniklayer.c:561 +msgid " completed in " +msgstr "" + +#: ../src/vikmapniklayer.c:561 +msgid "seconds" +msgstr "" + +#: ../src/vikmapniklayer.c:611 ../src/vikmapniklayer.c:979 +#, c-format +msgid "" +"Mapnik error loading configuration file:\n" +"%s" +msgstr "" + +#: ../src/vikmapniklayer.c:749 +#, c-format +msgid "Mapnik Render %d:%d:%d %s" +msgstr "" + +#: ../src/vikmapniklayer.c:840 +msgid "Mapnik Rendering must be in Mercator mode" +msgstr "" + +#: ../src/vikmapniklayer.c:997 +msgid "Mapnik Information" +msgstr "" + +#: ../src/vikmapniklayer.c:1031 +msgid "_Flush Memory Cache" +msgstr "" + +#: ../src/vikmapniklayer.c:1044 +msgid "_Run Carto Command" +msgstr "" + +#: ../src/vikmapniklayer.c:1102 ../src/vikmapslayer.c:2029 +#, c-format +msgid "Tile File Timestamp: %s" +msgstr "" + +#: ../src/vikmapniklayer.c:1105 ../src/vikmapslayer.c:2032 +msgid "Tile File Timestamp: Not Available" +msgstr "" + +#: ../src/vikmapniklayer.c:1120 +#, c-format +msgid "Rendering time %.2f seconds" +msgstr "" + +#: ../src/vikmapniklayer.c:1124 ../src/vikmapslayer.c:2042 +msgid "Tile Information" +msgstr "" + +#: ../src/vikmapniklayer.c:1145 +msgid "_Rerender Tile" +msgstr "" + +#: ../src/vikmapniklayer.c:1150 +msgid "_Info" +msgstr "" + +#. ******* MAPZOOMS ******** +#: ../src/vikmapslayer.c:96 +msgid "Use Viking Zoom Level" +msgstr "" + +#: ../src/vikmapslayer.c:146 +msgid "OSM" +msgstr "" + +#. NB mode => id - But can't break file format just to rename something better +#: ../src/vikmapslayer.c:152 +msgid "Map Type:" +msgstr "" + +#: ../src/vikmapslayer.c:153 +msgid "Maps Directory:" +msgstr "" + +#: ../src/vikmapslayer.c:154 +msgid "Cache Layout:" +msgstr "" + +#: ../src/vikmapslayer.c:155 +msgid "This determines the tile storage layout on disk" +msgstr "" + +#: ../src/vikmapslayer.c:156 +msgid "Map File:" +msgstr "" + +#: ../src/vikmapslayer.c:157 +msgid "An MBTiles file. Only applies when the map type method is 'MBTiles'" +msgstr "" + +#: ../src/vikmapslayer.c:159 +msgid "Control the Alpha value for transparency effects" +msgstr "" + +#: ../src/vikmapslayer.c:160 +msgid "Autodownload maps:" +msgstr "" + +#: ../src/vikmapslayer.c:161 +msgid "Autodownload Only Gets Missing Maps:" +msgstr "" + +#: ../src/vikmapslayer.c:162 +msgid "" +"Using this option avoids attempting to update already acquired tiles. This " +"can be useful if you want to restrict the network usage, without having to " +"resort to manual control. Only applies when 'Autodownload Maps' is on." +msgstr "" + +#: ../src/vikmapslayer.c:163 +msgid "Zoom Level:" +msgstr "" + +#: ../src/vikmapslayer.c:164 +msgid "" +"Determines the method of displaying map tiles for the current zoom level. " +"'Viking Zoom Level' uses the best matching level, otherwise setting a fixed " +"value will always use map tiles of the specified value regardless of the " +"actual zoom level." +msgstr "" + +#: ../src/vikmapslayer.c:197 +msgid "_Maps Download" +msgstr "" + +#: ../src/vikmapslayer.c:197 +msgid "Maps Download" +msgstr "" + +#: ../src/vikmapslayer.c:213 ../src/vikutils.c:895 +msgid "Map" +msgstr "" + +#: ../src/vikmapslayer.c:306 +msgid "Default map layer directory:" +msgstr "" + +#: ../src/vikmapslayer.c:306 +msgid "Choose a directory to store cached Map tiles for this layer" +msgstr "" + +#: ../src/vikmapslayer.c:436 ../src/vikmapslayer.c:633 +msgid "Unknown map type" +msgstr "" + +#: ../src/vikmapslayer.c:664 +msgid "Unknown Map Zoom" +msgstr "" + +#: ../src/vikmapslayer.c:833 +#, c-format +msgid "Failed to open MBTiles file: %s" +msgstr "" + +#: ../src/vikmapslayer.c:856 +#, c-format +msgid "" +"New map cannot be displayed in the current drawmode.\n" +"Select \"%s\" from View menu to view it." +msgstr "" + +#: ../src/vikmapslayer.c:1314 +#, c-format +msgid "" +"Cowardly refusing to draw tiles or existence of tiles beyond %d zoom out " +"factor" +msgstr "" + +#. TODO: ?? count up the number of download errors somehow... +#: ../src/vikmapslayer.c:1667 +msgid "Failed to download tile" +msgstr "" + +#: ../src/vikmapslayer.c:1673 +msgid "Unable to save tile" +msgstr "" + +#: ../src/vikmapslayer.c:1799 +#, c-format +msgid "Redownloading up to %d %s map..." +msgid_plural "Redownloading up to %d %s maps..." +msgstr[0] "" +msgstr[1] "" + +#: ../src/vikmapslayer.c:1801 +#, c-format +msgid "Redownloading %d %s map..." +msgid_plural "Redownloading %d %s maps..." +msgstr[0] "" +msgstr[1] "" + +#: ../src/vikmapslayer.c:1805 ../src/vikmapslayer.c:1890 +#, c-format +msgid "Downloading %d %s map..." +msgid_plural "Downloading %d %s maps..." +msgstr[0] "" +msgstr[1] "" + +#: ../src/vikmapslayer.c:1969 +msgid "YES" +msgstr "" + +#: ../src/vikmapslayer.c:1973 ../src/vikmapslayer.c:1977 +msgid "NO" +msgstr "" + +#. NB Also handles .jpg automatically due to pixbuf_new_from () support - although just print png for now. +#: ../src/vikmapslayer.c:1980 +#, c-format +msgid "Source: %s (%d%s%d%s%d.%s %s)" +msgstr "" + +#: ../src/vikmapslayer.c:1983 +msgid "Source: Not available" +msgstr "" + +#: ../src/vikmapslayer.c:2000 +msgid "Source: file://" +msgstr "" + +#: ../src/vikmapslayer.c:2012 +#, c-format +msgid "Source: %s" +msgstr "" + +#: ../src/vikmapslayer.c:2038 +#, c-format +msgid "Tile File: %s [Not Available]" +msgstr "" + +#: ../src/vikmapslayer.c:2086 +msgid "Redownload _Bad Map(s)" +msgstr "" + +#: ../src/vikmapslayer.c:2090 +msgid "Redownload _New Map(s)" +msgstr "" + +#: ../src/vikmapslayer.c:2094 +msgid "Redownload _All Map(s)" +msgstr "" + +#: ../src/vikmapslayer.c:2099 +msgid "_Show Tile Information" +msgstr "" + +#: ../src/vikmapslayer.c:2166 +#, c-format +msgid "" +"Wrong drawmode for this map.\n" +"Select \"%s\" from View menu and try again." +msgstr "" + +#: ../src/vikmapslayer.c:2171 +msgid "Wrong zoom level for this map." +msgstr "" + +#: ../src/vikmapslayer.c:2334 +msgid "Zoom Start:" +msgstr "" + +#: ../src/vikmapslayer.c:2341 +msgid "Zoom End:" +msgstr "" + +#: ../src/vikmapslayer.c:2347 +msgid "Download Maps Method:" +msgstr "" + +#. redownload method - needs to align with REDOWNLOAD* macro values +#: ../src/vikmapslayer.c:2419 +msgid "Missing" +msgstr "" + +#: ../src/vikmapslayer.c:2419 +msgid "Bad" +msgstr "" + +#: ../src/vikmapslayer.c:2419 +msgid "New" +msgstr "" + +#: ../src/vikmapslayer.c:2419 +msgid "Reload All" +msgstr "" + +#: ../src/vikmapslayer.c:2421 +msgid "Download for Zoom Levels" +msgstr "" + +#: ../src/vikmapslayer.c:2461 +#, c-format +msgid "" +"You are not allowed to download more than %d tiles in one go (requested %d)" +msgstr "" + +#: ../src/vikmapslayer.c:2469 +#, c-format +msgid "Do you really want to download %d tiles?" +msgstr "" + +#. Now with icons +#: ../src/vikmapslayer.c:2509 +msgid "Download _Missing Onscreen Maps" +msgstr "" + +#: ../src/vikmapslayer.c:2516 +msgid "Download _New Onscreen Maps" +msgstr "" + +#: ../src/vikmapslayer.c:2523 +msgid "Reload _All Onscreen Maps" +msgstr "" + +#: ../src/vikmapslayer.c:2529 +msgid "Download Maps in _Zoom Levels..." +msgstr "" + +#: ../src/vikmapslayer.c:2539 +msgid "_Open MBTiles Files" +msgstr "" + +#: ../src/vikmapslayer.c:2554 +msgid "Flush Map Cache" +msgstr "" + +#: ../src/vikrouting.c:54 +msgid "Default engine:" +msgstr "" + +#: ../src/vikrouting.c:68 +msgid "Routing" +msgstr "" + +#: ../src/viktreeview.c:347 +msgid "Layer Name" +msgstr "" + +#: ../src/viktreeview.c:924 +#, c-format +msgid "delete data from %s\n" +msgstr "" + +#: ../src/viktrwlayer.c:427 +msgid "Create _Waypoint" +msgstr "" + +#: ../src/viktrwlayer.c:427 +msgid "Create Waypoint" +msgstr "" + +#: ../src/viktrwlayer.c:437 +msgid "Edit _Track" +msgstr "" + +#: ../src/viktrwlayer.c:437 +msgid "Edit Track" +msgstr "" + +#: ../src/viktrwlayer.c:449 +msgid "Edit _Route" +msgstr "" + +#: ../src/viktrwlayer.c:449 +msgid "Edit Route" +msgstr "" + +#: ../src/viktrwlayer.c:460 +msgid "Route _Finder" +msgstr "" + +#: ../src/viktrwlayer.c:460 +msgid "Route Finder" +msgstr "" + +#: ../src/viktrwlayer.c:471 +msgid "Splitter" +msgstr "" + +#: ../src/viktrwlayer.c:482 +msgid "_Edit Waypoint" +msgstr "" + +#: ../src/viktrwlayer.c:482 +msgid "Edit Waypoint" +msgstr "" + +#: ../src/viktrwlayer.c:495 +msgid "Edit Trac_kpoint" +msgstr "" + +#: ../src/viktrwlayer.c:495 +msgid "Edit Trackpoint" +msgstr "" + +#. a pixbuf for this one is already made globally available +#: ../src/viktrwlayer.c:508 +msgid "Show P_icture" +msgstr "" + +#: ../src/viktrwlayer.c:508 +msgid "Show Picture" +msgstr "" + +#: ../src/viktrwlayer.c:531 +msgid "Waypoint Images" +msgstr "" + +#: ../src/viktrwlayer.c:531 +msgid "Tracks Advanced" +msgstr "" + +#: ../src/viktrwlayer.c:531 +msgid "Metadata" +msgstr "" + +#: ../src/viktrwlayer.c:531 +msgid "Filesystem" +msgstr "" + +#: ../src/viktrwlayer.c:534 +msgid "Draw by Track" +msgstr "" + +#: ../src/viktrwlayer.c:534 +msgid "Draw by Speed" +msgstr "" + +#: ../src/viktrwlayer.c:534 +msgid "All Tracks Same Color" +msgstr "" + +#: ../src/viktrwlayer.c:535 +msgid "Filled Square" +msgstr "" + +#: ../src/viktrwlayer.c:535 +msgid "Square" +msgstr "" + +#: ../src/viktrwlayer.c:535 +msgid "Circle" +msgstr "" + +#: ../src/viktrwlayer.c:535 +msgid "X" +msgstr "" + +#: ../src/viktrwlayer.c:561 +msgid "Extra Extra Small" +msgstr "" + +#: ../src/viktrwlayer.c:562 +msgid "Extra Small" +msgstr "" + +#: ../src/viktrwlayer.c:566 +msgid "Extra Large" +msgstr "" + +#: ../src/viktrwlayer.c:567 +msgid "Extra Extra Large" +msgstr "" + +#: ../src/viktrwlayer.c:573 +msgid "Name Ascending" +msgstr "" + +#: ../src/viktrwlayer.c:574 +msgid "Name Descending" +msgstr "" + +#: ../src/viktrwlayer.c:582 ../src/viktrwlayer_propwin.c:3319 +msgid "No" +msgstr "" + +#: ../src/viktrwlayer.c:583 +msgid "Yes" +msgstr "" + +#: ../src/viktrwlayer.c:584 +msgid "No write" +msgstr "" + +#: ../src/viktrwlayer.c:649 ../src/viktrwlayer.c:673 +msgid "Draw Labels" +msgstr "" + +#: ../src/viktrwlayer.c:650 +msgid "Note: the individual track controls what labels may be displayed" +msgstr "" + +#: ../src/viktrwlayer.c:651 +msgid "Track Labels Font Size:" +msgstr "" + +#: ../src/viktrwlayer.c:652 +msgid "Track Drawing Mode:" +msgstr "" + +#: ../src/viktrwlayer.c:653 +msgid "All Tracks Color:" +msgstr "" + +#: ../src/viktrwlayer.c:654 +msgid "The color used when 'All Tracks Same Color' drawing mode is selected" +msgstr "" + +#: ../src/viktrwlayer.c:655 +msgid "Draw Track Lines" +msgstr "" + +#: ../src/viktrwlayer.c:656 +msgid "Track Thickness:" +msgstr "" + +#: ../src/viktrwlayer.c:657 +msgid "Draw Track Direction" +msgstr "" + +#: ../src/viktrwlayer.c:658 +msgid "Direction Size:" +msgstr "" + +#: ../src/viktrwlayer.c:659 +msgid "Draw Trackpoints" +msgstr "" + +#: ../src/viktrwlayer.c:660 +msgid "Trackpoint Size:" +msgstr "" + +#: ../src/viktrwlayer.c:661 +msgid "Draw Elevation" +msgstr "" + +#: ../src/viktrwlayer.c:662 +msgid "Draw Elevation Height %:" +msgstr "" + +#: ../src/viktrwlayer.c:663 +msgid "Draw Stops" +msgstr "" + +#: ../src/viktrwlayer.c:664 +msgid "" +"Whether to draw a marker when trackpoints are at the same position but over " +"the minimum stop length apart in time" +msgstr "" + +#: ../src/viktrwlayer.c:665 +msgid "Min Stop Length (seconds):" +msgstr "" + +#: ../src/viktrwlayer.c:667 +msgid "Track BG Thickness:" +msgstr "" + +#: ../src/viktrwlayer.c:668 +msgid "Track Background Color" +msgstr "" + +#: ../src/viktrwlayer.c:669 +msgid "Draw by Speed Factor (%):" +msgstr "" + +#: ../src/viktrwlayer.c:670 +msgid "" +"The percentage factor away from the average speed determining the color used" +msgstr "" + +#: ../src/viktrwlayer.c:671 +msgid "Track Sort Order:" +msgstr "" + +#: ../src/viktrwlayer.c:674 +msgid "Waypoint Font Size:" +msgstr "" + +#: ../src/viktrwlayer.c:675 +msgid "Waypoint Color:" +msgstr "" + +#: ../src/viktrwlayer.c:676 +msgid "Waypoint Text:" +msgstr "" + +#: ../src/viktrwlayer.c:677 +msgid "Background:" +msgstr "" + +#: ../src/viktrwlayer.c:678 +msgid "Fake BG Color Translucency:" +msgstr "" + +#: ../src/viktrwlayer.c:679 +msgid "Waypoint marker:" +msgstr "" + +#: ../src/viktrwlayer.c:680 +msgid "Waypoint size:" +msgstr "" + +#: ../src/viktrwlayer.c:681 +msgid "Draw Waypoint Symbols:" +msgstr "" + +#: ../src/viktrwlayer.c:682 +msgid "Waypoint Sort Order:" +msgstr "" + +#: ../src/viktrwlayer.c:684 +msgid "Draw Waypoint Images" +msgstr "" + +#: ../src/viktrwlayer.c:685 +msgid "Image Size (pixels):" +msgstr "" + +#: ../src/viktrwlayer.c:686 +msgid "Image Alpha:" +msgstr "" + +#: ../src/viktrwlayer.c:687 +msgid "Image Memory Cache Size:" +msgstr "" + +#: ../src/viktrwlayer.c:690 +msgid "Author" +msgstr "" + +#: ../src/viktrwlayer.c:691 +msgid "Creation Time" +msgstr "" + +#: ../src/viktrwlayer.c:692 +msgid "Keywords" +msgstr "" + +#: ../src/viktrwlayer.c:693 +msgid "External layer:" +msgstr "" + +#: ../src/viktrwlayer.c:693 +msgid "" +"Layer data stored in the Viking file, in an external file, or in an external " +"file but changes are not written to the file (file only loaded at startup)" +msgstr "" + +#: ../src/viktrwlayer.c:694 +msgid "Save layer as:" +msgstr "" + +#: ../src/viktrwlayer.c:694 +msgid "Specify where layer should be saved. Overwrites file if it exists." +msgstr "" + +#: ../src/viktrwlayer.c:798 +msgid "TrackWaypoint" +msgstr "" + +#: ../src/viktrwlayer.c:1999 ../src/viktrwlayer_propwin.c:1469 +#: ../src/viktrwlayer_propwin.c:1471 ../src/vikutils.c:299 +#: ../src/vikutils.c:326 +msgid "miles" +msgstr "" + +#: ../src/viktrwlayer.c:2002 ../src/viktrwlayer_propwin.c:1475 +#: ../src/viktrwlayer_propwin.c:1477 ../src/vikutils.c:303 +#: ../src/vikutils.c:330 +msgid "NM" +msgstr "" + +#. VIK_UNITS_DISTANCE_KILOMETRES: +#: ../src/viktrwlayer.c:2006 ../src/viktrwlayer_propwin.c:1482 +#: ../src/viktrwlayer_propwin.c:1484 ../src/vikutils.c:308 +#: ../src/vikutils.c:335 +msgid "km" +msgstr "" + +#: ../src/viktrwlayer.c:2121 +msgid "start/end" +msgstr "" + +#: ../src/viktrwlayer.c:2133 +msgid "start" +msgstr "" + +#: ../src/viktrwlayer.c:2142 +msgid "end" +msgstr "" + +#: ../src/viktrwlayer.c:3103 +#, c-format +msgid " in %d:%02d hrs:mins" +msgstr "" + +#: ../src/viktrwlayer.c:3107 +#, c-format +msgid "" +"\n" +"%sTotal Length %.1f %s%s" +msgstr "" + +#: ../src/viktrwlayer.c:3131 +#, c-format +msgid "" +"\n" +"Total route length %.1f %s" +msgstr "" + +#: ../src/viktrwlayer.c:3136 +#, c-format +msgid "Tracks: %d - Waypoints: %d - Routes: %d%s%s" +msgstr "" + +#: ../src/viktrwlayer.c:3155 +#, c-format +msgid "Tracks: %d" +msgstr "" + +#: ../src/viktrwlayer.c:3165 +#, c-format +msgid "Routes: %d" +msgstr "" + +#: ../src/viktrwlayer.c:3195 +#, c-format +msgid "- %d:%02d hrs:mins" +msgstr "" + +#: ../src/viktrwlayer.c:3202 +#, c-format +msgid "%s%.1f km %s" +msgstr "" + +#: ../src/viktrwlayer.c:3205 +#, c-format +msgid "%s%.1f miles %s" +msgstr "" + +#: ../src/viktrwlayer.c:3208 +#, c-format +msgid "%s%.1f NM %s" +msgstr "" + +#: ../src/viktrwlayer.c:3222 +#, c-format +msgid "Waypoints: %d" +msgstr "" + +#: ../src/viktrwlayer.c:3279 +#, c-format +msgid "Wpt: Alt %dft" +msgstr "" + +#. VIK_UNITS_HEIGHT_METRES: +#: ../src/viktrwlayer.c:3283 +#, c-format +msgid "Wpt: Alt %dm" +msgstr "" + +#. Add comment if available +#: ../src/viktrwlayer.c:3298 +#, c-format +msgid "%s | %s %s | Comment: %s" +msgstr "" + +#: ../src/viktrwlayer.c:3300 +#, c-format +msgid "%s | %s %s" +msgstr "" + +#: ../src/viktrwlayer.c:3562 ../src/viktrwlayer.c:3591 +msgid "This layer has no waypoints or trackpoints." +msgstr "" + +#: ../src/viktrwlayer.c:3598 ../src/viktrwlayer.c:3607 +#: ../src/viktrwlayer.c:3616 ../src/viktrwlayer.c:3625 +#: ../src/viktrwlayer.c:3634 ../src/viktrwlayer.c:3642 +msgid "Export Layer" +msgstr "" + +#: ../src/viktrwlayer.c:3671 +msgid "Export Route as GPX" +msgstr "" + +#: ../src/viktrwlayer.c:3673 +msgid "Export Track as GPX" +msgstr "" + +#: ../src/viktrwlayer.c:3693 +msgid "Find" +msgstr "" + +#: ../src/viktrwlayer.c:3703 +msgid "Waypoint Name:" +msgstr "" + +#: ../src/viktrwlayer.c:3720 +msgid "Waypoint not found in this layer." +msgstr "" + +#: ../src/viktrwlayer.c:3989 +msgid "Can not upload invisible track." +msgstr "" + +#: ../src/viktrwlayer.c:4082 ../src/viktrwlayer.c:10512 +msgid "Track" +msgstr "" + +#: ../src/viktrwlayer.c:4107 ../src/viktrwlayer.c:10599 +msgid "Route" +msgstr "" + +#: ../src/viktrwlayer.c:4194 +msgid "Externa_l" +msgstr "" + +#: ../src/viktrwlayer.c:4216 ../src/viktrwlayer.c:8456 +#: ../src/viktrwlayer.c:8574 +msgid "_Finish Route" +msgstr "" + +#: ../src/viktrwlayer.c:4218 ../src/viktrwlayer.c:8380 +#: ../src/viktrwlayer.c:8572 +msgid "_Finish Track" +msgstr "" + +#. Now with icons +#: ../src/viktrwlayer.c:4230 +msgid "_View Layer" +msgstr "" + +#: ../src/viktrwlayer.c:4237 +msgid "V_iew" +msgstr "" + +#: ../src/viktrwlayer.c:4243 +msgid "View All _Tracks" +msgstr "" + +#: ../src/viktrwlayer.c:4248 +msgid "View All _Routes" +msgstr "" + +#: ../src/viktrwlayer.c:4253 +msgid "View All _Waypoints" +msgstr "" + +#: ../src/viktrwlayer.c:4258 +msgid "_Goto Center of Layer" +msgstr "" + +#: ../src/viktrwlayer.c:4264 ../src/viktrwlayer.c:8321 +msgid "Goto _Waypoint..." +msgstr "" + +#: ../src/viktrwlayer.c:4270 +msgid "_Export Layer" +msgstr "" + +#: ../src/viktrwlayer.c:4276 +msgid "Export as GPS_Point..." +msgstr "" + +#: ../src/viktrwlayer.c:4281 +msgid "Export as GPS_Mapper..." +msgstr "" + +#: ../src/viktrwlayer.c:4286 +msgid "Export as _GPX..." +msgstr "" + +#: ../src/viktrwlayer.c:4292 +msgid "Export as _KML..." +msgstr "" + +#: ../src/viktrwlayer.c:4299 +msgid "Export as GEO_JSON..." +msgstr "" + +#: ../src/viktrwlayer.c:4306 +msgid "Export via GPSbabel..." +msgstr "" + +#: ../src/viktrwlayer.c:4312 +#, c-format +msgid "Open with External Program_1: %s" +msgstr "" + +#: ../src/viktrwlayer.c:4319 +#, c-format +msgid "Open with External Program_2: %s" +msgstr "" + +#: ../src/viktrwlayer.c:4327 ../src/vikwindow.c:4825 +msgid "_New" +msgstr "" + +#: ../src/viktrwlayer.c:4333 +msgid "New _Waypoint..." +msgstr "" + +#: ../src/viktrwlayer.c:4339 +msgid "New _Track" +msgstr "" + +#: ../src/viktrwlayer.c:4347 +msgid "New _Route" +msgstr "" + +#: ../src/viktrwlayer.c:4356 ../src/viktrwlayer.c:8232 +#: ../src/viktrwlayer.c:9003 +msgid "Geotag _Images..." +msgstr "" + +#: ../src/viktrwlayer.c:4363 +msgid "_Acquire" +msgstr "" + +#: ../src/viktrwlayer.c:4369 ../src/vikwindow.c:4904 +msgid "From _GPS..." +msgstr "" + +#. FIXME: only add menu when at least a routing engine has support for Directions +#: ../src/viktrwlayer.c:4375 +msgid "From _Directions..." +msgstr "" + +#: ../src/viktrwlayer.c:4381 +msgid "From _OSM Traces..." +msgstr "" + +#: ../src/viktrwlayer.c:4386 +msgid "From _My OSM Traces..." +msgstr "" + +#: ../src/viktrwlayer.c:4392 ../src/vikwindow.c:4844 +msgid "From _URL..." +msgstr "" + +#: ../src/viktrwlayer.c:4399 ../src/vikwindow.c:4846 +msgid "From _Wikipedia Waypoints" +msgstr "" + +#: ../src/viktrwlayer.c:4405 +msgid "Within _Layer Bounds" +msgstr "" + +#: ../src/viktrwlayer.c:4411 +msgid "Within _Current View" +msgstr "" + +#: ../src/viktrwlayer.c:4419 +msgid "From Geo_caching..." +msgstr "" + +#: ../src/viktrwlayer.c:4426 ../src/vikwindow.c:4842 +msgid "From Geotagged _Images..." +msgstr "" + +#: ../src/viktrwlayer.c:4433 +msgid "From _File..." +msgstr "" + +#: ../src/viktrwlayer.c:4436 ../src/vikwindow.c:4905 +msgid "Import File With GPS_Babel..." +msgstr "" + +#: ../src/viktrwlayer.c:4443 ../src/viktrwlayer.c:8905 +msgid "_Upload" +msgstr "" + +#: ../src/viktrwlayer.c:4449 +msgid "Upload to _GPS..." +msgstr "" + +#: ../src/viktrwlayer.c:4456 ../src/viktrwlayer.c:8973 +msgid "Upload to _OSM..." +msgstr "" + +#: ../src/viktrwlayer.c:4464 +msgid "De_lete" +msgstr "" + +#: ../src/viktrwlayer.c:4470 +msgid "Delete All _Tracks" +msgstr "" + +#: ../src/viktrwlayer.c:4477 +msgid "Delete Tracks _From Selection..." +msgstr "" + +#: ../src/viktrwlayer.c:4484 ../src/viktrwlayer.c:8481 +msgid "Delete _All Routes" +msgstr "" + +#: ../src/viktrwlayer.c:4491 ../src/viktrwlayer.c:8487 +msgid "_Delete Routes From Selection..." +msgstr "" + +#: ../src/viktrwlayer.c:4498 +msgid "Delete All _Waypoints" +msgstr "" + +#: ../src/viktrwlayer.c:4505 +msgid "Delete Waypoints From _Selection..." +msgstr "" + +#: ../src/viktrwlayer.c:4512 ../src/viktrwlayer.c:8339 +msgid "Delete Duplicate Waypoints" +msgstr "" + +#: ../src/viktrwlayer.c:5198 +#, c-format +msgid "Are you sure you want to delete all tracks in %s?" +msgstr "" + +#: ../src/viktrwlayer.c:5211 +#, c-format +msgid "Are you sure you want to delete all routes in %s?" +msgstr "" + +#: ../src/viktrwlayer.c:5221 +#, c-format +msgid "Are you sure you want to delete all waypoints in %s?" +msgstr "" + +#: ../src/viktrwlayer.c:5238 +#, c-format +msgid "Are you sure you want to delete the waypoint \"%s\"?" +msgstr "" + +#: ../src/viktrwlayer.c:5254 +#, c-format +msgid "Are you sure you want to delete the track \"%s\"?" +msgstr "" + +#: ../src/viktrwlayer.c:5271 +#, c-format +msgid "Are you sure you want to delete the route \"%s\"?" +msgstr "" + +#: ../src/viktrwlayer.c:5527 ../src/viktrwlayer.c:6373 +msgid "" +"Converting a track to a route removes extra track data such as segments, " +"timestamps, etc...\n" +"Do you want to continue?" +msgstr "" + +#: ../src/viktrwlayer.c:5631 +msgid "No DEM layers available, thus no DEM values can be applied." +msgstr "" + +#: ../src/viktrwlayer.c:5651 ../src/viktrwlayer.c:5692 +#, c-format +msgid "%ld point adjusted" +msgid_plural "%ld points adjusted" +msgstr[0] "" +msgstr[1] "" + +#: ../src/viktrwlayer.c:5736 +#, c-format +msgid "%ld waypoint changed" +msgid_plural "%ld waypoints changed" +msgstr[0] "" +msgstr[1] "" + +#: ../src/viktrwlayer.c:5917 +#, c-format +msgid "" +"Refining a track with many points (%d) is unlikely to yield sensible " +"results. Do you want to Continue?" +msgstr "" + +#. Select engine from dialog +#: ../src/viktrwlayer.c:5925 +msgid "Refine Route with Routing Engine..." +msgstr "" + +#: ../src/viktrwlayer.c:5933 +msgid "Select routing engine" +msgstr "" + +#: ../src/viktrwlayer.c:6158 +msgid "Failed. No other tracks with timestamps in this layer found" +msgstr "" + +#: ../src/viktrwlayer.c:6160 +msgid "Failed. No other tracks without timestamps in this layer found" +msgstr "" + +#: ../src/viktrwlayer.c:6179 +msgid "Merge with..." +msgstr "" + +#: ../src/viktrwlayer.c:6180 +msgid "Select route to merge with" +msgstr "" + +#: ../src/viktrwlayer.c:6180 +msgid "Select track to merge with" +msgstr "" + +#: ../src/viktrwlayer.c:6264 ../src/viktrwlayer.c:6346 +msgid "Append Route" +msgstr "" + +#: ../src/viktrwlayer.c:6264 ../src/viktrwlayer.c:6346 +msgid "Append Track" +msgstr "" + +#: ../src/viktrwlayer.c:6265 +msgid "Select the route to append after the current route" +msgstr "" + +#: ../src/viktrwlayer.c:6266 +msgid "Select the track to append after the current track" +msgstr "" + +#: ../src/viktrwlayer.c:6347 +msgid "Select the track to append after the current route" +msgstr "" + +#: ../src/viktrwlayer.c:6348 +msgid "Select the route to append after the current track" +msgstr "" + +#: ../src/viktrwlayer.c:6414 +#, c-format +msgid "%d segment merged" +msgid_plural "%d segments merged" +msgstr[0] "" +msgstr[1] "" + +#: ../src/viktrwlayer.c:6430 +msgid "Failed. This track does not have timestamp" +msgstr "" + +#: ../src/viktrwlayer.c:6442 +msgid "Failed. No other track in this layer has timestamp" +msgstr "" + +#: ../src/viktrwlayer.c:6449 +msgid "Merge Threshold..." +msgstr "" + +#: ../src/viktrwlayer.c:6450 +msgid "Merge when time between tracks less than:" +msgstr "" + +#: ../src/viktrwlayer.c:6580 +msgid "Split Threshold..." +msgstr "" + +#: ../src/viktrwlayer.c:6581 +msgid "Split when time between trackpoints exceeds:" +msgstr "" + +#: ../src/viktrwlayer.c:6598 +#, c-format +msgid "" +"Can not split track due to trackpoints not ordered in time - such as at %s.\n" +"\n" +"Goto this trackpoint?" +msgstr "" + +#: ../src/viktrwlayer.c:6668 +msgid "Split Every Nth Point" +msgstr "" + +#: ../src/viktrwlayer.c:6669 +msgid "Split on every Nth point:" +msgstr "" + +#: ../src/viktrwlayer.c:6779 +msgid "Can not split track as it has no segments" +msgstr "" + +#: ../src/viktrwlayer.c:6861 ../src/viktrwlayer.c:6891 +#, c-format +msgid "Deleted %ld point" +msgid_plural "Deleted %ld points" +msgstr[0] "" +msgstr[1] "" + +#: ../src/viktrwlayer.c:6966 ../src/viktrwlayer.c:10989 +#: ../src/viktrwlayer_waypointlist.c:214 +#, c-format +msgid "Could not launch %s to open file." +msgstr "" + +#: ../src/viktrwlayer.c:6992 ../src/viktrwlayer.c:7113 +msgid "This track has no date information." +msgstr "" + +#: ../src/viktrwlayer.c:7006 ../src/viktrwlayer.c:7136 +msgid "This waypoint has no date information." +msgstr "" + +#: ../src/viktrwlayer.c:7030 +#, c-format +msgid "Could not launch %s" +msgstr "" + +#: ../src/viktrwlayer.c:7269 +msgid "Internal Error in vik_trw_layer_uniquify_tracks" +msgstr "" + +#: ../src/viktrwlayer.c:7374 ../src/viktrwlayer.c:7424 +#: ../src/viktrwlayer.c:7587 +msgid "" +"Multiple entries with the same name exist. This method only works with " +"unique names. Force unique names now?" +msgstr "" + +#: ../src/viktrwlayer.c:7385 +msgid "No tracks found" +msgstr "" + +#: ../src/viktrwlayer.c:7393 ../src/viktrwlayer.c:7443 +#: ../src/viktrwlayer.c:7607 +msgid "Delete Selection" +msgstr "" + +#: ../src/viktrwlayer.c:7394 +msgid "Select tracks to delete" +msgstr "" + +#: ../src/viktrwlayer.c:7435 +msgid "No routes found" +msgstr "" + +#: ../src/viktrwlayer.c:7444 +msgid "Select routes to delete" +msgstr "" + +#: ../src/viktrwlayer.c:7550 +msgid "Internal Error in vik_trw_layer_uniquify_waypoints" +msgstr "" + +#: ../src/viktrwlayer.c:7597 +msgid "No waypoints found" +msgstr "" + +#: ../src/viktrwlayer.c:7608 +msgid "Select waypoints to delete" +msgstr "" + +#: ../src/viktrwlayer.c:7691 +#, c-format +msgid "%ld waypoint deleted" +msgid_plural "%ld waypoints deleted" +msgstr[0] "" +msgstr[1] "" +msgstr[2] "" + +#: ../src/viktrwlayer.c:7697 +msgid "No duplicates found" +msgstr "" + +#: ../src/viktrwlayer.c:8028 +#, c-format +msgid "" +"A waypoint with the name \"%s\" already exists. Really rename to the same " +"name?" +msgstr "" + +#: ../src/viktrwlayer.c:8058 +#, c-format +msgid "" +"A track with the name \"%s\" already exists. Really rename to the same name?" +msgstr "" + +#: ../src/viktrwlayer.c:8095 +#, c-format +msgid "" +"A route with the name \"%s\" already exists. Really rename to the same name?" +msgstr "" + +#: ../src/viktrwlayer.c:8215 ../src/viktrwlayer.c:8602 +msgid "_Goto" +msgstr "" + +#: ../src/viktrwlayer.c:8226 +msgid "_Visit Geocache Webpage" +msgstr "" + +#: ../src/viktrwlayer.c:8235 +msgid "Geotag multiple images against this waypoint" +msgstr "" + +#: ../src/viktrwlayer.c:8245 ../src/viktrwlayer_waypointlist.c:352 +msgid "_Show Picture..." +msgstr "" + +#: ../src/viktrwlayer.c:8253 +msgid "Update Geotag on _Image" +msgstr "" + +#: ../src/viktrwlayer.c:8259 +msgid "_Update" +msgstr "" + +#: ../src/viktrwlayer.c:8264 +msgid "Update and _Keep File Timestamp" +msgstr "" + +#: ../src/viktrwlayer.c:8276 +msgid "Visit _Webpage" +msgstr "" + +#: ../src/viktrwlayer.c:8306 +msgid "_New Waypoint..." +msgstr "" + +#: ../src/viktrwlayer.c:8315 +msgid "_View All Waypoints" +msgstr "" + +#: ../src/viktrwlayer.c:8327 +msgid "Delete _All Waypoints" +msgstr "" + +#: ../src/viktrwlayer.c:8333 +msgid "_Delete Waypoints From Selection..." +msgstr "" + +#: ../src/viktrwlayer.c:8351 +msgid "_Show All Waypoints" +msgstr "" + +#: ../src/viktrwlayer.c:8357 +msgid "_Hide All Waypoints" +msgstr "" + +#: ../src/viktrwlayer.c:8369 +msgid "_List Waypoints..." +msgstr "" + +#: ../src/viktrwlayer.c:8390 +msgid "_View All Tracks" +msgstr "" + +#: ../src/viktrwlayer.c:8396 +msgid "_New Track" +msgstr "" + +#: ../src/viktrwlayer.c:8404 +msgid "Delete _All Tracks" +msgstr "" + +#: ../src/viktrwlayer.c:8410 +msgid "_Delete Tracks From Selection..." +msgstr "" + +#: ../src/viktrwlayer.c:8422 +msgid "_Show All Tracks" +msgstr "" + +#: ../src/viktrwlayer.c:8428 +msgid "_Hide All Tracks" +msgstr "" + +#: ../src/viktrwlayer.c:8439 +msgid "_List Tracks..." +msgstr "" + +#: ../src/viktrwlayer.c:8467 +msgid "_View All Routes" +msgstr "" + +#: ../src/viktrwlayer.c:8473 +msgid "_New Route" +msgstr "" + +#: ../src/viktrwlayer.c:8499 +msgid "_Show All Routes" +msgstr "" + +#: ../src/viktrwlayer.c:8505 +msgid "_Hide All Routes" +msgstr "" + +#: ../src/viktrwlayer.c:8516 +msgid "_List Routes..." +msgstr "" + +#: ../src/viktrwlayer.c:8587 +msgid "_View Track" +msgstr "" + +#: ../src/viktrwlayer.c:8589 +msgid "_View Route" +msgstr "" + +#: ../src/viktrwlayer.c:8608 +msgid "_Startpoint" +msgstr "" + +#: ../src/viktrwlayer.c:8614 +msgid "\"_Center\"" +msgstr "" + +#: ../src/viktrwlayer.c:8620 +msgid "_Endpoint" +msgstr "" + +#: ../src/viktrwlayer.c:8626 +msgid "_Highest Altitude" +msgstr "" + +#: ../src/viktrwlayer.c:8632 +msgid "_Lowest Altitude" +msgstr "" + +#: ../src/viktrwlayer.c:8640 +msgid "_Maximum Speed" +msgstr "" + +#: ../src/viktrwlayer.c:8646 +msgid "_Date" +msgstr "" + +#: ../src/viktrwlayer.c:8655 +msgid "Co_mbine" +msgstr "" + +#: ../src/viktrwlayer.c:8663 +msgid "_Merge By Time..." +msgstr "" + +#: ../src/viktrwlayer.c:8668 +msgid "Merge _Segments" +msgstr "" + +#: ../src/viktrwlayer.c:8675 +msgid "Merge _With Other Tracks..." +msgstr "" + +#: ../src/viktrwlayer.c:8682 +msgid "_Append Track..." +msgstr "" + +#: ../src/viktrwlayer.c:8684 +msgid "_Append Route..." +msgstr "" + +#: ../src/viktrwlayer.c:8690 +msgid "Append _Route..." +msgstr "" + +#: ../src/viktrwlayer.c:8692 +msgid "Append _Track..." +msgstr "" + +#: ../src/viktrwlayer.c:8699 +msgid "_Split" +msgstr "" + +#: ../src/viktrwlayer.c:8707 +msgid "_Split By Time..." +msgstr "" + +#. ATM always enable this entry - don't want to have to analyse the track before displaying the menu - to keep the menu speedy +#: ../src/viktrwlayer.c:8713 +msgid "Split Se_gments" +msgstr "" + +#: ../src/viktrwlayer.c:8719 +msgid "Split By _Number of Points..." +msgstr "" + +#: ../src/viktrwlayer.c:8724 +msgid "Split at _Trackpoint" +msgstr "" + +#: ../src/viktrwlayer.c:8732 +msgid "_Insert Points" +msgstr "" + +#: ../src/viktrwlayer.c:8738 +msgid "Insert Point _Before Selected Point" +msgstr "" + +#: ../src/viktrwlayer.c:8745 +msgid "Insert Point _After Selected Point" +msgstr "" + +#: ../src/viktrwlayer.c:8754 +msgid "Delete Poi_nts" +msgstr "" + +#: ../src/viktrwlayer.c:8760 +msgid "Delete _Selected Point" +msgstr "" + +#: ../src/viktrwlayer.c:8768 +msgid "Delete Points With The Same _Position" +msgstr "" + +#: ../src/viktrwlayer.c:8773 +msgid "Delete Points With The Same _Time" +msgstr "" + +#: ../src/viktrwlayer.c:8780 ../src/viktrwlayer.c:9029 +msgid "_Transform" +msgstr "" + +#: ../src/viktrwlayer.c:8788 ../src/viktrwlayer.c:9037 +msgid "_Apply DEM Data" +msgstr "" + +#: ../src/viktrwlayer.c:8793 ../src/viktrwlayer.c:9042 +msgid "_Overwrite" +msgstr "" + +#: ../src/viktrwlayer.c:8796 ../src/viktrwlayer.c:9045 +msgid "Overwrite any existing elevation values with DEM values" +msgstr "" + +#: ../src/viktrwlayer.c:8799 ../src/viktrwlayer.c:9048 +msgid "_Keep Existing" +msgstr "" + +#: ../src/viktrwlayer.c:8802 ../src/viktrwlayer.c:9051 +msgid "Keep existing elevation values, only attempt for missing values" +msgstr "" + +#: ../src/viktrwlayer.c:8807 +msgid "_Smooth Missing Elevation Data" +msgstr "" + +#: ../src/viktrwlayer.c:8812 +msgid "_Interpolated" +msgstr "" + +#: ../src/viktrwlayer.c:8815 +msgid "" +"Interpolate between known elevation values to derive values for the missing " +"elevations" +msgstr "" + +#: ../src/viktrwlayer.c:8818 +msgid "_Flat" +msgstr "" + +#: ../src/viktrwlayer.c:8821 +msgid "Set unknown elevation values to the last known value" +msgstr "" + +#: ../src/viktrwlayer.c:8825 +msgid "C_onvert to a Route" +msgstr "" + +#: ../src/viktrwlayer.c:8827 +msgid "C_onvert to a Track" +msgstr "" + +#: ../src/viktrwlayer.c:8835 +msgid "_Anonymize Times" +msgstr "" + +#: ../src/viktrwlayer.c:8838 +msgid "Shift timestamps to a relative offset from 1901-01-01" +msgstr "" + +#: ../src/viktrwlayer.c:8841 +msgid "_Interpolate Times" +msgstr "" + +#: ../src/viktrwlayer.c:8844 +msgid "" +"Reset trackpoint timestamps between the first and last points such that " +"track is traveled at equal speed" +msgstr "" + +#: ../src/viktrwlayer.c:8849 +msgid "_Reverse Track" +msgstr "" + +#: ../src/viktrwlayer.c:8851 +msgid "_Reverse Route" +msgstr "" + +#: ../src/viktrwlayer.c:8858 +msgid "Refine Route..." +msgstr "" + +#: ../src/viktrwlayer.c:8868 +msgid "Down_load Maps Along Track..." +msgstr "" + +#: ../src/viktrwlayer.c:8870 +msgid "Down_load Maps Along Route..." +msgstr "" + +#: ../src/viktrwlayer.c:8878 +msgid "_Export Track as GPX..." +msgstr "" + +#: ../src/viktrwlayer.c:8880 +msgid "_Export Route as GPX..." +msgstr "" + +#: ../src/viktrwlayer.c:8887 +msgid "E_xtend Track End" +msgstr "" + +#: ../src/viktrwlayer.c:8889 +msgid "E_xtend Route End" +msgstr "" + +#: ../src/viktrwlayer.c:8896 +msgid "Extend _Using Route Finder" +msgstr "" + +#: ../src/viktrwlayer.c:8911 +msgid "_Upload to GPS..." +msgstr "" + +#: ../src/viktrwlayer.c:8926 +msgid "_Diary" +msgstr "" + +#: ../src/viktrwlayer.c:8930 +msgid "Open diary program at this date" +msgstr "" + +#: ../src/viktrwlayer.c:8935 +msgid "_Astronomy" +msgstr "" + +#: ../src/viktrwlayer.c:8938 +msgid "Open astronomy program at this date and location" +msgstr "" + +#: ../src/viktrwlayer.c:8962 +msgid "_View Google Directions" +msgstr "" + +#: ../src/viktrwlayer.c:8984 +msgid "Use with _Filter" +msgstr "" + +#: ../src/viktrwlayer.c:9018 +msgid "_Edit Trackpoint" +msgstr "" + +#: ../src/viktrwlayer.c:10116 +#, c-format +msgid " - Gain %dm:Loss %dm" +msgstr "" + +#: ../src/viktrwlayer.c:10118 +#, c-format +msgid " - Gain %dft:Loss %dft" +msgstr "" + +#: ../src/viktrwlayer.c:10123 +#, c-format +msgid " - Bearing %3.1f° - Step %s" +msgstr "" + +#: ../src/viktrwlayer.c:10232 +#, c-format +msgid "Querying %s for route between (%.3f, %.3f) and (%.3f, %.3f)." +msgstr "" + +#: ../src/viktrwlayer.c:10248 +#, c-format +msgid "%s returned route between (%.3f, %.3f) and (%.3f, %.3f)." +msgstr "" + +#: ../src/viktrwlayer.c:10251 +#, c-format +msgid "Error getting route from %s." +msgstr "" + +#: ../src/viktrwlayer.c:11070 +#, c-format +msgid "Creating %d Image Thumbnails..." +msgstr "" + +#: ../src/viktrwlayer.c:11560 +msgid "No map layer in use. Create one first" +msgstr "" + +#: ../src/viktrwlayer.c:11679 +#, c-format +msgid "%s: Track List" +msgstr "" + +#: ../src/viktrwlayer.c:11681 +#, c-format +msgid "%s: Route List" +msgstr "" + +#: ../src/viktrwlayer.c:11734 +#, c-format +msgid "" +"Could not write external layer %s to %s, please fix and save before exiting " +"or data will be lost" +msgstr "" + +#: ../src/viktrwlayer.c:11782 +#, c-format +msgid "WARNING: issues encountered loading external layer %s from %s" +msgstr "" + +#: ../src/viktrwlayer_export.c:47 +msgid "Auto Device GPX Simplify:" +msgstr "" + +#: ../src/viktrwlayer_export.c:48 +msgid "" +"GPX saves to certain devices will be simplified for device compatibility." +msgstr "" + +#: ../src/viktrwlayer_export.c:125 +#, c-format +msgid "Export of GPX file simplified using point limit: %d" +msgstr "" + +#: ../src/viktrwlayer_export.c:206 ../src/viktrwlayer_export.c:323 +#: ../src/vikwindow.c:3694 +msgid "The filename you requested could not be opened for writing." +msgstr "" + +#: ../src/viktrwlayer_export.c:226 +#, c-format +msgid "Could not launch %s." +msgstr "" + +#: ../src/viktrwlayer_export.c:234 +msgid "Could not create temporary file for export." +msgstr "" + +#: ../src/viktrwlayer_export.c:268 +msgid "File format:" +msgstr "" + +#: ../src/viktrwlayer_export.c:276 +msgid "Select the file format." +msgstr "" + +#: ../src/viktrwlayer_export.c:281 +msgid "" +"Select the information to process.\n" +"Warning: the behavior of these switches is highly dependent of the file " +"format selected.\n" +"Please, refer to GPSbabel if unsure." +msgstr "" + +#: ../src/viktrwlayer_export.c:308 +msgid "You did not select a valid file format." +msgstr "" + +#: ../src/viktrwlayer_propwin.c:915 ../src/viktrwlayer_propwin.c:3381 +#: ../src/viktrwlayer_propwin.c:3417 ../src/viktrwlayer_propwin.c:3457 +#: ../src/viktrwlayer_propwin.c:3509 ../src/viktrwlayer_propwin.c:3527 +#: ../src/viktrwlayer_propwin.c:3600 ../src/viktrwlayer_propwin.c:3601 +#: ../src/viktrwlayer_propwin.c:3602 ../src/viktrwlayer_propwin.c:3611 +#: ../src/viktrwlayer_propwin.c:3612 ../src/viktrwlayer_propwin.c:3629 +#: ../src/viktrwlayer_propwin.c:3630 ../src/viktrwlayer_propwin.c:3644 +#: ../src/viktrwlayer_propwin.c:3645 ../src/viktrwlayer_propwin.c:3646 +#: ../src/viktrwlayer_propwin.c:3660 ../src/viktrwlayer_propwin.c:3661 +#: ../src/viktrwlayer_propwin.c:3662 ../src/viktrwlayer_propwin.c:3676 +#: ../src/viktrwlayer_propwin.c:3677 ../src/viktrwlayer_propwin.c:3678 +#: ../src/viktrwlayer_propwin.c:3695 ../src/viktrwlayer_propwin.c:3696 +#: ../src/viktrwlayer_analysis.c:293 +#, c-format +msgid "No Data" +msgstr "" + +#: ../src/viktrwlayer_propwin.c:960 ../src/viktrwlayer_propwin.c:1245 +#, c-format +msgid "%.1f kph" +msgstr "" + +#: ../src/viktrwlayer_propwin.c:963 ../src/viktrwlayer_propwin.c:1248 +#: ../src/viktrwlayer_analysis.c:352 +#, c-format +msgid "%.1f mph" +msgstr "" + +#: ../src/viktrwlayer_propwin.c:966 ../src/viktrwlayer_propwin.c:1251 +#, c-format +msgid "%.1f knots" +msgstr "" + +#: ../src/viktrwlayer_propwin.c:969 ../src/viktrwlayer_propwin.c:1254 +#, c-format +msgid "%.1f s/km" +msgstr "" + +#: ../src/viktrwlayer_propwin.c:972 ../src/viktrwlayer_propwin.c:1257 +#: ../src/viktrwlayer_analysis.c:389 ../src/viktrwlayer_analysis.c:392 +#, c-format +msgid "%.1f min/km" +msgstr "" + +#: ../src/viktrwlayer_propwin.c:975 ../src/viktrwlayer_propwin.c:1260 +#, c-format +msgid "%.1f sec/mi" +msgstr "" + +#: ../src/viktrwlayer_propwin.c:978 ../src/viktrwlayer_propwin.c:1263 +#: ../src/viktrwlayer_analysis.c:409 ../src/viktrwlayer_analysis.c:412 +#, c-format +msgid "%.1f min/mi" +msgstr "" + +#. VIK_UNITS_SPEED_METRES_PER_SECOND: +#: ../src/viktrwlayer_propwin.c:982 ../src/viktrwlayer_propwin.c:1267 +#, c-format +msgid "%.1f m/s" +msgstr "" + +#. Minutes +#: ../src/viktrwlayer_propwin.c:1411 +msgid "mins" +msgstr "" + +#. Hours +#: ../src/viktrwlayer_propwin.c:1418 +msgid "h" +msgstr "" + +#. Days +#: ../src/viktrwlayer_propwin.c:1424 +msgid "d" +msgstr "" + +#. Weeks +#: ../src/viktrwlayer_propwin.c:1429 +msgid "w" +msgstr "" + +#. 'Months' +#: ../src/viktrwlayer_propwin.c:1433 +msgid "M" +msgstr "" + +#: ../src/viktrwlayer_propwin.c:2051 ../src/viktrwlayer_analysis.c:303 +#, c-format +msgid "%.1f miles" +msgstr "" + +#: ../src/viktrwlayer_propwin.c:2054 ../src/viktrwlayer_analysis.c:306 +#, c-format +msgid "%.1f NM" +msgstr "" + +#. VIK_UNITS_DISTANCE_KILOMETRES +#: ../src/viktrwlayer_propwin.c:2057 ../src/viktrwlayer_analysis.c:310 +#, c-format +msgid "%.1f km" +msgstr "" + +#: ../src/viktrwlayer_propwin.c:3083 +msgid "Failed spliting track. Track unchanged" +msgstr "" + +#: ../src/viktrwlayer_propwin.c:3234 ../src/viktrwlayer_propwin.c:3744 +#, c-format +msgid "%s - Track Properties" +msgstr "" + +#: ../src/viktrwlayer_propwin.c:3239 +msgid "Split at _Marker" +msgstr "" + +#: ../src/viktrwlayer_propwin.c:3240 +msgid "Split _Segments" +msgstr "" + +#: ../src/viktrwlayer_propwin.c:3241 +msgid "_Reverse" +msgstr "" + +#: ../src/viktrwlayer_propwin.c:3242 +msgid "_Delete Dupl." +msgstr "" + +#: ../src/viktrwlayer_propwin.c:3269 +msgid "Comment:" +msgstr "" + +#: ../src/viktrwlayer_propwin.c:3270 +msgid "Description:" +msgstr "" + +#: ../src/viktrwlayer_propwin.c:3271 +msgid "Source:" +msgstr "" + +#: ../src/viktrwlayer_propwin.c:3272 +msgid "Type:" +msgstr "" + +#: ../src/viktrwlayer_propwin.c:3273 +msgid "Color:" +msgstr "" + +#: ../src/viktrwlayer_propwin.c:3274 +msgid "Draw Name:" +msgstr "" + +#: ../src/viktrwlayer_propwin.c:3275 +msgid "Distance Labels:" +msgstr "" + +#: ../src/viktrwlayer_propwin.c:3278 +msgid "Track Length:" +msgstr "" + +#: ../src/viktrwlayer_propwin.c:3279 +msgid "Trackpoints:" +msgstr "" + +#: ../src/viktrwlayer_propwin.c:3280 +msgid "Segments:" +msgstr "" + +#: ../src/viktrwlayer_propwin.c:3281 +msgid "Duplicate Points:" +msgstr "" + +#: ../src/viktrwlayer_propwin.c:3282 +msgid "Max Speed:" +msgstr "" + +#: ../src/viktrwlayer_propwin.c:3283 +msgid "Avg. Speed:" +msgstr "" + +#: ../src/viktrwlayer_propwin.c:3284 +msgid "Moving Avg. Speed:" +msgstr "" + +#: ../src/viktrwlayer_propwin.c:3285 +msgid "Avg. Dist. Between TPs:" +msgstr "" + +#: ../src/viktrwlayer_propwin.c:3286 +msgid "Elevation Range:" +msgstr "" + +#: ../src/viktrwlayer_propwin.c:3287 +msgid "Total Elevation Gain/Loss:" +msgstr "" + +#: ../src/viktrwlayer_propwin.c:3288 +msgid "Start:" +msgstr "" + +#: ../src/viktrwlayer_propwin.c:3289 +msgid "End:" +msgstr "" + +#: ../src/viktrwlayer_propwin.c:3290 +msgid "Duration:" +msgstr "" + +#: ../src/viktrwlayer_propwin.c:3320 +msgid "Centre" +msgstr "" + +#: ../src/viktrwlayer_propwin.c:3321 +msgid "Start only" +msgstr "" + +#: ../src/viktrwlayer_propwin.c:3322 +msgid "End only" +msgstr "" + +#: ../src/viktrwlayer_propwin.c:3323 +msgid "Start and End" +msgstr "" + +#: ../src/viktrwlayer_propwin.c:3324 +msgid "Centre, Start and End" +msgstr "" + +#: ../src/viktrwlayer_propwin.c:3336 +msgid "Maximum number of distance labels to be shown" +msgstr "" + +#: ../src/viktrwlayer_propwin.c:3340 +msgid "Properties" +msgstr "" + +#: ../src/viktrwlayer_propwin.c:3584 +#, c-format +msgid "%d minutes - %d minutes moving" +msgstr "" + +#: ../src/viktrwlayer_propwin.c:3596 +#, c-format +msgid "%s total - %s in segments" +msgstr "" + +#: ../src/viktrwlayer_propwin.c:3607 ../src/viktrwlayer_analysis.c:622 +msgid "Statistics" +msgstr "" + +#: ../src/viktrwlayer_propwin.c:3613 ../src/viktrwlayer_propwin.c:3680 +msgid "Show D_EM" +msgstr "" + +#: ../src/viktrwlayer_propwin.c:3615 ../src/viktrwlayer_propwin.c:3631 +#: ../src/viktrwlayer_propwin.c:3647 ../src/viktrwlayer_propwin.c:3697 +msgid "Show _GPS Speed" +msgstr "" + +#: ../src/viktrwlayer_propwin.c:3617 ../src/viktrwlayer_propwin.c:3633 +#: ../src/viktrwlayer_propwin.c:3665 ../src/viktrwlayer_propwin.c:3699 +msgid "Track Distance:" +msgstr "" + +#: ../src/viktrwlayer_propwin.c:3618 ../src/viktrwlayer_propwin.c:3684 +msgid "Track Height:" +msgstr "" + +#: ../src/viktrwlayer_propwin.c:3624 +msgid "Elevation-distance" +msgstr "" + +#: ../src/viktrwlayer_propwin.c:3634 +msgid "Track Gradient:" +msgstr "" + +#: ../src/viktrwlayer_propwin.c:3639 +msgid "Gradient-distance" +msgstr "" + +#: ../src/viktrwlayer_propwin.c:3649 ../src/viktrwlayer_propwin.c:3666 +#: ../src/viktrwlayer_propwin.c:3683 +msgid "Track Time:" +msgstr "" + +#: ../src/viktrwlayer_propwin.c:3650 ../src/viktrwlayer_propwin.c:3700 +msgid "Track Speed:" +msgstr "" + +#: ../src/viktrwlayer_propwin.c:3651 ../src/viktrwlayer_propwin.c:3667 +#: ../src/viktrwlayer_propwin.c:3685 +msgid "Time/Date:" +msgstr "" + +#: ../src/viktrwlayer_propwin.c:3655 +msgid "Speed-time" +msgstr "" + +#: ../src/viktrwlayer_propwin.c:3663 ../src/viktrwlayer_propwin.c:3679 +msgid "Show S_peed" +msgstr "" + +#: ../src/viktrwlayer_propwin.c:3671 +msgid "Distance-time" +msgstr "" + +#: ../src/viktrwlayer_propwin.c:3690 +msgid "Elevation-time" +msgstr "" + +#: ../src/viktrwlayer_propwin.c:3705 +msgid "Speed-distance" +msgstr "" + +#: ../src/viktrwlayer_tpwin.c:190 ../src/viktrwlayer_wpwin.c:66 +msgid "Date/Time Edit" +msgstr "" + +#: ../src/viktrwlayer_tpwin.c:242 +msgid "Name:" +msgstr "" + +#: ../src/viktrwlayer_tpwin.c:243 +msgid "Latitude:" +msgstr "" + +#: ../src/viktrwlayer_tpwin.c:244 +msgid "Longitude:" +msgstr "" + +#: ../src/viktrwlayer_tpwin.c:245 +msgid "Altitude:" +msgstr "" + +#: ../src/viktrwlayer_tpwin.c:246 +msgid "Course:" +msgstr "" + +#: ../src/viktrwlayer_tpwin.c:247 +msgid "Timestamp:" +msgstr "" + +#: ../src/viktrwlayer_tpwin.c:248 +msgid "Time:" +msgstr "" + +#: ../src/viktrwlayer_tpwin.c:249 +msgid "Distance Difference:" +msgstr "" + +#: ../src/viktrwlayer_tpwin.c:250 +msgid "Time Difference:" +msgstr "" + +#: ../src/viktrwlayer_tpwin.c:251 +msgid "\"Speed\" Between:" +msgstr "" + +#: ../src/viktrwlayer_tpwin.c:252 +msgid "Speed:" +msgstr "" + +#: ../src/viktrwlayer_tpwin.c:253 +msgid "VDOP:" +msgstr "" + +#: ../src/viktrwlayer_tpwin.c:254 +msgid "HDOP:" +msgstr "" + +#: ../src/viktrwlayer_tpwin.c:255 +msgid "PDOP:" +msgstr "" + +#: ../src/viktrwlayer_tpwin.c:256 +msgid "SAT/FIX:" +msgstr "" + +#: ../src/viktrwlayer_tpwin.c:263 ../src/viktrwlayer_tpwin.c:408 +#: ../src/viktrwlayer_tpwin.c:622 +msgid "Trackpoint" +msgstr "" + +#: ../src/viktrwlayer_tpwin.c:266 +msgid "_Insert After" +msgstr "" + +#: ../src/viktrwlayer_tpwin.c:268 +msgid "Split Here" +msgstr "" + +#: ../src/viktrwlayer_tracklist.c:262 ../src/viktrwlayer_waypointlist.c:306 +msgid "_Copy Data" +msgstr "" + +#. +#. item = gtk_image_menu_item_new_with_mnemonic ( _("_Select") ); +#. gtk_image_menu_item_set_image ( (GtkImageMenuItem*)item, gtk_image_new_from_stock (GTK_STOCK_FIND, GTK_ICON_SIZE_MENU) ); +#. g_signal_connect_swapped ( G_OBJECT(item), "activate", G_CALLBACK(trw_layer_track_select), values ); +#. gtk_menu_shell_append (GTK_MENU_SHELL (menu), item); +#. gtk_widget_show ( item ); +#. +#. ATM view auto selects, so don't bother with separate select menu entry +#. +#. item = gtk_image_menu_item_new_with_mnemonic ( _("_Select") ); +#. gtk_image_menu_item_set_image ( (GtkImageMenuItem*)item, gtk_image_new_from_stock (GTK_STOCK_FIND, GTK_ICON_SIZE_MENU) ); +#. g_signal_connect_swapped ( G_OBJECT(item), "activate", G_CALLBACK(trw_layer_waypoint_select), values ); +#. gtk_menu_shell_append (GTK_MENU_SHELL (menu), item); +#. gtk_widget_show ( item ); +#. +#. AUTO SELECT NOT TRUE YET... +#. ATM view auto selects, so don't bother with separate select menu entry +#: ../src/viktrwlayer_tracklist.c:290 ../src/viktrwlayer_waypointlist.c:341 +#: ../src/vikwindow.c:4816 +msgid "_View" +msgstr "" + +#. Insert column for the layer name when viewing multi layers +#: ../src/viktrwlayer_tracklist.c:613 ../src/viktrwlayer_waypointlist.c:609 +msgid "Layer" +msgstr "" + +#: ../src/viktrwlayer_tracklist.c:627 ../src/viktrwlayer_waypointlist.c:624 +msgid "Date" +msgstr "" + +#: ../src/viktrwlayer_tracklist.c:631 ../src/viktrwlayer_waypointlist.c:628 +msgid "Visible" +msgstr "" + +#: ../src/viktrwlayer_tracklist.c:639 +msgid "" +"Distance\n" +"(miles)" +msgstr "" + +#: ../src/viktrwlayer_tracklist.c:642 +msgid "" +"Distance\n" +"(NM)" +msgstr "" + +#: ../src/viktrwlayer_tracklist.c:645 +msgid "" +"Distance\n" +"(km)" +msgstr "" + +#: ../src/viktrwlayer_tracklist.c:651 +msgid "" +"Length\n" +"(minutes)" +msgstr "" + +#: ../src/viktrwlayer_tracklist.c:660 ../src/vikutils.c:93 +msgid "sec/mi" +msgstr "" + +#: ../src/viktrwlayer_tracklist.c:666 +#, c-format +msgid "" +"Av. Speed\n" +"(%s)" +msgstr "" + +#. Apply own formatting of the data +#: ../src/viktrwlayer_tracklist.c:671 +#, c-format +msgid "" +"Max Speed\n" +"(%s)" +msgstr "" + +#: ../src/viktrwlayer_tracklist.c:679 ../src/viktrwlayer_waypointlist.c:637 +msgid "" +"Max Height\n" +"(Feet)" +msgstr "" + +#: ../src/viktrwlayer_tracklist.c:681 ../src/viktrwlayer_waypointlist.c:639 +msgid "" +"Max Height\n" +"(Metres)" +msgstr "" + +#: ../src/viktrwlayer_waypointlist.c:312 +msgid "Copy Data (with _positions)" +msgstr "" + +#: ../src/viktrwlayer_waypointlist.c:633 +msgid "Comment" +msgstr "" + +#: ../src/viktrwlayer_waypointlist.c:643 +msgid "Symbol" +msgstr "" + +#: ../src/viktrwlayer_wpwin.c:93 ../src/viktrwlayer_wpwin.c:302 +msgid "True" +msgstr "" + +#: ../src/viktrwlayer_wpwin.c:122 +msgid "Waypoint Properties" +msgstr "" + +#: ../src/viktrwlayer_wpwin.c:164 +msgid "Name:" +msgstr "" + +#: ../src/viktrwlayer_wpwin.c:181 +msgid "Altitude:" +msgstr "" + +#: ../src/viktrwlayer_wpwin.c:186 ../src/viktrwlayer_wpwin.c:188 +msgid "Comment:" +msgstr "" + +#: ../src/viktrwlayer_wpwin.c:202 +msgid "Source:" +msgstr "" + +#: ../src/viktrwlayer_wpwin.c:212 +msgid "Image:" +msgstr "" + +#: ../src/viktrwlayer_wpwin.c:217 +msgid "Symbol:" +msgstr "" + +#: ../src/viktrwlayer_wpwin.c:226 +msgid "(none)" +msgstr "" + +#. Geotag Info [readonly] +#: ../src/viktrwlayer_wpwin.c:272 +msgid "Has Geotag" +msgstr "" + +#: ../src/viktrwlayer_wpwin.c:279 +msgid "Consistent Position" +msgstr "" + +#. ATM the direction value box is always shown, even when there is no information. +#. It would be nice to be able to hide it until the 'Add' has been performed, +#. however I've not been able to achieve this. +#. Thus simply sensistizing it instead. +#: ../src/viktrwlayer_wpwin.c:292 +msgid "Image Direction:" +msgstr "" + +#: ../src/viktrwlayer_wpwin.c:300 +msgid "Magnetic" +msgstr "" + +#: ../src/viktrwlayer_wpwin.c:320 +msgid "Time:" +msgstr "" + +#. TODO: other checks (isalpha or whatever ) +#: ../src/viktrwlayer_wpwin.c:386 +msgid "Please enter a name for the waypoint." +msgstr "" + +#: ../src/viktrwlayer_geotag.c:320 ../src/viktrwlayer_geotag.c:460 +#, c-format +msgid "Failed updating EXIF on %s" +msgstr "" + +#: ../src/viktrwlayer_geotag.c:562 +#, c-format +msgid "Geotagging %d Images..." +msgstr "" + +#: ../src/viktrwlayer_geotag.c:630 +msgid "Geotag Images" +msgstr "" + +#: ../src/viktrwlayer_geotag.c:640 +msgid "Images" +msgstr "" + +#: ../src/viktrwlayer_geotag.c:645 +msgid "Overwrite Existing Waypoints:" +msgstr "" + +#: ../src/viktrwlayer_geotag.c:648 +msgid "Overwrite Existing GPS Information:" +msgstr "" + +#: ../src/viktrwlayer_geotag.c:650 +msgid "Keep File Modification Timestamp:" +msgstr "" + +#: ../src/viktrwlayer_geotag.c:684 +msgid "Create Waypoints:" +msgstr "" + +#: ../src/viktrwlayer_geotag.c:693 +msgid "Write EXIF:" +msgstr "" + +#: ../src/viktrwlayer_geotag.c:705 +msgid "Automatic Image Direction:" +msgstr "" + +#: ../src/viktrwlayer_geotag.c:707 +msgid "Set image direction based on a heading derived from the track" +msgstr "" + +#: ../src/viktrwlayer_geotag.c:710 +msgid "Interpolate Between Track Segments:" +msgstr "" + +#: ../src/viktrwlayer_geotag.c:715 +msgid "Image Time Offset (Seconds):" +msgstr "" + +#: ../src/viktrwlayer_geotag.c:718 +msgid "" +"The number of seconds to ADD to the photos time to make it match the GPS " +"data. Calculate this with (GPS - Photo). Can be negative or positive. Useful " +"to adjust times when a camera's timestamp was incorrect." +msgstr "" + +#: ../src/viktrwlayer_geotag.c:721 +msgid "Image Timezone:" +msgstr "" + +#: ../src/viktrwlayer_geotag.c:724 +msgid "" +"The timezone that was used when the images were created. For example, if a " +"camera is set to AWST or +8:00 hours. Enter +8:00 here so that the correct " +"adjustment to the images' time can be made. GPS data is always in UTC." +msgstr "" + +#: ../src/viktrwlayer_geotag.c:728 +#, c-format +msgid "Using waypoint: %s" +msgstr "" + +#: ../src/viktrwlayer_geotag.c:742 +#, c-format +msgid "Using track: %s" +msgstr "" + +#: ../src/viktrwlayer_geotag.c:744 +#, c-format +msgid "Using all tracks in: %s" +msgstr "" + +#: ../src/viktrwlayer_analysis.c:214 +msgid "Number of Tracks" +msgstr "" + +#: ../src/viktrwlayer_analysis.c:215 +msgid "Date Range" +msgstr "" + +#: ../src/viktrwlayer_analysis.c:216 +msgid "Total Length" +msgstr "" + +#: ../src/viktrwlayer_analysis.c:217 +msgid "Average Length" +msgstr "" + +#: ../src/viktrwlayer_analysis.c:218 +msgid "Eddington number" +msgstr "" + +#. No.4: Extended display only +#: ../src/viktrwlayer_analysis.c:219 +msgid "Max Speed" +msgstr "" + +#: ../src/viktrwlayer_analysis.c:220 +msgid "Avg. Speed" +msgstr "" + +#: ../src/viktrwlayer_analysis.c:221 +msgid "Minimum Altitude" +msgstr "" + +#: ../src/viktrwlayer_analysis.c:222 +msgid "Maximum Altitude" +msgstr "" + +#: ../src/viktrwlayer_analysis.c:223 +msgid "Total Elevation Gain/Loss" +msgstr "" + +#: ../src/viktrwlayer_analysis.c:224 +msgid "Avg. Elevation Gain/Loss" +msgstr "" + +#: ../src/viktrwlayer_analysis.c:225 +msgid "Total Duration" +msgstr "" + +#: ../src/viktrwlayer_analysis.c:226 +msgid "Avg. Duration" +msgstr "" + +#: ../src/viktrwlayer_analysis.c:317 +#, c-format +msgid "%.2f miles" +msgstr "" + +#: ../src/viktrwlayer_analysis.c:320 +#, c-format +msgid "%.2f NM" +msgstr "" + +#. VIK_UNITS_DISTANCE_KILOMETRES +#: ../src/viktrwlayer_analysis.c:324 +#, c-format +msgid "%.2f km" +msgstr "" + +#: ../src/viktrwlayer_analysis.c:361 +#, c-format +msgid "%.2f m/s" +msgstr "" + +#: ../src/viktrwlayer_analysis.c:370 ../src/viktrwlayer_analysis.c:373 +#, c-format +msgid "%.2f knots" +msgstr "" + +#: ../src/viktrwlayer_analysis.c:379 ../src/viktrwlayer_analysis.c:382 +#, c-format +msgid "%d s/km" +msgstr "" + +#: ../src/viktrwlayer_analysis.c:399 ../src/viktrwlayer_analysis.c:402 +#, c-format +msgid "%d sec/mi" +msgstr "" + +#: ../src/viktrwlayer_analysis.c:420 ../src/viktrwlayer_analysis.c:423 +#, c-format +msgid "%.2f km/h" +msgstr "" + +#: ../src/viktrwlayer_analysis.c:434 ../src/viktrwlayer_analysis.c:440 +#, c-format +msgid "%d feet" +msgstr "" + +#: ../src/viktrwlayer_analysis.c:445 ../src/viktrwlayer_analysis.c:447 +#, c-format +msgid "%d feet / %d feet" +msgstr "" + +#: ../src/viktrwlayer_analysis.c:452 ../src/viktrwlayer_analysis.c:458 +#, c-format +msgid "%d m" +msgstr "" + +#: ../src/viktrwlayer_analysis.c:463 ../src/viktrwlayer_analysis.c:465 +#, c-format +msgid "%d m / %d m" +msgstr "" + +#: ../src/viktrwlayer_analysis.c:477 +#, c-format +msgid "%d:%02d:%02d days:hrs:mins" +msgstr "" + +#: ../src/viktrwlayer_analysis.c:484 +#, c-format +msgid "%d:%02d hrs:mins" +msgstr "" + +#: ../src/viktrwlayer_analysis.c:658 +msgid "Include Invisible Items" +msgstr "" + +#: ../src/vikstatus.c:129 +msgid "Current number of background tasks. Click to see the background jobs." +msgstr "" + +#: ../src/vikstatus.c:134 +msgid "Current zoom level. Click to select a new one." +msgstr "" + +#: ../src/vikstatus.c:141 +msgid "Left click to clear the message. Right click to copy the message." +msgstr "" + +#: ../src/vikutils.c:108 +msgid "GPSD" +msgstr "" + +#. GPS Preamble +#: ../src/vikutils.c:109 +msgid "Trkpt" +msgstr "" + +#: ../src/vikutils.c:160 +#, c-format +msgid "%sSpeed%s %.1f%s" +msgstr "" + +#. Go for 2dp as expect low values for vertical speeds +#: ../src/vikutils.c:214 +#, c-format +msgid "%sClimb%s %.2f%s" +msgstr "" + +#: ../src/vikutils.c:223 +#, c-format +msgid "%sAlt %dfeet" +msgstr "" + +#. VIK_UNITS_HEIGHT_METRES: +#: ../src/vikutils.c:227 +#, c-format +msgid "%sAlt %dm" +msgstr "" + +#: ../src/vikutils.c:235 +#, c-format +msgid "%sCourse %03d°" +msgstr "" + +#: ../src/vikutils.c:249 +msgid "yards" +msgstr "" + +#. VIK_UNITS_DISTANCE_KILOMETRES: +#: ../src/vikutils.c:253 +msgid "m" +msgstr "" + +#: ../src/vikutils.c:257 +#, c-format +msgid "%sDistance diff %d%s" +msgstr "" + +#: ../src/vikutils.c:272 +#, c-format +msgid "%sTime %s" +msgstr "" + +#: ../src/vikutils.c:281 +#, c-format +msgid "%sTime diff %lds" +msgstr "" + +#: ../src/vikutils.c:287 +#, c-format +msgid "%sNo. of Sats %d" +msgstr "" + +#: ../src/vikutils.c:312 +#, c-format +msgid "%sTo End %.2f%s" +msgstr "" + +#: ../src/vikutils.c:339 +#, c-format +msgid "%sDistance along %.2f%s" +msgstr "" + +#: ../src/vikutils.c:359 +#, c-format +msgid "%sTrack: %s" +msgstr "" + +#: ../src/vikutils.c:396 +#, c-format +msgid "" +"There is a newer version of Viking available: %s\n" +"\n" +"Do you wish to go to Viking's website now?" +msgstr "" + +#: ../src/vikutils.c:526 +msgid "" +"This appears to be Viking's very first run.\n" +"\n" +"Do you wish to enable automatic internet features?\n" +"\n" +"Individual settings can be controlled in the Preferences." +msgstr "" + +#: ../src/vikwaypoint.c:37 +msgid "Waypoint" +msgstr "" + +#: ../src/vikwebtool_datasource.c:352 +msgid "Search Term" +msgstr "" + +#. TODO get rid of this as this is unnecessary duplication... +#: ../src/vikwindow.c:258 +msgid "Pan" +msgstr "" + +#: ../src/vikwindow.c:258 +msgid "Zoom" +msgstr "" + +#: ../src/vikwindow.c:258 +msgid "Ruler" +msgstr "" + +#: ../src/vikwindow.c:258 +msgid "Select" +msgstr "" + +#: ../src/vikwindow.c:368 +msgid "This is Viking " +msgstr "" + +#: ../src/vikwindow.c:457 +msgid "Location lookup aborted" +msgstr "" + +#: ../src/vikwindow.c:477 +#, c-format +msgid "Location found: %s" +msgstr "" + +#: ../src/vikwindow.c:486 +msgid "Unable to determine location" +msgstr "" + +#: ../src/vikwindow.c:495 +msgid "Determining location" +msgstr "" + +#: ../src/vikwindow.c:525 +#, c-format +msgid "Location found via geoclue" +msgstr "" + +#: ../src/vikwindow.c:546 +msgid "Default Map" +msgstr "" + +#: ../src/vikwindow.c:557 ../src/vikwindow.c:3938 +msgid "Trying to determine location..." +msgstr "" + +#. Create tooltip +#: ../src/vikwindow.c:723 +msgid "Select zoom level" +msgstr "" + +#: ../src/vikwindow.c:1176 +#, c-format +msgid "" +"Do you want to save the changes you made to the document \"%s\"?\n" +"\n" +"Your changes will be lost if you don't save them." +msgstr "" + +#: ../src/vikwindow.c:1180 +msgid "Don't Save" +msgstr "" + +#: ../src/vikwindow.c:1268 +msgid "mpp" +msgstr "" + +#: ../src/vikwindow.c:1268 +msgid "pixelfact" +msgstr "" + +#: ../src/vikwindow.c:1467 +#, c-format +msgid "%s %s %dm" +msgstr "" + +#: ../src/vikwindow.c:1469 +#, c-format +msgid "%s %s %dft" +msgstr "" + +#: ../src/vikwindow.c:1472 +#, c-format +msgid "%s %s" +msgstr "" + +#: ../src/vikwindow.c:1929 +msgid "_Ruler" +msgstr "" + +#: ../src/vikwindow.c:1929 +msgid "Ruler Tool" +msgstr "" + +#: ../src/vikwindow.c:2204 ../src/vikwindow.c:4818 +msgid "_Zoom" +msgstr "" + +#: ../src/vikwindow.c:2204 +msgid "Zoom Tool" +msgstr "" + +#: ../src/vikwindow.c:2271 ../src/vikwindow.c:4819 +msgid "_Pan" +msgstr "" + +#: ../src/vikwindow.c:2271 +msgid "Pan Tool" +msgstr "" + +#: ../src/vikwindow.c:2425 +msgid "_Select" +msgstr "" + +#: ../src/vikwindow.c:2425 +msgid "Select Tool" +msgstr "" + +#: ../src/vikwindow.c:2615 +msgid "You must select a layer to show its properties." +msgstr "" + +#. No error to show, so unlikely this will get called +#: ../src/vikwindow.c:2629 +msgid "The help system is not available." +msgstr "" + +#. Main error path +#: ../src/vikwindow.c:2632 +#, c-format +msgid "" +"Help is not available because: %s.\n" +"Ensure a Mime Type ghelp handler program is installed (e.g. yelp)." +msgstr "" + +#: ../src/vikwindow.c:2865 +msgid "You must select a layer to delete." +msgstr "" + +#: ../src/vikwindow.c:3171 +msgid "Untitled" +msgstr "" + +#: ../src/vikwindow.c:3300 +#, c-format +msgid "Unable to add '%s' to the list of recently used documents" +msgstr "" + +#: ../src/vikwindow.c:3391 +msgid "The file you requested could not be opened." +msgstr "" + +#: ../src/vikwindow.c:3394 +msgid "" +"GPSBabel is required to load files of this type or GPSBabel encountered " +"problems." +msgstr "" + +#: ../src/vikwindow.c:3397 +#, c-format +msgid "Unable to load malformed GPX file %s" +msgstr "" + +#: ../src/vikwindow.c:3400 +#, c-format +msgid "Unsupported file type for %s" +msgstr "" + +#. Since we can process .vik files with issues just show a warning in the status bar +#. Not that a user can do much about it... or tells them what this issue is yet... +#: ../src/vikwindow.c:3406 +#, c-format +msgid "WARNING: issues encountered loading %s" +msgstr "" + +#: ../src/vikwindow.c:3489 +msgid "Please select a GPS data file to open. " +msgstr "" + +#: ../src/vikwindow.c:3508 +msgid "Google Earth" +msgstr "" + +#: ../src/vikwindow.c:3523 ../src/vikwindow.c:3646 ../src/viking.desktop.in.h:1 +msgid "Viking" +msgstr "" + +#: ../src/vikwindow.c:3594 ../src/vikwindow.c:4632 +msgid "Open File" +msgstr "" + +#: ../src/vikwindow.c:3630 +msgid "Save as Viking File." +msgstr "" + +#: ../src/vikwindow.c:3757 +#, c-format +msgid "Exporting to file: %s" +msgstr "" + +#. Confirm what happened. +#: ../src/vikwindow.c:3774 +#, c-format +msgid "Exported files: %d" +msgstr "" + +#: ../src/vikwindow.c:3786 +msgid "Nothing to Export!" +msgstr "" + +#: ../src/vikwindow.c:3790 +msgid "Export to directory" +msgstr "" + +#: ../src/vikwindow.c:3809 +msgid "Could not convert all files" +msgstr "" + +#: ../src/vikwindow.c:3851 +msgid "File not accessible" +msgstr "" + +#: ../src/vikwindow.c:3854 +msgid "No Viking File" +msgstr "" + +#: ../src/vikwindow.c:3998 +msgid "This layer has no configurable properties." +msgstr "" + +#: ../src/vikwindow.c:4080 +msgid "Are you sure you wish to delete all layers?" +msgstr "" + +#. Try harder... +#: ../src/vikwindow.c:4126 ../src/vikwindow.c:4132 +msgid "Generating image file..." +msgstr "" + +#: ../src/vikwindow.c:4154 +msgid "" +"Failed to generate internal image.\n" +"\n" +"Try creating a smaller image." +msgstr "" + +#: ../src/vikwindow.c:4175 +msgid "Image file generated." +msgstr "" + +#: ../src/vikwindow.c:4177 +msgid "Failed to generate image file." +msgstr "" + +#: ../src/vikwindow.c:4246 +#, c-format +msgid "Unable to write to file %s: %s" +msgstr "" + +#: ../src/vikwindow.c:4284 +msgid "" +"Viewable region outside allowable pixel size bounds for image. Clipping " +"width/height values." +msgstr "" + +#: ../src/vikwindow.c:4309 +#, c-format +msgid "Total area: %ldm x %ldm (%.3f sq. km)" +msgstr "" + +#: ../src/vikwindow.c:4312 +#, c-format +msgid "Total area: %ldm x %ldm (%.3f sq. miles)" +msgstr "" + +#: ../src/vikwindow.c:4315 +#, c-format +msgid "Total area: %ldm x %ldm (%.3f sq. NM)" +msgstr "" + +#. Single file +#: ../src/vikwindow.c:4343 +msgid "Save Image" +msgstr "" + +#: ../src/vikwindow.c:4364 ../src/vikwindow.c:4641 +msgid "KMZ" +msgstr "" + +#: ../src/vikwindow.c:4417 +msgid "You must be in UTM mode to use this feature" +msgstr "" + +#: ../src/vikwindow.c:4421 +msgid "Choose a directory to hold images" +msgstr "" + +#. todo: default for answers inside VikWindow or static (thruout instance) +#: ../src/vikwindow.c:4441 +msgid "Save to Image File" +msgstr "" + +#: ../src/vikwindow.c:4457 +msgid "Width (pixels):" +msgstr "" + +#: ../src/vikwindow.c:4459 +msgid "Height (pixels):" +msgstr "" + +#: ../src/vikwindow.c:4462 +msgid "" +"WARNING: USING LARGE IMAGES OVER 10000x10000\n" +"MAY CRASH THE PROGRAM!" +msgstr "" + +#: ../src/vikwindow.c:4464 +msgid "Zoom (meters per pixel):" +msgstr "" + +#: ../src/vikwindow.c:4480 +msgid "Area in current viewable window" +msgstr "" + +#: ../src/vikwindow.c:4490 +msgid "Save as PNG" +msgstr "" + +#: ../src/vikwindow.c:4491 +msgid "Save as JPEG" +msgstr "" + +#: ../src/vikwindow.c:4520 +msgid "East-west image tiles:" +msgstr "" + +#: ../src/vikwindow.c:4522 +msgid "North-south image tiles:" +msgstr "" + +#: ../src/vikwindow.c:4619 +msgid "This feature is not available in UTM mode" +msgstr "" + +#: ../src/vikwindow.c:4658 +#, c-format +msgid "Unable to import %s." +msgstr "" + +#: ../src/vikwindow.c:4749 +msgid "Choose a background color" +msgstr "" + +#: ../src/vikwindow.c:4765 +msgid "Choose a track highlight color" +msgstr "" + +#: ../src/vikwindow.c:4814 +msgid "_File" +msgstr "" + +#: ../src/vikwindow.c:4815 +msgid "_Edit" +msgstr "" + +#: ../src/vikwindow.c:4817 +msgid "_Show" +msgstr "" + +#: ../src/vikwindow.c:4820 +msgid "_Layers" +msgstr "" + +#: ../src/vikwindow.c:4821 +msgid "_Tools" +msgstr "" + +#: ../src/vikwindow.c:4822 +msgid "_Webtools" +msgstr "" + +#: ../src/vikwindow.c:4823 ../src/vikwindow.c:4893 +msgid "_Help" +msgstr "" + +#: ../src/vikwindow.c:4825 +msgid "New file" +msgstr "" + +#: ../src/vikwindow.c:4826 +msgid "_Open..." +msgstr "" + +#: ../src/vikwindow.c:4826 +msgid "Open a file" +msgstr "" + +#: ../src/vikwindow.c:4827 +msgid "Open _Recent File" +msgstr "" + +#: ../src/vikwindow.c:4828 +msgid "Append _File..." +msgstr "" + +#: ../src/vikwindow.c:4828 +msgid "Append data from a different file" +msgstr "" + +#: ../src/vikwindow.c:4829 +msgid "Open GPX as External _Layer..." +msgstr "" + +#: ../src/vikwindow.c:4829 +msgid "Open a GPX file as an external layer" +msgstr "" + +#: ../src/vikwindow.c:4830 +msgid "_Export All" +msgstr "" + +#: ../src/vikwindow.c:4830 +msgid "Export All TrackWaypoint Layers" +msgstr "" + +#: ../src/vikwindow.c:4831 +msgid "_GPX..." +msgstr "" + +#: ../src/vikwindow.c:4831 +msgid "Export as GPX" +msgstr "" + +#: ../src/vikwindow.c:4832 +msgid "A_cquire" +msgstr "" + +#: ../src/vikwindow.c:4833 +msgid "_Directions..." +msgstr "" + +#: ../src/vikwindow.c:4833 +msgid "Get driving directions" +msgstr "" + +#: ../src/vikwindow.c:4835 +msgid "_OSM Traces..." +msgstr "" + +#: ../src/vikwindow.c:4835 +msgid "Get traces from OpenStreetMap" +msgstr "" + +#: ../src/vikwindow.c:4836 +msgid "_My OSM Traces..." +msgstr "" + +#: ../src/vikwindow.c:4836 +msgid "Get Your Own Traces from OpenStreetMap" +msgstr "" + +#: ../src/vikwindow.c:4839 +msgid "Geo_caches..." +msgstr "" + +#: ../src/vikwindow.c:4839 +msgid "Get Geocaches from geocaching.com" +msgstr "" + +#: ../src/vikwindow.c:4842 +msgid "Create waypoints from geotagged images" +msgstr "" + +#: ../src/vikwindow.c:4844 +msgid "Get a file from a URL" +msgstr "" + +#: ../src/vikwindow.c:4846 +msgid "Create waypoints from Wikipedia items in the current view" +msgstr "" + +#: ../src/vikwindow.c:4848 +msgid "_Save" +msgstr "" + +#: ../src/vikwindow.c:4848 +msgid "Save the file" +msgstr "" + +#: ../src/vikwindow.c:4849 +msgid "Save _As..." +msgstr "" + +#: ../src/vikwindow.c:4849 +msgid "Save the file under different name" +msgstr "" + +#: ../src/vikwindow.c:4850 +msgid "Properties..." +msgstr "" + +#: ../src/vikwindow.c:4850 +msgid "File Properties" +msgstr "" + +#: ../src/vikwindow.c:4852 +msgid "Import KMZ _Map File..." +msgstr "" + +#: ../src/vikwindow.c:4852 +msgid "Import a KMZ file" +msgstr "" + +#: ../src/vikwindow.c:4853 +msgid "Generate _KMZ Map File..." +msgstr "" + +#: ../src/vikwindow.c:4853 +msgid "Generate a KMZ file with an overlay of the current view" +msgstr "" + +#: ../src/vikwindow.c:4855 +msgid "_Generate Image File..." +msgstr "" + +#: ../src/vikwindow.c:4855 +msgid "Save a snapshot of the workspace into a file" +msgstr "" + +#: ../src/vikwindow.c:4856 +msgid "Generate _Directory of Images..." +msgstr "" + +#: ../src/vikwindow.c:4856 +msgid "Generate _Directory of Images" +msgstr "" + +#: ../src/vikwindow.c:4857 +msgid "_Print..." +msgstr "" + +#: ../src/vikwindow.c:4857 +msgid "Print maps" +msgstr "" + +#: ../src/vikwindow.c:4858 +msgid "E_xit" +msgstr "" + +#: ../src/vikwindow.c:4858 +msgid "Exit the program" +msgstr "" + +#: ../src/vikwindow.c:4859 +msgid "Save and Exit" +msgstr "" + +#: ../src/vikwindow.c:4859 +msgid "Save and Exit the program" +msgstr "" + +#: ../src/vikwindow.c:4861 +msgid "Go to the Pre_vious Location" +msgstr "" + +#: ../src/vikwindow.c:4861 +msgid "Go to the previous location" +msgstr "" + +#: ../src/vikwindow.c:4862 +msgid "Go to the _Next Location" +msgstr "" + +#: ../src/vikwindow.c:4862 +msgid "Go to the next location" +msgstr "" + +#: ../src/vikwindow.c:4863 +msgid "Go to the _Default Location" +msgstr "" + +#: ../src/vikwindow.c:4863 +msgid "Go to the default location" +msgstr "" + +#: ../src/vikwindow.c:4864 +msgid "Go to the _Auto Location" +msgstr "" + +#: ../src/vikwindow.c:4864 +msgid "Go to a location via automatic lookup" +msgstr "" + +#: ../src/vikwindow.c:4865 +msgid "Go to _Location..." +msgstr "" + +#: ../src/vikwindow.c:4865 +msgid "Go to address/place using text search" +msgstr "" + +#: ../src/vikwindow.c:4866 +msgid "_Go to Lat/Lon..." +msgstr "" + +#: ../src/vikwindow.c:4866 +msgid "Go to arbitrary lat/lon coordinate" +msgstr "" + +#: ../src/vikwindow.c:4867 +msgid "Go to UTM..." +msgstr "" + +#: ../src/vikwindow.c:4867 +msgid "Go to arbitrary UTM coordinate" +msgstr "" + +#: ../src/vikwindow.c:4868 +msgid "Go to Today" +msgstr "" + +#: ../src/vikwindow.c:4868 +msgid "Go to today on the calendar" +msgstr "" + +#: ../src/vikwindow.c:4869 +msgid "_Refresh" +msgstr "" + +#: ../src/vikwindow.c:4869 +msgid "Refresh any maps displayed" +msgstr "" + +#: ../src/vikwindow.c:4870 +msgid "Set _Highlight Color..." +msgstr "" + +#: ../src/vikwindow.c:4870 +msgid "Set Highlight Color" +msgstr "" + +#: ../src/vikwindow.c:4871 +msgid "Set Bac_kground Color..." +msgstr "" + +#: ../src/vikwindow.c:4871 +msgid "Set Background Color" +msgstr "" + +#: ../src/vikwindow.c:4872 +msgid "Zoom _In" +msgstr "" + +#: ../src/vikwindow.c:4872 +msgid "Zoom In" +msgstr "" + +#: ../src/vikwindow.c:4873 +msgid "Zoom _Out" +msgstr "" + +#: ../src/vikwindow.c:4873 +msgid "Zoom Out" +msgstr "" + +#: ../src/vikwindow.c:4874 +msgid "Zoom _To..." +msgstr "" + +#: ../src/vikwindow.c:4874 +msgid "Zoom To" +msgstr "" + +#: ../src/vikwindow.c:4875 +msgid "Pan _North" +msgstr "" + +#: ../src/vikwindow.c:4876 +msgid "Pan _East" +msgstr "" + +#: ../src/vikwindow.c:4877 +msgid "Pan _South" +msgstr "" + +#: ../src/vikwindow.c:4878 +msgid "Pan _West" +msgstr "" + +#: ../src/vikwindow.c:4879 +msgid "Background _Jobs" +msgstr "" + +#: ../src/vikwindow.c:4879 +msgid "Background Jobs" +msgstr "" + +#: ../src/vikwindow.c:4881 +msgid "Cu_t" +msgstr "" + +#: ../src/vikwindow.c:4885 +msgid "Delete All" +msgstr "" + +#: ../src/vikwindow.c:4886 +msgid "Copy Centre _Location" +msgstr "" + +#: ../src/vikwindow.c:4887 +msgid "_Flush Map Cache" +msgstr "" + +#: ../src/vikwindow.c:4888 +msgid "_Set the Default Location" +msgstr "" + +#: ../src/vikwindow.c:4888 +msgid "Set the Default Location to the current position" +msgstr "" + +#: ../src/vikwindow.c:4889 +msgid "_Preferences" +msgstr "" + +#: ../src/vikwindow.c:4889 +msgid "Program Preferences" +msgstr "" + +#: ../src/vikwindow.c:4890 +msgid "_Layer Defaults" +msgstr "" + +#: ../src/vikwindow.c:4891 +msgid "_Properties" +msgstr "" + +#: ../src/vikwindow.c:4893 +msgid "Help" +msgstr "" + +#: ../src/vikwindow.c:4894 +msgid "_About" +msgstr "" + +#: ../src/vikwindow.c:4894 +msgid "About" +msgstr "" + +#: ../src/vikwindow.c:4903 +msgid "_KML..." +msgstr "" + +#: ../src/vikwindow.c:4903 +msgid "Export as KML" +msgstr "" + +#: ../src/vikwindow.c:4904 +msgid "Transfer data from a GPS device" +msgstr "" + +#: ../src/vikwindow.c:4905 +msgid "Import file via GPSBabel converter" +msgstr "" + +#: ../src/vikwindow.c:4909 +msgid "Import Geo_JSON File..." +msgstr "" + +#: ../src/vikwindow.c:4909 +msgid "Import GeoJSON file" +msgstr "" + +#: ../src/vikwindow.c:4914 +msgid "_UTM Mode" +msgstr "" + +#: ../src/vikwindow.c:4915 +msgid "_Expedia Mode" +msgstr "" + +#: ../src/vikwindow.c:4916 +msgid "_Mercator Mode" +msgstr "" + +#: ../src/vikwindow.c:4917 +msgid "Lat_/Lon Mode" +msgstr "" + +#: ../src/vikwindow.c:4921 +msgid "Show _Scale" +msgstr "" + +#: ../src/vikwindow.c:4921 +msgid "Show Scale" +msgstr "" + +#: ../src/vikwindow.c:4922 +msgid "Show _Center Mark" +msgstr "" + +#: ../src/vikwindow.c:4922 +msgid "Show Center Mark" +msgstr "" + +#: ../src/vikwindow.c:4923 +msgid "Show _Highlight" +msgstr "" + +#: ../src/vikwindow.c:4923 +msgid "Show Highlight" +msgstr "" + +#: ../src/vikwindow.c:4924 +msgid "_Full Screen" +msgstr "" + +#: ../src/vikwindow.c:4924 +msgid "Activate full screen mode" +msgstr "" + +#: ../src/vikwindow.c:4925 +msgid "Show Side _Panel" +msgstr "" + +#: ../src/vikwindow.c:4925 +msgid "Show Side Panel" +msgstr "" + +#: ../src/vikwindow.c:4926 +msgid "Show Status_bar" +msgstr "" + +#: ../src/vikwindow.c:4926 +msgid "Show Statusbar" +msgstr "" + +#: ../src/vikwindow.c:4927 +msgid "Show _Toolbar" +msgstr "" + +#: ../src/vikwindow.c:4927 +msgid "Show Toolbar" +msgstr "" + +#: ../src/vikwindow.c:4928 +msgid "Show _Menu" +msgstr "" + +#: ../src/vikwindow.c:4928 +msgid "Show Menu" +msgstr "" + +#: ../src/vikwindow.c:4929 +msgid "Show Side Panel B_uttons" +msgstr "" + +#: ../src/vikwindow.c:4929 +msgid "Show Side Panel Buttons" +msgstr "" + +#: ../src/vikwindow.c:4930 +msgid "Show Side Panel Ca_lendar" +msgstr "" + +#: ../src/vikwindow.c:4930 +msgid "Show Side Panel Calendar" +msgstr "" + +#: ../src/vikwindow.c:5064 +#, c-format +msgid "New _%s Layer" +msgstr "" + +#: ../src/vikwindow.c:5114 +msgid "..." +msgstr "" + +#: ../src/viking.desktop.in.h:2 +msgid "GPS Data Manager" +msgstr "" + +#: ../src/viking.desktop.in.h:3 +msgid "Map Based GPS Data Manager (live data capable)." +msgstr "" + +#: ../src/libjpeg/jpeg-data.c:205 +msgid "Data does not follow JPEG specification." +msgstr "" + +#: ../src/libjpeg/jpeg-data.c:302 +#, c-format +msgid "Path '%s' invalid." +msgstr "" + +#: ../src/libjpeg/jpeg-data.c:320 +#, c-format +msgid "Could not read '%s'." +msgstr "" diff --git a/po/nb.po b/po/nb.po new file mode 100644 index 0000000..2c4aed6 --- /dev/null +++ b/po/nb.po @@ -0,0 +1,6091 @@ +# Norwegian Bokmal translation for viking +# Copyright (c) 2008 Rosetta Contributors and Canonical Ltd 2008 +# This file is distributed under the same license as the viking package. +# FIRST AUTHOR , 2008. +# +msgid "" +msgstr "" +"Project-Id-Version: viking\n" +"Report-Msgid-Bugs-To: \n" +"POT-Creation-Date: 2019-01-19 12:53+0000\n" +"PO-Revision-Date: 2010-11-17 23:08+0000\n" +"Last-Translator: Guilhem Bonnefille \n" +"Language-Team: Norwegian Bokmal \n" +"Language: nb\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-Launchpad-Export-Date: 2018-12-21 17:32+0000\n" +"X-Generator: Launchpad (build 18847)\n" + +#: ../src/acquire.c:106 ../src/vikgpslayer.c:1367 +msgid "Done." +msgstr "Ferdig." + +#: ../src/acquire.c:115 +msgid "No data." +msgstr "" + +#: ../src/acquire.c:167 ../src/acquire.c:415 +msgid "Error: acquisition failed." +msgstr "" + +#: ../src/acquire.c:339 +msgid "Working..." +msgstr "Arbeider..." + +#. This shouldn't happen... +#: ../src/acquire.c:406 +msgid "" +"Unable to create command\n" +"Acquire method failed." +msgstr "" + +#: ../src/acquire.c:513 +msgid "_Filter" +msgstr "" + +#: ../src/acquire.c:528 +#, c-format +msgid "Filter with %s" +msgstr "" + +#: ../src/acquire.c:545 +msgid "Filter" +msgstr "" + +#: ../src/babel.c:640 +msgid "GPSBabel:" +msgstr "" + +#: ../src/babel.c:641 +msgid "" +"Allow setting the specific instance of GPSBabel. You must restart Viking for " +"this value to take effect." +msgstr "" + +#: ../src/babel_ui.c:79 +msgid "Select a file format" +msgstr "" + +#: ../src/babel_ui.c:144 ../src/viktrwlayer.c:531 ../src/viktrwlayer.c:2882 +msgid "Tracks" +msgstr "" + +#: ../src/babel_ui.c:149 ../src/viktrwlayer.c:2892 +msgid "Routes" +msgstr "" + +#. ***** PARAMETERS ***** +#: ../src/babel_ui.c:154 ../src/viktrwlayer.c:531 ../src/viktrwlayer.c:2887 +msgid "Waypoints" +msgstr "" + +#: ../src/background.c:64 +#, c-format +msgid "%d items" +msgstr "" + +#: ../src/background.c:287 +msgid "Threads:" +msgstr "" + +#: ../src/background.c:288 +msgid "" +"Number of threads to use for Mapnik tasks. You need to restart Viking for a " +"change to this value to be used" +msgstr "" + +#: ../src/background.c:361 +msgid "Job" +msgstr "Jobb" + +#: ../src/background.c:365 +msgid "Progress" +msgstr "Fremdrift" + +#: ../src/background.c:373 +msgid "Viking Background Jobs" +msgstr "" + +#: ../src/bing.c:42 +msgid "Bing Aerial" +msgstr "" + +#: ../src/bing.c:48 +msgid "Bing" +msgstr "" + +#. VIK_GTK_WINDOW_FROM_WIDGET(vp) +#: ../src/bingmapsource.c:514 +msgid "Bing attribution Loading" +msgstr "" + +#: ../src/clipboard.c:95 +msgid "paste failed" +msgstr "lim inn mislykktes" + +#: ../src/clipboard.c:105 +msgid "wrong clipboard data size" +msgstr "" + +#: ../src/clipboard.c:124 +#, c-format +msgid "" +"The clipboard contains sublayer data for %s layers. You must select a layer " +"of this type to paste the clipboard data." +msgstr "" + +#: ../src/clipboard.c:264 +msgid "" +"In order to paste a waypoint, please select an appropriate layer to paste " +"into." +msgstr "" + +#: ../src/dialog.c:60 +msgid "Go to Lat/Lon" +msgstr "" + +#: ../src/dialog.c:69 ../src/viktrwlayer_wpwin.c:173 +msgid "Latitude:" +msgstr "Breddegrad:" + +#: ../src/dialog.c:72 ../src/viktrwlayer_wpwin.c:177 +msgid "Longitude:" +msgstr "Lengdegrad:" + +#: ../src/dialog.c:102 +msgid "Go to UTM" +msgstr "" + +#: ../src/dialog.c:114 +msgid "Northing:" +msgstr "" + +#: ../src/dialog.c:117 +msgid "Easting:" +msgstr "" + +#: ../src/dialog.c:121 ../src/vikgeoreflayer.c:902 +msgid "Zone:" +msgstr "Sone:" + +#: ../src/dialog.c:124 ../src/vikgeoreflayer.c:904 +msgid "Letter:" +msgstr "" + +#: ../src/dialog.c:246 ../src/geonamessearch.c:238 +#: ../src/datasource_osm_my_traces.c:505 +msgid "Nothing was selected" +msgstr "" + +#: ../src/dialog.c:254 +msgid "Add Route" +msgstr "" + +#: ../src/dialog.c:254 +msgid "Add Track" +msgstr "Legg til spor" + +#: ../src/dialog.c:262 +msgid "Route Name:" +msgstr "" + +#: ../src/dialog.c:262 +msgid "Track Name:" +msgstr "Spornavn:" + +#: ../src/dialog.c:282 +msgid "Please enter a name for the track." +msgstr "Vennligst skriv inn et navn for sporet" + +#: ../src/dialog.c:311 +msgid "Today" +msgstr "" + +#: ../src/dialog.c:393 +msgid "Zoom Factors..." +msgstr "" + +#: ../src/dialog.c:407 +msgid "Zoom factor (in meters per pixel):" +msgstr "" + +#: ../src/dialog.c:408 +msgid "X (easting): " +msgstr "" + +#: ../src/dialog.c:409 +msgid "Y (northing): " +msgstr "" + +#: ../src/dialog.c:414 +msgid "X and Y zoom factors must be equal" +msgstr "" + +#: ../src/dialog.c:469 +msgid "1 min" +msgstr "1 minutt" + +#: ../src/dialog.c:470 +msgid "1 hour" +msgstr "1 time" + +#: ../src/dialog.c:471 +msgid "1 day" +msgstr "1 dag" + +#: ../src/dialog.c:472 +msgid "Custom (in minutes):" +msgstr "Tilpasset (i minutter):" + +#: ../src/dialog.c:608 +#, c-format +msgid "" +"2003-2008, Evan Battaglia\n" +"2008-%s, Viking's contributors" +msgstr "" + +#: ../src/dialog.c:609 +msgid "GPS Data and Topo Analyzer, Explorer, and Manager." +msgstr "" + +#: ../src/dialog.c:610 +msgid "" +"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.\n" +"\n" +"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.\n" +"\n" +"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., 59 Temple " +"Place, Suite 330, Boston, MA 02111-1307, USA" +msgstr "" + +#: ../src/dialog.c:703 +msgid "Translation is coordinated on http://launchpad.net/viking" +msgstr "" + +#: ../src/dialog.c:713 +msgid "Download along track" +msgstr "" + +#: ../src/dialog.c:720 +msgid "Map type:" +msgstr "Karttype:" + +#: ../src/dialog.c:726 +msgid "Zoom level:" +msgstr "Zoomnivå:" + +#: ../src/dialog.c:766 +#, c-format +msgid "The map data is licensed: %s." +msgstr "" + +#: ../src/dialog.c:769 +#, c-format +msgid "" +"The data provided by '%s' are licensed under the following license: " +"%s." +msgstr "" + +#: ../src/dialog.c:773 +msgid "Open license" +msgstr "" + +#: ../src/expedia.c:54 +msgid "Expedia Street Maps" +msgstr "" + +#: ../src/expedia.c:82 +msgid "Invalid expedia altitude" +msgstr "" + +#: ../src/expedia.c:113 +#, c-format +msgid "" +"Couldn't open EXPEDIA image file (right after successful download! Please " +"report and delete image file!): %s" +msgstr "" + +#: ../src/expedia.c:126 +#, c-format +msgid "" +"Couldn't save EXPEDIA image file (right after successful download! Please " +"report and delete image file!): %s" +msgstr "" + +#: ../src/geonamessearch.c:115 +msgid "Search" +msgstr "Søk" + +#: ../src/geonamessearch.c:117 +msgid "No entries found!" +msgstr "" + +#. NB could allow columns to be shifted around by doing this after each new +#. gtk_tree_view_column_set_reorderable ( column, TRUE ); +#. However I don't think is that useful, so I haven't put it in +#: ../src/geonamessearch.c:171 ../src/datasource_osm_my_traces.c:422 +#: ../src/viktrwlayer_tracklist.c:621 ../src/viktrwlayer_waypointlist.c:618 +msgid "Name" +msgstr "" + +#: ../src/geonamessearch.c:176 +msgid "Feature" +msgstr "" + +#: ../src/geonamessearch.c:181 ../src/datasource_osm_my_traces.c:437 +msgid "Lat/Lon" +msgstr "" + +#: ../src/geonamessearch.c:264 ../src/googlesearch.c:101 ../src/vikgoto.c:430 +msgid "couldn't map temp file" +msgstr "" + +#: ../src/geonamessearch.c:459 +msgid "Select articles" +msgstr "" + +#: ../src/geonamessearch.c:459 +msgid "Select the articles you want to add." +msgstr "" + +#: ../src/geonamessearch.c:475 +msgid "city" +msgstr "" + +#: ../src/geonamessearch.c:477 +msgid "edu" +msgstr "" + +#: ../src/geonamessearch.c:479 +msgid "airport" +msgstr "" + +#: ../src/geonamessearch.c:481 +msgid "mountain" +msgstr "" + +#: ../src/geonamessearch.c:483 +msgid "forest" +msgstr "" + +#: ../src/geonamessearch.c:485 +msgid "church" +msgstr "" + +#: ../src/geojson.c:74 +#, c-format +msgid "%s command failed: %s" +msgstr "" + +#: ../src/geojson.c:146 ../src/gpx.c:1317 +#, c-format +msgid "failed to open temporary file: %s" +msgstr "kunne ikke åpne midlertidig fil: %s" + +#: ../src/globals.c:67 +msgid "DDD" +msgstr "" + +#: ../src/globals.c:67 +msgid "DMM" +msgstr "" + +#: ../src/globals.c:67 +msgid "DMS" +msgstr "" + +#: ../src/globals.c:67 +msgid "Raw" +msgstr "" + +#: ../src/globals.c:68 +msgid "Kilometres" +msgstr "" + +#: ../src/globals.c:68 +msgid "Miles" +msgstr "" + +#: ../src/globals.c:68 +msgid "Nautical Miles" +msgstr "" + +#. VIK_UNITS_SPEED_KILOMETRES_PER_HOUR: +#: ../src/globals.c:69 ../src/viktrwlayer_tracklist.c:655 ../src/vikutils.c:100 +msgid "km/h" +msgstr "" + +#: ../src/globals.c:69 ../src/viktrwlayer_tracklist.c:656 ../src/vikutils.c:78 +msgid "mph" +msgstr "" + +#. VIK_UNITS_SPEED_METRES_PER_SECOND: +#: ../src/globals.c:69 ../src/viktrwlayer_tracklist.c:663 ../src/vikutils.c:81 +msgid "m/s" +msgstr "" + +#: ../src/globals.c:69 ../src/viktrwlayer_tracklist.c:657 ../src/vikutils.c:84 +msgid "knots" +msgstr "" + +#: ../src/globals.c:69 ../src/viktrwlayer_tracklist.c:658 ../src/vikutils.c:87 +msgid "s/km" +msgstr "" + +#: ../src/globals.c:69 ../src/viktrwlayer_tracklist.c:659 ../src/vikutils.c:90 +msgid "min/km" +msgstr "" + +#: ../src/globals.c:69 +msgid "s/mi" +msgstr "" + +#: ../src/globals.c:69 ../src/viktrwlayer_tracklist.c:661 ../src/vikutils.c:96 +msgid "min/mi" +msgstr "" + +#: ../src/globals.c:70 +msgid "Metres" +msgstr "" + +#: ../src/globals.c:70 +msgid "Feet" +msgstr "" + +#: ../src/globals.c:73 +msgid "Locale" +msgstr "" + +#: ../src/globals.c:73 +msgid "World" +msgstr "" + +#: ../src/globals.c:73 +msgid "UTC" +msgstr "" + +#: ../src/globals.c:76 +msgid "Degree format:" +msgstr "" + +#: ../src/globals.c:77 +msgid "Distance units:" +msgstr "" + +#: ../src/globals.c:78 +msgid "Speed units:" +msgstr "" + +#: ../src/globals.c:79 +msgid "Height units:" +msgstr "" + +#: ../src/globals.c:80 +msgid "Use large waypoint icons:" +msgstr "" + +#: ../src/globals.c:81 +msgid "Default latitude:" +msgstr "" + +#: ../src/globals.c:82 +msgid "Default longitude:" +msgstr "" + +#: ../src/globals.c:83 +msgid "Time Display:" +msgstr "" + +#: ../src/globals.c:84 +msgid "" +"Display times according to the reference frame. Locale is the user's system " +"setting. World is relative to the location of the object." +msgstr "" + +#: ../src/globals.c:90 +msgid "Alphabetical" +msgstr "" + +#: ../src/globals.c:90 ../src/datasource_osm_my_traces.c:432 +msgid "Time" +msgstr "" + +#: ../src/globals.c:90 +msgid "Creation" +msgstr "" + +#: ../src/globals.c:91 +msgid "Title Case" +msgstr "" + +#: ../src/globals.c:91 +msgid "Lowercase" +msgstr "" + +#: ../src/globals.c:94 +msgid "KML File Export Units:" +msgstr "" + +#: ../src/globals.c:95 +msgid "GPX Track Order:" +msgstr "" + +#: ../src/globals.c:96 +msgid "GPX Waypoint Symbols:" +msgstr "" + +#: ../src/globals.c:97 +msgid "" +"Save GPX Waypoint Symbol names in the specified case. May be useful for " +"compatibility with various devices" +msgstr "" + +#: ../src/globals.c:98 +msgid "GPX Creator:" +msgstr "" + +#: ../src/globals.c:99 +msgid "" +"The creator value when writing a GPX file. Otherwise when blank a default is " +"used." +msgstr "" + +#: ../src/globals.c:104 +msgid "Image Viewer:" +msgstr "" + +#: ../src/globals.c:109 +msgid "External GPX Program 1:" +msgstr "" + +#: ../src/globals.c:110 +msgid "External GPX Program 2:" +msgstr "" + +#: ../src/globals.c:113 +msgid "Absolute" +msgstr "" + +#: ../src/globals.c:113 +msgid "Relative" +msgstr "" + +#: ../src/globals.c:117 +msgid "Save File Reference Mode:" +msgstr "" + +#: ../src/globals.c:118 +msgid "" +"When saving a Viking .vik file, this determines how the directory paths of " +"filenames are written." +msgstr "" + +#: ../src/globals.c:119 +msgid "Ask for Name before Track Creation:" +msgstr "" + +#: ../src/globals.c:120 +msgid "Show Tooltip during Track Creation:" +msgstr "" + +#: ../src/globals.c:121 +msgid "The number of recent files:" +msgstr "" + +#: ../src/globals.c:122 +msgid "" +"Only applies to new windows or on application restart. -1 means all " +"available files." +msgstr "" + +#: ../src/globals.c:123 +msgid "Open files in selected layer:" +msgstr "" + +#: ../src/globals.c:124 +msgid "Open files (but not .vik ones) into the selected TrackWaypoint layer." +msgstr "" + +#: ../src/globals.c:125 +msgid "Show calendar day names:" +msgstr "" + +#: ../src/globals.c:128 +msgid "Home Location" +msgstr "" + +#: ../src/globals.c:128 +msgid "Last Location" +msgstr "" + +#: ../src/globals.c:128 +msgid "Specified File" +msgstr "" + +#: ../src/globals.c:128 +msgid "Auto Location" +msgstr "" + +#: ../src/globals.c:131 +msgid "Restore Window Setup:" +msgstr "" + +#: ../src/globals.c:132 +msgid "Restore window size and layout" +msgstr "" + +#: ../src/globals.c:133 +msgid "Add a Default Map Layer:" +msgstr "" + +#: ../src/globals.c:134 +msgid "" +"The default map layer added is defined by the Layer Defaults. Use the menu " +"Edit->Layer Defaults->Map... to change the map type and other values." +msgstr "" + +#: ../src/globals.c:135 +msgid "Startup Method:" +msgstr "" + +#: ../src/globals.c:136 +msgid "Startup File:" +msgstr "" + +#: ../src/globals.c:137 +msgid "" +"The default file to load on startup. Only applies when the startup method is " +"set to 'Specified File'" +msgstr "" + +#: ../src/globals.c:138 +msgid "Check For New Version:" +msgstr "" + +#: ../src/globals.c:139 +msgid "Periodically check to see if a new version of Viking is available" +msgstr "" + +#. Defaults for the options are setup here +#: ../src/globals.c:176 +msgid "General" +msgstr "" + +#. New Tab +#: ../src/globals.c:204 +msgid "Startup" +msgstr "" + +#. New Tab +#: ../src/globals.c:222 +msgid "Export/External" +msgstr "" + +#. 'Advanced' Properties +#: ../src/globals.c:249 +msgid "Advanced" +msgstr "" + +#. Webtools +#: ../src/google.c:39 +msgid "Google" +msgstr "Google" + +#. If there is an actual description field it will overwrite this value +#: ../src/gpx.c:264 +#, c-format +msgid "Created by: %s" +msgstr "" + +#: ../src/datasource_bfilter.c:43 +msgid "Max number of points:" +msgstr "" + +#: ../src/datasource_bfilter.c:84 +msgid "Simplify All Tracks..." +msgstr "" + +#: ../src/datasource_bfilter.c:85 +msgid "Simplified Tracks" +msgstr "Forenklede spor" + +#. { VIK_LAYER_NUM_TYPES, "compressmethod", VIK_LAYER_PARAM_UINT, VIK_LAYER_GROUP_NONE, N_("Simplify Method:"), VIK_LAYER_WIDGET_COMBOBOX, compress_method, NULL, NULL, NULL, NULL, NULL }, +#: ../src/datasource_bfilter.c:111 +msgid "Error Factor:" +msgstr "" + +#: ../src/datasource_bfilter.c:112 +msgid "" +"Specifies the maximum allowable error that may be introduced by removing a " +"single point by the crosstrack method. See the manual or GPSBabel Simplify " +"Filter documentation for more detail." +msgstr "" + +#: ../src/datasource_bfilter.c:166 +msgid "Compress Tracks..." +msgstr "" + +#: ../src/datasource_bfilter.c:167 +msgid "Compressed Tracks" +msgstr "" + +#: ../src/datasource_bfilter.c:197 ../src/datasource_bfilter.c:198 +msgid "Remove Duplicate Waypoints" +msgstr "" + +#: ../src/datasource_bfilter.c:221 +msgid "Manual filter:" +msgstr "" + +#: ../src/datasource_bfilter.c:222 +msgid "Manual filter command: e.g. 'swap'." +msgstr "" + +#: ../src/datasource_bfilter.c:233 ../src/datasource_bfilter.c:234 +msgid "Manual filter" +msgstr "" + +#: ../src/datasource_bfilter.c:262 +msgid "Waypoints Inside This" +msgstr "" + +#: ../src/datasource_bfilter.c:263 ../src/datasource_bfilter.c:292 +msgid "Polygonized Layer" +msgstr "" + +#: ../src/datasource_bfilter.c:291 +msgid "Waypoints Outside This" +msgstr "" + +#: ../src/datasource_file.c:61 +msgid "Import file with GPSBabel" +msgstr "" + +#: ../src/datasource_file.c:62 +msgid "Imported file" +msgstr "" + +#. The file selector +#: ../src/datasource_file.c:129 +msgid "File:" +msgstr "" + +#: ../src/datasource_file.c:130 +msgid "File to import" +msgstr "" + +#: ../src/datasource_file.c:137 +msgid "All files" +msgstr "" + +#. The file format selector +#: ../src/datasource_file.c:144 ../src/datasource_url.c:106 +msgid "File type:" +msgstr "" + +#: ../src/datasource_file.c:189 +#, c-format +msgid "using babel args '%s' and file '%s'" +msgstr "" + +#: ../src/datasource_gc.c:67 +msgid "Download Geocaches" +msgstr "Laster ned Geocacher" + +#: ../src/datasource_gc.c:68 +msgid "Geocaching.com Caches" +msgstr "Geocaching.com Cacher" + +#: ../src/datasource_gc.c:86 +msgid "geocaching.com username:" +msgstr "geocaching.com-brukernavn:" + +#: ../src/datasource_gc.c:87 +msgid "geocaching.com password:" +msgstr "geocaching.com-passord:" + +#: ../src/datasource_gc.c:92 ../src/vikwindow.c:3502 +msgid "Geocaching" +msgstr "" + +#: ../src/datasource_gc.c:128 +#, c-format +msgid "" +"Can't find %s or %s in path! Check that you have installed it correctly." +msgstr "" + +#: ../src/datasource_gc.c:190 +msgid "Number geocaches:" +msgstr "Antall geocacher:" + +#: ../src/datasource_gc.c:192 +msgid "Centered around:" +msgstr "" + +#: ../src/datasource_gc.c:231 +msgid "Broken input - using some defaults" +msgstr "" + +#: ../src/datasource_geotag.c:51 +msgid "Create Waypoints from Geotagged Images" +msgstr "" + +#: ../src/datasource_geotag.c:52 +msgid "Geotagged Images" +msgstr "" + +#: ../src/datasource_geotag.c:102 ../src/datasource_geojson.c:93 +#: ../src/vikfileentry.c:171 ../src/vikwindow.c:3533 ../src/vikwindow.c:3610 +#: ../src/vikwindow.c:3641 ../src/vikwindow.c:4356 ../src/vikwindow.c:4649 +msgid "All" +msgstr "" + +#: ../src/datasource_geotag.c:107 ../src/vikfileentry.c:115 +#: ../src/viktrwlayer_geotag.c:637 ../src/vikwindow.c:3518 +#: ../src/vikwindow.c:4377 +msgid "JPG" +msgstr "" + +#: ../src/datasource_geotag.c:168 +#, c-format +msgid "Unable to create waypoint from %s" +msgstr "" + +#: ../src/datasource_geojson.c:46 +msgid "Acquire from GeoJSON" +msgstr "" + +#: ../src/datasource_geojson.c:47 ../src/datasource_geojson.c:98 +msgid "GeoJSON" +msgstr "" + +#: ../src/datasource_geojson.c:152 +#, c-format +msgid "Unable to import from: %s" +msgstr "" + +#: ../src/datasource_gps.c:54 +msgid "Acquire from GPS" +msgstr "Hent fra GPS" + +#: ../src/datasource_gps.c:55 +msgid "Acquired from GPS" +msgstr "Hentet fra GPS" + +#: ../src/datasource_gps.c:258 +#, c-format +msgid "using cmd '%s' and file '%s'\n" +msgstr "" + +#: ../src/datasource_gps.c:353 ../src/vikgpslayer.c:966 +#, c-format +msgid "Downloading %d waypoint..." +msgid_plural "Downloading %d waypoints..." +msgstr[0] "" +msgstr[1] "" + +#: ../src/datasource_gps.c:358 ../src/vikgpslayer.c:971 +#, c-format +msgid "Downloading %d trackpoint..." +msgid_plural "Downloading %d trackpoints..." +msgstr[0] "" +msgstr[1] "" + +#: ../src/datasource_gps.c:363 ../src/vikgpslayer.c:976 +#, c-format +msgid "Downloading %d routepoint..." +msgid_plural "Downloading %d routepoints..." +msgstr[0] "" +msgstr[1] "" + +#: ../src/datasource_gps.c:386 ../src/datasource_gps.c:393 +#: ../src/datasource_gps.c:400 +#, c-format +msgid "Downloaded %d out of %d %s..." +msgstr "Lastet ned %d av %d %s..." + +#: ../src/datasource_gps.c:388 ../src/datasource_gps.c:395 +#: ../src/datasource_gps.c:402 +#, c-format +msgid "Downloaded %d %s." +msgstr "Lastet ned %d %s." + +#: ../src/datasource_gps.c:416 ../src/vikgpslayer.c:1134 +#, c-format +msgid "GPS Device: %s" +msgstr "GPS-enhet: %s" + +#: ../src/datasource_gps.c:428 ../src/vikgpslayer.c:1214 +msgid "Status: Working..." +msgstr "" + +#. NB gps_layer_inst_init() is performed after parameter registeration +#. thus to give the protocols some potential values use the old static list +#. TODO: find another way to use gps_layer_inst_init()? +#: ../src/datasource_gps.c:584 ../src/vikgpslayer.c:216 +msgid "GPS Protocol:" +msgstr "GPS-protokoll" + +#. List reassigned at runtime +#: ../src/datasource_gps.c:609 ../src/vikgpslayer.c:217 +msgid "Serial Port:" +msgstr "" + +#: ../src/datasource_gps.c:659 +msgid "" +"Turn Off After Transfer\n" +"(Garmin/NAViLink Only)" +msgstr "" + +#: ../src/datasource_gps.c:666 +msgid "Tracks:" +msgstr "" + +#: ../src/datasource_gps.c:673 +msgid "Routes:" +msgstr "" + +#: ../src/datasource_gps.c:680 +msgid "Waypoints:" +msgstr "" + +#: ../src/datasource_gps.c:756 ../src/vikgpslayer.c:1509 +msgid "GPS device: N/A" +msgstr "" + +#: ../src/datasource_osm.c:53 ../src/datasource_osm.c:54 +msgid "OSM traces" +msgstr "" + +#: ../src/datasource_osm.c:89 +msgid "Page number:" +msgstr "" + +#: ../src/datasource_osm_my_traces.c:59 ../src/datasource_osm_my_traces.c:60 +msgid "OSM My Traces" +msgstr "" + +#: ../src/datasource_osm_my_traces.c:106 ../src/osm-traces.c:684 +#, fuzzy +msgid "Email/username:" +msgstr "OSM-brukernavn:" + +#: ../src/datasource_osm_my_traces.c:111 +msgid "The email or username used to login to OSM" +msgstr "" + +#: ../src/datasource_osm_my_traces.c:113 ../src/osm-traces.c:692 +msgid "Password:" +msgstr "Passord:" + +#: ../src/datasource_osm_my_traces.c:116 +msgid "The password used to login to OSM" +msgstr "" + +#: ../src/datasource_osm_my_traces.c:427 ../src/viktrwlayer.c:689 +msgid "Description" +msgstr "" + +#: ../src/datasource_osm_my_traces.c:442 +msgid "Privacy" +msgstr "" + +#: ../src/datasource_osm_my_traces.c:449 +msgid "Within Current View" +msgstr "" + +#: ../src/datasource_osm_my_traces.c:516 +msgid "GPS Traces" +msgstr "" + +#: ../src/datasource_osm_my_traces.c:518 +msgid "None found!" +msgstr "" + +#: ../src/datasource_osm_my_traces.c:569 +msgid "Ensure the OSM access token preferences are setup." +msgstr "" + +#: ../src/datasource_osm_my_traces.c:645 +msgid "My OSM Traces" +msgstr "" + +#. Report errors to the status bar +#: ../src/datasource_osm_my_traces.c:667 +#, c-format +msgid "Unable to get trace: %s" +msgstr "" + +#: ../src/datasource_routing.c:56 ../src/datasource_routing.c:57 +msgid "Directions" +msgstr "" + +#: ../src/datasource_routing.c:90 +msgid "No routing engines with directions available" +msgstr "" + +#. Engine selector +#: ../src/datasource_routing.c:99 +msgid "Engine:" +msgstr "" + +#. From and To entries +#: ../src/datasource_routing.c:104 +msgid "From:" +msgstr "Fra:" + +#: ../src/datasource_routing.c:105 +msgid "To:" +msgstr "Til:" + +#: ../src/datasource_url.c:48 +msgid "Acquire from URL" +msgstr "" + +#: ../src/datasource_url.c:49 +msgid "URL" +msgstr "" + +#: ../src/datasource_url.c:101 +msgid "URL:" +msgstr "" + +#. Only GPX (not using GPSbabel) +#: ../src/datasource_url.c:133 ../src/vikfileentry.c:161 +#: ../src/vikwindow.c:3513 ../src/vikwindow.c:3603 +msgid "GPX" +msgstr "" + +#: ../src/datasource_wikipedia.c:32 +msgid "Create Waypoints from Wikipedia Articles" +msgstr "" + +#: ../src/datasource_wikipedia.c:33 +msgid "Wikipedia Waypoints" +msgstr "" + +#: ../src/dem.c:66 ../src/dem.c:80 +msgid "Invalid DEM" +msgstr "Ugyldig DEM" + +#: ../src/dem.c:122 +msgid "Invalid DEM header" +msgstr "" + +#: ../src/dem.c:191 ../src/dem.c:204 +msgid "Incorrect DEM Class B record: expected 1" +msgstr "" + +#: ../src/dem.c:289 ../src/download.c:176 +#, c-format +msgid "Couldn't map file %s: %s" +msgstr "" + +#: ../src/download.c:130 +msgid "Tile age (days):" +msgstr "" + +#: ../src/download.c:406 +#, c-format +msgid "Download error: %s" +msgstr "Nedlastingsfeil: %s" + +#: ../src/download.c:490 +msgid "couldn't open temp file" +msgstr "kunne ikke åpne tempfil" + +#: ../src/file.c:458 ../src/file.c:463 +#, c-format +msgid "Draw mode '%s' no more supported" +msgstr "" + +#: ../src/geotag_exif.c:621 +msgid "Not enough memory." +msgstr "" + +#: ../src/geotag_exif.c:639 +msgid "Setting a value for this tag is unsupported!" +msgstr "" + +#: ../src/geotag_exif.c:658 +#, c-format +msgid "Too few components specified (need %d, found %d)\n" +msgstr "" + +#: ../src/geotag_exif.c:662 +msgid "Numeric value expected\n" +msgstr "" + +#: ../src/geotag_exif.c:670 +msgid "This shouldn't happen!" +msgstr "" + +#: ../src/geotag_exif.c:740 +msgid "Not yet implemented!" +msgstr "" + +#: ../src/geotag_exif.c:753 +msgid "Warning; Too many components specified!" +msgstr "" + +#: ../src/osm-traces.c:87 +msgid "Identifiable (public w/ timestamps)" +msgstr "" + +#: ../src/osm-traces.c:88 +msgid "Trackable (private w/ timestamps)" +msgstr "" + +#: ../src/osm-traces.c:89 +msgid "Public" +msgstr "Offentlig" + +#: ../src/osm-traces.c:90 +msgid "Private" +msgstr "" + +#: ../src/osm-traces.c:108 +msgid "Access Token:" +msgstr "" + +#: ../src/osm-traces.c:108 +msgid "Get New OSM Access Tokens" +msgstr "" + +#: ../src/osm-traces.c:109 +msgid "Access Token Key:" +msgstr "" + +#: ../src/osm-traces.c:110 +msgid "Access Token Secret:" +msgstr "" + +#: ../src/osm-traces.c:111 +msgid "OSM username:" +msgstr "OSM-brukernavn:" + +#: ../src/osm-traces.c:112 +msgid "OSM password:" +msgstr "OSM-passord:" + +#. Check to really override existing values... +#: ../src/osm-traces.c:263 +msgid "Do you want to overwrite existing values?" +msgstr "" + +#: ../src/osm-traces.c:275 +msgid "Not able to generate OSM request tokens." +msgstr "" + +#: ../src/osm-traces.c:299 +msgid "" +"Waiting for authorization approval.\n" +"Ensure you have granted access at the website before continuing here." +msgstr "" + +#: ../src/osm-traces.c:315 +msgid "No Authorization." +msgstr "" + +#: ../src/osm-traces.c:354 +msgid "" +"OSM Username and Password preferences are not required anymore. You can now " +"remove them." +msgstr "" + +#. Preferences +#: ../src/osm-traces.c:379 +msgid "OpenStreetMap Traces" +msgstr "" + +#: ../src/osm-traces.c:504 +#, c-format +msgid "failed to upload data: HTTP response is %ld" +msgstr "" + +#: ../src/osm-traces.c:509 +#, c-format +msgid "curl_easy_getinfo failed: %d" +msgstr "" + +#: ../src/osm-traces.c:514 +#, c-format +msgid "curl request failed: %s" +msgstr "" + +#. Success +#: ../src/osm-traces.c:592 +msgid "Uploaded to OSM" +msgstr "" + +#: ../src/osm-traces.c:596 +msgid "" +"FAILED TO UPLOAD DATA TO OSM - Ensure the OSM access token preferences are " +"setup." +msgstr "" + +#: ../src/osm-traces.c:599 +msgid "FAILED TO UPLOAD DATA TO OSM - CURL PROBLEM" +msgstr "" + +#: ../src/osm-traces.c:602 +msgid "FAILED TO UPLOAD DATA TO OSM" +msgstr "" + +#: ../src/osm-traces.c:602 +msgid "HTTP response code" +msgstr "" + +#: ../src/osm-traces.c:610 +#, c-format +msgid "failed to unlink temporary file: %s" +msgstr "" + +#: ../src/osm-traces.c:664 +msgid "OSM upload" +msgstr "OSM-opplasting" + +#: ../src/osm-traces.c:689 +msgid "" +"The email/username used as login\n" +"Enter the email/username you use to login into www.openstreetmap.org." +"" +msgstr "" + +#: ../src/osm-traces.c:697 +msgid "" +"The password used to login\n" +"Enter the password you use to login into www.openstreetmap.org." +msgstr "" + +#: ../src/osm-traces.c:703 +msgid "File's name:" +msgstr "Filens navn:" + +#: ../src/osm-traces.c:713 +msgid "" +"The name of the file on OSM\n" +"This is the name of the file created on the server.This is not the " +"name of the local file." +msgstr "" + +#: ../src/osm-traces.c:717 ../src/viktrwlayer_wpwin.c:197 +#: ../src/viktrwlayer_wpwin.c:199 +msgid "Description:" +msgstr "Beskrivelse:" + +#: ../src/osm-traces.c:731 +msgid "The description of the trace" +msgstr "" + +#: ../src/osm-traces.c:734 +msgid "Anonymize Times:" +msgstr "" + +#: ../src/osm-traces.c:739 +msgid "" +"Anonymize times of the trace.\n" +"You may choose to make the trace identifiable, yet mask the actual " +"real time values" +msgstr "" + +#: ../src/osm-traces.c:743 +msgid "Tags:" +msgstr "" + +#: ../src/osm-traces.c:751 +msgid "The tags associated to the trace" +msgstr "" + +#: ../src/osm-traces.c:816 +#, c-format +msgid "Uploading %s to OSM" +msgstr "Laster opp %s til OSM" + +#: ../src/mapcache.c:67 +msgid "Map cache memory size (MB):" +msgstr "" + +#. NB Can have a couple hundred fonts loaded when using system directories +#. So ATM don't list them all - otherwise need better GUI feedback display. +#: ../src/mapnik_interface.cpp:324 +#, c-format +msgid "" +"%s %s\n" +"Plugins=%sFonts loaded=%d" +msgstr "" + +#: ../src/mapnik_interface.cpp:325 ../src/vikmapniklayer.c:278 +msgid "Mapnik" +msgstr "" + +#: ../src/print.c:51 ../src/viktrwlayer.c:572 +msgid "None" +msgstr "Ingen" + +#: ../src/print.c:52 +msgid "Horizontally" +msgstr "Horisontalt" + +#: ../src/print.c:53 +msgid "Vertically" +msgstr "Vertikalt" + +#: ../src/print.c:54 +msgid "Both" +msgstr "Begge" + +#: ../src/print.c:118 +msgid "Image Settings" +msgstr "Bildeinnstillinger" + +#: ../src/print.c:551 +msgid "done" +msgstr "ferdig" + +#. Page Size +#: ../src/print.c:580 +msgid "_Adjust Page Size and Orientation" +msgstr "" + +#: ../src/print.c:596 +msgid "C_enter:" +msgstr "" + +#. ignore page margins +#: ../src/print.c:614 +msgid "Ignore Page _Margins" +msgstr "" + +#: ../src/print.c:633 +msgid "Image S_ize:" +msgstr "B_ildestørrelse:" + +#: ../src/ui_util.c:88 +#, c-format +msgid "Could not launch web browser. %s" +msgstr "" + +#: ../src/ui_util.c:101 +#, c-format +msgid "Could not create new email. %s" +msgstr "" + +#: ../src/vikcoordlayer.c:57 +msgid "Color:" +msgstr "Farge:" + +#: ../src/vikcoordlayer.c:58 +msgid "Minutes Width:" +msgstr "" + +#: ../src/vikcoordlayer.c:59 +msgid "Line Thickness:" +msgstr "Linjetykkelse:" + +#: ../src/vikcoordlayer.c:66 +msgid "Coordinate" +msgstr "" + +#: ../src/main.c:92 +#, c-format +msgid "Ignoring Xlib error: error code %d request code %d\n" +msgstr "" + +#: ../src/main.c:111 +msgid "Enable debug output" +msgstr "Aktiver feilsøkingsutskrifter" + +#: ../src/main.c:112 +msgid "Enable verbose output" +msgstr "Slå på utfyllende utskrift" + +#: ../src/main.c:113 +msgid "Show version" +msgstr "Vis versjon" + +#: ../src/main.c:114 +msgid "Latitude in decimal degrees" +msgstr "" + +#: ../src/main.c:115 +msgid "Longitude in decimal degrees" +msgstr "" + +#: ../src/main.c:116 +msgid "Zoom Level (OSM). Value can be 0 - 22" +msgstr "" + +#: ../src/main.c:117 +msgid "Add a map layer by id value. Use 0 for the default map." +msgstr "" + +#: ../src/main.c:160 +#, c-format +msgid "" +"%s %s\n" +"Copyright (c) 2003-2008 Evan Battaglia\n" +"Copyright (c) 2008-%s Viking's contributors\n" +msgstr "" + +#: ../src/osm.c:50 +msgid "OpenStreetMap (Mapnik)" +msgstr "" + +#: ../src/osm.c:65 +msgid "OpenStreetMap (Cycle)" +msgstr "" + +#: ../src/osm.c:79 +msgid "OpenStreetMap (Transport)" +msgstr "" + +#: ../src/osm.c:95 +msgid "OpenStreetMap (Humanitarian)" +msgstr "" + +#: ../src/osm.c:111 +msgid "On Disk OSM Tile Format" +msgstr "" + +#: ../src/osm.c:121 +msgid "MBTiles File" +msgstr "" + +#: ../src/osm.c:132 +msgid "OSM Metatiles" +msgstr "" + +#: ../src/osm.c:146 +msgid "Mapbox Outdoors" +msgstr "" + +#: ../src/osm.c:153 +msgid "Mapbox Specific" +msgstr "" + +#: ../src/osm.c:170 +msgid "OSM (view)" +msgstr "" + +#: ../src/osm.c:174 +msgid "OSM (edit)" +msgstr "" + +#. Note the use of positional parameters +#: ../src/osm.c:179 +msgid "OSM (query)" +msgstr "" + +#: ../src/osm.c:183 +msgid "OSM (render)" +msgstr "" + +#. Example: http://127.0.0.1:8111/load_and_zoom?left=8.19&right=8.20&top=48.605&bottom=48.590&select=node413602999 +#. JOSM or merkaartor must already be running with remote interface enabled +#: ../src/osm.c:190 +msgid "Local port 8111 (eg JOSM)" +msgstr "" + +#: ../src/osm.c:195 +msgid "Geofabrik Map Compare" +msgstr "" + +#: ../src/osm.c:203 +msgid "OpenStreetMap Notes" +msgstr "" + +#. Not really OSM but can't be bothered to create somewhere else to put it... +#: ../src/osm.c:221 +msgid "Wikimedia Toolserver GeoHack" +msgstr "" + +#: ../src/preferences.c:195 +msgid "Preferences" +msgstr "" + +#: ../src/toolbar.c:91 ../src/toolbar.c:92 +msgid "System Default" +msgstr "" + +#: ../src/toolbar.c:91 ../src/viktrwlayer.c:563 +msgid "Small" +msgstr "" + +#: ../src/toolbar.c:91 ../src/viktrwlayer.c:564 +msgid "Medium" +msgstr "" + +#: ../src/toolbar.c:91 ../src/viktrwlayer.c:565 +msgid "Large" +msgstr "" + +#: ../src/toolbar.c:92 +msgid "Icons Only" +msgstr "" + +#: ../src/toolbar.c:92 +msgid "Text Only" +msgstr "" + +#: ../src/toolbar.c:92 +msgid "Icons and Text" +msgstr "" + +#: ../src/toolbar.c:106 +msgid "Append to Menu:" +msgstr "" + +#: ../src/toolbar.c:107 +msgid "Pack the toolbar to the main menu to save vertical space" +msgstr "" + +#: ../src/toolbar.c:108 +msgid "Icon Size:" +msgstr "" + +#: ../src/toolbar.c:110 +msgid "Icon Style:" +msgstr "" + +#: ../src/toolbar.c:112 +msgid "Customize:" +msgstr "" + +#: ../src/toolbar.c:112 +msgid "Customize Buttons" +msgstr "" + +#. Preferences +#: ../src/toolbar.c:145 +msgid "Toolbar" +msgstr "" + +#: ../src/toolbar.c:312 +msgid "_Customize" +msgstr "" + +#: ../src/toolbar.c:641 +msgid "Separator" +msgstr "" + +#: ../src/toolbar.c:642 +msgid "--- Separator ---" +msgstr "" + +#: ../src/toolbar.c:1007 +msgid "Customize Toolbar" +msgstr "" + +#: ../src/toolbar.c:1028 +msgid "" +"Select items to be displayed on the toolbar. Items can be reordered by drag " +"and drop." +msgstr "" + +#: ../src/toolbar.c:1044 +msgid "Available Items" +msgstr "" + +#: ../src/toolbar.c:1065 +msgid "Displayed Items" +msgstr "" + +#: ../src/viklayer_defaults.c:232 +#, c-format +msgid "Could not open file: %s" +msgstr "" + +#: ../src/viklayer_defaults.c:304 +msgid "Layer Defaults" +msgstr "" + +#: ../src/uibuilder.c:196 +msgid "Take care that this password will be stored clearly in a plain file." +msgstr "" + +#: ../src/uibuilder.c:628 ../src/viktrwlayer_export.c:188 +#: ../src/viktrwlayer_export.c:304 ../src/vikwindow.c:3666 +#: ../src/vikwindow.c:4408 +#, c-format +msgid "The file \"%s\" exists, do you wish to overwrite it?" +msgstr "Filen \"%s\" eksisterer. Vil du overskrive den?" + +#: ../src/vikaggregatelayer.c:41 +msgid "Aggregate" +msgstr "" + +#: ../src/vikaggregatelayer.c:528 ../src/viktrwlayer.c:11700 +#, c-format +msgid "%s: Waypoint List" +msgstr "" + +#: ../src/vikaggregatelayer.c:570 +msgid "Search by Date" +msgstr "" + +#: ../src/vikaggregatelayer.c:576 +msgid "No items found with the requested date." +msgstr "" + +#: ../src/vikaggregatelayer.c:615 ../src/viktrwlayer.c:11691 +#, c-format +msgid "%s: Track and Route List" +msgstr "" + +#: ../src/vikaggregatelayer.c:681 ../src/viktrwlayer.c:8346 +#: ../src/viktrwlayer.c:8417 ../src/viktrwlayer.c:8494 +msgid "_Visibility" +msgstr "" + +#: ../src/vikaggregatelayer.c:686 +msgid "_Show All" +msgstr "" + +#: ../src/vikaggregatelayer.c:692 +msgid "_Hide All" +msgstr "" + +#: ../src/vikaggregatelayer.c:698 ../src/viktrwlayer.c:8363 +#: ../src/viktrwlayer.c:8434 ../src/viktrwlayer.c:8511 +msgid "_Toggle" +msgstr "" + +#: ../src/vikaggregatelayer.c:705 ../src/viktrwlayer.c:8532 +msgid "_Sort" +msgstr "" + +#: ../src/vikaggregatelayer.c:711 ../src/viktrwlayer.c:8538 +msgid "Name _Ascending" +msgstr "" + +#: ../src/vikaggregatelayer.c:717 ../src/viktrwlayer.c:8544 +msgid "Name _Descending" +msgstr "" + +#: ../src/vikaggregatelayer.c:723 ../src/viktrwlayer.c:575 +#: ../src/viktrwlayer.c:8550 +msgid "Date Ascending" +msgstr "" + +#: ../src/vikaggregatelayer.c:729 ../src/viktrwlayer.c:576 +#: ../src/viktrwlayer.c:8556 +msgid "Date Descending" +msgstr "" + +#: ../src/vikaggregatelayer.c:735 ../src/viktrwlayer.c:8445 +#: ../src/viktrwlayer.c:8523 ../src/viktrwlayer.c:8595 +#: ../src/viktrwlayer_tracklist.c:296 +msgid "_Statistics" +msgstr "" + +#: ../src/vikaggregatelayer.c:740 ../src/viktrwlayer.c:4533 +msgid "Track _List..." +msgstr "" + +#: ../src/vikaggregatelayer.c:746 ../src/viktrwlayer.c:4540 +msgid "_Waypoint List..." +msgstr "" + +#: ../src/vikaggregatelayer.c:753 +msgid "Searc_h" +msgstr "" + +#: ../src/vikaggregatelayer.c:759 +msgid "By _Date..." +msgstr "" + +#: ../src/vikaggregatelayer.c:762 +msgid "Find the first item with a specified date" +msgstr "" + +#: ../src/vikaggregatelayer.c:765 +msgid "Load E_xternal Layers" +msgstr "" + +#. Could have a more complicated tooltip that numbers each type of layers, +#. but for now a simple overall count +#: ../src/vikaggregatelayer.c:1011 +#, c-format +msgid "One layer" +msgid_plural "%d layers" +msgstr[0] "" +msgstr[1] "" + +#: ../src/vikaggregatelayer.c:1014 +#, c-format +msgid "Empty" +msgstr "" + +#: ../src/vikdemlayer.c:86 +msgid "SRTM Global 90m (3 arcsec)" +msgstr "" + +#: ../src/vikdemlayer.c:94 +msgid "Absolute height" +msgstr "" + +#: ../src/vikdemlayer.c:95 +msgid "Height gradient" +msgstr "" + +#: ../src/vikdemlayer.c:120 +msgid "DEM Files:" +msgstr "DEM-filer:" + +#: ../src/vikdemlayer.c:121 +msgid "Download Source:" +msgstr "Last ned kilde:" + +#: ../src/vikdemlayer.c:122 +msgid "Min Elev Color:" +msgstr "" + +#: ../src/vikdemlayer.c:123 ../src/viktrwlayer_wpwin.c:207 +msgid "Type:" +msgstr "" + +#: ../src/vikdemlayer.c:124 +msgid "Min Elev:" +msgstr "" + +#: ../src/vikdemlayer.c:125 +msgid "Max Elev:" +msgstr "" + +#: ../src/vikdemlayer.c:137 +msgid "_DEM Download" +msgstr "" + +#: ../src/vikdemlayer.c:137 +msgid "DEM Download" +msgstr "" + +#: ../src/vikdemlayer.c:192 +msgid "DEM" +msgstr "" + +#: ../src/vikdemlayer.c:304 +#, c-format +msgid "Number of files: %d" +msgstr "" + +#: ../src/vikdemlayer.c:446 +msgid "DEM Loading" +msgstr "" + +#: ../src/vikdemlayer.c:927 +#, c-format +msgid "No SRTM data available for %f, %f" +msgstr "Ingen SRTM-data tilgjengelig for %f, %f" + +#: ../src/vikdemlayer.c:948 +#, c-format +msgid "DEM download failure for %f, %f" +msgstr "" + +#: ../src/vikdemlayer.c:954 +#, c-format +msgid "DEM write failure for %s" +msgstr "" + +#. Probably not over any land... +#: ../src/vikdemlayer.c:1201 +msgid "No DEM File Available" +msgstr "" + +#: ../src/vikdemlayer.c:1220 +#, c-format +msgid "" +"\n" +"Source: %s\n" +"\n" +"DEM File: %s\n" +"DEM File Timestamp: %s" +msgstr "" + +#: ../src/vikdemlayer.c:1224 +#, c-format +msgid "" +"Source: %s\n" +"\n" +"No DEM File!" +msgstr "" + +#: ../src/vikdemlayer.c:1264 +#, c-format +msgid "Downloading DEM %s" +msgstr "Laster ned DEM %s" + +#: ../src/vikdemlayer.c:1289 +msgid "_Show DEM File Information" +msgstr "" + +#: ../src/vikfileentry.c:72 +msgid "Browse..." +msgstr "" + +#: ../src/vikfileentry.c:103 +msgid "Choose file" +msgstr "Velg fil" + +#: ../src/vikfileentry.c:120 ../src/vikwindow.c:4372 +msgid "PNG" +msgstr "" + +#: ../src/vikfileentry.c:125 +msgid "TIFF" +msgstr "" + +#: ../src/vikfileentry.c:133 +msgid "MBTiles" +msgstr "" + +#: ../src/vikfileentry.c:142 +msgid "XML" +msgstr "" + +#: ../src/vikfileentry.c:149 +msgid "MML" +msgstr "" + +#: ../src/vikfileentry.c:154 +msgid "MSS" +msgstr "" + +#: ../src/vikfilelist.c:49 +msgid "Choose file(s)" +msgstr "Velg fil(er)" + +#: ../src/vikfilelist.c:182 +msgid "Add..." +msgstr "Legg til..." + +#: ../src/vikfilelist.c:183 +msgid "Delete" +msgstr "Slett" + +#: ../src/vikgeoreflayer.c:97 +msgid "_Georef Move Map" +msgstr "" + +#: ../src/vikgeoreflayer.c:97 +msgid "Georef Move Map" +msgstr "" + +#: ../src/vikgeoreflayer.c:106 +msgid "Georef Z_oom Tool" +msgstr "" + +#: ../src/vikgeoreflayer.c:106 +msgid "Georef Zoom Tool" +msgstr "" + +#: ../src/vikgeoreflayer.c:117 +msgid "GeoRef Map" +msgstr "" + +#: ../src/vikgeoreflayer.c:214 +msgid "Auto Read World Files:" +msgstr "" + +#: ../src/vikgeoreflayer.c:215 +msgid "" +"Automatically attempt to read associated world file of a new image for a " +"GeoRef layer" +msgstr "" + +#: ../src/vikgeoreflayer.c:511 ../src/vikgeoreflayer.c:797 +#: ../src/vikmapslayer.c:1174 +#, c-format +msgid "Couldn't open image file: %s" +msgstr "Kunne ikke åpne bildefil: %s" + +#: ../src/vikgeoreflayer.c:607 ../src/vikgeoreflayer.c:633 +msgid "Choose World file" +msgstr "Velg World-fil" + +#: ../src/vikgeoreflayer.c:619 +msgid "The World file you requested could not be opened for reading." +msgstr "Den World-filen du valgte kunne ikke åpnes for lesing." + +#: ../src/vikgeoreflayer.c:621 +msgid "Unexpected end of file reading World file." +msgstr "" + +#: ../src/vikgeoreflayer.c:646 +msgid "The file you requested could not be opened for writing." +msgstr "Den World-filen du valgte kunne ikke åpnes for skriving." + +#: ../src/vikgeoreflayer.c:782 +msgid "Lower right corner values may not be consistent with upper right values" +msgstr "" + +#: ../src/vikgeoreflayer.c:806 +#, c-format +msgid "Invalid image size: %s" +msgstr "" + +#: ../src/vikgeoreflayer.c:831 ../src/viklayer.c:561 ../src/vikwindow.c:4891 +msgid "Layer Properties" +msgstr "Laginnstillinger" + +#: ../src/vikgeoreflayer.c:852 +msgid "World File Parameters:" +msgstr "" + +#: ../src/vikgeoreflayer.c:853 +msgid "Load From File..." +msgstr "Last inn fra fil..." + +#: ../src/vikgeoreflayer.c:858 +msgid "Corner pixel easting:" +msgstr "" + +#: ../src/vikgeoreflayer.c:860 +msgid "the UTM \"easting\" value of the upper-left corner pixel of the map" +msgstr "" + +#: ../src/vikgeoreflayer.c:862 +msgid "Corner pixel northing:" +msgstr "" + +#: ../src/vikgeoreflayer.c:864 +msgid "the UTM \"northing\" value of the upper-left corner pixel of the map" +msgstr "" + +#: ../src/vikgeoreflayer.c:866 +msgid "X (easting) scale (mpp): " +msgstr "" + +#: ../src/vikgeoreflayer.c:867 +msgid "Y (northing) scale (mpp): " +msgstr "" + +#: ../src/vikgeoreflayer.c:870 +msgid "the scale of the map in the X direction (meters per pixel)" +msgstr "" + +#: ../src/vikgeoreflayer.c:872 +msgid "the scale of the map in the Y direction (meters per pixel)" +msgstr "" + +#: ../src/vikgeoreflayer.c:874 +msgid "Map Image:" +msgstr "Kartbilde:" + +#: ../src/vikgeoreflayer.c:919 +msgid "Upper left latitude:" +msgstr "" + +#: ../src/vikgeoreflayer.c:921 +msgid "Upper left longitude:" +msgstr "" + +#: ../src/vikgeoreflayer.c:923 +msgid "Lower right latitude:" +msgstr "" + +#: ../src/vikgeoreflayer.c:925 +msgid "Lower right longitude:" +msgstr "" + +#: ../src/vikgeoreflayer.c:937 +msgid "Calculate MPP values from coordinates" +msgstr "" + +#: ../src/vikgeoreflayer.c:938 +msgid "" +"Enter all corner coordinates before calculating the MPP values from the " +"image size" +msgstr "" + +#: ../src/vikgeoreflayer.c:948 +msgid "UTM" +msgstr "" + +#: ../src/vikgeoreflayer.c:949 +msgid "Latitude/Longitude" +msgstr "" + +#: ../src/vikgeoreflayer.c:957 ../src/vikmapniklayer.c:82 +#: ../src/vikmapslayer.c:158 +msgid "Alpha:" +msgstr "Alfa:" + +#. Now with icons +#: ../src/vikgeoreflayer.c:1062 +msgid "_Zoom to Fit Map" +msgstr "" + +#: ../src/vikgeoreflayer.c:1068 +msgid "_Goto Map Center" +msgstr "" + +#: ../src/vikgeoreflayer.c:1074 +msgid "_Export to World File" +msgstr "" + +#: ../src/vikgoto.c:98 +msgid "No goto tool available." +msgstr "" + +#: ../src/vikgoto.c:295 +msgid "goto" +msgstr "" + +#: ../src/vikgoto.c:297 +msgid "goto provider:" +msgstr "" + +#: ../src/vikgoto.c:312 +msgid "Enter address or place name:" +msgstr "Angi adresse eller stedsnavn:" + +#: ../src/vikgoto.c:487 +msgid "Locality" +msgstr "" + +#: ../src/vikgpslayer.c:137 +msgid "Data Mode" +msgstr "" + +#: ../src/vikgpslayer.c:139 +msgid "Realtime Tracking Mode" +msgstr "" + +#: ../src/vikgpslayer.c:176 +msgid "Keep vehicle at center" +msgstr "" + +#: ../src/vikgpslayer.c:177 +msgid "Keep vehicle on screen" +msgstr "" + +#: ../src/vikgpslayer.c:178 +msgid "Disable" +msgstr "" + +#: ../src/vikgpslayer.c:218 +msgid "Download Tracks:" +msgstr "" + +#: ../src/vikgpslayer.c:219 +msgid "Upload Tracks:" +msgstr "" + +#: ../src/vikgpslayer.c:220 +msgid "Download Routes:" +msgstr "" + +#: ../src/vikgpslayer.c:221 +msgid "Upload Routes:" +msgstr "" + +#: ../src/vikgpslayer.c:222 +msgid "Download Waypoints:" +msgstr "" + +#: ../src/vikgpslayer.c:223 +msgid "Upload Waypoints:" +msgstr "" + +#: ../src/vikgpslayer.c:225 +msgid "Recording tracks" +msgstr "" + +#: ../src/vikgpslayer.c:226 +msgid "Jump to current position on start" +msgstr "" + +#: ../src/vikgpslayer.c:227 +msgid "Moving Map Method:" +msgstr "" + +#: ../src/vikgpslayer.c:228 +msgid "Update Statusbar:" +msgstr "" + +#: ../src/vikgpslayer.c:228 +msgid "Display information in the statusbar on GPS updates" +msgstr "" + +#: ../src/vikgpslayer.c:229 +msgid "Auto Connect" +msgstr "" + +#: ../src/vikgpslayer.c:229 +msgid "Automatically connect to GPSD" +msgstr "" + +#: ../src/vikgpslayer.c:230 +msgid "Gpsd Host:" +msgstr "" + +#: ../src/vikgpslayer.c:231 +msgid "Gpsd Port:" +msgstr "" + +#: ../src/vikgpslayer.c:232 +msgid "Gpsd Retry Interval (seconds):" +msgstr "" + +#: ../src/vikgpslayer.c:254 +msgid "GPS" +msgstr "" + +#: ../src/vikgpslayer.c:320 ../src/vikgpslayer.c:1504 +msgid "GPS Download" +msgstr "GPS-nedlasting" + +#: ../src/vikgpslayer.c:320 ../src/vikgpslayer.c:1504 ../src/viktrwlayer.c:3993 +msgid "GPS Upload" +msgstr "GPS-opplasting" + +#: ../src/vikgpslayer.c:322 +msgid "GPS Realtime Tracking" +msgstr "" + +#: ../src/vikgpslayer.c:458 +msgid "Connected" +msgstr "" + +#: ../src/vikgpslayer.c:460 +msgid "Disconnected" +msgstr "" + +#: ../src/vikgpslayer.c:554 +msgid "Unknown GPS Protocol" +msgstr "Ukjent GPS-protokoll" + +#: ../src/vikgpslayer.c:572 +msgid "Unknown serial port device" +msgstr "" + +#: ../src/vikgpslayer.c:691 +#, c-format +msgid "%s: unknown parameter" +msgstr "%s: ukjent parameter" + +#. Now with icons +#: ../src/vikgpslayer.c:794 +msgid "_Upload to GPS" +msgstr "" + +#: ../src/vikgpslayer.c:800 +msgid "Download from _GPS" +msgstr "" + +#: ../src/vikgpslayer.c:821 +msgid "Empty _Realtime" +msgstr "" + +#: ../src/vikgpslayer.c:828 +msgid "E_mpty Upload" +msgstr "" + +#: ../src/vikgpslayer.c:834 +msgid "_Empty Download" +msgstr "" + +#: ../src/vikgpslayer.c:840 +msgid "Empty _All" +msgstr "" + +#: ../src/vikgpslayer.c:852 +#, c-format +msgid "Unexpected number of disconnected handlers: %d" +msgstr "" + +#: ../src/vikgpslayer.c:995 +#, c-format +msgid "Uploading %d waypoint..." +msgid_plural "Uploading %d waypoints..." +msgstr[0] "Laster opp %d waypoint..." + +#: ../src/vikgpslayer.c:1000 +#, c-format +msgid "Uploading %d trackpoint..." +msgid_plural "Uploading %d trackpoints..." +msgstr[0] "" +msgstr[1] "" + +#: ../src/vikgpslayer.c:1005 +#, c-format +msgid "Uploading %d routepoint..." +msgid_plural "Uploading %d routepoints..." +msgstr[0] "" +msgstr[1] "" + +#: ../src/vikgpslayer.c:1034 +#, c-format +msgid "Downloaded %d out of %d waypoint..." +msgid_plural "Downloaded %d out of %d waypoints..." +msgstr[0] "" +msgstr[1] "" + +#: ../src/vikgpslayer.c:1040 +#, c-format +msgid "Downloaded %d out of %d trackpoint..." +msgid_plural "Downloaded %d out of %d trackpoints..." +msgstr[0] "" +msgstr[1] "" + +#: ../src/vikgpslayer.c:1046 +#, c-format +msgid "Downloaded %d out of %d routepoint..." +msgid_plural "Downloaded %d out of %d routepoints..." +msgstr[0] "" +msgstr[1] "" + +#: ../src/vikgpslayer.c:1056 +#, c-format +msgid "Uploaded %d out of %d waypoint..." +msgid_plural "Uploaded %d out of %d waypoints..." +msgstr[0] "" +msgstr[1] "" + +#: ../src/vikgpslayer.c:1062 +#, c-format +msgid "Uploaded %d out of %d trackpoint..." +msgid_plural "Uploaded %d out of %d trackpoints..." +msgstr[0] "" +msgstr[1] "" + +#: ../src/vikgpslayer.c:1068 +#, c-format +msgid "Uploaded %d out of %d routepoint..." +msgid_plural "Uploaded %d out of %d routepoints..." +msgstr[0] "" +msgstr[1] "" + +#: ../src/vikgpslayer.c:1079 +#, c-format +msgid "Downloaded %d waypoint" +msgid_plural "Downloaded %d waypoints" +msgstr[0] "" +msgstr[1] "" + +#: ../src/vikgpslayer.c:1085 +#, c-format +msgid "Downloaded %d trackpoint" +msgid_plural "Downloaded %d trackpoints" +msgstr[0] "" +msgstr[1] "" + +#: ../src/vikgpslayer.c:1091 +#, c-format +msgid "Downloaded %d routepoint" +msgid_plural "Downloaded %d routepoints" +msgstr[0] "" +msgstr[1] "" + +#: ../src/vikgpslayer.c:1101 +#, c-format +msgid "Uploaded %d waypoint" +msgid_plural "Uploaded %d waypoints" +msgstr[0] "" +msgstr[1] "" + +#: ../src/vikgpslayer.c:1107 +#, c-format +msgid "Uploaded %d trackpoint" +msgid_plural "Uploaded %d trackpoints" +msgstr[0] "" +msgstr[1] "" + +#: ../src/vikgpslayer.c:1113 +#, c-format +msgid "Uploaded %d routepoint" +msgid_plural "Uploaded %d routepoints" +msgstr[0] "" +msgstr[1] "" + +#: ../src/vikgpslayer.c:1363 +msgid "Error: No result." +msgstr "" + +#: ../src/vikgpslayer.c:1471 +msgid "Warning - GPS Upload items may overwrite each other" +msgstr "" + +#: ../src/vikgpslayer.c:1506 +msgid "Status: detecting gpsbabel" +msgstr "" + +#: ../src/vikgpslayer.c:1533 +msgid "No GPS items selected for transfer." +msgstr "" + +#: ../src/vikgpslayer.c:1546 +msgid "Could not turn off device." +msgstr "" + +#: ../src/vikgpslayer.c:1589 +msgid "Are you sure you want to delete GPS Upload data?" +msgstr "" + +#: ../src/vikgpslayer.c:1602 +msgid "Are you sure you want to delete GPS Download data?" +msgstr "" + +#: ../src/vikgpslayer.c:1616 +msgid "Are you sure you want to delete GPS Realtime data?" +msgstr "" + +#: ../src/vikgpslayer.c:1630 +msgid "Are you sure you want to delete All GPS data?" +msgstr "" + +#: ../src/vikgpslayer.c:2004 +#, c-format +msgid "" +"Failed to connect to gpsd at %s (port %s)\n" +"Should Viking keep trying (every %d seconds)?" +msgstr "" + +#: ../src/viklayerspanel.c:73 +msgid "C_ut" +msgstr "" + +#: ../src/viklayerspanel.c:74 ../src/vikwindow.c:4882 +msgid "_Copy" +msgstr "_Kopier" + +#: ../src/viklayerspanel.c:75 ../src/vikwindow.c:4883 +msgid "_Paste" +msgstr "_Lim inn" + +#: ../src/viklayerspanel.c:76 ../src/vikwindow.c:4884 +msgid "_Delete" +msgstr "Sle_tt" + +#: ../src/viklayerspanel.c:154 +msgid "New Layer" +msgstr "" + +#: ../src/viklayerspanel.c:347 +msgid "Top Layer" +msgstr "" + +#: ../src/viklayerspanel.c:363 +msgid "Add new layer" +msgstr "" + +#: ../src/viklayerspanel.c:370 ../src/vikwindow.c:4884 +msgid "Remove selected layer" +msgstr "" + +#: ../src/viklayerspanel.c:377 +msgid "Move selected layer up" +msgstr "" + +#: ../src/viklayerspanel.c:384 +msgid "Move selected layer down" +msgstr "" + +#: ../src/viklayerspanel.c:391 ../src/vikwindow.c:4881 +msgid "Cut selected layer" +msgstr "" + +#: ../src/viklayerspanel.c:398 ../src/vikwindow.c:4882 +msgid "Copy selected layer" +msgstr "" + +#: ../src/viklayerspanel.c:405 ../src/vikwindow.c:4883 +msgid "" +"Paste layer into selected container layer or otherwise above selected layer" +msgstr "" + +#: ../src/viklayerspanel.c:502 +msgid "New name can not be blank." +msgstr "" + +#: ../src/viklayerspanel.c:751 +msgid "Aggregate Layers have no settable properties." +msgstr "" + +#: ../src/viklayerspanel.c:798 +msgid "You cannot cut the Top Layer." +msgstr "Du kan ikke klippe ut øverste lag" + +#: ../src/viklayerspanel.c:843 +#, c-format +msgid "Are you sure you want to delete %s?" +msgstr "" + +#: ../src/viklayerspanel.c:863 +msgid "You cannot delete the Top Layer." +msgstr "Du kan ikke slette øverste lag" + +#: ../src/vikmapniklayer.c:78 +msgid "CSS (MML) Config File:" +msgstr "" + +#: ../src/vikmapniklayer.c:79 +msgid "CartoCSS configuration file" +msgstr "" + +#: ../src/vikmapniklayer.c:80 +msgid "XML Config File:" +msgstr "" + +#: ../src/vikmapniklayer.c:81 +msgid "Mapnik XML configuration file" +msgstr "" + +#: ../src/vikmapniklayer.c:84 +msgid "Use File Cache:" +msgstr "" + +#: ../src/vikmapniklayer.c:86 +msgid "File Cache Directory:" +msgstr "" + +#: ../src/vikmapniklayer.c:122 +msgid "_Mapnik Features" +msgstr "" + +#: ../src/vikmapniklayer.c:122 +msgid "Mapnik Features" +msgstr "" + +#: ../src/vikmapniklayer.c:140 +msgid "Mapnik Rendering" +msgstr "" + +#. Changing these values only applies before first mapnik layer is 'created' +#: ../src/vikmapniklayer.c:258 +msgid "Plugins Directory:" +msgstr "" + +#: ../src/vikmapniklayer.c:258 ../src/vikmapniklayer.c:259 +#: ../src/vikmapniklayer.c:260 ../src/vikmapniklayer.c:261 +msgid "You need to restart Viking for a change to this value to be used" +msgstr "" + +#: ../src/vikmapniklayer.c:259 +msgid "Fonts Directory:" +msgstr "" + +#: ../src/vikmapniklayer.c:260 +msgid "Recurse Fonts Directory:" +msgstr "" + +#: ../src/vikmapniklayer.c:261 +msgid "Rerender Timeout (hours):" +msgstr "" + +#. Changeable any time +#: ../src/vikmapniklayer.c:263 +msgid "CartoCSS:" +msgstr "" + +#: ../src/vikmapniklayer.c:263 +msgid "The program to convert CartoCSS files into Mapnik XML" +msgstr "" + +#: ../src/vikmapniklayer.c:506 +msgid "Running" +msgstr "" + +#: ../src/vikmapniklayer.c:525 +#, c-format +msgid "" +"Error running carto command:\n" +"%s" +msgstr "" + +#: ../src/vikmapniklayer.c:561 +msgid " completed in " +msgstr "" + +#: ../src/vikmapniklayer.c:561 +msgid "seconds" +msgstr "" + +#: ../src/vikmapniklayer.c:611 ../src/vikmapniklayer.c:979 +#, c-format +msgid "" +"Mapnik error loading configuration file:\n" +"%s" +msgstr "" + +#: ../src/vikmapniklayer.c:749 +#, c-format +msgid "Mapnik Render %d:%d:%d %s" +msgstr "" + +#: ../src/vikmapniklayer.c:840 +msgid "Mapnik Rendering must be in Mercator mode" +msgstr "" + +#: ../src/vikmapniklayer.c:997 +msgid "Mapnik Information" +msgstr "" + +#: ../src/vikmapniklayer.c:1031 +msgid "_Flush Memory Cache" +msgstr "" + +#: ../src/vikmapniklayer.c:1044 +msgid "_Run Carto Command" +msgstr "" + +#: ../src/vikmapniklayer.c:1102 ../src/vikmapslayer.c:2029 +#, c-format +msgid "Tile File Timestamp: %s" +msgstr "" + +#: ../src/vikmapniklayer.c:1105 ../src/vikmapslayer.c:2032 +msgid "Tile File Timestamp: Not Available" +msgstr "" + +#: ../src/vikmapniklayer.c:1120 +#, c-format +msgid "Rendering time %.2f seconds" +msgstr "" + +#: ../src/vikmapniklayer.c:1124 ../src/vikmapslayer.c:2042 +msgid "Tile Information" +msgstr "" + +#: ../src/vikmapniklayer.c:1145 +msgid "_Rerender Tile" +msgstr "" + +#: ../src/vikmapniklayer.c:1150 +msgid "_Info" +msgstr "" + +#. ******* MAPZOOMS ******** +#: ../src/vikmapslayer.c:96 +msgid "Use Viking Zoom Level" +msgstr "" + +#: ../src/vikmapslayer.c:146 +msgid "OSM" +msgstr "" + +#. NB mode => id - But can't break file format just to rename something better +#: ../src/vikmapslayer.c:152 +msgid "Map Type:" +msgstr "Karttype:" + +#: ../src/vikmapslayer.c:153 +msgid "Maps Directory:" +msgstr "" + +#: ../src/vikmapslayer.c:154 +msgid "Cache Layout:" +msgstr "" + +#: ../src/vikmapslayer.c:155 +msgid "This determines the tile storage layout on disk" +msgstr "" + +#: ../src/vikmapslayer.c:156 +msgid "Map File:" +msgstr "" + +#: ../src/vikmapslayer.c:157 +msgid "An MBTiles file. Only applies when the map type method is 'MBTiles'" +msgstr "" + +#: ../src/vikmapslayer.c:159 +msgid "Control the Alpha value for transparency effects" +msgstr "" + +#: ../src/vikmapslayer.c:160 +msgid "Autodownload maps:" +msgstr "" + +#: ../src/vikmapslayer.c:161 +msgid "Autodownload Only Gets Missing Maps:" +msgstr "" + +#: ../src/vikmapslayer.c:162 +msgid "" +"Using this option avoids attempting to update already acquired tiles. This " +"can be useful if you want to restrict the network usage, without having to " +"resort to manual control. Only applies when 'Autodownload Maps' is on." +msgstr "" + +#: ../src/vikmapslayer.c:163 +msgid "Zoom Level:" +msgstr "Zoomnivå:" + +#: ../src/vikmapslayer.c:164 +msgid "" +"Determines the method of displaying map tiles for the current zoom level. " +"'Viking Zoom Level' uses the best matching level, otherwise setting a fixed " +"value will always use map tiles of the specified value regardless of the " +"actual zoom level." +msgstr "" + +#: ../src/vikmapslayer.c:197 +msgid "_Maps Download" +msgstr "" + +#: ../src/vikmapslayer.c:197 +msgid "Maps Download" +msgstr "" + +#: ../src/vikmapslayer.c:213 ../src/vikutils.c:895 +msgid "Map" +msgstr "Kart" + +#: ../src/vikmapslayer.c:306 +msgid "Default map layer directory:" +msgstr "" + +#: ../src/vikmapslayer.c:306 +msgid "Choose a directory to store cached Map tiles for this layer" +msgstr "" + +#: ../src/vikmapslayer.c:436 ../src/vikmapslayer.c:633 +msgid "Unknown map type" +msgstr "Ukjent karttype" + +#: ../src/vikmapslayer.c:664 +msgid "Unknown Map Zoom" +msgstr "Ukjent kartzoom" + +#: ../src/vikmapslayer.c:833 +#, c-format +msgid "Failed to open MBTiles file: %s" +msgstr "" + +#: ../src/vikmapslayer.c:856 +#, c-format +msgid "" +"New map cannot be displayed in the current drawmode.\n" +"Select \"%s\" from View menu to view it." +msgstr "" + +#: ../src/vikmapslayer.c:1314 +#, c-format +msgid "" +"Cowardly refusing to draw tiles or existence of tiles beyond %d zoom out " +"factor" +msgstr "" + +#. TODO: ?? count up the number of download errors somehow... +#: ../src/vikmapslayer.c:1667 +msgid "Failed to download tile" +msgstr "" + +#: ../src/vikmapslayer.c:1673 +msgid "Unable to save tile" +msgstr "" + +#: ../src/vikmapslayer.c:1799 +#, c-format +msgid "Redownloading up to %d %s map..." +msgid_plural "Redownloading up to %d %s maps..." +msgstr[0] "" +msgstr[1] "" + +#: ../src/vikmapslayer.c:1801 +#, c-format +msgid "Redownloading %d %s map..." +msgid_plural "Redownloading %d %s maps..." +msgstr[0] "" +msgstr[1] "" + +#: ../src/vikmapslayer.c:1805 ../src/vikmapslayer.c:1890 +#, c-format +msgid "Downloading %d %s map..." +msgid_plural "Downloading %d %s maps..." +msgstr[0] "Laster ned %d %s kart..." + +#: ../src/vikmapslayer.c:1969 +msgid "YES" +msgstr "" + +#: ../src/vikmapslayer.c:1973 ../src/vikmapslayer.c:1977 +msgid "NO" +msgstr "" + +#. NB Also handles .jpg automatically due to pixbuf_new_from () support - although just print png for now. +#: ../src/vikmapslayer.c:1980 +#, c-format +msgid "Source: %s (%d%s%d%s%d.%s %s)" +msgstr "" + +#: ../src/vikmapslayer.c:1983 +msgid "Source: Not available" +msgstr "" + +#: ../src/vikmapslayer.c:2000 +msgid "Source: file://" +msgstr "" + +#: ../src/vikmapslayer.c:2012 +#, c-format +msgid "Source: %s" +msgstr "" + +#: ../src/vikmapslayer.c:2038 +#, c-format +msgid "Tile File: %s [Not Available]" +msgstr "" + +#: ../src/vikmapslayer.c:2086 +msgid "Redownload _Bad Map(s)" +msgstr "" + +#: ../src/vikmapslayer.c:2090 +msgid "Redownload _New Map(s)" +msgstr "" + +#: ../src/vikmapslayer.c:2094 +msgid "Redownload _All Map(s)" +msgstr "" + +#: ../src/vikmapslayer.c:2099 +msgid "_Show Tile Information" +msgstr "" + +#: ../src/vikmapslayer.c:2166 +#, c-format +msgid "" +"Wrong drawmode for this map.\n" +"Select \"%s\" from View menu and try again." +msgstr "" + +#: ../src/vikmapslayer.c:2171 +msgid "Wrong zoom level for this map." +msgstr "Feil zoomnviå for dette kartet." + +#: ../src/vikmapslayer.c:2334 +msgid "Zoom Start:" +msgstr "" + +#: ../src/vikmapslayer.c:2341 +msgid "Zoom End:" +msgstr "" + +#: ../src/vikmapslayer.c:2347 +msgid "Download Maps Method:" +msgstr "" + +#. redownload method - needs to align with REDOWNLOAD* macro values +#: ../src/vikmapslayer.c:2419 +msgid "Missing" +msgstr "" + +#: ../src/vikmapslayer.c:2419 +msgid "Bad" +msgstr "" + +#: ../src/vikmapslayer.c:2419 +msgid "New" +msgstr "" + +#: ../src/vikmapslayer.c:2419 +msgid "Reload All" +msgstr "" + +#: ../src/vikmapslayer.c:2421 +msgid "Download for Zoom Levels" +msgstr "" + +#: ../src/vikmapslayer.c:2461 +#, c-format +msgid "" +"You are not allowed to download more than %d tiles in one go (requested %d)" +msgstr "" + +#: ../src/vikmapslayer.c:2469 +#, c-format +msgid "Do you really want to download %d tiles?" +msgstr "" + +#. Now with icons +#: ../src/vikmapslayer.c:2509 +msgid "Download _Missing Onscreen Maps" +msgstr "" + +#: ../src/vikmapslayer.c:2516 +msgid "Download _New Onscreen Maps" +msgstr "" + +#: ../src/vikmapslayer.c:2523 +msgid "Reload _All Onscreen Maps" +msgstr "" + +#: ../src/vikmapslayer.c:2529 +msgid "Download Maps in _Zoom Levels..." +msgstr "" + +#: ../src/vikmapslayer.c:2539 +#, fuzzy +msgid "_Open MBTiles Files" +msgstr "Åpne en fil" + +#: ../src/vikmapslayer.c:2554 +msgid "Flush Map Cache" +msgstr "" + +#: ../src/vikrouting.c:54 +msgid "Default engine:" +msgstr "" + +#: ../src/vikrouting.c:68 +msgid "Routing" +msgstr "" + +#: ../src/viktreeview.c:347 +msgid "Layer Name" +msgstr "Navn på lag" + +#: ../src/viktreeview.c:924 +#, c-format +msgid "delete data from %s\n" +msgstr "slett data fra %s\n" + +#: ../src/viktrwlayer.c:427 +msgid "Create _Waypoint" +msgstr "" + +#: ../src/viktrwlayer.c:427 +msgid "Create Waypoint" +msgstr "Opprett Waypoint" + +#: ../src/viktrwlayer.c:437 +#, fuzzy +msgid "Edit _Track" +msgstr "Legg til spor" + +#: ../src/viktrwlayer.c:437 +#, fuzzy +msgid "Edit Track" +msgstr "Legg til spor" + +#: ../src/viktrwlayer.c:449 +msgid "Edit _Route" +msgstr "" + +#: ../src/viktrwlayer.c:449 +#, fuzzy +msgid "Edit Route" +msgstr "Rediger Waypoint" + +#: ../src/viktrwlayer.c:460 +msgid "Route _Finder" +msgstr "" + +#: ../src/viktrwlayer.c:460 +msgid "Route Finder" +msgstr "" + +#: ../src/viktrwlayer.c:471 +#, fuzzy +msgid "Splitter" +msgstr "Del her" + +#: ../src/viktrwlayer.c:482 +msgid "_Edit Waypoint" +msgstr "" + +#: ../src/viktrwlayer.c:482 +msgid "Edit Waypoint" +msgstr "Rediger Waypoint" + +#: ../src/viktrwlayer.c:495 +msgid "Edit Trac_kpoint" +msgstr "" + +#: ../src/viktrwlayer.c:495 +msgid "Edit Trackpoint" +msgstr "" + +#. a pixbuf for this one is already made globally available +#: ../src/viktrwlayer.c:508 +msgid "Show P_icture" +msgstr "" + +#: ../src/viktrwlayer.c:508 +msgid "Show Picture" +msgstr "Vis bilde" + +#: ../src/viktrwlayer.c:531 +msgid "Waypoint Images" +msgstr "" + +#: ../src/viktrwlayer.c:531 +msgid "Tracks Advanced" +msgstr "" + +#: ../src/viktrwlayer.c:531 +msgid "Metadata" +msgstr "" + +#: ../src/viktrwlayer.c:531 +msgid "Filesystem" +msgstr "" + +#: ../src/viktrwlayer.c:534 +msgid "Draw by Track" +msgstr "" + +#: ../src/viktrwlayer.c:534 +msgid "Draw by Speed" +msgstr "" + +#: ../src/viktrwlayer.c:534 +msgid "All Tracks Same Color" +msgstr "" + +#: ../src/viktrwlayer.c:535 +msgid "Filled Square" +msgstr "" + +#: ../src/viktrwlayer.c:535 +msgid "Square" +msgstr "" + +#: ../src/viktrwlayer.c:535 +msgid "Circle" +msgstr "Sirkel" + +#: ../src/viktrwlayer.c:535 +msgid "X" +msgstr "" + +#: ../src/viktrwlayer.c:561 +msgid "Extra Extra Small" +msgstr "" + +#: ../src/viktrwlayer.c:562 +msgid "Extra Small" +msgstr "" + +#: ../src/viktrwlayer.c:566 +msgid "Extra Large" +msgstr "" + +#: ../src/viktrwlayer.c:567 +msgid "Extra Extra Large" +msgstr "" + +#: ../src/viktrwlayer.c:573 +msgid "Name Ascending" +msgstr "" + +#: ../src/viktrwlayer.c:574 +msgid "Name Descending" +msgstr "" + +#: ../src/viktrwlayer.c:582 ../src/viktrwlayer_propwin.c:3319 +msgid "No" +msgstr "" + +#: ../src/viktrwlayer.c:583 +msgid "Yes" +msgstr "" + +#: ../src/viktrwlayer.c:584 +msgid "No write" +msgstr "" + +#: ../src/viktrwlayer.c:649 ../src/viktrwlayer.c:673 +msgid "Draw Labels" +msgstr "Tegn etiketter" + +#: ../src/viktrwlayer.c:650 +msgid "Note: the individual track controls what labels may be displayed" +msgstr "" + +#: ../src/viktrwlayer.c:651 +msgid "Track Labels Font Size:" +msgstr "" + +#: ../src/viktrwlayer.c:652 +msgid "Track Drawing Mode:" +msgstr "" + +#: ../src/viktrwlayer.c:653 +msgid "All Tracks Color:" +msgstr "" + +#: ../src/viktrwlayer.c:654 +msgid "The color used when 'All Tracks Same Color' drawing mode is selected" +msgstr "" + +#: ../src/viktrwlayer.c:655 +msgid "Draw Track Lines" +msgstr "" + +#: ../src/viktrwlayer.c:656 +msgid "Track Thickness:" +msgstr "Sportykkelse:" + +#: ../src/viktrwlayer.c:657 +msgid "Draw Track Direction" +msgstr "" + +#: ../src/viktrwlayer.c:658 +msgid "Direction Size:" +msgstr "" + +#: ../src/viktrwlayer.c:659 +msgid "Draw Trackpoints" +msgstr "" + +#: ../src/viktrwlayer.c:660 +msgid "Trackpoint Size:" +msgstr "" + +#: ../src/viktrwlayer.c:661 +msgid "Draw Elevation" +msgstr "" + +#: ../src/viktrwlayer.c:662 +msgid "Draw Elevation Height %:" +msgstr "" + +#: ../src/viktrwlayer.c:663 +msgid "Draw Stops" +msgstr "" + +#: ../src/viktrwlayer.c:664 +msgid "" +"Whether to draw a marker when trackpoints are at the same position but over " +"the minimum stop length apart in time" +msgstr "" + +#: ../src/viktrwlayer.c:665 +msgid "Min Stop Length (seconds):" +msgstr "" + +#: ../src/viktrwlayer.c:667 +msgid "Track BG Thickness:" +msgstr "" + +#: ../src/viktrwlayer.c:668 +msgid "Track Background Color" +msgstr "Bakgrunnsfarge på spor" + +#: ../src/viktrwlayer.c:669 +msgid "Draw by Speed Factor (%):" +msgstr "" + +#: ../src/viktrwlayer.c:670 +msgid "" +"The percentage factor away from the average speed determining the color used" +msgstr "" + +#: ../src/viktrwlayer.c:671 +msgid "Track Sort Order:" +msgstr "" + +#: ../src/viktrwlayer.c:674 +msgid "Waypoint Font Size:" +msgstr "" + +#: ../src/viktrwlayer.c:675 +msgid "Waypoint Color:" +msgstr "" + +#: ../src/viktrwlayer.c:676 +msgid "Waypoint Text:" +msgstr "" + +#: ../src/viktrwlayer.c:677 +msgid "Background:" +msgstr "Bakgrunn:" + +#: ../src/viktrwlayer.c:678 +msgid "Fake BG Color Translucency:" +msgstr "" + +#: ../src/viktrwlayer.c:679 +msgid "Waypoint marker:" +msgstr "" + +#: ../src/viktrwlayer.c:680 +msgid "Waypoint size:" +msgstr "" + +#: ../src/viktrwlayer.c:681 +msgid "Draw Waypoint Symbols:" +msgstr "" + +#: ../src/viktrwlayer.c:682 +msgid "Waypoint Sort Order:" +msgstr "" + +#: ../src/viktrwlayer.c:684 +msgid "Draw Waypoint Images" +msgstr "" + +#: ../src/viktrwlayer.c:685 +msgid "Image Size (pixels):" +msgstr "" + +#: ../src/viktrwlayer.c:686 +msgid "Image Alpha:" +msgstr "" + +#: ../src/viktrwlayer.c:687 +msgid "Image Memory Cache Size:" +msgstr "" + +#: ../src/viktrwlayer.c:690 +msgid "Author" +msgstr "" + +#: ../src/viktrwlayer.c:691 +msgid "Creation Time" +msgstr "" + +#: ../src/viktrwlayer.c:692 +msgid "Keywords" +msgstr "" + +#: ../src/viktrwlayer.c:693 +msgid "External layer:" +msgstr "" + +#: ../src/viktrwlayer.c:693 +msgid "" +"Layer data stored in the Viking file, in an external file, or in an external " +"file but changes are not written to the file (file only loaded at startup)" +msgstr "" + +#: ../src/viktrwlayer.c:694 +msgid "Save layer as:" +msgstr "" + +#: ../src/viktrwlayer.c:694 +msgid "Specify where layer should be saved. Overwrites file if it exists." +msgstr "" + +#: ../src/viktrwlayer.c:798 +msgid "TrackWaypoint" +msgstr "" + +#: ../src/viktrwlayer.c:1999 ../src/viktrwlayer_propwin.c:1469 +#: ../src/viktrwlayer_propwin.c:1471 ../src/vikutils.c:299 +#: ../src/vikutils.c:326 +msgid "miles" +msgstr "" + +#: ../src/viktrwlayer.c:2002 ../src/viktrwlayer_propwin.c:1475 +#: ../src/viktrwlayer_propwin.c:1477 ../src/vikutils.c:303 +#: ../src/vikutils.c:330 +msgid "NM" +msgstr "" + +#. VIK_UNITS_DISTANCE_KILOMETRES: +#: ../src/viktrwlayer.c:2006 ../src/viktrwlayer_propwin.c:1482 +#: ../src/viktrwlayer_propwin.c:1484 ../src/vikutils.c:308 +#: ../src/vikutils.c:335 +msgid "km" +msgstr "" + +#: ../src/viktrwlayer.c:2121 +msgid "start/end" +msgstr "" + +#: ../src/viktrwlayer.c:2133 +msgid "start" +msgstr "" + +#: ../src/viktrwlayer.c:2142 +msgid "end" +msgstr "" + +#: ../src/viktrwlayer.c:3103 +#, c-format +msgid " in %d:%02d hrs:mins" +msgstr "" + +#: ../src/viktrwlayer.c:3107 +#, c-format +msgid "" +"\n" +"%sTotal Length %.1f %s%s" +msgstr "" + +#: ../src/viktrwlayer.c:3131 +#, c-format +msgid "" +"\n" +"Total route length %.1f %s" +msgstr "" + +#: ../src/viktrwlayer.c:3136 +#, c-format +msgid "Tracks: %d - Waypoints: %d - Routes: %d%s%s" +msgstr "" + +#: ../src/viktrwlayer.c:3155 +#, c-format +msgid "Tracks: %d" +msgstr "" + +#: ../src/viktrwlayer.c:3165 +#, c-format +msgid "Routes: %d" +msgstr "" + +#: ../src/viktrwlayer.c:3195 +#, c-format +msgid "- %d:%02d hrs:mins" +msgstr "" + +#: ../src/viktrwlayer.c:3202 +#, c-format +msgid "%s%.1f km %s" +msgstr "" + +#: ../src/viktrwlayer.c:3205 +#, c-format +msgid "%s%.1f miles %s" +msgstr "" + +#: ../src/viktrwlayer.c:3208 +#, c-format +msgid "%s%.1f NM %s" +msgstr "" + +#: ../src/viktrwlayer.c:3222 +#, c-format +msgid "Waypoints: %d" +msgstr "" + +#: ../src/viktrwlayer.c:3279 +#, c-format +msgid "Wpt: Alt %dft" +msgstr "" + +#. VIK_UNITS_HEIGHT_METRES: +#: ../src/viktrwlayer.c:3283 +#, c-format +msgid "Wpt: Alt %dm" +msgstr "" + +#. Add comment if available +#: ../src/viktrwlayer.c:3298 +#, c-format +msgid "%s | %s %s | Comment: %s" +msgstr "" + +#: ../src/viktrwlayer.c:3300 +#, c-format +msgid "%s | %s %s" +msgstr "" + +#: ../src/viktrwlayer.c:3562 ../src/viktrwlayer.c:3591 +msgid "This layer has no waypoints or trackpoints." +msgstr "" + +#: ../src/viktrwlayer.c:3598 ../src/viktrwlayer.c:3607 +#: ../src/viktrwlayer.c:3616 ../src/viktrwlayer.c:3625 +#: ../src/viktrwlayer.c:3634 ../src/viktrwlayer.c:3642 +msgid "Export Layer" +msgstr "Eksporter lag" + +#: ../src/viktrwlayer.c:3671 +msgid "Export Route as GPX" +msgstr "" + +#: ../src/viktrwlayer.c:3673 +msgid "Export Track as GPX" +msgstr "" + +#: ../src/viktrwlayer.c:3693 +msgid "Find" +msgstr "" + +#: ../src/viktrwlayer.c:3703 +msgid "Waypoint Name:" +msgstr "" + +#: ../src/viktrwlayer.c:3720 +msgid "Waypoint not found in this layer." +msgstr "" + +#: ../src/viktrwlayer.c:3989 +msgid "Can not upload invisible track." +msgstr "" + +#: ../src/viktrwlayer.c:4082 ../src/viktrwlayer.c:10512 +msgid "Track" +msgstr "" + +#: ../src/viktrwlayer.c:4107 ../src/viktrwlayer.c:10599 +msgid "Route" +msgstr "" + +#: ../src/viktrwlayer.c:4194 +msgid "Externa_l" +msgstr "" + +#: ../src/viktrwlayer.c:4216 ../src/viktrwlayer.c:8456 +#: ../src/viktrwlayer.c:8574 +msgid "_Finish Route" +msgstr "" + +#: ../src/viktrwlayer.c:4218 ../src/viktrwlayer.c:8380 +#: ../src/viktrwlayer.c:8572 +msgid "_Finish Track" +msgstr "" + +#. Now with icons +#: ../src/viktrwlayer.c:4230 +msgid "_View Layer" +msgstr "" + +#: ../src/viktrwlayer.c:4237 +msgid "V_iew" +msgstr "" + +#: ../src/viktrwlayer.c:4243 +msgid "View All _Tracks" +msgstr "" + +#: ../src/viktrwlayer.c:4248 +msgid "View All _Routes" +msgstr "" + +#: ../src/viktrwlayer.c:4253 +msgid "View All _Waypoints" +msgstr "" + +#: ../src/viktrwlayer.c:4258 +msgid "_Goto Center of Layer" +msgstr "" + +#: ../src/viktrwlayer.c:4264 ../src/viktrwlayer.c:8321 +msgid "Goto _Waypoint..." +msgstr "" + +#: ../src/viktrwlayer.c:4270 +msgid "_Export Layer" +msgstr "" + +#: ../src/viktrwlayer.c:4276 +msgid "Export as GPS_Point..." +msgstr "" + +#: ../src/viktrwlayer.c:4281 +msgid "Export as GPS_Mapper..." +msgstr "" + +#: ../src/viktrwlayer.c:4286 +msgid "Export as _GPX..." +msgstr "" + +#: ../src/viktrwlayer.c:4292 +msgid "Export as _KML..." +msgstr "" + +#: ../src/viktrwlayer.c:4299 +msgid "Export as GEO_JSON..." +msgstr "" + +#: ../src/viktrwlayer.c:4306 +msgid "Export via GPSbabel..." +msgstr "" + +#: ../src/viktrwlayer.c:4312 +#, c-format +msgid "Open with External Program_1: %s" +msgstr "" + +#: ../src/viktrwlayer.c:4319 +#, c-format +msgid "Open with External Program_2: %s" +msgstr "" + +#: ../src/viktrwlayer.c:4327 ../src/vikwindow.c:4825 +msgid "_New" +msgstr "_Ny" + +#: ../src/viktrwlayer.c:4333 +msgid "New _Waypoint..." +msgstr "" + +#: ../src/viktrwlayer.c:4339 +msgid "New _Track" +msgstr "" + +#: ../src/viktrwlayer.c:4347 +msgid "New _Route" +msgstr "" + +#: ../src/viktrwlayer.c:4356 ../src/viktrwlayer.c:8232 +#: ../src/viktrwlayer.c:9003 +msgid "Geotag _Images..." +msgstr "" + +#: ../src/viktrwlayer.c:4363 +msgid "_Acquire" +msgstr "" + +#: ../src/viktrwlayer.c:4369 ../src/vikwindow.c:4904 +msgid "From _GPS..." +msgstr "Fra _GPS..." + +#. FIXME: only add menu when at least a routing engine has support for Directions +#: ../src/viktrwlayer.c:4375 +msgid "From _Directions..." +msgstr "" + +#: ../src/viktrwlayer.c:4381 +msgid "From _OSM Traces..." +msgstr "" + +#: ../src/viktrwlayer.c:4386 +msgid "From _My OSM Traces..." +msgstr "" + +#: ../src/viktrwlayer.c:4392 ../src/vikwindow.c:4844 +msgid "From _URL..." +msgstr "" + +#: ../src/viktrwlayer.c:4399 ../src/vikwindow.c:4846 +msgid "From _Wikipedia Waypoints" +msgstr "" + +#: ../src/viktrwlayer.c:4405 +msgid "Within _Layer Bounds" +msgstr "" + +#: ../src/viktrwlayer.c:4411 +msgid "Within _Current View" +msgstr "" + +#: ../src/viktrwlayer.c:4419 +msgid "From Geo_caching..." +msgstr "" + +#: ../src/viktrwlayer.c:4426 ../src/vikwindow.c:4842 +msgid "From Geotagged _Images..." +msgstr "" + +#: ../src/viktrwlayer.c:4433 +msgid "From _File..." +msgstr "" + +#: ../src/viktrwlayer.c:4436 ../src/vikwindow.c:4905 +msgid "Import File With GPS_Babel..." +msgstr "" + +#: ../src/viktrwlayer.c:4443 ../src/viktrwlayer.c:8905 +msgid "_Upload" +msgstr "" + +#: ../src/viktrwlayer.c:4449 +msgid "Upload to _GPS..." +msgstr "" + +#: ../src/viktrwlayer.c:4456 ../src/viktrwlayer.c:8973 +msgid "Upload to _OSM..." +msgstr "" + +#: ../src/viktrwlayer.c:4464 +msgid "De_lete" +msgstr "" + +#: ../src/viktrwlayer.c:4470 +msgid "Delete All _Tracks" +msgstr "" + +#: ../src/viktrwlayer.c:4477 +msgid "Delete Tracks _From Selection..." +msgstr "" + +#: ../src/viktrwlayer.c:4484 ../src/viktrwlayer.c:8481 +msgid "Delete _All Routes" +msgstr "" + +#: ../src/viktrwlayer.c:4491 ../src/viktrwlayer.c:8487 +msgid "_Delete Routes From Selection..." +msgstr "" + +#: ../src/viktrwlayer.c:4498 +msgid "Delete All _Waypoints" +msgstr "" + +#: ../src/viktrwlayer.c:4505 +msgid "Delete Waypoints From _Selection..." +msgstr "" + +#: ../src/viktrwlayer.c:4512 ../src/viktrwlayer.c:8339 +#, fuzzy +msgid "Delete Duplicate Waypoints" +msgstr "Opprett Waypoint" + +#: ../src/viktrwlayer.c:5198 +#, c-format +msgid "Are you sure you want to delete all tracks in %s?" +msgstr "" + +#: ../src/viktrwlayer.c:5211 +#, c-format +msgid "Are you sure you want to delete all routes in %s?" +msgstr "" + +#: ../src/viktrwlayer.c:5221 +#, c-format +msgid "Are you sure you want to delete all waypoints in %s?" +msgstr "" + +#: ../src/viktrwlayer.c:5238 +#, c-format +msgid "Are you sure you want to delete the waypoint \"%s\"?" +msgstr "" + +#: ../src/viktrwlayer.c:5254 +#, c-format +msgid "Are you sure you want to delete the track \"%s\"?" +msgstr "" + +#: ../src/viktrwlayer.c:5271 +#, c-format +msgid "Are you sure you want to delete the route \"%s\"?" +msgstr "" + +#: ../src/viktrwlayer.c:5527 ../src/viktrwlayer.c:6373 +msgid "" +"Converting a track to a route removes extra track data such as segments, " +"timestamps, etc...\n" +"Do you want to continue?" +msgstr "" + +#: ../src/viktrwlayer.c:5631 +msgid "No DEM layers available, thus no DEM values can be applied." +msgstr "" + +#: ../src/viktrwlayer.c:5651 ../src/viktrwlayer.c:5692 +#, c-format +msgid "%ld point adjusted" +msgid_plural "%ld points adjusted" +msgstr[0] "" +msgstr[1] "" + +#: ../src/viktrwlayer.c:5736 +#, c-format +msgid "%ld waypoint changed" +msgid_plural "%ld waypoints changed" +msgstr[0] "" +msgstr[1] "" + +#: ../src/viktrwlayer.c:5917 +#, c-format +msgid "" +"Refining a track with many points (%d) is unlikely to yield sensible " +"results. Do you want to Continue?" +msgstr "" + +#. Select engine from dialog +#: ../src/viktrwlayer.c:5925 +msgid "Refine Route with Routing Engine..." +msgstr "" + +#: ../src/viktrwlayer.c:5933 +msgid "Select routing engine" +msgstr "" + +#: ../src/viktrwlayer.c:6158 +msgid "Failed. No other tracks with timestamps in this layer found" +msgstr "" + +#: ../src/viktrwlayer.c:6160 +msgid "Failed. No other tracks without timestamps in this layer found" +msgstr "" + +#: ../src/viktrwlayer.c:6179 +msgid "Merge with..." +msgstr "" + +#: ../src/viktrwlayer.c:6180 +msgid "Select route to merge with" +msgstr "" + +#: ../src/viktrwlayer.c:6180 +msgid "Select track to merge with" +msgstr "" + +#: ../src/viktrwlayer.c:6264 ../src/viktrwlayer.c:6346 +msgid "Append Route" +msgstr "" + +#: ../src/viktrwlayer.c:6264 ../src/viktrwlayer.c:6346 +msgid "Append Track" +msgstr "" + +#: ../src/viktrwlayer.c:6265 +msgid "Select the route to append after the current route" +msgstr "" + +#: ../src/viktrwlayer.c:6266 +msgid "Select the track to append after the current track" +msgstr "" + +#: ../src/viktrwlayer.c:6347 +msgid "Select the track to append after the current route" +msgstr "" + +#: ../src/viktrwlayer.c:6348 +msgid "Select the route to append after the current track" +msgstr "" + +#: ../src/viktrwlayer.c:6414 +#, c-format +msgid "%d segment merged" +msgid_plural "%d segments merged" +msgstr[0] "" +msgstr[1] "" + +#: ../src/viktrwlayer.c:6430 +msgid "Failed. This track does not have timestamp" +msgstr "" + +#: ../src/viktrwlayer.c:6442 +msgid "Failed. No other track in this layer has timestamp" +msgstr "" + +#: ../src/viktrwlayer.c:6449 +msgid "Merge Threshold..." +msgstr "" + +#: ../src/viktrwlayer.c:6450 +msgid "Merge when time between tracks less than:" +msgstr "" + +#: ../src/viktrwlayer.c:6580 +msgid "Split Threshold..." +msgstr "" + +#: ../src/viktrwlayer.c:6581 +msgid "Split when time between trackpoints exceeds:" +msgstr "" + +#: ../src/viktrwlayer.c:6598 +#, c-format +msgid "" +"Can not split track due to trackpoints not ordered in time - such as at %s.\n" +"\n" +"Goto this trackpoint?" +msgstr "" + +#: ../src/viktrwlayer.c:6668 +msgid "Split Every Nth Point" +msgstr "" + +#: ../src/viktrwlayer.c:6669 +msgid "Split on every Nth point:" +msgstr "" + +#: ../src/viktrwlayer.c:6779 +msgid "Can not split track as it has no segments" +msgstr "" + +#: ../src/viktrwlayer.c:6861 ../src/viktrwlayer.c:6891 +#, c-format +msgid "Deleted %ld point" +msgid_plural "Deleted %ld points" +msgstr[0] "" +msgstr[1] "" + +#: ../src/viktrwlayer.c:6966 ../src/viktrwlayer.c:10989 +#: ../src/viktrwlayer_waypointlist.c:214 +#, c-format +msgid "Could not launch %s to open file." +msgstr "" + +#: ../src/viktrwlayer.c:6992 ../src/viktrwlayer.c:7113 +msgid "This track has no date information." +msgstr "" + +#: ../src/viktrwlayer.c:7006 ../src/viktrwlayer.c:7136 +msgid "This waypoint has no date information." +msgstr "" + +#: ../src/viktrwlayer.c:7030 +#, c-format +msgid "Could not launch %s" +msgstr "" + +#: ../src/viktrwlayer.c:7269 +msgid "Internal Error in vik_trw_layer_uniquify_tracks" +msgstr "" + +#: ../src/viktrwlayer.c:7374 ../src/viktrwlayer.c:7424 +#: ../src/viktrwlayer.c:7587 +msgid "" +"Multiple entries with the same name exist. This method only works with " +"unique names. Force unique names now?" +msgstr "" + +#: ../src/viktrwlayer.c:7385 +msgid "No tracks found" +msgstr "" + +#: ../src/viktrwlayer.c:7393 ../src/viktrwlayer.c:7443 +#: ../src/viktrwlayer.c:7607 +msgid "Delete Selection" +msgstr "" + +#: ../src/viktrwlayer.c:7394 +msgid "Select tracks to delete" +msgstr "" + +#: ../src/viktrwlayer.c:7435 +msgid "No routes found" +msgstr "" + +#: ../src/viktrwlayer.c:7444 +msgid "Select routes to delete" +msgstr "" + +#: ../src/viktrwlayer.c:7550 +msgid "Internal Error in vik_trw_layer_uniquify_waypoints" +msgstr "" + +#: ../src/viktrwlayer.c:7597 +msgid "No waypoints found" +msgstr "" + +#: ../src/viktrwlayer.c:7608 +msgid "Select waypoints to delete" +msgstr "" + +#: ../src/viktrwlayer.c:7691 +#, c-format +msgid "%ld waypoint deleted" +msgid_plural "%ld waypoints deleted" +msgstr[0] "" +msgstr[1] "" + +#: ../src/viktrwlayer.c:7697 +msgid "No duplicates found" +msgstr "" + +#: ../src/viktrwlayer.c:8028 +#, c-format +msgid "" +"A waypoint with the name \"%s\" already exists. Really rename to the same " +"name?" +msgstr "" + +#: ../src/viktrwlayer.c:8058 +#, c-format +msgid "" +"A track with the name \"%s\" already exists. Really rename to the same name?" +msgstr "" + +#: ../src/viktrwlayer.c:8095 +#, c-format +msgid "" +"A route with the name \"%s\" already exists. Really rename to the same name?" +msgstr "" + +#: ../src/viktrwlayer.c:8215 ../src/viktrwlayer.c:8602 +msgid "_Goto" +msgstr "" + +#: ../src/viktrwlayer.c:8226 +msgid "_Visit Geocache Webpage" +msgstr "" + +#: ../src/viktrwlayer.c:8235 +msgid "Geotag multiple images against this waypoint" +msgstr "" + +#: ../src/viktrwlayer.c:8245 ../src/viktrwlayer_waypointlist.c:352 +msgid "_Show Picture..." +msgstr "" + +#: ../src/viktrwlayer.c:8253 +msgid "Update Geotag on _Image" +msgstr "" + +#: ../src/viktrwlayer.c:8259 +msgid "_Update" +msgstr "" + +#: ../src/viktrwlayer.c:8264 +msgid "Update and _Keep File Timestamp" +msgstr "" + +#: ../src/viktrwlayer.c:8276 +msgid "Visit _Webpage" +msgstr "" + +#: ../src/viktrwlayer.c:8306 +msgid "_New Waypoint..." +msgstr "" + +#: ../src/viktrwlayer.c:8315 +msgid "_View All Waypoints" +msgstr "" + +#: ../src/viktrwlayer.c:8327 +msgid "Delete _All Waypoints" +msgstr "" + +#: ../src/viktrwlayer.c:8333 +msgid "_Delete Waypoints From Selection..." +msgstr "" + +#: ../src/viktrwlayer.c:8351 +msgid "_Show All Waypoints" +msgstr "" + +#: ../src/viktrwlayer.c:8357 +msgid "_Hide All Waypoints" +msgstr "" + +#: ../src/viktrwlayer.c:8369 +msgid "_List Waypoints..." +msgstr "" + +#: ../src/viktrwlayer.c:8390 +msgid "_View All Tracks" +msgstr "" + +#: ../src/viktrwlayer.c:8396 +msgid "_New Track" +msgstr "" + +#: ../src/viktrwlayer.c:8404 +msgid "Delete _All Tracks" +msgstr "" + +#: ../src/viktrwlayer.c:8410 +msgid "_Delete Tracks From Selection..." +msgstr "" + +#: ../src/viktrwlayer.c:8422 +msgid "_Show All Tracks" +msgstr "" + +#: ../src/viktrwlayer.c:8428 +msgid "_Hide All Tracks" +msgstr "" + +#: ../src/viktrwlayer.c:8439 +msgid "_List Tracks..." +msgstr "" + +#: ../src/viktrwlayer.c:8467 +msgid "_View All Routes" +msgstr "" + +#: ../src/viktrwlayer.c:8473 +msgid "_New Route" +msgstr "" + +#: ../src/viktrwlayer.c:8499 +msgid "_Show All Routes" +msgstr "" + +#: ../src/viktrwlayer.c:8505 +msgid "_Hide All Routes" +msgstr "" + +#: ../src/viktrwlayer.c:8516 +msgid "_List Routes..." +msgstr "" + +#: ../src/viktrwlayer.c:8587 +msgid "_View Track" +msgstr "" + +#: ../src/viktrwlayer.c:8589 +msgid "_View Route" +msgstr "" + +#: ../src/viktrwlayer.c:8608 +msgid "_Startpoint" +msgstr "" + +#: ../src/viktrwlayer.c:8614 +msgid "\"_Center\"" +msgstr "" + +#: ../src/viktrwlayer.c:8620 +msgid "_Endpoint" +msgstr "" + +#: ../src/viktrwlayer.c:8626 +msgid "_Highest Altitude" +msgstr "" + +#: ../src/viktrwlayer.c:8632 +msgid "_Lowest Altitude" +msgstr "" + +#: ../src/viktrwlayer.c:8640 +msgid "_Maximum Speed" +msgstr "" + +#: ../src/viktrwlayer.c:8646 +msgid "_Date" +msgstr "" + +#: ../src/viktrwlayer.c:8655 +msgid "Co_mbine" +msgstr "" + +#: ../src/viktrwlayer.c:8663 +msgid "_Merge By Time..." +msgstr "" + +#: ../src/viktrwlayer.c:8668 +msgid "Merge _Segments" +msgstr "" + +#: ../src/viktrwlayer.c:8675 +msgid "Merge _With Other Tracks..." +msgstr "" + +#: ../src/viktrwlayer.c:8682 +msgid "_Append Track..." +msgstr "" + +#: ../src/viktrwlayer.c:8684 +msgid "_Append Route..." +msgstr "" + +#: ../src/viktrwlayer.c:8690 +msgid "Append _Route..." +msgstr "" + +#: ../src/viktrwlayer.c:8692 +msgid "Append _Track..." +msgstr "" + +#: ../src/viktrwlayer.c:8699 +msgid "_Split" +msgstr "" + +#: ../src/viktrwlayer.c:8707 +msgid "_Split By Time..." +msgstr "" + +#. ATM always enable this entry - don't want to have to analyse the track before displaying the menu - to keep the menu speedy +#: ../src/viktrwlayer.c:8713 +msgid "Split Se_gments" +msgstr "" + +#: ../src/viktrwlayer.c:8719 +msgid "Split By _Number of Points..." +msgstr "" + +#: ../src/viktrwlayer.c:8724 +msgid "Split at _Trackpoint" +msgstr "" + +#: ../src/viktrwlayer.c:8732 +msgid "_Insert Points" +msgstr "" + +#: ../src/viktrwlayer.c:8738 +msgid "Insert Point _Before Selected Point" +msgstr "" + +#: ../src/viktrwlayer.c:8745 +msgid "Insert Point _After Selected Point" +msgstr "" + +#: ../src/viktrwlayer.c:8754 +msgid "Delete Poi_nts" +msgstr "" + +#: ../src/viktrwlayer.c:8760 +msgid "Delete _Selected Point" +msgstr "" + +#: ../src/viktrwlayer.c:8768 +msgid "Delete Points With The Same _Position" +msgstr "" + +#: ../src/viktrwlayer.c:8773 +msgid "Delete Points With The Same _Time" +msgstr "" + +#: ../src/viktrwlayer.c:8780 ../src/viktrwlayer.c:9029 +msgid "_Transform" +msgstr "" + +#: ../src/viktrwlayer.c:8788 ../src/viktrwlayer.c:9037 +msgid "_Apply DEM Data" +msgstr "" + +#: ../src/viktrwlayer.c:8793 ../src/viktrwlayer.c:9042 +msgid "_Overwrite" +msgstr "" + +#: ../src/viktrwlayer.c:8796 ../src/viktrwlayer.c:9045 +msgid "Overwrite any existing elevation values with DEM values" +msgstr "" + +#: ../src/viktrwlayer.c:8799 ../src/viktrwlayer.c:9048 +msgid "_Keep Existing" +msgstr "" + +#: ../src/viktrwlayer.c:8802 ../src/viktrwlayer.c:9051 +msgid "Keep existing elevation values, only attempt for missing values" +msgstr "" + +#: ../src/viktrwlayer.c:8807 +msgid "_Smooth Missing Elevation Data" +msgstr "" + +#: ../src/viktrwlayer.c:8812 +msgid "_Interpolated" +msgstr "" + +#: ../src/viktrwlayer.c:8815 +msgid "" +"Interpolate between known elevation values to derive values for the missing " +"elevations" +msgstr "" + +#: ../src/viktrwlayer.c:8818 +msgid "_Flat" +msgstr "" + +#: ../src/viktrwlayer.c:8821 +msgid "Set unknown elevation values to the last known value" +msgstr "" + +#: ../src/viktrwlayer.c:8825 +msgid "C_onvert to a Route" +msgstr "" + +#: ../src/viktrwlayer.c:8827 +msgid "C_onvert to a Track" +msgstr "" + +#: ../src/viktrwlayer.c:8835 +msgid "_Anonymize Times" +msgstr "" + +#: ../src/viktrwlayer.c:8838 +msgid "Shift timestamps to a relative offset from 1901-01-01" +msgstr "" + +#: ../src/viktrwlayer.c:8841 +msgid "_Interpolate Times" +msgstr "" + +#: ../src/viktrwlayer.c:8844 +msgid "" +"Reset trackpoint timestamps between the first and last points such that " +"track is traveled at equal speed" +msgstr "" + +#: ../src/viktrwlayer.c:8849 +msgid "_Reverse Track" +msgstr "" + +#: ../src/viktrwlayer.c:8851 +msgid "_Reverse Route" +msgstr "" + +#: ../src/viktrwlayer.c:8858 +msgid "Refine Route..." +msgstr "" + +#: ../src/viktrwlayer.c:8868 +msgid "Down_load Maps Along Track..." +msgstr "" + +#: ../src/viktrwlayer.c:8870 +msgid "Down_load Maps Along Route..." +msgstr "" + +#: ../src/viktrwlayer.c:8878 +msgid "_Export Track as GPX..." +msgstr "" + +#: ../src/viktrwlayer.c:8880 +msgid "_Export Route as GPX..." +msgstr "" + +#: ../src/viktrwlayer.c:8887 +msgid "E_xtend Track End" +msgstr "" + +#: ../src/viktrwlayer.c:8889 +msgid "E_xtend Route End" +msgstr "" + +#: ../src/viktrwlayer.c:8896 +msgid "Extend _Using Route Finder" +msgstr "" + +#: ../src/viktrwlayer.c:8911 +msgid "_Upload to GPS..." +msgstr "" + +#: ../src/viktrwlayer.c:8926 +msgid "_Diary" +msgstr "" + +#: ../src/viktrwlayer.c:8930 +msgid "Open diary program at this date" +msgstr "" + +#: ../src/viktrwlayer.c:8935 +msgid "_Astronomy" +msgstr "" + +#: ../src/viktrwlayer.c:8938 +msgid "Open astronomy program at this date and location" +msgstr "" + +#: ../src/viktrwlayer.c:8962 +msgid "_View Google Directions" +msgstr "" + +#: ../src/viktrwlayer.c:8984 +msgid "Use with _Filter" +msgstr "" + +#: ../src/viktrwlayer.c:9018 +msgid "_Edit Trackpoint" +msgstr "" + +#: ../src/viktrwlayer.c:10116 +#, c-format +msgid " - Gain %dm:Loss %dm" +msgstr "" + +#: ../src/viktrwlayer.c:10118 +#, c-format +msgid " - Gain %dft:Loss %dft" +msgstr "" + +#: ../src/viktrwlayer.c:10123 +#, c-format +msgid " - Bearing %3.1f° - Step %s" +msgstr "" + +#: ../src/viktrwlayer.c:10232 +#, c-format +msgid "Querying %s for route between (%.3f, %.3f) and (%.3f, %.3f)." +msgstr "" + +#: ../src/viktrwlayer.c:10248 +#, c-format +msgid "%s returned route between (%.3f, %.3f) and (%.3f, %.3f)." +msgstr "" + +#: ../src/viktrwlayer.c:10251 +#, c-format +msgid "Error getting route from %s." +msgstr "" + +#: ../src/viktrwlayer.c:11070 +#, c-format +msgid "Creating %d Image Thumbnails..." +msgstr "" + +#: ../src/viktrwlayer.c:11560 +msgid "No map layer in use. Create one first" +msgstr "Ingen kartlag i bruk. Opprett ett først" + +#: ../src/viktrwlayer.c:11679 +#, c-format +msgid "%s: Track List" +msgstr "" + +#: ../src/viktrwlayer.c:11681 +#, c-format +msgid "%s: Route List" +msgstr "" + +#: ../src/viktrwlayer.c:11734 +#, c-format +msgid "" +"Could not write external layer %s to %s, please fix and save before exiting " +"or data will be lost" +msgstr "" + +#: ../src/viktrwlayer.c:11782 +#, c-format +msgid "WARNING: issues encountered loading external layer %s from %s" +msgstr "" + +#: ../src/viktrwlayer_export.c:47 +msgid "Auto Device GPX Simplify:" +msgstr "" + +#: ../src/viktrwlayer_export.c:48 +msgid "" +"GPX saves to certain devices will be simplified for device compatibility." +msgstr "" + +#: ../src/viktrwlayer_export.c:125 +#, c-format +msgid "Export of GPX file simplified using point limit: %d" +msgstr "" + +#: ../src/viktrwlayer_export.c:206 ../src/viktrwlayer_export.c:323 +#: ../src/vikwindow.c:3694 +msgid "The filename you requested could not be opened for writing." +msgstr "" + +#: ../src/viktrwlayer_export.c:226 +#, c-format +msgid "Could not launch %s." +msgstr "" + +#: ../src/viktrwlayer_export.c:234 +msgid "Could not create temporary file for export." +msgstr "" + +#: ../src/viktrwlayer_export.c:268 +msgid "File format:" +msgstr "" + +#: ../src/viktrwlayer_export.c:276 +msgid "Select the file format." +msgstr "" + +#: ../src/viktrwlayer_export.c:281 +msgid "" +"Select the information to process.\n" +"Warning: the behavior of these switches is highly dependent of the file " +"format selected.\n" +"Please, refer to GPSbabel if unsure." +msgstr "" + +#: ../src/viktrwlayer_export.c:308 +msgid "You did not select a valid file format." +msgstr "" + +#: ../src/viktrwlayer_propwin.c:915 ../src/viktrwlayer_propwin.c:3381 +#: ../src/viktrwlayer_propwin.c:3417 ../src/viktrwlayer_propwin.c:3457 +#: ../src/viktrwlayer_propwin.c:3509 ../src/viktrwlayer_propwin.c:3527 +#: ../src/viktrwlayer_propwin.c:3600 ../src/viktrwlayer_propwin.c:3601 +#: ../src/viktrwlayer_propwin.c:3602 ../src/viktrwlayer_propwin.c:3611 +#: ../src/viktrwlayer_propwin.c:3612 ../src/viktrwlayer_propwin.c:3629 +#: ../src/viktrwlayer_propwin.c:3630 ../src/viktrwlayer_propwin.c:3644 +#: ../src/viktrwlayer_propwin.c:3645 ../src/viktrwlayer_propwin.c:3646 +#: ../src/viktrwlayer_propwin.c:3660 ../src/viktrwlayer_propwin.c:3661 +#: ../src/viktrwlayer_propwin.c:3662 ../src/viktrwlayer_propwin.c:3676 +#: ../src/viktrwlayer_propwin.c:3677 ../src/viktrwlayer_propwin.c:3678 +#: ../src/viktrwlayer_propwin.c:3695 ../src/viktrwlayer_propwin.c:3696 +#: ../src/viktrwlayer_analysis.c:293 +#, c-format +msgid "No Data" +msgstr "Ingen data" + +#: ../src/viktrwlayer_propwin.c:960 ../src/viktrwlayer_propwin.c:1245 +#, c-format +msgid "%.1f kph" +msgstr "" + +#: ../src/viktrwlayer_propwin.c:963 ../src/viktrwlayer_propwin.c:1248 +#: ../src/viktrwlayer_analysis.c:352 +#, c-format +msgid "%.1f mph" +msgstr "" + +#: ../src/viktrwlayer_propwin.c:966 ../src/viktrwlayer_propwin.c:1251 +#, c-format +msgid "%.1f knots" +msgstr "" + +#: ../src/viktrwlayer_propwin.c:969 ../src/viktrwlayer_propwin.c:1254 +#, c-format +msgid "%.1f s/km" +msgstr "" + +#: ../src/viktrwlayer_propwin.c:972 ../src/viktrwlayer_propwin.c:1257 +#: ../src/viktrwlayer_analysis.c:389 ../src/viktrwlayer_analysis.c:392 +#, fuzzy, c-format +msgid "%.1f min/km" +msgstr "1 minutt" + +#: ../src/viktrwlayer_propwin.c:975 ../src/viktrwlayer_propwin.c:1260 +#, c-format +msgid "%.1f sec/mi" +msgstr "" + +#: ../src/viktrwlayer_propwin.c:978 ../src/viktrwlayer_propwin.c:1263 +#: ../src/viktrwlayer_analysis.c:409 ../src/viktrwlayer_analysis.c:412 +#, fuzzy, c-format +msgid "%.1f min/mi" +msgstr "1 minutt" + +#. VIK_UNITS_SPEED_METRES_PER_SECOND: +#: ../src/viktrwlayer_propwin.c:982 ../src/viktrwlayer_propwin.c:1267 +#, c-format +msgid "%.1f m/s" +msgstr "" + +#. Minutes +#: ../src/viktrwlayer_propwin.c:1411 +msgid "mins" +msgstr "" + +#. Hours +#: ../src/viktrwlayer_propwin.c:1418 +msgid "h" +msgstr "" + +#. Days +#: ../src/viktrwlayer_propwin.c:1424 +msgid "d" +msgstr "" + +#. Weeks +#: ../src/viktrwlayer_propwin.c:1429 +msgid "w" +msgstr "" + +#. 'Months' +#: ../src/viktrwlayer_propwin.c:1433 +msgid "M" +msgstr "" + +#: ../src/viktrwlayer_propwin.c:2051 ../src/viktrwlayer_analysis.c:303 +#, c-format +msgid "%.1f miles" +msgstr "" + +#: ../src/viktrwlayer_propwin.c:2054 ../src/viktrwlayer_analysis.c:306 +#, c-format +msgid "%.1f NM" +msgstr "" + +#. VIK_UNITS_DISTANCE_KILOMETRES +#: ../src/viktrwlayer_propwin.c:2057 ../src/viktrwlayer_analysis.c:310 +#, c-format +msgid "%.1f km" +msgstr "" + +#: ../src/viktrwlayer_propwin.c:3083 +msgid "Failed spliting track. Track unchanged" +msgstr "Kunne ikke dele spor. Spor uendret" + +#: ../src/viktrwlayer_propwin.c:3234 ../src/viktrwlayer_propwin.c:3744 +#, c-format +msgid "%s - Track Properties" +msgstr "%s - Sporegenskaper" + +#: ../src/viktrwlayer_propwin.c:3239 +msgid "Split at _Marker" +msgstr "" + +#: ../src/viktrwlayer_propwin.c:3240 +msgid "Split _Segments" +msgstr "" + +#: ../src/viktrwlayer_propwin.c:3241 +msgid "_Reverse" +msgstr "" + +#: ../src/viktrwlayer_propwin.c:3242 +msgid "_Delete Dupl." +msgstr "" + +#: ../src/viktrwlayer_propwin.c:3269 +msgid "Comment:" +msgstr "Kommentar:" + +#: ../src/viktrwlayer_propwin.c:3270 +msgid "Description:" +msgstr "" + +#: ../src/viktrwlayer_propwin.c:3271 +#, fuzzy +msgid "Source:" +msgstr "Start:" + +#: ../src/viktrwlayer_propwin.c:3272 +#, fuzzy +msgid "Type:" +msgstr "Tid:" + +#: ../src/viktrwlayer_propwin.c:3273 +msgid "Color:" +msgstr "" + +#: ../src/viktrwlayer_propwin.c:3274 +msgid "Draw Name:" +msgstr "" + +#: ../src/viktrwlayer_propwin.c:3275 +msgid "Distance Labels:" +msgstr "" + +#: ../src/viktrwlayer_propwin.c:3278 +msgid "Track Length:" +msgstr "Sporlengde:" + +#: ../src/viktrwlayer_propwin.c:3279 +msgid "Trackpoints:" +msgstr "" + +#: ../src/viktrwlayer_propwin.c:3280 +msgid "Segments:" +msgstr "" + +#: ../src/viktrwlayer_propwin.c:3281 +msgid "Duplicate Points:" +msgstr "" + +#: ../src/viktrwlayer_propwin.c:3282 +msgid "Max Speed:" +msgstr "Høyeste hastighet" + +#: ../src/viktrwlayer_propwin.c:3283 +msgid "Avg. Speed:" +msgstr "Snitthastighet" + +#: ../src/viktrwlayer_propwin.c:3284 +msgid "Moving Avg. Speed:" +msgstr "" + +#: ../src/viktrwlayer_propwin.c:3285 +msgid "Avg. Dist. Between TPs:" +msgstr "" + +#: ../src/viktrwlayer_propwin.c:3286 +msgid "Elevation Range:" +msgstr "" + +#: ../src/viktrwlayer_propwin.c:3287 +msgid "Total Elevation Gain/Loss:" +msgstr "" + +#: ../src/viktrwlayer_propwin.c:3288 +msgid "Start:" +msgstr "Start:" + +#: ../src/viktrwlayer_propwin.c:3289 +msgid "End:" +msgstr "Slutt:" + +#: ../src/viktrwlayer_propwin.c:3290 +msgid "Duration:" +msgstr "Varighet:" + +#: ../src/viktrwlayer_propwin.c:3320 +msgid "Centre" +msgstr "" + +#: ../src/viktrwlayer_propwin.c:3321 +msgid "Start only" +msgstr "" + +#: ../src/viktrwlayer_propwin.c:3322 +msgid "End only" +msgstr "" + +#: ../src/viktrwlayer_propwin.c:3323 +msgid "Start and End" +msgstr "" + +#: ../src/viktrwlayer_propwin.c:3324 +msgid "Centre, Start and End" +msgstr "" + +#: ../src/viktrwlayer_propwin.c:3336 +msgid "Maximum number of distance labels to be shown" +msgstr "" + +#: ../src/viktrwlayer_propwin.c:3340 +msgid "Properties" +msgstr "" + +#: ../src/viktrwlayer_propwin.c:3584 +#, c-format +msgid "%d minutes - %d minutes moving" +msgstr "" + +#: ../src/viktrwlayer_propwin.c:3596 +#, c-format +msgid "%s total - %s in segments" +msgstr "" + +#: ../src/viktrwlayer_propwin.c:3607 ../src/viktrwlayer_analysis.c:622 +msgid "Statistics" +msgstr "Statistikk" + +#: ../src/viktrwlayer_propwin.c:3613 ../src/viktrwlayer_propwin.c:3680 +msgid "Show D_EM" +msgstr "" + +#: ../src/viktrwlayer_propwin.c:3615 ../src/viktrwlayer_propwin.c:3631 +#: ../src/viktrwlayer_propwin.c:3647 ../src/viktrwlayer_propwin.c:3697 +msgid "Show _GPS Speed" +msgstr "" + +#: ../src/viktrwlayer_propwin.c:3617 ../src/viktrwlayer_propwin.c:3633 +#: ../src/viktrwlayer_propwin.c:3665 ../src/viktrwlayer_propwin.c:3699 +msgid "Track Distance:" +msgstr "Spordistanse:" + +#: ../src/viktrwlayer_propwin.c:3618 ../src/viktrwlayer_propwin.c:3684 +msgid "Track Height:" +msgstr "" + +#: ../src/viktrwlayer_propwin.c:3624 +msgid "Elevation-distance" +msgstr "" + +#: ../src/viktrwlayer_propwin.c:3634 +msgid "Track Gradient:" +msgstr "" + +#: ../src/viktrwlayer_propwin.c:3639 +msgid "Gradient-distance" +msgstr "" + +#: ../src/viktrwlayer_propwin.c:3649 ../src/viktrwlayer_propwin.c:3666 +#: ../src/viktrwlayer_propwin.c:3683 +msgid "Track Time:" +msgstr "Sportid:" + +#: ../src/viktrwlayer_propwin.c:3650 ../src/viktrwlayer_propwin.c:3700 +msgid "Track Speed:" +msgstr "" + +#: ../src/viktrwlayer_propwin.c:3651 ../src/viktrwlayer_propwin.c:3667 +#: ../src/viktrwlayer_propwin.c:3685 +msgid "Time/Date:" +msgstr "" + +#: ../src/viktrwlayer_propwin.c:3655 +msgid "Speed-time" +msgstr "Hastighet-tid" + +#: ../src/viktrwlayer_propwin.c:3663 ../src/viktrwlayer_propwin.c:3679 +msgid "Show S_peed" +msgstr "" + +#: ../src/viktrwlayer_propwin.c:3671 +msgid "Distance-time" +msgstr "" + +#: ../src/viktrwlayer_propwin.c:3690 +msgid "Elevation-time" +msgstr "" + +#: ../src/viktrwlayer_propwin.c:3705 +msgid "Speed-distance" +msgstr "" + +#: ../src/viktrwlayer_tpwin.c:190 ../src/viktrwlayer_wpwin.c:66 +msgid "Date/Time Edit" +msgstr "" + +#: ../src/viktrwlayer_tpwin.c:242 +msgid "Name:" +msgstr "" + +#: ../src/viktrwlayer_tpwin.c:243 +msgid "Latitude:" +msgstr "" + +#: ../src/viktrwlayer_tpwin.c:244 +msgid "Longitude:" +msgstr "" + +#: ../src/viktrwlayer_tpwin.c:245 +msgid "Altitude:" +msgstr "" + +#: ../src/viktrwlayer_tpwin.c:246 +msgid "Course:" +msgstr "" + +#: ../src/viktrwlayer_tpwin.c:247 +msgid "Timestamp:" +msgstr "Tidsstempel:" + +#: ../src/viktrwlayer_tpwin.c:248 +msgid "Time:" +msgstr "Tid:" + +#: ../src/viktrwlayer_tpwin.c:249 +msgid "Distance Difference:" +msgstr "Avstandsforskjell:" + +#: ../src/viktrwlayer_tpwin.c:250 +msgid "Time Difference:" +msgstr "Tidsforskjell:" + +#: ../src/viktrwlayer_tpwin.c:251 +msgid "\"Speed\" Between:" +msgstr "\"Hastighet\" mellom:" + +#: ../src/viktrwlayer_tpwin.c:252 +msgid "Speed:" +msgstr "" + +#: ../src/viktrwlayer_tpwin.c:253 +msgid "VDOP:" +msgstr "" + +#: ../src/viktrwlayer_tpwin.c:254 +msgid "HDOP:" +msgstr "" + +#: ../src/viktrwlayer_tpwin.c:255 +msgid "PDOP:" +msgstr "" + +#: ../src/viktrwlayer_tpwin.c:256 +msgid "SAT/FIX:" +msgstr "" + +#: ../src/viktrwlayer_tpwin.c:263 ../src/viktrwlayer_tpwin.c:408 +#: ../src/viktrwlayer_tpwin.c:622 +msgid "Trackpoint" +msgstr "" + +#: ../src/viktrwlayer_tpwin.c:266 +msgid "_Insert After" +msgstr "" + +#: ../src/viktrwlayer_tpwin.c:268 +msgid "Split Here" +msgstr "Del her" + +#: ../src/viktrwlayer_tracklist.c:262 ../src/viktrwlayer_waypointlist.c:306 +msgid "_Copy Data" +msgstr "" + +#. +#. item = gtk_image_menu_item_new_with_mnemonic ( _("_Select") ); +#. gtk_image_menu_item_set_image ( (GtkImageMenuItem*)item, gtk_image_new_from_stock (GTK_STOCK_FIND, GTK_ICON_SIZE_MENU) ); +#. g_signal_connect_swapped ( G_OBJECT(item), "activate", G_CALLBACK(trw_layer_track_select), values ); +#. gtk_menu_shell_append (GTK_MENU_SHELL (menu), item); +#. gtk_widget_show ( item ); +#. +#. ATM view auto selects, so don't bother with separate select menu entry +#. +#. item = gtk_image_menu_item_new_with_mnemonic ( _("_Select") ); +#. gtk_image_menu_item_set_image ( (GtkImageMenuItem*)item, gtk_image_new_from_stock (GTK_STOCK_FIND, GTK_ICON_SIZE_MENU) ); +#. g_signal_connect_swapped ( G_OBJECT(item), "activate", G_CALLBACK(trw_layer_waypoint_select), values ); +#. gtk_menu_shell_append (GTK_MENU_SHELL (menu), item); +#. gtk_widget_show ( item ); +#. +#. AUTO SELECT NOT TRUE YET... +#. ATM view auto selects, so don't bother with separate select menu entry +#: ../src/viktrwlayer_tracklist.c:290 ../src/viktrwlayer_waypointlist.c:341 +#: ../src/vikwindow.c:4816 +msgid "_View" +msgstr "_Vis" + +#. Insert column for the layer name when viewing multi layers +#: ../src/viktrwlayer_tracklist.c:613 ../src/viktrwlayer_waypointlist.c:609 +msgid "Layer" +msgstr "" + +#: ../src/viktrwlayer_tracklist.c:627 ../src/viktrwlayer_waypointlist.c:624 +msgid "Date" +msgstr "" + +#: ../src/viktrwlayer_tracklist.c:631 ../src/viktrwlayer_waypointlist.c:628 +msgid "Visible" +msgstr "" + +#: ../src/viktrwlayer_tracklist.c:639 +msgid "" +"Distance\n" +"(miles)" +msgstr "" + +#: ../src/viktrwlayer_tracklist.c:642 +msgid "" +"Distance\n" +"(NM)" +msgstr "" + +#: ../src/viktrwlayer_tracklist.c:645 +msgid "" +"Distance\n" +"(km)" +msgstr "" + +#: ../src/viktrwlayer_tracklist.c:651 +msgid "" +"Length\n" +"(minutes)" +msgstr "" + +#: ../src/viktrwlayer_tracklist.c:660 ../src/vikutils.c:93 +msgid "sec/mi" +msgstr "" + +#: ../src/viktrwlayer_tracklist.c:666 +#, c-format +msgid "" +"Av. Speed\n" +"(%s)" +msgstr "" + +#. Apply own formatting of the data +#: ../src/viktrwlayer_tracklist.c:671 +#, c-format +msgid "" +"Max Speed\n" +"(%s)" +msgstr "" + +#: ../src/viktrwlayer_tracklist.c:679 ../src/viktrwlayer_waypointlist.c:637 +msgid "" +"Max Height\n" +"(Feet)" +msgstr "" + +#: ../src/viktrwlayer_tracklist.c:681 ../src/viktrwlayer_waypointlist.c:639 +msgid "" +"Max Height\n" +"(Metres)" +msgstr "" + +#: ../src/viktrwlayer_waypointlist.c:312 +msgid "Copy Data (with _positions)" +msgstr "" + +#: ../src/viktrwlayer_waypointlist.c:633 +msgid "Comment" +msgstr "" + +#: ../src/viktrwlayer_waypointlist.c:643 +msgid "Symbol" +msgstr "" + +#: ../src/viktrwlayer_wpwin.c:93 ../src/viktrwlayer_wpwin.c:302 +msgid "True" +msgstr "" + +#: ../src/viktrwlayer_wpwin.c:122 +msgid "Waypoint Properties" +msgstr "" + +#: ../src/viktrwlayer_wpwin.c:164 +msgid "Name:" +msgstr "Navn:" + +#: ../src/viktrwlayer_wpwin.c:181 +msgid "Altitude:" +msgstr "Høyde:" + +#: ../src/viktrwlayer_wpwin.c:186 ../src/viktrwlayer_wpwin.c:188 +msgid "Comment:" +msgstr "Kommentar:" + +#: ../src/viktrwlayer_wpwin.c:202 +#, fuzzy +msgid "Source:" +msgstr "Last ned kilde:" + +#: ../src/viktrwlayer_wpwin.c:212 +msgid "Image:" +msgstr "Bilde:" + +#: ../src/viktrwlayer_wpwin.c:217 +msgid "Symbol:" +msgstr "Symbol:" + +#: ../src/viktrwlayer_wpwin.c:226 +msgid "(none)" +msgstr "" + +#. Geotag Info [readonly] +#: ../src/viktrwlayer_wpwin.c:272 +msgid "Has Geotag" +msgstr "" + +#: ../src/viktrwlayer_wpwin.c:279 +msgid "Consistent Position" +msgstr "" + +#. ATM the direction value box is always shown, even when there is no information. +#. It would be nice to be able to hide it until the 'Add' has been performed, +#. however I've not been able to achieve this. +#. Thus simply sensistizing it instead. +#: ../src/viktrwlayer_wpwin.c:292 +#, fuzzy +msgid "Image Direction:" +msgstr "Bildeinnstillinger" + +#: ../src/viktrwlayer_wpwin.c:300 +msgid "Magnetic" +msgstr "" + +#: ../src/viktrwlayer_wpwin.c:320 +msgid "Time:" +msgstr "" + +#. TODO: other checks (isalpha or whatever ) +#: ../src/viktrwlayer_wpwin.c:386 +msgid "Please enter a name for the waypoint." +msgstr "Angi navn for waypointen" + +#: ../src/viktrwlayer_geotag.c:320 ../src/viktrwlayer_geotag.c:460 +#, c-format +msgid "Failed updating EXIF on %s" +msgstr "" + +#: ../src/viktrwlayer_geotag.c:562 +#, c-format +msgid "Geotagging %d Images..." +msgstr "" + +#: ../src/viktrwlayer_geotag.c:630 +msgid "Geotag Images" +msgstr "" + +#: ../src/viktrwlayer_geotag.c:640 +msgid "Images" +msgstr "" + +#: ../src/viktrwlayer_geotag.c:645 +msgid "Overwrite Existing Waypoints:" +msgstr "" + +#: ../src/viktrwlayer_geotag.c:648 +msgid "Overwrite Existing GPS Information:" +msgstr "" + +#: ../src/viktrwlayer_geotag.c:650 +msgid "Keep File Modification Timestamp:" +msgstr "" + +#: ../src/viktrwlayer_geotag.c:684 +msgid "Create Waypoints:" +msgstr "" + +#: ../src/viktrwlayer_geotag.c:693 +msgid "Write EXIF:" +msgstr "" + +#: ../src/viktrwlayer_geotag.c:705 +msgid "Automatic Image Direction:" +msgstr "" + +#: ../src/viktrwlayer_geotag.c:707 +msgid "Set image direction based on a heading derived from the track" +msgstr "" + +#: ../src/viktrwlayer_geotag.c:710 +msgid "Interpolate Between Track Segments:" +msgstr "" + +#: ../src/viktrwlayer_geotag.c:715 +msgid "Image Time Offset (Seconds):" +msgstr "" + +#: ../src/viktrwlayer_geotag.c:718 +msgid "" +"The number of seconds to ADD to the photos time to make it match the GPS " +"data. Calculate this with (GPS - Photo). Can be negative or positive. Useful " +"to adjust times when a camera's timestamp was incorrect." +msgstr "" + +#: ../src/viktrwlayer_geotag.c:721 +msgid "Image Timezone:" +msgstr "" + +#: ../src/viktrwlayer_geotag.c:724 +msgid "" +"The timezone that was used when the images were created. For example, if a " +"camera is set to AWST or +8:00 hours. Enter +8:00 here so that the correct " +"adjustment to the images' time can be made. GPS data is always in UTC." +msgstr "" + +#: ../src/viktrwlayer_geotag.c:728 +#, c-format +msgid "Using waypoint: %s" +msgstr "" + +#: ../src/viktrwlayer_geotag.c:742 +#, c-format +msgid "Using track: %s" +msgstr "" + +#: ../src/viktrwlayer_geotag.c:744 +#, c-format +msgid "Using all tracks in: %s" +msgstr "" + +#: ../src/viktrwlayer_analysis.c:214 +msgid "Number of Tracks" +msgstr "" + +#: ../src/viktrwlayer_analysis.c:215 +msgid "Date Range" +msgstr "" + +#: ../src/viktrwlayer_analysis.c:216 +msgid "Total Length" +msgstr "" + +#: ../src/viktrwlayer_analysis.c:217 +msgid "Average Length" +msgstr "" + +#: ../src/viktrwlayer_analysis.c:218 +msgid "Eddington number" +msgstr "" + +#. No.4: Extended display only +#: ../src/viktrwlayer_analysis.c:219 +msgid "Max Speed" +msgstr "" + +#: ../src/viktrwlayer_analysis.c:220 +msgid "Avg. Speed" +msgstr "" + +#: ../src/viktrwlayer_analysis.c:221 +msgid "Minimum Altitude" +msgstr "" + +#: ../src/viktrwlayer_analysis.c:222 +msgid "Maximum Altitude" +msgstr "" + +#: ../src/viktrwlayer_analysis.c:223 +msgid "Total Elevation Gain/Loss" +msgstr "" + +#: ../src/viktrwlayer_analysis.c:224 +msgid "Avg. Elevation Gain/Loss" +msgstr "" + +#: ../src/viktrwlayer_analysis.c:225 +msgid "Total Duration" +msgstr "" + +#: ../src/viktrwlayer_analysis.c:226 +msgid "Avg. Duration" +msgstr "" + +#: ../src/viktrwlayer_analysis.c:317 +#, c-format +msgid "%.2f miles" +msgstr "" + +#: ../src/viktrwlayer_analysis.c:320 +#, c-format +msgid "%.2f NM" +msgstr "" + +#. VIK_UNITS_DISTANCE_KILOMETRES +#: ../src/viktrwlayer_analysis.c:324 +#, c-format +msgid "%.2f km" +msgstr "" + +#: ../src/viktrwlayer_analysis.c:361 +#, c-format +msgid "%.2f m/s" +msgstr "" + +#: ../src/viktrwlayer_analysis.c:370 ../src/viktrwlayer_analysis.c:373 +#, c-format +msgid "%.2f knots" +msgstr "" + +#: ../src/viktrwlayer_analysis.c:379 ../src/viktrwlayer_analysis.c:382 +#, c-format +msgid "%d s/km" +msgstr "" + +#: ../src/viktrwlayer_analysis.c:399 ../src/viktrwlayer_analysis.c:402 +#, c-format +msgid "%d sec/mi" +msgstr "" + +#: ../src/viktrwlayer_analysis.c:420 ../src/viktrwlayer_analysis.c:423 +#, c-format +msgid "%.2f km/h" +msgstr "" + +#: ../src/viktrwlayer_analysis.c:434 ../src/viktrwlayer_analysis.c:440 +#, c-format +msgid "%d feet" +msgstr "" + +#: ../src/viktrwlayer_analysis.c:445 ../src/viktrwlayer_analysis.c:447 +#, c-format +msgid "%d feet / %d feet" +msgstr "" + +#: ../src/viktrwlayer_analysis.c:452 ../src/viktrwlayer_analysis.c:458 +#, c-format +msgid "%d m" +msgstr "" + +#: ../src/viktrwlayer_analysis.c:463 ../src/viktrwlayer_analysis.c:465 +#, c-format +msgid "%d m / %d m" +msgstr "" + +#: ../src/viktrwlayer_analysis.c:477 +#, c-format +msgid "%d:%02d:%02d days:hrs:mins" +msgstr "" + +#: ../src/viktrwlayer_analysis.c:484 +#, c-format +msgid "%d:%02d hrs:mins" +msgstr "" + +#: ../src/viktrwlayer_analysis.c:658 +msgid "Include Invisible Items" +msgstr "" + +#: ../src/vikstatus.c:129 +msgid "Current number of background tasks. Click to see the background jobs." +msgstr "" + +#: ../src/vikstatus.c:134 +msgid "Current zoom level. Click to select a new one." +msgstr "" + +#: ../src/vikstatus.c:141 +msgid "Left click to clear the message. Right click to copy the message." +msgstr "" + +#: ../src/vikutils.c:108 +msgid "GPSD" +msgstr "" + +#. GPS Preamble +#: ../src/vikutils.c:109 +msgid "Trkpt" +msgstr "" + +#: ../src/vikutils.c:160 +#, c-format +msgid "%sSpeed%s %.1f%s" +msgstr "" + +#. Go for 2dp as expect low values for vertical speeds +#: ../src/vikutils.c:214 +#, c-format +msgid "%sClimb%s %.2f%s" +msgstr "" + +#: ../src/vikutils.c:223 +#, c-format +msgid "%sAlt %dfeet" +msgstr "" + +#. VIK_UNITS_HEIGHT_METRES: +#: ../src/vikutils.c:227 +#, c-format +msgid "%sAlt %dm" +msgstr "" + +#: ../src/vikutils.c:235 +#, c-format +msgid "%sCourse %03d°" +msgstr "" + +#: ../src/vikutils.c:249 +msgid "yards" +msgstr "" + +#. VIK_UNITS_DISTANCE_KILOMETRES: +#: ../src/vikutils.c:253 +msgid "m" +msgstr "" + +#: ../src/vikutils.c:257 +#, c-format +msgid "%sDistance diff %d%s" +msgstr "" + +#: ../src/vikutils.c:272 +#, c-format +msgid "%sTime %s" +msgstr "" + +#: ../src/vikutils.c:281 +#, c-format +msgid "%sTime diff %lds" +msgstr "" + +#: ../src/vikutils.c:287 +#, c-format +msgid "%sNo. of Sats %d" +msgstr "" + +#: ../src/vikutils.c:312 +#, c-format +msgid "%sTo End %.2f%s" +msgstr "" + +#: ../src/vikutils.c:339 +#, c-format +msgid "%sDistance along %.2f%s" +msgstr "" + +#: ../src/vikutils.c:359 +#, c-format +msgid "%sTrack: %s" +msgstr "" + +#: ../src/vikutils.c:396 +#, c-format +msgid "" +"There is a newer version of Viking available: %s\n" +"\n" +"Do you wish to go to Viking's website now?" +msgstr "" + +#: ../src/vikutils.c:526 +msgid "" +"This appears to be Viking's very first run.\n" +"\n" +"Do you wish to enable automatic internet features?\n" +"\n" +"Individual settings can be controlled in the Preferences." +msgstr "" + +#: ../src/vikwaypoint.c:37 +msgid "Waypoint" +msgstr "" + +#: ../src/vikwebtool_datasource.c:352 +msgid "Search Term" +msgstr "" + +#. TODO get rid of this as this is unnecessary duplication... +#: ../src/vikwindow.c:258 +msgid "Pan" +msgstr "Panorér" + +#: ../src/vikwindow.c:258 +msgid "Zoom" +msgstr "Zoom" + +#: ../src/vikwindow.c:258 +msgid "Ruler" +msgstr "Linjal" + +#: ../src/vikwindow.c:258 +msgid "Select" +msgstr "" + +#: ../src/vikwindow.c:368 +msgid "This is Viking " +msgstr "" + +#: ../src/vikwindow.c:457 +msgid "Location lookup aborted" +msgstr "" + +#: ../src/vikwindow.c:477 +#, c-format +msgid "Location found: %s" +msgstr "" + +#: ../src/vikwindow.c:486 +msgid "Unable to determine location" +msgstr "" + +#: ../src/vikwindow.c:495 +msgid "Determining location" +msgstr "" + +#: ../src/vikwindow.c:525 +#, c-format +msgid "Location found via geoclue" +msgstr "" + +#: ../src/vikwindow.c:546 +msgid "Default Map" +msgstr "" + +#: ../src/vikwindow.c:557 ../src/vikwindow.c:3938 +msgid "Trying to determine location..." +msgstr "" + +#. Create tooltip +#: ../src/vikwindow.c:723 +msgid "Select zoom level" +msgstr "" + +#: ../src/vikwindow.c:1176 +#, c-format +msgid "" +"Do you want to save the changes you made to the document \"%s\"?\n" +"\n" +"Your changes will be lost if you don't save them." +msgstr "" +"Vil du lagre endringene i dokumentet \"%s\"?\n" +"\n" +"Endringene vil gå tapt om du ikke lagrer dem." + +#: ../src/vikwindow.c:1180 +msgid "Don't Save" +msgstr "Ikke lagre" + +#: ../src/vikwindow.c:1268 +msgid "mpp" +msgstr "" + +#: ../src/vikwindow.c:1268 +msgid "pixelfact" +msgstr "" + +#: ../src/vikwindow.c:1467 +#, c-format +msgid "%s %s %dm" +msgstr "" + +#: ../src/vikwindow.c:1469 +#, c-format +msgid "%s %s %dft" +msgstr "" + +#: ../src/vikwindow.c:1472 +#, c-format +msgid "%s %s" +msgstr "%s %s" + +#: ../src/vikwindow.c:1929 +msgid "_Ruler" +msgstr "_Linjal" + +#: ../src/vikwindow.c:1929 +msgid "Ruler Tool" +msgstr "Linjalverktøy" + +#: ../src/vikwindow.c:2204 ../src/vikwindow.c:4818 +msgid "_Zoom" +msgstr "_Zoom" + +#: ../src/vikwindow.c:2204 +msgid "Zoom Tool" +msgstr "Zoomverktøy" + +#: ../src/vikwindow.c:2271 ../src/vikwindow.c:4819 +msgid "_Pan" +msgstr "" + +#: ../src/vikwindow.c:2271 +msgid "Pan Tool" +msgstr "" + +#: ../src/vikwindow.c:2425 +msgid "_Select" +msgstr "" + +#: ../src/vikwindow.c:2425 +msgid "Select Tool" +msgstr "" + +#: ../src/vikwindow.c:2615 +msgid "You must select a layer to show its properties." +msgstr "Du må velge et lag for å kunne se dets egenskaper." + +#. No error to show, so unlikely this will get called +#: ../src/vikwindow.c:2629 +msgid "The help system is not available." +msgstr "" + +#. Main error path +#: ../src/vikwindow.c:2632 +#, c-format +msgid "" +"Help is not available because: %s.\n" +"Ensure a Mime Type ghelp handler program is installed (e.g. yelp)." +msgstr "" + +#: ../src/vikwindow.c:2865 +msgid "You must select a layer to delete." +msgstr "Du må velge et lag å slette." + +#: ../src/vikwindow.c:3171 +msgid "Untitled" +msgstr "Uten tittel" + +#: ../src/vikwindow.c:3300 +#, c-format +msgid "Unable to add '%s' to the list of recently used documents" +msgstr "" + +#: ../src/vikwindow.c:3391 +msgid "The file you requested could not be opened." +msgstr "Filen du valgte kunne ikke åpnes." + +#: ../src/vikwindow.c:3394 +msgid "" +"GPSBabel is required to load files of this type or GPSBabel encountered " +"problems." +msgstr "" + +#: ../src/vikwindow.c:3397 +#, c-format +msgid "Unable to load malformed GPX file %s" +msgstr "" + +#: ../src/vikwindow.c:3400 +#, c-format +msgid "Unsupported file type for %s" +msgstr "" + +#. Since we can process .vik files with issues just show a warning in the status bar +#. Not that a user can do much about it... or tells them what this issue is yet... +#: ../src/vikwindow.c:3406 +#, c-format +msgid "WARNING: issues encountered loading %s" +msgstr "" + +#: ../src/vikwindow.c:3489 +msgid "Please select a GPS data file to open. " +msgstr "Vennligst velg en GPS-datafil å åpne. " + +#: ../src/vikwindow.c:3508 +msgid "Google Earth" +msgstr "" + +#: ../src/vikwindow.c:3523 ../src/vikwindow.c:3646 ../src/viking.desktop.in.h:1 +msgid "Viking" +msgstr "Viking" + +#: ../src/vikwindow.c:3594 ../src/vikwindow.c:4632 +msgid "Open File" +msgstr "" + +#: ../src/vikwindow.c:3630 +msgid "Save as Viking File." +msgstr "Lagre som Viking-fil." + +#: ../src/vikwindow.c:3757 +#, c-format +msgid "Exporting to file: %s" +msgstr "" + +#. Confirm what happened. +#: ../src/vikwindow.c:3774 +#, c-format +msgid "Exported files: %d" +msgstr "" + +#: ../src/vikwindow.c:3786 +msgid "Nothing to Export!" +msgstr "" + +#: ../src/vikwindow.c:3790 +msgid "Export to directory" +msgstr "" + +#: ../src/vikwindow.c:3809 +msgid "Could not convert all files" +msgstr "" + +#: ../src/vikwindow.c:3851 +msgid "File not accessible" +msgstr "" + +#: ../src/vikwindow.c:3854 +msgid "No Viking File" +msgstr "" + +#: ../src/vikwindow.c:3998 +msgid "This layer has no configurable properties." +msgstr "" + +#: ../src/vikwindow.c:4080 +msgid "Are you sure you wish to delete all layers?" +msgstr "Er du sikker på at du vil ta slette alle lagene?" + +#. Try harder... +#: ../src/vikwindow.c:4126 ../src/vikwindow.c:4132 +msgid "Generating image file..." +msgstr "" + +#: ../src/vikwindow.c:4154 +msgid "" +"Failed to generate internal image.\n" +"\n" +"Try creating a smaller image." +msgstr "" + +#: ../src/vikwindow.c:4175 +msgid "Image file generated." +msgstr "" + +#: ../src/vikwindow.c:4177 +msgid "Failed to generate image file." +msgstr "" + +#: ../src/vikwindow.c:4246 +#, c-format +msgid "Unable to write to file %s: %s" +msgstr "" + +#: ../src/vikwindow.c:4284 +msgid "" +"Viewable region outside allowable pixel size bounds for image. Clipping " +"width/height values." +msgstr "" + +#: ../src/vikwindow.c:4309 +#, c-format +msgid "Total area: %ldm x %ldm (%.3f sq. km)" +msgstr "" + +#: ../src/vikwindow.c:4312 +#, c-format +msgid "Total area: %ldm x %ldm (%.3f sq. miles)" +msgstr "" + +#: ../src/vikwindow.c:4315 +#, c-format +msgid "Total area: %ldm x %ldm (%.3f sq. NM)" +msgstr "" + +#. Single file +#: ../src/vikwindow.c:4343 +msgid "Save Image" +msgstr "Lagre bilde" + +#: ../src/vikwindow.c:4364 ../src/vikwindow.c:4641 +msgid "KMZ" +msgstr "" + +#: ../src/vikwindow.c:4417 +msgid "You must be in UTM mode to use this feature" +msgstr "Du må være i UTM-modus for å bruke denne funksjonen" + +#: ../src/vikwindow.c:4421 +msgid "Choose a directory to hold images" +msgstr "Velg en mappe til å lagre bilder" + +#. todo: default for answers inside VikWindow or static (thruout instance) +#: ../src/vikwindow.c:4441 +msgid "Save to Image File" +msgstr "Lagre til bildefil" + +#: ../src/vikwindow.c:4457 +msgid "Width (pixels):" +msgstr "Bredde (piksler):" + +#: ../src/vikwindow.c:4459 +msgid "Height (pixels):" +msgstr "Høyde (piksler):" + +#: ../src/vikwindow.c:4462 +msgid "" +"WARNING: USING LARGE IMAGES OVER 10000x10000\n" +"MAY CRASH THE PROGRAM!" +msgstr "" + +#: ../src/vikwindow.c:4464 +msgid "Zoom (meters per pixel):" +msgstr "Zoom (meter pr pixel):" + +#: ../src/vikwindow.c:4480 +msgid "Area in current viewable window" +msgstr "" + +#: ../src/vikwindow.c:4490 +msgid "Save as PNG" +msgstr "Lagre som PNG" + +#: ../src/vikwindow.c:4491 +msgid "Save as JPEG" +msgstr "Lagre som JPEG" + +#: ../src/vikwindow.c:4520 +msgid "East-west image tiles:" +msgstr "" + +#: ../src/vikwindow.c:4522 +msgid "North-south image tiles:" +msgstr "" + +#: ../src/vikwindow.c:4619 +msgid "This feature is not available in UTM mode" +msgstr "" + +#: ../src/vikwindow.c:4658 +#, c-format +msgid "Unable to import %s." +msgstr "" + +#: ../src/vikwindow.c:4749 +msgid "Choose a background color" +msgstr "Velg en bakgrunnsfarge" + +#: ../src/vikwindow.c:4765 +msgid "Choose a track highlight color" +msgstr "" + +#: ../src/vikwindow.c:4814 +msgid "_File" +msgstr "_Fil" + +#: ../src/vikwindow.c:4815 +msgid "_Edit" +msgstr "R_ediger" + +#: ../src/vikwindow.c:4817 +msgid "_Show" +msgstr "" + +#: ../src/vikwindow.c:4820 +msgid "_Layers" +msgstr "_Lag" + +#: ../src/vikwindow.c:4821 +msgid "_Tools" +msgstr "Verk_tøy" + +#: ../src/vikwindow.c:4822 +msgid "_Webtools" +msgstr "" + +#: ../src/vikwindow.c:4823 ../src/vikwindow.c:4893 +msgid "_Help" +msgstr "_Hjelp" + +#: ../src/vikwindow.c:4825 +msgid "New file" +msgstr "Ny fil" + +#: ../src/vikwindow.c:4826 +msgid "_Open..." +msgstr "_Åpne..." + +#: ../src/vikwindow.c:4826 +msgid "Open a file" +msgstr "Åpne en fil" + +#: ../src/vikwindow.c:4827 +msgid "Open _Recent File" +msgstr "" + +#: ../src/vikwindow.c:4828 +msgid "Append _File..." +msgstr "" + +#: ../src/vikwindow.c:4828 +msgid "Append data from a different file" +msgstr "" + +#: ../src/vikwindow.c:4829 +msgid "Open GPX as External _Layer..." +msgstr "" + +#: ../src/vikwindow.c:4829 +msgid "Open a GPX file as an external layer" +msgstr "" + +#: ../src/vikwindow.c:4830 +msgid "_Export All" +msgstr "" + +#: ../src/vikwindow.c:4830 +msgid "Export All TrackWaypoint Layers" +msgstr "" + +#: ../src/vikwindow.c:4831 +msgid "_GPX..." +msgstr "" + +#: ../src/vikwindow.c:4831 +msgid "Export as GPX" +msgstr "" + +#: ../src/vikwindow.c:4832 +msgid "A_cquire" +msgstr "" + +#: ../src/vikwindow.c:4833 +msgid "_Directions..." +msgstr "" + +#: ../src/vikwindow.c:4833 +msgid "Get driving directions" +msgstr "" + +#: ../src/vikwindow.c:4835 +msgid "_OSM Traces..." +msgstr "" + +#: ../src/vikwindow.c:4835 +msgid "Get traces from OpenStreetMap" +msgstr "" + +#: ../src/vikwindow.c:4836 +msgid "_My OSM Traces..." +msgstr "" + +#: ../src/vikwindow.c:4836 +msgid "Get Your Own Traces from OpenStreetMap" +msgstr "" + +#: ../src/vikwindow.c:4839 +msgid "Geo_caches..." +msgstr "" + +#: ../src/vikwindow.c:4839 +msgid "Get Geocaches from geocaching.com" +msgstr "Få Geocacher fra geocaching.com" + +#: ../src/vikwindow.c:4842 +msgid "Create waypoints from geotagged images" +msgstr "" + +#: ../src/vikwindow.c:4844 +msgid "Get a file from a URL" +msgstr "" + +#: ../src/vikwindow.c:4846 +msgid "Create waypoints from Wikipedia items in the current view" +msgstr "" + +#: ../src/vikwindow.c:4848 +msgid "_Save" +msgstr "" + +#: ../src/vikwindow.c:4848 +msgid "Save the file" +msgstr "Lagre filen" + +#: ../src/vikwindow.c:4849 +msgid "Save _As..." +msgstr "Lagre _som..." + +#: ../src/vikwindow.c:4849 +msgid "Save the file under different name" +msgstr "Lagre filen med et annet navn" + +#: ../src/vikwindow.c:4850 +msgid "Properties..." +msgstr "" + +#: ../src/vikwindow.c:4850 +msgid "File Properties" +msgstr "" + +#: ../src/vikwindow.c:4852 +msgid "Import KMZ _Map File..." +msgstr "" + +#: ../src/vikwindow.c:4852 +msgid "Import a KMZ file" +msgstr "" + +#: ../src/vikwindow.c:4853 +msgid "Generate _KMZ Map File..." +msgstr "" + +#: ../src/vikwindow.c:4853 +msgid "Generate a KMZ file with an overlay of the current view" +msgstr "" + +#: ../src/vikwindow.c:4855 +msgid "_Generate Image File..." +msgstr "_Generer bildefil..." + +#: ../src/vikwindow.c:4855 +msgid "Save a snapshot of the workspace into a file" +msgstr "" + +#: ../src/vikwindow.c:4856 +msgid "Generate _Directory of Images..." +msgstr "" + +#: ../src/vikwindow.c:4856 +msgid "Generate _Directory of Images" +msgstr "" + +#: ../src/vikwindow.c:4857 +msgid "_Print..." +msgstr "" + +#: ../src/vikwindow.c:4857 +msgid "Print maps" +msgstr "Skriv ut kart" + +#: ../src/vikwindow.c:4858 +msgid "E_xit" +msgstr "" + +#: ../src/vikwindow.c:4858 +msgid "Exit the program" +msgstr "Avslutt programmet" + +#: ../src/vikwindow.c:4859 +msgid "Save and Exit" +msgstr "Lagre og avslutt" + +#: ../src/vikwindow.c:4859 +msgid "Save and Exit the program" +msgstr "Lagre og avslutt programmet" + +#: ../src/vikwindow.c:4861 +msgid "Go to the Pre_vious Location" +msgstr "" + +#: ../src/vikwindow.c:4861 +msgid "Go to the previous location" +msgstr "" + +#: ../src/vikwindow.c:4862 +msgid "Go to the _Next Location" +msgstr "" + +#: ../src/vikwindow.c:4862 +msgid "Go to the next location" +msgstr "" + +#: ../src/vikwindow.c:4863 +msgid "Go to the _Default Location" +msgstr "" + +#: ../src/vikwindow.c:4863 +msgid "Go to the default location" +msgstr "" + +#: ../src/vikwindow.c:4864 +msgid "Go to the _Auto Location" +msgstr "" + +#: ../src/vikwindow.c:4864 +msgid "Go to a location via automatic lookup" +msgstr "" + +#: ../src/vikwindow.c:4865 +msgid "Go to _Location..." +msgstr "" + +#: ../src/vikwindow.c:4865 +msgid "Go to address/place using text search" +msgstr "" + +#: ../src/vikwindow.c:4866 +msgid "_Go to Lat/Lon..." +msgstr "" + +#: ../src/vikwindow.c:4866 +msgid "Go to arbitrary lat/lon coordinate" +msgstr "" + +#: ../src/vikwindow.c:4867 +msgid "Go to UTM..." +msgstr "Gå til UTM..." + +#: ../src/vikwindow.c:4867 +msgid "Go to arbitrary UTM coordinate" +msgstr "" + +#: ../src/vikwindow.c:4868 +#, fuzzy +msgid "Go to Today" +msgstr "Gå til UTM..." + +#: ../src/vikwindow.c:4868 +msgid "Go to today on the calendar" +msgstr "" + +#: ../src/vikwindow.c:4869 +msgid "_Refresh" +msgstr "" + +#: ../src/vikwindow.c:4869 +msgid "Refresh any maps displayed" +msgstr "" + +#: ../src/vikwindow.c:4870 +msgid "Set _Highlight Color..." +msgstr "" + +#: ../src/vikwindow.c:4870 +msgid "Set Highlight Color" +msgstr "" + +#: ../src/vikwindow.c:4871 +msgid "Set Bac_kground Color..." +msgstr "" + +#: ../src/vikwindow.c:4871 +msgid "Set Background Color" +msgstr "" + +#: ../src/vikwindow.c:4872 +msgid "Zoom _In" +msgstr "Zoom _inn" + +#: ../src/vikwindow.c:4872 +msgid "Zoom In" +msgstr "" + +#: ../src/vikwindow.c:4873 +msgid "Zoom _Out" +msgstr "Zoom _ut" + +#: ../src/vikwindow.c:4873 +msgid "Zoom Out" +msgstr "" + +#: ../src/vikwindow.c:4874 +msgid "Zoom _To..." +msgstr "Zoom _til..." + +#: ../src/vikwindow.c:4874 +msgid "Zoom To" +msgstr "" + +#: ../src/vikwindow.c:4875 +msgid "Pan _North" +msgstr "" + +#: ../src/vikwindow.c:4876 +msgid "Pan _East" +msgstr "" + +#: ../src/vikwindow.c:4877 +msgid "Pan _South" +msgstr "" + +#: ../src/vikwindow.c:4878 +msgid "Pan _West" +msgstr "" + +#: ../src/vikwindow.c:4879 +msgid "Background _Jobs" +msgstr "Bakgrunns_jobb" + +#: ../src/vikwindow.c:4879 +msgid "Background Jobs" +msgstr "" + +#: ../src/vikwindow.c:4881 +msgid "Cu_t" +msgstr "Klipp _ut" + +#: ../src/vikwindow.c:4885 +msgid "Delete All" +msgstr "Slett alle" + +#: ../src/vikwindow.c:4886 +msgid "Copy Centre _Location" +msgstr "" + +#: ../src/vikwindow.c:4887 +msgid "_Flush Map Cache" +msgstr "" + +#: ../src/vikwindow.c:4888 +msgid "_Set the Default Location" +msgstr "" + +#: ../src/vikwindow.c:4888 +msgid "Set the Default Location to the current position" +msgstr "" + +#: ../src/vikwindow.c:4889 +msgid "_Preferences" +msgstr "_Innstillinger" + +#: ../src/vikwindow.c:4889 +msgid "Program Preferences" +msgstr "" + +#: ../src/vikwindow.c:4890 +msgid "_Layer Defaults" +msgstr "" + +#: ../src/vikwindow.c:4891 +msgid "_Properties" +msgstr "_Egenskaper" + +#: ../src/vikwindow.c:4893 +msgid "Help" +msgstr "" + +#: ../src/vikwindow.c:4894 +msgid "_About" +msgstr "_Om" + +#: ../src/vikwindow.c:4894 +msgid "About" +msgstr "" + +#: ../src/vikwindow.c:4903 +msgid "_KML..." +msgstr "" + +#: ../src/vikwindow.c:4903 +msgid "Export as KML" +msgstr "" + +#: ../src/vikwindow.c:4904 +msgid "Transfer data from a GPS device" +msgstr "Overfør data fra GPS-enhet" + +#: ../src/vikwindow.c:4905 +msgid "Import file via GPSBabel converter" +msgstr "" + +#: ../src/vikwindow.c:4909 +msgid "Import Geo_JSON File..." +msgstr "" + +#: ../src/vikwindow.c:4909 +msgid "Import GeoJSON file" +msgstr "" + +#: ../src/vikwindow.c:4914 +msgid "_UTM Mode" +msgstr "_UTM-modus" + +#: ../src/vikwindow.c:4915 +msgid "_Expedia Mode" +msgstr "_Expedia-modus" + +#: ../src/vikwindow.c:4916 +msgid "_Mercator Mode" +msgstr "_Mercator-modus" + +#: ../src/vikwindow.c:4917 +msgid "Lat_/Lon Mode" +msgstr "" + +#: ../src/vikwindow.c:4921 +msgid "Show _Scale" +msgstr "" + +#: ../src/vikwindow.c:4921 +msgid "Show Scale" +msgstr "" + +#: ../src/vikwindow.c:4922 +msgid "Show _Center Mark" +msgstr "" + +#: ../src/vikwindow.c:4922 +msgid "Show Center Mark" +msgstr "" + +#: ../src/vikwindow.c:4923 +msgid "Show _Highlight" +msgstr "" + +#: ../src/vikwindow.c:4923 +msgid "Show Highlight" +msgstr "" + +#: ../src/vikwindow.c:4924 +msgid "_Full Screen" +msgstr "Fullskjerm" + +#: ../src/vikwindow.c:4924 +msgid "Activate full screen mode" +msgstr "Aktiver fullskjerm" + +#: ../src/vikwindow.c:4925 +msgid "Show Side _Panel" +msgstr "" + +#: ../src/vikwindow.c:4925 +msgid "Show Side Panel" +msgstr "" + +#: ../src/vikwindow.c:4926 +msgid "Show Status_bar" +msgstr "" + +#: ../src/vikwindow.c:4926 +msgid "Show Statusbar" +msgstr "" + +#: ../src/vikwindow.c:4927 +msgid "Show _Toolbar" +msgstr "" + +#: ../src/vikwindow.c:4927 +msgid "Show Toolbar" +msgstr "" + +#: ../src/vikwindow.c:4928 +msgid "Show _Menu" +msgstr "" + +#: ../src/vikwindow.c:4928 +msgid "Show Menu" +msgstr "" + +#: ../src/vikwindow.c:4929 +msgid "Show Side Panel B_uttons" +msgstr "" + +#: ../src/vikwindow.c:4929 +msgid "Show Side Panel Buttons" +msgstr "" + +#: ../src/vikwindow.c:4930 +msgid "Show Side Panel Ca_lendar" +msgstr "" + +#: ../src/vikwindow.c:4930 +msgid "Show Side Panel Calendar" +msgstr "" + +#: ../src/vikwindow.c:5064 +#, c-format +msgid "New _%s Layer" +msgstr "" + +#: ../src/vikwindow.c:5114 +#, fuzzy +msgid "..." +msgstr "Legg til..." + +#: ../src/viking.desktop.in.h:2 +msgid "GPS Data Manager" +msgstr "" + +#: ../src/viking.desktop.in.h:3 +msgid "Map Based GPS Data Manager (live data capable)." +msgstr "" + +#: ../src/libjpeg/jpeg-data.c:205 +msgid "Data does not follow JPEG specification." +msgstr "" + +#: ../src/libjpeg/jpeg-data.c:302 +#, c-format +msgid "Path '%s' invalid." +msgstr "" + +#: ../src/libjpeg/jpeg-data.c:320 +#, c-format +msgid "Could not read '%s'." +msgstr "" + +#~ msgid "Polygonzied Layer" +#~ msgstr "Polygoniserte lag" + +#~ msgid "Email:" +#~ msgstr "E-post:" diff --git a/po/nl.po b/po/nl.po new file mode 100644 index 0000000..6a69015 --- /dev/null +++ b/po/nl.po @@ -0,0 +1,6120 @@ +# Dutch translation for viking +# Copyright (c) 2008 Rosetta Contributors and Canonical Ltd 2008 +# This file is distributed under the same license as the viking package. +# FIRST AUTHOR , 2008. +# +msgid "" +msgstr "" +"Project-Id-Version: viking\n" +"Report-Msgid-Bugs-To: \n" +"POT-Creation-Date: 2019-01-19 12:53+0000\n" +"PO-Revision-Date: 2012-08-15 13:07+0000\n" +"Last-Translator: Dirk Roos \n" +"Language-Team: Dutch \n" +"Language: nl\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-Launchpad-Export-Date: 2018-12-21 17:32+0000\n" +"X-Generator: Launchpad (build 18847)\n" + +#: ../src/acquire.c:106 ../src/vikgpslayer.c:1367 +msgid "Done." +msgstr "Klaar." + +#: ../src/acquire.c:115 +msgid "No data." +msgstr "" + +#: ../src/acquire.c:167 ../src/acquire.c:415 +msgid "Error: acquisition failed." +msgstr "" + +#: ../src/acquire.c:339 +msgid "Working..." +msgstr "Bezig…" + +#. This shouldn't happen... +#: ../src/acquire.c:406 +msgid "" +"Unable to create command\n" +"Acquire method failed." +msgstr "" + +#: ../src/acquire.c:513 +msgid "_Filter" +msgstr "" + +#: ../src/acquire.c:528 +#, c-format +msgid "Filter with %s" +msgstr "" + +#: ../src/acquire.c:545 +msgid "Filter" +msgstr "" + +#: ../src/babel.c:640 +msgid "GPSBabel:" +msgstr "" + +#: ../src/babel.c:641 +msgid "" +"Allow setting the specific instance of GPSBabel. You must restart Viking for " +"this value to take effect." +msgstr "" + +#: ../src/babel_ui.c:79 +msgid "Select a file format" +msgstr "" + +#: ../src/babel_ui.c:144 ../src/viktrwlayer.c:531 ../src/viktrwlayer.c:2882 +msgid "Tracks" +msgstr "Sporen" + +#: ../src/babel_ui.c:149 ../src/viktrwlayer.c:2892 +msgid "Routes" +msgstr "" + +#. ***** PARAMETERS ***** +#: ../src/babel_ui.c:154 ../src/viktrwlayer.c:531 ../src/viktrwlayer.c:2887 +msgid "Waypoints" +msgstr "Waypoints" + +#: ../src/background.c:64 +#, c-format +msgid "%d items" +msgstr "%d items" + +#: ../src/background.c:287 +msgid "Threads:" +msgstr "" + +#: ../src/background.c:288 +msgid "" +"Number of threads to use for Mapnik tasks. You need to restart Viking for a " +"change to this value to be used" +msgstr "" + +#: ../src/background.c:361 +msgid "Job" +msgstr "Opdracht" + +#: ../src/background.c:365 +msgid "Progress" +msgstr "Voortgang" + +#: ../src/background.c:373 +msgid "Viking Background Jobs" +msgstr "Viking achtergrond precessen" + +#: ../src/bing.c:42 +msgid "Bing Aerial" +msgstr "" + +#: ../src/bing.c:48 +msgid "Bing" +msgstr "" + +#. VIK_GTK_WINDOW_FROM_WIDGET(vp) +#: ../src/bingmapsource.c:514 +msgid "Bing attribution Loading" +msgstr "" + +#: ../src/clipboard.c:95 +msgid "paste failed" +msgstr "plakken mislukt" + +#: ../src/clipboard.c:105 +msgid "wrong clipboard data size" +msgstr "verkeerde bestandsgrootte op het klembord" + +#: ../src/clipboard.c:124 +#, c-format +msgid "" +"The clipboard contains sublayer data for %s layers. You must select a layer " +"of this type to paste the clipboard data." +msgstr "" +"Het klembord bevat gegevens van tussenlagen voor %s lagen. U moet een " +"soortgelijk type laag selecteren, om de klembord data te kunnen plakken." + +#: ../src/clipboard.c:264 +msgid "" +"In order to paste a waypoint, please select an appropriate layer to paste " +"into." +msgstr "" +"Selecteert u alstublieft een passende laag om informatie in te plakken om " +"een wegpunt te plakken." + +#: ../src/dialog.c:60 +msgid "Go to Lat/Lon" +msgstr "Ga naar breedtegraad/lengtegraad." + +#: ../src/dialog.c:69 ../src/viktrwlayer_wpwin.c:173 +msgid "Latitude:" +msgstr "Breedtegraad:" + +#: ../src/dialog.c:72 ../src/viktrwlayer_wpwin.c:177 +msgid "Longitude:" +msgstr "Lengtegraad:" + +#: ../src/dialog.c:102 +msgid "Go to UTM" +msgstr "Ga naar UTM" + +#: ../src/dialog.c:114 +msgid "Northing:" +msgstr "Naar het noorden richten:" + +#: ../src/dialog.c:117 +msgid "Easting:" +msgstr "Naar het Oosten richten:" + +#: ../src/dialog.c:121 ../src/vikgeoreflayer.c:902 +msgid "Zone:" +msgstr "Zone:" + +#: ../src/dialog.c:124 ../src/vikgeoreflayer.c:904 +msgid "Letter:" +msgstr "Brief:" + +#: ../src/dialog.c:246 ../src/geonamessearch.c:238 +#: ../src/datasource_osm_my_traces.c:505 +msgid "Nothing was selected" +msgstr "Er was niets geselecteerd" + +#: ../src/dialog.c:254 +msgid "Add Route" +msgstr "" + +#: ../src/dialog.c:254 +msgid "Add Track" +msgstr "Voeg route toe" + +#: ../src/dialog.c:262 +msgid "Route Name:" +msgstr "" + +#: ../src/dialog.c:262 +msgid "Track Name:" +msgstr "Naam van de route:" + +#: ../src/dialog.c:282 +msgid "Please enter a name for the track." +msgstr "Geef alstublieft een naam op voor de route" + +#: ../src/dialog.c:311 +msgid "Today" +msgstr "" + +#: ../src/dialog.c:393 +msgid "Zoom Factors..." +msgstr "Vergrotingswaardes:" + +#: ../src/dialog.c:407 +msgid "Zoom factor (in meters per pixel):" +msgstr "Zoom factor (in meter per pixel):" + +#: ../src/dialog.c:408 +msgid "X (easting): " +msgstr "X (richten naar het oosten) " + +#: ../src/dialog.c:409 +msgid "Y (northing): " +msgstr "Y (richten naar het noorden) " + +#: ../src/dialog.c:414 +msgid "X and Y zoom factors must be equal" +msgstr "Vergrotingswaarden X en Y moeten hetzelfde zijn" + +#: ../src/dialog.c:469 +msgid "1 min" +msgstr "1 min" + +#: ../src/dialog.c:470 +msgid "1 hour" +msgstr "1 uur" + +#: ../src/dialog.c:471 +msgid "1 day" +msgstr "een dag" + +#: ../src/dialog.c:472 +msgid "Custom (in minutes):" +msgstr "Anders (in minuten)" + +#: ../src/dialog.c:608 +#, c-format +msgid "" +"2003-2008, Evan Battaglia\n" +"2008-%s, Viking's contributors" +msgstr "" + +#: ../src/dialog.c:609 +msgid "GPS Data and Topo Analyzer, Explorer, and Manager." +msgstr "GPS Data en Topo Analyzer, Explorer en Manager." + +#: ../src/dialog.c:610 +msgid "" +"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.\n" +"\n" +"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.\n" +"\n" +"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., 59 Temple " +"Place, Suite 330, Boston, MA 02111-1307, USA" +msgstr "" +"Dit programma is vrije software; je kan het wijzigen en/of aanpassen volgens " +"de bepalingen van de GNU Algemene Publieke Licentie zoals ze door de Free " +"Software Foundation is bekend gemaakt; versie 2 van deze licentie of " +"(volgens je eigen keuze) elke latere versie.\n" +"\n" +"Dit programma wordt verdeeld in de hoop dat het nuttig gebruikt zal worden, " +"maar blijft ZONDER ENIGE GARANTIE; ook zonder de impliciete garantie van " +"COMMERCIALISERING of AANPASSING AAN EEN BEPAALD DOEL. Voor meer details, " +"lees de GNU Algemene Publieke Licentie.\n" +"\n" +"Een exemplaar van de GNU Algemene Publieke Licentie dient bij dit programma " +"geleverd te worden. Indien dit niet het geval is, kan je de Free Software " +"Foundation Inc. aanschrijven, 59 Temple Place, Suite 330, Boston, MA " +"02111-1307, USA." + +#: ../src/dialog.c:703 +msgid "Translation is coordinated on http://launchpad.net/viking" +msgstr "De vertaling wordt gecoördineerd op http://launchpad.net/viking" + +#: ../src/dialog.c:713 +msgid "Download along track" +msgstr "Download langs spoor" + +#: ../src/dialog.c:720 +msgid "Map type:" +msgstr "Map type" + +#: ../src/dialog.c:726 +msgid "Zoom level:" +msgstr "Zoomniveau:" + +#: ../src/dialog.c:766 +#, c-format +msgid "The map data is licensed: %s." +msgstr "De kaartgegevens zijn onderheving aan een licentie: %s" + +#: ../src/dialog.c:769 +#, c-format +msgid "" +"The data provided by '%s' are licensed under the following license: " +"%s." +msgstr "" + +#: ../src/dialog.c:773 +msgid "Open license" +msgstr "Open licentie" + +#: ../src/expedia.c:54 +msgid "Expedia Street Maps" +msgstr "Expedia Street Maps" + +#: ../src/expedia.c:82 +msgid "Invalid expedia altitude" +msgstr "Ongeldige expedia hoogte" + +#: ../src/expedia.c:113 +#, c-format +msgid "" +"Couldn't open EXPEDIA image file (right after successful download! Please " +"report and delete image file!): %s" +msgstr "" +"Kon de EXPEDIA afbeelding niet openen (onmiddellijk na succesvolle download! " +"Gelieve dit te melden en de afbeelding te verwijderen!): %s" + +#: ../src/expedia.c:126 +#, c-format +msgid "" +"Couldn't save EXPEDIA image file (right after successful download! Please " +"report and delete image file!): %s" +msgstr "" +"Kon de EXPEDIA afbeelding niet openen (onmiddellijk na succesvolle download! " +"Gelieve dit te melden en de afbeelding te verwijderen!): %s" + +#: ../src/geonamessearch.c:115 +msgid "Search" +msgstr "Zoek" + +#: ../src/geonamessearch.c:117 +msgid "No entries found!" +msgstr "Geen ingangen gevonden!" + +#. NB could allow columns to be shifted around by doing this after each new +#. gtk_tree_view_column_set_reorderable ( column, TRUE ); +#. However I don't think is that useful, so I haven't put it in +#: ../src/geonamessearch.c:171 ../src/datasource_osm_my_traces.c:422 +#: ../src/viktrwlayer_tracklist.c:621 ../src/viktrwlayer_waypointlist.c:618 +msgid "Name" +msgstr "" + +#: ../src/geonamessearch.c:176 +msgid "Feature" +msgstr "" + +#: ../src/geonamessearch.c:181 ../src/datasource_osm_my_traces.c:437 +msgid "Lat/Lon" +msgstr "" + +#: ../src/geonamessearch.c:264 ../src/googlesearch.c:101 ../src/vikgoto.c:430 +msgid "couldn't map temp file" +msgstr "kon temp bestand niet mappen" + +#: ../src/geonamessearch.c:459 +msgid "Select articles" +msgstr "" + +#: ../src/geonamessearch.c:459 +msgid "Select the articles you want to add." +msgstr "" + +#: ../src/geonamessearch.c:475 +msgid "city" +msgstr "" + +#: ../src/geonamessearch.c:477 +msgid "edu" +msgstr "" + +#: ../src/geonamessearch.c:479 +msgid "airport" +msgstr "" + +#: ../src/geonamessearch.c:481 +msgid "mountain" +msgstr "" + +#: ../src/geonamessearch.c:483 +msgid "forest" +msgstr "" + +#: ../src/geonamessearch.c:485 +msgid "church" +msgstr "" + +#: ../src/geojson.c:74 +#, c-format +msgid "%s command failed: %s" +msgstr "" + +#: ../src/geojson.c:146 ../src/gpx.c:1317 +#, c-format +msgid "failed to open temporary file: %s" +msgstr "" + +#: ../src/globals.c:67 +msgid "DDD" +msgstr "" + +#: ../src/globals.c:67 +msgid "DMM" +msgstr "" + +#: ../src/globals.c:67 +msgid "DMS" +msgstr "" + +#: ../src/globals.c:67 +msgid "Raw" +msgstr "" + +#: ../src/globals.c:68 +msgid "Kilometres" +msgstr "" + +#: ../src/globals.c:68 +msgid "Miles" +msgstr "" + +#: ../src/globals.c:68 +msgid "Nautical Miles" +msgstr "" + +#. VIK_UNITS_SPEED_KILOMETRES_PER_HOUR: +#: ../src/globals.c:69 ../src/viktrwlayer_tracklist.c:655 ../src/vikutils.c:100 +msgid "km/h" +msgstr "" + +#: ../src/globals.c:69 ../src/viktrwlayer_tracklist.c:656 ../src/vikutils.c:78 +msgid "mph" +msgstr "" + +#. VIK_UNITS_SPEED_METRES_PER_SECOND: +#: ../src/globals.c:69 ../src/viktrwlayer_tracklist.c:663 ../src/vikutils.c:81 +msgid "m/s" +msgstr "" + +#: ../src/globals.c:69 ../src/viktrwlayer_tracklist.c:657 ../src/vikutils.c:84 +msgid "knots" +msgstr "" + +#: ../src/globals.c:69 ../src/viktrwlayer_tracklist.c:658 ../src/vikutils.c:87 +msgid "s/km" +msgstr "" + +#: ../src/globals.c:69 ../src/viktrwlayer_tracklist.c:659 ../src/vikutils.c:90 +msgid "min/km" +msgstr "" + +#: ../src/globals.c:69 +msgid "s/mi" +msgstr "" + +#: ../src/globals.c:69 ../src/viktrwlayer_tracklist.c:661 ../src/vikutils.c:96 +msgid "min/mi" +msgstr "" + +#: ../src/globals.c:70 +msgid "Metres" +msgstr "" + +#: ../src/globals.c:70 +msgid "Feet" +msgstr "" + +#: ../src/globals.c:73 +msgid "Locale" +msgstr "" + +#: ../src/globals.c:73 +msgid "World" +msgstr "" + +#: ../src/globals.c:73 +msgid "UTC" +msgstr "" + +#: ../src/globals.c:76 +msgid "Degree format:" +msgstr "Formaat graden:" + +#: ../src/globals.c:77 +msgid "Distance units:" +msgstr "Eenheid afstand:" + +#: ../src/globals.c:78 +msgid "Speed units:" +msgstr "Eenheid snelheid:" + +#: ../src/globals.c:79 +msgid "Height units:" +msgstr "Eenheid hoogte:" + +#: ../src/globals.c:80 +msgid "Use large waypoint icons:" +msgstr "Gebruik grote waypoint ikonen:" + +#: ../src/globals.c:81 +msgid "Default latitude:" +msgstr "" + +#: ../src/globals.c:82 +msgid "Default longitude:" +msgstr "" + +#: ../src/globals.c:83 +msgid "Time Display:" +msgstr "" + +#: ../src/globals.c:84 +msgid "" +"Display times according to the reference frame. Locale is the user's system " +"setting. World is relative to the location of the object." +msgstr "" + +#: ../src/globals.c:90 +msgid "Alphabetical" +msgstr "" + +#: ../src/globals.c:90 ../src/datasource_osm_my_traces.c:432 +msgid "Time" +msgstr "" + +#: ../src/globals.c:90 +msgid "Creation" +msgstr "" + +#: ../src/globals.c:91 +msgid "Title Case" +msgstr "" + +#: ../src/globals.c:91 +msgid "Lowercase" +msgstr "" + +#: ../src/globals.c:94 +msgid "KML File Export Units:" +msgstr "" + +#: ../src/globals.c:95 +msgid "GPX Track Order:" +msgstr "" + +#: ../src/globals.c:96 +msgid "GPX Waypoint Symbols:" +msgstr "" + +#: ../src/globals.c:97 +msgid "" +"Save GPX Waypoint Symbol names in the specified case. May be useful for " +"compatibility with various devices" +msgstr "" + +#: ../src/globals.c:98 +msgid "GPX Creator:" +msgstr "" + +#: ../src/globals.c:99 +msgid "" +"The creator value when writing a GPX file. Otherwise when blank a default is " +"used." +msgstr "" + +#: ../src/globals.c:104 +msgid "Image Viewer:" +msgstr "" + +#: ../src/globals.c:109 +msgid "External GPX Program 1:" +msgstr "" + +#: ../src/globals.c:110 +msgid "External GPX Program 2:" +msgstr "" + +#: ../src/globals.c:113 +msgid "Absolute" +msgstr "" + +#: ../src/globals.c:113 +msgid "Relative" +msgstr "" + +#: ../src/globals.c:117 +msgid "Save File Reference Mode:" +msgstr "" + +#: ../src/globals.c:118 +msgid "" +"When saving a Viking .vik file, this determines how the directory paths of " +"filenames are written." +msgstr "" + +#: ../src/globals.c:119 +msgid "Ask for Name before Track Creation:" +msgstr "" + +#: ../src/globals.c:120 +msgid "Show Tooltip during Track Creation:" +msgstr "" + +#: ../src/globals.c:121 +msgid "The number of recent files:" +msgstr "" + +#: ../src/globals.c:122 +msgid "" +"Only applies to new windows or on application restart. -1 means all " +"available files." +msgstr "" + +#: ../src/globals.c:123 +msgid "Open files in selected layer:" +msgstr "" + +#: ../src/globals.c:124 +msgid "Open files (but not .vik ones) into the selected TrackWaypoint layer." +msgstr "" + +#: ../src/globals.c:125 +msgid "Show calendar day names:" +msgstr "" + +#: ../src/globals.c:128 +msgid "Home Location" +msgstr "" + +#: ../src/globals.c:128 +msgid "Last Location" +msgstr "" + +#: ../src/globals.c:128 +msgid "Specified File" +msgstr "" + +#: ../src/globals.c:128 +msgid "Auto Location" +msgstr "" + +#: ../src/globals.c:131 +msgid "Restore Window Setup:" +msgstr "" + +#: ../src/globals.c:132 +msgid "Restore window size and layout" +msgstr "" + +#: ../src/globals.c:133 +msgid "Add a Default Map Layer:" +msgstr "" + +#: ../src/globals.c:134 +msgid "" +"The default map layer added is defined by the Layer Defaults. Use the menu " +"Edit->Layer Defaults->Map... to change the map type and other values." +msgstr "" + +#: ../src/globals.c:135 +msgid "Startup Method:" +msgstr "" + +#: ../src/globals.c:136 +msgid "Startup File:" +msgstr "" + +#: ../src/globals.c:137 +msgid "" +"The default file to load on startup. Only applies when the startup method is " +"set to 'Specified File'" +msgstr "" + +#: ../src/globals.c:138 +msgid "Check For New Version:" +msgstr "" + +#: ../src/globals.c:139 +msgid "Periodically check to see if a new version of Viking is available" +msgstr "" + +#. Defaults for the options are setup here +#: ../src/globals.c:176 +msgid "General" +msgstr "Algemeen" + +#. New Tab +#: ../src/globals.c:204 +msgid "Startup" +msgstr "" + +#. New Tab +#: ../src/globals.c:222 +msgid "Export/External" +msgstr "Eport/Extern" + +#. 'Advanced' Properties +#: ../src/globals.c:249 +msgid "Advanced" +msgstr "" + +#. Webtools +#: ../src/google.c:39 +msgid "Google" +msgstr "Google" + +#. If there is an actual description field it will overwrite this value +#: ../src/gpx.c:264 +#, c-format +msgid "Created by: %s" +msgstr "" + +#: ../src/datasource_bfilter.c:43 +msgid "Max number of points:" +msgstr "" + +#: ../src/datasource_bfilter.c:84 +msgid "Simplify All Tracks..." +msgstr "" + +#: ../src/datasource_bfilter.c:85 +msgid "Simplified Tracks" +msgstr "" + +#. { VIK_LAYER_NUM_TYPES, "compressmethod", VIK_LAYER_PARAM_UINT, VIK_LAYER_GROUP_NONE, N_("Simplify Method:"), VIK_LAYER_WIDGET_COMBOBOX, compress_method, NULL, NULL, NULL, NULL, NULL }, +#: ../src/datasource_bfilter.c:111 +msgid "Error Factor:" +msgstr "" + +#: ../src/datasource_bfilter.c:112 +msgid "" +"Specifies the maximum allowable error that may be introduced by removing a " +"single point by the crosstrack method. See the manual or GPSBabel Simplify " +"Filter documentation for more detail." +msgstr "" + +#: ../src/datasource_bfilter.c:166 +msgid "Compress Tracks..." +msgstr "" + +#: ../src/datasource_bfilter.c:167 +msgid "Compressed Tracks" +msgstr "" + +#: ../src/datasource_bfilter.c:197 ../src/datasource_bfilter.c:198 +msgid "Remove Duplicate Waypoints" +msgstr "" + +#: ../src/datasource_bfilter.c:221 +msgid "Manual filter:" +msgstr "" + +#: ../src/datasource_bfilter.c:222 +msgid "Manual filter command: e.g. 'swap'." +msgstr "" + +#: ../src/datasource_bfilter.c:233 ../src/datasource_bfilter.c:234 +msgid "Manual filter" +msgstr "" + +#: ../src/datasource_bfilter.c:262 +msgid "Waypoints Inside This" +msgstr "" + +#: ../src/datasource_bfilter.c:263 ../src/datasource_bfilter.c:292 +msgid "Polygonized Layer" +msgstr "" + +#: ../src/datasource_bfilter.c:291 +msgid "Waypoints Outside This" +msgstr "" + +#: ../src/datasource_file.c:61 +msgid "Import file with GPSBabel" +msgstr "Importeer bestand met GPSBabel" + +#: ../src/datasource_file.c:62 +msgid "Imported file" +msgstr "Bestand geïmporteerd" + +#. The file selector +#: ../src/datasource_file.c:129 +msgid "File:" +msgstr "Bestand:" + +#: ../src/datasource_file.c:130 +msgid "File to import" +msgstr "Te importeren bestand" + +#: ../src/datasource_file.c:137 +msgid "All files" +msgstr "Alle Bestanden" + +#. The file format selector +#: ../src/datasource_file.c:144 ../src/datasource_url.c:106 +msgid "File type:" +msgstr "Bestandstype:" + +#: ../src/datasource_file.c:189 +#, c-format +msgid "using babel args '%s' and file '%s'" +msgstr "gebruik van babel args '%s' en bestand '%s'" + +#: ../src/datasource_gc.c:67 +msgid "Download Geocaches" +msgstr "Download Geocaches" + +#: ../src/datasource_gc.c:68 +msgid "Geocaching.com Caches" +msgstr "Geocaching.com Cache" + +#: ../src/datasource_gc.c:86 +msgid "geocaching.com username:" +msgstr "geocaching.com gebruikersnaam:" + +#: ../src/datasource_gc.c:87 +msgid "geocaching.com password:" +msgstr "geocaching.com wachtwoord:" + +#: ../src/datasource_gc.c:92 ../src/vikwindow.c:3502 +msgid "Geocaching" +msgstr "" + +#: ../src/datasource_gc.c:128 +#, c-format +msgid "" +"Can't find %s or %s in path! Check that you have installed it correctly." +msgstr "" +"Kan %s of %s niet vinden in pad! Controleer dat het correct werd " +"geïnstalleerd." + +#: ../src/datasource_gc.c:190 +msgid "Number geocaches:" +msgstr "Aantal geocaches:" + +#: ../src/datasource_gc.c:192 +msgid "Centered around:" +msgstr "Gecentreerd rond:" + +#: ../src/datasource_gc.c:231 +msgid "Broken input - using some defaults" +msgstr "Verstoorde invoer - gebruik van een aantal standaardwaarden" + +#: ../src/datasource_geotag.c:51 +msgid "Create Waypoints from Geotagged Images" +msgstr "Maak Waypoints van afbeeldingen met een Geotag" + +#: ../src/datasource_geotag.c:52 +msgid "Geotagged Images" +msgstr "Afbeeldingen met Geotags" + +#: ../src/datasource_geotag.c:102 ../src/datasource_geojson.c:93 +#: ../src/vikfileentry.c:171 ../src/vikwindow.c:3533 ../src/vikwindow.c:3610 +#: ../src/vikwindow.c:3641 ../src/vikwindow.c:4356 ../src/vikwindow.c:4649 +msgid "All" +msgstr "Alles" + +#: ../src/datasource_geotag.c:107 ../src/vikfileentry.c:115 +#: ../src/viktrwlayer_geotag.c:637 ../src/vikwindow.c:3518 +#: ../src/vikwindow.c:4377 +msgid "JPG" +msgstr "JPG" + +#: ../src/datasource_geotag.c:168 +#, c-format +msgid "Unable to create waypoint from %s" +msgstr "Kan geen waypoint maken van %s" + +#: ../src/datasource_geojson.c:46 +msgid "Acquire from GeoJSON" +msgstr "" + +#: ../src/datasource_geojson.c:47 ../src/datasource_geojson.c:98 +msgid "GeoJSON" +msgstr "" + +#: ../src/datasource_geojson.c:152 +#, c-format +msgid "Unable to import from: %s" +msgstr "" + +#: ../src/datasource_gps.c:54 +msgid "Acquire from GPS" +msgstr "Opvragen bij GPS" + +#: ../src/datasource_gps.c:55 +msgid "Acquired from GPS" +msgstr "Opgevraagd bij GPS" + +#: ../src/datasource_gps.c:258 +#, c-format +msgid "using cmd '%s' and file '%s'\n" +msgstr "" + +#: ../src/datasource_gps.c:353 ../src/vikgpslayer.c:966 +#, c-format +msgid "Downloading %d waypoint..." +msgid_plural "Downloading %d waypoints..." +msgstr[0] "%d waypoint aan het downloaden..." +msgstr[1] "%d waypoints aan het downloaden..." + +#: ../src/datasource_gps.c:358 ../src/vikgpslayer.c:971 +#, c-format +msgid "Downloading %d trackpoint..." +msgid_plural "Downloading %d trackpoints..." +msgstr[0] "%d trackpoint aan het downloaden..." +msgstr[1] "%d trackpoints aan het downloaden..." + +#: ../src/datasource_gps.c:363 ../src/vikgpslayer.c:976 +#, c-format +msgid "Downloading %d routepoint..." +msgid_plural "Downloading %d routepoints..." +msgstr[0] "" +msgstr[1] "" + +#: ../src/datasource_gps.c:386 ../src/datasource_gps.c:393 +#: ../src/datasource_gps.c:400 +#, c-format +msgid "Downloaded %d out of %d %s..." +msgstr "%d van %d %s gedownloaded..." + +#: ../src/datasource_gps.c:388 ../src/datasource_gps.c:395 +#: ../src/datasource_gps.c:402 +#, c-format +msgid "Downloaded %d %s." +msgstr "%d %s gedownloaded." + +#: ../src/datasource_gps.c:416 ../src/vikgpslayer.c:1134 +#, c-format +msgid "GPS Device: %s" +msgstr "GPS Apparaat: %s" + +#: ../src/datasource_gps.c:428 ../src/vikgpslayer.c:1214 +msgid "Status: Working..." +msgstr "" + +#. NB gps_layer_inst_init() is performed after parameter registeration +#. thus to give the protocols some potential values use the old static list +#. TODO: find another way to use gps_layer_inst_init()? +#: ../src/datasource_gps.c:584 ../src/vikgpslayer.c:216 +msgid "GPS Protocol:" +msgstr "GPS Protocol:" + +#. List reassigned at runtime +#: ../src/datasource_gps.c:609 ../src/vikgpslayer.c:217 +msgid "Serial Port:" +msgstr "Seriële Poort:" + +#: ../src/datasource_gps.c:659 +msgid "" +"Turn Off After Transfer\n" +"(Garmin/NAViLink Only)" +msgstr "" +"Uitschakelen na overdracht\n" +"(Enkel Garmin/NAViLink)" + +#: ../src/datasource_gps.c:666 +msgid "Tracks:" +msgstr "Sporen:" + +#: ../src/datasource_gps.c:673 +msgid "Routes:" +msgstr "" + +#: ../src/datasource_gps.c:680 +msgid "Waypoints:" +msgstr "Waypoints:" + +#: ../src/datasource_gps.c:756 ../src/vikgpslayer.c:1509 +msgid "GPS device: N/A" +msgstr "GPS Apparaat: N/A" + +#: ../src/datasource_osm.c:53 ../src/datasource_osm.c:54 +msgid "OSM traces" +msgstr "OSM traces" + +#: ../src/datasource_osm.c:89 +msgid "Page number:" +msgstr "Paginanummer:" + +#: ../src/datasource_osm_my_traces.c:59 ../src/datasource_osm_my_traces.c:60 +msgid "OSM My Traces" +msgstr "" + +#: ../src/datasource_osm_my_traces.c:106 ../src/osm-traces.c:684 +#, fuzzy +msgid "Email/username:" +msgstr "OSM gebruikersnaam:" + +#: ../src/datasource_osm_my_traces.c:111 +msgid "The email or username used to login to OSM" +msgstr "" + +#: ../src/datasource_osm_my_traces.c:113 ../src/osm-traces.c:692 +msgid "Password:" +msgstr "Wachtwoord:" + +#: ../src/datasource_osm_my_traces.c:116 +msgid "The password used to login to OSM" +msgstr "" + +#: ../src/datasource_osm_my_traces.c:427 ../src/viktrwlayer.c:689 +msgid "Description" +msgstr "" + +#: ../src/datasource_osm_my_traces.c:442 +msgid "Privacy" +msgstr "" + +#: ../src/datasource_osm_my_traces.c:449 +msgid "Within Current View" +msgstr "" + +#: ../src/datasource_osm_my_traces.c:516 +msgid "GPS Traces" +msgstr "" + +#: ../src/datasource_osm_my_traces.c:518 +msgid "None found!" +msgstr "" + +#: ../src/datasource_osm_my_traces.c:569 +msgid "Ensure the OSM access token preferences are setup." +msgstr "" + +#: ../src/datasource_osm_my_traces.c:645 +msgid "My OSM Traces" +msgstr "" + +#. Report errors to the status bar +#: ../src/datasource_osm_my_traces.c:667 +#, c-format +msgid "Unable to get trace: %s" +msgstr "" + +#: ../src/datasource_routing.c:56 ../src/datasource_routing.c:57 +msgid "Directions" +msgstr "" + +#: ../src/datasource_routing.c:90 +msgid "No routing engines with directions available" +msgstr "" + +#. Engine selector +#: ../src/datasource_routing.c:99 +msgid "Engine:" +msgstr "" + +#. From and To entries +#: ../src/datasource_routing.c:104 +msgid "From:" +msgstr "Van:" + +#: ../src/datasource_routing.c:105 +msgid "To:" +msgstr "Naar:" + +#: ../src/datasource_url.c:48 +msgid "Acquire from URL" +msgstr "" + +#: ../src/datasource_url.c:49 +msgid "URL" +msgstr "" + +#: ../src/datasource_url.c:101 +msgid "URL:" +msgstr "" + +#. Only GPX (not using GPSbabel) +#: ../src/datasource_url.c:133 ../src/vikfileentry.c:161 +#: ../src/vikwindow.c:3513 ../src/vikwindow.c:3603 +msgid "GPX" +msgstr "" + +#: ../src/datasource_wikipedia.c:32 +msgid "Create Waypoints from Wikipedia Articles" +msgstr "" + +#: ../src/datasource_wikipedia.c:33 +msgid "Wikipedia Waypoints" +msgstr "" + +#: ../src/dem.c:66 ../src/dem.c:80 +msgid "Invalid DEM" +msgstr "Ongeldig DEM" + +#: ../src/dem.c:122 +msgid "Invalid DEM header" +msgstr "Ongeldige DEM hoofding" + +#: ../src/dem.c:191 ../src/dem.c:204 +msgid "Incorrect DEM Class B record: expected 1" +msgstr "Foute DEM Class B record: verwacht 1" + +#: ../src/dem.c:289 ../src/download.c:176 +#, c-format +msgid "Couldn't map file %s: %s" +msgstr "" + +#: ../src/download.c:130 +msgid "Tile age (days):" +msgstr "" + +#: ../src/download.c:406 +#, c-format +msgid "Download error: %s" +msgstr "Download fout: %s" + +#: ../src/download.c:490 +msgid "couldn't open temp file" +msgstr "kon temp bestand niet openen" + +#: ../src/file.c:458 ../src/file.c:463 +#, c-format +msgid "Draw mode '%s' no more supported" +msgstr "" + +#: ../src/geotag_exif.c:621 +msgid "Not enough memory." +msgstr "Onvoldoende geheugen." + +#: ../src/geotag_exif.c:639 +msgid "Setting a value for this tag is unsupported!" +msgstr "" + +#: ../src/geotag_exif.c:658 +#, c-format +msgid "Too few components specified (need %d, found %d)\n" +msgstr "" + +#: ../src/geotag_exif.c:662 +msgid "Numeric value expected\n" +msgstr "Numerieke waarde verwacht\n" + +#: ../src/geotag_exif.c:670 +msgid "This shouldn't happen!" +msgstr "Dit zou niet mogen gebeuren!" + +#: ../src/geotag_exif.c:740 +msgid "Not yet implemented!" +msgstr "Nog niet geïmplementeerd!" + +#: ../src/geotag_exif.c:753 +msgid "Warning; Too many components specified!" +msgstr "" + +#: ../src/osm-traces.c:87 +msgid "Identifiable (public w/ timestamps)" +msgstr "" + +#: ../src/osm-traces.c:88 +msgid "Trackable (private w/ timestamps)" +msgstr "" + +#: ../src/osm-traces.c:89 +msgid "Public" +msgstr "Publiek" + +#: ../src/osm-traces.c:90 +msgid "Private" +msgstr "Privé" + +#: ../src/osm-traces.c:108 +msgid "Access Token:" +msgstr "" + +#: ../src/osm-traces.c:108 +msgid "Get New OSM Access Tokens" +msgstr "" + +#: ../src/osm-traces.c:109 +msgid "Access Token Key:" +msgstr "" + +#: ../src/osm-traces.c:110 +msgid "Access Token Secret:" +msgstr "" + +#: ../src/osm-traces.c:111 +msgid "OSM username:" +msgstr "OSM gebruikersnaam:" + +#: ../src/osm-traces.c:112 +msgid "OSM password:" +msgstr "OSM wachtwoord" + +#. Check to really override existing values... +#: ../src/osm-traces.c:263 +msgid "Do you want to overwrite existing values?" +msgstr "" + +#: ../src/osm-traces.c:275 +msgid "Not able to generate OSM request tokens." +msgstr "" + +#: ../src/osm-traces.c:299 +msgid "" +"Waiting for authorization approval.\n" +"Ensure you have granted access at the website before continuing here." +msgstr "" + +#: ../src/osm-traces.c:315 +msgid "No Authorization." +msgstr "" + +#: ../src/osm-traces.c:354 +msgid "" +"OSM Username and Password preferences are not required anymore. You can now " +"remove them." +msgstr "" + +#. Preferences +#: ../src/osm-traces.c:379 +msgid "OpenStreetMap Traces" +msgstr "OpenStreetMap Traces" + +#: ../src/osm-traces.c:504 +#, c-format +msgid "failed to upload data: HTTP response is %ld" +msgstr "" + +#: ../src/osm-traces.c:509 +#, c-format +msgid "curl_easy_getinfo failed: %d" +msgstr "curl_easy_getinfo gefaald: %d" + +#: ../src/osm-traces.c:514 +#, c-format +msgid "curl request failed: %s" +msgstr "curl request gefaald: %s" + +#. Success +#: ../src/osm-traces.c:592 +msgid "Uploaded to OSM" +msgstr "Geuploaded naar OSM" + +#: ../src/osm-traces.c:596 +msgid "" +"FAILED TO UPLOAD DATA TO OSM - Ensure the OSM access token preferences are " +"setup." +msgstr "" + +#: ../src/osm-traces.c:599 +msgid "FAILED TO UPLOAD DATA TO OSM - CURL PROBLEM" +msgstr "" + +#: ../src/osm-traces.c:602 +msgid "FAILED TO UPLOAD DATA TO OSM" +msgstr "" + +#: ../src/osm-traces.c:602 +msgid "HTTP response code" +msgstr "HTTP response code" + +#: ../src/osm-traces.c:610 +#, c-format +msgid "failed to unlink temporary file: %s" +msgstr "" + +#: ../src/osm-traces.c:664 +msgid "OSM upload" +msgstr "OSM upload" + +#: ../src/osm-traces.c:689 +msgid "" +"The email/username used as login\n" +"Enter the email/username you use to login into www.openstreetmap.org." +"" +msgstr "" + +#: ../src/osm-traces.c:697 +msgid "" +"The password used to login\n" +"Enter the password you use to login into www.openstreetmap.org." +msgstr "" + +#: ../src/osm-traces.c:703 +msgid "File's name:" +msgstr "Bestandsnaam:" + +#: ../src/osm-traces.c:713 +msgid "" +"The name of the file on OSM\n" +"This is the name of the file created on the server.This is not the " +"name of the local file." +msgstr "" + +#: ../src/osm-traces.c:717 ../src/viktrwlayer_wpwin.c:197 +#: ../src/viktrwlayer_wpwin.c:199 +msgid "Description:" +msgstr "Omschrijving:" + +#: ../src/osm-traces.c:731 +msgid "The description of the trace" +msgstr "" + +#: ../src/osm-traces.c:734 +msgid "Anonymize Times:" +msgstr "" + +#: ../src/osm-traces.c:739 +msgid "" +"Anonymize times of the trace.\n" +"You may choose to make the trace identifiable, yet mask the actual " +"real time values" +msgstr "" + +#: ../src/osm-traces.c:743 +msgid "Tags:" +msgstr "Labels:" + +#: ../src/osm-traces.c:751 +msgid "The tags associated to the trace" +msgstr "" + +#: ../src/osm-traces.c:816 +#, c-format +msgid "Uploading %s to OSM" +msgstr "" + +#: ../src/mapcache.c:67 +msgid "Map cache memory size (MB):" +msgstr "" + +#. NB Can have a couple hundred fonts loaded when using system directories +#. So ATM don't list them all - otherwise need better GUI feedback display. +#: ../src/mapnik_interface.cpp:324 +#, c-format +msgid "" +"%s %s\n" +"Plugins=%sFonts loaded=%d" +msgstr "" + +#: ../src/mapnik_interface.cpp:325 ../src/vikmapniklayer.c:278 +msgid "Mapnik" +msgstr "" + +#: ../src/print.c:51 ../src/viktrwlayer.c:572 +msgid "None" +msgstr "Geen" + +#: ../src/print.c:52 +msgid "Horizontally" +msgstr "Horizontaal" + +#: ../src/print.c:53 +msgid "Vertically" +msgstr "Verticaal" + +#: ../src/print.c:54 +msgid "Both" +msgstr "Beide" + +#: ../src/print.c:118 +msgid "Image Settings" +msgstr "Afbeeldinginstellingen" + +#: ../src/print.c:551 +msgid "done" +msgstr "voltooid" + +#. Page Size +#: ../src/print.c:580 +msgid "_Adjust Page Size and Orientation" +msgstr "" + +#: ../src/print.c:596 +msgid "C_enter:" +msgstr "_Midden:" + +#. ignore page margins +#: ../src/print.c:614 +msgid "Ignore Page _Margins" +msgstr "Pagina_marges negeren" + +#: ../src/print.c:633 +msgid "Image S_ize:" +msgstr "" + +#: ../src/ui_util.c:88 +#, c-format +msgid "Could not launch web browser. %s" +msgstr "" + +#: ../src/ui_util.c:101 +#, c-format +msgid "Could not create new email. %s" +msgstr "" + +#: ../src/vikcoordlayer.c:57 +msgid "Color:" +msgstr "Kleur:" + +#: ../src/vikcoordlayer.c:58 +msgid "Minutes Width:" +msgstr "" + +#: ../src/vikcoordlayer.c:59 +msgid "Line Thickness:" +msgstr "" + +#: ../src/vikcoordlayer.c:66 +msgid "Coordinate" +msgstr "" + +#: ../src/main.c:92 +#, c-format +msgid "Ignoring Xlib error: error code %d request code %d\n" +msgstr "" + +#: ../src/main.c:111 +msgid "Enable debug output" +msgstr "Debug-uitvoer aanzetten" + +#: ../src/main.c:112 +msgid "Enable verbose output" +msgstr "Extra uitvoer inschakelen" + +#: ../src/main.c:113 +msgid "Show version" +msgstr "Toon versie" + +#: ../src/main.c:114 +msgid "Latitude in decimal degrees" +msgstr "" + +#: ../src/main.c:115 +msgid "Longitude in decimal degrees" +msgstr "" + +#: ../src/main.c:116 +msgid "Zoom Level (OSM). Value can be 0 - 22" +msgstr "" + +#: ../src/main.c:117 +msgid "Add a map layer by id value. Use 0 for the default map." +msgstr "" + +#: ../src/main.c:160 +#, c-format +msgid "" +"%s %s\n" +"Copyright (c) 2003-2008 Evan Battaglia\n" +"Copyright (c) 2008-%s Viking's contributors\n" +msgstr "" + +#: ../src/osm.c:50 +#, fuzzy +msgid "OpenStreetMap (Mapnik)" +msgstr "OpenStreetMap Traces" + +#: ../src/osm.c:65 +#, fuzzy +msgid "OpenStreetMap (Cycle)" +msgstr "OpenStreetMap Traces" + +#: ../src/osm.c:79 +#, fuzzy +msgid "OpenStreetMap (Transport)" +msgstr "OpenStreetMap Traces" + +#: ../src/osm.c:95 +#, fuzzy +msgid "OpenStreetMap (Humanitarian)" +msgstr "OpenStreetMap Traces" + +#: ../src/osm.c:111 +msgid "On Disk OSM Tile Format" +msgstr "" + +#: ../src/osm.c:121 +msgid "MBTiles File" +msgstr "" + +#: ../src/osm.c:132 +msgid "OSM Metatiles" +msgstr "" + +#: ../src/osm.c:146 +msgid "Mapbox Outdoors" +msgstr "" + +#: ../src/osm.c:153 +msgid "Mapbox Specific" +msgstr "" + +#: ../src/osm.c:170 +msgid "OSM (view)" +msgstr "OSM (bekijken)" + +#: ../src/osm.c:174 +msgid "OSM (edit)" +msgstr "OSM (editeren)" + +#. Note the use of positional parameters +#: ../src/osm.c:179 +msgid "OSM (query)" +msgstr "" + +#: ../src/osm.c:183 +msgid "OSM (render)" +msgstr "OSM (weergeven)" + +#. Example: http://127.0.0.1:8111/load_and_zoom?left=8.19&right=8.20&top=48.605&bottom=48.590&select=node413602999 +#. JOSM or merkaartor must already be running with remote interface enabled +#: ../src/osm.c:190 +msgid "Local port 8111 (eg JOSM)" +msgstr "Lokale poort 8111 (vb JOSM)" + +#: ../src/osm.c:195 +msgid "Geofabrik Map Compare" +msgstr "" + +#: ../src/osm.c:203 +msgid "OpenStreetMap Notes" +msgstr "" + +#. Not really OSM but can't be bothered to create somewhere else to put it... +#: ../src/osm.c:221 +msgid "Wikimedia Toolserver GeoHack" +msgstr "" + +#: ../src/preferences.c:195 +msgid "Preferences" +msgstr "Voorkeuren" + +#: ../src/toolbar.c:91 ../src/toolbar.c:92 +msgid "System Default" +msgstr "" + +#: ../src/toolbar.c:91 ../src/viktrwlayer.c:563 +msgid "Small" +msgstr "" + +#: ../src/toolbar.c:91 ../src/viktrwlayer.c:564 +msgid "Medium" +msgstr "" + +#: ../src/toolbar.c:91 ../src/viktrwlayer.c:565 +msgid "Large" +msgstr "" + +#: ../src/toolbar.c:92 +msgid "Icons Only" +msgstr "" + +#: ../src/toolbar.c:92 +msgid "Text Only" +msgstr "" + +#: ../src/toolbar.c:92 +msgid "Icons and Text" +msgstr "" + +#: ../src/toolbar.c:106 +msgid "Append to Menu:" +msgstr "" + +#: ../src/toolbar.c:107 +msgid "Pack the toolbar to the main menu to save vertical space" +msgstr "" + +#: ../src/toolbar.c:108 +msgid "Icon Size:" +msgstr "" + +#: ../src/toolbar.c:110 +msgid "Icon Style:" +msgstr "" + +#: ../src/toolbar.c:112 +msgid "Customize:" +msgstr "" + +#: ../src/toolbar.c:112 +msgid "Customize Buttons" +msgstr "" + +#. Preferences +#: ../src/toolbar.c:145 +msgid "Toolbar" +msgstr "" + +#: ../src/toolbar.c:312 +msgid "_Customize" +msgstr "" + +#: ../src/toolbar.c:641 +msgid "Separator" +msgstr "" + +#: ../src/toolbar.c:642 +msgid "--- Separator ---" +msgstr "" + +#: ../src/toolbar.c:1007 +msgid "Customize Toolbar" +msgstr "" + +#: ../src/toolbar.c:1028 +msgid "" +"Select items to be displayed on the toolbar. Items can be reordered by drag " +"and drop." +msgstr "" + +#: ../src/toolbar.c:1044 +msgid "Available Items" +msgstr "" + +#: ../src/toolbar.c:1065 +msgid "Displayed Items" +msgstr "" + +#: ../src/viklayer_defaults.c:232 +#, c-format +msgid "Could not open file: %s" +msgstr "" + +#: ../src/viklayer_defaults.c:304 +msgid "Layer Defaults" +msgstr "" + +#: ../src/uibuilder.c:196 +msgid "Take care that this password will be stored clearly in a plain file." +msgstr "" + +#: ../src/uibuilder.c:628 ../src/viktrwlayer_export.c:188 +#: ../src/viktrwlayer_export.c:304 ../src/vikwindow.c:3666 +#: ../src/vikwindow.c:4408 +#, c-format +msgid "The file \"%s\" exists, do you wish to overwrite it?" +msgstr "" + +#: ../src/vikaggregatelayer.c:41 +msgid "Aggregate" +msgstr "" + +#: ../src/vikaggregatelayer.c:528 ../src/viktrwlayer.c:11700 +#, c-format +msgid "%s: Waypoint List" +msgstr "" + +#: ../src/vikaggregatelayer.c:570 +msgid "Search by Date" +msgstr "" + +#: ../src/vikaggregatelayer.c:576 +msgid "No items found with the requested date." +msgstr "" + +#: ../src/vikaggregatelayer.c:615 ../src/viktrwlayer.c:11691 +#, c-format +msgid "%s: Track and Route List" +msgstr "" + +#: ../src/vikaggregatelayer.c:681 ../src/viktrwlayer.c:8346 +#: ../src/viktrwlayer.c:8417 ../src/viktrwlayer.c:8494 +msgid "_Visibility" +msgstr "" + +#: ../src/vikaggregatelayer.c:686 +msgid "_Show All" +msgstr "" + +#: ../src/vikaggregatelayer.c:692 +msgid "_Hide All" +msgstr "" + +#: ../src/vikaggregatelayer.c:698 ../src/viktrwlayer.c:8363 +#: ../src/viktrwlayer.c:8434 ../src/viktrwlayer.c:8511 +msgid "_Toggle" +msgstr "" + +#: ../src/vikaggregatelayer.c:705 ../src/viktrwlayer.c:8532 +msgid "_Sort" +msgstr "" + +#: ../src/vikaggregatelayer.c:711 ../src/viktrwlayer.c:8538 +msgid "Name _Ascending" +msgstr "" + +#: ../src/vikaggregatelayer.c:717 ../src/viktrwlayer.c:8544 +msgid "Name _Descending" +msgstr "" + +#: ../src/vikaggregatelayer.c:723 ../src/viktrwlayer.c:575 +#: ../src/viktrwlayer.c:8550 +msgid "Date Ascending" +msgstr "" + +#: ../src/vikaggregatelayer.c:729 ../src/viktrwlayer.c:576 +#: ../src/viktrwlayer.c:8556 +msgid "Date Descending" +msgstr "" + +#: ../src/vikaggregatelayer.c:735 ../src/viktrwlayer.c:8445 +#: ../src/viktrwlayer.c:8523 ../src/viktrwlayer.c:8595 +#: ../src/viktrwlayer_tracklist.c:296 +msgid "_Statistics" +msgstr "" + +#: ../src/vikaggregatelayer.c:740 ../src/viktrwlayer.c:4533 +msgid "Track _List..." +msgstr "" + +#: ../src/vikaggregatelayer.c:746 ../src/viktrwlayer.c:4540 +msgid "_Waypoint List..." +msgstr "" + +#: ../src/vikaggregatelayer.c:753 +msgid "Searc_h" +msgstr "" + +#: ../src/vikaggregatelayer.c:759 +msgid "By _Date..." +msgstr "" + +#: ../src/vikaggregatelayer.c:762 +msgid "Find the first item with a specified date" +msgstr "" + +#: ../src/vikaggregatelayer.c:765 +msgid "Load E_xternal Layers" +msgstr "" + +#. Could have a more complicated tooltip that numbers each type of layers, +#. but for now a simple overall count +#: ../src/vikaggregatelayer.c:1011 +#, c-format +msgid "One layer" +msgid_plural "%d layers" +msgstr[0] "" +msgstr[1] "" + +#: ../src/vikaggregatelayer.c:1014 +#, c-format +msgid "Empty" +msgstr "" + +#: ../src/vikdemlayer.c:86 +msgid "SRTM Global 90m (3 arcsec)" +msgstr "" + +#: ../src/vikdemlayer.c:94 +msgid "Absolute height" +msgstr "" + +#: ../src/vikdemlayer.c:95 +msgid "Height gradient" +msgstr "" + +#: ../src/vikdemlayer.c:120 +msgid "DEM Files:" +msgstr "" + +#: ../src/vikdemlayer.c:121 +msgid "Download Source:" +msgstr "" + +#: ../src/vikdemlayer.c:122 +msgid "Min Elev Color:" +msgstr "" + +#: ../src/vikdemlayer.c:123 ../src/viktrwlayer_wpwin.c:207 +msgid "Type:" +msgstr "Type:" + +#: ../src/vikdemlayer.c:124 +msgid "Min Elev:" +msgstr "" + +#: ../src/vikdemlayer.c:125 +msgid "Max Elev:" +msgstr "" + +#: ../src/vikdemlayer.c:137 +msgid "_DEM Download" +msgstr "" + +#: ../src/vikdemlayer.c:137 +msgid "DEM Download" +msgstr "" + +#: ../src/vikdemlayer.c:192 +msgid "DEM" +msgstr "" + +#: ../src/vikdemlayer.c:304 +#, c-format +msgid "Number of files: %d" +msgstr "" + +#: ../src/vikdemlayer.c:446 +msgid "DEM Loading" +msgstr "" + +#: ../src/vikdemlayer.c:927 +#, c-format +msgid "No SRTM data available for %f, %f" +msgstr "" + +#: ../src/vikdemlayer.c:948 +#, c-format +msgid "DEM download failure for %f, %f" +msgstr "" + +#: ../src/vikdemlayer.c:954 +#, c-format +msgid "DEM write failure for %s" +msgstr "" + +#. Probably not over any land... +#: ../src/vikdemlayer.c:1201 +msgid "No DEM File Available" +msgstr "" + +#: ../src/vikdemlayer.c:1220 +#, c-format +msgid "" +"\n" +"Source: %s\n" +"\n" +"DEM File: %s\n" +"DEM File Timestamp: %s" +msgstr "" + +#: ../src/vikdemlayer.c:1224 +#, c-format +msgid "" +"Source: %s\n" +"\n" +"No DEM File!" +msgstr "" + +#: ../src/vikdemlayer.c:1264 +#, c-format +msgid "Downloading DEM %s" +msgstr "" + +#: ../src/vikdemlayer.c:1289 +msgid "_Show DEM File Information" +msgstr "" + +#: ../src/vikfileentry.c:72 +msgid "Browse..." +msgstr "Bladeren..." + +#: ../src/vikfileentry.c:103 +msgid "Choose file" +msgstr "Bestand kiezen" + +#: ../src/vikfileentry.c:120 ../src/vikwindow.c:4372 +msgid "PNG" +msgstr "" + +#: ../src/vikfileentry.c:125 +msgid "TIFF" +msgstr "" + +#: ../src/vikfileentry.c:133 +msgid "MBTiles" +msgstr "" + +#: ../src/vikfileentry.c:142 +msgid "XML" +msgstr "" + +#: ../src/vikfileentry.c:149 +msgid "MML" +msgstr "" + +#: ../src/vikfileentry.c:154 +msgid "MSS" +msgstr "" + +#: ../src/vikfilelist.c:49 +msgid "Choose file(s)" +msgstr "Bestand(en) kiezen" + +#: ../src/vikfilelist.c:182 +msgid "Add..." +msgstr "Toevoegen..." + +#: ../src/vikfilelist.c:183 +msgid "Delete" +msgstr "Verwijderen" + +#: ../src/vikgeoreflayer.c:97 +msgid "_Georef Move Map" +msgstr "" + +#: ../src/vikgeoreflayer.c:97 +msgid "Georef Move Map" +msgstr "" + +#: ../src/vikgeoreflayer.c:106 +msgid "Georef Z_oom Tool" +msgstr "" + +#: ../src/vikgeoreflayer.c:106 +msgid "Georef Zoom Tool" +msgstr "" + +#: ../src/vikgeoreflayer.c:117 +msgid "GeoRef Map" +msgstr "" + +#: ../src/vikgeoreflayer.c:214 +msgid "Auto Read World Files:" +msgstr "" + +#: ../src/vikgeoreflayer.c:215 +msgid "" +"Automatically attempt to read associated world file of a new image for a " +"GeoRef layer" +msgstr "" + +#: ../src/vikgeoreflayer.c:511 ../src/vikgeoreflayer.c:797 +#: ../src/vikmapslayer.c:1174 +#, c-format +msgid "Couldn't open image file: %s" +msgstr "" + +#: ../src/vikgeoreflayer.c:607 ../src/vikgeoreflayer.c:633 +msgid "Choose World file" +msgstr "" + +#: ../src/vikgeoreflayer.c:619 +msgid "The World file you requested could not be opened for reading." +msgstr "" + +#: ../src/vikgeoreflayer.c:621 +msgid "Unexpected end of file reading World file." +msgstr "" + +#: ../src/vikgeoreflayer.c:646 +msgid "The file you requested could not be opened for writing." +msgstr "" + +#: ../src/vikgeoreflayer.c:782 +msgid "Lower right corner values may not be consistent with upper right values" +msgstr "" + +#: ../src/vikgeoreflayer.c:806 +#, c-format +msgid "Invalid image size: %s" +msgstr "" + +#: ../src/vikgeoreflayer.c:831 ../src/viklayer.c:561 ../src/vikwindow.c:4891 +msgid "Layer Properties" +msgstr "Eigenschappen voor laag" + +#: ../src/vikgeoreflayer.c:852 +msgid "World File Parameters:" +msgstr "" + +#: ../src/vikgeoreflayer.c:853 +msgid "Load From File..." +msgstr "Laden uit bestand..." + +#: ../src/vikgeoreflayer.c:858 +msgid "Corner pixel easting:" +msgstr "" + +#: ../src/vikgeoreflayer.c:860 +msgid "the UTM \"easting\" value of the upper-left corner pixel of the map" +msgstr "" + +#: ../src/vikgeoreflayer.c:862 +msgid "Corner pixel northing:" +msgstr "" + +#: ../src/vikgeoreflayer.c:864 +msgid "the UTM \"northing\" value of the upper-left corner pixel of the map" +msgstr "" + +#: ../src/vikgeoreflayer.c:866 +msgid "X (easting) scale (mpp): " +msgstr "" + +#: ../src/vikgeoreflayer.c:867 +msgid "Y (northing) scale (mpp): " +msgstr "" + +#: ../src/vikgeoreflayer.c:870 +msgid "the scale of the map in the X direction (meters per pixel)" +msgstr "" + +#: ../src/vikgeoreflayer.c:872 +msgid "the scale of the map in the Y direction (meters per pixel)" +msgstr "" + +#: ../src/vikgeoreflayer.c:874 +msgid "Map Image:" +msgstr "" + +#: ../src/vikgeoreflayer.c:919 +msgid "Upper left latitude:" +msgstr "" + +#: ../src/vikgeoreflayer.c:921 +msgid "Upper left longitude:" +msgstr "" + +#: ../src/vikgeoreflayer.c:923 +msgid "Lower right latitude:" +msgstr "" + +#: ../src/vikgeoreflayer.c:925 +msgid "Lower right longitude:" +msgstr "" + +#: ../src/vikgeoreflayer.c:937 +msgid "Calculate MPP values from coordinates" +msgstr "" + +#: ../src/vikgeoreflayer.c:938 +msgid "" +"Enter all corner coordinates before calculating the MPP values from the " +"image size" +msgstr "" + +#: ../src/vikgeoreflayer.c:948 +msgid "UTM" +msgstr "" + +#: ../src/vikgeoreflayer.c:949 +msgid "Latitude/Longitude" +msgstr "" + +#: ../src/vikgeoreflayer.c:957 ../src/vikmapniklayer.c:82 +#: ../src/vikmapslayer.c:158 +msgid "Alpha:" +msgstr "Alpha:" + +#. Now with icons +#: ../src/vikgeoreflayer.c:1062 +msgid "_Zoom to Fit Map" +msgstr "" + +#: ../src/vikgeoreflayer.c:1068 +msgid "_Goto Map Center" +msgstr "" + +#: ../src/vikgeoreflayer.c:1074 +msgid "_Export to World File" +msgstr "" + +#: ../src/vikgoto.c:98 +msgid "No goto tool available." +msgstr "" + +#: ../src/vikgoto.c:295 +msgid "goto" +msgstr "ga naar" + +#: ../src/vikgoto.c:297 +msgid "goto provider:" +msgstr "" + +#: ../src/vikgoto.c:312 +msgid "Enter address or place name:" +msgstr "" + +#: ../src/vikgoto.c:487 +msgid "Locality" +msgstr "" + +#: ../src/vikgpslayer.c:137 +msgid "Data Mode" +msgstr "" + +#: ../src/vikgpslayer.c:139 +msgid "Realtime Tracking Mode" +msgstr "" + +#: ../src/vikgpslayer.c:176 +msgid "Keep vehicle at center" +msgstr "" + +#: ../src/vikgpslayer.c:177 +msgid "Keep vehicle on screen" +msgstr "" + +#: ../src/vikgpslayer.c:178 +msgid "Disable" +msgstr "" + +#: ../src/vikgpslayer.c:218 +msgid "Download Tracks:" +msgstr "Download Tracks:" + +#: ../src/vikgpslayer.c:219 +msgid "Upload Tracks:" +msgstr "Upload Tracks:" + +#: ../src/vikgpslayer.c:220 +msgid "Download Routes:" +msgstr "" + +#: ../src/vikgpslayer.c:221 +msgid "Upload Routes:" +msgstr "" + +#: ../src/vikgpslayer.c:222 +msgid "Download Waypoints:" +msgstr "Download Waypoints:" + +#: ../src/vikgpslayer.c:223 +msgid "Upload Waypoints:" +msgstr "Upload Waypoints:" + +#: ../src/vikgpslayer.c:225 +msgid "Recording tracks" +msgstr "Track opnemen" + +#: ../src/vikgpslayer.c:226 +msgid "Jump to current position on start" +msgstr "" + +#: ../src/vikgpslayer.c:227 +msgid "Moving Map Method:" +msgstr "" + +#: ../src/vikgpslayer.c:228 +msgid "Update Statusbar:" +msgstr "" + +#: ../src/vikgpslayer.c:228 +msgid "Display information in the statusbar on GPS updates" +msgstr "" + +#: ../src/vikgpslayer.c:229 +msgid "Auto Connect" +msgstr "" + +#: ../src/vikgpslayer.c:229 +msgid "Automatically connect to GPSD" +msgstr "" + +#: ../src/vikgpslayer.c:230 +msgid "Gpsd Host:" +msgstr "Gpsd Host:" + +#: ../src/vikgpslayer.c:231 +msgid "Gpsd Port:" +msgstr "Gpsd Port:" + +#: ../src/vikgpslayer.c:232 +msgid "Gpsd Retry Interval (seconds):" +msgstr "Gpsd Retry Interval (seconden):" + +#: ../src/vikgpslayer.c:254 +msgid "GPS" +msgstr "" + +#: ../src/vikgpslayer.c:320 ../src/vikgpslayer.c:1504 +msgid "GPS Download" +msgstr "GPS Download" + +#: ../src/vikgpslayer.c:320 ../src/vikgpslayer.c:1504 ../src/viktrwlayer.c:3993 +msgid "GPS Upload" +msgstr "GPS Upload" + +#: ../src/vikgpslayer.c:322 +msgid "GPS Realtime Tracking" +msgstr "GPS Realtime Tracking" + +#: ../src/vikgpslayer.c:458 +msgid "Connected" +msgstr "" + +#: ../src/vikgpslayer.c:460 +msgid "Disconnected" +msgstr "" + +#: ../src/vikgpslayer.c:554 +msgid "Unknown GPS Protocol" +msgstr "Onbekend GPS Protocol" + +#: ../src/vikgpslayer.c:572 +msgid "Unknown serial port device" +msgstr "" + +#: ../src/vikgpslayer.c:691 +#, c-format +msgid "%s: unknown parameter" +msgstr "" + +#. Now with icons +#: ../src/vikgpslayer.c:794 +msgid "_Upload to GPS" +msgstr "" + +#: ../src/vikgpslayer.c:800 +msgid "Download from _GPS" +msgstr "Download van _GPS" + +#: ../src/vikgpslayer.c:821 +msgid "Empty _Realtime" +msgstr "" + +#: ../src/vikgpslayer.c:828 +msgid "E_mpty Upload" +msgstr "" + +#: ../src/vikgpslayer.c:834 +msgid "_Empty Download" +msgstr "" + +#: ../src/vikgpslayer.c:840 +msgid "Empty _All" +msgstr "" + +#: ../src/vikgpslayer.c:852 +#, c-format +msgid "Unexpected number of disconnected handlers: %d" +msgstr "" + +#: ../src/vikgpslayer.c:995 +#, c-format +msgid "Uploading %d waypoint..." +msgid_plural "Uploading %d waypoints..." +msgstr[0] "Uploaden %d waypoint..." +msgstr[1] "Uploaden %d waypoints..." + +#: ../src/vikgpslayer.c:1000 +#, c-format +msgid "Uploading %d trackpoint..." +msgid_plural "Uploading %d trackpoints..." +msgstr[0] "Uploaden %d trackpoint..." +msgstr[1] "Uploaden %d trackpoints..." + +#: ../src/vikgpslayer.c:1005 +#, c-format +msgid "Uploading %d routepoint..." +msgid_plural "Uploading %d routepoints..." +msgstr[0] "" +msgstr[1] "" + +#: ../src/vikgpslayer.c:1034 +#, c-format +msgid "Downloaded %d out of %d waypoint..." +msgid_plural "Downloaded %d out of %d waypoints..." +msgstr[0] "" +msgstr[1] "" + +#: ../src/vikgpslayer.c:1040 +#, c-format +msgid "Downloaded %d out of %d trackpoint..." +msgid_plural "Downloaded %d out of %d trackpoints..." +msgstr[0] "" +msgstr[1] "" + +#: ../src/vikgpslayer.c:1046 +#, c-format +msgid "Downloaded %d out of %d routepoint..." +msgid_plural "Downloaded %d out of %d routepoints..." +msgstr[0] "" +msgstr[1] "" + +#: ../src/vikgpslayer.c:1056 +#, c-format +msgid "Uploaded %d out of %d waypoint..." +msgid_plural "Uploaded %d out of %d waypoints..." +msgstr[0] "" +msgstr[1] "" + +#: ../src/vikgpslayer.c:1062 +#, c-format +msgid "Uploaded %d out of %d trackpoint..." +msgid_plural "Uploaded %d out of %d trackpoints..." +msgstr[0] "" +msgstr[1] "" + +#: ../src/vikgpslayer.c:1068 +#, c-format +msgid "Uploaded %d out of %d routepoint..." +msgid_plural "Uploaded %d out of %d routepoints..." +msgstr[0] "" +msgstr[1] "" + +#: ../src/vikgpslayer.c:1079 +#, c-format +msgid "Downloaded %d waypoint" +msgid_plural "Downloaded %d waypoints" +msgstr[0] "" +msgstr[1] "" + +#: ../src/vikgpslayer.c:1085 +#, c-format +msgid "Downloaded %d trackpoint" +msgid_plural "Downloaded %d trackpoints" +msgstr[0] "" +msgstr[1] "" + +#: ../src/vikgpslayer.c:1091 +#, c-format +msgid "Downloaded %d routepoint" +msgid_plural "Downloaded %d routepoints" +msgstr[0] "" +msgstr[1] "" + +#: ../src/vikgpslayer.c:1101 +#, c-format +msgid "Uploaded %d waypoint" +msgid_plural "Uploaded %d waypoints" +msgstr[0] "" +msgstr[1] "" + +#: ../src/vikgpslayer.c:1107 +#, c-format +msgid "Uploaded %d trackpoint" +msgid_plural "Uploaded %d trackpoints" +msgstr[0] "" +msgstr[1] "" + +#: ../src/vikgpslayer.c:1113 +#, c-format +msgid "Uploaded %d routepoint" +msgid_plural "Uploaded %d routepoints" +msgstr[0] "" +msgstr[1] "" + +#: ../src/vikgpslayer.c:1363 +msgid "Error: No result." +msgstr "" + +#: ../src/vikgpslayer.c:1471 +msgid "Warning - GPS Upload items may overwrite each other" +msgstr "" + +#: ../src/vikgpslayer.c:1506 +msgid "Status: detecting gpsbabel" +msgstr "Status: bezig met het waarnemen van gpsbabel" + +#: ../src/vikgpslayer.c:1533 +msgid "No GPS items selected for transfer." +msgstr "" + +#: ../src/vikgpslayer.c:1546 +msgid "Could not turn off device." +msgstr "" + +#: ../src/vikgpslayer.c:1589 +msgid "Are you sure you want to delete GPS Upload data?" +msgstr "" + +#: ../src/vikgpslayer.c:1602 +msgid "Are you sure you want to delete GPS Download data?" +msgstr "" + +#: ../src/vikgpslayer.c:1616 +msgid "Are you sure you want to delete GPS Realtime data?" +msgstr "" + +#: ../src/vikgpslayer.c:1630 +msgid "Are you sure you want to delete All GPS data?" +msgstr "" + +#: ../src/vikgpslayer.c:2004 +#, c-format +msgid "" +"Failed to connect to gpsd at %s (port %s)\n" +"Should Viking keep trying (every %d seconds)?" +msgstr "" + +#: ../src/viklayerspanel.c:73 +msgid "C_ut" +msgstr "" + +#: ../src/viklayerspanel.c:74 ../src/vikwindow.c:4882 +msgid "_Copy" +msgstr "" + +#: ../src/viklayerspanel.c:75 ../src/vikwindow.c:4883 +msgid "_Paste" +msgstr "" + +#: ../src/viklayerspanel.c:76 ../src/vikwindow.c:4884 +msgid "_Delete" +msgstr "" + +#: ../src/viklayerspanel.c:154 +msgid "New Layer" +msgstr "" + +#: ../src/viklayerspanel.c:347 +msgid "Top Layer" +msgstr "" + +#: ../src/viklayerspanel.c:363 +msgid "Add new layer" +msgstr "" + +#: ../src/viklayerspanel.c:370 ../src/vikwindow.c:4884 +msgid "Remove selected layer" +msgstr "" + +#: ../src/viklayerspanel.c:377 +msgid "Move selected layer up" +msgstr "" + +#: ../src/viklayerspanel.c:384 +msgid "Move selected layer down" +msgstr "" + +#: ../src/viklayerspanel.c:391 ../src/vikwindow.c:4881 +msgid "Cut selected layer" +msgstr "" + +#: ../src/viklayerspanel.c:398 ../src/vikwindow.c:4882 +msgid "Copy selected layer" +msgstr "" + +#: ../src/viklayerspanel.c:405 ../src/vikwindow.c:4883 +msgid "" +"Paste layer into selected container layer or otherwise above selected layer" +msgstr "" + +#: ../src/viklayerspanel.c:502 +msgid "New name can not be blank." +msgstr "" + +#: ../src/viklayerspanel.c:751 +msgid "Aggregate Layers have no settable properties." +msgstr "" + +#: ../src/viklayerspanel.c:798 +msgid "You cannot cut the Top Layer." +msgstr "Toplaag kan niet geknipt worden" + +#: ../src/viklayerspanel.c:843 +#, c-format +msgid "Are you sure you want to delete %s?" +msgstr "Bent u zeker dat u %s wilt verwijderen?" + +#: ../src/viklayerspanel.c:863 +msgid "You cannot delete the Top Layer." +msgstr "Oplaag kan niet verwijderd worden" + +#: ../src/vikmapniklayer.c:78 +msgid "CSS (MML) Config File:" +msgstr "" + +#: ../src/vikmapniklayer.c:79 +msgid "CartoCSS configuration file" +msgstr "" + +#: ../src/vikmapniklayer.c:80 +msgid "XML Config File:" +msgstr "" + +#: ../src/vikmapniklayer.c:81 +msgid "Mapnik XML configuration file" +msgstr "" + +#: ../src/vikmapniklayer.c:84 +msgid "Use File Cache:" +msgstr "" + +#: ../src/vikmapniklayer.c:86 +msgid "File Cache Directory:" +msgstr "" + +#: ../src/vikmapniklayer.c:122 +msgid "_Mapnik Features" +msgstr "" + +#: ../src/vikmapniklayer.c:122 +msgid "Mapnik Features" +msgstr "" + +#: ../src/vikmapniklayer.c:140 +msgid "Mapnik Rendering" +msgstr "" + +#. Changing these values only applies before first mapnik layer is 'created' +#: ../src/vikmapniklayer.c:258 +msgid "Plugins Directory:" +msgstr "" + +#: ../src/vikmapniklayer.c:258 ../src/vikmapniklayer.c:259 +#: ../src/vikmapniklayer.c:260 ../src/vikmapniklayer.c:261 +msgid "You need to restart Viking for a change to this value to be used" +msgstr "" + +#: ../src/vikmapniklayer.c:259 +msgid "Fonts Directory:" +msgstr "" + +#: ../src/vikmapniklayer.c:260 +msgid "Recurse Fonts Directory:" +msgstr "" + +#: ../src/vikmapniklayer.c:261 +msgid "Rerender Timeout (hours):" +msgstr "" + +#. Changeable any time +#: ../src/vikmapniklayer.c:263 +msgid "CartoCSS:" +msgstr "" + +#: ../src/vikmapniklayer.c:263 +msgid "The program to convert CartoCSS files into Mapnik XML" +msgstr "" + +#: ../src/vikmapniklayer.c:506 +msgid "Running" +msgstr "" + +#: ../src/vikmapniklayer.c:525 +#, c-format +msgid "" +"Error running carto command:\n" +"%s" +msgstr "" + +#: ../src/vikmapniklayer.c:561 +msgid " completed in " +msgstr "" + +#: ../src/vikmapniklayer.c:561 +msgid "seconds" +msgstr "" + +#: ../src/vikmapniklayer.c:611 ../src/vikmapniklayer.c:979 +#, c-format +msgid "" +"Mapnik error loading configuration file:\n" +"%s" +msgstr "" + +#: ../src/vikmapniklayer.c:749 +#, c-format +msgid "Mapnik Render %d:%d:%d %s" +msgstr "" + +#: ../src/vikmapniklayer.c:840 +msgid "Mapnik Rendering must be in Mercator mode" +msgstr "" + +#: ../src/vikmapniklayer.c:997 +msgid "Mapnik Information" +msgstr "" + +#: ../src/vikmapniklayer.c:1031 +msgid "_Flush Memory Cache" +msgstr "" + +#: ../src/vikmapniklayer.c:1044 +msgid "_Run Carto Command" +msgstr "" + +#: ../src/vikmapniklayer.c:1102 ../src/vikmapslayer.c:2029 +#, c-format +msgid "Tile File Timestamp: %s" +msgstr "" + +#: ../src/vikmapniklayer.c:1105 ../src/vikmapslayer.c:2032 +msgid "Tile File Timestamp: Not Available" +msgstr "" + +#: ../src/vikmapniklayer.c:1120 +#, c-format +msgid "Rendering time %.2f seconds" +msgstr "" + +#: ../src/vikmapniklayer.c:1124 ../src/vikmapslayer.c:2042 +msgid "Tile Information" +msgstr "" + +#: ../src/vikmapniklayer.c:1145 +msgid "_Rerender Tile" +msgstr "" + +#: ../src/vikmapniklayer.c:1150 +msgid "_Info" +msgstr "" + +#. ******* MAPZOOMS ******** +#: ../src/vikmapslayer.c:96 +msgid "Use Viking Zoom Level" +msgstr "" + +#: ../src/vikmapslayer.c:146 +msgid "OSM" +msgstr "" + +#. NB mode => id - But can't break file format just to rename something better +#: ../src/vikmapslayer.c:152 +msgid "Map Type:" +msgstr "Kaarttype:" + +#: ../src/vikmapslayer.c:153 +msgid "Maps Directory:" +msgstr "Kaart directory:" + +#: ../src/vikmapslayer.c:154 +msgid "Cache Layout:" +msgstr "" + +#: ../src/vikmapslayer.c:155 +msgid "This determines the tile storage layout on disk" +msgstr "" + +#: ../src/vikmapslayer.c:156 +msgid "Map File:" +msgstr "" + +#: ../src/vikmapslayer.c:157 +msgid "An MBTiles file. Only applies when the map type method is 'MBTiles'" +msgstr "" + +#: ../src/vikmapslayer.c:159 +msgid "Control the Alpha value for transparency effects" +msgstr "" + +#: ../src/vikmapslayer.c:160 +msgid "Autodownload maps:" +msgstr "" + +#: ../src/vikmapslayer.c:161 +msgid "Autodownload Only Gets Missing Maps:" +msgstr "" + +#: ../src/vikmapslayer.c:162 +msgid "" +"Using this option avoids attempting to update already acquired tiles. This " +"can be useful if you want to restrict the network usage, without having to " +"resort to manual control. Only applies when 'Autodownload Maps' is on." +msgstr "" + +#: ../src/vikmapslayer.c:163 +msgid "Zoom Level:" +msgstr "" + +#: ../src/vikmapslayer.c:164 +msgid "" +"Determines the method of displaying map tiles for the current zoom level. " +"'Viking Zoom Level' uses the best matching level, otherwise setting a fixed " +"value will always use map tiles of the specified value regardless of the " +"actual zoom level." +msgstr "" + +#: ../src/vikmapslayer.c:197 +msgid "_Maps Download" +msgstr "" + +#: ../src/vikmapslayer.c:197 +msgid "Maps Download" +msgstr "" + +#: ../src/vikmapslayer.c:213 ../src/vikutils.c:895 +msgid "Map" +msgstr "Kaart" + +#: ../src/vikmapslayer.c:306 +msgid "Default map layer directory:" +msgstr "" + +#: ../src/vikmapslayer.c:306 +msgid "Choose a directory to store cached Map tiles for this layer" +msgstr "" + +#: ../src/vikmapslayer.c:436 ../src/vikmapslayer.c:633 +msgid "Unknown map type" +msgstr "" + +#: ../src/vikmapslayer.c:664 +msgid "Unknown Map Zoom" +msgstr "" + +#: ../src/vikmapslayer.c:833 +#, c-format +msgid "Failed to open MBTiles file: %s" +msgstr "" + +#: ../src/vikmapslayer.c:856 +#, c-format +msgid "" +"New map cannot be displayed in the current drawmode.\n" +"Select \"%s\" from View menu to view it." +msgstr "" + +#: ../src/vikmapslayer.c:1314 +#, c-format +msgid "" +"Cowardly refusing to draw tiles or existence of tiles beyond %d zoom out " +"factor" +msgstr "" + +#. TODO: ?? count up the number of download errors somehow... +#: ../src/vikmapslayer.c:1667 +msgid "Failed to download tile" +msgstr "" + +#: ../src/vikmapslayer.c:1673 +msgid "Unable to save tile" +msgstr "" + +#: ../src/vikmapslayer.c:1799 +#, c-format +msgid "Redownloading up to %d %s map..." +msgid_plural "Redownloading up to %d %s maps..." +msgstr[0] "" +msgstr[1] "" + +#: ../src/vikmapslayer.c:1801 +#, c-format +msgid "Redownloading %d %s map..." +msgid_plural "Redownloading %d %s maps..." +msgstr[0] "" +msgstr[1] "" + +#: ../src/vikmapslayer.c:1805 ../src/vikmapslayer.c:1890 +#, c-format +msgid "Downloading %d %s map..." +msgid_plural "Downloading %d %s maps..." +msgstr[0] "" +msgstr[1] "" + +#: ../src/vikmapslayer.c:1969 +msgid "YES" +msgstr "" + +#: ../src/vikmapslayer.c:1973 ../src/vikmapslayer.c:1977 +msgid "NO" +msgstr "" + +#. NB Also handles .jpg automatically due to pixbuf_new_from () support - although just print png for now. +#: ../src/vikmapslayer.c:1980 +#, c-format +msgid "Source: %s (%d%s%d%s%d.%s %s)" +msgstr "" + +#: ../src/vikmapslayer.c:1983 +msgid "Source: Not available" +msgstr "" + +#: ../src/vikmapslayer.c:2000 +msgid "Source: file://" +msgstr "" + +#: ../src/vikmapslayer.c:2012 +#, c-format +msgid "Source: %s" +msgstr "" + +#: ../src/vikmapslayer.c:2038 +#, c-format +msgid "Tile File: %s [Not Available]" +msgstr "" + +#: ../src/vikmapslayer.c:2086 +msgid "Redownload _Bad Map(s)" +msgstr "" + +#: ../src/vikmapslayer.c:2090 +msgid "Redownload _New Map(s)" +msgstr "" + +#: ../src/vikmapslayer.c:2094 +msgid "Redownload _All Map(s)" +msgstr "" + +#: ../src/vikmapslayer.c:2099 +msgid "_Show Tile Information" +msgstr "" + +#: ../src/vikmapslayer.c:2166 +#, c-format +msgid "" +"Wrong drawmode for this map.\n" +"Select \"%s\" from View menu and try again." +msgstr "" + +#: ../src/vikmapslayer.c:2171 +msgid "Wrong zoom level for this map." +msgstr "" + +#: ../src/vikmapslayer.c:2334 +msgid "Zoom Start:" +msgstr "" + +#: ../src/vikmapslayer.c:2341 +msgid "Zoom End:" +msgstr "" + +#: ../src/vikmapslayer.c:2347 +msgid "Download Maps Method:" +msgstr "" + +#. redownload method - needs to align with REDOWNLOAD* macro values +#: ../src/vikmapslayer.c:2419 +msgid "Missing" +msgstr "" + +#: ../src/vikmapslayer.c:2419 +msgid "Bad" +msgstr "" + +#: ../src/vikmapslayer.c:2419 +msgid "New" +msgstr "" + +#: ../src/vikmapslayer.c:2419 +msgid "Reload All" +msgstr "" + +#: ../src/vikmapslayer.c:2421 +msgid "Download for Zoom Levels" +msgstr "" + +#: ../src/vikmapslayer.c:2461 +#, c-format +msgid "" +"You are not allowed to download more than %d tiles in one go (requested %d)" +msgstr "" + +#: ../src/vikmapslayer.c:2469 +#, c-format +msgid "Do you really want to download %d tiles?" +msgstr "" + +#. Now with icons +#: ../src/vikmapslayer.c:2509 +msgid "Download _Missing Onscreen Maps" +msgstr "" + +#: ../src/vikmapslayer.c:2516 +msgid "Download _New Onscreen Maps" +msgstr "" + +#: ../src/vikmapslayer.c:2523 +msgid "Reload _All Onscreen Maps" +msgstr "" + +#: ../src/vikmapslayer.c:2529 +msgid "Download Maps in _Zoom Levels..." +msgstr "" + +#: ../src/vikmapslayer.c:2539 +msgid "_Open MBTiles Files" +msgstr "" + +#: ../src/vikmapslayer.c:2554 +msgid "Flush Map Cache" +msgstr "" + +#: ../src/vikrouting.c:54 +msgid "Default engine:" +msgstr "" + +#: ../src/vikrouting.c:68 +msgid "Routing" +msgstr "" + +#: ../src/viktreeview.c:347 +msgid "Layer Name" +msgstr "Naam van de laag" + +#: ../src/viktreeview.c:924 +#, c-format +msgid "delete data from %s\n" +msgstr "verwijder gegevens van %s\n" + +#: ../src/viktrwlayer.c:427 +msgid "Create _Waypoint" +msgstr "" + +#: ../src/viktrwlayer.c:427 +msgid "Create Waypoint" +msgstr "Maak Waypoint" + +#: ../src/viktrwlayer.c:437 +#, fuzzy +msgid "Edit _Track" +msgstr "Bewerk Trackpoint" + +#: ../src/viktrwlayer.c:437 +#, fuzzy +msgid "Edit Track" +msgstr "Bewerk Trackpoint" + +#: ../src/viktrwlayer.c:449 +msgid "Edit _Route" +msgstr "" + +#: ../src/viktrwlayer.c:449 +#, fuzzy +msgid "Edit Route" +msgstr "Bewerk Waypoint" + +#: ../src/viktrwlayer.c:460 +msgid "Route _Finder" +msgstr "" + +#: ../src/viktrwlayer.c:460 +msgid "Route Finder" +msgstr "" + +#: ../src/viktrwlayer.c:471 +msgid "Splitter" +msgstr "" + +#: ../src/viktrwlayer.c:482 +msgid "_Edit Waypoint" +msgstr "" + +#: ../src/viktrwlayer.c:482 +msgid "Edit Waypoint" +msgstr "Bewerk Waypoint" + +#: ../src/viktrwlayer.c:495 +msgid "Edit Trac_kpoint" +msgstr "" + +#: ../src/viktrwlayer.c:495 +msgid "Edit Trackpoint" +msgstr "Bewerk Trackpoint" + +#. a pixbuf for this one is already made globally available +#: ../src/viktrwlayer.c:508 +msgid "Show P_icture" +msgstr "" + +#: ../src/viktrwlayer.c:508 +msgid "Show Picture" +msgstr "Toon Afbeelding" + +#: ../src/viktrwlayer.c:531 +msgid "Waypoint Images" +msgstr "" + +#: ../src/viktrwlayer.c:531 +msgid "Tracks Advanced" +msgstr "" + +#: ../src/viktrwlayer.c:531 +msgid "Metadata" +msgstr "" + +#: ../src/viktrwlayer.c:531 +#, fuzzy +msgid "Filesystem" +msgstr "Bestandstype:" + +#: ../src/viktrwlayer.c:534 +msgid "Draw by Track" +msgstr "" + +#: ../src/viktrwlayer.c:534 +msgid "Draw by Speed" +msgstr "" + +#: ../src/viktrwlayer.c:534 +msgid "All Tracks Same Color" +msgstr "" + +#: ../src/viktrwlayer.c:535 +msgid "Filled Square" +msgstr "" + +#: ../src/viktrwlayer.c:535 +msgid "Square" +msgstr "Vierkant" + +#: ../src/viktrwlayer.c:535 +msgid "Circle" +msgstr "Cirkel" + +#: ../src/viktrwlayer.c:535 +msgid "X" +msgstr "X" + +#: ../src/viktrwlayer.c:561 +msgid "Extra Extra Small" +msgstr "" + +#: ../src/viktrwlayer.c:562 +msgid "Extra Small" +msgstr "" + +#: ../src/viktrwlayer.c:566 +msgid "Extra Large" +msgstr "" + +#: ../src/viktrwlayer.c:567 +msgid "Extra Extra Large" +msgstr "" + +#: ../src/viktrwlayer.c:573 +msgid "Name Ascending" +msgstr "" + +#: ../src/viktrwlayer.c:574 +msgid "Name Descending" +msgstr "" + +#: ../src/viktrwlayer.c:582 ../src/viktrwlayer_propwin.c:3319 +msgid "No" +msgstr "" + +#: ../src/viktrwlayer.c:583 +msgid "Yes" +msgstr "" + +#: ../src/viktrwlayer.c:584 +msgid "No write" +msgstr "" + +#: ../src/viktrwlayer.c:649 ../src/viktrwlayer.c:673 +msgid "Draw Labels" +msgstr "Labels tonen" + +#: ../src/viktrwlayer.c:650 +msgid "Note: the individual track controls what labels may be displayed" +msgstr "" + +#: ../src/viktrwlayer.c:651 +msgid "Track Labels Font Size:" +msgstr "" + +#: ../src/viktrwlayer.c:652 +msgid "Track Drawing Mode:" +msgstr "" + +#: ../src/viktrwlayer.c:653 +msgid "All Tracks Color:" +msgstr "" + +#: ../src/viktrwlayer.c:654 +msgid "The color used when 'All Tracks Same Color' drawing mode is selected" +msgstr "" + +#: ../src/viktrwlayer.c:655 +msgid "Draw Track Lines" +msgstr "" + +#: ../src/viktrwlayer.c:656 +msgid "Track Thickness:" +msgstr "" + +#: ../src/viktrwlayer.c:657 +msgid "Draw Track Direction" +msgstr "" + +#: ../src/viktrwlayer.c:658 +msgid "Direction Size:" +msgstr "" + +#: ../src/viktrwlayer.c:659 +msgid "Draw Trackpoints" +msgstr "" + +#: ../src/viktrwlayer.c:660 +msgid "Trackpoint Size:" +msgstr "" + +#: ../src/viktrwlayer.c:661 +msgid "Draw Elevation" +msgstr "" + +#: ../src/viktrwlayer.c:662 +msgid "Draw Elevation Height %:" +msgstr "" + +#: ../src/viktrwlayer.c:663 +msgid "Draw Stops" +msgstr "" + +#: ../src/viktrwlayer.c:664 +msgid "" +"Whether to draw a marker when trackpoints are at the same position but over " +"the minimum stop length apart in time" +msgstr "" + +#: ../src/viktrwlayer.c:665 +msgid "Min Stop Length (seconds):" +msgstr "" + +#: ../src/viktrwlayer.c:667 +msgid "Track BG Thickness:" +msgstr "" + +#: ../src/viktrwlayer.c:668 +msgid "Track Background Color" +msgstr "" + +#: ../src/viktrwlayer.c:669 +msgid "Draw by Speed Factor (%):" +msgstr "" + +#: ../src/viktrwlayer.c:670 +msgid "" +"The percentage factor away from the average speed determining the color used" +msgstr "" + +#: ../src/viktrwlayer.c:671 +msgid "Track Sort Order:" +msgstr "" + +#: ../src/viktrwlayer.c:674 +msgid "Waypoint Font Size:" +msgstr "" + +#: ../src/viktrwlayer.c:675 +msgid "Waypoint Color:" +msgstr "" + +#: ../src/viktrwlayer.c:676 +msgid "Waypoint Text:" +msgstr "" + +#: ../src/viktrwlayer.c:677 +msgid "Background:" +msgstr "Achtergrond:" + +#: ../src/viktrwlayer.c:678 +msgid "Fake BG Color Translucency:" +msgstr "" + +#: ../src/viktrwlayer.c:679 +msgid "Waypoint marker:" +msgstr "" + +#: ../src/viktrwlayer.c:680 +msgid "Waypoint size:" +msgstr "" + +#: ../src/viktrwlayer.c:681 +msgid "Draw Waypoint Symbols:" +msgstr "" + +#: ../src/viktrwlayer.c:682 +msgid "Waypoint Sort Order:" +msgstr "" + +#: ../src/viktrwlayer.c:684 +msgid "Draw Waypoint Images" +msgstr "" + +#: ../src/viktrwlayer.c:685 +msgid "Image Size (pixels):" +msgstr "" + +#: ../src/viktrwlayer.c:686 +msgid "Image Alpha:" +msgstr "" + +#: ../src/viktrwlayer.c:687 +msgid "Image Memory Cache Size:" +msgstr "" + +#: ../src/viktrwlayer.c:690 +msgid "Author" +msgstr "" + +#: ../src/viktrwlayer.c:691 +msgid "Creation Time" +msgstr "" + +#: ../src/viktrwlayer.c:692 +msgid "Keywords" +msgstr "" + +#: ../src/viktrwlayer.c:693 +msgid "External layer:" +msgstr "" + +#: ../src/viktrwlayer.c:693 +msgid "" +"Layer data stored in the Viking file, in an external file, or in an external " +"file but changes are not written to the file (file only loaded at startup)" +msgstr "" + +#: ../src/viktrwlayer.c:694 +msgid "Save layer as:" +msgstr "" + +#: ../src/viktrwlayer.c:694 +msgid "Specify where layer should be saved. Overwrites file if it exists." +msgstr "" + +#: ../src/viktrwlayer.c:798 +msgid "TrackWaypoint" +msgstr "" + +#: ../src/viktrwlayer.c:1999 ../src/viktrwlayer_propwin.c:1469 +#: ../src/viktrwlayer_propwin.c:1471 ../src/vikutils.c:299 +#: ../src/vikutils.c:326 +msgid "miles" +msgstr "" + +#: ../src/viktrwlayer.c:2002 ../src/viktrwlayer_propwin.c:1475 +#: ../src/viktrwlayer_propwin.c:1477 ../src/vikutils.c:303 +#: ../src/vikutils.c:330 +msgid "NM" +msgstr "" + +#. VIK_UNITS_DISTANCE_KILOMETRES: +#: ../src/viktrwlayer.c:2006 ../src/viktrwlayer_propwin.c:1482 +#: ../src/viktrwlayer_propwin.c:1484 ../src/vikutils.c:308 +#: ../src/vikutils.c:335 +msgid "km" +msgstr "" + +#: ../src/viktrwlayer.c:2121 +msgid "start/end" +msgstr "" + +#: ../src/viktrwlayer.c:2133 +msgid "start" +msgstr "" + +#: ../src/viktrwlayer.c:2142 +msgid "end" +msgstr "" + +#: ../src/viktrwlayer.c:3103 +#, c-format +msgid " in %d:%02d hrs:mins" +msgstr "" + +#: ../src/viktrwlayer.c:3107 +#, c-format +msgid "" +"\n" +"%sTotal Length %.1f %s%s" +msgstr "" + +#: ../src/viktrwlayer.c:3131 +#, c-format +msgid "" +"\n" +"Total route length %.1f %s" +msgstr "" + +#: ../src/viktrwlayer.c:3136 +#, c-format +msgid "Tracks: %d - Waypoints: %d - Routes: %d%s%s" +msgstr "" + +#: ../src/viktrwlayer.c:3155 +#, c-format +msgid "Tracks: %d" +msgstr "" + +#: ../src/viktrwlayer.c:3165 +#, c-format +msgid "Routes: %d" +msgstr "" + +#: ../src/viktrwlayer.c:3195 +#, c-format +msgid "- %d:%02d hrs:mins" +msgstr "" + +#: ../src/viktrwlayer.c:3202 +#, c-format +msgid "%s%.1f km %s" +msgstr "" + +#: ../src/viktrwlayer.c:3205 +#, c-format +msgid "%s%.1f miles %s" +msgstr "" + +#: ../src/viktrwlayer.c:3208 +#, c-format +msgid "%s%.1f NM %s" +msgstr "" + +#: ../src/viktrwlayer.c:3222 +#, c-format +msgid "Waypoints: %d" +msgstr "" + +#: ../src/viktrwlayer.c:3279 +#, c-format +msgid "Wpt: Alt %dft" +msgstr "" + +#. VIK_UNITS_HEIGHT_METRES: +#: ../src/viktrwlayer.c:3283 +#, c-format +msgid "Wpt: Alt %dm" +msgstr "" + +#. Add comment if available +#: ../src/viktrwlayer.c:3298 +#, c-format +msgid "%s | %s %s | Comment: %s" +msgstr "" + +#: ../src/viktrwlayer.c:3300 +#, c-format +msgid "%s | %s %s" +msgstr "" + +#: ../src/viktrwlayer.c:3562 ../src/viktrwlayer.c:3591 +msgid "This layer has no waypoints or trackpoints." +msgstr "" + +#: ../src/viktrwlayer.c:3598 ../src/viktrwlayer.c:3607 +#: ../src/viktrwlayer.c:3616 ../src/viktrwlayer.c:3625 +#: ../src/viktrwlayer.c:3634 ../src/viktrwlayer.c:3642 +msgid "Export Layer" +msgstr "" + +#: ../src/viktrwlayer.c:3671 +msgid "Export Route as GPX" +msgstr "" + +#: ../src/viktrwlayer.c:3673 +msgid "Export Track as GPX" +msgstr "" + +#: ../src/viktrwlayer.c:3693 +msgid "Find" +msgstr "" + +#: ../src/viktrwlayer.c:3703 +msgid "Waypoint Name:" +msgstr "" + +#: ../src/viktrwlayer.c:3720 +msgid "Waypoint not found in this layer." +msgstr "" + +#: ../src/viktrwlayer.c:3989 +msgid "Can not upload invisible track." +msgstr "" + +#: ../src/viktrwlayer.c:4082 ../src/viktrwlayer.c:10512 +msgid "Track" +msgstr "" + +#: ../src/viktrwlayer.c:4107 ../src/viktrwlayer.c:10599 +msgid "Route" +msgstr "" + +#: ../src/viktrwlayer.c:4194 +msgid "Externa_l" +msgstr "" + +#: ../src/viktrwlayer.c:4216 ../src/viktrwlayer.c:8456 +#: ../src/viktrwlayer.c:8574 +msgid "_Finish Route" +msgstr "" + +#: ../src/viktrwlayer.c:4218 ../src/viktrwlayer.c:8380 +#: ../src/viktrwlayer.c:8572 +msgid "_Finish Track" +msgstr "" + +#. Now with icons +#: ../src/viktrwlayer.c:4230 +msgid "_View Layer" +msgstr "" + +#: ../src/viktrwlayer.c:4237 +msgid "V_iew" +msgstr "" + +#: ../src/viktrwlayer.c:4243 +msgid "View All _Tracks" +msgstr "" + +#: ../src/viktrwlayer.c:4248 +msgid "View All _Routes" +msgstr "" + +#: ../src/viktrwlayer.c:4253 +msgid "View All _Waypoints" +msgstr "" + +#: ../src/viktrwlayer.c:4258 +msgid "_Goto Center of Layer" +msgstr "" + +#: ../src/viktrwlayer.c:4264 ../src/viktrwlayer.c:8321 +msgid "Goto _Waypoint..." +msgstr "" + +#: ../src/viktrwlayer.c:4270 +msgid "_Export Layer" +msgstr "" + +#: ../src/viktrwlayer.c:4276 +msgid "Export as GPS_Point..." +msgstr "" + +#: ../src/viktrwlayer.c:4281 +msgid "Export as GPS_Mapper..." +msgstr "" + +#: ../src/viktrwlayer.c:4286 +msgid "Export as _GPX..." +msgstr "" + +#: ../src/viktrwlayer.c:4292 +msgid "Export as _KML..." +msgstr "" + +#: ../src/viktrwlayer.c:4299 +msgid "Export as GEO_JSON..." +msgstr "" + +#: ../src/viktrwlayer.c:4306 +msgid "Export via GPSbabel..." +msgstr "" + +#: ../src/viktrwlayer.c:4312 +#, c-format +msgid "Open with External Program_1: %s" +msgstr "" + +#: ../src/viktrwlayer.c:4319 +#, c-format +msgid "Open with External Program_2: %s" +msgstr "" + +#: ../src/viktrwlayer.c:4327 ../src/vikwindow.c:4825 +msgid "_New" +msgstr "" + +#: ../src/viktrwlayer.c:4333 +msgid "New _Waypoint..." +msgstr "" + +#: ../src/viktrwlayer.c:4339 +msgid "New _Track" +msgstr "" + +#: ../src/viktrwlayer.c:4347 +msgid "New _Route" +msgstr "" + +#: ../src/viktrwlayer.c:4356 ../src/viktrwlayer.c:8232 +#: ../src/viktrwlayer.c:9003 +msgid "Geotag _Images..." +msgstr "" + +#: ../src/viktrwlayer.c:4363 +msgid "_Acquire" +msgstr "" + +#: ../src/viktrwlayer.c:4369 ../src/vikwindow.c:4904 +msgid "From _GPS..." +msgstr "" + +#. FIXME: only add menu when at least a routing engine has support for Directions +#: ../src/viktrwlayer.c:4375 +msgid "From _Directions..." +msgstr "" + +#: ../src/viktrwlayer.c:4381 +msgid "From _OSM Traces..." +msgstr "" + +#: ../src/viktrwlayer.c:4386 +msgid "From _My OSM Traces..." +msgstr "" + +#: ../src/viktrwlayer.c:4392 ../src/vikwindow.c:4844 +msgid "From _URL..." +msgstr "" + +#: ../src/viktrwlayer.c:4399 ../src/vikwindow.c:4846 +msgid "From _Wikipedia Waypoints" +msgstr "" + +#: ../src/viktrwlayer.c:4405 +msgid "Within _Layer Bounds" +msgstr "" + +#: ../src/viktrwlayer.c:4411 +msgid "Within _Current View" +msgstr "" + +#: ../src/viktrwlayer.c:4419 +msgid "From Geo_caching..." +msgstr "" + +#: ../src/viktrwlayer.c:4426 ../src/vikwindow.c:4842 +msgid "From Geotagged _Images..." +msgstr "" + +#: ../src/viktrwlayer.c:4433 +msgid "From _File..." +msgstr "" + +#: ../src/viktrwlayer.c:4436 ../src/vikwindow.c:4905 +msgid "Import File With GPS_Babel..." +msgstr "" + +#: ../src/viktrwlayer.c:4443 ../src/viktrwlayer.c:8905 +msgid "_Upload" +msgstr "" + +#: ../src/viktrwlayer.c:4449 +msgid "Upload to _GPS..." +msgstr "" + +#: ../src/viktrwlayer.c:4456 ../src/viktrwlayer.c:8973 +msgid "Upload to _OSM..." +msgstr "" + +#: ../src/viktrwlayer.c:4464 +msgid "De_lete" +msgstr "" + +#: ../src/viktrwlayer.c:4470 +msgid "Delete All _Tracks" +msgstr "" + +#: ../src/viktrwlayer.c:4477 +msgid "Delete Tracks _From Selection..." +msgstr "" + +#: ../src/viktrwlayer.c:4484 ../src/viktrwlayer.c:8481 +msgid "Delete _All Routes" +msgstr "" + +#: ../src/viktrwlayer.c:4491 ../src/viktrwlayer.c:8487 +msgid "_Delete Routes From Selection..." +msgstr "" + +#: ../src/viktrwlayer.c:4498 +msgid "Delete All _Waypoints" +msgstr "" + +#: ../src/viktrwlayer.c:4505 +msgid "Delete Waypoints From _Selection..." +msgstr "" + +#: ../src/viktrwlayer.c:4512 ../src/viktrwlayer.c:8339 +#, fuzzy +msgid "Delete Duplicate Waypoints" +msgstr "Maak Waypoint" + +#: ../src/viktrwlayer.c:5198 +#, c-format +msgid "Are you sure you want to delete all tracks in %s?" +msgstr "" + +#: ../src/viktrwlayer.c:5211 +#, c-format +msgid "Are you sure you want to delete all routes in %s?" +msgstr "" + +#: ../src/viktrwlayer.c:5221 +#, c-format +msgid "Are you sure you want to delete all waypoints in %s?" +msgstr "" + +#: ../src/viktrwlayer.c:5238 +#, c-format +msgid "Are you sure you want to delete the waypoint \"%s\"?" +msgstr "" + +#: ../src/viktrwlayer.c:5254 +#, c-format +msgid "Are you sure you want to delete the track \"%s\"?" +msgstr "" + +#: ../src/viktrwlayer.c:5271 +#, c-format +msgid "Are you sure you want to delete the route \"%s\"?" +msgstr "" + +#: ../src/viktrwlayer.c:5527 ../src/viktrwlayer.c:6373 +msgid "" +"Converting a track to a route removes extra track data such as segments, " +"timestamps, etc...\n" +"Do you want to continue?" +msgstr "" + +#: ../src/viktrwlayer.c:5631 +msgid "No DEM layers available, thus no DEM values can be applied." +msgstr "" + +#: ../src/viktrwlayer.c:5651 ../src/viktrwlayer.c:5692 +#, c-format +msgid "%ld point adjusted" +msgid_plural "%ld points adjusted" +msgstr[0] "" +msgstr[1] "" + +#: ../src/viktrwlayer.c:5736 +#, c-format +msgid "%ld waypoint changed" +msgid_plural "%ld waypoints changed" +msgstr[0] "" +msgstr[1] "" + +#: ../src/viktrwlayer.c:5917 +#, c-format +msgid "" +"Refining a track with many points (%d) is unlikely to yield sensible " +"results. Do you want to Continue?" +msgstr "" + +#. Select engine from dialog +#: ../src/viktrwlayer.c:5925 +msgid "Refine Route with Routing Engine..." +msgstr "" + +#: ../src/viktrwlayer.c:5933 +msgid "Select routing engine" +msgstr "" + +#: ../src/viktrwlayer.c:6158 +msgid "Failed. No other tracks with timestamps in this layer found" +msgstr "" + +#: ../src/viktrwlayer.c:6160 +msgid "Failed. No other tracks without timestamps in this layer found" +msgstr "" + +#: ../src/viktrwlayer.c:6179 +msgid "Merge with..." +msgstr "" + +#: ../src/viktrwlayer.c:6180 +msgid "Select route to merge with" +msgstr "" + +#: ../src/viktrwlayer.c:6180 +msgid "Select track to merge with" +msgstr "" + +#: ../src/viktrwlayer.c:6264 ../src/viktrwlayer.c:6346 +msgid "Append Route" +msgstr "" + +#: ../src/viktrwlayer.c:6264 ../src/viktrwlayer.c:6346 +msgid "Append Track" +msgstr "" + +#: ../src/viktrwlayer.c:6265 +msgid "Select the route to append after the current route" +msgstr "" + +#: ../src/viktrwlayer.c:6266 +msgid "Select the track to append after the current track" +msgstr "" + +#: ../src/viktrwlayer.c:6347 +msgid "Select the track to append after the current route" +msgstr "" + +#: ../src/viktrwlayer.c:6348 +msgid "Select the route to append after the current track" +msgstr "" + +#: ../src/viktrwlayer.c:6414 +#, c-format +msgid "%d segment merged" +msgid_plural "%d segments merged" +msgstr[0] "" +msgstr[1] "" + +#: ../src/viktrwlayer.c:6430 +msgid "Failed. This track does not have timestamp" +msgstr "" + +#: ../src/viktrwlayer.c:6442 +msgid "Failed. No other track in this layer has timestamp" +msgstr "" + +#: ../src/viktrwlayer.c:6449 +msgid "Merge Threshold..." +msgstr "" + +#: ../src/viktrwlayer.c:6450 +msgid "Merge when time between tracks less than:" +msgstr "" + +#: ../src/viktrwlayer.c:6580 +msgid "Split Threshold..." +msgstr "" + +#: ../src/viktrwlayer.c:6581 +msgid "Split when time between trackpoints exceeds:" +msgstr "" + +#: ../src/viktrwlayer.c:6598 +#, c-format +msgid "" +"Can not split track due to trackpoints not ordered in time - such as at %s.\n" +"\n" +"Goto this trackpoint?" +msgstr "" + +#: ../src/viktrwlayer.c:6668 +msgid "Split Every Nth Point" +msgstr "" + +#: ../src/viktrwlayer.c:6669 +msgid "Split on every Nth point:" +msgstr "" + +#: ../src/viktrwlayer.c:6779 +msgid "Can not split track as it has no segments" +msgstr "" + +#: ../src/viktrwlayer.c:6861 ../src/viktrwlayer.c:6891 +#, c-format +msgid "Deleted %ld point" +msgid_plural "Deleted %ld points" +msgstr[0] "" +msgstr[1] "" + +#: ../src/viktrwlayer.c:6966 ../src/viktrwlayer.c:10989 +#: ../src/viktrwlayer_waypointlist.c:214 +#, c-format +msgid "Could not launch %s to open file." +msgstr "" + +#: ../src/viktrwlayer.c:6992 ../src/viktrwlayer.c:7113 +msgid "This track has no date information." +msgstr "" + +#: ../src/viktrwlayer.c:7006 ../src/viktrwlayer.c:7136 +msgid "This waypoint has no date information." +msgstr "" + +#: ../src/viktrwlayer.c:7030 +#, c-format +msgid "Could not launch %s" +msgstr "" + +#: ../src/viktrwlayer.c:7269 +msgid "Internal Error in vik_trw_layer_uniquify_tracks" +msgstr "" + +#: ../src/viktrwlayer.c:7374 ../src/viktrwlayer.c:7424 +#: ../src/viktrwlayer.c:7587 +msgid "" +"Multiple entries with the same name exist. This method only works with " +"unique names. Force unique names now?" +msgstr "" + +#: ../src/viktrwlayer.c:7385 +msgid "No tracks found" +msgstr "" + +#: ../src/viktrwlayer.c:7393 ../src/viktrwlayer.c:7443 +#: ../src/viktrwlayer.c:7607 +msgid "Delete Selection" +msgstr "" + +#: ../src/viktrwlayer.c:7394 +msgid "Select tracks to delete" +msgstr "" + +#: ../src/viktrwlayer.c:7435 +msgid "No routes found" +msgstr "" + +#: ../src/viktrwlayer.c:7444 +msgid "Select routes to delete" +msgstr "" + +#: ../src/viktrwlayer.c:7550 +msgid "Internal Error in vik_trw_layer_uniquify_waypoints" +msgstr "" + +#: ../src/viktrwlayer.c:7597 +msgid "No waypoints found" +msgstr "" + +#: ../src/viktrwlayer.c:7608 +msgid "Select waypoints to delete" +msgstr "" + +#: ../src/viktrwlayer.c:7691 +#, c-format +msgid "%ld waypoint deleted" +msgid_plural "%ld waypoints deleted" +msgstr[0] "" +msgstr[1] "" + +#: ../src/viktrwlayer.c:7697 +#, fuzzy +msgid "No duplicates found" +msgstr "Geen ingangen gevonden!" + +#: ../src/viktrwlayer.c:8028 +#, c-format +msgid "" +"A waypoint with the name \"%s\" already exists. Really rename to the same " +"name?" +msgstr "" + +#: ../src/viktrwlayer.c:8058 +#, c-format +msgid "" +"A track with the name \"%s\" already exists. Really rename to the same name?" +msgstr "" + +#: ../src/viktrwlayer.c:8095 +#, c-format +msgid "" +"A route with the name \"%s\" already exists. Really rename to the same name?" +msgstr "" + +#: ../src/viktrwlayer.c:8215 ../src/viktrwlayer.c:8602 +msgid "_Goto" +msgstr "" + +#: ../src/viktrwlayer.c:8226 +msgid "_Visit Geocache Webpage" +msgstr "" + +#: ../src/viktrwlayer.c:8235 +msgid "Geotag multiple images against this waypoint" +msgstr "" + +#: ../src/viktrwlayer.c:8245 ../src/viktrwlayer_waypointlist.c:352 +msgid "_Show Picture..." +msgstr "" + +#: ../src/viktrwlayer.c:8253 +msgid "Update Geotag on _Image" +msgstr "" + +#: ../src/viktrwlayer.c:8259 +msgid "_Update" +msgstr "" + +#: ../src/viktrwlayer.c:8264 +msgid "Update and _Keep File Timestamp" +msgstr "" + +#: ../src/viktrwlayer.c:8276 +msgid "Visit _Webpage" +msgstr "" + +#: ../src/viktrwlayer.c:8306 +msgid "_New Waypoint..." +msgstr "" + +#: ../src/viktrwlayer.c:8315 +msgid "_View All Waypoints" +msgstr "" + +#: ../src/viktrwlayer.c:8327 +msgid "Delete _All Waypoints" +msgstr "" + +#: ../src/viktrwlayer.c:8333 +msgid "_Delete Waypoints From Selection..." +msgstr "" + +#: ../src/viktrwlayer.c:8351 +msgid "_Show All Waypoints" +msgstr "" + +#: ../src/viktrwlayer.c:8357 +msgid "_Hide All Waypoints" +msgstr "" + +#: ../src/viktrwlayer.c:8369 +msgid "_List Waypoints..." +msgstr "" + +#: ../src/viktrwlayer.c:8390 +msgid "_View All Tracks" +msgstr "" + +#: ../src/viktrwlayer.c:8396 +msgid "_New Track" +msgstr "" + +#: ../src/viktrwlayer.c:8404 +msgid "Delete _All Tracks" +msgstr "" + +#: ../src/viktrwlayer.c:8410 +msgid "_Delete Tracks From Selection..." +msgstr "" + +#: ../src/viktrwlayer.c:8422 +msgid "_Show All Tracks" +msgstr "" + +#: ../src/viktrwlayer.c:8428 +msgid "_Hide All Tracks" +msgstr "" + +#: ../src/viktrwlayer.c:8439 +msgid "_List Tracks..." +msgstr "" + +#: ../src/viktrwlayer.c:8467 +msgid "_View All Routes" +msgstr "" + +#: ../src/viktrwlayer.c:8473 +msgid "_New Route" +msgstr "" + +#: ../src/viktrwlayer.c:8499 +msgid "_Show All Routes" +msgstr "" + +#: ../src/viktrwlayer.c:8505 +msgid "_Hide All Routes" +msgstr "" + +#: ../src/viktrwlayer.c:8516 +msgid "_List Routes..." +msgstr "" + +#: ../src/viktrwlayer.c:8587 +msgid "_View Track" +msgstr "" + +#: ../src/viktrwlayer.c:8589 +msgid "_View Route" +msgstr "" + +#: ../src/viktrwlayer.c:8608 +msgid "_Startpoint" +msgstr "" + +#: ../src/viktrwlayer.c:8614 +msgid "\"_Center\"" +msgstr "" + +#: ../src/viktrwlayer.c:8620 +msgid "_Endpoint" +msgstr "" + +#: ../src/viktrwlayer.c:8626 +msgid "_Highest Altitude" +msgstr "" + +#: ../src/viktrwlayer.c:8632 +msgid "_Lowest Altitude" +msgstr "" + +#: ../src/viktrwlayer.c:8640 +msgid "_Maximum Speed" +msgstr "" + +#: ../src/viktrwlayer.c:8646 +msgid "_Date" +msgstr "" + +#: ../src/viktrwlayer.c:8655 +msgid "Co_mbine" +msgstr "" + +#: ../src/viktrwlayer.c:8663 +msgid "_Merge By Time..." +msgstr "" + +#: ../src/viktrwlayer.c:8668 +msgid "Merge _Segments" +msgstr "" + +#: ../src/viktrwlayer.c:8675 +msgid "Merge _With Other Tracks..." +msgstr "" + +#: ../src/viktrwlayer.c:8682 +msgid "_Append Track..." +msgstr "" + +#: ../src/viktrwlayer.c:8684 +msgid "_Append Route..." +msgstr "" + +#: ../src/viktrwlayer.c:8690 +msgid "Append _Route..." +msgstr "" + +#: ../src/viktrwlayer.c:8692 +msgid "Append _Track..." +msgstr "" + +#: ../src/viktrwlayer.c:8699 +msgid "_Split" +msgstr "" + +#: ../src/viktrwlayer.c:8707 +msgid "_Split By Time..." +msgstr "" + +#. ATM always enable this entry - don't want to have to analyse the track before displaying the menu - to keep the menu speedy +#: ../src/viktrwlayer.c:8713 +msgid "Split Se_gments" +msgstr "" + +#: ../src/viktrwlayer.c:8719 +msgid "Split By _Number of Points..." +msgstr "" + +#: ../src/viktrwlayer.c:8724 +msgid "Split at _Trackpoint" +msgstr "" + +#: ../src/viktrwlayer.c:8732 +msgid "_Insert Points" +msgstr "" + +#: ../src/viktrwlayer.c:8738 +msgid "Insert Point _Before Selected Point" +msgstr "" + +#: ../src/viktrwlayer.c:8745 +msgid "Insert Point _After Selected Point" +msgstr "" + +#: ../src/viktrwlayer.c:8754 +msgid "Delete Poi_nts" +msgstr "" + +#: ../src/viktrwlayer.c:8760 +msgid "Delete _Selected Point" +msgstr "" + +#: ../src/viktrwlayer.c:8768 +msgid "Delete Points With The Same _Position" +msgstr "" + +#: ../src/viktrwlayer.c:8773 +msgid "Delete Points With The Same _Time" +msgstr "" + +#: ../src/viktrwlayer.c:8780 ../src/viktrwlayer.c:9029 +msgid "_Transform" +msgstr "" + +#: ../src/viktrwlayer.c:8788 ../src/viktrwlayer.c:9037 +msgid "_Apply DEM Data" +msgstr "" + +#: ../src/viktrwlayer.c:8793 ../src/viktrwlayer.c:9042 +msgid "_Overwrite" +msgstr "" + +#: ../src/viktrwlayer.c:8796 ../src/viktrwlayer.c:9045 +msgid "Overwrite any existing elevation values with DEM values" +msgstr "" + +#: ../src/viktrwlayer.c:8799 ../src/viktrwlayer.c:9048 +msgid "_Keep Existing" +msgstr "" + +#: ../src/viktrwlayer.c:8802 ../src/viktrwlayer.c:9051 +msgid "Keep existing elevation values, only attempt for missing values" +msgstr "" + +#: ../src/viktrwlayer.c:8807 +msgid "_Smooth Missing Elevation Data" +msgstr "" + +#: ../src/viktrwlayer.c:8812 +msgid "_Interpolated" +msgstr "" + +#: ../src/viktrwlayer.c:8815 +msgid "" +"Interpolate between known elevation values to derive values for the missing " +"elevations" +msgstr "" + +#: ../src/viktrwlayer.c:8818 +msgid "_Flat" +msgstr "" + +#: ../src/viktrwlayer.c:8821 +msgid "Set unknown elevation values to the last known value" +msgstr "" + +#: ../src/viktrwlayer.c:8825 +msgid "C_onvert to a Route" +msgstr "" + +#: ../src/viktrwlayer.c:8827 +msgid "C_onvert to a Track" +msgstr "" + +#: ../src/viktrwlayer.c:8835 +msgid "_Anonymize Times" +msgstr "" + +#: ../src/viktrwlayer.c:8838 +msgid "Shift timestamps to a relative offset from 1901-01-01" +msgstr "" + +#: ../src/viktrwlayer.c:8841 +msgid "_Interpolate Times" +msgstr "" + +#: ../src/viktrwlayer.c:8844 +msgid "" +"Reset trackpoint timestamps between the first and last points such that " +"track is traveled at equal speed" +msgstr "" + +#: ../src/viktrwlayer.c:8849 +msgid "_Reverse Track" +msgstr "" + +#: ../src/viktrwlayer.c:8851 +msgid "_Reverse Route" +msgstr "" + +#: ../src/viktrwlayer.c:8858 +msgid "Refine Route..." +msgstr "" + +#: ../src/viktrwlayer.c:8868 +msgid "Down_load Maps Along Track..." +msgstr "" + +#: ../src/viktrwlayer.c:8870 +msgid "Down_load Maps Along Route..." +msgstr "" + +#: ../src/viktrwlayer.c:8878 +msgid "_Export Track as GPX..." +msgstr "" + +#: ../src/viktrwlayer.c:8880 +msgid "_Export Route as GPX..." +msgstr "" + +#: ../src/viktrwlayer.c:8887 +msgid "E_xtend Track End" +msgstr "" + +#: ../src/viktrwlayer.c:8889 +msgid "E_xtend Route End" +msgstr "" + +#: ../src/viktrwlayer.c:8896 +msgid "Extend _Using Route Finder" +msgstr "" + +#: ../src/viktrwlayer.c:8911 +msgid "_Upload to GPS..." +msgstr "" + +#: ../src/viktrwlayer.c:8926 +msgid "_Diary" +msgstr "" + +#: ../src/viktrwlayer.c:8930 +msgid "Open diary program at this date" +msgstr "" + +#: ../src/viktrwlayer.c:8935 +msgid "_Astronomy" +msgstr "" + +#: ../src/viktrwlayer.c:8938 +msgid "Open astronomy program at this date and location" +msgstr "" + +#: ../src/viktrwlayer.c:8962 +msgid "_View Google Directions" +msgstr "" + +#: ../src/viktrwlayer.c:8984 +msgid "Use with _Filter" +msgstr "" + +#: ../src/viktrwlayer.c:9018 +msgid "_Edit Trackpoint" +msgstr "" + +#: ../src/viktrwlayer.c:10116 +#, c-format +msgid " - Gain %dm:Loss %dm" +msgstr "" + +#: ../src/viktrwlayer.c:10118 +#, c-format +msgid " - Gain %dft:Loss %dft" +msgstr "" + +#: ../src/viktrwlayer.c:10123 +#, c-format +msgid " - Bearing %3.1f° - Step %s" +msgstr "" + +#: ../src/viktrwlayer.c:10232 +#, c-format +msgid "Querying %s for route between (%.3f, %.3f) and (%.3f, %.3f)." +msgstr "" + +#: ../src/viktrwlayer.c:10248 +#, c-format +msgid "%s returned route between (%.3f, %.3f) and (%.3f, %.3f)." +msgstr "" + +#: ../src/viktrwlayer.c:10251 +#, c-format +msgid "Error getting route from %s." +msgstr "" + +#: ../src/viktrwlayer.c:11070 +#, c-format +msgid "Creating %d Image Thumbnails..." +msgstr "" + +#: ../src/viktrwlayer.c:11560 +msgid "No map layer in use. Create one first" +msgstr "" + +#: ../src/viktrwlayer.c:11679 +#, c-format +msgid "%s: Track List" +msgstr "" + +#: ../src/viktrwlayer.c:11681 +#, c-format +msgid "%s: Route List" +msgstr "" + +#: ../src/viktrwlayer.c:11734 +#, c-format +msgid "" +"Could not write external layer %s to %s, please fix and save before exiting " +"or data will be lost" +msgstr "" + +#: ../src/viktrwlayer.c:11782 +#, c-format +msgid "WARNING: issues encountered loading external layer %s from %s" +msgstr "" + +#: ../src/viktrwlayer_export.c:47 +msgid "Auto Device GPX Simplify:" +msgstr "" + +#: ../src/viktrwlayer_export.c:48 +msgid "" +"GPX saves to certain devices will be simplified for device compatibility." +msgstr "" + +#: ../src/viktrwlayer_export.c:125 +#, c-format +msgid "Export of GPX file simplified using point limit: %d" +msgstr "" + +#: ../src/viktrwlayer_export.c:206 ../src/viktrwlayer_export.c:323 +#: ../src/vikwindow.c:3694 +msgid "The filename you requested could not be opened for writing." +msgstr "" + +#: ../src/viktrwlayer_export.c:226 +#, c-format +msgid "Could not launch %s." +msgstr "" + +#: ../src/viktrwlayer_export.c:234 +msgid "Could not create temporary file for export." +msgstr "" + +#: ../src/viktrwlayer_export.c:268 +msgid "File format:" +msgstr "" + +#: ../src/viktrwlayer_export.c:276 +msgid "Select the file format." +msgstr "" + +#: ../src/viktrwlayer_export.c:281 +msgid "" +"Select the information to process.\n" +"Warning: the behavior of these switches is highly dependent of the file " +"format selected.\n" +"Please, refer to GPSbabel if unsure." +msgstr "" + +#: ../src/viktrwlayer_export.c:308 +msgid "You did not select a valid file format." +msgstr "" + +#: ../src/viktrwlayer_propwin.c:915 ../src/viktrwlayer_propwin.c:3381 +#: ../src/viktrwlayer_propwin.c:3417 ../src/viktrwlayer_propwin.c:3457 +#: ../src/viktrwlayer_propwin.c:3509 ../src/viktrwlayer_propwin.c:3527 +#: ../src/viktrwlayer_propwin.c:3600 ../src/viktrwlayer_propwin.c:3601 +#: ../src/viktrwlayer_propwin.c:3602 ../src/viktrwlayer_propwin.c:3611 +#: ../src/viktrwlayer_propwin.c:3612 ../src/viktrwlayer_propwin.c:3629 +#: ../src/viktrwlayer_propwin.c:3630 ../src/viktrwlayer_propwin.c:3644 +#: ../src/viktrwlayer_propwin.c:3645 ../src/viktrwlayer_propwin.c:3646 +#: ../src/viktrwlayer_propwin.c:3660 ../src/viktrwlayer_propwin.c:3661 +#: ../src/viktrwlayer_propwin.c:3662 ../src/viktrwlayer_propwin.c:3676 +#: ../src/viktrwlayer_propwin.c:3677 ../src/viktrwlayer_propwin.c:3678 +#: ../src/viktrwlayer_propwin.c:3695 ../src/viktrwlayer_propwin.c:3696 +#: ../src/viktrwlayer_analysis.c:293 +#, c-format +msgid "No Data" +msgstr "" + +#: ../src/viktrwlayer_propwin.c:960 ../src/viktrwlayer_propwin.c:1245 +#, c-format +msgid "%.1f kph" +msgstr "" + +#: ../src/viktrwlayer_propwin.c:963 ../src/viktrwlayer_propwin.c:1248 +#: ../src/viktrwlayer_analysis.c:352 +#, c-format +msgid "%.1f mph" +msgstr "" + +#: ../src/viktrwlayer_propwin.c:966 ../src/viktrwlayer_propwin.c:1251 +#, c-format +msgid "%.1f knots" +msgstr "" + +#: ../src/viktrwlayer_propwin.c:969 ../src/viktrwlayer_propwin.c:1254 +#, c-format +msgid "%.1f s/km" +msgstr "" + +#: ../src/viktrwlayer_propwin.c:972 ../src/viktrwlayer_propwin.c:1257 +#: ../src/viktrwlayer_analysis.c:389 ../src/viktrwlayer_analysis.c:392 +#, fuzzy, c-format +msgid "%.1f min/km" +msgstr "1 min" + +#: ../src/viktrwlayer_propwin.c:975 ../src/viktrwlayer_propwin.c:1260 +#, c-format +msgid "%.1f sec/mi" +msgstr "" + +#: ../src/viktrwlayer_propwin.c:978 ../src/viktrwlayer_propwin.c:1263 +#: ../src/viktrwlayer_analysis.c:409 ../src/viktrwlayer_analysis.c:412 +#, fuzzy, c-format +msgid "%.1f min/mi" +msgstr "1 min" + +#. VIK_UNITS_SPEED_METRES_PER_SECOND: +#: ../src/viktrwlayer_propwin.c:982 ../src/viktrwlayer_propwin.c:1267 +#, c-format +msgid "%.1f m/s" +msgstr "" + +#. Minutes +#: ../src/viktrwlayer_propwin.c:1411 +msgid "mins" +msgstr "" + +#. Hours +#: ../src/viktrwlayer_propwin.c:1418 +msgid "h" +msgstr "" + +#. Days +#: ../src/viktrwlayer_propwin.c:1424 +msgid "d" +msgstr "" + +#. Weeks +#: ../src/viktrwlayer_propwin.c:1429 +msgid "w" +msgstr "" + +#. 'Months' +#: ../src/viktrwlayer_propwin.c:1433 +msgid "M" +msgstr "" + +#: ../src/viktrwlayer_propwin.c:2051 ../src/viktrwlayer_analysis.c:303 +#, c-format +msgid "%.1f miles" +msgstr "" + +#: ../src/viktrwlayer_propwin.c:2054 ../src/viktrwlayer_analysis.c:306 +#, c-format +msgid "%.1f NM" +msgstr "" + +#. VIK_UNITS_DISTANCE_KILOMETRES +#: ../src/viktrwlayer_propwin.c:2057 ../src/viktrwlayer_analysis.c:310 +#, c-format +msgid "%.1f km" +msgstr "" + +#: ../src/viktrwlayer_propwin.c:3083 +msgid "Failed spliting track. Track unchanged" +msgstr "" + +#: ../src/viktrwlayer_propwin.c:3234 ../src/viktrwlayer_propwin.c:3744 +#, c-format +msgid "%s - Track Properties" +msgstr "" + +#: ../src/viktrwlayer_propwin.c:3239 +msgid "Split at _Marker" +msgstr "" + +#: ../src/viktrwlayer_propwin.c:3240 +msgid "Split _Segments" +msgstr "" + +#: ../src/viktrwlayer_propwin.c:3241 +msgid "_Reverse" +msgstr "" + +#: ../src/viktrwlayer_propwin.c:3242 +msgid "_Delete Dupl." +msgstr "" + +#: ../src/viktrwlayer_propwin.c:3269 +msgid "Comment:" +msgstr "" + +#: ../src/viktrwlayer_propwin.c:3270 +msgid "Description:" +msgstr "" + +#: ../src/viktrwlayer_propwin.c:3271 +msgid "Source:" +msgstr "" + +#: ../src/viktrwlayer_propwin.c:3272 +msgid "Type:" +msgstr "" + +#: ../src/viktrwlayer_propwin.c:3273 +msgid "Color:" +msgstr "" + +#: ../src/viktrwlayer_propwin.c:3274 +msgid "Draw Name:" +msgstr "" + +#: ../src/viktrwlayer_propwin.c:3275 +msgid "Distance Labels:" +msgstr "" + +#: ../src/viktrwlayer_propwin.c:3278 +msgid "Track Length:" +msgstr "" + +#: ../src/viktrwlayer_propwin.c:3279 +msgid "Trackpoints:" +msgstr "" + +#: ../src/viktrwlayer_propwin.c:3280 +msgid "Segments:" +msgstr "" + +#: ../src/viktrwlayer_propwin.c:3281 +msgid "Duplicate Points:" +msgstr "" + +#: ../src/viktrwlayer_propwin.c:3282 +msgid "Max Speed:" +msgstr "" + +#: ../src/viktrwlayer_propwin.c:3283 +msgid "Avg. Speed:" +msgstr "" + +#: ../src/viktrwlayer_propwin.c:3284 +msgid "Moving Avg. Speed:" +msgstr "" + +#: ../src/viktrwlayer_propwin.c:3285 +msgid "Avg. Dist. Between TPs:" +msgstr "" + +#: ../src/viktrwlayer_propwin.c:3286 +msgid "Elevation Range:" +msgstr "" + +#: ../src/viktrwlayer_propwin.c:3287 +msgid "Total Elevation Gain/Loss:" +msgstr "" + +#: ../src/viktrwlayer_propwin.c:3288 +msgid "Start:" +msgstr "" + +#: ../src/viktrwlayer_propwin.c:3289 +msgid "End:" +msgstr "" + +#: ../src/viktrwlayer_propwin.c:3290 +msgid "Duration:" +msgstr "" + +#: ../src/viktrwlayer_propwin.c:3320 +msgid "Centre" +msgstr "" + +#: ../src/viktrwlayer_propwin.c:3321 +msgid "Start only" +msgstr "" + +#: ../src/viktrwlayer_propwin.c:3322 +msgid "End only" +msgstr "" + +#: ../src/viktrwlayer_propwin.c:3323 +msgid "Start and End" +msgstr "" + +#: ../src/viktrwlayer_propwin.c:3324 +msgid "Centre, Start and End" +msgstr "" + +#: ../src/viktrwlayer_propwin.c:3336 +msgid "Maximum number of distance labels to be shown" +msgstr "" + +#: ../src/viktrwlayer_propwin.c:3340 +msgid "Properties" +msgstr "" + +#: ../src/viktrwlayer_propwin.c:3584 +#, c-format +msgid "%d minutes - %d minutes moving" +msgstr "" + +#: ../src/viktrwlayer_propwin.c:3596 +#, c-format +msgid "%s total - %s in segments" +msgstr "" + +#: ../src/viktrwlayer_propwin.c:3607 ../src/viktrwlayer_analysis.c:622 +msgid "Statistics" +msgstr "" + +#: ../src/viktrwlayer_propwin.c:3613 ../src/viktrwlayer_propwin.c:3680 +msgid "Show D_EM" +msgstr "" + +#: ../src/viktrwlayer_propwin.c:3615 ../src/viktrwlayer_propwin.c:3631 +#: ../src/viktrwlayer_propwin.c:3647 ../src/viktrwlayer_propwin.c:3697 +msgid "Show _GPS Speed" +msgstr "" + +#: ../src/viktrwlayer_propwin.c:3617 ../src/viktrwlayer_propwin.c:3633 +#: ../src/viktrwlayer_propwin.c:3665 ../src/viktrwlayer_propwin.c:3699 +msgid "Track Distance:" +msgstr "" + +#: ../src/viktrwlayer_propwin.c:3618 ../src/viktrwlayer_propwin.c:3684 +msgid "Track Height:" +msgstr "" + +#: ../src/viktrwlayer_propwin.c:3624 +msgid "Elevation-distance" +msgstr "" + +#: ../src/viktrwlayer_propwin.c:3634 +msgid "Track Gradient:" +msgstr "" + +#: ../src/viktrwlayer_propwin.c:3639 +msgid "Gradient-distance" +msgstr "" + +#: ../src/viktrwlayer_propwin.c:3649 ../src/viktrwlayer_propwin.c:3666 +#: ../src/viktrwlayer_propwin.c:3683 +msgid "Track Time:" +msgstr "" + +#: ../src/viktrwlayer_propwin.c:3650 ../src/viktrwlayer_propwin.c:3700 +msgid "Track Speed:" +msgstr "" + +#: ../src/viktrwlayer_propwin.c:3651 ../src/viktrwlayer_propwin.c:3667 +#: ../src/viktrwlayer_propwin.c:3685 +msgid "Time/Date:" +msgstr "" + +#: ../src/viktrwlayer_propwin.c:3655 +msgid "Speed-time" +msgstr "" + +#: ../src/viktrwlayer_propwin.c:3663 ../src/viktrwlayer_propwin.c:3679 +msgid "Show S_peed" +msgstr "" + +#: ../src/viktrwlayer_propwin.c:3671 +msgid "Distance-time" +msgstr "" + +#: ../src/viktrwlayer_propwin.c:3690 +msgid "Elevation-time" +msgstr "" + +#: ../src/viktrwlayer_propwin.c:3705 +msgid "Speed-distance" +msgstr "" + +#: ../src/viktrwlayer_tpwin.c:190 ../src/viktrwlayer_wpwin.c:66 +msgid "Date/Time Edit" +msgstr "" + +#: ../src/viktrwlayer_tpwin.c:242 +msgid "Name:" +msgstr "" + +#: ../src/viktrwlayer_tpwin.c:243 +msgid "Latitude:" +msgstr "" + +#: ../src/viktrwlayer_tpwin.c:244 +msgid "Longitude:" +msgstr "" + +#: ../src/viktrwlayer_tpwin.c:245 +msgid "Altitude:" +msgstr "" + +#: ../src/viktrwlayer_tpwin.c:246 +msgid "Course:" +msgstr "" + +#: ../src/viktrwlayer_tpwin.c:247 +msgid "Timestamp:" +msgstr "" + +#: ../src/viktrwlayer_tpwin.c:248 +msgid "Time:" +msgstr "" + +#: ../src/viktrwlayer_tpwin.c:249 +msgid "Distance Difference:" +msgstr "" + +#: ../src/viktrwlayer_tpwin.c:250 +msgid "Time Difference:" +msgstr "" + +#: ../src/viktrwlayer_tpwin.c:251 +msgid "\"Speed\" Between:" +msgstr "" + +#: ../src/viktrwlayer_tpwin.c:252 +msgid "Speed:" +msgstr "" + +#: ../src/viktrwlayer_tpwin.c:253 +msgid "VDOP:" +msgstr "" + +#: ../src/viktrwlayer_tpwin.c:254 +msgid "HDOP:" +msgstr "" + +#: ../src/viktrwlayer_tpwin.c:255 +msgid "PDOP:" +msgstr "" + +#: ../src/viktrwlayer_tpwin.c:256 +msgid "SAT/FIX:" +msgstr "" + +#: ../src/viktrwlayer_tpwin.c:263 ../src/viktrwlayer_tpwin.c:408 +#: ../src/viktrwlayer_tpwin.c:622 +msgid "Trackpoint" +msgstr "" + +#: ../src/viktrwlayer_tpwin.c:266 +msgid "_Insert After" +msgstr "" + +#: ../src/viktrwlayer_tpwin.c:268 +msgid "Split Here" +msgstr "" + +#: ../src/viktrwlayer_tracklist.c:262 ../src/viktrwlayer_waypointlist.c:306 +msgid "_Copy Data" +msgstr "" + +#. +#. item = gtk_image_menu_item_new_with_mnemonic ( _("_Select") ); +#. gtk_image_menu_item_set_image ( (GtkImageMenuItem*)item, gtk_image_new_from_stock (GTK_STOCK_FIND, GTK_ICON_SIZE_MENU) ); +#. g_signal_connect_swapped ( G_OBJECT(item), "activate", G_CALLBACK(trw_layer_track_select), values ); +#. gtk_menu_shell_append (GTK_MENU_SHELL (menu), item); +#. gtk_widget_show ( item ); +#. +#. ATM view auto selects, so don't bother with separate select menu entry +#. +#. item = gtk_image_menu_item_new_with_mnemonic ( _("_Select") ); +#. gtk_image_menu_item_set_image ( (GtkImageMenuItem*)item, gtk_image_new_from_stock (GTK_STOCK_FIND, GTK_ICON_SIZE_MENU) ); +#. g_signal_connect_swapped ( G_OBJECT(item), "activate", G_CALLBACK(trw_layer_waypoint_select), values ); +#. gtk_menu_shell_append (GTK_MENU_SHELL (menu), item); +#. gtk_widget_show ( item ); +#. +#. AUTO SELECT NOT TRUE YET... +#. ATM view auto selects, so don't bother with separate select menu entry +#: ../src/viktrwlayer_tracklist.c:290 ../src/viktrwlayer_waypointlist.c:341 +#: ../src/vikwindow.c:4816 +msgid "_View" +msgstr "" + +#. Insert column for the layer name when viewing multi layers +#: ../src/viktrwlayer_tracklist.c:613 ../src/viktrwlayer_waypointlist.c:609 +msgid "Layer" +msgstr "" + +#: ../src/viktrwlayer_tracklist.c:627 ../src/viktrwlayer_waypointlist.c:624 +msgid "Date" +msgstr "" + +#: ../src/viktrwlayer_tracklist.c:631 ../src/viktrwlayer_waypointlist.c:628 +msgid "Visible" +msgstr "" + +#: ../src/viktrwlayer_tracklist.c:639 +msgid "" +"Distance\n" +"(miles)" +msgstr "" + +#: ../src/viktrwlayer_tracklist.c:642 +msgid "" +"Distance\n" +"(NM)" +msgstr "" + +#: ../src/viktrwlayer_tracklist.c:645 +msgid "" +"Distance\n" +"(km)" +msgstr "" + +#: ../src/viktrwlayer_tracklist.c:651 +msgid "" +"Length\n" +"(minutes)" +msgstr "" + +#: ../src/viktrwlayer_tracklist.c:660 ../src/vikutils.c:93 +msgid "sec/mi" +msgstr "" + +#: ../src/viktrwlayer_tracklist.c:666 +#, c-format +msgid "" +"Av. Speed\n" +"(%s)" +msgstr "" + +#. Apply own formatting of the data +#: ../src/viktrwlayer_tracklist.c:671 +#, c-format +msgid "" +"Max Speed\n" +"(%s)" +msgstr "" + +#: ../src/viktrwlayer_tracklist.c:679 ../src/viktrwlayer_waypointlist.c:637 +msgid "" +"Max Height\n" +"(Feet)" +msgstr "" + +#: ../src/viktrwlayer_tracklist.c:681 ../src/viktrwlayer_waypointlist.c:639 +msgid "" +"Max Height\n" +"(Metres)" +msgstr "" + +#: ../src/viktrwlayer_waypointlist.c:312 +msgid "Copy Data (with _positions)" +msgstr "" + +#: ../src/viktrwlayer_waypointlist.c:633 +msgid "Comment" +msgstr "" + +#: ../src/viktrwlayer_waypointlist.c:643 +msgid "Symbol" +msgstr "" + +#: ../src/viktrwlayer_wpwin.c:93 ../src/viktrwlayer_wpwin.c:302 +msgid "True" +msgstr "" + +#: ../src/viktrwlayer_wpwin.c:122 +msgid "Waypoint Properties" +msgstr "Eigenschappen van Waypoint" + +#: ../src/viktrwlayer_wpwin.c:164 +msgid "Name:" +msgstr "Naam:" + +#: ../src/viktrwlayer_wpwin.c:181 +msgid "Altitude:" +msgstr "Hoogte:" + +#: ../src/viktrwlayer_wpwin.c:186 ../src/viktrwlayer_wpwin.c:188 +msgid "Comment:" +msgstr "Opmerking:" + +#: ../src/viktrwlayer_wpwin.c:202 +msgid "Source:" +msgstr "" + +#: ../src/viktrwlayer_wpwin.c:212 +msgid "Image:" +msgstr "Afbeelding:" + +#: ../src/viktrwlayer_wpwin.c:217 +msgid "Symbol:" +msgstr "Symbool:" + +#: ../src/viktrwlayer_wpwin.c:226 +msgid "(none)" +msgstr "(geen)" + +#. Geotag Info [readonly] +#: ../src/viktrwlayer_wpwin.c:272 +msgid "Has Geotag" +msgstr "" + +#: ../src/viktrwlayer_wpwin.c:279 +msgid "Consistent Position" +msgstr "" + +#. ATM the direction value box is always shown, even when there is no information. +#. It would be nice to be able to hide it until the 'Add' has been performed, +#. however I've not been able to achieve this. +#. Thus simply sensistizing it instead. +#: ../src/viktrwlayer_wpwin.c:292 +#, fuzzy +msgid "Image Direction:" +msgstr "Afbeeldinginstellingen" + +#: ../src/viktrwlayer_wpwin.c:300 +msgid "Magnetic" +msgstr "" + +#: ../src/viktrwlayer_wpwin.c:320 +msgid "Time:" +msgstr "" + +#. TODO: other checks (isalpha or whatever ) +#: ../src/viktrwlayer_wpwin.c:386 +msgid "Please enter a name for the waypoint." +msgstr "Geef alstublieft een name op voor het wegpunt" + +#: ../src/viktrwlayer_geotag.c:320 ../src/viktrwlayer_geotag.c:460 +#, c-format +msgid "Failed updating EXIF on %s" +msgstr "" + +#: ../src/viktrwlayer_geotag.c:562 +#, c-format +msgid "Geotagging %d Images..." +msgstr "" + +#: ../src/viktrwlayer_geotag.c:630 +msgid "Geotag Images" +msgstr "" + +#: ../src/viktrwlayer_geotag.c:640 +msgid "Images" +msgstr "" + +#: ../src/viktrwlayer_geotag.c:645 +msgid "Overwrite Existing Waypoints:" +msgstr "" + +#: ../src/viktrwlayer_geotag.c:648 +msgid "Overwrite Existing GPS Information:" +msgstr "" + +#: ../src/viktrwlayer_geotag.c:650 +msgid "Keep File Modification Timestamp:" +msgstr "" + +#: ../src/viktrwlayer_geotag.c:684 +msgid "Create Waypoints:" +msgstr "" + +#: ../src/viktrwlayer_geotag.c:693 +msgid "Write EXIF:" +msgstr "" + +#: ../src/viktrwlayer_geotag.c:705 +msgid "Automatic Image Direction:" +msgstr "" + +#: ../src/viktrwlayer_geotag.c:707 +msgid "Set image direction based on a heading derived from the track" +msgstr "" + +#: ../src/viktrwlayer_geotag.c:710 +msgid "Interpolate Between Track Segments:" +msgstr "" + +#: ../src/viktrwlayer_geotag.c:715 +msgid "Image Time Offset (Seconds):" +msgstr "" + +#: ../src/viktrwlayer_geotag.c:718 +msgid "" +"The number of seconds to ADD to the photos time to make it match the GPS " +"data. Calculate this with (GPS - Photo). Can be negative or positive. Useful " +"to adjust times when a camera's timestamp was incorrect." +msgstr "" + +#: ../src/viktrwlayer_geotag.c:721 +msgid "Image Timezone:" +msgstr "" + +#: ../src/viktrwlayer_geotag.c:724 +msgid "" +"The timezone that was used when the images were created. For example, if a " +"camera is set to AWST or +8:00 hours. Enter +8:00 here so that the correct " +"adjustment to the images' time can be made. GPS data is always in UTC." +msgstr "" + +#: ../src/viktrwlayer_geotag.c:728 +#, c-format +msgid "Using waypoint: %s" +msgstr "" + +#: ../src/viktrwlayer_geotag.c:742 +#, c-format +msgid "Using track: %s" +msgstr "" + +#: ../src/viktrwlayer_geotag.c:744 +#, c-format +msgid "Using all tracks in: %s" +msgstr "" + +#: ../src/viktrwlayer_analysis.c:214 +msgid "Number of Tracks" +msgstr "" + +#: ../src/viktrwlayer_analysis.c:215 +msgid "Date Range" +msgstr "" + +#: ../src/viktrwlayer_analysis.c:216 +msgid "Total Length" +msgstr "" + +#: ../src/viktrwlayer_analysis.c:217 +msgid "Average Length" +msgstr "" + +#: ../src/viktrwlayer_analysis.c:218 +msgid "Eddington number" +msgstr "" + +#. No.4: Extended display only +#: ../src/viktrwlayer_analysis.c:219 +msgid "Max Speed" +msgstr "" + +#: ../src/viktrwlayer_analysis.c:220 +msgid "Avg. Speed" +msgstr "" + +#: ../src/viktrwlayer_analysis.c:221 +msgid "Minimum Altitude" +msgstr "" + +#: ../src/viktrwlayer_analysis.c:222 +msgid "Maximum Altitude" +msgstr "" + +#: ../src/viktrwlayer_analysis.c:223 +msgid "Total Elevation Gain/Loss" +msgstr "" + +#: ../src/viktrwlayer_analysis.c:224 +msgid "Avg. Elevation Gain/Loss" +msgstr "" + +#: ../src/viktrwlayer_analysis.c:225 +msgid "Total Duration" +msgstr "" + +#: ../src/viktrwlayer_analysis.c:226 +msgid "Avg. Duration" +msgstr "" + +#: ../src/viktrwlayer_analysis.c:317 +#, c-format +msgid "%.2f miles" +msgstr "" + +#: ../src/viktrwlayer_analysis.c:320 +#, c-format +msgid "%.2f NM" +msgstr "" + +#. VIK_UNITS_DISTANCE_KILOMETRES +#: ../src/viktrwlayer_analysis.c:324 +#, c-format +msgid "%.2f km" +msgstr "" + +#: ../src/viktrwlayer_analysis.c:361 +#, c-format +msgid "%.2f m/s" +msgstr "" + +#: ../src/viktrwlayer_analysis.c:370 ../src/viktrwlayer_analysis.c:373 +#, c-format +msgid "%.2f knots" +msgstr "" + +#: ../src/viktrwlayer_analysis.c:379 ../src/viktrwlayer_analysis.c:382 +#, c-format +msgid "%d s/km" +msgstr "" + +#: ../src/viktrwlayer_analysis.c:399 ../src/viktrwlayer_analysis.c:402 +#, c-format +msgid "%d sec/mi" +msgstr "" + +#: ../src/viktrwlayer_analysis.c:420 ../src/viktrwlayer_analysis.c:423 +#, c-format +msgid "%.2f km/h" +msgstr "" + +#: ../src/viktrwlayer_analysis.c:434 ../src/viktrwlayer_analysis.c:440 +#, c-format +msgid "%d feet" +msgstr "" + +#: ../src/viktrwlayer_analysis.c:445 ../src/viktrwlayer_analysis.c:447 +#, c-format +msgid "%d feet / %d feet" +msgstr "" + +#: ../src/viktrwlayer_analysis.c:452 ../src/viktrwlayer_analysis.c:458 +#, c-format +msgid "%d m" +msgstr "" + +#: ../src/viktrwlayer_analysis.c:463 ../src/viktrwlayer_analysis.c:465 +#, c-format +msgid "%d m / %d m" +msgstr "" + +#: ../src/viktrwlayer_analysis.c:477 +#, c-format +msgid "%d:%02d:%02d days:hrs:mins" +msgstr "" + +#: ../src/viktrwlayer_analysis.c:484 +#, c-format +msgid "%d:%02d hrs:mins" +msgstr "" + +#: ../src/viktrwlayer_analysis.c:658 +msgid "Include Invisible Items" +msgstr "" + +#: ../src/vikstatus.c:129 +msgid "Current number of background tasks. Click to see the background jobs." +msgstr "" + +#: ../src/vikstatus.c:134 +msgid "Current zoom level. Click to select a new one." +msgstr "" + +#: ../src/vikstatus.c:141 +msgid "Left click to clear the message. Right click to copy the message." +msgstr "" + +#: ../src/vikutils.c:108 +msgid "GPSD" +msgstr "" + +#. GPS Preamble +#: ../src/vikutils.c:109 +msgid "Trkpt" +msgstr "" + +#: ../src/vikutils.c:160 +#, c-format +msgid "%sSpeed%s %.1f%s" +msgstr "" + +#. Go for 2dp as expect low values for vertical speeds +#: ../src/vikutils.c:214 +#, c-format +msgid "%sClimb%s %.2f%s" +msgstr "" + +#: ../src/vikutils.c:223 +#, c-format +msgid "%sAlt %dfeet" +msgstr "" + +#. VIK_UNITS_HEIGHT_METRES: +#: ../src/vikutils.c:227 +#, c-format +msgid "%sAlt %dm" +msgstr "" + +#: ../src/vikutils.c:235 +#, c-format +msgid "%sCourse %03d°" +msgstr "" + +#: ../src/vikutils.c:249 +msgid "yards" +msgstr "" + +#. VIK_UNITS_DISTANCE_KILOMETRES: +#: ../src/vikutils.c:253 +msgid "m" +msgstr "" + +#: ../src/vikutils.c:257 +#, c-format +msgid "%sDistance diff %d%s" +msgstr "" + +#: ../src/vikutils.c:272 +#, c-format +msgid "%sTime %s" +msgstr "" + +#: ../src/vikutils.c:281 +#, c-format +msgid "%sTime diff %lds" +msgstr "" + +#: ../src/vikutils.c:287 +#, c-format +msgid "%sNo. of Sats %d" +msgstr "" + +#: ../src/vikutils.c:312 +#, c-format +msgid "%sTo End %.2f%s" +msgstr "" + +#: ../src/vikutils.c:339 +#, c-format +msgid "%sDistance along %.2f%s" +msgstr "" + +#: ../src/vikutils.c:359 +#, c-format +msgid "%sTrack: %s" +msgstr "" + +#: ../src/vikutils.c:396 +#, c-format +msgid "" +"There is a newer version of Viking available: %s\n" +"\n" +"Do you wish to go to Viking's website now?" +msgstr "" + +#: ../src/vikutils.c:526 +msgid "" +"This appears to be Viking's very first run.\n" +"\n" +"Do you wish to enable automatic internet features?\n" +"\n" +"Individual settings can be controlled in the Preferences." +msgstr "" + +#: ../src/vikwaypoint.c:37 +msgid "Waypoint" +msgstr "" + +#: ../src/vikwebtool_datasource.c:352 +msgid "Search Term" +msgstr "" + +#. TODO get rid of this as this is unnecessary duplication... +#: ../src/vikwindow.c:258 +msgid "Pan" +msgstr "" + +#: ../src/vikwindow.c:258 +msgid "Zoom" +msgstr "" + +#: ../src/vikwindow.c:258 +msgid "Ruler" +msgstr "" + +#: ../src/vikwindow.c:258 +msgid "Select" +msgstr "" + +#: ../src/vikwindow.c:368 +msgid "This is Viking " +msgstr "" + +#: ../src/vikwindow.c:457 +msgid "Location lookup aborted" +msgstr "" + +#: ../src/vikwindow.c:477 +#, c-format +msgid "Location found: %s" +msgstr "" + +#: ../src/vikwindow.c:486 +msgid "Unable to determine location" +msgstr "" + +#: ../src/vikwindow.c:495 +msgid "Determining location" +msgstr "" + +#: ../src/vikwindow.c:525 +#, c-format +msgid "Location found via geoclue" +msgstr "" + +#: ../src/vikwindow.c:546 +msgid "Default Map" +msgstr "" + +#: ../src/vikwindow.c:557 ../src/vikwindow.c:3938 +msgid "Trying to determine location..." +msgstr "" + +#. Create tooltip +#: ../src/vikwindow.c:723 +msgid "Select zoom level" +msgstr "" + +#: ../src/vikwindow.c:1176 +#, c-format +msgid "" +"Do you want to save the changes you made to the document \"%s\"?\n" +"\n" +"Your changes will be lost if you don't save them." +msgstr "" + +#: ../src/vikwindow.c:1180 +msgid "Don't Save" +msgstr "" + +#: ../src/vikwindow.c:1268 +msgid "mpp" +msgstr "" + +#: ../src/vikwindow.c:1268 +msgid "pixelfact" +msgstr "" + +#: ../src/vikwindow.c:1467 +#, c-format +msgid "%s %s %dm" +msgstr "" + +#: ../src/vikwindow.c:1469 +#, c-format +msgid "%s %s %dft" +msgstr "" + +#: ../src/vikwindow.c:1472 +#, c-format +msgid "%s %s" +msgstr "" + +#: ../src/vikwindow.c:1929 +msgid "_Ruler" +msgstr "" + +#: ../src/vikwindow.c:1929 +msgid "Ruler Tool" +msgstr "" + +#: ../src/vikwindow.c:2204 ../src/vikwindow.c:4818 +msgid "_Zoom" +msgstr "" + +#: ../src/vikwindow.c:2204 +msgid "Zoom Tool" +msgstr "" + +#: ../src/vikwindow.c:2271 ../src/vikwindow.c:4819 +msgid "_Pan" +msgstr "" + +#: ../src/vikwindow.c:2271 +msgid "Pan Tool" +msgstr "" + +#: ../src/vikwindow.c:2425 +msgid "_Select" +msgstr "" + +#: ../src/vikwindow.c:2425 +msgid "Select Tool" +msgstr "" + +#: ../src/vikwindow.c:2615 +msgid "You must select a layer to show its properties." +msgstr "" + +#. No error to show, so unlikely this will get called +#: ../src/vikwindow.c:2629 +msgid "The help system is not available." +msgstr "" + +#. Main error path +#: ../src/vikwindow.c:2632 +#, c-format +msgid "" +"Help is not available because: %s.\n" +"Ensure a Mime Type ghelp handler program is installed (e.g. yelp)." +msgstr "" + +#: ../src/vikwindow.c:2865 +msgid "You must select a layer to delete." +msgstr "" + +#: ../src/vikwindow.c:3171 +msgid "Untitled" +msgstr "" + +#: ../src/vikwindow.c:3300 +#, c-format +msgid "Unable to add '%s' to the list of recently used documents" +msgstr "" + +#: ../src/vikwindow.c:3391 +msgid "The file you requested could not be opened." +msgstr "" + +#: ../src/vikwindow.c:3394 +msgid "" +"GPSBabel is required to load files of this type or GPSBabel encountered " +"problems." +msgstr "" + +#: ../src/vikwindow.c:3397 +#, c-format +msgid "Unable to load malformed GPX file %s" +msgstr "" + +#: ../src/vikwindow.c:3400 +#, c-format +msgid "Unsupported file type for %s" +msgstr "" + +#. Since we can process .vik files with issues just show a warning in the status bar +#. Not that a user can do much about it... or tells them what this issue is yet... +#: ../src/vikwindow.c:3406 +#, c-format +msgid "WARNING: issues encountered loading %s" +msgstr "" + +#: ../src/vikwindow.c:3489 +msgid "Please select a GPS data file to open. " +msgstr "" + +#: ../src/vikwindow.c:3508 +msgid "Google Earth" +msgstr "" + +#: ../src/vikwindow.c:3523 ../src/vikwindow.c:3646 ../src/viking.desktop.in.h:1 +msgid "Viking" +msgstr "" + +#: ../src/vikwindow.c:3594 ../src/vikwindow.c:4632 +msgid "Open File" +msgstr "" + +#: ../src/vikwindow.c:3630 +msgid "Save as Viking File." +msgstr "" + +#: ../src/vikwindow.c:3757 +#, c-format +msgid "Exporting to file: %s" +msgstr "" + +#. Confirm what happened. +#: ../src/vikwindow.c:3774 +#, c-format +msgid "Exported files: %d" +msgstr "" + +#: ../src/vikwindow.c:3786 +msgid "Nothing to Export!" +msgstr "" + +#: ../src/vikwindow.c:3790 +msgid "Export to directory" +msgstr "" + +#: ../src/vikwindow.c:3809 +msgid "Could not convert all files" +msgstr "" + +#: ../src/vikwindow.c:3851 +msgid "File not accessible" +msgstr "" + +#: ../src/vikwindow.c:3854 +msgid "No Viking File" +msgstr "" + +#: ../src/vikwindow.c:3998 +msgid "This layer has no configurable properties." +msgstr "" + +#: ../src/vikwindow.c:4080 +msgid "Are you sure you wish to delete all layers?" +msgstr "Bent u zeker dat u alle lagen wilt verwijderen?" + +#. Try harder... +#: ../src/vikwindow.c:4126 ../src/vikwindow.c:4132 +msgid "Generating image file..." +msgstr "" + +#: ../src/vikwindow.c:4154 +msgid "" +"Failed to generate internal image.\n" +"\n" +"Try creating a smaller image." +msgstr "" + +#: ../src/vikwindow.c:4175 +msgid "Image file generated." +msgstr "" + +#: ../src/vikwindow.c:4177 +msgid "Failed to generate image file." +msgstr "" + +#: ../src/vikwindow.c:4246 +#, c-format +msgid "Unable to write to file %s: %s" +msgstr "" + +#: ../src/vikwindow.c:4284 +msgid "" +"Viewable region outside allowable pixel size bounds for image. Clipping " +"width/height values." +msgstr "" + +#: ../src/vikwindow.c:4309 +#, c-format +msgid "Total area: %ldm x %ldm (%.3f sq. km)" +msgstr "" + +#: ../src/vikwindow.c:4312 +#, c-format +msgid "Total area: %ldm x %ldm (%.3f sq. miles)" +msgstr "" + +#: ../src/vikwindow.c:4315 +#, c-format +msgid "Total area: %ldm x %ldm (%.3f sq. NM)" +msgstr "" + +#. Single file +#: ../src/vikwindow.c:4343 +msgid "Save Image" +msgstr "" + +#: ../src/vikwindow.c:4364 ../src/vikwindow.c:4641 +msgid "KMZ" +msgstr "" + +#: ../src/vikwindow.c:4417 +msgid "You must be in UTM mode to use this feature" +msgstr "" + +#: ../src/vikwindow.c:4421 +msgid "Choose a directory to hold images" +msgstr "" + +#. todo: default for answers inside VikWindow or static (thruout instance) +#: ../src/vikwindow.c:4441 +msgid "Save to Image File" +msgstr "" + +#: ../src/vikwindow.c:4457 +msgid "Width (pixels):" +msgstr "" + +#: ../src/vikwindow.c:4459 +msgid "Height (pixels):" +msgstr "" + +#: ../src/vikwindow.c:4462 +msgid "" +"WARNING: USING LARGE IMAGES OVER 10000x10000\n" +"MAY CRASH THE PROGRAM!" +msgstr "" + +#: ../src/vikwindow.c:4464 +msgid "Zoom (meters per pixel):" +msgstr "" + +#: ../src/vikwindow.c:4480 +msgid "Area in current viewable window" +msgstr "" + +#: ../src/vikwindow.c:4490 +msgid "Save as PNG" +msgstr "" + +#: ../src/vikwindow.c:4491 +msgid "Save as JPEG" +msgstr "" + +#: ../src/vikwindow.c:4520 +msgid "East-west image tiles:" +msgstr "" + +#: ../src/vikwindow.c:4522 +msgid "North-south image tiles:" +msgstr "" + +#: ../src/vikwindow.c:4619 +msgid "This feature is not available in UTM mode" +msgstr "" + +#: ../src/vikwindow.c:4658 +#, c-format +msgid "Unable to import %s." +msgstr "" + +#: ../src/vikwindow.c:4749 +msgid "Choose a background color" +msgstr "" + +#: ../src/vikwindow.c:4765 +msgid "Choose a track highlight color" +msgstr "" + +#: ../src/vikwindow.c:4814 +msgid "_File" +msgstr "" + +#: ../src/vikwindow.c:4815 +msgid "_Edit" +msgstr "" + +#: ../src/vikwindow.c:4817 +msgid "_Show" +msgstr "" + +#: ../src/vikwindow.c:4820 +msgid "_Layers" +msgstr "" + +#: ../src/vikwindow.c:4821 +msgid "_Tools" +msgstr "" + +#: ../src/vikwindow.c:4822 +msgid "_Webtools" +msgstr "" + +#: ../src/vikwindow.c:4823 ../src/vikwindow.c:4893 +msgid "_Help" +msgstr "" + +#: ../src/vikwindow.c:4825 +msgid "New file" +msgstr "" + +#: ../src/vikwindow.c:4826 +msgid "_Open..." +msgstr "" + +#: ../src/vikwindow.c:4826 +msgid "Open a file" +msgstr "" + +#: ../src/vikwindow.c:4827 +msgid "Open _Recent File" +msgstr "" + +#: ../src/vikwindow.c:4828 +msgid "Append _File..." +msgstr "" + +#: ../src/vikwindow.c:4828 +msgid "Append data from a different file" +msgstr "" + +#: ../src/vikwindow.c:4829 +msgid "Open GPX as External _Layer..." +msgstr "" + +#: ../src/vikwindow.c:4829 +msgid "Open a GPX file as an external layer" +msgstr "" + +#: ../src/vikwindow.c:4830 +msgid "_Export All" +msgstr "" + +#: ../src/vikwindow.c:4830 +msgid "Export All TrackWaypoint Layers" +msgstr "" + +#: ../src/vikwindow.c:4831 +msgid "_GPX..." +msgstr "" + +#: ../src/vikwindow.c:4831 +msgid "Export as GPX" +msgstr "" + +#: ../src/vikwindow.c:4832 +msgid "A_cquire" +msgstr "" + +#: ../src/vikwindow.c:4833 +msgid "_Directions..." +msgstr "" + +#: ../src/vikwindow.c:4833 +msgid "Get driving directions" +msgstr "" + +#: ../src/vikwindow.c:4835 +msgid "_OSM Traces..." +msgstr "" + +#: ../src/vikwindow.c:4835 +msgid "Get traces from OpenStreetMap" +msgstr "" + +#: ../src/vikwindow.c:4836 +msgid "_My OSM Traces..." +msgstr "" + +#: ../src/vikwindow.c:4836 +msgid "Get Your Own Traces from OpenStreetMap" +msgstr "" + +#: ../src/vikwindow.c:4839 +msgid "Geo_caches..." +msgstr "" + +#: ../src/vikwindow.c:4839 +msgid "Get Geocaches from geocaching.com" +msgstr "" + +#: ../src/vikwindow.c:4842 +msgid "Create waypoints from geotagged images" +msgstr "" + +#: ../src/vikwindow.c:4844 +msgid "Get a file from a URL" +msgstr "" + +#: ../src/vikwindow.c:4846 +msgid "Create waypoints from Wikipedia items in the current view" +msgstr "" + +#: ../src/vikwindow.c:4848 +msgid "_Save" +msgstr "" + +#: ../src/vikwindow.c:4848 +msgid "Save the file" +msgstr "" + +#: ../src/vikwindow.c:4849 +msgid "Save _As..." +msgstr "" + +#: ../src/vikwindow.c:4849 +msgid "Save the file under different name" +msgstr "" + +#: ../src/vikwindow.c:4850 +msgid "Properties..." +msgstr "" + +#: ../src/vikwindow.c:4850 +msgid "File Properties" +msgstr "" + +#: ../src/vikwindow.c:4852 +msgid "Import KMZ _Map File..." +msgstr "" + +#: ../src/vikwindow.c:4852 +msgid "Import a KMZ file" +msgstr "" + +#: ../src/vikwindow.c:4853 +msgid "Generate _KMZ Map File..." +msgstr "" + +#: ../src/vikwindow.c:4853 +msgid "Generate a KMZ file with an overlay of the current view" +msgstr "" + +#: ../src/vikwindow.c:4855 +msgid "_Generate Image File..." +msgstr "" + +#: ../src/vikwindow.c:4855 +msgid "Save a snapshot of the workspace into a file" +msgstr "" + +#: ../src/vikwindow.c:4856 +msgid "Generate _Directory of Images..." +msgstr "" + +#: ../src/vikwindow.c:4856 +msgid "Generate _Directory of Images" +msgstr "" + +#: ../src/vikwindow.c:4857 +msgid "_Print..." +msgstr "" + +#: ../src/vikwindow.c:4857 +msgid "Print maps" +msgstr "" + +#: ../src/vikwindow.c:4858 +msgid "E_xit" +msgstr "" + +#: ../src/vikwindow.c:4858 +msgid "Exit the program" +msgstr "" + +#: ../src/vikwindow.c:4859 +msgid "Save and Exit" +msgstr "" + +#: ../src/vikwindow.c:4859 +msgid "Save and Exit the program" +msgstr "" + +#: ../src/vikwindow.c:4861 +msgid "Go to the Pre_vious Location" +msgstr "" + +#: ../src/vikwindow.c:4861 +msgid "Go to the previous location" +msgstr "" + +#: ../src/vikwindow.c:4862 +msgid "Go to the _Next Location" +msgstr "" + +#: ../src/vikwindow.c:4862 +msgid "Go to the next location" +msgstr "" + +#: ../src/vikwindow.c:4863 +msgid "Go to the _Default Location" +msgstr "" + +#: ../src/vikwindow.c:4863 +msgid "Go to the default location" +msgstr "" + +#: ../src/vikwindow.c:4864 +msgid "Go to the _Auto Location" +msgstr "" + +#: ../src/vikwindow.c:4864 +msgid "Go to a location via automatic lookup" +msgstr "" + +#: ../src/vikwindow.c:4865 +msgid "Go to _Location..." +msgstr "" + +#: ../src/vikwindow.c:4865 +msgid "Go to address/place using text search" +msgstr "" + +#: ../src/vikwindow.c:4866 +msgid "_Go to Lat/Lon..." +msgstr "" + +#: ../src/vikwindow.c:4866 +msgid "Go to arbitrary lat/lon coordinate" +msgstr "" + +#: ../src/vikwindow.c:4867 +msgid "Go to UTM..." +msgstr "" + +#: ../src/vikwindow.c:4867 +msgid "Go to arbitrary UTM coordinate" +msgstr "" + +#: ../src/vikwindow.c:4868 +#, fuzzy +msgid "Go to Today" +msgstr "Ga naar UTM" + +#: ../src/vikwindow.c:4868 +msgid "Go to today on the calendar" +msgstr "" + +#: ../src/vikwindow.c:4869 +msgid "_Refresh" +msgstr "" + +#: ../src/vikwindow.c:4869 +msgid "Refresh any maps displayed" +msgstr "" + +#: ../src/vikwindow.c:4870 +msgid "Set _Highlight Color..." +msgstr "" + +#: ../src/vikwindow.c:4870 +msgid "Set Highlight Color" +msgstr "" + +#: ../src/vikwindow.c:4871 +msgid "Set Bac_kground Color..." +msgstr "" + +#: ../src/vikwindow.c:4871 +msgid "Set Background Color" +msgstr "" + +#: ../src/vikwindow.c:4872 +msgid "Zoom _In" +msgstr "" + +#: ../src/vikwindow.c:4872 +msgid "Zoom In" +msgstr "" + +#: ../src/vikwindow.c:4873 +msgid "Zoom _Out" +msgstr "" + +#: ../src/vikwindow.c:4873 +msgid "Zoom Out" +msgstr "" + +#: ../src/vikwindow.c:4874 +msgid "Zoom _To..." +msgstr "" + +#: ../src/vikwindow.c:4874 +msgid "Zoom To" +msgstr "" + +#: ../src/vikwindow.c:4875 +msgid "Pan _North" +msgstr "" + +#: ../src/vikwindow.c:4876 +msgid "Pan _East" +msgstr "" + +#: ../src/vikwindow.c:4877 +msgid "Pan _South" +msgstr "" + +#: ../src/vikwindow.c:4878 +msgid "Pan _West" +msgstr "" + +#: ../src/vikwindow.c:4879 +msgid "Background _Jobs" +msgstr "" + +#: ../src/vikwindow.c:4879 +msgid "Background Jobs" +msgstr "" + +#: ../src/vikwindow.c:4881 +msgid "Cu_t" +msgstr "" + +#: ../src/vikwindow.c:4885 +msgid "Delete All" +msgstr "" + +#: ../src/vikwindow.c:4886 +msgid "Copy Centre _Location" +msgstr "" + +#: ../src/vikwindow.c:4887 +msgid "_Flush Map Cache" +msgstr "" + +#: ../src/vikwindow.c:4888 +msgid "_Set the Default Location" +msgstr "" + +#: ../src/vikwindow.c:4888 +msgid "Set the Default Location to the current position" +msgstr "" + +#: ../src/vikwindow.c:4889 +msgid "_Preferences" +msgstr "" + +#: ../src/vikwindow.c:4889 +msgid "Program Preferences" +msgstr "" + +#: ../src/vikwindow.c:4890 +msgid "_Layer Defaults" +msgstr "" + +#: ../src/vikwindow.c:4891 +msgid "_Properties" +msgstr "" + +#: ../src/vikwindow.c:4893 +msgid "Help" +msgstr "" + +#: ../src/vikwindow.c:4894 +msgid "_About" +msgstr "" + +#: ../src/vikwindow.c:4894 +msgid "About" +msgstr "" + +#: ../src/vikwindow.c:4903 +msgid "_KML..." +msgstr "" + +#: ../src/vikwindow.c:4903 +msgid "Export as KML" +msgstr "" + +#: ../src/vikwindow.c:4904 +msgid "Transfer data from a GPS device" +msgstr "" + +#: ../src/vikwindow.c:4905 +msgid "Import file via GPSBabel converter" +msgstr "" + +#: ../src/vikwindow.c:4909 +msgid "Import Geo_JSON File..." +msgstr "" + +#: ../src/vikwindow.c:4909 +msgid "Import GeoJSON file" +msgstr "" + +#: ../src/vikwindow.c:4914 +msgid "_UTM Mode" +msgstr "" + +#: ../src/vikwindow.c:4915 +msgid "_Expedia Mode" +msgstr "" + +#: ../src/vikwindow.c:4916 +msgid "_Mercator Mode" +msgstr "" + +#: ../src/vikwindow.c:4917 +msgid "Lat_/Lon Mode" +msgstr "" + +#: ../src/vikwindow.c:4921 +msgid "Show _Scale" +msgstr "" + +#: ../src/vikwindow.c:4921 +msgid "Show Scale" +msgstr "" + +#: ../src/vikwindow.c:4922 +msgid "Show _Center Mark" +msgstr "" + +#: ../src/vikwindow.c:4922 +msgid "Show Center Mark" +msgstr "" + +#: ../src/vikwindow.c:4923 +msgid "Show _Highlight" +msgstr "" + +#: ../src/vikwindow.c:4923 +msgid "Show Highlight" +msgstr "" + +#: ../src/vikwindow.c:4924 +msgid "_Full Screen" +msgstr "" + +#: ../src/vikwindow.c:4924 +msgid "Activate full screen mode" +msgstr "" + +#: ../src/vikwindow.c:4925 +msgid "Show Side _Panel" +msgstr "" + +#: ../src/vikwindow.c:4925 +msgid "Show Side Panel" +msgstr "" + +#: ../src/vikwindow.c:4926 +msgid "Show Status_bar" +msgstr "" + +#: ../src/vikwindow.c:4926 +msgid "Show Statusbar" +msgstr "" + +#: ../src/vikwindow.c:4927 +msgid "Show _Toolbar" +msgstr "" + +#: ../src/vikwindow.c:4927 +msgid "Show Toolbar" +msgstr "" + +#: ../src/vikwindow.c:4928 +msgid "Show _Menu" +msgstr "" + +#: ../src/vikwindow.c:4928 +msgid "Show Menu" +msgstr "" + +#: ../src/vikwindow.c:4929 +msgid "Show Side Panel B_uttons" +msgstr "" + +#: ../src/vikwindow.c:4929 +msgid "Show Side Panel Buttons" +msgstr "" + +#: ../src/vikwindow.c:4930 +msgid "Show Side Panel Ca_lendar" +msgstr "" + +#: ../src/vikwindow.c:4930 +msgid "Show Side Panel Calendar" +msgstr "" + +#: ../src/vikwindow.c:5064 +#, c-format +msgid "New _%s Layer" +msgstr "" + +#: ../src/vikwindow.c:5114 +#, fuzzy +msgid "..." +msgstr "Toevoegen..." + +#: ../src/viking.desktop.in.h:2 +msgid "GPS Data Manager" +msgstr "" + +#: ../src/viking.desktop.in.h:3 +msgid "Map Based GPS Data Manager (live data capable)." +msgstr "" + +#: ../src/libjpeg/jpeg-data.c:205 +msgid "Data does not follow JPEG specification." +msgstr "" + +#: ../src/libjpeg/jpeg-data.c:302 +#, c-format +msgid "Path '%s' invalid." +msgstr "" + +#: ../src/libjpeg/jpeg-data.c:320 +#, c-format +msgid "Could not read '%s'." +msgstr "" + +#~ msgid "Email:" +#~ msgstr "E-mailadres:" + +#~ msgid "Error: couldn't find gpsbabel." +#~ msgstr "Fout: kon gpsbabel niet vinden" + +#~ msgid "Create Track" +#~ msgstr "Maak Track" diff --git a/po/pl.po b/po/pl.po new file mode 100644 index 0000000..7ae7e26 --- /dev/null +++ b/po/pl.po @@ -0,0 +1,6107 @@ +# Polish translation for viking +# Copyright (c) 2008 Rosetta Contributors and Canonical Ltd 2008 +# This file is distributed under the same license as the viking package. +# FIRST AUTHOR , 2008. +# +msgid "" +msgstr "" +"Project-Id-Version: viking\n" +"Report-Msgid-Bugs-To: \n" +"POT-Creation-Date: 2019-01-19 12:53+0000\n" +"PO-Revision-Date: 2010-09-07 09:15+0000\n" +"Last-Translator: Guilhem Bonnefille \n" +"Language-Team: Polish \n" +"Language: pl\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" +"X-Launchpad-Export-Date: 2018-12-21 17:32+0000\n" +"X-Generator: Launchpad (build 18847)\n" + +#: ../src/acquire.c:106 ../src/vikgpslayer.c:1367 +msgid "Done." +msgstr "Wykonano." + +#: ../src/acquire.c:115 +msgid "No data." +msgstr "Brak danych" + +#: ../src/acquire.c:167 ../src/acquire.c:415 +msgid "Error: acquisition failed." +msgstr "" + +#: ../src/acquire.c:339 +msgid "Working..." +msgstr "Pracuję..." + +#. This shouldn't happen... +#: ../src/acquire.c:406 +msgid "" +"Unable to create command\n" +"Acquire method failed." +msgstr "" + +#: ../src/acquire.c:513 +msgid "_Filter" +msgstr "" + +#: ../src/acquire.c:528 +#, c-format +msgid "Filter with %s" +msgstr "" + +#: ../src/acquire.c:545 +msgid "Filter" +msgstr "" + +#: ../src/babel.c:640 +msgid "GPSBabel:" +msgstr "" + +#: ../src/babel.c:641 +msgid "" +"Allow setting the specific instance of GPSBabel. You must restart Viking for " +"this value to take effect." +msgstr "" + +#: ../src/babel_ui.c:79 +msgid "Select a file format" +msgstr "" + +#: ../src/babel_ui.c:144 ../src/viktrwlayer.c:531 ../src/viktrwlayer.c:2882 +msgid "Tracks" +msgstr "Ścieżki" + +#: ../src/babel_ui.c:149 ../src/viktrwlayer.c:2892 +msgid "Routes" +msgstr "" + +#. ***** PARAMETERS ***** +#: ../src/babel_ui.c:154 ../src/viktrwlayer.c:531 ../src/viktrwlayer.c:2887 +msgid "Waypoints" +msgstr "Punkty orientacyjne" + +#: ../src/background.c:64 +#, c-format +msgid "%d items" +msgstr "%d elementów" + +#: ../src/background.c:287 +msgid "Threads:" +msgstr "" + +#: ../src/background.c:288 +msgid "" +"Number of threads to use for Mapnik tasks. You need to restart Viking for a " +"change to this value to be used" +msgstr "" + +#: ../src/background.c:361 +msgid "Job" +msgstr "Zadanie" + +#: ../src/background.c:365 +msgid "Progress" +msgstr "Postęp" + +#: ../src/background.c:373 +msgid "Viking Background Jobs" +msgstr "" + +#: ../src/bing.c:42 +msgid "Bing Aerial" +msgstr "" + +#: ../src/bing.c:48 +msgid "Bing" +msgstr "" + +#. VIK_GTK_WINDOW_FROM_WIDGET(vp) +#: ../src/bingmapsource.c:514 +msgid "Bing attribution Loading" +msgstr "" + +#: ../src/clipboard.c:95 +msgid "paste failed" +msgstr "błąd wstawiania" + +#: ../src/clipboard.c:105 +msgid "wrong clipboard data size" +msgstr "zły rozmiar danych schowka" + +#: ../src/clipboard.c:124 +#, c-format +msgid "" +"The clipboard contains sublayer data for %s layers. You must select a layer " +"of this type to paste the clipboard data." +msgstr "" + +#: ../src/clipboard.c:264 +msgid "" +"In order to paste a waypoint, please select an appropriate layer to paste " +"into." +msgstr "" + +#: ../src/dialog.c:60 +msgid "Go to Lat/Lon" +msgstr "Idź do szer/dług" + +#: ../src/dialog.c:69 ../src/viktrwlayer_wpwin.c:173 +msgid "Latitude:" +msgstr "Szerokość:" + +#: ../src/dialog.c:72 ../src/viktrwlayer_wpwin.c:177 +msgid "Longitude:" +msgstr "Długość:" + +#: ../src/dialog.c:102 +msgid "Go to UTM" +msgstr "" + +#: ../src/dialog.c:114 +msgid "Northing:" +msgstr "" + +#: ../src/dialog.c:117 +msgid "Easting:" +msgstr "" + +#: ../src/dialog.c:121 ../src/vikgeoreflayer.c:902 +msgid "Zone:" +msgstr "Strefa:" + +#: ../src/dialog.c:124 ../src/vikgeoreflayer.c:904 +msgid "Letter:" +msgstr "Litera:" + +#: ../src/dialog.c:246 ../src/geonamessearch.c:238 +#: ../src/datasource_osm_my_traces.c:505 +msgid "Nothing was selected" +msgstr "Nic nie zaznaczono" + +#: ../src/dialog.c:254 +msgid "Add Route" +msgstr "" + +#: ../src/dialog.c:254 +msgid "Add Track" +msgstr "Dodaj ścieżkę" + +#: ../src/dialog.c:262 +msgid "Route Name:" +msgstr "" + +#: ../src/dialog.c:262 +msgid "Track Name:" +msgstr "Nazwa ścieżki:" + +#: ../src/dialog.c:282 +msgid "Please enter a name for the track." +msgstr "Poszę podać nazwę dla ścieżki." + +#: ../src/dialog.c:311 +msgid "Today" +msgstr "" + +#: ../src/dialog.c:393 +msgid "Zoom Factors..." +msgstr "Współczynniki zbliżenia..." + +#: ../src/dialog.c:407 +msgid "Zoom factor (in meters per pixel):" +msgstr "" + +#: ../src/dialog.c:408 +msgid "X (easting): " +msgstr "" + +#: ../src/dialog.c:409 +msgid "Y (northing): " +msgstr "" + +#: ../src/dialog.c:414 +msgid "X and Y zoom factors must be equal" +msgstr "" + +#: ../src/dialog.c:469 +msgid "1 min" +msgstr "1 min" + +#: ../src/dialog.c:470 +msgid "1 hour" +msgstr "1 godzina" + +#: ../src/dialog.c:471 +msgid "1 day" +msgstr "1 dzień" + +#: ../src/dialog.c:472 +msgid "Custom (in minutes):" +msgstr "" + +#: ../src/dialog.c:608 +#, c-format +msgid "" +"2003-2008, Evan Battaglia\n" +"2008-%s, Viking's contributors" +msgstr "" + +#: ../src/dialog.c:609 +msgid "GPS Data and Topo Analyzer, Explorer, and Manager." +msgstr "" + +#: ../src/dialog.c:610 +msgid "" +"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.\n" +"\n" +"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.\n" +"\n" +"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., 59 Temple " +"Place, Suite 330, Boston, MA 02111-1307, USA" +msgstr "" + +#: ../src/dialog.c:703 +msgid "Translation is coordinated on http://launchpad.net/viking" +msgstr "" + +#: ../src/dialog.c:713 +msgid "Download along track" +msgstr "" + +#: ../src/dialog.c:720 +msgid "Map type:" +msgstr "Typ mapy:" + +#: ../src/dialog.c:726 +msgid "Zoom level:" +msgstr "Poziom zbliżenia:" + +#: ../src/dialog.c:766 +#, c-format +msgid "The map data is licensed: %s." +msgstr "" + +#: ../src/dialog.c:769 +#, c-format +msgid "" +"The data provided by '%s' are licensed under the following license: " +"%s." +msgstr "" + +#: ../src/dialog.c:773 +msgid "Open license" +msgstr "" + +#: ../src/expedia.c:54 +msgid "Expedia Street Maps" +msgstr "" + +#: ../src/expedia.c:82 +msgid "Invalid expedia altitude" +msgstr "" + +#: ../src/expedia.c:113 +#, c-format +msgid "" +"Couldn't open EXPEDIA image file (right after successful download! Please " +"report and delete image file!): %s" +msgstr "" + +#: ../src/expedia.c:126 +#, c-format +msgid "" +"Couldn't save EXPEDIA image file (right after successful download! Please " +"report and delete image file!): %s" +msgstr "" + +#: ../src/geonamessearch.c:115 +msgid "Search" +msgstr "Szukaj" + +#: ../src/geonamessearch.c:117 +msgid "No entries found!" +msgstr "Nie znaleziono wpisów!" + +#. NB could allow columns to be shifted around by doing this after each new +#. gtk_tree_view_column_set_reorderable ( column, TRUE ); +#. However I don't think is that useful, so I haven't put it in +#: ../src/geonamessearch.c:171 ../src/datasource_osm_my_traces.c:422 +#: ../src/viktrwlayer_tracklist.c:621 ../src/viktrwlayer_waypointlist.c:618 +msgid "Name" +msgstr "" + +#: ../src/geonamessearch.c:176 +msgid "Feature" +msgstr "" + +#: ../src/geonamessearch.c:181 ../src/datasource_osm_my_traces.c:437 +msgid "Lat/Lon" +msgstr "" + +#: ../src/geonamessearch.c:264 ../src/googlesearch.c:101 ../src/vikgoto.c:430 +msgid "couldn't map temp file" +msgstr "" + +#: ../src/geonamessearch.c:459 +msgid "Select articles" +msgstr "" + +#: ../src/geonamessearch.c:459 +msgid "Select the articles you want to add." +msgstr "" + +#: ../src/geonamessearch.c:475 +msgid "city" +msgstr "" + +#: ../src/geonamessearch.c:477 +msgid "edu" +msgstr "" + +#: ../src/geonamessearch.c:479 +msgid "airport" +msgstr "" + +#: ../src/geonamessearch.c:481 +msgid "mountain" +msgstr "" + +#: ../src/geonamessearch.c:483 +msgid "forest" +msgstr "" + +#: ../src/geonamessearch.c:485 +msgid "church" +msgstr "" + +#: ../src/geojson.c:74 +#, c-format +msgid "%s command failed: %s" +msgstr "" + +#: ../src/geojson.c:146 ../src/gpx.c:1317 +#, c-format +msgid "failed to open temporary file: %s" +msgstr "błąd otwarcia pliku tymczasowego: %s" + +#: ../src/globals.c:67 +msgid "DDD" +msgstr "" + +#: ../src/globals.c:67 +msgid "DMM" +msgstr "" + +#: ../src/globals.c:67 +msgid "DMS" +msgstr "" + +#: ../src/globals.c:67 +msgid "Raw" +msgstr "" + +#: ../src/globals.c:68 +msgid "Kilometres" +msgstr "" + +#: ../src/globals.c:68 +msgid "Miles" +msgstr "" + +#: ../src/globals.c:68 +msgid "Nautical Miles" +msgstr "" + +#. VIK_UNITS_SPEED_KILOMETRES_PER_HOUR: +#: ../src/globals.c:69 ../src/viktrwlayer_tracklist.c:655 ../src/vikutils.c:100 +msgid "km/h" +msgstr "" + +#: ../src/globals.c:69 ../src/viktrwlayer_tracklist.c:656 ../src/vikutils.c:78 +msgid "mph" +msgstr "" + +#. VIK_UNITS_SPEED_METRES_PER_SECOND: +#: ../src/globals.c:69 ../src/viktrwlayer_tracklist.c:663 ../src/vikutils.c:81 +msgid "m/s" +msgstr "" + +#: ../src/globals.c:69 ../src/viktrwlayer_tracklist.c:657 ../src/vikutils.c:84 +msgid "knots" +msgstr "" + +#: ../src/globals.c:69 ../src/viktrwlayer_tracklist.c:658 ../src/vikutils.c:87 +msgid "s/km" +msgstr "" + +#: ../src/globals.c:69 ../src/viktrwlayer_tracklist.c:659 ../src/vikutils.c:90 +msgid "min/km" +msgstr "" + +#: ../src/globals.c:69 +msgid "s/mi" +msgstr "" + +#: ../src/globals.c:69 ../src/viktrwlayer_tracklist.c:661 ../src/vikutils.c:96 +msgid "min/mi" +msgstr "" + +#: ../src/globals.c:70 +msgid "Metres" +msgstr "" + +#: ../src/globals.c:70 +msgid "Feet" +msgstr "" + +#: ../src/globals.c:73 +msgid "Locale" +msgstr "" + +#: ../src/globals.c:73 +msgid "World" +msgstr "" + +#: ../src/globals.c:73 +msgid "UTC" +msgstr "" + +#: ../src/globals.c:76 +msgid "Degree format:" +msgstr "Format stopni:" + +#: ../src/globals.c:77 +msgid "Distance units:" +msgstr "Jednostki odległości:" + +#: ../src/globals.c:78 +msgid "Speed units:" +msgstr "Jednostki prędkości:" + +#: ../src/globals.c:79 +msgid "Height units:" +msgstr "Jednostki wysokości:" + +#: ../src/globals.c:80 +msgid "Use large waypoint icons:" +msgstr "" + +#: ../src/globals.c:81 +msgid "Default latitude:" +msgstr "Domyślna szerokość geograficzna:" + +#: ../src/globals.c:82 +msgid "Default longitude:" +msgstr "Domyślna długość geograficzna:" + +#: ../src/globals.c:83 +msgid "Time Display:" +msgstr "" + +#: ../src/globals.c:84 +msgid "" +"Display times according to the reference frame. Locale is the user's system " +"setting. World is relative to the location of the object." +msgstr "" + +#: ../src/globals.c:90 +msgid "Alphabetical" +msgstr "" + +#: ../src/globals.c:90 ../src/datasource_osm_my_traces.c:432 +msgid "Time" +msgstr "" + +#: ../src/globals.c:90 +msgid "Creation" +msgstr "" + +#: ../src/globals.c:91 +msgid "Title Case" +msgstr "" + +#: ../src/globals.c:91 +msgid "Lowercase" +msgstr "" + +#: ../src/globals.c:94 +msgid "KML File Export Units:" +msgstr "" + +#: ../src/globals.c:95 +msgid "GPX Track Order:" +msgstr "" + +#: ../src/globals.c:96 +msgid "GPX Waypoint Symbols:" +msgstr "" + +#: ../src/globals.c:97 +msgid "" +"Save GPX Waypoint Symbol names in the specified case. May be useful for " +"compatibility with various devices" +msgstr "" + +#: ../src/globals.c:98 +msgid "GPX Creator:" +msgstr "" + +#: ../src/globals.c:99 +msgid "" +"The creator value when writing a GPX file. Otherwise when blank a default is " +"used." +msgstr "" + +#: ../src/globals.c:104 +msgid "Image Viewer:" +msgstr "" + +#: ../src/globals.c:109 +msgid "External GPX Program 1:" +msgstr "" + +#: ../src/globals.c:110 +msgid "External GPX Program 2:" +msgstr "" + +#: ../src/globals.c:113 +msgid "Absolute" +msgstr "" + +#: ../src/globals.c:113 +msgid "Relative" +msgstr "" + +#: ../src/globals.c:117 +msgid "Save File Reference Mode:" +msgstr "" + +#: ../src/globals.c:118 +msgid "" +"When saving a Viking .vik file, this determines how the directory paths of " +"filenames are written." +msgstr "" + +#: ../src/globals.c:119 +msgid "Ask for Name before Track Creation:" +msgstr "" + +#: ../src/globals.c:120 +msgid "Show Tooltip during Track Creation:" +msgstr "" + +#: ../src/globals.c:121 +msgid "The number of recent files:" +msgstr "" + +#: ../src/globals.c:122 +msgid "" +"Only applies to new windows or on application restart. -1 means all " +"available files." +msgstr "" + +#: ../src/globals.c:123 +#, fuzzy +msgid "Open files in selected layer:" +msgstr "Usuń wybraną warstwę" + +#: ../src/globals.c:124 +msgid "Open files (but not .vik ones) into the selected TrackWaypoint layer." +msgstr "" + +#: ../src/globals.c:125 +msgid "Show calendar day names:" +msgstr "" + +#: ../src/globals.c:128 +msgid "Home Location" +msgstr "" + +#: ../src/globals.c:128 +msgid "Last Location" +msgstr "" + +#: ../src/globals.c:128 +msgid "Specified File" +msgstr "" + +#: ../src/globals.c:128 +msgid "Auto Location" +msgstr "" + +#: ../src/globals.c:131 +msgid "Restore Window Setup:" +msgstr "" + +#: ../src/globals.c:132 +msgid "Restore window size and layout" +msgstr "" + +#: ../src/globals.c:133 +msgid "Add a Default Map Layer:" +msgstr "" + +#: ../src/globals.c:134 +msgid "" +"The default map layer added is defined by the Layer Defaults. Use the menu " +"Edit->Layer Defaults->Map... to change the map type and other values." +msgstr "" + +#: ../src/globals.c:135 +msgid "Startup Method:" +msgstr "" + +#: ../src/globals.c:136 +msgid "Startup File:" +msgstr "" + +#: ../src/globals.c:137 +msgid "" +"The default file to load on startup. Only applies when the startup method is " +"set to 'Specified File'" +msgstr "" + +#: ../src/globals.c:138 +msgid "Check For New Version:" +msgstr "" + +#: ../src/globals.c:139 +msgid "Periodically check to see if a new version of Viking is available" +msgstr "" + +#. Defaults for the options are setup here +#: ../src/globals.c:176 +msgid "General" +msgstr "" + +#. New Tab +#: ../src/globals.c:204 +msgid "Startup" +msgstr "" + +#. New Tab +#: ../src/globals.c:222 +msgid "Export/External" +msgstr "" + +#. 'Advanced' Properties +#: ../src/globals.c:249 +msgid "Advanced" +msgstr "" + +#. Webtools +#: ../src/google.c:39 +msgid "Google" +msgstr "Google" + +#. If there is an actual description field it will overwrite this value +#: ../src/gpx.c:264 +#, c-format +msgid "Created by: %s" +msgstr "" + +#: ../src/datasource_bfilter.c:43 +msgid "Max number of points:" +msgstr "Maksymalna liczba punktów:" + +#: ../src/datasource_bfilter.c:84 +msgid "Simplify All Tracks..." +msgstr "" + +#: ../src/datasource_bfilter.c:85 +msgid "Simplified Tracks" +msgstr "" + +#. { VIK_LAYER_NUM_TYPES, "compressmethod", VIK_LAYER_PARAM_UINT, VIK_LAYER_GROUP_NONE, N_("Simplify Method:"), VIK_LAYER_WIDGET_COMBOBOX, compress_method, NULL, NULL, NULL, NULL, NULL }, +#: ../src/datasource_bfilter.c:111 +msgid "Error Factor:" +msgstr "" + +#: ../src/datasource_bfilter.c:112 +msgid "" +"Specifies the maximum allowable error that may be introduced by removing a " +"single point by the crosstrack method. See the manual or GPSBabel Simplify " +"Filter documentation for more detail." +msgstr "" + +#: ../src/datasource_bfilter.c:166 +msgid "Compress Tracks..." +msgstr "" + +#: ../src/datasource_bfilter.c:167 +msgid "Compressed Tracks" +msgstr "" + +#: ../src/datasource_bfilter.c:197 ../src/datasource_bfilter.c:198 +msgid "Remove Duplicate Waypoints" +msgstr "Usuń powielone punkty orientacyjne" + +#: ../src/datasource_bfilter.c:221 +msgid "Manual filter:" +msgstr "" + +#: ../src/datasource_bfilter.c:222 +msgid "Manual filter command: e.g. 'swap'." +msgstr "" + +#: ../src/datasource_bfilter.c:233 ../src/datasource_bfilter.c:234 +msgid "Manual filter" +msgstr "" + +#: ../src/datasource_bfilter.c:262 +msgid "Waypoints Inside This" +msgstr "" + +#: ../src/datasource_bfilter.c:263 ../src/datasource_bfilter.c:292 +msgid "Polygonized Layer" +msgstr "" + +#: ../src/datasource_bfilter.c:291 +msgid "Waypoints Outside This" +msgstr "" + +#: ../src/datasource_file.c:61 +msgid "Import file with GPSBabel" +msgstr "" + +#: ../src/datasource_file.c:62 +msgid "Imported file" +msgstr "" + +#. The file selector +#: ../src/datasource_file.c:129 +msgid "File:" +msgstr "" + +#: ../src/datasource_file.c:130 +msgid "File to import" +msgstr "" + +#: ../src/datasource_file.c:137 +msgid "All files" +msgstr "" + +#. The file format selector +#: ../src/datasource_file.c:144 ../src/datasource_url.c:106 +msgid "File type:" +msgstr "" + +#: ../src/datasource_file.c:189 +#, c-format +msgid "using babel args '%s' and file '%s'" +msgstr "" + +#: ../src/datasource_gc.c:67 +msgid "Download Geocaches" +msgstr "" + +#: ../src/datasource_gc.c:68 +msgid "Geocaching.com Caches" +msgstr "" + +#: ../src/datasource_gc.c:86 +msgid "geocaching.com username:" +msgstr "Użytkownik geocaching.com:" + +#: ../src/datasource_gc.c:87 +msgid "geocaching.com password:" +msgstr "Hasło geocaching.com:" + +#: ../src/datasource_gc.c:92 ../src/vikwindow.c:3502 +msgid "Geocaching" +msgstr "" + +#: ../src/datasource_gc.c:128 +#, c-format +msgid "" +"Can't find %s or %s in path! Check that you have installed it correctly." +msgstr "" + +#: ../src/datasource_gc.c:190 +msgid "Number geocaches:" +msgstr "" + +#: ../src/datasource_gc.c:192 +msgid "Centered around:" +msgstr "" + +#: ../src/datasource_gc.c:231 +msgid "Broken input - using some defaults" +msgstr "" + +#: ../src/datasource_geotag.c:51 +msgid "Create Waypoints from Geotagged Images" +msgstr "" + +#: ../src/datasource_geotag.c:52 +msgid "Geotagged Images" +msgstr "" + +#: ../src/datasource_geotag.c:102 ../src/datasource_geojson.c:93 +#: ../src/vikfileentry.c:171 ../src/vikwindow.c:3533 ../src/vikwindow.c:3610 +#: ../src/vikwindow.c:3641 ../src/vikwindow.c:4356 ../src/vikwindow.c:4649 +msgid "All" +msgstr "" + +#: ../src/datasource_geotag.c:107 ../src/vikfileentry.c:115 +#: ../src/viktrwlayer_geotag.c:637 ../src/vikwindow.c:3518 +#: ../src/vikwindow.c:4377 +msgid "JPG" +msgstr "" + +#: ../src/datasource_geotag.c:168 +#, c-format +msgid "Unable to create waypoint from %s" +msgstr "" + +#: ../src/datasource_geojson.c:46 +msgid "Acquire from GeoJSON" +msgstr "" + +#: ../src/datasource_geojson.c:47 ../src/datasource_geojson.c:98 +msgid "GeoJSON" +msgstr "" + +#: ../src/datasource_geojson.c:152 +#, c-format +msgid "Unable to import from: %s" +msgstr "" + +#: ../src/datasource_gps.c:54 +msgid "Acquire from GPS" +msgstr "Pobierz z GPS" + +#: ../src/datasource_gps.c:55 +msgid "Acquired from GPS" +msgstr "Pobrano z GPS" + +#: ../src/datasource_gps.c:258 +#, c-format +msgid "using cmd '%s' and file '%s'\n" +msgstr "" + +#: ../src/datasource_gps.c:353 ../src/vikgpslayer.c:966 +#, c-format +msgid "Downloading %d waypoint..." +msgid_plural "Downloading %d waypoints..." +msgstr[0] "Pobieranie %d punktu pośredniego..." +msgstr[1] "Pobieranie %d punktów pośrednich..." +msgstr[2] "Pobieranie %d punktów pośrednich..." + +#: ../src/datasource_gps.c:358 ../src/vikgpslayer.c:971 +#, c-format +msgid "Downloading %d trackpoint..." +msgid_plural "Downloading %d trackpoints..." +msgstr[0] "" +msgstr[1] "" + +#: ../src/datasource_gps.c:363 ../src/vikgpslayer.c:976 +#, c-format +msgid "Downloading %d routepoint..." +msgid_plural "Downloading %d routepoints..." +msgstr[0] "" +msgstr[1] "" + +#: ../src/datasource_gps.c:386 ../src/datasource_gps.c:393 +#: ../src/datasource_gps.c:400 +#, c-format +msgid "Downloaded %d out of %d %s..." +msgstr "Pobrano %d z %d %s..." + +#: ../src/datasource_gps.c:388 ../src/datasource_gps.c:395 +#: ../src/datasource_gps.c:402 +#, c-format +msgid "Downloaded %d %s." +msgstr "Pobrano %d %s." + +#: ../src/datasource_gps.c:416 ../src/vikgpslayer.c:1134 +#, c-format +msgid "GPS Device: %s" +msgstr "Urządzenie GPS: %s" + +#: ../src/datasource_gps.c:428 ../src/vikgpslayer.c:1214 +msgid "Status: Working..." +msgstr "" + +#. NB gps_layer_inst_init() is performed after parameter registeration +#. thus to give the protocols some potential values use the old static list +#. TODO: find another way to use gps_layer_inst_init()? +#: ../src/datasource_gps.c:584 ../src/vikgpslayer.c:216 +msgid "GPS Protocol:" +msgstr "Protokół GPS:" + +#. List reassigned at runtime +#: ../src/datasource_gps.c:609 ../src/vikgpslayer.c:217 +msgid "Serial Port:" +msgstr "Port szeregowy:" + +#: ../src/datasource_gps.c:659 +msgid "" +"Turn Off After Transfer\n" +"(Garmin/NAViLink Only)" +msgstr "" + +#: ../src/datasource_gps.c:666 +msgid "Tracks:" +msgstr "" + +#: ../src/datasource_gps.c:673 +msgid "Routes:" +msgstr "" + +#: ../src/datasource_gps.c:680 +msgid "Waypoints:" +msgstr "" + +#: ../src/datasource_gps.c:756 ../src/vikgpslayer.c:1509 +msgid "GPS device: N/A" +msgstr "Urządzenie GPS: N/A" + +#: ../src/datasource_osm.c:53 ../src/datasource_osm.c:54 +msgid "OSM traces" +msgstr "" + +#: ../src/datasource_osm.c:89 +msgid "Page number:" +msgstr "" + +#: ../src/datasource_osm_my_traces.c:59 ../src/datasource_osm_my_traces.c:60 +msgid "OSM My Traces" +msgstr "" + +#: ../src/datasource_osm_my_traces.c:106 ../src/osm-traces.c:684 +#, fuzzy +msgid "Email/username:" +msgstr "Nazwa użytkownika OSM:" + +#: ../src/datasource_osm_my_traces.c:111 +msgid "The email or username used to login to OSM" +msgstr "" + +#: ../src/datasource_osm_my_traces.c:113 ../src/osm-traces.c:692 +msgid "Password:" +msgstr "Hasło:" + +#: ../src/datasource_osm_my_traces.c:116 +msgid "The password used to login to OSM" +msgstr "" + +#: ../src/datasource_osm_my_traces.c:427 ../src/viktrwlayer.c:689 +msgid "Description" +msgstr "" + +#: ../src/datasource_osm_my_traces.c:442 +msgid "Privacy" +msgstr "" + +#: ../src/datasource_osm_my_traces.c:449 +msgid "Within Current View" +msgstr "" + +#: ../src/datasource_osm_my_traces.c:516 +msgid "GPS Traces" +msgstr "" + +#: ../src/datasource_osm_my_traces.c:518 +msgid "None found!" +msgstr "" + +#: ../src/datasource_osm_my_traces.c:569 +msgid "Ensure the OSM access token preferences are setup." +msgstr "" + +#: ../src/datasource_osm_my_traces.c:645 +msgid "My OSM Traces" +msgstr "" + +#. Report errors to the status bar +#: ../src/datasource_osm_my_traces.c:667 +#, c-format +msgid "Unable to get trace: %s" +msgstr "" + +#: ../src/datasource_routing.c:56 ../src/datasource_routing.c:57 +msgid "Directions" +msgstr "" + +#: ../src/datasource_routing.c:90 +msgid "No routing engines with directions available" +msgstr "" + +#. Engine selector +#: ../src/datasource_routing.c:99 +msgid "Engine:" +msgstr "" + +#. From and To entries +#: ../src/datasource_routing.c:104 +msgid "From:" +msgstr "Z:" + +#: ../src/datasource_routing.c:105 +msgid "To:" +msgstr "Do:" + +#: ../src/datasource_url.c:48 +msgid "Acquire from URL" +msgstr "" + +#: ../src/datasource_url.c:49 +msgid "URL" +msgstr "" + +#: ../src/datasource_url.c:101 +msgid "URL:" +msgstr "" + +#. Only GPX (not using GPSbabel) +#: ../src/datasource_url.c:133 ../src/vikfileentry.c:161 +#: ../src/vikwindow.c:3513 ../src/vikwindow.c:3603 +msgid "GPX" +msgstr "" + +#: ../src/datasource_wikipedia.c:32 +msgid "Create Waypoints from Wikipedia Articles" +msgstr "" + +#: ../src/datasource_wikipedia.c:33 +msgid "Wikipedia Waypoints" +msgstr "" + +#: ../src/dem.c:66 ../src/dem.c:80 +msgid "Invalid DEM" +msgstr "Nieprawidłowy DEM" + +#: ../src/dem.c:122 +msgid "Invalid DEM header" +msgstr "Nieprawidłowy nagłówek DEM" + +#: ../src/dem.c:191 ../src/dem.c:204 +msgid "Incorrect DEM Class B record: expected 1" +msgstr "" + +#: ../src/dem.c:289 ../src/download.c:176 +#, c-format +msgid "Couldn't map file %s: %s" +msgstr "" + +#: ../src/download.c:130 +msgid "Tile age (days):" +msgstr "" + +#: ../src/download.c:406 +#, c-format +msgid "Download error: %s" +msgstr "Błąd pobierania: %s" + +#: ../src/download.c:490 +msgid "couldn't open temp file" +msgstr "nie można otworzyć pliku tymczasowego" + +#: ../src/file.c:458 ../src/file.c:463 +#, c-format +msgid "Draw mode '%s' no more supported" +msgstr "" + +#: ../src/geotag_exif.c:621 +msgid "Not enough memory." +msgstr "" + +#: ../src/geotag_exif.c:639 +msgid "Setting a value for this tag is unsupported!" +msgstr "" + +#: ../src/geotag_exif.c:658 +#, c-format +msgid "Too few components specified (need %d, found %d)\n" +msgstr "" + +#: ../src/geotag_exif.c:662 +msgid "Numeric value expected\n" +msgstr "" + +#: ../src/geotag_exif.c:670 +msgid "This shouldn't happen!" +msgstr "" + +#: ../src/geotag_exif.c:740 +msgid "Not yet implemented!" +msgstr "" + +#: ../src/geotag_exif.c:753 +msgid "Warning; Too many components specified!" +msgstr "" + +#: ../src/osm-traces.c:87 +msgid "Identifiable (public w/ timestamps)" +msgstr "" + +#: ../src/osm-traces.c:88 +msgid "Trackable (private w/ timestamps)" +msgstr "" + +#: ../src/osm-traces.c:89 +msgid "Public" +msgstr "" + +#: ../src/osm-traces.c:90 +msgid "Private" +msgstr "" + +#: ../src/osm-traces.c:108 +msgid "Access Token:" +msgstr "" + +#: ../src/osm-traces.c:108 +msgid "Get New OSM Access Tokens" +msgstr "" + +#: ../src/osm-traces.c:109 +msgid "Access Token Key:" +msgstr "" + +#: ../src/osm-traces.c:110 +msgid "Access Token Secret:" +msgstr "" + +#: ../src/osm-traces.c:111 +msgid "OSM username:" +msgstr "Nazwa użytkownika OSM:" + +#: ../src/osm-traces.c:112 +msgid "OSM password:" +msgstr "Hasło OSM:" + +#. Check to really override existing values... +#: ../src/osm-traces.c:263 +msgid "Do you want to overwrite existing values?" +msgstr "" + +#: ../src/osm-traces.c:275 +msgid "Not able to generate OSM request tokens." +msgstr "" + +#: ../src/osm-traces.c:299 +msgid "" +"Waiting for authorization approval.\n" +"Ensure you have granted access at the website before continuing here." +msgstr "" + +#: ../src/osm-traces.c:315 +msgid "No Authorization." +msgstr "" + +#: ../src/osm-traces.c:354 +msgid "" +"OSM Username and Password preferences are not required anymore. You can now " +"remove them." +msgstr "" + +#. Preferences +#: ../src/osm-traces.c:379 +msgid "OpenStreetMap Traces" +msgstr "" + +#: ../src/osm-traces.c:504 +#, c-format +msgid "failed to upload data: HTTP response is %ld" +msgstr "" + +#: ../src/osm-traces.c:509 +#, c-format +msgid "curl_easy_getinfo failed: %d" +msgstr "" + +#: ../src/osm-traces.c:514 +#, c-format +msgid "curl request failed: %s" +msgstr "" + +#. Success +#: ../src/osm-traces.c:592 +msgid "Uploaded to OSM" +msgstr "" + +#: ../src/osm-traces.c:596 +msgid "" +"FAILED TO UPLOAD DATA TO OSM - Ensure the OSM access token preferences are " +"setup." +msgstr "" + +#: ../src/osm-traces.c:599 +msgid "FAILED TO UPLOAD DATA TO OSM - CURL PROBLEM" +msgstr "" + +#: ../src/osm-traces.c:602 +msgid "FAILED TO UPLOAD DATA TO OSM" +msgstr "" + +#: ../src/osm-traces.c:602 +msgid "HTTP response code" +msgstr "" + +#: ../src/osm-traces.c:610 +#, c-format +msgid "failed to unlink temporary file: %s" +msgstr "" + +#: ../src/osm-traces.c:664 +msgid "OSM upload" +msgstr "" + +#: ../src/osm-traces.c:689 +msgid "" +"The email/username used as login\n" +"Enter the email/username you use to login into www.openstreetmap.org." +"" +msgstr "" + +#: ../src/osm-traces.c:697 +msgid "" +"The password used to login\n" +"Enter the password you use to login into www.openstreetmap.org." +msgstr "" + +#: ../src/osm-traces.c:703 +msgid "File's name:" +msgstr "Nazwa pliku:" + +#: ../src/osm-traces.c:713 +msgid "" +"The name of the file on OSM\n" +"This is the name of the file created on the server.This is not the " +"name of the local file." +msgstr "" + +#: ../src/osm-traces.c:717 ../src/viktrwlayer_wpwin.c:197 +#: ../src/viktrwlayer_wpwin.c:199 +msgid "Description:" +msgstr "Opis:" + +#: ../src/osm-traces.c:731 +msgid "The description of the trace" +msgstr "Opis śladu" + +#: ../src/osm-traces.c:734 +msgid "Anonymize Times:" +msgstr "" + +#: ../src/osm-traces.c:739 +msgid "" +"Anonymize times of the trace.\n" +"You may choose to make the trace identifiable, yet mask the actual " +"real time values" +msgstr "" + +#: ../src/osm-traces.c:743 +msgid "Tags:" +msgstr "Etykiety:" + +#: ../src/osm-traces.c:751 +msgid "The tags associated to the trace" +msgstr "Etykiety związane ze śladem" + +#: ../src/osm-traces.c:816 +#, c-format +msgid "Uploading %s to OSM" +msgstr "" + +#: ../src/mapcache.c:67 +msgid "Map cache memory size (MB):" +msgstr "" + +#. NB Can have a couple hundred fonts loaded when using system directories +#. So ATM don't list them all - otherwise need better GUI feedback display. +#: ../src/mapnik_interface.cpp:324 +#, c-format +msgid "" +"%s %s\n" +"Plugins=%sFonts loaded=%d" +msgstr "" + +#: ../src/mapnik_interface.cpp:325 ../src/vikmapniklayer.c:278 +msgid "Mapnik" +msgstr "" + +#: ../src/print.c:51 ../src/viktrwlayer.c:572 +msgid "None" +msgstr "Żaden" + +#: ../src/print.c:52 +msgid "Horizontally" +msgstr "Poziomo" + +#: ../src/print.c:53 +msgid "Vertically" +msgstr "Pionowo" + +#: ../src/print.c:54 +msgid "Both" +msgstr "Obydwa" + +#: ../src/print.c:118 +msgid "Image Settings" +msgstr "Ustawienia obrazu" + +#: ../src/print.c:551 +msgid "done" +msgstr "wykonano" + +#. Page Size +#: ../src/print.c:580 +msgid "_Adjust Page Size and Orientation" +msgstr "_Dopasuj rozmiar i orientację strony" + +#: ../src/print.c:596 +msgid "C_enter:" +msgstr "" + +#. ignore page margins +#: ../src/print.c:614 +msgid "Ignore Page _Margins" +msgstr "Ignoruj _marginesy strony" + +#: ../src/print.c:633 +msgid "Image S_ize:" +msgstr "_Rozmiar obrazu:" + +#: ../src/ui_util.c:88 +#, c-format +msgid "Could not launch web browser. %s" +msgstr "" + +#: ../src/ui_util.c:101 +#, c-format +msgid "Could not create new email. %s" +msgstr "" + +#: ../src/vikcoordlayer.c:57 +msgid "Color:" +msgstr "Kolor:" + +#: ../src/vikcoordlayer.c:58 +msgid "Minutes Width:" +msgstr "" + +#: ../src/vikcoordlayer.c:59 +msgid "Line Thickness:" +msgstr "Grubość linii:" + +#: ../src/vikcoordlayer.c:66 +msgid "Coordinate" +msgstr "" + +#: ../src/main.c:92 +#, c-format +msgid "Ignoring Xlib error: error code %d request code %d\n" +msgstr "" + +#: ../src/main.c:111 +msgid "Enable debug output" +msgstr "" + +#: ../src/main.c:112 +msgid "Enable verbose output" +msgstr "" + +#: ../src/main.c:113 +msgid "Show version" +msgstr "Pokaż wersję" + +#: ../src/main.c:114 +msgid "Latitude in decimal degrees" +msgstr "" + +#: ../src/main.c:115 +msgid "Longitude in decimal degrees" +msgstr "" + +#: ../src/main.c:116 +msgid "Zoom Level (OSM). Value can be 0 - 22" +msgstr "" + +#: ../src/main.c:117 +msgid "Add a map layer by id value. Use 0 for the default map." +msgstr "" + +#: ../src/main.c:160 +#, c-format +msgid "" +"%s %s\n" +"Copyright (c) 2003-2008 Evan Battaglia\n" +"Copyright (c) 2008-%s Viking's contributors\n" +msgstr "" + +#: ../src/osm.c:50 +msgid "OpenStreetMap (Mapnik)" +msgstr "" + +#: ../src/osm.c:65 +msgid "OpenStreetMap (Cycle)" +msgstr "" + +#: ../src/osm.c:79 +msgid "OpenStreetMap (Transport)" +msgstr "" + +#: ../src/osm.c:95 +msgid "OpenStreetMap (Humanitarian)" +msgstr "" + +#: ../src/osm.c:111 +msgid "On Disk OSM Tile Format" +msgstr "" + +#: ../src/osm.c:121 +msgid "MBTiles File" +msgstr "" + +#: ../src/osm.c:132 +msgid "OSM Metatiles" +msgstr "" + +#: ../src/osm.c:146 +msgid "Mapbox Outdoors" +msgstr "" + +#: ../src/osm.c:153 +msgid "Mapbox Specific" +msgstr "" + +#: ../src/osm.c:170 +msgid "OSM (view)" +msgstr "OSM (podgląd)" + +#: ../src/osm.c:174 +msgid "OSM (edit)" +msgstr "OSM (edycja)" + +#. Note the use of positional parameters +#: ../src/osm.c:179 +msgid "OSM (query)" +msgstr "" + +#: ../src/osm.c:183 +msgid "OSM (render)" +msgstr "" + +#. Example: http://127.0.0.1:8111/load_and_zoom?left=8.19&right=8.20&top=48.605&bottom=48.590&select=node413602999 +#. JOSM or merkaartor must already be running with remote interface enabled +#: ../src/osm.c:190 +msgid "Local port 8111 (eg JOSM)" +msgstr "" + +#: ../src/osm.c:195 +msgid "Geofabrik Map Compare" +msgstr "" + +#: ../src/osm.c:203 +msgid "OpenStreetMap Notes" +msgstr "" + +#. Not really OSM but can't be bothered to create somewhere else to put it... +#: ../src/osm.c:221 +msgid "Wikimedia Toolserver GeoHack" +msgstr "" + +#: ../src/preferences.c:195 +msgid "Preferences" +msgstr "" + +#: ../src/toolbar.c:91 ../src/toolbar.c:92 +msgid "System Default" +msgstr "" + +#: ../src/toolbar.c:91 ../src/viktrwlayer.c:563 +msgid "Small" +msgstr "" + +#: ../src/toolbar.c:91 ../src/viktrwlayer.c:564 +msgid "Medium" +msgstr "" + +#: ../src/toolbar.c:91 ../src/viktrwlayer.c:565 +msgid "Large" +msgstr "" + +#: ../src/toolbar.c:92 +msgid "Icons Only" +msgstr "" + +#: ../src/toolbar.c:92 +msgid "Text Only" +msgstr "" + +#: ../src/toolbar.c:92 +msgid "Icons and Text" +msgstr "" + +#: ../src/toolbar.c:106 +msgid "Append to Menu:" +msgstr "" + +#: ../src/toolbar.c:107 +msgid "Pack the toolbar to the main menu to save vertical space" +msgstr "" + +#: ../src/toolbar.c:108 +msgid "Icon Size:" +msgstr "" + +#: ../src/toolbar.c:110 +msgid "Icon Style:" +msgstr "" + +#: ../src/toolbar.c:112 +msgid "Customize:" +msgstr "" + +#: ../src/toolbar.c:112 +msgid "Customize Buttons" +msgstr "" + +#. Preferences +#: ../src/toolbar.c:145 +msgid "Toolbar" +msgstr "" + +#: ../src/toolbar.c:312 +msgid "_Customize" +msgstr "" + +#: ../src/toolbar.c:641 +msgid "Separator" +msgstr "" + +#: ../src/toolbar.c:642 +msgid "--- Separator ---" +msgstr "" + +#: ../src/toolbar.c:1007 +msgid "Customize Toolbar" +msgstr "" + +#: ../src/toolbar.c:1028 +msgid "" +"Select items to be displayed on the toolbar. Items can be reordered by drag " +"and drop." +msgstr "" + +#: ../src/toolbar.c:1044 +msgid "Available Items" +msgstr "" + +#: ../src/toolbar.c:1065 +msgid "Displayed Items" +msgstr "" + +#: ../src/viklayer_defaults.c:232 +#, c-format +msgid "Could not open file: %s" +msgstr "" + +#: ../src/viklayer_defaults.c:304 +msgid "Layer Defaults" +msgstr "" + +#: ../src/uibuilder.c:196 +msgid "Take care that this password will be stored clearly in a plain file." +msgstr "" +"Musisz mieć na uwadze, że to hasło będzie przechowywane w czystej formie w " +"zwykłym pliku" + +#: ../src/uibuilder.c:628 ../src/viktrwlayer_export.c:188 +#: ../src/viktrwlayer_export.c:304 ../src/vikwindow.c:3666 +#: ../src/vikwindow.c:4408 +#, c-format +msgid "The file \"%s\" exists, do you wish to overwrite it?" +msgstr "Plik %s istnieje, czy nadpisać go?" + +#: ../src/vikaggregatelayer.c:41 +msgid "Aggregate" +msgstr "" + +#: ../src/vikaggregatelayer.c:528 ../src/viktrwlayer.c:11700 +#, c-format +msgid "%s: Waypoint List" +msgstr "" + +#: ../src/vikaggregatelayer.c:570 +msgid "Search by Date" +msgstr "" + +#: ../src/vikaggregatelayer.c:576 +msgid "No items found with the requested date." +msgstr "" + +#: ../src/vikaggregatelayer.c:615 ../src/viktrwlayer.c:11691 +#, c-format +msgid "%s: Track and Route List" +msgstr "" + +#: ../src/vikaggregatelayer.c:681 ../src/viktrwlayer.c:8346 +#: ../src/viktrwlayer.c:8417 ../src/viktrwlayer.c:8494 +msgid "_Visibility" +msgstr "" + +#: ../src/vikaggregatelayer.c:686 +msgid "_Show All" +msgstr "" + +#: ../src/vikaggregatelayer.c:692 +msgid "_Hide All" +msgstr "" + +#: ../src/vikaggregatelayer.c:698 ../src/viktrwlayer.c:8363 +#: ../src/viktrwlayer.c:8434 ../src/viktrwlayer.c:8511 +msgid "_Toggle" +msgstr "" + +#: ../src/vikaggregatelayer.c:705 ../src/viktrwlayer.c:8532 +msgid "_Sort" +msgstr "" + +#: ../src/vikaggregatelayer.c:711 ../src/viktrwlayer.c:8538 +msgid "Name _Ascending" +msgstr "" + +#: ../src/vikaggregatelayer.c:717 ../src/viktrwlayer.c:8544 +msgid "Name _Descending" +msgstr "" + +#: ../src/vikaggregatelayer.c:723 ../src/viktrwlayer.c:575 +#: ../src/viktrwlayer.c:8550 +msgid "Date Ascending" +msgstr "" + +#: ../src/vikaggregatelayer.c:729 ../src/viktrwlayer.c:576 +#: ../src/viktrwlayer.c:8556 +msgid "Date Descending" +msgstr "" + +#: ../src/vikaggregatelayer.c:735 ../src/viktrwlayer.c:8445 +#: ../src/viktrwlayer.c:8523 ../src/viktrwlayer.c:8595 +#: ../src/viktrwlayer_tracklist.c:296 +msgid "_Statistics" +msgstr "" + +#: ../src/vikaggregatelayer.c:740 ../src/viktrwlayer.c:4533 +msgid "Track _List..." +msgstr "" + +#: ../src/vikaggregatelayer.c:746 ../src/viktrwlayer.c:4540 +msgid "_Waypoint List..." +msgstr "" + +#: ../src/vikaggregatelayer.c:753 +msgid "Searc_h" +msgstr "" + +#: ../src/vikaggregatelayer.c:759 +msgid "By _Date..." +msgstr "" + +#: ../src/vikaggregatelayer.c:762 +msgid "Find the first item with a specified date" +msgstr "" + +#: ../src/vikaggregatelayer.c:765 +msgid "Load E_xternal Layers" +msgstr "" + +#. Could have a more complicated tooltip that numbers each type of layers, +#. but for now a simple overall count +#: ../src/vikaggregatelayer.c:1011 +#, c-format +msgid "One layer" +msgid_plural "%d layers" +msgstr[0] "" +msgstr[1] "" + +#: ../src/vikaggregatelayer.c:1014 +#, c-format +msgid "Empty" +msgstr "" + +#: ../src/vikdemlayer.c:86 +msgid "SRTM Global 90m (3 arcsec)" +msgstr "" + +#: ../src/vikdemlayer.c:94 +msgid "Absolute height" +msgstr "Wysokość absolutna" + +#: ../src/vikdemlayer.c:95 +msgid "Height gradient" +msgstr "" + +#: ../src/vikdemlayer.c:120 +msgid "DEM Files:" +msgstr "Pliki DEM:" + +#: ../src/vikdemlayer.c:121 +msgid "Download Source:" +msgstr "" + +#: ../src/vikdemlayer.c:122 +msgid "Min Elev Color:" +msgstr "" + +#: ../src/vikdemlayer.c:123 ../src/viktrwlayer_wpwin.c:207 +msgid "Type:" +msgstr "Typ:" + +#: ../src/vikdemlayer.c:124 +msgid "Min Elev:" +msgstr "Min wys:" + +#: ../src/vikdemlayer.c:125 +msgid "Max Elev:" +msgstr "Maks wys:" + +#: ../src/vikdemlayer.c:137 +msgid "_DEM Download" +msgstr "" + +#: ../src/vikdemlayer.c:137 +msgid "DEM Download" +msgstr "" + +#: ../src/vikdemlayer.c:192 +msgid "DEM" +msgstr "" + +#: ../src/vikdemlayer.c:304 +#, c-format +msgid "Number of files: %d" +msgstr "" + +#: ../src/vikdemlayer.c:446 +msgid "DEM Loading" +msgstr "" + +#: ../src/vikdemlayer.c:927 +#, c-format +msgid "No SRTM data available for %f, %f" +msgstr "Brak danych SRTM dla %f, %f" + +#: ../src/vikdemlayer.c:948 +#, c-format +msgid "DEM download failure for %f, %f" +msgstr "" + +#: ../src/vikdemlayer.c:954 +#, c-format +msgid "DEM write failure for %s" +msgstr "" + +#. Probably not over any land... +#: ../src/vikdemlayer.c:1201 +msgid "No DEM File Available" +msgstr "" + +#: ../src/vikdemlayer.c:1220 +#, c-format +msgid "" +"\n" +"Source: %s\n" +"\n" +"DEM File: %s\n" +"DEM File Timestamp: %s" +msgstr "" + +#: ../src/vikdemlayer.c:1224 +#, c-format +msgid "" +"Source: %s\n" +"\n" +"No DEM File!" +msgstr "" + +#: ../src/vikdemlayer.c:1264 +#, c-format +msgid "Downloading DEM %s" +msgstr "Pobieranie DEM %s" + +#: ../src/vikdemlayer.c:1289 +msgid "_Show DEM File Information" +msgstr "" + +#: ../src/vikfileentry.c:72 +msgid "Browse..." +msgstr "Przeglądaj..." + +#: ../src/vikfileentry.c:103 +msgid "Choose file" +msgstr "Wskaż plik" + +#: ../src/vikfileentry.c:120 ../src/vikwindow.c:4372 +msgid "PNG" +msgstr "" + +#: ../src/vikfileentry.c:125 +msgid "TIFF" +msgstr "" + +#: ../src/vikfileentry.c:133 +msgid "MBTiles" +msgstr "" + +#: ../src/vikfileentry.c:142 +msgid "XML" +msgstr "" + +#: ../src/vikfileentry.c:149 +msgid "MML" +msgstr "" + +#: ../src/vikfileentry.c:154 +msgid "MSS" +msgstr "" + +#: ../src/vikfilelist.c:49 +msgid "Choose file(s)" +msgstr "Wskaż plik(i)" + +#: ../src/vikfilelist.c:182 +msgid "Add..." +msgstr "Dodaj..." + +#: ../src/vikfilelist.c:183 +msgid "Delete" +msgstr "Skasuj" + +#: ../src/vikgeoreflayer.c:97 +msgid "_Georef Move Map" +msgstr "" + +#: ../src/vikgeoreflayer.c:97 +msgid "Georef Move Map" +msgstr "" + +#: ../src/vikgeoreflayer.c:106 +msgid "Georef Z_oom Tool" +msgstr "" + +#: ../src/vikgeoreflayer.c:106 +msgid "Georef Zoom Tool" +msgstr "" + +#: ../src/vikgeoreflayer.c:117 +msgid "GeoRef Map" +msgstr "" + +#: ../src/vikgeoreflayer.c:214 +msgid "Auto Read World Files:" +msgstr "" + +#: ../src/vikgeoreflayer.c:215 +msgid "" +"Automatically attempt to read associated world file of a new image for a " +"GeoRef layer" +msgstr "" + +#: ../src/vikgeoreflayer.c:511 ../src/vikgeoreflayer.c:797 +#: ../src/vikmapslayer.c:1174 +#, c-format +msgid "Couldn't open image file: %s" +msgstr "Nie można otworzyć pliku obrazu: %s" + +#: ../src/vikgeoreflayer.c:607 ../src/vikgeoreflayer.c:633 +msgid "Choose World file" +msgstr "Wskaż plik World" + +#: ../src/vikgeoreflayer.c:619 +msgid "The World file you requested could not be opened for reading." +msgstr "Plik World, który wskazałeś nie może być otwarty do odczytu." + +#: ../src/vikgeoreflayer.c:621 +msgid "Unexpected end of file reading World file." +msgstr "Nieoczekiwany koniec pliku World" + +#: ../src/vikgeoreflayer.c:646 +msgid "The file you requested could not be opened for writing." +msgstr "Plik, który wskazałeś nie może być otwarty do zapisu." + +#: ../src/vikgeoreflayer.c:782 +msgid "Lower right corner values may not be consistent with upper right values" +msgstr "" + +#: ../src/vikgeoreflayer.c:806 +#, c-format +msgid "Invalid image size: %s" +msgstr "" + +#: ../src/vikgeoreflayer.c:831 ../src/viklayer.c:561 ../src/vikwindow.c:4891 +msgid "Layer Properties" +msgstr "Właściwości warstwy" + +#: ../src/vikgeoreflayer.c:852 +msgid "World File Parameters:" +msgstr "Parametry pliku World:" + +#: ../src/vikgeoreflayer.c:853 +msgid "Load From File..." +msgstr "Ładuj z pliku..." + +#: ../src/vikgeoreflayer.c:858 +msgid "Corner pixel easting:" +msgstr "" + +#: ../src/vikgeoreflayer.c:860 +msgid "the UTM \"easting\" value of the upper-left corner pixel of the map" +msgstr "" + +#: ../src/vikgeoreflayer.c:862 +msgid "Corner pixel northing:" +msgstr "" + +#: ../src/vikgeoreflayer.c:864 +msgid "the UTM \"northing\" value of the upper-left corner pixel of the map" +msgstr "" + +#: ../src/vikgeoreflayer.c:866 +msgid "X (easting) scale (mpp): " +msgstr "" + +#: ../src/vikgeoreflayer.c:867 +msgid "Y (northing) scale (mpp): " +msgstr "" + +#: ../src/vikgeoreflayer.c:870 +msgid "the scale of the map in the X direction (meters per pixel)" +msgstr "" + +#: ../src/vikgeoreflayer.c:872 +msgid "the scale of the map in the Y direction (meters per pixel)" +msgstr "" + +#: ../src/vikgeoreflayer.c:874 +msgid "Map Image:" +msgstr "" + +#: ../src/vikgeoreflayer.c:919 +msgid "Upper left latitude:" +msgstr "" + +#: ../src/vikgeoreflayer.c:921 +msgid "Upper left longitude:" +msgstr "" + +#: ../src/vikgeoreflayer.c:923 +msgid "Lower right latitude:" +msgstr "" + +#: ../src/vikgeoreflayer.c:925 +msgid "Lower right longitude:" +msgstr "" + +#: ../src/vikgeoreflayer.c:937 +msgid "Calculate MPP values from coordinates" +msgstr "" + +#: ../src/vikgeoreflayer.c:938 +msgid "" +"Enter all corner coordinates before calculating the MPP values from the " +"image size" +msgstr "" + +#: ../src/vikgeoreflayer.c:948 +msgid "UTM" +msgstr "" + +#: ../src/vikgeoreflayer.c:949 +msgid "Latitude/Longitude" +msgstr "" + +#: ../src/vikgeoreflayer.c:957 ../src/vikmapniklayer.c:82 +#: ../src/vikmapslayer.c:158 +msgid "Alpha:" +msgstr "Alfa:" + +#. Now with icons +#: ../src/vikgeoreflayer.c:1062 +msgid "_Zoom to Fit Map" +msgstr "" + +#: ../src/vikgeoreflayer.c:1068 +msgid "_Goto Map Center" +msgstr "" + +#: ../src/vikgeoreflayer.c:1074 +msgid "_Export to World File" +msgstr "" + +#: ../src/vikgoto.c:98 +msgid "No goto tool available." +msgstr "" + +#: ../src/vikgoto.c:295 +msgid "goto" +msgstr "" + +#: ../src/vikgoto.c:297 +msgid "goto provider:" +msgstr "" + +#: ../src/vikgoto.c:312 +msgid "Enter address or place name:" +msgstr "Wprowadź adres lub nazwę miejsca:" + +#: ../src/vikgoto.c:487 +msgid "Locality" +msgstr "" + +#: ../src/vikgpslayer.c:137 +msgid "Data Mode" +msgstr "" + +#: ../src/vikgpslayer.c:139 +msgid "Realtime Tracking Mode" +msgstr "" + +#: ../src/vikgpslayer.c:176 +msgid "Keep vehicle at center" +msgstr "" + +#: ../src/vikgpslayer.c:177 +msgid "Keep vehicle on screen" +msgstr "" + +#: ../src/vikgpslayer.c:178 +msgid "Disable" +msgstr "" + +#: ../src/vikgpslayer.c:218 +msgid "Download Tracks:" +msgstr "" + +#: ../src/vikgpslayer.c:219 +msgid "Upload Tracks:" +msgstr "" + +#: ../src/vikgpslayer.c:220 +msgid "Download Routes:" +msgstr "" + +#: ../src/vikgpslayer.c:221 +msgid "Upload Routes:" +msgstr "" + +#: ../src/vikgpslayer.c:222 +msgid "Download Waypoints:" +msgstr "" + +#: ../src/vikgpslayer.c:223 +msgid "Upload Waypoints:" +msgstr "" + +#: ../src/vikgpslayer.c:225 +msgid "Recording tracks" +msgstr "Nagrywanie ścieżek" + +#: ../src/vikgpslayer.c:226 +msgid "Jump to current position on start" +msgstr "Skocz do aktualnej pozycji przy starcie" + +#: ../src/vikgpslayer.c:227 +msgid "Moving Map Method:" +msgstr "Metoda przesuwania mapy:" + +#: ../src/vikgpslayer.c:228 +msgid "Update Statusbar:" +msgstr "" + +#: ../src/vikgpslayer.c:228 +msgid "Display information in the statusbar on GPS updates" +msgstr "" + +#: ../src/vikgpslayer.c:229 +msgid "Auto Connect" +msgstr "" + +#: ../src/vikgpslayer.c:229 +msgid "Automatically connect to GPSD" +msgstr "" + +#: ../src/vikgpslayer.c:230 +msgid "Gpsd Host:" +msgstr "" + +#: ../src/vikgpslayer.c:231 +msgid "Gpsd Port:" +msgstr "" + +#: ../src/vikgpslayer.c:232 +msgid "Gpsd Retry Interval (seconds):" +msgstr "" + +#: ../src/vikgpslayer.c:254 +msgid "GPS" +msgstr "" + +#: ../src/vikgpslayer.c:320 ../src/vikgpslayer.c:1504 +msgid "GPS Download" +msgstr "" + +#: ../src/vikgpslayer.c:320 ../src/vikgpslayer.c:1504 ../src/viktrwlayer.c:3993 +msgid "GPS Upload" +msgstr "" + +#: ../src/vikgpslayer.c:322 +msgid "GPS Realtime Tracking" +msgstr "" + +#: ../src/vikgpslayer.c:458 +msgid "Connected" +msgstr "" + +#: ../src/vikgpslayer.c:460 +msgid "Disconnected" +msgstr "" + +#: ../src/vikgpslayer.c:554 +msgid "Unknown GPS Protocol" +msgstr "Nieznany protokół GPS" + +#: ../src/vikgpslayer.c:572 +msgid "Unknown serial port device" +msgstr "Nieznany port szeregowy urządzenia" + +#: ../src/vikgpslayer.c:691 +#, c-format +msgid "%s: unknown parameter" +msgstr "%s: nieznany parametr" + +#. Now with icons +#: ../src/vikgpslayer.c:794 +msgid "_Upload to GPS" +msgstr "" + +#: ../src/vikgpslayer.c:800 +msgid "Download from _GPS" +msgstr "" + +#: ../src/vikgpslayer.c:821 +msgid "Empty _Realtime" +msgstr "" + +#: ../src/vikgpslayer.c:828 +msgid "E_mpty Upload" +msgstr "" + +#: ../src/vikgpslayer.c:834 +msgid "_Empty Download" +msgstr "" + +#: ../src/vikgpslayer.c:840 +msgid "Empty _All" +msgstr "" + +#: ../src/vikgpslayer.c:852 +#, c-format +msgid "Unexpected number of disconnected handlers: %d" +msgstr "" + +#: ../src/vikgpslayer.c:995 +#, c-format +msgid "Uploading %d waypoint..." +msgid_plural "Uploading %d waypoints..." +msgstr[0] "" +msgstr[1] "" + +#: ../src/vikgpslayer.c:1000 +#, c-format +msgid "Uploading %d trackpoint..." +msgid_plural "Uploading %d trackpoints..." +msgstr[0] "" +msgstr[1] "" + +#: ../src/vikgpslayer.c:1005 +#, c-format +msgid "Uploading %d routepoint..." +msgid_plural "Uploading %d routepoints..." +msgstr[0] "" +msgstr[1] "" + +#: ../src/vikgpslayer.c:1034 +#, c-format +msgid "Downloaded %d out of %d waypoint..." +msgid_plural "Downloaded %d out of %d waypoints..." +msgstr[0] "Pobrano %d z %d punktu orientacyjnego..." +msgstr[1] "Pobrano %d z %d punktów orientacyjnych..." +msgstr[2] "Pobrano %d z %d punktów orientacyjnych..." + +#: ../src/vikgpslayer.c:1040 +#, c-format +msgid "Downloaded %d out of %d trackpoint..." +msgid_plural "Downloaded %d out of %d trackpoints..." +msgstr[0] "" +msgstr[1] "" + +#: ../src/vikgpslayer.c:1046 +#, c-format +msgid "Downloaded %d out of %d routepoint..." +msgid_plural "Downloaded %d out of %d routepoints..." +msgstr[0] "" +msgstr[1] "" + +#: ../src/vikgpslayer.c:1056 +#, c-format +msgid "Uploaded %d out of %d waypoint..." +msgid_plural "Uploaded %d out of %d waypoints..." +msgstr[0] "" +msgstr[1] "" + +#: ../src/vikgpslayer.c:1062 +#, c-format +msgid "Uploaded %d out of %d trackpoint..." +msgid_plural "Uploaded %d out of %d trackpoints..." +msgstr[0] "" +msgstr[1] "" + +#: ../src/vikgpslayer.c:1068 +#, c-format +msgid "Uploaded %d out of %d routepoint..." +msgid_plural "Uploaded %d out of %d routepoints..." +msgstr[0] "" +msgstr[1] "" + +#: ../src/vikgpslayer.c:1079 +#, c-format +msgid "Downloaded %d waypoint" +msgid_plural "Downloaded %d waypoints" +msgstr[0] "Pobrano %d punkt orientacyjny" +msgstr[1] "Pobrano %d punktów orientacyjnych" +msgstr[2] "Pobrano %d punktów orientacyjnych" + +#: ../src/vikgpslayer.c:1085 +#, c-format +msgid "Downloaded %d trackpoint" +msgid_plural "Downloaded %d trackpoints" +msgstr[0] "" +msgstr[1] "" + +#: ../src/vikgpslayer.c:1091 +#, c-format +msgid "Downloaded %d routepoint" +msgid_plural "Downloaded %d routepoints" +msgstr[0] "" +msgstr[1] "" + +#: ../src/vikgpslayer.c:1101 +#, c-format +msgid "Uploaded %d waypoint" +msgid_plural "Uploaded %d waypoints" +msgstr[0] "" +msgstr[1] "" + +#: ../src/vikgpslayer.c:1107 +#, c-format +msgid "Uploaded %d trackpoint" +msgid_plural "Uploaded %d trackpoints" +msgstr[0] "" +msgstr[1] "" + +#: ../src/vikgpslayer.c:1113 +#, c-format +msgid "Uploaded %d routepoint" +msgid_plural "Uploaded %d routepoints" +msgstr[0] "" +msgstr[1] "" + +#: ../src/vikgpslayer.c:1363 +msgid "Error: No result." +msgstr "" + +#: ../src/vikgpslayer.c:1471 +msgid "Warning - GPS Upload items may overwrite each other" +msgstr "" + +#: ../src/vikgpslayer.c:1506 +msgid "Status: detecting gpsbabel" +msgstr "" + +#: ../src/vikgpslayer.c:1533 +msgid "No GPS items selected for transfer." +msgstr "" + +#: ../src/vikgpslayer.c:1546 +msgid "Could not turn off device." +msgstr "" + +#: ../src/vikgpslayer.c:1589 +msgid "Are you sure you want to delete GPS Upload data?" +msgstr "" + +#: ../src/vikgpslayer.c:1602 +msgid "Are you sure you want to delete GPS Download data?" +msgstr "" + +#: ../src/vikgpslayer.c:1616 +msgid "Are you sure you want to delete GPS Realtime data?" +msgstr "" + +#: ../src/vikgpslayer.c:1630 +msgid "Are you sure you want to delete All GPS data?" +msgstr "" + +#: ../src/vikgpslayer.c:2004 +#, c-format +msgid "" +"Failed to connect to gpsd at %s (port %s)\n" +"Should Viking keep trying (every %d seconds)?" +msgstr "" + +#: ../src/viklayerspanel.c:73 +msgid "C_ut" +msgstr "" + +#: ../src/viklayerspanel.c:74 ../src/vikwindow.c:4882 +msgid "_Copy" +msgstr "_Kopiuj" + +#: ../src/viklayerspanel.c:75 ../src/vikwindow.c:4883 +msgid "_Paste" +msgstr "_Wstaw" + +#: ../src/viklayerspanel.c:76 ../src/vikwindow.c:4884 +msgid "_Delete" +msgstr "_Skasuj" + +#: ../src/viklayerspanel.c:154 +msgid "New Layer" +msgstr "" + +#: ../src/viklayerspanel.c:347 +msgid "Top Layer" +msgstr "" + +#: ../src/viklayerspanel.c:363 +msgid "Add new layer" +msgstr "Dodaj nową wartwę" + +#: ../src/viklayerspanel.c:370 ../src/vikwindow.c:4884 +msgid "Remove selected layer" +msgstr "Usuń wybraną warstwę" + +#: ../src/viklayerspanel.c:377 +msgid "Move selected layer up" +msgstr "" + +#: ../src/viklayerspanel.c:384 +msgid "Move selected layer down" +msgstr "" + +#: ../src/viklayerspanel.c:391 ../src/vikwindow.c:4881 +msgid "Cut selected layer" +msgstr "Wytnij zaznaczoną warstwę" + +#: ../src/viklayerspanel.c:398 ../src/vikwindow.c:4882 +msgid "Copy selected layer" +msgstr "Kopiuj zaznaczoną warstwę" + +#: ../src/viklayerspanel.c:405 ../src/vikwindow.c:4883 +msgid "" +"Paste layer into selected container layer or otherwise above selected layer" +msgstr "" + +#: ../src/viklayerspanel.c:502 +msgid "New name can not be blank." +msgstr "" + +#: ../src/viklayerspanel.c:751 +msgid "Aggregate Layers have no settable properties." +msgstr "" + +#: ../src/viklayerspanel.c:798 +msgid "You cannot cut the Top Layer." +msgstr "Nie można wyciąć najwyższej warstwy" + +#: ../src/viklayerspanel.c:843 +#, c-format +msgid "Are you sure you want to delete %s?" +msgstr "" + +#: ../src/viklayerspanel.c:863 +msgid "You cannot delete the Top Layer." +msgstr "Nie można usunąćnajwyższej warstwy" + +#: ../src/vikmapniklayer.c:78 +msgid "CSS (MML) Config File:" +msgstr "" + +#: ../src/vikmapniklayer.c:79 +msgid "CartoCSS configuration file" +msgstr "" + +#: ../src/vikmapniklayer.c:80 +msgid "XML Config File:" +msgstr "" + +#: ../src/vikmapniklayer.c:81 +msgid "Mapnik XML configuration file" +msgstr "" + +#: ../src/vikmapniklayer.c:84 +msgid "Use File Cache:" +msgstr "" + +#: ../src/vikmapniklayer.c:86 +msgid "File Cache Directory:" +msgstr "" + +#: ../src/vikmapniklayer.c:122 +msgid "_Mapnik Features" +msgstr "" + +#: ../src/vikmapniklayer.c:122 +msgid "Mapnik Features" +msgstr "" + +#: ../src/vikmapniklayer.c:140 +msgid "Mapnik Rendering" +msgstr "" + +#. Changing these values only applies before first mapnik layer is 'created' +#: ../src/vikmapniklayer.c:258 +msgid "Plugins Directory:" +msgstr "" + +#: ../src/vikmapniklayer.c:258 ../src/vikmapniklayer.c:259 +#: ../src/vikmapniklayer.c:260 ../src/vikmapniklayer.c:261 +msgid "You need to restart Viking for a change to this value to be used" +msgstr "" + +#: ../src/vikmapniklayer.c:259 +msgid "Fonts Directory:" +msgstr "" + +#: ../src/vikmapniklayer.c:260 +msgid "Recurse Fonts Directory:" +msgstr "" + +#: ../src/vikmapniklayer.c:261 +msgid "Rerender Timeout (hours):" +msgstr "" + +#. Changeable any time +#: ../src/vikmapniklayer.c:263 +msgid "CartoCSS:" +msgstr "" + +#: ../src/vikmapniklayer.c:263 +msgid "The program to convert CartoCSS files into Mapnik XML" +msgstr "" + +#: ../src/vikmapniklayer.c:506 +msgid "Running" +msgstr "" + +#: ../src/vikmapniklayer.c:525 +#, c-format +msgid "" +"Error running carto command:\n" +"%s" +msgstr "" + +#: ../src/vikmapniklayer.c:561 +msgid " completed in " +msgstr "" + +#: ../src/vikmapniklayer.c:561 +msgid "seconds" +msgstr "" + +#: ../src/vikmapniklayer.c:611 ../src/vikmapniklayer.c:979 +#, c-format +msgid "" +"Mapnik error loading configuration file:\n" +"%s" +msgstr "" + +#: ../src/vikmapniklayer.c:749 +#, c-format +msgid "Mapnik Render %d:%d:%d %s" +msgstr "" + +#: ../src/vikmapniklayer.c:840 +msgid "Mapnik Rendering must be in Mercator mode" +msgstr "" + +#: ../src/vikmapniklayer.c:997 +msgid "Mapnik Information" +msgstr "" + +#: ../src/vikmapniklayer.c:1031 +msgid "_Flush Memory Cache" +msgstr "" + +#: ../src/vikmapniklayer.c:1044 +msgid "_Run Carto Command" +msgstr "" + +#: ../src/vikmapniklayer.c:1102 ../src/vikmapslayer.c:2029 +#, c-format +msgid "Tile File Timestamp: %s" +msgstr "" + +#: ../src/vikmapniklayer.c:1105 ../src/vikmapslayer.c:2032 +msgid "Tile File Timestamp: Not Available" +msgstr "" + +#: ../src/vikmapniklayer.c:1120 +#, c-format +msgid "Rendering time %.2f seconds" +msgstr "" + +#: ../src/vikmapniklayer.c:1124 ../src/vikmapslayer.c:2042 +msgid "Tile Information" +msgstr "" + +#: ../src/vikmapniklayer.c:1145 +msgid "_Rerender Tile" +msgstr "" + +#: ../src/vikmapniklayer.c:1150 +msgid "_Info" +msgstr "" + +#. ******* MAPZOOMS ******** +#: ../src/vikmapslayer.c:96 +msgid "Use Viking Zoom Level" +msgstr "" + +#: ../src/vikmapslayer.c:146 +msgid "OSM" +msgstr "" + +#. NB mode => id - But can't break file format just to rename something better +#: ../src/vikmapslayer.c:152 +msgid "Map Type:" +msgstr "Typ mapy:" + +#: ../src/vikmapslayer.c:153 +msgid "Maps Directory:" +msgstr "Katalog map:" + +#: ../src/vikmapslayer.c:154 +msgid "Cache Layout:" +msgstr "" + +#: ../src/vikmapslayer.c:155 +msgid "This determines the tile storage layout on disk" +msgstr "" + +#: ../src/vikmapslayer.c:156 +msgid "Map File:" +msgstr "" + +#: ../src/vikmapslayer.c:157 +msgid "An MBTiles file. Only applies when the map type method is 'MBTiles'" +msgstr "" + +#: ../src/vikmapslayer.c:159 +msgid "Control the Alpha value for transparency effects" +msgstr "" + +#: ../src/vikmapslayer.c:160 +msgid "Autodownload maps:" +msgstr "" + +#: ../src/vikmapslayer.c:161 +msgid "Autodownload Only Gets Missing Maps:" +msgstr "" + +#: ../src/vikmapslayer.c:162 +msgid "" +"Using this option avoids attempting to update already acquired tiles. This " +"can be useful if you want to restrict the network usage, without having to " +"resort to manual control. Only applies when 'Autodownload Maps' is on." +msgstr "" + +#: ../src/vikmapslayer.c:163 +msgid "Zoom Level:" +msgstr "Poziom zbliżenia:" + +#: ../src/vikmapslayer.c:164 +msgid "" +"Determines the method of displaying map tiles for the current zoom level. " +"'Viking Zoom Level' uses the best matching level, otherwise setting a fixed " +"value will always use map tiles of the specified value regardless of the " +"actual zoom level." +msgstr "" + +#: ../src/vikmapslayer.c:197 +msgid "_Maps Download" +msgstr "" + +#: ../src/vikmapslayer.c:197 +msgid "Maps Download" +msgstr "" + +#: ../src/vikmapslayer.c:213 ../src/vikutils.c:895 +msgid "Map" +msgstr "Mapa" + +#: ../src/vikmapslayer.c:306 +msgid "Default map layer directory:" +msgstr "" + +#: ../src/vikmapslayer.c:306 +msgid "Choose a directory to store cached Map tiles for this layer" +msgstr "" + +#: ../src/vikmapslayer.c:436 ../src/vikmapslayer.c:633 +msgid "Unknown map type" +msgstr "Nieznany typ mapy" + +#: ../src/vikmapslayer.c:664 +msgid "Unknown Map Zoom" +msgstr "" + +#: ../src/vikmapslayer.c:833 +#, c-format +msgid "Failed to open MBTiles file: %s" +msgstr "" + +#: ../src/vikmapslayer.c:856 +#, c-format +msgid "" +"New map cannot be displayed in the current drawmode.\n" +"Select \"%s\" from View menu to view it." +msgstr "" + +#: ../src/vikmapslayer.c:1314 +#, c-format +msgid "" +"Cowardly refusing to draw tiles or existence of tiles beyond %d zoom out " +"factor" +msgstr "" + +#. TODO: ?? count up the number of download errors somehow... +#: ../src/vikmapslayer.c:1667 +msgid "Failed to download tile" +msgstr "" + +#: ../src/vikmapslayer.c:1673 +msgid "Unable to save tile" +msgstr "" + +#: ../src/vikmapslayer.c:1799 +#, c-format +msgid "Redownloading up to %d %s map..." +msgid_plural "Redownloading up to %d %s maps..." +msgstr[0] "" +msgstr[1] "" + +#: ../src/vikmapslayer.c:1801 +#, c-format +msgid "Redownloading %d %s map..." +msgid_plural "Redownloading %d %s maps..." +msgstr[0] "" +msgstr[1] "" + +#: ../src/vikmapslayer.c:1805 ../src/vikmapslayer.c:1890 +#, c-format +msgid "Downloading %d %s map..." +msgid_plural "Downloading %d %s maps..." +msgstr[0] "Pobieranie %d %s mapy..." +msgstr[1] "Pobieranie %d %s map..." +msgstr[2] "Pobieranie %d %s map..." + +#: ../src/vikmapslayer.c:1969 +msgid "YES" +msgstr "" + +#: ../src/vikmapslayer.c:1973 ../src/vikmapslayer.c:1977 +msgid "NO" +msgstr "" + +#. NB Also handles .jpg automatically due to pixbuf_new_from () support - although just print png for now. +#: ../src/vikmapslayer.c:1980 +#, c-format +msgid "Source: %s (%d%s%d%s%d.%s %s)" +msgstr "" + +#: ../src/vikmapslayer.c:1983 +msgid "Source: Not available" +msgstr "" + +#: ../src/vikmapslayer.c:2000 +msgid "Source: file://" +msgstr "" + +#: ../src/vikmapslayer.c:2012 +#, c-format +msgid "Source: %s" +msgstr "" + +#: ../src/vikmapslayer.c:2038 +#, c-format +msgid "Tile File: %s [Not Available]" +msgstr "" + +#: ../src/vikmapslayer.c:2086 +msgid "Redownload _Bad Map(s)" +msgstr "" + +#: ../src/vikmapslayer.c:2090 +msgid "Redownload _New Map(s)" +msgstr "" + +#: ../src/vikmapslayer.c:2094 +msgid "Redownload _All Map(s)" +msgstr "" + +#: ../src/vikmapslayer.c:2099 +msgid "_Show Tile Information" +msgstr "" + +#: ../src/vikmapslayer.c:2166 +#, c-format +msgid "" +"Wrong drawmode for this map.\n" +"Select \"%s\" from View menu and try again." +msgstr "" + +#: ../src/vikmapslayer.c:2171 +msgid "Wrong zoom level for this map." +msgstr "" + +#: ../src/vikmapslayer.c:2334 +msgid "Zoom Start:" +msgstr "" + +#: ../src/vikmapslayer.c:2341 +msgid "Zoom End:" +msgstr "" + +#: ../src/vikmapslayer.c:2347 +msgid "Download Maps Method:" +msgstr "" + +#. redownload method - needs to align with REDOWNLOAD* macro values +#: ../src/vikmapslayer.c:2419 +msgid "Missing" +msgstr "" + +#: ../src/vikmapslayer.c:2419 +msgid "Bad" +msgstr "" + +#: ../src/vikmapslayer.c:2419 +msgid "New" +msgstr "" + +#: ../src/vikmapslayer.c:2419 +msgid "Reload All" +msgstr "" + +#: ../src/vikmapslayer.c:2421 +msgid "Download for Zoom Levels" +msgstr "" + +#: ../src/vikmapslayer.c:2461 +#, c-format +msgid "" +"You are not allowed to download more than %d tiles in one go (requested %d)" +msgstr "" + +#: ../src/vikmapslayer.c:2469 +#, c-format +msgid "Do you really want to download %d tiles?" +msgstr "" + +#. Now with icons +#: ../src/vikmapslayer.c:2509 +msgid "Download _Missing Onscreen Maps" +msgstr "" + +#: ../src/vikmapslayer.c:2516 +msgid "Download _New Onscreen Maps" +msgstr "" + +#: ../src/vikmapslayer.c:2523 +msgid "Reload _All Onscreen Maps" +msgstr "" + +#: ../src/vikmapslayer.c:2529 +msgid "Download Maps in _Zoom Levels..." +msgstr "" + +#: ../src/vikmapslayer.c:2539 +#, fuzzy +msgid "_Open MBTiles Files" +msgstr "Otwórz ostatnio _używany plik" + +#: ../src/vikmapslayer.c:2554 +msgid "Flush Map Cache" +msgstr "" + +#: ../src/vikrouting.c:54 +msgid "Default engine:" +msgstr "" + +#: ../src/vikrouting.c:68 +msgid "Routing" +msgstr "" + +#: ../src/viktreeview.c:347 +msgid "Layer Name" +msgstr "Nazwa warstwy" + +#: ../src/viktreeview.c:924 +#, c-format +msgid "delete data from %s\n" +msgstr "usuń dane z %s\n" + +#: ../src/viktrwlayer.c:427 +msgid "Create _Waypoint" +msgstr "" + +#: ../src/viktrwlayer.c:427 +msgid "Create Waypoint" +msgstr "Utwórz punkt orientacyjny" + +#: ../src/viktrwlayer.c:437 +#, fuzzy +msgid "Edit _Track" +msgstr "Dodaj ścieżkę" + +#: ../src/viktrwlayer.c:437 +#, fuzzy +msgid "Edit Track" +msgstr "Dodaj ścieżkę" + +#: ../src/viktrwlayer.c:449 +msgid "Edit _Route" +msgstr "" + +#: ../src/viktrwlayer.c:449 +#, fuzzy +msgid "Edit Route" +msgstr "Edytuj punkt orientacyjny" + +#: ../src/viktrwlayer.c:460 +msgid "Route _Finder" +msgstr "" + +#: ../src/viktrwlayer.c:460 +msgid "Route Finder" +msgstr "" + +#: ../src/viktrwlayer.c:471 +#, fuzzy +msgid "Splitter" +msgstr "Podziel tutaj" + +#: ../src/viktrwlayer.c:482 +msgid "_Edit Waypoint" +msgstr "" + +#: ../src/viktrwlayer.c:482 +msgid "Edit Waypoint" +msgstr "Edytuj punkt orientacyjny" + +#: ../src/viktrwlayer.c:495 +msgid "Edit Trac_kpoint" +msgstr "" + +#: ../src/viktrwlayer.c:495 +msgid "Edit Trackpoint" +msgstr "" + +#. a pixbuf for this one is already made globally available +#: ../src/viktrwlayer.c:508 +msgid "Show P_icture" +msgstr "" + +#: ../src/viktrwlayer.c:508 +msgid "Show Picture" +msgstr "Pokaż zdjęcie" + +#: ../src/viktrwlayer.c:531 +msgid "Waypoint Images" +msgstr "" + +#: ../src/viktrwlayer.c:531 +msgid "Tracks Advanced" +msgstr "" + +#: ../src/viktrwlayer.c:531 +msgid "Metadata" +msgstr "" + +#: ../src/viktrwlayer.c:531 +msgid "Filesystem" +msgstr "" + +#: ../src/viktrwlayer.c:534 +msgid "Draw by Track" +msgstr "Rysuj wg ścieżki" + +#: ../src/viktrwlayer.c:534 +msgid "Draw by Speed" +msgstr "" + +#: ../src/viktrwlayer.c:534 +msgid "All Tracks Same Color" +msgstr "" + +#: ../src/viktrwlayer.c:535 +msgid "Filled Square" +msgstr "Kwadrat wypełniony" + +#: ../src/viktrwlayer.c:535 +msgid "Square" +msgstr "Kwadrat" + +#: ../src/viktrwlayer.c:535 +msgid "Circle" +msgstr "Okrąg" + +#: ../src/viktrwlayer.c:535 +msgid "X" +msgstr "X" + +#: ../src/viktrwlayer.c:561 +msgid "Extra Extra Small" +msgstr "" + +#: ../src/viktrwlayer.c:562 +msgid "Extra Small" +msgstr "" + +#: ../src/viktrwlayer.c:566 +msgid "Extra Large" +msgstr "" + +#: ../src/viktrwlayer.c:567 +msgid "Extra Extra Large" +msgstr "" + +#: ../src/viktrwlayer.c:573 +msgid "Name Ascending" +msgstr "" + +#: ../src/viktrwlayer.c:574 +msgid "Name Descending" +msgstr "" + +#: ../src/viktrwlayer.c:582 ../src/viktrwlayer_propwin.c:3319 +msgid "No" +msgstr "" + +#: ../src/viktrwlayer.c:583 +msgid "Yes" +msgstr "" + +#: ../src/viktrwlayer.c:584 +msgid "No write" +msgstr "" + +#: ../src/viktrwlayer.c:649 ../src/viktrwlayer.c:673 +msgid "Draw Labels" +msgstr "Rysuj etykiety" + +#: ../src/viktrwlayer.c:650 +msgid "Note: the individual track controls what labels may be displayed" +msgstr "" + +#: ../src/viktrwlayer.c:651 +msgid "Track Labels Font Size:" +msgstr "" + +#: ../src/viktrwlayer.c:652 +msgid "Track Drawing Mode:" +msgstr "Tryb rysowania ścieżki:" + +#: ../src/viktrwlayer.c:653 +msgid "All Tracks Color:" +msgstr "" + +#: ../src/viktrwlayer.c:654 +msgid "The color used when 'All Tracks Same Color' drawing mode is selected" +msgstr "" + +#: ../src/viktrwlayer.c:655 +msgid "Draw Track Lines" +msgstr "Trysuj linie ścieżki" + +#: ../src/viktrwlayer.c:656 +msgid "Track Thickness:" +msgstr "Grubość ścieżki:" + +#: ../src/viktrwlayer.c:657 +msgid "Draw Track Direction" +msgstr "" + +#: ../src/viktrwlayer.c:658 +msgid "Direction Size:" +msgstr "" + +#: ../src/viktrwlayer.c:659 +msgid "Draw Trackpoints" +msgstr "" + +#: ../src/viktrwlayer.c:660 +msgid "Trackpoint Size:" +msgstr "" + +#: ../src/viktrwlayer.c:661 +msgid "Draw Elevation" +msgstr "Rysuj wysokość" + +#: ../src/viktrwlayer.c:662 +msgid "Draw Elevation Height %:" +msgstr "" + +#: ../src/viktrwlayer.c:663 +msgid "Draw Stops" +msgstr "Rysuj postoje" + +#: ../src/viktrwlayer.c:664 +msgid "" +"Whether to draw a marker when trackpoints are at the same position but over " +"the minimum stop length apart in time" +msgstr "" + +#: ../src/viktrwlayer.c:665 +msgid "Min Stop Length (seconds):" +msgstr "Min długość postoju (sekundy):" + +#: ../src/viktrwlayer.c:667 +msgid "Track BG Thickness:" +msgstr "" + +#: ../src/viktrwlayer.c:668 +msgid "Track Background Color" +msgstr "" + +#: ../src/viktrwlayer.c:669 +msgid "Draw by Speed Factor (%):" +msgstr "" + +#: ../src/viktrwlayer.c:670 +msgid "" +"The percentage factor away from the average speed determining the color used" +msgstr "" + +#: ../src/viktrwlayer.c:671 +msgid "Track Sort Order:" +msgstr "" + +#: ../src/viktrwlayer.c:674 +msgid "Waypoint Font Size:" +msgstr "" + +#: ../src/viktrwlayer.c:675 +msgid "Waypoint Color:" +msgstr "Kolor punktu orientacyjnego:" + +#: ../src/viktrwlayer.c:676 +msgid "Waypoint Text:" +msgstr "Opis punktu orientacyjnego:" + +#: ../src/viktrwlayer.c:677 +msgid "Background:" +msgstr "Tło:" + +#: ../src/viktrwlayer.c:678 +msgid "Fake BG Color Translucency:" +msgstr "" + +#: ../src/viktrwlayer.c:679 +msgid "Waypoint marker:" +msgstr "Znacznik puktu orientacyjnego:" + +#: ../src/viktrwlayer.c:680 +msgid "Waypoint size:" +msgstr "Rozmiar punktu orientacyjnego:" + +#: ../src/viktrwlayer.c:681 +msgid "Draw Waypoint Symbols:" +msgstr "Rysuj symbole puktów orientacyjnych:" + +#: ../src/viktrwlayer.c:682 +msgid "Waypoint Sort Order:" +msgstr "" + +#: ../src/viktrwlayer.c:684 +msgid "Draw Waypoint Images" +msgstr "" + +#: ../src/viktrwlayer.c:685 +msgid "Image Size (pixels):" +msgstr "Rozmiar obrazu (piksele):" + +#: ../src/viktrwlayer.c:686 +msgid "Image Alpha:" +msgstr "" + +#: ../src/viktrwlayer.c:687 +msgid "Image Memory Cache Size:" +msgstr "Rozmiar pamięci podręcznej obrazu:" + +#: ../src/viktrwlayer.c:690 +msgid "Author" +msgstr "" + +#: ../src/viktrwlayer.c:691 +msgid "Creation Time" +msgstr "" + +#: ../src/viktrwlayer.c:692 +msgid "Keywords" +msgstr "" + +#: ../src/viktrwlayer.c:693 +msgid "External layer:" +msgstr "" + +#: ../src/viktrwlayer.c:693 +msgid "" +"Layer data stored in the Viking file, in an external file, or in an external " +"file but changes are not written to the file (file only loaded at startup)" +msgstr "" + +#: ../src/viktrwlayer.c:694 +msgid "Save layer as:" +msgstr "" + +#: ../src/viktrwlayer.c:694 +msgid "Specify where layer should be saved. Overwrites file if it exists." +msgstr "" + +#: ../src/viktrwlayer.c:798 +msgid "TrackWaypoint" +msgstr "" + +#: ../src/viktrwlayer.c:1999 ../src/viktrwlayer_propwin.c:1469 +#: ../src/viktrwlayer_propwin.c:1471 ../src/vikutils.c:299 +#: ../src/vikutils.c:326 +msgid "miles" +msgstr "" + +#: ../src/viktrwlayer.c:2002 ../src/viktrwlayer_propwin.c:1475 +#: ../src/viktrwlayer_propwin.c:1477 ../src/vikutils.c:303 +#: ../src/vikutils.c:330 +msgid "NM" +msgstr "" + +#. VIK_UNITS_DISTANCE_KILOMETRES: +#: ../src/viktrwlayer.c:2006 ../src/viktrwlayer_propwin.c:1482 +#: ../src/viktrwlayer_propwin.c:1484 ../src/vikutils.c:308 +#: ../src/vikutils.c:335 +msgid "km" +msgstr "" + +#: ../src/viktrwlayer.c:2121 +msgid "start/end" +msgstr "" + +#: ../src/viktrwlayer.c:2133 +msgid "start" +msgstr "" + +#: ../src/viktrwlayer.c:2142 +msgid "end" +msgstr "" + +#: ../src/viktrwlayer.c:3103 +#, c-format +msgid " in %d:%02d hrs:mins" +msgstr "" + +#: ../src/viktrwlayer.c:3107 +#, c-format +msgid "" +"\n" +"%sTotal Length %.1f %s%s" +msgstr "" + +#: ../src/viktrwlayer.c:3131 +#, c-format +msgid "" +"\n" +"Total route length %.1f %s" +msgstr "" + +#: ../src/viktrwlayer.c:3136 +#, c-format +msgid "Tracks: %d - Waypoints: %d - Routes: %d%s%s" +msgstr "" + +#: ../src/viktrwlayer.c:3155 +#, c-format +msgid "Tracks: %d" +msgstr "" + +#: ../src/viktrwlayer.c:3165 +#, c-format +msgid "Routes: %d" +msgstr "" + +#: ../src/viktrwlayer.c:3195 +#, c-format +msgid "- %d:%02d hrs:mins" +msgstr "" + +#: ../src/viktrwlayer.c:3202 +#, c-format +msgid "%s%.1f km %s" +msgstr "" + +#: ../src/viktrwlayer.c:3205 +#, c-format +msgid "%s%.1f miles %s" +msgstr "" + +#: ../src/viktrwlayer.c:3208 +#, c-format +msgid "%s%.1f NM %s" +msgstr "" + +#: ../src/viktrwlayer.c:3222 +#, c-format +msgid "Waypoints: %d" +msgstr "" + +#: ../src/viktrwlayer.c:3279 +#, c-format +msgid "Wpt: Alt %dft" +msgstr "" + +#. VIK_UNITS_HEIGHT_METRES: +#: ../src/viktrwlayer.c:3283 +#, c-format +msgid "Wpt: Alt %dm" +msgstr "" + +#. Add comment if available +#: ../src/viktrwlayer.c:3298 +#, c-format +msgid "%s | %s %s | Comment: %s" +msgstr "" + +#: ../src/viktrwlayer.c:3300 +#, c-format +msgid "%s | %s %s" +msgstr "" + +#: ../src/viktrwlayer.c:3562 ../src/viktrwlayer.c:3591 +msgid "This layer has no waypoints or trackpoints." +msgstr "" + +#: ../src/viktrwlayer.c:3598 ../src/viktrwlayer.c:3607 +#: ../src/viktrwlayer.c:3616 ../src/viktrwlayer.c:3625 +#: ../src/viktrwlayer.c:3634 ../src/viktrwlayer.c:3642 +msgid "Export Layer" +msgstr "Eksportuj warstwę" + +#: ../src/viktrwlayer.c:3671 +msgid "Export Route as GPX" +msgstr "" + +#: ../src/viktrwlayer.c:3673 +msgid "Export Track as GPX" +msgstr "" + +#: ../src/viktrwlayer.c:3693 +msgid "Find" +msgstr "" + +#: ../src/viktrwlayer.c:3703 +msgid "Waypoint Name:" +msgstr "Nazwa punktu orientacyjnego:" + +#: ../src/viktrwlayer.c:3720 +msgid "Waypoint not found in this layer." +msgstr "Punkt orientacyjny nie znaleziony w tej warstwie." + +#: ../src/viktrwlayer.c:3989 +msgid "Can not upload invisible track." +msgstr "" + +#: ../src/viktrwlayer.c:4082 ../src/viktrwlayer.c:10512 +msgid "Track" +msgstr "" + +#: ../src/viktrwlayer.c:4107 ../src/viktrwlayer.c:10599 +msgid "Route" +msgstr "" + +#: ../src/viktrwlayer.c:4194 +msgid "Externa_l" +msgstr "" + +#: ../src/viktrwlayer.c:4216 ../src/viktrwlayer.c:8456 +#: ../src/viktrwlayer.c:8574 +msgid "_Finish Route" +msgstr "" + +#: ../src/viktrwlayer.c:4218 ../src/viktrwlayer.c:8380 +#: ../src/viktrwlayer.c:8572 +msgid "_Finish Track" +msgstr "" + +#. Now with icons +#: ../src/viktrwlayer.c:4230 +msgid "_View Layer" +msgstr "" + +#: ../src/viktrwlayer.c:4237 +msgid "V_iew" +msgstr "" + +#: ../src/viktrwlayer.c:4243 +msgid "View All _Tracks" +msgstr "" + +#: ../src/viktrwlayer.c:4248 +msgid "View All _Routes" +msgstr "" + +#: ../src/viktrwlayer.c:4253 +msgid "View All _Waypoints" +msgstr "" + +#: ../src/viktrwlayer.c:4258 +msgid "_Goto Center of Layer" +msgstr "" + +#: ../src/viktrwlayer.c:4264 ../src/viktrwlayer.c:8321 +msgid "Goto _Waypoint..." +msgstr "" + +#: ../src/viktrwlayer.c:4270 +msgid "_Export Layer" +msgstr "" + +#: ../src/viktrwlayer.c:4276 +msgid "Export as GPS_Point..." +msgstr "" + +#: ../src/viktrwlayer.c:4281 +msgid "Export as GPS_Mapper..." +msgstr "" + +#: ../src/viktrwlayer.c:4286 +msgid "Export as _GPX..." +msgstr "" + +#: ../src/viktrwlayer.c:4292 +msgid "Export as _KML..." +msgstr "" + +#: ../src/viktrwlayer.c:4299 +msgid "Export as GEO_JSON..." +msgstr "" + +#: ../src/viktrwlayer.c:4306 +msgid "Export via GPSbabel..." +msgstr "" + +#: ../src/viktrwlayer.c:4312 +#, c-format +msgid "Open with External Program_1: %s" +msgstr "" + +#: ../src/viktrwlayer.c:4319 +#, c-format +msgid "Open with External Program_2: %s" +msgstr "" + +#: ../src/viktrwlayer.c:4327 ../src/vikwindow.c:4825 +msgid "_New" +msgstr "_Nowy" + +#: ../src/viktrwlayer.c:4333 +msgid "New _Waypoint..." +msgstr "" + +#: ../src/viktrwlayer.c:4339 +msgid "New _Track" +msgstr "" + +#: ../src/viktrwlayer.c:4347 +msgid "New _Route" +msgstr "" + +#: ../src/viktrwlayer.c:4356 ../src/viktrwlayer.c:8232 +#: ../src/viktrwlayer.c:9003 +msgid "Geotag _Images..." +msgstr "" + +#: ../src/viktrwlayer.c:4363 +msgid "_Acquire" +msgstr "" + +#: ../src/viktrwlayer.c:4369 ../src/vikwindow.c:4904 +msgid "From _GPS..." +msgstr "Z _GPS..." + +#. FIXME: only add menu when at least a routing engine has support for Directions +#: ../src/viktrwlayer.c:4375 +msgid "From _Directions..." +msgstr "" + +#: ../src/viktrwlayer.c:4381 +msgid "From _OSM Traces..." +msgstr "" + +#: ../src/viktrwlayer.c:4386 +msgid "From _My OSM Traces..." +msgstr "" + +#: ../src/viktrwlayer.c:4392 ../src/vikwindow.c:4844 +msgid "From _URL..." +msgstr "" + +#: ../src/viktrwlayer.c:4399 ../src/vikwindow.c:4846 +msgid "From _Wikipedia Waypoints" +msgstr "" + +#: ../src/viktrwlayer.c:4405 +msgid "Within _Layer Bounds" +msgstr "" + +#: ../src/viktrwlayer.c:4411 +msgid "Within _Current View" +msgstr "" + +#: ../src/viktrwlayer.c:4419 +msgid "From Geo_caching..." +msgstr "" + +#: ../src/viktrwlayer.c:4426 ../src/vikwindow.c:4842 +msgid "From Geotagged _Images..." +msgstr "" + +#: ../src/viktrwlayer.c:4433 +msgid "From _File..." +msgstr "" + +#: ../src/viktrwlayer.c:4436 ../src/vikwindow.c:4905 +msgid "Import File With GPS_Babel..." +msgstr "" + +#: ../src/viktrwlayer.c:4443 ../src/viktrwlayer.c:8905 +msgid "_Upload" +msgstr "" + +#: ../src/viktrwlayer.c:4449 +msgid "Upload to _GPS..." +msgstr "" + +#: ../src/viktrwlayer.c:4456 ../src/viktrwlayer.c:8973 +msgid "Upload to _OSM..." +msgstr "" + +#: ../src/viktrwlayer.c:4464 +msgid "De_lete" +msgstr "" + +#: ../src/viktrwlayer.c:4470 +msgid "Delete All _Tracks" +msgstr "" + +#: ../src/viktrwlayer.c:4477 +msgid "Delete Tracks _From Selection..." +msgstr "" + +#: ../src/viktrwlayer.c:4484 ../src/viktrwlayer.c:8481 +msgid "Delete _All Routes" +msgstr "" + +#: ../src/viktrwlayer.c:4491 ../src/viktrwlayer.c:8487 +msgid "_Delete Routes From Selection..." +msgstr "" + +#: ../src/viktrwlayer.c:4498 +msgid "Delete All _Waypoints" +msgstr "" + +#: ../src/viktrwlayer.c:4505 +msgid "Delete Waypoints From _Selection..." +msgstr "" + +#: ../src/viktrwlayer.c:4512 ../src/viktrwlayer.c:8339 +#, fuzzy +msgid "Delete Duplicate Waypoints" +msgstr "Usuń powielone punkty orientacyjne" + +#: ../src/viktrwlayer.c:5198 +#, c-format +msgid "Are you sure you want to delete all tracks in %s?" +msgstr "" + +#: ../src/viktrwlayer.c:5211 +#, c-format +msgid "Are you sure you want to delete all routes in %s?" +msgstr "" + +#: ../src/viktrwlayer.c:5221 +#, c-format +msgid "Are you sure you want to delete all waypoints in %s?" +msgstr "" + +#: ../src/viktrwlayer.c:5238 +#, c-format +msgid "Are you sure you want to delete the waypoint \"%s\"?" +msgstr "" + +#: ../src/viktrwlayer.c:5254 +#, c-format +msgid "Are you sure you want to delete the track \"%s\"?" +msgstr "" + +#: ../src/viktrwlayer.c:5271 +#, c-format +msgid "Are you sure you want to delete the route \"%s\"?" +msgstr "" + +#: ../src/viktrwlayer.c:5527 ../src/viktrwlayer.c:6373 +msgid "" +"Converting a track to a route removes extra track data such as segments, " +"timestamps, etc...\n" +"Do you want to continue?" +msgstr "" + +#: ../src/viktrwlayer.c:5631 +msgid "No DEM layers available, thus no DEM values can be applied." +msgstr "" + +#: ../src/viktrwlayer.c:5651 ../src/viktrwlayer.c:5692 +#, c-format +msgid "%ld point adjusted" +msgid_plural "%ld points adjusted" +msgstr[0] "" +msgstr[1] "" + +#: ../src/viktrwlayer.c:5736 +#, c-format +msgid "%ld waypoint changed" +msgid_plural "%ld waypoints changed" +msgstr[0] "" +msgstr[1] "" + +#: ../src/viktrwlayer.c:5917 +#, c-format +msgid "" +"Refining a track with many points (%d) is unlikely to yield sensible " +"results. Do you want to Continue?" +msgstr "" + +#. Select engine from dialog +#: ../src/viktrwlayer.c:5925 +msgid "Refine Route with Routing Engine..." +msgstr "" + +#: ../src/viktrwlayer.c:5933 +msgid "Select routing engine" +msgstr "" + +#: ../src/viktrwlayer.c:6158 +msgid "Failed. No other tracks with timestamps in this layer found" +msgstr "" + +#: ../src/viktrwlayer.c:6160 +msgid "Failed. No other tracks without timestamps in this layer found" +msgstr "" + +#: ../src/viktrwlayer.c:6179 +msgid "Merge with..." +msgstr "Łącz z..." + +#: ../src/viktrwlayer.c:6180 +msgid "Select route to merge with" +msgstr "" + +#: ../src/viktrwlayer.c:6180 +msgid "Select track to merge with" +msgstr "Wybież sieżkę, z którą połączyć" + +#: ../src/viktrwlayer.c:6264 ../src/viktrwlayer.c:6346 +msgid "Append Route" +msgstr "" + +#: ../src/viktrwlayer.c:6264 ../src/viktrwlayer.c:6346 +msgid "Append Track" +msgstr "" + +#: ../src/viktrwlayer.c:6265 +msgid "Select the route to append after the current route" +msgstr "" + +#: ../src/viktrwlayer.c:6266 +msgid "Select the track to append after the current track" +msgstr "" + +#: ../src/viktrwlayer.c:6347 +msgid "Select the track to append after the current route" +msgstr "" + +#: ../src/viktrwlayer.c:6348 +msgid "Select the route to append after the current track" +msgstr "" + +#: ../src/viktrwlayer.c:6414 +#, c-format +msgid "%d segment merged" +msgid_plural "%d segments merged" +msgstr[0] "" +msgstr[1] "" + +#: ../src/viktrwlayer.c:6430 +msgid "Failed. This track does not have timestamp" +msgstr "Błąd. Ta ścieżka nie ma znacznika czasowego." + +#: ../src/viktrwlayer.c:6442 +msgid "Failed. No other track in this layer has timestamp" +msgstr "" + +#: ../src/viktrwlayer.c:6449 +msgid "Merge Threshold..." +msgstr "" + +#: ../src/viktrwlayer.c:6450 +msgid "Merge when time between tracks less than:" +msgstr "" + +#: ../src/viktrwlayer.c:6580 +msgid "Split Threshold..." +msgstr "" + +#: ../src/viktrwlayer.c:6581 +msgid "Split when time between trackpoints exceeds:" +msgstr "" + +#: ../src/viktrwlayer.c:6598 +#, c-format +msgid "" +"Can not split track due to trackpoints not ordered in time - such as at %s.\n" +"\n" +"Goto this trackpoint?" +msgstr "" + +#: ../src/viktrwlayer.c:6668 +msgid "Split Every Nth Point" +msgstr "" + +#: ../src/viktrwlayer.c:6669 +msgid "Split on every Nth point:" +msgstr "" + +#: ../src/viktrwlayer.c:6779 +msgid "Can not split track as it has no segments" +msgstr "" + +#: ../src/viktrwlayer.c:6861 ../src/viktrwlayer.c:6891 +#, c-format +msgid "Deleted %ld point" +msgid_plural "Deleted %ld points" +msgstr[0] "" +msgstr[1] "" + +#: ../src/viktrwlayer.c:6966 ../src/viktrwlayer.c:10989 +#: ../src/viktrwlayer_waypointlist.c:214 +#, c-format +msgid "Could not launch %s to open file." +msgstr "" + +#: ../src/viktrwlayer.c:6992 ../src/viktrwlayer.c:7113 +msgid "This track has no date information." +msgstr "" + +#: ../src/viktrwlayer.c:7006 ../src/viktrwlayer.c:7136 +msgid "This waypoint has no date information." +msgstr "" + +#: ../src/viktrwlayer.c:7030 +#, c-format +msgid "Could not launch %s" +msgstr "" + +#: ../src/viktrwlayer.c:7269 +msgid "Internal Error in vik_trw_layer_uniquify_tracks" +msgstr "" + +#: ../src/viktrwlayer.c:7374 ../src/viktrwlayer.c:7424 +#: ../src/viktrwlayer.c:7587 +msgid "" +"Multiple entries with the same name exist. This method only works with " +"unique names. Force unique names now?" +msgstr "" + +#: ../src/viktrwlayer.c:7385 +msgid "No tracks found" +msgstr "" + +#: ../src/viktrwlayer.c:7393 ../src/viktrwlayer.c:7443 +#: ../src/viktrwlayer.c:7607 +msgid "Delete Selection" +msgstr "" + +#: ../src/viktrwlayer.c:7394 +msgid "Select tracks to delete" +msgstr "" + +#: ../src/viktrwlayer.c:7435 +msgid "No routes found" +msgstr "" + +#: ../src/viktrwlayer.c:7444 +msgid "Select routes to delete" +msgstr "" + +#: ../src/viktrwlayer.c:7550 +msgid "Internal Error in vik_trw_layer_uniquify_waypoints" +msgstr "" + +#: ../src/viktrwlayer.c:7597 +msgid "No waypoints found" +msgstr "" + +#: ../src/viktrwlayer.c:7608 +msgid "Select waypoints to delete" +msgstr "" + +#: ../src/viktrwlayer.c:7691 +#, c-format +msgid "%ld waypoint deleted" +msgid_plural "%ld waypoints deleted" +msgstr[0] "" +msgstr[1] "" +msgstr[2] "" + +#: ../src/viktrwlayer.c:7697 +#, fuzzy +msgid "No duplicates found" +msgstr "Nie znaleziono wpisów!" + +#: ../src/viktrwlayer.c:8028 +#, c-format +msgid "" +"A waypoint with the name \"%s\" already exists. Really rename to the same " +"name?" +msgstr "" + +#: ../src/viktrwlayer.c:8058 +#, c-format +msgid "" +"A track with the name \"%s\" already exists. Really rename to the same name?" +msgstr "" + +#: ../src/viktrwlayer.c:8095 +#, c-format +msgid "" +"A route with the name \"%s\" already exists. Really rename to the same name?" +msgstr "" + +#: ../src/viktrwlayer.c:8215 ../src/viktrwlayer.c:8602 +msgid "_Goto" +msgstr "" + +#: ../src/viktrwlayer.c:8226 +msgid "_Visit Geocache Webpage" +msgstr "" + +#: ../src/viktrwlayer.c:8235 +msgid "Geotag multiple images against this waypoint" +msgstr "" + +#: ../src/viktrwlayer.c:8245 ../src/viktrwlayer_waypointlist.c:352 +msgid "_Show Picture..." +msgstr "" + +#: ../src/viktrwlayer.c:8253 +msgid "Update Geotag on _Image" +msgstr "" + +#: ../src/viktrwlayer.c:8259 +msgid "_Update" +msgstr "" + +#: ../src/viktrwlayer.c:8264 +msgid "Update and _Keep File Timestamp" +msgstr "" + +#: ../src/viktrwlayer.c:8276 +msgid "Visit _Webpage" +msgstr "" + +#: ../src/viktrwlayer.c:8306 +msgid "_New Waypoint..." +msgstr "" + +#: ../src/viktrwlayer.c:8315 +msgid "_View All Waypoints" +msgstr "" + +#: ../src/viktrwlayer.c:8327 +msgid "Delete _All Waypoints" +msgstr "" + +#: ../src/viktrwlayer.c:8333 +msgid "_Delete Waypoints From Selection..." +msgstr "" + +#: ../src/viktrwlayer.c:8351 +msgid "_Show All Waypoints" +msgstr "" + +#: ../src/viktrwlayer.c:8357 +msgid "_Hide All Waypoints" +msgstr "" + +#: ../src/viktrwlayer.c:8369 +msgid "_List Waypoints..." +msgstr "" + +#: ../src/viktrwlayer.c:8390 +msgid "_View All Tracks" +msgstr "" + +#: ../src/viktrwlayer.c:8396 +msgid "_New Track" +msgstr "" + +#: ../src/viktrwlayer.c:8404 +msgid "Delete _All Tracks" +msgstr "" + +#: ../src/viktrwlayer.c:8410 +msgid "_Delete Tracks From Selection..." +msgstr "" + +#: ../src/viktrwlayer.c:8422 +msgid "_Show All Tracks" +msgstr "" + +#: ../src/viktrwlayer.c:8428 +msgid "_Hide All Tracks" +msgstr "" + +#: ../src/viktrwlayer.c:8439 +msgid "_List Tracks..." +msgstr "" + +#: ../src/viktrwlayer.c:8467 +msgid "_View All Routes" +msgstr "" + +#: ../src/viktrwlayer.c:8473 +msgid "_New Route" +msgstr "" + +#: ../src/viktrwlayer.c:8499 +msgid "_Show All Routes" +msgstr "" + +#: ../src/viktrwlayer.c:8505 +msgid "_Hide All Routes" +msgstr "" + +#: ../src/viktrwlayer.c:8516 +msgid "_List Routes..." +msgstr "" + +#: ../src/viktrwlayer.c:8587 +msgid "_View Track" +msgstr "" + +#: ../src/viktrwlayer.c:8589 +msgid "_View Route" +msgstr "" + +#: ../src/viktrwlayer.c:8608 +msgid "_Startpoint" +msgstr "" + +#: ../src/viktrwlayer.c:8614 +msgid "\"_Center\"" +msgstr "" + +#: ../src/viktrwlayer.c:8620 +msgid "_Endpoint" +msgstr "" + +#: ../src/viktrwlayer.c:8626 +msgid "_Highest Altitude" +msgstr "" + +#: ../src/viktrwlayer.c:8632 +msgid "_Lowest Altitude" +msgstr "" + +#: ../src/viktrwlayer.c:8640 +msgid "_Maximum Speed" +msgstr "" + +#: ../src/viktrwlayer.c:8646 +msgid "_Date" +msgstr "" + +#: ../src/viktrwlayer.c:8655 +msgid "Co_mbine" +msgstr "" + +#: ../src/viktrwlayer.c:8663 +msgid "_Merge By Time..." +msgstr "" + +#: ../src/viktrwlayer.c:8668 +msgid "Merge _Segments" +msgstr "" + +#: ../src/viktrwlayer.c:8675 +msgid "Merge _With Other Tracks..." +msgstr "" + +#: ../src/viktrwlayer.c:8682 +msgid "_Append Track..." +msgstr "" + +#: ../src/viktrwlayer.c:8684 +msgid "_Append Route..." +msgstr "" + +#: ../src/viktrwlayer.c:8690 +msgid "Append _Route..." +msgstr "" + +#: ../src/viktrwlayer.c:8692 +msgid "Append _Track..." +msgstr "" + +#: ../src/viktrwlayer.c:8699 +msgid "_Split" +msgstr "" + +#: ../src/viktrwlayer.c:8707 +msgid "_Split By Time..." +msgstr "" + +#. ATM always enable this entry - don't want to have to analyse the track before displaying the menu - to keep the menu speedy +#: ../src/viktrwlayer.c:8713 +msgid "Split Se_gments" +msgstr "" + +#: ../src/viktrwlayer.c:8719 +msgid "Split By _Number of Points..." +msgstr "" + +#: ../src/viktrwlayer.c:8724 +msgid "Split at _Trackpoint" +msgstr "" + +#: ../src/viktrwlayer.c:8732 +msgid "_Insert Points" +msgstr "" + +#: ../src/viktrwlayer.c:8738 +msgid "Insert Point _Before Selected Point" +msgstr "" + +#: ../src/viktrwlayer.c:8745 +msgid "Insert Point _After Selected Point" +msgstr "" + +#: ../src/viktrwlayer.c:8754 +msgid "Delete Poi_nts" +msgstr "" + +#: ../src/viktrwlayer.c:8760 +msgid "Delete _Selected Point" +msgstr "" + +#: ../src/viktrwlayer.c:8768 +msgid "Delete Points With The Same _Position" +msgstr "" + +#: ../src/viktrwlayer.c:8773 +msgid "Delete Points With The Same _Time" +msgstr "" + +#: ../src/viktrwlayer.c:8780 ../src/viktrwlayer.c:9029 +msgid "_Transform" +msgstr "" + +#: ../src/viktrwlayer.c:8788 ../src/viktrwlayer.c:9037 +msgid "_Apply DEM Data" +msgstr "" + +#: ../src/viktrwlayer.c:8793 ../src/viktrwlayer.c:9042 +msgid "_Overwrite" +msgstr "" + +#: ../src/viktrwlayer.c:8796 ../src/viktrwlayer.c:9045 +msgid "Overwrite any existing elevation values with DEM values" +msgstr "" + +#: ../src/viktrwlayer.c:8799 ../src/viktrwlayer.c:9048 +msgid "_Keep Existing" +msgstr "" + +#: ../src/viktrwlayer.c:8802 ../src/viktrwlayer.c:9051 +msgid "Keep existing elevation values, only attempt for missing values" +msgstr "" + +#: ../src/viktrwlayer.c:8807 +msgid "_Smooth Missing Elevation Data" +msgstr "" + +#: ../src/viktrwlayer.c:8812 +msgid "_Interpolated" +msgstr "" + +#: ../src/viktrwlayer.c:8815 +msgid "" +"Interpolate between known elevation values to derive values for the missing " +"elevations" +msgstr "" + +#: ../src/viktrwlayer.c:8818 +msgid "_Flat" +msgstr "" + +#: ../src/viktrwlayer.c:8821 +msgid "Set unknown elevation values to the last known value" +msgstr "" + +#: ../src/viktrwlayer.c:8825 +msgid "C_onvert to a Route" +msgstr "" + +#: ../src/viktrwlayer.c:8827 +msgid "C_onvert to a Track" +msgstr "" + +#: ../src/viktrwlayer.c:8835 +msgid "_Anonymize Times" +msgstr "" + +#: ../src/viktrwlayer.c:8838 +msgid "Shift timestamps to a relative offset from 1901-01-01" +msgstr "" + +#: ../src/viktrwlayer.c:8841 +msgid "_Interpolate Times" +msgstr "" + +#: ../src/viktrwlayer.c:8844 +msgid "" +"Reset trackpoint timestamps between the first and last points such that " +"track is traveled at equal speed" +msgstr "" + +#: ../src/viktrwlayer.c:8849 +msgid "_Reverse Track" +msgstr "" + +#: ../src/viktrwlayer.c:8851 +msgid "_Reverse Route" +msgstr "" + +#: ../src/viktrwlayer.c:8858 +msgid "Refine Route..." +msgstr "" + +#: ../src/viktrwlayer.c:8868 +msgid "Down_load Maps Along Track..." +msgstr "" + +#: ../src/viktrwlayer.c:8870 +msgid "Down_load Maps Along Route..." +msgstr "" + +#: ../src/viktrwlayer.c:8878 +msgid "_Export Track as GPX..." +msgstr "" + +#: ../src/viktrwlayer.c:8880 +msgid "_Export Route as GPX..." +msgstr "" + +#: ../src/viktrwlayer.c:8887 +msgid "E_xtend Track End" +msgstr "" + +#: ../src/viktrwlayer.c:8889 +msgid "E_xtend Route End" +msgstr "" + +#: ../src/viktrwlayer.c:8896 +msgid "Extend _Using Route Finder" +msgstr "" + +#: ../src/viktrwlayer.c:8911 +msgid "_Upload to GPS..." +msgstr "" + +#: ../src/viktrwlayer.c:8926 +msgid "_Diary" +msgstr "" + +#: ../src/viktrwlayer.c:8930 +msgid "Open diary program at this date" +msgstr "" + +#: ../src/viktrwlayer.c:8935 +msgid "_Astronomy" +msgstr "" + +#: ../src/viktrwlayer.c:8938 +msgid "Open astronomy program at this date and location" +msgstr "" + +#: ../src/viktrwlayer.c:8962 +msgid "_View Google Directions" +msgstr "" + +#: ../src/viktrwlayer.c:8984 +msgid "Use with _Filter" +msgstr "" + +#: ../src/viktrwlayer.c:9018 +msgid "_Edit Trackpoint" +msgstr "" + +#: ../src/viktrwlayer.c:10116 +#, c-format +msgid " - Gain %dm:Loss %dm" +msgstr "" + +#: ../src/viktrwlayer.c:10118 +#, c-format +msgid " - Gain %dft:Loss %dft" +msgstr "" + +#: ../src/viktrwlayer.c:10123 +#, c-format +msgid " - Bearing %3.1f° - Step %s" +msgstr "" + +#: ../src/viktrwlayer.c:10232 +#, c-format +msgid "Querying %s for route between (%.3f, %.3f) and (%.3f, %.3f)." +msgstr "" + +#: ../src/viktrwlayer.c:10248 +#, c-format +msgid "%s returned route between (%.3f, %.3f) and (%.3f, %.3f)." +msgstr "" + +#: ../src/viktrwlayer.c:10251 +#, c-format +msgid "Error getting route from %s." +msgstr "" + +#: ../src/viktrwlayer.c:11070 +#, c-format +msgid "Creating %d Image Thumbnails..." +msgstr "" + +#: ../src/viktrwlayer.c:11560 +msgid "No map layer in use. Create one first" +msgstr "Brak warstw w użyciu. Utwórz najpierw jedną" + +#: ../src/viktrwlayer.c:11679 +#, c-format +msgid "%s: Track List" +msgstr "" + +#: ../src/viktrwlayer.c:11681 +#, c-format +msgid "%s: Route List" +msgstr "" + +#: ../src/viktrwlayer.c:11734 +#, c-format +msgid "" +"Could not write external layer %s to %s, please fix and save before exiting " +"or data will be lost" +msgstr "" + +#: ../src/viktrwlayer.c:11782 +#, c-format +msgid "WARNING: issues encountered loading external layer %s from %s" +msgstr "" + +#: ../src/viktrwlayer_export.c:47 +msgid "Auto Device GPX Simplify:" +msgstr "" + +#: ../src/viktrwlayer_export.c:48 +msgid "" +"GPX saves to certain devices will be simplified for device compatibility." +msgstr "" + +#: ../src/viktrwlayer_export.c:125 +#, c-format +msgid "Export of GPX file simplified using point limit: %d" +msgstr "" + +#: ../src/viktrwlayer_export.c:206 ../src/viktrwlayer_export.c:323 +#: ../src/vikwindow.c:3694 +msgid "The filename you requested could not be opened for writing." +msgstr "Nazwa pliku, którą wskazałeś, nie może być otwarta do zapisu." + +#: ../src/viktrwlayer_export.c:226 +#, c-format +msgid "Could not launch %s." +msgstr "" + +#: ../src/viktrwlayer_export.c:234 +msgid "Could not create temporary file for export." +msgstr "" + +#: ../src/viktrwlayer_export.c:268 +msgid "File format:" +msgstr "" + +#: ../src/viktrwlayer_export.c:276 +msgid "Select the file format." +msgstr "" + +#: ../src/viktrwlayer_export.c:281 +msgid "" +"Select the information to process.\n" +"Warning: the behavior of these switches is highly dependent of the file " +"format selected.\n" +"Please, refer to GPSbabel if unsure." +msgstr "" + +#: ../src/viktrwlayer_export.c:308 +msgid "You did not select a valid file format." +msgstr "" + +#: ../src/viktrwlayer_propwin.c:915 ../src/viktrwlayer_propwin.c:3381 +#: ../src/viktrwlayer_propwin.c:3417 ../src/viktrwlayer_propwin.c:3457 +#: ../src/viktrwlayer_propwin.c:3509 ../src/viktrwlayer_propwin.c:3527 +#: ../src/viktrwlayer_propwin.c:3600 ../src/viktrwlayer_propwin.c:3601 +#: ../src/viktrwlayer_propwin.c:3602 ../src/viktrwlayer_propwin.c:3611 +#: ../src/viktrwlayer_propwin.c:3612 ../src/viktrwlayer_propwin.c:3629 +#: ../src/viktrwlayer_propwin.c:3630 ../src/viktrwlayer_propwin.c:3644 +#: ../src/viktrwlayer_propwin.c:3645 ../src/viktrwlayer_propwin.c:3646 +#: ../src/viktrwlayer_propwin.c:3660 ../src/viktrwlayer_propwin.c:3661 +#: ../src/viktrwlayer_propwin.c:3662 ../src/viktrwlayer_propwin.c:3676 +#: ../src/viktrwlayer_propwin.c:3677 ../src/viktrwlayer_propwin.c:3678 +#: ../src/viktrwlayer_propwin.c:3695 ../src/viktrwlayer_propwin.c:3696 +#: ../src/viktrwlayer_analysis.c:293 +#, c-format +msgid "No Data" +msgstr "Brak danych" + +#: ../src/viktrwlayer_propwin.c:960 ../src/viktrwlayer_propwin.c:1245 +#, c-format +msgid "%.1f kph" +msgstr "" + +#: ../src/viktrwlayer_propwin.c:963 ../src/viktrwlayer_propwin.c:1248 +#: ../src/viktrwlayer_analysis.c:352 +#, c-format +msgid "%.1f mph" +msgstr "" + +#: ../src/viktrwlayer_propwin.c:966 ../src/viktrwlayer_propwin.c:1251 +#, c-format +msgid "%.1f knots" +msgstr "" + +#: ../src/viktrwlayer_propwin.c:969 ../src/viktrwlayer_propwin.c:1254 +#, c-format +msgid "%.1f s/km" +msgstr "" + +#: ../src/viktrwlayer_propwin.c:972 ../src/viktrwlayer_propwin.c:1257 +#: ../src/viktrwlayer_analysis.c:389 ../src/viktrwlayer_analysis.c:392 +#, fuzzy, c-format +msgid "%.1f min/km" +msgstr "1 min" + +#: ../src/viktrwlayer_propwin.c:975 ../src/viktrwlayer_propwin.c:1260 +#, c-format +msgid "%.1f sec/mi" +msgstr "" + +#: ../src/viktrwlayer_propwin.c:978 ../src/viktrwlayer_propwin.c:1263 +#: ../src/viktrwlayer_analysis.c:409 ../src/viktrwlayer_analysis.c:412 +#, fuzzy, c-format +msgid "%.1f min/mi" +msgstr "1 min" + +#. VIK_UNITS_SPEED_METRES_PER_SECOND: +#: ../src/viktrwlayer_propwin.c:982 ../src/viktrwlayer_propwin.c:1267 +#, c-format +msgid "%.1f m/s" +msgstr "" + +#. Minutes +#: ../src/viktrwlayer_propwin.c:1411 +msgid "mins" +msgstr "" + +#. Hours +#: ../src/viktrwlayer_propwin.c:1418 +msgid "h" +msgstr "" + +#. Days +#: ../src/viktrwlayer_propwin.c:1424 +msgid "d" +msgstr "" + +#. Weeks +#: ../src/viktrwlayer_propwin.c:1429 +msgid "w" +msgstr "" + +#. 'Months' +#: ../src/viktrwlayer_propwin.c:1433 +msgid "M" +msgstr "" + +#: ../src/viktrwlayer_propwin.c:2051 ../src/viktrwlayer_analysis.c:303 +#, c-format +msgid "%.1f miles" +msgstr "" + +#: ../src/viktrwlayer_propwin.c:2054 ../src/viktrwlayer_analysis.c:306 +#, c-format +msgid "%.1f NM" +msgstr "" + +#. VIK_UNITS_DISTANCE_KILOMETRES +#: ../src/viktrwlayer_propwin.c:2057 ../src/viktrwlayer_analysis.c:310 +#, c-format +msgid "%.1f km" +msgstr "" + +#: ../src/viktrwlayer_propwin.c:3083 +msgid "Failed spliting track. Track unchanged" +msgstr "Błąd podziału ścieżki. Ścieżka nie zmieniona" + +#: ../src/viktrwlayer_propwin.c:3234 ../src/viktrwlayer_propwin.c:3744 +#, c-format +msgid "%s - Track Properties" +msgstr "%s - Właściwości ścieżki" + +#: ../src/viktrwlayer_propwin.c:3239 +msgid "Split at _Marker" +msgstr "" + +#: ../src/viktrwlayer_propwin.c:3240 +msgid "Split _Segments" +msgstr "" + +#: ../src/viktrwlayer_propwin.c:3241 +msgid "_Reverse" +msgstr "" + +#: ../src/viktrwlayer_propwin.c:3242 +msgid "_Delete Dupl." +msgstr "" + +#: ../src/viktrwlayer_propwin.c:3269 +msgid "Comment:" +msgstr "Komentarz:" + +#: ../src/viktrwlayer_propwin.c:3270 +msgid "Description:" +msgstr "" + +#: ../src/viktrwlayer_propwin.c:3271 +#, fuzzy +msgid "Source:" +msgstr "Start:" + +#: ../src/viktrwlayer_propwin.c:3272 +#, fuzzy +msgid "Type:" +msgstr "Czas:" + +#: ../src/viktrwlayer_propwin.c:3273 +msgid "Color:" +msgstr "" + +#: ../src/viktrwlayer_propwin.c:3274 +msgid "Draw Name:" +msgstr "" + +#: ../src/viktrwlayer_propwin.c:3275 +msgid "Distance Labels:" +msgstr "" + +#: ../src/viktrwlayer_propwin.c:3278 +msgid "Track Length:" +msgstr "Długość ścieżki:" + +#: ../src/viktrwlayer_propwin.c:3279 +msgid "Trackpoints:" +msgstr "" + +#: ../src/viktrwlayer_propwin.c:3280 +msgid "Segments:" +msgstr "Segmenty:" + +#: ../src/viktrwlayer_propwin.c:3281 +msgid "Duplicate Points:" +msgstr "" + +#: ../src/viktrwlayer_propwin.c:3282 +msgid "Max Speed:" +msgstr "Maksymalna prędkość:" + +#: ../src/viktrwlayer_propwin.c:3283 +msgid "Avg. Speed:" +msgstr "Średnia prędkość:" + +#: ../src/viktrwlayer_propwin.c:3284 +msgid "Moving Avg. Speed:" +msgstr "" + +#: ../src/viktrwlayer_propwin.c:3285 +msgid "Avg. Dist. Between TPs:" +msgstr "" + +#: ../src/viktrwlayer_propwin.c:3286 +msgid "Elevation Range:" +msgstr "" + +#: ../src/viktrwlayer_propwin.c:3287 +msgid "Total Elevation Gain/Loss:" +msgstr "" + +#: ../src/viktrwlayer_propwin.c:3288 +msgid "Start:" +msgstr "Start:" + +#: ../src/viktrwlayer_propwin.c:3289 +msgid "End:" +msgstr "Koniec:" + +#: ../src/viktrwlayer_propwin.c:3290 +msgid "Duration:" +msgstr "Czas trwania:" + +#: ../src/viktrwlayer_propwin.c:3320 +msgid "Centre" +msgstr "" + +#: ../src/viktrwlayer_propwin.c:3321 +msgid "Start only" +msgstr "" + +#: ../src/viktrwlayer_propwin.c:3322 +msgid "End only" +msgstr "" + +#: ../src/viktrwlayer_propwin.c:3323 +msgid "Start and End" +msgstr "" + +#: ../src/viktrwlayer_propwin.c:3324 +msgid "Centre, Start and End" +msgstr "" + +#: ../src/viktrwlayer_propwin.c:3336 +msgid "Maximum number of distance labels to be shown" +msgstr "" + +#: ../src/viktrwlayer_propwin.c:3340 +msgid "Properties" +msgstr "" + +#: ../src/viktrwlayer_propwin.c:3584 +#, c-format +msgid "%d minutes - %d minutes moving" +msgstr "" + +#: ../src/viktrwlayer_propwin.c:3596 +#, c-format +msgid "%s total - %s in segments" +msgstr "" + +#: ../src/viktrwlayer_propwin.c:3607 ../src/viktrwlayer_analysis.c:622 +msgid "Statistics" +msgstr "Statystyki" + +#: ../src/viktrwlayer_propwin.c:3613 ../src/viktrwlayer_propwin.c:3680 +msgid "Show D_EM" +msgstr "" + +#: ../src/viktrwlayer_propwin.c:3615 ../src/viktrwlayer_propwin.c:3631 +#: ../src/viktrwlayer_propwin.c:3647 ../src/viktrwlayer_propwin.c:3697 +msgid "Show _GPS Speed" +msgstr "" + +#: ../src/viktrwlayer_propwin.c:3617 ../src/viktrwlayer_propwin.c:3633 +#: ../src/viktrwlayer_propwin.c:3665 ../src/viktrwlayer_propwin.c:3699 +msgid "Track Distance:" +msgstr "Długość ścieżki:" + +#: ../src/viktrwlayer_propwin.c:3618 ../src/viktrwlayer_propwin.c:3684 +msgid "Track Height:" +msgstr "" + +#: ../src/viktrwlayer_propwin.c:3624 +msgid "Elevation-distance" +msgstr "Wysokość-odległość" + +#: ../src/viktrwlayer_propwin.c:3634 +msgid "Track Gradient:" +msgstr "" + +#: ../src/viktrwlayer_propwin.c:3639 +msgid "Gradient-distance" +msgstr "" + +#: ../src/viktrwlayer_propwin.c:3649 ../src/viktrwlayer_propwin.c:3666 +#: ../src/viktrwlayer_propwin.c:3683 +msgid "Track Time:" +msgstr "Czas ścieżki:" + +#: ../src/viktrwlayer_propwin.c:3650 ../src/viktrwlayer_propwin.c:3700 +msgid "Track Speed:" +msgstr "" + +#: ../src/viktrwlayer_propwin.c:3651 ../src/viktrwlayer_propwin.c:3667 +#: ../src/viktrwlayer_propwin.c:3685 +msgid "Time/Date:" +msgstr "" + +#: ../src/viktrwlayer_propwin.c:3655 +msgid "Speed-time" +msgstr "Prędkość-czas" + +#: ../src/viktrwlayer_propwin.c:3663 ../src/viktrwlayer_propwin.c:3679 +msgid "Show S_peed" +msgstr "" + +#: ../src/viktrwlayer_propwin.c:3671 +msgid "Distance-time" +msgstr "" + +#: ../src/viktrwlayer_propwin.c:3690 +msgid "Elevation-time" +msgstr "" + +#: ../src/viktrwlayer_propwin.c:3705 +msgid "Speed-distance" +msgstr "" + +#: ../src/viktrwlayer_tpwin.c:190 ../src/viktrwlayer_wpwin.c:66 +msgid "Date/Time Edit" +msgstr "" + +#: ../src/viktrwlayer_tpwin.c:242 +msgid "Name:" +msgstr "" + +#: ../src/viktrwlayer_tpwin.c:243 +msgid "Latitude:" +msgstr "Szerokość geograficzna:" + +#: ../src/viktrwlayer_tpwin.c:244 +msgid "Longitude:" +msgstr "Długość geograficzna:" + +#: ../src/viktrwlayer_tpwin.c:245 +msgid "Altitude:" +msgstr "Wysokość:" + +#: ../src/viktrwlayer_tpwin.c:246 +msgid "Course:" +msgstr "" + +#: ../src/viktrwlayer_tpwin.c:247 +msgid "Timestamp:" +msgstr "TZnacznik czasowy:" + +#: ../src/viktrwlayer_tpwin.c:248 +msgid "Time:" +msgstr "Czas:" + +#: ../src/viktrwlayer_tpwin.c:249 +msgid "Distance Difference:" +msgstr "Różnica odległości:" + +#: ../src/viktrwlayer_tpwin.c:250 +msgid "Time Difference:" +msgstr "Różnica czasu:" + +#: ../src/viktrwlayer_tpwin.c:251 +msgid "\"Speed\" Between:" +msgstr "\"Prędkość\" pomiędzy:" + +#: ../src/viktrwlayer_tpwin.c:252 +msgid "Speed:" +msgstr "" + +#: ../src/viktrwlayer_tpwin.c:253 +msgid "VDOP:" +msgstr "VDOP:" + +#: ../src/viktrwlayer_tpwin.c:254 +msgid "HDOP:" +msgstr "HDOP:" + +#: ../src/viktrwlayer_tpwin.c:255 +msgid "PDOP:" +msgstr "PDOP:" + +#: ../src/viktrwlayer_tpwin.c:256 +msgid "SAT/FIX:" +msgstr "SAT/FIX:" + +#: ../src/viktrwlayer_tpwin.c:263 ../src/viktrwlayer_tpwin.c:408 +#: ../src/viktrwlayer_tpwin.c:622 +msgid "Trackpoint" +msgstr "" + +#: ../src/viktrwlayer_tpwin.c:266 +msgid "_Insert After" +msgstr "" + +#: ../src/viktrwlayer_tpwin.c:268 +msgid "Split Here" +msgstr "Podziel tutaj" + +#: ../src/viktrwlayer_tracklist.c:262 ../src/viktrwlayer_waypointlist.c:306 +msgid "_Copy Data" +msgstr "" + +#. +#. item = gtk_image_menu_item_new_with_mnemonic ( _("_Select") ); +#. gtk_image_menu_item_set_image ( (GtkImageMenuItem*)item, gtk_image_new_from_stock (GTK_STOCK_FIND, GTK_ICON_SIZE_MENU) ); +#. g_signal_connect_swapped ( G_OBJECT(item), "activate", G_CALLBACK(trw_layer_track_select), values ); +#. gtk_menu_shell_append (GTK_MENU_SHELL (menu), item); +#. gtk_widget_show ( item ); +#. +#. ATM view auto selects, so don't bother with separate select menu entry +#. +#. item = gtk_image_menu_item_new_with_mnemonic ( _("_Select") ); +#. gtk_image_menu_item_set_image ( (GtkImageMenuItem*)item, gtk_image_new_from_stock (GTK_STOCK_FIND, GTK_ICON_SIZE_MENU) ); +#. g_signal_connect_swapped ( G_OBJECT(item), "activate", G_CALLBACK(trw_layer_waypoint_select), values ); +#. gtk_menu_shell_append (GTK_MENU_SHELL (menu), item); +#. gtk_widget_show ( item ); +#. +#. AUTO SELECT NOT TRUE YET... +#. ATM view auto selects, so don't bother with separate select menu entry +#: ../src/viktrwlayer_tracklist.c:290 ../src/viktrwlayer_waypointlist.c:341 +#: ../src/vikwindow.c:4816 +msgid "_View" +msgstr "_Podgląd" + +#. Insert column for the layer name when viewing multi layers +#: ../src/viktrwlayer_tracklist.c:613 ../src/viktrwlayer_waypointlist.c:609 +msgid "Layer" +msgstr "" + +#: ../src/viktrwlayer_tracklist.c:627 ../src/viktrwlayer_waypointlist.c:624 +msgid "Date" +msgstr "" + +#: ../src/viktrwlayer_tracklist.c:631 ../src/viktrwlayer_waypointlist.c:628 +msgid "Visible" +msgstr "" + +#: ../src/viktrwlayer_tracklist.c:639 +msgid "" +"Distance\n" +"(miles)" +msgstr "" + +#: ../src/viktrwlayer_tracklist.c:642 +msgid "" +"Distance\n" +"(NM)" +msgstr "" + +#: ../src/viktrwlayer_tracklist.c:645 +msgid "" +"Distance\n" +"(km)" +msgstr "" + +#: ../src/viktrwlayer_tracklist.c:651 +msgid "" +"Length\n" +"(minutes)" +msgstr "" + +#: ../src/viktrwlayer_tracklist.c:660 ../src/vikutils.c:93 +msgid "sec/mi" +msgstr "" + +#: ../src/viktrwlayer_tracklist.c:666 +#, c-format +msgid "" +"Av. Speed\n" +"(%s)" +msgstr "" + +#. Apply own formatting of the data +#: ../src/viktrwlayer_tracklist.c:671 +#, c-format +msgid "" +"Max Speed\n" +"(%s)" +msgstr "" + +#: ../src/viktrwlayer_tracklist.c:679 ../src/viktrwlayer_waypointlist.c:637 +msgid "" +"Max Height\n" +"(Feet)" +msgstr "" + +#: ../src/viktrwlayer_tracklist.c:681 ../src/viktrwlayer_waypointlist.c:639 +msgid "" +"Max Height\n" +"(Metres)" +msgstr "" + +#: ../src/viktrwlayer_waypointlist.c:312 +msgid "Copy Data (with _positions)" +msgstr "" + +#: ../src/viktrwlayer_waypointlist.c:633 +msgid "Comment" +msgstr "" + +#: ../src/viktrwlayer_waypointlist.c:643 +msgid "Symbol" +msgstr "" + +#: ../src/viktrwlayer_wpwin.c:93 ../src/viktrwlayer_wpwin.c:302 +msgid "True" +msgstr "" + +#: ../src/viktrwlayer_wpwin.c:122 +msgid "Waypoint Properties" +msgstr "Właściwości punktu orientacyjnego" + +#: ../src/viktrwlayer_wpwin.c:164 +msgid "Name:" +msgstr "Nazwa:" + +#: ../src/viktrwlayer_wpwin.c:181 +msgid "Altitude:" +msgstr "Wysokość:" + +#: ../src/viktrwlayer_wpwin.c:186 ../src/viktrwlayer_wpwin.c:188 +msgid "Comment:" +msgstr "Komentarz:" + +#: ../src/viktrwlayer_wpwin.c:202 +msgid "Source:" +msgstr "" + +#: ../src/viktrwlayer_wpwin.c:212 +msgid "Image:" +msgstr "Obraz:" + +#: ../src/viktrwlayer_wpwin.c:217 +msgid "Symbol:" +msgstr "Symbol:" + +#: ../src/viktrwlayer_wpwin.c:226 +msgid "(none)" +msgstr "(brak)" + +#. Geotag Info [readonly] +#: ../src/viktrwlayer_wpwin.c:272 +msgid "Has Geotag" +msgstr "" + +#: ../src/viktrwlayer_wpwin.c:279 +msgid "Consistent Position" +msgstr "" + +#. ATM the direction value box is always shown, even when there is no information. +#. It would be nice to be able to hide it until the 'Add' has been performed, +#. however I've not been able to achieve this. +#. Thus simply sensistizing it instead. +#: ../src/viktrwlayer_wpwin.c:292 +#, fuzzy +msgid "Image Direction:" +msgstr "Ustawienia obrazu" + +#: ../src/viktrwlayer_wpwin.c:300 +msgid "Magnetic" +msgstr "" + +#: ../src/viktrwlayer_wpwin.c:320 +msgid "Time:" +msgstr "" + +#. TODO: other checks (isalpha or whatever ) +#: ../src/viktrwlayer_wpwin.c:386 +msgid "Please enter a name for the waypoint." +msgstr "Proszę wprowadzić nazwę punktu orientacyjnego." + +#: ../src/viktrwlayer_geotag.c:320 ../src/viktrwlayer_geotag.c:460 +#, c-format +msgid "Failed updating EXIF on %s" +msgstr "" + +#: ../src/viktrwlayer_geotag.c:562 +#, c-format +msgid "Geotagging %d Images..." +msgstr "" + +#: ../src/viktrwlayer_geotag.c:630 +msgid "Geotag Images" +msgstr "" + +#: ../src/viktrwlayer_geotag.c:640 +msgid "Images" +msgstr "" + +#: ../src/viktrwlayer_geotag.c:645 +msgid "Overwrite Existing Waypoints:" +msgstr "" + +#: ../src/viktrwlayer_geotag.c:648 +msgid "Overwrite Existing GPS Information:" +msgstr "" + +#: ../src/viktrwlayer_geotag.c:650 +msgid "Keep File Modification Timestamp:" +msgstr "" + +#: ../src/viktrwlayer_geotag.c:684 +msgid "Create Waypoints:" +msgstr "" + +#: ../src/viktrwlayer_geotag.c:693 +msgid "Write EXIF:" +msgstr "" + +#: ../src/viktrwlayer_geotag.c:705 +msgid "Automatic Image Direction:" +msgstr "" + +#: ../src/viktrwlayer_geotag.c:707 +msgid "Set image direction based on a heading derived from the track" +msgstr "" + +#: ../src/viktrwlayer_geotag.c:710 +msgid "Interpolate Between Track Segments:" +msgstr "" + +#: ../src/viktrwlayer_geotag.c:715 +msgid "Image Time Offset (Seconds):" +msgstr "" + +#: ../src/viktrwlayer_geotag.c:718 +msgid "" +"The number of seconds to ADD to the photos time to make it match the GPS " +"data. Calculate this with (GPS - Photo). Can be negative or positive. Useful " +"to adjust times when a camera's timestamp was incorrect." +msgstr "" + +#: ../src/viktrwlayer_geotag.c:721 +msgid "Image Timezone:" +msgstr "" + +#: ../src/viktrwlayer_geotag.c:724 +msgid "" +"The timezone that was used when the images were created. For example, if a " +"camera is set to AWST or +8:00 hours. Enter +8:00 here so that the correct " +"adjustment to the images' time can be made. GPS data is always in UTC." +msgstr "" + +#: ../src/viktrwlayer_geotag.c:728 +#, c-format +msgid "Using waypoint: %s" +msgstr "" + +#: ../src/viktrwlayer_geotag.c:742 +#, c-format +msgid "Using track: %s" +msgstr "" + +#: ../src/viktrwlayer_geotag.c:744 +#, c-format +msgid "Using all tracks in: %s" +msgstr "" + +#: ../src/viktrwlayer_analysis.c:214 +msgid "Number of Tracks" +msgstr "" + +#: ../src/viktrwlayer_analysis.c:215 +msgid "Date Range" +msgstr "" + +#: ../src/viktrwlayer_analysis.c:216 +msgid "Total Length" +msgstr "" + +#: ../src/viktrwlayer_analysis.c:217 +msgid "Average Length" +msgstr "" + +#: ../src/viktrwlayer_analysis.c:218 +msgid "Eddington number" +msgstr "" + +#. No.4: Extended display only +#: ../src/viktrwlayer_analysis.c:219 +msgid "Max Speed" +msgstr "" + +#: ../src/viktrwlayer_analysis.c:220 +msgid "Avg. Speed" +msgstr "" + +#: ../src/viktrwlayer_analysis.c:221 +msgid "Minimum Altitude" +msgstr "" + +#: ../src/viktrwlayer_analysis.c:222 +msgid "Maximum Altitude" +msgstr "" + +#: ../src/viktrwlayer_analysis.c:223 +msgid "Total Elevation Gain/Loss" +msgstr "" + +#: ../src/viktrwlayer_analysis.c:224 +msgid "Avg. Elevation Gain/Loss" +msgstr "" + +#: ../src/viktrwlayer_analysis.c:225 +msgid "Total Duration" +msgstr "" + +#: ../src/viktrwlayer_analysis.c:226 +msgid "Avg. Duration" +msgstr "" + +#: ../src/viktrwlayer_analysis.c:317 +#, c-format +msgid "%.2f miles" +msgstr "" + +#: ../src/viktrwlayer_analysis.c:320 +#, c-format +msgid "%.2f NM" +msgstr "" + +#. VIK_UNITS_DISTANCE_KILOMETRES +#: ../src/viktrwlayer_analysis.c:324 +#, c-format +msgid "%.2f km" +msgstr "" + +#: ../src/viktrwlayer_analysis.c:361 +#, c-format +msgid "%.2f m/s" +msgstr "" + +#: ../src/viktrwlayer_analysis.c:370 ../src/viktrwlayer_analysis.c:373 +#, c-format +msgid "%.2f knots" +msgstr "" + +#: ../src/viktrwlayer_analysis.c:379 ../src/viktrwlayer_analysis.c:382 +#, c-format +msgid "%d s/km" +msgstr "" + +#: ../src/viktrwlayer_analysis.c:399 ../src/viktrwlayer_analysis.c:402 +#, c-format +msgid "%d sec/mi" +msgstr "" + +#: ../src/viktrwlayer_analysis.c:420 ../src/viktrwlayer_analysis.c:423 +#, c-format +msgid "%.2f km/h" +msgstr "" + +#: ../src/viktrwlayer_analysis.c:434 ../src/viktrwlayer_analysis.c:440 +#, c-format +msgid "%d feet" +msgstr "" + +#: ../src/viktrwlayer_analysis.c:445 ../src/viktrwlayer_analysis.c:447 +#, c-format +msgid "%d feet / %d feet" +msgstr "" + +#: ../src/viktrwlayer_analysis.c:452 ../src/viktrwlayer_analysis.c:458 +#, c-format +msgid "%d m" +msgstr "" + +#: ../src/viktrwlayer_analysis.c:463 ../src/viktrwlayer_analysis.c:465 +#, c-format +msgid "%d m / %d m" +msgstr "" + +#: ../src/viktrwlayer_analysis.c:477 +#, c-format +msgid "%d:%02d:%02d days:hrs:mins" +msgstr "" + +#: ../src/viktrwlayer_analysis.c:484 +#, c-format +msgid "%d:%02d hrs:mins" +msgstr "" + +#: ../src/viktrwlayer_analysis.c:658 +msgid "Include Invisible Items" +msgstr "" + +#: ../src/vikstatus.c:129 +msgid "Current number of background tasks. Click to see the background jobs." +msgstr "" + +#: ../src/vikstatus.c:134 +msgid "Current zoom level. Click to select a new one." +msgstr "" + +#: ../src/vikstatus.c:141 +msgid "Left click to clear the message. Right click to copy the message." +msgstr "" + +#: ../src/vikutils.c:108 +msgid "GPSD" +msgstr "" + +#. GPS Preamble +#: ../src/vikutils.c:109 +msgid "Trkpt" +msgstr "" + +#: ../src/vikutils.c:160 +#, c-format +msgid "%sSpeed%s %.1f%s" +msgstr "" + +#. Go for 2dp as expect low values for vertical speeds +#: ../src/vikutils.c:214 +#, c-format +msgid "%sClimb%s %.2f%s" +msgstr "" + +#: ../src/vikutils.c:223 +#, c-format +msgid "%sAlt %dfeet" +msgstr "" + +#. VIK_UNITS_HEIGHT_METRES: +#: ../src/vikutils.c:227 +#, c-format +msgid "%sAlt %dm" +msgstr "" + +#: ../src/vikutils.c:235 +#, c-format +msgid "%sCourse %03d°" +msgstr "" + +#: ../src/vikutils.c:249 +msgid "yards" +msgstr "" + +#. VIK_UNITS_DISTANCE_KILOMETRES: +#: ../src/vikutils.c:253 +msgid "m" +msgstr "" + +#: ../src/vikutils.c:257 +#, c-format +msgid "%sDistance diff %d%s" +msgstr "" + +#: ../src/vikutils.c:272 +#, c-format +msgid "%sTime %s" +msgstr "" + +#: ../src/vikutils.c:281 +#, c-format +msgid "%sTime diff %lds" +msgstr "" + +#: ../src/vikutils.c:287 +#, c-format +msgid "%sNo. of Sats %d" +msgstr "" + +#: ../src/vikutils.c:312 +#, c-format +msgid "%sTo End %.2f%s" +msgstr "" + +#: ../src/vikutils.c:339 +#, c-format +msgid "%sDistance along %.2f%s" +msgstr "" + +#: ../src/vikutils.c:359 +#, c-format +msgid "%sTrack: %s" +msgstr "" + +#: ../src/vikutils.c:396 +#, c-format +msgid "" +"There is a newer version of Viking available: %s\n" +"\n" +"Do you wish to go to Viking's website now?" +msgstr "" + +#: ../src/vikutils.c:526 +msgid "" +"This appears to be Viking's very first run.\n" +"\n" +"Do you wish to enable automatic internet features?\n" +"\n" +"Individual settings can be controlled in the Preferences." +msgstr "" + +#: ../src/vikwaypoint.c:37 +msgid "Waypoint" +msgstr "" + +#: ../src/vikwebtool_datasource.c:352 +msgid "Search Term" +msgstr "" + +#. TODO get rid of this as this is unnecessary duplication... +#: ../src/vikwindow.c:258 +msgid "Pan" +msgstr "" + +#: ../src/vikwindow.c:258 +msgid "Zoom" +msgstr "Zbliżenie" + +#: ../src/vikwindow.c:258 +msgid "Ruler" +msgstr "Linijka" + +#: ../src/vikwindow.c:258 +msgid "Select" +msgstr "" + +#: ../src/vikwindow.c:368 +msgid "This is Viking " +msgstr "" + +#: ../src/vikwindow.c:457 +msgid "Location lookup aborted" +msgstr "" + +#: ../src/vikwindow.c:477 +#, c-format +msgid "Location found: %s" +msgstr "" + +#: ../src/vikwindow.c:486 +msgid "Unable to determine location" +msgstr "" + +#: ../src/vikwindow.c:495 +msgid "Determining location" +msgstr "" + +#: ../src/vikwindow.c:525 +#, c-format +msgid "Location found via geoclue" +msgstr "" + +#: ../src/vikwindow.c:546 +msgid "Default Map" +msgstr "" + +#: ../src/vikwindow.c:557 ../src/vikwindow.c:3938 +msgid "Trying to determine location..." +msgstr "" + +#. Create tooltip +#: ../src/vikwindow.c:723 +msgid "Select zoom level" +msgstr "" + +#: ../src/vikwindow.c:1176 +#, c-format +msgid "" +"Do you want to save the changes you made to the document \"%s\"?\n" +"\n" +"Your changes will be lost if you don't save them." +msgstr "" +"Czy chcesz zapisać zmiany do dokumentu \"%s\"?\n" +"\n" +"Jeśi nie zapiszesz zmian, zostaną utracone." + +#: ../src/vikwindow.c:1180 +msgid "Don't Save" +msgstr "Nie zapisuj" + +#: ../src/vikwindow.c:1268 +msgid "mpp" +msgstr "" + +#: ../src/vikwindow.c:1268 +msgid "pixelfact" +msgstr "" + +#: ../src/vikwindow.c:1467 +#, c-format +msgid "%s %s %dm" +msgstr "%s %s %dm" + +#: ../src/vikwindow.c:1469 +#, c-format +msgid "%s %s %dft" +msgstr "" + +#: ../src/vikwindow.c:1472 +#, c-format +msgid "%s %s" +msgstr "%s %s" + +#: ../src/vikwindow.c:1929 +msgid "_Ruler" +msgstr "_Linijka" + +#: ../src/vikwindow.c:1929 +msgid "Ruler Tool" +msgstr "Narzędzie linijki" + +#: ../src/vikwindow.c:2204 ../src/vikwindow.c:4818 +msgid "_Zoom" +msgstr "_Zbliżenie" + +#: ../src/vikwindow.c:2204 +msgid "Zoom Tool" +msgstr "Narzędzie zbliżania" + +#: ../src/vikwindow.c:2271 ../src/vikwindow.c:4819 +msgid "_Pan" +msgstr "" + +#: ../src/vikwindow.c:2271 +msgid "Pan Tool" +msgstr "" + +#: ../src/vikwindow.c:2425 +msgid "_Select" +msgstr "" + +#: ../src/vikwindow.c:2425 +msgid "Select Tool" +msgstr "" + +#: ../src/vikwindow.c:2615 +msgid "You must select a layer to show its properties." +msgstr "Musisz zaznaczyć warstwę, aby pokazać jej właściwości." + +#. No error to show, so unlikely this will get called +#: ../src/vikwindow.c:2629 +msgid "The help system is not available." +msgstr "" + +#. Main error path +#: ../src/vikwindow.c:2632 +#, c-format +msgid "" +"Help is not available because: %s.\n" +"Ensure a Mime Type ghelp handler program is installed (e.g. yelp)." +msgstr "" + +#: ../src/vikwindow.c:2865 +msgid "You must select a layer to delete." +msgstr "Musisz zaznaczyć warstwę do skasowania." + +#: ../src/vikwindow.c:3171 +msgid "Untitled" +msgstr "Bez nazwy" + +#: ../src/vikwindow.c:3300 +#, c-format +msgid "Unable to add '%s' to the list of recently used documents" +msgstr "" + +#: ../src/vikwindow.c:3391 +msgid "The file you requested could not be opened." +msgstr "Nie można otworzyć żądanego pliku." + +#: ../src/vikwindow.c:3394 +msgid "" +"GPSBabel is required to load files of this type or GPSBabel encountered " +"problems." +msgstr "" + +#: ../src/vikwindow.c:3397 +#, c-format +msgid "Unable to load malformed GPX file %s" +msgstr "" + +#: ../src/vikwindow.c:3400 +#, c-format +msgid "Unsupported file type for %s" +msgstr "" + +#. Since we can process .vik files with issues just show a warning in the status bar +#. Not that a user can do much about it... or tells them what this issue is yet... +#: ../src/vikwindow.c:3406 +#, c-format +msgid "WARNING: issues encountered loading %s" +msgstr "" + +#: ../src/vikwindow.c:3489 +msgid "Please select a GPS data file to open. " +msgstr "Proszę wybrać plik danych GPS do otwarcia. " + +#: ../src/vikwindow.c:3508 +msgid "Google Earth" +msgstr "" + +#: ../src/vikwindow.c:3523 ../src/vikwindow.c:3646 ../src/viking.desktop.in.h:1 +msgid "Viking" +msgstr "Viking" + +#: ../src/vikwindow.c:3594 ../src/vikwindow.c:4632 +msgid "Open File" +msgstr "" + +#: ../src/vikwindow.c:3630 +msgid "Save as Viking File." +msgstr "Zapisz jako plik Viking." + +#: ../src/vikwindow.c:3757 +#, c-format +msgid "Exporting to file: %s" +msgstr "" + +#. Confirm what happened. +#: ../src/vikwindow.c:3774 +#, c-format +msgid "Exported files: %d" +msgstr "" + +#: ../src/vikwindow.c:3786 +msgid "Nothing to Export!" +msgstr "" + +#: ../src/vikwindow.c:3790 +msgid "Export to directory" +msgstr "" + +#: ../src/vikwindow.c:3809 +msgid "Could not convert all files" +msgstr "" + +#: ../src/vikwindow.c:3851 +msgid "File not accessible" +msgstr "" + +#: ../src/vikwindow.c:3854 +msgid "No Viking File" +msgstr "" + +#: ../src/vikwindow.c:3998 +msgid "This layer has no configurable properties." +msgstr "" + +#: ../src/vikwindow.c:4080 +msgid "Are you sure you wish to delete all layers?" +msgstr "Czy na pewno skasować wszystkie warstwy?" + +#. Try harder... +#: ../src/vikwindow.c:4126 ../src/vikwindow.c:4132 +msgid "Generating image file..." +msgstr "" + +#: ../src/vikwindow.c:4154 +msgid "" +"Failed to generate internal image.\n" +"\n" +"Try creating a smaller image." +msgstr "" + +#: ../src/vikwindow.c:4175 +msgid "Image file generated." +msgstr "" + +#: ../src/vikwindow.c:4177 +msgid "Failed to generate image file." +msgstr "" + +#: ../src/vikwindow.c:4246 +#, c-format +msgid "Unable to write to file %s: %s" +msgstr "" + +#: ../src/vikwindow.c:4284 +msgid "" +"Viewable region outside allowable pixel size bounds for image. Clipping " +"width/height values." +msgstr "" + +#: ../src/vikwindow.c:4309 +#, c-format +msgid "Total area: %ldm x %ldm (%.3f sq. km)" +msgstr "Obszar całkowity: %ldm x %ldm (%.3f km kw.)" + +#: ../src/vikwindow.c:4312 +#, c-format +msgid "Total area: %ldm x %ldm (%.3f sq. miles)" +msgstr "" + +#: ../src/vikwindow.c:4315 +#, c-format +msgid "Total area: %ldm x %ldm (%.3f sq. NM)" +msgstr "" + +#. Single file +#: ../src/vikwindow.c:4343 +msgid "Save Image" +msgstr "Zapisz obraz" + +#: ../src/vikwindow.c:4364 ../src/vikwindow.c:4641 +msgid "KMZ" +msgstr "" + +#: ../src/vikwindow.c:4417 +msgid "You must be in UTM mode to use this feature" +msgstr "" + +#: ../src/vikwindow.c:4421 +msgid "Choose a directory to hold images" +msgstr "Wskaż katalog dla przechowywania obrazów" + +#. todo: default for answers inside VikWindow or static (thruout instance) +#: ../src/vikwindow.c:4441 +msgid "Save to Image File" +msgstr "" + +#: ../src/vikwindow.c:4457 +msgid "Width (pixels):" +msgstr "Szerokość (piksele):" + +#: ../src/vikwindow.c:4459 +msgid "Height (pixels):" +msgstr "Wysokość (piksele):" + +#: ../src/vikwindow.c:4462 +msgid "" +"WARNING: USING LARGE IMAGES OVER 10000x10000\n" +"MAY CRASH THE PROGRAM!" +msgstr "" + +#: ../src/vikwindow.c:4464 +msgid "Zoom (meters per pixel):" +msgstr "" + +#: ../src/vikwindow.c:4480 +msgid "Area in current viewable window" +msgstr "" + +#: ../src/vikwindow.c:4490 +msgid "Save as PNG" +msgstr "Zapisz jako PNG" + +#: ../src/vikwindow.c:4491 +msgid "Save as JPEG" +msgstr "Zapisz jako JPEG" + +#: ../src/vikwindow.c:4520 +msgid "East-west image tiles:" +msgstr "" + +#: ../src/vikwindow.c:4522 +msgid "North-south image tiles:" +msgstr "" + +#: ../src/vikwindow.c:4619 +msgid "This feature is not available in UTM mode" +msgstr "" + +#: ../src/vikwindow.c:4658 +#, c-format +msgid "Unable to import %s." +msgstr "" + +#: ../src/vikwindow.c:4749 +msgid "Choose a background color" +msgstr "Wskaż kolor tła" + +#: ../src/vikwindow.c:4765 +msgid "Choose a track highlight color" +msgstr "" + +#: ../src/vikwindow.c:4814 +msgid "_File" +msgstr "_Plik" + +#: ../src/vikwindow.c:4815 +msgid "_Edit" +msgstr "_Edycja" + +#: ../src/vikwindow.c:4817 +msgid "_Show" +msgstr "" + +#: ../src/vikwindow.c:4820 +msgid "_Layers" +msgstr "_Warstwy" + +#: ../src/vikwindow.c:4821 +msgid "_Tools" +msgstr "_Narzędzia" + +#: ../src/vikwindow.c:4822 +msgid "_Webtools" +msgstr "" + +#: ../src/vikwindow.c:4823 ../src/vikwindow.c:4893 +msgid "_Help" +msgstr "_Pomoc" + +#: ../src/vikwindow.c:4825 +msgid "New file" +msgstr "Nowy plik" + +#: ../src/vikwindow.c:4826 +msgid "_Open..." +msgstr "_Otwórz..." + +#: ../src/vikwindow.c:4826 +msgid "Open a file" +msgstr "Otwórz plik" + +#: ../src/vikwindow.c:4827 +msgid "Open _Recent File" +msgstr "Otwórz ostatnio _używany plik" + +#: ../src/vikwindow.c:4828 +msgid "Append _File..." +msgstr "Dołącz _plik..." + +#: ../src/vikwindow.c:4828 +msgid "Append data from a different file" +msgstr "Dołącz dane z innego pliku" + +#: ../src/vikwindow.c:4829 +msgid "Open GPX as External _Layer..." +msgstr "" + +#: ../src/vikwindow.c:4829 +msgid "Open a GPX file as an external layer" +msgstr "" + +#: ../src/vikwindow.c:4830 +msgid "_Export All" +msgstr "" + +#: ../src/vikwindow.c:4830 +msgid "Export All TrackWaypoint Layers" +msgstr "" + +#: ../src/vikwindow.c:4831 +msgid "_GPX..." +msgstr "" + +#: ../src/vikwindow.c:4831 +msgid "Export as GPX" +msgstr "" + +#: ../src/vikwindow.c:4832 +msgid "A_cquire" +msgstr "" + +#: ../src/vikwindow.c:4833 +msgid "_Directions..." +msgstr "" + +#: ../src/vikwindow.c:4833 +msgid "Get driving directions" +msgstr "" + +#: ../src/vikwindow.c:4835 +msgid "_OSM Traces..." +msgstr "" + +#: ../src/vikwindow.c:4835 +msgid "Get traces from OpenStreetMap" +msgstr "" + +#: ../src/vikwindow.c:4836 +msgid "_My OSM Traces..." +msgstr "" + +#: ../src/vikwindow.c:4836 +msgid "Get Your Own Traces from OpenStreetMap" +msgstr "" + +#: ../src/vikwindow.c:4839 +msgid "Geo_caches..." +msgstr "" + +#: ../src/vikwindow.c:4839 +msgid "Get Geocaches from geocaching.com" +msgstr "" + +#: ../src/vikwindow.c:4842 +msgid "Create waypoints from geotagged images" +msgstr "" + +#: ../src/vikwindow.c:4844 +msgid "Get a file from a URL" +msgstr "" + +#: ../src/vikwindow.c:4846 +msgid "Create waypoints from Wikipedia items in the current view" +msgstr "" + +#: ../src/vikwindow.c:4848 +msgid "_Save" +msgstr "_Zapisz" + +#: ../src/vikwindow.c:4848 +msgid "Save the file" +msgstr "Zapisz plik" + +#: ../src/vikwindow.c:4849 +msgid "Save _As..." +msgstr "Zapisz _jako..." + +#: ../src/vikwindow.c:4849 +msgid "Save the file under different name" +msgstr "Zapisz plik pod inną nazwą" + +#: ../src/vikwindow.c:4850 +msgid "Properties..." +msgstr "" + +#: ../src/vikwindow.c:4850 +msgid "File Properties" +msgstr "" + +#: ../src/vikwindow.c:4852 +msgid "Import KMZ _Map File..." +msgstr "" + +#: ../src/vikwindow.c:4852 +msgid "Import a KMZ file" +msgstr "" + +#: ../src/vikwindow.c:4853 +msgid "Generate _KMZ Map File..." +msgstr "" + +#: ../src/vikwindow.c:4853 +msgid "Generate a KMZ file with an overlay of the current view" +msgstr "" + +#: ../src/vikwindow.c:4855 +msgid "_Generate Image File..." +msgstr "" + +#: ../src/vikwindow.c:4855 +msgid "Save a snapshot of the workspace into a file" +msgstr "" + +#: ../src/vikwindow.c:4856 +msgid "Generate _Directory of Images..." +msgstr "Generuj _katalog ze zdjęciami..." + +#: ../src/vikwindow.c:4856 +msgid "Generate _Directory of Images" +msgstr "" + +#: ../src/vikwindow.c:4857 +msgid "_Print..." +msgstr "_Drukuj..." + +#: ../src/vikwindow.c:4857 +msgid "Print maps" +msgstr "Drukuj mapy" + +#: ../src/vikwindow.c:4858 +msgid "E_xit" +msgstr "_Wyjdź" + +#: ../src/vikwindow.c:4858 +msgid "Exit the program" +msgstr "Wyjdź z programu" + +#: ../src/vikwindow.c:4859 +msgid "Save and Exit" +msgstr "Zapisz i wyjdź" + +#: ../src/vikwindow.c:4859 +msgid "Save and Exit the program" +msgstr "Zapisz i wyjdź z programu" + +#: ../src/vikwindow.c:4861 +msgid "Go to the Pre_vious Location" +msgstr "" + +#: ../src/vikwindow.c:4861 +msgid "Go to the previous location" +msgstr "" + +#: ../src/vikwindow.c:4862 +msgid "Go to the _Next Location" +msgstr "" + +#: ../src/vikwindow.c:4862 +msgid "Go to the next location" +msgstr "" + +#: ../src/vikwindow.c:4863 +msgid "Go to the _Default Location" +msgstr "" + +#: ../src/vikwindow.c:4863 +msgid "Go to the default location" +msgstr "Idź do domyślnego położenia" + +#: ../src/vikwindow.c:4864 +#, fuzzy +msgid "Go to the _Auto Location" +msgstr "Idź do domyślnego położenia" + +#: ../src/vikwindow.c:4864 +msgid "Go to a location via automatic lookup" +msgstr "" + +#: ../src/vikwindow.c:4865 +msgid "Go to _Location..." +msgstr "" + +#: ../src/vikwindow.c:4865 +msgid "Go to address/place using text search" +msgstr "Idź do adresu/miejsca używając wyszukiwarki" + +#: ../src/vikwindow.c:4866 +msgid "_Go to Lat/Lon..." +msgstr "_Idź do szer/dług..." + +#: ../src/vikwindow.c:4866 +msgid "Go to arbitrary lat/lon coordinate" +msgstr "" + +#: ../src/vikwindow.c:4867 +msgid "Go to UTM..." +msgstr "Idź do UTM..." + +#: ../src/vikwindow.c:4867 +msgid "Go to arbitrary UTM coordinate" +msgstr "" + +#: ../src/vikwindow.c:4868 +#, fuzzy +msgid "Go to Today" +msgstr "Idź do UTM..." + +#: ../src/vikwindow.c:4868 +msgid "Go to today on the calendar" +msgstr "" + +#: ../src/vikwindow.c:4869 +msgid "_Refresh" +msgstr "" + +#: ../src/vikwindow.c:4869 +msgid "Refresh any maps displayed" +msgstr "" + +#: ../src/vikwindow.c:4870 +msgid "Set _Highlight Color..." +msgstr "" + +#: ../src/vikwindow.c:4870 +msgid "Set Highlight Color" +msgstr "" + +#: ../src/vikwindow.c:4871 +msgid "Set Bac_kground Color..." +msgstr "" + +#: ../src/vikwindow.c:4871 +msgid "Set Background Color" +msgstr "" + +#: ../src/vikwindow.c:4872 +msgid "Zoom _In" +msgstr "Zbl_iż" + +#: ../src/vikwindow.c:4872 +msgid "Zoom In" +msgstr "" + +#: ../src/vikwindow.c:4873 +msgid "Zoom _Out" +msgstr "_Oddal" + +#: ../src/vikwindow.c:4873 +msgid "Zoom Out" +msgstr "" + +#: ../src/vikwindow.c:4874 +msgid "Zoom _To..." +msgstr "" + +#: ../src/vikwindow.c:4874 +msgid "Zoom To" +msgstr "" + +#: ../src/vikwindow.c:4875 +msgid "Pan _North" +msgstr "" + +#: ../src/vikwindow.c:4876 +msgid "Pan _East" +msgstr "" + +#: ../src/vikwindow.c:4877 +msgid "Pan _South" +msgstr "" + +#: ../src/vikwindow.c:4878 +msgid "Pan _West" +msgstr "" + +#: ../src/vikwindow.c:4879 +msgid "Background _Jobs" +msgstr "" + +#: ../src/vikwindow.c:4879 +msgid "Background Jobs" +msgstr "" + +#: ../src/vikwindow.c:4881 +msgid "Cu_t" +msgstr "W_ytnij" + +#: ../src/vikwindow.c:4885 +msgid "Delete All" +msgstr "Skasuj wszystko" + +#: ../src/vikwindow.c:4886 +msgid "Copy Centre _Location" +msgstr "" + +#: ../src/vikwindow.c:4887 +msgid "_Flush Map Cache" +msgstr "" + +#: ../src/vikwindow.c:4888 +msgid "_Set the Default Location" +msgstr "" + +#: ../src/vikwindow.c:4888 +msgid "Set the Default Location to the current position" +msgstr "" + +#: ../src/vikwindow.c:4889 +msgid "_Preferences" +msgstr "_Preferencje" + +#: ../src/vikwindow.c:4889 +msgid "Program Preferences" +msgstr "" + +#: ../src/vikwindow.c:4890 +msgid "_Layer Defaults" +msgstr "" + +#: ../src/vikwindow.c:4891 +msgid "_Properties" +msgstr "_Właściwości" + +#: ../src/vikwindow.c:4893 +msgid "Help" +msgstr "" + +#: ../src/vikwindow.c:4894 +msgid "_About" +msgstr "_O programie" + +#: ../src/vikwindow.c:4894 +msgid "About" +msgstr "" + +#: ../src/vikwindow.c:4903 +msgid "_KML..." +msgstr "" + +#: ../src/vikwindow.c:4903 +msgid "Export as KML" +msgstr "" + +#: ../src/vikwindow.c:4904 +msgid "Transfer data from a GPS device" +msgstr "Transferuj dane z urządzenia GPS" + +#: ../src/vikwindow.c:4905 +msgid "Import file via GPSBabel converter" +msgstr "" + +#: ../src/vikwindow.c:4909 +msgid "Import Geo_JSON File..." +msgstr "" + +#: ../src/vikwindow.c:4909 +msgid "Import GeoJSON file" +msgstr "" + +#: ../src/vikwindow.c:4914 +msgid "_UTM Mode" +msgstr "Tryb _UTM" + +#: ../src/vikwindow.c:4915 +msgid "_Expedia Mode" +msgstr "" + +#: ../src/vikwindow.c:4916 +msgid "_Mercator Mode" +msgstr "" + +#: ../src/vikwindow.c:4917 +msgid "Lat_/Lon Mode" +msgstr "" + +#: ../src/vikwindow.c:4921 +msgid "Show _Scale" +msgstr "" + +#: ../src/vikwindow.c:4921 +msgid "Show Scale" +msgstr "Pokaż skalę" + +#: ../src/vikwindow.c:4922 +msgid "Show _Center Mark" +msgstr "" + +#: ../src/vikwindow.c:4922 +msgid "Show Center Mark" +msgstr "" + +#: ../src/vikwindow.c:4923 +msgid "Show _Highlight" +msgstr "" + +#: ../src/vikwindow.c:4923 +msgid "Show Highlight" +msgstr "" + +#: ../src/vikwindow.c:4924 +msgid "_Full Screen" +msgstr "_Pełny ekran" + +#: ../src/vikwindow.c:4924 +msgid "Activate full screen mode" +msgstr "Aktywuj tryb pełnego ekranu" + +#: ../src/vikwindow.c:4925 +msgid "Show Side _Panel" +msgstr "" + +#: ../src/vikwindow.c:4925 +msgid "Show Side Panel" +msgstr "Pokaż panel boczny" + +#: ../src/vikwindow.c:4926 +msgid "Show Status_bar" +msgstr "" + +#: ../src/vikwindow.c:4926 +msgid "Show Statusbar" +msgstr "" + +#: ../src/vikwindow.c:4927 +msgid "Show _Toolbar" +msgstr "" + +#: ../src/vikwindow.c:4927 +msgid "Show Toolbar" +msgstr "" + +#: ../src/vikwindow.c:4928 +msgid "Show _Menu" +msgstr "" + +#: ../src/vikwindow.c:4928 +msgid "Show Menu" +msgstr "" + +#: ../src/vikwindow.c:4929 +#, fuzzy +msgid "Show Side Panel B_uttons" +msgstr "Pokaż panel boczny" + +#: ../src/vikwindow.c:4929 +#, fuzzy +msgid "Show Side Panel Buttons" +msgstr "Pokaż panel boczny" + +#: ../src/vikwindow.c:4930 +#, fuzzy +msgid "Show Side Panel Ca_lendar" +msgstr "Pokaż panel boczny" + +#: ../src/vikwindow.c:4930 +#, fuzzy +msgid "Show Side Panel Calendar" +msgstr "Pokaż panel boczny" + +#: ../src/vikwindow.c:5064 +#, c-format +msgid "New _%s Layer" +msgstr "" + +#: ../src/vikwindow.c:5114 +#, fuzzy +msgid "..." +msgstr "Dodaj..." + +#: ../src/viking.desktop.in.h:2 +msgid "GPS Data Manager" +msgstr "Menedżer danych GPS" + +#: ../src/viking.desktop.in.h:3 +msgid "Map Based GPS Data Manager (live data capable)." +msgstr "" + +#: ../src/libjpeg/jpeg-data.c:205 +msgid "Data does not follow JPEG specification." +msgstr "" + +#: ../src/libjpeg/jpeg-data.c:302 +#, c-format +msgid "Path '%s' invalid." +msgstr "" + +#: ../src/libjpeg/jpeg-data.c:320 +#, c-format +msgid "Could not read '%s'." +msgstr "" + +#~ msgid "Email:" +#~ msgstr "Email:" + +#~ msgid "Create Track" +#~ msgstr "Utwórz ścieżkę" diff --git a/po/pt_BR.po b/po/pt_BR.po new file mode 100644 index 0000000..02c9ac3 --- /dev/null +++ b/po/pt_BR.po @@ -0,0 +1,6154 @@ +# Brazilian Portuguese translation for viking +# Copyright (c) 2007 Rosetta Contributors and Canonical Ltd 2007 +# This file is distributed under the same license as the viking package. +# FIRST AUTHOR , 2007. +# +msgid "" +msgstr "" +"Project-Id-Version: viking\n" +"Report-Msgid-Bugs-To: \n" +"POT-Creation-Date: 2019-01-19 12:53+0000\n" +"PO-Revision-Date: 2011-06-09 02:24+0000\n" +"Last-Translator: Sam Samuels \n" +"Language-Team: Brazilian Portuguese \n" +"Language: pt_BR\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-Launchpad-Export-Date: 2018-12-21 17:32+0000\n" +"X-Generator: Launchpad (build 18847)\n" + +#: ../src/acquire.c:106 ../src/vikgpslayer.c:1367 +msgid "Done." +msgstr "Concluído." + +#: ../src/acquire.c:115 +msgid "No data." +msgstr "Sem dados." + +#: ../src/acquire.c:167 ../src/acquire.c:415 +msgid "Error: acquisition failed." +msgstr "Erro: aquisição falhou." + +#: ../src/acquire.c:339 +msgid "Working..." +msgstr "Trabalhando..." + +#. This shouldn't happen... +#: ../src/acquire.c:406 +msgid "" +"Unable to create command\n" +"Acquire method failed." +msgstr "" + +#: ../src/acquire.c:513 +msgid "_Filter" +msgstr "" + +#: ../src/acquire.c:528 +#, c-format +msgid "Filter with %s" +msgstr "" + +#: ../src/acquire.c:545 +msgid "Filter" +msgstr "" + +#: ../src/babel.c:640 +msgid "GPSBabel:" +msgstr "" + +#: ../src/babel.c:641 +msgid "" +"Allow setting the specific instance of GPSBabel. You must restart Viking for " +"this value to take effect." +msgstr "" + +#: ../src/babel_ui.c:79 +msgid "Select a file format" +msgstr "" + +#: ../src/babel_ui.c:144 ../src/viktrwlayer.c:531 ../src/viktrwlayer.c:2882 +msgid "Tracks" +msgstr "Faixas" + +#: ../src/babel_ui.c:149 ../src/viktrwlayer.c:2892 +msgid "Routes" +msgstr "" + +#. ***** PARAMETERS ***** +#: ../src/babel_ui.c:154 ../src/viktrwlayer.c:531 ../src/viktrwlayer.c:2887 +msgid "Waypoints" +msgstr "Waypoints" + +#: ../src/background.c:64 +#, c-format +msgid "%d items" +msgstr "%d itens" + +#: ../src/background.c:287 +msgid "Threads:" +msgstr "" + +#: ../src/background.c:288 +msgid "" +"Number of threads to use for Mapnik tasks. You need to restart Viking for a " +"change to this value to be used" +msgstr "" + +#: ../src/background.c:361 +msgid "Job" +msgstr "Trabalho" + +#: ../src/background.c:365 +msgid "Progress" +msgstr "Progresso" + +#: ../src/background.c:373 +msgid "Viking Background Jobs" +msgstr "Trabalhos em Segundo Plano do Viking" + +#: ../src/bing.c:42 +msgid "Bing Aerial" +msgstr "" + +#: ../src/bing.c:48 +msgid "Bing" +msgstr "" + +#. VIK_GTK_WINDOW_FROM_WIDGET(vp) +#: ../src/bingmapsource.c:514 +msgid "Bing attribution Loading" +msgstr "" + +#: ../src/clipboard.c:95 +msgid "paste failed" +msgstr "colar falhou" + +#: ../src/clipboard.c:105 +msgid "wrong clipboard data size" +msgstr "tamanho da área de transferência incorreto" + +#: ../src/clipboard.c:124 +#, c-format +msgid "" +"The clipboard contains sublayer data for %s layers. You must select a layer " +"of this type to paste the clipboard data." +msgstr "" +"A área de transferência contém dados para as camadas subcamada %s. Você deve " +"selecionar uma camada desse tipo para colar os dados do clipboard." + +#: ../src/clipboard.c:264 +msgid "" +"In order to paste a waypoint, please select an appropriate layer to paste " +"into." +msgstr "" +"Por favor selecione uma camada apropriada para colar o Caminho (Waypoint)." + +#: ../src/dialog.c:60 +msgid "Go to Lat/Lon" +msgstr "Ir para Lat/Long" + +#: ../src/dialog.c:69 ../src/viktrwlayer_wpwin.c:173 +msgid "Latitude:" +msgstr "Latitude:" + +#: ../src/dialog.c:72 ../src/viktrwlayer_wpwin.c:177 +msgid "Longitude:" +msgstr "Longitude:" + +#: ../src/dialog.c:102 +msgid "Go to UTM" +msgstr "Ir para UTM" + +#: ../src/dialog.c:114 +msgid "Northing:" +msgstr "Para o Norte:" + +#: ../src/dialog.c:117 +msgid "Easting:" +msgstr "Para o Oeste:" + +#: ../src/dialog.c:121 ../src/vikgeoreflayer.c:902 +msgid "Zone:" +msgstr "Zona:" + +#: ../src/dialog.c:124 ../src/vikgeoreflayer.c:904 +msgid "Letter:" +msgstr "Carta:" + +#: ../src/dialog.c:246 ../src/geonamessearch.c:238 +#: ../src/datasource_osm_my_traces.c:505 +msgid "Nothing was selected" +msgstr "Nada foi selecionado" + +#: ../src/dialog.c:254 +msgid "Add Route" +msgstr "" + +#: ../src/dialog.c:254 +msgid "Add Track" +msgstr "Adicionar Trilha" + +#: ../src/dialog.c:262 +msgid "Route Name:" +msgstr "" + +#: ../src/dialog.c:262 +msgid "Track Name:" +msgstr "Nome da Trilha:" + +#: ../src/dialog.c:282 +msgid "Please enter a name for the track." +msgstr "Por favor insira um nome para a trilha." + +#: ../src/dialog.c:311 +msgid "Today" +msgstr "" + +#: ../src/dialog.c:393 +msgid "Zoom Factors..." +msgstr "Fatores de Zoom ..." + +#: ../src/dialog.c:407 +msgid "Zoom factor (in meters per pixel):" +msgstr "Fator de zoom (em metros por pixel):" + +#: ../src/dialog.c:408 +msgid "X (easting): " +msgstr "X (Para o Oeste): " + +#: ../src/dialog.c:409 +msgid "Y (northing): " +msgstr "Y (para o norte): " + +#: ../src/dialog.c:414 +msgid "X and Y zoom factors must be equal" +msgstr "Fatore X e Y zoom devem ser iguais" + +#: ../src/dialog.c:469 +msgid "1 min" +msgstr "1 min" + +#: ../src/dialog.c:470 +msgid "1 hour" +msgstr "1 hora" + +#: ../src/dialog.c:471 +msgid "1 day" +msgstr "1 dia" + +#: ../src/dialog.c:472 +msgid "Custom (in minutes):" +msgstr "Personalizar (em minutos):" + +#: ../src/dialog.c:608 +#, c-format +msgid "" +"2003-2008, Evan Battaglia\n" +"2008-%s, Viking's contributors" +msgstr "" + +#: ../src/dialog.c:609 +msgid "GPS Data and Topo Analyzer, Explorer, and Manager." +msgstr "Dados de GPS e Analisador de Topo, Explorador, e Gerenciador." + +#: ../src/dialog.c:610 +msgid "" +"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.\n" +"\n" +"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.\n" +"\n" +"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., 59 Temple " +"Place, Suite 330, Boston, MA 02111-1307, USA" +msgstr "" +"Este programa é um software livre, você pode redistribuí-lo e / ou modificá-" +"lo sob os termos da GNU General Public License como publicado pela Free " +"Software Foundation, tanto a versão 2 da Licença, ou (a seu critério) " +"qualquer versão posterior.\n" +"\n" +"Este programa é distribuído na esperança de que seja útil, mas SEM QUALQUER " +"GARANTIA, sem mesmo a garantia implícita de COMERCIALIZAÇÃO ou ADEQUAÇÃO " +"PARA UM DETERMINADO PROPÓSITO. Veja a GNU General Public License para mais " +"detalhes.\n" +"\n" +"Você deve ter recebido uma cópia da Licença Pública Geral GNU junto com este " +"programa, se não, escreva para a Free Software Foundation, Inc., 59 Temple " +"Place, Suite 330, Boston, MA 02111-1307, EUA" + +#: ../src/dialog.c:703 +msgid "Translation is coordinated on http://launchpad.net/viking" +msgstr "A tradução é coordenada na http://launchpad.net/viking" + +#: ../src/dialog.c:713 +msgid "Download along track" +msgstr "Download da via" + +#: ../src/dialog.c:720 +msgid "Map type:" +msgstr "Tipo de mapa:" + +#: ../src/dialog.c:726 +msgid "Zoom level:" +msgstr "Nível de zoom:" + +#: ../src/dialog.c:766 +#, c-format +msgid "The map data is licensed: %s." +msgstr "Os dados do mapa são licenciados: %s" + +#: ../src/dialog.c:769 +#, c-format +msgid "" +"The data provided by '%s' are licensed under the following license: " +"%s." +msgstr "" + +#: ../src/dialog.c:773 +msgid "Open license" +msgstr "Licença aberta" + +#: ../src/expedia.c:54 +msgid "Expedia Street Maps" +msgstr "Rua Expedia Mapas" + +#: ../src/expedia.c:82 +msgid "Invalid expedia altitude" +msgstr "Altitude expedia inválida" + +#: ../src/expedia.c:113 +#, c-format +msgid "" +"Couldn't open EXPEDIA image file (right after successful download! Please " +"report and delete image file!): %s" +msgstr "" +"Não foi possível abrir o arquivo de imagem EXPEDIA (logo após download " +"concluído com sucesso! Por favor, informe e apague o arquivo da imagem!): %s" + +#: ../src/expedia.c:126 +#, c-format +msgid "" +"Couldn't save EXPEDIA image file (right after successful download! Please " +"report and delete image file!): %s" +msgstr "" +"Não foi possível salvar o arquivo de imagem EXPEDIA (logo após download " +"concluído com sucesso! Por favor, informe e apague o arquivo da imagem!): %s" + +#: ../src/geonamessearch.c:115 +msgid "Search" +msgstr "Pesquisar" + +#: ../src/geonamessearch.c:117 +msgid "No entries found!" +msgstr "Entradas não encontradas!" + +#. NB could allow columns to be shifted around by doing this after each new +#. gtk_tree_view_column_set_reorderable ( column, TRUE ); +#. However I don't think is that useful, so I haven't put it in +#: ../src/geonamessearch.c:171 ../src/datasource_osm_my_traces.c:422 +#: ../src/viktrwlayer_tracklist.c:621 ../src/viktrwlayer_waypointlist.c:618 +msgid "Name" +msgstr "" + +#: ../src/geonamessearch.c:176 +msgid "Feature" +msgstr "" + +#: ../src/geonamessearch.c:181 ../src/datasource_osm_my_traces.c:437 +msgid "Lat/Lon" +msgstr "" + +#: ../src/geonamessearch.c:264 ../src/googlesearch.c:101 ../src/vikgoto.c:430 +msgid "couldn't map temp file" +msgstr "não foi possível mapear arquivo temporário" + +#: ../src/geonamessearch.c:459 +msgid "Select articles" +msgstr "" + +#: ../src/geonamessearch.c:459 +msgid "Select the articles you want to add." +msgstr "" + +#: ../src/geonamessearch.c:475 +msgid "city" +msgstr "" + +#: ../src/geonamessearch.c:477 +msgid "edu" +msgstr "" + +#: ../src/geonamessearch.c:479 +msgid "airport" +msgstr "" + +#: ../src/geonamessearch.c:481 +msgid "mountain" +msgstr "" + +#: ../src/geonamessearch.c:483 +msgid "forest" +msgstr "" + +#: ../src/geonamessearch.c:485 +msgid "church" +msgstr "" + +#: ../src/geojson.c:74 +#, c-format +msgid "%s command failed: %s" +msgstr "" + +#: ../src/geojson.c:146 ../src/gpx.c:1317 +#, c-format +msgid "failed to open temporary file: %s" +msgstr "Falha ao abrir o arquivo temporário: %s" + +#: ../src/globals.c:67 +msgid "DDD" +msgstr "" + +#: ../src/globals.c:67 +msgid "DMM" +msgstr "" + +#: ../src/globals.c:67 +msgid "DMS" +msgstr "" + +#: ../src/globals.c:67 +msgid "Raw" +msgstr "" + +#: ../src/globals.c:68 +msgid "Kilometres" +msgstr "" + +#: ../src/globals.c:68 +msgid "Miles" +msgstr "" + +#: ../src/globals.c:68 +msgid "Nautical Miles" +msgstr "" + +#. VIK_UNITS_SPEED_KILOMETRES_PER_HOUR: +#: ../src/globals.c:69 ../src/viktrwlayer_tracklist.c:655 ../src/vikutils.c:100 +msgid "km/h" +msgstr "" + +#: ../src/globals.c:69 ../src/viktrwlayer_tracklist.c:656 ../src/vikutils.c:78 +msgid "mph" +msgstr "" + +#. VIK_UNITS_SPEED_METRES_PER_SECOND: +#: ../src/globals.c:69 ../src/viktrwlayer_tracklist.c:663 ../src/vikutils.c:81 +msgid "m/s" +msgstr "" + +#: ../src/globals.c:69 ../src/viktrwlayer_tracklist.c:657 ../src/vikutils.c:84 +msgid "knots" +msgstr "" + +#: ../src/globals.c:69 ../src/viktrwlayer_tracklist.c:658 ../src/vikutils.c:87 +msgid "s/km" +msgstr "" + +#: ../src/globals.c:69 ../src/viktrwlayer_tracklist.c:659 ../src/vikutils.c:90 +msgid "min/km" +msgstr "" + +#: ../src/globals.c:69 +msgid "s/mi" +msgstr "" + +#: ../src/globals.c:69 ../src/viktrwlayer_tracklist.c:661 ../src/vikutils.c:96 +msgid "min/mi" +msgstr "" + +#: ../src/globals.c:70 +msgid "Metres" +msgstr "" + +#: ../src/globals.c:70 +msgid "Feet" +msgstr "" + +#: ../src/globals.c:73 +msgid "Locale" +msgstr "" + +#: ../src/globals.c:73 +msgid "World" +msgstr "" + +#: ../src/globals.c:73 +msgid "UTC" +msgstr "" + +#: ../src/globals.c:76 +msgid "Degree format:" +msgstr "Formato de grau" + +#: ../src/globals.c:77 +msgid "Distance units:" +msgstr "Unidade de distância:" + +#: ../src/globals.c:78 +msgid "Speed units:" +msgstr "Unidade de velocidade:" + +#: ../src/globals.c:79 +msgid "Height units:" +msgstr "Unidade de altura:" + +#: ../src/globals.c:80 +msgid "Use large waypoint icons:" +msgstr "Usar ícones grandes do waypoint:" + +#: ../src/globals.c:81 +msgid "Default latitude:" +msgstr "Latitude padrão" + +#: ../src/globals.c:82 +msgid "Default longitude:" +msgstr "Longitude padrão" + +#: ../src/globals.c:83 +msgid "Time Display:" +msgstr "" + +#: ../src/globals.c:84 +msgid "" +"Display times according to the reference frame. Locale is the user's system " +"setting. World is relative to the location of the object." +msgstr "" + +#: ../src/globals.c:90 +msgid "Alphabetical" +msgstr "" + +#: ../src/globals.c:90 ../src/datasource_osm_my_traces.c:432 +msgid "Time" +msgstr "" + +#: ../src/globals.c:90 +msgid "Creation" +msgstr "" + +#: ../src/globals.c:91 +msgid "Title Case" +msgstr "" + +#: ../src/globals.c:91 +msgid "Lowercase" +msgstr "" + +#: ../src/globals.c:94 +msgid "KML File Export Units:" +msgstr "" + +#: ../src/globals.c:95 +msgid "GPX Track Order:" +msgstr "" + +#: ../src/globals.c:96 +msgid "GPX Waypoint Symbols:" +msgstr "" + +#: ../src/globals.c:97 +msgid "" +"Save GPX Waypoint Symbol names in the specified case. May be useful for " +"compatibility with various devices" +msgstr "" + +#: ../src/globals.c:98 +msgid "GPX Creator:" +msgstr "" + +#: ../src/globals.c:99 +msgid "" +"The creator value when writing a GPX file. Otherwise when blank a default is " +"used." +msgstr "" + +#: ../src/globals.c:104 +msgid "Image Viewer:" +msgstr "" + +#: ../src/globals.c:109 +msgid "External GPX Program 1:" +msgstr "" + +#: ../src/globals.c:110 +msgid "External GPX Program 2:" +msgstr "" + +#: ../src/globals.c:113 +msgid "Absolute" +msgstr "" + +#: ../src/globals.c:113 +msgid "Relative" +msgstr "" + +#: ../src/globals.c:117 +msgid "Save File Reference Mode:" +msgstr "" + +#: ../src/globals.c:118 +msgid "" +"When saving a Viking .vik file, this determines how the directory paths of " +"filenames are written." +msgstr "" + +#: ../src/globals.c:119 +msgid "Ask for Name before Track Creation:" +msgstr "" + +#: ../src/globals.c:120 +msgid "Show Tooltip during Track Creation:" +msgstr "" + +#: ../src/globals.c:121 +msgid "The number of recent files:" +msgstr "" + +#: ../src/globals.c:122 +msgid "" +"Only applies to new windows or on application restart. -1 means all " +"available files." +msgstr "" + +#: ../src/globals.c:123 +#, fuzzy +msgid "Open files in selected layer:" +msgstr "Remover camada selecionada" + +#: ../src/globals.c:124 +msgid "Open files (but not .vik ones) into the selected TrackWaypoint layer." +msgstr "" + +#: ../src/globals.c:125 +msgid "Show calendar day names:" +msgstr "" + +#: ../src/globals.c:128 +msgid "Home Location" +msgstr "" + +#: ../src/globals.c:128 +msgid "Last Location" +msgstr "" + +#: ../src/globals.c:128 +msgid "Specified File" +msgstr "" + +#: ../src/globals.c:128 +msgid "Auto Location" +msgstr "" + +#: ../src/globals.c:131 +msgid "Restore Window Setup:" +msgstr "" + +#: ../src/globals.c:132 +msgid "Restore window size and layout" +msgstr "" + +#: ../src/globals.c:133 +msgid "Add a Default Map Layer:" +msgstr "" + +#: ../src/globals.c:134 +msgid "" +"The default map layer added is defined by the Layer Defaults. Use the menu " +"Edit->Layer Defaults->Map... to change the map type and other values." +msgstr "" + +#: ../src/globals.c:135 +msgid "Startup Method:" +msgstr "" + +#: ../src/globals.c:136 +msgid "Startup File:" +msgstr "" + +#: ../src/globals.c:137 +msgid "" +"The default file to load on startup. Only applies when the startup method is " +"set to 'Specified File'" +msgstr "" + +#: ../src/globals.c:138 +msgid "Check For New Version:" +msgstr "" + +#: ../src/globals.c:139 +msgid "Periodically check to see if a new version of Viking is available" +msgstr "" + +#. Defaults for the options are setup here +#: ../src/globals.c:176 +msgid "General" +msgstr "" + +#. New Tab +#: ../src/globals.c:204 +msgid "Startup" +msgstr "" + +#. New Tab +#: ../src/globals.c:222 +msgid "Export/External" +msgstr "" + +#. 'Advanced' Properties +#: ../src/globals.c:249 +msgid "Advanced" +msgstr "" + +#. Webtools +#: ../src/google.c:39 +msgid "Google" +msgstr "Google" + +#. If there is an actual description field it will overwrite this value +#: ../src/gpx.c:264 +#, c-format +msgid "Created by: %s" +msgstr "" + +#: ../src/datasource_bfilter.c:43 +msgid "Max number of points:" +msgstr "Número máximo de pontos" + +#: ../src/datasource_bfilter.c:84 +msgid "Simplify All Tracks..." +msgstr "" + +#: ../src/datasource_bfilter.c:85 +msgid "Simplified Tracks" +msgstr "Simplificar Lançamentos" + +#. { VIK_LAYER_NUM_TYPES, "compressmethod", VIK_LAYER_PARAM_UINT, VIK_LAYER_GROUP_NONE, N_("Simplify Method:"), VIK_LAYER_WIDGET_COMBOBOX, compress_method, NULL, NULL, NULL, NULL, NULL }, +#: ../src/datasource_bfilter.c:111 +msgid "Error Factor:" +msgstr "" + +#: ../src/datasource_bfilter.c:112 +msgid "" +"Specifies the maximum allowable error that may be introduced by removing a " +"single point by the crosstrack method. See the manual or GPSBabel Simplify " +"Filter documentation for more detail." +msgstr "" + +#: ../src/datasource_bfilter.c:166 +msgid "Compress Tracks..." +msgstr "" + +#: ../src/datasource_bfilter.c:167 +msgid "Compressed Tracks" +msgstr "" + +#: ../src/datasource_bfilter.c:197 ../src/datasource_bfilter.c:198 +msgid "Remove Duplicate Waypoints" +msgstr "Remover Waypoints duplicados" + +#: ../src/datasource_bfilter.c:221 +msgid "Manual filter:" +msgstr "" + +#: ../src/datasource_bfilter.c:222 +msgid "Manual filter command: e.g. 'swap'." +msgstr "" + +#: ../src/datasource_bfilter.c:233 ../src/datasource_bfilter.c:234 +msgid "Manual filter" +msgstr "" + +#: ../src/datasource_bfilter.c:262 +msgid "Waypoints Inside This" +msgstr "Waypoints Dentro Este" + +#: ../src/datasource_bfilter.c:263 ../src/datasource_bfilter.c:292 +msgid "Polygonized Layer" +msgstr "Camada Poligonizada" + +#: ../src/datasource_bfilter.c:291 +msgid "Waypoints Outside This" +msgstr "Os Waypoints fora deste" + +#: ../src/datasource_file.c:61 +msgid "Import file with GPSBabel" +msgstr "" + +#: ../src/datasource_file.c:62 +msgid "Imported file" +msgstr "" + +#. The file selector +#: ../src/datasource_file.c:129 +msgid "File:" +msgstr "" + +#: ../src/datasource_file.c:130 +msgid "File to import" +msgstr "" + +#: ../src/datasource_file.c:137 +msgid "All files" +msgstr "" + +#. The file format selector +#: ../src/datasource_file.c:144 ../src/datasource_url.c:106 +msgid "File type:" +msgstr "" + +#: ../src/datasource_file.c:189 +#, c-format +msgid "using babel args '%s' and file '%s'" +msgstr "" + +#: ../src/datasource_gc.c:67 +msgid "Download Geocaches" +msgstr "Baixar Geocaches" + +#: ../src/datasource_gc.c:68 +msgid "Geocaching.com Caches" +msgstr "Caches Geocaching.com" + +#: ../src/datasource_gc.c:86 +msgid "geocaching.com username:" +msgstr "nome de usuário geocaching.com:" + +#: ../src/datasource_gc.c:87 +msgid "geocaching.com password:" +msgstr "senha geocaching.com:" + +#: ../src/datasource_gc.c:92 ../src/vikwindow.c:3502 +msgid "Geocaching" +msgstr "" + +#: ../src/datasource_gc.c:128 +#, c-format +msgid "" +"Can't find %s or %s in path! Check that you have installed it correctly." +msgstr "" + +#: ../src/datasource_gc.c:190 +msgid "Number geocaches:" +msgstr "Número dos Geocaches:" + +#: ../src/datasource_gc.c:192 +msgid "Centered around:" +msgstr "Centralizado em torno de:" + +#: ../src/datasource_gc.c:231 +msgid "Broken input - using some defaults" +msgstr "" + +#: ../src/datasource_geotag.c:51 +msgid "Create Waypoints from Geotagged Images" +msgstr "" + +#: ../src/datasource_geotag.c:52 +msgid "Geotagged Images" +msgstr "" + +#: ../src/datasource_geotag.c:102 ../src/datasource_geojson.c:93 +#: ../src/vikfileentry.c:171 ../src/vikwindow.c:3533 ../src/vikwindow.c:3610 +#: ../src/vikwindow.c:3641 ../src/vikwindow.c:4356 ../src/vikwindow.c:4649 +msgid "All" +msgstr "" + +#: ../src/datasource_geotag.c:107 ../src/vikfileentry.c:115 +#: ../src/viktrwlayer_geotag.c:637 ../src/vikwindow.c:3518 +#: ../src/vikwindow.c:4377 +msgid "JPG" +msgstr "" + +#: ../src/datasource_geotag.c:168 +#, c-format +msgid "Unable to create waypoint from %s" +msgstr "" + +#: ../src/datasource_geojson.c:46 +msgid "Acquire from GeoJSON" +msgstr "" + +#: ../src/datasource_geojson.c:47 ../src/datasource_geojson.c:98 +msgid "GeoJSON" +msgstr "" + +#: ../src/datasource_geojson.c:152 +#, c-format +msgid "Unable to import from: %s" +msgstr "" + +#: ../src/datasource_gps.c:54 +msgid "Acquire from GPS" +msgstr "Aquisição do GPS" + +#: ../src/datasource_gps.c:55 +msgid "Acquired from GPS" +msgstr "Adquiridos do GPS" + +#: ../src/datasource_gps.c:258 +#, c-format +msgid "using cmd '%s' and file '%s'\n" +msgstr "" + +#: ../src/datasource_gps.c:353 ../src/vikgpslayer.c:966 +#, c-format +msgid "Downloading %d waypoint..." +msgid_plural "Downloading %d waypoints..." +msgstr[0] "Baixando %d waypoint..." +msgstr[1] "baixando %d waypoints..." + +#: ../src/datasource_gps.c:358 ../src/vikgpslayer.c:971 +#, c-format +msgid "Downloading %d trackpoint..." +msgid_plural "Downloading %d trackpoints..." +msgstr[0] "Baixando %d trackpoint..." +msgstr[1] "Baixando %d trackpoints..." + +#: ../src/datasource_gps.c:363 ../src/vikgpslayer.c:976 +#, c-format +msgid "Downloading %d routepoint..." +msgid_plural "Downloading %d routepoints..." +msgstr[0] "" +msgstr[1] "" + +#: ../src/datasource_gps.c:386 ../src/datasource_gps.c:393 +#: ../src/datasource_gps.c:400 +#, c-format +msgid "Downloaded %d out of %d %s..." +msgstr "Transferido %d de %d%s..." + +#: ../src/datasource_gps.c:388 ../src/datasource_gps.c:395 +#: ../src/datasource_gps.c:402 +#, c-format +msgid "Downloaded %d %s." +msgstr "Baixado %d %s" + +#: ../src/datasource_gps.c:416 ../src/vikgpslayer.c:1134 +#, c-format +msgid "GPS Device: %s" +msgstr "Dispositivo GPS: %s" + +#: ../src/datasource_gps.c:428 ../src/vikgpslayer.c:1214 +msgid "Status: Working..." +msgstr "" + +#. NB gps_layer_inst_init() is performed after parameter registeration +#. thus to give the protocols some potential values use the old static list +#. TODO: find another way to use gps_layer_inst_init()? +#: ../src/datasource_gps.c:584 ../src/vikgpslayer.c:216 +msgid "GPS Protocol:" +msgstr "Protocolo GPS:" + +#. List reassigned at runtime +#: ../src/datasource_gps.c:609 ../src/vikgpslayer.c:217 +msgid "Serial Port:" +msgstr "Porta Serial:" + +#: ../src/datasource_gps.c:659 +msgid "" +"Turn Off After Transfer\n" +"(Garmin/NAViLink Only)" +msgstr "" +"Desligar Após Transferência\n" +"(Apenas Garmin/NAViLink)" + +#: ../src/datasource_gps.c:666 +msgid "Tracks:" +msgstr "" + +#: ../src/datasource_gps.c:673 +msgid "Routes:" +msgstr "" + +#: ../src/datasource_gps.c:680 +msgid "Waypoints:" +msgstr "" + +#: ../src/datasource_gps.c:756 ../src/vikgpslayer.c:1509 +msgid "GPS device: N/A" +msgstr "Dispositivo GPS: N/D" + +#: ../src/datasource_osm.c:53 ../src/datasource_osm.c:54 +msgid "OSM traces" +msgstr "" + +#: ../src/datasource_osm.c:89 +msgid "Page number:" +msgstr "" + +#: ../src/datasource_osm_my_traces.c:59 ../src/datasource_osm_my_traces.c:60 +msgid "OSM My Traces" +msgstr "" + +#: ../src/datasource_osm_my_traces.c:106 ../src/osm-traces.c:684 +#, fuzzy +msgid "Email/username:" +msgstr "Nome de usuário OSM:" + +#: ../src/datasource_osm_my_traces.c:111 +msgid "The email or username used to login to OSM" +msgstr "" + +#: ../src/datasource_osm_my_traces.c:113 ../src/osm-traces.c:692 +msgid "Password:" +msgstr "Senha:" + +#: ../src/datasource_osm_my_traces.c:116 +msgid "The password used to login to OSM" +msgstr "" + +#: ../src/datasource_osm_my_traces.c:427 ../src/viktrwlayer.c:689 +msgid "Description" +msgstr "" + +#: ../src/datasource_osm_my_traces.c:442 +msgid "Privacy" +msgstr "" + +#: ../src/datasource_osm_my_traces.c:449 +msgid "Within Current View" +msgstr "" + +#: ../src/datasource_osm_my_traces.c:516 +msgid "GPS Traces" +msgstr "" + +#: ../src/datasource_osm_my_traces.c:518 +msgid "None found!" +msgstr "" + +#: ../src/datasource_osm_my_traces.c:569 +msgid "Ensure the OSM access token preferences are setup." +msgstr "" + +#: ../src/datasource_osm_my_traces.c:645 +msgid "My OSM Traces" +msgstr "" + +#. Report errors to the status bar +#: ../src/datasource_osm_my_traces.c:667 +#, c-format +msgid "Unable to get trace: %s" +msgstr "" + +#: ../src/datasource_routing.c:56 ../src/datasource_routing.c:57 +msgid "Directions" +msgstr "" + +#: ../src/datasource_routing.c:90 +msgid "No routing engines with directions available" +msgstr "" + +#. Engine selector +#: ../src/datasource_routing.c:99 +msgid "Engine:" +msgstr "" + +#. From and To entries +#: ../src/datasource_routing.c:104 +msgid "From:" +msgstr "De:" + +#: ../src/datasource_routing.c:105 +msgid "To:" +msgstr "Para:" + +#: ../src/datasource_url.c:48 +msgid "Acquire from URL" +msgstr "" + +#: ../src/datasource_url.c:49 +msgid "URL" +msgstr "" + +#: ../src/datasource_url.c:101 +msgid "URL:" +msgstr "" + +#. Only GPX (not using GPSbabel) +#: ../src/datasource_url.c:133 ../src/vikfileentry.c:161 +#: ../src/vikwindow.c:3513 ../src/vikwindow.c:3603 +msgid "GPX" +msgstr "" + +#: ../src/datasource_wikipedia.c:32 +msgid "Create Waypoints from Wikipedia Articles" +msgstr "" + +#: ../src/datasource_wikipedia.c:33 +msgid "Wikipedia Waypoints" +msgstr "" + +#: ../src/dem.c:66 ../src/dem.c:80 +msgid "Invalid DEM" +msgstr "DEM Inválido" + +#: ../src/dem.c:122 +msgid "Invalid DEM header" +msgstr "Cabeçalho DEM inválido" + +#: ../src/dem.c:191 ../src/dem.c:204 +msgid "Incorrect DEM Class B record: expected 1" +msgstr "Registro Classe B Incorreta: 1 esperado" + +#: ../src/dem.c:289 ../src/download.c:176 +#, c-format +msgid "Couldn't map file %s: %s" +msgstr "Não foi possível mapear o arquivo %s: %s" + +#: ../src/download.c:130 +msgid "Tile age (days):" +msgstr "" + +#: ../src/download.c:406 +#, c-format +msgid "Download error: %s" +msgstr "Erro no Download: %s" + +#: ../src/download.c:490 +msgid "couldn't open temp file" +msgstr "não foi possível abrir o arquivo temporário" + +#: ../src/file.c:458 ../src/file.c:463 +#, c-format +msgid "Draw mode '%s' no more supported" +msgstr "Modo de Empate '%s'' não é mais suportada" + +#: ../src/geotag_exif.c:621 +msgid "Not enough memory." +msgstr "" + +#: ../src/geotag_exif.c:639 +msgid "Setting a value for this tag is unsupported!" +msgstr "" + +#: ../src/geotag_exif.c:658 +#, c-format +msgid "Too few components specified (need %d, found %d)\n" +msgstr "" + +#: ../src/geotag_exif.c:662 +msgid "Numeric value expected\n" +msgstr "" + +#: ../src/geotag_exif.c:670 +msgid "This shouldn't happen!" +msgstr "" + +#: ../src/geotag_exif.c:740 +msgid "Not yet implemented!" +msgstr "" + +#: ../src/geotag_exif.c:753 +msgid "Warning; Too many components specified!" +msgstr "" + +#: ../src/osm-traces.c:87 +msgid "Identifiable (public w/ timestamps)" +msgstr "Identificável (w público / data e hora)" + +#: ../src/osm-traces.c:88 +msgid "Trackable (private w/ timestamps)" +msgstr "Rastreável (w/ data e hora privados)" + +#: ../src/osm-traces.c:89 +msgid "Public" +msgstr "Público" + +#: ../src/osm-traces.c:90 +msgid "Private" +msgstr "Privado" + +#: ../src/osm-traces.c:108 +msgid "Access Token:" +msgstr "" + +#: ../src/osm-traces.c:108 +msgid "Get New OSM Access Tokens" +msgstr "" + +#: ../src/osm-traces.c:109 +msgid "Access Token Key:" +msgstr "" + +#: ../src/osm-traces.c:110 +msgid "Access Token Secret:" +msgstr "" + +#: ../src/osm-traces.c:111 +msgid "OSM username:" +msgstr "Nome de usuário OSM:" + +#: ../src/osm-traces.c:112 +msgid "OSM password:" +msgstr "Senha do OSM:" + +#. Check to really override existing values... +#: ../src/osm-traces.c:263 +msgid "Do you want to overwrite existing values?" +msgstr "" + +#: ../src/osm-traces.c:275 +msgid "Not able to generate OSM request tokens." +msgstr "" + +#: ../src/osm-traces.c:299 +msgid "" +"Waiting for authorization approval.\n" +"Ensure you have granted access at the website before continuing here." +msgstr "" + +#: ../src/osm-traces.c:315 +msgid "No Authorization." +msgstr "" + +#: ../src/osm-traces.c:354 +msgid "" +"OSM Username and Password preferences are not required anymore. You can now " +"remove them." +msgstr "" + +#. Preferences +#: ../src/osm-traces.c:379 +msgid "OpenStreetMap Traces" +msgstr "" + +#: ../src/osm-traces.c:504 +#, c-format +msgid "failed to upload data: HTTP response is %ld" +msgstr "falha no envio de dados: Resposta HTTP é %ld" + +#: ../src/osm-traces.c:509 +#, c-format +msgid "curl_easy_getinfo failed: %d" +msgstr "curl_easy_getinfo falhou: %d" + +#: ../src/osm-traces.c:514 +#, c-format +msgid "curl request failed: %s" +msgstr "pedido curl falhou: %s" + +#. Success +#: ../src/osm-traces.c:592 +msgid "Uploaded to OSM" +msgstr "" + +#: ../src/osm-traces.c:596 +msgid "" +"FAILED TO UPLOAD DATA TO OSM - Ensure the OSM access token preferences are " +"setup." +msgstr "" + +#: ../src/osm-traces.c:599 +msgid "FAILED TO UPLOAD DATA TO OSM - CURL PROBLEM" +msgstr "" + +#: ../src/osm-traces.c:602 +msgid "FAILED TO UPLOAD DATA TO OSM" +msgstr "" + +#: ../src/osm-traces.c:602 +msgid "HTTP response code" +msgstr "" + +#: ../src/osm-traces.c:610 +#, c-format +msgid "failed to unlink temporary file: %s" +msgstr "Falha ao desvincular o arquivo temporário: %s" + +#: ../src/osm-traces.c:664 +msgid "OSM upload" +msgstr "OSM upload" + +#: ../src/osm-traces.c:689 +#, fuzzy +msgid "" +"The email/username used as login\n" +"Enter the email/username you use to login into www.openstreetmap.org." +"" +msgstr "" +"O e-mail utilizado como login\n" +"Digite o e-mail que você usa para fazer login em www.openstreetmap." +"org." + +#: ../src/osm-traces.c:697 +msgid "" +"The password used to login\n" +"Enter the password you use to login into www.openstreetmap.org." +msgstr "" +"A senha usada para entrar\n" +"Digite a senha que você usa para entrar em www.openstreetmap.org." + +#: ../src/osm-traces.c:703 +msgid "File's name:" +msgstr "Nome do arquivo:" + +#: ../src/osm-traces.c:713 +msgid "" +"The name of the file on OSM\n" +"This is the name of the file created on the server.This is not the " +"name of the local file." +msgstr "" +"O nome do arquivo no OSM\n" +"Este é o nome do arquivo criado no servidor. Este não é o nome do " +"arquivo local." + +#: ../src/osm-traces.c:717 ../src/viktrwlayer_wpwin.c:197 +#: ../src/viktrwlayer_wpwin.c:199 +msgid "Description:" +msgstr "Descrição:" + +#: ../src/osm-traces.c:731 +msgid "The description of the trace" +msgstr "A descrição do rastreamento" + +#: ../src/osm-traces.c:734 +msgid "Anonymize Times:" +msgstr "" + +#: ../src/osm-traces.c:739 +msgid "" +"Anonymize times of the trace.\n" +"You may choose to make the trace identifiable, yet mask the actual " +"real time values" +msgstr "" + +#: ../src/osm-traces.c:743 +msgid "Tags:" +msgstr "Etiquetas:" + +#: ../src/osm-traces.c:751 +msgid "The tags associated to the trace" +msgstr "As marcas associadas ao rastreamento" + +#: ../src/osm-traces.c:816 +#, c-format +msgid "Uploading %s to OSM" +msgstr "Uploading %s para OSM" + +#: ../src/mapcache.c:67 +msgid "Map cache memory size (MB):" +msgstr "" + +#. NB Can have a couple hundred fonts loaded when using system directories +#. So ATM don't list them all - otherwise need better GUI feedback display. +#: ../src/mapnik_interface.cpp:324 +#, c-format +msgid "" +"%s %s\n" +"Plugins=%sFonts loaded=%d" +msgstr "" + +#: ../src/mapnik_interface.cpp:325 ../src/vikmapniklayer.c:278 +msgid "Mapnik" +msgstr "" + +#: ../src/print.c:51 ../src/viktrwlayer.c:572 +msgid "None" +msgstr "Nenhum" + +#: ../src/print.c:52 +msgid "Horizontally" +msgstr "Horizontalmente" + +#: ../src/print.c:53 +msgid "Vertically" +msgstr "Verticalmente" + +#: ../src/print.c:54 +msgid "Both" +msgstr "Ambos" + +#: ../src/print.c:118 +msgid "Image Settings" +msgstr "Configurações de Imagem" + +#: ../src/print.c:551 +msgid "done" +msgstr "concluído" + +#. Page Size +#: ../src/print.c:580 +msgid "_Adjust Page Size and Orientation" +msgstr "_Ajustar Tamanho e a Orientação da Página" + +#: ../src/print.c:596 +msgid "C_enter:" +msgstr "C_entro:" + +#. ignore page margins +#: ../src/print.c:614 +msgid "Ignore Page _Margins" +msgstr "Ignorar _Margens da Página" + +#: ../src/print.c:633 +msgid "Image S_ize:" +msgstr "Tamanho da Imagem" + +#: ../src/ui_util.c:88 +#, c-format +msgid "Could not launch web browser. %s" +msgstr "" + +#: ../src/ui_util.c:101 +#, c-format +msgid "Could not create new email. %s" +msgstr "" + +#: ../src/vikcoordlayer.c:57 +msgid "Color:" +msgstr "Cor:" + +#: ../src/vikcoordlayer.c:58 +msgid "Minutes Width:" +msgstr "Largura da Ata:" + +#: ../src/vikcoordlayer.c:59 +msgid "Line Thickness:" +msgstr "Espessura da linha:" + +#: ../src/vikcoordlayer.c:66 +msgid "Coordinate" +msgstr "" + +#: ../src/main.c:92 +#, c-format +msgid "Ignoring Xlib error: error code %d request code %d\n" +msgstr "" + +#: ../src/main.c:111 +msgid "Enable debug output" +msgstr "Habilitar a saída de depuração" + +#: ../src/main.c:112 +msgid "Enable verbose output" +msgstr "Habilitar saída com mensagens detalhadas" + +#: ../src/main.c:113 +msgid "Show version" +msgstr "Mostrar versão" + +#: ../src/main.c:114 +msgid "Latitude in decimal degrees" +msgstr "" + +#: ../src/main.c:115 +msgid "Longitude in decimal degrees" +msgstr "" + +#: ../src/main.c:116 +msgid "Zoom Level (OSM). Value can be 0 - 22" +msgstr "" + +#: ../src/main.c:117 +msgid "Add a map layer by id value. Use 0 for the default map." +msgstr "" + +#: ../src/main.c:160 +#, c-format +msgid "" +"%s %s\n" +"Copyright (c) 2003-2008 Evan Battaglia\n" +"Copyright (c) 2008-%s Viking's contributors\n" +msgstr "" + +#: ../src/osm.c:50 +msgid "OpenStreetMap (Mapnik)" +msgstr "" + +#: ../src/osm.c:65 +msgid "OpenStreetMap (Cycle)" +msgstr "" + +#: ../src/osm.c:79 +msgid "OpenStreetMap (Transport)" +msgstr "" + +#: ../src/osm.c:95 +msgid "OpenStreetMap (Humanitarian)" +msgstr "" + +#: ../src/osm.c:111 +msgid "On Disk OSM Tile Format" +msgstr "" + +#: ../src/osm.c:121 +msgid "MBTiles File" +msgstr "" + +#: ../src/osm.c:132 +msgid "OSM Metatiles" +msgstr "" + +#: ../src/osm.c:146 +msgid "Mapbox Outdoors" +msgstr "" + +#: ../src/osm.c:153 +msgid "Mapbox Specific" +msgstr "" + +#: ../src/osm.c:170 +msgid "OSM (view)" +msgstr "OSM (vista)" + +#: ../src/osm.c:174 +msgid "OSM (edit)" +msgstr "OSM (editar)" + +#. Note the use of positional parameters +#: ../src/osm.c:179 +msgid "OSM (query)" +msgstr "" + +#: ../src/osm.c:183 +msgid "OSM (render)" +msgstr "OSM (processar)" + +#. Example: http://127.0.0.1:8111/load_and_zoom?left=8.19&right=8.20&top=48.605&bottom=48.590&select=node413602999 +#. JOSM or merkaartor must already be running with remote interface enabled +#: ../src/osm.c:190 +msgid "Local port 8111 (eg JOSM)" +msgstr "" + +#: ../src/osm.c:195 +msgid "Geofabrik Map Compare" +msgstr "" + +#: ../src/osm.c:203 +msgid "OpenStreetMap Notes" +msgstr "" + +#. Not really OSM but can't be bothered to create somewhere else to put it... +#: ../src/osm.c:221 +msgid "Wikimedia Toolserver GeoHack" +msgstr "" + +#: ../src/preferences.c:195 +msgid "Preferences" +msgstr "Preferências" + +#: ../src/toolbar.c:91 ../src/toolbar.c:92 +msgid "System Default" +msgstr "" + +#: ../src/toolbar.c:91 ../src/viktrwlayer.c:563 +msgid "Small" +msgstr "" + +#: ../src/toolbar.c:91 ../src/viktrwlayer.c:564 +msgid "Medium" +msgstr "" + +#: ../src/toolbar.c:91 ../src/viktrwlayer.c:565 +msgid "Large" +msgstr "" + +#: ../src/toolbar.c:92 +msgid "Icons Only" +msgstr "" + +#: ../src/toolbar.c:92 +msgid "Text Only" +msgstr "" + +#: ../src/toolbar.c:92 +msgid "Icons and Text" +msgstr "" + +#: ../src/toolbar.c:106 +msgid "Append to Menu:" +msgstr "" + +#: ../src/toolbar.c:107 +msgid "Pack the toolbar to the main menu to save vertical space" +msgstr "" + +#: ../src/toolbar.c:108 +msgid "Icon Size:" +msgstr "" + +#: ../src/toolbar.c:110 +msgid "Icon Style:" +msgstr "" + +#: ../src/toolbar.c:112 +msgid "Customize:" +msgstr "" + +#: ../src/toolbar.c:112 +msgid "Customize Buttons" +msgstr "" + +#. Preferences +#: ../src/toolbar.c:145 +msgid "Toolbar" +msgstr "" + +#: ../src/toolbar.c:312 +msgid "_Customize" +msgstr "" + +#: ../src/toolbar.c:641 +msgid "Separator" +msgstr "" + +#: ../src/toolbar.c:642 +msgid "--- Separator ---" +msgstr "" + +#: ../src/toolbar.c:1007 +msgid "Customize Toolbar" +msgstr "" + +#: ../src/toolbar.c:1028 +msgid "" +"Select items to be displayed on the toolbar. Items can be reordered by drag " +"and drop." +msgstr "" + +#: ../src/toolbar.c:1044 +msgid "Available Items" +msgstr "" + +#: ../src/toolbar.c:1065 +msgid "Displayed Items" +msgstr "" + +#: ../src/viklayer_defaults.c:232 +#, c-format +msgid "Could not open file: %s" +msgstr "" + +#: ../src/viklayer_defaults.c:304 +msgid "Layer Defaults" +msgstr "" + +#: ../src/uibuilder.c:196 +msgid "Take care that this password will be stored clearly in a plain file." +msgstr "" +"Tome cuidado para que essa senha seja armazenada em meio a um simples " +"arquivo." + +#: ../src/uibuilder.c:628 ../src/viktrwlayer_export.c:188 +#: ../src/viktrwlayer_export.c:304 ../src/vikwindow.c:3666 +#: ../src/vikwindow.c:4408 +#, c-format +msgid "The file \"%s\" exists, do you wish to overwrite it?" +msgstr "O arquivo \"%s\" já existe, deseja substituí-lo?" + +#: ../src/vikaggregatelayer.c:41 +msgid "Aggregate" +msgstr "" + +#: ../src/vikaggregatelayer.c:528 ../src/viktrwlayer.c:11700 +#, c-format +msgid "%s: Waypoint List" +msgstr "" + +#: ../src/vikaggregatelayer.c:570 +msgid "Search by Date" +msgstr "" + +#: ../src/vikaggregatelayer.c:576 +msgid "No items found with the requested date." +msgstr "" + +#: ../src/vikaggregatelayer.c:615 ../src/viktrwlayer.c:11691 +#, c-format +msgid "%s: Track and Route List" +msgstr "" + +#: ../src/vikaggregatelayer.c:681 ../src/viktrwlayer.c:8346 +#: ../src/viktrwlayer.c:8417 ../src/viktrwlayer.c:8494 +msgid "_Visibility" +msgstr "" + +#: ../src/vikaggregatelayer.c:686 +msgid "_Show All" +msgstr "" + +#: ../src/vikaggregatelayer.c:692 +msgid "_Hide All" +msgstr "" + +#: ../src/vikaggregatelayer.c:698 ../src/viktrwlayer.c:8363 +#: ../src/viktrwlayer.c:8434 ../src/viktrwlayer.c:8511 +msgid "_Toggle" +msgstr "" + +#: ../src/vikaggregatelayer.c:705 ../src/viktrwlayer.c:8532 +msgid "_Sort" +msgstr "" + +#: ../src/vikaggregatelayer.c:711 ../src/viktrwlayer.c:8538 +msgid "Name _Ascending" +msgstr "" + +#: ../src/vikaggregatelayer.c:717 ../src/viktrwlayer.c:8544 +msgid "Name _Descending" +msgstr "" + +#: ../src/vikaggregatelayer.c:723 ../src/viktrwlayer.c:575 +#: ../src/viktrwlayer.c:8550 +msgid "Date Ascending" +msgstr "" + +#: ../src/vikaggregatelayer.c:729 ../src/viktrwlayer.c:576 +#: ../src/viktrwlayer.c:8556 +msgid "Date Descending" +msgstr "" + +#: ../src/vikaggregatelayer.c:735 ../src/viktrwlayer.c:8445 +#: ../src/viktrwlayer.c:8523 ../src/viktrwlayer.c:8595 +#: ../src/viktrwlayer_tracklist.c:296 +msgid "_Statistics" +msgstr "" + +#: ../src/vikaggregatelayer.c:740 ../src/viktrwlayer.c:4533 +msgid "Track _List..." +msgstr "" + +#: ../src/vikaggregatelayer.c:746 ../src/viktrwlayer.c:4540 +msgid "_Waypoint List..." +msgstr "" + +#: ../src/vikaggregatelayer.c:753 +msgid "Searc_h" +msgstr "" + +#: ../src/vikaggregatelayer.c:759 +msgid "By _Date..." +msgstr "" + +#: ../src/vikaggregatelayer.c:762 +msgid "Find the first item with a specified date" +msgstr "" + +#: ../src/vikaggregatelayer.c:765 +msgid "Load E_xternal Layers" +msgstr "" + +#. Could have a more complicated tooltip that numbers each type of layers, +#. but for now a simple overall count +#: ../src/vikaggregatelayer.c:1011 +#, c-format +msgid "One layer" +msgid_plural "%d layers" +msgstr[0] "" +msgstr[1] "" + +#: ../src/vikaggregatelayer.c:1014 +#, fuzzy, c-format +msgid "Empty" +msgstr "Tudo_Vazio" + +#: ../src/vikdemlayer.c:86 +msgid "SRTM Global 90m (3 arcsec)" +msgstr "" + +#: ../src/vikdemlayer.c:94 +msgid "Absolute height" +msgstr "Altura absoluta" + +#: ../src/vikdemlayer.c:95 +msgid "Height gradient" +msgstr "Gradiente de Altura" + +#: ../src/vikdemlayer.c:120 +msgid "DEM Files:" +msgstr "Arquivos DEM:" + +#: ../src/vikdemlayer.c:121 +msgid "Download Source:" +msgstr "Fonte do download:" + +#: ../src/vikdemlayer.c:122 +msgid "Min Elev Color:" +msgstr "Min Elev Color:" + +#: ../src/vikdemlayer.c:123 ../src/viktrwlayer_wpwin.c:207 +msgid "Type:" +msgstr "Tipo:" + +#: ../src/vikdemlayer.c:124 +msgid "Min Elev:" +msgstr "Min Elev:" + +#: ../src/vikdemlayer.c:125 +msgid "Max Elev:" +msgstr "Max Elev:" + +#: ../src/vikdemlayer.c:137 +msgid "_DEM Download" +msgstr "" + +#: ../src/vikdemlayer.c:137 +msgid "DEM Download" +msgstr "" + +#: ../src/vikdemlayer.c:192 +msgid "DEM" +msgstr "" + +#: ../src/vikdemlayer.c:304 +#, c-format +msgid "Number of files: %d" +msgstr "Número de arquivos: %d" + +#: ../src/vikdemlayer.c:446 +msgid "DEM Loading" +msgstr "DEM Carregando" + +#: ../src/vikdemlayer.c:927 +#, c-format +msgid "No SRTM data available for %f, %f" +msgstr "Não há dados SRTM disponíveis para %f, %f" + +#: ../src/vikdemlayer.c:948 +#, c-format +msgid "DEM download failure for %f, %f" +msgstr "" + +#: ../src/vikdemlayer.c:954 +#, c-format +msgid "DEM write failure for %s" +msgstr "" + +#. Probably not over any land... +#: ../src/vikdemlayer.c:1201 +msgid "No DEM File Available" +msgstr "" + +#: ../src/vikdemlayer.c:1220 +#, c-format +msgid "" +"\n" +"Source: %s\n" +"\n" +"DEM File: %s\n" +"DEM File Timestamp: %s" +msgstr "" + +#: ../src/vikdemlayer.c:1224 +#, c-format +msgid "" +"Source: %s\n" +"\n" +"No DEM File!" +msgstr "" + +#: ../src/vikdemlayer.c:1264 +#, c-format +msgid "Downloading DEM %s" +msgstr "Baixando DEM %s" + +#: ../src/vikdemlayer.c:1289 +msgid "_Show DEM File Information" +msgstr "" + +#: ../src/vikfileentry.c:72 +msgid "Browse..." +msgstr "Navegar..." + +#: ../src/vikfileentry.c:103 +msgid "Choose file" +msgstr "Escolha o arquivo" + +#: ../src/vikfileentry.c:120 ../src/vikwindow.c:4372 +msgid "PNG" +msgstr "" + +#: ../src/vikfileentry.c:125 +msgid "TIFF" +msgstr "" + +#: ../src/vikfileentry.c:133 +msgid "MBTiles" +msgstr "" + +#: ../src/vikfileentry.c:142 +msgid "XML" +msgstr "" + +#: ../src/vikfileentry.c:149 +msgid "MML" +msgstr "" + +#: ../src/vikfileentry.c:154 +msgid "MSS" +msgstr "" + +#: ../src/vikfilelist.c:49 +msgid "Choose file(s)" +msgstr "Escolher arquivo (s)" + +#: ../src/vikfilelist.c:182 +msgid "Add..." +msgstr "Adicionar..." + +#: ../src/vikfilelist.c:183 +msgid "Delete" +msgstr "Excluir" + +#: ../src/vikgeoreflayer.c:97 +msgid "_Georef Move Map" +msgstr "" + +#: ../src/vikgeoreflayer.c:97 +msgid "Georef Move Map" +msgstr "GEOREF Mover Mapa" + +#: ../src/vikgeoreflayer.c:106 +msgid "Georef Z_oom Tool" +msgstr "" + +#: ../src/vikgeoreflayer.c:106 +msgid "Georef Zoom Tool" +msgstr "GEOREF Ferramenta de Zoom" + +#: ../src/vikgeoreflayer.c:117 +msgid "GeoRef Map" +msgstr "" + +#: ../src/vikgeoreflayer.c:214 +msgid "Auto Read World Files:" +msgstr "" + +#: ../src/vikgeoreflayer.c:215 +msgid "" +"Automatically attempt to read associated world file of a new image for a " +"GeoRef layer" +msgstr "" + +#: ../src/vikgeoreflayer.c:511 ../src/vikgeoreflayer.c:797 +#: ../src/vikmapslayer.c:1174 +#, c-format +msgid "Couldn't open image file: %s" +msgstr "Não foi possível abrir arquivo de imagem: %s" + +#: ../src/vikgeoreflayer.c:607 ../src/vikgeoreflayer.c:633 +msgid "Choose World file" +msgstr "Escolher arquivo Mundial" + +#: ../src/vikgeoreflayer.c:619 +msgid "The World file you requested could not be opened for reading." +msgstr "O arquivo Mundial solicitado não pôde ser aberto para leitura." + +#: ../src/vikgeoreflayer.c:621 +msgid "Unexpected end of file reading World file." +msgstr "Fim de arquivo inesperado ao ler o arquivo Mundial." + +#: ../src/vikgeoreflayer.c:646 +msgid "The file you requested could not be opened for writing." +msgstr "O arquivo solicitado não pôde ser aberto para escrita." + +#: ../src/vikgeoreflayer.c:782 +msgid "Lower right corner values may not be consistent with upper right values" +msgstr "" + +#: ../src/vikgeoreflayer.c:806 +#, c-format +msgid "Invalid image size: %s" +msgstr "" + +#: ../src/vikgeoreflayer.c:831 ../src/viklayer.c:561 ../src/vikwindow.c:4891 +msgid "Layer Properties" +msgstr "Propriedades da Camada" + +#: ../src/vikgeoreflayer.c:852 +msgid "World File Parameters:" +msgstr "Parâmetros do Arquivo Mundial:" + +#: ../src/vikgeoreflayer.c:853 +msgid "Load From File..." +msgstr "Carregar Do Arquivo..." + +#: ../src/vikgeoreflayer.c:858 +msgid "Corner pixel easting:" +msgstr "Pixel De canto Para o Oeste:" + +#: ../src/vikgeoreflayer.c:860 +msgid "the UTM \"easting\" value of the upper-left corner pixel of the map" +msgstr "" + +#: ../src/vikgeoreflayer.c:862 +msgid "Corner pixel northing:" +msgstr "Pixel De canto Para o Norte:" + +#: ../src/vikgeoreflayer.c:864 +msgid "the UTM \"northing\" value of the upper-left corner pixel of the map" +msgstr "" + +#: ../src/vikgeoreflayer.c:866 +msgid "X (easting) scale (mpp): " +msgstr "X (easting) escala (mpp): " + +#: ../src/vikgeoreflayer.c:867 +msgid "Y (northing) scale (mpp): " +msgstr "Y (northing) escala (mpp): " + +#: ../src/vikgeoreflayer.c:870 +msgid "the scale of the map in the X direction (meters per pixel)" +msgstr "a escala do mapa na direção X (metros por Pixel)" + +#: ../src/vikgeoreflayer.c:872 +msgid "the scale of the map in the Y direction (meters per pixel)" +msgstr "a escala do mapa na direção Y (metros por pixel)" + +#: ../src/vikgeoreflayer.c:874 +msgid "Map Image:" +msgstr "Mapa de Imagem:" + +#: ../src/vikgeoreflayer.c:919 +msgid "Upper left latitude:" +msgstr "" + +#: ../src/vikgeoreflayer.c:921 +msgid "Upper left longitude:" +msgstr "" + +#: ../src/vikgeoreflayer.c:923 +msgid "Lower right latitude:" +msgstr "" + +#: ../src/vikgeoreflayer.c:925 +msgid "Lower right longitude:" +msgstr "" + +#: ../src/vikgeoreflayer.c:937 +msgid "Calculate MPP values from coordinates" +msgstr "" + +#: ../src/vikgeoreflayer.c:938 +msgid "" +"Enter all corner coordinates before calculating the MPP values from the " +"image size" +msgstr "" + +#: ../src/vikgeoreflayer.c:948 +msgid "UTM" +msgstr "" + +#: ../src/vikgeoreflayer.c:949 +msgid "Latitude/Longitude" +msgstr "" + +#: ../src/vikgeoreflayer.c:957 ../src/vikmapniklayer.c:82 +#: ../src/vikmapslayer.c:158 +msgid "Alpha:" +msgstr "Alfa:" + +#. Now with icons +#: ../src/vikgeoreflayer.c:1062 +msgid "_Zoom to Fit Map" +msgstr "_Zoom para se adaptar ao Mapa" + +#: ../src/vikgeoreflayer.c:1068 +msgid "_Goto Map Center" +msgstr "Centro Mapa _Goto" + +#: ../src/vikgeoreflayer.c:1074 +msgid "_Export to World File" +msgstr "_Exportar para Arquivo Mundial" + +#: ../src/vikgoto.c:98 +msgid "No goto tool available." +msgstr "Nenhuma ferramenta goto disponível." + +#: ../src/vikgoto.c:295 +msgid "goto" +msgstr "goto" + +#: ../src/vikgoto.c:297 +msgid "goto provider:" +msgstr "provedor goto:" + +#: ../src/vikgoto.c:312 +msgid "Enter address or place name:" +msgstr "Informe o endereço ou o nome do local:" + +#: ../src/vikgoto.c:487 +msgid "Locality" +msgstr "" + +#: ../src/vikgpslayer.c:137 +msgid "Data Mode" +msgstr "" + +#: ../src/vikgpslayer.c:139 +msgid "Realtime Tracking Mode" +msgstr "" + +#: ../src/vikgpslayer.c:176 +msgid "Keep vehicle at center" +msgstr "" + +#: ../src/vikgpslayer.c:177 +msgid "Keep vehicle on screen" +msgstr "" + +#: ../src/vikgpslayer.c:178 +msgid "Disable" +msgstr "" + +#: ../src/vikgpslayer.c:218 +msgid "Download Tracks:" +msgstr "" + +#: ../src/vikgpslayer.c:219 +msgid "Upload Tracks:" +msgstr "" + +#: ../src/vikgpslayer.c:220 +msgid "Download Routes:" +msgstr "" + +#: ../src/vikgpslayer.c:221 +msgid "Upload Routes:" +msgstr "" + +#: ../src/vikgpslayer.c:222 +msgid "Download Waypoints:" +msgstr "" + +#: ../src/vikgpslayer.c:223 +msgid "Upload Waypoints:" +msgstr "" + +#: ../src/vikgpslayer.c:225 +msgid "Recording tracks" +msgstr "Gravação de faixas" + +#: ../src/vikgpslayer.c:226 +msgid "Jump to current position on start" +msgstr "Ir para a posição atual no início" + +#: ../src/vikgpslayer.c:227 +msgid "Moving Map Method:" +msgstr "Método Moving Map:" + +#: ../src/vikgpslayer.c:228 +msgid "Update Statusbar:" +msgstr "" + +#: ../src/vikgpslayer.c:228 +msgid "Display information in the statusbar on GPS updates" +msgstr "" + +#: ../src/vikgpslayer.c:229 +msgid "Auto Connect" +msgstr "" + +#: ../src/vikgpslayer.c:229 +msgid "Automatically connect to GPSD" +msgstr "" + +#: ../src/vikgpslayer.c:230 +msgid "Gpsd Host:" +msgstr "Anfitrião DSGP:" + +#: ../src/vikgpslayer.c:231 +msgid "Gpsd Port:" +msgstr "Porto DSGP:" + +#: ../src/vikgpslayer.c:232 +msgid "Gpsd Retry Interval (seconds):" +msgstr "Gpsd Repetir Intervalo (segundos):" + +#: ../src/vikgpslayer.c:254 +msgid "GPS" +msgstr "" + +#: ../src/vikgpslayer.c:320 ../src/vikgpslayer.c:1504 +msgid "GPS Download" +msgstr "GPS Download" + +#: ../src/vikgpslayer.c:320 ../src/vikgpslayer.c:1504 ../src/viktrwlayer.c:3993 +msgid "GPS Upload" +msgstr "GPS Upload" + +#: ../src/vikgpslayer.c:322 +msgid "GPS Realtime Tracking" +msgstr "GPS rastreamento em tempo real" + +#: ../src/vikgpslayer.c:458 +msgid "Connected" +msgstr "" + +#: ../src/vikgpslayer.c:460 +msgid "Disconnected" +msgstr "" + +#: ../src/vikgpslayer.c:554 +msgid "Unknown GPS Protocol" +msgstr "Protocolo GPS Desconhecido" + +#: ../src/vikgpslayer.c:572 +msgid "Unknown serial port device" +msgstr "Dispositivo de porta serial desconhecido." + +#: ../src/vikgpslayer.c:691 +#, c-format +msgid "%s: unknown parameter" +msgstr "%s: parâmetro desconhecido" + +#. Now with icons +#: ../src/vikgpslayer.c:794 +msgid "_Upload to GPS" +msgstr "_Upload para GPS" + +#: ../src/vikgpslayer.c:800 +msgid "Download from _GPS" +msgstr "Download para _GPS" + +#: ../src/vikgpslayer.c:821 +msgid "Empty _Realtime" +msgstr "Realtime_ Vazio" + +#: ../src/vikgpslayer.c:828 +msgid "E_mpty Upload" +msgstr "V_azio Upload" + +#: ../src/vikgpslayer.c:834 +msgid "_Empty Download" +msgstr "_Download Vazio" + +#: ../src/vikgpslayer.c:840 +msgid "Empty _All" +msgstr "Tudo_Vazio" + +#: ../src/vikgpslayer.c:852 +#, c-format +msgid "Unexpected number of disconnected handlers: %d" +msgstr "Número inesperado de manipuladores desconectados: %d" + +#: ../src/vikgpslayer.c:995 +#, c-format +msgid "Uploading %d waypoint..." +msgid_plural "Uploading %d waypoints..." +msgstr[0] "Uploading %d waypoint..." +msgstr[1] "Uploading %d waypoints..." + +#: ../src/vikgpslayer.c:1000 +#, c-format +msgid "Uploading %d trackpoint..." +msgid_plural "Uploading %d trackpoints..." +msgstr[0] "Uploading %d trackpoint..." +msgstr[1] "Uploading %d trackpoints..." + +#: ../src/vikgpslayer.c:1005 +#, c-format +msgid "Uploading %d routepoint..." +msgid_plural "Uploading %d routepoints..." +msgstr[0] "" +msgstr[1] "" + +#: ../src/vikgpslayer.c:1034 +#, c-format +msgid "Downloaded %d out of %d waypoint..." +msgid_plural "Downloaded %d out of %d waypoints..." +msgstr[0] "Transe rido %d de %d waypoint..." +msgstr[1] "Tranferidos %d de %d waypoints..." + +#: ../src/vikgpslayer.c:1040 +#, c-format +msgid "Downloaded %d out of %d trackpoint..." +msgid_plural "Downloaded %d out of %d trackpoints..." +msgstr[0] "Transferido %d de %d trackpoint..." +msgstr[1] "Trans feridos %d de %d trackpoints..." + +#: ../src/vikgpslayer.c:1046 +#, c-format +msgid "Downloaded %d out of %d routepoint..." +msgid_plural "Downloaded %d out of %d routepoints..." +msgstr[0] "" +msgstr[1] "" + +#: ../src/vikgpslayer.c:1056 +#, c-format +msgid "Uploaded %d out of %d waypoint..." +msgid_plural "Uploaded %d out of %d waypoints..." +msgstr[0] "Uploaded %d de %d waypoint..." +msgstr[1] "Uploaded %d de %d waypoints..." + +#: ../src/vikgpslayer.c:1062 +#, c-format +msgid "Uploaded %d out of %d trackpoint..." +msgid_plural "Uploaded %d out of %d trackpoints..." +msgstr[0] "Uploaded %d de %d trackpoint..." +msgstr[1] "Uploaded %d de %d trackpoints..." + +#: ../src/vikgpslayer.c:1068 +#, c-format +msgid "Uploaded %d out of %d routepoint..." +msgid_plural "Uploaded %d out of %d routepoints..." +msgstr[0] "" +msgstr[1] "" + +#: ../src/vikgpslayer.c:1079 +#, c-format +msgid "Downloaded %d waypoint" +msgid_plural "Downloaded %d waypoints" +msgstr[0] "Transferido %d waypoint" +msgstr[1] "Transferidos %d waypoints" + +#: ../src/vikgpslayer.c:1085 +#, c-format +msgid "Downloaded %d trackpoint" +msgid_plural "Downloaded %d trackpoints" +msgstr[0] "Transferido %d trackpoint" +msgstr[1] "Transferidos %d trackpoints" + +#: ../src/vikgpslayer.c:1091 +#, c-format +msgid "Downloaded %d routepoint" +msgid_plural "Downloaded %d routepoints" +msgstr[0] "" +msgstr[1] "" + +#: ../src/vikgpslayer.c:1101 +#, c-format +msgid "Uploaded %d waypoint" +msgid_plural "Uploaded %d waypoints" +msgstr[0] "Uploaded %d waypoint" +msgstr[1] "Uploaded %d waypoints" + +#: ../src/vikgpslayer.c:1107 +#, c-format +msgid "Uploaded %d trackpoint" +msgid_plural "Uploaded %d trackpoints" +msgstr[0] "Uploaded %d trackpoint" +msgstr[1] "Uploaded %d trackpoints" + +#: ../src/vikgpslayer.c:1113 +#, c-format +msgid "Uploaded %d routepoint" +msgid_plural "Uploaded %d routepoints" +msgstr[0] "" +msgstr[1] "" + +#: ../src/vikgpslayer.c:1363 +msgid "Error: No result." +msgstr "" + +#: ../src/vikgpslayer.c:1471 +msgid "Warning - GPS Upload items may overwrite each other" +msgstr "" + +#: ../src/vikgpslayer.c:1506 +msgid "Status: detecting gpsbabel" +msgstr "Estado: detectando gpsbabel" + +#: ../src/vikgpslayer.c:1533 +msgid "No GPS items selected for transfer." +msgstr "" + +#: ../src/vikgpslayer.c:1546 +msgid "Could not turn off device." +msgstr "" + +#: ../src/vikgpslayer.c:1589 +msgid "Are you sure you want to delete GPS Upload data?" +msgstr "" + +#: ../src/vikgpslayer.c:1602 +msgid "Are you sure you want to delete GPS Download data?" +msgstr "" + +#: ../src/vikgpslayer.c:1616 +msgid "Are you sure you want to delete GPS Realtime data?" +msgstr "" + +#: ../src/vikgpslayer.c:1630 +msgid "Are you sure you want to delete All GPS data?" +msgstr "" + +#: ../src/vikgpslayer.c:2004 +#, c-format +msgid "" +"Failed to connect to gpsd at %s (port %s)\n" +"Should Viking keep trying (every %d seconds)?" +msgstr "" + +#: ../src/viklayerspanel.c:73 +msgid "C_ut" +msgstr "" + +#: ../src/viklayerspanel.c:74 ../src/vikwindow.c:4882 +msgid "_Copy" +msgstr "" + +#: ../src/viklayerspanel.c:75 ../src/vikwindow.c:4883 +msgid "_Paste" +msgstr "" + +#: ../src/viklayerspanel.c:76 ../src/vikwindow.c:4884 +msgid "_Delete" +msgstr "" + +#: ../src/viklayerspanel.c:154 +msgid "New Layer" +msgstr "" + +#: ../src/viklayerspanel.c:347 +msgid "Top Layer" +msgstr "Camada Top" + +#: ../src/viklayerspanel.c:363 +msgid "Add new layer" +msgstr "Adicionar nova camada" + +#: ../src/viklayerspanel.c:370 ../src/vikwindow.c:4884 +msgid "Remove selected layer" +msgstr "Remover camada selecionada" + +#: ../src/viklayerspanel.c:377 +msgid "Move selected layer up" +msgstr "Mover camada selecionada para cima" + +#: ../src/viklayerspanel.c:384 +msgid "Move selected layer down" +msgstr "Mover camada selecionada para baixo" + +#: ../src/viklayerspanel.c:391 ../src/vikwindow.c:4881 +msgid "Cut selected layer" +msgstr "Cortar camada selecionada" + +#: ../src/viklayerspanel.c:398 ../src/vikwindow.c:4882 +msgid "Copy selected layer" +msgstr "Copiar camada selecionada" + +#: ../src/viklayerspanel.c:405 ../src/vikwindow.c:4883 +msgid "" +"Paste layer into selected container layer or otherwise above selected layer" +msgstr "" + +#: ../src/viklayerspanel.c:502 +msgid "New name can not be blank." +msgstr "" + +#: ../src/viklayerspanel.c:751 +msgid "Aggregate Layers have no settable properties." +msgstr "Camadas De agregação possuem propriedades configuráveis​​." + +#: ../src/viklayerspanel.c:798 +msgid "You cannot cut the Top Layer." +msgstr "Você não pode cortar a camada superior." + +#: ../src/viklayerspanel.c:843 +#, c-format +msgid "Are you sure you want to delete %s?" +msgstr "" + +#: ../src/viklayerspanel.c:863 +msgid "You cannot delete the Top Layer." +msgstr "Você não pode excluir a camada superior." + +#: ../src/vikmapniklayer.c:78 +msgid "CSS (MML) Config File:" +msgstr "" + +#: ../src/vikmapniklayer.c:79 +msgid "CartoCSS configuration file" +msgstr "" + +#: ../src/vikmapniklayer.c:80 +msgid "XML Config File:" +msgstr "" + +#: ../src/vikmapniklayer.c:81 +msgid "Mapnik XML configuration file" +msgstr "" + +#: ../src/vikmapniklayer.c:84 +msgid "Use File Cache:" +msgstr "" + +#: ../src/vikmapniklayer.c:86 +msgid "File Cache Directory:" +msgstr "" + +#: ../src/vikmapniklayer.c:122 +msgid "_Mapnik Features" +msgstr "" + +#: ../src/vikmapniklayer.c:122 +msgid "Mapnik Features" +msgstr "" + +#: ../src/vikmapniklayer.c:140 +msgid "Mapnik Rendering" +msgstr "" + +#. Changing these values only applies before first mapnik layer is 'created' +#: ../src/vikmapniklayer.c:258 +msgid "Plugins Directory:" +msgstr "" + +#: ../src/vikmapniklayer.c:258 ../src/vikmapniklayer.c:259 +#: ../src/vikmapniklayer.c:260 ../src/vikmapniklayer.c:261 +msgid "You need to restart Viking for a change to this value to be used" +msgstr "" + +#: ../src/vikmapniklayer.c:259 +msgid "Fonts Directory:" +msgstr "" + +#: ../src/vikmapniklayer.c:260 +msgid "Recurse Fonts Directory:" +msgstr "" + +#: ../src/vikmapniklayer.c:261 +msgid "Rerender Timeout (hours):" +msgstr "" + +#. Changeable any time +#: ../src/vikmapniklayer.c:263 +msgid "CartoCSS:" +msgstr "" + +#: ../src/vikmapniklayer.c:263 +msgid "The program to convert CartoCSS files into Mapnik XML" +msgstr "" + +#: ../src/vikmapniklayer.c:506 +msgid "Running" +msgstr "" + +#: ../src/vikmapniklayer.c:525 +#, c-format +msgid "" +"Error running carto command:\n" +"%s" +msgstr "" + +#: ../src/vikmapniklayer.c:561 +msgid " completed in " +msgstr "" + +#: ../src/vikmapniklayer.c:561 +msgid "seconds" +msgstr "" + +#: ../src/vikmapniklayer.c:611 ../src/vikmapniklayer.c:979 +#, c-format +msgid "" +"Mapnik error loading configuration file:\n" +"%s" +msgstr "" + +#: ../src/vikmapniklayer.c:749 +#, c-format +msgid "Mapnik Render %d:%d:%d %s" +msgstr "" + +#: ../src/vikmapniklayer.c:840 +msgid "Mapnik Rendering must be in Mercator mode" +msgstr "" + +#: ../src/vikmapniklayer.c:997 +msgid "Mapnik Information" +msgstr "" + +#: ../src/vikmapniklayer.c:1031 +msgid "_Flush Memory Cache" +msgstr "" + +#: ../src/vikmapniklayer.c:1044 +msgid "_Run Carto Command" +msgstr "" + +#: ../src/vikmapniklayer.c:1102 ../src/vikmapslayer.c:2029 +#, c-format +msgid "Tile File Timestamp: %s" +msgstr "" + +#: ../src/vikmapniklayer.c:1105 ../src/vikmapslayer.c:2032 +msgid "Tile File Timestamp: Not Available" +msgstr "" + +#: ../src/vikmapniklayer.c:1120 +#, c-format +msgid "Rendering time %.2f seconds" +msgstr "" + +#: ../src/vikmapniklayer.c:1124 ../src/vikmapslayer.c:2042 +msgid "Tile Information" +msgstr "" + +#: ../src/vikmapniklayer.c:1145 +msgid "_Rerender Tile" +msgstr "" + +#: ../src/vikmapniklayer.c:1150 +msgid "_Info" +msgstr "" + +#. ******* MAPZOOMS ******** +#: ../src/vikmapslayer.c:96 +msgid "Use Viking Zoom Level" +msgstr "Usar Nível de Zoom de Viking" + +#: ../src/vikmapslayer.c:146 +msgid "OSM" +msgstr "" + +#. NB mode => id - But can't break file format just to rename something better +#: ../src/vikmapslayer.c:152 +msgid "Map Type:" +msgstr "Tipo do Mapa:" + +#: ../src/vikmapslayer.c:153 +msgid "Maps Directory:" +msgstr "Lista de Mapas:" + +#: ../src/vikmapslayer.c:154 +msgid "Cache Layout:" +msgstr "" + +#: ../src/vikmapslayer.c:155 +msgid "This determines the tile storage layout on disk" +msgstr "" + +#: ../src/vikmapslayer.c:156 +msgid "Map File:" +msgstr "" + +#: ../src/vikmapslayer.c:157 +msgid "An MBTiles file. Only applies when the map type method is 'MBTiles'" +msgstr "" + +#: ../src/vikmapslayer.c:159 +msgid "Control the Alpha value for transparency effects" +msgstr "" + +#: ../src/vikmapslayer.c:160 +msgid "Autodownload maps:" +msgstr "Baixar Mapas Automaticamente :" + +#: ../src/vikmapslayer.c:161 +msgid "Autodownload Only Gets Missing Maps:" +msgstr "" + +#: ../src/vikmapslayer.c:162 +msgid "" +"Using this option avoids attempting to update already acquired tiles. This " +"can be useful if you want to restrict the network usage, without having to " +"resort to manual control. Only applies when 'Autodownload Maps' is on." +msgstr "" + +#: ../src/vikmapslayer.c:163 +msgid "Zoom Level:" +msgstr "Nível de Zoom:" + +#: ../src/vikmapslayer.c:164 +msgid "" +"Determines the method of displaying map tiles for the current zoom level. " +"'Viking Zoom Level' uses the best matching level, otherwise setting a fixed " +"value will always use map tiles of the specified value regardless of the " +"actual zoom level." +msgstr "" + +#: ../src/vikmapslayer.c:197 +msgid "_Maps Download" +msgstr "" + +#: ../src/vikmapslayer.c:197 +msgid "Maps Download" +msgstr "Baixar Mapas" + +#: ../src/vikmapslayer.c:213 ../src/vikutils.c:895 +msgid "Map" +msgstr "Mapa" + +#: ../src/vikmapslayer.c:306 +msgid "Default map layer directory:" +msgstr "" + +#: ../src/vikmapslayer.c:306 +msgid "Choose a directory to store cached Map tiles for this layer" +msgstr "" + +#: ../src/vikmapslayer.c:436 ../src/vikmapslayer.c:633 +msgid "Unknown map type" +msgstr "Tipo de mapa desconhecido" + +#: ../src/vikmapslayer.c:664 +msgid "Unknown Map Zoom" +msgstr "Mapa Zoom Desconhecido" + +#: ../src/vikmapslayer.c:833 +#, c-format +msgid "Failed to open MBTiles file: %s" +msgstr "" + +#: ../src/vikmapslayer.c:856 +#, c-format +msgid "" +"New map cannot be displayed in the current drawmode.\n" +"Select \"%s\" from View menu to view it." +msgstr "" +"Novo mapa não pode ser exibido no DrawMode atual.\n" +"Selecione \"%s\" no menu Exibir para visualizá-lo." + +#: ../src/vikmapslayer.c:1314 +#, c-format +msgid "" +"Cowardly refusing to draw tiles or existence of tiles beyond %d zoom out " +"factor" +msgstr "" +"Recusando a tirar as telhas ou a existência de telhas além zoom factor %d" + +#. TODO: ?? count up the number of download errors somehow... +#: ../src/vikmapslayer.c:1667 +msgid "Failed to download tile" +msgstr "" + +#: ../src/vikmapslayer.c:1673 +msgid "Unable to save tile" +msgstr "" + +#: ../src/vikmapslayer.c:1799 +#, c-format +msgid "Redownloading up to %d %s map..." +msgid_plural "Redownloading up to %d %s maps..." +msgstr[0] "Baixar novamente até %d%s mapa..." +msgstr[1] "Baixar novamente até %d%s mapas..." + +#: ../src/vikmapslayer.c:1801 +#, c-format +msgid "Redownloading %d %s map..." +msgid_plural "Redownloading %d %s maps..." +msgstr[0] "Baixar novamente %d%s mapa..." +msgstr[1] "Baixar novamente %d%s mapas..." + +#: ../src/vikmapslayer.c:1805 ../src/vikmapslayer.c:1890 +#, c-format +msgid "Downloading %d %s map..." +msgid_plural "Downloading %d %s maps..." +msgstr[0] "Baixando %d%s mapa..." +msgstr[1] "Baixando %d%s mapas..." + +#: ../src/vikmapslayer.c:1969 +msgid "YES" +msgstr "" + +#: ../src/vikmapslayer.c:1973 ../src/vikmapslayer.c:1977 +msgid "NO" +msgstr "" + +#. NB Also handles .jpg automatically due to pixbuf_new_from () support - although just print png for now. +#: ../src/vikmapslayer.c:1980 +#, c-format +msgid "Source: %s (%d%s%d%s%d.%s %s)" +msgstr "" + +#: ../src/vikmapslayer.c:1983 +msgid "Source: Not available" +msgstr "" + +#: ../src/vikmapslayer.c:2000 +msgid "Source: file://" +msgstr "" + +#: ../src/vikmapslayer.c:2012 +#, c-format +msgid "Source: %s" +msgstr "" + +#: ../src/vikmapslayer.c:2038 +#, c-format +msgid "Tile File: %s [Not Available]" +msgstr "" + +#: ../src/vikmapslayer.c:2086 +msgid "Redownload _Bad Map(s)" +msgstr "Fazer novo download de Mapa _Bad(s)" + +#: ../src/vikmapslayer.c:2090 +msgid "Redownload _New Map(s)" +msgstr "Fazer novo download de Novo (s) _Mapa(s)" + +#: ../src/vikmapslayer.c:2094 +msgid "Redownload _All Map(s)" +msgstr "Fazer novo download de _Todos os _Mapa(s)" + +#: ../src/vikmapslayer.c:2099 +msgid "_Show Tile Information" +msgstr "" + +#: ../src/vikmapslayer.c:2166 +#, c-format +msgid "" +"Wrong drawmode for this map.\n" +"Select \"%s\" from View menu and try again." +msgstr "" +"DrawMode errado para este mapa.\n" +"Selecione \"%s\", no menu Exibir e tente novamente." + +#: ../src/vikmapslayer.c:2171 +msgid "Wrong zoom level for this map." +msgstr "Nível de zoom errado para este mapa." + +#: ../src/vikmapslayer.c:2334 +msgid "Zoom Start:" +msgstr "" + +#: ../src/vikmapslayer.c:2341 +msgid "Zoom End:" +msgstr "" + +#: ../src/vikmapslayer.c:2347 +msgid "Download Maps Method:" +msgstr "" + +#. redownload method - needs to align with REDOWNLOAD* macro values +#: ../src/vikmapslayer.c:2419 +msgid "Missing" +msgstr "" + +#: ../src/vikmapslayer.c:2419 +msgid "Bad" +msgstr "" + +#: ../src/vikmapslayer.c:2419 +msgid "New" +msgstr "" + +#: ../src/vikmapslayer.c:2419 +msgid "Reload All" +msgstr "" + +#: ../src/vikmapslayer.c:2421 +msgid "Download for Zoom Levels" +msgstr "" + +#: ../src/vikmapslayer.c:2461 +#, c-format +msgid "" +"You are not allowed to download more than %d tiles in one go (requested %d)" +msgstr "" + +#: ../src/vikmapslayer.c:2469 +#, c-format +msgid "Do you really want to download %d tiles?" +msgstr "" + +#. Now with icons +#: ../src/vikmapslayer.c:2509 +msgid "Download _Missing Onscreen Maps" +msgstr "Baixar _Mapas Que Faltam na Tela" + +#: ../src/vikmapslayer.c:2516 +msgid "Download _New Onscreen Maps" +msgstr "Baixar Novo(s) _Mapas na Tela" + +#: ../src/vikmapslayer.c:2523 +msgid "Reload _All Onscreen Maps" +msgstr "Atualizar _Todos os Mapas na Tela" + +#: ../src/vikmapslayer.c:2529 +msgid "Download Maps in _Zoom Levels..." +msgstr "" + +#: ../src/vikmapslayer.c:2539 +#, fuzzy +msgid "_Open MBTiles Files" +msgstr "Abrir_ Arquivo Recente" + +#: ../src/vikmapslayer.c:2554 +msgid "Flush Map Cache" +msgstr "" + +#: ../src/vikrouting.c:54 +msgid "Default engine:" +msgstr "" + +#: ../src/vikrouting.c:68 +msgid "Routing" +msgstr "" + +#: ../src/viktreeview.c:347 +msgid "Layer Name" +msgstr "Nome da Camada" + +#: ../src/viktreeview.c:924 +#, c-format +msgid "delete data from %s\n" +msgstr "excluir dados de %s\n" + +#: ../src/viktrwlayer.c:427 +msgid "Create _Waypoint" +msgstr "" + +#: ../src/viktrwlayer.c:427 +msgid "Create Waypoint" +msgstr "Criar Waypoint" + +#: ../src/viktrwlayer.c:437 +#, fuzzy +msgid "Edit _Track" +msgstr "Editar Trackpoint" + +#: ../src/viktrwlayer.c:437 +#, fuzzy +msgid "Edit Track" +msgstr "Editar Trackpoint" + +#: ../src/viktrwlayer.c:449 +msgid "Edit _Route" +msgstr "" + +#: ../src/viktrwlayer.c:449 +#, fuzzy +msgid "Edit Route" +msgstr "Editar Waypoint" + +#: ../src/viktrwlayer.c:460 +msgid "Route _Finder" +msgstr "" + +#: ../src/viktrwlayer.c:460 +msgid "Route Finder" +msgstr "" + +#: ../src/viktrwlayer.c:471 +#, fuzzy +msgid "Splitter" +msgstr "Dividir Aqui" + +#: ../src/viktrwlayer.c:482 +msgid "_Edit Waypoint" +msgstr "" + +#: ../src/viktrwlayer.c:482 +msgid "Edit Waypoint" +msgstr "Editar Waypoint" + +#: ../src/viktrwlayer.c:495 +msgid "Edit Trac_kpoint" +msgstr "" + +#: ../src/viktrwlayer.c:495 +msgid "Edit Trackpoint" +msgstr "Editar Trackpoint" + +#. a pixbuf for this one is already made globally available +#: ../src/viktrwlayer.c:508 +msgid "Show P_icture" +msgstr "" + +#: ../src/viktrwlayer.c:508 +msgid "Show Picture" +msgstr "Mostrar Imagem" + +#: ../src/viktrwlayer.c:531 +msgid "Waypoint Images" +msgstr "Imagens Waypoint" + +#: ../src/viktrwlayer.c:531 +msgid "Tracks Advanced" +msgstr "" + +#: ../src/viktrwlayer.c:531 +msgid "Metadata" +msgstr "" + +#: ../src/viktrwlayer.c:531 +msgid "Filesystem" +msgstr "" + +#: ../src/viktrwlayer.c:534 +msgid "Draw by Track" +msgstr "Empate por Faixa" + +#: ../src/viktrwlayer.c:534 +msgid "Draw by Speed" +msgstr "" + +#: ../src/viktrwlayer.c:534 +msgid "All Tracks Same Color" +msgstr "" + +#: ../src/viktrwlayer.c:535 +msgid "Filled Square" +msgstr "Quadrado Preenchido" + +#: ../src/viktrwlayer.c:535 +msgid "Square" +msgstr "Quadrado" + +#: ../src/viktrwlayer.c:535 +msgid "Circle" +msgstr "Círculo" + +#: ../src/viktrwlayer.c:535 +msgid "X" +msgstr "X" + +#: ../src/viktrwlayer.c:561 +msgid "Extra Extra Small" +msgstr "" + +#: ../src/viktrwlayer.c:562 +msgid "Extra Small" +msgstr "" + +#: ../src/viktrwlayer.c:566 +msgid "Extra Large" +msgstr "" + +#: ../src/viktrwlayer.c:567 +msgid "Extra Extra Large" +msgstr "" + +#: ../src/viktrwlayer.c:573 +msgid "Name Ascending" +msgstr "" + +#: ../src/viktrwlayer.c:574 +msgid "Name Descending" +msgstr "" + +#: ../src/viktrwlayer.c:582 ../src/viktrwlayer_propwin.c:3319 +msgid "No" +msgstr "" + +#: ../src/viktrwlayer.c:583 +msgid "Yes" +msgstr "" + +#: ../src/viktrwlayer.c:584 +msgid "No write" +msgstr "" + +#: ../src/viktrwlayer.c:649 ../src/viktrwlayer.c:673 +msgid "Draw Labels" +msgstr "Desenhar Marcadores" + +#: ../src/viktrwlayer.c:650 +msgid "Note: the individual track controls what labels may be displayed" +msgstr "" + +#: ../src/viktrwlayer.c:651 +msgid "Track Labels Font Size:" +msgstr "" + +#: ../src/viktrwlayer.c:652 +msgid "Track Drawing Mode:" +msgstr "Modo Faixa de Desenho:" + +#: ../src/viktrwlayer.c:653 +msgid "All Tracks Color:" +msgstr "" + +#: ../src/viktrwlayer.c:654 +msgid "The color used when 'All Tracks Same Color' drawing mode is selected" +msgstr "" + +#: ../src/viktrwlayer.c:655 +msgid "Draw Track Lines" +msgstr "Desenhar Trajetórias de Busca" + +#: ../src/viktrwlayer.c:656 +msgid "Track Thickness:" +msgstr "Espessura da Faixa:" + +#: ../src/viktrwlayer.c:657 +msgid "Draw Track Direction" +msgstr "" + +#: ../src/viktrwlayer.c:658 +msgid "Direction Size:" +msgstr "" + +#: ../src/viktrwlayer.c:659 +msgid "Draw Trackpoints" +msgstr "Desenhar Trilhas" + +#: ../src/viktrwlayer.c:660 +msgid "Trackpoint Size:" +msgstr "" + +#: ../src/viktrwlayer.c:661 +msgid "Draw Elevation" +msgstr "Desenhar Elevação" + +#: ../src/viktrwlayer.c:662 +msgid "Draw Elevation Height %:" +msgstr "Desenhar Altura de Elevação" + +#: ../src/viktrwlayer.c:663 +msgid "Draw Stops" +msgstr "Desenhar Paradas" + +#: ../src/viktrwlayer.c:664 +msgid "" +"Whether to draw a marker when trackpoints are at the same position but over " +"the minimum stop length apart in time" +msgstr "" + +#: ../src/viktrwlayer.c:665 +msgid "Min Stop Length (seconds):" +msgstr "Parar Duração de Minutos (segundos):" + +#: ../src/viktrwlayer.c:667 +msgid "Track BG Thickness:" +msgstr "Faixa Espessura BG:" + +#: ../src/viktrwlayer.c:668 +msgid "Track Background Color" +msgstr "Cor de Fundo da Faixa" + +#: ../src/viktrwlayer.c:669 +msgid "Draw by Speed Factor (%):" +msgstr "" + +#: ../src/viktrwlayer.c:670 +msgid "" +"The percentage factor away from the average speed determining the color used" +msgstr "" + +#: ../src/viktrwlayer.c:671 +msgid "Track Sort Order:" +msgstr "" + +#: ../src/viktrwlayer.c:674 +msgid "Waypoint Font Size:" +msgstr "" + +#: ../src/viktrwlayer.c:675 +msgid "Waypoint Color:" +msgstr "Cor do Waypoint:" + +#: ../src/viktrwlayer.c:676 +msgid "Waypoint Text:" +msgstr "Texto dos Waypoints:" + +#: ../src/viktrwlayer.c:677 +msgid "Background:" +msgstr "Segundo plano:" + +#: ../src/viktrwlayer.c:678 +msgid "Fake BG Color Translucency:" +msgstr "Falsos translucidez da cor de BG:" + +#: ../src/viktrwlayer.c:679 +msgid "Waypoint marker:" +msgstr "Marcador do Waypoint:" + +#: ../src/viktrwlayer.c:680 +msgid "Waypoint size:" +msgstr "Tamanho do Waypoint:" + +#: ../src/viktrwlayer.c:681 +msgid "Draw Waypoint Symbols:" +msgstr "Desenhar Símbolos do Waypoint:" + +#: ../src/viktrwlayer.c:682 +msgid "Waypoint Sort Order:" +msgstr "" + +#: ../src/viktrwlayer.c:684 +msgid "Draw Waypoint Images" +msgstr "Desenhar Imagens do Waypoint:" + +#: ../src/viktrwlayer.c:685 +msgid "Image Size (pixels):" +msgstr "Tamanho da Imagem (pixels):" + +#: ../src/viktrwlayer.c:686 +msgid "Image Alpha:" +msgstr "Imagem Alpha:" + +#: ../src/viktrwlayer.c:687 +msgid "Image Memory Cache Size:" +msgstr "Imagem de Tamanho do Cache de Memória:" + +#: ../src/viktrwlayer.c:690 +msgid "Author" +msgstr "" + +#: ../src/viktrwlayer.c:691 +msgid "Creation Time" +msgstr "" + +#: ../src/viktrwlayer.c:692 +msgid "Keywords" +msgstr "" + +#: ../src/viktrwlayer.c:693 +msgid "External layer:" +msgstr "" + +#: ../src/viktrwlayer.c:693 +msgid "" +"Layer data stored in the Viking file, in an external file, or in an external " +"file but changes are not written to the file (file only loaded at startup)" +msgstr "" + +#: ../src/viktrwlayer.c:694 +msgid "Save layer as:" +msgstr "" + +#: ../src/viktrwlayer.c:694 +msgid "Specify where layer should be saved. Overwrites file if it exists." +msgstr "" + +#: ../src/viktrwlayer.c:798 +msgid "TrackWaypoint" +msgstr "" + +#: ../src/viktrwlayer.c:1999 ../src/viktrwlayer_propwin.c:1469 +#: ../src/viktrwlayer_propwin.c:1471 ../src/vikutils.c:299 +#: ../src/vikutils.c:326 +msgid "miles" +msgstr "" + +#: ../src/viktrwlayer.c:2002 ../src/viktrwlayer_propwin.c:1475 +#: ../src/viktrwlayer_propwin.c:1477 ../src/vikutils.c:303 +#: ../src/vikutils.c:330 +msgid "NM" +msgstr "" + +#. VIK_UNITS_DISTANCE_KILOMETRES: +#: ../src/viktrwlayer.c:2006 ../src/viktrwlayer_propwin.c:1482 +#: ../src/viktrwlayer_propwin.c:1484 ../src/vikutils.c:308 +#: ../src/vikutils.c:335 +msgid "km" +msgstr "" + +#: ../src/viktrwlayer.c:2121 +msgid "start/end" +msgstr "" + +#: ../src/viktrwlayer.c:2133 +msgid "start" +msgstr "" + +#: ../src/viktrwlayer.c:2142 +msgid "end" +msgstr "" + +#: ../src/viktrwlayer.c:3103 +#, c-format +msgid " in %d:%02d hrs:mins" +msgstr " em %d:%02d hrs:mins" + +#: ../src/viktrwlayer.c:3107 +#, c-format +msgid "" +"\n" +"%sTotal Length %.1f %s%s" +msgstr "" +"\n" +"%sComprimento Total %.1f %s%s" + +#: ../src/viktrwlayer.c:3131 +#, c-format +msgid "" +"\n" +"Total route length %.1f %s" +msgstr "" + +#: ../src/viktrwlayer.c:3136 +#, c-format +msgid "Tracks: %d - Waypoints: %d - Routes: %d%s%s" +msgstr "" + +#: ../src/viktrwlayer.c:3155 +#, c-format +msgid "Tracks: %d" +msgstr "" + +#: ../src/viktrwlayer.c:3165 +#, c-format +msgid "Routes: %d" +msgstr "" + +#: ../src/viktrwlayer.c:3195 +#, c-format +msgid "- %d:%02d hrs:mins" +msgstr "- %d:%02d hrs:mins" + +#: ../src/viktrwlayer.c:3202 +#, c-format +msgid "%s%.1f km %s" +msgstr "%s%.1f km %s" + +#: ../src/viktrwlayer.c:3205 +#, c-format +msgid "%s%.1f miles %s" +msgstr "%s%.1f milhas %s" + +#: ../src/viktrwlayer.c:3208 +#, c-format +msgid "%s%.1f NM %s" +msgstr "" + +#: ../src/viktrwlayer.c:3222 +#, c-format +msgid "Waypoints: %d" +msgstr "" + +#: ../src/viktrwlayer.c:3279 +#, c-format +msgid "Wpt: Alt %dft" +msgstr "" + +#. VIK_UNITS_HEIGHT_METRES: +#: ../src/viktrwlayer.c:3283 +#, c-format +msgid "Wpt: Alt %dm" +msgstr "" + +#. Add comment if available +#: ../src/viktrwlayer.c:3298 +#, c-format +msgid "%s | %s %s | Comment: %s" +msgstr "" + +#: ../src/viktrwlayer.c:3300 +#, c-format +msgid "%s | %s %s" +msgstr "" + +#: ../src/viktrwlayer.c:3562 ../src/viktrwlayer.c:3591 +msgid "This layer has no waypoints or trackpoints." +msgstr "Essa camada não tem waypoints ou trackpoints." + +#: ../src/viktrwlayer.c:3598 ../src/viktrwlayer.c:3607 +#: ../src/viktrwlayer.c:3616 ../src/viktrwlayer.c:3625 +#: ../src/viktrwlayer.c:3634 ../src/viktrwlayer.c:3642 +msgid "Export Layer" +msgstr "Exportar Camada" + +#: ../src/viktrwlayer.c:3671 +msgid "Export Route as GPX" +msgstr "" + +#: ../src/viktrwlayer.c:3673 +msgid "Export Track as GPX" +msgstr "Exportar Faixa como GPX" + +#: ../src/viktrwlayer.c:3693 +msgid "Find" +msgstr "Buscar" + +#: ../src/viktrwlayer.c:3703 +msgid "Waypoint Name:" +msgstr "Nome de Waypoint:" + +#: ../src/viktrwlayer.c:3720 +msgid "Waypoint not found in this layer." +msgstr "Waypoint não encontrado nesta camada." + +#: ../src/viktrwlayer.c:3989 +msgid "Can not upload invisible track." +msgstr "" + +#: ../src/viktrwlayer.c:4082 ../src/viktrwlayer.c:10512 +msgid "Track" +msgstr "Faixa" + +#: ../src/viktrwlayer.c:4107 ../src/viktrwlayer.c:10599 +msgid "Route" +msgstr "" + +#: ../src/viktrwlayer.c:4194 +msgid "Externa_l" +msgstr "" + +#: ../src/viktrwlayer.c:4216 ../src/viktrwlayer.c:8456 +#: ../src/viktrwlayer.c:8574 +msgid "_Finish Route" +msgstr "" + +#: ../src/viktrwlayer.c:4218 ../src/viktrwlayer.c:8380 +#: ../src/viktrwlayer.c:8572 +msgid "_Finish Track" +msgstr "" + +#. Now with icons +#: ../src/viktrwlayer.c:4230 +msgid "_View Layer" +msgstr "_Ver Camada" + +#: ../src/viktrwlayer.c:4237 +msgid "V_iew" +msgstr "" + +#: ../src/viktrwlayer.c:4243 +msgid "View All _Tracks" +msgstr "" + +#: ../src/viktrwlayer.c:4248 +msgid "View All _Routes" +msgstr "" + +#: ../src/viktrwlayer.c:4253 +msgid "View All _Waypoints" +msgstr "" + +#: ../src/viktrwlayer.c:4258 +msgid "_Goto Center of Layer" +msgstr "Centro de Camada Goto" + +#: ../src/viktrwlayer.c:4264 ../src/viktrwlayer.c:8321 +msgid "Goto _Waypoint..." +msgstr "" + +#: ../src/viktrwlayer.c:4270 +msgid "_Export Layer" +msgstr "_Exportar Camada" + +#: ../src/viktrwlayer.c:4276 +msgid "Export as GPS_Point..." +msgstr "" + +#: ../src/viktrwlayer.c:4281 +msgid "Export as GPS_Mapper..." +msgstr "" + +#: ../src/viktrwlayer.c:4286 +msgid "Export as _GPX..." +msgstr "" + +#: ../src/viktrwlayer.c:4292 +msgid "Export as _KML..." +msgstr "" + +#: ../src/viktrwlayer.c:4299 +msgid "Export as GEO_JSON..." +msgstr "" + +#: ../src/viktrwlayer.c:4306 +msgid "Export via GPSbabel..." +msgstr "" + +#: ../src/viktrwlayer.c:4312 +#, c-format +msgid "Open with External Program_1: %s" +msgstr "" + +#: ../src/viktrwlayer.c:4319 +#, c-format +msgid "Open with External Program_2: %s" +msgstr "" + +#: ../src/viktrwlayer.c:4327 ../src/vikwindow.c:4825 +msgid "_New" +msgstr "_Novo" + +#: ../src/viktrwlayer.c:4333 +msgid "New _Waypoint..." +msgstr "" + +#: ../src/viktrwlayer.c:4339 +msgid "New _Track" +msgstr "" + +#: ../src/viktrwlayer.c:4347 +msgid "New _Route" +msgstr "" + +#: ../src/viktrwlayer.c:4356 ../src/viktrwlayer.c:8232 +#: ../src/viktrwlayer.c:9003 +msgid "Geotag _Images..." +msgstr "" + +#: ../src/viktrwlayer.c:4363 +msgid "_Acquire" +msgstr "" + +#: ../src/viktrwlayer.c:4369 ../src/vikwindow.c:4904 +msgid "From _GPS..." +msgstr "De_GPS..." + +#. FIXME: only add menu when at least a routing engine has support for Directions +#: ../src/viktrwlayer.c:4375 +msgid "From _Directions..." +msgstr "" + +#: ../src/viktrwlayer.c:4381 +msgid "From _OSM Traces..." +msgstr "" + +#: ../src/viktrwlayer.c:4386 +msgid "From _My OSM Traces..." +msgstr "" + +#: ../src/viktrwlayer.c:4392 ../src/vikwindow.c:4844 +msgid "From _URL..." +msgstr "" + +#: ../src/viktrwlayer.c:4399 ../src/vikwindow.c:4846 +msgid "From _Wikipedia Waypoints" +msgstr "" + +#: ../src/viktrwlayer.c:4405 +msgid "Within _Layer Bounds" +msgstr "Dentro dos Limites da _Camada" + +#: ../src/viktrwlayer.c:4411 +msgid "Within _Current View" +msgstr "Dentro do_Modo de Exibição Atual" + +#: ../src/viktrwlayer.c:4419 +msgid "From Geo_caching..." +msgstr "" + +#: ../src/viktrwlayer.c:4426 ../src/vikwindow.c:4842 +msgid "From Geotagged _Images..." +msgstr "" + +#: ../src/viktrwlayer.c:4433 +msgid "From _File..." +msgstr "" + +#: ../src/viktrwlayer.c:4436 ../src/vikwindow.c:4905 +msgid "Import File With GPS_Babel..." +msgstr "" + +#: ../src/viktrwlayer.c:4443 ../src/viktrwlayer.c:8905 +msgid "_Upload" +msgstr "" + +#: ../src/viktrwlayer.c:4449 +msgid "Upload to _GPS..." +msgstr "" + +#: ../src/viktrwlayer.c:4456 ../src/viktrwlayer.c:8973 +msgid "Upload to _OSM..." +msgstr "" + +#: ../src/viktrwlayer.c:4464 +msgid "De_lete" +msgstr "" + +#: ../src/viktrwlayer.c:4470 +msgid "Delete All _Tracks" +msgstr "" + +#: ../src/viktrwlayer.c:4477 +msgid "Delete Tracks _From Selection..." +msgstr "" + +#: ../src/viktrwlayer.c:4484 ../src/viktrwlayer.c:8481 +msgid "Delete _All Routes" +msgstr "" + +#: ../src/viktrwlayer.c:4491 ../src/viktrwlayer.c:8487 +msgid "_Delete Routes From Selection..." +msgstr "" + +#: ../src/viktrwlayer.c:4498 +msgid "Delete All _Waypoints" +msgstr "" + +#: ../src/viktrwlayer.c:4505 +msgid "Delete Waypoints From _Selection..." +msgstr "" + +#: ../src/viktrwlayer.c:4512 ../src/viktrwlayer.c:8339 +#, fuzzy +msgid "Delete Duplicate Waypoints" +msgstr "Remover Waypoints duplicados" + +#: ../src/viktrwlayer.c:5198 +#, c-format +msgid "Are you sure you want to delete all tracks in %s?" +msgstr "" + +#: ../src/viktrwlayer.c:5211 +#, c-format +msgid "Are you sure you want to delete all routes in %s?" +msgstr "" + +#: ../src/viktrwlayer.c:5221 +#, c-format +msgid "Are you sure you want to delete all waypoints in %s?" +msgstr "" + +#: ../src/viktrwlayer.c:5238 +#, c-format +msgid "Are you sure you want to delete the waypoint \"%s\"?" +msgstr "" + +#: ../src/viktrwlayer.c:5254 +#, c-format +msgid "Are you sure you want to delete the track \"%s\"?" +msgstr "" + +#: ../src/viktrwlayer.c:5271 +#, c-format +msgid "Are you sure you want to delete the route \"%s\"?" +msgstr "" + +#: ../src/viktrwlayer.c:5527 ../src/viktrwlayer.c:6373 +msgid "" +"Converting a track to a route removes extra track data such as segments, " +"timestamps, etc...\n" +"Do you want to continue?" +msgstr "" + +#: ../src/viktrwlayer.c:5631 +msgid "No DEM layers available, thus no DEM values can be applied." +msgstr "" + +#: ../src/viktrwlayer.c:5651 ../src/viktrwlayer.c:5692 +#, c-format +msgid "%ld point adjusted" +msgid_plural "%ld points adjusted" +msgstr[0] "" +msgstr[1] "" + +#: ../src/viktrwlayer.c:5736 +#, c-format +msgid "%ld waypoint changed" +msgid_plural "%ld waypoints changed" +msgstr[0] "" +msgstr[1] "" + +#: ../src/viktrwlayer.c:5917 +#, c-format +msgid "" +"Refining a track with many points (%d) is unlikely to yield sensible " +"results. Do you want to Continue?" +msgstr "" + +#. Select engine from dialog +#: ../src/viktrwlayer.c:5925 +msgid "Refine Route with Routing Engine..." +msgstr "" + +#: ../src/viktrwlayer.c:5933 +msgid "Select routing engine" +msgstr "" + +#: ../src/viktrwlayer.c:6158 +msgid "Failed. No other tracks with timestamps in this layer found" +msgstr "" + +#: ../src/viktrwlayer.c:6160 +msgid "Failed. No other tracks without timestamps in this layer found" +msgstr "" + +#: ../src/viktrwlayer.c:6179 +msgid "Merge with..." +msgstr "Mesclar com..." + +#: ../src/viktrwlayer.c:6180 +msgid "Select route to merge with" +msgstr "" + +#: ../src/viktrwlayer.c:6180 +msgid "Select track to merge with" +msgstr "Selecionar a faixa de fusão com a" + +#: ../src/viktrwlayer.c:6264 ../src/viktrwlayer.c:6346 +msgid "Append Route" +msgstr "" + +#: ../src/viktrwlayer.c:6264 ../src/viktrwlayer.c:6346 +msgid "Append Track" +msgstr "" + +#: ../src/viktrwlayer.c:6265 +msgid "Select the route to append after the current route" +msgstr "" + +#: ../src/viktrwlayer.c:6266 +msgid "Select the track to append after the current track" +msgstr "" + +#: ../src/viktrwlayer.c:6347 +msgid "Select the track to append after the current route" +msgstr "" + +#: ../src/viktrwlayer.c:6348 +msgid "Select the route to append after the current track" +msgstr "" + +#: ../src/viktrwlayer.c:6414 +#, c-format +msgid "%d segment merged" +msgid_plural "%d segments merged" +msgstr[0] "" +msgstr[1] "" + +#: ../src/viktrwlayer.c:6430 +msgid "Failed. This track does not have timestamp" +msgstr "Falhou. Esta faixa não tem hora" + +#: ../src/viktrwlayer.c:6442 +msgid "Failed. No other track in this layer has timestamp" +msgstr "Falhou. Nenhuma uma outra faixa nesta camada tem hora" + +#: ../src/viktrwlayer.c:6449 +msgid "Merge Threshold..." +msgstr "Limite de Mesclagem ..." + +#: ../src/viktrwlayer.c:6450 +msgid "Merge when time between tracks less than:" +msgstr "Mesclar quando o tempo entre as faixas for inferior a:" + +#: ../src/viktrwlayer.c:6580 +msgid "Split Threshold..." +msgstr "Dividir Limite ..." + +#: ../src/viktrwlayer.c:6581 +msgid "Split when time between trackpoints exceeds:" +msgstr "Dividir, quando o tempo entre os trackpoints exceder:" + +#: ../src/viktrwlayer.c:6598 +#, c-format +msgid "" +"Can not split track due to trackpoints not ordered in time - such as at %s.\n" +"\n" +"Goto this trackpoint?" +msgstr "" + +#: ../src/viktrwlayer.c:6668 +msgid "Split Every Nth Point" +msgstr "Cada ponto de divisão Nth" + +#: ../src/viktrwlayer.c:6669 +msgid "Split on every Nth point:" +msgstr "Dividir em todos os pontos Nth:" + +#: ../src/viktrwlayer.c:6779 +msgid "Can not split track as it has no segments" +msgstr "" + +#: ../src/viktrwlayer.c:6861 ../src/viktrwlayer.c:6891 +#, c-format +msgid "Deleted %ld point" +msgid_plural "Deleted %ld points" +msgstr[0] "" +msgstr[1] "" + +#: ../src/viktrwlayer.c:6966 ../src/viktrwlayer.c:10989 +#: ../src/viktrwlayer_waypointlist.c:214 +#, c-format +msgid "Could not launch %s to open file." +msgstr "" + +#: ../src/viktrwlayer.c:6992 ../src/viktrwlayer.c:7113 +msgid "This track has no date information." +msgstr "" + +#: ../src/viktrwlayer.c:7006 ../src/viktrwlayer.c:7136 +msgid "This waypoint has no date information." +msgstr "" + +#: ../src/viktrwlayer.c:7030 +#, c-format +msgid "Could not launch %s" +msgstr "" + +#: ../src/viktrwlayer.c:7269 +msgid "Internal Error in vik_trw_layer_uniquify_tracks" +msgstr "" + +#: ../src/viktrwlayer.c:7374 ../src/viktrwlayer.c:7424 +#: ../src/viktrwlayer.c:7587 +msgid "" +"Multiple entries with the same name exist. This method only works with " +"unique names. Force unique names now?" +msgstr "" + +#: ../src/viktrwlayer.c:7385 +msgid "No tracks found" +msgstr "" + +#: ../src/viktrwlayer.c:7393 ../src/viktrwlayer.c:7443 +#: ../src/viktrwlayer.c:7607 +msgid "Delete Selection" +msgstr "" + +#: ../src/viktrwlayer.c:7394 +msgid "Select tracks to delete" +msgstr "" + +#: ../src/viktrwlayer.c:7435 +msgid "No routes found" +msgstr "" + +#: ../src/viktrwlayer.c:7444 +msgid "Select routes to delete" +msgstr "" + +#: ../src/viktrwlayer.c:7550 +msgid "Internal Error in vik_trw_layer_uniquify_waypoints" +msgstr "" + +#: ../src/viktrwlayer.c:7597 +msgid "No waypoints found" +msgstr "" + +#: ../src/viktrwlayer.c:7608 +msgid "Select waypoints to delete" +msgstr "" + +#: ../src/viktrwlayer.c:7691 +#, c-format +msgid "%ld waypoint deleted" +msgid_plural "%ld waypoints deleted" +msgstr[0] "" +msgstr[1] "" + +#: ../src/viktrwlayer.c:7697 +#, fuzzy +msgid "No duplicates found" +msgstr "Entradas não encontradas!" + +#: ../src/viktrwlayer.c:8028 +#, c-format +msgid "" +"A waypoint with the name \"%s\" already exists. Really rename to the same " +"name?" +msgstr "" + +#: ../src/viktrwlayer.c:8058 +#, c-format +msgid "" +"A track with the name \"%s\" already exists. Really rename to the same name?" +msgstr "" + +#: ../src/viktrwlayer.c:8095 +#, c-format +msgid "" +"A route with the name \"%s\" already exists. Really rename to the same name?" +msgstr "" + +#: ../src/viktrwlayer.c:8215 ../src/viktrwlayer.c:8602 +msgid "_Goto" +msgstr "_Goto" + +#: ../src/viktrwlayer.c:8226 +msgid "_Visit Geocache Webpage" +msgstr "_Visite Geocache Webpage" + +#: ../src/viktrwlayer.c:8235 +msgid "Geotag multiple images against this waypoint" +msgstr "" + +#: ../src/viktrwlayer.c:8245 ../src/viktrwlayer_waypointlist.c:352 +msgid "_Show Picture..." +msgstr "" + +#: ../src/viktrwlayer.c:8253 +msgid "Update Geotag on _Image" +msgstr "" + +#: ../src/viktrwlayer.c:8259 +msgid "_Update" +msgstr "" + +#: ../src/viktrwlayer.c:8264 +msgid "Update and _Keep File Timestamp" +msgstr "" + +#: ../src/viktrwlayer.c:8276 +msgid "Visit _Webpage" +msgstr "" + +#: ../src/viktrwlayer.c:8306 +msgid "_New Waypoint..." +msgstr "" + +#: ../src/viktrwlayer.c:8315 +msgid "_View All Waypoints" +msgstr "" + +#: ../src/viktrwlayer.c:8327 +msgid "Delete _All Waypoints" +msgstr "" + +#: ../src/viktrwlayer.c:8333 +msgid "_Delete Waypoints From Selection..." +msgstr "" + +#: ../src/viktrwlayer.c:8351 +msgid "_Show All Waypoints" +msgstr "" + +#: ../src/viktrwlayer.c:8357 +msgid "_Hide All Waypoints" +msgstr "" + +#: ../src/viktrwlayer.c:8369 +msgid "_List Waypoints..." +msgstr "" + +#: ../src/viktrwlayer.c:8390 +msgid "_View All Tracks" +msgstr "" + +#: ../src/viktrwlayer.c:8396 +msgid "_New Track" +msgstr "" + +#: ../src/viktrwlayer.c:8404 +msgid "Delete _All Tracks" +msgstr "" + +#: ../src/viktrwlayer.c:8410 +msgid "_Delete Tracks From Selection..." +msgstr "" + +#: ../src/viktrwlayer.c:8422 +msgid "_Show All Tracks" +msgstr "" + +#: ../src/viktrwlayer.c:8428 +msgid "_Hide All Tracks" +msgstr "" + +#: ../src/viktrwlayer.c:8439 +msgid "_List Tracks..." +msgstr "" + +#: ../src/viktrwlayer.c:8467 +msgid "_View All Routes" +msgstr "" + +#: ../src/viktrwlayer.c:8473 +msgid "_New Route" +msgstr "" + +#: ../src/viktrwlayer.c:8499 +msgid "_Show All Routes" +msgstr "" + +#: ../src/viktrwlayer.c:8505 +msgid "_Hide All Routes" +msgstr "" + +#: ../src/viktrwlayer.c:8516 +msgid "_List Routes..." +msgstr "" + +#: ../src/viktrwlayer.c:8587 +msgid "_View Track" +msgstr "_Visualização de faixa" + +#: ../src/viktrwlayer.c:8589 +msgid "_View Route" +msgstr "" + +#: ../src/viktrwlayer.c:8608 +msgid "_Startpoint" +msgstr "_Ponto inicial" + +#: ../src/viktrwlayer.c:8614 +msgid "\"_Center\"" +msgstr "\"_Centro\"" + +#: ../src/viktrwlayer.c:8620 +msgid "_Endpoint" +msgstr "_Ponto final" + +#: ../src/viktrwlayer.c:8626 +msgid "_Highest Altitude" +msgstr "_Maior altitude" + +#: ../src/viktrwlayer.c:8632 +msgid "_Lowest Altitude" +msgstr "_Menor altitude" + +#: ../src/viktrwlayer.c:8640 +msgid "_Maximum Speed" +msgstr "_Velocidade máxima" + +#: ../src/viktrwlayer.c:8646 +msgid "_Date" +msgstr "" + +#: ../src/viktrwlayer.c:8655 +msgid "Co_mbine" +msgstr "" + +#: ../src/viktrwlayer.c:8663 +msgid "_Merge By Time..." +msgstr "" + +#: ../src/viktrwlayer.c:8668 +msgid "Merge _Segments" +msgstr "" + +#: ../src/viktrwlayer.c:8675 +msgid "Merge _With Other Tracks..." +msgstr "Mesclar _Com Outras Faixas ..." + +#: ../src/viktrwlayer.c:8682 +msgid "_Append Track..." +msgstr "" + +#: ../src/viktrwlayer.c:8684 +msgid "_Append Route..." +msgstr "" + +#: ../src/viktrwlayer.c:8690 +msgid "Append _Route..." +msgstr "" + +#: ../src/viktrwlayer.c:8692 +msgid "Append _Track..." +msgstr "" + +#: ../src/viktrwlayer.c:8699 +msgid "_Split" +msgstr "" + +#: ../src/viktrwlayer.c:8707 +msgid "_Split By Time..." +msgstr "" + +#. ATM always enable this entry - don't want to have to analyse the track before displaying the menu - to keep the menu speedy +#: ../src/viktrwlayer.c:8713 +msgid "Split Se_gments" +msgstr "" + +#: ../src/viktrwlayer.c:8719 +msgid "Split By _Number of Points..." +msgstr "" + +#: ../src/viktrwlayer.c:8724 +msgid "Split at _Trackpoint" +msgstr "" + +#: ../src/viktrwlayer.c:8732 +msgid "_Insert Points" +msgstr "" + +#: ../src/viktrwlayer.c:8738 +msgid "Insert Point _Before Selected Point" +msgstr "" + +#: ../src/viktrwlayer.c:8745 +msgid "Insert Point _After Selected Point" +msgstr "" + +#: ../src/viktrwlayer.c:8754 +msgid "Delete Poi_nts" +msgstr "" + +#: ../src/viktrwlayer.c:8760 +msgid "Delete _Selected Point" +msgstr "" + +#: ../src/viktrwlayer.c:8768 +msgid "Delete Points With The Same _Position" +msgstr "" + +#: ../src/viktrwlayer.c:8773 +msgid "Delete Points With The Same _Time" +msgstr "" + +#: ../src/viktrwlayer.c:8780 ../src/viktrwlayer.c:9029 +msgid "_Transform" +msgstr "" + +#: ../src/viktrwlayer.c:8788 ../src/viktrwlayer.c:9037 +msgid "_Apply DEM Data" +msgstr "Aplicar dados DEM" + +#: ../src/viktrwlayer.c:8793 ../src/viktrwlayer.c:9042 +msgid "_Overwrite" +msgstr "" + +#: ../src/viktrwlayer.c:8796 ../src/viktrwlayer.c:9045 +msgid "Overwrite any existing elevation values with DEM values" +msgstr "" + +#: ../src/viktrwlayer.c:8799 ../src/viktrwlayer.c:9048 +msgid "_Keep Existing" +msgstr "" + +#: ../src/viktrwlayer.c:8802 ../src/viktrwlayer.c:9051 +msgid "Keep existing elevation values, only attempt for missing values" +msgstr "" + +#: ../src/viktrwlayer.c:8807 +msgid "_Smooth Missing Elevation Data" +msgstr "" + +#: ../src/viktrwlayer.c:8812 +msgid "_Interpolated" +msgstr "" + +#: ../src/viktrwlayer.c:8815 +msgid "" +"Interpolate between known elevation values to derive values for the missing " +"elevations" +msgstr "" + +#: ../src/viktrwlayer.c:8818 +msgid "_Flat" +msgstr "" + +#: ../src/viktrwlayer.c:8821 +msgid "Set unknown elevation values to the last known value" +msgstr "" + +#: ../src/viktrwlayer.c:8825 +msgid "C_onvert to a Route" +msgstr "" + +#: ../src/viktrwlayer.c:8827 +msgid "C_onvert to a Track" +msgstr "" + +#: ../src/viktrwlayer.c:8835 +msgid "_Anonymize Times" +msgstr "" + +#: ../src/viktrwlayer.c:8838 +msgid "Shift timestamps to a relative offset from 1901-01-01" +msgstr "" + +#: ../src/viktrwlayer.c:8841 +msgid "_Interpolate Times" +msgstr "" + +#: ../src/viktrwlayer.c:8844 +msgid "" +"Reset trackpoint timestamps between the first and last points such that " +"track is traveled at equal speed" +msgstr "" + +#: ../src/viktrwlayer.c:8849 +msgid "_Reverse Track" +msgstr "" + +#: ../src/viktrwlayer.c:8851 +msgid "_Reverse Route" +msgstr "" + +#: ../src/viktrwlayer.c:8858 +msgid "Refine Route..." +msgstr "" + +#: ../src/viktrwlayer.c:8868 +msgid "Down_load Maps Along Track..." +msgstr "Mapas Trajetórias Down_load ..." + +#: ../src/viktrwlayer.c:8870 +msgid "Down_load Maps Along Route..." +msgstr "" + +#: ../src/viktrwlayer.c:8878 +msgid "_Export Track as GPX..." +msgstr "" + +#: ../src/viktrwlayer.c:8880 +msgid "_Export Route as GPX..." +msgstr "" + +#: ../src/viktrwlayer.c:8887 +msgid "E_xtend Track End" +msgstr "Final E_xtendido de Faixa" + +#: ../src/viktrwlayer.c:8889 +msgid "E_xtend Route End" +msgstr "" + +#: ../src/viktrwlayer.c:8896 +msgid "Extend _Using Route Finder" +msgstr "" + +#: ../src/viktrwlayer.c:8911 +msgid "_Upload to GPS..." +msgstr "" + +#: ../src/viktrwlayer.c:8926 +msgid "_Diary" +msgstr "" + +#: ../src/viktrwlayer.c:8930 +msgid "Open diary program at this date" +msgstr "" + +#: ../src/viktrwlayer.c:8935 +msgid "_Astronomy" +msgstr "" + +#: ../src/viktrwlayer.c:8938 +msgid "Open astronomy program at this date and location" +msgstr "" + +#: ../src/viktrwlayer.c:8962 +msgid "_View Google Directions" +msgstr "_Exibir direções Google" + +#: ../src/viktrwlayer.c:8984 +msgid "Use with _Filter" +msgstr "Utilizar com _Filtro" + +#: ../src/viktrwlayer.c:9018 +msgid "_Edit Trackpoint" +msgstr "" + +#: ../src/viktrwlayer.c:10116 +#, c-format +msgid " - Gain %dm:Loss %dm" +msgstr "" + +#: ../src/viktrwlayer.c:10118 +#, c-format +msgid " - Gain %dft:Loss %dft" +msgstr "" + +#: ../src/viktrwlayer.c:10123 +#, c-format +msgid " - Bearing %3.1f° - Step %s" +msgstr "" + +#: ../src/viktrwlayer.c:10232 +#, c-format +msgid "Querying %s for route between (%.3f, %.3f) and (%.3f, %.3f)." +msgstr "" + +#: ../src/viktrwlayer.c:10248 +#, c-format +msgid "%s returned route between (%.3f, %.3f) and (%.3f, %.3f)." +msgstr "" + +#: ../src/viktrwlayer.c:10251 +#, c-format +msgid "Error getting route from %s." +msgstr "" + +#: ../src/viktrwlayer.c:11070 +#, c-format +msgid "Creating %d Image Thumbnails..." +msgstr "Criação de Miniaturas de Imagem %d..." + +#: ../src/viktrwlayer.c:11560 +msgid "No map layer in use. Create one first" +msgstr "Mapa em uso sem camada. Criar uma primeiro" + +#: ../src/viktrwlayer.c:11679 +#, c-format +msgid "%s: Track List" +msgstr "" + +#: ../src/viktrwlayer.c:11681 +#, c-format +msgid "%s: Route List" +msgstr "" + +#: ../src/viktrwlayer.c:11734 +#, c-format +msgid "" +"Could not write external layer %s to %s, please fix and save before exiting " +"or data will be lost" +msgstr "" + +#: ../src/viktrwlayer.c:11782 +#, c-format +msgid "WARNING: issues encountered loading external layer %s from %s" +msgstr "" + +#: ../src/viktrwlayer_export.c:47 +msgid "Auto Device GPX Simplify:" +msgstr "" + +#: ../src/viktrwlayer_export.c:48 +msgid "" +"GPX saves to certain devices will be simplified for device compatibility." +msgstr "" + +#: ../src/viktrwlayer_export.c:125 +#, c-format +msgid "Export of GPX file simplified using point limit: %d" +msgstr "" + +#: ../src/viktrwlayer_export.c:206 ../src/viktrwlayer_export.c:323 +#: ../src/vikwindow.c:3694 +msgid "The filename you requested could not be opened for writing." +msgstr "O nome do arquivo solicitado não pôde ser aberto para escrita." + +#: ../src/viktrwlayer_export.c:226 +#, c-format +msgid "Could not launch %s." +msgstr "" + +#: ../src/viktrwlayer_export.c:234 +msgid "Could not create temporary file for export." +msgstr "" + +#: ../src/viktrwlayer_export.c:268 +msgid "File format:" +msgstr "" + +#: ../src/viktrwlayer_export.c:276 +msgid "Select the file format." +msgstr "" + +#: ../src/viktrwlayer_export.c:281 +msgid "" +"Select the information to process.\n" +"Warning: the behavior of these switches is highly dependent of the file " +"format selected.\n" +"Please, refer to GPSbabel if unsure." +msgstr "" + +#: ../src/viktrwlayer_export.c:308 +msgid "You did not select a valid file format." +msgstr "" + +#: ../src/viktrwlayer_propwin.c:915 ../src/viktrwlayer_propwin.c:3381 +#: ../src/viktrwlayer_propwin.c:3417 ../src/viktrwlayer_propwin.c:3457 +#: ../src/viktrwlayer_propwin.c:3509 ../src/viktrwlayer_propwin.c:3527 +#: ../src/viktrwlayer_propwin.c:3600 ../src/viktrwlayer_propwin.c:3601 +#: ../src/viktrwlayer_propwin.c:3602 ../src/viktrwlayer_propwin.c:3611 +#: ../src/viktrwlayer_propwin.c:3612 ../src/viktrwlayer_propwin.c:3629 +#: ../src/viktrwlayer_propwin.c:3630 ../src/viktrwlayer_propwin.c:3644 +#: ../src/viktrwlayer_propwin.c:3645 ../src/viktrwlayer_propwin.c:3646 +#: ../src/viktrwlayer_propwin.c:3660 ../src/viktrwlayer_propwin.c:3661 +#: ../src/viktrwlayer_propwin.c:3662 ../src/viktrwlayer_propwin.c:3676 +#: ../src/viktrwlayer_propwin.c:3677 ../src/viktrwlayer_propwin.c:3678 +#: ../src/viktrwlayer_propwin.c:3695 ../src/viktrwlayer_propwin.c:3696 +#: ../src/viktrwlayer_analysis.c:293 +#, c-format +msgid "No Data" +msgstr "Sem Dados" + +#: ../src/viktrwlayer_propwin.c:960 ../src/viktrwlayer_propwin.c:1245 +#, c-format +msgid "%.1f kph" +msgstr "" + +#: ../src/viktrwlayer_propwin.c:963 ../src/viktrwlayer_propwin.c:1248 +#: ../src/viktrwlayer_analysis.c:352 +#, c-format +msgid "%.1f mph" +msgstr "" + +#: ../src/viktrwlayer_propwin.c:966 ../src/viktrwlayer_propwin.c:1251 +#, c-format +msgid "%.1f knots" +msgstr "" + +#: ../src/viktrwlayer_propwin.c:969 ../src/viktrwlayer_propwin.c:1254 +#, fuzzy, c-format +msgid "%.1f s/km" +msgstr "%s%.1f km %s" + +#: ../src/viktrwlayer_propwin.c:972 ../src/viktrwlayer_propwin.c:1257 +#: ../src/viktrwlayer_analysis.c:389 ../src/viktrwlayer_analysis.c:392 +#, fuzzy, c-format +msgid "%.1f min/km" +msgstr "1 min" + +#: ../src/viktrwlayer_propwin.c:975 ../src/viktrwlayer_propwin.c:1260 +#, c-format +msgid "%.1f sec/mi" +msgstr "" + +#: ../src/viktrwlayer_propwin.c:978 ../src/viktrwlayer_propwin.c:1263 +#: ../src/viktrwlayer_analysis.c:409 ../src/viktrwlayer_analysis.c:412 +#, fuzzy, c-format +msgid "%.1f min/mi" +msgstr "1 min" + +#. VIK_UNITS_SPEED_METRES_PER_SECOND: +#: ../src/viktrwlayer_propwin.c:982 ../src/viktrwlayer_propwin.c:1267 +#, c-format +msgid "%.1f m/s" +msgstr "" + +#. Minutes +#: ../src/viktrwlayer_propwin.c:1411 +msgid "mins" +msgstr "" + +#. Hours +#: ../src/viktrwlayer_propwin.c:1418 +msgid "h" +msgstr "" + +#. Days +#: ../src/viktrwlayer_propwin.c:1424 +msgid "d" +msgstr "" + +#. Weeks +#: ../src/viktrwlayer_propwin.c:1429 +msgid "w" +msgstr "" + +#. 'Months' +#: ../src/viktrwlayer_propwin.c:1433 +msgid "M" +msgstr "" + +#: ../src/viktrwlayer_propwin.c:2051 ../src/viktrwlayer_analysis.c:303 +#, c-format +msgid "%.1f miles" +msgstr "" + +#: ../src/viktrwlayer_propwin.c:2054 ../src/viktrwlayer_analysis.c:306 +#, c-format +msgid "%.1f NM" +msgstr "" + +#. VIK_UNITS_DISTANCE_KILOMETRES +#: ../src/viktrwlayer_propwin.c:2057 ../src/viktrwlayer_analysis.c:310 +#, c-format +msgid "%.1f km" +msgstr "" + +#: ../src/viktrwlayer_propwin.c:3083 +msgid "Failed spliting track. Track unchanged" +msgstr "Desmembramento da Faixa falhou. Faixa inalterada" + +#: ../src/viktrwlayer_propwin.c:3234 ../src/viktrwlayer_propwin.c:3744 +#, c-format +msgid "%s - Track Properties" +msgstr "Propriedades da Faixa - %s" + +#: ../src/viktrwlayer_propwin.c:3239 +msgid "Split at _Marker" +msgstr "" + +#: ../src/viktrwlayer_propwin.c:3240 +msgid "Split _Segments" +msgstr "" + +#: ../src/viktrwlayer_propwin.c:3241 +msgid "_Reverse" +msgstr "" + +#: ../src/viktrwlayer_propwin.c:3242 +msgid "_Delete Dupl." +msgstr "" + +#: ../src/viktrwlayer_propwin.c:3269 +msgid "Comment:" +msgstr "Comentário:" + +#: ../src/viktrwlayer_propwin.c:3270 +msgid "Description:" +msgstr "" + +#: ../src/viktrwlayer_propwin.c:3271 +#, fuzzy +msgid "Source:" +msgstr "Início:" + +#: ../src/viktrwlayer_propwin.c:3272 +#, fuzzy +msgid "Type:" +msgstr "Tempo:" + +#: ../src/viktrwlayer_propwin.c:3273 +msgid "Color:" +msgstr "" + +#: ../src/viktrwlayer_propwin.c:3274 +msgid "Draw Name:" +msgstr "" + +#: ../src/viktrwlayer_propwin.c:3275 +msgid "Distance Labels:" +msgstr "" + +#: ../src/viktrwlayer_propwin.c:3278 +msgid "Track Length:" +msgstr " Duração da Trilha " + +#: ../src/viktrwlayer_propwin.c:3279 +msgid "Trackpoints:" +msgstr "Trackpoints:" + +#: ../src/viktrwlayer_propwin.c:3280 +msgid "Segments:" +msgstr "Segmentos:" + +#: ../src/viktrwlayer_propwin.c:3281 +msgid "Duplicate Points:" +msgstr "Pontos Duplicados:" + +#: ../src/viktrwlayer_propwin.c:3282 +msgid "Max Speed:" +msgstr "Velocidade Máxima:" + +#: ../src/viktrwlayer_propwin.c:3283 +msgid "Avg. Speed:" +msgstr "Velocidade Média:" + +#: ../src/viktrwlayer_propwin.c:3284 +msgid "Moving Avg. Speed:" +msgstr "" + +#: ../src/viktrwlayer_propwin.c:3285 +msgid "Avg. Dist. Between TPs:" +msgstr "Avg. Dist. Entre TPs:" + +#: ../src/viktrwlayer_propwin.c:3286 +msgid "Elevation Range:" +msgstr "Faixa de Elevação::" + +#: ../src/viktrwlayer_propwin.c:3287 +msgid "Total Elevation Gain/Loss:" +msgstr "Elevação Total Ganho/Prejuízo" + +#: ../src/viktrwlayer_propwin.c:3288 +msgid "Start:" +msgstr "Início:" + +#: ../src/viktrwlayer_propwin.c:3289 +msgid "End:" +msgstr "Fim:" + +#: ../src/viktrwlayer_propwin.c:3290 +msgid "Duration:" +msgstr "Duração:" + +#: ../src/viktrwlayer_propwin.c:3320 +msgid "Centre" +msgstr "" + +#: ../src/viktrwlayer_propwin.c:3321 +msgid "Start only" +msgstr "" + +#: ../src/viktrwlayer_propwin.c:3322 +msgid "End only" +msgstr "" + +#: ../src/viktrwlayer_propwin.c:3323 +msgid "Start and End" +msgstr "" + +#: ../src/viktrwlayer_propwin.c:3324 +msgid "Centre, Start and End" +msgstr "" + +#: ../src/viktrwlayer_propwin.c:3336 +msgid "Maximum number of distance labels to be shown" +msgstr "" + +#: ../src/viktrwlayer_propwin.c:3340 +msgid "Properties" +msgstr "" + +#: ../src/viktrwlayer_propwin.c:3584 +#, c-format +msgid "%d minutes - %d minutes moving" +msgstr "" + +#: ../src/viktrwlayer_propwin.c:3596 +#, c-format +msgid "%s total - %s in segments" +msgstr "" + +#: ../src/viktrwlayer_propwin.c:3607 ../src/viktrwlayer_analysis.c:622 +msgid "Statistics" +msgstr "Estatísticas" + +#: ../src/viktrwlayer_propwin.c:3613 ../src/viktrwlayer_propwin.c:3680 +msgid "Show D_EM" +msgstr "" + +#: ../src/viktrwlayer_propwin.c:3615 ../src/viktrwlayer_propwin.c:3631 +#: ../src/viktrwlayer_propwin.c:3647 ../src/viktrwlayer_propwin.c:3697 +msgid "Show _GPS Speed" +msgstr "" + +#: ../src/viktrwlayer_propwin.c:3617 ../src/viktrwlayer_propwin.c:3633 +#: ../src/viktrwlayer_propwin.c:3665 ../src/viktrwlayer_propwin.c:3699 +msgid "Track Distance:" +msgstr "Distância da Trilha:" + +#: ../src/viktrwlayer_propwin.c:3618 ../src/viktrwlayer_propwin.c:3684 +msgid "Track Height:" +msgstr "" + +#: ../src/viktrwlayer_propwin.c:3624 +msgid "Elevation-distance" +msgstr "Elevação da distância" + +#: ../src/viktrwlayer_propwin.c:3634 +msgid "Track Gradient:" +msgstr "" + +#: ../src/viktrwlayer_propwin.c:3639 +msgid "Gradient-distance" +msgstr "" + +#: ../src/viktrwlayer_propwin.c:3649 ../src/viktrwlayer_propwin.c:3666 +#: ../src/viktrwlayer_propwin.c:3683 +msgid "Track Time:" +msgstr "Tempo da Trilha::" + +#: ../src/viktrwlayer_propwin.c:3650 ../src/viktrwlayer_propwin.c:3700 +msgid "Track Speed:" +msgstr "" + +#: ../src/viktrwlayer_propwin.c:3651 ../src/viktrwlayer_propwin.c:3667 +#: ../src/viktrwlayer_propwin.c:3685 +msgid "Time/Date:" +msgstr "" + +#: ../src/viktrwlayer_propwin.c:3655 +msgid "Speed-time" +msgstr "Velocidade em tempo" + +#: ../src/viktrwlayer_propwin.c:3663 ../src/viktrwlayer_propwin.c:3679 +msgid "Show S_peed" +msgstr "" + +#: ../src/viktrwlayer_propwin.c:3671 +msgid "Distance-time" +msgstr "" + +#: ../src/viktrwlayer_propwin.c:3690 +msgid "Elevation-time" +msgstr "" + +#: ../src/viktrwlayer_propwin.c:3705 +msgid "Speed-distance" +msgstr "" + +#: ../src/viktrwlayer_tpwin.c:190 ../src/viktrwlayer_wpwin.c:66 +msgid "Date/Time Edit" +msgstr "" + +#: ../src/viktrwlayer_tpwin.c:242 +msgid "Name:" +msgstr "" + +#: ../src/viktrwlayer_tpwin.c:243 +msgid "Latitude:" +msgstr "Latitude:" + +#: ../src/viktrwlayer_tpwin.c:244 +msgid "Longitude:" +msgstr "Longitude:" + +#: ../src/viktrwlayer_tpwin.c:245 +msgid "Altitude:" +msgstr "Altitude:" + +#: ../src/viktrwlayer_tpwin.c:246 +msgid "Course:" +msgstr "" + +#: ../src/viktrwlayer_tpwin.c:247 +msgid "Timestamp:" +msgstr "Carimbo de hora:" + +#: ../src/viktrwlayer_tpwin.c:248 +msgid "Time:" +msgstr "Tempo:" + +#: ../src/viktrwlayer_tpwin.c:249 +msgid "Distance Difference:" +msgstr "Diferença da Distância:" + +#: ../src/viktrwlayer_tpwin.c:250 +msgid "Time Difference:" +msgstr "Diferença de Tempo:" + +#: ../src/viktrwlayer_tpwin.c:251 +msgid "\"Speed\" Between:" +msgstr "\"Speed\" Entre:" + +#: ../src/viktrwlayer_tpwin.c:252 +msgid "Speed:" +msgstr "" + +#: ../src/viktrwlayer_tpwin.c:253 +msgid "VDOP:" +msgstr "VDOP:" + +#: ../src/viktrwlayer_tpwin.c:254 +msgid "HDOP:" +msgstr "HDOP:" + +#: ../src/viktrwlayer_tpwin.c:255 +msgid "PDOP:" +msgstr "PDOP:" + +#: ../src/viktrwlayer_tpwin.c:256 +msgid "SAT/FIX:" +msgstr "SAT/FIX:" + +#: ../src/viktrwlayer_tpwin.c:263 ../src/viktrwlayer_tpwin.c:408 +#: ../src/viktrwlayer_tpwin.c:622 +msgid "Trackpoint" +msgstr "Trackpoint" + +#: ../src/viktrwlayer_tpwin.c:266 +msgid "_Insert After" +msgstr "_Inserir Depois" + +#: ../src/viktrwlayer_tpwin.c:268 +msgid "Split Here" +msgstr "Dividir Aqui" + +#: ../src/viktrwlayer_tracklist.c:262 ../src/viktrwlayer_waypointlist.c:306 +msgid "_Copy Data" +msgstr "" + +#. +#. item = gtk_image_menu_item_new_with_mnemonic ( _("_Select") ); +#. gtk_image_menu_item_set_image ( (GtkImageMenuItem*)item, gtk_image_new_from_stock (GTK_STOCK_FIND, GTK_ICON_SIZE_MENU) ); +#. g_signal_connect_swapped ( G_OBJECT(item), "activate", G_CALLBACK(trw_layer_track_select), values ); +#. gtk_menu_shell_append (GTK_MENU_SHELL (menu), item); +#. gtk_widget_show ( item ); +#. +#. ATM view auto selects, so don't bother with separate select menu entry +#. +#. item = gtk_image_menu_item_new_with_mnemonic ( _("_Select") ); +#. gtk_image_menu_item_set_image ( (GtkImageMenuItem*)item, gtk_image_new_from_stock (GTK_STOCK_FIND, GTK_ICON_SIZE_MENU) ); +#. g_signal_connect_swapped ( G_OBJECT(item), "activate", G_CALLBACK(trw_layer_waypoint_select), values ); +#. gtk_menu_shell_append (GTK_MENU_SHELL (menu), item); +#. gtk_widget_show ( item ); +#. +#. AUTO SELECT NOT TRUE YET... +#. ATM view auto selects, so don't bother with separate select menu entry +#: ../src/viktrwlayer_tracklist.c:290 ../src/viktrwlayer_waypointlist.c:341 +#: ../src/vikwindow.c:4816 +msgid "_View" +msgstr "_Exibir" + +#. Insert column for the layer name when viewing multi layers +#: ../src/viktrwlayer_tracklist.c:613 ../src/viktrwlayer_waypointlist.c:609 +msgid "Layer" +msgstr "" + +#: ../src/viktrwlayer_tracklist.c:627 ../src/viktrwlayer_waypointlist.c:624 +msgid "Date" +msgstr "" + +#: ../src/viktrwlayer_tracklist.c:631 ../src/viktrwlayer_waypointlist.c:628 +msgid "Visible" +msgstr "" + +#: ../src/viktrwlayer_tracklist.c:639 +msgid "" +"Distance\n" +"(miles)" +msgstr "" + +#: ../src/viktrwlayer_tracklist.c:642 +msgid "" +"Distance\n" +"(NM)" +msgstr "" + +#: ../src/viktrwlayer_tracklist.c:645 +msgid "" +"Distance\n" +"(km)" +msgstr "" + +#: ../src/viktrwlayer_tracklist.c:651 +msgid "" +"Length\n" +"(minutes)" +msgstr "" + +#: ../src/viktrwlayer_tracklist.c:660 ../src/vikutils.c:93 +msgid "sec/mi" +msgstr "" + +#: ../src/viktrwlayer_tracklist.c:666 +#, c-format +msgid "" +"Av. Speed\n" +"(%s)" +msgstr "" + +#. Apply own formatting of the data +#: ../src/viktrwlayer_tracklist.c:671 +#, c-format +msgid "" +"Max Speed\n" +"(%s)" +msgstr "" + +#: ../src/viktrwlayer_tracklist.c:679 ../src/viktrwlayer_waypointlist.c:637 +msgid "" +"Max Height\n" +"(Feet)" +msgstr "" + +#: ../src/viktrwlayer_tracklist.c:681 ../src/viktrwlayer_waypointlist.c:639 +msgid "" +"Max Height\n" +"(Metres)" +msgstr "" + +#: ../src/viktrwlayer_waypointlist.c:312 +msgid "Copy Data (with _positions)" +msgstr "" + +#: ../src/viktrwlayer_waypointlist.c:633 +msgid "Comment" +msgstr "" + +#: ../src/viktrwlayer_waypointlist.c:643 +msgid "Symbol" +msgstr "" + +#: ../src/viktrwlayer_wpwin.c:93 ../src/viktrwlayer_wpwin.c:302 +msgid "True" +msgstr "" + +#: ../src/viktrwlayer_wpwin.c:122 +msgid "Waypoint Properties" +msgstr "Propriedades de Waypoint" + +#: ../src/viktrwlayer_wpwin.c:164 +msgid "Name:" +msgstr "Nome:" + +#: ../src/viktrwlayer_wpwin.c:181 +msgid "Altitude:" +msgstr "Altitude:" + +#: ../src/viktrwlayer_wpwin.c:186 ../src/viktrwlayer_wpwin.c:188 +msgid "Comment:" +msgstr "Comentário:" + +#: ../src/viktrwlayer_wpwin.c:202 +#, fuzzy +msgid "Source:" +msgstr "Fonte do download:" + +#: ../src/viktrwlayer_wpwin.c:212 +msgid "Image:" +msgstr "Imagem:" + +#: ../src/viktrwlayer_wpwin.c:217 +msgid "Symbol:" +msgstr "Símbolo:" + +#: ../src/viktrwlayer_wpwin.c:226 +msgid "(none)" +msgstr "(vazio)" + +#. Geotag Info [readonly] +#: ../src/viktrwlayer_wpwin.c:272 +msgid "Has Geotag" +msgstr "" + +#: ../src/viktrwlayer_wpwin.c:279 +msgid "Consistent Position" +msgstr "" + +#. ATM the direction value box is always shown, even when there is no information. +#. It would be nice to be able to hide it until the 'Add' has been performed, +#. however I've not been able to achieve this. +#. Thus simply sensistizing it instead. +#: ../src/viktrwlayer_wpwin.c:292 +#, fuzzy +msgid "Image Direction:" +msgstr "Configurações de Imagem" + +#: ../src/viktrwlayer_wpwin.c:300 +msgid "Magnetic" +msgstr "" + +#: ../src/viktrwlayer_wpwin.c:320 +msgid "Time:" +msgstr "" + +#. TODO: other checks (isalpha or whatever ) +#: ../src/viktrwlayer_wpwin.c:386 +msgid "Please enter a name for the waypoint." +msgstr "Por favor insira um nome para o waypoint." + +#: ../src/viktrwlayer_geotag.c:320 ../src/viktrwlayer_geotag.c:460 +#, c-format +msgid "Failed updating EXIF on %s" +msgstr "" + +#: ../src/viktrwlayer_geotag.c:562 +#, c-format +msgid "Geotagging %d Images..." +msgstr "" + +#: ../src/viktrwlayer_geotag.c:630 +msgid "Geotag Images" +msgstr "" + +#: ../src/viktrwlayer_geotag.c:640 +msgid "Images" +msgstr "" + +#: ../src/viktrwlayer_geotag.c:645 +msgid "Overwrite Existing Waypoints:" +msgstr "" + +#: ../src/viktrwlayer_geotag.c:648 +msgid "Overwrite Existing GPS Information:" +msgstr "" + +#: ../src/viktrwlayer_geotag.c:650 +msgid "Keep File Modification Timestamp:" +msgstr "" + +#: ../src/viktrwlayer_geotag.c:684 +msgid "Create Waypoints:" +msgstr "" + +#: ../src/viktrwlayer_geotag.c:693 +msgid "Write EXIF:" +msgstr "" + +#: ../src/viktrwlayer_geotag.c:705 +msgid "Automatic Image Direction:" +msgstr "" + +#: ../src/viktrwlayer_geotag.c:707 +msgid "Set image direction based on a heading derived from the track" +msgstr "" + +#: ../src/viktrwlayer_geotag.c:710 +msgid "Interpolate Between Track Segments:" +msgstr "" + +#: ../src/viktrwlayer_geotag.c:715 +msgid "Image Time Offset (Seconds):" +msgstr "" + +#: ../src/viktrwlayer_geotag.c:718 +msgid "" +"The number of seconds to ADD to the photos time to make it match the GPS " +"data. Calculate this with (GPS - Photo). Can be negative or positive. Useful " +"to adjust times when a camera's timestamp was incorrect." +msgstr "" + +#: ../src/viktrwlayer_geotag.c:721 +msgid "Image Timezone:" +msgstr "" + +#: ../src/viktrwlayer_geotag.c:724 +msgid "" +"The timezone that was used when the images were created. For example, if a " +"camera is set to AWST or +8:00 hours. Enter +8:00 here so that the correct " +"adjustment to the images' time can be made. GPS data is always in UTC." +msgstr "" + +#: ../src/viktrwlayer_geotag.c:728 +#, c-format +msgid "Using waypoint: %s" +msgstr "" + +#: ../src/viktrwlayer_geotag.c:742 +#, c-format +msgid "Using track: %s" +msgstr "" + +#: ../src/viktrwlayer_geotag.c:744 +#, c-format +msgid "Using all tracks in: %s" +msgstr "" + +#: ../src/viktrwlayer_analysis.c:214 +msgid "Number of Tracks" +msgstr "" + +#: ../src/viktrwlayer_analysis.c:215 +msgid "Date Range" +msgstr "" + +#: ../src/viktrwlayer_analysis.c:216 +msgid "Total Length" +msgstr "" + +#: ../src/viktrwlayer_analysis.c:217 +msgid "Average Length" +msgstr "" + +#: ../src/viktrwlayer_analysis.c:218 +msgid "Eddington number" +msgstr "" + +#. No.4: Extended display only +#: ../src/viktrwlayer_analysis.c:219 +msgid "Max Speed" +msgstr "" + +#: ../src/viktrwlayer_analysis.c:220 +msgid "Avg. Speed" +msgstr "" + +#: ../src/viktrwlayer_analysis.c:221 +msgid "Minimum Altitude" +msgstr "" + +#: ../src/viktrwlayer_analysis.c:222 +msgid "Maximum Altitude" +msgstr "" + +#: ../src/viktrwlayer_analysis.c:223 +msgid "Total Elevation Gain/Loss" +msgstr "" + +#: ../src/viktrwlayer_analysis.c:224 +msgid "Avg. Elevation Gain/Loss" +msgstr "" + +#: ../src/viktrwlayer_analysis.c:225 +msgid "Total Duration" +msgstr "" + +#: ../src/viktrwlayer_analysis.c:226 +msgid "Avg. Duration" +msgstr "" + +#: ../src/viktrwlayer_analysis.c:317 +#, c-format +msgid "%.2f miles" +msgstr "" + +#: ../src/viktrwlayer_analysis.c:320 +#, c-format +msgid "%.2f NM" +msgstr "" + +#. VIK_UNITS_DISTANCE_KILOMETRES +#: ../src/viktrwlayer_analysis.c:324 +#, c-format +msgid "%.2f km" +msgstr "" + +#: ../src/viktrwlayer_analysis.c:361 +#, c-format +msgid "%.2f m/s" +msgstr "" + +#: ../src/viktrwlayer_analysis.c:370 ../src/viktrwlayer_analysis.c:373 +#, c-format +msgid "%.2f knots" +msgstr "" + +#: ../src/viktrwlayer_analysis.c:379 ../src/viktrwlayer_analysis.c:382 +#, c-format +msgid "%d s/km" +msgstr "" + +#: ../src/viktrwlayer_analysis.c:399 ../src/viktrwlayer_analysis.c:402 +#, c-format +msgid "%d sec/mi" +msgstr "" + +#: ../src/viktrwlayer_analysis.c:420 ../src/viktrwlayer_analysis.c:423 +#, c-format +msgid "%.2f km/h" +msgstr "" + +#: ../src/viktrwlayer_analysis.c:434 ../src/viktrwlayer_analysis.c:440 +#, c-format +msgid "%d feet" +msgstr "" + +#: ../src/viktrwlayer_analysis.c:445 ../src/viktrwlayer_analysis.c:447 +#, c-format +msgid "%d feet / %d feet" +msgstr "" + +#: ../src/viktrwlayer_analysis.c:452 ../src/viktrwlayer_analysis.c:458 +#, c-format +msgid "%d m" +msgstr "" + +#: ../src/viktrwlayer_analysis.c:463 ../src/viktrwlayer_analysis.c:465 +#, c-format +msgid "%d m / %d m" +msgstr "" + +#: ../src/viktrwlayer_analysis.c:477 +#, c-format +msgid "%d:%02d:%02d days:hrs:mins" +msgstr "" + +#: ../src/viktrwlayer_analysis.c:484 +#, c-format +msgid "%d:%02d hrs:mins" +msgstr "" + +#: ../src/viktrwlayer_analysis.c:658 +msgid "Include Invisible Items" +msgstr "" + +#: ../src/vikstatus.c:129 +msgid "Current number of background tasks. Click to see the background jobs." +msgstr "" + +#: ../src/vikstatus.c:134 +msgid "Current zoom level. Click to select a new one." +msgstr "" + +#: ../src/vikstatus.c:141 +msgid "Left click to clear the message. Right click to copy the message." +msgstr "" + +#: ../src/vikutils.c:108 +msgid "GPSD" +msgstr "" + +#. GPS Preamble +#: ../src/vikutils.c:109 +msgid "Trkpt" +msgstr "" + +#: ../src/vikutils.c:160 +#, c-format +msgid "%sSpeed%s %.1f%s" +msgstr "" + +#. Go for 2dp as expect low values for vertical speeds +#: ../src/vikutils.c:214 +#, c-format +msgid "%sClimb%s %.2f%s" +msgstr "" + +#: ../src/vikutils.c:223 +#, c-format +msgid "%sAlt %dfeet" +msgstr "" + +#. VIK_UNITS_HEIGHT_METRES: +#: ../src/vikutils.c:227 +#, c-format +msgid "%sAlt %dm" +msgstr "" + +#: ../src/vikutils.c:235 +#, c-format +msgid "%sCourse %03d°" +msgstr "" + +#: ../src/vikutils.c:249 +msgid "yards" +msgstr "" + +#. VIK_UNITS_DISTANCE_KILOMETRES: +#: ../src/vikutils.c:253 +msgid "m" +msgstr "" + +#: ../src/vikutils.c:257 +#, c-format +msgid "%sDistance diff %d%s" +msgstr "" + +#: ../src/vikutils.c:272 +#, c-format +msgid "%sTime %s" +msgstr "" + +#: ../src/vikutils.c:281 +#, c-format +msgid "%sTime diff %lds" +msgstr "" + +#: ../src/vikutils.c:287 +#, c-format +msgid "%sNo. of Sats %d" +msgstr "" + +#: ../src/vikutils.c:312 +#, c-format +msgid "%sTo End %.2f%s" +msgstr "" + +#: ../src/vikutils.c:339 +#, c-format +msgid "%sDistance along %.2f%s" +msgstr "" + +#: ../src/vikutils.c:359 +#, c-format +msgid "%sTrack: %s" +msgstr "" + +#: ../src/vikutils.c:396 +#, c-format +msgid "" +"There is a newer version of Viking available: %s\n" +"\n" +"Do you wish to go to Viking's website now?" +msgstr "" + +#: ../src/vikutils.c:526 +msgid "" +"This appears to be Viking's very first run.\n" +"\n" +"Do you wish to enable automatic internet features?\n" +"\n" +"Individual settings can be controlled in the Preferences." +msgstr "" + +#: ../src/vikwaypoint.c:37 +msgid "Waypoint" +msgstr "" + +#: ../src/vikwebtool_datasource.c:352 +msgid "Search Term" +msgstr "" + +#. TODO get rid of this as this is unnecessary duplication... +#: ../src/vikwindow.c:258 +msgid "Pan" +msgstr "Pan" + +#: ../src/vikwindow.c:258 +msgid "Zoom" +msgstr "Ampliar" + +#: ../src/vikwindow.c:258 +msgid "Ruler" +msgstr "Régua" + +#: ../src/vikwindow.c:258 +msgid "Select" +msgstr "" + +#: ../src/vikwindow.c:368 +msgid "This is Viking " +msgstr "" + +#: ../src/vikwindow.c:457 +msgid "Location lookup aborted" +msgstr "" + +#: ../src/vikwindow.c:477 +#, c-format +msgid "Location found: %s" +msgstr "" + +#: ../src/vikwindow.c:486 +msgid "Unable to determine location" +msgstr "" + +#: ../src/vikwindow.c:495 +msgid "Determining location" +msgstr "" + +#: ../src/vikwindow.c:525 +#, c-format +msgid "Location found via geoclue" +msgstr "" + +#: ../src/vikwindow.c:546 +msgid "Default Map" +msgstr "" + +#: ../src/vikwindow.c:557 ../src/vikwindow.c:3938 +msgid "Trying to determine location..." +msgstr "" + +#. Create tooltip +#: ../src/vikwindow.c:723 +msgid "Select zoom level" +msgstr "" + +#: ../src/vikwindow.c:1176 +#, c-format +msgid "" +"Do you want to save the changes you made to the document \"%s\"?\n" +"\n" +"Your changes will be lost if you don't save them." +msgstr "" +"Você deseja salvar as alterações feitas no documento \"%s\"?\n" +"\n" +"Suas alterações serão perdidas se você não salvá-las." + +#: ../src/vikwindow.c:1180 +msgid "Don't Save" +msgstr "Não Salvar" + +#: ../src/vikwindow.c:1268 +msgid "mpp" +msgstr "mpp" + +#: ../src/vikwindow.c:1268 +msgid "pixelfact" +msgstr "pixelfact" + +#: ../src/vikwindow.c:1467 +#, c-format +msgid "%s %s %dm" +msgstr "%s %s %dm" + +#: ../src/vikwindow.c:1469 +#, c-format +msgid "%s %s %dft" +msgstr "%s %s %dft" + +#: ../src/vikwindow.c:1472 +#, c-format +msgid "%s %s" +msgstr "%s %s" + +#: ../src/vikwindow.c:1929 +msgid "_Ruler" +msgstr "" + +#: ../src/vikwindow.c:1929 +msgid "Ruler Tool" +msgstr "Ferramenta Régua" + +#: ../src/vikwindow.c:2204 ../src/vikwindow.c:4818 +msgid "_Zoom" +msgstr "_Zoom" + +#: ../src/vikwindow.c:2204 +msgid "Zoom Tool" +msgstr "" + +#: ../src/vikwindow.c:2271 ../src/vikwindow.c:4819 +msgid "_Pan" +msgstr "_Panela" + +#: ../src/vikwindow.c:2271 +msgid "Pan Tool" +msgstr "" + +#: ../src/vikwindow.c:2425 +msgid "_Select" +msgstr "" + +#: ../src/vikwindow.c:2425 +msgid "Select Tool" +msgstr "" + +#: ../src/vikwindow.c:2615 +msgid "You must select a layer to show its properties." +msgstr "Você deve selecionar uma camada para mostrar suas propriedades." + +#. No error to show, so unlikely this will get called +#: ../src/vikwindow.c:2629 +msgid "The help system is not available." +msgstr "" + +#. Main error path +#: ../src/vikwindow.c:2632 +#, c-format +msgid "" +"Help is not available because: %s.\n" +"Ensure a Mime Type ghelp handler program is installed (e.g. yelp)." +msgstr "" + +#: ../src/vikwindow.c:2865 +msgid "You must select a layer to delete." +msgstr "Você deve selecionar uma camada para excluir." + +#: ../src/vikwindow.c:3171 +msgid "Untitled" +msgstr "Sem Título" + +#: ../src/vikwindow.c:3300 +#, c-format +msgid "Unable to add '%s' to the list of recently used documents" +msgstr "" +"Não é possível adicionar \"%s\" para a lista de documentos usados ​​" +"recentemente" + +#: ../src/vikwindow.c:3391 +msgid "The file you requested could not be opened." +msgstr "O arquivo solicitado não pôde ser aberto." + +#: ../src/vikwindow.c:3394 +msgid "" +"GPSBabel is required to load files of this type or GPSBabel encountered " +"problems." +msgstr "" + +#: ../src/vikwindow.c:3397 +#, c-format +msgid "Unable to load malformed GPX file %s" +msgstr "" + +#: ../src/vikwindow.c:3400 +#, c-format +msgid "Unsupported file type for %s" +msgstr "" + +#. Since we can process .vik files with issues just show a warning in the status bar +#. Not that a user can do much about it... or tells them what this issue is yet... +#: ../src/vikwindow.c:3406 +#, c-format +msgid "WARNING: issues encountered loading %s" +msgstr "" + +#: ../src/vikwindow.c:3489 +msgid "Please select a GPS data file to open. " +msgstr "Por favor selecione um arquivo de dados GPS para abrir. " + +#: ../src/vikwindow.c:3508 +msgid "Google Earth" +msgstr "" + +#: ../src/vikwindow.c:3523 ../src/vikwindow.c:3646 ../src/viking.desktop.in.h:1 +msgid "Viking" +msgstr "Viking" + +#: ../src/vikwindow.c:3594 ../src/vikwindow.c:4632 +msgid "Open File" +msgstr "" + +#: ../src/vikwindow.c:3630 +msgid "Save as Viking File." +msgstr "Salvar como Arquivo Viking." + +#: ../src/vikwindow.c:3757 +#, c-format +msgid "Exporting to file: %s" +msgstr "" + +#. Confirm what happened. +#: ../src/vikwindow.c:3774 +#, c-format +msgid "Exported files: %d" +msgstr "" + +#: ../src/vikwindow.c:3786 +msgid "Nothing to Export!" +msgstr "" + +#: ../src/vikwindow.c:3790 +msgid "Export to directory" +msgstr "" + +#: ../src/vikwindow.c:3809 +msgid "Could not convert all files" +msgstr "" + +#: ../src/vikwindow.c:3851 +msgid "File not accessible" +msgstr "" + +#: ../src/vikwindow.c:3854 +msgid "No Viking File" +msgstr "" + +#: ../src/vikwindow.c:3998 +msgid "This layer has no configurable properties." +msgstr "" + +#: ../src/vikwindow.c:4080 +msgid "Are you sure you wish to delete all layers?" +msgstr "Tem certeza que deseja apagar todas as camadas?" + +#. Try harder... +#: ../src/vikwindow.c:4126 ../src/vikwindow.c:4132 +msgid "Generating image file..." +msgstr "" + +#: ../src/vikwindow.c:4154 +msgid "" +"Failed to generate internal image.\n" +"\n" +"Try creating a smaller image." +msgstr "" + +#: ../src/vikwindow.c:4175 +msgid "Image file generated." +msgstr "" + +#: ../src/vikwindow.c:4177 +msgid "Failed to generate image file." +msgstr "" + +#: ../src/vikwindow.c:4246 +#, c-format +msgid "Unable to write to file %s: %s" +msgstr "" + +#: ../src/vikwindow.c:4284 +msgid "" +"Viewable region outside allowable pixel size bounds for image. Clipping " +"width/height values." +msgstr "" +"Região visível fora dos limites admissíveis do tamanho do pixel de imagem. " +"Largura de recorte valores/altura." + +#: ../src/vikwindow.c:4309 +#, c-format +msgid "Total area: %ldm x %ldm (%.3f sq. km)" +msgstr "Área total: %ldm x %ldm (%.3f sq. km)" + +#: ../src/vikwindow.c:4312 +#, c-format +msgid "Total area: %ldm x %ldm (%.3f sq. miles)" +msgstr "Área total: %ldm x %ldm (%.3f milhas quadrados)" + +#: ../src/vikwindow.c:4315 +#, c-format +msgid "Total area: %ldm x %ldm (%.3f sq. NM)" +msgstr "" + +#. Single file +#: ../src/vikwindow.c:4343 +msgid "Save Image" +msgstr "Salvar Imagem" + +#: ../src/vikwindow.c:4364 ../src/vikwindow.c:4641 +msgid "KMZ" +msgstr "" + +#: ../src/vikwindow.c:4417 +msgid "You must be in UTM mode to use this feature" +msgstr "Você deve estar no modo UTM para usar este recurso" + +#: ../src/vikwindow.c:4421 +msgid "Choose a directory to hold images" +msgstr "Escolha um diretório para armazenar as imagens" + +#. todo: default for answers inside VikWindow or static (thruout instance) +#: ../src/vikwindow.c:4441 +msgid "Save to Image File" +msgstr "Salvar como Arquivo de Imagem." + +#: ../src/vikwindow.c:4457 +msgid "Width (pixels):" +msgstr "Largura (pixels):" + +#: ../src/vikwindow.c:4459 +msgid "Height (pixels):" +msgstr "Altura (pixels):" + +#: ../src/vikwindow.c:4462 +msgid "" +"WARNING: USING LARGE IMAGES OVER 10000x10000\n" +"MAY CRASH THE PROGRAM!" +msgstr "" + +#: ../src/vikwindow.c:4464 +msgid "Zoom (meters per pixel):" +msgstr "Zoom (metros por pixel):" + +#: ../src/vikwindow.c:4480 +msgid "Area in current viewable window" +msgstr "Área visível na janela atual" + +#: ../src/vikwindow.c:4490 +msgid "Save as PNG" +msgstr "Salvar como PNG" + +#: ../src/vikwindow.c:4491 +msgid "Save as JPEG" +msgstr "Salvar como JPEG" + +#: ../src/vikwindow.c:4520 +msgid "East-west image tiles:" +msgstr "Imagem telhas Leste-Oeste:" + +#: ../src/vikwindow.c:4522 +msgid "North-south image tiles:" +msgstr "Telhas de imagem Norte-Sul:" + +#: ../src/vikwindow.c:4619 +msgid "This feature is not available in UTM mode" +msgstr "" + +#: ../src/vikwindow.c:4658 +#, c-format +msgid "Unable to import %s." +msgstr "" + +#: ../src/vikwindow.c:4749 +msgid "Choose a background color" +msgstr "Escolha uma cor de fundo" + +#: ../src/vikwindow.c:4765 +msgid "Choose a track highlight color" +msgstr "" + +#: ../src/vikwindow.c:4814 +msgid "_File" +msgstr "_Arquivo" + +#: ../src/vikwindow.c:4815 +msgid "_Edit" +msgstr "_Editar" + +#: ../src/vikwindow.c:4817 +msgid "_Show" +msgstr "_Mostrar" + +#: ../src/vikwindow.c:4820 +msgid "_Layers" +msgstr "_Camadas" + +#: ../src/vikwindow.c:4821 +msgid "_Tools" +msgstr "_Ferramentas" + +#: ../src/vikwindow.c:4822 +msgid "_Webtools" +msgstr "_Ferramentas da Web" + +#: ../src/vikwindow.c:4823 ../src/vikwindow.c:4893 +msgid "_Help" +msgstr "_Ajuda" + +#: ../src/vikwindow.c:4825 +msgid "New file" +msgstr "Novo arquivo" + +#: ../src/vikwindow.c:4826 +msgid "_Open..." +msgstr "_Abrir..." + +#: ../src/vikwindow.c:4826 +msgid "Open a file" +msgstr "Abrir um arquivo" + +#: ../src/vikwindow.c:4827 +msgid "Open _Recent File" +msgstr "Abrir_ Arquivo Recente" + +#: ../src/vikwindow.c:4828 +msgid "Append _File..." +msgstr "Anexar _Arquivo ..." + +#: ../src/vikwindow.c:4828 +msgid "Append data from a different file" +msgstr "Acrescentar dados de um arquivo diferente" + +#: ../src/vikwindow.c:4829 +msgid "Open GPX as External _Layer..." +msgstr "" + +#: ../src/vikwindow.c:4829 +msgid "Open a GPX file as an external layer" +msgstr "" + +#: ../src/vikwindow.c:4830 +msgid "_Export All" +msgstr "" + +#: ../src/vikwindow.c:4830 +msgid "Export All TrackWaypoint Layers" +msgstr "" + +#: ../src/vikwindow.c:4831 +msgid "_GPX..." +msgstr "" + +#: ../src/vikwindow.c:4831 +msgid "Export as GPX" +msgstr "" + +#: ../src/vikwindow.c:4832 +msgid "A_cquire" +msgstr "A_dquirir" + +#: ../src/vikwindow.c:4833 +msgid "_Directions..." +msgstr "" + +#: ../src/vikwindow.c:4833 +msgid "Get driving directions" +msgstr "" + +#: ../src/vikwindow.c:4835 +msgid "_OSM Traces..." +msgstr "" + +#: ../src/vikwindow.c:4835 +msgid "Get traces from OpenStreetMap" +msgstr "" + +#: ../src/vikwindow.c:4836 +msgid "_My OSM Traces..." +msgstr "" + +#: ../src/vikwindow.c:4836 +msgid "Get Your Own Traces from OpenStreetMap" +msgstr "" + +#: ../src/vikwindow.c:4839 +msgid "Geo_caches..." +msgstr "Geo_caches..." + +#: ../src/vikwindow.c:4839 +msgid "Get Geocaches from geocaching.com" +msgstr "Obter Geocaches de geocaching.com" + +#: ../src/vikwindow.c:4842 +msgid "Create waypoints from geotagged images" +msgstr "" + +#: ../src/vikwindow.c:4844 +msgid "Get a file from a URL" +msgstr "" + +#: ../src/vikwindow.c:4846 +msgid "Create waypoints from Wikipedia items in the current view" +msgstr "" + +#: ../src/vikwindow.c:4848 +msgid "_Save" +msgstr "_Salvar" + +#: ../src/vikwindow.c:4848 +msgid "Save the file" +msgstr "Salve o arquivo" + +#: ../src/vikwindow.c:4849 +msgid "Save _As..." +msgstr "Salvar _Como..." + +#: ../src/vikwindow.c:4849 +msgid "Save the file under different name" +msgstr "Salve o arquivo com nome diferente" + +#: ../src/vikwindow.c:4850 +msgid "Properties..." +msgstr "" + +#: ../src/vikwindow.c:4850 +msgid "File Properties" +msgstr "" + +#: ../src/vikwindow.c:4852 +msgid "Import KMZ _Map File..." +msgstr "" + +#: ../src/vikwindow.c:4852 +msgid "Import a KMZ file" +msgstr "" + +#: ../src/vikwindow.c:4853 +msgid "Generate _KMZ Map File..." +msgstr "" + +#: ../src/vikwindow.c:4853 +msgid "Generate a KMZ file with an overlay of the current view" +msgstr "" + +#: ../src/vikwindow.c:4855 +msgid "_Generate Image File..." +msgstr "_Gerar arquivo de imagem..." + +#: ../src/vikwindow.c:4855 +msgid "Save a snapshot of the workspace into a file" +msgstr "Salvar um snapshot da área de trabalho em um arquivo" + +#: ../src/vikwindow.c:4856 +msgid "Generate _Directory of Images..." +msgstr "Gerar _Lista de imagens..." + +#: ../src/vikwindow.c:4856 +msgid "Generate _Directory of Images" +msgstr "" + +#: ../src/vikwindow.c:4857 +msgid "_Print..." +msgstr "_Imprimir..." + +#: ../src/vikwindow.c:4857 +msgid "Print maps" +msgstr "Imprimir mapas" + +#: ../src/vikwindow.c:4858 +msgid "E_xit" +msgstr "S_air" + +#: ../src/vikwindow.c:4858 +msgid "Exit the program" +msgstr "Sair do programa" + +#: ../src/vikwindow.c:4859 +msgid "Save and Exit" +msgstr "Salvar e Sair" + +#: ../src/vikwindow.c:4859 +msgid "Save and Exit the program" +msgstr "Salvar e Sair do programa" + +#: ../src/vikwindow.c:4861 +msgid "Go to the Pre_vious Location" +msgstr "" + +#: ../src/vikwindow.c:4861 +msgid "Go to the previous location" +msgstr "" + +#: ../src/vikwindow.c:4862 +msgid "Go to the _Next Location" +msgstr "" + +#: ../src/vikwindow.c:4862 +msgid "Go to the next location" +msgstr "" + +#: ../src/vikwindow.c:4863 +msgid "Go to the _Default Location" +msgstr "Ir para o Local _Padrão" + +#: ../src/vikwindow.c:4863 +msgid "Go to the default location" +msgstr "Ir para o local padrão" + +#: ../src/vikwindow.c:4864 +#, fuzzy +msgid "Go to the _Auto Location" +msgstr "Ir para o Local _Padrão" + +#: ../src/vikwindow.c:4864 +msgid "Go to a location via automatic lookup" +msgstr "" + +#: ../src/vikwindow.c:4865 +msgid "Go to _Location..." +msgstr "Ir para _Local..." + +#: ../src/vikwindow.c:4865 +msgid "Go to address/place using text search" +msgstr "Ir para endereço/local usando a pesquisa de texto" + +#: ../src/vikwindow.c:4866 +msgid "_Go to Lat/Lon..." +msgstr "_Ir para Latitude/Longevitude..." + +#: ../src/vikwindow.c:4866 +msgid "Go to arbitrary lat/lon coordinate" +msgstr "Ir para latitude arbitrária/longitude coordenadas" + +#: ../src/vikwindow.c:4867 +msgid "Go to UTM..." +msgstr "Ir para UTM..." + +#: ../src/vikwindow.c:4867 +msgid "Go to arbitrary UTM coordinate" +msgstr "Ir para UTM arbitrário de coordenadas" + +#: ../src/vikwindow.c:4868 +#, fuzzy +msgid "Go to Today" +msgstr "Ir para UTM" + +#: ../src/vikwindow.c:4868 +msgid "Go to today on the calendar" +msgstr "" + +#: ../src/vikwindow.c:4869 +msgid "_Refresh" +msgstr "" + +#: ../src/vikwindow.c:4869 +msgid "Refresh any maps displayed" +msgstr "" + +#: ../src/vikwindow.c:4870 +msgid "Set _Highlight Color..." +msgstr "" + +#: ../src/vikwindow.c:4870 +msgid "Set Highlight Color" +msgstr "" + +#: ../src/vikwindow.c:4871 +msgid "Set Bac_kground Color..." +msgstr "Definir cor _de fundo..." + +#: ../src/vikwindow.c:4871 +msgid "Set Background Color" +msgstr "" + +#: ../src/vikwindow.c:4872 +msgid "Zoom _In" +msgstr "_Ampliar" + +#: ../src/vikwindow.c:4872 +msgid "Zoom In" +msgstr "" + +#: ../src/vikwindow.c:4873 +msgid "Zoom _Out" +msgstr "_Reduzir" + +#: ../src/vikwindow.c:4873 +msgid "Zoom Out" +msgstr "" + +#: ../src/vikwindow.c:4874 +msgid "Zoom _To..." +msgstr "_ Zoom para..." + +#: ../src/vikwindow.c:4874 +msgid "Zoom To" +msgstr "" + +#: ../src/vikwindow.c:4875 +msgid "Pan _North" +msgstr "" + +#: ../src/vikwindow.c:4876 +msgid "Pan _East" +msgstr "" + +#: ../src/vikwindow.c:4877 +msgid "Pan _South" +msgstr "" + +#: ../src/vikwindow.c:4878 +msgid "Pan _West" +msgstr "" + +#: ../src/vikwindow.c:4879 +msgid "Background _Jobs" +msgstr "" + +#: ../src/vikwindow.c:4879 +msgid "Background Jobs" +msgstr "" + +#: ../src/vikwindow.c:4881 +msgid "Cu_t" +msgstr "" + +#: ../src/vikwindow.c:4885 +msgid "Delete All" +msgstr "Excluir tudo" + +#: ../src/vikwindow.c:4886 +msgid "Copy Centre _Location" +msgstr "" + +#: ../src/vikwindow.c:4887 +msgid "_Flush Map Cache" +msgstr "" + +#: ../src/vikwindow.c:4888 +msgid "_Set the Default Location" +msgstr "" + +#: ../src/vikwindow.c:4888 +msgid "Set the Default Location to the current position" +msgstr "" + +#: ../src/vikwindow.c:4889 +msgid "_Preferences" +msgstr "" + +#: ../src/vikwindow.c:4889 +msgid "Program Preferences" +msgstr "" + +#: ../src/vikwindow.c:4890 +msgid "_Layer Defaults" +msgstr "" + +#: ../src/vikwindow.c:4891 +msgid "_Properties" +msgstr "" + +#: ../src/vikwindow.c:4893 +msgid "Help" +msgstr "" + +#: ../src/vikwindow.c:4894 +msgid "_About" +msgstr "" + +#: ../src/vikwindow.c:4894 +msgid "About" +msgstr "" + +#: ../src/vikwindow.c:4903 +msgid "_KML..." +msgstr "" + +#: ../src/vikwindow.c:4903 +msgid "Export as KML" +msgstr "" + +#: ../src/vikwindow.c:4904 +msgid "Transfer data from a GPS device" +msgstr "Transferir de dados de um dispositivo GPS." + +#: ../src/vikwindow.c:4905 +msgid "Import file via GPSBabel converter" +msgstr "" + +#: ../src/vikwindow.c:4909 +msgid "Import Geo_JSON File..." +msgstr "" + +#: ../src/vikwindow.c:4909 +msgid "Import GeoJSON file" +msgstr "" + +#: ../src/vikwindow.c:4914 +msgid "_UTM Mode" +msgstr "" + +#: ../src/vikwindow.c:4915 +msgid "_Expedia Mode" +msgstr "" + +#: ../src/vikwindow.c:4916 +msgid "_Mercator Mode" +msgstr "" + +#: ../src/vikwindow.c:4917 +msgid "Lat_/Lon Mode" +msgstr "" + +#: ../src/vikwindow.c:4921 +msgid "Show _Scale" +msgstr "" + +#: ../src/vikwindow.c:4921 +msgid "Show Scale" +msgstr "Mostrar Escala" + +#: ../src/vikwindow.c:4922 +msgid "Show _Center Mark" +msgstr "" + +#: ../src/vikwindow.c:4922 +msgid "Show Center Mark" +msgstr "" + +#: ../src/vikwindow.c:4923 +msgid "Show _Highlight" +msgstr "" + +#: ../src/vikwindow.c:4923 +msgid "Show Highlight" +msgstr "" + +#: ../src/vikwindow.c:4924 +msgid "_Full Screen" +msgstr "Во весь экран" + +#: ../src/vikwindow.c:4924 +msgid "Activate full screen mode" +msgstr "" + +#: ../src/vikwindow.c:4925 +msgid "Show Side _Panel" +msgstr "" + +#: ../src/vikwindow.c:4925 +msgid "Show Side Panel" +msgstr "Mostrar Painel Lateral" + +#: ../src/vikwindow.c:4926 +msgid "Show Status_bar" +msgstr "" + +#: ../src/vikwindow.c:4926 +msgid "Show Statusbar" +msgstr "" + +#: ../src/vikwindow.c:4927 +msgid "Show _Toolbar" +msgstr "" + +#: ../src/vikwindow.c:4927 +msgid "Show Toolbar" +msgstr "" + +#: ../src/vikwindow.c:4928 +msgid "Show _Menu" +msgstr "" + +#: ../src/vikwindow.c:4928 +msgid "Show Menu" +msgstr "" + +#: ../src/vikwindow.c:4929 +#, fuzzy +msgid "Show Side Panel B_uttons" +msgstr "Mostrar Painel Lateral" + +#: ../src/vikwindow.c:4929 +#, fuzzy +msgid "Show Side Panel Buttons" +msgstr "Mostrar Painel Lateral" + +#: ../src/vikwindow.c:4930 +#, fuzzy +msgid "Show Side Panel Ca_lendar" +msgstr "Mostrar Painel Lateral" + +#: ../src/vikwindow.c:4930 +#, fuzzy +msgid "Show Side Panel Calendar" +msgstr "Mostrar Painel Lateral" + +#: ../src/vikwindow.c:5064 +#, c-format +msgid "New _%s Layer" +msgstr "" + +#: ../src/vikwindow.c:5114 +#, fuzzy +msgid "..." +msgstr "Adicionar..." + +#: ../src/viking.desktop.in.h:2 +msgid "GPS Data Manager" +msgstr "Gerenciador de dados GPS" + +#: ../src/viking.desktop.in.h:3 +msgid "Map Based GPS Data Manager (live data capable)." +msgstr "" + +#: ../src/libjpeg/jpeg-data.c:205 +msgid "Data does not follow JPEG specification." +msgstr "" + +#: ../src/libjpeg/jpeg-data.c:302 +#, c-format +msgid "Path '%s' invalid." +msgstr "" + +#: ../src/libjpeg/jpeg-data.c:320 +#, c-format +msgid "Could not read '%s'." +msgstr "" + +#~ msgid "Polygonzied Layer" +#~ msgstr "Camada Poligonizada" + +#~ msgid "Email:" +#~ msgstr "Email:" + +#~ msgid "I don't know that place. Do you want another goto?" +#~ msgstr "Eu não sei esse lugar. Quer mais goto?" + +#~ msgid "Error: couldn't find gpsbabel." +#~ msgstr "Erro: Não foi possível encontrar o gpsbabel." + +#~ msgid "Create Track" +#~ msgstr "Criar Track" diff --git a/po/ru.po b/po/ru.po new file mode 100644 index 0000000..ff031d8 --- /dev/null +++ b/po/ru.po @@ -0,0 +1,6325 @@ +# Russian translation for viking +# Copyright (c) 2008 Rosetta Contributors and Canonical Ltd 2008 +# This file is distributed under the same license as the viking package. +# Dmitri Bogomolov <4glitch@gmail.com>, 2008-2011. +# +msgid "" +msgstr "" +"Project-Id-Version: viking\n" +"Report-Msgid-Bugs-To: \n" +"POT-Creation-Date: 2019-01-19 12:53+0000\n" +"PO-Revision-Date: 2018-07-13 14:43+0000\n" +"Last-Translator: Nikolay Korotkiy \n" +"Language-Team: Russian \n" +"Language: ru\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" +"X-Launchpad-Export-Date: 2018-12-21 17:32+0000\n" +"X-Generator: Launchpad (build 18847)\n" + +#: ../src/acquire.c:106 ../src/vikgpslayer.c:1367 +msgid "Done." +msgstr "Готово." + +#: ../src/acquire.c:115 +msgid "No data." +msgstr "Нет данных." + +#: ../src/acquire.c:167 ../src/acquire.c:415 +msgid "Error: acquisition failed." +msgstr "Ошибка: получение не удалось" + +#: ../src/acquire.c:339 +msgid "Working..." +msgstr "Выполняется..." + +#. This shouldn't happen... +#: ../src/acquire.c:406 +msgid "" +"Unable to create command\n" +"Acquire method failed." +msgstr "" +"Не удалось создать команду\n" +"Сбой метода получения." + +#: ../src/acquire.c:513 +msgid "_Filter" +msgstr "_Фильтр" + +#: ../src/acquire.c:528 +#, c-format +msgid "Filter with %s" +msgstr "Фильтровать с %s" + +#: ../src/acquire.c:545 +msgid "Filter" +msgstr "Фильтр" + +#: ../src/babel.c:640 +msgid "GPSBabel:" +msgstr "GPSBabel:" + +#: ../src/babel.c:641 +msgid "" +"Allow setting the specific instance of GPSBabel. You must restart Viking for " +"this value to take effect." +msgstr "" + +#: ../src/babel_ui.c:79 +msgid "Select a file format" +msgstr "Выберите формат файла" + +#: ../src/babel_ui.c:144 ../src/viktrwlayer.c:531 ../src/viktrwlayer.c:2882 +msgid "Tracks" +msgstr "Треки" + +#: ../src/babel_ui.c:149 ../src/viktrwlayer.c:2892 +msgid "Routes" +msgstr "Маршруты" + +#. ***** PARAMETERS ***** +#: ../src/babel_ui.c:154 ../src/viktrwlayer.c:531 ../src/viktrwlayer.c:2887 +msgid "Waypoints" +msgstr "Пункты" + +#: ../src/background.c:64 +#, c-format +msgid "%d items" +msgstr "%d элементов" + +#: ../src/background.c:287 +msgid "Threads:" +msgstr "Потоки:" + +#: ../src/background.c:288 +msgid "" +"Number of threads to use for Mapnik tasks. You need to restart Viking for a " +"change to this value to be used" +msgstr "" +"Количество потоков, отводимых под задачи Mapnik. Для применения параметра " +"необходимо перезапустить Viking" + +#: ../src/background.c:361 +msgid "Job" +msgstr "Операция" + +#: ../src/background.c:365 +msgid "Progress" +msgstr "Ход выполнения" + +#: ../src/background.c:373 +msgid "Viking Background Jobs" +msgstr "Фоновые задачи" + +#: ../src/bing.c:42 +msgid "Bing Aerial" +msgstr "" + +#: ../src/bing.c:48 +msgid "Bing" +msgstr "Bing" + +#. VIK_GTK_WINDOW_FROM_WIDGET(vp) +#: ../src/bingmapsource.c:514 +msgid "Bing attribution Loading" +msgstr "" + +#: ../src/clipboard.c:95 +msgid "paste failed" +msgstr "ошибка вставки" + +#: ../src/clipboard.c:105 +msgid "wrong clipboard data size" +msgstr "неправильный размер буфера обмена" + +#: ../src/clipboard.c:124 +#, c-format +msgid "" +"The clipboard contains sublayer data for %s layers. You must select a layer " +"of this type to paste the clipboard data." +msgstr "" +"Буфер содержит данные подслоя для %s слоев. Вы должны выбрать слой этого " +"типа, чтобы вставить данные из буфер обмена." + +#: ../src/clipboard.c:264 +msgid "" +"In order to paste a waypoint, please select an appropriate layer to paste " +"into." +msgstr "" +"Для того, чтобы вставить точку, выберите соответствующий слой для вставки." + +#: ../src/dialog.c:60 +msgid "Go to Lat/Lon" +msgstr "Перейти к широте/долготе" + +#: ../src/dialog.c:69 ../src/viktrwlayer_wpwin.c:173 +msgid "Latitude:" +msgstr "Широта:" + +#: ../src/dialog.c:72 ../src/viktrwlayer_wpwin.c:177 +msgid "Longitude:" +msgstr "Долгота:" + +#: ../src/dialog.c:102 +msgid "Go to UTM" +msgstr "Перейти к UTM" + +#: ../src/dialog.c:114 +msgid "Northing:" +msgstr "Северное отклонение:" + +#: ../src/dialog.c:117 +msgid "Easting:" +msgstr "Восточное отклонение:" + +#: ../src/dialog.c:121 ../src/vikgeoreflayer.c:902 +msgid "Zone:" +msgstr "Зона:" + +#: ../src/dialog.c:124 ../src/vikgeoreflayer.c:904 +msgid "Letter:" +msgstr "Буква:" + +#: ../src/dialog.c:246 ../src/geonamessearch.c:238 +#: ../src/datasource_osm_my_traces.c:505 +msgid "Nothing was selected" +msgstr "Ничего не выбрано" + +#: ../src/dialog.c:254 +msgid "Add Route" +msgstr "Добавить маршрут" + +#: ../src/dialog.c:254 +msgid "Add Track" +msgstr "Добавить трек" + +#: ../src/dialog.c:262 +msgid "Route Name:" +msgstr "Имя маршрута:" + +#: ../src/dialog.c:262 +msgid "Track Name:" +msgstr "Имя трека:" + +#: ../src/dialog.c:282 +msgid "Please enter a name for the track." +msgstr "Введите имя для трека." + +#: ../src/dialog.c:311 +msgid "Today" +msgstr "Сегодня" + +#: ../src/dialog.c:393 +msgid "Zoom Factors..." +msgstr "Масштабные коэффициенты..." + +#: ../src/dialog.c:407 +msgid "Zoom factor (in meters per pixel):" +msgstr "Масштабный коэффициент (в метрах на пиксел):" + +#: ../src/dialog.c:408 +msgid "X (easting): " +msgstr "X (восточнее): " + +#: ../src/dialog.c:409 +msgid "Y (northing): " +msgstr "Y (севернее): " + +#: ../src/dialog.c:414 +msgid "X and Y zoom factors must be equal" +msgstr "Масштабные коффициенты по X и Y должны совпадать" + +#: ../src/dialog.c:469 +msgid "1 min" +msgstr "1 мин" + +#: ../src/dialog.c:470 +msgid "1 hour" +msgstr "1 час" + +#: ../src/dialog.c:471 +msgid "1 day" +msgstr "1 день" + +#: ../src/dialog.c:472 +msgid "Custom (in minutes):" +msgstr "Произвольно (в минутах)" + +#: ../src/dialog.c:608 +#, c-format +msgid "" +"2003-2008, Evan Battaglia\n" +"2008-%s, Viking's contributors" +msgstr "" + +#: ../src/dialog.c:609 +msgid "GPS Data and Topo Analyzer, Explorer, and Manager." +msgstr "Анализатор, обозреватель и менеджер данных GPS." + +#: ../src/dialog.c:610 +msgid "" +"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.\n" +"\n" +"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.\n" +"\n" +"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., 59 Temple " +"Place, Suite 330, Boston, MA 02111-1307, USA" +msgstr "" +"Данная программа является свободным программным обеспечением; вы можете " +"распространять и (или) изменять её в соответствии с условиями GNU General " +"Public License, опубликованной Free Software Foundation; либо версии 2 " +"лицензии, или (на ваш выбор) любой более поздней.\n" +"\n" +"Эта программа распространяется в надежде, что она будет полезной, но БЕЗ " +"КАКИХ-ЛИБО ГАРАНТИЙ, даже без подразумеваемых гарантий КОММЕРЧЕСКОЙ ЦЕННОСТИ " +"или ПРИГОДНОСТИ ДЛЯ КОНКРЕТНЫХ ЦЕЛЕЙ. См. GNU General Public License для " +"более подробной информации.\n" +"\n" +"Вы должны были получить копию GNU General Public License вместе с этой " +"программой; если нет, напишите в Free Software Foundation, Inc., 59 Temple " +"Place, Suite 330, Boston, MA 02111-1307, USA" + +#: ../src/dialog.c:703 +msgid "Translation is coordinated on http://launchpad.net/viking" +msgstr "Перевод координируется на http://launchpad.net/viking" + +#: ../src/dialog.c:713 +msgid "Download along track" +msgstr "Скачать вдоль пути" + +#: ../src/dialog.c:720 +msgid "Map type:" +msgstr "Тип карты:" + +#: ../src/dialog.c:726 +msgid "Zoom level:" +msgstr "Увеличение/уменьшение:" + +#: ../src/dialog.c:766 +#, c-format +msgid "The map data is licensed: %s." +msgstr "Картографические данные лицензированы: %s." + +#: ../src/dialog.c:769 +#, c-format +msgid "" +"The data provided by '%s' are licensed under the following license: " +"%s." +msgstr "" +"Данные предоставлены сервисом '%s' под следующей лицензией: %s." + +#: ../src/dialog.c:773 +msgid "Open license" +msgstr "Открытая лицензия" + +#: ../src/expedia.c:54 +msgid "Expedia Street Maps" +msgstr "Карты Expedia" + +#: ../src/expedia.c:82 +msgid "Invalid expedia altitude" +msgstr "Недопустимая высота для Expedia" + +#: ../src/expedia.c:113 +#, c-format +msgid "" +"Couldn't open EXPEDIA image file (right after successful download! Please " +"report and delete image file!): %s" +msgstr "" +"Не удалось загрузить графический файл EXPEDIA (сразу после удачного " +"скачивания! Пожалуйста сообщите об ошибке и удалите файл!): %s" + +#: ../src/expedia.c:126 +#, c-format +msgid "" +"Couldn't save EXPEDIA image file (right after successful download! Please " +"report and delete image file!): %s" +msgstr "" +"Не удалось сохранить графический файл EXPEDIA (сразу после удачного " +"скачивания! Пожалуйста сообщите об ошибке и удалите файл!): %s" + +#: ../src/geonamessearch.c:115 +msgid "Search" +msgstr "Поиск" + +#: ../src/geonamessearch.c:117 +msgid "No entries found!" +msgstr "Записи не найдены!" + +#. NB could allow columns to be shifted around by doing this after each new +#. gtk_tree_view_column_set_reorderable ( column, TRUE ); +#. However I don't think is that useful, so I haven't put it in +#: ../src/geonamessearch.c:171 ../src/datasource_osm_my_traces.c:422 +#: ../src/viktrwlayer_tracklist.c:621 ../src/viktrwlayer_waypointlist.c:618 +msgid "Name" +msgstr "Название" + +#: ../src/geonamessearch.c:176 +msgid "Feature" +msgstr "Объект" + +#: ../src/geonamessearch.c:181 ../src/datasource_osm_my_traces.c:437 +msgid "Lat/Lon" +msgstr "Широта/долгота" + +#: ../src/geonamessearch.c:264 ../src/googlesearch.c:101 ../src/vikgoto.c:430 +msgid "couldn't map temp file" +msgstr "ошибка загрузки временного файла" + +#: ../src/geonamessearch.c:459 +#, fuzzy +msgid "Select articles" +msgstr "Выберите формат файла" + +#: ../src/geonamessearch.c:459 +#, fuzzy +msgid "Select the articles you want to add." +msgstr "Выберите формат файла" + +#: ../src/geonamessearch.c:475 +msgid "city" +msgstr "" + +#: ../src/geonamessearch.c:477 +#, fuzzy +msgid "edu" +msgstr "конец" + +#: ../src/geonamessearch.c:479 +msgid "airport" +msgstr "" + +#: ../src/geonamessearch.c:481 +msgid "mountain" +msgstr "" + +#: ../src/geonamessearch.c:483 +msgid "forest" +msgstr "" + +#: ../src/geonamessearch.c:485 +msgid "church" +msgstr "" + +#: ../src/geojson.c:74 +#, c-format +msgid "%s command failed: %s" +msgstr "%s невозможно выполнить команду: %s" + +#: ../src/geojson.c:146 ../src/gpx.c:1317 +#, c-format +msgid "failed to open temporary file: %s" +msgstr "не удалось открыть временный файл: %s" + +#: ../src/globals.c:67 +msgid "DDD" +msgstr "" + +#: ../src/globals.c:67 +#, fuzzy +msgid "DMM" +msgstr "DEM" + +#: ../src/globals.c:67 +#, fuzzy +msgid "DMS" +msgstr "DEM" + +#: ../src/globals.c:67 +msgid "Raw" +msgstr "Сырые данные" + +#: ../src/globals.c:68 +msgid "Kilometres" +msgstr "Километры" + +#: ../src/globals.c:68 +msgid "Miles" +msgstr "Мили" + +#: ../src/globals.c:68 +msgid "Nautical Miles" +msgstr "Морские мили" + +#. VIK_UNITS_SPEED_KILOMETRES_PER_HOUR: +#: ../src/globals.c:69 ../src/viktrwlayer_tracklist.c:655 ../src/vikutils.c:100 +msgid "km/h" +msgstr "км/ч" + +#: ../src/globals.c:69 ../src/viktrwlayer_tracklist.c:656 ../src/vikutils.c:78 +msgid "mph" +msgstr "миль/ч" + +#. VIK_UNITS_SPEED_METRES_PER_SECOND: +#: ../src/globals.c:69 ../src/viktrwlayer_tracklist.c:663 ../src/vikutils.c:81 +msgid "m/s" +msgstr "м/с" + +#: ../src/globals.c:69 ../src/viktrwlayer_tracklist.c:657 ../src/vikutils.c:84 +msgid "knots" +msgstr "узлов" + +#: ../src/globals.c:69 ../src/viktrwlayer_tracklist.c:658 ../src/vikutils.c:87 +msgid "s/km" +msgstr "" + +#: ../src/globals.c:69 ../src/viktrwlayer_tracklist.c:659 ../src/vikutils.c:90 +msgid "min/km" +msgstr "" + +#: ../src/globals.c:69 +msgid "s/mi" +msgstr "" + +#: ../src/globals.c:69 ../src/viktrwlayer_tracklist.c:661 ../src/vikutils.c:96 +msgid "min/mi" +msgstr "" + +#: ../src/globals.c:70 +#, fuzzy +msgid "Metres" +msgstr "Километры" + +#: ../src/globals.c:70 +msgid "Feet" +msgstr "" + +#: ../src/globals.c:73 +msgid "Locale" +msgstr "Местное" + +#: ../src/globals.c:73 +msgid "World" +msgstr "Мировое" + +#: ../src/globals.c:73 +msgid "UTC" +msgstr "UTC" + +#: ../src/globals.c:76 +msgid "Degree format:" +msgstr "Формат градусов:" + +#: ../src/globals.c:77 +msgid "Distance units:" +msgstr "Единица расстояния:" + +#: ../src/globals.c:78 +msgid "Speed units:" +msgstr "Единица скорости:" + +#: ../src/globals.c:79 +msgid "Height units:" +msgstr "Единица высоты:" + +#: ../src/globals.c:80 +msgid "Use large waypoint icons:" +msgstr "Крупные значки путевых точек:" + +#: ../src/globals.c:81 +msgid "Default latitude:" +msgstr "Широта по умолчанию:" + +#: ../src/globals.c:82 +msgid "Default longitude:" +msgstr "Долгота по умолчанию:" + +#: ../src/globals.c:83 +msgid "Time Display:" +msgstr "Время:" + +#: ../src/globals.c:84 +msgid "" +"Display times according to the reference frame. Locale is the user's system " +"setting. World is relative to the location of the object." +msgstr "" +"Отображение времени относительно зоны просмотра. Локальное использует " +"настройки системы. Мировое зависит от местоположения объекта" + +#: ../src/globals.c:90 +msgid "Alphabetical" +msgstr "По алфавиту" + +#: ../src/globals.c:90 ../src/datasource_osm_my_traces.c:432 +msgid "Time" +msgstr "По времени" + +#: ../src/globals.c:90 +msgid "Creation" +msgstr "По порядку создания" + +#: ../src/globals.c:91 +msgid "Title Case" +msgstr "С заглавной буквы" + +#: ../src/globals.c:91 +msgid "Lowercase" +msgstr "Строчные буквы" + +#: ../src/globals.c:94 +msgid "KML File Export Units:" +msgstr "Ед.измерения для экспорта в KML:" + +#: ../src/globals.c:95 +msgid "GPX Track Order:" +msgstr "Порядок треков GPX:" + +#: ../src/globals.c:96 +msgid "GPX Waypoint Symbols:" +msgstr "Символы путевых точек GPX:" + +#: ../src/globals.c:97 +msgid "" +"Save GPX Waypoint Symbol names in the specified case. May be useful for " +"compatibility with various devices" +msgstr "" +"Сохранять названия символов путевых точек GPX в указанном регистре. Может " +"быть полезно для совместимости с различными устройствами" + +#: ../src/globals.c:98 +#, fuzzy +msgid "GPX Creator:" +msgstr "По порядку создания" + +#: ../src/globals.c:99 +msgid "" +"The creator value when writing a GPX file. Otherwise when blank a default is " +"used." +msgstr "" + +#: ../src/globals.c:104 +msgid "Image Viewer:" +msgstr "Программа для просмотра изображений:" + +#: ../src/globals.c:109 +msgid "External GPX Program 1:" +msgstr "Внешняя GPX-программа 1:" + +#: ../src/globals.c:110 +msgid "External GPX Program 2:" +msgstr "Внешняя GPX-программа 2:" + +#: ../src/globals.c:113 +msgid "Absolute" +msgstr "Абсолютный" + +#: ../src/globals.c:113 +msgid "Relative" +msgstr "Относительный" + +#: ../src/globals.c:117 +msgid "Save File Reference Mode:" +msgstr "Режим сохранения пути к файлу:" + +#: ../src/globals.c:118 +msgid "" +"When saving a Viking .vik file, this determines how the directory paths of " +"filenames are written." +msgstr "" +"При сохранении .vik-файла этот параметр определяет, как Viking будет " +"записывать путь к файлу." + +#: ../src/globals.c:119 +msgid "Ask for Name before Track Creation:" +msgstr "Спрашивать название перед созданием трека" + +#: ../src/globals.c:120 +msgid "Show Tooltip during Track Creation:" +msgstr "Всплывающая подсказка при создании трека:" + +#: ../src/globals.c:121 +msgid "The number of recent files:" +msgstr "Размер списка недавних файлов" + +#: ../src/globals.c:122 +msgid "" +"Only applies to new windows or on application restart. -1 means all " +"available files." +msgstr "" +"Применяется к новым окнам или после перезапуска программы. -1 означает все " +"доступные фалы" + +#: ../src/globals.c:123 +#, fuzzy +msgid "Open files in selected layer:" +msgstr "Удалить выбранный слой" + +#: ../src/globals.c:124 +msgid "Open files (but not .vik ones) into the selected TrackWaypoint layer." +msgstr "" + +#: ../src/globals.c:125 +msgid "Show calendar day names:" +msgstr "" + +#: ../src/globals.c:128 +msgid "Home Location" +msgstr "Домашнее местоположение" + +#: ../src/globals.c:128 +msgid "Last Location" +msgstr "Последнее местоположение" + +#: ../src/globals.c:128 +msgid "Specified File" +msgstr "Указанный файл" + +#: ../src/globals.c:128 +msgid "Auto Location" +msgstr "Автоматическое местоположение" + +#: ../src/globals.c:131 +msgid "Restore Window Setup:" +msgstr "Восстановить настройки окна:" + +#: ../src/globals.c:132 +msgid "Restore window size and layout" +msgstr "Восстановить размер и расположение окна" + +#: ../src/globals.c:133 +msgid "Add a Default Map Layer:" +msgstr "Добавлять слой карты по умолчанию:" + +#: ../src/globals.c:134 +msgid "" +"The default map layer added is defined by the Layer Defaults. Use the menu " +"Edit->Layer Defaults->Map... to change the map type and other values." +msgstr "" +"Будет добавляться по умолчанию слой карты, определённый в меню «Параметры " +"слоёв по умолчанию». Используйте меню Правка->Параметры слоёв по умолчанию-" +">Карта... для изменения типа карты и других значений." + +#: ../src/globals.c:135 +msgid "Startup Method:" +msgstr "Метод запуска:" + +#: ../src/globals.c:136 +msgid "Startup File:" +msgstr "Загружать файл:" + +#: ../src/globals.c:137 +msgid "" +"The default file to load on startup. Only applies when the startup method is " +"set to 'Specified File'" +msgstr "" +"Файл, по умолчанию загружаемый при запуске. Применяется только когда выбран " +"метод запуска 'Указанный файл'" + +#: ../src/globals.c:138 +msgid "Check For New Version:" +msgstr "Проверка обновлений:" + +#: ../src/globals.c:139 +msgid "Periodically check to see if a new version of Viking is available" +msgstr "Периодически проверять доступность новых версий Viking" + +#. Defaults for the options are setup here +#: ../src/globals.c:176 +msgid "General" +msgstr "Общие" + +#. New Tab +#: ../src/globals.c:204 +msgid "Startup" +msgstr "Запуск" + +#. New Tab +#: ../src/globals.c:222 +msgid "Export/External" +msgstr "Экспорт/Внешние" + +#. 'Advanced' Properties +#: ../src/globals.c:249 +msgid "Advanced" +msgstr "Расширенные" + +#. Webtools +#: ../src/google.c:39 +msgid "Google" +msgstr "Google" + +#. If there is an actual description field it will overwrite this value +#: ../src/gpx.c:264 +#, c-format +msgid "Created by: %s" +msgstr "" + +#: ../src/datasource_bfilter.c:43 +msgid "Max number of points:" +msgstr "Максимальное количество точек" + +#: ../src/datasource_bfilter.c:84 +msgid "Simplify All Tracks..." +msgstr "Упростить все треки" + +#: ../src/datasource_bfilter.c:85 +msgid "Simplified Tracks" +msgstr "Упрощенные треки" + +#. { VIK_LAYER_NUM_TYPES, "compressmethod", VIK_LAYER_PARAM_UINT, VIK_LAYER_GROUP_NONE, N_("Simplify Method:"), VIK_LAYER_WIDGET_COMBOBOX, compress_method, NULL, NULL, NULL, NULL, NULL }, +#: ../src/datasource_bfilter.c:111 +msgid "Error Factor:" +msgstr "" + +#: ../src/datasource_bfilter.c:112 +msgid "" +"Specifies the maximum allowable error that may be introduced by removing a " +"single point by the crosstrack method. See the manual or GPSBabel Simplify " +"Filter documentation for more detail." +msgstr "" + +#: ../src/datasource_bfilter.c:166 +msgid "Compress Tracks..." +msgstr "Сжать треки..." + +#: ../src/datasource_bfilter.c:167 +msgid "Compressed Tracks" +msgstr "Сжатые треки" + +#: ../src/datasource_bfilter.c:197 ../src/datasource_bfilter.c:198 +msgid "Remove Duplicate Waypoints" +msgstr "Удалить повторяющиеся точки" + +#: ../src/datasource_bfilter.c:221 +msgid "Manual filter:" +msgstr "Собственный фильтр:" + +#: ../src/datasource_bfilter.c:222 +msgid "Manual filter command: e.g. 'swap'." +msgstr "Команда собственного фильта, например 'swap'" + +#: ../src/datasource_bfilter.c:233 ../src/datasource_bfilter.c:234 +msgid "Manual filter" +msgstr "Собственный фильтр" + +#: ../src/datasource_bfilter.c:262 +msgid "Waypoints Inside This" +msgstr "Путевые точки внутри" + +#: ../src/datasource_bfilter.c:263 ../src/datasource_bfilter.c:292 +msgid "Polygonized Layer" +msgstr "Слой полигонов" + +#: ../src/datasource_bfilter.c:291 +msgid "Waypoints Outside This" +msgstr "Путевые точки вне" + +#: ../src/datasource_file.c:61 +msgid "Import file with GPSBabel" +msgstr "Импортировать с помощью GPSBabel" + +#: ../src/datasource_file.c:62 +msgid "Imported file" +msgstr "Импортированный файл" + +#. The file selector +#: ../src/datasource_file.c:129 +msgid "File:" +msgstr "Файл:" + +#: ../src/datasource_file.c:130 +msgid "File to import" +msgstr "Файл для импорта" + +#: ../src/datasource_file.c:137 +msgid "All files" +msgstr "Все файлы" + +#. The file format selector +#: ../src/datasource_file.c:144 ../src/datasource_url.c:106 +msgid "File type:" +msgstr "Тип файла:" + +#: ../src/datasource_file.c:189 +#, c-format +msgid "using babel args '%s' and file '%s'" +msgstr "используются аргументы babel '%s' и файл '%s'" + +#: ../src/datasource_gc.c:67 +msgid "Download Geocaches" +msgstr "Загрузить геокэши" + +#: ../src/datasource_gc.c:68 +msgid "Geocaching.com Caches" +msgstr "Кэши geocaching.com" + +#: ../src/datasource_gc.c:86 +msgid "geocaching.com username:" +msgstr "Имя пользователя geocaching.com:" + +#: ../src/datasource_gc.c:87 +msgid "geocaching.com password:" +msgstr "Пароль пользователя geocaching.com:" + +#: ../src/datasource_gc.c:92 ../src/vikwindow.c:3502 +msgid "Geocaching" +msgstr "Геокэшинг" + +#: ../src/datasource_gc.c:128 +#, c-format +msgid "" +"Can't find %s or %s in path! Check that you have installed it correctly." +msgstr "Невозможно найти %s или %s! Проверьте правильность установки." + +#: ../src/datasource_gc.c:190 +msgid "Number geocaches:" +msgstr "Количество геокешей:" + +#: ../src/datasource_gc.c:192 +msgid "Centered around:" +msgstr "Вокруг:" + +#: ../src/datasource_gc.c:231 +msgid "Broken input - using some defaults" +msgstr "Неверный ввод — использую некоторые умолчания" + +#: ../src/datasource_geotag.c:51 +msgid "Create Waypoints from Geotagged Images" +msgstr "Создать путевые точки из изображений с геотегами" + +#: ../src/datasource_geotag.c:52 +msgid "Geotagged Images" +msgstr "Изображения с данными о местоположении" + +#: ../src/datasource_geotag.c:102 ../src/datasource_geojson.c:93 +#: ../src/vikfileentry.c:171 ../src/vikwindow.c:3533 ../src/vikwindow.c:3610 +#: ../src/vikwindow.c:3641 ../src/vikwindow.c:4356 ../src/vikwindow.c:4649 +msgid "All" +msgstr "Все" + +#: ../src/datasource_geotag.c:107 ../src/vikfileentry.c:115 +#: ../src/viktrwlayer_geotag.c:637 ../src/vikwindow.c:3518 +#: ../src/vikwindow.c:4377 +msgid "JPG" +msgstr "JPG" + +#: ../src/datasource_geotag.c:168 +#, c-format +msgid "Unable to create waypoint from %s" +msgstr "Не удаётся создать путевую точку из %s" + +#: ../src/datasource_geojson.c:46 +msgid "Acquire from GeoJSON" +msgstr "Получено из GeoJSON" + +#: ../src/datasource_geojson.c:47 ../src/datasource_geojson.c:98 +msgid "GeoJSON" +msgstr "GeoJSON" + +#: ../src/datasource_geojson.c:152 +#, c-format +msgid "Unable to import from: %s" +msgstr "Невозможно импортировать из: %s" + +#: ../src/datasource_gps.c:54 +msgid "Acquire from GPS" +msgstr "Получить из GPS" + +#: ../src/datasource_gps.c:55 +msgid "Acquired from GPS" +msgstr "Получено из GPS" + +#: ../src/datasource_gps.c:258 +#, c-format +msgid "using cmd '%s' and file '%s'\n" +msgstr "использование команды '%s' и файла '%s'\n" + +#: ../src/datasource_gps.c:353 ../src/vikgpslayer.c:966 +#, c-format +msgid "Downloading %d waypoint..." +msgid_plural "Downloading %d waypoints..." +msgstr[0] "Скачивается %d путевая точка..." +msgstr[1] "Скачивается %d путевых точки..." +msgstr[2] "Скачивается %d путевых точек..." + +#: ../src/datasource_gps.c:358 ../src/vikgpslayer.c:971 +#, c-format +msgid "Downloading %d trackpoint..." +msgid_plural "Downloading %d trackpoints..." +msgstr[0] "Скачивается %d узел трека..." +msgstr[1] "Скачивается %d узла трека..." +msgstr[2] "Скачивается %d узлов трека..." + +#: ../src/datasource_gps.c:363 ../src/vikgpslayer.c:976 +#, c-format +msgid "Downloading %d routepoint..." +msgid_plural "Downloading %d routepoints..." +msgstr[0] "Скачивается %d маршрутная точка..." +msgstr[1] "Скачивается %d маршрутных точки..." +msgstr[2] "Скачивается %d маршрутных точек..." + +#: ../src/datasource_gps.c:386 ../src/datasource_gps.c:393 +#: ../src/datasource_gps.c:400 +#, c-format +msgid "Downloaded %d out of %d %s..." +msgstr "Скачано %d из %d %s..." + +#: ../src/datasource_gps.c:388 ../src/datasource_gps.c:395 +#: ../src/datasource_gps.c:402 +#, c-format +msgid "Downloaded %d %s." +msgstr "Скачано %d %s." + +#: ../src/datasource_gps.c:416 ../src/vikgpslayer.c:1134 +#, c-format +msgid "GPS Device: %s" +msgstr "GPS-устройство: %s" + +#: ../src/datasource_gps.c:428 ../src/vikgpslayer.c:1214 +msgid "Status: Working..." +msgstr "Статус: Работает..." + +#. NB gps_layer_inst_init() is performed after parameter registeration +#. thus to give the protocols some potential values use the old static list +#. TODO: find another way to use gps_layer_inst_init()? +#: ../src/datasource_gps.c:584 ../src/vikgpslayer.c:216 +msgid "GPS Protocol:" +msgstr "GPS протокол:" + +#. List reassigned at runtime +#: ../src/datasource_gps.c:609 ../src/vikgpslayer.c:217 +msgid "Serial Port:" +msgstr "Последовательный порт:" + +#: ../src/datasource_gps.c:659 +msgid "" +"Turn Off After Transfer\n" +"(Garmin/NAViLink Only)" +msgstr "" +"Выключить после передачи\n" +"(только для Garmin/NAViLink)" + +#: ../src/datasource_gps.c:666 +msgid "Tracks:" +msgstr "Треки:" + +#: ../src/datasource_gps.c:673 +msgid "Routes:" +msgstr "Маршруты:" + +#: ../src/datasource_gps.c:680 +msgid "Waypoints:" +msgstr "Путевые точки:" + +#: ../src/datasource_gps.c:756 ../src/vikgpslayer.c:1509 +msgid "GPS device: N/A" +msgstr "GPS устройство: недоступно" + +#: ../src/datasource_osm.c:53 ../src/datasource_osm.c:54 +msgid "OSM traces" +msgstr "Треки OSM" + +#: ../src/datasource_osm.c:89 +msgid "Page number:" +msgstr "Номер страницы:" + +#: ../src/datasource_osm_my_traces.c:59 ../src/datasource_osm_my_traces.c:60 +msgid "OSM My Traces" +msgstr "Мои треки OSM" + +#: ../src/datasource_osm_my_traces.c:106 ../src/osm-traces.c:684 +#, fuzzy +msgid "Email/username:" +msgstr "Имя пользователя:" + +#: ../src/datasource_osm_my_traces.c:111 +msgid "The email or username used to login to OSM" +msgstr "Адрес эл. почты или имя пользователя для входа в OSM" + +#: ../src/datasource_osm_my_traces.c:113 ../src/osm-traces.c:692 +msgid "Password:" +msgstr "Пароль:" + +#: ../src/datasource_osm_my_traces.c:116 +msgid "The password used to login to OSM" +msgstr "Пароль для входа в OSM" + +#: ../src/datasource_osm_my_traces.c:427 ../src/viktrwlayer.c:689 +msgid "Description" +msgstr "Описание" + +#: ../src/datasource_osm_my_traces.c:442 +msgid "Privacy" +msgstr "Конфиденциальность" + +#: ../src/datasource_osm_my_traces.c:449 +msgid "Within Current View" +msgstr "" + +#: ../src/datasource_osm_my_traces.c:516 +msgid "GPS Traces" +msgstr "GPS-треки" + +#: ../src/datasource_osm_my_traces.c:518 +msgid "None found!" +msgstr "Ничего не найдено!" + +#: ../src/datasource_osm_my_traces.c:569 +msgid "Ensure the OSM access token preferences are setup." +msgstr "" + +#: ../src/datasource_osm_my_traces.c:645 +msgid "My OSM Traces" +msgstr "Мои треки OSM" + +#. Report errors to the status bar +#: ../src/datasource_osm_my_traces.c:667 +#, c-format +msgid "Unable to get trace: %s" +msgstr "Не удалось получить трек: %s" + +#: ../src/datasource_routing.c:56 ../src/datasource_routing.c:57 +msgid "Directions" +msgstr "Маршрут" + +#: ../src/datasource_routing.c:90 +msgid "No routing engines with directions available" +msgstr "" + +#. Engine selector +#: ../src/datasource_routing.c:99 +msgid "Engine:" +msgstr "Движок:" + +#. From and To entries +#: ../src/datasource_routing.c:104 +msgid "From:" +msgstr "Из:" + +#: ../src/datasource_routing.c:105 +msgid "To:" +msgstr "в:" + +#: ../src/datasource_url.c:48 +msgid "Acquire from URL" +msgstr "Получено из URL" + +#: ../src/datasource_url.c:49 +msgid "URL" +msgstr "URL-адрес" + +#: ../src/datasource_url.c:101 +msgid "URL:" +msgstr "URL:" + +#. Only GPX (not using GPSbabel) +#: ../src/datasource_url.c:133 ../src/vikfileentry.c:161 +#: ../src/vikwindow.c:3513 ../src/vikwindow.c:3603 +msgid "GPX" +msgstr "GPX" + +#: ../src/datasource_wikipedia.c:32 +msgid "Create Waypoints from Wikipedia Articles" +msgstr "Создать путевые точки из статей Википедии" + +#: ../src/datasource_wikipedia.c:33 +msgid "Wikipedia Waypoints" +msgstr "Путевые точки из Википедии" + +#: ../src/dem.c:66 ../src/dem.c:80 +msgid "Invalid DEM" +msgstr "Неправильный DEM" + +#: ../src/dem.c:122 +msgid "Invalid DEM header" +msgstr "Неправильный DEM заголовок" + +#: ../src/dem.c:191 ../src/dem.c:204 +msgid "Incorrect DEM Class B record: expected 1" +msgstr "Неправильная запись DEM Class B: ожидается 1" + +#: ../src/dem.c:289 ../src/download.c:176 +#, c-format +msgid "Couldn't map file %s: %s" +msgstr "Ошибка загрузки файла %s: %s" + +#: ../src/download.c:130 +msgid "Tile age (days):" +msgstr "Срок хранения сегмента (дней):" + +#: ../src/download.c:406 +#, c-format +msgid "Download error: %s" +msgstr "Ошибка загрузки: %s" + +#: ../src/download.c:490 +msgid "couldn't open temp file" +msgstr "невозможно открыть временный файл" + +#: ../src/file.c:458 ../src/file.c:463 +#, c-format +msgid "Draw mode '%s' no more supported" +msgstr "Режим отображения '%s' больше не поддерживается" + +#: ../src/geotag_exif.c:621 +msgid "Not enough memory." +msgstr "Не хватает памяти." + +#: ../src/geotag_exif.c:639 +msgid "Setting a value for this tag is unsupported!" +msgstr "Установка значения для этого тега не поддерживается!" + +#: ../src/geotag_exif.c:658 +#, c-format +msgid "Too few components specified (need %d, found %d)\n" +msgstr "Слишком мало указанных компонентов (нужно %d, найдено %d)\n" + +#: ../src/geotag_exif.c:662 +msgid "Numeric value expected\n" +msgstr "Ожидаемые числовые значения\n" + +#: ../src/geotag_exif.c:670 +msgid "This shouldn't happen!" +msgstr "Это не должно случиться!" + +#: ../src/geotag_exif.c:740 +msgid "Not yet implemented!" +msgstr "Пока не реализовано!" + +#: ../src/geotag_exif.c:753 +msgid "Warning; Too many components specified!" +msgstr "Предупреждение: указано слишком много компонентов!" + +#: ../src/osm-traces.c:87 +msgid "Identifiable (public w/ timestamps)" +msgstr "Идентифицируемый (публичный с временными метками)" + +#: ../src/osm-traces.c:88 +msgid "Trackable (private w/ timestamps)" +msgstr "Отслеживаемый (личный с временными метками)" + +#: ../src/osm-traces.c:89 +msgid "Public" +msgstr "Публичное" + +#: ../src/osm-traces.c:90 +msgid "Private" +msgstr "Частное" + +#: ../src/osm-traces.c:108 +msgid "Access Token:" +msgstr "" + +#: ../src/osm-traces.c:108 +msgid "Get New OSM Access Tokens" +msgstr "" + +#: ../src/osm-traces.c:109 +msgid "Access Token Key:" +msgstr "" + +#: ../src/osm-traces.c:110 +msgid "Access Token Secret:" +msgstr "" + +#: ../src/osm-traces.c:111 +msgid "OSM username:" +msgstr "OSM имя:" + +#: ../src/osm-traces.c:112 +msgid "OSM password:" +msgstr "OSM пароль:" + +#. Check to really override existing values... +#: ../src/osm-traces.c:263 +msgid "Do you want to overwrite existing values?" +msgstr "" + +#: ../src/osm-traces.c:275 +msgid "Not able to generate OSM request tokens." +msgstr "" + +#: ../src/osm-traces.c:299 +msgid "" +"Waiting for authorization approval.\n" +"Ensure you have granted access at the website before continuing here." +msgstr "" + +#: ../src/osm-traces.c:315 +#, fuzzy +msgid "No Authorization." +msgstr "Автоматическое местоположение" + +#: ../src/osm-traces.c:354 +msgid "" +"OSM Username and Password preferences are not required anymore. You can now " +"remove them." +msgstr "" + +#. Preferences +#: ../src/osm-traces.c:379 +msgid "OpenStreetMap Traces" +msgstr "Треки OpenStreetMap" + +#: ../src/osm-traces.c:504 +#, c-format +msgid "failed to upload data: HTTP response is %ld" +msgstr "Не удалось загрузить данные: ответ HTTP %ld" + +#: ../src/osm-traces.c:509 +#, c-format +msgid "curl_easy_getinfo failed: %d" +msgstr "curl_easy_getinfo не удалось: %d" + +#: ../src/osm-traces.c:514 +#, c-format +msgid "curl request failed: %s" +msgstr "Неудачный запрос curl: %s" + +#. Success +#: ../src/osm-traces.c:592 +msgid "Uploaded to OSM" +msgstr "Загружено в OSM" + +#: ../src/osm-traces.c:596 +msgid "" +"FAILED TO UPLOAD DATA TO OSM - Ensure the OSM access token preferences are " +"setup." +msgstr "" + +#: ../src/osm-traces.c:599 +msgid "FAILED TO UPLOAD DATA TO OSM - CURL PROBLEM" +msgstr "Не удалось загрузить данные на OSM - проблема curl" + +#: ../src/osm-traces.c:602 +msgid "FAILED TO UPLOAD DATA TO OSM" +msgstr "НЕ УДАЛОСЬ ЗАГРУЗИТЬ ДАННЫЕ В OSM" + +#: ../src/osm-traces.c:602 +msgid "HTTP response code" +msgstr "код ответа HTTP" + +#: ../src/osm-traces.c:610 +#, c-format +msgid "failed to unlink temporary file: %s" +msgstr "не удалось удалить временный файл: %s" + +#: ../src/osm-traces.c:664 +msgid "OSM upload" +msgstr "Загрузить на OSM" + +#: ../src/osm-traces.c:689 +#, fuzzy +msgid "" +"The email/username used as login\n" +"Enter the email/username you use to login into www.openstreetmap.org." +"" +msgstr "" +"Email используется как имя для входа\n" +"Введите email, который вы используете для www.openstreetmap.org." + +#: ../src/osm-traces.c:697 +msgid "" +"The password used to login\n" +"Enter the password you use to login into www.openstreetmap.org." +msgstr "" +"Для входа нужен пароль\n" +"Введите пароль, который вы используете для www.openstreetmap.org." + +#: ../src/osm-traces.c:703 +msgid "File's name:" +msgstr "Имя файла:" + +#: ../src/osm-traces.c:713 +msgid "" +"The name of the file on OSM\n" +"This is the name of the file created on the server.This is not the " +"name of the local file." +msgstr "" +"Имя файла в OSM\n" +"Это имя для файла, созданного на сервере. Это не имя локального файла." +"" + +#: ../src/osm-traces.c:717 ../src/viktrwlayer_wpwin.c:197 +#: ../src/viktrwlayer_wpwin.c:199 +msgid "Description:" +msgstr "Описание:" + +#: ../src/osm-traces.c:731 +msgid "The description of the trace" +msgstr "Описание трека" + +#: ../src/osm-traces.c:734 +msgid "Anonymize Times:" +msgstr "Анонимизировать время:" + +#: ../src/osm-traces.c:739 +msgid "" +"Anonymize times of the trace.\n" +"You may choose to make the trace identifiable, yet mask the actual " +"real time values" +msgstr "" +"Анонимизировать временные метки трека.\n" +"Вы можете сделать трек идентифицируемым, но замаскировать реальные " +"значения времени" + +#: ../src/osm-traces.c:743 +msgid "Tags:" +msgstr "Тэги:" + +#: ../src/osm-traces.c:751 +msgid "The tags associated to the trace" +msgstr "Тэги, связанные с треком" + +#: ../src/osm-traces.c:816 +#, c-format +msgid "Uploading %s to OSM" +msgstr "%s загружается в OSM" + +#: ../src/mapcache.c:67 +msgid "Map cache memory size (MB):" +msgstr "Размер кэша карт (МБ):" + +#. NB Can have a couple hundred fonts loaded when using system directories +#. So ATM don't list them all - otherwise need better GUI feedback display. +#: ../src/mapnik_interface.cpp:324 +#, c-format +msgid "" +"%s %s\n" +"Plugins=%sFonts loaded=%d" +msgstr "" +"%s %s\n" +"Модули=%sШрифтов загружено=%d" + +#: ../src/mapnik_interface.cpp:325 ../src/vikmapniklayer.c:278 +msgid "Mapnik" +msgstr "Mapnik" + +#: ../src/print.c:51 ../src/viktrwlayer.c:572 +msgid "None" +msgstr "Нет" + +#: ../src/print.c:52 +msgid "Horizontally" +msgstr "По горизонтали" + +#: ../src/print.c:53 +msgid "Vertically" +msgstr "По вертикали" + +#: ../src/print.c:54 +msgid "Both" +msgstr "По горизонтали и вертикали" + +#: ../src/print.c:118 +msgid "Image Settings" +msgstr "Настройки изображения" + +#: ../src/print.c:551 +msgid "done" +msgstr "завершено" + +#. Page Size +#: ../src/print.c:580 +msgid "_Adjust Page Size and Orientation" +msgstr "На_строить размер и ориентацию страницы" + +#: ../src/print.c:596 +msgid "C_enter:" +msgstr "_Центрировать:" + +#. ignore page margins +#: ../src/print.c:614 +msgid "Ignore Page _Margins" +msgstr "_Игнорировать поля страницы" + +#: ../src/print.c:633 +msgid "Image S_ize:" +msgstr "Р_азмер изображения:" + +#: ../src/ui_util.c:88 +#, c-format +msgid "Could not launch web browser. %s" +msgstr "Не удалось запустить веб-браузер. %s" + +#: ../src/ui_util.c:101 +#, c-format +msgid "Could not create new email. %s" +msgstr "Не удалось создать почтовое сообщение. %s" + +#: ../src/vikcoordlayer.c:57 +msgid "Color:" +msgstr "Цвет:" + +#: ../src/vikcoordlayer.c:58 +msgid "Minutes Width:" +msgstr "Широта, минут:" + +#: ../src/vikcoordlayer.c:59 +msgid "Line Thickness:" +msgstr "Толщина линий" + +#: ../src/vikcoordlayer.c:66 +msgid "Coordinate" +msgstr "Координатная сетка" + +#: ../src/main.c:92 +#, c-format +msgid "Ignoring Xlib error: error code %d request code %d\n" +msgstr "Игнорируется ошибка Xlib: код ошибки %d, код запроса %d\n" + +#: ../src/main.c:111 +msgid "Enable debug output" +msgstr "Включить отладочную выдачу" + +#: ../src/main.c:112 +msgid "Enable verbose output" +msgstr "Включить подробную выдачу" + +#: ../src/main.c:113 +msgid "Show version" +msgstr "Показать версию" + +#: ../src/main.c:114 +msgid "Latitude in decimal degrees" +msgstr "Широта в десятичных градусах" + +#: ../src/main.c:115 +msgid "Longitude in decimal degrees" +msgstr "Долгота в десятичных градусах" + +#: ../src/main.c:116 +msgid "Zoom Level (OSM). Value can be 0 - 22" +msgstr "Уровень масштабирования (Zoom level OSM). В диапазоне 0 - 22" + +#: ../src/main.c:117 +msgid "Add a map layer by id value. Use 0 for the default map." +msgstr "Добавить слой карты по id. 0 для карты по-умолчанию" + +#: ../src/main.c:160 +#, c-format +msgid "" +"%s %s\n" +"Copyright (c) 2003-2008 Evan Battaglia\n" +"Copyright (c) 2008-%s Viking's contributors\n" +msgstr "" + +#: ../src/osm.c:50 +#, fuzzy +msgid "OpenStreetMap (Mapnik)" +msgstr "Треки OpenStreetMap" + +#: ../src/osm.c:65 +#, fuzzy +msgid "OpenStreetMap (Cycle)" +msgstr "Треки OpenStreetMap" + +#: ../src/osm.c:79 +#, fuzzy +msgid "OpenStreetMap (Transport)" +msgstr "Треки OpenStreetMap" + +#: ../src/osm.c:95 +#, fuzzy +msgid "OpenStreetMap (Humanitarian)" +msgstr "Треки OpenStreetMap" + +#: ../src/osm.c:111 +msgid "On Disk OSM Tile Format" +msgstr "" + +#: ../src/osm.c:121 +msgid "MBTiles File" +msgstr "Файл MBTiles" + +#: ../src/osm.c:132 +msgid "OSM Metatiles" +msgstr "Метафайлы OSM" + +#: ../src/osm.c:146 +msgid "Mapbox Outdoors" +msgstr "" + +#: ../src/osm.c:153 +msgid "Mapbox Specific" +msgstr "" + +#: ../src/osm.c:170 +msgid "OSM (view)" +msgstr "OSM (просмотр)" + +#: ../src/osm.c:174 +msgid "OSM (edit)" +msgstr "OSM (правка)" + +#. Note the use of positional parameters +#: ../src/osm.c:179 +msgid "OSM (query)" +msgstr "OSM (запрос)" + +#: ../src/osm.c:183 +msgid "OSM (render)" +msgstr "OSM (отрисовка)" + +#. Example: http://127.0.0.1:8111/load_and_zoom?left=8.19&right=8.20&top=48.605&bottom=48.590&select=node413602999 +#. JOSM or merkaartor must already be running with remote interface enabled +#: ../src/osm.c:190 +msgid "Local port 8111 (eg JOSM)" +msgstr "Локальный порт 8111 (напр., JOSM)" + +#: ../src/osm.c:195 +msgid "Geofabrik Map Compare" +msgstr "" + +#: ../src/osm.c:203 +msgid "OpenStreetMap Notes" +msgstr "Заметки OpenStreetMap" + +#. Not really OSM but can't be bothered to create somewhere else to put it... +#: ../src/osm.c:221 +msgid "Wikimedia Toolserver GeoHack" +msgstr "" + +#: ../src/preferences.c:195 +msgid "Preferences" +msgstr "Предпочтения" + +#: ../src/toolbar.c:91 ../src/toolbar.c:92 +msgid "System Default" +msgstr "По умолчанию" + +#: ../src/toolbar.c:91 ../src/viktrwlayer.c:563 +msgid "Small" +msgstr "Мелкий" + +#: ../src/toolbar.c:91 ../src/viktrwlayer.c:564 +msgid "Medium" +msgstr "Средний" + +#: ../src/toolbar.c:91 ../src/viktrwlayer.c:565 +msgid "Large" +msgstr "Крупный" + +#: ../src/toolbar.c:92 +msgid "Icons Only" +msgstr "Только значки" + +#: ../src/toolbar.c:92 +msgid "Text Only" +msgstr "Только текст" + +#: ../src/toolbar.c:92 +msgid "Icons and Text" +msgstr "Текст и значки" + +#: ../src/toolbar.c:106 +msgid "Append to Menu:" +msgstr "Добавить в меню:" + +#: ../src/toolbar.c:107 +msgid "Pack the toolbar to the main menu to save vertical space" +msgstr "" +"Поместить панель инструментов в основное меню для увеличения вертикального " +"пространства" + +#: ../src/toolbar.c:108 +msgid "Icon Size:" +msgstr "Размер значков:" + +#: ../src/toolbar.c:110 +msgid "Icon Style:" +msgstr "Стиль значков:" + +#: ../src/toolbar.c:112 +msgid "Customize:" +msgstr "Настройка:" + +#: ../src/toolbar.c:112 +msgid "Customize Buttons" +msgstr "Настройка кнопок" + +#. Preferences +#: ../src/toolbar.c:145 +msgid "Toolbar" +msgstr "Панель инструментов" + +#: ../src/toolbar.c:312 +msgid "_Customize" +msgstr "_Настроить" + +#: ../src/toolbar.c:641 +msgid "Separator" +msgstr "Разделитель" + +#: ../src/toolbar.c:642 +msgid "--- Separator ---" +msgstr "--- Разделитель ---" + +#: ../src/toolbar.c:1007 +msgid "Customize Toolbar" +msgstr "Настройка панели инструментов" + +#: ../src/toolbar.c:1028 +msgid "" +"Select items to be displayed on the toolbar. Items can be reordered by drag " +"and drop." +msgstr "" +"Выбор элементов, отображаемых на панели инструментов. Элементы можно " +"перетаскивать мышью." + +#: ../src/toolbar.c:1044 +msgid "Available Items" +msgstr "Доступные элементы" + +#: ../src/toolbar.c:1065 +msgid "Displayed Items" +msgstr "Отображаемые элементы" + +#: ../src/viklayer_defaults.c:232 +#, c-format +msgid "Could not open file: %s" +msgstr "Не удалось открыть файл: %s" + +#: ../src/viklayer_defaults.c:304 +msgid "Layer Defaults" +msgstr "Параметры слоёв по умолчанию" + +#: ../src/uibuilder.c:196 +msgid "Take care that this password will be stored clearly in a plain file." +msgstr "Обратите внимание, что пароль сохраняется в файле открытым текстом." + +#: ../src/uibuilder.c:628 ../src/viktrwlayer_export.c:188 +#: ../src/viktrwlayer_export.c:304 ../src/vikwindow.c:3666 +#: ../src/vikwindow.c:4408 +#, c-format +msgid "The file \"%s\" exists, do you wish to overwrite it?" +msgstr "Файл \"%s\", хотите перезаписать?" + +#: ../src/vikaggregatelayer.c:41 +msgid "Aggregate" +msgstr "Соединить" + +#: ../src/vikaggregatelayer.c:528 ../src/viktrwlayer.c:11700 +#, c-format +msgid "%s: Waypoint List" +msgstr "%s: Список путевых точек" + +#: ../src/vikaggregatelayer.c:570 +msgid "Search by Date" +msgstr "Искать по дате" + +#: ../src/vikaggregatelayer.c:576 +msgid "No items found with the requested date." +msgstr "Не найдено элементов с указанной датой" + +#: ../src/vikaggregatelayer.c:615 ../src/viktrwlayer.c:11691 +#, c-format +msgid "%s: Track and Route List" +msgstr "%s: Список треков и маршрутов" + +#: ../src/vikaggregatelayer.c:681 ../src/viktrwlayer.c:8346 +#: ../src/viktrwlayer.c:8417 ../src/viktrwlayer.c:8494 +msgid "_Visibility" +msgstr "_Видимость" + +#: ../src/vikaggregatelayer.c:686 +msgid "_Show All" +msgstr "_Показать все" + +#: ../src/vikaggregatelayer.c:692 +msgid "_Hide All" +msgstr "С_крыть все" + +#: ../src/vikaggregatelayer.c:698 ../src/viktrwlayer.c:8363 +#: ../src/viktrwlayer.c:8434 ../src/viktrwlayer.c:8511 +msgid "_Toggle" +msgstr "П_ереключить" + +#: ../src/vikaggregatelayer.c:705 ../src/viktrwlayer.c:8532 +msgid "_Sort" +msgstr "С_ортировка" + +#: ../src/vikaggregatelayer.c:711 ../src/viktrwlayer.c:8538 +msgid "Name _Ascending" +msgstr "По имени (по _возрастанию)" + +#: ../src/vikaggregatelayer.c:717 ../src/viktrwlayer.c:8544 +msgid "Name _Descending" +msgstr "По имени (по _убыванию)" + +#: ../src/vikaggregatelayer.c:723 ../src/viktrwlayer.c:575 +#: ../src/viktrwlayer.c:8550 +msgid "Date Ascending" +msgstr "По дате (по возрастанию)" + +#: ../src/vikaggregatelayer.c:729 ../src/viktrwlayer.c:576 +#: ../src/viktrwlayer.c:8556 +msgid "Date Descending" +msgstr "По дате (по убыванию)" + +#: ../src/vikaggregatelayer.c:735 ../src/viktrwlayer.c:8445 +#: ../src/viktrwlayer.c:8523 ../src/viktrwlayer.c:8595 +#: ../src/viktrwlayer_tracklist.c:296 +msgid "_Statistics" +msgstr "_Статистика" + +#: ../src/vikaggregatelayer.c:740 ../src/viktrwlayer.c:4533 +msgid "Track _List..." +msgstr "С_писок треков..." + +#: ../src/vikaggregatelayer.c:746 ../src/viktrwlayer.c:4540 +msgid "_Waypoint List..." +msgstr "_Список путевых точек..." + +#: ../src/vikaggregatelayer.c:753 +msgid "Searc_h" +msgstr "Иска_ть" + +#: ../src/vikaggregatelayer.c:759 +msgid "By _Date..." +msgstr "По _Дате..." + +#: ../src/vikaggregatelayer.c:762 +msgid "Find the first item with a specified date" +msgstr "Найти первый элемент с указанной датой" + +#: ../src/vikaggregatelayer.c:765 +msgid "Load E_xternal Layers" +msgstr "" + +#. Could have a more complicated tooltip that numbers each type of layers, +#. but for now a simple overall count +#: ../src/vikaggregatelayer.c:1011 +#, c-format +msgid "One layer" +msgid_plural "%d layers" +msgstr[0] "Один слой" +msgstr[1] "%d слоя" +msgstr[2] "%d слоёв" + +#: ../src/vikaggregatelayer.c:1014 +#, fuzzy, c-format +msgid "Empty" +msgstr "Очистить все" + +#: ../src/vikdemlayer.c:86 +msgid "SRTM Global 90m (3 arcsec)" +msgstr "" + +#: ../src/vikdemlayer.c:94 +msgid "Absolute height" +msgstr "Абсолютная высота" + +#: ../src/vikdemlayer.c:95 +msgid "Height gradient" +msgstr "Градиент высоты" + +#: ../src/vikdemlayer.c:120 +msgid "DEM Files:" +msgstr "DEM Файлы:" + +#: ../src/vikdemlayer.c:121 +msgid "Download Source:" +msgstr "Источник загрузки:" + +#: ../src/vikdemlayer.c:122 +msgid "Min Elev Color:" +msgstr "Цвет мин. высоты:" + +#: ../src/vikdemlayer.c:123 ../src/viktrwlayer_wpwin.c:207 +msgid "Type:" +msgstr "Тип:" + +#: ../src/vikdemlayer.c:124 +msgid "Min Elev:" +msgstr "Мин. высота:" + +#: ../src/vikdemlayer.c:125 +msgid "Max Elev:" +msgstr "Макс. высота:" + +#: ../src/vikdemlayer.c:137 +msgid "_DEM Download" +msgstr "Загрузить _DEM" + +#: ../src/vikdemlayer.c:137 +msgid "DEM Download" +msgstr "Загрузить DEM" + +#: ../src/vikdemlayer.c:192 +msgid "DEM" +msgstr "DEM" + +#: ../src/vikdemlayer.c:304 +#, c-format +msgid "Number of files: %d" +msgstr "Количество файлов: %d" + +#: ../src/vikdemlayer.c:446 +msgid "DEM Loading" +msgstr "Загрузка DEM" + +#: ../src/vikdemlayer.c:927 +#, c-format +msgid "No SRTM data available for %f, %f" +msgstr "Нет данных SRTM для %f, %f" + +#: ../src/vikdemlayer.c:948 +#, c-format +msgid "DEM download failure for %f, %f" +msgstr "Невозможно загрузить DEM для %f, %f" + +#: ../src/vikdemlayer.c:954 +#, c-format +msgid "DEM write failure for %s" +msgstr "Невозможно записать DEM для %s" + +#. Probably not over any land... +#: ../src/vikdemlayer.c:1201 +msgid "No DEM File Available" +msgstr "Нет доступного файла DEM" + +#: ../src/vikdemlayer.c:1220 +#, c-format +msgid "" +"\n" +"Source: %s\n" +"\n" +"DEM File: %s\n" +"DEM File Timestamp: %s" +msgstr "" +"\n" +"Источник: %s\n" +"\n" +"Файл DEM: %s\n" +"Метка времени файла: %s" + +#: ../src/vikdemlayer.c:1224 +#, c-format +msgid "" +"Source: %s\n" +"\n" +"No DEM File!" +msgstr "" +"Источник: %s\n" +"\n" +"Нет файла DEM!" + +#: ../src/vikdemlayer.c:1264 +#, c-format +msgid "Downloading DEM %s" +msgstr "Скачивание DEM %s" + +#: ../src/vikdemlayer.c:1289 +msgid "_Show DEM File Information" +msgstr "_Показать сведения о DEM-файле" + +#: ../src/vikfileentry.c:72 +msgid "Browse..." +msgstr "Обзор..." + +#: ../src/vikfileentry.c:103 +msgid "Choose file" +msgstr "Выберите файл" + +#: ../src/vikfileentry.c:120 ../src/vikwindow.c:4372 +msgid "PNG" +msgstr "PNG" + +#: ../src/vikfileentry.c:125 +msgid "TIFF" +msgstr "TIFF" + +#: ../src/vikfileentry.c:133 +msgid "MBTiles" +msgstr "MBTiles" + +#: ../src/vikfileentry.c:142 +msgid "XML" +msgstr "XML" + +#: ../src/vikfileentry.c:149 +msgid "MML" +msgstr "MML" + +#: ../src/vikfileentry.c:154 +msgid "MSS" +msgstr "MSS" + +#: ../src/vikfilelist.c:49 +msgid "Choose file(s)" +msgstr "Выберите файл(ы)" + +#: ../src/vikfilelist.c:182 +msgid "Add..." +msgstr "Добавить..." + +#: ../src/vikfilelist.c:183 +msgid "Delete" +msgstr "Удалить" + +#: ../src/vikgeoreflayer.c:97 +msgid "_Georef Move Map" +msgstr "" + +#: ../src/vikgeoreflayer.c:97 +msgid "Georef Move Map" +msgstr "" + +#: ../src/vikgeoreflayer.c:106 +msgid "Georef Z_oom Tool" +msgstr "" + +#: ../src/vikgeoreflayer.c:106 +msgid "Georef Zoom Tool" +msgstr "" + +#: ../src/vikgeoreflayer.c:117 +msgid "GeoRef Map" +msgstr "" + +#: ../src/vikgeoreflayer.c:214 +msgid "Auto Read World Files:" +msgstr "" + +#: ../src/vikgeoreflayer.c:215 +msgid "" +"Automatically attempt to read associated world file of a new image for a " +"GeoRef layer" +msgstr "" + +#: ../src/vikgeoreflayer.c:511 ../src/vikgeoreflayer.c:797 +#: ../src/vikmapslayer.c:1174 +#, c-format +msgid "Couldn't open image file: %s" +msgstr "Не удалось открыть графический файл: %s" + +#: ../src/vikgeoreflayer.c:607 ../src/vikgeoreflayer.c:633 +msgid "Choose World file" +msgstr "Выберите файл привязки" + +#: ../src/vikgeoreflayer.c:619 +msgid "The World file you requested could not be opened for reading." +msgstr "Не удалось открыть для чтения выбранный файл привязки." + +#: ../src/vikgeoreflayer.c:621 +msgid "Unexpected end of file reading World file." +msgstr "Неожиданный конец во время чтения файла привязки." + +#: ../src/vikgeoreflayer.c:646 +msgid "The file you requested could not be opened for writing." +msgstr "Выбранный вами файл невозможно открыть для записи." + +#: ../src/vikgeoreflayer.c:782 +msgid "Lower right corner values may not be consistent with upper right values" +msgstr "" +"Значения нижнего правого угла могут не совпадать со значениями верхнего " +"правого" + +#: ../src/vikgeoreflayer.c:806 +#, c-format +msgid "Invalid image size: %s" +msgstr "Неправильный размер изображения: %s" + +#: ../src/vikgeoreflayer.c:831 ../src/viklayer.c:561 ../src/vikwindow.c:4891 +msgid "Layer Properties" +msgstr "Свойства слоя" + +#: ../src/vikgeoreflayer.c:852 +msgid "World File Parameters:" +msgstr "Параметры файла привязки:" + +#: ../src/vikgeoreflayer.c:853 +msgid "Load From File..." +msgstr "Загрузить из файла..." + +#: ../src/vikgeoreflayer.c:858 +msgid "Corner pixel easting:" +msgstr "Вост. откл. углового пиксела:" + +#: ../src/vikgeoreflayer.c:860 +msgid "the UTM \"easting\" value of the upper-left corner pixel of the map" +msgstr "Восточное отклонение верхнего левого пиксела карты в системе UTM" + +#: ../src/vikgeoreflayer.c:862 +msgid "Corner pixel northing:" +msgstr "Сев. откл. углового пиксела:" + +#: ../src/vikgeoreflayer.c:864 +msgid "the UTM \"northing\" value of the upper-left corner pixel of the map" +msgstr "Северное отклонение верхнего левого пиксела карты в системе UTM" + +#: ../src/vikgeoreflayer.c:866 +msgid "X (easting) scale (mpp): " +msgstr "масштаб по X (восточное отклонение) в метрах/пиксел: " + +#: ../src/vikgeoreflayer.c:867 +msgid "Y (northing) scale (mpp): " +msgstr "масштаб по Y (северное отклонение) в метрах/пиксел: " + +#: ../src/vikgeoreflayer.c:870 +msgid "the scale of the map in the X direction (meters per pixel)" +msgstr "масштаб карты по оси X (метров на пиксел)" + +#: ../src/vikgeoreflayer.c:872 +msgid "the scale of the map in the Y direction (meters per pixel)" +msgstr "масштаб карты по оси Y (метров на пиксел)" + +#: ../src/vikgeoreflayer.c:874 +msgid "Map Image:" +msgstr "Графический файл карты:" + +#: ../src/vikgeoreflayer.c:919 +msgid "Upper left latitude:" +msgstr "верхняя левая широта" + +#: ../src/vikgeoreflayer.c:921 +msgid "Upper left longitude:" +msgstr "верхняя левая долгота" + +#: ../src/vikgeoreflayer.c:923 +msgid "Lower right latitude:" +msgstr "нижняя правая широта" + +#: ../src/vikgeoreflayer.c:925 +msgid "Lower right longitude:" +msgstr "нижняя правая долгота" + +#: ../src/vikgeoreflayer.c:937 +msgid "Calculate MPP values from coordinates" +msgstr "Рассчитать значения MPP из координат" + +#: ../src/vikgeoreflayer.c:938 +msgid "" +"Enter all corner coordinates before calculating the MPP values from the " +"image size" +msgstr "" +"Введите координаты всех углов для рассчёта MPP значений из размера " +"изображения" + +#: ../src/vikgeoreflayer.c:948 +msgid "UTM" +msgstr "UTM" + +#: ../src/vikgeoreflayer.c:949 +msgid "Latitude/Longitude" +msgstr "Широта/Долгота" + +#: ../src/vikgeoreflayer.c:957 ../src/vikmapniklayer.c:82 +#: ../src/vikmapslayer.c:158 +msgid "Alpha:" +msgstr "Прозрачность:" + +#. Now with icons +#: ../src/vikgeoreflayer.c:1062 +msgid "_Zoom to Fit Map" +msgstr "_Масштабировать к размеру карты" + +#: ../src/vikgeoreflayer.c:1068 +msgid "_Goto Map Center" +msgstr "Перейти к _центру карты" + +#: ../src/vikgeoreflayer.c:1074 +msgid "_Export to World File" +msgstr "_Экспортировать в файл привязки" + +#: ../src/vikgoto.c:98 +msgid "No goto tool available." +msgstr "Нет инструмента поиска." + +#: ../src/vikgoto.c:295 +msgid "goto" +msgstr "перейти" + +#: ../src/vikgoto.c:297 +msgid "goto provider:" +msgstr "поставщик поиска:" + +#: ../src/vikgoto.c:312 +msgid "Enter address or place name:" +msgstr "Введите адрес или название места:" + +#: ../src/vikgoto.c:487 +msgid "Locality" +msgstr "Местоположение" + +#: ../src/vikgpslayer.c:137 +msgid "Data Mode" +msgstr "Режим данных" + +#: ../src/vikgpslayer.c:139 +msgid "Realtime Tracking Mode" +msgstr "Режим отслеживания в реальном времени" + +#: ../src/vikgpslayer.c:176 +msgid "Keep vehicle at center" +msgstr "Удерживать транспортное средство в центре" + +#: ../src/vikgpslayer.c:177 +msgid "Keep vehicle on screen" +msgstr "Удерживать транспортное средство на экране" + +#: ../src/vikgpslayer.c:178 +msgid "Disable" +msgstr "Отключить" + +#: ../src/vikgpslayer.c:218 +msgid "Download Tracks:" +msgstr "Скачать треки:" + +#: ../src/vikgpslayer.c:219 +msgid "Upload Tracks:" +msgstr "Загрузить треки:" + +#: ../src/vikgpslayer.c:220 +msgid "Download Routes:" +msgstr "Скачать маршруты:" + +#: ../src/vikgpslayer.c:221 +msgid "Upload Routes:" +msgstr "Загрузить маршруты:" + +#: ../src/vikgpslayer.c:222 +msgid "Download Waypoints:" +msgstr "Скачать путевые точки:" + +#: ../src/vikgpslayer.c:223 +msgid "Upload Waypoints:" +msgstr "Загрузить путевые точки:" + +#: ../src/vikgpslayer.c:225 +msgid "Recording tracks" +msgstr "Запись треков" + +#: ../src/vikgpslayer.c:226 +msgid "Jump to current position on start" +msgstr "Перемещаться в текущее расположение при старте" + +#: ../src/vikgpslayer.c:227 +msgid "Moving Map Method:" +msgstr "Метод перемещения карты:" + +#: ../src/vikgpslayer.c:228 +msgid "Update Statusbar:" +msgstr "Обновлять строку состояния:" + +#: ../src/vikgpslayer.c:228 +msgid "Display information in the statusbar on GPS updates" +msgstr "Отображать информацию в строке состояния при обновлениях GPS" + +#: ../src/vikgpslayer.c:229 +#, fuzzy +msgid "Auto Connect" +msgstr "Автоматическое местоположение" + +#: ../src/vikgpslayer.c:229 +msgid "Automatically connect to GPSD" +msgstr "" + +#: ../src/vikgpslayer.c:230 +msgid "Gpsd Host:" +msgstr "Узел gpsd:" + +#: ../src/vikgpslayer.c:231 +msgid "Gpsd Port:" +msgstr "Порт gpsd:" + +#: ../src/vikgpslayer.c:232 +msgid "Gpsd Retry Interval (seconds):" +msgstr "Интервал повтора Gpsd (секунды):" + +#: ../src/vikgpslayer.c:254 +msgid "GPS" +msgstr "GPS" + +#: ../src/vikgpslayer.c:320 ../src/vikgpslayer.c:1504 +msgid "GPS Download" +msgstr "" + +#: ../src/vikgpslayer.c:320 ../src/vikgpslayer.c:1504 ../src/viktrwlayer.c:3993 +msgid "GPS Upload" +msgstr "" + +#: ../src/vikgpslayer.c:322 +msgid "GPS Realtime Tracking" +msgstr "" + +#: ../src/vikgpslayer.c:458 +msgid "Connected" +msgstr "" + +#: ../src/vikgpslayer.c:460 +msgid "Disconnected" +msgstr "" + +#: ../src/vikgpslayer.c:554 +msgid "Unknown GPS Protocol" +msgstr "Неизвестный протокол GPS" + +#: ../src/vikgpslayer.c:572 +msgid "Unknown serial port device" +msgstr "Неизвестное устройство COM" + +#: ../src/vikgpslayer.c:691 +#, c-format +msgid "%s: unknown parameter" +msgstr "%s: неизвестный параметр" + +#. Now with icons +#: ../src/vikgpslayer.c:794 +msgid "_Upload to GPS" +msgstr "Загрузить в GPS" + +#: ../src/vikgpslayer.c:800 +msgid "Download from _GPS" +msgstr "Выгрузить из _GPS" + +#: ../src/vikgpslayer.c:821 +msgid "Empty _Realtime" +msgstr "" + +#: ../src/vikgpslayer.c:828 +msgid "E_mpty Upload" +msgstr "" + +#: ../src/vikgpslayer.c:834 +msgid "_Empty Download" +msgstr "" + +#: ../src/vikgpslayer.c:840 +msgid "Empty _All" +msgstr "Очистить все" + +#: ../src/vikgpslayer.c:852 +#, c-format +msgid "Unexpected number of disconnected handlers: %d" +msgstr "Неожиданное количество разорванных обработчиков: %d" + +#: ../src/vikgpslayer.c:995 +#, c-format +msgid "Uploading %d waypoint..." +msgid_plural "Uploading %d waypoints..." +msgstr[0] "Загружается %d путевая точка..." +msgstr[1] "Загружается %d путевых точки..." +msgstr[2] "Загружается %d путевых точек..." + +#: ../src/vikgpslayer.c:1000 +#, c-format +msgid "Uploading %d trackpoint..." +msgid_plural "Uploading %d trackpoints..." +msgstr[0] "Загружается %d узел трека..." +msgstr[1] "Загружается %d узла трека..." +msgstr[2] "Загружается %d узлов трека..." + +#: ../src/vikgpslayer.c:1005 +#, c-format +msgid "Uploading %d routepoint..." +msgid_plural "Uploading %d routepoints..." +msgstr[0] "Загружается %d маршрутная точка..." +msgstr[1] "Загружается %d маршрутных точки..." +msgstr[2] "Загружается %d маршрутных точек..." + +#: ../src/vikgpslayer.c:1034 +#, c-format +msgid "Downloaded %d out of %d waypoint..." +msgid_plural "Downloaded %d out of %d waypoints..." +msgstr[0] "Скачано %d из %d путевых точек..." +msgstr[1] "Скачано %d из %d путевых точек..." +msgstr[2] "Скачано %d из %d путевых точек..." + +#: ../src/vikgpslayer.c:1040 +#, c-format +msgid "Downloaded %d out of %d trackpoint..." +msgid_plural "Downloaded %d out of %d trackpoints..." +msgstr[0] "Скачано %d из %d узла..." +msgstr[1] "Скачано %d из %d узлов..." +msgstr[2] "Скачано %d из %d узлов..." + +#: ../src/vikgpslayer.c:1046 +#, c-format +msgid "Downloaded %d out of %d routepoint..." +msgid_plural "Downloaded %d out of %d routepoints..." +msgstr[0] "Скачано %d из %d маршрутной точки..." +msgstr[1] "Скачано %d из %d маршрутных точек..." +msgstr[2] "Скачано %d из %d маршрутных точек..." + +#: ../src/vikgpslayer.c:1056 +#, c-format +msgid "Uploaded %d out of %d waypoint..." +msgid_plural "Uploaded %d out of %d waypoints..." +msgstr[0] "Загружено %d из %d путевых точек..." +msgstr[1] "Загружено %d из %d путевых точек..." +msgstr[2] "Загружено %d из %d путевых точек..." + +#: ../src/vikgpslayer.c:1062 +#, c-format +msgid "Uploaded %d out of %d trackpoint..." +msgid_plural "Uploaded %d out of %d trackpoints..." +msgstr[0] "Загружено %d из %d узла..." +msgstr[1] "Загружено %d из %d узлов..." +msgstr[2] "Загружено %d из %d узлов..." + +#: ../src/vikgpslayer.c:1068 +#, c-format +msgid "Uploaded %d out of %d routepoint..." +msgid_plural "Uploaded %d out of %d routepoints..." +msgstr[0] "Загружена %d из %d маршрутной точки..." +msgstr[1] "Загружено %d из %d маршрутных точек..." +msgstr[2] "Загружено %d из %d маршрутных точек..." + +#: ../src/vikgpslayer.c:1079 +#, c-format +msgid "Downloaded %d waypoint" +msgid_plural "Downloaded %d waypoints" +msgstr[0] "Скачана %d путевая точка" +msgstr[1] "Скачано %d путевых точки" +msgstr[2] "Скачано %d путевых точек" + +#: ../src/vikgpslayer.c:1085 +#, c-format +msgid "Downloaded %d trackpoint" +msgid_plural "Downloaded %d trackpoints" +msgstr[0] "Скачан %d узел трека" +msgstr[1] "Скачано %d узла трека" +msgstr[2] "Скачано %d узлов трека" + +#: ../src/vikgpslayer.c:1091 +#, c-format +msgid "Downloaded %d routepoint" +msgid_plural "Downloaded %d routepoints" +msgstr[0] "Скачана %d маршрутная точка" +msgstr[1] "Скачаны %d маршрутных точки" +msgstr[2] "Скачано %d маршрутных точек" + +#: ../src/vikgpslayer.c:1101 +#, c-format +msgid "Uploaded %d waypoint" +msgid_plural "Uploaded %d waypoints" +msgstr[0] "Загружен %d узел трека" +msgstr[1] "Загружено %d узла трека" +msgstr[2] "Загружено %d узлов трека" + +#: ../src/vikgpslayer.c:1107 +#, c-format +msgid "Uploaded %d trackpoint" +msgid_plural "Uploaded %d trackpoints" +msgstr[0] "Загружена %d путевая точка" +msgstr[1] "Загружено %d путевых точки" +msgstr[2] "Загружено %d путевых точек" + +#: ../src/vikgpslayer.c:1113 +#, c-format +msgid "Uploaded %d routepoint" +msgid_plural "Uploaded %d routepoints" +msgstr[0] "Загружена %d маршрутная точка" +msgstr[1] "Загружено %d маршрутных точки" +msgstr[2] "Загружено %d маршрутных точек" + +#: ../src/vikgpslayer.c:1363 +msgid "Error: No result." +msgstr "" + +#: ../src/vikgpslayer.c:1471 +msgid "Warning - GPS Upload items may overwrite each other" +msgstr "" + +#: ../src/vikgpslayer.c:1506 +msgid "Status: detecting gpsbabel" +msgstr "Статус: поиск gpsbabel" + +#: ../src/vikgpslayer.c:1533 +msgid "No GPS items selected for transfer." +msgstr "Нет выбранных объектов GPS для передачи." + +#: ../src/vikgpslayer.c:1546 +msgid "Could not turn off device." +msgstr "Не удалось отключить устройство." + +#: ../src/vikgpslayer.c:1589 +msgid "Are you sure you want to delete GPS Upload data?" +msgstr "" + +#: ../src/vikgpslayer.c:1602 +msgid "Are you sure you want to delete GPS Download data?" +msgstr "" + +#: ../src/vikgpslayer.c:1616 +msgid "Are you sure you want to delete GPS Realtime data?" +msgstr "" + +#: ../src/vikgpslayer.c:1630 +msgid "Are you sure you want to delete All GPS data?" +msgstr "Действительно удалить все данные GPS?" + +#: ../src/vikgpslayer.c:2004 +#, c-format +msgid "" +"Failed to connect to gpsd at %s (port %s)\n" +"Should Viking keep trying (every %d seconds)?" +msgstr "" + +#: ../src/viklayerspanel.c:73 +msgid "C_ut" +msgstr "Вы_резать" + +#: ../src/viklayerspanel.c:74 ../src/vikwindow.c:4882 +msgid "_Copy" +msgstr "_Копировать" + +#: ../src/viklayerspanel.c:75 ../src/vikwindow.c:4883 +msgid "_Paste" +msgstr "_Вставить" + +#: ../src/viklayerspanel.c:76 ../src/vikwindow.c:4884 +msgid "_Delete" +msgstr "_Удалить" + +#: ../src/viklayerspanel.c:154 +msgid "New Layer" +msgstr "Новый слой" + +#: ../src/viklayerspanel.c:347 +msgid "Top Layer" +msgstr "Верхний слой" + +#: ../src/viklayerspanel.c:363 +msgid "Add new layer" +msgstr "Добавить слой" + +#: ../src/viklayerspanel.c:370 ../src/vikwindow.c:4884 +msgid "Remove selected layer" +msgstr "Удалить выбранный слой" + +#: ../src/viklayerspanel.c:377 +msgid "Move selected layer up" +msgstr "Переместить выбранный слой вверх" + +#: ../src/viklayerspanel.c:384 +msgid "Move selected layer down" +msgstr "Переместить выбранный слой вниз" + +#: ../src/viklayerspanel.c:391 ../src/vikwindow.c:4881 +msgid "Cut selected layer" +msgstr "Вырезать выбранный слой" + +#: ../src/viklayerspanel.c:398 ../src/vikwindow.c:4882 +msgid "Copy selected layer" +msgstr "Копировать выбранный слой" + +#: ../src/viklayerspanel.c:405 ../src/vikwindow.c:4883 +msgid "" +"Paste layer into selected container layer or otherwise above selected layer" +msgstr "Вставить слой в выбранный слой-контейнер или над выбранным слоем" + +#: ../src/viklayerspanel.c:502 +msgid "New name can not be blank." +msgstr "Новое имя не может быть пустым." + +#: ../src/viklayerspanel.c:751 +msgid "Aggregate Layers have no settable properties." +msgstr "У объединяющего слоя нет изменяемых свойств." + +#: ../src/viklayerspanel.c:798 +msgid "You cannot cut the Top Layer." +msgstr "Нельзя вырезать верхний слой." + +#: ../src/viklayerspanel.c:843 +#, c-format +msgid "Are you sure you want to delete %s?" +msgstr "Вы уверены что хотите удалить %s?" + +#: ../src/viklayerspanel.c:863 +msgid "You cannot delete the Top Layer." +msgstr "Нельзя удалить верхний слой." + +#: ../src/vikmapniklayer.c:78 +msgid "CSS (MML) Config File:" +msgstr "Файл конфигурации в формате CSS (MML):" + +#: ../src/vikmapniklayer.c:79 +msgid "CartoCSS configuration file" +msgstr "Файл конфигурации в формате CartoCSS" + +#: ../src/vikmapniklayer.c:80 +msgid "XML Config File:" +msgstr "Файл конфгиурации в формате XML" + +#: ../src/vikmapniklayer.c:81 +msgid "Mapnik XML configuration file" +msgstr "Файл конфигурации в формате Mapnik XML" + +#: ../src/vikmapniklayer.c:84 +msgid "Use File Cache:" +msgstr "Использовать файловый кеш" + +#: ../src/vikmapniklayer.c:86 +msgid "File Cache Directory:" +msgstr "Каталог для файлов кеша:" + +#: ../src/vikmapniklayer.c:122 +msgid "_Mapnik Features" +msgstr "Особенности _Mapnik" + +#: ../src/vikmapniklayer.c:122 +msgid "Mapnik Features" +msgstr "Особенности Mapnik" + +#: ../src/vikmapniklayer.c:140 +msgid "Mapnik Rendering" +msgstr "Отрисовка Mapnik" + +#. Changing these values only applies before first mapnik layer is 'created' +#: ../src/vikmapniklayer.c:258 +msgid "Plugins Directory:" +msgstr "Каталог с модулями:" + +#: ../src/vikmapniklayer.c:258 ../src/vikmapniklayer.c:259 +#: ../src/vikmapniklayer.c:260 ../src/vikmapniklayer.c:261 +msgid "You need to restart Viking for a change to this value to be used" +msgstr "Вы должны перезапустить Viking для применения этого параметра" + +#: ../src/vikmapniklayer.c:259 +msgid "Fonts Directory:" +msgstr "Каталог со шрифтами:" + +#: ../src/vikmapniklayer.c:260 +msgid "Recurse Fonts Directory:" +msgstr "" + +#: ../src/vikmapniklayer.c:261 +msgid "Rerender Timeout (hours):" +msgstr "Таймаут отрисовки (в часах)" + +#. Changeable any time +#: ../src/vikmapniklayer.c:263 +msgid "CartoCSS:" +msgstr "CartoCSS:" + +#: ../src/vikmapniklayer.c:263 +msgid "The program to convert CartoCSS files into Mapnik XML" +msgstr "Программа для преобразования файлов CartoCSS в Mapnik XML" + +#: ../src/vikmapniklayer.c:506 +msgid "Running" +msgstr "Запуск" + +#: ../src/vikmapniklayer.c:525 +#, c-format +msgid "" +"Error running carto command:\n" +"%s" +msgstr "" + +#: ../src/vikmapniklayer.c:561 +msgid " completed in " +msgstr " завершено за " + +#: ../src/vikmapniklayer.c:561 +msgid "seconds" +msgstr "сек." + +#: ../src/vikmapniklayer.c:611 ../src/vikmapniklayer.c:979 +#, c-format +msgid "" +"Mapnik error loading configuration file:\n" +"%s" +msgstr "" +"Ошибка загрузки файла конфигурации Mapnik:\n" +"%s" + +#: ../src/vikmapniklayer.c:749 +#, c-format +msgid "Mapnik Render %d:%d:%d %s" +msgstr "Отрисовка Mapnik: %d:%d:%d %s" + +#: ../src/vikmapniklayer.c:840 +msgid "Mapnik Rendering must be in Mercator mode" +msgstr "" + +#: ../src/vikmapniklayer.c:997 +msgid "Mapnik Information" +msgstr "Информация Mapnik" + +#: ../src/vikmapniklayer.c:1031 +msgid "_Flush Memory Cache" +msgstr "_Очистить кэш" + +#: ../src/vikmapniklayer.c:1044 +msgid "_Run Carto Command" +msgstr "" + +#: ../src/vikmapniklayer.c:1102 ../src/vikmapslayer.c:2029 +#, c-format +msgid "Tile File Timestamp: %s" +msgstr "" + +#: ../src/vikmapniklayer.c:1105 ../src/vikmapslayer.c:2032 +msgid "Tile File Timestamp: Not Available" +msgstr "" + +#: ../src/vikmapniklayer.c:1120 +#, c-format +msgid "Rendering time %.2f seconds" +msgstr "Время отрисовки %.2f секунд" + +#: ../src/vikmapniklayer.c:1124 ../src/vikmapslayer.c:2042 +msgid "Tile Information" +msgstr "Информация о тайле" + +#: ../src/vikmapniklayer.c:1145 +msgid "_Rerender Tile" +msgstr "_Отрисовать тайл" + +#: ../src/vikmapniklayer.c:1150 +msgid "_Info" +msgstr "_Информация" + +#. ******* MAPZOOMS ******** +#: ../src/vikmapslayer.c:96 +msgid "Use Viking Zoom Level" +msgstr "Использовать масштаб Viking" + +#: ../src/vikmapslayer.c:146 +msgid "OSM" +msgstr "OSM" + +#. NB mode => id - But can't break file format just to rename something better +#: ../src/vikmapslayer.c:152 +msgid "Map Type:" +msgstr "Тип карты:" + +#: ../src/vikmapslayer.c:153 +msgid "Maps Directory:" +msgstr "Каталог карт:" + +#: ../src/vikmapslayer.c:154 +msgid "Cache Layout:" +msgstr "" + +#: ../src/vikmapslayer.c:155 +msgid "This determines the tile storage layout on disk" +msgstr "" + +#: ../src/vikmapslayer.c:156 +msgid "Map File:" +msgstr "Файл карты:" + +#: ../src/vikmapslayer.c:157 +msgid "An MBTiles file. Only applies when the map type method is 'MBTiles'" +msgstr "" + +#: ../src/vikmapslayer.c:159 +msgid "Control the Alpha value for transparency effects" +msgstr "Управление альфа-значением для эффектов прозрачности" + +#: ../src/vikmapslayer.c:160 +msgid "Autodownload maps:" +msgstr "Автоматически скачивать карты:" + +#: ../src/vikmapslayer.c:161 +msgid "Autodownload Only Gets Missing Maps:" +msgstr "Автоскачивание только отсутствующих карт:" + +#: ../src/vikmapslayer.c:162 +msgid "" +"Using this option avoids attempting to update already acquired tiles. This " +"can be useful if you want to restrict the network usage, without having to " +"resort to manual control. Only applies when 'Autodownload Maps' is on." +msgstr "" +"Эта опция поможет избежать обновления уже скачанных квадратов. Это может " +"быть полезно для уменьшения сетевого трафика без перехода в ручной режим " +"управления. Применяется только при включенной опции 'Автоматически скачивать " +"карты'." + +#: ../src/vikmapslayer.c:163 +msgid "Zoom Level:" +msgstr "Степень приближения:" + +#: ../src/vikmapslayer.c:164 +msgid "" +"Determines the method of displaying map tiles for the current zoom level. " +"'Viking Zoom Level' uses the best matching level, otherwise setting a fixed " +"value will always use map tiles of the specified value regardless of the " +"actual zoom level." +msgstr "" +"Определяет метод отображения карты для текущего масштаба. 'Масштаб Viking' " +"использует наиболее подходящий уровень, другие настройки подразумевают " +"использование тайлов заданного уровня независимо от текущего масштаба" + +#: ../src/vikmapslayer.c:197 +msgid "_Maps Download" +msgstr "С_качивание карт" + +#: ../src/vikmapslayer.c:197 +msgid "Maps Download" +msgstr "Загрузка карт" + +#: ../src/vikmapslayer.c:213 ../src/vikutils.c:895 +msgid "Map" +msgstr "Карта" + +#: ../src/vikmapslayer.c:306 +msgid "Default map layer directory:" +msgstr "Каталог карт по умолчанию для слоя:" + +#: ../src/vikmapslayer.c:306 +msgid "Choose a directory to store cached Map tiles for this layer" +msgstr "" +"Выберите каталог для хранения кэшированных квадратов карт для этого слоя" + +#: ../src/vikmapslayer.c:436 ../src/vikmapslayer.c:633 +msgid "Unknown map type" +msgstr "Неизвестный тип карты" + +#: ../src/vikmapslayer.c:664 +msgid "Unknown Map Zoom" +msgstr "Неизвестный масштаб карты" + +#: ../src/vikmapslayer.c:833 +#, c-format +msgid "Failed to open MBTiles file: %s" +msgstr "Невозможно загрузить файл MBTiles: %s" + +#: ../src/vikmapslayer.c:856 +#, c-format +msgid "" +"New map cannot be displayed in the current drawmode.\n" +"Select \"%s\" from View menu to view it." +msgstr "" +"Новая карта не может быть показана в текущем режиме отрисовки.\n" +"Выберите \"%s\" из меню Вид для ее просмотра." + +#: ../src/vikmapslayer.c:1314 +#, c-format +msgid "" +"Cowardly refusing to draw tiles or existence of tiles beyond %d zoom out " +"factor" +msgstr "" + +#. TODO: ?? count up the number of download errors somehow... +#: ../src/vikmapslayer.c:1667 +msgid "Failed to download tile" +msgstr "Невозможно загрузить тайл" + +#: ../src/vikmapslayer.c:1673 +msgid "Unable to save tile" +msgstr "Невозможно сохранить файл" + +#: ../src/vikmapslayer.c:1799 +#, c-format +msgid "Redownloading up to %d %s map..." +msgid_plural "Redownloading up to %d %s maps..." +msgstr[0] "" +msgstr[1] "" + +#: ../src/vikmapslayer.c:1801 +#, c-format +msgid "Redownloading %d %s map..." +msgid_plural "Redownloading %d %s maps..." +msgstr[0] "Повторно скачивается %d %s карта..." +msgstr[1] "Повторно скачивается %d %s карты..." +msgstr[2] "Повторно скачивается %d %s карт..." + +#: ../src/vikmapslayer.c:1805 ../src/vikmapslayer.c:1890 +#, c-format +msgid "Downloading %d %s map..." +msgid_plural "Downloading %d %s maps..." +msgstr[0] "Скачивается %d %s карта..." +msgstr[1] "Скачивается %d %s карты..." +msgstr[2] "Скачивается %d %s карт..." + +#: ../src/vikmapslayer.c:1969 +msgid "YES" +msgstr "ДА" + +#: ../src/vikmapslayer.c:1973 ../src/vikmapslayer.c:1977 +msgid "NO" +msgstr "НЕТ" + +#. NB Also handles .jpg automatically due to pixbuf_new_from () support - although just print png for now. +#: ../src/vikmapslayer.c:1980 +#, c-format +msgid "Source: %s (%d%s%d%s%d.%s %s)" +msgstr "" + +#: ../src/vikmapslayer.c:1983 +msgid "Source: Not available" +msgstr "Ресурс: Не доступно" + +#: ../src/vikmapslayer.c:2000 +#, fuzzy +msgid "Source: file://" +msgstr "Ресурс: Не доступно" + +#: ../src/vikmapslayer.c:2012 +#, c-format +msgid "Source: %s" +msgstr "" + +#: ../src/vikmapslayer.c:2038 +#, fuzzy, c-format +msgid "Tile File: %s [Not Available]" +msgstr "Справочная система недоступна." + +#: ../src/vikmapslayer.c:2086 +msgid "Redownload _Bad Map(s)" +msgstr "Заново скачать испорченные карты" + +#: ../src/vikmapslayer.c:2090 +msgid "Redownload _New Map(s)" +msgstr "Заново скачать новые карты" + +#: ../src/vikmapslayer.c:2094 +msgid "Redownload _All Map(s)" +msgstr "Заново скачать все карты" + +#: ../src/vikmapslayer.c:2099 +msgid "_Show Tile Information" +msgstr "" + +#: ../src/vikmapslayer.c:2166 +#, c-format +msgid "" +"Wrong drawmode for this map.\n" +"Select \"%s\" from View menu and try again." +msgstr "" +"Неподходящий режим отрисовки для этой карты.\n" +"Выберите \"%s\" из меню вид и попробуйте снова." + +#: ../src/vikmapslayer.c:2171 +msgid "Wrong zoom level for this map." +msgstr "Неверный масштаб для этой карты." + +#: ../src/vikmapslayer.c:2334 +msgid "Zoom Start:" +msgstr "" + +#: ../src/vikmapslayer.c:2341 +msgid "Zoom End:" +msgstr "" + +#: ../src/vikmapslayer.c:2347 +msgid "Download Maps Method:" +msgstr "Метод скачивания карт:" + +#. redownload method - needs to align with REDOWNLOAD* macro values +#: ../src/vikmapslayer.c:2419 +msgid "Missing" +msgstr "Отсутствующие" + +#: ../src/vikmapslayer.c:2419 +msgid "Bad" +msgstr "Ошибочные" + +#: ../src/vikmapslayer.c:2419 +msgid "New" +msgstr "Новые" + +#: ../src/vikmapslayer.c:2419 +msgid "Reload All" +msgstr "Скачать повторно все" + +#: ../src/vikmapslayer.c:2421 +msgid "Download for Zoom Levels" +msgstr "Скачать для уровней масштаба" + +#: ../src/vikmapslayer.c:2461 +#, c-format +msgid "" +"You are not allowed to download more than %d tiles in one go (requested %d)" +msgstr "Нельзя скачать более %d квадратов за один раз (запрошено %d)" + +#: ../src/vikmapslayer.c:2469 +#, c-format +msgid "Do you really want to download %d tiles?" +msgstr "Вы действительно хотите скачать %d квадратов?" + +#. Now with icons +#: ../src/vikmapslayer.c:2509 +msgid "Download _Missing Onscreen Maps" +msgstr "Скачать _отсутствующие экранные карты" + +#: ../src/vikmapslayer.c:2516 +msgid "Download _New Onscreen Maps" +msgstr "Скачать _новые экранные карты" + +#: ../src/vikmapslayer.c:2523 +msgid "Reload _All Onscreen Maps" +msgstr "Скачать _все экранные карты" + +#: ../src/vikmapslayer.c:2529 +msgid "Download Maps in _Zoom Levels..." +msgstr "" + +#: ../src/vikmapslayer.c:2539 +#, fuzzy +msgid "_Open MBTiles Files" +msgstr "Файл MBTiles" + +#: ../src/vikmapslayer.c:2554 +msgid "Flush Map Cache" +msgstr "Очистить кэш карты" + +#: ../src/vikrouting.c:54 +msgid "Default engine:" +msgstr "Движок по умолчанию:" + +#: ../src/vikrouting.c:68 +msgid "Routing" +msgstr "Маршрутизация" + +#: ../src/viktreeview.c:347 +msgid "Layer Name" +msgstr "Имя слоя" + +#: ../src/viktreeview.c:924 +#, c-format +msgid "delete data from %s\n" +msgstr "удалить данные %s\n" + +#: ../src/viktrwlayer.c:427 +msgid "Create _Waypoint" +msgstr "Создать _путевую точку" + +#: ../src/viktrwlayer.c:427 +msgid "Create Waypoint" +msgstr "Создать путевую точку" + +#: ../src/viktrwlayer.c:437 +#, fuzzy +msgid "Edit _Track" +msgstr "Редактировать узел трека" + +#: ../src/viktrwlayer.c:437 +#, fuzzy +msgid "Edit Track" +msgstr "Редактировать узел трека" + +#: ../src/viktrwlayer.c:449 +#, fuzzy +msgid "Edit _Route" +msgstr "Добавить маршрут" + +#: ../src/viktrwlayer.c:449 +#, fuzzy +msgid "Edit Route" +msgstr "Добавить маршрут" + +#: ../src/viktrwlayer.c:460 +msgid "Route _Finder" +msgstr "По_иск маршрута" + +#: ../src/viktrwlayer.c:460 +msgid "Route Finder" +msgstr "Поиск маршрута" + +#: ../src/viktrwlayer.c:471 +#, fuzzy +msgid "Splitter" +msgstr "Разделить здесь" + +#: ../src/viktrwlayer.c:482 +msgid "_Edit Waypoint" +msgstr "_Редактировать путевую точку" + +#: ../src/viktrwlayer.c:482 +msgid "Edit Waypoint" +msgstr "Редактировать путевую точку" + +#: ../src/viktrwlayer.c:495 +msgid "Edit Trac_kpoint" +msgstr "Р_едактировать узел трека" + +#: ../src/viktrwlayer.c:495 +msgid "Edit Trackpoint" +msgstr "Редактировать узел трека" + +#. a pixbuf for this one is already made globally available +#: ../src/viktrwlayer.c:508 +msgid "Show P_icture" +msgstr "Показать и_зображение" + +#: ../src/viktrwlayer.c:508 +msgid "Show Picture" +msgstr "Показать картинку" + +#: ../src/viktrwlayer.c:531 +msgid "Waypoint Images" +msgstr "Картинки путевых точек" + +#: ../src/viktrwlayer.c:531 +msgid "Tracks Advanced" +msgstr "" + +#: ../src/viktrwlayer.c:531 +msgid "Metadata" +msgstr "Метаданные" + +#: ../src/viktrwlayer.c:531 +#, fuzzy +msgid "Filesystem" +msgstr "Тип файла:" + +#: ../src/viktrwlayer.c:534 +msgid "Draw by Track" +msgstr "Отрисавывать по треку" + +#: ../src/viktrwlayer.c:534 +msgid "Draw by Speed" +msgstr "Отрисовывать по скорости" + +#: ../src/viktrwlayer.c:534 +msgid "All Tracks Same Color" +msgstr "Все треки одного цвета" + +#: ../src/viktrwlayer.c:535 +msgid "Filled Square" +msgstr "Закрашенный квадрат" + +#: ../src/viktrwlayer.c:535 +msgid "Square" +msgstr "Квадрат" + +#: ../src/viktrwlayer.c:535 +msgid "Circle" +msgstr "Окружность" + +#: ../src/viktrwlayer.c:535 +msgid "X" +msgstr "X" + +#: ../src/viktrwlayer.c:561 +msgid "Extra Extra Small" +msgstr "Супермелкий" + +#: ../src/viktrwlayer.c:562 +msgid "Extra Small" +msgstr "Очень мелкий" + +#: ../src/viktrwlayer.c:566 +msgid "Extra Large" +msgstr "Очень крупный" + +#: ../src/viktrwlayer.c:567 +msgid "Extra Extra Large" +msgstr "Суперкрупный" + +#: ../src/viktrwlayer.c:573 +msgid "Name Ascending" +msgstr "По имени (по возрастанию)" + +#: ../src/viktrwlayer.c:574 +msgid "Name Descending" +msgstr "По имени (по убыванию)" + +#: ../src/viktrwlayer.c:582 ../src/viktrwlayer_propwin.c:3319 +msgid "No" +msgstr "Нет" + +#: ../src/viktrwlayer.c:583 +msgid "Yes" +msgstr "" + +#: ../src/viktrwlayer.c:584 +msgid "No write" +msgstr "" + +#: ../src/viktrwlayer.c:649 ../src/viktrwlayer.c:673 +msgid "Draw Labels" +msgstr "Нарисовать названия" + +#: ../src/viktrwlayer.c:650 +msgid "Note: the individual track controls what labels may be displayed" +msgstr "" +"Примечание: на отображение названий могут влиять настройки отдельного трека" + +#: ../src/viktrwlayer.c:651 +msgid "Track Labels Font Size:" +msgstr "Резмер шрифта надписей:" + +#: ../src/viktrwlayer.c:652 +msgid "Track Drawing Mode:" +msgstr "Режим рисования треков:" + +#: ../src/viktrwlayer.c:653 +msgid "All Tracks Color:" +msgstr "Цвет всех треков:" + +#: ../src/viktrwlayer.c:654 +msgid "The color used when 'All Tracks Same Color' drawing mode is selected" +msgstr "Цвет, используемый при включенной опции 'Все треки одного цвета'" + +#: ../src/viktrwlayer.c:655 +msgid "Draw Track Lines" +msgstr "Нарисовать линии треков" + +#: ../src/viktrwlayer.c:656 +msgid "Track Thickness:" +msgstr "Толщина трека:" + +#: ../src/viktrwlayer.c:657 +msgid "Draw Track Direction" +msgstr "Рисовать направление трека" + +#: ../src/viktrwlayer.c:658 +msgid "Direction Size:" +msgstr "Размер указателя направления:" + +#: ../src/viktrwlayer.c:659 +msgid "Draw Trackpoints" +msgstr "Рисовать узлы трека" + +#: ../src/viktrwlayer.c:660 +msgid "Trackpoint Size:" +msgstr "Размер узлов трека:" + +#: ../src/viktrwlayer.c:661 +msgid "Draw Elevation" +msgstr "Нарисовать высоту" + +#: ../src/viktrwlayer.c:662 +msgid "Draw Elevation Height %:" +msgstr "Нарисовать % высоты:" + +#: ../src/viktrwlayer.c:663 +msgid "Draw Stops" +msgstr "Нарисовать остановки" + +#: ../src/viktrwlayer.c:664 +msgid "" +"Whether to draw a marker when trackpoints are at the same position but over " +"the minimum stop length apart in time" +msgstr "" + +#: ../src/viktrwlayer.c:665 +msgid "Min Stop Length (seconds):" +msgstr "Минимальная длина остановки (в секундах)" + +#: ../src/viktrwlayer.c:667 +msgid "Track BG Thickness:" +msgstr "Толщина фона маршрута:" + +#: ../src/viktrwlayer.c:668 +msgid "Track Background Color" +msgstr "Цвет фона маршрута" + +#: ../src/viktrwlayer.c:669 +msgid "Draw by Speed Factor (%):" +msgstr "Отрисовывать по коэффициенту скорости (%)" + +#: ../src/viktrwlayer.c:670 +msgid "" +"The percentage factor away from the average speed determining the color used" +msgstr "" + +#: ../src/viktrwlayer.c:671 +msgid "Track Sort Order:" +msgstr "Порядок сортировки треков:" + +#: ../src/viktrwlayer.c:674 +msgid "Waypoint Font Size:" +msgstr "Размер шрифта" + +#: ../src/viktrwlayer.c:675 +msgid "Waypoint Color:" +msgstr "Цвет путевых точек:" + +#: ../src/viktrwlayer.c:676 +msgid "Waypoint Text:" +msgstr "Текст путевых точек:" + +#: ../src/viktrwlayer.c:677 +msgid "Background:" +msgstr "Фон:" + +#: ../src/viktrwlayer.c:678 +msgid "Fake BG Color Translucency:" +msgstr "" + +#: ../src/viktrwlayer.c:679 +msgid "Waypoint marker:" +msgstr "Маркер путевых точек:" + +#: ../src/viktrwlayer.c:680 +msgid "Waypoint size:" +msgstr "Размер путевых точек:" + +#: ../src/viktrwlayer.c:681 +msgid "Draw Waypoint Symbols:" +msgstr "Рисовать символы путевых точек:" + +#: ../src/viktrwlayer.c:682 +msgid "Waypoint Sort Order:" +msgstr "Сортировка путевых точек:" + +#: ../src/viktrwlayer.c:684 +msgid "Draw Waypoint Images" +msgstr "Рисовать картинки путевых точек" + +#: ../src/viktrwlayer.c:685 +msgid "Image Size (pixels):" +msgstr "Размер картинки (пикселы):" + +#: ../src/viktrwlayer.c:686 +msgid "Image Alpha:" +msgstr "Прозрачность картинки:" + +#: ../src/viktrwlayer.c:687 +msgid "Image Memory Cache Size:" +msgstr "Размер кэша для картинок:" + +#: ../src/viktrwlayer.c:690 +msgid "Author" +msgstr "Автор" + +#: ../src/viktrwlayer.c:691 +msgid "Creation Time" +msgstr "Время создания" + +#: ../src/viktrwlayer.c:692 +msgid "Keywords" +msgstr "Ключевые слова" + +#: ../src/viktrwlayer.c:693 +#, fuzzy +msgid "External layer:" +msgstr "_Внешняя" + +#: ../src/viktrwlayer.c:693 +msgid "" +"Layer data stored in the Viking file, in an external file, or in an external " +"file but changes are not written to the file (file only loaded at startup)" +msgstr "" + +#: ../src/viktrwlayer.c:694 +#, fuzzy +msgid "Save layer as:" +msgstr "Один слой" + +#: ../src/viktrwlayer.c:694 +msgid "Specify where layer should be saved. Overwrites file if it exists." +msgstr "" + +#: ../src/viktrwlayer.c:798 +msgid "TrackWaypoint" +msgstr "Путевая точка" + +#: ../src/viktrwlayer.c:1999 ../src/viktrwlayer_propwin.c:1469 +#: ../src/viktrwlayer_propwin.c:1471 ../src/vikutils.c:299 +#: ../src/vikutils.c:326 +msgid "miles" +msgstr "мили" + +#: ../src/viktrwlayer.c:2002 ../src/viktrwlayer_propwin.c:1475 +#: ../src/viktrwlayer_propwin.c:1477 ../src/vikutils.c:303 +#: ../src/vikutils.c:330 +msgid "NM" +msgstr "" + +#. VIK_UNITS_DISTANCE_KILOMETRES: +#: ../src/viktrwlayer.c:2006 ../src/viktrwlayer_propwin.c:1482 +#: ../src/viktrwlayer_propwin.c:1484 ../src/vikutils.c:308 +#: ../src/vikutils.c:335 +msgid "km" +msgstr "км" + +#: ../src/viktrwlayer.c:2121 +msgid "start/end" +msgstr "начало/конец" + +#: ../src/viktrwlayer.c:2133 +msgid "start" +msgstr "начало" + +#: ../src/viktrwlayer.c:2142 +msgid "end" +msgstr "конец" + +#: ../src/viktrwlayer.c:3103 +#, c-format +msgid " in %d:%02d hrs:mins" +msgstr " в %d:%02d ч:мин" + +#: ../src/viktrwlayer.c:3107 +#, c-format +msgid "" +"\n" +"%sTotal Length %.1f %s%s" +msgstr "" +"\n" +"%sОбщая длина %.1f %s%s" + +#: ../src/viktrwlayer.c:3131 +#, c-format +msgid "" +"\n" +"Total route length %.1f %s" +msgstr "" +"\n" +"Общая длина маршрута %.1f %s" + +#: ../src/viktrwlayer.c:3136 +#, c-format +msgid "Tracks: %d - Waypoints: %d - Routes: %d%s%s" +msgstr "Треков: %d - Путевых точек: %d - Маршрутов: %d%s%s" + +#: ../src/viktrwlayer.c:3155 +#, c-format +msgid "Tracks: %d" +msgstr "Треки: %d" + +#: ../src/viktrwlayer.c:3165 +#, c-format +msgid "Routes: %d" +msgstr "Маршруты: %d" + +#: ../src/viktrwlayer.c:3195 +#, c-format +msgid "- %d:%02d hrs:mins" +msgstr "- %d:%02d ч:мин" + +#: ../src/viktrwlayer.c:3202 +#, c-format +msgid "%s%.1f km %s" +msgstr "%s%.1f км %s" + +#: ../src/viktrwlayer.c:3205 +#, c-format +msgid "%s%.1f miles %s" +msgstr "%s%.1f миль %s" + +#: ../src/viktrwlayer.c:3208 +#, c-format +msgid "%s%.1f NM %s" +msgstr "" + +#: ../src/viktrwlayer.c:3222 +#, c-format +msgid "Waypoints: %d" +msgstr "Путевые точки: %d" + +#: ../src/viktrwlayer.c:3279 +#, c-format +msgid "Wpt: Alt %dft" +msgstr "Тчк: Высота %dф" + +#. VIK_UNITS_HEIGHT_METRES: +#: ../src/viktrwlayer.c:3283 +#, c-format +msgid "Wpt: Alt %dm" +msgstr "Тчк: Высота %dм" + +#. Add comment if available +#: ../src/viktrwlayer.c:3298 +#, c-format +msgid "%s | %s %s | Comment: %s" +msgstr "%s | %s %s | Комментарий: %s" + +#: ../src/viktrwlayer.c:3300 +#, c-format +msgid "%s | %s %s" +msgstr "%s | %s %s" + +#: ../src/viktrwlayer.c:3562 ../src/viktrwlayer.c:3591 +msgid "This layer has no waypoints or trackpoints." +msgstr "В этом слое нет путевых точек или узлов треков." + +#: ../src/viktrwlayer.c:3598 ../src/viktrwlayer.c:3607 +#: ../src/viktrwlayer.c:3616 ../src/viktrwlayer.c:3625 +#: ../src/viktrwlayer.c:3634 ../src/viktrwlayer.c:3642 +msgid "Export Layer" +msgstr "Экспортировать слой" + +#: ../src/viktrwlayer.c:3671 +msgid "Export Route as GPX" +msgstr "Экспортировать маршрут в GPX" + +#: ../src/viktrwlayer.c:3673 +msgid "Export Track as GPX" +msgstr "Экспортировать треки в GPX" + +#: ../src/viktrwlayer.c:3693 +msgid "Find" +msgstr "Найти" + +#: ../src/viktrwlayer.c:3703 +msgid "Waypoint Name:" +msgstr "Имя путевой точки:" + +#: ../src/viktrwlayer.c:3720 +msgid "Waypoint not found in this layer." +msgstr "Пункт не найден в этом слое." + +#: ../src/viktrwlayer.c:3989 +msgid "Can not upload invisible track." +msgstr "Невозможно загрузить невидимый трек." + +#: ../src/viktrwlayer.c:4082 ../src/viktrwlayer.c:10512 +msgid "Track" +msgstr "Трек" + +#: ../src/viktrwlayer.c:4107 ../src/viktrwlayer.c:10599 +msgid "Route" +msgstr "Маршрут" + +#: ../src/viktrwlayer.c:4194 +msgid "Externa_l" +msgstr "_Внешняя" + +#: ../src/viktrwlayer.c:4216 ../src/viktrwlayer.c:8456 +#: ../src/viktrwlayer.c:8574 +msgid "_Finish Route" +msgstr "_Завершить маршрут" + +#: ../src/viktrwlayer.c:4218 ../src/viktrwlayer.c:8380 +#: ../src/viktrwlayer.c:8572 +msgid "_Finish Track" +msgstr "_Завершить трек" + +#. Now with icons +#: ../src/viktrwlayer.c:4230 +msgid "_View Layer" +msgstr "_Показать слой" + +#: ../src/viktrwlayer.c:4237 +msgid "V_iew" +msgstr "_Вид" + +#: ../src/viktrwlayer.c:4243 +msgid "View All _Tracks" +msgstr "Показать все _треки" + +#: ../src/viktrwlayer.c:4248 +msgid "View All _Routes" +msgstr "Показать всем _маршруты" + +#: ../src/viktrwlayer.c:4253 +msgid "View All _Waypoints" +msgstr "Показать все путевые _точки" + +#: ../src/viktrwlayer.c:4258 +msgid "_Goto Center of Layer" +msgstr "Перейти к центру слоя" + +#: ../src/viktrwlayer.c:4264 ../src/viktrwlayer.c:8321 +msgid "Goto _Waypoint..." +msgstr "Перейти к п_утевой точке..." + +#: ../src/viktrwlayer.c:4270 +msgid "_Export Layer" +msgstr "Экспортировать слой" + +#: ../src/viktrwlayer.c:4276 +msgid "Export as GPS_Point..." +msgstr "" + +#: ../src/viktrwlayer.c:4281 +msgid "Export as GPS_Mapper..." +msgstr "" + +#: ../src/viktrwlayer.c:4286 +msgid "Export as _GPX..." +msgstr "Экспортировать как _GPX..." + +#: ../src/viktrwlayer.c:4292 +msgid "Export as _KML..." +msgstr "Экспортировать как _KML..." + +#: ../src/viktrwlayer.c:4299 +msgid "Export as GEO_JSON..." +msgstr "Экспортировать как GEO_JSON" + +#: ../src/viktrwlayer.c:4306 +msgid "Export via GPSbabel..." +msgstr "Экспортировать через GPSbabel..." + +#: ../src/viktrwlayer.c:4312 +#, c-format +msgid "Open with External Program_1: %s" +msgstr "Открыть во внешней программе_1: %s" + +#: ../src/viktrwlayer.c:4319 +#, c-format +msgid "Open with External Program_2: %s" +msgstr "Открыть во внешней программе_2: %s" + +#: ../src/viktrwlayer.c:4327 ../src/vikwindow.c:4825 +msgid "_New" +msgstr "_Новый" + +#: ../src/viktrwlayer.c:4333 +msgid "New _Waypoint..." +msgstr "Новая _путевая точка..." + +#: ../src/viktrwlayer.c:4339 +msgid "New _Track" +msgstr "Новый _трек" + +#: ../src/viktrwlayer.c:4347 +msgid "New _Route" +msgstr "Новый _маршрут" + +#: ../src/viktrwlayer.c:4356 ../src/viktrwlayer.c:8232 +#: ../src/viktrwlayer.c:9003 +msgid "Geotag _Images..." +msgstr "Тегировать изображения" + +#: ../src/viktrwlayer.c:4363 +msgid "_Acquire" +msgstr "_Получить" + +#: ../src/viktrwlayer.c:4369 ../src/vikwindow.c:4904 +msgid "From _GPS..." +msgstr "Из _GPS..." + +#. FIXME: only add menu when at least a routing engine has support for Directions +#: ../src/viktrwlayer.c:4375 +msgid "From _Directions..." +msgstr "" + +#: ../src/viktrwlayer.c:4381 +msgid "From _OSM Traces..." +msgstr "Из треков _OSM..." + +#: ../src/viktrwlayer.c:4386 +msgid "From _My OSM Traces..." +msgstr "Из _моих треков OSM..." + +#: ../src/viktrwlayer.c:4392 ../src/vikwindow.c:4844 +msgid "From _URL..." +msgstr "" + +#: ../src/viktrwlayer.c:4399 ../src/vikwindow.c:4846 +msgid "From _Wikipedia Waypoints" +msgstr "Из путевых точек _Википедии" + +#: ../src/viktrwlayer.c:4405 +msgid "Within _Layer Bounds" +msgstr "В рамках слоя" + +#: ../src/viktrwlayer.c:4411 +msgid "Within _Current View" +msgstr "Внутри текущего вида" + +#: ../src/viktrwlayer.c:4419 +msgid "From Geo_caching..." +msgstr "Из _геокэшинга..." + +#: ../src/viktrwlayer.c:4426 ../src/vikwindow.c:4842 +msgid "From Geotagged _Images..." +msgstr "Из _изображений с геотегами..." + +#: ../src/viktrwlayer.c:4433 +msgid "From _File..." +msgstr "Из _файла..." + +#: ../src/viktrwlayer.c:4436 ../src/vikwindow.c:4905 +msgid "Import File With GPS_Babel..." +msgstr "Импортировать файл с помощью GPS_Babel..." + +#: ../src/viktrwlayer.c:4443 ../src/viktrwlayer.c:8905 +msgid "_Upload" +msgstr "_Загрузить" + +#: ../src/viktrwlayer.c:4449 +msgid "Upload to _GPS..." +msgstr "Загрузить в _GPS..." + +#: ../src/viktrwlayer.c:4456 ../src/viktrwlayer.c:8973 +msgid "Upload to _OSM..." +msgstr "Загрузить в _OSM..." + +#: ../src/viktrwlayer.c:4464 +msgid "De_lete" +msgstr "_Удалить" + +#: ../src/viktrwlayer.c:4470 +msgid "Delete All _Tracks" +msgstr "Удалить все _треки" + +#: ../src/viktrwlayer.c:4477 +msgid "Delete Tracks _From Selection..." +msgstr "Удалить треки _из выделения..." + +#: ../src/viktrwlayer.c:4484 ../src/viktrwlayer.c:8481 +msgid "Delete _All Routes" +msgstr "Удалить все _маршруты" + +#: ../src/viktrwlayer.c:4491 ../src/viktrwlayer.c:8487 +msgid "_Delete Routes From Selection..." +msgstr "У_далить маршруты из выделения..." + +#: ../src/viktrwlayer.c:4498 +msgid "Delete All _Waypoints" +msgstr "Удалить все _путевые точки" + +#: ../src/viktrwlayer.c:4505 +msgid "Delete Waypoints From _Selection..." +msgstr "У_далить путевые точки из выделения..." + +#: ../src/viktrwlayer.c:4512 ../src/viktrwlayer.c:8339 +#, fuzzy +msgid "Delete Duplicate Waypoints" +msgstr "Удалить повторяющиеся точки" + +#: ../src/viktrwlayer.c:5198 +#, c-format +msgid "Are you sure you want to delete all tracks in %s?" +msgstr "Действительно удалить все треки из %s?" + +#: ../src/viktrwlayer.c:5211 +#, c-format +msgid "Are you sure you want to delete all routes in %s?" +msgstr "Действительно удалить все маршруты из %s?" + +#: ../src/viktrwlayer.c:5221 +#, c-format +msgid "Are you sure you want to delete all waypoints in %s?" +msgstr "Действительно удалить все путевые точки из %s?" + +#: ../src/viktrwlayer.c:5238 +#, c-format +msgid "Are you sure you want to delete the waypoint \"%s\"?" +msgstr "Действительно удалить путевую точку \"%s\"?" + +#: ../src/viktrwlayer.c:5254 +#, c-format +msgid "Are you sure you want to delete the track \"%s\"?" +msgstr "Действительно удалить трек \"%s\"?" + +#: ../src/viktrwlayer.c:5271 +#, c-format +msgid "Are you sure you want to delete the route \"%s\"?" +msgstr "Действительно удалить маршрут \"%s\"?" + +#: ../src/viktrwlayer.c:5527 ../src/viktrwlayer.c:6373 +msgid "" +"Converting a track to a route removes extra track data such as segments, " +"timestamps, etc...\n" +"Do you want to continue?" +msgstr "" +"Преобразование трека в маршрут удалит дополнительные данные, такие как " +"сегменты, метки времени и т.п...\n" +"Вы действительно хотите продолжить?" + +#: ../src/viktrwlayer.c:5631 +msgid "No DEM layers available, thus no DEM values can be applied." +msgstr "Нет доступного слоя DEM, поэтому нельзя применить значения DEM." + +#: ../src/viktrwlayer.c:5651 ../src/viktrwlayer.c:5692 +#, c-format +msgid "%ld point adjusted" +msgid_plural "%ld points adjusted" +msgstr[0] "%ld точка скорректирована" +msgstr[1] "%ld точки скорректировано" +msgstr[2] "%ld точкек скорректировано" + +#: ../src/viktrwlayer.c:5736 +#, c-format +msgid "%ld waypoint changed" +msgid_plural "%ld waypoints changed" +msgstr[0] "%ld путевая точка изменена" +msgstr[1] "%ld путевых точки изменены" +msgstr[2] "%ld путевых точек изменены" + +#: ../src/viktrwlayer.c:5917 +#, c-format +msgid "" +"Refining a track with many points (%d) is unlikely to yield sensible " +"results. Do you want to Continue?" +msgstr "" +"Переработка трека с большим количеством точек (%d) врядли даст ощутимые " +"результаты. Действительно продолжить?" + +#. Select engine from dialog +#: ../src/viktrwlayer.c:5925 +msgid "Refine Route with Routing Engine..." +msgstr "Уточнить маршрут с роутинговым движком..." + +#: ../src/viktrwlayer.c:5933 +msgid "Select routing engine" +msgstr "Выберите роутинговый движок" + +#: ../src/viktrwlayer.c:6158 +msgid "Failed. No other tracks with timestamps in this layer found" +msgstr "Неудача. Не найдено других треков с метками времени в этом слое" + +#: ../src/viktrwlayer.c:6160 +msgid "Failed. No other tracks without timestamps in this layer found" +msgstr "Неудача. Не найдено других треков без меток времени в этом слое" + +#: ../src/viktrwlayer.c:6179 +msgid "Merge with..." +msgstr "Объединить с..." + +#: ../src/viktrwlayer.c:6180 +msgid "Select route to merge with" +msgstr "Выберите маршрут для объединения" + +#: ../src/viktrwlayer.c:6180 +msgid "Select track to merge with" +msgstr "Выберите трек для объединения" + +#: ../src/viktrwlayer.c:6264 ../src/viktrwlayer.c:6346 +msgid "Append Route" +msgstr "Добавить маршрут" + +#: ../src/viktrwlayer.c:6264 ../src/viktrwlayer.c:6346 +msgid "Append Track" +msgstr "Добавить трек" + +#: ../src/viktrwlayer.c:6265 +msgid "Select the route to append after the current route" +msgstr "Выберите маршрут для добавления после текущего маршрута" + +#: ../src/viktrwlayer.c:6266 +msgid "Select the track to append after the current track" +msgstr "Выберите трек для добавления после текущего трека" + +#: ../src/viktrwlayer.c:6347 +msgid "Select the track to append after the current route" +msgstr "Выберите трек для добавления после текущего маршрута" + +#: ../src/viktrwlayer.c:6348 +msgid "Select the route to append after the current track" +msgstr "Выберите маршрут для добавления после текущего трека" + +#: ../src/viktrwlayer.c:6414 +#, c-format +msgid "%d segment merged" +msgid_plural "%d segments merged" +msgstr[0] "%d сегмент объединён" +msgstr[1] "%d сегмента объединено" +msgstr[2] "%d сегментов объединено" + +#: ../src/viktrwlayer.c:6430 +msgid "Failed. This track does not have timestamp" +msgstr "Неудача. У этого маршрута нет отметки времени" + +#: ../src/viktrwlayer.c:6442 +msgid "Failed. No other track in this layer has timestamp" +msgstr "Неудача. В этом слое больше нет маршрутов с отметками времени" + +#: ../src/viktrwlayer.c:6449 +msgid "Merge Threshold..." +msgstr "Порог объединения..." + +#: ../src/viktrwlayer.c:6450 +msgid "Merge when time between tracks less than:" +msgstr "Объединить, если время между треками меньше:" + +#: ../src/viktrwlayer.c:6580 +msgid "Split Threshold..." +msgstr "Порог разделения..." + +#: ../src/viktrwlayer.c:6581 +msgid "Split when time between trackpoints exceeds:" +msgstr "Разделить, если время между узлами превышает:" + +#: ../src/viktrwlayer.c:6598 +#, c-format +msgid "" +"Can not split track due to trackpoints not ordered in time - such as at %s.\n" +"\n" +"Goto this trackpoint?" +msgstr "" +"Невозможно разделить трек, точки в нём не отсортированы по времени - как в " +"%s\n" +"\n" +"Перейти к этой точке?" + +#: ../src/viktrwlayer.c:6668 +msgid "Split Every Nth Point" +msgstr "Разделить в каждой n-ной точке" + +#: ../src/viktrwlayer.c:6669 +msgid "Split on every Nth point:" +msgstr "Разделить в каждой N-ой точке:" + +#: ../src/viktrwlayer.c:6779 +msgid "Can not split track as it has no segments" +msgstr "Нельзя разделит трек, т.к. он не содержит сегментов" + +#: ../src/viktrwlayer.c:6861 ../src/viktrwlayer.c:6891 +#, c-format +msgid "Deleted %ld point" +msgid_plural "Deleted %ld points" +msgstr[0] "Удалена %ld точка" +msgstr[1] "Удалены %ld точки" +msgstr[2] "Удалено %ld точек" + +#: ../src/viktrwlayer.c:6966 ../src/viktrwlayer.c:10989 +#: ../src/viktrwlayer_waypointlist.c:214 +#, c-format +msgid "Could not launch %s to open file." +msgstr "Не удалось запустить %s, чтобы открыть файл." + +#: ../src/viktrwlayer.c:6992 ../src/viktrwlayer.c:7113 +msgid "This track has no date information." +msgstr "Трек не содержит информации о дате" + +#: ../src/viktrwlayer.c:7006 ../src/viktrwlayer.c:7136 +msgid "This waypoint has no date information." +msgstr "В этой точке нет информации о времени." + +#: ../src/viktrwlayer.c:7030 +#, c-format +msgid "Could not launch %s" +msgstr "Невозможно запустить %s" + +#: ../src/viktrwlayer.c:7269 +msgid "Internal Error in vik_trw_layer_uniquify_tracks" +msgstr "Внутренняя ошибка в vik_trw_layer_uniquify_tracks" + +#: ../src/viktrwlayer.c:7374 ../src/viktrwlayer.c:7424 +#: ../src/viktrwlayer.c:7587 +msgid "" +"Multiple entries with the same name exist. This method only works with " +"unique names. Force unique names now?" +msgstr "" +"Создано несколько элементов с одинаковым именем. Этот метод работает только " +"с уникальными именами. Привести имена к уникальному виду?" + +#: ../src/viktrwlayer.c:7385 +msgid "No tracks found" +msgstr "Не найдено треков" + +#: ../src/viktrwlayer.c:7393 ../src/viktrwlayer.c:7443 +#: ../src/viktrwlayer.c:7607 +msgid "Delete Selection" +msgstr "Удалить выделение" + +#: ../src/viktrwlayer.c:7394 +msgid "Select tracks to delete" +msgstr "Выделите треки для удаления" + +#: ../src/viktrwlayer.c:7435 +msgid "No routes found" +msgstr "Не найдено маршрутов" + +#: ../src/viktrwlayer.c:7444 +msgid "Select routes to delete" +msgstr "Выделите маршруты для удаления" + +#: ../src/viktrwlayer.c:7550 +msgid "Internal Error in vik_trw_layer_uniquify_waypoints" +msgstr "Внутренняя ошибка в vik_trw_layer_uniquify_waypoints" + +#: ../src/viktrwlayer.c:7597 +msgid "No waypoints found" +msgstr "Не найдено путевых точек" + +#: ../src/viktrwlayer.c:7608 +msgid "Select waypoints to delete" +msgstr "Выберите путевые точки для удаления" + +#: ../src/viktrwlayer.c:7691 +#, fuzzy, c-format +msgid "%ld waypoint deleted" +msgid_plural "%ld waypoints deleted" +msgstr[0] "%ld путевая точка изменена" +msgstr[1] "%ld путевых точки изменены" +msgstr[2] "%ld путевых точек изменены" + +#: ../src/viktrwlayer.c:7697 +#, fuzzy +msgid "No duplicates found" +msgstr "Не найдено маршрутов" + +#: ../src/viktrwlayer.c:8028 +#, c-format +msgid "" +"A waypoint with the name \"%s\" already exists. Really rename to the same " +"name?" +msgstr "" +"Путевая точка с именем \"%s\" уже существует. Действительно дать такое же " +"имя?" + +#: ../src/viktrwlayer.c:8058 +#, c-format +msgid "" +"A track with the name \"%s\" already exists. Really rename to the same name?" +msgstr "Трек с именем \"%s\" уже существует. Действительно дать такое же имя?" + +#: ../src/viktrwlayer.c:8095 +#, c-format +msgid "" +"A route with the name \"%s\" already exists. Really rename to the same name?" +msgstr "" +"Маршрут с именем \"%s\" уже существует. Действительно дать такое же имя?" + +#: ../src/viktrwlayer.c:8215 ../src/viktrwlayer.c:8602 +msgid "_Goto" +msgstr "Перейти" + +#: ../src/viktrwlayer.c:8226 +msgid "_Visit Geocache Webpage" +msgstr "Посетить web-страницу геотайника" + +#: ../src/viktrwlayer.c:8235 +msgid "Geotag multiple images against this waypoint" +msgstr "Геотегировать изображения по путевым точкам" + +#: ../src/viktrwlayer.c:8245 ../src/viktrwlayer_waypointlist.c:352 +msgid "_Show Picture..." +msgstr "Показать _изображение..." + +#: ../src/viktrwlayer.c:8253 +msgid "Update Geotag on _Image" +msgstr "" + +#: ../src/viktrwlayer.c:8259 +msgid "_Update" +msgstr "О_бновить" + +#: ../src/viktrwlayer.c:8264 +msgid "Update and _Keep File Timestamp" +msgstr "Обновить и _Сохранить время файла" + +#: ../src/viktrwlayer.c:8276 +msgid "Visit _Webpage" +msgstr "Посетить _веб-страницу" + +#: ../src/viktrwlayer.c:8306 +msgid "_New Waypoint..." +msgstr "_Новая путевая точка..." + +#: ../src/viktrwlayer.c:8315 +msgid "_View All Waypoints" +msgstr "_Показать все путевые точки" + +#: ../src/viktrwlayer.c:8327 +msgid "Delete _All Waypoints" +msgstr "Удалить _все путевые точки" + +#: ../src/viktrwlayer.c:8333 +msgid "_Delete Waypoints From Selection..." +msgstr "_Удалить путевые точки из выделения..." + +#: ../src/viktrwlayer.c:8351 +msgid "_Show All Waypoints" +msgstr "По_казать все путевые точки" + +#: ../src/viktrwlayer.c:8357 +msgid "_Hide All Waypoints" +msgstr "С_крыть все путевые точки" + +#: ../src/viktrwlayer.c:8369 +msgid "_List Waypoints..." +msgstr "_Список путевых точек" + +#: ../src/viktrwlayer.c:8390 +msgid "_View All Tracks" +msgstr "_Показать все треки" + +#: ../src/viktrwlayer.c:8396 +msgid "_New Track" +msgstr "_Новый трек" + +#: ../src/viktrwlayer.c:8404 +msgid "Delete _All Tracks" +msgstr "Удалить _все треки" + +#: ../src/viktrwlayer.c:8410 +msgid "_Delete Tracks From Selection..." +msgstr "_Удалить треки из выделения..." + +#: ../src/viktrwlayer.c:8422 +msgid "_Show All Tracks" +msgstr "По_казать все треки" + +#: ../src/viktrwlayer.c:8428 +msgid "_Hide All Tracks" +msgstr "С_крыть все треки" + +#: ../src/viktrwlayer.c:8439 +msgid "_List Tracks..." +msgstr "_Список треков..." + +#: ../src/viktrwlayer.c:8467 +msgid "_View All Routes" +msgstr "_Показать все маршруты" + +#: ../src/viktrwlayer.c:8473 +msgid "_New Route" +msgstr "_Новый маршрут" + +#: ../src/viktrwlayer.c:8499 +msgid "_Show All Routes" +msgstr "По_казать все маршруты" + +#: ../src/viktrwlayer.c:8505 +msgid "_Hide All Routes" +msgstr "С_крыть все маршруты" + +#: ../src/viktrwlayer.c:8516 +msgid "_List Routes..." +msgstr "_Список маршрутов..." + +#: ../src/viktrwlayer.c:8587 +msgid "_View Track" +msgstr "_Показать трек" + +#: ../src/viktrwlayer.c:8589 +msgid "_View Route" +msgstr "_Показать маршрут" + +#: ../src/viktrwlayer.c:8608 +msgid "_Startpoint" +msgstr "_Начало" + +#: ../src/viktrwlayer.c:8614 +msgid "\"_Center\"" +msgstr "\"_Центр\"" + +#: ../src/viktrwlayer.c:8620 +msgid "_Endpoint" +msgstr "_Конец" + +#: ../src/viktrwlayer.c:8626 +msgid "_Highest Altitude" +msgstr "Наи_большая высота" + +#: ../src/viktrwlayer.c:8632 +msgid "_Lowest Altitude" +msgstr "Наи_меньшая высота" + +#: ../src/viktrwlayer.c:8640 +msgid "_Maximum Speed" +msgstr "Ма_ксимальная скорость" + +#: ../src/viktrwlayer.c:8646 +#, fuzzy +msgid "_Date" +msgstr "Дата" + +#: ../src/viktrwlayer.c:8655 +msgid "Co_mbine" +msgstr "Об_ъединить" + +#: ../src/viktrwlayer.c:8663 +msgid "_Merge By Time..." +msgstr "Объединить по в_ремени..." + +#: ../src/viktrwlayer.c:8668 +msgid "Merge _Segments" +msgstr "Объединить _сегменты" + +#: ../src/viktrwlayer.c:8675 +msgid "Merge _With Other Tracks..." +msgstr "Объ_единить с другими треками..." + +#: ../src/viktrwlayer.c:8682 +msgid "_Append Track..." +msgstr "_Добавить трек..." + +#: ../src/viktrwlayer.c:8684 +msgid "_Append Route..." +msgstr "_Добавить маршрут..." + +#: ../src/viktrwlayer.c:8690 +msgid "Append _Route..." +msgstr "Добавить _маршрут..." + +#: ../src/viktrwlayer.c:8692 +msgid "Append _Track..." +msgstr "Добавить _трек..." + +#: ../src/viktrwlayer.c:8699 +msgid "_Split" +msgstr "_Разделить" + +#: ../src/viktrwlayer.c:8707 +msgid "_Split By Time..." +msgstr "_Разделить по времени..." + +#. ATM always enable this entry - don't want to have to analyse the track before displaying the menu - to keep the menu speedy +#: ../src/viktrwlayer.c:8713 +msgid "Split Se_gments" +msgstr "Разделить се_гменты" + +#: ../src/viktrwlayer.c:8719 +msgid "Split By _Number of Points..." +msgstr "Разделить по _числу точек..." + +#: ../src/viktrwlayer.c:8724 +msgid "Split at _Trackpoint" +msgstr "Разделить в _точке" + +#: ../src/viktrwlayer.c:8732 +msgid "_Insert Points" +msgstr "_Вставить точки" + +#: ../src/viktrwlayer.c:8738 +msgid "Insert Point _Before Selected Point" +msgstr "Вставить точку _перед выделенной точкой" + +#: ../src/viktrwlayer.c:8745 +msgid "Insert Point _After Selected Point" +msgstr "Вставить точку п_осле выделенной точки" + +#: ../src/viktrwlayer.c:8754 +msgid "Delete Poi_nts" +msgstr "Удалить то_чки" + +#: ../src/viktrwlayer.c:8760 +msgid "Delete _Selected Point" +msgstr "Удалить в_ыделенную точку" + +#: ../src/viktrwlayer.c:8768 +msgid "Delete Points With The Same _Position" +msgstr "Удалить точку с той же по_зицией" + +#: ../src/viktrwlayer.c:8773 +msgid "Delete Points With The Same _Time" +msgstr "Удалить точку с тем же в_ременем" + +#: ../src/viktrwlayer.c:8780 ../src/viktrwlayer.c:9029 +msgid "_Transform" +msgstr "Пр_еобразовать" + +#: ../src/viktrwlayer.c:8788 ../src/viktrwlayer.c:9037 +msgid "_Apply DEM Data" +msgstr "_Применить данные DEM" + +#: ../src/viktrwlayer.c:8793 ../src/viktrwlayer.c:9042 +msgid "_Overwrite" +msgstr "Пере_записать" + +#: ../src/viktrwlayer.c:8796 ../src/viktrwlayer.c:9045 +msgid "Overwrite any existing elevation values with DEM values" +msgstr "Заменить существующие значения высоты значениями DEM" + +#: ../src/viktrwlayer.c:8799 ../src/viktrwlayer.c:9048 +msgid "_Keep Existing" +msgstr "_Оставить существующие" + +#: ../src/viktrwlayer.c:8802 ../src/viktrwlayer.c:9051 +msgid "Keep existing elevation values, only attempt for missing values" +msgstr "" +"Оставить существующие значения высоты, только попытка добавить отсуствующие" + +#: ../src/viktrwlayer.c:8807 +msgid "_Smooth Missing Elevation Data" +msgstr "Сгладить отсутствующие данные высоты" + +#: ../src/viktrwlayer.c:8812 +msgid "_Interpolated" +msgstr "_Интерполированный" + +#: ../src/viktrwlayer.c:8815 +msgid "" +"Interpolate between known elevation values to derive values for the missing " +"elevations" +msgstr "" +"Создать отсутствующие значения высоты с помощью интерполяции между " +"известными значениями" + +#: ../src/viktrwlayer.c:8818 +msgid "_Flat" +msgstr "_Плоский" + +#: ../src/viktrwlayer.c:8821 +msgid "Set unknown elevation values to the last known value" +msgstr "" + +#: ../src/viktrwlayer.c:8825 +msgid "C_onvert to a Route" +msgstr "П_реобразовать в маршрут" + +#: ../src/viktrwlayer.c:8827 +msgid "C_onvert to a Track" +msgstr "П_реобразовать в трек" + +#: ../src/viktrwlayer.c:8835 +msgid "_Anonymize Times" +msgstr "_Анонимизировать время" + +#: ../src/viktrwlayer.c:8838 +msgid "Shift timestamps to a relative offset from 1901-01-01" +msgstr "Сдвинуть время в отношении к 1901-01-01" + +#: ../src/viktrwlayer.c:8841 +msgid "_Interpolate Times" +msgstr "_Интерполировать время" + +#: ../src/viktrwlayer.c:8844 +msgid "" +"Reset trackpoint timestamps between the first and last points such that " +"track is traveled at equal speed" +msgstr "" +"Сбросить временные отметки между первой и последней точками таким образом, " +"как будто трек был пройден с постоянной скоростью" + +#: ../src/viktrwlayer.c:8849 +msgid "_Reverse Track" +msgstr "_Обратить трек" + +#: ../src/viktrwlayer.c:8851 +msgid "_Reverse Route" +msgstr "_Обратить маршрут" + +#: ../src/viktrwlayer.c:8858 +msgid "Refine Route..." +msgstr "Уточнить маршрут..." + +#: ../src/viktrwlayer.c:8868 +msgid "Down_load Maps Along Track..." +msgstr "Ска_чать карты вдоль трека..." + +#: ../src/viktrwlayer.c:8870 +msgid "Down_load Maps Along Route..." +msgstr "Ска_чать карты вдоль маршрута..." + +#: ../src/viktrwlayer.c:8878 +msgid "_Export Track as GPX..." +msgstr "_Экспортировать трек в GPX..." + +#: ../src/viktrwlayer.c:8880 +msgid "_Export Route as GPX..." +msgstr "_Экспортировать маршрут в GPX..." + +#: ../src/viktrwlayer.c:8887 +msgid "E_xtend Track End" +msgstr "Пр_одолжить конец трека" + +#: ../src/viktrwlayer.c:8889 +msgid "E_xtend Route End" +msgstr "Пр_одолжить конец маршрута" + +#: ../src/viktrwlayer.c:8896 +msgid "Extend _Using Route Finder" +msgstr "Расширить _используя роутинговый движок" + +#: ../src/viktrwlayer.c:8911 +msgid "_Upload to GPS..." +msgstr "_Загрузить в GPS..." + +#: ../src/viktrwlayer.c:8926 +msgid "_Diary" +msgstr "_Дневник" + +#: ../src/viktrwlayer.c:8930 +msgid "Open diary program at this date" +msgstr "Открыть дневник на этой дате" + +#: ../src/viktrwlayer.c:8935 +msgid "_Astronomy" +msgstr "_Астрономия" + +#: ../src/viktrwlayer.c:8938 +msgid "Open astronomy program at this date and location" +msgstr "Открыть астрономическую программу на этой дате в этом местоположении" + +#: ../src/viktrwlayer.c:8962 +msgid "_View Google Directions" +msgstr "" + +#: ../src/viktrwlayer.c:8984 +msgid "Use with _Filter" +msgstr "Использовать с филь_ром" + +#: ../src/viktrwlayer.c:9018 +msgid "_Edit Trackpoint" +msgstr "_Редактировать узел трека" + +#: ../src/viktrwlayer.c:10116 +#, c-format +msgid " - Gain %dm:Loss %dm" +msgstr " - Подьём %dм:Спуск %dм" + +#: ../src/viktrwlayer.c:10118 +#, c-format +msgid " - Gain %dft:Loss %dft" +msgstr " - Подьём %dф:Спуск %dф" + +#: ../src/viktrwlayer.c:10123 +#, c-format +msgid " - Bearing %3.1f° - Step %s" +msgstr "" + +#: ../src/viktrwlayer.c:10232 +#, c-format +msgid "Querying %s for route between (%.3f, %.3f) and (%.3f, %.3f)." +msgstr "Запрос у %s маршрута между (%.3f, %.3f) и (%.3f, %.3f)." + +#: ../src/viktrwlayer.c:10248 +#, c-format +msgid "%s returned route between (%.3f, %.3f) and (%.3f, %.3f)." +msgstr "%s вернул маршрут между (%.3f, %.3f) и (%.3f, %.3f)." + +#: ../src/viktrwlayer.c:10251 +#, c-format +msgid "Error getting route from %s." +msgstr "Ошибка при получении маршрута от %s" + +#: ../src/viktrwlayer.c:11070 +#, c-format +msgid "Creating %d Image Thumbnails..." +msgstr "Создание %d картинок миниатюр..." + +#: ../src/viktrwlayer.c:11560 +msgid "No map layer in use. Create one first" +msgstr "Нет слоя карты. Создайте его сначала" + +#: ../src/viktrwlayer.c:11679 +#, c-format +msgid "%s: Track List" +msgstr "%s: Список треков" + +#: ../src/viktrwlayer.c:11681 +#, c-format +msgid "%s: Route List" +msgstr "%s: Список маршрутов" + +#: ../src/viktrwlayer.c:11734 +#, c-format +msgid "" +"Could not write external layer %s to %s, please fix and save before exiting " +"or data will be lost" +msgstr "" + +#: ../src/viktrwlayer.c:11782 +#, fuzzy, c-format +msgid "WARNING: issues encountered loading external layer %s from %s" +msgstr "ВНИМАНИЕ: обнаружены проблемы при загрузке %s" + +#: ../src/viktrwlayer_export.c:47 +msgid "Auto Device GPX Simplify:" +msgstr "" + +#: ../src/viktrwlayer_export.c:48 +msgid "" +"GPX saves to certain devices will be simplified for device compatibility." +msgstr "" + +#: ../src/viktrwlayer_export.c:125 +#, c-format +msgid "Export of GPX file simplified using point limit: %d" +msgstr "" + +#: ../src/viktrwlayer_export.c:206 ../src/viktrwlayer_export.c:323 +#: ../src/vikwindow.c:3694 +msgid "The filename you requested could not be opened for writing." +msgstr "Выбранный вами файл невозможно открыть для записи." + +#: ../src/viktrwlayer_export.c:226 +#, c-format +msgid "Could not launch %s." +msgstr "Не удалось запустить %s." + +#: ../src/viktrwlayer_export.c:234 +msgid "Could not create temporary file for export." +msgstr "Не удалось создать временный файл для экспорта." + +#: ../src/viktrwlayer_export.c:268 +msgid "File format:" +msgstr "Формат файла:" + +#: ../src/viktrwlayer_export.c:276 +msgid "Select the file format." +msgstr "Выберите формат файла" + +#: ../src/viktrwlayer_export.c:281 +msgid "" +"Select the information to process.\n" +"Warning: the behavior of these switches is highly dependent of the file " +"format selected.\n" +"Please, refer to GPSbabel if unsure." +msgstr "" +"Выберите информацию чтобы продолжить.\n" +"Внимание! поведение этих переключателей сильно зависит от выбранного формата " +"файла.\n" +"Если не уверены, пожалуйста обратитесь к документации по GPSbabel." + +#: ../src/viktrwlayer_export.c:308 +msgid "You did not select a valid file format." +msgstr "Вы не выбрали корректный формат файл" + +#: ../src/viktrwlayer_propwin.c:915 ../src/viktrwlayer_propwin.c:3381 +#: ../src/viktrwlayer_propwin.c:3417 ../src/viktrwlayer_propwin.c:3457 +#: ../src/viktrwlayer_propwin.c:3509 ../src/viktrwlayer_propwin.c:3527 +#: ../src/viktrwlayer_propwin.c:3600 ../src/viktrwlayer_propwin.c:3601 +#: ../src/viktrwlayer_propwin.c:3602 ../src/viktrwlayer_propwin.c:3611 +#: ../src/viktrwlayer_propwin.c:3612 ../src/viktrwlayer_propwin.c:3629 +#: ../src/viktrwlayer_propwin.c:3630 ../src/viktrwlayer_propwin.c:3644 +#: ../src/viktrwlayer_propwin.c:3645 ../src/viktrwlayer_propwin.c:3646 +#: ../src/viktrwlayer_propwin.c:3660 ../src/viktrwlayer_propwin.c:3661 +#: ../src/viktrwlayer_propwin.c:3662 ../src/viktrwlayer_propwin.c:3676 +#: ../src/viktrwlayer_propwin.c:3677 ../src/viktrwlayer_propwin.c:3678 +#: ../src/viktrwlayer_propwin.c:3695 ../src/viktrwlayer_propwin.c:3696 +#: ../src/viktrwlayer_analysis.c:293 +#, c-format +msgid "No Data" +msgstr "Нет данных" + +#: ../src/viktrwlayer_propwin.c:960 ../src/viktrwlayer_propwin.c:1245 +#, c-format +msgid "%.1f kph" +msgstr "%.1f км/ч" + +#: ../src/viktrwlayer_propwin.c:963 ../src/viktrwlayer_propwin.c:1248 +#: ../src/viktrwlayer_analysis.c:352 +#, c-format +msgid "%.1f mph" +msgstr "%.1f миль/ч" + +#: ../src/viktrwlayer_propwin.c:966 ../src/viktrwlayer_propwin.c:1251 +#, c-format +msgid "%.1f knots" +msgstr "%.1f узлов" + +#: ../src/viktrwlayer_propwin.c:969 ../src/viktrwlayer_propwin.c:1254 +#, fuzzy, c-format +msgid "%.1f s/km" +msgstr "%.1f км" + +#: ../src/viktrwlayer_propwin.c:972 ../src/viktrwlayer_propwin.c:1257 +#: ../src/viktrwlayer_analysis.c:389 ../src/viktrwlayer_analysis.c:392 +#, fuzzy, c-format +msgid "%.1f min/km" +msgstr "%.1f км" + +#: ../src/viktrwlayer_propwin.c:975 ../src/viktrwlayer_propwin.c:1260 +#, fuzzy, c-format +msgid "%.1f sec/mi" +msgstr "%.1f миль" + +#: ../src/viktrwlayer_propwin.c:978 ../src/viktrwlayer_propwin.c:1263 +#: ../src/viktrwlayer_analysis.c:409 ../src/viktrwlayer_analysis.c:412 +#, fuzzy, c-format +msgid "%.1f min/mi" +msgstr "%.1f м/с" + +#. VIK_UNITS_SPEED_METRES_PER_SECOND: +#: ../src/viktrwlayer_propwin.c:982 ../src/viktrwlayer_propwin.c:1267 +#, c-format +msgid "%.1f m/s" +msgstr "%.1f м/с" + +#. Minutes +#: ../src/viktrwlayer_propwin.c:1411 +msgid "mins" +msgstr "мин." + +#. Hours +#: ../src/viktrwlayer_propwin.c:1418 +msgid "h" +msgstr "ч." + +#. Days +#: ../src/viktrwlayer_propwin.c:1424 +msgid "d" +msgstr "д." + +#. Weeks +#: ../src/viktrwlayer_propwin.c:1429 +msgid "w" +msgstr "нед." + +#. 'Months' +#: ../src/viktrwlayer_propwin.c:1433 +msgid "M" +msgstr "Мес." + +#: ../src/viktrwlayer_propwin.c:2051 ../src/viktrwlayer_analysis.c:303 +#, c-format +msgid "%.1f miles" +msgstr "%.1f миль" + +#: ../src/viktrwlayer_propwin.c:2054 ../src/viktrwlayer_analysis.c:306 +#, c-format +msgid "%.1f NM" +msgstr "" + +#. VIK_UNITS_DISTANCE_KILOMETRES +#: ../src/viktrwlayer_propwin.c:2057 ../src/viktrwlayer_analysis.c:310 +#, c-format +msgid "%.1f km" +msgstr "%.1f км" + +#: ../src/viktrwlayer_propwin.c:3083 +msgid "Failed spliting track. Track unchanged" +msgstr "Не удалось разделить трек. Трек не изменён." + +#: ../src/viktrwlayer_propwin.c:3234 ../src/viktrwlayer_propwin.c:3744 +#, c-format +msgid "%s - Track Properties" +msgstr "%s - свойства трека" + +#: ../src/viktrwlayer_propwin.c:3239 +msgid "Split at _Marker" +msgstr "Разделить по _Указателю" + +#: ../src/viktrwlayer_propwin.c:3240 +msgid "Split _Segments" +msgstr "Разделить се_гменты" + +#: ../src/viktrwlayer_propwin.c:3241 +msgid "_Reverse" +msgstr "О_братить" + +#: ../src/viktrwlayer_propwin.c:3242 +msgid "_Delete Dupl." +msgstr "У_далить дубли" + +#: ../src/viktrwlayer_propwin.c:3269 +msgid "Comment:" +msgstr "Комментарий:" + +#: ../src/viktrwlayer_propwin.c:3270 +msgid "Description:" +msgstr "Описание:" + +#: ../src/viktrwlayer_propwin.c:3271 +#, fuzzy +msgid "Source:" +msgstr "Направление:" + +#: ../src/viktrwlayer_propwin.c:3272 +#, fuzzy +msgid "Type:" +msgstr "Время:" + +#: ../src/viktrwlayer_propwin.c:3273 +msgid "Color:" +msgstr "Цвет:" + +#: ../src/viktrwlayer_propwin.c:3274 +msgid "Draw Name:" +msgstr "Писать имя:" + +#: ../src/viktrwlayer_propwin.c:3275 +msgid "Distance Labels:" +msgstr "Отметки расстояния:" + +#: ../src/viktrwlayer_propwin.c:3278 +msgid "Track Length:" +msgstr "Длина трека:" + +#: ../src/viktrwlayer_propwin.c:3279 +msgid "Trackpoints:" +msgstr "Узлов:" + +#: ../src/viktrwlayer_propwin.c:3280 +msgid "Segments:" +msgstr "Сегментов:" + +#: ../src/viktrwlayer_propwin.c:3281 +msgid "Duplicate Points:" +msgstr "Повторяющихся точек:" + +#: ../src/viktrwlayer_propwin.c:3282 +msgid "Max Speed:" +msgstr "Максимальная скорость:" + +#: ../src/viktrwlayer_propwin.c:3283 +msgid "Avg. Speed:" +msgstr "Средняя скорость:" + +#: ../src/viktrwlayer_propwin.c:3284 +msgid "Moving Avg. Speed:" +msgstr "Ср. скорость движения:" + +#: ../src/viktrwlayer_propwin.c:3285 +msgid "Avg. Dist. Between TPs:" +msgstr "Ср. расст. между узлами:" + +#: ../src/viktrwlayer_propwin.c:3286 +msgid "Elevation Range:" +msgstr "Вертикальный диапазон:" + +#: ../src/viktrwlayer_propwin.c:3287 +msgid "Total Elevation Gain/Loss:" +msgstr "Всего высоты набор/падение" + +#: ../src/viktrwlayer_propwin.c:3288 +msgid "Start:" +msgstr "Начало:" + +#: ../src/viktrwlayer_propwin.c:3289 +msgid "End:" +msgstr "Конец:" + +#: ../src/viktrwlayer_propwin.c:3290 +msgid "Duration:" +msgstr "Продолжительность:" + +#: ../src/viktrwlayer_propwin.c:3320 +msgid "Centre" +msgstr "Центр" + +#: ../src/viktrwlayer_propwin.c:3321 +msgid "Start only" +msgstr "Только начало" + +#: ../src/viktrwlayer_propwin.c:3322 +msgid "End only" +msgstr "Только конец" + +#: ../src/viktrwlayer_propwin.c:3323 +msgid "Start and End" +msgstr "Начало и конец" + +#: ../src/viktrwlayer_propwin.c:3324 +msgid "Centre, Start and End" +msgstr "Центр, начало и конец" + +#: ../src/viktrwlayer_propwin.c:3336 +msgid "Maximum number of distance labels to be shown" +msgstr "Максимальное количество отметок дистанции" + +#: ../src/viktrwlayer_propwin.c:3340 +msgid "Properties" +msgstr "Свойства" + +#: ../src/viktrwlayer_propwin.c:3584 +#, c-format +msgid "%d minutes - %d minutes moving" +msgstr "%d минут - %d минут в движении" + +#: ../src/viktrwlayer_propwin.c:3596 +#, c-format +msgid "%s total - %s in segments" +msgstr "%s всего - %s в сегментах" + +#: ../src/viktrwlayer_propwin.c:3607 ../src/viktrwlayer_analysis.c:622 +msgid "Statistics" +msgstr "Статистика" + +#: ../src/viktrwlayer_propwin.c:3613 ../src/viktrwlayer_propwin.c:3680 +msgid "Show D_EM" +msgstr "Показать D_EM" + +#: ../src/viktrwlayer_propwin.c:3615 ../src/viktrwlayer_propwin.c:3631 +#: ../src/viktrwlayer_propwin.c:3647 ../src/viktrwlayer_propwin.c:3697 +msgid "Show _GPS Speed" +msgstr "Показать _GPS скорость" + +#: ../src/viktrwlayer_propwin.c:3617 ../src/viktrwlayer_propwin.c:3633 +#: ../src/viktrwlayer_propwin.c:3665 ../src/viktrwlayer_propwin.c:3699 +msgid "Track Distance:" +msgstr "Длина трека:" + +#: ../src/viktrwlayer_propwin.c:3618 ../src/viktrwlayer_propwin.c:3684 +msgid "Track Height:" +msgstr "Высота трека:" + +#: ../src/viktrwlayer_propwin.c:3624 +msgid "Elevation-distance" +msgstr "Высота-расстояние" + +#: ../src/viktrwlayer_propwin.c:3634 +msgid "Track Gradient:" +msgstr "Уклон трека:" + +#: ../src/viktrwlayer_propwin.c:3639 +msgid "Gradient-distance" +msgstr "Уклон-дистанция" + +#: ../src/viktrwlayer_propwin.c:3649 ../src/viktrwlayer_propwin.c:3666 +#: ../src/viktrwlayer_propwin.c:3683 +msgid "Track Time:" +msgstr "Время трека:" + +#: ../src/viktrwlayer_propwin.c:3650 ../src/viktrwlayer_propwin.c:3700 +msgid "Track Speed:" +msgstr "Скорость трека:" + +#: ../src/viktrwlayer_propwin.c:3651 ../src/viktrwlayer_propwin.c:3667 +#: ../src/viktrwlayer_propwin.c:3685 +msgid "Time/Date:" +msgstr "Время/Дата:" + +#: ../src/viktrwlayer_propwin.c:3655 +msgid "Speed-time" +msgstr "Скорость-время" + +#: ../src/viktrwlayer_propwin.c:3663 ../src/viktrwlayer_propwin.c:3679 +msgid "Show S_peed" +msgstr "Показать _скорость" + +#: ../src/viktrwlayer_propwin.c:3671 +msgid "Distance-time" +msgstr "Расстояние-время" + +#: ../src/viktrwlayer_propwin.c:3690 +msgid "Elevation-time" +msgstr "Высота-время" + +#: ../src/viktrwlayer_propwin.c:3705 +msgid "Speed-distance" +msgstr "Скорость-расстояние" + +#: ../src/viktrwlayer_tpwin.c:190 ../src/viktrwlayer_wpwin.c:66 +msgid "Date/Time Edit" +msgstr "Редактировать Дату/Время" + +#: ../src/viktrwlayer_tpwin.c:242 +msgid "Name:" +msgstr "Имя:" + +#: ../src/viktrwlayer_tpwin.c:243 +msgid "Latitude:" +msgstr "Широта:" + +#: ../src/viktrwlayer_tpwin.c:244 +msgid "Longitude:" +msgstr "Долгота:" + +#: ../src/viktrwlayer_tpwin.c:245 +msgid "Altitude:" +msgstr "Высота:" + +#: ../src/viktrwlayer_tpwin.c:246 +msgid "Course:" +msgstr "Направление:" + +#: ../src/viktrwlayer_tpwin.c:247 +msgid "Timestamp:" +msgstr "Отметка времени:" + +#: ../src/viktrwlayer_tpwin.c:248 +msgid "Time:" +msgstr "Время:" + +#: ../src/viktrwlayer_tpwin.c:249 +msgid "Distance Difference:" +msgstr "Разница расстояния:" + +#: ../src/viktrwlayer_tpwin.c:250 +msgid "Time Difference:" +msgstr "Разность времени:" + +#: ../src/viktrwlayer_tpwin.c:251 +msgid "\"Speed\" Between:" +msgstr "\"Скорость\" между:" + +#: ../src/viktrwlayer_tpwin.c:252 +msgid "Speed:" +msgstr "Скорость:" + +#: ../src/viktrwlayer_tpwin.c:253 +msgid "VDOP:" +msgstr "VDOP:" + +#: ../src/viktrwlayer_tpwin.c:254 +msgid "HDOP:" +msgstr "HDOP:" + +#: ../src/viktrwlayer_tpwin.c:255 +msgid "PDOP:" +msgstr "PDOP:" + +#: ../src/viktrwlayer_tpwin.c:256 +msgid "SAT/FIX:" +msgstr "" + +#: ../src/viktrwlayer_tpwin.c:263 ../src/viktrwlayer_tpwin.c:408 +#: ../src/viktrwlayer_tpwin.c:622 +msgid "Trackpoint" +msgstr "Узел" + +#: ../src/viktrwlayer_tpwin.c:266 +msgid "_Insert After" +msgstr "Вставить после" + +#: ../src/viktrwlayer_tpwin.c:268 +msgid "Split Here" +msgstr "Разделить здесь" + +#: ../src/viktrwlayer_tracklist.c:262 ../src/viktrwlayer_waypointlist.c:306 +msgid "_Copy Data" +msgstr "_Копировать данные" + +#. +#. item = gtk_image_menu_item_new_with_mnemonic ( _("_Select") ); +#. gtk_image_menu_item_set_image ( (GtkImageMenuItem*)item, gtk_image_new_from_stock (GTK_STOCK_FIND, GTK_ICON_SIZE_MENU) ); +#. g_signal_connect_swapped ( G_OBJECT(item), "activate", G_CALLBACK(trw_layer_track_select), values ); +#. gtk_menu_shell_append (GTK_MENU_SHELL (menu), item); +#. gtk_widget_show ( item ); +#. +#. ATM view auto selects, so don't bother with separate select menu entry +#. +#. item = gtk_image_menu_item_new_with_mnemonic ( _("_Select") ); +#. gtk_image_menu_item_set_image ( (GtkImageMenuItem*)item, gtk_image_new_from_stock (GTK_STOCK_FIND, GTK_ICON_SIZE_MENU) ); +#. g_signal_connect_swapped ( G_OBJECT(item), "activate", G_CALLBACK(trw_layer_waypoint_select), values ); +#. gtk_menu_shell_append (GTK_MENU_SHELL (menu), item); +#. gtk_widget_show ( item ); +#. +#. AUTO SELECT NOT TRUE YET... +#. ATM view auto selects, so don't bother with separate select menu entry +#: ../src/viktrwlayer_tracklist.c:290 ../src/viktrwlayer_waypointlist.c:341 +#: ../src/vikwindow.c:4816 +msgid "_View" +msgstr "_Вид" + +#. Insert column for the layer name when viewing multi layers +#: ../src/viktrwlayer_tracklist.c:613 ../src/viktrwlayer_waypointlist.c:609 +msgid "Layer" +msgstr "Слой" + +#: ../src/viktrwlayer_tracklist.c:627 ../src/viktrwlayer_waypointlist.c:624 +msgid "Date" +msgstr "Дата" + +#: ../src/viktrwlayer_tracklist.c:631 ../src/viktrwlayer_waypointlist.c:628 +msgid "Visible" +msgstr "Видимый" + +#: ../src/viktrwlayer_tracklist.c:639 +msgid "" +"Distance\n" +"(miles)" +msgstr "" +"Расстояние\n" +"(миль)" + +#: ../src/viktrwlayer_tracklist.c:642 +#, fuzzy +msgid "" +"Distance\n" +"(NM)" +msgstr "" +"Расстояние\n" +"(км)" + +#: ../src/viktrwlayer_tracklist.c:645 +msgid "" +"Distance\n" +"(km)" +msgstr "" +"Расстояние\n" +"(км)" + +#: ../src/viktrwlayer_tracklist.c:651 +msgid "" +"Length\n" +"(minutes)" +msgstr "" +"Продолжительность\n" +"(в минутах)" + +#: ../src/viktrwlayer_tracklist.c:660 ../src/vikutils.c:93 +msgid "sec/mi" +msgstr "" + +#: ../src/viktrwlayer_tracklist.c:666 +#, c-format +msgid "" +"Av. Speed\n" +"(%s)" +msgstr "" +"Ср. скорость\n" +"(%s)" + +#. Apply own formatting of the data +#: ../src/viktrwlayer_tracklist.c:671 +#, c-format +msgid "" +"Max Speed\n" +"(%s)" +msgstr "" +"Макс. скорость\n" +"(%s)" + +#: ../src/viktrwlayer_tracklist.c:679 ../src/viktrwlayer_waypointlist.c:637 +msgid "" +"Max Height\n" +"(Feet)" +msgstr "" +"Макс. высота\n" +"(в футах)" + +#: ../src/viktrwlayer_tracklist.c:681 ../src/viktrwlayer_waypointlist.c:639 +msgid "" +"Max Height\n" +"(Metres)" +msgstr "" +"Макс. высота\n" +"(в метрах)" + +#: ../src/viktrwlayer_waypointlist.c:312 +msgid "Copy Data (with _positions)" +msgstr "Копировать данные (с _положением)" + +#: ../src/viktrwlayer_waypointlist.c:633 +msgid "Comment" +msgstr "Комментарий" + +#: ../src/viktrwlayer_waypointlist.c:643 +msgid "Symbol" +msgstr "Символ" + +#: ../src/viktrwlayer_wpwin.c:93 ../src/viktrwlayer_wpwin.c:302 +msgid "True" +msgstr "" + +# Свойства пункта +#: ../src/viktrwlayer_wpwin.c:122 +msgid "Waypoint Properties" +msgstr "Свойства пункта" + +#: ../src/viktrwlayer_wpwin.c:164 +msgid "Name:" +msgstr "Имя:" + +#: ../src/viktrwlayer_wpwin.c:181 +msgid "Altitude:" +msgstr "Высота:" + +#: ../src/viktrwlayer_wpwin.c:186 ../src/viktrwlayer_wpwin.c:188 +msgid "Comment:" +msgstr "Комментарий:" + +#: ../src/viktrwlayer_wpwin.c:202 +#, fuzzy +msgid "Source:" +msgstr "Источник загрузки:" + +#: ../src/viktrwlayer_wpwin.c:212 +msgid "Image:" +msgstr "Изображение:" + +#: ../src/viktrwlayer_wpwin.c:217 +msgid "Symbol:" +msgstr "Символ:" + +#: ../src/viktrwlayer_wpwin.c:226 +msgid "(none)" +msgstr "(нет)" + +#. Geotag Info [readonly] +#: ../src/viktrwlayer_wpwin.c:272 +msgid "Has Geotag" +msgstr "Содержит геотег" + +#: ../src/viktrwlayer_wpwin.c:279 +msgid "Consistent Position" +msgstr "Корректное положение" + +#. ATM the direction value box is always shown, even when there is no information. +#. It would be nice to be able to hide it until the 'Add' has been performed, +#. however I've not been able to achieve this. +#. Thus simply sensistizing it instead. +#: ../src/viktrwlayer_wpwin.c:292 +#, fuzzy +msgid "Image Direction:" +msgstr "Часовой пояс изображения" + +#: ../src/viktrwlayer_wpwin.c:300 +msgid "Magnetic" +msgstr "" + +#: ../src/viktrwlayer_wpwin.c:320 +msgid "Time:" +msgstr "Время:" + +#. TODO: other checks (isalpha or whatever ) +#: ../src/viktrwlayer_wpwin.c:386 +msgid "Please enter a name for the waypoint." +msgstr "Введите имя для путевой точки." + +#: ../src/viktrwlayer_geotag.c:320 ../src/viktrwlayer_geotag.c:460 +#, c-format +msgid "Failed updating EXIF on %s" +msgstr "Невозможно обновить EXIF в %s" + +#: ../src/viktrwlayer_geotag.c:562 +#, c-format +msgid "Geotagging %d Images..." +msgstr "Геотегирование %d изображений" + +#: ../src/viktrwlayer_geotag.c:630 +msgid "Geotag Images" +msgstr "Геотегировать изображения" + +#: ../src/viktrwlayer_geotag.c:640 +msgid "Images" +msgstr "Изображения" + +#: ../src/viktrwlayer_geotag.c:645 +msgid "Overwrite Existing Waypoints:" +msgstr "Заменить существующие путевые точки:" + +#: ../src/viktrwlayer_geotag.c:648 +msgid "Overwrite Existing GPS Information:" +msgstr "Заменить существующую информацию GPS:" + +#: ../src/viktrwlayer_geotag.c:650 +msgid "Keep File Modification Timestamp:" +msgstr "Сохранять оригинальное время модификации файла" + +#: ../src/viktrwlayer_geotag.c:684 +msgid "Create Waypoints:" +msgstr "Создать путевые точки:" + +#: ../src/viktrwlayer_geotag.c:693 +msgid "Write EXIF:" +msgstr "Записать EXIF:" + +#: ../src/viktrwlayer_geotag.c:705 +msgid "Automatic Image Direction:" +msgstr "" + +#: ../src/viktrwlayer_geotag.c:707 +msgid "Set image direction based on a heading derived from the track" +msgstr "" + +#: ../src/viktrwlayer_geotag.c:710 +msgid "Interpolate Between Track Segments:" +msgstr "Интерполировать между сегментами трека:" + +#: ../src/viktrwlayer_geotag.c:715 +msgid "Image Time Offset (Seconds):" +msgstr "Расхождение времени изображения и трека (в секундах)" + +#: ../src/viktrwlayer_geotag.c:718 +msgid "" +"The number of seconds to ADD to the photos time to make it match the GPS " +"data. Calculate this with (GPS - Photo). Can be negative or positive. Useful " +"to adjust times when a camera's timestamp was incorrect." +msgstr "" +"Количество секунд, которое будет ДОБАВЛЕНО к времени фотографии перед " +"привязкой к треку. Может быть как положительным, так и отрицательным. " +"Полезно использовать, если время в фотоаппарате не точное." + +#: ../src/viktrwlayer_geotag.c:721 +msgid "Image Timezone:" +msgstr "Часовой пояс изображения" + +#: ../src/viktrwlayer_geotag.c:724 +msgid "" +"The timezone that was used when the images were created. For example, if a " +"camera is set to AWST or +8:00 hours. Enter +8:00 here so that the correct " +"adjustment to the images' time can be made. GPS data is always in UTC." +msgstr "" +"Часовой пояс, в котором было сделано изображение. Например, если в камере " +"настроен AWST или +8:00 часов, введите здесь +8:00. Данные GPS всегда в UTC." + +#: ../src/viktrwlayer_geotag.c:728 +#, c-format +msgid "Using waypoint: %s" +msgstr "Используется точка: %s" + +#: ../src/viktrwlayer_geotag.c:742 +#, c-format +msgid "Using track: %s" +msgstr "Используется трек: %s" + +#: ../src/viktrwlayer_geotag.c:744 +#, c-format +msgid "Using all tracks in: %s" +msgstr "Используются все треки в: %s" + +#: ../src/viktrwlayer_analysis.c:214 +msgid "Number of Tracks" +msgstr "Количество треков" + +#: ../src/viktrwlayer_analysis.c:215 +msgid "Date Range" +msgstr "Диапазон дат" + +#: ../src/viktrwlayer_analysis.c:216 +msgid "Total Length" +msgstr "Общая длина" + +#: ../src/viktrwlayer_analysis.c:217 +msgid "Average Length" +msgstr "Средняя длина" + +#: ../src/viktrwlayer_analysis.c:218 +msgid "Eddington number" +msgstr "" + +#. No.4: Extended display only +#: ../src/viktrwlayer_analysis.c:219 +msgid "Max Speed" +msgstr "Макс. скорость" + +#: ../src/viktrwlayer_analysis.c:220 +msgid "Avg. Speed" +msgstr "Ср. скорость" + +#: ../src/viktrwlayer_analysis.c:221 +msgid "Minimum Altitude" +msgstr "Мин. высота" + +#: ../src/viktrwlayer_analysis.c:222 +msgid "Maximum Altitude" +msgstr "Макс. высота" + +#: ../src/viktrwlayer_analysis.c:223 +msgid "Total Elevation Gain/Loss" +msgstr "Всего высоты набор/сброс" + +#: ../src/viktrwlayer_analysis.c:224 +msgid "Avg. Elevation Gain/Loss" +msgstr "Ср. высоты набор/сброс" + +#: ../src/viktrwlayer_analysis.c:225 +msgid "Total Duration" +msgstr "Общая продолжительность" + +#: ../src/viktrwlayer_analysis.c:226 +msgid "Avg. Duration" +msgstr "Ср. продолжительность" + +#: ../src/viktrwlayer_analysis.c:317 +#, c-format +msgid "%.2f miles" +msgstr "%.2f миль" + +#: ../src/viktrwlayer_analysis.c:320 +#, fuzzy, c-format +msgid "%.2f NM" +msgstr "%.2f км" + +#. VIK_UNITS_DISTANCE_KILOMETRES +#: ../src/viktrwlayer_analysis.c:324 +#, c-format +msgid "%.2f km" +msgstr "%.2f км" + +#: ../src/viktrwlayer_analysis.c:361 +#, c-format +msgid "%.2f m/s" +msgstr "%.2f м/с" + +#: ../src/viktrwlayer_analysis.c:370 ../src/viktrwlayer_analysis.c:373 +#, c-format +msgid "%.2f knots" +msgstr "%.2f узлов" + +#: ../src/viktrwlayer_analysis.c:379 ../src/viktrwlayer_analysis.c:382 +#, c-format +msgid "%d s/km" +msgstr "" + +#: ../src/viktrwlayer_analysis.c:399 ../src/viktrwlayer_analysis.c:402 +#, c-format +msgid "%d sec/mi" +msgstr "" + +#: ../src/viktrwlayer_analysis.c:420 ../src/viktrwlayer_analysis.c:423 +#, c-format +msgid "%.2f km/h" +msgstr "%.2f км/ч" + +#: ../src/viktrwlayer_analysis.c:434 ../src/viktrwlayer_analysis.c:440 +#, c-format +msgid "%d feet" +msgstr "%d футов" + +#: ../src/viktrwlayer_analysis.c:445 ../src/viktrwlayer_analysis.c:447 +#, c-format +msgid "%d feet / %d feet" +msgstr "%d футов / %d футов" + +#: ../src/viktrwlayer_analysis.c:452 ../src/viktrwlayer_analysis.c:458 +#, c-format +msgid "%d m" +msgstr "%d м" + +#: ../src/viktrwlayer_analysis.c:463 ../src/viktrwlayer_analysis.c:465 +#, c-format +msgid "%d m / %d m" +msgstr "%d м / %d м" + +#: ../src/viktrwlayer_analysis.c:477 +#, c-format +msgid "%d:%02d:%02d days:hrs:mins" +msgstr "%d:%02d:%02d дней:час:мин" + +#: ../src/viktrwlayer_analysis.c:484 +#, c-format +msgid "%d:%02d hrs:mins" +msgstr "%d:%02d час:мин" + +#: ../src/viktrwlayer_analysis.c:658 +msgid "Include Invisible Items" +msgstr "Включая невидимые элементы" + +#: ../src/vikstatus.c:129 +msgid "Current number of background tasks. Click to see the background jobs." +msgstr "" +"Текущее количество фоновых задач. Щёлкните чтобы увидеть фоновые задачи." + +#: ../src/vikstatus.c:134 +msgid "Current zoom level. Click to select a new one." +msgstr "Текущий масштаб. Щёлкните чтобы поменять." + +#: ../src/vikstatus.c:141 +msgid "Left click to clear the message. Right click to copy the message." +msgstr "" +"Левый клик для удаления сообщения. Правый клик для копирования сообщения в " +"буфер обмена." + +#: ../src/vikutils.c:108 +msgid "GPSD" +msgstr "GPSD" + +#. GPS Preamble +#: ../src/vikutils.c:109 +msgid "Trkpt" +msgstr "Тчк" + +#: ../src/vikutils.c:160 +#, c-format +msgid "%sSpeed%s %.1f%s" +msgstr "%sСкорость%s %.1f%s" + +#. Go for 2dp as expect low values for vertical speeds +#: ../src/vikutils.c:214 +#, c-format +msgid "%sClimb%s %.2f%s" +msgstr "" + +#: ../src/vikutils.c:223 +#, c-format +msgid "%sAlt %dfeet" +msgstr "%sВыс %dф" + +#. VIK_UNITS_HEIGHT_METRES: +#: ../src/vikutils.c:227 +#, c-format +msgid "%sAlt %dm" +msgstr "%sВыс %dм" + +#: ../src/vikutils.c:235 +#, c-format +msgid "%sCourse %03d°" +msgstr "%sНаправление %03d°" + +#: ../src/vikutils.c:249 +msgid "yards" +msgstr "ярды" + +#. VIK_UNITS_DISTANCE_KILOMETRES: +#: ../src/vikutils.c:253 +msgid "m" +msgstr "м" + +#: ../src/vikutils.c:257 +#, c-format +msgid "%sDistance diff %d%s" +msgstr "%sРазность расстояний %d%s" + +#: ../src/vikutils.c:272 +#, c-format +msgid "%sTime %s" +msgstr "%sВремя %s" + +#: ../src/vikutils.c:281 +#, c-format +msgid "%sTime diff %lds" +msgstr "%sРазность времени %lds" + +#: ../src/vikutils.c:287 +#, c-format +msgid "%sNo. of Sats %d" +msgstr "%sКол-во спутников %d" + +#: ../src/vikutils.c:312 +#, c-format +msgid "%sTo End %.2f%s" +msgstr "%sДо конца %.2f%s" + +#: ../src/vikutils.c:339 +#, c-format +msgid "%sDistance along %.2f%s" +msgstr "%sРасстояние по %.2f%s" + +#: ../src/vikutils.c:359 +#, c-format +msgid "%sTrack: %s" +msgstr "%sТрек: %s" + +#: ../src/vikutils.c:396 +#, c-format +msgid "" +"There is a newer version of Viking available: %s\n" +"\n" +"Do you wish to go to Viking's website now?" +msgstr "" +"Доступна более новая версия Viking: %s\n" +"\n" +"Хотите перейти на веб-сайт Viking сейчас?" + +#: ../src/vikutils.c:526 +msgid "" +"This appears to be Viking's very first run.\n" +"\n" +"Do you wish to enable automatic internet features?\n" +"\n" +"Individual settings can be controlled in the Preferences." +msgstr "" +"Похоже, это самый первый запуск Viking.\n" +"\n" +"Хотите включить автоматические интернет-функции?\n" +"\n" +"Отдельные настройки можно изменить в меню «Предпочтения»." + +#: ../src/vikwaypoint.c:37 +msgid "Waypoint" +msgstr "Путевая точка" + +#: ../src/vikwebtool_datasource.c:352 +msgid "Search Term" +msgstr "Условие поиска" + +#. TODO get rid of this as this is unnecessary duplication... +#: ../src/vikwindow.c:258 +msgid "Pan" +msgstr "Рука" + +#: ../src/vikwindow.c:258 +msgid "Zoom" +msgstr "Масштаб" + +#: ../src/vikwindow.c:258 +msgid "Ruler" +msgstr "Линейка" + +#: ../src/vikwindow.c:258 +msgid "Select" +msgstr "Выделение" + +#: ../src/vikwindow.c:368 +msgid "This is Viking " +msgstr "" + +#: ../src/vikwindow.c:457 +msgid "Location lookup aborted" +msgstr "Поиск местоположения отменён" + +#: ../src/vikwindow.c:477 +#, c-format +msgid "Location found: %s" +msgstr "Местоположение найдено: %s" + +#: ../src/vikwindow.c:486 +msgid "Unable to determine location" +msgstr "Невозможно определить местоположение" + +#: ../src/vikwindow.c:495 +msgid "Determining location" +msgstr "Определение местоположения" + +#: ../src/vikwindow.c:525 +#, fuzzy, c-format +msgid "Location found via geoclue" +msgstr "Местоположение найдено: %s" + +#: ../src/vikwindow.c:546 +msgid "Default Map" +msgstr "Карта по-умолчанию" + +#: ../src/vikwindow.c:557 ../src/vikwindow.c:3938 +msgid "Trying to determine location..." +msgstr "Попытка определить местоположение..." + +#. Create tooltip +#: ../src/vikwindow.c:723 +msgid "Select zoom level" +msgstr "Выбрать масштаб" + +#: ../src/vikwindow.c:1176 +#, c-format +msgid "" +"Do you want to save the changes you made to the document \"%s\"?\n" +"\n" +"Your changes will be lost if you don't save them." +msgstr "" +"Вы хотите сохранить изменения, сделанные в документе \"%s\"?\n" +"\n" +"Если вы не сохраните изменения, они будут потеряны." + +#: ../src/vikwindow.c:1180 +msgid "Don't Save" +msgstr "Не сохранять" + +#: ../src/vikwindow.c:1268 +msgid "mpp" +msgstr "" + +#: ../src/vikwindow.c:1268 +msgid "pixelfact" +msgstr "" + +#: ../src/vikwindow.c:1467 +#, c-format +msgid "%s %s %dm" +msgstr "%s %s %dм" + +#: ../src/vikwindow.c:1469 +#, c-format +msgid "%s %s %dft" +msgstr "%s %s %dф" + +#: ../src/vikwindow.c:1472 +#, c-format +msgid "%s %s" +msgstr "%s %s" + +#: ../src/vikwindow.c:1929 +msgid "_Ruler" +msgstr "Линейка" + +#: ../src/vikwindow.c:1929 +msgid "Ruler Tool" +msgstr "Инструмент линейка" + +#: ../src/vikwindow.c:2204 ../src/vikwindow.c:4818 +msgid "_Zoom" +msgstr "Масштаб" + +#: ../src/vikwindow.c:2204 +msgid "Zoom Tool" +msgstr "Инструмент масштабирования" + +#: ../src/vikwindow.c:2271 ../src/vikwindow.c:4819 +msgid "_Pan" +msgstr "Рука" + +#: ../src/vikwindow.c:2271 +msgid "Pan Tool" +msgstr "Инструмент рука" + +#: ../src/vikwindow.c:2425 +msgid "_Select" +msgstr "_Выделение" + +#: ../src/vikwindow.c:2425 +msgid "Select Tool" +msgstr "Инструмент выделения" + +#: ../src/vikwindow.c:2615 +msgid "You must select a layer to show its properties." +msgstr "Для просмотра свойств нужно выбрать слой." + +#. No error to show, so unlikely this will get called +#: ../src/vikwindow.c:2629 +msgid "The help system is not available." +msgstr "Справочная система недоступна." + +#. Main error path +#: ../src/vikwindow.c:2632 +#, c-format +msgid "" +"Help is not available because: %s.\n" +"Ensure a Mime Type ghelp handler program is installed (e.g. yelp)." +msgstr "" +"Справка недоступна, так как: %s.\n" +"Убедитесь, что установлена программа-обработчик Mime-типа ghelp (например, " +"yelp)." + +#: ../src/vikwindow.c:2865 +msgid "You must select a layer to delete." +msgstr "Для удаления нужно выбрать слой." + +#: ../src/vikwindow.c:3171 +msgid "Untitled" +msgstr "Безымянный" + +#: ../src/vikwindow.c:3300 +#, c-format +msgid "Unable to add '%s' to the list of recently used documents" +msgstr "Не удалось добавить '%s' к списку недавно использованных документов" + +#: ../src/vikwindow.c:3391 +msgid "The file you requested could not be opened." +msgstr "Выбранный файл невозможно открыть." + +#: ../src/vikwindow.c:3394 +msgid "" +"GPSBabel is required to load files of this type or GPSBabel encountered " +"problems." +msgstr "" + +#: ../src/vikwindow.c:3397 +#, c-format +msgid "Unable to load malformed GPX file %s" +msgstr "Невозможно загрузить повреждённый GPX файл %s" + +#: ../src/vikwindow.c:3400 +#, c-format +msgid "Unsupported file type for %s" +msgstr "Не поддерживаемый тип файла для %s" + +#. Since we can process .vik files with issues just show a warning in the status bar +#. Not that a user can do much about it... or tells them what this issue is yet... +#: ../src/vikwindow.c:3406 +#, c-format +msgid "WARNING: issues encountered loading %s" +msgstr "ВНИМАНИЕ: обнаружены проблемы при загрузке %s" + +#: ../src/vikwindow.c:3489 +msgid "Please select a GPS data file to open. " +msgstr "Пожалуйста, выберите файл с данными GPS. " + +#: ../src/vikwindow.c:3508 +msgid "Google Earth" +msgstr "Google Earth" + +#: ../src/vikwindow.c:3523 ../src/vikwindow.c:3646 ../src/viking.desktop.in.h:1 +msgid "Viking" +msgstr "Viking" + +#: ../src/vikwindow.c:3594 ../src/vikwindow.c:4632 +msgid "Open File" +msgstr "Открыть файл" + +#: ../src/vikwindow.c:3630 +msgid "Save as Viking File." +msgstr "Сохранить файл Viking." + +#: ../src/vikwindow.c:3757 +#, c-format +msgid "Exporting to file: %s" +msgstr "Экпорт в файл: %s" + +#. Confirm what happened. +#: ../src/vikwindow.c:3774 +#, c-format +msgid "Exported files: %d" +msgstr "Экспортированы файлы: %d" + +#: ../src/vikwindow.c:3786 +msgid "Nothing to Export!" +msgstr "Экспортировать нечего!" + +#: ../src/vikwindow.c:3790 +msgid "Export to directory" +msgstr "Экспортировать в каталог" + +#: ../src/vikwindow.c:3809 +msgid "Could not convert all files" +msgstr "Не удалось преобразовать все файлы" + +#: ../src/vikwindow.c:3851 +msgid "File not accessible" +msgstr "Файл недоступен" + +#: ../src/vikwindow.c:3854 +msgid "No Viking File" +msgstr "Нет файла Viking" + +#: ../src/vikwindow.c:3998 +msgid "This layer has no configurable properties." +msgstr "У этого слоя нет настраиваемых свойств." + +#: ../src/vikwindow.c:4080 +msgid "Are you sure you wish to delete all layers?" +msgstr "Вы уверены что хотите удалить все слои?" + +#. Try harder... +#: ../src/vikwindow.c:4126 ../src/vikwindow.c:4132 +msgid "Generating image file..." +msgstr "Создание файла изображения..." + +#: ../src/vikwindow.c:4154 +msgid "" +"Failed to generate internal image.\n" +"\n" +"Try creating a smaller image." +msgstr "" +"Не удалось сгенерировать внутреннее изображение.\n" +"\n" +"Попробуйте создать изображение поменьше." + +#: ../src/vikwindow.c:4175 +msgid "Image file generated." +msgstr "Файл изображения создан." + +#: ../src/vikwindow.c:4177 +msgid "Failed to generate image file." +msgstr "Не удалось сгенерировать файл изображения." + +#: ../src/vikwindow.c:4246 +#, c-format +msgid "Unable to write to file %s: %s" +msgstr "Невозможно записать в файл %s: %s" + +#: ../src/vikwindow.c:4284 +msgid "" +"Viewable region outside allowable pixel size bounds for image. Clipping " +"width/height values." +msgstr "" +"Видимая область за пределами разрешённого размера рамки изображения. " +"Уменьшение значений ширины/высоты." + +#: ../src/vikwindow.c:4309 +#, c-format +msgid "Total area: %ldm x %ldm (%.3f sq. km)" +msgstr "Общая площадь: %ldм x %ldм (%.3f кв. км)" + +#: ../src/vikwindow.c:4312 +#, c-format +msgid "Total area: %ldm x %ldm (%.3f sq. miles)" +msgstr "Общая площадь: %ldм x %ldм (%.3f кв. миль)" + +#: ../src/vikwindow.c:4315 +#, c-format +msgid "Total area: %ldm x %ldm (%.3f sq. NM)" +msgstr "Общая площадь: %ldм x %ldм (%.3f sq. NM)" + +#. Single file +#: ../src/vikwindow.c:4343 +msgid "Save Image" +msgstr "Сохранить изображение" + +#: ../src/vikwindow.c:4364 ../src/vikwindow.c:4641 +msgid "KMZ" +msgstr "KMZ" + +#: ../src/vikwindow.c:4417 +msgid "You must be in UTM mode to use this feature" +msgstr "Нужно перейти в режим UTM для использования этой возможности" + +#: ../src/vikwindow.c:4421 +msgid "Choose a directory to hold images" +msgstr "Выберите каталог для изображений" + +#. todo: default for answers inside VikWindow or static (thruout instance) +#: ../src/vikwindow.c:4441 +msgid "Save to Image File" +msgstr "Сохранить как изображение" + +#: ../src/vikwindow.c:4457 +msgid "Width (pixels):" +msgstr "Ширина (в пикселах)" + +#: ../src/vikwindow.c:4459 +msgid "Height (pixels):" +msgstr "Высота (в пикселах)" + +#: ../src/vikwindow.c:4462 +msgid "" +"WARNING: USING LARGE IMAGES OVER 10000x10000\n" +"MAY CRASH THE PROGRAM!" +msgstr "" +"ВНИМАНИЕ: БОЛЬШИЕ ИЗОБРАЖЕНИЯ (БОЛЬШЕ 10000x10000)\n" +"МОГУТ ПРИВЕСТИ К СБОЮ ПРОГРАММЫ!" + +#: ../src/vikwindow.c:4464 +msgid "Zoom (meters per pixel):" +msgstr "Масштаб (метров на пиксел):" + +#: ../src/vikwindow.c:4480 +msgid "Area in current viewable window" +msgstr "Область в текущем видимом окне" + +#: ../src/vikwindow.c:4490 +msgid "Save as PNG" +msgstr "Сохранить в PNG" + +#: ../src/vikwindow.c:4491 +msgid "Save as JPEG" +msgstr "Сохранить в JPEG" + +#: ../src/vikwindow.c:4520 +msgid "East-west image tiles:" +msgstr "Квадраты изображения восток-запад:" + +#: ../src/vikwindow.c:4522 +msgid "North-south image tiles:" +msgstr "Квадраты изображения север-юг:" + +#: ../src/vikwindow.c:4619 +msgid "This feature is not available in UTM mode" +msgstr "Эта опция недоступна в режиме UTC" + +#: ../src/vikwindow.c:4658 +#, c-format +msgid "Unable to import %s." +msgstr "Невозможно импортировать %s." + +#: ../src/vikwindow.c:4749 +msgid "Choose a background color" +msgstr "Выберите цвет фона" + +#: ../src/vikwindow.c:4765 +msgid "Choose a track highlight color" +msgstr "Выберите цвет выделенного трека" + +#: ../src/vikwindow.c:4814 +msgid "_File" +msgstr "Файл" + +#: ../src/vikwindow.c:4815 +msgid "_Edit" +msgstr "Правка" + +#: ../src/vikwindow.c:4817 +msgid "_Show" +msgstr "Показать" + +#: ../src/vikwindow.c:4820 +msgid "_Layers" +msgstr "Слои" + +#: ../src/vikwindow.c:4821 +msgid "_Tools" +msgstr "Инструменты" + +#: ../src/vikwindow.c:4822 +msgid "_Webtools" +msgstr "_Веб-инструменты" + +#: ../src/vikwindow.c:4823 ../src/vikwindow.c:4893 +msgid "_Help" +msgstr "Помощь" + +#: ../src/vikwindow.c:4825 +msgid "New file" +msgstr "Новый файл" + +#: ../src/vikwindow.c:4826 +msgid "_Open..." +msgstr "Открыть..." + +#: ../src/vikwindow.c:4826 +msgid "Open a file" +msgstr "Открыть файл" + +#: ../src/vikwindow.c:4827 +msgid "Open _Recent File" +msgstr "Открыть недавний файл" + +#: ../src/vikwindow.c:4828 +msgid "Append _File..." +msgstr "Добавить файл" + +#: ../src/vikwindow.c:4828 +msgid "Append data from a different file" +msgstr "Добавить данные из другого файла" + +#: ../src/vikwindow.c:4829 +msgid "Open GPX as External _Layer..." +msgstr "" + +#: ../src/vikwindow.c:4829 +msgid "Open a GPX file as an external layer" +msgstr "" + +#: ../src/vikwindow.c:4830 +msgid "_Export All" +msgstr "Экспортировать _все" + +#: ../src/vikwindow.c:4830 +msgid "Export All TrackWaypoint Layers" +msgstr "Экспортировать все слои TrackWaypoint" + +#: ../src/vikwindow.c:4831 +msgid "_GPX..." +msgstr "_GPX..." + +#: ../src/vikwindow.c:4831 +msgid "Export as GPX" +msgstr "Экспортировать в GPX" + +#: ../src/vikwindow.c:4832 +msgid "A_cquire" +msgstr "Получить" + +#: ../src/vikwindow.c:4833 +msgid "_Directions..." +msgstr "_Направления..." + +#: ../src/vikwindow.c:4833 +msgid "Get driving directions" +msgstr "Взять направления движения" + +#: ../src/vikwindow.c:4835 +msgid "_OSM Traces..." +msgstr "Треки _OSM..." + +#: ../src/vikwindow.c:4835 +msgid "Get traces from OpenStreetMap" +msgstr "Получить треки с OpenStreetMap" + +#: ../src/vikwindow.c:4836 +msgid "_My OSM Traces..." +msgstr "_Мои треки OSM..." + +#: ../src/vikwindow.c:4836 +msgid "Get Your Own Traces from OpenStreetMap" +msgstr "Получить ваши собственные треки с OpenStreetMap" + +#: ../src/vikwindow.c:4839 +msgid "Geo_caches..." +msgstr "Геотайники..." + +#: ../src/vikwindow.c:4839 +msgid "Get Geocaches from geocaching.com" +msgstr "Получить тайники с geocaching.com" + +#: ../src/vikwindow.c:4842 +msgid "Create waypoints from geotagged images" +msgstr "Создать путевые точки из изображений с геотегами" + +#: ../src/vikwindow.c:4844 +msgid "Get a file from a URL" +msgstr "" + +#: ../src/vikwindow.c:4846 +msgid "Create waypoints from Wikipedia items in the current view" +msgstr "Создать путевые точки по видимым в окне объектам Википедии" + +#: ../src/vikwindow.c:4848 +msgid "_Save" +msgstr "Сохранить" + +#: ../src/vikwindow.c:4848 +msgid "Save the file" +msgstr "Сохранить файл" + +#: ../src/vikwindow.c:4849 +msgid "Save _As..." +msgstr "Сохранить как..." + +#: ../src/vikwindow.c:4849 +msgid "Save the file under different name" +msgstr "Сохранить файл под другим именем" + +#: ../src/vikwindow.c:4850 +msgid "Properties..." +msgstr "Свойства..." + +#: ../src/vikwindow.c:4850 +msgid "File Properties" +msgstr "Свойства файла" + +#: ../src/vikwindow.c:4852 +msgid "Import KMZ _Map File..." +msgstr "" + +#: ../src/vikwindow.c:4852 +msgid "Import a KMZ file" +msgstr "Импортировать KMZ файл" + +#: ../src/vikwindow.c:4853 +msgid "Generate _KMZ Map File..." +msgstr "" + +#: ../src/vikwindow.c:4853 +msgid "Generate a KMZ file with an overlay of the current view" +msgstr "" + +#: ../src/vikwindow.c:4855 +msgid "_Generate Image File..." +msgstr "Создать файл изображения..." + +#: ../src/vikwindow.c:4855 +msgid "Save a snapshot of the workspace into a file" +msgstr "Сохранить снимок рабочей области в файл" + +#: ../src/vikwindow.c:4856 +msgid "Generate _Directory of Images..." +msgstr "Создать каталог с картинками..." + +#: ../src/vikwindow.c:4856 +msgid "Generate _Directory of Images" +msgstr "Сгенерировать _каталог с изображениями" + +#: ../src/vikwindow.c:4857 +msgid "_Print..." +msgstr "Печать" + +#: ../src/vikwindow.c:4857 +msgid "Print maps" +msgstr "Печать карт" + +#: ../src/vikwindow.c:4858 +msgid "E_xit" +msgstr "Выйти" + +#: ../src/vikwindow.c:4858 +msgid "Exit the program" +msgstr "Выйти из программы" + +#: ../src/vikwindow.c:4859 +msgid "Save and Exit" +msgstr "Сохранить и выйти" + +#: ../src/vikwindow.c:4859 +msgid "Save and Exit the program" +msgstr "Сохранить и выйти из программы" + +#: ../src/vikwindow.c:4861 +msgid "Go to the Pre_vious Location" +msgstr "К предыдущему местоположени_ю" + +#: ../src/vikwindow.c:4861 +msgid "Go to the previous location" +msgstr "К предыдущему местоположению" + +#: ../src/vikwindow.c:4862 +msgid "Go to the _Next Location" +msgstr "К сл_едующему местоположению" + +#: ../src/vikwindow.c:4862 +msgid "Go to the next location" +msgstr "К следующему местоположению" + +#: ../src/vikwindow.c:4863 +msgid "Go to the _Default Location" +msgstr "Перейти к исходному пункту" + +#: ../src/vikwindow.c:4863 +msgid "Go to the default location" +msgstr "Перейти к исходному пункту" + +#: ../src/vikwindow.c:4864 +#, fuzzy +msgid "Go to the _Auto Location" +msgstr "К сл_едующему местоположению" + +#: ../src/vikwindow.c:4864 +msgid "Go to a location via automatic lookup" +msgstr "" + +#: ../src/vikwindow.c:4865 +msgid "Go to _Location..." +msgstr "Перейти к Расположению..." + +#: ../src/vikwindow.c:4865 +msgid "Go to address/place using text search" +msgstr "Перейти к адресу/месту, используя поиск" + +#: ../src/vikwindow.c:4866 +msgid "_Go to Lat/Lon..." +msgstr "_Перейти к широте/долготе..." + +#: ../src/vikwindow.c:4866 +msgid "Go to arbitrary lat/lon coordinate" +msgstr "Перейти к заданной координате ш.,д." + +#: ../src/vikwindow.c:4867 +msgid "Go to UTM..." +msgstr "Перейти к UTM..." + +#: ../src/vikwindow.c:4867 +msgid "Go to arbitrary UTM coordinate" +msgstr "Перейти к заданной координате UTM" + +#: ../src/vikwindow.c:4868 +#, fuzzy +msgid "Go to Today" +msgstr "Перейти к UTM" + +#: ../src/vikwindow.c:4868 +msgid "Go to today on the calendar" +msgstr "" + +#: ../src/vikwindow.c:4869 +msgid "_Refresh" +msgstr "_Обновить" + +#: ../src/vikwindow.c:4869 +msgid "Refresh any maps displayed" +msgstr "Обновить все отображаемые карты" + +#: ../src/vikwindow.c:4870 +msgid "Set _Highlight Color..." +msgstr "Выбрать цвет _выделения..." + +#: ../src/vikwindow.c:4870 +msgid "Set Highlight Color" +msgstr "Установить цвет подсветки" + +#: ../src/vikwindow.c:4871 +msgid "Set Bac_kground Color..." +msgstr "Выбрать цвет _фона..." + +#: ../src/vikwindow.c:4871 +msgid "Set Background Color" +msgstr "Установить цвет фона" + +#: ../src/vikwindow.c:4872 +msgid "Zoom _In" +msgstr "Приблизить" + +#: ../src/vikwindow.c:4872 +msgid "Zoom In" +msgstr "Увеличить" + +#: ../src/vikwindow.c:4873 +msgid "Zoom _Out" +msgstr "Отдалить" + +#: ../src/vikwindow.c:4873 +msgid "Zoom Out" +msgstr "Уменьшить" + +#: ../src/vikwindow.c:4874 +msgid "Zoom _To..." +msgstr "Масштабировать _к..." + +#: ../src/vikwindow.c:4874 +msgid "Zoom To" +msgstr "Масштабировать" + +#: ../src/vikwindow.c:4875 +msgid "Pan _North" +msgstr "Сдвинуть к северу" + +#: ../src/vikwindow.c:4876 +msgid "Pan _East" +msgstr "Сдвинуть к востоку" + +#: ../src/vikwindow.c:4877 +msgid "Pan _South" +msgstr "Сдвинуть к югу" + +#: ../src/vikwindow.c:4878 +msgid "Pan _West" +msgstr "Сдвинуть к западу" + +#: ../src/vikwindow.c:4879 +msgid "Background _Jobs" +msgstr "Фоновые задачи" + +#: ../src/vikwindow.c:4879 +msgid "Background Jobs" +msgstr "Фоновые задачи" + +#: ../src/vikwindow.c:4881 +msgid "Cu_t" +msgstr "Вырезать" + +#: ../src/vikwindow.c:4885 +msgid "Delete All" +msgstr "Удалить все" + +#: ../src/vikwindow.c:4886 +msgid "Copy Centre _Location" +msgstr "Копировать центр _местоположения" + +#: ../src/vikwindow.c:4887 +msgid "_Flush Map Cache" +msgstr "Опустошить кэш карт" + +#: ../src/vikwindow.c:4888 +msgid "_Set the Default Location" +msgstr "Задать расположение по умолчанию" + +#: ../src/vikwindow.c:4888 +msgid "Set the Default Location to the current position" +msgstr "Сохранить текущее расположение, как расположение по умолчанию" + +#: ../src/vikwindow.c:4889 +msgid "_Preferences" +msgstr "Предпочтения" + +#: ../src/vikwindow.c:4889 +msgid "Program Preferences" +msgstr "Настройки программы" + +#: ../src/vikwindow.c:4890 +msgid "_Layer Defaults" +msgstr "П_араметры слоёв по умолчанию" + +#: ../src/vikwindow.c:4891 +msgid "_Properties" +msgstr "Свойства" + +#: ../src/vikwindow.c:4893 +msgid "Help" +msgstr "Справка" + +#: ../src/vikwindow.c:4894 +msgid "_About" +msgstr "О программе" + +#: ../src/vikwindow.c:4894 +msgid "About" +msgstr "О приложении" + +#: ../src/vikwindow.c:4903 +msgid "_KML..." +msgstr "_KML..." + +#: ../src/vikwindow.c:4903 +msgid "Export as KML" +msgstr "Экспортировать в KML" + +#: ../src/vikwindow.c:4904 +msgid "Transfer data from a GPS device" +msgstr "Передать данные из устройства GPS" + +#: ../src/vikwindow.c:4905 +msgid "Import file via GPSBabel converter" +msgstr "Импортировать файл через конвертер GPSBabel" + +#: ../src/vikwindow.c:4909 +msgid "Import Geo_JSON File..." +msgstr "Импортировать файл Geo_JSON" + +#: ../src/vikwindow.c:4909 +msgid "Import GeoJSON file" +msgstr "Импортировать файл GeoJSON" + +#: ../src/vikwindow.c:4914 +msgid "_UTM Mode" +msgstr "Режим _UTM" + +#: ../src/vikwindow.c:4915 +msgid "_Expedia Mode" +msgstr "Режим _Expedia" + +#: ../src/vikwindow.c:4916 +msgid "_Mercator Mode" +msgstr "Режим _Mercator" + +#: ../src/vikwindow.c:4917 +msgid "Lat_/Lon Mode" +msgstr "Режим широта/долгота" + +#: ../src/vikwindow.c:4921 +msgid "Show _Scale" +msgstr "Показать масштаб" + +#: ../src/vikwindow.c:4921 +msgid "Show Scale" +msgstr "Паказать масштаб" + +#: ../src/vikwindow.c:4922 +msgid "Show _Center Mark" +msgstr "Показать отметку центра" + +#: ../src/vikwindow.c:4922 +msgid "Show Center Mark" +msgstr "Показать отметку центра" + +#: ../src/vikwindow.c:4923 +msgid "Show _Highlight" +msgstr "Показать _выделение" + +#: ../src/vikwindow.c:4923 +msgid "Show Highlight" +msgstr "Показать выделение" + +#: ../src/vikwindow.c:4924 +msgid "_Full Screen" +msgstr "На весь экран" + +#: ../src/vikwindow.c:4924 +msgid "Activate full screen mode" +msgstr "Включить полноэкранный режим" + +#: ../src/vikwindow.c:4925 +msgid "Show Side _Panel" +msgstr "Показать боковую панель" + +#: ../src/vikwindow.c:4925 +msgid "Show Side Panel" +msgstr "Показать боковую панель" + +#: ../src/vikwindow.c:4926 +msgid "Show Status_bar" +msgstr "Показать строку состояния" + +#: ../src/vikwindow.c:4926 +msgid "Show Statusbar" +msgstr "Показать строку состояния" + +#: ../src/vikwindow.c:4927 +msgid "Show _Toolbar" +msgstr "Показать панель инструментов" + +#: ../src/vikwindow.c:4927 +msgid "Show Toolbar" +msgstr "Показать панель инструментов" + +#: ../src/vikwindow.c:4928 +msgid "Show _Menu" +msgstr "Показать меню" + +#: ../src/vikwindow.c:4928 +msgid "Show Menu" +msgstr "Показать меню" + +#: ../src/vikwindow.c:4929 +#, fuzzy +msgid "Show Side Panel B_uttons" +msgstr "Показать боковую панель" + +#: ../src/vikwindow.c:4929 +#, fuzzy +msgid "Show Side Panel Buttons" +msgstr "Показать боковую панель" + +#: ../src/vikwindow.c:4930 +#, fuzzy +msgid "Show Side Panel Ca_lendar" +msgstr "Показать боковую панель" + +#: ../src/vikwindow.c:4930 +#, fuzzy +msgid "Show Side Panel Calendar" +msgstr "Показать боковую панель" + +#: ../src/vikwindow.c:5064 +#, c-format +msgid "New _%s Layer" +msgstr "Новый слой _%s" + +#: ../src/vikwindow.c:5114 +#, fuzzy +msgid "..." +msgstr "Добавить..." + +#: ../src/viking.desktop.in.h:2 +msgid "GPS Data Manager" +msgstr "Менеджер данных GPS" + +#: ../src/viking.desktop.in.h:3 +msgid "Map Based GPS Data Manager (live data capable)." +msgstr "" + +#: ../src/libjpeg/jpeg-data.c:205 +msgid "Data does not follow JPEG specification." +msgstr "Данные не соответствуют спецификации JPEG." + +#: ../src/libjpeg/jpeg-data.c:302 +#, c-format +msgid "Path '%s' invalid." +msgstr "Неверный путь '%s'." + +#: ../src/libjpeg/jpeg-data.c:320 +#, c-format +msgid "Could not read '%s'." +msgstr "Не удалось прочитать '%s'." + +#~ msgid "en" +#~ msgstr "ru" + +#~ msgid "Email:" +#~ msgstr "Email:" + +#~ msgid "I don't know that place. Do you want another goto?" +#~ msgstr "Я не знаю такого места. Хотите выполнить новый поиск?" + +#~ msgid "Error: couldn't find gpsbabel." +#~ msgstr "Ошибка: gpsbabel не найден." + +#~ msgid "Create _Track" +#~ msgstr "Создать _трек" + +#~ msgid "Create Track" +#~ msgstr "Создать трек" + +#~ msgid "Create _Route" +#~ msgstr "Создать _маршрут" + +#~ msgid "Create Route" +#~ msgstr "Создать маршрут" + +#~ msgid "%.2f knots\n" +#~ msgstr "%.2f узлов\n" diff --git a/po/sk.po b/po/sk.po new file mode 100644 index 0000000..db04242 --- /dev/null +++ b/po/sk.po @@ -0,0 +1,6084 @@ +# Slovak translation for viking +# Copyright (c) 2013 Rosetta Contributors and Canonical Ltd 2013 +# This file is distributed under the same license as the viking package. +# FIRST AUTHOR , 2013. +# +msgid "" +msgstr "" +"Project-Id-Version: viking\n" +"Report-Msgid-Bugs-To: \n" +"POT-Creation-Date: 2019-01-19 12:53+0000\n" +"PO-Revision-Date: 2014-02-20 23:23+0000\n" +"Last-Translator: Ján Neščivera \n" +"Language-Team: Slovak \n" +"Language: sk\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" +"X-Launchpad-Export-Date: 2018-12-21 17:32+0000\n" +"X-Generator: Launchpad (build 18847)\n" + +#: ../src/acquire.c:106 ../src/vikgpslayer.c:1367 +msgid "Done." +msgstr "Hotovo." + +#: ../src/acquire.c:115 +msgid "No data." +msgstr "Žiadne dáta" + +#: ../src/acquire.c:167 ../src/acquire.c:415 +msgid "Error: acquisition failed." +msgstr "Chyba: získavavanie zlyhalo" + +#: ../src/acquire.c:339 +msgid "Working..." +msgstr "Pracuje sa...." + +#. This shouldn't happen... +#: ../src/acquire.c:406 +msgid "" +"Unable to create command\n" +"Acquire method failed." +msgstr "" + +#: ../src/acquire.c:513 +msgid "_Filter" +msgstr "_Filter" + +#: ../src/acquire.c:528 +#, c-format +msgid "Filter with %s" +msgstr "" + +#: ../src/acquire.c:545 +msgid "Filter" +msgstr "Filter" + +#: ../src/babel.c:640 +msgid "GPSBabel:" +msgstr "" + +#: ../src/babel.c:641 +msgid "" +"Allow setting the specific instance of GPSBabel. You must restart Viking for " +"this value to take effect." +msgstr "" + +#: ../src/babel_ui.c:79 +msgid "Select a file format" +msgstr "" + +#: ../src/babel_ui.c:144 ../src/viktrwlayer.c:531 ../src/viktrwlayer.c:2882 +msgid "Tracks" +msgstr "" + +#: ../src/babel_ui.c:149 ../src/viktrwlayer.c:2892 +msgid "Routes" +msgstr "" + +#. ***** PARAMETERS ***** +#: ../src/babel_ui.c:154 ../src/viktrwlayer.c:531 ../src/viktrwlayer.c:2887 +msgid "Waypoints" +msgstr "" + +#: ../src/background.c:64 +#, c-format +msgid "%d items" +msgstr "%d položiek" + +#: ../src/background.c:287 +msgid "Threads:" +msgstr "" + +#: ../src/background.c:288 +msgid "" +"Number of threads to use for Mapnik tasks. You need to restart Viking for a " +"change to this value to be used" +msgstr "" + +#: ../src/background.c:361 +msgid "Job" +msgstr "Úloha" + +#: ../src/background.c:365 +msgid "Progress" +msgstr "Priebeh" + +#: ../src/background.c:373 +msgid "Viking Background Jobs" +msgstr "Viking úlohy na pozadi" + +#: ../src/bing.c:42 +msgid "Bing Aerial" +msgstr "" + +#: ../src/bing.c:48 +msgid "Bing" +msgstr "Bing" + +#. VIK_GTK_WINDOW_FROM_WIDGET(vp) +#: ../src/bingmapsource.c:514 +msgid "Bing attribution Loading" +msgstr "" + +#: ../src/clipboard.c:95 +msgid "paste failed" +msgstr "vloženie zlyhalo" + +#: ../src/clipboard.c:105 +msgid "wrong clipboard data size" +msgstr "zlá veľkosť dát v schránke" + +#: ../src/clipboard.c:124 +#, c-format +msgid "" +"The clipboard contains sublayer data for %s layers. You must select a layer " +"of this type to paste the clipboard data." +msgstr "" +"Schránka obsahuje podvrstvové dáta pre %s vrstvy. Musíte vybrať vrstvu tohto " +"typu, aby ste mohli vložiť dáta zo schránky" + +#: ../src/clipboard.c:264 +msgid "" +"In order to paste a waypoint, please select an appropriate layer to paste " +"into." +msgstr "" + +#: ../src/dialog.c:60 +msgid "Go to Lat/Lon" +msgstr "Choď na Zemepisnú šírku/dĺžku" + +#: ../src/dialog.c:69 ../src/viktrwlayer_wpwin.c:173 +msgid "Latitude:" +msgstr "Zemepisná šírka:" + +#: ../src/dialog.c:72 ../src/viktrwlayer_wpwin.c:177 +msgid "Longitude:" +msgstr "Zemepisná dĺžka:" + +#: ../src/dialog.c:102 +msgid "Go to UTM" +msgstr "" + +#: ../src/dialog.c:114 +msgid "Northing:" +msgstr "" + +#: ../src/dialog.c:117 +msgid "Easting:" +msgstr "" + +#: ../src/dialog.c:121 ../src/vikgeoreflayer.c:902 +msgid "Zone:" +msgstr "Pásmo:" + +#: ../src/dialog.c:124 ../src/vikgeoreflayer.c:904 +msgid "Letter:" +msgstr "Písmeno:" + +#: ../src/dialog.c:246 ../src/geonamessearch.c:238 +#: ../src/datasource_osm_my_traces.c:505 +msgid "Nothing was selected" +msgstr "Nič nebolo vybraté" + +#: ../src/dialog.c:254 +msgid "Add Route" +msgstr "Pridať trasu" + +#: ../src/dialog.c:254 +msgid "Add Track" +msgstr "Pridať stopu" + +#: ../src/dialog.c:262 +msgid "Route Name:" +msgstr "Meno Trasy" + +#: ../src/dialog.c:262 +msgid "Track Name:" +msgstr "Meno Stopy" + +#: ../src/dialog.c:282 +msgid "Please enter a name for the track." +msgstr "Vložte prosím meno stopy" + +#: ../src/dialog.c:311 +msgid "Today" +msgstr "" + +#: ../src/dialog.c:393 +msgid "Zoom Factors..." +msgstr "Faktory priblíženia..." + +#: ../src/dialog.c:407 +msgid "Zoom factor (in meters per pixel):" +msgstr "Faktory priblíženia (v metroch na pixel):" + +#: ../src/dialog.c:408 +msgid "X (easting): " +msgstr "" + +#: ../src/dialog.c:409 +msgid "Y (northing): " +msgstr "" + +#: ../src/dialog.c:414 +msgid "X and Y zoom factors must be equal" +msgstr "Faktory priblíženia X a Y musia byť rovnaké" + +#: ../src/dialog.c:469 +msgid "1 min" +msgstr "1 min" + +#: ../src/dialog.c:470 +msgid "1 hour" +msgstr "1 hodina" + +#: ../src/dialog.c:471 +msgid "1 day" +msgstr "1 deň" + +#: ../src/dialog.c:472 +msgid "Custom (in minutes):" +msgstr "Vlastné (v minútach)" + +#: ../src/dialog.c:608 +#, c-format +msgid "" +"2003-2008, Evan Battaglia\n" +"2008-%s, Viking's contributors" +msgstr "" + +#: ../src/dialog.c:609 +msgid "GPS Data and Topo Analyzer, Explorer, and Manager." +msgstr "" + +#: ../src/dialog.c:610 +msgid "" +"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.\n" +"\n" +"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.\n" +"\n" +"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., 59 Temple " +"Place, Suite 330, Boston, MA 02111-1307, USA" +msgstr "" + +#: ../src/dialog.c:703 +msgid "Translation is coordinated on http://launchpad.net/viking" +msgstr "Preklady sú koordinované na http://launchpad.net/viking" + +#: ../src/dialog.c:713 +msgid "Download along track" +msgstr "" + +#: ../src/dialog.c:720 +msgid "Map type:" +msgstr "Typ mapy:" + +#: ../src/dialog.c:726 +msgid "Zoom level:" +msgstr "Úroveň prblíženia:" + +#: ../src/dialog.c:766 +#, c-format +msgid "The map data is licensed: %s." +msgstr "Dáta máp sú licencované: %s." + +#: ../src/dialog.c:769 +#, c-format +msgid "" +"The data provided by '%s' are licensed under the following license: " +"%s." +msgstr "" + +#: ../src/dialog.c:773 +msgid "Open license" +msgstr "Otvorená licencia" + +#: ../src/expedia.c:54 +msgid "Expedia Street Maps" +msgstr "" + +#: ../src/expedia.c:82 +msgid "Invalid expedia altitude" +msgstr "" + +#: ../src/expedia.c:113 +#, c-format +msgid "" +"Couldn't open EXPEDIA image file (right after successful download! Please " +"report and delete image file!): %s" +msgstr "" + +#: ../src/expedia.c:126 +#, c-format +msgid "" +"Couldn't save EXPEDIA image file (right after successful download! Please " +"report and delete image file!): %s" +msgstr "" + +#: ../src/geonamessearch.c:115 +msgid "Search" +msgstr "Hľadať" + +#: ../src/geonamessearch.c:117 +msgid "No entries found!" +msgstr "Neboli nájdené žiadne záznamy" + +#. NB could allow columns to be shifted around by doing this after each new +#. gtk_tree_view_column_set_reorderable ( column, TRUE ); +#. However I don't think is that useful, so I haven't put it in +#: ../src/geonamessearch.c:171 ../src/datasource_osm_my_traces.c:422 +#: ../src/viktrwlayer_tracklist.c:621 ../src/viktrwlayer_waypointlist.c:618 +msgid "Name" +msgstr "Názov" + +#: ../src/geonamessearch.c:176 +msgid "Feature" +msgstr "" + +#: ../src/geonamessearch.c:181 ../src/datasource_osm_my_traces.c:437 +msgid "Lat/Lon" +msgstr "Šírka/Dĺžka" + +#: ../src/geonamessearch.c:264 ../src/googlesearch.c:101 ../src/vikgoto.c:430 +msgid "couldn't map temp file" +msgstr "" + +#: ../src/geonamessearch.c:459 +msgid "Select articles" +msgstr "" + +#: ../src/geonamessearch.c:459 +msgid "Select the articles you want to add." +msgstr "" + +#: ../src/geonamessearch.c:475 +msgid "city" +msgstr "" + +#: ../src/geonamessearch.c:477 +msgid "edu" +msgstr "" + +#: ../src/geonamessearch.c:479 +msgid "airport" +msgstr "" + +#: ../src/geonamessearch.c:481 +msgid "mountain" +msgstr "" + +#: ../src/geonamessearch.c:483 +msgid "forest" +msgstr "" + +#: ../src/geonamessearch.c:485 +msgid "church" +msgstr "" + +#: ../src/geojson.c:74 +#, c-format +msgid "%s command failed: %s" +msgstr "" + +#: ../src/geojson.c:146 ../src/gpx.c:1317 +#, c-format +msgid "failed to open temporary file: %s" +msgstr "" + +#: ../src/globals.c:67 +msgid "DDD" +msgstr "" + +#: ../src/globals.c:67 +msgid "DMM" +msgstr "" + +#: ../src/globals.c:67 +msgid "DMS" +msgstr "" + +#: ../src/globals.c:67 +msgid "Raw" +msgstr "" + +#: ../src/globals.c:68 +msgid "Kilometres" +msgstr "" + +#: ../src/globals.c:68 +msgid "Miles" +msgstr "" + +#: ../src/globals.c:68 +msgid "Nautical Miles" +msgstr "" + +#. VIK_UNITS_SPEED_KILOMETRES_PER_HOUR: +#: ../src/globals.c:69 ../src/viktrwlayer_tracklist.c:655 ../src/vikutils.c:100 +msgid "km/h" +msgstr "" + +#: ../src/globals.c:69 ../src/viktrwlayer_tracklist.c:656 ../src/vikutils.c:78 +msgid "mph" +msgstr "" + +#. VIK_UNITS_SPEED_METRES_PER_SECOND: +#: ../src/globals.c:69 ../src/viktrwlayer_tracklist.c:663 ../src/vikutils.c:81 +msgid "m/s" +msgstr "" + +#: ../src/globals.c:69 ../src/viktrwlayer_tracklist.c:657 ../src/vikutils.c:84 +msgid "knots" +msgstr "" + +#: ../src/globals.c:69 ../src/viktrwlayer_tracklist.c:658 ../src/vikutils.c:87 +msgid "s/km" +msgstr "" + +#: ../src/globals.c:69 ../src/viktrwlayer_tracklist.c:659 ../src/vikutils.c:90 +msgid "min/km" +msgstr "" + +#: ../src/globals.c:69 +msgid "s/mi" +msgstr "" + +#: ../src/globals.c:69 ../src/viktrwlayer_tracklist.c:661 ../src/vikutils.c:96 +msgid "min/mi" +msgstr "" + +#: ../src/globals.c:70 +msgid "Metres" +msgstr "" + +#: ../src/globals.c:70 +msgid "Feet" +msgstr "" + +#: ../src/globals.c:73 +msgid "Locale" +msgstr "" + +#: ../src/globals.c:73 +msgid "World" +msgstr "" + +#: ../src/globals.c:73 +msgid "UTC" +msgstr "" + +#: ../src/globals.c:76 +msgid "Degree format:" +msgstr "Formát stupňov:" + +#: ../src/globals.c:77 +msgid "Distance units:" +msgstr "Jednotky vzdialenosti:" + +#: ../src/globals.c:78 +msgid "Speed units:" +msgstr "Jednotky rýchlosti:" + +#: ../src/globals.c:79 +msgid "Height units:" +msgstr "Jednotky výšky:" + +#: ../src/globals.c:80 +msgid "Use large waypoint icons:" +msgstr "Použiť veľké ikony bodov trasy" + +#: ../src/globals.c:81 +msgid "Default latitude:" +msgstr "Východzia zemepisná šírka" + +#: ../src/globals.c:82 +msgid "Default longitude:" +msgstr "Východzia zemepisná dĺžka" + +#: ../src/globals.c:83 +msgid "Time Display:" +msgstr "" + +#: ../src/globals.c:84 +msgid "" +"Display times according to the reference frame. Locale is the user's system " +"setting. World is relative to the location of the object." +msgstr "" + +#: ../src/globals.c:90 +msgid "Alphabetical" +msgstr "Abecedne" + +#: ../src/globals.c:90 ../src/datasource_osm_my_traces.c:432 +msgid "Time" +msgstr "Čas" + +#: ../src/globals.c:90 +msgid "Creation" +msgstr "Vytvorenie" + +#: ../src/globals.c:91 +msgid "Title Case" +msgstr "Štýl nadpisu" + +#: ../src/globals.c:91 +msgid "Lowercase" +msgstr "Malé písmená" + +#: ../src/globals.c:94 +msgid "KML File Export Units:" +msgstr "" + +#: ../src/globals.c:95 +msgid "GPX Track Order:" +msgstr "" + +#: ../src/globals.c:96 +msgid "GPX Waypoint Symbols:" +msgstr "" + +#: ../src/globals.c:97 +msgid "" +"Save GPX Waypoint Symbol names in the specified case. May be useful for " +"compatibility with various devices" +msgstr "" + +#: ../src/globals.c:98 +#, fuzzy +msgid "GPX Creator:" +msgstr "Vytvorenie" + +#: ../src/globals.c:99 +msgid "" +"The creator value when writing a GPX file. Otherwise when blank a default is " +"used." +msgstr "" + +#: ../src/globals.c:104 +msgid "Image Viewer:" +msgstr "Prehliadač Obrázkov" + +#: ../src/globals.c:109 +msgid "External GPX Program 1:" +msgstr "Externý GPX program 1:" + +#: ../src/globals.c:110 +msgid "External GPX Program 2:" +msgstr "Externý GPX program 2:" + +#: ../src/globals.c:113 +msgid "Absolute" +msgstr "Absolútna" + +#: ../src/globals.c:113 +msgid "Relative" +msgstr "Relatívna" + +#: ../src/globals.c:117 +msgid "Save File Reference Mode:" +msgstr "" + +#: ../src/globals.c:118 +msgid "" +"When saving a Viking .vik file, this determines how the directory paths of " +"filenames are written." +msgstr "" + +#: ../src/globals.c:119 +msgid "Ask for Name before Track Creation:" +msgstr "" + +#: ../src/globals.c:120 +msgid "Show Tooltip during Track Creation:" +msgstr "" + +#: ../src/globals.c:121 +msgid "The number of recent files:" +msgstr "" + +#: ../src/globals.c:122 +msgid "" +"Only applies to new windows or on application restart. -1 means all " +"available files." +msgstr "" + +#: ../src/globals.c:123 +msgid "Open files in selected layer:" +msgstr "" + +#: ../src/globals.c:124 +msgid "Open files (but not .vik ones) into the selected TrackWaypoint layer." +msgstr "" + +#: ../src/globals.c:125 +msgid "Show calendar day names:" +msgstr "" + +#: ../src/globals.c:128 +msgid "Home Location" +msgstr "Domovská Pozícia" + +#: ../src/globals.c:128 +msgid "Last Location" +msgstr "Posledná Pozícia" + +#: ../src/globals.c:128 +msgid "Specified File" +msgstr "Zvolený súbor" + +#: ../src/globals.c:128 +msgid "Auto Location" +msgstr "" + +#: ../src/globals.c:131 +msgid "Restore Window Setup:" +msgstr "Obnoviť Nastavenia Okna" + +#: ../src/globals.c:132 +msgid "Restore window size and layout" +msgstr "Obnoviť veľkosť a rozloženie okna" + +#: ../src/globals.c:133 +msgid "Add a Default Map Layer:" +msgstr "" + +#: ../src/globals.c:134 +msgid "" +"The default map layer added is defined by the Layer Defaults. Use the menu " +"Edit->Layer Defaults->Map... to change the map type and other values." +msgstr "" + +#: ../src/globals.c:135 +msgid "Startup Method:" +msgstr "Spúšťacia metóda:" + +#: ../src/globals.c:136 +msgid "Startup File:" +msgstr "Spúšťací súbor:" + +#: ../src/globals.c:137 +msgid "" +"The default file to load on startup. Only applies when the startup method is " +"set to 'Specified File'" +msgstr "" +"Východzí súbor spustený pri štarte. Použije sa len v prípade, že spúšťacia " +"metóda je nastavená na 'Zvolený súbor'" + +#: ../src/globals.c:138 +msgid "Check For New Version:" +msgstr "" + +#: ../src/globals.c:139 +msgid "Periodically check to see if a new version of Viking is available" +msgstr "" + +#. Defaults for the options are setup here +#: ../src/globals.c:176 +msgid "General" +msgstr "Všeobecné" + +#. New Tab +#: ../src/globals.c:204 +msgid "Startup" +msgstr "Spustenie" + +#. New Tab +#: ../src/globals.c:222 +msgid "Export/External" +msgstr "" + +#. 'Advanced' Properties +#: ../src/globals.c:249 +msgid "Advanced" +msgstr "Pokročilé" + +#. Webtools +#: ../src/google.c:39 +msgid "Google" +msgstr "Google" + +#. If there is an actual description field it will overwrite this value +#: ../src/gpx.c:264 +#, c-format +msgid "Created by: %s" +msgstr "" + +#: ../src/datasource_bfilter.c:43 +msgid "Max number of points:" +msgstr "" + +#: ../src/datasource_bfilter.c:84 +msgid "Simplify All Tracks..." +msgstr "" + +#: ../src/datasource_bfilter.c:85 +msgid "Simplified Tracks" +msgstr "" + +#. { VIK_LAYER_NUM_TYPES, "compressmethod", VIK_LAYER_PARAM_UINT, VIK_LAYER_GROUP_NONE, N_("Simplify Method:"), VIK_LAYER_WIDGET_COMBOBOX, compress_method, NULL, NULL, NULL, NULL, NULL }, +#: ../src/datasource_bfilter.c:111 +msgid "Error Factor:" +msgstr "" + +#: ../src/datasource_bfilter.c:112 +msgid "" +"Specifies the maximum allowable error that may be introduced by removing a " +"single point by the crosstrack method. See the manual or GPSBabel Simplify " +"Filter documentation for more detail." +msgstr "" + +#: ../src/datasource_bfilter.c:166 +msgid "Compress Tracks..." +msgstr "" + +#: ../src/datasource_bfilter.c:167 +msgid "Compressed Tracks" +msgstr "" + +#: ../src/datasource_bfilter.c:197 ../src/datasource_bfilter.c:198 +msgid "Remove Duplicate Waypoints" +msgstr "" + +#: ../src/datasource_bfilter.c:221 +msgid "Manual filter:" +msgstr "" + +#: ../src/datasource_bfilter.c:222 +msgid "Manual filter command: e.g. 'swap'." +msgstr "" + +#: ../src/datasource_bfilter.c:233 ../src/datasource_bfilter.c:234 +msgid "Manual filter" +msgstr "" + +#: ../src/datasource_bfilter.c:262 +msgid "Waypoints Inside This" +msgstr "" + +#: ../src/datasource_bfilter.c:263 ../src/datasource_bfilter.c:292 +msgid "Polygonized Layer" +msgstr "" + +#: ../src/datasource_bfilter.c:291 +msgid "Waypoints Outside This" +msgstr "" + +#: ../src/datasource_file.c:61 +msgid "Import file with GPSBabel" +msgstr "" + +#: ../src/datasource_file.c:62 +msgid "Imported file" +msgstr "Importovaný súbor" + +#. The file selector +#: ../src/datasource_file.c:129 +msgid "File:" +msgstr "Súbor:" + +#: ../src/datasource_file.c:130 +msgid "File to import" +msgstr "Súbor na import" + +#: ../src/datasource_file.c:137 +msgid "All files" +msgstr "Všetky súbory" + +#. The file format selector +#: ../src/datasource_file.c:144 ../src/datasource_url.c:106 +msgid "File type:" +msgstr "Typ súboru:" + +#: ../src/datasource_file.c:189 +#, c-format +msgid "using babel args '%s' and file '%s'" +msgstr "" + +#: ../src/datasource_gc.c:67 +msgid "Download Geocaches" +msgstr "" + +#: ../src/datasource_gc.c:68 +msgid "Geocaching.com Caches" +msgstr "" + +#: ../src/datasource_gc.c:86 +msgid "geocaching.com username:" +msgstr "" + +#: ../src/datasource_gc.c:87 +msgid "geocaching.com password:" +msgstr "" + +#: ../src/datasource_gc.c:92 ../src/vikwindow.c:3502 +msgid "Geocaching" +msgstr "" + +#: ../src/datasource_gc.c:128 +#, c-format +msgid "" +"Can't find %s or %s in path! Check that you have installed it correctly." +msgstr "" + +#: ../src/datasource_gc.c:190 +msgid "Number geocaches:" +msgstr "" + +#: ../src/datasource_gc.c:192 +msgid "Centered around:" +msgstr "" + +#: ../src/datasource_gc.c:231 +msgid "Broken input - using some defaults" +msgstr "" + +#: ../src/datasource_geotag.c:51 +msgid "Create Waypoints from Geotagged Images" +msgstr "" + +#: ../src/datasource_geotag.c:52 +msgid "Geotagged Images" +msgstr "" + +#: ../src/datasource_geotag.c:102 ../src/datasource_geojson.c:93 +#: ../src/vikfileentry.c:171 ../src/vikwindow.c:3533 ../src/vikwindow.c:3610 +#: ../src/vikwindow.c:3641 ../src/vikwindow.c:4356 ../src/vikwindow.c:4649 +msgid "All" +msgstr "" + +#: ../src/datasource_geotag.c:107 ../src/vikfileentry.c:115 +#: ../src/viktrwlayer_geotag.c:637 ../src/vikwindow.c:3518 +#: ../src/vikwindow.c:4377 +msgid "JPG" +msgstr "" + +#: ../src/datasource_geotag.c:168 +#, c-format +msgid "Unable to create waypoint from %s" +msgstr "" + +#: ../src/datasource_geojson.c:46 +msgid "Acquire from GeoJSON" +msgstr "" + +#: ../src/datasource_geojson.c:47 ../src/datasource_geojson.c:98 +msgid "GeoJSON" +msgstr "" + +#: ../src/datasource_geojson.c:152 +#, c-format +msgid "Unable to import from: %s" +msgstr "" + +#: ../src/datasource_gps.c:54 +msgid "Acquire from GPS" +msgstr "" + +#: ../src/datasource_gps.c:55 +msgid "Acquired from GPS" +msgstr "" + +#: ../src/datasource_gps.c:258 +#, c-format +msgid "using cmd '%s' and file '%s'\n" +msgstr "" + +#: ../src/datasource_gps.c:353 ../src/vikgpslayer.c:966 +#, c-format +msgid "Downloading %d waypoint..." +msgid_plural "Downloading %d waypoints..." +msgstr[0] "" +msgstr[1] "" + +#: ../src/datasource_gps.c:358 ../src/vikgpslayer.c:971 +#, c-format +msgid "Downloading %d trackpoint..." +msgid_plural "Downloading %d trackpoints..." +msgstr[0] "" +msgstr[1] "" + +#: ../src/datasource_gps.c:363 ../src/vikgpslayer.c:976 +#, c-format +msgid "Downloading %d routepoint..." +msgid_plural "Downloading %d routepoints..." +msgstr[0] "" +msgstr[1] "" + +#: ../src/datasource_gps.c:386 ../src/datasource_gps.c:393 +#: ../src/datasource_gps.c:400 +#, c-format +msgid "Downloaded %d out of %d %s..." +msgstr "" + +#: ../src/datasource_gps.c:388 ../src/datasource_gps.c:395 +#: ../src/datasource_gps.c:402 +#, c-format +msgid "Downloaded %d %s." +msgstr "" + +#: ../src/datasource_gps.c:416 ../src/vikgpslayer.c:1134 +#, c-format +msgid "GPS Device: %s" +msgstr "" + +#: ../src/datasource_gps.c:428 ../src/vikgpslayer.c:1214 +msgid "Status: Working..." +msgstr "" + +#. NB gps_layer_inst_init() is performed after parameter registeration +#. thus to give the protocols some potential values use the old static list +#. TODO: find another way to use gps_layer_inst_init()? +#: ../src/datasource_gps.c:584 ../src/vikgpslayer.c:216 +msgid "GPS Protocol:" +msgstr "" + +#. List reassigned at runtime +#: ../src/datasource_gps.c:609 ../src/vikgpslayer.c:217 +msgid "Serial Port:" +msgstr "" + +#: ../src/datasource_gps.c:659 +msgid "" +"Turn Off After Transfer\n" +"(Garmin/NAViLink Only)" +msgstr "" + +#: ../src/datasource_gps.c:666 +msgid "Tracks:" +msgstr "" + +#: ../src/datasource_gps.c:673 +msgid "Routes:" +msgstr "" + +#: ../src/datasource_gps.c:680 +msgid "Waypoints:" +msgstr "" + +#: ../src/datasource_gps.c:756 ../src/vikgpslayer.c:1509 +msgid "GPS device: N/A" +msgstr "" + +#: ../src/datasource_osm.c:53 ../src/datasource_osm.c:54 +msgid "OSM traces" +msgstr "" + +#: ../src/datasource_osm.c:89 +msgid "Page number:" +msgstr "" + +#: ../src/datasource_osm_my_traces.c:59 ../src/datasource_osm_my_traces.c:60 +msgid "OSM My Traces" +msgstr "" + +#: ../src/datasource_osm_my_traces.c:106 ../src/osm-traces.c:684 +msgid "Email/username:" +msgstr "" + +#: ../src/datasource_osm_my_traces.c:111 +msgid "The email or username used to login to OSM" +msgstr "" + +#: ../src/datasource_osm_my_traces.c:113 ../src/osm-traces.c:692 +msgid "Password:" +msgstr "" + +#: ../src/datasource_osm_my_traces.c:116 +msgid "The password used to login to OSM" +msgstr "" + +#: ../src/datasource_osm_my_traces.c:427 ../src/viktrwlayer.c:689 +msgid "Description" +msgstr "" + +#: ../src/datasource_osm_my_traces.c:442 +msgid "Privacy" +msgstr "" + +#: ../src/datasource_osm_my_traces.c:449 +msgid "Within Current View" +msgstr "" + +#: ../src/datasource_osm_my_traces.c:516 +msgid "GPS Traces" +msgstr "" + +#: ../src/datasource_osm_my_traces.c:518 +msgid "None found!" +msgstr "" + +#: ../src/datasource_osm_my_traces.c:569 +msgid "Ensure the OSM access token preferences are setup." +msgstr "" + +#: ../src/datasource_osm_my_traces.c:645 +msgid "My OSM Traces" +msgstr "" + +#. Report errors to the status bar +#: ../src/datasource_osm_my_traces.c:667 +#, c-format +msgid "Unable to get trace: %s" +msgstr "" + +#: ../src/datasource_routing.c:56 ../src/datasource_routing.c:57 +msgid "Directions" +msgstr "" + +#: ../src/datasource_routing.c:90 +msgid "No routing engines with directions available" +msgstr "" + +#. Engine selector +#: ../src/datasource_routing.c:99 +msgid "Engine:" +msgstr "" + +#. From and To entries +#: ../src/datasource_routing.c:104 +msgid "From:" +msgstr "" + +#: ../src/datasource_routing.c:105 +msgid "To:" +msgstr "" + +#: ../src/datasource_url.c:48 +msgid "Acquire from URL" +msgstr "" + +#: ../src/datasource_url.c:49 +msgid "URL" +msgstr "" + +#: ../src/datasource_url.c:101 +msgid "URL:" +msgstr "" + +#. Only GPX (not using GPSbabel) +#: ../src/datasource_url.c:133 ../src/vikfileentry.c:161 +#: ../src/vikwindow.c:3513 ../src/vikwindow.c:3603 +msgid "GPX" +msgstr "" + +#: ../src/datasource_wikipedia.c:32 +msgid "Create Waypoints from Wikipedia Articles" +msgstr "" + +#: ../src/datasource_wikipedia.c:33 +msgid "Wikipedia Waypoints" +msgstr "" + +#: ../src/dem.c:66 ../src/dem.c:80 +msgid "Invalid DEM" +msgstr "" + +#: ../src/dem.c:122 +msgid "Invalid DEM header" +msgstr "" + +#: ../src/dem.c:191 ../src/dem.c:204 +msgid "Incorrect DEM Class B record: expected 1" +msgstr "" + +#: ../src/dem.c:289 ../src/download.c:176 +#, c-format +msgid "Couldn't map file %s: %s" +msgstr "" + +#: ../src/download.c:130 +msgid "Tile age (days):" +msgstr "" + +#: ../src/download.c:406 +#, c-format +msgid "Download error: %s" +msgstr "" + +#: ../src/download.c:490 +msgid "couldn't open temp file" +msgstr "" + +#: ../src/file.c:458 ../src/file.c:463 +#, c-format +msgid "Draw mode '%s' no more supported" +msgstr "" + +#: ../src/geotag_exif.c:621 +msgid "Not enough memory." +msgstr "" + +#: ../src/geotag_exif.c:639 +msgid "Setting a value for this tag is unsupported!" +msgstr "" + +#: ../src/geotag_exif.c:658 +#, c-format +msgid "Too few components specified (need %d, found %d)\n" +msgstr "" + +#: ../src/geotag_exif.c:662 +msgid "Numeric value expected\n" +msgstr "" + +#: ../src/geotag_exif.c:670 +msgid "This shouldn't happen!" +msgstr "" + +#: ../src/geotag_exif.c:740 +msgid "Not yet implemented!" +msgstr "" + +#: ../src/geotag_exif.c:753 +msgid "Warning; Too many components specified!" +msgstr "" + +#: ../src/osm-traces.c:87 +msgid "Identifiable (public w/ timestamps)" +msgstr "" + +#: ../src/osm-traces.c:88 +msgid "Trackable (private w/ timestamps)" +msgstr "" + +#: ../src/osm-traces.c:89 +msgid "Public" +msgstr "" + +#: ../src/osm-traces.c:90 +msgid "Private" +msgstr "" + +#: ../src/osm-traces.c:108 +msgid "Access Token:" +msgstr "" + +#: ../src/osm-traces.c:108 +msgid "Get New OSM Access Tokens" +msgstr "" + +#: ../src/osm-traces.c:109 +msgid "Access Token Key:" +msgstr "" + +#: ../src/osm-traces.c:110 +msgid "Access Token Secret:" +msgstr "" + +#: ../src/osm-traces.c:111 +msgid "OSM username:" +msgstr "" + +#: ../src/osm-traces.c:112 +msgid "OSM password:" +msgstr "" + +#. Check to really override existing values... +#: ../src/osm-traces.c:263 +msgid "Do you want to overwrite existing values?" +msgstr "" + +#: ../src/osm-traces.c:275 +msgid "Not able to generate OSM request tokens." +msgstr "" + +#: ../src/osm-traces.c:299 +msgid "" +"Waiting for authorization approval.\n" +"Ensure you have granted access at the website before continuing here." +msgstr "" + +#: ../src/osm-traces.c:315 +msgid "No Authorization." +msgstr "" + +#: ../src/osm-traces.c:354 +msgid "" +"OSM Username and Password preferences are not required anymore. You can now " +"remove them." +msgstr "" + +#. Preferences +#: ../src/osm-traces.c:379 +msgid "OpenStreetMap Traces" +msgstr "" + +#: ../src/osm-traces.c:504 +#, c-format +msgid "failed to upload data: HTTP response is %ld" +msgstr "" + +#: ../src/osm-traces.c:509 +#, c-format +msgid "curl_easy_getinfo failed: %d" +msgstr "" + +#: ../src/osm-traces.c:514 +#, c-format +msgid "curl request failed: %s" +msgstr "" + +#. Success +#: ../src/osm-traces.c:592 +msgid "Uploaded to OSM" +msgstr "" + +#: ../src/osm-traces.c:596 +msgid "" +"FAILED TO UPLOAD DATA TO OSM - Ensure the OSM access token preferences are " +"setup." +msgstr "" + +#: ../src/osm-traces.c:599 +msgid "FAILED TO UPLOAD DATA TO OSM - CURL PROBLEM" +msgstr "" + +#: ../src/osm-traces.c:602 +msgid "FAILED TO UPLOAD DATA TO OSM" +msgstr "" + +#: ../src/osm-traces.c:602 +msgid "HTTP response code" +msgstr "" + +#: ../src/osm-traces.c:610 +#, c-format +msgid "failed to unlink temporary file: %s" +msgstr "" + +#: ../src/osm-traces.c:664 +msgid "OSM upload" +msgstr "" + +#: ../src/osm-traces.c:689 +msgid "" +"The email/username used as login\n" +"Enter the email/username you use to login into www.openstreetmap.org." +"" +msgstr "" + +#: ../src/osm-traces.c:697 +msgid "" +"The password used to login\n" +"Enter the password you use to login into www.openstreetmap.org." +msgstr "" + +#: ../src/osm-traces.c:703 +msgid "File's name:" +msgstr "" + +#: ../src/osm-traces.c:713 +msgid "" +"The name of the file on OSM\n" +"This is the name of the file created on the server.This is not the " +"name of the local file." +msgstr "" + +#: ../src/osm-traces.c:717 ../src/viktrwlayer_wpwin.c:197 +#: ../src/viktrwlayer_wpwin.c:199 +msgid "Description:" +msgstr "Popis" + +#: ../src/osm-traces.c:731 +msgid "The description of the trace" +msgstr "" + +#: ../src/osm-traces.c:734 +msgid "Anonymize Times:" +msgstr "" + +#: ../src/osm-traces.c:739 +msgid "" +"Anonymize times of the trace.\n" +"You may choose to make the trace identifiable, yet mask the actual " +"real time values" +msgstr "" + +#: ../src/osm-traces.c:743 +msgid "Tags:" +msgstr "" + +#: ../src/osm-traces.c:751 +msgid "The tags associated to the trace" +msgstr "" + +#: ../src/osm-traces.c:816 +#, c-format +msgid "Uploading %s to OSM" +msgstr "" + +#: ../src/mapcache.c:67 +msgid "Map cache memory size (MB):" +msgstr "" + +#. NB Can have a couple hundred fonts loaded when using system directories +#. So ATM don't list them all - otherwise need better GUI feedback display. +#: ../src/mapnik_interface.cpp:324 +#, c-format +msgid "" +"%s %s\n" +"Plugins=%sFonts loaded=%d" +msgstr "" + +#: ../src/mapnik_interface.cpp:325 ../src/vikmapniklayer.c:278 +msgid "Mapnik" +msgstr "" + +#: ../src/print.c:51 ../src/viktrwlayer.c:572 +msgid "None" +msgstr "" + +#: ../src/print.c:52 +msgid "Horizontally" +msgstr "" + +#: ../src/print.c:53 +msgid "Vertically" +msgstr "" + +#: ../src/print.c:54 +msgid "Both" +msgstr "" + +#: ../src/print.c:118 +msgid "Image Settings" +msgstr "" + +#: ../src/print.c:551 +msgid "done" +msgstr "" + +#. Page Size +#: ../src/print.c:580 +msgid "_Adjust Page Size and Orientation" +msgstr "" + +#: ../src/print.c:596 +msgid "C_enter:" +msgstr "" + +#. ignore page margins +#: ../src/print.c:614 +msgid "Ignore Page _Margins" +msgstr "" + +#: ../src/print.c:633 +msgid "Image S_ize:" +msgstr "" + +#: ../src/ui_util.c:88 +#, c-format +msgid "Could not launch web browser. %s" +msgstr "" + +#: ../src/ui_util.c:101 +#, c-format +msgid "Could not create new email. %s" +msgstr "" + +#: ../src/vikcoordlayer.c:57 +msgid "Color:" +msgstr "" + +#: ../src/vikcoordlayer.c:58 +msgid "Minutes Width:" +msgstr "" + +#: ../src/vikcoordlayer.c:59 +msgid "Line Thickness:" +msgstr "" + +#: ../src/vikcoordlayer.c:66 +msgid "Coordinate" +msgstr "" + +#: ../src/main.c:92 +#, c-format +msgid "Ignoring Xlib error: error code %d request code %d\n" +msgstr "" + +#: ../src/main.c:111 +msgid "Enable debug output" +msgstr "" + +#: ../src/main.c:112 +msgid "Enable verbose output" +msgstr "" + +#: ../src/main.c:113 +msgid "Show version" +msgstr "" + +#: ../src/main.c:114 +msgid "Latitude in decimal degrees" +msgstr "" + +#: ../src/main.c:115 +msgid "Longitude in decimal degrees" +msgstr "" + +#: ../src/main.c:116 +msgid "Zoom Level (OSM). Value can be 0 - 22" +msgstr "" + +#: ../src/main.c:117 +msgid "Add a map layer by id value. Use 0 for the default map." +msgstr "" + +#: ../src/main.c:160 +#, c-format +msgid "" +"%s %s\n" +"Copyright (c) 2003-2008 Evan Battaglia\n" +"Copyright (c) 2008-%s Viking's contributors\n" +msgstr "" + +#: ../src/osm.c:50 +msgid "OpenStreetMap (Mapnik)" +msgstr "" + +#: ../src/osm.c:65 +msgid "OpenStreetMap (Cycle)" +msgstr "" + +#: ../src/osm.c:79 +msgid "OpenStreetMap (Transport)" +msgstr "" + +#: ../src/osm.c:95 +msgid "OpenStreetMap (Humanitarian)" +msgstr "" + +#: ../src/osm.c:111 +msgid "On Disk OSM Tile Format" +msgstr "" + +#: ../src/osm.c:121 +msgid "MBTiles File" +msgstr "" + +#: ../src/osm.c:132 +msgid "OSM Metatiles" +msgstr "" + +#: ../src/osm.c:146 +msgid "Mapbox Outdoors" +msgstr "" + +#: ../src/osm.c:153 +msgid "Mapbox Specific" +msgstr "" + +#: ../src/osm.c:170 +msgid "OSM (view)" +msgstr "" + +#: ../src/osm.c:174 +msgid "OSM (edit)" +msgstr "" + +#. Note the use of positional parameters +#: ../src/osm.c:179 +msgid "OSM (query)" +msgstr "" + +#: ../src/osm.c:183 +msgid "OSM (render)" +msgstr "" + +#. Example: http://127.0.0.1:8111/load_and_zoom?left=8.19&right=8.20&top=48.605&bottom=48.590&select=node413602999 +#. JOSM or merkaartor must already be running with remote interface enabled +#: ../src/osm.c:190 +msgid "Local port 8111 (eg JOSM)" +msgstr "" + +#: ../src/osm.c:195 +msgid "Geofabrik Map Compare" +msgstr "" + +#: ../src/osm.c:203 +msgid "OpenStreetMap Notes" +msgstr "" + +#. Not really OSM but can't be bothered to create somewhere else to put it... +#: ../src/osm.c:221 +msgid "Wikimedia Toolserver GeoHack" +msgstr "" + +#: ../src/preferences.c:195 +msgid "Preferences" +msgstr "" + +#: ../src/toolbar.c:91 ../src/toolbar.c:92 +msgid "System Default" +msgstr "" + +#: ../src/toolbar.c:91 ../src/viktrwlayer.c:563 +msgid "Small" +msgstr "" + +#: ../src/toolbar.c:91 ../src/viktrwlayer.c:564 +msgid "Medium" +msgstr "" + +#: ../src/toolbar.c:91 ../src/viktrwlayer.c:565 +msgid "Large" +msgstr "" + +#: ../src/toolbar.c:92 +msgid "Icons Only" +msgstr "" + +#: ../src/toolbar.c:92 +msgid "Text Only" +msgstr "" + +#: ../src/toolbar.c:92 +msgid "Icons and Text" +msgstr "" + +#: ../src/toolbar.c:106 +msgid "Append to Menu:" +msgstr "" + +#: ../src/toolbar.c:107 +msgid "Pack the toolbar to the main menu to save vertical space" +msgstr "" + +#: ../src/toolbar.c:108 +msgid "Icon Size:" +msgstr "" + +#: ../src/toolbar.c:110 +msgid "Icon Style:" +msgstr "" + +#: ../src/toolbar.c:112 +msgid "Customize:" +msgstr "" + +#: ../src/toolbar.c:112 +msgid "Customize Buttons" +msgstr "" + +#. Preferences +#: ../src/toolbar.c:145 +msgid "Toolbar" +msgstr "" + +#: ../src/toolbar.c:312 +msgid "_Customize" +msgstr "" + +#: ../src/toolbar.c:641 +msgid "Separator" +msgstr "" + +#: ../src/toolbar.c:642 +msgid "--- Separator ---" +msgstr "" + +#: ../src/toolbar.c:1007 +msgid "Customize Toolbar" +msgstr "" + +#: ../src/toolbar.c:1028 +msgid "" +"Select items to be displayed on the toolbar. Items can be reordered by drag " +"and drop." +msgstr "" + +#: ../src/toolbar.c:1044 +msgid "Available Items" +msgstr "" + +#: ../src/toolbar.c:1065 +msgid "Displayed Items" +msgstr "" + +#: ../src/viklayer_defaults.c:232 +#, c-format +msgid "Could not open file: %s" +msgstr "" + +#: ../src/viklayer_defaults.c:304 +msgid "Layer Defaults" +msgstr "" + +#: ../src/uibuilder.c:196 +msgid "Take care that this password will be stored clearly in a plain file." +msgstr "" + +#: ../src/uibuilder.c:628 ../src/viktrwlayer_export.c:188 +#: ../src/viktrwlayer_export.c:304 ../src/vikwindow.c:3666 +#: ../src/vikwindow.c:4408 +#, c-format +msgid "The file \"%s\" exists, do you wish to overwrite it?" +msgstr "" + +#: ../src/vikaggregatelayer.c:41 +msgid "Aggregate" +msgstr "" + +#: ../src/vikaggregatelayer.c:528 ../src/viktrwlayer.c:11700 +#, c-format +msgid "%s: Waypoint List" +msgstr "" + +#: ../src/vikaggregatelayer.c:570 +msgid "Search by Date" +msgstr "" + +#: ../src/vikaggregatelayer.c:576 +msgid "No items found with the requested date." +msgstr "" + +#: ../src/vikaggregatelayer.c:615 ../src/viktrwlayer.c:11691 +#, c-format +msgid "%s: Track and Route List" +msgstr "" + +#: ../src/vikaggregatelayer.c:681 ../src/viktrwlayer.c:8346 +#: ../src/viktrwlayer.c:8417 ../src/viktrwlayer.c:8494 +msgid "_Visibility" +msgstr "" + +#: ../src/vikaggregatelayer.c:686 +msgid "_Show All" +msgstr "" + +#: ../src/vikaggregatelayer.c:692 +msgid "_Hide All" +msgstr "" + +#: ../src/vikaggregatelayer.c:698 ../src/viktrwlayer.c:8363 +#: ../src/viktrwlayer.c:8434 ../src/viktrwlayer.c:8511 +msgid "_Toggle" +msgstr "" + +#: ../src/vikaggregatelayer.c:705 ../src/viktrwlayer.c:8532 +msgid "_Sort" +msgstr "" + +#: ../src/vikaggregatelayer.c:711 ../src/viktrwlayer.c:8538 +msgid "Name _Ascending" +msgstr "" + +#: ../src/vikaggregatelayer.c:717 ../src/viktrwlayer.c:8544 +msgid "Name _Descending" +msgstr "" + +#: ../src/vikaggregatelayer.c:723 ../src/viktrwlayer.c:575 +#: ../src/viktrwlayer.c:8550 +msgid "Date Ascending" +msgstr "" + +#: ../src/vikaggregatelayer.c:729 ../src/viktrwlayer.c:576 +#: ../src/viktrwlayer.c:8556 +msgid "Date Descending" +msgstr "" + +#: ../src/vikaggregatelayer.c:735 ../src/viktrwlayer.c:8445 +#: ../src/viktrwlayer.c:8523 ../src/viktrwlayer.c:8595 +#: ../src/viktrwlayer_tracklist.c:296 +msgid "_Statistics" +msgstr "" + +#: ../src/vikaggregatelayer.c:740 ../src/viktrwlayer.c:4533 +msgid "Track _List..." +msgstr "" + +#: ../src/vikaggregatelayer.c:746 ../src/viktrwlayer.c:4540 +msgid "_Waypoint List..." +msgstr "" + +#: ../src/vikaggregatelayer.c:753 +msgid "Searc_h" +msgstr "" + +#: ../src/vikaggregatelayer.c:759 +msgid "By _Date..." +msgstr "" + +#: ../src/vikaggregatelayer.c:762 +msgid "Find the first item with a specified date" +msgstr "" + +#: ../src/vikaggregatelayer.c:765 +msgid "Load E_xternal Layers" +msgstr "" + +#. Could have a more complicated tooltip that numbers each type of layers, +#. but for now a simple overall count +#: ../src/vikaggregatelayer.c:1011 +#, c-format +msgid "One layer" +msgid_plural "%d layers" +msgstr[0] "" +msgstr[1] "" + +#: ../src/vikaggregatelayer.c:1014 +#, c-format +msgid "Empty" +msgstr "" + +#: ../src/vikdemlayer.c:86 +msgid "SRTM Global 90m (3 arcsec)" +msgstr "" + +#: ../src/vikdemlayer.c:94 +msgid "Absolute height" +msgstr "" + +#: ../src/vikdemlayer.c:95 +msgid "Height gradient" +msgstr "" + +#: ../src/vikdemlayer.c:120 +msgid "DEM Files:" +msgstr "" + +#: ../src/vikdemlayer.c:121 +msgid "Download Source:" +msgstr "" + +#: ../src/vikdemlayer.c:122 +msgid "Min Elev Color:" +msgstr "" + +#: ../src/vikdemlayer.c:123 ../src/viktrwlayer_wpwin.c:207 +msgid "Type:" +msgstr "" + +#: ../src/vikdemlayer.c:124 +msgid "Min Elev:" +msgstr "" + +#: ../src/vikdemlayer.c:125 +msgid "Max Elev:" +msgstr "" + +#: ../src/vikdemlayer.c:137 +msgid "_DEM Download" +msgstr "" + +#: ../src/vikdemlayer.c:137 +msgid "DEM Download" +msgstr "" + +#: ../src/vikdemlayer.c:192 +msgid "DEM" +msgstr "" + +#: ../src/vikdemlayer.c:304 +#, c-format +msgid "Number of files: %d" +msgstr "" + +#: ../src/vikdemlayer.c:446 +msgid "DEM Loading" +msgstr "" + +#: ../src/vikdemlayer.c:927 +#, c-format +msgid "No SRTM data available for %f, %f" +msgstr "" + +#: ../src/vikdemlayer.c:948 +#, c-format +msgid "DEM download failure for %f, %f" +msgstr "" + +#: ../src/vikdemlayer.c:954 +#, c-format +msgid "DEM write failure for %s" +msgstr "" + +#. Probably not over any land... +#: ../src/vikdemlayer.c:1201 +msgid "No DEM File Available" +msgstr "" + +#: ../src/vikdemlayer.c:1220 +#, c-format +msgid "" +"\n" +"Source: %s\n" +"\n" +"DEM File: %s\n" +"DEM File Timestamp: %s" +msgstr "" + +#: ../src/vikdemlayer.c:1224 +#, c-format +msgid "" +"Source: %s\n" +"\n" +"No DEM File!" +msgstr "" + +#: ../src/vikdemlayer.c:1264 +#, c-format +msgid "Downloading DEM %s" +msgstr "" + +#: ../src/vikdemlayer.c:1289 +msgid "_Show DEM File Information" +msgstr "" + +#: ../src/vikfileentry.c:72 +msgid "Browse..." +msgstr "" + +#: ../src/vikfileentry.c:103 +msgid "Choose file" +msgstr "" + +#: ../src/vikfileentry.c:120 ../src/vikwindow.c:4372 +msgid "PNG" +msgstr "" + +#: ../src/vikfileentry.c:125 +msgid "TIFF" +msgstr "" + +#: ../src/vikfileentry.c:133 +msgid "MBTiles" +msgstr "" + +#: ../src/vikfileentry.c:142 +msgid "XML" +msgstr "" + +#: ../src/vikfileentry.c:149 +msgid "MML" +msgstr "" + +#: ../src/vikfileentry.c:154 +msgid "MSS" +msgstr "" + +#: ../src/vikfilelist.c:49 +msgid "Choose file(s)" +msgstr "" + +#: ../src/vikfilelist.c:182 +msgid "Add..." +msgstr "" + +#: ../src/vikfilelist.c:183 +msgid "Delete" +msgstr "" + +#: ../src/vikgeoreflayer.c:97 +msgid "_Georef Move Map" +msgstr "" + +#: ../src/vikgeoreflayer.c:97 +msgid "Georef Move Map" +msgstr "" + +#: ../src/vikgeoreflayer.c:106 +msgid "Georef Z_oom Tool" +msgstr "" + +#: ../src/vikgeoreflayer.c:106 +msgid "Georef Zoom Tool" +msgstr "" + +#: ../src/vikgeoreflayer.c:117 +msgid "GeoRef Map" +msgstr "" + +#: ../src/vikgeoreflayer.c:214 +msgid "Auto Read World Files:" +msgstr "" + +#: ../src/vikgeoreflayer.c:215 +msgid "" +"Automatically attempt to read associated world file of a new image for a " +"GeoRef layer" +msgstr "" + +#: ../src/vikgeoreflayer.c:511 ../src/vikgeoreflayer.c:797 +#: ../src/vikmapslayer.c:1174 +#, c-format +msgid "Couldn't open image file: %s" +msgstr "" + +#: ../src/vikgeoreflayer.c:607 ../src/vikgeoreflayer.c:633 +msgid "Choose World file" +msgstr "" + +#: ../src/vikgeoreflayer.c:619 +msgid "The World file you requested could not be opened for reading." +msgstr "" + +#: ../src/vikgeoreflayer.c:621 +msgid "Unexpected end of file reading World file." +msgstr "" + +#: ../src/vikgeoreflayer.c:646 +msgid "The file you requested could not be opened for writing." +msgstr "" + +#: ../src/vikgeoreflayer.c:782 +msgid "Lower right corner values may not be consistent with upper right values" +msgstr "" + +#: ../src/vikgeoreflayer.c:806 +#, c-format +msgid "Invalid image size: %s" +msgstr "" + +#: ../src/vikgeoreflayer.c:831 ../src/viklayer.c:561 ../src/vikwindow.c:4891 +msgid "Layer Properties" +msgstr "" + +#: ../src/vikgeoreflayer.c:852 +msgid "World File Parameters:" +msgstr "" + +#: ../src/vikgeoreflayer.c:853 +msgid "Load From File..." +msgstr "" + +#: ../src/vikgeoreflayer.c:858 +msgid "Corner pixel easting:" +msgstr "" + +#: ../src/vikgeoreflayer.c:860 +msgid "the UTM \"easting\" value of the upper-left corner pixel of the map" +msgstr "" + +#: ../src/vikgeoreflayer.c:862 +msgid "Corner pixel northing:" +msgstr "" + +#: ../src/vikgeoreflayer.c:864 +msgid "the UTM \"northing\" value of the upper-left corner pixel of the map" +msgstr "" + +#: ../src/vikgeoreflayer.c:866 +msgid "X (easting) scale (mpp): " +msgstr "" + +#: ../src/vikgeoreflayer.c:867 +msgid "Y (northing) scale (mpp): " +msgstr "" + +#: ../src/vikgeoreflayer.c:870 +msgid "the scale of the map in the X direction (meters per pixel)" +msgstr "" + +#: ../src/vikgeoreflayer.c:872 +msgid "the scale of the map in the Y direction (meters per pixel)" +msgstr "" + +#: ../src/vikgeoreflayer.c:874 +msgid "Map Image:" +msgstr "" + +#: ../src/vikgeoreflayer.c:919 +msgid "Upper left latitude:" +msgstr "" + +#: ../src/vikgeoreflayer.c:921 +msgid "Upper left longitude:" +msgstr "" + +#: ../src/vikgeoreflayer.c:923 +msgid "Lower right latitude:" +msgstr "" + +#: ../src/vikgeoreflayer.c:925 +msgid "Lower right longitude:" +msgstr "" + +#: ../src/vikgeoreflayer.c:937 +msgid "Calculate MPP values from coordinates" +msgstr "" + +#: ../src/vikgeoreflayer.c:938 +msgid "" +"Enter all corner coordinates before calculating the MPP values from the " +"image size" +msgstr "" + +#: ../src/vikgeoreflayer.c:948 +msgid "UTM" +msgstr "" + +#: ../src/vikgeoreflayer.c:949 +msgid "Latitude/Longitude" +msgstr "" + +#: ../src/vikgeoreflayer.c:957 ../src/vikmapniklayer.c:82 +#: ../src/vikmapslayer.c:158 +msgid "Alpha:" +msgstr "" + +#. Now with icons +#: ../src/vikgeoreflayer.c:1062 +msgid "_Zoom to Fit Map" +msgstr "" + +#: ../src/vikgeoreflayer.c:1068 +msgid "_Goto Map Center" +msgstr "" + +#: ../src/vikgeoreflayer.c:1074 +msgid "_Export to World File" +msgstr "" + +#: ../src/vikgoto.c:98 +msgid "No goto tool available." +msgstr "" + +#: ../src/vikgoto.c:295 +msgid "goto" +msgstr "" + +#: ../src/vikgoto.c:297 +msgid "goto provider:" +msgstr "" + +#: ../src/vikgoto.c:312 +msgid "Enter address or place name:" +msgstr "" + +#: ../src/vikgoto.c:487 +msgid "Locality" +msgstr "" + +#: ../src/vikgpslayer.c:137 +msgid "Data Mode" +msgstr "" + +#: ../src/vikgpslayer.c:139 +msgid "Realtime Tracking Mode" +msgstr "" + +#: ../src/vikgpslayer.c:176 +msgid "Keep vehicle at center" +msgstr "" + +#: ../src/vikgpslayer.c:177 +msgid "Keep vehicle on screen" +msgstr "" + +#: ../src/vikgpslayer.c:178 +msgid "Disable" +msgstr "" + +#: ../src/vikgpslayer.c:218 +msgid "Download Tracks:" +msgstr "" + +#: ../src/vikgpslayer.c:219 +msgid "Upload Tracks:" +msgstr "" + +#: ../src/vikgpslayer.c:220 +msgid "Download Routes:" +msgstr "" + +#: ../src/vikgpslayer.c:221 +msgid "Upload Routes:" +msgstr "" + +#: ../src/vikgpslayer.c:222 +msgid "Download Waypoints:" +msgstr "" + +#: ../src/vikgpslayer.c:223 +msgid "Upload Waypoints:" +msgstr "" + +#: ../src/vikgpslayer.c:225 +msgid "Recording tracks" +msgstr "" + +#: ../src/vikgpslayer.c:226 +msgid "Jump to current position on start" +msgstr "" + +#: ../src/vikgpslayer.c:227 +msgid "Moving Map Method:" +msgstr "" + +#: ../src/vikgpslayer.c:228 +msgid "Update Statusbar:" +msgstr "" + +#: ../src/vikgpslayer.c:228 +msgid "Display information in the statusbar on GPS updates" +msgstr "" + +#: ../src/vikgpslayer.c:229 +msgid "Auto Connect" +msgstr "" + +#: ../src/vikgpslayer.c:229 +msgid "Automatically connect to GPSD" +msgstr "" + +#: ../src/vikgpslayer.c:230 +msgid "Gpsd Host:" +msgstr "" + +#: ../src/vikgpslayer.c:231 +msgid "Gpsd Port:" +msgstr "" + +#: ../src/vikgpslayer.c:232 +msgid "Gpsd Retry Interval (seconds):" +msgstr "" + +#: ../src/vikgpslayer.c:254 +msgid "GPS" +msgstr "" + +#: ../src/vikgpslayer.c:320 ../src/vikgpslayer.c:1504 +msgid "GPS Download" +msgstr "" + +#: ../src/vikgpslayer.c:320 ../src/vikgpslayer.c:1504 ../src/viktrwlayer.c:3993 +msgid "GPS Upload" +msgstr "" + +#: ../src/vikgpslayer.c:322 +msgid "GPS Realtime Tracking" +msgstr "" + +#: ../src/vikgpslayer.c:458 +msgid "Connected" +msgstr "" + +#: ../src/vikgpslayer.c:460 +msgid "Disconnected" +msgstr "" + +#: ../src/vikgpslayer.c:554 +msgid "Unknown GPS Protocol" +msgstr "" + +#: ../src/vikgpslayer.c:572 +msgid "Unknown serial port device" +msgstr "" + +#: ../src/vikgpslayer.c:691 +#, c-format +msgid "%s: unknown parameter" +msgstr "" + +#. Now with icons +#: ../src/vikgpslayer.c:794 +msgid "_Upload to GPS" +msgstr "" + +#: ../src/vikgpslayer.c:800 +msgid "Download from _GPS" +msgstr "" + +#: ../src/vikgpslayer.c:821 +msgid "Empty _Realtime" +msgstr "" + +#: ../src/vikgpslayer.c:828 +msgid "E_mpty Upload" +msgstr "" + +#: ../src/vikgpslayer.c:834 +msgid "_Empty Download" +msgstr "" + +#: ../src/vikgpslayer.c:840 +msgid "Empty _All" +msgstr "" + +#: ../src/vikgpslayer.c:852 +#, c-format +msgid "Unexpected number of disconnected handlers: %d" +msgstr "" + +#: ../src/vikgpslayer.c:995 +#, c-format +msgid "Uploading %d waypoint..." +msgid_plural "Uploading %d waypoints..." +msgstr[0] "" +msgstr[1] "" + +#: ../src/vikgpslayer.c:1000 +#, c-format +msgid "Uploading %d trackpoint..." +msgid_plural "Uploading %d trackpoints..." +msgstr[0] "" +msgstr[1] "" + +#: ../src/vikgpslayer.c:1005 +#, c-format +msgid "Uploading %d routepoint..." +msgid_plural "Uploading %d routepoints..." +msgstr[0] "" +msgstr[1] "" + +#: ../src/vikgpslayer.c:1034 +#, c-format +msgid "Downloaded %d out of %d waypoint..." +msgid_plural "Downloaded %d out of %d waypoints..." +msgstr[0] "" +msgstr[1] "" + +#: ../src/vikgpslayer.c:1040 +#, c-format +msgid "Downloaded %d out of %d trackpoint..." +msgid_plural "Downloaded %d out of %d trackpoints..." +msgstr[0] "" +msgstr[1] "" + +#: ../src/vikgpslayer.c:1046 +#, c-format +msgid "Downloaded %d out of %d routepoint..." +msgid_plural "Downloaded %d out of %d routepoints..." +msgstr[0] "" +msgstr[1] "" + +#: ../src/vikgpslayer.c:1056 +#, c-format +msgid "Uploaded %d out of %d waypoint..." +msgid_plural "Uploaded %d out of %d waypoints..." +msgstr[0] "" +msgstr[1] "" + +#: ../src/vikgpslayer.c:1062 +#, c-format +msgid "Uploaded %d out of %d trackpoint..." +msgid_plural "Uploaded %d out of %d trackpoints..." +msgstr[0] "" +msgstr[1] "" + +#: ../src/vikgpslayer.c:1068 +#, c-format +msgid "Uploaded %d out of %d routepoint..." +msgid_plural "Uploaded %d out of %d routepoints..." +msgstr[0] "" +msgstr[1] "" + +#: ../src/vikgpslayer.c:1079 +#, c-format +msgid "Downloaded %d waypoint" +msgid_plural "Downloaded %d waypoints" +msgstr[0] "" +msgstr[1] "" + +#: ../src/vikgpslayer.c:1085 +#, c-format +msgid "Downloaded %d trackpoint" +msgid_plural "Downloaded %d trackpoints" +msgstr[0] "" +msgstr[1] "" + +#: ../src/vikgpslayer.c:1091 +#, c-format +msgid "Downloaded %d routepoint" +msgid_plural "Downloaded %d routepoints" +msgstr[0] "" +msgstr[1] "" + +#: ../src/vikgpslayer.c:1101 +#, c-format +msgid "Uploaded %d waypoint" +msgid_plural "Uploaded %d waypoints" +msgstr[0] "" +msgstr[1] "" + +#: ../src/vikgpslayer.c:1107 +#, c-format +msgid "Uploaded %d trackpoint" +msgid_plural "Uploaded %d trackpoints" +msgstr[0] "" +msgstr[1] "" + +#: ../src/vikgpslayer.c:1113 +#, c-format +msgid "Uploaded %d routepoint" +msgid_plural "Uploaded %d routepoints" +msgstr[0] "" +msgstr[1] "" + +#: ../src/vikgpslayer.c:1363 +msgid "Error: No result." +msgstr "" + +#: ../src/vikgpslayer.c:1471 +msgid "Warning - GPS Upload items may overwrite each other" +msgstr "" + +#: ../src/vikgpslayer.c:1506 +msgid "Status: detecting gpsbabel" +msgstr "" + +#: ../src/vikgpslayer.c:1533 +msgid "No GPS items selected for transfer." +msgstr "" + +#: ../src/vikgpslayer.c:1546 +msgid "Could not turn off device." +msgstr "" + +#: ../src/vikgpslayer.c:1589 +msgid "Are you sure you want to delete GPS Upload data?" +msgstr "" + +#: ../src/vikgpslayer.c:1602 +msgid "Are you sure you want to delete GPS Download data?" +msgstr "" + +#: ../src/vikgpslayer.c:1616 +msgid "Are you sure you want to delete GPS Realtime data?" +msgstr "" + +#: ../src/vikgpslayer.c:1630 +msgid "Are you sure you want to delete All GPS data?" +msgstr "" + +#: ../src/vikgpslayer.c:2004 +#, c-format +msgid "" +"Failed to connect to gpsd at %s (port %s)\n" +"Should Viking keep trying (every %d seconds)?" +msgstr "" + +#: ../src/viklayerspanel.c:73 +msgid "C_ut" +msgstr "" + +#: ../src/viklayerspanel.c:74 ../src/vikwindow.c:4882 +msgid "_Copy" +msgstr "" + +#: ../src/viklayerspanel.c:75 ../src/vikwindow.c:4883 +msgid "_Paste" +msgstr "" + +#: ../src/viklayerspanel.c:76 ../src/vikwindow.c:4884 +msgid "_Delete" +msgstr "" + +#: ../src/viklayerspanel.c:154 +msgid "New Layer" +msgstr "" + +#: ../src/viklayerspanel.c:347 +msgid "Top Layer" +msgstr "" + +#: ../src/viklayerspanel.c:363 +msgid "Add new layer" +msgstr "" + +#: ../src/viklayerspanel.c:370 ../src/vikwindow.c:4884 +msgid "Remove selected layer" +msgstr "" + +#: ../src/viklayerspanel.c:377 +msgid "Move selected layer up" +msgstr "" + +#: ../src/viklayerspanel.c:384 +msgid "Move selected layer down" +msgstr "" + +#: ../src/viklayerspanel.c:391 ../src/vikwindow.c:4881 +msgid "Cut selected layer" +msgstr "" + +#: ../src/viklayerspanel.c:398 ../src/vikwindow.c:4882 +msgid "Copy selected layer" +msgstr "" + +#: ../src/viklayerspanel.c:405 ../src/vikwindow.c:4883 +msgid "" +"Paste layer into selected container layer or otherwise above selected layer" +msgstr "" + +#: ../src/viklayerspanel.c:502 +msgid "New name can not be blank." +msgstr "" + +#: ../src/viklayerspanel.c:751 +msgid "Aggregate Layers have no settable properties." +msgstr "" + +#: ../src/viklayerspanel.c:798 +msgid "You cannot cut the Top Layer." +msgstr "" + +#: ../src/viklayerspanel.c:843 +#, c-format +msgid "Are you sure you want to delete %s?" +msgstr "" + +#: ../src/viklayerspanel.c:863 +msgid "You cannot delete the Top Layer." +msgstr "" + +#: ../src/vikmapniklayer.c:78 +msgid "CSS (MML) Config File:" +msgstr "" + +#: ../src/vikmapniklayer.c:79 +msgid "CartoCSS configuration file" +msgstr "" + +#: ../src/vikmapniklayer.c:80 +msgid "XML Config File:" +msgstr "" + +#: ../src/vikmapniklayer.c:81 +msgid "Mapnik XML configuration file" +msgstr "" + +#: ../src/vikmapniklayer.c:84 +msgid "Use File Cache:" +msgstr "" + +#: ../src/vikmapniklayer.c:86 +msgid "File Cache Directory:" +msgstr "" + +#: ../src/vikmapniklayer.c:122 +msgid "_Mapnik Features" +msgstr "" + +#: ../src/vikmapniklayer.c:122 +msgid "Mapnik Features" +msgstr "" + +#: ../src/vikmapniklayer.c:140 +msgid "Mapnik Rendering" +msgstr "" + +#. Changing these values only applies before first mapnik layer is 'created' +#: ../src/vikmapniklayer.c:258 +msgid "Plugins Directory:" +msgstr "" + +#: ../src/vikmapniklayer.c:258 ../src/vikmapniklayer.c:259 +#: ../src/vikmapniklayer.c:260 ../src/vikmapniklayer.c:261 +msgid "You need to restart Viking for a change to this value to be used" +msgstr "" + +#: ../src/vikmapniklayer.c:259 +msgid "Fonts Directory:" +msgstr "" + +#: ../src/vikmapniklayer.c:260 +msgid "Recurse Fonts Directory:" +msgstr "" + +#: ../src/vikmapniklayer.c:261 +msgid "Rerender Timeout (hours):" +msgstr "" + +#. Changeable any time +#: ../src/vikmapniklayer.c:263 +msgid "CartoCSS:" +msgstr "" + +#: ../src/vikmapniklayer.c:263 +msgid "The program to convert CartoCSS files into Mapnik XML" +msgstr "" + +#: ../src/vikmapniklayer.c:506 +msgid "Running" +msgstr "" + +#: ../src/vikmapniklayer.c:525 +#, c-format +msgid "" +"Error running carto command:\n" +"%s" +msgstr "" + +#: ../src/vikmapniklayer.c:561 +msgid " completed in " +msgstr "" + +#: ../src/vikmapniklayer.c:561 +msgid "seconds" +msgstr "" + +#: ../src/vikmapniklayer.c:611 ../src/vikmapniklayer.c:979 +#, c-format +msgid "" +"Mapnik error loading configuration file:\n" +"%s" +msgstr "" + +#: ../src/vikmapniklayer.c:749 +#, c-format +msgid "Mapnik Render %d:%d:%d %s" +msgstr "" + +#: ../src/vikmapniklayer.c:840 +msgid "Mapnik Rendering must be in Mercator mode" +msgstr "" + +#: ../src/vikmapniklayer.c:997 +msgid "Mapnik Information" +msgstr "" + +#: ../src/vikmapniklayer.c:1031 +msgid "_Flush Memory Cache" +msgstr "" + +#: ../src/vikmapniklayer.c:1044 +msgid "_Run Carto Command" +msgstr "" + +#: ../src/vikmapniklayer.c:1102 ../src/vikmapslayer.c:2029 +#, c-format +msgid "Tile File Timestamp: %s" +msgstr "" + +#: ../src/vikmapniklayer.c:1105 ../src/vikmapslayer.c:2032 +msgid "Tile File Timestamp: Not Available" +msgstr "" + +#: ../src/vikmapniklayer.c:1120 +#, c-format +msgid "Rendering time %.2f seconds" +msgstr "" + +#: ../src/vikmapniklayer.c:1124 ../src/vikmapslayer.c:2042 +msgid "Tile Information" +msgstr "" + +#: ../src/vikmapniklayer.c:1145 +msgid "_Rerender Tile" +msgstr "" + +#: ../src/vikmapniklayer.c:1150 +msgid "_Info" +msgstr "" + +#. ******* MAPZOOMS ******** +#: ../src/vikmapslayer.c:96 +msgid "Use Viking Zoom Level" +msgstr "" + +#: ../src/vikmapslayer.c:146 +msgid "OSM" +msgstr "" + +#. NB mode => id - But can't break file format just to rename something better +#: ../src/vikmapslayer.c:152 +msgid "Map Type:" +msgstr "" + +#: ../src/vikmapslayer.c:153 +msgid "Maps Directory:" +msgstr "" + +#: ../src/vikmapslayer.c:154 +msgid "Cache Layout:" +msgstr "" + +#: ../src/vikmapslayer.c:155 +msgid "This determines the tile storage layout on disk" +msgstr "" + +#: ../src/vikmapslayer.c:156 +msgid "Map File:" +msgstr "" + +#: ../src/vikmapslayer.c:157 +msgid "An MBTiles file. Only applies when the map type method is 'MBTiles'" +msgstr "" + +#: ../src/vikmapslayer.c:159 +msgid "Control the Alpha value for transparency effects" +msgstr "" + +#: ../src/vikmapslayer.c:160 +msgid "Autodownload maps:" +msgstr "" + +#: ../src/vikmapslayer.c:161 +msgid "Autodownload Only Gets Missing Maps:" +msgstr "" + +#: ../src/vikmapslayer.c:162 +msgid "" +"Using this option avoids attempting to update already acquired tiles. This " +"can be useful if you want to restrict the network usage, without having to " +"resort to manual control. Only applies when 'Autodownload Maps' is on." +msgstr "" + +#: ../src/vikmapslayer.c:163 +msgid "Zoom Level:" +msgstr "" + +#: ../src/vikmapslayer.c:164 +msgid "" +"Determines the method of displaying map tiles for the current zoom level. " +"'Viking Zoom Level' uses the best matching level, otherwise setting a fixed " +"value will always use map tiles of the specified value regardless of the " +"actual zoom level." +msgstr "" + +#: ../src/vikmapslayer.c:197 +msgid "_Maps Download" +msgstr "" + +#: ../src/vikmapslayer.c:197 +msgid "Maps Download" +msgstr "" + +#: ../src/vikmapslayer.c:213 ../src/vikutils.c:895 +msgid "Map" +msgstr "" + +#: ../src/vikmapslayer.c:306 +msgid "Default map layer directory:" +msgstr "" + +#: ../src/vikmapslayer.c:306 +msgid "Choose a directory to store cached Map tiles for this layer" +msgstr "" + +#: ../src/vikmapslayer.c:436 ../src/vikmapslayer.c:633 +msgid "Unknown map type" +msgstr "" + +#: ../src/vikmapslayer.c:664 +msgid "Unknown Map Zoom" +msgstr "" + +#: ../src/vikmapslayer.c:833 +#, c-format +msgid "Failed to open MBTiles file: %s" +msgstr "" + +#: ../src/vikmapslayer.c:856 +#, c-format +msgid "" +"New map cannot be displayed in the current drawmode.\n" +"Select \"%s\" from View menu to view it." +msgstr "" + +#: ../src/vikmapslayer.c:1314 +#, c-format +msgid "" +"Cowardly refusing to draw tiles or existence of tiles beyond %d zoom out " +"factor" +msgstr "" + +#. TODO: ?? count up the number of download errors somehow... +#: ../src/vikmapslayer.c:1667 +msgid "Failed to download tile" +msgstr "" + +#: ../src/vikmapslayer.c:1673 +msgid "Unable to save tile" +msgstr "" + +#: ../src/vikmapslayer.c:1799 +#, c-format +msgid "Redownloading up to %d %s map..." +msgid_plural "Redownloading up to %d %s maps..." +msgstr[0] "" +msgstr[1] "" + +#: ../src/vikmapslayer.c:1801 +#, c-format +msgid "Redownloading %d %s map..." +msgid_plural "Redownloading %d %s maps..." +msgstr[0] "" +msgstr[1] "" + +#: ../src/vikmapslayer.c:1805 ../src/vikmapslayer.c:1890 +#, c-format +msgid "Downloading %d %s map..." +msgid_plural "Downloading %d %s maps..." +msgstr[0] "" +msgstr[1] "" + +#: ../src/vikmapslayer.c:1969 +msgid "YES" +msgstr "" + +#: ../src/vikmapslayer.c:1973 ../src/vikmapslayer.c:1977 +msgid "NO" +msgstr "" + +#. NB Also handles .jpg automatically due to pixbuf_new_from () support - although just print png for now. +#: ../src/vikmapslayer.c:1980 +#, c-format +msgid "Source: %s (%d%s%d%s%d.%s %s)" +msgstr "" + +#: ../src/vikmapslayer.c:1983 +msgid "Source: Not available" +msgstr "" + +#: ../src/vikmapslayer.c:2000 +msgid "Source: file://" +msgstr "" + +#: ../src/vikmapslayer.c:2012 +#, c-format +msgid "Source: %s" +msgstr "" + +#: ../src/vikmapslayer.c:2038 +#, c-format +msgid "Tile File: %s [Not Available]" +msgstr "" + +#: ../src/vikmapslayer.c:2086 +msgid "Redownload _Bad Map(s)" +msgstr "" + +#: ../src/vikmapslayer.c:2090 +msgid "Redownload _New Map(s)" +msgstr "" + +#: ../src/vikmapslayer.c:2094 +msgid "Redownload _All Map(s)" +msgstr "" + +#: ../src/vikmapslayer.c:2099 +msgid "_Show Tile Information" +msgstr "" + +#: ../src/vikmapslayer.c:2166 +#, c-format +msgid "" +"Wrong drawmode for this map.\n" +"Select \"%s\" from View menu and try again." +msgstr "" + +#: ../src/vikmapslayer.c:2171 +msgid "Wrong zoom level for this map." +msgstr "" + +#: ../src/vikmapslayer.c:2334 +msgid "Zoom Start:" +msgstr "" + +#: ../src/vikmapslayer.c:2341 +msgid "Zoom End:" +msgstr "" + +#: ../src/vikmapslayer.c:2347 +msgid "Download Maps Method:" +msgstr "" + +#. redownload method - needs to align with REDOWNLOAD* macro values +#: ../src/vikmapslayer.c:2419 +msgid "Missing" +msgstr "" + +#: ../src/vikmapslayer.c:2419 +msgid "Bad" +msgstr "" + +#: ../src/vikmapslayer.c:2419 +msgid "New" +msgstr "" + +#: ../src/vikmapslayer.c:2419 +msgid "Reload All" +msgstr "" + +#: ../src/vikmapslayer.c:2421 +msgid "Download for Zoom Levels" +msgstr "" + +#: ../src/vikmapslayer.c:2461 +#, c-format +msgid "" +"You are not allowed to download more than %d tiles in one go (requested %d)" +msgstr "" + +#: ../src/vikmapslayer.c:2469 +#, c-format +msgid "Do you really want to download %d tiles?" +msgstr "" + +#. Now with icons +#: ../src/vikmapslayer.c:2509 +msgid "Download _Missing Onscreen Maps" +msgstr "" + +#: ../src/vikmapslayer.c:2516 +msgid "Download _New Onscreen Maps" +msgstr "" + +#: ../src/vikmapslayer.c:2523 +msgid "Reload _All Onscreen Maps" +msgstr "" + +#: ../src/vikmapslayer.c:2529 +msgid "Download Maps in _Zoom Levels..." +msgstr "" + +#: ../src/vikmapslayer.c:2539 +msgid "_Open MBTiles Files" +msgstr "" + +#: ../src/vikmapslayer.c:2554 +msgid "Flush Map Cache" +msgstr "" + +#: ../src/vikrouting.c:54 +msgid "Default engine:" +msgstr "" + +#: ../src/vikrouting.c:68 +msgid "Routing" +msgstr "" + +#: ../src/viktreeview.c:347 +msgid "Layer Name" +msgstr "" + +#: ../src/viktreeview.c:924 +#, c-format +msgid "delete data from %s\n" +msgstr "" + +#: ../src/viktrwlayer.c:427 +msgid "Create _Waypoint" +msgstr "" + +#: ../src/viktrwlayer.c:427 +msgid "Create Waypoint" +msgstr "" + +#: ../src/viktrwlayer.c:437 +#, fuzzy +msgid "Edit _Track" +msgstr "Pridať stopu" + +#: ../src/viktrwlayer.c:437 +#, fuzzy +msgid "Edit Track" +msgstr "Pridať stopu" + +#: ../src/viktrwlayer.c:449 +#, fuzzy +msgid "Edit _Route" +msgstr "Pridať trasu" + +#: ../src/viktrwlayer.c:449 +#, fuzzy +msgid "Edit Route" +msgstr "Pridať trasu" + +#: ../src/viktrwlayer.c:460 +msgid "Route _Finder" +msgstr "" + +#: ../src/viktrwlayer.c:460 +msgid "Route Finder" +msgstr "" + +#: ../src/viktrwlayer.c:471 +msgid "Splitter" +msgstr "" + +#: ../src/viktrwlayer.c:482 +msgid "_Edit Waypoint" +msgstr "" + +#: ../src/viktrwlayer.c:482 +msgid "Edit Waypoint" +msgstr "" + +#: ../src/viktrwlayer.c:495 +msgid "Edit Trac_kpoint" +msgstr "" + +#: ../src/viktrwlayer.c:495 +msgid "Edit Trackpoint" +msgstr "" + +#. a pixbuf for this one is already made globally available +#: ../src/viktrwlayer.c:508 +msgid "Show P_icture" +msgstr "" + +#: ../src/viktrwlayer.c:508 +msgid "Show Picture" +msgstr "" + +#: ../src/viktrwlayer.c:531 +msgid "Waypoint Images" +msgstr "" + +#: ../src/viktrwlayer.c:531 +msgid "Tracks Advanced" +msgstr "" + +#: ../src/viktrwlayer.c:531 +msgid "Metadata" +msgstr "" + +#: ../src/viktrwlayer.c:531 +#, fuzzy +msgid "Filesystem" +msgstr "Typ súboru:" + +#: ../src/viktrwlayer.c:534 +msgid "Draw by Track" +msgstr "" + +#: ../src/viktrwlayer.c:534 +msgid "Draw by Speed" +msgstr "" + +#: ../src/viktrwlayer.c:534 +msgid "All Tracks Same Color" +msgstr "" + +#: ../src/viktrwlayer.c:535 +msgid "Filled Square" +msgstr "" + +#: ../src/viktrwlayer.c:535 +msgid "Square" +msgstr "" + +#: ../src/viktrwlayer.c:535 +msgid "Circle" +msgstr "" + +#: ../src/viktrwlayer.c:535 +msgid "X" +msgstr "" + +#: ../src/viktrwlayer.c:561 +msgid "Extra Extra Small" +msgstr "" + +#: ../src/viktrwlayer.c:562 +msgid "Extra Small" +msgstr "" + +#: ../src/viktrwlayer.c:566 +msgid "Extra Large" +msgstr "" + +#: ../src/viktrwlayer.c:567 +msgid "Extra Extra Large" +msgstr "" + +#: ../src/viktrwlayer.c:573 +msgid "Name Ascending" +msgstr "" + +#: ../src/viktrwlayer.c:574 +msgid "Name Descending" +msgstr "" + +#: ../src/viktrwlayer.c:582 ../src/viktrwlayer_propwin.c:3319 +msgid "No" +msgstr "" + +#: ../src/viktrwlayer.c:583 +msgid "Yes" +msgstr "" + +#: ../src/viktrwlayer.c:584 +msgid "No write" +msgstr "" + +#: ../src/viktrwlayer.c:649 ../src/viktrwlayer.c:673 +msgid "Draw Labels" +msgstr "" + +#: ../src/viktrwlayer.c:650 +msgid "Note: the individual track controls what labels may be displayed" +msgstr "" + +#: ../src/viktrwlayer.c:651 +msgid "Track Labels Font Size:" +msgstr "" + +#: ../src/viktrwlayer.c:652 +msgid "Track Drawing Mode:" +msgstr "" + +#: ../src/viktrwlayer.c:653 +msgid "All Tracks Color:" +msgstr "" + +#: ../src/viktrwlayer.c:654 +msgid "The color used when 'All Tracks Same Color' drawing mode is selected" +msgstr "" + +#: ../src/viktrwlayer.c:655 +msgid "Draw Track Lines" +msgstr "" + +#: ../src/viktrwlayer.c:656 +msgid "Track Thickness:" +msgstr "" + +#: ../src/viktrwlayer.c:657 +msgid "Draw Track Direction" +msgstr "" + +#: ../src/viktrwlayer.c:658 +msgid "Direction Size:" +msgstr "" + +#: ../src/viktrwlayer.c:659 +msgid "Draw Trackpoints" +msgstr "" + +#: ../src/viktrwlayer.c:660 +msgid "Trackpoint Size:" +msgstr "" + +#: ../src/viktrwlayer.c:661 +msgid "Draw Elevation" +msgstr "" + +#: ../src/viktrwlayer.c:662 +msgid "Draw Elevation Height %:" +msgstr "" + +#: ../src/viktrwlayer.c:663 +msgid "Draw Stops" +msgstr "" + +#: ../src/viktrwlayer.c:664 +msgid "" +"Whether to draw a marker when trackpoints are at the same position but over " +"the minimum stop length apart in time" +msgstr "" + +#: ../src/viktrwlayer.c:665 +msgid "Min Stop Length (seconds):" +msgstr "" + +#: ../src/viktrwlayer.c:667 +msgid "Track BG Thickness:" +msgstr "" + +#: ../src/viktrwlayer.c:668 +msgid "Track Background Color" +msgstr "" + +#: ../src/viktrwlayer.c:669 +msgid "Draw by Speed Factor (%):" +msgstr "" + +#: ../src/viktrwlayer.c:670 +msgid "" +"The percentage factor away from the average speed determining the color used" +msgstr "" + +#: ../src/viktrwlayer.c:671 +msgid "Track Sort Order:" +msgstr "" + +#: ../src/viktrwlayer.c:674 +msgid "Waypoint Font Size:" +msgstr "" + +#: ../src/viktrwlayer.c:675 +msgid "Waypoint Color:" +msgstr "" + +#: ../src/viktrwlayer.c:676 +msgid "Waypoint Text:" +msgstr "" + +#: ../src/viktrwlayer.c:677 +msgid "Background:" +msgstr "" + +#: ../src/viktrwlayer.c:678 +msgid "Fake BG Color Translucency:" +msgstr "" + +#: ../src/viktrwlayer.c:679 +msgid "Waypoint marker:" +msgstr "" + +#: ../src/viktrwlayer.c:680 +msgid "Waypoint size:" +msgstr "" + +#: ../src/viktrwlayer.c:681 +msgid "Draw Waypoint Symbols:" +msgstr "" + +#: ../src/viktrwlayer.c:682 +msgid "Waypoint Sort Order:" +msgstr "" + +#: ../src/viktrwlayer.c:684 +msgid "Draw Waypoint Images" +msgstr "" + +#: ../src/viktrwlayer.c:685 +msgid "Image Size (pixels):" +msgstr "" + +#: ../src/viktrwlayer.c:686 +msgid "Image Alpha:" +msgstr "" + +#: ../src/viktrwlayer.c:687 +msgid "Image Memory Cache Size:" +msgstr "" + +#: ../src/viktrwlayer.c:690 +msgid "Author" +msgstr "" + +#: ../src/viktrwlayer.c:691 +msgid "Creation Time" +msgstr "" + +#: ../src/viktrwlayer.c:692 +msgid "Keywords" +msgstr "" + +#: ../src/viktrwlayer.c:693 +msgid "External layer:" +msgstr "" + +#: ../src/viktrwlayer.c:693 +msgid "" +"Layer data stored in the Viking file, in an external file, or in an external " +"file but changes are not written to the file (file only loaded at startup)" +msgstr "" + +#: ../src/viktrwlayer.c:694 +msgid "Save layer as:" +msgstr "" + +#: ../src/viktrwlayer.c:694 +msgid "Specify where layer should be saved. Overwrites file if it exists." +msgstr "" + +#: ../src/viktrwlayer.c:798 +msgid "TrackWaypoint" +msgstr "" + +#: ../src/viktrwlayer.c:1999 ../src/viktrwlayer_propwin.c:1469 +#: ../src/viktrwlayer_propwin.c:1471 ../src/vikutils.c:299 +#: ../src/vikutils.c:326 +msgid "miles" +msgstr "" + +#: ../src/viktrwlayer.c:2002 ../src/viktrwlayer_propwin.c:1475 +#: ../src/viktrwlayer_propwin.c:1477 ../src/vikutils.c:303 +#: ../src/vikutils.c:330 +msgid "NM" +msgstr "" + +#. VIK_UNITS_DISTANCE_KILOMETRES: +#: ../src/viktrwlayer.c:2006 ../src/viktrwlayer_propwin.c:1482 +#: ../src/viktrwlayer_propwin.c:1484 ../src/vikutils.c:308 +#: ../src/vikutils.c:335 +msgid "km" +msgstr "" + +#: ../src/viktrwlayer.c:2121 +msgid "start/end" +msgstr "" + +#: ../src/viktrwlayer.c:2133 +msgid "start" +msgstr "" + +#: ../src/viktrwlayer.c:2142 +msgid "end" +msgstr "" + +#: ../src/viktrwlayer.c:3103 +#, c-format +msgid " in %d:%02d hrs:mins" +msgstr "" + +#: ../src/viktrwlayer.c:3107 +#, c-format +msgid "" +"\n" +"%sTotal Length %.1f %s%s" +msgstr "" + +#: ../src/viktrwlayer.c:3131 +#, c-format +msgid "" +"\n" +"Total route length %.1f %s" +msgstr "" + +#: ../src/viktrwlayer.c:3136 +#, c-format +msgid "Tracks: %d - Waypoints: %d - Routes: %d%s%s" +msgstr "" + +#: ../src/viktrwlayer.c:3155 +#, c-format +msgid "Tracks: %d" +msgstr "" + +#: ../src/viktrwlayer.c:3165 +#, c-format +msgid "Routes: %d" +msgstr "" + +#: ../src/viktrwlayer.c:3195 +#, c-format +msgid "- %d:%02d hrs:mins" +msgstr "" + +#: ../src/viktrwlayer.c:3202 +#, c-format +msgid "%s%.1f km %s" +msgstr "" + +#: ../src/viktrwlayer.c:3205 +#, c-format +msgid "%s%.1f miles %s" +msgstr "" + +#: ../src/viktrwlayer.c:3208 +#, c-format +msgid "%s%.1f NM %s" +msgstr "" + +#: ../src/viktrwlayer.c:3222 +#, c-format +msgid "Waypoints: %d" +msgstr "" + +#: ../src/viktrwlayer.c:3279 +#, c-format +msgid "Wpt: Alt %dft" +msgstr "" + +#. VIK_UNITS_HEIGHT_METRES: +#: ../src/viktrwlayer.c:3283 +#, c-format +msgid "Wpt: Alt %dm" +msgstr "" + +#. Add comment if available +#: ../src/viktrwlayer.c:3298 +#, c-format +msgid "%s | %s %s | Comment: %s" +msgstr "" + +#: ../src/viktrwlayer.c:3300 +#, c-format +msgid "%s | %s %s" +msgstr "" + +#: ../src/viktrwlayer.c:3562 ../src/viktrwlayer.c:3591 +msgid "This layer has no waypoints or trackpoints." +msgstr "" + +#: ../src/viktrwlayer.c:3598 ../src/viktrwlayer.c:3607 +#: ../src/viktrwlayer.c:3616 ../src/viktrwlayer.c:3625 +#: ../src/viktrwlayer.c:3634 ../src/viktrwlayer.c:3642 +msgid "Export Layer" +msgstr "" + +#: ../src/viktrwlayer.c:3671 +msgid "Export Route as GPX" +msgstr "" + +#: ../src/viktrwlayer.c:3673 +msgid "Export Track as GPX" +msgstr "" + +#: ../src/viktrwlayer.c:3693 +msgid "Find" +msgstr "" + +#: ../src/viktrwlayer.c:3703 +msgid "Waypoint Name:" +msgstr "" + +#: ../src/viktrwlayer.c:3720 +msgid "Waypoint not found in this layer." +msgstr "" + +#: ../src/viktrwlayer.c:3989 +msgid "Can not upload invisible track." +msgstr "" + +#: ../src/viktrwlayer.c:4082 ../src/viktrwlayer.c:10512 +msgid "Track" +msgstr "" + +#: ../src/viktrwlayer.c:4107 ../src/viktrwlayer.c:10599 +msgid "Route" +msgstr "" + +#: ../src/viktrwlayer.c:4194 +msgid "Externa_l" +msgstr "" + +#: ../src/viktrwlayer.c:4216 ../src/viktrwlayer.c:8456 +#: ../src/viktrwlayer.c:8574 +msgid "_Finish Route" +msgstr "" + +#: ../src/viktrwlayer.c:4218 ../src/viktrwlayer.c:8380 +#: ../src/viktrwlayer.c:8572 +msgid "_Finish Track" +msgstr "" + +#. Now with icons +#: ../src/viktrwlayer.c:4230 +msgid "_View Layer" +msgstr "" + +#: ../src/viktrwlayer.c:4237 +msgid "V_iew" +msgstr "" + +#: ../src/viktrwlayer.c:4243 +msgid "View All _Tracks" +msgstr "" + +#: ../src/viktrwlayer.c:4248 +msgid "View All _Routes" +msgstr "" + +#: ../src/viktrwlayer.c:4253 +msgid "View All _Waypoints" +msgstr "" + +#: ../src/viktrwlayer.c:4258 +msgid "_Goto Center of Layer" +msgstr "" + +#: ../src/viktrwlayer.c:4264 ../src/viktrwlayer.c:8321 +msgid "Goto _Waypoint..." +msgstr "" + +#: ../src/viktrwlayer.c:4270 +msgid "_Export Layer" +msgstr "" + +#: ../src/viktrwlayer.c:4276 +msgid "Export as GPS_Point..." +msgstr "" + +#: ../src/viktrwlayer.c:4281 +msgid "Export as GPS_Mapper..." +msgstr "" + +#: ../src/viktrwlayer.c:4286 +msgid "Export as _GPX..." +msgstr "" + +#: ../src/viktrwlayer.c:4292 +msgid "Export as _KML..." +msgstr "" + +#: ../src/viktrwlayer.c:4299 +msgid "Export as GEO_JSON..." +msgstr "" + +#: ../src/viktrwlayer.c:4306 +msgid "Export via GPSbabel..." +msgstr "" + +#: ../src/viktrwlayer.c:4312 +#, c-format +msgid "Open with External Program_1: %s" +msgstr "" + +#: ../src/viktrwlayer.c:4319 +#, c-format +msgid "Open with External Program_2: %s" +msgstr "" + +#: ../src/viktrwlayer.c:4327 ../src/vikwindow.c:4825 +msgid "_New" +msgstr "" + +#: ../src/viktrwlayer.c:4333 +msgid "New _Waypoint..." +msgstr "" + +#: ../src/viktrwlayer.c:4339 +msgid "New _Track" +msgstr "" + +#: ../src/viktrwlayer.c:4347 +msgid "New _Route" +msgstr "" + +#: ../src/viktrwlayer.c:4356 ../src/viktrwlayer.c:8232 +#: ../src/viktrwlayer.c:9003 +msgid "Geotag _Images..." +msgstr "" + +#: ../src/viktrwlayer.c:4363 +msgid "_Acquire" +msgstr "" + +#: ../src/viktrwlayer.c:4369 ../src/vikwindow.c:4904 +msgid "From _GPS..." +msgstr "" + +#. FIXME: only add menu when at least a routing engine has support for Directions +#: ../src/viktrwlayer.c:4375 +msgid "From _Directions..." +msgstr "" + +#: ../src/viktrwlayer.c:4381 +msgid "From _OSM Traces..." +msgstr "" + +#: ../src/viktrwlayer.c:4386 +msgid "From _My OSM Traces..." +msgstr "" + +#: ../src/viktrwlayer.c:4392 ../src/vikwindow.c:4844 +msgid "From _URL..." +msgstr "" + +#: ../src/viktrwlayer.c:4399 ../src/vikwindow.c:4846 +msgid "From _Wikipedia Waypoints" +msgstr "" + +#: ../src/viktrwlayer.c:4405 +msgid "Within _Layer Bounds" +msgstr "" + +#: ../src/viktrwlayer.c:4411 +msgid "Within _Current View" +msgstr "" + +#: ../src/viktrwlayer.c:4419 +msgid "From Geo_caching..." +msgstr "" + +#: ../src/viktrwlayer.c:4426 ../src/vikwindow.c:4842 +msgid "From Geotagged _Images..." +msgstr "" + +#: ../src/viktrwlayer.c:4433 +msgid "From _File..." +msgstr "" + +#: ../src/viktrwlayer.c:4436 ../src/vikwindow.c:4905 +msgid "Import File With GPS_Babel..." +msgstr "" + +#: ../src/viktrwlayer.c:4443 ../src/viktrwlayer.c:8905 +msgid "_Upload" +msgstr "" + +#: ../src/viktrwlayer.c:4449 +msgid "Upload to _GPS..." +msgstr "" + +#: ../src/viktrwlayer.c:4456 ../src/viktrwlayer.c:8973 +msgid "Upload to _OSM..." +msgstr "" + +#: ../src/viktrwlayer.c:4464 +msgid "De_lete" +msgstr "" + +#: ../src/viktrwlayer.c:4470 +msgid "Delete All _Tracks" +msgstr "" + +#: ../src/viktrwlayer.c:4477 +msgid "Delete Tracks _From Selection..." +msgstr "" + +#: ../src/viktrwlayer.c:4484 ../src/viktrwlayer.c:8481 +msgid "Delete _All Routes" +msgstr "" + +#: ../src/viktrwlayer.c:4491 ../src/viktrwlayer.c:8487 +msgid "_Delete Routes From Selection..." +msgstr "" + +#: ../src/viktrwlayer.c:4498 +msgid "Delete All _Waypoints" +msgstr "" + +#: ../src/viktrwlayer.c:4505 +msgid "Delete Waypoints From _Selection..." +msgstr "" + +#: ../src/viktrwlayer.c:4512 ../src/viktrwlayer.c:8339 +msgid "Delete Duplicate Waypoints" +msgstr "" + +#: ../src/viktrwlayer.c:5198 +#, c-format +msgid "Are you sure you want to delete all tracks in %s?" +msgstr "" + +#: ../src/viktrwlayer.c:5211 +#, c-format +msgid "Are you sure you want to delete all routes in %s?" +msgstr "" + +#: ../src/viktrwlayer.c:5221 +#, c-format +msgid "Are you sure you want to delete all waypoints in %s?" +msgstr "" + +#: ../src/viktrwlayer.c:5238 +#, c-format +msgid "Are you sure you want to delete the waypoint \"%s\"?" +msgstr "" + +#: ../src/viktrwlayer.c:5254 +#, c-format +msgid "Are you sure you want to delete the track \"%s\"?" +msgstr "" + +#: ../src/viktrwlayer.c:5271 +#, c-format +msgid "Are you sure you want to delete the route \"%s\"?" +msgstr "" + +#: ../src/viktrwlayer.c:5527 ../src/viktrwlayer.c:6373 +msgid "" +"Converting a track to a route removes extra track data such as segments, " +"timestamps, etc...\n" +"Do you want to continue?" +msgstr "" + +#: ../src/viktrwlayer.c:5631 +msgid "No DEM layers available, thus no DEM values can be applied." +msgstr "" + +#: ../src/viktrwlayer.c:5651 ../src/viktrwlayer.c:5692 +#, c-format +msgid "%ld point adjusted" +msgid_plural "%ld points adjusted" +msgstr[0] "" +msgstr[1] "" + +#: ../src/viktrwlayer.c:5736 +#, c-format +msgid "%ld waypoint changed" +msgid_plural "%ld waypoints changed" +msgstr[0] "" +msgstr[1] "" + +#: ../src/viktrwlayer.c:5917 +#, c-format +msgid "" +"Refining a track with many points (%d) is unlikely to yield sensible " +"results. Do you want to Continue?" +msgstr "" + +#. Select engine from dialog +#: ../src/viktrwlayer.c:5925 +msgid "Refine Route with Routing Engine..." +msgstr "" + +#: ../src/viktrwlayer.c:5933 +msgid "Select routing engine" +msgstr "" + +#: ../src/viktrwlayer.c:6158 +msgid "Failed. No other tracks with timestamps in this layer found" +msgstr "" + +#: ../src/viktrwlayer.c:6160 +msgid "Failed. No other tracks without timestamps in this layer found" +msgstr "" + +#: ../src/viktrwlayer.c:6179 +msgid "Merge with..." +msgstr "" + +#: ../src/viktrwlayer.c:6180 +msgid "Select route to merge with" +msgstr "" + +#: ../src/viktrwlayer.c:6180 +msgid "Select track to merge with" +msgstr "" + +#: ../src/viktrwlayer.c:6264 ../src/viktrwlayer.c:6346 +msgid "Append Route" +msgstr "" + +#: ../src/viktrwlayer.c:6264 ../src/viktrwlayer.c:6346 +msgid "Append Track" +msgstr "" + +#: ../src/viktrwlayer.c:6265 +msgid "Select the route to append after the current route" +msgstr "" + +#: ../src/viktrwlayer.c:6266 +msgid "Select the track to append after the current track" +msgstr "" + +#: ../src/viktrwlayer.c:6347 +msgid "Select the track to append after the current route" +msgstr "" + +#: ../src/viktrwlayer.c:6348 +msgid "Select the route to append after the current track" +msgstr "" + +#: ../src/viktrwlayer.c:6414 +#, c-format +msgid "%d segment merged" +msgid_plural "%d segments merged" +msgstr[0] "" +msgstr[1] "" + +#: ../src/viktrwlayer.c:6430 +msgid "Failed. This track does not have timestamp" +msgstr "" + +#: ../src/viktrwlayer.c:6442 +msgid "Failed. No other track in this layer has timestamp" +msgstr "" + +#: ../src/viktrwlayer.c:6449 +msgid "Merge Threshold..." +msgstr "" + +#: ../src/viktrwlayer.c:6450 +msgid "Merge when time between tracks less than:" +msgstr "" + +#: ../src/viktrwlayer.c:6580 +msgid "Split Threshold..." +msgstr "" + +#: ../src/viktrwlayer.c:6581 +msgid "Split when time between trackpoints exceeds:" +msgstr "" + +#: ../src/viktrwlayer.c:6598 +#, c-format +msgid "" +"Can not split track due to trackpoints not ordered in time - such as at %s.\n" +"\n" +"Goto this trackpoint?" +msgstr "" + +#: ../src/viktrwlayer.c:6668 +msgid "Split Every Nth Point" +msgstr "" + +#: ../src/viktrwlayer.c:6669 +msgid "Split on every Nth point:" +msgstr "" + +#: ../src/viktrwlayer.c:6779 +msgid "Can not split track as it has no segments" +msgstr "" + +#: ../src/viktrwlayer.c:6861 ../src/viktrwlayer.c:6891 +#, c-format +msgid "Deleted %ld point" +msgid_plural "Deleted %ld points" +msgstr[0] "" +msgstr[1] "" + +#: ../src/viktrwlayer.c:6966 ../src/viktrwlayer.c:10989 +#: ../src/viktrwlayer_waypointlist.c:214 +#, c-format +msgid "Could not launch %s to open file." +msgstr "" + +#: ../src/viktrwlayer.c:6992 ../src/viktrwlayer.c:7113 +msgid "This track has no date information." +msgstr "" + +#: ../src/viktrwlayer.c:7006 ../src/viktrwlayer.c:7136 +msgid "This waypoint has no date information." +msgstr "" + +#: ../src/viktrwlayer.c:7030 +#, c-format +msgid "Could not launch %s" +msgstr "" + +#: ../src/viktrwlayer.c:7269 +msgid "Internal Error in vik_trw_layer_uniquify_tracks" +msgstr "" + +#: ../src/viktrwlayer.c:7374 ../src/viktrwlayer.c:7424 +#: ../src/viktrwlayer.c:7587 +msgid "" +"Multiple entries with the same name exist. This method only works with " +"unique names. Force unique names now?" +msgstr "" + +#: ../src/viktrwlayer.c:7385 +msgid "No tracks found" +msgstr "" + +#: ../src/viktrwlayer.c:7393 ../src/viktrwlayer.c:7443 +#: ../src/viktrwlayer.c:7607 +msgid "Delete Selection" +msgstr "" + +#: ../src/viktrwlayer.c:7394 +msgid "Select tracks to delete" +msgstr "" + +#: ../src/viktrwlayer.c:7435 +msgid "No routes found" +msgstr "" + +#: ../src/viktrwlayer.c:7444 +msgid "Select routes to delete" +msgstr "" + +#: ../src/viktrwlayer.c:7550 +msgid "Internal Error in vik_trw_layer_uniquify_waypoints" +msgstr "" + +#: ../src/viktrwlayer.c:7597 +msgid "No waypoints found" +msgstr "" + +#: ../src/viktrwlayer.c:7608 +msgid "Select waypoints to delete" +msgstr "" + +#: ../src/viktrwlayer.c:7691 +#, c-format +msgid "%ld waypoint deleted" +msgid_plural "%ld waypoints deleted" +msgstr[0] "" +msgstr[1] "" +msgstr[2] "" + +#: ../src/viktrwlayer.c:7697 +#, fuzzy +msgid "No duplicates found" +msgstr "Neboli nájdené žiadne záznamy" + +#: ../src/viktrwlayer.c:8028 +#, c-format +msgid "" +"A waypoint with the name \"%s\" already exists. Really rename to the same " +"name?" +msgstr "" + +#: ../src/viktrwlayer.c:8058 +#, c-format +msgid "" +"A track with the name \"%s\" already exists. Really rename to the same name?" +msgstr "" + +#: ../src/viktrwlayer.c:8095 +#, c-format +msgid "" +"A route with the name \"%s\" already exists. Really rename to the same name?" +msgstr "" + +#: ../src/viktrwlayer.c:8215 ../src/viktrwlayer.c:8602 +msgid "_Goto" +msgstr "" + +#: ../src/viktrwlayer.c:8226 +msgid "_Visit Geocache Webpage" +msgstr "" + +#: ../src/viktrwlayer.c:8235 +msgid "Geotag multiple images against this waypoint" +msgstr "" + +#: ../src/viktrwlayer.c:8245 ../src/viktrwlayer_waypointlist.c:352 +msgid "_Show Picture..." +msgstr "" + +#: ../src/viktrwlayer.c:8253 +msgid "Update Geotag on _Image" +msgstr "" + +#: ../src/viktrwlayer.c:8259 +msgid "_Update" +msgstr "" + +#: ../src/viktrwlayer.c:8264 +msgid "Update and _Keep File Timestamp" +msgstr "" + +#: ../src/viktrwlayer.c:8276 +msgid "Visit _Webpage" +msgstr "" + +#: ../src/viktrwlayer.c:8306 +msgid "_New Waypoint..." +msgstr "" + +#: ../src/viktrwlayer.c:8315 +msgid "_View All Waypoints" +msgstr "" + +#: ../src/viktrwlayer.c:8327 +msgid "Delete _All Waypoints" +msgstr "" + +#: ../src/viktrwlayer.c:8333 +msgid "_Delete Waypoints From Selection..." +msgstr "" + +#: ../src/viktrwlayer.c:8351 +msgid "_Show All Waypoints" +msgstr "" + +#: ../src/viktrwlayer.c:8357 +msgid "_Hide All Waypoints" +msgstr "" + +#: ../src/viktrwlayer.c:8369 +msgid "_List Waypoints..." +msgstr "" + +#: ../src/viktrwlayer.c:8390 +msgid "_View All Tracks" +msgstr "" + +#: ../src/viktrwlayer.c:8396 +msgid "_New Track" +msgstr "" + +#: ../src/viktrwlayer.c:8404 +msgid "Delete _All Tracks" +msgstr "" + +#: ../src/viktrwlayer.c:8410 +msgid "_Delete Tracks From Selection..." +msgstr "" + +#: ../src/viktrwlayer.c:8422 +msgid "_Show All Tracks" +msgstr "" + +#: ../src/viktrwlayer.c:8428 +msgid "_Hide All Tracks" +msgstr "" + +#: ../src/viktrwlayer.c:8439 +msgid "_List Tracks..." +msgstr "" + +#: ../src/viktrwlayer.c:8467 +msgid "_View All Routes" +msgstr "" + +#: ../src/viktrwlayer.c:8473 +msgid "_New Route" +msgstr "" + +#: ../src/viktrwlayer.c:8499 +msgid "_Show All Routes" +msgstr "" + +#: ../src/viktrwlayer.c:8505 +msgid "_Hide All Routes" +msgstr "" + +#: ../src/viktrwlayer.c:8516 +msgid "_List Routes..." +msgstr "" + +#: ../src/viktrwlayer.c:8587 +msgid "_View Track" +msgstr "" + +#: ../src/viktrwlayer.c:8589 +msgid "_View Route" +msgstr "" + +#: ../src/viktrwlayer.c:8608 +msgid "_Startpoint" +msgstr "" + +#: ../src/viktrwlayer.c:8614 +msgid "\"_Center\"" +msgstr "" + +#: ../src/viktrwlayer.c:8620 +msgid "_Endpoint" +msgstr "" + +#: ../src/viktrwlayer.c:8626 +msgid "_Highest Altitude" +msgstr "" + +#: ../src/viktrwlayer.c:8632 +msgid "_Lowest Altitude" +msgstr "" + +#: ../src/viktrwlayer.c:8640 +msgid "_Maximum Speed" +msgstr "" + +#: ../src/viktrwlayer.c:8646 +msgid "_Date" +msgstr "" + +#: ../src/viktrwlayer.c:8655 +msgid "Co_mbine" +msgstr "" + +#: ../src/viktrwlayer.c:8663 +msgid "_Merge By Time..." +msgstr "" + +#: ../src/viktrwlayer.c:8668 +msgid "Merge _Segments" +msgstr "" + +#: ../src/viktrwlayer.c:8675 +msgid "Merge _With Other Tracks..." +msgstr "" + +#: ../src/viktrwlayer.c:8682 +msgid "_Append Track..." +msgstr "" + +#: ../src/viktrwlayer.c:8684 +msgid "_Append Route..." +msgstr "" + +#: ../src/viktrwlayer.c:8690 +msgid "Append _Route..." +msgstr "" + +#: ../src/viktrwlayer.c:8692 +msgid "Append _Track..." +msgstr "" + +#: ../src/viktrwlayer.c:8699 +msgid "_Split" +msgstr "" + +#: ../src/viktrwlayer.c:8707 +msgid "_Split By Time..." +msgstr "" + +#. ATM always enable this entry - don't want to have to analyse the track before displaying the menu - to keep the menu speedy +#: ../src/viktrwlayer.c:8713 +msgid "Split Se_gments" +msgstr "" + +#: ../src/viktrwlayer.c:8719 +msgid "Split By _Number of Points..." +msgstr "" + +#: ../src/viktrwlayer.c:8724 +msgid "Split at _Trackpoint" +msgstr "" + +#: ../src/viktrwlayer.c:8732 +msgid "_Insert Points" +msgstr "" + +#: ../src/viktrwlayer.c:8738 +msgid "Insert Point _Before Selected Point" +msgstr "" + +#: ../src/viktrwlayer.c:8745 +msgid "Insert Point _After Selected Point" +msgstr "" + +#: ../src/viktrwlayer.c:8754 +msgid "Delete Poi_nts" +msgstr "" + +#: ../src/viktrwlayer.c:8760 +msgid "Delete _Selected Point" +msgstr "" + +#: ../src/viktrwlayer.c:8768 +msgid "Delete Points With The Same _Position" +msgstr "" + +#: ../src/viktrwlayer.c:8773 +msgid "Delete Points With The Same _Time" +msgstr "" + +#: ../src/viktrwlayer.c:8780 ../src/viktrwlayer.c:9029 +msgid "_Transform" +msgstr "" + +#: ../src/viktrwlayer.c:8788 ../src/viktrwlayer.c:9037 +msgid "_Apply DEM Data" +msgstr "" + +#: ../src/viktrwlayer.c:8793 ../src/viktrwlayer.c:9042 +msgid "_Overwrite" +msgstr "" + +#: ../src/viktrwlayer.c:8796 ../src/viktrwlayer.c:9045 +msgid "Overwrite any existing elevation values with DEM values" +msgstr "" + +#: ../src/viktrwlayer.c:8799 ../src/viktrwlayer.c:9048 +msgid "_Keep Existing" +msgstr "" + +#: ../src/viktrwlayer.c:8802 ../src/viktrwlayer.c:9051 +msgid "Keep existing elevation values, only attempt for missing values" +msgstr "" + +#: ../src/viktrwlayer.c:8807 +msgid "_Smooth Missing Elevation Data" +msgstr "" + +#: ../src/viktrwlayer.c:8812 +msgid "_Interpolated" +msgstr "" + +#: ../src/viktrwlayer.c:8815 +msgid "" +"Interpolate between known elevation values to derive values for the missing " +"elevations" +msgstr "" + +#: ../src/viktrwlayer.c:8818 +msgid "_Flat" +msgstr "" + +#: ../src/viktrwlayer.c:8821 +msgid "Set unknown elevation values to the last known value" +msgstr "" + +#: ../src/viktrwlayer.c:8825 +msgid "C_onvert to a Route" +msgstr "" + +#: ../src/viktrwlayer.c:8827 +msgid "C_onvert to a Track" +msgstr "" + +#: ../src/viktrwlayer.c:8835 +msgid "_Anonymize Times" +msgstr "" + +#: ../src/viktrwlayer.c:8838 +msgid "Shift timestamps to a relative offset from 1901-01-01" +msgstr "" + +#: ../src/viktrwlayer.c:8841 +msgid "_Interpolate Times" +msgstr "" + +#: ../src/viktrwlayer.c:8844 +msgid "" +"Reset trackpoint timestamps between the first and last points such that " +"track is traveled at equal speed" +msgstr "" + +#: ../src/viktrwlayer.c:8849 +msgid "_Reverse Track" +msgstr "" + +#: ../src/viktrwlayer.c:8851 +msgid "_Reverse Route" +msgstr "" + +#: ../src/viktrwlayer.c:8858 +msgid "Refine Route..." +msgstr "" + +#: ../src/viktrwlayer.c:8868 +msgid "Down_load Maps Along Track..." +msgstr "" + +#: ../src/viktrwlayer.c:8870 +msgid "Down_load Maps Along Route..." +msgstr "" + +#: ../src/viktrwlayer.c:8878 +msgid "_Export Track as GPX..." +msgstr "" + +#: ../src/viktrwlayer.c:8880 +msgid "_Export Route as GPX..." +msgstr "" + +#: ../src/viktrwlayer.c:8887 +msgid "E_xtend Track End" +msgstr "" + +#: ../src/viktrwlayer.c:8889 +msgid "E_xtend Route End" +msgstr "" + +#: ../src/viktrwlayer.c:8896 +msgid "Extend _Using Route Finder" +msgstr "" + +#: ../src/viktrwlayer.c:8911 +msgid "_Upload to GPS..." +msgstr "" + +#: ../src/viktrwlayer.c:8926 +msgid "_Diary" +msgstr "" + +#: ../src/viktrwlayer.c:8930 +msgid "Open diary program at this date" +msgstr "" + +#: ../src/viktrwlayer.c:8935 +msgid "_Astronomy" +msgstr "" + +#: ../src/viktrwlayer.c:8938 +msgid "Open astronomy program at this date and location" +msgstr "" + +#: ../src/viktrwlayer.c:8962 +msgid "_View Google Directions" +msgstr "" + +#: ../src/viktrwlayer.c:8984 +msgid "Use with _Filter" +msgstr "" + +#: ../src/viktrwlayer.c:9018 +msgid "_Edit Trackpoint" +msgstr "" + +#: ../src/viktrwlayer.c:10116 +#, c-format +msgid " - Gain %dm:Loss %dm" +msgstr "" + +#: ../src/viktrwlayer.c:10118 +#, c-format +msgid " - Gain %dft:Loss %dft" +msgstr "" + +#: ../src/viktrwlayer.c:10123 +#, c-format +msgid " - Bearing %3.1f° - Step %s" +msgstr "" + +#: ../src/viktrwlayer.c:10232 +#, c-format +msgid "Querying %s for route between (%.3f, %.3f) and (%.3f, %.3f)." +msgstr "" + +#: ../src/viktrwlayer.c:10248 +#, c-format +msgid "%s returned route between (%.3f, %.3f) and (%.3f, %.3f)." +msgstr "" + +#: ../src/viktrwlayer.c:10251 +#, c-format +msgid "Error getting route from %s." +msgstr "" + +#: ../src/viktrwlayer.c:11070 +#, c-format +msgid "Creating %d Image Thumbnails..." +msgstr "" + +#: ../src/viktrwlayer.c:11560 +msgid "No map layer in use. Create one first" +msgstr "" + +#: ../src/viktrwlayer.c:11679 +#, c-format +msgid "%s: Track List" +msgstr "" + +#: ../src/viktrwlayer.c:11681 +#, c-format +msgid "%s: Route List" +msgstr "" + +#: ../src/viktrwlayer.c:11734 +#, c-format +msgid "" +"Could not write external layer %s to %s, please fix and save before exiting " +"or data will be lost" +msgstr "" + +#: ../src/viktrwlayer.c:11782 +#, c-format +msgid "WARNING: issues encountered loading external layer %s from %s" +msgstr "" + +#: ../src/viktrwlayer_export.c:47 +msgid "Auto Device GPX Simplify:" +msgstr "" + +#: ../src/viktrwlayer_export.c:48 +msgid "" +"GPX saves to certain devices will be simplified for device compatibility." +msgstr "" + +#: ../src/viktrwlayer_export.c:125 +#, c-format +msgid "Export of GPX file simplified using point limit: %d" +msgstr "" + +#: ../src/viktrwlayer_export.c:206 ../src/viktrwlayer_export.c:323 +#: ../src/vikwindow.c:3694 +msgid "The filename you requested could not be opened for writing." +msgstr "" + +#: ../src/viktrwlayer_export.c:226 +#, c-format +msgid "Could not launch %s." +msgstr "" + +#: ../src/viktrwlayer_export.c:234 +msgid "Could not create temporary file for export." +msgstr "" + +#: ../src/viktrwlayer_export.c:268 +msgid "File format:" +msgstr "" + +#: ../src/viktrwlayer_export.c:276 +msgid "Select the file format." +msgstr "" + +#: ../src/viktrwlayer_export.c:281 +msgid "" +"Select the information to process.\n" +"Warning: the behavior of these switches is highly dependent of the file " +"format selected.\n" +"Please, refer to GPSbabel if unsure." +msgstr "" + +#: ../src/viktrwlayer_export.c:308 +msgid "You did not select a valid file format." +msgstr "" + +#: ../src/viktrwlayer_propwin.c:915 ../src/viktrwlayer_propwin.c:3381 +#: ../src/viktrwlayer_propwin.c:3417 ../src/viktrwlayer_propwin.c:3457 +#: ../src/viktrwlayer_propwin.c:3509 ../src/viktrwlayer_propwin.c:3527 +#: ../src/viktrwlayer_propwin.c:3600 ../src/viktrwlayer_propwin.c:3601 +#: ../src/viktrwlayer_propwin.c:3602 ../src/viktrwlayer_propwin.c:3611 +#: ../src/viktrwlayer_propwin.c:3612 ../src/viktrwlayer_propwin.c:3629 +#: ../src/viktrwlayer_propwin.c:3630 ../src/viktrwlayer_propwin.c:3644 +#: ../src/viktrwlayer_propwin.c:3645 ../src/viktrwlayer_propwin.c:3646 +#: ../src/viktrwlayer_propwin.c:3660 ../src/viktrwlayer_propwin.c:3661 +#: ../src/viktrwlayer_propwin.c:3662 ../src/viktrwlayer_propwin.c:3676 +#: ../src/viktrwlayer_propwin.c:3677 ../src/viktrwlayer_propwin.c:3678 +#: ../src/viktrwlayer_propwin.c:3695 ../src/viktrwlayer_propwin.c:3696 +#: ../src/viktrwlayer_analysis.c:293 +#, c-format +msgid "No Data" +msgstr "" + +#: ../src/viktrwlayer_propwin.c:960 ../src/viktrwlayer_propwin.c:1245 +#, c-format +msgid "%.1f kph" +msgstr "" + +#: ../src/viktrwlayer_propwin.c:963 ../src/viktrwlayer_propwin.c:1248 +#: ../src/viktrwlayer_analysis.c:352 +#, c-format +msgid "%.1f mph" +msgstr "" + +#: ../src/viktrwlayer_propwin.c:966 ../src/viktrwlayer_propwin.c:1251 +#, c-format +msgid "%.1f knots" +msgstr "" + +#: ../src/viktrwlayer_propwin.c:969 ../src/viktrwlayer_propwin.c:1254 +#, c-format +msgid "%.1f s/km" +msgstr "" + +#: ../src/viktrwlayer_propwin.c:972 ../src/viktrwlayer_propwin.c:1257 +#: ../src/viktrwlayer_analysis.c:389 ../src/viktrwlayer_analysis.c:392 +#, fuzzy, c-format +msgid "%.1f min/km" +msgstr "1 min" + +#: ../src/viktrwlayer_propwin.c:975 ../src/viktrwlayer_propwin.c:1260 +#, c-format +msgid "%.1f sec/mi" +msgstr "" + +#: ../src/viktrwlayer_propwin.c:978 ../src/viktrwlayer_propwin.c:1263 +#: ../src/viktrwlayer_analysis.c:409 ../src/viktrwlayer_analysis.c:412 +#, fuzzy, c-format +msgid "%.1f min/mi" +msgstr "1 min" + +#. VIK_UNITS_SPEED_METRES_PER_SECOND: +#: ../src/viktrwlayer_propwin.c:982 ../src/viktrwlayer_propwin.c:1267 +#, c-format +msgid "%.1f m/s" +msgstr "" + +#. Minutes +#: ../src/viktrwlayer_propwin.c:1411 +msgid "mins" +msgstr "" + +#. Hours +#: ../src/viktrwlayer_propwin.c:1418 +msgid "h" +msgstr "" + +#. Days +#: ../src/viktrwlayer_propwin.c:1424 +msgid "d" +msgstr "" + +#. Weeks +#: ../src/viktrwlayer_propwin.c:1429 +msgid "w" +msgstr "" + +#. 'Months' +#: ../src/viktrwlayer_propwin.c:1433 +msgid "M" +msgstr "" + +#: ../src/viktrwlayer_propwin.c:2051 ../src/viktrwlayer_analysis.c:303 +#, c-format +msgid "%.1f miles" +msgstr "" + +#: ../src/viktrwlayer_propwin.c:2054 ../src/viktrwlayer_analysis.c:306 +#, c-format +msgid "%.1f NM" +msgstr "" + +#. VIK_UNITS_DISTANCE_KILOMETRES +#: ../src/viktrwlayer_propwin.c:2057 ../src/viktrwlayer_analysis.c:310 +#, c-format +msgid "%.1f km" +msgstr "" + +#: ../src/viktrwlayer_propwin.c:3083 +msgid "Failed spliting track. Track unchanged" +msgstr "" + +#: ../src/viktrwlayer_propwin.c:3234 ../src/viktrwlayer_propwin.c:3744 +#, c-format +msgid "%s - Track Properties" +msgstr "" + +#: ../src/viktrwlayer_propwin.c:3239 +msgid "Split at _Marker" +msgstr "" + +#: ../src/viktrwlayer_propwin.c:3240 +msgid "Split _Segments" +msgstr "" + +#: ../src/viktrwlayer_propwin.c:3241 +msgid "_Reverse" +msgstr "" + +#: ../src/viktrwlayer_propwin.c:3242 +msgid "_Delete Dupl." +msgstr "" + +#: ../src/viktrwlayer_propwin.c:3269 +msgid "Comment:" +msgstr "" + +#: ../src/viktrwlayer_propwin.c:3270 +msgid "Description:" +msgstr "" + +#: ../src/viktrwlayer_propwin.c:3271 +msgid "Source:" +msgstr "" + +#: ../src/viktrwlayer_propwin.c:3272 +msgid "Type:" +msgstr "" + +#: ../src/viktrwlayer_propwin.c:3273 +msgid "Color:" +msgstr "" + +#: ../src/viktrwlayer_propwin.c:3274 +msgid "Draw Name:" +msgstr "" + +#: ../src/viktrwlayer_propwin.c:3275 +msgid "Distance Labels:" +msgstr "" + +#: ../src/viktrwlayer_propwin.c:3278 +msgid "Track Length:" +msgstr "" + +#: ../src/viktrwlayer_propwin.c:3279 +msgid "Trackpoints:" +msgstr "" + +#: ../src/viktrwlayer_propwin.c:3280 +msgid "Segments:" +msgstr "" + +#: ../src/viktrwlayer_propwin.c:3281 +msgid "Duplicate Points:" +msgstr "" + +#: ../src/viktrwlayer_propwin.c:3282 +msgid "Max Speed:" +msgstr "" + +#: ../src/viktrwlayer_propwin.c:3283 +msgid "Avg. Speed:" +msgstr "" + +#: ../src/viktrwlayer_propwin.c:3284 +msgid "Moving Avg. Speed:" +msgstr "" + +#: ../src/viktrwlayer_propwin.c:3285 +msgid "Avg. Dist. Between TPs:" +msgstr "" + +#: ../src/viktrwlayer_propwin.c:3286 +msgid "Elevation Range:" +msgstr "" + +#: ../src/viktrwlayer_propwin.c:3287 +msgid "Total Elevation Gain/Loss:" +msgstr "" + +#: ../src/viktrwlayer_propwin.c:3288 +msgid "Start:" +msgstr "" + +#: ../src/viktrwlayer_propwin.c:3289 +msgid "End:" +msgstr "" + +#: ../src/viktrwlayer_propwin.c:3290 +msgid "Duration:" +msgstr "" + +#: ../src/viktrwlayer_propwin.c:3320 +msgid "Centre" +msgstr "" + +#: ../src/viktrwlayer_propwin.c:3321 +msgid "Start only" +msgstr "" + +#: ../src/viktrwlayer_propwin.c:3322 +msgid "End only" +msgstr "" + +#: ../src/viktrwlayer_propwin.c:3323 +msgid "Start and End" +msgstr "" + +#: ../src/viktrwlayer_propwin.c:3324 +msgid "Centre, Start and End" +msgstr "" + +#: ../src/viktrwlayer_propwin.c:3336 +msgid "Maximum number of distance labels to be shown" +msgstr "" + +#: ../src/viktrwlayer_propwin.c:3340 +msgid "Properties" +msgstr "" + +#: ../src/viktrwlayer_propwin.c:3584 +#, c-format +msgid "%d minutes - %d minutes moving" +msgstr "" + +#: ../src/viktrwlayer_propwin.c:3596 +#, c-format +msgid "%s total - %s in segments" +msgstr "" + +#: ../src/viktrwlayer_propwin.c:3607 ../src/viktrwlayer_analysis.c:622 +msgid "Statistics" +msgstr "" + +#: ../src/viktrwlayer_propwin.c:3613 ../src/viktrwlayer_propwin.c:3680 +msgid "Show D_EM" +msgstr "" + +#: ../src/viktrwlayer_propwin.c:3615 ../src/viktrwlayer_propwin.c:3631 +#: ../src/viktrwlayer_propwin.c:3647 ../src/viktrwlayer_propwin.c:3697 +msgid "Show _GPS Speed" +msgstr "" + +#: ../src/viktrwlayer_propwin.c:3617 ../src/viktrwlayer_propwin.c:3633 +#: ../src/viktrwlayer_propwin.c:3665 ../src/viktrwlayer_propwin.c:3699 +msgid "Track Distance:" +msgstr "" + +#: ../src/viktrwlayer_propwin.c:3618 ../src/viktrwlayer_propwin.c:3684 +msgid "Track Height:" +msgstr "" + +#: ../src/viktrwlayer_propwin.c:3624 +msgid "Elevation-distance" +msgstr "" + +#: ../src/viktrwlayer_propwin.c:3634 +msgid "Track Gradient:" +msgstr "" + +#: ../src/viktrwlayer_propwin.c:3639 +msgid "Gradient-distance" +msgstr "" + +#: ../src/viktrwlayer_propwin.c:3649 ../src/viktrwlayer_propwin.c:3666 +#: ../src/viktrwlayer_propwin.c:3683 +msgid "Track Time:" +msgstr "" + +#: ../src/viktrwlayer_propwin.c:3650 ../src/viktrwlayer_propwin.c:3700 +msgid "Track Speed:" +msgstr "" + +#: ../src/viktrwlayer_propwin.c:3651 ../src/viktrwlayer_propwin.c:3667 +#: ../src/viktrwlayer_propwin.c:3685 +msgid "Time/Date:" +msgstr "" + +#: ../src/viktrwlayer_propwin.c:3655 +msgid "Speed-time" +msgstr "" + +#: ../src/viktrwlayer_propwin.c:3663 ../src/viktrwlayer_propwin.c:3679 +msgid "Show S_peed" +msgstr "" + +#: ../src/viktrwlayer_propwin.c:3671 +msgid "Distance-time" +msgstr "" + +#: ../src/viktrwlayer_propwin.c:3690 +msgid "Elevation-time" +msgstr "" + +#: ../src/viktrwlayer_propwin.c:3705 +msgid "Speed-distance" +msgstr "" + +#: ../src/viktrwlayer_tpwin.c:190 ../src/viktrwlayer_wpwin.c:66 +msgid "Date/Time Edit" +msgstr "" + +#: ../src/viktrwlayer_tpwin.c:242 +msgid "Name:" +msgstr "" + +#: ../src/viktrwlayer_tpwin.c:243 +msgid "Latitude:" +msgstr "" + +#: ../src/viktrwlayer_tpwin.c:244 +msgid "Longitude:" +msgstr "" + +#: ../src/viktrwlayer_tpwin.c:245 +msgid "Altitude:" +msgstr "" + +#: ../src/viktrwlayer_tpwin.c:246 +msgid "Course:" +msgstr "" + +#: ../src/viktrwlayer_tpwin.c:247 +msgid "Timestamp:" +msgstr "" + +#: ../src/viktrwlayer_tpwin.c:248 +msgid "Time:" +msgstr "" + +#: ../src/viktrwlayer_tpwin.c:249 +msgid "Distance Difference:" +msgstr "" + +#: ../src/viktrwlayer_tpwin.c:250 +msgid "Time Difference:" +msgstr "" + +#: ../src/viktrwlayer_tpwin.c:251 +msgid "\"Speed\" Between:" +msgstr "" + +#: ../src/viktrwlayer_tpwin.c:252 +msgid "Speed:" +msgstr "" + +#: ../src/viktrwlayer_tpwin.c:253 +msgid "VDOP:" +msgstr "" + +#: ../src/viktrwlayer_tpwin.c:254 +msgid "HDOP:" +msgstr "" + +#: ../src/viktrwlayer_tpwin.c:255 +msgid "PDOP:" +msgstr "" + +#: ../src/viktrwlayer_tpwin.c:256 +msgid "SAT/FIX:" +msgstr "" + +#: ../src/viktrwlayer_tpwin.c:263 ../src/viktrwlayer_tpwin.c:408 +#: ../src/viktrwlayer_tpwin.c:622 +msgid "Trackpoint" +msgstr "" + +#: ../src/viktrwlayer_tpwin.c:266 +msgid "_Insert After" +msgstr "" + +#: ../src/viktrwlayer_tpwin.c:268 +msgid "Split Here" +msgstr "" + +#: ../src/viktrwlayer_tracklist.c:262 ../src/viktrwlayer_waypointlist.c:306 +msgid "_Copy Data" +msgstr "" + +#. +#. item = gtk_image_menu_item_new_with_mnemonic ( _("_Select") ); +#. gtk_image_menu_item_set_image ( (GtkImageMenuItem*)item, gtk_image_new_from_stock (GTK_STOCK_FIND, GTK_ICON_SIZE_MENU) ); +#. g_signal_connect_swapped ( G_OBJECT(item), "activate", G_CALLBACK(trw_layer_track_select), values ); +#. gtk_menu_shell_append (GTK_MENU_SHELL (menu), item); +#. gtk_widget_show ( item ); +#. +#. ATM view auto selects, so don't bother with separate select menu entry +#. +#. item = gtk_image_menu_item_new_with_mnemonic ( _("_Select") ); +#. gtk_image_menu_item_set_image ( (GtkImageMenuItem*)item, gtk_image_new_from_stock (GTK_STOCK_FIND, GTK_ICON_SIZE_MENU) ); +#. g_signal_connect_swapped ( G_OBJECT(item), "activate", G_CALLBACK(trw_layer_waypoint_select), values ); +#. gtk_menu_shell_append (GTK_MENU_SHELL (menu), item); +#. gtk_widget_show ( item ); +#. +#. AUTO SELECT NOT TRUE YET... +#. ATM view auto selects, so don't bother with separate select menu entry +#: ../src/viktrwlayer_tracklist.c:290 ../src/viktrwlayer_waypointlist.c:341 +#: ../src/vikwindow.c:4816 +msgid "_View" +msgstr "" + +#. Insert column for the layer name when viewing multi layers +#: ../src/viktrwlayer_tracklist.c:613 ../src/viktrwlayer_waypointlist.c:609 +msgid "Layer" +msgstr "" + +#: ../src/viktrwlayer_tracklist.c:627 ../src/viktrwlayer_waypointlist.c:624 +msgid "Date" +msgstr "" + +#: ../src/viktrwlayer_tracklist.c:631 ../src/viktrwlayer_waypointlist.c:628 +msgid "Visible" +msgstr "" + +#: ../src/viktrwlayer_tracklist.c:639 +msgid "" +"Distance\n" +"(miles)" +msgstr "" + +#: ../src/viktrwlayer_tracklist.c:642 +msgid "" +"Distance\n" +"(NM)" +msgstr "" + +#: ../src/viktrwlayer_tracklist.c:645 +msgid "" +"Distance\n" +"(km)" +msgstr "" + +#: ../src/viktrwlayer_tracklist.c:651 +msgid "" +"Length\n" +"(minutes)" +msgstr "" + +#: ../src/viktrwlayer_tracklist.c:660 ../src/vikutils.c:93 +msgid "sec/mi" +msgstr "" + +#: ../src/viktrwlayer_tracklist.c:666 +#, c-format +msgid "" +"Av. Speed\n" +"(%s)" +msgstr "" + +#. Apply own formatting of the data +#: ../src/viktrwlayer_tracklist.c:671 +#, c-format +msgid "" +"Max Speed\n" +"(%s)" +msgstr "" + +#: ../src/viktrwlayer_tracklist.c:679 ../src/viktrwlayer_waypointlist.c:637 +msgid "" +"Max Height\n" +"(Feet)" +msgstr "" + +#: ../src/viktrwlayer_tracklist.c:681 ../src/viktrwlayer_waypointlist.c:639 +msgid "" +"Max Height\n" +"(Metres)" +msgstr "" + +#: ../src/viktrwlayer_waypointlist.c:312 +msgid "Copy Data (with _positions)" +msgstr "" + +#: ../src/viktrwlayer_waypointlist.c:633 +msgid "Comment" +msgstr "" + +#: ../src/viktrwlayer_waypointlist.c:643 +msgid "Symbol" +msgstr "" + +#: ../src/viktrwlayer_wpwin.c:93 ../src/viktrwlayer_wpwin.c:302 +msgid "True" +msgstr "" + +#: ../src/viktrwlayer_wpwin.c:122 +msgid "Waypoint Properties" +msgstr "Vlastnosti bodu trasy" + +#: ../src/viktrwlayer_wpwin.c:164 +msgid "Name:" +msgstr "Názov:" + +#: ../src/viktrwlayer_wpwin.c:181 +msgid "Altitude:" +msgstr "Nadmorská výška:" + +#: ../src/viktrwlayer_wpwin.c:186 ../src/viktrwlayer_wpwin.c:188 +msgid "Comment:" +msgstr "Komentár:" + +#: ../src/viktrwlayer_wpwin.c:202 +msgid "Source:" +msgstr "" + +#: ../src/viktrwlayer_wpwin.c:212 +msgid "Image:" +msgstr "Obrázok:" + +#: ../src/viktrwlayer_wpwin.c:217 +msgid "Symbol:" +msgstr "Symbol:" + +#: ../src/viktrwlayer_wpwin.c:226 +msgid "(none)" +msgstr "" + +#. Geotag Info [readonly] +#: ../src/viktrwlayer_wpwin.c:272 +msgid "Has Geotag" +msgstr "" + +#: ../src/viktrwlayer_wpwin.c:279 +msgid "Consistent Position" +msgstr "" + +#. ATM the direction value box is always shown, even when there is no information. +#. It would be nice to be able to hide it until the 'Add' has been performed, +#. however I've not been able to achieve this. +#. Thus simply sensistizing it instead. +#: ../src/viktrwlayer_wpwin.c:292 +#, fuzzy +msgid "Image Direction:" +msgstr "Prehliadač Obrázkov" + +#: ../src/viktrwlayer_wpwin.c:300 +msgid "Magnetic" +msgstr "" + +#: ../src/viktrwlayer_wpwin.c:320 +msgid "Time:" +msgstr "Čas:" + +#. TODO: other checks (isalpha or whatever ) +#: ../src/viktrwlayer_wpwin.c:386 +msgid "Please enter a name for the waypoint." +msgstr "Vložte prosím meno bodu trasy" + +#: ../src/viktrwlayer_geotag.c:320 ../src/viktrwlayer_geotag.c:460 +#, c-format +msgid "Failed updating EXIF on %s" +msgstr "" + +#: ../src/viktrwlayer_geotag.c:562 +#, c-format +msgid "Geotagging %d Images..." +msgstr "" + +#: ../src/viktrwlayer_geotag.c:630 +msgid "Geotag Images" +msgstr "" + +#: ../src/viktrwlayer_geotag.c:640 +msgid "Images" +msgstr "" + +#: ../src/viktrwlayer_geotag.c:645 +msgid "Overwrite Existing Waypoints:" +msgstr "" + +#: ../src/viktrwlayer_geotag.c:648 +msgid "Overwrite Existing GPS Information:" +msgstr "" + +#: ../src/viktrwlayer_geotag.c:650 +msgid "Keep File Modification Timestamp:" +msgstr "" + +#: ../src/viktrwlayer_geotag.c:684 +msgid "Create Waypoints:" +msgstr "" + +#: ../src/viktrwlayer_geotag.c:693 +msgid "Write EXIF:" +msgstr "" + +#: ../src/viktrwlayer_geotag.c:705 +msgid "Automatic Image Direction:" +msgstr "" + +#: ../src/viktrwlayer_geotag.c:707 +msgid "Set image direction based on a heading derived from the track" +msgstr "" + +#: ../src/viktrwlayer_geotag.c:710 +msgid "Interpolate Between Track Segments:" +msgstr "" + +#: ../src/viktrwlayer_geotag.c:715 +msgid "Image Time Offset (Seconds):" +msgstr "" + +#: ../src/viktrwlayer_geotag.c:718 +msgid "" +"The number of seconds to ADD to the photos time to make it match the GPS " +"data. Calculate this with (GPS - Photo). Can be negative or positive. Useful " +"to adjust times when a camera's timestamp was incorrect." +msgstr "" + +#: ../src/viktrwlayer_geotag.c:721 +msgid "Image Timezone:" +msgstr "" + +#: ../src/viktrwlayer_geotag.c:724 +msgid "" +"The timezone that was used when the images were created. For example, if a " +"camera is set to AWST or +8:00 hours. Enter +8:00 here so that the correct " +"adjustment to the images' time can be made. GPS data is always in UTC." +msgstr "" + +#: ../src/viktrwlayer_geotag.c:728 +#, c-format +msgid "Using waypoint: %s" +msgstr "" + +#: ../src/viktrwlayer_geotag.c:742 +#, c-format +msgid "Using track: %s" +msgstr "" + +#: ../src/viktrwlayer_geotag.c:744 +#, c-format +msgid "Using all tracks in: %s" +msgstr "" + +#: ../src/viktrwlayer_analysis.c:214 +msgid "Number of Tracks" +msgstr "" + +#: ../src/viktrwlayer_analysis.c:215 +msgid "Date Range" +msgstr "" + +#: ../src/viktrwlayer_analysis.c:216 +msgid "Total Length" +msgstr "" + +#: ../src/viktrwlayer_analysis.c:217 +msgid "Average Length" +msgstr "" + +#: ../src/viktrwlayer_analysis.c:218 +msgid "Eddington number" +msgstr "" + +#. No.4: Extended display only +#: ../src/viktrwlayer_analysis.c:219 +msgid "Max Speed" +msgstr "" + +#: ../src/viktrwlayer_analysis.c:220 +msgid "Avg. Speed" +msgstr "" + +#: ../src/viktrwlayer_analysis.c:221 +msgid "Minimum Altitude" +msgstr "" + +#: ../src/viktrwlayer_analysis.c:222 +msgid "Maximum Altitude" +msgstr "" + +#: ../src/viktrwlayer_analysis.c:223 +msgid "Total Elevation Gain/Loss" +msgstr "" + +#: ../src/viktrwlayer_analysis.c:224 +msgid "Avg. Elevation Gain/Loss" +msgstr "" + +#: ../src/viktrwlayer_analysis.c:225 +msgid "Total Duration" +msgstr "" + +#: ../src/viktrwlayer_analysis.c:226 +msgid "Avg. Duration" +msgstr "" + +#: ../src/viktrwlayer_analysis.c:317 +#, c-format +msgid "%.2f miles" +msgstr "" + +#: ../src/viktrwlayer_analysis.c:320 +#, c-format +msgid "%.2f NM" +msgstr "" + +#. VIK_UNITS_DISTANCE_KILOMETRES +#: ../src/viktrwlayer_analysis.c:324 +#, c-format +msgid "%.2f km" +msgstr "" + +#: ../src/viktrwlayer_analysis.c:361 +#, c-format +msgid "%.2f m/s" +msgstr "" + +#: ../src/viktrwlayer_analysis.c:370 ../src/viktrwlayer_analysis.c:373 +#, c-format +msgid "%.2f knots" +msgstr "" + +#: ../src/viktrwlayer_analysis.c:379 ../src/viktrwlayer_analysis.c:382 +#, c-format +msgid "%d s/km" +msgstr "" + +#: ../src/viktrwlayer_analysis.c:399 ../src/viktrwlayer_analysis.c:402 +#, c-format +msgid "%d sec/mi" +msgstr "" + +#: ../src/viktrwlayer_analysis.c:420 ../src/viktrwlayer_analysis.c:423 +#, c-format +msgid "%.2f km/h" +msgstr "" + +#: ../src/viktrwlayer_analysis.c:434 ../src/viktrwlayer_analysis.c:440 +#, c-format +msgid "%d feet" +msgstr "" + +#: ../src/viktrwlayer_analysis.c:445 ../src/viktrwlayer_analysis.c:447 +#, c-format +msgid "%d feet / %d feet" +msgstr "" + +#: ../src/viktrwlayer_analysis.c:452 ../src/viktrwlayer_analysis.c:458 +#, c-format +msgid "%d m" +msgstr "" + +#: ../src/viktrwlayer_analysis.c:463 ../src/viktrwlayer_analysis.c:465 +#, c-format +msgid "%d m / %d m" +msgstr "" + +#: ../src/viktrwlayer_analysis.c:477 +#, c-format +msgid "%d:%02d:%02d days:hrs:mins" +msgstr "" + +#: ../src/viktrwlayer_analysis.c:484 +#, c-format +msgid "%d:%02d hrs:mins" +msgstr "" + +#: ../src/viktrwlayer_analysis.c:658 +msgid "Include Invisible Items" +msgstr "" + +#: ../src/vikstatus.c:129 +msgid "Current number of background tasks. Click to see the background jobs." +msgstr "" + +#: ../src/vikstatus.c:134 +msgid "Current zoom level. Click to select a new one." +msgstr "" + +#: ../src/vikstatus.c:141 +msgid "Left click to clear the message. Right click to copy the message." +msgstr "" + +#: ../src/vikutils.c:108 +msgid "GPSD" +msgstr "" + +#. GPS Preamble +#: ../src/vikutils.c:109 +msgid "Trkpt" +msgstr "" + +#: ../src/vikutils.c:160 +#, c-format +msgid "%sSpeed%s %.1f%s" +msgstr "" + +#. Go for 2dp as expect low values for vertical speeds +#: ../src/vikutils.c:214 +#, c-format +msgid "%sClimb%s %.2f%s" +msgstr "" + +#: ../src/vikutils.c:223 +#, c-format +msgid "%sAlt %dfeet" +msgstr "" + +#. VIK_UNITS_HEIGHT_METRES: +#: ../src/vikutils.c:227 +#, c-format +msgid "%sAlt %dm" +msgstr "" + +#: ../src/vikutils.c:235 +#, c-format +msgid "%sCourse %03d°" +msgstr "" + +#: ../src/vikutils.c:249 +msgid "yards" +msgstr "" + +#. VIK_UNITS_DISTANCE_KILOMETRES: +#: ../src/vikutils.c:253 +msgid "m" +msgstr "" + +#: ../src/vikutils.c:257 +#, c-format +msgid "%sDistance diff %d%s" +msgstr "" + +#: ../src/vikutils.c:272 +#, c-format +msgid "%sTime %s" +msgstr "" + +#: ../src/vikutils.c:281 +#, c-format +msgid "%sTime diff %lds" +msgstr "" + +#: ../src/vikutils.c:287 +#, c-format +msgid "%sNo. of Sats %d" +msgstr "" + +#: ../src/vikutils.c:312 +#, c-format +msgid "%sTo End %.2f%s" +msgstr "" + +#: ../src/vikutils.c:339 +#, c-format +msgid "%sDistance along %.2f%s" +msgstr "" + +#: ../src/vikutils.c:359 +#, c-format +msgid "%sTrack: %s" +msgstr "" + +#: ../src/vikutils.c:396 +#, c-format +msgid "" +"There is a newer version of Viking available: %s\n" +"\n" +"Do you wish to go to Viking's website now?" +msgstr "" + +#: ../src/vikutils.c:526 +msgid "" +"This appears to be Viking's very first run.\n" +"\n" +"Do you wish to enable automatic internet features?\n" +"\n" +"Individual settings can be controlled in the Preferences." +msgstr "" + +#: ../src/vikwaypoint.c:37 +msgid "Waypoint" +msgstr "" + +#: ../src/vikwebtool_datasource.c:352 +msgid "Search Term" +msgstr "" + +#. TODO get rid of this as this is unnecessary duplication... +#: ../src/vikwindow.c:258 +msgid "Pan" +msgstr "" + +#: ../src/vikwindow.c:258 +msgid "Zoom" +msgstr "" + +#: ../src/vikwindow.c:258 +msgid "Ruler" +msgstr "" + +#: ../src/vikwindow.c:258 +msgid "Select" +msgstr "" + +#: ../src/vikwindow.c:368 +msgid "This is Viking " +msgstr "" + +#: ../src/vikwindow.c:457 +msgid "Location lookup aborted" +msgstr "" + +#: ../src/vikwindow.c:477 +#, c-format +msgid "Location found: %s" +msgstr "" + +#: ../src/vikwindow.c:486 +msgid "Unable to determine location" +msgstr "" + +#: ../src/vikwindow.c:495 +msgid "Determining location" +msgstr "" + +#: ../src/vikwindow.c:525 +#, c-format +msgid "Location found via geoclue" +msgstr "" + +#: ../src/vikwindow.c:546 +msgid "Default Map" +msgstr "" + +#: ../src/vikwindow.c:557 ../src/vikwindow.c:3938 +msgid "Trying to determine location..." +msgstr "" + +#. Create tooltip +#: ../src/vikwindow.c:723 +msgid "Select zoom level" +msgstr "" + +#: ../src/vikwindow.c:1176 +#, c-format +msgid "" +"Do you want to save the changes you made to the document \"%s\"?\n" +"\n" +"Your changes will be lost if you don't save them." +msgstr "" + +#: ../src/vikwindow.c:1180 +msgid "Don't Save" +msgstr "" + +#: ../src/vikwindow.c:1268 +msgid "mpp" +msgstr "" + +#: ../src/vikwindow.c:1268 +msgid "pixelfact" +msgstr "" + +#: ../src/vikwindow.c:1467 +#, c-format +msgid "%s %s %dm" +msgstr "" + +#: ../src/vikwindow.c:1469 +#, c-format +msgid "%s %s %dft" +msgstr "" + +#: ../src/vikwindow.c:1472 +#, c-format +msgid "%s %s" +msgstr "" + +#: ../src/vikwindow.c:1929 +msgid "_Ruler" +msgstr "" + +#: ../src/vikwindow.c:1929 +msgid "Ruler Tool" +msgstr "" + +#: ../src/vikwindow.c:2204 ../src/vikwindow.c:4818 +msgid "_Zoom" +msgstr "" + +#: ../src/vikwindow.c:2204 +msgid "Zoom Tool" +msgstr "" + +#: ../src/vikwindow.c:2271 ../src/vikwindow.c:4819 +msgid "_Pan" +msgstr "" + +#: ../src/vikwindow.c:2271 +msgid "Pan Tool" +msgstr "" + +#: ../src/vikwindow.c:2425 +msgid "_Select" +msgstr "" + +#: ../src/vikwindow.c:2425 +msgid "Select Tool" +msgstr "" + +#: ../src/vikwindow.c:2615 +msgid "You must select a layer to show its properties." +msgstr "" + +#. No error to show, so unlikely this will get called +#: ../src/vikwindow.c:2629 +msgid "The help system is not available." +msgstr "" + +#. Main error path +#: ../src/vikwindow.c:2632 +#, c-format +msgid "" +"Help is not available because: %s.\n" +"Ensure a Mime Type ghelp handler program is installed (e.g. yelp)." +msgstr "" + +#: ../src/vikwindow.c:2865 +msgid "You must select a layer to delete." +msgstr "" + +#: ../src/vikwindow.c:3171 +msgid "Untitled" +msgstr "" + +#: ../src/vikwindow.c:3300 +#, c-format +msgid "Unable to add '%s' to the list of recently used documents" +msgstr "" + +#: ../src/vikwindow.c:3391 +msgid "The file you requested could not be opened." +msgstr "" + +#: ../src/vikwindow.c:3394 +msgid "" +"GPSBabel is required to load files of this type or GPSBabel encountered " +"problems." +msgstr "" + +#: ../src/vikwindow.c:3397 +#, c-format +msgid "Unable to load malformed GPX file %s" +msgstr "" + +#: ../src/vikwindow.c:3400 +#, c-format +msgid "Unsupported file type for %s" +msgstr "" + +#. Since we can process .vik files with issues just show a warning in the status bar +#. Not that a user can do much about it... or tells them what this issue is yet... +#: ../src/vikwindow.c:3406 +#, c-format +msgid "WARNING: issues encountered loading %s" +msgstr "" + +#: ../src/vikwindow.c:3489 +msgid "Please select a GPS data file to open. " +msgstr "" + +#: ../src/vikwindow.c:3508 +msgid "Google Earth" +msgstr "" + +#: ../src/vikwindow.c:3523 ../src/vikwindow.c:3646 ../src/viking.desktop.in.h:1 +msgid "Viking" +msgstr "" + +#: ../src/vikwindow.c:3594 ../src/vikwindow.c:4632 +msgid "Open File" +msgstr "" + +#: ../src/vikwindow.c:3630 +msgid "Save as Viking File." +msgstr "" + +#: ../src/vikwindow.c:3757 +#, c-format +msgid "Exporting to file: %s" +msgstr "" + +#. Confirm what happened. +#: ../src/vikwindow.c:3774 +#, c-format +msgid "Exported files: %d" +msgstr "" + +#: ../src/vikwindow.c:3786 +msgid "Nothing to Export!" +msgstr "" + +#: ../src/vikwindow.c:3790 +msgid "Export to directory" +msgstr "" + +#: ../src/vikwindow.c:3809 +msgid "Could not convert all files" +msgstr "" + +#: ../src/vikwindow.c:3851 +msgid "File not accessible" +msgstr "" + +#: ../src/vikwindow.c:3854 +msgid "No Viking File" +msgstr "" + +#: ../src/vikwindow.c:3998 +msgid "This layer has no configurable properties." +msgstr "" + +#: ../src/vikwindow.c:4080 +msgid "Are you sure you wish to delete all layers?" +msgstr "" + +#. Try harder... +#: ../src/vikwindow.c:4126 ../src/vikwindow.c:4132 +msgid "Generating image file..." +msgstr "" + +#: ../src/vikwindow.c:4154 +msgid "" +"Failed to generate internal image.\n" +"\n" +"Try creating a smaller image." +msgstr "" + +#: ../src/vikwindow.c:4175 +msgid "Image file generated." +msgstr "" + +#: ../src/vikwindow.c:4177 +msgid "Failed to generate image file." +msgstr "" + +#: ../src/vikwindow.c:4246 +#, c-format +msgid "Unable to write to file %s: %s" +msgstr "" + +#: ../src/vikwindow.c:4284 +msgid "" +"Viewable region outside allowable pixel size bounds for image. Clipping " +"width/height values." +msgstr "" + +#: ../src/vikwindow.c:4309 +#, c-format +msgid "Total area: %ldm x %ldm (%.3f sq. km)" +msgstr "" + +#: ../src/vikwindow.c:4312 +#, c-format +msgid "Total area: %ldm x %ldm (%.3f sq. miles)" +msgstr "" + +#: ../src/vikwindow.c:4315 +#, c-format +msgid "Total area: %ldm x %ldm (%.3f sq. NM)" +msgstr "" + +#. Single file +#: ../src/vikwindow.c:4343 +msgid "Save Image" +msgstr "" + +#: ../src/vikwindow.c:4364 ../src/vikwindow.c:4641 +msgid "KMZ" +msgstr "" + +#: ../src/vikwindow.c:4417 +msgid "You must be in UTM mode to use this feature" +msgstr "" + +#: ../src/vikwindow.c:4421 +msgid "Choose a directory to hold images" +msgstr "" + +#. todo: default for answers inside VikWindow or static (thruout instance) +#: ../src/vikwindow.c:4441 +msgid "Save to Image File" +msgstr "" + +#: ../src/vikwindow.c:4457 +msgid "Width (pixels):" +msgstr "" + +#: ../src/vikwindow.c:4459 +msgid "Height (pixels):" +msgstr "" + +#: ../src/vikwindow.c:4462 +msgid "" +"WARNING: USING LARGE IMAGES OVER 10000x10000\n" +"MAY CRASH THE PROGRAM!" +msgstr "" + +#: ../src/vikwindow.c:4464 +msgid "Zoom (meters per pixel):" +msgstr "" + +#: ../src/vikwindow.c:4480 +msgid "Area in current viewable window" +msgstr "" + +#: ../src/vikwindow.c:4490 +msgid "Save as PNG" +msgstr "" + +#: ../src/vikwindow.c:4491 +msgid "Save as JPEG" +msgstr "" + +#: ../src/vikwindow.c:4520 +msgid "East-west image tiles:" +msgstr "" + +#: ../src/vikwindow.c:4522 +msgid "North-south image tiles:" +msgstr "" + +#: ../src/vikwindow.c:4619 +msgid "This feature is not available in UTM mode" +msgstr "" + +#: ../src/vikwindow.c:4658 +#, c-format +msgid "Unable to import %s." +msgstr "" + +#: ../src/vikwindow.c:4749 +msgid "Choose a background color" +msgstr "" + +#: ../src/vikwindow.c:4765 +msgid "Choose a track highlight color" +msgstr "" + +#: ../src/vikwindow.c:4814 +msgid "_File" +msgstr "" + +#: ../src/vikwindow.c:4815 +msgid "_Edit" +msgstr "" + +#: ../src/vikwindow.c:4817 +msgid "_Show" +msgstr "" + +#: ../src/vikwindow.c:4820 +msgid "_Layers" +msgstr "" + +#: ../src/vikwindow.c:4821 +msgid "_Tools" +msgstr "" + +#: ../src/vikwindow.c:4822 +msgid "_Webtools" +msgstr "" + +#: ../src/vikwindow.c:4823 ../src/vikwindow.c:4893 +msgid "_Help" +msgstr "" + +#: ../src/vikwindow.c:4825 +msgid "New file" +msgstr "" + +#: ../src/vikwindow.c:4826 +msgid "_Open..." +msgstr "" + +#: ../src/vikwindow.c:4826 +msgid "Open a file" +msgstr "" + +#: ../src/vikwindow.c:4827 +msgid "Open _Recent File" +msgstr "" + +#: ../src/vikwindow.c:4828 +msgid "Append _File..." +msgstr "" + +#: ../src/vikwindow.c:4828 +msgid "Append data from a different file" +msgstr "" + +#: ../src/vikwindow.c:4829 +msgid "Open GPX as External _Layer..." +msgstr "" + +#: ../src/vikwindow.c:4829 +msgid "Open a GPX file as an external layer" +msgstr "" + +#: ../src/vikwindow.c:4830 +msgid "_Export All" +msgstr "" + +#: ../src/vikwindow.c:4830 +msgid "Export All TrackWaypoint Layers" +msgstr "" + +#: ../src/vikwindow.c:4831 +msgid "_GPX..." +msgstr "" + +#: ../src/vikwindow.c:4831 +msgid "Export as GPX" +msgstr "" + +#: ../src/vikwindow.c:4832 +msgid "A_cquire" +msgstr "" + +#: ../src/vikwindow.c:4833 +msgid "_Directions..." +msgstr "" + +#: ../src/vikwindow.c:4833 +msgid "Get driving directions" +msgstr "" + +#: ../src/vikwindow.c:4835 +msgid "_OSM Traces..." +msgstr "" + +#: ../src/vikwindow.c:4835 +msgid "Get traces from OpenStreetMap" +msgstr "" + +#: ../src/vikwindow.c:4836 +msgid "_My OSM Traces..." +msgstr "" + +#: ../src/vikwindow.c:4836 +msgid "Get Your Own Traces from OpenStreetMap" +msgstr "" + +#: ../src/vikwindow.c:4839 +msgid "Geo_caches..." +msgstr "" + +#: ../src/vikwindow.c:4839 +msgid "Get Geocaches from geocaching.com" +msgstr "" + +#: ../src/vikwindow.c:4842 +msgid "Create waypoints from geotagged images" +msgstr "" + +#: ../src/vikwindow.c:4844 +msgid "Get a file from a URL" +msgstr "" + +#: ../src/vikwindow.c:4846 +msgid "Create waypoints from Wikipedia items in the current view" +msgstr "" + +#: ../src/vikwindow.c:4848 +msgid "_Save" +msgstr "" + +#: ../src/vikwindow.c:4848 +msgid "Save the file" +msgstr "" + +#: ../src/vikwindow.c:4849 +msgid "Save _As..." +msgstr "" + +#: ../src/vikwindow.c:4849 +msgid "Save the file under different name" +msgstr "" + +#: ../src/vikwindow.c:4850 +msgid "Properties..." +msgstr "" + +#: ../src/vikwindow.c:4850 +msgid "File Properties" +msgstr "" + +#: ../src/vikwindow.c:4852 +msgid "Import KMZ _Map File..." +msgstr "" + +#: ../src/vikwindow.c:4852 +msgid "Import a KMZ file" +msgstr "" + +#: ../src/vikwindow.c:4853 +msgid "Generate _KMZ Map File..." +msgstr "" + +#: ../src/vikwindow.c:4853 +msgid "Generate a KMZ file with an overlay of the current view" +msgstr "" + +#: ../src/vikwindow.c:4855 +msgid "_Generate Image File..." +msgstr "" + +#: ../src/vikwindow.c:4855 +msgid "Save a snapshot of the workspace into a file" +msgstr "" + +#: ../src/vikwindow.c:4856 +msgid "Generate _Directory of Images..." +msgstr "" + +#: ../src/vikwindow.c:4856 +msgid "Generate _Directory of Images" +msgstr "" + +#: ../src/vikwindow.c:4857 +msgid "_Print..." +msgstr "" + +#: ../src/vikwindow.c:4857 +msgid "Print maps" +msgstr "" + +#: ../src/vikwindow.c:4858 +msgid "E_xit" +msgstr "" + +#: ../src/vikwindow.c:4858 +msgid "Exit the program" +msgstr "" + +#: ../src/vikwindow.c:4859 +msgid "Save and Exit" +msgstr "" + +#: ../src/vikwindow.c:4859 +msgid "Save and Exit the program" +msgstr "" + +#: ../src/vikwindow.c:4861 +msgid "Go to the Pre_vious Location" +msgstr "" + +#: ../src/vikwindow.c:4861 +msgid "Go to the previous location" +msgstr "" + +#: ../src/vikwindow.c:4862 +msgid "Go to the _Next Location" +msgstr "" + +#: ../src/vikwindow.c:4862 +msgid "Go to the next location" +msgstr "" + +#: ../src/vikwindow.c:4863 +msgid "Go to the _Default Location" +msgstr "" + +#: ../src/vikwindow.c:4863 +msgid "Go to the default location" +msgstr "" + +#: ../src/vikwindow.c:4864 +msgid "Go to the _Auto Location" +msgstr "" + +#: ../src/vikwindow.c:4864 +msgid "Go to a location via automatic lookup" +msgstr "" + +#: ../src/vikwindow.c:4865 +msgid "Go to _Location..." +msgstr "" + +#: ../src/vikwindow.c:4865 +msgid "Go to address/place using text search" +msgstr "" + +#: ../src/vikwindow.c:4866 +msgid "_Go to Lat/Lon..." +msgstr "" + +#: ../src/vikwindow.c:4866 +msgid "Go to arbitrary lat/lon coordinate" +msgstr "" + +#: ../src/vikwindow.c:4867 +msgid "Go to UTM..." +msgstr "" + +#: ../src/vikwindow.c:4867 +msgid "Go to arbitrary UTM coordinate" +msgstr "" + +#: ../src/vikwindow.c:4868 +msgid "Go to Today" +msgstr "" + +#: ../src/vikwindow.c:4868 +msgid "Go to today on the calendar" +msgstr "" + +#: ../src/vikwindow.c:4869 +msgid "_Refresh" +msgstr "" + +#: ../src/vikwindow.c:4869 +msgid "Refresh any maps displayed" +msgstr "" + +#: ../src/vikwindow.c:4870 +msgid "Set _Highlight Color..." +msgstr "" + +#: ../src/vikwindow.c:4870 +msgid "Set Highlight Color" +msgstr "" + +#: ../src/vikwindow.c:4871 +msgid "Set Bac_kground Color..." +msgstr "" + +#: ../src/vikwindow.c:4871 +msgid "Set Background Color" +msgstr "" + +#: ../src/vikwindow.c:4872 +msgid "Zoom _In" +msgstr "" + +#: ../src/vikwindow.c:4872 +msgid "Zoom In" +msgstr "" + +#: ../src/vikwindow.c:4873 +msgid "Zoom _Out" +msgstr "" + +#: ../src/vikwindow.c:4873 +msgid "Zoom Out" +msgstr "" + +#: ../src/vikwindow.c:4874 +msgid "Zoom _To..." +msgstr "" + +#: ../src/vikwindow.c:4874 +msgid "Zoom To" +msgstr "" + +#: ../src/vikwindow.c:4875 +msgid "Pan _North" +msgstr "" + +#: ../src/vikwindow.c:4876 +msgid "Pan _East" +msgstr "" + +#: ../src/vikwindow.c:4877 +msgid "Pan _South" +msgstr "" + +#: ../src/vikwindow.c:4878 +msgid "Pan _West" +msgstr "" + +#: ../src/vikwindow.c:4879 +msgid "Background _Jobs" +msgstr "" + +#: ../src/vikwindow.c:4879 +msgid "Background Jobs" +msgstr "" + +#: ../src/vikwindow.c:4881 +msgid "Cu_t" +msgstr "" + +#: ../src/vikwindow.c:4885 +msgid "Delete All" +msgstr "" + +#: ../src/vikwindow.c:4886 +msgid "Copy Centre _Location" +msgstr "" + +#: ../src/vikwindow.c:4887 +msgid "_Flush Map Cache" +msgstr "" + +#: ../src/vikwindow.c:4888 +msgid "_Set the Default Location" +msgstr "" + +#: ../src/vikwindow.c:4888 +msgid "Set the Default Location to the current position" +msgstr "" + +#: ../src/vikwindow.c:4889 +msgid "_Preferences" +msgstr "" + +#: ../src/vikwindow.c:4889 +msgid "Program Preferences" +msgstr "" + +#: ../src/vikwindow.c:4890 +msgid "_Layer Defaults" +msgstr "" + +#: ../src/vikwindow.c:4891 +msgid "_Properties" +msgstr "" + +#: ../src/vikwindow.c:4893 +msgid "Help" +msgstr "" + +#: ../src/vikwindow.c:4894 +msgid "_About" +msgstr "" + +#: ../src/vikwindow.c:4894 +msgid "About" +msgstr "" + +#: ../src/vikwindow.c:4903 +msgid "_KML..." +msgstr "" + +#: ../src/vikwindow.c:4903 +msgid "Export as KML" +msgstr "" + +#: ../src/vikwindow.c:4904 +msgid "Transfer data from a GPS device" +msgstr "" + +#: ../src/vikwindow.c:4905 +msgid "Import file via GPSBabel converter" +msgstr "" + +#: ../src/vikwindow.c:4909 +msgid "Import Geo_JSON File..." +msgstr "" + +#: ../src/vikwindow.c:4909 +msgid "Import GeoJSON file" +msgstr "" + +#: ../src/vikwindow.c:4914 +msgid "_UTM Mode" +msgstr "" + +#: ../src/vikwindow.c:4915 +msgid "_Expedia Mode" +msgstr "" + +#: ../src/vikwindow.c:4916 +msgid "_Mercator Mode" +msgstr "" + +#: ../src/vikwindow.c:4917 +msgid "Lat_/Lon Mode" +msgstr "" + +#: ../src/vikwindow.c:4921 +msgid "Show _Scale" +msgstr "" + +#: ../src/vikwindow.c:4921 +msgid "Show Scale" +msgstr "" + +#: ../src/vikwindow.c:4922 +msgid "Show _Center Mark" +msgstr "" + +#: ../src/vikwindow.c:4922 +msgid "Show Center Mark" +msgstr "" + +#: ../src/vikwindow.c:4923 +msgid "Show _Highlight" +msgstr "" + +#: ../src/vikwindow.c:4923 +msgid "Show Highlight" +msgstr "" + +#: ../src/vikwindow.c:4924 +msgid "_Full Screen" +msgstr "" + +#: ../src/vikwindow.c:4924 +msgid "Activate full screen mode" +msgstr "" + +#: ../src/vikwindow.c:4925 +msgid "Show Side _Panel" +msgstr "" + +#: ../src/vikwindow.c:4925 +msgid "Show Side Panel" +msgstr "" + +#: ../src/vikwindow.c:4926 +msgid "Show Status_bar" +msgstr "" + +#: ../src/vikwindow.c:4926 +msgid "Show Statusbar" +msgstr "" + +#: ../src/vikwindow.c:4927 +msgid "Show _Toolbar" +msgstr "" + +#: ../src/vikwindow.c:4927 +msgid "Show Toolbar" +msgstr "" + +#: ../src/vikwindow.c:4928 +msgid "Show _Menu" +msgstr "" + +#: ../src/vikwindow.c:4928 +msgid "Show Menu" +msgstr "" + +#: ../src/vikwindow.c:4929 +msgid "Show Side Panel B_uttons" +msgstr "" + +#: ../src/vikwindow.c:4929 +msgid "Show Side Panel Buttons" +msgstr "" + +#: ../src/vikwindow.c:4930 +msgid "Show Side Panel Ca_lendar" +msgstr "" + +#: ../src/vikwindow.c:4930 +msgid "Show Side Panel Calendar" +msgstr "" + +#: ../src/vikwindow.c:5064 +#, c-format +msgid "New _%s Layer" +msgstr "" + +#: ../src/vikwindow.c:5114 +msgid "..." +msgstr "" + +#: ../src/viking.desktop.in.h:2 +msgid "GPS Data Manager" +msgstr "" + +#: ../src/viking.desktop.in.h:3 +msgid "Map Based GPS Data Manager (live data capable)." +msgstr "" + +#: ../src/libjpeg/jpeg-data.c:205 +msgid "Data does not follow JPEG specification." +msgstr "" + +#: ../src/libjpeg/jpeg-data.c:302 +#, c-format +msgid "Path '%s' invalid." +msgstr "" + +#: ../src/libjpeg/jpeg-data.c:320 +#, c-format +msgid "Could not read '%s'." +msgstr "" diff --git a/po/sl.po b/po/sl.po new file mode 100644 index 0000000..a943ce6 --- /dev/null +++ b/po/sl.po @@ -0,0 +1,6101 @@ +# Slovenian translation for viking +# Copyright (c) 2008 Rosetta Contributors and Canonical Ltd 2008 +# This file is distributed under the same license as the viking package. +# FIRST AUTHOR , 2008. +# +msgid "" +msgstr "" +"Project-Id-Version: viking\n" +"Report-Msgid-Bugs-To: \n" +"POT-Creation-Date: 2019-01-19 12:53+0000\n" +"PO-Revision-Date: 2010-09-07 09:07+0000\n" +"Last-Translator: Guilhem Bonnefille \n" +"Language-Team: Slovenian \n" +"Language: sl\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" +"X-Launchpad-Export-Date: 2018-12-21 17:32+0000\n" +"X-Generator: Launchpad (build 18847)\n" + +#: ../src/acquire.c:106 ../src/vikgpslayer.c:1367 +msgid "Done." +msgstr "Opravljeno." + +#: ../src/acquire.c:115 +msgid "No data." +msgstr "" + +#: ../src/acquire.c:167 ../src/acquire.c:415 +msgid "Error: acquisition failed." +msgstr "Napaka: zajem ni uspel." + +#: ../src/acquire.c:339 +msgid "Working..." +msgstr "Izvajanje ..." + +#. This shouldn't happen... +#: ../src/acquire.c:406 +msgid "" +"Unable to create command\n" +"Acquire method failed." +msgstr "" + +#: ../src/acquire.c:513 +msgid "_Filter" +msgstr "" + +#: ../src/acquire.c:528 +#, c-format +msgid "Filter with %s" +msgstr "" + +#: ../src/acquire.c:545 +msgid "Filter" +msgstr "" + +#: ../src/babel.c:640 +msgid "GPSBabel:" +msgstr "" + +#: ../src/babel.c:641 +msgid "" +"Allow setting the specific instance of GPSBabel. You must restart Viking for " +"this value to take effect." +msgstr "" + +#: ../src/babel_ui.c:79 +msgid "Select a file format" +msgstr "" + +#: ../src/babel_ui.c:144 ../src/viktrwlayer.c:531 ../src/viktrwlayer.c:2882 +msgid "Tracks" +msgstr "Sledi" + +#: ../src/babel_ui.c:149 ../src/viktrwlayer.c:2892 +msgid "Routes" +msgstr "" + +#. ***** PARAMETERS ***** +#: ../src/babel_ui.c:154 ../src/viktrwlayer.c:531 ../src/viktrwlayer.c:2887 +msgid "Waypoints" +msgstr "" + +#: ../src/background.c:64 +#, c-format +msgid "%d items" +msgstr "%d predmetov" + +#: ../src/background.c:287 +msgid "Threads:" +msgstr "" + +#: ../src/background.c:288 +msgid "" +"Number of threads to use for Mapnik tasks. You need to restart Viking for a " +"change to this value to be used" +msgstr "" + +#: ../src/background.c:361 +msgid "Job" +msgstr "Opravilo" + +#: ../src/background.c:365 +msgid "Progress" +msgstr "Napredek" + +#: ../src/background.c:373 +msgid "Viking Background Jobs" +msgstr "Viking opravila v ozadju" + +#: ../src/bing.c:42 +msgid "Bing Aerial" +msgstr "" + +#: ../src/bing.c:48 +msgid "Bing" +msgstr "" + +#. VIK_GTK_WINDOW_FROM_WIDGET(vp) +#: ../src/bingmapsource.c:514 +msgid "Bing attribution Loading" +msgstr "" + +#: ../src/clipboard.c:95 +msgid "paste failed" +msgstr "lepljenje ni uspelo" + +#: ../src/clipboard.c:105 +msgid "wrong clipboard data size" +msgstr "Napačna velikost podatkov na odložišču" + +#: ../src/clipboard.c:124 +#, c-format +msgid "" +"The clipboard contains sublayer data for %s layers. You must select a layer " +"of this type to paste the clipboard data." +msgstr "" + +#: ../src/clipboard.c:264 +msgid "" +"In order to paste a waypoint, please select an appropriate layer to paste " +"into." +msgstr "" + +#: ../src/dialog.c:60 +msgid "Go to Lat/Lon" +msgstr "Pojdi na šir./dolž." + +#: ../src/dialog.c:69 ../src/viktrwlayer_wpwin.c:173 +msgid "Latitude:" +msgstr "Geografska širina:" + +#: ../src/dialog.c:72 ../src/viktrwlayer_wpwin.c:177 +msgid "Longitude:" +msgstr "Geografska dolžina:" + +#: ../src/dialog.c:102 +msgid "Go to UTM" +msgstr "" + +#: ../src/dialog.c:114 +msgid "Northing:" +msgstr "" + +#: ../src/dialog.c:117 +msgid "Easting:" +msgstr "" + +#: ../src/dialog.c:121 ../src/vikgeoreflayer.c:902 +msgid "Zone:" +msgstr "" + +#: ../src/dialog.c:124 ../src/vikgeoreflayer.c:904 +msgid "Letter:" +msgstr "" + +#: ../src/dialog.c:246 ../src/geonamessearch.c:238 +#: ../src/datasource_osm_my_traces.c:505 +msgid "Nothing was selected" +msgstr "" + +#: ../src/dialog.c:254 +msgid "Add Route" +msgstr "" + +#: ../src/dialog.c:254 +msgid "Add Track" +msgstr "Dodaj sled" + +#: ../src/dialog.c:262 +msgid "Route Name:" +msgstr "" + +#: ../src/dialog.c:262 +msgid "Track Name:" +msgstr "Ime sledi:" + +#: ../src/dialog.c:282 +msgid "Please enter a name for the track." +msgstr "Vnesite ime sledi:" + +#: ../src/dialog.c:311 +msgid "Today" +msgstr "" + +#: ../src/dialog.c:393 +msgid "Zoom Factors..." +msgstr "Faktorji povečave..." + +#: ../src/dialog.c:407 +msgid "Zoom factor (in meters per pixel):" +msgstr "" + +#: ../src/dialog.c:408 +msgid "X (easting): " +msgstr "" + +#: ../src/dialog.c:409 +msgid "Y (northing): " +msgstr "" + +#: ../src/dialog.c:414 +msgid "X and Y zoom factors must be equal" +msgstr "" + +#: ../src/dialog.c:469 +msgid "1 min" +msgstr "1 min" + +#: ../src/dialog.c:470 +msgid "1 hour" +msgstr "1 ura" + +#: ../src/dialog.c:471 +msgid "1 day" +msgstr "1 dan" + +#: ../src/dialog.c:472 +msgid "Custom (in minutes):" +msgstr "Po meri (v minutah):" + +#: ../src/dialog.c:608 +#, c-format +msgid "" +"2003-2008, Evan Battaglia\n" +"2008-%s, Viking's contributors" +msgstr "" + +#: ../src/dialog.c:609 +msgid "GPS Data and Topo Analyzer, Explorer, and Manager." +msgstr "" + +#: ../src/dialog.c:610 +msgid "" +"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.\n" +"\n" +"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.\n" +"\n" +"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., 59 Temple " +"Place, Suite 330, Boston, MA 02111-1307, USA" +msgstr "" + +#: ../src/dialog.c:703 +msgid "Translation is coordinated on http://launchpad.net/viking" +msgstr "" + +#: ../src/dialog.c:713 +msgid "Download along track" +msgstr "Prenos po sledi" + +#: ../src/dialog.c:720 +msgid "Map type:" +msgstr "Vrsta zemljevida:" + +#: ../src/dialog.c:726 +msgid "Zoom level:" +msgstr "Stopnja povečave:" + +#: ../src/dialog.c:766 +#, c-format +msgid "The map data is licensed: %s." +msgstr "" + +#: ../src/dialog.c:769 +#, c-format +msgid "" +"The data provided by '%s' are licensed under the following license: " +"%s." +msgstr "" + +#: ../src/dialog.c:773 +msgid "Open license" +msgstr "" + +#: ../src/expedia.c:54 +msgid "Expedia Street Maps" +msgstr "Cestni zemljevidi Expedia" + +#: ../src/expedia.c:82 +msgid "Invalid expedia altitude" +msgstr "" + +#: ../src/expedia.c:113 +#, c-format +msgid "" +"Couldn't open EXPEDIA image file (right after successful download! Please " +"report and delete image file!): %s" +msgstr "" + +#: ../src/expedia.c:126 +#, c-format +msgid "" +"Couldn't save EXPEDIA image file (right after successful download! Please " +"report and delete image file!): %s" +msgstr "" + +#: ../src/geonamessearch.c:115 +msgid "Search" +msgstr "Najdi" + +#: ../src/geonamessearch.c:117 +msgid "No entries found!" +msgstr "" + +#. NB could allow columns to be shifted around by doing this after each new +#. gtk_tree_view_column_set_reorderable ( column, TRUE ); +#. However I don't think is that useful, so I haven't put it in +#: ../src/geonamessearch.c:171 ../src/datasource_osm_my_traces.c:422 +#: ../src/viktrwlayer_tracklist.c:621 ../src/viktrwlayer_waypointlist.c:618 +msgid "Name" +msgstr "" + +#: ../src/geonamessearch.c:176 +msgid "Feature" +msgstr "" + +#: ../src/geonamessearch.c:181 ../src/datasource_osm_my_traces.c:437 +msgid "Lat/Lon" +msgstr "" + +#: ../src/geonamessearch.c:264 ../src/googlesearch.c:101 ../src/vikgoto.c:430 +msgid "couldn't map temp file" +msgstr "" + +#: ../src/geonamessearch.c:459 +msgid "Select articles" +msgstr "" + +#: ../src/geonamessearch.c:459 +msgid "Select the articles you want to add." +msgstr "" + +#: ../src/geonamessearch.c:475 +msgid "city" +msgstr "" + +#: ../src/geonamessearch.c:477 +msgid "edu" +msgstr "" + +#: ../src/geonamessearch.c:479 +msgid "airport" +msgstr "" + +#: ../src/geonamessearch.c:481 +msgid "mountain" +msgstr "" + +#: ../src/geonamessearch.c:483 +msgid "forest" +msgstr "" + +#: ../src/geonamessearch.c:485 +msgid "church" +msgstr "" + +#: ../src/geojson.c:74 +#, c-format +msgid "%s command failed: %s" +msgstr "" + +#: ../src/geojson.c:146 ../src/gpx.c:1317 +#, c-format +msgid "failed to open temporary file: %s" +msgstr "" + +#: ../src/globals.c:67 +msgid "DDD" +msgstr "" + +#: ../src/globals.c:67 +msgid "DMM" +msgstr "" + +#: ../src/globals.c:67 +msgid "DMS" +msgstr "" + +#: ../src/globals.c:67 +msgid "Raw" +msgstr "" + +#: ../src/globals.c:68 +msgid "Kilometres" +msgstr "" + +#: ../src/globals.c:68 +msgid "Miles" +msgstr "" + +#: ../src/globals.c:68 +msgid "Nautical Miles" +msgstr "" + +#. VIK_UNITS_SPEED_KILOMETRES_PER_HOUR: +#: ../src/globals.c:69 ../src/viktrwlayer_tracklist.c:655 ../src/vikutils.c:100 +msgid "km/h" +msgstr "" + +#: ../src/globals.c:69 ../src/viktrwlayer_tracklist.c:656 ../src/vikutils.c:78 +msgid "mph" +msgstr "" + +#. VIK_UNITS_SPEED_METRES_PER_SECOND: +#: ../src/globals.c:69 ../src/viktrwlayer_tracklist.c:663 ../src/vikutils.c:81 +msgid "m/s" +msgstr "" + +#: ../src/globals.c:69 ../src/viktrwlayer_tracklist.c:657 ../src/vikutils.c:84 +msgid "knots" +msgstr "" + +#: ../src/globals.c:69 ../src/viktrwlayer_tracklist.c:658 ../src/vikutils.c:87 +msgid "s/km" +msgstr "" + +#: ../src/globals.c:69 ../src/viktrwlayer_tracklist.c:659 ../src/vikutils.c:90 +msgid "min/km" +msgstr "" + +#: ../src/globals.c:69 +msgid "s/mi" +msgstr "" + +#: ../src/globals.c:69 ../src/viktrwlayer_tracklist.c:661 ../src/vikutils.c:96 +msgid "min/mi" +msgstr "" + +#: ../src/globals.c:70 +msgid "Metres" +msgstr "" + +#: ../src/globals.c:70 +msgid "Feet" +msgstr "" + +#: ../src/globals.c:73 +msgid "Locale" +msgstr "" + +#: ../src/globals.c:73 +msgid "World" +msgstr "" + +#: ../src/globals.c:73 +msgid "UTC" +msgstr "" + +#: ../src/globals.c:76 +msgid "Degree format:" +msgstr "" + +#: ../src/globals.c:77 +msgid "Distance units:" +msgstr "" + +#: ../src/globals.c:78 +msgid "Speed units:" +msgstr "" + +#: ../src/globals.c:79 +msgid "Height units:" +msgstr "" + +#: ../src/globals.c:80 +msgid "Use large waypoint icons:" +msgstr "" + +#: ../src/globals.c:81 +msgid "Default latitude:" +msgstr "" + +#: ../src/globals.c:82 +msgid "Default longitude:" +msgstr "" + +#: ../src/globals.c:83 +msgid "Time Display:" +msgstr "" + +#: ../src/globals.c:84 +msgid "" +"Display times according to the reference frame. Locale is the user's system " +"setting. World is relative to the location of the object." +msgstr "" + +#: ../src/globals.c:90 +msgid "Alphabetical" +msgstr "" + +#: ../src/globals.c:90 ../src/datasource_osm_my_traces.c:432 +msgid "Time" +msgstr "" + +#: ../src/globals.c:90 +msgid "Creation" +msgstr "" + +#: ../src/globals.c:91 +msgid "Title Case" +msgstr "" + +#: ../src/globals.c:91 +msgid "Lowercase" +msgstr "" + +#: ../src/globals.c:94 +msgid "KML File Export Units:" +msgstr "" + +#: ../src/globals.c:95 +msgid "GPX Track Order:" +msgstr "" + +#: ../src/globals.c:96 +msgid "GPX Waypoint Symbols:" +msgstr "" + +#: ../src/globals.c:97 +msgid "" +"Save GPX Waypoint Symbol names in the specified case. May be useful for " +"compatibility with various devices" +msgstr "" + +#: ../src/globals.c:98 +msgid "GPX Creator:" +msgstr "" + +#: ../src/globals.c:99 +msgid "" +"The creator value when writing a GPX file. Otherwise when blank a default is " +"used." +msgstr "" + +#: ../src/globals.c:104 +msgid "Image Viewer:" +msgstr "" + +#: ../src/globals.c:109 +msgid "External GPX Program 1:" +msgstr "" + +#: ../src/globals.c:110 +msgid "External GPX Program 2:" +msgstr "" + +#: ../src/globals.c:113 +msgid "Absolute" +msgstr "" + +#: ../src/globals.c:113 +msgid "Relative" +msgstr "" + +#: ../src/globals.c:117 +msgid "Save File Reference Mode:" +msgstr "" + +#: ../src/globals.c:118 +msgid "" +"When saving a Viking .vik file, this determines how the directory paths of " +"filenames are written." +msgstr "" + +#: ../src/globals.c:119 +msgid "Ask for Name before Track Creation:" +msgstr "" + +#: ../src/globals.c:120 +msgid "Show Tooltip during Track Creation:" +msgstr "" + +#: ../src/globals.c:121 +msgid "The number of recent files:" +msgstr "" + +#: ../src/globals.c:122 +msgid "" +"Only applies to new windows or on application restart. -1 means all " +"available files." +msgstr "" + +#: ../src/globals.c:123 +msgid "Open files in selected layer:" +msgstr "" + +#: ../src/globals.c:124 +msgid "Open files (but not .vik ones) into the selected TrackWaypoint layer." +msgstr "" + +#: ../src/globals.c:125 +msgid "Show calendar day names:" +msgstr "" + +#: ../src/globals.c:128 +msgid "Home Location" +msgstr "" + +#: ../src/globals.c:128 +msgid "Last Location" +msgstr "" + +#: ../src/globals.c:128 +msgid "Specified File" +msgstr "" + +#: ../src/globals.c:128 +msgid "Auto Location" +msgstr "" + +#: ../src/globals.c:131 +msgid "Restore Window Setup:" +msgstr "" + +#: ../src/globals.c:132 +msgid "Restore window size and layout" +msgstr "" + +#: ../src/globals.c:133 +msgid "Add a Default Map Layer:" +msgstr "" + +#: ../src/globals.c:134 +msgid "" +"The default map layer added is defined by the Layer Defaults. Use the menu " +"Edit->Layer Defaults->Map... to change the map type and other values." +msgstr "" + +#: ../src/globals.c:135 +msgid "Startup Method:" +msgstr "" + +#: ../src/globals.c:136 +msgid "Startup File:" +msgstr "" + +#: ../src/globals.c:137 +msgid "" +"The default file to load on startup. Only applies when the startup method is " +"set to 'Specified File'" +msgstr "" + +#: ../src/globals.c:138 +msgid "Check For New Version:" +msgstr "" + +#: ../src/globals.c:139 +msgid "Periodically check to see if a new version of Viking is available" +msgstr "" + +#. Defaults for the options are setup here +#: ../src/globals.c:176 +msgid "General" +msgstr "" + +#. New Tab +#: ../src/globals.c:204 +msgid "Startup" +msgstr "" + +#. New Tab +#: ../src/globals.c:222 +msgid "Export/External" +msgstr "" + +#. 'Advanced' Properties +#: ../src/globals.c:249 +msgid "Advanced" +msgstr "" + +#. Webtools +#: ../src/google.c:39 +msgid "Google" +msgstr "Google" + +#. If there is an actual description field it will overwrite this value +#: ../src/gpx.c:264 +#, c-format +msgid "Created by: %s" +msgstr "" + +#: ../src/datasource_bfilter.c:43 +msgid "Max number of points:" +msgstr "Največje število točk:" + +#: ../src/datasource_bfilter.c:84 +msgid "Simplify All Tracks..." +msgstr "" + +#: ../src/datasource_bfilter.c:85 +msgid "Simplified Tracks" +msgstr "Poenostavljene sledi" + +#. { VIK_LAYER_NUM_TYPES, "compressmethod", VIK_LAYER_PARAM_UINT, VIK_LAYER_GROUP_NONE, N_("Simplify Method:"), VIK_LAYER_WIDGET_COMBOBOX, compress_method, NULL, NULL, NULL, NULL, NULL }, +#: ../src/datasource_bfilter.c:111 +msgid "Error Factor:" +msgstr "" + +#: ../src/datasource_bfilter.c:112 +msgid "" +"Specifies the maximum allowable error that may be introduced by removing a " +"single point by the crosstrack method. See the manual or GPSBabel Simplify " +"Filter documentation for more detail." +msgstr "" + +#: ../src/datasource_bfilter.c:166 +msgid "Compress Tracks..." +msgstr "" + +#: ../src/datasource_bfilter.c:167 +msgid "Compressed Tracks" +msgstr "" + +#: ../src/datasource_bfilter.c:197 ../src/datasource_bfilter.c:198 +msgid "Remove Duplicate Waypoints" +msgstr "Odstrani podvojene točke" + +#: ../src/datasource_bfilter.c:221 +msgid "Manual filter:" +msgstr "" + +#: ../src/datasource_bfilter.c:222 +msgid "Manual filter command: e.g. 'swap'." +msgstr "" + +#: ../src/datasource_bfilter.c:233 ../src/datasource_bfilter.c:234 +msgid "Manual filter" +msgstr "" + +#: ../src/datasource_bfilter.c:262 +msgid "Waypoints Inside This" +msgstr "" + +#: ../src/datasource_bfilter.c:263 ../src/datasource_bfilter.c:292 +msgid "Polygonized Layer" +msgstr "" + +#: ../src/datasource_bfilter.c:291 +msgid "Waypoints Outside This" +msgstr "" + +#: ../src/datasource_file.c:61 +msgid "Import file with GPSBabel" +msgstr "" + +#: ../src/datasource_file.c:62 +msgid "Imported file" +msgstr "" + +#. The file selector +#: ../src/datasource_file.c:129 +msgid "File:" +msgstr "" + +#: ../src/datasource_file.c:130 +msgid "File to import" +msgstr "" + +#: ../src/datasource_file.c:137 +msgid "All files" +msgstr "" + +#. The file format selector +#: ../src/datasource_file.c:144 ../src/datasource_url.c:106 +msgid "File type:" +msgstr "" + +#: ../src/datasource_file.c:189 +#, c-format +msgid "using babel args '%s' and file '%s'" +msgstr "" + +#: ../src/datasource_gc.c:67 +msgid "Download Geocaches" +msgstr "Prenesi Geozaklade" + +#: ../src/datasource_gc.c:68 +msgid "Geocaching.com Caches" +msgstr "Zakladi Geocaching.com" + +#: ../src/datasource_gc.c:86 +msgid "geocaching.com username:" +msgstr "uporabniško ime za geocaching.com:" + +#: ../src/datasource_gc.c:87 +msgid "geocaching.com password:" +msgstr "geslo za geocaching.com:" + +#: ../src/datasource_gc.c:92 ../src/vikwindow.c:3502 +msgid "Geocaching" +msgstr "" + +#: ../src/datasource_gc.c:128 +#, c-format +msgid "" +"Can't find %s or %s in path! Check that you have installed it correctly." +msgstr "" + +#: ../src/datasource_gc.c:190 +msgid "Number geocaches:" +msgstr "" + +#: ../src/datasource_gc.c:192 +msgid "Centered around:" +msgstr "" + +#: ../src/datasource_gc.c:231 +msgid "Broken input - using some defaults" +msgstr "" + +#: ../src/datasource_geotag.c:51 +msgid "Create Waypoints from Geotagged Images" +msgstr "" + +#: ../src/datasource_geotag.c:52 +msgid "Geotagged Images" +msgstr "" + +#: ../src/datasource_geotag.c:102 ../src/datasource_geojson.c:93 +#: ../src/vikfileentry.c:171 ../src/vikwindow.c:3533 ../src/vikwindow.c:3610 +#: ../src/vikwindow.c:3641 ../src/vikwindow.c:4356 ../src/vikwindow.c:4649 +msgid "All" +msgstr "" + +#: ../src/datasource_geotag.c:107 ../src/vikfileentry.c:115 +#: ../src/viktrwlayer_geotag.c:637 ../src/vikwindow.c:3518 +#: ../src/vikwindow.c:4377 +msgid "JPG" +msgstr "" + +#: ../src/datasource_geotag.c:168 +#, c-format +msgid "Unable to create waypoint from %s" +msgstr "" + +#: ../src/datasource_geojson.c:46 +msgid "Acquire from GeoJSON" +msgstr "" + +#: ../src/datasource_geojson.c:47 ../src/datasource_geojson.c:98 +msgid "GeoJSON" +msgstr "" + +#: ../src/datasource_geojson.c:152 +#, c-format +msgid "Unable to import from: %s" +msgstr "" + +#: ../src/datasource_gps.c:54 +msgid "Acquire from GPS" +msgstr "Zajemi iz GPS naprave" + +#: ../src/datasource_gps.c:55 +msgid "Acquired from GPS" +msgstr "Zajeto iz GPS naprave" + +#: ../src/datasource_gps.c:258 +#, c-format +msgid "using cmd '%s' and file '%s'\n" +msgstr "" + +#: ../src/datasource_gps.c:353 ../src/vikgpslayer.c:966 +#, c-format +msgid "Downloading %d waypoint..." +msgid_plural "Downloading %d waypoints..." +msgstr[0] "" +msgstr[1] "" + +#: ../src/datasource_gps.c:358 ../src/vikgpslayer.c:971 +#, c-format +msgid "Downloading %d trackpoint..." +msgid_plural "Downloading %d trackpoints..." +msgstr[0] "Prenašam %d točk sledi..." +msgstr[1] "Prenašam %d točko sledi..." +msgstr[2] "Prenašam %d točki sledi..." +msgstr[3] "Prenašam %d točke sledi..." + +#: ../src/datasource_gps.c:363 ../src/vikgpslayer.c:976 +#, c-format +msgid "Downloading %d routepoint..." +msgid_plural "Downloading %d routepoints..." +msgstr[0] "" +msgstr[1] "" + +#: ../src/datasource_gps.c:386 ../src/datasource_gps.c:393 +#: ../src/datasource_gps.c:400 +#, c-format +msgid "Downloaded %d out of %d %s..." +msgstr "Prenešeno %d od %d %s..." + +#: ../src/datasource_gps.c:388 ../src/datasource_gps.c:395 +#: ../src/datasource_gps.c:402 +#, c-format +msgid "Downloaded %d %s." +msgstr "Prenešeno %d %s." + +#: ../src/datasource_gps.c:416 ../src/vikgpslayer.c:1134 +#, c-format +msgid "GPS Device: %s" +msgstr "Naprava GPS: %s" + +#: ../src/datasource_gps.c:428 ../src/vikgpslayer.c:1214 +msgid "Status: Working..." +msgstr "" + +#. NB gps_layer_inst_init() is performed after parameter registeration +#. thus to give the protocols some potential values use the old static list +#. TODO: find another way to use gps_layer_inst_init()? +#: ../src/datasource_gps.c:584 ../src/vikgpslayer.c:216 +msgid "GPS Protocol:" +msgstr "Protokol GPS:" + +#. List reassigned at runtime +#: ../src/datasource_gps.c:609 ../src/vikgpslayer.c:217 +msgid "Serial Port:" +msgstr "Zaporedni vmesnik:" + +#: ../src/datasource_gps.c:659 +msgid "" +"Turn Off After Transfer\n" +"(Garmin/NAViLink Only)" +msgstr "" + +#: ../src/datasource_gps.c:666 +msgid "Tracks:" +msgstr "" + +#: ../src/datasource_gps.c:673 +msgid "Routes:" +msgstr "" + +#: ../src/datasource_gps.c:680 +msgid "Waypoints:" +msgstr "" + +#: ../src/datasource_gps.c:756 ../src/vikgpslayer.c:1509 +msgid "GPS device: N/A" +msgstr "Naprava GPS: ni na voljo" + +#: ../src/datasource_osm.c:53 ../src/datasource_osm.c:54 +msgid "OSM traces" +msgstr "" + +#: ../src/datasource_osm.c:89 +msgid "Page number:" +msgstr "" + +#: ../src/datasource_osm_my_traces.c:59 ../src/datasource_osm_my_traces.c:60 +msgid "OSM My Traces" +msgstr "" + +#: ../src/datasource_osm_my_traces.c:106 ../src/osm-traces.c:684 +msgid "Email/username:" +msgstr "" + +#: ../src/datasource_osm_my_traces.c:111 +msgid "The email or username used to login to OSM" +msgstr "" + +#: ../src/datasource_osm_my_traces.c:113 ../src/osm-traces.c:692 +msgid "Password:" +msgstr "Geslo:" + +#: ../src/datasource_osm_my_traces.c:116 +msgid "The password used to login to OSM" +msgstr "" + +#: ../src/datasource_osm_my_traces.c:427 ../src/viktrwlayer.c:689 +msgid "Description" +msgstr "" + +#: ../src/datasource_osm_my_traces.c:442 +msgid "Privacy" +msgstr "" + +#: ../src/datasource_osm_my_traces.c:449 +msgid "Within Current View" +msgstr "" + +#: ../src/datasource_osm_my_traces.c:516 +msgid "GPS Traces" +msgstr "" + +#: ../src/datasource_osm_my_traces.c:518 +msgid "None found!" +msgstr "" + +#: ../src/datasource_osm_my_traces.c:569 +msgid "Ensure the OSM access token preferences are setup." +msgstr "" + +#: ../src/datasource_osm_my_traces.c:645 +msgid "My OSM Traces" +msgstr "" + +#. Report errors to the status bar +#: ../src/datasource_osm_my_traces.c:667 +#, c-format +msgid "Unable to get trace: %s" +msgstr "" + +#: ../src/datasource_routing.c:56 ../src/datasource_routing.c:57 +msgid "Directions" +msgstr "" + +#: ../src/datasource_routing.c:90 +msgid "No routing engines with directions available" +msgstr "" + +#. Engine selector +#: ../src/datasource_routing.c:99 +msgid "Engine:" +msgstr "" + +#. From and To entries +#: ../src/datasource_routing.c:104 +msgid "From:" +msgstr "" + +#: ../src/datasource_routing.c:105 +msgid "To:" +msgstr "" + +#: ../src/datasource_url.c:48 +msgid "Acquire from URL" +msgstr "" + +#: ../src/datasource_url.c:49 +msgid "URL" +msgstr "" + +#: ../src/datasource_url.c:101 +msgid "URL:" +msgstr "" + +#. Only GPX (not using GPSbabel) +#: ../src/datasource_url.c:133 ../src/vikfileentry.c:161 +#: ../src/vikwindow.c:3513 ../src/vikwindow.c:3603 +msgid "GPX" +msgstr "" + +#: ../src/datasource_wikipedia.c:32 +msgid "Create Waypoints from Wikipedia Articles" +msgstr "" + +#: ../src/datasource_wikipedia.c:33 +msgid "Wikipedia Waypoints" +msgstr "" + +#: ../src/dem.c:66 ../src/dem.c:80 +msgid "Invalid DEM" +msgstr "" + +#: ../src/dem.c:122 +msgid "Invalid DEM header" +msgstr "" + +#: ../src/dem.c:191 ../src/dem.c:204 +msgid "Incorrect DEM Class B record: expected 1" +msgstr "" + +#: ../src/dem.c:289 ../src/download.c:176 +#, c-format +msgid "Couldn't map file %s: %s" +msgstr "" + +#: ../src/download.c:130 +msgid "Tile age (days):" +msgstr "" + +#: ../src/download.c:406 +#, c-format +msgid "Download error: %s" +msgstr "Napaka prenosa: %s" + +#: ../src/download.c:490 +msgid "couldn't open temp file" +msgstr "začasne datoteke ni bilo mogoče odpreti" + +#: ../src/file.c:458 ../src/file.c:463 +#, c-format +msgid "Draw mode '%s' no more supported" +msgstr "" + +#: ../src/geotag_exif.c:621 +msgid "Not enough memory." +msgstr "" + +#: ../src/geotag_exif.c:639 +msgid "Setting a value for this tag is unsupported!" +msgstr "" + +#: ../src/geotag_exif.c:658 +#, c-format +msgid "Too few components specified (need %d, found %d)\n" +msgstr "" + +#: ../src/geotag_exif.c:662 +msgid "Numeric value expected\n" +msgstr "" + +#: ../src/geotag_exif.c:670 +msgid "This shouldn't happen!" +msgstr "" + +#: ../src/geotag_exif.c:740 +msgid "Not yet implemented!" +msgstr "" + +#: ../src/geotag_exif.c:753 +msgid "Warning; Too many components specified!" +msgstr "" + +#: ../src/osm-traces.c:87 +msgid "Identifiable (public w/ timestamps)" +msgstr "" + +#: ../src/osm-traces.c:88 +msgid "Trackable (private w/ timestamps)" +msgstr "" + +#: ../src/osm-traces.c:89 +msgid "Public" +msgstr "Javno" + +#: ../src/osm-traces.c:90 +msgid "Private" +msgstr "" + +#: ../src/osm-traces.c:108 +msgid "Access Token:" +msgstr "" + +#: ../src/osm-traces.c:108 +msgid "Get New OSM Access Tokens" +msgstr "" + +#: ../src/osm-traces.c:109 +msgid "Access Token Key:" +msgstr "" + +#: ../src/osm-traces.c:110 +msgid "Access Token Secret:" +msgstr "" + +#: ../src/osm-traces.c:111 +msgid "OSM username:" +msgstr "" + +#: ../src/osm-traces.c:112 +msgid "OSM password:" +msgstr "" + +#. Check to really override existing values... +#: ../src/osm-traces.c:263 +msgid "Do you want to overwrite existing values?" +msgstr "" + +#: ../src/osm-traces.c:275 +msgid "Not able to generate OSM request tokens." +msgstr "" + +#: ../src/osm-traces.c:299 +msgid "" +"Waiting for authorization approval.\n" +"Ensure you have granted access at the website before continuing here." +msgstr "" + +#: ../src/osm-traces.c:315 +msgid "No Authorization." +msgstr "" + +#: ../src/osm-traces.c:354 +msgid "" +"OSM Username and Password preferences are not required anymore. You can now " +"remove them." +msgstr "" + +#. Preferences +#: ../src/osm-traces.c:379 +msgid "OpenStreetMap Traces" +msgstr "" + +#: ../src/osm-traces.c:504 +#, c-format +msgid "failed to upload data: HTTP response is %ld" +msgstr "prenos podatkov ni uspel: odziv protokola HTTP je %ld" + +#: ../src/osm-traces.c:509 +#, c-format +msgid "curl_easy_getinfo failed: %d" +msgstr "curl_easy_getinfo ni uspel: %d" + +#: ../src/osm-traces.c:514 +#, c-format +msgid "curl request failed: %s" +msgstr "curl zahtevek ni uspel: %s" + +#. Success +#: ../src/osm-traces.c:592 +msgid "Uploaded to OSM" +msgstr "" + +#: ../src/osm-traces.c:596 +msgid "" +"FAILED TO UPLOAD DATA TO OSM - Ensure the OSM access token preferences are " +"setup." +msgstr "" + +#: ../src/osm-traces.c:599 +msgid "FAILED TO UPLOAD DATA TO OSM - CURL PROBLEM" +msgstr "" + +#: ../src/osm-traces.c:602 +msgid "FAILED TO UPLOAD DATA TO OSM" +msgstr "" + +#: ../src/osm-traces.c:602 +msgid "HTTP response code" +msgstr "" + +#: ../src/osm-traces.c:610 +#, c-format +msgid "failed to unlink temporary file: %s" +msgstr "" + +#: ../src/osm-traces.c:664 +msgid "OSM upload" +msgstr "Prenos na OSM" + +#: ../src/osm-traces.c:689 +msgid "" +"The email/username used as login\n" +"Enter the email/username you use to login into www.openstreetmap.org." +"" +msgstr "" + +#: ../src/osm-traces.c:697 +msgid "" +"The password used to login\n" +"Enter the password you use to login into www.openstreetmap.org." +msgstr "" + +#: ../src/osm-traces.c:703 +msgid "File's name:" +msgstr "Ime datoteke:" + +#: ../src/osm-traces.c:713 +msgid "" +"The name of the file on OSM\n" +"This is the name of the file created on the server.This is not the " +"name of the local file." +msgstr "" + +#: ../src/osm-traces.c:717 ../src/viktrwlayer_wpwin.c:197 +#: ../src/viktrwlayer_wpwin.c:199 +msgid "Description:" +msgstr "Opis:" + +#: ../src/osm-traces.c:731 +msgid "The description of the trace" +msgstr "Opis sledi" + +#: ../src/osm-traces.c:734 +msgid "Anonymize Times:" +msgstr "" + +#: ../src/osm-traces.c:739 +msgid "" +"Anonymize times of the trace.\n" +"You may choose to make the trace identifiable, yet mask the actual " +"real time values" +msgstr "" + +#: ../src/osm-traces.c:743 +msgid "Tags:" +msgstr "Oznake:" + +#: ../src/osm-traces.c:751 +msgid "The tags associated to the trace" +msgstr "Oznake sledi" + +#: ../src/osm-traces.c:816 +#, c-format +msgid "Uploading %s to OSM" +msgstr "Prenašanje %s na OSM" + +#: ../src/mapcache.c:67 +msgid "Map cache memory size (MB):" +msgstr "" + +#. NB Can have a couple hundred fonts loaded when using system directories +#. So ATM don't list them all - otherwise need better GUI feedback display. +#: ../src/mapnik_interface.cpp:324 +#, c-format +msgid "" +"%s %s\n" +"Plugins=%sFonts loaded=%d" +msgstr "" + +#: ../src/mapnik_interface.cpp:325 ../src/vikmapniklayer.c:278 +msgid "Mapnik" +msgstr "" + +#: ../src/print.c:51 ../src/viktrwlayer.c:572 +msgid "None" +msgstr "Brez" + +#: ../src/print.c:52 +msgid "Horizontally" +msgstr "Vodoravno" + +#: ../src/print.c:53 +msgid "Vertically" +msgstr "Navpično" + +#: ../src/print.c:54 +msgid "Both" +msgstr "Oboje" + +#: ../src/print.c:118 +msgid "Image Settings" +msgstr "Nastavitve slike" + +#: ../src/print.c:551 +msgid "done" +msgstr "opravljeno" + +#. Page Size +#: ../src/print.c:580 +msgid "_Adjust Page Size and Orientation" +msgstr "_Prilagodi velikost in postavitev strani" + +#: ../src/print.c:596 +msgid "C_enter:" +msgstr "_Sredinsko:" + +#. ignore page margins +#: ../src/print.c:614 +msgid "Ignore Page _Margins" +msgstr "Prezri _robove strani" + +#: ../src/print.c:633 +msgid "Image S_ize:" +msgstr "_Velikost slike:" + +#: ../src/ui_util.c:88 +#, c-format +msgid "Could not launch web browser. %s" +msgstr "" + +#: ../src/ui_util.c:101 +#, c-format +msgid "Could not create new email. %s" +msgstr "" + +#: ../src/vikcoordlayer.c:57 +msgid "Color:" +msgstr "Barva:" + +#: ../src/vikcoordlayer.c:58 +msgid "Minutes Width:" +msgstr "Minut širine:" + +#: ../src/vikcoordlayer.c:59 +msgid "Line Thickness:" +msgstr "Debelina črt:" + +#: ../src/vikcoordlayer.c:66 +msgid "Coordinate" +msgstr "" + +#: ../src/main.c:92 +#, c-format +msgid "Ignoring Xlib error: error code %d request code %d\n" +msgstr "" + +#: ../src/main.c:111 +msgid "Enable debug output" +msgstr "" + +#: ../src/main.c:112 +msgid "Enable verbose output" +msgstr "Vključi podroben izpis" + +#: ../src/main.c:113 +msgid "Show version" +msgstr "Prikaži različico" + +#: ../src/main.c:114 +msgid "Latitude in decimal degrees" +msgstr "" + +#: ../src/main.c:115 +msgid "Longitude in decimal degrees" +msgstr "" + +#: ../src/main.c:116 +msgid "Zoom Level (OSM). Value can be 0 - 22" +msgstr "" + +#: ../src/main.c:117 +msgid "Add a map layer by id value. Use 0 for the default map." +msgstr "" + +#: ../src/main.c:160 +#, c-format +msgid "" +"%s %s\n" +"Copyright (c) 2003-2008 Evan Battaglia\n" +"Copyright (c) 2008-%s Viking's contributors\n" +msgstr "" + +#: ../src/osm.c:50 +msgid "OpenStreetMap (Mapnik)" +msgstr "" + +#: ../src/osm.c:65 +msgid "OpenStreetMap (Cycle)" +msgstr "" + +#: ../src/osm.c:79 +msgid "OpenStreetMap (Transport)" +msgstr "" + +#: ../src/osm.c:95 +msgid "OpenStreetMap (Humanitarian)" +msgstr "" + +#: ../src/osm.c:111 +msgid "On Disk OSM Tile Format" +msgstr "" + +#: ../src/osm.c:121 +msgid "MBTiles File" +msgstr "" + +#: ../src/osm.c:132 +msgid "OSM Metatiles" +msgstr "" + +#: ../src/osm.c:146 +msgid "Mapbox Outdoors" +msgstr "" + +#: ../src/osm.c:153 +msgid "Mapbox Specific" +msgstr "" + +#: ../src/osm.c:170 +msgid "OSM (view)" +msgstr "" + +#: ../src/osm.c:174 +msgid "OSM (edit)" +msgstr "" + +#. Note the use of positional parameters +#: ../src/osm.c:179 +msgid "OSM (query)" +msgstr "" + +#: ../src/osm.c:183 +msgid "OSM (render)" +msgstr "" + +#. Example: http://127.0.0.1:8111/load_and_zoom?left=8.19&right=8.20&top=48.605&bottom=48.590&select=node413602999 +#. JOSM or merkaartor must already be running with remote interface enabled +#: ../src/osm.c:190 +msgid "Local port 8111 (eg JOSM)" +msgstr "" + +#: ../src/osm.c:195 +msgid "Geofabrik Map Compare" +msgstr "" + +#: ../src/osm.c:203 +msgid "OpenStreetMap Notes" +msgstr "" + +#. Not really OSM but can't be bothered to create somewhere else to put it... +#: ../src/osm.c:221 +msgid "Wikimedia Toolserver GeoHack" +msgstr "" + +#: ../src/preferences.c:195 +msgid "Preferences" +msgstr "" + +#: ../src/toolbar.c:91 ../src/toolbar.c:92 +msgid "System Default" +msgstr "" + +#: ../src/toolbar.c:91 ../src/viktrwlayer.c:563 +msgid "Small" +msgstr "" + +#: ../src/toolbar.c:91 ../src/viktrwlayer.c:564 +msgid "Medium" +msgstr "" + +#: ../src/toolbar.c:91 ../src/viktrwlayer.c:565 +msgid "Large" +msgstr "" + +#: ../src/toolbar.c:92 +msgid "Icons Only" +msgstr "" + +#: ../src/toolbar.c:92 +msgid "Text Only" +msgstr "" + +#: ../src/toolbar.c:92 +msgid "Icons and Text" +msgstr "" + +#: ../src/toolbar.c:106 +msgid "Append to Menu:" +msgstr "" + +#: ../src/toolbar.c:107 +msgid "Pack the toolbar to the main menu to save vertical space" +msgstr "" + +#: ../src/toolbar.c:108 +msgid "Icon Size:" +msgstr "" + +#: ../src/toolbar.c:110 +msgid "Icon Style:" +msgstr "" + +#: ../src/toolbar.c:112 +msgid "Customize:" +msgstr "" + +#: ../src/toolbar.c:112 +msgid "Customize Buttons" +msgstr "" + +#. Preferences +#: ../src/toolbar.c:145 +msgid "Toolbar" +msgstr "" + +#: ../src/toolbar.c:312 +msgid "_Customize" +msgstr "" + +#: ../src/toolbar.c:641 +msgid "Separator" +msgstr "" + +#: ../src/toolbar.c:642 +msgid "--- Separator ---" +msgstr "" + +#: ../src/toolbar.c:1007 +msgid "Customize Toolbar" +msgstr "" + +#: ../src/toolbar.c:1028 +msgid "" +"Select items to be displayed on the toolbar. Items can be reordered by drag " +"and drop." +msgstr "" + +#: ../src/toolbar.c:1044 +msgid "Available Items" +msgstr "" + +#: ../src/toolbar.c:1065 +msgid "Displayed Items" +msgstr "" + +#: ../src/viklayer_defaults.c:232 +#, c-format +msgid "Could not open file: %s" +msgstr "" + +#: ../src/viklayer_defaults.c:304 +msgid "Layer Defaults" +msgstr "" + +#: ../src/uibuilder.c:196 +msgid "Take care that this password will be stored clearly in a plain file." +msgstr "" + +#: ../src/uibuilder.c:628 ../src/viktrwlayer_export.c:188 +#: ../src/viktrwlayer_export.c:304 ../src/vikwindow.c:3666 +#: ../src/vikwindow.c:4408 +#, c-format +msgid "The file \"%s\" exists, do you wish to overwrite it?" +msgstr "Datoteka \"%s\" že obstaja. Ali jo želite prepisati?" + +#: ../src/vikaggregatelayer.c:41 +msgid "Aggregate" +msgstr "" + +#: ../src/vikaggregatelayer.c:528 ../src/viktrwlayer.c:11700 +#, c-format +msgid "%s: Waypoint List" +msgstr "" + +#: ../src/vikaggregatelayer.c:570 +msgid "Search by Date" +msgstr "" + +#: ../src/vikaggregatelayer.c:576 +msgid "No items found with the requested date." +msgstr "" + +#: ../src/vikaggregatelayer.c:615 ../src/viktrwlayer.c:11691 +#, c-format +msgid "%s: Track and Route List" +msgstr "" + +#: ../src/vikaggregatelayer.c:681 ../src/viktrwlayer.c:8346 +#: ../src/viktrwlayer.c:8417 ../src/viktrwlayer.c:8494 +msgid "_Visibility" +msgstr "" + +#: ../src/vikaggregatelayer.c:686 +msgid "_Show All" +msgstr "" + +#: ../src/vikaggregatelayer.c:692 +msgid "_Hide All" +msgstr "" + +#: ../src/vikaggregatelayer.c:698 ../src/viktrwlayer.c:8363 +#: ../src/viktrwlayer.c:8434 ../src/viktrwlayer.c:8511 +msgid "_Toggle" +msgstr "" + +#: ../src/vikaggregatelayer.c:705 ../src/viktrwlayer.c:8532 +msgid "_Sort" +msgstr "" + +#: ../src/vikaggregatelayer.c:711 ../src/viktrwlayer.c:8538 +msgid "Name _Ascending" +msgstr "" + +#: ../src/vikaggregatelayer.c:717 ../src/viktrwlayer.c:8544 +msgid "Name _Descending" +msgstr "" + +#: ../src/vikaggregatelayer.c:723 ../src/viktrwlayer.c:575 +#: ../src/viktrwlayer.c:8550 +msgid "Date Ascending" +msgstr "" + +#: ../src/vikaggregatelayer.c:729 ../src/viktrwlayer.c:576 +#: ../src/viktrwlayer.c:8556 +msgid "Date Descending" +msgstr "" + +#: ../src/vikaggregatelayer.c:735 ../src/viktrwlayer.c:8445 +#: ../src/viktrwlayer.c:8523 ../src/viktrwlayer.c:8595 +#: ../src/viktrwlayer_tracklist.c:296 +msgid "_Statistics" +msgstr "" + +#: ../src/vikaggregatelayer.c:740 ../src/viktrwlayer.c:4533 +msgid "Track _List..." +msgstr "" + +#: ../src/vikaggregatelayer.c:746 ../src/viktrwlayer.c:4540 +msgid "_Waypoint List..." +msgstr "" + +#: ../src/vikaggregatelayer.c:753 +msgid "Searc_h" +msgstr "" + +#: ../src/vikaggregatelayer.c:759 +msgid "By _Date..." +msgstr "" + +#: ../src/vikaggregatelayer.c:762 +msgid "Find the first item with a specified date" +msgstr "" + +#: ../src/vikaggregatelayer.c:765 +msgid "Load E_xternal Layers" +msgstr "" + +#. Could have a more complicated tooltip that numbers each type of layers, +#. but for now a simple overall count +#: ../src/vikaggregatelayer.c:1011 +#, c-format +msgid "One layer" +msgid_plural "%d layers" +msgstr[0] "" +msgstr[1] "" + +#: ../src/vikaggregatelayer.c:1014 +#, c-format +msgid "Empty" +msgstr "" + +#: ../src/vikdemlayer.c:86 +msgid "SRTM Global 90m (3 arcsec)" +msgstr "" + +#: ../src/vikdemlayer.c:94 +msgid "Absolute height" +msgstr "" + +#: ../src/vikdemlayer.c:95 +msgid "Height gradient" +msgstr "" + +#: ../src/vikdemlayer.c:120 +msgid "DEM Files:" +msgstr "Datoteke DEM:" + +#: ../src/vikdemlayer.c:121 +msgid "Download Source:" +msgstr "Vir prenosa:" + +#: ../src/vikdemlayer.c:122 +msgid "Min Elev Color:" +msgstr "" + +#: ../src/vikdemlayer.c:123 ../src/viktrwlayer_wpwin.c:207 +msgid "Type:" +msgstr "" + +#: ../src/vikdemlayer.c:124 +msgid "Min Elev:" +msgstr "Najmanjša višina:" + +#: ../src/vikdemlayer.c:125 +msgid "Max Elev:" +msgstr "Največja višina:" + +#: ../src/vikdemlayer.c:137 +msgid "_DEM Download" +msgstr "" + +#: ../src/vikdemlayer.c:137 +msgid "DEM Download" +msgstr "" + +#: ../src/vikdemlayer.c:192 +msgid "DEM" +msgstr "" + +#: ../src/vikdemlayer.c:304 +#, c-format +msgid "Number of files: %d" +msgstr "" + +#: ../src/vikdemlayer.c:446 +msgid "DEM Loading" +msgstr "" + +#: ../src/vikdemlayer.c:927 +#, c-format +msgid "No SRTM data available for %f, %f" +msgstr "SRTM podatkov za %f, %f ni na voljo" + +#: ../src/vikdemlayer.c:948 +#, c-format +msgid "DEM download failure for %f, %f" +msgstr "" + +#: ../src/vikdemlayer.c:954 +#, c-format +msgid "DEM write failure for %s" +msgstr "" + +#. Probably not over any land... +#: ../src/vikdemlayer.c:1201 +msgid "No DEM File Available" +msgstr "" + +#: ../src/vikdemlayer.c:1220 +#, c-format +msgid "" +"\n" +"Source: %s\n" +"\n" +"DEM File: %s\n" +"DEM File Timestamp: %s" +msgstr "" + +#: ../src/vikdemlayer.c:1224 +#, c-format +msgid "" +"Source: %s\n" +"\n" +"No DEM File!" +msgstr "" + +#: ../src/vikdemlayer.c:1264 +#, c-format +msgid "Downloading DEM %s" +msgstr "Prenašanje DEM %s" + +#: ../src/vikdemlayer.c:1289 +msgid "_Show DEM File Information" +msgstr "" + +#: ../src/vikfileentry.c:72 +msgid "Browse..." +msgstr "Prebrskaj ..." + +#: ../src/vikfileentry.c:103 +msgid "Choose file" +msgstr "Izberi datoteko" + +#: ../src/vikfileentry.c:120 ../src/vikwindow.c:4372 +msgid "PNG" +msgstr "" + +#: ../src/vikfileentry.c:125 +msgid "TIFF" +msgstr "" + +#: ../src/vikfileentry.c:133 +msgid "MBTiles" +msgstr "" + +#: ../src/vikfileentry.c:142 +msgid "XML" +msgstr "" + +#: ../src/vikfileentry.c:149 +msgid "MML" +msgstr "" + +#: ../src/vikfileentry.c:154 +msgid "MSS" +msgstr "" + +#: ../src/vikfilelist.c:49 +msgid "Choose file(s)" +msgstr "Izberi datoteko(e)" + +#: ../src/vikfilelist.c:182 +msgid "Add..." +msgstr "Dodaj..." + +#: ../src/vikfilelist.c:183 +msgid "Delete" +msgstr "Zbriši" + +#: ../src/vikgeoreflayer.c:97 +msgid "_Georef Move Map" +msgstr "" + +#: ../src/vikgeoreflayer.c:97 +msgid "Georef Move Map" +msgstr "" + +#: ../src/vikgeoreflayer.c:106 +msgid "Georef Z_oom Tool" +msgstr "" + +#: ../src/vikgeoreflayer.c:106 +msgid "Georef Zoom Tool" +msgstr "" + +#: ../src/vikgeoreflayer.c:117 +msgid "GeoRef Map" +msgstr "" + +#: ../src/vikgeoreflayer.c:214 +msgid "Auto Read World Files:" +msgstr "" + +#: ../src/vikgeoreflayer.c:215 +msgid "" +"Automatically attempt to read associated world file of a new image for a " +"GeoRef layer" +msgstr "" + +#: ../src/vikgeoreflayer.c:511 ../src/vikgeoreflayer.c:797 +#: ../src/vikmapslayer.c:1174 +#, c-format +msgid "Couldn't open image file: %s" +msgstr "Ni bilo mogoče odpreti datoteke s sliko: %s" + +#: ../src/vikgeoreflayer.c:607 ../src/vikgeoreflayer.c:633 +msgid "Choose World file" +msgstr "" + +#: ../src/vikgeoreflayer.c:619 +msgid "The World file you requested could not be opened for reading." +msgstr "" + +#: ../src/vikgeoreflayer.c:621 +msgid "Unexpected end of file reading World file." +msgstr "" + +#: ../src/vikgeoreflayer.c:646 +msgid "The file you requested could not be opened for writing." +msgstr "V datoteko, ki ste jo izbrali ni mogoče pisati." + +#: ../src/vikgeoreflayer.c:782 +msgid "Lower right corner values may not be consistent with upper right values" +msgstr "" + +#: ../src/vikgeoreflayer.c:806 +#, c-format +msgid "Invalid image size: %s" +msgstr "" + +#: ../src/vikgeoreflayer.c:831 ../src/viklayer.c:561 ../src/vikwindow.c:4891 +msgid "Layer Properties" +msgstr "Lastnosti plasti" + +#: ../src/vikgeoreflayer.c:852 +msgid "World File Parameters:" +msgstr "" + +#: ../src/vikgeoreflayer.c:853 +msgid "Load From File..." +msgstr "Naloži iz datoteke ..." + +#: ../src/vikgeoreflayer.c:858 +msgid "Corner pixel easting:" +msgstr "" + +#: ../src/vikgeoreflayer.c:860 +msgid "the UTM \"easting\" value of the upper-left corner pixel of the map" +msgstr "" + +#: ../src/vikgeoreflayer.c:862 +msgid "Corner pixel northing:" +msgstr "" + +#: ../src/vikgeoreflayer.c:864 +msgid "the UTM \"northing\" value of the upper-left corner pixel of the map" +msgstr "" + +#: ../src/vikgeoreflayer.c:866 +msgid "X (easting) scale (mpp): " +msgstr "" + +#: ../src/vikgeoreflayer.c:867 +msgid "Y (northing) scale (mpp): " +msgstr "" + +#: ../src/vikgeoreflayer.c:870 +msgid "the scale of the map in the X direction (meters per pixel)" +msgstr "" + +#: ../src/vikgeoreflayer.c:872 +msgid "the scale of the map in the Y direction (meters per pixel)" +msgstr "" + +#: ../src/vikgeoreflayer.c:874 +msgid "Map Image:" +msgstr "Slika zemljevida:" + +#: ../src/vikgeoreflayer.c:919 +msgid "Upper left latitude:" +msgstr "" + +#: ../src/vikgeoreflayer.c:921 +msgid "Upper left longitude:" +msgstr "" + +#: ../src/vikgeoreflayer.c:923 +msgid "Lower right latitude:" +msgstr "" + +#: ../src/vikgeoreflayer.c:925 +msgid "Lower right longitude:" +msgstr "" + +#: ../src/vikgeoreflayer.c:937 +msgid "Calculate MPP values from coordinates" +msgstr "" + +#: ../src/vikgeoreflayer.c:938 +msgid "" +"Enter all corner coordinates before calculating the MPP values from the " +"image size" +msgstr "" + +#: ../src/vikgeoreflayer.c:948 +msgid "UTM" +msgstr "" + +#: ../src/vikgeoreflayer.c:949 +msgid "Latitude/Longitude" +msgstr "" + +#: ../src/vikgeoreflayer.c:957 ../src/vikmapniklayer.c:82 +#: ../src/vikmapslayer.c:158 +msgid "Alpha:" +msgstr "Prosojnost:" + +#. Now with icons +#: ../src/vikgeoreflayer.c:1062 +msgid "_Zoom to Fit Map" +msgstr "" + +#: ../src/vikgeoreflayer.c:1068 +msgid "_Goto Map Center" +msgstr "" + +#: ../src/vikgeoreflayer.c:1074 +msgid "_Export to World File" +msgstr "" + +#: ../src/vikgoto.c:98 +msgid "No goto tool available." +msgstr "" + +#: ../src/vikgoto.c:295 +msgid "goto" +msgstr "" + +#: ../src/vikgoto.c:297 +msgid "goto provider:" +msgstr "" + +#: ../src/vikgoto.c:312 +msgid "Enter address or place name:" +msgstr "Vnesite naslov ali ime kraja:" + +#: ../src/vikgoto.c:487 +msgid "Locality" +msgstr "" + +#: ../src/vikgpslayer.c:137 +msgid "Data Mode" +msgstr "" + +#: ../src/vikgpslayer.c:139 +msgid "Realtime Tracking Mode" +msgstr "" + +#: ../src/vikgpslayer.c:176 +msgid "Keep vehicle at center" +msgstr "" + +#: ../src/vikgpslayer.c:177 +msgid "Keep vehicle on screen" +msgstr "" + +#: ../src/vikgpslayer.c:178 +msgid "Disable" +msgstr "" + +#: ../src/vikgpslayer.c:218 +msgid "Download Tracks:" +msgstr "" + +#: ../src/vikgpslayer.c:219 +msgid "Upload Tracks:" +msgstr "" + +#: ../src/vikgpslayer.c:220 +msgid "Download Routes:" +msgstr "" + +#: ../src/vikgpslayer.c:221 +msgid "Upload Routes:" +msgstr "" + +#: ../src/vikgpslayer.c:222 +msgid "Download Waypoints:" +msgstr "" + +#: ../src/vikgpslayer.c:223 +msgid "Upload Waypoints:" +msgstr "" + +#: ../src/vikgpslayer.c:225 +msgid "Recording tracks" +msgstr "Snemanje sledi" + +#: ../src/vikgpslayer.c:226 +msgid "Jump to current position on start" +msgstr "Ob zagonu skoči na trenutni položaj" + +#: ../src/vikgpslayer.c:227 +msgid "Moving Map Method:" +msgstr "" + +#: ../src/vikgpslayer.c:228 +msgid "Update Statusbar:" +msgstr "" + +#: ../src/vikgpslayer.c:228 +msgid "Display information in the statusbar on GPS updates" +msgstr "" + +#: ../src/vikgpslayer.c:229 +msgid "Auto Connect" +msgstr "" + +#: ../src/vikgpslayer.c:229 +msgid "Automatically connect to GPSD" +msgstr "" + +#: ../src/vikgpslayer.c:230 +msgid "Gpsd Host:" +msgstr "Strežnik gpsd:" + +#: ../src/vikgpslayer.c:231 +msgid "Gpsd Port:" +msgstr "Vrata gpsd" + +#: ../src/vikgpslayer.c:232 +msgid "Gpsd Retry Interval (seconds):" +msgstr "" + +#: ../src/vikgpslayer.c:254 +msgid "GPS" +msgstr "" + +#: ../src/vikgpslayer.c:320 ../src/vikgpslayer.c:1504 +msgid "GPS Download" +msgstr "Prenos iz GPS" + +#: ../src/vikgpslayer.c:320 ../src/vikgpslayer.c:1504 ../src/viktrwlayer.c:3993 +msgid "GPS Upload" +msgstr "Prenos na GPS" + +#: ../src/vikgpslayer.c:322 +msgid "GPS Realtime Tracking" +msgstr "Sledenje v realnem času z GPS" + +#: ../src/vikgpslayer.c:458 +msgid "Connected" +msgstr "" + +#: ../src/vikgpslayer.c:460 +msgid "Disconnected" +msgstr "" + +#: ../src/vikgpslayer.c:554 +msgid "Unknown GPS Protocol" +msgstr "Neznan protokol GPS" + +#: ../src/vikgpslayer.c:572 +msgid "Unknown serial port device" +msgstr "" + +#: ../src/vikgpslayer.c:691 +#, c-format +msgid "%s: unknown parameter" +msgstr "%s: neznan parameter" + +#. Now with icons +#: ../src/vikgpslayer.c:794 +msgid "_Upload to GPS" +msgstr "" + +#: ../src/vikgpslayer.c:800 +msgid "Download from _GPS" +msgstr "" + +#: ../src/vikgpslayer.c:821 +msgid "Empty _Realtime" +msgstr "" + +#: ../src/vikgpslayer.c:828 +msgid "E_mpty Upload" +msgstr "" + +#: ../src/vikgpslayer.c:834 +msgid "_Empty Download" +msgstr "" + +#: ../src/vikgpslayer.c:840 +msgid "Empty _All" +msgstr "" + +#: ../src/vikgpslayer.c:852 +#, c-format +msgid "Unexpected number of disconnected handlers: %d" +msgstr "" + +#: ../src/vikgpslayer.c:995 +#, c-format +msgid "Uploading %d waypoint..." +msgid_plural "Uploading %d waypoints..." +msgstr[0] "" +msgstr[1] "" + +#: ../src/vikgpslayer.c:1000 +#, c-format +msgid "Uploading %d trackpoint..." +msgid_plural "Uploading %d trackpoints..." +msgstr[0] "" +msgstr[1] "" + +#: ../src/vikgpslayer.c:1005 +#, c-format +msgid "Uploading %d routepoint..." +msgid_plural "Uploading %d routepoints..." +msgstr[0] "" +msgstr[1] "" + +#: ../src/vikgpslayer.c:1034 +#, c-format +msgid "Downloaded %d out of %d waypoint..." +msgid_plural "Downloaded %d out of %d waypoints..." +msgstr[0] "" +msgstr[1] "" + +#: ../src/vikgpslayer.c:1040 +#, c-format +msgid "Downloaded %d out of %d trackpoint..." +msgid_plural "Downloaded %d out of %d trackpoints..." +msgstr[0] "" +msgstr[1] "" + +#: ../src/vikgpslayer.c:1046 +#, c-format +msgid "Downloaded %d out of %d routepoint..." +msgid_plural "Downloaded %d out of %d routepoints..." +msgstr[0] "" +msgstr[1] "" + +#: ../src/vikgpslayer.c:1056 +#, c-format +msgid "Uploaded %d out of %d waypoint..." +msgid_plural "Uploaded %d out of %d waypoints..." +msgstr[0] "" +msgstr[1] "" + +#: ../src/vikgpslayer.c:1062 +#, c-format +msgid "Uploaded %d out of %d trackpoint..." +msgid_plural "Uploaded %d out of %d trackpoints..." +msgstr[0] "" +msgstr[1] "" + +#: ../src/vikgpslayer.c:1068 +#, c-format +msgid "Uploaded %d out of %d routepoint..." +msgid_plural "Uploaded %d out of %d routepoints..." +msgstr[0] "" +msgstr[1] "" + +#: ../src/vikgpslayer.c:1079 +#, c-format +msgid "Downloaded %d waypoint" +msgid_plural "Downloaded %d waypoints" +msgstr[0] "" +msgstr[1] "" + +#: ../src/vikgpslayer.c:1085 +#, c-format +msgid "Downloaded %d trackpoint" +msgid_plural "Downloaded %d trackpoints" +msgstr[0] "" +msgstr[1] "" + +#: ../src/vikgpslayer.c:1091 +#, c-format +msgid "Downloaded %d routepoint" +msgid_plural "Downloaded %d routepoints" +msgstr[0] "" +msgstr[1] "" + +#: ../src/vikgpslayer.c:1101 +#, c-format +msgid "Uploaded %d waypoint" +msgid_plural "Uploaded %d waypoints" +msgstr[0] "" +msgstr[1] "" + +#: ../src/vikgpslayer.c:1107 +#, c-format +msgid "Uploaded %d trackpoint" +msgid_plural "Uploaded %d trackpoints" +msgstr[0] "" +msgstr[1] "" + +#: ../src/vikgpslayer.c:1113 +#, c-format +msgid "Uploaded %d routepoint" +msgid_plural "Uploaded %d routepoints" +msgstr[0] "" +msgstr[1] "" + +#: ../src/vikgpslayer.c:1363 +msgid "Error: No result." +msgstr "" + +#: ../src/vikgpslayer.c:1471 +msgid "Warning - GPS Upload items may overwrite each other" +msgstr "" + +#: ../src/vikgpslayer.c:1506 +msgid "Status: detecting gpsbabel" +msgstr "Stanje: iščem gpsbabel" + +#: ../src/vikgpslayer.c:1533 +msgid "No GPS items selected for transfer." +msgstr "" + +#: ../src/vikgpslayer.c:1546 +msgid "Could not turn off device." +msgstr "" + +#: ../src/vikgpslayer.c:1589 +msgid "Are you sure you want to delete GPS Upload data?" +msgstr "" + +#: ../src/vikgpslayer.c:1602 +msgid "Are you sure you want to delete GPS Download data?" +msgstr "" + +#: ../src/vikgpslayer.c:1616 +msgid "Are you sure you want to delete GPS Realtime data?" +msgstr "" + +#: ../src/vikgpslayer.c:1630 +msgid "Are you sure you want to delete All GPS data?" +msgstr "" + +#: ../src/vikgpslayer.c:2004 +#, c-format +msgid "" +"Failed to connect to gpsd at %s (port %s)\n" +"Should Viking keep trying (every %d seconds)?" +msgstr "" + +#: ../src/viklayerspanel.c:73 +msgid "C_ut" +msgstr "" + +#: ../src/viklayerspanel.c:74 ../src/vikwindow.c:4882 +msgid "_Copy" +msgstr "_Kopiraj" + +#: ../src/viklayerspanel.c:75 ../src/vikwindow.c:4883 +msgid "_Paste" +msgstr "_Prilepi" + +#: ../src/viklayerspanel.c:76 ../src/vikwindow.c:4884 +msgid "_Delete" +msgstr "I_zbriši" + +#: ../src/viklayerspanel.c:154 +msgid "New Layer" +msgstr "" + +#: ../src/viklayerspanel.c:347 +msgid "Top Layer" +msgstr "Vrhnja plast" + +#: ../src/viklayerspanel.c:363 +msgid "Add new layer" +msgstr "" + +#: ../src/viklayerspanel.c:370 ../src/vikwindow.c:4884 +msgid "Remove selected layer" +msgstr "" + +#: ../src/viklayerspanel.c:377 +msgid "Move selected layer up" +msgstr "" + +#: ../src/viklayerspanel.c:384 +msgid "Move selected layer down" +msgstr "" + +#: ../src/viklayerspanel.c:391 ../src/vikwindow.c:4881 +msgid "Cut selected layer" +msgstr "" + +#: ../src/viklayerspanel.c:398 ../src/vikwindow.c:4882 +msgid "Copy selected layer" +msgstr "" + +#: ../src/viklayerspanel.c:405 ../src/vikwindow.c:4883 +msgid "" +"Paste layer into selected container layer or otherwise above selected layer" +msgstr "" + +#: ../src/viklayerspanel.c:502 +msgid "New name can not be blank." +msgstr "" + +#: ../src/viklayerspanel.c:751 +msgid "Aggregate Layers have no settable properties." +msgstr "" + +#: ../src/viklayerspanel.c:798 +msgid "You cannot cut the Top Layer." +msgstr "Ne morete izrezati vrhnje plasti." + +#: ../src/viklayerspanel.c:843 +#, c-format +msgid "Are you sure you want to delete %s?" +msgstr "" + +#: ../src/viklayerspanel.c:863 +msgid "You cannot delete the Top Layer." +msgstr "Ne morete izbrisati vrhnje plasti." + +#: ../src/vikmapniklayer.c:78 +msgid "CSS (MML) Config File:" +msgstr "" + +#: ../src/vikmapniklayer.c:79 +msgid "CartoCSS configuration file" +msgstr "" + +#: ../src/vikmapniklayer.c:80 +msgid "XML Config File:" +msgstr "" + +#: ../src/vikmapniklayer.c:81 +msgid "Mapnik XML configuration file" +msgstr "" + +#: ../src/vikmapniklayer.c:84 +msgid "Use File Cache:" +msgstr "" + +#: ../src/vikmapniklayer.c:86 +msgid "File Cache Directory:" +msgstr "" + +#: ../src/vikmapniklayer.c:122 +msgid "_Mapnik Features" +msgstr "" + +#: ../src/vikmapniklayer.c:122 +msgid "Mapnik Features" +msgstr "" + +#: ../src/vikmapniklayer.c:140 +msgid "Mapnik Rendering" +msgstr "" + +#. Changing these values only applies before first mapnik layer is 'created' +#: ../src/vikmapniklayer.c:258 +msgid "Plugins Directory:" +msgstr "" + +#: ../src/vikmapniklayer.c:258 ../src/vikmapniklayer.c:259 +#: ../src/vikmapniklayer.c:260 ../src/vikmapniklayer.c:261 +msgid "You need to restart Viking for a change to this value to be used" +msgstr "" + +#: ../src/vikmapniklayer.c:259 +msgid "Fonts Directory:" +msgstr "" + +#: ../src/vikmapniklayer.c:260 +msgid "Recurse Fonts Directory:" +msgstr "" + +#: ../src/vikmapniklayer.c:261 +msgid "Rerender Timeout (hours):" +msgstr "" + +#. Changeable any time +#: ../src/vikmapniklayer.c:263 +msgid "CartoCSS:" +msgstr "" + +#: ../src/vikmapniklayer.c:263 +msgid "The program to convert CartoCSS files into Mapnik XML" +msgstr "" + +#: ../src/vikmapniklayer.c:506 +msgid "Running" +msgstr "" + +#: ../src/vikmapniklayer.c:525 +#, c-format +msgid "" +"Error running carto command:\n" +"%s" +msgstr "" + +#: ../src/vikmapniklayer.c:561 +msgid " completed in " +msgstr "" + +#: ../src/vikmapniklayer.c:561 +msgid "seconds" +msgstr "" + +#: ../src/vikmapniklayer.c:611 ../src/vikmapniklayer.c:979 +#, c-format +msgid "" +"Mapnik error loading configuration file:\n" +"%s" +msgstr "" + +#: ../src/vikmapniklayer.c:749 +#, c-format +msgid "Mapnik Render %d:%d:%d %s" +msgstr "" + +#: ../src/vikmapniklayer.c:840 +msgid "Mapnik Rendering must be in Mercator mode" +msgstr "" + +#: ../src/vikmapniklayer.c:997 +msgid "Mapnik Information" +msgstr "" + +#: ../src/vikmapniklayer.c:1031 +msgid "_Flush Memory Cache" +msgstr "" + +#: ../src/vikmapniklayer.c:1044 +msgid "_Run Carto Command" +msgstr "" + +#: ../src/vikmapniklayer.c:1102 ../src/vikmapslayer.c:2029 +#, c-format +msgid "Tile File Timestamp: %s" +msgstr "" + +#: ../src/vikmapniklayer.c:1105 ../src/vikmapslayer.c:2032 +msgid "Tile File Timestamp: Not Available" +msgstr "" + +#: ../src/vikmapniklayer.c:1120 +#, c-format +msgid "Rendering time %.2f seconds" +msgstr "" + +#: ../src/vikmapniklayer.c:1124 ../src/vikmapslayer.c:2042 +msgid "Tile Information" +msgstr "" + +#: ../src/vikmapniklayer.c:1145 +msgid "_Rerender Tile" +msgstr "" + +#: ../src/vikmapniklayer.c:1150 +msgid "_Info" +msgstr "" + +#. ******* MAPZOOMS ******** +#: ../src/vikmapslayer.c:96 +msgid "Use Viking Zoom Level" +msgstr "" + +#: ../src/vikmapslayer.c:146 +msgid "OSM" +msgstr "" + +#. NB mode => id - But can't break file format just to rename something better +#: ../src/vikmapslayer.c:152 +msgid "Map Type:" +msgstr "Vrsta zemljevida:" + +#: ../src/vikmapslayer.c:153 +msgid "Maps Directory:" +msgstr "" + +#: ../src/vikmapslayer.c:154 +msgid "Cache Layout:" +msgstr "" + +#: ../src/vikmapslayer.c:155 +msgid "This determines the tile storage layout on disk" +msgstr "" + +#: ../src/vikmapslayer.c:156 +msgid "Map File:" +msgstr "" + +#: ../src/vikmapslayer.c:157 +msgid "An MBTiles file. Only applies when the map type method is 'MBTiles'" +msgstr "" + +#: ../src/vikmapslayer.c:159 +msgid "Control the Alpha value for transparency effects" +msgstr "" + +#: ../src/vikmapslayer.c:160 +msgid "Autodownload maps:" +msgstr "Samodejen prenos zemljevidov:" + +#: ../src/vikmapslayer.c:161 +msgid "Autodownload Only Gets Missing Maps:" +msgstr "" + +#: ../src/vikmapslayer.c:162 +msgid "" +"Using this option avoids attempting to update already acquired tiles. This " +"can be useful if you want to restrict the network usage, without having to " +"resort to manual control. Only applies when 'Autodownload Maps' is on." +msgstr "" + +#: ../src/vikmapslayer.c:163 +msgid "Zoom Level:" +msgstr "" + +#: ../src/vikmapslayer.c:164 +msgid "" +"Determines the method of displaying map tiles for the current zoom level. " +"'Viking Zoom Level' uses the best matching level, otherwise setting a fixed " +"value will always use map tiles of the specified value regardless of the " +"actual zoom level." +msgstr "" + +#: ../src/vikmapslayer.c:197 +msgid "_Maps Download" +msgstr "" + +#: ../src/vikmapslayer.c:197 +msgid "Maps Download" +msgstr "Prenos zemljevidov" + +#: ../src/vikmapslayer.c:213 ../src/vikutils.c:895 +msgid "Map" +msgstr "Zemljevid" + +#: ../src/vikmapslayer.c:306 +msgid "Default map layer directory:" +msgstr "" + +#: ../src/vikmapslayer.c:306 +msgid "Choose a directory to store cached Map tiles for this layer" +msgstr "" + +#: ../src/vikmapslayer.c:436 ../src/vikmapslayer.c:633 +msgid "Unknown map type" +msgstr "Neznana vrsta zemljevida" + +#: ../src/vikmapslayer.c:664 +msgid "Unknown Map Zoom" +msgstr "" + +#: ../src/vikmapslayer.c:833 +#, c-format +msgid "Failed to open MBTiles file: %s" +msgstr "" + +#: ../src/vikmapslayer.c:856 +#, c-format +msgid "" +"New map cannot be displayed in the current drawmode.\n" +"Select \"%s\" from View menu to view it." +msgstr "" + +#: ../src/vikmapslayer.c:1314 +#, c-format +msgid "" +"Cowardly refusing to draw tiles or existence of tiles beyond %d zoom out " +"factor" +msgstr "" + +#. TODO: ?? count up the number of download errors somehow... +#: ../src/vikmapslayer.c:1667 +msgid "Failed to download tile" +msgstr "" + +#: ../src/vikmapslayer.c:1673 +msgid "Unable to save tile" +msgstr "" + +#: ../src/vikmapslayer.c:1799 +#, c-format +msgid "Redownloading up to %d %s map..." +msgid_plural "Redownloading up to %d %s maps..." +msgstr[0] "Ponoven prenos do %d %s zemljevidov..." +msgstr[1] "Ponoven prenos do %d %s zemljevida..." +msgstr[2] "Ponoven prenos do %d %s zemljevidov..." +msgstr[3] "Ponoven prenos do %d %s zemljevidov..." + +#: ../src/vikmapslayer.c:1801 +#, c-format +msgid "Redownloading %d %s map..." +msgid_plural "Redownloading %d %s maps..." +msgstr[0] "Ponoven prenos %d %s zemljevidov..." +msgstr[1] "Ponoven prenos %d %s zemljevida..." +msgstr[2] "Ponoven prenos %d %s zemljevidov..." +msgstr[3] "Ponoven prenos %d %s zemljevidov..." + +#: ../src/vikmapslayer.c:1805 ../src/vikmapslayer.c:1890 +#, c-format +msgid "Downloading %d %s map..." +msgid_plural "Downloading %d %s maps..." +msgstr[0] "Prenos %d %s zemljevidov..." +msgstr[1] "Prenos %d %s zemljevida..." +msgstr[2] "Prenos %d %s zemljevidov..." +msgstr[3] "Prenos %d %s zemljevidov..." + +#: ../src/vikmapslayer.c:1969 +msgid "YES" +msgstr "" + +#: ../src/vikmapslayer.c:1973 ../src/vikmapslayer.c:1977 +msgid "NO" +msgstr "" + +#. NB Also handles .jpg automatically due to pixbuf_new_from () support - although just print png for now. +#: ../src/vikmapslayer.c:1980 +#, c-format +msgid "Source: %s (%d%s%d%s%d.%s %s)" +msgstr "" + +#: ../src/vikmapslayer.c:1983 +msgid "Source: Not available" +msgstr "" + +#: ../src/vikmapslayer.c:2000 +msgid "Source: file://" +msgstr "" + +#: ../src/vikmapslayer.c:2012 +#, c-format +msgid "Source: %s" +msgstr "" + +#: ../src/vikmapslayer.c:2038 +#, c-format +msgid "Tile File: %s [Not Available]" +msgstr "" + +#: ../src/vikmapslayer.c:2086 +msgid "Redownload _Bad Map(s)" +msgstr "" + +#: ../src/vikmapslayer.c:2090 +msgid "Redownload _New Map(s)" +msgstr "" + +#: ../src/vikmapslayer.c:2094 +msgid "Redownload _All Map(s)" +msgstr "" + +#: ../src/vikmapslayer.c:2099 +msgid "_Show Tile Information" +msgstr "" + +#: ../src/vikmapslayer.c:2166 +#, c-format +msgid "" +"Wrong drawmode for this map.\n" +"Select \"%s\" from View menu and try again." +msgstr "" + +#: ../src/vikmapslayer.c:2171 +msgid "Wrong zoom level for this map." +msgstr "" + +#: ../src/vikmapslayer.c:2334 +msgid "Zoom Start:" +msgstr "" + +#: ../src/vikmapslayer.c:2341 +msgid "Zoom End:" +msgstr "" + +#: ../src/vikmapslayer.c:2347 +msgid "Download Maps Method:" +msgstr "" + +#. redownload method - needs to align with REDOWNLOAD* macro values +#: ../src/vikmapslayer.c:2419 +msgid "Missing" +msgstr "" + +#: ../src/vikmapslayer.c:2419 +msgid "Bad" +msgstr "" + +#: ../src/vikmapslayer.c:2419 +msgid "New" +msgstr "" + +#: ../src/vikmapslayer.c:2419 +msgid "Reload All" +msgstr "" + +#: ../src/vikmapslayer.c:2421 +msgid "Download for Zoom Levels" +msgstr "" + +#: ../src/vikmapslayer.c:2461 +#, c-format +msgid "" +"You are not allowed to download more than %d tiles in one go (requested %d)" +msgstr "" + +#: ../src/vikmapslayer.c:2469 +#, c-format +msgid "Do you really want to download %d tiles?" +msgstr "" + +#. Now with icons +#: ../src/vikmapslayer.c:2509 +msgid "Download _Missing Onscreen Maps" +msgstr "" + +#: ../src/vikmapslayer.c:2516 +msgid "Download _New Onscreen Maps" +msgstr "" + +#: ../src/vikmapslayer.c:2523 +msgid "Reload _All Onscreen Maps" +msgstr "" + +#: ../src/vikmapslayer.c:2529 +msgid "Download Maps in _Zoom Levels..." +msgstr "" + +#: ../src/vikmapslayer.c:2539 +#, fuzzy +msgid "_Open MBTiles Files" +msgstr "Odpri datoteko" + +#: ../src/vikmapslayer.c:2554 +msgid "Flush Map Cache" +msgstr "" + +#: ../src/vikrouting.c:54 +msgid "Default engine:" +msgstr "" + +#: ../src/vikrouting.c:68 +msgid "Routing" +msgstr "" + +#: ../src/viktreeview.c:347 +msgid "Layer Name" +msgstr "Naziv plasti" + +#: ../src/viktreeview.c:924 +#, c-format +msgid "delete data from %s\n" +msgstr "Izbriši podatke iz %s\n" + +#: ../src/viktrwlayer.c:427 +msgid "Create _Waypoint" +msgstr "" + +#: ../src/viktrwlayer.c:427 +msgid "Create Waypoint" +msgstr "" + +#: ../src/viktrwlayer.c:437 +#, fuzzy +msgid "Edit _Track" +msgstr "Uredi točko sledi" + +#: ../src/viktrwlayer.c:437 +#, fuzzy +msgid "Edit Track" +msgstr "Uredi točko sledi" + +#: ../src/viktrwlayer.c:449 +msgid "Edit _Route" +msgstr "" + +#: ../src/viktrwlayer.c:449 +msgid "Edit Route" +msgstr "" + +#: ../src/viktrwlayer.c:460 +msgid "Route _Finder" +msgstr "" + +#: ../src/viktrwlayer.c:460 +msgid "Route Finder" +msgstr "" + +#: ../src/viktrwlayer.c:471 +#, fuzzy +msgid "Splitter" +msgstr "Razdeli tu" + +#: ../src/viktrwlayer.c:482 +msgid "_Edit Waypoint" +msgstr "" + +#: ../src/viktrwlayer.c:482 +msgid "Edit Waypoint" +msgstr "" + +#: ../src/viktrwlayer.c:495 +msgid "Edit Trac_kpoint" +msgstr "" + +#: ../src/viktrwlayer.c:495 +msgid "Edit Trackpoint" +msgstr "Uredi točko sledi" + +#. a pixbuf for this one is already made globally available +#: ../src/viktrwlayer.c:508 +msgid "Show P_icture" +msgstr "" + +#: ../src/viktrwlayer.c:508 +msgid "Show Picture" +msgstr "Prikaži sliko" + +#: ../src/viktrwlayer.c:531 +msgid "Waypoint Images" +msgstr "" + +#: ../src/viktrwlayer.c:531 +msgid "Tracks Advanced" +msgstr "" + +#: ../src/viktrwlayer.c:531 +msgid "Metadata" +msgstr "" + +#: ../src/viktrwlayer.c:531 +msgid "Filesystem" +msgstr "" + +#: ../src/viktrwlayer.c:534 +msgid "Draw by Track" +msgstr "Riši po sledeh" + +#: ../src/viktrwlayer.c:534 +msgid "Draw by Speed" +msgstr "" + +#: ../src/viktrwlayer.c:534 +msgid "All Tracks Same Color" +msgstr "" + +#: ../src/viktrwlayer.c:535 +msgid "Filled Square" +msgstr "Zapolnjen kvadrat" + +#: ../src/viktrwlayer.c:535 +msgid "Square" +msgstr "Kvadrat" + +#: ../src/viktrwlayer.c:535 +msgid "Circle" +msgstr "Krožec" + +#: ../src/viktrwlayer.c:535 +msgid "X" +msgstr "X" + +#: ../src/viktrwlayer.c:561 +msgid "Extra Extra Small" +msgstr "" + +#: ../src/viktrwlayer.c:562 +msgid "Extra Small" +msgstr "" + +#: ../src/viktrwlayer.c:566 +msgid "Extra Large" +msgstr "" + +#: ../src/viktrwlayer.c:567 +msgid "Extra Extra Large" +msgstr "" + +#: ../src/viktrwlayer.c:573 +msgid "Name Ascending" +msgstr "" + +#: ../src/viktrwlayer.c:574 +msgid "Name Descending" +msgstr "" + +#: ../src/viktrwlayer.c:582 ../src/viktrwlayer_propwin.c:3319 +msgid "No" +msgstr "" + +#: ../src/viktrwlayer.c:583 +msgid "Yes" +msgstr "" + +#: ../src/viktrwlayer.c:584 +msgid "No write" +msgstr "" + +#: ../src/viktrwlayer.c:649 ../src/viktrwlayer.c:673 +msgid "Draw Labels" +msgstr "Nariši oznake" + +#: ../src/viktrwlayer.c:650 +msgid "Note: the individual track controls what labels may be displayed" +msgstr "" + +#: ../src/viktrwlayer.c:651 +msgid "Track Labels Font Size:" +msgstr "" + +#: ../src/viktrwlayer.c:652 +msgid "Track Drawing Mode:" +msgstr "Način risanja sledi:" + +#: ../src/viktrwlayer.c:653 +msgid "All Tracks Color:" +msgstr "" + +#: ../src/viktrwlayer.c:654 +msgid "The color used when 'All Tracks Same Color' drawing mode is selected" +msgstr "" + +#: ../src/viktrwlayer.c:655 +msgid "Draw Track Lines" +msgstr "Riši črte sledi" + +#: ../src/viktrwlayer.c:656 +msgid "Track Thickness:" +msgstr "Debelina sledi:" + +#: ../src/viktrwlayer.c:657 +msgid "Draw Track Direction" +msgstr "" + +#: ../src/viktrwlayer.c:658 +msgid "Direction Size:" +msgstr "" + +#: ../src/viktrwlayer.c:659 +msgid "Draw Trackpoints" +msgstr "Riši točke sledi" + +#: ../src/viktrwlayer.c:660 +msgid "Trackpoint Size:" +msgstr "" + +#: ../src/viktrwlayer.c:661 +msgid "Draw Elevation" +msgstr "Riši višino" + +#: ../src/viktrwlayer.c:662 +msgid "Draw Elevation Height %:" +msgstr "" + +#: ../src/viktrwlayer.c:663 +msgid "Draw Stops" +msgstr "Riši zaustavitve" + +#: ../src/viktrwlayer.c:664 +msgid "" +"Whether to draw a marker when trackpoints are at the same position but over " +"the minimum stop length apart in time" +msgstr "" + +#: ../src/viktrwlayer.c:665 +msgid "Min Stop Length (seconds):" +msgstr "Najkrajša zaustavitev (sekund):" + +#: ../src/viktrwlayer.c:667 +msgid "Track BG Thickness:" +msgstr "Debelina ozadja sledi:" + +#: ../src/viktrwlayer.c:668 +msgid "Track Background Color" +msgstr "Barva ozadja sledi:" + +#: ../src/viktrwlayer.c:669 +msgid "Draw by Speed Factor (%):" +msgstr "" + +#: ../src/viktrwlayer.c:670 +msgid "" +"The percentage factor away from the average speed determining the color used" +msgstr "" + +#: ../src/viktrwlayer.c:671 +msgid "Track Sort Order:" +msgstr "" + +#: ../src/viktrwlayer.c:674 +msgid "Waypoint Font Size:" +msgstr "" + +#: ../src/viktrwlayer.c:675 +msgid "Waypoint Color:" +msgstr "" + +#: ../src/viktrwlayer.c:676 +msgid "Waypoint Text:" +msgstr "" + +#: ../src/viktrwlayer.c:677 +msgid "Background:" +msgstr "Ozadje:" + +#: ../src/viktrwlayer.c:678 +msgid "Fake BG Color Translucency:" +msgstr "" + +#: ../src/viktrwlayer.c:679 +msgid "Waypoint marker:" +msgstr "" + +#: ../src/viktrwlayer.c:680 +msgid "Waypoint size:" +msgstr "" + +#: ../src/viktrwlayer.c:681 +msgid "Draw Waypoint Symbols:" +msgstr "" + +#: ../src/viktrwlayer.c:682 +msgid "Waypoint Sort Order:" +msgstr "" + +#: ../src/viktrwlayer.c:684 +msgid "Draw Waypoint Images" +msgstr "" + +#: ../src/viktrwlayer.c:685 +msgid "Image Size (pixels):" +msgstr "Velikost slike (slikovnih točk):" + +#: ../src/viktrwlayer.c:686 +msgid "Image Alpha:" +msgstr "Prosojnost slike:" + +#: ../src/viktrwlayer.c:687 +msgid "Image Memory Cache Size:" +msgstr "" + +#: ../src/viktrwlayer.c:690 +msgid "Author" +msgstr "" + +#: ../src/viktrwlayer.c:691 +msgid "Creation Time" +msgstr "" + +#: ../src/viktrwlayer.c:692 +msgid "Keywords" +msgstr "" + +#: ../src/viktrwlayer.c:693 +msgid "External layer:" +msgstr "" + +#: ../src/viktrwlayer.c:693 +msgid "" +"Layer data stored in the Viking file, in an external file, or in an external " +"file but changes are not written to the file (file only loaded at startup)" +msgstr "" + +#: ../src/viktrwlayer.c:694 +msgid "Save layer as:" +msgstr "" + +#: ../src/viktrwlayer.c:694 +msgid "Specify where layer should be saved. Overwrites file if it exists." +msgstr "" + +#: ../src/viktrwlayer.c:798 +msgid "TrackWaypoint" +msgstr "" + +#: ../src/viktrwlayer.c:1999 ../src/viktrwlayer_propwin.c:1469 +#: ../src/viktrwlayer_propwin.c:1471 ../src/vikutils.c:299 +#: ../src/vikutils.c:326 +msgid "miles" +msgstr "" + +#: ../src/viktrwlayer.c:2002 ../src/viktrwlayer_propwin.c:1475 +#: ../src/viktrwlayer_propwin.c:1477 ../src/vikutils.c:303 +#: ../src/vikutils.c:330 +msgid "NM" +msgstr "" + +#. VIK_UNITS_DISTANCE_KILOMETRES: +#: ../src/viktrwlayer.c:2006 ../src/viktrwlayer_propwin.c:1482 +#: ../src/viktrwlayer_propwin.c:1484 ../src/vikutils.c:308 +#: ../src/vikutils.c:335 +msgid "km" +msgstr "" + +#: ../src/viktrwlayer.c:2121 +msgid "start/end" +msgstr "" + +#: ../src/viktrwlayer.c:2133 +msgid "start" +msgstr "" + +#: ../src/viktrwlayer.c:2142 +msgid "end" +msgstr "" + +#: ../src/viktrwlayer.c:3103 +#, c-format +msgid " in %d:%02d hrs:mins" +msgstr "" + +#: ../src/viktrwlayer.c:3107 +#, c-format +msgid "" +"\n" +"%sTotal Length %.1f %s%s" +msgstr "" + +#: ../src/viktrwlayer.c:3131 +#, c-format +msgid "" +"\n" +"Total route length %.1f %s" +msgstr "" + +#: ../src/viktrwlayer.c:3136 +#, c-format +msgid "Tracks: %d - Waypoints: %d - Routes: %d%s%s" +msgstr "" + +#: ../src/viktrwlayer.c:3155 +#, c-format +msgid "Tracks: %d" +msgstr "" + +#: ../src/viktrwlayer.c:3165 +#, c-format +msgid "Routes: %d" +msgstr "" + +#: ../src/viktrwlayer.c:3195 +#, c-format +msgid "- %d:%02d hrs:mins" +msgstr "" + +#: ../src/viktrwlayer.c:3202 +#, c-format +msgid "%s%.1f km %s" +msgstr "" + +#: ../src/viktrwlayer.c:3205 +#, c-format +msgid "%s%.1f miles %s" +msgstr "" + +#: ../src/viktrwlayer.c:3208 +#, c-format +msgid "%s%.1f NM %s" +msgstr "" + +#: ../src/viktrwlayer.c:3222 +#, c-format +msgid "Waypoints: %d" +msgstr "" + +#: ../src/viktrwlayer.c:3279 +#, c-format +msgid "Wpt: Alt %dft" +msgstr "" + +#. VIK_UNITS_HEIGHT_METRES: +#: ../src/viktrwlayer.c:3283 +#, c-format +msgid "Wpt: Alt %dm" +msgstr "" + +#. Add comment if available +#: ../src/viktrwlayer.c:3298 +#, c-format +msgid "%s | %s %s | Comment: %s" +msgstr "" + +#: ../src/viktrwlayer.c:3300 +#, c-format +msgid "%s | %s %s" +msgstr "" + +#: ../src/viktrwlayer.c:3562 ../src/viktrwlayer.c:3591 +msgid "This layer has no waypoints or trackpoints." +msgstr "" + +#: ../src/viktrwlayer.c:3598 ../src/viktrwlayer.c:3607 +#: ../src/viktrwlayer.c:3616 ../src/viktrwlayer.c:3625 +#: ../src/viktrwlayer.c:3634 ../src/viktrwlayer.c:3642 +msgid "Export Layer" +msgstr "Izvozi plast" + +#: ../src/viktrwlayer.c:3671 +msgid "Export Route as GPX" +msgstr "" + +#: ../src/viktrwlayer.c:3673 +msgid "Export Track as GPX" +msgstr "" + +#: ../src/viktrwlayer.c:3693 +msgid "Find" +msgstr "" + +#: ../src/viktrwlayer.c:3703 +msgid "Waypoint Name:" +msgstr "" + +#: ../src/viktrwlayer.c:3720 +msgid "Waypoint not found in this layer." +msgstr "" + +#: ../src/viktrwlayer.c:3989 +msgid "Can not upload invisible track." +msgstr "" + +#: ../src/viktrwlayer.c:4082 ../src/viktrwlayer.c:10512 +msgid "Track" +msgstr "" + +#: ../src/viktrwlayer.c:4107 ../src/viktrwlayer.c:10599 +msgid "Route" +msgstr "" + +#: ../src/viktrwlayer.c:4194 +msgid "Externa_l" +msgstr "" + +#: ../src/viktrwlayer.c:4216 ../src/viktrwlayer.c:8456 +#: ../src/viktrwlayer.c:8574 +msgid "_Finish Route" +msgstr "" + +#: ../src/viktrwlayer.c:4218 ../src/viktrwlayer.c:8380 +#: ../src/viktrwlayer.c:8572 +msgid "_Finish Track" +msgstr "" + +#. Now with icons +#: ../src/viktrwlayer.c:4230 +msgid "_View Layer" +msgstr "" + +#: ../src/viktrwlayer.c:4237 +msgid "V_iew" +msgstr "" + +#: ../src/viktrwlayer.c:4243 +msgid "View All _Tracks" +msgstr "" + +#: ../src/viktrwlayer.c:4248 +msgid "View All _Routes" +msgstr "" + +#: ../src/viktrwlayer.c:4253 +msgid "View All _Waypoints" +msgstr "" + +#: ../src/viktrwlayer.c:4258 +msgid "_Goto Center of Layer" +msgstr "" + +#: ../src/viktrwlayer.c:4264 ../src/viktrwlayer.c:8321 +msgid "Goto _Waypoint..." +msgstr "" + +#: ../src/viktrwlayer.c:4270 +msgid "_Export Layer" +msgstr "" + +#: ../src/viktrwlayer.c:4276 +msgid "Export as GPS_Point..." +msgstr "" + +#: ../src/viktrwlayer.c:4281 +msgid "Export as GPS_Mapper..." +msgstr "" + +#: ../src/viktrwlayer.c:4286 +msgid "Export as _GPX..." +msgstr "" + +#: ../src/viktrwlayer.c:4292 +msgid "Export as _KML..." +msgstr "" + +#: ../src/viktrwlayer.c:4299 +msgid "Export as GEO_JSON..." +msgstr "" + +#: ../src/viktrwlayer.c:4306 +msgid "Export via GPSbabel..." +msgstr "" + +#: ../src/viktrwlayer.c:4312 +#, c-format +msgid "Open with External Program_1: %s" +msgstr "" + +#: ../src/viktrwlayer.c:4319 +#, c-format +msgid "Open with External Program_2: %s" +msgstr "" + +#: ../src/viktrwlayer.c:4327 ../src/vikwindow.c:4825 +msgid "_New" +msgstr "_Novo" + +#: ../src/viktrwlayer.c:4333 +msgid "New _Waypoint..." +msgstr "" + +#: ../src/viktrwlayer.c:4339 +msgid "New _Track" +msgstr "" + +#: ../src/viktrwlayer.c:4347 +msgid "New _Route" +msgstr "" + +#: ../src/viktrwlayer.c:4356 ../src/viktrwlayer.c:8232 +#: ../src/viktrwlayer.c:9003 +msgid "Geotag _Images..." +msgstr "" + +#: ../src/viktrwlayer.c:4363 +msgid "_Acquire" +msgstr "" + +#: ../src/viktrwlayer.c:4369 ../src/vikwindow.c:4904 +msgid "From _GPS..." +msgstr "Iz _GPS..." + +#. FIXME: only add menu when at least a routing engine has support for Directions +#: ../src/viktrwlayer.c:4375 +msgid "From _Directions..." +msgstr "" + +#: ../src/viktrwlayer.c:4381 +msgid "From _OSM Traces..." +msgstr "" + +#: ../src/viktrwlayer.c:4386 +msgid "From _My OSM Traces..." +msgstr "" + +#: ../src/viktrwlayer.c:4392 ../src/vikwindow.c:4844 +msgid "From _URL..." +msgstr "" + +#: ../src/viktrwlayer.c:4399 ../src/vikwindow.c:4846 +msgid "From _Wikipedia Waypoints" +msgstr "" + +#: ../src/viktrwlayer.c:4405 +msgid "Within _Layer Bounds" +msgstr "" + +#: ../src/viktrwlayer.c:4411 +msgid "Within _Current View" +msgstr "" + +#: ../src/viktrwlayer.c:4419 +msgid "From Geo_caching..." +msgstr "" + +#: ../src/viktrwlayer.c:4426 ../src/vikwindow.c:4842 +msgid "From Geotagged _Images..." +msgstr "" + +#: ../src/viktrwlayer.c:4433 +msgid "From _File..." +msgstr "" + +#: ../src/viktrwlayer.c:4436 ../src/vikwindow.c:4905 +msgid "Import File With GPS_Babel..." +msgstr "" + +#: ../src/viktrwlayer.c:4443 ../src/viktrwlayer.c:8905 +msgid "_Upload" +msgstr "" + +#: ../src/viktrwlayer.c:4449 +msgid "Upload to _GPS..." +msgstr "" + +#: ../src/viktrwlayer.c:4456 ../src/viktrwlayer.c:8973 +msgid "Upload to _OSM..." +msgstr "" + +#: ../src/viktrwlayer.c:4464 +msgid "De_lete" +msgstr "" + +#: ../src/viktrwlayer.c:4470 +msgid "Delete All _Tracks" +msgstr "" + +#: ../src/viktrwlayer.c:4477 +msgid "Delete Tracks _From Selection..." +msgstr "" + +#: ../src/viktrwlayer.c:4484 ../src/viktrwlayer.c:8481 +msgid "Delete _All Routes" +msgstr "" + +#: ../src/viktrwlayer.c:4491 ../src/viktrwlayer.c:8487 +msgid "_Delete Routes From Selection..." +msgstr "" + +#: ../src/viktrwlayer.c:4498 +msgid "Delete All _Waypoints" +msgstr "" + +#: ../src/viktrwlayer.c:4505 +msgid "Delete Waypoints From _Selection..." +msgstr "" + +#: ../src/viktrwlayer.c:4512 ../src/viktrwlayer.c:8339 +#, fuzzy +msgid "Delete Duplicate Waypoints" +msgstr "Odstrani podvojene točke" + +#: ../src/viktrwlayer.c:5198 +#, c-format +msgid "Are you sure you want to delete all tracks in %s?" +msgstr "" + +#: ../src/viktrwlayer.c:5211 +#, c-format +msgid "Are you sure you want to delete all routes in %s?" +msgstr "" + +#: ../src/viktrwlayer.c:5221 +#, c-format +msgid "Are you sure you want to delete all waypoints in %s?" +msgstr "" + +#: ../src/viktrwlayer.c:5238 +#, c-format +msgid "Are you sure you want to delete the waypoint \"%s\"?" +msgstr "" + +#: ../src/viktrwlayer.c:5254 +#, c-format +msgid "Are you sure you want to delete the track \"%s\"?" +msgstr "" + +#: ../src/viktrwlayer.c:5271 +#, c-format +msgid "Are you sure you want to delete the route \"%s\"?" +msgstr "" + +#: ../src/viktrwlayer.c:5527 ../src/viktrwlayer.c:6373 +msgid "" +"Converting a track to a route removes extra track data such as segments, " +"timestamps, etc...\n" +"Do you want to continue?" +msgstr "" + +#: ../src/viktrwlayer.c:5631 +msgid "No DEM layers available, thus no DEM values can be applied." +msgstr "" + +#: ../src/viktrwlayer.c:5651 ../src/viktrwlayer.c:5692 +#, c-format +msgid "%ld point adjusted" +msgid_plural "%ld points adjusted" +msgstr[0] "" +msgstr[1] "" + +#: ../src/viktrwlayer.c:5736 +#, c-format +msgid "%ld waypoint changed" +msgid_plural "%ld waypoints changed" +msgstr[0] "" +msgstr[1] "" + +#: ../src/viktrwlayer.c:5917 +#, c-format +msgid "" +"Refining a track with many points (%d) is unlikely to yield sensible " +"results. Do you want to Continue?" +msgstr "" + +#. Select engine from dialog +#: ../src/viktrwlayer.c:5925 +msgid "Refine Route with Routing Engine..." +msgstr "" + +#: ../src/viktrwlayer.c:5933 +msgid "Select routing engine" +msgstr "" + +#: ../src/viktrwlayer.c:6158 +msgid "Failed. No other tracks with timestamps in this layer found" +msgstr "" + +#: ../src/viktrwlayer.c:6160 +msgid "Failed. No other tracks without timestamps in this layer found" +msgstr "" + +#: ../src/viktrwlayer.c:6179 +msgid "Merge with..." +msgstr "" + +#: ../src/viktrwlayer.c:6180 +msgid "Select route to merge with" +msgstr "" + +#: ../src/viktrwlayer.c:6180 +msgid "Select track to merge with" +msgstr "" + +#: ../src/viktrwlayer.c:6264 ../src/viktrwlayer.c:6346 +msgid "Append Route" +msgstr "" + +#: ../src/viktrwlayer.c:6264 ../src/viktrwlayer.c:6346 +msgid "Append Track" +msgstr "" + +#: ../src/viktrwlayer.c:6265 +msgid "Select the route to append after the current route" +msgstr "" + +#: ../src/viktrwlayer.c:6266 +msgid "Select the track to append after the current track" +msgstr "" + +#: ../src/viktrwlayer.c:6347 +msgid "Select the track to append after the current route" +msgstr "" + +#: ../src/viktrwlayer.c:6348 +msgid "Select the route to append after the current track" +msgstr "" + +#: ../src/viktrwlayer.c:6414 +#, c-format +msgid "%d segment merged" +msgid_plural "%d segments merged" +msgstr[0] "" +msgstr[1] "" + +#: ../src/viktrwlayer.c:6430 +msgid "Failed. This track does not have timestamp" +msgstr "" + +#: ../src/viktrwlayer.c:6442 +msgid "Failed. No other track in this layer has timestamp" +msgstr "" + +#: ../src/viktrwlayer.c:6449 +msgid "Merge Threshold..." +msgstr "Meja za združevanje..." + +#: ../src/viktrwlayer.c:6450 +msgid "Merge when time between tracks less than:" +msgstr "Združi, ko je čas med sledmi krajši kot:" + +#: ../src/viktrwlayer.c:6580 +msgid "Split Threshold..." +msgstr "" + +#: ../src/viktrwlayer.c:6581 +msgid "Split when time between trackpoints exceeds:" +msgstr "Razdeli, če je čas med točkama sledi večji kot:" + +#: ../src/viktrwlayer.c:6598 +#, c-format +msgid "" +"Can not split track due to trackpoints not ordered in time - such as at %s.\n" +"\n" +"Goto this trackpoint?" +msgstr "" + +#: ../src/viktrwlayer.c:6668 +msgid "Split Every Nth Point" +msgstr "" + +#: ../src/viktrwlayer.c:6669 +msgid "Split on every Nth point:" +msgstr "" + +#: ../src/viktrwlayer.c:6779 +msgid "Can not split track as it has no segments" +msgstr "" + +#: ../src/viktrwlayer.c:6861 ../src/viktrwlayer.c:6891 +#, c-format +msgid "Deleted %ld point" +msgid_plural "Deleted %ld points" +msgstr[0] "" +msgstr[1] "" + +#: ../src/viktrwlayer.c:6966 ../src/viktrwlayer.c:10989 +#: ../src/viktrwlayer_waypointlist.c:214 +#, c-format +msgid "Could not launch %s to open file." +msgstr "" + +#: ../src/viktrwlayer.c:6992 ../src/viktrwlayer.c:7113 +msgid "This track has no date information." +msgstr "" + +#: ../src/viktrwlayer.c:7006 ../src/viktrwlayer.c:7136 +msgid "This waypoint has no date information." +msgstr "" + +#: ../src/viktrwlayer.c:7030 +#, c-format +msgid "Could not launch %s" +msgstr "" + +#: ../src/viktrwlayer.c:7269 +msgid "Internal Error in vik_trw_layer_uniquify_tracks" +msgstr "" + +#: ../src/viktrwlayer.c:7374 ../src/viktrwlayer.c:7424 +#: ../src/viktrwlayer.c:7587 +msgid "" +"Multiple entries with the same name exist. This method only works with " +"unique names. Force unique names now?" +msgstr "" + +#: ../src/viktrwlayer.c:7385 +msgid "No tracks found" +msgstr "" + +#: ../src/viktrwlayer.c:7393 ../src/viktrwlayer.c:7443 +#: ../src/viktrwlayer.c:7607 +msgid "Delete Selection" +msgstr "" + +#: ../src/viktrwlayer.c:7394 +msgid "Select tracks to delete" +msgstr "" + +#: ../src/viktrwlayer.c:7435 +msgid "No routes found" +msgstr "" + +#: ../src/viktrwlayer.c:7444 +msgid "Select routes to delete" +msgstr "" + +#: ../src/viktrwlayer.c:7550 +msgid "Internal Error in vik_trw_layer_uniquify_waypoints" +msgstr "" + +#: ../src/viktrwlayer.c:7597 +msgid "No waypoints found" +msgstr "" + +#: ../src/viktrwlayer.c:7608 +msgid "Select waypoints to delete" +msgstr "" + +#: ../src/viktrwlayer.c:7691 +#, c-format +msgid "%ld waypoint deleted" +msgid_plural "%ld waypoints deleted" +msgstr[0] "" +msgstr[1] "" +msgstr[2] "" +msgstr[3] "" + +#: ../src/viktrwlayer.c:7697 +msgid "No duplicates found" +msgstr "" + +#: ../src/viktrwlayer.c:8028 +#, c-format +msgid "" +"A waypoint with the name \"%s\" already exists. Really rename to the same " +"name?" +msgstr "" + +#: ../src/viktrwlayer.c:8058 +#, c-format +msgid "" +"A track with the name \"%s\" already exists. Really rename to the same name?" +msgstr "" + +#: ../src/viktrwlayer.c:8095 +#, c-format +msgid "" +"A route with the name \"%s\" already exists. Really rename to the same name?" +msgstr "" + +#: ../src/viktrwlayer.c:8215 ../src/viktrwlayer.c:8602 +msgid "_Goto" +msgstr "" + +#: ../src/viktrwlayer.c:8226 +msgid "_Visit Geocache Webpage" +msgstr "" + +#: ../src/viktrwlayer.c:8235 +msgid "Geotag multiple images against this waypoint" +msgstr "" + +#: ../src/viktrwlayer.c:8245 ../src/viktrwlayer_waypointlist.c:352 +msgid "_Show Picture..." +msgstr "" + +#: ../src/viktrwlayer.c:8253 +msgid "Update Geotag on _Image" +msgstr "" + +#: ../src/viktrwlayer.c:8259 +msgid "_Update" +msgstr "" + +#: ../src/viktrwlayer.c:8264 +msgid "Update and _Keep File Timestamp" +msgstr "" + +#: ../src/viktrwlayer.c:8276 +msgid "Visit _Webpage" +msgstr "" + +#: ../src/viktrwlayer.c:8306 +msgid "_New Waypoint..." +msgstr "" + +#: ../src/viktrwlayer.c:8315 +msgid "_View All Waypoints" +msgstr "" + +#: ../src/viktrwlayer.c:8327 +msgid "Delete _All Waypoints" +msgstr "" + +#: ../src/viktrwlayer.c:8333 +msgid "_Delete Waypoints From Selection..." +msgstr "" + +#: ../src/viktrwlayer.c:8351 +msgid "_Show All Waypoints" +msgstr "" + +#: ../src/viktrwlayer.c:8357 +msgid "_Hide All Waypoints" +msgstr "" + +#: ../src/viktrwlayer.c:8369 +msgid "_List Waypoints..." +msgstr "" + +#: ../src/viktrwlayer.c:8390 +msgid "_View All Tracks" +msgstr "" + +#: ../src/viktrwlayer.c:8396 +msgid "_New Track" +msgstr "" + +#: ../src/viktrwlayer.c:8404 +msgid "Delete _All Tracks" +msgstr "" + +#: ../src/viktrwlayer.c:8410 +msgid "_Delete Tracks From Selection..." +msgstr "" + +#: ../src/viktrwlayer.c:8422 +msgid "_Show All Tracks" +msgstr "" + +#: ../src/viktrwlayer.c:8428 +msgid "_Hide All Tracks" +msgstr "" + +#: ../src/viktrwlayer.c:8439 +msgid "_List Tracks..." +msgstr "" + +#: ../src/viktrwlayer.c:8467 +msgid "_View All Routes" +msgstr "" + +#: ../src/viktrwlayer.c:8473 +msgid "_New Route" +msgstr "" + +#: ../src/viktrwlayer.c:8499 +msgid "_Show All Routes" +msgstr "" + +#: ../src/viktrwlayer.c:8505 +msgid "_Hide All Routes" +msgstr "" + +#: ../src/viktrwlayer.c:8516 +msgid "_List Routes..." +msgstr "" + +#: ../src/viktrwlayer.c:8587 +msgid "_View Track" +msgstr "" + +#: ../src/viktrwlayer.c:8589 +msgid "_View Route" +msgstr "" + +#: ../src/viktrwlayer.c:8608 +msgid "_Startpoint" +msgstr "" + +#: ../src/viktrwlayer.c:8614 +msgid "\"_Center\"" +msgstr "" + +#: ../src/viktrwlayer.c:8620 +msgid "_Endpoint" +msgstr "" + +#: ../src/viktrwlayer.c:8626 +msgid "_Highest Altitude" +msgstr "" + +#: ../src/viktrwlayer.c:8632 +msgid "_Lowest Altitude" +msgstr "" + +#: ../src/viktrwlayer.c:8640 +msgid "_Maximum Speed" +msgstr "" + +#: ../src/viktrwlayer.c:8646 +msgid "_Date" +msgstr "" + +#: ../src/viktrwlayer.c:8655 +msgid "Co_mbine" +msgstr "" + +#: ../src/viktrwlayer.c:8663 +msgid "_Merge By Time..." +msgstr "" + +#: ../src/viktrwlayer.c:8668 +msgid "Merge _Segments" +msgstr "" + +#: ../src/viktrwlayer.c:8675 +msgid "Merge _With Other Tracks..." +msgstr "" + +#: ../src/viktrwlayer.c:8682 +msgid "_Append Track..." +msgstr "" + +#: ../src/viktrwlayer.c:8684 +msgid "_Append Route..." +msgstr "" + +#: ../src/viktrwlayer.c:8690 +msgid "Append _Route..." +msgstr "" + +#: ../src/viktrwlayer.c:8692 +msgid "Append _Track..." +msgstr "" + +#: ../src/viktrwlayer.c:8699 +msgid "_Split" +msgstr "" + +#: ../src/viktrwlayer.c:8707 +msgid "_Split By Time..." +msgstr "" + +#. ATM always enable this entry - don't want to have to analyse the track before displaying the menu - to keep the menu speedy +#: ../src/viktrwlayer.c:8713 +msgid "Split Se_gments" +msgstr "" + +#: ../src/viktrwlayer.c:8719 +msgid "Split By _Number of Points..." +msgstr "" + +#: ../src/viktrwlayer.c:8724 +msgid "Split at _Trackpoint" +msgstr "" + +#: ../src/viktrwlayer.c:8732 +msgid "_Insert Points" +msgstr "" + +#: ../src/viktrwlayer.c:8738 +msgid "Insert Point _Before Selected Point" +msgstr "" + +#: ../src/viktrwlayer.c:8745 +msgid "Insert Point _After Selected Point" +msgstr "" + +#: ../src/viktrwlayer.c:8754 +msgid "Delete Poi_nts" +msgstr "" + +#: ../src/viktrwlayer.c:8760 +msgid "Delete _Selected Point" +msgstr "" + +#: ../src/viktrwlayer.c:8768 +msgid "Delete Points With The Same _Position" +msgstr "" + +#: ../src/viktrwlayer.c:8773 +msgid "Delete Points With The Same _Time" +msgstr "" + +#: ../src/viktrwlayer.c:8780 ../src/viktrwlayer.c:9029 +msgid "_Transform" +msgstr "" + +#: ../src/viktrwlayer.c:8788 ../src/viktrwlayer.c:9037 +msgid "_Apply DEM Data" +msgstr "" + +#: ../src/viktrwlayer.c:8793 ../src/viktrwlayer.c:9042 +msgid "_Overwrite" +msgstr "" + +#: ../src/viktrwlayer.c:8796 ../src/viktrwlayer.c:9045 +msgid "Overwrite any existing elevation values with DEM values" +msgstr "" + +#: ../src/viktrwlayer.c:8799 ../src/viktrwlayer.c:9048 +msgid "_Keep Existing" +msgstr "" + +#: ../src/viktrwlayer.c:8802 ../src/viktrwlayer.c:9051 +msgid "Keep existing elevation values, only attempt for missing values" +msgstr "" + +#: ../src/viktrwlayer.c:8807 +msgid "_Smooth Missing Elevation Data" +msgstr "" + +#: ../src/viktrwlayer.c:8812 +msgid "_Interpolated" +msgstr "" + +#: ../src/viktrwlayer.c:8815 +msgid "" +"Interpolate between known elevation values to derive values for the missing " +"elevations" +msgstr "" + +#: ../src/viktrwlayer.c:8818 +msgid "_Flat" +msgstr "" + +#: ../src/viktrwlayer.c:8821 +msgid "Set unknown elevation values to the last known value" +msgstr "" + +#: ../src/viktrwlayer.c:8825 +msgid "C_onvert to a Route" +msgstr "" + +#: ../src/viktrwlayer.c:8827 +msgid "C_onvert to a Track" +msgstr "" + +#: ../src/viktrwlayer.c:8835 +msgid "_Anonymize Times" +msgstr "" + +#: ../src/viktrwlayer.c:8838 +msgid "Shift timestamps to a relative offset from 1901-01-01" +msgstr "" + +#: ../src/viktrwlayer.c:8841 +msgid "_Interpolate Times" +msgstr "" + +#: ../src/viktrwlayer.c:8844 +msgid "" +"Reset trackpoint timestamps between the first and last points such that " +"track is traveled at equal speed" +msgstr "" + +#: ../src/viktrwlayer.c:8849 +msgid "_Reverse Track" +msgstr "" + +#: ../src/viktrwlayer.c:8851 +msgid "_Reverse Route" +msgstr "" + +#: ../src/viktrwlayer.c:8858 +msgid "Refine Route..." +msgstr "" + +#: ../src/viktrwlayer.c:8868 +msgid "Down_load Maps Along Track..." +msgstr "" + +#: ../src/viktrwlayer.c:8870 +msgid "Down_load Maps Along Route..." +msgstr "" + +#: ../src/viktrwlayer.c:8878 +msgid "_Export Track as GPX..." +msgstr "" + +#: ../src/viktrwlayer.c:8880 +msgid "_Export Route as GPX..." +msgstr "" + +#: ../src/viktrwlayer.c:8887 +msgid "E_xtend Track End" +msgstr "" + +#: ../src/viktrwlayer.c:8889 +msgid "E_xtend Route End" +msgstr "" + +#: ../src/viktrwlayer.c:8896 +msgid "Extend _Using Route Finder" +msgstr "" + +#: ../src/viktrwlayer.c:8911 +msgid "_Upload to GPS..." +msgstr "" + +#: ../src/viktrwlayer.c:8926 +msgid "_Diary" +msgstr "" + +#: ../src/viktrwlayer.c:8930 +msgid "Open diary program at this date" +msgstr "" + +#: ../src/viktrwlayer.c:8935 +msgid "_Astronomy" +msgstr "" + +#: ../src/viktrwlayer.c:8938 +msgid "Open astronomy program at this date and location" +msgstr "" + +#: ../src/viktrwlayer.c:8962 +msgid "_View Google Directions" +msgstr "" + +#: ../src/viktrwlayer.c:8984 +msgid "Use with _Filter" +msgstr "" + +#: ../src/viktrwlayer.c:9018 +msgid "_Edit Trackpoint" +msgstr "" + +#: ../src/viktrwlayer.c:10116 +#, c-format +msgid " - Gain %dm:Loss %dm" +msgstr "" + +#: ../src/viktrwlayer.c:10118 +#, c-format +msgid " - Gain %dft:Loss %dft" +msgstr "" + +#: ../src/viktrwlayer.c:10123 +#, c-format +msgid " - Bearing %3.1f° - Step %s" +msgstr "" + +#: ../src/viktrwlayer.c:10232 +#, c-format +msgid "Querying %s for route between (%.3f, %.3f) and (%.3f, %.3f)." +msgstr "" + +#: ../src/viktrwlayer.c:10248 +#, c-format +msgid "%s returned route between (%.3f, %.3f) and (%.3f, %.3f)." +msgstr "" + +#: ../src/viktrwlayer.c:10251 +#, c-format +msgid "Error getting route from %s." +msgstr "" + +#: ../src/viktrwlayer.c:11070 +#, c-format +msgid "Creating %d Image Thumbnails..." +msgstr "" + +#: ../src/viktrwlayer.c:11560 +msgid "No map layer in use. Create one first" +msgstr "" + +#: ../src/viktrwlayer.c:11679 +#, c-format +msgid "%s: Track List" +msgstr "" + +#: ../src/viktrwlayer.c:11681 +#, c-format +msgid "%s: Route List" +msgstr "" + +#: ../src/viktrwlayer.c:11734 +#, c-format +msgid "" +"Could not write external layer %s to %s, please fix and save before exiting " +"or data will be lost" +msgstr "" + +#: ../src/viktrwlayer.c:11782 +#, c-format +msgid "WARNING: issues encountered loading external layer %s from %s" +msgstr "" + +#: ../src/viktrwlayer_export.c:47 +msgid "Auto Device GPX Simplify:" +msgstr "" + +#: ../src/viktrwlayer_export.c:48 +msgid "" +"GPX saves to certain devices will be simplified for device compatibility." +msgstr "" + +#: ../src/viktrwlayer_export.c:125 +#, c-format +msgid "Export of GPX file simplified using point limit: %d" +msgstr "" + +#: ../src/viktrwlayer_export.c:206 ../src/viktrwlayer_export.c:323 +#: ../src/vikwindow.c:3694 +msgid "The filename you requested could not be opened for writing." +msgstr "" + +#: ../src/viktrwlayer_export.c:226 +#, c-format +msgid "Could not launch %s." +msgstr "" + +#: ../src/viktrwlayer_export.c:234 +msgid "Could not create temporary file for export." +msgstr "" + +#: ../src/viktrwlayer_export.c:268 +msgid "File format:" +msgstr "" + +#: ../src/viktrwlayer_export.c:276 +msgid "Select the file format." +msgstr "" + +#: ../src/viktrwlayer_export.c:281 +msgid "" +"Select the information to process.\n" +"Warning: the behavior of these switches is highly dependent of the file " +"format selected.\n" +"Please, refer to GPSbabel if unsure." +msgstr "" + +#: ../src/viktrwlayer_export.c:308 +msgid "You did not select a valid file format." +msgstr "" + +#: ../src/viktrwlayer_propwin.c:915 ../src/viktrwlayer_propwin.c:3381 +#: ../src/viktrwlayer_propwin.c:3417 ../src/viktrwlayer_propwin.c:3457 +#: ../src/viktrwlayer_propwin.c:3509 ../src/viktrwlayer_propwin.c:3527 +#: ../src/viktrwlayer_propwin.c:3600 ../src/viktrwlayer_propwin.c:3601 +#: ../src/viktrwlayer_propwin.c:3602 ../src/viktrwlayer_propwin.c:3611 +#: ../src/viktrwlayer_propwin.c:3612 ../src/viktrwlayer_propwin.c:3629 +#: ../src/viktrwlayer_propwin.c:3630 ../src/viktrwlayer_propwin.c:3644 +#: ../src/viktrwlayer_propwin.c:3645 ../src/viktrwlayer_propwin.c:3646 +#: ../src/viktrwlayer_propwin.c:3660 ../src/viktrwlayer_propwin.c:3661 +#: ../src/viktrwlayer_propwin.c:3662 ../src/viktrwlayer_propwin.c:3676 +#: ../src/viktrwlayer_propwin.c:3677 ../src/viktrwlayer_propwin.c:3678 +#: ../src/viktrwlayer_propwin.c:3695 ../src/viktrwlayer_propwin.c:3696 +#: ../src/viktrwlayer_analysis.c:293 +#, c-format +msgid "No Data" +msgstr "Ni podatkov" + +#: ../src/viktrwlayer_propwin.c:960 ../src/viktrwlayer_propwin.c:1245 +#, c-format +msgid "%.1f kph" +msgstr "" + +#: ../src/viktrwlayer_propwin.c:963 ../src/viktrwlayer_propwin.c:1248 +#: ../src/viktrwlayer_analysis.c:352 +#, c-format +msgid "%.1f mph" +msgstr "" + +#: ../src/viktrwlayer_propwin.c:966 ../src/viktrwlayer_propwin.c:1251 +#, c-format +msgid "%.1f knots" +msgstr "" + +#: ../src/viktrwlayer_propwin.c:969 ../src/viktrwlayer_propwin.c:1254 +#, c-format +msgid "%.1f s/km" +msgstr "" + +#: ../src/viktrwlayer_propwin.c:972 ../src/viktrwlayer_propwin.c:1257 +#: ../src/viktrwlayer_analysis.c:389 ../src/viktrwlayer_analysis.c:392 +#, fuzzy, c-format +msgid "%.1f min/km" +msgstr "1 min" + +#: ../src/viktrwlayer_propwin.c:975 ../src/viktrwlayer_propwin.c:1260 +#, c-format +msgid "%.1f sec/mi" +msgstr "" + +#: ../src/viktrwlayer_propwin.c:978 ../src/viktrwlayer_propwin.c:1263 +#: ../src/viktrwlayer_analysis.c:409 ../src/viktrwlayer_analysis.c:412 +#, fuzzy, c-format +msgid "%.1f min/mi" +msgstr "1 min" + +#. VIK_UNITS_SPEED_METRES_PER_SECOND: +#: ../src/viktrwlayer_propwin.c:982 ../src/viktrwlayer_propwin.c:1267 +#, c-format +msgid "%.1f m/s" +msgstr "" + +#. Minutes +#: ../src/viktrwlayer_propwin.c:1411 +msgid "mins" +msgstr "" + +#. Hours +#: ../src/viktrwlayer_propwin.c:1418 +msgid "h" +msgstr "" + +#. Days +#: ../src/viktrwlayer_propwin.c:1424 +msgid "d" +msgstr "" + +#. Weeks +#: ../src/viktrwlayer_propwin.c:1429 +msgid "w" +msgstr "" + +#. 'Months' +#: ../src/viktrwlayer_propwin.c:1433 +msgid "M" +msgstr "" + +#: ../src/viktrwlayer_propwin.c:2051 ../src/viktrwlayer_analysis.c:303 +#, c-format +msgid "%.1f miles" +msgstr "" + +#: ../src/viktrwlayer_propwin.c:2054 ../src/viktrwlayer_analysis.c:306 +#, c-format +msgid "%.1f NM" +msgstr "" + +#. VIK_UNITS_DISTANCE_KILOMETRES +#: ../src/viktrwlayer_propwin.c:2057 ../src/viktrwlayer_analysis.c:310 +#, c-format +msgid "%.1f km" +msgstr "" + +#: ../src/viktrwlayer_propwin.c:3083 +msgid "Failed spliting track. Track unchanged" +msgstr "" + +#: ../src/viktrwlayer_propwin.c:3234 ../src/viktrwlayer_propwin.c:3744 +#, c-format +msgid "%s - Track Properties" +msgstr "%s - Lastnosti sledi" + +#: ../src/viktrwlayer_propwin.c:3239 +msgid "Split at _Marker" +msgstr "" + +#: ../src/viktrwlayer_propwin.c:3240 +msgid "Split _Segments" +msgstr "" + +#: ../src/viktrwlayer_propwin.c:3241 +msgid "_Reverse" +msgstr "" + +#: ../src/viktrwlayer_propwin.c:3242 +msgid "_Delete Dupl." +msgstr "" + +#: ../src/viktrwlayer_propwin.c:3269 +msgid "Comment:" +msgstr "Opomba:" + +#: ../src/viktrwlayer_propwin.c:3270 +msgid "Description:" +msgstr "" + +#: ../src/viktrwlayer_propwin.c:3271 +#, fuzzy +msgid "Source:" +msgstr "Začetek:" + +#: ../src/viktrwlayer_propwin.c:3272 +#, fuzzy +msgid "Type:" +msgstr "Čas:" + +#: ../src/viktrwlayer_propwin.c:3273 +msgid "Color:" +msgstr "" + +#: ../src/viktrwlayer_propwin.c:3274 +msgid "Draw Name:" +msgstr "" + +#: ../src/viktrwlayer_propwin.c:3275 +msgid "Distance Labels:" +msgstr "" + +#: ../src/viktrwlayer_propwin.c:3278 +msgid "Track Length:" +msgstr "Dolžina sledi:" + +#: ../src/viktrwlayer_propwin.c:3279 +msgid "Trackpoints:" +msgstr "Točk sledi:" + +#: ../src/viktrwlayer_propwin.c:3280 +msgid "Segments:" +msgstr "" + +#: ../src/viktrwlayer_propwin.c:3281 +msgid "Duplicate Points:" +msgstr "Podvojene točke:" + +#: ../src/viktrwlayer_propwin.c:3282 +msgid "Max Speed:" +msgstr "Najvišja hitrost:" + +#: ../src/viktrwlayer_propwin.c:3283 +msgid "Avg. Speed:" +msgstr "Povp. hitrost:" + +#: ../src/viktrwlayer_propwin.c:3284 +msgid "Moving Avg. Speed:" +msgstr "" + +#: ../src/viktrwlayer_propwin.c:3285 +msgid "Avg. Dist. Between TPs:" +msgstr "Povprečna razdalja med točkama:" + +#: ../src/viktrwlayer_propwin.c:3286 +msgid "Elevation Range:" +msgstr "Razpon višin:" + +#: ../src/viktrwlayer_propwin.c:3287 +msgid "Total Elevation Gain/Loss:" +msgstr "Skupen dvig/spust:" + +#: ../src/viktrwlayer_propwin.c:3288 +msgid "Start:" +msgstr "Začetek:" + +#: ../src/viktrwlayer_propwin.c:3289 +msgid "End:" +msgstr "Konec:" + +#: ../src/viktrwlayer_propwin.c:3290 +msgid "Duration:" +msgstr "Trajanje:" + +#: ../src/viktrwlayer_propwin.c:3320 +msgid "Centre" +msgstr "" + +#: ../src/viktrwlayer_propwin.c:3321 +msgid "Start only" +msgstr "" + +#: ../src/viktrwlayer_propwin.c:3322 +msgid "End only" +msgstr "" + +#: ../src/viktrwlayer_propwin.c:3323 +msgid "Start and End" +msgstr "" + +#: ../src/viktrwlayer_propwin.c:3324 +msgid "Centre, Start and End" +msgstr "" + +#: ../src/viktrwlayer_propwin.c:3336 +msgid "Maximum number of distance labels to be shown" +msgstr "" + +#: ../src/viktrwlayer_propwin.c:3340 +msgid "Properties" +msgstr "" + +#: ../src/viktrwlayer_propwin.c:3584 +#, c-format +msgid "%d minutes - %d minutes moving" +msgstr "" + +#: ../src/viktrwlayer_propwin.c:3596 +#, c-format +msgid "%s total - %s in segments" +msgstr "" + +#: ../src/viktrwlayer_propwin.c:3607 ../src/viktrwlayer_analysis.c:622 +msgid "Statistics" +msgstr "" + +#: ../src/viktrwlayer_propwin.c:3613 ../src/viktrwlayer_propwin.c:3680 +msgid "Show D_EM" +msgstr "" + +#: ../src/viktrwlayer_propwin.c:3615 ../src/viktrwlayer_propwin.c:3631 +#: ../src/viktrwlayer_propwin.c:3647 ../src/viktrwlayer_propwin.c:3697 +msgid "Show _GPS Speed" +msgstr "" + +#: ../src/viktrwlayer_propwin.c:3617 ../src/viktrwlayer_propwin.c:3633 +#: ../src/viktrwlayer_propwin.c:3665 ../src/viktrwlayer_propwin.c:3699 +msgid "Track Distance:" +msgstr "" + +#: ../src/viktrwlayer_propwin.c:3618 ../src/viktrwlayer_propwin.c:3684 +msgid "Track Height:" +msgstr "" + +#: ../src/viktrwlayer_propwin.c:3624 +msgid "Elevation-distance" +msgstr "Višina-razdalja" + +#: ../src/viktrwlayer_propwin.c:3634 +msgid "Track Gradient:" +msgstr "" + +#: ../src/viktrwlayer_propwin.c:3639 +msgid "Gradient-distance" +msgstr "" + +#: ../src/viktrwlayer_propwin.c:3649 ../src/viktrwlayer_propwin.c:3666 +#: ../src/viktrwlayer_propwin.c:3683 +msgid "Track Time:" +msgstr "" + +#: ../src/viktrwlayer_propwin.c:3650 ../src/viktrwlayer_propwin.c:3700 +msgid "Track Speed:" +msgstr "" + +#: ../src/viktrwlayer_propwin.c:3651 ../src/viktrwlayer_propwin.c:3667 +#: ../src/viktrwlayer_propwin.c:3685 +msgid "Time/Date:" +msgstr "" + +#: ../src/viktrwlayer_propwin.c:3655 +msgid "Speed-time" +msgstr "Hitrost-čas" + +#: ../src/viktrwlayer_propwin.c:3663 ../src/viktrwlayer_propwin.c:3679 +msgid "Show S_peed" +msgstr "" + +#: ../src/viktrwlayer_propwin.c:3671 +msgid "Distance-time" +msgstr "" + +#: ../src/viktrwlayer_propwin.c:3690 +msgid "Elevation-time" +msgstr "" + +#: ../src/viktrwlayer_propwin.c:3705 +msgid "Speed-distance" +msgstr "" + +#: ../src/viktrwlayer_tpwin.c:190 ../src/viktrwlayer_wpwin.c:66 +msgid "Date/Time Edit" +msgstr "" + +#: ../src/viktrwlayer_tpwin.c:242 +msgid "Name:" +msgstr "" + +#: ../src/viktrwlayer_tpwin.c:243 +msgid "Latitude:" +msgstr "Geografska širina:" + +#: ../src/viktrwlayer_tpwin.c:244 +msgid "Longitude:" +msgstr "Geografska dolžina:" + +#: ../src/viktrwlayer_tpwin.c:245 +msgid "Altitude:" +msgstr "Višina:" + +#: ../src/viktrwlayer_tpwin.c:246 +msgid "Course:" +msgstr "" + +#: ../src/viktrwlayer_tpwin.c:247 +msgid "Timestamp:" +msgstr "" + +#: ../src/viktrwlayer_tpwin.c:248 +msgid "Time:" +msgstr "Čas:" + +#: ../src/viktrwlayer_tpwin.c:249 +msgid "Distance Difference:" +msgstr "Razlika razdalj:" + +#: ../src/viktrwlayer_tpwin.c:250 +msgid "Time Difference:" +msgstr "Razlika v času:" + +#: ../src/viktrwlayer_tpwin.c:251 +msgid "\"Speed\" Between:" +msgstr "\"Hitrost\" med:" + +#: ../src/viktrwlayer_tpwin.c:252 +msgid "Speed:" +msgstr "" + +#: ../src/viktrwlayer_tpwin.c:253 +msgid "VDOP:" +msgstr "" + +#: ../src/viktrwlayer_tpwin.c:254 +msgid "HDOP:" +msgstr "" + +#: ../src/viktrwlayer_tpwin.c:255 +msgid "PDOP:" +msgstr "" + +#: ../src/viktrwlayer_tpwin.c:256 +msgid "SAT/FIX:" +msgstr "" + +#: ../src/viktrwlayer_tpwin.c:263 ../src/viktrwlayer_tpwin.c:408 +#: ../src/viktrwlayer_tpwin.c:622 +msgid "Trackpoint" +msgstr "Točka sledi" + +#: ../src/viktrwlayer_tpwin.c:266 +msgid "_Insert After" +msgstr "" + +#: ../src/viktrwlayer_tpwin.c:268 +msgid "Split Here" +msgstr "Razdeli tu" + +#: ../src/viktrwlayer_tracklist.c:262 ../src/viktrwlayer_waypointlist.c:306 +msgid "_Copy Data" +msgstr "" + +#. +#. item = gtk_image_menu_item_new_with_mnemonic ( _("_Select") ); +#. gtk_image_menu_item_set_image ( (GtkImageMenuItem*)item, gtk_image_new_from_stock (GTK_STOCK_FIND, GTK_ICON_SIZE_MENU) ); +#. g_signal_connect_swapped ( G_OBJECT(item), "activate", G_CALLBACK(trw_layer_track_select), values ); +#. gtk_menu_shell_append (GTK_MENU_SHELL (menu), item); +#. gtk_widget_show ( item ); +#. +#. ATM view auto selects, so don't bother with separate select menu entry +#. +#. item = gtk_image_menu_item_new_with_mnemonic ( _("_Select") ); +#. gtk_image_menu_item_set_image ( (GtkImageMenuItem*)item, gtk_image_new_from_stock (GTK_STOCK_FIND, GTK_ICON_SIZE_MENU) ); +#. g_signal_connect_swapped ( G_OBJECT(item), "activate", G_CALLBACK(trw_layer_waypoint_select), values ); +#. gtk_menu_shell_append (GTK_MENU_SHELL (menu), item); +#. gtk_widget_show ( item ); +#. +#. AUTO SELECT NOT TRUE YET... +#. ATM view auto selects, so don't bother with separate select menu entry +#: ../src/viktrwlayer_tracklist.c:290 ../src/viktrwlayer_waypointlist.c:341 +#: ../src/vikwindow.c:4816 +msgid "_View" +msgstr "_Pogled" + +#. Insert column for the layer name when viewing multi layers +#: ../src/viktrwlayer_tracklist.c:613 ../src/viktrwlayer_waypointlist.c:609 +msgid "Layer" +msgstr "" + +#: ../src/viktrwlayer_tracklist.c:627 ../src/viktrwlayer_waypointlist.c:624 +msgid "Date" +msgstr "" + +#: ../src/viktrwlayer_tracklist.c:631 ../src/viktrwlayer_waypointlist.c:628 +msgid "Visible" +msgstr "" + +#: ../src/viktrwlayer_tracklist.c:639 +msgid "" +"Distance\n" +"(miles)" +msgstr "" + +#: ../src/viktrwlayer_tracklist.c:642 +msgid "" +"Distance\n" +"(NM)" +msgstr "" + +#: ../src/viktrwlayer_tracklist.c:645 +msgid "" +"Distance\n" +"(km)" +msgstr "" + +#: ../src/viktrwlayer_tracklist.c:651 +msgid "" +"Length\n" +"(minutes)" +msgstr "" + +#: ../src/viktrwlayer_tracklist.c:660 ../src/vikutils.c:93 +msgid "sec/mi" +msgstr "" + +#: ../src/viktrwlayer_tracklist.c:666 +#, c-format +msgid "" +"Av. Speed\n" +"(%s)" +msgstr "" + +#. Apply own formatting of the data +#: ../src/viktrwlayer_tracklist.c:671 +#, c-format +msgid "" +"Max Speed\n" +"(%s)" +msgstr "" + +#: ../src/viktrwlayer_tracklist.c:679 ../src/viktrwlayer_waypointlist.c:637 +msgid "" +"Max Height\n" +"(Feet)" +msgstr "" + +#: ../src/viktrwlayer_tracklist.c:681 ../src/viktrwlayer_waypointlist.c:639 +msgid "" +"Max Height\n" +"(Metres)" +msgstr "" + +#: ../src/viktrwlayer_waypointlist.c:312 +msgid "Copy Data (with _positions)" +msgstr "" + +#: ../src/viktrwlayer_waypointlist.c:633 +msgid "Comment" +msgstr "" + +#: ../src/viktrwlayer_waypointlist.c:643 +msgid "Symbol" +msgstr "" + +#: ../src/viktrwlayer_wpwin.c:93 ../src/viktrwlayer_wpwin.c:302 +msgid "True" +msgstr "" + +#: ../src/viktrwlayer_wpwin.c:122 +msgid "Waypoint Properties" +msgstr "" + +#: ../src/viktrwlayer_wpwin.c:164 +msgid "Name:" +msgstr "Ime:" + +#: ../src/viktrwlayer_wpwin.c:181 +msgid "Altitude:" +msgstr "Višina:" + +#: ../src/viktrwlayer_wpwin.c:186 ../src/viktrwlayer_wpwin.c:188 +msgid "Comment:" +msgstr "Opomba:" + +#: ../src/viktrwlayer_wpwin.c:202 +#, fuzzy +msgid "Source:" +msgstr "Vir prenosa:" + +#: ../src/viktrwlayer_wpwin.c:212 +msgid "Image:" +msgstr "Slika:" + +#: ../src/viktrwlayer_wpwin.c:217 +msgid "Symbol:" +msgstr "Simbol:" + +#: ../src/viktrwlayer_wpwin.c:226 +msgid "(none)" +msgstr "(brez)" + +#. Geotag Info [readonly] +#: ../src/viktrwlayer_wpwin.c:272 +msgid "Has Geotag" +msgstr "" + +#: ../src/viktrwlayer_wpwin.c:279 +msgid "Consistent Position" +msgstr "" + +#. ATM the direction value box is always shown, even when there is no information. +#. It would be nice to be able to hide it until the 'Add' has been performed, +#. however I've not been able to achieve this. +#. Thus simply sensistizing it instead. +#: ../src/viktrwlayer_wpwin.c:292 +#, fuzzy +msgid "Image Direction:" +msgstr "Nastavitve slike" + +#: ../src/viktrwlayer_wpwin.c:300 +msgid "Magnetic" +msgstr "" + +#: ../src/viktrwlayer_wpwin.c:320 +msgid "Time:" +msgstr "" + +#. TODO: other checks (isalpha or whatever ) +#: ../src/viktrwlayer_wpwin.c:386 +msgid "Please enter a name for the waypoint." +msgstr "" + +#: ../src/viktrwlayer_geotag.c:320 ../src/viktrwlayer_geotag.c:460 +#, c-format +msgid "Failed updating EXIF on %s" +msgstr "" + +#: ../src/viktrwlayer_geotag.c:562 +#, c-format +msgid "Geotagging %d Images..." +msgstr "" + +#: ../src/viktrwlayer_geotag.c:630 +msgid "Geotag Images" +msgstr "" + +#: ../src/viktrwlayer_geotag.c:640 +msgid "Images" +msgstr "" + +#: ../src/viktrwlayer_geotag.c:645 +msgid "Overwrite Existing Waypoints:" +msgstr "" + +#: ../src/viktrwlayer_geotag.c:648 +msgid "Overwrite Existing GPS Information:" +msgstr "" + +#: ../src/viktrwlayer_geotag.c:650 +msgid "Keep File Modification Timestamp:" +msgstr "" + +#: ../src/viktrwlayer_geotag.c:684 +msgid "Create Waypoints:" +msgstr "" + +#: ../src/viktrwlayer_geotag.c:693 +msgid "Write EXIF:" +msgstr "" + +#: ../src/viktrwlayer_geotag.c:705 +msgid "Automatic Image Direction:" +msgstr "" + +#: ../src/viktrwlayer_geotag.c:707 +msgid "Set image direction based on a heading derived from the track" +msgstr "" + +#: ../src/viktrwlayer_geotag.c:710 +msgid "Interpolate Between Track Segments:" +msgstr "" + +#: ../src/viktrwlayer_geotag.c:715 +msgid "Image Time Offset (Seconds):" +msgstr "" + +#: ../src/viktrwlayer_geotag.c:718 +msgid "" +"The number of seconds to ADD to the photos time to make it match the GPS " +"data. Calculate this with (GPS - Photo). Can be negative or positive. Useful " +"to adjust times when a camera's timestamp was incorrect." +msgstr "" + +#: ../src/viktrwlayer_geotag.c:721 +msgid "Image Timezone:" +msgstr "" + +#: ../src/viktrwlayer_geotag.c:724 +msgid "" +"The timezone that was used when the images were created. For example, if a " +"camera is set to AWST or +8:00 hours. Enter +8:00 here so that the correct " +"adjustment to the images' time can be made. GPS data is always in UTC." +msgstr "" + +#: ../src/viktrwlayer_geotag.c:728 +#, c-format +msgid "Using waypoint: %s" +msgstr "" + +#: ../src/viktrwlayer_geotag.c:742 +#, c-format +msgid "Using track: %s" +msgstr "" + +#: ../src/viktrwlayer_geotag.c:744 +#, c-format +msgid "Using all tracks in: %s" +msgstr "" + +#: ../src/viktrwlayer_analysis.c:214 +msgid "Number of Tracks" +msgstr "" + +#: ../src/viktrwlayer_analysis.c:215 +msgid "Date Range" +msgstr "" + +#: ../src/viktrwlayer_analysis.c:216 +msgid "Total Length" +msgstr "" + +#: ../src/viktrwlayer_analysis.c:217 +msgid "Average Length" +msgstr "" + +#: ../src/viktrwlayer_analysis.c:218 +msgid "Eddington number" +msgstr "" + +#. No.4: Extended display only +#: ../src/viktrwlayer_analysis.c:219 +msgid "Max Speed" +msgstr "" + +#: ../src/viktrwlayer_analysis.c:220 +msgid "Avg. Speed" +msgstr "" + +#: ../src/viktrwlayer_analysis.c:221 +msgid "Minimum Altitude" +msgstr "" + +#: ../src/viktrwlayer_analysis.c:222 +msgid "Maximum Altitude" +msgstr "" + +#: ../src/viktrwlayer_analysis.c:223 +msgid "Total Elevation Gain/Loss" +msgstr "" + +#: ../src/viktrwlayer_analysis.c:224 +msgid "Avg. Elevation Gain/Loss" +msgstr "" + +#: ../src/viktrwlayer_analysis.c:225 +msgid "Total Duration" +msgstr "" + +#: ../src/viktrwlayer_analysis.c:226 +msgid "Avg. Duration" +msgstr "" + +#: ../src/viktrwlayer_analysis.c:317 +#, c-format +msgid "%.2f miles" +msgstr "" + +#: ../src/viktrwlayer_analysis.c:320 +#, c-format +msgid "%.2f NM" +msgstr "" + +#. VIK_UNITS_DISTANCE_KILOMETRES +#: ../src/viktrwlayer_analysis.c:324 +#, c-format +msgid "%.2f km" +msgstr "" + +#: ../src/viktrwlayer_analysis.c:361 +#, c-format +msgid "%.2f m/s" +msgstr "" + +#: ../src/viktrwlayer_analysis.c:370 ../src/viktrwlayer_analysis.c:373 +#, c-format +msgid "%.2f knots" +msgstr "" + +#: ../src/viktrwlayer_analysis.c:379 ../src/viktrwlayer_analysis.c:382 +#, c-format +msgid "%d s/km" +msgstr "" + +#: ../src/viktrwlayer_analysis.c:399 ../src/viktrwlayer_analysis.c:402 +#, c-format +msgid "%d sec/mi" +msgstr "" + +#: ../src/viktrwlayer_analysis.c:420 ../src/viktrwlayer_analysis.c:423 +#, c-format +msgid "%.2f km/h" +msgstr "" + +#: ../src/viktrwlayer_analysis.c:434 ../src/viktrwlayer_analysis.c:440 +#, c-format +msgid "%d feet" +msgstr "" + +#: ../src/viktrwlayer_analysis.c:445 ../src/viktrwlayer_analysis.c:447 +#, c-format +msgid "%d feet / %d feet" +msgstr "" + +#: ../src/viktrwlayer_analysis.c:452 ../src/viktrwlayer_analysis.c:458 +#, c-format +msgid "%d m" +msgstr "" + +#: ../src/viktrwlayer_analysis.c:463 ../src/viktrwlayer_analysis.c:465 +#, c-format +msgid "%d m / %d m" +msgstr "" + +#: ../src/viktrwlayer_analysis.c:477 +#, c-format +msgid "%d:%02d:%02d days:hrs:mins" +msgstr "" + +#: ../src/viktrwlayer_analysis.c:484 +#, c-format +msgid "%d:%02d hrs:mins" +msgstr "" + +#: ../src/viktrwlayer_analysis.c:658 +msgid "Include Invisible Items" +msgstr "" + +#: ../src/vikstatus.c:129 +msgid "Current number of background tasks. Click to see the background jobs." +msgstr "" + +#: ../src/vikstatus.c:134 +msgid "Current zoom level. Click to select a new one." +msgstr "" + +#: ../src/vikstatus.c:141 +msgid "Left click to clear the message. Right click to copy the message." +msgstr "" + +#: ../src/vikutils.c:108 +msgid "GPSD" +msgstr "" + +#. GPS Preamble +#: ../src/vikutils.c:109 +msgid "Trkpt" +msgstr "" + +#: ../src/vikutils.c:160 +#, c-format +msgid "%sSpeed%s %.1f%s" +msgstr "" + +#. Go for 2dp as expect low values for vertical speeds +#: ../src/vikutils.c:214 +#, c-format +msgid "%sClimb%s %.2f%s" +msgstr "" + +#: ../src/vikutils.c:223 +#, c-format +msgid "%sAlt %dfeet" +msgstr "" + +#. VIK_UNITS_HEIGHT_METRES: +#: ../src/vikutils.c:227 +#, c-format +msgid "%sAlt %dm" +msgstr "" + +#: ../src/vikutils.c:235 +#, c-format +msgid "%sCourse %03d°" +msgstr "" + +#: ../src/vikutils.c:249 +msgid "yards" +msgstr "" + +#. VIK_UNITS_DISTANCE_KILOMETRES: +#: ../src/vikutils.c:253 +msgid "m" +msgstr "" + +#: ../src/vikutils.c:257 +#, c-format +msgid "%sDistance diff %d%s" +msgstr "" + +#: ../src/vikutils.c:272 +#, c-format +msgid "%sTime %s" +msgstr "" + +#: ../src/vikutils.c:281 +#, c-format +msgid "%sTime diff %lds" +msgstr "" + +#: ../src/vikutils.c:287 +#, c-format +msgid "%sNo. of Sats %d" +msgstr "" + +#: ../src/vikutils.c:312 +#, c-format +msgid "%sTo End %.2f%s" +msgstr "" + +#: ../src/vikutils.c:339 +#, c-format +msgid "%sDistance along %.2f%s" +msgstr "" + +#: ../src/vikutils.c:359 +#, c-format +msgid "%sTrack: %s" +msgstr "" + +#: ../src/vikutils.c:396 +#, c-format +msgid "" +"There is a newer version of Viking available: %s\n" +"\n" +"Do you wish to go to Viking's website now?" +msgstr "" + +#: ../src/vikutils.c:526 +msgid "" +"This appears to be Viking's very first run.\n" +"\n" +"Do you wish to enable automatic internet features?\n" +"\n" +"Individual settings can be controlled in the Preferences." +msgstr "" + +#: ../src/vikwaypoint.c:37 +msgid "Waypoint" +msgstr "" + +#: ../src/vikwebtool_datasource.c:352 +msgid "Search Term" +msgstr "" + +#. TODO get rid of this as this is unnecessary duplication... +#: ../src/vikwindow.c:258 +msgid "Pan" +msgstr "" + +#: ../src/vikwindow.c:258 +msgid "Zoom" +msgstr "Povečava" + +#: ../src/vikwindow.c:258 +msgid "Ruler" +msgstr "Merilo" + +#: ../src/vikwindow.c:258 +msgid "Select" +msgstr "" + +#: ../src/vikwindow.c:368 +msgid "This is Viking " +msgstr "" + +#: ../src/vikwindow.c:457 +msgid "Location lookup aborted" +msgstr "" + +#: ../src/vikwindow.c:477 +#, c-format +msgid "Location found: %s" +msgstr "" + +#: ../src/vikwindow.c:486 +msgid "Unable to determine location" +msgstr "" + +#: ../src/vikwindow.c:495 +msgid "Determining location" +msgstr "" + +#: ../src/vikwindow.c:525 +#, c-format +msgid "Location found via geoclue" +msgstr "" + +#: ../src/vikwindow.c:546 +msgid "Default Map" +msgstr "" + +#: ../src/vikwindow.c:557 ../src/vikwindow.c:3938 +msgid "Trying to determine location..." +msgstr "" + +#. Create tooltip +#: ../src/vikwindow.c:723 +msgid "Select zoom level" +msgstr "" + +#: ../src/vikwindow.c:1176 +#, c-format +msgid "" +"Do you want to save the changes you made to the document \"%s\"?\n" +"\n" +"Your changes will be lost if you don't save them." +msgstr "" + +#: ../src/vikwindow.c:1180 +msgid "Don't Save" +msgstr "Ne shrani" + +#: ../src/vikwindow.c:1268 +msgid "mpp" +msgstr "" + +#: ../src/vikwindow.c:1268 +msgid "pixelfact" +msgstr "" + +#: ../src/vikwindow.c:1467 +#, c-format +msgid "%s %s %dm" +msgstr "" + +#: ../src/vikwindow.c:1469 +#, c-format +msgid "%s %s %dft" +msgstr "" + +#: ../src/vikwindow.c:1472 +#, c-format +msgid "%s %s" +msgstr "" + +#: ../src/vikwindow.c:1929 +msgid "_Ruler" +msgstr "_Ravnilo" + +#: ../src/vikwindow.c:1929 +msgid "Ruler Tool" +msgstr "" + +#: ../src/vikwindow.c:2204 ../src/vikwindow.c:4818 +msgid "_Zoom" +msgstr "_Povečava" + +#: ../src/vikwindow.c:2204 +msgid "Zoom Tool" +msgstr "Orodje za povečavo" + +#: ../src/vikwindow.c:2271 ../src/vikwindow.c:4819 +msgid "_Pan" +msgstr "" + +#: ../src/vikwindow.c:2271 +msgid "Pan Tool" +msgstr "Orodje za premikanje" + +#: ../src/vikwindow.c:2425 +msgid "_Select" +msgstr "" + +#: ../src/vikwindow.c:2425 +msgid "Select Tool" +msgstr "" + +#: ../src/vikwindow.c:2615 +msgid "You must select a layer to show its properties." +msgstr "Izbrati morate plast, katere lastnosti želite prikazati." + +#. No error to show, so unlikely this will get called +#: ../src/vikwindow.c:2629 +msgid "The help system is not available." +msgstr "" + +#. Main error path +#: ../src/vikwindow.c:2632 +#, c-format +msgid "" +"Help is not available because: %s.\n" +"Ensure a Mime Type ghelp handler program is installed (e.g. yelp)." +msgstr "" + +#: ../src/vikwindow.c:2865 +msgid "You must select a layer to delete." +msgstr "Izbrati morate plast, ki jo želite izbrisati." + +#: ../src/vikwindow.c:3171 +msgid "Untitled" +msgstr "Neimenovano" + +#: ../src/vikwindow.c:3300 +#, c-format +msgid "Unable to add '%s' to the list of recently used documents" +msgstr "" + +#: ../src/vikwindow.c:3391 +msgid "The file you requested could not be opened." +msgstr "Datoteke, ki ste jo želeli, ni mogoče odpreti" + +#: ../src/vikwindow.c:3394 +msgid "" +"GPSBabel is required to load files of this type or GPSBabel encountered " +"problems." +msgstr "" + +#: ../src/vikwindow.c:3397 +#, c-format +msgid "Unable to load malformed GPX file %s" +msgstr "" + +#: ../src/vikwindow.c:3400 +#, c-format +msgid "Unsupported file type for %s" +msgstr "" + +#. Since we can process .vik files with issues just show a warning in the status bar +#. Not that a user can do much about it... or tells them what this issue is yet... +#: ../src/vikwindow.c:3406 +#, c-format +msgid "WARNING: issues encountered loading %s" +msgstr "" + +#: ../src/vikwindow.c:3489 +msgid "Please select a GPS data file to open. " +msgstr "Prosimo, izberize datoteko s podatki GPS. " + +#: ../src/vikwindow.c:3508 +msgid "Google Earth" +msgstr "" + +#: ../src/vikwindow.c:3523 ../src/vikwindow.c:3646 ../src/viking.desktop.in.h:1 +msgid "Viking" +msgstr "Viking" + +#: ../src/vikwindow.c:3594 ../src/vikwindow.c:4632 +msgid "Open File" +msgstr "" + +#: ../src/vikwindow.c:3630 +msgid "Save as Viking File." +msgstr "Shrani kot datoteko Viking." + +#: ../src/vikwindow.c:3757 +#, c-format +msgid "Exporting to file: %s" +msgstr "" + +#. Confirm what happened. +#: ../src/vikwindow.c:3774 +#, c-format +msgid "Exported files: %d" +msgstr "" + +#: ../src/vikwindow.c:3786 +msgid "Nothing to Export!" +msgstr "" + +#: ../src/vikwindow.c:3790 +msgid "Export to directory" +msgstr "" + +#: ../src/vikwindow.c:3809 +msgid "Could not convert all files" +msgstr "" + +#: ../src/vikwindow.c:3851 +msgid "File not accessible" +msgstr "" + +#: ../src/vikwindow.c:3854 +msgid "No Viking File" +msgstr "" + +#: ../src/vikwindow.c:3998 +msgid "This layer has no configurable properties." +msgstr "" + +#: ../src/vikwindow.c:4080 +msgid "Are you sure you wish to delete all layers?" +msgstr "Ali res želite izbrisati vse plasti?" + +#. Try harder... +#: ../src/vikwindow.c:4126 ../src/vikwindow.c:4132 +msgid "Generating image file..." +msgstr "" + +#: ../src/vikwindow.c:4154 +msgid "" +"Failed to generate internal image.\n" +"\n" +"Try creating a smaller image." +msgstr "" + +#: ../src/vikwindow.c:4175 +msgid "Image file generated." +msgstr "" + +#: ../src/vikwindow.c:4177 +msgid "Failed to generate image file." +msgstr "" + +#: ../src/vikwindow.c:4246 +#, c-format +msgid "Unable to write to file %s: %s" +msgstr "" + +#: ../src/vikwindow.c:4284 +msgid "" +"Viewable region outside allowable pixel size bounds for image. Clipping " +"width/height values." +msgstr "" + +#: ../src/vikwindow.c:4309 +#, c-format +msgid "Total area: %ldm x %ldm (%.3f sq. km)" +msgstr "Skupna površina: %ldm x %ldm (%.3f km2)" + +#: ../src/vikwindow.c:4312 +#, c-format +msgid "Total area: %ldm x %ldm (%.3f sq. miles)" +msgstr "" + +#: ../src/vikwindow.c:4315 +#, c-format +msgid "Total area: %ldm x %ldm (%.3f sq. NM)" +msgstr "" + +#. Single file +#: ../src/vikwindow.c:4343 +msgid "Save Image" +msgstr "Shrani sliko" + +#: ../src/vikwindow.c:4364 ../src/vikwindow.c:4641 +msgid "KMZ" +msgstr "" + +#: ../src/vikwindow.c:4417 +msgid "You must be in UTM mode to use this feature" +msgstr "" + +#: ../src/vikwindow.c:4421 +msgid "Choose a directory to hold images" +msgstr "Izberite mapo za shranjevanje slik" + +#. todo: default for answers inside VikWindow or static (thruout instance) +#: ../src/vikwindow.c:4441 +msgid "Save to Image File" +msgstr "Shrani v slikovno datoteko" + +#: ../src/vikwindow.c:4457 +msgid "Width (pixels):" +msgstr "Širina (slikovnih točk):" + +#: ../src/vikwindow.c:4459 +msgid "Height (pixels):" +msgstr "Višina (slikovnih točk):" + +#: ../src/vikwindow.c:4462 +msgid "" +"WARNING: USING LARGE IMAGES OVER 10000x10000\n" +"MAY CRASH THE PROGRAM!" +msgstr "" + +#: ../src/vikwindow.c:4464 +msgid "Zoom (meters per pixel):" +msgstr "Povečava (metrov na slikovno točko)" + +#: ../src/vikwindow.c:4480 +msgid "Area in current viewable window" +msgstr "Površina v trenutno vidnem oknu" + +#: ../src/vikwindow.c:4490 +msgid "Save as PNG" +msgstr "Shrani kot PNG" + +#: ../src/vikwindow.c:4491 +msgid "Save as JPEG" +msgstr "Shrani kot JPEG" + +#: ../src/vikwindow.c:4520 +msgid "East-west image tiles:" +msgstr "" + +#: ../src/vikwindow.c:4522 +msgid "North-south image tiles:" +msgstr "" + +#: ../src/vikwindow.c:4619 +msgid "This feature is not available in UTM mode" +msgstr "" + +#: ../src/vikwindow.c:4658 +#, c-format +msgid "Unable to import %s." +msgstr "" + +#: ../src/vikwindow.c:4749 +msgid "Choose a background color" +msgstr "Izberite barvo ozadja" + +#: ../src/vikwindow.c:4765 +msgid "Choose a track highlight color" +msgstr "" + +#: ../src/vikwindow.c:4814 +msgid "_File" +msgstr "_Datoteka" + +#: ../src/vikwindow.c:4815 +msgid "_Edit" +msgstr "Ur_ejanje" + +#: ../src/vikwindow.c:4817 +msgid "_Show" +msgstr "" + +#: ../src/vikwindow.c:4820 +msgid "_Layers" +msgstr "_Plasti" + +#: ../src/vikwindow.c:4821 +msgid "_Tools" +msgstr "_Orodja" + +#: ../src/vikwindow.c:4822 +msgid "_Webtools" +msgstr "" + +#: ../src/vikwindow.c:4823 ../src/vikwindow.c:4893 +msgid "_Help" +msgstr "Po_moč" + +#: ../src/vikwindow.c:4825 +msgid "New file" +msgstr "Nova datoteka" + +#: ../src/vikwindow.c:4826 +msgid "_Open..." +msgstr "_Odpri..." + +#: ../src/vikwindow.c:4826 +msgid "Open a file" +msgstr "Odpri datoteko" + +#: ../src/vikwindow.c:4827 +msgid "Open _Recent File" +msgstr "" + +#: ../src/vikwindow.c:4828 +msgid "Append _File..." +msgstr "_Pripni datoteko..." + +#: ../src/vikwindow.c:4828 +msgid "Append data from a different file" +msgstr "Pripni podatke iz druge datoteke" + +#: ../src/vikwindow.c:4829 +msgid "Open GPX as External _Layer..." +msgstr "" + +#: ../src/vikwindow.c:4829 +msgid "Open a GPX file as an external layer" +msgstr "" + +#: ../src/vikwindow.c:4830 +msgid "_Export All" +msgstr "" + +#: ../src/vikwindow.c:4830 +msgid "Export All TrackWaypoint Layers" +msgstr "" + +#: ../src/vikwindow.c:4831 +msgid "_GPX..." +msgstr "" + +#: ../src/vikwindow.c:4831 +msgid "Export as GPX" +msgstr "" + +#: ../src/vikwindow.c:4832 +msgid "A_cquire" +msgstr "_Zajemi" + +#: ../src/vikwindow.c:4833 +msgid "_Directions..." +msgstr "" + +#: ../src/vikwindow.c:4833 +msgid "Get driving directions" +msgstr "" + +#: ../src/vikwindow.c:4835 +msgid "_OSM Traces..." +msgstr "" + +#: ../src/vikwindow.c:4835 +msgid "Get traces from OpenStreetMap" +msgstr "" + +#: ../src/vikwindow.c:4836 +msgid "_My OSM Traces..." +msgstr "" + +#: ../src/vikwindow.c:4836 +msgid "Get Your Own Traces from OpenStreetMap" +msgstr "" + +#: ../src/vikwindow.c:4839 +msgid "Geo_caches..." +msgstr "Geo_zakladi..." + +#: ../src/vikwindow.c:4839 +msgid "Get Geocaches from geocaching.com" +msgstr "Pridobi podatke o Geozakladih iz geocaching.com" + +#: ../src/vikwindow.c:4842 +msgid "Create waypoints from geotagged images" +msgstr "" + +#: ../src/vikwindow.c:4844 +msgid "Get a file from a URL" +msgstr "" + +#: ../src/vikwindow.c:4846 +msgid "Create waypoints from Wikipedia items in the current view" +msgstr "" + +#: ../src/vikwindow.c:4848 +msgid "_Save" +msgstr "_Shrani" + +#: ../src/vikwindow.c:4848 +msgid "Save the file" +msgstr "Shrani datoteko" + +#: ../src/vikwindow.c:4849 +msgid "Save _As..." +msgstr "Shrani _kot..." + +#: ../src/vikwindow.c:4849 +msgid "Save the file under different name" +msgstr "Shrani datoteko pod drugim imenom" + +#: ../src/vikwindow.c:4850 +msgid "Properties..." +msgstr "" + +#: ../src/vikwindow.c:4850 +msgid "File Properties" +msgstr "" + +#: ../src/vikwindow.c:4852 +msgid "Import KMZ _Map File..." +msgstr "" + +#: ../src/vikwindow.c:4852 +msgid "Import a KMZ file" +msgstr "" + +#: ../src/vikwindow.c:4853 +msgid "Generate _KMZ Map File..." +msgstr "" + +#: ../src/vikwindow.c:4853 +msgid "Generate a KMZ file with an overlay of the current view" +msgstr "" + +#: ../src/vikwindow.c:4855 +msgid "_Generate Image File..." +msgstr "" + +#: ../src/vikwindow.c:4855 +msgid "Save a snapshot of the workspace into a file" +msgstr "" + +#: ../src/vikwindow.c:4856 +msgid "Generate _Directory of Images..." +msgstr "" + +#: ../src/vikwindow.c:4856 +msgid "Generate _Directory of Images" +msgstr "" + +#: ../src/vikwindow.c:4857 +msgid "_Print..." +msgstr "_Natisni..." + +#: ../src/vikwindow.c:4857 +msgid "Print maps" +msgstr "Natisni zemljevide" + +#: ../src/vikwindow.c:4858 +msgid "E_xit" +msgstr "_Izhod" + +#: ../src/vikwindow.c:4858 +msgid "Exit the program" +msgstr "Izhod iz programa" + +#: ../src/vikwindow.c:4859 +msgid "Save and Exit" +msgstr "Shrani in končaj" + +#: ../src/vikwindow.c:4859 +msgid "Save and Exit the program" +msgstr "Shrani in končaj delo s programom" + +#: ../src/vikwindow.c:4861 +msgid "Go to the Pre_vious Location" +msgstr "" + +#: ../src/vikwindow.c:4861 +msgid "Go to the previous location" +msgstr "" + +#: ../src/vikwindow.c:4862 +msgid "Go to the _Next Location" +msgstr "" + +#: ../src/vikwindow.c:4862 +msgid "Go to the next location" +msgstr "" + +#: ../src/vikwindow.c:4863 +msgid "Go to the _Default Location" +msgstr "" + +#: ../src/vikwindow.c:4863 +msgid "Go to the default location" +msgstr "" + +#: ../src/vikwindow.c:4864 +msgid "Go to the _Auto Location" +msgstr "" + +#: ../src/vikwindow.c:4864 +msgid "Go to a location via automatic lookup" +msgstr "" + +#: ../src/vikwindow.c:4865 +msgid "Go to _Location..." +msgstr "" + +#: ../src/vikwindow.c:4865 +msgid "Go to address/place using text search" +msgstr "" + +#: ../src/vikwindow.c:4866 +msgid "_Go to Lat/Lon..." +msgstr "" + +#: ../src/vikwindow.c:4866 +msgid "Go to arbitrary lat/lon coordinate" +msgstr "" + +#: ../src/vikwindow.c:4867 +msgid "Go to UTM..." +msgstr "" + +#: ../src/vikwindow.c:4867 +msgid "Go to arbitrary UTM coordinate" +msgstr "" + +#: ../src/vikwindow.c:4868 +msgid "Go to Today" +msgstr "" + +#: ../src/vikwindow.c:4868 +msgid "Go to today on the calendar" +msgstr "" + +#: ../src/vikwindow.c:4869 +msgid "_Refresh" +msgstr "" + +#: ../src/vikwindow.c:4869 +msgid "Refresh any maps displayed" +msgstr "" + +#: ../src/vikwindow.c:4870 +msgid "Set _Highlight Color..." +msgstr "" + +#: ../src/vikwindow.c:4870 +msgid "Set Highlight Color" +msgstr "" + +#: ../src/vikwindow.c:4871 +msgid "Set Bac_kground Color..." +msgstr "" + +#: ../src/vikwindow.c:4871 +msgid "Set Background Color" +msgstr "" + +#: ../src/vikwindow.c:4872 +msgid "Zoom _In" +msgstr "Po_večaj" + +#: ../src/vikwindow.c:4872 +msgid "Zoom In" +msgstr "" + +#: ../src/vikwindow.c:4873 +msgid "Zoom _Out" +msgstr "Po_manjšaj" + +#: ../src/vikwindow.c:4873 +msgid "Zoom Out" +msgstr "" + +#: ../src/vikwindow.c:4874 +msgid "Zoom _To..." +msgstr "" + +#: ../src/vikwindow.c:4874 +msgid "Zoom To" +msgstr "" + +#: ../src/vikwindow.c:4875 +msgid "Pan _North" +msgstr "" + +#: ../src/vikwindow.c:4876 +msgid "Pan _East" +msgstr "" + +#: ../src/vikwindow.c:4877 +msgid "Pan _South" +msgstr "" + +#: ../src/vikwindow.c:4878 +msgid "Pan _West" +msgstr "" + +#: ../src/vikwindow.c:4879 +msgid "Background _Jobs" +msgstr "Opravila v _ozadju" + +#: ../src/vikwindow.c:4879 +msgid "Background Jobs" +msgstr "" + +#: ../src/vikwindow.c:4881 +msgid "Cu_t" +msgstr "_Izreži" + +#: ../src/vikwindow.c:4885 +msgid "Delete All" +msgstr "Izbriši vse" + +#: ../src/vikwindow.c:4886 +msgid "Copy Centre _Location" +msgstr "" + +#: ../src/vikwindow.c:4887 +msgid "_Flush Map Cache" +msgstr "" + +#: ../src/vikwindow.c:4888 +msgid "_Set the Default Location" +msgstr "" + +#: ../src/vikwindow.c:4888 +msgid "Set the Default Location to the current position" +msgstr "" + +#: ../src/vikwindow.c:4889 +msgid "_Preferences" +msgstr "_Nastavitve" + +#: ../src/vikwindow.c:4889 +msgid "Program Preferences" +msgstr "" + +#: ../src/vikwindow.c:4890 +msgid "_Layer Defaults" +msgstr "" + +#: ../src/vikwindow.c:4891 +msgid "_Properties" +msgstr "_Lastnosti" + +#: ../src/vikwindow.c:4893 +msgid "Help" +msgstr "" + +#: ../src/vikwindow.c:4894 +msgid "_About" +msgstr "_O programu" + +#: ../src/vikwindow.c:4894 +msgid "About" +msgstr "" + +#: ../src/vikwindow.c:4903 +msgid "_KML..." +msgstr "" + +#: ../src/vikwindow.c:4903 +msgid "Export as KML" +msgstr "" + +#: ../src/vikwindow.c:4904 +msgid "Transfer data from a GPS device" +msgstr "Prenos podatkov iz naprave GPS" + +#: ../src/vikwindow.c:4905 +msgid "Import file via GPSBabel converter" +msgstr "" + +#: ../src/vikwindow.c:4909 +msgid "Import Geo_JSON File..." +msgstr "" + +#: ../src/vikwindow.c:4909 +msgid "Import GeoJSON file" +msgstr "" + +#: ../src/vikwindow.c:4914 +msgid "_UTM Mode" +msgstr "_UTM način" + +#: ../src/vikwindow.c:4915 +msgid "_Expedia Mode" +msgstr "_Expedia način" + +#: ../src/vikwindow.c:4916 +msgid "_Mercator Mode" +msgstr "_Mercator način" + +#: ../src/vikwindow.c:4917 +msgid "Lat_/Lon Mode" +msgstr "" + +#: ../src/vikwindow.c:4921 +msgid "Show _Scale" +msgstr "" + +#: ../src/vikwindow.c:4921 +msgid "Show Scale" +msgstr "Prikaži merilo" + +#: ../src/vikwindow.c:4922 +msgid "Show _Center Mark" +msgstr "" + +#: ../src/vikwindow.c:4922 +msgid "Show Center Mark" +msgstr "Prikaži oznako središča" + +#: ../src/vikwindow.c:4923 +msgid "Show _Highlight" +msgstr "" + +#: ../src/vikwindow.c:4923 +msgid "Show Highlight" +msgstr "" + +#: ../src/vikwindow.c:4924 +msgid "_Full Screen" +msgstr "Celozaslonsko" + +#: ../src/vikwindow.c:4924 +msgid "Activate full screen mode" +msgstr "" + +#: ../src/vikwindow.c:4925 +msgid "Show Side _Panel" +msgstr "" + +#: ../src/vikwindow.c:4925 +msgid "Show Side Panel" +msgstr "" + +#: ../src/vikwindow.c:4926 +msgid "Show Status_bar" +msgstr "" + +#: ../src/vikwindow.c:4926 +msgid "Show Statusbar" +msgstr "" + +#: ../src/vikwindow.c:4927 +msgid "Show _Toolbar" +msgstr "" + +#: ../src/vikwindow.c:4927 +msgid "Show Toolbar" +msgstr "" + +#: ../src/vikwindow.c:4928 +msgid "Show _Menu" +msgstr "" + +#: ../src/vikwindow.c:4928 +msgid "Show Menu" +msgstr "" + +#: ../src/vikwindow.c:4929 +msgid "Show Side Panel B_uttons" +msgstr "" + +#: ../src/vikwindow.c:4929 +msgid "Show Side Panel Buttons" +msgstr "" + +#: ../src/vikwindow.c:4930 +msgid "Show Side Panel Ca_lendar" +msgstr "" + +#: ../src/vikwindow.c:4930 +msgid "Show Side Panel Calendar" +msgstr "" + +#: ../src/vikwindow.c:5064 +#, c-format +msgid "New _%s Layer" +msgstr "" + +#: ../src/vikwindow.c:5114 +#, fuzzy +msgid "..." +msgstr "Dodaj..." + +#: ../src/viking.desktop.in.h:2 +msgid "GPS Data Manager" +msgstr "" + +#: ../src/viking.desktop.in.h:3 +msgid "Map Based GPS Data Manager (live data capable)." +msgstr "" + +#: ../src/libjpeg/jpeg-data.c:205 +msgid "Data does not follow JPEG specification." +msgstr "" + +#: ../src/libjpeg/jpeg-data.c:302 +#, c-format +msgid "Path '%s' invalid." +msgstr "" + +#: ../src/libjpeg/jpeg-data.c:320 +#, c-format +msgid "Could not read '%s'." +msgstr "" + +#~ msgid "Email:" +#~ msgstr "E-pošta:" + +#~ msgid "Error: couldn't find gpsbabel." +#~ msgstr "Napaka: programa gpsbabel ni bilo mogoče najti." + +#~ msgid "Create Track" +#~ msgstr "Ustvari sled" diff --git a/po/sv.po b/po/sv.po new file mode 100644 index 0000000..878a2cd --- /dev/null +++ b/po/sv.po @@ -0,0 +1,6115 @@ +# Swedish translation for viking +# Copyright (c) 2007 Rosetta Contributors and Canonical Ltd 2007 +# This file is distributed under the same license as the viking package. +# FIRST AUTHOR , 2007. +# +msgid "" +msgstr "" +"Project-Id-Version: viking\n" +"Report-Msgid-Bugs-To: \n" +"POT-Creation-Date: 2019-01-19 12:53+0000\n" +"PO-Revision-Date: 2010-12-30 21:34+0000\n" +"Last-Translator: Erik Simmesgård \n" +"Language-Team: Swedish \n" +"Language: sv\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-Launchpad-Export-Date: 2018-12-21 17:32+0000\n" +"X-Generator: Launchpad (build 18847)\n" + +#: ../src/acquire.c:106 ../src/vikgpslayer.c:1367 +msgid "Done." +msgstr "Färdig." + +#: ../src/acquire.c:115 +msgid "No data." +msgstr "Ingen data." + +#: ../src/acquire.c:167 ../src/acquire.c:415 +msgid "Error: acquisition failed." +msgstr "" + +#: ../src/acquire.c:339 +msgid "Working..." +msgstr "Arbetar..." + +#. This shouldn't happen... +#: ../src/acquire.c:406 +msgid "" +"Unable to create command\n" +"Acquire method failed." +msgstr "" + +#: ../src/acquire.c:513 +msgid "_Filter" +msgstr "" + +#: ../src/acquire.c:528 +#, c-format +msgid "Filter with %s" +msgstr "" + +#: ../src/acquire.c:545 +msgid "Filter" +msgstr "" + +#: ../src/babel.c:640 +msgid "GPSBabel:" +msgstr "" + +#: ../src/babel.c:641 +msgid "" +"Allow setting the specific instance of GPSBabel. You must restart Viking for " +"this value to take effect." +msgstr "" + +#: ../src/babel_ui.c:79 +msgid "Select a file format" +msgstr "" + +#: ../src/babel_ui.c:144 ../src/viktrwlayer.c:531 ../src/viktrwlayer.c:2882 +msgid "Tracks" +msgstr "Spår" + +#: ../src/babel_ui.c:149 ../src/viktrwlayer.c:2892 +msgid "Routes" +msgstr "" + +#. ***** PARAMETERS ***** +#: ../src/babel_ui.c:154 ../src/viktrwlayer.c:531 ../src/viktrwlayer.c:2887 +msgid "Waypoints" +msgstr "Waypoints" + +#: ../src/background.c:64 +#, c-format +msgid "%d items" +msgstr "%d föremål" + +#: ../src/background.c:287 +msgid "Threads:" +msgstr "" + +#: ../src/background.c:288 +msgid "" +"Number of threads to use for Mapnik tasks. You need to restart Viking for a " +"change to this value to be used" +msgstr "" + +#: ../src/background.c:361 +msgid "Job" +msgstr "Jobb" + +#: ../src/background.c:365 +msgid "Progress" +msgstr "Förlopp" + +#: ../src/background.c:373 +msgid "Viking Background Jobs" +msgstr "" + +#: ../src/bing.c:42 +msgid "Bing Aerial" +msgstr "" + +#: ../src/bing.c:48 +msgid "Bing" +msgstr "" + +#. VIK_GTK_WINDOW_FROM_WIDGET(vp) +#: ../src/bingmapsource.c:514 +msgid "Bing attribution Loading" +msgstr "" + +#: ../src/clipboard.c:95 +msgid "paste failed" +msgstr "inklistring misslyckades" + +#: ../src/clipboard.c:105 +msgid "wrong clipboard data size" +msgstr "" + +#: ../src/clipboard.c:124 +#, c-format +msgid "" +"The clipboard contains sublayer data for %s layers. You must select a layer " +"of this type to paste the clipboard data." +msgstr "" + +#: ../src/clipboard.c:264 +msgid "" +"In order to paste a waypoint, please select an appropriate layer to paste " +"into." +msgstr "" + +#: ../src/dialog.c:60 +msgid "Go to Lat/Lon" +msgstr "Gå till Lat/Lon" + +#: ../src/dialog.c:69 ../src/viktrwlayer_wpwin.c:173 +msgid "Latitude:" +msgstr "Latitud:" + +#: ../src/dialog.c:72 ../src/viktrwlayer_wpwin.c:177 +msgid "Longitude:" +msgstr "Longitud:" + +#: ../src/dialog.c:102 +msgid "Go to UTM" +msgstr "" + +#: ../src/dialog.c:114 +msgid "Northing:" +msgstr "Norrvärde" + +#: ../src/dialog.c:117 +msgid "Easting:" +msgstr "Östvärde" + +#: ../src/dialog.c:121 ../src/vikgeoreflayer.c:902 +msgid "Zone:" +msgstr "Zon:" + +#: ../src/dialog.c:124 ../src/vikgeoreflayer.c:904 +msgid "Letter:" +msgstr "" + +#: ../src/dialog.c:246 ../src/geonamessearch.c:238 +#: ../src/datasource_osm_my_traces.c:505 +msgid "Nothing was selected" +msgstr "Inget markerat" + +#: ../src/dialog.c:254 +msgid "Add Route" +msgstr "" + +#: ../src/dialog.c:254 +msgid "Add Track" +msgstr "Lägg till spår" + +#: ../src/dialog.c:262 +msgid "Route Name:" +msgstr "" + +#: ../src/dialog.c:262 +msgid "Track Name:" +msgstr "Spårnamn:" + +#: ../src/dialog.c:282 +msgid "Please enter a name for the track." +msgstr "Vänligen skriv in ett namn för spåret" + +#: ../src/dialog.c:311 +msgid "Today" +msgstr "" + +#: ../src/dialog.c:393 +msgid "Zoom Factors..." +msgstr "" + +#: ../src/dialog.c:407 +msgid "Zoom factor (in meters per pixel):" +msgstr "Zoomfaktor (i meter per pixlar)" + +#: ../src/dialog.c:408 +msgid "X (easting): " +msgstr "X (östvärde): " + +#: ../src/dialog.c:409 +msgid "Y (northing): " +msgstr "Y (norrvärde): " + +#: ../src/dialog.c:414 +msgid "X and Y zoom factors must be equal" +msgstr "X och Y zoomfaktorerna måste vara unika" + +#: ../src/dialog.c:469 +msgid "1 min" +msgstr "1 min" + +#: ../src/dialog.c:470 +msgid "1 hour" +msgstr "1 timme" + +#: ../src/dialog.c:471 +msgid "1 day" +msgstr "1 dag" + +#: ../src/dialog.c:472 +msgid "Custom (in minutes):" +msgstr "Anpassad (i minuter):" + +#: ../src/dialog.c:608 +#, c-format +msgid "" +"2003-2008, Evan Battaglia\n" +"2008-%s, Viking's contributors" +msgstr "" + +#: ../src/dialog.c:609 +msgid "GPS Data and Topo Analyzer, Explorer, and Manager." +msgstr "" + +#: ../src/dialog.c:610 +msgid "" +"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.\n" +"\n" +"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.\n" +"\n" +"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., 59 Temple " +"Place, Suite 330, Boston, MA 02111-1307, USA" +msgstr "" + +#: ../src/dialog.c:703 +msgid "Translation is coordinated on http://launchpad.net/viking" +msgstr "" + +#: ../src/dialog.c:713 +msgid "Download along track" +msgstr "Ladda ned längsmed spår" + +#: ../src/dialog.c:720 +msgid "Map type:" +msgstr "Karttyp:" + +#: ../src/dialog.c:726 +msgid "Zoom level:" +msgstr "Zoomnivå:" + +#: ../src/dialog.c:766 +#, c-format +msgid "The map data is licensed: %s." +msgstr "" + +#: ../src/dialog.c:769 +#, c-format +msgid "" +"The data provided by '%s' are licensed under the following license: " +"%s." +msgstr "" + +#: ../src/dialog.c:773 +msgid "Open license" +msgstr "" + +#: ../src/expedia.c:54 +msgid "Expedia Street Maps" +msgstr "Expedia Street Maps" + +#: ../src/expedia.c:82 +msgid "Invalid expedia altitude" +msgstr "Ogiltig expedia altitud" + +#: ../src/expedia.c:113 +#, c-format +msgid "" +"Couldn't open EXPEDIA image file (right after successful download! Please " +"report and delete image file!): %s" +msgstr "" +"Kunde inte öppna EXPEDIA-bildfil (Direkt efter lyckad nedladdning! Vänligen " +"rapportera och ta bort bildfil!): %s" + +#: ../src/expedia.c:126 +#, c-format +msgid "" +"Couldn't save EXPEDIA image file (right after successful download! Please " +"report and delete image file!): %s" +msgstr "" +"Kunde inte spara EXPEDIA-bildfil (Direkt efter lyckad nedladdning! Vänligen " +"rapportera och ta bort bildfil!): %s" + +#: ../src/geonamessearch.c:115 +msgid "Search" +msgstr "Sök" + +#: ../src/geonamessearch.c:117 +msgid "No entries found!" +msgstr "Inga inlägg hittades!" + +#. NB could allow columns to be shifted around by doing this after each new +#. gtk_tree_view_column_set_reorderable ( column, TRUE ); +#. However I don't think is that useful, so I haven't put it in +#: ../src/geonamessearch.c:171 ../src/datasource_osm_my_traces.c:422 +#: ../src/viktrwlayer_tracklist.c:621 ../src/viktrwlayer_waypointlist.c:618 +msgid "Name" +msgstr "" + +#: ../src/geonamessearch.c:176 +msgid "Feature" +msgstr "" + +#: ../src/geonamessearch.c:181 ../src/datasource_osm_my_traces.c:437 +msgid "Lat/Lon" +msgstr "" + +#: ../src/geonamessearch.c:264 ../src/googlesearch.c:101 ../src/vikgoto.c:430 +msgid "couldn't map temp file" +msgstr "" + +#: ../src/geonamessearch.c:459 +msgid "Select articles" +msgstr "" + +#: ../src/geonamessearch.c:459 +msgid "Select the articles you want to add." +msgstr "" + +#: ../src/geonamessearch.c:475 +msgid "city" +msgstr "" + +#: ../src/geonamessearch.c:477 +msgid "edu" +msgstr "" + +#: ../src/geonamessearch.c:479 +msgid "airport" +msgstr "" + +#: ../src/geonamessearch.c:481 +msgid "mountain" +msgstr "" + +#: ../src/geonamessearch.c:483 +msgid "forest" +msgstr "" + +#: ../src/geonamessearch.c:485 +msgid "church" +msgstr "" + +#: ../src/geojson.c:74 +#, c-format +msgid "%s command failed: %s" +msgstr "" + +#: ../src/geojson.c:146 ../src/gpx.c:1317 +#, c-format +msgid "failed to open temporary file: %s" +msgstr "kunde inte öppna temporär fil: %s" + +#: ../src/globals.c:67 +msgid "DDD" +msgstr "" + +#: ../src/globals.c:67 +msgid "DMM" +msgstr "" + +#: ../src/globals.c:67 +msgid "DMS" +msgstr "" + +#: ../src/globals.c:67 +msgid "Raw" +msgstr "" + +#: ../src/globals.c:68 +msgid "Kilometres" +msgstr "" + +#: ../src/globals.c:68 +msgid "Miles" +msgstr "" + +#: ../src/globals.c:68 +msgid "Nautical Miles" +msgstr "" + +#. VIK_UNITS_SPEED_KILOMETRES_PER_HOUR: +#: ../src/globals.c:69 ../src/viktrwlayer_tracklist.c:655 ../src/vikutils.c:100 +msgid "km/h" +msgstr "" + +#: ../src/globals.c:69 ../src/viktrwlayer_tracklist.c:656 ../src/vikutils.c:78 +msgid "mph" +msgstr "" + +#. VIK_UNITS_SPEED_METRES_PER_SECOND: +#: ../src/globals.c:69 ../src/viktrwlayer_tracklist.c:663 ../src/vikutils.c:81 +msgid "m/s" +msgstr "" + +#: ../src/globals.c:69 ../src/viktrwlayer_tracklist.c:657 ../src/vikutils.c:84 +msgid "knots" +msgstr "" + +#: ../src/globals.c:69 ../src/viktrwlayer_tracklist.c:658 ../src/vikutils.c:87 +msgid "s/km" +msgstr "" + +#: ../src/globals.c:69 ../src/viktrwlayer_tracklist.c:659 ../src/vikutils.c:90 +msgid "min/km" +msgstr "" + +#: ../src/globals.c:69 +msgid "s/mi" +msgstr "" + +#: ../src/globals.c:69 ../src/viktrwlayer_tracklist.c:661 ../src/vikutils.c:96 +msgid "min/mi" +msgstr "" + +#: ../src/globals.c:70 +msgid "Metres" +msgstr "" + +#: ../src/globals.c:70 +msgid "Feet" +msgstr "" + +#: ../src/globals.c:73 +msgid "Locale" +msgstr "" + +#: ../src/globals.c:73 +msgid "World" +msgstr "" + +#: ../src/globals.c:73 +msgid "UTC" +msgstr "" + +#: ../src/globals.c:76 +msgid "Degree format:" +msgstr "Gradformat:" + +#: ../src/globals.c:77 +msgid "Distance units:" +msgstr "" + +#: ../src/globals.c:78 +msgid "Speed units:" +msgstr "" + +#: ../src/globals.c:79 +msgid "Height units:" +msgstr "" + +#: ../src/globals.c:80 +msgid "Use large waypoint icons:" +msgstr "" + +#: ../src/globals.c:81 +msgid "Default latitude:" +msgstr "" + +#: ../src/globals.c:82 +msgid "Default longitude:" +msgstr "" + +#: ../src/globals.c:83 +msgid "Time Display:" +msgstr "" + +#: ../src/globals.c:84 +msgid "" +"Display times according to the reference frame. Locale is the user's system " +"setting. World is relative to the location of the object." +msgstr "" + +#: ../src/globals.c:90 +msgid "Alphabetical" +msgstr "" + +#: ../src/globals.c:90 ../src/datasource_osm_my_traces.c:432 +msgid "Time" +msgstr "" + +#: ../src/globals.c:90 +msgid "Creation" +msgstr "" + +#: ../src/globals.c:91 +msgid "Title Case" +msgstr "" + +#: ../src/globals.c:91 +msgid "Lowercase" +msgstr "" + +#: ../src/globals.c:94 +msgid "KML File Export Units:" +msgstr "" + +#: ../src/globals.c:95 +msgid "GPX Track Order:" +msgstr "" + +#: ../src/globals.c:96 +msgid "GPX Waypoint Symbols:" +msgstr "" + +#: ../src/globals.c:97 +msgid "" +"Save GPX Waypoint Symbol names in the specified case. May be useful for " +"compatibility with various devices" +msgstr "" + +#: ../src/globals.c:98 +msgid "GPX Creator:" +msgstr "" + +#: ../src/globals.c:99 +msgid "" +"The creator value when writing a GPX file. Otherwise when blank a default is " +"used." +msgstr "" + +#: ../src/globals.c:104 +msgid "Image Viewer:" +msgstr "" + +#: ../src/globals.c:109 +msgid "External GPX Program 1:" +msgstr "" + +#: ../src/globals.c:110 +msgid "External GPX Program 2:" +msgstr "" + +#: ../src/globals.c:113 +msgid "Absolute" +msgstr "" + +#: ../src/globals.c:113 +msgid "Relative" +msgstr "" + +#: ../src/globals.c:117 +msgid "Save File Reference Mode:" +msgstr "" + +#: ../src/globals.c:118 +msgid "" +"When saving a Viking .vik file, this determines how the directory paths of " +"filenames are written." +msgstr "" + +#: ../src/globals.c:119 +msgid "Ask for Name before Track Creation:" +msgstr "" + +#: ../src/globals.c:120 +msgid "Show Tooltip during Track Creation:" +msgstr "" + +#: ../src/globals.c:121 +msgid "The number of recent files:" +msgstr "" + +#: ../src/globals.c:122 +msgid "" +"Only applies to new windows or on application restart. -1 means all " +"available files." +msgstr "" + +#: ../src/globals.c:123 +#, fuzzy +msgid "Open files in selected layer:" +msgstr "Ta bort valt lager" + +#: ../src/globals.c:124 +msgid "Open files (but not .vik ones) into the selected TrackWaypoint layer." +msgstr "" + +#: ../src/globals.c:125 +msgid "Show calendar day names:" +msgstr "" + +#: ../src/globals.c:128 +msgid "Home Location" +msgstr "" + +#: ../src/globals.c:128 +msgid "Last Location" +msgstr "" + +#: ../src/globals.c:128 +msgid "Specified File" +msgstr "" + +#: ../src/globals.c:128 +msgid "Auto Location" +msgstr "" + +#: ../src/globals.c:131 +msgid "Restore Window Setup:" +msgstr "" + +#: ../src/globals.c:132 +msgid "Restore window size and layout" +msgstr "" + +#: ../src/globals.c:133 +msgid "Add a Default Map Layer:" +msgstr "" + +#: ../src/globals.c:134 +msgid "" +"The default map layer added is defined by the Layer Defaults. Use the menu " +"Edit->Layer Defaults->Map... to change the map type and other values." +msgstr "" + +#: ../src/globals.c:135 +msgid "Startup Method:" +msgstr "" + +#: ../src/globals.c:136 +msgid "Startup File:" +msgstr "" + +#: ../src/globals.c:137 +msgid "" +"The default file to load on startup. Only applies when the startup method is " +"set to 'Specified File'" +msgstr "" + +#: ../src/globals.c:138 +msgid "Check For New Version:" +msgstr "" + +#: ../src/globals.c:139 +msgid "Periodically check to see if a new version of Viking is available" +msgstr "" + +#. Defaults for the options are setup here +#: ../src/globals.c:176 +msgid "General" +msgstr "" + +#. New Tab +#: ../src/globals.c:204 +msgid "Startup" +msgstr "" + +#. New Tab +#: ../src/globals.c:222 +msgid "Export/External" +msgstr "" + +#. 'Advanced' Properties +#: ../src/globals.c:249 +msgid "Advanced" +msgstr "" + +#. Webtools +#: ../src/google.c:39 +msgid "Google" +msgstr "Google" + +#. If there is an actual description field it will overwrite this value +#: ../src/gpx.c:264 +#, c-format +msgid "Created by: %s" +msgstr "" + +#: ../src/datasource_bfilter.c:43 +msgid "Max number of points:" +msgstr "Max antal punkter:" + +#: ../src/datasource_bfilter.c:84 +msgid "Simplify All Tracks..." +msgstr "" + +#: ../src/datasource_bfilter.c:85 +msgid "Simplified Tracks" +msgstr "Förenklade spår" + +#. { VIK_LAYER_NUM_TYPES, "compressmethod", VIK_LAYER_PARAM_UINT, VIK_LAYER_GROUP_NONE, N_("Simplify Method:"), VIK_LAYER_WIDGET_COMBOBOX, compress_method, NULL, NULL, NULL, NULL, NULL }, +#: ../src/datasource_bfilter.c:111 +msgid "Error Factor:" +msgstr "" + +#: ../src/datasource_bfilter.c:112 +msgid "" +"Specifies the maximum allowable error that may be introduced by removing a " +"single point by the crosstrack method. See the manual or GPSBabel Simplify " +"Filter documentation for more detail." +msgstr "" + +#: ../src/datasource_bfilter.c:166 +msgid "Compress Tracks..." +msgstr "" + +#: ../src/datasource_bfilter.c:167 +msgid "Compressed Tracks" +msgstr "" + +#: ../src/datasource_bfilter.c:197 ../src/datasource_bfilter.c:198 +msgid "Remove Duplicate Waypoints" +msgstr "Ta bort dubbla Waypoints" + +#: ../src/datasource_bfilter.c:221 +msgid "Manual filter:" +msgstr "" + +#: ../src/datasource_bfilter.c:222 +msgid "Manual filter command: e.g. 'swap'." +msgstr "" + +#: ../src/datasource_bfilter.c:233 ../src/datasource_bfilter.c:234 +msgid "Manual filter" +msgstr "" + +#: ../src/datasource_bfilter.c:262 +msgid "Waypoints Inside This" +msgstr "" + +#: ../src/datasource_bfilter.c:263 ../src/datasource_bfilter.c:292 +msgid "Polygonized Layer" +msgstr "" + +#: ../src/datasource_bfilter.c:291 +msgid "Waypoints Outside This" +msgstr "" + +#: ../src/datasource_file.c:61 +msgid "Import file with GPSBabel" +msgstr "" + +#: ../src/datasource_file.c:62 +msgid "Imported file" +msgstr "" + +#. The file selector +#: ../src/datasource_file.c:129 +msgid "File:" +msgstr "" + +#: ../src/datasource_file.c:130 +msgid "File to import" +msgstr "" + +#: ../src/datasource_file.c:137 +msgid "All files" +msgstr "" + +#. The file format selector +#: ../src/datasource_file.c:144 ../src/datasource_url.c:106 +msgid "File type:" +msgstr "" + +#: ../src/datasource_file.c:189 +#, c-format +msgid "using babel args '%s' and file '%s'" +msgstr "" + +#: ../src/datasource_gc.c:67 +msgid "Download Geocaches" +msgstr "Ladda ned Geocachar" + +#: ../src/datasource_gc.c:68 +msgid "Geocaching.com Caches" +msgstr "Geocaching.com Cachar" + +#: ../src/datasource_gc.c:86 +msgid "geocaching.com username:" +msgstr "geocaching.com användarnamn:" + +#: ../src/datasource_gc.c:87 +msgid "geocaching.com password:" +msgstr "geocaching.com lösenord:" + +#: ../src/datasource_gc.c:92 ../src/vikwindow.c:3502 +msgid "Geocaching" +msgstr "" + +#: ../src/datasource_gc.c:128 +#, c-format +msgid "" +"Can't find %s or %s in path! Check that you have installed it correctly." +msgstr "" + +#: ../src/datasource_gc.c:190 +msgid "Number geocaches:" +msgstr "Antal cahar:" + +#: ../src/datasource_gc.c:192 +msgid "Centered around:" +msgstr "Centrera runt:" + +#: ../src/datasource_gc.c:231 +msgid "Broken input - using some defaults" +msgstr "" + +#: ../src/datasource_geotag.c:51 +msgid "Create Waypoints from Geotagged Images" +msgstr "" + +#: ../src/datasource_geotag.c:52 +msgid "Geotagged Images" +msgstr "" + +#: ../src/datasource_geotag.c:102 ../src/datasource_geojson.c:93 +#: ../src/vikfileentry.c:171 ../src/vikwindow.c:3533 ../src/vikwindow.c:3610 +#: ../src/vikwindow.c:3641 ../src/vikwindow.c:4356 ../src/vikwindow.c:4649 +msgid "All" +msgstr "" + +#: ../src/datasource_geotag.c:107 ../src/vikfileentry.c:115 +#: ../src/viktrwlayer_geotag.c:637 ../src/vikwindow.c:3518 +#: ../src/vikwindow.c:4377 +msgid "JPG" +msgstr "" + +#: ../src/datasource_geotag.c:168 +#, c-format +msgid "Unable to create waypoint from %s" +msgstr "" + +#: ../src/datasource_geojson.c:46 +msgid "Acquire from GeoJSON" +msgstr "" + +#: ../src/datasource_geojson.c:47 ../src/datasource_geojson.c:98 +msgid "GeoJSON" +msgstr "" + +#: ../src/datasource_geojson.c:152 +#, c-format +msgid "Unable to import from: %s" +msgstr "" + +#: ../src/datasource_gps.c:54 +msgid "Acquire from GPS" +msgstr "Hämta från GPS" + +#: ../src/datasource_gps.c:55 +msgid "Acquired from GPS" +msgstr "" + +#: ../src/datasource_gps.c:258 +#, c-format +msgid "using cmd '%s' and file '%s'\n" +msgstr "" + +#: ../src/datasource_gps.c:353 ../src/vikgpslayer.c:966 +#, c-format +msgid "Downloading %d waypoint..." +msgid_plural "Downloading %d waypoints..." +msgstr[0] "Laddar ned %d waypoint..." +msgstr[1] "Laddar ned %d waypoints..." + +#: ../src/datasource_gps.c:358 ../src/vikgpslayer.c:971 +#, c-format +msgid "Downloading %d trackpoint..." +msgid_plural "Downloading %d trackpoints..." +msgstr[0] "Laddar ned %d trackpoint..." +msgstr[1] "Laddar ned %d trackpoints..." + +#: ../src/datasource_gps.c:363 ../src/vikgpslayer.c:976 +#, c-format +msgid "Downloading %d routepoint..." +msgid_plural "Downloading %d routepoints..." +msgstr[0] "" +msgstr[1] "" + +#: ../src/datasource_gps.c:386 ../src/datasource_gps.c:393 +#: ../src/datasource_gps.c:400 +#, c-format +msgid "Downloaded %d out of %d %s..." +msgstr "Laddade ned %d av %d %s..." + +#: ../src/datasource_gps.c:388 ../src/datasource_gps.c:395 +#: ../src/datasource_gps.c:402 +#, c-format +msgid "Downloaded %d %s." +msgstr "Laddade ned %d %s." + +#: ../src/datasource_gps.c:416 ../src/vikgpslayer.c:1134 +#, c-format +msgid "GPS Device: %s" +msgstr "GPS enhet: %s" + +#: ../src/datasource_gps.c:428 ../src/vikgpslayer.c:1214 +msgid "Status: Working..." +msgstr "" + +#. NB gps_layer_inst_init() is performed after parameter registeration +#. thus to give the protocols some potential values use the old static list +#. TODO: find another way to use gps_layer_inst_init()? +#: ../src/datasource_gps.c:584 ../src/vikgpslayer.c:216 +msgid "GPS Protocol:" +msgstr "GPS protokoll" + +#. List reassigned at runtime +#: ../src/datasource_gps.c:609 ../src/vikgpslayer.c:217 +msgid "Serial Port:" +msgstr "Seriell Port:" + +#: ../src/datasource_gps.c:659 +msgid "" +"Turn Off After Transfer\n" +"(Garmin/NAViLink Only)" +msgstr "" + +#: ../src/datasource_gps.c:666 +msgid "Tracks:" +msgstr "" + +#: ../src/datasource_gps.c:673 +msgid "Routes:" +msgstr "" + +#: ../src/datasource_gps.c:680 +msgid "Waypoints:" +msgstr "" + +#: ../src/datasource_gps.c:756 ../src/vikgpslayer.c:1509 +msgid "GPS device: N/A" +msgstr "GPS-enhet: Inte tillgänglig" + +#: ../src/datasource_osm.c:53 ../src/datasource_osm.c:54 +msgid "OSM traces" +msgstr "" + +#: ../src/datasource_osm.c:89 +msgid "Page number:" +msgstr "" + +#: ../src/datasource_osm_my_traces.c:59 ../src/datasource_osm_my_traces.c:60 +msgid "OSM My Traces" +msgstr "" + +#: ../src/datasource_osm_my_traces.c:106 ../src/osm-traces.c:684 +#, fuzzy +msgid "Email/username:" +msgstr "OSM användarnamn:" + +#: ../src/datasource_osm_my_traces.c:111 +msgid "The email or username used to login to OSM" +msgstr "" + +#: ../src/datasource_osm_my_traces.c:113 ../src/osm-traces.c:692 +msgid "Password:" +msgstr "Lösenord:" + +#: ../src/datasource_osm_my_traces.c:116 +msgid "The password used to login to OSM" +msgstr "" + +#: ../src/datasource_osm_my_traces.c:427 ../src/viktrwlayer.c:689 +msgid "Description" +msgstr "" + +#: ../src/datasource_osm_my_traces.c:442 +msgid "Privacy" +msgstr "" + +#: ../src/datasource_osm_my_traces.c:449 +msgid "Within Current View" +msgstr "" + +#: ../src/datasource_osm_my_traces.c:516 +msgid "GPS Traces" +msgstr "" + +#: ../src/datasource_osm_my_traces.c:518 +msgid "None found!" +msgstr "" + +#: ../src/datasource_osm_my_traces.c:569 +msgid "Ensure the OSM access token preferences are setup." +msgstr "" + +#: ../src/datasource_osm_my_traces.c:645 +msgid "My OSM Traces" +msgstr "" + +#. Report errors to the status bar +#: ../src/datasource_osm_my_traces.c:667 +#, c-format +msgid "Unable to get trace: %s" +msgstr "" + +#: ../src/datasource_routing.c:56 ../src/datasource_routing.c:57 +msgid "Directions" +msgstr "" + +#: ../src/datasource_routing.c:90 +msgid "No routing engines with directions available" +msgstr "" + +#. Engine selector +#: ../src/datasource_routing.c:99 +msgid "Engine:" +msgstr "" + +#. From and To entries +#: ../src/datasource_routing.c:104 +msgid "From:" +msgstr "Från:" + +#: ../src/datasource_routing.c:105 +msgid "To:" +msgstr "Till:" + +#: ../src/datasource_url.c:48 +msgid "Acquire from URL" +msgstr "" + +#: ../src/datasource_url.c:49 +msgid "URL" +msgstr "" + +#: ../src/datasource_url.c:101 +msgid "URL:" +msgstr "" + +#. Only GPX (not using GPSbabel) +#: ../src/datasource_url.c:133 ../src/vikfileentry.c:161 +#: ../src/vikwindow.c:3513 ../src/vikwindow.c:3603 +msgid "GPX" +msgstr "" + +#: ../src/datasource_wikipedia.c:32 +msgid "Create Waypoints from Wikipedia Articles" +msgstr "" + +#: ../src/datasource_wikipedia.c:33 +msgid "Wikipedia Waypoints" +msgstr "" + +#: ../src/dem.c:66 ../src/dem.c:80 +msgid "Invalid DEM" +msgstr "Ogiltig DEM" + +#: ../src/dem.c:122 +msgid "Invalid DEM header" +msgstr "" + +#: ../src/dem.c:191 ../src/dem.c:204 +msgid "Incorrect DEM Class B record: expected 1" +msgstr "" + +#: ../src/dem.c:289 ../src/download.c:176 +#, c-format +msgid "Couldn't map file %s: %s" +msgstr "" + +#: ../src/download.c:130 +msgid "Tile age (days):" +msgstr "" + +#: ../src/download.c:406 +#, c-format +msgid "Download error: %s" +msgstr "Nedladdningsfel: %s" + +#: ../src/download.c:490 +msgid "couldn't open temp file" +msgstr "kunde inte öppna temp fil" + +#: ../src/file.c:458 ../src/file.c:463 +#, c-format +msgid "Draw mode '%s' no more supported" +msgstr "" + +#: ../src/geotag_exif.c:621 +msgid "Not enough memory." +msgstr "" + +#: ../src/geotag_exif.c:639 +msgid "Setting a value for this tag is unsupported!" +msgstr "" + +#: ../src/geotag_exif.c:658 +#, c-format +msgid "Too few components specified (need %d, found %d)\n" +msgstr "" + +#: ../src/geotag_exif.c:662 +msgid "Numeric value expected\n" +msgstr "" + +#: ../src/geotag_exif.c:670 +msgid "This shouldn't happen!" +msgstr "" + +#: ../src/geotag_exif.c:740 +msgid "Not yet implemented!" +msgstr "" + +#: ../src/geotag_exif.c:753 +msgid "Warning; Too many components specified!" +msgstr "" + +#: ../src/osm-traces.c:87 +msgid "Identifiable (public w/ timestamps)" +msgstr "Indentifierbar (publik med tidsstämpel)" + +#: ../src/osm-traces.c:88 +msgid "Trackable (private w/ timestamps)" +msgstr "Spårbar (privat med tidsstämpel)" + +#: ../src/osm-traces.c:89 +msgid "Public" +msgstr "Publik" + +#: ../src/osm-traces.c:90 +msgid "Private" +msgstr "Privat" + +#: ../src/osm-traces.c:108 +msgid "Access Token:" +msgstr "" + +#: ../src/osm-traces.c:108 +msgid "Get New OSM Access Tokens" +msgstr "" + +#: ../src/osm-traces.c:109 +msgid "Access Token Key:" +msgstr "" + +#: ../src/osm-traces.c:110 +msgid "Access Token Secret:" +msgstr "" + +#: ../src/osm-traces.c:111 +msgid "OSM username:" +msgstr "OSM användarnamn:" + +#: ../src/osm-traces.c:112 +msgid "OSM password:" +msgstr "OSM lösenord:" + +#. Check to really override existing values... +#: ../src/osm-traces.c:263 +msgid "Do you want to overwrite existing values?" +msgstr "" + +#: ../src/osm-traces.c:275 +msgid "Not able to generate OSM request tokens." +msgstr "" + +#: ../src/osm-traces.c:299 +msgid "" +"Waiting for authorization approval.\n" +"Ensure you have granted access at the website before continuing here." +msgstr "" + +#: ../src/osm-traces.c:315 +msgid "No Authorization." +msgstr "" + +#: ../src/osm-traces.c:354 +msgid "" +"OSM Username and Password preferences are not required anymore. You can now " +"remove them." +msgstr "" + +#. Preferences +#: ../src/osm-traces.c:379 +msgid "OpenStreetMap Traces" +msgstr "" + +#: ../src/osm-traces.c:504 +#, c-format +msgid "failed to upload data: HTTP response is %ld" +msgstr "kunde inte ladda upp data: HTTP svar är %ld" + +#: ../src/osm-traces.c:509 +#, c-format +msgid "curl_easy_getinfo failed: %d" +msgstr "curl_easy_getinfo misslyckades: %d" + +#: ../src/osm-traces.c:514 +#, c-format +msgid "curl request failed: %s" +msgstr "curlförfrågan misslyckades: %s" + +#. Success +#: ../src/osm-traces.c:592 +msgid "Uploaded to OSM" +msgstr "" + +#: ../src/osm-traces.c:596 +msgid "" +"FAILED TO UPLOAD DATA TO OSM - Ensure the OSM access token preferences are " +"setup." +msgstr "" + +#: ../src/osm-traces.c:599 +msgid "FAILED TO UPLOAD DATA TO OSM - CURL PROBLEM" +msgstr "" + +#: ../src/osm-traces.c:602 +msgid "FAILED TO UPLOAD DATA TO OSM" +msgstr "" + +#: ../src/osm-traces.c:602 +msgid "HTTP response code" +msgstr "" + +#: ../src/osm-traces.c:610 +#, c-format +msgid "failed to unlink temporary file: %s" +msgstr "" + +#: ../src/osm-traces.c:664 +msgid "OSM upload" +msgstr "OSM-uppladdning" + +#: ../src/osm-traces.c:689 +#, fuzzy +msgid "" +"The email/username used as login\n" +"Enter the email/username you use to login into www.openstreetmap.org." +"" +msgstr "" +"Lösenord för att logga in\n" +"Skriv in lösenordet du använder för att logga in till www." +"openstreetmap.org." + +#: ../src/osm-traces.c:697 +msgid "" +"The password used to login\n" +"Enter the password you use to login into www.openstreetmap.org." +msgstr "" +"Lösenord för att logga in\n" +"Skriv in lösenordet du använder för att logga in till www." +"openstreetmap.org." + +#: ../src/osm-traces.c:703 +msgid "File's name:" +msgstr "Filnamn:" + +#: ../src/osm-traces.c:713 +msgid "" +"The name of the file on OSM\n" +"This is the name of the file created on the server.This is not the " +"name of the local file." +msgstr "" +"Namnet på filen hos OSM\n" +"Namnet på filen hos servern. Det är inte samma som namnet på den " +"lokala filen." + +#: ../src/osm-traces.c:717 ../src/viktrwlayer_wpwin.c:197 +#: ../src/viktrwlayer_wpwin.c:199 +msgid "Description:" +msgstr "Beskrivning :" + +#: ../src/osm-traces.c:731 +msgid "The description of the trace" +msgstr "Beskrivningen utav spåret" + +#: ../src/osm-traces.c:734 +msgid "Anonymize Times:" +msgstr "" + +#: ../src/osm-traces.c:739 +msgid "" +"Anonymize times of the trace.\n" +"You may choose to make the trace identifiable, yet mask the actual " +"real time values" +msgstr "" + +#: ../src/osm-traces.c:743 +msgid "Tags:" +msgstr "Märken:" + +#: ../src/osm-traces.c:751 +msgid "The tags associated to the trace" +msgstr "" + +#: ../src/osm-traces.c:816 +#, c-format +msgid "Uploading %s to OSM" +msgstr "Laddar upp %s till OSM" + +#: ../src/mapcache.c:67 +msgid "Map cache memory size (MB):" +msgstr "" + +#. NB Can have a couple hundred fonts loaded when using system directories +#. So ATM don't list them all - otherwise need better GUI feedback display. +#: ../src/mapnik_interface.cpp:324 +#, c-format +msgid "" +"%s %s\n" +"Plugins=%sFonts loaded=%d" +msgstr "" + +#: ../src/mapnik_interface.cpp:325 ../src/vikmapniklayer.c:278 +msgid "Mapnik" +msgstr "" + +#: ../src/print.c:51 ../src/viktrwlayer.c:572 +msgid "None" +msgstr "Ingen" + +#: ../src/print.c:52 +msgid "Horizontally" +msgstr "Horisontell" + +#: ../src/print.c:53 +msgid "Vertically" +msgstr "Vertikal" + +#: ../src/print.c:54 +msgid "Both" +msgstr "Båda" + +#: ../src/print.c:118 +msgid "Image Settings" +msgstr "Bildinställningar" + +#: ../src/print.c:551 +msgid "done" +msgstr "färdig" + +#. Page Size +#: ../src/print.c:580 +msgid "_Adjust Page Size and Orientation" +msgstr "_Justera sidstorlek och orientering" + +#: ../src/print.c:596 +msgid "C_enter:" +msgstr "C_entrum:" + +#. ignore page margins +#: ../src/print.c:614 +msgid "Ignore Page _Margins" +msgstr "Ignorera sid_marginaler" + +#: ../src/print.c:633 +msgid "Image S_ize:" +msgstr "Bild S_torlek" + +#: ../src/ui_util.c:88 +#, c-format +msgid "Could not launch web browser. %s" +msgstr "" + +#: ../src/ui_util.c:101 +#, c-format +msgid "Could not create new email. %s" +msgstr "" + +#: ../src/vikcoordlayer.c:57 +msgid "Color:" +msgstr "Färg:" + +#: ../src/vikcoordlayer.c:58 +msgid "Minutes Width:" +msgstr "" + +#: ../src/vikcoordlayer.c:59 +msgid "Line Thickness:" +msgstr "Linjens tjocklek:" + +#: ../src/vikcoordlayer.c:66 +msgid "Coordinate" +msgstr "" + +#: ../src/main.c:92 +#, c-format +msgid "Ignoring Xlib error: error code %d request code %d\n" +msgstr "" + +#: ../src/main.c:111 +msgid "Enable debug output" +msgstr "Aktivera felsökningsutskrifter" + +#: ../src/main.c:112 +msgid "Enable verbose output" +msgstr "Aktivera utförlig utskrift" + +#: ../src/main.c:113 +msgid "Show version" +msgstr "Visa version" + +#: ../src/main.c:114 +msgid "Latitude in decimal degrees" +msgstr "" + +#: ../src/main.c:115 +msgid "Longitude in decimal degrees" +msgstr "" + +#: ../src/main.c:116 +msgid "Zoom Level (OSM). Value can be 0 - 22" +msgstr "" + +#: ../src/main.c:117 +msgid "Add a map layer by id value. Use 0 for the default map." +msgstr "" + +#: ../src/main.c:160 +#, c-format +msgid "" +"%s %s\n" +"Copyright (c) 2003-2008 Evan Battaglia\n" +"Copyright (c) 2008-%s Viking's contributors\n" +msgstr "" + +#: ../src/osm.c:50 +msgid "OpenStreetMap (Mapnik)" +msgstr "" + +#: ../src/osm.c:65 +msgid "OpenStreetMap (Cycle)" +msgstr "" + +#: ../src/osm.c:79 +msgid "OpenStreetMap (Transport)" +msgstr "" + +#: ../src/osm.c:95 +msgid "OpenStreetMap (Humanitarian)" +msgstr "" + +#: ../src/osm.c:111 +msgid "On Disk OSM Tile Format" +msgstr "" + +#: ../src/osm.c:121 +msgid "MBTiles File" +msgstr "" + +#: ../src/osm.c:132 +msgid "OSM Metatiles" +msgstr "" + +#: ../src/osm.c:146 +msgid "Mapbox Outdoors" +msgstr "" + +#: ../src/osm.c:153 +msgid "Mapbox Specific" +msgstr "" + +#: ../src/osm.c:170 +msgid "OSM (view)" +msgstr "OSM (vy)" + +#: ../src/osm.c:174 +msgid "OSM (edit)" +msgstr "OSM (redigera)" + +#. Note the use of positional parameters +#: ../src/osm.c:179 +msgid "OSM (query)" +msgstr "" + +#: ../src/osm.c:183 +msgid "OSM (render)" +msgstr "OSM (rendera)" + +#. Example: http://127.0.0.1:8111/load_and_zoom?left=8.19&right=8.20&top=48.605&bottom=48.590&select=node413602999 +#. JOSM or merkaartor must already be running with remote interface enabled +#: ../src/osm.c:190 +msgid "Local port 8111 (eg JOSM)" +msgstr "" + +#: ../src/osm.c:195 +msgid "Geofabrik Map Compare" +msgstr "" + +#: ../src/osm.c:203 +msgid "OpenStreetMap Notes" +msgstr "" + +#. Not really OSM but can't be bothered to create somewhere else to put it... +#: ../src/osm.c:221 +msgid "Wikimedia Toolserver GeoHack" +msgstr "" + +#: ../src/preferences.c:195 +msgid "Preferences" +msgstr "Inställningar" + +#: ../src/toolbar.c:91 ../src/toolbar.c:92 +msgid "System Default" +msgstr "" + +#: ../src/toolbar.c:91 ../src/viktrwlayer.c:563 +msgid "Small" +msgstr "" + +#: ../src/toolbar.c:91 ../src/viktrwlayer.c:564 +msgid "Medium" +msgstr "" + +#: ../src/toolbar.c:91 ../src/viktrwlayer.c:565 +msgid "Large" +msgstr "" + +#: ../src/toolbar.c:92 +msgid "Icons Only" +msgstr "" + +#: ../src/toolbar.c:92 +msgid "Text Only" +msgstr "" + +#: ../src/toolbar.c:92 +msgid "Icons and Text" +msgstr "" + +#: ../src/toolbar.c:106 +msgid "Append to Menu:" +msgstr "" + +#: ../src/toolbar.c:107 +msgid "Pack the toolbar to the main menu to save vertical space" +msgstr "" + +#: ../src/toolbar.c:108 +msgid "Icon Size:" +msgstr "" + +#: ../src/toolbar.c:110 +msgid "Icon Style:" +msgstr "" + +#: ../src/toolbar.c:112 +msgid "Customize:" +msgstr "" + +#: ../src/toolbar.c:112 +msgid "Customize Buttons" +msgstr "" + +#. Preferences +#: ../src/toolbar.c:145 +msgid "Toolbar" +msgstr "" + +#: ../src/toolbar.c:312 +msgid "_Customize" +msgstr "" + +#: ../src/toolbar.c:641 +msgid "Separator" +msgstr "" + +#: ../src/toolbar.c:642 +msgid "--- Separator ---" +msgstr "" + +#: ../src/toolbar.c:1007 +msgid "Customize Toolbar" +msgstr "" + +#: ../src/toolbar.c:1028 +msgid "" +"Select items to be displayed on the toolbar. Items can be reordered by drag " +"and drop." +msgstr "" + +#: ../src/toolbar.c:1044 +msgid "Available Items" +msgstr "" + +#: ../src/toolbar.c:1065 +msgid "Displayed Items" +msgstr "" + +#: ../src/viklayer_defaults.c:232 +#, c-format +msgid "Could not open file: %s" +msgstr "" + +#: ../src/viklayer_defaults.c:304 +msgid "Layer Defaults" +msgstr "" + +#: ../src/uibuilder.c:196 +msgid "Take care that this password will be stored clearly in a plain file." +msgstr "Notera att detta lösenord kommer sparas i klartext." + +#: ../src/uibuilder.c:628 ../src/viktrwlayer_export.c:188 +#: ../src/viktrwlayer_export.c:304 ../src/vikwindow.c:3666 +#: ../src/vikwindow.c:4408 +#, c-format +msgid "The file \"%s\" exists, do you wish to overwrite it?" +msgstr "Filen \"%s\" finns redan, vill du skriva över den?" + +#: ../src/vikaggregatelayer.c:41 +msgid "Aggregate" +msgstr "" + +#: ../src/vikaggregatelayer.c:528 ../src/viktrwlayer.c:11700 +#, c-format +msgid "%s: Waypoint List" +msgstr "" + +#: ../src/vikaggregatelayer.c:570 +msgid "Search by Date" +msgstr "" + +#: ../src/vikaggregatelayer.c:576 +msgid "No items found with the requested date." +msgstr "" + +#: ../src/vikaggregatelayer.c:615 ../src/viktrwlayer.c:11691 +#, c-format +msgid "%s: Track and Route List" +msgstr "" + +#: ../src/vikaggregatelayer.c:681 ../src/viktrwlayer.c:8346 +#: ../src/viktrwlayer.c:8417 ../src/viktrwlayer.c:8494 +msgid "_Visibility" +msgstr "" + +#: ../src/vikaggregatelayer.c:686 +msgid "_Show All" +msgstr "" + +#: ../src/vikaggregatelayer.c:692 +msgid "_Hide All" +msgstr "" + +#: ../src/vikaggregatelayer.c:698 ../src/viktrwlayer.c:8363 +#: ../src/viktrwlayer.c:8434 ../src/viktrwlayer.c:8511 +msgid "_Toggle" +msgstr "" + +#: ../src/vikaggregatelayer.c:705 ../src/viktrwlayer.c:8532 +msgid "_Sort" +msgstr "" + +#: ../src/vikaggregatelayer.c:711 ../src/viktrwlayer.c:8538 +msgid "Name _Ascending" +msgstr "" + +#: ../src/vikaggregatelayer.c:717 ../src/viktrwlayer.c:8544 +msgid "Name _Descending" +msgstr "" + +#: ../src/vikaggregatelayer.c:723 ../src/viktrwlayer.c:575 +#: ../src/viktrwlayer.c:8550 +msgid "Date Ascending" +msgstr "" + +#: ../src/vikaggregatelayer.c:729 ../src/viktrwlayer.c:576 +#: ../src/viktrwlayer.c:8556 +msgid "Date Descending" +msgstr "" + +#: ../src/vikaggregatelayer.c:735 ../src/viktrwlayer.c:8445 +#: ../src/viktrwlayer.c:8523 ../src/viktrwlayer.c:8595 +#: ../src/viktrwlayer_tracklist.c:296 +msgid "_Statistics" +msgstr "" + +#: ../src/vikaggregatelayer.c:740 ../src/viktrwlayer.c:4533 +msgid "Track _List..." +msgstr "" + +#: ../src/vikaggregatelayer.c:746 ../src/viktrwlayer.c:4540 +msgid "_Waypoint List..." +msgstr "" + +#: ../src/vikaggregatelayer.c:753 +msgid "Searc_h" +msgstr "" + +#: ../src/vikaggregatelayer.c:759 +msgid "By _Date..." +msgstr "" + +#: ../src/vikaggregatelayer.c:762 +msgid "Find the first item with a specified date" +msgstr "" + +#: ../src/vikaggregatelayer.c:765 +msgid "Load E_xternal Layers" +msgstr "" + +#. Could have a more complicated tooltip that numbers each type of layers, +#. but for now a simple overall count +#: ../src/vikaggregatelayer.c:1011 +#, c-format +msgid "One layer" +msgid_plural "%d layers" +msgstr[0] "" +msgstr[1] "" + +#: ../src/vikaggregatelayer.c:1014 +#, c-format +msgid "Empty" +msgstr "" + +#: ../src/vikdemlayer.c:86 +msgid "SRTM Global 90m (3 arcsec)" +msgstr "" + +#: ../src/vikdemlayer.c:94 +msgid "Absolute height" +msgstr "Absolut höjd" + +#: ../src/vikdemlayer.c:95 +msgid "Height gradient" +msgstr "" + +#: ../src/vikdemlayer.c:120 +msgid "DEM Files:" +msgstr "DEM Filer:" + +#: ../src/vikdemlayer.c:121 +msgid "Download Source:" +msgstr "Ladda ned källa:" + +#: ../src/vikdemlayer.c:122 +msgid "Min Elev Color:" +msgstr "" + +#: ../src/vikdemlayer.c:123 ../src/viktrwlayer_wpwin.c:207 +msgid "Type:" +msgstr "Typ:" + +#: ../src/vikdemlayer.c:124 +msgid "Min Elev:" +msgstr "Min höjd:" + +#: ../src/vikdemlayer.c:125 +msgid "Max Elev:" +msgstr "Max höjd:" + +#: ../src/vikdemlayer.c:137 +msgid "_DEM Download" +msgstr "" + +#: ../src/vikdemlayer.c:137 +msgid "DEM Download" +msgstr "" + +#: ../src/vikdemlayer.c:192 +msgid "DEM" +msgstr "" + +#: ../src/vikdemlayer.c:304 +#, c-format +msgid "Number of files: %d" +msgstr "" + +#: ../src/vikdemlayer.c:446 +msgid "DEM Loading" +msgstr "" + +#: ../src/vikdemlayer.c:927 +#, c-format +msgid "No SRTM data available for %f, %f" +msgstr "" + +#: ../src/vikdemlayer.c:948 +#, c-format +msgid "DEM download failure for %f, %f" +msgstr "" + +#: ../src/vikdemlayer.c:954 +#, c-format +msgid "DEM write failure for %s" +msgstr "" + +#. Probably not over any land... +#: ../src/vikdemlayer.c:1201 +msgid "No DEM File Available" +msgstr "" + +#: ../src/vikdemlayer.c:1220 +#, c-format +msgid "" +"\n" +"Source: %s\n" +"\n" +"DEM File: %s\n" +"DEM File Timestamp: %s" +msgstr "" + +#: ../src/vikdemlayer.c:1224 +#, c-format +msgid "" +"Source: %s\n" +"\n" +"No DEM File!" +msgstr "" + +#: ../src/vikdemlayer.c:1264 +#, c-format +msgid "Downloading DEM %s" +msgstr "Laddar ned DEM %s" + +#: ../src/vikdemlayer.c:1289 +msgid "_Show DEM File Information" +msgstr "" + +#: ../src/vikfileentry.c:72 +msgid "Browse..." +msgstr "Bläddra..." + +#: ../src/vikfileentry.c:103 +msgid "Choose file" +msgstr "Välj fil" + +#: ../src/vikfileentry.c:120 ../src/vikwindow.c:4372 +msgid "PNG" +msgstr "" + +#: ../src/vikfileentry.c:125 +msgid "TIFF" +msgstr "" + +#: ../src/vikfileentry.c:133 +msgid "MBTiles" +msgstr "" + +#: ../src/vikfileentry.c:142 +msgid "XML" +msgstr "" + +#: ../src/vikfileentry.c:149 +msgid "MML" +msgstr "" + +#: ../src/vikfileentry.c:154 +msgid "MSS" +msgstr "" + +#: ../src/vikfilelist.c:49 +msgid "Choose file(s)" +msgstr "Välj fil(er)" + +#: ../src/vikfilelist.c:182 +msgid "Add..." +msgstr "Lägg till…" + +#: ../src/vikfilelist.c:183 +msgid "Delete" +msgstr "Ta bort" + +#: ../src/vikgeoreflayer.c:97 +msgid "_Georef Move Map" +msgstr "" + +#: ../src/vikgeoreflayer.c:97 +msgid "Georef Move Map" +msgstr "" + +#: ../src/vikgeoreflayer.c:106 +msgid "Georef Z_oom Tool" +msgstr "" + +#: ../src/vikgeoreflayer.c:106 +msgid "Georef Zoom Tool" +msgstr "" + +#: ../src/vikgeoreflayer.c:117 +msgid "GeoRef Map" +msgstr "" + +#: ../src/vikgeoreflayer.c:214 +msgid "Auto Read World Files:" +msgstr "" + +#: ../src/vikgeoreflayer.c:215 +msgid "" +"Automatically attempt to read associated world file of a new image for a " +"GeoRef layer" +msgstr "" + +#: ../src/vikgeoreflayer.c:511 ../src/vikgeoreflayer.c:797 +#: ../src/vikmapslayer.c:1174 +#, c-format +msgid "Couldn't open image file: %s" +msgstr "Kunde inte öppna bildfil: %s" + +#: ../src/vikgeoreflayer.c:607 ../src/vikgeoreflayer.c:633 +msgid "Choose World file" +msgstr "Välj World fil" + +#: ../src/vikgeoreflayer.c:619 +msgid "The World file you requested could not be opened for reading." +msgstr "Den Word fil du har valt kunde inte öppnas för läsning." + +#: ../src/vikgeoreflayer.c:621 +msgid "Unexpected end of file reading World file." +msgstr "Oväntat slut på filen vid läsning av World-filen." + +#: ../src/vikgeoreflayer.c:646 +msgid "The file you requested could not be opened for writing." +msgstr "Den fil du valt kunde inte öppnas för skrivning." + +#: ../src/vikgeoreflayer.c:782 +msgid "Lower right corner values may not be consistent with upper right values" +msgstr "" + +#: ../src/vikgeoreflayer.c:806 +#, c-format +msgid "Invalid image size: %s" +msgstr "" + +#: ../src/vikgeoreflayer.c:831 ../src/viklayer.c:561 ../src/vikwindow.c:4891 +msgid "Layer Properties" +msgstr "Lageregenskaper" + +#: ../src/vikgeoreflayer.c:852 +msgid "World File Parameters:" +msgstr "World Fil Parametrar:" + +#: ../src/vikgeoreflayer.c:853 +msgid "Load From File..." +msgstr "Ladda från fil..." + +#: ../src/vikgeoreflayer.c:858 +msgid "Corner pixel easting:" +msgstr "" + +#: ../src/vikgeoreflayer.c:860 +msgid "the UTM \"easting\" value of the upper-left corner pixel of the map" +msgstr "" + +#: ../src/vikgeoreflayer.c:862 +msgid "Corner pixel northing:" +msgstr "" + +#: ../src/vikgeoreflayer.c:864 +msgid "the UTM \"northing\" value of the upper-left corner pixel of the map" +msgstr "" + +#: ../src/vikgeoreflayer.c:866 +msgid "X (easting) scale (mpp): " +msgstr "" + +#: ../src/vikgeoreflayer.c:867 +msgid "Y (northing) scale (mpp): " +msgstr "" + +#: ../src/vikgeoreflayer.c:870 +msgid "the scale of the map in the X direction (meters per pixel)" +msgstr "" + +#: ../src/vikgeoreflayer.c:872 +msgid "the scale of the map in the Y direction (meters per pixel)" +msgstr "" + +#: ../src/vikgeoreflayer.c:874 +msgid "Map Image:" +msgstr "Kartbild:" + +#: ../src/vikgeoreflayer.c:919 +msgid "Upper left latitude:" +msgstr "" + +#: ../src/vikgeoreflayer.c:921 +msgid "Upper left longitude:" +msgstr "" + +#: ../src/vikgeoreflayer.c:923 +msgid "Lower right latitude:" +msgstr "" + +#: ../src/vikgeoreflayer.c:925 +msgid "Lower right longitude:" +msgstr "" + +#: ../src/vikgeoreflayer.c:937 +msgid "Calculate MPP values from coordinates" +msgstr "" + +#: ../src/vikgeoreflayer.c:938 +msgid "" +"Enter all corner coordinates before calculating the MPP values from the " +"image size" +msgstr "" + +#: ../src/vikgeoreflayer.c:948 +msgid "UTM" +msgstr "" + +#: ../src/vikgeoreflayer.c:949 +msgid "Latitude/Longitude" +msgstr "" + +#: ../src/vikgeoreflayer.c:957 ../src/vikmapniklayer.c:82 +#: ../src/vikmapslayer.c:158 +msgid "Alpha:" +msgstr "Alfa:" + +#. Now with icons +#: ../src/vikgeoreflayer.c:1062 +msgid "_Zoom to Fit Map" +msgstr "" + +#: ../src/vikgeoreflayer.c:1068 +msgid "_Goto Map Center" +msgstr "" + +#: ../src/vikgeoreflayer.c:1074 +msgid "_Export to World File" +msgstr "" + +#: ../src/vikgoto.c:98 +msgid "No goto tool available." +msgstr "" + +#: ../src/vikgoto.c:295 +msgid "goto" +msgstr "" + +#: ../src/vikgoto.c:297 +msgid "goto provider:" +msgstr "" + +#: ../src/vikgoto.c:312 +msgid "Enter address or place name:" +msgstr "Ange adress eller platsnamn:" + +#: ../src/vikgoto.c:487 +msgid "Locality" +msgstr "" + +#: ../src/vikgpslayer.c:137 +msgid "Data Mode" +msgstr "" + +#: ../src/vikgpslayer.c:139 +msgid "Realtime Tracking Mode" +msgstr "" + +#: ../src/vikgpslayer.c:176 +msgid "Keep vehicle at center" +msgstr "" + +#: ../src/vikgpslayer.c:177 +msgid "Keep vehicle on screen" +msgstr "" + +#: ../src/vikgpslayer.c:178 +msgid "Disable" +msgstr "" + +#: ../src/vikgpslayer.c:218 +msgid "Download Tracks:" +msgstr "" + +#: ../src/vikgpslayer.c:219 +msgid "Upload Tracks:" +msgstr "" + +#: ../src/vikgpslayer.c:220 +msgid "Download Routes:" +msgstr "" + +#: ../src/vikgpslayer.c:221 +msgid "Upload Routes:" +msgstr "" + +#: ../src/vikgpslayer.c:222 +msgid "Download Waypoints:" +msgstr "" + +#: ../src/vikgpslayer.c:223 +msgid "Upload Waypoints:" +msgstr "" + +#: ../src/vikgpslayer.c:225 +msgid "Recording tracks" +msgstr "Spelar in spår" + +#: ../src/vikgpslayer.c:226 +msgid "Jump to current position on start" +msgstr "Hoppa till nuvarande position vid start" + +#: ../src/vikgpslayer.c:227 +msgid "Moving Map Method:" +msgstr "Kartflyttningsläge:" + +#: ../src/vikgpslayer.c:228 +msgid "Update Statusbar:" +msgstr "" + +#: ../src/vikgpslayer.c:228 +msgid "Display information in the statusbar on GPS updates" +msgstr "" + +#: ../src/vikgpslayer.c:229 +msgid "Auto Connect" +msgstr "" + +#: ../src/vikgpslayer.c:229 +msgid "Automatically connect to GPSD" +msgstr "" + +#: ../src/vikgpslayer.c:230 +msgid "Gpsd Host:" +msgstr "Gpsd Värd:" + +#: ../src/vikgpslayer.c:231 +msgid "Gpsd Port:" +msgstr "Gpsd Port:" + +#: ../src/vikgpslayer.c:232 +msgid "Gpsd Retry Interval (seconds):" +msgstr "" + +#: ../src/vikgpslayer.c:254 +msgid "GPS" +msgstr "" + +#: ../src/vikgpslayer.c:320 ../src/vikgpslayer.c:1504 +msgid "GPS Download" +msgstr "GPS nedladdning" + +#: ../src/vikgpslayer.c:320 ../src/vikgpslayer.c:1504 ../src/viktrwlayer.c:3993 +msgid "GPS Upload" +msgstr "GPS uppladdning" + +#: ../src/vikgpslayer.c:322 +msgid "GPS Realtime Tracking" +msgstr "GPS Realtidsspårning" + +#: ../src/vikgpslayer.c:458 +msgid "Connected" +msgstr "" + +#: ../src/vikgpslayer.c:460 +msgid "Disconnected" +msgstr "" + +#: ../src/vikgpslayer.c:554 +msgid "Unknown GPS Protocol" +msgstr "Okänt GPS Protokoll" + +#: ../src/vikgpslayer.c:572 +msgid "Unknown serial port device" +msgstr "Okänd serialportsenhet" + +#: ../src/vikgpslayer.c:691 +#, c-format +msgid "%s: unknown parameter" +msgstr "%s: okänd parameter" + +#. Now with icons +#: ../src/vikgpslayer.c:794 +msgid "_Upload to GPS" +msgstr "" + +#: ../src/vikgpslayer.c:800 +msgid "Download from _GPS" +msgstr "Ladda ned från _GPS" + +#: ../src/vikgpslayer.c:821 +msgid "Empty _Realtime" +msgstr "" + +#: ../src/vikgpslayer.c:828 +msgid "E_mpty Upload" +msgstr "" + +#: ../src/vikgpslayer.c:834 +msgid "_Empty Download" +msgstr "" + +#: ../src/vikgpslayer.c:840 +msgid "Empty _All" +msgstr "" + +#: ../src/vikgpslayer.c:852 +#, c-format +msgid "Unexpected number of disconnected handlers: %d" +msgstr "" + +#: ../src/vikgpslayer.c:995 +#, c-format +msgid "Uploading %d waypoint..." +msgid_plural "Uploading %d waypoints..." +msgstr[0] "Laddar upp %d waypoint..." +msgstr[1] "Laddar upp %d waypoints..." + +#: ../src/vikgpslayer.c:1000 +#, c-format +msgid "Uploading %d trackpoint..." +msgid_plural "Uploading %d trackpoints..." +msgstr[0] "Laddar upp %d trackpoint..." +msgstr[1] "Laddar upp %d trackpoints..." + +#: ../src/vikgpslayer.c:1005 +#, c-format +msgid "Uploading %d routepoint..." +msgid_plural "Uploading %d routepoints..." +msgstr[0] "" +msgstr[1] "" + +#: ../src/vikgpslayer.c:1034 +#, c-format +msgid "Downloaded %d out of %d waypoint..." +msgid_plural "Downloaded %d out of %d waypoints..." +msgstr[0] "Laddade ned %d av %d waypoint..." +msgstr[1] "Laddade ned %d av %d waypoints..." + +#: ../src/vikgpslayer.c:1040 +#, c-format +msgid "Downloaded %d out of %d trackpoint..." +msgid_plural "Downloaded %d out of %d trackpoints..." +msgstr[0] "Laddade ned %d av %d trackpoint..." +msgstr[1] "Laddade ned %d av %d trackpoints..." + +#: ../src/vikgpslayer.c:1046 +#, c-format +msgid "Downloaded %d out of %d routepoint..." +msgid_plural "Downloaded %d out of %d routepoints..." +msgstr[0] "" +msgstr[1] "" + +#: ../src/vikgpslayer.c:1056 +#, c-format +msgid "Uploaded %d out of %d waypoint..." +msgid_plural "Uploaded %d out of %d waypoints..." +msgstr[0] "Laddade upp %d av %d waypoint..." +msgstr[1] "Laddade upp %d av %d waypoints..." + +#: ../src/vikgpslayer.c:1062 +#, c-format +msgid "Uploaded %d out of %d trackpoint..." +msgid_plural "Uploaded %d out of %d trackpoints..." +msgstr[0] "Laddade upp %d av %d trackpoint..." +msgstr[1] "Laddade upp %d av %d trackpoints..." + +#: ../src/vikgpslayer.c:1068 +#, c-format +msgid "Uploaded %d out of %d routepoint..." +msgid_plural "Uploaded %d out of %d routepoints..." +msgstr[0] "" +msgstr[1] "" + +#: ../src/vikgpslayer.c:1079 +#, c-format +msgid "Downloaded %d waypoint" +msgid_plural "Downloaded %d waypoints" +msgstr[0] "Laddade ned %d waypoint" +msgstr[1] "Laddade ned %d waypoints" + +#: ../src/vikgpslayer.c:1085 +#, c-format +msgid "Downloaded %d trackpoint" +msgid_plural "Downloaded %d trackpoints" +msgstr[0] "Laddade ned %d trackpoint" +msgstr[1] "Laddade ned %d trackpoints" + +#: ../src/vikgpslayer.c:1091 +#, c-format +msgid "Downloaded %d routepoint" +msgid_plural "Downloaded %d routepoints" +msgstr[0] "" +msgstr[1] "" + +#: ../src/vikgpslayer.c:1101 +#, c-format +msgid "Uploaded %d waypoint" +msgid_plural "Uploaded %d waypoints" +msgstr[0] "Laddade upp %d waypoint" +msgstr[1] "Laddade upp %d waypoints" + +#: ../src/vikgpslayer.c:1107 +#, c-format +msgid "Uploaded %d trackpoint" +msgid_plural "Uploaded %d trackpoints" +msgstr[0] "Laddade upp %d trackpoint" +msgstr[1] "Laddade upp %d trackpoints" + +#: ../src/vikgpslayer.c:1113 +#, c-format +msgid "Uploaded %d routepoint" +msgid_plural "Uploaded %d routepoints" +msgstr[0] "" +msgstr[1] "" + +#: ../src/vikgpslayer.c:1363 +msgid "Error: No result." +msgstr "" + +#: ../src/vikgpslayer.c:1471 +msgid "Warning - GPS Upload items may overwrite each other" +msgstr "" + +#: ../src/vikgpslayer.c:1506 +msgid "Status: detecting gpsbabel" +msgstr "Status: letar efter gpsbabel" + +#: ../src/vikgpslayer.c:1533 +msgid "No GPS items selected for transfer." +msgstr "" + +#: ../src/vikgpslayer.c:1546 +msgid "Could not turn off device." +msgstr "" + +#: ../src/vikgpslayer.c:1589 +msgid "Are you sure you want to delete GPS Upload data?" +msgstr "" + +#: ../src/vikgpslayer.c:1602 +msgid "Are you sure you want to delete GPS Download data?" +msgstr "" + +#: ../src/vikgpslayer.c:1616 +msgid "Are you sure you want to delete GPS Realtime data?" +msgstr "" + +#: ../src/vikgpslayer.c:1630 +msgid "Are you sure you want to delete All GPS data?" +msgstr "" + +#: ../src/vikgpslayer.c:2004 +#, c-format +msgid "" +"Failed to connect to gpsd at %s (port %s)\n" +"Should Viking keep trying (every %d seconds)?" +msgstr "" + +#: ../src/viklayerspanel.c:73 +msgid "C_ut" +msgstr "" + +#: ../src/viklayerspanel.c:74 ../src/vikwindow.c:4882 +msgid "_Copy" +msgstr "_Kopiera" + +#: ../src/viklayerspanel.c:75 ../src/vikwindow.c:4883 +msgid "_Paste" +msgstr "Klistra _in" + +#: ../src/viklayerspanel.c:76 ../src/vikwindow.c:4884 +msgid "_Delete" +msgstr "_Ta bort" + +#: ../src/viklayerspanel.c:154 +msgid "New Layer" +msgstr "" + +#: ../src/viklayerspanel.c:347 +msgid "Top Layer" +msgstr "" + +#: ../src/viklayerspanel.c:363 +msgid "Add new layer" +msgstr "Lägg till ett nytt lager" + +#: ../src/viklayerspanel.c:370 ../src/vikwindow.c:4884 +msgid "Remove selected layer" +msgstr "Ta bort valt lager" + +#: ../src/viklayerspanel.c:377 +msgid "Move selected layer up" +msgstr "Flytta upp valt lager" + +#: ../src/viklayerspanel.c:384 +msgid "Move selected layer down" +msgstr "Flytta ned valt lager" + +#: ../src/viklayerspanel.c:391 ../src/vikwindow.c:4881 +msgid "Cut selected layer" +msgstr "Skär valt lager" + +#: ../src/viklayerspanel.c:398 ../src/vikwindow.c:4882 +msgid "Copy selected layer" +msgstr "Kopiera valt lager" + +#: ../src/viklayerspanel.c:405 ../src/vikwindow.c:4883 +msgid "" +"Paste layer into selected container layer or otherwise above selected layer" +msgstr "" + +#: ../src/viklayerspanel.c:502 +msgid "New name can not be blank." +msgstr "" + +#: ../src/viklayerspanel.c:751 +msgid "Aggregate Layers have no settable properties." +msgstr "" + +#: ../src/viklayerspanel.c:798 +msgid "You cannot cut the Top Layer." +msgstr "" + +#: ../src/viklayerspanel.c:843 +#, c-format +msgid "Are you sure you want to delete %s?" +msgstr "" + +#: ../src/viklayerspanel.c:863 +msgid "You cannot delete the Top Layer." +msgstr "" + +#: ../src/vikmapniklayer.c:78 +msgid "CSS (MML) Config File:" +msgstr "" + +#: ../src/vikmapniklayer.c:79 +msgid "CartoCSS configuration file" +msgstr "" + +#: ../src/vikmapniklayer.c:80 +msgid "XML Config File:" +msgstr "" + +#: ../src/vikmapniklayer.c:81 +msgid "Mapnik XML configuration file" +msgstr "" + +#: ../src/vikmapniklayer.c:84 +msgid "Use File Cache:" +msgstr "" + +#: ../src/vikmapniklayer.c:86 +msgid "File Cache Directory:" +msgstr "" + +#: ../src/vikmapniklayer.c:122 +msgid "_Mapnik Features" +msgstr "" + +#: ../src/vikmapniklayer.c:122 +msgid "Mapnik Features" +msgstr "" + +#: ../src/vikmapniklayer.c:140 +msgid "Mapnik Rendering" +msgstr "" + +#. Changing these values only applies before first mapnik layer is 'created' +#: ../src/vikmapniklayer.c:258 +msgid "Plugins Directory:" +msgstr "" + +#: ../src/vikmapniklayer.c:258 ../src/vikmapniklayer.c:259 +#: ../src/vikmapniklayer.c:260 ../src/vikmapniklayer.c:261 +msgid "You need to restart Viking for a change to this value to be used" +msgstr "" + +#: ../src/vikmapniklayer.c:259 +msgid "Fonts Directory:" +msgstr "" + +#: ../src/vikmapniklayer.c:260 +msgid "Recurse Fonts Directory:" +msgstr "" + +#: ../src/vikmapniklayer.c:261 +msgid "Rerender Timeout (hours):" +msgstr "" + +#. Changeable any time +#: ../src/vikmapniklayer.c:263 +msgid "CartoCSS:" +msgstr "" + +#: ../src/vikmapniklayer.c:263 +msgid "The program to convert CartoCSS files into Mapnik XML" +msgstr "" + +#: ../src/vikmapniklayer.c:506 +msgid "Running" +msgstr "" + +#: ../src/vikmapniklayer.c:525 +#, c-format +msgid "" +"Error running carto command:\n" +"%s" +msgstr "" + +#: ../src/vikmapniklayer.c:561 +msgid " completed in " +msgstr "" + +#: ../src/vikmapniklayer.c:561 +msgid "seconds" +msgstr "" + +#: ../src/vikmapniklayer.c:611 ../src/vikmapniklayer.c:979 +#, c-format +msgid "" +"Mapnik error loading configuration file:\n" +"%s" +msgstr "" + +#: ../src/vikmapniklayer.c:749 +#, c-format +msgid "Mapnik Render %d:%d:%d %s" +msgstr "" + +#: ../src/vikmapniklayer.c:840 +msgid "Mapnik Rendering must be in Mercator mode" +msgstr "" + +#: ../src/vikmapniklayer.c:997 +msgid "Mapnik Information" +msgstr "" + +#: ../src/vikmapniklayer.c:1031 +msgid "_Flush Memory Cache" +msgstr "" + +#: ../src/vikmapniklayer.c:1044 +msgid "_Run Carto Command" +msgstr "" + +#: ../src/vikmapniklayer.c:1102 ../src/vikmapslayer.c:2029 +#, c-format +msgid "Tile File Timestamp: %s" +msgstr "" + +#: ../src/vikmapniklayer.c:1105 ../src/vikmapslayer.c:2032 +msgid "Tile File Timestamp: Not Available" +msgstr "" + +#: ../src/vikmapniklayer.c:1120 +#, c-format +msgid "Rendering time %.2f seconds" +msgstr "" + +#: ../src/vikmapniklayer.c:1124 ../src/vikmapslayer.c:2042 +msgid "Tile Information" +msgstr "" + +#: ../src/vikmapniklayer.c:1145 +msgid "_Rerender Tile" +msgstr "" + +#: ../src/vikmapniklayer.c:1150 +msgid "_Info" +msgstr "" + +#. ******* MAPZOOMS ******** +#: ../src/vikmapslayer.c:96 +msgid "Use Viking Zoom Level" +msgstr "" + +#: ../src/vikmapslayer.c:146 +msgid "OSM" +msgstr "" + +#. NB mode => id - But can't break file format just to rename something better +#: ../src/vikmapslayer.c:152 +msgid "Map Type:" +msgstr "Karttyp:" + +#: ../src/vikmapslayer.c:153 +msgid "Maps Directory:" +msgstr "" + +#: ../src/vikmapslayer.c:154 +msgid "Cache Layout:" +msgstr "" + +#: ../src/vikmapslayer.c:155 +msgid "This determines the tile storage layout on disk" +msgstr "" + +#: ../src/vikmapslayer.c:156 +msgid "Map File:" +msgstr "" + +#: ../src/vikmapslayer.c:157 +msgid "An MBTiles file. Only applies when the map type method is 'MBTiles'" +msgstr "" + +#: ../src/vikmapslayer.c:159 +msgid "Control the Alpha value for transparency effects" +msgstr "" + +#: ../src/vikmapslayer.c:160 +msgid "Autodownload maps:" +msgstr "" + +#: ../src/vikmapslayer.c:161 +msgid "Autodownload Only Gets Missing Maps:" +msgstr "" + +#: ../src/vikmapslayer.c:162 +msgid "" +"Using this option avoids attempting to update already acquired tiles. This " +"can be useful if you want to restrict the network usage, without having to " +"resort to manual control. Only applies when 'Autodownload Maps' is on." +msgstr "" + +#: ../src/vikmapslayer.c:163 +msgid "Zoom Level:" +msgstr "" + +#: ../src/vikmapslayer.c:164 +msgid "" +"Determines the method of displaying map tiles for the current zoom level. " +"'Viking Zoom Level' uses the best matching level, otherwise setting a fixed " +"value will always use map tiles of the specified value regardless of the " +"actual zoom level." +msgstr "" + +#: ../src/vikmapslayer.c:197 +msgid "_Maps Download" +msgstr "" + +#: ../src/vikmapslayer.c:197 +msgid "Maps Download" +msgstr "" + +#: ../src/vikmapslayer.c:213 ../src/vikutils.c:895 +msgid "Map" +msgstr "Karta" + +#: ../src/vikmapslayer.c:306 +msgid "Default map layer directory:" +msgstr "" + +#: ../src/vikmapslayer.c:306 +msgid "Choose a directory to store cached Map tiles for this layer" +msgstr "" + +#: ../src/vikmapslayer.c:436 ../src/vikmapslayer.c:633 +msgid "Unknown map type" +msgstr "Okänd karttyp" + +#: ../src/vikmapslayer.c:664 +msgid "Unknown Map Zoom" +msgstr "" + +#: ../src/vikmapslayer.c:833 +#, c-format +msgid "Failed to open MBTiles file: %s" +msgstr "" + +#: ../src/vikmapslayer.c:856 +#, c-format +msgid "" +"New map cannot be displayed in the current drawmode.\n" +"Select \"%s\" from View menu to view it." +msgstr "" + +#: ../src/vikmapslayer.c:1314 +#, c-format +msgid "" +"Cowardly refusing to draw tiles or existence of tiles beyond %d zoom out " +"factor" +msgstr "" + +#. TODO: ?? count up the number of download errors somehow... +#: ../src/vikmapslayer.c:1667 +msgid "Failed to download tile" +msgstr "" + +#: ../src/vikmapslayer.c:1673 +msgid "Unable to save tile" +msgstr "" + +#: ../src/vikmapslayer.c:1799 +#, c-format +msgid "Redownloading up to %d %s map..." +msgid_plural "Redownloading up to %d %s maps..." +msgstr[0] "" +msgstr[1] "" + +#: ../src/vikmapslayer.c:1801 +#, c-format +msgid "Redownloading %d %s map..." +msgid_plural "Redownloading %d %s maps..." +msgstr[0] "" +msgstr[1] "" + +#: ../src/vikmapslayer.c:1805 ../src/vikmapslayer.c:1890 +#, c-format +msgid "Downloading %d %s map..." +msgid_plural "Downloading %d %s maps..." +msgstr[0] "" +msgstr[1] "" + +#: ../src/vikmapslayer.c:1969 +msgid "YES" +msgstr "" + +#: ../src/vikmapslayer.c:1973 ../src/vikmapslayer.c:1977 +msgid "NO" +msgstr "" + +#. NB Also handles .jpg automatically due to pixbuf_new_from () support - although just print png for now. +#: ../src/vikmapslayer.c:1980 +#, c-format +msgid "Source: %s (%d%s%d%s%d.%s %s)" +msgstr "" + +#: ../src/vikmapslayer.c:1983 +msgid "Source: Not available" +msgstr "" + +#: ../src/vikmapslayer.c:2000 +msgid "Source: file://" +msgstr "" + +#: ../src/vikmapslayer.c:2012 +#, c-format +msgid "Source: %s" +msgstr "" + +#: ../src/vikmapslayer.c:2038 +#, c-format +msgid "Tile File: %s [Not Available]" +msgstr "" + +#: ../src/vikmapslayer.c:2086 +msgid "Redownload _Bad Map(s)" +msgstr "" + +#: ../src/vikmapslayer.c:2090 +msgid "Redownload _New Map(s)" +msgstr "" + +#: ../src/vikmapslayer.c:2094 +msgid "Redownload _All Map(s)" +msgstr "" + +#: ../src/vikmapslayer.c:2099 +msgid "_Show Tile Information" +msgstr "" + +#: ../src/vikmapslayer.c:2166 +#, c-format +msgid "" +"Wrong drawmode for this map.\n" +"Select \"%s\" from View menu and try again." +msgstr "" + +#: ../src/vikmapslayer.c:2171 +msgid "Wrong zoom level for this map." +msgstr "" + +#: ../src/vikmapslayer.c:2334 +msgid "Zoom Start:" +msgstr "" + +#: ../src/vikmapslayer.c:2341 +msgid "Zoom End:" +msgstr "" + +#: ../src/vikmapslayer.c:2347 +msgid "Download Maps Method:" +msgstr "" + +#. redownload method - needs to align with REDOWNLOAD* macro values +#: ../src/vikmapslayer.c:2419 +msgid "Missing" +msgstr "" + +#: ../src/vikmapslayer.c:2419 +msgid "Bad" +msgstr "" + +#: ../src/vikmapslayer.c:2419 +msgid "New" +msgstr "" + +#: ../src/vikmapslayer.c:2419 +msgid "Reload All" +msgstr "" + +#: ../src/vikmapslayer.c:2421 +msgid "Download for Zoom Levels" +msgstr "" + +#: ../src/vikmapslayer.c:2461 +#, c-format +msgid "" +"You are not allowed to download more than %d tiles in one go (requested %d)" +msgstr "" + +#: ../src/vikmapslayer.c:2469 +#, c-format +msgid "Do you really want to download %d tiles?" +msgstr "" + +#. Now with icons +#: ../src/vikmapslayer.c:2509 +msgid "Download _Missing Onscreen Maps" +msgstr "" + +#: ../src/vikmapslayer.c:2516 +msgid "Download _New Onscreen Maps" +msgstr "" + +#: ../src/vikmapslayer.c:2523 +msgid "Reload _All Onscreen Maps" +msgstr "" + +#: ../src/vikmapslayer.c:2529 +msgid "Download Maps in _Zoom Levels..." +msgstr "" + +#: ../src/vikmapslayer.c:2539 +#, fuzzy +msgid "_Open MBTiles Files" +msgstr "Öppna en fil" + +#: ../src/vikmapslayer.c:2554 +msgid "Flush Map Cache" +msgstr "" + +#: ../src/vikrouting.c:54 +msgid "Default engine:" +msgstr "" + +#: ../src/vikrouting.c:68 +msgid "Routing" +msgstr "" + +#: ../src/viktreeview.c:347 +msgid "Layer Name" +msgstr "Lagernamn" + +#: ../src/viktreeview.c:924 +#, c-format +msgid "delete data from %s\n" +msgstr "Ta bort data från %s\n" + +#: ../src/viktrwlayer.c:427 +msgid "Create _Waypoint" +msgstr "" + +#: ../src/viktrwlayer.c:427 +msgid "Create Waypoint" +msgstr "Skapa waypoint" + +#: ../src/viktrwlayer.c:437 +#, fuzzy +msgid "Edit _Track" +msgstr "Redigera trackpoint" + +#: ../src/viktrwlayer.c:437 +#, fuzzy +msgid "Edit Track" +msgstr "Redigera trackpoint" + +#: ../src/viktrwlayer.c:449 +msgid "Edit _Route" +msgstr "" + +#: ../src/viktrwlayer.c:449 +#, fuzzy +msgid "Edit Route" +msgstr "Redigera waypoint" + +#: ../src/viktrwlayer.c:460 +msgid "Route _Finder" +msgstr "" + +#: ../src/viktrwlayer.c:460 +msgid "Route Finder" +msgstr "" + +#: ../src/viktrwlayer.c:471 +#, fuzzy +msgid "Splitter" +msgstr "Dela här" + +#: ../src/viktrwlayer.c:482 +msgid "_Edit Waypoint" +msgstr "" + +#: ../src/viktrwlayer.c:482 +msgid "Edit Waypoint" +msgstr "Redigera waypoint" + +#: ../src/viktrwlayer.c:495 +msgid "Edit Trac_kpoint" +msgstr "" + +#: ../src/viktrwlayer.c:495 +msgid "Edit Trackpoint" +msgstr "Redigera trackpoint" + +#. a pixbuf for this one is already made globally available +#: ../src/viktrwlayer.c:508 +msgid "Show P_icture" +msgstr "" + +#: ../src/viktrwlayer.c:508 +msgid "Show Picture" +msgstr "Visa Bild" + +#: ../src/viktrwlayer.c:531 +msgid "Waypoint Images" +msgstr "Waypoint bilder" + +#: ../src/viktrwlayer.c:531 +msgid "Tracks Advanced" +msgstr "" + +#: ../src/viktrwlayer.c:531 +msgid "Metadata" +msgstr "" + +#: ../src/viktrwlayer.c:531 +msgid "Filesystem" +msgstr "" + +#: ../src/viktrwlayer.c:534 +msgid "Draw by Track" +msgstr "" + +#: ../src/viktrwlayer.c:534 +msgid "Draw by Speed" +msgstr "" + +#: ../src/viktrwlayer.c:534 +msgid "All Tracks Same Color" +msgstr "" + +#: ../src/viktrwlayer.c:535 +msgid "Filled Square" +msgstr "Fylld ruta" + +#: ../src/viktrwlayer.c:535 +msgid "Square" +msgstr "Kvadrat" + +#: ../src/viktrwlayer.c:535 +msgid "Circle" +msgstr "Cirkel" + +#: ../src/viktrwlayer.c:535 +msgid "X" +msgstr "X" + +#: ../src/viktrwlayer.c:561 +msgid "Extra Extra Small" +msgstr "" + +#: ../src/viktrwlayer.c:562 +msgid "Extra Small" +msgstr "" + +#: ../src/viktrwlayer.c:566 +msgid "Extra Large" +msgstr "" + +#: ../src/viktrwlayer.c:567 +msgid "Extra Extra Large" +msgstr "" + +#: ../src/viktrwlayer.c:573 +msgid "Name Ascending" +msgstr "" + +#: ../src/viktrwlayer.c:574 +msgid "Name Descending" +msgstr "" + +#: ../src/viktrwlayer.c:582 ../src/viktrwlayer_propwin.c:3319 +msgid "No" +msgstr "" + +#: ../src/viktrwlayer.c:583 +msgid "Yes" +msgstr "" + +#: ../src/viktrwlayer.c:584 +msgid "No write" +msgstr "" + +#: ../src/viktrwlayer.c:649 ../src/viktrwlayer.c:673 +msgid "Draw Labels" +msgstr "" + +#: ../src/viktrwlayer.c:650 +msgid "Note: the individual track controls what labels may be displayed" +msgstr "" + +#: ../src/viktrwlayer.c:651 +msgid "Track Labels Font Size:" +msgstr "" + +#: ../src/viktrwlayer.c:652 +msgid "Track Drawing Mode:" +msgstr "" + +#: ../src/viktrwlayer.c:653 +msgid "All Tracks Color:" +msgstr "" + +#: ../src/viktrwlayer.c:654 +msgid "The color used when 'All Tracks Same Color' drawing mode is selected" +msgstr "" + +#: ../src/viktrwlayer.c:655 +msgid "Draw Track Lines" +msgstr "" + +#: ../src/viktrwlayer.c:656 +msgid "Track Thickness:" +msgstr "" + +#: ../src/viktrwlayer.c:657 +msgid "Draw Track Direction" +msgstr "" + +#: ../src/viktrwlayer.c:658 +msgid "Direction Size:" +msgstr "" + +#: ../src/viktrwlayer.c:659 +msgid "Draw Trackpoints" +msgstr "" + +#: ../src/viktrwlayer.c:660 +msgid "Trackpoint Size:" +msgstr "" + +#: ../src/viktrwlayer.c:661 +msgid "Draw Elevation" +msgstr "" + +#: ../src/viktrwlayer.c:662 +msgid "Draw Elevation Height %:" +msgstr "" + +#: ../src/viktrwlayer.c:663 +msgid "Draw Stops" +msgstr "" + +#: ../src/viktrwlayer.c:664 +msgid "" +"Whether to draw a marker when trackpoints are at the same position but over " +"the minimum stop length apart in time" +msgstr "" + +#: ../src/viktrwlayer.c:665 +msgid "Min Stop Length (seconds):" +msgstr "" + +#: ../src/viktrwlayer.c:667 +msgid "Track BG Thickness:" +msgstr "" + +#: ../src/viktrwlayer.c:668 +msgid "Track Background Color" +msgstr "" + +#: ../src/viktrwlayer.c:669 +msgid "Draw by Speed Factor (%):" +msgstr "" + +#: ../src/viktrwlayer.c:670 +msgid "" +"The percentage factor away from the average speed determining the color used" +msgstr "" + +#: ../src/viktrwlayer.c:671 +msgid "Track Sort Order:" +msgstr "" + +#: ../src/viktrwlayer.c:674 +msgid "Waypoint Font Size:" +msgstr "" + +#: ../src/viktrwlayer.c:675 +msgid "Waypoint Color:" +msgstr "Waypoint färg:" + +#: ../src/viktrwlayer.c:676 +msgid "Waypoint Text:" +msgstr "Waypoint text:" + +#: ../src/viktrwlayer.c:677 +msgid "Background:" +msgstr "Bakgrund:" + +#: ../src/viktrwlayer.c:678 +msgid "Fake BG Color Translucency:" +msgstr "" + +#: ../src/viktrwlayer.c:679 +msgid "Waypoint marker:" +msgstr "Waypoint markör:" + +#: ../src/viktrwlayer.c:680 +msgid "Waypoint size:" +msgstr "Waypoint storlek:" + +#: ../src/viktrwlayer.c:681 +msgid "Draw Waypoint Symbols:" +msgstr "" + +#: ../src/viktrwlayer.c:682 +msgid "Waypoint Sort Order:" +msgstr "" + +#: ../src/viktrwlayer.c:684 +msgid "Draw Waypoint Images" +msgstr "" + +#: ../src/viktrwlayer.c:685 +msgid "Image Size (pixels):" +msgstr "Bildstorlek (pixlar):" + +#: ../src/viktrwlayer.c:686 +msgid "Image Alpha:" +msgstr "" + +#: ../src/viktrwlayer.c:687 +msgid "Image Memory Cache Size:" +msgstr "" + +#: ../src/viktrwlayer.c:690 +msgid "Author" +msgstr "" + +#: ../src/viktrwlayer.c:691 +msgid "Creation Time" +msgstr "" + +#: ../src/viktrwlayer.c:692 +msgid "Keywords" +msgstr "" + +#: ../src/viktrwlayer.c:693 +msgid "External layer:" +msgstr "" + +#: ../src/viktrwlayer.c:693 +msgid "" +"Layer data stored in the Viking file, in an external file, or in an external " +"file but changes are not written to the file (file only loaded at startup)" +msgstr "" + +#: ../src/viktrwlayer.c:694 +msgid "Save layer as:" +msgstr "" + +#: ../src/viktrwlayer.c:694 +msgid "Specify where layer should be saved. Overwrites file if it exists." +msgstr "" + +#: ../src/viktrwlayer.c:798 +msgid "TrackWaypoint" +msgstr "" + +#: ../src/viktrwlayer.c:1999 ../src/viktrwlayer_propwin.c:1469 +#: ../src/viktrwlayer_propwin.c:1471 ../src/vikutils.c:299 +#: ../src/vikutils.c:326 +msgid "miles" +msgstr "" + +#: ../src/viktrwlayer.c:2002 ../src/viktrwlayer_propwin.c:1475 +#: ../src/viktrwlayer_propwin.c:1477 ../src/vikutils.c:303 +#: ../src/vikutils.c:330 +msgid "NM" +msgstr "" + +#. VIK_UNITS_DISTANCE_KILOMETRES: +#: ../src/viktrwlayer.c:2006 ../src/viktrwlayer_propwin.c:1482 +#: ../src/viktrwlayer_propwin.c:1484 ../src/vikutils.c:308 +#: ../src/vikutils.c:335 +msgid "km" +msgstr "" + +#: ../src/viktrwlayer.c:2121 +msgid "start/end" +msgstr "" + +#: ../src/viktrwlayer.c:2133 +msgid "start" +msgstr "" + +#: ../src/viktrwlayer.c:2142 +msgid "end" +msgstr "" + +#: ../src/viktrwlayer.c:3103 +#, c-format +msgid " in %d:%02d hrs:mins" +msgstr "" + +#: ../src/viktrwlayer.c:3107 +#, c-format +msgid "" +"\n" +"%sTotal Length %.1f %s%s" +msgstr "" + +#: ../src/viktrwlayer.c:3131 +#, c-format +msgid "" +"\n" +"Total route length %.1f %s" +msgstr "" + +#: ../src/viktrwlayer.c:3136 +#, c-format +msgid "Tracks: %d - Waypoints: %d - Routes: %d%s%s" +msgstr "" + +#: ../src/viktrwlayer.c:3155 +#, c-format +msgid "Tracks: %d" +msgstr "" + +#: ../src/viktrwlayer.c:3165 +#, c-format +msgid "Routes: %d" +msgstr "" + +#: ../src/viktrwlayer.c:3195 +#, c-format +msgid "- %d:%02d hrs:mins" +msgstr "" + +#: ../src/viktrwlayer.c:3202 +#, c-format +msgid "%s%.1f km %s" +msgstr "" + +#: ../src/viktrwlayer.c:3205 +#, c-format +msgid "%s%.1f miles %s" +msgstr "" + +#: ../src/viktrwlayer.c:3208 +#, c-format +msgid "%s%.1f NM %s" +msgstr "" + +#: ../src/viktrwlayer.c:3222 +#, c-format +msgid "Waypoints: %d" +msgstr "" + +#: ../src/viktrwlayer.c:3279 +#, c-format +msgid "Wpt: Alt %dft" +msgstr "" + +#. VIK_UNITS_HEIGHT_METRES: +#: ../src/viktrwlayer.c:3283 +#, c-format +msgid "Wpt: Alt %dm" +msgstr "" + +#. Add comment if available +#: ../src/viktrwlayer.c:3298 +#, c-format +msgid "%s | %s %s | Comment: %s" +msgstr "" + +#: ../src/viktrwlayer.c:3300 +#, c-format +msgid "%s | %s %s" +msgstr "" + +#: ../src/viktrwlayer.c:3562 ../src/viktrwlayer.c:3591 +msgid "This layer has no waypoints or trackpoints." +msgstr "Detta lager har inga waypoints eller trackpoints." + +#: ../src/viktrwlayer.c:3598 ../src/viktrwlayer.c:3607 +#: ../src/viktrwlayer.c:3616 ../src/viktrwlayer.c:3625 +#: ../src/viktrwlayer.c:3634 ../src/viktrwlayer.c:3642 +msgid "Export Layer" +msgstr "Exportera lager" + +#: ../src/viktrwlayer.c:3671 +msgid "Export Route as GPX" +msgstr "" + +#: ../src/viktrwlayer.c:3673 +msgid "Export Track as GPX" +msgstr "" + +#: ../src/viktrwlayer.c:3693 +msgid "Find" +msgstr "" + +#: ../src/viktrwlayer.c:3703 +msgid "Waypoint Name:" +msgstr "Waypoint namn:" + +#: ../src/viktrwlayer.c:3720 +msgid "Waypoint not found in this layer." +msgstr "Waypoint hittades inte i detta lager." + +#: ../src/viktrwlayer.c:3989 +msgid "Can not upload invisible track." +msgstr "" + +#: ../src/viktrwlayer.c:4082 ../src/viktrwlayer.c:10512 +msgid "Track" +msgstr "" + +#: ../src/viktrwlayer.c:4107 ../src/viktrwlayer.c:10599 +msgid "Route" +msgstr "" + +#: ../src/viktrwlayer.c:4194 +msgid "Externa_l" +msgstr "" + +#: ../src/viktrwlayer.c:4216 ../src/viktrwlayer.c:8456 +#: ../src/viktrwlayer.c:8574 +msgid "_Finish Route" +msgstr "" + +#: ../src/viktrwlayer.c:4218 ../src/viktrwlayer.c:8380 +#: ../src/viktrwlayer.c:8572 +msgid "_Finish Track" +msgstr "" + +#. Now with icons +#: ../src/viktrwlayer.c:4230 +msgid "_View Layer" +msgstr "" + +#: ../src/viktrwlayer.c:4237 +msgid "V_iew" +msgstr "" + +#: ../src/viktrwlayer.c:4243 +msgid "View All _Tracks" +msgstr "" + +#: ../src/viktrwlayer.c:4248 +msgid "View All _Routes" +msgstr "" + +#: ../src/viktrwlayer.c:4253 +msgid "View All _Waypoints" +msgstr "" + +#: ../src/viktrwlayer.c:4258 +msgid "_Goto Center of Layer" +msgstr "" + +#: ../src/viktrwlayer.c:4264 ../src/viktrwlayer.c:8321 +msgid "Goto _Waypoint..." +msgstr "" + +#: ../src/viktrwlayer.c:4270 +msgid "_Export Layer" +msgstr "" + +#: ../src/viktrwlayer.c:4276 +msgid "Export as GPS_Point..." +msgstr "" + +#: ../src/viktrwlayer.c:4281 +msgid "Export as GPS_Mapper..." +msgstr "" + +#: ../src/viktrwlayer.c:4286 +msgid "Export as _GPX..." +msgstr "" + +#: ../src/viktrwlayer.c:4292 +msgid "Export as _KML..." +msgstr "" + +#: ../src/viktrwlayer.c:4299 +msgid "Export as GEO_JSON..." +msgstr "" + +#: ../src/viktrwlayer.c:4306 +msgid "Export via GPSbabel..." +msgstr "" + +#: ../src/viktrwlayer.c:4312 +#, c-format +msgid "Open with External Program_1: %s" +msgstr "" + +#: ../src/viktrwlayer.c:4319 +#, c-format +msgid "Open with External Program_2: %s" +msgstr "" + +#: ../src/viktrwlayer.c:4327 ../src/vikwindow.c:4825 +msgid "_New" +msgstr "_Ny" + +#: ../src/viktrwlayer.c:4333 +msgid "New _Waypoint..." +msgstr "" + +#: ../src/viktrwlayer.c:4339 +msgid "New _Track" +msgstr "" + +#: ../src/viktrwlayer.c:4347 +msgid "New _Route" +msgstr "" + +#: ../src/viktrwlayer.c:4356 ../src/viktrwlayer.c:8232 +#: ../src/viktrwlayer.c:9003 +msgid "Geotag _Images..." +msgstr "" + +#: ../src/viktrwlayer.c:4363 +msgid "_Acquire" +msgstr "" + +#: ../src/viktrwlayer.c:4369 ../src/vikwindow.c:4904 +msgid "From _GPS..." +msgstr "Från _GPS..." + +#. FIXME: only add menu when at least a routing engine has support for Directions +#: ../src/viktrwlayer.c:4375 +msgid "From _Directions..." +msgstr "" + +#: ../src/viktrwlayer.c:4381 +msgid "From _OSM Traces..." +msgstr "" + +#: ../src/viktrwlayer.c:4386 +msgid "From _My OSM Traces..." +msgstr "" + +#: ../src/viktrwlayer.c:4392 ../src/vikwindow.c:4844 +msgid "From _URL..." +msgstr "" + +#: ../src/viktrwlayer.c:4399 ../src/vikwindow.c:4846 +msgid "From _Wikipedia Waypoints" +msgstr "" + +#: ../src/viktrwlayer.c:4405 +msgid "Within _Layer Bounds" +msgstr "" + +#: ../src/viktrwlayer.c:4411 +msgid "Within _Current View" +msgstr "" + +#: ../src/viktrwlayer.c:4419 +msgid "From Geo_caching..." +msgstr "" + +#: ../src/viktrwlayer.c:4426 ../src/vikwindow.c:4842 +msgid "From Geotagged _Images..." +msgstr "" + +#: ../src/viktrwlayer.c:4433 +msgid "From _File..." +msgstr "" + +#: ../src/viktrwlayer.c:4436 ../src/vikwindow.c:4905 +msgid "Import File With GPS_Babel..." +msgstr "" + +#: ../src/viktrwlayer.c:4443 ../src/viktrwlayer.c:8905 +msgid "_Upload" +msgstr "" + +#: ../src/viktrwlayer.c:4449 +msgid "Upload to _GPS..." +msgstr "" + +#: ../src/viktrwlayer.c:4456 ../src/viktrwlayer.c:8973 +msgid "Upload to _OSM..." +msgstr "" + +#: ../src/viktrwlayer.c:4464 +msgid "De_lete" +msgstr "" + +#: ../src/viktrwlayer.c:4470 +msgid "Delete All _Tracks" +msgstr "" + +#: ../src/viktrwlayer.c:4477 +msgid "Delete Tracks _From Selection..." +msgstr "" + +#: ../src/viktrwlayer.c:4484 ../src/viktrwlayer.c:8481 +msgid "Delete _All Routes" +msgstr "" + +#: ../src/viktrwlayer.c:4491 ../src/viktrwlayer.c:8487 +msgid "_Delete Routes From Selection..." +msgstr "" + +#: ../src/viktrwlayer.c:4498 +msgid "Delete All _Waypoints" +msgstr "" + +#: ../src/viktrwlayer.c:4505 +msgid "Delete Waypoints From _Selection..." +msgstr "" + +#: ../src/viktrwlayer.c:4512 ../src/viktrwlayer.c:8339 +#, fuzzy +msgid "Delete Duplicate Waypoints" +msgstr "Ta bort dubbla Waypoints" + +#: ../src/viktrwlayer.c:5198 +#, c-format +msgid "Are you sure you want to delete all tracks in %s?" +msgstr "" + +#: ../src/viktrwlayer.c:5211 +#, c-format +msgid "Are you sure you want to delete all routes in %s?" +msgstr "" + +#: ../src/viktrwlayer.c:5221 +#, c-format +msgid "Are you sure you want to delete all waypoints in %s?" +msgstr "" + +#: ../src/viktrwlayer.c:5238 +#, c-format +msgid "Are you sure you want to delete the waypoint \"%s\"?" +msgstr "" + +#: ../src/viktrwlayer.c:5254 +#, c-format +msgid "Are you sure you want to delete the track \"%s\"?" +msgstr "" + +#: ../src/viktrwlayer.c:5271 +#, c-format +msgid "Are you sure you want to delete the route \"%s\"?" +msgstr "" + +#: ../src/viktrwlayer.c:5527 ../src/viktrwlayer.c:6373 +msgid "" +"Converting a track to a route removes extra track data such as segments, " +"timestamps, etc...\n" +"Do you want to continue?" +msgstr "" + +#: ../src/viktrwlayer.c:5631 +msgid "No DEM layers available, thus no DEM values can be applied." +msgstr "" + +#: ../src/viktrwlayer.c:5651 ../src/viktrwlayer.c:5692 +#, c-format +msgid "%ld point adjusted" +msgid_plural "%ld points adjusted" +msgstr[0] "" +msgstr[1] "" + +#: ../src/viktrwlayer.c:5736 +#, c-format +msgid "%ld waypoint changed" +msgid_plural "%ld waypoints changed" +msgstr[0] "" +msgstr[1] "" + +#: ../src/viktrwlayer.c:5917 +#, c-format +msgid "" +"Refining a track with many points (%d) is unlikely to yield sensible " +"results. Do you want to Continue?" +msgstr "" + +#. Select engine from dialog +#: ../src/viktrwlayer.c:5925 +msgid "Refine Route with Routing Engine..." +msgstr "" + +#: ../src/viktrwlayer.c:5933 +msgid "Select routing engine" +msgstr "" + +#: ../src/viktrwlayer.c:6158 +msgid "Failed. No other tracks with timestamps in this layer found" +msgstr "" + +#: ../src/viktrwlayer.c:6160 +msgid "Failed. No other tracks without timestamps in this layer found" +msgstr "" + +#: ../src/viktrwlayer.c:6179 +msgid "Merge with..." +msgstr "" + +#: ../src/viktrwlayer.c:6180 +msgid "Select route to merge with" +msgstr "" + +#: ../src/viktrwlayer.c:6180 +msgid "Select track to merge with" +msgstr "" + +#: ../src/viktrwlayer.c:6264 ../src/viktrwlayer.c:6346 +msgid "Append Route" +msgstr "" + +#: ../src/viktrwlayer.c:6264 ../src/viktrwlayer.c:6346 +msgid "Append Track" +msgstr "" + +#: ../src/viktrwlayer.c:6265 +msgid "Select the route to append after the current route" +msgstr "" + +#: ../src/viktrwlayer.c:6266 +msgid "Select the track to append after the current track" +msgstr "" + +#: ../src/viktrwlayer.c:6347 +msgid "Select the track to append after the current route" +msgstr "" + +#: ../src/viktrwlayer.c:6348 +msgid "Select the route to append after the current track" +msgstr "" + +#: ../src/viktrwlayer.c:6414 +#, c-format +msgid "%d segment merged" +msgid_plural "%d segments merged" +msgstr[0] "" +msgstr[1] "" + +#: ../src/viktrwlayer.c:6430 +msgid "Failed. This track does not have timestamp" +msgstr "" + +#: ../src/viktrwlayer.c:6442 +msgid "Failed. No other track in this layer has timestamp" +msgstr "" + +#: ../src/viktrwlayer.c:6449 +msgid "Merge Threshold..." +msgstr "" + +#: ../src/viktrwlayer.c:6450 +msgid "Merge when time between tracks less than:" +msgstr "" + +#: ../src/viktrwlayer.c:6580 +msgid "Split Threshold..." +msgstr "" + +#: ../src/viktrwlayer.c:6581 +msgid "Split when time between trackpoints exceeds:" +msgstr "" + +#: ../src/viktrwlayer.c:6598 +#, c-format +msgid "" +"Can not split track due to trackpoints not ordered in time - such as at %s.\n" +"\n" +"Goto this trackpoint?" +msgstr "" + +#: ../src/viktrwlayer.c:6668 +msgid "Split Every Nth Point" +msgstr "" + +#: ../src/viktrwlayer.c:6669 +msgid "Split on every Nth point:" +msgstr "" + +#: ../src/viktrwlayer.c:6779 +msgid "Can not split track as it has no segments" +msgstr "" + +#: ../src/viktrwlayer.c:6861 ../src/viktrwlayer.c:6891 +#, c-format +msgid "Deleted %ld point" +msgid_plural "Deleted %ld points" +msgstr[0] "" +msgstr[1] "" + +#: ../src/viktrwlayer.c:6966 ../src/viktrwlayer.c:10989 +#: ../src/viktrwlayer_waypointlist.c:214 +#, c-format +msgid "Could not launch %s to open file." +msgstr "" + +#: ../src/viktrwlayer.c:6992 ../src/viktrwlayer.c:7113 +msgid "This track has no date information." +msgstr "" + +#: ../src/viktrwlayer.c:7006 ../src/viktrwlayer.c:7136 +msgid "This waypoint has no date information." +msgstr "" + +#: ../src/viktrwlayer.c:7030 +#, c-format +msgid "Could not launch %s" +msgstr "" + +#: ../src/viktrwlayer.c:7269 +msgid "Internal Error in vik_trw_layer_uniquify_tracks" +msgstr "" + +#: ../src/viktrwlayer.c:7374 ../src/viktrwlayer.c:7424 +#: ../src/viktrwlayer.c:7587 +msgid "" +"Multiple entries with the same name exist. This method only works with " +"unique names. Force unique names now?" +msgstr "" + +#: ../src/viktrwlayer.c:7385 +msgid "No tracks found" +msgstr "" + +#: ../src/viktrwlayer.c:7393 ../src/viktrwlayer.c:7443 +#: ../src/viktrwlayer.c:7607 +msgid "Delete Selection" +msgstr "" + +#: ../src/viktrwlayer.c:7394 +msgid "Select tracks to delete" +msgstr "" + +#: ../src/viktrwlayer.c:7435 +msgid "No routes found" +msgstr "" + +#: ../src/viktrwlayer.c:7444 +msgid "Select routes to delete" +msgstr "" + +#: ../src/viktrwlayer.c:7550 +msgid "Internal Error in vik_trw_layer_uniquify_waypoints" +msgstr "" + +#: ../src/viktrwlayer.c:7597 +msgid "No waypoints found" +msgstr "" + +#: ../src/viktrwlayer.c:7608 +msgid "Select waypoints to delete" +msgstr "" + +#: ../src/viktrwlayer.c:7691 +#, c-format +msgid "%ld waypoint deleted" +msgid_plural "%ld waypoints deleted" +msgstr[0] "" +msgstr[1] "" + +#: ../src/viktrwlayer.c:7697 +#, fuzzy +msgid "No duplicates found" +msgstr "Inga inlägg hittades!" + +#: ../src/viktrwlayer.c:8028 +#, c-format +msgid "" +"A waypoint with the name \"%s\" already exists. Really rename to the same " +"name?" +msgstr "" + +#: ../src/viktrwlayer.c:8058 +#, c-format +msgid "" +"A track with the name \"%s\" already exists. Really rename to the same name?" +msgstr "" + +#: ../src/viktrwlayer.c:8095 +#, c-format +msgid "" +"A route with the name \"%s\" already exists. Really rename to the same name?" +msgstr "" + +#: ../src/viktrwlayer.c:8215 ../src/viktrwlayer.c:8602 +msgid "_Goto" +msgstr "" + +#: ../src/viktrwlayer.c:8226 +msgid "_Visit Geocache Webpage" +msgstr "" + +#: ../src/viktrwlayer.c:8235 +msgid "Geotag multiple images against this waypoint" +msgstr "" + +#: ../src/viktrwlayer.c:8245 ../src/viktrwlayer_waypointlist.c:352 +msgid "_Show Picture..." +msgstr "" + +#: ../src/viktrwlayer.c:8253 +msgid "Update Geotag on _Image" +msgstr "" + +#: ../src/viktrwlayer.c:8259 +msgid "_Update" +msgstr "" + +#: ../src/viktrwlayer.c:8264 +msgid "Update and _Keep File Timestamp" +msgstr "" + +#: ../src/viktrwlayer.c:8276 +msgid "Visit _Webpage" +msgstr "" + +#: ../src/viktrwlayer.c:8306 +msgid "_New Waypoint..." +msgstr "" + +#: ../src/viktrwlayer.c:8315 +msgid "_View All Waypoints" +msgstr "" + +#: ../src/viktrwlayer.c:8327 +msgid "Delete _All Waypoints" +msgstr "" + +#: ../src/viktrwlayer.c:8333 +msgid "_Delete Waypoints From Selection..." +msgstr "" + +#: ../src/viktrwlayer.c:8351 +msgid "_Show All Waypoints" +msgstr "" + +#: ../src/viktrwlayer.c:8357 +msgid "_Hide All Waypoints" +msgstr "" + +#: ../src/viktrwlayer.c:8369 +msgid "_List Waypoints..." +msgstr "" + +#: ../src/viktrwlayer.c:8390 +msgid "_View All Tracks" +msgstr "" + +#: ../src/viktrwlayer.c:8396 +msgid "_New Track" +msgstr "" + +#: ../src/viktrwlayer.c:8404 +msgid "Delete _All Tracks" +msgstr "" + +#: ../src/viktrwlayer.c:8410 +msgid "_Delete Tracks From Selection..." +msgstr "" + +#: ../src/viktrwlayer.c:8422 +msgid "_Show All Tracks" +msgstr "" + +#: ../src/viktrwlayer.c:8428 +msgid "_Hide All Tracks" +msgstr "" + +#: ../src/viktrwlayer.c:8439 +msgid "_List Tracks..." +msgstr "" + +#: ../src/viktrwlayer.c:8467 +msgid "_View All Routes" +msgstr "" + +#: ../src/viktrwlayer.c:8473 +msgid "_New Route" +msgstr "" + +#: ../src/viktrwlayer.c:8499 +msgid "_Show All Routes" +msgstr "" + +#: ../src/viktrwlayer.c:8505 +msgid "_Hide All Routes" +msgstr "" + +#: ../src/viktrwlayer.c:8516 +msgid "_List Routes..." +msgstr "" + +#: ../src/viktrwlayer.c:8587 +msgid "_View Track" +msgstr "" + +#: ../src/viktrwlayer.c:8589 +msgid "_View Route" +msgstr "" + +#: ../src/viktrwlayer.c:8608 +msgid "_Startpoint" +msgstr "" + +#: ../src/viktrwlayer.c:8614 +msgid "\"_Center\"" +msgstr "" + +#: ../src/viktrwlayer.c:8620 +msgid "_Endpoint" +msgstr "" + +#: ../src/viktrwlayer.c:8626 +msgid "_Highest Altitude" +msgstr "" + +#: ../src/viktrwlayer.c:8632 +msgid "_Lowest Altitude" +msgstr "" + +#: ../src/viktrwlayer.c:8640 +msgid "_Maximum Speed" +msgstr "" + +#: ../src/viktrwlayer.c:8646 +msgid "_Date" +msgstr "" + +#: ../src/viktrwlayer.c:8655 +msgid "Co_mbine" +msgstr "" + +#: ../src/viktrwlayer.c:8663 +msgid "_Merge By Time..." +msgstr "" + +#: ../src/viktrwlayer.c:8668 +msgid "Merge _Segments" +msgstr "" + +#: ../src/viktrwlayer.c:8675 +msgid "Merge _With Other Tracks..." +msgstr "" + +#: ../src/viktrwlayer.c:8682 +msgid "_Append Track..." +msgstr "" + +#: ../src/viktrwlayer.c:8684 +msgid "_Append Route..." +msgstr "" + +#: ../src/viktrwlayer.c:8690 +msgid "Append _Route..." +msgstr "" + +#: ../src/viktrwlayer.c:8692 +msgid "Append _Track..." +msgstr "" + +#: ../src/viktrwlayer.c:8699 +msgid "_Split" +msgstr "" + +#: ../src/viktrwlayer.c:8707 +msgid "_Split By Time..." +msgstr "" + +#. ATM always enable this entry - don't want to have to analyse the track before displaying the menu - to keep the menu speedy +#: ../src/viktrwlayer.c:8713 +msgid "Split Se_gments" +msgstr "" + +#: ../src/viktrwlayer.c:8719 +msgid "Split By _Number of Points..." +msgstr "" + +#: ../src/viktrwlayer.c:8724 +msgid "Split at _Trackpoint" +msgstr "" + +#: ../src/viktrwlayer.c:8732 +msgid "_Insert Points" +msgstr "" + +#: ../src/viktrwlayer.c:8738 +msgid "Insert Point _Before Selected Point" +msgstr "" + +#: ../src/viktrwlayer.c:8745 +msgid "Insert Point _After Selected Point" +msgstr "" + +#: ../src/viktrwlayer.c:8754 +msgid "Delete Poi_nts" +msgstr "" + +#: ../src/viktrwlayer.c:8760 +msgid "Delete _Selected Point" +msgstr "" + +#: ../src/viktrwlayer.c:8768 +msgid "Delete Points With The Same _Position" +msgstr "" + +#: ../src/viktrwlayer.c:8773 +msgid "Delete Points With The Same _Time" +msgstr "" + +#: ../src/viktrwlayer.c:8780 ../src/viktrwlayer.c:9029 +msgid "_Transform" +msgstr "" + +#: ../src/viktrwlayer.c:8788 ../src/viktrwlayer.c:9037 +msgid "_Apply DEM Data" +msgstr "" + +#: ../src/viktrwlayer.c:8793 ../src/viktrwlayer.c:9042 +msgid "_Overwrite" +msgstr "" + +#: ../src/viktrwlayer.c:8796 ../src/viktrwlayer.c:9045 +msgid "Overwrite any existing elevation values with DEM values" +msgstr "" + +#: ../src/viktrwlayer.c:8799 ../src/viktrwlayer.c:9048 +msgid "_Keep Existing" +msgstr "" + +#: ../src/viktrwlayer.c:8802 ../src/viktrwlayer.c:9051 +msgid "Keep existing elevation values, only attempt for missing values" +msgstr "" + +#: ../src/viktrwlayer.c:8807 +msgid "_Smooth Missing Elevation Data" +msgstr "" + +#: ../src/viktrwlayer.c:8812 +msgid "_Interpolated" +msgstr "" + +#: ../src/viktrwlayer.c:8815 +msgid "" +"Interpolate between known elevation values to derive values for the missing " +"elevations" +msgstr "" + +#: ../src/viktrwlayer.c:8818 +msgid "_Flat" +msgstr "" + +#: ../src/viktrwlayer.c:8821 +msgid "Set unknown elevation values to the last known value" +msgstr "" + +#: ../src/viktrwlayer.c:8825 +msgid "C_onvert to a Route" +msgstr "" + +#: ../src/viktrwlayer.c:8827 +msgid "C_onvert to a Track" +msgstr "" + +#: ../src/viktrwlayer.c:8835 +msgid "_Anonymize Times" +msgstr "" + +#: ../src/viktrwlayer.c:8838 +msgid "Shift timestamps to a relative offset from 1901-01-01" +msgstr "" + +#: ../src/viktrwlayer.c:8841 +msgid "_Interpolate Times" +msgstr "" + +#: ../src/viktrwlayer.c:8844 +msgid "" +"Reset trackpoint timestamps between the first and last points such that " +"track is traveled at equal speed" +msgstr "" + +#: ../src/viktrwlayer.c:8849 +msgid "_Reverse Track" +msgstr "" + +#: ../src/viktrwlayer.c:8851 +msgid "_Reverse Route" +msgstr "" + +#: ../src/viktrwlayer.c:8858 +msgid "Refine Route..." +msgstr "" + +#: ../src/viktrwlayer.c:8868 +msgid "Down_load Maps Along Track..." +msgstr "" + +#: ../src/viktrwlayer.c:8870 +msgid "Down_load Maps Along Route..." +msgstr "" + +#: ../src/viktrwlayer.c:8878 +msgid "_Export Track as GPX..." +msgstr "" + +#: ../src/viktrwlayer.c:8880 +msgid "_Export Route as GPX..." +msgstr "" + +#: ../src/viktrwlayer.c:8887 +msgid "E_xtend Track End" +msgstr "" + +#: ../src/viktrwlayer.c:8889 +msgid "E_xtend Route End" +msgstr "" + +#: ../src/viktrwlayer.c:8896 +msgid "Extend _Using Route Finder" +msgstr "" + +#: ../src/viktrwlayer.c:8911 +msgid "_Upload to GPS..." +msgstr "" + +#: ../src/viktrwlayer.c:8926 +msgid "_Diary" +msgstr "" + +#: ../src/viktrwlayer.c:8930 +msgid "Open diary program at this date" +msgstr "" + +#: ../src/viktrwlayer.c:8935 +msgid "_Astronomy" +msgstr "" + +#: ../src/viktrwlayer.c:8938 +msgid "Open astronomy program at this date and location" +msgstr "" + +#: ../src/viktrwlayer.c:8962 +msgid "_View Google Directions" +msgstr "" + +#: ../src/viktrwlayer.c:8984 +msgid "Use with _Filter" +msgstr "" + +#: ../src/viktrwlayer.c:9018 +msgid "_Edit Trackpoint" +msgstr "" + +#: ../src/viktrwlayer.c:10116 +#, c-format +msgid " - Gain %dm:Loss %dm" +msgstr "" + +#: ../src/viktrwlayer.c:10118 +#, c-format +msgid " - Gain %dft:Loss %dft" +msgstr "" + +#: ../src/viktrwlayer.c:10123 +#, c-format +msgid " - Bearing %3.1f° - Step %s" +msgstr "" + +#: ../src/viktrwlayer.c:10232 +#, c-format +msgid "Querying %s for route between (%.3f, %.3f) and (%.3f, %.3f)." +msgstr "" + +#: ../src/viktrwlayer.c:10248 +#, c-format +msgid "%s returned route between (%.3f, %.3f) and (%.3f, %.3f)." +msgstr "" + +#: ../src/viktrwlayer.c:10251 +#, c-format +msgid "Error getting route from %s." +msgstr "" + +#: ../src/viktrwlayer.c:11070 +#, c-format +msgid "Creating %d Image Thumbnails..." +msgstr "" + +#: ../src/viktrwlayer.c:11560 +msgid "No map layer in use. Create one first" +msgstr "" + +#: ../src/viktrwlayer.c:11679 +#, c-format +msgid "%s: Track List" +msgstr "" + +#: ../src/viktrwlayer.c:11681 +#, c-format +msgid "%s: Route List" +msgstr "" + +#: ../src/viktrwlayer.c:11734 +#, c-format +msgid "" +"Could not write external layer %s to %s, please fix and save before exiting " +"or data will be lost" +msgstr "" + +#: ../src/viktrwlayer.c:11782 +#, c-format +msgid "WARNING: issues encountered loading external layer %s from %s" +msgstr "" + +#: ../src/viktrwlayer_export.c:47 +msgid "Auto Device GPX Simplify:" +msgstr "" + +#: ../src/viktrwlayer_export.c:48 +msgid "" +"GPX saves to certain devices will be simplified for device compatibility." +msgstr "" + +#: ../src/viktrwlayer_export.c:125 +#, c-format +msgid "Export of GPX file simplified using point limit: %d" +msgstr "" + +#: ../src/viktrwlayer_export.c:206 ../src/viktrwlayer_export.c:323 +#: ../src/vikwindow.c:3694 +msgid "The filename you requested could not be opened for writing." +msgstr "" + +#: ../src/viktrwlayer_export.c:226 +#, c-format +msgid "Could not launch %s." +msgstr "" + +#: ../src/viktrwlayer_export.c:234 +msgid "Could not create temporary file for export." +msgstr "" + +#: ../src/viktrwlayer_export.c:268 +msgid "File format:" +msgstr "" + +#: ../src/viktrwlayer_export.c:276 +msgid "Select the file format." +msgstr "" + +#: ../src/viktrwlayer_export.c:281 +msgid "" +"Select the information to process.\n" +"Warning: the behavior of these switches is highly dependent of the file " +"format selected.\n" +"Please, refer to GPSbabel if unsure." +msgstr "" + +#: ../src/viktrwlayer_export.c:308 +msgid "You did not select a valid file format." +msgstr "" + +#: ../src/viktrwlayer_propwin.c:915 ../src/viktrwlayer_propwin.c:3381 +#: ../src/viktrwlayer_propwin.c:3417 ../src/viktrwlayer_propwin.c:3457 +#: ../src/viktrwlayer_propwin.c:3509 ../src/viktrwlayer_propwin.c:3527 +#: ../src/viktrwlayer_propwin.c:3600 ../src/viktrwlayer_propwin.c:3601 +#: ../src/viktrwlayer_propwin.c:3602 ../src/viktrwlayer_propwin.c:3611 +#: ../src/viktrwlayer_propwin.c:3612 ../src/viktrwlayer_propwin.c:3629 +#: ../src/viktrwlayer_propwin.c:3630 ../src/viktrwlayer_propwin.c:3644 +#: ../src/viktrwlayer_propwin.c:3645 ../src/viktrwlayer_propwin.c:3646 +#: ../src/viktrwlayer_propwin.c:3660 ../src/viktrwlayer_propwin.c:3661 +#: ../src/viktrwlayer_propwin.c:3662 ../src/viktrwlayer_propwin.c:3676 +#: ../src/viktrwlayer_propwin.c:3677 ../src/viktrwlayer_propwin.c:3678 +#: ../src/viktrwlayer_propwin.c:3695 ../src/viktrwlayer_propwin.c:3696 +#: ../src/viktrwlayer_analysis.c:293 +#, c-format +msgid "No Data" +msgstr "Ingen data" + +#: ../src/viktrwlayer_propwin.c:960 ../src/viktrwlayer_propwin.c:1245 +#, c-format +msgid "%.1f kph" +msgstr "" + +#: ../src/viktrwlayer_propwin.c:963 ../src/viktrwlayer_propwin.c:1248 +#: ../src/viktrwlayer_analysis.c:352 +#, c-format +msgid "%.1f mph" +msgstr "" + +#: ../src/viktrwlayer_propwin.c:966 ../src/viktrwlayer_propwin.c:1251 +#, c-format +msgid "%.1f knots" +msgstr "" + +#: ../src/viktrwlayer_propwin.c:969 ../src/viktrwlayer_propwin.c:1254 +#, c-format +msgid "%.1f s/km" +msgstr "" + +#: ../src/viktrwlayer_propwin.c:972 ../src/viktrwlayer_propwin.c:1257 +#: ../src/viktrwlayer_analysis.c:389 ../src/viktrwlayer_analysis.c:392 +#, fuzzy, c-format +msgid "%.1f min/km" +msgstr "1 min" + +#: ../src/viktrwlayer_propwin.c:975 ../src/viktrwlayer_propwin.c:1260 +#, c-format +msgid "%.1f sec/mi" +msgstr "" + +#: ../src/viktrwlayer_propwin.c:978 ../src/viktrwlayer_propwin.c:1263 +#: ../src/viktrwlayer_analysis.c:409 ../src/viktrwlayer_analysis.c:412 +#, fuzzy, c-format +msgid "%.1f min/mi" +msgstr "1 min" + +#. VIK_UNITS_SPEED_METRES_PER_SECOND: +#: ../src/viktrwlayer_propwin.c:982 ../src/viktrwlayer_propwin.c:1267 +#, c-format +msgid "%.1f m/s" +msgstr "" + +#. Minutes +#: ../src/viktrwlayer_propwin.c:1411 +msgid "mins" +msgstr "" + +#. Hours +#: ../src/viktrwlayer_propwin.c:1418 +msgid "h" +msgstr "" + +#. Days +#: ../src/viktrwlayer_propwin.c:1424 +msgid "d" +msgstr "" + +#. Weeks +#: ../src/viktrwlayer_propwin.c:1429 +msgid "w" +msgstr "" + +#. 'Months' +#: ../src/viktrwlayer_propwin.c:1433 +msgid "M" +msgstr "" + +#: ../src/viktrwlayer_propwin.c:2051 ../src/viktrwlayer_analysis.c:303 +#, c-format +msgid "%.1f miles" +msgstr "" + +#: ../src/viktrwlayer_propwin.c:2054 ../src/viktrwlayer_analysis.c:306 +#, c-format +msgid "%.1f NM" +msgstr "" + +#. VIK_UNITS_DISTANCE_KILOMETRES +#: ../src/viktrwlayer_propwin.c:2057 ../src/viktrwlayer_analysis.c:310 +#, c-format +msgid "%.1f km" +msgstr "" + +#: ../src/viktrwlayer_propwin.c:3083 +msgid "Failed spliting track. Track unchanged" +msgstr "" + +#: ../src/viktrwlayer_propwin.c:3234 ../src/viktrwlayer_propwin.c:3744 +#, c-format +msgid "%s - Track Properties" +msgstr "" + +#: ../src/viktrwlayer_propwin.c:3239 +msgid "Split at _Marker" +msgstr "" + +#: ../src/viktrwlayer_propwin.c:3240 +msgid "Split _Segments" +msgstr "" + +#: ../src/viktrwlayer_propwin.c:3241 +msgid "_Reverse" +msgstr "" + +#: ../src/viktrwlayer_propwin.c:3242 +msgid "_Delete Dupl." +msgstr "" + +#: ../src/viktrwlayer_propwin.c:3269 +msgid "Comment:" +msgstr "Kommentar:" + +#: ../src/viktrwlayer_propwin.c:3270 +msgid "Description:" +msgstr "" + +#: ../src/viktrwlayer_propwin.c:3271 +#, fuzzy +msgid "Source:" +msgstr "Start:" + +#: ../src/viktrwlayer_propwin.c:3272 +#, fuzzy +msgid "Type:" +msgstr "Tid:" + +#: ../src/viktrwlayer_propwin.c:3273 +msgid "Color:" +msgstr "" + +#: ../src/viktrwlayer_propwin.c:3274 +msgid "Draw Name:" +msgstr "" + +#: ../src/viktrwlayer_propwin.c:3275 +msgid "Distance Labels:" +msgstr "" + +#: ../src/viktrwlayer_propwin.c:3278 +msgid "Track Length:" +msgstr "" + +#: ../src/viktrwlayer_propwin.c:3279 +msgid "Trackpoints:" +msgstr "Trackpoints:" + +#: ../src/viktrwlayer_propwin.c:3280 +msgid "Segments:" +msgstr "Segment:" + +#: ../src/viktrwlayer_propwin.c:3281 +msgid "Duplicate Points:" +msgstr "" + +#: ../src/viktrwlayer_propwin.c:3282 +msgid "Max Speed:" +msgstr "Max hastighet:" + +#: ../src/viktrwlayer_propwin.c:3283 +msgid "Avg. Speed:" +msgstr "Medelhastighet:" + +#: ../src/viktrwlayer_propwin.c:3284 +msgid "Moving Avg. Speed:" +msgstr "" + +#: ../src/viktrwlayer_propwin.c:3285 +msgid "Avg. Dist. Between TPs:" +msgstr "" + +#: ../src/viktrwlayer_propwin.c:3286 +msgid "Elevation Range:" +msgstr "" + +#: ../src/viktrwlayer_propwin.c:3287 +msgid "Total Elevation Gain/Loss:" +msgstr "Total höjdskillnad:" + +#: ../src/viktrwlayer_propwin.c:3288 +msgid "Start:" +msgstr "Start:" + +#: ../src/viktrwlayer_propwin.c:3289 +msgid "End:" +msgstr "Slut:" + +#: ../src/viktrwlayer_propwin.c:3290 +msgid "Duration:" +msgstr "" + +#: ../src/viktrwlayer_propwin.c:3320 +msgid "Centre" +msgstr "" + +#: ../src/viktrwlayer_propwin.c:3321 +msgid "Start only" +msgstr "" + +#: ../src/viktrwlayer_propwin.c:3322 +msgid "End only" +msgstr "" + +#: ../src/viktrwlayer_propwin.c:3323 +msgid "Start and End" +msgstr "" + +#: ../src/viktrwlayer_propwin.c:3324 +msgid "Centre, Start and End" +msgstr "" + +#: ../src/viktrwlayer_propwin.c:3336 +msgid "Maximum number of distance labels to be shown" +msgstr "" + +#: ../src/viktrwlayer_propwin.c:3340 +msgid "Properties" +msgstr "" + +#: ../src/viktrwlayer_propwin.c:3584 +#, c-format +msgid "%d minutes - %d minutes moving" +msgstr "" + +#: ../src/viktrwlayer_propwin.c:3596 +#, c-format +msgid "%s total - %s in segments" +msgstr "" + +#: ../src/viktrwlayer_propwin.c:3607 ../src/viktrwlayer_analysis.c:622 +msgid "Statistics" +msgstr "Statistik" + +#: ../src/viktrwlayer_propwin.c:3613 ../src/viktrwlayer_propwin.c:3680 +msgid "Show D_EM" +msgstr "" + +#: ../src/viktrwlayer_propwin.c:3615 ../src/viktrwlayer_propwin.c:3631 +#: ../src/viktrwlayer_propwin.c:3647 ../src/viktrwlayer_propwin.c:3697 +msgid "Show _GPS Speed" +msgstr "" + +#: ../src/viktrwlayer_propwin.c:3617 ../src/viktrwlayer_propwin.c:3633 +#: ../src/viktrwlayer_propwin.c:3665 ../src/viktrwlayer_propwin.c:3699 +msgid "Track Distance:" +msgstr "" + +#: ../src/viktrwlayer_propwin.c:3618 ../src/viktrwlayer_propwin.c:3684 +msgid "Track Height:" +msgstr "" + +#: ../src/viktrwlayer_propwin.c:3624 +msgid "Elevation-distance" +msgstr "" + +#: ../src/viktrwlayer_propwin.c:3634 +msgid "Track Gradient:" +msgstr "" + +#: ../src/viktrwlayer_propwin.c:3639 +msgid "Gradient-distance" +msgstr "" + +#: ../src/viktrwlayer_propwin.c:3649 ../src/viktrwlayer_propwin.c:3666 +#: ../src/viktrwlayer_propwin.c:3683 +msgid "Track Time:" +msgstr "" + +#: ../src/viktrwlayer_propwin.c:3650 ../src/viktrwlayer_propwin.c:3700 +msgid "Track Speed:" +msgstr "" + +#: ../src/viktrwlayer_propwin.c:3651 ../src/viktrwlayer_propwin.c:3667 +#: ../src/viktrwlayer_propwin.c:3685 +msgid "Time/Date:" +msgstr "" + +#: ../src/viktrwlayer_propwin.c:3655 +msgid "Speed-time" +msgstr "" + +#: ../src/viktrwlayer_propwin.c:3663 ../src/viktrwlayer_propwin.c:3679 +msgid "Show S_peed" +msgstr "" + +#: ../src/viktrwlayer_propwin.c:3671 +msgid "Distance-time" +msgstr "" + +#: ../src/viktrwlayer_propwin.c:3690 +msgid "Elevation-time" +msgstr "" + +#: ../src/viktrwlayer_propwin.c:3705 +msgid "Speed-distance" +msgstr "" + +#: ../src/viktrwlayer_tpwin.c:190 ../src/viktrwlayer_wpwin.c:66 +msgid "Date/Time Edit" +msgstr "" + +#: ../src/viktrwlayer_tpwin.c:242 +msgid "Name:" +msgstr "" + +#: ../src/viktrwlayer_tpwin.c:243 +msgid "Latitude:" +msgstr "Latitud:" + +#: ../src/viktrwlayer_tpwin.c:244 +msgid "Longitude:" +msgstr "Longitud:" + +#: ../src/viktrwlayer_tpwin.c:245 +msgid "Altitude:" +msgstr "Altitud:" + +#: ../src/viktrwlayer_tpwin.c:246 +msgid "Course:" +msgstr "" + +#: ../src/viktrwlayer_tpwin.c:247 +msgid "Timestamp:" +msgstr "Tidsstämpel:" + +#: ../src/viktrwlayer_tpwin.c:248 +msgid "Time:" +msgstr "Tid:" + +#: ../src/viktrwlayer_tpwin.c:249 +msgid "Distance Difference:" +msgstr "" + +#: ../src/viktrwlayer_tpwin.c:250 +msgid "Time Difference:" +msgstr "Tidsskillnad:" + +#: ../src/viktrwlayer_tpwin.c:251 +msgid "\"Speed\" Between:" +msgstr "" + +#: ../src/viktrwlayer_tpwin.c:252 +msgid "Speed:" +msgstr "" + +#: ../src/viktrwlayer_tpwin.c:253 +msgid "VDOP:" +msgstr "" + +#: ../src/viktrwlayer_tpwin.c:254 +msgid "HDOP:" +msgstr "" + +#: ../src/viktrwlayer_tpwin.c:255 +msgid "PDOP:" +msgstr "" + +#: ../src/viktrwlayer_tpwin.c:256 +msgid "SAT/FIX:" +msgstr "" + +#: ../src/viktrwlayer_tpwin.c:263 ../src/viktrwlayer_tpwin.c:408 +#: ../src/viktrwlayer_tpwin.c:622 +msgid "Trackpoint" +msgstr "Trackpoint" + +#: ../src/viktrwlayer_tpwin.c:266 +msgid "_Insert After" +msgstr "" + +#: ../src/viktrwlayer_tpwin.c:268 +msgid "Split Here" +msgstr "Dela här" + +#: ../src/viktrwlayer_tracklist.c:262 ../src/viktrwlayer_waypointlist.c:306 +msgid "_Copy Data" +msgstr "" + +#. +#. item = gtk_image_menu_item_new_with_mnemonic ( _("_Select") ); +#. gtk_image_menu_item_set_image ( (GtkImageMenuItem*)item, gtk_image_new_from_stock (GTK_STOCK_FIND, GTK_ICON_SIZE_MENU) ); +#. g_signal_connect_swapped ( G_OBJECT(item), "activate", G_CALLBACK(trw_layer_track_select), values ); +#. gtk_menu_shell_append (GTK_MENU_SHELL (menu), item); +#. gtk_widget_show ( item ); +#. +#. ATM view auto selects, so don't bother with separate select menu entry +#. +#. item = gtk_image_menu_item_new_with_mnemonic ( _("_Select") ); +#. gtk_image_menu_item_set_image ( (GtkImageMenuItem*)item, gtk_image_new_from_stock (GTK_STOCK_FIND, GTK_ICON_SIZE_MENU) ); +#. g_signal_connect_swapped ( G_OBJECT(item), "activate", G_CALLBACK(trw_layer_waypoint_select), values ); +#. gtk_menu_shell_append (GTK_MENU_SHELL (menu), item); +#. gtk_widget_show ( item ); +#. +#. AUTO SELECT NOT TRUE YET... +#. ATM view auto selects, so don't bother with separate select menu entry +#: ../src/viktrwlayer_tracklist.c:290 ../src/viktrwlayer_waypointlist.c:341 +#: ../src/vikwindow.c:4816 +msgid "_View" +msgstr "_Visa" + +#. Insert column for the layer name when viewing multi layers +#: ../src/viktrwlayer_tracklist.c:613 ../src/viktrwlayer_waypointlist.c:609 +msgid "Layer" +msgstr "" + +#: ../src/viktrwlayer_tracklist.c:627 ../src/viktrwlayer_waypointlist.c:624 +msgid "Date" +msgstr "" + +#: ../src/viktrwlayer_tracklist.c:631 ../src/viktrwlayer_waypointlist.c:628 +msgid "Visible" +msgstr "" + +#: ../src/viktrwlayer_tracklist.c:639 +msgid "" +"Distance\n" +"(miles)" +msgstr "" + +#: ../src/viktrwlayer_tracklist.c:642 +msgid "" +"Distance\n" +"(NM)" +msgstr "" + +#: ../src/viktrwlayer_tracklist.c:645 +msgid "" +"Distance\n" +"(km)" +msgstr "" + +#: ../src/viktrwlayer_tracklist.c:651 +msgid "" +"Length\n" +"(minutes)" +msgstr "" + +#: ../src/viktrwlayer_tracklist.c:660 ../src/vikutils.c:93 +msgid "sec/mi" +msgstr "" + +#: ../src/viktrwlayer_tracklist.c:666 +#, c-format +msgid "" +"Av. Speed\n" +"(%s)" +msgstr "" + +#. Apply own formatting of the data +#: ../src/viktrwlayer_tracklist.c:671 +#, c-format +msgid "" +"Max Speed\n" +"(%s)" +msgstr "" + +#: ../src/viktrwlayer_tracklist.c:679 ../src/viktrwlayer_waypointlist.c:637 +msgid "" +"Max Height\n" +"(Feet)" +msgstr "" + +#: ../src/viktrwlayer_tracklist.c:681 ../src/viktrwlayer_waypointlist.c:639 +msgid "" +"Max Height\n" +"(Metres)" +msgstr "" + +#: ../src/viktrwlayer_waypointlist.c:312 +msgid "Copy Data (with _positions)" +msgstr "" + +#: ../src/viktrwlayer_waypointlist.c:633 +msgid "Comment" +msgstr "" + +#: ../src/viktrwlayer_waypointlist.c:643 +msgid "Symbol" +msgstr "" + +#: ../src/viktrwlayer_wpwin.c:93 ../src/viktrwlayer_wpwin.c:302 +msgid "True" +msgstr "" + +#: ../src/viktrwlayer_wpwin.c:122 +msgid "Waypoint Properties" +msgstr "Waypoint Egenskaper" + +#: ../src/viktrwlayer_wpwin.c:164 +msgid "Name:" +msgstr "Namn:" + +#: ../src/viktrwlayer_wpwin.c:181 +msgid "Altitude:" +msgstr "Höjd:" + +#: ../src/viktrwlayer_wpwin.c:186 ../src/viktrwlayer_wpwin.c:188 +msgid "Comment:" +msgstr "Kommentar:" + +#: ../src/viktrwlayer_wpwin.c:202 +#, fuzzy +msgid "Source:" +msgstr "Ladda ned källa:" + +#: ../src/viktrwlayer_wpwin.c:212 +msgid "Image:" +msgstr "Bild:" + +#: ../src/viktrwlayer_wpwin.c:217 +msgid "Symbol:" +msgstr "Symbol:" + +#: ../src/viktrwlayer_wpwin.c:226 +msgid "(none)" +msgstr "(ingen)" + +#. Geotag Info [readonly] +#: ../src/viktrwlayer_wpwin.c:272 +msgid "Has Geotag" +msgstr "" + +#: ../src/viktrwlayer_wpwin.c:279 +msgid "Consistent Position" +msgstr "" + +#. ATM the direction value box is always shown, even when there is no information. +#. It would be nice to be able to hide it until the 'Add' has been performed, +#. however I've not been able to achieve this. +#. Thus simply sensistizing it instead. +#: ../src/viktrwlayer_wpwin.c:292 +#, fuzzy +msgid "Image Direction:" +msgstr "Bildinställningar" + +#: ../src/viktrwlayer_wpwin.c:300 +msgid "Magnetic" +msgstr "" + +#: ../src/viktrwlayer_wpwin.c:320 +msgid "Time:" +msgstr "" + +#. TODO: other checks (isalpha or whatever ) +#: ../src/viktrwlayer_wpwin.c:386 +msgid "Please enter a name for the waypoint." +msgstr "Ange ett namn för waypointen" + +#: ../src/viktrwlayer_geotag.c:320 ../src/viktrwlayer_geotag.c:460 +#, c-format +msgid "Failed updating EXIF on %s" +msgstr "" + +#: ../src/viktrwlayer_geotag.c:562 +#, c-format +msgid "Geotagging %d Images..." +msgstr "" + +#: ../src/viktrwlayer_geotag.c:630 +msgid "Geotag Images" +msgstr "" + +#: ../src/viktrwlayer_geotag.c:640 +msgid "Images" +msgstr "" + +#: ../src/viktrwlayer_geotag.c:645 +msgid "Overwrite Existing Waypoints:" +msgstr "" + +#: ../src/viktrwlayer_geotag.c:648 +msgid "Overwrite Existing GPS Information:" +msgstr "" + +#: ../src/viktrwlayer_geotag.c:650 +msgid "Keep File Modification Timestamp:" +msgstr "" + +#: ../src/viktrwlayer_geotag.c:684 +msgid "Create Waypoints:" +msgstr "" + +#: ../src/viktrwlayer_geotag.c:693 +msgid "Write EXIF:" +msgstr "" + +#: ../src/viktrwlayer_geotag.c:705 +msgid "Automatic Image Direction:" +msgstr "" + +#: ../src/viktrwlayer_geotag.c:707 +msgid "Set image direction based on a heading derived from the track" +msgstr "" + +#: ../src/viktrwlayer_geotag.c:710 +msgid "Interpolate Between Track Segments:" +msgstr "" + +#: ../src/viktrwlayer_geotag.c:715 +msgid "Image Time Offset (Seconds):" +msgstr "" + +#: ../src/viktrwlayer_geotag.c:718 +msgid "" +"The number of seconds to ADD to the photos time to make it match the GPS " +"data. Calculate this with (GPS - Photo). Can be negative or positive. Useful " +"to adjust times when a camera's timestamp was incorrect." +msgstr "" + +#: ../src/viktrwlayer_geotag.c:721 +msgid "Image Timezone:" +msgstr "" + +#: ../src/viktrwlayer_geotag.c:724 +msgid "" +"The timezone that was used when the images were created. For example, if a " +"camera is set to AWST or +8:00 hours. Enter +8:00 here so that the correct " +"adjustment to the images' time can be made. GPS data is always in UTC." +msgstr "" + +#: ../src/viktrwlayer_geotag.c:728 +#, c-format +msgid "Using waypoint: %s" +msgstr "" + +#: ../src/viktrwlayer_geotag.c:742 +#, c-format +msgid "Using track: %s" +msgstr "" + +#: ../src/viktrwlayer_geotag.c:744 +#, c-format +msgid "Using all tracks in: %s" +msgstr "" + +#: ../src/viktrwlayer_analysis.c:214 +msgid "Number of Tracks" +msgstr "" + +#: ../src/viktrwlayer_analysis.c:215 +msgid "Date Range" +msgstr "" + +#: ../src/viktrwlayer_analysis.c:216 +msgid "Total Length" +msgstr "" + +#: ../src/viktrwlayer_analysis.c:217 +msgid "Average Length" +msgstr "" + +#: ../src/viktrwlayer_analysis.c:218 +msgid "Eddington number" +msgstr "" + +#. No.4: Extended display only +#: ../src/viktrwlayer_analysis.c:219 +msgid "Max Speed" +msgstr "" + +#: ../src/viktrwlayer_analysis.c:220 +msgid "Avg. Speed" +msgstr "" + +#: ../src/viktrwlayer_analysis.c:221 +msgid "Minimum Altitude" +msgstr "" + +#: ../src/viktrwlayer_analysis.c:222 +msgid "Maximum Altitude" +msgstr "" + +#: ../src/viktrwlayer_analysis.c:223 +msgid "Total Elevation Gain/Loss" +msgstr "" + +#: ../src/viktrwlayer_analysis.c:224 +msgid "Avg. Elevation Gain/Loss" +msgstr "" + +#: ../src/viktrwlayer_analysis.c:225 +msgid "Total Duration" +msgstr "" + +#: ../src/viktrwlayer_analysis.c:226 +msgid "Avg. Duration" +msgstr "" + +#: ../src/viktrwlayer_analysis.c:317 +#, c-format +msgid "%.2f miles" +msgstr "" + +#: ../src/viktrwlayer_analysis.c:320 +#, c-format +msgid "%.2f NM" +msgstr "" + +#. VIK_UNITS_DISTANCE_KILOMETRES +#: ../src/viktrwlayer_analysis.c:324 +#, c-format +msgid "%.2f km" +msgstr "" + +#: ../src/viktrwlayer_analysis.c:361 +#, c-format +msgid "%.2f m/s" +msgstr "" + +#: ../src/viktrwlayer_analysis.c:370 ../src/viktrwlayer_analysis.c:373 +#, c-format +msgid "%.2f knots" +msgstr "" + +#: ../src/viktrwlayer_analysis.c:379 ../src/viktrwlayer_analysis.c:382 +#, c-format +msgid "%d s/km" +msgstr "" + +#: ../src/viktrwlayer_analysis.c:399 ../src/viktrwlayer_analysis.c:402 +#, c-format +msgid "%d sec/mi" +msgstr "" + +#: ../src/viktrwlayer_analysis.c:420 ../src/viktrwlayer_analysis.c:423 +#, c-format +msgid "%.2f km/h" +msgstr "" + +#: ../src/viktrwlayer_analysis.c:434 ../src/viktrwlayer_analysis.c:440 +#, c-format +msgid "%d feet" +msgstr "" + +#: ../src/viktrwlayer_analysis.c:445 ../src/viktrwlayer_analysis.c:447 +#, c-format +msgid "%d feet / %d feet" +msgstr "" + +#: ../src/viktrwlayer_analysis.c:452 ../src/viktrwlayer_analysis.c:458 +#, c-format +msgid "%d m" +msgstr "" + +#: ../src/viktrwlayer_analysis.c:463 ../src/viktrwlayer_analysis.c:465 +#, c-format +msgid "%d m / %d m" +msgstr "" + +#: ../src/viktrwlayer_analysis.c:477 +#, c-format +msgid "%d:%02d:%02d days:hrs:mins" +msgstr "" + +#: ../src/viktrwlayer_analysis.c:484 +#, c-format +msgid "%d:%02d hrs:mins" +msgstr "" + +#: ../src/viktrwlayer_analysis.c:658 +msgid "Include Invisible Items" +msgstr "" + +#: ../src/vikstatus.c:129 +msgid "Current number of background tasks. Click to see the background jobs." +msgstr "" + +#: ../src/vikstatus.c:134 +msgid "Current zoom level. Click to select a new one." +msgstr "" + +#: ../src/vikstatus.c:141 +msgid "Left click to clear the message. Right click to copy the message." +msgstr "" + +#: ../src/vikutils.c:108 +msgid "GPSD" +msgstr "" + +#. GPS Preamble +#: ../src/vikutils.c:109 +msgid "Trkpt" +msgstr "" + +#: ../src/vikutils.c:160 +#, c-format +msgid "%sSpeed%s %.1f%s" +msgstr "" + +#. Go for 2dp as expect low values for vertical speeds +#: ../src/vikutils.c:214 +#, c-format +msgid "%sClimb%s %.2f%s" +msgstr "" + +#: ../src/vikutils.c:223 +#, c-format +msgid "%sAlt %dfeet" +msgstr "" + +#. VIK_UNITS_HEIGHT_METRES: +#: ../src/vikutils.c:227 +#, c-format +msgid "%sAlt %dm" +msgstr "" + +#: ../src/vikutils.c:235 +#, c-format +msgid "%sCourse %03d°" +msgstr "" + +#: ../src/vikutils.c:249 +msgid "yards" +msgstr "" + +#. VIK_UNITS_DISTANCE_KILOMETRES: +#: ../src/vikutils.c:253 +msgid "m" +msgstr "" + +#: ../src/vikutils.c:257 +#, c-format +msgid "%sDistance diff %d%s" +msgstr "" + +#: ../src/vikutils.c:272 +#, c-format +msgid "%sTime %s" +msgstr "" + +#: ../src/vikutils.c:281 +#, c-format +msgid "%sTime diff %lds" +msgstr "" + +#: ../src/vikutils.c:287 +#, c-format +msgid "%sNo. of Sats %d" +msgstr "" + +#: ../src/vikutils.c:312 +#, c-format +msgid "%sTo End %.2f%s" +msgstr "" + +#: ../src/vikutils.c:339 +#, c-format +msgid "%sDistance along %.2f%s" +msgstr "" + +#: ../src/vikutils.c:359 +#, c-format +msgid "%sTrack: %s" +msgstr "" + +#: ../src/vikutils.c:396 +#, c-format +msgid "" +"There is a newer version of Viking available: %s\n" +"\n" +"Do you wish to go to Viking's website now?" +msgstr "" + +#: ../src/vikutils.c:526 +msgid "" +"This appears to be Viking's very first run.\n" +"\n" +"Do you wish to enable automatic internet features?\n" +"\n" +"Individual settings can be controlled in the Preferences." +msgstr "" + +#: ../src/vikwaypoint.c:37 +msgid "Waypoint" +msgstr "" + +#: ../src/vikwebtool_datasource.c:352 +msgid "Search Term" +msgstr "" + +#. TODO get rid of this as this is unnecessary duplication... +#: ../src/vikwindow.c:258 +msgid "Pan" +msgstr "Panorera" + +#: ../src/vikwindow.c:258 +msgid "Zoom" +msgstr "Zoom" + +#: ../src/vikwindow.c:258 +msgid "Ruler" +msgstr "Linjal" + +#: ../src/vikwindow.c:258 +msgid "Select" +msgstr "" + +#: ../src/vikwindow.c:368 +msgid "This is Viking " +msgstr "" + +#: ../src/vikwindow.c:457 +msgid "Location lookup aborted" +msgstr "" + +#: ../src/vikwindow.c:477 +#, c-format +msgid "Location found: %s" +msgstr "" + +#: ../src/vikwindow.c:486 +msgid "Unable to determine location" +msgstr "" + +#: ../src/vikwindow.c:495 +msgid "Determining location" +msgstr "" + +#: ../src/vikwindow.c:525 +#, c-format +msgid "Location found via geoclue" +msgstr "" + +#: ../src/vikwindow.c:546 +msgid "Default Map" +msgstr "" + +#: ../src/vikwindow.c:557 ../src/vikwindow.c:3938 +msgid "Trying to determine location..." +msgstr "" + +#. Create tooltip +#: ../src/vikwindow.c:723 +msgid "Select zoom level" +msgstr "" + +#: ../src/vikwindow.c:1176 +#, c-format +msgid "" +"Do you want to save the changes you made to the document \"%s\"?\n" +"\n" +"Your changes will be lost if you don't save them." +msgstr "" +"Vill du spara de ändringar du gjort i dokumentet \"%s\"?\n" +"\n" +"Dina ändringar kommer försvinna om du inte sparar dem." + +#: ../src/vikwindow.c:1180 +msgid "Don't Save" +msgstr "Spara inte" + +#: ../src/vikwindow.c:1268 +msgid "mpp" +msgstr "mpp" + +#: ../src/vikwindow.c:1268 +msgid "pixelfact" +msgstr "" + +#: ../src/vikwindow.c:1467 +#, c-format +msgid "%s %s %dm" +msgstr "%s %s %dm" + +#: ../src/vikwindow.c:1469 +#, c-format +msgid "%s %s %dft" +msgstr "" + +#: ../src/vikwindow.c:1472 +#, c-format +msgid "%s %s" +msgstr "%s %s" + +#: ../src/vikwindow.c:1929 +msgid "_Ruler" +msgstr "_Linjal" + +#: ../src/vikwindow.c:1929 +msgid "Ruler Tool" +msgstr "Linjalverktyg" + +#: ../src/vikwindow.c:2204 ../src/vikwindow.c:4818 +msgid "_Zoom" +msgstr "_Zoom" + +#: ../src/vikwindow.c:2204 +msgid "Zoom Tool" +msgstr "Zoomverktyg" + +#: ../src/vikwindow.c:2271 ../src/vikwindow.c:4819 +msgid "_Pan" +msgstr "" + +#: ../src/vikwindow.c:2271 +msgid "Pan Tool" +msgstr "Panoreringsverktyg" + +#: ../src/vikwindow.c:2425 +msgid "_Select" +msgstr "" + +#: ../src/vikwindow.c:2425 +msgid "Select Tool" +msgstr "" + +#: ../src/vikwindow.c:2615 +msgid "You must select a layer to show its properties." +msgstr "Du måste välja ett lager för att kuna se dess egenskaper." + +#. No error to show, so unlikely this will get called +#: ../src/vikwindow.c:2629 +msgid "The help system is not available." +msgstr "" + +#. Main error path +#: ../src/vikwindow.c:2632 +#, c-format +msgid "" +"Help is not available because: %s.\n" +"Ensure a Mime Type ghelp handler program is installed (e.g. yelp)." +msgstr "" + +#: ../src/vikwindow.c:2865 +msgid "You must select a layer to delete." +msgstr "Du måste välja ett lager för borttagning." + +#: ../src/vikwindow.c:3171 +msgid "Untitled" +msgstr "Namnlös" + +#: ../src/vikwindow.c:3300 +#, c-format +msgid "Unable to add '%s' to the list of recently used documents" +msgstr "" + +#: ../src/vikwindow.c:3391 +msgid "The file you requested could not be opened." +msgstr "Filen du valt kan inte öppnas." + +#: ../src/vikwindow.c:3394 +msgid "" +"GPSBabel is required to load files of this type or GPSBabel encountered " +"problems." +msgstr "" + +#: ../src/vikwindow.c:3397 +#, c-format +msgid "Unable to load malformed GPX file %s" +msgstr "" + +#: ../src/vikwindow.c:3400 +#, c-format +msgid "Unsupported file type for %s" +msgstr "" + +#. Since we can process .vik files with issues just show a warning in the status bar +#. Not that a user can do much about it... or tells them what this issue is yet... +#: ../src/vikwindow.c:3406 +#, c-format +msgid "WARNING: issues encountered loading %s" +msgstr "" + +#: ../src/vikwindow.c:3489 +msgid "Please select a GPS data file to open. " +msgstr "" + +#: ../src/vikwindow.c:3508 +msgid "Google Earth" +msgstr "" + +#: ../src/vikwindow.c:3523 ../src/vikwindow.c:3646 ../src/viking.desktop.in.h:1 +msgid "Viking" +msgstr "Viking" + +#: ../src/vikwindow.c:3594 ../src/vikwindow.c:4632 +msgid "Open File" +msgstr "" + +#: ../src/vikwindow.c:3630 +msgid "Save as Viking File." +msgstr "Spara som Viking fil." + +#: ../src/vikwindow.c:3757 +#, c-format +msgid "Exporting to file: %s" +msgstr "" + +#. Confirm what happened. +#: ../src/vikwindow.c:3774 +#, c-format +msgid "Exported files: %d" +msgstr "" + +#: ../src/vikwindow.c:3786 +msgid "Nothing to Export!" +msgstr "" + +#: ../src/vikwindow.c:3790 +msgid "Export to directory" +msgstr "" + +#: ../src/vikwindow.c:3809 +msgid "Could not convert all files" +msgstr "" + +#: ../src/vikwindow.c:3851 +msgid "File not accessible" +msgstr "" + +#: ../src/vikwindow.c:3854 +msgid "No Viking File" +msgstr "" + +#: ../src/vikwindow.c:3998 +msgid "This layer has no configurable properties." +msgstr "" + +#: ../src/vikwindow.c:4080 +msgid "Are you sure you wish to delete all layers?" +msgstr "Är du säker på att du vill ta bort alla lager?" + +#. Try harder... +#: ../src/vikwindow.c:4126 ../src/vikwindow.c:4132 +msgid "Generating image file..." +msgstr "" + +#: ../src/vikwindow.c:4154 +msgid "" +"Failed to generate internal image.\n" +"\n" +"Try creating a smaller image." +msgstr "" + +#: ../src/vikwindow.c:4175 +msgid "Image file generated." +msgstr "" + +#: ../src/vikwindow.c:4177 +msgid "Failed to generate image file." +msgstr "" + +#: ../src/vikwindow.c:4246 +#, c-format +msgid "Unable to write to file %s: %s" +msgstr "" + +#: ../src/vikwindow.c:4284 +msgid "" +"Viewable region outside allowable pixel size bounds for image. Clipping " +"width/height values." +msgstr "" + +#: ../src/vikwindow.c:4309 +#, c-format +msgid "Total area: %ldm x %ldm (%.3f sq. km)" +msgstr "Total area: %ldm x %ldm (%.3f kvadrat kilometer)" + +#: ../src/vikwindow.c:4312 +#, c-format +msgid "Total area: %ldm x %ldm (%.3f sq. miles)" +msgstr "" + +#: ../src/vikwindow.c:4315 +#, c-format +msgid "Total area: %ldm x %ldm (%.3f sq. NM)" +msgstr "" + +#. Single file +#: ../src/vikwindow.c:4343 +msgid "Save Image" +msgstr "Spara bild" + +#: ../src/vikwindow.c:4364 ../src/vikwindow.c:4641 +msgid "KMZ" +msgstr "" + +#: ../src/vikwindow.c:4417 +msgid "You must be in UTM mode to use this feature" +msgstr "Du måste vara i UTM läge för att använda denna funktion" + +#: ../src/vikwindow.c:4421 +msgid "Choose a directory to hold images" +msgstr "" + +#. todo: default for answers inside VikWindow or static (thruout instance) +#: ../src/vikwindow.c:4441 +msgid "Save to Image File" +msgstr "" + +#: ../src/vikwindow.c:4457 +msgid "Width (pixels):" +msgstr "Bredd (bildpunkter):" + +#: ../src/vikwindow.c:4459 +msgid "Height (pixels):" +msgstr "Höjd (bildpunkter):" + +#: ../src/vikwindow.c:4462 +msgid "" +"WARNING: USING LARGE IMAGES OVER 10000x10000\n" +"MAY CRASH THE PROGRAM!" +msgstr "" + +#: ../src/vikwindow.c:4464 +msgid "Zoom (meters per pixel):" +msgstr "" + +#: ../src/vikwindow.c:4480 +msgid "Area in current viewable window" +msgstr "" + +#: ../src/vikwindow.c:4490 +msgid "Save as PNG" +msgstr "Spara som PNG" + +#: ../src/vikwindow.c:4491 +msgid "Save as JPEG" +msgstr "Spara som JPEG" + +#: ../src/vikwindow.c:4520 +msgid "East-west image tiles:" +msgstr "" + +#: ../src/vikwindow.c:4522 +msgid "North-south image tiles:" +msgstr "" + +#: ../src/vikwindow.c:4619 +msgid "This feature is not available in UTM mode" +msgstr "" + +#: ../src/vikwindow.c:4658 +#, c-format +msgid "Unable to import %s." +msgstr "" + +#: ../src/vikwindow.c:4749 +msgid "Choose a background color" +msgstr "Välj en bakgrundsfärg" + +#: ../src/vikwindow.c:4765 +msgid "Choose a track highlight color" +msgstr "" + +#: ../src/vikwindow.c:4814 +msgid "_File" +msgstr "_Fil" + +#: ../src/vikwindow.c:4815 +msgid "_Edit" +msgstr "R_edigera" + +#: ../src/vikwindow.c:4817 +msgid "_Show" +msgstr "" + +#: ../src/vikwindow.c:4820 +msgid "_Layers" +msgstr "_Lager" + +#: ../src/vikwindow.c:4821 +msgid "_Tools" +msgstr "Verk -tyg" + +#: ../src/vikwindow.c:4822 +msgid "_Webtools" +msgstr "" + +#: ../src/vikwindow.c:4823 ../src/vikwindow.c:4893 +msgid "_Help" +msgstr "_Hjälp" + +#: ../src/vikwindow.c:4825 +msgid "New file" +msgstr "Ny fil" + +#: ../src/vikwindow.c:4826 +msgid "_Open..." +msgstr "_Öppna..." + +#: ../src/vikwindow.c:4826 +msgid "Open a file" +msgstr "Öppna en fil" + +#: ../src/vikwindow.c:4827 +msgid "Open _Recent File" +msgstr "" + +#: ../src/vikwindow.c:4828 +msgid "Append _File..." +msgstr "" + +#: ../src/vikwindow.c:4828 +msgid "Append data from a different file" +msgstr "" + +#: ../src/vikwindow.c:4829 +msgid "Open GPX as External _Layer..." +msgstr "" + +#: ../src/vikwindow.c:4829 +msgid "Open a GPX file as an external layer" +msgstr "" + +#: ../src/vikwindow.c:4830 +msgid "_Export All" +msgstr "" + +#: ../src/vikwindow.c:4830 +msgid "Export All TrackWaypoint Layers" +msgstr "" + +#: ../src/vikwindow.c:4831 +msgid "_GPX..." +msgstr "" + +#: ../src/vikwindow.c:4831 +msgid "Export as GPX" +msgstr "" + +#: ../src/vikwindow.c:4832 +msgid "A_cquire" +msgstr "" + +#: ../src/vikwindow.c:4833 +msgid "_Directions..." +msgstr "" + +#: ../src/vikwindow.c:4833 +msgid "Get driving directions" +msgstr "" + +#: ../src/vikwindow.c:4835 +msgid "_OSM Traces..." +msgstr "" + +#: ../src/vikwindow.c:4835 +msgid "Get traces from OpenStreetMap" +msgstr "" + +#: ../src/vikwindow.c:4836 +msgid "_My OSM Traces..." +msgstr "" + +#: ../src/vikwindow.c:4836 +msgid "Get Your Own Traces from OpenStreetMap" +msgstr "" + +#: ../src/vikwindow.c:4839 +msgid "Geo_caches..." +msgstr "Geo_cachar..." + +#: ../src/vikwindow.c:4839 +msgid "Get Geocaches from geocaching.com" +msgstr "Hämta Geocachar från geocaching.com" + +#: ../src/vikwindow.c:4842 +msgid "Create waypoints from geotagged images" +msgstr "" + +#: ../src/vikwindow.c:4844 +msgid "Get a file from a URL" +msgstr "" + +#: ../src/vikwindow.c:4846 +msgid "Create waypoints from Wikipedia items in the current view" +msgstr "" + +#: ../src/vikwindow.c:4848 +msgid "_Save" +msgstr "_Spara" + +#: ../src/vikwindow.c:4848 +msgid "Save the file" +msgstr "Spara filen" + +#: ../src/vikwindow.c:4849 +msgid "Save _As..." +msgstr "Sp_ara som..." + +#: ../src/vikwindow.c:4849 +msgid "Save the file under different name" +msgstr "Spara filen under ett annat namn" + +#: ../src/vikwindow.c:4850 +msgid "Properties..." +msgstr "" + +#: ../src/vikwindow.c:4850 +msgid "File Properties" +msgstr "" + +#: ../src/vikwindow.c:4852 +msgid "Import KMZ _Map File..." +msgstr "" + +#: ../src/vikwindow.c:4852 +msgid "Import a KMZ file" +msgstr "" + +#: ../src/vikwindow.c:4853 +msgid "Generate _KMZ Map File..." +msgstr "" + +#: ../src/vikwindow.c:4853 +msgid "Generate a KMZ file with an overlay of the current view" +msgstr "" + +#: ../src/vikwindow.c:4855 +msgid "_Generate Image File..." +msgstr "" + +#: ../src/vikwindow.c:4855 +msgid "Save a snapshot of the workspace into a file" +msgstr "" + +#: ../src/vikwindow.c:4856 +msgid "Generate _Directory of Images..." +msgstr "" + +#: ../src/vikwindow.c:4856 +msgid "Generate _Directory of Images" +msgstr "" + +#: ../src/vikwindow.c:4857 +msgid "_Print..." +msgstr "Skriv _ut..." + +#: ../src/vikwindow.c:4857 +msgid "Print maps" +msgstr "Skriv ut kartor" + +#: ../src/vikwindow.c:4858 +msgid "E_xit" +msgstr "_Avsluta" + +#: ../src/vikwindow.c:4858 +msgid "Exit the program" +msgstr "Avsluta programmet" + +#: ../src/vikwindow.c:4859 +msgid "Save and Exit" +msgstr "Spara och avsluta" + +#: ../src/vikwindow.c:4859 +msgid "Save and Exit the program" +msgstr "Spara och avsluta programmet" + +#: ../src/vikwindow.c:4861 +msgid "Go to the Pre_vious Location" +msgstr "" + +#: ../src/vikwindow.c:4861 +msgid "Go to the previous location" +msgstr "" + +#: ../src/vikwindow.c:4862 +msgid "Go to the _Next Location" +msgstr "" + +#: ../src/vikwindow.c:4862 +msgid "Go to the next location" +msgstr "" + +#: ../src/vikwindow.c:4863 +msgid "Go to the _Default Location" +msgstr "" + +#: ../src/vikwindow.c:4863 +msgid "Go to the default location" +msgstr "" + +#: ../src/vikwindow.c:4864 +msgid "Go to the _Auto Location" +msgstr "" + +#: ../src/vikwindow.c:4864 +msgid "Go to a location via automatic lookup" +msgstr "" + +#: ../src/vikwindow.c:4865 +msgid "Go to _Location..." +msgstr "" + +#: ../src/vikwindow.c:4865 +msgid "Go to address/place using text search" +msgstr "" + +#: ../src/vikwindow.c:4866 +msgid "_Go to Lat/Lon..." +msgstr "" + +#: ../src/vikwindow.c:4866 +msgid "Go to arbitrary lat/lon coordinate" +msgstr "" + +#: ../src/vikwindow.c:4867 +msgid "Go to UTM..." +msgstr "Gå till UTM..." + +#: ../src/vikwindow.c:4867 +msgid "Go to arbitrary UTM coordinate" +msgstr "" + +#: ../src/vikwindow.c:4868 +#, fuzzy +msgid "Go to Today" +msgstr "Gå till UTM..." + +#: ../src/vikwindow.c:4868 +msgid "Go to today on the calendar" +msgstr "" + +#: ../src/vikwindow.c:4869 +msgid "_Refresh" +msgstr "" + +#: ../src/vikwindow.c:4869 +msgid "Refresh any maps displayed" +msgstr "" + +#: ../src/vikwindow.c:4870 +msgid "Set _Highlight Color..." +msgstr "" + +#: ../src/vikwindow.c:4870 +msgid "Set Highlight Color" +msgstr "" + +#: ../src/vikwindow.c:4871 +msgid "Set Bac_kground Color..." +msgstr "" + +#: ../src/vikwindow.c:4871 +msgid "Set Background Color" +msgstr "" + +#: ../src/vikwindow.c:4872 +msgid "Zoom _In" +msgstr "Zooma _in" + +#: ../src/vikwindow.c:4872 +msgid "Zoom In" +msgstr "" + +#: ../src/vikwindow.c:4873 +msgid "Zoom _Out" +msgstr "Zooma _ut" + +#: ../src/vikwindow.c:4873 +msgid "Zoom Out" +msgstr "" + +#: ../src/vikwindow.c:4874 +msgid "Zoom _To..." +msgstr "Zooma _till..." + +#: ../src/vikwindow.c:4874 +msgid "Zoom To" +msgstr "" + +#: ../src/vikwindow.c:4875 +msgid "Pan _North" +msgstr "" + +#: ../src/vikwindow.c:4876 +msgid "Pan _East" +msgstr "" + +#: ../src/vikwindow.c:4877 +msgid "Pan _South" +msgstr "" + +#: ../src/vikwindow.c:4878 +msgid "Pan _West" +msgstr "" + +#: ../src/vikwindow.c:4879 +msgid "Background _Jobs" +msgstr "" + +#: ../src/vikwindow.c:4879 +msgid "Background Jobs" +msgstr "" + +#: ../src/vikwindow.c:4881 +msgid "Cu_t" +msgstr "Klipp _ut" + +#: ../src/vikwindow.c:4885 +msgid "Delete All" +msgstr "Ta bort alla" + +#: ../src/vikwindow.c:4886 +msgid "Copy Centre _Location" +msgstr "" + +#: ../src/vikwindow.c:4887 +msgid "_Flush Map Cache" +msgstr "" + +#: ../src/vikwindow.c:4888 +msgid "_Set the Default Location" +msgstr "" + +#: ../src/vikwindow.c:4888 +msgid "Set the Default Location to the current position" +msgstr "" + +#: ../src/vikwindow.c:4889 +msgid "_Preferences" +msgstr "_Inställningar" + +#: ../src/vikwindow.c:4889 +msgid "Program Preferences" +msgstr "" + +#: ../src/vikwindow.c:4890 +msgid "_Layer Defaults" +msgstr "" + +#: ../src/vikwindow.c:4891 +msgid "_Properties" +msgstr "_Egenskaper" + +#: ../src/vikwindow.c:4893 +msgid "Help" +msgstr "" + +#: ../src/vikwindow.c:4894 +msgid "_About" +msgstr "_Om" + +#: ../src/vikwindow.c:4894 +msgid "About" +msgstr "" + +#: ../src/vikwindow.c:4903 +msgid "_KML..." +msgstr "" + +#: ../src/vikwindow.c:4903 +msgid "Export as KML" +msgstr "" + +#: ../src/vikwindow.c:4904 +msgid "Transfer data from a GPS device" +msgstr "Överför data till en GPS enhet" + +#: ../src/vikwindow.c:4905 +msgid "Import file via GPSBabel converter" +msgstr "" + +#: ../src/vikwindow.c:4909 +msgid "Import Geo_JSON File..." +msgstr "" + +#: ../src/vikwindow.c:4909 +msgid "Import GeoJSON file" +msgstr "" + +#: ../src/vikwindow.c:4914 +msgid "_UTM Mode" +msgstr "_UTM läge" + +#: ../src/vikwindow.c:4915 +msgid "_Expedia Mode" +msgstr "_Expedia läge" + +#: ../src/vikwindow.c:4916 +msgid "_Mercator Mode" +msgstr "_Mercator läge" + +#: ../src/vikwindow.c:4917 +msgid "Lat_/Lon Mode" +msgstr "" + +#: ../src/vikwindow.c:4921 +msgid "Show _Scale" +msgstr "" + +#: ../src/vikwindow.c:4921 +msgid "Show Scale" +msgstr "Visa skala" + +#: ../src/vikwindow.c:4922 +msgid "Show _Center Mark" +msgstr "" + +#: ../src/vikwindow.c:4922 +msgid "Show Center Mark" +msgstr "" + +#: ../src/vikwindow.c:4923 +msgid "Show _Highlight" +msgstr "" + +#: ../src/vikwindow.c:4923 +msgid "Show Highlight" +msgstr "" + +#: ../src/vikwindow.c:4924 +msgid "_Full Screen" +msgstr "Fullskärm" + +#: ../src/vikwindow.c:4924 +msgid "Activate full screen mode" +msgstr "Aktivera fullskärmsläge" + +#: ../src/vikwindow.c:4925 +msgid "Show Side _Panel" +msgstr "" + +#: ../src/vikwindow.c:4925 +msgid "Show Side Panel" +msgstr "" + +#: ../src/vikwindow.c:4926 +msgid "Show Status_bar" +msgstr "" + +#: ../src/vikwindow.c:4926 +msgid "Show Statusbar" +msgstr "" + +#: ../src/vikwindow.c:4927 +msgid "Show _Toolbar" +msgstr "" + +#: ../src/vikwindow.c:4927 +msgid "Show Toolbar" +msgstr "" + +#: ../src/vikwindow.c:4928 +msgid "Show _Menu" +msgstr "" + +#: ../src/vikwindow.c:4928 +msgid "Show Menu" +msgstr "" + +#: ../src/vikwindow.c:4929 +msgid "Show Side Panel B_uttons" +msgstr "" + +#: ../src/vikwindow.c:4929 +msgid "Show Side Panel Buttons" +msgstr "" + +#: ../src/vikwindow.c:4930 +msgid "Show Side Panel Ca_lendar" +msgstr "" + +#: ../src/vikwindow.c:4930 +msgid "Show Side Panel Calendar" +msgstr "" + +#: ../src/vikwindow.c:5064 +#, c-format +msgid "New _%s Layer" +msgstr "" + +#: ../src/vikwindow.c:5114 +#, fuzzy +msgid "..." +msgstr "Lägg till…" + +#: ../src/viking.desktop.in.h:2 +msgid "GPS Data Manager" +msgstr "" + +#: ../src/viking.desktop.in.h:3 +msgid "Map Based GPS Data Manager (live data capable)." +msgstr "" + +#: ../src/libjpeg/jpeg-data.c:205 +msgid "Data does not follow JPEG specification." +msgstr "" + +#: ../src/libjpeg/jpeg-data.c:302 +#, c-format +msgid "Path '%s' invalid." +msgstr "" + +#: ../src/libjpeg/jpeg-data.c:320 +#, c-format +msgid "Could not read '%s'." +msgstr "" + +#~ msgid "Polygonzied Layer" +#~ msgstr "Polygoniserade lager" + +#~ msgid "Email:" +#~ msgstr "E-post:" + +#~ msgid "Error: couldn't find gpsbabel." +#~ msgstr "Fel: kunde inte hitta gpsbabel." + +#~ msgid "Create Track" +#~ msgstr "Skapa spår" diff --git a/po/tr.po b/po/tr.po new file mode 100644 index 0000000..e477e7c --- /dev/null +++ b/po/tr.po @@ -0,0 +1,6097 @@ +# Turkish translation for viking +# Copyright (c) 2011 Rosetta Contributors and Canonical Ltd 2011 +# This file is distributed under the same license as the viking package. +# FIRST AUTHOR , 2011. +# +msgid "" +msgstr "" +"Project-Id-Version: viking\n" +"Report-Msgid-Bugs-To: \n" +"POT-Creation-Date: 2019-01-19 12:53+0000\n" +"PO-Revision-Date: 2011-05-09 14:15+0000\n" +"Last-Translator: sezaiyeniay \n" +"Language-Team: Turkish \n" +"Language: tr\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-Launchpad-Export-Date: 2018-12-21 17:32+0000\n" +"X-Generator: Launchpad (build 18847)\n" + +#: ../src/acquire.c:106 ../src/vikgpslayer.c:1367 +msgid "Done." +msgstr "Bitti." + +#: ../src/acquire.c:115 +msgid "No data." +msgstr "Veri yok." + +#: ../src/acquire.c:167 ../src/acquire.c:415 +msgid "Error: acquisition failed." +msgstr "" + +#: ../src/acquire.c:339 +msgid "Working..." +msgstr "Çalışılıyor..." + +#. This shouldn't happen... +#: ../src/acquire.c:406 +msgid "" +"Unable to create command\n" +"Acquire method failed." +msgstr "" + +#: ../src/acquire.c:513 +msgid "_Filter" +msgstr "" + +#: ../src/acquire.c:528 +#, c-format +msgid "Filter with %s" +msgstr "" + +#: ../src/acquire.c:545 +msgid "Filter" +msgstr "" + +#: ../src/babel.c:640 +msgid "GPSBabel:" +msgstr "" + +#: ../src/babel.c:641 +msgid "" +"Allow setting the specific instance of GPSBabel. You must restart Viking for " +"this value to take effect." +msgstr "" + +#: ../src/babel_ui.c:79 +msgid "Select a file format" +msgstr "" + +#: ../src/babel_ui.c:144 ../src/viktrwlayer.c:531 ../src/viktrwlayer.c:2882 +msgid "Tracks" +msgstr "" + +#: ../src/babel_ui.c:149 ../src/viktrwlayer.c:2892 +msgid "Routes" +msgstr "" + +#. ***** PARAMETERS ***** +#: ../src/babel_ui.c:154 ../src/viktrwlayer.c:531 ../src/viktrwlayer.c:2887 +msgid "Waypoints" +msgstr "Yol işareti" + +#: ../src/background.c:64 +#, c-format +msgid "%d items" +msgstr "%d parça" + +#: ../src/background.c:287 +msgid "Threads:" +msgstr "" + +#: ../src/background.c:288 +msgid "" +"Number of threads to use for Mapnik tasks. You need to restart Viking for a " +"change to this value to be used" +msgstr "" + +#: ../src/background.c:361 +msgid "Job" +msgstr "Görev" + +#: ../src/background.c:365 +msgid "Progress" +msgstr "İlerleme" + +#: ../src/background.c:373 +msgid "Viking Background Jobs" +msgstr "" + +#: ../src/bing.c:42 +msgid "Bing Aerial" +msgstr "" + +#: ../src/bing.c:48 +msgid "Bing" +msgstr "" + +#. VIK_GTK_WINDOW_FROM_WIDGET(vp) +#: ../src/bingmapsource.c:514 +msgid "Bing attribution Loading" +msgstr "" + +#: ../src/clipboard.c:95 +msgid "paste failed" +msgstr "yapıştırma başarısız" + +#: ../src/clipboard.c:105 +msgid "wrong clipboard data size" +msgstr "" + +#: ../src/clipboard.c:124 +#, c-format +msgid "" +"The clipboard contains sublayer data for %s layers. You must select a layer " +"of this type to paste the clipboard data." +msgstr "" + +#: ../src/clipboard.c:264 +msgid "" +"In order to paste a waypoint, please select an appropriate layer to paste " +"into." +msgstr "" + +#: ../src/dialog.c:60 +msgid "Go to Lat/Lon" +msgstr "Enlem/Boylama git" + +#: ../src/dialog.c:69 ../src/viktrwlayer_wpwin.c:173 +msgid "Latitude:" +msgstr "Enlem:" + +#: ../src/dialog.c:72 ../src/viktrwlayer_wpwin.c:177 +msgid "Longitude:" +msgstr "Boylam:" + +#: ../src/dialog.c:102 +msgid "Go to UTM" +msgstr "UTM Git" + +#: ../src/dialog.c:114 +msgid "Northing:" +msgstr "Kuzeye:" + +#: ../src/dialog.c:117 +msgid "Easting:" +msgstr "Doğuya:" + +#: ../src/dialog.c:121 ../src/vikgeoreflayer.c:902 +msgid "Zone:" +msgstr "Bölge:" + +#: ../src/dialog.c:124 ../src/vikgeoreflayer.c:904 +msgid "Letter:" +msgstr "" + +#: ../src/dialog.c:246 ../src/geonamessearch.c:238 +#: ../src/datasource_osm_my_traces.c:505 +msgid "Nothing was selected" +msgstr "Hiçbir şey seçilmedi" + +#: ../src/dialog.c:254 +msgid "Add Route" +msgstr "" + +#: ../src/dialog.c:254 +msgid "Add Track" +msgstr "İz ekle" + +#: ../src/dialog.c:262 +msgid "Route Name:" +msgstr "" + +#: ../src/dialog.c:262 +msgid "Track Name:" +msgstr "İz Adı:" + +#: ../src/dialog.c:282 +msgid "Please enter a name for the track." +msgstr "İz için bir ad girin" + +#: ../src/dialog.c:311 +msgid "Today" +msgstr "" + +#: ../src/dialog.c:393 +msgid "Zoom Factors..." +msgstr "" + +#: ../src/dialog.c:407 +msgid "Zoom factor (in meters per pixel):" +msgstr "" + +#: ../src/dialog.c:408 +msgid "X (easting): " +msgstr "X (doğuya): " + +#: ../src/dialog.c:409 +msgid "Y (northing): " +msgstr "Y (kuzeye): " + +#: ../src/dialog.c:414 +msgid "X and Y zoom factors must be equal" +msgstr "" + +#: ../src/dialog.c:469 +msgid "1 min" +msgstr "1 dk" + +#: ../src/dialog.c:470 +msgid "1 hour" +msgstr "1 saat" + +#: ../src/dialog.c:471 +msgid "1 day" +msgstr "1 gün" + +#: ../src/dialog.c:472 +msgid "Custom (in minutes):" +msgstr "Özel(dakika)" + +#: ../src/dialog.c:608 +#, c-format +msgid "" +"2003-2008, Evan Battaglia\n" +"2008-%s, Viking's contributors" +msgstr "" + +#: ../src/dialog.c:609 +msgid "GPS Data and Topo Analyzer, Explorer, and Manager." +msgstr "GPS Veri ve Topo Analizi, Gezgin ve Yöneticisi" + +#: ../src/dialog.c:610 +msgid "" +"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.\n" +"\n" +"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.\n" +"\n" +"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., 59 Temple " +"Place, Suite 330, Boston, MA 02111-1307, USA" +msgstr "" + +#: ../src/dialog.c:703 +msgid "Translation is coordinated on http://launchpad.net/viking" +msgstr "Çeviri http: http://launchpad.net/viking/ den koordine edilir" + +#: ../src/dialog.c:713 +msgid "Download along track" +msgstr "" + +#: ../src/dialog.c:720 +msgid "Map type:" +msgstr "Harita türü:" + +#: ../src/dialog.c:726 +msgid "Zoom level:" +msgstr "Yakınlaştırma seviyesi" + +#: ../src/dialog.c:766 +#, c-format +msgid "The map data is licensed: %s." +msgstr "Harita verileri lisanslanmıştır: %s." + +#: ../src/dialog.c:769 +#, c-format +msgid "" +"The data provided by '%s' are licensed under the following license: " +"%s." +msgstr "" + +#: ../src/dialog.c:773 +msgid "Open license" +msgstr "Lisansı aç" + +#: ../src/expedia.c:54 +msgid "Expedia Street Maps" +msgstr "Expedia Sokak Haritaları" + +#: ../src/expedia.c:82 +msgid "Invalid expedia altitude" +msgstr "" + +#: ../src/expedia.c:113 +#, c-format +msgid "" +"Couldn't open EXPEDIA image file (right after successful download! Please " +"report and delete image file!): %s" +msgstr "" + +#: ../src/expedia.c:126 +#, c-format +msgid "" +"Couldn't save EXPEDIA image file (right after successful download! Please " +"report and delete image file!): %s" +msgstr "" + +#: ../src/geonamessearch.c:115 +msgid "Search" +msgstr "Ara" + +#: ../src/geonamessearch.c:117 +msgid "No entries found!" +msgstr "Hiçbir kayıt bulunamadı!" + +#. NB could allow columns to be shifted around by doing this after each new +#. gtk_tree_view_column_set_reorderable ( column, TRUE ); +#. However I don't think is that useful, so I haven't put it in +#: ../src/geonamessearch.c:171 ../src/datasource_osm_my_traces.c:422 +#: ../src/viktrwlayer_tracklist.c:621 ../src/viktrwlayer_waypointlist.c:618 +msgid "Name" +msgstr "" + +#: ../src/geonamessearch.c:176 +msgid "Feature" +msgstr "" + +#: ../src/geonamessearch.c:181 ../src/datasource_osm_my_traces.c:437 +msgid "Lat/Lon" +msgstr "" + +#: ../src/geonamessearch.c:264 ../src/googlesearch.c:101 ../src/vikgoto.c:430 +msgid "couldn't map temp file" +msgstr "" + +#: ../src/geonamessearch.c:459 +msgid "Select articles" +msgstr "" + +#: ../src/geonamessearch.c:459 +msgid "Select the articles you want to add." +msgstr "" + +#: ../src/geonamessearch.c:475 +msgid "city" +msgstr "" + +#: ../src/geonamessearch.c:477 +msgid "edu" +msgstr "" + +#: ../src/geonamessearch.c:479 +msgid "airport" +msgstr "" + +#: ../src/geonamessearch.c:481 +msgid "mountain" +msgstr "" + +#: ../src/geonamessearch.c:483 +msgid "forest" +msgstr "" + +#: ../src/geonamessearch.c:485 +msgid "church" +msgstr "" + +#: ../src/geojson.c:74 +#, c-format +msgid "%s command failed: %s" +msgstr "" + +#: ../src/geojson.c:146 ../src/gpx.c:1317 +#, c-format +msgid "failed to open temporary file: %s" +msgstr "" + +#: ../src/globals.c:67 +msgid "DDD" +msgstr "" + +#: ../src/globals.c:67 +msgid "DMM" +msgstr "" + +#: ../src/globals.c:67 +msgid "DMS" +msgstr "" + +#: ../src/globals.c:67 +msgid "Raw" +msgstr "" + +#: ../src/globals.c:68 +msgid "Kilometres" +msgstr "" + +#: ../src/globals.c:68 +msgid "Miles" +msgstr "" + +#: ../src/globals.c:68 +msgid "Nautical Miles" +msgstr "" + +#. VIK_UNITS_SPEED_KILOMETRES_PER_HOUR: +#: ../src/globals.c:69 ../src/viktrwlayer_tracklist.c:655 ../src/vikutils.c:100 +msgid "km/h" +msgstr "" + +#: ../src/globals.c:69 ../src/viktrwlayer_tracklist.c:656 ../src/vikutils.c:78 +msgid "mph" +msgstr "" + +#. VIK_UNITS_SPEED_METRES_PER_SECOND: +#: ../src/globals.c:69 ../src/viktrwlayer_tracklist.c:663 ../src/vikutils.c:81 +msgid "m/s" +msgstr "" + +#: ../src/globals.c:69 ../src/viktrwlayer_tracklist.c:657 ../src/vikutils.c:84 +msgid "knots" +msgstr "" + +#: ../src/globals.c:69 ../src/viktrwlayer_tracklist.c:658 ../src/vikutils.c:87 +msgid "s/km" +msgstr "" + +#: ../src/globals.c:69 ../src/viktrwlayer_tracklist.c:659 ../src/vikutils.c:90 +msgid "min/km" +msgstr "" + +#: ../src/globals.c:69 +msgid "s/mi" +msgstr "" + +#: ../src/globals.c:69 ../src/viktrwlayer_tracklist.c:661 ../src/vikutils.c:96 +msgid "min/mi" +msgstr "" + +#: ../src/globals.c:70 +msgid "Metres" +msgstr "" + +#: ../src/globals.c:70 +msgid "Feet" +msgstr "" + +#: ../src/globals.c:73 +msgid "Locale" +msgstr "" + +#: ../src/globals.c:73 +msgid "World" +msgstr "" + +#: ../src/globals.c:73 +msgid "UTC" +msgstr "" + +#: ../src/globals.c:76 +msgid "Degree format:" +msgstr "" + +#: ../src/globals.c:77 +msgid "Distance units:" +msgstr "Mesafe birimleri:" + +#: ../src/globals.c:78 +msgid "Speed units:" +msgstr "Hız birimleri:" + +#: ../src/globals.c:79 +msgid "Height units:" +msgstr "Yükseklik birimleri:" + +#: ../src/globals.c:80 +msgid "Use large waypoint icons:" +msgstr "Yol işaretleri için büyük simge kullan:" + +#: ../src/globals.c:81 +msgid "Default latitude:" +msgstr "Varsayılan enlem:" + +#: ../src/globals.c:82 +msgid "Default longitude:" +msgstr "Varsayılan boylam:" + +#: ../src/globals.c:83 +msgid "Time Display:" +msgstr "" + +#: ../src/globals.c:84 +msgid "" +"Display times according to the reference frame. Locale is the user's system " +"setting. World is relative to the location of the object." +msgstr "" + +#: ../src/globals.c:90 +msgid "Alphabetical" +msgstr "" + +#: ../src/globals.c:90 ../src/datasource_osm_my_traces.c:432 +msgid "Time" +msgstr "" + +#: ../src/globals.c:90 +msgid "Creation" +msgstr "" + +#: ../src/globals.c:91 +msgid "Title Case" +msgstr "" + +#: ../src/globals.c:91 +msgid "Lowercase" +msgstr "" + +#: ../src/globals.c:94 +msgid "KML File Export Units:" +msgstr "" + +#: ../src/globals.c:95 +msgid "GPX Track Order:" +msgstr "" + +#: ../src/globals.c:96 +msgid "GPX Waypoint Symbols:" +msgstr "" + +#: ../src/globals.c:97 +msgid "" +"Save GPX Waypoint Symbol names in the specified case. May be useful for " +"compatibility with various devices" +msgstr "" + +#: ../src/globals.c:98 +msgid "GPX Creator:" +msgstr "" + +#: ../src/globals.c:99 +msgid "" +"The creator value when writing a GPX file. Otherwise when blank a default is " +"used." +msgstr "" + +#: ../src/globals.c:104 +msgid "Image Viewer:" +msgstr "" + +#: ../src/globals.c:109 +msgid "External GPX Program 1:" +msgstr "" + +#: ../src/globals.c:110 +msgid "External GPX Program 2:" +msgstr "" + +#: ../src/globals.c:113 +msgid "Absolute" +msgstr "" + +#: ../src/globals.c:113 +msgid "Relative" +msgstr "" + +#: ../src/globals.c:117 +msgid "Save File Reference Mode:" +msgstr "" + +#: ../src/globals.c:118 +msgid "" +"When saving a Viking .vik file, this determines how the directory paths of " +"filenames are written." +msgstr "" + +#: ../src/globals.c:119 +msgid "Ask for Name before Track Creation:" +msgstr "" + +#: ../src/globals.c:120 +msgid "Show Tooltip during Track Creation:" +msgstr "" + +#: ../src/globals.c:121 +msgid "The number of recent files:" +msgstr "" + +#: ../src/globals.c:122 +msgid "" +"Only applies to new windows or on application restart. -1 means all " +"available files." +msgstr "" + +#: ../src/globals.c:123 +#, fuzzy +msgid "Open files in selected layer:" +msgstr "Seçilen katmanı kaldır" + +#: ../src/globals.c:124 +msgid "Open files (but not .vik ones) into the selected TrackWaypoint layer." +msgstr "" + +#: ../src/globals.c:125 +msgid "Show calendar day names:" +msgstr "" + +#: ../src/globals.c:128 +msgid "Home Location" +msgstr "" + +#: ../src/globals.c:128 +msgid "Last Location" +msgstr "" + +#: ../src/globals.c:128 +msgid "Specified File" +msgstr "" + +#: ../src/globals.c:128 +msgid "Auto Location" +msgstr "" + +#: ../src/globals.c:131 +msgid "Restore Window Setup:" +msgstr "" + +#: ../src/globals.c:132 +msgid "Restore window size and layout" +msgstr "" + +#: ../src/globals.c:133 +msgid "Add a Default Map Layer:" +msgstr "" + +#: ../src/globals.c:134 +msgid "" +"The default map layer added is defined by the Layer Defaults. Use the menu " +"Edit->Layer Defaults->Map... to change the map type and other values." +msgstr "" + +#: ../src/globals.c:135 +msgid "Startup Method:" +msgstr "" + +#: ../src/globals.c:136 +msgid "Startup File:" +msgstr "" + +#: ../src/globals.c:137 +msgid "" +"The default file to load on startup. Only applies when the startup method is " +"set to 'Specified File'" +msgstr "" + +#: ../src/globals.c:138 +msgid "Check For New Version:" +msgstr "" + +#: ../src/globals.c:139 +msgid "Periodically check to see if a new version of Viking is available" +msgstr "" + +#. Defaults for the options are setup here +#: ../src/globals.c:176 +msgid "General" +msgstr "" + +#. New Tab +#: ../src/globals.c:204 +msgid "Startup" +msgstr "" + +#. New Tab +#: ../src/globals.c:222 +msgid "Export/External" +msgstr "" + +#. 'Advanced' Properties +#: ../src/globals.c:249 +msgid "Advanced" +msgstr "" + +#. Webtools +#: ../src/google.c:39 +msgid "Google" +msgstr "Google" + +#. If there is an actual description field it will overwrite this value +#: ../src/gpx.c:264 +#, c-format +msgid "Created by: %s" +msgstr "" + +#: ../src/datasource_bfilter.c:43 +msgid "Max number of points:" +msgstr "" + +#: ../src/datasource_bfilter.c:84 +msgid "Simplify All Tracks..." +msgstr "" + +#: ../src/datasource_bfilter.c:85 +msgid "Simplified Tracks" +msgstr "" + +#. { VIK_LAYER_NUM_TYPES, "compressmethod", VIK_LAYER_PARAM_UINT, VIK_LAYER_GROUP_NONE, N_("Simplify Method:"), VIK_LAYER_WIDGET_COMBOBOX, compress_method, NULL, NULL, NULL, NULL, NULL }, +#: ../src/datasource_bfilter.c:111 +msgid "Error Factor:" +msgstr "" + +#: ../src/datasource_bfilter.c:112 +msgid "" +"Specifies the maximum allowable error that may be introduced by removing a " +"single point by the crosstrack method. See the manual or GPSBabel Simplify " +"Filter documentation for more detail." +msgstr "" + +#: ../src/datasource_bfilter.c:166 +msgid "Compress Tracks..." +msgstr "" + +#: ../src/datasource_bfilter.c:167 +msgid "Compressed Tracks" +msgstr "" + +#: ../src/datasource_bfilter.c:197 ../src/datasource_bfilter.c:198 +msgid "Remove Duplicate Waypoints" +msgstr "" + +#: ../src/datasource_bfilter.c:221 +msgid "Manual filter:" +msgstr "" + +#: ../src/datasource_bfilter.c:222 +msgid "Manual filter command: e.g. 'swap'." +msgstr "" + +#: ../src/datasource_bfilter.c:233 ../src/datasource_bfilter.c:234 +msgid "Manual filter" +msgstr "" + +#: ../src/datasource_bfilter.c:262 +msgid "Waypoints Inside This" +msgstr "" + +#: ../src/datasource_bfilter.c:263 ../src/datasource_bfilter.c:292 +msgid "Polygonized Layer" +msgstr "" + +#: ../src/datasource_bfilter.c:291 +msgid "Waypoints Outside This" +msgstr "" + +#: ../src/datasource_file.c:61 +msgid "Import file with GPSBabel" +msgstr "" + +#: ../src/datasource_file.c:62 +msgid "Imported file" +msgstr "" + +#. The file selector +#: ../src/datasource_file.c:129 +msgid "File:" +msgstr "" + +#: ../src/datasource_file.c:130 +msgid "File to import" +msgstr "" + +#: ../src/datasource_file.c:137 +msgid "All files" +msgstr "" + +#. The file format selector +#: ../src/datasource_file.c:144 ../src/datasource_url.c:106 +msgid "File type:" +msgstr "" + +#: ../src/datasource_file.c:189 +#, c-format +msgid "using babel args '%s' and file '%s'" +msgstr "" + +#: ../src/datasource_gc.c:67 +msgid "Download Geocaches" +msgstr "" + +#: ../src/datasource_gc.c:68 +msgid "Geocaching.com Caches" +msgstr "Geocaching.com Önbellekleri" + +#: ../src/datasource_gc.c:86 +msgid "geocaching.com username:" +msgstr "geocaching.com kullanıcı adı:" + +#: ../src/datasource_gc.c:87 +msgid "geocaching.com password:" +msgstr "geocaching.com parola:" + +#: ../src/datasource_gc.c:92 ../src/vikwindow.c:3502 +msgid "Geocaching" +msgstr "" + +#: ../src/datasource_gc.c:128 +#, c-format +msgid "" +"Can't find %s or %s in path! Check that you have installed it correctly." +msgstr "" + +#: ../src/datasource_gc.c:190 +msgid "Number geocaches:" +msgstr "" + +#: ../src/datasource_gc.c:192 +msgid "Centered around:" +msgstr "" + +#: ../src/datasource_gc.c:231 +msgid "Broken input - using some defaults" +msgstr "" + +#: ../src/datasource_geotag.c:51 +msgid "Create Waypoints from Geotagged Images" +msgstr "" + +#: ../src/datasource_geotag.c:52 +msgid "Geotagged Images" +msgstr "" + +#: ../src/datasource_geotag.c:102 ../src/datasource_geojson.c:93 +#: ../src/vikfileentry.c:171 ../src/vikwindow.c:3533 ../src/vikwindow.c:3610 +#: ../src/vikwindow.c:3641 ../src/vikwindow.c:4356 ../src/vikwindow.c:4649 +msgid "All" +msgstr "" + +#: ../src/datasource_geotag.c:107 ../src/vikfileentry.c:115 +#: ../src/viktrwlayer_geotag.c:637 ../src/vikwindow.c:3518 +#: ../src/vikwindow.c:4377 +msgid "JPG" +msgstr "" + +#: ../src/datasource_geotag.c:168 +#, c-format +msgid "Unable to create waypoint from %s" +msgstr "" + +#: ../src/datasource_geojson.c:46 +msgid "Acquire from GeoJSON" +msgstr "" + +#: ../src/datasource_geojson.c:47 ../src/datasource_geojson.c:98 +msgid "GeoJSON" +msgstr "" + +#: ../src/datasource_geojson.c:152 +#, c-format +msgid "Unable to import from: %s" +msgstr "" + +#: ../src/datasource_gps.c:54 +msgid "Acquire from GPS" +msgstr "GPS den elde et" + +#: ../src/datasource_gps.c:55 +msgid "Acquired from GPS" +msgstr "GPS den elde edildi" + +#: ../src/datasource_gps.c:258 +#, c-format +msgid "using cmd '%s' and file '%s'\n" +msgstr "" + +#: ../src/datasource_gps.c:353 ../src/vikgpslayer.c:966 +#, c-format +msgid "Downloading %d waypoint..." +msgid_plural "Downloading %d waypoints..." +msgstr[0] "" +msgstr[1] "" + +#: ../src/datasource_gps.c:358 ../src/vikgpslayer.c:971 +#, c-format +msgid "Downloading %d trackpoint..." +msgid_plural "Downloading %d trackpoints..." +msgstr[0] "" +msgstr[1] "" + +#: ../src/datasource_gps.c:363 ../src/vikgpslayer.c:976 +#, c-format +msgid "Downloading %d routepoint..." +msgid_plural "Downloading %d routepoints..." +msgstr[0] "" +msgstr[1] "" + +#: ../src/datasource_gps.c:386 ../src/datasource_gps.c:393 +#: ../src/datasource_gps.c:400 +#, c-format +msgid "Downloaded %d out of %d %s..." +msgstr "" + +#: ../src/datasource_gps.c:388 ../src/datasource_gps.c:395 +#: ../src/datasource_gps.c:402 +#, c-format +msgid "Downloaded %d %s." +msgstr "İndirilen %d %s." + +#: ../src/datasource_gps.c:416 ../src/vikgpslayer.c:1134 +#, c-format +msgid "GPS Device: %s" +msgstr "GPS Cihazı: %s" + +#: ../src/datasource_gps.c:428 ../src/vikgpslayer.c:1214 +msgid "Status: Working..." +msgstr "" + +#. NB gps_layer_inst_init() is performed after parameter registeration +#. thus to give the protocols some potential values use the old static list +#. TODO: find another way to use gps_layer_inst_init()? +#: ../src/datasource_gps.c:584 ../src/vikgpslayer.c:216 +msgid "GPS Protocol:" +msgstr "GPS Protokolü:" + +#. List reassigned at runtime +#: ../src/datasource_gps.c:609 ../src/vikgpslayer.c:217 +msgid "Serial Port:" +msgstr "Seri Port:" + +#: ../src/datasource_gps.c:659 +msgid "" +"Turn Off After Transfer\n" +"(Garmin/NAViLink Only)" +msgstr "" + +#: ../src/datasource_gps.c:666 +msgid "Tracks:" +msgstr "" + +#: ../src/datasource_gps.c:673 +msgid "Routes:" +msgstr "" + +#: ../src/datasource_gps.c:680 +msgid "Waypoints:" +msgstr "" + +#: ../src/datasource_gps.c:756 ../src/vikgpslayer.c:1509 +msgid "GPS device: N/A" +msgstr "GPS cihazı: yok" + +#: ../src/datasource_osm.c:53 ../src/datasource_osm.c:54 +msgid "OSM traces" +msgstr "" + +#: ../src/datasource_osm.c:89 +msgid "Page number:" +msgstr "" + +#: ../src/datasource_osm_my_traces.c:59 ../src/datasource_osm_my_traces.c:60 +msgid "OSM My Traces" +msgstr "" + +#: ../src/datasource_osm_my_traces.c:106 ../src/osm-traces.c:684 +#, fuzzy +msgid "Email/username:" +msgstr "OSM kullanıcı adı:" + +#: ../src/datasource_osm_my_traces.c:111 +msgid "The email or username used to login to OSM" +msgstr "" + +#: ../src/datasource_osm_my_traces.c:113 ../src/osm-traces.c:692 +msgid "Password:" +msgstr "Parola :" + +#: ../src/datasource_osm_my_traces.c:116 +msgid "The password used to login to OSM" +msgstr "" + +#: ../src/datasource_osm_my_traces.c:427 ../src/viktrwlayer.c:689 +msgid "Description" +msgstr "" + +#: ../src/datasource_osm_my_traces.c:442 +msgid "Privacy" +msgstr "" + +#: ../src/datasource_osm_my_traces.c:449 +msgid "Within Current View" +msgstr "" + +#: ../src/datasource_osm_my_traces.c:516 +msgid "GPS Traces" +msgstr "" + +#: ../src/datasource_osm_my_traces.c:518 +msgid "None found!" +msgstr "" + +#: ../src/datasource_osm_my_traces.c:569 +msgid "Ensure the OSM access token preferences are setup." +msgstr "" + +#: ../src/datasource_osm_my_traces.c:645 +msgid "My OSM Traces" +msgstr "" + +#. Report errors to the status bar +#: ../src/datasource_osm_my_traces.c:667 +#, c-format +msgid "Unable to get trace: %s" +msgstr "" + +#: ../src/datasource_routing.c:56 ../src/datasource_routing.c:57 +msgid "Directions" +msgstr "" + +#: ../src/datasource_routing.c:90 +msgid "No routing engines with directions available" +msgstr "" + +#. Engine selector +#: ../src/datasource_routing.c:99 +msgid "Engine:" +msgstr "" + +#. From and To entries +#: ../src/datasource_routing.c:104 +msgid "From:" +msgstr "Nereden:" + +#: ../src/datasource_routing.c:105 +msgid "To:" +msgstr "Nereye:" + +#: ../src/datasource_url.c:48 +msgid "Acquire from URL" +msgstr "" + +#: ../src/datasource_url.c:49 +msgid "URL" +msgstr "" + +#: ../src/datasource_url.c:101 +msgid "URL:" +msgstr "" + +#. Only GPX (not using GPSbabel) +#: ../src/datasource_url.c:133 ../src/vikfileentry.c:161 +#: ../src/vikwindow.c:3513 ../src/vikwindow.c:3603 +msgid "GPX" +msgstr "" + +#: ../src/datasource_wikipedia.c:32 +msgid "Create Waypoints from Wikipedia Articles" +msgstr "" + +#: ../src/datasource_wikipedia.c:33 +msgid "Wikipedia Waypoints" +msgstr "" + +#: ../src/dem.c:66 ../src/dem.c:80 +msgid "Invalid DEM" +msgstr "Geçersiz DEM" + +#: ../src/dem.c:122 +msgid "Invalid DEM header" +msgstr "" + +#: ../src/dem.c:191 ../src/dem.c:204 +msgid "Incorrect DEM Class B record: expected 1" +msgstr "" + +#: ../src/dem.c:289 ../src/download.c:176 +#, c-format +msgid "Couldn't map file %s: %s" +msgstr "" + +#: ../src/download.c:130 +msgid "Tile age (days):" +msgstr "" + +#: ../src/download.c:406 +#, c-format +msgid "Download error: %s" +msgstr "İndirme hatası: %s" + +#: ../src/download.c:490 +msgid "couldn't open temp file" +msgstr "Geçici dosya açılamadı" + +#: ../src/file.c:458 ../src/file.c:463 +#, c-format +msgid "Draw mode '%s' no more supported" +msgstr "" + +#: ../src/geotag_exif.c:621 +msgid "Not enough memory." +msgstr "" + +#: ../src/geotag_exif.c:639 +msgid "Setting a value for this tag is unsupported!" +msgstr "" + +#: ../src/geotag_exif.c:658 +#, c-format +msgid "Too few components specified (need %d, found %d)\n" +msgstr "" + +#: ../src/geotag_exif.c:662 +msgid "Numeric value expected\n" +msgstr "" + +#: ../src/geotag_exif.c:670 +msgid "This shouldn't happen!" +msgstr "" + +#: ../src/geotag_exif.c:740 +msgid "Not yet implemented!" +msgstr "" + +#: ../src/geotag_exif.c:753 +msgid "Warning; Too many components specified!" +msgstr "" + +#: ../src/osm-traces.c:87 +msgid "Identifiable (public w/ timestamps)" +msgstr "" + +#: ../src/osm-traces.c:88 +msgid "Trackable (private w/ timestamps)" +msgstr "" + +#: ../src/osm-traces.c:89 +msgid "Public" +msgstr "Genel" + +#: ../src/osm-traces.c:90 +msgid "Private" +msgstr "Özel" + +#: ../src/osm-traces.c:108 +msgid "Access Token:" +msgstr "" + +#: ../src/osm-traces.c:108 +msgid "Get New OSM Access Tokens" +msgstr "" + +#: ../src/osm-traces.c:109 +msgid "Access Token Key:" +msgstr "" + +#: ../src/osm-traces.c:110 +msgid "Access Token Secret:" +msgstr "" + +#: ../src/osm-traces.c:111 +msgid "OSM username:" +msgstr "OSM kullanıcı adı:" + +#: ../src/osm-traces.c:112 +msgid "OSM password:" +msgstr "OSM parola:" + +#. Check to really override existing values... +#: ../src/osm-traces.c:263 +msgid "Do you want to overwrite existing values?" +msgstr "" + +#: ../src/osm-traces.c:275 +msgid "Not able to generate OSM request tokens." +msgstr "" + +#: ../src/osm-traces.c:299 +msgid "" +"Waiting for authorization approval.\n" +"Ensure you have granted access at the website before continuing here." +msgstr "" + +#: ../src/osm-traces.c:315 +msgid "No Authorization." +msgstr "" + +#: ../src/osm-traces.c:354 +msgid "" +"OSM Username and Password preferences are not required anymore. You can now " +"remove them." +msgstr "" + +#. Preferences +#: ../src/osm-traces.c:379 +msgid "OpenStreetMap Traces" +msgstr "" + +#: ../src/osm-traces.c:504 +#, c-format +msgid "failed to upload data: HTTP response is %ld" +msgstr "" + +#: ../src/osm-traces.c:509 +#, c-format +msgid "curl_easy_getinfo failed: %d" +msgstr "" + +#: ../src/osm-traces.c:514 +#, c-format +msgid "curl request failed: %s" +msgstr "" + +#. Success +#: ../src/osm-traces.c:592 +msgid "Uploaded to OSM" +msgstr "" + +#: ../src/osm-traces.c:596 +msgid "" +"FAILED TO UPLOAD DATA TO OSM - Ensure the OSM access token preferences are " +"setup." +msgstr "" + +#: ../src/osm-traces.c:599 +msgid "FAILED TO UPLOAD DATA TO OSM - CURL PROBLEM" +msgstr "" + +#: ../src/osm-traces.c:602 +msgid "FAILED TO UPLOAD DATA TO OSM" +msgstr "" + +#: ../src/osm-traces.c:602 +msgid "HTTP response code" +msgstr "" + +#: ../src/osm-traces.c:610 +#, c-format +msgid "failed to unlink temporary file: %s" +msgstr "" + +#: ../src/osm-traces.c:664 +msgid "OSM upload" +msgstr "OSM yükle" + +#: ../src/osm-traces.c:689 +#, fuzzy +msgid "" +"The email/username used as login\n" +"Enter the email/username you use to login into www.openstreetmap.org." +"" +msgstr "" +"Giriş e-posta\n" +"www.openstreetmap.org a giriş için kullandığınız e-posta adresini " +"yazın." + +#: ../src/osm-traces.c:697 +msgid "" +"The password used to login\n" +"Enter the password you use to login into www.openstreetmap.org." +msgstr "" +"Giriş parola\n" +"www.openstreetmap.org a giriş için kullandığınız parolayı yazın." + +#: ../src/osm-traces.c:703 +msgid "File's name:" +msgstr "Dosya adı:" + +#: ../src/osm-traces.c:713 +msgid "" +"The name of the file on OSM\n" +"This is the name of the file created on the server.This is not the " +"name of the local file." +msgstr "" + +#: ../src/osm-traces.c:717 ../src/viktrwlayer_wpwin.c:197 +#: ../src/viktrwlayer_wpwin.c:199 +msgid "Description:" +msgstr "Açıklama:" + +#: ../src/osm-traces.c:731 +msgid "The description of the trace" +msgstr "" + +#: ../src/osm-traces.c:734 +msgid "Anonymize Times:" +msgstr "" + +#: ../src/osm-traces.c:739 +msgid "" +"Anonymize times of the trace.\n" +"You may choose to make the trace identifiable, yet mask the actual " +"real time values" +msgstr "" + +#: ../src/osm-traces.c:743 +msgid "Tags:" +msgstr "Etiketler:" + +#: ../src/osm-traces.c:751 +msgid "The tags associated to the trace" +msgstr "" + +#: ../src/osm-traces.c:816 +#, c-format +msgid "Uploading %s to OSM" +msgstr "OSM den %s yükleniyor" + +#: ../src/mapcache.c:67 +msgid "Map cache memory size (MB):" +msgstr "" + +#. NB Can have a couple hundred fonts loaded when using system directories +#. So ATM don't list them all - otherwise need better GUI feedback display. +#: ../src/mapnik_interface.cpp:324 +#, c-format +msgid "" +"%s %s\n" +"Plugins=%sFonts loaded=%d" +msgstr "" + +#: ../src/mapnik_interface.cpp:325 ../src/vikmapniklayer.c:278 +msgid "Mapnik" +msgstr "" + +#: ../src/print.c:51 ../src/viktrwlayer.c:572 +msgid "None" +msgstr "Hiçbiri" + +#: ../src/print.c:52 +msgid "Horizontally" +msgstr "Yatay olarak" + +#: ../src/print.c:53 +msgid "Vertically" +msgstr "Dikey olarak" + +#: ../src/print.c:54 +msgid "Both" +msgstr "Her ikisi de" + +#: ../src/print.c:118 +msgid "Image Settings" +msgstr "Görüntü Ayarları" + +#: ../src/print.c:551 +msgid "done" +msgstr "bitti" + +#. Page Size +#: ../src/print.c:580 +msgid "_Adjust Page Size and Orientation" +msgstr "" + +#: ../src/print.c:596 +msgid "C_enter:" +msgstr "_Merkez:" + +#. ignore page margins +#: ../src/print.c:614 +msgid "Ignore Page _Margins" +msgstr "Sayfa _Kenarlarını Yoksay" + +#: ../src/print.c:633 +msgid "Image S_ize:" +msgstr "Resim B_oyutu" + +#: ../src/ui_util.c:88 +#, c-format +msgid "Could not launch web browser. %s" +msgstr "" + +#: ../src/ui_util.c:101 +#, c-format +msgid "Could not create new email. %s" +msgstr "" + +#: ../src/vikcoordlayer.c:57 +msgid "Color:" +msgstr "Renk :" + +#: ../src/vikcoordlayer.c:58 +msgid "Minutes Width:" +msgstr "" + +#: ../src/vikcoordlayer.c:59 +msgid "Line Thickness:" +msgstr "" + +#: ../src/vikcoordlayer.c:66 +msgid "Coordinate" +msgstr "" + +#: ../src/main.c:92 +#, c-format +msgid "Ignoring Xlib error: error code %d request code %d\n" +msgstr "" + +#: ../src/main.c:111 +msgid "Enable debug output" +msgstr "Hata ayıklama çıktısını etkinleştir" + +#: ../src/main.c:112 +msgid "Enable verbose output" +msgstr "Detaylı çıktıyı etkinleştir" + +#: ../src/main.c:113 +msgid "Show version" +msgstr "Sürümü göster" + +#: ../src/main.c:114 +msgid "Latitude in decimal degrees" +msgstr "" + +#: ../src/main.c:115 +msgid "Longitude in decimal degrees" +msgstr "" + +#: ../src/main.c:116 +msgid "Zoom Level (OSM). Value can be 0 - 22" +msgstr "" + +#: ../src/main.c:117 +msgid "Add a map layer by id value. Use 0 for the default map." +msgstr "" + +#: ../src/main.c:160 +#, c-format +msgid "" +"%s %s\n" +"Copyright (c) 2003-2008 Evan Battaglia\n" +"Copyright (c) 2008-%s Viking's contributors\n" +msgstr "" + +#: ../src/osm.c:50 +msgid "OpenStreetMap (Mapnik)" +msgstr "" + +#: ../src/osm.c:65 +msgid "OpenStreetMap (Cycle)" +msgstr "" + +#: ../src/osm.c:79 +msgid "OpenStreetMap (Transport)" +msgstr "" + +#: ../src/osm.c:95 +msgid "OpenStreetMap (Humanitarian)" +msgstr "" + +#: ../src/osm.c:111 +msgid "On Disk OSM Tile Format" +msgstr "" + +#: ../src/osm.c:121 +msgid "MBTiles File" +msgstr "" + +#: ../src/osm.c:132 +msgid "OSM Metatiles" +msgstr "" + +#: ../src/osm.c:146 +msgid "Mapbox Outdoors" +msgstr "" + +#: ../src/osm.c:153 +msgid "Mapbox Specific" +msgstr "" + +#: ../src/osm.c:170 +msgid "OSM (view)" +msgstr "OSM (görünüm)" + +#: ../src/osm.c:174 +msgid "OSM (edit)" +msgstr "OSM (düzenle)" + +#. Note the use of positional parameters +#: ../src/osm.c:179 +msgid "OSM (query)" +msgstr "" + +#: ../src/osm.c:183 +msgid "OSM (render)" +msgstr "OSM (tara)" + +#. Example: http://127.0.0.1:8111/load_and_zoom?left=8.19&right=8.20&top=48.605&bottom=48.590&select=node413602999 +#. JOSM or merkaartor must already be running with remote interface enabled +#: ../src/osm.c:190 +msgid "Local port 8111 (eg JOSM)" +msgstr "" + +#: ../src/osm.c:195 +msgid "Geofabrik Map Compare" +msgstr "" + +#: ../src/osm.c:203 +msgid "OpenStreetMap Notes" +msgstr "" + +#. Not really OSM but can't be bothered to create somewhere else to put it... +#: ../src/osm.c:221 +msgid "Wikimedia Toolserver GeoHack" +msgstr "" + +#: ../src/preferences.c:195 +msgid "Preferences" +msgstr "Tercihler" + +#: ../src/toolbar.c:91 ../src/toolbar.c:92 +msgid "System Default" +msgstr "" + +#: ../src/toolbar.c:91 ../src/viktrwlayer.c:563 +msgid "Small" +msgstr "" + +#: ../src/toolbar.c:91 ../src/viktrwlayer.c:564 +msgid "Medium" +msgstr "" + +#: ../src/toolbar.c:91 ../src/viktrwlayer.c:565 +msgid "Large" +msgstr "" + +#: ../src/toolbar.c:92 +msgid "Icons Only" +msgstr "" + +#: ../src/toolbar.c:92 +msgid "Text Only" +msgstr "" + +#: ../src/toolbar.c:92 +msgid "Icons and Text" +msgstr "" + +#: ../src/toolbar.c:106 +msgid "Append to Menu:" +msgstr "" + +#: ../src/toolbar.c:107 +msgid "Pack the toolbar to the main menu to save vertical space" +msgstr "" + +#: ../src/toolbar.c:108 +msgid "Icon Size:" +msgstr "" + +#: ../src/toolbar.c:110 +msgid "Icon Style:" +msgstr "" + +#: ../src/toolbar.c:112 +msgid "Customize:" +msgstr "" + +#: ../src/toolbar.c:112 +msgid "Customize Buttons" +msgstr "" + +#. Preferences +#: ../src/toolbar.c:145 +msgid "Toolbar" +msgstr "" + +#: ../src/toolbar.c:312 +msgid "_Customize" +msgstr "" + +#: ../src/toolbar.c:641 +msgid "Separator" +msgstr "" + +#: ../src/toolbar.c:642 +msgid "--- Separator ---" +msgstr "" + +#: ../src/toolbar.c:1007 +msgid "Customize Toolbar" +msgstr "" + +#: ../src/toolbar.c:1028 +msgid "" +"Select items to be displayed on the toolbar. Items can be reordered by drag " +"and drop." +msgstr "" + +#: ../src/toolbar.c:1044 +msgid "Available Items" +msgstr "" + +#: ../src/toolbar.c:1065 +msgid "Displayed Items" +msgstr "" + +#: ../src/viklayer_defaults.c:232 +#, c-format +msgid "Could not open file: %s" +msgstr "" + +#: ../src/viklayer_defaults.c:304 +msgid "Layer Defaults" +msgstr "" + +#: ../src/uibuilder.c:196 +msgid "Take care that this password will be stored clearly in a plain file." +msgstr "" + +#: ../src/uibuilder.c:628 ../src/viktrwlayer_export.c:188 +#: ../src/viktrwlayer_export.c:304 ../src/vikwindow.c:3666 +#: ../src/vikwindow.c:4408 +#, c-format +msgid "The file \"%s\" exists, do you wish to overwrite it?" +msgstr "" + +#: ../src/vikaggregatelayer.c:41 +msgid "Aggregate" +msgstr "" + +#: ../src/vikaggregatelayer.c:528 ../src/viktrwlayer.c:11700 +#, c-format +msgid "%s: Waypoint List" +msgstr "" + +#: ../src/vikaggregatelayer.c:570 +msgid "Search by Date" +msgstr "" + +#: ../src/vikaggregatelayer.c:576 +msgid "No items found with the requested date." +msgstr "" + +#: ../src/vikaggregatelayer.c:615 ../src/viktrwlayer.c:11691 +#, c-format +msgid "%s: Track and Route List" +msgstr "" + +#: ../src/vikaggregatelayer.c:681 ../src/viktrwlayer.c:8346 +#: ../src/viktrwlayer.c:8417 ../src/viktrwlayer.c:8494 +msgid "_Visibility" +msgstr "" + +#: ../src/vikaggregatelayer.c:686 +msgid "_Show All" +msgstr "" + +#: ../src/vikaggregatelayer.c:692 +msgid "_Hide All" +msgstr "" + +#: ../src/vikaggregatelayer.c:698 ../src/viktrwlayer.c:8363 +#: ../src/viktrwlayer.c:8434 ../src/viktrwlayer.c:8511 +msgid "_Toggle" +msgstr "" + +#: ../src/vikaggregatelayer.c:705 ../src/viktrwlayer.c:8532 +msgid "_Sort" +msgstr "" + +#: ../src/vikaggregatelayer.c:711 ../src/viktrwlayer.c:8538 +msgid "Name _Ascending" +msgstr "" + +#: ../src/vikaggregatelayer.c:717 ../src/viktrwlayer.c:8544 +msgid "Name _Descending" +msgstr "" + +#: ../src/vikaggregatelayer.c:723 ../src/viktrwlayer.c:575 +#: ../src/viktrwlayer.c:8550 +msgid "Date Ascending" +msgstr "" + +#: ../src/vikaggregatelayer.c:729 ../src/viktrwlayer.c:576 +#: ../src/viktrwlayer.c:8556 +msgid "Date Descending" +msgstr "" + +#: ../src/vikaggregatelayer.c:735 ../src/viktrwlayer.c:8445 +#: ../src/viktrwlayer.c:8523 ../src/viktrwlayer.c:8595 +#: ../src/viktrwlayer_tracklist.c:296 +msgid "_Statistics" +msgstr "" + +#: ../src/vikaggregatelayer.c:740 ../src/viktrwlayer.c:4533 +msgid "Track _List..." +msgstr "" + +#: ../src/vikaggregatelayer.c:746 ../src/viktrwlayer.c:4540 +msgid "_Waypoint List..." +msgstr "" + +#: ../src/vikaggregatelayer.c:753 +msgid "Searc_h" +msgstr "" + +#: ../src/vikaggregatelayer.c:759 +msgid "By _Date..." +msgstr "" + +#: ../src/vikaggregatelayer.c:762 +msgid "Find the first item with a specified date" +msgstr "" + +#: ../src/vikaggregatelayer.c:765 +msgid "Load E_xternal Layers" +msgstr "" + +#. Could have a more complicated tooltip that numbers each type of layers, +#. but for now a simple overall count +#: ../src/vikaggregatelayer.c:1011 +#, c-format +msgid "One layer" +msgid_plural "%d layers" +msgstr[0] "" +msgstr[1] "" + +#: ../src/vikaggregatelayer.c:1014 +#, c-format +msgid "Empty" +msgstr "" + +#: ../src/vikdemlayer.c:86 +msgid "SRTM Global 90m (3 arcsec)" +msgstr "" + +#: ../src/vikdemlayer.c:94 +msgid "Absolute height" +msgstr "Mutlak yükseklik" + +#: ../src/vikdemlayer.c:95 +msgid "Height gradient" +msgstr "" + +#: ../src/vikdemlayer.c:120 +msgid "DEM Files:" +msgstr "DEM Dosyalar:" + +#: ../src/vikdemlayer.c:121 +msgid "Download Source:" +msgstr "İndirme Kaynağı" + +#: ../src/vikdemlayer.c:122 +msgid "Min Elev Color:" +msgstr "" + +#: ../src/vikdemlayer.c:123 ../src/viktrwlayer_wpwin.c:207 +msgid "Type:" +msgstr "Tür:" + +#: ../src/vikdemlayer.c:124 +msgid "Min Elev:" +msgstr "" + +#: ../src/vikdemlayer.c:125 +msgid "Max Elev:" +msgstr "" + +#: ../src/vikdemlayer.c:137 +msgid "_DEM Download" +msgstr "" + +#: ../src/vikdemlayer.c:137 +msgid "DEM Download" +msgstr "" + +#: ../src/vikdemlayer.c:192 +msgid "DEM" +msgstr "" + +#: ../src/vikdemlayer.c:304 +#, c-format +msgid "Number of files: %d" +msgstr "" + +#: ../src/vikdemlayer.c:446 +msgid "DEM Loading" +msgstr "DEM Yükleniyor" + +#: ../src/vikdemlayer.c:927 +#, c-format +msgid "No SRTM data available for %f, %f" +msgstr "" + +#: ../src/vikdemlayer.c:948 +#, c-format +msgid "DEM download failure for %f, %f" +msgstr "" + +#: ../src/vikdemlayer.c:954 +#, c-format +msgid "DEM write failure for %s" +msgstr "" + +#. Probably not over any land... +#: ../src/vikdemlayer.c:1201 +msgid "No DEM File Available" +msgstr "" + +#: ../src/vikdemlayer.c:1220 +#, c-format +msgid "" +"\n" +"Source: %s\n" +"\n" +"DEM File: %s\n" +"DEM File Timestamp: %s" +msgstr "" + +#: ../src/vikdemlayer.c:1224 +#, c-format +msgid "" +"Source: %s\n" +"\n" +"No DEM File!" +msgstr "" + +#: ../src/vikdemlayer.c:1264 +#, c-format +msgid "Downloading DEM %s" +msgstr "DEM %s indiriliyor" + +#: ../src/vikdemlayer.c:1289 +msgid "_Show DEM File Information" +msgstr "" + +#: ../src/vikfileentry.c:72 +msgid "Browse..." +msgstr "Göz at..." + +#: ../src/vikfileentry.c:103 +msgid "Choose file" +msgstr "Dosya seç" + +#: ../src/vikfileentry.c:120 ../src/vikwindow.c:4372 +msgid "PNG" +msgstr "" + +#: ../src/vikfileentry.c:125 +msgid "TIFF" +msgstr "" + +#: ../src/vikfileentry.c:133 +msgid "MBTiles" +msgstr "" + +#: ../src/vikfileentry.c:142 +msgid "XML" +msgstr "" + +#: ../src/vikfileentry.c:149 +msgid "MML" +msgstr "" + +#: ../src/vikfileentry.c:154 +msgid "MSS" +msgstr "" + +#: ../src/vikfilelist.c:49 +msgid "Choose file(s)" +msgstr "Dosya seçin" + +#: ../src/vikfilelist.c:182 +msgid "Add..." +msgstr "Ekle..." + +#: ../src/vikfilelist.c:183 +msgid "Delete" +msgstr "Sil" + +#: ../src/vikgeoreflayer.c:97 +msgid "_Georef Move Map" +msgstr "" + +#: ../src/vikgeoreflayer.c:97 +msgid "Georef Move Map" +msgstr "" + +#: ../src/vikgeoreflayer.c:106 +msgid "Georef Z_oom Tool" +msgstr "" + +#: ../src/vikgeoreflayer.c:106 +msgid "Georef Zoom Tool" +msgstr "" + +#: ../src/vikgeoreflayer.c:117 +msgid "GeoRef Map" +msgstr "" + +#: ../src/vikgeoreflayer.c:214 +msgid "Auto Read World Files:" +msgstr "" + +#: ../src/vikgeoreflayer.c:215 +msgid "" +"Automatically attempt to read associated world file of a new image for a " +"GeoRef layer" +msgstr "" + +#: ../src/vikgeoreflayer.c:511 ../src/vikgeoreflayer.c:797 +#: ../src/vikmapslayer.c:1174 +#, c-format +msgid "Couldn't open image file: %s" +msgstr "" + +#: ../src/vikgeoreflayer.c:607 ../src/vikgeoreflayer.c:633 +msgid "Choose World file" +msgstr "Dünya dosyası seçin" + +#: ../src/vikgeoreflayer.c:619 +msgid "The World file you requested could not be opened for reading." +msgstr "" + +#: ../src/vikgeoreflayer.c:621 +msgid "Unexpected end of file reading World file." +msgstr "" + +#: ../src/vikgeoreflayer.c:646 +msgid "The file you requested could not be opened for writing." +msgstr "" + +#: ../src/vikgeoreflayer.c:782 +msgid "Lower right corner values may not be consistent with upper right values" +msgstr "" + +#: ../src/vikgeoreflayer.c:806 +#, c-format +msgid "Invalid image size: %s" +msgstr "" + +#: ../src/vikgeoreflayer.c:831 ../src/viklayer.c:561 ../src/vikwindow.c:4891 +msgid "Layer Properties" +msgstr "Katman Özellikleri" + +#: ../src/vikgeoreflayer.c:852 +msgid "World File Parameters:" +msgstr "Dünya Dosya Parametreleri:" + +#: ../src/vikgeoreflayer.c:853 +msgid "Load From File..." +msgstr "Dosyadan Yükle..." + +#: ../src/vikgeoreflayer.c:858 +msgid "Corner pixel easting:" +msgstr "" + +#: ../src/vikgeoreflayer.c:860 +msgid "the UTM \"easting\" value of the upper-left corner pixel of the map" +msgstr "" + +#: ../src/vikgeoreflayer.c:862 +msgid "Corner pixel northing:" +msgstr "" + +#: ../src/vikgeoreflayer.c:864 +msgid "the UTM \"northing\" value of the upper-left corner pixel of the map" +msgstr "" + +#: ../src/vikgeoreflayer.c:866 +msgid "X (easting) scale (mpp): " +msgstr "" + +#: ../src/vikgeoreflayer.c:867 +msgid "Y (northing) scale (mpp): " +msgstr "" + +#: ../src/vikgeoreflayer.c:870 +msgid "the scale of the map in the X direction (meters per pixel)" +msgstr "" + +#: ../src/vikgeoreflayer.c:872 +msgid "the scale of the map in the Y direction (meters per pixel)" +msgstr "" + +#: ../src/vikgeoreflayer.c:874 +msgid "Map Image:" +msgstr "Harita Görüntüsü:" + +#: ../src/vikgeoreflayer.c:919 +msgid "Upper left latitude:" +msgstr "" + +#: ../src/vikgeoreflayer.c:921 +msgid "Upper left longitude:" +msgstr "" + +#: ../src/vikgeoreflayer.c:923 +msgid "Lower right latitude:" +msgstr "" + +#: ../src/vikgeoreflayer.c:925 +msgid "Lower right longitude:" +msgstr "" + +#: ../src/vikgeoreflayer.c:937 +msgid "Calculate MPP values from coordinates" +msgstr "" + +#: ../src/vikgeoreflayer.c:938 +msgid "" +"Enter all corner coordinates before calculating the MPP values from the " +"image size" +msgstr "" + +#: ../src/vikgeoreflayer.c:948 +msgid "UTM" +msgstr "" + +#: ../src/vikgeoreflayer.c:949 +msgid "Latitude/Longitude" +msgstr "" + +#: ../src/vikgeoreflayer.c:957 ../src/vikmapniklayer.c:82 +#: ../src/vikmapslayer.c:158 +msgid "Alpha:" +msgstr "Alfa:" + +#. Now with icons +#: ../src/vikgeoreflayer.c:1062 +msgid "_Zoom to Fit Map" +msgstr "" + +#: ../src/vikgeoreflayer.c:1068 +msgid "_Goto Map Center" +msgstr "_Harite Merkezine Git" + +#: ../src/vikgeoreflayer.c:1074 +msgid "_Export to World File" +msgstr "" + +#: ../src/vikgoto.c:98 +msgid "No goto tool available." +msgstr "" + +#: ../src/vikgoto.c:295 +msgid "goto" +msgstr "git" + +#: ../src/vikgoto.c:297 +msgid "goto provider:" +msgstr "sağlayıcıya git:" + +#: ../src/vikgoto.c:312 +msgid "Enter address or place name:" +msgstr "Adres veya yer adı girin:" + +#: ../src/vikgoto.c:487 +msgid "Locality" +msgstr "" + +#: ../src/vikgpslayer.c:137 +msgid "Data Mode" +msgstr "" + +#: ../src/vikgpslayer.c:139 +msgid "Realtime Tracking Mode" +msgstr "" + +#: ../src/vikgpslayer.c:176 +msgid "Keep vehicle at center" +msgstr "" + +#: ../src/vikgpslayer.c:177 +msgid "Keep vehicle on screen" +msgstr "" + +#: ../src/vikgpslayer.c:178 +msgid "Disable" +msgstr "" + +#: ../src/vikgpslayer.c:218 +msgid "Download Tracks:" +msgstr "" + +#: ../src/vikgpslayer.c:219 +msgid "Upload Tracks:" +msgstr "" + +#: ../src/vikgpslayer.c:220 +msgid "Download Routes:" +msgstr "" + +#: ../src/vikgpslayer.c:221 +msgid "Upload Routes:" +msgstr "" + +#: ../src/vikgpslayer.c:222 +msgid "Download Waypoints:" +msgstr "" + +#: ../src/vikgpslayer.c:223 +msgid "Upload Waypoints:" +msgstr "" + +#: ../src/vikgpslayer.c:225 +msgid "Recording tracks" +msgstr "" + +#: ../src/vikgpslayer.c:226 +msgid "Jump to current position on start" +msgstr "" + +#: ../src/vikgpslayer.c:227 +msgid "Moving Map Method:" +msgstr "" + +#: ../src/vikgpslayer.c:228 +msgid "Update Statusbar:" +msgstr "" + +#: ../src/vikgpslayer.c:228 +msgid "Display information in the statusbar on GPS updates" +msgstr "" + +#: ../src/vikgpslayer.c:229 +msgid "Auto Connect" +msgstr "" + +#: ../src/vikgpslayer.c:229 +msgid "Automatically connect to GPSD" +msgstr "" + +#: ../src/vikgpslayer.c:230 +msgid "Gpsd Host:" +msgstr "" + +#: ../src/vikgpslayer.c:231 +msgid "Gpsd Port:" +msgstr "" + +#: ../src/vikgpslayer.c:232 +msgid "Gpsd Retry Interval (seconds):" +msgstr "Gpsd Yeniden Deneme Aralığı (saniye):" + +#: ../src/vikgpslayer.c:254 +msgid "GPS" +msgstr "" + +#: ../src/vikgpslayer.c:320 ../src/vikgpslayer.c:1504 +msgid "GPS Download" +msgstr "GPS İndir" + +#: ../src/vikgpslayer.c:320 ../src/vikgpslayer.c:1504 ../src/viktrwlayer.c:3993 +msgid "GPS Upload" +msgstr "GPS Yükle" + +#: ../src/vikgpslayer.c:322 +msgid "GPS Realtime Tracking" +msgstr "GPS Gerçek zamanlı izleme" + +#: ../src/vikgpslayer.c:458 +msgid "Connected" +msgstr "" + +#: ../src/vikgpslayer.c:460 +msgid "Disconnected" +msgstr "" + +#: ../src/vikgpslayer.c:554 +msgid "Unknown GPS Protocol" +msgstr "Bilinmeyen GPS Protokolü" + +#: ../src/vikgpslayer.c:572 +msgid "Unknown serial port device" +msgstr "" + +#: ../src/vikgpslayer.c:691 +#, c-format +msgid "%s: unknown parameter" +msgstr "%s: bilinmeyen parametre" + +#. Now with icons +#: ../src/vikgpslayer.c:794 +msgid "_Upload to GPS" +msgstr "" + +#: ../src/vikgpslayer.c:800 +msgid "Download from _GPS" +msgstr "" + +#: ../src/vikgpslayer.c:821 +msgid "Empty _Realtime" +msgstr "" + +#: ../src/vikgpslayer.c:828 +msgid "E_mpty Upload" +msgstr "" + +#: ../src/vikgpslayer.c:834 +msgid "_Empty Download" +msgstr "" + +#: ../src/vikgpslayer.c:840 +msgid "Empty _All" +msgstr "" + +#: ../src/vikgpslayer.c:852 +#, c-format +msgid "Unexpected number of disconnected handlers: %d" +msgstr "" + +#: ../src/vikgpslayer.c:995 +#, c-format +msgid "Uploading %d waypoint..." +msgid_plural "Uploading %d waypoints..." +msgstr[0] "" +msgstr[1] "" + +#: ../src/vikgpslayer.c:1000 +#, c-format +msgid "Uploading %d trackpoint..." +msgid_plural "Uploading %d trackpoints..." +msgstr[0] "" +msgstr[1] "" + +#: ../src/vikgpslayer.c:1005 +#, c-format +msgid "Uploading %d routepoint..." +msgid_plural "Uploading %d routepoints..." +msgstr[0] "" +msgstr[1] "" + +#: ../src/vikgpslayer.c:1034 +#, c-format +msgid "Downloaded %d out of %d waypoint..." +msgid_plural "Downloaded %d out of %d waypoints..." +msgstr[0] "" +msgstr[1] "" + +#: ../src/vikgpslayer.c:1040 +#, c-format +msgid "Downloaded %d out of %d trackpoint..." +msgid_plural "Downloaded %d out of %d trackpoints..." +msgstr[0] "" +msgstr[1] "" + +#: ../src/vikgpslayer.c:1046 +#, c-format +msgid "Downloaded %d out of %d routepoint..." +msgid_plural "Downloaded %d out of %d routepoints..." +msgstr[0] "" +msgstr[1] "" + +#: ../src/vikgpslayer.c:1056 +#, c-format +msgid "Uploaded %d out of %d waypoint..." +msgid_plural "Uploaded %d out of %d waypoints..." +msgstr[0] "" +msgstr[1] "" + +#: ../src/vikgpslayer.c:1062 +#, c-format +msgid "Uploaded %d out of %d trackpoint..." +msgid_plural "Uploaded %d out of %d trackpoints..." +msgstr[0] "" +msgstr[1] "" + +#: ../src/vikgpslayer.c:1068 +#, c-format +msgid "Uploaded %d out of %d routepoint..." +msgid_plural "Uploaded %d out of %d routepoints..." +msgstr[0] "" +msgstr[1] "" + +#: ../src/vikgpslayer.c:1079 +#, c-format +msgid "Downloaded %d waypoint" +msgid_plural "Downloaded %d waypoints" +msgstr[0] "Yol işaretleri Yükleniyor %d" + +#: ../src/vikgpslayer.c:1085 +#, c-format +msgid "Downloaded %d trackpoint" +msgid_plural "Downloaded %d trackpoints" +msgstr[0] "" +msgstr[1] "" + +#: ../src/vikgpslayer.c:1091 +#, c-format +msgid "Downloaded %d routepoint" +msgid_plural "Downloaded %d routepoints" +msgstr[0] "" +msgstr[1] "" + +#: ../src/vikgpslayer.c:1101 +#, c-format +msgid "Uploaded %d waypoint" +msgid_plural "Uploaded %d waypoints" +msgstr[0] "Yol işaretleri Yükleniyor %d" + +#: ../src/vikgpslayer.c:1107 +#, c-format +msgid "Uploaded %d trackpoint" +msgid_plural "Uploaded %d trackpoints" +msgstr[0] "Güzergah Yükleniyor %d" + +#: ../src/vikgpslayer.c:1113 +#, c-format +msgid "Uploaded %d routepoint" +msgid_plural "Uploaded %d routepoints" +msgstr[0] "" +msgstr[1] "" + +#: ../src/vikgpslayer.c:1363 +msgid "Error: No result." +msgstr "" + +#: ../src/vikgpslayer.c:1471 +msgid "Warning - GPS Upload items may overwrite each other" +msgstr "" + +#: ../src/vikgpslayer.c:1506 +msgid "Status: detecting gpsbabel" +msgstr "Durum: gpsbabel tespit ediliyor" + +#: ../src/vikgpslayer.c:1533 +msgid "No GPS items selected for transfer." +msgstr "" + +#: ../src/vikgpslayer.c:1546 +msgid "Could not turn off device." +msgstr "" + +#: ../src/vikgpslayer.c:1589 +msgid "Are you sure you want to delete GPS Upload data?" +msgstr "" + +#: ../src/vikgpslayer.c:1602 +msgid "Are you sure you want to delete GPS Download data?" +msgstr "" + +#: ../src/vikgpslayer.c:1616 +msgid "Are you sure you want to delete GPS Realtime data?" +msgstr "" + +#: ../src/vikgpslayer.c:1630 +msgid "Are you sure you want to delete All GPS data?" +msgstr "" + +#: ../src/vikgpslayer.c:2004 +#, c-format +msgid "" +"Failed to connect to gpsd at %s (port %s)\n" +"Should Viking keep trying (every %d seconds)?" +msgstr "" + +#: ../src/viklayerspanel.c:73 +msgid "C_ut" +msgstr "" + +#: ../src/viklayerspanel.c:74 ../src/vikwindow.c:4882 +msgid "_Copy" +msgstr "_Kopyala" + +#: ../src/viklayerspanel.c:75 ../src/vikwindow.c:4883 +msgid "_Paste" +msgstr "_Yapıştır" + +#: ../src/viklayerspanel.c:76 ../src/vikwindow.c:4884 +msgid "_Delete" +msgstr "_Sil" + +#: ../src/viklayerspanel.c:154 +msgid "New Layer" +msgstr "" + +#: ../src/viklayerspanel.c:347 +msgid "Top Layer" +msgstr "Üst Katman" + +#: ../src/viklayerspanel.c:363 +msgid "Add new layer" +msgstr "Yeni katman ekle" + +#: ../src/viklayerspanel.c:370 ../src/vikwindow.c:4884 +msgid "Remove selected layer" +msgstr "Seçilen katmanı kaldır" + +#: ../src/viklayerspanel.c:377 +msgid "Move selected layer up" +msgstr "" + +#: ../src/viklayerspanel.c:384 +msgid "Move selected layer down" +msgstr "" + +#: ../src/viklayerspanel.c:391 ../src/vikwindow.c:4881 +msgid "Cut selected layer" +msgstr "Seçilen katmanı kes" + +#: ../src/viklayerspanel.c:398 ../src/vikwindow.c:4882 +msgid "Copy selected layer" +msgstr "Seçilen katmanı kopyala" + +#: ../src/viklayerspanel.c:405 ../src/vikwindow.c:4883 +msgid "" +"Paste layer into selected container layer or otherwise above selected layer" +msgstr "" + +#: ../src/viklayerspanel.c:502 +msgid "New name can not be blank." +msgstr "" + +#: ../src/viklayerspanel.c:751 +msgid "Aggregate Layers have no settable properties." +msgstr "" + +#: ../src/viklayerspanel.c:798 +msgid "You cannot cut the Top Layer." +msgstr "" + +#: ../src/viklayerspanel.c:843 +#, c-format +msgid "Are you sure you want to delete %s?" +msgstr "" + +#: ../src/viklayerspanel.c:863 +msgid "You cannot delete the Top Layer." +msgstr "" + +#: ../src/vikmapniklayer.c:78 +msgid "CSS (MML) Config File:" +msgstr "" + +#: ../src/vikmapniklayer.c:79 +msgid "CartoCSS configuration file" +msgstr "" + +#: ../src/vikmapniklayer.c:80 +msgid "XML Config File:" +msgstr "" + +#: ../src/vikmapniklayer.c:81 +msgid "Mapnik XML configuration file" +msgstr "" + +#: ../src/vikmapniklayer.c:84 +msgid "Use File Cache:" +msgstr "" + +#: ../src/vikmapniklayer.c:86 +msgid "File Cache Directory:" +msgstr "" + +#: ../src/vikmapniklayer.c:122 +msgid "_Mapnik Features" +msgstr "" + +#: ../src/vikmapniklayer.c:122 +msgid "Mapnik Features" +msgstr "" + +#: ../src/vikmapniklayer.c:140 +msgid "Mapnik Rendering" +msgstr "" + +#. Changing these values only applies before first mapnik layer is 'created' +#: ../src/vikmapniklayer.c:258 +msgid "Plugins Directory:" +msgstr "" + +#: ../src/vikmapniklayer.c:258 ../src/vikmapniklayer.c:259 +#: ../src/vikmapniklayer.c:260 ../src/vikmapniklayer.c:261 +msgid "You need to restart Viking for a change to this value to be used" +msgstr "" + +#: ../src/vikmapniklayer.c:259 +msgid "Fonts Directory:" +msgstr "" + +#: ../src/vikmapniklayer.c:260 +msgid "Recurse Fonts Directory:" +msgstr "" + +#: ../src/vikmapniklayer.c:261 +msgid "Rerender Timeout (hours):" +msgstr "" + +#. Changeable any time +#: ../src/vikmapniklayer.c:263 +msgid "CartoCSS:" +msgstr "" + +#: ../src/vikmapniklayer.c:263 +msgid "The program to convert CartoCSS files into Mapnik XML" +msgstr "" + +#: ../src/vikmapniklayer.c:506 +msgid "Running" +msgstr "" + +#: ../src/vikmapniklayer.c:525 +#, c-format +msgid "" +"Error running carto command:\n" +"%s" +msgstr "" + +#: ../src/vikmapniklayer.c:561 +msgid " completed in " +msgstr "" + +#: ../src/vikmapniklayer.c:561 +msgid "seconds" +msgstr "" + +#: ../src/vikmapniklayer.c:611 ../src/vikmapniklayer.c:979 +#, c-format +msgid "" +"Mapnik error loading configuration file:\n" +"%s" +msgstr "" + +#: ../src/vikmapniklayer.c:749 +#, c-format +msgid "Mapnik Render %d:%d:%d %s" +msgstr "" + +#: ../src/vikmapniklayer.c:840 +msgid "Mapnik Rendering must be in Mercator mode" +msgstr "" + +#: ../src/vikmapniklayer.c:997 +msgid "Mapnik Information" +msgstr "" + +#: ../src/vikmapniklayer.c:1031 +msgid "_Flush Memory Cache" +msgstr "" + +#: ../src/vikmapniklayer.c:1044 +msgid "_Run Carto Command" +msgstr "" + +#: ../src/vikmapniklayer.c:1102 ../src/vikmapslayer.c:2029 +#, c-format +msgid "Tile File Timestamp: %s" +msgstr "" + +#: ../src/vikmapniklayer.c:1105 ../src/vikmapslayer.c:2032 +msgid "Tile File Timestamp: Not Available" +msgstr "" + +#: ../src/vikmapniklayer.c:1120 +#, c-format +msgid "Rendering time %.2f seconds" +msgstr "" + +#: ../src/vikmapniklayer.c:1124 ../src/vikmapslayer.c:2042 +msgid "Tile Information" +msgstr "" + +#: ../src/vikmapniklayer.c:1145 +msgid "_Rerender Tile" +msgstr "" + +#: ../src/vikmapniklayer.c:1150 +msgid "_Info" +msgstr "" + +#. ******* MAPZOOMS ******** +#: ../src/vikmapslayer.c:96 +msgid "Use Viking Zoom Level" +msgstr "" + +#: ../src/vikmapslayer.c:146 +msgid "OSM" +msgstr "" + +#. NB mode => id - But can't break file format just to rename something better +#: ../src/vikmapslayer.c:152 +msgid "Map Type:" +msgstr "Harita Türü:" + +#: ../src/vikmapslayer.c:153 +msgid "Maps Directory:" +msgstr "Haritalar Dizini:" + +#: ../src/vikmapslayer.c:154 +msgid "Cache Layout:" +msgstr "" + +#: ../src/vikmapslayer.c:155 +msgid "This determines the tile storage layout on disk" +msgstr "" + +#: ../src/vikmapslayer.c:156 +msgid "Map File:" +msgstr "" + +#: ../src/vikmapslayer.c:157 +msgid "An MBTiles file. Only applies when the map type method is 'MBTiles'" +msgstr "" + +#: ../src/vikmapslayer.c:159 +msgid "Control the Alpha value for transparency effects" +msgstr "" + +#: ../src/vikmapslayer.c:160 +msgid "Autodownload maps:" +msgstr "Haritaları otomatik indir:" + +#: ../src/vikmapslayer.c:161 +msgid "Autodownload Only Gets Missing Maps:" +msgstr "" + +#: ../src/vikmapslayer.c:162 +msgid "" +"Using this option avoids attempting to update already acquired tiles. This " +"can be useful if you want to restrict the network usage, without having to " +"resort to manual control. Only applies when 'Autodownload Maps' is on." +msgstr "" + +#: ../src/vikmapslayer.c:163 +msgid "Zoom Level:" +msgstr "Yakınlaştırma Seviyesi" + +#: ../src/vikmapslayer.c:164 +msgid "" +"Determines the method of displaying map tiles for the current zoom level. " +"'Viking Zoom Level' uses the best matching level, otherwise setting a fixed " +"value will always use map tiles of the specified value regardless of the " +"actual zoom level." +msgstr "" + +#: ../src/vikmapslayer.c:197 +msgid "_Maps Download" +msgstr "" + +#: ../src/vikmapslayer.c:197 +msgid "Maps Download" +msgstr "Harita İndir" + +#: ../src/vikmapslayer.c:213 ../src/vikutils.c:895 +msgid "Map" +msgstr "Harita" + +#: ../src/vikmapslayer.c:306 +msgid "Default map layer directory:" +msgstr "" + +#: ../src/vikmapslayer.c:306 +msgid "Choose a directory to store cached Map tiles for this layer" +msgstr "" + +#: ../src/vikmapslayer.c:436 ../src/vikmapslayer.c:633 +msgid "Unknown map type" +msgstr "Bilinmeyen harita türü:" + +#: ../src/vikmapslayer.c:664 +msgid "Unknown Map Zoom" +msgstr "" + +#: ../src/vikmapslayer.c:833 +#, c-format +msgid "Failed to open MBTiles file: %s" +msgstr "" + +#: ../src/vikmapslayer.c:856 +#, c-format +msgid "" +"New map cannot be displayed in the current drawmode.\n" +"Select \"%s\" from View menu to view it." +msgstr "" + +#: ../src/vikmapslayer.c:1314 +#, c-format +msgid "" +"Cowardly refusing to draw tiles or existence of tiles beyond %d zoom out " +"factor" +msgstr "" + +#. TODO: ?? count up the number of download errors somehow... +#: ../src/vikmapslayer.c:1667 +msgid "Failed to download tile" +msgstr "" + +#: ../src/vikmapslayer.c:1673 +msgid "Unable to save tile" +msgstr "" + +#: ../src/vikmapslayer.c:1799 +#, c-format +msgid "Redownloading up to %d %s map..." +msgid_plural "Redownloading up to %d %s maps..." +msgstr[0] "%d %s Harita yeniden indiriliyor..." + +#: ../src/vikmapslayer.c:1801 +#, c-format +msgid "Redownloading %d %s map..." +msgid_plural "Redownloading %d %s maps..." +msgstr[0] "%d %s Harita yeniden indiriliyor..." + +#: ../src/vikmapslayer.c:1805 ../src/vikmapslayer.c:1890 +#, c-format +msgid "Downloading %d %s map..." +msgid_plural "Downloading %d %s maps..." +msgstr[0] "Harita %d %s indiriliyor..." + +#: ../src/vikmapslayer.c:1969 +msgid "YES" +msgstr "" + +#: ../src/vikmapslayer.c:1973 ../src/vikmapslayer.c:1977 +msgid "NO" +msgstr "" + +#. NB Also handles .jpg automatically due to pixbuf_new_from () support - although just print png for now. +#: ../src/vikmapslayer.c:1980 +#, c-format +msgid "Source: %s (%d%s%d%s%d.%s %s)" +msgstr "" + +#: ../src/vikmapslayer.c:1983 +msgid "Source: Not available" +msgstr "" + +#: ../src/vikmapslayer.c:2000 +msgid "Source: file://" +msgstr "" + +#: ../src/vikmapslayer.c:2012 +#, c-format +msgid "Source: %s" +msgstr "" + +#: ../src/vikmapslayer.c:2038 +#, c-format +msgid "Tile File: %s [Not Available]" +msgstr "" + +#: ../src/vikmapslayer.c:2086 +msgid "Redownload _Bad Map(s)" +msgstr "" + +#: ../src/vikmapslayer.c:2090 +msgid "Redownload _New Map(s)" +msgstr "" + +#: ../src/vikmapslayer.c:2094 +msgid "Redownload _All Map(s)" +msgstr "" + +#: ../src/vikmapslayer.c:2099 +msgid "_Show Tile Information" +msgstr "" + +#: ../src/vikmapslayer.c:2166 +#, c-format +msgid "" +"Wrong drawmode for this map.\n" +"Select \"%s\" from View menu and try again." +msgstr "" + +#: ../src/vikmapslayer.c:2171 +msgid "Wrong zoom level for this map." +msgstr "" + +#: ../src/vikmapslayer.c:2334 +msgid "Zoom Start:" +msgstr "" + +#: ../src/vikmapslayer.c:2341 +msgid "Zoom End:" +msgstr "" + +#: ../src/vikmapslayer.c:2347 +msgid "Download Maps Method:" +msgstr "" + +#. redownload method - needs to align with REDOWNLOAD* macro values +#: ../src/vikmapslayer.c:2419 +msgid "Missing" +msgstr "" + +#: ../src/vikmapslayer.c:2419 +msgid "Bad" +msgstr "" + +#: ../src/vikmapslayer.c:2419 +msgid "New" +msgstr "" + +#: ../src/vikmapslayer.c:2419 +msgid "Reload All" +msgstr "" + +#: ../src/vikmapslayer.c:2421 +msgid "Download for Zoom Levels" +msgstr "" + +#: ../src/vikmapslayer.c:2461 +#, c-format +msgid "" +"You are not allowed to download more than %d tiles in one go (requested %d)" +msgstr "" + +#: ../src/vikmapslayer.c:2469 +#, c-format +msgid "Do you really want to download %d tiles?" +msgstr "" + +#. Now with icons +#: ../src/vikmapslayer.c:2509 +msgid "Download _Missing Onscreen Maps" +msgstr "" + +#: ../src/vikmapslayer.c:2516 +msgid "Download _New Onscreen Maps" +msgstr "" + +#: ../src/vikmapslayer.c:2523 +msgid "Reload _All Onscreen Maps" +msgstr "" + +#: ../src/vikmapslayer.c:2529 +msgid "Download Maps in _Zoom Levels..." +msgstr "" + +#: ../src/vikmapslayer.c:2539 +#, fuzzy +msgid "_Open MBTiles Files" +msgstr "Bir dosya aç" + +#: ../src/vikmapslayer.c:2554 +msgid "Flush Map Cache" +msgstr "" + +#: ../src/vikrouting.c:54 +msgid "Default engine:" +msgstr "" + +#: ../src/vikrouting.c:68 +msgid "Routing" +msgstr "" + +#: ../src/viktreeview.c:347 +msgid "Layer Name" +msgstr "Katman Adı" + +#: ../src/viktreeview.c:924 +#, c-format +msgid "delete data from %s\n" +msgstr "veri %s silindi\n" + +#: ../src/viktrwlayer.c:427 +msgid "Create _Waypoint" +msgstr "" + +#: ../src/viktrwlayer.c:427 +msgid "Create Waypoint" +msgstr "Yol işareti oluştur" + +#: ../src/viktrwlayer.c:437 +#, fuzzy +msgid "Edit _Track" +msgstr "İz ekle" + +#: ../src/viktrwlayer.c:437 +#, fuzzy +msgid "Edit Track" +msgstr "İz ekle" + +#: ../src/viktrwlayer.c:449 +msgid "Edit _Route" +msgstr "" + +#: ../src/viktrwlayer.c:449 +#, fuzzy +msgid "Edit Route" +msgstr "Yol işaretini düzenle" + +#: ../src/viktrwlayer.c:460 +msgid "Route _Finder" +msgstr "" + +#: ../src/viktrwlayer.c:460 +msgid "Route Finder" +msgstr "" + +#: ../src/viktrwlayer.c:471 +msgid "Splitter" +msgstr "" + +#: ../src/viktrwlayer.c:482 +msgid "_Edit Waypoint" +msgstr "" + +#: ../src/viktrwlayer.c:482 +msgid "Edit Waypoint" +msgstr "Yol işaretini düzenle" + +#: ../src/viktrwlayer.c:495 +msgid "Edit Trac_kpoint" +msgstr "" + +#: ../src/viktrwlayer.c:495 +msgid "Edit Trackpoint" +msgstr "" + +#. a pixbuf for this one is already made globally available +#: ../src/viktrwlayer.c:508 +msgid "Show P_icture" +msgstr "" + +#: ../src/viktrwlayer.c:508 +msgid "Show Picture" +msgstr "Resim Göster" + +#: ../src/viktrwlayer.c:531 +msgid "Waypoint Images" +msgstr "Yol işareti Görüntüleri" + +#: ../src/viktrwlayer.c:531 +msgid "Tracks Advanced" +msgstr "" + +#: ../src/viktrwlayer.c:531 +msgid "Metadata" +msgstr "" + +#: ../src/viktrwlayer.c:531 +msgid "Filesystem" +msgstr "" + +#: ../src/viktrwlayer.c:534 +msgid "Draw by Track" +msgstr "" + +#: ../src/viktrwlayer.c:534 +msgid "Draw by Speed" +msgstr "" + +#: ../src/viktrwlayer.c:534 +msgid "All Tracks Same Color" +msgstr "" + +#: ../src/viktrwlayer.c:535 +msgid "Filled Square" +msgstr "" + +#: ../src/viktrwlayer.c:535 +msgid "Square" +msgstr "" + +#: ../src/viktrwlayer.c:535 +msgid "Circle" +msgstr "" + +#: ../src/viktrwlayer.c:535 +msgid "X" +msgstr "X" + +#: ../src/viktrwlayer.c:561 +msgid "Extra Extra Small" +msgstr "" + +#: ../src/viktrwlayer.c:562 +msgid "Extra Small" +msgstr "" + +#: ../src/viktrwlayer.c:566 +msgid "Extra Large" +msgstr "" + +#: ../src/viktrwlayer.c:567 +msgid "Extra Extra Large" +msgstr "" + +#: ../src/viktrwlayer.c:573 +msgid "Name Ascending" +msgstr "" + +#: ../src/viktrwlayer.c:574 +msgid "Name Descending" +msgstr "" + +#: ../src/viktrwlayer.c:582 ../src/viktrwlayer_propwin.c:3319 +msgid "No" +msgstr "" + +#: ../src/viktrwlayer.c:583 +msgid "Yes" +msgstr "" + +#: ../src/viktrwlayer.c:584 +msgid "No write" +msgstr "" + +#: ../src/viktrwlayer.c:649 ../src/viktrwlayer.c:673 +msgid "Draw Labels" +msgstr "" + +#: ../src/viktrwlayer.c:650 +msgid "Note: the individual track controls what labels may be displayed" +msgstr "" + +#: ../src/viktrwlayer.c:651 +msgid "Track Labels Font Size:" +msgstr "" + +#: ../src/viktrwlayer.c:652 +msgid "Track Drawing Mode:" +msgstr "" + +#: ../src/viktrwlayer.c:653 +msgid "All Tracks Color:" +msgstr "" + +#: ../src/viktrwlayer.c:654 +msgid "The color used when 'All Tracks Same Color' drawing mode is selected" +msgstr "" + +#: ../src/viktrwlayer.c:655 +msgid "Draw Track Lines" +msgstr "" + +#: ../src/viktrwlayer.c:656 +msgid "Track Thickness:" +msgstr "" + +#: ../src/viktrwlayer.c:657 +msgid "Draw Track Direction" +msgstr "" + +#: ../src/viktrwlayer.c:658 +msgid "Direction Size:" +msgstr "" + +#: ../src/viktrwlayer.c:659 +msgid "Draw Trackpoints" +msgstr "" + +#: ../src/viktrwlayer.c:660 +msgid "Trackpoint Size:" +msgstr "" + +#: ../src/viktrwlayer.c:661 +msgid "Draw Elevation" +msgstr "" + +#: ../src/viktrwlayer.c:662 +msgid "Draw Elevation Height %:" +msgstr "" + +#: ../src/viktrwlayer.c:663 +msgid "Draw Stops" +msgstr "" + +#: ../src/viktrwlayer.c:664 +msgid "" +"Whether to draw a marker when trackpoints are at the same position but over " +"the minimum stop length apart in time" +msgstr "" + +#: ../src/viktrwlayer.c:665 +msgid "Min Stop Length (seconds):" +msgstr "" + +#: ../src/viktrwlayer.c:667 +msgid "Track BG Thickness:" +msgstr "" + +#: ../src/viktrwlayer.c:668 +msgid "Track Background Color" +msgstr "" + +#: ../src/viktrwlayer.c:669 +msgid "Draw by Speed Factor (%):" +msgstr "" + +#: ../src/viktrwlayer.c:670 +msgid "" +"The percentage factor away from the average speed determining the color used" +msgstr "" + +#: ../src/viktrwlayer.c:671 +msgid "Track Sort Order:" +msgstr "" + +#: ../src/viktrwlayer.c:674 +msgid "Waypoint Font Size:" +msgstr "" + +#: ../src/viktrwlayer.c:675 +msgid "Waypoint Color:" +msgstr "Yol işareti Rengi:" + +#: ../src/viktrwlayer.c:676 +msgid "Waypoint Text:" +msgstr "Yol işareti metni:" + +#: ../src/viktrwlayer.c:677 +msgid "Background:" +msgstr "Arka Plan:" + +#: ../src/viktrwlayer.c:678 +msgid "Fake BG Color Translucency:" +msgstr "" + +#: ../src/viktrwlayer.c:679 +msgid "Waypoint marker:" +msgstr "" + +#: ../src/viktrwlayer.c:680 +msgid "Waypoint size:" +msgstr "Yol işareti boyutu:" + +#: ../src/viktrwlayer.c:681 +msgid "Draw Waypoint Symbols:" +msgstr "Yol işareti simgesi çiz" + +#: ../src/viktrwlayer.c:682 +msgid "Waypoint Sort Order:" +msgstr "" + +#: ../src/viktrwlayer.c:684 +msgid "Draw Waypoint Images" +msgstr "" + +#: ../src/viktrwlayer.c:685 +msgid "Image Size (pixels):" +msgstr "Görüntü boyutu (piksel):" + +#: ../src/viktrwlayer.c:686 +msgid "Image Alpha:" +msgstr "Alfa Görüntü:" + +#: ../src/viktrwlayer.c:687 +msgid "Image Memory Cache Size:" +msgstr "" + +#: ../src/viktrwlayer.c:690 +msgid "Author" +msgstr "" + +#: ../src/viktrwlayer.c:691 +msgid "Creation Time" +msgstr "" + +#: ../src/viktrwlayer.c:692 +msgid "Keywords" +msgstr "" + +#: ../src/viktrwlayer.c:693 +msgid "External layer:" +msgstr "" + +#: ../src/viktrwlayer.c:693 +msgid "" +"Layer data stored in the Viking file, in an external file, or in an external " +"file but changes are not written to the file (file only loaded at startup)" +msgstr "" + +#: ../src/viktrwlayer.c:694 +msgid "Save layer as:" +msgstr "" + +#: ../src/viktrwlayer.c:694 +msgid "Specify where layer should be saved. Overwrites file if it exists." +msgstr "" + +#: ../src/viktrwlayer.c:798 +msgid "TrackWaypoint" +msgstr "" + +#: ../src/viktrwlayer.c:1999 ../src/viktrwlayer_propwin.c:1469 +#: ../src/viktrwlayer_propwin.c:1471 ../src/vikutils.c:299 +#: ../src/vikutils.c:326 +msgid "miles" +msgstr "" + +#: ../src/viktrwlayer.c:2002 ../src/viktrwlayer_propwin.c:1475 +#: ../src/viktrwlayer_propwin.c:1477 ../src/vikutils.c:303 +#: ../src/vikutils.c:330 +msgid "NM" +msgstr "" + +#. VIK_UNITS_DISTANCE_KILOMETRES: +#: ../src/viktrwlayer.c:2006 ../src/viktrwlayer_propwin.c:1482 +#: ../src/viktrwlayer_propwin.c:1484 ../src/vikutils.c:308 +#: ../src/vikutils.c:335 +msgid "km" +msgstr "" + +#: ../src/viktrwlayer.c:2121 +msgid "start/end" +msgstr "" + +#: ../src/viktrwlayer.c:2133 +msgid "start" +msgstr "" + +#: ../src/viktrwlayer.c:2142 +msgid "end" +msgstr "" + +#: ../src/viktrwlayer.c:3103 +#, c-format +msgid " in %d:%02d hrs:mins" +msgstr "" + +#: ../src/viktrwlayer.c:3107 +#, c-format +msgid "" +"\n" +"%sTotal Length %.1f %s%s" +msgstr "" + +#: ../src/viktrwlayer.c:3131 +#, c-format +msgid "" +"\n" +"Total route length %.1f %s" +msgstr "" + +#: ../src/viktrwlayer.c:3136 +#, c-format +msgid "Tracks: %d - Waypoints: %d - Routes: %d%s%s" +msgstr "" + +#: ../src/viktrwlayer.c:3155 +#, c-format +msgid "Tracks: %d" +msgstr "" + +#: ../src/viktrwlayer.c:3165 +#, c-format +msgid "Routes: %d" +msgstr "" + +#: ../src/viktrwlayer.c:3195 +#, c-format +msgid "- %d:%02d hrs:mins" +msgstr "- %d:%02d saat:dak" + +#: ../src/viktrwlayer.c:3202 +#, c-format +msgid "%s%.1f km %s" +msgstr "" + +#: ../src/viktrwlayer.c:3205 +#, c-format +msgid "%s%.1f miles %s" +msgstr "%s%.1f %s mil" + +#: ../src/viktrwlayer.c:3208 +#, c-format +msgid "%s%.1f NM %s" +msgstr "" + +#: ../src/viktrwlayer.c:3222 +#, c-format +msgid "Waypoints: %d" +msgstr "" + +#: ../src/viktrwlayer.c:3279 +#, c-format +msgid "Wpt: Alt %dft" +msgstr "" + +#. VIK_UNITS_HEIGHT_METRES: +#: ../src/viktrwlayer.c:3283 +#, c-format +msgid "Wpt: Alt %dm" +msgstr "" + +#. Add comment if available +#: ../src/viktrwlayer.c:3298 +#, c-format +msgid "%s | %s %s | Comment: %s" +msgstr "" + +#: ../src/viktrwlayer.c:3300 +#, c-format +msgid "%s | %s %s" +msgstr "" + +#: ../src/viktrwlayer.c:3562 ../src/viktrwlayer.c:3591 +msgid "This layer has no waypoints or trackpoints." +msgstr "" + +#: ../src/viktrwlayer.c:3598 ../src/viktrwlayer.c:3607 +#: ../src/viktrwlayer.c:3616 ../src/viktrwlayer.c:3625 +#: ../src/viktrwlayer.c:3634 ../src/viktrwlayer.c:3642 +msgid "Export Layer" +msgstr "Katmanı Dışa Ver" + +#: ../src/viktrwlayer.c:3671 +msgid "Export Route as GPX" +msgstr "" + +#: ../src/viktrwlayer.c:3673 +msgid "Export Track as GPX" +msgstr "" + +#: ../src/viktrwlayer.c:3693 +msgid "Find" +msgstr "Bul" + +#: ../src/viktrwlayer.c:3703 +msgid "Waypoint Name:" +msgstr "Yol işareti Adı:" + +#: ../src/viktrwlayer.c:3720 +msgid "Waypoint not found in this layer." +msgstr "" + +#: ../src/viktrwlayer.c:3989 +msgid "Can not upload invisible track." +msgstr "" + +#: ../src/viktrwlayer.c:4082 ../src/viktrwlayer.c:10512 +msgid "Track" +msgstr "İz" + +#: ../src/viktrwlayer.c:4107 ../src/viktrwlayer.c:10599 +msgid "Route" +msgstr "" + +#: ../src/viktrwlayer.c:4194 +msgid "Externa_l" +msgstr "" + +#: ../src/viktrwlayer.c:4216 ../src/viktrwlayer.c:8456 +#: ../src/viktrwlayer.c:8574 +msgid "_Finish Route" +msgstr "" + +#: ../src/viktrwlayer.c:4218 ../src/viktrwlayer.c:8380 +#: ../src/viktrwlayer.c:8572 +msgid "_Finish Track" +msgstr "" + +#. Now with icons +#: ../src/viktrwlayer.c:4230 +msgid "_View Layer" +msgstr "" + +#: ../src/viktrwlayer.c:4237 +msgid "V_iew" +msgstr "" + +#: ../src/viktrwlayer.c:4243 +msgid "View All _Tracks" +msgstr "" + +#: ../src/viktrwlayer.c:4248 +msgid "View All _Routes" +msgstr "" + +#: ../src/viktrwlayer.c:4253 +msgid "View All _Waypoints" +msgstr "" + +#: ../src/viktrwlayer.c:4258 +msgid "_Goto Center of Layer" +msgstr "" + +#: ../src/viktrwlayer.c:4264 ../src/viktrwlayer.c:8321 +msgid "Goto _Waypoint..." +msgstr "" + +#: ../src/viktrwlayer.c:4270 +msgid "_Export Layer" +msgstr "" + +#: ../src/viktrwlayer.c:4276 +msgid "Export as GPS_Point..." +msgstr "" + +#: ../src/viktrwlayer.c:4281 +msgid "Export as GPS_Mapper..." +msgstr "" + +#: ../src/viktrwlayer.c:4286 +msgid "Export as _GPX..." +msgstr "" + +#: ../src/viktrwlayer.c:4292 +msgid "Export as _KML..." +msgstr "" + +#: ../src/viktrwlayer.c:4299 +msgid "Export as GEO_JSON..." +msgstr "" + +#: ../src/viktrwlayer.c:4306 +msgid "Export via GPSbabel..." +msgstr "" + +#: ../src/viktrwlayer.c:4312 +#, c-format +msgid "Open with External Program_1: %s" +msgstr "" + +#: ../src/viktrwlayer.c:4319 +#, c-format +msgid "Open with External Program_2: %s" +msgstr "" + +#: ../src/viktrwlayer.c:4327 ../src/vikwindow.c:4825 +msgid "_New" +msgstr "_Yeni" + +#: ../src/viktrwlayer.c:4333 +msgid "New _Waypoint..." +msgstr "" + +#: ../src/viktrwlayer.c:4339 +msgid "New _Track" +msgstr "" + +#: ../src/viktrwlayer.c:4347 +msgid "New _Route" +msgstr "" + +#: ../src/viktrwlayer.c:4356 ../src/viktrwlayer.c:8232 +#: ../src/viktrwlayer.c:9003 +msgid "Geotag _Images..." +msgstr "" + +#: ../src/viktrwlayer.c:4363 +msgid "_Acquire" +msgstr "" + +#: ../src/viktrwlayer.c:4369 ../src/vikwindow.c:4904 +msgid "From _GPS..." +msgstr "" + +#. FIXME: only add menu when at least a routing engine has support for Directions +#: ../src/viktrwlayer.c:4375 +msgid "From _Directions..." +msgstr "" + +#: ../src/viktrwlayer.c:4381 +msgid "From _OSM Traces..." +msgstr "" + +#: ../src/viktrwlayer.c:4386 +msgid "From _My OSM Traces..." +msgstr "" + +#: ../src/viktrwlayer.c:4392 ../src/vikwindow.c:4844 +msgid "From _URL..." +msgstr "" + +#: ../src/viktrwlayer.c:4399 ../src/vikwindow.c:4846 +msgid "From _Wikipedia Waypoints" +msgstr "" + +#: ../src/viktrwlayer.c:4405 +msgid "Within _Layer Bounds" +msgstr "" + +#: ../src/viktrwlayer.c:4411 +msgid "Within _Current View" +msgstr "" + +#: ../src/viktrwlayer.c:4419 +msgid "From Geo_caching..." +msgstr "" + +#: ../src/viktrwlayer.c:4426 ../src/vikwindow.c:4842 +msgid "From Geotagged _Images..." +msgstr "" + +#: ../src/viktrwlayer.c:4433 +msgid "From _File..." +msgstr "" + +#: ../src/viktrwlayer.c:4436 ../src/vikwindow.c:4905 +msgid "Import File With GPS_Babel..." +msgstr "" + +#: ../src/viktrwlayer.c:4443 ../src/viktrwlayer.c:8905 +msgid "_Upload" +msgstr "" + +#: ../src/viktrwlayer.c:4449 +msgid "Upload to _GPS..." +msgstr "" + +#: ../src/viktrwlayer.c:4456 ../src/viktrwlayer.c:8973 +msgid "Upload to _OSM..." +msgstr "" + +#: ../src/viktrwlayer.c:4464 +msgid "De_lete" +msgstr "" + +#: ../src/viktrwlayer.c:4470 +msgid "Delete All _Tracks" +msgstr "" + +#: ../src/viktrwlayer.c:4477 +msgid "Delete Tracks _From Selection..." +msgstr "" + +#: ../src/viktrwlayer.c:4484 ../src/viktrwlayer.c:8481 +msgid "Delete _All Routes" +msgstr "" + +#: ../src/viktrwlayer.c:4491 ../src/viktrwlayer.c:8487 +msgid "_Delete Routes From Selection..." +msgstr "" + +#: ../src/viktrwlayer.c:4498 +msgid "Delete All _Waypoints" +msgstr "" + +#: ../src/viktrwlayer.c:4505 +msgid "Delete Waypoints From _Selection..." +msgstr "" + +#: ../src/viktrwlayer.c:4512 ../src/viktrwlayer.c:8339 +#, fuzzy +msgid "Delete Duplicate Waypoints" +msgstr "Yol işareti oluştur" + +#: ../src/viktrwlayer.c:5198 +#, c-format +msgid "Are you sure you want to delete all tracks in %s?" +msgstr "" + +#: ../src/viktrwlayer.c:5211 +#, c-format +msgid "Are you sure you want to delete all routes in %s?" +msgstr "" + +#: ../src/viktrwlayer.c:5221 +#, c-format +msgid "Are you sure you want to delete all waypoints in %s?" +msgstr "" + +#: ../src/viktrwlayer.c:5238 +#, c-format +msgid "Are you sure you want to delete the waypoint \"%s\"?" +msgstr "" + +#: ../src/viktrwlayer.c:5254 +#, c-format +msgid "Are you sure you want to delete the track \"%s\"?" +msgstr "" + +#: ../src/viktrwlayer.c:5271 +#, c-format +msgid "Are you sure you want to delete the route \"%s\"?" +msgstr "" + +#: ../src/viktrwlayer.c:5527 ../src/viktrwlayer.c:6373 +msgid "" +"Converting a track to a route removes extra track data such as segments, " +"timestamps, etc...\n" +"Do you want to continue?" +msgstr "" + +#: ../src/viktrwlayer.c:5631 +msgid "No DEM layers available, thus no DEM values can be applied." +msgstr "" + +#: ../src/viktrwlayer.c:5651 ../src/viktrwlayer.c:5692 +#, c-format +msgid "%ld point adjusted" +msgid_plural "%ld points adjusted" +msgstr[0] "" +msgstr[1] "" + +#: ../src/viktrwlayer.c:5736 +#, c-format +msgid "%ld waypoint changed" +msgid_plural "%ld waypoints changed" +msgstr[0] "" +msgstr[1] "" + +#: ../src/viktrwlayer.c:5917 +#, c-format +msgid "" +"Refining a track with many points (%d) is unlikely to yield sensible " +"results. Do you want to Continue?" +msgstr "" + +#. Select engine from dialog +#: ../src/viktrwlayer.c:5925 +msgid "Refine Route with Routing Engine..." +msgstr "" + +#: ../src/viktrwlayer.c:5933 +msgid "Select routing engine" +msgstr "" + +#: ../src/viktrwlayer.c:6158 +msgid "Failed. No other tracks with timestamps in this layer found" +msgstr "" + +#: ../src/viktrwlayer.c:6160 +msgid "Failed. No other tracks without timestamps in this layer found" +msgstr "" + +#: ../src/viktrwlayer.c:6179 +msgid "Merge with..." +msgstr "" + +#: ../src/viktrwlayer.c:6180 +msgid "Select route to merge with" +msgstr "" + +#: ../src/viktrwlayer.c:6180 +msgid "Select track to merge with" +msgstr "" + +#: ../src/viktrwlayer.c:6264 ../src/viktrwlayer.c:6346 +msgid "Append Route" +msgstr "" + +#: ../src/viktrwlayer.c:6264 ../src/viktrwlayer.c:6346 +msgid "Append Track" +msgstr "" + +#: ../src/viktrwlayer.c:6265 +msgid "Select the route to append after the current route" +msgstr "" + +#: ../src/viktrwlayer.c:6266 +msgid "Select the track to append after the current track" +msgstr "" + +#: ../src/viktrwlayer.c:6347 +msgid "Select the track to append after the current route" +msgstr "" + +#: ../src/viktrwlayer.c:6348 +msgid "Select the route to append after the current track" +msgstr "" + +#: ../src/viktrwlayer.c:6414 +#, c-format +msgid "%d segment merged" +msgid_plural "%d segments merged" +msgstr[0] "" +msgstr[1] "" + +#: ../src/viktrwlayer.c:6430 +msgid "Failed. This track does not have timestamp" +msgstr "" + +#: ../src/viktrwlayer.c:6442 +msgid "Failed. No other track in this layer has timestamp" +msgstr "" + +#: ../src/viktrwlayer.c:6449 +msgid "Merge Threshold..." +msgstr "" + +#: ../src/viktrwlayer.c:6450 +msgid "Merge when time between tracks less than:" +msgstr "" + +#: ../src/viktrwlayer.c:6580 +msgid "Split Threshold..." +msgstr "" + +#: ../src/viktrwlayer.c:6581 +msgid "Split when time between trackpoints exceeds:" +msgstr "" + +#: ../src/viktrwlayer.c:6598 +#, c-format +msgid "" +"Can not split track due to trackpoints not ordered in time - such as at %s.\n" +"\n" +"Goto this trackpoint?" +msgstr "" + +#: ../src/viktrwlayer.c:6668 +msgid "Split Every Nth Point" +msgstr "" + +#: ../src/viktrwlayer.c:6669 +msgid "Split on every Nth point:" +msgstr "" + +#: ../src/viktrwlayer.c:6779 +msgid "Can not split track as it has no segments" +msgstr "" + +#: ../src/viktrwlayer.c:6861 ../src/viktrwlayer.c:6891 +#, c-format +msgid "Deleted %ld point" +msgid_plural "Deleted %ld points" +msgstr[0] "" +msgstr[1] "" + +#: ../src/viktrwlayer.c:6966 ../src/viktrwlayer.c:10989 +#: ../src/viktrwlayer_waypointlist.c:214 +#, c-format +msgid "Could not launch %s to open file." +msgstr "" + +#: ../src/viktrwlayer.c:6992 ../src/viktrwlayer.c:7113 +msgid "This track has no date information." +msgstr "" + +#: ../src/viktrwlayer.c:7006 ../src/viktrwlayer.c:7136 +msgid "This waypoint has no date information." +msgstr "" + +#: ../src/viktrwlayer.c:7030 +#, c-format +msgid "Could not launch %s" +msgstr "" + +#: ../src/viktrwlayer.c:7269 +msgid "Internal Error in vik_trw_layer_uniquify_tracks" +msgstr "" + +#: ../src/viktrwlayer.c:7374 ../src/viktrwlayer.c:7424 +#: ../src/viktrwlayer.c:7587 +msgid "" +"Multiple entries with the same name exist. This method only works with " +"unique names. Force unique names now?" +msgstr "" + +#: ../src/viktrwlayer.c:7385 +msgid "No tracks found" +msgstr "" + +#: ../src/viktrwlayer.c:7393 ../src/viktrwlayer.c:7443 +#: ../src/viktrwlayer.c:7607 +msgid "Delete Selection" +msgstr "" + +#: ../src/viktrwlayer.c:7394 +msgid "Select tracks to delete" +msgstr "" + +#: ../src/viktrwlayer.c:7435 +msgid "No routes found" +msgstr "" + +#: ../src/viktrwlayer.c:7444 +msgid "Select routes to delete" +msgstr "" + +#: ../src/viktrwlayer.c:7550 +msgid "Internal Error in vik_trw_layer_uniquify_waypoints" +msgstr "" + +#: ../src/viktrwlayer.c:7597 +msgid "No waypoints found" +msgstr "" + +#: ../src/viktrwlayer.c:7608 +msgid "Select waypoints to delete" +msgstr "" + +#: ../src/viktrwlayer.c:7691 +#, c-format +msgid "%ld waypoint deleted" +msgid_plural "%ld waypoints deleted" +msgstr[0] "" +msgstr[1] "" + +#: ../src/viktrwlayer.c:7697 +#, fuzzy +msgid "No duplicates found" +msgstr "Hiçbir kayıt bulunamadı!" + +#: ../src/viktrwlayer.c:8028 +#, c-format +msgid "" +"A waypoint with the name \"%s\" already exists. Really rename to the same " +"name?" +msgstr "" + +#: ../src/viktrwlayer.c:8058 +#, c-format +msgid "" +"A track with the name \"%s\" already exists. Really rename to the same name?" +msgstr "" + +#: ../src/viktrwlayer.c:8095 +#, c-format +msgid "" +"A route with the name \"%s\" already exists. Really rename to the same name?" +msgstr "" + +#: ../src/viktrwlayer.c:8215 ../src/viktrwlayer.c:8602 +msgid "_Goto" +msgstr "_Git" + +#: ../src/viktrwlayer.c:8226 +msgid "_Visit Geocache Webpage" +msgstr "_Geocache Web sayfasını ziyaret et" + +#: ../src/viktrwlayer.c:8235 +msgid "Geotag multiple images against this waypoint" +msgstr "" + +#: ../src/viktrwlayer.c:8245 ../src/viktrwlayer_waypointlist.c:352 +msgid "_Show Picture..." +msgstr "" + +#: ../src/viktrwlayer.c:8253 +msgid "Update Geotag on _Image" +msgstr "" + +#: ../src/viktrwlayer.c:8259 +msgid "_Update" +msgstr "" + +#: ../src/viktrwlayer.c:8264 +msgid "Update and _Keep File Timestamp" +msgstr "" + +#: ../src/viktrwlayer.c:8276 +msgid "Visit _Webpage" +msgstr "" + +#: ../src/viktrwlayer.c:8306 +msgid "_New Waypoint..." +msgstr "" + +#: ../src/viktrwlayer.c:8315 +msgid "_View All Waypoints" +msgstr "" + +#: ../src/viktrwlayer.c:8327 +msgid "Delete _All Waypoints" +msgstr "" + +#: ../src/viktrwlayer.c:8333 +msgid "_Delete Waypoints From Selection..." +msgstr "" + +#: ../src/viktrwlayer.c:8351 +msgid "_Show All Waypoints" +msgstr "" + +#: ../src/viktrwlayer.c:8357 +msgid "_Hide All Waypoints" +msgstr "" + +#: ../src/viktrwlayer.c:8369 +msgid "_List Waypoints..." +msgstr "" + +#: ../src/viktrwlayer.c:8390 +msgid "_View All Tracks" +msgstr "" + +#: ../src/viktrwlayer.c:8396 +msgid "_New Track" +msgstr "" + +#: ../src/viktrwlayer.c:8404 +msgid "Delete _All Tracks" +msgstr "" + +#: ../src/viktrwlayer.c:8410 +msgid "_Delete Tracks From Selection..." +msgstr "" + +#: ../src/viktrwlayer.c:8422 +msgid "_Show All Tracks" +msgstr "" + +#: ../src/viktrwlayer.c:8428 +msgid "_Hide All Tracks" +msgstr "" + +#: ../src/viktrwlayer.c:8439 +msgid "_List Tracks..." +msgstr "" + +#: ../src/viktrwlayer.c:8467 +msgid "_View All Routes" +msgstr "" + +#: ../src/viktrwlayer.c:8473 +msgid "_New Route" +msgstr "" + +#: ../src/viktrwlayer.c:8499 +msgid "_Show All Routes" +msgstr "" + +#: ../src/viktrwlayer.c:8505 +msgid "_Hide All Routes" +msgstr "" + +#: ../src/viktrwlayer.c:8516 +msgid "_List Routes..." +msgstr "" + +#: ../src/viktrwlayer.c:8587 +msgid "_View Track" +msgstr "" + +#: ../src/viktrwlayer.c:8589 +msgid "_View Route" +msgstr "" + +#: ../src/viktrwlayer.c:8608 +msgid "_Startpoint" +msgstr "_Başlangıç noktası" + +#: ../src/viktrwlayer.c:8614 +msgid "\"_Center\"" +msgstr "\"_Merkez\"" + +#: ../src/viktrwlayer.c:8620 +msgid "_Endpoint" +msgstr "_Son nokta" + +#: ../src/viktrwlayer.c:8626 +msgid "_Highest Altitude" +msgstr "_En yüksek Rakım" + +#: ../src/viktrwlayer.c:8632 +msgid "_Lowest Altitude" +msgstr "_En düşük Rakım" + +#: ../src/viktrwlayer.c:8640 +msgid "_Maximum Speed" +msgstr "_Azami Hız" + +#: ../src/viktrwlayer.c:8646 +msgid "_Date" +msgstr "" + +#: ../src/viktrwlayer.c:8655 +msgid "Co_mbine" +msgstr "" + +#: ../src/viktrwlayer.c:8663 +msgid "_Merge By Time..." +msgstr "" + +#: ../src/viktrwlayer.c:8668 +msgid "Merge _Segments" +msgstr "" + +#: ../src/viktrwlayer.c:8675 +msgid "Merge _With Other Tracks..." +msgstr "" + +#: ../src/viktrwlayer.c:8682 +msgid "_Append Track..." +msgstr "" + +#: ../src/viktrwlayer.c:8684 +msgid "_Append Route..." +msgstr "" + +#: ../src/viktrwlayer.c:8690 +msgid "Append _Route..." +msgstr "" + +#: ../src/viktrwlayer.c:8692 +msgid "Append _Track..." +msgstr "" + +#: ../src/viktrwlayer.c:8699 +msgid "_Split" +msgstr "" + +#: ../src/viktrwlayer.c:8707 +msgid "_Split By Time..." +msgstr "" + +#. ATM always enable this entry - don't want to have to analyse the track before displaying the menu - to keep the menu speedy +#: ../src/viktrwlayer.c:8713 +msgid "Split Se_gments" +msgstr "" + +#: ../src/viktrwlayer.c:8719 +msgid "Split By _Number of Points..." +msgstr "" + +#: ../src/viktrwlayer.c:8724 +msgid "Split at _Trackpoint" +msgstr "" + +#: ../src/viktrwlayer.c:8732 +msgid "_Insert Points" +msgstr "" + +#: ../src/viktrwlayer.c:8738 +msgid "Insert Point _Before Selected Point" +msgstr "" + +#: ../src/viktrwlayer.c:8745 +msgid "Insert Point _After Selected Point" +msgstr "" + +#: ../src/viktrwlayer.c:8754 +msgid "Delete Poi_nts" +msgstr "" + +#: ../src/viktrwlayer.c:8760 +msgid "Delete _Selected Point" +msgstr "" + +#: ../src/viktrwlayer.c:8768 +msgid "Delete Points With The Same _Position" +msgstr "" + +#: ../src/viktrwlayer.c:8773 +msgid "Delete Points With The Same _Time" +msgstr "" + +#: ../src/viktrwlayer.c:8780 ../src/viktrwlayer.c:9029 +msgid "_Transform" +msgstr "" + +#: ../src/viktrwlayer.c:8788 ../src/viktrwlayer.c:9037 +msgid "_Apply DEM Data" +msgstr "" + +#: ../src/viktrwlayer.c:8793 ../src/viktrwlayer.c:9042 +msgid "_Overwrite" +msgstr "" + +#: ../src/viktrwlayer.c:8796 ../src/viktrwlayer.c:9045 +msgid "Overwrite any existing elevation values with DEM values" +msgstr "" + +#: ../src/viktrwlayer.c:8799 ../src/viktrwlayer.c:9048 +msgid "_Keep Existing" +msgstr "" + +#: ../src/viktrwlayer.c:8802 ../src/viktrwlayer.c:9051 +msgid "Keep existing elevation values, only attempt for missing values" +msgstr "" + +#: ../src/viktrwlayer.c:8807 +msgid "_Smooth Missing Elevation Data" +msgstr "" + +#: ../src/viktrwlayer.c:8812 +msgid "_Interpolated" +msgstr "" + +#: ../src/viktrwlayer.c:8815 +msgid "" +"Interpolate between known elevation values to derive values for the missing " +"elevations" +msgstr "" + +#: ../src/viktrwlayer.c:8818 +msgid "_Flat" +msgstr "" + +#: ../src/viktrwlayer.c:8821 +msgid "Set unknown elevation values to the last known value" +msgstr "" + +#: ../src/viktrwlayer.c:8825 +msgid "C_onvert to a Route" +msgstr "" + +#: ../src/viktrwlayer.c:8827 +msgid "C_onvert to a Track" +msgstr "" + +#: ../src/viktrwlayer.c:8835 +msgid "_Anonymize Times" +msgstr "" + +#: ../src/viktrwlayer.c:8838 +msgid "Shift timestamps to a relative offset from 1901-01-01" +msgstr "" + +#: ../src/viktrwlayer.c:8841 +msgid "_Interpolate Times" +msgstr "" + +#: ../src/viktrwlayer.c:8844 +msgid "" +"Reset trackpoint timestamps between the first and last points such that " +"track is traveled at equal speed" +msgstr "" + +#: ../src/viktrwlayer.c:8849 +msgid "_Reverse Track" +msgstr "" + +#: ../src/viktrwlayer.c:8851 +msgid "_Reverse Route" +msgstr "" + +#: ../src/viktrwlayer.c:8858 +msgid "Refine Route..." +msgstr "" + +#: ../src/viktrwlayer.c:8868 +msgid "Down_load Maps Along Track..." +msgstr "" + +#: ../src/viktrwlayer.c:8870 +msgid "Down_load Maps Along Route..." +msgstr "" + +#: ../src/viktrwlayer.c:8878 +msgid "_Export Track as GPX..." +msgstr "" + +#: ../src/viktrwlayer.c:8880 +msgid "_Export Route as GPX..." +msgstr "" + +#: ../src/viktrwlayer.c:8887 +msgid "E_xtend Track End" +msgstr "" + +#: ../src/viktrwlayer.c:8889 +msgid "E_xtend Route End" +msgstr "" + +#: ../src/viktrwlayer.c:8896 +msgid "Extend _Using Route Finder" +msgstr "" + +#: ../src/viktrwlayer.c:8911 +msgid "_Upload to GPS..." +msgstr "" + +#: ../src/viktrwlayer.c:8926 +msgid "_Diary" +msgstr "" + +#: ../src/viktrwlayer.c:8930 +msgid "Open diary program at this date" +msgstr "" + +#: ../src/viktrwlayer.c:8935 +msgid "_Astronomy" +msgstr "" + +#: ../src/viktrwlayer.c:8938 +msgid "Open astronomy program at this date and location" +msgstr "" + +#: ../src/viktrwlayer.c:8962 +msgid "_View Google Directions" +msgstr "" + +#: ../src/viktrwlayer.c:8984 +msgid "Use with _Filter" +msgstr "_Filtre kullan" + +#: ../src/viktrwlayer.c:9018 +msgid "_Edit Trackpoint" +msgstr "" + +#: ../src/viktrwlayer.c:10116 +#, c-format +msgid " - Gain %dm:Loss %dm" +msgstr "" + +#: ../src/viktrwlayer.c:10118 +#, c-format +msgid " - Gain %dft:Loss %dft" +msgstr "" + +#: ../src/viktrwlayer.c:10123 +#, c-format +msgid " - Bearing %3.1f° - Step %s" +msgstr "" + +#: ../src/viktrwlayer.c:10232 +#, c-format +msgid "Querying %s for route between (%.3f, %.3f) and (%.3f, %.3f)." +msgstr "" + +#: ../src/viktrwlayer.c:10248 +#, c-format +msgid "%s returned route between (%.3f, %.3f) and (%.3f, %.3f)." +msgstr "" + +#: ../src/viktrwlayer.c:10251 +#, c-format +msgid "Error getting route from %s." +msgstr "" + +#: ../src/viktrwlayer.c:11070 +#, c-format +msgid "Creating %d Image Thumbnails..." +msgstr "önizleme resmi oluşturuluyor... %d" + +#: ../src/viktrwlayer.c:11560 +msgid "No map layer in use. Create one first" +msgstr "" + +#: ../src/viktrwlayer.c:11679 +#, c-format +msgid "%s: Track List" +msgstr "" + +#: ../src/viktrwlayer.c:11681 +#, c-format +msgid "%s: Route List" +msgstr "" + +#: ../src/viktrwlayer.c:11734 +#, c-format +msgid "" +"Could not write external layer %s to %s, please fix and save before exiting " +"or data will be lost" +msgstr "" + +#: ../src/viktrwlayer.c:11782 +#, c-format +msgid "WARNING: issues encountered loading external layer %s from %s" +msgstr "" + +#: ../src/viktrwlayer_export.c:47 +msgid "Auto Device GPX Simplify:" +msgstr "" + +#: ../src/viktrwlayer_export.c:48 +msgid "" +"GPX saves to certain devices will be simplified for device compatibility." +msgstr "" + +#: ../src/viktrwlayer_export.c:125 +#, c-format +msgid "Export of GPX file simplified using point limit: %d" +msgstr "" + +#: ../src/viktrwlayer_export.c:206 ../src/viktrwlayer_export.c:323 +#: ../src/vikwindow.c:3694 +msgid "The filename you requested could not be opened for writing." +msgstr "" + +#: ../src/viktrwlayer_export.c:226 +#, c-format +msgid "Could not launch %s." +msgstr "" + +#: ../src/viktrwlayer_export.c:234 +msgid "Could not create temporary file for export." +msgstr "" + +#: ../src/viktrwlayer_export.c:268 +msgid "File format:" +msgstr "" + +#: ../src/viktrwlayer_export.c:276 +msgid "Select the file format." +msgstr "" + +#: ../src/viktrwlayer_export.c:281 +msgid "" +"Select the information to process.\n" +"Warning: the behavior of these switches is highly dependent of the file " +"format selected.\n" +"Please, refer to GPSbabel if unsure." +msgstr "" + +#: ../src/viktrwlayer_export.c:308 +msgid "You did not select a valid file format." +msgstr "" + +#: ../src/viktrwlayer_propwin.c:915 ../src/viktrwlayer_propwin.c:3381 +#: ../src/viktrwlayer_propwin.c:3417 ../src/viktrwlayer_propwin.c:3457 +#: ../src/viktrwlayer_propwin.c:3509 ../src/viktrwlayer_propwin.c:3527 +#: ../src/viktrwlayer_propwin.c:3600 ../src/viktrwlayer_propwin.c:3601 +#: ../src/viktrwlayer_propwin.c:3602 ../src/viktrwlayer_propwin.c:3611 +#: ../src/viktrwlayer_propwin.c:3612 ../src/viktrwlayer_propwin.c:3629 +#: ../src/viktrwlayer_propwin.c:3630 ../src/viktrwlayer_propwin.c:3644 +#: ../src/viktrwlayer_propwin.c:3645 ../src/viktrwlayer_propwin.c:3646 +#: ../src/viktrwlayer_propwin.c:3660 ../src/viktrwlayer_propwin.c:3661 +#: ../src/viktrwlayer_propwin.c:3662 ../src/viktrwlayer_propwin.c:3676 +#: ../src/viktrwlayer_propwin.c:3677 ../src/viktrwlayer_propwin.c:3678 +#: ../src/viktrwlayer_propwin.c:3695 ../src/viktrwlayer_propwin.c:3696 +#: ../src/viktrwlayer_analysis.c:293 +#, c-format +msgid "No Data" +msgstr "Veri Yok" + +#: ../src/viktrwlayer_propwin.c:960 ../src/viktrwlayer_propwin.c:1245 +#, c-format +msgid "%.1f kph" +msgstr "" + +#: ../src/viktrwlayer_propwin.c:963 ../src/viktrwlayer_propwin.c:1248 +#: ../src/viktrwlayer_analysis.c:352 +#, c-format +msgid "%.1f mph" +msgstr "" + +#: ../src/viktrwlayer_propwin.c:966 ../src/viktrwlayer_propwin.c:1251 +#, c-format +msgid "%.1f knots" +msgstr "" + +#: ../src/viktrwlayer_propwin.c:969 ../src/viktrwlayer_propwin.c:1254 +#, c-format +msgid "%.1f s/km" +msgstr "" + +#: ../src/viktrwlayer_propwin.c:972 ../src/viktrwlayer_propwin.c:1257 +#: ../src/viktrwlayer_analysis.c:389 ../src/viktrwlayer_analysis.c:392 +#, fuzzy, c-format +msgid "%.1f min/km" +msgstr "1 dk" + +#: ../src/viktrwlayer_propwin.c:975 ../src/viktrwlayer_propwin.c:1260 +#, c-format +msgid "%.1f sec/mi" +msgstr "" + +#: ../src/viktrwlayer_propwin.c:978 ../src/viktrwlayer_propwin.c:1263 +#: ../src/viktrwlayer_analysis.c:409 ../src/viktrwlayer_analysis.c:412 +#, fuzzy, c-format +msgid "%.1f min/mi" +msgstr "1 dk" + +#. VIK_UNITS_SPEED_METRES_PER_SECOND: +#: ../src/viktrwlayer_propwin.c:982 ../src/viktrwlayer_propwin.c:1267 +#, c-format +msgid "%.1f m/s" +msgstr "" + +#. Minutes +#: ../src/viktrwlayer_propwin.c:1411 +msgid "mins" +msgstr "" + +#. Hours +#: ../src/viktrwlayer_propwin.c:1418 +msgid "h" +msgstr "" + +#. Days +#: ../src/viktrwlayer_propwin.c:1424 +msgid "d" +msgstr "" + +#. Weeks +#: ../src/viktrwlayer_propwin.c:1429 +msgid "w" +msgstr "" + +#. 'Months' +#: ../src/viktrwlayer_propwin.c:1433 +msgid "M" +msgstr "" + +#: ../src/viktrwlayer_propwin.c:2051 ../src/viktrwlayer_analysis.c:303 +#, c-format +msgid "%.1f miles" +msgstr "" + +#: ../src/viktrwlayer_propwin.c:2054 ../src/viktrwlayer_analysis.c:306 +#, c-format +msgid "%.1f NM" +msgstr "" + +#. VIK_UNITS_DISTANCE_KILOMETRES +#: ../src/viktrwlayer_propwin.c:2057 ../src/viktrwlayer_analysis.c:310 +#, c-format +msgid "%.1f km" +msgstr "" + +#: ../src/viktrwlayer_propwin.c:3083 +msgid "Failed spliting track. Track unchanged" +msgstr "" + +#: ../src/viktrwlayer_propwin.c:3234 ../src/viktrwlayer_propwin.c:3744 +#, c-format +msgid "%s - Track Properties" +msgstr "%s - İz Özellikleri" + +#: ../src/viktrwlayer_propwin.c:3239 +msgid "Split at _Marker" +msgstr "" + +#: ../src/viktrwlayer_propwin.c:3240 +msgid "Split _Segments" +msgstr "" + +#: ../src/viktrwlayer_propwin.c:3241 +msgid "_Reverse" +msgstr "" + +#: ../src/viktrwlayer_propwin.c:3242 +msgid "_Delete Dupl." +msgstr "" + +#: ../src/viktrwlayer_propwin.c:3269 +msgid "Comment:" +msgstr "Açıklama:" + +#: ../src/viktrwlayer_propwin.c:3270 +msgid "Description:" +msgstr "" + +#: ../src/viktrwlayer_propwin.c:3271 +#, fuzzy +msgid "Source:" +msgstr "Başlangıç:" + +#: ../src/viktrwlayer_propwin.c:3272 +#, fuzzy +msgid "Type:" +msgstr "Zaman:" + +#: ../src/viktrwlayer_propwin.c:3273 +msgid "Color:" +msgstr "" + +#: ../src/viktrwlayer_propwin.c:3274 +msgid "Draw Name:" +msgstr "" + +#: ../src/viktrwlayer_propwin.c:3275 +msgid "Distance Labels:" +msgstr "" + +#: ../src/viktrwlayer_propwin.c:3278 +msgid "Track Length:" +msgstr "" + +#: ../src/viktrwlayer_propwin.c:3279 +msgid "Trackpoints:" +msgstr "" + +#: ../src/viktrwlayer_propwin.c:3280 +msgid "Segments:" +msgstr "Bölümler:" + +#: ../src/viktrwlayer_propwin.c:3281 +msgid "Duplicate Points:" +msgstr "" + +#: ../src/viktrwlayer_propwin.c:3282 +msgid "Max Speed:" +msgstr "Azami Hız:" + +#: ../src/viktrwlayer_propwin.c:3283 +msgid "Avg. Speed:" +msgstr "Ort. Hız:" + +#: ../src/viktrwlayer_propwin.c:3284 +msgid "Moving Avg. Speed:" +msgstr "" + +#: ../src/viktrwlayer_propwin.c:3285 +msgid "Avg. Dist. Between TPs:" +msgstr "" + +#: ../src/viktrwlayer_propwin.c:3286 +msgid "Elevation Range:" +msgstr "" + +#: ../src/viktrwlayer_propwin.c:3287 +msgid "Total Elevation Gain/Loss:" +msgstr "" + +#: ../src/viktrwlayer_propwin.c:3288 +msgid "Start:" +msgstr "Başlangıç:" + +#: ../src/viktrwlayer_propwin.c:3289 +msgid "End:" +msgstr "Son:" + +#: ../src/viktrwlayer_propwin.c:3290 +msgid "Duration:" +msgstr "Süre:" + +#: ../src/viktrwlayer_propwin.c:3320 +msgid "Centre" +msgstr "" + +#: ../src/viktrwlayer_propwin.c:3321 +msgid "Start only" +msgstr "" + +#: ../src/viktrwlayer_propwin.c:3322 +msgid "End only" +msgstr "" + +#: ../src/viktrwlayer_propwin.c:3323 +msgid "Start and End" +msgstr "" + +#: ../src/viktrwlayer_propwin.c:3324 +msgid "Centre, Start and End" +msgstr "" + +#: ../src/viktrwlayer_propwin.c:3336 +msgid "Maximum number of distance labels to be shown" +msgstr "" + +#: ../src/viktrwlayer_propwin.c:3340 +msgid "Properties" +msgstr "" + +#: ../src/viktrwlayer_propwin.c:3584 +#, c-format +msgid "%d minutes - %d minutes moving" +msgstr "" + +#: ../src/viktrwlayer_propwin.c:3596 +#, c-format +msgid "%s total - %s in segments" +msgstr "" + +#: ../src/viktrwlayer_propwin.c:3607 ../src/viktrwlayer_analysis.c:622 +msgid "Statistics" +msgstr "İstatistikler" + +#: ../src/viktrwlayer_propwin.c:3613 ../src/viktrwlayer_propwin.c:3680 +msgid "Show D_EM" +msgstr "" + +#: ../src/viktrwlayer_propwin.c:3615 ../src/viktrwlayer_propwin.c:3631 +#: ../src/viktrwlayer_propwin.c:3647 ../src/viktrwlayer_propwin.c:3697 +msgid "Show _GPS Speed" +msgstr "" + +#: ../src/viktrwlayer_propwin.c:3617 ../src/viktrwlayer_propwin.c:3633 +#: ../src/viktrwlayer_propwin.c:3665 ../src/viktrwlayer_propwin.c:3699 +msgid "Track Distance:" +msgstr "" + +#: ../src/viktrwlayer_propwin.c:3618 ../src/viktrwlayer_propwin.c:3684 +msgid "Track Height:" +msgstr "" + +#: ../src/viktrwlayer_propwin.c:3624 +msgid "Elevation-distance" +msgstr "" + +#: ../src/viktrwlayer_propwin.c:3634 +msgid "Track Gradient:" +msgstr "" + +#: ../src/viktrwlayer_propwin.c:3639 +msgid "Gradient-distance" +msgstr "" + +#: ../src/viktrwlayer_propwin.c:3649 ../src/viktrwlayer_propwin.c:3666 +#: ../src/viktrwlayer_propwin.c:3683 +msgid "Track Time:" +msgstr "" + +#: ../src/viktrwlayer_propwin.c:3650 ../src/viktrwlayer_propwin.c:3700 +msgid "Track Speed:" +msgstr "" + +#: ../src/viktrwlayer_propwin.c:3651 ../src/viktrwlayer_propwin.c:3667 +#: ../src/viktrwlayer_propwin.c:3685 +msgid "Time/Date:" +msgstr "" + +#: ../src/viktrwlayer_propwin.c:3655 +msgid "Speed-time" +msgstr "Hız-zaman" + +#: ../src/viktrwlayer_propwin.c:3663 ../src/viktrwlayer_propwin.c:3679 +msgid "Show S_peed" +msgstr "" + +#: ../src/viktrwlayer_propwin.c:3671 +msgid "Distance-time" +msgstr "" + +#: ../src/viktrwlayer_propwin.c:3690 +msgid "Elevation-time" +msgstr "" + +#: ../src/viktrwlayer_propwin.c:3705 +msgid "Speed-distance" +msgstr "" + +#: ../src/viktrwlayer_tpwin.c:190 ../src/viktrwlayer_wpwin.c:66 +msgid "Date/Time Edit" +msgstr "" + +#: ../src/viktrwlayer_tpwin.c:242 +msgid "Name:" +msgstr "" + +#: ../src/viktrwlayer_tpwin.c:243 +msgid "Latitude:" +msgstr "Enlem:" + +#: ../src/viktrwlayer_tpwin.c:244 +msgid "Longitude:" +msgstr "Boylam:" + +#: ../src/viktrwlayer_tpwin.c:245 +msgid "Altitude:" +msgstr "Rakım:" + +#: ../src/viktrwlayer_tpwin.c:246 +msgid "Course:" +msgstr "" + +#: ../src/viktrwlayer_tpwin.c:247 +msgid "Timestamp:" +msgstr "" + +#: ../src/viktrwlayer_tpwin.c:248 +msgid "Time:" +msgstr "Zaman:" + +#: ../src/viktrwlayer_tpwin.c:249 +msgid "Distance Difference:" +msgstr "" + +#: ../src/viktrwlayer_tpwin.c:250 +msgid "Time Difference:" +msgstr "Saat Farkı:" + +#: ../src/viktrwlayer_tpwin.c:251 +msgid "\"Speed\" Between:" +msgstr "" + +#: ../src/viktrwlayer_tpwin.c:252 +msgid "Speed:" +msgstr "" + +#: ../src/viktrwlayer_tpwin.c:253 +msgid "VDOP:" +msgstr "VDOP:" + +#: ../src/viktrwlayer_tpwin.c:254 +msgid "HDOP:" +msgstr "HDOP:" + +#: ../src/viktrwlayer_tpwin.c:255 +msgid "PDOP:" +msgstr "PDOP:" + +#: ../src/viktrwlayer_tpwin.c:256 +msgid "SAT/FIX:" +msgstr "" + +#: ../src/viktrwlayer_tpwin.c:263 ../src/viktrwlayer_tpwin.c:408 +#: ../src/viktrwlayer_tpwin.c:622 +msgid "Trackpoint" +msgstr "" + +#: ../src/viktrwlayer_tpwin.c:266 +msgid "_Insert After" +msgstr "" + +#: ../src/viktrwlayer_tpwin.c:268 +msgid "Split Here" +msgstr "" + +#: ../src/viktrwlayer_tracklist.c:262 ../src/viktrwlayer_waypointlist.c:306 +msgid "_Copy Data" +msgstr "" + +#. +#. item = gtk_image_menu_item_new_with_mnemonic ( _("_Select") ); +#. gtk_image_menu_item_set_image ( (GtkImageMenuItem*)item, gtk_image_new_from_stock (GTK_STOCK_FIND, GTK_ICON_SIZE_MENU) ); +#. g_signal_connect_swapped ( G_OBJECT(item), "activate", G_CALLBACK(trw_layer_track_select), values ); +#. gtk_menu_shell_append (GTK_MENU_SHELL (menu), item); +#. gtk_widget_show ( item ); +#. +#. ATM view auto selects, so don't bother with separate select menu entry +#. +#. item = gtk_image_menu_item_new_with_mnemonic ( _("_Select") ); +#. gtk_image_menu_item_set_image ( (GtkImageMenuItem*)item, gtk_image_new_from_stock (GTK_STOCK_FIND, GTK_ICON_SIZE_MENU) ); +#. g_signal_connect_swapped ( G_OBJECT(item), "activate", G_CALLBACK(trw_layer_waypoint_select), values ); +#. gtk_menu_shell_append (GTK_MENU_SHELL (menu), item); +#. gtk_widget_show ( item ); +#. +#. AUTO SELECT NOT TRUE YET... +#. ATM view auto selects, so don't bother with separate select menu entry +#: ../src/viktrwlayer_tracklist.c:290 ../src/viktrwlayer_waypointlist.c:341 +#: ../src/vikwindow.c:4816 +msgid "_View" +msgstr "_Görünüm" + +#. Insert column for the layer name when viewing multi layers +#: ../src/viktrwlayer_tracklist.c:613 ../src/viktrwlayer_waypointlist.c:609 +msgid "Layer" +msgstr "" + +#: ../src/viktrwlayer_tracklist.c:627 ../src/viktrwlayer_waypointlist.c:624 +msgid "Date" +msgstr "" + +#: ../src/viktrwlayer_tracklist.c:631 ../src/viktrwlayer_waypointlist.c:628 +msgid "Visible" +msgstr "" + +#: ../src/viktrwlayer_tracklist.c:639 +msgid "" +"Distance\n" +"(miles)" +msgstr "" + +#: ../src/viktrwlayer_tracklist.c:642 +msgid "" +"Distance\n" +"(NM)" +msgstr "" + +#: ../src/viktrwlayer_tracklist.c:645 +msgid "" +"Distance\n" +"(km)" +msgstr "" + +#: ../src/viktrwlayer_tracklist.c:651 +msgid "" +"Length\n" +"(minutes)" +msgstr "" + +#: ../src/viktrwlayer_tracklist.c:660 ../src/vikutils.c:93 +msgid "sec/mi" +msgstr "" + +#: ../src/viktrwlayer_tracklist.c:666 +#, c-format +msgid "" +"Av. Speed\n" +"(%s)" +msgstr "" + +#. Apply own formatting of the data +#: ../src/viktrwlayer_tracklist.c:671 +#, c-format +msgid "" +"Max Speed\n" +"(%s)" +msgstr "" + +#: ../src/viktrwlayer_tracklist.c:679 ../src/viktrwlayer_waypointlist.c:637 +msgid "" +"Max Height\n" +"(Feet)" +msgstr "" + +#: ../src/viktrwlayer_tracklist.c:681 ../src/viktrwlayer_waypointlist.c:639 +msgid "" +"Max Height\n" +"(Metres)" +msgstr "" + +#: ../src/viktrwlayer_waypointlist.c:312 +msgid "Copy Data (with _positions)" +msgstr "" + +#: ../src/viktrwlayer_waypointlist.c:633 +msgid "Comment" +msgstr "" + +#: ../src/viktrwlayer_waypointlist.c:643 +msgid "Symbol" +msgstr "" + +#: ../src/viktrwlayer_wpwin.c:93 ../src/viktrwlayer_wpwin.c:302 +msgid "True" +msgstr "" + +#: ../src/viktrwlayer_wpwin.c:122 +msgid "Waypoint Properties" +msgstr "Yol işareti Özellikleri" + +#: ../src/viktrwlayer_wpwin.c:164 +msgid "Name:" +msgstr "Adı:" + +#: ../src/viktrwlayer_wpwin.c:181 +msgid "Altitude:" +msgstr "Rakım:" + +#: ../src/viktrwlayer_wpwin.c:186 ../src/viktrwlayer_wpwin.c:188 +msgid "Comment:" +msgstr "Yorum:" + +#: ../src/viktrwlayer_wpwin.c:202 +#, fuzzy +msgid "Source:" +msgstr "İndirme Kaynağı" + +#: ../src/viktrwlayer_wpwin.c:212 +msgid "Image:" +msgstr "Görüntü:" + +#: ../src/viktrwlayer_wpwin.c:217 +msgid "Symbol:" +msgstr "Sembol:" + +#: ../src/viktrwlayer_wpwin.c:226 +msgid "(none)" +msgstr "(yok)" + +#. Geotag Info [readonly] +#: ../src/viktrwlayer_wpwin.c:272 +msgid "Has Geotag" +msgstr "" + +#: ../src/viktrwlayer_wpwin.c:279 +msgid "Consistent Position" +msgstr "" + +#. ATM the direction value box is always shown, even when there is no information. +#. It would be nice to be able to hide it until the 'Add' has been performed, +#. however I've not been able to achieve this. +#. Thus simply sensistizing it instead. +#: ../src/viktrwlayer_wpwin.c:292 +#, fuzzy +msgid "Image Direction:" +msgstr "Görüntü Ayarları" + +#: ../src/viktrwlayer_wpwin.c:300 +msgid "Magnetic" +msgstr "" + +#: ../src/viktrwlayer_wpwin.c:320 +msgid "Time:" +msgstr "" + +#. TODO: other checks (isalpha or whatever ) +#: ../src/viktrwlayer_wpwin.c:386 +msgid "Please enter a name for the waypoint." +msgstr "Yol işareti için bir ad girin." + +#: ../src/viktrwlayer_geotag.c:320 ../src/viktrwlayer_geotag.c:460 +#, c-format +msgid "Failed updating EXIF on %s" +msgstr "" + +#: ../src/viktrwlayer_geotag.c:562 +#, c-format +msgid "Geotagging %d Images..." +msgstr "" + +#: ../src/viktrwlayer_geotag.c:630 +msgid "Geotag Images" +msgstr "" + +#: ../src/viktrwlayer_geotag.c:640 +msgid "Images" +msgstr "" + +#: ../src/viktrwlayer_geotag.c:645 +msgid "Overwrite Existing Waypoints:" +msgstr "" + +#: ../src/viktrwlayer_geotag.c:648 +msgid "Overwrite Existing GPS Information:" +msgstr "" + +#: ../src/viktrwlayer_geotag.c:650 +msgid "Keep File Modification Timestamp:" +msgstr "" + +#: ../src/viktrwlayer_geotag.c:684 +msgid "Create Waypoints:" +msgstr "" + +#: ../src/viktrwlayer_geotag.c:693 +msgid "Write EXIF:" +msgstr "" + +#: ../src/viktrwlayer_geotag.c:705 +msgid "Automatic Image Direction:" +msgstr "" + +#: ../src/viktrwlayer_geotag.c:707 +msgid "Set image direction based on a heading derived from the track" +msgstr "" + +#: ../src/viktrwlayer_geotag.c:710 +msgid "Interpolate Between Track Segments:" +msgstr "" + +#: ../src/viktrwlayer_geotag.c:715 +msgid "Image Time Offset (Seconds):" +msgstr "" + +#: ../src/viktrwlayer_geotag.c:718 +msgid "" +"The number of seconds to ADD to the photos time to make it match the GPS " +"data. Calculate this with (GPS - Photo). Can be negative or positive. Useful " +"to adjust times when a camera's timestamp was incorrect." +msgstr "" + +#: ../src/viktrwlayer_geotag.c:721 +msgid "Image Timezone:" +msgstr "" + +#: ../src/viktrwlayer_geotag.c:724 +msgid "" +"The timezone that was used when the images were created. For example, if a " +"camera is set to AWST or +8:00 hours. Enter +8:00 here so that the correct " +"adjustment to the images' time can be made. GPS data is always in UTC." +msgstr "" + +#: ../src/viktrwlayer_geotag.c:728 +#, c-format +msgid "Using waypoint: %s" +msgstr "" + +#: ../src/viktrwlayer_geotag.c:742 +#, c-format +msgid "Using track: %s" +msgstr "" + +#: ../src/viktrwlayer_geotag.c:744 +#, c-format +msgid "Using all tracks in: %s" +msgstr "" + +#: ../src/viktrwlayer_analysis.c:214 +msgid "Number of Tracks" +msgstr "" + +#: ../src/viktrwlayer_analysis.c:215 +msgid "Date Range" +msgstr "" + +#: ../src/viktrwlayer_analysis.c:216 +msgid "Total Length" +msgstr "" + +#: ../src/viktrwlayer_analysis.c:217 +msgid "Average Length" +msgstr "" + +#: ../src/viktrwlayer_analysis.c:218 +msgid "Eddington number" +msgstr "" + +#. No.4: Extended display only +#: ../src/viktrwlayer_analysis.c:219 +msgid "Max Speed" +msgstr "" + +#: ../src/viktrwlayer_analysis.c:220 +msgid "Avg. Speed" +msgstr "" + +#: ../src/viktrwlayer_analysis.c:221 +msgid "Minimum Altitude" +msgstr "" + +#: ../src/viktrwlayer_analysis.c:222 +msgid "Maximum Altitude" +msgstr "" + +#: ../src/viktrwlayer_analysis.c:223 +msgid "Total Elevation Gain/Loss" +msgstr "" + +#: ../src/viktrwlayer_analysis.c:224 +msgid "Avg. Elevation Gain/Loss" +msgstr "" + +#: ../src/viktrwlayer_analysis.c:225 +msgid "Total Duration" +msgstr "" + +#: ../src/viktrwlayer_analysis.c:226 +msgid "Avg. Duration" +msgstr "" + +#: ../src/viktrwlayer_analysis.c:317 +#, c-format +msgid "%.2f miles" +msgstr "" + +#: ../src/viktrwlayer_analysis.c:320 +#, c-format +msgid "%.2f NM" +msgstr "" + +#. VIK_UNITS_DISTANCE_KILOMETRES +#: ../src/viktrwlayer_analysis.c:324 +#, c-format +msgid "%.2f km" +msgstr "" + +#: ../src/viktrwlayer_analysis.c:361 +#, c-format +msgid "%.2f m/s" +msgstr "" + +#: ../src/viktrwlayer_analysis.c:370 ../src/viktrwlayer_analysis.c:373 +#, c-format +msgid "%.2f knots" +msgstr "" + +#: ../src/viktrwlayer_analysis.c:379 ../src/viktrwlayer_analysis.c:382 +#, c-format +msgid "%d s/km" +msgstr "" + +#: ../src/viktrwlayer_analysis.c:399 ../src/viktrwlayer_analysis.c:402 +#, c-format +msgid "%d sec/mi" +msgstr "" + +#: ../src/viktrwlayer_analysis.c:420 ../src/viktrwlayer_analysis.c:423 +#, c-format +msgid "%.2f km/h" +msgstr "" + +#: ../src/viktrwlayer_analysis.c:434 ../src/viktrwlayer_analysis.c:440 +#, c-format +msgid "%d feet" +msgstr "" + +#: ../src/viktrwlayer_analysis.c:445 ../src/viktrwlayer_analysis.c:447 +#, c-format +msgid "%d feet / %d feet" +msgstr "" + +#: ../src/viktrwlayer_analysis.c:452 ../src/viktrwlayer_analysis.c:458 +#, c-format +msgid "%d m" +msgstr "" + +#: ../src/viktrwlayer_analysis.c:463 ../src/viktrwlayer_analysis.c:465 +#, c-format +msgid "%d m / %d m" +msgstr "" + +#: ../src/viktrwlayer_analysis.c:477 +#, c-format +msgid "%d:%02d:%02d days:hrs:mins" +msgstr "" + +#: ../src/viktrwlayer_analysis.c:484 +#, c-format +msgid "%d:%02d hrs:mins" +msgstr "" + +#: ../src/viktrwlayer_analysis.c:658 +msgid "Include Invisible Items" +msgstr "" + +#: ../src/vikstatus.c:129 +msgid "Current number of background tasks. Click to see the background jobs." +msgstr "" + +#: ../src/vikstatus.c:134 +msgid "Current zoom level. Click to select a new one." +msgstr "" + +#: ../src/vikstatus.c:141 +msgid "Left click to clear the message. Right click to copy the message." +msgstr "" + +#: ../src/vikutils.c:108 +msgid "GPSD" +msgstr "" + +#. GPS Preamble +#: ../src/vikutils.c:109 +msgid "Trkpt" +msgstr "" + +#: ../src/vikutils.c:160 +#, c-format +msgid "%sSpeed%s %.1f%s" +msgstr "" + +#. Go for 2dp as expect low values for vertical speeds +#: ../src/vikutils.c:214 +#, c-format +msgid "%sClimb%s %.2f%s" +msgstr "" + +#: ../src/vikutils.c:223 +#, c-format +msgid "%sAlt %dfeet" +msgstr "" + +#. VIK_UNITS_HEIGHT_METRES: +#: ../src/vikutils.c:227 +#, c-format +msgid "%sAlt %dm" +msgstr "" + +#: ../src/vikutils.c:235 +#, c-format +msgid "%sCourse %03d°" +msgstr "" + +#: ../src/vikutils.c:249 +msgid "yards" +msgstr "" + +#. VIK_UNITS_DISTANCE_KILOMETRES: +#: ../src/vikutils.c:253 +msgid "m" +msgstr "" + +#: ../src/vikutils.c:257 +#, c-format +msgid "%sDistance diff %d%s" +msgstr "" + +#: ../src/vikutils.c:272 +#, c-format +msgid "%sTime %s" +msgstr "" + +#: ../src/vikutils.c:281 +#, c-format +msgid "%sTime diff %lds" +msgstr "" + +#: ../src/vikutils.c:287 +#, c-format +msgid "%sNo. of Sats %d" +msgstr "" + +#: ../src/vikutils.c:312 +#, c-format +msgid "%sTo End %.2f%s" +msgstr "" + +#: ../src/vikutils.c:339 +#, c-format +msgid "%sDistance along %.2f%s" +msgstr "" + +#: ../src/vikutils.c:359 +#, c-format +msgid "%sTrack: %s" +msgstr "" + +#: ../src/vikutils.c:396 +#, c-format +msgid "" +"There is a newer version of Viking available: %s\n" +"\n" +"Do you wish to go to Viking's website now?" +msgstr "" + +#: ../src/vikutils.c:526 +msgid "" +"This appears to be Viking's very first run.\n" +"\n" +"Do you wish to enable automatic internet features?\n" +"\n" +"Individual settings can be controlled in the Preferences." +msgstr "" + +#: ../src/vikwaypoint.c:37 +msgid "Waypoint" +msgstr "" + +#: ../src/vikwebtool_datasource.c:352 +msgid "Search Term" +msgstr "" + +#. TODO get rid of this as this is unnecessary duplication... +#: ../src/vikwindow.c:258 +msgid "Pan" +msgstr "Kaydırma" + +#: ../src/vikwindow.c:258 +msgid "Zoom" +msgstr "Yakınlaştır" + +#: ../src/vikwindow.c:258 +msgid "Ruler" +msgstr "Cetvel" + +#: ../src/vikwindow.c:258 +msgid "Select" +msgstr "" + +#: ../src/vikwindow.c:368 +msgid "This is Viking " +msgstr "" + +#: ../src/vikwindow.c:457 +msgid "Location lookup aborted" +msgstr "" + +#: ../src/vikwindow.c:477 +#, c-format +msgid "Location found: %s" +msgstr "" + +#: ../src/vikwindow.c:486 +msgid "Unable to determine location" +msgstr "" + +#: ../src/vikwindow.c:495 +msgid "Determining location" +msgstr "" + +#: ../src/vikwindow.c:525 +#, c-format +msgid "Location found via geoclue" +msgstr "" + +#: ../src/vikwindow.c:546 +msgid "Default Map" +msgstr "" + +#: ../src/vikwindow.c:557 ../src/vikwindow.c:3938 +msgid "Trying to determine location..." +msgstr "" + +#. Create tooltip +#: ../src/vikwindow.c:723 +msgid "Select zoom level" +msgstr "" + +#: ../src/vikwindow.c:1176 +#, c-format +msgid "" +"Do you want to save the changes you made to the document \"%s\"?\n" +"\n" +"Your changes will be lost if you don't save them." +msgstr "" + +#: ../src/vikwindow.c:1180 +msgid "Don't Save" +msgstr "Kaydetme" + +#: ../src/vikwindow.c:1268 +msgid "mpp" +msgstr "" + +#: ../src/vikwindow.c:1268 +msgid "pixelfact" +msgstr "piksel durumu" + +#: ../src/vikwindow.c:1467 +#, c-format +msgid "%s %s %dm" +msgstr "%s %s %dm" + +#: ../src/vikwindow.c:1469 +#, c-format +msgid "%s %s %dft" +msgstr "%s %s %dft" + +#: ../src/vikwindow.c:1472 +#, c-format +msgid "%s %s" +msgstr "%s %s" + +#: ../src/vikwindow.c:1929 +msgid "_Ruler" +msgstr "_Cetvel" + +#: ../src/vikwindow.c:1929 +msgid "Ruler Tool" +msgstr "Cetvel Aracı" + +#: ../src/vikwindow.c:2204 ../src/vikwindow.c:4818 +msgid "_Zoom" +msgstr "_Yakınlaş" + +#: ../src/vikwindow.c:2204 +msgid "Zoom Tool" +msgstr "Yakınlaştırma Aracı" + +#: ../src/vikwindow.c:2271 ../src/vikwindow.c:4819 +msgid "_Pan" +msgstr "_Kaydırma" + +#: ../src/vikwindow.c:2271 +msgid "Pan Tool" +msgstr "Kaydırma" + +#: ../src/vikwindow.c:2425 +msgid "_Select" +msgstr "" + +#: ../src/vikwindow.c:2425 +msgid "Select Tool" +msgstr "" + +#: ../src/vikwindow.c:2615 +msgid "You must select a layer to show its properties." +msgstr "Özelliklerini görüntülemek için bir katman seçmelisiniz." + +#. No error to show, so unlikely this will get called +#: ../src/vikwindow.c:2629 +msgid "The help system is not available." +msgstr "" + +#. Main error path +#: ../src/vikwindow.c:2632 +#, c-format +msgid "" +"Help is not available because: %s.\n" +"Ensure a Mime Type ghelp handler program is installed (e.g. yelp)." +msgstr "" + +#: ../src/vikwindow.c:2865 +msgid "You must select a layer to delete." +msgstr "" + +#: ../src/vikwindow.c:3171 +msgid "Untitled" +msgstr "İsimsiz" + +#: ../src/vikwindow.c:3300 +#, c-format +msgid "Unable to add '%s' to the list of recently used documents" +msgstr "" + +#: ../src/vikwindow.c:3391 +msgid "The file you requested could not be opened." +msgstr "" + +#: ../src/vikwindow.c:3394 +msgid "" +"GPSBabel is required to load files of this type or GPSBabel encountered " +"problems." +msgstr "" + +#: ../src/vikwindow.c:3397 +#, c-format +msgid "Unable to load malformed GPX file %s" +msgstr "" + +#: ../src/vikwindow.c:3400 +#, c-format +msgid "Unsupported file type for %s" +msgstr "" + +#. Since we can process .vik files with issues just show a warning in the status bar +#. Not that a user can do much about it... or tells them what this issue is yet... +#: ../src/vikwindow.c:3406 +#, c-format +msgid "WARNING: issues encountered loading %s" +msgstr "" + +#: ../src/vikwindow.c:3489 +msgid "Please select a GPS data file to open. " +msgstr "" + +#: ../src/vikwindow.c:3508 +msgid "Google Earth" +msgstr "" + +#: ../src/vikwindow.c:3523 ../src/vikwindow.c:3646 ../src/viking.desktop.in.h:1 +msgid "Viking" +msgstr "Viking" + +#: ../src/vikwindow.c:3594 ../src/vikwindow.c:4632 +msgid "Open File" +msgstr "" + +#: ../src/vikwindow.c:3630 +msgid "Save as Viking File." +msgstr "" + +#: ../src/vikwindow.c:3757 +#, c-format +msgid "Exporting to file: %s" +msgstr "" + +#. Confirm what happened. +#: ../src/vikwindow.c:3774 +#, c-format +msgid "Exported files: %d" +msgstr "" + +#: ../src/vikwindow.c:3786 +msgid "Nothing to Export!" +msgstr "" + +#: ../src/vikwindow.c:3790 +msgid "Export to directory" +msgstr "" + +#: ../src/vikwindow.c:3809 +msgid "Could not convert all files" +msgstr "" + +#: ../src/vikwindow.c:3851 +msgid "File not accessible" +msgstr "" + +#: ../src/vikwindow.c:3854 +msgid "No Viking File" +msgstr "" + +#: ../src/vikwindow.c:3998 +msgid "This layer has no configurable properties." +msgstr "" + +#: ../src/vikwindow.c:4080 +msgid "Are you sure you wish to delete all layers?" +msgstr "" + +#. Try harder... +#: ../src/vikwindow.c:4126 ../src/vikwindow.c:4132 +msgid "Generating image file..." +msgstr "" + +#: ../src/vikwindow.c:4154 +msgid "" +"Failed to generate internal image.\n" +"\n" +"Try creating a smaller image." +msgstr "" + +#: ../src/vikwindow.c:4175 +msgid "Image file generated." +msgstr "" + +#: ../src/vikwindow.c:4177 +msgid "Failed to generate image file." +msgstr "" + +#: ../src/vikwindow.c:4246 +#, c-format +msgid "Unable to write to file %s: %s" +msgstr "" + +#: ../src/vikwindow.c:4284 +msgid "" +"Viewable region outside allowable pixel size bounds for image. Clipping " +"width/height values." +msgstr "" + +#: ../src/vikwindow.c:4309 +#, c-format +msgid "Total area: %ldm x %ldm (%.3f sq. km)" +msgstr "" + +#: ../src/vikwindow.c:4312 +#, c-format +msgid "Total area: %ldm x %ldm (%.3f sq. miles)" +msgstr "" + +#: ../src/vikwindow.c:4315 +#, c-format +msgid "Total area: %ldm x %ldm (%.3f sq. NM)" +msgstr "" + +#. Single file +#: ../src/vikwindow.c:4343 +msgid "Save Image" +msgstr "Resmi Kaydet" + +#: ../src/vikwindow.c:4364 ../src/vikwindow.c:4641 +msgid "KMZ" +msgstr "" + +#: ../src/vikwindow.c:4417 +msgid "You must be in UTM mode to use this feature" +msgstr "" + +#: ../src/vikwindow.c:4421 +msgid "Choose a directory to hold images" +msgstr "Görüntüleri kaydetmek için dizin seç" + +#. todo: default for answers inside VikWindow or static (thruout instance) +#: ../src/vikwindow.c:4441 +msgid "Save to Image File" +msgstr "Görüntü dosyasını kaydet." + +#: ../src/vikwindow.c:4457 +msgid "Width (pixels):" +msgstr "Genişlik (piksel) :" + +#: ../src/vikwindow.c:4459 +msgid "Height (pixels):" +msgstr "Yükseklik (piksel) :" + +#: ../src/vikwindow.c:4462 +msgid "" +"WARNING: USING LARGE IMAGES OVER 10000x10000\n" +"MAY CRASH THE PROGRAM!" +msgstr "" + +#: ../src/vikwindow.c:4464 +msgid "Zoom (meters per pixel):" +msgstr "" + +#: ../src/vikwindow.c:4480 +msgid "Area in current viewable window" +msgstr "" + +#: ../src/vikwindow.c:4490 +msgid "Save as PNG" +msgstr "PNG olarak kaydet" + +#: ../src/vikwindow.c:4491 +msgid "Save as JPEG" +msgstr "JPEG olarak kaydet" + +#: ../src/vikwindow.c:4520 +msgid "East-west image tiles:" +msgstr "" + +#: ../src/vikwindow.c:4522 +msgid "North-south image tiles:" +msgstr "" + +#: ../src/vikwindow.c:4619 +msgid "This feature is not available in UTM mode" +msgstr "" + +#: ../src/vikwindow.c:4658 +#, c-format +msgid "Unable to import %s." +msgstr "" + +#: ../src/vikwindow.c:4749 +msgid "Choose a background color" +msgstr "Bir arka plan rengi seçiniz" + +#: ../src/vikwindow.c:4765 +msgid "Choose a track highlight color" +msgstr "" + +#: ../src/vikwindow.c:4814 +msgid "_File" +msgstr "_Dosya" + +#: ../src/vikwindow.c:4815 +msgid "_Edit" +msgstr "_Düzenle" + +#: ../src/vikwindow.c:4817 +msgid "_Show" +msgstr "_Göster" + +#: ../src/vikwindow.c:4820 +msgid "_Layers" +msgstr "_Katmanlar" + +#: ../src/vikwindow.c:4821 +msgid "_Tools" +msgstr "_Araçlar" + +#: ../src/vikwindow.c:4822 +msgid "_Webtools" +msgstr "_Web araçları" + +#: ../src/vikwindow.c:4823 ../src/vikwindow.c:4893 +msgid "_Help" +msgstr "_Yardım" + +#: ../src/vikwindow.c:4825 +msgid "New file" +msgstr "Yeni dosya" + +#: ../src/vikwindow.c:4826 +msgid "_Open..." +msgstr "_Aç..." + +#: ../src/vikwindow.c:4826 +msgid "Open a file" +msgstr "Bir dosya aç" + +#: ../src/vikwindow.c:4827 +msgid "Open _Recent File" +msgstr "" + +#: ../src/vikwindow.c:4828 +msgid "Append _File..." +msgstr "" + +#: ../src/vikwindow.c:4828 +msgid "Append data from a different file" +msgstr "" + +#: ../src/vikwindow.c:4829 +msgid "Open GPX as External _Layer..." +msgstr "" + +#: ../src/vikwindow.c:4829 +msgid "Open a GPX file as an external layer" +msgstr "" + +#: ../src/vikwindow.c:4830 +msgid "_Export All" +msgstr "" + +#: ../src/vikwindow.c:4830 +msgid "Export All TrackWaypoint Layers" +msgstr "" + +#: ../src/vikwindow.c:4831 +msgid "_GPX..." +msgstr "" + +#: ../src/vikwindow.c:4831 +msgid "Export as GPX" +msgstr "" + +#: ../src/vikwindow.c:4832 +msgid "A_cquire" +msgstr "" + +#: ../src/vikwindow.c:4833 +msgid "_Directions..." +msgstr "" + +#: ../src/vikwindow.c:4833 +msgid "Get driving directions" +msgstr "" + +#: ../src/vikwindow.c:4835 +msgid "_OSM Traces..." +msgstr "" + +#: ../src/vikwindow.c:4835 +msgid "Get traces from OpenStreetMap" +msgstr "" + +#: ../src/vikwindow.c:4836 +msgid "_My OSM Traces..." +msgstr "" + +#: ../src/vikwindow.c:4836 +msgid "Get Your Own Traces from OpenStreetMap" +msgstr "" + +#: ../src/vikwindow.c:4839 +msgid "Geo_caches..." +msgstr "" + +#: ../src/vikwindow.c:4839 +msgid "Get Geocaches from geocaching.com" +msgstr "" + +#: ../src/vikwindow.c:4842 +msgid "Create waypoints from geotagged images" +msgstr "" + +#: ../src/vikwindow.c:4844 +msgid "Get a file from a URL" +msgstr "" + +#: ../src/vikwindow.c:4846 +msgid "Create waypoints from Wikipedia items in the current view" +msgstr "" + +#: ../src/vikwindow.c:4848 +msgid "_Save" +msgstr "_Kaydet" + +#: ../src/vikwindow.c:4848 +msgid "Save the file" +msgstr "Dosyayı kaydet" + +#: ../src/vikwindow.c:4849 +msgid "Save _As..." +msgstr "Farklı Kaydet..." + +#: ../src/vikwindow.c:4849 +msgid "Save the file under different name" +msgstr "" + +#: ../src/vikwindow.c:4850 +msgid "Properties..." +msgstr "" + +#: ../src/vikwindow.c:4850 +msgid "File Properties" +msgstr "" + +#: ../src/vikwindow.c:4852 +msgid "Import KMZ _Map File..." +msgstr "" + +#: ../src/vikwindow.c:4852 +msgid "Import a KMZ file" +msgstr "" + +#: ../src/vikwindow.c:4853 +msgid "Generate _KMZ Map File..." +msgstr "" + +#: ../src/vikwindow.c:4853 +msgid "Generate a KMZ file with an overlay of the current view" +msgstr "" + +#: ../src/vikwindow.c:4855 +msgid "_Generate Image File..." +msgstr "_Görüntü dosyası oluştur..." + +#: ../src/vikwindow.c:4855 +msgid "Save a snapshot of the workspace into a file" +msgstr "" + +#: ../src/vikwindow.c:4856 +msgid "Generate _Directory of Images..." +msgstr "" + +#: ../src/vikwindow.c:4856 +msgid "Generate _Directory of Images" +msgstr "" + +#: ../src/vikwindow.c:4857 +msgid "_Print..." +msgstr "_Yazdır..." + +#: ../src/vikwindow.c:4857 +msgid "Print maps" +msgstr "Haritaları yazdır" + +#: ../src/vikwindow.c:4858 +msgid "E_xit" +msgstr "_Çıkış" + +#: ../src/vikwindow.c:4858 +msgid "Exit the program" +msgstr "Programdan çık" + +#: ../src/vikwindow.c:4859 +msgid "Save and Exit" +msgstr "Kaydet ve Çık" + +#: ../src/vikwindow.c:4859 +msgid "Save and Exit the program" +msgstr "Programdan çık ve kaydet" + +#: ../src/vikwindow.c:4861 +msgid "Go to the Pre_vious Location" +msgstr "" + +#: ../src/vikwindow.c:4861 +msgid "Go to the previous location" +msgstr "" + +#: ../src/vikwindow.c:4862 +msgid "Go to the _Next Location" +msgstr "" + +#: ../src/vikwindow.c:4862 +msgid "Go to the next location" +msgstr "" + +#: ../src/vikwindow.c:4863 +msgid "Go to the _Default Location" +msgstr "_Varsayılan konuma git" + +#: ../src/vikwindow.c:4863 +msgid "Go to the default location" +msgstr "Varsayılan konuma git" + +#: ../src/vikwindow.c:4864 +#, fuzzy +msgid "Go to the _Auto Location" +msgstr "_Varsayılan konuma git" + +#: ../src/vikwindow.c:4864 +msgid "Go to a location via automatic lookup" +msgstr "" + +#: ../src/vikwindow.c:4865 +msgid "Go to _Location..." +msgstr "Bulunduğum yere git..." + +#: ../src/vikwindow.c:4865 +msgid "Go to address/place using text search" +msgstr "" + +#: ../src/vikwindow.c:4866 +msgid "_Go to Lat/Lon..." +msgstr "_Enlem/Boylama git..." + +#: ../src/vikwindow.c:4866 +msgid "Go to arbitrary lat/lon coordinate" +msgstr "" + +#: ../src/vikwindow.c:4867 +msgid "Go to UTM..." +msgstr "UTM ye git..." + +#: ../src/vikwindow.c:4867 +msgid "Go to arbitrary UTM coordinate" +msgstr "" + +#: ../src/vikwindow.c:4868 +#, fuzzy +msgid "Go to Today" +msgstr "UTM Git" + +#: ../src/vikwindow.c:4868 +msgid "Go to today on the calendar" +msgstr "" + +#: ../src/vikwindow.c:4869 +msgid "_Refresh" +msgstr "" + +#: ../src/vikwindow.c:4869 +msgid "Refresh any maps displayed" +msgstr "" + +#: ../src/vikwindow.c:4870 +msgid "Set _Highlight Color..." +msgstr "" + +#: ../src/vikwindow.c:4870 +msgid "Set Highlight Color" +msgstr "" + +#: ../src/vikwindow.c:4871 +msgid "Set Bac_kground Color..." +msgstr "Arkaplan rengini seç..." + +#: ../src/vikwindow.c:4871 +msgid "Set Background Color" +msgstr "" + +#: ../src/vikwindow.c:4872 +msgid "Zoom _In" +msgstr "_Yakınlaş" + +#: ../src/vikwindow.c:4872 +msgid "Zoom In" +msgstr "" + +#: ../src/vikwindow.c:4873 +msgid "Zoom _Out" +msgstr "_Uzaklaş" + +#: ../src/vikwindow.c:4873 +msgid "Zoom Out" +msgstr "" + +#: ../src/vikwindow.c:4874 +msgid "Zoom _To..." +msgstr "" + +#: ../src/vikwindow.c:4874 +msgid "Zoom To" +msgstr "" + +#: ../src/vikwindow.c:4875 +msgid "Pan _North" +msgstr "Kuzeye _Kaydır" + +#: ../src/vikwindow.c:4876 +msgid "Pan _East" +msgstr "Doğuya _Kaydır" + +#: ../src/vikwindow.c:4877 +msgid "Pan _South" +msgstr "Güneye _Kaydır" + +#: ../src/vikwindow.c:4878 +msgid "Pan _West" +msgstr "Batıya _Kaydır" + +#: ../src/vikwindow.c:4879 +msgid "Background _Jobs" +msgstr "" + +#: ../src/vikwindow.c:4879 +msgid "Background Jobs" +msgstr "" + +#: ../src/vikwindow.c:4881 +msgid "Cu_t" +msgstr "_Kes" + +#: ../src/vikwindow.c:4885 +msgid "Delete All" +msgstr "Tümünü Sil" + +#: ../src/vikwindow.c:4886 +msgid "Copy Centre _Location" +msgstr "" + +#: ../src/vikwindow.c:4887 +msgid "_Flush Map Cache" +msgstr "" + +#: ../src/vikwindow.c:4888 +msgid "_Set the Default Location" +msgstr "_Varsayılan konumu ayarla" + +#: ../src/vikwindow.c:4888 +msgid "Set the Default Location to the current position" +msgstr "" + +#: ../src/vikwindow.c:4889 +msgid "_Preferences" +msgstr "_Tercihler" + +#: ../src/vikwindow.c:4889 +msgid "Program Preferences" +msgstr "" + +#: ../src/vikwindow.c:4890 +msgid "_Layer Defaults" +msgstr "" + +#: ../src/vikwindow.c:4891 +msgid "_Properties" +msgstr "_Özellikler" + +#: ../src/vikwindow.c:4893 +msgid "Help" +msgstr "" + +#: ../src/vikwindow.c:4894 +msgid "_About" +msgstr "_Hakkında" + +#: ../src/vikwindow.c:4894 +msgid "About" +msgstr "" + +#: ../src/vikwindow.c:4903 +msgid "_KML..." +msgstr "" + +#: ../src/vikwindow.c:4903 +msgid "Export as KML" +msgstr "" + +#: ../src/vikwindow.c:4904 +msgid "Transfer data from a GPS device" +msgstr "Bir GPS cihazından veri transferi" + +#: ../src/vikwindow.c:4905 +msgid "Import file via GPSBabel converter" +msgstr "" + +#: ../src/vikwindow.c:4909 +msgid "Import Geo_JSON File..." +msgstr "" + +#: ../src/vikwindow.c:4909 +msgid "Import GeoJSON file" +msgstr "" + +#: ../src/vikwindow.c:4914 +msgid "_UTM Mode" +msgstr "_UTM Modu" + +#: ../src/vikwindow.c:4915 +msgid "_Expedia Mode" +msgstr "_Expedia Modu" + +#: ../src/vikwindow.c:4916 +msgid "_Mercator Mode" +msgstr "_Mercator Modu" + +#: ../src/vikwindow.c:4917 +msgid "Lat_/Lon Mode" +msgstr "Enlem_/Boylam Modu" + +#: ../src/vikwindow.c:4921 +msgid "Show _Scale" +msgstr "Ölçeği _Göster" + +#: ../src/vikwindow.c:4921 +msgid "Show Scale" +msgstr "Ölçeği Göster" + +#: ../src/vikwindow.c:4922 +msgid "Show _Center Mark" +msgstr "" + +#: ../src/vikwindow.c:4922 +msgid "Show Center Mark" +msgstr "" + +#: ../src/vikwindow.c:4923 +msgid "Show _Highlight" +msgstr "" + +#: ../src/vikwindow.c:4923 +msgid "Show Highlight" +msgstr "" + +#: ../src/vikwindow.c:4924 +msgid "_Full Screen" +msgstr "_Tam Ekran" + +#: ../src/vikwindow.c:4924 +msgid "Activate full screen mode" +msgstr "Tam ekran modunu etkinleştir" + +#: ../src/vikwindow.c:4925 +msgid "Show Side _Panel" +msgstr "Yan Paneli _Göster" + +#: ../src/vikwindow.c:4925 +msgid "Show Side Panel" +msgstr "Yan Paneli Göster" + +#: ../src/vikwindow.c:4926 +msgid "Show Status_bar" +msgstr "Durum çubuğunu göster" + +#: ../src/vikwindow.c:4926 +msgid "Show Statusbar" +msgstr "Durum çubuğunu Göster" + +#: ../src/vikwindow.c:4927 +msgid "Show _Toolbar" +msgstr "_Araç Çubuğunu Göster" + +#: ../src/vikwindow.c:4927 +msgid "Show Toolbar" +msgstr "Araç Çubuğunu Göster" + +#: ../src/vikwindow.c:4928 +msgid "Show _Menu" +msgstr "_Menü Göster" + +#: ../src/vikwindow.c:4928 +msgid "Show Menu" +msgstr "Menü Göster" + +#: ../src/vikwindow.c:4929 +#, fuzzy +msgid "Show Side Panel B_uttons" +msgstr "Yan Paneli Göster" + +#: ../src/vikwindow.c:4929 +#, fuzzy +msgid "Show Side Panel Buttons" +msgstr "Yan Paneli Göster" + +#: ../src/vikwindow.c:4930 +#, fuzzy +msgid "Show Side Panel Ca_lendar" +msgstr "Yan Paneli Göster" + +#: ../src/vikwindow.c:4930 +#, fuzzy +msgid "Show Side Panel Calendar" +msgstr "Yan Paneli Göster" + +#: ../src/vikwindow.c:5064 +#, c-format +msgid "New _%s Layer" +msgstr "" + +#: ../src/vikwindow.c:5114 +#, fuzzy +msgid "..." +msgstr "Ekle..." + +#: ../src/viking.desktop.in.h:2 +msgid "GPS Data Manager" +msgstr "GPS Veri Yöneticisi" + +#: ../src/viking.desktop.in.h:3 +msgid "Map Based GPS Data Manager (live data capable)." +msgstr "Harita Tabanlı GPS Veri Yöneticisi (canlı veri kapasiteli)." + +#: ../src/libjpeg/jpeg-data.c:205 +msgid "Data does not follow JPEG specification." +msgstr "" + +#: ../src/libjpeg/jpeg-data.c:302 +#, c-format +msgid "Path '%s' invalid." +msgstr "" + +#: ../src/libjpeg/jpeg-data.c:320 +#, c-format +msgid "Could not read '%s'." +msgstr "" + +#~ msgid "Email:" +#~ msgstr "E-posta:" + +#~ msgid "Error: couldn't find gpsbabel." +#~ msgstr "Hata: gpsbabel bulunamadı." diff --git a/po/uk.po b/po/uk.po new file mode 100644 index 0000000..3925fe3 --- /dev/null +++ b/po/uk.po @@ -0,0 +1,6076 @@ +# Ukrainian translation for viking +# Copyright (c) 2010 Rosetta Contributors and Canonical Ltd 2010 +# This file is distributed under the same license as the viking package. +# FIRST AUTHOR , 2010. +# +msgid "" +msgstr "" +"Project-Id-Version: viking\n" +"Report-Msgid-Bugs-To: \n" +"POT-Creation-Date: 2019-01-19 12:53+0000\n" +"PO-Revision-Date: 2015-04-12 21:51+0000\n" +"Last-Translator: Сергій Дубик \n" +"Language-Team: Ukrainian \n" +"Language: uk\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" +"X-Launchpad-Export-Date: 2018-12-21 17:32+0000\n" +"X-Generator: Launchpad (build 18847)\n" + +#: ../src/acquire.c:106 ../src/vikgpslayer.c:1367 +msgid "Done." +msgstr "" + +#: ../src/acquire.c:115 +msgid "No data." +msgstr "" + +#: ../src/acquire.c:167 ../src/acquire.c:415 +msgid "Error: acquisition failed." +msgstr "" + +#: ../src/acquire.c:339 +msgid "Working..." +msgstr "" + +#. This shouldn't happen... +#: ../src/acquire.c:406 +msgid "" +"Unable to create command\n" +"Acquire method failed." +msgstr "" + +#: ../src/acquire.c:513 +msgid "_Filter" +msgstr "" + +#: ../src/acquire.c:528 +#, c-format +msgid "Filter with %s" +msgstr "" + +#: ../src/acquire.c:545 +msgid "Filter" +msgstr "" + +#: ../src/babel.c:640 +msgid "GPSBabel:" +msgstr "" + +#: ../src/babel.c:641 +msgid "" +"Allow setting the specific instance of GPSBabel. You must restart Viking for " +"this value to take effect." +msgstr "" + +#: ../src/babel_ui.c:79 +msgid "Select a file format" +msgstr "" + +#: ../src/babel_ui.c:144 ../src/viktrwlayer.c:531 ../src/viktrwlayer.c:2882 +msgid "Tracks" +msgstr "" + +#: ../src/babel_ui.c:149 ../src/viktrwlayer.c:2892 +msgid "Routes" +msgstr "" + +#. ***** PARAMETERS ***** +#: ../src/babel_ui.c:154 ../src/viktrwlayer.c:531 ../src/viktrwlayer.c:2887 +msgid "Waypoints" +msgstr "" + +#: ../src/background.c:64 +#, c-format +msgid "%d items" +msgstr "" + +#: ../src/background.c:287 +msgid "Threads:" +msgstr "" + +#: ../src/background.c:288 +msgid "" +"Number of threads to use for Mapnik tasks. You need to restart Viking for a " +"change to this value to be used" +msgstr "" + +#: ../src/background.c:361 +msgid "Job" +msgstr "" + +#: ../src/background.c:365 +msgid "Progress" +msgstr "" + +#: ../src/background.c:373 +msgid "Viking Background Jobs" +msgstr "" + +#: ../src/bing.c:42 +msgid "Bing Aerial" +msgstr "" + +#: ../src/bing.c:48 +msgid "Bing" +msgstr "" + +#. VIK_GTK_WINDOW_FROM_WIDGET(vp) +#: ../src/bingmapsource.c:514 +msgid "Bing attribution Loading" +msgstr "" + +#: ../src/clipboard.c:95 +msgid "paste failed" +msgstr "" + +#: ../src/clipboard.c:105 +msgid "wrong clipboard data size" +msgstr "" + +#: ../src/clipboard.c:124 +#, c-format +msgid "" +"The clipboard contains sublayer data for %s layers. You must select a layer " +"of this type to paste the clipboard data." +msgstr "" + +#: ../src/clipboard.c:264 +msgid "" +"In order to paste a waypoint, please select an appropriate layer to paste " +"into." +msgstr "" + +#: ../src/dialog.c:60 +msgid "Go to Lat/Lon" +msgstr "" + +#: ../src/dialog.c:69 ../src/viktrwlayer_wpwin.c:173 +msgid "Latitude:" +msgstr "" + +#: ../src/dialog.c:72 ../src/viktrwlayer_wpwin.c:177 +msgid "Longitude:" +msgstr "" + +#: ../src/dialog.c:102 +msgid "Go to UTM" +msgstr "" + +#: ../src/dialog.c:114 +msgid "Northing:" +msgstr "" + +#: ../src/dialog.c:117 +msgid "Easting:" +msgstr "" + +#: ../src/dialog.c:121 ../src/vikgeoreflayer.c:902 +msgid "Zone:" +msgstr "" + +#: ../src/dialog.c:124 ../src/vikgeoreflayer.c:904 +msgid "Letter:" +msgstr "" + +#: ../src/dialog.c:246 ../src/geonamessearch.c:238 +#: ../src/datasource_osm_my_traces.c:505 +msgid "Nothing was selected" +msgstr "" + +#: ../src/dialog.c:254 +msgid "Add Route" +msgstr "" + +#: ../src/dialog.c:254 +msgid "Add Track" +msgstr "" + +#: ../src/dialog.c:262 +msgid "Route Name:" +msgstr "" + +#: ../src/dialog.c:262 +msgid "Track Name:" +msgstr "" + +#: ../src/dialog.c:282 +msgid "Please enter a name for the track." +msgstr "" + +#: ../src/dialog.c:311 +msgid "Today" +msgstr "" + +#: ../src/dialog.c:393 +msgid "Zoom Factors..." +msgstr "" + +#: ../src/dialog.c:407 +msgid "Zoom factor (in meters per pixel):" +msgstr "" + +#: ../src/dialog.c:408 +msgid "X (easting): " +msgstr "" + +#: ../src/dialog.c:409 +msgid "Y (northing): " +msgstr "" + +#: ../src/dialog.c:414 +msgid "X and Y zoom factors must be equal" +msgstr "" + +#: ../src/dialog.c:469 +msgid "1 min" +msgstr "" + +#: ../src/dialog.c:470 +msgid "1 hour" +msgstr "" + +#: ../src/dialog.c:471 +msgid "1 day" +msgstr "" + +#: ../src/dialog.c:472 +msgid "Custom (in minutes):" +msgstr "" + +#: ../src/dialog.c:608 +#, c-format +msgid "" +"2003-2008, Evan Battaglia\n" +"2008-%s, Viking's contributors" +msgstr "" + +#: ../src/dialog.c:609 +msgid "GPS Data and Topo Analyzer, Explorer, and Manager." +msgstr "" + +#: ../src/dialog.c:610 +msgid "" +"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.\n" +"\n" +"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.\n" +"\n" +"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., 59 Temple " +"Place, Suite 330, Boston, MA 02111-1307, USA" +msgstr "" + +#: ../src/dialog.c:703 +msgid "Translation is coordinated on http://launchpad.net/viking" +msgstr "" + +#: ../src/dialog.c:713 +msgid "Download along track" +msgstr "" + +#: ../src/dialog.c:720 +msgid "Map type:" +msgstr "" + +#: ../src/dialog.c:726 +msgid "Zoom level:" +msgstr "" + +#: ../src/dialog.c:766 +#, c-format +msgid "The map data is licensed: %s." +msgstr "" + +#: ../src/dialog.c:769 +#, c-format +msgid "" +"The data provided by '%s' are licensed under the following license: " +"%s." +msgstr "" + +#: ../src/dialog.c:773 +msgid "Open license" +msgstr "" + +#: ../src/expedia.c:54 +msgid "Expedia Street Maps" +msgstr "" + +#: ../src/expedia.c:82 +msgid "Invalid expedia altitude" +msgstr "" + +#: ../src/expedia.c:113 +#, c-format +msgid "" +"Couldn't open EXPEDIA image file (right after successful download! Please " +"report and delete image file!): %s" +msgstr "" + +#: ../src/expedia.c:126 +#, c-format +msgid "" +"Couldn't save EXPEDIA image file (right after successful download! Please " +"report and delete image file!): %s" +msgstr "" + +#: ../src/geonamessearch.c:115 +msgid "Search" +msgstr "" + +#: ../src/geonamessearch.c:117 +msgid "No entries found!" +msgstr "" + +#. NB could allow columns to be shifted around by doing this after each new +#. gtk_tree_view_column_set_reorderable ( column, TRUE ); +#. However I don't think is that useful, so I haven't put it in +#: ../src/geonamessearch.c:171 ../src/datasource_osm_my_traces.c:422 +#: ../src/viktrwlayer_tracklist.c:621 ../src/viktrwlayer_waypointlist.c:618 +msgid "Name" +msgstr "" + +#: ../src/geonamessearch.c:176 +msgid "Feature" +msgstr "" + +#: ../src/geonamessearch.c:181 ../src/datasource_osm_my_traces.c:437 +msgid "Lat/Lon" +msgstr "" + +#: ../src/geonamessearch.c:264 ../src/googlesearch.c:101 ../src/vikgoto.c:430 +msgid "couldn't map temp file" +msgstr "" + +#: ../src/geonamessearch.c:459 +msgid "Select articles" +msgstr "" + +#: ../src/geonamessearch.c:459 +msgid "Select the articles you want to add." +msgstr "" + +#: ../src/geonamessearch.c:475 +msgid "city" +msgstr "" + +#: ../src/geonamessearch.c:477 +msgid "edu" +msgstr "" + +#: ../src/geonamessearch.c:479 +msgid "airport" +msgstr "" + +#: ../src/geonamessearch.c:481 +msgid "mountain" +msgstr "" + +#: ../src/geonamessearch.c:483 +msgid "forest" +msgstr "" + +#: ../src/geonamessearch.c:485 +msgid "church" +msgstr "" + +#: ../src/geojson.c:74 +#, c-format +msgid "%s command failed: %s" +msgstr "" + +#: ../src/geojson.c:146 ../src/gpx.c:1317 +#, c-format +msgid "failed to open temporary file: %s" +msgstr "" + +#: ../src/globals.c:67 +msgid "DDD" +msgstr "" + +#: ../src/globals.c:67 +msgid "DMM" +msgstr "" + +#: ../src/globals.c:67 +msgid "DMS" +msgstr "" + +#: ../src/globals.c:67 +msgid "Raw" +msgstr "" + +#: ../src/globals.c:68 +msgid "Kilometres" +msgstr "" + +#: ../src/globals.c:68 +msgid "Miles" +msgstr "" + +#: ../src/globals.c:68 +msgid "Nautical Miles" +msgstr "" + +#. VIK_UNITS_SPEED_KILOMETRES_PER_HOUR: +#: ../src/globals.c:69 ../src/viktrwlayer_tracklist.c:655 ../src/vikutils.c:100 +msgid "km/h" +msgstr "км/год" + +#: ../src/globals.c:69 ../src/viktrwlayer_tracklist.c:656 ../src/vikutils.c:78 +msgid "mph" +msgstr "" + +#. VIK_UNITS_SPEED_METRES_PER_SECOND: +#: ../src/globals.c:69 ../src/viktrwlayer_tracklist.c:663 ../src/vikutils.c:81 +msgid "m/s" +msgstr "" + +#: ../src/globals.c:69 ../src/viktrwlayer_tracklist.c:657 ../src/vikutils.c:84 +msgid "knots" +msgstr "" + +#: ../src/globals.c:69 ../src/viktrwlayer_tracklist.c:658 ../src/vikutils.c:87 +msgid "s/km" +msgstr "" + +#: ../src/globals.c:69 ../src/viktrwlayer_tracklist.c:659 ../src/vikutils.c:90 +msgid "min/km" +msgstr "" + +#: ../src/globals.c:69 +msgid "s/mi" +msgstr "" + +#: ../src/globals.c:69 ../src/viktrwlayer_tracklist.c:661 ../src/vikutils.c:96 +msgid "min/mi" +msgstr "" + +#: ../src/globals.c:70 +msgid "Metres" +msgstr "" + +#: ../src/globals.c:70 +msgid "Feet" +msgstr "" + +#: ../src/globals.c:73 +msgid "Locale" +msgstr "" + +#: ../src/globals.c:73 +msgid "World" +msgstr "" + +#: ../src/globals.c:73 +msgid "UTC" +msgstr "" + +#: ../src/globals.c:76 +msgid "Degree format:" +msgstr "" + +#: ../src/globals.c:77 +msgid "Distance units:" +msgstr "" + +#: ../src/globals.c:78 +msgid "Speed units:" +msgstr "" + +#: ../src/globals.c:79 +msgid "Height units:" +msgstr "" + +#: ../src/globals.c:80 +msgid "Use large waypoint icons:" +msgstr "" + +#: ../src/globals.c:81 +msgid "Default latitude:" +msgstr "" + +#: ../src/globals.c:82 +msgid "Default longitude:" +msgstr "" + +#: ../src/globals.c:83 +msgid "Time Display:" +msgstr "" + +#: ../src/globals.c:84 +msgid "" +"Display times according to the reference frame. Locale is the user's system " +"setting. World is relative to the location of the object." +msgstr "" + +#: ../src/globals.c:90 +msgid "Alphabetical" +msgstr "" + +#: ../src/globals.c:90 ../src/datasource_osm_my_traces.c:432 +msgid "Time" +msgstr "" + +#: ../src/globals.c:90 +msgid "Creation" +msgstr "" + +#: ../src/globals.c:91 +msgid "Title Case" +msgstr "" + +#: ../src/globals.c:91 +msgid "Lowercase" +msgstr "" + +#: ../src/globals.c:94 +msgid "KML File Export Units:" +msgstr "" + +#: ../src/globals.c:95 +msgid "GPX Track Order:" +msgstr "" + +#: ../src/globals.c:96 +msgid "GPX Waypoint Symbols:" +msgstr "" + +#: ../src/globals.c:97 +msgid "" +"Save GPX Waypoint Symbol names in the specified case. May be useful for " +"compatibility with various devices" +msgstr "" + +#: ../src/globals.c:98 +msgid "GPX Creator:" +msgstr "" + +#: ../src/globals.c:99 +msgid "" +"The creator value when writing a GPX file. Otherwise when blank a default is " +"used." +msgstr "" + +#: ../src/globals.c:104 +msgid "Image Viewer:" +msgstr "Переглядач зображень:" + +#: ../src/globals.c:109 +msgid "External GPX Program 1:" +msgstr "" + +#: ../src/globals.c:110 +msgid "External GPX Program 2:" +msgstr "" + +#: ../src/globals.c:113 +msgid "Absolute" +msgstr "" + +#: ../src/globals.c:113 +msgid "Relative" +msgstr "" + +#: ../src/globals.c:117 +msgid "Save File Reference Mode:" +msgstr "" + +#: ../src/globals.c:118 +msgid "" +"When saving a Viking .vik file, this determines how the directory paths of " +"filenames are written." +msgstr "" + +#: ../src/globals.c:119 +msgid "Ask for Name before Track Creation:" +msgstr "" + +#: ../src/globals.c:120 +msgid "Show Tooltip during Track Creation:" +msgstr "" + +#: ../src/globals.c:121 +msgid "The number of recent files:" +msgstr "" + +#: ../src/globals.c:122 +msgid "" +"Only applies to new windows or on application restart. -1 means all " +"available files." +msgstr "" + +#: ../src/globals.c:123 +msgid "Open files in selected layer:" +msgstr "" + +#: ../src/globals.c:124 +msgid "Open files (but not .vik ones) into the selected TrackWaypoint layer." +msgstr "" + +#: ../src/globals.c:125 +msgid "Show calendar day names:" +msgstr "" + +#: ../src/globals.c:128 +msgid "Home Location" +msgstr "" + +#: ../src/globals.c:128 +msgid "Last Location" +msgstr "" + +#: ../src/globals.c:128 +msgid "Specified File" +msgstr "" + +#: ../src/globals.c:128 +msgid "Auto Location" +msgstr "" + +#: ../src/globals.c:131 +msgid "Restore Window Setup:" +msgstr "" + +#: ../src/globals.c:132 +msgid "Restore window size and layout" +msgstr "" + +#: ../src/globals.c:133 +msgid "Add a Default Map Layer:" +msgstr "" + +#: ../src/globals.c:134 +msgid "" +"The default map layer added is defined by the Layer Defaults. Use the menu " +"Edit->Layer Defaults->Map... to change the map type and other values." +msgstr "" + +#: ../src/globals.c:135 +msgid "Startup Method:" +msgstr "" + +#: ../src/globals.c:136 +msgid "Startup File:" +msgstr "" + +#: ../src/globals.c:137 +msgid "" +"The default file to load on startup. Only applies when the startup method is " +"set to 'Specified File'" +msgstr "" + +#: ../src/globals.c:138 +msgid "Check For New Version:" +msgstr "" + +#: ../src/globals.c:139 +msgid "Periodically check to see if a new version of Viking is available" +msgstr "" + +#. Defaults for the options are setup here +#: ../src/globals.c:176 +msgid "General" +msgstr "" + +#. New Tab +#: ../src/globals.c:204 +msgid "Startup" +msgstr "" + +#. New Tab +#: ../src/globals.c:222 +msgid "Export/External" +msgstr "" + +#. 'Advanced' Properties +#: ../src/globals.c:249 +msgid "Advanced" +msgstr "" + +#. Webtools +#: ../src/google.c:39 +msgid "Google" +msgstr "" + +#. If there is an actual description field it will overwrite this value +#: ../src/gpx.c:264 +#, c-format +msgid "Created by: %s" +msgstr "" + +#: ../src/datasource_bfilter.c:43 +msgid "Max number of points:" +msgstr "" + +#: ../src/datasource_bfilter.c:84 +msgid "Simplify All Tracks..." +msgstr "" + +#: ../src/datasource_bfilter.c:85 +msgid "Simplified Tracks" +msgstr "" + +#. { VIK_LAYER_NUM_TYPES, "compressmethod", VIK_LAYER_PARAM_UINT, VIK_LAYER_GROUP_NONE, N_("Simplify Method:"), VIK_LAYER_WIDGET_COMBOBOX, compress_method, NULL, NULL, NULL, NULL, NULL }, +#: ../src/datasource_bfilter.c:111 +msgid "Error Factor:" +msgstr "" + +#: ../src/datasource_bfilter.c:112 +msgid "" +"Specifies the maximum allowable error that may be introduced by removing a " +"single point by the crosstrack method. See the manual or GPSBabel Simplify " +"Filter documentation for more detail." +msgstr "" + +#: ../src/datasource_bfilter.c:166 +msgid "Compress Tracks..." +msgstr "" + +#: ../src/datasource_bfilter.c:167 +msgid "Compressed Tracks" +msgstr "" + +#: ../src/datasource_bfilter.c:197 ../src/datasource_bfilter.c:198 +msgid "Remove Duplicate Waypoints" +msgstr "" + +#: ../src/datasource_bfilter.c:221 +msgid "Manual filter:" +msgstr "" + +#: ../src/datasource_bfilter.c:222 +msgid "Manual filter command: e.g. 'swap'." +msgstr "" + +#: ../src/datasource_bfilter.c:233 ../src/datasource_bfilter.c:234 +msgid "Manual filter" +msgstr "" + +#: ../src/datasource_bfilter.c:262 +msgid "Waypoints Inside This" +msgstr "" + +#: ../src/datasource_bfilter.c:263 ../src/datasource_bfilter.c:292 +msgid "Polygonized Layer" +msgstr "" + +#: ../src/datasource_bfilter.c:291 +msgid "Waypoints Outside This" +msgstr "" + +#: ../src/datasource_file.c:61 +msgid "Import file with GPSBabel" +msgstr "" + +#: ../src/datasource_file.c:62 +msgid "Imported file" +msgstr "" + +#. The file selector +#: ../src/datasource_file.c:129 +msgid "File:" +msgstr "Файл:" + +#: ../src/datasource_file.c:130 +msgid "File to import" +msgstr "" + +#: ../src/datasource_file.c:137 +msgid "All files" +msgstr "Усі файли" + +#. The file format selector +#: ../src/datasource_file.c:144 ../src/datasource_url.c:106 +msgid "File type:" +msgstr "Тип файлу:" + +#: ../src/datasource_file.c:189 +#, c-format +msgid "using babel args '%s' and file '%s'" +msgstr "" + +#: ../src/datasource_gc.c:67 +msgid "Download Geocaches" +msgstr "" + +#: ../src/datasource_gc.c:68 +msgid "Geocaching.com Caches" +msgstr "" + +#: ../src/datasource_gc.c:86 +msgid "geocaching.com username:" +msgstr "" + +#: ../src/datasource_gc.c:87 +msgid "geocaching.com password:" +msgstr "" + +#: ../src/datasource_gc.c:92 ../src/vikwindow.c:3502 +msgid "Geocaching" +msgstr "" + +#: ../src/datasource_gc.c:128 +#, c-format +msgid "" +"Can't find %s or %s in path! Check that you have installed it correctly." +msgstr "" + +#: ../src/datasource_gc.c:190 +msgid "Number geocaches:" +msgstr "" + +#: ../src/datasource_gc.c:192 +msgid "Centered around:" +msgstr "" + +#: ../src/datasource_gc.c:231 +msgid "Broken input - using some defaults" +msgstr "" + +#: ../src/datasource_geotag.c:51 +msgid "Create Waypoints from Geotagged Images" +msgstr "" + +#: ../src/datasource_geotag.c:52 +msgid "Geotagged Images" +msgstr "" + +#: ../src/datasource_geotag.c:102 ../src/datasource_geojson.c:93 +#: ../src/vikfileentry.c:171 ../src/vikwindow.c:3533 ../src/vikwindow.c:3610 +#: ../src/vikwindow.c:3641 ../src/vikwindow.c:4356 ../src/vikwindow.c:4649 +msgid "All" +msgstr "" + +#: ../src/datasource_geotag.c:107 ../src/vikfileentry.c:115 +#: ../src/viktrwlayer_geotag.c:637 ../src/vikwindow.c:3518 +#: ../src/vikwindow.c:4377 +msgid "JPG" +msgstr "" + +#: ../src/datasource_geotag.c:168 +#, c-format +msgid "Unable to create waypoint from %s" +msgstr "" + +#: ../src/datasource_geojson.c:46 +msgid "Acquire from GeoJSON" +msgstr "" + +#: ../src/datasource_geojson.c:47 ../src/datasource_geojson.c:98 +msgid "GeoJSON" +msgstr "" + +#: ../src/datasource_geojson.c:152 +#, c-format +msgid "Unable to import from: %s" +msgstr "" + +#: ../src/datasource_gps.c:54 +msgid "Acquire from GPS" +msgstr "" + +#: ../src/datasource_gps.c:55 +msgid "Acquired from GPS" +msgstr "" + +#: ../src/datasource_gps.c:258 +#, c-format +msgid "using cmd '%s' and file '%s'\n" +msgstr "" + +#: ../src/datasource_gps.c:353 ../src/vikgpslayer.c:966 +#, c-format +msgid "Downloading %d waypoint..." +msgid_plural "Downloading %d waypoints..." +msgstr[0] "" +msgstr[1] "" + +#: ../src/datasource_gps.c:358 ../src/vikgpslayer.c:971 +#, c-format +msgid "Downloading %d trackpoint..." +msgid_plural "Downloading %d trackpoints..." +msgstr[0] "" +msgstr[1] "" + +#: ../src/datasource_gps.c:363 ../src/vikgpslayer.c:976 +#, c-format +msgid "Downloading %d routepoint..." +msgid_plural "Downloading %d routepoints..." +msgstr[0] "" +msgstr[1] "" + +#: ../src/datasource_gps.c:386 ../src/datasource_gps.c:393 +#: ../src/datasource_gps.c:400 +#, c-format +msgid "Downloaded %d out of %d %s..." +msgstr "" + +#: ../src/datasource_gps.c:388 ../src/datasource_gps.c:395 +#: ../src/datasource_gps.c:402 +#, c-format +msgid "Downloaded %d %s." +msgstr "" + +#: ../src/datasource_gps.c:416 ../src/vikgpslayer.c:1134 +#, c-format +msgid "GPS Device: %s" +msgstr "" + +#: ../src/datasource_gps.c:428 ../src/vikgpslayer.c:1214 +msgid "Status: Working..." +msgstr "" + +#. NB gps_layer_inst_init() is performed after parameter registeration +#. thus to give the protocols some potential values use the old static list +#. TODO: find another way to use gps_layer_inst_init()? +#: ../src/datasource_gps.c:584 ../src/vikgpslayer.c:216 +msgid "GPS Protocol:" +msgstr "" + +#. List reassigned at runtime +#: ../src/datasource_gps.c:609 ../src/vikgpslayer.c:217 +msgid "Serial Port:" +msgstr "" + +#: ../src/datasource_gps.c:659 +msgid "" +"Turn Off After Transfer\n" +"(Garmin/NAViLink Only)" +msgstr "" + +#: ../src/datasource_gps.c:666 +msgid "Tracks:" +msgstr "" + +#: ../src/datasource_gps.c:673 +msgid "Routes:" +msgstr "" + +#: ../src/datasource_gps.c:680 +msgid "Waypoints:" +msgstr "" + +#: ../src/datasource_gps.c:756 ../src/vikgpslayer.c:1509 +msgid "GPS device: N/A" +msgstr "" + +#: ../src/datasource_osm.c:53 ../src/datasource_osm.c:54 +msgid "OSM traces" +msgstr "" + +#: ../src/datasource_osm.c:89 +msgid "Page number:" +msgstr "" + +#: ../src/datasource_osm_my_traces.c:59 ../src/datasource_osm_my_traces.c:60 +msgid "OSM My Traces" +msgstr "" + +#: ../src/datasource_osm_my_traces.c:106 ../src/osm-traces.c:684 +msgid "Email/username:" +msgstr "" + +#: ../src/datasource_osm_my_traces.c:111 +msgid "The email or username used to login to OSM" +msgstr "" + +#: ../src/datasource_osm_my_traces.c:113 ../src/osm-traces.c:692 +msgid "Password:" +msgstr "" + +#: ../src/datasource_osm_my_traces.c:116 +msgid "The password used to login to OSM" +msgstr "" + +#: ../src/datasource_osm_my_traces.c:427 ../src/viktrwlayer.c:689 +msgid "Description" +msgstr "" + +#: ../src/datasource_osm_my_traces.c:442 +msgid "Privacy" +msgstr "" + +#: ../src/datasource_osm_my_traces.c:449 +msgid "Within Current View" +msgstr "" + +#: ../src/datasource_osm_my_traces.c:516 +msgid "GPS Traces" +msgstr "" + +#: ../src/datasource_osm_my_traces.c:518 +msgid "None found!" +msgstr "" + +#: ../src/datasource_osm_my_traces.c:569 +msgid "Ensure the OSM access token preferences are setup." +msgstr "" + +#: ../src/datasource_osm_my_traces.c:645 +msgid "My OSM Traces" +msgstr "" + +#. Report errors to the status bar +#: ../src/datasource_osm_my_traces.c:667 +#, c-format +msgid "Unable to get trace: %s" +msgstr "" + +#: ../src/datasource_routing.c:56 ../src/datasource_routing.c:57 +msgid "Directions" +msgstr "" + +#: ../src/datasource_routing.c:90 +msgid "No routing engines with directions available" +msgstr "" + +#. Engine selector +#: ../src/datasource_routing.c:99 +msgid "Engine:" +msgstr "" + +#. From and To entries +#: ../src/datasource_routing.c:104 +msgid "From:" +msgstr "" + +#: ../src/datasource_routing.c:105 +msgid "To:" +msgstr "" + +#: ../src/datasource_url.c:48 +msgid "Acquire from URL" +msgstr "" + +#: ../src/datasource_url.c:49 +msgid "URL" +msgstr "" + +#: ../src/datasource_url.c:101 +msgid "URL:" +msgstr "" + +#. Only GPX (not using GPSbabel) +#: ../src/datasource_url.c:133 ../src/vikfileentry.c:161 +#: ../src/vikwindow.c:3513 ../src/vikwindow.c:3603 +msgid "GPX" +msgstr "" + +#: ../src/datasource_wikipedia.c:32 +msgid "Create Waypoints from Wikipedia Articles" +msgstr "" + +#: ../src/datasource_wikipedia.c:33 +msgid "Wikipedia Waypoints" +msgstr "" + +#: ../src/dem.c:66 ../src/dem.c:80 +msgid "Invalid DEM" +msgstr "" + +#: ../src/dem.c:122 +msgid "Invalid DEM header" +msgstr "" + +#: ../src/dem.c:191 ../src/dem.c:204 +msgid "Incorrect DEM Class B record: expected 1" +msgstr "" + +#: ../src/dem.c:289 ../src/download.c:176 +#, c-format +msgid "Couldn't map file %s: %s" +msgstr "" + +#: ../src/download.c:130 +msgid "Tile age (days):" +msgstr "" + +#: ../src/download.c:406 +#, c-format +msgid "Download error: %s" +msgstr "" + +#: ../src/download.c:490 +msgid "couldn't open temp file" +msgstr "" + +#: ../src/file.c:458 ../src/file.c:463 +#, c-format +msgid "Draw mode '%s' no more supported" +msgstr "" + +#: ../src/geotag_exif.c:621 +msgid "Not enough memory." +msgstr "" + +#: ../src/geotag_exif.c:639 +msgid "Setting a value for this tag is unsupported!" +msgstr "" + +#: ../src/geotag_exif.c:658 +#, c-format +msgid "Too few components specified (need %d, found %d)\n" +msgstr "" + +#: ../src/geotag_exif.c:662 +msgid "Numeric value expected\n" +msgstr "" + +#: ../src/geotag_exif.c:670 +msgid "This shouldn't happen!" +msgstr "" + +#: ../src/geotag_exif.c:740 +msgid "Not yet implemented!" +msgstr "" + +#: ../src/geotag_exif.c:753 +msgid "Warning; Too many components specified!" +msgstr "" + +#: ../src/osm-traces.c:87 +msgid "Identifiable (public w/ timestamps)" +msgstr "" + +#: ../src/osm-traces.c:88 +msgid "Trackable (private w/ timestamps)" +msgstr "" + +#: ../src/osm-traces.c:89 +msgid "Public" +msgstr "" + +#: ../src/osm-traces.c:90 +msgid "Private" +msgstr "" + +#: ../src/osm-traces.c:108 +msgid "Access Token:" +msgstr "" + +#: ../src/osm-traces.c:108 +msgid "Get New OSM Access Tokens" +msgstr "" + +#: ../src/osm-traces.c:109 +msgid "Access Token Key:" +msgstr "" + +#: ../src/osm-traces.c:110 +msgid "Access Token Secret:" +msgstr "" + +#: ../src/osm-traces.c:111 +msgid "OSM username:" +msgstr "" + +#: ../src/osm-traces.c:112 +msgid "OSM password:" +msgstr "" + +#. Check to really override existing values... +#: ../src/osm-traces.c:263 +msgid "Do you want to overwrite existing values?" +msgstr "" + +#: ../src/osm-traces.c:275 +msgid "Not able to generate OSM request tokens." +msgstr "" + +#: ../src/osm-traces.c:299 +msgid "" +"Waiting for authorization approval.\n" +"Ensure you have granted access at the website before continuing here." +msgstr "" + +#: ../src/osm-traces.c:315 +msgid "No Authorization." +msgstr "" + +#: ../src/osm-traces.c:354 +msgid "" +"OSM Username and Password preferences are not required anymore. You can now " +"remove them." +msgstr "" + +#. Preferences +#: ../src/osm-traces.c:379 +msgid "OpenStreetMap Traces" +msgstr "" + +#: ../src/osm-traces.c:504 +#, c-format +msgid "failed to upload data: HTTP response is %ld" +msgstr "" + +#: ../src/osm-traces.c:509 +#, c-format +msgid "curl_easy_getinfo failed: %d" +msgstr "" + +#: ../src/osm-traces.c:514 +#, c-format +msgid "curl request failed: %s" +msgstr "" + +#. Success +#: ../src/osm-traces.c:592 +msgid "Uploaded to OSM" +msgstr "" + +#: ../src/osm-traces.c:596 +msgid "" +"FAILED TO UPLOAD DATA TO OSM - Ensure the OSM access token preferences are " +"setup." +msgstr "" + +#: ../src/osm-traces.c:599 +msgid "FAILED TO UPLOAD DATA TO OSM - CURL PROBLEM" +msgstr "" + +#: ../src/osm-traces.c:602 +msgid "FAILED TO UPLOAD DATA TO OSM" +msgstr "" + +#: ../src/osm-traces.c:602 +msgid "HTTP response code" +msgstr "" + +#: ../src/osm-traces.c:610 +#, c-format +msgid "failed to unlink temporary file: %s" +msgstr "" + +#: ../src/osm-traces.c:664 +msgid "OSM upload" +msgstr "" + +#: ../src/osm-traces.c:689 +msgid "" +"The email/username used as login\n" +"Enter the email/username you use to login into www.openstreetmap.org." +"" +msgstr "" + +#: ../src/osm-traces.c:697 +msgid "" +"The password used to login\n" +"Enter the password you use to login into www.openstreetmap.org." +msgstr "" + +#: ../src/osm-traces.c:703 +msgid "File's name:" +msgstr "" + +#: ../src/osm-traces.c:713 +msgid "" +"The name of the file on OSM\n" +"This is the name of the file created on the server.This is not the " +"name of the local file." +msgstr "" + +#: ../src/osm-traces.c:717 ../src/viktrwlayer_wpwin.c:197 +#: ../src/viktrwlayer_wpwin.c:199 +msgid "Description:" +msgstr "" + +#: ../src/osm-traces.c:731 +msgid "The description of the trace" +msgstr "" + +#: ../src/osm-traces.c:734 +msgid "Anonymize Times:" +msgstr "" + +#: ../src/osm-traces.c:739 +msgid "" +"Anonymize times of the trace.\n" +"You may choose to make the trace identifiable, yet mask the actual " +"real time values" +msgstr "" + +#: ../src/osm-traces.c:743 +msgid "Tags:" +msgstr "" + +#: ../src/osm-traces.c:751 +msgid "The tags associated to the trace" +msgstr "" + +#: ../src/osm-traces.c:816 +#, c-format +msgid "Uploading %s to OSM" +msgstr "" + +#: ../src/mapcache.c:67 +msgid "Map cache memory size (MB):" +msgstr "" + +#. NB Can have a couple hundred fonts loaded when using system directories +#. So ATM don't list them all - otherwise need better GUI feedback display. +#: ../src/mapnik_interface.cpp:324 +#, c-format +msgid "" +"%s %s\n" +"Plugins=%sFonts loaded=%d" +msgstr "" + +#: ../src/mapnik_interface.cpp:325 ../src/vikmapniklayer.c:278 +msgid "Mapnik" +msgstr "" + +#: ../src/print.c:51 ../src/viktrwlayer.c:572 +msgid "None" +msgstr "" + +#: ../src/print.c:52 +msgid "Horizontally" +msgstr "" + +#: ../src/print.c:53 +msgid "Vertically" +msgstr "" + +#: ../src/print.c:54 +msgid "Both" +msgstr "" + +#: ../src/print.c:118 +msgid "Image Settings" +msgstr "" + +#: ../src/print.c:551 +msgid "done" +msgstr "" + +#. Page Size +#: ../src/print.c:580 +msgid "_Adjust Page Size and Orientation" +msgstr "" + +#: ../src/print.c:596 +msgid "C_enter:" +msgstr "" + +#. ignore page margins +#: ../src/print.c:614 +msgid "Ignore Page _Margins" +msgstr "" + +#: ../src/print.c:633 +msgid "Image S_ize:" +msgstr "" + +#: ../src/ui_util.c:88 +#, c-format +msgid "Could not launch web browser. %s" +msgstr "" + +#: ../src/ui_util.c:101 +#, c-format +msgid "Could not create new email. %s" +msgstr "" + +#: ../src/vikcoordlayer.c:57 +msgid "Color:" +msgstr "" + +#: ../src/vikcoordlayer.c:58 +msgid "Minutes Width:" +msgstr "" + +#: ../src/vikcoordlayer.c:59 +msgid "Line Thickness:" +msgstr "" + +#: ../src/vikcoordlayer.c:66 +msgid "Coordinate" +msgstr "" + +#: ../src/main.c:92 +#, c-format +msgid "Ignoring Xlib error: error code %d request code %d\n" +msgstr "" + +#: ../src/main.c:111 +msgid "Enable debug output" +msgstr "" + +#: ../src/main.c:112 +msgid "Enable verbose output" +msgstr "" + +#: ../src/main.c:113 +msgid "Show version" +msgstr "" + +#: ../src/main.c:114 +msgid "Latitude in decimal degrees" +msgstr "" + +#: ../src/main.c:115 +msgid "Longitude in decimal degrees" +msgstr "" + +#: ../src/main.c:116 +msgid "Zoom Level (OSM). Value can be 0 - 22" +msgstr "" + +#: ../src/main.c:117 +msgid "Add a map layer by id value. Use 0 for the default map." +msgstr "" + +#: ../src/main.c:160 +#, c-format +msgid "" +"%s %s\n" +"Copyright (c) 2003-2008 Evan Battaglia\n" +"Copyright (c) 2008-%s Viking's contributors\n" +msgstr "" + +#: ../src/osm.c:50 +msgid "OpenStreetMap (Mapnik)" +msgstr "" + +#: ../src/osm.c:65 +msgid "OpenStreetMap (Cycle)" +msgstr "" + +#: ../src/osm.c:79 +msgid "OpenStreetMap (Transport)" +msgstr "" + +#: ../src/osm.c:95 +msgid "OpenStreetMap (Humanitarian)" +msgstr "" + +#: ../src/osm.c:111 +msgid "On Disk OSM Tile Format" +msgstr "" + +#: ../src/osm.c:121 +msgid "MBTiles File" +msgstr "" + +#: ../src/osm.c:132 +msgid "OSM Metatiles" +msgstr "" + +#: ../src/osm.c:146 +msgid "Mapbox Outdoors" +msgstr "" + +#: ../src/osm.c:153 +msgid "Mapbox Specific" +msgstr "" + +#: ../src/osm.c:170 +msgid "OSM (view)" +msgstr "" + +#: ../src/osm.c:174 +msgid "OSM (edit)" +msgstr "" + +#. Note the use of positional parameters +#: ../src/osm.c:179 +msgid "OSM (query)" +msgstr "" + +#: ../src/osm.c:183 +msgid "OSM (render)" +msgstr "" + +#. Example: http://127.0.0.1:8111/load_and_zoom?left=8.19&right=8.20&top=48.605&bottom=48.590&select=node413602999 +#. JOSM or merkaartor must already be running with remote interface enabled +#: ../src/osm.c:190 +msgid "Local port 8111 (eg JOSM)" +msgstr "" + +#: ../src/osm.c:195 +msgid "Geofabrik Map Compare" +msgstr "" + +#: ../src/osm.c:203 +msgid "OpenStreetMap Notes" +msgstr "" + +#. Not really OSM but can't be bothered to create somewhere else to put it... +#: ../src/osm.c:221 +msgid "Wikimedia Toolserver GeoHack" +msgstr "" + +#: ../src/preferences.c:195 +msgid "Preferences" +msgstr "" + +#: ../src/toolbar.c:91 ../src/toolbar.c:92 +msgid "System Default" +msgstr "" + +#: ../src/toolbar.c:91 ../src/viktrwlayer.c:563 +msgid "Small" +msgstr "" + +#: ../src/toolbar.c:91 ../src/viktrwlayer.c:564 +msgid "Medium" +msgstr "" + +#: ../src/toolbar.c:91 ../src/viktrwlayer.c:565 +msgid "Large" +msgstr "" + +#: ../src/toolbar.c:92 +msgid "Icons Only" +msgstr "" + +#: ../src/toolbar.c:92 +msgid "Text Only" +msgstr "" + +#: ../src/toolbar.c:92 +msgid "Icons and Text" +msgstr "" + +#: ../src/toolbar.c:106 +msgid "Append to Menu:" +msgstr "" + +#: ../src/toolbar.c:107 +msgid "Pack the toolbar to the main menu to save vertical space" +msgstr "" + +#: ../src/toolbar.c:108 +msgid "Icon Size:" +msgstr "" + +#: ../src/toolbar.c:110 +msgid "Icon Style:" +msgstr "" + +#: ../src/toolbar.c:112 +msgid "Customize:" +msgstr "" + +#: ../src/toolbar.c:112 +msgid "Customize Buttons" +msgstr "" + +#. Preferences +#: ../src/toolbar.c:145 +msgid "Toolbar" +msgstr "" + +#: ../src/toolbar.c:312 +msgid "_Customize" +msgstr "" + +#: ../src/toolbar.c:641 +msgid "Separator" +msgstr "" + +#: ../src/toolbar.c:642 +msgid "--- Separator ---" +msgstr "" + +#: ../src/toolbar.c:1007 +msgid "Customize Toolbar" +msgstr "" + +#: ../src/toolbar.c:1028 +msgid "" +"Select items to be displayed on the toolbar. Items can be reordered by drag " +"and drop." +msgstr "" + +#: ../src/toolbar.c:1044 +msgid "Available Items" +msgstr "" + +#: ../src/toolbar.c:1065 +msgid "Displayed Items" +msgstr "" + +#: ../src/viklayer_defaults.c:232 +#, c-format +msgid "Could not open file: %s" +msgstr "" + +#: ../src/viklayer_defaults.c:304 +msgid "Layer Defaults" +msgstr "" + +#: ../src/uibuilder.c:196 +msgid "Take care that this password will be stored clearly in a plain file." +msgstr "" + +#: ../src/uibuilder.c:628 ../src/viktrwlayer_export.c:188 +#: ../src/viktrwlayer_export.c:304 ../src/vikwindow.c:3666 +#: ../src/vikwindow.c:4408 +#, c-format +msgid "The file \"%s\" exists, do you wish to overwrite it?" +msgstr "" + +#: ../src/vikaggregatelayer.c:41 +msgid "Aggregate" +msgstr "" + +#: ../src/vikaggregatelayer.c:528 ../src/viktrwlayer.c:11700 +#, c-format +msgid "%s: Waypoint List" +msgstr "" + +#: ../src/vikaggregatelayer.c:570 +msgid "Search by Date" +msgstr "" + +#: ../src/vikaggregatelayer.c:576 +msgid "No items found with the requested date." +msgstr "" + +#: ../src/vikaggregatelayer.c:615 ../src/viktrwlayer.c:11691 +#, c-format +msgid "%s: Track and Route List" +msgstr "" + +#: ../src/vikaggregatelayer.c:681 ../src/viktrwlayer.c:8346 +#: ../src/viktrwlayer.c:8417 ../src/viktrwlayer.c:8494 +msgid "_Visibility" +msgstr "" + +#: ../src/vikaggregatelayer.c:686 +msgid "_Show All" +msgstr "" + +#: ../src/vikaggregatelayer.c:692 +msgid "_Hide All" +msgstr "" + +#: ../src/vikaggregatelayer.c:698 ../src/viktrwlayer.c:8363 +#: ../src/viktrwlayer.c:8434 ../src/viktrwlayer.c:8511 +msgid "_Toggle" +msgstr "" + +#: ../src/vikaggregatelayer.c:705 ../src/viktrwlayer.c:8532 +msgid "_Sort" +msgstr "" + +#: ../src/vikaggregatelayer.c:711 ../src/viktrwlayer.c:8538 +msgid "Name _Ascending" +msgstr "" + +#: ../src/vikaggregatelayer.c:717 ../src/viktrwlayer.c:8544 +msgid "Name _Descending" +msgstr "" + +#: ../src/vikaggregatelayer.c:723 ../src/viktrwlayer.c:575 +#: ../src/viktrwlayer.c:8550 +msgid "Date Ascending" +msgstr "" + +#: ../src/vikaggregatelayer.c:729 ../src/viktrwlayer.c:576 +#: ../src/viktrwlayer.c:8556 +msgid "Date Descending" +msgstr "" + +#: ../src/vikaggregatelayer.c:735 ../src/viktrwlayer.c:8445 +#: ../src/viktrwlayer.c:8523 ../src/viktrwlayer.c:8595 +#: ../src/viktrwlayer_tracklist.c:296 +msgid "_Statistics" +msgstr "" + +#: ../src/vikaggregatelayer.c:740 ../src/viktrwlayer.c:4533 +msgid "Track _List..." +msgstr "" + +#: ../src/vikaggregatelayer.c:746 ../src/viktrwlayer.c:4540 +msgid "_Waypoint List..." +msgstr "" + +#: ../src/vikaggregatelayer.c:753 +msgid "Searc_h" +msgstr "" + +#: ../src/vikaggregatelayer.c:759 +msgid "By _Date..." +msgstr "" + +#: ../src/vikaggregatelayer.c:762 +msgid "Find the first item with a specified date" +msgstr "" + +#: ../src/vikaggregatelayer.c:765 +msgid "Load E_xternal Layers" +msgstr "" + +#. Could have a more complicated tooltip that numbers each type of layers, +#. but for now a simple overall count +#: ../src/vikaggregatelayer.c:1011 +#, c-format +msgid "One layer" +msgid_plural "%d layers" +msgstr[0] "" +msgstr[1] "" + +#: ../src/vikaggregatelayer.c:1014 +#, c-format +msgid "Empty" +msgstr "" + +#: ../src/vikdemlayer.c:86 +msgid "SRTM Global 90m (3 arcsec)" +msgstr "" + +#: ../src/vikdemlayer.c:94 +msgid "Absolute height" +msgstr "" + +#: ../src/vikdemlayer.c:95 +msgid "Height gradient" +msgstr "" + +#: ../src/vikdemlayer.c:120 +msgid "DEM Files:" +msgstr "" + +#: ../src/vikdemlayer.c:121 +msgid "Download Source:" +msgstr "" + +#: ../src/vikdemlayer.c:122 +msgid "Min Elev Color:" +msgstr "" + +#: ../src/vikdemlayer.c:123 ../src/viktrwlayer_wpwin.c:207 +msgid "Type:" +msgstr "" + +#: ../src/vikdemlayer.c:124 +msgid "Min Elev:" +msgstr "" + +#: ../src/vikdemlayer.c:125 +msgid "Max Elev:" +msgstr "" + +#: ../src/vikdemlayer.c:137 +msgid "_DEM Download" +msgstr "" + +#: ../src/vikdemlayer.c:137 +msgid "DEM Download" +msgstr "" + +#: ../src/vikdemlayer.c:192 +msgid "DEM" +msgstr "" + +#: ../src/vikdemlayer.c:304 +#, c-format +msgid "Number of files: %d" +msgstr "" + +#: ../src/vikdemlayer.c:446 +msgid "DEM Loading" +msgstr "" + +#: ../src/vikdemlayer.c:927 +#, c-format +msgid "No SRTM data available for %f, %f" +msgstr "" + +#: ../src/vikdemlayer.c:948 +#, c-format +msgid "DEM download failure for %f, %f" +msgstr "" + +#: ../src/vikdemlayer.c:954 +#, c-format +msgid "DEM write failure for %s" +msgstr "" + +#. Probably not over any land... +#: ../src/vikdemlayer.c:1201 +msgid "No DEM File Available" +msgstr "" + +#: ../src/vikdemlayer.c:1220 +#, c-format +msgid "" +"\n" +"Source: %s\n" +"\n" +"DEM File: %s\n" +"DEM File Timestamp: %s" +msgstr "" + +#: ../src/vikdemlayer.c:1224 +#, c-format +msgid "" +"Source: %s\n" +"\n" +"No DEM File!" +msgstr "" + +#: ../src/vikdemlayer.c:1264 +#, c-format +msgid "Downloading DEM %s" +msgstr "" + +#: ../src/vikdemlayer.c:1289 +msgid "_Show DEM File Information" +msgstr "" + +#: ../src/vikfileentry.c:72 +msgid "Browse..." +msgstr "" + +#: ../src/vikfileentry.c:103 +msgid "Choose file" +msgstr "Вибрати файл" + +#: ../src/vikfileentry.c:120 ../src/vikwindow.c:4372 +msgid "PNG" +msgstr "" + +#: ../src/vikfileentry.c:125 +msgid "TIFF" +msgstr "" + +#: ../src/vikfileentry.c:133 +msgid "MBTiles" +msgstr "" + +#: ../src/vikfileentry.c:142 +msgid "XML" +msgstr "" + +#: ../src/vikfileentry.c:149 +msgid "MML" +msgstr "" + +#: ../src/vikfileentry.c:154 +msgid "MSS" +msgstr "" + +#: ../src/vikfilelist.c:49 +msgid "Choose file(s)" +msgstr "" + +#: ../src/vikfilelist.c:182 +msgid "Add..." +msgstr "" + +#: ../src/vikfilelist.c:183 +msgid "Delete" +msgstr "" + +#: ../src/vikgeoreflayer.c:97 +msgid "_Georef Move Map" +msgstr "" + +#: ../src/vikgeoreflayer.c:97 +msgid "Georef Move Map" +msgstr "" + +#: ../src/vikgeoreflayer.c:106 +msgid "Georef Z_oom Tool" +msgstr "" + +#: ../src/vikgeoreflayer.c:106 +msgid "Georef Zoom Tool" +msgstr "" + +#: ../src/vikgeoreflayer.c:117 +msgid "GeoRef Map" +msgstr "" + +#: ../src/vikgeoreflayer.c:214 +msgid "Auto Read World Files:" +msgstr "" + +#: ../src/vikgeoreflayer.c:215 +msgid "" +"Automatically attempt to read associated world file of a new image for a " +"GeoRef layer" +msgstr "" + +#: ../src/vikgeoreflayer.c:511 ../src/vikgeoreflayer.c:797 +#: ../src/vikmapslayer.c:1174 +#, c-format +msgid "Couldn't open image file: %s" +msgstr "" + +#: ../src/vikgeoreflayer.c:607 ../src/vikgeoreflayer.c:633 +msgid "Choose World file" +msgstr "" + +#: ../src/vikgeoreflayer.c:619 +msgid "The World file you requested could not be opened for reading." +msgstr "" + +#: ../src/vikgeoreflayer.c:621 +msgid "Unexpected end of file reading World file." +msgstr "" + +#: ../src/vikgeoreflayer.c:646 +msgid "The file you requested could not be opened for writing." +msgstr "" + +#: ../src/vikgeoreflayer.c:782 +msgid "Lower right corner values may not be consistent with upper right values" +msgstr "" + +#: ../src/vikgeoreflayer.c:806 +#, c-format +msgid "Invalid image size: %s" +msgstr "" + +#: ../src/vikgeoreflayer.c:831 ../src/viklayer.c:561 ../src/vikwindow.c:4891 +msgid "Layer Properties" +msgstr "" + +#: ../src/vikgeoreflayer.c:852 +msgid "World File Parameters:" +msgstr "" + +#: ../src/vikgeoreflayer.c:853 +msgid "Load From File..." +msgstr "Завантажити з файлу…" + +#: ../src/vikgeoreflayer.c:858 +msgid "Corner pixel easting:" +msgstr "" + +#: ../src/vikgeoreflayer.c:860 +msgid "the UTM \"easting\" value of the upper-left corner pixel of the map" +msgstr "" + +#: ../src/vikgeoreflayer.c:862 +msgid "Corner pixel northing:" +msgstr "" + +#: ../src/vikgeoreflayer.c:864 +msgid "the UTM \"northing\" value of the upper-left corner pixel of the map" +msgstr "" + +#: ../src/vikgeoreflayer.c:866 +msgid "X (easting) scale (mpp): " +msgstr "" + +#: ../src/vikgeoreflayer.c:867 +msgid "Y (northing) scale (mpp): " +msgstr "" + +#: ../src/vikgeoreflayer.c:870 +msgid "the scale of the map in the X direction (meters per pixel)" +msgstr "" + +#: ../src/vikgeoreflayer.c:872 +msgid "the scale of the map in the Y direction (meters per pixel)" +msgstr "" + +#: ../src/vikgeoreflayer.c:874 +msgid "Map Image:" +msgstr "" + +#: ../src/vikgeoreflayer.c:919 +msgid "Upper left latitude:" +msgstr "" + +#: ../src/vikgeoreflayer.c:921 +msgid "Upper left longitude:" +msgstr "" + +#: ../src/vikgeoreflayer.c:923 +msgid "Lower right latitude:" +msgstr "" + +#: ../src/vikgeoreflayer.c:925 +msgid "Lower right longitude:" +msgstr "" + +#: ../src/vikgeoreflayer.c:937 +msgid "Calculate MPP values from coordinates" +msgstr "" + +#: ../src/vikgeoreflayer.c:938 +msgid "" +"Enter all corner coordinates before calculating the MPP values from the " +"image size" +msgstr "" + +#: ../src/vikgeoreflayer.c:948 +msgid "UTM" +msgstr "" + +#: ../src/vikgeoreflayer.c:949 +msgid "Latitude/Longitude" +msgstr "" + +#: ../src/vikgeoreflayer.c:957 ../src/vikmapniklayer.c:82 +#: ../src/vikmapslayer.c:158 +msgid "Alpha:" +msgstr "" + +#. Now with icons +#: ../src/vikgeoreflayer.c:1062 +msgid "_Zoom to Fit Map" +msgstr "" + +#: ../src/vikgeoreflayer.c:1068 +msgid "_Goto Map Center" +msgstr "" + +#: ../src/vikgeoreflayer.c:1074 +msgid "_Export to World File" +msgstr "" + +#: ../src/vikgoto.c:98 +msgid "No goto tool available." +msgstr "" + +#: ../src/vikgoto.c:295 +msgid "goto" +msgstr "" + +#: ../src/vikgoto.c:297 +msgid "goto provider:" +msgstr "" + +#: ../src/vikgoto.c:312 +msgid "Enter address or place name:" +msgstr "" + +#: ../src/vikgoto.c:487 +msgid "Locality" +msgstr "" + +#: ../src/vikgpslayer.c:137 +msgid "Data Mode" +msgstr "" + +#: ../src/vikgpslayer.c:139 +msgid "Realtime Tracking Mode" +msgstr "" + +#: ../src/vikgpslayer.c:176 +msgid "Keep vehicle at center" +msgstr "" + +#: ../src/vikgpslayer.c:177 +msgid "Keep vehicle on screen" +msgstr "" + +#: ../src/vikgpslayer.c:178 +msgid "Disable" +msgstr "" + +#: ../src/vikgpslayer.c:218 +msgid "Download Tracks:" +msgstr "" + +#: ../src/vikgpslayer.c:219 +msgid "Upload Tracks:" +msgstr "" + +#: ../src/vikgpslayer.c:220 +msgid "Download Routes:" +msgstr "" + +#: ../src/vikgpslayer.c:221 +msgid "Upload Routes:" +msgstr "" + +#: ../src/vikgpslayer.c:222 +msgid "Download Waypoints:" +msgstr "" + +#: ../src/vikgpslayer.c:223 +msgid "Upload Waypoints:" +msgstr "" + +#: ../src/vikgpslayer.c:225 +msgid "Recording tracks" +msgstr "" + +#: ../src/vikgpslayer.c:226 +msgid "Jump to current position on start" +msgstr "" + +#: ../src/vikgpslayer.c:227 +msgid "Moving Map Method:" +msgstr "" + +#: ../src/vikgpslayer.c:228 +msgid "Update Statusbar:" +msgstr "" + +#: ../src/vikgpslayer.c:228 +msgid "Display information in the statusbar on GPS updates" +msgstr "" + +#: ../src/vikgpslayer.c:229 +msgid "Auto Connect" +msgstr "" + +#: ../src/vikgpslayer.c:229 +msgid "Automatically connect to GPSD" +msgstr "" + +#: ../src/vikgpslayer.c:230 +msgid "Gpsd Host:" +msgstr "" + +#: ../src/vikgpslayer.c:231 +msgid "Gpsd Port:" +msgstr "" + +#: ../src/vikgpslayer.c:232 +msgid "Gpsd Retry Interval (seconds):" +msgstr "" + +#: ../src/vikgpslayer.c:254 +msgid "GPS" +msgstr "" + +#: ../src/vikgpslayer.c:320 ../src/vikgpslayer.c:1504 +msgid "GPS Download" +msgstr "" + +#: ../src/vikgpslayer.c:320 ../src/vikgpslayer.c:1504 ../src/viktrwlayer.c:3993 +msgid "GPS Upload" +msgstr "" + +#: ../src/vikgpslayer.c:322 +msgid "GPS Realtime Tracking" +msgstr "" + +#: ../src/vikgpslayer.c:458 +msgid "Connected" +msgstr "" + +#: ../src/vikgpslayer.c:460 +msgid "Disconnected" +msgstr "" + +#: ../src/vikgpslayer.c:554 +msgid "Unknown GPS Protocol" +msgstr "" + +#: ../src/vikgpslayer.c:572 +msgid "Unknown serial port device" +msgstr "" + +#: ../src/vikgpslayer.c:691 +#, c-format +msgid "%s: unknown parameter" +msgstr "" + +#. Now with icons +#: ../src/vikgpslayer.c:794 +msgid "_Upload to GPS" +msgstr "" + +#: ../src/vikgpslayer.c:800 +msgid "Download from _GPS" +msgstr "" + +#: ../src/vikgpslayer.c:821 +msgid "Empty _Realtime" +msgstr "" + +#: ../src/vikgpslayer.c:828 +msgid "E_mpty Upload" +msgstr "" + +#: ../src/vikgpslayer.c:834 +msgid "_Empty Download" +msgstr "" + +#: ../src/vikgpslayer.c:840 +msgid "Empty _All" +msgstr "" + +#: ../src/vikgpslayer.c:852 +#, c-format +msgid "Unexpected number of disconnected handlers: %d" +msgstr "" + +#: ../src/vikgpslayer.c:995 +#, c-format +msgid "Uploading %d waypoint..." +msgid_plural "Uploading %d waypoints..." +msgstr[0] "" +msgstr[1] "" + +#: ../src/vikgpslayer.c:1000 +#, c-format +msgid "Uploading %d trackpoint..." +msgid_plural "Uploading %d trackpoints..." +msgstr[0] "" +msgstr[1] "" + +#: ../src/vikgpslayer.c:1005 +#, c-format +msgid "Uploading %d routepoint..." +msgid_plural "Uploading %d routepoints..." +msgstr[0] "" +msgstr[1] "" + +#: ../src/vikgpslayer.c:1034 +#, c-format +msgid "Downloaded %d out of %d waypoint..." +msgid_plural "Downloaded %d out of %d waypoints..." +msgstr[0] "" +msgstr[1] "" + +#: ../src/vikgpslayer.c:1040 +#, c-format +msgid "Downloaded %d out of %d trackpoint..." +msgid_plural "Downloaded %d out of %d trackpoints..." +msgstr[0] "" +msgstr[1] "" + +#: ../src/vikgpslayer.c:1046 +#, c-format +msgid "Downloaded %d out of %d routepoint..." +msgid_plural "Downloaded %d out of %d routepoints..." +msgstr[0] "" +msgstr[1] "" + +#: ../src/vikgpslayer.c:1056 +#, c-format +msgid "Uploaded %d out of %d waypoint..." +msgid_plural "Uploaded %d out of %d waypoints..." +msgstr[0] "" +msgstr[1] "" + +#: ../src/vikgpslayer.c:1062 +#, c-format +msgid "Uploaded %d out of %d trackpoint..." +msgid_plural "Uploaded %d out of %d trackpoints..." +msgstr[0] "" +msgstr[1] "" + +#: ../src/vikgpslayer.c:1068 +#, c-format +msgid "Uploaded %d out of %d routepoint..." +msgid_plural "Uploaded %d out of %d routepoints..." +msgstr[0] "" +msgstr[1] "" + +#: ../src/vikgpslayer.c:1079 +#, c-format +msgid "Downloaded %d waypoint" +msgid_plural "Downloaded %d waypoints" +msgstr[0] "" +msgstr[1] "" + +#: ../src/vikgpslayer.c:1085 +#, c-format +msgid "Downloaded %d trackpoint" +msgid_plural "Downloaded %d trackpoints" +msgstr[0] "" +msgstr[1] "" + +#: ../src/vikgpslayer.c:1091 +#, c-format +msgid "Downloaded %d routepoint" +msgid_plural "Downloaded %d routepoints" +msgstr[0] "" +msgstr[1] "" + +#: ../src/vikgpslayer.c:1101 +#, c-format +msgid "Uploaded %d waypoint" +msgid_plural "Uploaded %d waypoints" +msgstr[0] "" +msgstr[1] "" + +#: ../src/vikgpslayer.c:1107 +#, c-format +msgid "Uploaded %d trackpoint" +msgid_plural "Uploaded %d trackpoints" +msgstr[0] "" +msgstr[1] "" + +#: ../src/vikgpslayer.c:1113 +#, c-format +msgid "Uploaded %d routepoint" +msgid_plural "Uploaded %d routepoints" +msgstr[0] "" +msgstr[1] "" + +#: ../src/vikgpslayer.c:1363 +msgid "Error: No result." +msgstr "" + +#: ../src/vikgpslayer.c:1471 +msgid "Warning - GPS Upload items may overwrite each other" +msgstr "" + +#: ../src/vikgpslayer.c:1506 +msgid "Status: detecting gpsbabel" +msgstr "" + +#: ../src/vikgpslayer.c:1533 +msgid "No GPS items selected for transfer." +msgstr "" + +#: ../src/vikgpslayer.c:1546 +msgid "Could not turn off device." +msgstr "" + +#: ../src/vikgpslayer.c:1589 +msgid "Are you sure you want to delete GPS Upload data?" +msgstr "" + +#: ../src/vikgpslayer.c:1602 +msgid "Are you sure you want to delete GPS Download data?" +msgstr "" + +#: ../src/vikgpslayer.c:1616 +msgid "Are you sure you want to delete GPS Realtime data?" +msgstr "" + +#: ../src/vikgpslayer.c:1630 +msgid "Are you sure you want to delete All GPS data?" +msgstr "" + +#: ../src/vikgpslayer.c:2004 +#, c-format +msgid "" +"Failed to connect to gpsd at %s (port %s)\n" +"Should Viking keep trying (every %d seconds)?" +msgstr "" + +#: ../src/viklayerspanel.c:73 +msgid "C_ut" +msgstr "" + +#: ../src/viklayerspanel.c:74 ../src/vikwindow.c:4882 +msgid "_Copy" +msgstr "" + +#: ../src/viklayerspanel.c:75 ../src/vikwindow.c:4883 +msgid "_Paste" +msgstr "" + +#: ../src/viklayerspanel.c:76 ../src/vikwindow.c:4884 +msgid "_Delete" +msgstr "" + +#: ../src/viklayerspanel.c:154 +msgid "New Layer" +msgstr "" + +#: ../src/viklayerspanel.c:347 +msgid "Top Layer" +msgstr "" + +#: ../src/viklayerspanel.c:363 +msgid "Add new layer" +msgstr "" + +#: ../src/viklayerspanel.c:370 ../src/vikwindow.c:4884 +msgid "Remove selected layer" +msgstr "" + +#: ../src/viklayerspanel.c:377 +msgid "Move selected layer up" +msgstr "" + +#: ../src/viklayerspanel.c:384 +msgid "Move selected layer down" +msgstr "" + +#: ../src/viklayerspanel.c:391 ../src/vikwindow.c:4881 +msgid "Cut selected layer" +msgstr "" + +#: ../src/viklayerspanel.c:398 ../src/vikwindow.c:4882 +msgid "Copy selected layer" +msgstr "" + +#: ../src/viklayerspanel.c:405 ../src/vikwindow.c:4883 +msgid "" +"Paste layer into selected container layer or otherwise above selected layer" +msgstr "" + +#: ../src/viklayerspanel.c:502 +msgid "New name can not be blank." +msgstr "" + +#: ../src/viklayerspanel.c:751 +msgid "Aggregate Layers have no settable properties." +msgstr "" + +#: ../src/viklayerspanel.c:798 +msgid "You cannot cut the Top Layer." +msgstr "" + +#: ../src/viklayerspanel.c:843 +#, c-format +msgid "Are you sure you want to delete %s?" +msgstr "" + +#: ../src/viklayerspanel.c:863 +msgid "You cannot delete the Top Layer." +msgstr "" + +#: ../src/vikmapniklayer.c:78 +msgid "CSS (MML) Config File:" +msgstr "" + +#: ../src/vikmapniklayer.c:79 +msgid "CartoCSS configuration file" +msgstr "" + +#: ../src/vikmapniklayer.c:80 +msgid "XML Config File:" +msgstr "" + +#: ../src/vikmapniklayer.c:81 +msgid "Mapnik XML configuration file" +msgstr "" + +#: ../src/vikmapniklayer.c:84 +msgid "Use File Cache:" +msgstr "" + +#: ../src/vikmapniklayer.c:86 +msgid "File Cache Directory:" +msgstr "" + +#: ../src/vikmapniklayer.c:122 +msgid "_Mapnik Features" +msgstr "" + +#: ../src/vikmapniklayer.c:122 +msgid "Mapnik Features" +msgstr "" + +#: ../src/vikmapniklayer.c:140 +msgid "Mapnik Rendering" +msgstr "" + +#. Changing these values only applies before first mapnik layer is 'created' +#: ../src/vikmapniklayer.c:258 +msgid "Plugins Directory:" +msgstr "" + +#: ../src/vikmapniklayer.c:258 ../src/vikmapniklayer.c:259 +#: ../src/vikmapniklayer.c:260 ../src/vikmapniklayer.c:261 +msgid "You need to restart Viking for a change to this value to be used" +msgstr "" + +#: ../src/vikmapniklayer.c:259 +msgid "Fonts Directory:" +msgstr "" + +#: ../src/vikmapniklayer.c:260 +msgid "Recurse Fonts Directory:" +msgstr "" + +#: ../src/vikmapniklayer.c:261 +msgid "Rerender Timeout (hours):" +msgstr "" + +#. Changeable any time +#: ../src/vikmapniklayer.c:263 +msgid "CartoCSS:" +msgstr "" + +#: ../src/vikmapniklayer.c:263 +msgid "The program to convert CartoCSS files into Mapnik XML" +msgstr "" + +#: ../src/vikmapniklayer.c:506 +msgid "Running" +msgstr "" + +#: ../src/vikmapniklayer.c:525 +#, c-format +msgid "" +"Error running carto command:\n" +"%s" +msgstr "" + +#: ../src/vikmapniklayer.c:561 +msgid " completed in " +msgstr "" + +#: ../src/vikmapniklayer.c:561 +msgid "seconds" +msgstr "" + +#: ../src/vikmapniklayer.c:611 ../src/vikmapniklayer.c:979 +#, c-format +msgid "" +"Mapnik error loading configuration file:\n" +"%s" +msgstr "" + +#: ../src/vikmapniklayer.c:749 +#, c-format +msgid "Mapnik Render %d:%d:%d %s" +msgstr "" + +#: ../src/vikmapniklayer.c:840 +msgid "Mapnik Rendering must be in Mercator mode" +msgstr "" + +#: ../src/vikmapniklayer.c:997 +msgid "Mapnik Information" +msgstr "" + +#: ../src/vikmapniklayer.c:1031 +msgid "_Flush Memory Cache" +msgstr "" + +#: ../src/vikmapniklayer.c:1044 +msgid "_Run Carto Command" +msgstr "" + +#: ../src/vikmapniklayer.c:1102 ../src/vikmapslayer.c:2029 +#, c-format +msgid "Tile File Timestamp: %s" +msgstr "" + +#: ../src/vikmapniklayer.c:1105 ../src/vikmapslayer.c:2032 +msgid "Tile File Timestamp: Not Available" +msgstr "" + +#: ../src/vikmapniklayer.c:1120 +#, c-format +msgid "Rendering time %.2f seconds" +msgstr "" + +#: ../src/vikmapniklayer.c:1124 ../src/vikmapslayer.c:2042 +msgid "Tile Information" +msgstr "" + +#: ../src/vikmapniklayer.c:1145 +msgid "_Rerender Tile" +msgstr "" + +#: ../src/vikmapniklayer.c:1150 +msgid "_Info" +msgstr "" + +#. ******* MAPZOOMS ******** +#: ../src/vikmapslayer.c:96 +msgid "Use Viking Zoom Level" +msgstr "" + +#: ../src/vikmapslayer.c:146 +msgid "OSM" +msgstr "" + +#. NB mode => id - But can't break file format just to rename something better +#: ../src/vikmapslayer.c:152 +msgid "Map Type:" +msgstr "" + +#: ../src/vikmapslayer.c:153 +msgid "Maps Directory:" +msgstr "" + +#: ../src/vikmapslayer.c:154 +msgid "Cache Layout:" +msgstr "" + +#: ../src/vikmapslayer.c:155 +msgid "This determines the tile storage layout on disk" +msgstr "" + +#: ../src/vikmapslayer.c:156 +msgid "Map File:" +msgstr "" + +#: ../src/vikmapslayer.c:157 +msgid "An MBTiles file. Only applies when the map type method is 'MBTiles'" +msgstr "" + +#: ../src/vikmapslayer.c:159 +msgid "Control the Alpha value for transparency effects" +msgstr "" + +#: ../src/vikmapslayer.c:160 +msgid "Autodownload maps:" +msgstr "" + +#: ../src/vikmapslayer.c:161 +msgid "Autodownload Only Gets Missing Maps:" +msgstr "" + +#: ../src/vikmapslayer.c:162 +msgid "" +"Using this option avoids attempting to update already acquired tiles. This " +"can be useful if you want to restrict the network usage, without having to " +"resort to manual control. Only applies when 'Autodownload Maps' is on." +msgstr "" + +#: ../src/vikmapslayer.c:163 +msgid "Zoom Level:" +msgstr "" + +#: ../src/vikmapslayer.c:164 +msgid "" +"Determines the method of displaying map tiles for the current zoom level. " +"'Viking Zoom Level' uses the best matching level, otherwise setting a fixed " +"value will always use map tiles of the specified value regardless of the " +"actual zoom level." +msgstr "" + +#: ../src/vikmapslayer.c:197 +msgid "_Maps Download" +msgstr "" + +#: ../src/vikmapslayer.c:197 +msgid "Maps Download" +msgstr "" + +#: ../src/vikmapslayer.c:213 ../src/vikutils.c:895 +msgid "Map" +msgstr "" + +#: ../src/vikmapslayer.c:306 +msgid "Default map layer directory:" +msgstr "" + +#: ../src/vikmapslayer.c:306 +msgid "Choose a directory to store cached Map tiles for this layer" +msgstr "" + +#: ../src/vikmapslayer.c:436 ../src/vikmapslayer.c:633 +msgid "Unknown map type" +msgstr "" + +#: ../src/vikmapslayer.c:664 +msgid "Unknown Map Zoom" +msgstr "" + +#: ../src/vikmapslayer.c:833 +#, c-format +msgid "Failed to open MBTiles file: %s" +msgstr "" + +#: ../src/vikmapslayer.c:856 +#, c-format +msgid "" +"New map cannot be displayed in the current drawmode.\n" +"Select \"%s\" from View menu to view it." +msgstr "" + +#: ../src/vikmapslayer.c:1314 +#, c-format +msgid "" +"Cowardly refusing to draw tiles or existence of tiles beyond %d zoom out " +"factor" +msgstr "" + +#. TODO: ?? count up the number of download errors somehow... +#: ../src/vikmapslayer.c:1667 +msgid "Failed to download tile" +msgstr "" + +#: ../src/vikmapslayer.c:1673 +msgid "Unable to save tile" +msgstr "" + +#: ../src/vikmapslayer.c:1799 +#, c-format +msgid "Redownloading up to %d %s map..." +msgid_plural "Redownloading up to %d %s maps..." +msgstr[0] "" +msgstr[1] "" + +#: ../src/vikmapslayer.c:1801 +#, c-format +msgid "Redownloading %d %s map..." +msgid_plural "Redownloading %d %s maps..." +msgstr[0] "" +msgstr[1] "" + +#: ../src/vikmapslayer.c:1805 ../src/vikmapslayer.c:1890 +#, c-format +msgid "Downloading %d %s map..." +msgid_plural "Downloading %d %s maps..." +msgstr[0] "" +msgstr[1] "" + +#: ../src/vikmapslayer.c:1969 +msgid "YES" +msgstr "" + +#: ../src/vikmapslayer.c:1973 ../src/vikmapslayer.c:1977 +msgid "NO" +msgstr "" + +#. NB Also handles .jpg automatically due to pixbuf_new_from () support - although just print png for now. +#: ../src/vikmapslayer.c:1980 +#, c-format +msgid "Source: %s (%d%s%d%s%d.%s %s)" +msgstr "" + +#: ../src/vikmapslayer.c:1983 +msgid "Source: Not available" +msgstr "" + +#: ../src/vikmapslayer.c:2000 +msgid "Source: file://" +msgstr "" + +#: ../src/vikmapslayer.c:2012 +#, c-format +msgid "Source: %s" +msgstr "" + +#: ../src/vikmapslayer.c:2038 +#, c-format +msgid "Tile File: %s [Not Available]" +msgstr "" + +#: ../src/vikmapslayer.c:2086 +msgid "Redownload _Bad Map(s)" +msgstr "" + +#: ../src/vikmapslayer.c:2090 +msgid "Redownload _New Map(s)" +msgstr "" + +#: ../src/vikmapslayer.c:2094 +msgid "Redownload _All Map(s)" +msgstr "" + +#: ../src/vikmapslayer.c:2099 +msgid "_Show Tile Information" +msgstr "" + +#: ../src/vikmapslayer.c:2166 +#, c-format +msgid "" +"Wrong drawmode for this map.\n" +"Select \"%s\" from View menu and try again." +msgstr "" + +#: ../src/vikmapslayer.c:2171 +msgid "Wrong zoom level for this map." +msgstr "" + +#: ../src/vikmapslayer.c:2334 +msgid "Zoom Start:" +msgstr "" + +#: ../src/vikmapslayer.c:2341 +msgid "Zoom End:" +msgstr "" + +#: ../src/vikmapslayer.c:2347 +msgid "Download Maps Method:" +msgstr "" + +#. redownload method - needs to align with REDOWNLOAD* macro values +#: ../src/vikmapslayer.c:2419 +msgid "Missing" +msgstr "" + +#: ../src/vikmapslayer.c:2419 +msgid "Bad" +msgstr "" + +#: ../src/vikmapslayer.c:2419 +msgid "New" +msgstr "" + +#: ../src/vikmapslayer.c:2419 +msgid "Reload All" +msgstr "" + +#: ../src/vikmapslayer.c:2421 +msgid "Download for Zoom Levels" +msgstr "" + +#: ../src/vikmapslayer.c:2461 +#, c-format +msgid "" +"You are not allowed to download more than %d tiles in one go (requested %d)" +msgstr "" + +#: ../src/vikmapslayer.c:2469 +#, c-format +msgid "Do you really want to download %d tiles?" +msgstr "" + +#. Now with icons +#: ../src/vikmapslayer.c:2509 +msgid "Download _Missing Onscreen Maps" +msgstr "" + +#: ../src/vikmapslayer.c:2516 +msgid "Download _New Onscreen Maps" +msgstr "" + +#: ../src/vikmapslayer.c:2523 +msgid "Reload _All Onscreen Maps" +msgstr "" + +#: ../src/vikmapslayer.c:2529 +msgid "Download Maps in _Zoom Levels..." +msgstr "" + +#: ../src/vikmapslayer.c:2539 +#, fuzzy +msgid "_Open MBTiles Files" +msgstr "Відкрити файл" + +#: ../src/vikmapslayer.c:2554 +msgid "Flush Map Cache" +msgstr "" + +#: ../src/vikrouting.c:54 +msgid "Default engine:" +msgstr "" + +#: ../src/vikrouting.c:68 +msgid "Routing" +msgstr "" + +#: ../src/viktreeview.c:347 +msgid "Layer Name" +msgstr "Назва шару" + +#: ../src/viktreeview.c:924 +#, c-format +msgid "delete data from %s\n" +msgstr "" + +#: ../src/viktrwlayer.c:427 +msgid "Create _Waypoint" +msgstr "" + +#: ../src/viktrwlayer.c:427 +msgid "Create Waypoint" +msgstr "" + +#: ../src/viktrwlayer.c:437 +msgid "Edit _Track" +msgstr "" + +#: ../src/viktrwlayer.c:437 +msgid "Edit Track" +msgstr "" + +#: ../src/viktrwlayer.c:449 +msgid "Edit _Route" +msgstr "" + +#: ../src/viktrwlayer.c:449 +msgid "Edit Route" +msgstr "" + +#: ../src/viktrwlayer.c:460 +msgid "Route _Finder" +msgstr "" + +#: ../src/viktrwlayer.c:460 +msgid "Route Finder" +msgstr "" + +#: ../src/viktrwlayer.c:471 +msgid "Splitter" +msgstr "" + +#: ../src/viktrwlayer.c:482 +msgid "_Edit Waypoint" +msgstr "" + +#: ../src/viktrwlayer.c:482 +msgid "Edit Waypoint" +msgstr "" + +#: ../src/viktrwlayer.c:495 +msgid "Edit Trac_kpoint" +msgstr "" + +#: ../src/viktrwlayer.c:495 +msgid "Edit Trackpoint" +msgstr "" + +#. a pixbuf for this one is already made globally available +#: ../src/viktrwlayer.c:508 +msgid "Show P_icture" +msgstr "" + +#: ../src/viktrwlayer.c:508 +msgid "Show Picture" +msgstr "" + +#: ../src/viktrwlayer.c:531 +msgid "Waypoint Images" +msgstr "" + +#: ../src/viktrwlayer.c:531 +msgid "Tracks Advanced" +msgstr "" + +#: ../src/viktrwlayer.c:531 +msgid "Metadata" +msgstr "" + +#: ../src/viktrwlayer.c:531 +#, fuzzy +msgid "Filesystem" +msgstr "Тип файлу:" + +#: ../src/viktrwlayer.c:534 +msgid "Draw by Track" +msgstr "" + +#: ../src/viktrwlayer.c:534 +msgid "Draw by Speed" +msgstr "" + +#: ../src/viktrwlayer.c:534 +msgid "All Tracks Same Color" +msgstr "" + +#: ../src/viktrwlayer.c:535 +msgid "Filled Square" +msgstr "" + +#: ../src/viktrwlayer.c:535 +msgid "Square" +msgstr "" + +#: ../src/viktrwlayer.c:535 +msgid "Circle" +msgstr "" + +#: ../src/viktrwlayer.c:535 +msgid "X" +msgstr "" + +#: ../src/viktrwlayer.c:561 +msgid "Extra Extra Small" +msgstr "" + +#: ../src/viktrwlayer.c:562 +msgid "Extra Small" +msgstr "" + +#: ../src/viktrwlayer.c:566 +msgid "Extra Large" +msgstr "" + +#: ../src/viktrwlayer.c:567 +msgid "Extra Extra Large" +msgstr "" + +#: ../src/viktrwlayer.c:573 +msgid "Name Ascending" +msgstr "" + +#: ../src/viktrwlayer.c:574 +msgid "Name Descending" +msgstr "" + +#: ../src/viktrwlayer.c:582 ../src/viktrwlayer_propwin.c:3319 +msgid "No" +msgstr "" + +#: ../src/viktrwlayer.c:583 +msgid "Yes" +msgstr "" + +#: ../src/viktrwlayer.c:584 +msgid "No write" +msgstr "" + +#: ../src/viktrwlayer.c:649 ../src/viktrwlayer.c:673 +msgid "Draw Labels" +msgstr "" + +#: ../src/viktrwlayer.c:650 +msgid "Note: the individual track controls what labels may be displayed" +msgstr "" + +#: ../src/viktrwlayer.c:651 +msgid "Track Labels Font Size:" +msgstr "" + +#: ../src/viktrwlayer.c:652 +msgid "Track Drawing Mode:" +msgstr "" + +#: ../src/viktrwlayer.c:653 +msgid "All Tracks Color:" +msgstr "" + +#: ../src/viktrwlayer.c:654 +msgid "The color used when 'All Tracks Same Color' drawing mode is selected" +msgstr "" + +#: ../src/viktrwlayer.c:655 +msgid "Draw Track Lines" +msgstr "" + +#: ../src/viktrwlayer.c:656 +msgid "Track Thickness:" +msgstr "" + +#: ../src/viktrwlayer.c:657 +msgid "Draw Track Direction" +msgstr "" + +#: ../src/viktrwlayer.c:658 +msgid "Direction Size:" +msgstr "" + +#: ../src/viktrwlayer.c:659 +msgid "Draw Trackpoints" +msgstr "" + +#: ../src/viktrwlayer.c:660 +msgid "Trackpoint Size:" +msgstr "" + +#: ../src/viktrwlayer.c:661 +msgid "Draw Elevation" +msgstr "" + +#: ../src/viktrwlayer.c:662 +msgid "Draw Elevation Height %:" +msgstr "" + +#: ../src/viktrwlayer.c:663 +msgid "Draw Stops" +msgstr "" + +#: ../src/viktrwlayer.c:664 +msgid "" +"Whether to draw a marker when trackpoints are at the same position but over " +"the minimum stop length apart in time" +msgstr "" + +#: ../src/viktrwlayer.c:665 +msgid "Min Stop Length (seconds):" +msgstr "" + +#: ../src/viktrwlayer.c:667 +msgid "Track BG Thickness:" +msgstr "" + +#: ../src/viktrwlayer.c:668 +msgid "Track Background Color" +msgstr "" + +#: ../src/viktrwlayer.c:669 +msgid "Draw by Speed Factor (%):" +msgstr "" + +#: ../src/viktrwlayer.c:670 +msgid "" +"The percentage factor away from the average speed determining the color used" +msgstr "" + +#: ../src/viktrwlayer.c:671 +msgid "Track Sort Order:" +msgstr "" + +#: ../src/viktrwlayer.c:674 +msgid "Waypoint Font Size:" +msgstr "" + +#: ../src/viktrwlayer.c:675 +msgid "Waypoint Color:" +msgstr "" + +#: ../src/viktrwlayer.c:676 +msgid "Waypoint Text:" +msgstr "" + +#: ../src/viktrwlayer.c:677 +msgid "Background:" +msgstr "" + +#: ../src/viktrwlayer.c:678 +msgid "Fake BG Color Translucency:" +msgstr "" + +#: ../src/viktrwlayer.c:679 +msgid "Waypoint marker:" +msgstr "" + +#: ../src/viktrwlayer.c:680 +msgid "Waypoint size:" +msgstr "" + +#: ../src/viktrwlayer.c:681 +msgid "Draw Waypoint Symbols:" +msgstr "" + +#: ../src/viktrwlayer.c:682 +msgid "Waypoint Sort Order:" +msgstr "" + +#: ../src/viktrwlayer.c:684 +msgid "Draw Waypoint Images" +msgstr "" + +#: ../src/viktrwlayer.c:685 +msgid "Image Size (pixels):" +msgstr "" + +#: ../src/viktrwlayer.c:686 +msgid "Image Alpha:" +msgstr "" + +#: ../src/viktrwlayer.c:687 +msgid "Image Memory Cache Size:" +msgstr "" + +#: ../src/viktrwlayer.c:690 +msgid "Author" +msgstr "" + +#: ../src/viktrwlayer.c:691 +msgid "Creation Time" +msgstr "" + +#: ../src/viktrwlayer.c:692 +msgid "Keywords" +msgstr "" + +#: ../src/viktrwlayer.c:693 +msgid "External layer:" +msgstr "" + +#: ../src/viktrwlayer.c:693 +msgid "" +"Layer data stored in the Viking file, in an external file, or in an external " +"file but changes are not written to the file (file only loaded at startup)" +msgstr "" + +#: ../src/viktrwlayer.c:694 +msgid "Save layer as:" +msgstr "" + +#: ../src/viktrwlayer.c:694 +msgid "Specify where layer should be saved. Overwrites file if it exists." +msgstr "" + +#: ../src/viktrwlayer.c:798 +msgid "TrackWaypoint" +msgstr "" + +#: ../src/viktrwlayer.c:1999 ../src/viktrwlayer_propwin.c:1469 +#: ../src/viktrwlayer_propwin.c:1471 ../src/vikutils.c:299 +#: ../src/vikutils.c:326 +msgid "miles" +msgstr "" + +#: ../src/viktrwlayer.c:2002 ../src/viktrwlayer_propwin.c:1475 +#: ../src/viktrwlayer_propwin.c:1477 ../src/vikutils.c:303 +#: ../src/vikutils.c:330 +msgid "NM" +msgstr "" + +#. VIK_UNITS_DISTANCE_KILOMETRES: +#: ../src/viktrwlayer.c:2006 ../src/viktrwlayer_propwin.c:1482 +#: ../src/viktrwlayer_propwin.c:1484 ../src/vikutils.c:308 +#: ../src/vikutils.c:335 +msgid "km" +msgstr "км" + +#: ../src/viktrwlayer.c:2121 +msgid "start/end" +msgstr "" + +#: ../src/viktrwlayer.c:2133 +msgid "start" +msgstr "" + +#: ../src/viktrwlayer.c:2142 +msgid "end" +msgstr "" + +#: ../src/viktrwlayer.c:3103 +#, c-format +msgid " in %d:%02d hrs:mins" +msgstr "" + +#: ../src/viktrwlayer.c:3107 +#, c-format +msgid "" +"\n" +"%sTotal Length %.1f %s%s" +msgstr "" + +#: ../src/viktrwlayer.c:3131 +#, c-format +msgid "" +"\n" +"Total route length %.1f %s" +msgstr "" + +#: ../src/viktrwlayer.c:3136 +#, c-format +msgid "Tracks: %d - Waypoints: %d - Routes: %d%s%s" +msgstr "" + +#: ../src/viktrwlayer.c:3155 +#, c-format +msgid "Tracks: %d" +msgstr "" + +#: ../src/viktrwlayer.c:3165 +#, c-format +msgid "Routes: %d" +msgstr "" + +#: ../src/viktrwlayer.c:3195 +#, c-format +msgid "- %d:%02d hrs:mins" +msgstr "" + +#: ../src/viktrwlayer.c:3202 +#, c-format +msgid "%s%.1f km %s" +msgstr "%s%.1f км %s" + +#: ../src/viktrwlayer.c:3205 +#, c-format +msgid "%s%.1f miles %s" +msgstr "" + +#: ../src/viktrwlayer.c:3208 +#, c-format +msgid "%s%.1f NM %s" +msgstr "" + +#: ../src/viktrwlayer.c:3222 +#, c-format +msgid "Waypoints: %d" +msgstr "" + +#: ../src/viktrwlayer.c:3279 +#, c-format +msgid "Wpt: Alt %dft" +msgstr "" + +#. VIK_UNITS_HEIGHT_METRES: +#: ../src/viktrwlayer.c:3283 +#, c-format +msgid "Wpt: Alt %dm" +msgstr "" + +#. Add comment if available +#: ../src/viktrwlayer.c:3298 +#, c-format +msgid "%s | %s %s | Comment: %s" +msgstr "" + +#: ../src/viktrwlayer.c:3300 +#, c-format +msgid "%s | %s %s" +msgstr "" + +#: ../src/viktrwlayer.c:3562 ../src/viktrwlayer.c:3591 +msgid "This layer has no waypoints or trackpoints." +msgstr "" + +#: ../src/viktrwlayer.c:3598 ../src/viktrwlayer.c:3607 +#: ../src/viktrwlayer.c:3616 ../src/viktrwlayer.c:3625 +#: ../src/viktrwlayer.c:3634 ../src/viktrwlayer.c:3642 +msgid "Export Layer" +msgstr "" + +#: ../src/viktrwlayer.c:3671 +msgid "Export Route as GPX" +msgstr "" + +#: ../src/viktrwlayer.c:3673 +msgid "Export Track as GPX" +msgstr "" + +#: ../src/viktrwlayer.c:3693 +msgid "Find" +msgstr "" + +#: ../src/viktrwlayer.c:3703 +msgid "Waypoint Name:" +msgstr "" + +#: ../src/viktrwlayer.c:3720 +msgid "Waypoint not found in this layer." +msgstr "" + +#: ../src/viktrwlayer.c:3989 +msgid "Can not upload invisible track." +msgstr "" + +#: ../src/viktrwlayer.c:4082 ../src/viktrwlayer.c:10512 +msgid "Track" +msgstr "" + +#: ../src/viktrwlayer.c:4107 ../src/viktrwlayer.c:10599 +msgid "Route" +msgstr "" + +#: ../src/viktrwlayer.c:4194 +msgid "Externa_l" +msgstr "" + +#: ../src/viktrwlayer.c:4216 ../src/viktrwlayer.c:8456 +#: ../src/viktrwlayer.c:8574 +msgid "_Finish Route" +msgstr "" + +#: ../src/viktrwlayer.c:4218 ../src/viktrwlayer.c:8380 +#: ../src/viktrwlayer.c:8572 +msgid "_Finish Track" +msgstr "" + +#. Now with icons +#: ../src/viktrwlayer.c:4230 +msgid "_View Layer" +msgstr "" + +#: ../src/viktrwlayer.c:4237 +msgid "V_iew" +msgstr "" + +#: ../src/viktrwlayer.c:4243 +msgid "View All _Tracks" +msgstr "" + +#: ../src/viktrwlayer.c:4248 +msgid "View All _Routes" +msgstr "" + +#: ../src/viktrwlayer.c:4253 +msgid "View All _Waypoints" +msgstr "" + +#: ../src/viktrwlayer.c:4258 +msgid "_Goto Center of Layer" +msgstr "" + +#: ../src/viktrwlayer.c:4264 ../src/viktrwlayer.c:8321 +msgid "Goto _Waypoint..." +msgstr "" + +#: ../src/viktrwlayer.c:4270 +msgid "_Export Layer" +msgstr "" + +#: ../src/viktrwlayer.c:4276 +msgid "Export as GPS_Point..." +msgstr "" + +#: ../src/viktrwlayer.c:4281 +msgid "Export as GPS_Mapper..." +msgstr "" + +#: ../src/viktrwlayer.c:4286 +msgid "Export as _GPX..." +msgstr "" + +#: ../src/viktrwlayer.c:4292 +msgid "Export as _KML..." +msgstr "" + +#: ../src/viktrwlayer.c:4299 +msgid "Export as GEO_JSON..." +msgstr "" + +#: ../src/viktrwlayer.c:4306 +msgid "Export via GPSbabel..." +msgstr "" + +#: ../src/viktrwlayer.c:4312 +#, c-format +msgid "Open with External Program_1: %s" +msgstr "" + +#: ../src/viktrwlayer.c:4319 +#, c-format +msgid "Open with External Program_2: %s" +msgstr "" + +#: ../src/viktrwlayer.c:4327 ../src/vikwindow.c:4825 +msgid "_New" +msgstr "" + +#: ../src/viktrwlayer.c:4333 +msgid "New _Waypoint..." +msgstr "" + +#: ../src/viktrwlayer.c:4339 +msgid "New _Track" +msgstr "" + +#: ../src/viktrwlayer.c:4347 +msgid "New _Route" +msgstr "" + +#: ../src/viktrwlayer.c:4356 ../src/viktrwlayer.c:8232 +#: ../src/viktrwlayer.c:9003 +msgid "Geotag _Images..." +msgstr "" + +#: ../src/viktrwlayer.c:4363 +msgid "_Acquire" +msgstr "" + +#: ../src/viktrwlayer.c:4369 ../src/vikwindow.c:4904 +msgid "From _GPS..." +msgstr "" + +#. FIXME: only add menu when at least a routing engine has support for Directions +#: ../src/viktrwlayer.c:4375 +msgid "From _Directions..." +msgstr "" + +#: ../src/viktrwlayer.c:4381 +msgid "From _OSM Traces..." +msgstr "" + +#: ../src/viktrwlayer.c:4386 +msgid "From _My OSM Traces..." +msgstr "" + +#: ../src/viktrwlayer.c:4392 ../src/vikwindow.c:4844 +msgid "From _URL..." +msgstr "" + +#: ../src/viktrwlayer.c:4399 ../src/vikwindow.c:4846 +msgid "From _Wikipedia Waypoints" +msgstr "" + +#: ../src/viktrwlayer.c:4405 +msgid "Within _Layer Bounds" +msgstr "" + +#: ../src/viktrwlayer.c:4411 +msgid "Within _Current View" +msgstr "" + +#: ../src/viktrwlayer.c:4419 +msgid "From Geo_caching..." +msgstr "" + +#: ../src/viktrwlayer.c:4426 ../src/vikwindow.c:4842 +msgid "From Geotagged _Images..." +msgstr "" + +#: ../src/viktrwlayer.c:4433 +msgid "From _File..." +msgstr "" + +#: ../src/viktrwlayer.c:4436 ../src/vikwindow.c:4905 +msgid "Import File With GPS_Babel..." +msgstr "" + +#: ../src/viktrwlayer.c:4443 ../src/viktrwlayer.c:8905 +msgid "_Upload" +msgstr "" + +#: ../src/viktrwlayer.c:4449 +msgid "Upload to _GPS..." +msgstr "" + +#: ../src/viktrwlayer.c:4456 ../src/viktrwlayer.c:8973 +msgid "Upload to _OSM..." +msgstr "" + +#: ../src/viktrwlayer.c:4464 +msgid "De_lete" +msgstr "" + +#: ../src/viktrwlayer.c:4470 +msgid "Delete All _Tracks" +msgstr "" + +#: ../src/viktrwlayer.c:4477 +msgid "Delete Tracks _From Selection..." +msgstr "" + +#: ../src/viktrwlayer.c:4484 ../src/viktrwlayer.c:8481 +msgid "Delete _All Routes" +msgstr "" + +#: ../src/viktrwlayer.c:4491 ../src/viktrwlayer.c:8487 +msgid "_Delete Routes From Selection..." +msgstr "" + +#: ../src/viktrwlayer.c:4498 +msgid "Delete All _Waypoints" +msgstr "" + +#: ../src/viktrwlayer.c:4505 +msgid "Delete Waypoints From _Selection..." +msgstr "" + +#: ../src/viktrwlayer.c:4512 ../src/viktrwlayer.c:8339 +msgid "Delete Duplicate Waypoints" +msgstr "" + +#: ../src/viktrwlayer.c:5198 +#, c-format +msgid "Are you sure you want to delete all tracks in %s?" +msgstr "" + +#: ../src/viktrwlayer.c:5211 +#, c-format +msgid "Are you sure you want to delete all routes in %s?" +msgstr "" + +#: ../src/viktrwlayer.c:5221 +#, c-format +msgid "Are you sure you want to delete all waypoints in %s?" +msgstr "" + +#: ../src/viktrwlayer.c:5238 +#, c-format +msgid "Are you sure you want to delete the waypoint \"%s\"?" +msgstr "" + +#: ../src/viktrwlayer.c:5254 +#, c-format +msgid "Are you sure you want to delete the track \"%s\"?" +msgstr "" + +#: ../src/viktrwlayer.c:5271 +#, c-format +msgid "Are you sure you want to delete the route \"%s\"?" +msgstr "" + +#: ../src/viktrwlayer.c:5527 ../src/viktrwlayer.c:6373 +msgid "" +"Converting a track to a route removes extra track data such as segments, " +"timestamps, etc...\n" +"Do you want to continue?" +msgstr "" + +#: ../src/viktrwlayer.c:5631 +msgid "No DEM layers available, thus no DEM values can be applied." +msgstr "" + +#: ../src/viktrwlayer.c:5651 ../src/viktrwlayer.c:5692 +#, c-format +msgid "%ld point adjusted" +msgid_plural "%ld points adjusted" +msgstr[0] "" +msgstr[1] "" + +#: ../src/viktrwlayer.c:5736 +#, c-format +msgid "%ld waypoint changed" +msgid_plural "%ld waypoints changed" +msgstr[0] "" +msgstr[1] "" + +#: ../src/viktrwlayer.c:5917 +#, c-format +msgid "" +"Refining a track with many points (%d) is unlikely to yield sensible " +"results. Do you want to Continue?" +msgstr "" + +#. Select engine from dialog +#: ../src/viktrwlayer.c:5925 +msgid "Refine Route with Routing Engine..." +msgstr "" + +#: ../src/viktrwlayer.c:5933 +msgid "Select routing engine" +msgstr "" + +#: ../src/viktrwlayer.c:6158 +msgid "Failed. No other tracks with timestamps in this layer found" +msgstr "" + +#: ../src/viktrwlayer.c:6160 +msgid "Failed. No other tracks without timestamps in this layer found" +msgstr "" + +#: ../src/viktrwlayer.c:6179 +msgid "Merge with..." +msgstr "" + +#: ../src/viktrwlayer.c:6180 +msgid "Select route to merge with" +msgstr "" + +#: ../src/viktrwlayer.c:6180 +msgid "Select track to merge with" +msgstr "" + +#: ../src/viktrwlayer.c:6264 ../src/viktrwlayer.c:6346 +msgid "Append Route" +msgstr "" + +#: ../src/viktrwlayer.c:6264 ../src/viktrwlayer.c:6346 +msgid "Append Track" +msgstr "" + +#: ../src/viktrwlayer.c:6265 +msgid "Select the route to append after the current route" +msgstr "" + +#: ../src/viktrwlayer.c:6266 +msgid "Select the track to append after the current track" +msgstr "" + +#: ../src/viktrwlayer.c:6347 +msgid "Select the track to append after the current route" +msgstr "" + +#: ../src/viktrwlayer.c:6348 +msgid "Select the route to append after the current track" +msgstr "" + +#: ../src/viktrwlayer.c:6414 +#, c-format +msgid "%d segment merged" +msgid_plural "%d segments merged" +msgstr[0] "" +msgstr[1] "" + +#: ../src/viktrwlayer.c:6430 +msgid "Failed. This track does not have timestamp" +msgstr "" + +#: ../src/viktrwlayer.c:6442 +msgid "Failed. No other track in this layer has timestamp" +msgstr "" + +#: ../src/viktrwlayer.c:6449 +msgid "Merge Threshold..." +msgstr "" + +#: ../src/viktrwlayer.c:6450 +msgid "Merge when time between tracks less than:" +msgstr "" + +#: ../src/viktrwlayer.c:6580 +msgid "Split Threshold..." +msgstr "" + +#: ../src/viktrwlayer.c:6581 +msgid "Split when time between trackpoints exceeds:" +msgstr "" + +#: ../src/viktrwlayer.c:6598 +#, c-format +msgid "" +"Can not split track due to trackpoints not ordered in time - such as at %s.\n" +"\n" +"Goto this trackpoint?" +msgstr "" + +#: ../src/viktrwlayer.c:6668 +msgid "Split Every Nth Point" +msgstr "" + +#: ../src/viktrwlayer.c:6669 +msgid "Split on every Nth point:" +msgstr "" + +#: ../src/viktrwlayer.c:6779 +msgid "Can not split track as it has no segments" +msgstr "" + +#: ../src/viktrwlayer.c:6861 ../src/viktrwlayer.c:6891 +#, c-format +msgid "Deleted %ld point" +msgid_plural "Deleted %ld points" +msgstr[0] "" +msgstr[1] "" + +#: ../src/viktrwlayer.c:6966 ../src/viktrwlayer.c:10989 +#: ../src/viktrwlayer_waypointlist.c:214 +#, c-format +msgid "Could not launch %s to open file." +msgstr "" + +#: ../src/viktrwlayer.c:6992 ../src/viktrwlayer.c:7113 +msgid "This track has no date information." +msgstr "" + +#: ../src/viktrwlayer.c:7006 ../src/viktrwlayer.c:7136 +msgid "This waypoint has no date information." +msgstr "" + +#: ../src/viktrwlayer.c:7030 +#, c-format +msgid "Could not launch %s" +msgstr "" + +#: ../src/viktrwlayer.c:7269 +msgid "Internal Error in vik_trw_layer_uniquify_tracks" +msgstr "" + +#: ../src/viktrwlayer.c:7374 ../src/viktrwlayer.c:7424 +#: ../src/viktrwlayer.c:7587 +msgid "" +"Multiple entries with the same name exist. This method only works with " +"unique names. Force unique names now?" +msgstr "" + +#: ../src/viktrwlayer.c:7385 +msgid "No tracks found" +msgstr "" + +#: ../src/viktrwlayer.c:7393 ../src/viktrwlayer.c:7443 +#: ../src/viktrwlayer.c:7607 +msgid "Delete Selection" +msgstr "" + +#: ../src/viktrwlayer.c:7394 +msgid "Select tracks to delete" +msgstr "" + +#: ../src/viktrwlayer.c:7435 +msgid "No routes found" +msgstr "" + +#: ../src/viktrwlayer.c:7444 +msgid "Select routes to delete" +msgstr "" + +#: ../src/viktrwlayer.c:7550 +msgid "Internal Error in vik_trw_layer_uniquify_waypoints" +msgstr "" + +#: ../src/viktrwlayer.c:7597 +msgid "No waypoints found" +msgstr "" + +#: ../src/viktrwlayer.c:7608 +msgid "Select waypoints to delete" +msgstr "" + +#: ../src/viktrwlayer.c:7691 +#, c-format +msgid "%ld waypoint deleted" +msgid_plural "%ld waypoints deleted" +msgstr[0] "" +msgstr[1] "" +msgstr[2] "" + +#: ../src/viktrwlayer.c:7697 +msgid "No duplicates found" +msgstr "" + +#: ../src/viktrwlayer.c:8028 +#, c-format +msgid "" +"A waypoint with the name \"%s\" already exists. Really rename to the same " +"name?" +msgstr "" + +#: ../src/viktrwlayer.c:8058 +#, c-format +msgid "" +"A track with the name \"%s\" already exists. Really rename to the same name?" +msgstr "" + +#: ../src/viktrwlayer.c:8095 +#, c-format +msgid "" +"A route with the name \"%s\" already exists. Really rename to the same name?" +msgstr "" + +#: ../src/viktrwlayer.c:8215 ../src/viktrwlayer.c:8602 +msgid "_Goto" +msgstr "" + +#: ../src/viktrwlayer.c:8226 +msgid "_Visit Geocache Webpage" +msgstr "" + +#: ../src/viktrwlayer.c:8235 +msgid "Geotag multiple images against this waypoint" +msgstr "" + +#: ../src/viktrwlayer.c:8245 ../src/viktrwlayer_waypointlist.c:352 +msgid "_Show Picture..." +msgstr "" + +#: ../src/viktrwlayer.c:8253 +msgid "Update Geotag on _Image" +msgstr "" + +#: ../src/viktrwlayer.c:8259 +msgid "_Update" +msgstr "" + +#: ../src/viktrwlayer.c:8264 +msgid "Update and _Keep File Timestamp" +msgstr "" + +#: ../src/viktrwlayer.c:8276 +msgid "Visit _Webpage" +msgstr "" + +#: ../src/viktrwlayer.c:8306 +msgid "_New Waypoint..." +msgstr "" + +#: ../src/viktrwlayer.c:8315 +msgid "_View All Waypoints" +msgstr "" + +#: ../src/viktrwlayer.c:8327 +msgid "Delete _All Waypoints" +msgstr "" + +#: ../src/viktrwlayer.c:8333 +msgid "_Delete Waypoints From Selection..." +msgstr "" + +#: ../src/viktrwlayer.c:8351 +msgid "_Show All Waypoints" +msgstr "" + +#: ../src/viktrwlayer.c:8357 +msgid "_Hide All Waypoints" +msgstr "" + +#: ../src/viktrwlayer.c:8369 +msgid "_List Waypoints..." +msgstr "" + +#: ../src/viktrwlayer.c:8390 +msgid "_View All Tracks" +msgstr "" + +#: ../src/viktrwlayer.c:8396 +msgid "_New Track" +msgstr "" + +#: ../src/viktrwlayer.c:8404 +msgid "Delete _All Tracks" +msgstr "" + +#: ../src/viktrwlayer.c:8410 +msgid "_Delete Tracks From Selection..." +msgstr "" + +#: ../src/viktrwlayer.c:8422 +msgid "_Show All Tracks" +msgstr "" + +#: ../src/viktrwlayer.c:8428 +msgid "_Hide All Tracks" +msgstr "" + +#: ../src/viktrwlayer.c:8439 +msgid "_List Tracks..." +msgstr "" + +#: ../src/viktrwlayer.c:8467 +msgid "_View All Routes" +msgstr "" + +#: ../src/viktrwlayer.c:8473 +msgid "_New Route" +msgstr "" + +#: ../src/viktrwlayer.c:8499 +msgid "_Show All Routes" +msgstr "" + +#: ../src/viktrwlayer.c:8505 +msgid "_Hide All Routes" +msgstr "" + +#: ../src/viktrwlayer.c:8516 +msgid "_List Routes..." +msgstr "" + +#: ../src/viktrwlayer.c:8587 +msgid "_View Track" +msgstr "" + +#: ../src/viktrwlayer.c:8589 +msgid "_View Route" +msgstr "" + +#: ../src/viktrwlayer.c:8608 +msgid "_Startpoint" +msgstr "" + +#: ../src/viktrwlayer.c:8614 +msgid "\"_Center\"" +msgstr "" + +#: ../src/viktrwlayer.c:8620 +msgid "_Endpoint" +msgstr "" + +#: ../src/viktrwlayer.c:8626 +msgid "_Highest Altitude" +msgstr "" + +#: ../src/viktrwlayer.c:8632 +msgid "_Lowest Altitude" +msgstr "" + +#: ../src/viktrwlayer.c:8640 +msgid "_Maximum Speed" +msgstr "" + +#: ../src/viktrwlayer.c:8646 +msgid "_Date" +msgstr "" + +#: ../src/viktrwlayer.c:8655 +msgid "Co_mbine" +msgstr "" + +#: ../src/viktrwlayer.c:8663 +msgid "_Merge By Time..." +msgstr "" + +#: ../src/viktrwlayer.c:8668 +msgid "Merge _Segments" +msgstr "" + +#: ../src/viktrwlayer.c:8675 +msgid "Merge _With Other Tracks..." +msgstr "" + +#: ../src/viktrwlayer.c:8682 +msgid "_Append Track..." +msgstr "" + +#: ../src/viktrwlayer.c:8684 +msgid "_Append Route..." +msgstr "" + +#: ../src/viktrwlayer.c:8690 +msgid "Append _Route..." +msgstr "" + +#: ../src/viktrwlayer.c:8692 +msgid "Append _Track..." +msgstr "" + +#: ../src/viktrwlayer.c:8699 +msgid "_Split" +msgstr "" + +#: ../src/viktrwlayer.c:8707 +msgid "_Split By Time..." +msgstr "" + +#. ATM always enable this entry - don't want to have to analyse the track before displaying the menu - to keep the menu speedy +#: ../src/viktrwlayer.c:8713 +msgid "Split Se_gments" +msgstr "" + +#: ../src/viktrwlayer.c:8719 +msgid "Split By _Number of Points..." +msgstr "" + +#: ../src/viktrwlayer.c:8724 +msgid "Split at _Trackpoint" +msgstr "" + +#: ../src/viktrwlayer.c:8732 +msgid "_Insert Points" +msgstr "" + +#: ../src/viktrwlayer.c:8738 +msgid "Insert Point _Before Selected Point" +msgstr "" + +#: ../src/viktrwlayer.c:8745 +msgid "Insert Point _After Selected Point" +msgstr "" + +#: ../src/viktrwlayer.c:8754 +msgid "Delete Poi_nts" +msgstr "" + +#: ../src/viktrwlayer.c:8760 +msgid "Delete _Selected Point" +msgstr "" + +#: ../src/viktrwlayer.c:8768 +msgid "Delete Points With The Same _Position" +msgstr "" + +#: ../src/viktrwlayer.c:8773 +msgid "Delete Points With The Same _Time" +msgstr "" + +#: ../src/viktrwlayer.c:8780 ../src/viktrwlayer.c:9029 +msgid "_Transform" +msgstr "" + +#: ../src/viktrwlayer.c:8788 ../src/viktrwlayer.c:9037 +msgid "_Apply DEM Data" +msgstr "" + +#: ../src/viktrwlayer.c:8793 ../src/viktrwlayer.c:9042 +msgid "_Overwrite" +msgstr "" + +#: ../src/viktrwlayer.c:8796 ../src/viktrwlayer.c:9045 +msgid "Overwrite any existing elevation values with DEM values" +msgstr "" + +#: ../src/viktrwlayer.c:8799 ../src/viktrwlayer.c:9048 +msgid "_Keep Existing" +msgstr "" + +#: ../src/viktrwlayer.c:8802 ../src/viktrwlayer.c:9051 +msgid "Keep existing elevation values, only attempt for missing values" +msgstr "" + +#: ../src/viktrwlayer.c:8807 +msgid "_Smooth Missing Elevation Data" +msgstr "" + +#: ../src/viktrwlayer.c:8812 +msgid "_Interpolated" +msgstr "" + +#: ../src/viktrwlayer.c:8815 +msgid "" +"Interpolate between known elevation values to derive values for the missing " +"elevations" +msgstr "" + +#: ../src/viktrwlayer.c:8818 +msgid "_Flat" +msgstr "" + +#: ../src/viktrwlayer.c:8821 +msgid "Set unknown elevation values to the last known value" +msgstr "" + +#: ../src/viktrwlayer.c:8825 +msgid "C_onvert to a Route" +msgstr "" + +#: ../src/viktrwlayer.c:8827 +msgid "C_onvert to a Track" +msgstr "" + +#: ../src/viktrwlayer.c:8835 +msgid "_Anonymize Times" +msgstr "" + +#: ../src/viktrwlayer.c:8838 +msgid "Shift timestamps to a relative offset from 1901-01-01" +msgstr "" + +#: ../src/viktrwlayer.c:8841 +msgid "_Interpolate Times" +msgstr "" + +#: ../src/viktrwlayer.c:8844 +msgid "" +"Reset trackpoint timestamps between the first and last points such that " +"track is traveled at equal speed" +msgstr "" + +#: ../src/viktrwlayer.c:8849 +msgid "_Reverse Track" +msgstr "" + +#: ../src/viktrwlayer.c:8851 +msgid "_Reverse Route" +msgstr "" + +#: ../src/viktrwlayer.c:8858 +msgid "Refine Route..." +msgstr "" + +#: ../src/viktrwlayer.c:8868 +msgid "Down_load Maps Along Track..." +msgstr "" + +#: ../src/viktrwlayer.c:8870 +msgid "Down_load Maps Along Route..." +msgstr "" + +#: ../src/viktrwlayer.c:8878 +msgid "_Export Track as GPX..." +msgstr "" + +#: ../src/viktrwlayer.c:8880 +msgid "_Export Route as GPX..." +msgstr "" + +#: ../src/viktrwlayer.c:8887 +msgid "E_xtend Track End" +msgstr "" + +#: ../src/viktrwlayer.c:8889 +msgid "E_xtend Route End" +msgstr "" + +#: ../src/viktrwlayer.c:8896 +msgid "Extend _Using Route Finder" +msgstr "" + +#: ../src/viktrwlayer.c:8911 +msgid "_Upload to GPS..." +msgstr "" + +#: ../src/viktrwlayer.c:8926 +msgid "_Diary" +msgstr "" + +#: ../src/viktrwlayer.c:8930 +msgid "Open diary program at this date" +msgstr "" + +#: ../src/viktrwlayer.c:8935 +msgid "_Astronomy" +msgstr "" + +#: ../src/viktrwlayer.c:8938 +msgid "Open astronomy program at this date and location" +msgstr "" + +#: ../src/viktrwlayer.c:8962 +msgid "_View Google Directions" +msgstr "" + +#: ../src/viktrwlayer.c:8984 +msgid "Use with _Filter" +msgstr "" + +#: ../src/viktrwlayer.c:9018 +msgid "_Edit Trackpoint" +msgstr "" + +#: ../src/viktrwlayer.c:10116 +#, c-format +msgid " - Gain %dm:Loss %dm" +msgstr "" + +#: ../src/viktrwlayer.c:10118 +#, c-format +msgid " - Gain %dft:Loss %dft" +msgstr "" + +#: ../src/viktrwlayer.c:10123 +#, c-format +msgid " - Bearing %3.1f° - Step %s" +msgstr "" + +#: ../src/viktrwlayer.c:10232 +#, c-format +msgid "Querying %s for route between (%.3f, %.3f) and (%.3f, %.3f)." +msgstr "" + +#: ../src/viktrwlayer.c:10248 +#, c-format +msgid "%s returned route between (%.3f, %.3f) and (%.3f, %.3f)." +msgstr "" + +#: ../src/viktrwlayer.c:10251 +#, c-format +msgid "Error getting route from %s." +msgstr "" + +#: ../src/viktrwlayer.c:11070 +#, c-format +msgid "Creating %d Image Thumbnails..." +msgstr "" + +#: ../src/viktrwlayer.c:11560 +msgid "No map layer in use. Create one first" +msgstr "" + +#: ../src/viktrwlayer.c:11679 +#, c-format +msgid "%s: Track List" +msgstr "" + +#: ../src/viktrwlayer.c:11681 +#, c-format +msgid "%s: Route List" +msgstr "" + +#: ../src/viktrwlayer.c:11734 +#, c-format +msgid "" +"Could not write external layer %s to %s, please fix and save before exiting " +"or data will be lost" +msgstr "" + +#: ../src/viktrwlayer.c:11782 +#, c-format +msgid "WARNING: issues encountered loading external layer %s from %s" +msgstr "" + +#: ../src/viktrwlayer_export.c:47 +msgid "Auto Device GPX Simplify:" +msgstr "" + +#: ../src/viktrwlayer_export.c:48 +msgid "" +"GPX saves to certain devices will be simplified for device compatibility." +msgstr "" + +#: ../src/viktrwlayer_export.c:125 +#, c-format +msgid "Export of GPX file simplified using point limit: %d" +msgstr "" + +#: ../src/viktrwlayer_export.c:206 ../src/viktrwlayer_export.c:323 +#: ../src/vikwindow.c:3694 +msgid "The filename you requested could not be opened for writing." +msgstr "" + +#: ../src/viktrwlayer_export.c:226 +#, c-format +msgid "Could not launch %s." +msgstr "" + +#: ../src/viktrwlayer_export.c:234 +msgid "Could not create temporary file for export." +msgstr "" + +#: ../src/viktrwlayer_export.c:268 +msgid "File format:" +msgstr "" + +#: ../src/viktrwlayer_export.c:276 +msgid "Select the file format." +msgstr "" + +#: ../src/viktrwlayer_export.c:281 +msgid "" +"Select the information to process.\n" +"Warning: the behavior of these switches is highly dependent of the file " +"format selected.\n" +"Please, refer to GPSbabel if unsure." +msgstr "" + +#: ../src/viktrwlayer_export.c:308 +msgid "You did not select a valid file format." +msgstr "" + +#: ../src/viktrwlayer_propwin.c:915 ../src/viktrwlayer_propwin.c:3381 +#: ../src/viktrwlayer_propwin.c:3417 ../src/viktrwlayer_propwin.c:3457 +#: ../src/viktrwlayer_propwin.c:3509 ../src/viktrwlayer_propwin.c:3527 +#: ../src/viktrwlayer_propwin.c:3600 ../src/viktrwlayer_propwin.c:3601 +#: ../src/viktrwlayer_propwin.c:3602 ../src/viktrwlayer_propwin.c:3611 +#: ../src/viktrwlayer_propwin.c:3612 ../src/viktrwlayer_propwin.c:3629 +#: ../src/viktrwlayer_propwin.c:3630 ../src/viktrwlayer_propwin.c:3644 +#: ../src/viktrwlayer_propwin.c:3645 ../src/viktrwlayer_propwin.c:3646 +#: ../src/viktrwlayer_propwin.c:3660 ../src/viktrwlayer_propwin.c:3661 +#: ../src/viktrwlayer_propwin.c:3662 ../src/viktrwlayer_propwin.c:3676 +#: ../src/viktrwlayer_propwin.c:3677 ../src/viktrwlayer_propwin.c:3678 +#: ../src/viktrwlayer_propwin.c:3695 ../src/viktrwlayer_propwin.c:3696 +#: ../src/viktrwlayer_analysis.c:293 +#, c-format +msgid "No Data" +msgstr "" + +#: ../src/viktrwlayer_propwin.c:960 ../src/viktrwlayer_propwin.c:1245 +#, c-format +msgid "%.1f kph" +msgstr "" + +#: ../src/viktrwlayer_propwin.c:963 ../src/viktrwlayer_propwin.c:1248 +#: ../src/viktrwlayer_analysis.c:352 +#, c-format +msgid "%.1f mph" +msgstr "" + +#: ../src/viktrwlayer_propwin.c:966 ../src/viktrwlayer_propwin.c:1251 +#, c-format +msgid "%.1f knots" +msgstr "" + +#: ../src/viktrwlayer_propwin.c:969 ../src/viktrwlayer_propwin.c:1254 +#, fuzzy, c-format +msgid "%.1f s/km" +msgstr "%.1f км" + +#: ../src/viktrwlayer_propwin.c:972 ../src/viktrwlayer_propwin.c:1257 +#: ../src/viktrwlayer_analysis.c:389 ../src/viktrwlayer_analysis.c:392 +#, fuzzy, c-format +msgid "%.1f min/km" +msgstr "%.1f км" + +#: ../src/viktrwlayer_propwin.c:975 ../src/viktrwlayer_propwin.c:1260 +#, fuzzy, c-format +msgid "%.1f sec/mi" +msgstr "%.1f км" + +#: ../src/viktrwlayer_propwin.c:978 ../src/viktrwlayer_propwin.c:1263 +#: ../src/viktrwlayer_analysis.c:409 ../src/viktrwlayer_analysis.c:412 +#, fuzzy, c-format +msgid "%.1f min/mi" +msgstr "%.1f км" + +#. VIK_UNITS_SPEED_METRES_PER_SECOND: +#: ../src/viktrwlayer_propwin.c:982 ../src/viktrwlayer_propwin.c:1267 +#, c-format +msgid "%.1f m/s" +msgstr "" + +#. Minutes +#: ../src/viktrwlayer_propwin.c:1411 +msgid "mins" +msgstr "" + +#. Hours +#: ../src/viktrwlayer_propwin.c:1418 +msgid "h" +msgstr "" + +#. Days +#: ../src/viktrwlayer_propwin.c:1424 +msgid "d" +msgstr "" + +#. Weeks +#: ../src/viktrwlayer_propwin.c:1429 +msgid "w" +msgstr "" + +#. 'Months' +#: ../src/viktrwlayer_propwin.c:1433 +msgid "M" +msgstr "" + +#: ../src/viktrwlayer_propwin.c:2051 ../src/viktrwlayer_analysis.c:303 +#, c-format +msgid "%.1f miles" +msgstr "" + +#: ../src/viktrwlayer_propwin.c:2054 ../src/viktrwlayer_analysis.c:306 +#, c-format +msgid "%.1f NM" +msgstr "" + +#. VIK_UNITS_DISTANCE_KILOMETRES +#: ../src/viktrwlayer_propwin.c:2057 ../src/viktrwlayer_analysis.c:310 +#, c-format +msgid "%.1f km" +msgstr "%.1f км" + +#: ../src/viktrwlayer_propwin.c:3083 +msgid "Failed spliting track. Track unchanged" +msgstr "" + +#: ../src/viktrwlayer_propwin.c:3234 ../src/viktrwlayer_propwin.c:3744 +#, c-format +msgid "%s - Track Properties" +msgstr "" + +#: ../src/viktrwlayer_propwin.c:3239 +msgid "Split at _Marker" +msgstr "" + +#: ../src/viktrwlayer_propwin.c:3240 +msgid "Split _Segments" +msgstr "" + +#: ../src/viktrwlayer_propwin.c:3241 +msgid "_Reverse" +msgstr "" + +#: ../src/viktrwlayer_propwin.c:3242 +msgid "_Delete Dupl." +msgstr "" + +#: ../src/viktrwlayer_propwin.c:3269 +msgid "Comment:" +msgstr "" + +#: ../src/viktrwlayer_propwin.c:3270 +msgid "Description:" +msgstr "" + +#: ../src/viktrwlayer_propwin.c:3271 +msgid "Source:" +msgstr "" + +#: ../src/viktrwlayer_propwin.c:3272 +msgid "Type:" +msgstr "" + +#: ../src/viktrwlayer_propwin.c:3273 +msgid "Color:" +msgstr "" + +#: ../src/viktrwlayer_propwin.c:3274 +msgid "Draw Name:" +msgstr "" + +#: ../src/viktrwlayer_propwin.c:3275 +msgid "Distance Labels:" +msgstr "" + +#: ../src/viktrwlayer_propwin.c:3278 +msgid "Track Length:" +msgstr "" + +#: ../src/viktrwlayer_propwin.c:3279 +msgid "Trackpoints:" +msgstr "" + +#: ../src/viktrwlayer_propwin.c:3280 +msgid "Segments:" +msgstr "" + +#: ../src/viktrwlayer_propwin.c:3281 +msgid "Duplicate Points:" +msgstr "" + +#: ../src/viktrwlayer_propwin.c:3282 +msgid "Max Speed:" +msgstr "" + +#: ../src/viktrwlayer_propwin.c:3283 +msgid "Avg. Speed:" +msgstr "" + +#: ../src/viktrwlayer_propwin.c:3284 +msgid "Moving Avg. Speed:" +msgstr "" + +#: ../src/viktrwlayer_propwin.c:3285 +msgid "Avg. Dist. Between TPs:" +msgstr "" + +#: ../src/viktrwlayer_propwin.c:3286 +msgid "Elevation Range:" +msgstr "" + +#: ../src/viktrwlayer_propwin.c:3287 +msgid "Total Elevation Gain/Loss:" +msgstr "" + +#: ../src/viktrwlayer_propwin.c:3288 +msgid "Start:" +msgstr "" + +#: ../src/viktrwlayer_propwin.c:3289 +msgid "End:" +msgstr "" + +#: ../src/viktrwlayer_propwin.c:3290 +msgid "Duration:" +msgstr "" + +#: ../src/viktrwlayer_propwin.c:3320 +msgid "Centre" +msgstr "" + +#: ../src/viktrwlayer_propwin.c:3321 +msgid "Start only" +msgstr "" + +#: ../src/viktrwlayer_propwin.c:3322 +msgid "End only" +msgstr "" + +#: ../src/viktrwlayer_propwin.c:3323 +msgid "Start and End" +msgstr "" + +#: ../src/viktrwlayer_propwin.c:3324 +msgid "Centre, Start and End" +msgstr "" + +#: ../src/viktrwlayer_propwin.c:3336 +msgid "Maximum number of distance labels to be shown" +msgstr "" + +#: ../src/viktrwlayer_propwin.c:3340 +msgid "Properties" +msgstr "" + +#: ../src/viktrwlayer_propwin.c:3584 +#, c-format +msgid "%d minutes - %d minutes moving" +msgstr "" + +#: ../src/viktrwlayer_propwin.c:3596 +#, c-format +msgid "%s total - %s in segments" +msgstr "" + +#: ../src/viktrwlayer_propwin.c:3607 ../src/viktrwlayer_analysis.c:622 +msgid "Statistics" +msgstr "" + +#: ../src/viktrwlayer_propwin.c:3613 ../src/viktrwlayer_propwin.c:3680 +msgid "Show D_EM" +msgstr "" + +#: ../src/viktrwlayer_propwin.c:3615 ../src/viktrwlayer_propwin.c:3631 +#: ../src/viktrwlayer_propwin.c:3647 ../src/viktrwlayer_propwin.c:3697 +msgid "Show _GPS Speed" +msgstr "" + +#: ../src/viktrwlayer_propwin.c:3617 ../src/viktrwlayer_propwin.c:3633 +#: ../src/viktrwlayer_propwin.c:3665 ../src/viktrwlayer_propwin.c:3699 +msgid "Track Distance:" +msgstr "" + +#: ../src/viktrwlayer_propwin.c:3618 ../src/viktrwlayer_propwin.c:3684 +msgid "Track Height:" +msgstr "" + +#: ../src/viktrwlayer_propwin.c:3624 +msgid "Elevation-distance" +msgstr "" + +#: ../src/viktrwlayer_propwin.c:3634 +msgid "Track Gradient:" +msgstr "" + +#: ../src/viktrwlayer_propwin.c:3639 +msgid "Gradient-distance" +msgstr "" + +#: ../src/viktrwlayer_propwin.c:3649 ../src/viktrwlayer_propwin.c:3666 +#: ../src/viktrwlayer_propwin.c:3683 +msgid "Track Time:" +msgstr "" + +#: ../src/viktrwlayer_propwin.c:3650 ../src/viktrwlayer_propwin.c:3700 +msgid "Track Speed:" +msgstr "" + +#: ../src/viktrwlayer_propwin.c:3651 ../src/viktrwlayer_propwin.c:3667 +#: ../src/viktrwlayer_propwin.c:3685 +msgid "Time/Date:" +msgstr "" + +#: ../src/viktrwlayer_propwin.c:3655 +msgid "Speed-time" +msgstr "" + +#: ../src/viktrwlayer_propwin.c:3663 ../src/viktrwlayer_propwin.c:3679 +msgid "Show S_peed" +msgstr "" + +#: ../src/viktrwlayer_propwin.c:3671 +msgid "Distance-time" +msgstr "" + +#: ../src/viktrwlayer_propwin.c:3690 +msgid "Elevation-time" +msgstr "" + +#: ../src/viktrwlayer_propwin.c:3705 +msgid "Speed-distance" +msgstr "" + +#: ../src/viktrwlayer_tpwin.c:190 ../src/viktrwlayer_wpwin.c:66 +msgid "Date/Time Edit" +msgstr "" + +#: ../src/viktrwlayer_tpwin.c:242 +msgid "Name:" +msgstr "" + +#: ../src/viktrwlayer_tpwin.c:243 +msgid "Latitude:" +msgstr "" + +#: ../src/viktrwlayer_tpwin.c:244 +msgid "Longitude:" +msgstr "" + +#: ../src/viktrwlayer_tpwin.c:245 +msgid "Altitude:" +msgstr "" + +#: ../src/viktrwlayer_tpwin.c:246 +msgid "Course:" +msgstr "" + +#: ../src/viktrwlayer_tpwin.c:247 +msgid "Timestamp:" +msgstr "" + +#: ../src/viktrwlayer_tpwin.c:248 +msgid "Time:" +msgstr "" + +#: ../src/viktrwlayer_tpwin.c:249 +msgid "Distance Difference:" +msgstr "" + +#: ../src/viktrwlayer_tpwin.c:250 +msgid "Time Difference:" +msgstr "" + +#: ../src/viktrwlayer_tpwin.c:251 +msgid "\"Speed\" Between:" +msgstr "" + +#: ../src/viktrwlayer_tpwin.c:252 +msgid "Speed:" +msgstr "" + +#: ../src/viktrwlayer_tpwin.c:253 +msgid "VDOP:" +msgstr "" + +#: ../src/viktrwlayer_tpwin.c:254 +msgid "HDOP:" +msgstr "" + +#: ../src/viktrwlayer_tpwin.c:255 +msgid "PDOP:" +msgstr "" + +#: ../src/viktrwlayer_tpwin.c:256 +msgid "SAT/FIX:" +msgstr "" + +#: ../src/viktrwlayer_tpwin.c:263 ../src/viktrwlayer_tpwin.c:408 +#: ../src/viktrwlayer_tpwin.c:622 +msgid "Trackpoint" +msgstr "" + +#: ../src/viktrwlayer_tpwin.c:266 +msgid "_Insert After" +msgstr "" + +#: ../src/viktrwlayer_tpwin.c:268 +msgid "Split Here" +msgstr "" + +#: ../src/viktrwlayer_tracklist.c:262 ../src/viktrwlayer_waypointlist.c:306 +msgid "_Copy Data" +msgstr "" + +#. +#. item = gtk_image_menu_item_new_with_mnemonic ( _("_Select") ); +#. gtk_image_menu_item_set_image ( (GtkImageMenuItem*)item, gtk_image_new_from_stock (GTK_STOCK_FIND, GTK_ICON_SIZE_MENU) ); +#. g_signal_connect_swapped ( G_OBJECT(item), "activate", G_CALLBACK(trw_layer_track_select), values ); +#. gtk_menu_shell_append (GTK_MENU_SHELL (menu), item); +#. gtk_widget_show ( item ); +#. +#. ATM view auto selects, so don't bother with separate select menu entry +#. +#. item = gtk_image_menu_item_new_with_mnemonic ( _("_Select") ); +#. gtk_image_menu_item_set_image ( (GtkImageMenuItem*)item, gtk_image_new_from_stock (GTK_STOCK_FIND, GTK_ICON_SIZE_MENU) ); +#. g_signal_connect_swapped ( G_OBJECT(item), "activate", G_CALLBACK(trw_layer_waypoint_select), values ); +#. gtk_menu_shell_append (GTK_MENU_SHELL (menu), item); +#. gtk_widget_show ( item ); +#. +#. AUTO SELECT NOT TRUE YET... +#. ATM view auto selects, so don't bother with separate select menu entry +#: ../src/viktrwlayer_tracklist.c:290 ../src/viktrwlayer_waypointlist.c:341 +#: ../src/vikwindow.c:4816 +msgid "_View" +msgstr "_Вигляд" + +#. Insert column for the layer name when viewing multi layers +#: ../src/viktrwlayer_tracklist.c:613 ../src/viktrwlayer_waypointlist.c:609 +msgid "Layer" +msgstr "" + +#: ../src/viktrwlayer_tracklist.c:627 ../src/viktrwlayer_waypointlist.c:624 +msgid "Date" +msgstr "" + +#: ../src/viktrwlayer_tracklist.c:631 ../src/viktrwlayer_waypointlist.c:628 +msgid "Visible" +msgstr "" + +#: ../src/viktrwlayer_tracklist.c:639 +msgid "" +"Distance\n" +"(miles)" +msgstr "" + +#: ../src/viktrwlayer_tracklist.c:642 +msgid "" +"Distance\n" +"(NM)" +msgstr "" + +#: ../src/viktrwlayer_tracklist.c:645 +msgid "" +"Distance\n" +"(km)" +msgstr "" + +#: ../src/viktrwlayer_tracklist.c:651 +msgid "" +"Length\n" +"(minutes)" +msgstr "" + +#: ../src/viktrwlayer_tracklist.c:660 ../src/vikutils.c:93 +msgid "sec/mi" +msgstr "" + +#: ../src/viktrwlayer_tracklist.c:666 +#, c-format +msgid "" +"Av. Speed\n" +"(%s)" +msgstr "" + +#. Apply own formatting of the data +#: ../src/viktrwlayer_tracklist.c:671 +#, c-format +msgid "" +"Max Speed\n" +"(%s)" +msgstr "" + +#: ../src/viktrwlayer_tracklist.c:679 ../src/viktrwlayer_waypointlist.c:637 +msgid "" +"Max Height\n" +"(Feet)" +msgstr "" + +#: ../src/viktrwlayer_tracklist.c:681 ../src/viktrwlayer_waypointlist.c:639 +msgid "" +"Max Height\n" +"(Metres)" +msgstr "" + +#: ../src/viktrwlayer_waypointlist.c:312 +msgid "Copy Data (with _positions)" +msgstr "" + +#: ../src/viktrwlayer_waypointlist.c:633 +msgid "Comment" +msgstr "" + +#: ../src/viktrwlayer_waypointlist.c:643 +msgid "Symbol" +msgstr "" + +#: ../src/viktrwlayer_wpwin.c:93 ../src/viktrwlayer_wpwin.c:302 +msgid "True" +msgstr "" + +#: ../src/viktrwlayer_wpwin.c:122 +msgid "Waypoint Properties" +msgstr "" + +#: ../src/viktrwlayer_wpwin.c:164 +msgid "Name:" +msgstr "" + +#: ../src/viktrwlayer_wpwin.c:181 +msgid "Altitude:" +msgstr "" + +#: ../src/viktrwlayer_wpwin.c:186 ../src/viktrwlayer_wpwin.c:188 +msgid "Comment:" +msgstr "" + +#: ../src/viktrwlayer_wpwin.c:202 +msgid "Source:" +msgstr "" + +#: ../src/viktrwlayer_wpwin.c:212 +msgid "Image:" +msgstr "" + +#: ../src/viktrwlayer_wpwin.c:217 +msgid "Symbol:" +msgstr "" + +#: ../src/viktrwlayer_wpwin.c:226 +msgid "(none)" +msgstr "" + +#. Geotag Info [readonly] +#: ../src/viktrwlayer_wpwin.c:272 +msgid "Has Geotag" +msgstr "" + +#: ../src/viktrwlayer_wpwin.c:279 +msgid "Consistent Position" +msgstr "" + +#. ATM the direction value box is always shown, even when there is no information. +#. It would be nice to be able to hide it until the 'Add' has been performed, +#. however I've not been able to achieve this. +#. Thus simply sensistizing it instead. +#: ../src/viktrwlayer_wpwin.c:292 +#, fuzzy +msgid "Image Direction:" +msgstr "Переглядач зображень:" + +#: ../src/viktrwlayer_wpwin.c:300 +msgid "Magnetic" +msgstr "" + +#: ../src/viktrwlayer_wpwin.c:320 +msgid "Time:" +msgstr "" + +#. TODO: other checks (isalpha or whatever ) +#: ../src/viktrwlayer_wpwin.c:386 +msgid "Please enter a name for the waypoint." +msgstr "" + +#: ../src/viktrwlayer_geotag.c:320 ../src/viktrwlayer_geotag.c:460 +#, c-format +msgid "Failed updating EXIF on %s" +msgstr "" + +#: ../src/viktrwlayer_geotag.c:562 +#, c-format +msgid "Geotagging %d Images..." +msgstr "" + +#: ../src/viktrwlayer_geotag.c:630 +msgid "Geotag Images" +msgstr "" + +#: ../src/viktrwlayer_geotag.c:640 +msgid "Images" +msgstr "" + +#: ../src/viktrwlayer_geotag.c:645 +msgid "Overwrite Existing Waypoints:" +msgstr "" + +#: ../src/viktrwlayer_geotag.c:648 +msgid "Overwrite Existing GPS Information:" +msgstr "" + +#: ../src/viktrwlayer_geotag.c:650 +msgid "Keep File Modification Timestamp:" +msgstr "" + +#: ../src/viktrwlayer_geotag.c:684 +msgid "Create Waypoints:" +msgstr "" + +#: ../src/viktrwlayer_geotag.c:693 +msgid "Write EXIF:" +msgstr "" + +#: ../src/viktrwlayer_geotag.c:705 +msgid "Automatic Image Direction:" +msgstr "" + +#: ../src/viktrwlayer_geotag.c:707 +msgid "Set image direction based on a heading derived from the track" +msgstr "" + +#: ../src/viktrwlayer_geotag.c:710 +msgid "Interpolate Between Track Segments:" +msgstr "" + +#: ../src/viktrwlayer_geotag.c:715 +msgid "Image Time Offset (Seconds):" +msgstr "" + +#: ../src/viktrwlayer_geotag.c:718 +msgid "" +"The number of seconds to ADD to the photos time to make it match the GPS " +"data. Calculate this with (GPS - Photo). Can be negative or positive. Useful " +"to adjust times when a camera's timestamp was incorrect." +msgstr "" + +#: ../src/viktrwlayer_geotag.c:721 +msgid "Image Timezone:" +msgstr "" + +#: ../src/viktrwlayer_geotag.c:724 +msgid "" +"The timezone that was used when the images were created. For example, if a " +"camera is set to AWST or +8:00 hours. Enter +8:00 here so that the correct " +"adjustment to the images' time can be made. GPS data is always in UTC." +msgstr "" + +#: ../src/viktrwlayer_geotag.c:728 +#, c-format +msgid "Using waypoint: %s" +msgstr "" + +#: ../src/viktrwlayer_geotag.c:742 +#, c-format +msgid "Using track: %s" +msgstr "" + +#: ../src/viktrwlayer_geotag.c:744 +#, c-format +msgid "Using all tracks in: %s" +msgstr "" + +#: ../src/viktrwlayer_analysis.c:214 +msgid "Number of Tracks" +msgstr "" + +#: ../src/viktrwlayer_analysis.c:215 +msgid "Date Range" +msgstr "" + +#: ../src/viktrwlayer_analysis.c:216 +msgid "Total Length" +msgstr "" + +#: ../src/viktrwlayer_analysis.c:217 +msgid "Average Length" +msgstr "" + +#: ../src/viktrwlayer_analysis.c:218 +msgid "Eddington number" +msgstr "" + +#. No.4: Extended display only +#: ../src/viktrwlayer_analysis.c:219 +msgid "Max Speed" +msgstr "" + +#: ../src/viktrwlayer_analysis.c:220 +msgid "Avg. Speed" +msgstr "" + +#: ../src/viktrwlayer_analysis.c:221 +msgid "Minimum Altitude" +msgstr "" + +#: ../src/viktrwlayer_analysis.c:222 +msgid "Maximum Altitude" +msgstr "" + +#: ../src/viktrwlayer_analysis.c:223 +msgid "Total Elevation Gain/Loss" +msgstr "" + +#: ../src/viktrwlayer_analysis.c:224 +msgid "Avg. Elevation Gain/Loss" +msgstr "" + +#: ../src/viktrwlayer_analysis.c:225 +msgid "Total Duration" +msgstr "" + +#: ../src/viktrwlayer_analysis.c:226 +msgid "Avg. Duration" +msgstr "" + +#: ../src/viktrwlayer_analysis.c:317 +#, c-format +msgid "%.2f miles" +msgstr "" + +#: ../src/viktrwlayer_analysis.c:320 +#, fuzzy, c-format +msgid "%.2f NM" +msgstr "%.2f км" + +#. VIK_UNITS_DISTANCE_KILOMETRES +#: ../src/viktrwlayer_analysis.c:324 +#, c-format +msgid "%.2f km" +msgstr "%.2f км" + +#: ../src/viktrwlayer_analysis.c:361 +#, c-format +msgid "%.2f m/s" +msgstr "" + +#: ../src/viktrwlayer_analysis.c:370 ../src/viktrwlayer_analysis.c:373 +#, c-format +msgid "%.2f knots" +msgstr "" + +#: ../src/viktrwlayer_analysis.c:379 ../src/viktrwlayer_analysis.c:382 +#, c-format +msgid "%d s/km" +msgstr "" + +#: ../src/viktrwlayer_analysis.c:399 ../src/viktrwlayer_analysis.c:402 +#, c-format +msgid "%d sec/mi" +msgstr "" + +#: ../src/viktrwlayer_analysis.c:420 ../src/viktrwlayer_analysis.c:423 +#, c-format +msgid "%.2f km/h" +msgstr "%.2f км/год" + +#: ../src/viktrwlayer_analysis.c:434 ../src/viktrwlayer_analysis.c:440 +#, c-format +msgid "%d feet" +msgstr "" + +#: ../src/viktrwlayer_analysis.c:445 ../src/viktrwlayer_analysis.c:447 +#, c-format +msgid "%d feet / %d feet" +msgstr "" + +#: ../src/viktrwlayer_analysis.c:452 ../src/viktrwlayer_analysis.c:458 +#, c-format +msgid "%d m" +msgstr "" + +#: ../src/viktrwlayer_analysis.c:463 ../src/viktrwlayer_analysis.c:465 +#, c-format +msgid "%d m / %d m" +msgstr "" + +#: ../src/viktrwlayer_analysis.c:477 +#, c-format +msgid "%d:%02d:%02d days:hrs:mins" +msgstr "" + +#: ../src/viktrwlayer_analysis.c:484 +#, c-format +msgid "%d:%02d hrs:mins" +msgstr "" + +#: ../src/viktrwlayer_analysis.c:658 +msgid "Include Invisible Items" +msgstr "" + +#: ../src/vikstatus.c:129 +msgid "Current number of background tasks. Click to see the background jobs." +msgstr "" + +#: ../src/vikstatus.c:134 +msgid "Current zoom level. Click to select a new one." +msgstr "" + +#: ../src/vikstatus.c:141 +msgid "Left click to clear the message. Right click to copy the message." +msgstr "" + +#: ../src/vikutils.c:108 +msgid "GPSD" +msgstr "" + +#. GPS Preamble +#: ../src/vikutils.c:109 +msgid "Trkpt" +msgstr "" + +#: ../src/vikutils.c:160 +#, c-format +msgid "%sSpeed%s %.1f%s" +msgstr "" + +#. Go for 2dp as expect low values for vertical speeds +#: ../src/vikutils.c:214 +#, c-format +msgid "%sClimb%s %.2f%s" +msgstr "" + +#: ../src/vikutils.c:223 +#, c-format +msgid "%sAlt %dfeet" +msgstr "" + +#. VIK_UNITS_HEIGHT_METRES: +#: ../src/vikutils.c:227 +#, c-format +msgid "%sAlt %dm" +msgstr "" + +#: ../src/vikutils.c:235 +#, c-format +msgid "%sCourse %03d°" +msgstr "" + +#: ../src/vikutils.c:249 +msgid "yards" +msgstr "" + +#. VIK_UNITS_DISTANCE_KILOMETRES: +#: ../src/vikutils.c:253 +msgid "m" +msgstr "" + +#: ../src/vikutils.c:257 +#, c-format +msgid "%sDistance diff %d%s" +msgstr "" + +#: ../src/vikutils.c:272 +#, c-format +msgid "%sTime %s" +msgstr "" + +#: ../src/vikutils.c:281 +#, c-format +msgid "%sTime diff %lds" +msgstr "" + +#: ../src/vikutils.c:287 +#, c-format +msgid "%sNo. of Sats %d" +msgstr "" + +#: ../src/vikutils.c:312 +#, c-format +msgid "%sTo End %.2f%s" +msgstr "" + +#: ../src/vikutils.c:339 +#, c-format +msgid "%sDistance along %.2f%s" +msgstr "" + +#: ../src/vikutils.c:359 +#, c-format +msgid "%sTrack: %s" +msgstr "" + +#: ../src/vikutils.c:396 +#, c-format +msgid "" +"There is a newer version of Viking available: %s\n" +"\n" +"Do you wish to go to Viking's website now?" +msgstr "" + +#: ../src/vikutils.c:526 +msgid "" +"This appears to be Viking's very first run.\n" +"\n" +"Do you wish to enable automatic internet features?\n" +"\n" +"Individual settings can be controlled in the Preferences." +msgstr "" + +#: ../src/vikwaypoint.c:37 +msgid "Waypoint" +msgstr "" + +#: ../src/vikwebtool_datasource.c:352 +msgid "Search Term" +msgstr "" + +#. TODO get rid of this as this is unnecessary duplication... +#: ../src/vikwindow.c:258 +msgid "Pan" +msgstr "Панорамування" + +#: ../src/vikwindow.c:258 +msgid "Zoom" +msgstr "" + +#: ../src/vikwindow.c:258 +msgid "Ruler" +msgstr "" + +#: ../src/vikwindow.c:258 +msgid "Select" +msgstr "" + +#: ../src/vikwindow.c:368 +msgid "This is Viking " +msgstr "" + +#: ../src/vikwindow.c:457 +msgid "Location lookup aborted" +msgstr "" + +#: ../src/vikwindow.c:477 +#, c-format +msgid "Location found: %s" +msgstr "" + +#: ../src/vikwindow.c:486 +msgid "Unable to determine location" +msgstr "" + +#: ../src/vikwindow.c:495 +msgid "Determining location" +msgstr "" + +#: ../src/vikwindow.c:525 +#, c-format +msgid "Location found via geoclue" +msgstr "" + +#: ../src/vikwindow.c:546 +msgid "Default Map" +msgstr "" + +#: ../src/vikwindow.c:557 ../src/vikwindow.c:3938 +msgid "Trying to determine location..." +msgstr "" + +#. Create tooltip +#: ../src/vikwindow.c:723 +msgid "Select zoom level" +msgstr "" + +#: ../src/vikwindow.c:1176 +#, c-format +msgid "" +"Do you want to save the changes you made to the document \"%s\"?\n" +"\n" +"Your changes will be lost if you don't save them." +msgstr "" + +#: ../src/vikwindow.c:1180 +msgid "Don't Save" +msgstr "" + +#: ../src/vikwindow.c:1268 +msgid "mpp" +msgstr "" + +#: ../src/vikwindow.c:1268 +msgid "pixelfact" +msgstr "" + +#: ../src/vikwindow.c:1467 +#, c-format +msgid "%s %s %dm" +msgstr "" + +#: ../src/vikwindow.c:1469 +#, c-format +msgid "%s %s %dft" +msgstr "" + +#: ../src/vikwindow.c:1472 +#, c-format +msgid "%s %s" +msgstr "" + +#: ../src/vikwindow.c:1929 +msgid "_Ruler" +msgstr "" + +#: ../src/vikwindow.c:1929 +msgid "Ruler Tool" +msgstr "" + +#: ../src/vikwindow.c:2204 ../src/vikwindow.c:4818 +msgid "_Zoom" +msgstr "" + +#: ../src/vikwindow.c:2204 +msgid "Zoom Tool" +msgstr "" + +#: ../src/vikwindow.c:2271 ../src/vikwindow.c:4819 +msgid "_Pan" +msgstr "" + +#: ../src/vikwindow.c:2271 +msgid "Pan Tool" +msgstr "" + +#: ../src/vikwindow.c:2425 +msgid "_Select" +msgstr "" + +#: ../src/vikwindow.c:2425 +msgid "Select Tool" +msgstr "" + +#: ../src/vikwindow.c:2615 +msgid "You must select a layer to show its properties." +msgstr "" + +#. No error to show, so unlikely this will get called +#: ../src/vikwindow.c:2629 +msgid "The help system is not available." +msgstr "" + +#. Main error path +#: ../src/vikwindow.c:2632 +#, c-format +msgid "" +"Help is not available because: %s.\n" +"Ensure a Mime Type ghelp handler program is installed (e.g. yelp)." +msgstr "" + +#: ../src/vikwindow.c:2865 +msgid "You must select a layer to delete." +msgstr "" + +#: ../src/vikwindow.c:3171 +msgid "Untitled" +msgstr "" + +#: ../src/vikwindow.c:3300 +#, c-format +msgid "Unable to add '%s' to the list of recently used documents" +msgstr "" + +#: ../src/vikwindow.c:3391 +msgid "The file you requested could not be opened." +msgstr "" + +#: ../src/vikwindow.c:3394 +msgid "" +"GPSBabel is required to load files of this type or GPSBabel encountered " +"problems." +msgstr "" + +#: ../src/vikwindow.c:3397 +#, c-format +msgid "Unable to load malformed GPX file %s" +msgstr "" + +#: ../src/vikwindow.c:3400 +#, c-format +msgid "Unsupported file type for %s" +msgstr "" + +#. Since we can process .vik files with issues just show a warning in the status bar +#. Not that a user can do much about it... or tells them what this issue is yet... +#: ../src/vikwindow.c:3406 +#, c-format +msgid "WARNING: issues encountered loading %s" +msgstr "" + +#: ../src/vikwindow.c:3489 +msgid "Please select a GPS data file to open. " +msgstr "" + +#: ../src/vikwindow.c:3508 +msgid "Google Earth" +msgstr "" + +#: ../src/vikwindow.c:3523 ../src/vikwindow.c:3646 ../src/viking.desktop.in.h:1 +msgid "Viking" +msgstr "" + +#: ../src/vikwindow.c:3594 ../src/vikwindow.c:4632 +msgid "Open File" +msgstr "" + +#: ../src/vikwindow.c:3630 +msgid "Save as Viking File." +msgstr "" + +#: ../src/vikwindow.c:3757 +#, c-format +msgid "Exporting to file: %s" +msgstr "" + +#. Confirm what happened. +#: ../src/vikwindow.c:3774 +#, c-format +msgid "Exported files: %d" +msgstr "" + +#: ../src/vikwindow.c:3786 +msgid "Nothing to Export!" +msgstr "" + +#: ../src/vikwindow.c:3790 +msgid "Export to directory" +msgstr "" + +#: ../src/vikwindow.c:3809 +msgid "Could not convert all files" +msgstr "" + +#: ../src/vikwindow.c:3851 +msgid "File not accessible" +msgstr "" + +#: ../src/vikwindow.c:3854 +msgid "No Viking File" +msgstr "" + +#: ../src/vikwindow.c:3998 +msgid "This layer has no configurable properties." +msgstr "" + +#: ../src/vikwindow.c:4080 +msgid "Are you sure you wish to delete all layers?" +msgstr "" + +#. Try harder... +#: ../src/vikwindow.c:4126 ../src/vikwindow.c:4132 +msgid "Generating image file..." +msgstr "" + +#: ../src/vikwindow.c:4154 +msgid "" +"Failed to generate internal image.\n" +"\n" +"Try creating a smaller image." +msgstr "" + +#: ../src/vikwindow.c:4175 +msgid "Image file generated." +msgstr "" + +#: ../src/vikwindow.c:4177 +msgid "Failed to generate image file." +msgstr "" + +#: ../src/vikwindow.c:4246 +#, c-format +msgid "Unable to write to file %s: %s" +msgstr "" + +#: ../src/vikwindow.c:4284 +msgid "" +"Viewable region outside allowable pixel size bounds for image. Clipping " +"width/height values." +msgstr "" + +#: ../src/vikwindow.c:4309 +#, c-format +msgid "Total area: %ldm x %ldm (%.3f sq. km)" +msgstr "" + +#: ../src/vikwindow.c:4312 +#, c-format +msgid "Total area: %ldm x %ldm (%.3f sq. miles)" +msgstr "" + +#: ../src/vikwindow.c:4315 +#, c-format +msgid "Total area: %ldm x %ldm (%.3f sq. NM)" +msgstr "" + +#. Single file +#: ../src/vikwindow.c:4343 +msgid "Save Image" +msgstr "" + +#: ../src/vikwindow.c:4364 ../src/vikwindow.c:4641 +msgid "KMZ" +msgstr "" + +#: ../src/vikwindow.c:4417 +msgid "You must be in UTM mode to use this feature" +msgstr "" + +#: ../src/vikwindow.c:4421 +msgid "Choose a directory to hold images" +msgstr "" + +#. todo: default for answers inside VikWindow or static (thruout instance) +#: ../src/vikwindow.c:4441 +msgid "Save to Image File" +msgstr "" + +#: ../src/vikwindow.c:4457 +msgid "Width (pixels):" +msgstr "" + +#: ../src/vikwindow.c:4459 +msgid "Height (pixels):" +msgstr "" + +#: ../src/vikwindow.c:4462 +msgid "" +"WARNING: USING LARGE IMAGES OVER 10000x10000\n" +"MAY CRASH THE PROGRAM!" +msgstr "" + +#: ../src/vikwindow.c:4464 +msgid "Zoom (meters per pixel):" +msgstr "" + +#: ../src/vikwindow.c:4480 +msgid "Area in current viewable window" +msgstr "" + +#: ../src/vikwindow.c:4490 +msgid "Save as PNG" +msgstr "" + +#: ../src/vikwindow.c:4491 +msgid "Save as JPEG" +msgstr "" + +#: ../src/vikwindow.c:4520 +msgid "East-west image tiles:" +msgstr "" + +#: ../src/vikwindow.c:4522 +msgid "North-south image tiles:" +msgstr "" + +#: ../src/vikwindow.c:4619 +msgid "This feature is not available in UTM mode" +msgstr "" + +#: ../src/vikwindow.c:4658 +#, c-format +msgid "Unable to import %s." +msgstr "" + +#: ../src/vikwindow.c:4749 +msgid "Choose a background color" +msgstr "" + +#: ../src/vikwindow.c:4765 +msgid "Choose a track highlight color" +msgstr "" + +#: ../src/vikwindow.c:4814 +msgid "_File" +msgstr "_Файл" + +#: ../src/vikwindow.c:4815 +msgid "_Edit" +msgstr "_Правка" + +#: ../src/vikwindow.c:4817 +msgid "_Show" +msgstr "" + +#: ../src/vikwindow.c:4820 +msgid "_Layers" +msgstr "_Шари" + +#: ../src/vikwindow.c:4821 +msgid "_Tools" +msgstr "_Інструменти" + +#: ../src/vikwindow.c:4822 +msgid "_Webtools" +msgstr "" + +#: ../src/vikwindow.c:4823 ../src/vikwindow.c:4893 +msgid "_Help" +msgstr "_Довідка" + +#: ../src/vikwindow.c:4825 +msgid "New file" +msgstr "Новий файл" + +#: ../src/vikwindow.c:4826 +msgid "_Open..." +msgstr "" + +#: ../src/vikwindow.c:4826 +msgid "Open a file" +msgstr "Відкрити файл" + +#: ../src/vikwindow.c:4827 +msgid "Open _Recent File" +msgstr "" + +#: ../src/vikwindow.c:4828 +msgid "Append _File..." +msgstr "" + +#: ../src/vikwindow.c:4828 +msgid "Append data from a different file" +msgstr "" + +#: ../src/vikwindow.c:4829 +msgid "Open GPX as External _Layer..." +msgstr "" + +#: ../src/vikwindow.c:4829 +msgid "Open a GPX file as an external layer" +msgstr "" + +#: ../src/vikwindow.c:4830 +msgid "_Export All" +msgstr "" + +#: ../src/vikwindow.c:4830 +msgid "Export All TrackWaypoint Layers" +msgstr "" + +#: ../src/vikwindow.c:4831 +msgid "_GPX..." +msgstr "" + +#: ../src/vikwindow.c:4831 +msgid "Export as GPX" +msgstr "" + +#: ../src/vikwindow.c:4832 +msgid "A_cquire" +msgstr "" + +#: ../src/vikwindow.c:4833 +msgid "_Directions..." +msgstr "" + +#: ../src/vikwindow.c:4833 +msgid "Get driving directions" +msgstr "" + +#: ../src/vikwindow.c:4835 +msgid "_OSM Traces..." +msgstr "" + +#: ../src/vikwindow.c:4835 +msgid "Get traces from OpenStreetMap" +msgstr "" + +#: ../src/vikwindow.c:4836 +msgid "_My OSM Traces..." +msgstr "" + +#: ../src/vikwindow.c:4836 +msgid "Get Your Own Traces from OpenStreetMap" +msgstr "" + +#: ../src/vikwindow.c:4839 +msgid "Geo_caches..." +msgstr "" + +#: ../src/vikwindow.c:4839 +msgid "Get Geocaches from geocaching.com" +msgstr "" + +#: ../src/vikwindow.c:4842 +msgid "Create waypoints from geotagged images" +msgstr "" + +#: ../src/vikwindow.c:4844 +msgid "Get a file from a URL" +msgstr "" + +#: ../src/vikwindow.c:4846 +msgid "Create waypoints from Wikipedia items in the current view" +msgstr "" + +#: ../src/vikwindow.c:4848 +msgid "_Save" +msgstr "" + +#: ../src/vikwindow.c:4848 +msgid "Save the file" +msgstr "" + +#: ../src/vikwindow.c:4849 +msgid "Save _As..." +msgstr "" + +#: ../src/vikwindow.c:4849 +msgid "Save the file under different name" +msgstr "" + +#: ../src/vikwindow.c:4850 +msgid "Properties..." +msgstr "" + +#: ../src/vikwindow.c:4850 +msgid "File Properties" +msgstr "" + +#: ../src/vikwindow.c:4852 +msgid "Import KMZ _Map File..." +msgstr "" + +#: ../src/vikwindow.c:4852 +msgid "Import a KMZ file" +msgstr "" + +#: ../src/vikwindow.c:4853 +msgid "Generate _KMZ Map File..." +msgstr "" + +#: ../src/vikwindow.c:4853 +msgid "Generate a KMZ file with an overlay of the current view" +msgstr "" + +#: ../src/vikwindow.c:4855 +msgid "_Generate Image File..." +msgstr "" + +#: ../src/vikwindow.c:4855 +msgid "Save a snapshot of the workspace into a file" +msgstr "" + +#: ../src/vikwindow.c:4856 +msgid "Generate _Directory of Images..." +msgstr "" + +#: ../src/vikwindow.c:4856 +msgid "Generate _Directory of Images" +msgstr "" + +#: ../src/vikwindow.c:4857 +msgid "_Print..." +msgstr "" + +#: ../src/vikwindow.c:4857 +msgid "Print maps" +msgstr "" + +#: ../src/vikwindow.c:4858 +msgid "E_xit" +msgstr "" + +#: ../src/vikwindow.c:4858 +msgid "Exit the program" +msgstr "" + +#: ../src/vikwindow.c:4859 +msgid "Save and Exit" +msgstr "" + +#: ../src/vikwindow.c:4859 +msgid "Save and Exit the program" +msgstr "" + +#: ../src/vikwindow.c:4861 +msgid "Go to the Pre_vious Location" +msgstr "" + +#: ../src/vikwindow.c:4861 +msgid "Go to the previous location" +msgstr "" + +#: ../src/vikwindow.c:4862 +msgid "Go to the _Next Location" +msgstr "" + +#: ../src/vikwindow.c:4862 +msgid "Go to the next location" +msgstr "" + +#: ../src/vikwindow.c:4863 +msgid "Go to the _Default Location" +msgstr "" + +#: ../src/vikwindow.c:4863 +msgid "Go to the default location" +msgstr "" + +#: ../src/vikwindow.c:4864 +msgid "Go to the _Auto Location" +msgstr "" + +#: ../src/vikwindow.c:4864 +msgid "Go to a location via automatic lookup" +msgstr "" + +#: ../src/vikwindow.c:4865 +msgid "Go to _Location..." +msgstr "" + +#: ../src/vikwindow.c:4865 +msgid "Go to address/place using text search" +msgstr "" + +#: ../src/vikwindow.c:4866 +msgid "_Go to Lat/Lon..." +msgstr "" + +#: ../src/vikwindow.c:4866 +msgid "Go to arbitrary lat/lon coordinate" +msgstr "" + +#: ../src/vikwindow.c:4867 +msgid "Go to UTM..." +msgstr "" + +#: ../src/vikwindow.c:4867 +msgid "Go to arbitrary UTM coordinate" +msgstr "" + +#: ../src/vikwindow.c:4868 +msgid "Go to Today" +msgstr "" + +#: ../src/vikwindow.c:4868 +msgid "Go to today on the calendar" +msgstr "" + +#: ../src/vikwindow.c:4869 +msgid "_Refresh" +msgstr "" + +#: ../src/vikwindow.c:4869 +msgid "Refresh any maps displayed" +msgstr "" + +#: ../src/vikwindow.c:4870 +msgid "Set _Highlight Color..." +msgstr "" + +#: ../src/vikwindow.c:4870 +msgid "Set Highlight Color" +msgstr "" + +#: ../src/vikwindow.c:4871 +msgid "Set Bac_kground Color..." +msgstr "" + +#: ../src/vikwindow.c:4871 +msgid "Set Background Color" +msgstr "" + +#: ../src/vikwindow.c:4872 +msgid "Zoom _In" +msgstr "" + +#: ../src/vikwindow.c:4872 +msgid "Zoom In" +msgstr "" + +#: ../src/vikwindow.c:4873 +msgid "Zoom _Out" +msgstr "" + +#: ../src/vikwindow.c:4873 +msgid "Zoom Out" +msgstr "" + +#: ../src/vikwindow.c:4874 +msgid "Zoom _To..." +msgstr "" + +#: ../src/vikwindow.c:4874 +msgid "Zoom To" +msgstr "" + +#: ../src/vikwindow.c:4875 +msgid "Pan _North" +msgstr "" + +#: ../src/vikwindow.c:4876 +msgid "Pan _East" +msgstr "" + +#: ../src/vikwindow.c:4877 +msgid "Pan _South" +msgstr "" + +#: ../src/vikwindow.c:4878 +msgid "Pan _West" +msgstr "" + +#: ../src/vikwindow.c:4879 +msgid "Background _Jobs" +msgstr "" + +#: ../src/vikwindow.c:4879 +msgid "Background Jobs" +msgstr "" + +#: ../src/vikwindow.c:4881 +msgid "Cu_t" +msgstr "" + +#: ../src/vikwindow.c:4885 +msgid "Delete All" +msgstr "" + +#: ../src/vikwindow.c:4886 +msgid "Copy Centre _Location" +msgstr "" + +#: ../src/vikwindow.c:4887 +msgid "_Flush Map Cache" +msgstr "" + +#: ../src/vikwindow.c:4888 +msgid "_Set the Default Location" +msgstr "" + +#: ../src/vikwindow.c:4888 +msgid "Set the Default Location to the current position" +msgstr "" + +#: ../src/vikwindow.c:4889 +msgid "_Preferences" +msgstr "" + +#: ../src/vikwindow.c:4889 +msgid "Program Preferences" +msgstr "" + +#: ../src/vikwindow.c:4890 +msgid "_Layer Defaults" +msgstr "" + +#: ../src/vikwindow.c:4891 +msgid "_Properties" +msgstr "" + +#: ../src/vikwindow.c:4893 +msgid "Help" +msgstr "" + +#: ../src/vikwindow.c:4894 +msgid "_About" +msgstr "" + +#: ../src/vikwindow.c:4894 +msgid "About" +msgstr "" + +#: ../src/vikwindow.c:4903 +msgid "_KML..." +msgstr "" + +#: ../src/vikwindow.c:4903 +msgid "Export as KML" +msgstr "" + +#: ../src/vikwindow.c:4904 +msgid "Transfer data from a GPS device" +msgstr "" + +#: ../src/vikwindow.c:4905 +msgid "Import file via GPSBabel converter" +msgstr "" + +#: ../src/vikwindow.c:4909 +msgid "Import Geo_JSON File..." +msgstr "" + +#: ../src/vikwindow.c:4909 +msgid "Import GeoJSON file" +msgstr "" + +#: ../src/vikwindow.c:4914 +msgid "_UTM Mode" +msgstr "" + +#: ../src/vikwindow.c:4915 +msgid "_Expedia Mode" +msgstr "" + +#: ../src/vikwindow.c:4916 +msgid "_Mercator Mode" +msgstr "" + +#: ../src/vikwindow.c:4917 +msgid "Lat_/Lon Mode" +msgstr "" + +#: ../src/vikwindow.c:4921 +msgid "Show _Scale" +msgstr "" + +#: ../src/vikwindow.c:4921 +msgid "Show Scale" +msgstr "" + +#: ../src/vikwindow.c:4922 +msgid "Show _Center Mark" +msgstr "" + +#: ../src/vikwindow.c:4922 +msgid "Show Center Mark" +msgstr "" + +#: ../src/vikwindow.c:4923 +msgid "Show _Highlight" +msgstr "" + +#: ../src/vikwindow.c:4923 +msgid "Show Highlight" +msgstr "" + +#: ../src/vikwindow.c:4924 +msgid "_Full Screen" +msgstr "" + +#: ../src/vikwindow.c:4924 +msgid "Activate full screen mode" +msgstr "" + +#: ../src/vikwindow.c:4925 +msgid "Show Side _Panel" +msgstr "" + +#: ../src/vikwindow.c:4925 +msgid "Show Side Panel" +msgstr "" + +#: ../src/vikwindow.c:4926 +msgid "Show Status_bar" +msgstr "" + +#: ../src/vikwindow.c:4926 +msgid "Show Statusbar" +msgstr "" + +#: ../src/vikwindow.c:4927 +msgid "Show _Toolbar" +msgstr "" + +#: ../src/vikwindow.c:4927 +msgid "Show Toolbar" +msgstr "" + +#: ../src/vikwindow.c:4928 +msgid "Show _Menu" +msgstr "" + +#: ../src/vikwindow.c:4928 +msgid "Show Menu" +msgstr "" + +#: ../src/vikwindow.c:4929 +msgid "Show Side Panel B_uttons" +msgstr "" + +#: ../src/vikwindow.c:4929 +msgid "Show Side Panel Buttons" +msgstr "" + +#: ../src/vikwindow.c:4930 +msgid "Show Side Panel Ca_lendar" +msgstr "" + +#: ../src/vikwindow.c:4930 +msgid "Show Side Panel Calendar" +msgstr "" + +#: ../src/vikwindow.c:5064 +#, c-format +msgid "New _%s Layer" +msgstr "" + +#: ../src/vikwindow.c:5114 +msgid "..." +msgstr "" + +#: ../src/viking.desktop.in.h:2 +msgid "GPS Data Manager" +msgstr "" + +#: ../src/viking.desktop.in.h:3 +msgid "Map Based GPS Data Manager (live data capable)." +msgstr "" + +#: ../src/libjpeg/jpeg-data.c:205 +msgid "Data does not follow JPEG specification." +msgstr "" + +#: ../src/libjpeg/jpeg-data.c:302 +#, c-format +msgid "Path '%s' invalid." +msgstr "" + +#: ../src/libjpeg/jpeg-data.c:320 +#, c-format +msgid "Could not read '%s'." +msgstr "" diff --git a/po/zh_CN.po b/po/zh_CN.po new file mode 100644 index 0000000..992accd --- /dev/null +++ b/po/zh_CN.po @@ -0,0 +1,6214 @@ +msgid "" +msgstr "" +"Project-Id-Version: Viking\n" +"Report-Msgid-Bugs-To: \n" +"POT-Creation-Date: 2019-01-19 12:53+0000\n" +"PO-Revision-Date: 2017-01-24 06:48+0000\n" +"Last-Translator: huobos \n" +"Language-Team: \n" +"Language: \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" +"X-Launchpad-Export-Date: 2018-12-21 17:32+0000\n" +"X-Generator: Launchpad (build 18847)\n" +"X-Poedit-Language: Simplified Chinese\n" + +#: ../src/acquire.c:106 ../src/vikgpslayer.c:1367 +msgid "Done." +msgstr "完成。" + +#: ../src/acquire.c:115 +msgid "No data." +msgstr "无数据。" + +#: ../src/acquire.c:167 ../src/acquire.c:415 +msgid "Error: acquisition failed." +msgstr "错误: 接收失败。" + +#: ../src/acquire.c:339 +msgid "Working..." +msgstr "工作中…" + +#. This shouldn't happen... +#: ../src/acquire.c:406 +msgid "" +"Unable to create command\n" +"Acquire method failed." +msgstr "" +"无法创建命令。\n" +"获取方法失败。" + +#: ../src/acquire.c:513 +msgid "_Filter" +msgstr "过滤(_F)" + +#: ../src/acquire.c:528 +#, c-format +msgid "Filter with %s" +msgstr "用%s过滤" + +#: ../src/acquire.c:545 +msgid "Filter" +msgstr "过滤" + +#: ../src/babel.c:640 +msgid "GPSBabel:" +msgstr "GPSBabel程序:" + +#: ../src/babel.c:641 +msgid "" +"Allow setting the specific instance of GPSBabel. You must restart Viking for " +"this value to take effect." +msgstr "允许设置指定的GPSBabel实例。重启程序使其生效。" + +#: ../src/babel_ui.c:79 +msgid "Select a file format" +msgstr "选择文件格式" + +#: ../src/babel_ui.c:144 ../src/viktrwlayer.c:531 ../src/viktrwlayer.c:2882 +msgid "Tracks" +msgstr "轨迹" + +#: ../src/babel_ui.c:149 ../src/viktrwlayer.c:2892 +msgid "Routes" +msgstr "路线" + +#. ***** PARAMETERS ***** +#: ../src/babel_ui.c:154 ../src/viktrwlayer.c:531 ../src/viktrwlayer.c:2887 +msgid "Waypoints" +msgstr "路标" + +#: ../src/background.c:64 +#, c-format +msgid "%d items" +msgstr "%d项" + +#: ../src/background.c:287 +msgid "Threads:" +msgstr "线程:" + +#: ../src/background.c:288 +msgid "" +"Number of threads to use for Mapnik tasks. You need to restart Viking for a " +"change to this value to be used" +msgstr "供Mapnik任务使用的线程数。重启程序使其生效。" + +#: ../src/background.c:361 +msgid "Job" +msgstr "任务" + +#: ../src/background.c:365 +msgid "Progress" +msgstr "进度" + +#: ../src/background.c:373 +msgid "Viking Background Jobs" +msgstr "Viking后台任务" + +#: ../src/bing.c:42 +msgid "Bing Aerial" +msgstr "必应航空" + +#: ../src/bing.c:48 +msgid "Bing" +msgstr "必应" + +#. VIK_GTK_WINDOW_FROM_WIDGET(vp) +#: ../src/bingmapsource.c:514 +msgid "Bing attribution Loading" +msgstr "必应属性正加载" + +#: ../src/clipboard.c:95 +msgid "paste failed" +msgstr "粘贴失败" + +#: ../src/clipboard.c:105 +msgid "wrong clipboard data size" +msgstr "剪贴版数据尺寸错误" + +#: ../src/clipboard.c:124 +#, c-format +msgid "" +"The clipboard contains sublayer data for %s layers. You must select a layer " +"of this type to paste the clipboard data." +msgstr "剪贴板含有%s层的子层数据。须选择该类型的层才能粘帖。" + +#: ../src/clipboard.c:264 +msgid "" +"In order to paste a waypoint, please select an appropriate layer to paste " +"into." +msgstr "请选择合适的层来粘帖路标。" + +#: ../src/dialog.c:60 +msgid "Go to Lat/Lon" +msgstr "到纬度/经度坐标" + +#: ../src/dialog.c:69 ../src/viktrwlayer_wpwin.c:173 +msgid "Latitude:" +msgstr "纬度:" + +#: ../src/dialog.c:72 ../src/viktrwlayer_wpwin.c:177 +msgid "Longitude:" +msgstr "经度:" + +#: ../src/dialog.c:102 +msgid "Go to UTM" +msgstr "去UTM" + +#: ../src/dialog.c:114 +msgid "Northing:" +msgstr "北进:" + +#: ../src/dialog.c:117 +msgid "Easting:" +msgstr "东进:" + +#: ../src/dialog.c:121 ../src/vikgeoreflayer.c:902 +msgid "Zone:" +msgstr "区域:" + +#: ../src/dialog.c:124 ../src/vikgeoreflayer.c:904 +msgid "Letter:" +msgstr "字母:" + +#: ../src/dialog.c:246 ../src/geonamessearch.c:238 +#: ../src/datasource_osm_my_traces.c:505 +msgid "Nothing was selected" +msgstr "无任何选择" + +#: ../src/dialog.c:254 +msgid "Add Route" +msgstr "添加路线" + +#: ../src/dialog.c:254 +msgid "Add Track" +msgstr "添加轨迹" + +#: ../src/dialog.c:262 +msgid "Route Name:" +msgstr "路线名:" + +#: ../src/dialog.c:262 +msgid "Track Name:" +msgstr "轨迹名:" + +#: ../src/dialog.c:282 +msgid "Please enter a name for the track." +msgstr "请为此轨迹取名。" + +#: ../src/dialog.c:311 +msgid "Today" +msgstr "今天" + +#: ../src/dialog.c:393 +msgid "Zoom Factors..." +msgstr "缩放参数…" + +#: ../src/dialog.c:407 +msgid "Zoom factor (in meters per pixel):" +msgstr "放大系数(米每像素):" + +#: ../src/dialog.c:408 +msgid "X (easting): " +msgstr "X (东进): " + +#: ../src/dialog.c:409 +msgid "Y (northing): " +msgstr "Y (北进): " + +#: ../src/dialog.c:414 +msgid "X and Y zoom factors must be equal" +msgstr "X和Y缩放参数必须相等" + +#: ../src/dialog.c:469 +msgid "1 min" +msgstr "1分钟" + +#: ../src/dialog.c:470 +msgid "1 hour" +msgstr "1小时" + +#: ../src/dialog.c:471 +msgid "1 day" +msgstr "1天" + +#: ../src/dialog.c:472 +msgid "Custom (in minutes):" +msgstr "定制(分钟):" + +#: ../src/dialog.c:608 +#, c-format +msgid "" +"2003-2008, Evan Battaglia\n" +"2008-%s, Viking's contributors" +msgstr "" + +#: ../src/dialog.c:609 +msgid "GPS Data and Topo Analyzer, Explorer, and Manager." +msgstr "GPS数据和拓扑分析、浏览、管理工具。" + +#: ../src/dialog.c:610 +msgid "" +"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.\n" +"\n" +"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.\n" +"\n" +"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., 59 Temple " +"Place, Suite 330, Boston, MA 02111-1307, USA" +msgstr "" +"本程序为自由软件;您可依据自由软件基金会所发表的GNU通用公共授权条款规定,就本" +"程序再为发布与/或修改;无论您依据的是本授权的第二版或(您自行选择的)任一日" +"后发行的版本。\n" +"\n" +"本程序是基于使用目的而加以发布,然而不负任何担保责任;亦无对适售性或特定目的" +"适用性所为的默示性担保。详情请参照GNU通用公共授权。\n" +"\n" +"您应已收到附随于本程序的GNU通用公共授权的副本;如果没有,请写信至自由软件基金" +"会:59 Temple Place - Suite 330, Boston, Ma 02111-1307, USA。" + +#: ../src/dialog.c:703 +msgid "Translation is coordinated on http://launchpad.net/viking" +msgstr "翻译在网站http://launchpad.net/viking协作完成" + +#: ../src/dialog.c:713 +msgid "Download along track" +msgstr "沿轨迹下载" + +#: ../src/dialog.c:720 +msgid "Map type:" +msgstr "地图类型:" + +#: ../src/dialog.c:726 +msgid "Zoom level:" +msgstr "缩放等级:" + +#: ../src/dialog.c:766 +#, c-format +msgid "The map data is licensed: %s." +msgstr "地图数据许可证是:%s。" + +#: ../src/dialog.c:769 +#, c-format +msgid "" +"The data provided by '%s' are licensed under the following license: " +"%s." +msgstr "数据由‘%s’ 提供,许可证%s。" + +#: ../src/dialog.c:773 +msgid "Open license" +msgstr "开源许可证" + +#: ../src/expedia.c:54 +msgid "Expedia Street Maps" +msgstr "Expedia(亿客行)街道地图" + +#: ../src/expedia.c:82 +msgid "Invalid expedia altitude" +msgstr "无效的Expedia(亿客行)海拔" + +#: ../src/expedia.c:113 +#, c-format +msgid "" +"Couldn't open EXPEDIA image file (right after successful download! Please " +"report and delete image file!): %s" +msgstr "" +"打不开EXPEDIA(亿客行)图像文件(在成功下载后!请发送错误报告并删除图像文" +"件!):%s" + +#: ../src/expedia.c:126 +#, c-format +msgid "" +"Couldn't save EXPEDIA image file (right after successful download! Please " +"report and delete image file!): %s" +msgstr "" +"不能保存EXPEDIA(亿客行)图像文件(在成功下载后!请发送错误报告并删除图像文" +"件!):%s" + +#: ../src/geonamessearch.c:115 +msgid "Search" +msgstr "搜索" + +#: ../src/geonamessearch.c:117 +msgid "No entries found!" +msgstr "找不到条目!" + +#. NB could allow columns to be shifted around by doing this after each new +#. gtk_tree_view_column_set_reorderable ( column, TRUE ); +#. However I don't think is that useful, so I haven't put it in +#: ../src/geonamessearch.c:171 ../src/datasource_osm_my_traces.c:422 +#: ../src/viktrwlayer_tracklist.c:621 ../src/viktrwlayer_waypointlist.c:618 +msgid "Name" +msgstr "名字" + +#: ../src/geonamessearch.c:176 +msgid "Feature" +msgstr "特性" + +#: ../src/geonamessearch.c:181 ../src/datasource_osm_my_traces.c:437 +msgid "Lat/Lon" +msgstr "纬度/经度" + +#: ../src/geonamessearch.c:264 ../src/googlesearch.c:101 ../src/vikgoto.c:430 +msgid "couldn't map temp file" +msgstr "无法映射临时文件" + +#: ../src/geonamessearch.c:459 +#, fuzzy +msgid "Select articles" +msgstr "选择文件格式" + +#: ../src/geonamessearch.c:459 +#, fuzzy +msgid "Select the articles you want to add." +msgstr "选择文件格式。" + +#: ../src/geonamessearch.c:475 +msgid "city" +msgstr "" + +#: ../src/geonamessearch.c:477 +#, fuzzy +msgid "edu" +msgstr "结束" + +#: ../src/geonamessearch.c:479 +msgid "airport" +msgstr "" + +#: ../src/geonamessearch.c:481 +msgid "mountain" +msgstr "" + +#: ../src/geonamessearch.c:483 +msgid "forest" +msgstr "" + +#: ../src/geonamessearch.c:485 +msgid "church" +msgstr "" + +#: ../src/geojson.c:74 +#, c-format +msgid "%s command failed: %s" +msgstr "%s命令失败:%s" + +#: ../src/geojson.c:146 ../src/gpx.c:1317 +#, c-format +msgid "failed to open temporary file: %s" +msgstr "打不开临时文件:%s" + +#: ../src/globals.c:67 +msgid "DDD" +msgstr "" + +#: ../src/globals.c:67 +#, fuzzy +msgid "DMM" +msgstr "DEM(数字高程模型)" + +#: ../src/globals.c:67 +#, fuzzy +msgid "DMS" +msgstr "DEM(数字高程模型)" + +#: ../src/globals.c:67 +msgid "Raw" +msgstr "原始的" + +#: ../src/globals.c:68 +msgid "Kilometres" +msgstr "公里" + +#: ../src/globals.c:68 +msgid "Miles" +msgstr "英里" + +#: ../src/globals.c:68 +msgid "Nautical Miles" +msgstr "海里" + +#. VIK_UNITS_SPEED_KILOMETRES_PER_HOUR: +#: ../src/globals.c:69 ../src/viktrwlayer_tracklist.c:655 ../src/vikutils.c:100 +msgid "km/h" +msgstr "公里/小时" + +#: ../src/globals.c:69 ../src/viktrwlayer_tracklist.c:656 ../src/vikutils.c:78 +msgid "mph" +msgstr "英里/小时" + +#. VIK_UNITS_SPEED_METRES_PER_SECOND: +#: ../src/globals.c:69 ../src/viktrwlayer_tracklist.c:663 ../src/vikutils.c:81 +msgid "m/s" +msgstr "米/秒" + +#: ../src/globals.c:69 ../src/viktrwlayer_tracklist.c:657 ../src/vikutils.c:84 +msgid "knots" +msgstr "节" + +#: ../src/globals.c:69 ../src/viktrwlayer_tracklist.c:658 ../src/vikutils.c:87 +msgid "s/km" +msgstr "" + +#: ../src/globals.c:69 ../src/viktrwlayer_tracklist.c:659 ../src/vikutils.c:90 +msgid "min/km" +msgstr "" + +#: ../src/globals.c:69 +msgid "s/mi" +msgstr "" + +#: ../src/globals.c:69 ../src/viktrwlayer_tracklist.c:661 ../src/vikutils.c:96 +msgid "min/mi" +msgstr "" + +#: ../src/globals.c:70 +#, fuzzy +msgid "Metres" +msgstr "公里" + +#: ../src/globals.c:70 +msgid "Feet" +msgstr "" + +#: ../src/globals.c:73 +msgid "Locale" +msgstr "本地" + +#: ../src/globals.c:73 +msgid "World" +msgstr "世界" + +#: ../src/globals.c:73 +msgid "UTC" +msgstr "UTC" + +#: ../src/globals.c:76 +msgid "Degree format:" +msgstr "度数格式:" + +#: ../src/globals.c:77 +msgid "Distance units:" +msgstr "距离单位:" + +#: ../src/globals.c:78 +msgid "Speed units:" +msgstr "速度单位:" + +#: ../src/globals.c:79 +msgid "Height units:" +msgstr "高度单位:" + +#: ../src/globals.c:80 +msgid "Use large waypoint icons:" +msgstr "使用大的路标图标:" + +#: ../src/globals.c:81 +msgid "Default latitude:" +msgstr "默认纬度:" + +#: ../src/globals.c:82 +msgid "Default longitude:" +msgstr "默认经度:" + +#: ../src/globals.c:83 +msgid "Time Display:" +msgstr "时间显示:" + +#: ../src/globals.c:84 +msgid "" +"Display times according to the reference frame. Locale is the user's system " +"setting. World is relative to the location of the object." +msgstr "" +"根据参考区域显示时间。本地是指根据用户的系统设置显示时间。世界是指根据目标的" +"地点显示时间。" + +#: ../src/globals.c:90 +msgid "Alphabetical" +msgstr "按字母排序" + +#: ../src/globals.c:90 ../src/datasource_osm_my_traces.c:432 +msgid "Time" +msgstr "时长" + +#: ../src/globals.c:90 +msgid "Creation" +msgstr "创建时间" + +#: ../src/globals.c:91 +msgid "Title Case" +msgstr "标题大小写" + +#: ../src/globals.c:91 +msgid "Lowercase" +msgstr "小写" + +#: ../src/globals.c:94 +msgid "KML File Export Units:" +msgstr "KML文件导出格式:" + +#: ../src/globals.c:95 +msgid "GPX Track Order:" +msgstr "GPX轨迹顺序:" + +#: ../src/globals.c:96 +msgid "GPX Waypoint Symbols:" +msgstr "GPX路标符号:" + +#: ../src/globals.c:97 +msgid "" +"Save GPX Waypoint Symbol names in the specified case. May be useful for " +"compatibility with various devices" +msgstr "以指定大小写保存GPX路标符号名称。对兼容一些设备有用。" + +#: ../src/globals.c:98 +#, fuzzy +msgid "GPX Creator:" +msgstr "创建时间" + +#: ../src/globals.c:99 +msgid "" +"The creator value when writing a GPX file. Otherwise when blank a default is " +"used." +msgstr "" + +#: ../src/globals.c:104 +msgid "Image Viewer:" +msgstr "图像查看器:" + +#: ../src/globals.c:109 +msgid "External GPX Program 1:" +msgstr "外部GPX程序1:" + +#: ../src/globals.c:110 +msgid "External GPX Program 2:" +msgstr "外部GPX程序1:" + +#: ../src/globals.c:113 +msgid "Absolute" +msgstr "绝对" + +#: ../src/globals.c:113 +msgid "Relative" +msgstr "相对" + +#: ../src/globals.c:117 +msgid "Save File Reference Mode:" +msgstr "保存文件的引用模式:" + +#: ../src/globals.c:118 +msgid "" +"When saving a Viking .vik file, this determines how the directory paths of " +"filenames are written." +msgstr "当保存维京.vik文件时,本项决定了如何保存文件名的目录部分。" + +#: ../src/globals.c:119 +msgid "Ask for Name before Track Creation:" +msgstr "创建路径前询问名字:" + +#: ../src/globals.c:120 +msgid "Show Tooltip during Track Creation:" +msgstr "创建路径时显示提示信息:" + +#: ../src/globals.c:121 +msgid "The number of recent files:" +msgstr "新开档数量:" + +#: ../src/globals.c:122 +msgid "" +"Only applies to new windows or on application restart. -1 means all " +"available files." +msgstr "仅用于新窗口或重启后的程序。-1指全部文件。" + +#: ../src/globals.c:123 +#, fuzzy +msgid "Open files in selected layer:" +msgstr "删除所选层" + +#: ../src/globals.c:124 +msgid "Open files (but not .vik ones) into the selected TrackWaypoint layer." +msgstr "" + +#: ../src/globals.c:125 +msgid "Show calendar day names:" +msgstr "" + +#: ../src/globals.c:128 +msgid "Home Location" +msgstr "归属位置" + +#: ../src/globals.c:128 +msgid "Last Location" +msgstr "最后位置" + +#: ../src/globals.c:128 +msgid "Specified File" +msgstr "指定文件" + +#: ../src/globals.c:128 +msgid "Auto Location" +msgstr "自动定位" + +#: ../src/globals.c:131 +msgid "Restore Window Setup:" +msgstr "重置窗口设置:" + +#: ../src/globals.c:132 +msgid "Restore window size and layout" +msgstr "重置窗口大小和布局" + +#: ../src/globals.c:133 +msgid "Add a Default Map Layer:" +msgstr "添加默认地图层:" + +#: ../src/globals.c:134 +msgid "" +"The default map layer added is defined by the Layer Defaults. Use the menu " +"Edit->Layer Defaults->Map... to change the map type and other values." +msgstr "" +"默认地图层由图层默认设置决定。用菜单->图层默认设置->地图...来改变地图类型及其" +"他值。" + +#: ../src/globals.c:135 +msgid "Startup Method:" +msgstr "启动方法:" + +#: ../src/globals.c:136 +msgid "Startup File:" +msgstr "启动文件:" + +#: ../src/globals.c:137 +msgid "" +"The default file to load on startup. Only applies when the startup method is " +"set to 'Specified File'" +msgstr "启动时加载的默认文件。仅用于启动方法是“指定文件”时。" + +#: ../src/globals.c:138 +msgid "Check For New Version:" +msgstr "检查新版本:" + +#: ../src/globals.c:139 +msgid "Periodically check to see if a new version of Viking is available" +msgstr "定期检查新版本。" + +#. Defaults for the options are setup here +#: ../src/globals.c:176 +msgid "General" +msgstr "常规" + +#. New Tab +#: ../src/globals.c:204 +msgid "Startup" +msgstr "启动" + +#. New Tab +#: ../src/globals.c:222 +msgid "Export/External" +msgstr "导出/外部程序" + +#. 'Advanced' Properties +#: ../src/globals.c:249 +msgid "Advanced" +msgstr "高级" + +#. Webtools +#: ../src/google.c:39 +msgid "Google" +msgstr "谷歌" + +#. If there is an actual description field it will overwrite this value +#: ../src/gpx.c:264 +#, c-format +msgid "Created by: %s" +msgstr "" + +#: ../src/datasource_bfilter.c:43 +msgid "Max number of points:" +msgstr "点的最大数量:" + +#: ../src/datasource_bfilter.c:84 +msgid "Simplify All Tracks..." +msgstr "简化全部轨迹…" + +#: ../src/datasource_bfilter.c:85 +msgid "Simplified Tracks" +msgstr "简化轨迹" + +#. { VIK_LAYER_NUM_TYPES, "compressmethod", VIK_LAYER_PARAM_UINT, VIK_LAYER_GROUP_NONE, N_("Simplify Method:"), VIK_LAYER_WIDGET_COMBOBOX, compress_method, NULL, NULL, NULL, NULL, NULL }, +#: ../src/datasource_bfilter.c:111 +msgid "Error Factor:" +msgstr "容错因子:" + +#: ../src/datasource_bfilter.c:112 +msgid "" +"Specifies the maximum allowable error that may be introduced by removing a " +"single point by the crosstrack method. See the manual or GPSBabel Simplify " +"Filter documentation for more detail." +msgstr "" +"指定由交叉轨迹法删除一个点导致的最大容许错误值。详情请查阅手册或GPSBabel程序" +"里的简化过滤器文档。" + +#: ../src/datasource_bfilter.c:166 +msgid "Compress Tracks..." +msgstr "正在压缩轨迹…" + +#: ../src/datasource_bfilter.c:167 +msgid "Compressed Tracks" +msgstr "压缩后的轨迹" + +#: ../src/datasource_bfilter.c:197 ../src/datasource_bfilter.c:198 +msgid "Remove Duplicate Waypoints" +msgstr "删除重复路标" + +#: ../src/datasource_bfilter.c:221 +msgid "Manual filter:" +msgstr "手动过滤:" + +#: ../src/datasource_bfilter.c:222 +msgid "Manual filter command: e.g. 'swap'." +msgstr "手动过滤命令:比如‘swap’。" + +#: ../src/datasource_bfilter.c:233 ../src/datasource_bfilter.c:234 +msgid "Manual filter" +msgstr "手动过滤" + +#: ../src/datasource_bfilter.c:262 +msgid "Waypoints Inside This" +msgstr "路标在内" + +#: ../src/datasource_bfilter.c:263 ../src/datasource_bfilter.c:292 +msgid "Polygonized Layer" +msgstr "多边形层" + +#: ../src/datasource_bfilter.c:291 +msgid "Waypoints Outside This" +msgstr "路标在外" + +#: ../src/datasource_file.c:61 +msgid "Import file with GPSBabel" +msgstr "从GPSBabel程序导入" + +#: ../src/datasource_file.c:62 +msgid "Imported file" +msgstr "已导入文件" + +#. The file selector +#: ../src/datasource_file.c:129 +msgid "File:" +msgstr "文件:" + +#: ../src/datasource_file.c:130 +msgid "File to import" +msgstr "要导入的文件" + +#: ../src/datasource_file.c:137 +msgid "All files" +msgstr "全部文件" + +#. The file format selector +#: ../src/datasource_file.c:144 ../src/datasource_url.c:106 +msgid "File type:" +msgstr "文件类型:" + +#: ../src/datasource_file.c:189 +#, c-format +msgid "using babel args '%s' and file '%s'" +msgstr "使用GPSBabel命令参数‘%s’及文件‘%s’" + +#: ../src/datasource_gc.c:67 +msgid "Download Geocaches" +msgstr "下载地理藏宝" + +#: ../src/datasource_gc.c:68 +msgid "Geocaching.com Caches" +msgstr "Geocaching.com(地理藏宝网站)缓存" + +#: ../src/datasource_gc.c:86 +msgid "geocaching.com username:" +msgstr "geocaching.com(地理藏宝网站)用户名:" + +#: ../src/datasource_gc.c:87 +msgid "geocaching.com password:" +msgstr "geocaching.com(地理藏宝网站)密码:" + +#: ../src/datasource_gc.c:92 ../src/vikwindow.c:3502 +msgid "Geocaching" +msgstr "地理藏宝" + +#: ../src/datasource_gc.c:128 +#, c-format +msgid "" +"Can't find %s or %s in path! Check that you have installed it correctly." +msgstr "路径中找不到%s或%s!请检查是否已正确安装。" + +#: ../src/datasource_gc.c:190 +msgid "Number geocaches:" +msgstr "地理藏宝数量:" + +#: ../src/datasource_gc.c:192 +msgid "Centered around:" +msgstr "以此为中心:" + +#: ../src/datasource_gc.c:231 +msgid "Broken input - using some defaults" +msgstr "损坏的输入-使用默认设置" + +#: ../src/datasource_geotag.c:51 +msgid "Create Waypoints from Geotagged Images" +msgstr "从有地理标记的图像创建路标" + +#: ../src/datasource_geotag.c:52 +msgid "Geotagged Images" +msgstr "有地理标记的图像" + +#: ../src/datasource_geotag.c:102 ../src/datasource_geojson.c:93 +#: ../src/vikfileentry.c:171 ../src/vikwindow.c:3533 ../src/vikwindow.c:3610 +#: ../src/vikwindow.c:3641 ../src/vikwindow.c:4356 ../src/vikwindow.c:4649 +msgid "All" +msgstr "全选" + +#: ../src/datasource_geotag.c:107 ../src/vikfileentry.c:115 +#: ../src/viktrwlayer_geotag.c:637 ../src/vikwindow.c:3518 +#: ../src/vikwindow.c:4377 +msgid "JPG" +msgstr "JPG文件" + +#: ../src/datasource_geotag.c:168 +#, c-format +msgid "Unable to create waypoint from %s" +msgstr "无法从%s创建路标" + +#: ../src/datasource_geojson.c:46 +msgid "Acquire from GeoJSON" +msgstr "从GeoJSON文件获取" + +#: ../src/datasource_geojson.c:47 ../src/datasource_geojson.c:98 +msgid "GeoJSON" +msgstr "GeoJSON文件" + +#: ../src/datasource_geojson.c:152 +#, c-format +msgid "Unable to import from: %s" +msgstr "无法从%s导入" + +#: ../src/datasource_gps.c:54 +msgid "Acquire from GPS" +msgstr "从GPS获取" + +#: ../src/datasource_gps.c:55 +msgid "Acquired from GPS" +msgstr "已从GPS获取" + +#: ../src/datasource_gps.c:258 +#, c-format +msgid "using cmd '%s' and file '%s'\n" +msgstr "用‘%s’命令和文件‘%s’\n" + +#: ../src/datasource_gps.c:353 ../src/vikgpslayer.c:966 +#, c-format +msgid "Downloading %d waypoint..." +msgid_plural "Downloading %d waypoints..." +msgstr[0] "下载%d路标…" + +#: ../src/datasource_gps.c:358 ../src/vikgpslayer.c:971 +#, c-format +msgid "Downloading %d trackpoint..." +msgid_plural "Downloading %d trackpoints..." +msgstr[0] "正下载%d轨迹点…" + +#: ../src/datasource_gps.c:363 ../src/vikgpslayer.c:976 +#, c-format +msgid "Downloading %d routepoint..." +msgid_plural "Downloading %d routepoints..." +msgstr[0] "正下载%d路线点…" + +#: ../src/datasource_gps.c:386 ../src/datasource_gps.c:393 +#: ../src/datasource_gps.c:400 +#, c-format +msgid "Downloaded %d out of %d %s..." +msgstr "已下载%d,总共%d %s…" + +#: ../src/datasource_gps.c:388 ../src/datasource_gps.c:395 +#: ../src/datasource_gps.c:402 +#, c-format +msgid "Downloaded %d %s." +msgstr "已下载%d %s。" + +#: ../src/datasource_gps.c:416 ../src/vikgpslayer.c:1134 +#, c-format +msgid "GPS Device: %s" +msgstr "GPS设备:%s" + +#: ../src/datasource_gps.c:428 ../src/vikgpslayer.c:1214 +msgid "Status: Working..." +msgstr "状态:工作中…" + +#. NB gps_layer_inst_init() is performed after parameter registeration +#. thus to give the protocols some potential values use the old static list +#. TODO: find another way to use gps_layer_inst_init()? +#: ../src/datasource_gps.c:584 ../src/vikgpslayer.c:216 +msgid "GPS Protocol:" +msgstr "GPS协议:" + +#. List reassigned at runtime +#: ../src/datasource_gps.c:609 ../src/vikgpslayer.c:217 +msgid "Serial Port:" +msgstr "串口:" + +#: ../src/datasource_gps.c:659 +msgid "" +"Turn Off After Transfer\n" +"(Garmin/NAViLink Only)" +msgstr "" +"传送完成后关闭设备\n" +"(仅对Garmin/NAViLink有效)" + +#: ../src/datasource_gps.c:666 +msgid "Tracks:" +msgstr "轨迹:" + +#: ../src/datasource_gps.c:673 +msgid "Routes:" +msgstr "路线:" + +#: ../src/datasource_gps.c:680 +msgid "Waypoints:" +msgstr "路标:" + +#: ../src/datasource_gps.c:756 ../src/vikgpslayer.c:1509 +msgid "GPS device: N/A" +msgstr "GPS设备:无" + +#: ../src/datasource_osm.c:53 ../src/datasource_osm.c:54 +msgid "OSM traces" +msgstr "OSM踪迹" + +#: ../src/datasource_osm.c:89 +msgid "Page number:" +msgstr "页码:" + +#: ../src/datasource_osm_my_traces.c:59 ../src/datasource_osm_my_traces.c:60 +msgid "OSM My Traces" +msgstr "OSM我的踪迹" + +#: ../src/datasource_osm_my_traces.c:106 ../src/osm-traces.c:684 +#, fuzzy +msgid "Email/username:" +msgstr "用户名:" + +#: ../src/datasource_osm_my_traces.c:111 +msgid "The email or username used to login to OSM" +msgstr "登录OSM(OpenStreetMap开源街图)的邮件地址或用户名" + +#: ../src/datasource_osm_my_traces.c:113 ../src/osm-traces.c:692 +msgid "Password:" +msgstr "密码:" + +#: ../src/datasource_osm_my_traces.c:116 +msgid "The password used to login to OSM" +msgstr "登录OSM(OpenStreetMap开源街图)的密码" + +#: ../src/datasource_osm_my_traces.c:427 ../src/viktrwlayer.c:689 +msgid "Description" +msgstr "说明" + +#: ../src/datasource_osm_my_traces.c:442 +msgid "Privacy" +msgstr "隐私" + +#: ../src/datasource_osm_my_traces.c:449 +msgid "Within Current View" +msgstr "在当前视图内" + +#: ../src/datasource_osm_my_traces.c:516 +msgid "GPS Traces" +msgstr "GPS踪迹" + +#: ../src/datasource_osm_my_traces.c:518 +msgid "None found!" +msgstr "找不到!" + +#: ../src/datasource_osm_my_traces.c:569 +msgid "Ensure the OSM access token preferences are setup." +msgstr "" + +#: ../src/datasource_osm_my_traces.c:645 +msgid "My OSM Traces" +msgstr "我的OSM踪迹" + +#. Report errors to the status bar +#: ../src/datasource_osm_my_traces.c:667 +#, c-format +msgid "Unable to get trace: %s" +msgstr "找不到踪迹:%s" + +#: ../src/datasource_routing.c:56 ../src/datasource_routing.c:57 +msgid "Directions" +msgstr "方向" + +#: ../src/datasource_routing.c:90 +msgid "No routing engines with directions available" +msgstr "" + +#. Engine selector +#: ../src/datasource_routing.c:99 +msgid "Engine:" +msgstr "引擎:" + +#. From and To entries +#: ../src/datasource_routing.c:104 +msgid "From:" +msgstr "从:" + +#: ../src/datasource_routing.c:105 +msgid "To:" +msgstr "至:" + +#: ../src/datasource_url.c:48 +msgid "Acquire from URL" +msgstr "从网址获取" + +#: ../src/datasource_url.c:49 +msgid "URL" +msgstr "网址" + +#: ../src/datasource_url.c:101 +msgid "URL:" +msgstr "网址:" + +#. Only GPX (not using GPSbabel) +#: ../src/datasource_url.c:133 ../src/vikfileentry.c:161 +#: ../src/vikwindow.c:3513 ../src/vikwindow.c:3603 +msgid "GPX" +msgstr "GPX文件" + +#: ../src/datasource_wikipedia.c:32 +msgid "Create Waypoints from Wikipedia Articles" +msgstr "从维基百科文章创建路标" + +#: ../src/datasource_wikipedia.c:33 +msgid "Wikipedia Waypoints" +msgstr "维基百科路标" + +#: ../src/dem.c:66 ../src/dem.c:80 +msgid "Invalid DEM" +msgstr "无效DEM(数字高程模型)" + +#: ../src/dem.c:122 +msgid "Invalid DEM header" +msgstr "无效DEM(数字高程模型)头部" + +#: ../src/dem.c:191 ../src/dem.c:204 +msgid "Incorrect DEM Class B record: expected 1" +msgstr "错误DEM(数字高程模型)B类记录:期望1" + +#: ../src/dem.c:289 ../src/download.c:176 +#, c-format +msgid "Couldn't map file %s: %s" +msgstr "无法映射文件%s:%s" + +#: ../src/download.c:130 +msgid "Tile age (days):" +msgstr "瓦片寿命(天)" + +#: ../src/download.c:406 +#, c-format +msgid "Download error: %s" +msgstr "下载错误:%s" + +#: ../src/download.c:490 +msgid "couldn't open temp file" +msgstr "打不开临时文件" + +#: ../src/file.c:458 ../src/file.c:463 +#, c-format +msgid "Draw mode '%s' no more supported" +msgstr "已不再支持绘制模式‘%s’" + +#: ../src/geotag_exif.c:621 +msgid "Not enough memory." +msgstr "内存不足。" + +#: ../src/geotag_exif.c:639 +msgid "Setting a value for this tag is unsupported!" +msgstr "不支持给该标签赋值!" + +#: ../src/geotag_exif.c:658 +#, c-format +msgid "Too few components specified (need %d, found %d)\n" +msgstr "指定组件数量太少(需要%d,找到%d)\n" + +#: ../src/geotag_exif.c:662 +msgid "Numeric value expected\n" +msgstr "需要数值\n" + +#: ../src/geotag_exif.c:670 +msgid "This shouldn't happen!" +msgstr "这个不可能发生!" + +#: ../src/geotag_exif.c:740 +msgid "Not yet implemented!" +msgstr "还没实现!" + +#: ../src/geotag_exif.c:753 +msgid "Warning; Too many components specified!" +msgstr "警告;太多指定组件!" + +#: ../src/osm-traces.c:87 +msgid "Identifiable (public w/ timestamps)" +msgstr "可识别(公开且带时间戳的)" + +#: ../src/osm-traces.c:88 +msgid "Trackable (private w/ timestamps)" +msgstr "可跟踪(私有且带时间戳的)" + +#: ../src/osm-traces.c:89 +msgid "Public" +msgstr "公开" + +#: ../src/osm-traces.c:90 +msgid "Private" +msgstr "私有" + +#: ../src/osm-traces.c:108 +msgid "Access Token:" +msgstr "" + +#: ../src/osm-traces.c:108 +msgid "Get New OSM Access Tokens" +msgstr "" + +#: ../src/osm-traces.c:109 +msgid "Access Token Key:" +msgstr "" + +#: ../src/osm-traces.c:110 +msgid "Access Token Secret:" +msgstr "" + +#: ../src/osm-traces.c:111 +msgid "OSM username:" +msgstr "OSM(OpenStreetMap开源街图)用户名:" + +#: ../src/osm-traces.c:112 +msgid "OSM password:" +msgstr "OSM(OpenStreetMap开源街图)密码:" + +#. Check to really override existing values... +#: ../src/osm-traces.c:263 +msgid "Do you want to overwrite existing values?" +msgstr "" + +#: ../src/osm-traces.c:275 +msgid "Not able to generate OSM request tokens." +msgstr "" + +#: ../src/osm-traces.c:299 +msgid "" +"Waiting for authorization approval.\n" +"Ensure you have granted access at the website before continuing here." +msgstr "" + +#: ../src/osm-traces.c:315 +#, fuzzy +msgid "No Authorization." +msgstr "自动定位" + +#: ../src/osm-traces.c:354 +msgid "" +"OSM Username and Password preferences are not required anymore. You can now " +"remove them." +msgstr "" + +#. Preferences +#: ../src/osm-traces.c:379 +msgid "OpenStreetMap Traces" +msgstr "OpenStreetMap(开源街图)轨迹" + +#: ../src/osm-traces.c:504 +#, c-format +msgid "failed to upload data: HTTP response is %ld" +msgstr "无法上传数据:HTTP回应%ld" + +#: ../src/osm-traces.c:509 +#, c-format +msgid "curl_easy_getinfo failed: %d" +msgstr "curl_easy_getinfo函数失效:%d" + +#: ../src/osm-traces.c:514 +#, c-format +msgid "curl request failed: %s" +msgstr "curl程序请求失败:%s" + +#. Success +#: ../src/osm-traces.c:592 +msgid "Uploaded to OSM" +msgstr "已上传到OSM(OpenStreetMap开源街图)" + +#: ../src/osm-traces.c:596 +msgid "" +"FAILED TO UPLOAD DATA TO OSM - Ensure the OSM access token preferences are " +"setup." +msgstr "" + +#: ../src/osm-traces.c:599 +msgid "FAILED TO UPLOAD DATA TO OSM - CURL PROBLEM" +msgstr "无法上传数据到OSM(OpenStreetMap开源街图)-CURL程序有问题" + +#: ../src/osm-traces.c:602 +msgid "FAILED TO UPLOAD DATA TO OSM" +msgstr "无法上传数据到OSM(OpenStreetMap开源街图)" + +#: ../src/osm-traces.c:602 +msgid "HTTP response code" +msgstr "HTTP回应代码" + +#: ../src/osm-traces.c:610 +#, c-format +msgid "failed to unlink temporary file: %s" +msgstr "无法断开链接临时文件:%s" + +#: ../src/osm-traces.c:664 +msgid "OSM upload" +msgstr "OSM上传" + +#: ../src/osm-traces.c:689 +#, fuzzy +msgid "" +"The email/username used as login\n" +"Enter the email/username you use to login into www.openstreetmap.org." +"" +msgstr "" +"邮件账户\n" +"输入要登录www.openstreetmap.org网站的邮件账户。" + +#: ../src/osm-traces.c:697 +msgid "" +"The password used to login\n" +"Enter the password you use to login into www.openstreetmap.org." +msgstr "" +"密码\n" +"输入要登录www.openstreetmap.org网站的密码。" + +#: ../src/osm-traces.c:703 +msgid "File's name:" +msgstr "文件名:" + +#: ../src/osm-traces.c:713 +msgid "" +"The name of the file on OSM\n" +"This is the name of the file created on the server.This is not the " +"name of the local file." +msgstr "" +"位于OSM(OpenStreetMap开源街图)上的文件名\n" +"指要在服务器上创建的文件的名字。不是本机的文件的名字。" + +#: ../src/osm-traces.c:717 ../src/viktrwlayer_wpwin.c:197 +#: ../src/viktrwlayer_wpwin.c:199 +msgid "Description:" +msgstr "说明:" + +#: ../src/osm-traces.c:731 +msgid "The description of the trace" +msgstr "轨迹说明" + +#: ../src/osm-traces.c:734 +msgid "Anonymize Times:" +msgstr "匿名化时间:" + +#: ../src/osm-traces.c:739 +msgid "" +"Anonymize times of the trace.\n" +"You may choose to make the trace identifiable, yet mask the actual " +"real time values" +msgstr "匿名化轨迹时间" + +#: ../src/osm-traces.c:743 +msgid "Tags:" +msgstr "标签:" + +#: ../src/osm-traces.c:751 +msgid "The tags associated to the trace" +msgstr "轨迹相关标签" + +#: ../src/osm-traces.c:816 +#, c-format +msgid "Uploading %s to OSM" +msgstr "上传%s到OSM(OpenStreetMap开源街图)" + +#: ../src/mapcache.c:67 +msgid "Map cache memory size (MB):" +msgstr "地图缓存的内存大小:" + +#. NB Can have a couple hundred fonts loaded when using system directories +#. So ATM don't list them all - otherwise need better GUI feedback display. +#: ../src/mapnik_interface.cpp:324 +#, c-format +msgid "" +"%s %s\n" +"Plugins=%sFonts loaded=%d" +msgstr "" +"%s %s\n" +"插件=%s已加载字体=%d" + +#: ../src/mapnik_interface.cpp:325 ../src/vikmapniklayer.c:278 +msgid "Mapnik" +msgstr "Mapnik程序" + +#: ../src/print.c:51 ../src/viktrwlayer.c:572 +msgid "None" +msgstr "无" + +#: ../src/print.c:52 +msgid "Horizontally" +msgstr "水平的" + +#: ../src/print.c:53 +msgid "Vertically" +msgstr "垂直的" + +#: ../src/print.c:54 +msgid "Both" +msgstr "都是" + +#: ../src/print.c:118 +msgid "Image Settings" +msgstr "图像设置" + +#: ../src/print.c:551 +msgid "done" +msgstr "完成" + +#. Page Size +#: ../src/print.c:580 +msgid "_Adjust Page Size and Orientation" +msgstr "调整页面大小和方向(_A)" + +#: ../src/print.c:596 +msgid "C_enter:" +msgstr "中心(_e):" + +#. ignore page margins +#: ../src/print.c:614 +msgid "Ignore Page _Margins" +msgstr "忽略页边距(_M)" + +#: ../src/print.c:633 +msgid "Image S_ize:" +msgstr "图像大小(_i):" + +#: ../src/ui_util.c:88 +#, c-format +msgid "Could not launch web browser. %s" +msgstr "打不开浏览器。%s" + +#: ../src/ui_util.c:101 +#, c-format +msgid "Could not create new email. %s" +msgstr "无法创建新邮件。%s" + +#: ../src/vikcoordlayer.c:57 +msgid "Color:" +msgstr "颜色:" + +#: ../src/vikcoordlayer.c:58 +msgid "Minutes Width:" +msgstr "分钟的宽度:" + +#: ../src/vikcoordlayer.c:59 +msgid "Line Thickness:" +msgstr "线宽:" + +#: ../src/vikcoordlayer.c:66 +msgid "Coordinate" +msgstr "坐标" + +#: ../src/main.c:92 +#, c-format +msgid "Ignoring Xlib error: error code %d request code %d\n" +msgstr "忽略Xlib组件错误:错误代码%d请求代码%d\n" + +#: ../src/main.c:111 +msgid "Enable debug output" +msgstr "启用调试输出" + +#: ../src/main.c:112 +msgid "Enable verbose output" +msgstr "启用详细输出" + +#: ../src/main.c:113 +msgid "Show version" +msgstr "显示版本" + +#: ../src/main.c:114 +msgid "Latitude in decimal degrees" +msgstr "纬度用十进制" + +#: ../src/main.c:115 +msgid "Longitude in decimal degrees" +msgstr "经度用十进制" + +#: ../src/main.c:116 +msgid "Zoom Level (OSM). Value can be 0 - 22" +msgstr "缩放比例(OSM)。值在0至22之间" + +#: ../src/main.c:117 +msgid "Add a map layer by id value. Use 0 for the default map." +msgstr "以指定识别号添加图层。用0指代默认层。" + +#: ../src/main.c:160 +#, c-format +msgid "" +"%s %s\n" +"Copyright (c) 2003-2008 Evan Battaglia\n" +"Copyright (c) 2008-%s Viking's contributors\n" +msgstr "" + +#: ../src/osm.c:50 +#, fuzzy +msgid "OpenStreetMap (Mapnik)" +msgstr "OpenStreetMap(开源街图)轨迹" + +#: ../src/osm.c:65 +#, fuzzy +msgid "OpenStreetMap (Cycle)" +msgstr "OpenStreetMap(开源街图)轨迹" + +#: ../src/osm.c:79 +#, fuzzy +msgid "OpenStreetMap (Transport)" +msgstr "OpenStreetMap(开源街图)轨迹" + +#: ../src/osm.c:95 +#, fuzzy +msgid "OpenStreetMap (Humanitarian)" +msgstr "OpenStreetMap(开源街图)轨迹" + +#: ../src/osm.c:111 +msgid "On Disk OSM Tile Format" +msgstr "保存在磁盘上的OSM瓦片文件格式" + +#: ../src/osm.c:121 +msgid "MBTiles File" +msgstr "MBTiles文件" + +#: ../src/osm.c:132 +msgid "OSM Metatiles" +msgstr "OSM元数据" + +#: ../src/osm.c:146 +msgid "Mapbox Outdoors" +msgstr "" + +#: ../src/osm.c:153 +msgid "Mapbox Specific" +msgstr "" + +#: ../src/osm.c:170 +msgid "OSM (view)" +msgstr "OSM(查看)" + +#: ../src/osm.c:174 +msgid "OSM (edit)" +msgstr "OSM(编辑)" + +#. Note the use of positional parameters +#: ../src/osm.c:179 +msgid "OSM (query)" +msgstr "OSM(查询)" + +#: ../src/osm.c:183 +msgid "OSM (render)" +msgstr "OSM(渲染)" + +#. Example: http://127.0.0.1:8111/load_and_zoom?left=8.19&right=8.20&top=48.605&bottom=48.590&select=node413602999 +#. JOSM or merkaartor must already be running with remote interface enabled +#: ../src/osm.c:190 +msgid "Local port 8111 (eg JOSM)" +msgstr "本地端口8111(比如JOSM)" + +#: ../src/osm.c:195 +msgid "Geofabrik Map Compare" +msgstr "Geofabrik地图对比" + +#: ../src/osm.c:203 +msgid "OpenStreetMap Notes" +msgstr "OpenStreetMap(开源街图)注释" + +#. Not really OSM but can't be bothered to create somewhere else to put it... +#: ../src/osm.c:221 +msgid "Wikimedia Toolserver GeoHack" +msgstr "维基百科工具服务器GeoHack" + +#: ../src/preferences.c:195 +msgid "Preferences" +msgstr "首选项" + +#: ../src/toolbar.c:91 ../src/toolbar.c:92 +msgid "System Default" +msgstr "系统默认" + +#: ../src/toolbar.c:91 ../src/viktrwlayer.c:563 +msgid "Small" +msgstr "小" + +#: ../src/toolbar.c:91 ../src/viktrwlayer.c:564 +msgid "Medium" +msgstr "中" + +#: ../src/toolbar.c:91 ../src/viktrwlayer.c:565 +msgid "Large" +msgstr "大" + +#: ../src/toolbar.c:92 +msgid "Icons Only" +msgstr "仅图标" + +#: ../src/toolbar.c:92 +msgid "Text Only" +msgstr "仅文本" + +#: ../src/toolbar.c:92 +msgid "Icons and Text" +msgstr "图标和文本" + +#: ../src/toolbar.c:106 +msgid "Append to Menu:" +msgstr "添加到菜单:" + +#: ../src/toolbar.c:107 +msgid "Pack the toolbar to the main menu to save vertical space" +msgstr "把工具栏放在菜单中以节省垂直空间" + +#: ../src/toolbar.c:108 +msgid "Icon Size:" +msgstr "图标大小:" + +#: ../src/toolbar.c:110 +msgid "Icon Style:" +msgstr "图标风格:" + +#: ../src/toolbar.c:112 +msgid "Customize:" +msgstr "定制:" + +#: ../src/toolbar.c:112 +msgid "Customize Buttons" +msgstr "定制按钮" + +#. Preferences +#: ../src/toolbar.c:145 +msgid "Toolbar" +msgstr "工具栏" + +#: ../src/toolbar.c:312 +msgid "_Customize" +msgstr "定制(_C)" + +#: ../src/toolbar.c:641 +msgid "Separator" +msgstr "分隔符" + +#: ../src/toolbar.c:642 +msgid "--- Separator ---" +msgstr "--- 分隔符 ---" + +#: ../src/toolbar.c:1007 +msgid "Customize Toolbar" +msgstr "定制工具栏" + +#: ../src/toolbar.c:1028 +msgid "" +"Select items to be displayed on the toolbar. Items can be reordered by drag " +"and drop." +msgstr "选择要在工具栏上显示的条目。可以拖放各条目调整顺序。" + +#: ../src/toolbar.c:1044 +msgid "Available Items" +msgstr "可用条目" + +#: ../src/toolbar.c:1065 +msgid "Displayed Items" +msgstr "已显示的条目" + +#: ../src/viklayer_defaults.c:232 +#, c-format +msgid "Could not open file: %s" +msgstr "不能打开文件:%s" + +#: ../src/viklayer_defaults.c:304 +msgid "Layer Defaults" +msgstr "层的默认设置" + +#: ../src/uibuilder.c:196 +msgid "Take care that this password will be stored clearly in a plain file." +msgstr "请注意此密码将以明文保存在文本文件中。" + +#: ../src/uibuilder.c:628 ../src/viktrwlayer_export.c:188 +#: ../src/viktrwlayer_export.c:304 ../src/vikwindow.c:3666 +#: ../src/vikwindow.c:4408 +#, c-format +msgid "The file \"%s\" exists, do you wish to overwrite it?" +msgstr "文件“%s”已存在。确定要覆盖?" + +#: ../src/vikaggregatelayer.c:41 +msgid "Aggregate" +msgstr "聚集" + +#: ../src/vikaggregatelayer.c:528 ../src/viktrwlayer.c:11700 +#, c-format +msgid "%s: Waypoint List" +msgstr "%s:路标列表" + +#: ../src/vikaggregatelayer.c:570 +msgid "Search by Date" +msgstr "用日期搜索" + +#: ../src/vikaggregatelayer.c:576 +msgid "No items found with the requested date." +msgstr "找不到与该请求数据相关条目。" + +#: ../src/vikaggregatelayer.c:615 ../src/viktrwlayer.c:11691 +#, c-format +msgid "%s: Track and Route List" +msgstr "%s:轨迹和路线列表" + +#: ../src/vikaggregatelayer.c:681 ../src/viktrwlayer.c:8346 +#: ../src/viktrwlayer.c:8417 ../src/viktrwlayer.c:8494 +msgid "_Visibility" +msgstr "可见性(_V)" + +#: ../src/vikaggregatelayer.c:686 +msgid "_Show All" +msgstr "显示全部(_S)" + +#: ../src/vikaggregatelayer.c:692 +msgid "_Hide All" +msgstr "隐藏全部(_H)" + +#: ../src/vikaggregatelayer.c:698 ../src/viktrwlayer.c:8363 +#: ../src/viktrwlayer.c:8434 ../src/viktrwlayer.c:8511 +msgid "_Toggle" +msgstr "切换(_T)" + +#: ../src/vikaggregatelayer.c:705 ../src/viktrwlayer.c:8532 +msgid "_Sort" +msgstr "排序(_S)" + +#: ../src/vikaggregatelayer.c:711 ../src/viktrwlayer.c:8538 +msgid "Name _Ascending" +msgstr "名字升序(_A)" + +#: ../src/vikaggregatelayer.c:717 ../src/viktrwlayer.c:8544 +msgid "Name _Descending" +msgstr "名字降序(_D)" + +#: ../src/vikaggregatelayer.c:723 ../src/viktrwlayer.c:575 +#: ../src/viktrwlayer.c:8550 +msgid "Date Ascending" +msgstr "日期升序" + +#: ../src/vikaggregatelayer.c:729 ../src/viktrwlayer.c:576 +#: ../src/viktrwlayer.c:8556 +msgid "Date Descending" +msgstr "日期降序" + +#: ../src/vikaggregatelayer.c:735 ../src/viktrwlayer.c:8445 +#: ../src/viktrwlayer.c:8523 ../src/viktrwlayer.c:8595 +#: ../src/viktrwlayer_tracklist.c:296 +msgid "_Statistics" +msgstr "统计(_S)" + +#: ../src/vikaggregatelayer.c:740 ../src/viktrwlayer.c:4533 +msgid "Track _List..." +msgstr "轨迹列表(_L)…" + +#: ../src/vikaggregatelayer.c:746 ../src/viktrwlayer.c:4540 +msgid "_Waypoint List..." +msgstr "路标列表(_W)…" + +#: ../src/vikaggregatelayer.c:753 +msgid "Searc_h" +msgstr "搜索(_h)" + +#: ../src/vikaggregatelayer.c:759 +msgid "By _Date..." +msgstr "按日期(_D)…" + +#: ../src/vikaggregatelayer.c:762 +msgid "Find the first item with a specified date" +msgstr "以指定日期查找第一个条目" + +#: ../src/vikaggregatelayer.c:765 +msgid "Load E_xternal Layers" +msgstr "" + +#. Could have a more complicated tooltip that numbers each type of layers, +#. but for now a simple overall count +#: ../src/vikaggregatelayer.c:1011 +#, c-format +msgid "One layer" +msgid_plural "%d layers" +msgstr[0] "%d层" + +#: ../src/vikaggregatelayer.c:1014 +#, fuzzy, c-format +msgid "Empty" +msgstr "清空全部(_A)" + +#: ../src/vikdemlayer.c:86 +msgid "SRTM Global 90m (3 arcsec)" +msgstr "" + +#: ../src/vikdemlayer.c:94 +msgid "Absolute height" +msgstr "绝对高度" + +#: ../src/vikdemlayer.c:95 +msgid "Height gradient" +msgstr "高度梯度" + +#: ../src/vikdemlayer.c:120 +msgid "DEM Files:" +msgstr "DEM文件:" + +#: ../src/vikdemlayer.c:121 +msgid "Download Source:" +msgstr "下载源:" + +#: ../src/vikdemlayer.c:122 +msgid "Min Elev Color:" +msgstr "最低高程颜色:" + +#: ../src/vikdemlayer.c:123 ../src/viktrwlayer_wpwin.c:207 +msgid "Type:" +msgstr "类型:" + +#: ../src/vikdemlayer.c:124 +msgid "Min Elev:" +msgstr "最低高程:" + +#: ../src/vikdemlayer.c:125 +msgid "Max Elev:" +msgstr "最高高程:" + +#: ../src/vikdemlayer.c:137 +msgid "_DEM Download" +msgstr "DEM下载(_D)" + +#: ../src/vikdemlayer.c:137 +msgid "DEM Download" +msgstr "DEM下载" + +#: ../src/vikdemlayer.c:192 +msgid "DEM" +msgstr "DEM(数字高程模型)" + +#: ../src/vikdemlayer.c:304 +#, c-format +msgid "Number of files: %d" +msgstr "文件数量:%d" + +#: ../src/vikdemlayer.c:446 +msgid "DEM Loading" +msgstr "正加载DEM(数字高程模型)" + +#: ../src/vikdemlayer.c:927 +#, c-format +msgid "No SRTM data available for %f, %f" +msgstr "无可用SRTM(航天飞机雷达测地任务)数据给%f,%f" + +#: ../src/vikdemlayer.c:948 +#, c-format +msgid "DEM download failure for %f, %f" +msgstr "DEM(数字高程模型)加载失败%f,%f" + +#: ../src/vikdemlayer.c:954 +#, c-format +msgid "DEM write failure for %s" +msgstr "DEM(数字高程模型)写入失败%s" + +#. Probably not over any land... +#: ../src/vikdemlayer.c:1201 +msgid "No DEM File Available" +msgstr "无可用DEM(数字高程模型)文件" + +#: ../src/vikdemlayer.c:1220 +#, c-format +msgid "" +"\n" +"Source: %s\n" +"\n" +"DEM File: %s\n" +"DEM File Timestamp: %s" +msgstr "" +"\n" +"来源:%s\n" +"\n" +"DEM文件:%s\n" +"DEM文件时间戳:%s" + +#: ../src/vikdemlayer.c:1224 +#, c-format +msgid "" +"Source: %s\n" +"\n" +"No DEM File!" +msgstr "" +"来源:%s\n" +"\n" +"无DEM文件!" + +#: ../src/vikdemlayer.c:1264 +#, c-format +msgid "Downloading DEM %s" +msgstr "正下载DEM%s" + +#: ../src/vikdemlayer.c:1289 +msgid "_Show DEM File Information" +msgstr "显示DEM文件信息(_S)" + +#: ../src/vikfileentry.c:72 +msgid "Browse..." +msgstr "浏览…" + +#: ../src/vikfileentry.c:103 +msgid "Choose file" +msgstr "选择文件" + +#: ../src/vikfileentry.c:120 ../src/vikwindow.c:4372 +msgid "PNG" +msgstr "PNG文件" + +#: ../src/vikfileentry.c:125 +msgid "TIFF" +msgstr "TIFF文件" + +#: ../src/vikfileentry.c:133 +msgid "MBTiles" +msgstr "MBTiles文件" + +#: ../src/vikfileentry.c:142 +msgid "XML" +msgstr "XML文件" + +#: ../src/vikfileentry.c:149 +msgid "MML" +msgstr "MML文件" + +#: ../src/vikfileentry.c:154 +msgid "MSS" +msgstr "MSS文件" + +#: ../src/vikfilelist.c:49 +msgid "Choose file(s)" +msgstr "选择文件" + +#: ../src/vikfilelist.c:182 +msgid "Add..." +msgstr "添加…" + +#: ../src/vikfilelist.c:183 +msgid "Delete" +msgstr "删除" + +#: ../src/vikgeoreflayer.c:97 +msgid "_Georef Move Map" +msgstr "Georef移动地图(_G)" + +#: ../src/vikgeoreflayer.c:97 +msgid "Georef Move Map" +msgstr "Georef移动地图" + +#: ../src/vikgeoreflayer.c:106 +msgid "Georef Z_oom Tool" +msgstr "Georef缩放工具(_o)" + +#: ../src/vikgeoreflayer.c:106 +msgid "Georef Zoom Tool" +msgstr "Georef缩放工具" + +#: ../src/vikgeoreflayer.c:117 +msgid "GeoRef Map" +msgstr "Georef地图" + +#: ../src/vikgeoreflayer.c:214 +msgid "Auto Read World Files:" +msgstr "自动读取世界文件:" + +#: ../src/vikgeoreflayer.c:215 +msgid "" +"Automatically attempt to read associated world file of a new image for a " +"GeoRef layer" +msgstr "自动尝试读取GeoRef图层新图像相关世界文件" + +#: ../src/vikgeoreflayer.c:511 ../src/vikgeoreflayer.c:797 +#: ../src/vikmapslayer.c:1174 +#, c-format +msgid "Couldn't open image file: %s" +msgstr "打不开图像文件:%s" + +#: ../src/vikgeoreflayer.c:607 ../src/vikgeoreflayer.c:633 +msgid "Choose World file" +msgstr "选择世界文件" + +#: ../src/vikgeoreflayer.c:619 +msgid "The World file you requested could not be opened for reading." +msgstr "所求世界文件打不开来读取。" + +#: ../src/vikgeoreflayer.c:621 +msgid "Unexpected end of file reading World file." +msgstr "未料到的文件尾于读取世界文件时。" + +#: ../src/vikgeoreflayer.c:646 +msgid "The file you requested could not be opened for writing." +msgstr "打不开指定文件来写入内容。" + +#: ../src/vikgeoreflayer.c:782 +msgid "Lower right corner values may not be consistent with upper right values" +msgstr "右下角值与右上角值不一致" + +#: ../src/vikgeoreflayer.c:806 +#, c-format +msgid "Invalid image size: %s" +msgstr "无效的图像大小:%s" + +#: ../src/vikgeoreflayer.c:831 ../src/viklayer.c:561 ../src/vikwindow.c:4891 +msgid "Layer Properties" +msgstr "图层属性" + +#: ../src/vikgeoreflayer.c:852 +msgid "World File Parameters:" +msgstr "世界文件参数:" + +#: ../src/vikgeoreflayer.c:853 +msgid "Load From File..." +msgstr "从文件装入…" + +#: ../src/vikgeoreflayer.c:858 +msgid "Corner pixel easting:" +msgstr "角像素东进:" + +#: ../src/vikgeoreflayer.c:860 +msgid "the UTM \"easting\" value of the upper-left corner pixel of the map" +msgstr "地图左上方像素的UTM(通用横墨卡托投影)“东进”值" + +#: ../src/vikgeoreflayer.c:862 +msgid "Corner pixel northing:" +msgstr "角像素北进:" + +#: ../src/vikgeoreflayer.c:864 +msgid "the UTM \"northing\" value of the upper-left corner pixel of the map" +msgstr "地图左上方像素的UTM(通用横墨卡托投影)“北进”值" + +#: ../src/vikgeoreflayer.c:866 +msgid "X (easting) scale (mpp): " +msgstr "X(东进)放大系数(米每像素): " + +#: ../src/vikgeoreflayer.c:867 +msgid "Y (northing) scale (mpp): " +msgstr "Y(北进)放大系数(米每像素): " + +#: ../src/vikgeoreflayer.c:870 +msgid "the scale of the map in the X direction (meters per pixel)" +msgstr "X方向地图放大系数(米每像素)" + +#: ../src/vikgeoreflayer.c:872 +msgid "the scale of the map in the Y direction (meters per pixel)" +msgstr "Y方向地图放大系数(米每像素)" + +#: ../src/vikgeoreflayer.c:874 +msgid "Map Image:" +msgstr "地图图像:" + +#: ../src/vikgeoreflayer.c:919 +msgid "Upper left latitude:" +msgstr "左上角纬度:" + +#: ../src/vikgeoreflayer.c:921 +msgid "Upper left longitude:" +msgstr "左上角经度:" + +#: ../src/vikgeoreflayer.c:923 +msgid "Lower right latitude:" +msgstr "右下角维度:" + +#: ../src/vikgeoreflayer.c:925 +msgid "Lower right longitude:" +msgstr "右下角经度:" + +#: ../src/vikgeoreflayer.c:937 +msgid "Calculate MPP values from coordinates" +msgstr "从坐标计算米每像素值" + +#: ../src/vikgeoreflayer.c:938 +msgid "" +"Enter all corner coordinates before calculating the MPP values from the " +"image size" +msgstr "请从图像大小计算米每像素值前输入全部坐标" + +#: ../src/vikgeoreflayer.c:948 +msgid "UTM" +msgstr "UTM(通用横墨卡托投影)" + +#: ../src/vikgeoreflayer.c:949 +msgid "Latitude/Longitude" +msgstr "维度/经度" + +#: ../src/vikgeoreflayer.c:957 ../src/vikmapniklayer.c:82 +#: ../src/vikmapslayer.c:158 +msgid "Alpha:" +msgstr "透明度:" + +#. Now with icons +#: ../src/vikgeoreflayer.c:1062 +msgid "_Zoom to Fit Map" +msgstr "缩放到布满地图(_Z)" + +#: ../src/vikgeoreflayer.c:1068 +msgid "_Goto Map Center" +msgstr "去地图中心(_G)" + +#: ../src/vikgeoreflayer.c:1074 +msgid "_Export to World File" +msgstr "导出到世界文件(_E)" + +#: ../src/vikgoto.c:98 +msgid "No goto tool available." +msgstr "无转移工具可用。" + +#: ../src/vikgoto.c:295 +msgid "goto" +msgstr "转移" + +#: ../src/vikgoto.c:297 +msgid "goto provider:" +msgstr "转移工具提供者:" + +#: ../src/vikgoto.c:312 +msgid "Enter address or place name:" +msgstr "输入地址或地点名称:" + +#: ../src/vikgoto.c:487 +msgid "Locality" +msgstr "所在地" + +#: ../src/vikgpslayer.c:137 +msgid "Data Mode" +msgstr "数据模式" + +#: ../src/vikgpslayer.c:139 +msgid "Realtime Tracking Mode" +msgstr "实时跟踪模式" + +#: ../src/vikgpslayer.c:176 +msgid "Keep vehicle at center" +msgstr "保持车辆在中心" + +#: ../src/vikgpslayer.c:177 +msgid "Keep vehicle on screen" +msgstr "保存车辆在屏幕内" + +#: ../src/vikgpslayer.c:178 +msgid "Disable" +msgstr "停用" + +#: ../src/vikgpslayer.c:218 +msgid "Download Tracks:" +msgstr "下载轨迹:" + +#: ../src/vikgpslayer.c:219 +msgid "Upload Tracks:" +msgstr "上传轨迹:" + +#: ../src/vikgpslayer.c:220 +msgid "Download Routes:" +msgstr "下载路线:" + +#: ../src/vikgpslayer.c:221 +msgid "Upload Routes:" +msgstr "上传路线:" + +#: ../src/vikgpslayer.c:222 +msgid "Download Waypoints:" +msgstr "下载路标:" + +#: ../src/vikgpslayer.c:223 +msgid "Upload Waypoints:" +msgstr "上传路标:" + +#: ../src/vikgpslayer.c:225 +msgid "Recording tracks" +msgstr "正在纪录轨迹" + +#: ../src/vikgpslayer.c:226 +msgid "Jump to current position on start" +msgstr "开始时到当前位置" + +#: ../src/vikgpslayer.c:227 +msgid "Moving Map Method:" +msgstr "移动地图方法:" + +#: ../src/vikgpslayer.c:228 +msgid "Update Statusbar:" +msgstr "更新状态栏:" + +#: ../src/vikgpslayer.c:228 +msgid "Display information in the statusbar on GPS updates" +msgstr "GPS更新时在状态栏显示信息" + +#: ../src/vikgpslayer.c:229 +#, fuzzy +msgid "Auto Connect" +msgstr "自动定位" + +#: ../src/vikgpslayer.c:229 +msgid "Automatically connect to GPSD" +msgstr "" + +#: ../src/vikgpslayer.c:230 +msgid "Gpsd Host:" +msgstr "Gpsd主机:" + +#: ../src/vikgpslayer.c:231 +msgid "Gpsd Port:" +msgstr "Gpsd端口:" + +#: ../src/vikgpslayer.c:232 +msgid "Gpsd Retry Interval (seconds):" +msgstr "Gpsd重试间隔(秒):" + +#: ../src/vikgpslayer.c:254 +msgid "GPS" +msgstr "GPS" + +#: ../src/vikgpslayer.c:320 ../src/vikgpslayer.c:1504 +msgid "GPS Download" +msgstr "GPS下载" + +#: ../src/vikgpslayer.c:320 ../src/vikgpslayer.c:1504 ../src/viktrwlayer.c:3993 +msgid "GPS Upload" +msgstr "GPS上传" + +#: ../src/vikgpslayer.c:322 +msgid "GPS Realtime Tracking" +msgstr "GPS实时跟踪" + +#: ../src/vikgpslayer.c:458 +msgid "Connected" +msgstr "" + +#: ../src/vikgpslayer.c:460 +msgid "Disconnected" +msgstr "" + +#: ../src/vikgpslayer.c:554 +msgid "Unknown GPS Protocol" +msgstr "未知GPS协议" + +#: ../src/vikgpslayer.c:572 +msgid "Unknown serial port device" +msgstr "未知串口设备" + +#: ../src/vikgpslayer.c:691 +#, c-format +msgid "%s: unknown parameter" +msgstr "%s:未知参数" + +#. Now with icons +#: ../src/vikgpslayer.c:794 +msgid "_Upload to GPS" +msgstr "上传到GPS(_U)" + +#: ../src/vikgpslayer.c:800 +msgid "Download from _GPS" +msgstr "从_GPS下载" + +#: ../src/vikgpslayer.c:821 +msgid "Empty _Realtime" +msgstr "清空实时(_R)" + +#: ../src/vikgpslayer.c:828 +msgid "E_mpty Upload" +msgstr "清空上传(_m)" + +#: ../src/vikgpslayer.c:834 +msgid "_Empty Download" +msgstr "清空下载(_E)" + +#: ../src/vikgpslayer.c:840 +msgid "Empty _All" +msgstr "清空全部(_A)" + +#: ../src/vikgpslayer.c:852 +#, c-format +msgid "Unexpected number of disconnected handlers: %d" +msgstr "未料到数量的断开的处理程序:%d" + +#: ../src/vikgpslayer.c:995 +#, c-format +msgid "Uploading %d waypoint..." +msgid_plural "Uploading %d waypoints..." +msgstr[0] "正上传%d路标…" + +#: ../src/vikgpslayer.c:1000 +#, c-format +msgid "Uploading %d trackpoint..." +msgid_plural "Uploading %d trackpoints..." +msgstr[0] "正上传%d轨迹点…" + +#: ../src/vikgpslayer.c:1005 +#, c-format +msgid "Uploading %d routepoint..." +msgid_plural "Uploading %d routepoints..." +msgstr[0] "正上传%d路线点…" + +#: ../src/vikgpslayer.c:1034 +#, c-format +msgid "Downloaded %d out of %d waypoint..." +msgid_plural "Downloaded %d out of %d waypoints..." +msgstr[0] "已下载%d,总共%d路标…" + +#: ../src/vikgpslayer.c:1040 +#, c-format +msgid "Downloaded %d out of %d trackpoint..." +msgid_plural "Downloaded %d out of %d trackpoints..." +msgstr[0] "已下载%d,总共%d轨迹点…" + +#: ../src/vikgpslayer.c:1046 +#, c-format +msgid "Downloaded %d out of %d routepoint..." +msgid_plural "Downloaded %d out of %d routepoints..." +msgstr[0] "已下载%d,总共%d路线点…" + +#: ../src/vikgpslayer.c:1056 +#, c-format +msgid "Uploaded %d out of %d waypoint..." +msgid_plural "Uploaded %d out of %d waypoints..." +msgstr[0] "已上传%d,总共%d路标…" + +#: ../src/vikgpslayer.c:1062 +#, c-format +msgid "Uploaded %d out of %d trackpoint..." +msgid_plural "Uploaded %d out of %d trackpoints..." +msgstr[0] "已上传%d,总共%d轨迹点…" + +#: ../src/vikgpslayer.c:1068 +#, c-format +msgid "Uploaded %d out of %d routepoint..." +msgid_plural "Uploaded %d out of %d routepoints..." +msgstr[0] "已上传%d,总共%d路线点…" + +#: ../src/vikgpslayer.c:1079 +#, c-format +msgid "Downloaded %d waypoint" +msgid_plural "Downloaded %d waypoints" +msgstr[0] "已下载%d路标" + +#: ../src/vikgpslayer.c:1085 +#, c-format +msgid "Downloaded %d trackpoint" +msgid_plural "Downloaded %d trackpoints" +msgstr[0] "已下载%d轨迹点" + +#: ../src/vikgpslayer.c:1091 +#, c-format +msgid "Downloaded %d routepoint" +msgid_plural "Downloaded %d routepoints" +msgstr[0] "已下载%d路线点" + +#: ../src/vikgpslayer.c:1101 +#, c-format +msgid "Uploaded %d waypoint" +msgid_plural "Uploaded %d waypoints" +msgstr[0] "已上传%d路标" + +#: ../src/vikgpslayer.c:1107 +#, c-format +msgid "Uploaded %d trackpoint" +msgid_plural "Uploaded %d trackpoints" +msgstr[0] "已上传%d轨迹点" + +#: ../src/vikgpslayer.c:1113 +#, c-format +msgid "Uploaded %d routepoint" +msgid_plural "Uploaded %d routepoints" +msgstr[0] "已上传%d路线点" + +#: ../src/vikgpslayer.c:1363 +msgid "Error: No result." +msgstr "" + +#: ../src/vikgpslayer.c:1471 +msgid "Warning - GPS Upload items may overwrite each other" +msgstr "警告-GPS上传条目可能覆盖彼此" + +#: ../src/vikgpslayer.c:1506 +msgid "Status: detecting gpsbabel" +msgstr "状态: 正在检测gpsbabel程序" + +#: ../src/vikgpslayer.c:1533 +msgid "No GPS items selected for transfer." +msgstr "无GPS条目选中来发送。" + +#: ../src/vikgpslayer.c:1546 +msgid "Could not turn off device." +msgstr "无法关闭设备。" + +#: ../src/vikgpslayer.c:1589 +msgid "Are you sure you want to delete GPS Upload data?" +msgstr "确定要删除GPS上传数据?" + +#: ../src/vikgpslayer.c:1602 +msgid "Are you sure you want to delete GPS Download data?" +msgstr "确定要删除GPS下载数据?" + +#: ../src/vikgpslayer.c:1616 +msgid "Are you sure you want to delete GPS Realtime data?" +msgstr "确定要删除GPS实时数据?" + +#: ../src/vikgpslayer.c:1630 +msgid "Are you sure you want to delete All GPS data?" +msgstr "确定要删除全部GPS数据?" + +#: ../src/vikgpslayer.c:2004 +#, c-format +msgid "" +"Failed to connect to gpsd at %s (port %s)\n" +"Should Viking keep trying (every %d seconds)?" +msgstr "" + +#: ../src/viklayerspanel.c:73 +msgid "C_ut" +msgstr "剪切(_U)" + +#: ../src/viklayerspanel.c:74 ../src/vikwindow.c:4882 +msgid "_Copy" +msgstr "拷贝(_C)" + +#: ../src/viklayerspanel.c:75 ../src/vikwindow.c:4883 +msgid "_Paste" +msgstr "粘贴(_P)" + +#: ../src/viklayerspanel.c:76 ../src/vikwindow.c:4884 +msgid "_Delete" +msgstr "删除(_D)" + +#: ../src/viklayerspanel.c:154 +msgid "New Layer" +msgstr "新层" + +#: ../src/viklayerspanel.c:347 +msgid "Top Layer" +msgstr "顶层" + +#: ../src/viklayerspanel.c:363 +msgid "Add new layer" +msgstr "添加新层" + +#: ../src/viklayerspanel.c:370 ../src/vikwindow.c:4884 +msgid "Remove selected layer" +msgstr "删除所选层" + +#: ../src/viklayerspanel.c:377 +msgid "Move selected layer up" +msgstr "移上所选层" + +#: ../src/viklayerspanel.c:384 +msgid "Move selected layer down" +msgstr "移下所选层" + +#: ../src/viklayerspanel.c:391 ../src/vikwindow.c:4881 +msgid "Cut selected layer" +msgstr "剪切所选层" + +#: ../src/viklayerspanel.c:398 ../src/vikwindow.c:4882 +msgid "Copy selected layer" +msgstr "复制所选层" + +#: ../src/viklayerspanel.c:405 ../src/vikwindow.c:4883 +msgid "" +"Paste layer into selected container layer or otherwise above selected layer" +msgstr "黏贴图层到所选容器层否则到所选层上部" + +#: ../src/viklayerspanel.c:502 +msgid "New name can not be blank." +msgstr "新名字不能为空。" + +#: ../src/viklayerspanel.c:751 +msgid "Aggregate Layers have no settable properties." +msgstr "聚集层无可设置属性。" + +#: ../src/viklayerspanel.c:798 +msgid "You cannot cut the Top Layer." +msgstr "不能剪切顶层。" + +#: ../src/viklayerspanel.c:843 +#, c-format +msgid "Are you sure you want to delete %s?" +msgstr "确定要删除%s?" + +#: ../src/viklayerspanel.c:863 +msgid "You cannot delete the Top Layer." +msgstr "不能删除顶层。" + +#: ../src/vikmapniklayer.c:78 +msgid "CSS (MML) Config File:" +msgstr "CSS(MML)配置文件:" + +#: ../src/vikmapniklayer.c:79 +msgid "CartoCSS configuration file" +msgstr "CartoCSS配置文件:" + +#: ../src/vikmapniklayer.c:80 +msgid "XML Config File:" +msgstr "XML配置文件:" + +#: ../src/vikmapniklayer.c:81 +msgid "Mapnik XML configuration file" +msgstr "Mapnik程序的XML配置文件" + +#: ../src/vikmapniklayer.c:84 +msgid "Use File Cache:" +msgstr "使用文件缓存:" + +#: ../src/vikmapniklayer.c:86 +msgid "File Cache Directory:" +msgstr "文件缓存目录:" + +#: ../src/vikmapniklayer.c:122 +msgid "_Mapnik Features" +msgstr "Mapnik特性(_M)" + +#: ../src/vikmapniklayer.c:122 +msgid "Mapnik Features" +msgstr "Mapnik特性" + +#: ../src/vikmapniklayer.c:140 +msgid "Mapnik Rendering" +msgstr "Mapnik渲染" + +#. Changing these values only applies before first mapnik layer is 'created' +#: ../src/vikmapniklayer.c:258 +msgid "Plugins Directory:" +msgstr "插件目录:" + +#: ../src/vikmapniklayer.c:258 ../src/vikmapniklayer.c:259 +#: ../src/vikmapniklayer.c:260 ../src/vikmapniklayer.c:261 +msgid "You need to restart Viking for a change to this value to be used" +msgstr "重启程序使此值生效" + +#: ../src/vikmapniklayer.c:259 +msgid "Fonts Directory:" +msgstr "字体目录:" + +#: ../src/vikmapniklayer.c:260 +msgid "Recurse Fonts Directory:" +msgstr "递归字体目录:" + +#: ../src/vikmapniklayer.c:261 +msgid "Rerender Timeout (hours):" +msgstr "重新渲染限时(小时):" + +#. Changeable any time +#: ../src/vikmapniklayer.c:263 +msgid "CartoCSS:" +msgstr "CartoCSS:" + +#: ../src/vikmapniklayer.c:263 +msgid "The program to convert CartoCSS files into Mapnik XML" +msgstr "转换CartoCSS文件到Mapnik XML文件的程序" + +#: ../src/vikmapniklayer.c:506 +msgid "Running" +msgstr "运行中" + +#: ../src/vikmapniklayer.c:525 +#, c-format +msgid "" +"Error running carto command:\n" +"%s" +msgstr "" +"运行carto命令失败:\n" +"%s" + +#: ../src/vikmapniklayer.c:561 +msgid " completed in " +msgstr " 完成时间 " + +#: ../src/vikmapniklayer.c:561 +msgid "seconds" +msgstr "秒" + +#: ../src/vikmapniklayer.c:611 ../src/vikmapniklayer.c:979 +#, c-format +msgid "" +"Mapnik error loading configuration file:\n" +"%s" +msgstr "" +"Mapnik加载配置文件失败:\n" +"%s" + +#: ../src/vikmapniklayer.c:749 +#, c-format +msgid "Mapnik Render %d:%d:%d %s" +msgstr "Mapnik渲染%d:%d:%d %s" + +#: ../src/vikmapniklayer.c:840 +msgid "Mapnik Rendering must be in Mercator mode" +msgstr "Mapnik渲染必须在Mercator(墨卡托投影)模式" + +#: ../src/vikmapniklayer.c:997 +msgid "Mapnik Information" +msgstr "Mapnik信息" + +#: ../src/vikmapniklayer.c:1031 +msgid "_Flush Memory Cache" +msgstr "清理内存缓存(_F)" + +#: ../src/vikmapniklayer.c:1044 +msgid "_Run Carto Command" +msgstr "运行Carto命令(_R)" + +#: ../src/vikmapniklayer.c:1102 ../src/vikmapslayer.c:2029 +#, c-format +msgid "Tile File Timestamp: %s" +msgstr "瓦片文件时间戳:%s" + +#: ../src/vikmapniklayer.c:1105 ../src/vikmapslayer.c:2032 +msgid "Tile File Timestamp: Not Available" +msgstr "瓦片文件时间戳:不可用" + +#: ../src/vikmapniklayer.c:1120 +#, c-format +msgid "Rendering time %.2f seconds" +msgstr "渲染时间为%.2f秒" + +#: ../src/vikmapniklayer.c:1124 ../src/vikmapslayer.c:2042 +msgid "Tile Information" +msgstr "瓦片信息" + +#: ../src/vikmapniklayer.c:1145 +msgid "_Rerender Tile" +msgstr "重新渲染瓦片(_R)" + +#: ../src/vikmapniklayer.c:1150 +msgid "_Info" +msgstr "信息(_I)" + +#. ******* MAPZOOMS ******** +#: ../src/vikmapslayer.c:96 +msgid "Use Viking Zoom Level" +msgstr "使用维京缩放等级" + +#: ../src/vikmapslayer.c:146 +msgid "OSM" +msgstr "OSM" + +#. NB mode => id - But can't break file format just to rename something better +#: ../src/vikmapslayer.c:152 +msgid "Map Type:" +msgstr "地图类型:" + +#: ../src/vikmapslayer.c:153 +msgid "Maps Directory:" +msgstr "地图目录:" + +#: ../src/vikmapslayer.c:154 +msgid "Cache Layout:" +msgstr "缓存布局:" + +#: ../src/vikmapslayer.c:155 +msgid "This determines the tile storage layout on disk" +msgstr "本项决定瓦片在磁盘中的存放布局" + +#: ../src/vikmapslayer.c:156 +msgid "Map File:" +msgstr "地图文件:" + +#: ../src/vikmapslayer.c:157 +msgid "An MBTiles file. Only applies when the map type method is 'MBTiles'" +msgstr "MBTiles文件。仅适用于地图类型为‘MBTiles’" + +#: ../src/vikmapslayer.c:159 +msgid "Control the Alpha value for transparency effects" +msgstr "控制透明度值实现透明效果" + +#: ../src/vikmapslayer.c:160 +msgid "Autodownload maps:" +msgstr "自动下载地图:" + +#: ../src/vikmapslayer.c:161 +msgid "Autodownload Only Gets Missing Maps:" +msgstr "自动下载仅用于获取缺失地图:" + +#: ../src/vikmapslayer.c:162 +msgid "" +"Using this option avoids attempting to update already acquired tiles. This " +"can be useful if you want to restrict the network usage, without having to " +"resort to manual control. Only applies when 'Autodownload Maps' is on." +msgstr "" +"使用本项可避免更新已获得的瓦片。用于减少网络流量和人工干预。仅适用于‘自动下载" +"地图’已启用。" + +#: ../src/vikmapslayer.c:163 +msgid "Zoom Level:" +msgstr "缩放等级:" + +#: ../src/vikmapslayer.c:164 +msgid "" +"Determines the method of displaying map tiles for the current zoom level. " +"'Viking Zoom Level' uses the best matching level, otherwise setting a fixed " +"value will always use map tiles of the specified value regardless of the " +"actual zoom level." +msgstr "" +"决定了为当前缩放等级显示地图瓦片的方法。‘维京缩放等级’使用最佳匹配等级,否则" +"设置固定值会一直使用指定值的地图瓦片而不管实际的缩放等级。" + +#: ../src/vikmapslayer.c:197 +msgid "_Maps Download" +msgstr "已下载地图(_M)" + +#: ../src/vikmapslayer.c:197 +msgid "Maps Download" +msgstr "地图下载" + +#: ../src/vikmapslayer.c:213 ../src/vikutils.c:895 +msgid "Map" +msgstr "地图" + +#: ../src/vikmapslayer.c:306 +msgid "Default map layer directory:" +msgstr "默认图层目录:" + +#: ../src/vikmapslayer.c:306 +msgid "Choose a directory to store cached Map tiles for this layer" +msgstr "选择目录来保存该层已缓存地图瓦片" + +#: ../src/vikmapslayer.c:436 ../src/vikmapslayer.c:633 +msgid "Unknown map type" +msgstr "未知地图类型" + +#: ../src/vikmapslayer.c:664 +msgid "Unknown Map Zoom" +msgstr "未知地图缩放" + +#: ../src/vikmapslayer.c:833 +#, c-format +msgid "Failed to open MBTiles file: %s" +msgstr "打不开MBTiles文件:%s" + +#: ../src/vikmapslayer.c:856 +#, c-format +msgid "" +"New map cannot be displayed in the current drawmode.\n" +"Select \"%s\" from View menu to view it." +msgstr "" +"新地图无法在当前绘制模式下显示。\n" +"在显示菜单中选择‘%s’。" + +#: ../src/vikmapslayer.c:1314 +#, c-format +msgid "" +"Cowardly refusing to draw tiles or existence of tiles beyond %d zoom out " +"factor" +msgstr "无法绘制瓦片或瓦片超出%d缩放大小" + +#. TODO: ?? count up the number of download errors somehow... +#: ../src/vikmapslayer.c:1667 +msgid "Failed to download tile" +msgstr "无法下载瓦片" + +#: ../src/vikmapslayer.c:1673 +msgid "Unable to save tile" +msgstr "无法保存瓦片" + +#: ../src/vikmapslayer.c:1799 +#, c-format +msgid "Redownloading up to %d %s map..." +msgid_plural "Redownloading up to %d %s maps..." +msgstr[0] "重新下载了%d %s地图…" + +#: ../src/vikmapslayer.c:1801 +#, c-format +msgid "Redownloading %d %s map..." +msgid_plural "Redownloading %d %s maps..." +msgstr[0] "正重新下载%d %s地图…" + +#: ../src/vikmapslayer.c:1805 ../src/vikmapslayer.c:1890 +#, c-format +msgid "Downloading %d %s map..." +msgid_plural "Downloading %d %s maps..." +msgstr[0] "正下载%d %s地图…" + +#: ../src/vikmapslayer.c:1969 +msgid "YES" +msgstr "是" + +#: ../src/vikmapslayer.c:1973 ../src/vikmapslayer.c:1977 +msgid "NO" +msgstr "否" + +#. NB Also handles .jpg automatically due to pixbuf_new_from () support - although just print png for now. +#: ../src/vikmapslayer.c:1980 +#, c-format +msgid "Source: %s (%d%s%d%s%d.%s %s)" +msgstr "" + +#: ../src/vikmapslayer.c:1983 +msgid "Source: Not available" +msgstr "来源:不可用" + +#: ../src/vikmapslayer.c:2000 +#, fuzzy +msgid "Source: file://" +msgstr "来源:不可用" + +#: ../src/vikmapslayer.c:2012 +#, c-format +msgid "Source: %s" +msgstr "" + +#: ../src/vikmapslayer.c:2038 +#, fuzzy, c-format +msgid "Tile File: %s [Not Available]" +msgstr "瓦片文件时间戳:不可用" + +#: ../src/vikmapslayer.c:2086 +msgid "Redownload _Bad Map(s)" +msgstr "重新下载坏的地图(_B)" + +#: ../src/vikmapslayer.c:2090 +msgid "Redownload _New Map(s)" +msgstr "重新下载新的地图(_N)" + +#: ../src/vikmapslayer.c:2094 +msgid "Redownload _All Map(s)" +msgstr "重新下载全部地图(_A)" + +#: ../src/vikmapslayer.c:2099 +msgid "_Show Tile Information" +msgstr "显示瓦片信息(_S)" + +#: ../src/vikmapslayer.c:2166 +#, c-format +msgid "" +"Wrong drawmode for this map.\n" +"Select \"%s\" from View menu and try again." +msgstr "" +"绘制模式不适合该地图。\n" +"选择“%s”在显示菜单再重试。" + +#: ../src/vikmapslayer.c:2171 +msgid "Wrong zoom level for this map." +msgstr "本地图无此缩放等级。" + +#: ../src/vikmapslayer.c:2334 +msgid "Zoom Start:" +msgstr "缩放开始:" + +#: ../src/vikmapslayer.c:2341 +msgid "Zoom End:" +msgstr "缩放结束:" + +#: ../src/vikmapslayer.c:2347 +msgid "Download Maps Method:" +msgstr "下载地图方法:" + +#. redownload method - needs to align with REDOWNLOAD* macro values +#: ../src/vikmapslayer.c:2419 +msgid "Missing" +msgstr "缺失" + +#: ../src/vikmapslayer.c:2419 +msgid "Bad" +msgstr "坏" + +#: ../src/vikmapslayer.c:2419 +msgid "New" +msgstr "新建" + +#: ../src/vikmapslayer.c:2419 +msgid "Reload All" +msgstr "全部重新装入" + +#: ../src/vikmapslayer.c:2421 +msgid "Download for Zoom Levels" +msgstr "下载在缩放等级" + +#: ../src/vikmapslayer.c:2461 +#, c-format +msgid "" +"You are not allowed to download more than %d tiles in one go (requested %d)" +msgstr "每次不能下载多于%d的瓦片(请求了%d)" + +#: ../src/vikmapslayer.c:2469 +#, c-format +msgid "Do you really want to download %d tiles?" +msgstr "确定要下载%d瓦片?" + +#. Now with icons +#: ../src/vikmapslayer.c:2509 +msgid "Download _Missing Onscreen Maps" +msgstr "下载缺失的Onscreen地图(_M)" + +#: ../src/vikmapslayer.c:2516 +msgid "Download _New Onscreen Maps" +msgstr "下载新的Onscreend地图(_N)" + +#: ../src/vikmapslayer.c:2523 +msgid "Reload _All Onscreen Maps" +msgstr "重新加载全部Onscreen地图(_A)" + +#: ../src/vikmapslayer.c:2529 +msgid "Download Maps in _Zoom Levels..." +msgstr "下载地图在缩放等级(_Z)…" + +#: ../src/vikmapslayer.c:2539 +#, fuzzy +msgid "_Open MBTiles Files" +msgstr "MBTiles文件" + +#: ../src/vikmapslayer.c:2554 +msgid "Flush Map Cache" +msgstr "清理地图缓存" + +#: ../src/vikrouting.c:54 +msgid "Default engine:" +msgstr "默认引擎:" + +#: ../src/vikrouting.c:68 +msgid "Routing" +msgstr "路线" + +#: ../src/viktreeview.c:347 +msgid "Layer Name" +msgstr "图层名" + +#: ../src/viktreeview.c:924 +#, c-format +msgid "delete data from %s\n" +msgstr "从%s删除数据\n" + +#: ../src/viktrwlayer.c:427 +msgid "Create _Waypoint" +msgstr "创建路标(_W)" + +#: ../src/viktrwlayer.c:427 +msgid "Create Waypoint" +msgstr "创建路标" + +#: ../src/viktrwlayer.c:437 +#, fuzzy +msgid "Edit _Track" +msgstr "编辑轨迹点" + +#: ../src/viktrwlayer.c:437 +#, fuzzy +msgid "Edit Track" +msgstr "编辑轨迹点" + +#: ../src/viktrwlayer.c:449 +#, fuzzy +msgid "Edit _Route" +msgstr "添加路线" + +#: ../src/viktrwlayer.c:449 +#, fuzzy +msgid "Edit Route" +msgstr "添加路线" + +#: ../src/viktrwlayer.c:460 +msgid "Route _Finder" +msgstr "路线查找(_F)" + +#: ../src/viktrwlayer.c:460 +msgid "Route Finder" +msgstr "路线查找" + +#: ../src/viktrwlayer.c:471 +#, fuzzy +msgid "Splitter" +msgstr "在此拆分" + +#: ../src/viktrwlayer.c:482 +msgid "_Edit Waypoint" +msgstr "编辑路标(_E)" + +#: ../src/viktrwlayer.c:482 +msgid "Edit Waypoint" +msgstr "编辑路标" + +#: ../src/viktrwlayer.c:495 +msgid "Edit Trac_kpoint" +msgstr "编辑轨迹点(_k)" + +#: ../src/viktrwlayer.c:495 +msgid "Edit Trackpoint" +msgstr "编辑轨迹点" + +#. a pixbuf for this one is already made globally available +#: ../src/viktrwlayer.c:508 +msgid "Show P_icture" +msgstr "显示图像(_i)" + +#: ../src/viktrwlayer.c:508 +msgid "Show Picture" +msgstr "显示图片" + +#: ../src/viktrwlayer.c:531 +msgid "Waypoint Images" +msgstr "路标图像" + +#: ../src/viktrwlayer.c:531 +msgid "Tracks Advanced" +msgstr "轨迹进阶" + +#: ../src/viktrwlayer.c:531 +msgid "Metadata" +msgstr "元数据" + +#: ../src/viktrwlayer.c:531 +#, fuzzy +msgid "Filesystem" +msgstr "文件类型:" + +#: ../src/viktrwlayer.c:534 +msgid "Draw by Track" +msgstr "按轨迹绘制" + +#: ../src/viktrwlayer.c:534 +msgid "Draw by Speed" +msgstr "按速度绘制" + +#: ../src/viktrwlayer.c:534 +msgid "All Tracks Same Color" +msgstr "全部轨迹相同颜色" + +#: ../src/viktrwlayer.c:535 +msgid "Filled Square" +msgstr "填充方块" + +#: ../src/viktrwlayer.c:535 +msgid "Square" +msgstr "正方形" + +#: ../src/viktrwlayer.c:535 +msgid "Circle" +msgstr "圆形" + +#: ../src/viktrwlayer.c:535 +msgid "X" +msgstr "X" + +#: ../src/viktrwlayer.c:561 +msgid "Extra Extra Small" +msgstr "超超小" + +#: ../src/viktrwlayer.c:562 +msgid "Extra Small" +msgstr "超小" + +#: ../src/viktrwlayer.c:566 +msgid "Extra Large" +msgstr "超大" + +#: ../src/viktrwlayer.c:567 +msgid "Extra Extra Large" +msgstr "超超大" + +#: ../src/viktrwlayer.c:573 +msgid "Name Ascending" +msgstr "名字升序" + +#: ../src/viktrwlayer.c:574 +msgid "Name Descending" +msgstr "名字降序" + +#: ../src/viktrwlayer.c:582 ../src/viktrwlayer_propwin.c:3319 +msgid "No" +msgstr "否" + +#: ../src/viktrwlayer.c:583 +msgid "Yes" +msgstr "" + +#: ../src/viktrwlayer.c:584 +msgid "No write" +msgstr "" + +#: ../src/viktrwlayer.c:649 ../src/viktrwlayer.c:673 +msgid "Draw Labels" +msgstr "绘制图层" + +#: ../src/viktrwlayer.c:650 +msgid "Note: the individual track controls what labels may be displayed" +msgstr "注意:单个轨迹控制了要显示的标签内容" + +#: ../src/viktrwlayer.c:651 +msgid "Track Labels Font Size:" +msgstr "轨迹标签字体大小:" + +#: ../src/viktrwlayer.c:652 +msgid "Track Drawing Mode:" +msgstr "轨迹绘制模式:" + +#: ../src/viktrwlayer.c:653 +msgid "All Tracks Color:" +msgstr "全部轨迹颜色:" + +#: ../src/viktrwlayer.c:654 +msgid "The color used when 'All Tracks Same Color' drawing mode is selected" +msgstr "选择‘全部轨迹相同颜色’所用颜色" + +#: ../src/viktrwlayer.c:655 +msgid "Draw Track Lines" +msgstr "绘制轨迹线段" + +#: ../src/viktrwlayer.c:656 +msgid "Track Thickness:" +msgstr "轨迹宽度:" + +#: ../src/viktrwlayer.c:657 +msgid "Draw Track Direction" +msgstr "绘制轨迹方向" + +#: ../src/viktrwlayer.c:658 +msgid "Direction Size:" +msgstr "方向的大小:" + +#: ../src/viktrwlayer.c:659 +msgid "Draw Trackpoints" +msgstr "绘制路标" + +#: ../src/viktrwlayer.c:660 +msgid "Trackpoint Size:" +msgstr "路标的大小:" + +#: ../src/viktrwlayer.c:661 +msgid "Draw Elevation" +msgstr "绘制高程" + +#: ../src/viktrwlayer.c:662 +msgid "Draw Elevation Height %:" +msgstr "绘制高程高度百分比:" + +#: ../src/viktrwlayer.c:663 +msgid "Draw Stops" +msgstr "绘制停止点" + +#: ../src/viktrwlayer.c:664 +msgid "" +"Whether to draw a marker when trackpoints are at the same position but over " +"the minimum stop length apart in time" +msgstr "是否要绘制记号在相同轨迹点当不同时间在相同位置但超过了最小停止长度" + +#: ../src/viktrwlayer.c:665 +msgid "Min Stop Length (seconds):" +msgstr "最小停止长度(秒):" + +#: ../src/viktrwlayer.c:667 +msgid "Track BG Thickness:" +msgstr "轨迹背景宽度:" + +#: ../src/viktrwlayer.c:668 +msgid "Track Background Color" +msgstr "轨迹背景颜色" + +#: ../src/viktrwlayer.c:669 +msgid "Draw by Speed Factor (%):" +msgstr "按速度因子绘制(百分比):" + +#: ../src/viktrwlayer.c:670 +msgid "" +"The percentage factor away from the average speed determining the color used" +msgstr "离均速所至百分比决定了所用颜色" + +#: ../src/viktrwlayer.c:671 +msgid "Track Sort Order:" +msgstr "轨迹排列顺序:" + +#: ../src/viktrwlayer.c:674 +msgid "Waypoint Font Size:" +msgstr "路标字体大小:" + +#: ../src/viktrwlayer.c:675 +msgid "Waypoint Color:" +msgstr "路标颜色:" + +#: ../src/viktrwlayer.c:676 +msgid "Waypoint Text:" +msgstr "路标文字:" + +#: ../src/viktrwlayer.c:677 +msgid "Background:" +msgstr "背景:" + +#: ../src/viktrwlayer.c:678 +msgid "Fake BG Color Translucency:" +msgstr "改动背景颜色透明度:" + +#: ../src/viktrwlayer.c:679 +msgid "Waypoint marker:" +msgstr "路标记号:" + +#: ../src/viktrwlayer.c:680 +msgid "Waypoint size:" +msgstr "路标大小:" + +#: ../src/viktrwlayer.c:681 +msgid "Draw Waypoint Symbols:" +msgstr "绘制路标符号:" + +#: ../src/viktrwlayer.c:682 +msgid "Waypoint Sort Order:" +msgstr "路标排列顺序:" + +#: ../src/viktrwlayer.c:684 +msgid "Draw Waypoint Images" +msgstr "绘制路标图像" + +#: ../src/viktrwlayer.c:685 +msgid "Image Size (pixels):" +msgstr "图像大小 (像素):" + +#: ../src/viktrwlayer.c:686 +msgid "Image Alpha:" +msgstr "图像透明度:" + +#: ../src/viktrwlayer.c:687 +msgid "Image Memory Cache Size:" +msgstr "图像内存缓存尺寸:" + +#: ../src/viktrwlayer.c:690 +msgid "Author" +msgstr "作者" + +#: ../src/viktrwlayer.c:691 +msgid "Creation Time" +msgstr "创建时间" + +#: ../src/viktrwlayer.c:692 +msgid "Keywords" +msgstr "关键词" + +#: ../src/viktrwlayer.c:693 +#, fuzzy +msgid "External layer:" +msgstr "外部(_l)" + +#: ../src/viktrwlayer.c:693 +msgid "" +"Layer data stored in the Viking file, in an external file, or in an external " +"file but changes are not written to the file (file only loaded at startup)" +msgstr "" + +#: ../src/viktrwlayer.c:694 +#, fuzzy +msgid "Save layer as:" +msgstr "%d层" + +#: ../src/viktrwlayer.c:694 +msgid "Specify where layer should be saved. Overwrites file if it exists." +msgstr "" + +#: ../src/viktrwlayer.c:798 +msgid "TrackWaypoint" +msgstr "轨迹路标" + +#: ../src/viktrwlayer.c:1999 ../src/viktrwlayer_propwin.c:1469 +#: ../src/viktrwlayer_propwin.c:1471 ../src/vikutils.c:299 +#: ../src/vikutils.c:326 +msgid "miles" +msgstr "英里" + +#: ../src/viktrwlayer.c:2002 ../src/viktrwlayer_propwin.c:1475 +#: ../src/viktrwlayer_propwin.c:1477 ../src/vikutils.c:303 +#: ../src/vikutils.c:330 +msgid "NM" +msgstr "NM(Nautical Mile海里)" + +#. VIK_UNITS_DISTANCE_KILOMETRES: +#: ../src/viktrwlayer.c:2006 ../src/viktrwlayer_propwin.c:1482 +#: ../src/viktrwlayer_propwin.c:1484 ../src/vikutils.c:308 +#: ../src/vikutils.c:335 +msgid "km" +msgstr "公里" + +#: ../src/viktrwlayer.c:2121 +msgid "start/end" +msgstr "开始/结束" + +#: ../src/viktrwlayer.c:2133 +msgid "start" +msgstr "开始" + +#: ../src/viktrwlayer.c:2142 +msgid "end" +msgstr "结束" + +#: ../src/viktrwlayer.c:3103 +#, c-format +msgid " in %d:%02d hrs:mins" +msgstr " 在%d:%02d时:分" + +#: ../src/viktrwlayer.c:3107 +#, c-format +msgid "" +"\n" +"%sTotal Length %.1f %s%s" +msgstr "" +"\n" +"%s总长%.1f %s%s" + +#: ../src/viktrwlayer.c:3131 +#, c-format +msgid "" +"\n" +"Total route length %.1f %s" +msgstr "" +"\n" +"路线总长%.1f %s" + +#: ../src/viktrwlayer.c:3136 +#, c-format +msgid "Tracks: %d - Waypoints: %d - Routes: %d%s%s" +msgstr "轨迹:%d-路标:%d-路线:%d%s%s" + +#: ../src/viktrwlayer.c:3155 +#, c-format +msgid "Tracks: %d" +msgstr "轨迹:%d" + +#: ../src/viktrwlayer.c:3165 +#, c-format +msgid "Routes: %d" +msgstr "路线:%d" + +#: ../src/viktrwlayer.c:3195 +#, c-format +msgid "- %d:%02d hrs:mins" +msgstr "-%d时:%02d分" + +#: ../src/viktrwlayer.c:3202 +#, c-format +msgid "%s%.1f km %s" +msgstr "%s%.1f公里%s" + +#: ../src/viktrwlayer.c:3205 +#, c-format +msgid "%s%.1f miles %s" +msgstr "%s%.1f英里%s" + +#: ../src/viktrwlayer.c:3208 +#, c-format +msgid "%s%.1f NM %s" +msgstr "%s%.1f海里%s" + +#: ../src/viktrwlayer.c:3222 +#, c-format +msgid "Waypoints: %d" +msgstr "路标:%d" + +#: ../src/viktrwlayer.c:3279 +#, c-format +msgid "Wpt: Alt %dft" +msgstr "路标:海拔%d英尺" + +#. VIK_UNITS_HEIGHT_METRES: +#: ../src/viktrwlayer.c:3283 +#, c-format +msgid "Wpt: Alt %dm" +msgstr "路标:海拔%d米" + +#. Add comment if available +#: ../src/viktrwlayer.c:3298 +#, c-format +msgid "%s | %s %s | Comment: %s" +msgstr "%s | %s%s | 注释:%s" + +#: ../src/viktrwlayer.c:3300 +#, c-format +msgid "%s | %s %s" +msgstr "%s | %s %s" + +#: ../src/viktrwlayer.c:3562 ../src/viktrwlayer.c:3591 +msgid "This layer has no waypoints or trackpoints." +msgstr "本层无路标和轨迹点。" + +#: ../src/viktrwlayer.c:3598 ../src/viktrwlayer.c:3607 +#: ../src/viktrwlayer.c:3616 ../src/viktrwlayer.c:3625 +#: ../src/viktrwlayer.c:3634 ../src/viktrwlayer.c:3642 +msgid "Export Layer" +msgstr "输出图层" + +#: ../src/viktrwlayer.c:3671 +msgid "Export Route as GPX" +msgstr "导出路线为GPX文件" + +#: ../src/viktrwlayer.c:3673 +msgid "Export Track as GPX" +msgstr "导出轨迹为GPX文件" + +#: ../src/viktrwlayer.c:3693 +msgid "Find" +msgstr "查找" + +#: ../src/viktrwlayer.c:3703 +msgid "Waypoint Name:" +msgstr "路标名:" + +#: ../src/viktrwlayer.c:3720 +msgid "Waypoint not found in this layer." +msgstr "在此图层中找不到路标。" + +#: ../src/viktrwlayer.c:3989 +msgid "Can not upload invisible track." +msgstr "不能上传不可见轨迹。" + +#: ../src/viktrwlayer.c:4082 ../src/viktrwlayer.c:10512 +msgid "Track" +msgstr "轨迹" + +#: ../src/viktrwlayer.c:4107 ../src/viktrwlayer.c:10599 +msgid "Route" +msgstr "路线" + +#: ../src/viktrwlayer.c:4194 +msgid "Externa_l" +msgstr "外部(_l)" + +#: ../src/viktrwlayer.c:4216 ../src/viktrwlayer.c:8456 +#: ../src/viktrwlayer.c:8574 +msgid "_Finish Route" +msgstr "结束路线(_F)" + +#: ../src/viktrwlayer.c:4218 ../src/viktrwlayer.c:8380 +#: ../src/viktrwlayer.c:8572 +msgid "_Finish Track" +msgstr "结束轨迹(_F)" + +#. Now with icons +#: ../src/viktrwlayer.c:4230 +msgid "_View Layer" +msgstr "显示图层(_V)" + +#: ../src/viktrwlayer.c:4237 +msgid "V_iew" +msgstr "显示(_i)" + +#: ../src/viktrwlayer.c:4243 +msgid "View All _Tracks" +msgstr "显示全部轨迹(_T)" + +#: ../src/viktrwlayer.c:4248 +msgid "View All _Routes" +msgstr "显示全部路线(_R)" + +#: ../src/viktrwlayer.c:4253 +msgid "View All _Waypoints" +msgstr "显示全部路标(_W)" + +#: ../src/viktrwlayer.c:4258 +msgid "_Goto Center of Layer" +msgstr "去图层中心(_G)" + +#: ../src/viktrwlayer.c:4264 ../src/viktrwlayer.c:8321 +msgid "Goto _Waypoint..." +msgstr "去路标(_W)…" + +#: ../src/viktrwlayer.c:4270 +msgid "_Export Layer" +msgstr "导出图层(_E)" + +#: ../src/viktrwlayer.c:4276 +msgid "Export as GPS_Point..." +msgstr "导出为GPS_Point…" + +#: ../src/viktrwlayer.c:4281 +msgid "Export as GPS_Mapper..." +msgstr "导出为GPS_Mapper…" + +#: ../src/viktrwlayer.c:4286 +msgid "Export as _GPX..." +msgstr "导出为_GPX…" + +#: ../src/viktrwlayer.c:4292 +msgid "Export as _KML..." +msgstr "导出为_KML…" + +#: ../src/viktrwlayer.c:4299 +msgid "Export as GEO_JSON..." +msgstr "导出为GEO_JSON…" + +#: ../src/viktrwlayer.c:4306 +msgid "Export via GPSbabel..." +msgstr "通过GPSbabel程序导出…" + +#: ../src/viktrwlayer.c:4312 +#, c-format +msgid "Open with External Program_1: %s" +msgstr "用外部程序1打开:%s" + +#: ../src/viktrwlayer.c:4319 +#, c-format +msgid "Open with External Program_2: %s" +msgstr "用外部程序2打开:%s" + +#: ../src/viktrwlayer.c:4327 ../src/vikwindow.c:4825 +msgid "_New" +msgstr "新建(_N)" + +#: ../src/viktrwlayer.c:4333 +msgid "New _Waypoint..." +msgstr "新建路标(_W)…" + +#: ../src/viktrwlayer.c:4339 +msgid "New _Track" +msgstr "新建轨迹(_T)" + +#: ../src/viktrwlayer.c:4347 +msgid "New _Route" +msgstr "新建路线(_R)" + +#: ../src/viktrwlayer.c:4356 ../src/viktrwlayer.c:8232 +#: ../src/viktrwlayer.c:9003 +msgid "Geotag _Images..." +msgstr "地理标签图像(_I)…" + +#: ../src/viktrwlayer.c:4363 +msgid "_Acquire" +msgstr "获取(_A)" + +#: ../src/viktrwlayer.c:4369 ../src/vikwindow.c:4904 +msgid "From _GPS..." +msgstr "从_GPS…" + +#. FIXME: only add menu when at least a routing engine has support for Directions +#: ../src/viktrwlayer.c:4375 +msgid "From _Directions..." +msgstr "从方向(_D)…" + +#: ../src/viktrwlayer.c:4381 +msgid "From _OSM Traces..." +msgstr "从_OSM踪迹…" + +#: ../src/viktrwlayer.c:4386 +msgid "From _My OSM Traces..." +msgstr "从我的OSM踪迹(_M)…" + +#: ../src/viktrwlayer.c:4392 ../src/vikwindow.c:4844 +msgid "From _URL..." +msgstr "从网址(_U)…" + +#: ../src/viktrwlayer.c:4399 ../src/vikwindow.c:4846 +msgid "From _Wikipedia Waypoints" +msgstr "从维基百科路标(_W)" + +#: ../src/viktrwlayer.c:4405 +msgid "Within _Layer Bounds" +msgstr "在图层边界内(_L)" + +#: ../src/viktrwlayer.c:4411 +msgid "Within _Current View" +msgstr "在当前视图内(_C)" + +#: ../src/viktrwlayer.c:4419 +msgid "From Geo_caching..." +msgstr "从地理藏宝(_c)…" + +#: ../src/viktrwlayer.c:4426 ../src/vikwindow.c:4842 +msgid "From Geotagged _Images..." +msgstr "从有地理标签的图像(_I)…" + +#: ../src/viktrwlayer.c:4433 +msgid "From _File..." +msgstr "从文件(_F)…" + +#: ../src/viktrwlayer.c:4436 ../src/vikwindow.c:4905 +msgid "Import File With GPS_Babel..." +msgstr "用GPS_Babel程序从文件导入…" + +#: ../src/viktrwlayer.c:4443 ../src/viktrwlayer.c:8905 +msgid "_Upload" +msgstr "上传(_U)" + +#: ../src/viktrwlayer.c:4449 +msgid "Upload to _GPS..." +msgstr "上传到_GPS设备…" + +#: ../src/viktrwlayer.c:4456 ../src/viktrwlayer.c:8973 +msgid "Upload to _OSM..." +msgstr "上传到_OSM…" + +#: ../src/viktrwlayer.c:4464 +msgid "De_lete" +msgstr "删除(_l)" + +#: ../src/viktrwlayer.c:4470 +msgid "Delete All _Tracks" +msgstr "删除全部轨迹(_T)" + +#: ../src/viktrwlayer.c:4477 +msgid "Delete Tracks _From Selection..." +msgstr "删除所选轨迹(_F)…" + +#: ../src/viktrwlayer.c:4484 ../src/viktrwlayer.c:8481 +msgid "Delete _All Routes" +msgstr "删除全部路线(_A)" + +#: ../src/viktrwlayer.c:4491 ../src/viktrwlayer.c:8487 +msgid "_Delete Routes From Selection..." +msgstr "删除所选轨迹(_D)…" + +#: ../src/viktrwlayer.c:4498 +msgid "Delete All _Waypoints" +msgstr "删除全部路标(_W)" + +#: ../src/viktrwlayer.c:4505 +msgid "Delete Waypoints From _Selection..." +msgstr "删除所选路标(_S)…" + +#: ../src/viktrwlayer.c:4512 ../src/viktrwlayer.c:8339 +#, fuzzy +msgid "Delete Duplicate Waypoints" +msgstr "删除重复路标" + +#: ../src/viktrwlayer.c:5198 +#, c-format +msgid "Are you sure you want to delete all tracks in %s?" +msgstr "确定要删除%s中全部轨迹?" + +#: ../src/viktrwlayer.c:5211 +#, c-format +msgid "Are you sure you want to delete all routes in %s?" +msgstr "确定要删除%s中全部路线?" + +#: ../src/viktrwlayer.c:5221 +#, c-format +msgid "Are you sure you want to delete all waypoints in %s?" +msgstr "确定要删除%s中全部路标?" + +#: ../src/viktrwlayer.c:5238 +#, c-format +msgid "Are you sure you want to delete the waypoint \"%s\"?" +msgstr "确定要删除路标“%s”?" + +#: ../src/viktrwlayer.c:5254 +#, c-format +msgid "Are you sure you want to delete the track \"%s\"?" +msgstr "确定要删除轨迹“%s”?" + +#: ../src/viktrwlayer.c:5271 +#, c-format +msgid "Are you sure you want to delete the route \"%s\"?" +msgstr "确定要删除路线“%s”?" + +#: ../src/viktrwlayer.c:5527 ../src/viktrwlayer.c:6373 +msgid "" +"Converting a track to a route removes extra track data such as segments, " +"timestamps, etc...\n" +"Do you want to continue?" +msgstr "转换轨迹成路线会删除多余轨迹数据,比如线段,时间戳等。确定要继续?" + +#: ../src/viktrwlayer.c:5631 +msgid "No DEM layers available, thus no DEM values can be applied." +msgstr "" +"无DEM(Digital Elevation Model数字高程模型)图层可用,因此无DEM值可用。" + +#: ../src/viktrwlayer.c:5651 ../src/viktrwlayer.c:5692 +#, c-format +msgid "%ld point adjusted" +msgid_plural "%ld points adjusted" +msgstr[0] "%ld点已调整" + +#: ../src/viktrwlayer.c:5736 +#, c-format +msgid "%ld waypoint changed" +msgid_plural "%ld waypoints changed" +msgstr[0] "%ld路标已改变" + +#: ../src/viktrwlayer.c:5917 +#, c-format +msgid "" +"Refining a track with many points (%d) is unlikely to yield sensible " +"results. Do you want to Continue?" +msgstr "用很多点(%d)改善轨迹是不可能产生可观结果的。确定要继续?" + +#. Select engine from dialog +#: ../src/viktrwlayer.c:5925 +msgid "Refine Route with Routing Engine..." +msgstr "用路线引擎改善路线…" + +#: ../src/viktrwlayer.c:5933 +msgid "Select routing engine" +msgstr "选择路线引擎" + +#: ../src/viktrwlayer.c:6158 +msgid "Failed. No other tracks with timestamps in this layer found" +msgstr "失败。本层已无更多含时间戳的轨迹" + +#: ../src/viktrwlayer.c:6160 +msgid "Failed. No other tracks without timestamps in this layer found" +msgstr "失败。本层已无更多不含时间戳的轨迹" + +#: ../src/viktrwlayer.c:6179 +msgid "Merge with..." +msgstr "合并…" + +#: ../src/viktrwlayer.c:6180 +msgid "Select route to merge with" +msgstr "选择路线来合并" + +#: ../src/viktrwlayer.c:6180 +msgid "Select track to merge with" +msgstr "选择轨迹来合并" + +#: ../src/viktrwlayer.c:6264 ../src/viktrwlayer.c:6346 +msgid "Append Route" +msgstr "扩展路线" + +#: ../src/viktrwlayer.c:6264 ../src/viktrwlayer.c:6346 +msgid "Append Track" +msgstr "扩展轨迹" + +#: ../src/viktrwlayer.c:6265 +msgid "Select the route to append after the current route" +msgstr "选择路线扩展到当前路线" + +#: ../src/viktrwlayer.c:6266 +msgid "Select the track to append after the current track" +msgstr "选择轨迹扩展到当前轨迹" + +#: ../src/viktrwlayer.c:6347 +msgid "Select the track to append after the current route" +msgstr "选择轨迹扩展到当前路线" + +#: ../src/viktrwlayer.c:6348 +msgid "Select the route to append after the current track" +msgstr "选择路线扩展到当前轨迹" + +#: ../src/viktrwlayer.c:6414 +#, c-format +msgid "%d segment merged" +msgid_plural "%d segments merged" +msgstr[0] "%d段已合并" + +#: ../src/viktrwlayer.c:6430 +msgid "Failed. This track does not have timestamp" +msgstr "失败。该轨迹无时间戳" + +#: ../src/viktrwlayer.c:6442 +msgid "Failed. No other track in this layer has timestamp" +msgstr "失败。本层无更多轨迹有时间戳" + +#: ../src/viktrwlayer.c:6449 +msgid "Merge Threshold..." +msgstr "合并界限…" + +#: ../src/viktrwlayer.c:6450 +msgid "Merge when time between tracks less than:" +msgstr "合并条件为当轨迹时间间隔小于:" + +#: ../src/viktrwlayer.c:6580 +msgid "Split Threshold..." +msgstr "分割界限…" + +#: ../src/viktrwlayer.c:6581 +msgid "Split when time between trackpoints exceeds:" +msgstr "分割条件为当轨迹点时间间隔小于:" + +#: ../src/viktrwlayer.c:6598 +#, c-format +msgid "" +"Can not split track due to trackpoints not ordered in time - such as at %s.\n" +"\n" +"Goto this trackpoint?" +msgstr "" +"无法分割轨迹因为轨迹点未按照时间顺序排序-比如在%s。\n" +"\n" +"去此轨迹点?" + +#: ../src/viktrwlayer.c:6668 +msgid "Split Every Nth Point" +msgstr "在第若干点分割" + +#: ../src/viktrwlayer.c:6669 +msgid "Split on every Nth point:" +msgstr "每若干点分割:" + +#: ../src/viktrwlayer.c:6779 +msgid "Can not split track as it has no segments" +msgstr "无法分割轨迹因为未分段" + +#: ../src/viktrwlayer.c:6861 ../src/viktrwlayer.c:6891 +#, c-format +msgid "Deleted %ld point" +msgid_plural "Deleted %ld points" +msgstr[0] "删除%ld点" + +#: ../src/viktrwlayer.c:6966 ../src/viktrwlayer.c:10989 +#: ../src/viktrwlayer_waypointlist.c:214 +#, c-format +msgid "Could not launch %s to open file." +msgstr "无法启动%s来打开文件" + +#: ../src/viktrwlayer.c:6992 ../src/viktrwlayer.c:7113 +msgid "This track has no date information." +msgstr "本轨迹无数据信息" + +#: ../src/viktrwlayer.c:7006 ../src/viktrwlayer.c:7136 +msgid "This waypoint has no date information." +msgstr "本路标无数据信息" + +#: ../src/viktrwlayer.c:7030 +#, c-format +msgid "Could not launch %s" +msgstr "无法启动%s" + +#: ../src/viktrwlayer.c:7269 +msgid "Internal Error in vik_trw_layer_uniquify_tracks" +msgstr "内部错误在vik_trw_layer_uniquify_tracks函数" + +#: ../src/viktrwlayer.c:7374 ../src/viktrwlayer.c:7424 +#: ../src/viktrwlayer.c:7587 +msgid "" +"Multiple entries with the same name exist. This method only works with " +"unique names. Force unique names now?" +msgstr "多处条目含有相同名字。此方法仅适用于独有名字。要强制使用独有名字吗?" + +#: ../src/viktrwlayer.c:7385 +msgid "No tracks found" +msgstr "找不到轨迹" + +#: ../src/viktrwlayer.c:7393 ../src/viktrwlayer.c:7443 +#: ../src/viktrwlayer.c:7607 +msgid "Delete Selection" +msgstr "删除所选项" + +#: ../src/viktrwlayer.c:7394 +msgid "Select tracks to delete" +msgstr "选择轨迹来删除" + +#: ../src/viktrwlayer.c:7435 +msgid "No routes found" +msgstr "找不到路线" + +#: ../src/viktrwlayer.c:7444 +msgid "Select routes to delete" +msgstr "选择路线来删除" + +#: ../src/viktrwlayer.c:7550 +msgid "Internal Error in vik_trw_layer_uniquify_waypoints" +msgstr "内部错误在vik_trw_layer_uniquify_waypoints函数" + +#: ../src/viktrwlayer.c:7597 +msgid "No waypoints found" +msgstr "找不到路标" + +#: ../src/viktrwlayer.c:7608 +msgid "Select waypoints to delete" +msgstr "选择路标来删除" + +#: ../src/viktrwlayer.c:7691 +#, fuzzy, c-format +msgid "%ld waypoint deleted" +msgid_plural "%ld waypoints deleted" +msgstr[0] "%ld路标已改变" + +#: ../src/viktrwlayer.c:7697 +#, fuzzy +msgid "No duplicates found" +msgstr "找不到路线" + +#: ../src/viktrwlayer.c:8028 +#, c-format +msgid "" +"A waypoint with the name \"%s\" already exists. Really rename to the same " +"name?" +msgstr "含有名字“%s”的路标已存在。确定要重命名到相同名字?" + +#: ../src/viktrwlayer.c:8058 +#, c-format +msgid "" +"A track with the name \"%s\" already exists. Really rename to the same name?" +msgstr "含有名字“%s”的轨迹已存在。确定要重命名到相同名字?" + +#: ../src/viktrwlayer.c:8095 +#, c-format +msgid "" +"A route with the name \"%s\" already exists. Really rename to the same name?" +msgstr "含有名字“%s”的路线已存在。确定要重命名到相同名字?" + +#: ../src/viktrwlayer.c:8215 ../src/viktrwlayer.c:8602 +msgid "_Goto" +msgstr "转到(_G)" + +#: ../src/viktrwlayer.c:8226 +msgid "_Visit Geocache Webpage" +msgstr "访问地理藏宝网页(_V)" + +#: ../src/viktrwlayer.c:8235 +msgid "Geotag multiple images against this waypoint" +msgstr "用该路标地理标记多个图像" + +#: ../src/viktrwlayer.c:8245 ../src/viktrwlayer_waypointlist.c:352 +msgid "_Show Picture..." +msgstr "显示图片(_S)…" + +#: ../src/viktrwlayer.c:8253 +msgid "Update Geotag on _Image" +msgstr "更新图像上的地理标记(_I)" + +#: ../src/viktrwlayer.c:8259 +msgid "_Update" +msgstr "更新(_U)" + +#: ../src/viktrwlayer.c:8264 +msgid "Update and _Keep File Timestamp" +msgstr "更新但保持文件的时间戳(_K)" + +#: ../src/viktrwlayer.c:8276 +msgid "Visit _Webpage" +msgstr "访问网页(_W)" + +#: ../src/viktrwlayer.c:8306 +msgid "_New Waypoint..." +msgstr "新建路标(_N)…" + +#: ../src/viktrwlayer.c:8315 +msgid "_View All Waypoints" +msgstr "显示全部路标(_V)" + +#: ../src/viktrwlayer.c:8327 +msgid "Delete _All Waypoints" +msgstr "删除全部路标(_A)" + +#: ../src/viktrwlayer.c:8333 +msgid "_Delete Waypoints From Selection..." +msgstr "删除所选路标(_D)…" + +#: ../src/viktrwlayer.c:8351 +msgid "_Show All Waypoints" +msgstr "显示全部路标(_S)" + +#: ../src/viktrwlayer.c:8357 +msgid "_Hide All Waypoints" +msgstr "隐藏全部路标(_H)" + +#: ../src/viktrwlayer.c:8369 +msgid "_List Waypoints..." +msgstr "列出路标(_L)…" + +#: ../src/viktrwlayer.c:8390 +msgid "_View All Tracks" +msgstr "显示全部轨迹(_V)" + +#: ../src/viktrwlayer.c:8396 +msgid "_New Track" +msgstr "新建轨迹(_N)" + +#: ../src/viktrwlayer.c:8404 +msgid "Delete _All Tracks" +msgstr "删除全部轨迹(_A)" + +#: ../src/viktrwlayer.c:8410 +msgid "_Delete Tracks From Selection..." +msgstr "删除所选轨迹(_D)…" + +#: ../src/viktrwlayer.c:8422 +msgid "_Show All Tracks" +msgstr "显示全部轨迹(_S)" + +#: ../src/viktrwlayer.c:8428 +msgid "_Hide All Tracks" +msgstr "隐藏全部轨迹(_H)" + +#: ../src/viktrwlayer.c:8439 +msgid "_List Tracks..." +msgstr "列出全部轨迹(_L)…" + +#: ../src/viktrwlayer.c:8467 +msgid "_View All Routes" +msgstr "显示全部路线(_V)" + +#: ../src/viktrwlayer.c:8473 +msgid "_New Route" +msgstr "新建路线(_N)" + +#: ../src/viktrwlayer.c:8499 +msgid "_Show All Routes" +msgstr "显示全部路线(_S)" + +#: ../src/viktrwlayer.c:8505 +msgid "_Hide All Routes" +msgstr "隐藏全部路线(_H)" + +#: ../src/viktrwlayer.c:8516 +msgid "_List Routes..." +msgstr "列出路线(_L)…" + +#: ../src/viktrwlayer.c:8587 +msgid "_View Track" +msgstr "显示轨迹(_V)" + +#: ../src/viktrwlayer.c:8589 +msgid "_View Route" +msgstr "显示路线(_V)" + +#: ../src/viktrwlayer.c:8608 +msgid "_Startpoint" +msgstr "开始点(_S)" + +#: ../src/viktrwlayer.c:8614 +msgid "\"_Center\"" +msgstr "“中心”(_C)" + +#: ../src/viktrwlayer.c:8620 +msgid "_Endpoint" +msgstr "结束点(_E)" + +#: ../src/viktrwlayer.c:8626 +msgid "_Highest Altitude" +msgstr "最高海拔(_H)" + +#: ../src/viktrwlayer.c:8632 +msgid "_Lowest Altitude" +msgstr "最低海拔(_L)" + +#: ../src/viktrwlayer.c:8640 +msgid "_Maximum Speed" +msgstr "极速(_M)" + +#: ../src/viktrwlayer.c:8646 +#, fuzzy +msgid "_Date" +msgstr "日期" + +#: ../src/viktrwlayer.c:8655 +msgid "Co_mbine" +msgstr "组合(_m)" + +#: ../src/viktrwlayer.c:8663 +msgid "_Merge By Time..." +msgstr "按时间合并(_M)…" + +#: ../src/viktrwlayer.c:8668 +msgid "Merge _Segments" +msgstr "合并线段(_S)" + +#: ../src/viktrwlayer.c:8675 +msgid "Merge _With Other Tracks..." +msgstr "跟其他轨迹合并(_W)…" + +#: ../src/viktrwlayer.c:8682 +msgid "_Append Track..." +msgstr "扩展轨迹(_A)…" + +#: ../src/viktrwlayer.c:8684 +msgid "_Append Route..." +msgstr "扩展路线(_A)…" + +#: ../src/viktrwlayer.c:8690 +msgid "Append _Route..." +msgstr "扩展路线(_R)…" + +#: ../src/viktrwlayer.c:8692 +msgid "Append _Track..." +msgstr "扩展轨迹(_T)…" + +#: ../src/viktrwlayer.c:8699 +msgid "_Split" +msgstr "分割(_S)" + +#: ../src/viktrwlayer.c:8707 +msgid "_Split By Time..." +msgstr "以时间分割(_S)…" + +#. ATM always enable this entry - don't want to have to analyse the track before displaying the menu - to keep the menu speedy +#: ../src/viktrwlayer.c:8713 +msgid "Split Se_gments" +msgstr "分割线段(_g)" + +#: ../src/viktrwlayer.c:8719 +msgid "Split By _Number of Points..." +msgstr "以点数分割(_N)…" + +#: ../src/viktrwlayer.c:8724 +msgid "Split at _Trackpoint" +msgstr "在轨迹点分割(_T)" + +#: ../src/viktrwlayer.c:8732 +msgid "_Insert Points" +msgstr "插入点(_I)" + +#: ../src/viktrwlayer.c:8738 +msgid "Insert Point _Before Selected Point" +msgstr "在所选点前插入(_B)" + +#: ../src/viktrwlayer.c:8745 +msgid "Insert Point _After Selected Point" +msgstr "在所选点后插入(_A)" + +#: ../src/viktrwlayer.c:8754 +msgid "Delete Poi_nts" +msgstr "删除点(_n)" + +#: ../src/viktrwlayer.c:8760 +msgid "Delete _Selected Point" +msgstr "删除所选点(_S)" + +#: ../src/viktrwlayer.c:8768 +msgid "Delete Points With The Same _Position" +msgstr "删除相同位置点(_P)" + +#: ../src/viktrwlayer.c:8773 +msgid "Delete Points With The Same _Time" +msgstr "删除相同时间点(_T)" + +#: ../src/viktrwlayer.c:8780 ../src/viktrwlayer.c:9029 +msgid "_Transform" +msgstr "变换(_T)" + +#: ../src/viktrwlayer.c:8788 ../src/viktrwlayer.c:9037 +msgid "_Apply DEM Data" +msgstr "应用DEM数据(_A)" + +#: ../src/viktrwlayer.c:8793 ../src/viktrwlayer.c:9042 +msgid "_Overwrite" +msgstr "覆盖(_O)" + +#: ../src/viktrwlayer.c:8796 ../src/viktrwlayer.c:9045 +msgid "Overwrite any existing elevation values with DEM values" +msgstr "以DEM(Digital Elevation Model数字高程模型)值覆盖任何已有高程值" + +#: ../src/viktrwlayer.c:8799 ../src/viktrwlayer.c:9048 +msgid "_Keep Existing" +msgstr "保持已有的(_K)" + +#: ../src/viktrwlayer.c:8802 ../src/viktrwlayer.c:9051 +msgid "Keep existing elevation values, only attempt for missing values" +msgstr "保持已有高程值, 仅应用于缺失的值" + +#: ../src/viktrwlayer.c:8807 +msgid "_Smooth Missing Elevation Data" +msgstr "光顺缺失的高程数据" + +#: ../src/viktrwlayer.c:8812 +msgid "_Interpolated" +msgstr "插值(_I)" + +#: ../src/viktrwlayer.c:8815 +msgid "" +"Interpolate between known elevation values to derive values for the missing " +"elevations" +msgstr "从已有高程值插值得到缺失的高程" + +#: ../src/viktrwlayer.c:8818 +msgid "_Flat" +msgstr "平直(_F)" + +#: ../src/viktrwlayer.c:8821 +msgid "Set unknown elevation values to the last known value" +msgstr "把未知高程值设成最后的已知值" + +#: ../src/viktrwlayer.c:8825 +msgid "C_onvert to a Route" +msgstr "转换成路线(_o)" + +#: ../src/viktrwlayer.c:8827 +msgid "C_onvert to a Track" +msgstr "转换成轨迹(_o)" + +#: ../src/viktrwlayer.c:8835 +msgid "_Anonymize Times" +msgstr "匿名化时间(_A)" + +#: ../src/viktrwlayer.c:8838 +msgid "Shift timestamps to a relative offset from 1901-01-01" +msgstr "相对于1901年1月1日偏置时间戳" + +#: ../src/viktrwlayer.c:8841 +msgid "_Interpolate Times" +msgstr "插值时间(_I)" + +#: ../src/viktrwlayer.c:8844 +msgid "" +"Reset trackpoint timestamps between the first and last points such that " +"track is traveled at equal speed" +msgstr "重置轨迹点的时间戳到最先和最后点使轨迹以均速进行" + +#: ../src/viktrwlayer.c:8849 +msgid "_Reverse Track" +msgstr "反转轨迹(_R)" + +#: ../src/viktrwlayer.c:8851 +msgid "_Reverse Route" +msgstr "反转路线(_R)" + +#: ../src/viktrwlayer.c:8858 +msgid "Refine Route..." +msgstr "改善路线…" + +#: ../src/viktrwlayer.c:8868 +msgid "Down_load Maps Along Track..." +msgstr "沿轨迹下载地图(_l)…" + +#: ../src/viktrwlayer.c:8870 +msgid "Down_load Maps Along Route..." +msgstr "沿路线下载地图(_l)…" + +#: ../src/viktrwlayer.c:8878 +msgid "_Export Track as GPX..." +msgstr "导出轨迹为GPX(_E)…" + +#: ../src/viktrwlayer.c:8880 +msgid "_Export Route as GPX..." +msgstr "导出路线为GPX(_E)…" + +#: ../src/viktrwlayer.c:8887 +msgid "E_xtend Track End" +msgstr "延伸轨迹尾部(_x)" + +#: ../src/viktrwlayer.c:8889 +msgid "E_xtend Route End" +msgstr "延伸路线尾部(_x)" + +#: ../src/viktrwlayer.c:8896 +msgid "Extend _Using Route Finder" +msgstr "用路线查找器延伸" + +#: ../src/viktrwlayer.c:8911 +msgid "_Upload to GPS..." +msgstr "上传到GPS设备(_U)…" + +#: ../src/viktrwlayer.c:8926 +msgid "_Diary" +msgstr "日记(_D)" + +#: ../src/viktrwlayer.c:8930 +msgid "Open diary program at this date" +msgstr "在该日期打开日记程序" + +#: ../src/viktrwlayer.c:8935 +msgid "_Astronomy" +msgstr "天文(_A)" + +#: ../src/viktrwlayer.c:8938 +msgid "Open astronomy program at this date and location" +msgstr "在该日期和地点打开天文程序" + +#: ../src/viktrwlayer.c:8962 +msgid "_View Google Directions" +msgstr "显示Google Directions(谷歌方向)(_V)" + +#: ../src/viktrwlayer.c:8984 +msgid "Use with _Filter" +msgstr "使用过滤器(_F)" + +#: ../src/viktrwlayer.c:9018 +msgid "_Edit Trackpoint" +msgstr "编辑轨迹点(_E)" + +#: ../src/viktrwlayer.c:10116 +#, c-format +msgid " - Gain %dm:Loss %dm" +msgstr " -爬升%d米:下降%d米" + +#: ../src/viktrwlayer.c:10118 +#, c-format +msgid " - Gain %dft:Loss %dft" +msgstr " -爬升%d英尺:下降%d英尺" + +#: ../src/viktrwlayer.c:10123 +#, c-format +msgid " - Bearing %3.1f° - Step %s" +msgstr " -方位%3.1f° -步调%s" + +#: ../src/viktrwlayer.c:10232 +#, c-format +msgid "Querying %s for route between (%.3f, %.3f) and (%.3f, %.3f)." +msgstr "查询%s于路线(%.3f, %.3f)至(%.3f, %.3f)。" + +#: ../src/viktrwlayer.c:10248 +#, c-format +msgid "%s returned route between (%.3f, %.3f) and (%.3f, %.3f)." +msgstr "%s返回路线于(%.3f, %.3f)至(%.3f, %.3f)。" + +#: ../src/viktrwlayer.c:10251 +#, c-format +msgid "Error getting route from %s." +msgstr "从%s获得路线有错。" + +#: ../src/viktrwlayer.c:11070 +#, c-format +msgid "Creating %d Image Thumbnails..." +msgstr "正创建%d图像概略…" + +#: ../src/viktrwlayer.c:11560 +msgid "No map layer in use. Create one first" +msgstr "无所用地图。创建一个先" + +#: ../src/viktrwlayer.c:11679 +#, c-format +msgid "%s: Track List" +msgstr "%s:轨迹列表" + +#: ../src/viktrwlayer.c:11681 +#, c-format +msgid "%s: Route List" +msgstr "%s:路线列表" + +#: ../src/viktrwlayer.c:11734 +#, c-format +msgid "" +"Could not write external layer %s to %s, please fix and save before exiting " +"or data will be lost" +msgstr "" + +#: ../src/viktrwlayer.c:11782 +#, fuzzy, c-format +msgid "WARNING: issues encountered loading external layer %s from %s" +msgstr "警告:遇到麻烦于加载%s" + +#: ../src/viktrwlayer_export.c:47 +msgid "Auto Device GPX Simplify:" +msgstr "" + +#: ../src/viktrwlayer_export.c:48 +msgid "" +"GPX saves to certain devices will be simplified for device compatibility." +msgstr "" + +#: ../src/viktrwlayer_export.c:125 +#, c-format +msgid "Export of GPX file simplified using point limit: %d" +msgstr "" + +#: ../src/viktrwlayer_export.c:206 ../src/viktrwlayer_export.c:323 +#: ../src/vikwindow.c:3694 +msgid "The filename you requested could not be opened for writing." +msgstr "所求文件名打不开来写入。" + +#: ../src/viktrwlayer_export.c:226 +#, c-format +msgid "Could not launch %s." +msgstr "打不开%s程序。" + +#: ../src/viktrwlayer_export.c:234 +msgid "Could not create temporary file for export." +msgstr "无法创建临时文件为导出所用。" + +#: ../src/viktrwlayer_export.c:268 +msgid "File format:" +msgstr "文件格式:" + +#: ../src/viktrwlayer_export.c:276 +msgid "Select the file format." +msgstr "选择文件格式。" + +#: ../src/viktrwlayer_export.c:281 +msgid "" +"Select the information to process.\n" +"Warning: the behavior of these switches is highly dependent of the file " +"format selected.\n" +"Please, refer to GPSbabel if unsure." +msgstr "" +"选择信息来处理。\n" +"警告:这些开关的行为高度依赖所选文件格式。\n" +"请读GPSBabel文档如有疑虑。" + +#: ../src/viktrwlayer_export.c:308 +msgid "You did not select a valid file format." +msgstr "还未选择有效文件格式。" + +#: ../src/viktrwlayer_propwin.c:915 ../src/viktrwlayer_propwin.c:3381 +#: ../src/viktrwlayer_propwin.c:3417 ../src/viktrwlayer_propwin.c:3457 +#: ../src/viktrwlayer_propwin.c:3509 ../src/viktrwlayer_propwin.c:3527 +#: ../src/viktrwlayer_propwin.c:3600 ../src/viktrwlayer_propwin.c:3601 +#: ../src/viktrwlayer_propwin.c:3602 ../src/viktrwlayer_propwin.c:3611 +#: ../src/viktrwlayer_propwin.c:3612 ../src/viktrwlayer_propwin.c:3629 +#: ../src/viktrwlayer_propwin.c:3630 ../src/viktrwlayer_propwin.c:3644 +#: ../src/viktrwlayer_propwin.c:3645 ../src/viktrwlayer_propwin.c:3646 +#: ../src/viktrwlayer_propwin.c:3660 ../src/viktrwlayer_propwin.c:3661 +#: ../src/viktrwlayer_propwin.c:3662 ../src/viktrwlayer_propwin.c:3676 +#: ../src/viktrwlayer_propwin.c:3677 ../src/viktrwlayer_propwin.c:3678 +#: ../src/viktrwlayer_propwin.c:3695 ../src/viktrwlayer_propwin.c:3696 +#: ../src/viktrwlayer_analysis.c:293 +#, c-format +msgid "No Data" +msgstr "无数据" + +#: ../src/viktrwlayer_propwin.c:960 ../src/viktrwlayer_propwin.c:1245 +#, c-format +msgid "%.1f kph" +msgstr "%.1f公里/小时" + +#: ../src/viktrwlayer_propwin.c:963 ../src/viktrwlayer_propwin.c:1248 +#: ../src/viktrwlayer_analysis.c:352 +#, c-format +msgid "%.1f mph" +msgstr "%.1f英里/小时" + +#: ../src/viktrwlayer_propwin.c:966 ../src/viktrwlayer_propwin.c:1251 +#, c-format +msgid "%.1f knots" +msgstr "%.1f节" + +#: ../src/viktrwlayer_propwin.c:969 ../src/viktrwlayer_propwin.c:1254 +#, fuzzy, c-format +msgid "%.1f s/km" +msgstr "%.1f公里" + +#: ../src/viktrwlayer_propwin.c:972 ../src/viktrwlayer_propwin.c:1257 +#: ../src/viktrwlayer_analysis.c:389 ../src/viktrwlayer_analysis.c:392 +#, fuzzy, c-format +msgid "%.1f min/km" +msgstr "%.1f公里" + +#: ../src/viktrwlayer_propwin.c:975 ../src/viktrwlayer_propwin.c:1260 +#, fuzzy, c-format +msgid "%.1f sec/mi" +msgstr "%.1f英里" + +#: ../src/viktrwlayer_propwin.c:978 ../src/viktrwlayer_propwin.c:1263 +#: ../src/viktrwlayer_analysis.c:409 ../src/viktrwlayer_analysis.c:412 +#, fuzzy, c-format +msgid "%.1f min/mi" +msgstr "%.1f米/秒" + +#. VIK_UNITS_SPEED_METRES_PER_SECOND: +#: ../src/viktrwlayer_propwin.c:982 ../src/viktrwlayer_propwin.c:1267 +#, c-format +msgid "%.1f m/s" +msgstr "%.1f米/秒" + +#. Minutes +#: ../src/viktrwlayer_propwin.c:1411 +msgid "mins" +msgstr "分" + +#. Hours +#: ../src/viktrwlayer_propwin.c:1418 +msgid "h" +msgstr "时" + +#. Days +#: ../src/viktrwlayer_propwin.c:1424 +msgid "d" +msgstr "天" + +#. Weeks +#: ../src/viktrwlayer_propwin.c:1429 +msgid "w" +msgstr "周" + +#. 'Months' +#: ../src/viktrwlayer_propwin.c:1433 +msgid "M" +msgstr "月" + +#: ../src/viktrwlayer_propwin.c:2051 ../src/viktrwlayer_analysis.c:303 +#, c-format +msgid "%.1f miles" +msgstr "%.1f英里" + +#: ../src/viktrwlayer_propwin.c:2054 ../src/viktrwlayer_analysis.c:306 +#, c-format +msgid "%.1f NM" +msgstr "%.1f海里" + +#. VIK_UNITS_DISTANCE_KILOMETRES +#: ../src/viktrwlayer_propwin.c:2057 ../src/viktrwlayer_analysis.c:310 +#, c-format +msgid "%.1f km" +msgstr "%.1f公里" + +#: ../src/viktrwlayer_propwin.c:3083 +msgid "Failed spliting track. Track unchanged" +msgstr "分割轨迹失败。轨迹未变" + +#: ../src/viktrwlayer_propwin.c:3234 ../src/viktrwlayer_propwin.c:3744 +#, c-format +msgid "%s - Track Properties" +msgstr "%s-轨迹属性" + +#: ../src/viktrwlayer_propwin.c:3239 +msgid "Split at _Marker" +msgstr "在记号处分割(_M)" + +#: ../src/viktrwlayer_propwin.c:3240 +msgid "Split _Segments" +msgstr "分割线段(_S)" + +#: ../src/viktrwlayer_propwin.c:3241 +msgid "_Reverse" +msgstr "反转(_R)" + +#: ../src/viktrwlayer_propwin.c:3242 +msgid "_Delete Dupl." +msgstr "删除重复(_D)" + +#: ../src/viktrwlayer_propwin.c:3269 +msgid "Comment:" +msgstr "注释:" + +#: ../src/viktrwlayer_propwin.c:3270 +msgid "Description:" +msgstr "描述:" + +#: ../src/viktrwlayer_propwin.c:3271 +#, fuzzy +msgid "Source:" +msgstr "航线:" + +#: ../src/viktrwlayer_propwin.c:3272 +#, fuzzy +msgid "Type:" +msgstr "时间:" + +#: ../src/viktrwlayer_propwin.c:3273 +msgid "Color:" +msgstr "颜色:" + +#: ../src/viktrwlayer_propwin.c:3274 +msgid "Draw Name:" +msgstr "绘制名字:" + +#: ../src/viktrwlayer_propwin.c:3275 +msgid "Distance Labels:" +msgstr "距离标签:" + +#: ../src/viktrwlayer_propwin.c:3278 +msgid "Track Length:" +msgstr "轨迹长度:" + +#: ../src/viktrwlayer_propwin.c:3279 +msgid "Trackpoints:" +msgstr "路标:" + +#: ../src/viktrwlayer_propwin.c:3280 +msgid "Segments:" +msgstr "线段:" + +#: ../src/viktrwlayer_propwin.c:3281 +msgid "Duplicate Points:" +msgstr "重复点:" + +#: ../src/viktrwlayer_propwin.c:3282 +msgid "Max Speed:" +msgstr "极速:" + +#: ../src/viktrwlayer_propwin.c:3283 +msgid "Avg. Speed:" +msgstr "均速:" + +#: ../src/viktrwlayer_propwin.c:3284 +msgid "Moving Avg. Speed:" +msgstr "移动均速:" + +#: ../src/viktrwlayer_propwin.c:3285 +msgid "Avg. Dist. Between TPs:" +msgstr "均距:" + +#: ../src/viktrwlayer_propwin.c:3286 +msgid "Elevation Range:" +msgstr "高程范围:" + +#: ../src/viktrwlayer_propwin.c:3287 +msgid "Total Elevation Gain/Loss:" +msgstr "总爬升/下降:" + +#: ../src/viktrwlayer_propwin.c:3288 +msgid "Start:" +msgstr "开始:" + +#: ../src/viktrwlayer_propwin.c:3289 +msgid "End:" +msgstr "结束:" + +#: ../src/viktrwlayer_propwin.c:3290 +msgid "Duration:" +msgstr "时间:" + +#: ../src/viktrwlayer_propwin.c:3320 +msgid "Centre" +msgstr "居中" + +#: ../src/viktrwlayer_propwin.c:3321 +msgid "Start only" +msgstr "仅开始" + +#: ../src/viktrwlayer_propwin.c:3322 +msgid "End only" +msgstr "仅结束" + +#: ../src/viktrwlayer_propwin.c:3323 +msgid "Start and End" +msgstr "开始和结束" + +#: ../src/viktrwlayer_propwin.c:3324 +msgid "Centre, Start and End" +msgstr "居中,开始和结束" + +#: ../src/viktrwlayer_propwin.c:3336 +msgid "Maximum number of distance labels to be shown" +msgstr "最多数量的距离标签能够显示" + +#: ../src/viktrwlayer_propwin.c:3340 +msgid "Properties" +msgstr "属性" + +#: ../src/viktrwlayer_propwin.c:3584 +#, c-format +msgid "%d minutes - %d minutes moving" +msgstr "%d分-%d分在移动" + +#: ../src/viktrwlayer_propwin.c:3596 +#, c-format +msgid "%s total - %s in segments" +msgstr "%s总计-%s在线段中" + +#: ../src/viktrwlayer_propwin.c:3607 ../src/viktrwlayer_analysis.c:622 +msgid "Statistics" +msgstr "统计" + +#: ../src/viktrwlayer_propwin.c:3613 ../src/viktrwlayer_propwin.c:3680 +msgid "Show D_EM" +msgstr "显示D_EM" + +#: ../src/viktrwlayer_propwin.c:3615 ../src/viktrwlayer_propwin.c:3631 +#: ../src/viktrwlayer_propwin.c:3647 ../src/viktrwlayer_propwin.c:3697 +msgid "Show _GPS Speed" +msgstr "显示_GPS速度" + +#: ../src/viktrwlayer_propwin.c:3617 ../src/viktrwlayer_propwin.c:3633 +#: ../src/viktrwlayer_propwin.c:3665 ../src/viktrwlayer_propwin.c:3699 +msgid "Track Distance:" +msgstr "轨迹距离:" + +#: ../src/viktrwlayer_propwin.c:3618 ../src/viktrwlayer_propwin.c:3684 +msgid "Track Height:" +msgstr "轨迹高度:" + +#: ../src/viktrwlayer_propwin.c:3624 +msgid "Elevation-distance" +msgstr "高程-距离" + +#: ../src/viktrwlayer_propwin.c:3634 +msgid "Track Gradient:" +msgstr "轨迹梯度:" + +#: ../src/viktrwlayer_propwin.c:3639 +msgid "Gradient-distance" +msgstr "梯度-距离" + +#: ../src/viktrwlayer_propwin.c:3649 ../src/viktrwlayer_propwin.c:3666 +#: ../src/viktrwlayer_propwin.c:3683 +msgid "Track Time:" +msgstr "轨迹时间:" + +#: ../src/viktrwlayer_propwin.c:3650 ../src/viktrwlayer_propwin.c:3700 +msgid "Track Speed:" +msgstr "轨迹速度:" + +#: ../src/viktrwlayer_propwin.c:3651 ../src/viktrwlayer_propwin.c:3667 +#: ../src/viktrwlayer_propwin.c:3685 +msgid "Time/Date:" +msgstr "时间/日期:" + +#: ../src/viktrwlayer_propwin.c:3655 +msgid "Speed-time" +msgstr "速度-时间" + +#: ../src/viktrwlayer_propwin.c:3663 ../src/viktrwlayer_propwin.c:3679 +msgid "Show S_peed" +msgstr "显示速度(_p)" + +#: ../src/viktrwlayer_propwin.c:3671 +msgid "Distance-time" +msgstr "距离-时间" + +#: ../src/viktrwlayer_propwin.c:3690 +msgid "Elevation-time" +msgstr "高程-时间" + +#: ../src/viktrwlayer_propwin.c:3705 +msgid "Speed-distance" +msgstr "速度-距离" + +#: ../src/viktrwlayer_tpwin.c:190 ../src/viktrwlayer_wpwin.c:66 +msgid "Date/Time Edit" +msgstr "日期/时间编辑" + +#: ../src/viktrwlayer_tpwin.c:242 +msgid "Name:" +msgstr "名字:" + +#: ../src/viktrwlayer_tpwin.c:243 +msgid "Latitude:" +msgstr "纬度:" + +#: ../src/viktrwlayer_tpwin.c:244 +msgid "Longitude:" +msgstr "经度:" + +#: ../src/viktrwlayer_tpwin.c:245 +msgid "Altitude:" +msgstr "海拔:" + +#: ../src/viktrwlayer_tpwin.c:246 +msgid "Course:" +msgstr "航线:" + +#: ../src/viktrwlayer_tpwin.c:247 +msgid "Timestamp:" +msgstr "时间戳:" + +#: ../src/viktrwlayer_tpwin.c:248 +msgid "Time:" +msgstr "时间:" + +#: ../src/viktrwlayer_tpwin.c:249 +msgid "Distance Difference:" +msgstr "距离差:" + +#: ../src/viktrwlayer_tpwin.c:250 +msgid "Time Difference:" +msgstr "时间差:" + +#: ../src/viktrwlayer_tpwin.c:251 +msgid "\"Speed\" Between:" +msgstr "“速度”差:" + +#: ../src/viktrwlayer_tpwin.c:252 +msgid "Speed:" +msgstr "速度:" + +#: ../src/viktrwlayer_tpwin.c:253 +msgid "VDOP:" +msgstr "VDOP(Vertical Dilution Of Precision垂直分量精度因子):" + +#: ../src/viktrwlayer_tpwin.c:254 +msgid "HDOP:" +msgstr "HDOP(Horizontal Dilution Of Precision水平分量精度因子):" + +#: ../src/viktrwlayer_tpwin.c:255 +msgid "PDOP:" +msgstr "PDOP(Position Dilution Of Precision三维位置精度因子):" + +#: ../src/viktrwlayer_tpwin.c:256 +msgid "SAT/FIX:" +msgstr "卫星/定位:" + +#: ../src/viktrwlayer_tpwin.c:263 ../src/viktrwlayer_tpwin.c:408 +#: ../src/viktrwlayer_tpwin.c:622 +msgid "Trackpoint" +msgstr "轨迹点" + +#: ../src/viktrwlayer_tpwin.c:266 +msgid "_Insert After" +msgstr "在后插入(_I)" + +#: ../src/viktrwlayer_tpwin.c:268 +msgid "Split Here" +msgstr "在此拆分" + +#: ../src/viktrwlayer_tracklist.c:262 ../src/viktrwlayer_waypointlist.c:306 +msgid "_Copy Data" +msgstr "复制数据(_C)" + +#. +#. item = gtk_image_menu_item_new_with_mnemonic ( _("_Select") ); +#. gtk_image_menu_item_set_image ( (GtkImageMenuItem*)item, gtk_image_new_from_stock (GTK_STOCK_FIND, GTK_ICON_SIZE_MENU) ); +#. g_signal_connect_swapped ( G_OBJECT(item), "activate", G_CALLBACK(trw_layer_track_select), values ); +#. gtk_menu_shell_append (GTK_MENU_SHELL (menu), item); +#. gtk_widget_show ( item ); +#. +#. ATM view auto selects, so don't bother with separate select menu entry +#. +#. item = gtk_image_menu_item_new_with_mnemonic ( _("_Select") ); +#. gtk_image_menu_item_set_image ( (GtkImageMenuItem*)item, gtk_image_new_from_stock (GTK_STOCK_FIND, GTK_ICON_SIZE_MENU) ); +#. g_signal_connect_swapped ( G_OBJECT(item), "activate", G_CALLBACK(trw_layer_waypoint_select), values ); +#. gtk_menu_shell_append (GTK_MENU_SHELL (menu), item); +#. gtk_widget_show ( item ); +#. +#. AUTO SELECT NOT TRUE YET... +#. ATM view auto selects, so don't bother with separate select menu entry +#: ../src/viktrwlayer_tracklist.c:290 ../src/viktrwlayer_waypointlist.c:341 +#: ../src/vikwindow.c:4816 +msgid "_View" +msgstr "显示(_V)" + +#. Insert column for the layer name when viewing multi layers +#: ../src/viktrwlayer_tracklist.c:613 ../src/viktrwlayer_waypointlist.c:609 +msgid "Layer" +msgstr "图层" + +#: ../src/viktrwlayer_tracklist.c:627 ../src/viktrwlayer_waypointlist.c:624 +msgid "Date" +msgstr "日期" + +#: ../src/viktrwlayer_tracklist.c:631 ../src/viktrwlayer_waypointlist.c:628 +msgid "Visible" +msgstr "可见" + +#: ../src/viktrwlayer_tracklist.c:639 +msgid "" +"Distance\n" +"(miles)" +msgstr "" +"距离\n" +"(英里)" + +#: ../src/viktrwlayer_tracklist.c:642 +#, fuzzy +msgid "" +"Distance\n" +"(NM)" +msgstr "" +"距离\n" +"(公里)" + +#: ../src/viktrwlayer_tracklist.c:645 +msgid "" +"Distance\n" +"(km)" +msgstr "" +"距离\n" +"(公里)" + +#: ../src/viktrwlayer_tracklist.c:651 +msgid "" +"Length\n" +"(minutes)" +msgstr "" +"时长\n" +"(分钟)" + +#: ../src/viktrwlayer_tracklist.c:660 ../src/vikutils.c:93 +msgid "sec/mi" +msgstr "" + +#: ../src/viktrwlayer_tracklist.c:666 +#, c-format +msgid "" +"Av. Speed\n" +"(%s)" +msgstr "" +"均速\n" +"(%s)" + +#. Apply own formatting of the data +#: ../src/viktrwlayer_tracklist.c:671 +#, c-format +msgid "" +"Max Speed\n" +"(%s)" +msgstr "" +"极速\n" +"(%s)" + +#: ../src/viktrwlayer_tracklist.c:679 ../src/viktrwlayer_waypointlist.c:637 +msgid "" +"Max Height\n" +"(Feet)" +msgstr "" +"最大高度\n" +"(英尺)" + +#: ../src/viktrwlayer_tracklist.c:681 ../src/viktrwlayer_waypointlist.c:639 +msgid "" +"Max Height\n" +"(Metres)" +msgstr "" +"最大高度\n" +"(米)" + +#: ../src/viktrwlayer_waypointlist.c:312 +msgid "Copy Data (with _positions)" +msgstr "复制数据(和位置)(_p)" + +#: ../src/viktrwlayer_waypointlist.c:633 +msgid "Comment" +msgstr "注释" + +#: ../src/viktrwlayer_waypointlist.c:643 +msgid "Symbol" +msgstr "符号" + +#: ../src/viktrwlayer_wpwin.c:93 ../src/viktrwlayer_wpwin.c:302 +msgid "True" +msgstr "" + +#: ../src/viktrwlayer_wpwin.c:122 +msgid "Waypoint Properties" +msgstr "路标属性" + +#: ../src/viktrwlayer_wpwin.c:164 +msgid "Name:" +msgstr "名字:" + +#: ../src/viktrwlayer_wpwin.c:181 +msgid "Altitude:" +msgstr "海拔:" + +#: ../src/viktrwlayer_wpwin.c:186 ../src/viktrwlayer_wpwin.c:188 +msgid "Comment:" +msgstr "注释:" + +#: ../src/viktrwlayer_wpwin.c:202 +#, fuzzy +msgid "Source:" +msgstr "下载源:" + +#: ../src/viktrwlayer_wpwin.c:212 +msgid "Image:" +msgstr "图像:" + +#: ../src/viktrwlayer_wpwin.c:217 +msgid "Symbol:" +msgstr "符号:" + +#: ../src/viktrwlayer_wpwin.c:226 +msgid "(none)" +msgstr "(无)" + +#. Geotag Info [readonly] +#: ../src/viktrwlayer_wpwin.c:272 +msgid "Has Geotag" +msgstr "含地理标记" + +#: ../src/viktrwlayer_wpwin.c:279 +msgid "Consistent Position" +msgstr "持续位置" + +#. ATM the direction value box is always shown, even when there is no information. +#. It would be nice to be able to hide it until the 'Add' has been performed, +#. however I've not been able to achieve this. +#. Thus simply sensistizing it instead. +#: ../src/viktrwlayer_wpwin.c:292 +#, fuzzy +msgid "Image Direction:" +msgstr "图像时区:" + +#: ../src/viktrwlayer_wpwin.c:300 +msgid "Magnetic" +msgstr "" + +#: ../src/viktrwlayer_wpwin.c:320 +msgid "Time:" +msgstr "时间:" + +#. TODO: other checks (isalpha or whatever ) +#: ../src/viktrwlayer_wpwin.c:386 +msgid "Please enter a name for the waypoint." +msgstr "请为此路标取名。" + +#: ../src/viktrwlayer_geotag.c:320 ../src/viktrwlayer_geotag.c:460 +#, c-format +msgid "Failed updating EXIF on %s" +msgstr "无法更新EXIF数据于%s" + +#: ../src/viktrwlayer_geotag.c:562 +#, c-format +msgid "Geotagging %d Images..." +msgstr "正地理标记%d图像…" + +#: ../src/viktrwlayer_geotag.c:630 +msgid "Geotag Images" +msgstr "地理标记图像" + +#: ../src/viktrwlayer_geotag.c:640 +msgid "Images" +msgstr "图像" + +#: ../src/viktrwlayer_geotag.c:645 +msgid "Overwrite Existing Waypoints:" +msgstr "覆盖已有路标:" + +#: ../src/viktrwlayer_geotag.c:648 +msgid "Overwrite Existing GPS Information:" +msgstr "覆盖已有GPS信息:" + +#: ../src/viktrwlayer_geotag.c:650 +msgid "Keep File Modification Timestamp:" +msgstr "保持文件修改时间戳:" + +#: ../src/viktrwlayer_geotag.c:684 +msgid "Create Waypoints:" +msgstr "创建路标:" + +#: ../src/viktrwlayer_geotag.c:693 +msgid "Write EXIF:" +msgstr "写入EXIF:" + +#: ../src/viktrwlayer_geotag.c:705 +msgid "Automatic Image Direction:" +msgstr "" + +#: ../src/viktrwlayer_geotag.c:707 +msgid "Set image direction based on a heading derived from the track" +msgstr "" + +#: ../src/viktrwlayer_geotag.c:710 +msgid "Interpolate Between Track Segments:" +msgstr "插值在轨迹线段间:" + +#: ../src/viktrwlayer_geotag.c:715 +msgid "Image Time Offset (Seconds):" +msgstr "图像时间偏置(秒):" + +#: ../src/viktrwlayer_geotag.c:718 +msgid "" +"The number of seconds to ADD to the photos time to make it match the GPS " +"data. Calculate this with (GPS - Photo). Can be negative or positive. Useful " +"to adjust times when a camera's timestamp was incorrect." +msgstr "" +"所加秒数给拍照时间使其符合GPS(全球定位系统)数据。计算自(GPS减去照片)。可" +"正可负。可用于调整时间,尤当相机时间戳有误时。" + +#: ../src/viktrwlayer_geotag.c:721 +msgid "Image Timezone:" +msgstr "图像时区:" + +#: ../src/viktrwlayer_geotag.c:724 +msgid "" +"The timezone that was used when the images were created. For example, if a " +"camera is set to AWST or +8:00 hours. Enter +8:00 here so that the correct " +"adjustment to the images' time can be made. GPS data is always in UTC." +msgstr "" +"图像创建时所在时区。如相机为AWST或+8:00时区。输入+8:00以适当调整图像的时间。" +"GPS(全球定位系统)数据总是UTC(协调世界时)。" + +#: ../src/viktrwlayer_geotag.c:728 +#, c-format +msgid "Using waypoint: %s" +msgstr "使用路标:%s" + +#: ../src/viktrwlayer_geotag.c:742 +#, c-format +msgid "Using track: %s" +msgstr "使用轨迹:%s" + +#: ../src/viktrwlayer_geotag.c:744 +#, c-format +msgid "Using all tracks in: %s" +msgstr "使用全部轨迹于:%s" + +#: ../src/viktrwlayer_analysis.c:214 +msgid "Number of Tracks" +msgstr "轨迹数量" + +#: ../src/viktrwlayer_analysis.c:215 +msgid "Date Range" +msgstr "日期范围" + +#: ../src/viktrwlayer_analysis.c:216 +msgid "Total Length" +msgstr "总长" + +#: ../src/viktrwlayer_analysis.c:217 +msgid "Average Length" +msgstr "均长" + +#: ../src/viktrwlayer_analysis.c:218 +msgid "Eddington number" +msgstr "" + +#. No.4: Extended display only +#: ../src/viktrwlayer_analysis.c:219 +msgid "Max Speed" +msgstr "极速" + +#: ../src/viktrwlayer_analysis.c:220 +msgid "Avg. Speed" +msgstr "均速" + +#: ../src/viktrwlayer_analysis.c:221 +msgid "Minimum Altitude" +msgstr "最低海拔" + +#: ../src/viktrwlayer_analysis.c:222 +msgid "Maximum Altitude" +msgstr "最高海拔" + +#: ../src/viktrwlayer_analysis.c:223 +msgid "Total Elevation Gain/Loss" +msgstr "总爬升/下降" + +#: ../src/viktrwlayer_analysis.c:224 +msgid "Avg. Elevation Gain/Loss" +msgstr "平均爬升/下降" + +#: ../src/viktrwlayer_analysis.c:225 +msgid "Total Duration" +msgstr "总持续时间" + +#: ../src/viktrwlayer_analysis.c:226 +msgid "Avg. Duration" +msgstr "平均持续时间" + +#: ../src/viktrwlayer_analysis.c:317 +#, c-format +msgid "%.2f miles" +msgstr "%.2f英里" + +#: ../src/viktrwlayer_analysis.c:320 +#, fuzzy, c-format +msgid "%.2f NM" +msgstr "%.1f海里" + +#. VIK_UNITS_DISTANCE_KILOMETRES +#: ../src/viktrwlayer_analysis.c:324 +#, c-format +msgid "%.2f km" +msgstr "%.2f公里" + +#: ../src/viktrwlayer_analysis.c:361 +#, c-format +msgid "%.2f m/s" +msgstr "%.2f米/秒" + +#: ../src/viktrwlayer_analysis.c:370 ../src/viktrwlayer_analysis.c:373 +#, c-format +msgid "%.2f knots" +msgstr "%.2f节" + +#: ../src/viktrwlayer_analysis.c:379 ../src/viktrwlayer_analysis.c:382 +#, c-format +msgid "%d s/km" +msgstr "" + +#: ../src/viktrwlayer_analysis.c:399 ../src/viktrwlayer_analysis.c:402 +#, c-format +msgid "%d sec/mi" +msgstr "" + +#: ../src/viktrwlayer_analysis.c:420 ../src/viktrwlayer_analysis.c:423 +#, c-format +msgid "%.2f km/h" +msgstr "%.2f公里/小时" + +#: ../src/viktrwlayer_analysis.c:434 ../src/viktrwlayer_analysis.c:440 +#, c-format +msgid "%d feet" +msgstr "%d英尺" + +#: ../src/viktrwlayer_analysis.c:445 ../src/viktrwlayer_analysis.c:447 +#, c-format +msgid "%d feet / %d feet" +msgstr "%d英尺/%d英尺" + +#: ../src/viktrwlayer_analysis.c:452 ../src/viktrwlayer_analysis.c:458 +#, c-format +msgid "%d m" +msgstr "%d米" + +#: ../src/viktrwlayer_analysis.c:463 ../src/viktrwlayer_analysis.c:465 +#, c-format +msgid "%d m / %d m" +msgstr "%d米/%d米" + +#: ../src/viktrwlayer_analysis.c:477 +#, c-format +msgid "%d:%02d:%02d days:hrs:mins" +msgstr "%d:%02d:%02d天:时:分" + +#: ../src/viktrwlayer_analysis.c:484 +#, c-format +msgid "%d:%02d hrs:mins" +msgstr "%d:%02d天:时" + +#: ../src/viktrwlayer_analysis.c:658 +msgid "Include Invisible Items" +msgstr "包括不可见条目" + +#: ../src/vikstatus.c:129 +msgid "Current number of background tasks. Click to see the background jobs." +msgstr "当前后台任务数量。点击可见后台任务。" + +#: ../src/vikstatus.c:134 +msgid "Current zoom level. Click to select a new one." +msgstr "当前缩放等级。点击可选新的。" + +#: ../src/vikstatus.c:141 +msgid "Left click to clear the message. Right click to copy the message." +msgstr "左键清除消息。右键复制消息。" + +#: ../src/vikutils.c:108 +msgid "GPSD" +msgstr "GPSD(GPS守护进程)" + +#. GPS Preamble +#: ../src/vikutils.c:109 +msgid "Trkpt" +msgstr "轨迹点" + +#: ../src/vikutils.c:160 +#, c-format +msgid "%sSpeed%s %.1f%s" +msgstr "%s速度%s %.1f%s" + +#. Go for 2dp as expect low values for vertical speeds +#: ../src/vikutils.c:214 +#, c-format +msgid "%sClimb%s %.2f%s" +msgstr "%s爬升%s %.2f%s" + +#: ../src/vikutils.c:223 +#, c-format +msgid "%sAlt %dfeet" +msgstr "%s海拔%d英尺" + +#. VIK_UNITS_HEIGHT_METRES: +#: ../src/vikutils.c:227 +#, c-format +msgid "%sAlt %dm" +msgstr "%s海拔%d米" + +#: ../src/vikutils.c:235 +#, c-format +msgid "%sCourse %03d°" +msgstr "%s航线%03d°" + +#: ../src/vikutils.c:249 +msgid "yards" +msgstr "码" + +#. VIK_UNITS_DISTANCE_KILOMETRES: +#: ../src/vikutils.c:253 +msgid "m" +msgstr "米" + +#: ../src/vikutils.c:257 +#, c-format +msgid "%sDistance diff %d%s" +msgstr "%s距离差%d%s" + +#: ../src/vikutils.c:272 +#, c-format +msgid "%sTime %s" +msgstr "%s时间%s" + +#: ../src/vikutils.c:281 +#, c-format +msgid "%sTime diff %lds" +msgstr "%s时间差%ld秒" + +#: ../src/vikutils.c:287 +#, c-format +msgid "%sNo. of Sats %d" +msgstr "%s卫星数量%d" + +#: ../src/vikutils.c:312 +#, c-format +msgid "%sTo End %.2f%s" +msgstr "%s到结束%.2f%s" + +#: ../src/vikutils.c:339 +#, c-format +msgid "%sDistance along %.2f%s" +msgstr "%s沿途距离%.2f%s" + +#: ../src/vikutils.c:359 +#, c-format +msgid "%sTrack: %s" +msgstr "%s轨迹:%s" + +#: ../src/vikutils.c:396 +#, c-format +msgid "" +"There is a newer version of Viking available: %s\n" +"\n" +"Do you wish to go to Viking's website now?" +msgstr "" +"有新版本程序可用:%s\n" +"\n" +"确定要去本程序网站?" + +#: ../src/vikutils.c:526 +msgid "" +"This appears to be Viking's very first run.\n" +"\n" +"Do you wish to enable automatic internet features?\n" +"\n" +"Individual settings can be controlled in the Preferences." +msgstr "" +"貌似这是第一次运行本程序。\n" +"\n" +"确定要启用自动网络特性?\n" +"\n" +"单项设置可在首选项中控制。" + +#: ../src/vikwaypoint.c:37 +msgid "Waypoint" +msgstr "路标" + +#: ../src/vikwebtool_datasource.c:352 +msgid "Search Term" +msgstr "搜索项目" + +#. TODO get rid of this as this is unnecessary duplication... +#: ../src/vikwindow.c:258 +msgid "Pan" +msgstr "移动" + +#: ../src/vikwindow.c:258 +msgid "Zoom" +msgstr "缩放" + +#: ../src/vikwindow.c:258 +msgid "Ruler" +msgstr "测距" + +#: ../src/vikwindow.c:258 +msgid "Select" +msgstr "选择" + +#: ../src/vikwindow.c:368 +msgid "This is Viking " +msgstr "" + +#: ../src/vikwindow.c:457 +msgid "Location lookup aborted" +msgstr "位置查找已终止" + +#: ../src/vikwindow.c:477 +#, c-format +msgid "Location found: %s" +msgstr "位置已找到:%s" + +#: ../src/vikwindow.c:486 +msgid "Unable to determine location" +msgstr "无法确定位置" + +#: ../src/vikwindow.c:495 +msgid "Determining location" +msgstr "正在确定位置" + +#: ../src/vikwindow.c:525 +#, fuzzy, c-format +msgid "Location found via geoclue" +msgstr "位置已找到:%s" + +#: ../src/vikwindow.c:546 +msgid "Default Map" +msgstr "默认地图" + +#: ../src/vikwindow.c:557 ../src/vikwindow.c:3938 +msgid "Trying to determine location..." +msgstr "尝试确定位置…" + +#. Create tooltip +#: ../src/vikwindow.c:723 +msgid "Select zoom level" +msgstr "选择缩放等级" + +#: ../src/vikwindow.c:1176 +#, c-format +msgid "" +"Do you want to save the changes you made to the document \"%s\"?\n" +"\n" +"Your changes will be lost if you don't save them." +msgstr "" +"确定要保存已修改文档“%s”?\n" +"\n" +"所改将丢失若不保存。" + +#: ../src/vikwindow.c:1180 +msgid "Don't Save" +msgstr "不保存" + +#: ../src/vikwindow.c:1268 +msgid "mpp" +msgstr "米每像素" + +#: ../src/vikwindow.c:1268 +msgid "pixelfact" +msgstr "像素因子" + +#: ../src/vikwindow.c:1467 +#, c-format +msgid "%s %s %dm" +msgstr "%s %s %d米" + +#: ../src/vikwindow.c:1469 +#, c-format +msgid "%s %s %dft" +msgstr "%s %s %d英尺" + +#: ../src/vikwindow.c:1472 +#, c-format +msgid "%s %s" +msgstr "%s %s" + +#: ../src/vikwindow.c:1929 +msgid "_Ruler" +msgstr "测距(_R)" + +#: ../src/vikwindow.c:1929 +msgid "Ruler Tool" +msgstr "测距工具" + +#: ../src/vikwindow.c:2204 ../src/vikwindow.c:4818 +msgid "_Zoom" +msgstr "缩放(_Z)" + +#: ../src/vikwindow.c:2204 +msgid "Zoom Tool" +msgstr "缩放工具" + +#: ../src/vikwindow.c:2271 ../src/vikwindow.c:4819 +msgid "_Pan" +msgstr "平移(_P)" + +#: ../src/vikwindow.c:2271 +msgid "Pan Tool" +msgstr "平移工具" + +#: ../src/vikwindow.c:2425 +msgid "_Select" +msgstr "选择(_S)" + +#: ../src/vikwindow.c:2425 +msgid "Select Tool" +msgstr "选择工具" + +#: ../src/vikwindow.c:2615 +msgid "You must select a layer to show its properties." +msgstr "须选一个层才能显示它的属性" + +#. No error to show, so unlikely this will get called +#: ../src/vikwindow.c:2629 +msgid "The help system is not available." +msgstr "帮助系统不可用。" + +#. Main error path +#: ../src/vikwindow.c:2632 +#, c-format +msgid "" +"Help is not available because: %s.\n" +"Ensure a Mime Type ghelp handler program is installed (e.g. yelp)." +msgstr "" +"帮助不可用是因为:%s。\n" +"确保MIME(多用途互联网邮件扩展)类型ghelp程序已安装(比如yelp)。" + +#: ../src/vikwindow.c:2865 +msgid "You must select a layer to delete." +msgstr "须选一个层才能删除。" + +#: ../src/vikwindow.c:3171 +msgid "Untitled" +msgstr "无标题" + +#: ../src/vikwindow.c:3300 +#, c-format +msgid "Unable to add '%s' to the list of recently used documents" +msgstr "无法添加‘%s’到新开档列表" + +#: ../src/vikwindow.c:3391 +msgid "The file you requested could not be opened." +msgstr "打不开文件。" + +#: ../src/vikwindow.c:3394 +msgid "" +"GPSBabel is required to load files of this type or GPSBabel encountered " +"problems." +msgstr "须有GPSBabel程序才能加载此类文件或GPSBabel遇到困难。" + +#: ../src/vikwindow.c:3397 +#, c-format +msgid "Unable to load malformed GPX file %s" +msgstr "无法加载格式错误的GPX文件%s" + +#: ../src/vikwindow.c:3400 +#, c-format +msgid "Unsupported file type for %s" +msgstr "不支持文件类型%s" + +#. Since we can process .vik files with issues just show a warning in the status bar +#. Not that a user can do much about it... or tells them what this issue is yet... +#: ../src/vikwindow.c:3406 +#, c-format +msgid "WARNING: issues encountered loading %s" +msgstr "警告:遇到麻烦于加载%s" + +#: ../src/vikwindow.c:3489 +msgid "Please select a GPS data file to open. " +msgstr "请选择GPS数据文件来打开。 " + +#: ../src/vikwindow.c:3508 +msgid "Google Earth" +msgstr "谷歌地球" + +#: ../src/vikwindow.c:3523 ../src/vikwindow.c:3646 ../src/viking.desktop.in.h:1 +msgid "Viking" +msgstr "维京" + +#: ../src/vikwindow.c:3594 ../src/vikwindow.c:4632 +msgid "Open File" +msgstr "打开文件" + +#: ../src/vikwindow.c:3630 +msgid "Save as Viking File." +msgstr "另存为维京文件。" + +#: ../src/vikwindow.c:3757 +#, c-format +msgid "Exporting to file: %s" +msgstr "导出到文件:%s" + +#. Confirm what happened. +#: ../src/vikwindow.c:3774 +#, c-format +msgid "Exported files: %d" +msgstr "导出到文件:%d" + +#: ../src/vikwindow.c:3786 +msgid "Nothing to Export!" +msgstr "无东西可导出:" + +#: ../src/vikwindow.c:3790 +msgid "Export to directory" +msgstr "导出到目录" + +#: ../src/vikwindow.c:3809 +msgid "Could not convert all files" +msgstr "无法转换全部文件" + +#: ../src/vikwindow.c:3851 +msgid "File not accessible" +msgstr "文件无权获取" + +#: ../src/vikwindow.c:3854 +msgid "No Viking File" +msgstr "无维京文件" + +#: ../src/vikwindow.c:3998 +msgid "This layer has no configurable properties." +msgstr "本层无可设置属性。" + +#: ../src/vikwindow.c:4080 +msgid "Are you sure you wish to delete all layers?" +msgstr "确定要删除全部图层?" + +#. Try harder... +#: ../src/vikwindow.c:4126 ../src/vikwindow.c:4132 +msgid "Generating image file..." +msgstr "正生成图像文件…" + +#: ../src/vikwindow.c:4154 +msgid "" +"Failed to generate internal image.\n" +"\n" +"Try creating a smaller image." +msgstr "" +"生成内部图像失败。\n" +"\n" +"正尝试创建小点的图像。" + +#: ../src/vikwindow.c:4175 +msgid "Image file generated." +msgstr "图像文件已生成。" + +#: ../src/vikwindow.c:4177 +msgid "Failed to generate image file." +msgstr "生成图像文件失败。" + +#: ../src/vikwindow.c:4246 +#, c-format +msgid "Unable to write to file %s: %s" +msgstr "无法写入文件%s:%s" + +#: ../src/vikwindow.c:4284 +msgid "" +"Viewable region outside allowable pixel size bounds for image. Clipping " +"width/height values." +msgstr "可显示区域超出允许图像像素大小界限。修剪宽度/高度值。" + +#: ../src/vikwindow.c:4309 +#, c-format +msgid "Total area: %ldm x %ldm (%.3f sq. km)" +msgstr "全部区域:%ld米乘%ld米(%.3f平方公里)" + +#: ../src/vikwindow.c:4312 +#, c-format +msgid "Total area: %ldm x %ldm (%.3f sq. miles)" +msgstr "总面积:%ld米乘%ld米(%.3f平方英里)" + +#: ../src/vikwindow.c:4315 +#, c-format +msgid "Total area: %ldm x %ldm (%.3f sq. NM)" +msgstr "总面积:%ld米乘%ld米(%.3f平方海里)" + +#. Single file +#: ../src/vikwindow.c:4343 +msgid "Save Image" +msgstr "保存图像" + +#: ../src/vikwindow.c:4364 ../src/vikwindow.c:4641 +msgid "KMZ" +msgstr "KMZ文件" + +#: ../src/vikwindow.c:4417 +msgid "You must be in UTM mode to use this feature" +msgstr "须在UTM(通用横墨卡托投影)模式中用此特性" + +#: ../src/vikwindow.c:4421 +msgid "Choose a directory to hold images" +msgstr "选择目录存放图像" + +#. todo: default for answers inside VikWindow or static (thruout instance) +#: ../src/vikwindow.c:4441 +msgid "Save to Image File" +msgstr "保存为图像文件" + +#: ../src/vikwindow.c:4457 +msgid "Width (pixels):" +msgstr "宽度(像素):" + +#: ../src/vikwindow.c:4459 +msgid "Height (pixels):" +msgstr "高度(像素):" + +#: ../src/vikwindow.c:4462 +msgid "" +"WARNING: USING LARGE IMAGES OVER 10000x10000\n" +"MAY CRASH THE PROGRAM!" +msgstr "" +"警告:若图像大小超过10000乘10000\n" +"会使程序崩溃!" + +#: ../src/vikwindow.c:4464 +msgid "Zoom (meters per pixel):" +msgstr "缩放(米每像素):" + +#: ../src/vikwindow.c:4480 +msgid "Area in current viewable window" +msgstr "当前可见窗口面积" + +#: ../src/vikwindow.c:4490 +msgid "Save as PNG" +msgstr "保存为PNG文件" + +#: ../src/vikwindow.c:4491 +msgid "Save as JPEG" +msgstr "保存为JPEG文件" + +#: ../src/vikwindow.c:4520 +msgid "East-west image tiles:" +msgstr "东西向图像瓦片:" + +#: ../src/vikwindow.c:4522 +msgid "North-south image tiles:" +msgstr "南北向图像瓦片:" + +#: ../src/vikwindow.c:4619 +msgid "This feature is not available in UTM mode" +msgstr "该特性在UTM(通用横墨卡托投影)模式下不可用" + +#: ../src/vikwindow.c:4658 +#, c-format +msgid "Unable to import %s." +msgstr "无法导入%s。" + +#: ../src/vikwindow.c:4749 +msgid "Choose a background color" +msgstr "选择背景色" + +#: ../src/vikwindow.c:4765 +msgid "Choose a track highlight color" +msgstr "选择轨迹高亮颜色" + +#: ../src/vikwindow.c:4814 +msgid "_File" +msgstr "文件(_F)" + +#: ../src/vikwindow.c:4815 +msgid "_Edit" +msgstr "编辑(_E)" + +#: ../src/vikwindow.c:4817 +msgid "_Show" +msgstr "显示(_S)" + +#: ../src/vikwindow.c:4820 +msgid "_Layers" +msgstr "图层(_L)" + +#: ../src/vikwindow.c:4821 +msgid "_Tools" +msgstr "工具(_T)" + +#: ../src/vikwindow.c:4822 +msgid "_Webtools" +msgstr "网络工具(_W)" + +#: ../src/vikwindow.c:4823 ../src/vikwindow.c:4893 +msgid "_Help" +msgstr "帮助(_H)" + +#: ../src/vikwindow.c:4825 +msgid "New file" +msgstr "新建文件" + +#: ../src/vikwindow.c:4826 +msgid "_Open..." +msgstr "打开(_O)…" + +#: ../src/vikwindow.c:4826 +msgid "Open a file" +msgstr "打开一个文件" + +#: ../src/vikwindow.c:4827 +msgid "Open _Recent File" +msgstr "打开新近文件(_R)" + +#: ../src/vikwindow.c:4828 +msgid "Append _File..." +msgstr "添加文件(_F)…" + +#: ../src/vikwindow.c:4828 +msgid "Append data from a different file" +msgstr "从不同的文件中添加数据" + +#: ../src/vikwindow.c:4829 +msgid "Open GPX as External _Layer..." +msgstr "" + +#: ../src/vikwindow.c:4829 +msgid "Open a GPX file as an external layer" +msgstr "" + +#: ../src/vikwindow.c:4830 +msgid "_Export All" +msgstr "导出全部(_E)" + +#: ../src/vikwindow.c:4830 +msgid "Export All TrackWaypoint Layers" +msgstr "导出全部轨迹路标层" + +#: ../src/vikwindow.c:4831 +msgid "_GPX..." +msgstr "_GPX…" + +#: ../src/vikwindow.c:4831 +msgid "Export as GPX" +msgstr "导出为GPX文件" + +#: ../src/vikwindow.c:4832 +msgid "A_cquire" +msgstr "获取(_c)" + +#: ../src/vikwindow.c:4833 +msgid "_Directions..." +msgstr "方向(_D)…" + +#: ../src/vikwindow.c:4833 +msgid "Get driving directions" +msgstr "获取驾驶方向" + +#: ../src/vikwindow.c:4835 +msgid "_OSM Traces..." +msgstr "_OSM踪迹…" + +#: ../src/vikwindow.c:4835 +msgid "Get traces from OpenStreetMap" +msgstr "从OpenStreetMap(开源街图)获取踪迹" + +#: ../src/vikwindow.c:4836 +msgid "_My OSM Traces..." +msgstr "我的OSM踪迹(_M)…" + +#: ../src/vikwindow.c:4836 +msgid "Get Your Own Traces from OpenStreetMap" +msgstr "从OpenStreetMap(开源街图)获取自己的踪迹" + +#: ../src/vikwindow.c:4839 +msgid "Geo_caches..." +msgstr "地理藏宝(_c)…" + +#: ../src/vikwindow.c:4839 +msgid "Get Geocaches from geocaching.com" +msgstr "从geocaching.com获取地理藏宝" + +#: ../src/vikwindow.c:4842 +msgid "Create waypoints from geotagged images" +msgstr "从有地理标签的图像创建路标" + +#: ../src/vikwindow.c:4844 +msgid "Get a file from a URL" +msgstr "从网址获取文件" + +#: ../src/vikwindow.c:4846 +msgid "Create waypoints from Wikipedia items in the current view" +msgstr "从当前视图中的维基百科条目创建路标" + +#: ../src/vikwindow.c:4848 +msgid "_Save" +msgstr "保存(_S)" + +#: ../src/vikwindow.c:4848 +msgid "Save the file" +msgstr "保存文件" + +#: ../src/vikwindow.c:4849 +msgid "Save _As..." +msgstr "另存为(_A)…" + +#: ../src/vikwindow.c:4849 +msgid "Save the file under different name" +msgstr "保存为其它名字的文件" + +#: ../src/vikwindow.c:4850 +msgid "Properties..." +msgstr "属性…" + +#: ../src/vikwindow.c:4850 +msgid "File Properties" +msgstr "文件属性" + +#: ../src/vikwindow.c:4852 +msgid "Import KMZ _Map File..." +msgstr "导入KMZ地图文件(_M)…" + +#: ../src/vikwindow.c:4852 +msgid "Import a KMZ file" +msgstr "导入KMZ文件" + +#: ../src/vikwindow.c:4853 +msgid "Generate _KMZ Map File..." +msgstr "生成KMZ地图文件(_K)…" + +#: ../src/vikwindow.c:4853 +msgid "Generate a KMZ file with an overlay of the current view" +msgstr "生成带当前视图覆盖的KMZ文件" + +#: ../src/vikwindow.c:4855 +msgid "_Generate Image File..." +msgstr "生成图像文件(_G)…" + +#: ../src/vikwindow.c:4855 +msgid "Save a snapshot of the workspace into a file" +msgstr "保存工作区快照到文件" + +#: ../src/vikwindow.c:4856 +msgid "Generate _Directory of Images..." +msgstr "创建图像目录(_D)…" + +#: ../src/vikwindow.c:4856 +msgid "Generate _Directory of Images" +msgstr "生成图像目录(_D)" + +#: ../src/vikwindow.c:4857 +msgid "_Print..." +msgstr "打印(_P)…" + +#: ../src/vikwindow.c:4857 +msgid "Print maps" +msgstr "打印地图" + +#: ../src/vikwindow.c:4858 +msgid "E_xit" +msgstr "退出(_x)" + +#: ../src/vikwindow.c:4858 +msgid "Exit the program" +msgstr "退出程序" + +#: ../src/vikwindow.c:4859 +msgid "Save and Exit" +msgstr "保存并退出" + +#: ../src/vikwindow.c:4859 +msgid "Save and Exit the program" +msgstr "保存并退出程序" + +#: ../src/vikwindow.c:4861 +msgid "Go to the Pre_vious Location" +msgstr "去上个位置(_v)" + +#: ../src/vikwindow.c:4861 +msgid "Go to the previous location" +msgstr "去上个位置" + +#: ../src/vikwindow.c:4862 +msgid "Go to the _Next Location" +msgstr "去下个位置(_N)" + +#: ../src/vikwindow.c:4862 +msgid "Go to the next location" +msgstr "去下个位置" + +#: ../src/vikwindow.c:4863 +msgid "Go to the _Default Location" +msgstr "去默认位置(_D)" + +#: ../src/vikwindow.c:4863 +msgid "Go to the default location" +msgstr "去默认位置" + +#: ../src/vikwindow.c:4864 +#, fuzzy +msgid "Go to the _Auto Location" +msgstr "去下个位置(_N)" + +#: ../src/vikwindow.c:4864 +msgid "Go to a location via automatic lookup" +msgstr "" + +#: ../src/vikwindow.c:4865 +msgid "Go to _Location..." +msgstr "去位置(_L)…" + +#: ../src/vikwindow.c:4865 +msgid "Go to address/place using text search" +msgstr "去地址/地点用文本搜索" + +#: ../src/vikwindow.c:4866 +msgid "_Go to Lat/Lon..." +msgstr "去纬度/经度(_G)…" + +#: ../src/vikwindow.c:4866 +msgid "Go to arbitrary lat/lon coordinate" +msgstr "去任意经纬度座标" + +#: ../src/vikwindow.c:4867 +msgid "Go to UTM..." +msgstr "去UTM(通用横墨卡托投影)…" + +#: ../src/vikwindow.c:4867 +msgid "Go to arbitrary UTM coordinate" +msgstr "去任意的UTM(通用横墨卡托投影)座标" + +#: ../src/vikwindow.c:4868 +#, fuzzy +msgid "Go to Today" +msgstr "去UTM" + +#: ../src/vikwindow.c:4868 +msgid "Go to today on the calendar" +msgstr "" + +#: ../src/vikwindow.c:4869 +msgid "_Refresh" +msgstr "刷新(_R)" + +#: ../src/vikwindow.c:4869 +msgid "Refresh any maps displayed" +msgstr "刷新已显示的任何地图" + +#: ../src/vikwindow.c:4870 +msgid "Set _Highlight Color..." +msgstr "设置高亮颜色(_H)…" + +#: ../src/vikwindow.c:4870 +msgid "Set Highlight Color" +msgstr "设置高亮颜色" + +#: ../src/vikwindow.c:4871 +msgid "Set Bac_kground Color..." +msgstr "设置背景色(_k)…" + +#: ../src/vikwindow.c:4871 +msgid "Set Background Color" +msgstr "设置背景色" + +#: ../src/vikwindow.c:4872 +msgid "Zoom _In" +msgstr "放大(_I)" + +#: ../src/vikwindow.c:4872 +msgid "Zoom In" +msgstr "放大" + +#: ../src/vikwindow.c:4873 +msgid "Zoom _Out" +msgstr "缩小(_O)" + +#: ../src/vikwindow.c:4873 +msgid "Zoom Out" +msgstr "缩小" + +#: ../src/vikwindow.c:4874 +msgid "Zoom _To..." +msgstr "缩放到(_T)…" + +#: ../src/vikwindow.c:4874 +msgid "Zoom To" +msgstr "缩放到" + +#: ../src/vikwindow.c:4875 +msgid "Pan _North" +msgstr "平移往北" + +#: ../src/vikwindow.c:4876 +msgid "Pan _East" +msgstr "平移往东" + +#: ../src/vikwindow.c:4877 +msgid "Pan _South" +msgstr "平移往南" + +#: ../src/vikwindow.c:4878 +msgid "Pan _West" +msgstr "平移往西" + +#: ../src/vikwindow.c:4879 +msgid "Background _Jobs" +msgstr "后台任务(_J)" + +#: ../src/vikwindow.c:4879 +msgid "Background Jobs" +msgstr "后台任务" + +#: ../src/vikwindow.c:4881 +msgid "Cu_t" +msgstr "剪切(_t)" + +#: ../src/vikwindow.c:4885 +msgid "Delete All" +msgstr "删除全部" + +#: ../src/vikwindow.c:4886 +msgid "Copy Centre _Location" +msgstr "复制居中位置" + +#: ../src/vikwindow.c:4887 +msgid "_Flush Map Cache" +msgstr "清理地图缓存(_F)" + +#: ../src/vikwindow.c:4888 +msgid "_Set the Default Location" +msgstr "设为默认位置(_S)" + +#: ../src/vikwindow.c:4888 +msgid "Set the Default Location to the current position" +msgstr "设默认位置为当前位置" + +#: ../src/vikwindow.c:4889 +msgid "_Preferences" +msgstr "首选项(_P)" + +#: ../src/vikwindow.c:4889 +msgid "Program Preferences" +msgstr "程序首选项" + +#: ../src/vikwindow.c:4890 +msgid "_Layer Defaults" +msgstr "图层默认设置(_L)" + +#: ../src/vikwindow.c:4891 +msgid "_Properties" +msgstr "属性(_P)" + +#: ../src/vikwindow.c:4893 +msgid "Help" +msgstr "帮助" + +#: ../src/vikwindow.c:4894 +msgid "_About" +msgstr "关于(_A)" + +#: ../src/vikwindow.c:4894 +msgid "About" +msgstr "关于" + +#: ../src/vikwindow.c:4903 +msgid "_KML..." +msgstr "_KML文件…" + +#: ../src/vikwindow.c:4903 +msgid "Export as KML" +msgstr "导出为KML文件" + +#: ../src/vikwindow.c:4904 +msgid "Transfer data from a GPS device" +msgstr "从GPS设备获取数据" + +#: ../src/vikwindow.c:4905 +msgid "Import file via GPSBabel converter" +msgstr "从GPSBabel转换器导入文件" + +#: ../src/vikwindow.c:4909 +msgid "Import Geo_JSON File..." +msgstr "导入Geo_JSON文件…" + +#: ../src/vikwindow.c:4909 +msgid "Import GeoJSON file" +msgstr "导入GeoJSON文件" + +#: ../src/vikwindow.c:4914 +msgid "_UTM Mode" +msgstr "_UTM(通用横墨卡托投影)模式" + +#: ../src/vikwindow.c:4915 +msgid "_Expedia Mode" +msgstr "_Expedia(亿客行)模式" + +#: ../src/vikwindow.c:4916 +msgid "_Mercator Mode" +msgstr "_Mercator(墨卡托投影)模式" + +#: ../src/vikwindow.c:4917 +msgid "Lat_/Lon Mode" +msgstr "纬度/经度模式(_/)" + +#: ../src/vikwindow.c:4921 +msgid "Show _Scale" +msgstr "显示比例尺(_S)" + +#: ../src/vikwindow.c:4921 +msgid "Show Scale" +msgstr "显示比例尺" + +#: ../src/vikwindow.c:4922 +msgid "Show _Center Mark" +msgstr "显示中心记号(_C)" + +#: ../src/vikwindow.c:4922 +msgid "Show Center Mark" +msgstr "显示中心记号" + +#: ../src/vikwindow.c:4923 +msgid "Show _Highlight" +msgstr "显示高亮(_H)" + +#: ../src/vikwindow.c:4923 +msgid "Show Highlight" +msgstr "显示高亮" + +#: ../src/vikwindow.c:4924 +msgid "_Full Screen" +msgstr "全屏(_F)" + +#: ../src/vikwindow.c:4924 +msgid "Activate full screen mode" +msgstr "启用全屏模式" + +#: ../src/vikwindow.c:4925 +msgid "Show Side _Panel" +msgstr "显示侧边板(_P)" + +#: ../src/vikwindow.c:4925 +msgid "Show Side Panel" +msgstr "显示侧边板" + +#: ../src/vikwindow.c:4926 +msgid "Show Status_bar" +msgstr "显示状态栏(_b)" + +#: ../src/vikwindow.c:4926 +msgid "Show Statusbar" +msgstr "显示状态栏" + +#: ../src/vikwindow.c:4927 +msgid "Show _Toolbar" +msgstr "显示工具栏(_T)" + +#: ../src/vikwindow.c:4927 +msgid "Show Toolbar" +msgstr "显示工具栏" + +#: ../src/vikwindow.c:4928 +msgid "Show _Menu" +msgstr "显示菜单(_M)" + +#: ../src/vikwindow.c:4928 +msgid "Show Menu" +msgstr "显示菜单" + +#: ../src/vikwindow.c:4929 +#, fuzzy +msgid "Show Side Panel B_uttons" +msgstr "显示侧边板" + +#: ../src/vikwindow.c:4929 +#, fuzzy +msgid "Show Side Panel Buttons" +msgstr "显示侧边板" + +#: ../src/vikwindow.c:4930 +#, fuzzy +msgid "Show Side Panel Ca_lendar" +msgstr "显示侧边板" + +#: ../src/vikwindow.c:4930 +#, fuzzy +msgid "Show Side Panel Calendar" +msgstr "显示侧边板" + +#: ../src/vikwindow.c:5064 +#, c-format +msgid "New _%s Layer" +msgstr "新建%s图层" + +#: ../src/vikwindow.c:5114 +#, fuzzy +msgid "..." +msgstr "添加…" + +#: ../src/viking.desktop.in.h:2 +msgid "GPS Data Manager" +msgstr "GPS数据管理" + +#: ../src/viking.desktop.in.h:3 +msgid "Map Based GPS Data Manager (live data capable)." +msgstr "基于地图的GPS数据管理器(实时数据能力)。" + +#: ../src/libjpeg/jpeg-data.c:205 +msgid "Data does not follow JPEG specification." +msgstr "数据未遵守JPEG规范。" + +#: ../src/libjpeg/jpeg-data.c:302 +#, c-format +msgid "Path '%s' invalid." +msgstr "路径‘%s’无效" + +#: ../src/libjpeg/jpeg-data.c:320 +#, c-format +msgid "Could not read '%s'." +msgstr "无法读取‘%s’。" + +#~ msgid "en" +#~ msgstr "英语" + +#~ msgid "Polygonzied Layer" +#~ msgstr "多边形层" + +#~ msgid "Email:" +#~ msgstr "电子邮箱:" + +#~ msgid "I don't know that place. Do you want another goto?" +#~ msgstr "未知地点。确定要去另一地点?" + +#~ msgid "Service request failure. Do you want another goto?" +#~ msgstr "服务请求失败。确定要去另一地点?" + +#~ msgid "Error: couldn't find gpsbabel." +#~ msgstr "错误: 未发现gpsbabel程序。" + +#~ msgid "Create _Track" +#~ msgstr "创建轨迹(_T)" + +#~ msgid "Create Track" +#~ msgstr "创建轨迹" + +#~ msgid "Create _Route" +#~ msgstr "创建路线(_R)" + +#~ msgid "Create Route" +#~ msgstr "创建路线" + +#~ msgid "%.2f knots\n" +#~ msgstr "%.2f节\n" diff --git a/po/zh_TW.po b/po/zh_TW.po new file mode 100644 index 0000000..15d8429 --- /dev/null +++ b/po/zh_TW.po @@ -0,0 +1,6085 @@ +msgid "" +msgstr "" +"Project-Id-Version: Viking\n" +"Report-Msgid-Bugs-To: \n" +"POT-Creation-Date: 2019-01-19 12:53+0000\n" +"PO-Revision-Date: 2017-04-26 04:07+0000\n" +"Last-Translator: Po-Hsu Lin \n" +"Language-Team: \n" +"Language: \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" +"X-Launchpad-Export-Date: 2018-12-21 17:32+0000\n" +"X-Generator: Launchpad (build 18847)\n" +"X-Poedit-Language: Traditional Chinese\n" + +#: ../src/acquire.c:106 ../src/vikgpslayer.c:1367 +msgid "Done." +msgstr "完成。" + +#: ../src/acquire.c:115 +msgid "No data." +msgstr "無資料。" + +#: ../src/acquire.c:167 ../src/acquire.c:415 +msgid "Error: acquisition failed." +msgstr "" + +#: ../src/acquire.c:339 +msgid "Working..." +msgstr "工作中..." + +#. This shouldn't happen... +#: ../src/acquire.c:406 +msgid "" +"Unable to create command\n" +"Acquire method failed." +msgstr "" + +#: ../src/acquire.c:513 +msgid "_Filter" +msgstr "篩選(_F)" + +#: ../src/acquire.c:528 +#, c-format +msgid "Filter with %s" +msgstr "" + +#: ../src/acquire.c:545 +msgid "Filter" +msgstr "篩選" + +#: ../src/babel.c:640 +msgid "GPSBabel:" +msgstr "GPSBabel:" + +#: ../src/babel.c:641 +msgid "" +"Allow setting the specific instance of GPSBabel. You must restart Viking for " +"this value to take effect." +msgstr "" + +#: ../src/babel_ui.c:79 +msgid "Select a file format" +msgstr "選擇一個檔案格式" + +#: ../src/babel_ui.c:144 ../src/viktrwlayer.c:531 ../src/viktrwlayer.c:2882 +msgid "Tracks" +msgstr "軌跡" + +#: ../src/babel_ui.c:149 ../src/viktrwlayer.c:2892 +msgid "Routes" +msgstr "路線" + +#. ***** PARAMETERS ***** +#: ../src/babel_ui.c:154 ../src/viktrwlayer.c:531 ../src/viktrwlayer.c:2887 +msgid "Waypoints" +msgstr "" + +#: ../src/background.c:64 +#, c-format +msgid "%d items" +msgstr "%d 項目" + +#: ../src/background.c:287 +msgid "Threads:" +msgstr "執行緒:" + +#: ../src/background.c:288 +msgid "" +"Number of threads to use for Mapnik tasks. You need to restart Viking for a " +"change to this value to be used" +msgstr "" + +#: ../src/background.c:361 +msgid "Job" +msgstr "工作" + +#: ../src/background.c:365 +msgid "Progress" +msgstr "進度" + +#: ../src/background.c:373 +msgid "Viking Background Jobs" +msgstr "Viking 背景工作" + +#: ../src/bing.c:42 +msgid "Bing Aerial" +msgstr "Bing 空照圖" + +#: ../src/bing.c:48 +msgid "Bing" +msgstr "Bing" + +#. VIK_GTK_WINDOW_FROM_WIDGET(vp) +#: ../src/bingmapsource.c:514 +msgid "Bing attribution Loading" +msgstr "" + +#: ../src/clipboard.c:95 +msgid "paste failed" +msgstr "黏貼失敗" + +#: ../src/clipboard.c:105 +msgid "wrong clipboard data size" +msgstr "剪貼版資料大小錯誤" + +#: ../src/clipboard.c:124 +#, c-format +msgid "" +"The clipboard contains sublayer data for %s layers. You must select a layer " +"of this type to paste the clipboard data." +msgstr "" + +#: ../src/clipboard.c:264 +msgid "" +"In order to paste a waypoint, please select an appropriate layer to paste " +"into." +msgstr "" + +#: ../src/dialog.c:60 +msgid "Go to Lat/Lon" +msgstr "前往經度/緯度" + +#: ../src/dialog.c:69 ../src/viktrwlayer_wpwin.c:173 +msgid "Latitude:" +msgstr "緯度:" + +#: ../src/dialog.c:72 ../src/viktrwlayer_wpwin.c:177 +msgid "Longitude:" +msgstr "經度:" + +#: ../src/dialog.c:102 +msgid "Go to UTM" +msgstr "前往 UTM" + +#: ../src/dialog.c:114 +msgid "Northing:" +msgstr "" + +#: ../src/dialog.c:117 +msgid "Easting:" +msgstr "" + +#: ../src/dialog.c:121 ../src/vikgeoreflayer.c:902 +msgid "Zone:" +msgstr "區域:" + +#: ../src/dialog.c:124 ../src/vikgeoreflayer.c:904 +msgid "Letter:" +msgstr "字母:" + +#: ../src/dialog.c:246 ../src/geonamessearch.c:238 +#: ../src/datasource_osm_my_traces.c:505 +msgid "Nothing was selected" +msgstr "" + +#: ../src/dialog.c:254 +msgid "Add Route" +msgstr "新增路線" + +#: ../src/dialog.c:254 +msgid "Add Track" +msgstr "新增軌跡:" + +#: ../src/dialog.c:262 +msgid "Route Name:" +msgstr "路線名稱:" + +#: ../src/dialog.c:262 +msgid "Track Name:" +msgstr "軌跡名稱:" + +#: ../src/dialog.c:282 +msgid "Please enter a name for the track." +msgstr "請為該軌跡輸入一個名字。" + +#: ../src/dialog.c:311 +msgid "Today" +msgstr "今天" + +#: ../src/dialog.c:393 +msgid "Zoom Factors..." +msgstr "縮放係數..." + +#: ../src/dialog.c:407 +msgid "Zoom factor (in meters per pixel):" +msgstr "" + +#: ../src/dialog.c:408 +msgid "X (easting): " +msgstr "X (東距): " + +#: ../src/dialog.c:409 +msgid "Y (northing): " +msgstr "Y (北距): " + +#: ../src/dialog.c:414 +msgid "X and Y zoom factors must be equal" +msgstr "X和Y縮放係數必須相等" + +#: ../src/dialog.c:469 +msgid "1 min" +msgstr "1 分鐘" + +#: ../src/dialog.c:470 +msgid "1 hour" +msgstr "1 小時" + +#: ../src/dialog.c:471 +msgid "1 day" +msgstr "1 天" + +#: ../src/dialog.c:472 +msgid "Custom (in minutes):" +msgstr "" + +#: ../src/dialog.c:608 +#, c-format +msgid "" +"2003-2008, Evan Battaglia\n" +"2008-%s, Viking's contributors" +msgstr "" + +#: ../src/dialog.c:609 +msgid "GPS Data and Topo Analyzer, Explorer, and Manager." +msgstr "GPS 資料和拓撲解析、瀏覧、管理工具." + +#: ../src/dialog.c:610 +msgid "" +"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.\n" +"\n" +"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.\n" +"\n" +"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., 59 Temple " +"Place, Suite 330, Boston, MA 02111-1307, USA" +msgstr "" + +#: ../src/dialog.c:703 +msgid "Translation is coordinated on http://launchpad.net/viking" +msgstr "" + +#: ../src/dialog.c:713 +msgid "Download along track" +msgstr "沿着軌迹下載" + +#: ../src/dialog.c:720 +msgid "Map type:" +msgstr "地圖類別:" + +#: ../src/dialog.c:726 +msgid "Zoom level:" +msgstr "縮放程度:" + +#: ../src/dialog.c:766 +#, c-format +msgid "The map data is licensed: %s." +msgstr "" + +#: ../src/dialog.c:769 +#, c-format +msgid "" +"The data provided by '%s' are licensed under the following license: " +"%s." +msgstr "" + +#: ../src/dialog.c:773 +msgid "Open license" +msgstr "" + +#: ../src/expedia.c:54 +msgid "Expedia Street Maps" +msgstr "Expedia 街道地圖" + +#: ../src/expedia.c:82 +msgid "Invalid expedia altitude" +msgstr "無效的Expedia高度" + +#: ../src/expedia.c:113 +#, c-format +msgid "" +"Couldn't open EXPEDIA image file (right after successful download! Please " +"report and delete image file!): %s" +msgstr "" + +#: ../src/expedia.c:126 +#, c-format +msgid "" +"Couldn't save EXPEDIA image file (right after successful download! Please " +"report and delete image file!): %s" +msgstr "" + +#: ../src/geonamessearch.c:115 +msgid "Search" +msgstr "搜索" + +#: ../src/geonamessearch.c:117 +msgid "No entries found!" +msgstr "" + +#. NB could allow columns to be shifted around by doing this after each new +#. gtk_tree_view_column_set_reorderable ( column, TRUE ); +#. However I don't think is that useful, so I haven't put it in +#: ../src/geonamessearch.c:171 ../src/datasource_osm_my_traces.c:422 +#: ../src/viktrwlayer_tracklist.c:621 ../src/viktrwlayer_waypointlist.c:618 +msgid "Name" +msgstr "" + +#: ../src/geonamessearch.c:176 +msgid "Feature" +msgstr "" + +#: ../src/geonamessearch.c:181 ../src/datasource_osm_my_traces.c:437 +msgid "Lat/Lon" +msgstr "緯/經" + +#: ../src/geonamessearch.c:264 ../src/googlesearch.c:101 ../src/vikgoto.c:430 +msgid "couldn't map temp file" +msgstr "" + +#: ../src/geonamessearch.c:459 +#, fuzzy +msgid "Select articles" +msgstr "選擇一個檔案格式" + +#: ../src/geonamessearch.c:459 +msgid "Select the articles you want to add." +msgstr "" + +#: ../src/geonamessearch.c:475 +msgid "city" +msgstr "" + +#: ../src/geonamessearch.c:477 +msgid "edu" +msgstr "" + +#: ../src/geonamessearch.c:479 +msgid "airport" +msgstr "" + +#: ../src/geonamessearch.c:481 +msgid "mountain" +msgstr "" + +#: ../src/geonamessearch.c:483 +msgid "forest" +msgstr "" + +#: ../src/geonamessearch.c:485 +msgid "church" +msgstr "" + +#: ../src/geojson.c:74 +#, c-format +msgid "%s command failed: %s" +msgstr "" + +#: ../src/geojson.c:146 ../src/gpx.c:1317 +#, c-format +msgid "failed to open temporary file: %s" +msgstr "" + +#: ../src/globals.c:67 +msgid "DDD" +msgstr "" + +#: ../src/globals.c:67 +msgid "DMM" +msgstr "" + +#: ../src/globals.c:67 +msgid "DMS" +msgstr "" + +#: ../src/globals.c:67 +msgid "Raw" +msgstr "" + +#: ../src/globals.c:68 +msgid "Kilometres" +msgstr "" + +#: ../src/globals.c:68 +msgid "Miles" +msgstr "" + +#: ../src/globals.c:68 +msgid "Nautical Miles" +msgstr "" + +#. VIK_UNITS_SPEED_KILOMETRES_PER_HOUR: +#: ../src/globals.c:69 ../src/viktrwlayer_tracklist.c:655 ../src/vikutils.c:100 +msgid "km/h" +msgstr "" + +#: ../src/globals.c:69 ../src/viktrwlayer_tracklist.c:656 ../src/vikutils.c:78 +msgid "mph" +msgstr "" + +#. VIK_UNITS_SPEED_METRES_PER_SECOND: +#: ../src/globals.c:69 ../src/viktrwlayer_tracklist.c:663 ../src/vikutils.c:81 +msgid "m/s" +msgstr "" + +#: ../src/globals.c:69 ../src/viktrwlayer_tracklist.c:657 ../src/vikutils.c:84 +msgid "knots" +msgstr "" + +#: ../src/globals.c:69 ../src/viktrwlayer_tracklist.c:658 ../src/vikutils.c:87 +msgid "s/km" +msgstr "" + +#: ../src/globals.c:69 ../src/viktrwlayer_tracklist.c:659 ../src/vikutils.c:90 +msgid "min/km" +msgstr "" + +#: ../src/globals.c:69 +msgid "s/mi" +msgstr "" + +#: ../src/globals.c:69 ../src/viktrwlayer_tracklist.c:661 ../src/vikutils.c:96 +msgid "min/mi" +msgstr "" + +#: ../src/globals.c:70 +msgid "Metres" +msgstr "" + +#: ../src/globals.c:70 +msgid "Feet" +msgstr "" + +#: ../src/globals.c:73 +msgid "Locale" +msgstr "" + +#: ../src/globals.c:73 +msgid "World" +msgstr "" + +#: ../src/globals.c:73 +msgid "UTC" +msgstr "" + +#: ../src/globals.c:76 +msgid "Degree format:" +msgstr "" + +#: ../src/globals.c:77 +msgid "Distance units:" +msgstr "距離單位:" + +#: ../src/globals.c:78 +msgid "Speed units:" +msgstr "速度單位:" + +#: ../src/globals.c:79 +msgid "Height units:" +msgstr "高度單位:" + +#: ../src/globals.c:80 +msgid "Use large waypoint icons:" +msgstr "" + +#: ../src/globals.c:81 +msgid "Default latitude:" +msgstr "預設緯度:" + +#: ../src/globals.c:82 +msgid "Default longitude:" +msgstr "預設經度:" + +#: ../src/globals.c:83 +msgid "Time Display:" +msgstr "" + +#: ../src/globals.c:84 +msgid "" +"Display times according to the reference frame. Locale is the user's system " +"setting. World is relative to the location of the object." +msgstr "" + +#: ../src/globals.c:90 +msgid "Alphabetical" +msgstr "" + +#: ../src/globals.c:90 ../src/datasource_osm_my_traces.c:432 +msgid "Time" +msgstr "" + +#: ../src/globals.c:90 +msgid "Creation" +msgstr "" + +#: ../src/globals.c:91 +msgid "Title Case" +msgstr "" + +#: ../src/globals.c:91 +msgid "Lowercase" +msgstr "" + +#: ../src/globals.c:94 +msgid "KML File Export Units:" +msgstr "" + +#: ../src/globals.c:95 +msgid "GPX Track Order:" +msgstr "" + +#: ../src/globals.c:96 +msgid "GPX Waypoint Symbols:" +msgstr "" + +#: ../src/globals.c:97 +msgid "" +"Save GPX Waypoint Symbol names in the specified case. May be useful for " +"compatibility with various devices" +msgstr "" + +#: ../src/globals.c:98 +msgid "GPX Creator:" +msgstr "" + +#: ../src/globals.c:99 +msgid "" +"The creator value when writing a GPX file. Otherwise when blank a default is " +"used." +msgstr "" + +#: ../src/globals.c:104 +msgid "Image Viewer:" +msgstr "影像檢視器:" + +#: ../src/globals.c:109 +msgid "External GPX Program 1:" +msgstr "" + +#: ../src/globals.c:110 +msgid "External GPX Program 2:" +msgstr "" + +#: ../src/globals.c:113 +msgid "Absolute" +msgstr "" + +#: ../src/globals.c:113 +msgid "Relative" +msgstr "" + +#: ../src/globals.c:117 +msgid "Save File Reference Mode:" +msgstr "" + +#: ../src/globals.c:118 +msgid "" +"When saving a Viking .vik file, this determines how the directory paths of " +"filenames are written." +msgstr "" + +#: ../src/globals.c:119 +msgid "Ask for Name before Track Creation:" +msgstr "" + +#: ../src/globals.c:120 +msgid "Show Tooltip during Track Creation:" +msgstr "" + +#: ../src/globals.c:121 +msgid "The number of recent files:" +msgstr "" + +#: ../src/globals.c:122 +msgid "" +"Only applies to new windows or on application restart. -1 means all " +"available files." +msgstr "" + +#: ../src/globals.c:123 +msgid "Open files in selected layer:" +msgstr "" + +#: ../src/globals.c:124 +msgid "Open files (but not .vik ones) into the selected TrackWaypoint layer." +msgstr "" + +#: ../src/globals.c:125 +msgid "Show calendar day names:" +msgstr "" + +#: ../src/globals.c:128 +msgid "Home Location" +msgstr "" + +#: ../src/globals.c:128 +msgid "Last Location" +msgstr "" + +#: ../src/globals.c:128 +msgid "Specified File" +msgstr "" + +#: ../src/globals.c:128 +msgid "Auto Location" +msgstr "" + +#: ../src/globals.c:131 +msgid "Restore Window Setup:" +msgstr "" + +#: ../src/globals.c:132 +msgid "Restore window size and layout" +msgstr "" + +#: ../src/globals.c:133 +msgid "Add a Default Map Layer:" +msgstr "" + +#: ../src/globals.c:134 +msgid "" +"The default map layer added is defined by the Layer Defaults. Use the menu " +"Edit->Layer Defaults->Map... to change the map type and other values." +msgstr "" + +#: ../src/globals.c:135 +msgid "Startup Method:" +msgstr "" + +#: ../src/globals.c:136 +msgid "Startup File:" +msgstr "" + +#: ../src/globals.c:137 +msgid "" +"The default file to load on startup. Only applies when the startup method is " +"set to 'Specified File'" +msgstr "" + +#: ../src/globals.c:138 +msgid "Check For New Version:" +msgstr "" + +#: ../src/globals.c:139 +msgid "Periodically check to see if a new version of Viking is available" +msgstr "" + +#. Defaults for the options are setup here +#: ../src/globals.c:176 +msgid "General" +msgstr "" + +#. New Tab +#: ../src/globals.c:204 +msgid "Startup" +msgstr "" + +#. New Tab +#: ../src/globals.c:222 +msgid "Export/External" +msgstr "" + +#. 'Advanced' Properties +#: ../src/globals.c:249 +msgid "Advanced" +msgstr "" + +#. Webtools +#: ../src/google.c:39 +msgid "Google" +msgstr "" + +#. If there is an actual description field it will overwrite this value +#: ../src/gpx.c:264 +#, c-format +msgid "Created by: %s" +msgstr "" + +#: ../src/datasource_bfilter.c:43 +msgid "Max number of points:" +msgstr "" + +#: ../src/datasource_bfilter.c:84 +msgid "Simplify All Tracks..." +msgstr "" + +#: ../src/datasource_bfilter.c:85 +msgid "Simplified Tracks" +msgstr "" + +#. { VIK_LAYER_NUM_TYPES, "compressmethod", VIK_LAYER_PARAM_UINT, VIK_LAYER_GROUP_NONE, N_("Simplify Method:"), VIK_LAYER_WIDGET_COMBOBOX, compress_method, NULL, NULL, NULL, NULL, NULL }, +#: ../src/datasource_bfilter.c:111 +msgid "Error Factor:" +msgstr "" + +#: ../src/datasource_bfilter.c:112 +msgid "" +"Specifies the maximum allowable error that may be introduced by removing a " +"single point by the crosstrack method. See the manual or GPSBabel Simplify " +"Filter documentation for more detail." +msgstr "" + +#: ../src/datasource_bfilter.c:166 +msgid "Compress Tracks..." +msgstr "" + +#: ../src/datasource_bfilter.c:167 +msgid "Compressed Tracks" +msgstr "" + +#: ../src/datasource_bfilter.c:197 ../src/datasource_bfilter.c:198 +msgid "Remove Duplicate Waypoints" +msgstr "" + +#: ../src/datasource_bfilter.c:221 +msgid "Manual filter:" +msgstr "" + +#: ../src/datasource_bfilter.c:222 +msgid "Manual filter command: e.g. 'swap'." +msgstr "" + +#: ../src/datasource_bfilter.c:233 ../src/datasource_bfilter.c:234 +msgid "Manual filter" +msgstr "" + +#: ../src/datasource_bfilter.c:262 +msgid "Waypoints Inside This" +msgstr "" + +#: ../src/datasource_bfilter.c:263 ../src/datasource_bfilter.c:292 +msgid "Polygonized Layer" +msgstr "" + +#: ../src/datasource_bfilter.c:291 +msgid "Waypoints Outside This" +msgstr "" + +#: ../src/datasource_file.c:61 +msgid "Import file with GPSBabel" +msgstr "" + +#: ../src/datasource_file.c:62 +msgid "Imported file" +msgstr "" + +#. The file selector +#: ../src/datasource_file.c:129 +msgid "File:" +msgstr "" + +#: ../src/datasource_file.c:130 +msgid "File to import" +msgstr "" + +#: ../src/datasource_file.c:137 +msgid "All files" +msgstr "" + +#. The file format selector +#: ../src/datasource_file.c:144 ../src/datasource_url.c:106 +msgid "File type:" +msgstr "" + +#: ../src/datasource_file.c:189 +#, c-format +msgid "using babel args '%s' and file '%s'" +msgstr "" + +#: ../src/datasource_gc.c:67 +msgid "Download Geocaches" +msgstr "下載 Geocaches" + +#: ../src/datasource_gc.c:68 +msgid "Geocaching.com Caches" +msgstr "Geocaching.com 緩衝區" + +#: ../src/datasource_gc.c:86 +msgid "geocaching.com username:" +msgstr "geocaching.com 用户名:" + +#: ../src/datasource_gc.c:87 +msgid "geocaching.com password:" +msgstr "geocaching.com 密碼:" + +#: ../src/datasource_gc.c:92 ../src/vikwindow.c:3502 +msgid "Geocaching" +msgstr "" + +#: ../src/datasource_gc.c:128 +#, c-format +msgid "" +"Can't find %s or %s in path! Check that you have installed it correctly." +msgstr "" + +#: ../src/datasource_gc.c:190 +msgid "Number geocaches:" +msgstr "" + +#: ../src/datasource_gc.c:192 +msgid "Centered around:" +msgstr "" + +#: ../src/datasource_gc.c:231 +msgid "Broken input - using some defaults" +msgstr "" + +#: ../src/datasource_geotag.c:51 +msgid "Create Waypoints from Geotagged Images" +msgstr "" + +#: ../src/datasource_geotag.c:52 +msgid "Geotagged Images" +msgstr "" + +#: ../src/datasource_geotag.c:102 ../src/datasource_geojson.c:93 +#: ../src/vikfileentry.c:171 ../src/vikwindow.c:3533 ../src/vikwindow.c:3610 +#: ../src/vikwindow.c:3641 ../src/vikwindow.c:4356 ../src/vikwindow.c:4649 +msgid "All" +msgstr "" + +#: ../src/datasource_geotag.c:107 ../src/vikfileentry.c:115 +#: ../src/viktrwlayer_geotag.c:637 ../src/vikwindow.c:3518 +#: ../src/vikwindow.c:4377 +msgid "JPG" +msgstr "" + +#: ../src/datasource_geotag.c:168 +#, c-format +msgid "Unable to create waypoint from %s" +msgstr "" + +#: ../src/datasource_geojson.c:46 +msgid "Acquire from GeoJSON" +msgstr "" + +#: ../src/datasource_geojson.c:47 ../src/datasource_geojson.c:98 +msgid "GeoJSON" +msgstr "" + +#: ../src/datasource_geojson.c:152 +#, c-format +msgid "Unable to import from: %s" +msgstr "" + +#: ../src/datasource_gps.c:54 +msgid "Acquire from GPS" +msgstr "從GPS抓取" + +#: ../src/datasource_gps.c:55 +msgid "Acquired from GPS" +msgstr "已從GPS抓取的" + +#: ../src/datasource_gps.c:258 +#, c-format +msgid "using cmd '%s' and file '%s'\n" +msgstr "" + +#: ../src/datasource_gps.c:353 ../src/vikgpslayer.c:966 +#, c-format +msgid "Downloading %d waypoint..." +msgid_plural "Downloading %d waypoints..." +msgstr[0] "" +msgstr[1] "" + +#: ../src/datasource_gps.c:358 ../src/vikgpslayer.c:971 +#, c-format +msgid "Downloading %d trackpoint..." +msgid_plural "Downloading %d trackpoints..." +msgstr[0] "" +msgstr[1] "" + +#: ../src/datasource_gps.c:363 ../src/vikgpslayer.c:976 +#, c-format +msgid "Downloading %d routepoint..." +msgid_plural "Downloading %d routepoints..." +msgstr[0] "" +msgstr[1] "" + +#: ../src/datasource_gps.c:386 ../src/datasource_gps.c:393 +#: ../src/datasource_gps.c:400 +#, c-format +msgid "Downloaded %d out of %d %s..." +msgstr "" + +#: ../src/datasource_gps.c:388 ../src/datasource_gps.c:395 +#: ../src/datasource_gps.c:402 +#, c-format +msgid "Downloaded %d %s." +msgstr "" + +#: ../src/datasource_gps.c:416 ../src/vikgpslayer.c:1134 +#, c-format +msgid "GPS Device: %s" +msgstr "GPS裝置: %s" + +#: ../src/datasource_gps.c:428 ../src/vikgpslayer.c:1214 +msgid "Status: Working..." +msgstr "" + +#. NB gps_layer_inst_init() is performed after parameter registeration +#. thus to give the protocols some potential values use the old static list +#. TODO: find another way to use gps_layer_inst_init()? +#: ../src/datasource_gps.c:584 ../src/vikgpslayer.c:216 +msgid "GPS Protocol:" +msgstr "GPS 協定:" + +#. List reassigned at runtime +#: ../src/datasource_gps.c:609 ../src/vikgpslayer.c:217 +msgid "Serial Port:" +msgstr "序列埠:" + +#: ../src/datasource_gps.c:659 +msgid "" +"Turn Off After Transfer\n" +"(Garmin/NAViLink Only)" +msgstr "" + +#: ../src/datasource_gps.c:666 +msgid "Tracks:" +msgstr "" + +#: ../src/datasource_gps.c:673 +msgid "Routes:" +msgstr "" + +#: ../src/datasource_gps.c:680 +msgid "Waypoints:" +msgstr "" + +#: ../src/datasource_gps.c:756 ../src/vikgpslayer.c:1509 +msgid "GPS device: N/A" +msgstr "GPS裝置: 無" + +#: ../src/datasource_osm.c:53 ../src/datasource_osm.c:54 +msgid "OSM traces" +msgstr "" + +#: ../src/datasource_osm.c:89 +msgid "Page number:" +msgstr "" + +#: ../src/datasource_osm_my_traces.c:59 ../src/datasource_osm_my_traces.c:60 +msgid "OSM My Traces" +msgstr "" + +#: ../src/datasource_osm_my_traces.c:106 ../src/osm-traces.c:684 +msgid "Email/username:" +msgstr "" + +#: ../src/datasource_osm_my_traces.c:111 +msgid "The email or username used to login to OSM" +msgstr "" + +#: ../src/datasource_osm_my_traces.c:113 ../src/osm-traces.c:692 +msgid "Password:" +msgstr "密碼:" + +#: ../src/datasource_osm_my_traces.c:116 +msgid "The password used to login to OSM" +msgstr "" + +#: ../src/datasource_osm_my_traces.c:427 ../src/viktrwlayer.c:689 +msgid "Description" +msgstr "" + +#: ../src/datasource_osm_my_traces.c:442 +msgid "Privacy" +msgstr "" + +#: ../src/datasource_osm_my_traces.c:449 +msgid "Within Current View" +msgstr "" + +#: ../src/datasource_osm_my_traces.c:516 +msgid "GPS Traces" +msgstr "" + +#: ../src/datasource_osm_my_traces.c:518 +msgid "None found!" +msgstr "" + +#: ../src/datasource_osm_my_traces.c:569 +msgid "Ensure the OSM access token preferences are setup." +msgstr "" + +#: ../src/datasource_osm_my_traces.c:645 +msgid "My OSM Traces" +msgstr "" + +#. Report errors to the status bar +#: ../src/datasource_osm_my_traces.c:667 +#, c-format +msgid "Unable to get trace: %s" +msgstr "" + +#: ../src/datasource_routing.c:56 ../src/datasource_routing.c:57 +msgid "Directions" +msgstr "" + +#: ../src/datasource_routing.c:90 +msgid "No routing engines with directions available" +msgstr "" + +#. Engine selector +#: ../src/datasource_routing.c:99 +msgid "Engine:" +msgstr "" + +#. From and To entries +#: ../src/datasource_routing.c:104 +msgid "From:" +msgstr "從 :" + +#: ../src/datasource_routing.c:105 +msgid "To:" +msgstr "至 :" + +#: ../src/datasource_url.c:48 +msgid "Acquire from URL" +msgstr "" + +#: ../src/datasource_url.c:49 +msgid "URL" +msgstr "" + +#: ../src/datasource_url.c:101 +msgid "URL:" +msgstr "" + +#. Only GPX (not using GPSbabel) +#: ../src/datasource_url.c:133 ../src/vikfileentry.c:161 +#: ../src/vikwindow.c:3513 ../src/vikwindow.c:3603 +msgid "GPX" +msgstr "" + +#: ../src/datasource_wikipedia.c:32 +msgid "Create Waypoints from Wikipedia Articles" +msgstr "" + +#: ../src/datasource_wikipedia.c:33 +msgid "Wikipedia Waypoints" +msgstr "" + +#: ../src/dem.c:66 ../src/dem.c:80 +msgid "Invalid DEM" +msgstr "" + +#: ../src/dem.c:122 +msgid "Invalid DEM header" +msgstr "" + +#: ../src/dem.c:191 ../src/dem.c:204 +msgid "Incorrect DEM Class B record: expected 1" +msgstr "" + +#: ../src/dem.c:289 ../src/download.c:176 +#, c-format +msgid "Couldn't map file %s: %s" +msgstr "" + +#: ../src/download.c:130 +msgid "Tile age (days):" +msgstr "" + +#: ../src/download.c:406 +#, c-format +msgid "Download error: %s" +msgstr "下載錯誤: %s" + +#: ../src/download.c:490 +msgid "couldn't open temp file" +msgstr "無法開啟暫存檔" + +#: ../src/file.c:458 ../src/file.c:463 +#, c-format +msgid "Draw mode '%s' no more supported" +msgstr "" + +#: ../src/geotag_exif.c:621 +msgid "Not enough memory." +msgstr "" + +#: ../src/geotag_exif.c:639 +msgid "Setting a value for this tag is unsupported!" +msgstr "" + +#: ../src/geotag_exif.c:658 +#, c-format +msgid "Too few components specified (need %d, found %d)\n" +msgstr "" + +#: ../src/geotag_exif.c:662 +msgid "Numeric value expected\n" +msgstr "" + +#: ../src/geotag_exif.c:670 +msgid "This shouldn't happen!" +msgstr "" + +#: ../src/geotag_exif.c:740 +msgid "Not yet implemented!" +msgstr "" + +#: ../src/geotag_exif.c:753 +msgid "Warning; Too many components specified!" +msgstr "" + +#: ../src/osm-traces.c:87 +msgid "Identifiable (public w/ timestamps)" +msgstr "" + +#: ../src/osm-traces.c:88 +msgid "Trackable (private w/ timestamps)" +msgstr "" + +#: ../src/osm-traces.c:89 +msgid "Public" +msgstr "Public" + +#: ../src/osm-traces.c:90 +msgid "Private" +msgstr "" + +#: ../src/osm-traces.c:108 +msgid "Access Token:" +msgstr "" + +#: ../src/osm-traces.c:108 +msgid "Get New OSM Access Tokens" +msgstr "" + +#: ../src/osm-traces.c:109 +msgid "Access Token Key:" +msgstr "" + +#: ../src/osm-traces.c:110 +msgid "Access Token Secret:" +msgstr "" + +#: ../src/osm-traces.c:111 +msgid "OSM username:" +msgstr "" + +#: ../src/osm-traces.c:112 +msgid "OSM password:" +msgstr "" + +#. Check to really override existing values... +#: ../src/osm-traces.c:263 +msgid "Do you want to overwrite existing values?" +msgstr "" + +#: ../src/osm-traces.c:275 +msgid "Not able to generate OSM request tokens." +msgstr "" + +#: ../src/osm-traces.c:299 +msgid "" +"Waiting for authorization approval.\n" +"Ensure you have granted access at the website before continuing here." +msgstr "" + +#: ../src/osm-traces.c:315 +msgid "No Authorization." +msgstr "" + +#: ../src/osm-traces.c:354 +msgid "" +"OSM Username and Password preferences are not required anymore. You can now " +"remove them." +msgstr "" + +#. Preferences +#: ../src/osm-traces.c:379 +msgid "OpenStreetMap Traces" +msgstr "" + +#: ../src/osm-traces.c:504 +#, c-format +msgid "failed to upload data: HTTP response is %ld" +msgstr "" + +#: ../src/osm-traces.c:509 +#, c-format +msgid "curl_easy_getinfo failed: %d" +msgstr "" + +#: ../src/osm-traces.c:514 +#, c-format +msgid "curl request failed: %s" +msgstr "" + +#. Success +#: ../src/osm-traces.c:592 +msgid "Uploaded to OSM" +msgstr "" + +#: ../src/osm-traces.c:596 +msgid "" +"FAILED TO UPLOAD DATA TO OSM - Ensure the OSM access token preferences are " +"setup." +msgstr "" + +#: ../src/osm-traces.c:599 +msgid "FAILED TO UPLOAD DATA TO OSM - CURL PROBLEM" +msgstr "" + +#: ../src/osm-traces.c:602 +msgid "FAILED TO UPLOAD DATA TO OSM" +msgstr "" + +#: ../src/osm-traces.c:602 +msgid "HTTP response code" +msgstr "" + +#: ../src/osm-traces.c:610 +#, c-format +msgid "failed to unlink temporary file: %s" +msgstr "" + +#: ../src/osm-traces.c:664 +msgid "OSM upload" +msgstr "" + +#: ../src/osm-traces.c:689 +msgid "" +"The email/username used as login\n" +"Enter the email/username you use to login into www.openstreetmap.org." +"" +msgstr "" + +#: ../src/osm-traces.c:697 +msgid "" +"The password used to login\n" +"Enter the password you use to login into www.openstreetmap.org." +msgstr "" + +#: ../src/osm-traces.c:703 +msgid "File's name:" +msgstr "檔名稱:" + +#: ../src/osm-traces.c:713 +msgid "" +"The name of the file on OSM\n" +"This is the name of the file created on the server.This is not the " +"name of the local file." +msgstr "" + +#: ../src/osm-traces.c:717 ../src/viktrwlayer_wpwin.c:197 +#: ../src/viktrwlayer_wpwin.c:199 +msgid "Description:" +msgstr "Description :" + +#: ../src/osm-traces.c:731 +msgid "The description of the trace" +msgstr "" + +#: ../src/osm-traces.c:734 +msgid "Anonymize Times:" +msgstr "" + +#: ../src/osm-traces.c:739 +msgid "" +"Anonymize times of the trace.\n" +"You may choose to make the trace identifiable, yet mask the actual " +"real time values" +msgstr "" + +#: ../src/osm-traces.c:743 +msgid "Tags:" +msgstr "" + +#: ../src/osm-traces.c:751 +msgid "The tags associated to the trace" +msgstr "" + +#: ../src/osm-traces.c:816 +#, c-format +msgid "Uploading %s to OSM" +msgstr "上傳 %s 到 OSM" + +#: ../src/mapcache.c:67 +msgid "Map cache memory size (MB):" +msgstr "" + +#. NB Can have a couple hundred fonts loaded when using system directories +#. So ATM don't list them all - otherwise need better GUI feedback display. +#: ../src/mapnik_interface.cpp:324 +#, c-format +msgid "" +"%s %s\n" +"Plugins=%sFonts loaded=%d" +msgstr "" + +#: ../src/mapnik_interface.cpp:325 ../src/vikmapniklayer.c:278 +msgid "Mapnik" +msgstr "" + +#: ../src/print.c:51 ../src/viktrwlayer.c:572 +msgid "None" +msgstr "無" + +#: ../src/print.c:52 +msgid "Horizontally" +msgstr "水平的" + +#: ../src/print.c:53 +msgid "Vertically" +msgstr "垂直的" + +#: ../src/print.c:54 +msgid "Both" +msgstr "" + +#: ../src/print.c:118 +msgid "Image Settings" +msgstr "影像設定" + +#: ../src/print.c:551 +msgid "done" +msgstr "完成" + +#. Page Size +#: ../src/print.c:580 +msgid "_Adjust Page Size and Orientation" +msgstr "" + +#: ../src/print.c:596 +msgid "C_enter:" +msgstr "C_entrer :" + +#. ignore page margins +#: ../src/print.c:614 +msgid "Ignore Page _Margins" +msgstr "" + +#: ../src/print.c:633 +msgid "Image S_ize:" +msgstr "" + +#: ../src/ui_util.c:88 +#, c-format +msgid "Could not launch web browser. %s" +msgstr "" + +#: ../src/ui_util.c:101 +#, c-format +msgid "Could not create new email. %s" +msgstr "" + +#: ../src/vikcoordlayer.c:57 +msgid "Color:" +msgstr "" + +#: ../src/vikcoordlayer.c:58 +msgid "Minutes Width:" +msgstr "" + +#: ../src/vikcoordlayer.c:59 +msgid "Line Thickness:" +msgstr "" + +#: ../src/vikcoordlayer.c:66 +msgid "Coordinate" +msgstr "" + +#: ../src/main.c:92 +#, c-format +msgid "Ignoring Xlib error: error code %d request code %d\n" +msgstr "" + +#: ../src/main.c:111 +msgid "Enable debug output" +msgstr "" + +#: ../src/main.c:112 +msgid "Enable verbose output" +msgstr "" + +#: ../src/main.c:113 +msgid "Show version" +msgstr "察看版本" + +#: ../src/main.c:114 +msgid "Latitude in decimal degrees" +msgstr "" + +#: ../src/main.c:115 +msgid "Longitude in decimal degrees" +msgstr "" + +#: ../src/main.c:116 +msgid "Zoom Level (OSM). Value can be 0 - 22" +msgstr "" + +#: ../src/main.c:117 +msgid "Add a map layer by id value. Use 0 for the default map." +msgstr "" + +#: ../src/main.c:160 +#, c-format +msgid "" +"%s %s\n" +"Copyright (c) 2003-2008 Evan Battaglia\n" +"Copyright (c) 2008-%s Viking's contributors\n" +msgstr "" + +#: ../src/osm.c:50 +msgid "OpenStreetMap (Mapnik)" +msgstr "" + +#: ../src/osm.c:65 +msgid "OpenStreetMap (Cycle)" +msgstr "" + +#: ../src/osm.c:79 +msgid "OpenStreetMap (Transport)" +msgstr "" + +#: ../src/osm.c:95 +msgid "OpenStreetMap (Humanitarian)" +msgstr "" + +#: ../src/osm.c:111 +msgid "On Disk OSM Tile Format" +msgstr "" + +#: ../src/osm.c:121 +msgid "MBTiles File" +msgstr "" + +#: ../src/osm.c:132 +msgid "OSM Metatiles" +msgstr "" + +#: ../src/osm.c:146 +msgid "Mapbox Outdoors" +msgstr "" + +#: ../src/osm.c:153 +msgid "Mapbox Specific" +msgstr "" + +#: ../src/osm.c:170 +msgid "OSM (view)" +msgstr "" + +#: ../src/osm.c:174 +msgid "OSM (edit)" +msgstr "" + +#. Note the use of positional parameters +#: ../src/osm.c:179 +msgid "OSM (query)" +msgstr "" + +#: ../src/osm.c:183 +msgid "OSM (render)" +msgstr "" + +#. Example: http://127.0.0.1:8111/load_and_zoom?left=8.19&right=8.20&top=48.605&bottom=48.590&select=node413602999 +#. JOSM or merkaartor must already be running with remote interface enabled +#: ../src/osm.c:190 +msgid "Local port 8111 (eg JOSM)" +msgstr "" + +#: ../src/osm.c:195 +msgid "Geofabrik Map Compare" +msgstr "" + +#: ../src/osm.c:203 +msgid "OpenStreetMap Notes" +msgstr "" + +#. Not really OSM but can't be bothered to create somewhere else to put it... +#: ../src/osm.c:221 +msgid "Wikimedia Toolserver GeoHack" +msgstr "" + +#: ../src/preferences.c:195 +msgid "Preferences" +msgstr "" + +#: ../src/toolbar.c:91 ../src/toolbar.c:92 +msgid "System Default" +msgstr "" + +#: ../src/toolbar.c:91 ../src/viktrwlayer.c:563 +msgid "Small" +msgstr "" + +#: ../src/toolbar.c:91 ../src/viktrwlayer.c:564 +msgid "Medium" +msgstr "" + +#: ../src/toolbar.c:91 ../src/viktrwlayer.c:565 +msgid "Large" +msgstr "" + +#: ../src/toolbar.c:92 +msgid "Icons Only" +msgstr "" + +#: ../src/toolbar.c:92 +msgid "Text Only" +msgstr "" + +#: ../src/toolbar.c:92 +msgid "Icons and Text" +msgstr "" + +#: ../src/toolbar.c:106 +msgid "Append to Menu:" +msgstr "" + +#: ../src/toolbar.c:107 +msgid "Pack the toolbar to the main menu to save vertical space" +msgstr "" + +#: ../src/toolbar.c:108 +msgid "Icon Size:" +msgstr "" + +#: ../src/toolbar.c:110 +msgid "Icon Style:" +msgstr "" + +#: ../src/toolbar.c:112 +msgid "Customize:" +msgstr "" + +#: ../src/toolbar.c:112 +msgid "Customize Buttons" +msgstr "" + +#. Preferences +#: ../src/toolbar.c:145 +msgid "Toolbar" +msgstr "" + +#: ../src/toolbar.c:312 +msgid "_Customize" +msgstr "" + +#: ../src/toolbar.c:641 +msgid "Separator" +msgstr "" + +#: ../src/toolbar.c:642 +msgid "--- Separator ---" +msgstr "" + +#: ../src/toolbar.c:1007 +msgid "Customize Toolbar" +msgstr "" + +#: ../src/toolbar.c:1028 +msgid "" +"Select items to be displayed on the toolbar. Items can be reordered by drag " +"and drop." +msgstr "" + +#: ../src/toolbar.c:1044 +msgid "Available Items" +msgstr "" + +#: ../src/toolbar.c:1065 +msgid "Displayed Items" +msgstr "" + +#: ../src/viklayer_defaults.c:232 +#, c-format +msgid "Could not open file: %s" +msgstr "" + +#: ../src/viklayer_defaults.c:304 +msgid "Layer Defaults" +msgstr "" + +#: ../src/uibuilder.c:196 +msgid "Take care that this password will be stored clearly in a plain file." +msgstr "" + +#: ../src/uibuilder.c:628 ../src/viktrwlayer_export.c:188 +#: ../src/viktrwlayer_export.c:304 ../src/vikwindow.c:3666 +#: ../src/vikwindow.c:4408 +#, c-format +msgid "The file \"%s\" exists, do you wish to overwrite it?" +msgstr "" + +#: ../src/vikaggregatelayer.c:41 +msgid "Aggregate" +msgstr "" + +#: ../src/vikaggregatelayer.c:528 ../src/viktrwlayer.c:11700 +#, c-format +msgid "%s: Waypoint List" +msgstr "" + +#: ../src/vikaggregatelayer.c:570 +msgid "Search by Date" +msgstr "" + +#: ../src/vikaggregatelayer.c:576 +msgid "No items found with the requested date." +msgstr "" + +#: ../src/vikaggregatelayer.c:615 ../src/viktrwlayer.c:11691 +#, c-format +msgid "%s: Track and Route List" +msgstr "" + +#: ../src/vikaggregatelayer.c:681 ../src/viktrwlayer.c:8346 +#: ../src/viktrwlayer.c:8417 ../src/viktrwlayer.c:8494 +msgid "_Visibility" +msgstr "" + +#: ../src/vikaggregatelayer.c:686 +msgid "_Show All" +msgstr "" + +#: ../src/vikaggregatelayer.c:692 +msgid "_Hide All" +msgstr "" + +#: ../src/vikaggregatelayer.c:698 ../src/viktrwlayer.c:8363 +#: ../src/viktrwlayer.c:8434 ../src/viktrwlayer.c:8511 +msgid "_Toggle" +msgstr "" + +#: ../src/vikaggregatelayer.c:705 ../src/viktrwlayer.c:8532 +msgid "_Sort" +msgstr "" + +#: ../src/vikaggregatelayer.c:711 ../src/viktrwlayer.c:8538 +msgid "Name _Ascending" +msgstr "" + +#: ../src/vikaggregatelayer.c:717 ../src/viktrwlayer.c:8544 +msgid "Name _Descending" +msgstr "" + +#: ../src/vikaggregatelayer.c:723 ../src/viktrwlayer.c:575 +#: ../src/viktrwlayer.c:8550 +msgid "Date Ascending" +msgstr "" + +#: ../src/vikaggregatelayer.c:729 ../src/viktrwlayer.c:576 +#: ../src/viktrwlayer.c:8556 +msgid "Date Descending" +msgstr "" + +#: ../src/vikaggregatelayer.c:735 ../src/viktrwlayer.c:8445 +#: ../src/viktrwlayer.c:8523 ../src/viktrwlayer.c:8595 +#: ../src/viktrwlayer_tracklist.c:296 +msgid "_Statistics" +msgstr "" + +#: ../src/vikaggregatelayer.c:740 ../src/viktrwlayer.c:4533 +msgid "Track _List..." +msgstr "" + +#: ../src/vikaggregatelayer.c:746 ../src/viktrwlayer.c:4540 +msgid "_Waypoint List..." +msgstr "" + +#: ../src/vikaggregatelayer.c:753 +msgid "Searc_h" +msgstr "" + +#: ../src/vikaggregatelayer.c:759 +msgid "By _Date..." +msgstr "" + +#: ../src/vikaggregatelayer.c:762 +msgid "Find the first item with a specified date" +msgstr "" + +#: ../src/vikaggregatelayer.c:765 +msgid "Load E_xternal Layers" +msgstr "" + +#. Could have a more complicated tooltip that numbers each type of layers, +#. but for now a simple overall count +#: ../src/vikaggregatelayer.c:1011 +#, c-format +msgid "One layer" +msgid_plural "%d layers" +msgstr[0] "" +msgstr[1] "" + +#: ../src/vikaggregatelayer.c:1014 +#, c-format +msgid "Empty" +msgstr "" + +#: ../src/vikdemlayer.c:86 +msgid "SRTM Global 90m (3 arcsec)" +msgstr "" + +#: ../src/vikdemlayer.c:94 +msgid "Absolute height" +msgstr "" + +#: ../src/vikdemlayer.c:95 +msgid "Height gradient" +msgstr "" + +#: ../src/vikdemlayer.c:120 +msgid "DEM Files:" +msgstr "DEM 檔案:" + +#: ../src/vikdemlayer.c:121 +msgid "Download Source:" +msgstr "下載源:" + +#: ../src/vikdemlayer.c:122 +msgid "Min Elev Color:" +msgstr "" + +#: ../src/vikdemlayer.c:123 ../src/viktrwlayer_wpwin.c:207 +msgid "Type:" +msgstr "" + +#: ../src/vikdemlayer.c:124 +msgid "Min Elev:" +msgstr "最低高度:" + +#: ../src/vikdemlayer.c:125 +msgid "Max Elev:" +msgstr "最高高度:" + +#: ../src/vikdemlayer.c:137 +msgid "_DEM Download" +msgstr "" + +#: ../src/vikdemlayer.c:137 +msgid "DEM Download" +msgstr "" + +#: ../src/vikdemlayer.c:192 +msgid "DEM" +msgstr "" + +#: ../src/vikdemlayer.c:304 +#, c-format +msgid "Number of files: %d" +msgstr "" + +#: ../src/vikdemlayer.c:446 +msgid "DEM Loading" +msgstr "" + +#: ../src/vikdemlayer.c:927 +#, c-format +msgid "No SRTM data available for %f, %f" +msgstr "没有可以的SRTM資料給 %f, %f" + +#: ../src/vikdemlayer.c:948 +#, c-format +msgid "DEM download failure for %f, %f" +msgstr "" + +#: ../src/vikdemlayer.c:954 +#, c-format +msgid "DEM write failure for %s" +msgstr "" + +#. Probably not over any land... +#: ../src/vikdemlayer.c:1201 +msgid "No DEM File Available" +msgstr "" + +#: ../src/vikdemlayer.c:1220 +#, c-format +msgid "" +"\n" +"Source: %s\n" +"\n" +"DEM File: %s\n" +"DEM File Timestamp: %s" +msgstr "" + +#: ../src/vikdemlayer.c:1224 +#, c-format +msgid "" +"Source: %s\n" +"\n" +"No DEM File!" +msgstr "" + +#: ../src/vikdemlayer.c:1264 +#, c-format +msgid "Downloading DEM %s" +msgstr "正在下載 DEM %s" + +#: ../src/vikdemlayer.c:1289 +msgid "_Show DEM File Information" +msgstr "" + +#: ../src/vikfileentry.c:72 +msgid "Browse..." +msgstr "瀏覧 ..." + +#: ../src/vikfileentry.c:103 +msgid "Choose file" +msgstr "選取一個檔案" + +#: ../src/vikfileentry.c:120 ../src/vikwindow.c:4372 +msgid "PNG" +msgstr "" + +#: ../src/vikfileentry.c:125 +msgid "TIFF" +msgstr "" + +#: ../src/vikfileentry.c:133 +msgid "MBTiles" +msgstr "" + +#: ../src/vikfileentry.c:142 +msgid "XML" +msgstr "" + +#: ../src/vikfileentry.c:149 +msgid "MML" +msgstr "" + +#: ../src/vikfileentry.c:154 +msgid "MSS" +msgstr "" + +#: ../src/vikfilelist.c:49 +msgid "Choose file(s)" +msgstr "選取檔案" + +#: ../src/vikfilelist.c:182 +msgid "Add..." +msgstr "添加 ..." + +#: ../src/vikfilelist.c:183 +msgid "Delete" +msgstr "移除" + +#: ../src/vikgeoreflayer.c:97 +msgid "_Georef Move Map" +msgstr "" + +#: ../src/vikgeoreflayer.c:97 +msgid "Georef Move Map" +msgstr "" + +#: ../src/vikgeoreflayer.c:106 +msgid "Georef Z_oom Tool" +msgstr "" + +#: ../src/vikgeoreflayer.c:106 +msgid "Georef Zoom Tool" +msgstr "" + +#: ../src/vikgeoreflayer.c:117 +msgid "GeoRef Map" +msgstr "" + +#: ../src/vikgeoreflayer.c:214 +msgid "Auto Read World Files:" +msgstr "" + +#: ../src/vikgeoreflayer.c:215 +msgid "" +"Automatically attempt to read associated world file of a new image for a " +"GeoRef layer" +msgstr "" + +#: ../src/vikgeoreflayer.c:511 ../src/vikgeoreflayer.c:797 +#: ../src/vikmapslayer.c:1174 +#, c-format +msgid "Couldn't open image file: %s" +msgstr "" + +#: ../src/vikgeoreflayer.c:607 ../src/vikgeoreflayer.c:633 +msgid "Choose World file" +msgstr "" + +#: ../src/vikgeoreflayer.c:619 +msgid "The World file you requested could not be opened for reading." +msgstr "" + +#: ../src/vikgeoreflayer.c:621 +msgid "Unexpected end of file reading World file." +msgstr "" + +#: ../src/vikgeoreflayer.c:646 +msgid "The file you requested could not be opened for writing." +msgstr "" + +#: ../src/vikgeoreflayer.c:782 +msgid "Lower right corner values may not be consistent with upper right values" +msgstr "" + +#: ../src/vikgeoreflayer.c:806 +#, c-format +msgid "Invalid image size: %s" +msgstr "" + +#: ../src/vikgeoreflayer.c:831 ../src/viklayer.c:561 ../src/vikwindow.c:4891 +msgid "Layer Properties" +msgstr "" + +#: ../src/vikgeoreflayer.c:852 +msgid "World File Parameters:" +msgstr "" + +#: ../src/vikgeoreflayer.c:853 +msgid "Load From File..." +msgstr "" + +#: ../src/vikgeoreflayer.c:858 +msgid "Corner pixel easting:" +msgstr "" + +#: ../src/vikgeoreflayer.c:860 +msgid "the UTM \"easting\" value of the upper-left corner pixel of the map" +msgstr "" + +#: ../src/vikgeoreflayer.c:862 +msgid "Corner pixel northing:" +msgstr "" + +#: ../src/vikgeoreflayer.c:864 +msgid "the UTM \"northing\" value of the upper-left corner pixel of the map" +msgstr "" + +#: ../src/vikgeoreflayer.c:866 +msgid "X (easting) scale (mpp): " +msgstr "" + +#: ../src/vikgeoreflayer.c:867 +msgid "Y (northing) scale (mpp): " +msgstr "" + +#: ../src/vikgeoreflayer.c:870 +msgid "the scale of the map in the X direction (meters per pixel)" +msgstr "" + +#: ../src/vikgeoreflayer.c:872 +msgid "the scale of the map in the Y direction (meters per pixel)" +msgstr "" + +#: ../src/vikgeoreflayer.c:874 +msgid "Map Image:" +msgstr "地圖圖片:" + +#: ../src/vikgeoreflayer.c:919 +msgid "Upper left latitude:" +msgstr "" + +#: ../src/vikgeoreflayer.c:921 +msgid "Upper left longitude:" +msgstr "" + +#: ../src/vikgeoreflayer.c:923 +msgid "Lower right latitude:" +msgstr "" + +#: ../src/vikgeoreflayer.c:925 +msgid "Lower right longitude:" +msgstr "" + +#: ../src/vikgeoreflayer.c:937 +msgid "Calculate MPP values from coordinates" +msgstr "" + +#: ../src/vikgeoreflayer.c:938 +msgid "" +"Enter all corner coordinates before calculating the MPP values from the " +"image size" +msgstr "" + +#: ../src/vikgeoreflayer.c:948 +msgid "UTM" +msgstr "" + +#: ../src/vikgeoreflayer.c:949 +msgid "Latitude/Longitude" +msgstr "" + +#: ../src/vikgeoreflayer.c:957 ../src/vikmapniklayer.c:82 +#: ../src/vikmapslayer.c:158 +msgid "Alpha:" +msgstr "Alpha:" + +#. Now with icons +#: ../src/vikgeoreflayer.c:1062 +msgid "_Zoom to Fit Map" +msgstr "" + +#: ../src/vikgeoreflayer.c:1068 +msgid "_Goto Map Center" +msgstr "" + +#: ../src/vikgeoreflayer.c:1074 +msgid "_Export to World File" +msgstr "" + +#: ../src/vikgoto.c:98 +msgid "No goto tool available." +msgstr "" + +#: ../src/vikgoto.c:295 +msgid "goto" +msgstr "" + +#: ../src/vikgoto.c:297 +msgid "goto provider:" +msgstr "" + +#: ../src/vikgoto.c:312 +msgid "Enter address or place name:" +msgstr "匯入位址或者地點名稱:" + +#: ../src/vikgoto.c:487 +msgid "Locality" +msgstr "" + +#: ../src/vikgpslayer.c:137 +msgid "Data Mode" +msgstr "" + +#: ../src/vikgpslayer.c:139 +msgid "Realtime Tracking Mode" +msgstr "" + +#: ../src/vikgpslayer.c:176 +msgid "Keep vehicle at center" +msgstr "" + +#: ../src/vikgpslayer.c:177 +msgid "Keep vehicle on screen" +msgstr "" + +#: ../src/vikgpslayer.c:178 +msgid "Disable" +msgstr "" + +#: ../src/vikgpslayer.c:218 +msgid "Download Tracks:" +msgstr "" + +#: ../src/vikgpslayer.c:219 +msgid "Upload Tracks:" +msgstr "" + +#: ../src/vikgpslayer.c:220 +msgid "Download Routes:" +msgstr "" + +#: ../src/vikgpslayer.c:221 +msgid "Upload Routes:" +msgstr "" + +#: ../src/vikgpslayer.c:222 +msgid "Download Waypoints:" +msgstr "" + +#: ../src/vikgpslayer.c:223 +msgid "Upload Waypoints:" +msgstr "" + +#: ../src/vikgpslayer.c:225 +msgid "Recording tracks" +msgstr "正在紀録軌迹" + +#: ../src/vikgpslayer.c:226 +msgid "Jump to current position on start" +msgstr "在開始時跳到目前位置" + +#: ../src/vikgpslayer.c:227 +msgid "Moving Map Method:" +msgstr "" + +#: ../src/vikgpslayer.c:228 +msgid "Update Statusbar:" +msgstr "" + +#: ../src/vikgpslayer.c:228 +msgid "Display information in the statusbar on GPS updates" +msgstr "" + +#: ../src/vikgpslayer.c:229 +msgid "Auto Connect" +msgstr "" + +#: ../src/vikgpslayer.c:229 +msgid "Automatically connect to GPSD" +msgstr "" + +#: ../src/vikgpslayer.c:230 +msgid "Gpsd Host:" +msgstr "Gpsd 主機:" + +#: ../src/vikgpslayer.c:231 +msgid "Gpsd Port:" +msgstr "Gpsd 通訊埠:" + +#: ../src/vikgpslayer.c:232 +msgid "Gpsd Retry Interval (seconds):" +msgstr "" + +#: ../src/vikgpslayer.c:254 +msgid "GPS" +msgstr "" + +#: ../src/vikgpslayer.c:320 ../src/vikgpslayer.c:1504 +msgid "GPS Download" +msgstr "GPS 下載" + +#: ../src/vikgpslayer.c:320 ../src/vikgpslayer.c:1504 ../src/viktrwlayer.c:3993 +msgid "GPS Upload" +msgstr "GPS 上傳" + +#: ../src/vikgpslayer.c:322 +msgid "GPS Realtime Tracking" +msgstr "GPS實時追蹤" + +#: ../src/vikgpslayer.c:458 +msgid "Connected" +msgstr "" + +#: ../src/vikgpslayer.c:460 +msgid "Disconnected" +msgstr "" + +#: ../src/vikgpslayer.c:554 +msgid "Unknown GPS Protocol" +msgstr "未知的GPS協定" + +#: ../src/vikgpslayer.c:572 +msgid "Unknown serial port device" +msgstr "未知的序列埠裝置" + +#: ../src/vikgpslayer.c:691 +#, c-format +msgid "%s: unknown parameter" +msgstr "%s: 未知的引數" + +#. Now with icons +#: ../src/vikgpslayer.c:794 +msgid "_Upload to GPS" +msgstr "" + +#: ../src/vikgpslayer.c:800 +msgid "Download from _GPS" +msgstr "" + +#: ../src/vikgpslayer.c:821 +msgid "Empty _Realtime" +msgstr "" + +#: ../src/vikgpslayer.c:828 +msgid "E_mpty Upload" +msgstr "" + +#: ../src/vikgpslayer.c:834 +msgid "_Empty Download" +msgstr "" + +#: ../src/vikgpslayer.c:840 +msgid "Empty _All" +msgstr "" + +#: ../src/vikgpslayer.c:852 +#, c-format +msgid "Unexpected number of disconnected handlers: %d" +msgstr "" + +#: ../src/vikgpslayer.c:995 +#, c-format +msgid "Uploading %d waypoint..." +msgid_plural "Uploading %d waypoints..." +msgstr[0] "" +msgstr[1] "" + +#: ../src/vikgpslayer.c:1000 +#, c-format +msgid "Uploading %d trackpoint..." +msgid_plural "Uploading %d trackpoints..." +msgstr[0] "" +msgstr[1] "" + +#: ../src/vikgpslayer.c:1005 +#, c-format +msgid "Uploading %d routepoint..." +msgid_plural "Uploading %d routepoints..." +msgstr[0] "" +msgstr[1] "" + +#: ../src/vikgpslayer.c:1034 +#, c-format +msgid "Downloaded %d out of %d waypoint..." +msgid_plural "Downloaded %d out of %d waypoints..." +msgstr[0] "" +msgstr[1] "" + +#: ../src/vikgpslayer.c:1040 +#, c-format +msgid "Downloaded %d out of %d trackpoint..." +msgid_plural "Downloaded %d out of %d trackpoints..." +msgstr[0] "" +msgstr[1] "" + +#: ../src/vikgpslayer.c:1046 +#, c-format +msgid "Downloaded %d out of %d routepoint..." +msgid_plural "Downloaded %d out of %d routepoints..." +msgstr[0] "" +msgstr[1] "" + +#: ../src/vikgpslayer.c:1056 +#, c-format +msgid "Uploaded %d out of %d waypoint..." +msgid_plural "Uploaded %d out of %d waypoints..." +msgstr[0] "" +msgstr[1] "" + +#: ../src/vikgpslayer.c:1062 +#, c-format +msgid "Uploaded %d out of %d trackpoint..." +msgid_plural "Uploaded %d out of %d trackpoints..." +msgstr[0] "" +msgstr[1] "" + +#: ../src/vikgpslayer.c:1068 +#, c-format +msgid "Uploaded %d out of %d routepoint..." +msgid_plural "Uploaded %d out of %d routepoints..." +msgstr[0] "" +msgstr[1] "" + +#: ../src/vikgpslayer.c:1079 +#, c-format +msgid "Downloaded %d waypoint" +msgid_plural "Downloaded %d waypoints" +msgstr[0] "下載的 %d 航點" + +#: ../src/vikgpslayer.c:1085 +#, c-format +msgid "Downloaded %d trackpoint" +msgid_plural "Downloaded %d trackpoints" +msgstr[0] "下載的 %d 軌迹點" + +#: ../src/vikgpslayer.c:1091 +#, c-format +msgid "Downloaded %d routepoint" +msgid_plural "Downloaded %d routepoints" +msgstr[0] "" +msgstr[1] "" + +#: ../src/vikgpslayer.c:1101 +#, c-format +msgid "Uploaded %d waypoint" +msgid_plural "Uploaded %d waypoints" +msgstr[0] "" +msgstr[1] "" + +#: ../src/vikgpslayer.c:1107 +#, c-format +msgid "Uploaded %d trackpoint" +msgid_plural "Uploaded %d trackpoints" +msgstr[0] "" +msgstr[1] "" + +#: ../src/vikgpslayer.c:1113 +#, c-format +msgid "Uploaded %d routepoint" +msgid_plural "Uploaded %d routepoints" +msgstr[0] "" +msgstr[1] "" + +#: ../src/vikgpslayer.c:1363 +msgid "Error: No result." +msgstr "" + +#: ../src/vikgpslayer.c:1471 +msgid "Warning - GPS Upload items may overwrite each other" +msgstr "" + +#: ../src/vikgpslayer.c:1506 +msgid "Status: detecting gpsbabel" +msgstr "狀態 : 偵測 gpsbabel" + +#: ../src/vikgpslayer.c:1533 +msgid "No GPS items selected for transfer." +msgstr "" + +#: ../src/vikgpslayer.c:1546 +msgid "Could not turn off device." +msgstr "" + +#: ../src/vikgpslayer.c:1589 +msgid "Are you sure you want to delete GPS Upload data?" +msgstr "" + +#: ../src/vikgpslayer.c:1602 +msgid "Are you sure you want to delete GPS Download data?" +msgstr "" + +#: ../src/vikgpslayer.c:1616 +msgid "Are you sure you want to delete GPS Realtime data?" +msgstr "" + +#: ../src/vikgpslayer.c:1630 +msgid "Are you sure you want to delete All GPS data?" +msgstr "" + +#: ../src/vikgpslayer.c:2004 +#, c-format +msgid "" +"Failed to connect to gpsd at %s (port %s)\n" +"Should Viking keep trying (every %d seconds)?" +msgstr "" + +#: ../src/viklayerspanel.c:73 +msgid "C_ut" +msgstr "" + +#: ../src/viklayerspanel.c:74 ../src/vikwindow.c:4882 +msgid "_Copy" +msgstr "複製(_C)" + +#: ../src/viklayerspanel.c:75 ../src/vikwindow.c:4883 +msgid "_Paste" +msgstr "貼上(_P)" + +#: ../src/viklayerspanel.c:76 ../src/vikwindow.c:4884 +msgid "_Delete" +msgstr "刪除(_D)" + +#: ../src/viklayerspanel.c:154 +msgid "New Layer" +msgstr "" + +#: ../src/viklayerspanel.c:347 +msgid "Top Layer" +msgstr "頂層" + +#: ../src/viklayerspanel.c:363 +msgid "Add new layer" +msgstr "" + +#: ../src/viklayerspanel.c:370 ../src/vikwindow.c:4884 +msgid "Remove selected layer" +msgstr "" + +#: ../src/viklayerspanel.c:377 +msgid "Move selected layer up" +msgstr "" + +#: ../src/viklayerspanel.c:384 +msgid "Move selected layer down" +msgstr "" + +#: ../src/viklayerspanel.c:391 ../src/vikwindow.c:4881 +msgid "Cut selected layer" +msgstr "" + +#: ../src/viklayerspanel.c:398 ../src/vikwindow.c:4882 +msgid "Copy selected layer" +msgstr "" + +#: ../src/viklayerspanel.c:405 ../src/vikwindow.c:4883 +msgid "" +"Paste layer into selected container layer or otherwise above selected layer" +msgstr "" + +#: ../src/viklayerspanel.c:502 +msgid "New name can not be blank." +msgstr "" + +#: ../src/viklayerspanel.c:751 +msgid "Aggregate Layers have no settable properties." +msgstr "" + +#: ../src/viklayerspanel.c:798 +msgid "You cannot cut the Top Layer." +msgstr "您無法剪取掉頂層" + +#: ../src/viklayerspanel.c:843 +#, c-format +msgid "Are you sure you want to delete %s?" +msgstr "" + +#: ../src/viklayerspanel.c:863 +msgid "You cannot delete the Top Layer." +msgstr "您無法移除頂層" + +#: ../src/vikmapniklayer.c:78 +msgid "CSS (MML) Config File:" +msgstr "" + +#: ../src/vikmapniklayer.c:79 +msgid "CartoCSS configuration file" +msgstr "" + +#: ../src/vikmapniklayer.c:80 +msgid "XML Config File:" +msgstr "" + +#: ../src/vikmapniklayer.c:81 +msgid "Mapnik XML configuration file" +msgstr "" + +#: ../src/vikmapniklayer.c:84 +msgid "Use File Cache:" +msgstr "" + +#: ../src/vikmapniklayer.c:86 +msgid "File Cache Directory:" +msgstr "" + +#: ../src/vikmapniklayer.c:122 +msgid "_Mapnik Features" +msgstr "" + +#: ../src/vikmapniklayer.c:122 +msgid "Mapnik Features" +msgstr "" + +#: ../src/vikmapniklayer.c:140 +msgid "Mapnik Rendering" +msgstr "" + +#. Changing these values only applies before first mapnik layer is 'created' +#: ../src/vikmapniklayer.c:258 +msgid "Plugins Directory:" +msgstr "" + +#: ../src/vikmapniklayer.c:258 ../src/vikmapniklayer.c:259 +#: ../src/vikmapniklayer.c:260 ../src/vikmapniklayer.c:261 +msgid "You need to restart Viking for a change to this value to be used" +msgstr "" + +#: ../src/vikmapniklayer.c:259 +msgid "Fonts Directory:" +msgstr "" + +#: ../src/vikmapniklayer.c:260 +msgid "Recurse Fonts Directory:" +msgstr "" + +#: ../src/vikmapniklayer.c:261 +msgid "Rerender Timeout (hours):" +msgstr "" + +#. Changeable any time +#: ../src/vikmapniklayer.c:263 +msgid "CartoCSS:" +msgstr "" + +#: ../src/vikmapniklayer.c:263 +msgid "The program to convert CartoCSS files into Mapnik XML" +msgstr "" + +#: ../src/vikmapniklayer.c:506 +msgid "Running" +msgstr "" + +#: ../src/vikmapniklayer.c:525 +#, c-format +msgid "" +"Error running carto command:\n" +"%s" +msgstr "" + +#: ../src/vikmapniklayer.c:561 +msgid " completed in " +msgstr "" + +#: ../src/vikmapniklayer.c:561 +msgid "seconds" +msgstr "" + +#: ../src/vikmapniklayer.c:611 ../src/vikmapniklayer.c:979 +#, c-format +msgid "" +"Mapnik error loading configuration file:\n" +"%s" +msgstr "" + +#: ../src/vikmapniklayer.c:749 +#, c-format +msgid "Mapnik Render %d:%d:%d %s" +msgstr "" + +#: ../src/vikmapniklayer.c:840 +msgid "Mapnik Rendering must be in Mercator mode" +msgstr "" + +#: ../src/vikmapniklayer.c:997 +msgid "Mapnik Information" +msgstr "" + +#: ../src/vikmapniklayer.c:1031 +msgid "_Flush Memory Cache" +msgstr "" + +#: ../src/vikmapniklayer.c:1044 +msgid "_Run Carto Command" +msgstr "" + +#: ../src/vikmapniklayer.c:1102 ../src/vikmapslayer.c:2029 +#, c-format +msgid "Tile File Timestamp: %s" +msgstr "" + +#: ../src/vikmapniklayer.c:1105 ../src/vikmapslayer.c:2032 +msgid "Tile File Timestamp: Not Available" +msgstr "" + +#: ../src/vikmapniklayer.c:1120 +#, c-format +msgid "Rendering time %.2f seconds" +msgstr "" + +#: ../src/vikmapniklayer.c:1124 ../src/vikmapslayer.c:2042 +msgid "Tile Information" +msgstr "" + +#: ../src/vikmapniklayer.c:1145 +msgid "_Rerender Tile" +msgstr "" + +#: ../src/vikmapniklayer.c:1150 +msgid "_Info" +msgstr "" + +#. ******* MAPZOOMS ******** +#: ../src/vikmapslayer.c:96 +msgid "Use Viking Zoom Level" +msgstr "" + +#: ../src/vikmapslayer.c:146 +msgid "OSM" +msgstr "" + +#. NB mode => id - But can't break file format just to rename something better +#: ../src/vikmapslayer.c:152 +msgid "Map Type:" +msgstr "地圖類別:" + +#: ../src/vikmapslayer.c:153 +msgid "Maps Directory:" +msgstr "" + +#: ../src/vikmapslayer.c:154 +msgid "Cache Layout:" +msgstr "" + +#: ../src/vikmapslayer.c:155 +msgid "This determines the tile storage layout on disk" +msgstr "" + +#: ../src/vikmapslayer.c:156 +msgid "Map File:" +msgstr "" + +#: ../src/vikmapslayer.c:157 +msgid "An MBTiles file. Only applies when the map type method is 'MBTiles'" +msgstr "" + +#: ../src/vikmapslayer.c:159 +msgid "Control the Alpha value for transparency effects" +msgstr "" + +#: ../src/vikmapslayer.c:160 +msgid "Autodownload maps:" +msgstr "自動下載地圖:" + +#: ../src/vikmapslayer.c:161 +msgid "Autodownload Only Gets Missing Maps:" +msgstr "" + +#: ../src/vikmapslayer.c:162 +msgid "" +"Using this option avoids attempting to update already acquired tiles. This " +"can be useful if you want to restrict the network usage, without having to " +"resort to manual control. Only applies when 'Autodownload Maps' is on." +msgstr "" + +#: ../src/vikmapslayer.c:163 +msgid "Zoom Level:" +msgstr "縮放程度 :" + +#: ../src/vikmapslayer.c:164 +msgid "" +"Determines the method of displaying map tiles for the current zoom level. " +"'Viking Zoom Level' uses the best matching level, otherwise setting a fixed " +"value will always use map tiles of the specified value regardless of the " +"actual zoom level." +msgstr "" + +#: ../src/vikmapslayer.c:197 +msgid "_Maps Download" +msgstr "" + +#: ../src/vikmapslayer.c:197 +msgid "Maps Download" +msgstr "地圖下載" + +#: ../src/vikmapslayer.c:213 ../src/vikutils.c:895 +msgid "Map" +msgstr "地圖" + +#: ../src/vikmapslayer.c:306 +msgid "Default map layer directory:" +msgstr "" + +#: ../src/vikmapslayer.c:306 +msgid "Choose a directory to store cached Map tiles for this layer" +msgstr "" + +#: ../src/vikmapslayer.c:436 ../src/vikmapslayer.c:633 +msgid "Unknown map type" +msgstr "未知的地圖類別" + +#: ../src/vikmapslayer.c:664 +msgid "Unknown Map Zoom" +msgstr "" + +#: ../src/vikmapslayer.c:833 +#, c-format +msgid "Failed to open MBTiles file: %s" +msgstr "" + +#: ../src/vikmapslayer.c:856 +#, c-format +msgid "" +"New map cannot be displayed in the current drawmode.\n" +"Select \"%s\" from View menu to view it." +msgstr "" + +#: ../src/vikmapslayer.c:1314 +#, c-format +msgid "" +"Cowardly refusing to draw tiles or existence of tiles beyond %d zoom out " +"factor" +msgstr "" + +#. TODO: ?? count up the number of download errors somehow... +#: ../src/vikmapslayer.c:1667 +msgid "Failed to download tile" +msgstr "" + +#: ../src/vikmapslayer.c:1673 +msgid "Unable to save tile" +msgstr "" + +#: ../src/vikmapslayer.c:1799 +#, c-format +msgid "Redownloading up to %d %s map..." +msgid_plural "Redownloading up to %d %s maps..." +msgstr[0] "" +msgstr[1] "" + +#: ../src/vikmapslayer.c:1801 +#, c-format +msgid "Redownloading %d %s map..." +msgid_plural "Redownloading %d %s maps..." +msgstr[0] "" +msgstr[1] "" + +#: ../src/vikmapslayer.c:1805 ../src/vikmapslayer.c:1890 +#, c-format +msgid "Downloading %d %s map..." +msgid_plural "Downloading %d %s maps..." +msgstr[0] "正在下載 %d %s 地圖..." + +#: ../src/vikmapslayer.c:1969 +msgid "YES" +msgstr "" + +#: ../src/vikmapslayer.c:1973 ../src/vikmapslayer.c:1977 +msgid "NO" +msgstr "" + +#. NB Also handles .jpg automatically due to pixbuf_new_from () support - although just print png for now. +#: ../src/vikmapslayer.c:1980 +#, c-format +msgid "Source: %s (%d%s%d%s%d.%s %s)" +msgstr "" + +#: ../src/vikmapslayer.c:1983 +msgid "Source: Not available" +msgstr "" + +#: ../src/vikmapslayer.c:2000 +msgid "Source: file://" +msgstr "" + +#: ../src/vikmapslayer.c:2012 +#, c-format +msgid "Source: %s" +msgstr "" + +#: ../src/vikmapslayer.c:2038 +#, c-format +msgid "Tile File: %s [Not Available]" +msgstr "" + +#: ../src/vikmapslayer.c:2086 +msgid "Redownload _Bad Map(s)" +msgstr "" + +#: ../src/vikmapslayer.c:2090 +msgid "Redownload _New Map(s)" +msgstr "" + +#: ../src/vikmapslayer.c:2094 +msgid "Redownload _All Map(s)" +msgstr "" + +#: ../src/vikmapslayer.c:2099 +msgid "_Show Tile Information" +msgstr "" + +#: ../src/vikmapslayer.c:2166 +#, c-format +msgid "" +"Wrong drawmode for this map.\n" +"Select \"%s\" from View menu and try again." +msgstr "" + +#: ../src/vikmapslayer.c:2171 +msgid "Wrong zoom level for this map." +msgstr "此地圖無此縮放程度" + +#: ../src/vikmapslayer.c:2334 +msgid "Zoom Start:" +msgstr "" + +#: ../src/vikmapslayer.c:2341 +msgid "Zoom End:" +msgstr "" + +#: ../src/vikmapslayer.c:2347 +msgid "Download Maps Method:" +msgstr "" + +#. redownload method - needs to align with REDOWNLOAD* macro values +#: ../src/vikmapslayer.c:2419 +msgid "Missing" +msgstr "" + +#: ../src/vikmapslayer.c:2419 +msgid "Bad" +msgstr "" + +#: ../src/vikmapslayer.c:2419 +msgid "New" +msgstr "" + +#: ../src/vikmapslayer.c:2419 +msgid "Reload All" +msgstr "" + +#: ../src/vikmapslayer.c:2421 +msgid "Download for Zoom Levels" +msgstr "" + +#: ../src/vikmapslayer.c:2461 +#, c-format +msgid "" +"You are not allowed to download more than %d tiles in one go (requested %d)" +msgstr "" + +#: ../src/vikmapslayer.c:2469 +#, c-format +msgid "Do you really want to download %d tiles?" +msgstr "" + +#. Now with icons +#: ../src/vikmapslayer.c:2509 +msgid "Download _Missing Onscreen Maps" +msgstr "" + +#: ../src/vikmapslayer.c:2516 +msgid "Download _New Onscreen Maps" +msgstr "" + +#: ../src/vikmapslayer.c:2523 +msgid "Reload _All Onscreen Maps" +msgstr "" + +#: ../src/vikmapslayer.c:2529 +msgid "Download Maps in _Zoom Levels..." +msgstr "" + +#: ../src/vikmapslayer.c:2539 +#, fuzzy +msgid "_Open MBTiles Files" +msgstr "開啟一個檔案" + +#: ../src/vikmapslayer.c:2554 +msgid "Flush Map Cache" +msgstr "" + +#: ../src/vikrouting.c:54 +msgid "Default engine:" +msgstr "" + +#: ../src/vikrouting.c:68 +msgid "Routing" +msgstr "" + +#: ../src/viktreeview.c:347 +msgid "Layer Name" +msgstr "圖層名字" + +#: ../src/viktreeview.c:924 +#, c-format +msgid "delete data from %s\n" +msgstr "從 %s 移除資料\n" + +#: ../src/viktrwlayer.c:427 +msgid "Create _Waypoint" +msgstr "" + +#: ../src/viktrwlayer.c:427 +msgid "Create Waypoint" +msgstr "建立航點" + +#: ../src/viktrwlayer.c:437 +#, fuzzy +msgid "Edit _Track" +msgstr "編輯軌迹點" + +#: ../src/viktrwlayer.c:437 +#, fuzzy +msgid "Edit Track" +msgstr "編輯軌迹點" + +#: ../src/viktrwlayer.c:449 +#, fuzzy +msgid "Edit _Route" +msgstr "新增路線" + +#: ../src/viktrwlayer.c:449 +#, fuzzy +msgid "Edit Route" +msgstr "新增路線" + +#: ../src/viktrwlayer.c:460 +msgid "Route _Finder" +msgstr "" + +#: ../src/viktrwlayer.c:460 +msgid "Route Finder" +msgstr "" + +#: ../src/viktrwlayer.c:471 +msgid "Splitter" +msgstr "" + +#: ../src/viktrwlayer.c:482 +msgid "_Edit Waypoint" +msgstr "" + +#: ../src/viktrwlayer.c:482 +msgid "Edit Waypoint" +msgstr "編輯航點" + +#: ../src/viktrwlayer.c:495 +msgid "Edit Trac_kpoint" +msgstr "" + +#: ../src/viktrwlayer.c:495 +msgid "Edit Trackpoint" +msgstr "編輯軌迹點" + +#. a pixbuf for this one is already made globally available +#: ../src/viktrwlayer.c:508 +msgid "Show P_icture" +msgstr "" + +#: ../src/viktrwlayer.c:508 +msgid "Show Picture" +msgstr "察看圖片" + +#: ../src/viktrwlayer.c:531 +msgid "Waypoint Images" +msgstr "航點圖片" + +#: ../src/viktrwlayer.c:531 +msgid "Tracks Advanced" +msgstr "" + +#: ../src/viktrwlayer.c:531 +msgid "Metadata" +msgstr "" + +#: ../src/viktrwlayer.c:531 +msgid "Filesystem" +msgstr "" + +#: ../src/viktrwlayer.c:534 +msgid "Draw by Track" +msgstr "以軌迹繪圖" + +#: ../src/viktrwlayer.c:534 +msgid "Draw by Speed" +msgstr "" + +#: ../src/viktrwlayer.c:534 +msgid "All Tracks Same Color" +msgstr "" + +#: ../src/viktrwlayer.c:535 +msgid "Filled Square" +msgstr "實心方塊" + +#: ../src/viktrwlayer.c:535 +msgid "Square" +msgstr "正方形" + +#: ../src/viktrwlayer.c:535 +msgid "Circle" +msgstr "圓形" + +#: ../src/viktrwlayer.c:535 +msgid "X" +msgstr "X" + +#: ../src/viktrwlayer.c:561 +msgid "Extra Extra Small" +msgstr "" + +#: ../src/viktrwlayer.c:562 +msgid "Extra Small" +msgstr "" + +#: ../src/viktrwlayer.c:566 +msgid "Extra Large" +msgstr "" + +#: ../src/viktrwlayer.c:567 +msgid "Extra Extra Large" +msgstr "" + +#: ../src/viktrwlayer.c:573 +msgid "Name Ascending" +msgstr "" + +#: ../src/viktrwlayer.c:574 +msgid "Name Descending" +msgstr "" + +#: ../src/viktrwlayer.c:582 ../src/viktrwlayer_propwin.c:3319 +msgid "No" +msgstr "" + +#: ../src/viktrwlayer.c:583 +msgid "Yes" +msgstr "" + +#: ../src/viktrwlayer.c:584 +msgid "No write" +msgstr "" + +#: ../src/viktrwlayer.c:649 ../src/viktrwlayer.c:673 +msgid "Draw Labels" +msgstr "描繪圖層" + +#: ../src/viktrwlayer.c:650 +msgid "Note: the individual track controls what labels may be displayed" +msgstr "" + +#: ../src/viktrwlayer.c:651 +msgid "Track Labels Font Size:" +msgstr "" + +#: ../src/viktrwlayer.c:652 +msgid "Track Drawing Mode:" +msgstr "" + +#: ../src/viktrwlayer.c:653 +msgid "All Tracks Color:" +msgstr "" + +#: ../src/viktrwlayer.c:654 +msgid "The color used when 'All Tracks Same Color' drawing mode is selected" +msgstr "" + +#: ../src/viktrwlayer.c:655 +msgid "Draw Track Lines" +msgstr "" + +#: ../src/viktrwlayer.c:656 +msgid "Track Thickness:" +msgstr "" + +#: ../src/viktrwlayer.c:657 +msgid "Draw Track Direction" +msgstr "" + +#: ../src/viktrwlayer.c:658 +msgid "Direction Size:" +msgstr "" + +#: ../src/viktrwlayer.c:659 +msgid "Draw Trackpoints" +msgstr "" + +#: ../src/viktrwlayer.c:660 +msgid "Trackpoint Size:" +msgstr "" + +#: ../src/viktrwlayer.c:661 +msgid "Draw Elevation" +msgstr "" + +#: ../src/viktrwlayer.c:662 +msgid "Draw Elevation Height %:" +msgstr "" + +#: ../src/viktrwlayer.c:663 +msgid "Draw Stops" +msgstr "" + +#: ../src/viktrwlayer.c:664 +msgid "" +"Whether to draw a marker when trackpoints are at the same position but over " +"the minimum stop length apart in time" +msgstr "" + +#: ../src/viktrwlayer.c:665 +msgid "Min Stop Length (seconds):" +msgstr "" + +#: ../src/viktrwlayer.c:667 +msgid "Track BG Thickness:" +msgstr "" + +#: ../src/viktrwlayer.c:668 +msgid "Track Background Color" +msgstr "" + +#: ../src/viktrwlayer.c:669 +msgid "Draw by Speed Factor (%):" +msgstr "" + +#: ../src/viktrwlayer.c:670 +msgid "" +"The percentage factor away from the average speed determining the color used" +msgstr "" + +#: ../src/viktrwlayer.c:671 +msgid "Track Sort Order:" +msgstr "" + +#: ../src/viktrwlayer.c:674 +msgid "Waypoint Font Size:" +msgstr "" + +#: ../src/viktrwlayer.c:675 +msgid "Waypoint Color:" +msgstr "航點色彩" + +#: ../src/viktrwlayer.c:676 +msgid "Waypoint Text:" +msgstr "航點文字:" + +#: ../src/viktrwlayer.c:677 +msgid "Background:" +msgstr "背景:" + +#: ../src/viktrwlayer.c:678 +msgid "Fake BG Color Translucency:" +msgstr "" + +#: ../src/viktrwlayer.c:679 +msgid "Waypoint marker:" +msgstr "航點標簽" + +#: ../src/viktrwlayer.c:680 +msgid "Waypoint size:" +msgstr "航點大小" + +#: ../src/viktrwlayer.c:681 +msgid "Draw Waypoint Symbols:" +msgstr "" + +#: ../src/viktrwlayer.c:682 +msgid "Waypoint Sort Order:" +msgstr "" + +#: ../src/viktrwlayer.c:684 +msgid "Draw Waypoint Images" +msgstr "" + +#: ../src/viktrwlayer.c:685 +msgid "Image Size (pixels):" +msgstr "圖片大小 (像素):" + +#: ../src/viktrwlayer.c:686 +msgid "Image Alpha:" +msgstr "圖片Alpha值:" + +#: ../src/viktrwlayer.c:687 +msgid "Image Memory Cache Size:" +msgstr "圖片記憶體緩衝區大小:" + +#: ../src/viktrwlayer.c:690 +msgid "Author" +msgstr "" + +#: ../src/viktrwlayer.c:691 +msgid "Creation Time" +msgstr "" + +#: ../src/viktrwlayer.c:692 +msgid "Keywords" +msgstr "" + +#: ../src/viktrwlayer.c:693 +msgid "External layer:" +msgstr "" + +#: ../src/viktrwlayer.c:693 +msgid "" +"Layer data stored in the Viking file, in an external file, or in an external " +"file but changes are not written to the file (file only loaded at startup)" +msgstr "" + +#: ../src/viktrwlayer.c:694 +msgid "Save layer as:" +msgstr "" + +#: ../src/viktrwlayer.c:694 +msgid "Specify where layer should be saved. Overwrites file if it exists." +msgstr "" + +#: ../src/viktrwlayer.c:798 +msgid "TrackWaypoint" +msgstr "" + +#: ../src/viktrwlayer.c:1999 ../src/viktrwlayer_propwin.c:1469 +#: ../src/viktrwlayer_propwin.c:1471 ../src/vikutils.c:299 +#: ../src/vikutils.c:326 +msgid "miles" +msgstr "" + +#: ../src/viktrwlayer.c:2002 ../src/viktrwlayer_propwin.c:1475 +#: ../src/viktrwlayer_propwin.c:1477 ../src/vikutils.c:303 +#: ../src/vikutils.c:330 +msgid "NM" +msgstr "" + +#. VIK_UNITS_DISTANCE_KILOMETRES: +#: ../src/viktrwlayer.c:2006 ../src/viktrwlayer_propwin.c:1482 +#: ../src/viktrwlayer_propwin.c:1484 ../src/vikutils.c:308 +#: ../src/vikutils.c:335 +msgid "km" +msgstr "" + +#: ../src/viktrwlayer.c:2121 +msgid "start/end" +msgstr "" + +#: ../src/viktrwlayer.c:2133 +msgid "start" +msgstr "" + +#: ../src/viktrwlayer.c:2142 +msgid "end" +msgstr "" + +#: ../src/viktrwlayer.c:3103 +#, c-format +msgid " in %d:%02d hrs:mins" +msgstr "" + +#: ../src/viktrwlayer.c:3107 +#, c-format +msgid "" +"\n" +"%sTotal Length %.1f %s%s" +msgstr "" + +#: ../src/viktrwlayer.c:3131 +#, c-format +msgid "" +"\n" +"Total route length %.1f %s" +msgstr "" + +#: ../src/viktrwlayer.c:3136 +#, c-format +msgid "Tracks: %d - Waypoints: %d - Routes: %d%s%s" +msgstr "" + +#: ../src/viktrwlayer.c:3155 +#, c-format +msgid "Tracks: %d" +msgstr "" + +#: ../src/viktrwlayer.c:3165 +#, c-format +msgid "Routes: %d" +msgstr "" + +#: ../src/viktrwlayer.c:3195 +#, c-format +msgid "- %d:%02d hrs:mins" +msgstr "" + +#: ../src/viktrwlayer.c:3202 +#, c-format +msgid "%s%.1f km %s" +msgstr "" + +#: ../src/viktrwlayer.c:3205 +#, c-format +msgid "%s%.1f miles %s" +msgstr "" + +#: ../src/viktrwlayer.c:3208 +#, c-format +msgid "%s%.1f NM %s" +msgstr "" + +#: ../src/viktrwlayer.c:3222 +#, c-format +msgid "Waypoints: %d" +msgstr "" + +#: ../src/viktrwlayer.c:3279 +#, c-format +msgid "Wpt: Alt %dft" +msgstr "" + +#. VIK_UNITS_HEIGHT_METRES: +#: ../src/viktrwlayer.c:3283 +#, c-format +msgid "Wpt: Alt %dm" +msgstr "" + +#. Add comment if available +#: ../src/viktrwlayer.c:3298 +#, c-format +msgid "%s | %s %s | Comment: %s" +msgstr "" + +#: ../src/viktrwlayer.c:3300 +#, c-format +msgid "%s | %s %s" +msgstr "" + +#: ../src/viktrwlayer.c:3562 ../src/viktrwlayer.c:3591 +msgid "This layer has no waypoints or trackpoints." +msgstr "" + +#: ../src/viktrwlayer.c:3598 ../src/viktrwlayer.c:3607 +#: ../src/viktrwlayer.c:3616 ../src/viktrwlayer.c:3625 +#: ../src/viktrwlayer.c:3634 ../src/viktrwlayer.c:3642 +msgid "Export Layer" +msgstr "匯出圖層" + +#: ../src/viktrwlayer.c:3671 +msgid "Export Route as GPX" +msgstr "" + +#: ../src/viktrwlayer.c:3673 +msgid "Export Track as GPX" +msgstr "" + +#: ../src/viktrwlayer.c:3693 +msgid "Find" +msgstr "" + +#: ../src/viktrwlayer.c:3703 +msgid "Waypoint Name:" +msgstr "航點名稱:" + +#: ../src/viktrwlayer.c:3720 +msgid "Waypoint not found in this layer." +msgstr "在此圖層中没有發現航點" + +#: ../src/viktrwlayer.c:3989 +msgid "Can not upload invisible track." +msgstr "" + +#: ../src/viktrwlayer.c:4082 ../src/viktrwlayer.c:10512 +msgid "Track" +msgstr "" + +#: ../src/viktrwlayer.c:4107 ../src/viktrwlayer.c:10599 +msgid "Route" +msgstr "" + +#: ../src/viktrwlayer.c:4194 +msgid "Externa_l" +msgstr "" + +#: ../src/viktrwlayer.c:4216 ../src/viktrwlayer.c:8456 +#: ../src/viktrwlayer.c:8574 +msgid "_Finish Route" +msgstr "" + +#: ../src/viktrwlayer.c:4218 ../src/viktrwlayer.c:8380 +#: ../src/viktrwlayer.c:8572 +msgid "_Finish Track" +msgstr "" + +#. Now with icons +#: ../src/viktrwlayer.c:4230 +msgid "_View Layer" +msgstr "" + +#: ../src/viktrwlayer.c:4237 +msgid "V_iew" +msgstr "" + +#: ../src/viktrwlayer.c:4243 +msgid "View All _Tracks" +msgstr "" + +#: ../src/viktrwlayer.c:4248 +msgid "View All _Routes" +msgstr "" + +#: ../src/viktrwlayer.c:4253 +msgid "View All _Waypoints" +msgstr "" + +#: ../src/viktrwlayer.c:4258 +msgid "_Goto Center of Layer" +msgstr "" + +#: ../src/viktrwlayer.c:4264 ../src/viktrwlayer.c:8321 +msgid "Goto _Waypoint..." +msgstr "" + +#: ../src/viktrwlayer.c:4270 +msgid "_Export Layer" +msgstr "" + +#: ../src/viktrwlayer.c:4276 +msgid "Export as GPS_Point..." +msgstr "" + +#: ../src/viktrwlayer.c:4281 +msgid "Export as GPS_Mapper..." +msgstr "" + +#: ../src/viktrwlayer.c:4286 +msgid "Export as _GPX..." +msgstr "" + +#: ../src/viktrwlayer.c:4292 +msgid "Export as _KML..." +msgstr "" + +#: ../src/viktrwlayer.c:4299 +msgid "Export as GEO_JSON..." +msgstr "" + +#: ../src/viktrwlayer.c:4306 +msgid "Export via GPSbabel..." +msgstr "" + +#: ../src/viktrwlayer.c:4312 +#, c-format +msgid "Open with External Program_1: %s" +msgstr "" + +#: ../src/viktrwlayer.c:4319 +#, c-format +msgid "Open with External Program_2: %s" +msgstr "" + +#: ../src/viktrwlayer.c:4327 ../src/vikwindow.c:4825 +msgid "_New" +msgstr "_N 新建" + +#: ../src/viktrwlayer.c:4333 +msgid "New _Waypoint..." +msgstr "" + +#: ../src/viktrwlayer.c:4339 +msgid "New _Track" +msgstr "" + +#: ../src/viktrwlayer.c:4347 +msgid "New _Route" +msgstr "" + +#: ../src/viktrwlayer.c:4356 ../src/viktrwlayer.c:8232 +#: ../src/viktrwlayer.c:9003 +msgid "Geotag _Images..." +msgstr "" + +#: ../src/viktrwlayer.c:4363 +msgid "_Acquire" +msgstr "" + +#: ../src/viktrwlayer.c:4369 ../src/vikwindow.c:4904 +msgid "From _GPS..." +msgstr "_G 從GPS..." + +#. FIXME: only add menu when at least a routing engine has support for Directions +#: ../src/viktrwlayer.c:4375 +msgid "From _Directions..." +msgstr "" + +#: ../src/viktrwlayer.c:4381 +msgid "From _OSM Traces..." +msgstr "" + +#: ../src/viktrwlayer.c:4386 +msgid "From _My OSM Traces..." +msgstr "" + +#: ../src/viktrwlayer.c:4392 ../src/vikwindow.c:4844 +msgid "From _URL..." +msgstr "" + +#: ../src/viktrwlayer.c:4399 ../src/vikwindow.c:4846 +msgid "From _Wikipedia Waypoints" +msgstr "" + +#: ../src/viktrwlayer.c:4405 +msgid "Within _Layer Bounds" +msgstr "" + +#: ../src/viktrwlayer.c:4411 +msgid "Within _Current View" +msgstr "" + +#: ../src/viktrwlayer.c:4419 +msgid "From Geo_caching..." +msgstr "" + +#: ../src/viktrwlayer.c:4426 ../src/vikwindow.c:4842 +msgid "From Geotagged _Images..." +msgstr "" + +#: ../src/viktrwlayer.c:4433 +msgid "From _File..." +msgstr "" + +#: ../src/viktrwlayer.c:4436 ../src/vikwindow.c:4905 +msgid "Import File With GPS_Babel..." +msgstr "" + +#: ../src/viktrwlayer.c:4443 ../src/viktrwlayer.c:8905 +msgid "_Upload" +msgstr "" + +#: ../src/viktrwlayer.c:4449 +msgid "Upload to _GPS..." +msgstr "" + +#: ../src/viktrwlayer.c:4456 ../src/viktrwlayer.c:8973 +msgid "Upload to _OSM..." +msgstr "" + +#: ../src/viktrwlayer.c:4464 +msgid "De_lete" +msgstr "" + +#: ../src/viktrwlayer.c:4470 +msgid "Delete All _Tracks" +msgstr "" + +#: ../src/viktrwlayer.c:4477 +msgid "Delete Tracks _From Selection..." +msgstr "" + +#: ../src/viktrwlayer.c:4484 ../src/viktrwlayer.c:8481 +msgid "Delete _All Routes" +msgstr "" + +#: ../src/viktrwlayer.c:4491 ../src/viktrwlayer.c:8487 +msgid "_Delete Routes From Selection..." +msgstr "" + +#: ../src/viktrwlayer.c:4498 +msgid "Delete All _Waypoints" +msgstr "" + +#: ../src/viktrwlayer.c:4505 +msgid "Delete Waypoints From _Selection..." +msgstr "" + +#: ../src/viktrwlayer.c:4512 ../src/viktrwlayer.c:8339 +#, fuzzy +msgid "Delete Duplicate Waypoints" +msgstr "建立航點" + +#: ../src/viktrwlayer.c:5198 +#, c-format +msgid "Are you sure you want to delete all tracks in %s?" +msgstr "" + +#: ../src/viktrwlayer.c:5211 +#, c-format +msgid "Are you sure you want to delete all routes in %s?" +msgstr "" + +#: ../src/viktrwlayer.c:5221 +#, c-format +msgid "Are you sure you want to delete all waypoints in %s?" +msgstr "" + +#: ../src/viktrwlayer.c:5238 +#, c-format +msgid "Are you sure you want to delete the waypoint \"%s\"?" +msgstr "" + +#: ../src/viktrwlayer.c:5254 +#, c-format +msgid "Are you sure you want to delete the track \"%s\"?" +msgstr "" + +#: ../src/viktrwlayer.c:5271 +#, c-format +msgid "Are you sure you want to delete the route \"%s\"?" +msgstr "" + +#: ../src/viktrwlayer.c:5527 ../src/viktrwlayer.c:6373 +msgid "" +"Converting a track to a route removes extra track data such as segments, " +"timestamps, etc...\n" +"Do you want to continue?" +msgstr "" + +#: ../src/viktrwlayer.c:5631 +msgid "No DEM layers available, thus no DEM values can be applied." +msgstr "" + +#: ../src/viktrwlayer.c:5651 ../src/viktrwlayer.c:5692 +#, c-format +msgid "%ld point adjusted" +msgid_plural "%ld points adjusted" +msgstr[0] "" +msgstr[1] "" + +#: ../src/viktrwlayer.c:5736 +#, c-format +msgid "%ld waypoint changed" +msgid_plural "%ld waypoints changed" +msgstr[0] "" +msgstr[1] "" + +#: ../src/viktrwlayer.c:5917 +#, c-format +msgid "" +"Refining a track with many points (%d) is unlikely to yield sensible " +"results. Do you want to Continue?" +msgstr "" + +#. Select engine from dialog +#: ../src/viktrwlayer.c:5925 +msgid "Refine Route with Routing Engine..." +msgstr "" + +#: ../src/viktrwlayer.c:5933 +msgid "Select routing engine" +msgstr "" + +#: ../src/viktrwlayer.c:6158 +msgid "Failed. No other tracks with timestamps in this layer found" +msgstr "" + +#: ../src/viktrwlayer.c:6160 +msgid "Failed. No other tracks without timestamps in this layer found" +msgstr "" + +#: ../src/viktrwlayer.c:6179 +msgid "Merge with..." +msgstr "" + +#: ../src/viktrwlayer.c:6180 +msgid "Select route to merge with" +msgstr "" + +#: ../src/viktrwlayer.c:6180 +msgid "Select track to merge with" +msgstr "" + +#: ../src/viktrwlayer.c:6264 ../src/viktrwlayer.c:6346 +msgid "Append Route" +msgstr "" + +#: ../src/viktrwlayer.c:6264 ../src/viktrwlayer.c:6346 +msgid "Append Track" +msgstr "" + +#: ../src/viktrwlayer.c:6265 +msgid "Select the route to append after the current route" +msgstr "" + +#: ../src/viktrwlayer.c:6266 +msgid "Select the track to append after the current track" +msgstr "" + +#: ../src/viktrwlayer.c:6347 +msgid "Select the track to append after the current route" +msgstr "" + +#: ../src/viktrwlayer.c:6348 +msgid "Select the route to append after the current track" +msgstr "" + +#: ../src/viktrwlayer.c:6414 +#, c-format +msgid "%d segment merged" +msgid_plural "%d segments merged" +msgstr[0] "" +msgstr[1] "" + +#: ../src/viktrwlayer.c:6430 +msgid "Failed. This track does not have timestamp" +msgstr "" + +#: ../src/viktrwlayer.c:6442 +msgid "Failed. No other track in this layer has timestamp" +msgstr "" + +#: ../src/viktrwlayer.c:6449 +msgid "Merge Threshold..." +msgstr "" + +#: ../src/viktrwlayer.c:6450 +msgid "Merge when time between tracks less than:" +msgstr "" + +#: ../src/viktrwlayer.c:6580 +msgid "Split Threshold..." +msgstr "" + +#: ../src/viktrwlayer.c:6581 +msgid "Split when time between trackpoints exceeds:" +msgstr "" + +#: ../src/viktrwlayer.c:6598 +#, c-format +msgid "" +"Can not split track due to trackpoints not ordered in time - such as at %s.\n" +"\n" +"Goto this trackpoint?" +msgstr "" + +#: ../src/viktrwlayer.c:6668 +msgid "Split Every Nth Point" +msgstr "" + +#: ../src/viktrwlayer.c:6669 +msgid "Split on every Nth point:" +msgstr "" + +#: ../src/viktrwlayer.c:6779 +msgid "Can not split track as it has no segments" +msgstr "" + +#: ../src/viktrwlayer.c:6861 ../src/viktrwlayer.c:6891 +#, c-format +msgid "Deleted %ld point" +msgid_plural "Deleted %ld points" +msgstr[0] "" +msgstr[1] "" + +#: ../src/viktrwlayer.c:6966 ../src/viktrwlayer.c:10989 +#: ../src/viktrwlayer_waypointlist.c:214 +#, c-format +msgid "Could not launch %s to open file." +msgstr "" + +#: ../src/viktrwlayer.c:6992 ../src/viktrwlayer.c:7113 +msgid "This track has no date information." +msgstr "" + +#: ../src/viktrwlayer.c:7006 ../src/viktrwlayer.c:7136 +msgid "This waypoint has no date information." +msgstr "" + +#: ../src/viktrwlayer.c:7030 +#, c-format +msgid "Could not launch %s" +msgstr "" + +#: ../src/viktrwlayer.c:7269 +msgid "Internal Error in vik_trw_layer_uniquify_tracks" +msgstr "" + +#: ../src/viktrwlayer.c:7374 ../src/viktrwlayer.c:7424 +#: ../src/viktrwlayer.c:7587 +msgid "" +"Multiple entries with the same name exist. This method only works with " +"unique names. Force unique names now?" +msgstr "" + +#: ../src/viktrwlayer.c:7385 +msgid "No tracks found" +msgstr "" + +#: ../src/viktrwlayer.c:7393 ../src/viktrwlayer.c:7443 +#: ../src/viktrwlayer.c:7607 +msgid "Delete Selection" +msgstr "" + +#: ../src/viktrwlayer.c:7394 +msgid "Select tracks to delete" +msgstr "" + +#: ../src/viktrwlayer.c:7435 +msgid "No routes found" +msgstr "" + +#: ../src/viktrwlayer.c:7444 +msgid "Select routes to delete" +msgstr "" + +#: ../src/viktrwlayer.c:7550 +msgid "Internal Error in vik_trw_layer_uniquify_waypoints" +msgstr "" + +#: ../src/viktrwlayer.c:7597 +msgid "No waypoints found" +msgstr "" + +#: ../src/viktrwlayer.c:7608 +msgid "Select waypoints to delete" +msgstr "" + +#: ../src/viktrwlayer.c:7691 +#, c-format +msgid "%ld waypoint deleted" +msgid_plural "%ld waypoints deleted" +msgstr[0] "" + +#: ../src/viktrwlayer.c:7697 +msgid "No duplicates found" +msgstr "" + +#: ../src/viktrwlayer.c:8028 +#, c-format +msgid "" +"A waypoint with the name \"%s\" already exists. Really rename to the same " +"name?" +msgstr "" + +#: ../src/viktrwlayer.c:8058 +#, c-format +msgid "" +"A track with the name \"%s\" already exists. Really rename to the same name?" +msgstr "" + +#: ../src/viktrwlayer.c:8095 +#, c-format +msgid "" +"A route with the name \"%s\" already exists. Really rename to the same name?" +msgstr "" + +#: ../src/viktrwlayer.c:8215 ../src/viktrwlayer.c:8602 +msgid "_Goto" +msgstr "" + +#: ../src/viktrwlayer.c:8226 +msgid "_Visit Geocache Webpage" +msgstr "" + +#: ../src/viktrwlayer.c:8235 +msgid "Geotag multiple images against this waypoint" +msgstr "" + +#: ../src/viktrwlayer.c:8245 ../src/viktrwlayer_waypointlist.c:352 +msgid "_Show Picture..." +msgstr "" + +#: ../src/viktrwlayer.c:8253 +msgid "Update Geotag on _Image" +msgstr "" + +#: ../src/viktrwlayer.c:8259 +msgid "_Update" +msgstr "" + +#: ../src/viktrwlayer.c:8264 +msgid "Update and _Keep File Timestamp" +msgstr "" + +#: ../src/viktrwlayer.c:8276 +msgid "Visit _Webpage" +msgstr "" + +#: ../src/viktrwlayer.c:8306 +msgid "_New Waypoint..." +msgstr "" + +#: ../src/viktrwlayer.c:8315 +msgid "_View All Waypoints" +msgstr "" + +#: ../src/viktrwlayer.c:8327 +msgid "Delete _All Waypoints" +msgstr "" + +#: ../src/viktrwlayer.c:8333 +msgid "_Delete Waypoints From Selection..." +msgstr "" + +#: ../src/viktrwlayer.c:8351 +msgid "_Show All Waypoints" +msgstr "" + +#: ../src/viktrwlayer.c:8357 +msgid "_Hide All Waypoints" +msgstr "" + +#: ../src/viktrwlayer.c:8369 +msgid "_List Waypoints..." +msgstr "" + +#: ../src/viktrwlayer.c:8390 +msgid "_View All Tracks" +msgstr "" + +#: ../src/viktrwlayer.c:8396 +msgid "_New Track" +msgstr "" + +#: ../src/viktrwlayer.c:8404 +msgid "Delete _All Tracks" +msgstr "" + +#: ../src/viktrwlayer.c:8410 +msgid "_Delete Tracks From Selection..." +msgstr "" + +#: ../src/viktrwlayer.c:8422 +msgid "_Show All Tracks" +msgstr "" + +#: ../src/viktrwlayer.c:8428 +msgid "_Hide All Tracks" +msgstr "" + +#: ../src/viktrwlayer.c:8439 +msgid "_List Tracks..." +msgstr "" + +#: ../src/viktrwlayer.c:8467 +msgid "_View All Routes" +msgstr "" + +#: ../src/viktrwlayer.c:8473 +msgid "_New Route" +msgstr "" + +#: ../src/viktrwlayer.c:8499 +msgid "_Show All Routes" +msgstr "" + +#: ../src/viktrwlayer.c:8505 +msgid "_Hide All Routes" +msgstr "" + +#: ../src/viktrwlayer.c:8516 +msgid "_List Routes..." +msgstr "" + +#: ../src/viktrwlayer.c:8587 +msgid "_View Track" +msgstr "" + +#: ../src/viktrwlayer.c:8589 +msgid "_View Route" +msgstr "" + +#: ../src/viktrwlayer.c:8608 +msgid "_Startpoint" +msgstr "" + +#: ../src/viktrwlayer.c:8614 +msgid "\"_Center\"" +msgstr "" + +#: ../src/viktrwlayer.c:8620 +msgid "_Endpoint" +msgstr "" + +#: ../src/viktrwlayer.c:8626 +msgid "_Highest Altitude" +msgstr "" + +#: ../src/viktrwlayer.c:8632 +msgid "_Lowest Altitude" +msgstr "" + +#: ../src/viktrwlayer.c:8640 +msgid "_Maximum Speed" +msgstr "" + +#: ../src/viktrwlayer.c:8646 +msgid "_Date" +msgstr "" + +#: ../src/viktrwlayer.c:8655 +msgid "Co_mbine" +msgstr "" + +#: ../src/viktrwlayer.c:8663 +msgid "_Merge By Time..." +msgstr "" + +#: ../src/viktrwlayer.c:8668 +msgid "Merge _Segments" +msgstr "" + +#: ../src/viktrwlayer.c:8675 +msgid "Merge _With Other Tracks..." +msgstr "" + +#: ../src/viktrwlayer.c:8682 +msgid "_Append Track..." +msgstr "" + +#: ../src/viktrwlayer.c:8684 +msgid "_Append Route..." +msgstr "" + +#: ../src/viktrwlayer.c:8690 +msgid "Append _Route..." +msgstr "" + +#: ../src/viktrwlayer.c:8692 +msgid "Append _Track..." +msgstr "" + +#: ../src/viktrwlayer.c:8699 +msgid "_Split" +msgstr "" + +#: ../src/viktrwlayer.c:8707 +msgid "_Split By Time..." +msgstr "" + +#. ATM always enable this entry - don't want to have to analyse the track before displaying the menu - to keep the menu speedy +#: ../src/viktrwlayer.c:8713 +msgid "Split Se_gments" +msgstr "" + +#: ../src/viktrwlayer.c:8719 +msgid "Split By _Number of Points..." +msgstr "" + +#: ../src/viktrwlayer.c:8724 +msgid "Split at _Trackpoint" +msgstr "" + +#: ../src/viktrwlayer.c:8732 +msgid "_Insert Points" +msgstr "" + +#: ../src/viktrwlayer.c:8738 +msgid "Insert Point _Before Selected Point" +msgstr "" + +#: ../src/viktrwlayer.c:8745 +msgid "Insert Point _After Selected Point" +msgstr "" + +#: ../src/viktrwlayer.c:8754 +msgid "Delete Poi_nts" +msgstr "" + +#: ../src/viktrwlayer.c:8760 +msgid "Delete _Selected Point" +msgstr "" + +#: ../src/viktrwlayer.c:8768 +msgid "Delete Points With The Same _Position" +msgstr "" + +#: ../src/viktrwlayer.c:8773 +msgid "Delete Points With The Same _Time" +msgstr "" + +#: ../src/viktrwlayer.c:8780 ../src/viktrwlayer.c:9029 +msgid "_Transform" +msgstr "" + +#: ../src/viktrwlayer.c:8788 ../src/viktrwlayer.c:9037 +msgid "_Apply DEM Data" +msgstr "" + +#: ../src/viktrwlayer.c:8793 ../src/viktrwlayer.c:9042 +msgid "_Overwrite" +msgstr "" + +#: ../src/viktrwlayer.c:8796 ../src/viktrwlayer.c:9045 +msgid "Overwrite any existing elevation values with DEM values" +msgstr "" + +#: ../src/viktrwlayer.c:8799 ../src/viktrwlayer.c:9048 +msgid "_Keep Existing" +msgstr "" + +#: ../src/viktrwlayer.c:8802 ../src/viktrwlayer.c:9051 +msgid "Keep existing elevation values, only attempt for missing values" +msgstr "" + +#: ../src/viktrwlayer.c:8807 +msgid "_Smooth Missing Elevation Data" +msgstr "" + +#: ../src/viktrwlayer.c:8812 +msgid "_Interpolated" +msgstr "" + +#: ../src/viktrwlayer.c:8815 +msgid "" +"Interpolate between known elevation values to derive values for the missing " +"elevations" +msgstr "" + +#: ../src/viktrwlayer.c:8818 +msgid "_Flat" +msgstr "" + +#: ../src/viktrwlayer.c:8821 +msgid "Set unknown elevation values to the last known value" +msgstr "" + +#: ../src/viktrwlayer.c:8825 +msgid "C_onvert to a Route" +msgstr "" + +#: ../src/viktrwlayer.c:8827 +msgid "C_onvert to a Track" +msgstr "" + +#: ../src/viktrwlayer.c:8835 +msgid "_Anonymize Times" +msgstr "" + +#: ../src/viktrwlayer.c:8838 +msgid "Shift timestamps to a relative offset from 1901-01-01" +msgstr "" + +#: ../src/viktrwlayer.c:8841 +msgid "_Interpolate Times" +msgstr "" + +#: ../src/viktrwlayer.c:8844 +msgid "" +"Reset trackpoint timestamps between the first and last points such that " +"track is traveled at equal speed" +msgstr "" + +#: ../src/viktrwlayer.c:8849 +msgid "_Reverse Track" +msgstr "" + +#: ../src/viktrwlayer.c:8851 +msgid "_Reverse Route" +msgstr "" + +#: ../src/viktrwlayer.c:8858 +msgid "Refine Route..." +msgstr "" + +#: ../src/viktrwlayer.c:8868 +msgid "Down_load Maps Along Track..." +msgstr "" + +#: ../src/viktrwlayer.c:8870 +msgid "Down_load Maps Along Route..." +msgstr "" + +#: ../src/viktrwlayer.c:8878 +msgid "_Export Track as GPX..." +msgstr "" + +#: ../src/viktrwlayer.c:8880 +msgid "_Export Route as GPX..." +msgstr "" + +#: ../src/viktrwlayer.c:8887 +msgid "E_xtend Track End" +msgstr "" + +#: ../src/viktrwlayer.c:8889 +msgid "E_xtend Route End" +msgstr "" + +#: ../src/viktrwlayer.c:8896 +msgid "Extend _Using Route Finder" +msgstr "" + +#: ../src/viktrwlayer.c:8911 +msgid "_Upload to GPS..." +msgstr "" + +#: ../src/viktrwlayer.c:8926 +msgid "_Diary" +msgstr "" + +#: ../src/viktrwlayer.c:8930 +msgid "Open diary program at this date" +msgstr "" + +#: ../src/viktrwlayer.c:8935 +msgid "_Astronomy" +msgstr "" + +#: ../src/viktrwlayer.c:8938 +msgid "Open astronomy program at this date and location" +msgstr "" + +#: ../src/viktrwlayer.c:8962 +msgid "_View Google Directions" +msgstr "" + +#: ../src/viktrwlayer.c:8984 +msgid "Use with _Filter" +msgstr "" + +#: ../src/viktrwlayer.c:9018 +msgid "_Edit Trackpoint" +msgstr "" + +#: ../src/viktrwlayer.c:10116 +#, c-format +msgid " - Gain %dm:Loss %dm" +msgstr "" + +#: ../src/viktrwlayer.c:10118 +#, c-format +msgid " - Gain %dft:Loss %dft" +msgstr "" + +#: ../src/viktrwlayer.c:10123 +#, c-format +msgid " - Bearing %3.1f° - Step %s" +msgstr "" + +#: ../src/viktrwlayer.c:10232 +#, c-format +msgid "Querying %s for route between (%.3f, %.3f) and (%.3f, %.3f)." +msgstr "" + +#: ../src/viktrwlayer.c:10248 +#, c-format +msgid "%s returned route between (%.3f, %.3f) and (%.3f, %.3f)." +msgstr "" + +#: ../src/viktrwlayer.c:10251 +#, c-format +msgid "Error getting route from %s." +msgstr "" + +#: ../src/viktrwlayer.c:11070 +#, c-format +msgid "Creating %d Image Thumbnails..." +msgstr "" + +#: ../src/viktrwlayer.c:11560 +msgid "No map layer in use. Create one first" +msgstr "" + +#: ../src/viktrwlayer.c:11679 +#, c-format +msgid "%s: Track List" +msgstr "" + +#: ../src/viktrwlayer.c:11681 +#, c-format +msgid "%s: Route List" +msgstr "" + +#: ../src/viktrwlayer.c:11734 +#, c-format +msgid "" +"Could not write external layer %s to %s, please fix and save before exiting " +"or data will be lost" +msgstr "" + +#: ../src/viktrwlayer.c:11782 +#, c-format +msgid "WARNING: issues encountered loading external layer %s from %s" +msgstr "" + +#: ../src/viktrwlayer_export.c:47 +msgid "Auto Device GPX Simplify:" +msgstr "" + +#: ../src/viktrwlayer_export.c:48 +msgid "" +"GPX saves to certain devices will be simplified for device compatibility." +msgstr "" + +#: ../src/viktrwlayer_export.c:125 +#, c-format +msgid "Export of GPX file simplified using point limit: %d" +msgstr "" + +#: ../src/viktrwlayer_export.c:206 ../src/viktrwlayer_export.c:323 +#: ../src/vikwindow.c:3694 +msgid "The filename you requested could not be opened for writing." +msgstr "" + +#: ../src/viktrwlayer_export.c:226 +#, c-format +msgid "Could not launch %s." +msgstr "" + +#: ../src/viktrwlayer_export.c:234 +msgid "Could not create temporary file for export." +msgstr "" + +#: ../src/viktrwlayer_export.c:268 +msgid "File format:" +msgstr "" + +#: ../src/viktrwlayer_export.c:276 +msgid "Select the file format." +msgstr "" + +#: ../src/viktrwlayer_export.c:281 +msgid "" +"Select the information to process.\n" +"Warning: the behavior of these switches is highly dependent of the file " +"format selected.\n" +"Please, refer to GPSbabel if unsure." +msgstr "" + +#: ../src/viktrwlayer_export.c:308 +msgid "You did not select a valid file format." +msgstr "" + +#: ../src/viktrwlayer_propwin.c:915 ../src/viktrwlayer_propwin.c:3381 +#: ../src/viktrwlayer_propwin.c:3417 ../src/viktrwlayer_propwin.c:3457 +#: ../src/viktrwlayer_propwin.c:3509 ../src/viktrwlayer_propwin.c:3527 +#: ../src/viktrwlayer_propwin.c:3600 ../src/viktrwlayer_propwin.c:3601 +#: ../src/viktrwlayer_propwin.c:3602 ../src/viktrwlayer_propwin.c:3611 +#: ../src/viktrwlayer_propwin.c:3612 ../src/viktrwlayer_propwin.c:3629 +#: ../src/viktrwlayer_propwin.c:3630 ../src/viktrwlayer_propwin.c:3644 +#: ../src/viktrwlayer_propwin.c:3645 ../src/viktrwlayer_propwin.c:3646 +#: ../src/viktrwlayer_propwin.c:3660 ../src/viktrwlayer_propwin.c:3661 +#: ../src/viktrwlayer_propwin.c:3662 ../src/viktrwlayer_propwin.c:3676 +#: ../src/viktrwlayer_propwin.c:3677 ../src/viktrwlayer_propwin.c:3678 +#: ../src/viktrwlayer_propwin.c:3695 ../src/viktrwlayer_propwin.c:3696 +#: ../src/viktrwlayer_analysis.c:293 +#, c-format +msgid "No Data" +msgstr "没有資料" + +#: ../src/viktrwlayer_propwin.c:960 ../src/viktrwlayer_propwin.c:1245 +#, c-format +msgid "%.1f kph" +msgstr "" + +#: ../src/viktrwlayer_propwin.c:963 ../src/viktrwlayer_propwin.c:1248 +#: ../src/viktrwlayer_analysis.c:352 +#, c-format +msgid "%.1f mph" +msgstr "" + +#: ../src/viktrwlayer_propwin.c:966 ../src/viktrwlayer_propwin.c:1251 +#, c-format +msgid "%.1f knots" +msgstr "" + +#: ../src/viktrwlayer_propwin.c:969 ../src/viktrwlayer_propwin.c:1254 +#, c-format +msgid "%.1f s/km" +msgstr "" + +#: ../src/viktrwlayer_propwin.c:972 ../src/viktrwlayer_propwin.c:1257 +#: ../src/viktrwlayer_analysis.c:389 ../src/viktrwlayer_analysis.c:392 +#, fuzzy, c-format +msgid "%.1f min/km" +msgstr "1 分鐘" + +#: ../src/viktrwlayer_propwin.c:975 ../src/viktrwlayer_propwin.c:1260 +#, c-format +msgid "%.1f sec/mi" +msgstr "" + +#: ../src/viktrwlayer_propwin.c:978 ../src/viktrwlayer_propwin.c:1263 +#: ../src/viktrwlayer_analysis.c:409 ../src/viktrwlayer_analysis.c:412 +#, fuzzy, c-format +msgid "%.1f min/mi" +msgstr "1 分鐘" + +#. VIK_UNITS_SPEED_METRES_PER_SECOND: +#: ../src/viktrwlayer_propwin.c:982 ../src/viktrwlayer_propwin.c:1267 +#, c-format +msgid "%.1f m/s" +msgstr "" + +#. Minutes +#: ../src/viktrwlayer_propwin.c:1411 +msgid "mins" +msgstr "" + +#. Hours +#: ../src/viktrwlayer_propwin.c:1418 +msgid "h" +msgstr "" + +#. Days +#: ../src/viktrwlayer_propwin.c:1424 +msgid "d" +msgstr "" + +#. Weeks +#: ../src/viktrwlayer_propwin.c:1429 +msgid "w" +msgstr "" + +#. 'Months' +#: ../src/viktrwlayer_propwin.c:1433 +msgid "M" +msgstr "" + +#: ../src/viktrwlayer_propwin.c:2051 ../src/viktrwlayer_analysis.c:303 +#, c-format +msgid "%.1f miles" +msgstr "" + +#: ../src/viktrwlayer_propwin.c:2054 ../src/viktrwlayer_analysis.c:306 +#, c-format +msgid "%.1f NM" +msgstr "" + +#. VIK_UNITS_DISTANCE_KILOMETRES +#: ../src/viktrwlayer_propwin.c:2057 ../src/viktrwlayer_analysis.c:310 +#, c-format +msgid "%.1f km" +msgstr "" + +#: ../src/viktrwlayer_propwin.c:3083 +msgid "Failed spliting track. Track unchanged" +msgstr "" + +#: ../src/viktrwlayer_propwin.c:3234 ../src/viktrwlayer_propwin.c:3744 +#, c-format +msgid "%s - Track Properties" +msgstr "" + +#: ../src/viktrwlayer_propwin.c:3239 +msgid "Split at _Marker" +msgstr "" + +#: ../src/viktrwlayer_propwin.c:3240 +msgid "Split _Segments" +msgstr "" + +#: ../src/viktrwlayer_propwin.c:3241 +msgid "_Reverse" +msgstr "" + +#: ../src/viktrwlayer_propwin.c:3242 +msgid "_Delete Dupl." +msgstr "" + +#: ../src/viktrwlayer_propwin.c:3269 +msgid "Comment:" +msgstr "説明:" + +#: ../src/viktrwlayer_propwin.c:3270 +msgid "Description:" +msgstr "" + +#: ../src/viktrwlayer_propwin.c:3271 +#, fuzzy +msgid "Source:" +msgstr "開始:" + +#: ../src/viktrwlayer_propwin.c:3272 +#, fuzzy +msgid "Type:" +msgstr "時間 :" + +#: ../src/viktrwlayer_propwin.c:3273 +msgid "Color:" +msgstr "" + +#: ../src/viktrwlayer_propwin.c:3274 +msgid "Draw Name:" +msgstr "" + +#: ../src/viktrwlayer_propwin.c:3275 +msgid "Distance Labels:" +msgstr "" + +#: ../src/viktrwlayer_propwin.c:3278 +msgid "Track Length:" +msgstr "" + +#: ../src/viktrwlayer_propwin.c:3279 +msgid "Trackpoints:" +msgstr "" + +#: ../src/viktrwlayer_propwin.c:3280 +msgid "Segments:" +msgstr "" + +#: ../src/viktrwlayer_propwin.c:3281 +msgid "Duplicate Points:" +msgstr "" + +#: ../src/viktrwlayer_propwin.c:3282 +msgid "Max Speed:" +msgstr "最大速度:" + +#: ../src/viktrwlayer_propwin.c:3283 +msgid "Avg. Speed:" +msgstr "平均速度:" + +#: ../src/viktrwlayer_propwin.c:3284 +msgid "Moving Avg. Speed:" +msgstr "" + +#: ../src/viktrwlayer_propwin.c:3285 +msgid "Avg. Dist. Between TPs:" +msgstr "" + +#: ../src/viktrwlayer_propwin.c:3286 +msgid "Elevation Range:" +msgstr "高度範圍:" + +#: ../src/viktrwlayer_propwin.c:3287 +msgid "Total Elevation Gain/Loss:" +msgstr "" + +#: ../src/viktrwlayer_propwin.c:3288 +msgid "Start:" +msgstr "開始:" + +#: ../src/viktrwlayer_propwin.c:3289 +msgid "End:" +msgstr "結束:" + +#: ../src/viktrwlayer_propwin.c:3290 +msgid "Duration:" +msgstr "持續時間:" + +#: ../src/viktrwlayer_propwin.c:3320 +msgid "Centre" +msgstr "" + +#: ../src/viktrwlayer_propwin.c:3321 +msgid "Start only" +msgstr "" + +#: ../src/viktrwlayer_propwin.c:3322 +msgid "End only" +msgstr "" + +#: ../src/viktrwlayer_propwin.c:3323 +msgid "Start and End" +msgstr "" + +#: ../src/viktrwlayer_propwin.c:3324 +msgid "Centre, Start and End" +msgstr "" + +#: ../src/viktrwlayer_propwin.c:3336 +msgid "Maximum number of distance labels to be shown" +msgstr "" + +#: ../src/viktrwlayer_propwin.c:3340 +msgid "Properties" +msgstr "" + +#: ../src/viktrwlayer_propwin.c:3584 +#, c-format +msgid "%d minutes - %d minutes moving" +msgstr "" + +#: ../src/viktrwlayer_propwin.c:3596 +#, c-format +msgid "%s total - %s in segments" +msgstr "" + +#: ../src/viktrwlayer_propwin.c:3607 ../src/viktrwlayer_analysis.c:622 +msgid "Statistics" +msgstr "" + +#: ../src/viktrwlayer_propwin.c:3613 ../src/viktrwlayer_propwin.c:3680 +msgid "Show D_EM" +msgstr "" + +#: ../src/viktrwlayer_propwin.c:3615 ../src/viktrwlayer_propwin.c:3631 +#: ../src/viktrwlayer_propwin.c:3647 ../src/viktrwlayer_propwin.c:3697 +msgid "Show _GPS Speed" +msgstr "" + +#: ../src/viktrwlayer_propwin.c:3617 ../src/viktrwlayer_propwin.c:3633 +#: ../src/viktrwlayer_propwin.c:3665 ../src/viktrwlayer_propwin.c:3699 +msgid "Track Distance:" +msgstr "" + +#: ../src/viktrwlayer_propwin.c:3618 ../src/viktrwlayer_propwin.c:3684 +msgid "Track Height:" +msgstr "" + +#: ../src/viktrwlayer_propwin.c:3624 +msgid "Elevation-distance" +msgstr "高度-距離" + +#: ../src/viktrwlayer_propwin.c:3634 +msgid "Track Gradient:" +msgstr "" + +#: ../src/viktrwlayer_propwin.c:3639 +msgid "Gradient-distance" +msgstr "" + +#: ../src/viktrwlayer_propwin.c:3649 ../src/viktrwlayer_propwin.c:3666 +#: ../src/viktrwlayer_propwin.c:3683 +msgid "Track Time:" +msgstr "" + +#: ../src/viktrwlayer_propwin.c:3650 ../src/viktrwlayer_propwin.c:3700 +msgid "Track Speed:" +msgstr "" + +#: ../src/viktrwlayer_propwin.c:3651 ../src/viktrwlayer_propwin.c:3667 +#: ../src/viktrwlayer_propwin.c:3685 +msgid "Time/Date:" +msgstr "" + +#: ../src/viktrwlayer_propwin.c:3655 +msgid "Speed-time" +msgstr "速度-時間" + +#: ../src/viktrwlayer_propwin.c:3663 ../src/viktrwlayer_propwin.c:3679 +msgid "Show S_peed" +msgstr "" + +#: ../src/viktrwlayer_propwin.c:3671 +msgid "Distance-time" +msgstr "" + +#: ../src/viktrwlayer_propwin.c:3690 +msgid "Elevation-time" +msgstr "" + +#: ../src/viktrwlayer_propwin.c:3705 +msgid "Speed-distance" +msgstr "" + +#: ../src/viktrwlayer_tpwin.c:190 ../src/viktrwlayer_wpwin.c:66 +msgid "Date/Time Edit" +msgstr "" + +#: ../src/viktrwlayer_tpwin.c:242 +msgid "Name:" +msgstr "" + +#: ../src/viktrwlayer_tpwin.c:243 +msgid "Latitude:" +msgstr "緯度 :" + +#: ../src/viktrwlayer_tpwin.c:244 +msgid "Longitude:" +msgstr "經度 :" + +#: ../src/viktrwlayer_tpwin.c:245 +msgid "Altitude:" +msgstr "高度 :" + +#: ../src/viktrwlayer_tpwin.c:246 +msgid "Course:" +msgstr "" + +#: ../src/viktrwlayer_tpwin.c:247 +msgid "Timestamp:" +msgstr "" + +#: ../src/viktrwlayer_tpwin.c:248 +msgid "Time:" +msgstr "時間 :" + +#: ../src/viktrwlayer_tpwin.c:249 +msgid "Distance Difference:" +msgstr "" + +#: ../src/viktrwlayer_tpwin.c:250 +msgid "Time Difference:" +msgstr "" + +#: ../src/viktrwlayer_tpwin.c:251 +msgid "\"Speed\" Between:" +msgstr "" + +#: ../src/viktrwlayer_tpwin.c:252 +msgid "Speed:" +msgstr "" + +#: ../src/viktrwlayer_tpwin.c:253 +msgid "VDOP:" +msgstr "" + +#: ../src/viktrwlayer_tpwin.c:254 +msgid "HDOP:" +msgstr "" + +#: ../src/viktrwlayer_tpwin.c:255 +msgid "PDOP:" +msgstr "" + +#: ../src/viktrwlayer_tpwin.c:256 +msgid "SAT/FIX:" +msgstr "" + +#: ../src/viktrwlayer_tpwin.c:263 ../src/viktrwlayer_tpwin.c:408 +#: ../src/viktrwlayer_tpwin.c:622 +msgid "Trackpoint" +msgstr "" + +#: ../src/viktrwlayer_tpwin.c:266 +msgid "_Insert After" +msgstr "" + +#: ../src/viktrwlayer_tpwin.c:268 +msgid "Split Here" +msgstr "" + +#: ../src/viktrwlayer_tracklist.c:262 ../src/viktrwlayer_waypointlist.c:306 +msgid "_Copy Data" +msgstr "" + +#. +#. item = gtk_image_menu_item_new_with_mnemonic ( _("_Select") ); +#. gtk_image_menu_item_set_image ( (GtkImageMenuItem*)item, gtk_image_new_from_stock (GTK_STOCK_FIND, GTK_ICON_SIZE_MENU) ); +#. g_signal_connect_swapped ( G_OBJECT(item), "activate", G_CALLBACK(trw_layer_track_select), values ); +#. gtk_menu_shell_append (GTK_MENU_SHELL (menu), item); +#. gtk_widget_show ( item ); +#. +#. ATM view auto selects, so don't bother with separate select menu entry +#. +#. item = gtk_image_menu_item_new_with_mnemonic ( _("_Select") ); +#. gtk_image_menu_item_set_image ( (GtkImageMenuItem*)item, gtk_image_new_from_stock (GTK_STOCK_FIND, GTK_ICON_SIZE_MENU) ); +#. g_signal_connect_swapped ( G_OBJECT(item), "activate", G_CALLBACK(trw_layer_waypoint_select), values ); +#. gtk_menu_shell_append (GTK_MENU_SHELL (menu), item); +#. gtk_widget_show ( item ); +#. +#. AUTO SELECT NOT TRUE YET... +#. ATM view auto selects, so don't bother with separate select menu entry +#: ../src/viktrwlayer_tracklist.c:290 ../src/viktrwlayer_waypointlist.c:341 +#: ../src/vikwindow.c:4816 +msgid "_View" +msgstr "_V 檢視" + +#. Insert column for the layer name when viewing multi layers +#: ../src/viktrwlayer_tracklist.c:613 ../src/viktrwlayer_waypointlist.c:609 +msgid "Layer" +msgstr "" + +#: ../src/viktrwlayer_tracklist.c:627 ../src/viktrwlayer_waypointlist.c:624 +msgid "Date" +msgstr "" + +#: ../src/viktrwlayer_tracklist.c:631 ../src/viktrwlayer_waypointlist.c:628 +msgid "Visible" +msgstr "" + +#: ../src/viktrwlayer_tracklist.c:639 +msgid "" +"Distance\n" +"(miles)" +msgstr "" + +#: ../src/viktrwlayer_tracklist.c:642 +msgid "" +"Distance\n" +"(NM)" +msgstr "" + +#: ../src/viktrwlayer_tracklist.c:645 +msgid "" +"Distance\n" +"(km)" +msgstr "" + +#: ../src/viktrwlayer_tracklist.c:651 +msgid "" +"Length\n" +"(minutes)" +msgstr "" + +#: ../src/viktrwlayer_tracklist.c:660 ../src/vikutils.c:93 +msgid "sec/mi" +msgstr "" + +#: ../src/viktrwlayer_tracklist.c:666 +#, c-format +msgid "" +"Av. Speed\n" +"(%s)" +msgstr "" + +#. Apply own formatting of the data +#: ../src/viktrwlayer_tracklist.c:671 +#, c-format +msgid "" +"Max Speed\n" +"(%s)" +msgstr "" + +#: ../src/viktrwlayer_tracklist.c:679 ../src/viktrwlayer_waypointlist.c:637 +msgid "" +"Max Height\n" +"(Feet)" +msgstr "" + +#: ../src/viktrwlayer_tracklist.c:681 ../src/viktrwlayer_waypointlist.c:639 +msgid "" +"Max Height\n" +"(Metres)" +msgstr "" + +#: ../src/viktrwlayer_waypointlist.c:312 +msgid "Copy Data (with _positions)" +msgstr "" + +#: ../src/viktrwlayer_waypointlist.c:633 +msgid "Comment" +msgstr "" + +#: ../src/viktrwlayer_waypointlist.c:643 +msgid "Symbol" +msgstr "" + +#: ../src/viktrwlayer_wpwin.c:93 ../src/viktrwlayer_wpwin.c:302 +msgid "True" +msgstr "" + +#: ../src/viktrwlayer_wpwin.c:122 +msgid "Waypoint Properties" +msgstr "" + +#: ../src/viktrwlayer_wpwin.c:164 +msgid "Name:" +msgstr "名稱:" + +#: ../src/viktrwlayer_wpwin.c:181 +msgid "Altitude:" +msgstr "海拔:" + +#: ../src/viktrwlayer_wpwin.c:186 ../src/viktrwlayer_wpwin.c:188 +msgid "Comment:" +msgstr "註釋:" + +#: ../src/viktrwlayer_wpwin.c:202 +#, fuzzy +msgid "Source:" +msgstr "下載源:" + +#: ../src/viktrwlayer_wpwin.c:212 +msgid "Image:" +msgstr "圖片:" + +#: ../src/viktrwlayer_wpwin.c:217 +msgid "Symbol:" +msgstr "象徵式:" + +#: ../src/viktrwlayer_wpwin.c:226 +msgid "(none)" +msgstr "(無)" + +#. Geotag Info [readonly] +#: ../src/viktrwlayer_wpwin.c:272 +msgid "Has Geotag" +msgstr "" + +#: ../src/viktrwlayer_wpwin.c:279 +msgid "Consistent Position" +msgstr "" + +#. ATM the direction value box is always shown, even when there is no information. +#. It would be nice to be able to hide it until the 'Add' has been performed, +#. however I've not been able to achieve this. +#. Thus simply sensistizing it instead. +#: ../src/viktrwlayer_wpwin.c:292 +#, fuzzy +msgid "Image Direction:" +msgstr "影像設定" + +#: ../src/viktrwlayer_wpwin.c:300 +msgid "Magnetic" +msgstr "" + +#: ../src/viktrwlayer_wpwin.c:320 +msgid "Time:" +msgstr "時間:" + +#. TODO: other checks (isalpha or whatever ) +#: ../src/viktrwlayer_wpwin.c:386 +msgid "Please enter a name for the waypoint." +msgstr "請為該航點匯入一個名字." + +#: ../src/viktrwlayer_geotag.c:320 ../src/viktrwlayer_geotag.c:460 +#, c-format +msgid "Failed updating EXIF on %s" +msgstr "" + +#: ../src/viktrwlayer_geotag.c:562 +#, c-format +msgid "Geotagging %d Images..." +msgstr "" + +#: ../src/viktrwlayer_geotag.c:630 +msgid "Geotag Images" +msgstr "" + +#: ../src/viktrwlayer_geotag.c:640 +msgid "Images" +msgstr "" + +#: ../src/viktrwlayer_geotag.c:645 +msgid "Overwrite Existing Waypoints:" +msgstr "" + +#: ../src/viktrwlayer_geotag.c:648 +msgid "Overwrite Existing GPS Information:" +msgstr "" + +#: ../src/viktrwlayer_geotag.c:650 +msgid "Keep File Modification Timestamp:" +msgstr "" + +#: ../src/viktrwlayer_geotag.c:684 +msgid "Create Waypoints:" +msgstr "" + +#: ../src/viktrwlayer_geotag.c:693 +msgid "Write EXIF:" +msgstr "" + +#: ../src/viktrwlayer_geotag.c:705 +msgid "Automatic Image Direction:" +msgstr "" + +#: ../src/viktrwlayer_geotag.c:707 +msgid "Set image direction based on a heading derived from the track" +msgstr "" + +#: ../src/viktrwlayer_geotag.c:710 +msgid "Interpolate Between Track Segments:" +msgstr "" + +#: ../src/viktrwlayer_geotag.c:715 +msgid "Image Time Offset (Seconds):" +msgstr "" + +#: ../src/viktrwlayer_geotag.c:718 +msgid "" +"The number of seconds to ADD to the photos time to make it match the GPS " +"data. Calculate this with (GPS - Photo). Can be negative or positive. Useful " +"to adjust times when a camera's timestamp was incorrect." +msgstr "" + +#: ../src/viktrwlayer_geotag.c:721 +msgid "Image Timezone:" +msgstr "" + +#: ../src/viktrwlayer_geotag.c:724 +msgid "" +"The timezone that was used when the images were created. For example, if a " +"camera is set to AWST or +8:00 hours. Enter +8:00 here so that the correct " +"adjustment to the images' time can be made. GPS data is always in UTC." +msgstr "" + +#: ../src/viktrwlayer_geotag.c:728 +#, c-format +msgid "Using waypoint: %s" +msgstr "" + +#: ../src/viktrwlayer_geotag.c:742 +#, c-format +msgid "Using track: %s" +msgstr "" + +#: ../src/viktrwlayer_geotag.c:744 +#, c-format +msgid "Using all tracks in: %s" +msgstr "" + +#: ../src/viktrwlayer_analysis.c:214 +msgid "Number of Tracks" +msgstr "" + +#: ../src/viktrwlayer_analysis.c:215 +msgid "Date Range" +msgstr "" + +#: ../src/viktrwlayer_analysis.c:216 +msgid "Total Length" +msgstr "" + +#: ../src/viktrwlayer_analysis.c:217 +msgid "Average Length" +msgstr "" + +#: ../src/viktrwlayer_analysis.c:218 +msgid "Eddington number" +msgstr "" + +#. No.4: Extended display only +#: ../src/viktrwlayer_analysis.c:219 +msgid "Max Speed" +msgstr "" + +#: ../src/viktrwlayer_analysis.c:220 +msgid "Avg. Speed" +msgstr "" + +#: ../src/viktrwlayer_analysis.c:221 +msgid "Minimum Altitude" +msgstr "" + +#: ../src/viktrwlayer_analysis.c:222 +msgid "Maximum Altitude" +msgstr "" + +#: ../src/viktrwlayer_analysis.c:223 +msgid "Total Elevation Gain/Loss" +msgstr "" + +#: ../src/viktrwlayer_analysis.c:224 +msgid "Avg. Elevation Gain/Loss" +msgstr "" + +#: ../src/viktrwlayer_analysis.c:225 +msgid "Total Duration" +msgstr "" + +#: ../src/viktrwlayer_analysis.c:226 +msgid "Avg. Duration" +msgstr "" + +#: ../src/viktrwlayer_analysis.c:317 +#, c-format +msgid "%.2f miles" +msgstr "" + +#: ../src/viktrwlayer_analysis.c:320 +#, c-format +msgid "%.2f NM" +msgstr "" + +#. VIK_UNITS_DISTANCE_KILOMETRES +#: ../src/viktrwlayer_analysis.c:324 +#, c-format +msgid "%.2f km" +msgstr "" + +#: ../src/viktrwlayer_analysis.c:361 +#, c-format +msgid "%.2f m/s" +msgstr "" + +#: ../src/viktrwlayer_analysis.c:370 ../src/viktrwlayer_analysis.c:373 +#, c-format +msgid "%.2f knots" +msgstr "" + +#: ../src/viktrwlayer_analysis.c:379 ../src/viktrwlayer_analysis.c:382 +#, c-format +msgid "%d s/km" +msgstr "" + +#: ../src/viktrwlayer_analysis.c:399 ../src/viktrwlayer_analysis.c:402 +#, c-format +msgid "%d sec/mi" +msgstr "" + +#: ../src/viktrwlayer_analysis.c:420 ../src/viktrwlayer_analysis.c:423 +#, c-format +msgid "%.2f km/h" +msgstr "" + +#: ../src/viktrwlayer_analysis.c:434 ../src/viktrwlayer_analysis.c:440 +#, c-format +msgid "%d feet" +msgstr "" + +#: ../src/viktrwlayer_analysis.c:445 ../src/viktrwlayer_analysis.c:447 +#, c-format +msgid "%d feet / %d feet" +msgstr "" + +#: ../src/viktrwlayer_analysis.c:452 ../src/viktrwlayer_analysis.c:458 +#, c-format +msgid "%d m" +msgstr "" + +#: ../src/viktrwlayer_analysis.c:463 ../src/viktrwlayer_analysis.c:465 +#, c-format +msgid "%d m / %d m" +msgstr "" + +#: ../src/viktrwlayer_analysis.c:477 +#, c-format +msgid "%d:%02d:%02d days:hrs:mins" +msgstr "" + +#: ../src/viktrwlayer_analysis.c:484 +#, c-format +msgid "%d:%02d hrs:mins" +msgstr "" + +#: ../src/viktrwlayer_analysis.c:658 +msgid "Include Invisible Items" +msgstr "" + +#: ../src/vikstatus.c:129 +msgid "Current number of background tasks. Click to see the background jobs." +msgstr "" + +#: ../src/vikstatus.c:134 +msgid "Current zoom level. Click to select a new one." +msgstr "" + +#: ../src/vikstatus.c:141 +msgid "Left click to clear the message. Right click to copy the message." +msgstr "" + +#: ../src/vikutils.c:108 +msgid "GPSD" +msgstr "" + +#. GPS Preamble +#: ../src/vikutils.c:109 +msgid "Trkpt" +msgstr "" + +#: ../src/vikutils.c:160 +#, c-format +msgid "%sSpeed%s %.1f%s" +msgstr "" + +#. Go for 2dp as expect low values for vertical speeds +#: ../src/vikutils.c:214 +#, c-format +msgid "%sClimb%s %.2f%s" +msgstr "" + +#: ../src/vikutils.c:223 +#, c-format +msgid "%sAlt %dfeet" +msgstr "" + +#. VIK_UNITS_HEIGHT_METRES: +#: ../src/vikutils.c:227 +#, c-format +msgid "%sAlt %dm" +msgstr "" + +#: ../src/vikutils.c:235 +#, c-format +msgid "%sCourse %03d°" +msgstr "" + +#: ../src/vikutils.c:249 +msgid "yards" +msgstr "" + +#. VIK_UNITS_DISTANCE_KILOMETRES: +#: ../src/vikutils.c:253 +msgid "m" +msgstr "" + +#: ../src/vikutils.c:257 +#, c-format +msgid "%sDistance diff %d%s" +msgstr "" + +#: ../src/vikutils.c:272 +#, c-format +msgid "%sTime %s" +msgstr "" + +#: ../src/vikutils.c:281 +#, c-format +msgid "%sTime diff %lds" +msgstr "" + +#: ../src/vikutils.c:287 +#, c-format +msgid "%sNo. of Sats %d" +msgstr "" + +#: ../src/vikutils.c:312 +#, c-format +msgid "%sTo End %.2f%s" +msgstr "" + +#: ../src/vikutils.c:339 +#, c-format +msgid "%sDistance along %.2f%s" +msgstr "" + +#: ../src/vikutils.c:359 +#, c-format +msgid "%sTrack: %s" +msgstr "" + +#: ../src/vikutils.c:396 +#, c-format +msgid "" +"There is a newer version of Viking available: %s\n" +"\n" +"Do you wish to go to Viking's website now?" +msgstr "" + +#: ../src/vikutils.c:526 +msgid "" +"This appears to be Viking's very first run.\n" +"\n" +"Do you wish to enable automatic internet features?\n" +"\n" +"Individual settings can be controlled in the Preferences." +msgstr "" + +#: ../src/vikwaypoint.c:37 +msgid "Waypoint" +msgstr "" + +#: ../src/vikwebtool_datasource.c:352 +msgid "Search Term" +msgstr "" + +#. TODO get rid of this as this is unnecessary duplication... +#: ../src/vikwindow.c:258 +msgid "Pan" +msgstr "移動" + +#: ../src/vikwindow.c:258 +msgid "Zoom" +msgstr "縮放" + +#: ../src/vikwindow.c:258 +msgid "Ruler" +msgstr "測距" + +#: ../src/vikwindow.c:258 +msgid "Select" +msgstr "" + +#: ../src/vikwindow.c:368 +msgid "This is Viking " +msgstr "" + +#: ../src/vikwindow.c:457 +msgid "Location lookup aborted" +msgstr "" + +#: ../src/vikwindow.c:477 +#, c-format +msgid "Location found: %s" +msgstr "" + +#: ../src/vikwindow.c:486 +msgid "Unable to determine location" +msgstr "" + +#: ../src/vikwindow.c:495 +msgid "Determining location" +msgstr "" + +#: ../src/vikwindow.c:525 +#, c-format +msgid "Location found via geoclue" +msgstr "" + +#: ../src/vikwindow.c:546 +msgid "Default Map" +msgstr "" + +#: ../src/vikwindow.c:557 ../src/vikwindow.c:3938 +msgid "Trying to determine location..." +msgstr "" + +#. Create tooltip +#: ../src/vikwindow.c:723 +msgid "Select zoom level" +msgstr "" + +#: ../src/vikwindow.c:1176 +#, c-format +msgid "" +"Do you want to save the changes you made to the document \"%s\"?\n" +"\n" +"Your changes will be lost if you don't save them." +msgstr "" + +#: ../src/vikwindow.c:1180 +msgid "Don't Save" +msgstr "不儲存" + +#: ../src/vikwindow.c:1268 +msgid "mpp" +msgstr "mpp" + +#: ../src/vikwindow.c:1268 +msgid "pixelfact" +msgstr "pixelfact" + +#: ../src/vikwindow.c:1467 +#, c-format +msgid "%s %s %dm" +msgstr "" + +#: ../src/vikwindow.c:1469 +#, c-format +msgid "%s %s %dft" +msgstr "" + +#: ../src/vikwindow.c:1472 +#, c-format +msgid "%s %s" +msgstr "" + +#: ../src/vikwindow.c:1929 +msgid "_Ruler" +msgstr "_R 測距" + +#: ../src/vikwindow.c:1929 +msgid "Ruler Tool" +msgstr "測距工具" + +#: ../src/vikwindow.c:2204 ../src/vikwindow.c:4818 +msgid "_Zoom" +msgstr "_Z 縮放" + +#: ../src/vikwindow.c:2204 +msgid "Zoom Tool" +msgstr "縮放工具" + +#: ../src/vikwindow.c:2271 ../src/vikwindow.c:4819 +msgid "_Pan" +msgstr "_P 平移" + +#: ../src/vikwindow.c:2271 +msgid "Pan Tool" +msgstr "" + +#: ../src/vikwindow.c:2425 +msgid "_Select" +msgstr "" + +#: ../src/vikwindow.c:2425 +msgid "Select Tool" +msgstr "" + +#: ../src/vikwindow.c:2615 +msgid "You must select a layer to show its properties." +msgstr "您必須選一個層才能察看它的屬性" + +#. No error to show, so unlikely this will get called +#: ../src/vikwindow.c:2629 +msgid "The help system is not available." +msgstr "" + +#. Main error path +#: ../src/vikwindow.c:2632 +#, c-format +msgid "" +"Help is not available because: %s.\n" +"Ensure a Mime Type ghelp handler program is installed (e.g. yelp)." +msgstr "" + +#: ../src/vikwindow.c:2865 +msgid "You must select a layer to delete." +msgstr "您必須選一個層才可移除" + +#: ../src/vikwindow.c:3171 +msgid "Untitled" +msgstr "未命名的" + +#: ../src/vikwindow.c:3300 +#, c-format +msgid "Unable to add '%s' to the list of recently used documents" +msgstr "" + +#: ../src/vikwindow.c:3391 +msgid "The file you requested could not be opened." +msgstr "您選的檔案無法被開啟" + +#: ../src/vikwindow.c:3394 +msgid "" +"GPSBabel is required to load files of this type or GPSBabel encountered " +"problems." +msgstr "" + +#: ../src/vikwindow.c:3397 +#, c-format +msgid "Unable to load malformed GPX file %s" +msgstr "" + +#: ../src/vikwindow.c:3400 +#, c-format +msgid "Unsupported file type for %s" +msgstr "" + +#. Since we can process .vik files with issues just show a warning in the status bar +#. Not that a user can do much about it... or tells them what this issue is yet... +#: ../src/vikwindow.c:3406 +#, c-format +msgid "WARNING: issues encountered loading %s" +msgstr "" + +#: ../src/vikwindow.c:3489 +msgid "Please select a GPS data file to open. " +msgstr "請選取一個GPS資料檔案來開啟 " + +#: ../src/vikwindow.c:3508 +msgid "Google Earth" +msgstr "" + +#: ../src/vikwindow.c:3523 ../src/vikwindow.c:3646 ../src/viking.desktop.in.h:1 +msgid "Viking" +msgstr "" + +#: ../src/vikwindow.c:3594 ../src/vikwindow.c:4632 +msgid "Open File" +msgstr "" + +#: ../src/vikwindow.c:3630 +msgid "Save as Viking File." +msgstr "另存新檔Viking檔案." + +#: ../src/vikwindow.c:3757 +#, c-format +msgid "Exporting to file: %s" +msgstr "" + +#. Confirm what happened. +#: ../src/vikwindow.c:3774 +#, c-format +msgid "Exported files: %d" +msgstr "" + +#: ../src/vikwindow.c:3786 +msgid "Nothing to Export!" +msgstr "" + +#: ../src/vikwindow.c:3790 +msgid "Export to directory" +msgstr "" + +#: ../src/vikwindow.c:3809 +msgid "Could not convert all files" +msgstr "" + +#: ../src/vikwindow.c:3851 +msgid "File not accessible" +msgstr "" + +#: ../src/vikwindow.c:3854 +msgid "No Viking File" +msgstr "" + +#: ../src/vikwindow.c:3998 +msgid "This layer has no configurable properties." +msgstr "" + +#: ../src/vikwindow.c:4080 +msgid "Are you sure you wish to delete all layers?" +msgstr "您真的確認要移除所有的圖層?" + +#. Try harder... +#: ../src/vikwindow.c:4126 ../src/vikwindow.c:4132 +msgid "Generating image file..." +msgstr "" + +#: ../src/vikwindow.c:4154 +msgid "" +"Failed to generate internal image.\n" +"\n" +"Try creating a smaller image." +msgstr "" + +#: ../src/vikwindow.c:4175 +msgid "Image file generated." +msgstr "" + +#: ../src/vikwindow.c:4177 +msgid "Failed to generate image file." +msgstr "" + +#: ../src/vikwindow.c:4246 +#, c-format +msgid "Unable to write to file %s: %s" +msgstr "" + +#: ../src/vikwindow.c:4284 +msgid "" +"Viewable region outside allowable pixel size bounds for image. Clipping " +"width/height values." +msgstr "" + +#: ../src/vikwindow.c:4309 +#, c-format +msgid "Total area: %ldm x %ldm (%.3f sq. km)" +msgstr "全部區域: %ldm x %ldm (%.3f 平方公裡)" + +#: ../src/vikwindow.c:4312 +#, c-format +msgid "Total area: %ldm x %ldm (%.3f sq. miles)" +msgstr "" + +#: ../src/vikwindow.c:4315 +#, c-format +msgid "Total area: %ldm x %ldm (%.3f sq. NM)" +msgstr "" + +#. Single file +#: ../src/vikwindow.c:4343 +msgid "Save Image" +msgstr "儲存影像" + +#: ../src/vikwindow.c:4364 ../src/vikwindow.c:4641 +msgid "KMZ" +msgstr "" + +#: ../src/vikwindow.c:4417 +msgid "You must be in UTM mode to use this feature" +msgstr "你必須在UTM型態中來使用這個特徴" + +#: ../src/vikwindow.c:4421 +msgid "Choose a directory to hold images" +msgstr "" + +#. todo: default for answers inside VikWindow or static (thruout instance) +#: ../src/vikwindow.c:4441 +msgid "Save to Image File" +msgstr "儲存為圖片檔案" + +#: ../src/vikwindow.c:4457 +msgid "Width (pixels):" +msgstr "寬度 (像素) :" + +#: ../src/vikwindow.c:4459 +msgid "Height (pixels):" +msgstr "高度 (像素) :" + +#: ../src/vikwindow.c:4462 +msgid "" +"WARNING: USING LARGE IMAGES OVER 10000x10000\n" +"MAY CRASH THE PROGRAM!" +msgstr "" + +#: ../src/vikwindow.c:4464 +msgid "Zoom (meters per pixel):" +msgstr "縮放 (米/像素) :" + +#: ../src/vikwindow.c:4480 +msgid "Area in current viewable window" +msgstr "" + +#: ../src/vikwindow.c:4490 +msgid "Save as PNG" +msgstr "儲存為PNG" + +#: ../src/vikwindow.c:4491 +msgid "Save as JPEG" +msgstr "儲存為JPEG" + +#: ../src/vikwindow.c:4520 +msgid "East-west image tiles:" +msgstr "" + +#: ../src/vikwindow.c:4522 +msgid "North-south image tiles:" +msgstr "" + +#: ../src/vikwindow.c:4619 +msgid "This feature is not available in UTM mode" +msgstr "" + +#: ../src/vikwindow.c:4658 +#, c-format +msgid "Unable to import %s." +msgstr "" + +#: ../src/vikwindow.c:4749 +msgid "Choose a background color" +msgstr "選取一個背景色" + +#: ../src/vikwindow.c:4765 +msgid "Choose a track highlight color" +msgstr "" + +#: ../src/vikwindow.c:4814 +msgid "_File" +msgstr "_F 檔案" + +#: ../src/vikwindow.c:4815 +msgid "_Edit" +msgstr "_E 編輯" + +#: ../src/vikwindow.c:4817 +msgid "_Show" +msgstr "" + +#: ../src/vikwindow.c:4820 +msgid "_Layers" +msgstr "_L 圖層" + +#: ../src/vikwindow.c:4821 +msgid "_Tools" +msgstr "_T 工具" + +#: ../src/vikwindow.c:4822 +msgid "_Webtools" +msgstr "" + +#: ../src/vikwindow.c:4823 ../src/vikwindow.c:4893 +msgid "_Help" +msgstr "_H 輔助說明" + +#: ../src/vikwindow.c:4825 +msgid "New file" +msgstr "新建檔案" + +#: ../src/vikwindow.c:4826 +msgid "_Open..." +msgstr "_O 開啟..." + +#: ../src/vikwindow.c:4826 +msgid "Open a file" +msgstr "開啟一個檔案" + +#: ../src/vikwindow.c:4827 +msgid "Open _Recent File" +msgstr "" + +#: ../src/vikwindow.c:4828 +msgid "Append _File..." +msgstr "_p 增加檔案..." + +#: ../src/vikwindow.c:4828 +msgid "Append data from a different file" +msgstr "從不同的檔案中追加資料" + +#: ../src/vikwindow.c:4829 +msgid "Open GPX as External _Layer..." +msgstr "" + +#: ../src/vikwindow.c:4829 +msgid "Open a GPX file as an external layer" +msgstr "" + +#: ../src/vikwindow.c:4830 +msgid "_Export All" +msgstr "" + +#: ../src/vikwindow.c:4830 +msgid "Export All TrackWaypoint Layers" +msgstr "" + +#: ../src/vikwindow.c:4831 +msgid "_GPX..." +msgstr "" + +#: ../src/vikwindow.c:4831 +msgid "Export as GPX" +msgstr "" + +#: ../src/vikwindow.c:4832 +msgid "A_cquire" +msgstr "_c 抓取" + +#: ../src/vikwindow.c:4833 +msgid "_Directions..." +msgstr "" + +#: ../src/vikwindow.c:4833 +msgid "Get driving directions" +msgstr "" + +#: ../src/vikwindow.c:4835 +msgid "_OSM Traces..." +msgstr "" + +#: ../src/vikwindow.c:4835 +msgid "Get traces from OpenStreetMap" +msgstr "" + +#: ../src/vikwindow.c:4836 +msgid "_My OSM Traces..." +msgstr "" + +#: ../src/vikwindow.c:4836 +msgid "Get Your Own Traces from OpenStreetMap" +msgstr "" + +#: ../src/vikwindow.c:4839 +msgid "Geo_caches..." +msgstr "" + +#: ../src/vikwindow.c:4839 +msgid "Get Geocaches from geocaching.com" +msgstr "從geocaching.com獲得地理緩衝區資料" + +#: ../src/vikwindow.c:4842 +msgid "Create waypoints from geotagged images" +msgstr "" + +#: ../src/vikwindow.c:4844 +msgid "Get a file from a URL" +msgstr "" + +#: ../src/vikwindow.c:4846 +msgid "Create waypoints from Wikipedia items in the current view" +msgstr "" + +#: ../src/vikwindow.c:4848 +msgid "_Save" +msgstr "_S 儲存" + +#: ../src/vikwindow.c:4848 +msgid "Save the file" +msgstr "儲存這個檔案" + +#: ../src/vikwindow.c:4849 +msgid "Save _As..." +msgstr "_A 另存新檔..." + +#: ../src/vikwindow.c:4849 +msgid "Save the file under different name" +msgstr "儲存為其他名字的檔案" + +#: ../src/vikwindow.c:4850 +msgid "Properties..." +msgstr "" + +#: ../src/vikwindow.c:4850 +msgid "File Properties" +msgstr "" + +#: ../src/vikwindow.c:4852 +msgid "Import KMZ _Map File..." +msgstr "" + +#: ../src/vikwindow.c:4852 +msgid "Import a KMZ file" +msgstr "" + +#: ../src/vikwindow.c:4853 +msgid "Generate _KMZ Map File..." +msgstr "" + +#: ../src/vikwindow.c:4853 +msgid "Generate a KMZ file with an overlay of the current view" +msgstr "" + +#: ../src/vikwindow.c:4855 +msgid "_Generate Image File..." +msgstr "_G 生成圖形檔案..." + +#: ../src/vikwindow.c:4855 +msgid "Save a snapshot of the workspace into a file" +msgstr "" + +#: ../src/vikwindow.c:4856 +msgid "Generate _Directory of Images..." +msgstr "_D 建立圖片的目録..." + +#: ../src/vikwindow.c:4856 +msgid "Generate _Directory of Images" +msgstr "" + +#: ../src/vikwindow.c:4857 +msgid "_Print..." +msgstr "列印(_P)..." + +#: ../src/vikwindow.c:4857 +msgid "Print maps" +msgstr "列印地圖" + +#: ../src/vikwindow.c:4858 +msgid "E_xit" +msgstr "_x 結束" + +#: ../src/vikwindow.c:4858 +msgid "Exit the program" +msgstr "結束程式" + +#: ../src/vikwindow.c:4859 +msgid "Save and Exit" +msgstr "儲存并結束" + +#: ../src/vikwindow.c:4859 +msgid "Save and Exit the program" +msgstr "儲存并結束程式" + +#: ../src/vikwindow.c:4861 +msgid "Go to the Pre_vious Location" +msgstr "" + +#: ../src/vikwindow.c:4861 +msgid "Go to the previous location" +msgstr "" + +#: ../src/vikwindow.c:4862 +msgid "Go to the _Next Location" +msgstr "" + +#: ../src/vikwindow.c:4862 +msgid "Go to the next location" +msgstr "" + +#: ../src/vikwindow.c:4863 +msgid "Go to the _Default Location" +msgstr "" + +#: ../src/vikwindow.c:4863 +msgid "Go to the default location" +msgstr "" + +#: ../src/vikwindow.c:4864 +msgid "Go to the _Auto Location" +msgstr "" + +#: ../src/vikwindow.c:4864 +msgid "Go to a location via automatic lookup" +msgstr "" + +#: ../src/vikwindow.c:4865 +msgid "Go to _Location..." +msgstr "" + +#: ../src/vikwindow.c:4865 +msgid "Go to address/place using text search" +msgstr "" + +#: ../src/vikwindow.c:4866 +msgid "_Go to Lat/Lon..." +msgstr "_G 前往一個經緯度值..." + +#: ../src/vikwindow.c:4866 +msgid "Go to arbitrary lat/lon coordinate" +msgstr "前往任意的經緯度座標" + +#: ../src/vikwindow.c:4867 +msgid "Go to UTM..." +msgstr "前往UTM..." + +#: ../src/vikwindow.c:4867 +msgid "Go to arbitrary UTM coordinate" +msgstr "前往任意的UTM座標" + +#: ../src/vikwindow.c:4868 +#, fuzzy +msgid "Go to Today" +msgstr "前往 UTM" + +#: ../src/vikwindow.c:4868 +msgid "Go to today on the calendar" +msgstr "" + +#: ../src/vikwindow.c:4869 +msgid "_Refresh" +msgstr "" + +#: ../src/vikwindow.c:4869 +msgid "Refresh any maps displayed" +msgstr "" + +#: ../src/vikwindow.c:4870 +msgid "Set _Highlight Color..." +msgstr "" + +#: ../src/vikwindow.c:4870 +msgid "Set Highlight Color" +msgstr "" + +#: ../src/vikwindow.c:4871 +msgid "Set Bac_kground Color..." +msgstr "" + +#: ../src/vikwindow.c:4871 +msgid "Set Background Color" +msgstr "" + +#: ../src/vikwindow.c:4872 +msgid "Zoom _In" +msgstr "放大(_I)" + +#: ../src/vikwindow.c:4872 +msgid "Zoom In" +msgstr "" + +#: ../src/vikwindow.c:4873 +msgid "Zoom _Out" +msgstr "縮小(_O)" + +#: ../src/vikwindow.c:4873 +msgid "Zoom Out" +msgstr "" + +#: ../src/vikwindow.c:4874 +msgid "Zoom _To..." +msgstr "縮放至(_T)..." + +#: ../src/vikwindow.c:4874 +msgid "Zoom To" +msgstr "" + +#: ../src/vikwindow.c:4875 +msgid "Pan _North" +msgstr "" + +#: ../src/vikwindow.c:4876 +msgid "Pan _East" +msgstr "" + +#: ../src/vikwindow.c:4877 +msgid "Pan _South" +msgstr "" + +#: ../src/vikwindow.c:4878 +msgid "Pan _West" +msgstr "" + +#: ../src/vikwindow.c:4879 +msgid "Background _Jobs" +msgstr "_J 背景工作" + +#: ../src/vikwindow.c:4879 +msgid "Background Jobs" +msgstr "" + +#: ../src/vikwindow.c:4881 +msgid "Cu_t" +msgstr "剪下(_t)" + +#: ../src/vikwindow.c:4885 +msgid "Delete All" +msgstr "全部移除" + +#: ../src/vikwindow.c:4886 +msgid "Copy Centre _Location" +msgstr "" + +#: ../src/vikwindow.c:4887 +msgid "_Flush Map Cache" +msgstr "" + +#: ../src/vikwindow.c:4888 +msgid "_Set the Default Location" +msgstr "" + +#: ../src/vikwindow.c:4888 +msgid "Set the Default Location to the current position" +msgstr "" + +#: ../src/vikwindow.c:4889 +msgid "_Preferences" +msgstr "_P 個人偏好" + +#: ../src/vikwindow.c:4889 +msgid "Program Preferences" +msgstr "" + +#: ../src/vikwindow.c:4890 +msgid "_Layer Defaults" +msgstr "" + +#: ../src/vikwindow.c:4891 +msgid "_Properties" +msgstr "_P 屬性" + +#: ../src/vikwindow.c:4893 +msgid "Help" +msgstr "" + +#: ../src/vikwindow.c:4894 +msgid "_About" +msgstr "關於(_A)" + +#: ../src/vikwindow.c:4894 +msgid "About" +msgstr "關於" + +#: ../src/vikwindow.c:4903 +msgid "_KML..." +msgstr "_KML..." + +#: ../src/vikwindow.c:4903 +msgid "Export as KML" +msgstr "輸出 KML" + +#: ../src/vikwindow.c:4904 +msgid "Transfer data from a GPS device" +msgstr "從一個GPS接收器獲得資料" + +#: ../src/vikwindow.c:4905 +msgid "Import file via GPSBabel converter" +msgstr "" + +#: ../src/vikwindow.c:4909 +msgid "Import Geo_JSON File..." +msgstr "匯入 Geo_JSON 檔..." + +#: ../src/vikwindow.c:4909 +msgid "Import GeoJSON file" +msgstr "匯入 GeoJSON 檔" + +#: ../src/vikwindow.c:4914 +msgid "_UTM Mode" +msgstr "UTM 模式(_U)" + +#: ../src/vikwindow.c:4915 +msgid "_Expedia Mode" +msgstr "Expedia 模式 ( _E)" + +#: ../src/vikwindow.c:4916 +msgid "_Mercator Mode" +msgstr "麥卡托模式(_M)" + +#: ../src/vikwindow.c:4917 +msgid "Lat_/Lon Mode" +msgstr "經緯度模式(_/)" + +#: ../src/vikwindow.c:4921 +msgid "Show _Scale" +msgstr "" + +#: ../src/vikwindow.c:4921 +msgid "Show Scale" +msgstr "察看比例尺" + +#: ../src/vikwindow.c:4922 +msgid "Show _Center Mark" +msgstr "" + +#: ../src/vikwindow.c:4922 +msgid "Show Center Mark" +msgstr "察看中心記號" + +#: ../src/vikwindow.c:4923 +msgid "Show _Highlight" +msgstr "" + +#: ../src/vikwindow.c:4923 +msgid "Show Highlight" +msgstr "" + +#: ../src/vikwindow.c:4924 +msgid "_Full Screen" +msgstr "全屏" + +#: ../src/vikwindow.c:4924 +msgid "Activate full screen mode" +msgstr "" + +#: ../src/vikwindow.c:4925 +msgid "Show Side _Panel" +msgstr "" + +#: ../src/vikwindow.c:4925 +msgid "Show Side Panel" +msgstr "" + +#: ../src/vikwindow.c:4926 +msgid "Show Status_bar" +msgstr "" + +#: ../src/vikwindow.c:4926 +msgid "Show Statusbar" +msgstr "" + +#: ../src/vikwindow.c:4927 +msgid "Show _Toolbar" +msgstr "" + +#: ../src/vikwindow.c:4927 +msgid "Show Toolbar" +msgstr "" + +#: ../src/vikwindow.c:4928 +msgid "Show _Menu" +msgstr "" + +#: ../src/vikwindow.c:4928 +msgid "Show Menu" +msgstr "" + +#: ../src/vikwindow.c:4929 +msgid "Show Side Panel B_uttons" +msgstr "" + +#: ../src/vikwindow.c:4929 +msgid "Show Side Panel Buttons" +msgstr "" + +#: ../src/vikwindow.c:4930 +msgid "Show Side Panel Ca_lendar" +msgstr "" + +#: ../src/vikwindow.c:4930 +msgid "Show Side Panel Calendar" +msgstr "" + +#: ../src/vikwindow.c:5064 +#, c-format +msgid "New _%s Layer" +msgstr "" + +#: ../src/vikwindow.c:5114 +#, fuzzy +msgid "..." +msgstr "添加 ..." + +#: ../src/viking.desktop.in.h:2 +msgid "GPS Data Manager" +msgstr "" + +#: ../src/viking.desktop.in.h:3 +msgid "Map Based GPS Data Manager (live data capable)." +msgstr "" + +#: ../src/libjpeg/jpeg-data.c:205 +msgid "Data does not follow JPEG specification." +msgstr "" + +#: ../src/libjpeg/jpeg-data.c:302 +#, c-format +msgid "Path '%s' invalid." +msgstr "" + +#: ../src/libjpeg/jpeg-data.c:320 +#, c-format +msgid "Could not read '%s'." +msgstr "" + +#~ msgid "Email:" +#~ msgstr "電子郵箱 :" + +#~ msgid "Error: couldn't find gpsbabel." +#~ msgstr "錯誤: 没有發現 gpsbabel." + +#~ msgid "Create Track" +#~ msgstr "建立軌迹" diff --git a/src/Makefile.am b/src/Makefile.am new file mode 100644 index 0000000..7643324 --- /dev/null +++ b/src/Makefile.am @@ -0,0 +1,259 @@ +# This is the Makefile for the Viking GPS viewer program. +# This file is licensed through the GPL version 2 or newer. + +SUBDIRS = icons + +bin_PROGRAMS = viking + +noinst_LIBRARIES = \ + libviking.a +# libdtoa.a + +authors.h: $(top_srcdir)/AUTHORS + rm -f $@ + echo "/* Generated file. */" >> $@ + echo "const gchar *AUTHORS[] = {\\" >> $@ + sed -e "s/ \*\*.*//" -e 's/^/"/' -e 's/$$/",\\/' -e '$$s/\\$$//' $< >> $@ + echo "NULL};" >> $@ + +if HAVE_XSLTPROC +documenters.h: $(top_srcdir)/help/C/viking.xml + $(XP) $(srcdir)/docbook2documenters.xsl $(top_srcdir)/help/C/viking.xml > $@ +else +documenters.h: + rm -f $@ + echo "/* Generated file. */" >> $@ + echo "const gchar *DOCUMENTERS[] = {\\" >> $@ + echo "NULL};" >> $@ +endif + +BUILT_SOURCES = authors.h documenters.h + +vikenumtypes.h: vikenumtypes.h.template $(ENUM_H_FILES) $(GLIB_MKENUMS) + (cd $(srcdir) && $(GLIB_MKENUMS) --template vikenumtypes.h.template $(ENUM_H_FILES)) > $@ + +vikenumtypes.c: vikenumtypes.c.template $(ENUM_H_FILES) $(GLIB_MKENUMS) + (cd $(srcdir) && $(GLIB_MKENUMS) --template vikenumtypes.c.template $(ENUM_H_FILES)) > $@ + +EXTRA_DIST = \ + misc/fpconv-license.txt \ + docbook2documenters.xsl \ + vikenumtypes.h.template \ + vikenumtypes.c.template + +BUILT_SOURCES += vikenumtypes.h vikenumtypes.c + +$(BUILT_SOURCES): $(srcdir)/Makefile.am + +ENUM_H_FILES = \ + vikviewport.h + +libviking_a_SOURCES = \ + bbox.h \ + map_ids.h \ + modules.h modules.c \ + curl_download.c curl_download.h \ + compression.c compression.h \ + menu.xml.h \ + degrees_converters.c degrees_converters.h \ + globals.c globals.h \ + viking.h mapcoord.h config.h \ + viktrwlayer.c viktrwlayer.h \ + vik_compat.c vik_compat.h \ + viktrack.c viktrack.h \ + vikwaypoint.c vikwaypoint.h \ + clipboard.c clipboard.h \ + coords.c coords.h \ + gpsmapper.c gpsmapper.h \ + gpspoint.c gpspoint.h \ + geojson.c geojson.h \ + dir.c dir.h \ + file.c file.h \ + fileutils.c fileutils.h \ + file_magic.c file_magic.h \ + authors.h \ + documenters.h \ + dialog.c dialog.h \ + util.c util.h \ + ui_util.c ui_util.h \ + download.c download.h \ + jpg.c jpg.h \ + vikenumtypes.c vikenumtypes.h \ + viktreeview.c viktreeview.h \ + viklayer.c viklayer.h \ + viklayerspanel.c viklayerspanel.h \ + vikcoordlayer.c vikcoordlayer.h \ + vikstatus.c vikstatus.h \ + vikwindow.c vikwindow.h \ + vikviewport.c vikviewport.h \ + vikaggregatelayer.c vikaggregatelayer.h \ + vikgobjectbuilder.c vikgobjectbuilder.h \ + vikgpslayer.c vikgpslayer.h \ + vikgeoreflayer.c vikgeoreflayer.h \ + vikfileentry.c vikfileentry.h \ + vikgototool.c vikgototool.h \ + vikgotoxmltool.c vikgotoxmltool.h \ + vikgoto.c vikgoto.h \ + viktrwlayer_export.c viktrwlayer_export.h \ + viktrwlayer_tpwin.c viktrwlayer_tpwin.h \ + viktrwlayer_wpwin.c viktrwlayer_wpwin.h \ + viktrwlayer_propwin.c viktrwlayer_propwin.h \ + viktrwlayer_analysis.c viktrwlayer_analysis.h \ + viktrwlayer_tracklist.c viktrwlayer_tracklist.h \ + viktrwlayer_waypointlist.c viktrwlayer_waypointlist.h \ + vikrouting.c vikrouting.h \ + vikroutingengine.c vikroutingengine.h \ + vikroutingwebengine.c vikroutingwebengine.h \ + vikutils.c vikutils.h \ + toolbar.c toolbar.h toolbar.xml.h \ + thumbnails.c thumbnails.h \ + md5_hash.c md5_hash.h \ + background.c background.h \ + vikradiogroup.c vikradiogroup.h \ + vikcoord.c vikcoord.h \ + mapcache.c mapcache.h \ + maputils.c maputils.h \ + vikmapsource.c vikmapsource.h \ + vikmapsourcedefault.c vikmapsourcedefault.h \ + vikmapslayer.c vikmapslayer.h \ + vikmapslayer_compat.c vikmapslayer_compat.h \ + vikmaptype.c vikmaptype.h \ + vikslippymapsource.c vikslippymapsource.h \ + vikwmscmapsource.c vikwmscmapsource.h \ + viktmsmapsource.c viktmsmapsource.h \ + metatile.c metatile.h \ + gpx.c gpx.h \ + garminsymbols.c garminsymbols.h \ + acquire.c acquire.h \ + babel.c babel.h \ + babel_ui.c babel_ui.h \ + datasource_file.c \ + datasource_geojson.c \ + datasource_gps.c datasource_gps.h \ + datasource_routing.c \ + datasource_gc.c \ + datasource_bfilter.c \ + datasource_wikipedia.c \ + datasource_url.c \ + datasources.h \ + googlesearch.c googlesearch.h \ + dem.c dem.h \ + vikdemlayer.h vikdemlayer.c \ + vikdatetime_edit_dialog.c vikdatetime_edit_dialog.h \ + vikfilelist.c vikfilelist.h \ + vikexttool.c vikexttool.h \ + vikexttools.c vikexttools.h \ + vikwebtool.c vikwebtool.h \ + vikwebtoolcenter.c vikwebtoolcenter.h \ + vikwebtoolbounds.c vikwebtoolbounds.h \ + vikwebtoolformat.c vikwebtoolformat.h \ + vikexttool_datasources.c vikexttool_datasources.h \ + vikwebtool_datasource.c vikwebtool_datasource.h \ + dems.c dems.h \ + srtm_continent.c \ + uibuilder.c uibuilder.h \ + print-preview.c print-preview.h \ + print.c print.h \ + kmz.c kmz.h \ + viklayer_defaults.c viklayer_defaults.h \ + settings.c settings.h \ + preferences.c preferences.h \ + misc/fpconv.c misc/fpconv.h misc/powers.h \ + misc/strtod.c misc/strtod.h \ + misc/kdtree.c misc/kdtree.h \ + misc/gtkhtml.c misc/gtkhtml-private.h + +#libdtoa_a_SOURCES = misc/dtoa.c misc/dtoa.h +# Note especially not defining 'USE_LOCALE' to ensure dtoa() always writes a '.' for the decimal point +#libdtoa_a_CFLAGS = $(PACKAGE_CFLAGS) -DIEEE_8087 + +if BING +libviking_a_SOURCES += \ + bingmapsource.c bingmapsource.h \ + bing.c bing.h +endif + +if GOOGLE +libviking_a_SOURCES += \ + google.c google.h +endif + +if TERRASERVER +libviking_a_SOURCES += \ + terraservermapsource.c terraservermapsource.h \ + terraserver.c terraserver.h +endif + +if EXPEDIA +libviking_a_SOURCES += \ + expedia.c expedia.h +endif + +if OPENSTREETMAP +libviking_a_SOURCES += \ + osm.c osm.h \ + osm-traces.c osm-traces.h \ + datasource_osm_my_traces.c \ + datasource_osm.c +endif + +if BLUEMARBLE +libviking_a_SOURCES += \ + bluemarble.c bluemarble.h +endif + +if GEONAMES +libviking_a_SOURCES += \ + geonames.c geonames.h \ + geonamessearch.c geonamessearch.h +endif + +if GEOTAG +libviking_a_SOURCES += \ + datasource_geotag.c \ + geotag_exif.c geotag_exif.h \ + viktrwlayer_geotag.c viktrwlayer_geotag.h +endif + +# libexif doesn't have write support of EXIF info - so reused this code from command line exif tool +if LIBEXIF +libviking_a_SOURCES += \ + libjpeg/jpeg-data.c libjpeg/jpeg-data.h \ + libjpeg/jpeg-marker.c libjpeg/jpeg-marker.h +endif + +if MAPNIK +libviking_a_SOURCES += \ + vikmapniklayer.c vikmapniklayer.h \ + mapnik_interface.cpp mapnik_interface.h +endif + +if GEOCLUE +libviking_a_SOURCES += \ + libgeoclue.c libgeoclue.h +endif + +viking_SOURCES = main.c + +LDADD = $(noinst_LIBRARIES) $(PACKAGE_LIBS) @EXPAT_LIBS@ @LIBCURL@ icons/libicons.a +if WINDOWS +LDADD += \ + ../windows/installer/pixmaps/viking_icon.o +endif + +AM_CFLAGS = -Wall -g -D_GNU_SOURCE \ + $(PACKAGE_CFLAGS) \ + @EXPAT_CFLAGS@ @LIBCURL_CPPFLAGS@ @LIBGEOCLUE_CFLAGS@ +AM_CPPFLAGS = \ + $(PACKAGE_CFLAGS) \ + -DVIKING_DATADIR=\""$(pkgdatadir)"\" \ + -DVIKING_SYSCONFDIR=\""$(sysconfdir)/$(PACKAGE)"\" + +@INTLTOOL_DESKTOP_RULE@ + +desktopdir = $(datadir)/applications +desktop_in_files = viking.desktop.in +desktop_DATA = $(desktop_in_files:.desktop.in=.desktop) +EXTRA_DIST += $(desktop_in_files) + +CLEANFILES = $(BUILT_SOURCES) $(desktop_DATA) diff --git a/src/Makefile.in b/src/Makefile.in new file mode 100644 index 0000000..dd11853 --- /dev/null +++ b/src/Makefile.in @@ -0,0 +1,1705 @@ +# Makefile.in generated by automake 1.16.1 from Makefile.am. +# @configure_input@ + +# Copyright (C) 1994-2018 Free Software Foundation, Inc. + +# This Makefile.in is free software; the Free Software Foundation +# gives unlimited permission to copy and/or distribute it, +# with or without modifications, as long as this notice is preserved. + +# This program is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY, to the extent permitted by law; without +# even the implied warranty of MERCHANTABILITY or FITNESS FOR A +# PARTICULAR PURPOSE. + +@SET_MAKE@ + +# This is the Makefile for the Viking GPS viewer program. +# This file is licensed through the GPL version 2 or newer. + + + +VPATH = @srcdir@ +am__is_gnu_make = { \ + if test -z '$(MAKELEVEL)'; then \ + false; \ + elif test -n '$(MAKE_HOST)'; then \ + true; \ + elif test -n '$(MAKE_VERSION)' && test -n '$(CURDIR)'; then \ + true; \ + else \ + false; \ + fi; \ +} +am__make_running_with_option = \ + case $${target_option-} in \ + ?) ;; \ + *) echo "am__make_running_with_option: internal error: invalid" \ + "target option '$${target_option-}' specified" >&2; \ + exit 1;; \ + esac; \ + has_opt=no; \ + sane_makeflags=$$MAKEFLAGS; \ + if $(am__is_gnu_make); then \ + sane_makeflags=$$MFLAGS; \ + else \ + case $$MAKEFLAGS in \ + *\\[\ \ ]*) \ + bs=\\; \ + sane_makeflags=`printf '%s\n' "$$MAKEFLAGS" \ + | sed "s/$$bs$$bs[$$bs $$bs ]*//g"`;; \ + esac; \ + fi; \ + skip_next=no; \ + strip_trailopt () \ + { \ + flg=`printf '%s\n' "$$flg" | sed "s/$$1.*$$//"`; \ + }; \ + for flg in $$sane_makeflags; do \ + test $$skip_next = yes && { skip_next=no; continue; }; \ + case $$flg in \ + *=*|--*) continue;; \ + -*I) strip_trailopt 'I'; skip_next=yes;; \ + -*I?*) strip_trailopt 'I';; \ + -*O) strip_trailopt 'O'; skip_next=yes;; \ + -*O?*) strip_trailopt 'O';; \ + -*l) strip_trailopt 'l'; skip_next=yes;; \ + -*l?*) strip_trailopt 'l';; \ + -[dEDm]) skip_next=yes;; \ + -[JT]) skip_next=yes;; \ + esac; \ + case $$flg in \ + *$$target_option*) has_opt=yes; break;; \ + esac; \ + done; \ + test $$has_opt = yes +am__make_dryrun = (target_option=n; $(am__make_running_with_option)) +am__make_keepgoing = (target_option=k; $(am__make_running_with_option)) +pkgdatadir = $(datadir)/@PACKAGE@ +pkgincludedir = $(includedir)/@PACKAGE@ +pkglibdir = $(libdir)/@PACKAGE@ +pkglibexecdir = $(libexecdir)/@PACKAGE@ +am__cd = CDPATH="$${ZSH_VERSION+.}$(PATH_SEPARATOR)" && cd +install_sh_DATA = $(install_sh) -c -m 644 +install_sh_PROGRAM = $(install_sh) -c +install_sh_SCRIPT = $(install_sh) -c +INSTALL_HEADER = $(INSTALL_DATA) +transform = $(program_transform_name) +NORMAL_INSTALL = : +PRE_INSTALL = : +POST_INSTALL = : +NORMAL_UNINSTALL = : +PRE_UNINSTALL = : +POST_UNINSTALL = : +build_triplet = @build@ +host_triplet = @host@ +target_triplet = @target@ +bin_PROGRAMS = viking$(EXEEXT) + +#libdtoa_a_SOURCES = misc/dtoa.c misc/dtoa.h +# Note especially not defining 'USE_LOCALE' to ensure dtoa() always writes a '.' for the decimal point +#libdtoa_a_CFLAGS = $(PACKAGE_CFLAGS) -DIEEE_8087 +@BING_TRUE@am__append_1 = \ +@BING_TRUE@ bingmapsource.c bingmapsource.h \ +@BING_TRUE@ bing.c bing.h + +@GOOGLE_TRUE@am__append_2 = \ +@GOOGLE_TRUE@ google.c google.h + +@TERRASERVER_TRUE@am__append_3 = \ +@TERRASERVER_TRUE@ terraservermapsource.c terraservermapsource.h \ +@TERRASERVER_TRUE@ terraserver.c terraserver.h + +@EXPEDIA_TRUE@am__append_4 = \ +@EXPEDIA_TRUE@ expedia.c expedia.h + +@OPENSTREETMAP_TRUE@am__append_5 = \ +@OPENSTREETMAP_TRUE@ osm.c osm.h \ +@OPENSTREETMAP_TRUE@ osm-traces.c osm-traces.h \ +@OPENSTREETMAP_TRUE@ datasource_osm_my_traces.c \ +@OPENSTREETMAP_TRUE@ datasource_osm.c + +@BLUEMARBLE_TRUE@am__append_6 = \ +@BLUEMARBLE_TRUE@ bluemarble.c bluemarble.h + +@GEONAMES_TRUE@am__append_7 = \ +@GEONAMES_TRUE@ geonames.c geonames.h \ +@GEONAMES_TRUE@ geonamessearch.c geonamessearch.h + +@GEOTAG_TRUE@am__append_8 = \ +@GEOTAG_TRUE@ datasource_geotag.c \ +@GEOTAG_TRUE@ geotag_exif.c geotag_exif.h \ +@GEOTAG_TRUE@ viktrwlayer_geotag.c viktrwlayer_geotag.h + + +# libexif doesn't have write support of EXIF info - so reused this code from command line exif tool +@LIBEXIF_TRUE@am__append_9 = \ +@LIBEXIF_TRUE@ libjpeg/jpeg-data.c libjpeg/jpeg-data.h \ +@LIBEXIF_TRUE@ libjpeg/jpeg-marker.c libjpeg/jpeg-marker.h + +@MAPNIK_TRUE@am__append_10 = \ +@MAPNIK_TRUE@ vikmapniklayer.c vikmapniklayer.h \ +@MAPNIK_TRUE@ mapnik_interface.cpp mapnik_interface.h + +@GEOCLUE_TRUE@am__append_11 = \ +@GEOCLUE_TRUE@ libgeoclue.c libgeoclue.h + +@WINDOWS_TRUE@am__append_12 = \ +@WINDOWS_TRUE@ ../windows/installer/pixmaps/viking_icon.o + +subdir = src +ACLOCAL_M4 = $(top_srcdir)/aclocal.m4 +am__aclocal_m4_deps = $(top_srcdir)/m4/expat.m4 \ + $(top_srcdir)/m4/gettext.m4 $(top_srcdir)/m4/iconv.m4 \ + $(top_srcdir)/m4/intlmacosx.m4 $(top_srcdir)/m4/lib-ld.m4 \ + $(top_srcdir)/m4/lib-link.m4 $(top_srcdir)/m4/lib-prefix.m4 \ + $(top_srcdir)/m4/libcurl.m4 $(top_srcdir)/m4/nls.m4 \ + $(top_srcdir)/m4/po.m4 $(top_srcdir)/m4/progtest.m4 \ + $(top_srcdir)/configure.ac +am__configure_deps = $(am__aclocal_m4_deps) $(CONFIGURE_DEPENDENCIES) \ + $(ACLOCAL_M4) +DIST_COMMON = $(srcdir)/Makefile.am $(am__DIST_COMMON) +mkinstalldirs = $(SHELL) $(top_srcdir)/mkinstalldirs +CONFIG_HEADER = config.h +CONFIG_CLEAN_FILES = +CONFIG_CLEAN_VPATH_FILES = +am__installdirs = "$(DESTDIR)$(bindir)" "$(DESTDIR)$(desktopdir)" +PROGRAMS = $(bin_PROGRAMS) +LIBRARIES = $(noinst_LIBRARIES) +AR = ar +ARFLAGS = cru +AM_V_AR = $(am__v_AR_@AM_V@) +am__v_AR_ = $(am__v_AR_@AM_DEFAULT_V@) +am__v_AR_0 = @echo " AR " $@; +am__v_AR_1 = +libviking_a_AR = $(AR) $(ARFLAGS) +libviking_a_LIBADD = +am__libviking_a_SOURCES_DIST = bbox.h map_ids.h modules.h modules.c \ + curl_download.c curl_download.h compression.c compression.h \ + menu.xml.h degrees_converters.c degrees_converters.h globals.c \ + globals.h viking.h mapcoord.h config.h viktrwlayer.c \ + viktrwlayer.h vik_compat.c vik_compat.h viktrack.c viktrack.h \ + vikwaypoint.c vikwaypoint.h clipboard.c clipboard.h coords.c \ + coords.h gpsmapper.c gpsmapper.h gpspoint.c gpspoint.h \ + geojson.c geojson.h dir.c dir.h file.c file.h fileutils.c \ + fileutils.h file_magic.c file_magic.h authors.h documenters.h \ + dialog.c dialog.h util.c util.h ui_util.c ui_util.h download.c \ + download.h jpg.c jpg.h vikenumtypes.c vikenumtypes.h \ + viktreeview.c viktreeview.h viklayer.c viklayer.h \ + viklayerspanel.c viklayerspanel.h vikcoordlayer.c \ + vikcoordlayer.h vikstatus.c vikstatus.h vikwindow.c \ + vikwindow.h vikviewport.c vikviewport.h vikaggregatelayer.c \ + vikaggregatelayer.h vikgobjectbuilder.c vikgobjectbuilder.h \ + vikgpslayer.c vikgpslayer.h vikgeoreflayer.c vikgeoreflayer.h \ + vikfileentry.c vikfileentry.h vikgototool.c vikgototool.h \ + vikgotoxmltool.c vikgotoxmltool.h vikgoto.c vikgoto.h \ + viktrwlayer_export.c viktrwlayer_export.h viktrwlayer_tpwin.c \ + viktrwlayer_tpwin.h viktrwlayer_wpwin.c viktrwlayer_wpwin.h \ + viktrwlayer_propwin.c viktrwlayer_propwin.h \ + viktrwlayer_analysis.c viktrwlayer_analysis.h \ + viktrwlayer_tracklist.c viktrwlayer_tracklist.h \ + viktrwlayer_waypointlist.c viktrwlayer_waypointlist.h \ + vikrouting.c vikrouting.h vikroutingengine.c \ + vikroutingengine.h vikroutingwebengine.c vikroutingwebengine.h \ + vikutils.c vikutils.h toolbar.c toolbar.h toolbar.xml.h \ + thumbnails.c thumbnails.h md5_hash.c md5_hash.h background.c \ + background.h vikradiogroup.c vikradiogroup.h vikcoord.c \ + vikcoord.h mapcache.c mapcache.h maputils.c maputils.h \ + vikmapsource.c vikmapsource.h vikmapsourcedefault.c \ + vikmapsourcedefault.h vikmapslayer.c vikmapslayer.h \ + vikmapslayer_compat.c vikmapslayer_compat.h vikmaptype.c \ + vikmaptype.h vikslippymapsource.c vikslippymapsource.h \ + vikwmscmapsource.c vikwmscmapsource.h viktmsmapsource.c \ + viktmsmapsource.h metatile.c metatile.h gpx.c gpx.h \ + garminsymbols.c garminsymbols.h acquire.c acquire.h babel.c \ + babel.h babel_ui.c babel_ui.h datasource_file.c \ + datasource_geojson.c datasource_gps.c datasource_gps.h \ + datasource_routing.c datasource_gc.c datasource_bfilter.c \ + datasource_wikipedia.c datasource_url.c datasources.h \ + googlesearch.c googlesearch.h dem.c dem.h vikdemlayer.h \ + vikdemlayer.c vikdatetime_edit_dialog.c \ + vikdatetime_edit_dialog.h vikfilelist.c vikfilelist.h \ + vikexttool.c vikexttool.h vikexttools.c vikexttools.h \ + vikwebtool.c vikwebtool.h vikwebtoolcenter.c \ + vikwebtoolcenter.h vikwebtoolbounds.c vikwebtoolbounds.h \ + vikwebtoolformat.c vikwebtoolformat.h vikexttool_datasources.c \ + vikexttool_datasources.h vikwebtool_datasource.c \ + vikwebtool_datasource.h dems.c dems.h srtm_continent.c \ + uibuilder.c uibuilder.h print-preview.c print-preview.h \ + print.c print.h kmz.c kmz.h viklayer_defaults.c \ + viklayer_defaults.h settings.c settings.h preferences.c \ + preferences.h misc/fpconv.c misc/fpconv.h misc/powers.h \ + misc/strtod.c misc/strtod.h misc/kdtree.c misc/kdtree.h \ + misc/gtkhtml.c misc/gtkhtml-private.h bingmapsource.c \ + bingmapsource.h bing.c bing.h google.c google.h \ + terraservermapsource.c terraservermapsource.h terraserver.c \ + terraserver.h expedia.c expedia.h osm.c osm.h osm-traces.c \ + osm-traces.h datasource_osm_my_traces.c datasource_osm.c \ + bluemarble.c bluemarble.h geonames.c geonames.h \ + geonamessearch.c geonamessearch.h datasource_geotag.c \ + geotag_exif.c geotag_exif.h viktrwlayer_geotag.c \ + viktrwlayer_geotag.h libjpeg/jpeg-data.c libjpeg/jpeg-data.h \ + libjpeg/jpeg-marker.c libjpeg/jpeg-marker.h vikmapniklayer.c \ + vikmapniklayer.h mapnik_interface.cpp mapnik_interface.h \ + libgeoclue.c libgeoclue.h +am__dirstamp = $(am__leading_dot)dirstamp +@BING_TRUE@am__objects_1 = bingmapsource.$(OBJEXT) bing.$(OBJEXT) +@GOOGLE_TRUE@am__objects_2 = google.$(OBJEXT) +@TERRASERVER_TRUE@am__objects_3 = terraservermapsource.$(OBJEXT) \ +@TERRASERVER_TRUE@ terraserver.$(OBJEXT) +@EXPEDIA_TRUE@am__objects_4 = expedia.$(OBJEXT) +@OPENSTREETMAP_TRUE@am__objects_5 = osm.$(OBJEXT) osm-traces.$(OBJEXT) \ +@OPENSTREETMAP_TRUE@ datasource_osm_my_traces.$(OBJEXT) \ +@OPENSTREETMAP_TRUE@ datasource_osm.$(OBJEXT) +@BLUEMARBLE_TRUE@am__objects_6 = bluemarble.$(OBJEXT) +@GEONAMES_TRUE@am__objects_7 = geonames.$(OBJEXT) \ +@GEONAMES_TRUE@ geonamessearch.$(OBJEXT) +@GEOTAG_TRUE@am__objects_8 = datasource_geotag.$(OBJEXT) \ +@GEOTAG_TRUE@ geotag_exif.$(OBJEXT) \ +@GEOTAG_TRUE@ viktrwlayer_geotag.$(OBJEXT) +@LIBEXIF_TRUE@am__objects_9 = libjpeg/jpeg-data.$(OBJEXT) \ +@LIBEXIF_TRUE@ libjpeg/jpeg-marker.$(OBJEXT) +@MAPNIK_TRUE@am__objects_10 = vikmapniklayer.$(OBJEXT) \ +@MAPNIK_TRUE@ mapnik_interface.$(OBJEXT) +@GEOCLUE_TRUE@am__objects_11 = libgeoclue.$(OBJEXT) +am_libviking_a_OBJECTS = modules.$(OBJEXT) curl_download.$(OBJEXT) \ + compression.$(OBJEXT) degrees_converters.$(OBJEXT) \ + globals.$(OBJEXT) viktrwlayer.$(OBJEXT) vik_compat.$(OBJEXT) \ + viktrack.$(OBJEXT) vikwaypoint.$(OBJEXT) clipboard.$(OBJEXT) \ + coords.$(OBJEXT) gpsmapper.$(OBJEXT) gpspoint.$(OBJEXT) \ + geojson.$(OBJEXT) dir.$(OBJEXT) file.$(OBJEXT) \ + fileutils.$(OBJEXT) file_magic.$(OBJEXT) dialog.$(OBJEXT) \ + util.$(OBJEXT) ui_util.$(OBJEXT) download.$(OBJEXT) \ + jpg.$(OBJEXT) vikenumtypes.$(OBJEXT) viktreeview.$(OBJEXT) \ + viklayer.$(OBJEXT) viklayerspanel.$(OBJEXT) \ + vikcoordlayer.$(OBJEXT) vikstatus.$(OBJEXT) \ + vikwindow.$(OBJEXT) vikviewport.$(OBJEXT) \ + vikaggregatelayer.$(OBJEXT) vikgobjectbuilder.$(OBJEXT) \ + vikgpslayer.$(OBJEXT) vikgeoreflayer.$(OBJEXT) \ + vikfileentry.$(OBJEXT) vikgototool.$(OBJEXT) \ + vikgotoxmltool.$(OBJEXT) vikgoto.$(OBJEXT) \ + viktrwlayer_export.$(OBJEXT) viktrwlayer_tpwin.$(OBJEXT) \ + viktrwlayer_wpwin.$(OBJEXT) viktrwlayer_propwin.$(OBJEXT) \ + viktrwlayer_analysis.$(OBJEXT) viktrwlayer_tracklist.$(OBJEXT) \ + viktrwlayer_waypointlist.$(OBJEXT) vikrouting.$(OBJEXT) \ + vikroutingengine.$(OBJEXT) vikroutingwebengine.$(OBJEXT) \ + vikutils.$(OBJEXT) toolbar.$(OBJEXT) thumbnails.$(OBJEXT) \ + md5_hash.$(OBJEXT) background.$(OBJEXT) \ + vikradiogroup.$(OBJEXT) vikcoord.$(OBJEXT) mapcache.$(OBJEXT) \ + maputils.$(OBJEXT) vikmapsource.$(OBJEXT) \ + vikmapsourcedefault.$(OBJEXT) vikmapslayer.$(OBJEXT) \ + vikmapslayer_compat.$(OBJEXT) vikmaptype.$(OBJEXT) \ + vikslippymapsource.$(OBJEXT) vikwmscmapsource.$(OBJEXT) \ + viktmsmapsource.$(OBJEXT) metatile.$(OBJEXT) gpx.$(OBJEXT) \ + garminsymbols.$(OBJEXT) acquire.$(OBJEXT) babel.$(OBJEXT) \ + babel_ui.$(OBJEXT) datasource_file.$(OBJEXT) \ + datasource_geojson.$(OBJEXT) datasource_gps.$(OBJEXT) \ + datasource_routing.$(OBJEXT) datasource_gc.$(OBJEXT) \ + datasource_bfilter.$(OBJEXT) datasource_wikipedia.$(OBJEXT) \ + datasource_url.$(OBJEXT) googlesearch.$(OBJEXT) dem.$(OBJEXT) \ + vikdemlayer.$(OBJEXT) vikdatetime_edit_dialog.$(OBJEXT) \ + vikfilelist.$(OBJEXT) vikexttool.$(OBJEXT) \ + vikexttools.$(OBJEXT) vikwebtool.$(OBJEXT) \ + vikwebtoolcenter.$(OBJEXT) vikwebtoolbounds.$(OBJEXT) \ + vikwebtoolformat.$(OBJEXT) vikexttool_datasources.$(OBJEXT) \ + vikwebtool_datasource.$(OBJEXT) dems.$(OBJEXT) \ + srtm_continent.$(OBJEXT) uibuilder.$(OBJEXT) \ + print-preview.$(OBJEXT) print.$(OBJEXT) kmz.$(OBJEXT) \ + viklayer_defaults.$(OBJEXT) settings.$(OBJEXT) \ + preferences.$(OBJEXT) misc/fpconv.$(OBJEXT) \ + misc/strtod.$(OBJEXT) misc/kdtree.$(OBJEXT) \ + misc/gtkhtml.$(OBJEXT) $(am__objects_1) $(am__objects_2) \ + $(am__objects_3) $(am__objects_4) $(am__objects_5) \ + $(am__objects_6) $(am__objects_7) $(am__objects_8) \ + $(am__objects_9) $(am__objects_10) $(am__objects_11) +libviking_a_OBJECTS = $(am_libviking_a_OBJECTS) +am_viking_OBJECTS = main.$(OBJEXT) +viking_OBJECTS = $(am_viking_OBJECTS) +viking_LDADD = $(LDADD) +am__DEPENDENCIES_1 = +viking_DEPENDENCIES = $(noinst_LIBRARIES) $(am__DEPENDENCIES_1) \ + icons/libicons.a $(am__append_12) +AM_V_P = $(am__v_P_@AM_V@) +am__v_P_ = $(am__v_P_@AM_DEFAULT_V@) +am__v_P_0 = false +am__v_P_1 = : +AM_V_GEN = $(am__v_GEN_@AM_V@) +am__v_GEN_ = $(am__v_GEN_@AM_DEFAULT_V@) +am__v_GEN_0 = @echo " GEN " $@; +am__v_GEN_1 = +AM_V_at = $(am__v_at_@AM_V@) +am__v_at_ = $(am__v_at_@AM_DEFAULT_V@) +am__v_at_0 = @ +am__v_at_1 = +DEFAULT_INCLUDES = -I.@am__isrc@ +depcomp = $(SHELL) $(top_srcdir)/depcomp +am__maybe_remake_depfiles = depfiles +am__depfiles_remade = ./$(DEPDIR)/acquire.Po ./$(DEPDIR)/babel.Po \ + ./$(DEPDIR)/babel_ui.Po ./$(DEPDIR)/background.Po \ + ./$(DEPDIR)/bing.Po ./$(DEPDIR)/bingmapsource.Po \ + ./$(DEPDIR)/bluemarble.Po ./$(DEPDIR)/clipboard.Po \ + ./$(DEPDIR)/compression.Po ./$(DEPDIR)/coords.Po \ + ./$(DEPDIR)/curl_download.Po ./$(DEPDIR)/datasource_bfilter.Po \ + ./$(DEPDIR)/datasource_file.Po ./$(DEPDIR)/datasource_gc.Po \ + ./$(DEPDIR)/datasource_geojson.Po \ + ./$(DEPDIR)/datasource_geotag.Po ./$(DEPDIR)/datasource_gps.Po \ + ./$(DEPDIR)/datasource_osm.Po \ + ./$(DEPDIR)/datasource_osm_my_traces.Po \ + ./$(DEPDIR)/datasource_routing.Po \ + ./$(DEPDIR)/datasource_url.Po \ + ./$(DEPDIR)/datasource_wikipedia.Po \ + ./$(DEPDIR)/degrees_converters.Po ./$(DEPDIR)/dem.Po \ + ./$(DEPDIR)/dems.Po ./$(DEPDIR)/dialog.Po ./$(DEPDIR)/dir.Po \ + ./$(DEPDIR)/download.Po ./$(DEPDIR)/expedia.Po \ + ./$(DEPDIR)/file.Po ./$(DEPDIR)/file_magic.Po \ + ./$(DEPDIR)/fileutils.Po ./$(DEPDIR)/garminsymbols.Po \ + ./$(DEPDIR)/geojson.Po ./$(DEPDIR)/geonames.Po \ + ./$(DEPDIR)/geonamessearch.Po ./$(DEPDIR)/geotag_exif.Po \ + ./$(DEPDIR)/globals.Po ./$(DEPDIR)/google.Po \ + ./$(DEPDIR)/googlesearch.Po ./$(DEPDIR)/gpsmapper.Po \ + ./$(DEPDIR)/gpspoint.Po ./$(DEPDIR)/gpx.Po ./$(DEPDIR)/jpg.Po \ + ./$(DEPDIR)/kmz.Po ./$(DEPDIR)/libgeoclue.Po \ + ./$(DEPDIR)/main.Po ./$(DEPDIR)/mapcache.Po \ + ./$(DEPDIR)/mapnik_interface.Po ./$(DEPDIR)/maputils.Po \ + ./$(DEPDIR)/md5_hash.Po ./$(DEPDIR)/metatile.Po \ + ./$(DEPDIR)/modules.Po ./$(DEPDIR)/osm-traces.Po \ + ./$(DEPDIR)/osm.Po ./$(DEPDIR)/preferences.Po \ + ./$(DEPDIR)/print-preview.Po ./$(DEPDIR)/print.Po \ + ./$(DEPDIR)/settings.Po ./$(DEPDIR)/srtm_continent.Po \ + ./$(DEPDIR)/terraserver.Po ./$(DEPDIR)/terraservermapsource.Po \ + ./$(DEPDIR)/thumbnails.Po ./$(DEPDIR)/toolbar.Po \ + ./$(DEPDIR)/ui_util.Po ./$(DEPDIR)/uibuilder.Po \ + ./$(DEPDIR)/util.Po ./$(DEPDIR)/vik_compat.Po \ + ./$(DEPDIR)/vikaggregatelayer.Po ./$(DEPDIR)/vikcoord.Po \ + ./$(DEPDIR)/vikcoordlayer.Po \ + ./$(DEPDIR)/vikdatetime_edit_dialog.Po \ + ./$(DEPDIR)/vikdemlayer.Po ./$(DEPDIR)/vikenumtypes.Po \ + ./$(DEPDIR)/vikexttool.Po \ + ./$(DEPDIR)/vikexttool_datasources.Po \ + ./$(DEPDIR)/vikexttools.Po ./$(DEPDIR)/vikfileentry.Po \ + ./$(DEPDIR)/vikfilelist.Po ./$(DEPDIR)/vikgeoreflayer.Po \ + ./$(DEPDIR)/vikgobjectbuilder.Po ./$(DEPDIR)/vikgoto.Po \ + ./$(DEPDIR)/vikgototool.Po ./$(DEPDIR)/vikgotoxmltool.Po \ + ./$(DEPDIR)/vikgpslayer.Po ./$(DEPDIR)/viklayer.Po \ + ./$(DEPDIR)/viklayer_defaults.Po ./$(DEPDIR)/viklayerspanel.Po \ + ./$(DEPDIR)/vikmapniklayer.Po ./$(DEPDIR)/vikmapslayer.Po \ + ./$(DEPDIR)/vikmapslayer_compat.Po ./$(DEPDIR)/vikmapsource.Po \ + ./$(DEPDIR)/vikmapsourcedefault.Po ./$(DEPDIR)/vikmaptype.Po \ + ./$(DEPDIR)/vikradiogroup.Po ./$(DEPDIR)/vikrouting.Po \ + ./$(DEPDIR)/vikroutingengine.Po \ + ./$(DEPDIR)/vikroutingwebengine.Po \ + ./$(DEPDIR)/vikslippymapsource.Po ./$(DEPDIR)/vikstatus.Po \ + ./$(DEPDIR)/viktmsmapsource.Po ./$(DEPDIR)/viktrack.Po \ + ./$(DEPDIR)/viktreeview.Po ./$(DEPDIR)/viktrwlayer.Po \ + ./$(DEPDIR)/viktrwlayer_analysis.Po \ + ./$(DEPDIR)/viktrwlayer_export.Po \ + ./$(DEPDIR)/viktrwlayer_geotag.Po \ + ./$(DEPDIR)/viktrwlayer_propwin.Po \ + ./$(DEPDIR)/viktrwlayer_tpwin.Po \ + ./$(DEPDIR)/viktrwlayer_tracklist.Po \ + ./$(DEPDIR)/viktrwlayer_waypointlist.Po \ + ./$(DEPDIR)/viktrwlayer_wpwin.Po ./$(DEPDIR)/vikutils.Po \ + ./$(DEPDIR)/vikviewport.Po ./$(DEPDIR)/vikwaypoint.Po \ + ./$(DEPDIR)/vikwebtool.Po ./$(DEPDIR)/vikwebtool_datasource.Po \ + ./$(DEPDIR)/vikwebtoolbounds.Po \ + ./$(DEPDIR)/vikwebtoolcenter.Po \ + ./$(DEPDIR)/vikwebtoolformat.Po ./$(DEPDIR)/vikwindow.Po \ + ./$(DEPDIR)/vikwmscmapsource.Po libjpeg/$(DEPDIR)/jpeg-data.Po \ + libjpeg/$(DEPDIR)/jpeg-marker.Po misc/$(DEPDIR)/fpconv.Po \ + misc/$(DEPDIR)/gtkhtml.Po misc/$(DEPDIR)/kdtree.Po \ + misc/$(DEPDIR)/strtod.Po +am__mv = mv -f +COMPILE = $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) \ + $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) +AM_V_CC = $(am__v_CC_@AM_V@) +am__v_CC_ = $(am__v_CC_@AM_DEFAULT_V@) +am__v_CC_0 = @echo " CC " $@; +am__v_CC_1 = +CCLD = $(CC) +LINK = $(CCLD) $(AM_CFLAGS) $(CFLAGS) $(AM_LDFLAGS) $(LDFLAGS) -o $@ +AM_V_CCLD = $(am__v_CCLD_@AM_V@) +am__v_CCLD_ = $(am__v_CCLD_@AM_DEFAULT_V@) +am__v_CCLD_0 = @echo " CCLD " $@; +am__v_CCLD_1 = +CXXCOMPILE = $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) \ + $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) +AM_V_CXX = $(am__v_CXX_@AM_V@) +am__v_CXX_ = $(am__v_CXX_@AM_DEFAULT_V@) +am__v_CXX_0 = @echo " CXX " $@; +am__v_CXX_1 = +CXXLD = $(CXX) +CXXLINK = $(CXXLD) $(AM_CXXFLAGS) $(CXXFLAGS) $(AM_LDFLAGS) $(LDFLAGS) \ + -o $@ +AM_V_CXXLD = $(am__v_CXXLD_@AM_V@) +am__v_CXXLD_ = $(am__v_CXXLD_@AM_DEFAULT_V@) +am__v_CXXLD_0 = @echo " CXXLD " $@; +am__v_CXXLD_1 = +SOURCES = $(libviking_a_SOURCES) $(viking_SOURCES) +DIST_SOURCES = $(am__libviking_a_SOURCES_DIST) $(viking_SOURCES) +RECURSIVE_TARGETS = all-recursive check-recursive cscopelist-recursive \ + ctags-recursive dvi-recursive html-recursive info-recursive \ + install-data-recursive install-dvi-recursive \ + install-exec-recursive install-html-recursive \ + install-info-recursive install-pdf-recursive \ + install-ps-recursive install-recursive installcheck-recursive \ + installdirs-recursive pdf-recursive ps-recursive \ + tags-recursive uninstall-recursive +am__can_run_installinfo = \ + case $$AM_UPDATE_INFO_DIR in \ + n|no|NO) false;; \ + *) (install-info --version) >/dev/null 2>&1;; \ + esac +am__vpath_adj_setup = srcdirstrip=`echo "$(srcdir)" | sed 's|.|.|g'`; +am__vpath_adj = case $$p in \ + $(srcdir)/*) f=`echo "$$p" | sed "s|^$$srcdirstrip/||"`;; \ + *) f=$$p;; \ + esac; +am__strip_dir = f=`echo $$p | sed -e 's|^.*/||'`; +am__install_max = 40 +am__nobase_strip_setup = \ + srcdirstrip=`echo "$(srcdir)" | sed 's/[].[^$$\\*|]/\\\\&/g'` +am__nobase_strip = \ + for p in $$list; do echo "$$p"; done | sed -e "s|$$srcdirstrip/||" +am__nobase_list = $(am__nobase_strip_setup); \ + for p in $$list; do echo "$$p $$p"; done | \ + sed "s| $$srcdirstrip/| |;"' / .*\//!s/ .*/ ./; s,\( .*\)/[^/]*$$,\1,' | \ + $(AWK) 'BEGIN { files["."] = "" } { files[$$2] = files[$$2] " " $$1; \ + if (++n[$$2] == $(am__install_max)) \ + { print $$2, files[$$2]; n[$$2] = 0; files[$$2] = "" } } \ + END { for (dir in files) print dir, files[dir] }' +am__base_list = \ + sed '$$!N;$$!N;$$!N;$$!N;$$!N;$$!N;$$!N;s/\n/ /g' | \ + sed '$$!N;$$!N;$$!N;$$!N;s/\n/ /g' +am__uninstall_files_from_dir = { \ + test -z "$$files" \ + || { test ! -d "$$dir" && test ! -f "$$dir" && test ! -r "$$dir"; } \ + || { echo " ( cd '$$dir' && rm -f" $$files ")"; \ + $(am__cd) "$$dir" && rm -f $$files; }; \ + } +DATA = $(desktop_DATA) +RECURSIVE_CLEAN_TARGETS = mostlyclean-recursive clean-recursive \ + distclean-recursive maintainer-clean-recursive +am__recursive_targets = \ + $(RECURSIVE_TARGETS) \ + $(RECURSIVE_CLEAN_TARGETS) \ + $(am__extra_recursive_targets) +AM_RECURSIVE_TARGETS = $(am__recursive_targets:-recursive=) TAGS CTAGS \ + distdir distdir-am +am__tagged_files = $(HEADERS) $(SOURCES) $(TAGS_FILES) \ + $(LISP)config.h.in +# Read a list of newline-separated strings from the standard input, +# and print each of them once, without duplicates. Input order is +# *not* preserved. +am__uniquify_input = $(AWK) '\ + BEGIN { nonempty = 0; } \ + { items[$$0] = 1; nonempty = 1; } \ + END { if (nonempty) { for (i in items) print i; }; } \ +' +# Make sure the list of sources is unique. This is necessary because, +# e.g., the same source file might be shared among _SOURCES variables +# for different programs/libraries. +am__define_uniq_tagged_files = \ + list='$(am__tagged_files)'; \ + unique=`for i in $$list; do \ + if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \ + done | $(am__uniquify_input)` +ETAGS = etags +CTAGS = ctags +DIST_SUBDIRS = $(SUBDIRS) +am__DIST_COMMON = $(srcdir)/Makefile.in $(srcdir)/config.h.in \ + $(top_srcdir)/depcomp $(top_srcdir)/mkinstalldirs +DISTFILES = $(DIST_COMMON) $(DIST_SOURCES) $(TEXINFOS) $(EXTRA_DIST) +am__relativize = \ + dir0=`pwd`; \ + sed_first='s,^\([^/]*\)/.*$$,\1,'; \ + sed_rest='s,^[^/]*/*,,'; \ + sed_last='s,^.*/\([^/]*\)$$,\1,'; \ + sed_butlast='s,/*[^/]*$$,,'; \ + while test -n "$$dir1"; do \ + first=`echo "$$dir1" | sed -e "$$sed_first"`; \ + if test "$$first" != "."; then \ + if test "$$first" = ".."; then \ + dir2=`echo "$$dir0" | sed -e "$$sed_last"`/"$$dir2"; \ + dir0=`echo "$$dir0" | sed -e "$$sed_butlast"`; \ + else \ + first2=`echo "$$dir2" | sed -e "$$sed_first"`; \ + if test "$$first2" = "$$first"; then \ + dir2=`echo "$$dir2" | sed -e "$$sed_rest"`; \ + else \ + dir2="../$$dir2"; \ + fi; \ + dir0="$$dir0"/"$$first"; \ + fi; \ + fi; \ + dir1=`echo "$$dir1" | sed -e "$$sed_rest"`; \ + done; \ + reldir="$$dir2" +ACLOCAL = @ACLOCAL@ +ACLOCAL_AMFLAGS = @ACLOCAL_AMFLAGS@ +ALL_LINGUAS = @ALL_LINGUAS@ +AMTAR = @AMTAR@ +AM_DEFAULT_VERBOSITY = @AM_DEFAULT_VERBOSITY@ +AUTOCONF = @AUTOCONF@ +AUTOHEADER = @AUTOHEADER@ +AUTOMAKE = @AUTOMAKE@ +AWK = @AWK@ +CATALOGS = @CATALOGS@ +CATOBJEXT = @CATOBJEXT@ +CC = @CC@ +CCDEPMODE = @CCDEPMODE@ +CFLAGS = @CFLAGS@ +CONFIG_STATUS_DEPENDENCIES = @CONFIG_STATUS_DEPENDENCIES@ +CPP = @CPP@ +CPPFLAGS = @CPPFLAGS@ +CXX = @CXX@ +CXXCPP = @CXXCPP@ +CXXDEPMODE = @CXXDEPMODE@ +CXXFLAGS = @CXXFLAGS@ +CYGPATH_W = @CYGPATH_W@ +DATADIRNAME = @DATADIRNAME@ +DB2MAN_XSL = @DB2MAN_XSL@ +DEFS = @DEFS@ +DEPDIR = @DEPDIR@ +DISTCHECK_CONFIGURE_FLAGS = @DISTCHECK_CONFIGURE_FLAGS@ +DOC_USER_FORMATS = @DOC_USER_FORMATS@ +ECHO_C = @ECHO_C@ +ECHO_N = @ECHO_N@ +ECHO_T = @ECHO_T@ +EGREP = @EGREP@ +EXEEXT = @EXEEXT@ +EXPAT_CFLAGS = @EXPAT_CFLAGS@ +EXPAT_LIBS = @EXPAT_LIBS@ +GDK_PIXBUF_CSOURCE = @GDK_PIXBUF_CSOURCE@ +GETTEXT_MACRO_VERSION = @GETTEXT_MACRO_VERSION@ +GETTEXT_PACKAGE = @GETTEXT_PACKAGE@ +GLIB_MKENUMS = @GLIB_MKENUMS@ +GMOFILES = @GMOFILES@ +GMSGFMT = @GMSGFMT@ +GMSGFMT_015 = @GMSGFMT_015@ +GREP = @GREP@ +GTKDOC_CHECK = @GTKDOC_CHECK@ +GTKDOC_CHECK_PATH = @GTKDOC_CHECK_PATH@ +GTKDOC_DEPS_CFLAGS = @GTKDOC_DEPS_CFLAGS@ +GTKDOC_DEPS_LIBS = @GTKDOC_DEPS_LIBS@ +GTKDOC_MKPDF = @GTKDOC_MKPDF@ +GTKDOC_REBASE = @GTKDOC_REBASE@ +HAVE_SCROLLKEEPER = @HAVE_SCROLLKEEPER@ +HELP_DIR = @HELP_DIR@ +HTML_DIR = @HTML_DIR@ +INSTALL = @INSTALL@ +INSTALL_DATA = @INSTALL_DATA@ +INSTALL_PROGRAM = @INSTALL_PROGRAM@ +INSTALL_SCRIPT = @INSTALL_SCRIPT@ +INSTALL_STRIP_PROGRAM = @INSTALL_STRIP_PROGRAM@ +INSTOBJEXT = @INSTOBJEXT@ +INTLLIBS = @INTLLIBS@ +INTLTOOL_EXTRACT = @INTLTOOL_EXTRACT@ +INTLTOOL_MERGE = @INTLTOOL_MERGE@ +INTLTOOL_PERL = @INTLTOOL_PERL@ +INTLTOOL_UPDATE = @INTLTOOL_UPDATE@ +INTLTOOL_V_MERGE = @INTLTOOL_V_MERGE@ +INTLTOOL_V_MERGE_OPTIONS = @INTLTOOL_V_MERGE_OPTIONS@ +INTLTOOL__v_MERGE_ = @INTLTOOL__v_MERGE_@ +INTLTOOL__v_MERGE_0 = @INTLTOOL__v_MERGE_0@ +INTL_MACOSX_LIBS = @INTL_MACOSX_LIBS@ +ISODATE = @ISODATE@ +LDFLAGS = @LDFLAGS@ +LIBCURL = @LIBCURL@ +LIBCURL_CPPFLAGS = @LIBCURL_CPPFLAGS@ +LIBGEOCLUE_CFLAGS = @LIBGEOCLUE_CFLAGS@ +LIBGEOCLUE_LIBS = @LIBGEOCLUE_LIBS@ +LIBICONV = @LIBICONV@ +LIBINTL = @LIBINTL@ +LIBOBJS = @LIBOBJS@ +LIBS = @LIBS@ +LIBZIP_CFLAGS = @LIBZIP_CFLAGS@ +LIBZIP_LIBS = @LIBZIP_LIBS@ +LN_S = @LN_S@ +LTLIBICONV = @LTLIBICONV@ +LTLIBINTL = @LTLIBINTL@ +LTLIBOBJS = @LTLIBOBJS@ +MAKEINFO = @MAKEINFO@ +MKDIR_P = @MKDIR_P@ +MKINSTALLDIRS = @MKINSTALLDIRS@ +MSGFMT = @MSGFMT@ +MSGFMT_015 = @MSGFMT_015@ +MSGFMT_OPTS = @MSGFMT_OPTS@ +MSGMERGE = @MSGMERGE@ +OBJEXT = @OBJEXT@ +OMF_DIR = @OMF_DIR@ +PACKAGE = @PACKAGE@ +PACKAGE_BUGREPORT = @PACKAGE_BUGREPORT@ +PACKAGE_CFLAGS = @PACKAGE_CFLAGS@ +PACKAGE_LIBS = @PACKAGE_LIBS@ +PACKAGE_NAME = @PACKAGE_NAME@ +PACKAGE_STRING = @PACKAGE_STRING@ +PACKAGE_TARNAME = @PACKAGE_TARNAME@ +PACKAGE_URL = @PACKAGE_URL@ +PACKAGE_VERSION = @PACKAGE_VERSION@ +PATH_SEPARATOR = @PATH_SEPARATOR@ +PKG_CONFIG = @PKG_CONFIG@ +PKG_CONFIG_LIBDIR = @PKG_CONFIG_LIBDIR@ +PKG_CONFIG_PATH = @PKG_CONFIG_PATH@ +POFILES = @POFILES@ +POSUB = @POSUB@ +PO_IN_DATADIR_FALSE = @PO_IN_DATADIR_FALSE@ +PO_IN_DATADIR_TRUE = @PO_IN_DATADIR_TRUE@ +RANLIB = @RANLIB@ +SET_MAKE = @SET_MAKE@ +SHELL = @SHELL@ +STRIP = @STRIP@ +USE_NLS = @USE_NLS@ +VERSION = @VERSION@ +XGETTEXT = @XGETTEXT@ +XGETTEXT_015 = @XGETTEXT_015@ +XGETTEXT_EXTRA_OPTIONS = @XGETTEXT_EXTRA_OPTIONS@ +XP = @XP@ +_libcurl_config = @_libcurl_config@ +abs_builddir = @abs_builddir@ +abs_srcdir = @abs_srcdir@ +abs_top_builddir = @abs_top_builddir@ +abs_top_srcdir = @abs_top_srcdir@ +ac_ct_CC = @ac_ct_CC@ +ac_ct_CXX = @ac_ct_CXX@ +am__include = @am__include@ +am__leading_dot = @am__leading_dot@ +am__quote = @am__quote@ +am__tar = @am__tar@ +am__untar = @am__untar@ +bindir = @bindir@ +build = @build@ +build_alias = @build_alias@ +build_cpu = @build_cpu@ +build_os = @build_os@ +build_vendor = @build_vendor@ +builddir = @builddir@ +datadir = @datadir@ +datarootdir = @datarootdir@ +docdir = @docdir@ +dvidir = @dvidir@ +exec_prefix = @exec_prefix@ +host = @host@ +host_alias = @host_alias@ +host_cpu = @host_cpu@ +host_os = @host_os@ +host_vendor = @host_vendor@ +htmldir = @htmldir@ +includedir = @includedir@ +infodir = @infodir@ +install_sh = @install_sh@ +intltool__v_merge_options_ = @intltool__v_merge_options_@ +intltool__v_merge_options_0 = @intltool__v_merge_options_0@ +libdir = @libdir@ +libexecdir = @libexecdir@ +localedir = @localedir@ +localstatedir = @localstatedir@ +mandir = @mandir@ +mkdir_p = @mkdir_p@ +oldincludedir = @oldincludedir@ +pdfdir = @pdfdir@ +prefix = @prefix@ +program_transform_name = @program_transform_name@ +psdir = @psdir@ +runstatedir = @runstatedir@ +sbindir = @sbindir@ +sharedstatedir = @sharedstatedir@ +srcdir = @srcdir@ +sysconfdir = @sysconfdir@ +target = @target@ +target_alias = @target_alias@ +target_cpu = @target_cpu@ +target_os = @target_os@ +target_vendor = @target_vendor@ +top_build_prefix = @top_build_prefix@ +top_builddir = @top_builddir@ +top_srcdir = @top_srcdir@ +SUBDIRS = icons +noinst_LIBRARIES = \ + libviking.a + +BUILT_SOURCES = authors.h documenters.h vikenumtypes.h vikenumtypes.c +EXTRA_DIST = misc/fpconv-license.txt docbook2documenters.xsl \ + vikenumtypes.h.template vikenumtypes.c.template \ + $(desktop_in_files) +ENUM_H_FILES = \ + vikviewport.h + +libviking_a_SOURCES = bbox.h map_ids.h modules.h modules.c \ + curl_download.c curl_download.h compression.c compression.h \ + menu.xml.h degrees_converters.c degrees_converters.h globals.c \ + globals.h viking.h mapcoord.h config.h viktrwlayer.c \ + viktrwlayer.h vik_compat.c vik_compat.h viktrack.c viktrack.h \ + vikwaypoint.c vikwaypoint.h clipboard.c clipboard.h coords.c \ + coords.h gpsmapper.c gpsmapper.h gpspoint.c gpspoint.h \ + geojson.c geojson.h dir.c dir.h file.c file.h fileutils.c \ + fileutils.h file_magic.c file_magic.h authors.h documenters.h \ + dialog.c dialog.h util.c util.h ui_util.c ui_util.h download.c \ + download.h jpg.c jpg.h vikenumtypes.c vikenumtypes.h \ + viktreeview.c viktreeview.h viklayer.c viklayer.h \ + viklayerspanel.c viklayerspanel.h vikcoordlayer.c \ + vikcoordlayer.h vikstatus.c vikstatus.h vikwindow.c \ + vikwindow.h vikviewport.c vikviewport.h vikaggregatelayer.c \ + vikaggregatelayer.h vikgobjectbuilder.c vikgobjectbuilder.h \ + vikgpslayer.c vikgpslayer.h vikgeoreflayer.c vikgeoreflayer.h \ + vikfileentry.c vikfileentry.h vikgototool.c vikgototool.h \ + vikgotoxmltool.c vikgotoxmltool.h vikgoto.c vikgoto.h \ + viktrwlayer_export.c viktrwlayer_export.h viktrwlayer_tpwin.c \ + viktrwlayer_tpwin.h viktrwlayer_wpwin.c viktrwlayer_wpwin.h \ + viktrwlayer_propwin.c viktrwlayer_propwin.h \ + viktrwlayer_analysis.c viktrwlayer_analysis.h \ + viktrwlayer_tracklist.c viktrwlayer_tracklist.h \ + viktrwlayer_waypointlist.c viktrwlayer_waypointlist.h \ + vikrouting.c vikrouting.h vikroutingengine.c \ + vikroutingengine.h vikroutingwebengine.c vikroutingwebengine.h \ + vikutils.c vikutils.h toolbar.c toolbar.h toolbar.xml.h \ + thumbnails.c thumbnails.h md5_hash.c md5_hash.h background.c \ + background.h vikradiogroup.c vikradiogroup.h vikcoord.c \ + vikcoord.h mapcache.c mapcache.h maputils.c maputils.h \ + vikmapsource.c vikmapsource.h vikmapsourcedefault.c \ + vikmapsourcedefault.h vikmapslayer.c vikmapslayer.h \ + vikmapslayer_compat.c vikmapslayer_compat.h vikmaptype.c \ + vikmaptype.h vikslippymapsource.c vikslippymapsource.h \ + vikwmscmapsource.c vikwmscmapsource.h viktmsmapsource.c \ + viktmsmapsource.h metatile.c metatile.h gpx.c gpx.h \ + garminsymbols.c garminsymbols.h acquire.c acquire.h babel.c \ + babel.h babel_ui.c babel_ui.h datasource_file.c \ + datasource_geojson.c datasource_gps.c datasource_gps.h \ + datasource_routing.c datasource_gc.c datasource_bfilter.c \ + datasource_wikipedia.c datasource_url.c datasources.h \ + googlesearch.c googlesearch.h dem.c dem.h vikdemlayer.h \ + vikdemlayer.c vikdatetime_edit_dialog.c \ + vikdatetime_edit_dialog.h vikfilelist.c vikfilelist.h \ + vikexttool.c vikexttool.h vikexttools.c vikexttools.h \ + vikwebtool.c vikwebtool.h vikwebtoolcenter.c \ + vikwebtoolcenter.h vikwebtoolbounds.c vikwebtoolbounds.h \ + vikwebtoolformat.c vikwebtoolformat.h vikexttool_datasources.c \ + vikexttool_datasources.h vikwebtool_datasource.c \ + vikwebtool_datasource.h dems.c dems.h srtm_continent.c \ + uibuilder.c uibuilder.h print-preview.c print-preview.h \ + print.c print.h kmz.c kmz.h viklayer_defaults.c \ + viklayer_defaults.h settings.c settings.h preferences.c \ + preferences.h misc/fpconv.c misc/fpconv.h misc/powers.h \ + misc/strtod.c misc/strtod.h misc/kdtree.c misc/kdtree.h \ + misc/gtkhtml.c misc/gtkhtml-private.h $(am__append_1) \ + $(am__append_2) $(am__append_3) $(am__append_4) \ + $(am__append_5) $(am__append_6) $(am__append_7) \ + $(am__append_8) $(am__append_9) $(am__append_10) \ + $(am__append_11) +viking_SOURCES = main.c +LDADD = $(noinst_LIBRARIES) $(PACKAGE_LIBS) @EXPAT_LIBS@ @LIBCURL@ \ + icons/libicons.a $(am__append_12) +AM_CFLAGS = -Wall -g -D_GNU_SOURCE \ + $(PACKAGE_CFLAGS) \ + @EXPAT_CFLAGS@ @LIBCURL_CPPFLAGS@ @LIBGEOCLUE_CFLAGS@ + +AM_CPPFLAGS = \ + $(PACKAGE_CFLAGS) \ + -DVIKING_DATADIR=\""$(pkgdatadir)"\" \ + -DVIKING_SYSCONFDIR=\""$(sysconfdir)/$(PACKAGE)"\" + +desktopdir = $(datadir)/applications +desktop_in_files = viking.desktop.in +desktop_DATA = $(desktop_in_files:.desktop.in=.desktop) +CLEANFILES = $(BUILT_SOURCES) $(desktop_DATA) +all: $(BUILT_SOURCES) config.h + $(MAKE) $(AM_MAKEFLAGS) all-recursive + +.SUFFIXES: +.SUFFIXES: .c .cpp .o .obj +$(srcdir)/Makefile.in: $(srcdir)/Makefile.am $(am__configure_deps) + @for dep in $?; do \ + case '$(am__configure_deps)' in \ + *$$dep*) \ + ( cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh ) \ + && { if test -f $@; then exit 0; else break; fi; }; \ + exit 1;; \ + esac; \ + done; \ + echo ' cd $(top_srcdir) && $(AUTOMAKE) --gnu src/Makefile'; \ + $(am__cd) $(top_srcdir) && \ + $(AUTOMAKE) --gnu src/Makefile +Makefile: $(srcdir)/Makefile.in $(top_builddir)/config.status + @case '$?' in \ + *config.status*) \ + cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh;; \ + *) \ + echo ' cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__maybe_remake_depfiles)'; \ + cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__maybe_remake_depfiles);; \ + esac; + +$(top_builddir)/config.status: $(top_srcdir)/configure $(CONFIG_STATUS_DEPENDENCIES) + cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh + +$(top_srcdir)/configure: $(am__configure_deps) + cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh +$(ACLOCAL_M4): $(am__aclocal_m4_deps) + cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh +$(am__aclocal_m4_deps): + +config.h: stamp-h1 + @test -f $@ || rm -f stamp-h1 + @test -f $@ || $(MAKE) $(AM_MAKEFLAGS) stamp-h1 + +stamp-h1: $(srcdir)/config.h.in $(top_builddir)/config.status + @rm -f stamp-h1 + cd $(top_builddir) && $(SHELL) ./config.status src/config.h +$(srcdir)/config.h.in: $(am__configure_deps) + ($(am__cd) $(top_srcdir) && $(AUTOHEADER)) + rm -f stamp-h1 + touch $@ + +distclean-hdr: + -rm -f config.h stamp-h1 +install-binPROGRAMS: $(bin_PROGRAMS) + @$(NORMAL_INSTALL) + @list='$(bin_PROGRAMS)'; test -n "$(bindir)" || list=; \ + if test -n "$$list"; then \ + echo " $(MKDIR_P) '$(DESTDIR)$(bindir)'"; \ + $(MKDIR_P) "$(DESTDIR)$(bindir)" || exit 1; \ + fi; \ + for p in $$list; do echo "$$p $$p"; done | \ + sed 's/$(EXEEXT)$$//' | \ + while read p p1; do if test -f $$p \ + ; then echo "$$p"; echo "$$p"; else :; fi; \ + done | \ + sed -e 'p;s,.*/,,;n;h' \ + -e 's|.*|.|' \ + -e 'p;x;s,.*/,,;s/$(EXEEXT)$$//;$(transform);s/$$/$(EXEEXT)/' | \ + sed 'N;N;N;s,\n, ,g' | \ + $(AWK) 'BEGIN { files["."] = ""; dirs["."] = 1 } \ + { d=$$3; if (dirs[d] != 1) { print "d", d; dirs[d] = 1 } \ + if ($$2 == $$4) files[d] = files[d] " " $$1; \ + else { print "f", $$3 "/" $$4, $$1; } } \ + END { for (d in files) print "f", d, files[d] }' | \ + while read type dir files; do \ + if test "$$dir" = .; then dir=; else dir=/$$dir; fi; \ + test -z "$$files" || { \ + echo " $(INSTALL_PROGRAM_ENV) $(INSTALL_PROGRAM) $$files '$(DESTDIR)$(bindir)$$dir'"; \ + $(INSTALL_PROGRAM_ENV) $(INSTALL_PROGRAM) $$files "$(DESTDIR)$(bindir)$$dir" || exit $$?; \ + } \ + ; done + +uninstall-binPROGRAMS: + @$(NORMAL_UNINSTALL) + @list='$(bin_PROGRAMS)'; test -n "$(bindir)" || list=; \ + files=`for p in $$list; do echo "$$p"; done | \ + sed -e 'h;s,^.*/,,;s/$(EXEEXT)$$//;$(transform)' \ + -e 's/$$/$(EXEEXT)/' \ + `; \ + test -n "$$list" || exit 0; \ + echo " ( cd '$(DESTDIR)$(bindir)' && rm -f" $$files ")"; \ + cd "$(DESTDIR)$(bindir)" && rm -f $$files + +clean-binPROGRAMS: + -test -z "$(bin_PROGRAMS)" || rm -f $(bin_PROGRAMS) + +clean-noinstLIBRARIES: + -test -z "$(noinst_LIBRARIES)" || rm -f $(noinst_LIBRARIES) +misc/$(am__dirstamp): + @$(MKDIR_P) misc + @: > misc/$(am__dirstamp) +misc/$(DEPDIR)/$(am__dirstamp): + @$(MKDIR_P) misc/$(DEPDIR) + @: > misc/$(DEPDIR)/$(am__dirstamp) +misc/fpconv.$(OBJEXT): misc/$(am__dirstamp) \ + misc/$(DEPDIR)/$(am__dirstamp) +misc/strtod.$(OBJEXT): misc/$(am__dirstamp) \ + misc/$(DEPDIR)/$(am__dirstamp) +misc/kdtree.$(OBJEXT): misc/$(am__dirstamp) \ + misc/$(DEPDIR)/$(am__dirstamp) +misc/gtkhtml.$(OBJEXT): misc/$(am__dirstamp) \ + misc/$(DEPDIR)/$(am__dirstamp) +libjpeg/$(am__dirstamp): + @$(MKDIR_P) libjpeg + @: > libjpeg/$(am__dirstamp) +libjpeg/$(DEPDIR)/$(am__dirstamp): + @$(MKDIR_P) libjpeg/$(DEPDIR) + @: > libjpeg/$(DEPDIR)/$(am__dirstamp) +libjpeg/jpeg-data.$(OBJEXT): libjpeg/$(am__dirstamp) \ + libjpeg/$(DEPDIR)/$(am__dirstamp) +libjpeg/jpeg-marker.$(OBJEXT): libjpeg/$(am__dirstamp) \ + libjpeg/$(DEPDIR)/$(am__dirstamp) + +libviking.a: $(libviking_a_OBJECTS) $(libviking_a_DEPENDENCIES) $(EXTRA_libviking_a_DEPENDENCIES) + $(AM_V_at)-rm -f libviking.a + $(AM_V_AR)$(libviking_a_AR) libviking.a $(libviking_a_OBJECTS) $(libviking_a_LIBADD) + $(AM_V_at)$(RANLIB) libviking.a + +viking$(EXEEXT): $(viking_OBJECTS) $(viking_DEPENDENCIES) $(EXTRA_viking_DEPENDENCIES) + @rm -f viking$(EXEEXT) + $(AM_V_CCLD)$(LINK) $(viking_OBJECTS) $(viking_LDADD) $(LIBS) + +mostlyclean-compile: + -rm -f *.$(OBJEXT) + -rm -f libjpeg/*.$(OBJEXT) + -rm -f misc/*.$(OBJEXT) + +distclean-compile: + -rm -f *.tab.c + +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/acquire.Po@am__quote@ # am--include-marker +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/babel.Po@am__quote@ # am--include-marker +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/babel_ui.Po@am__quote@ # am--include-marker +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/background.Po@am__quote@ # am--include-marker +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/bing.Po@am__quote@ # am--include-marker +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/bingmapsource.Po@am__quote@ # am--include-marker +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/bluemarble.Po@am__quote@ # am--include-marker +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/clipboard.Po@am__quote@ # am--include-marker +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/compression.Po@am__quote@ # am--include-marker +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/coords.Po@am__quote@ # am--include-marker +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/curl_download.Po@am__quote@ # am--include-marker +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/datasource_bfilter.Po@am__quote@ # am--include-marker +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/datasource_file.Po@am__quote@ # am--include-marker +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/datasource_gc.Po@am__quote@ # am--include-marker +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/datasource_geojson.Po@am__quote@ # am--include-marker +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/datasource_geotag.Po@am__quote@ # am--include-marker +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/datasource_gps.Po@am__quote@ # am--include-marker +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/datasource_osm.Po@am__quote@ # am--include-marker +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/datasource_osm_my_traces.Po@am__quote@ # am--include-marker +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/datasource_routing.Po@am__quote@ # am--include-marker +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/datasource_url.Po@am__quote@ # am--include-marker +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/datasource_wikipedia.Po@am__quote@ # am--include-marker +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/degrees_converters.Po@am__quote@ # am--include-marker +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/dem.Po@am__quote@ # am--include-marker +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/dems.Po@am__quote@ # am--include-marker +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/dialog.Po@am__quote@ # am--include-marker +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/dir.Po@am__quote@ # am--include-marker +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/download.Po@am__quote@ # am--include-marker +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/expedia.Po@am__quote@ # am--include-marker +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/file.Po@am__quote@ # am--include-marker +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/file_magic.Po@am__quote@ # am--include-marker +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/fileutils.Po@am__quote@ # am--include-marker +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/garminsymbols.Po@am__quote@ # am--include-marker +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/geojson.Po@am__quote@ # am--include-marker +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/geonames.Po@am__quote@ # am--include-marker +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/geonamessearch.Po@am__quote@ # am--include-marker +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/geotag_exif.Po@am__quote@ # am--include-marker +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/globals.Po@am__quote@ # am--include-marker +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/google.Po@am__quote@ # am--include-marker +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/googlesearch.Po@am__quote@ # am--include-marker +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/gpsmapper.Po@am__quote@ # am--include-marker +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/gpspoint.Po@am__quote@ # am--include-marker +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/gpx.Po@am__quote@ # am--include-marker +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/jpg.Po@am__quote@ # am--include-marker +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/kmz.Po@am__quote@ # am--include-marker +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libgeoclue.Po@am__quote@ # am--include-marker +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/main.Po@am__quote@ # am--include-marker +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/mapcache.Po@am__quote@ # am--include-marker +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/mapnik_interface.Po@am__quote@ # am--include-marker +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/maputils.Po@am__quote@ # am--include-marker +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/md5_hash.Po@am__quote@ # am--include-marker +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/metatile.Po@am__quote@ # am--include-marker +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/modules.Po@am__quote@ # am--include-marker +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/osm-traces.Po@am__quote@ # am--include-marker +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/osm.Po@am__quote@ # am--include-marker +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/preferences.Po@am__quote@ # am--include-marker +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/print-preview.Po@am__quote@ # am--include-marker +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/print.Po@am__quote@ # am--include-marker +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/settings.Po@am__quote@ # am--include-marker +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/srtm_continent.Po@am__quote@ # am--include-marker +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/terraserver.Po@am__quote@ # am--include-marker +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/terraservermapsource.Po@am__quote@ # am--include-marker +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/thumbnails.Po@am__quote@ # am--include-marker +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/toolbar.Po@am__quote@ # am--include-marker +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/ui_util.Po@am__quote@ # am--include-marker +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/uibuilder.Po@am__quote@ # am--include-marker +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/util.Po@am__quote@ # am--include-marker +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/vik_compat.Po@am__quote@ # am--include-marker +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/vikaggregatelayer.Po@am__quote@ # am--include-marker +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/vikcoord.Po@am__quote@ # am--include-marker +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/vikcoordlayer.Po@am__quote@ # am--include-marker +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/vikdatetime_edit_dialog.Po@am__quote@ # am--include-marker +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/vikdemlayer.Po@am__quote@ # am--include-marker +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/vikenumtypes.Po@am__quote@ # am--include-marker +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/vikexttool.Po@am__quote@ # am--include-marker +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/vikexttool_datasources.Po@am__quote@ # am--include-marker +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/vikexttools.Po@am__quote@ # am--include-marker +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/vikfileentry.Po@am__quote@ # am--include-marker +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/vikfilelist.Po@am__quote@ # am--include-marker +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/vikgeoreflayer.Po@am__quote@ # am--include-marker +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/vikgobjectbuilder.Po@am__quote@ # am--include-marker +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/vikgoto.Po@am__quote@ # am--include-marker +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/vikgototool.Po@am__quote@ # am--include-marker +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/vikgotoxmltool.Po@am__quote@ # am--include-marker +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/vikgpslayer.Po@am__quote@ # am--include-marker +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/viklayer.Po@am__quote@ # am--include-marker +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/viklayer_defaults.Po@am__quote@ # am--include-marker +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/viklayerspanel.Po@am__quote@ # am--include-marker +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/vikmapniklayer.Po@am__quote@ # am--include-marker +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/vikmapslayer.Po@am__quote@ # am--include-marker +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/vikmapslayer_compat.Po@am__quote@ # am--include-marker +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/vikmapsource.Po@am__quote@ # am--include-marker +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/vikmapsourcedefault.Po@am__quote@ # am--include-marker +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/vikmaptype.Po@am__quote@ # am--include-marker +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/vikradiogroup.Po@am__quote@ # am--include-marker +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/vikrouting.Po@am__quote@ # am--include-marker +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/vikroutingengine.Po@am__quote@ # am--include-marker +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/vikroutingwebengine.Po@am__quote@ # am--include-marker +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/vikslippymapsource.Po@am__quote@ # am--include-marker +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/vikstatus.Po@am__quote@ # am--include-marker +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/viktmsmapsource.Po@am__quote@ # am--include-marker +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/viktrack.Po@am__quote@ # am--include-marker +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/viktreeview.Po@am__quote@ # am--include-marker +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/viktrwlayer.Po@am__quote@ # am--include-marker +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/viktrwlayer_analysis.Po@am__quote@ # am--include-marker +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/viktrwlayer_export.Po@am__quote@ # am--include-marker +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/viktrwlayer_geotag.Po@am__quote@ # am--include-marker +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/viktrwlayer_propwin.Po@am__quote@ # am--include-marker +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/viktrwlayer_tpwin.Po@am__quote@ # am--include-marker +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/viktrwlayer_tracklist.Po@am__quote@ # am--include-marker +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/viktrwlayer_waypointlist.Po@am__quote@ # am--include-marker +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/viktrwlayer_wpwin.Po@am__quote@ # am--include-marker +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/vikutils.Po@am__quote@ # am--include-marker +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/vikviewport.Po@am__quote@ # am--include-marker +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/vikwaypoint.Po@am__quote@ # am--include-marker +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/vikwebtool.Po@am__quote@ # am--include-marker +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/vikwebtool_datasource.Po@am__quote@ # am--include-marker +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/vikwebtoolbounds.Po@am__quote@ # am--include-marker +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/vikwebtoolcenter.Po@am__quote@ # am--include-marker +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/vikwebtoolformat.Po@am__quote@ # am--include-marker +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/vikwindow.Po@am__quote@ # am--include-marker +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/vikwmscmapsource.Po@am__quote@ # am--include-marker +@AMDEP_TRUE@@am__include@ @am__quote@libjpeg/$(DEPDIR)/jpeg-data.Po@am__quote@ # am--include-marker +@AMDEP_TRUE@@am__include@ @am__quote@libjpeg/$(DEPDIR)/jpeg-marker.Po@am__quote@ # am--include-marker +@AMDEP_TRUE@@am__include@ @am__quote@misc/$(DEPDIR)/fpconv.Po@am__quote@ # am--include-marker +@AMDEP_TRUE@@am__include@ @am__quote@misc/$(DEPDIR)/gtkhtml.Po@am__quote@ # am--include-marker +@AMDEP_TRUE@@am__include@ @am__quote@misc/$(DEPDIR)/kdtree.Po@am__quote@ # am--include-marker +@AMDEP_TRUE@@am__include@ @am__quote@misc/$(DEPDIR)/strtod.Po@am__quote@ # am--include-marker + +$(am__depfiles_remade): + @$(MKDIR_P) $(@D) + @echo '# dummy' >$@-t && $(am__mv) $@-t $@ + +am--depfiles: $(am__depfiles_remade) + +.c.o: +@am__fastdepCC_TRUE@ $(AM_V_CC)depbase=`echo $@ | sed 's|[^/]*$$|$(DEPDIR)/&|;s|\.o$$||'`;\ +@am__fastdepCC_TRUE@ $(COMPILE) -MT $@ -MD -MP -MF $$depbase.Tpo -c -o $@ $< &&\ +@am__fastdepCC_TRUE@ $(am__mv) $$depbase.Tpo $$depbase.Po +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='$<' object='$@' libtool=no @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(COMPILE) -c -o $@ $< + +.c.obj: +@am__fastdepCC_TRUE@ $(AM_V_CC)depbase=`echo $@ | sed 's|[^/]*$$|$(DEPDIR)/&|;s|\.obj$$||'`;\ +@am__fastdepCC_TRUE@ $(COMPILE) -MT $@ -MD -MP -MF $$depbase.Tpo -c -o $@ `$(CYGPATH_W) '$<'` &&\ +@am__fastdepCC_TRUE@ $(am__mv) $$depbase.Tpo $$depbase.Po +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='$<' object='$@' libtool=no @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(COMPILE) -c -o $@ `$(CYGPATH_W) '$<'` + +.cpp.o: +@am__fastdepCXX_TRUE@ $(AM_V_CXX)depbase=`echo $@ | sed 's|[^/]*$$|$(DEPDIR)/&|;s|\.o$$||'`;\ +@am__fastdepCXX_TRUE@ $(CXXCOMPILE) -MT $@ -MD -MP -MF $$depbase.Tpo -c -o $@ $< &&\ +@am__fastdepCXX_TRUE@ $(am__mv) $$depbase.Tpo $$depbase.Po +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='$<' object='$@' libtool=no @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXXCOMPILE) -c -o $@ $< + +.cpp.obj: +@am__fastdepCXX_TRUE@ $(AM_V_CXX)depbase=`echo $@ | sed 's|[^/]*$$|$(DEPDIR)/&|;s|\.obj$$||'`;\ +@am__fastdepCXX_TRUE@ $(CXXCOMPILE) -MT $@ -MD -MP -MF $$depbase.Tpo -c -o $@ `$(CYGPATH_W) '$<'` &&\ +@am__fastdepCXX_TRUE@ $(am__mv) $$depbase.Tpo $$depbase.Po +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='$<' object='$@' libtool=no @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXXCOMPILE) -c -o $@ `$(CYGPATH_W) '$<'` +install-desktopDATA: $(desktop_DATA) + @$(NORMAL_INSTALL) + @list='$(desktop_DATA)'; test -n "$(desktopdir)" || list=; \ + if test -n "$$list"; then \ + echo " $(MKDIR_P) '$(DESTDIR)$(desktopdir)'"; \ + $(MKDIR_P) "$(DESTDIR)$(desktopdir)" || exit 1; \ + fi; \ + for p in $$list; do \ + if test -f "$$p"; then d=; else d="$(srcdir)/"; fi; \ + echo "$$d$$p"; \ + done | $(am__base_list) | \ + while read files; do \ + echo " $(INSTALL_DATA) $$files '$(DESTDIR)$(desktopdir)'"; \ + $(INSTALL_DATA) $$files "$(DESTDIR)$(desktopdir)" || exit $$?; \ + done + +uninstall-desktopDATA: + @$(NORMAL_UNINSTALL) + @list='$(desktop_DATA)'; test -n "$(desktopdir)" || list=; \ + files=`for p in $$list; do echo $$p; done | sed -e 's|^.*/||'`; \ + dir='$(DESTDIR)$(desktopdir)'; $(am__uninstall_files_from_dir) + +# This directory's subdirectories are mostly independent; you can cd +# into them and run 'make' without going through this Makefile. +# To change the values of 'make' variables: instead of editing Makefiles, +# (1) if the variable is set in 'config.status', edit 'config.status' +# (which will cause the Makefiles to be regenerated when you run 'make'); +# (2) otherwise, pass the desired values on the 'make' command line. +$(am__recursive_targets): + @fail=; \ + if $(am__make_keepgoing); then \ + failcom='fail=yes'; \ + else \ + failcom='exit 1'; \ + fi; \ + dot_seen=no; \ + target=`echo $@ | sed s/-recursive//`; \ + case "$@" in \ + distclean-* | maintainer-clean-*) list='$(DIST_SUBDIRS)' ;; \ + *) list='$(SUBDIRS)' ;; \ + esac; \ + for subdir in $$list; do \ + echo "Making $$target in $$subdir"; \ + if test "$$subdir" = "."; then \ + dot_seen=yes; \ + local_target="$$target-am"; \ + else \ + local_target="$$target"; \ + fi; \ + ($(am__cd) $$subdir && $(MAKE) $(AM_MAKEFLAGS) $$local_target) \ + || eval $$failcom; \ + done; \ + if test "$$dot_seen" = "no"; then \ + $(MAKE) $(AM_MAKEFLAGS) "$$target-am" || exit 1; \ + fi; test -z "$$fail" + +ID: $(am__tagged_files) + $(am__define_uniq_tagged_files); mkid -fID $$unique +tags: tags-recursive +TAGS: tags + +tags-am: $(TAGS_DEPENDENCIES) $(am__tagged_files) + set x; \ + here=`pwd`; \ + if ($(ETAGS) --etags-include --version) >/dev/null 2>&1; then \ + include_option=--etags-include; \ + empty_fix=.; \ + else \ + include_option=--include; \ + empty_fix=; \ + fi; \ + list='$(SUBDIRS)'; for subdir in $$list; do \ + if test "$$subdir" = .; then :; else \ + test ! -f $$subdir/TAGS || \ + set "$$@" "$$include_option=$$here/$$subdir/TAGS"; \ + fi; \ + done; \ + $(am__define_uniq_tagged_files); \ + shift; \ + if test -z "$(ETAGS_ARGS)$$*$$unique"; then :; else \ + test -n "$$unique" || unique=$$empty_fix; \ + if test $$# -gt 0; then \ + $(ETAGS) $(ETAGSFLAGS) $(AM_ETAGSFLAGS) $(ETAGS_ARGS) \ + "$$@" $$unique; \ + else \ + $(ETAGS) $(ETAGSFLAGS) $(AM_ETAGSFLAGS) $(ETAGS_ARGS) \ + $$unique; \ + fi; \ + fi +ctags: ctags-recursive + +CTAGS: ctags +ctags-am: $(TAGS_DEPENDENCIES) $(am__tagged_files) + $(am__define_uniq_tagged_files); \ + test -z "$(CTAGS_ARGS)$$unique" \ + || $(CTAGS) $(CTAGSFLAGS) $(AM_CTAGSFLAGS) $(CTAGS_ARGS) \ + $$unique + +GTAGS: + here=`$(am__cd) $(top_builddir) && pwd` \ + && $(am__cd) $(top_srcdir) \ + && gtags -i $(GTAGS_ARGS) "$$here" +cscopelist: cscopelist-recursive + +cscopelist-am: $(am__tagged_files) + list='$(am__tagged_files)'; \ + case "$(srcdir)" in \ + [\\/]* | ?:[\\/]*) sdir="$(srcdir)" ;; \ + *) sdir=$(subdir)/$(srcdir) ;; \ + esac; \ + for i in $$list; do \ + if test -f "$$i"; then \ + echo "$(subdir)/$$i"; \ + else \ + echo "$$sdir/$$i"; \ + fi; \ + done >> $(top_builddir)/cscope.files + +distclean-tags: + -rm -f TAGS ID GTAGS GRTAGS GSYMS GPATH tags + +distdir: $(BUILT_SOURCES) + $(MAKE) $(AM_MAKEFLAGS) distdir-am + +distdir-am: $(DISTFILES) + @srcdirstrip=`echo "$(srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \ + topsrcdirstrip=`echo "$(top_srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \ + list='$(DISTFILES)'; \ + dist_files=`for file in $$list; do echo $$file; done | \ + sed -e "s|^$$srcdirstrip/||;t" \ + -e "s|^$$topsrcdirstrip/|$(top_builddir)/|;t"`; \ + case $$dist_files in \ + */*) $(MKDIR_P) `echo "$$dist_files" | \ + sed '/\//!d;s|^|$(distdir)/|;s,/[^/]*$$,,' | \ + sort -u` ;; \ + esac; \ + for file in $$dist_files; do \ + if test -f $$file || test -d $$file; then d=.; else d=$(srcdir); fi; \ + if test -d $$d/$$file; then \ + dir=`echo "/$$file" | sed -e 's,/[^/]*$$,,'`; \ + if test -d "$(distdir)/$$file"; then \ + find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \ + fi; \ + if test -d $(srcdir)/$$file && test $$d != $(srcdir); then \ + cp -fpR $(srcdir)/$$file "$(distdir)$$dir" || exit 1; \ + find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \ + fi; \ + cp -fpR $$d/$$file "$(distdir)$$dir" || exit 1; \ + else \ + test -f "$(distdir)/$$file" \ + || cp -p $$d/$$file "$(distdir)/$$file" \ + || exit 1; \ + fi; \ + done + @list='$(DIST_SUBDIRS)'; for subdir in $$list; do \ + if test "$$subdir" = .; then :; else \ + $(am__make_dryrun) \ + || test -d "$(distdir)/$$subdir" \ + || $(MKDIR_P) "$(distdir)/$$subdir" \ + || exit 1; \ + dir1=$$subdir; dir2="$(distdir)/$$subdir"; \ + $(am__relativize); \ + new_distdir=$$reldir; \ + dir1=$$subdir; dir2="$(top_distdir)"; \ + $(am__relativize); \ + new_top_distdir=$$reldir; \ + echo " (cd $$subdir && $(MAKE) $(AM_MAKEFLAGS) top_distdir="$$new_top_distdir" distdir="$$new_distdir" \\"; \ + echo " am__remove_distdir=: am__skip_length_check=: am__skip_mode_fix=: distdir)"; \ + ($(am__cd) $$subdir && \ + $(MAKE) $(AM_MAKEFLAGS) \ + top_distdir="$$new_top_distdir" \ + distdir="$$new_distdir" \ + am__remove_distdir=: \ + am__skip_length_check=: \ + am__skip_mode_fix=: \ + distdir) \ + || exit 1; \ + fi; \ + done +check-am: all-am +check: $(BUILT_SOURCES) + $(MAKE) $(AM_MAKEFLAGS) check-recursive +all-am: Makefile $(PROGRAMS) $(LIBRARIES) $(DATA) config.h +installdirs: installdirs-recursive +installdirs-am: + for dir in "$(DESTDIR)$(bindir)" "$(DESTDIR)$(desktopdir)"; do \ + test -z "$$dir" || $(MKDIR_P) "$$dir"; \ + done +install: $(BUILT_SOURCES) + $(MAKE) $(AM_MAKEFLAGS) install-recursive +install-exec: install-exec-recursive +install-data: install-data-recursive +uninstall: uninstall-recursive + +install-am: all-am + @$(MAKE) $(AM_MAKEFLAGS) install-exec-am install-data-am + +installcheck: installcheck-recursive +install-strip: + if test -z '$(STRIP)'; then \ + $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \ + install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \ + install; \ + else \ + $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \ + install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \ + "INSTALL_PROGRAM_ENV=STRIPPROG='$(STRIP)'" install; \ + fi +mostlyclean-generic: + +clean-generic: + -test -z "$(CLEANFILES)" || rm -f $(CLEANFILES) + +distclean-generic: + -test -z "$(CONFIG_CLEAN_FILES)" || rm -f $(CONFIG_CLEAN_FILES) + -test . = "$(srcdir)" || test -z "$(CONFIG_CLEAN_VPATH_FILES)" || rm -f $(CONFIG_CLEAN_VPATH_FILES) + -rm -f libjpeg/$(DEPDIR)/$(am__dirstamp) + -rm -f libjpeg/$(am__dirstamp) + -rm -f misc/$(DEPDIR)/$(am__dirstamp) + -rm -f misc/$(am__dirstamp) + +maintainer-clean-generic: + @echo "This command is intended for maintainers to use" + @echo "it deletes files that may require special tools to rebuild." + -test -z "$(BUILT_SOURCES)" || rm -f $(BUILT_SOURCES) +clean: clean-recursive + +clean-am: clean-binPROGRAMS clean-generic clean-noinstLIBRARIES \ + mostlyclean-am + +distclean: distclean-recursive + -rm -f ./$(DEPDIR)/acquire.Po + -rm -f ./$(DEPDIR)/babel.Po + -rm -f ./$(DEPDIR)/babel_ui.Po + -rm -f ./$(DEPDIR)/background.Po + -rm -f ./$(DEPDIR)/bing.Po + -rm -f ./$(DEPDIR)/bingmapsource.Po + -rm -f ./$(DEPDIR)/bluemarble.Po + -rm -f ./$(DEPDIR)/clipboard.Po + -rm -f ./$(DEPDIR)/compression.Po + -rm -f ./$(DEPDIR)/coords.Po + -rm -f ./$(DEPDIR)/curl_download.Po + -rm -f ./$(DEPDIR)/datasource_bfilter.Po + -rm -f ./$(DEPDIR)/datasource_file.Po + -rm -f ./$(DEPDIR)/datasource_gc.Po + -rm -f ./$(DEPDIR)/datasource_geojson.Po + -rm -f ./$(DEPDIR)/datasource_geotag.Po + -rm -f ./$(DEPDIR)/datasource_gps.Po + -rm -f ./$(DEPDIR)/datasource_osm.Po + -rm -f ./$(DEPDIR)/datasource_osm_my_traces.Po + -rm -f ./$(DEPDIR)/datasource_routing.Po + -rm -f ./$(DEPDIR)/datasource_url.Po + -rm -f ./$(DEPDIR)/datasource_wikipedia.Po + -rm -f ./$(DEPDIR)/degrees_converters.Po + -rm -f ./$(DEPDIR)/dem.Po + -rm -f ./$(DEPDIR)/dems.Po + -rm -f ./$(DEPDIR)/dialog.Po + -rm -f ./$(DEPDIR)/dir.Po + -rm -f ./$(DEPDIR)/download.Po + -rm -f ./$(DEPDIR)/expedia.Po + -rm -f ./$(DEPDIR)/file.Po + -rm -f ./$(DEPDIR)/file_magic.Po + -rm -f ./$(DEPDIR)/fileutils.Po + -rm -f ./$(DEPDIR)/garminsymbols.Po + -rm -f ./$(DEPDIR)/geojson.Po + -rm -f ./$(DEPDIR)/geonames.Po + -rm -f ./$(DEPDIR)/geonamessearch.Po + -rm -f ./$(DEPDIR)/geotag_exif.Po + -rm -f ./$(DEPDIR)/globals.Po + -rm -f ./$(DEPDIR)/google.Po + -rm -f ./$(DEPDIR)/googlesearch.Po + -rm -f ./$(DEPDIR)/gpsmapper.Po + -rm -f ./$(DEPDIR)/gpspoint.Po + -rm -f ./$(DEPDIR)/gpx.Po + -rm -f ./$(DEPDIR)/jpg.Po + -rm -f ./$(DEPDIR)/kmz.Po + -rm -f ./$(DEPDIR)/libgeoclue.Po + -rm -f ./$(DEPDIR)/main.Po + -rm -f ./$(DEPDIR)/mapcache.Po + -rm -f ./$(DEPDIR)/mapnik_interface.Po + -rm -f ./$(DEPDIR)/maputils.Po + -rm -f ./$(DEPDIR)/md5_hash.Po + -rm -f ./$(DEPDIR)/metatile.Po + -rm -f ./$(DEPDIR)/modules.Po + -rm -f ./$(DEPDIR)/osm-traces.Po + -rm -f ./$(DEPDIR)/osm.Po + -rm -f ./$(DEPDIR)/preferences.Po + -rm -f ./$(DEPDIR)/print-preview.Po + -rm -f ./$(DEPDIR)/print.Po + -rm -f ./$(DEPDIR)/settings.Po + -rm -f ./$(DEPDIR)/srtm_continent.Po + -rm -f ./$(DEPDIR)/terraserver.Po + -rm -f ./$(DEPDIR)/terraservermapsource.Po + -rm -f ./$(DEPDIR)/thumbnails.Po + -rm -f ./$(DEPDIR)/toolbar.Po + -rm -f ./$(DEPDIR)/ui_util.Po + -rm -f ./$(DEPDIR)/uibuilder.Po + -rm -f ./$(DEPDIR)/util.Po + -rm -f ./$(DEPDIR)/vik_compat.Po + -rm -f ./$(DEPDIR)/vikaggregatelayer.Po + -rm -f ./$(DEPDIR)/vikcoord.Po + -rm -f ./$(DEPDIR)/vikcoordlayer.Po + -rm -f ./$(DEPDIR)/vikdatetime_edit_dialog.Po + -rm -f ./$(DEPDIR)/vikdemlayer.Po + -rm -f ./$(DEPDIR)/vikenumtypes.Po + -rm -f ./$(DEPDIR)/vikexttool.Po + -rm -f ./$(DEPDIR)/vikexttool_datasources.Po + -rm -f ./$(DEPDIR)/vikexttools.Po + -rm -f ./$(DEPDIR)/vikfileentry.Po + -rm -f ./$(DEPDIR)/vikfilelist.Po + -rm -f ./$(DEPDIR)/vikgeoreflayer.Po + -rm -f ./$(DEPDIR)/vikgobjectbuilder.Po + -rm -f ./$(DEPDIR)/vikgoto.Po + -rm -f ./$(DEPDIR)/vikgototool.Po + -rm -f ./$(DEPDIR)/vikgotoxmltool.Po + -rm -f ./$(DEPDIR)/vikgpslayer.Po + -rm -f ./$(DEPDIR)/viklayer.Po + -rm -f ./$(DEPDIR)/viklayer_defaults.Po + -rm -f ./$(DEPDIR)/viklayerspanel.Po + -rm -f ./$(DEPDIR)/vikmapniklayer.Po + -rm -f ./$(DEPDIR)/vikmapslayer.Po + -rm -f ./$(DEPDIR)/vikmapslayer_compat.Po + -rm -f ./$(DEPDIR)/vikmapsource.Po + -rm -f ./$(DEPDIR)/vikmapsourcedefault.Po + -rm -f ./$(DEPDIR)/vikmaptype.Po + -rm -f ./$(DEPDIR)/vikradiogroup.Po + -rm -f ./$(DEPDIR)/vikrouting.Po + -rm -f ./$(DEPDIR)/vikroutingengine.Po + -rm -f ./$(DEPDIR)/vikroutingwebengine.Po + -rm -f ./$(DEPDIR)/vikslippymapsource.Po + -rm -f ./$(DEPDIR)/vikstatus.Po + -rm -f ./$(DEPDIR)/viktmsmapsource.Po + -rm -f ./$(DEPDIR)/viktrack.Po + -rm -f ./$(DEPDIR)/viktreeview.Po + -rm -f ./$(DEPDIR)/viktrwlayer.Po + -rm -f ./$(DEPDIR)/viktrwlayer_analysis.Po + -rm -f ./$(DEPDIR)/viktrwlayer_export.Po + -rm -f ./$(DEPDIR)/viktrwlayer_geotag.Po + -rm -f ./$(DEPDIR)/viktrwlayer_propwin.Po + -rm -f ./$(DEPDIR)/viktrwlayer_tpwin.Po + -rm -f ./$(DEPDIR)/viktrwlayer_tracklist.Po + -rm -f ./$(DEPDIR)/viktrwlayer_waypointlist.Po + -rm -f ./$(DEPDIR)/viktrwlayer_wpwin.Po + -rm -f ./$(DEPDIR)/vikutils.Po + -rm -f ./$(DEPDIR)/vikviewport.Po + -rm -f ./$(DEPDIR)/vikwaypoint.Po + -rm -f ./$(DEPDIR)/vikwebtool.Po + -rm -f ./$(DEPDIR)/vikwebtool_datasource.Po + -rm -f ./$(DEPDIR)/vikwebtoolbounds.Po + -rm -f ./$(DEPDIR)/vikwebtoolcenter.Po + -rm -f ./$(DEPDIR)/vikwebtoolformat.Po + -rm -f ./$(DEPDIR)/vikwindow.Po + -rm -f ./$(DEPDIR)/vikwmscmapsource.Po + -rm -f libjpeg/$(DEPDIR)/jpeg-data.Po + -rm -f libjpeg/$(DEPDIR)/jpeg-marker.Po + -rm -f misc/$(DEPDIR)/fpconv.Po + -rm -f misc/$(DEPDIR)/gtkhtml.Po + -rm -f misc/$(DEPDIR)/kdtree.Po + -rm -f misc/$(DEPDIR)/strtod.Po + -rm -f Makefile +distclean-am: clean-am distclean-compile distclean-generic \ + distclean-hdr distclean-tags + +dvi: dvi-recursive + +dvi-am: + +html: html-recursive + +html-am: + +info: info-recursive + +info-am: + +install-data-am: install-desktopDATA + +install-dvi: install-dvi-recursive + +install-dvi-am: + +install-exec-am: install-binPROGRAMS + +install-html: install-html-recursive + +install-html-am: + +install-info: install-info-recursive + +install-info-am: + +install-man: + +install-pdf: install-pdf-recursive + +install-pdf-am: + +install-ps: install-ps-recursive + +install-ps-am: + +installcheck-am: + +maintainer-clean: maintainer-clean-recursive + -rm -f ./$(DEPDIR)/acquire.Po + -rm -f ./$(DEPDIR)/babel.Po + -rm -f ./$(DEPDIR)/babel_ui.Po + -rm -f ./$(DEPDIR)/background.Po + -rm -f ./$(DEPDIR)/bing.Po + -rm -f ./$(DEPDIR)/bingmapsource.Po + -rm -f ./$(DEPDIR)/bluemarble.Po + -rm -f ./$(DEPDIR)/clipboard.Po + -rm -f ./$(DEPDIR)/compression.Po + -rm -f ./$(DEPDIR)/coords.Po + -rm -f ./$(DEPDIR)/curl_download.Po + -rm -f ./$(DEPDIR)/datasource_bfilter.Po + -rm -f ./$(DEPDIR)/datasource_file.Po + -rm -f ./$(DEPDIR)/datasource_gc.Po + -rm -f ./$(DEPDIR)/datasource_geojson.Po + -rm -f ./$(DEPDIR)/datasource_geotag.Po + -rm -f ./$(DEPDIR)/datasource_gps.Po + -rm -f ./$(DEPDIR)/datasource_osm.Po + -rm -f ./$(DEPDIR)/datasource_osm_my_traces.Po + -rm -f ./$(DEPDIR)/datasource_routing.Po + -rm -f ./$(DEPDIR)/datasource_url.Po + -rm -f ./$(DEPDIR)/datasource_wikipedia.Po + -rm -f ./$(DEPDIR)/degrees_converters.Po + -rm -f ./$(DEPDIR)/dem.Po + -rm -f ./$(DEPDIR)/dems.Po + -rm -f ./$(DEPDIR)/dialog.Po + -rm -f ./$(DEPDIR)/dir.Po + -rm -f ./$(DEPDIR)/download.Po + -rm -f ./$(DEPDIR)/expedia.Po + -rm -f ./$(DEPDIR)/file.Po + -rm -f ./$(DEPDIR)/file_magic.Po + -rm -f ./$(DEPDIR)/fileutils.Po + -rm -f ./$(DEPDIR)/garminsymbols.Po + -rm -f ./$(DEPDIR)/geojson.Po + -rm -f ./$(DEPDIR)/geonames.Po + -rm -f ./$(DEPDIR)/geonamessearch.Po + -rm -f ./$(DEPDIR)/geotag_exif.Po + -rm -f ./$(DEPDIR)/globals.Po + -rm -f ./$(DEPDIR)/google.Po + -rm -f ./$(DEPDIR)/googlesearch.Po + -rm -f ./$(DEPDIR)/gpsmapper.Po + -rm -f ./$(DEPDIR)/gpspoint.Po + -rm -f ./$(DEPDIR)/gpx.Po + -rm -f ./$(DEPDIR)/jpg.Po + -rm -f ./$(DEPDIR)/kmz.Po + -rm -f ./$(DEPDIR)/libgeoclue.Po + -rm -f ./$(DEPDIR)/main.Po + -rm -f ./$(DEPDIR)/mapcache.Po + -rm -f ./$(DEPDIR)/mapnik_interface.Po + -rm -f ./$(DEPDIR)/maputils.Po + -rm -f ./$(DEPDIR)/md5_hash.Po + -rm -f ./$(DEPDIR)/metatile.Po + -rm -f ./$(DEPDIR)/modules.Po + -rm -f ./$(DEPDIR)/osm-traces.Po + -rm -f ./$(DEPDIR)/osm.Po + -rm -f ./$(DEPDIR)/preferences.Po + -rm -f ./$(DEPDIR)/print-preview.Po + -rm -f ./$(DEPDIR)/print.Po + -rm -f ./$(DEPDIR)/settings.Po + -rm -f ./$(DEPDIR)/srtm_continent.Po + -rm -f ./$(DEPDIR)/terraserver.Po + -rm -f ./$(DEPDIR)/terraservermapsource.Po + -rm -f ./$(DEPDIR)/thumbnails.Po + -rm -f ./$(DEPDIR)/toolbar.Po + -rm -f ./$(DEPDIR)/ui_util.Po + -rm -f ./$(DEPDIR)/uibuilder.Po + -rm -f ./$(DEPDIR)/util.Po + -rm -f ./$(DEPDIR)/vik_compat.Po + -rm -f ./$(DEPDIR)/vikaggregatelayer.Po + -rm -f ./$(DEPDIR)/vikcoord.Po + -rm -f ./$(DEPDIR)/vikcoordlayer.Po + -rm -f ./$(DEPDIR)/vikdatetime_edit_dialog.Po + -rm -f ./$(DEPDIR)/vikdemlayer.Po + -rm -f ./$(DEPDIR)/vikenumtypes.Po + -rm -f ./$(DEPDIR)/vikexttool.Po + -rm -f ./$(DEPDIR)/vikexttool_datasources.Po + -rm -f ./$(DEPDIR)/vikexttools.Po + -rm -f ./$(DEPDIR)/vikfileentry.Po + -rm -f ./$(DEPDIR)/vikfilelist.Po + -rm -f ./$(DEPDIR)/vikgeoreflayer.Po + -rm -f ./$(DEPDIR)/vikgobjectbuilder.Po + -rm -f ./$(DEPDIR)/vikgoto.Po + -rm -f ./$(DEPDIR)/vikgototool.Po + -rm -f ./$(DEPDIR)/vikgotoxmltool.Po + -rm -f ./$(DEPDIR)/vikgpslayer.Po + -rm -f ./$(DEPDIR)/viklayer.Po + -rm -f ./$(DEPDIR)/viklayer_defaults.Po + -rm -f ./$(DEPDIR)/viklayerspanel.Po + -rm -f ./$(DEPDIR)/vikmapniklayer.Po + -rm -f ./$(DEPDIR)/vikmapslayer.Po + -rm -f ./$(DEPDIR)/vikmapslayer_compat.Po + -rm -f ./$(DEPDIR)/vikmapsource.Po + -rm -f ./$(DEPDIR)/vikmapsourcedefault.Po + -rm -f ./$(DEPDIR)/vikmaptype.Po + -rm -f ./$(DEPDIR)/vikradiogroup.Po + -rm -f ./$(DEPDIR)/vikrouting.Po + -rm -f ./$(DEPDIR)/vikroutingengine.Po + -rm -f ./$(DEPDIR)/vikroutingwebengine.Po + -rm -f ./$(DEPDIR)/vikslippymapsource.Po + -rm -f ./$(DEPDIR)/vikstatus.Po + -rm -f ./$(DEPDIR)/viktmsmapsource.Po + -rm -f ./$(DEPDIR)/viktrack.Po + -rm -f ./$(DEPDIR)/viktreeview.Po + -rm -f ./$(DEPDIR)/viktrwlayer.Po + -rm -f ./$(DEPDIR)/viktrwlayer_analysis.Po + -rm -f ./$(DEPDIR)/viktrwlayer_export.Po + -rm -f ./$(DEPDIR)/viktrwlayer_geotag.Po + -rm -f ./$(DEPDIR)/viktrwlayer_propwin.Po + -rm -f ./$(DEPDIR)/viktrwlayer_tpwin.Po + -rm -f ./$(DEPDIR)/viktrwlayer_tracklist.Po + -rm -f ./$(DEPDIR)/viktrwlayer_waypointlist.Po + -rm -f ./$(DEPDIR)/viktrwlayer_wpwin.Po + -rm -f ./$(DEPDIR)/vikutils.Po + -rm -f ./$(DEPDIR)/vikviewport.Po + -rm -f ./$(DEPDIR)/vikwaypoint.Po + -rm -f ./$(DEPDIR)/vikwebtool.Po + -rm -f ./$(DEPDIR)/vikwebtool_datasource.Po + -rm -f ./$(DEPDIR)/vikwebtoolbounds.Po + -rm -f ./$(DEPDIR)/vikwebtoolcenter.Po + -rm -f ./$(DEPDIR)/vikwebtoolformat.Po + -rm -f ./$(DEPDIR)/vikwindow.Po + -rm -f ./$(DEPDIR)/vikwmscmapsource.Po + -rm -f libjpeg/$(DEPDIR)/jpeg-data.Po + -rm -f libjpeg/$(DEPDIR)/jpeg-marker.Po + -rm -f misc/$(DEPDIR)/fpconv.Po + -rm -f misc/$(DEPDIR)/gtkhtml.Po + -rm -f misc/$(DEPDIR)/kdtree.Po + -rm -f misc/$(DEPDIR)/strtod.Po + -rm -f Makefile +maintainer-clean-am: distclean-am maintainer-clean-generic + +mostlyclean: mostlyclean-recursive + +mostlyclean-am: mostlyclean-compile mostlyclean-generic + +pdf: pdf-recursive + +pdf-am: + +ps: ps-recursive + +ps-am: + +uninstall-am: uninstall-binPROGRAMS uninstall-desktopDATA + +.MAKE: $(am__recursive_targets) all check install install-am \ + install-strip + +.PHONY: $(am__recursive_targets) CTAGS GTAGS TAGS all all-am \ + am--depfiles check check-am clean clean-binPROGRAMS \ + clean-generic clean-noinstLIBRARIES cscopelist-am ctags \ + ctags-am distclean distclean-compile distclean-generic \ + distclean-hdr distclean-tags distdir dvi dvi-am html html-am \ + info info-am install install-am install-binPROGRAMS \ + install-data install-data-am install-desktopDATA install-dvi \ + install-dvi-am install-exec install-exec-am install-html \ + install-html-am install-info install-info-am install-man \ + install-pdf install-pdf-am install-ps install-ps-am \ + install-strip installcheck installcheck-am installdirs \ + installdirs-am maintainer-clean maintainer-clean-generic \ + mostlyclean mostlyclean-compile mostlyclean-generic pdf pdf-am \ + ps ps-am tags tags-am uninstall uninstall-am \ + uninstall-binPROGRAMS uninstall-desktopDATA + +.PRECIOUS: Makefile + +# libdtoa.a + +authors.h: $(top_srcdir)/AUTHORS + rm -f $@ + echo "/* Generated file. */" >> $@ + echo "const gchar *AUTHORS[] = {\\" >> $@ + sed -e "s/ \*\*.*//" -e 's/^/"/' -e 's/$$/",\\/' -e '$$s/\\$$//' $< >> $@ + echo "NULL};" >> $@ + +@HAVE_XSLTPROC_TRUE@documenters.h: $(top_srcdir)/help/C/viking.xml +@HAVE_XSLTPROC_TRUE@ $(XP) $(srcdir)/docbook2documenters.xsl $(top_srcdir)/help/C/viking.xml > $@ +@HAVE_XSLTPROC_FALSE@documenters.h: +@HAVE_XSLTPROC_FALSE@ rm -f $@ +@HAVE_XSLTPROC_FALSE@ echo "/* Generated file. */" >> $@ +@HAVE_XSLTPROC_FALSE@ echo "const gchar *DOCUMENTERS[] = {\\" >> $@ +@HAVE_XSLTPROC_FALSE@ echo "NULL};" >> $@ + +vikenumtypes.h: vikenumtypes.h.template $(ENUM_H_FILES) $(GLIB_MKENUMS) + (cd $(srcdir) && $(GLIB_MKENUMS) --template vikenumtypes.h.template $(ENUM_H_FILES)) > $@ + +vikenumtypes.c: vikenumtypes.c.template $(ENUM_H_FILES) $(GLIB_MKENUMS) + (cd $(srcdir) && $(GLIB_MKENUMS) --template vikenumtypes.c.template $(ENUM_H_FILES)) > $@ + +$(BUILT_SOURCES): $(srcdir)/Makefile.am + +@INTLTOOL_DESKTOP_RULE@ + +# Tell versions [3.59,3.63) of GNU make to not export all variables. +# Otherwise a system limit (for SysV at least) may be exceeded. +.NOEXPORT: diff --git a/src/acquire.c b/src/acquire.c new file mode 100644 index 0000000..3581689 --- /dev/null +++ b/src/acquire.c @@ -0,0 +1,560 @@ +/* + * viking -- GPS Data and Topo Analyzer, Explorer, and Manager + * + * Copyright (C) 2003-2005, Evan Battaglia + * Copyright (C) 2013-2015, Rob Norris + * + * 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., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA + * + */ +#ifdef HAVE_CONFIG_H +#include "config.h" +#endif + +#include +#include +#include +#include + +#include "viking.h" +#include "babel.h" +#include "gpx.h" +#include "acquire.h" + +/************************ FILTER LIST *******************/ +// extern VikDataSourceInterface vik_datasource_gps_interface; + +/*** Input is TRWLayer ***/ +extern VikDataSourceInterface vik_datasource_bfilter_simplify_interface; +extern VikDataSourceInterface vik_datasource_bfilter_compress_interface; +extern VikDataSourceInterface vik_datasource_bfilter_dup_interface; +extern VikDataSourceInterface vik_datasource_bfilter_manual_interface; + +/*** Input is a track and a TRWLayer ***/ +extern VikDataSourceInterface vik_datasource_bfilter_polygon_interface; +extern VikDataSourceInterface vik_datasource_bfilter_exclude_polygon_interface; + +/*** Input is a track ***/ + +const VikDataSourceInterface *filters[] = { + &vik_datasource_bfilter_simplify_interface, + &vik_datasource_bfilter_compress_interface, + &vik_datasource_bfilter_dup_interface, + &vik_datasource_bfilter_manual_interface, + &vik_datasource_bfilter_polygon_interface, + &vik_datasource_bfilter_exclude_polygon_interface, +}; + +const guint N_FILTERS = sizeof(filters) / sizeof(filters[0]); + +VikTrack *filter_track = NULL; + +/********************************************************/ + +/* passed along to worker thread */ +typedef struct { + acq_dialog_widgets_t *w; + ProcessOptions *po; + gboolean creating_new_layer; + VikTrwLayer *vtl; + DownloadFileOptions *options; +} w_and_interface_t; + + +/********************************************************* + * Definitions and routines for acquiring data from Data Sources in general + *********************************************************/ + +static void progress_func ( BabelProgressCode c, gpointer data, acq_dialog_widgets_t *w ) +{ + if ( w->source_interface->is_thread ) { + gdk_threads_enter (); + if ( !w->running ) { + if ( w->source_interface->cleanup_func ) + w->source_interface->cleanup_func ( w->user_data ); + gdk_threads_leave (); + g_thread_exit ( NULL ); + } + gdk_threads_leave (); + } + + if ( w->source_interface->progress_func ) + w->source_interface->progress_func ( c, data, w ); +} + +/** + * Some common things to do on completion of a datasource process + * . Update layer + * . Update dialog info + * . Update main dsisplay + */ +static void on_complete_process (w_and_interface_t *wi) +{ + if (wi->w->running) { + gtk_label_set_text ( GTK_LABEL(wi->w->status), _("Done.") ); + if ( wi->creating_new_layer ) { + /* Only create the layer if it actually contains anything useful */ + // TODO: create function for this operation to hide detail: + if ( ! vik_trw_layer_is_empty ( wi->vtl ) ) { + vik_layer_post_read ( VIK_LAYER(wi->vtl), wi->w->vvp, TRUE ); + vik_aggregate_layer_add_layer ( vik_layers_panel_get_top_layer(wi->w->vlp), VIK_LAYER(wi->vtl), TRUE ); + } + else + gtk_label_set_text ( GTK_LABEL(wi->w->status), _("No data.") ); + } + if ( wi->w->source_interface->keep_dialog_open ) { + gtk_dialog_set_response_sensitive ( GTK_DIALOG(wi->w->dialog), GTK_RESPONSE_ACCEPT, TRUE ); + gtk_dialog_set_response_sensitive ( GTK_DIALOG(wi->w->dialog), GTK_RESPONSE_REJECT, FALSE ); + } else { + gtk_dialog_response ( GTK_DIALOG(wi->w->dialog), GTK_RESPONSE_ACCEPT ); + } + // Main display update + if ( wi->vtl ) { + vik_layer_post_read ( VIK_LAYER(wi->vtl), wi->w->vvp, TRUE ); + // View this data if desired - must be done after post read (so that the bounds are known) + if ( wi->w->source_interface->autoview ) { + vik_trw_layer_auto_set_view ( wi->vtl, vik_layers_panel_get_viewport(wi->w->vlp) ); + } + vik_layers_panel_emit_update ( wi->w->vlp ); + } + } else { + /* cancelled */ + if ( wi->creating_new_layer ) + g_object_unref(wi->vtl); + } +} + +static void free_process_options ( ProcessOptions *po ) +{ + if ( po ) { + g_free ( po->babelargs ); + g_free ( po->filename ); + g_free ( po->input_file_type ); + g_free ( po->babel_filters ); + g_free ( po->url ); + g_free ( po->shell_command ); + g_free ( po ); + } +} + +/* this routine is the worker thread. there is only one simultaneous download allowed */ +static void get_from_anything ( w_and_interface_t *wi ) +{ + gboolean result = TRUE; + + VikDataSourceInterface *source_interface = wi->w->source_interface; + + if ( source_interface->process_func ) { + result = source_interface->process_func ( wi->vtl, wi->po, (BabelStatusFunc)progress_func, wi->w, wi->options ); + } + free_process_options ( wi->po ); + g_free ( wi->options ); + + if (wi->w->running && !result) { + gdk_threads_enter(); + gtk_label_set_text ( GTK_LABEL(wi->w->status), _("Error: acquisition failed.") ); + if ( wi->creating_new_layer ) + g_object_unref ( G_OBJECT ( wi->vtl ) ); + gdk_threads_leave(); + } + else { + gdk_threads_enter(); + on_complete_process ( wi ); + gdk_threads_leave(); + } + + if ( source_interface->cleanup_func ) + source_interface->cleanup_func ( wi->w->user_data ); + + if ( wi->w->running ) { + wi->w->running = FALSE; + } + else { + g_free ( wi->w ); + g_free ( wi ); + wi = NULL; + } + + g_thread_exit ( NULL ); +} + +/* depending on type of filter, often only vtl or track will be given. + * the other can be NULL. + */ +static void acquire ( VikWindow *vw, + VikLayersPanel *vlp, + VikViewport *vvp, + vik_datasource_mode_t mode, + VikDataSourceInterface *source_interface, + VikTrwLayer *vtl, + VikTrack *track, + gpointer userdata, + VikDataSourceCleanupFunc cleanup_function ) +{ + /* for manual dialogs */ + GtkWidget *dialog = NULL; + GtkWidget *status; + gchar *args_off = NULL; + gchar *fd_off = NULL; + acq_dialog_widgets_t *w; + gpointer user_data; + DownloadFileOptions *options = g_malloc0 ( sizeof(DownloadFileOptions) ); + + acq_vik_t avt; + avt.vlp = vlp; + avt.vvp = vvp; + avt.vw = vw; + avt.userdata = userdata; + + /* for UI builder */ + gpointer pass_along_data; + VikLayerParamData *paramdatas = NULL; + + w_and_interface_t *wi; + + /*** INIT AND CHECK EXISTENCE ***/ + if ( source_interface->init_func ) + user_data = source_interface->init_func(&avt); + else + user_data = NULL; + pass_along_data = user_data; + + if ( source_interface->check_existence_func ) { + gchar *error_str = source_interface->check_existence_func(); + if ( error_str ) { + a_dialog_error_msg ( GTK_WINDOW(vw), error_str ); + g_free ( error_str ); + return; + } + } + + /* BUILD UI & GET OPTIONS IF NECESSARY. */ + + /* POSSIBILITY 0: NO OPTIONS. DO NOTHING HERE. */ + /* POSSIBILITY 1: ADD_SETUP_WIDGETS_FUNC */ + if ( source_interface->add_setup_widgets_func ) { + dialog = gtk_dialog_new_with_buttons ( "", GTK_WINDOW(vw), 0, GTK_STOCK_OK, GTK_RESPONSE_ACCEPT, GTK_STOCK_CANCEL, GTK_RESPONSE_REJECT, NULL ); + + gtk_dialog_set_default_response ( GTK_DIALOG(dialog), GTK_RESPONSE_ACCEPT ); + GtkWidget *response_w = NULL; +#if GTK_CHECK_VERSION (2, 20, 0) + response_w = gtk_dialog_get_widget_for_response ( GTK_DIALOG(dialog), GTK_RESPONSE_ACCEPT ); +#endif + + source_interface->add_setup_widgets_func(dialog, vvp, user_data); + gtk_window_set_title ( GTK_WINDOW(dialog), _(source_interface->window_title) ); + + if ( response_w ) + gtk_widget_grab_focus ( response_w ); + + if ( gtk_dialog_run ( GTK_DIALOG(dialog) ) != GTK_RESPONSE_ACCEPT ) { + source_interface->cleanup_func(user_data); + gtk_widget_destroy(dialog); + return; + } + } + /* POSSIBILITY 2: UI BUILDER */ + else if ( source_interface->params ) { + paramdatas = a_uibuilder_run_dialog ( source_interface->window_title, GTK_WINDOW(vw), + source_interface->params, source_interface->params_count, + source_interface->params_groups, source_interface->params_groups_count, + source_interface->params_defaults ); + if ( paramdatas ) + pass_along_data = paramdatas; + else + return; /* TODO: do we have to free anything here? */ + } + + /* CREATE INPUT DATA & GET OPTIONS */ + ProcessOptions *po = g_malloc0 ( sizeof(ProcessOptions) ); + + if ( source_interface->inputtype == VIK_DATASOURCE_INPUTTYPE_TRWLAYER ) { + gchar *name_src = a_gpx_write_tmp_file ( vtl, NULL ); + + source_interface->get_process_options_func ( pass_along_data, po, NULL, name_src, NULL ); + + util_add_to_deletion_list ( name_src ); + + g_free ( name_src ); + } else if ( source_interface->inputtype == VIK_DATASOURCE_INPUTTYPE_TRWLAYER_TRACK ) { + gchar *name_src = a_gpx_write_tmp_file ( vtl, NULL ); + gchar *name_src_track = a_gpx_write_track_tmp_file ( track, NULL ); + + source_interface->get_process_options_func ( pass_along_data, po, NULL, name_src, name_src_track ); + + util_add_to_deletion_list ( name_src ); + util_add_to_deletion_list ( name_src_track ); + + g_free ( name_src ); + g_free ( name_src_track ); + } else if ( source_interface->inputtype == VIK_DATASOURCE_INPUTTYPE_TRACK ) { + gchar *name_src_track = a_gpx_write_track_tmp_file ( track, NULL ); + + source_interface->get_process_options_func ( pass_along_data, po, NULL, NULL, name_src_track ); + + g_free ( name_src_track ); + } else if ( source_interface->get_process_options_func ) + source_interface->get_process_options_func ( pass_along_data, po, options, NULL, NULL ); + + /* Get data for Off command */ + if ( source_interface->off_func ) { + source_interface->off_func ( pass_along_data, &args_off, &fd_off ); + } + + /* cleanup for option dialogs */ + if ( source_interface->add_setup_widgets_func ) { + gtk_widget_destroy(dialog); + dialog = NULL; + } else if ( source_interface->params ) { + a_uibuilder_free_paramdatas ( paramdatas, source_interface->params, source_interface->params_count ); + } + + w = g_malloc(sizeof(*w)); + wi = g_malloc(sizeof(*wi)); + wi->w = w; + wi->w->source_interface = source_interface; + wi->po = po; + wi->options = options; + wi->vtl = vtl; + wi->creating_new_layer = (!vtl); // Default if Auto Layer Management is passed in + + dialog = gtk_dialog_new_with_buttons ( "", GTK_WINDOW(vw), 0, GTK_STOCK_OK, GTK_RESPONSE_ACCEPT, GTK_STOCK_CANCEL, GTK_RESPONSE_REJECT, NULL ); + gtk_dialog_set_response_sensitive ( GTK_DIALOG(dialog), GTK_RESPONSE_ACCEPT, FALSE ); + gtk_window_set_title ( GTK_WINDOW(dialog), _(source_interface->window_title) ); + + w->dialog = dialog; + w->running = TRUE; + status = gtk_label_new (_("Working...")); + gtk_box_pack_start ( GTK_BOX(gtk_dialog_get_content_area(GTK_DIALOG(dialog))), status, FALSE, FALSE, 5 ); + gtk_dialog_set_default_response ( GTK_DIALOG(dialog), GTK_RESPONSE_ACCEPT ); + // May not want to see the dialog at all + if ( source_interface->is_thread || source_interface->keep_dialog_open ) + gtk_widget_show_all(dialog); + w->status = status; + + w->vw = vw; + w->vlp = vlp; + w->vvp = vvp; + if ( source_interface->add_progress_widgets_func ) { + source_interface->add_progress_widgets_func ( dialog, user_data ); + } + w->user_data = user_data; + + if ( mode == VIK_DATASOURCE_ADDTOLAYER ) { + VikLayer *current_selected = vik_layers_panel_get_selected ( w->vlp ); + if ( IS_VIK_TRW_LAYER(current_selected) ) { + wi->vtl = VIK_TRW_LAYER(current_selected); + wi->creating_new_layer = FALSE; + } + } + else if ( mode == VIK_DATASOURCE_CREATENEWLAYER ) { + wi->creating_new_layer = TRUE; + } + else if ( mode == VIK_DATASOURCE_MANUAL_LAYER_MANAGEMENT ) { + // Don't create in acquire - as datasource will perform the necessary actions + wi->creating_new_layer = FALSE; + VikLayer *current_selected = vik_layers_panel_get_selected ( w->vlp ); + if ( IS_VIK_TRW_LAYER(current_selected) ) + wi->vtl = VIK_TRW_LAYER(current_selected); + } + if ( wi->creating_new_layer ) { + wi->vtl = VIK_TRW_LAYER ( vik_layer_create ( VIK_LAYER_TRW, w->vvp, FALSE ) ); + vik_layer_rename ( VIK_LAYER ( wi->vtl ), _(source_interface->layer_title) ); + } + + if ( source_interface->is_thread ) { + if ( po->babelargs || po->url || po->shell_command ) { +#if GLIB_CHECK_VERSION (2, 32, 0) + g_thread_try_new ( "get_from_anything", (GThreadFunc)get_from_anything, wi, NULL ); +#else + g_thread_create ( (GThreadFunc)get_from_anything, wi, FALSE, NULL ); +#endif + gtk_dialog_run ( GTK_DIALOG(dialog) ); + if (w->running) { + // Cancel and mark for thread to finish + w->running = FALSE; + // NB Thread will free memory + } else { + if ( args_off ) { + /* Turn off */ + ProcessOptions off_po = { args_off, fd_off, NULL, NULL, NULL }; + a_babel_convert_from (NULL, &off_po, NULL, NULL, NULL); + g_free ( args_off ); + } + if ( fd_off ) + g_free ( fd_off ); + + // Thread finished by normal completion - free memory + g_free ( w ); + g_free ( wi ); + } + } + else { + // This shouldn't happen... + gtk_label_set_text ( GTK_LABEL(w->status), _("Unable to create command\nAcquire method failed.") ); + gtk_dialog_run (GTK_DIALOG (dialog)); + } + } + else { + // bypass thread method malarkly - you'll just have to wait... + if ( source_interface->process_func ) { + gboolean result = source_interface->process_func ( wi->vtl, po, (BabelStatusFunc) progress_func, w, options ); + if ( !result ) + a_dialog_error_msg ( GTK_WINDOW(vw), _("Error: acquisition failed.") ); + } + free_process_options ( po ); + g_free ( options ); + + on_complete_process ( wi ); + // Actually show it if necessary + if ( wi->w->source_interface->keep_dialog_open ) + gtk_dialog_run ( GTK_DIALOG(dialog) ); + + g_free ( w ); + g_free ( wi ); + } + + gtk_widget_destroy ( dialog ); + + if ( cleanup_function ) + cleanup_function ( source_interface ); +} + +/** + * a_acquire: + * @vw: The #VikWindow to work with + * @vlp: The #VikLayersPanel in which a #VikTrwLayer layer may be created/appended + * @vvp: The #VikViewport defining the current view + * @mode: How layers should be managed + * @source_interface: The #VikDataSourceInterface determining how and what actions to take + * @userdata: External data to be passed into the #VikDataSourceInterface + * @cleanup_function: The function to dispose the #VikDataSourceInterface if necessary + * + * Process the given VikDataSourceInterface for sources with no input data. + */ +void a_acquire ( VikWindow *vw, + VikLayersPanel *vlp, + VikViewport *vvp, + vik_datasource_mode_t mode, + VikDataSourceInterface *source_interface, + gpointer userdata, + VikDataSourceCleanupFunc cleanup_function ) +{ + acquire ( vw, vlp, vvp, mode, source_interface, NULL, NULL, userdata, cleanup_function ); +} + +static void acquire_trwlayer_callback ( GObject *menuitem, gpointer *pass_along ) +{ + VikDataSourceInterface *iface = g_object_get_data ( menuitem, "vik_acq_iface" ); + VikWindow *vw = pass_along[0]; + VikLayersPanel *vlp = pass_along[1]; + VikViewport *vvp = pass_along[2]; + VikTrwLayer *vtl = pass_along[3]; + VikTrack *tr = pass_along[4]; + + acquire ( vw, vlp, vvp, iface->mode, iface, vtl, tr, NULL, NULL ); +} + +static GtkWidget *acquire_build_menu ( VikWindow *vw, VikLayersPanel *vlp, VikViewport *vvp, + VikTrwLayer *vtl, VikTrack *track, /* both passed to acquire, although for many filters only one ness */ + const gchar *menu_title, vik_datasource_inputtype_t inputtype ) +{ + static gpointer pass_along[5]; + GtkWidget *menu_item=NULL, *menu=NULL; + GtkWidget *item=NULL; + int i; + + pass_along[0] = vw; + pass_along[1] = vlp; + pass_along[2] = vvp; + pass_along[3] = vtl; + pass_along[4] = track; + + for ( i = 0; i < N_FILTERS; i++ ) { + if ( filters[i]->inputtype == inputtype ) { + if ( ! menu_item ) { /* do this just once, but return NULL if no filters */ + menu = gtk_menu_new(); + menu_item = gtk_menu_item_new_with_mnemonic ( menu_title ); + gtk_menu_item_set_submenu (GTK_MENU_ITEM (menu_item), menu ); + } + + item = gtk_menu_item_new_with_label ( filters[i]->window_title ); + g_object_set_data ( G_OBJECT(item), "vik_acq_iface", (gpointer) filters[i] ); + g_signal_connect ( G_OBJECT(item), "activate", G_CALLBACK(acquire_trwlayer_callback), pass_along ); + gtk_menu_shell_append (GTK_MENU_SHELL (menu), item); + gtk_widget_show ( item ); + } + } + + return menu_item; +} + +/** + * a_acquire_trwlayer_menu: + * + * Create a sub menu intended for rightclicking on a TRWLayer's menu called "Filter". + * + * Returns: %NULL if no filters. + */ +GtkWidget *a_acquire_trwlayer_menu (VikWindow *vw, VikLayersPanel *vlp, VikViewport *vvp, VikTrwLayer *vtl) +{ + return acquire_build_menu ( vw, vlp, vvp, vtl, NULL, _("_Filter"), VIK_DATASOURCE_INPUTTYPE_TRWLAYER ); +} + +/** + * a_acquire_trwlayer_track_menu: + * + * Create a sub menu intended for rightclicking on a TRWLayer's menu called "Filter with Track "TRACKNAME"...". + * + * Returns: %NULL if no filters or no filter track has been set. + */ +GtkWidget *a_acquire_trwlayer_track_menu (VikWindow *vw, VikLayersPanel *vlp, VikViewport *vvp, VikTrwLayer *vtl) +{ + if ( filter_track == NULL ) + return NULL; + else { + gchar *menu_title = g_strdup_printf ( _("Filter with %s"), filter_track->name ); + GtkWidget *rv = acquire_build_menu ( vw, vlp, vvp, vtl, filter_track, + menu_title, VIK_DATASOURCE_INPUTTYPE_TRWLAYER_TRACK ); + g_free ( menu_title ); + return rv; + } +} + +/** + * a_acquire_track_menu: + * + * Create a sub menu intended for rightclicking on a track's menu called "Filter". + * + * Returns: %NULL if no applicable filters + */ +GtkWidget *a_acquire_track_menu (VikWindow *vw, VikLayersPanel *vlp, VikViewport *vvp, VikTrack *tr) +{ + return acquire_build_menu ( vw, vlp, vvp, NULL, tr, _("Filter"), VIK_DATASOURCE_INPUTTYPE_TRACK ); +} + +/** + * a_acquire_set_filter_track: + * + * Sets application-wide track to use with filter. references the track. + */ +void a_acquire_set_filter_track ( VikTrack *tr ) +{ + if ( filter_track ) + vik_track_free ( filter_track ); + + filter_track = tr; + vik_track_ref ( tr ); +} diff --git a/src/acquire.h b/src/acquire.h new file mode 100644 index 0000000..16ed7de --- /dev/null +++ b/src/acquire.h @@ -0,0 +1,198 @@ +/* + * viking -- GPS Data and Topo Analyzer, Explorer, and Manager + * + * Copyright (C) 2003-2005, Evan Battaglia + * Copyright (C) 2015, Rob Norris + * + * 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., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA + * + */ + +#ifndef _VIKING_ACQUIRE_H +#define _VIKING_ACQUIRE_H + +#include + +#include "vikwindow.h" +#include "viklayerspanel.h" +#include "vikviewport.h" +#include "babel.h" + +G_BEGIN_DECLS + +typedef struct _VikDataSourceInterface VikDataSourceInterface; + +typedef struct { + VikWindow *vw; + VikLayersPanel *vlp; + VikViewport *vvp; + gpointer userdata; +} acq_vik_t; + +/** + * acq_dialog_widgets_t: + * + * global data structure used to expose the progress dialog to the worker thread. + */ +typedef struct { + GtkWidget *status; + VikWindow *vw; + VikLayersPanel *vlp; + VikViewport *vvp; + GtkWidget *dialog; + gboolean running; + VikDataSourceInterface *source_interface; + gpointer user_data; +} acq_dialog_widgets_t; + +typedef enum { + VIK_DATASOURCE_CREATENEWLAYER, // Generally Datasources shouldn't use these and let the HCI decide + VIK_DATASOURCE_ADDTOLAYER, // between the create or add to layer options + VIK_DATASOURCE_AUTO_LAYER_MANAGEMENT, + VIK_DATASOURCE_MANUAL_LAYER_MANAGEMENT, +} vik_datasource_mode_t; +/* TODO: replace track/layer? */ + +typedef enum { + VIK_DATASOURCE_INPUTTYPE_NONE = 0, + VIK_DATASOURCE_INPUTTYPE_TRWLAYER, + VIK_DATASOURCE_INPUTTYPE_TRACK, + VIK_DATASOURCE_INPUTTYPE_TRWLAYER_TRACK +} vik_datasource_inputtype_t; + +/** + * VikDataSourceInitFunc: + * + * Returns: pointer to state if OK, otherwise %NULL + */ +typedef gpointer (*VikDataSourceInitFunc) ( acq_vik_t *avt ); + +/** + * VikDataSourceCheckExistenceFunc: + * + * Returns: %NULL if OK, otherwise returns an error message. + */ +typedef gchar *(*VikDataSourceCheckExistenceFunc) (); + +/** + * VikDataSourceAddSetupWidgetsFunc: + * + * Create widgets to show in a setup dialog, set up state via user_data. + */ +typedef void (*VikDataSourceAddSetupWidgetsFunc) ( GtkWidget *dialog, VikViewport *vvp, gpointer user_data ); + +/** + * VikDataSourceGetProcessOptionsFunc: + * @user_data: provided by #VikDataSourceInterface.init_func or dialog with params + * @process_options: main options controlling the behaviour of #VikDataSourceInterface.process_func + * @download_options: optional options for downloads from URLs for #VikDataSourceInterface.process_func + * @input_file_name: + * @input_track_file_name: + * + * set both to %NULL to signal refusal (ie already downloading). + */ +typedef void (*VikDataSourceGetProcessOptionsFunc) ( gpointer user_data, ProcessOptions *process_options, gpointer download_options, const gchar *input_file_name, const gchar *input_track_file_name ); + +/** + * VikDataSourceProcessFunc: + * @vtl: + * @process_options: options to control the behaviour of this function (see #ProcessOptions) + * @status_cb: the #VikDataSourceInterface.progress_func + * @adw: the widgets and data used by #VikDataSourceInterface.progress_func + * @download_options: Optional options used if downloads from URLs is used. + * + * The actual function to do stuff - must report success/failure. + */ +typedef gboolean (*VikDataSourceProcessFunc) ( gpointer vtl, ProcessOptions *process_options, BabelStatusFunc, acq_dialog_widgets_t *adw, gpointer download_options ); + +/* NB Same as BabelStatusFunc */ +typedef void (*VikDataSourceProgressFunc) ( BabelProgressCode c, gpointer data, acq_dialog_widgets_t *w ); + +/** + * VikDataSourceAddProgressWidgetsFunc: + * + * Creates widgets to show in a progress dialog, may set up state via user_data. + */ +typedef void (*VikDataSourceAddProgressWidgetsFunc) ( GtkWidget *dialog, gpointer user_data ); + +/** + * VikDataSourceCleanupFunc: + * + * Frees any widgets created for the setup or progress dialogs, any allocated state, etc. + */ +typedef void (*VikDataSourceCleanupFunc) ( gpointer user_data ); + +typedef void (*VikDataSourceOffFunc) ( gpointer user_data, gchar **babelargs, gchar **file_descriptor ); + +/** + * VikDataSourceInterface: + * + * Main interface. + */ +struct _VikDataSourceInterface { + const gchar *window_title; + const gchar *layer_title; + vik_datasource_mode_t mode; + vik_datasource_inputtype_t inputtype; + gboolean autoview; + gboolean keep_dialog_open; /* when done */ + + gboolean is_thread; + + /*** Manual UI Building ***/ + VikDataSourceInitFunc init_func; + VikDataSourceCheckExistenceFunc check_existence_func; + VikDataSourceAddSetupWidgetsFunc add_setup_widgets_func; + /*** ***/ + + VikDataSourceGetProcessOptionsFunc get_process_options_func; + + VikDataSourceProcessFunc process_func; + + VikDataSourceProgressFunc progress_func; + VikDataSourceAddProgressWidgetsFunc add_progress_widgets_func; + VikDataSourceCleanupFunc cleanup_func; + VikDataSourceOffFunc off_func; + + /*** UI Building ***/ + VikLayerParam * params; + guint16 params_count; + VikLayerParamData * params_defaults; + gchar ** params_groups; + guint8 params_groups_count; + +}; + +/**********************************/ + +void a_acquire ( VikWindow *vw, + VikLayersPanel *vlp, + VikViewport *vvp, + vik_datasource_mode_t mode, + VikDataSourceInterface *source_interface, + gpointer userdata, + VikDataSourceCleanupFunc cleanup_function ); + +GtkWidget *a_acquire_trwlayer_menu (VikWindow *vw, VikLayersPanel *vlp, VikViewport *vvp, VikTrwLayer *vtl); + +GtkWidget *a_acquire_trwlayer_track_menu (VikWindow *vw, VikLayersPanel *vlp, VikViewport *vvp, VikTrwLayer *vtl); + +GtkWidget *a_acquire_track_menu (VikWindow *vw, VikLayersPanel *vlp, VikViewport *vvp, VikTrack *tr); + +void a_acquire_set_filter_track ( VikTrack *tr ); + +G_END_DECLS + +#endif diff --git a/src/authors.h b/src/authors.h new file mode 100644 index 0000000..25f6274 --- /dev/null +++ b/src/authors.h @@ -0,0 +1,17 @@ +/* Generated file. */ +const gchar *AUTHORS[] = {\ +"Author:",\ +"Evan Battaglia ",\ +"",\ +"Contributors:",\ +"Alex Foobarian ",\ +"Bernd Zeimetz ",\ +"Guilhem Bonnefille ",\ +"Jocelyn Jaubert ",\ +"Mark Coulter ",\ +"Mathieu Albinet ",\ +"Quy Tonthat ",\ +"Robert Norris ",\ +"",\ +"Few other bugfixes/minor patches from various contributors. See ChangeLog for details.", +NULL}; diff --git a/src/babel.c b/src/babel.c new file mode 100644 index 0000000..d320224 --- /dev/null +++ b/src/babel.c @@ -0,0 +1,742 @@ +/* + * viking -- GPS Data and Topo Analyzer, Explorer, and Manager + * + * Copyright (C) 2003-2005, Evan Battaglia + * Copyright (C) 2006, Quy Tonthat + * Copyright (C) 2013, Guilhem Bonnefille + * Copyright (C) 2015, Rob Norris + * + * 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., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA + * + */ + +/** + * SECTION:babel + * @short_description: running external programs and redirecting to TRWLayers. + * + * GPSBabel may not be necessary for everything, + * one can use shell_command option but this will be OS platform specific + */ + +#ifdef HAVE_CONFIG_H +#include "config.h" +#endif + +#include "viking.h" +#include "gpx.h" +#include "babel.h" +#include "preferences.h" +#include +#ifdef HAVE_UNISTD_H +#include +#endif +#include +#include +#include +#include + +/* TODO in the future we could have support for other shells (change command strings), or not use a shell at all */ +#define BASH_LOCATION "/bin/bash" + +/** + * Path to gpsbabel + */ +static gchar *gpsbabel_loc = NULL; + +/** + * Path to unbuffer + */ +static gchar *unbuffer_loc = NULL; + +/** + * List of file formats supported by gpsbabel. + */ +GList *a_babel_file_list; + +/** + * List of device supported by gpsbabel. + */ +GList *a_babel_device_list; + +/** + * Run a function on all file formats supporting a given mode. + */ +void a_babel_foreach_file_with_mode (BabelMode mode, GFunc func, gpointer user_data) +{ + GList *current; + for ( current = g_list_first (a_babel_file_list) ; + current != NULL ; + current = g_list_next (current) ) + { + BabelFile *currentFile = current->data; + /* Check compatibility of modes */ + gboolean compat = TRUE; + if (mode.waypointsRead && ! currentFile->mode.waypointsRead) compat = FALSE; + if (mode.waypointsWrite && ! currentFile->mode.waypointsWrite) compat = FALSE; + if (mode.tracksRead && ! currentFile->mode.tracksRead) compat = FALSE; + if (mode.tracksWrite && ! currentFile->mode.tracksWrite) compat = FALSE; + if (mode.routesRead && ! currentFile->mode.routesRead) compat = FALSE; + if (mode.routesWrite && ! currentFile->mode.routesWrite) compat = FALSE; + /* Do call */ + if (compat) + func (currentFile, user_data); + } +} + +/** + * a_babel_foreach_file_read_any: + * @func: The function to be called on any file format with a read method + * @user_data: Data passed into the function + * + * Run a function on all file formats with any kind of read method + * (which is almost all but not quite - e.g. with GPSBabel v1.4.4 - PalmDoc is write only waypoints) + */ +void a_babel_foreach_file_read_any (GFunc func, gpointer user_data) +{ + GList *current; + for ( current = g_list_first (a_babel_file_list) ; + current != NULL ; + current = g_list_next (current) ) + { + BabelFile *currentFile = current->data; + // Call function when any read mode found + if ( currentFile->mode.waypointsRead || + currentFile->mode.tracksRead || + currentFile->mode.routesRead) + func (currentFile, user_data); + } +} + +/** + * a_babel_convert: + * @vt: The TRW layer to modify. All data will be deleted, and replaced by what gpsbabel outputs. + * @babelargs: A string containing gpsbabel command line filter options. No file types or names should + * be specified. + * @cb: A callback function. + * @user_data: passed along to cb + * @not_used: Must use NULL + * + * This function modifies data in a trw layer using gpsbabel filters. This routine is synchronous; + * that is, it will block the calling program until the conversion is done. To avoid blocking, call + * this routine from a worker thread. + * + * Returns: %TRUE on success + */ +gboolean a_babel_convert( VikTrwLayer *vt, const char *babelargs, BabelStatusFunc cb, gpointer user_data, gpointer not_used ) +{ + gboolean ret = FALSE; + gchar *bargs = g_strconcat(babelargs, " -i gpx", NULL); + gchar *name_src = a_gpx_write_tmp_file ( vt, NULL ); + + if ( name_src ) { + ProcessOptions po = { bargs, name_src, NULL, NULL, NULL }; + ret = a_babel_convert_from ( vt, &po, cb, user_data, not_used ); + (void)g_remove(name_src); + g_free(name_src); + } + + g_free(bargs); + return ret; +} + +/** + * Perform any cleanup actions once GPSBabel has completed running + */ +static void babel_watch ( GPid pid, + gint status, + gpointer user_data ) +{ + g_spawn_close_pid ( pid ); +} + +/** + * babel_general_convert: + * @args: The command line arguments passed to GPSBabel + * @cb: callback that is run for each line of GPSBabel output and at completion of the run + * callback may be NULL + * @user_data: passed along to cb + * + * The function to actually invoke the GPSBabel external command + * + * Returns: %TRUE on successful invocation of GPSBabel command + */ +static gboolean babel_general_convert( BabelStatusFunc cb, gchar **args, gpointer user_data ) +{ + gboolean ret = FALSE; + GPid pid; + GError *error = NULL; + gint babel_stdout; + + if ( vik_debug ) { + (void)g_printf ( "%s:", __FUNCTION__ ); + for ( guint i=0; args[i]; i++ ) + (void)g_printf ( " %s", args[i] ); + (void)g_printf ( "\n" ); + } + + if (!g_spawn_async_with_pipes (NULL, args, NULL, G_SPAWN_DO_NOT_REAP_CHILD, NULL, NULL, &pid, NULL, &babel_stdout, NULL, &error)) { + g_warning ("Async command failed: %s", error->message); + g_error_free(error); + ret = FALSE; + } else { + + gchar line[512]; + FILE *diag; + diag = fdopen(babel_stdout, "r"); + setvbuf(diag, NULL, _IONBF, 0); + + while (fgets(line, sizeof(line), diag)) { + if ( cb ) + cb(BABEL_DIAG_OUTPUT, line, user_data); + } + if ( cb ) + cb(BABEL_DONE, NULL, user_data); + fclose(diag); + diag = NULL; + + g_child_watch_add ( pid, (GChildWatchFunc) babel_watch, NULL ); + + // Useful to see in case of any errors, + // although they don't always occur on the last line output + g_debug ( "%s: last received line is=\"%s\"", __FUNCTION__, line ); + ret = TRUE; + } + + return ret; +} + +/** + * babel_general_convert_from: + * @vtl: The TrackWaypoint Layer to save the data into + * If it is null it signifies that no data is to be processed, + * however the gpsbabel command is still ran as it can be for non-data related options eg: + * for use with the power off command - 'command_off' + * @cb: callback that is run upon new data from STDOUT (?) + * (TODO: STDERR would be nice since we usually redirect STDOUT) + * @user_data: passed along to cb + * + * Runs args[0] with the arguments and uses the GPX module + * to import the GPX data into layer vt. Assumes that upon + * running the command, the data will appear in the (usually + * temporary) file name_dst. + * + * Returns: %TRUE on success + */ +static gboolean babel_general_convert_from( VikTrwLayer *vt, BabelStatusFunc cb, gchar **args, const gchar *name_dst, gpointer user_data ) +{ + gboolean ret = FALSE; + FILE *f = NULL; + + if (babel_general_convert(cb, args, user_data)) { + + /* No data actually required but still need to have run gpsbabel anyway + - eg using the device power command_off */ + if ( vt == NULL ) + return TRUE; + + f = g_fopen(name_dst, "r"); + if (f) { + gchar *dirpath = g_path_get_dirname ( name_dst ); + ret = a_gpx_read_file ( vt, f, dirpath ); + g_free ( dirpath ); + fclose(f); + } + } + + return ret; +} + +/** + * a_babel_convert_from_filter: + * @vt: The TRW layer to place data into. Duplicate items will be overwritten. + * @babelargs: A string containing gpsbabel command line options. This string + * must include the input file type (-i) option. + * @from the file name to convert from + * @babelfilters: A string containing gpsbabel filter command line options + * @cb: Optional callback function. Same usage as in a_babel_convert(). + * @user_data: passed along to cb + * @not_used: Must use NULL + * + * Loads data into a trw layer from a file, using gpsbabel. This routine is synchronous; + * that is, it will block the calling program until the conversion is done. To avoid blocking, call + * this routine from a worker thread. + * + * Returns: %TRUE on success + */ +gboolean a_babel_convert_from_filter( VikTrwLayer *vt, const char *babelargs, const char *from, const char *babelfilters, BabelStatusFunc cb, gpointer user_data, gpointer not_used ) +{ + int i,j; + int fd_dst; + gchar *name_dst = NULL; + gboolean ret = FALSE; + gchar *args[64]; + + if ((fd_dst = g_file_open_tmp("tmp-viking.XXXXXX", &name_dst, NULL)) >= 0) { + g_debug ("%s: temporary file: %s", __FUNCTION__, name_dst); + close(fd_dst); + + if (gpsbabel_loc ) { + gchar **sub_args = g_strsplit(babelargs, " ", 0); + gchar **sub_filters = NULL; + + i = 0; + if (unbuffer_loc) + args[i++] = unbuffer_loc; + args[i++] = gpsbabel_loc; + for (j = 0; sub_args[j]; j++) { + /* some version of gpsbabel can not take extra blank arg */ + if (sub_args[j][0] != '\0') + args[i++] = sub_args[j]; + } + args[i++] = "-f"; + args[i++] = (char *)from; + if (babelfilters) { + sub_filters = g_strsplit(babelfilters, " ", 0); + for (j = 0; sub_filters[j]; j++) { + /* some version of gpsbabel can not take extra blank arg */ + if (sub_filters[j][0] != '\0') + args[i++] = sub_filters[j]; + } + } + args[i++] = "-o"; + args[i++] = "gpx"; + args[i++] = "-F"; + args[i++] = name_dst; + args[i] = NULL; + + ret = babel_general_convert_from ( vt, cb, args, name_dst, user_data ); + + g_strfreev(sub_args); + if (sub_filters) + g_strfreev(sub_filters); + } else + g_critical("gpsbabel not found in PATH"); + (void)g_remove(name_dst); + g_free(name_dst); + } + + return ret; +} + +/** + * a_babel_convert_from_shellcommand: + * @vt: The #VikTrwLayer where to insert the collected data + * @input_cmd: the command to run + * @input_file_type: + * @cb: Optional callback function. Same usage as in a_babel_convert(). + * @user_data: passed along to cb + * @not_used: Must use NULL + * + * Runs the input command in a shell (bash) and optionally uses GPSBabel to convert from input_file_type. + * If input_file_type is %NULL, doesn't use GPSBabel. Input must be GPX (or Geocaching *.loc) + * + * Uses babel_general_convert_from() to actually run the command. This function + * prepares the command and temporary file, and sets up the arguments for bash. + */ +gboolean a_babel_convert_from_shellcommand ( VikTrwLayer *vt, const char *input_cmd, const char *input_file_type, BabelStatusFunc cb, gpointer user_data, gpointer not_used ) +{ + int fd_dst; + gchar *name_dst = NULL; + gboolean ret = FALSE; + gchar **args; + + if ((fd_dst = g_file_open_tmp("tmp-viking.XXXXXX", &name_dst, NULL)) >= 0) { + g_debug ("%s: temporary file: %s", __FUNCTION__, name_dst); + gchar *shell_command; + if ( input_file_type ) + shell_command = g_strdup_printf("%s | %s -i %s -f - -o gpx -F %s", + input_cmd, gpsbabel_loc, input_file_type, name_dst); + else + shell_command = g_strdup_printf("%s > %s", input_cmd, name_dst); + + g_debug("%s: %s", __FUNCTION__, shell_command); + close(fd_dst); + + args = g_malloc(sizeof(gchar *)*4); + args[0] = BASH_LOCATION; + args[1] = "-c"; + args[2] = shell_command; + args[3] = NULL; + + ret = babel_general_convert_from ( vt, cb, args, name_dst, user_data ); + g_free ( args ); + g_free ( shell_command ); + (void)g_remove(name_dst); + g_free(name_dst); + } + + return ret; +} + +/** + * a_babel_convert_from_url_filter: + * @vt: The #VikTrwLayer where to insert the collected data + * @url: the URL to fetch + * @input_type: If input_type is %NULL, input must be GPX. + * @babelfilters: The filter arguments to pass to gpsbabel + * @cb: Optional callback function. Same usage as in a_babel_convert(). + * @user_data: Passed along to cb + * @options: Download options. If %NULL then default download options will be used. + * + * Download the file pointed by the URL and optionally uses GPSBabel to convert from input_type. + * If input_type and babelfilters are %NULL, gpsbabel is not used. + * + * Returns: %TRUE on successful invocation of GPSBabel or read of the GPX + * + */ +gboolean a_babel_convert_from_url_filter ( VikTrwLayer *vt, const char *url, const char *input_type, const char *babelfilters, BabelStatusFunc cb, gpointer user_data, DownloadFileOptions *options ) +{ + // If no download options specified, use defaults: + DownloadFileOptions myoptions = { FALSE, FALSE, NULL, 2, NULL, NULL, NULL }; + if ( options ) + myoptions = *options; + gint fd_src; + int fetch_ret; + gboolean ret = FALSE; + gchar *name_src = NULL; + gchar *babelargs = NULL; + + g_debug("%s: input_type=%s url=%s", __FUNCTION__, input_type, url); + + if ((fd_src = g_file_open_tmp("tmp-viking.XXXXXX", &name_src, NULL)) >= 0) { + g_debug ("%s: temporary file: %s", __FUNCTION__, name_src); + close(fd_src); + (void)g_remove(name_src); + + fetch_ret = a_http_download_get_url(url, "", name_src, &myoptions, NULL); + if (fetch_ret == DOWNLOAD_SUCCESS) { + if (input_type != NULL || babelfilters != NULL) { + babelargs = (input_type) ? g_strdup_printf(" -i %s", input_type) : g_strdup(""); + ret = a_babel_convert_from_filter( vt, babelargs, name_src, babelfilters, NULL, NULL, NULL ); + } else { + /* Process directly the retrieved file */ + g_debug("%s: directly read GPX file %s", __FUNCTION__, name_src); + FILE *f = g_fopen(name_src, "r"); + if (f) { + gchar *dirpath = g_path_get_dirname ( name_src ); + ret = a_gpx_read_file ( vt, f, dirpath ); + g_free ( dirpath ); + fclose(f); + } + // Try to avoid adding the description if URL is OAuth signed + if ( !g_ascii_strncasecmp(url, "?oauth_consumer_key=", 20) ) { + VikTRWMetadata *meta = vik_trw_layer_get_metadata(vt); + if ( meta && !meta->description ) { + meta->description = g_strdup ( url ); + } + } + } + } + (void)util_remove(name_src); + g_free(babelargs); + g_free(name_src); + } + + return ret; +} + +/** + * a_babel_convert_from: + * @vt: The TRW layer to place data into. Duplicate items will be overwritten. + * @process_options: The options to control the appropriate processing function. See #ProcessOptions for more detail + * @cb: Optional callback function. Same usage as in a_babel_convert(). + * @user_data: passed along to cb + * @download_options: If downloading from a URL use these options (may be NULL) + * + * Loads data into a trw layer from a file, using gpsbabel. This routine is synchronous; + * that is, it will block the calling program until the conversion is done. To avoid blocking, call + * this routine from a worker thread. + * + * Returns: %TRUE on success + */ +gboolean a_babel_convert_from ( VikTrwLayer *vt, ProcessOptions *process_options, BabelStatusFunc cb, gpointer user_data, DownloadFileOptions *download_options ) +{ + if ( !process_options ) return FALSE; + if ( process_options->url ) + return a_babel_convert_from_url_filter ( vt, process_options->url, process_options->input_file_type, process_options->babel_filters, cb, user_data, download_options ); + if ( process_options->babelargs ) + return a_babel_convert_from_filter ( vt, process_options->babelargs, process_options->filename, process_options->babel_filters, cb, user_data, download_options ); + if ( process_options->shell_command ) + return a_babel_convert_from_shellcommand ( vt, process_options->shell_command, process_options->input_file_type, cb, user_data, download_options ); + return FALSE; +} + +static gboolean babel_general_convert_to( VikTrwLayer *vt, VikTrack *trk, BabelStatusFunc cb, gchar **args, const gchar *name_src, gpointer user_data ) +{ + // Now strips out invisible tracks and waypoints + if (!a_file_export(vt, name_src, FILE_TYPE_GPX, trk, FALSE)) { + g_critical("Error exporting to %s", name_src); + return FALSE; + } + + return babel_general_convert (cb, args, user_data); +} + +/** + * a_babel_convert_to: + * @vt: The TRW layer from which data is taken. + * @track: Operate on the individual track if specified. Use NULL when operating on a TRW layer + * @babelargs: A string containing gpsbabel output command line options. + * (i.e. must the contain '-o' file type and possibly any filter parameters) + * @to: Filename or device the data is written to. + * @cb: Optional callback function. Same usage as in a_babel_convert. + * @user_data: passed along to cb + * + * Exports data using gpsbabel. This routine is synchronous; + * that is, it will block the calling program until the conversion is done. To avoid blocking, call + * this routine from a worker thread. + * + * Returns: %TRUE on successful invocation of GPSBabel command + */ +gboolean a_babel_convert_to( VikTrwLayer *vt, VikTrack *track, const char *babelargs, const char *to, BabelStatusFunc cb, gpointer user_data ) +{ + int i,j; + int fd_src; + gchar *name_src = NULL; + gboolean ret = FALSE; + gchar *args[64]; + + if ((fd_src = g_file_open_tmp("tmp-viking.XXXXXX", &name_src, NULL)) >= 0) { + g_debug ("%s: temporary file: %s", __FUNCTION__, name_src); + close(fd_src); + + if (gpsbabel_loc ) { + gchar **sub_args = g_strsplit(babelargs, " ", 0); + + i = 0; + if (unbuffer_loc) + args[i++] = unbuffer_loc; + args[i++] = gpsbabel_loc; + args[i++] = "-i"; + args[i++] = "gpx"; + args[i++] = "-f"; + args[i++] = name_src; + for (j = 0; sub_args[j]; j++) + /* some version of gpsbabel can not take extra blank arg */ + if (sub_args[j][0] != '\0') + args[i++] = sub_args[j]; + args[i++] = "-F"; + args[i++] = (char *)to; + args[i] = NULL; + + ret = babel_general_convert_to ( vt, track, cb, args, name_src, user_data ); + + g_strfreev(sub_args); + } else + g_critical("gpsbabel not found in PATH"); + (void)g_remove(name_src); + g_free(name_src); + } + + return ret; +} + +static void set_mode(BabelMode *mode, gchar *smode) +{ + mode->waypointsRead = smode[0] == 'r'; + mode->waypointsWrite = smode[1] == 'w'; + mode->tracksRead = smode[2] == 'r'; + mode->tracksWrite = smode[3] == 'w'; + mode->routesRead = smode[4] == 'r'; + mode->routesWrite = smode[5] == 'w'; +} + +/** + * load_feature_parse_line: + * + * Load a single feature stored in the given line. + */ +static void load_feature_parse_line (gchar *line) +{ + gchar **tokens = g_strsplit ( line, "\t", 0 ); + if ( tokens != NULL + && tokens[0] != NULL ) { + if ( strcmp("serial", tokens[0]) == 0 ) { + if ( tokens[1] != NULL + && tokens[2] != NULL + && tokens[3] != NULL + && tokens[4] != NULL ) { + BabelDevice *device = g_malloc ( sizeof (BabelDevice) ); + set_mode (&(device->mode), tokens[1]); + device->name = g_strdup (tokens[2]); + device->label = g_strndup (tokens[4], 50); // Limit really long label text + a_babel_device_list = g_list_append (a_babel_device_list, device); + g_debug ("New gpsbabel device: %s, %d%d%d%d%d%d(%s)", + device->name, + device->mode.waypointsRead, device->mode.waypointsWrite, + device->mode.tracksRead, device->mode.tracksWrite, + device->mode.routesRead, device->mode.routesWrite, + tokens[1]); + } else { + g_warning ( "Unexpected gpsbabel format string: %s", line); + } + } else if ( strcmp("file", tokens[0]) == 0 ) { + if ( tokens[1] != NULL + && tokens[2] != NULL + && tokens[3] != NULL + && tokens[4] != NULL ) { + BabelFile *file = g_malloc ( sizeof (BabelFile) ); + set_mode (&(file->mode), tokens[1]); + file->name = g_strdup (tokens[2]); + file->ext = g_strdup (tokens[3]); + file->label = g_strdup (tokens[4]); + a_babel_file_list = g_list_append (a_babel_file_list, file); + g_debug ("New gpsbabel file: %s, %d%d%d%d%d%d(%s)", + file->name, + file->mode.waypointsRead, file->mode.waypointsWrite, + file->mode.tracksRead, file->mode.tracksWrite, + file->mode.routesRead, file->mode.routesWrite, + tokens[1]); + } else { + g_warning ( "Unexpected gpsbabel format string: %s", line); + } + } /* else: ignore */ + } else { + g_warning ( "Unexpected gpsbabel format string: %s", line); + } + g_strfreev ( tokens ); +} + +static void load_feature_cb (BabelProgressCode code, gpointer line, gpointer user_data) +{ + if (line != NULL) + load_feature_parse_line (line); +} + +static gboolean load_feature () +{ + int i; + gboolean ret = FALSE; + gchar *args[4]; + + if ( gpsbabel_loc ) { + i = 0; + if ( unbuffer_loc ) + args[i++] = unbuffer_loc; + args[i++] = gpsbabel_loc; + args[i++] = "-^3"; + args[i] = NULL; + + ret = babel_general_convert (load_feature_cb, args, NULL); + } else + g_critical("gpsbabel not found in PATH"); + + return ret; +} + +static VikLayerParam prefs[] = { + { VIK_LAYER_NUM_TYPES, VIKING_PREFERENCES_IO_NAMESPACE "gpsbabel", VIK_LAYER_PARAM_STRING, VIK_LAYER_GROUP_NONE, N_("GPSBabel:"), VIK_LAYER_WIDGET_FILEENTRY, NULL, NULL, + N_("Allow setting the specific instance of GPSBabel. You must restart Viking for this value to take effect."), NULL, NULL, NULL }, +}; + +/** + * a_babel_init: + * + * Just setup preferences first + */ +void a_babel_init () +{ + // Set the defaults + VikLayerParamData vlpd; +#ifdef WINDOWS + // Basic guesses - could use %ProgramFiles% but this is simpler: + if ( g_file_test ( "C:\\Program Files (x86)\\GPSBabel\\gpsbabel.exe", G_FILE_TEST_EXISTS ) ) + // 32 bit location on a 64 bit system + vlpd.s = "C:\\Program Files (x86)\\GPSBabel\\gpsbabel.exe"; + else + vlpd.s = "C:\\Program Files\\GPSBabel\\gpsbabel.exe"; +#else + vlpd.s = "gpsbabel"; +#endif + a_preferences_register(&prefs[0], vlpd, VIKING_PREFERENCES_IO_GROUP_KEY); +} + +/** + * a_babel_post_init: + * + * Initialises babel module. + * Mainly check existence of gpsbabel progam + * and load all features available in that version. + */ +void a_babel_post_init () +{ + // Read the current preference + const gchar *gpsbabel = a_preferences_get(VIKING_PREFERENCES_IO_NAMESPACE "gpsbabel")->s; + // If setting is still the UNIX default then lookup in the path - otherwise attempt to use the specified value directly. + if ( g_strcmp0 ( gpsbabel, "gpsbabel" ) == 0 ) { + gpsbabel_loc = g_find_program_in_path( "gpsbabel" ); + if ( !gpsbabel_loc ) + g_critical( "gpsbabel not found in PATH" ); + } + else + gpsbabel_loc = g_strdup ( gpsbabel ); + + // Unlikely to package unbuffer on Windows so ATM don't even bother trying + // Highly unlikely unbuffer is available on a Windows system otherwise +#ifndef WINDOWS + unbuffer_loc = g_find_program_in_path( "unbuffer" ); + if ( !unbuffer_loc ) + g_warning( "unbuffer not found in PATH" ); +#endif + + load_feature (); +} + +/** + * a_babel_uninit: + * + * Free resources acquired by a_babel_init. + */ +void a_babel_uninit () +{ + g_free ( gpsbabel_loc ); + g_free ( unbuffer_loc ); + + if ( a_babel_file_list ) { + GList *gl; + for (gl = a_babel_file_list; gl != NULL; gl = g_list_next(gl)) { + BabelFile *file = gl->data; + g_free ( file->name ); + g_free ( file->ext ); + g_free ( file->label ); + g_free ( gl->data ); + } + g_list_free ( a_babel_file_list ); + } + + if ( a_babel_device_list ) { + GList *gl; + for (gl = a_babel_device_list; gl != NULL; gl = g_list_next(gl)) { + BabelDevice *device = gl->data; + g_free ( device->name ); + g_free ( device->label ); + g_free ( gl->data ); + } + g_list_free ( a_babel_device_list ); + } + +} + +/** + * a_babel_available: + * + * Indicates if babel is available or not. + * + * Returns: true if babel available + */ +gboolean a_babel_available () +{ + return a_babel_device_list != NULL; +} diff --git a/src/babel.h b/src/babel.h new file mode 100644 index 0000000..ae2fa95 --- /dev/null +++ b/src/babel.h @@ -0,0 +1,131 @@ +/* + * viking -- GPS Data and Topo Analyzer, Explorer, and Manager + * + * Copyright (C) 2003-2005, Evan Battaglia + * Copyright (C) 2005, Alex Foobarian + * Copyright (C) 2015, Rob Norris + * + * 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., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA + * + */ + +#ifndef _VIKING_BABEL_H +#define _VIKING_BABEL_H + +#include + +#include "viktrwlayer.h" +#include "download.h" + +G_BEGIN_DECLS + +/** + * BabelProgressCode: + * @BABEL_DIAG_OUTPUT: a line of diagnostic output is available. The pointer is to a + * NULL-terminated line of diagnostic output from gpsbabel. + * @BABEL_DONE: gpsbabel finished, or %NULL if no callback is needed. + * + * Used when calling #BabelStatusFunc. + */ +typedef enum { + BABEL_DIAG_OUTPUT, + BABEL_DONE, +} BabelProgressCode; + +/** + * BabelStatusFunc: + * + * Callback function. + */ +typedef void (*BabelStatusFunc)(BabelProgressCode, gpointer, gpointer); + +/** + * ProcessOptions: + * + * All values are defaulted to NULL + * + * Need to specify at least one of babelargs, URL or shell_command + */ +typedef struct { + gchar* babelargs; // The standard initial arguments to gpsbabel (if gpsbabel is to be used) - normally should include the input file type (-i) option. + gchar* filename; // Input filename (or device port e.g. /dev/ttyS0) + gchar* input_file_type; // If NULL then uses internal file format handler (GPX only ATM), otherwise specify gpsbabel input type like "kml","tcx", etc... + gchar* url; // URL input rather than a filename + gchar* babel_filters; // Optional filter arguments to gpsbabel + gchar* shell_command; // Optional shell command to run instead of gpsbabel - but will be (Unix) platform specific +} ProcessOptions; + +/** + * BabelMode: + * + * Store the Read/Write support offered by gpsbabel for a given format. + */ +typedef struct { + unsigned waypointsRead : 1; + unsigned waypointsWrite : 1; + unsigned tracksRead : 1; + unsigned tracksWrite : 1; + unsigned routesRead : 1; + unsigned routesWrite : 1; +} BabelMode; + +/** + * BabelDevice: + * @name: gpsbabel's identifier of the device + * @label: human readable label + * + * Representation of a supported device. + */ +typedef struct { + BabelMode mode; + gchar *name; + gchar *label; +} BabelDevice; + +/** + * BabelFile: + * @name: gpsbabel's identifier of the format + * @ext: file's extension for this format + * @label: human readable label + * + * Representation of a supported file format. + */ +typedef struct { + BabelMode mode; + gchar *name; + gchar *ext; + gchar *label; +} BabelFile; + +GList *a_babel_file_list; +GList *a_babel_device_list; + +void a_babel_foreach_file_with_mode (BabelMode mode, GFunc func, gpointer user_data); +void a_babel_foreach_file_read_any (GFunc func, gpointer user_data); + +// NB needs to match typedef VikDataSourceProcessFunc in acquire.h +gboolean a_babel_convert_from ( VikTrwLayer *vt, ProcessOptions *process_options, BabelStatusFunc cb, gpointer user_data, DownloadFileOptions *download_options ); + +gboolean a_babel_convert_to( VikTrwLayer *vt, VikTrack *track, const char *babelargs, const char *file, BabelStatusFunc cb, gpointer user_data ); + +void a_babel_init (); +void a_babel_post_init (); +void a_babel_uninit (); + +gboolean a_babel_available (); + +G_END_DECLS + +#endif diff --git a/src/babel_ui.c b/src/babel_ui.c new file mode 100644 index 0000000..9b785c6 --- /dev/null +++ b/src/babel_ui.c @@ -0,0 +1,185 @@ + +/* -*- Mode: C; indent-tabs-mode: t; c-basic-offset: 4; tab-width: 4 -*- */ +/* + * viking -- GPS Data and Topo Analyzer, Explorer, and Manager + * + * Copyright (C) 2013, Guilhem Bonnefille + * + * 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., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA + * + */ +#include + +#include "babel.h" +#include "babel_ui.h" + + +static void babel_ui_selector_add_entry_cb ( gpointer data, gpointer user_data ) +{ + BabelFile *file = (BabelFile*)data; + GtkWidget *combo = GTK_WIDGET(user_data); + + GList *formats = g_object_get_data ( G_OBJECT(combo), "formats" ); + formats = g_list_append ( formats, file ); + g_object_set_data ( G_OBJECT(combo), "formats", formats ); + + const gchar *label = file->label; + vik_combo_box_text_append ( combo, label ); +} + +void a_babel_ui_type_selector_dialog_sensitivity_cb ( GtkComboBox *widget, gpointer user_data ) +{ + /* user_data is the GtkDialog */ + GtkDialog *dialog = GTK_DIALOG(user_data); + + /* Retrieve the associated file format descriptor */ + BabelFile *file = a_babel_ui_file_type_selector_get ( GTK_WIDGET(widget) ); + + if ( file ) + /* Not NULL => valid selection */ + gtk_dialog_set_response_sensitive ( dialog, GTK_RESPONSE_ACCEPT, TRUE ); + else + /* NULL => invalid selection */ + gtk_dialog_set_response_sensitive ( dialog, GTK_RESPONSE_ACCEPT, FALSE ); +} + +/** + * a_babel_ui_file_type_selector_new: + * @mode: the mode to filter the file types + * + * Create a file type selector. + * + * This widget relies on a combo box listing labels of file formats. + * We store in the "data" of the GtkWidget a list with the BabelFile + * entries, in order to retrieve the selected file format. + * + * Returns: a GtkWidget + */ +GtkWidget *a_babel_ui_file_type_selector_new ( BabelMode mode ) +{ + GList *formats = NULL; + /* Create the combo */ + GtkWidget * combo = vik_combo_box_text_new (); + + /* Add a first label to invite user to select a file format */ + /* We store a NULL pointer to distinguish this entry */ + formats = g_list_append ( formats, NULL ); + vik_combo_box_text_append ( combo, _("Select a file format") ); + + /* Prepare space for file format list */ + g_object_set_data ( G_OBJECT(combo), "formats", formats ); + + /* Add all known and compatible file formats */ + if ( mode.tracksRead && mode.routesRead && mode.waypointsRead && + !mode.tracksWrite && !mode.routesWrite && !mode.waypointsWrite ) + a_babel_foreach_file_read_any ( babel_ui_selector_add_entry_cb, combo ); + else + a_babel_foreach_file_with_mode ( mode, babel_ui_selector_add_entry_cb, combo ); + + /* Initialize the selection with the really first entry */ + gtk_combo_box_set_active ( GTK_COMBO_BOX(combo), 0 ); + + return combo; +} + +/** + * a_babel_ui_file_type_selector_destroy: + * @selector: the selector to destroy + * + * Destroy the selector and any related data. + */ +void a_babel_ui_file_type_selector_destroy ( GtkWidget *selector ) +{ + GList *formats = g_object_get_data ( G_OBJECT(selector), "formats" ); + g_free ( formats ); +} + +/** + * a_babel_ui_file_type_selector_get: + * @selector: the selector + * + * Retrieve the selected file type. + * + * Returns: the selected BabelFile or NULL + */ +BabelFile *a_babel_ui_file_type_selector_get ( GtkWidget *selector ) +{ + gint active = gtk_combo_box_get_active ( GTK_COMBO_BOX(selector) ); + if (active >= 0) { + GList *formats = g_object_get_data ( G_OBJECT(selector), "formats" ); + return (BabelFile*)g_list_nth_data ( formats, active ); + } else { + return NULL; + } +} + +/** + * a_babel_ui_modes_new: + * @tracks: + * @routes: + * @waypoints: + * + * Creates a selector for babel modes. + * This selector is based on 3 checkboxes. + * + * Returns: a GtkWidget packing all checkboxes. + */ +GtkWidget *a_babel_ui_modes_new ( gboolean tracks, gboolean routes, gboolean waypoints ) +{ + GtkWidget *hbox = gtk_hbox_new( FALSE, 0 ); + GtkWidget *button = NULL; + + button = gtk_check_button_new_with_label ( _("Tracks") ); + gtk_toggle_button_set_active( GTK_TOGGLE_BUTTON(button), tracks ); + gtk_box_pack_start ( GTK_BOX(hbox), button, TRUE, TRUE, 0 ); + gtk_widget_show ( button ); + + button = gtk_check_button_new_with_label ( _("Routes") ); + gtk_toggle_button_set_active ( GTK_TOGGLE_BUTTON(button), routes ); + gtk_box_pack_start ( GTK_BOX(hbox), button, TRUE, TRUE, 0 ); + gtk_widget_show ( button ); + + button = gtk_check_button_new_with_label ( _("Waypoints") ); + gtk_toggle_button_set_active ( GTK_TOGGLE_BUTTON(button), waypoints ); + gtk_box_pack_start ( GTK_BOX(hbox), button, TRUE, TRUE, 0 ); + gtk_widget_show ( button ); + + return hbox; +} + +/** + * a_babel_ui_modes_get: + * @container: + * @tracks: return value + * @routes: return value + * @waypoints: return value + * + * Retrieve state of checkboxes. + */ +void a_babel_ui_modes_get ( GtkWidget *container, gboolean *tracks, gboolean *routes, gboolean *waypoints ) +{ + GList* children = gtk_container_get_children ( GTK_CONTAINER(container) ); + GtkWidget *child = NULL; + + child = g_list_nth_data ( children, 0 ); + *tracks = gtk_toggle_button_get_active ( GTK_TOGGLE_BUTTON(child) ); + + child = g_list_nth_data ( children, 1 ); + *routes = gtk_toggle_button_get_active ( GTK_TOGGLE_BUTTON(child) ); + + child = g_list_nth_data ( children, 2 ); + *waypoints = gtk_toggle_button_get_active ( GTK_TOGGLE_BUTTON(child) ); +} + diff --git a/src/babel_ui.h b/src/babel_ui.h new file mode 100644 index 0000000..8af9a22 --- /dev/null +++ b/src/babel_ui.h @@ -0,0 +1,41 @@ +/* + * viking -- GPS Data and Topo Analyzer, Explorer, and Manager + * + * Copyright (C) 2013 Guilhem Bonnefille + * + * 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., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA + * + */ + +#ifndef _VIKING_BABEL_UI_H +#define _VIKING_BABEL_UI_H + +#include + +#include "babel.h" + +G_BEGIN_DECLS + +GtkWidget *a_babel_ui_file_type_selector_new ( BabelMode mode ); +void a_babel_ui_file_type_selector_destroy ( GtkWidget *selector ); +BabelFile *a_babel_ui_file_type_selector_get ( GtkWidget *selector ); +void a_babel_ui_type_selector_dialog_sensitivity_cb ( GtkComboBox *widget, gpointer user_data ); + +GtkWidget *a_babel_ui_modes_new ( gboolean tracks, gboolean routes, gboolean waypoints ); +void a_babel_ui_modes_get ( GtkWidget *container, gboolean *tracks, gboolean *routes, gboolean *waypoints ); + +G_END_DECLS + +#endif diff --git a/src/background.c b/src/background.c new file mode 100644 index 0000000..24c0357 --- /dev/null +++ b/src/background.c @@ -0,0 +1,422 @@ +/* + * viking -- GPS Data and Topo Analyzer, Explorer, and Manager + * + * Copyright (C) 2003-2005, Evan Battaglia + * Copyright (c) 2015, Rob Norris + * + * 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., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA + * + */ + +#include +#include + +#include "background.h" +#include "settings.h" +#include "util.h" +#include "math.h" +#include "uibuilder.h" +#include "globals.h" +#include "preferences.h" + +static GThreadPool *thread_pool_remote = NULL; +static GThreadPool *thread_pool_local = NULL; +#ifdef HAVE_LIBMAPNIK +static GThreadPool *thread_pool_local_mapnik = NULL; +#endif +static gboolean stop_all_threads = FALSE; + +// A single store of background items for all Windows +// Must always be accessed in the main thread +static GtkListStore *bgstore = NULL; + +G_LOCK_DEFINE_STATIC(window_list); +// Still only actually updating the statusbar though +static GSList *windows_to_update = NULL; + +static gint bgitemcount = 0; + +#define VIK_BG_NUM_ARGS 7 + +enum +{ + TITLE_COLUMN = 0, + PROGRESS_COLUMN, + DATA_COLUMN, + N_COLUMNS, +}; + +void a_background_update_status ( VikWindow *vw, gpointer data ) +{ + static gchar buf[20]; + g_snprintf(buf, sizeof(buf), _("%d items"), bgitemcount); + vik_window_statusbar_update ( vw, buf, VIK_STATUSBAR_ITEMS ); +} + +// NB can be called from any thread +static void background_thread_update () +{ + G_LOCK(window_list); + g_slist_foreach ( windows_to_update, (GFunc) a_background_update_status, NULL ); + G_UNLOCK(window_list); +} + +typedef struct { + GtkTreeIter *iter; + gdouble percent; +} progress_t; + +// In main thread +static gboolean idle_progress_update ( gpointer user_data ) +{ + progress_t *progress = user_data; + if ( bgstore ) + gtk_list_store_set ( GTK_LIST_STORE(bgstore), progress->iter, PROGRESS_COLUMN, progress->percent, -1 ); + g_free ( progress ); + return FALSE; +} + +/** + * a_background_thread_progress: + * @callbackdata: Thread data + * @fraction: The value should be between 0.0 and 1.0 indicating percentage of the task complete + * + * Called from other threads + * + * Returns a non zero number if the thread should be terminated + */ +int a_background_thread_progress ( gpointer callbackdata, gdouble fraction ) +{ + gpointer *args = (gpointer *) callbackdata; + int res = a_background_testcancel ( callbackdata ); + if (args[5] != NULL) { + gdouble myfraction = fabs(fraction); + if ( myfraction > 1.0 ) + myfraction = 1.0; + progress_t *progress = g_malloc0 ( sizeof(progress_t) ); + progress->percent = myfraction * 100; + progress->iter = (GtkTreeIter*)args[5]; + gdk_threads_add_idle ( idle_progress_update, progress ); + } + + args[6] = GINT_TO_POINTER(GPOINTER_TO_INT(args[6])-1); + bgitemcount--; + background_thread_update(); + return res; +} + +static void thread_die ( gpointer args[VIK_BG_NUM_ARGS] ) +{ + vik_thr_free_func userdata_free_func = args[3]; + + if ( userdata_free_func != NULL ) + userdata_free_func ( args[2] ); + + if ( GPOINTER_TO_INT(args[6]) ) + { + bgitemcount -= GPOINTER_TO_INT(args[6]); + background_thread_update (); + } + + g_free ( args ); +} + +// Called from other threads +// Returns a non zero number if the thread should be terminated +int a_background_testcancel ( gpointer callbackdata ) +{ + gpointer *args = (gpointer *) callbackdata; + if ( stop_all_threads ) + return -1; + if ( args && args[0] ) + { + vik_thr_free_func cleanup = args[4]; + if ( cleanup ) + cleanup ( args[2] ); + return -1; + } + return 0; +} + +typedef struct { + GtkTreeIter *iter; +} remove_t; + +// Called from the main thread +static gboolean idle_remove ( gpointer user_data ) +{ + remove_t *remove = user_data; + if ( bgstore ) + gtk_list_store_remove ( bgstore, remove->iter ); + g_free ( remove->iter ); + return FALSE; +} + +// Called from other threads +static void thread_helper ( gpointer args[VIK_BG_NUM_ARGS], gpointer user_data ) +{ + /* unpack args */ + vik_thr_func func = args[1]; + gpointer userdata = args[2]; + + g_debug(__FUNCTION__); + + func ( userdata, args ); + + if ( ! args[0] ) { + remove_t *remove = g_malloc0 ( sizeof(remove_t) ); + remove->iter = args[5]; + gdk_threads_add_idle ( idle_remove, remove ); + } + thread_die ( args ); +} + +/** + * a_background_thread: + * @bp: Which pool this thread should run in + * @parent: + * @message: + * @func: worker function + * @userdata: + * @userdata_free_func: free function for userdata + * @userdata_cancel_cleanup_func: + * @number_items: + * + * Function to enlist new background function. + */ +void a_background_thread ( Background_Pool_Type bp, GtkWindow *parent, const gchar *message, vik_thr_func func, gpointer userdata, vik_thr_free_func userdata_free_func, vik_thr_free_func userdata_cancel_cleanup_func, gint number_items ) +{ + GtkTreeIter *piter = g_malloc ( sizeof ( GtkTreeIter ) ); + gpointer *args = g_malloc ( sizeof(gpointer) * VIK_BG_NUM_ARGS ); + + g_debug(__FUNCTION__); + + args[0] = GINT_TO_POINTER(0); + args[1] = func; + args[2] = userdata; + args[3] = userdata_free_func; + args[4] = userdata_cancel_cleanup_func; + args[5] = piter; + args[6] = GINT_TO_POINTER(number_items); + + bgitemcount += number_items; + + gtk_list_store_append ( bgstore, piter ); + gtk_list_store_set ( bgstore, piter, + TITLE_COLUMN, message, + PROGRESS_COLUMN, 0.0, + DATA_COLUMN, args, + -1 ); + + /* run the thread in the background */ + if ( bp == BACKGROUND_POOL_REMOTE ) + g_thread_pool_push( thread_pool_remote, args, NULL ); +#ifdef HAVE_LIBMAPNIK + else if ( bp == BACKGROUND_POOL_LOCAL_MAPNIK ) + g_thread_pool_push( thread_pool_local_mapnik, args, NULL ); +#endif + else + g_thread_pool_push( thread_pool_local, args, NULL ); +} + +// In main thread +static void cancel_job_with_iter ( GtkTreeIter *piter ) +{ + gpointer *args; + + g_debug(__FUNCTION__); + + gtk_tree_model_get( GTK_TREE_MODEL(bgstore), piter, DATA_COLUMN, &args, -1 ); + + /* we know args still exists because it is free _after_ the list item is destroyed */ + /* need MUTEX ? */ + args[0] = GINT_TO_POINTER(1); /* set killswitch */ + + gtk_list_store_remove ( bgstore, piter ); + g_free ( piter ); + args[5] = NULL; +} + +// In main thread +static void bgwindow_response (GtkDialog *dialog, gint response_id, GtkTreeView *bgtreeview ) +{ + switch ( response_id ) { + case GTK_RESPONSE_DELETE_EVENT: + // Delibrate fall through + case GTK_RESPONSE_CLOSE: + gtk_widget_destroy ( GTK_WIDGET(dialog) ); + break; + case 1: // Delete / Cancel selected item + { + GtkTreeIter iter; + if ( gtk_tree_selection_get_selected ( gtk_tree_view_get_selection(bgtreeview), NULL, &iter ) ) + cancel_job_with_iter ( &iter ); + background_thread_update(); + } + break; + case 2: // Clear All jobs + { + GtkTreeIter iter; + while ( gtk_tree_model_get_iter_first ( GTK_TREE_MODEL(bgstore), &iter ) ) + cancel_job_with_iter ( &iter ); + background_thread_update(); + } + default: break; + } +} + +#define VIK_SETTINGS_BACKGROUND_MAX_THREADS "background_max_threads" +#define VIK_SETTINGS_BACKGROUND_MAX_THREADS_LOCAL "background_max_threads_local" + +#ifdef HAVE_LIBMAPNIK +VikLayerParamScale params_threads[] = { {1, 64, 1, 0} }; // 64 threads should be enough for anyone... +// implicit use of 'MAPNIK_PREFS_NAMESPACE' to avoid dependency issues +static VikLayerParam prefs_mapnik[] = { + { VIK_LAYER_NUM_TYPES, "mapnik.background_max_threads_local_mapnik", VIK_LAYER_PARAM_UINT, VIK_LAYER_GROUP_NONE, N_("Threads:"), VIK_LAYER_WIDGET_SPINBUTTON, params_threads, NULL, + N_("Number of threads to use for Mapnik tasks. You need to restart Viking for a change to this value to be used"), NULL, NULL, NULL }, +}; +#endif + +/** + * a_background_init: + * + * Just setup any preferences. + */ +void a_background_init () +{ +#ifdef HAVE_LIBMAPNIK + VikLayerParamData tmp; + // implicit use of 'MAPNIK_PREFS_NAMESPACE' to avoid dependency issues + tmp.u = 1; // Default to 1 thread due to potential crashing issues + a_preferences_register(&prefs_mapnik[0], tmp, "mapnik"); +#endif +} + +/** + * a_background_post_init: + * + * Initialize background feature. + */ +void a_background_post_init() +{ + // initialize thread pools + gint max_threads = 10; /* limit maximum number of threads running at one time */ + gint maxt; + if ( a_settings_get_integer ( VIK_SETTINGS_BACKGROUND_MAX_THREADS, &maxt ) ) + max_threads = maxt; + + thread_pool_remote = g_thread_pool_new ( (GFunc) thread_helper, NULL, max_threads, FALSE, NULL ); + + if ( a_settings_get_integer ( VIK_SETTINGS_BACKGROUND_MAX_THREADS_LOCAL, &maxt ) ) + max_threads = maxt; + else { + guint cpus = util_get_number_of_cpus (); + max_threads = cpus > 1 ? cpus-1 : 1; // Don't use all available CPUs! + } + + thread_pool_local = g_thread_pool_new ( (GFunc) thread_helper, NULL, max_threads, FALSE, NULL ); + +#ifdef HAVE_LIBMAPNIK + // implicit use of 'MAPNIK_PREFS_NAMESPACE' to avoid dependency issues + guint mapnik_threads = a_preferences_get("mapnik.background_max_threads_local_mapnik")->u; + thread_pool_local_mapnik = g_thread_pool_new ( (GFunc) thread_helper, NULL, mapnik_threads, FALSE, NULL ); +#endif + + bgstore = gtk_list_store_new ( N_COLUMNS, G_TYPE_STRING, G_TYPE_DOUBLE, G_TYPE_POINTER ); +} + +/** + * a_background_show_window: + * + * Display the background window. + */ +void a_background_show_window () +{ + GtkWidget *bgwindow = NULL; + GtkWidget *bgtreeview = NULL; + GtkCellRenderer *renderer; + GtkTreeViewColumn *column; + GtkWidget *scrolled_window; + + /* store & treeview */ + bgtreeview = gtk_tree_view_new_with_model ( GTK_TREE_MODEL(bgstore) ); + gtk_tree_view_set_rules_hint (GTK_TREE_VIEW (bgtreeview), TRUE); + gtk_tree_selection_set_mode (gtk_tree_view_get_selection (GTK_TREE_VIEW (bgtreeview)), + GTK_SELECTION_SINGLE); + + /* add columns */ + renderer = gtk_cell_renderer_text_new (); + column = gtk_tree_view_column_new_with_attributes ( _("Job"), renderer, "text", TITLE_COLUMN, NULL ); + gtk_tree_view_append_column ( GTK_TREE_VIEW(bgtreeview), column ); + + renderer = gtk_cell_renderer_progress_new (); + column = gtk_tree_view_column_new_with_attributes ( _("Progress"), renderer, "value", PROGRESS_COLUMN, NULL ); + gtk_tree_view_append_column ( GTK_TREE_VIEW(bgtreeview), column ); + + /* setup window */ + scrolled_window = gtk_scrolled_window_new ( NULL, NULL ); + gtk_container_add ( GTK_CONTAINER(scrolled_window), bgtreeview ); + gtk_scrolled_window_set_policy ( GTK_SCROLLED_WINDOW(scrolled_window), GTK_POLICY_AUTOMATIC, GTK_POLICY_AUTOMATIC ); + + bgwindow = gtk_dialog_new_with_buttons ( _("Viking Background Jobs"), NULL, 0, GTK_STOCK_CLOSE, GTK_RESPONSE_CLOSE, GTK_STOCK_DELETE, 1, GTK_STOCK_CLEAR, 2, NULL ); + gtk_dialog_set_default_response ( GTK_DIALOG(bgwindow), GTK_RESPONSE_ACCEPT ); + GtkWidget *response_w = NULL; +#if GTK_CHECK_VERSION (2, 20, 0) + response_w = gtk_dialog_get_widget_for_response ( GTK_DIALOG(bgwindow), GTK_RESPONSE_ACCEPT ); +#endif + gtk_box_pack_start ( GTK_BOX(gtk_dialog_get_content_area(GTK_DIALOG(bgwindow))), scrolled_window, TRUE, TRUE, 0 ); + gtk_window_set_default_size ( GTK_WINDOW(bgwindow), 400, 400 ); + if ( response_w ) + gtk_widget_grab_focus ( response_w ); + + g_signal_connect ( G_OBJECT(bgwindow), "response", G_CALLBACK(bgwindow_response), GTK_TREE_VIEW(bgtreeview) ); + + gtk_widget_show_all ( bgwindow ); + + gtk_dialog_set_default_response ( GTK_DIALOG(bgwindow), GTK_RESPONSE_CLOSE ); +} + +/** + * a_background_uninit: + * + * Uninitialize background feature. + */ +void a_background_uninit() +{ + stop_all_threads = TRUE; + // Don't wait for these threads to complete - i.e. end now. + g_thread_pool_free ( thread_pool_remote, TRUE, FALSE ); + g_thread_pool_free ( thread_pool_local, TRUE, FALSE ); +#ifdef HAVE_LIBMAPNIK + g_thread_pool_free ( thread_pool_local_mapnik, TRUE, FALSE ); +#endif + gtk_list_store_clear ( bgstore ); + g_object_unref ( bgstore ); + bgstore = NULL; +} + +void a_background_add_window (VikWindow *vw) +{ + G_LOCK(window_list); + windows_to_update = g_slist_prepend(windows_to_update,vw); + G_UNLOCK(window_list); +} + +void a_background_remove_window (VikWindow *vw) +{ + G_LOCK(window_list); + windows_to_update = g_slist_remove(windows_to_update,vw); + G_UNLOCK(window_list); +} diff --git a/src/background.h b/src/background.h new file mode 100644 index 0000000..5608ee1 --- /dev/null +++ b/src/background.h @@ -0,0 +1,56 @@ +/* + * viking -- GPS Data and Topo Analyzer, Explorer, and Manager + * + * Copyright (C) 2003-2005, Evan Battaglia + * + * 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., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA + * + */ + +#ifndef __VIKING_BACKGROUND_H +#define __VIKING_BACKGROUND_H + +#include +#include + +#include "vikwindow.h" +#include "config.h" + +G_BEGIN_DECLS + +typedef void(*vik_thr_free_func)(gpointer); +typedef void(*vik_thr_func)(gpointer,gpointer); + +typedef enum { + BACKGROUND_POOL_REMOTE, // i.e. Network requests - can have an arbitary large pool + BACKGROUND_POOL_LOCAL, // i.e. CPU bound tasks - pool should be no larger than available CPUs for best performance +#ifdef HAVE_LIBMAPNIK + BACKGROUND_POOL_LOCAL_MAPNIK, // Due to potential issues with multi-threading a separate configurable pool for Mapnik +#endif +} Background_Pool_Type; + +void a_background_thread ( Background_Pool_Type bp, GtkWindow *parent, const gchar *message, vik_thr_func func, gpointer userdata, vik_thr_free_func userdata_free_func, vik_thr_free_func userdata_cancel_cleanup_func, gint number_items ); +int a_background_thread_progress ( gpointer callbackdata, gdouble fraction ); +int a_background_testcancel ( gpointer callbackdata ); +void a_background_show_window (); +void a_background_init (); +void a_background_post_init (); +void a_background_uninit (); +void a_background_add_window (VikWindow *vw); +void a_background_remove_window (VikWindow *vw); + +G_END_DECLS + +#endif diff --git a/src/bbox.h b/src/bbox.h new file mode 100644 index 0000000..af454db --- /dev/null +++ b/src/bbox.h @@ -0,0 +1,44 @@ +/* + * viking -- GPS Data and Topo Analyzer, Explorer, and Manager + * + * Copyright (C) 2011, Guilhem Bonnefille + * + * 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., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA + * + */ + +#ifndef __BOUNDING_BOX_H +#define __BOUNDING_BOX_H + +#include + +typedef struct { + gdouble south, north; + gdouble east, west; +} LatLonBBox; + +/** + * +--------+ + * |a | + * | +--+----+ + * | | | | + * +-----+--+ | + * | b| + * +-------+ + */ +#define BBOX_INTERSECT(a,b) ((a).south < (b).north && (a).north > (b).south && (a).east > (b).west && (a).west < (b).east) + +#endif + diff --git a/src/bing.c b/src/bing.c new file mode 100644 index 0000000..e4ab9ed --- /dev/null +++ b/src/bing.c @@ -0,0 +1,51 @@ +/* -*- Mode: C; indent-tabs-mode: t; c-basic-offset: 4; tab-width: 4 -*- */ +/* + * viking -- GPS Data and Topo Analyzer, Explorer, and Manager + * + * Copyright (C) 2011, Guilhem Bonnefille + * + * 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., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA + * + */ + +#ifdef HAVE_CONFIG_H +#include "config.h" +#endif + +#include + +#include "bing.h" +#include "vikmapslayer.h" +#include "bingmapsource.h" +#include "vikwebtoolcenter.h" +#include "vikexttools.h" +#include "map_ids.h" + +/** API key registered by Guilhem Bonnefille */ +#define API_KEY "AqsTAipaBBpKLXhcaGgP8kceYukatmtDLS1x0CXEhRZnpl1RELF9hlI8j4mNIkrE" + +/* initialisation */ +void bing_init () { + VikMapSource *bing_aerial = VIK_MAP_SOURCE + (bing_map_source_new_with_id (MAP_ID_BING_AERIAL, _("Bing Aerial"), API_KEY)); + + maps_layer_register_map_source (bing_aerial); + + // Allow opening web location + VikWebtoolCenter *webtool = NULL; + webtool = vik_webtool_center_new_with_members ( _("Bing"), "http://www.bing.com/maps/?v=2&cp=%s~%s&lvl=%d" ); + vik_ext_tools_register ( VIK_EXT_TOOL ( webtool ) ); + g_object_unref ( webtool ); +} diff --git a/src/bing.h b/src/bing.h new file mode 100644 index 0000000..07f99be --- /dev/null +++ b/src/bing.h @@ -0,0 +1,28 @@ +/* -*- Mode: C; indent-tabs-mode: t; c-basic-offset: 4; tab-width: 4 -*- */ +/* + * viking -- GPS Data and Topo Analyzer, Explorer, and Manager + * + * Copyright (C) 2011, Guilhem Bonnefille + * + * 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., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA + * + */ + +#ifndef __VIKING_BING_H +#define __VIKING_BING_H + +void bing_init (); + +#endif diff --git a/src/bingmapsource.c b/src/bingmapsource.c new file mode 100644 index 0000000..0c9fd99 --- /dev/null +++ b/src/bingmapsource.c @@ -0,0 +1,551 @@ +/* -*- Mode: C; indent-tabs-mode: t; c-basic-offset: 4; tab-width: 4 -*- */ +/* + * viking + * Copyright (C) 2011, Guilhem Bonnefille + * + * viking 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. + * + * viking 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, see . + */ + + /** + * SECTION:bingmapsource + * @short_description: the class for Bing Maps + * + * The #BingMapSource class handles Bing map source. + * + * License and term of use are available here: + * http://wiki.openstreetmap.org/wiki/File:Bing_license.pdf + * + * Technical details are available here: + * http://msdn.microsoft.com/en-us/library/dd877180.aspx + */ + +#ifdef HAVE_CONFIG_H +#include "config.h" +#endif + +#ifdef HAVE_MATH_H +#include +#endif + +#ifdef HAVE_STDLIB_H +#include +#endif +#include +#include +#include +#include +#include "globals.h" +#include "bingmapsource.h" +#include "maputils.h" +#include "bbox.h" +#include "background.h" +#include "icons/icons.h" + +/* Format for URL */ +#define URL_ATTR_FMT "http://dev.virtualearth.net/REST/v1/Imagery/Metadata/Aerial/0,0?zl=1&mapVersion=v1&key=%s&include=ImageryProviders&output=xml" + +static gchar *bget_uri ( VikMapSourceDefault *self, MapCoord *src ); +static gchar *bget_hostname ( VikMapSourceDefault *self ); +static void _get_copyright (VikMapSource * self, LatLonBBox bbox, gdouble zoom, void (*fct)(VikViewport*,const gchar*), void *data); +static const GdkPixbuf *_get_logo ( VikMapSource *self ); +static int _load_attributions ( BingMapSource *self ); +static void _async_load_attributions ( BingMapSource *self ); + +struct _Attribution +{ + gchar *attribution; + int minZoom; + int maxZoom; + LatLonBBox bounds; +}; + +typedef struct _BingMapSourcePrivate BingMapSourcePrivate; +struct _BingMapSourcePrivate +{ + gchar *hostname; + gchar *url; + gchar *api_key; + GList *attributions; + /* Current attribution, when parsing */ + gchar *attribution; + gboolean loading_attributions; +}; + +/* The pixbuf to store the logo */ +static GdkPixbuf *pixbuf = NULL; + +#define BING_MAP_SOURCE_GET_PRIVATE(o) (G_TYPE_INSTANCE_GET_PRIVATE ((o), BING_TYPE_MAP_SOURCE, BingMapSourcePrivate)) + +/* properties */ +enum +{ + PROP_0, + + PROP_HOSTNAME, + PROP_URL, + PROP_API_KEY, +}; + +G_DEFINE_TYPE (BingMapSource, bing_map_source, VIK_TYPE_SLIPPY_MAP_SOURCE); + +static void +bing_map_source_init (BingMapSource *self) +{ + /* initialize the object here */ + BingMapSourcePrivate *priv = BING_MAP_SOURCE_GET_PRIVATE (self); + + priv->hostname = NULL; + priv->url = NULL; + priv->api_key = NULL; + priv->attributions = NULL; + priv->attribution = NULL; + priv->loading_attributions = FALSE; +} + +static void +bing_map_source_finalize (GObject *object) +{ + BingMapSource *self = BING_MAP_SOURCE (object); + BingMapSourcePrivate *priv = BING_MAP_SOURCE_GET_PRIVATE (self); + + g_free (priv->hostname); + priv->hostname = NULL; + g_free (priv->url); + priv->url = NULL; + g_free (priv->api_key); + priv->api_key = NULL; + + G_OBJECT_CLASS (bing_map_source_parent_class)->finalize (object); +} + +static void +_set_property (GObject *object, + guint property_id, + const GValue *value, + GParamSpec *pspec) +{ + BingMapSource *self = BING_MAP_SOURCE (object); + BingMapSourcePrivate *priv = BING_MAP_SOURCE_GET_PRIVATE (self); + + switch (property_id) + { + case PROP_HOSTNAME: + g_free (priv->hostname); + priv->hostname = g_value_dup_string (value); + break; + + case PROP_URL: + g_free (priv->url); + priv->url = g_value_dup_string (value); + break; + + case PROP_API_KEY: + priv->api_key = g_strdup (g_value_get_string (value)); + break; + + default: + /* We don't have any other property... */ + G_OBJECT_WARN_INVALID_PROPERTY_ID (object, property_id, pspec); + break; + } +} + +static void +_get_property (GObject *object, + guint property_id, + GValue *value, + GParamSpec *pspec) +{ + BingMapSource *self = BING_MAP_SOURCE (object); + BingMapSourcePrivate *priv = BING_MAP_SOURCE_GET_PRIVATE (self); + + switch (property_id) + { + case PROP_HOSTNAME: + g_value_set_string (value, priv->hostname); + break; + + case PROP_URL: + g_value_set_string (value, priv->url); + break; + + case PROP_API_KEY: + g_value_set_string (value, priv->api_key); + break; + + default: + /* We don't have any other property... */ + G_OBJECT_WARN_INVALID_PROPERTY_ID (object, property_id, pspec); + break; + } +} + + +static void +bing_map_source_class_init (BingMapSourceClass *klass) +{ + GObjectClass* object_class = G_OBJECT_CLASS (klass); + VikMapSourceDefaultClass* grandparent_class = VIK_MAP_SOURCE_DEFAULT_CLASS (klass); + VikMapSourceClass* base_class = VIK_MAP_SOURCE_CLASS (klass); + GParamSpec *pspec = NULL; + + /* Overiding methods */ + object_class->set_property = _set_property; + object_class->get_property = _get_property; + grandparent_class->get_uri = bget_uri; + grandparent_class->get_hostname = bget_hostname; + base_class->get_logo = _get_logo; + base_class->get_copyright = _get_copyright; + + pspec = g_param_spec_string ("hostname", + "Hostname", + "The hostname of the map server", + "" /* default value */, + G_PARAM_CONSTRUCT_ONLY | G_PARAM_READWRITE); + g_object_class_install_property (object_class, PROP_HOSTNAME, pspec); + + pspec = g_param_spec_string ("url", + "URL", + "The template of the tiles' URL", + "" /* default value */, + G_PARAM_CONSTRUCT_ONLY | G_PARAM_READWRITE); + g_object_class_install_property (object_class, PROP_URL, pspec); + + pspec = g_param_spec_string ("api-key", + "API key", + "The API key to access Bing", + "" /* default value */, + G_PARAM_CONSTRUCT_ONLY | G_PARAM_READWRITE); + g_object_class_install_property (object_class, PROP_API_KEY, pspec); + + g_type_class_add_private (klass, sizeof (BingMapSourcePrivate)); + + object_class->finalize = bing_map_source_finalize; + + pixbuf = gdk_pixbuf_from_pixdata ( &bing_maps_pixbuf, TRUE, NULL ); +} + +static gchar * +compute_quad_tree(int zoom, int tilex, int tiley) +{ + /* Picked from http://trac.openstreetmap.org/browser/applications/editors/josm/plugins/slippymap/src/org/openstreetmap/josm/plugins/slippymap/SlippyMapPreferences.java?rev=24486 */ + gchar k[20]; + int ik = 0; + int i = 0; + for(i = zoom; i > 0; i--) + { + char digit = 48; + int mask = 1 << (i - 1); + if ((tilex & mask) != 0) { + digit += 1; + } + if ((tiley & mask) != 0) { + digit += 2; + } + k[ik++] = digit; + } + k[ik] = '\0'; + return g_strdup(k); +} + +static gchar * +bget_uri( VikMapSourceDefault *self, MapCoord *src ) +{ + g_return_val_if_fail (BING_IS_MAP_SOURCE(self), NULL); + + BingMapSourcePrivate *priv = BING_MAP_SOURCE_GET_PRIVATE(self); + gchar *quadtree = compute_quad_tree (17 - src->scale, src->x, src->y); + gchar *uri = g_strdup_printf ( priv->url, quadtree ); + g_free (quadtree); + return uri; +} + +static gchar * +bget_hostname( VikMapSourceDefault *self ) +{ + g_return_val_if_fail (BING_IS_MAP_SOURCE(self), NULL); + + BingMapSourcePrivate *priv = BING_MAP_SOURCE_GET_PRIVATE(self); + return g_strdup( priv->hostname ); +} + +static const GdkPixbuf * +_get_logo( VikMapSource *self ) +{ + return pixbuf; +} + +static void +_get_copyright(VikMapSource * self, LatLonBBox bbox, gdouble zoom, void (*fct)(VikViewport*,const gchar*), void *data) +{ + g_return_if_fail (BING_IS_MAP_SOURCE(self)); + g_debug("%s: looking for %g %g %g %g at %g", __FUNCTION__, bbox.south, bbox.north, bbox.east, bbox.west, zoom); + + BingMapSourcePrivate *priv = BING_MAP_SOURCE_GET_PRIVATE(self); + + int level = map_utils_mpp_to_scale (zoom); + + /* Loop over all known attributions */ + GList *attribution = priv->attributions; + if (attribution == NULL && g_strcmp0 ("", priv->api_key)) { + if ( ! priv->loading_attributions ) + _async_load_attributions (BING_MAP_SOURCE (self)); + else + // Wait until attributions loaded before processing them + return; + } + while (attribution != NULL) { + struct _Attribution *current = (struct _Attribution*)attribution->data; + /* g_debug("%s %g %g %g %g %d %d", __FUNCTION__, current->bounds.south, current->bounds.north, current->bounds.east, current->bounds.west, current->minZoom, current->maxZoom); */ + if (BBOX_INTERSECT(bbox, current->bounds) && + (17 - level) > current->minZoom && + (17 - level) < current->maxZoom) { + (*fct)(data, current->attribution); + g_debug("%s: found match %s", __FUNCTION__, current->attribution); + } + attribution = attribution->next; + } +} + +/* Called for open tags */ +static void +bstart_element (GMarkupParseContext *context, + const gchar *element_name, + const gchar **attribute_names, + const gchar **attribute_values, + gpointer user_data, + GError **error) +{ + BingMapSource *self = BING_MAP_SOURCE (user_data); + BingMapSourcePrivate *priv = BING_MAP_SOURCE_GET_PRIVATE (self); + const gchar *element = g_markup_parse_context_get_element (context); + if (strcmp (element, "CoverageArea") == 0) { + /* New Attribution */ + struct _Attribution *attribution = g_malloc0 (sizeof(struct _Attribution)); + priv->attributions = g_list_append (priv->attributions, attribution); + attribution->attribution = g_strdup (priv->attribution); + } +} + +/* Called for character data */ +/* text is not nul-terminated */ +static void +btext (GMarkupParseContext *context, + const gchar *text, + gsize text_len, + gpointer user_data, + GError **error) +{ + BingMapSource *self = BING_MAP_SOURCE (user_data); + BingMapSourcePrivate *priv = BING_MAP_SOURCE_GET_PRIVATE (self); + + struct _Attribution *attribution = priv->attributions == NULL ? NULL : g_list_last (priv->attributions)->data; + const gchar *element = g_markup_parse_context_get_element (context); + gchar *textl = g_strndup (text, text_len); + const GSList *stack = g_markup_parse_context_get_element_stack (context); + int len = g_slist_length ((GSList *)stack); + + const gchar *parent = len > 1 ? g_slist_nth_data ((GSList *)stack, 1) : NULL; + if (strcmp (element, "Attribution") == 0) { + g_free (priv->attribution); + priv->attribution = g_strdup (textl); + } + else { + if ( attribution ) { + if (parent != NULL && strcmp (parent, "CoverageArea") == 0) { + if (strcmp (element, "ZoomMin") == 0) { + attribution->minZoom = atoi (textl); + } else if (strcmp (element, "ZoomMax") == 0) { + attribution->maxZoom = atoi (textl); + } + } else if (parent != NULL && strcmp (parent, "BoundingBox") == 0) { + if (strcmp (element, "SouthLatitude") == 0) { + attribution->bounds.south = g_ascii_strtod (textl, NULL); + } else if (strcmp (element, "WestLongitude") == 0) { + attribution->bounds.west = g_ascii_strtod (textl, NULL); + } else if (strcmp (element, "NorthLatitude") == 0) { + attribution->bounds.north = g_ascii_strtod (textl, NULL); + } else if (strcmp (element, "EastLongitude") == 0) { + attribution->bounds.east = g_ascii_strtod (textl, NULL); + } + } + } + } + g_free(textl); +} + +static gboolean +_parse_file_for_attributions(BingMapSource *self, gchar *filename) +{ + GMarkupParser xml_parser; + GMarkupParseContext *xml_context = NULL; + GError *error = NULL; + BingMapSourcePrivate *priv = BING_MAP_SOURCE_GET_PRIVATE (self); + g_return_val_if_fail(priv != NULL, FALSE); + + FILE *file = g_fopen (filename, "r"); + if (file == NULL) + /* TODO emit warning */ + return FALSE; + + /* setup context parse (ie callbacks) */ + xml_parser.start_element = &bstart_element; + xml_parser.end_element = NULL; + xml_parser.text = &btext; + xml_parser.passthrough = NULL; + xml_parser.error = NULL; + + xml_context = g_markup_parse_context_new(&xml_parser, 0, self, NULL); + + gchar buff[BUFSIZ]; + size_t nb; + size_t offset = -1; + while (xml_context && + (nb = fread (buff, sizeof(gchar), BUFSIZ, file)) > 0) + { + if (offset == -1) + /* first run */ + /* Avoid possible BOM at begining of the file */ + offset = buff[0] == '<' ? 0 : 3; + else + /* reset offset */ + offset = 0; + if (!g_markup_parse_context_parse(xml_context, buff+offset, nb-offset, &error)) + { + fprintf(stderr, "%s: parsing error: %s.\n", + __FUNCTION__, error->message); + g_markup_parse_context_free(xml_context); + xml_context = NULL; + } + g_clear_error (&error); + } + /* cleanup */ + if (xml_context && + !g_markup_parse_context_end_parse(xml_context, &error)) + fprintf(stderr, "%s: errors occurred while reading file: %s.\n", + __FUNCTION__, error->message); + g_clear_error (&error); + + if (xml_context) + g_markup_parse_context_free(xml_context); + xml_context = NULL; + fclose (file); + + if (vik_debug) { + GList *attribution = priv->attributions; + while (attribution != NULL) { + struct _Attribution *aa = (struct _Attribution*)attribution->data; + g_debug ("Bing Attribution: %s from %d to %d %g %g %g %g", aa->attribution, aa->minZoom, aa->maxZoom, aa->bounds.south, aa->bounds.north, aa->bounds.east, aa->bounds.west); + attribution = attribution->next; + } + } + + return TRUE; +} + +static int +_load_attributions ( BingMapSource *self ) +{ + int ret = 0; /* OK */ + + BingMapSourcePrivate *priv = BING_MAP_SOURCE_GET_PRIVATE (self); + priv->loading_attributions = TRUE; + gchar *uri = g_strdup_printf(URL_ATTR_FMT, priv->api_key); + + gchar *tmpname = a_download_uri_to_tmp_file ( uri, vik_map_source_default_get_download_options(VIK_MAP_SOURCE_DEFAULT(self)) ); + if ( !tmpname ) { + ret = -1; + goto done; + } + + g_debug("%s: %s", __FUNCTION__, tmpname); + if (!_parse_file_for_attributions(self, tmpname)) { + ret = -1; + } + + (void)g_remove(tmpname); + g_free(tmpname); +done: + priv->loading_attributions = FALSE; + g_free(uri); + return ret; +} + +static gboolean +_emit_update ( gpointer data ) +{ + //if ( data ) + // vik_layers_panel_emit_update ( VIK_LAYERS_PANEL (data) ); + return FALSE; +} + +static int +_load_attributions_thread ( BingMapSource *self, gpointer threaddata ) +{ + _load_attributions ( self ); + int result = a_background_thread_progress ( threaddata, 1.0 ); + if ( result != 0 ) + return -1; /* Abort thread */ + + /* Emit update */ + // As we are on a download thread, must the update GUI from the main loop + // TODO: have reference to the window/viewport/layerspanel to update... + (void)gdk_threads_add_idle ( _emit_update, NULL ); + + return 0; +} + +static void +_async_load_attributions ( BingMapSource *self ) +{ + a_background_thread ( BACKGROUND_POOL_REMOTE, + /*VIK_GTK_WINDOW_FROM_WIDGET(vp)*/NULL, + _("Bing attribution Loading"), + (vik_thr_func) _load_attributions_thread, + self, + NULL, + NULL, + 1 ); + +} + +/** + * bing_map_source_new_with_id: + * @id: internal identifier. + * @label: the label to display in map provider selector. + * @key: the API key to access Bing's services. + * + * Constructor for Bing map source. + * + * Returns: a newly allocated BingMapSource GObject. + */ +BingMapSource * +bing_map_source_new_with_id (guint16 id, const gchar *label, const gchar *key) +{ + /* initialize settings here */ + return g_object_new(BING_TYPE_MAP_SOURCE, + "id", id, + "label", label, + "name", "Bing-Aerial", + "hostname", "ecn.t2.tiles.virtualearth.net", + "url", "/tiles/a%s.jpeg?g=587", + "api-key", key, + "check-file-server-time", TRUE, + "zoom-min", 0, + "zoom-max", 19, // NB: Might be regionally different rather than the same across the world + "copyright", "© 2011 Microsoft Corporation and/or its suppliers", + "license", "Microsoft Bing Maps Specific", + "license-url", "http://www.microsoft.com/maps/assets/docs/terms.aspx", + NULL); +} diff --git a/src/bingmapsource.h b/src/bingmapsource.h new file mode 100644 index 0000000..bab5529 --- /dev/null +++ b/src/bingmapsource.h @@ -0,0 +1,55 @@ +/* -*- Mode: C; indent-tabs-mode: t; c-basic-offset: 4; tab-width: 4 -*- */ +/* + * viking + * Copyright (C) 2011, Guilhem Bonnefille + * + * viking 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. + * + * viking 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, see . + */ + +#ifndef _BING_MAP_SOURCE_H +#define _BING_MAP_SOURCE_H + +#include "vikcoord.h" +#include "mapcoord.h" +#include "vikslippymapsource.h" + +G_BEGIN_DECLS + +#define BING_TYPE_MAP_SOURCE (bing_map_source_get_type ()) +#define BING_MAP_SOURCE(obj) (G_TYPE_CHECK_INSTANCE_CAST ((obj), BING_TYPE_MAP_SOURCE, BingMapSource)) +#define BING_MAP_SOURCE_CLASS(klass) (G_TYPE_CHECK_CLASS_CAST ((klass), BING_TYPE_MAP_SOURCE, BingMapSourceClass)) +#define BING_IS_MAP_SOURCE(obj) (G_TYPE_CHECK_INSTANCE_TYPE ((obj), BING_TYPE_MAP_SOURCE)) +#define BING_IS_MAP_SOURCE_CLASS(klass) (G_TYPE_CHECK_CLASS_TYPE ((klass), BING_TYPE_MAP_SOURCE)) +#define BING_MAP_SOURCE_GET_CLASS(obj) (G_TYPE_INSTANCE_GET_CLASS ((obj), BING_TYPE_MAP_SOURCE, BingMapSourceClass)) + +typedef struct _BingMapSourceClass BingMapSourceClass; +typedef struct _BingMapSource BingMapSource; + +struct _BingMapSourceClass +{ + VikSlippyMapSourceClass parent_class; +}; + +struct _BingMapSource +{ + VikSlippyMapSource parent_instance; +}; + +GType bing_map_source_get_type (void) G_GNUC_CONST; + +BingMapSource * bing_map_source_new_with_id (guint16 id, const gchar *label, const gchar *key); + +G_END_DECLS + +#endif /* _BING_MAP_SOURCE_H_ */ diff --git a/src/bluemarble.c b/src/bluemarble.c new file mode 100644 index 0000000..a56068d --- /dev/null +++ b/src/bluemarble.c @@ -0,0 +1,48 @@ +/* + * viking -- GPS Data and Topo Analyzer, Explorer, and Manager + * + * Copyright (C) 2003-2005, Evan Battaglia + * Copyright (C) 2008, Guilhem Bonnefille + * + * 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., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA + * + */ + +#include "bluemarble.h" +#include "vikmapslayer.h" +#include "vikslippymapsource.h" +#include "map_ids.h" + +/* initialisation */ +void bluemarble_init () +{ + VikMapSource *bluemarble_type = VIK_MAP_SOURCE(g_object_new(VIK_TYPE_SLIPPY_MAP_SOURCE, + "id", MAP_ID_BLUE_MARBLE, + "name", "BlueMarble", + "label", "BlueMarble", + "hostname", "s3.amazonaws.com", + "url", "/com.modestmaps.bluemarble/%d-r%3$d-c%2$d.jpg", + "zoom-min", 0, + "zoom-max", 9, + "copyright", "© NASA's Earth Observatory", + "license", "NASA Terms of Use", + "license-url", "http://visibleearth.nasa.gov/useterms.php", + NULL)); + /* Credit/Copyright from: http://earthobservatory.nasa.gov/Features/BlueMarble/ */ + /* BlueMarble image hosting is courtesy of the Modest Maps project: http://modestmaps.com/ */ + + maps_layer_register_map_source (bluemarble_type); +} + diff --git a/src/bluemarble.h b/src/bluemarble.h new file mode 100644 index 0000000..3a8ddf8 --- /dev/null +++ b/src/bluemarble.h @@ -0,0 +1,28 @@ +/* + * viking -- GPS Data and Topo Analyzer, Explorer, and Manager + * + * Copyright (C) 2003-2005, Evan Battaglia + * Copyright (C) 2008, Guilhem Bonnefille + * + * 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., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA + * + */ + +#ifndef __VIKING_BLUEMARBLE_H +#define __VIKING_BLUEMARBLE_H + +void bluemarble_init (); + +#endif diff --git a/src/clipboard.c b/src/clipboard.c new file mode 100644 index 0000000..a068b38 --- /dev/null +++ b/src/clipboard.c @@ -0,0 +1,525 @@ +/* + * viking -- GPS Data and Topo Analyzer, Explorer, and Manager + * + * Copyright (C) 2003-2005, Evan Battaglia + * Copyright (C) 2005, Alex Foobarian + * + * 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., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA + * + */ + +#ifdef HAVE_CONFIG_H +#include "config.h" +#endif + +#include +#include +#ifdef HAVE_SYS_TYPES_H +#include +#endif +#ifdef HAVE_UNISTD_H +#include +#endif + +#include + +#include "viking.h" + + +typedef struct { + gpointer clipboard; + gint pid; + VikClipboardDataType type; + gint subtype; + guint16 layer_type; + guint len; + gchar *text; + guint8 data[0]; +} vik_clipboard_t; + +static GtkTargetEntry target_table[] = { + { "application/viking", 0, 0 }, + { "STRING", 0, 1 }, +}; + +/***************************************************************** + ** functions which send to the clipboard client (we are owner) ** + *****************************************************************/ + +static void clip_get ( GtkClipboard *c, GtkSelectionData *selection_data, guint info, gpointer p ) +{ + vik_clipboard_t *vc = p; + if ( info == 0 ) { + // Viking Data Type + // g_print("clip_get: vc = %p, size = %d\n", vc, sizeof(*vc) + vc->len); + gtk_selection_data_set ( selection_data, gtk_selection_data_get_target(selection_data), 8, (void *)vc, sizeof(*vc) + vc->len ); + } + if ( info == 1 ) { + // Should be a string, but make sure it's something + if ( vc->text ) + gtk_selection_data_set_text ( selection_data, vc->text, -1); // string text is null terminated + } + +} + +static void clip_clear ( GtkClipboard *c, gpointer p ) +{ + vik_clipboard_t* vc = (vik_clipboard_t*)p; + g_free(vc->text); + g_free(vc); +} + + +/************************************************************************** + ** functions which receive from the clipboard owner (we are the client) ** + **************************************************************************/ + +/* our own data type */ +static void clip_receive_viking ( GtkClipboard *c, GtkSelectionData *sd, gpointer p ) +{ + VikLayersPanel *vlp = p; + vik_clipboard_t *vc; + if (gtk_selection_data_get_length(sd) == -1) { + g_warning ( _("paste failed") ); + return; + } + // g_print("clip receive: target = %s, type = %s\n", gdk_atom_name(gtk_selection_data_get_target(sd), gdk_atom_name(sd->type)); + //g_assert(!strcmp(gdk_atom_name(gtk_selection_data_get_target(sd)), target_table[0].target)); + + vc = (vik_clipboard_t *)gtk_selection_data_get_data(sd); + // g_print(" sd->data = %p, sd->length = %d, vc->len = %d\n", sd->data, sd->length, vc->len); + + if (gtk_selection_data_get_length(sd) != sizeof(*vc) + vc->len) { + g_warning ( _("wrong clipboard data size") ); + return; + } + + if ( vc->type == VIK_CLIPBOARD_DATA_LAYER ) + { + VikLayer *new_layer = vik_layer_unmarshall ( vc->data, vc->len, vik_layers_panel_get_viewport(vlp) ); + vik_layers_panel_add_layer ( vlp, new_layer ); + } + else if ( vc->type == VIK_CLIPBOARD_DATA_SUBLAYER ) + { + VikLayer *sel = vik_layers_panel_get_selected ( vlp ); + if ( sel && sel->type == vc->layer_type) + { + if ( vik_layer_get_interface(vc->layer_type)->paste_item ) + vik_layer_get_interface(vc->layer_type)->paste_item ( sel, vc->subtype, vc->data, vc->len); + } + else + a_dialog_error_msg_extra ( VIK_GTK_WINDOW_FROM_WIDGET(GTK_WIDGET(vlp)), + _("The clipboard contains sublayer data for %s layers. " + "You must select a layer of this type to paste the clipboard data."), + vik_layer_get_interface(vc->layer_type)->name ); + } +} + + + +/** + * clip_parse_latlon: + * @text: text containing LatLon data. + * @coord: computed coordinates. + * + * Utility func to handle pasted text: + * search for N dd.dddddd W dd.dddddd, N dd° dd.dddd W dd° dd.ddddd and so forth. + * + * Returns: TRUE if coordinates are set. + */ +static gboolean clip_parse_latlon ( const gchar *text, struct LatLon *coord ) +{ + gint latdeg, londeg, latmi, lonmi; + gdouble lats, lons; + gdouble latm, lonm; + gdouble lat, lon; + gchar *cand; + gint len, i; + gchar *s = g_strdup(text); + + // g_print("parsing %s\n", s); + + len = strlen(s); + + /* remove non-digits following digits; gets rid of degree symbols or whatever people use, and + * punctuation + */ + for (i=0; i= -90.0 && lat <= 90.0 && lon >= -180.0 && lon <= 180.0) { + coord->lat = lat; + coord->lon = lon; + return TRUE; + } + return FALSE; +} + +static void clip_add_wp(VikLayersPanel *vlp, struct LatLon *coord) +{ + VikCoord vc; + VikLayer *sel = vik_layers_panel_get_selected ( vlp ); + + + vik_coord_load_from_latlon ( &vc, VIK_COORD_LATLON, coord ); + + if (sel && sel->type == VIK_LAYER_TRW) { + vik_trw_layer_new_waypoint ( VIK_TRW_LAYER(sel), VIK_GTK_WINDOW_FROM_LAYER(sel), &vc ); + trw_layer_calculate_bounds_waypoints ( VIK_TRW_LAYER(sel) ); + vik_layer_emit_update ( VIK_LAYER(sel) ); + } else { + a_dialog_error_msg_extra ( VIK_GTK_WINDOW_FROM_WIDGET(GTK_WIDGET(vlp)), _("In order to paste a waypoint, please select an appropriate layer to paste into."), NULL); + } +} + +static void clip_receive_text (GtkClipboard *c, const gchar *text, gpointer p) +{ + VikLayersPanel *vlp = p; + + g_debug ( "got text: %s", text ); + + VikLayer *sel = vik_layers_panel_get_selected ( vlp ); + if ( sel && vik_treeview_get_editing ( sel->vt ) ) { + GtkTreeIter iter; + if ( vik_treeview_get_selected_iter ( sel->vt, &iter ) ) { + // Try to sanitize input: + gchar *name = g_strescape ( text, NULL ); + vik_layer_rename ( sel, name ); + vik_treeview_item_set_name ( sel->vt, &iter, name ); + g_free ( name ); + } + return; + } + + struct LatLon coord; + if (clip_parse_latlon(text, &coord)) { + clip_add_wp(vlp, &coord); + } +} + +static void clip_receive_html ( GtkClipboard *c, GtkSelectionData *sd, gpointer p ) +{ + VikLayersPanel *vlp = p; + gsize r, w; + GError *err = NULL; + gchar *s, *span; + gint tag = 0, i; + struct LatLon coord; + + if (gtk_selection_data_get_length(sd) == -1) { + return; + } + + /* - copying from Mozilla seems to give html in UTF-16. */ + if (!(s = g_convert ( (gchar *)gtk_selection_data_get_data(sd), gtk_selection_data_get_length(sd), "UTF-8", "UTF-16", &r, &w, &err))) { + return; + } + // g_print("html is %d bytes long: %s\n", gtk_selection_data_get_length(sd), s); + + /* scrape a coordinate pasted from a geocaching.com page: look for a + * telltale tag if possible, and then remove tags + */ + if (!(span = g_strstr_len(s, w, ""))) { + span = s; + } + for (i=0; i0) { + span[i] = ' '; + } + if (ch == '>') { + if (tag>0) tag--; + } + } + if (clip_parse_latlon(span, &coord)) { + clip_add_wp(vlp, &coord); + } + + g_free(s); +} + +/** + * clip_receive_targets: + * + * Deal with various data types a clipboard may hold. + */ +void clip_receive_targets ( GtkClipboard *c, GdkAtom *a, gint n, gpointer p ) +{ + VikLayersPanel *vlp = p; + gint i; + + for (i=0; ivt, &iter ) ) + return; + layer_type = sel->type; + + // Since we intercept copy and paste keyboard operations, this is called even when a cell is being edited + if ( vik_treeview_get_editing ( sel->vt ) ) { + type = VIK_CLIPBOARD_DATA_TEXT; + // I don't think we can access what is actually selected (internal to GTK) so we go for the name of the item + // At least this is better than copying the layer data - which is even further away from what the user would be expecting... + name = vik_treeview_item_get_name ( sel->vt, &iter ); + len = 0; + } + else { + if ( vik_treeview_item_get_type ( sel->vt, &iter ) == VIK_TREEVIEW_TYPE_SUBLAYER ) { + type = VIK_CLIPBOARD_DATA_SUBLAYER; + if ( vik_layer_get_interface(layer_type)->copy_item) { + subtype = vik_treeview_item_get_data(sel->vt, &iter); + vik_layer_get_interface(layer_type)->copy_item(sel, subtype, vik_treeview_item_get_pointer(sel->vt, &iter), &data, &len ); + // This name is used in setting the text representation of the item on the clipboard. + name = vik_treeview_item_get_name(sel->vt, &iter); + } + } + else { + type = VIK_CLIPBOARD_DATA_LAYER; + vik_layer_marshall ( sel, &data, &len ); + name = vik_layer_get_name ( vik_treeview_item_get_pointer(sel->vt, &iter) ); + } + } + a_clipboard_copy ( type, layer_type, subtype, len, name, data ); +} + +void a_clipboard_copy( VikClipboardDataType type, guint16 layer_type, gint subtype, guint len, const gchar* text, guint8 * data) +{ + vik_clipboard_t * vc = g_malloc(sizeof(*vc) + len); + GtkClipboard *c = gtk_clipboard_get ( GDK_SELECTION_CLIPBOARD ); + + vc->type = type; + vc->layer_type = layer_type; + vc->subtype = subtype; + vc->len = len; + vc->text = g_strdup (text); + if ( data ) { + memcpy(vc->data, data, len); + g_free(data); + } + vc->pid = getpid(); + + // Simple clipboard copy when necessary + if ( type == VIK_CLIPBOARD_DATA_TEXT ) + gtk_clipboard_set_text ( c, text, -1 ); + else + gtk_clipboard_set_with_data ( c, target_table, G_N_ELEMENTS(target_table), clip_get, clip_clear, vc ); +} + +/** + * a_clipboard_paste: + * + * To deal with multiple data types, we first request the type of data on the clipboard, + * and handle them in the callback. + */ +gboolean a_clipboard_paste ( VikLayersPanel *vlp ) +{ + GtkClipboard *c = gtk_clipboard_get ( GDK_SELECTION_CLIPBOARD ); + gtk_clipboard_request_targets ( c, clip_receive_targets, vlp ); + return TRUE; +} + +/** + * + * Detect our own data types + */ +static void clip_determine_viking_type ( GtkClipboard *c, GtkSelectionData *sd, gpointer p ) +{ + VikClipboardDataType *vdct = p; + // Default value + *vdct = VIK_CLIPBOARD_DATA_NONE; + vik_clipboard_t *vc; + if (gtk_selection_data_get_length(sd) == -1) { + g_warning ("DETERMINING TYPE: length failure"); + return; + } + + vc = (vik_clipboard_t *)gtk_selection_data_get_data(sd); + + if ( !vc->type ) + return; + + if ( vc->type == VIK_CLIPBOARD_DATA_LAYER ) { + *vdct = VIK_CLIPBOARD_DATA_LAYER; + } + else if ( vc->type == VIK_CLIPBOARD_DATA_SUBLAYER ) { + *vdct = VIK_CLIPBOARD_DATA_SUBLAYER; + } + else { + g_warning ("DETERMINING TYPE: THIS SHOULD NEVER HAPPEN"); + } +} + +static void clip_determine_type ( GtkClipboard *c, GdkAtom *a, gint n, gpointer p ) +{ + gint i; + for (i=0; i + * + * 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., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA + * + */ + +#ifndef _VIKING_CLIPBOARD_H +#define _VIKING_CLIPBOARD_H + +#include "viklayerspanel.h" + +G_BEGIN_DECLS + +typedef enum { + VIK_CLIPBOARD_DATA_NONE = 0, + VIK_CLIPBOARD_DATA_LAYER, + VIK_CLIPBOARD_DATA_SUBLAYER, + VIK_CLIPBOARD_DATA_TEXT, +} VikClipboardDataType; + +void a_clipboard_copy(VikClipboardDataType type, guint16 layer_type, gint subtype, guint len, const gchar* text, guint8 * data); +void a_clipboard_copy_selected ( VikLayersPanel *vlp ); +gboolean a_clipboard_paste ( VikLayersPanel *vlp ); +VikClipboardDataType a_clipboard_type ( ); + +G_END_DECLS + +#endif diff --git a/src/compression.c b/src/compression.c new file mode 100644 index 0000000..9f96598 --- /dev/null +++ b/src/compression.c @@ -0,0 +1,231 @@ +/* -*- Mode: C; indent-tabs-mode: t; c-basic-offset: 4; tab-width: 4 -*- */ +/* + * viking -- GPS Data and Topo Analyzer, Explorer, and Manager + * + * Copyright (C) 2003-2008, Evan Battaglia + * Copyright (C) 2007, Quy Tonthat + * Copyright (C) 2013, Rob Norris + * + * 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., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA + * + */ + +#ifdef HAVE_CONFIG_H +#include "config.h" +#endif + +#ifdef HAVE_LIBZ +#include +#endif + +#ifdef HAVE_BZLIB_H +#include +#endif + +#include "compression.h" +#include "string.h" +#include +#include + +#ifdef HAVE_LIBZ +/* return size of unzip data or 0 if failed */ +static guint uncompress_data(void *uncompressed_buffer, guint uncompressed_size, void *compressed_data, guint compressed_size) +{ + z_stream stream; + int err; + + stream.next_in = compressed_data; + stream.avail_in = compressed_size; + stream.next_out = uncompressed_buffer; + stream.avail_out = uncompressed_size; + stream.zalloc = (alloc_func)0; + stream.zfree = (free_func)0; + stream.opaque = (voidpf)0; + + /* negative windowBits to inflateInit2 means "no header" */ + if ((err = inflateInit2(&stream, -MAX_WBITS)) != Z_OK) { + g_warning("%s(): inflateInit2 failed", __PRETTY_FUNCTION__); + return 0; + } + + err = inflate(&stream, Z_FINISH); + if ((err != Z_OK) && (err != Z_STREAM_END) && stream.msg) { + g_warning("%s() inflate failed err=%d \"%s\"", __PRETTY_FUNCTION__, err, stream.msg == NULL ? "unknown" : stream.msg); + inflateEnd(&stream); + return 0; + } + + inflateEnd(&stream); + return(stream.total_out); +} +#endif + +/** + * unzip_file: + * @zip_file: pointer to start of compressed data + * @unzip_size: the size of the compressed data block + * + * Returns a pointer to uncompressed data (maybe NULL) + */ +void *unzip_file(gchar *zip_file, gulong *unzip_size) +{ + void *unzip_data = NULL; +#ifndef HAVE_LIBZ + goto end; +#else + gchar *zip_data; + // See http://en.wikipedia.org/wiki/Zip_(file_format) + struct _lfh { + guint32 sig; + guint16 extract_version; + guint16 flags; + guint16 comp_method; + guint16 time; + guint16 date; + guint32 crc_32; + guint32 compressed_size; + guint32 uncompressed_size; + guint16 filename_len; + guint16 extra_field_len; + } __attribute__ ((gcc_struct,__packed__)) *local_file_header = NULL; + + if ( sizeof(struct _lfh) != 30 ) { + g_critical ("Incorrect internal zip header size, should be 30 but is %zd", sizeof(struct _lfh) ); + goto end; + } + + local_file_header = (struct _lfh *) zip_file; + if (GUINT32_FROM_LE(local_file_header->sig) != 0x04034b50) { + g_warning("%s(): wrong format (%d)", __PRETTY_FUNCTION__, GUINT32_FROM_LE(local_file_header->sig)); + goto end; + } + + zip_data = zip_file + sizeof(struct _lfh) + + GUINT16_FROM_LE(local_file_header->filename_len) + + GUINT16_FROM_LE(local_file_header->extra_field_len); + gulong uncompressed_size = GUINT32_FROM_LE(local_file_header->uncompressed_size); + unzip_data = g_malloc(uncompressed_size); + + // Protection against malloc failures + // ATM not normally been checking malloc failures in Viking but sometimes using zip files can be quite large + // (e.g. when using DEMs) so more potential for failure. + if ( !unzip_data ) + goto end; + + g_debug ("%s: method %d: from size %d to %ld", __FUNCTION__, GUINT16_FROM_LE(local_file_header->comp_method), GUINT32_FROM_LE(local_file_header->compressed_size), uncompressed_size); + + if ( GUINT16_FROM_LE(local_file_header->comp_method) == 0 && + (uncompressed_size == GUINT32_FROM_LE(local_file_header->compressed_size)) ) { + // Stored only - no need to 'uncompress' + // Thus just copy + memcpy ( unzip_data, zip_data, uncompressed_size ); + *unzip_size = uncompressed_size; + goto end; + } + + if (!(*unzip_size = uncompress_data(unzip_data, uncompressed_size, zip_data, GUINT32_FROM_LE(local_file_header->compressed_size)))) { + g_free(unzip_data); + unzip_data = NULL; + goto end; + } + +#endif +end: + return(unzip_data); +} + +/** + * uncompress_bzip2: + * @name: The name of the file to attempt to decompress + * + * Returns: The name of the uncompressed file (in a temporary location) or NULL + * free the returned name after use. + * + * Also see: http://www.bzip.org/1.0.5/bzip2-manual-1.0.5.html + */ +gchar* uncompress_bzip2 ( gchar *name ) +{ +#ifdef HAVE_BZLIB_H + g_debug ( "%s: bzip2 %s", __FUNCTION__, BZ2_bzlibVersion() ); + + FILE *ff = g_fopen ( name, "rb" ); + if ( !ff ) + return NULL; + + int bzerror; + BZFILE* bf = BZ2_bzReadOpen ( &bzerror, ff, 0, 0, NULL, 0 ); // This should take care of the bz2 file header + if ( bzerror != BZ_OK ) { + BZ2_bzReadClose ( &bzerror, bf ); + // handle error + g_warning ( "%s: BZ ReadOpen error on %s", __FUNCTION__, name ); + return NULL; + } + + GFileIOStream *gios; + GError *error = NULL; + gchar *tmpname = NULL; +#if GLIB_CHECK_VERSION(2,32,0) + GFile *gf = g_file_new_tmp ( "vik-bz2-tmp.XXXXXX", &gios, &error ); + tmpname = g_file_get_path (gf); +#else + gint fd = g_file_open_tmp ( "vik-bz2-tmp.XXXXXX", &tmpname, &error ); + if ( error ) { + g_warning ( error->message ); + g_error_free ( error ); + return NULL; + } + gios = g_file_open_readwrite ( g_file_new_for_path (tmpname), NULL, &error ); + if ( error ) { + g_warning ( error->message ); + g_error_free ( error ); + return NULL; + } +#endif + + GOutputStream *gos = g_io_stream_get_output_stream ( G_IO_STREAM(gios) ); + + // Process in arbitary sized chunks + char buf[4096]; + bzerror = BZ_OK; + int nBuf = 0; + // Now process the actual compression data + while ( bzerror == BZ_OK ) { + nBuf = BZ2_bzRead ( &bzerror, bf, buf, 4096 ); + if ( bzerror == BZ_OK || bzerror == BZ_STREAM_END) { + // do something with buf[0 .. nBuf-1] + if ( g_output_stream_write ( gos, buf, nBuf, NULL, &error ) < 0 ) { + g_critical ( "Couldn't write bz2 tmp %s file due to %s", tmpname, error->message ); + g_error_free (error); + BZ2_bzReadClose ( &bzerror, bf ); + goto end; + } + } + } + if ( bzerror != BZ_STREAM_END ) { + // handle error... + g_warning ( "%s: BZ error :( %d. read %d", __FUNCTION__, bzerror, nBuf ); + } + BZ2_bzReadClose ( &bzerror, bf ); + g_output_stream_close ( gos, NULL, &error ); + + end: + g_object_unref ( gios ); + fclose ( ff ); + + return tmpname; +#else + return NULL; +#endif +} diff --git a/src/compression.h b/src/compression.h new file mode 100644 index 0000000..3aa2fdb --- /dev/null +++ b/src/compression.h @@ -0,0 +1,37 @@ +/* -*- Mode: C; indent-tabs-mode: t; c-basic-offset: 4; tab-width: 4 -*- */ +/* + * viking -- GPS Data and Topo Analyzer, Explorer, and Manager + * + * Copyright (C) 2013, Rob Norris + * + * 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., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA + * + */ + +#ifndef _VIKING_COMPRESSION_H +#define _VIKING_COMPRESSION_H + +#include + +G_BEGIN_DECLS + +void *unzip_file(gchar *zip_file, gulong *unzip_size); + +gchar* uncompress_bzip2 ( gchar *name ); + +G_END_DECLS + +#endif + diff --git a/src/config.h b/src/config.h new file mode 100644 index 0000000..82797db --- /dev/null +++ b/src/config.h @@ -0,0 +1,327 @@ +/* src/config.h. Generated from config.h.in by configure. */ +/* src/config.h.in. Generated from configure.ac by autoheader. */ + +/* Define to 1 if translation of program messages to the user's native + language is requested. */ +#define ENABLE_NLS 1 + +/* Gettext package name */ +#define GETTEXT_PACKAGE "viking" + +/* Define to 1 if you have the `bind_textdomain_codeset' function. */ +#define HAVE_BIND_TEXTDOMAIN_CODESET 1 + +/* Define to 1 if you have the header file. */ +#define HAVE_BZLIB_H 1 + +/* Define to 1 if you have the MacOS X function CFLocaleCopyCurrent in the + CoreFoundation framework. */ +/* #undef HAVE_CFLOCALECOPYCURRENT */ + +/* Define to 1 if you have the MacOS X function CFPreferencesCopyAppValue in + the CoreFoundation framework. */ +/* #undef HAVE_CFPREFERENCESCOPYAPPVALUE */ + +/* Define if the GNU dcgettext() function is already present or preinstalled. + */ +#define HAVE_DCGETTEXT 1 + +/* Define to 1 if you have the header file. */ +#define HAVE_EXPAT_H 1 + +/* Define to 1 if you have the `floor' function. */ +/* #undef HAVE_FLOOR */ + +/* Define if the GNU gettext() function is already present or preinstalled. */ +#define HAVE_GETTEXT 1 + +/* Define to 1 if you have the header file. */ +#define HAVE_GPS_H 1 + +/* Define if you have the iconv() function and it works. */ +/* #undef HAVE_ICONV */ + +/* Define to 1 if you have the header file. */ +#define HAVE_INTTYPES_H 1 + +/* Define if your file defines LC_MESSAGES. */ +#define HAVE_LC_MESSAGES 1 + +/* Define to 1 if you have the `bz2' library (-lbz2). */ +#define HAVE_LIBBZ2 1 + +/* Define to 1 if you have a functional curl library. */ +#define HAVE_LIBCURL 1 + +/* Define to 1 if you have the `exif' library (-lexif). */ +/* #undef HAVE_LIBEXIF */ + +/* Define to 1 if you have the `geoclue-2' library (-lgeoclue-2). */ +#define HAVE_LIBGEOCLUE_2 1 + +/* Define to 1 if you have the `gexiv2' library (-lgexiv2). */ +#define HAVE_LIBGEXIV2 1 + +/* Define to 1 if you have the `gps' library (-lgps). */ +#define HAVE_LIBGPS 1 + +/* Define to 1 if you have the `icuuc' library (-licuuc). */ +#define HAVE_LIBICUUC 1 + +/* Define to 1 if you have the `m' library (-lm). */ +#define HAVE_LIBM 1 + +/* Define to 1 if you have the `magic' library (-lmagic). */ +#define HAVE_LIBMAGIC 1 + +/* Define to 1 if you have the `mapnik' library (-lmapnik). */ +#define HAVE_LIBMAPNIK 1 + +/* Define to 1 if you have the `nettle' library (-lnettle). */ +#define HAVE_LIBNETTLE 1 + +/* Define to 1 if you have the `oauth' library (-loauth). */ +#define HAVE_LIBOAUTH 1 + +/* Define to 1 if you have the `sqlite3' library (-lsqlite3). */ +#define HAVE_LIBSQLITE3 1 + +/* Define to 1 if you have the `stdc++' library (-lstdc++). */ +#define HAVE_LIBSTDC__ 1 + +/* Define to 1 if you have the `X11' library (-lX11). */ +#define HAVE_LIBX11 1 + +/* Define to 1 if you have the `z' library (-lz). */ +#define HAVE_LIBZ 1 + +/* Define to 1 if you have the `zip' library (-lzip). */ +#define HAVE_LIBZIP 1 + +/* Define to 1 if you have the header file. */ +#define HAVE_LOCALE_H 1 + +/* Define to 1 if you have the header file. */ +#define HAVE_MAGIC_H 1 + +/* Define to 1 if you have the header file. */ +#define HAVE_MALLOC_H 1 + +/* Define to 1 if you have the header file. */ +#define HAVE_MATH_H 1 + +/* Define to 1 if you have the header file. */ +#define HAVE_MEMORY_H 1 + +/* Define to 1 if you have the `memset' function. */ +#define HAVE_MEMSET 1 + +/* Define to 1 if you have the `mkdtemp' function. */ +#define HAVE_MKDTEMP 1 + +/* Define to 1 if you have the header file. */ +#define HAVE_OAUTH_H 1 + +/* Define to 1 if you have the `pow' function. */ +/* #undef HAVE_POW */ + +/* Define to 1 if you have the `realpath' function. */ +#define HAVE_REALPATH 1 + +/* Define to 1 if you have the header file. */ +#define HAVE_SQLITE3_H 1 + +/* Define to 1 if you have the `sqrt' function. */ +/* #undef HAVE_SQRT */ + +/* Define to 1 if you have the header file. */ +#define HAVE_STDINT_H 1 + +/* Define to 1 if you have the header file. */ +#define HAVE_STDLIB_H 1 + +/* Define to 1 if you have the `strcasecmp' function. */ +#define HAVE_STRCASECMP 1 + +/* Define to 1 if you have the `strchr' function. */ +#define HAVE_STRCHR 1 + +/* Define to 1 if you have the header file. */ +#define HAVE_STRINGS_H 1 + +/* Define to 1 if you have the header file. */ +#define HAVE_STRING_H 1 + +/* Define to 1 if you have the `strncasecmp' function. */ +#define HAVE_STRNCASECMP 1 + +/* Define to 1 if you have the `strtol' function. */ +#define HAVE_STRTOL 1 + +/* Define to 1 if you have the `strtoul' function. */ +#define HAVE_STRTOUL 1 + +/* Define to 1 if you have the header file. */ +#define HAVE_SYS_PARAM_H 1 + +/* Define to 1 if you have the header file. */ +#define HAVE_SYS_STAT_H 1 + +/* Define to 1 if you have the header file. */ +#define HAVE_SYS_TYPES_H 1 + +/* Define to 1 if you have the header file. */ +#define HAVE_UNISTD_H 1 + +/* Define to 1 if you have the header file. */ +#define HAVE_UTIME_H 1 + +/* Enable Viking specifics in otherwise reusable code */ +#define HAVE_VIKING 1 + +/* Define to 1 if you have the header file. */ +#define HAVE_X11_XLIB_H 1 + +/* Define to 1 if you have the header file. */ +#define HAVE_ZIP_H 1 + +/* Defined if libcurl supports AsynchDNS */ +#define LIBCURL_FEATURE_ASYNCHDNS 1 + +/* Defined if libcurl supports IDN */ +#define LIBCURL_FEATURE_IDN 1 + +/* Defined if libcurl supports IPv6 */ +#define LIBCURL_FEATURE_IPV6 1 + +/* Defined if libcurl supports KRB4 */ +/* #undef LIBCURL_FEATURE_KRB4 */ + +/* Defined if libcurl supports libz */ +#define LIBCURL_FEATURE_LIBZ 1 + +/* Defined if libcurl supports NTLM */ +#define LIBCURL_FEATURE_NTLM 1 + +/* Defined if libcurl supports SSL */ +#define LIBCURL_FEATURE_SSL 1 + +/* Defined if libcurl supports SSPI */ +/* #undef LIBCURL_FEATURE_SSPI */ + +/* Defined if libcurl supports DICT */ +#define LIBCURL_PROTOCOL_DICT 1 + +/* Defined if libcurl supports FILE */ +#define LIBCURL_PROTOCOL_FILE 1 + +/* Defined if libcurl supports FTP */ +#define LIBCURL_PROTOCOL_FTP 1 + +/* Defined if libcurl supports FTPS */ +#define LIBCURL_PROTOCOL_FTPS 1 + +/* Defined if libcurl supports HTTP */ +#define LIBCURL_PROTOCOL_HTTP 1 + +/* Defined if libcurl supports HTTPS */ +#define LIBCURL_PROTOCOL_HTTPS 1 + +/* Defined if libcurl supports LDAP */ +#define LIBCURL_PROTOCOL_LDAP 1 + +/* Defined if libcurl supports TELNET */ +#define LIBCURL_PROTOCOL_TELNET 1 + +/* Defined if libcurl supports TFTP */ +#define LIBCURL_PROTOCOL_TFTP 1 + +/* Define the location where the catalogs will be installed */ +#define LOCALEDIR "/usr/local/share/locale" + +/* Name of package */ +#define PACKAGE "viking" + +/* Define to the address where bug reports for this package should be sent. */ +#define PACKAGE_BUGREPORT "" + +/* Define to the full name of this package. */ +#define PACKAGE_NAME "viking" + +/* Define to the full name and version of this package. */ +#define PACKAGE_STRING "viking 1.7" + +/* Define to the one symbol short name of this package. */ +#define PACKAGE_TARNAME "viking" + +/* Define to the home page for this package. */ +#define PACKAGE_URL "http://viking.sf.net/" + +/* Define to the version of this package. */ +#define PACKAGE_VERSION "1.7" + +/* Define to 1 if you have the ANSI C header files. */ +#define STDC_HEADERS 1 + +/* The Year */ +#define THEYEAR "2019" + +/* Version number of package */ +#define VERSION "1.7" + +/* BING STUFF */ +#define VIK_CONFIG_BING /**/ + +/* BLUEMARBLE STUFF */ +#define VIK_CONFIG_BLUEMARBLE /**/ + +/* Age of tiles before checking it (in seconds) */ +#define VIK_CONFIG_DEFAULT_TILE_AGE 604800 + +/* DEM24K STUFF */ +/* #undef VIK_CONFIG_DEM24K */ + +/* EXPEDIA STUFF */ +/* #undef VIK_CONFIG_EXPEDIA */ + +/* GEOCACHES STUFF */ +/* #undef VIK_CONFIG_GEOCACHES */ + +/* GEONAMES STUFF */ +#define VIK_CONFIG_GEONAMES /**/ + +/* geonames username */ +#define VIK_CONFIG_GEONAMES_USERNAME "viking" + +/* GEOTAG STUFF */ +#define VIK_CONFIG_GEOTAG /**/ + +/* GOOGLE STUFF */ +#define VIK_CONFIG_GOOGLE /**/ + +/* Mapbox Token */ +#define VIK_CONFIG_MAPBOX_TOKEN "pk.eyJ1Ijoicndub3JyaXMiLCJhIjoiY2lxc294anN2MDA5bWhzbWFseWsxMW1ydiJ9.HcybKtZsiG6RVuOHg481Kg" + +/* Size of the map cache */ +#define VIK_CONFIG_MAPCACHE_SIZE 128 + +/* OPENSTREETMAP STUFF */ +#define VIK_CONFIG_OPENSTREETMAP /**/ + +/* REALTIME GPS TRACKING STUFF */ +#define VIK_CONFIG_REALTIME_GPS_TRACKING /**/ + +/* TERRASERVER STUFF */ +/* #undef VIK_CONFIG_TERRASERVER */ + +/* Thunderforest key */ +#define VIK_CONFIG_THUNDERFOREST_KEY "7387c111d85642b18f63608bd4cb8b4f" + +/* Define to empty if `const' does not conform to ANSI C. */ +/* #undef const */ + +/* Define curl_free() as free() if our version of curl lacks curl_free. */ +/* #undef curl_free */ + +/* Define to `int' if does not define. */ +/* #undef mode_t */ diff --git a/src/config.h.in b/src/config.h.in new file mode 100644 index 0000000..1fd11b8 --- /dev/null +++ b/src/config.h.in @@ -0,0 +1,326 @@ +/* src/config.h.in. Generated from configure.ac by autoheader. */ + +/* Define to 1 if translation of program messages to the user's native + language is requested. */ +#undef ENABLE_NLS + +/* Gettext package name */ +#undef GETTEXT_PACKAGE + +/* Define to 1 if you have the `bind_textdomain_codeset' function. */ +#undef HAVE_BIND_TEXTDOMAIN_CODESET + +/* Define to 1 if you have the header file. */ +#undef HAVE_BZLIB_H + +/* Define to 1 if you have the MacOS X function CFLocaleCopyCurrent in the + CoreFoundation framework. */ +#undef HAVE_CFLOCALECOPYCURRENT + +/* Define to 1 if you have the MacOS X function CFPreferencesCopyAppValue in + the CoreFoundation framework. */ +#undef HAVE_CFPREFERENCESCOPYAPPVALUE + +/* Define if the GNU dcgettext() function is already present or preinstalled. + */ +#undef HAVE_DCGETTEXT + +/* Define to 1 if you have the header file. */ +#undef HAVE_EXPAT_H + +/* Define to 1 if you have the `floor' function. */ +#undef HAVE_FLOOR + +/* Define if the GNU gettext() function is already present or preinstalled. */ +#undef HAVE_GETTEXT + +/* Define to 1 if you have the header file. */ +#undef HAVE_GPS_H + +/* Define if you have the iconv() function and it works. */ +#undef HAVE_ICONV + +/* Define to 1 if you have the header file. */ +#undef HAVE_INTTYPES_H + +/* Define if your file defines LC_MESSAGES. */ +#undef HAVE_LC_MESSAGES + +/* Define to 1 if you have the `bz2' library (-lbz2). */ +#undef HAVE_LIBBZ2 + +/* Define to 1 if you have a functional curl library. */ +#undef HAVE_LIBCURL + +/* Define to 1 if you have the `exif' library (-lexif). */ +#undef HAVE_LIBEXIF + +/* Define to 1 if you have the `geoclue-2' library (-lgeoclue-2). */ +#undef HAVE_LIBGEOCLUE_2 + +/* Define to 1 if you have the `gexiv2' library (-lgexiv2). */ +#undef HAVE_LIBGEXIV2 + +/* Define to 1 if you have the `gps' library (-lgps). */ +#undef HAVE_LIBGPS + +/* Define to 1 if you have the `icuuc' library (-licuuc). */ +#undef HAVE_LIBICUUC + +/* Define to 1 if you have the `m' library (-lm). */ +#undef HAVE_LIBM + +/* Define to 1 if you have the `magic' library (-lmagic). */ +#undef HAVE_LIBMAGIC + +/* Define to 1 if you have the `mapnik' library (-lmapnik). */ +#undef HAVE_LIBMAPNIK + +/* Define to 1 if you have the `nettle' library (-lnettle). */ +#undef HAVE_LIBNETTLE + +/* Define to 1 if you have the `oauth' library (-loauth). */ +#undef HAVE_LIBOAUTH + +/* Define to 1 if you have the `sqlite3' library (-lsqlite3). */ +#undef HAVE_LIBSQLITE3 + +/* Define to 1 if you have the `stdc++' library (-lstdc++). */ +#undef HAVE_LIBSTDC__ + +/* Define to 1 if you have the `X11' library (-lX11). */ +#undef HAVE_LIBX11 + +/* Define to 1 if you have the `z' library (-lz). */ +#undef HAVE_LIBZ + +/* Define to 1 if you have the `zip' library (-lzip). */ +#undef HAVE_LIBZIP + +/* Define to 1 if you have the header file. */ +#undef HAVE_LOCALE_H + +/* Define to 1 if you have the header file. */ +#undef HAVE_MAGIC_H + +/* Define to 1 if you have the header file. */ +#undef HAVE_MALLOC_H + +/* Define to 1 if you have the header file. */ +#undef HAVE_MATH_H + +/* Define to 1 if you have the header file. */ +#undef HAVE_MEMORY_H + +/* Define to 1 if you have the `memset' function. */ +#undef HAVE_MEMSET + +/* Define to 1 if you have the `mkdtemp' function. */ +#undef HAVE_MKDTEMP + +/* Define to 1 if you have the header file. */ +#undef HAVE_OAUTH_H + +/* Define to 1 if you have the `pow' function. */ +#undef HAVE_POW + +/* Define to 1 if you have the `realpath' function. */ +#undef HAVE_REALPATH + +/* Define to 1 if you have the header file. */ +#undef HAVE_SQLITE3_H + +/* Define to 1 if you have the `sqrt' function. */ +#undef HAVE_SQRT + +/* Define to 1 if you have the header file. */ +#undef HAVE_STDINT_H + +/* Define to 1 if you have the header file. */ +#undef HAVE_STDLIB_H + +/* Define to 1 if you have the `strcasecmp' function. */ +#undef HAVE_STRCASECMP + +/* Define to 1 if you have the `strchr' function. */ +#undef HAVE_STRCHR + +/* Define to 1 if you have the header file. */ +#undef HAVE_STRINGS_H + +/* Define to 1 if you have the header file. */ +#undef HAVE_STRING_H + +/* Define to 1 if you have the `strncasecmp' function. */ +#undef HAVE_STRNCASECMP + +/* Define to 1 if you have the `strtol' function. */ +#undef HAVE_STRTOL + +/* Define to 1 if you have the `strtoul' function. */ +#undef HAVE_STRTOUL + +/* Define to 1 if you have the header file. */ +#undef HAVE_SYS_PARAM_H + +/* Define to 1 if you have the header file. */ +#undef HAVE_SYS_STAT_H + +/* Define to 1 if you have the header file. */ +#undef HAVE_SYS_TYPES_H + +/* Define to 1 if you have the header file. */ +#undef HAVE_UNISTD_H + +/* Define to 1 if you have the header file. */ +#undef HAVE_UTIME_H + +/* Enable Viking specifics in otherwise reusable code */ +#undef HAVE_VIKING + +/* Define to 1 if you have the header file. */ +#undef HAVE_X11_XLIB_H + +/* Define to 1 if you have the header file. */ +#undef HAVE_ZIP_H + +/* Defined if libcurl supports AsynchDNS */ +#undef LIBCURL_FEATURE_ASYNCHDNS + +/* Defined if libcurl supports IDN */ +#undef LIBCURL_FEATURE_IDN + +/* Defined if libcurl supports IPv6 */ +#undef LIBCURL_FEATURE_IPV6 + +/* Defined if libcurl supports KRB4 */ +#undef LIBCURL_FEATURE_KRB4 + +/* Defined if libcurl supports libz */ +#undef LIBCURL_FEATURE_LIBZ + +/* Defined if libcurl supports NTLM */ +#undef LIBCURL_FEATURE_NTLM + +/* Defined if libcurl supports SSL */ +#undef LIBCURL_FEATURE_SSL + +/* Defined if libcurl supports SSPI */ +#undef LIBCURL_FEATURE_SSPI + +/* Defined if libcurl supports DICT */ +#undef LIBCURL_PROTOCOL_DICT + +/* Defined if libcurl supports FILE */ +#undef LIBCURL_PROTOCOL_FILE + +/* Defined if libcurl supports FTP */ +#undef LIBCURL_PROTOCOL_FTP + +/* Defined if libcurl supports FTPS */ +#undef LIBCURL_PROTOCOL_FTPS + +/* Defined if libcurl supports HTTP */ +#undef LIBCURL_PROTOCOL_HTTP + +/* Defined if libcurl supports HTTPS */ +#undef LIBCURL_PROTOCOL_HTTPS + +/* Defined if libcurl supports LDAP */ +#undef LIBCURL_PROTOCOL_LDAP + +/* Defined if libcurl supports TELNET */ +#undef LIBCURL_PROTOCOL_TELNET + +/* Defined if libcurl supports TFTP */ +#undef LIBCURL_PROTOCOL_TFTP + +/* Define the location where the catalogs will be installed */ +#undef LOCALEDIR + +/* Name of package */ +#undef PACKAGE + +/* Define to the address where bug reports for this package should be sent. */ +#undef PACKAGE_BUGREPORT + +/* Define to the full name of this package. */ +#undef PACKAGE_NAME + +/* Define to the full name and version of this package. */ +#undef PACKAGE_STRING + +/* Define to the one symbol short name of this package. */ +#undef PACKAGE_TARNAME + +/* Define to the home page for this package. */ +#undef PACKAGE_URL + +/* Define to the version of this package. */ +#undef PACKAGE_VERSION + +/* Define to 1 if you have the ANSI C header files. */ +#undef STDC_HEADERS + +/* The Year */ +#undef THEYEAR + +/* Version number of package */ +#undef VERSION + +/* BING STUFF */ +#undef VIK_CONFIG_BING + +/* BLUEMARBLE STUFF */ +#undef VIK_CONFIG_BLUEMARBLE + +/* Age of tiles before checking it (in seconds) */ +#undef VIK_CONFIG_DEFAULT_TILE_AGE + +/* DEM24K STUFF */ +#undef VIK_CONFIG_DEM24K + +/* EXPEDIA STUFF */ +#undef VIK_CONFIG_EXPEDIA + +/* GEOCACHES STUFF */ +#undef VIK_CONFIG_GEOCACHES + +/* GEONAMES STUFF */ +#undef VIK_CONFIG_GEONAMES + +/* geonames username */ +#undef VIK_CONFIG_GEONAMES_USERNAME + +/* GEOTAG STUFF */ +#undef VIK_CONFIG_GEOTAG + +/* GOOGLE STUFF */ +#undef VIK_CONFIG_GOOGLE + +/* Mapbox Token */ +#undef VIK_CONFIG_MAPBOX_TOKEN + +/* Size of the map cache */ +#undef VIK_CONFIG_MAPCACHE_SIZE + +/* OPENSTREETMAP STUFF */ +#undef VIK_CONFIG_OPENSTREETMAP + +/* REALTIME GPS TRACKING STUFF */ +#undef VIK_CONFIG_REALTIME_GPS_TRACKING + +/* TERRASERVER STUFF */ +#undef VIK_CONFIG_TERRASERVER + +/* Thunderforest key */ +#undef VIK_CONFIG_THUNDERFOREST_KEY + +/* Define to empty if `const' does not conform to ANSI C. */ +#undef const + +/* Define curl_free() as free() if our version of curl lacks curl_free. */ +#undef curl_free + +/* Define to `int' if does not define. */ +#undef mode_t diff --git a/src/coords.c b/src/coords.c new file mode 100644 index 0000000..807e59b --- /dev/null +++ b/src/coords.c @@ -0,0 +1,304 @@ +/* +coords.c +borrowed from: +http://acme.com/software/coords/ +I (Evan Battaglia ) have only made some small changes such as +renaming functions and defining LatLon and UTM structs. +2004-02-10 -- I also added a function of my own -- a_coords_utm_diff() -- that I felt belonged in coords.c +2004-02-21 -- I also added a_coords_utm_equal(). +2005-11-23 -- Added a_coords_dtostr() for lack of a better place. + +*/ +/* coords.h - include file for coords routines +** +** Copyright 2001 by Jef Poskanzer . +** 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. +*/ +#ifdef HAVE_CONFIG_H +#include "config.h" +#endif + +#ifdef HAVE_STDLIB_H +#include +#endif +#ifdef HAVE_STRING_H +#include +#endif +#ifdef HAVE_MATH_H +#include +#endif + +#include "coords.h" +#ifdef HAVE_VIKING +#include "viking.h" +#include "globals.h" +#else +#define DEG2RAD(x) ((x)*(M_PI/180)) +#define RAD2DEG(x) ((x)*(180/M_PI)) +#endif +#include "degrees_converters.h" +#include "misc/fpconv.h" + +/** + * + */ +void a_coords_dtostr_buffer ( double d, char buffer[COORDS_STR_BUFFER_SIZE] ) +{ + int str_len = fpconv_dtoa(d, buffer, 1); // Ensure decimal output (especially for writing GPX files) + if ( str_len < COORDS_STR_BUFFER_SIZE ) + buffer[str_len] = '\0'; + else + buffer[COORDS_STR_BUFFER_SIZE-1] = '\0'; +} + +/** + * Convert a double to a string WITHOUT LOCALE. + * + * Following GPX specifications, decimal values are xsd:decimal + * So, they must use the period separator, not the localized one. + * + * The returned value must be freed by g_free. + */ +char *a_coords_dtostr ( double d ) +{ + gchar *buffer = g_malloc(G_ASCII_DTOSTR_BUF_SIZE*sizeof(gchar)); + // Note that this doesn't necessary produce the shortest string + //g_ascii_formatd (buffer, G_ASCII_DTOSTR_BUF_SIZE, "%.9lf", (gdouble)d); + // Thus use third party code: + a_coords_dtostr_buffer ( d, buffer ); + return buffer; +} + +#define PIOVER180 0.01745329252 + +#define K0 0.9996 + +/* WGS-84 */ +#define EquatorialRadius 6378137 +#define EccentricitySquared 0.00669438 + +static char coords_utm_letter( double latitude ); + +int a_coords_utm_equal( const struct UTM *utm1, const struct UTM *utm2 ) +{ + return ( utm1->easting == utm2->easting && utm1->northing == utm2->northing && utm1->zone == utm2->zone ); +} + +double a_coords_utm_diff( const struct UTM *utm1, const struct UTM *utm2 ) +{ + static struct LatLon tmp1, tmp2; + if ( utm1->zone == utm2->zone ) { + return sqrt ( pow ( utm1->easting - utm2->easting, 2 ) + pow ( utm1->northing - utm2->northing, 2 ) ); + } else { + a_coords_utm_to_latlon ( utm1, &tmp1 ); + a_coords_utm_to_latlon ( utm2, &tmp2 ); + return a_coords_latlon_diff ( &tmp1, &tmp2 ); + } +} + +double a_coords_latlon_diff ( const struct LatLon *ll1, const struct LatLon *ll2 ) +{ + static struct LatLon tmp1, tmp2; + gdouble tmp3; + tmp1.lat = ll1->lat * PIOVER180; + tmp1.lon = ll1->lon * PIOVER180; + tmp2.lat = ll2->lat * PIOVER180; + tmp2.lon = ll2->lon * PIOVER180; + tmp3 = EquatorialRadius * acos(sin(tmp1.lat)*sin(tmp2.lat)+cos(tmp1.lat)*cos(tmp2.lat)*cos(tmp1.lon-tmp2.lon)); + // For very small differences we can sometimes get NaN returned + return isnan(tmp3)?0:tmp3; +} + +void a_coords_latlon_to_utm( const struct LatLon *latlon, struct UTM *utm ) + { + double latitude; + double longitude; + double lat_rad, long_rad; + double long_origin, long_origin_rad; + double eccPrimeSquared; + double N, T, C, A, M; + int zone; + double northing, easting; + + longitude = latlon->lon; + latitude = latlon->lat; + + /* We want the longitude within -180..180. */ + if ( longitude < -180.0 ) + longitude += 360.0; + if ( longitude > 180.0 ) + longitude -= 360.0; + + /* Now convert. */ + lat_rad = DEG2RAD(latitude); + long_rad = DEG2RAD(longitude); + zone = (int) ( ( longitude + 180 ) / 6 ) + 1; + if ( latitude >= 56.0 && latitude < 64.0 && + longitude >= 3.0 && longitude < 12.0 ) + zone = 32; + /* Special zones for Svalbard. */ + if ( latitude >= 72.0 && latitude < 84.0 ) + { + if ( longitude >= 0.0 && longitude < 9.0 ) zone = 31; + else if ( longitude >= 9.0 && longitude < 21.0 ) zone = 33; + else if ( longitude >= 21.0 && longitude < 33.0 ) zone = 35; + else if ( longitude >= 33.0 && longitude < 42.0 ) zone = 37; + } + long_origin = ( zone - 1 ) * 6 - 180 + 3; /* +3 puts origin in middle of zone */ + long_origin_rad = DEG2RAD(long_origin); + eccPrimeSquared = EccentricitySquared / ( 1.0 - EccentricitySquared ); + N = EquatorialRadius / sqrt( 1.0 - EccentricitySquared * sin( lat_rad ) * sin( lat_rad ) ); + T = tan( lat_rad ) * tan( lat_rad ); + C = eccPrimeSquared * cos( lat_rad ) * cos( lat_rad ); + A = cos( lat_rad ) * ( long_rad - long_origin_rad ); + M = EquatorialRadius * ( ( 1.0 - EccentricitySquared / 4 - 3 * EccentricitySquared * EccentricitySquared / 64 - 5 * EccentricitySquared * EccentricitySquared * EccentricitySquared / 256 ) * lat_rad - ( 3 * EccentricitySquared / 8 + 3 * EccentricitySquared * EccentricitySquared / 32 + 45 * EccentricitySquared * EccentricitySquared * EccentricitySquared / 1024 ) * sin( 2 * lat_rad ) + ( 15 * EccentricitySquared * EccentricitySquared / 256 + 45 * EccentricitySquared * EccentricitySquared * EccentricitySquared / 1024 ) * sin( 4 * lat_rad ) - ( 35 * EccentricitySquared * EccentricitySquared * EccentricitySquared / 3072 ) * sin( 6 * lat_rad ) ); + easting = + K0 * N * ( A + ( 1 - T + C ) * A * A * A / 6 + ( 5 - 18 * T + T * T + 72 * C - 58 * eccPrimeSquared ) * A * A * A * A * A / 120 ) + 500000.0; + northing = + K0 * ( M + N * tan( lat_rad ) * ( A * A / 2 + ( 5 - T + 9 * C + 4 * C * C ) * A * A * A * A / 24 + ( 61 - 58 * T + T * T + 600 * C - 330 * eccPrimeSquared ) * A * A * A * A * A * A / 720 ) ); + if ( latitude < 0.0 ) + northing += 10000000.0; /* 1e7 meter offset for southern hemisphere */ + + utm->northing = northing; + utm->easting = easting; + utm->zone = zone; + utm->letter = coords_utm_letter( latitude ); + + /* All done. */ + } + + +static char coords_utm_letter( double latitude ) + { + /* This routine determines the correct UTM letter designator for the + ** given latitude. It returns 'Z' if the latitude is outside the UTM + ** limits of 84N to 80S. + */ + if ( latitude <= 84.0 && latitude >= 72.0 ) return 'X'; + else if ( latitude < 72.0 && latitude >= 64.0 ) return 'W'; + else if ( latitude < 64.0 && latitude >= 56.0 ) return 'V'; + else if ( latitude < 56.0 && latitude >= 48.0 ) return 'U'; + else if ( latitude < 48.0 && latitude >= 40.0 ) return 'T'; + else if ( latitude < 40.0 && latitude >= 32.0 ) return 'S'; + else if ( latitude < 32.0 && latitude >= 24.0 ) return 'R'; + else if ( latitude < 24.0 && latitude >= 16.0 ) return 'Q'; + else if ( latitude < 16.0 && latitude >= 8.0 ) return 'P'; + else if ( latitude < 8.0 && latitude >= 0.0 ) return 'N'; + else if ( latitude < 0.0 && latitude >= -8.0 ) return 'M'; + else if ( latitude < -8.0 && latitude >= -16.0 ) return 'L'; + else if ( latitude < -16.0 && latitude >= -24.0 ) return 'K'; + else if ( latitude < -24.0 && latitude >= -32.0 ) return 'J'; + else if ( latitude < -32.0 && latitude >= -40.0 ) return 'H'; + else if ( latitude < -40.0 && latitude >= -48.0 ) return 'G'; + else if ( latitude < -48.0 && latitude >= -56.0 ) return 'F'; + else if ( latitude < -56.0 && latitude >= -64.0 ) return 'E'; + else if ( latitude < -64.0 && latitude >= -72.0 ) return 'D'; + else if ( latitude < -72.0 && latitude >= -80.0 ) return 'C'; + else return 'Z'; + } + + + +void a_coords_utm_to_latlon( const struct UTM *utm, struct LatLon *latlon ) + { + double northing, easting; + int zone; + char letter[100]; + double x, y; + double eccPrimeSquared; + double e1; + double N1, T1, C1, R1, D, M; + double long_origin; + double mu, phi1_rad; + double latitude, longitude; + + northing = utm->northing; + easting = utm->easting; + zone = utm->zone; + letter[0] = utm->letter; + + /* Now convert. */ + x = easting - 500000.0; /* remove 500000 meter offset */ + y = northing; + if ( ( *letter - 'N' ) < 0 ) { + /* southern hemisphere */ + y -= 10000000.0; /* remove 1e7 meter offset */ + } + + long_origin = ( zone - 1 ) * 6 - 180 + 3; /* +3 puts origin in middle of zone */ + eccPrimeSquared = EccentricitySquared / ( 1.0 - EccentricitySquared ); + e1 = ( 1.0 - sqrt( 1.0 - EccentricitySquared ) ) / ( 1.0 + sqrt( 1.0 - EccentricitySquared ) ); + M = y / K0; + mu = M / ( EquatorialRadius * ( 1.0 - EccentricitySquared / 4 - 3 * EccentricitySquared * EccentricitySquared / 64 - 5 * EccentricitySquared * EccentricitySquared * EccentricitySquared / 256 ) ); + phi1_rad = 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 = EquatorialRadius / sqrt( 1.0 - EccentricitySquared * sin( phi1_rad ) * sin( phi1_rad ) ); + T1 = tan( phi1_rad ) * tan( phi1_rad ); + C1 = eccPrimeSquared * cos( phi1_rad ) * cos( phi1_rad ); + R1 = EquatorialRadius * ( 1.0 - EccentricitySquared ) / pow( 1.0 - EccentricitySquared * sin( phi1_rad ) * sin( phi1_rad ), 1.5 ); + D = x / ( N1 * K0 ); + latitude = phi1_rad - ( N1 * tan( phi1_rad ) / 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 ); + latitude = RAD2DEG(latitude); + longitude = ( 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( phi1_rad ); + longitude = long_origin + RAD2DEG(longitude); + + /* Show results. */ + + latlon->lat = latitude; + latlon->lon = longitude; + + } + +void a_coords_latlon_to_string ( const struct LatLon *latlon, + gchar **lat, + gchar **lon ) +{ + g_return_if_fail ( latlon != NULL ); +#ifdef HAVE_VIKING + vik_degree_format_t format = a_vik_get_degree_format (); + + switch (format) { + case VIK_DEGREE_FORMAT_DDD: + *lat = convert_lat_dec_to_ddd ( latlon->lat ); + *lon = convert_lon_dec_to_ddd ( latlon->lon ); + break; + case VIK_DEGREE_FORMAT_DMM: + *lat = convert_lat_dec_to_dmm ( latlon->lat ); + *lon = convert_lon_dec_to_dmm ( latlon->lon ); + break; + case VIK_DEGREE_FORMAT_DMS: + *lat = convert_lat_dec_to_dms ( latlon->lat ); + *lon = convert_lon_dec_to_dms ( latlon->lon ); + break; + case VIK_DEGREE_FORMAT_RAW: + *lat = g_strdup_printf ( "%.6f", latlon->lat ); + *lon = g_strdup_printf ( "%.6f", latlon->lon ); + break; + default: + g_critical("Houston, we've had a problem. format=%d", format); + } +#else + *lat = convert_lat_dec_to_ddd ( latlon->lat ); + *lon = convert_lon_dec_to_ddd ( latlon->lon ); +#endif +} diff --git a/src/coords.h b/src/coords.h new file mode 100644 index 0000000..8f20863 --- /dev/null +++ b/src/coords.h @@ -0,0 +1,90 @@ +/* +coords.h +borrowed from: +http://acme.com/software/coords/ +I (Evan Battaglia have only made some small changes such as +renaming functions and defining LatLon and UTM structs. +*/ +/* coords.h - include file for coords routines +** +** Copyright 2001 by Jef Poskanzer . +** 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. +*/ + +#ifndef _VIKING_COORDS_H +#define _VIKING_COORDS_H + +#include + +G_BEGIN_DECLS + +struct UTM { + gdouble northing; + gdouble easting; + gchar zone; + gchar letter; +}; + +struct LatLon { + gdouble lat; + gdouble lon; +}; + +#define COORDS_STR_BUFFER_SIZE 24 + +int a_coords_utm_equal( const struct UTM *utm1, const struct UTM *utm2 ); +void a_coords_latlon_to_utm ( const struct LatLon *latlon, struct UTM *utm ); +void a_coords_utm_to_latlon ( const struct UTM *utm, struct LatLon *latlon ); +double a_coords_utm_diff( const struct UTM *utm1, const struct UTM *utm2 ); +double a_coords_latlon_diff ( const struct LatLon *ll1, const struct LatLon *ll2 ); + +/** + * Convert a double to a string WITHOUT LOCALE. + * + * Following GPX specifications, decimal values are xsd:decimal + * So, they must use the period separator, not the localized one. + * + * The returned value must be freed by g_free. + */ +char *a_coords_dtostr ( double d ); + +/** + * Similar to a_coords_dtostr() above, but uses an existing allocated + * buffer thus avoiding the need for malloc/free + * Ideal for use where this may be called a lot (e.g. in file saving) + */ +void a_coords_dtostr_buffer ( double d, char buffer[COORDS_STR_BUFFER_SIZE] ); + +/** + * Convert a LatLon to strings. + * + * Using the preferred representation. + * + * Strings are allocated and thus should be freed after use + */ +void a_coords_latlon_to_string ( const struct LatLon *latlon, gchar **lat, gchar **lon ); + +G_END_DECLS + +#endif diff --git a/src/curl_download.c b/src/curl_download.c new file mode 100644 index 0000000..2fad694 --- /dev/null +++ b/src/curl_download.c @@ -0,0 +1,328 @@ +/* + * viking -- GPS Data and Topo Analyzer, Explorer, and Manager + * + * Copyright (C) 2007, Guilhem Bonnefille + * Copyright (C) 2007, Quy Tonthat + * Copyright (C) 2009-2010, Jocelyn Jaubert + * Copyright (C) 2010, Sven Wegener + * + * 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., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA + * + */ + +#ifdef HAVE_CONFIG_H +#include "config.h" +#endif + +#include +#include +#include + +#ifdef HAVE_UNISTD_H +#include +#endif + +#include +#include +#include +#include +#include + +#include + +#include "background.h" +#include "dir.h" +#include "file.h" +#include "globals.h" +#include "curl_download.h" +#include "settings.h" + +gchar *curl_download_user_agent = NULL; + +/* + * Even if writing to FILE* is supported by libcurl by default, + * it seems that it is non-portable (win32 DLL specific). + * + * So, we provide our own trivial CURLOPT_WRITEFUNCTION. + */ +static size_t curl_write_func(void *ptr, size_t size, size_t nmemb, FILE *stream) +{ + return fwrite(ptr, size, nmemb, stream); +} + +static size_t curl_get_etag_func(void *ptr, size_t size, size_t nmemb, void *stream) +{ +#define ETAG_KEYWORD "ETag: " +#define ETAG_LEN (sizeof(ETAG_KEYWORD)-1) + CurlDownloadOptions *cdo = (CurlDownloadOptions*)stream; + size_t len = size*nmemb; + char *str = g_strstr_len((const char*)ptr, len, ETAG_KEYWORD); + if (str) { + char *etag_str = str + ETAG_LEN; + char *end_str = g_strstr_len(etag_str, len - ETAG_LEN, "\r\n"); + if (etag_str && end_str) { + cdo->new_etag = g_strndup(etag_str, end_str - etag_str); + g_debug("%s: ETAG found: %s", __FUNCTION__, cdo->new_etag); + } + } + return nmemb; +} + +static int curl_progress_func(void *clientp, double dltotal, double dlnow, double ultotal, double ulnow) +{ + return a_background_testcancel(NULL); +} + +static gint curl_ssl_verifypeer = 1; // https://curl.haxx.se/libcurl/c/CURLOPT_SSL_VERIFYPEER.html +static gchar* curl_cainfo = NULL; // https://curl.haxx.se/libcurl/c/CURLOPT_CAINFO.html + +/* This should to be called from main() to make sure thread safe */ +void curl_download_init() +{ + curl_global_init(CURL_GLOBAL_ALL); + curl_download_user_agent = g_strdup_printf ("%s/%s %s", PACKAGE, VERSION, curl_version()); + +#ifdef CURL_NO_SSL_VERIFYPEER + curl_ssl_verifypeer = 0; +#endif + gboolean tmp; + if ( a_settings_get_boolean ( "curl_ssl_verifypeer", &tmp ) ) + curl_ssl_verifypeer = tmp; + gchar *str = NULL; + if ( a_settings_get_string ( "curl_cainfo", &str ) ) { + curl_cainfo = g_strdup ( str ); + g_free ( str ); + } +} + +/* This should to be called from main() to make sure thread safe */ +void curl_download_uninit() +{ + curl_global_cleanup(); + g_free ( curl_cainfo ); +} + +/** + * + * Common curl options + */ +static void common_opts ( CURL *curl, const char *uri, DownloadFileOptions *options ) +{ + g_debug ( "%s: uri=%s", __FUNCTION__, uri ); + if ( vik_verbose ) + curl_easy_setopt ( curl, CURLOPT_VERBOSE, 1 ); + curl_easy_setopt ( curl, CURLOPT_NOSIGNAL, 1 ); // Yep, we're a multi-threaded program so don't let signals mess it up! + if ( options != NULL ) { + if ( options->user_pass != NULL ) { + curl_easy_setopt ( curl, CURLOPT_HTTPAUTH, CURLAUTH_ANY ); + curl_easy_setopt ( curl, CURLOPT_USERPWD, options->user_pass ); + } + if ( options->referer != NULL ) + curl_easy_setopt ( curl, CURLOPT_REFERER, options->referer ); + if ( options->follow_location != 0 ) { + curl_easy_setopt ( curl, CURLOPT_FOLLOWLOCATION, 1 ); + curl_easy_setopt ( curl, CURLOPT_MAXREDIRS, options->follow_location ); + } + } + curl_easy_setopt ( curl, CURLOPT_URL, uri ); + curl_easy_setopt ( curl, CURLOPT_USERAGENT, curl_download_user_agent ); + // Allow download to be aborted (if called in a thread) + curl_easy_setopt ( curl, CURLOPT_NOPROGRESS, 0 ); + curl_easy_setopt ( curl, CURLOPT_PROGRESSDATA, NULL ); + curl_easy_setopt ( curl, CURLOPT_PROGRESSFUNCTION, curl_progress_func); +} + +/** + * + */ +CURL_download_t curl_download_uri ( const char *uri, FILE *f, DownloadFileOptions *options, CurlDownloadOptions *cdo, void *handle ) +{ + CURL *curl; + struct curl_slist *curl_send_headers = NULL; + CURLcode res = CURLE_FAILED_INIT; + + curl = handle ? handle : curl_easy_init (); + if ( !curl ) { + return CURL_DOWNLOAD_ERROR; + } + common_opts ( curl, uri, options ); + curl_easy_setopt ( curl, CURLOPT_WRITEDATA, f ); + curl_easy_setopt ( curl, CURLOPT_WRITEFUNCTION, curl_write_func); + if (options != NULL) { + if (cdo != NULL) { + if(options->check_file_server_time && cdo->time_condition != 0) { + /* if file exists, check against server if file is recent enough */ + curl_easy_setopt ( curl, CURLOPT_TIMECONDITION, CURL_TIMECOND_IFMODSINCE); + curl_easy_setopt ( curl, CURLOPT_TIMEVALUE, cdo->time_condition); + } + if (options->use_etag) { + if (cdo->etag != NULL) { + /* add an header on the HTTP request */ + char str[60]; + g_snprintf(str, 60, "If-None-Match: %s", cdo->etag); + curl_send_headers = curl_slist_append(curl_send_headers, str); + curl_easy_setopt ( curl, CURLOPT_HTTPHEADER , curl_send_headers); + } + /* store the new etag from the server in an option value */ + curl_easy_setopt ( curl, CURLOPT_WRITEHEADER, cdo); + curl_easy_setopt ( curl, CURLOPT_HEADERFUNCTION, curl_get_etag_func); + } + } + } + curl_easy_setopt ( curl, CURLOPT_USERAGENT, curl_download_user_agent ); + + curl_easy_setopt ( curl, CURLOPT_SSL_VERIFYPEER, curl_ssl_verifypeer ); + if ( curl_cainfo ) + curl_easy_setopt ( curl, CURLOPT_CAINFO, curl_cainfo ); + + res = curl_easy_perform ( curl ); + + if (res == CURLE_OK) { + glong response; + curl_easy_getinfo(curl, CURLINFO_RESPONSE_CODE, &response); + if (response == 304) { // 304 = Not Modified + res = CURL_DOWNLOAD_NO_NEWER_FILE; + } else if (response == 200 || // http: 200 = Ok + response == 226) { // ftp: 226 = sucess + gdouble size; + /* verify if curl sends us any data - this is a workaround on using CURLOPT_TIMECONDITION + when the server has a (incorrect) time earlier than the time on the file we already have */ + curl_easy_getinfo(curl, CURLINFO_SIZE_DOWNLOAD, &size); + if (size == 0) + res = CURL_DOWNLOAD_ERROR; + else + res = CURL_DOWNLOAD_NO_ERROR; + } else { + g_warning("%s: http response: %ld for uri %s\n", __FUNCTION__, response, uri); + res = CURL_DOWNLOAD_ERROR; + } + } else { + g_warning ( "%s: curl error: %d for uri %s", __FUNCTION__, res, uri ); + res = CURL_DOWNLOAD_ERROR; + } + if (curl_send_headers) { + curl_slist_free_all(curl_send_headers); + curl_send_headers = NULL; + curl_easy_setopt ( curl, CURLOPT_HTTPHEADER , NULL); + } + if (!handle) + curl_easy_cleanup ( curl ); + return res; +} + +/** + * curl_download_get_url: + * Either hostname and/or uri should be defined + * + */ +CURL_download_t curl_download_get_url ( const char *hostname, const char *uri, FILE *f, DownloadFileOptions *options, gboolean ftp, CurlDownloadOptions *cdo, void *handle ) +{ + gchar *full = NULL; + + if ( hostname && strstr ( hostname, "://" ) != NULL ) { + if ( uri && strlen ( uri ) > 1 ) + // Simply append them together + full = g_strdup_printf ( "%s%s", hostname, uri ); + else + /* Already full url */ + full = (gchar *) hostname; + } + else if ( uri && strstr ( uri, "://" ) != NULL ) + /* Already full url */ + full = (gchar *) uri; + else if ( hostname && uri ) + /* Compose the full url */ + full = g_strdup_printf ( "%s://%s%s", (ftp?"ftp":"http"), hostname, uri ); + else { + return CURL_DOWNLOAD_ERROR; + } + + CURL_download_t ret = curl_download_uri ( full, f, options, cdo, handle ); + // Only free newly allocated memory + if ( hostname != full && uri != full ) + g_free ( full ); + + return ret; +} + + +struct MemoryStruct { + char *data; + size_t size; +}; + +static size_t WriteMemoryCallback(void *ptr, size_t size, size_t nmemb, void *data) +{ + size_t realsize = size * nmemb; + struct MemoryStruct *mem = (struct MemoryStruct *)data; + + mem->data = (char *)realloc(mem->data, mem->size + realsize + 1); + if (mem->data) { + memcpy(&(mem->data[mem->size]), ptr, realsize); + mem->size += realsize; + mem->data[mem->size] = 0; + } + return realsize; +} + +/** + * Download data from an URL into a memory buffer + * (hence no need to save to a temporary file) + * Ideal for when the expected returned data is a string + * + * Free the returned data after use + */ +char* curl_download_get_ptr ( const char *uri, DownloadFileOptions *options ) +{ + struct MemoryStruct mem; + CURL *curl = curl_easy_init (); + if ( !curl ) + return NULL; + + mem.data = NULL; + mem.size = 0; + common_opts ( curl, uri, options ); + + curl_easy_setopt ( curl, CURLOPT_WRITEDATA, (void *)&mem ); + curl_easy_setopt ( curl, CURLOPT_WRITEFUNCTION, WriteMemoryCallback ); + + CURLcode result = curl_easy_perform ( curl ); + + curl_easy_cleanup ( curl ); + + if ( result != CURLE_OK ) { + g_warning ( "%s: curl error: %d for uri %s\n", __FUNCTION__, result, uri ); + return NULL; + } + else if ( vik_debug ) { + glong response; + curl_easy_getinfo ( curl, CURLINFO_RESPONSE_CODE, &response ); + gdouble size; + curl_easy_getinfo ( curl, CURLINFO_SIZE_DOWNLOAD, &size ); + g_debug ( "%s: received %.0f bytes in response %ld", __FUNCTION__, size, response ); + } + + return mem.data; +} + +void * curl_download_handle_init () +{ + return curl_easy_init(); +} + +void curl_download_handle_cleanup ( void *handle ) +{ + curl_easy_cleanup(handle); +} diff --git a/src/curl_download.h b/src/curl_download.h new file mode 100644 index 0000000..8e84b7c --- /dev/null +++ b/src/curl_download.h @@ -0,0 +1,65 @@ +/* + * viking -- GPS Data and Topo Analyzer, Explorer, and Manager + * + * Copyright (C) 2003-2005, Evan Battaglia + * + * 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., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA + * + */ + +#ifndef _VIKING_CURL_DOWNLOAD_H +#define _VIKING_CURL_DOWNLOAD_H + +#include + +#include "download.h" + +G_BEGIN_DECLS + +/* Error messages returned by download functions */ +typedef enum { + CURL_DOWNLOAD_NO_ERROR = 0, + CURL_DOWNLOAD_NO_NEWER_FILE, + CURL_DOWNLOAD_ERROR +} CURL_download_t; + +typedef struct { + /** + * Time sent to server on header If-Modified-Since + */ + time_t time_condition; + /** + * Etag sent by server on previous download + */ + char *etag; + /** + * Etag sent by server on this download + */ + char *new_etag; + +} CurlDownloadOptions; + +void curl_download_init (); +void curl_download_uninit (); +CURL_download_t curl_download_get_url ( const char *hostname, const char *uri, FILE *f, DownloadFileOptions *options, gboolean ftp, CurlDownloadOptions *curl_options, void *handle ); +CURL_download_t curl_download_uri ( const char *uri, FILE *f, DownloadFileOptions *options, CurlDownloadOptions *curl_options, void *handle ); +void * curl_download_handle_init (); +void curl_download_handle_cleanup ( void * handle ); + +char* curl_download_get_ptr ( const char *uri, DownloadFileOptions *options ); + +G_END_DECLS + +#endif diff --git a/src/datasource_bfilter.c b/src/datasource_bfilter.c new file mode 100644 index 0000000..d6dfa7c --- /dev/null +++ b/src/datasource_bfilter.c @@ -0,0 +1,309 @@ +/* + * viking -- GPS Data and Topo Analyzer, Explorer, and Manager + * + * Copyright (C) 2003-2007, Evan Battaglia + * Copyright (C) 2014-2015, Rob Norris + * + * 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., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA + * + * See: http://www.gpsbabel.org/htmldoc-development/Data_Filters.html + */ +#ifdef HAVE_CONFIG_H +#include "config.h" +#endif +#include +#include + +#include "viking.h" +#include "babel.h" +#include "gpx.h" +#include "acquire.h" +#include "settings.h" + +/************************************ Simplify (Count) *****************************/ + +/* spin button scales */ +VikLayerParamScale simplify_params_scales[] = { + {1, 10000, 10, 0}, +}; + +VikLayerParam bfilter_simplify_params[] = { + { VIK_LAYER_NUM_TYPES, "numberofpoints", VIK_LAYER_PARAM_UINT, VIK_LAYER_GROUP_NONE, N_("Max number of points:"), VIK_LAYER_WIDGET_SPINBUTTON, simplify_params_scales, NULL, NULL, NULL, NULL, NULL }, +}; + +VikLayerParamData bfilter_simplify_params_defaults[] = { + /* Annoyingly 'C' cannot initialize unions properly */ + /* It's dependent on the standard used or the compiler support... */ +#if defined __STDC_VERSION__ && __STDC_VERSION__ >= 199901L || __GNUC__ + { .u = 100 }, +#else + { 100 }, +#endif +}; + +static void datasource_bfilter_simplify_get_process_options ( VikLayerParamData *paramdatas, ProcessOptions *po, gpointer not_used, const gchar *input_filename, const gchar *not_used3 ) +{ + po->babelargs = g_strdup ( "-i gpx" ); + po->filename = g_strdup ( input_filename ); + po->babel_filters = g_strdup_printf ( "-x simplify,count=%d", paramdatas[0].u ); + + // Store for subsequent default use + bfilter_simplify_params_defaults[0].u = paramdatas[0].u; +} + +#define VIK_SETTINGS_BFILTER_SIMPLIFY "bfilter_simplify" +static gboolean bfilter_simplify_default_set = FALSE; + +static gpointer datasource_bfilter_simplify_init ( acq_vik_t *not_used ) +{ + if ( !bfilter_simplify_default_set ) { + gint tmp; + if ( !a_settings_get_integer ( VIK_SETTINGS_BFILTER_SIMPLIFY, &tmp ) ) + tmp = 100; + + bfilter_simplify_params_defaults[0].u = tmp; + bfilter_simplify_default_set = TRUE; + } + + return NULL; +} + +VikDataSourceInterface vik_datasource_bfilter_simplify_interface = { + N_("Simplify All Tracks..."), + N_("Simplified Tracks"), + VIK_DATASOURCE_CREATENEWLAYER, + VIK_DATASOURCE_INPUTTYPE_TRWLAYER, + TRUE, + FALSE, /* keep dialog open after success */ + TRUE, + (VikDataSourceInitFunc) datasource_bfilter_simplify_init, + NULL, NULL, + (VikDataSourceGetProcessOptionsFunc) datasource_bfilter_simplify_get_process_options, + (VikDataSourceProcessFunc) a_babel_convert_from, + NULL, NULL, NULL, + (VikDataSourceOffFunc) NULL, + + bfilter_simplify_params, + sizeof(bfilter_simplify_params)/sizeof(bfilter_simplify_params[0]), + bfilter_simplify_params_defaults, + NULL, + 0 +}; + +/**************************** Compress (Simplify by Error Factor Method) *****************************/ + +static VikLayerParamScale compress_spin_scales[] = { {0.0, 1.000, 0.001, 3} }; + +VikLayerParam bfilter_compress_params[] = { + //{ VIK_LAYER_NUM_TYPES, "compressmethod", VIK_LAYER_PARAM_UINT, VIK_LAYER_GROUP_NONE, N_("Simplify Method:"), VIK_LAYER_WIDGET_COMBOBOX, compress_method, NULL, NULL, NULL, NULL, NULL }, + { VIK_LAYER_NUM_TYPES, "compressfactor", VIK_LAYER_PARAM_DOUBLE, VIK_LAYER_GROUP_NONE, N_("Error Factor:"), VIK_LAYER_WIDGET_SPINBUTTON, compress_spin_scales, NULL, + N_("Specifies the maximum allowable error that may be introduced by removing a single point by the crosstrack method. See the manual or GPSBabel Simplify Filter documentation for more detail."), NULL, NULL, NULL }, +}; + +VikLayerParamData bfilter_compress_params_defaults[] = { + /* Annoyingly 'C' cannot initialize unions properly */ + /* It's dependent on the standard used or the compiler support... */ +#if defined __STDC_VERSION__ && __STDC_VERSION__ >= 199901L || __GNUC__ + { .d = 0.001 }, +#else + { 0.001 }, +#endif +}; + +/** + * http://www.gpsbabel.org/htmldoc-development/filter_simplify.html + */ +static void datasource_bfilter_compress_get_process_options ( VikLayerParamData *paramdatas, ProcessOptions *po, gpointer not_used, const gchar *input_filename, const gchar *not_used3 ) +{ + gchar units = a_vik_get_units_distance() == VIK_UNITS_DISTANCE_KILOMETRES ? 'k' : ' '; + // I toyed with making the length,crosstrack or relative methods selectable + // However several things: + // - mainly that typical values to use for the error relate to method being used - so hard to explain and then give a default sensible value in the UI + // - also using relative method fails when track doesn't have HDOP info - error reported to stderr - which we don't capture ATM + // - options make this more complicated to use - is even that useful to be allowed to change the error value? + // NB units not applicable if relative method used - defaults to Miles when not specified + po->babelargs = g_strdup ( "-i gpx" ); + po->filename = g_strdup ( input_filename ); + po->babel_filters = g_strdup_printf ( "-x simplify,crosstrack,error=%-.5f%c", paramdatas[0].d, units ); + + // Store for subsequent default use + bfilter_compress_params_defaults[0].d = paramdatas[0].d; +} + +#define VIK_SETTINGS_BFILTER_COMPRESS "bfilter_compress" +static gboolean bfilter_compress_default_set = FALSE; + +static gpointer datasource_bfilter_compress_init ( acq_vik_t *not_used ) +{ + if ( !bfilter_compress_default_set ) { + gdouble tmp; + if ( !a_settings_get_double ( VIK_SETTINGS_BFILTER_COMPRESS, &tmp ) ) + tmp = 0.001; + + bfilter_compress_params_defaults[0].d = tmp; + bfilter_compress_default_set = TRUE; + } + + return NULL; +} + +/** + * Allow 'compressing' tracks/routes using the Simplify by Error Factor method + */ +VikDataSourceInterface vik_datasource_bfilter_compress_interface = { + N_("Compress Tracks..."), + N_("Compressed Tracks"), + VIK_DATASOURCE_CREATENEWLAYER, + VIK_DATASOURCE_INPUTTYPE_TRWLAYER, + TRUE, + FALSE, // Close the dialog after successful operation + TRUE, + (VikDataSourceInitFunc) datasource_bfilter_compress_init, + NULL, NULL, + (VikDataSourceGetProcessOptionsFunc) datasource_bfilter_compress_get_process_options, + (VikDataSourceProcessFunc) a_babel_convert_from, + NULL, NULL, NULL, + (VikDataSourceOffFunc) NULL, + + bfilter_compress_params, + sizeof(bfilter_compress_params)/sizeof(bfilter_compress_params[0]), + bfilter_compress_params_defaults, + NULL, + 0 +}; + +/************************************ Duplicate Location ***********************************/ + +static void datasource_bfilter_dup_get_process_options ( VikLayerParamData *paramdatas, ProcessOptions *po, gpointer not_used, const gchar *input_filename, const gchar *not_used3 ) +{ + po->babelargs = g_strdup ( "-i gpx" ); + po->filename = g_strdup ( input_filename ); + po->babel_filters = g_strdup ( "-x duplicate,location" ); +} + +VikDataSourceInterface vik_datasource_bfilter_dup_interface = { + N_("Remove Duplicate Waypoints"), + N_("Remove Duplicate Waypoints"), + VIK_DATASOURCE_CREATENEWLAYER, + VIK_DATASOURCE_INPUTTYPE_TRWLAYER, + TRUE, + FALSE, /* keep dialog open after success */ + TRUE, + NULL, NULL, NULL, + (VikDataSourceGetProcessOptionsFunc) datasource_bfilter_dup_get_process_options, + (VikDataSourceProcessFunc) a_babel_convert_from, + NULL, NULL, NULL, + (VikDataSourceOffFunc) NULL, + + NULL, 0, NULL, NULL, 0 +}; + + +/************************************ Swap Lat<->Lon ***********************************/ + +VikLayerParamData bfilter_manual_params_defaults[] = { + { .s = NULL }, +}; + +VikLayerParam bfilter_manual_params[] = { + { VIK_LAYER_NUM_TYPES, "manual", VIK_LAYER_PARAM_STRING, VIK_LAYER_GROUP_NONE, N_("Manual filter:"), VIK_LAYER_WIDGET_ENTRY, NULL, NULL, + N_("Manual filter command: e.g. 'swap'."), NULL, NULL, NULL }, +}; + +static void datasource_bfilter_manual_get_process_options ( VikLayerParamData *paramdatas, ProcessOptions *po, gpointer not_used, const gchar *input_filename, const gchar *not_used3 ) +{ + po->babelargs = g_strdup ( "-i gpx" ); + po->filename = g_strdup ( input_filename ); + po->babel_filters = g_strconcat ( "-x ", paramdatas[0].s, NULL ); +} + +VikDataSourceInterface vik_datasource_bfilter_manual_interface = { + N_("Manual filter"), + N_("Manual filter"), + VIK_DATASOURCE_CREATENEWLAYER, + VIK_DATASOURCE_INPUTTYPE_TRWLAYER, + TRUE, + FALSE, /* keep dialog open after success */ + TRUE, + NULL, NULL, NULL, + (VikDataSourceGetProcessOptionsFunc) datasource_bfilter_manual_get_process_options, + (VikDataSourceProcessFunc) a_babel_convert_from, + NULL, NULL, NULL, + (VikDataSourceOffFunc) NULL, + + bfilter_manual_params, + sizeof(bfilter_manual_params)/sizeof(bfilter_manual_params[0]), + bfilter_manual_params_defaults, + NULL, + 0 +}; + +/************************************ Polygon ***********************************/ + +static void datasource_bfilter_polygon_get_process_options ( VikLayerParamData *paramdatas, ProcessOptions *po, gpointer not_used, const gchar *input_filename, const gchar *input_track_filename ) +{ + po->shell_command = g_strdup_printf ( "gpsbabel -i gpx -f %s -o arc -F - | gpsbabel -i gpx -f %s -x polygon,file=- -o gpx -F -", input_track_filename, input_filename ); +} +/* TODO: shell_escape stuff */ + +VikDataSourceInterface vik_datasource_bfilter_polygon_interface = { + N_("Waypoints Inside This"), + N_("Polygonized Layer"), + VIK_DATASOURCE_CREATENEWLAYER, + VIK_DATASOURCE_INPUTTYPE_TRWLAYER_TRACK, + TRUE, + FALSE, /* keep dialog open after success */ + TRUE, + NULL, NULL, NULL, + (VikDataSourceGetProcessOptionsFunc) datasource_bfilter_polygon_get_process_options, + (VikDataSourceProcessFunc) a_babel_convert_from, + NULL, NULL, NULL, + (VikDataSourceOffFunc) NULL, + + NULL, + 0, + NULL, + NULL, + 0 +}; + +/************************************ Exclude Polygon ***********************************/ + +static void datasource_bfilter_exclude_polygon_get_process_options ( VikLayerParamData *paramdatas, ProcessOptions *po, gpointer not_used, const gchar *input_filename, const gchar *input_track_filename ) +{ + po->shell_command = g_strdup_printf ( "gpsbabel -i gpx -f %s -o arc -F - | gpsbabel -i gpx -f %s -x polygon,exclude,file=- -o gpx -F -", input_track_filename, input_filename ); +} +/* TODO: shell_escape stuff */ + +VikDataSourceInterface vik_datasource_bfilter_exclude_polygon_interface = { + N_("Waypoints Outside This"), + N_("Polygonized Layer"), + VIK_DATASOURCE_CREATENEWLAYER, + VIK_DATASOURCE_INPUTTYPE_TRWLAYER_TRACK, + TRUE, + FALSE, /* keep dialog open after success */ + TRUE, + NULL, NULL, NULL, + (VikDataSourceGetProcessOptionsFunc) datasource_bfilter_exclude_polygon_get_process_options, + (VikDataSourceProcessFunc) a_babel_convert_from, + NULL, NULL, NULL, + (VikDataSourceOffFunc) NULL, + + NULL, + 0, + NULL, + NULL, + 0 +}; diff --git a/src/datasource_file.c b/src/datasource_file.c new file mode 100644 index 0000000..5061fa3 --- /dev/null +++ b/src/datasource_file.c @@ -0,0 +1,197 @@ +/* + * viking -- GPS Data and Topo Analyzer, Explorer, and Manager + * + * Copyright (C) 2011, Guilhem Bonnefille + * Copyright (C) 2015, Rob Norris + * + * 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., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA + * + */ +#ifdef HAVE_CONFIG_H +#include "config.h" +#endif +#include + +#include +#include + +#include + +#include "viking.h" +#include "babel.h" +#include "gpx.h" +#include "babel_ui.h" +#include "acquire.h" + +typedef struct { + GtkWidget *file; + GtkWidget *type; +} datasource_file_widgets_t; + +/* The last used directory */ +static gchar *last_folder_uri = NULL; + +/* The last used file filter */ +/* Nb: we use a complex strategy for this because the UI is rebuild each + time, so it is not possible to reuse directly the GtkFileFilter as they are + differents. */ +static BabelFile *last_file_filter = NULL; + +/* The last file format selected */ +static int last_type = 0; + +static gpointer datasource_file_init ( acq_vik_t *avt ); +static void datasource_file_add_setup_widgets ( GtkWidget *dialog, VikViewport *vvp, gpointer user_data ); +static void datasource_file_get_process_options ( datasource_file_widgets_t *widgets, ProcessOptions *po, gpointer not_used, const gchar *not_used2, const gchar *not_used3 ); +static void datasource_file_cleanup ( gpointer data ); + +VikDataSourceInterface vik_datasource_file_interface = { + N_("Import file with GPSBabel"), + N_("Imported file"), + VIK_DATASOURCE_AUTO_LAYER_MANAGEMENT, + VIK_DATASOURCE_INPUTTYPE_NONE, + TRUE, + TRUE, + TRUE, + (VikDataSourceInitFunc) datasource_file_init, + (VikDataSourceCheckExistenceFunc) NULL, + (VikDataSourceAddSetupWidgetsFunc) datasource_file_add_setup_widgets, + (VikDataSourceGetProcessOptionsFunc) datasource_file_get_process_options, + (VikDataSourceProcessFunc) a_babel_convert_from, + (VikDataSourceProgressFunc) NULL, + (VikDataSourceAddProgressWidgetsFunc) NULL, + (VikDataSourceCleanupFunc) datasource_file_cleanup, + (VikDataSourceOffFunc) NULL, + + NULL, + 0, + NULL, + NULL, + 0 +}; + +/* See VikDataSourceInterface */ +static gpointer datasource_file_init ( acq_vik_t *avt ) +{ + datasource_file_widgets_t *widgets = g_malloc(sizeof(*widgets)); + return widgets; +} + +static void add_file_filter (gpointer data, gpointer user_data) +{ + GtkFileChooser *chooser = GTK_FILE_CHOOSER ( user_data ); + const gchar *label = ((BabelFile*) data)->label; + const gchar *ext = ((BabelFile*) data)->ext; + if ( ext == NULL || ext[0] == '\0' ) + /* No file extension => no filter */ + return; + gchar *pattern = g_strdup_printf ( "*.%s", ext ); + + GtkFileFilter *filter = gtk_file_filter_new (); + gtk_file_filter_add_pattern ( filter, pattern ); + if ( strstr ( label, pattern+1 ) ) { + gtk_file_filter_set_name ( filter, label ); + } else { + /* Ensure displayed label contains file pattern */ + /* NB: we skip the '*' in the pattern */ + gchar *name = g_strdup_printf ( "%s (%s)", label, pattern+1 ); + gtk_file_filter_set_name ( filter, name ); + g_free ( name ); + } + g_object_set_data ( G_OBJECT(filter), "Babel", data ); + gtk_file_chooser_add_filter ( chooser, filter ); + if ( last_file_filter == data ) + /* Previous selection used this filter */ + gtk_file_chooser_set_filter ( chooser, filter ); + + g_free ( pattern ); +} + +/* See VikDataSourceInterface */ +static void datasource_file_add_setup_widgets ( GtkWidget *dialog, VikViewport *vvp, gpointer user_data ) +{ + datasource_file_widgets_t *widgets = (datasource_file_widgets_t *)user_data; + GtkWidget *filename_label, *type_label; + + /* The file selector */ + filename_label = gtk_label_new (_("File:")); + widgets->file = gtk_file_chooser_button_new (_("File to import"), GTK_FILE_CHOOSER_ACTION_OPEN); + if (last_folder_uri) + gtk_file_chooser_set_current_folder_uri ( GTK_FILE_CHOOSER(widgets->file), last_folder_uri); + /* Add filters */ + g_list_foreach ( a_babel_file_list, add_file_filter, widgets->file ); + GtkFileFilter *all_filter = gtk_file_filter_new (); + gtk_file_filter_add_pattern ( all_filter, "*" ); + gtk_file_filter_set_name ( all_filter, _("All files") ); + gtk_file_chooser_add_filter ( GTK_FILE_CHOOSER(widgets->file), all_filter ); + if ( last_file_filter == NULL ) + /* No previously selected filter or 'All files' selected */ + gtk_file_chooser_set_filter ( GTK_FILE_CHOOSER(widgets->file), all_filter ); + + /* The file format selector */ + type_label = gtk_label_new (_("File type:")); + /* Propose any readable file */ + BabelMode mode = { 1, 0, 1, 0, 1, 0 }; + widgets->type = a_babel_ui_file_type_selector_new ( mode ); + g_signal_connect ( G_OBJECT(widgets->type), "changed", + G_CALLBACK(a_babel_ui_type_selector_dialog_sensitivity_cb), dialog ); + gtk_combo_box_set_active ( GTK_COMBO_BOX(widgets->type), last_type ); + /* Manually call the callback to fix the state */ + a_babel_ui_type_selector_dialog_sensitivity_cb ( GTK_COMBO_BOX(widgets->type), dialog ); + + /* Packing all these widgets */ + GtkBox *box = GTK_BOX(gtk_dialog_get_content_area(GTK_DIALOG(dialog))); + gtk_box_pack_start ( box, filename_label, FALSE, FALSE, 5 ); + gtk_box_pack_start ( box, widgets->file, FALSE, FALSE, 5 ); + gtk_box_pack_start ( box, type_label, FALSE, FALSE, 5 ); + gtk_box_pack_start ( box, widgets->type, FALSE, FALSE, 5 ); + gtk_widget_show_all(dialog); +} + +/* See VikDataSourceInterface */ +static void datasource_file_get_process_options ( datasource_file_widgets_t *widgets, ProcessOptions *po, gpointer not_used, const gchar *not_used2, const gchar *not_used3 ) +{ + /* Retrieve the file selected */ + gchar *filename = gtk_file_chooser_get_filename ( GTK_FILE_CHOOSER(widgets->file) ); + + /* Memorize the directory for later use */ + g_free (last_folder_uri); + last_folder_uri = gtk_file_chooser_get_current_folder_uri ( GTK_FILE_CHOOSER(widgets->file) ); + + /* Memorize the file filter for later use */ + GtkFileFilter *filter = gtk_file_chooser_get_filter ( GTK_FILE_CHOOSER(widgets->file) ); + last_file_filter = g_object_get_data ( G_OBJECT(filter), "Babel" ); + + /* Retrieve and memorize file format selected */ + gchar *type = NULL; + last_type = gtk_combo_box_get_active ( GTK_COMBO_BOX (widgets->type) ); + type = (a_babel_ui_file_type_selector_get ( widgets->type ))->name; + + /* Generate the process options */ + po->babelargs = g_strdup_printf( "-i %s", type); + po->filename = g_strdup(filename); + + /* Free memory */ + g_free (filename); + + g_debug(_("using babel args '%s' and file '%s'"), po->babelargs, po->filename); +} + +/* See VikDataSourceInterface */ +static void datasource_file_cleanup ( gpointer data ) +{ + g_free ( data ); +} + diff --git a/src/datasource_gc.c b/src/datasource_gc.c new file mode 100644 index 0000000..1d48987 --- /dev/null +++ b/src/datasource_gc.c @@ -0,0 +1,271 @@ +/* + * viking -- GPS Data and Topo Analyzer, Explorer, and Manager + * + * Copyright (C) 2003-2007, Evan Battaglia + * Copyright (C) 2015, Rob Norris + * + * 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., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA + * + */ +#ifdef HAVE_CONFIG_H +#include "config.h" +#endif +#ifdef VIK_CONFIG_GEOCACHES +#include + +#include + +#include "viking.h" +#include "babel.h" +#include "gpx.h" +#include "acquire.h" +#include "preferences.h" + +// Could have an array of programs instead... +#define GC_PROGRAM1 "geo-nearest" +#define GC_PROGRAM2 "geo-html2gpx" + +/* params will be geocaching.username, geocaching.password */ +/* we have to make sure these don't collide. */ +#define VIKING_GC_PARAMS_GROUP_KEY "geocaching" +#define VIKING_GC_PARAMS_NAMESPACE "geocaching." + + +typedef struct { + GtkWidget *num_spin; + GtkWidget *center_entry; // TODO make separate widgets for lat/lon + GtkWidget *miles_radius_spin; + + GdkGC *circle_gc; + VikViewport *vvp; + gboolean circle_onscreen; + gint circle_x, circle_y, circle_width; +} datasource_gc_widgets_t; + + +static gpointer datasource_gc_init ( acq_vik_t *avt ); +static void datasource_gc_add_setup_widgets ( GtkWidget *dialog, VikViewport *vvp, gpointer user_data ); +static void datasource_gc_get_process_options ( datasource_gc_widgets_t *widgets, ProcessOptions *po, gpointer not_used, const gchar *not_used2, const gchar *not_used3 ); +static void datasource_gc_cleanup ( datasource_gc_widgets_t *widgets ); +static gchar *datasource_gc_check_existence (); + +#define METERSPERMILE 1609.344 + +VikDataSourceInterface vik_datasource_gc_interface = { + N_("Download Geocaches"), + N_("Geocaching.com Caches"), + VIK_DATASOURCE_AUTO_LAYER_MANAGEMENT, + VIK_DATASOURCE_INPUTTYPE_NONE, + TRUE, // Yes automatically update the display - otherwise we won't see the geocache waypoints! + TRUE, + TRUE, + (VikDataSourceInitFunc) datasource_gc_init, + (VikDataSourceCheckExistenceFunc) datasource_gc_check_existence, + (VikDataSourceAddSetupWidgetsFunc) datasource_gc_add_setup_widgets, + (VikDataSourceGetProcessOptionsFunc) datasource_gc_get_process_options, + (VikDataSourceProcessFunc) a_babel_convert_from, + (VikDataSourceProgressFunc) NULL, + (VikDataSourceAddProgressWidgetsFunc) NULL, + (VikDataSourceCleanupFunc) datasource_gc_cleanup, + (VikDataSourceOffFunc) NULL, +}; + +static VikLayerParam prefs[] = { + { VIK_LAYER_NUM_TYPES, VIKING_GC_PARAMS_NAMESPACE "username", VIK_LAYER_PARAM_STRING, VIK_LAYER_GROUP_NONE, N_("geocaching.com username:"), VIK_LAYER_WIDGET_ENTRY, NULL, NULL, NULL, NULL, NULL }, + { VIK_LAYER_NUM_TYPES, VIKING_GC_PARAMS_NAMESPACE "password", VIK_LAYER_PARAM_STRING, VIK_LAYER_GROUP_NONE, N_("geocaching.com password:"), VIK_LAYER_WIDGET_ENTRY, NULL, NULL, NULL, NULL, NULL }, +}; + +void a_datasource_gc_init() +{ + a_preferences_register_group ( VIKING_GC_PARAMS_GROUP_KEY, _("Geocaching") ); + + VikLayerParamData tmp; + tmp.s = "username"; + a_preferences_register(prefs, tmp, VIKING_GC_PARAMS_GROUP_KEY); + tmp.s = "password"; + a_preferences_register(prefs+1, tmp, VIKING_GC_PARAMS_GROUP_KEY); +} + + +static gpointer datasource_gc_init ( acq_vik_t *avt ) +{ + datasource_gc_widgets_t *widgets = g_malloc(sizeof(*widgets)); + return widgets; +} + +static gchar *datasource_gc_check_existence () +{ + gboolean OK1 = FALSE; + gboolean OK2 = FALSE; + + gchar *location1 = g_find_program_in_path(GC_PROGRAM1); + if ( location1 ) { + g_free(location1); + OK1 = TRUE; + } + + gchar *location2 = g_find_program_in_path(GC_PROGRAM2); + if ( location2 ) { + g_free(location2); + OK2 = TRUE; + } + + if ( OK1 && OK2 ) + return NULL; + + return g_strdup_printf(_("Can't find %s or %s in path! Check that you have installed it correctly."), GC_PROGRAM1, GC_PROGRAM2); +} + +static void datasource_gc_draw_circle ( datasource_gc_widgets_t *widgets ) +{ + gdouble lat, lon; + if ( widgets->circle_onscreen ) { + vik_viewport_draw_arc ( widgets->vvp, widgets->circle_gc, FALSE, + widgets->circle_x - widgets->circle_width/2, + widgets->circle_y - widgets->circle_width/2, + widgets->circle_width, widgets->circle_width, 0, 360*64 ); + } + /* calculate widgets circle_x and circle_y */ + /* split up lat,lon into lat and lon */ + if ( 2 == sscanf ( gtk_entry_get_text ( GTK_ENTRY(widgets->center_entry) ), "%lf,%lf", &lat, &lon ) ) { + struct LatLon ll; + VikCoord c; + gint x, y; + + ll.lat = lat; ll.lon = lon; + vik_coord_load_from_latlon ( &c, vik_viewport_get_coord_mode ( widgets->vvp ), &ll ); + vik_viewport_coord_to_screen ( widgets->vvp, &c, &x, &y ); + /* TODO: real calculation */ + if ( x > -1000 && y > -1000 && x < (vik_viewport_get_width(widgets->vvp) + 1000) && + y < (vik_viewport_get_width(widgets->vvp) + 1000) ) { + VikCoord c1, c2; + gdouble pixels_per_meter; + + widgets->circle_x = x; + widgets->circle_y = y; + + /* determine miles per pixel */ + vik_viewport_screen_to_coord ( widgets->vvp, 0, vik_viewport_get_height(widgets->vvp)/2, &c1 ); + vik_viewport_screen_to_coord ( widgets->vvp, vik_viewport_get_width(widgets->vvp), vik_viewport_get_height(widgets->vvp)/2, &c2 ); + pixels_per_meter = ((gdouble)vik_viewport_get_width(widgets->vvp)) / vik_coord_diff(&c1, &c2); + + /* this is approximate */ + widgets->circle_width = gtk_spin_button_get_value_as_float ( GTK_SPIN_BUTTON(widgets->miles_radius_spin) ) + * METERSPERMILE * pixels_per_meter * 2; + + vik_viewport_draw_arc ( widgets->vvp, widgets->circle_gc, FALSE, + widgets->circle_x - widgets->circle_width/2, + widgets->circle_y - widgets->circle_width/2, + widgets->circle_width, widgets->circle_width, 0, 360*64 ); + + widgets->circle_onscreen = TRUE; + } else + widgets->circle_onscreen = FALSE; + } + + /* see if onscreen */ + /* okay */ + vik_viewport_sync ( widgets->vvp ); +} + +static void datasource_gc_add_setup_widgets ( GtkWidget *dialog, VikViewport *vvp, gpointer user_data ) +{ + datasource_gc_widgets_t *widgets = (datasource_gc_widgets_t *)user_data; + GtkWidget *num_label, *center_label, *miles_radius_label; + struct LatLon ll; + gchar *s_ll; + + num_label = gtk_label_new (_("Number geocaches:")); + widgets->num_spin = gtk_spin_button_new ( GTK_ADJUSTMENT(gtk_adjustment_new( 20, 1, 1000, 10, 20, 0 )), 10, 0 ); + center_label = gtk_label_new (_("Centered around:")); + widgets->center_entry = gtk_entry_new(); + miles_radius_label = gtk_label_new ("Miles Radius:"); + widgets->miles_radius_spin = gtk_spin_button_new ( GTK_ADJUSTMENT(gtk_adjustment_new( 5, 1, 1000, 1, 20, 0 )), 25, 1 ); + + vik_coord_to_latlon ( vik_viewport_get_center(vvp), &ll ); + s_ll = g_strdup_printf("%f,%f", ll.lat, ll.lon ); + gtk_entry_set_text ( GTK_ENTRY(widgets->center_entry), s_ll ); + g_free ( s_ll ); + + + widgets->vvp = vvp; + widgets->circle_gc = vik_viewport_new_gc ( vvp, "#000000", 3 ); + gdk_gc_set_function ( widgets->circle_gc, GDK_INVERT ); + widgets->circle_onscreen = TRUE; + datasource_gc_draw_circle ( widgets ); + + g_signal_connect_swapped ( G_OBJECT(widgets->center_entry), "changed", G_CALLBACK(datasource_gc_draw_circle), widgets ); + g_signal_connect_swapped ( G_OBJECT(widgets->miles_radius_spin), "value-changed", G_CALLBACK(datasource_gc_draw_circle), widgets ); + + /* Packing all these widgets */ + GtkBox *box = GTK_BOX(gtk_dialog_get_content_area(GTK_DIALOG(dialog))); + gtk_box_pack_start ( box, num_label, FALSE, FALSE, 5 ); + gtk_box_pack_start ( box, widgets->num_spin, FALSE, FALSE, 5 ); + gtk_box_pack_start ( box, center_label, FALSE, FALSE, 5 ); + gtk_box_pack_start ( box, widgets->center_entry, FALSE, FALSE, 5 ); + gtk_box_pack_start ( box, miles_radius_label, FALSE, FALSE, 5 ); + gtk_box_pack_start ( box, widgets->miles_radius_spin, FALSE, FALSE, 5 ); + gtk_widget_show_all(dialog); +} + +static void datasource_gc_get_process_options ( datasource_gc_widgets_t *widgets, ProcessOptions *po, gpointer not_used, const gchar *not_used2, const gchar *not_used3 ) +{ + //gchar *safe_string = g_shell_quote ( gtk_entry_get_text ( GTK_ENTRY(widgets->center_entry) ) ); + gchar *safe_user = g_shell_quote ( a_preferences_get ( VIKING_GC_PARAMS_NAMESPACE "username")->s ); + gchar *safe_pass = g_shell_quote ( a_preferences_get ( VIKING_GC_PARAMS_NAMESPACE "password")->s ); + gchar *slat, *slon; + gdouble lat, lon; + if ( 2 != sscanf ( gtk_entry_get_text ( GTK_ENTRY(widgets->center_entry) ), "%lf,%lf", &lat, &lon ) ) { + g_warning (_("Broken input - using some defaults")); + lat = a_vik_get_default_lat(); + lon = a_vik_get_default_long(); + } + // Convert double as string in C locale + slat = a_coords_dtostr ( lat ); + slon = a_coords_dtostr ( lon ); + + // Unix specific shell commands + // 1. Remove geocache webpages (maybe be from different location) + // 2, Gets upto n geocaches as webpages for the specified user in radius r Miles + // 3. Converts webpages into a single waypoint file, ignoring zero location waypoints '-z' + // Probably as they are premium member only geocaches and user is only a basic member + // Final output is piped into GPSbabel - hence removal of *html is done at beginning of the command sequence + po->shell_command = g_strdup_printf( "rm -f ~/.geo/caches/*.html ; %s -H ~/.geo/caches -P -n%d -r%.1fM -u %s -p %s %s %s ; %s -z ~/.geo/caches/*.html ", + GC_PROGRAM1, + gtk_spin_button_get_value_as_int ( GTK_SPIN_BUTTON(widgets->num_spin) ), + gtk_spin_button_get_value_as_float ( GTK_SPIN_BUTTON(widgets->miles_radius_spin) ), + safe_user, + safe_pass, + slat, slon, + GC_PROGRAM2 ); + //g_free ( safe_string ); + g_free ( safe_user ); + g_free ( safe_pass ); + g_free ( slat ); + g_free ( slon ); +} + +static void datasource_gc_cleanup ( datasource_gc_widgets_t *widgets ) +{ + if ( widgets->circle_onscreen ) { + vik_viewport_draw_arc ( widgets->vvp, widgets->circle_gc, FALSE, + widgets->circle_x - widgets->circle_width/2, + widgets->circle_y - widgets->circle_width/2, + widgets->circle_width, widgets->circle_width, 0, 360*64 ); + vik_viewport_sync( widgets->vvp ); + } + g_free ( widgets ); +} +#endif /* VIK_CONFIG_GEOCACHES */ diff --git a/src/datasource_geojson.c b/src/datasource_geojson.c new file mode 100644 index 0000000..449580a --- /dev/null +++ b/src/datasource_geojson.c @@ -0,0 +1,171 @@ +/* -*- Mode: C; indent-tabs-mode: t; c-basic-offset: 4; tab-width: 4 -*- */ +/* + * viking -- GPS Data and Topo Analyzer, Explorer, and Manager + * + * Copyright (C) 2014-2015, Rob Norris + * + * 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., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA + * + */ +#include +#include +#include + +#include "viking.h" +#include "acquire.h" +#include "babel.h" +#include "geojson.h" + +typedef struct { + GtkWidget *files; + GSList *filelist; // Files selected +} datasource_geojson_user_data_t; + +// The last used directory +static gchar *last_folder_uri = NULL; + +static gpointer datasource_geojson_init ( acq_vik_t *avt ); +static void datasource_geojson_add_setup_widgets ( GtkWidget *dialog, VikViewport *vvp, gpointer user_data ); +static void datasource_geojson_get_process_options ( datasource_geojson_user_data_t *user_data, ProcessOptions *po, gpointer not_used, const gchar *not_used2, const gchar *not_used3 ); +static gboolean datasource_geojson_process ( VikTrwLayer *vtl, ProcessOptions *process_options, BabelStatusFunc status_cb, acq_dialog_widgets_t *adw, DownloadFileOptions *options_unused ); +static void datasource_geojson_cleanup ( gpointer data ); + +VikDataSourceInterface vik_datasource_geojson_interface = { + N_("Acquire from GeoJSON"), + N_("GeoJSON"), + VIK_DATASOURCE_AUTO_LAYER_MANAGEMENT, + VIK_DATASOURCE_INPUTTYPE_NONE, + TRUE, + FALSE, // We should be able to see the data on the screen so no point in keeping the dialog open + FALSE, // Not thread method - open each file in the main loop + (VikDataSourceInitFunc) datasource_geojson_init, + (VikDataSourceCheckExistenceFunc) NULL, + (VikDataSourceAddSetupWidgetsFunc) datasource_geojson_add_setup_widgets, + (VikDataSourceGetProcessOptionsFunc) datasource_geojson_get_process_options, + (VikDataSourceProcessFunc) datasource_geojson_process, + (VikDataSourceProgressFunc) NULL, + (VikDataSourceAddProgressWidgetsFunc) NULL, + (VikDataSourceCleanupFunc) datasource_geojson_cleanup, + (VikDataSourceOffFunc) NULL, + NULL, + 0, + NULL, + NULL, + 0 +}; + +static gpointer datasource_geojson_init ( acq_vik_t *avt ) +{ + datasource_geojson_user_data_t *user_data = g_malloc(sizeof(datasource_geojson_user_data_t)); + user_data->filelist = NULL; + return user_data; +} + +static void datasource_geojson_add_setup_widgets ( GtkWidget *dialog, VikViewport *vvp, gpointer user_data ) +{ + datasource_geojson_user_data_t *ud = (datasource_geojson_user_data_t *)user_data; + + ud->files = gtk_file_chooser_widget_new ( GTK_FILE_CHOOSER_ACTION_OPEN ); + + // try to make it a nice size - otherwise seems to default to something impractically small + gtk_window_set_default_size ( GTK_WINDOW (dialog) , 600, 300 ); + + if ( last_folder_uri ) + gtk_file_chooser_set_current_folder_uri ( GTK_FILE_CHOOSER(ud->files), last_folder_uri ); + + GtkFileChooser *chooser = GTK_FILE_CHOOSER ( ud->files ); + + // Add filters + GtkFileFilter *filter; + filter = gtk_file_filter_new (); + gtk_file_filter_set_name ( filter, _("All") ); + gtk_file_filter_add_pattern ( filter, "*" ); + gtk_file_chooser_add_filter ( chooser, filter ); + + filter = gtk_file_filter_new (); + gtk_file_filter_set_name ( filter, _("GeoJSON") ); + gtk_file_filter_add_pattern ( filter, "*.geojson" ); + gtk_file_chooser_add_filter ( chooser, filter ); + + // Default to geojson + gtk_file_chooser_set_filter ( chooser, filter ); + + // Allow selecting more than one + gtk_file_chooser_set_select_multiple ( chooser, TRUE ); + + // Packing all widgets + GtkBox *box = GTK_BOX(gtk_dialog_get_content_area(GTK_DIALOG(dialog))); + gtk_box_pack_start ( box, ud->files, TRUE, TRUE, 0 ); + + gtk_widget_show_all ( dialog ); +} + +static void datasource_geojson_get_process_options ( datasource_geojson_user_data_t *userdata, ProcessOptions *po, gpointer not_used, const gchar *not_used2, const gchar *not_used3 ) +{ + // Retrieve the files selected + userdata->filelist = gtk_file_chooser_get_filenames ( GTK_FILE_CHOOSER(userdata->files) ); // Not reusable !! + + // Memorize the directory for later reuse + g_free ( last_folder_uri ); + last_folder_uri = gtk_file_chooser_get_current_folder_uri ( GTK_FILE_CHOOSER(userdata->files) ); + + // TODO Memorize the file filter for later reuse? + //GtkFileFilter *filter = gtk_file_chooser_get_filter ( GTK_FILE_CHOOSER(userdata->files) ); + + // return some value so *thread* processing will continue + po->babelargs = g_strdup ("fake command"); // Not really used, thus no translations +} + +/** + * Process selected files and try to generate waypoints storing them in the given vtl + */ +static gboolean datasource_geojson_process ( VikTrwLayer *vtl, ProcessOptions *process_options, BabelStatusFunc status_cb, acq_dialog_widgets_t *adw, DownloadFileOptions *options_unused ) +{ + datasource_geojson_user_data_t *user_data = (datasource_geojson_user_data_t *)adw->user_data; + + // Process selected files + GSList *cur_file = user_data->filelist; + while ( cur_file ) { + gchar *filename = cur_file->data; + + gchar *gpx_filename = a_geojson_import_to_gpx ( filename ); + if ( gpx_filename ) { + // Important that this process is run in the main thread + vik_window_open_file ( adw->vw, gpx_filename, FALSE, TRUE, TRUE, TRUE ); + // Delete the temporary file + (void)g_remove (gpx_filename); + g_free (gpx_filename); + } + else { + gchar* msg = g_strdup_printf ( _("Unable to import from: %s"), filename ); + vik_window_statusbar_update ( adw->vw, msg, VIK_STATUSBAR_INFO ); + g_free (msg); + } + + g_free ( filename ); + cur_file = g_slist_next ( cur_file ); + } + + // Free memory + g_slist_free ( user_data->filelist ); + + // No failure + return TRUE; +} + +static void datasource_geojson_cleanup ( gpointer data ) +{ + g_free ( data ); +} diff --git a/src/datasource_geotag.c b/src/datasource_geotag.c new file mode 100644 index 0000000..a3a4ed4 --- /dev/null +++ b/src/datasource_geotag.c @@ -0,0 +1,187 @@ +/* -*- Mode: C; indent-tabs-mode: t; c-basic-offset: 4; tab-width: 4 -*- */ +/* + * viking -- GPS Data and Topo Analyzer, Explorer, and Manager + * + * Copyright (C) 2012-2015, Rob Norris + * + * 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., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA + * + */ +#ifdef HAVE_CONFIG_H +#include "config.h" +#endif +#include + +#include +#include + +#include + +#include "viking.h" +#include "acquire.h" +#include "geotag_exif.h" + +typedef struct { + GtkWidget *files; + GSList *filelist; // Files selected +} datasource_geotag_user_data_t; + +/* The last used directory */ +static gchar *last_folder_uri = NULL; + +static gpointer datasource_geotag_init ( acq_vik_t *avt ); +static void datasource_geotag_add_setup_widgets ( GtkWidget *dialog, VikViewport *vvp, gpointer user_data ); +static void datasource_geotag_get_process_options ( gpointer user_data, ProcessOptions *po, gpointer not_used, const gchar *not_used2, const gchar *not_used3 ); +static gboolean datasource_geotag_process ( VikTrwLayer *vtl, ProcessOptions *po, BabelStatusFunc status_cb, acq_dialog_widgets_t *adw, gpointer not_used ); +static void datasource_geotag_cleanup ( gpointer user_data ); + +VikDataSourceInterface vik_datasource_geotag_interface = { + N_("Create Waypoints from Geotagged Images"), + N_("Geotagged Images"), + VIK_DATASOURCE_AUTO_LAYER_MANAGEMENT, + VIK_DATASOURCE_INPUTTYPE_NONE, + TRUE, + FALSE, // We should be able to see the data on the screen so no point in keeping the dialog open + TRUE, + (VikDataSourceInitFunc) datasource_geotag_init, + (VikDataSourceCheckExistenceFunc) NULL, + (VikDataSourceAddSetupWidgetsFunc) datasource_geotag_add_setup_widgets, + (VikDataSourceGetProcessOptionsFunc) datasource_geotag_get_process_options, + (VikDataSourceProcessFunc) datasource_geotag_process, + (VikDataSourceProgressFunc) NULL, + (VikDataSourceAddProgressWidgetsFunc) NULL, + (VikDataSourceCleanupFunc) datasource_geotag_cleanup, + (VikDataSourceOffFunc) NULL, + + NULL, + 0, + NULL, + NULL, + 0 +}; + +/* See VikDataSourceInterface */ +static gpointer datasource_geotag_init ( acq_vik_t *avt ) +{ + datasource_geotag_user_data_t *user_data = g_malloc(sizeof(datasource_geotag_user_data_t)); + user_data->filelist = NULL; + return user_data; +} + +/* See VikDataSourceInterface */ +static void datasource_geotag_add_setup_widgets ( GtkWidget *dialog, VikViewport *vvp, gpointer user_data ) +{ + datasource_geotag_user_data_t *userdata = (datasource_geotag_user_data_t *)user_data; + + /* The files selector */ + userdata->files = gtk_file_chooser_widget_new ( GTK_FILE_CHOOSER_ACTION_OPEN ); + + // try to make it a nice size - otherwise seems to default to something impractically small + gtk_window_set_default_size ( GTK_WINDOW (dialog) , 600, 300 ); + + if ( last_folder_uri ) + gtk_file_chooser_set_current_folder_uri ( GTK_FILE_CHOOSER(userdata->files), last_folder_uri ); + + GtkFileChooser *chooser = GTK_FILE_CHOOSER ( userdata->files ); + + /* Add filters */ + GtkFileFilter *filter; + filter = gtk_file_filter_new (); + gtk_file_filter_set_name ( filter, _("All") ); + gtk_file_filter_add_pattern ( filter, "*" ); + gtk_file_chooser_add_filter ( chooser, filter ); + + filter = gtk_file_filter_new (); + gtk_file_filter_set_name ( filter, _("JPG") ); + gtk_file_filter_add_mime_type ( filter, "image/jpeg"); + gtk_file_chooser_add_filter ( chooser, filter ); + + // Default to jpgs + gtk_file_chooser_set_filter ( chooser, filter ); + + // Allow selecting more than one + gtk_file_chooser_set_select_multiple ( chooser, TRUE ); + + // Could add code to setup a default symbol (see dialog.c for symbol usage) + // Store in user_data type and then apply when creating the waypoints + // However not much point since these will have images associated with them! + + /* Packing all widgets */ + GtkBox *box = GTK_BOX(gtk_dialog_get_content_area(GTK_DIALOG(dialog))); + gtk_box_pack_start ( box, userdata->files, TRUE, TRUE, 0 ); + + gtk_widget_show_all ( dialog ); +} + +static void datasource_geotag_get_process_options ( gpointer user_data, ProcessOptions *po, gpointer not_used, const gchar *not_used2, const gchar *not_used3 ) +{ + datasource_geotag_user_data_t *userdata = (datasource_geotag_user_data_t *)user_data; + /* Retrieve the files selected */ + userdata->filelist = gtk_file_chooser_get_filenames ( GTK_FILE_CHOOSER(userdata->files) ); // Not reusable !! + + /* Memorize the directory for later use */ + g_free ( last_folder_uri ); + last_folder_uri = gtk_file_chooser_get_current_folder_uri ( GTK_FILE_CHOOSER(userdata->files) ); + last_folder_uri = g_strdup ( last_folder_uri ); + + /* TODO Memorize the file filter for later use... */ + //GtkFileFilter *filter = gtk_file_chooser_get_filter ( GTK_FILE_CHOOSER(userdata->files) ); + + // return some value so *thread* processing will continue + po->babelargs = g_strdup ("fake command"); // Not really used, thus no translations +} + +/** + * Process selected files and try to generate waypoints storing them in the given vtl + */ +static gboolean datasource_geotag_process ( VikTrwLayer *vtl, ProcessOptions *po, BabelStatusFunc status_cb, acq_dialog_widgets_t *adw, gpointer not_used ) +{ + datasource_geotag_user_data_t *user_data = (datasource_geotag_user_data_t *)adw->user_data; + + // Process selected files + // In prinicple this loading should be quite fast and so don't need to have any progress monitoring + GSList *cur_file = user_data->filelist; + while ( cur_file ) { + gchar *filename = cur_file->data; + gchar *name; + VikWaypoint *wp = a_geotag_create_waypoint_from_file ( filename, vik_viewport_get_coord_mode ( adw->vvp ), &name ); + if ( wp ) { + // Create name if geotag method didn't return one + if ( !name ) + name = g_strdup ( a_file_basename ( filename ) ); + vik_trw_layer_filein_add_waypoint ( vtl, name, wp ); + g_free ( name ); + } + else { + gchar* msg = g_strdup_printf ( _("Unable to create waypoint from %s"), filename ); + vik_window_statusbar_update ( adw->vw, msg, VIK_STATUSBAR_INFO ); + g_free (msg); + } + g_free ( filename ); + cur_file = g_slist_next ( cur_file ); + } + + /* Free memory */ + g_slist_free ( user_data->filelist ); + + // No failure + return TRUE; +} + +/* See VikDataSourceInterface */ +static void datasource_geotag_cleanup ( gpointer user_data ) +{ + g_free ( user_data ); +} diff --git a/src/datasource_gps.c b/src/datasource_gps.c new file mode 100644 index 0000000..06e80ff --- /dev/null +++ b/src/datasource_gps.c @@ -0,0 +1,767 @@ +/* + * viking -- GPS Data and Topo Analyzer, Explorer, and Manager + * + * Copyright (C) 2003-2005, Evan Battaglia + * Copyright (C) 2006, Alex Foobarian + * Copyright (C) 2012-2015, Rob Norris + * + * 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., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA + * + */ +#ifdef HAVE_CONFIG_H +#include "config.h" +#endif +#include +#ifdef HAVE_UNISTD_H +#include +#endif + +#include +#include +#include + +#include "datasource_gps.h" +#include "viking.h" +#include "babel.h" +#include "gpx.h" +#include "acquire.h" + +static gboolean gps_acquire_in_progress = FALSE; + +static gint last_active = -1; + +static gpointer datasource_gps_init_func ( acq_vik_t *avt ); +static void datasource_gps_get_process_options ( gpointer user_data, ProcessOptions *po, gpointer not_used, const gchar *not_used2, const gchar *not_used3 ); +static void datasource_gps_cleanup ( gpointer user_data ); +static void datasource_gps_progress ( BabelProgressCode c, gpointer data, acq_dialog_widgets_t *w ); +static void datasource_gps_add_setup_widgets ( GtkWidget *dialog, VikViewport *vvp, gpointer user_data ); +static void datasource_gps_add_progress_widgets ( GtkWidget *dialog, gpointer user_data ); +static void datasource_gps_off ( gpointer add_widgets_data_not_used, gchar **babelargs, gchar **input_file ); + +VikDataSourceInterface vik_datasource_gps_interface = { + N_("Acquire from GPS"), + N_("Acquired from GPS"), + VIK_DATASOURCE_AUTO_LAYER_MANAGEMENT, + VIK_DATASOURCE_INPUTTYPE_NONE, + TRUE, + TRUE, + TRUE, + (VikDataSourceInitFunc) datasource_gps_init_func, + (VikDataSourceCheckExistenceFunc) NULL, + (VikDataSourceAddSetupWidgetsFunc) datasource_gps_add_setup_widgets, + (VikDataSourceGetProcessOptionsFunc) datasource_gps_get_process_options, + (VikDataSourceProcessFunc) a_babel_convert_from, + (VikDataSourceProgressFunc) datasource_gps_progress, + (VikDataSourceAddProgressWidgetsFunc) datasource_gps_add_progress_widgets, + (VikDataSourceCleanupFunc) datasource_gps_cleanup, + (VikDataSourceOffFunc) datasource_gps_off, + + NULL, + 0, + NULL, + NULL, + 0 +}; + +/********************************************************* + * Definitions and routines for acquiring data from GPS + *********************************************************/ + +/* widgets in setup dialog specific to GPS */ +/* widgets in progress dialog specific to GPS */ +/* also counts needed for progress */ +typedef struct { + /* setup dialog */ + GtkWidget *proto_l; + GtkWidget *proto_b; + GtkWidget *ser_l; + GtkWidget *ser_b; + GtkWidget *off_request_l; + GtkCheckButton *off_request_b; + GtkWidget *get_tracks_l; + GtkCheckButton *get_tracks_b; + GtkWidget *get_routes_l; + GtkCheckButton *get_routes_b; + GtkWidget *get_waypoints_l; + GtkCheckButton *get_waypoints_b; + + /* progress dialog */ + GtkWidget *gps_label; + GtkWidget *wpt_label; + GtkWidget *trk_label; + GtkWidget *rte_label; + vik_gps_xfer_type progress_type; + + // Maintain separate counts for each type + int wpt_total_count; + int wpt_count; + int trk_total_count; + int trk_count; + int rte_total_count; + int rte_count; + gchar *info; + // Know which way xfer is so xfer setting types are only stored for download + vik_gps_dir direction; + // GUI Updates + gint id_status; + gint id_info; + gint id_total_count; + gint id_count; +} gps_user_data_t; + +#define VIK_SETTINGS_GPS_GET_TRACKS "gps_download_tracks" +#define VIK_SETTINGS_GPS_GET_ROUTES "gps_download_routes" +#define VIK_SETTINGS_GPS_GET_WAYPOINTS "gps_download_waypoints" +#define VIK_SETTINGS_GPS_PROTOCOL "gps_protocol" +#define VIK_SETTINGS_GPS_PORT "gps_port" +#define VIK_SETTINGS_GPS_POWER_OFF "gps_power_off" + +static gpointer datasource_gps_init_func ( acq_vik_t *avt ) +{ + gps_user_data_t *gps_ud = g_malloc0 (sizeof(gps_user_data_t)); + gps_ud->direction = GPS_DOWN; + return gps_ud; +} + +/** + * datasource_gps_get_protocol: + * + * Method to get the communication protocol of the GPS device from the widget structure + */ +gchar* datasource_gps_get_protocol ( gpointer user_data ) +{ + // Uses the list of supported devices + gps_user_data_t *w = (gps_user_data_t *)user_data; + last_active = gtk_combo_box_get_active(GTK_COMBO_BOX(w->proto_b)); + if (a_babel_device_list) { + gchar *protocol = ((BabelDevice*)g_list_nth_data(a_babel_device_list, last_active))->name; + a_settings_set_string ( VIK_SETTINGS_GPS_PROTOCOL, protocol ); + return protocol; + } + + return NULL; +} + +/** + * datasource_gps_get_descriptor: + * + * Method to get the descriptor from the widget structure + * "Everything is a file" + * Could actually be normal file or a serial port + */ +gchar* datasource_gps_get_descriptor ( gpointer user_data ) +{ + gps_user_data_t *w = (gps_user_data_t *)user_data; + +#if GTK_CHECK_VERSION (2, 24, 0) + gchar *descriptor = gtk_combo_box_text_get_active_text(GTK_COMBO_BOX_TEXT(w->ser_b)); +#else + gchar *descriptor = gtk_combo_box_get_active_text(GTK_COMBO_BOX(w->ser_b)); +#endif + a_settings_set_string ( VIK_SETTINGS_GPS_PORT, descriptor ); + return descriptor; +} + +/** + * datasource_gps_get_do_tracks: + * + * Method to get the track handling behaviour from the widget structure + */ +gboolean datasource_gps_get_do_tracks ( gpointer user_data ) +{ + gps_user_data_t *w = (gps_user_data_t *)user_data; + gboolean get_tracks = gtk_toggle_button_get_active(GTK_TOGGLE_BUTTON(w->get_tracks_b)); + if ( w->direction == GPS_DOWN ) + a_settings_set_boolean ( VIK_SETTINGS_GPS_GET_TRACKS, get_tracks ); + return get_tracks; +} + +/** + * datasource_gps_get_do_routes: + * + * Method to get the route handling behaviour from the widget structure + */ +gboolean datasource_gps_get_do_routes ( gpointer user_data ) +{ + gps_user_data_t *w = (gps_user_data_t *)user_data; + gboolean get_routes = gtk_toggle_button_get_active(GTK_TOGGLE_BUTTON(w->get_routes_b)); + if ( w->direction == GPS_DOWN ) + a_settings_set_boolean ( VIK_SETTINGS_GPS_GET_ROUTES, get_routes ); + return get_routes; +} + +/** + * datasource_gps_get_do_waypoints: + * + * Method to get the waypoint handling behaviour from the widget structure + */ +gboolean datasource_gps_get_do_waypoints ( gpointer user_data ) +{ + gps_user_data_t *w = (gps_user_data_t *)user_data; + gboolean get_waypoints = gtk_toggle_button_get_active(GTK_TOGGLE_BUTTON(w->get_waypoints_b)); + if ( w->direction == GPS_DOWN ) + a_settings_set_boolean ( VIK_SETTINGS_GPS_GET_WAYPOINTS, get_waypoints ); + return get_waypoints; +} + +static void datasource_gps_get_process_options ( gpointer user_data, ProcessOptions *po, gpointer not_used, const gchar *not_used2, const gchar *not_used3 ) +{ + char *device = NULL; + char *tracks = NULL; + char *routes = NULL; + char *waypoints = NULL; + + if (gps_acquire_in_progress) { + po->babelargs = po->filename = NULL; + } + + gps_acquire_in_progress = TRUE; + + device = datasource_gps_get_protocol ( user_data ); + + if ( datasource_gps_get_do_tracks ( user_data ) ) + tracks = "-t"; + else + tracks = ""; + + if ( datasource_gps_get_do_routes ( user_data ) ) + routes = "-r"; + else + routes = ""; + + if ( datasource_gps_get_do_waypoints ( user_data ) ) + waypoints = "-w"; + else + waypoints = ""; + + po->babelargs = g_strdup_printf("-D 9 %s %s %s -i %s", tracks, routes, waypoints, device); + /* device points to static content => no free */ + device = NULL; + tracks = NULL; + routes = NULL; + waypoints = NULL; + + po->filename = g_strdup(datasource_gps_get_descriptor(user_data)); + + g_debug(_("using cmd '%s' and file '%s'\n"), po->babelargs, po->filename); +} + +/** + * datasource_gps_get_off: + * + * Method to get the off behaviour from the widget structure + */ +gboolean datasource_gps_get_off ( gpointer user_data ) +{ + gps_user_data_t *w = (gps_user_data_t *)user_data; + gboolean power_off = gtk_toggle_button_get_active(GTK_TOGGLE_BUTTON(w->off_request_b)); + a_settings_set_boolean ( VIK_SETTINGS_GPS_POWER_OFF, power_off ); + return power_off; +} + +static void datasource_gps_off ( gpointer user_data, gchar **babelargs, gchar **file_descriptor ) +{ + char *ser = NULL; + char *device = NULL; + gps_user_data_t *w = (gps_user_data_t *)user_data; + + if (gps_acquire_in_progress) { + *babelargs = *file_descriptor = NULL; + } + + /* See if we should turn off the device */ + if (!datasource_gps_get_off ( user_data )){ + return; + } + + if (!a_babel_device_list) + return; + last_active = gtk_combo_box_get_active(GTK_COMBO_BOX(w->proto_b)); + device = ((BabelDevice*)g_list_nth_data(a_babel_device_list, last_active))->name; + if (!strcmp(device, "garmin")) { + device = "garmin,power_off"; + } + else if (!strcmp(device, "navilink")) { + device = "navilink,power_off"; + } + else { + return; + } + + *babelargs = g_strdup_printf("-i %s", device); + /* device points to static content => no free */ + device = NULL; + +#if GTK_CHECK_VERSION (2, 24, 0) + ser = gtk_combo_box_text_get_active_text(GTK_COMBO_BOX_TEXT(w->ser_b)); +#else + ser = gtk_combo_box_get_active_text(GTK_COMBO_BOX(w->ser_b)); +#endif + *file_descriptor = g_strdup(ser); +} + + +static void datasource_gps_cleanup ( gpointer user_data ) +{ + gps_user_data_t *gud = (gps_user_data_t *)user_data; + // Remove any outstanding GUI update requests + if ( gud->id_status ) + g_source_remove ( gud->id_status ); + if ( gud->id_info ) + g_source_remove ( gud->id_info ); + if ( gud->id_total_count ) + g_source_remove ( gud->id_total_count ); + if ( gud->id_count ) + g_source_remove ( gud->id_count ); + g_free ( gud->info ); + g_free ( gud ); + gps_acquire_in_progress = FALSE; +} + +/** + * datasource_gps_clean_up: + * + * External method to tidy up + */ +void datasource_gps_clean_up ( gpointer user_data ) +{ + datasource_gps_cleanup ( user_data ); +} + +static gboolean show_total_count(acq_dialog_widgets_t *w) +{ + gps_user_data_t *gps_data = (gps_user_data_t *)w->user_data; + if (w->running) { + gint tmp_count; + GtkWidget *progress_label; + const gchar *tmp_str; + switch (gps_data->progress_type) { + case WPT: + progress_label = gps_data->wpt_label; + tmp_str = ngettext("Downloading %d waypoint...", "Downloading %d waypoints...", gps_data->wpt_total_count); + tmp_count = gps_data->wpt_total_count; + break; + case TRK: + progress_label = gps_data->trk_label; + tmp_str = ngettext("Downloading %d trackpoint...", "Downloading %d trackpoints...", gps_data->trk_total_count); + tmp_count = gps_data->trk_total_count; + break; + default: + progress_label = gps_data->rte_label; + tmp_str = ngettext("Downloading %d routepoint...", "Downloading %d routepoints...", gps_data->rte_total_count); + tmp_count = gps_data->rte_total_count; + break; + } + gchar *s = g_strdup_printf(tmp_str, tmp_count); + gtk_label_set_text ( GTK_LABEL(progress_label), s ); + gtk_widget_show ( progress_label ); + g_free(s); + } + gps_data->id_total_count = 0; + return FALSE; +} + +static gboolean show_current_count(acq_dialog_widgets_t *w) +{ + gps_user_data_t *gps_data = (gps_user_data_t *)w->user_data; + if (w->running) { + GtkWidget *progress_label; + gchar *s = NULL; + switch (gps_data->progress_type) { + case WPT: + progress_label = gps_data->wpt_label; + if ( gps_data->wpt_count < gps_data->wpt_total_count ) + s = g_strdup_printf(_("Downloaded %d out of %d %s..."), gps_data->wpt_count, gps_data->wpt_total_count, "waypoints"); + else + s = g_strdup_printf(_("Downloaded %d %s."), gps_data->wpt_count, "waypoints"); + break; + case TRK: + progress_label = gps_data->trk_label; + if ( gps_data->trk_count < gps_data->trk_total_count ) + s = g_strdup_printf(_("Downloaded %d out of %d %s..."), gps_data->trk_count, gps_data->trk_total_count, "trackpoints"); + else + s = g_strdup_printf(_("Downloaded %d %s."), gps_data->trk_count, "trackpoints"); + break; + default: + progress_label = gps_data->rte_label; + if ( gps_data->rte_count < gps_data->rte_total_count ) + s = g_strdup_printf(_("Downloaded %d out of %d %s..."), gps_data->rte_count, gps_data->rte_total_count, "routepoints"); + else + s = g_strdup_printf(_("Downloaded %d %s."), gps_data->rte_count, "routepoints"); + break; + } + gtk_label_set_text ( GTK_LABEL(progress_label), s ); + g_free(s); + } + gps_data->id_count = 0; + return FALSE; +} + +static gboolean show_gps_info(acq_dialog_widgets_t *w) +{ + gps_user_data_t *gps_data = (gps_user_data_t*)w->user_data; + if (w->running) { + gchar *s = g_strdup_printf ( _("GPS Device: %s"), gps_data->info ); + gtk_label_set_text ( GTK_LABEL(gps_data->gps_label), s ); + g_free(s); + } + gps_data->id_info = 0; + return FALSE; +} + +static gboolean show_gps_status(acq_dialog_widgets_t *w) +{ + gps_user_data_t *gps_data = (gps_user_data_t*)w->user_data; + if (w->running) { + gtk_label_set_text ( GTK_LABEL(w->status), _("Status: Working...") ); + } + gps_data->id_status = 0; + return FALSE; +} + +/* + * This routine relies on gpsbabel's diagnostic output to display the progress information. + * These outputs differ when different GPS devices are used, so we will need to test + * them on several and add the corresponding support. + */ +static void datasource_gps_progress ( BabelProgressCode c, gpointer data, acq_dialog_widgets_t *w ) +{ + gchar *line; + gps_user_data_t *gps_data = (gps_user_data_t *)w->user_data; + + switch(c) { + case BABEL_DIAG_OUTPUT: + line = (gchar *)data; + + gps_data->id_status = gdk_threads_add_idle ( (GSourceFunc)show_gps_status, w ); + + /* tells us the type of items that will follow */ + if (strstr(line, "Xfer Wpt")) { + gps_data->progress_type = WPT; + } + if (strstr(line, "Xfer Trk")) { + gps_data->progress_type = TRK; + } + if (strstr(line, "Xfer Rte")) { + gps_data->progress_type = RTE; + } + + if (strstr(line, "PRDDAT")) { + gchar **tokens = g_strsplit(line, " ", 0); + gchar info[128]; + int ilen = 0; + int i; + int n_tokens = 0; + + while (tokens[n_tokens]) + n_tokens++; + + if (n_tokens > 8) { + for (i=8; tokens[i] && ilen < sizeof(info)-2 && strcmp(tokens[i], "00"); i++) { + guint ch; + sscanf(tokens[i], "%x", &ch); + info[ilen++] = ch; + } + info[ilen++] = 0; + gps_data->info = g_strdup (info); + gps_data->id_info = gdk_threads_add_idle ( (GSourceFunc)show_gps_info, w ); + } + g_strfreev(tokens); + } + /* eg: "Unit:\teTrex Legend HCx Software Version 2.90\n" */ + if (strstr(line, "Unit:")) { + gchar **tokens = g_strsplit(line, "\t", 0); + int n_tokens = 0; + while (tokens[n_tokens]) + n_tokens++; + + if (n_tokens > 1) { + gps_data->info = g_strdup (tokens[1]); + gps_data->id_info = gdk_threads_add_idle ( (GSourceFunc)show_gps_info, w ); + } + g_strfreev(tokens); + } + /* Capture some potential errors */ + if (strstr(line, "[ERROR] GPS")) { + gchar **tokens = g_strsplit(line, "\n", 0); + gps_data->info = g_strdup(tokens[0]); + gps_data->id_info = gdk_threads_add_idle ( (GSourceFunc)show_gps_info, w ); + g_strfreev(tokens); + } + if (strstr(line, "an't in")) { + gchar **tokens = g_strsplit(line, "\n", 0); + gps_data->info = g_strdup(tokens[0]); + gps_data->id_info = gdk_threads_add_idle ( (GSourceFunc)show_gps_info, w ); + g_strfreev(tokens); + } + + if (strstr(line, "Can't get waypoint")) { + gchar **tokens = g_strsplit(line, "\n", 0); + gps_data->info = g_strdup(tokens[0]); + gps_data->id_info = gdk_threads_add_idle ( (GSourceFunc)show_gps_info, w ); + g_strfreev(tokens); + } + /* tells us how many items there will be */ + if (strstr(line, "RECORD")) { + int lsb, msb, cnt; + + if (strlen(line) > 20) { + sscanf(line+17, "%x", &lsb); + sscanf(line+20, "%x", &msb); + cnt = lsb + msb * 256; + if ( gps_data->progress_type == RTE ) { + // Maybe a gpsbabel bug/feature (upto at least v1.4.3 or maybe my Garmin device) but the count always seems x2 too many for routepoints + gint mycnt = (cnt / 2) + 1; + gps_data->rte_total_count = mycnt; + gps_data->rte_count = 0; + } + else if ( gps_data->progress_type == TRK ) { + gps_data->trk_total_count = cnt; + gps_data->trk_count = 0; + } + else { + gps_data->wpt_total_count = cnt; + gps_data->wpt_count = 0; + } + + gps_data->id_total_count = gdk_threads_add_idle ( (GSourceFunc)show_total_count, w); + } + } + if ( strstr(line, "WPTDAT") || strstr(line, "TRKHDR") || strstr(line, "TRKDAT") || strstr(line, "RTEHDR") || strstr(line, "RTEWPT") ) { + if ( strstr(line, "WPTDAT") ) + gps_data->wpt_count++; + else if ( strstr(line, "TRKHDR") || strstr(line, "TRKDAT") ) + gps_data->trk_count++; + else + // "RTEHDR" || "RTEWPT" + gps_data->rte_count++; + gps_data->id_count = gdk_threads_add_idle ( (GSourceFunc)show_current_count, w); + } + break; + case BABEL_DONE: + break; + default: + break; + } +} + +void append_element (gpointer elem, gpointer user_data) +{ + const gchar *text = ((BabelDevice*)elem)->label; + vik_combo_box_text_append (GTK_WIDGET(user_data), text); +} + +static gint find_entry = -1; +static gint wanted_entry = -1; + +static void find_protocol (gpointer elem, gpointer user_data) +{ + const gchar *name = ((BabelDevice*)elem)->name; + const gchar *protocol = user_data; + find_entry++; + if (!strcmp(name, protocol)) { + wanted_entry = find_entry; + } +} + +static void datasource_gps_add_setup_widgets ( GtkWidget *dialog, VikViewport *vvp, gpointer user_data ) +{ + gps_user_data_t *w = (gps_user_data_t *)user_data; + GtkTable *box, *data_type_box; + + w->proto_l = gtk_label_new (_("GPS Protocol:")); + w->proto_b = vik_combo_box_text_new (); + g_list_foreach (a_babel_device_list, append_element, w->proto_b); + + if ( last_active < 0 ) { + find_entry = -1; + wanted_entry = -1; + gchar *protocol = NULL; + if ( a_settings_get_string ( VIK_SETTINGS_GPS_PROTOCOL, &protocol ) ) { + // Use setting + if ( protocol ) + g_list_foreach (a_babel_device_list, find_protocol, protocol); + } + else { + // Attempt to maintain default to Garmin devices (assumed most popular/numerous device) + g_list_foreach (a_babel_device_list, find_protocol, "garmin"); + } + g_free ( protocol ); + // If not found set it to the first entry, otherwise use the entry + last_active = ( wanted_entry < 0 ) ? 0 : wanted_entry; + } + + gtk_combo_box_set_active (GTK_COMBO_BOX(w->proto_b), last_active); + g_object_ref(w->proto_b); + + w->ser_l = gtk_label_new (_("Serial Port:")); +#if GTK_CHECK_VERSION (2, 24, 0) + w->ser_b = gtk_combo_box_text_new_with_entry (); +#else + w->ser_b = gtk_combo_box_entry_new_text (); +#endif + // Value from the settings is promoted to the top + gchar *gps_port = NULL; + if ( a_settings_get_string ( VIK_SETTINGS_GPS_PORT, &gps_port ) ) { + // Use setting if available + if ( gps_port ) { +#ifndef WINDOWS + if ( !strncmp (gps_port, "/dev/tty", 6) ) { + if (g_access (gps_port, R_OK) == 0) { + vik_combo_box_text_append (w->ser_b, gps_port); + } + } + else +#endif + vik_combo_box_text_append (w->ser_b, gps_port); + } + } + + // Note avoid appending the port selected from the settings +#ifdef WINDOWS + if ( gps_port && strcmp (gps_port, "com1") ) + vik_combo_box_text_append (w->ser_b, "com1"); +#else + /* Here just try to see if the device is available which gets passed onto gpsbabel + List USB devices first as these will generally only be present if autogenerated by udev or similar + User is still able to set their own free text entry */ + if ( gps_port && strcmp (gps_port, "/dev/ttyUSB0") ) + if (g_access ("/dev/ttyUSB0", R_OK) == 0) + vik_combo_box_text_append (w->ser_b, "/dev/ttyUSB0"); + if ( gps_port && strcmp (gps_port, "/dev/ttyUSB1") ) + if (g_access ("/dev/ttyUSB1", R_OK) == 0) + vik_combo_box_text_append (w->ser_b, "/dev/ttyUSB1"); + if ( gps_port && strcmp (gps_port, "/dev/ttyS0") ) + if (g_access ("/dev/ttyS0", R_OK) == 0) + vik_combo_box_text_append (w->ser_b, "/dev/ttyS0"); + if ( gps_port && strcmp (gps_port, "/dev/ttyS1") ) + if (g_access ("/dev/ttyS1", R_OK) == 0) + vik_combo_box_text_append (w->ser_b, "/dev/ttyS1"); +#endif + if ( gps_port && strcmp (gps_port, "usb:") ) + vik_combo_box_text_append (w->ser_b, "usb:"); + + gtk_combo_box_set_active (GTK_COMBO_BOX(w->ser_b), 0); + g_object_ref(w->ser_b); + + w->off_request_l = gtk_label_new (_("Turn Off After Transfer\n(Garmin/NAViLink Only)")); + w->off_request_b = GTK_CHECK_BUTTON ( gtk_check_button_new () ); + gboolean power_off; + if ( ! a_settings_get_boolean ( VIK_SETTINGS_GPS_POWER_OFF, &power_off ) ) + power_off = FALSE; + gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(w->off_request_b), power_off); + + w->get_tracks_l = gtk_label_new (_("Tracks:")); + w->get_tracks_b = GTK_CHECK_BUTTON ( gtk_check_button_new () ); + gboolean get_tracks; + if ( ! a_settings_get_boolean ( VIK_SETTINGS_GPS_GET_TRACKS, &get_tracks ) ) + get_tracks = TRUE; + gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(w->get_tracks_b), get_tracks); + + w->get_routes_l = gtk_label_new (_("Routes:")); + w->get_routes_b = GTK_CHECK_BUTTON ( gtk_check_button_new () ); + gboolean get_routes; + if ( ! a_settings_get_boolean ( VIK_SETTINGS_GPS_GET_ROUTES, &get_routes ) ) + get_routes = FALSE; + gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(w->get_routes_b), get_routes); + + w->get_waypoints_l = gtk_label_new (_("Waypoints:")); + w->get_waypoints_b = GTK_CHECK_BUTTON ( gtk_check_button_new () ); + gboolean get_waypoints; + if ( ! a_settings_get_boolean ( VIK_SETTINGS_GPS_GET_WAYPOINTS, &get_waypoints ) ) + get_waypoints = TRUE; + gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(w->get_waypoints_b), get_waypoints); + + box = GTK_TABLE(gtk_table_new(2, 4, FALSE)); + data_type_box = GTK_TABLE(gtk_table_new(6, 1, FALSE)); + + gtk_table_attach_defaults(box, GTK_WIDGET(w->proto_l), 0, 1, 0, 1); + gtk_table_attach_defaults(box, GTK_WIDGET(w->proto_b), 1, 2, 0, 1); + gtk_table_attach_defaults(box, GTK_WIDGET(w->ser_l), 0, 1, 1, 2); + gtk_table_attach_defaults(box, GTK_WIDGET(w->ser_b), 1, 2, 1, 2); + gtk_table_attach_defaults(data_type_box, GTK_WIDGET(w->get_tracks_l), 0, 1, 0, 1); + gtk_table_attach_defaults(data_type_box, GTK_WIDGET(w->get_tracks_b), 1, 2, 0, 1); + gtk_table_attach_defaults(data_type_box, GTK_WIDGET(w->get_routes_l), 2, 3, 0, 1); + gtk_table_attach_defaults(data_type_box, GTK_WIDGET(w->get_routes_b), 3, 4, 0, 1); + gtk_table_attach_defaults(data_type_box, GTK_WIDGET(w->get_waypoints_l), 4, 5, 0, 1); + gtk_table_attach_defaults(data_type_box, GTK_WIDGET(w->get_waypoints_b), 5, 6, 0, 1); + gtk_table_attach_defaults(box, GTK_WIDGET(data_type_box), 0, 2, 2, 3); + gtk_table_attach_defaults(box, GTK_WIDGET(w->off_request_l), 0, 1, 3, 4); + gtk_table_attach_defaults(box, GTK_WIDGET(w->off_request_b), 1, 3, 3, 4); + gtk_box_pack_start ( GTK_BOX(gtk_dialog_get_content_area(GTK_DIALOG(dialog))), GTK_WIDGET(box), FALSE, FALSE, 5 ); + + gtk_widget_show_all ( dialog ); +} + +/** + * datasource_gps_setup: + * @dialog: The GTK dialog. The caller is responsible for managing the dialog creation/deletion + * @xfer: The default type of items enabled for transfer, others disabled. + * @xfer_all: When specified all items are enabled for transfer. + * + * Returns: A gpointer to the private structure for GPS progress/information widgets + * Pass this pointer back into the other exposed datasource_gps_X functions + */ +gpointer datasource_gps_setup ( GtkWidget *dialog, vik_gps_xfer_type xfer, gboolean xfer_all ) +{ + gps_user_data_t *w_gps = (gps_user_data_t *)datasource_gps_init_func ( NULL ); + w_gps->direction = GPS_UP; + datasource_gps_add_setup_widgets ( dialog, NULL, w_gps ); + + gboolean way = xfer_all; + gboolean trk = xfer_all; + gboolean rte = xfer_all; + + // Selectively turn bits on + if ( !xfer_all ) { + switch (xfer) { + case WPT: way = TRUE; break; + case RTE: rte = TRUE; break; + default: trk = TRUE; break; + } + } + + // Apply + gtk_toggle_button_set_active ( GTK_TOGGLE_BUTTON(w_gps->get_tracks_b), trk ); + gtk_widget_set_sensitive ( GTK_WIDGET(w_gps->get_tracks_l), trk ); + gtk_widget_set_sensitive ( GTK_WIDGET(w_gps->get_tracks_b), trk ); + + gtk_toggle_button_set_active ( GTK_TOGGLE_BUTTON(w_gps->get_routes_b), rte ); + gtk_widget_set_sensitive ( GTK_WIDGET(w_gps->get_routes_l), rte ); + gtk_widget_set_sensitive ( GTK_WIDGET(w_gps->get_routes_b), rte ); + + gtk_toggle_button_set_active ( GTK_TOGGLE_BUTTON(w_gps->get_waypoints_b), way ); + gtk_widget_set_sensitive ( GTK_WIDGET(w_gps->get_waypoints_l), way ); + gtk_widget_set_sensitive ( GTK_WIDGET(w_gps->get_waypoints_b), way ); + + return (gpointer)w_gps; +} + +void datasource_gps_add_progress_widgets ( GtkWidget *dialog, gpointer user_data ) +{ + gps_user_data_t *w_gps = (gps_user_data_t *)user_data; + + w_gps->gps_label = gtk_label_new (_("GPS device: N/A")); + w_gps->wpt_label = gtk_label_new (""); + w_gps->trk_label = gtk_label_new (""); + w_gps->rte_label = gtk_label_new (""); + + gtk_box_pack_start ( GTK_BOX(gtk_dialog_get_content_area(GTK_DIALOG(dialog))), w_gps->gps_label, FALSE, FALSE, 5 ); + gtk_box_pack_start ( GTK_BOX(gtk_dialog_get_content_area(GTK_DIALOG(dialog))), w_gps->wpt_label, FALSE, FALSE, 5 ); + gtk_box_pack_start ( GTK_BOX(gtk_dialog_get_content_area(GTK_DIALOG(dialog))), w_gps->trk_label, FALSE, FALSE, 5 ); + gtk_box_pack_start ( GTK_BOX(gtk_dialog_get_content_area(GTK_DIALOG(dialog))), w_gps->rte_label, FALSE, FALSE, 5 ); + + gtk_widget_show_all ( dialog ); +} diff --git a/src/datasource_gps.h b/src/datasource_gps.h new file mode 100644 index 0000000..39f1e97 --- /dev/null +++ b/src/datasource_gps.h @@ -0,0 +1,45 @@ +/* -*- Mode: C; indent-tabs-mode: t; c-basic-offset: 4; tab-width: 4 -*- */ +/* + * viking -- GPS Data and Topo Analyzer, Explorer, and Manager + * + * Copyright (C) 2012, Rob Norris + * + * 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., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA + * + */ + +#ifndef _DATASOURCE_GPS_H +#define _DATASOURCE_GPS_H + +#include "viking.h" +#include "gtk/gtk.h" + +G_BEGIN_DECLS + +gpointer datasource_gps_setup ( GtkWidget *dialog, vik_gps_xfer_type xfer, gboolean xfer_all ); +void datasource_gps_clean_up ( gpointer user_data ); + +gchar* datasource_gps_get_protocol ( gpointer user_data ); +gchar* datasource_gps_get_descriptor ( gpointer user_data ); + +gboolean datasource_gps_get_do_tracks ( gpointer user_data ); +gboolean datasource_gps_get_do_routes ( gpointer user_data ); +gboolean datasource_gps_get_do_waypoints ( gpointer user_data ); + +gboolean datasource_gps_get_off ( gpointer user_data ); + +G_END_DECLS + +#endif diff --git a/src/datasource_osm.c b/src/datasource_osm.c new file mode 100644 index 0000000..a66c686 --- /dev/null +++ b/src/datasource_osm.c @@ -0,0 +1,131 @@ +/* + * viking -- GPS Data and Topo Analyzer, Explorer, and Manager + * + * Copyright (C) 2011, Guilhem Bonnefille + * Copyright (C) 2015, Rob Norris + * + * 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., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA + * + */ +#ifdef HAVE_CONFIG_H +#include "config.h" +#endif +#include + +#include +#include + +#include "viking.h" +#include "babel.h" +#include "gpx.h" +#include "acquire.h" + +/** + * See http://wiki.openstreetmap.org/wiki/API_v0.6#GPS_Traces + */ +#define DOWNLOAD_URL_FMT "https://api.openstreetmap.org/api/0.6/trackpoints?bbox=%s,%s,%s,%s&page=%d" + +typedef struct { + GtkWidget *page_number; + VikViewport *vvp; +} datasource_osm_widgets_t; + +static gdouble last_page_number = 0; + +static gpointer datasource_osm_init ( acq_vik_t *avt ); +static void datasource_osm_add_setup_widgets ( GtkWidget *dialog, VikViewport *vvp, gpointer user_data ); +static void datasource_osm_get_process_options ( datasource_osm_widgets_t *widgets, ProcessOptions *po, DownloadFileOptions *options, const gchar *notused1, const gchar *notused2); +static void datasource_osm_cleanup ( gpointer data ); + +VikDataSourceInterface vik_datasource_osm_interface = { + N_("OSM traces"), + N_("OSM traces"), + VIK_DATASOURCE_AUTO_LAYER_MANAGEMENT, + VIK_DATASOURCE_INPUTTYPE_NONE, + TRUE, + TRUE, + TRUE, + (VikDataSourceInitFunc) datasource_osm_init, + (VikDataSourceCheckExistenceFunc) NULL, + (VikDataSourceAddSetupWidgetsFunc) datasource_osm_add_setup_widgets, + (VikDataSourceGetProcessOptionsFunc) datasource_osm_get_process_options, + (VikDataSourceProcessFunc) a_babel_convert_from, + (VikDataSourceProgressFunc) NULL, + (VikDataSourceAddProgressWidgetsFunc) NULL, + (VikDataSourceCleanupFunc) datasource_osm_cleanup, + (VikDataSourceOffFunc) NULL, + + NULL, + 0, + NULL, + NULL, + 0 +}; + +static gpointer datasource_osm_init ( acq_vik_t *avt ) +{ + datasource_osm_widgets_t *widgets = g_malloc(sizeof(*widgets)); + /* Keep reference to viewport */ + widgets->vvp = avt->vvp; + return widgets; +} + +static void datasource_osm_add_setup_widgets ( GtkWidget *dialog, VikViewport *vvp, gpointer user_data ) +{ + datasource_osm_widgets_t *widgets = (datasource_osm_widgets_t *)user_data; + GtkWidget *page_number_label; + page_number_label = gtk_label_new (_("Page number:")); + widgets->page_number = gtk_spin_button_new_with_range(0, 100, 1); + gtk_spin_button_set_value(GTK_SPIN_BUTTON(widgets->page_number), last_page_number); + + /* Packing all widgets */ + GtkBox *box = GTK_BOX(gtk_dialog_get_content_area(GTK_DIALOG(dialog))); + gtk_box_pack_start ( box, page_number_label, FALSE, FALSE, 5 ); + gtk_box_pack_start ( box, widgets->page_number, FALSE, FALSE, 5 ); + gtk_widget_show_all(dialog); +} + +static void datasource_osm_get_process_options ( datasource_osm_widgets_t *widgets, ProcessOptions *po, DownloadFileOptions *options, const gchar *notused1, const gchar *notused2) +{ + int page = 0; + gdouble min_lat, max_lat, min_lon, max_lon; + gchar sminlon[G_ASCII_DTOSTR_BUF_SIZE]; + gchar smaxlon[G_ASCII_DTOSTR_BUF_SIZE]; + gchar sminlat[G_ASCII_DTOSTR_BUF_SIZE]; + gchar smaxlat[G_ASCII_DTOSTR_BUF_SIZE]; + + /* get Viewport bounding box */ + vik_viewport_get_min_max_lat_lon ( widgets->vvp, &min_lat, &max_lat, &min_lon, &max_lon ); + + /* Convert as LANG=C double representation */ + g_ascii_dtostr (sminlon, G_ASCII_DTOSTR_BUF_SIZE, min_lon); + g_ascii_dtostr (smaxlon, G_ASCII_DTOSTR_BUF_SIZE, max_lon); + g_ascii_dtostr (sminlat, G_ASCII_DTOSTR_BUF_SIZE, min_lat); + g_ascii_dtostr (smaxlat, G_ASCII_DTOSTR_BUF_SIZE, max_lat); + + /* Retrieve the specified page number */ + last_page_number = gtk_spin_button_get_value(GTK_SPIN_BUTTON(widgets->page_number)); + page = last_page_number; + + // NB Download is of GPX type + po->url = g_strdup_printf( DOWNLOAD_URL_FMT, sminlon, sminlat, smaxlon, smaxlat, page ); + options = NULL; // i.e. use the default download settings +} + +static void datasource_osm_cleanup ( gpointer data ) +{ + g_free ( data ); +} + diff --git a/src/datasource_osm_my_traces.c b/src/datasource_osm_my_traces.c new file mode 100644 index 0000000..bfb2ea0 --- /dev/null +++ b/src/datasource_osm_my_traces.c @@ -0,0 +1,720 @@ +/* -*- Mode: C; indent-tabs-mode: t; c-basic-offset: 4; tab-width: 4 -*- */ +/* + * viking -- GPS Data and Topo Analyzer, Explorer, and Manager + * + * Copyright (C) 2012-2015, Rob Norris + * + * 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., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA + * + */ +#ifdef HAVE_CONFIG_H +#include "config.h" +#endif + +#include +#include +#include + +#include + +#include "viking.h" +#include "gpx.h" +#include "acquire.h" +#include "osm-traces.h" +#include "datasource_gps.h" +#include "bbox.h" + +/** + * See http://wiki.openstreetmap.org/wiki/API_v0.6#GPS_Traces + */ +#define DS_OSM_TRACES_GPX_URL_FMT "https://api.openstreetmap.org/api/0.6/gpx/%d/data" +#define DS_OSM_TRACES_GPX_FILES "https://api.openstreetmap.org/api/0.6/user/gpx_files" + +typedef struct { + GtkWidget *user_entry; + GtkWidget *password_entry; + // NB actual user and password values are stored in oms-traces.c + VikViewport *vvp; +} datasource_osm_my_traces_t; + +static gpointer datasource_osm_my_traces_init ( acq_vik_t *avt ); +static void datasource_osm_my_traces_add_setup_widgets ( GtkWidget *dialog, VikViewport *vvp, gpointer user_data ); +static void datasource_osm_my_traces_get_process_options ( gpointer user_data, ProcessOptions *po, DownloadFileOptions *options, const gchar *notused1, const gchar *notused2 ); +static gboolean datasource_osm_my_traces_process ( VikTrwLayer *vtl, ProcessOptions *process_options, BabelStatusFunc status_cb, acq_dialog_widgets_t *adw, DownloadFileOptions *options_unused ); +static void datasource_osm_my_traces_cleanup ( gpointer data ); + +VikDataSourceInterface vik_datasource_osm_my_traces_interface = { + N_("OSM My Traces"), + N_("OSM My Traces"), + VIK_DATASOURCE_MANUAL_LAYER_MANAGEMENT, // we'll do this ourselves + VIK_DATASOURCE_INPUTTYPE_NONE, + TRUE, + TRUE, + FALSE, // Don't use thread method + (VikDataSourceInitFunc) datasource_osm_my_traces_init, + (VikDataSourceCheckExistenceFunc) NULL, + (VikDataSourceAddSetupWidgetsFunc)datasource_osm_my_traces_add_setup_widgets, + (VikDataSourceGetProcessOptionsFunc) datasource_osm_my_traces_get_process_options, + (VikDataSourceProcessFunc) datasource_osm_my_traces_process, + (VikDataSourceProgressFunc) NULL, + (VikDataSourceAddProgressWidgetsFunc) NULL, + (VikDataSourceCleanupFunc) datasource_osm_my_traces_cleanup, + (VikDataSourceOffFunc) NULL, + + NULL, + 0, + NULL, + NULL, + 0 +}; + +static gpointer datasource_osm_my_traces_init ( acq_vik_t *avt ) +{ + datasource_osm_my_traces_t *data = g_malloc(sizeof(*data)); + /* Keep reference to viewport */ + data->vvp = avt->vvp; + // Reuse GPS functions + // Haven't been able to get the thread method to work reliably (or get progress feedback) + // So thread version is disabled ATM + /* + if ( vik_datasource_osm_my_traces_interface.is_thread ) { + vik_datasource_osm_my_traces_interface.progress_func = datasource_gps_progress; + vik_datasource_osm_my_traces_interface.add_progress_widgets_func = datasource_gps_add_progress_widgets; + } + */ + return data; +} + +static void datasource_osm_my_traces_add_setup_widgets ( GtkWidget *dialog, VikViewport *vvp, gpointer user_data ) +{ + if ( osm_use_basic_auth() ) { + datasource_osm_my_traces_t *data = (datasource_osm_my_traces_t *)user_data; + GtkWidget *user_label; + GtkWidget *password_label; + user_label = gtk_label_new(_("Email/username:")); + data->user_entry = gtk_entry_new(); + + gtk_box_pack_start ( GTK_BOX(gtk_dialog_get_content_area(GTK_DIALOG(dialog))), user_label, FALSE, FALSE, 0 ); + gtk_box_pack_start ( GTK_BOX(gtk_dialog_get_content_area(GTK_DIALOG(dialog))), data->user_entry, FALSE, FALSE, 0 ); + gtk_widget_set_tooltip_markup ( GTK_WIDGET(data->user_entry), _("The email or username used to login to OSM") ); + + password_label = gtk_label_new ( _("Password:") ); + data->password_entry = gtk_entry_new (); + + gtk_widget_set_tooltip_markup ( GTK_WIDGET(data->password_entry), _("The password used to login to OSM") ); + + osm_login_widgets (data->user_entry, data->password_entry); + + /* Packing all widgets */ + GtkBox *box = GTK_BOX(gtk_dialog_get_content_area(GTK_DIALOG(dialog))); + gtk_box_pack_start ( box, password_label, FALSE, FALSE, 0 ); + gtk_box_pack_start ( box, data->password_entry, FALSE, FALSE, 0 ); + } + gtk_widget_show_all ( dialog ); +} + +static void datasource_osm_my_traces_get_process_options ( gpointer user_data, ProcessOptions *po, DownloadFileOptions *options, const gchar *notused1, const gchar *notused2 ) +{ + if ( osm_use_basic_auth() ) { + datasource_osm_my_traces_t *data = (datasource_osm_my_traces_t*) user_data; + /* overwrite authentication info */ + osm_set_login ( gtk_entry_get_text ( GTK_ENTRY(data->user_entry) ), + gtk_entry_get_text ( GTK_ENTRY(data->password_entry) ) ); + } + // If going to use the values passed back into the process function parameters then they need to be set. + // But ATM we aren't + options = NULL; +} + +typedef enum { + tt_unknown = 0, + tt_osm, + tt_gpx_file, + tt_gpx_file_desc, + tt_gpx_file_tag, +} xtag_type; + +typedef struct { + xtag_type tag_type; /* enum from above for this tag */ + const char *tag_name; /* xpath-ish tag name */ +} xtag_mapping; + +typedef struct { + guint id; + gchar *name; + gchar *vis; + gchar *desc; + struct LatLon ll; + gboolean in_current_view; // Is the track LatLon start within the current viewport + // This is useful in deciding whether to download a track or not + // ATM Only used for display - may want to convert to a time_t for other usage + gchar *timestamp; + // user made up tags - not being used yet - would be nice to sort/select on these but display will get complicated + // GList *tag_list; +} gpx_meta_data_t; + +static gpx_meta_data_t *new_gpx_meta_data_t() +{ + gpx_meta_data_t *ret; + + ret = (gpx_meta_data_t *)g_malloc(sizeof(gpx_meta_data_t)); + ret->id = 0; + ret->name = NULL; + ret->vis = NULL; + ret->desc = NULL; + ret->ll.lat = 0.0; + ret->ll.lon = 0.0; + ret->in_current_view = FALSE; + ret->timestamp = NULL; + + return ret; +} + +static void free_gpx_meta_data ( gpx_meta_data_t *data, gpointer userdata ) +{ + g_free(data->name); + g_free(data->vis); + g_free(data->desc); + g_free(data->timestamp); +} + +static void free_gpx_meta_data_list (GList *list) +{ + g_list_foreach (list, (GFunc)free_gpx_meta_data, NULL); + g_list_free (list); +} + +static gpx_meta_data_t *copy_gpx_meta_data_t (gpx_meta_data_t *src) +{ + gpx_meta_data_t *dest = new_gpx_meta_data_t(); + + dest->id = src->id; + dest->name = g_strdup(src->name); + dest->vis = g_strdup(src->vis); + dest->desc = g_strdup(src->desc); + dest->ll.lat = src->ll.lat; + dest->ll.lon = src->ll.lon; + dest->in_current_view = src->in_current_view; + dest->timestamp = g_strdup(src->timestamp); + + return dest; +} + +typedef struct { + //GString *xpath; + GString *c_cdata; + xtag_type current_tag; + gpx_meta_data_t *current_gpx_meta_data; + GList *list_of_gpx_meta_data; +} xml_data; + +// Same as the gpx.c function +static const char *get_attr ( const char **attr, const char *key ) +{ + while ( *attr ) { + if ( strcmp(*attr,key) == 0 ) + return *(attr + 1); + attr += 2; + } + return NULL; +} + +// ATM don't care about actual path as tags are all unique +static xtag_mapping xtag_path_map[] = { + { tt_osm, "osm" }, + { tt_gpx_file, "gpx_file" }, + { tt_gpx_file_desc, "description" }, + { tt_gpx_file_tag, "tag" }, +}; + +static xtag_type get_tag ( const char *t ) +{ + xtag_mapping *tm; + for (tm = xtag_path_map; tm->tag_type != 0; tm++) + if (0 == strcmp(tm->tag_name, t)) + return tm->tag_type; + return tt_unknown; +} + +static void gpx_meta_data_start ( xml_data *xd, const char *el, const char **attr ) +{ + const gchar *tmp; + gchar buf[G_ASCII_DTOSTR_BUF_SIZE]; + buf[0] = '\0'; + + // Don't need to build a path - we can use the tag directly + //g_string_append_c ( xd->xpath, '/' ); + //g_string_append ( xd->xpath, el ); + //xd->current_tag = get_tag ( xd->xpath->str ); + xd->current_tag = get_tag ( el ); + switch ( xd->current_tag ) { + case tt_gpx_file: + if ( xd->current_gpx_meta_data ) + free_gpx_meta_data ( xd->current_gpx_meta_data, NULL ); + xd->current_gpx_meta_data = new_gpx_meta_data_t(); + + if ( ( tmp = get_attr ( attr, "id" ) ) ) + xd->current_gpx_meta_data->id = atoi ( tmp ); + + if ( ( tmp = get_attr ( attr, "name" ) ) ) + xd->current_gpx_meta_data->name = g_strdup ( tmp ); + + if ( ( tmp = get_attr ( attr, "lat" ) ) ) { + g_strlcpy ( buf, tmp, sizeof (buf) ); + xd->current_gpx_meta_data->ll.lat = g_ascii_strtod ( buf, NULL ); + } + + if ( ( tmp = get_attr ( attr, "lon" ) ) ) { + g_strlcpy ( buf, tmp, sizeof (buf) ); + xd->current_gpx_meta_data->ll.lon = g_ascii_strtod ( buf, NULL ); + } + + if ( ( tmp = get_attr ( attr, "visibility" ) ) ) + xd->current_gpx_meta_data->vis = g_strdup ( tmp ); + + if ( ( tmp = get_attr ( attr, "timestamp" ) ) ) + xd->current_gpx_meta_data->timestamp = g_strdup ( tmp ); + + g_string_erase ( xd->c_cdata, 0, -1 ); // clear the cdata buffer + break; + case tt_gpx_file_desc: + case tt_gpx_file_tag: + g_string_erase ( xd->c_cdata, 0, -1 ); // clear the cdata buffer + break; + default: + g_string_erase ( xd->c_cdata, 0, -1 ); // clear the cdata buffer + break; + } +} + +static void gpx_meta_data_end ( xml_data *xd, const char *el ) +{ + //g_string_truncate ( xd->xpath, xd->xpath->len - strlen(el) - 1 ); + //switch ( xd->current_tag ) { + switch ( get_tag ( el ) ) { + case tt_gpx_file: { + // End of the individual file metadata, thus save what we have read in to the list + // Copy it so we can reference it + gpx_meta_data_t *current = copy_gpx_meta_data_t ( xd->current_gpx_meta_data ); + // Stick in the list + xd->list_of_gpx_meta_data = g_list_prepend(xd->list_of_gpx_meta_data, current); + g_string_erase ( xd->c_cdata, 0, -1 ); + break; + } + case tt_gpx_file_desc: + // Store the description: + if ( xd->current_gpx_meta_data ) { + // NB Limit description size as it's displayed on a single line + // Hopefully this will prevent the dialog getting too wide... + xd->current_gpx_meta_data->desc = g_strndup ( xd->c_cdata->str, 63 ); + } + g_string_erase ( xd->c_cdata, 0, -1 ); + break; + case tt_gpx_file_tag: + // One day do something with this... + g_string_erase ( xd->c_cdata, 0, -1 ); + break; + default: + break; + } +} + +static void gpx_meta_data_cdata ( xml_data *xd, const XML_Char *s, int len ) +{ + switch ( xd->current_tag ) { + case tt_gpx_file_desc: + case tt_gpx_file_tag: + g_string_append_len ( xd->c_cdata, s, len ); + break; + default: break; // ignore cdata from other things + } +} + +static gboolean read_gpx_files_metadata_xml ( gchar *tmpname, xml_data *xd ) +{ + FILE *ff = g_fopen (tmpname, "r"); + if ( !ff ) + return FALSE; + + XML_Parser parser = XML_ParserCreate(NULL); + enum XML_Status status = XML_STATUS_ERROR; + + XML_SetElementHandler(parser, (XML_StartElementHandler) gpx_meta_data_start, (XML_EndElementHandler) gpx_meta_data_end); + XML_SetUserData(parser, xd); + XML_SetCharacterDataHandler(parser, (XML_CharacterDataHandler) gpx_meta_data_cdata); + + gchar buf[4096]; + + int done=0, len; + while (!done) { + len = fread(buf, 1, sizeof(buf)-7, ff); + done = feof(ff) || !len; + status = XML_Parse(parser, buf, len, done); + } + + XML_ParserFree (parser); + + fclose ( ff ); + + return status != XML_STATUS_ERROR; +} + +static GList *select_from_list (GtkWindow *parent, GList *list, const gchar *title, const gchar *msg ) +{ + GtkTreeIter iter; + GtkCellRenderer *renderer; + GtkWidget *view; + gchar *latlon_string; + int column_runner; + + GtkWidget *dialog = gtk_dialog_new_with_buttons (title, + parent, + GTK_DIALOG_MODAL | GTK_DIALOG_DESTROY_WITH_PARENT, + GTK_STOCK_CANCEL, + GTK_RESPONSE_REJECT, + GTK_STOCK_OK, + GTK_RESPONSE_ACCEPT, + NULL); + /* When something is selected then OK */ + gtk_dialog_set_default_response ( GTK_DIALOG(dialog), GTK_RESPONSE_ACCEPT ); + GtkWidget *response_w = NULL; +#if GTK_CHECK_VERSION (2, 20, 0) + /* Default to not apply - as initially nothing is selected! */ + response_w = gtk_dialog_get_widget_for_response ( GTK_DIALOG(dialog), GTK_RESPONSE_REJECT ); +#endif + GtkWidget *label = gtk_label_new ( msg ); + GtkTreeStore *store = gtk_tree_store_new ( 6, G_TYPE_STRING, G_TYPE_STRING, G_TYPE_STRING, G_TYPE_STRING, G_TYPE_STRING, G_TYPE_BOOLEAN ); + GList *list_runner = list; + while (list_runner) { + gpx_meta_data_t *gpx_meta_data = (gpx_meta_data_t *)list_runner->data; + // To keep display compact three digits of precision for lat/lon should be plenty + latlon_string = g_strdup_printf("(%.3f,%.3f)", gpx_meta_data->ll.lat, gpx_meta_data->ll.lon); + gtk_tree_store_append(store, &iter, NULL); + gtk_tree_store_set ( store, &iter, + 0, gpx_meta_data->name, + 1, gpx_meta_data->desc, + 2, gpx_meta_data->timestamp, + 3, latlon_string, + 4, gpx_meta_data->vis, + 5, gpx_meta_data->in_current_view, + -1 ); + list_runner = g_list_next ( list_runner ); + g_free ( latlon_string ); + } + + view = gtk_tree_view_new(); + renderer = gtk_cell_renderer_text_new(); + column_runner = 0; + GtkTreeViewColumn *column; + + column = gtk_tree_view_column_new_with_attributes ( _("Name"), renderer, "text", column_runner, NULL); + gtk_tree_view_column_set_sort_column_id (column, column_runner); + gtk_tree_view_append_column (GTK_TREE_VIEW (view), column); + + column_runner++; + column = gtk_tree_view_column_new_with_attributes ( _("Description"), renderer, "text", column_runner, NULL); + gtk_tree_view_column_set_sort_column_id (column, column_runner); + gtk_tree_view_append_column (GTK_TREE_VIEW (view), column); + + column_runner++; + column = gtk_tree_view_column_new_with_attributes ( _("Time"), renderer, "text", column_runner, NULL); + gtk_tree_view_column_set_sort_column_id (column, column_runner); + gtk_tree_view_append_column (GTK_TREE_VIEW (view), column); + + column_runner++; + column = gtk_tree_view_column_new_with_attributes ( _("Lat/Lon"), renderer, "text", column_runner, NULL); + gtk_tree_view_column_set_sort_column_id (column, column_runner); + gtk_tree_view_append_column (GTK_TREE_VIEW (view), column); + + column_runner++; + column = gtk_tree_view_column_new_with_attributes ( _("Privacy"), renderer, "text", column_runner, NULL); // AKA Visibility + gtk_tree_view_column_set_sort_column_id (column, column_runner); + gtk_tree_view_append_column (GTK_TREE_VIEW (view), column); + + GtkCellRenderer *renderer_toggle = gtk_cell_renderer_toggle_new (); + g_object_set (G_OBJECT (renderer_toggle), "activatable", FALSE, NULL); // No user action - value is just for display + column_runner++; + column = gtk_tree_view_column_new_with_attributes ( _("Within Current View"), renderer_toggle, "active", column_runner, NULL); + gtk_tree_view_column_set_sort_column_id (column, column_runner); + gtk_tree_view_append_column (GTK_TREE_VIEW (view), column); + + gtk_tree_view_set_model(GTK_TREE_VIEW(view), GTK_TREE_MODEL(store)); + gtk_tree_selection_set_mode( gtk_tree_view_get_selection(GTK_TREE_VIEW(view)), GTK_SELECTION_MULTIPLE ); + g_object_unref(store); + + GtkWidget *scrolledwindow = gtk_scrolled_window_new ( NULL, NULL ); + gtk_scrolled_window_set_policy ( GTK_SCROLLED_WINDOW(scrolledwindow), GTK_POLICY_NEVER, GTK_POLICY_AUTOMATIC ); + gtk_container_add ( GTK_CONTAINER(scrolledwindow), view ); + + gtk_box_pack_start (GTK_BOX(gtk_dialog_get_content_area(GTK_DIALOG(dialog))), label, FALSE, FALSE, 0); + gtk_box_pack_start (GTK_BOX(gtk_dialog_get_content_area(GTK_DIALOG(dialog))), scrolledwindow, TRUE, TRUE, 0); + + // Ensure a reasonable number of items are shown, but let the width be automatically sized + gtk_widget_set_size_request ( dialog, -1, 400) ; + gtk_widget_show_all ( dialog ); + + if ( response_w ) + gtk_widget_grab_focus ( response_w ); + + while ( gtk_dialog_run (GTK_DIALOG (dialog)) == GTK_RESPONSE_ACCEPT ) { + + // Possibily not the fastest method but we don't have thousands of entries to process... + GtkTreeSelection *selection = gtk_tree_view_get_selection(GTK_TREE_VIEW(view)); + GList *selected = NULL; + + // because we don't store the full data in the gtk model, we have to scan & look it up + if ( gtk_tree_model_get_iter_first( GTK_TREE_MODEL(store), &iter) ) { + do { + if ( gtk_tree_selection_iter_is_selected ( selection, &iter ) ) { + // For every selected item, + // compare the name from the displayed view to every gpx entry to find the gpx this selection represents + gchar* name; + gtk_tree_model_get (GTK_TREE_MODEL(store), &iter, 0, &name, -1 ); + // I believe the name of these items to be always unique + list_runner = list; + while (list_runner) { + if ( !strcmp ( ((gpx_meta_data_t*)list_runner->data)->name, name ) ) { + gpx_meta_data_t *copied = copy_gpx_meta_data_t (list_runner->data); + selected = g_list_prepend (selected, copied); + break; + } + list_runner = g_list_next ( list_runner ); + } + g_free ( name ); + } + } + while ( gtk_tree_model_iter_next ( GTK_TREE_MODEL(store), &iter ) ); + } + + if ( selected ) { + gtk_widget_destroy ( dialog ); + return selected; + } + a_dialog_error_msg(parent, _("Nothing was selected")); + } + gtk_widget_destroy ( dialog ); + return NULL; +} + +static void none_found ( GtkWindow *gw ) +{ + GtkWidget *dialog = NULL; + + dialog = gtk_dialog_new_with_buttons ( "", gw, 0, GTK_STOCK_OK, GTK_RESPONSE_ACCEPT, NULL ); + gtk_window_set_title(GTK_WINDOW(dialog), _("GPS Traces")); + + GtkWidget *search_label = gtk_label_new(_("None found!")); + gtk_box_pack_start ( GTK_BOX(gtk_dialog_get_content_area(GTK_DIALOG(dialog))), search_label, FALSE, FALSE, 5 ); + gtk_dialog_set_default_response ( GTK_DIALOG(dialog), GTK_RESPONSE_ACCEPT ); + gtk_widget_show_all(dialog); + + gtk_dialog_run ( GTK_DIALOG(dialog) ); + gtk_widget_destroy(dialog); +} + +/** + * For each track - mark whether the start is in within the viewport + */ +static void set_in_current_view_property ( VikTrwLayer *vtl, datasource_osm_my_traces_t *data, GList *gl ) +{ + // get viewport bounding box + LatLonBBox bbox = vik_viewport_get_bbox ( data->vvp ); + + GList *iterator = gl; + while ( iterator ) { + gpx_meta_data_t* gmd = (gpx_meta_data_t*)iterator->data; + // Convert point position into a 'fake' bounding box + // TODO - probably should have function to see if point is within bounding box + // rather than constructing this fake bounding box for the test + LatLonBBox gmd_bbox; + gmd_bbox.north = gmd->ll.lat; + gmd_bbox.east = gmd->ll.lon; + gmd_bbox.south = gmd->ll.lat; + gmd_bbox.west = gmd->ll.lon; + + if ( BBOX_INTERSECT ( bbox, gmd_bbox ) ) + gmd->in_current_view = TRUE; + + iterator = g_list_next ( iterator ); + } +} + +static gboolean datasource_osm_my_traces_process ( VikTrwLayer *vtl, ProcessOptions *process_options, BabelStatusFunc status_cb, acq_dialog_widgets_t *adw, DownloadFileOptions *options_unused ) +{ + gboolean result; + + gchar *user_pass = NULL; + gchar *uri = NULL; + if ( osm_use_basic_auth() ) { + uri = g_strdup ( DS_OSM_TRACES_GPX_FILES ); + user_pass = osm_get_login(); + } +#ifdef HAVE_OAUTH_H + else { + datasource_osm_my_traces_t *data = (datasource_osm_my_traces_t *)adw->user_data; + uri = osm_oauth_sign_url ( DS_OSM_TRACES_GPX_FILES, NULL ); + if ( !uri ) { + a_dialog_error_msg ( VIK_GTK_WINDOW_FROM_WIDGET(data->vvp), _("Ensure the OSM access token preferences are setup.") ); + return FALSE; + } + } +#endif + + // Support .zip + bzip2 files directly + DownloadFileOptions options = { FALSE, FALSE, NULL, 2, NULL, user_pass, a_try_decompress_file }; // Allow a couple of redirects + + gchar *tmpname = a_download_uri_to_tmp_file ( uri, &options ); + g_free ( uri ); + if ( !tmpname ) + return FALSE; + + xml_data *xd = g_malloc ( sizeof (xml_data) ); + //xd->xpath = g_string_new ( "" ); + xd->c_cdata = g_string_new ( "" ); + xd->current_tag = tt_unknown; + xd->current_gpx_meta_data = new_gpx_meta_data_t(); + xd->list_of_gpx_meta_data = NULL; + + result = read_gpx_files_metadata_xml ( tmpname, xd ); + // Test already downloaded metadata file: eg: + //result = read_gpx_files_metadata_xml ( "/tmp/viking-download.GI47PW", xd ); + + if ( tmpname ) { + (void)util_remove ( tmpname ); + g_free ( tmpname ); + } + + if ( ! result ) { + g_free ( xd ); + return FALSE; + } + + if ( g_list_length ( xd->list_of_gpx_meta_data ) == 0 ) { + if (!vik_datasource_osm_my_traces_interface.is_thread) + none_found ( GTK_WINDOW(adw->vw) ); + g_free ( xd ); + return FALSE; + } + + xd->list_of_gpx_meta_data = g_list_reverse ( xd->list_of_gpx_meta_data ); + + set_in_current_view_property ( vtl, adw->user_data, xd->list_of_gpx_meta_data ); + + if (vik_datasource_osm_my_traces_interface.is_thread) gdk_threads_enter(); + GList *selected = select_from_list ( GTK_WINDOW(adw->vw), xd->list_of_gpx_meta_data, "Select GPS Traces", "Select the GPS traces you want to add." ); + if (vik_datasource_osm_my_traces_interface.is_thread) gdk_threads_leave(); + + // If non thread - show program is 'doing something...' + if ( !vik_datasource_osm_my_traces_interface.is_thread ) + vik_window_set_busy_cursor ( adw->vw ); + + // If passed in on an existing layer - we will create everything into that. + // thus with many differing gpx's - this will combine all waypoints into this single layer! + // Hence the preference is to create multiple layers + // and so this creation of the layers must be managed here + + gboolean create_new_layer = ( !vtl ); + + // Only update the screen on the last layer acquired + VikTrwLayer *vtl_last = vtl; + gboolean got_something = FALSE; + + GList *selected_iterator = selected; + while ( selected_iterator ) { + + VikTrwLayer *vtlX = vtl; + + if ( create_new_layer ) { + // Have data but no layer - so create one + vtlX = VIK_TRW_LAYER ( vik_layer_create ( VIK_LAYER_TRW, adw->vvp, FALSE ) ); + if ( ((gpx_meta_data_t*)selected_iterator->data)->name ) + vik_layer_rename ( VIK_LAYER ( vtlX ), ((gpx_meta_data_t*)selected_iterator->data)->name ); + else + vik_layer_rename ( VIK_LAYER ( vtlX ), _("My OSM Traces") ); + } + + result = FALSE; + gint gpx_id = ((gpx_meta_data_t*)selected_iterator->data)->id; + if ( gpx_id ) { + gchar *url = g_strdup_printf ( DS_OSM_TRACES_GPX_URL_FMT, gpx_id ); + + // NB download type is GPX (or a compressed version) + ProcessOptions my_po = *process_options; +#ifdef HAVE_OAUTH_H + my_po.url = osm_oauth_sign_url ( url, NULL ); +#else + my_po.url = url; +#endif + result = a_babel_convert_from ( vtlX, &my_po, status_cb, adw, &options ); + // TODO investigate using a progress bar: + // http://developer.gnome.org/gtk/2.24/GtkProgressBar.html + + got_something = got_something || result; + if ( !result ) { + // Report errors to the status bar + gchar* msg = g_strdup_printf ( _("Unable to get trace: %s"), url ); + vik_window_statusbar_update ( adw->vw, msg, VIK_STATUSBAR_INFO ); + g_free (msg); + } + g_free ( url ); + } + + if ( result ) { + // Can use the layer + vik_aggregate_layer_add_layer ( vik_layers_panel_get_top_layer (adw->vlp), VIK_LAYER(vtlX), TRUE ); + // Move to area of the track + vik_layer_post_read ( VIK_LAYER(vtlX), vik_window_viewport(adw->vw), TRUE ); + vik_trw_layer_auto_set_view ( vtlX, vik_window_viewport(adw->vw) ); + vtl_last = vtlX; + } + else if ( create_new_layer ) { + // Layer not needed as no data has been acquired + g_object_unref ( vtlX ); + } + + selected_iterator = g_list_next ( selected_iterator ); + } + + // Free memory + if ( xd->current_gpx_meta_data ) + free_gpx_meta_data ( xd->current_gpx_meta_data, NULL ); + g_free ( xd->current_gpx_meta_data ); + free_gpx_meta_data_list ( xd->list_of_gpx_meta_data ); + free_gpx_meta_data_list ( selected ); + g_free ( xd ); + g_free ( user_pass ); + + // Would prefer to keep the update in acquire.c, + // however since we may create the layer - need to do the update here + if ( got_something ) + vik_layer_emit_update ( VIK_LAYER(vtl_last) ); + + // ATM The user is only informed if all getting *all* of the traces failed + if ( selected ) + result = got_something; + else + // Process was cancelled but need to return that it proceeded as expected + result = TRUE; + + if ( !vik_datasource_osm_my_traces_interface.is_thread ) + vik_window_clear_busy_cursor ( adw->vw ); + + return result; +} + +static void datasource_osm_my_traces_cleanup ( gpointer data ) +{ + g_free ( data ); +} diff --git a/src/datasource_routing.c b/src/datasource_routing.c new file mode 100644 index 0000000..030c9e3 --- /dev/null +++ b/src/datasource_routing.c @@ -0,0 +1,148 @@ +/* + * viking -- GPS Data and Topo Analyzer, Explorer, and Manager + * + * Copyright (C) 2003-2005, Evan Battaglia + * Copyright (C) 2013, Guilhem Bonnefille + * Copyright (C) 2015, Rob Norris + * + * 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., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA + * + */ +#ifdef HAVE_CONFIG_H +#include "config.h" +#endif + +#include + +#include +#include + +#include "viking.h" +#include "babel.h" +#include "gpx.h" +#include "acquire.h" +#include "vikrouting.h" +#include "ui_util.h" + +typedef struct { + GtkWidget *engines_combo; + GtkWidget *from_entry, *to_entry; +} datasource_routing_widgets_t; + +/* Memory of previous selection */ +static gint last_engine = 0; +static gchar *last_from_str = NULL; +static gchar *last_to_str = NULL; + +static gpointer datasource_routing_init ( acq_vik_t *avt ); +static gchar *datasource_routing_check_existence (); +static void datasource_routing_add_setup_widgets ( GtkWidget *dialog, VikViewport *vvp, gpointer user_data ); +static void datasource_routing_get_process_options ( datasource_routing_widgets_t *widgets, ProcessOptions *po, DownloadFileOptions *options, const gchar *not_used2, const gchar *not_used3 ); +static void datasource_routing_cleanup ( gpointer data ); + +VikDataSourceInterface vik_datasource_routing_interface = { + N_("Directions"), + N_("Directions"), + VIK_DATASOURCE_AUTO_LAYER_MANAGEMENT, + VIK_DATASOURCE_INPUTTYPE_NONE, + TRUE, + TRUE, + TRUE, + (VikDataSourceInitFunc) datasource_routing_init, + (VikDataSourceCheckExistenceFunc) datasource_routing_check_existence, + (VikDataSourceAddSetupWidgetsFunc) datasource_routing_add_setup_widgets, + (VikDataSourceGetProcessOptionsFunc) datasource_routing_get_process_options, + (VikDataSourceProcessFunc) a_babel_convert_from, + (VikDataSourceProgressFunc) NULL, + (VikDataSourceAddProgressWidgetsFunc) NULL, + (VikDataSourceCleanupFunc) datasource_routing_cleanup, + (VikDataSourceOffFunc) NULL, + + NULL, + 0, + NULL, + NULL, + 0 +}; + +static gpointer datasource_routing_init ( acq_vik_t *avt ) +{ + datasource_routing_widgets_t *widgets = g_malloc(sizeof(*widgets)); + return widgets; +} + +static gchar *datasource_routing_check_existence () +{ + if ( vik_routing_number_of_engines (VIK_ROUTING_METHOD_DIRECTIONS) > 0 ) + return NULL; + return g_strdup ( _("No routing engines with directions available") ); +} + +static void datasource_routing_add_setup_widgets ( GtkWidget *dialog, VikViewport *vvp, gpointer user_data ) +{ + datasource_routing_widgets_t *widgets = (datasource_routing_widgets_t *)user_data; + GtkWidget *engine_label, *from_label, *to_label; + + /* Engine selector */ + engine_label = gtk_label_new (_("Engine:")); + widgets->engines_combo = vik_routing_ui_selector_new ((Predicate)vik_routing_engine_supports_direction, NULL); + gtk_combo_box_set_active (GTK_COMBO_BOX (widgets->engines_combo), last_engine); + + /* From and To entries */ + from_label = gtk_label_new (_("From:")); + to_label = gtk_label_new (_("To:")); + widgets->from_entry = ui_entry_new ( last_from_str, GTK_ENTRY_ICON_SECONDARY ); + widgets->to_entry = ui_entry_new ( last_from_str, GTK_ENTRY_ICON_SECONDARY ); + + /* Packing all these widgets */ + GtkBox *box = GTK_BOX(gtk_dialog_get_content_area(GTK_DIALOG(dialog))); + gtk_box_pack_start ( box, engine_label, FALSE, FALSE, 5 ); + gtk_box_pack_start ( box, widgets->engines_combo, FALSE, FALSE, 5 ); + gtk_box_pack_start ( box, from_label, FALSE, FALSE, 5 ); + gtk_box_pack_start ( box, widgets->from_entry, FALSE, FALSE, 5 ); + gtk_box_pack_start ( box, to_label, FALSE, FALSE, 5 ); + gtk_box_pack_start ( box, widgets->to_entry, FALSE, FALSE, 5 ); + gtk_widget_show_all(dialog); +} + +static void datasource_routing_get_process_options ( datasource_routing_widgets_t *widgets, ProcessOptions *po, DownloadFileOptions *options, const gchar *not_used2, const gchar *not_used3 ) +{ + const gchar *from, *to; + + /* Retrieve directions */ + from = gtk_entry_get_text ( GTK_ENTRY(widgets->from_entry) ); + to = gtk_entry_get_text ( GTK_ENTRY(widgets->to_entry) ); + + /* Retrieve engine */ + last_engine = gtk_combo_box_get_active ( GTK_COMBO_BOX(widgets->engines_combo) ); + VikRoutingEngine *engine = vik_routing_ui_selector_get_nth ( widgets->engines_combo, last_engine ); + if ( !engine ) return; + + po->url = vik_routing_engine_get_url_from_directions ( engine, from, to ); + po->input_file_type = g_strdup ( vik_routing_engine_get_format (engine) ); + options = NULL; // i.e. use the default download settings + + /* Save last selection */ + g_free ( last_from_str ); + g_free ( last_to_str ); + + last_from_str = g_strdup( from ); + last_to_str = g_strdup( to ); +} + +static void datasource_routing_cleanup ( gpointer data ) +{ + g_free ( data ); +} diff --git a/src/datasource_url.c b/src/datasource_url.c new file mode 100644 index 0000000..4aa1b97 --- /dev/null +++ b/src/datasource_url.c @@ -0,0 +1,168 @@ +/* -*- Mode: C; indent-tabs-mode: t; c-basic-offset: 4; tab-width: 4 -*- */ +/* + * viking -- GPS Data and Topo Analyzer, Explorer, and Manager + * + * Copyright (C) 2013, Rob Norris + * + * 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., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA + * + */ +#include +#include + +#include "viking.h" +#include "acquire.h" +#include "babel.h" +#include "ui_util.h" + +// Initially was just going to be a URL and always in GPX format +// But might as well specify the file type as per datasource_file.c +// However in this version we'll cope with no GPSBabel available and in this case just try GPX + +typedef struct { + GtkWidget *url; + GtkWidget *type; +} datasource_url_widgets_t; + +/* The last file format selected */ +static int last_type = -1; + +static gpointer datasource_url_init ( acq_vik_t *avt ); +static void datasource_url_add_setup_widgets ( GtkWidget *dialog, VikViewport *vvp, gpointer user_data ); +static void datasource_url_get_process_options ( datasource_url_widgets_t *widgets, ProcessOptions *po, DownloadFileOptions *download_options, const gchar *not_used2, const gchar *not_used3 ); +static void datasource_url_cleanup ( gpointer data ); + +VikDataSourceInterface vik_datasource_url_interface = { + N_("Acquire from URL"), + N_("URL"), + VIK_DATASOURCE_AUTO_LAYER_MANAGEMENT, + VIK_DATASOURCE_INPUTTYPE_NONE, + TRUE, + TRUE, + TRUE, + (VikDataSourceInitFunc) datasource_url_init, + (VikDataSourceCheckExistenceFunc) NULL, + (VikDataSourceAddSetupWidgetsFunc) datasource_url_add_setup_widgets, + (VikDataSourceGetProcessOptionsFunc) datasource_url_get_process_options, + (VikDataSourceProcessFunc) a_babel_convert_from, + (VikDataSourceProgressFunc) NULL, + (VikDataSourceAddProgressWidgetsFunc) NULL, + (VikDataSourceCleanupFunc) datasource_url_cleanup, + (VikDataSourceOffFunc) NULL, + NULL, + 0, + NULL, + NULL, + 0 +}; + +static gpointer datasource_url_init ( acq_vik_t *avt ) +{ + datasource_url_widgets_t *widgets = g_malloc(sizeof(*widgets)); + return widgets; +} + +static void fill_combo_box (gpointer data, gpointer user_data) +{ + const gchar *label = ((BabelFile*) data)->label; + vik_combo_box_text_append (GTK_WIDGET(user_data), label); +} + +static gint find_entry = -1; +static gint wanted_entry = -1; + +static void find_type (gpointer elem, gpointer user_data) +{ + const gchar *name = ((BabelFile*)elem)->name; + const gchar *type_name = user_data; + find_entry++; + if (!g_strcmp0(name, type_name)) { + wanted_entry = find_entry; + } +} + +#define VIK_SETTINGS_URL_FILE_DL_TYPE "url_file_download_type" + +static void datasource_url_add_setup_widgets ( GtkWidget *dialog, VikViewport *vvp, gpointer user_data ) +{ + datasource_url_widgets_t *widgets = (datasource_url_widgets_t *)user_data; + GtkWidget *label = gtk_label_new (_("URL:")); + widgets->url = ui_entry_new ( NULL, GTK_ENTRY_ICON_SECONDARY ); + // 'ok' when press return in the entry + g_signal_connect_swapped ( widgets->url, "activate", G_CALLBACK(a_dialog_response_accept), dialog ); + + GtkWidget *type_label = gtk_label_new (_("File type:")); + + if ( last_type < 0 ) { + find_entry = -1; + wanted_entry = -1; + gchar *type = NULL; + if ( a_settings_get_string ( VIK_SETTINGS_URL_FILE_DL_TYPE, &type ) ) { + // Use setting + if ( type ) + g_list_foreach (a_babel_file_list, find_type, type); + } + else { + // Default to GPX if possible + g_list_foreach (a_babel_file_list, find_type, "gpx"); + } + g_free ( type ); + // If not found set it to the first entry, otherwise use the entry + last_type = ( wanted_entry < 0 ) ? 0 : wanted_entry; + } + + if ( a_babel_available() ) { + widgets->type = vik_combo_box_text_new (); + g_list_foreach (a_babel_file_list, fill_combo_box, widgets->type); + gtk_combo_box_set_active (GTK_COMBO_BOX (widgets->type), last_type); + } + else { + // Only GPX (not using GPSbabel) + widgets->type = gtk_label_new (_("GPX")); + } + + /* Packing all widgets */ + GtkBox *box = GTK_BOX(gtk_dialog_get_content_area(GTK_DIALOG(dialog))); + gtk_box_pack_start ( box, label, FALSE, FALSE, 5 ); + gtk_box_pack_start ( box, widgets->url, FALSE, FALSE, 5 ); + gtk_box_pack_start ( box, type_label, FALSE, FALSE, 5 ); + gtk_box_pack_start ( box, widgets->type, FALSE, FALSE, 5 ); + + gtk_widget_show_all(dialog); +} + +static void datasource_url_get_process_options ( datasource_url_widgets_t *widgets, ProcessOptions *po, DownloadFileOptions *download_options, const gchar *not_used2, const gchar *not_used3 ) +{ + // Retrieve the user entered value + const gchar *value = gtk_entry_get_text ( GTK_ENTRY(widgets->url) ); + + if (GTK_IS_COMBO_BOX (widgets->type) ) + last_type = gtk_combo_box_get_active ( GTK_COMBO_BOX (widgets->type) ); + + po->input_file_type = NULL; // Default to gpx + if ( a_babel_file_list ) + po->input_file_type = g_strdup ( ((BabelFile*)g_list_nth_data (a_babel_file_list, last_type))->name ); + + po->url = g_strdup ( value ); + + // Support .zip + bzip2 files directly + download_options->convert_file = a_try_decompress_file; + download_options->follow_location = 5; +} + +static void datasource_url_cleanup ( gpointer data ) +{ + g_free ( data ); +} diff --git a/src/datasource_wikipedia.c b/src/datasource_wikipedia.c new file mode 100644 index 0000000..2df0907 --- /dev/null +++ b/src/datasource_wikipedia.c @@ -0,0 +1,68 @@ +/* -*- Mode: C; indent-tabs-mode: t; c-basic-offset: 4; tab-width: 4 -*- */ +/* + * viking -- GPS Data and Topo Analyzer, Explorer, and Manager + * + * Copyright (C) 2013-2015, Rob Norris + * + * 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., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA + * + */ +#include +#include + +#include "viking.h" +#include "acquire.h" +#include "geonamessearch.h" + +static gboolean datasource_wikipedia_process ( VikTrwLayer *vtl, ProcessOptions *po, BabelStatusFunc status_cb, acq_dialog_widgets_t *adw ); + +VikDataSourceInterface vik_datasource_wikipedia_interface = { + N_("Create Waypoints from Wikipedia Articles"), + N_("Wikipedia Waypoints"), + VIK_DATASOURCE_AUTO_LAYER_MANAGEMENT, + VIK_DATASOURCE_INPUTTYPE_NONE, + FALSE, + FALSE, // Not even using the dialog + FALSE, // Own method for getting data - does not fit encapsulation with current thread logic + (VikDataSourceInitFunc) NULL, + (VikDataSourceCheckExistenceFunc) NULL, + (VikDataSourceAddSetupWidgetsFunc) NULL, + (VikDataSourceGetProcessOptionsFunc) NULL, + (VikDataSourceProcessFunc) datasource_wikipedia_process, + (VikDataSourceProgressFunc) NULL, + (VikDataSourceAddProgressWidgetsFunc) NULL, + (VikDataSourceCleanupFunc) NULL, + (VikDataSourceOffFunc) NULL, + + NULL, + 0, + NULL, + NULL, + 0 +}; + +/** + * Process to generate waypoints of the current view storing them in the given vtl + */ +static gboolean datasource_wikipedia_process ( VikTrwLayer *vtl, ProcessOptions *po, BabelStatusFunc status_cb, acq_dialog_widgets_t *adw ) +{ + if ( vtl ) { + LatLonBBox bbox = vik_viewport_get_bbox ( adw->vvp ); + a_geonames_wikipedia_box ( adw->vw, vtl, bbox ); + return TRUE; + } + else + return FALSE; +} diff --git a/src/datasources.h b/src/datasources.h new file mode 100644 index 0000000..3883a05 --- /dev/null +++ b/src/datasources.h @@ -0,0 +1,50 @@ +/* + * viking -- GPS Data and Topo Analyzer, Explorer, and Manager + * + * Copyright (C) 2003-2005, Evan Battaglia + * + * 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., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA + * + */ +#ifndef __VIK_DATASOURCES_H +#define __VIK_DATASOURCES_H + +#include "acquire.h" + +G_BEGIN_DECLS + +extern VikDataSourceInterface vik_datasource_gps_interface; +extern VikDataSourceInterface vik_datasource_file_interface; +extern VikDataSourceInterface vik_datasource_routing_interface; +#ifdef VIK_CONFIG_OPENSTREETMAP +extern VikDataSourceInterface vik_datasource_osm_interface; +extern VikDataSourceInterface vik_datasource_osm_my_traces_interface; +#endif +#ifdef VIK_CONFIG_GEOCACHES +void a_datasource_gc_init(); +extern VikDataSourceInterface vik_datasource_gc_interface; +#endif +#ifdef VIK_CONFIG_GEOTAG +extern VikDataSourceInterface vik_datasource_geotag_interface; +#endif +#ifdef VIK_CONFIG_GEONAMES +extern VikDataSourceInterface vik_datasource_wikipedia_interface; +#endif +extern VikDataSourceInterface vik_datasource_url_interface; +extern VikDataSourceInterface vik_datasource_geojson_interface; + +G_END_DECLS + +#endif diff --git a/src/degrees_converters.c b/src/degrees_converters.c new file mode 100644 index 0000000..9e55a39 --- /dev/null +++ b/src/degrees_converters.c @@ -0,0 +1,210 @@ +/* + * viking -- GPS Data and Topo Analyzer, Explorer, and Manager + * + * Copyright (C) 2006-2007, Guilhem Bonnefille + * + * 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., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA + * + */ +#ifdef HAVE_CONFIG_H +#include "config.h" +#endif + +#ifdef HAVE_MATH_H +#include +#endif +#include +#include "degrees_converters.h" + +#define DEGREE_SYMBOL "\302\260" + +/** + * @param pos_c char for positive value + * @param neg_c char for negative value + */ +static gchar *convert_dec_to_ddd(gdouble dec, gchar pos_c, gchar neg_c) +{ + gchar sign_c = ' '; + gdouble val_d; + gchar *result = NULL; + + if ( dec > 0 ) + sign_c = pos_c; + else if ( dec < 0 ) + sign_c = neg_c; + else /* Nul value */ + sign_c = ' '; + + /* Degree */ + val_d = fabs(dec); + + /* Format */ + result = g_strdup_printf ( "%c%f" DEGREE_SYMBOL, sign_c, val_d ); + return result; +} + +gchar *convert_lat_dec_to_ddd(gdouble lat) +{ + return convert_dec_to_ddd(lat, 'N', 'S'); +} + +gchar *convert_lon_dec_to_ddd(gdouble lon) +{ + return convert_dec_to_ddd(lon, 'E', 'W'); +} + +/** + * @param pos_c char for positive value + * @param neg_c char for negative value + */ +static gchar *convert_dec_to_dmm(gdouble dec, gchar pos_c, gchar neg_c) +{ + gdouble tmp; + gchar sign_c = ' '; + gint val_d; + gdouble val_m; + gchar *result = NULL; + + if ( dec > 0 ) + sign_c = pos_c; + else if ( dec < 0 ) + sign_c = neg_c; + else /* Nul value */ + sign_c = ' '; + + /* Degree */ + tmp = fabs(dec); + val_d = (gint)tmp; + + /* Minutes */ + val_m = (tmp - val_d) * 60; + + /* Format */ + result = g_strdup_printf ( "%c%d" DEGREE_SYMBOL "%f'", + sign_c, val_d, val_m ); + return result; +} + +gchar *convert_lat_dec_to_dmm(gdouble lat) +{ + return convert_dec_to_dmm(lat, 'N', 'S'); +} + +gchar *convert_lon_dec_to_dmm(gdouble lon) +{ + return convert_dec_to_dmm(lon, 'E', 'W'); +} + +/** + * @param pos_c char for positive value + * @param neg_c char for negative value + */ +static gchar *convert_dec_to_dms(gdouble dec, gchar pos_c, gchar neg_c) +{ + gdouble tmp; + gchar sign_c = ' '; + gint val_d, val_m; + gdouble val_s; + gchar *result = NULL; + + if ( dec > 0 ) + sign_c = pos_c; + else if ( dec < 0 ) + sign_c = neg_c; + else /* Nul value */ + sign_c = ' '; + + /* Degree */ + tmp = fabs(dec); + val_d = (gint)tmp; + + /* Minutes */ + tmp = (tmp - val_d) * 60; + val_m = (gint)tmp; + + /* Seconds */ + val_s = (tmp - val_m) * 60; + + /* Format */ + result = g_strdup_printf ( "%c%d" DEGREE_SYMBOL "%d'%.4f\"", + sign_c, val_d, val_m, val_s ); + return result; +} + +gchar *convert_lat_dec_to_dms(gdouble lat) +{ + return convert_dec_to_dms(lat, 'N', 'S'); +} + +gchar *convert_lon_dec_to_dms(gdouble lon) +{ + return convert_dec_to_dms(lon, 'E', 'W'); +} + +gdouble convert_dms_to_dec(const gchar *dms) +{ + gdouble d = 0.0; /* Degree */ + gdouble m = 0.0; /* Minutes */ + gdouble s = 0.0; /* Seconds */ + gint neg = FALSE; + gdouble result; + + if (dms != NULL) { + int nbFloat = 0; + const gchar *ptr, *endptr; + + // Compute the sign + // It is negative if: + // - the '-' sign occurs + // - it is a west longitude or south latitude + if (strpbrk (dms, "-wWsS") != NULL) + neg = TRUE; + + // Peek the diffrent components + endptr = dms; + do { + gdouble value; + ptr = strpbrk (endptr, "0123456789,."); + if (ptr != NULL) { + const gchar *tmpptr = endptr; + value = g_strtod((const gchar *)ptr, (gchar **)&endptr); + // Detect when endptr hasn't changed (which may occur if no conversion took place) + // particularly if the last character is a ',' or there are multiple '.'s like '5.5.' + if ( endptr == tmpptr ) + break; + nbFloat++; + switch(nbFloat) { + case 1: + d = value; + break; + case 2: + m = value; + break; + case 3: + s = value; + break; + default: break; + } + } + } while (ptr != NULL && endptr != NULL); + } + + // Compute the result + result = d + m/60 + s/3600; + + if (neg) result = - result; + + return result; +} diff --git a/src/degrees_converters.h b/src/degrees_converters.h new file mode 100644 index 0000000..893b597 --- /dev/null +++ b/src/degrees_converters.h @@ -0,0 +1,42 @@ +/* + * viking -- GPS Data and Topo Analyzer, Explorer, and Manager + * + * Copyright (C) 2006-2007, Guilhem Bonnefille + * + * 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., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA + * + */ + +#ifndef _VIKING_CONVERTER_H +#define _VIKING_CONVERTER_H + +#include + +G_BEGIN_DECLS + +gchar *convert_lat_dec_to_ddd(gdouble lat); +gchar *convert_lon_dec_to_ddd(gdouble lon); + +gchar *convert_lat_dec_to_dmm(gdouble lat); +gchar *convert_lon_dec_to_dmm(gdouble lon); + +gchar *convert_lat_dec_to_dms(gdouble lat); +gchar *convert_lon_dec_to_dms(gdouble lon); + +gdouble convert_dms_to_dec(const gchar *dms); + +G_END_DECLS + +#endif diff --git a/src/dem.c b/src/dem.c new file mode 100644 index 0000000..c7b29a0 --- /dev/null +++ b/src/dem.c @@ -0,0 +1,617 @@ +/* + * viking -- GPS Data and Topo Analyzer, Explorer, and Manager + * + * Copyright (C) 2003-2008, Evan Battaglia + * Copyright (C) 2007, Quy Tonthat + * + * 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., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA + * + */ + +#ifdef HAVE_CONFIG_H +#include "config.h" +#endif + +#include +#ifdef HAVE_STRING_H +#include +#endif +#include +#ifdef HAVE_MATH_H +#include +#endif +#ifdef HAVE_STDLIB_H +#include +#endif +#include +#include +#ifdef HAVE_UNISTD_H +#include +#endif + +#include +#include + +#include "compression.h" +#include "dem.h" +#include "coords.h" +#include "fileutils.h" + +/* Compatibility */ +#if ! GLIB_CHECK_VERSION(2,22,0) +#define g_mapped_file_unref g_mapped_file_free +#endif + +#define DEM_BLOCK_SIZE 1024 +#define GET_COLUMN(dem,n) ((VikDEMColumn *)g_ptr_array_index( (dem)->columns, (n) )) + +static gboolean get_double_and_continue ( gchar **buffer, gdouble *tmp, gboolean warn ) +{ + gchar *endptr; + *tmp = g_strtod(*buffer, &endptr); + if ( endptr == NULL|| endptr == *buffer ) { + if ( warn ) + g_warning(_("Invalid DEM")); + return FALSE; + } + *buffer=endptr; + return TRUE; +} + + +static gboolean get_int_and_continue ( gchar **buffer, gint *tmp, gboolean warn ) +{ + gchar *endptr; + *tmp = strtol(*buffer, &endptr, 10); + if ( endptr == NULL|| endptr == *buffer ) { + if ( warn ) + g_warning(_("Invalid DEM")); + return FALSE; + } + *buffer=endptr; + return TRUE; +} + +static gboolean dem_parse_header ( gchar *buffer, VikDEM *dem ) +{ + gdouble val; + gint int_val; + guint i; + gchar *tmp = buffer; + + /* incomplete header */ + if ( strlen(buffer) != 1024 ) + return FALSE; + + /* fix Fortran-style exponentiation 1.0D5 -> 1.0E5 */ + while (*tmp) { + if ( *tmp=='D') + *tmp='E'; + tmp++; + } + + /* skip name */ + buffer += 149; + + /* "DEM level code, pattern code, palaimetric reference system code" -- skip */ + get_int_and_continue(&buffer, &int_val, TRUE); + get_int_and_continue(&buffer, &int_val, TRUE); + get_int_and_continue(&buffer, &int_val, TRUE); + + /* zone */ + get_int_and_continue(&buffer, &int_val, TRUE); + dem->utm_zone = int_val; + /* TODO -- southern or northern hemisphere?! */ + dem->utm_letter = 'N'; + + /* skip numbers 5-19 */ + for ( i = 0; i < 15; i++ ) { + if ( ! get_double_and_continue(&buffer, &val, FALSE) ) { + g_warning (_("Invalid DEM header")); + return FALSE; + } + } + + /* number 20 -- horizontal unit code (utm/ll) */ + get_double_and_continue(&buffer, &val, TRUE); + dem->horiz_units = val; + get_double_and_continue(&buffer, &val, TRUE); + /* dem->orig_vert_units = val; now done below */ + + /* TODO: do this for real. these are only for 1:24k and 1:250k USGS */ + if ( dem->horiz_units == VIK_DEM_HORIZ_UTM_METERS ) { + dem->east_scale = 10.0; /* meters */ + dem->north_scale = 10.0; + dem->orig_vert_units = VIK_DEM_VERT_DECIMETERS; + } else { + dem->east_scale = 3.0; /* arcseconds */ + dem->north_scale = 3.0; + dem->orig_vert_units = VIK_DEM_VERT_METERS; + } + + /* skip next */ + get_double_and_continue(&buffer, &val, TRUE); + + /* now we get the four corner points. record the min and max. */ + get_double_and_continue(&buffer, &val, TRUE); + dem->min_east = dem->max_east = val; + get_double_and_continue(&buffer, &val, TRUE); + dem->min_north = dem->max_north = val; + + for ( i = 0; i < 3; i++ ) { + get_double_and_continue(&buffer, &val, TRUE); + if ( val < dem->min_east ) dem->min_east = val; + if ( val > dem->max_east ) dem->max_east = val; + get_double_and_continue(&buffer, &val, TRUE); + if ( val < dem->min_north ) dem->min_north = val; + if ( val > dem->max_north ) dem->max_north = val; + } + + return TRUE; +} + +static void dem_parse_block_as_cont ( gchar *buffer, VikDEM *dem, gint *cur_column, gint *cur_row ) +{ + gint tmp; + while ( *cur_row < GET_COLUMN(dem, *cur_column)->n_points ) { + if ( get_int_and_continue(&buffer, &tmp,FALSE) ) { + if ( dem->orig_vert_units == VIK_DEM_VERT_DECIMETERS ) + GET_COLUMN(dem, *cur_column)->points[*cur_row] = (gint16) (tmp / 10); + else + GET_COLUMN(dem, *cur_column)->points[*cur_row] = (gint16) tmp; + } else + return; + (*cur_row)++; + } + *cur_row = -1; /* expecting new column */ +} + +static void dem_parse_block_as_header ( gchar *buffer, VikDEM *dem, gint *cur_column, gint *cur_row ) +{ + guint n_rows; + gint i; + gdouble east_west, south; + gdouble tmp; + + /* 1 x n_rows 1 east_west south x x x DATA */ + + if ( (!get_double_and_continue(&buffer, &tmp, TRUE)) || tmp != 1 ) { + g_warning(_("Incorrect DEM Class B record: expected 1")); + return; + } + + /* don't need this */ + if ( !get_double_and_continue(&buffer, &tmp, TRUE ) ) return; + + /* n_rows */ + if ( !get_double_and_continue(&buffer, &tmp, TRUE ) ) + return; + n_rows = (guint) tmp; + + if ( (!get_double_and_continue(&buffer, &tmp, TRUE)) || tmp != 1 ) { + g_warning(_("Incorrect DEM Class B record: expected 1")); + return; + } + + if ( !get_double_and_continue(&buffer, &east_west, TRUE) ) + return; + if ( !get_double_and_continue(&buffer, &south, TRUE) ) + return; + + /* next three things we don't need */ + if ( !get_double_and_continue(&buffer, &tmp, TRUE)) return; + if ( !get_double_and_continue(&buffer, &tmp, TRUE)) return; + if ( !get_double_and_continue(&buffer, &tmp, TRUE)) return; + + + dem->n_columns ++; + (*cur_column) ++; + + /* empty spaces for things before that were skipped */ + (*cur_row) = (south - dem->min_north) / dem->north_scale; + if ( south > dem->max_north || (*cur_row) < 0 ) + (*cur_row) = 0; + + n_rows += *cur_row; + + g_ptr_array_add ( dem->columns, g_malloc(sizeof(VikDEMColumn)) ); + GET_COLUMN(dem,*cur_column)->east_west = east_west; + GET_COLUMN(dem,*cur_column)->south = south; + GET_COLUMN(dem,*cur_column)->n_points = n_rows; + GET_COLUMN(dem,*cur_column)->points = g_malloc(sizeof(gint16)*n_rows); + + /* no information for things before that */ + for ( i = 0; i < (*cur_row); i++ ) + GET_COLUMN(dem,*cur_column)->points[i] = VIK_DEM_INVALID_ELEVATION; + + /* now just continue */ + dem_parse_block_as_cont ( buffer, dem, cur_column, cur_row ); + + +} + +static void dem_parse_block ( gchar *buffer, VikDEM *dem, gint *cur_column, gint *cur_row ) +{ + /* if haven't read anything or have read all items in a columns and are expecting a new column */ + if ( *cur_column == -1 || *cur_row == -1 ) { + dem_parse_block_as_header(buffer, dem, cur_column, cur_row); + } else { + dem_parse_block_as_cont(buffer, dem, cur_column, cur_row); + } +} + +static VikDEM *vik_dem_read_srtm_hgt(const gchar *file_name, const gchar *basename, gboolean zip) +{ + gint i, j; + VikDEM *dem; + off_t file_size; + gint16 *dem_mem = NULL; + gchar *dem_file = NULL; + const gint num_rows_3sec = 1201; + const gint num_rows_1sec = 3601; + gint num_rows; + GMappedFile *mf; + gint arcsec; + GError *error = NULL; + + dem = g_malloc(sizeof(VikDEM)); + + dem->horiz_units = VIK_DEM_HORIZ_LL_ARCSECONDS; + dem->orig_vert_units = VIK_DEM_VERT_DECIMETERS; + + /* TODO */ + dem->min_north = atoi(basename+1) * 3600; + dem->min_east = atoi(basename+4) * 3600; + if ( basename[0] == 'S' ) + dem->min_north = - dem->min_north; + if ( basename[3] == 'W' ) + dem->min_east = - dem->min_east; + + dem->max_north = 3600 + dem->min_north; + dem->max_east = 3600 + dem->min_east; + + dem->columns = g_ptr_array_new(); + dem->n_columns = 0; + + if ((mf = g_mapped_file_new(file_name, FALSE, &error)) == NULL) { + g_critical(_("Couldn't map file %s: %s"), file_name, error->message); + g_error_free(error); + g_free(dem); + return NULL; + } + file_size = g_mapped_file_get_length(mf); + dem_file = g_mapped_file_get_contents(mf); + + if (zip) { + void *unzip_mem = NULL; + gulong ucsize; + + if ((unzip_mem = unzip_file(dem_file, &ucsize)) == NULL) { + g_mapped_file_unref(mf); + g_ptr_array_foreach ( dem->columns, (GFunc)g_free, NULL ); + g_ptr_array_free(dem->columns, TRUE); + g_free(dem); + return NULL; + } + + dem_mem = unzip_mem; + file_size = ucsize; + } + else + dem_mem = (gint16 *)dem_file; + + if (file_size == (num_rows_3sec * num_rows_3sec * sizeof(gint16))) + arcsec = 3; + else if (file_size == (num_rows_1sec * num_rows_1sec * sizeof(gint16))) + arcsec = 1; + else { + g_warning("%s(): file %s does not have right size", __PRETTY_FUNCTION__, basename); + g_mapped_file_unref(mf); + g_free(dem); + return NULL; + } + + num_rows = (arcsec == 3) ? num_rows_3sec : num_rows_1sec; + dem->east_scale = dem->north_scale = arcsec; + + for ( i = 0; i < num_rows; i++ ) { + dem->n_columns++; + g_ptr_array_add ( dem->columns, g_malloc(sizeof(VikDEMColumn)) ); + GET_COLUMN(dem,i)->east_west = dem->min_east + arcsec*i; + GET_COLUMN(dem,i)->south = dem->min_north; + GET_COLUMN(dem,i)->n_points = num_rows; + GET_COLUMN(dem,i)->points = g_malloc(sizeof(gint16)*num_rows); + } + + int ent = 0; + for ( i = (num_rows - 1); i >= 0; i-- ) { + for ( j = 0; j < num_rows; j++ ) { + GET_COLUMN(dem,j)->points[i] = GINT16_FROM_BE(dem_mem[ent]); + ent++; + } + + } + + if (zip) + g_free(dem_mem); + g_mapped_file_unref(mf); + return dem; +} + +#define IS_SRTM_HGT(fn) (strlen((fn))==11 && (fn)[7]=='.' && (fn)[8]=='h' && (fn)[9]=='g' && (fn)[10]=='t' && ((fn)[0]=='N' || (fn)[0]=='S') && ((fn)[3]=='E' || (fn)[3]=='W')) + +VikDEM *vik_dem_new_from_file(const gchar *file) +{ + FILE *f=NULL; + VikDEM *rv; + gchar buffer[DEM_BLOCK_SIZE+1]; + + /* use to record state for dem_parse_block */ + gint cur_column = -1; + gint cur_row = -1; + const gchar *basename = a_file_basename(file); + + if ( g_access ( file, R_OK ) != 0 ) + return NULL; + + if ( (strlen(basename)==11 || ((strlen(basename) == 15) && (basename[11] == '.' && basename[12] == 'z' && basename[13] == 'i' && basename[14] == 'p'))) && + basename[7]=='.' && basename[8]=='h' && basename[9]=='g' && basename[10]=='t' && + (basename[0] == 'N' || basename[0] == 'S') && (basename[3] == 'E' || basename[3] =='W')) { + gboolean is_zip_file = (strlen(basename) == 15); + rv = vik_dem_read_srtm_hgt(file, basename, is_zip_file); + return(rv); + } + + /* Create Structure */ + rv = g_malloc(sizeof(VikDEM)); + + /* Header */ + f = g_fopen(file, "r"); + if ( !f ) { + g_free ( rv ); + return NULL; + } + buffer[fread(buffer, 1, DEM_BLOCK_SIZE, f)] = '\0'; + if ( ! dem_parse_header ( buffer, rv ) ) { + g_free ( rv ); + fclose(f); + return NULL; + } + /* TODO: actually use header -- i.e. GET # OF COLUMNS EXPECTED */ + + rv->columns = g_ptr_array_new(); + rv->n_columns = 0; + + /* Column -- Data */ + while (! feof(f) ) { + gchar *tmp; + + /* read block */ + buffer[fread(buffer, 1, DEM_BLOCK_SIZE, f)] = '\0'; + + /* Fix Fortran-style exponentiation */ + tmp = buffer; + while (*tmp) { + if ( *tmp=='D') + *tmp='E'; + tmp++; + } + + dem_parse_block(buffer, rv, &cur_column, &cur_row); + } + + /* TODO - class C records (right now says 'Invalid' and dies) */ + + fclose(f); + f = NULL; + + /* 24k scale */ + if ( rv->horiz_units == VIK_DEM_HORIZ_UTM_METERS && rv->n_columns >= 2 ) + rv->north_scale = rv->east_scale = GET_COLUMN(rv, 1)->east_west - GET_COLUMN(rv,0)->east_west; + + /* FIXME bug in 10m DEM's */ + if ( rv->horiz_units == VIK_DEM_HORIZ_UTM_METERS && rv->north_scale == 10 ) { + rv->min_east -= 100; + rv->min_north += 200; + } + + + return rv; +} + +void vik_dem_free ( VikDEM *dem ) +{ + guint i; + for ( i = 0; i < dem->n_columns; i++) + g_free ( GET_COLUMN(dem, i)->points ); + g_ptr_array_foreach ( dem->columns, (GFunc)g_free, NULL ); + g_ptr_array_free ( dem->columns, TRUE ); + g_free ( dem ); +} + +gint16 vik_dem_get_xy ( VikDEM *dem, guint col, guint row ) +{ + if ( col < dem->n_columns ) + if ( row < GET_COLUMN(dem, col)->n_points ) + return GET_COLUMN(dem, col)->points[row]; + return VIK_DEM_INVALID_ELEVATION; +} + +gint16 vik_dem_get_east_north ( VikDEM *dem, gdouble east, gdouble north ) +{ + gint col, row; + + if ( east > dem->max_east || east < dem->min_east || + north > dem->max_north || north < dem->min_north ) + return VIK_DEM_INVALID_ELEVATION; + + col = (gint) floor((east - dem->min_east) / dem->east_scale); + row = (gint) floor((north - dem->min_north) / dem->north_scale); + + return vik_dem_get_xy ( dem, col, row ); +} + +static gboolean dem_get_ref_points_elev_dist(VikDEM *dem, + gdouble east, gdouble north, /* in seconds */ + gint16 *elevs, gint16 *dists) +{ + int i; + int cols[4], rows[4]; + struct LatLon ll[4]; + struct LatLon pos; + + if ( east > dem->max_east || east < dem->min_east || + north > dem->max_north || north < dem->min_north ) + return FALSE; /* got nothing */ + + pos.lon = east/3600; + pos.lat = north/3600; + + /* order of the data: sw, nw, ne, se */ + /* sw */ + cols[0] = (gint) floor((east - dem->min_east) / dem->east_scale); + rows[0] = (gint) floor((north - dem->min_north) / dem->north_scale); + ll[0].lon = (dem->min_east + dem->east_scale*cols[0])/3600; + ll[0].lat = (dem->min_north + dem->north_scale*rows[0])/3600; + /* nw */ + cols[1] = cols[0]; + rows[1] = rows[0] + 1; + ll[1].lon = ll[0].lon; + ll[1].lat = ll[0].lat + (gdouble)dem->north_scale/3600; + /* ne */ + cols[2] = cols[0] + 1; + rows[2] = rows[0] + 1; + ll[2].lon = ll[0].lon + (gdouble)dem->east_scale/3600; + ll[2].lat = ll[0].lat + (gdouble)dem->north_scale/3600; + /* se */ + cols[3] = cols[0] + 1; + rows[3] = rows[0]; + ll[3].lon = ll[0].lon + (gdouble)dem->east_scale/3600; + ll[3].lat = ll[0].lat; + + for (i = 0; i < 4; i++) { + if ((elevs[i] = vik_dem_get_xy(dem, cols[i], rows[i])) == VIK_DEM_INVALID_ELEVATION) + return FALSE; + dists[i] = a_coords_latlon_diff(&pos, &ll[i]); + } + +#if 0 /* debug */ + for (i = 0; i < 4; i++) + fprintf(stderr, "%f:%f:%d:%d ", ll[i].lat, ll[i].lon, dists[i], elevs[i]); + fprintf(stderr, " north_scale=%f\n", dem->north_scale); +#endif + + return TRUE; /* all OK */ +} + +gint16 vik_dem_get_simple_interpol ( VikDEM *dem, gdouble east, gdouble north ) +{ + int i; + gint16 elevs[4], dists[4]; + + if (!dem_get_ref_points_elev_dist(dem, east, north, elevs, dists)) + return VIK_DEM_INVALID_ELEVATION; + + for (i = 0; i < 4; i++) { + if (dists[i] < 1) { + return(elevs[i]); + } + } + + gdouble t = (gdouble)elevs[0]/dists[0] + (gdouble)elevs[1]/dists[1] + (gdouble)elevs[2]/dists[2] + (gdouble)elevs[3]/dists[3]; + gdouble b = 1.0/dists[0] + 1.0/dists[1] + 1.0/dists[2] + 1.0/dists[3]; + + return(t/b); +} + +gint16 vik_dem_get_shepard_interpol ( VikDEM *dem, gdouble east, gdouble north ) +{ + int i; + gint16 elevs[4], dists[4]; + gint16 max_dist; + gdouble t = 0.0; + gdouble b = 0.0; + + if (!dem_get_ref_points_elev_dist(dem, east, north, elevs, dists)) + return VIK_DEM_INVALID_ELEVATION; + + max_dist = 0; + for (i = 0; i < 4; i++) { + if (dists[i] < 1) { + return(elevs[i]); + } + if (dists[i] > max_dist) + max_dist = dists[i]; + } + + gdouble tmp; +#if 0 /* derived method by Franke & Nielson. Does not seem to work too well here */ + for (i = 0; i < 4; i++) { + tmp = pow((1.0*(max_dist - dists[i])/max_dist*dists[i]), 2); + t += tmp*elevs[i]; + b += tmp; + } +#endif + + for (i = 0; i < 4; i++) { + tmp = pow((1.0/dists[i]), 2); + t += tmp*elevs[i]; + b += tmp; + } + + // fprintf(stderr, "DEBUG: tmp=%f t=%f b=%f %f\n", tmp, t, b, t/b); + + return(t/b); + +} + +void vik_dem_east_north_to_xy ( VikDEM *dem, gdouble east, gdouble north, guint *col, guint *row ) +{ + *col = (guint) floor((east - dem->min_east) / dem->east_scale); + *row = (guint) floor((north - dem->min_north) / dem->north_scale); +} + +/** + * + */ +LatLonBBox vik_dem_get_bbox ( const VikDEM *dem ) +{ + LatLonBBox bbox = {0.0, 0.0, 0.0, 0.0}; + + if ( dem->horiz_units == VIK_DEM_HORIZ_LL_ARCSECONDS ) { + bbox.north = dem->max_north / 3600.0; + bbox.east = dem->max_east / 3600.0; + bbox.south = dem->min_north / 3600.0; + bbox.west = dem->min_east / 3600.0; + } else if ( dem->horiz_units == VIK_DEM_HORIZ_UTM_METERS ) { + struct UTM dem_northeast_utm, dem_southwest_utm; + dem_northeast_utm.northing = dem->max_north; + dem_northeast_utm.easting = dem->max_east; + dem_southwest_utm.northing = dem->min_north; + dem_southwest_utm.easting = dem->min_east; + dem_northeast_utm.zone = dem_southwest_utm.zone = dem->utm_zone; + dem_northeast_utm.letter = dem_southwest_utm.letter = dem->utm_letter; + + struct LatLon dem_northeast, dem_southwest; + a_coords_utm_to_latlon(&dem_northeast_utm, &dem_northeast); + a_coords_utm_to_latlon(&dem_southwest_utm, &dem_southwest); + + bbox.north = dem_northeast.lat; + bbox.east = dem_northeast.lon; + bbox.south = dem_southwest.lat; + bbox.west = dem_southwest.lon; + } + return bbox; +} diff --git a/src/dem.h b/src/dem.h new file mode 100644 index 0000000..5937821 --- /dev/null +++ b/src/dem.h @@ -0,0 +1,84 @@ +/* + * viking -- GPS Data and Topo Analyzer, Explorer, and Manager + * + * Copyright (C) 2003-2008, Evan Battaglia + * + * 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., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA + * + */ + +#ifndef __VIKING_DEM_H +#define __VIKING_DEM_H + +#include +#include "bbox.h" + +G_BEGIN_DECLS + +#define VIK_DEM_INVALID_ELEVATION -32768 + +/* unit codes */ +#define VIK_DEM_HORIZ_UTM_METERS 2 +#define VIK_DEM_HORIZ_LL_ARCSECONDS 3 + +#define VIK_DEM_VERT_DECIMETERS 2 + +#define VIK_DEM_VERT_METERS 1 /* wrong in 250k? */ + + +typedef struct { + guint n_columns; + GPtrArray *columns; + + guint8 horiz_units; + guint8 orig_vert_units; /* original, always converted to meters when loading. */ + gdouble east_scale; /* gap between samples */ + gdouble north_scale; + + gdouble min_east, min_north, max_east, max_north; + + guint8 utm_zone; + gchar utm_letter; +} VikDEM; + +typedef struct { + /* east-west coordinate for ALL items in the column */ + gdouble east_west; + + /* coordinate of northern and southern boundaries */ + gdouble south; +// gdouble north; + + guint n_points; + gint16 *points; +} VikDEMColumn; + + +VikDEM *vik_dem_new_from_file(const gchar *file); +void vik_dem_free ( VikDEM *dem ); +gint16 vik_dem_get_xy ( VikDEM *dem, guint x, guint y ); + +gint16 vik_dem_get_east_north ( VikDEM *dem, gdouble east, gdouble north ); +gint16 vik_dem_get_simple_interpol ( VikDEM *dem, gdouble east, gdouble north ); +gint16 vik_dem_get_shepard_interpol ( VikDEM *dem, gdouble east, gdouble north ); +gint16 vik_dem_get_best_interpol ( VikDEM *dem, gdouble east, gdouble north ); + +void vik_dem_east_north_to_xy ( VikDEM *dem, gdouble east, gdouble north, guint *col, guint *row ); + +LatLonBBox vik_dem_get_bbox ( const VikDEM *dem ); + +G_END_DECLS + +#endif diff --git a/src/dems.c b/src/dems.c new file mode 100644 index 0000000..afae58e --- /dev/null +++ b/src/dems.c @@ -0,0 +1,281 @@ +/* + * viking -- GPS Data and Topo Analyzer, Explorer, and Manager + * + * Copyright (C) 2003-2008, Evan Battaglia + * Copyright (C) 2007, Quy Tonthat + * + * 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., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA + * + */ +#include + +#include "dems.h" +#include "background.h" + +typedef struct { + VikDEM *dem; + guint ref_count; +} LoadedDEM; + +GHashTable *loaded_dems = NULL; +/* filename -> DEM */ + +static void loaded_dem_free ( LoadedDEM *ldem ) +{ + vik_dem_free ( ldem->dem ); + g_free ( ldem ); +} + +void a_dems_uninit () +{ + if ( loaded_dems ) + g_hash_table_destroy ( loaded_dems ); +} + +/* To load a dem. if it was already loaded, will simply + * reference the one already loaded and return it. + */ +VikDEM *a_dems_load(const gchar *filename) +{ + LoadedDEM *ldem; + + /* dems init hash table */ + if ( ! loaded_dems ) + loaded_dems = g_hash_table_new_full ( g_str_hash, g_str_equal, g_free, (GDestroyNotify) loaded_dem_free ); + + ldem = (LoadedDEM *) g_hash_table_lookup ( loaded_dems, filename ); + if ( ldem ) { + ldem->ref_count++; + return ldem->dem; + } else { + VikDEM *dem = vik_dem_new_from_file ( filename ); + if ( ! dem ) + return NULL; + ldem = g_malloc ( sizeof(LoadedDEM) ); + ldem->ref_count = 1; + ldem->dem = dem; + g_hash_table_insert ( loaded_dems, g_strdup(filename), ldem ); + return dem; + } +} + +void a_dems_unref(const gchar *filename) +{ + LoadedDEM *ldem = (LoadedDEM *) g_hash_table_lookup ( loaded_dems, filename ); + if ( !ldem ) { + /* This is fine - probably means the loaded list was aborted / not completed for some reason */ + return; + } + ldem->ref_count--; + if ( ldem->ref_count == 0 ) + g_hash_table_remove ( loaded_dems, filename ); +} + +/* to get a DEM that was already loaded. + * assumes that its in there already, + * although it could not be if earlier load failed. + */ +VikDEM *a_dems_get(const gchar *filename) +{ + LoadedDEM *ldem = g_hash_table_lookup ( loaded_dems, filename ); + if ( ldem ) + return ldem->dem; + return NULL; +} + + +/* Load a string list (GList of strings) of dems. You have to use get to at them later. + * When updating a list as a parameter, this should be bfore freeing the list so + * the same DEMs won't be loaded & unloaded. + * Modifies the list to remove DEMs which did not load. + */ + +/* TODO: don't delete them when they don't exist. + * we need to warn the user, but we should keep them in the GList. + * we need to know that they weren't referenced though when we + * do the a_dems_list_free(). + */ +int a_dems_load_list ( GList **dems, gpointer threaddata ) +{ + GList *iter = *dems; + guint dem_count = 0; + const guint dem_total = g_list_length ( *dems ); + while ( iter ) { + if ( ! a_dems_load((const gchar *) (iter->data)) ) { + GList *iter_temp = iter->next; + g_free ( iter->data ); + (*dems) = g_list_remove_link ( (*dems), iter ); + iter = iter_temp; + } else { + iter = iter->next; + } + /* When running a thread - inform of progress */ + if ( threaddata ) { + dem_count++; + /* NB Progress also detects abort request via the returned value */ + int result = a_background_thread_progress ( threaddata, ((gdouble)dem_count) / dem_total ); + if ( result != 0 ) + return -1; /* Abort thread */ + } + } + return 0; +} + +/* Takes a string list (GList of strings) of dems (filenames). + * Unrefs all the dems (i.e. "unloads" them), then frees the + * strings, the frees the list. + */ +void a_dems_list_free ( GList *dems ) +{ + GList *iter = dems; + while ( iter ) { + a_dems_unref ((const gchar *)iter->data); + g_free ( iter->data ); + iter = iter->next; + } + g_list_free ( dems ); +} + +GList *a_dems_list_copy ( GList *dems ) +{ + GList *rv = g_list_copy ( dems ); + GList *iter = rv; + while ( iter ) { + if ( ! a_dems_load((const gchar *) (iter->data)) ) { + GList *iter_temp = iter->next; /* delete link, don't bother strdup'ing and free'ing string */ + rv = g_list_remove_link ( rv, iter ); + iter = iter_temp; + } else { + iter->data = g_strdup((gchar *)iter->data); /* copy the string too. */ + iter = iter->next; + } + } + return rv; +} + +gint16 a_dems_list_get_elev_by_coord ( GList *dems, const VikCoord *coord ) +{ + static struct UTM utm_tmp; + static struct LatLon ll_tmp; + GList *iter = dems; + VikDEM *dem; + gint elev; + + while ( iter ) { + dem = a_dems_get ( (gchar *) iter->data ); + if ( dem ) { + if ( dem->horiz_units == VIK_DEM_HORIZ_LL_ARCSECONDS ) { + vik_coord_to_latlon ( coord, &ll_tmp ); + ll_tmp.lat *= 3600; + ll_tmp.lon *= 3600; + elev = vik_dem_get_east_north(dem, ll_tmp.lon, ll_tmp.lat); + if ( elev != VIK_DEM_INVALID_ELEVATION ) + return elev; + } else if ( dem->horiz_units == VIK_DEM_HORIZ_UTM_METERS ) { + vik_coord_to_utm ( coord, &utm_tmp ); + if ( utm_tmp.zone == dem->utm_zone && + (elev = vik_dem_get_east_north(dem, utm_tmp.easting, utm_tmp.northing)) != VIK_DEM_INVALID_ELEVATION ) + return elev; + } + } + iter = iter->next; + } + return VIK_DEM_INVALID_ELEVATION; +} + +typedef struct { + const VikCoord *coord; + VikDemInterpol method; + gint elev; +} CoordElev; + +static gboolean get_elev_by_coord(gpointer key, LoadedDEM *ldem, CoordElev *ce) +{ + VikDEM *dem = ldem->dem; + gdouble lat, lon; + + if ( dem->horiz_units == VIK_DEM_HORIZ_LL_ARCSECONDS ) { + struct LatLon ll_tmp; + vik_coord_to_latlon (ce->coord, &ll_tmp ); + lat = ll_tmp.lat * 3600; + lon = ll_tmp.lon * 3600; + } else if (dem->horiz_units == VIK_DEM_HORIZ_UTM_METERS) { + static struct UTM utm_tmp; + if (utm_tmp.zone != dem->utm_zone) + return FALSE; + vik_coord_to_utm (ce->coord, &utm_tmp); + lat = utm_tmp.northing; + lon = utm_tmp.easting; + } else + return FALSE; + + switch (ce->method) { + case VIK_DEM_INTERPOL_NONE: + ce->elev = vik_dem_get_east_north(dem, lon, lat); + break; + case VIK_DEM_INTERPOL_SIMPLE: + ce->elev = vik_dem_get_simple_interpol(dem, lon, lat); + break; + case VIK_DEM_INTERPOL_BEST: + ce->elev = vik_dem_get_shepard_interpol(dem, lon, lat); + break; + default: break; + } + return (ce->elev != VIK_DEM_INVALID_ELEVATION); +} + +/* TODO: keep a (sorted) linked list of DEMs and select the best resolution one */ +gint16 a_dems_get_elev_by_coord ( const VikCoord *coord, VikDemInterpol method ) +{ + CoordElev ce; + + if (!loaded_dems) + return VIK_DEM_INVALID_ELEVATION; + + ce.coord = coord; + ce.method = method; + ce.elev = VIK_DEM_INVALID_ELEVATION; + + if(!g_hash_table_find(loaded_dems, (GHRFunc)get_elev_by_coord, &ce)) + return VIK_DEM_INVALID_ELEVATION; + return ce.elev; +} + +/** + * a_dems_overlaps_bbox + * + * Potentially could return first DEM that overlaps the bbox + * but as yet that doesn't seem too useful + */ +gboolean a_dems_overlaps_bbox ( LatLonBBox bbox ) +{ + if (!loaded_dems) + return FALSE; + + gboolean ans = FALSE; + LatLonBBox dem_bbox; + + gpointer key, value; + GHashTableIter ght_iter; + g_hash_table_iter_init ( &ght_iter, loaded_dems ); + while ( g_hash_table_iter_next (&ght_iter, &key, &value) ) { + dem_bbox = vik_dem_get_bbox ( ((LoadedDEM*)value)->dem ); + if ( BBOX_INTERSECT(dem_bbox, bbox) ) { + ans = TRUE; + break; + } + } + return ans; +} diff --git a/src/dems.h b/src/dems.h new file mode 100644 index 0000000..f164ffc --- /dev/null +++ b/src/dems.h @@ -0,0 +1,52 @@ +/* + * viking -- GPS Data and Topo Analyzer, Explorer, and Manager + * + * Copyright (C) 2003-2008, Evan Battaglia + * + * 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., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA + * + */ +#ifndef __VIKING_DEMS_H +#define __VIKING_DEMS_H + +#include "dem.h" +#include "vikcoord.h" +#include "bbox.h" + +G_BEGIN_DECLS + +typedef enum { + VIK_DEM_INTERPOL_NONE = 0, + VIK_DEM_INTERPOL_SIMPLE, + VIK_DEM_INTERPOL_BEST, +} VikDemInterpol; + +void a_dems_uninit (); +VikDEM *a_dems_load(const gchar *filename); +void a_dems_unref(const gchar *filename); +VikDEM *a_dems_get(const gchar *filename); +int a_dems_load_list ( GList **dems, gpointer threaddata ); +void a_dems_list_free ( GList *dems ); +GList *a_dems_list_copy ( GList *dems ); +gint16 a_dems_list_get_elev_by_coord ( GList *dems, const VikCoord *coord ); +gint16 a_dems_get_elev_by_coord ( const VikCoord *coord, VikDemInterpol method); + +gboolean a_dems_overlaps_bbox ( LatLonBBox bbox ); + +G_END_DECLS + +#endif + + diff --git a/src/dialog.c b/src/dialog.c new file mode 100644 index 0000000..049b537 --- /dev/null +++ b/src/dialog.c @@ -0,0 +1,783 @@ +/* + * viking -- GPS Data and Topo Analyzer, Explorer, and Manager + * + * Copyright (C) 2003-2005, Evan Battaglia + * Copyright (C) 2008, Hein Ragas + * Copyright (C) 2010-2016, Rob Norris + * + * 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., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA + * + */ + +#ifdef HAVE_CONFIG_H +#include "config.h" +#endif + +#include "viking.h" +#include "degrees_converters.h" +#include "authors.h" +#include "documenters.h" +#include "ui_util.h" + +#include + +#include +#include +#include + +void a_dialog_msg ( GtkWindow *parent, gint type, const gchar *info, const gchar *extra ) +{ + GtkWidget *msgbox = gtk_message_dialog_new ( parent, GTK_DIALOG_DESTROY_WITH_PARENT, type, GTK_BUTTONS_OK, info, extra ); + gtk_dialog_run ( GTK_DIALOG(msgbox) ); + gtk_widget_destroy ( msgbox ); +} + +/** + * a_dialog_goto_latlon: + * + * @parent: Parent window + * @ll: The returned #LatLon location + * @old: Initialize the dialog with this #LatLon location + * + * A simple dialog to get a lat/lon location + * + * Returns: FALSE if the dialog was cancelled + */ +gboolean a_dialog_goto_latlon ( GtkWindow *parent, struct LatLon *ll, const struct LatLon *old ) +{ + GtkWidget *dialog = gtk_dialog_new_with_buttons (_("Go to Lat/Lon"), + parent, + GTK_DIALOG_MODAL | GTK_DIALOG_DESTROY_WITH_PARENT, + GTK_STOCK_CANCEL, + GTK_RESPONSE_REJECT, + GTK_STOCK_OK, + GTK_RESPONSE_ACCEPT, + NULL); + + GtkWidget *latlabel = gtk_label_new (_("Latitude:")); + GtkWidget *lat = ui_spin_button_new ( (GtkAdjustment*)gtk_adjustment_new(old->lat,-90,90.0,0.05,0.1,0), 0.1, 6 ); + + GtkWidget *lonlabel = gtk_label_new (_("Longitude:")); + GtkWidget *lon = ui_spin_button_new ( (GtkAdjustment*)gtk_adjustment_new(old->lon,-180.0,180.0,0.05,0.1,0), 0.1, 6 ); + + gtk_box_pack_start (GTK_BOX(gtk_dialog_get_content_area(GTK_DIALOG(dialog))), latlabel, FALSE, FALSE, 0); + gtk_box_pack_start (GTK_BOX(gtk_dialog_get_content_area(GTK_DIALOG(dialog))), lat, FALSE, FALSE, 0); + gtk_box_pack_start (GTK_BOX(gtk_dialog_get_content_area(GTK_DIALOG(dialog))), lonlabel, FALSE, FALSE, 0); + gtk_box_pack_start (GTK_BOX(gtk_dialog_get_content_area(GTK_DIALOG(dialog))), lon, FALSE, FALSE, 0); + + // 'ok' when press return on an entry + g_signal_connect_swapped (lat, "activate", G_CALLBACK(a_dialog_response_accept), dialog); + g_signal_connect_swapped (lon, "activate", G_CALLBACK(a_dialog_response_accept), dialog); + + gtk_dialog_set_default_response ( GTK_DIALOG(dialog), GTK_RESPONSE_ACCEPT ); + + gtk_widget_show_all ( dialog ); + + if ( gtk_dialog_run ( GTK_DIALOG(dialog) ) == GTK_RESPONSE_ACCEPT ) + { + ll->lat = convert_dms_to_dec ( gtk_entry_get_text ( GTK_ENTRY(lat) ) ); + ll->lon = convert_dms_to_dec ( gtk_entry_get_text ( GTK_ENTRY(lon) ) ); + gtk_widget_destroy ( dialog ); + return TRUE; + } + + gtk_widget_destroy ( dialog ); + return FALSE; +} + +gboolean a_dialog_goto_utm ( GtkWindow *parent, struct UTM *utm, const struct UTM *old ) +{ + GtkWidget *dialog = gtk_dialog_new_with_buttons (_("Go to UTM"), + parent, + GTK_DIALOG_MODAL | GTK_DIALOG_DESTROY_WITH_PARENT, + GTK_STOCK_CANCEL, + GTK_RESPONSE_REJECT, + GTK_STOCK_OK, + GTK_RESPONSE_ACCEPT, + NULL); + GtkWidget *norlabel, *easlabel, *nor, *eas; + GtkWidget *zonehbox, *zonespin, *letterentry; + gchar tmp_letter[2]; + + norlabel = gtk_label_new (_("Northing:")); + nor = ui_spin_button_new ( (GtkAdjustment*)gtk_adjustment_new(old->northing,0,9999999,1,250,0), 1, 0 ); + + easlabel = gtk_label_new (_("Easting:")); + eas = ui_spin_button_new ( (GtkAdjustment*)gtk_adjustment_new(old->easting,0,9999999,1,250,0), 1, 0 ); + + zonehbox = gtk_hbox_new ( FALSE, 0 ); + gtk_box_pack_start ( GTK_BOX(zonehbox), gtk_label_new ( _("Zone:") ), FALSE, FALSE, 5 ); + zonespin = gtk_spin_button_new ( (GtkAdjustment *) gtk_adjustment_new ( old->zone, 1, 60, 1, 5, 0 ), 1, 0 ); + gtk_box_pack_start ( GTK_BOX(zonehbox), zonespin, TRUE, TRUE, 5 ); + gtk_box_pack_start ( GTK_BOX(zonehbox), gtk_label_new ( _("Letter:") ), FALSE, FALSE, 5 ); + letterentry = gtk_entry_new (); + gtk_entry_set_max_length ( GTK_ENTRY(letterentry), 1 ); + gtk_entry_set_width_chars ( GTK_ENTRY(letterentry), 2 ); + tmp_letter[0] = old->letter; + tmp_letter[1] = '\0'; + gtk_entry_set_text ( GTK_ENTRY(letterentry), tmp_letter ); + gtk_box_pack_start ( GTK_BOX(zonehbox), letterentry, FALSE, FALSE, 5 ); + + gtk_box_pack_start (GTK_BOX(gtk_dialog_get_content_area(GTK_DIALOG(dialog))), norlabel, FALSE, FALSE, 0); + gtk_box_pack_start (GTK_BOX(gtk_dialog_get_content_area(GTK_DIALOG(dialog))), nor, FALSE, FALSE, 0); + gtk_box_pack_start (GTK_BOX(gtk_dialog_get_content_area(GTK_DIALOG(dialog))), easlabel, FALSE, FALSE, 0); + gtk_box_pack_start (GTK_BOX(gtk_dialog_get_content_area(GTK_DIALOG(dialog))), eas, FALSE, FALSE, 0); + gtk_box_pack_start (GTK_BOX(gtk_dialog_get_content_area(GTK_DIALOG(dialog))), zonehbox, FALSE, FALSE, 2); + + gtk_dialog_set_default_response ( GTK_DIALOG(dialog), GTK_RESPONSE_ACCEPT ); + + gtk_widget_show_all ( dialog ); + + if ( gtk_dialog_run ( GTK_DIALOG(dialog) ) == GTK_RESPONSE_ACCEPT ) + { + const gchar *letter; + utm->northing = atof ( gtk_entry_get_text ( GTK_ENTRY(nor) ) ); + utm->easting = atof ( gtk_entry_get_text ( GTK_ENTRY(eas) ) ); + utm->zone = gtk_spin_button_get_value_as_int ( GTK_SPIN_BUTTON(zonespin) ); + letter = gtk_entry_get_text ( GTK_ENTRY(letterentry) ); + if (*letter) + utm->letter = toupper(*letter); + gtk_widget_destroy ( dialog ); + return TRUE; + } + + gtk_widget_destroy ( dialog ); + return FALSE; +} + +void a_dialog_response_accept ( GtkDialog *dialog ) +{ + gtk_dialog_response ( dialog, GTK_RESPONSE_ACCEPT ); +} + +static void get_selected_foreach_func(GtkTreeModel *model, + GtkTreePath *path, + GtkTreeIter *iter, + gpointer data) +{ + GList **list = data; + gchar *name; + gtk_tree_model_get (model, iter, 0, &name, -1); + *list = g_list_prepend(*list, name); +} + +GList *a_dialog_select_from_list ( GtkWindow *parent, GList *names, gboolean multiple_selection_allowed, const gchar *title, const gchar *msg ) +{ + GtkTreeIter iter; + GtkCellRenderer *renderer; + GtkWidget *view; + + GtkWidget *dialog = gtk_dialog_new_with_buttons (title, + parent, + GTK_DIALOG_MODAL | GTK_DIALOG_DESTROY_WITH_PARENT, + GTK_STOCK_CANCEL, + GTK_RESPONSE_REJECT, + GTK_STOCK_OK, + GTK_RESPONSE_ACCEPT, + NULL); + /* When something is selected then OK */ + gtk_dialog_set_default_response ( GTK_DIALOG(dialog), GTK_RESPONSE_ACCEPT ); + GtkWidget *response_w = NULL; +#if GTK_CHECK_VERSION (2, 20, 0) + /* Default to not apply - as initially nothing is selected! */ + response_w = gtk_dialog_get_widget_for_response ( GTK_DIALOG(dialog), GTK_RESPONSE_REJECT ); +#endif + GtkListStore *store = gtk_list_store_new(1, G_TYPE_STRING); + + GtkWidget *scrolledwindow; + + GList *runner = names; + while (runner) + { + gtk_list_store_append(store, &iter); + gtk_list_store_set(store, &iter, 0, runner->data, -1); + runner = g_list_next(runner); + } + + view = gtk_tree_view_new(); + renderer = gtk_cell_renderer_text_new(); + // Use the column header to display the message text, + // this makes the overall widget allocation simple as treeview takes up all the space + GtkTreeViewColumn *column; + column = gtk_tree_view_column_new_with_attributes (msg, renderer, "text", 0, NULL ); + gtk_tree_view_column_set_sort_column_id (column, 0); + gtk_tree_view_append_column (GTK_TREE_VIEW (view), column); + + gtk_tree_view_set_model(GTK_TREE_VIEW(view), GTK_TREE_MODEL(store)); + gtk_tree_selection_set_mode( gtk_tree_view_get_selection(GTK_TREE_VIEW(view)), + multiple_selection_allowed ? GTK_SELECTION_MULTIPLE : GTK_SELECTION_BROWSE ); + g_object_unref(store); + + scrolledwindow = gtk_scrolled_window_new ( NULL, NULL ); + gtk_scrolled_window_set_policy ( GTK_SCROLLED_WINDOW(scrolledwindow), GTK_POLICY_NEVER, GTK_POLICY_AUTOMATIC ); + gtk_container_add ( GTK_CONTAINER(scrolledwindow), view ); + + gtk_box_pack_start ( GTK_BOX(gtk_dialog_get_content_area(GTK_DIALOG(dialog))), scrolledwindow, TRUE, TRUE, 0 ); + // Ensure a reasonable number of items are shown, but let the width be automatically sized + gtk_widget_set_size_request ( dialog, -1, 400) ; + + gtk_widget_show_all ( dialog ); + + if ( response_w ) + gtk_widget_grab_focus ( response_w ); + + while ( gtk_dialog_run (GTK_DIALOG (dialog)) == GTK_RESPONSE_ACCEPT ) + { + GList *names_selected = NULL; + GtkTreeSelection *selection = gtk_tree_view_get_selection(GTK_TREE_VIEW(view)); + gtk_tree_selection_selected_foreach(selection, get_selected_foreach_func, &names_selected); + if (names_selected) + { + gtk_widget_destroy ( dialog ); + return names_selected; + } + a_dialog_error_msg(parent, _("Nothing was selected")); + } + gtk_widget_destroy ( dialog ); + return NULL; +} + +gchar *a_dialog_new_track ( GtkWindow *parent, gchar *default_name, gboolean is_route ) +{ + GtkWidget *dialog = gtk_dialog_new_with_buttons ( is_route ? _("Add Route") : _("Add Track"), + parent, + GTK_DIALOG_MODAL | GTK_DIALOG_DESTROY_WITH_PARENT, + GTK_STOCK_CANCEL, + GTK_RESPONSE_REJECT, + GTK_STOCK_OK, + GTK_RESPONSE_ACCEPT, + NULL); + GtkWidget *label = gtk_label_new ( is_route ? _("Route Name:") : _("Track Name:") ); + GtkWidget *entry = gtk_entry_new (); + + if (default_name) + gtk_entry_set_text ( GTK_ENTRY(entry), default_name ); + + gtk_box_pack_start (GTK_BOX(gtk_dialog_get_content_area(GTK_DIALOG(dialog))), label, FALSE, FALSE, 0); + gtk_box_pack_start (GTK_BOX(gtk_dialog_get_content_area(GTK_DIALOG(dialog))), entry, FALSE, FALSE, 0); + + g_signal_connect_swapped ( entry, "activate", G_CALLBACK(a_dialog_response_accept), GTK_DIALOG(dialog) ); + + gtk_widget_show ( label ); + gtk_widget_show ( entry ); + + gtk_dialog_set_default_response ( GTK_DIALOG(dialog), GTK_RESPONSE_ACCEPT ); + + while ( gtk_dialog_run (GTK_DIALOG (dialog)) == GTK_RESPONSE_ACCEPT ) + { + const gchar *constname = gtk_entry_get_text ( GTK_ENTRY(entry) ); + if ( *constname == '\0' ) + a_dialog_info_msg ( parent, _("Please enter a name for the track.") ); + else { + gchar *name = g_strdup ( constname ); + gtk_widget_destroy ( dialog ); + return name; + } + } + gtk_widget_destroy ( dialog ); + return NULL; +} + +/** + * a_dialog_get_date: + * + * Returns: a date as a string - always in ISO8601 format (YYYY-MM-DD) + * This string can be NULL (especially when the dialog is cancelled) + * Free the string after use + */ +gchar *a_dialog_get_date ( GtkWindow *parent, const gchar *title ) +{ + GtkWidget *dialog = gtk_dialog_new_with_buttons ( title, + parent, + GTK_DIALOG_MODAL | GTK_DIALOG_DESTROY_WITH_PARENT, + GTK_STOCK_CANCEL, + GTK_RESPONSE_REJECT, + GTK_STOCK_OK, + GTK_RESPONSE_ACCEPT, + NULL); + GtkWidget *cal = gtk_calendar_new (); + GtkWidget *today = gtk_button_new_with_label ( _("Today") ); + + static guint year = 0; + static guint month = 0; + static guint day = 0; + + if ( year != 0 ) { + // restore the last selected date + gtk_calendar_select_month ( GTK_CALENDAR(cal), month, year ); + gtk_calendar_select_day ( GTK_CALENDAR(cal), day ); + } + + gtk_box_pack_start (GTK_BOX(gtk_dialog_get_content_area(GTK_DIALOG(dialog))), today, FALSE, FALSE, 0); + gtk_box_pack_start (GTK_BOX(gtk_dialog_get_content_area(GTK_DIALOG(dialog))), cal, FALSE, FALSE, 0); + + g_signal_connect_swapped ( G_OBJECT(today), "clicked", G_CALLBACK(vu_calendar_set_to_today), cal ); + + gtk_widget_show_all ( dialog ); + + gtk_dialog_set_default_response ( GTK_DIALOG(dialog), GTK_RESPONSE_ACCEPT ); + + gchar *date_str = NULL; + if ( gtk_dialog_run (GTK_DIALOG (dialog)) == GTK_RESPONSE_ACCEPT ) + { + gtk_calendar_get_date ( GTK_CALENDAR(cal), &year, &month, &day ); + date_str = g_strdup_printf ( "%d-%02d-%02d", year, month+1, day ); + } + gtk_widget_destroy ( dialog ); + return date_str; +} + +/* creates a vbox full of labels */ +GtkWidget *a_dialog_create_label_vbox ( gchar **texts, int label_count, gint spacing, gint padding ) +{ + GtkWidget *vbox, *label; + int i; + vbox = gtk_vbox_new( TRUE, spacing ); + + for ( i = 0; i < label_count; i++ ) + { + label = gtk_label_new(NULL); + gtk_label_set_markup ( GTK_LABEL(label), _(texts[i]) ); + if ( strchr(texts[i], ':') ) { + // Align label to the right + gtk_misc_set_alignment ( GTK_MISC(label), 1.0, 0.5 ); + } + gtk_box_pack_start ( GTK_BOX(vbox), label, FALSE, TRUE, padding ); + } + return vbox; +} + +gboolean a_dialog_yes_or_no ( GtkWindow *parent, const gchar *message, const gchar *extra ) +{ + GtkWidget *dia; + dia = gtk_message_dialog_new ( parent, + GTK_DIALOG_DESTROY_WITH_PARENT, + GTK_MESSAGE_QUESTION, + GTK_BUTTONS_YES_NO, + message, extra ); + + if ( gtk_dialog_run ( GTK_DIALOG(dia) ) == GTK_RESPONSE_YES ) + { + gtk_widget_destroy ( dia ); + return TRUE; + } + else + { + gtk_widget_destroy ( dia ); + return FALSE; + } +} + +static void zoom_spin_changed ( GtkSpinButton *spin, GtkWidget *pass_along[3] ) +{ + if ( gtk_toggle_button_get_active ( GTK_TOGGLE_BUTTON(pass_along[2]) ) ) + gtk_spin_button_set_value ( + GTK_SPIN_BUTTON(pass_along[GTK_WIDGET(spin) == pass_along[0] ? 1 : 0]), + gtk_spin_button_get_value ( spin ) ); +} + +gboolean a_dialog_custom_zoom ( GtkWindow *parent, gdouble *xmpp, gdouble *ympp ) +{ + GtkWidget *dialog = gtk_dialog_new_with_buttons (_("Zoom Factors..."), + parent, + GTK_DIALOG_MODAL | GTK_DIALOG_DESTROY_WITH_PARENT, + GTK_STOCK_CANCEL, + GTK_RESPONSE_REJECT, + GTK_STOCK_OK, + GTK_RESPONSE_ACCEPT, + NULL); + GtkWidget *table, *label, *xlabel, *xspin, *ylabel, *yspin, *samecheck; + GtkWidget *pass_along[3]; + + table = gtk_table_new ( 4, 2, FALSE ); + gtk_box_pack_start ( GTK_BOX(gtk_dialog_get_content_area(GTK_DIALOG(dialog))), table, TRUE, TRUE, 0 ); + + label = gtk_label_new ( _("Zoom factor (in meters per pixel):") ); + xlabel = gtk_label_new ( _("X (easting): ")); + ylabel = gtk_label_new ( _("Y (northing): ")); + + pass_along[0] = xspin = gtk_spin_button_new ( (GtkAdjustment *) gtk_adjustment_new ( *xmpp, VIK_VIEWPORT_MIN_ZOOM, VIK_VIEWPORT_MAX_ZOOM, 1, 5, 0 ), 1, 8 ); + pass_along[1] = yspin = gtk_spin_button_new ( (GtkAdjustment *) gtk_adjustment_new ( *ympp, VIK_VIEWPORT_MIN_ZOOM, VIK_VIEWPORT_MAX_ZOOM, 1, 5, 0 ), 1, 8 ); + + pass_along[2] = samecheck = gtk_check_button_new_with_label ( _("X and Y zoom factors must be equal") ); + /* TODO -- same factor */ + /* samecheck = gtk_check_button_new_with_label ( "Same x/y zoom factor" ); */ + + if ( *xmpp == *ympp ) + gtk_toggle_button_set_active ( GTK_TOGGLE_BUTTON(samecheck), TRUE ); + + gtk_table_attach_defaults ( GTK_TABLE(table), label, 0, 2, 0, 1 ); + gtk_table_attach_defaults ( GTK_TABLE(table), xlabel, 0, 1, 1, 2 ); + gtk_table_attach_defaults ( GTK_TABLE(table), xspin, 1, 2, 1, 2 ); + gtk_table_attach_defaults ( GTK_TABLE(table), ylabel, 0, 1, 2, 3 ); + gtk_table_attach_defaults ( GTK_TABLE(table), yspin, 1, 2, 2, 3 ); + gtk_table_attach_defaults ( GTK_TABLE(table), samecheck, 0, 2, 3, 4 ); + + gtk_widget_show_all ( table ); + + g_signal_connect ( G_OBJECT(xspin), "value-changed", G_CALLBACK(zoom_spin_changed), pass_along ); + g_signal_connect ( G_OBJECT(yspin), "value-changed", G_CALLBACK(zoom_spin_changed), pass_along ); + + gtk_dialog_set_default_response ( GTK_DIALOG(dialog), GTK_RESPONSE_ACCEPT ); + + if ( gtk_dialog_run ( GTK_DIALOG(dialog) ) == GTK_RESPONSE_ACCEPT ) + { + *xmpp = gtk_spin_button_get_value ( GTK_SPIN_BUTTON(xspin) ); + *ympp = gtk_spin_button_get_value ( GTK_SPIN_BUTTON(yspin) ); + gtk_widget_destroy ( dialog ); + return TRUE; + } + gtk_widget_destroy ( dialog ); + return FALSE; +} + +static void split_spin_focused ( GtkSpinButton *spin, GtkWidget *pass_along[1] ) +{ + gtk_toggle_button_set_active (GTK_TOGGLE_BUTTON(pass_along[0]), 1); +} + +gboolean a_dialog_time_threshold ( GtkWindow *parent, gchar *title_text, gchar *label_text, guint *thr ) +{ + GtkWidget *dialog = gtk_dialog_new_with_buttons (title_text, + parent, + GTK_DIALOG_MODAL | GTK_DIALOG_DESTROY_WITH_PARENT, + GTK_STOCK_CANCEL, + GTK_RESPONSE_REJECT, + GTK_STOCK_OK, + GTK_RESPONSE_ACCEPT, + NULL); + GtkWidget *table, *t1, *t2, *t3, *t4, *spin, *label; + GtkWidget *pass_along[1]; + + table = gtk_table_new ( 4, 2, FALSE ); + gtk_box_pack_start ( GTK_BOX(gtk_dialog_get_content_area(GTK_DIALOG(dialog))), table, TRUE, TRUE, 0 ); + + label = gtk_label_new (label_text); + + t1 = gtk_radio_button_new_with_label ( NULL, _("1 min") ); + t2 = gtk_radio_button_new_with_label_from_widget ( GTK_RADIO_BUTTON(t1), _("1 hour") ); + t3 = gtk_radio_button_new_with_label_from_widget ( GTK_RADIO_BUTTON(t2), _("1 day") ); + t4 = gtk_radio_button_new_with_label_from_widget ( GTK_RADIO_BUTTON(t3), _("Custom (in minutes):") ); + + pass_along[0] = t4; + + spin = gtk_spin_button_new ( (GtkAdjustment *) gtk_adjustment_new ( *thr, 0, 65536, 1, 5, 0 ), 1, 0 ); + + gtk_table_attach_defaults ( GTK_TABLE(table), label, 0, 2, 0, 1 ); + gtk_table_attach_defaults ( GTK_TABLE(table), t1, 0, 1, 1, 2 ); + gtk_table_attach_defaults ( GTK_TABLE(table), t2, 0, 1, 2, 3 ); + gtk_table_attach_defaults ( GTK_TABLE(table), t3, 0, 1, 3, 4 ); + gtk_table_attach_defaults ( GTK_TABLE(table), t4, 0, 1, 4, 5 ); + gtk_table_attach_defaults ( GTK_TABLE(table), spin, 1, 2, 4, 5 ); + + gtk_widget_show_all ( table ); + + g_signal_connect ( G_OBJECT(spin), "grab-focus", G_CALLBACK(split_spin_focused), pass_along ); + + gtk_dialog_set_default_response ( GTK_DIALOG(dialog), GTK_RESPONSE_ACCEPT ); + + if ( gtk_dialog_run ( GTK_DIALOG(dialog) ) == GTK_RESPONSE_ACCEPT ) + { + if (gtk_toggle_button_get_active(GTK_TOGGLE_BUTTON(t1))) { + *thr = 1; + } else if (gtk_toggle_button_get_active(GTK_TOGGLE_BUTTON(t2))) { + *thr = 60; + } else if (gtk_toggle_button_get_active(GTK_TOGGLE_BUTTON(t3))) { + *thr = 60 * 24; + } else if (gtk_toggle_button_get_active(GTK_TOGGLE_BUTTON(t4))) { + *thr = gtk_spin_button_get_value ( GTK_SPIN_BUTTON(spin) ); + } + gtk_widget_destroy ( dialog ); + return TRUE; + } + gtk_widget_destroy ( dialog ); + return FALSE; +} + +/** + * a_dialog_get_positive_number: + * + * Dialog to return a positive number via a spinbox within the supplied limits + * + * Returns: A value of zero indicates the dialog was cancelled + */ +guint a_dialog_get_positive_number ( GtkWindow *parent, gchar *title_text, gchar *label_text, guint default_num, guint min, guint max, guint step ) +{ + GtkWidget *dialog = gtk_dialog_new_with_buttons (title_text, + parent, + GTK_DIALOG_MODAL | GTK_DIALOG_DESTROY_WITH_PARENT, + GTK_STOCK_CANCEL, + GTK_RESPONSE_REJECT, + GTK_STOCK_OK, + GTK_RESPONSE_ACCEPT, + NULL); + gtk_dialog_set_default_response ( GTK_DIALOG(dialog), GTK_RESPONSE_ACCEPT ); + GtkWidget *response_w = NULL; +#if GTK_CHECK_VERSION (2, 20, 0) + response_w = gtk_dialog_get_widget_for_response ( GTK_DIALOG(dialog), GTK_RESPONSE_ACCEPT ); +#endif + + GtkWidget *table, *spin, *label; + guint result = default_num; + + table = gtk_table_new ( 2, 1, FALSE ); + gtk_box_pack_start ( GTK_BOX(gtk_dialog_get_content_area(GTK_DIALOG(dialog))), table, TRUE, TRUE, 0 ); + + label = gtk_label_new (label_text); + spin = gtk_spin_button_new ( (GtkAdjustment *) gtk_adjustment_new ( default_num, min, max, step, 5, 0 ), 1, 0 ); + + gtk_table_attach_defaults ( GTK_TABLE(table), label, 0, 1, 0, 1 ); + gtk_table_attach_defaults ( GTK_TABLE(table), spin, 0, 1, 1, 2 ); + + if ( response_w ) + gtk_widget_grab_focus ( response_w ); + + gtk_widget_show_all ( table ); + + if ( gtk_dialog_run ( GTK_DIALOG(dialog) ) == GTK_RESPONSE_ACCEPT ) + { + result = gtk_spin_button_get_value ( GTK_SPIN_BUTTON(spin) ); + gtk_widget_destroy ( dialog ); + return result; + } + + // Dialog cancelled + gtk_widget_destroy ( dialog ); + return 0; +} + +#if (GTK_MAJOR_VERSION == 2 && GTK_MINOR_VERSION < 24) +static void about_url_hook (GtkAboutDialog *about, + const gchar *link, + gpointer data) +{ + open_url (GTK_WINDOW(about), link); +} + +static void about_email_hook (GtkAboutDialog *about, + const gchar *email, + gpointer data) +{ + new_email (GTK_WINDOW(about), email); +} +#endif + +/** + * Creates a dialog with list of text + * Mostly useful for longer messages that have several lines of information. + */ +void a_dialog_list ( GtkWindow *parent, const gchar *title, GArray *array, gint padding ) +{ + GtkWidget *dialog = gtk_dialog_new_with_buttons ( title, + parent, + GTK_DIALOG_MODAL | GTK_DIALOG_DESTROY_WITH_PARENT, + GTK_STOCK_CLOSE, + GTK_RESPONSE_CLOSE, + NULL); + + GtkBox *vbox = GTK_BOX(gtk_dialog_get_content_area(GTK_DIALOG(dialog))); + GtkWidget *label; + + for ( int i = 0; i < array->len; i++ ) { + label = ui_label_new_selectable (NULL); + gtk_label_set_markup ( GTK_LABEL(label), g_array_index(array,gchar*,i) ); + gtk_box_pack_start ( GTK_BOX(vbox), label, FALSE, TRUE, padding ); + } + + gtk_widget_show_all ( dialog ); + gtk_dialog_run ( GTK_DIALOG(dialog) ); + gtk_widget_destroy ( dialog ); +} + +void a_dialog_about ( GtkWindow *parent ) +{ + const gchar *version = VIKING_VERSION; + const gchar *website = VIKING_URL; + gchar *copyright = g_strdup_printf(_("2003-2008, Evan Battaglia\n2008-%s, Viking's contributors"), THEYEAR); + const gchar *comments = _("GPS Data and Topo Analyzer, Explorer, and Manager."); + const gchar *license = _("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." + "\n\n" + "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." + "\n\n" + "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., 59 Temple Place, Suite 330, Boston, MA 02111-1307, USA"); + + // Would be nice to use gtk_about_dialog_add_credit_section (), but that requires gtk 3.4 + // For now shove it in the 'artists' section so at least the information is easily visible + // Something more advanced might have proper version information too... + const gchar *libs[] = { + "Compiled in libraries:", + // Default libs + "libglib-2.0", + "libgthread-2.0", + "libgtk+-2.0", + "libgio-2.0", + // Potentially optional libs (but probably couldn't build without them) +#ifdef HAVE_LIBM + "libm", +#endif +#ifdef HAVE_LIBZ + "libz", +#endif +#ifdef HAVE_LIBCURL + "libcurl", +#endif +#ifdef HAVE_EXPAT_H + "libexpat", +#endif + // Actually optional libs +#ifdef HAVE_LIBGPS + "libgps", +#endif +#ifdef HAVE_LIBGEXIV2 + "libgexiv2", +#endif +#ifdef HAVE_LIBEXIF + "libexif", +#endif +#ifdef HAVE_LIBX11 + "libX11", +#endif +#ifdef HAVE_LIBMAGIC + "libmagic", +#endif +#ifdef HAVE_LIBBZ2 + "libbz2", +#endif +#ifdef HAVE_LIBZIP + "libzip", +#endif +#ifdef HAVE_LIBSQLITE3 + "libsqlite3", +#endif +#ifdef HAVE_LIBMAPNIK + "libmapnik", +#endif +#ifdef HAVE_LIBNETTLE + "libnettle", +#endif +#ifdef HAVE_LIBGEOCLUE_2 + "libgeoclue2", +#endif +#ifdef HAVE_LIBOAUTH + "liboauth", +#endif + NULL + }; + // Newer versions of GTK 'just work', calling gtk_show_uri() on the URL or email and opens up the appropriate program + // This is the old method: +#if (GTK_MAJOR_VERSION == 2 && GTK_MINOR_VERSION < 24) + gtk_about_dialog_set_url_hook (about_url_hook, NULL, NULL); + gtk_about_dialog_set_email_hook (about_email_hook, NULL, NULL); +#endif + + gtk_show_about_dialog (parent, + "version", version, + "website", website, + "comments", comments, + "copyright", copyright, + "license", license, + "wrap-license", TRUE, + /* logo automatically retrieved via gtk_window_get_default_icon_list */ + "authors", AUTHORS, + "documenters", DOCUMENTERS, + "translator-credits", _("Translation is coordinated on http://launchpad.net/viking"), + "artists", libs, + NULL); + g_free(copyright); +} + +gboolean a_dialog_map_n_zoom(GtkWindow *parent, gchar *mapnames[], gint default_map, gchar *zoom_list[], gint default_zoom, gint *selected_map, gint *selected_zoom) +{ + gchar **s; + + GtkWidget *dialog = gtk_dialog_new_with_buttons ( _("Download along track"), parent, 0, GTK_STOCK_OK, GTK_RESPONSE_ACCEPT, GTK_STOCK_CANCEL, GTK_RESPONSE_REJECT, NULL ); + gtk_dialog_set_default_response ( GTK_DIALOG(dialog), GTK_RESPONSE_ACCEPT ); + GtkWidget *response_w = NULL; +#if GTK_CHECK_VERSION (2, 20, 0) + response_w = gtk_dialog_get_widget_for_response ( GTK_DIALOG(dialog), GTK_RESPONSE_ACCEPT ); +#endif + + GtkWidget *map_label = gtk_label_new(_("Map type:")); + GtkWidget *map_combo = vik_combo_box_text_new(); + for (s = mapnames; *s; s++) + vik_combo_box_text_append (GTK_COMBO_BOX(map_combo), *s); + gtk_combo_box_set_active (GTK_COMBO_BOX(map_combo), default_map); + + GtkWidget *zoom_label = gtk_label_new(_("Zoom level:")); + GtkWidget *zoom_combo = vik_combo_box_text_new(); + for (s = zoom_list; *s; s++) + vik_combo_box_text_append (GTK_COMBO_BOX(zoom_combo), *s); + gtk_combo_box_set_active (GTK_COMBO_BOX(zoom_combo), default_zoom); + + GtkTable *box = GTK_TABLE(gtk_table_new(2, 2, FALSE)); + gtk_table_attach_defaults(box, map_label, 0, 1, 0, 1); + gtk_table_attach_defaults(box, map_combo, 1, 2, 0, 1); + gtk_table_attach_defaults(box, zoom_label, 0, 1, 1, 2); + gtk_table_attach_defaults(box, zoom_combo, 1, 2, 1, 2); + + gtk_box_pack_start ( GTK_BOX(gtk_dialog_get_content_area(GTK_DIALOG(dialog))), GTK_WIDGET(box), FALSE, FALSE, 5 ); + + if ( response_w ) + gtk_widget_grab_focus ( response_w ); + + gtk_widget_show_all ( dialog ); + if ( gtk_dialog_run ( GTK_DIALOG(dialog) ) != GTK_RESPONSE_ACCEPT ) { + gtk_widget_destroy(dialog); + return FALSE; + } + + *selected_map = gtk_combo_box_get_active(GTK_COMBO_BOX(map_combo)); + *selected_zoom = gtk_combo_box_get_active(GTK_COMBO_BOX(zoom_combo)); + + gtk_widget_destroy(dialog); + return TRUE; +} + +/** + * Display a dialog presenting the license of a map. + * Allow to read the license by launching a web browser. + */ +void a_dialog_license ( GtkWindow *parent, const gchar *map, const gchar *license, const gchar *url) +{ + GtkWidget *dialog = gtk_message_dialog_new (parent, + GTK_DIALOG_DESTROY_WITH_PARENT, + GTK_MESSAGE_INFO, + GTK_BUTTONS_OK, + _("The map data is licensed: %s."), + license); + gtk_message_dialog_format_secondary_markup (GTK_MESSAGE_DIALOG (dialog), + _("The data provided by '%s' are licensed under the following license: %s."), + map, license); +#define RESPONSE_OPEN_LICENSE 600 + if (url != NULL) { + gtk_dialog_add_button (GTK_DIALOG (dialog), _("Open license"), RESPONSE_OPEN_LICENSE); + } + gint response; + do { + response = gtk_dialog_run (GTK_DIALOG (dialog)); + if (response == RESPONSE_OPEN_LICENSE) { + open_url (parent, url); + } + } while (response != GTK_RESPONSE_DELETE_EVENT && response != GTK_RESPONSE_OK); + gtk_widget_destroy (dialog); +} diff --git a/src/dialog.h b/src/dialog.h new file mode 100644 index 0000000..59c4a9c --- /dev/null +++ b/src/dialog.h @@ -0,0 +1,74 @@ +/* + * viking -- GPS Data and Topo Analyzer, Explorer, and Manager + * + * Copyright (C) 2003-2005, Evan Battaglia + * + * 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., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA + * + */ + +#ifndef _VIKING_DIALOG_H +#define _VIKING_DIALOG_H + +#include +#include + +#include "coords.h" + +G_BEGIN_DECLS + +/* most of this file is an architechtural flaw. */ + +#define a_dialog_info_msg(win,info) a_dialog_msg(win,GTK_MESSAGE_INFO,info,NULL) +#define a_dialog_warning_msg(win,info) a_dialog_msg(win,GTK_MESSAGE_WARNING,info,NULL) +#define a_dialog_error_msg(win,info) a_dialog_msg(win,GTK_MESSAGE_ERROR,info,NULL) + +#define a_dialog_info_msg_extra(win,info,extra) a_dialog_msg(win,GTK_MESSAGE_INFO,info,extra) +#define a_dialog_error_msg_extra(win,info,extra) a_dialog_msg(win,GTK_MESSAGE_ERROR,info,extra) + +GtkWidget *a_dialog_create_label_vbox ( gchar **texts, int label_count, gint spacing, gint padding ); + +void a_dialog_msg ( GtkWindow *parent, gint type, const gchar *info, const gchar *extra ); + +void a_dialog_response_accept ( GtkDialog *dialog ); + +void a_dialog_list ( GtkWindow *parent, const gchar *title, GArray *array, gint padding ); + +void a_dialog_about ( GtkWindow *parent ); + +/* okay, everthing below here is an architechtural flaw. */ +gboolean a_dialog_goto_latlon ( GtkWindow *parent, struct LatLon *ll, const struct LatLon *old ); +gboolean a_dialog_goto_utm ( GtkWindow *parent, struct UTM *utm, const struct UTM *old ); + +gchar *a_dialog_new_track ( GtkWindow *parent, gchar *default_name, gboolean is_route ); + +gchar *a_dialog_get_date ( GtkWindow *parent, const gchar *title ); +gboolean a_dialog_yes_or_no ( GtkWindow *parent, const gchar *message, const gchar *extra ); +gboolean a_dialog_custom_zoom ( GtkWindow *parent, gdouble *xmpp, gdouble *ympp ); +gboolean a_dialog_time_threshold ( GtkWindow *parent, gchar *title_text, gchar *label_text, guint *thr ); + +guint a_dialog_get_positive_number ( GtkWindow *parent, gchar *title_text, gchar *label_text, guint default_num, guint min, guint max, guint step ); + +void a_dialog_choose_dir ( GtkWidget *entry ); + +gboolean a_dialog_map_n_zoom(GtkWindow *parent, gchar *mapnames[], gint default_map, gchar *zoom_list[], gint default_zoom, gint *selected_map, gint *selected_zoom); + +GList *a_dialog_select_from_list ( GtkWindow *parent, GList *names, gboolean multiple_selection_allowed, const gchar *title, const gchar *msg ); + +void a_dialog_license ( GtkWindow *parent, const gchar *map, const gchar *license, const gchar *url); + +G_END_DECLS + +#endif diff --git a/src/dir.c b/src/dir.c new file mode 100644 index 0000000..a06a233 --- /dev/null +++ b/src/dir.c @@ -0,0 +1,136 @@ +/* + * viking -- GPS Data and Topo Analyzer, Explorer, and Manager + * + * Copyright (C) 2003-2005, Evan Battaglia + * Copyright (C) 2012, Guilhem Bonnefille + * + * 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., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA + * + */ + +#ifdef HAVE_CONFIG_H +#include "config.h" +#endif + +#include +#ifdef HAVE_UNISTD_H +#include +#endif +#include +#include + +/** + * For external use, free the result + * Made externally available primarily to detect when Viking is first run + */ +gchar *a_get_viking_dir_no_create() +{ + // TODO: use g_get_user_config_dir ? + + const gchar *home = g_getenv("HOME"); + if (!home || g_access(home, W_OK)) + home = g_get_home_dir (); +#ifdef HAVE_MKDTEMP + if (!home || g_access(home, W_OK)) + { + static gchar temp[] = {"/tmp/vikXXXXXX"}; + home = mkdtemp(temp); + } +#endif + if (!home || g_access(home, W_OK)) + /* Fatal error */ + g_critical("Unable to find a base directory"); + + /* Build the name of the directory */ +#ifdef __APPLE__ + return g_build_filename(home, "/Library/Application Support/Viking", NULL); +#else + return g_build_filename(home, ".viking", NULL); +#endif +} + +static gchar *viking_dir = NULL; + +const gchar *a_get_viking_dir() +{ + if (!viking_dir) { + viking_dir = a_get_viking_dir_no_create (); + if (g_file_test(viking_dir, G_FILE_TEST_EXISTS) == FALSE) + if ( g_mkdir(viking_dir, 0755) != 0 ) + g_warning ( "%s: Failed to create directory %s", __FUNCTION__, viking_dir ); + } + return viking_dir; +} + +/** + * a_get_viking_data_home: + * + * Retrieves the XDG compliant user's data directory. + * + * Retuns: the directory (can be NULL). Should be freed with g_free. + */ +gchar * +a_get_viking_data_home() +{ + const gchar *xdg_data_home = g_getenv("XDG_DATA_HOME"); + if (xdg_data_home) + { + return g_build_filename(xdg_data_home, PACKAGE, NULL); + } + else + { + return NULL; + } +} + +/** + * a_get_viking_data_path: + * + * Retrieves the configuration path. + * + * Returns: list of directories to scan for data. Should be freed with g_strfreev. + */ +gchar ** +a_get_viking_data_path() +{ +#ifdef WINDOWS + // Try to use from the install directory - normally the working directory of Viking is where ever it's install location is + const gchar *xdg_data_dirs = "./data"; + //const gchar *xdg_data_dirs = g_strdup ( "%s/%s/data", g_getenv("ProgramFiles"), PACKAGE ); +#else + const gchar *xdg_data_dirs = g_getenv("XDG_DATA_DIRS"); +#endif + if (xdg_data_dirs == NULL) + { + /* Default value specified in + http://standards.freedesktop.org/basedir-spec/basedir-spec-latest.html + */ + xdg_data_dirs = "/usr/local/share/:/usr/share/"; + } + + gchar **data_path = g_strsplit(xdg_data_dirs, G_SEARCHPATH_SEPARATOR_S, 0); + +#ifndef WINDOWS + /* Append the viking dir */ + gchar **path; + for (path = data_path ; *path != NULL ; path++) + { + gchar *dir = *path; + *path = g_build_filename(dir, PACKAGE, NULL); + g_free(dir); + } +#endif + return data_path; +} diff --git a/src/dir.h b/src/dir.h new file mode 100644 index 0000000..77e480d --- /dev/null +++ b/src/dir.h @@ -0,0 +1,37 @@ +/* + * viking -- GPS Data and Topo Analyzer, Explorer, and Manager + * + * Copyright (C) 2003-2005, Evan Battaglia + * Copyright (C) 2012, Guilhem Bonnefille + * + * 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., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA + * + */ + +#ifndef _VIKING_DIR_H +#define _VIKING_DIR_H + +#include + +G_BEGIN_DECLS + +const gchar *a_get_viking_dir(); +gchar *a_get_viking_dir_no_create(); +gchar ** a_get_viking_data_path(); +gchar *a_get_viking_data_home(); + +G_END_DECLS + +#endif diff --git a/src/docbook2documenters.xsl b/src/docbook2documenters.xsl new file mode 100644 index 0000000..ba23b14 --- /dev/null +++ b/src/docbook2documenters.xsl @@ -0,0 +1,41 @@ + + + + + + + +/* Generated file. */ +const gchar *DOCUMENTERS[] = {\ + + + " + + + + ",\ + + + NULL}; + + + + diff --git a/src/documenters.h b/src/documenters.h new file mode 100644 index 0000000..19b0860 --- /dev/null +++ b/src/documenters.h @@ -0,0 +1,10 @@ +/* Generated file. */ +const gchar *DOCUMENTERS[] = {\ +"Guilhem Bonnefille",\ +"Rob Norris",\ +"username: Alexxy",\ +"username: Vikingis",\ +"username: Tallguy",\ +"username: EliotB",\ +"Alex Foobarian",\ +NULL}; diff --git a/src/download.c b/src/download.c new file mode 100644 index 0000000..c3b6068 --- /dev/null +++ b/src/download.c @@ -0,0 +1,508 @@ +/* -*- Mode: C; indent-tabs-mode: t; c-basic-offset: 4; tab-width: 4 -*- */ +/* + * viking -- GPS Data and Topo Analyzer, Explorer, and Manager + * + * Copyright (C) 2003-2005, Evan Battaglia + * Copyright (C) 2007, Guilhem Bonnefille + * Copyright (C) 2013, Rob Norris + * + * 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., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA + * + */ + +#ifdef HAVE_CONFIG_H +#include "config.h" +#endif + +#include +#include +#include +#include +#ifdef HAVE_SYS_TYPES_H +#include +#endif +#ifdef HAVE_UTIME_H +#include +#endif +#include +#include +#include + +#include "file_magic.h" +#include "compression.h" +#include "download.h" + +#include "curl_download.h" +#include "preferences.h" +#include "globals.h" +#include "vik_compat.h" + +static gboolean check_file_first_line(FILE* f, gchar *patterns[]) +{ + gchar **s; + gchar *bp; + fpos_t pos; + gchar buf[33]; + size_t nr; + + memset(buf, 0, sizeof(buf)); + if ( !fgetpos(f, &pos) ) + return FALSE; + rewind(f); + nr = fread(buf, 1, sizeof(buf) - 1, f); + if ( !fgetpos(f, &pos) ) + return FALSE; + for (bp = buf; (bp < (buf + sizeof(buf) - 1)) && (nr > (bp - buf)); bp++) { + if (!(isspace(*bp))) + break; + } + if ((bp >= (buf + sizeof(buf) -1)) || ((bp - buf) >= nr)) + return FALSE; + for (s = patterns; *s; s++) { + if (strncasecmp(*s, bp, strlen(*s)) == 0) + return TRUE; + } + return FALSE; +} + +gboolean a_check_html_file(FILE* f) +{ + gchar * html_str[] = { + "message); + g_error_free(error); + return; + } + gchar *file_contents = g_mapped_file_get_contents ( mf ); + + void *unzip_mem = NULL; + gulong ucsize; + + if ((unzip_mem = unzip_file (file_contents, &ucsize)) == NULL) { + g_mapped_file_unref ( mf ); + return; + } + + // This overwrites any previous file contents + if ( ! g_file_set_contents ( name, unzip_mem, ucsize, &error ) ) { + g_critical ( "Couldn't write file '%s', because of %s", name, error->message ); + g_error_free ( error ); + } +} + +/** + * a_try_decompress_file: + * @name: The potentially compressed filename + * + * Perform magic to decide how which type of decompression to attempt + */ +void a_try_decompress_file (gchar *name) +{ + if ( file_magic_check (name, "application/zip", ".zip") ) { + uncompress_zip ( name ); + } + else if ( file_magic_check (name, "application/x-bzip2", ".bz2") ) { + gchar* bz2_name = uncompress_bzip2 ( name ); + if ( bz2_name ) { + if ( g_remove ( name ) ) + g_critical ("%s: remove file failed [%s]", __FUNCTION__, name ); + if ( g_rename (bz2_name, name) ) + g_critical ("%s: file rename failed [%s] to [%s]", __FUNCTION__, bz2_name, name ); + g_free ( bz2_name ); + } + } +} + +#define VIKING_ETAG_XATTR "xattr::viking.etag" + +static gboolean get_etag_xattr(const char *fn, CurlDownloadOptions *cdo) +{ + gboolean result = FALSE; + GFileInfo *fileinfo; + GFile *file; + + file = g_file_new_for_path(fn); + fileinfo = g_file_query_info(file, VIKING_ETAG_XATTR, G_FILE_QUERY_INFO_NONE, NULL, NULL); + if (fileinfo) { + const char *etag = g_file_info_get_attribute_string(fileinfo, VIKING_ETAG_XATTR); + if (etag) { + cdo->etag = g_strdup(etag); + result = !!cdo->etag; + } + g_object_unref(fileinfo); + } + g_object_unref(file); + + if (result) + g_debug("%s: Get etag (xattr) from %s: %s", __FUNCTION__, fn, cdo->etag); + + return result; +} + +static gboolean get_etag_file(const char *fn, CurlDownloadOptions *cdo) +{ + gboolean result = FALSE; + gchar *etag_filename; + + etag_filename = g_strdup_printf("%s.etag", fn); + if (etag_filename) { + result = g_file_get_contents(etag_filename, &cdo->etag, NULL, NULL); + g_free(etag_filename); + } + + if (result) + g_debug("%s: Get etag (file) from %s: %s", __FUNCTION__, fn, cdo->etag); + + return result; +} + +static void get_etag(const char *fn, CurlDownloadOptions *cdo) +{ + /* first try to get etag from xattr, then fall back to plain file */ + if (!get_etag_xattr(fn, cdo) && !get_etag_file(fn, cdo)) { + g_debug("%s: Failed to get etag from %s", __FUNCTION__, fn); + return; + } + + /* check if etag is short enough */ + if (strlen(cdo->etag) > 100) { + g_free(cdo->etag); + cdo->etag = NULL; + } + + /* TODO: should check that etag is a valid string */ +} + +static gboolean set_etag_xattr(const char *fn, CurlDownloadOptions *cdo) +{ + gboolean result = FALSE; + GFile *file; + + file = g_file_new_for_path(fn); + result = g_file_set_attribute_string(file, VIKING_ETAG_XATTR, cdo->new_etag, G_FILE_QUERY_INFO_NONE, NULL, NULL); + g_object_unref(file); + + if (result) + g_debug("%s: Set etag (xattr) on %s: %s", __FUNCTION__, fn, cdo->new_etag); + + return result; +} + +static gboolean set_etag_file(const char *fn, CurlDownloadOptions *cdo) +{ + gboolean result = FALSE; + gchar *etag_filename; + + etag_filename = g_strdup_printf("%s.etag", fn); + if (etag_filename) { + result = g_file_set_contents(etag_filename, cdo->new_etag, -1, NULL); + g_free(etag_filename); + } + + if (result) + g_debug("%s: Set etag (file) on %s: %s", __FUNCTION__, fn, cdo->new_etag); + + return result; +} + +static void set_etag(const char *fn, const char *fntmp, CurlDownloadOptions *cdo) +{ + /* first try to store etag in extended attribute, then fall back to plain file */ + if (!set_etag_xattr(fntmp, cdo) && !set_etag_file(fn, cdo)) { + g_debug("%s: Failed to set etag on %s", __FUNCTION__, fn); + } +} + +static DownloadResult_t download( const char *hostname, const char *uri, const char *fn, DownloadFileOptions *options, gboolean ftp, void *handle) +{ + FILE *f; + gchar *tmpfilename; + gboolean failure = FALSE; + CurlDownloadOptions cdo = {0, NULL, NULL}; + + /* Check file */ + if ( g_file_test ( fn, G_FILE_TEST_EXISTS ) == TRUE ) + { + if (options == NULL || (!options->check_file_server_time && + !options->use_etag)) { + /* Nothing to do as file already exists and we don't want to check server */ + return DOWNLOAD_NOT_REQUIRED; + } + + time_t tile_age = a_preferences_get(VIKING_PREFERENCES_NAMESPACE "download_tile_age")->u; + /* Get the modified time of this file */ + GStatBuf buf; + (void)g_stat ( fn, &buf ); + time_t file_time = buf.st_mtime; + if ( (time(NULL) - file_time) < tile_age ) { + /* File cache is too recent, so return */ + return DOWNLOAD_NOT_REQUIRED; + } + + if (options != NULL && options->check_file_server_time) { + cdo.time_condition = file_time; + } + if (options != NULL && options->use_etag) { + get_etag(fn, &cdo); + } + + } else { + gchar *dir = g_path_get_dirname ( fn ); + if ( g_mkdir_with_parents ( dir , 0777 ) != 0) + g_warning ("%s: Failed to mkdir %s", __FUNCTION__, dir ); + g_free ( dir ); + } + + // Early test for valid hostname & uri to avoid unnecessary tmp file + if ( !hostname && !uri ) { + g_warning ( "%s: Parameter error - neither hostname nor uri defined", __FUNCTION__ ); + return DOWNLOAD_PARAMETERS_ERROR; + } + + tmpfilename = g_strdup_printf("%s.tmp", fn); + if (!lock_file ( tmpfilename ) ) + { + g_debug("%s: Couldn't take lock on temporary file \"%s\"\n", __FUNCTION__, tmpfilename); + g_free ( tmpfilename ); + if (options->use_etag) + g_free ( cdo.etag ); + return DOWNLOAD_FILE_WRITE_ERROR; + } + f = g_fopen ( tmpfilename, "w+b" ); /* truncate file and open it */ + if ( ! f ) { + g_warning("Couldn't open temporary file \"%s\": %s", tmpfilename, g_strerror(errno)); + g_free ( tmpfilename ); + if (options->use_etag) + g_free ( cdo.etag ); + return DOWNLOAD_FILE_WRITE_ERROR; + } + + /* Call the backend function */ + CURL_download_t ret = curl_download_get_url ( hostname, uri, f, options, ftp, &cdo, handle ); + + DownloadResult_t result = DOWNLOAD_SUCCESS; + + if (ret != CURL_DOWNLOAD_NO_ERROR && ret != CURL_DOWNLOAD_NO_NEWER_FILE) { + g_debug("%s: download failed: curl_download_get_url=%d", __FUNCTION__, ret); + failure = TRUE; + result = DOWNLOAD_HTTP_ERROR; + } + + if (!failure && options != NULL && options->check_file != NULL && ! options->check_file(f)) { + g_debug("%s: file content checking failed", __FUNCTION__); + failure = TRUE; + result = DOWNLOAD_CONTENT_ERROR; + } + + fclose ( f ); + f = NULL; + + if (failure) + { + g_warning(_("Download error: %s"), fn); + if ( g_remove ( tmpfilename ) != 0 ) + g_warning( ("Failed to remove: %s"), tmpfilename); + unlock_file ( tmpfilename ); + g_free ( tmpfilename ); + if ( options != NULL && options->use_etag ) { + g_free ( cdo.etag ); + g_free ( cdo.new_etag ); + } + return result; + } + + if (ret == CURL_DOWNLOAD_NO_NEWER_FILE) { + (void)g_remove ( tmpfilename ); + // update mtime of local copy + // Not security critical, thus potential Time of Check Time of Use race condition is not bad + // coverity[toctou] + if ( g_utime ( fn, NULL ) != 0 ) + g_warning ( "%s couldn't set time on: %s", __FUNCTION__, fn ); + } else { + if ( options != NULL && options->convert_file ) + options->convert_file ( tmpfilename ); + + if ( options != NULL && options->use_etag ) { + if ( cdo.new_etag ) { + /* server returned an etag value */ + set_etag(fn, tmpfilename, &cdo); + } + } + + /* move completely-downloaded file to permanent location */ + if ( g_rename ( tmpfilename, fn ) ) + g_warning ("%s: file rename failed [%s] to [%s]", __FUNCTION__, tmpfilename, fn ); + } + unlock_file ( tmpfilename ); + g_free ( tmpfilename ); + + if ( options != NULL && options->use_etag ) { + g_free ( cdo.etag ); + g_free ( cdo.new_etag ); + } + return DOWNLOAD_SUCCESS; +} + +/** + * uri: like "/uri.html?whatever" + * only reason for the "wrapper" is so we can do redirects. + */ +DownloadResult_t a_http_download_get_url ( const char *hostname, const char *uri, const char *fn, DownloadFileOptions *opt, void *handle ) +{ + return download ( hostname, uri, fn, opt, FALSE, handle ); +} + +DownloadResult_t a_ftp_download_get_url ( const char *hostname, const char *uri, const char *fn, DownloadFileOptions *opt, void *handle ) +{ + return download ( hostname, uri, fn, opt, TRUE, handle ); +} + +void * a_download_handle_init () +{ + return curl_download_handle_init (); +} + +void a_download_handle_cleanup ( void *handle ) +{ + curl_download_handle_cleanup ( handle ); +} + +/** + * a_download_url_to_tmp_file: + * @uri: The URI (Uniform Resource Identifier) + * @options: Download options (maybe NULL) + * + * returns name of the temporary file created - NULL if unsuccessful + * this string needs to be freed once used + * the file needs to be removed once used + */ +gchar *a_download_uri_to_tmp_file ( const gchar *uri, DownloadFileOptions *options ) +{ + FILE *tmp_file; + int tmp_fd; + gchar *tmpname; + + if ( (tmp_fd = g_file_open_tmp ("viking-download.XXXXXX", &tmpname, NULL)) == -1 ) { + g_critical (_("couldn't open temp file")); + return NULL; + } + + tmp_file = fdopen(tmp_fd, "r+"); + if ( !tmp_file ) + return NULL; + + if ( curl_download_uri ( uri, tmp_file, options, NULL, NULL ) ) { + // error + fclose ( tmp_file ); + (void)g_remove ( tmpname ); + g_free ( tmpname ); + return NULL; + } + fclose ( tmp_file ); + + return tmpname; +} diff --git a/src/download.h b/src/download.h new file mode 100644 index 0000000..e2339e2 --- /dev/null +++ b/src/download.h @@ -0,0 +1,103 @@ +/* + * viking -- GPS Data and Topo Analyzer, Explorer, and Manager + * + * Copyright (C) 2003-2005, Evan Battaglia + * Copyright (C) 2007, Guilhem Bonnefille + * + * 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., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA + * + */ + +#ifndef _VIKING_DOWNLOAD_H +#define _VIKING_DOWNLOAD_H + +#include + +G_BEGIN_DECLS + +/* File content check */ +typedef gboolean (*VikFileContentCheckerFunc) (FILE*); +gboolean a_check_map_file(FILE*); +gboolean a_check_html_file(FILE*); +gboolean a_check_kml_file(FILE*); +// Convert +void a_try_decompress_file (gchar *name); +typedef void (*VikFileContentConvertFunc) (gchar*); // filename (temporary) + +typedef struct { + /** + * Check if the server has a more recent file than the one we have before downloading it + * This uses http header If-Modified-Since + */ + gboolean check_file_server_time; + + /** + * Set if the server handle ETag + */ + gboolean use_etag; + + /** + * The REFERER string to use. + * Could be NULL. + */ + gchar *referer; + + /** + * follow_location specifies the number of retries + * to follow a redirect while downloading a page. + */ + glong follow_location; + + /** + * File content checker. + */ + VikFileContentCheckerFunc check_file; + + /** + * If need to authenticate on download + * format: 'username:password' + */ + gchar *user_pass; + + /** + * File manipulation if necessary such as uncompressing the downloaded file. + */ + VikFileContentConvertFunc convert_file; + +} DownloadFileOptions; + +void a_download_init(void); +void a_download_uninit(void); + +typedef enum { + DOWNLOAD_PARAMETERS_ERROR = -8, // Configuration issue + DOWNLOAD_FILE_WRITE_ERROR = -4, // Can't write downloaded file :( + DOWNLOAD_HTTP_ERROR = -2, + DOWNLOAD_CONTENT_ERROR = -1, + DOWNLOAD_SUCCESS = 0, + DOWNLOAD_NOT_REQUIRED = 1, // Also 'successful'. e.g. Because file already exists and no time checks used +} DownloadResult_t; + +/* TODO: convert to Glib */ +DownloadResult_t a_http_download_get_url ( const char *hostname, const char *uri, const char *fn, DownloadFileOptions *opt, void *handle ); +DownloadResult_t a_ftp_download_get_url ( const char *hostname, const char *uri, const char *fn, DownloadFileOptions *opt, void *handle ); +void *a_download_handle_init (); +void a_download_handle_cleanup ( void *handle ); + +gchar *a_download_uri_to_tmp_file ( const gchar *uri, DownloadFileOptions *options ); + +G_END_DECLS + +#endif diff --git a/src/expedia.c b/src/expedia.c new file mode 100644 index 0000000..239ada3 --- /dev/null +++ b/src/expedia.c @@ -0,0 +1,206 @@ +/* + * viking -- GPS Data and Topo Analyzer, Explorer, and Manager + * + * Copyright (C) 2005, Evan Battaglia + * + * Some formulas or perhaps even code derived from GPSDrive + * GPSDrive Copyright (C) 2001-2004 Fritz Ganter + * + * 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., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA + * + */ +#ifdef HAVE_CONFIG_H +#include "config.h" +#endif + +#include +#include +#ifdef HAVE_MATH_H +#include +#endif + +#include "map_ids.h" +#include "globals.h" +#include "coords.h" +#include "vikcoord.h" +#include "mapcoord.h" +#include "download.h" +#include "vikmapslayer.h" + +#include "expedia.h" + +static gboolean expedia_coord_to_mapcoord ( const VikCoord *src, gdouble xzoom, gdouble yzoom, MapCoord *dest ); +static void expedia_mapcoord_to_center_coord ( MapCoord *src, VikCoord *dest ); +static int expedia_download ( MapCoord *src, const gchar *dest_fn, void *handle ); +static void * expedia_handle_init ( ); +static void expedia_handle_cleanup ( void *handle ); + +static DownloadFileOptions expedia_options = { FALSE, FALSE, NULL, 2, a_check_map_file, NULL }; + +void expedia_init() { + VikMapsLayer_MapType map_type = { MAP_ID_EXPEDIA, 0, 0, VIK_VIEWPORT_DRAWMODE_EXPEDIA, expedia_coord_to_mapcoord, expedia_mapcoord_to_center_coord, expedia_download, expedia_handle_init, expedia_handle_cleanup }; + maps_layer_register_type(_("Expedia Street Maps"), MAP_ID_EXPEDIA, &map_type); +} + +#define EXPEDIA_SITE "expedia.com" +#define MPP_MARGIN_OF_ERROR 0.01 +#define DEGREES_TO_RADS 0.0174532925 +#define HEIGHT_OF_LAT_DEGREE (111318.84502/ALTI_TO_MPP) +#define HEIGHT_OF_LAT_MINUTE (1855.3140837/ALTI_TO_MPP) +#define WIDTH_BUFFER 0 +#define HEIGHT_BUFFER 25 +#define REAL_WIDTH_BUFFER 1 +#define REAL_HEIGHT_BUFFER 26 + +/* first buffer is to cut off the expedia/microsoft logo. Annoying little buggers ;) */ +/* second is to allow for a 1-pixel overlap on each side. this is a good thing (tm) */ + +static const guint expedia_altis[] = { 1, 2, 4, 8, 16, 32, 64, 128, 256, 512 }; +/* square this number to find out how many per square degree. */ +static const gdouble expedia_altis_degree_freq[] = { 120, 60, 30, 15, 8, 4, 2, 1, 1, 1 }; +static const guint expedia_altis_count = sizeof(expedia_altis) / sizeof(expedia_altis[0]); + +gdouble expedia_altis_freq ( gint alti ) +{ + static gint i; + for ( i = 0; i < expedia_altis_count; i++ ) + if ( expedia_altis[i] == alti ) + return expedia_altis_degree_freq [ i ]; + + g_error ( _("Invalid expedia altitude") ); + return 0; +} + +/* returns -1 if none of the above. */ +gint expedia_zoom_to_alti ( gdouble zoom ) +{ + guint i; + for ( i = 0; i < expedia_altis_count; i++ ) + if ( fabs(expedia_altis[i] - zoom) / zoom < MPP_MARGIN_OF_ERROR ) + return expedia_altis[i]; + return -1; +} + +/* +gint expedia_pseudo_zone ( gint alti, gint x, gint y ) +{ + return (int) (x/expedia_altis_freq(alti)*180) + (int) (y/expedia_altis_freq(alti)*90); +} +*/ + +void expedia_snip ( const gchar *file ) +{ + /* Load the pixbuf */ + GError *gx = NULL; + GdkPixbuf *old, *cropped; + gint width, height; + + old = gdk_pixbuf_new_from_file ( file, &gx ); + if (gx) + { + g_warning ( _("Couldn't open EXPEDIA image file (right after successful download! Please report and delete image file!): %s"), gx->message ); + g_error_free ( gx ); + return; + } + + width = gdk_pixbuf_get_width ( old ); + height = gdk_pixbuf_get_height ( old ); + + cropped = gdk_pixbuf_new_subpixbuf ( old, WIDTH_BUFFER, HEIGHT_BUFFER, + width - 2*WIDTH_BUFFER, height - 2*HEIGHT_BUFFER ); + + gdk_pixbuf_save ( cropped, file, "png", &gx, NULL ); + if ( gx ) { + g_warning ( _("Couldn't save EXPEDIA image file (right after successful download! Please report and delete image file!): %s"), gx->message ); + g_error_free ( gx ); + } + + g_object_unref ( cropped ); + g_object_unref ( old ); +} + +/* if degree_freeq = 60 -> nearest minute (in middle) */ +/* everything starts at -90,-180 -> 0,0. then increments by (1/degree_freq) */ +static gboolean expedia_coord_to_mapcoord ( const VikCoord *src, gdouble xzoom, gdouble yzoom, MapCoord *dest ) +{ + gint alti; + + g_assert ( src->mode == VIK_COORD_LATLON ); + + if ( xzoom != yzoom ) + return FALSE; + + alti = expedia_zoom_to_alti ( xzoom ); + if ( alti != -1 ) + { + dest->scale = alti; + dest->x = (int) (((src->east_west+180) * expedia_altis_freq(alti))+0.5); + dest->y = (int) (((src->north_south+90) * expedia_altis_freq(alti))+0.5); + /* + 0.5 to round off and not floor */ + + /* just to space out tiles on the filesystem */ + dest->z = 0; + return TRUE; + } + return FALSE; +} + +void expedia_xy_to_latlon_middle ( gint alti, gint x, gint y, struct LatLon *ll ) +{ + ll->lon = (((gdouble)x) / expedia_altis_freq(alti)) - 180; + ll->lat = (((gdouble)y) / expedia_altis_freq(alti)) - 90; +} + +static void expedia_mapcoord_to_center_coord ( MapCoord *src, VikCoord *dest ) +{ + dest->mode = VIK_COORD_LATLON; + dest->east_west = (((gdouble)src->x) / expedia_altis_freq(src->scale)) - 180; + dest->north_south = (((gdouble)src->y) / expedia_altis_freq(src->scale)) - 90; +} + +static DownloadResult_t expedia_download ( MapCoord *src, const gchar *dest_fn, void *handle ) +{ + gint height, width; + struct LatLon ll; + gchar *uri; + + expedia_xy_to_latlon_middle ( src->scale, src->x, src->y, &ll ); + + height = HEIGHT_OF_LAT_DEGREE / expedia_altis_freq(src->scale) / (src->scale); + width = height * cos ( ll.lat * DEGREES_TO_RADS ); + + height += 2*REAL_HEIGHT_BUFFER; + width += 2*REAL_WIDTH_BUFFER; + + uri = g_strdup_printf ( "/pub/agent.dll?qscr=mrdt&ID=3XNsF.&CenP=%lf,%lf&Lang=%s&Alti=%d&Size=%d,%d&Offs=0.000000,0.000000&BCheck&tpid=1", + ll.lat, ll.lon, (ll.lon > -30) ? "EUR0809" : "USA0409", src->scale, width, height ); + + DownloadResult_t res = a_http_download_get_url ( EXPEDIA_SITE, uri, dest_fn, &expedia_options, NULL ); + if (res == DOWNLOAD_SUCCESS) + expedia_snip ( dest_fn ); + g_free(uri); + return(res); +} + +static void * expedia_handle_init ( ) +{ + // Not much going on here + return 0; +} + +static void expedia_handle_cleanup ( void *handle ) +{ + // Even less here! +} diff --git a/src/expedia.h b/src/expedia.h new file mode 100644 index 0000000..fc17611 --- /dev/null +++ b/src/expedia.h @@ -0,0 +1,36 @@ +/* + * viking -- GPS Data and Topo Analyzer, Explorer, and Manager + * + * Copyright (C) 2003-2005, Evan Battaglia + * + * 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., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA + * + */ + +#ifndef __VIKING_EXPEDIA_H +#define __VIKING_EXPEDIA_H + +#include + +#include "vikcoord.h" +#include "mapcoord.h" + +G_BEGIN_DECLS + +void expedia_init(); + +G_END_DECLS + +#endif diff --git a/src/file.c b/src/file.c new file mode 100644 index 0000000..0524c61 --- /dev/null +++ b/src/file.c @@ -0,0 +1,920 @@ +/* + * viking -- GPS Data and Topo Analyzer, Explorer, and Manager + * + * Copyright (C) 2003-2005, Evan Battaglia + * Copyright (C) 2012, Guilhem Bonnefille + * Copyright (C) 2012-2013, Rob Norris + * + * 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., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA + * + */ + +#ifdef HAVE_CONFIG_H +#include "config.h" +#endif +#include "viking.h" + +#include "jpg.h" +#include "gpx.h" +#include "geojson.h" +#include "babel.h" +#include "gpsmapper.h" + +#include +#include +#include +#ifdef HAVE_UNISTD_H +#include +#endif +#include +#include +#include + +#include "file.h" +#include "misc/strtod.h" + +#define TEST_BOOLEAN(str) (! ((str)[0] == '\0' || (str)[0] == '0' || (str)[0] == 'n' || (str)[0] == 'N' || (str)[0] == 'f' || (str)[0] == 'F') ) +#define VIK_MAGIC "#VIK" +#define GPX_MAGIC "under; + g_free ( *stack ); + *stack = tmp; +} + +static void push(Stack **stack) +{ + Stack *tmp = g_malloc ( sizeof ( Stack ) ); + tmp->under = *stack; + *stack = tmp; +} + +static gboolean check_magic ( FILE *f, const gchar *magic_number, guint magic_length ) +{ + gchar magic[magic_length]; + gboolean rv = FALSE; + gint8 i; + if ( fread(magic, 1, sizeof(magic), f) == sizeof(magic) && + strncmp(magic, magic_number, sizeof(magic)) == 0 ) + rv = TRUE; + for ( i = sizeof(magic)-1; i >= 0; i-- ) /* the ol' pushback */ + ungetc(magic[i],f); + return rv; +} + + +static gboolean str_starts_with ( const gchar *haystack, const gchar *needle, guint16 len_needle, gboolean must_be_longer ) +{ + if ( strlen(haystack) > len_needle - (!must_be_longer) && strncasecmp ( haystack, needle, len_needle ) == 0 ) + return TRUE; + return FALSE; +} + +void file_write_layer_param ( FILE *f, const gchar *name, VikLayerParamType type, VikLayerParamData data ) { + /* string lists are handled differently. We get a GList (that shouldn't + * be freed) back for get_param and if it is null we shouldn't write + * anything at all (otherwise we'd read in a list with an empty string, + * not an empty string list. + */ + if ( type == VIK_LAYER_PARAM_STRING_LIST ) { + if ( data.sl ) { + GList *iter = (GList *)data.sl; + while ( iter ) { + fprintf ( f, "%s=", name ); + fprintf ( f, "%s\n", (gchar *)(iter->data) ); + iter = iter->next; + } + } + } else { + fprintf ( f, "%s=", name ); + switch ( type ) + { + case VIK_LAYER_PARAM_DOUBLE: { + // char buf[15]; /* locale independent */ + // fprintf ( f, "%s\n", (char *) g_dtostr (data.d, buf, sizeof (buf)) ); break; + fprintf ( f, "%f\n", data.d ); + break; + } + case VIK_LAYER_PARAM_UINT: fprintf ( f, "%d\n", data.u ); break; + case VIK_LAYER_PARAM_INT: fprintf ( f, "%d\n", data.i ); break; + case VIK_LAYER_PARAM_BOOLEAN: fprintf ( f, "%c\n", data.b ? 't' : 'f' ); break; + case VIK_LAYER_PARAM_STRING: fprintf ( f, "%s\n", data.s ? data.s : "" ); break; + case VIK_LAYER_PARAM_COLOR: fprintf ( f, "#%.2x%.2x%.2x\n", (int)(data.c.red/256),(int)(data.c.green/256),(int)(data.c.blue/256)); break; + default: break; + } + } +} + +static void write_layer_params_and_data ( VikLayer *l, FILE *f, const gchar *dirpath ) +{ + VikLayerParam *params = vik_layer_get_interface(l->type)->params; + VikLayerFuncGetParam get_param = vik_layer_get_interface(l->type)->get_param; + + fprintf ( f, "name=%s\n", l->name ? l->name : "" ); + if ( !l->visible ) + fprintf ( f, "visible=f\n" ); + + if ( params && get_param ) + { + VikLayerParamData data; + guint16 i, params_count = vik_layer_get_interface(l->type)->params_count; + for ( i = 0; i < params_count; i++ ) + { + data = get_param(l, i, TRUE); + file_write_layer_param(f, params[i].name, params[i].type, data); + } + } + if ( vik_layer_get_interface(l->type)->write_file_data ) + { + fprintf ( f, "\n\n~LayerData\n" ); + vik_layer_get_interface(l->type)->write_file_data ( l, f, dirpath ); + fprintf ( f, "~EndLayerData\n" ); + } + /* foreach param: + write param, and get_value, etc. + then run layer data, and that's it. + */ +} + +static void file_write ( VikAggregateLayer *top, FILE *f, gpointer vp, const gchar *dirpath ) +{ + Stack *stack = NULL; + VikLayer *current_layer; + struct LatLon ll; + VikViewportDrawMode mode; + gchar *modestring = NULL; + + push(&stack); + stack->data = (gpointer) vik_aggregate_layer_get_children(VIK_AGGREGATE_LAYER(top)); + stack->under = NULL; + + /* crazhy CRAZHY */ + vik_coord_to_latlon ( vik_viewport_get_center ( VIK_VIEWPORT(vp) ), &ll ); + + mode = vik_viewport_get_drawmode ( VIK_VIEWPORT(vp) ); + switch ( mode ) { + case VIK_VIEWPORT_DRAWMODE_UTM: modestring = "utm"; break; + case VIK_VIEWPORT_DRAWMODE_EXPEDIA: modestring = "expedia"; break; + case VIK_VIEWPORT_DRAWMODE_MERCATOR: modestring = "mercator"; break; + case VIK_VIEWPORT_DRAWMODE_LATLON: modestring = "latlon"; break; + default: + g_critical("Houston, we've had a problem. mode=%d", mode); + } + + fprintf ( f, "#VIKING GPS Data file " VIKING_URL "\n" ); + fprintf ( f, "FILE_VERSION=%d\n", VIKING_FILE_VERSION ); + fprintf ( f, "\nxmpp=%f\nympp=%f\nlat=%f\nlon=%f\nmode=%s\ncolor=%s\nhighlightcolor=%s\ndrawscale=%s\ndrawcentermark=%s\ndrawhighlight=%s\n", + vik_viewport_get_xmpp ( VIK_VIEWPORT(vp) ), vik_viewport_get_ympp ( VIK_VIEWPORT(vp) ), ll.lat, ll.lon, + modestring, vik_viewport_get_background_color(VIK_VIEWPORT(vp)), + vik_viewport_get_highlight_color(VIK_VIEWPORT(vp)), + vik_viewport_get_draw_scale(VIK_VIEWPORT(vp)) ? "t" : "f", + vik_viewport_get_draw_centermark(VIK_VIEWPORT(vp)) ? "t" : "f", + vik_viewport_get_draw_highlight(VIK_VIEWPORT(vp)) ? "t" : "f" ); + + if ( ! VIK_LAYER(top)->visible ) + fprintf ( f, "visible=f\n" ); + + while (stack && stack->data) + { + current_layer = VIK_LAYER(((GList *)stack->data)->data); + fprintf ( f, "\n~Layer %s\n", vik_layer_get_interface(current_layer->type)->fixed_layer_name ); + write_layer_params_and_data ( current_layer, f, dirpath ); + if ( current_layer->type == VIK_LAYER_AGGREGATE && !vik_aggregate_layer_is_empty(VIK_AGGREGATE_LAYER(current_layer)) ) + { + push(&stack); + stack->data = (gpointer) vik_aggregate_layer_get_children(VIK_AGGREGATE_LAYER(current_layer)); + } + else if ( current_layer->type == VIK_LAYER_GPS && !vik_gps_layer_is_empty(VIK_GPS_LAYER(current_layer)) ) + { + push(&stack); + stack->data = (gpointer) vik_gps_layer_get_children(VIK_GPS_LAYER(current_layer)); + } + else + { + stack->data = (gpointer) ((GList *)stack->data)->next; + fprintf ( f, "~EndLayer\n\n" ); + while ( stack && (!stack->data) ) + { + pop(&stack); + if ( stack ) + { + stack->data = (gpointer) ((GList *)stack->data)->next; + fprintf ( f, "~EndLayer\n\n" ); + } + } + } + } +/* + get vikaggregatelayer's children (?) + foreach write ALL params, + then layer data (IF function exists) + then endlayer + + impl: + stack of layers (LIST) we are working on + when layer->next == NULL ... + we move on. +*/ +} + +static void string_list_delete ( gpointer key, gpointer l, gpointer user_data ) +{ + /* 20071021 bugfix */ + GList *iter = (GList *) l; + while ( iter ) { + g_free ( iter->data ); + iter = iter->next; + } + g_list_free ( (GList *) l ); +} + +static void string_list_set_param (gint i, GList *list, gpointer *layer_and_vp) +{ + VikLayerSetParam vlsp; + vlsp.id = i; + vlsp.data.sl = list; + vlsp.vp = layer_and_vp[1]; + vlsp.is_file_operation = TRUE; + vlsp.dirpath = (const gchar*)layer_and_vp[2]; + + vik_layer_set_param ( VIK_LAYER(layer_and_vp[0]), &vlsp ); +} + +/** + * Read in a Viking file and return how successful the parsing was + * ATM this will always work, in that even if there are parsing problems + * then there will be no new values to override the defaults + * + * TODO flow up line number(s) / error messages of problems encountered... + * + */ +static gboolean file_read ( VikAggregateLayer *top, FILE *f, const gchar *dirpath, VikViewport *vp ) +{ + Stack *stack = NULL; + struct LatLon ll = { 0.0, 0.0 }; + gchar buffer[4096]; + gchar *line; + guint16 len; + long line_num = 0; + + VikLayerParam *params = NULL; /* for current layer, so we don't have to keep on looking up interface */ + guint8 params_count = 0; + + GHashTable *string_lists = g_hash_table_new(g_direct_hash,g_direct_equal); + + gboolean successful_read = TRUE; + + push(&stack); + stack->under = NULL; + stack->data = (gpointer) top; + + while ( fgets ( buffer, 4096, f ) ) + { + line_num++; + + line = buffer; + while ( *line == ' ' || *line =='\t' ) + line++; + + if ( line[0] == '#' ) + continue; + + + len = strlen(line); + if ( len > 0 && line[len-1] == '\n' ) + line[--len] = '\0'; + if ( len > 0 && line[len-1] == '\r' ) + line[--len] = '\0'; + + if ( len == 0 ) + continue; + + + if ( line[0] == '~' ) + { + line++; len--; + if ( *line == '\0' ) + continue; + else if ( str_starts_with ( line, "Layer ", 6, TRUE ) ) + { + if ( ! stack->data ) + continue; + int parent_type = VIK_LAYER(stack->data)->type; + if ( (parent_type != VIK_LAYER_AGGREGATE) && (parent_type != VIK_LAYER_GPS) ) + { + successful_read = FALSE; + g_warning ( "Line %ld: Layer command inside non-Aggregate Layer (type %d)", line_num, parent_type ); + push(&stack); /* inside INVALID layer */ + stack->data = NULL; + continue; + } + else + { + VikLayerTypeEnum type = vik_layer_type_from_string ( line+6 ); + push(&stack); + if ( type == VIK_LAYER_NUM_TYPES ) + { + successful_read = FALSE; + g_warning ( "Line %ld: Unknown type %s", line_num, line+6 ); + stack->data = NULL; + } + else if (parent_type == VIK_LAYER_GPS) + { + stack->data = (gpointer) vik_gps_layer_get_a_child(VIK_GPS_LAYER(stack->under->data)); + params = vik_layer_get_interface(type)->params; + params_count = vik_layer_get_interface(type)->params_count; + } + else + { + stack->data = (gpointer) vik_layer_create ( type, vp, FALSE ); + params = vik_layer_get_interface(type)->params; + params_count = vik_layer_get_interface(type)->params_count; + } + } + } + else if ( str_starts_with ( line, "EndLayer", 8, FALSE ) ) + { + if ( stack->under == NULL ) { + successful_read = FALSE; + g_warning ( "Line %ld: Mismatched ~EndLayer command", line_num ); + } + else + { + /* add any string lists we've accumulated */ + gpointer layer_and_vp[3]; + layer_and_vp[0] = stack->data; + layer_and_vp[1] = vp; + layer_and_vp[2] = (gpointer)dirpath; + g_hash_table_foreach ( string_lists, (GHFunc) string_list_set_param, layer_and_vp ); + g_hash_table_remove_all ( string_lists ); + + if ( stack->data && stack->under->data ) + { + if (VIK_LAYER(stack->under->data)->type == VIK_LAYER_AGGREGATE) { + vik_aggregate_layer_add_layer ( VIK_AGGREGATE_LAYER(stack->under->data), VIK_LAYER(stack->data), FALSE ); + vik_layer_post_read ( VIK_LAYER(stack->data), vp, TRUE ); + } + else if (VIK_LAYER(stack->under->data)->type == VIK_LAYER_GPS) { + /* TODO: anything else needs to be done here ? */ + } + else { + successful_read = FALSE; + g_warning ( "Line %ld: EndLayer command inside non-Aggregate Layer (type %d)", line_num, VIK_LAYER(stack->data)->type ); + } + } + pop(&stack); + } + } + else if ( str_starts_with ( line, "LayerData", 9, FALSE ) ) + { + if ( stack->data && vik_layer_get_interface(VIK_LAYER(stack->data)->type)->read_file_data ) + { + /* must read until hits ~EndLayerData */ + if ( ! vik_layer_get_interface(VIK_LAYER(stack->data)->type)->read_file_data ( VIK_LAYER(stack->data), f, dirpath ) ) + successful_read = FALSE; + } + else + { /* simply skip layer data over */ + while ( fgets ( buffer, 4096, f ) ) + { + line_num++; + + line = buffer; + + len = strlen(line); + if ( len > 0 && line[len-1] == '\n' ) + line[--len] = '\0'; + if ( len > 0 && line[len-1] == '\r' ) + line[--len] = '\0'; + if ( strcasecmp ( line, "~EndLayerData" ) == 0 ) + break; + } + continue; + } + } + else + { + successful_read = FALSE; + g_warning ( "Line %ld: Unknown tilde command", line_num ); + } + } + else + { + gint32 eq_pos = -1; + guint16 i; + if ( ! stack->data ) + continue; + + for ( i = 0; i < len; i++ ) + if ( line[i] == '=' ) + eq_pos = i; + + if ( stack->under == NULL && eq_pos == 12 && strncasecmp ( line, "FILE_VERSION", eq_pos ) == 0) { + gint version = strtol(line+13, NULL, 10); + g_debug ( "%s: reading file version %d", __FUNCTION__, version ); + if ( version > VIKING_FILE_VERSION ) + successful_read = FALSE; + // However we'll still carry and attempt to read whatever we can + } + else if ( stack->under == NULL && eq_pos == 4 && strncasecmp ( line, "xmpp", eq_pos ) == 0) /* "hard coded" params: global & for all layer-types */ + vik_viewport_set_xmpp ( VIK_VIEWPORT(vp), strtod_i8n ( line+5, NULL ) ); + else if ( stack->under == NULL && eq_pos == 4 && strncasecmp ( line, "ympp", eq_pos ) == 0) + vik_viewport_set_ympp ( VIK_VIEWPORT(vp), strtod_i8n ( line+5, NULL ) ); + else if ( stack->under == NULL && eq_pos == 3 && strncasecmp ( line, "lat", eq_pos ) == 0 ) + ll.lat = strtod_i8n ( line+4, NULL ); + else if ( stack->under == NULL && eq_pos == 3 && strncasecmp ( line, "lon", eq_pos ) == 0 ) + ll.lon = strtod_i8n ( line+4, NULL ); + else if ( stack->under == NULL && eq_pos == 4 && strncasecmp ( line, "mode", eq_pos ) == 0 && strcasecmp ( line+5, "utm" ) == 0) + vik_viewport_set_drawmode ( VIK_VIEWPORT(vp), VIK_VIEWPORT_DRAWMODE_UTM); + else if ( stack->under == NULL && eq_pos == 4 && strncasecmp ( line, "mode", eq_pos ) == 0 && strcasecmp ( line+5, "expedia" ) == 0) + vik_viewport_set_drawmode ( VIK_VIEWPORT(vp), VIK_VIEWPORT_DRAWMODE_EXPEDIA ); + else if ( stack->under == NULL && eq_pos == 4 && strncasecmp ( line, "mode", eq_pos ) == 0 && strcasecmp ( line+5, "google" ) == 0) + { + successful_read = FALSE; + g_warning ( _("Draw mode '%s' no more supported"), "google" ); + } + else if ( stack->under == NULL && eq_pos == 4 && strncasecmp ( line, "mode", eq_pos ) == 0 && strcasecmp ( line+5, "kh" ) == 0) + { + successful_read = FALSE; + g_warning ( _("Draw mode '%s' no more supported"), "kh" ); + } + else if ( stack->under == NULL && eq_pos == 4 && strncasecmp ( line, "mode", eq_pos ) == 0 && strcasecmp ( line+5, "mercator" ) == 0) + vik_viewport_set_drawmode ( VIK_VIEWPORT(vp), VIK_VIEWPORT_DRAWMODE_MERCATOR ); + else if ( stack->under == NULL && eq_pos == 4 && strncasecmp ( line, "mode", eq_pos ) == 0 && strcasecmp ( line+5, "latlon" ) == 0) + vik_viewport_set_drawmode ( VIK_VIEWPORT(vp), VIK_VIEWPORT_DRAWMODE_LATLON ); + else if ( stack->under == NULL && eq_pos == 5 && strncasecmp ( line, "color", eq_pos ) == 0 ) + vik_viewport_set_background_color ( VIK_VIEWPORT(vp), line+6 ); + else if ( stack->under == NULL && eq_pos == 14 && strncasecmp ( line, "highlightcolor", eq_pos ) == 0 ) + vik_viewport_set_highlight_color ( VIK_VIEWPORT(vp), line+15 ); + else if ( stack->under == NULL && eq_pos == 9 && strncasecmp ( line, "drawscale", eq_pos ) == 0 ) + vik_viewport_set_draw_scale ( VIK_VIEWPORT(vp), TEST_BOOLEAN(line+10) ); + else if ( stack->under == NULL && eq_pos == 14 && strncasecmp ( line, "drawcentermark", eq_pos ) == 0 ) + vik_viewport_set_draw_centermark ( VIK_VIEWPORT(vp), TEST_BOOLEAN(line+15) ); + else if ( stack->under == NULL && eq_pos == 13 && strncasecmp ( line, "drawhighlight", eq_pos ) == 0 ) + vik_viewport_set_draw_highlight ( VIK_VIEWPORT(vp), TEST_BOOLEAN(line+14) ); + else if ( stack->under && eq_pos == 4 && strncasecmp ( line, "name", eq_pos ) == 0 ) + vik_layer_rename ( VIK_LAYER(stack->data), line+5 ); + else if ( eq_pos == 7 && strncasecmp ( line, "visible", eq_pos ) == 0 ) + VIK_LAYER(stack->data)->visible = TEST_BOOLEAN(line+8); + else if ( eq_pos != -1 && stack->under ) + { + gboolean found_match = FALSE; + + /* go thru layer params. if len == eq_pos && starts_with jazz, set it. */ + /* also got to check for name and visible. */ + + if ( ! params ) + { + successful_read = FALSE; + g_warning ( "Line %ld: No options for this kind of layer", line_num ); + continue; + } + + for ( i = 0; i < params_count; i++ ) + if ( strlen(params[i].name) == eq_pos && strncasecmp ( line, params[i].name, eq_pos ) == 0 ) + { + VikLayerParamData x; + line += eq_pos+1; + if ( params[i].type == VIK_LAYER_PARAM_STRING_LIST ) { + GList *l = g_list_append ( g_hash_table_lookup ( string_lists, GINT_TO_POINTER ((gint) i) ), + g_strdup(line) ); + g_hash_table_replace ( string_lists, GINT_TO_POINTER ((gint)i), l ); + /* add the value to a list, possibly making a new list. + * this will be passed to the layer when we read an ~EndLayer */ + } else { + switch ( params[i].type ) + { + case VIK_LAYER_PARAM_DOUBLE: x.d = strtod_i8n(line, NULL); break; + case VIK_LAYER_PARAM_UINT: x.u = strtoul(line, NULL, 10); break; + case VIK_LAYER_PARAM_INT: x.i = strtol(line, NULL, 10); break; + case VIK_LAYER_PARAM_BOOLEAN: x.b = TEST_BOOLEAN(line); break; + case VIK_LAYER_PARAM_COLOR: memset(&(x.c), 0, sizeof(x.c)); /* default: black */ + gdk_color_parse ( line, &(x.c) ); break; + /* STRING or STRING_LIST -- if STRING_LIST, just set param to add a STRING */ + default: x.s = line; + } + + VikLayerSetParam vlsp; + vlsp.id = i; + vlsp.data = x; + vlsp.vp = vp; + vlsp.is_file_operation = TRUE; + vlsp.dirpath = dirpath; + vik_layer_set_param ( VIK_LAYER(stack->data), &vlsp ); + } + found_match = TRUE; + break; + } + if ( ! found_match ) { + // ATM don't flow up this issue because at least one internal parameter has changed from version 1.3 + // and don't what to worry users about raising such issues + // TODO Maybe hold old values here - compare the line value against them and if a match + // generate a different style of message in the GUI... + // successful_read = FALSE; + g_warning ( "Line %ld: Unknown parameter. Line:\n%s", line_num, line ); + } + } + else { + successful_read = FALSE; + g_warning ( "Line %ld: Invalid parameter or parameter outside of layer.", line_num ); + } + } +/* could be: +[Layer Type=Bla] +[EndLayer] +[LayerData] +name=this +#comment +*/ + } + + while ( stack ) + { + if ( stack->under && stack->under->data && stack->data ) + { + vik_aggregate_layer_add_layer ( VIK_AGGREGATE_LAYER(stack->under->data), VIK_LAYER(stack->data), FALSE ); + vik_layer_post_read ( VIK_LAYER(stack->data), vp, TRUE ); + } + pop(&stack); + } + + if ( ll.lat != 0.0 || ll.lon != 0.0 ) + vik_viewport_set_center_latlon ( VIK_VIEWPORT(vp), &ll, TRUE ); + + if ( ( ! VIK_LAYER(top)->visible ) && VIK_LAYER(top)->realized ) + vik_treeview_item_set_visible ( VIK_LAYER(top)->vt, &(VIK_LAYER(top)->iter), FALSE ); + + /* delete anything we've forgotten about -- should only happen when file ends before an EndLayer */ + g_hash_table_foreach ( string_lists, string_list_delete, NULL ); + g_hash_table_destroy ( string_lists ); + + return successful_read; +} + +/* +read thru file +if "[Layer Type=" + push(&stack) + new default layer of type (str_to_type) (check interface->name) +if "[EndLayer]" + VikLayer *vl = stack->data; + pop(&stack); + vik_aggregate_layer_add_layer(stack->data, vl); +if "[LayerData]" + vik_layer_data ( VIK_LAYER_DATA(stack->data), f, vp ); + +*/ + +/* ---------------------------------------------------- */ + +static FILE *xfopen ( const char *fn ) +{ + if ( strcmp(fn,"-") == 0 ) + return stdin; + else + return g_fopen(fn, "r"); +} + +static void xfclose ( FILE *f ) +{ + if ( f != stdin && f != stdout ) { + fclose ( f ); + f = NULL; + } +} + +/* + * Function to determine if a filename is a 'viking' type file + */ +gboolean check_file_magic_vik ( const gchar *filename ) +{ + gboolean result = FALSE; + FILE *ff = xfopen ( filename ); + if ( ff ) { + result = check_magic ( ff, VIK_MAGIC, VIK_MAGIC_LEN ); + xfclose ( ff ); + } + return result; +} + +/** + * append_file_ext: + * + * Append a file extension, if not already present. + * + * Returns: a newly allocated string + */ +gchar *append_file_ext ( const gchar *filename, VikFileType_t type ) +{ + gchar *new_name = NULL; + const gchar *ext = NULL; + + /* Select an extension */ + switch (type) + { + case FILE_TYPE_GPX: + ext = ".gpx"; + break; + case FILE_TYPE_KML: + ext = ".kml"; + break; + case FILE_TYPE_GEOJSON: + ext = ".geojson"; + break; + case FILE_TYPE_GPSMAPPER: + case FILE_TYPE_GPSPOINT: + default: + /* Do nothing, ext already set to NULL */ + break; + } + + /* Do */ + if ( ext != NULL && ! a_file_check_ext ( filename, ext ) ) + new_name = g_strconcat ( filename, ext, NULL ); + else + /* Simply duplicate */ + new_name = g_strdup ( filename ); + + return new_name; +} + +/** + * a_file_load: + * + */ +VikLoadType_t a_file_load ( VikAggregateLayer *top, VikViewport *vp, VikTrwLayer *vtl, const gchar *filename_or_uri, gboolean new_layer ) +{ + g_return_val_if_fail ( vp != NULL, LOAD_TYPE_READ_FAILURE ); + + char *filename = (char *)filename_or_uri; + if (strncmp(filename, "file://", 7) == 0) { + // Consider replacing this with: + // filename = g_filename_from_uri ( entry, NULL, NULL ); + // Since this doesn't support URIs properly (i.e. will failure if is it has %20 characters in it) + filename = filename + 7; + g_debug ( "Loading file %s from URI %s", filename, filename_or_uri ); + } + FILE *f = xfopen ( filename ); + + if ( ! f ) + return LOAD_TYPE_READ_FAILURE; + + VikLoadType_t load_answer = LOAD_TYPE_OTHER_SUCCESS; + + gchar *absolute = file_realpath_dup ( filename ); + gchar *dirpath = NULL; + if ( absolute ) + dirpath = g_path_get_dirname ( absolute ); + g_free ( absolute ); + + // Attempt loading the primary file type first - our internal .vik file: + if ( check_magic ( f, VIK_MAGIC, VIK_MAGIC_LEN ) ) + { + if ( file_read ( top, f, dirpath, vp ) ) + load_answer = LOAD_TYPE_VIK_SUCCESS; + else + load_answer = LOAD_TYPE_VIK_FAILURE_NON_FATAL; + } + else if ( a_jpg_magic_check ( filename ) ) { + if ( ! a_jpg_load_file ( top, filename, vp ) ) + load_answer = LOAD_TYPE_UNSUPPORTED_FAILURE; + } + else + { + // For all other file types which consist of tracks, routes and/or waypoints, + // must be loaded into a new TrackWaypoint layer (hence it be created) + gboolean success = TRUE; // Detect load failures - mainly to remove the layer created as it's not required + + // Load the file as a new layer as instructed + gboolean add_new = new_layer; + + // If a layer is specified, then potentially load into that one + if ( a_vik_get_open_files_in_selected_layer() || !add_new ) { + add_new = TRUE; + if ( vtl ) { + if ( IS_VIK_TRW_LAYER(vtl) ) { + // Provided that the layer will be visible + // (otherwise possibly confusing to load but not display it) + if ( vik_treeview_item_get_visible_tree (VIK_LAYER(vtl)->vt, &(VIK_LAYER(vtl)->iter)) ) { + add_new = FALSE; + } + } + } + } + + if (add_new) { + vtl = VIK_TRW_LAYER (vik_layer_create ( VIK_LAYER_TRW, vp, FALSE )); + vik_layer_rename ( VIK_LAYER(vtl), a_file_basename ( filename ) ); + } + + // In fact both kml & gpx files start the same as they are in xml + if ( a_file_check_ext ( filename, ".kml" ) && check_magic ( f, GPX_MAGIC, GPX_MAGIC_LEN ) ) { + // Implicit Conversion + ProcessOptions po = { "-i kml", filename, NULL, NULL, NULL, NULL }; + if ( ! ( success = a_babel_convert_from ( vtl, &po, NULL, NULL, NULL ) ) ) { + load_answer = LOAD_TYPE_GPSBABEL_FAILURE; + } + } + // NB use a extension check first, as a GPX file header may have a Byte Order Mark (BOM) in it + // - which currently confuses our check_magic function + else if ( a_file_check_ext ( filename, ".gpx" ) || check_magic ( f, GPX_MAGIC, GPX_MAGIC_LEN ) ) { + if ( ! ( success = a_gpx_read_file ( vtl, f, dirpath ) ) ) { + load_answer = LOAD_TYPE_GPX_FAILURE; + } + } + else { + // Try final supported file type + if ( ! ( success = a_gpspoint_read_file ( vtl, f, dirpath ) ) ) { + // Failure here means we don't know how to handle the file + load_answer = LOAD_TYPE_UNSUPPORTED_FAILURE; + } + } + // Clean up when we can't handle the file + if ( ! success ) { + // free up layer + g_object_unref ( vtl ); + } + else { + // Complete the setup from the successful load + vik_layer_post_read ( VIK_LAYER(vtl), vp, TRUE ); + if (add_new) { + vik_aggregate_layer_add_layer ( top, VIK_LAYER(vtl), FALSE ); + } + else { + // Make it more accessible in layers panel + vik_layer_expand_tree ( VIK_LAYER(vtl) ); + } + vik_trw_layer_auto_set_view ( vtl, vp ); + } + } + g_free ( dirpath ); + xfclose(f); + return load_answer; +} + +gboolean a_file_save ( VikAggregateLayer *top, gpointer vp, const gchar *filename ) +{ + FILE *f; + + if (strncmp(filename, "file://", 7) == 0) + filename = filename + 7; + + f = g_fopen(filename, "w"); + + if ( ! f ) + return FALSE; + + // Enable relative paths in .vik files to work + gchar *cwd = g_get_current_dir(); + gchar *dir = g_path_get_dirname ( filename ); + if ( dir ) { + if ( g_chdir ( dir ) ) { + g_warning ( "Could not change directory to %s", dir ); + } + } + + file_write ( top, f, vp, dir ); + g_free (dir); + + // Restore previous working directory + if ( cwd ) { + if ( g_chdir ( cwd ) ) { + g_warning ( "Could not return to directory %s", cwd ); + } + g_free (cwd); + } + + fclose(f); + f = NULL; + + return TRUE; +} + + +/* example: + gboolean is_gpx = a_file_check_ext ( "a/b/c.gpx", ".gpx" ); +*/ +gboolean a_file_check_ext ( const gchar *filename, const gchar *fileext ) +{ + g_return_val_if_fail ( filename != NULL, FALSE ); + g_return_val_if_fail ( fileext && fileext[0]=='.', FALSE ); + const gchar *basename = a_file_basename(filename); + if (!basename) + return FALSE; + + const char * dot = strrchr(basename, '.'); + if (dot && !strcmp(dot, fileext)) + return TRUE; + + return FALSE; +} + +/** + * a_file_export: + * @vtl: The TrackWaypoint to export data from + * @filename: The name of the file to be written + * @file_type: Choose one of the supported file types for the export + * @trk: If specified then only export this track rather than the whole layer + * @write_hidden: Whether to write invisible items + * + * A general export command to convert from Viking TRW layer data to an external supported format. + * The write_hidden option is provided mainly to be able to transfer selected items when uploading to a GPS + */ +gboolean a_file_export ( VikTrwLayer *vtl, const gchar *filename, VikFileType_t file_type, VikTrack *trk, gboolean write_hidden ) +{ + GpxWritingOptions options = { FALSE, FALSE, write_hidden, FALSE }; + FILE *f = g_fopen ( filename, "w" ); + if ( f ) + { + gboolean result = TRUE; + gchar *dirpath = g_path_get_dirname ( filename ); + + if ( trk ) { + switch ( file_type ) { + case FILE_TYPE_GPX: + // trk defined so can set the option + options.is_route = trk->is_route; + a_gpx_write_track_file ( trk, f, &options ); + break; + default: + g_critical("Houston, we've had a problem. file_type=%d", file_type); + } + } else { + switch ( file_type ) { + case FILE_TYPE_GPSMAPPER: + a_gpsmapper_write_file ( vtl, f ); + break; + case FILE_TYPE_GPX: + a_gpx_write_file ( vtl, f, &options, dirpath ); + break; + case FILE_TYPE_GPSPOINT: + a_gpspoint_write_file ( vtl, f, dirpath ); + break; + case FILE_TYPE_GEOJSON: + result = a_geojson_write_file ( vtl, f ); + break; + case FILE_TYPE_KML: + fclose ( f ); + switch ( a_vik_get_kml_export_units () ) { + case VIK_KML_EXPORT_UNITS_STATUTE: + return a_babel_convert_to ( vtl, NULL, "-o kml", filename, NULL, NULL ); + break; + case VIK_KML_EXPORT_UNITS_NAUTICAL: + return a_babel_convert_to ( vtl, NULL, "-o kml,units=n", filename, NULL, NULL ); + break; + default: + // VIK_KML_EXPORT_UNITS_METRIC: + return a_babel_convert_to ( vtl, NULL, "-o kml,units=m", filename, NULL, NULL ); + break; + } + break; + default: + g_critical("Houston, we've had a problem. file_type=%d", file_type); + } + } + g_free ( dirpath ); + fclose ( f ); + return result; + } + return FALSE; +} + +/** + * a_file_export_babel: + */ +gboolean a_file_export_babel ( VikTrwLayer *vtl, const gchar *filename, const gchar *format, + gboolean tracks, gboolean routes, gboolean waypoints ) +{ + gchar *args = g_strdup_printf("%s %s %s -o %s", + tracks ? "-t" : "", + routes ? "-r" : "", + waypoints ? "-w" : "", + format); + gboolean result = a_babel_convert_to ( vtl, NULL, args, filename, NULL, NULL ); + g_free(args); + return result; +} diff --git a/src/file.h b/src/file.h new file mode 100644 index 0000000..9675f7b --- /dev/null +++ b/src/file.h @@ -0,0 +1,72 @@ +/* + * viking -- GPS Data and Topo Analyzer, Explorer, and Manager + * + * Copyright (C) 2003-2005, Evan Battaglia + * Copyright (C) 2012, Guilhem Bonnefille + * + * 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., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA + * + */ + +#ifndef _VIKING_FILE_H +#define _VIKING_FILE_H + +#include + +#include "vikaggregatelayer.h" +#include "viktrwlayer.h" +#include "vikviewport.h" + +G_BEGIN_DECLS + +typedef enum { +FILE_TYPE_GPSPOINT=1, +FILE_TYPE_GPSMAPPER=2, +FILE_TYPE_GPX=3, +FILE_TYPE_KML=4, +FILE_TYPE_GEOJSON=5, +} VikFileType_t; + +gboolean a_file_check_ext ( const gchar *filename, const gchar *fileext ); + +/* + * Function to determine if a filename is a 'viking' type file + */ +gboolean check_file_magic_vik ( const gchar *filename ); + +typedef enum { + LOAD_TYPE_READ_FAILURE, + LOAD_TYPE_GPSBABEL_FAILURE, + LOAD_TYPE_GPX_FAILURE, + LOAD_TYPE_UNSUPPORTED_FAILURE, + LOAD_TYPE_VIK_FAILURE_NON_FATAL, + LOAD_TYPE_VIK_SUCCESS, + LOAD_TYPE_OTHER_SUCCESS, +} VikLoadType_t; + +gchar *append_file_ext ( const gchar *filename, VikFileType_t type ); + +VikLoadType_t a_file_load ( VikAggregateLayer *top, VikViewport *vp, VikTrwLayer *vtl, const gchar *filename, gboolean new_layer ); +gboolean a_file_save ( VikAggregateLayer *top, gpointer vp, const gchar *filename ); +/* Only need to define VikTrack if the file type is FILE_TYPE_GPX_TRACK */ +gboolean a_file_export ( VikTrwLayer *vtl, const gchar *filename, VikFileType_t file_type, VikTrack *trk, gboolean write_hidden ); +gboolean a_file_export_babel ( VikTrwLayer *vtl, const gchar *filename, const gchar *format, + gboolean tracks, gboolean routes, gboolean waypoints ); + +void file_write_layer_param ( FILE *f, const gchar *name, VikLayerParamType type, VikLayerParamData data ); + +G_END_DECLS + +#endif diff --git a/src/file_magic.c b/src/file_magic.c new file mode 100644 index 0000000..cbd93f4 --- /dev/null +++ b/src/file_magic.c @@ -0,0 +1,80 @@ +/* -*- Mode: C; indent-tabs-mode: t; c-basic-offset: 4; tab-width: 4 -*- */ +/* + * viking -- GPS Data and Topo Analyzer, Explorer, and Manager + * + * Copyright (C) 2016, Rob Norris + * + * 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., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA + * + */ + +#ifdef HAVE_CONFIG_H +#include "config.h" +#endif +#include "file_magic.h" +#include "file.h" +#ifdef HAVE_MAGIC_H +#include +#endif +#include + +/** + * file_magic_check: + * @filename: The file + * @magic_string: Type of file (this part matched against the magic library response) + * @extension: Optional extension to try when Magic Library is not available + * + * Returns: Whether the file is of the specified type. + * Uses the Magic library if available to determine the file against the supplied type. + * Otherwise uses a rudimentary file extension check. + */ +gboolean file_magic_check ( const gchar *filename, const gchar *magic_string, const gchar *extension ) +{ + gboolean is_requested_file_type = FALSE; +#ifdef HAVE_MAGIC_H +#ifdef MAGIC_VERSION + // Or magic_version() if available - probably need libmagic 5.18 or so + // (can't determine exactly which version the versioning became available) + g_debug ("%s: magic version: %d", __FUNCTION__, MAGIC_VERSION ); +#endif + magic_t myt = magic_open ( MAGIC_CONTINUE|MAGIC_ERROR|MAGIC_MIME ); + if ( myt ) { +#ifdef WINDOWS + // We have to 'package' the magic database ourselves :( + // --> %PROGRAM FILES%\Viking\magic.mgc + int ml = magic_load ( myt, ".\\magic.mgc" ); +#else + // Use system default + int ml = magic_load ( myt, NULL ); +#endif + if ( ml == 0 ) { + const char* magic = magic_file ( myt, filename ); + g_debug ("%s: magic output: %s", __FUNCTION__, magic ); + + if ( g_ascii_strncasecmp ( magic, magic_string, strlen(magic_string) ) == 0 ) + is_requested_file_type = TRUE; + } + else { + g_critical ("%s: magic load database failure", __FUNCTION__ ); + } + + magic_close ( myt ); + } + else +#endif + is_requested_file_type = a_file_check_ext ( filename, extension ); + + return is_requested_file_type; +} diff --git a/src/file_magic.h b/src/file_magic.h new file mode 100644 index 0000000..3db85c5 --- /dev/null +++ b/src/file_magic.h @@ -0,0 +1,34 @@ +/* -*- Mode: C; indent-tabs-mode: t; c-basic-offset: 4; tab-width: 4 -*- */ +/* + * viking -- GPS Data and Topo Analyzer, Explorer, and Manager + * + * Copyright (C) 2016, Rob Norris + * + * 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., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA + * + */ + +#ifndef _VIKING_FILE_MAGIC_H +#define _VIKING_FILE_MAGIC_H + +#include + +G_BEGIN_DECLS + +gboolean file_magic_check ( const gchar *filename, const gchar *magic_string, const gchar *extension ); + +G_END_DECLS + +#endif diff --git a/src/fileutils.c b/src/fileutils.c new file mode 100644 index 0000000..302c241 --- /dev/null +++ b/src/fileutils.c @@ -0,0 +1,192 @@ +/* + * viking -- GPS Data and Topo Analyzer, Explorer, and Manager + * + * Copyright (C) 2003-2005, Evan Battaglia + * + * 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., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA + * + */ +/* + * Code that is independent of any other Viking specific types + * Otherwise see file.c + */ +#include +#include +#include +#include + +#include "fileutils.h" + +#ifdef WINDOWS +#include +#define realpath(X,Y) _fullpath(Y,X,MAX_PATH) +#define FILE_SEP '\\' +#else +#define FILE_SEP '/' +#endif + +const gchar *a_file_basename ( const gchar *filename ) +{ + const gchar *t = filename + strlen(filename) - 1; + while ( --t > filename ) + if ( *(t-1) == FILE_SEP ) + break; + if ( t >= filename ) + return t; + return filename; +} + +/** + * Just a wrapper around realpath, which itself is platform dependent + */ +char *file_realpath ( const char *path, char *real ) +{ + return realpath ( path, real ); +} + +#ifndef MAXPATHLEN +#define MAXPATHLEN 1024 +#endif +/** + * Always return the canonical filename in a newly allocated string + */ +char *file_realpath_dup ( const char *path ) +{ + g_return_val_if_fail (path != NULL, NULL); +#ifdef PATH_MAX + // Posix 2008, realpath() will handle memory allocation + return file_realpath ( path, NULL ); +#else + char real[MAXPATHLEN]; + if ( file_realpath ( path, real ) ) + return g_strdup ( real ); + return NULL; +#endif +} + +/** + * Permission granted to use this code after personal correspondance + * Slightly reworked for better cross platform use, glibisms, function rename and a compacter format + * + * FROM http://www.codeguru.com/cpp/misc/misc/fileanddirectorynaming/article.php/c263 + */ + +// GetRelativeFilename(), by Rob Fisher. +// rfisher@iee.org +// http://come.to/robfisher + +// The number of characters at the start of an absolute filename. e.g. in DOS, +// absolute filenames start with "X:\" so this value should be 3, in UNIX they start +// with "\" so this value should be 1. +#ifdef WINDOWS +#define ABSOLUTE_NAME_START 3 +#else +#define ABSOLUTE_NAME_START 1 +#endif + +// Given the absolute current directory and an absolute file name, returns a relative file name. +// For example, if the current directory is C:\foo\bar and the filename C:\foo\whee\text.txt is given, +// GetRelativeFilename will return ..\whee\text.txt. + +const gchar *file_GetRelativeFilename ( gchar *currentDirectory, gchar *absoluteFilename ) +{ + gint afMarker = 0, rfMarker = 0; + gint cdLen = 0, afLen = 0; + gint i = 0; + gint levels = 0; + static gchar relativeFilename[MAXPATHLEN+1]; + + cdLen = strlen(currentDirectory); + afLen = strlen(absoluteFilename); + + // make sure the names are not too long or too short + if (cdLen > MAXPATHLEN || cdLen < ABSOLUTE_NAME_START+1 || + afLen > MAXPATHLEN || afLen < ABSOLUTE_NAME_START+1) { + return NULL; + } + + // Handle DOS names that are on different drives: + if (currentDirectory[0] != absoluteFilename[0]) { + // not on the same drive, so only absolute filename will do + g_strlcpy(relativeFilename, absoluteFilename, MAXPATHLEN+1); + return relativeFilename; + } + + // they are on the same drive, find out how much of the current directory + // is in the absolute filename + i = ABSOLUTE_NAME_START; + while (i < afLen && i < cdLen && currentDirectory[i] == absoluteFilename[i]) { + i++; + } + + if (i == cdLen && (absoluteFilename[i] == G_DIR_SEPARATOR || absoluteFilename[i-1] == G_DIR_SEPARATOR)) { + // the whole current directory name is in the file name, + // so we just trim off the current directory name to get the + // current file name. + if (absoluteFilename[i] == G_DIR_SEPARATOR) { + // a directory name might have a trailing slash but a relative + // file name should not have a leading one... + i++; + } + + g_strlcpy(relativeFilename, &absoluteFilename[i], MAXPATHLEN+1); + return relativeFilename; + } + + // The file is not in a child directory of the current directory, so we + // need to step back the appropriate number of parent directories by + // using "..\"s. First find out how many levels deeper we are than the + // common directory + afMarker = i; + levels = 1; + + // count the number of directory levels we have to go up to get to the + // common directory + while (i < cdLen) { + i++; + if (currentDirectory[i] == G_DIR_SEPARATOR) { + // make sure it's not a trailing slash + i++; + if (currentDirectory[i] != '\0') { + levels++; + } + } + } + + // move the absolute filename marker back to the start of the directory name + // that it has stopped in. + while (afMarker > 0 && absoluteFilename[afMarker-1] != G_DIR_SEPARATOR) { + afMarker--; + } + + // check that the result will not be too long + if (levels * 3 + afLen - afMarker > MAXPATHLEN) { + return NULL; + } + + // add the appropriate number of "..\"s. + rfMarker = 0; + for (i = 0; i < levels; i++) { + relativeFilename[rfMarker++] = '.'; + relativeFilename[rfMarker++] = '.'; + relativeFilename[rfMarker++] = G_DIR_SEPARATOR; + } + + // copy the rest of the filename into the result string + strcpy(&relativeFilename[rfMarker], &absoluteFilename[afMarker]); + + return relativeFilename; +} +/* END http://www.codeguru.com/cpp/misc/misc/fileanddirectorynaming/article.php/c263 */ diff --git a/src/fileutils.h b/src/fileutils.h new file mode 100644 index 0000000..fdbd590 --- /dev/null +++ b/src/fileutils.h @@ -0,0 +1,38 @@ +/* + * viking -- GPS Data and Topo Analyzer, Explorer, and Manager + * + * Copyright (C) 2003-2005, Evan Battaglia + * + * 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., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA + * + */ +#ifndef __FILE_UTILS_H +#define __FILE_UTILS_H + +#include + +G_BEGIN_DECLS + +const gchar *a_file_basename ( const gchar *filename ); + +char *file_realpath ( const char *path, char *real ); + +char *file_realpath_dup ( const char *path ); + +const gchar *file_GetRelativeFilename ( gchar *currentDirectory, gchar *absoluteFilename ); + +G_END_DECLS + +#endif diff --git a/src/garminsymbols.c b/src/garminsymbols.c new file mode 100644 index 0000000..d7c41d2 --- /dev/null +++ b/src/garminsymbols.c @@ -0,0 +1,471 @@ +/* + * viking -- GPS Data and Topo Analyzer, Explorer, and Manager + * + * Copyright (C) 2003-2005, Evan Battaglia + * Copyright (C) 2005, Alex Foobarian + * Copyright (C) 2008, Quy Tonthat + * + * 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., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA + * + */ + +#include "viking.h" +#include "garminsymbols.h" +#include "icons/icons.h" + +#include +#include + +static struct { + gchar *sym; /* icon names used by gpsbabel, garmin */ + gchar *old_sym; /* keep backward compatible */ + gint num; + gchar *desc; + const GdkPixdata *data; + const GdkPixdata *data_large; + GdkPixbuf *icon; +} garmin_syms[] = { + /* "sym" are in 'Title Case' like in gpsbabel. This is needed for + * devices like Garmin Oregon 450. Old exports with lower case + * identifiers will be automatically converted to the version defined + * inside the table by vikwaypoint.c:vik_waypoint_set_symbol(). + * The hash itself tries to keep all operations case independent + * using str_equal_casefold() and str_hash_casefold(). This is + * necessary to allow a_get_hashed_sym() to match the lower case + * version with the identifier stored in "sym". + */ + /*--------------------------------------------------------------- + Marine symbols + ---------------------------------------------------------------*/ + { "Marina", "anchor", 0, "white anchor symbol", &wp_anchor_pixbuf, &wp_anchor_large_pixbuf, NULL }, + { "Bell", "bell", 1, "white bell symbol", &wp_bell_pixbuf, &wp_bell_large_pixbuf, NULL }, + { "Green Diamon", "diamond_grn", 2, "green diamond symbol", &wp_diamond_grn_pixbuf, NULL, NULL }, + { "Red Diamon", "diamond_red", 3, "red diamond symbol", &wp_diamond_red_pixbuf, NULL, NULL }, + { "Diver Down Flag 1", "dive1", 4, "diver down flag 1", &wp_dive1_pixbuf, &wp_dive1_large_pixbuf, NULL }, + { "Diver Down Flag 2", "dive2", 5, "diver down flag 2", &wp_dive2_pixbuf, &wp_dive2_large_pixbuf, NULL }, + { "Bank", "dollar", 6, "white dollar symbol", &wp_dollar_pixbuf, &wp_dollar_large_pixbuf, NULL }, + { "Fishing Area", "fish", 7, "white fish symbol", &wp_fish_pixbuf, &wp_fish_large_pixbuf, NULL }, + { "Gas Station", "fuel", 8, "white fuel symbol", &wp_fuel_pixbuf, &wp_fuel_large_pixbuf, NULL }, + { "Horn", "horn", 9, "white horn symbol", &wp_horn_pixbuf, &wp_horn_large_pixbuf, NULL }, + { "Residence", "house", 10, "white house symbol", &wp_house_pixbuf, &wp_house_large_pixbuf, NULL }, + { "Restaurant", "knife", 11, "white knife & fork symbol", &wp_knife_pixbuf, &wp_knife_large_pixbuf, NULL }, + { "Light", "light", 12, "white light symbol", &wp_light_pixbuf, &wp_light_large_pixbuf, NULL }, + { "Bar", "mug", 13, "white mug symbol", &wp_mug_pixbuf, &wp_mug_large_pixbuf, NULL }, + { "Skull and Crossbones", "skull", 14, "white skull and crossbones symbol", &wp_skull_pixbuf, &wp_skull_large_pixbuf, NULL }, + { "Green Square", "square_grn", 15, "green square symbol", &wp_square_grn_pixbuf, NULL, NULL }, + { "Red Square", "square_red", 16, "red square symbol", &wp_square_red_pixbuf, NULL, NULL }, + { "Buoy, White", "wbuoy", 17, "white buoy waypoint symbol", &wp_wbuoy_pixbuf, &wp_wbuoy_large_pixbuf, NULL }, + { "Waypoint", "wpt_dot", 18, "waypoint dot", &wp_wpt_dot_pixbuf, NULL, NULL }, + { "Shipwreck", "wreck", 19, "white wreck symbol", &wp_wreck_pixbuf, &wp_wreck_large_pixbuf, NULL }, + { "None", "null", 20, "null symbol (transparent)", &wp_null_pixbuf, NULL, NULL }, + { "Man Overboard", "mob", 21, "man overboard symbol", &wp_mob_pixbuf, &wp_mob_large_pixbuf, NULL }, + { "Navaid, Amber", "buoy_ambr", 22, "amber map buoy symbol", &wp_buoy_ambr_pixbuf, &wp_buoy_ambr_large_pixbuf, NULL }, + { "Navaid, Black", "buoy_blck", 23, "black map buoy symbol", &wp_buoy_blck_pixbuf, &wp_buoy_blck_large_pixbuf, NULL }, + { "Navaid, Blue", "buoy_blue", 24, "blue map buoy symbol", &wp_buoy_blue_pixbuf, &wp_buoy_blue_large_pixbuf, NULL }, + { "Navaid, Green", "buoy_grn", 25, "green map buoy symbol", &wp_buoy_grn_pixbuf, &wp_buoy_grn_large_pixbuf, NULL }, + { "Navaid, Green/Red", "buoy_grn_red", 26, "green/red map buoy symbol", &wp_buoy_grn_red_pixbuf, &wp_buoy_grn_red_large_pixbuf, NULL }, + { "Navaid, Green/White", "buoy_grn_wht", 27, "green/white map buoy symbol", &wp_buoy_grn_wht_pixbuf, &wp_buoy_grn_wht_large_pixbuf, NULL }, + { "Navaid, Orange", "buoy_orng", 28, "orange map buoy symbol", &wp_buoy_orng_pixbuf, &wp_buoy_orng_large_pixbuf, NULL }, + { "Navaid, Red", "buoy_red", 29, "red map buoy symbol", &wp_buoy_red_pixbuf, &wp_buoy_red_large_pixbuf, NULL }, + { "Navaid, Red/Green", "buoy_red_grn", 30, "red/green map buoy symbol", &wp_buoy_red_grn_pixbuf, &wp_buoy_red_grn_large_pixbuf, NULL }, + { "Navaid, Red/White", "buoy_red_wht", 31, "red/white map buoy symbol", &wp_buoy_red_wht_pixbuf, &wp_buoy_red_wht_large_pixbuf, NULL }, + { "Navaid, Violet", "buoy_violet", 32, "violet map buoy symbol", &wp_buoy_violet_pixbuf, &wp_buoy_violet_large_pixbuf, NULL }, + { "Navaid, White", "buoy_wht", 33, "white map buoy symbol", &wp_buoy_wht_pixbuf, &wp_buoy_wht_large_pixbuf, NULL }, + { "Navaid, White/Green", "buoy_wht_grn", 34, "white/green map buoy symbol", &wp_buoy_wht_grn_pixbuf, &wp_buoy_wht_grn_large_pixbuf, NULL }, + { "Navaid, White/Red", "buoy_wht_red", 35, "white/red map buoy symbol", &wp_buoy_wht_red_pixbuf, &wp_buoy_wht_red_large_pixbuf, NULL }, + { "White Dot", "dot", 36, "white dot symbol", &wp_dot_pixbuf, NULL, NULL }, + { "Radio Beacon", "rbcn", 37, "radio beacon symbol", &wp_rbcn_pixbuf, &wp_rbcn_large_pixbuf, NULL }, + { "Boat Ramp", "boat_ramp", 150, "boat ramp symbol", &wp_boat_ramp_pixbuf, &wp_boat_ramp_large_pixbuf, NULL }, + { "Campground", "camp", 151, "campground symbol", &wp_camp_pixbuf, &wp_camp_large_pixbuf, NULL }, + { "Restroom", "restrooms", 152, "restrooms symbol", &wp_restroom_pixbuf, &wp_restroom_large_pixbuf, NULL }, + { "Shower", "showers", 153, "shower symbol", &wp_shower_pixbuf, &wp_shower_large_pixbuf, NULL }, + { "Drinking Water", "drinking_wtr", 154, "drinking water symbol", &wp_drinking_wtr_pixbuf, &wp_drinking_wtr_large_pixbuf, NULL }, + { "Telephone", "phone", 155, "telephone symbol", &wp_phone_pixbuf, &wp_phone_large_pixbuf, NULL }, + { "Medical Facility", "1st_aid", 156, "first aid symbol", &wp_1st_aid_pixbuf, &wp_1st_aid_large_pixbuf, NULL }, + { "Information", "info", 157, "information symbol", &wp_info_pixbuf, &wp_info_large_pixbuf, NULL }, + { "Parking Area", "parking", 158, "parking symbol", &wp_parking_pixbuf, &wp_parking_large_pixbuf, NULL }, + { "Park", "park", 159, "park symbol", &wp_park_pixbuf, &wp_park_large_pixbuf, NULL }, + { "Picnic Area", "picnic", 160, "picnic symbol", &wp_picnic_pixbuf, &wp_picnic_large_pixbuf, NULL }, + { "Scenic Area", "scenic", 161, "scenic area symbol", &wp_scenic_pixbuf, &wp_scenic_large_pixbuf, NULL }, + { "Skiing Area", "skiing", 162, "skiing symbol", &wp_skiing_pixbuf, &wp_skiing_large_pixbuf, NULL }, + { "Swimming Area", "swimming", 163, "swimming symbol", &wp_swimming_pixbuf, &wp_swimming_large_pixbuf, NULL }, + { "Dam", "dam", 164, "dam symbol", &wp_dam_pixbuf, &wp_dam_large_pixbuf, NULL }, + { "Controlled Area", "controlled", 165, "controlled area symbol", &wp_controlled_pixbuf, &wp_controlled_large_pixbuf, NULL }, + { "Danger Area", "danger", 166, "danger symbol", &wp_danger_pixbuf, &wp_danger_large_pixbuf, NULL }, + { "Restricted Area", "restricted", 167, "restricted area symbol", &wp_restricted_pixbuf, &wp_restricted_large_pixbuf, NULL }, + { "Null 2", "null_2", 168, "null symbol", NULL, NULL, NULL }, /* not exist */ + { "Ball Park", "ball", 169, "ball symbol", &wp_ball_pixbuf, &wp_ball_large_pixbuf, NULL }, + { "Car", "car", 170, "car symbol", &wp_car_pixbuf, &wp_car_large_pixbuf, NULL }, + { "Hunting Area", "deer", 171, "deer symbol", &wp_deer_pixbuf, &wp_deer_large_pixbuf, NULL }, + { "Shopping Center", "shopping", 172, "shopping cart symbol", NULL, &wp_shopping_large_pixbuf, NULL }, + { "Lodging", "lodging", 173, "lodging symbol", NULL, &wp_lodging_large_pixbuf, NULL }, + { "Mine", "mine", 174, "mine symbol", &wp_mine_pixbuf, &wp_mine_large_pixbuf, NULL }, + { "Trail Head", "trail_head", 175, "trail head symbol", NULL, &wp_trail_head_large_pixbuf, NULL }, + { "Truck Stop", "truck_stop", 176, "truck stop symbol", NULL, &wp_truck_stop_large_pixbuf, NULL }, + { "Exit", "user_exit", 177, "user exit symbol", NULL, &wp_exit_large_pixbuf, NULL }, + { "Flag", "flag", 178, "flag symbol", &wp_flag_pixbuf, NULL, NULL }, + { "Circle with X", "circle_x", 179, "circle with x in the center", NULL, NULL, NULL }, + { "Open 24 Hours", "open_24hr", 180, "open 24 hours symbol", NULL, NULL, NULL }, + { "Fishing Hot Spot Facility", "fhs_facility", 181, "U Fishing Hot SpotsTM Facility", NULL, &wp_fhs_facility_large_pixbuf, NULL }, + { "Bottom Conditions", "bot_cond", 182, "Bottom Conditions", NULL, NULL, NULL }, + { "Tide/Current PRediction Station", "tide_pred_stn", 183, "Tide/Current Prediction Station", NULL, NULL, NULL }, + { "Anchor Prohibited", "anchor_prohib", 184, "U anchor prohibited symbol", NULL, NULL, NULL }, + { "Beacon", "beacon", 185, "U beacon symbol", NULL, NULL, NULL }, + { "Coast Guard", "coast_guard", 186, "U coast guard symbol", NULL, NULL, NULL }, + { "Reef", "reef", 187, "U reef symbol", NULL, NULL, NULL }, + { "Weed Bed", "weedbed", 188, "U weedbed symbol", NULL, NULL, NULL }, + { "Dropoff", "dropoff", 189, "U dropoff symbol", NULL, NULL, NULL }, + { "Dock", "dock", 190, "U dock symbol", NULL, NULL, NULL }, + { "U Marina", "marina", 191, "U marina symbol", NULL, NULL, NULL }, + { "Bait and Tackle", "bait_tackle", 192, "U bait and tackle symbol", NULL, NULL, NULL }, + { "Stump", "stump", 193, "U stump symbol", NULL, NULL, NULL }, + { "Lodge", "lodge", 194, "lodge symbol", NULL, &wp_lodge_large_pixbuf, NULL }, + { "Ground Transportation", "grnd_trans", 229, "ground transportation", NULL, &wp_grnd_trans_large_pixbuf, NULL }, + /*--------------------------------------------------------------- + User customizable symbols + The values from begin_custom to end_custom inclusive are + reserved for the identification of user customizable symbols. + ---------------------------------------------------------------*/ + { "custom begin placeholder", "begin_custom", 7680, "first user customizable symbol", NULL, NULL, NULL }, + { "custom end placeholder","end_custom", 8191, "last user customizable symbol", NULL, NULL, NULL }, + /*--------------------------------------------------------------- + Land symbols + ---------------------------------------------------------------*/ + { "Interstate Highway", "is_hwy", 8192, "interstate hwy symbol", NULL, NULL, NULL }, /* TODO: check symbol name */ + { "US hwy", "us_hwy", 8193, "us hwy symbol", NULL, NULL, NULL }, + { "State Hwy", "st_hwy", 8194, "state hwy symbol", NULL, NULL, NULL }, + { "Mile Marker", "mi_mrkr", 8195, "mile marker symbol", NULL, NULL, NULL }, + { "TracBack Point", "trcbck", 8196, "TracBack (feet) symbol", NULL, NULL, NULL }, + { "Golf Course", "golf", 8197, "golf symbol", &wp_golf_pixbuf, &wp_golf_large_pixbuf, NULL }, + { "City (Small)", "sml_cty", 8198, "small city symbol", &wp_sml_cty_pixbuf, &wp_sml_cty_large_pixbuf, NULL }, + { "City (Medium)", "med_cty", 8199, "medium city symbol", &wp_med_cty_pixbuf, &wp_med_cty_large_pixbuf, NULL }, + { "City (Large)", "lrg_cty", 8200, "large city symbol", &wp_lrg_cty_pixbuf, &wp_lrg_cty_large_pixbuf, NULL }, + { "Intl freeway hwy", "freeway", 8201, "intl freeway hwy symbol", NULL, NULL, NULL }, + { "Intl national hwy", "ntl_hwy", 8202, "intl national hwy symbol", NULL, NULL, NULL }, + { "City (Capitol)", "cap_cty", 8203, "capitol city symbol (star)", &wp_cap_cty_pixbuf, NULL, NULL }, + { "Amusement Park", "amuse_pk", 8204, "amusement park symbol", NULL, &wp_amuse_pk_large_pixbuf, NULL }, + { "Bowling", "bowling", 8205, "bowling symbol", NULL, &wp_bowling_large_pixbuf, NULL }, + { "Car Rental", "car_rental", 8206, "car rental symbol", NULL, &wp_car_rental_large_pixbuf, NULL }, + { "Car Repair", "car_repair", 8207, "car repair symbol", NULL, &wp_car_repair_large_pixbuf, NULL }, + { "Fast Food", "fastfood", 8208, "fast food symbol", NULL, &wp_fastfood_large_pixbuf, NULL }, + { "Fitness Center", "fitness", 8209, "fitness symbol", NULL, &wp_fitness_large_pixbuf, NULL }, + { "Movie Theater", "movie", 8210, "movie symbol", NULL, &wp_movie_large_pixbuf, NULL }, + { "Museum", "museum", 8211, "museum symbol", NULL, &wp_museum_large_pixbuf, NULL }, + { "Pharmacy", "pharmacy", 8212, "pharmacy symbol", NULL, &wp_pharmacy_large_pixbuf, NULL }, + { "Pizza", "pizza", 8213, "pizza symbol", NULL, &wp_pizza_large_pixbuf, NULL }, + { "Post Office", "post_ofc", 8214, "post office symbol", NULL, &wp_post_ofc_large_pixbuf, NULL }, + { "RV Park", "rv_park", 8215, "RV park symbol", &wp_rv_park_pixbuf, &wp_rv_park_large_pixbuf, NULL }, + { "School", "school", 8216, "school symbol", &wp_school_pixbuf, &wp_school_large_pixbuf, NULL }, + { "Stadium", "stadium", 8217, "stadium symbol", NULL, &wp_stadium_large_pixbuf, NULL }, + { "Department Store", "store", 8218, "dept. store symbol", NULL, &wp_store_large_pixbuf, NULL }, + { "Zoo", "zoo", 8219, "zoo symbol", NULL, &wp_zoo_large_pixbuf, NULL }, + { "Convenience Store", "conv_store", 8220, "convenience store symbol", NULL, &wp_conv_store_large_pixbuf, NULL }, + { "Live Theater", "theater", 8221, "live theater symbol", NULL, &wp_theater_large_pixbuf, NULL }, + { "Ramp intersection", "ramp_int", 8222, "ramp intersection symbol", NULL, NULL, NULL }, + { "Street Intersection", "st_int", 8223, "street intersection symbol", NULL, NULL, NULL }, + { "Scales", "weigh_station", 8226, "inspection/weigh station symbol", NULL, &wp_weigh_station_large_pixbuf, NULL }, + { "Toll Booth", "toll_booth", 8227, "toll booth symbol", NULL, &wp_toll_booth_large_pixbuf, NULL }, + { "Elevation point", "elev_pt", 8228, "elevation point symbol", NULL, NULL, NULL }, + { "Exit without services", "ex_no_srvc", 8229, "exit without services symbol", NULL, NULL, NULL }, + { "Geographic place name, Man-made", "geo_place_mm", 8230, "Geographic place name, man-made", NULL, NULL, NULL }, + { "Geographic place name, water","geo_place_wtr", 8231, "Geographic place name, water", NULL, NULL, NULL }, + { "Geographic place name, Land", "geo_place_lnd", 8232, "Geographic place name, land", NULL, NULL, NULL }, + { "Bridge", "bridge", 8233, "bridge symbol", &wp_bridge_pixbuf, &wp_bridge_large_pixbuf, NULL }, + { "Building", "building", 8234, "building symbol", &wp_building_pixbuf, &wp_building_large_pixbuf, NULL }, + { "Cemetery", "cemetery", 8235, "cemetery symbol", &wp_cemetery_pixbuf, &wp_cemetery_large_pixbuf, NULL }, + { "Church", "church", 8236, "church symbol", &wp_church_pixbuf, &wp_church_large_pixbuf, NULL }, + { "Civil", "civil", 8237, "civil location symbol", NULL, &wp_civil_large_pixbuf, NULL }, + { "Crossing", "crossing", 8238, "crossing symbol", NULL, &wp_crossing_large_pixbuf, NULL }, + { "Ghost Town", "hist_town", 8239, "historical town symbol", NULL, NULL, NULL }, + { "Levee", "levee", 8240, "levee symbol", NULL, NULL, NULL }, + { "Military", "military", 8241, "military location symbol", &wp_military_pixbuf, NULL, NULL }, + { "Oil Field", "oil_field", 8242, "oil field symbol", NULL, &wp_oil_field_large_pixbuf, NULL }, + { "Tunnel", "tunnel", 8243, "tunnel symbol", &wp_tunnel_pixbuf, &wp_tunnel_large_pixbuf, NULL }, + { "Beach", "beach", 8244, "beach symbol", &wp_beach_pixbuf, &wp_beach_large_pixbuf, NULL }, + { "Forest", "forest", 8245, "forest symbol", &wp_forest_pixbuf, &wp_forest_large_pixbuf, NULL }, + { "Summit", "summit", 8246, "summit symbol", &wp_summit_pixbuf, &wp_summit_large_pixbuf, NULL }, + { "Large Ramp intersection", "lrg_ramp_int", 8247, "large ramp intersection symbol", NULL, NULL, NULL }, + { "Large exit without services", "lrg_ex_no_srvc", 8248, "large exit without services smbl", NULL, NULL, NULL }, + { "Police Station", "police", 8249, "police/official badge symbol", NULL, &wp_police_large_pixbuf, NULL }, + { "Gambling/casino", "cards", 8250, "gambling/casino symbol", NULL, NULL, NULL }, + { "Ski Resort", "ski_resort", 8251, "snow skiing symbol", NULL, &wp_ski_resort_large_pixbuf, NULL }, + { "Ice Skating", "ice_skating", 8252, "ice skating symbol", &wp_ice_skating_pixbuf, &wp_ice_skating_large_pixbuf, NULL }, + { "Wrecker", "wrecker", 8253, "tow truck (wrecker) symbol", NULL, &wp_wrecker_large_pixbuf, NULL }, + { "Border Crossing (Port Of Entry)", "border", 8254, "border crossing (port of entry)", NULL, NULL, NULL }, + { "Geocache", "geocache", 8255, "geocache location", &wp_geocache_pixbuf, &wp_geocache_large_pixbuf, NULL }, + { "Geocache Found", "geocache_fnd", 8256, "found geocache", &wp_geocache_fnd_pixbuf, &wp_geocache_fnd_large_pixbuf, NULL }, + { "Contact, Smiley", "cntct_smiley", 8257, "Rino contact symbol, ""smiley""", NULL, NULL, NULL }, + { "Contact, Ball Cap", "cntct_ball_cap", 8258, "Rino contact symbol, ""ball cap""", NULL, NULL, NULL }, + { "Contact, Big Ears", "cntct_big_ears", 8259, "Rino contact symbol, ""big ear""", NULL, NULL, NULL }, + { "Contact, Spike", "cntct_spike", 8260, "Rino contact symbol, ""spike""", NULL, NULL, NULL }, + { "Contact, Goatee", "cntct_goatee", 8261, "Rino contact symbol, ""goatee""", NULL, NULL, NULL }, + { "Contact, Afro", "cntct_afro", 8262, "Rino contact symbol, ""afro""", NULL, NULL, NULL }, + { "Contact, Dreadlocks", "cntct_dreads", 8263, "Rino contact symbol, ""dreads""", NULL, NULL, NULL }, + { "Contact, Female1", "cntct_female1", 8264, "Rino contact symbol, ""female 1""", NULL, NULL, NULL }, + { "Contact, Female2", "cntct_female2", 8265, "Rino contact symbol, ""female 2""", NULL, NULL, NULL }, + { "Contact, Female3", "cntct_female3", 8266, "Rino contact symbol, ""female 3""", NULL, NULL, NULL }, + { "Contact, Ranger", "cntct_ranger", 8267, "Rino contact symbol, ""ranger""", NULL, NULL, NULL }, + { "Contact, Kung-Fu", "cntct_kung_fu", 8268, "Rino contact symbol, ""kung fu""", NULL, NULL, NULL }, + { "Contact, Sumo", "cntct_sumo", 8269, "Rino contact symbol, ""sumo""", NULL, NULL, NULL }, + { "Contact, Pirate", "cntct_pirate", 8270, "Rino contact symbol, ""pirate""", NULL, NULL, NULL }, + { "Contact, Biker", "cntct_biker", 8271, "Rino contact symbol, ""biker""", NULL, NULL, NULL }, + { "Contact, Alien", "cntct_alien", 8272, "Rino contact symbol, ""alien""", NULL, NULL, NULL }, + { "Contact, Bug", "cntct_bug", 8273, "Rino contact symbol, ""bug""", NULL, NULL, NULL }, + { "Contact, Cat", "cntct_cat", 8274, "Rino contact symbol, ""cat""", NULL, NULL, NULL }, + { "Contact, Dog", "cntct_dog", 8275, "Rino contact symbol, ""dog""", NULL, NULL, NULL }, + { "Contact, Pig", "cntct_pig", 8276, "Rino contact symbol, ""pig""", NULL, NULL, NULL }, + { "Water Hydrant", "hydrant", 8282, "water hydrant symbol", NULL, NULL, NULL }, + { "Flag, Blue", "flag_blue", 8284, "blue flag symbol", NULL, &wp_flag_blue_large_pixbuf, NULL }, + { "Flag, Green", "flag_green", 8285, "green flag symbol", NULL, &wp_flag_green_large_pixbuf, NULL }, + { "Flag, Red", "flag_red", 8286, "red flag symbol", NULL, &wp_flag_red_large_pixbuf, NULL }, + { "Pin, Blue", "pin_blue", 8287, "blue pin symbol", NULL, &wp_pin_blue_large_pixbuf, NULL }, + { "Pin, Green", "pin_green", 8288, "green pin symbol", NULL, &wp_pin_green_large_pixbuf, NULL }, + { "Pin, Red", "pin_red", 8289, "red pin symbol", NULL, &wp_pin_red_large_pixbuf, NULL }, + { "Block, Blue", "block_blue", 8290, "blue block symbol", NULL, &wp_block_blue_large_pixbuf, NULL }, + { "Block, Green", "block_green", 8291, "green block symbol", NULL, &wp_block_green_large_pixbuf, NULL }, + { "Block, Red", "block_red", 8292, "red block symbol", NULL, &wp_block_red_large_pixbuf, NULL }, + { "Bike Trail", "bike_trail", 8293, "bike trail symbol", NULL, &wp_bike_trail_large_pixbuf, NULL }, + { "Circle, Red", "circle_red", 8294, "red circle symbol", NULL, NULL, NULL }, + { "Circle, Green", "circle_green", 8295, "green circle symbol", NULL, NULL, NULL }, + { "Circle, Blue", "circle_blue", 8296, "blue circle symbol", NULL, NULL, NULL }, + { "Diamond, Blue", "diamond_blue", 8299, "blue diamond symbol", NULL, NULL, NULL }, + { "Oval, Red", "oval_red", 8300, "red oval symbol", NULL, NULL, NULL }, + { "Oval, Green", "oval_green", 8301, "green oval symbol", NULL, NULL, NULL }, + { "Oval, Blue", "oval_blue", 8302, "blue oval symbol", NULL, NULL, NULL }, + { "Rectangle, Red", "rect_red", 8303, "red rectangle symbol", NULL, NULL, NULL }, + { "Rectangle, Green", "rect_green", 8304, "green rectangle symbol", NULL, NULL, NULL }, + { "Rectangle, Blue", "rect_blue", 8305, "blue rectangle symbol", NULL, NULL, NULL }, + { "Square, Blue", "square_blue", 8308, "blue square symbol", NULL, NULL, NULL }, + { "Letter A, Red", "letter_a_red", 8309, "red letter 'A' symbol", NULL, NULL, NULL }, + { "Letter B, Red", "letter_b_red", 8310, "red letter 'B' symbol", NULL, NULL, NULL }, + { "Letter C, Red", "letter_c_red", 8311, "red letter 'C' symbol", NULL, NULL, NULL }, + { "Letter D, Red", "letter_d_red", 8312, "red letter 'D' symbol", NULL, NULL, NULL }, + { "Letter A, Green", "letter_a_green", 8313, "green letter 'A' symbol", NULL, NULL, NULL }, + { "Letter C, Green", "letter_c_green", 8314, "green letter 'C' symbol", NULL, NULL, NULL }, + { "Letter B, Green", "letter_b_green", 8315, "green letter 'B' symbol", NULL, NULL, NULL }, + { "Letter D, Green", "letter_d_green", 8316, "green letter 'D' symbol", NULL, NULL, NULL }, + { "Letter A, Blue", "letter_a_blue", 8317, "blue letter 'A' symbol", NULL, NULL, NULL }, + { "Letter B, Blue", "letter_b_blue", 8318, "blue letter 'B' symbol", NULL, NULL, NULL }, + { "Letter C, Blue", "letter_c_blue", 8319, "blue letter 'C' symbol", NULL, NULL, NULL }, + { "Letter D, Blue", "letter_d_blue", 8320, "blue letter 'D' symbol", NULL, NULL, NULL }, + { "Number 0, Red", "number_0_red", 8321, "red number '0' symbol", NULL, NULL, NULL }, + { "Number 1, Red", "number_1_red", 8322, "red number '1' symbol", NULL, NULL, NULL }, + { "Number 2, Red", "number_2_red", 8323, "red number '2' symbol", NULL, NULL, NULL }, + { "Number 3, Red", "number_3_red", 8324, "red number '3' symbol", NULL, NULL, NULL }, + { "Number 4, Red", "number_4_red", 8325, "red number '4' symbol", NULL, NULL, NULL }, + { "Number 5, Red", "number_5_red", 8326, "red number '5' symbol", NULL, NULL, NULL }, + { "Number 6, Red", "number_6_red", 8327, "red number '6' symbol", NULL, NULL, NULL }, + { "Number 7, Red", "number_7_red", 8328, "red number '7' symbol", NULL, NULL, NULL }, + { "Number 8, Red", "number_8_red", 8329, "red number '8' symbol", NULL, NULL, NULL }, + { "Number 9, Red", "number_9_red", 8330, "red number '9' symbol", NULL, NULL, NULL }, + { "Number 0, Green", "number_0_green", 8331, "green number '0' symbol", NULL, NULL, NULL }, + { "Number 1, Green", "number_1_green", 8332, "green number '1' symbol", NULL, NULL, NULL }, + { "Number 2, Green", "number_2_green", 8333, "green number '2' symbol", NULL, NULL, NULL }, + { "Number 3, Green", "number_3_green", 8334, "green number '3' symbol", NULL, NULL, NULL }, + { "Number 4, Green", "number_4_green", 8335, "green number '4' symbol", NULL, NULL, NULL }, + { "Number 5, Green", "number_5_green", 8336, "green number '5' symbol", NULL, NULL, NULL }, + { "Number 6, Green", "number_6_green", 8337, "green number '6' symbol", NULL, NULL, NULL }, + { "Number 7, Green", "number_7_green", 8338, "green number '7' symbol", NULL, NULL, NULL }, + { "Number 8, Green", "number_8_green", 8339, "green number '8' symbol", NULL, NULL, NULL }, + { "Number 9, Green", "number_9_green", 8340, "green number '9' symbol", NULL, NULL, NULL }, + { "Number 0, Blue", "number_0_blue", 8341, "blue number '0' symbol", NULL, NULL, NULL }, + { "Number 1, Blue", "number_1_blue", 8342, "blue number '1' symbol", NULL, NULL, NULL }, + { "Number 2, Blue", "number_2_blue", 8343, "blue number '2' symbol", NULL, NULL, NULL }, + { "Number 3, Blue", "number_3_blue", 8344, "blue number '3' symbol", NULL, NULL, NULL }, + { "Number 4, Blue", "number_4_blue", 8345, "blue number '4' symbol", NULL, NULL, NULL }, + { "Number 5, Blue", "number_5_blue", 8346, "blue number '5' symbol", NULL, NULL, NULL }, + { "Number 6, Blue", "number_6_blue", 8347, "blue number '6' symbol", NULL, NULL, NULL }, + { "Number 7, Blue", "number_7_blue", 8348, "blue number '7' symbol", NULL, NULL, NULL }, + { "Number 8, Blue", "number_8_blue", 8349, "blue number '8' symbol", NULL, NULL, NULL }, + { "Number 9, Blue", "number_9_blue", 8350, "blue number '9' symbol", NULL, NULL, NULL }, + { "Triangle, Blue", "triangle_blue", 8351, "blue triangle symbol", NULL, NULL, NULL }, + { "Triangle, Green", "triangle_green", 8352, "green triangle symbol", NULL, NULL, NULL }, + { "Triangle, Red", "triangle_red", 8353, "red triangle symbol", NULL, NULL, NULL }, + /*--------------------------------------------------------------- + Hunter symbols + ---------------------------------------------------------------*/ + { "Upland Game", "upland_game", 9000, "upland game symbol", NULL, &wp_upland_game_large_pixbuf, NULL }, + { "Waterfowl", "waterfowl", 9001, "waterfowl symbol", NULL, &wp_waterfowl_large_pixbuf, NULL }, + { "Furbearer", "furbearer", 9002, "furbearer symbol", NULL, &wp_furbearer_large_pixbuf, NULL }, + { "Big Game", "big_game", 9003, "big game symbol", NULL, &wp_big_game_large_pixbuf, NULL }, + { "Small Game", "small_game", 9004, "small game symbol", NULL, &wp_small_game_large_pixbuf, NULL }, + { "Covey", "covey", 9005, "covey symbol", NULL, &wp_covey_large_pixbuf, NULL }, + { "Cover", "cover", 9006, "cover symbol", NULL, &wp_cover_large_pixbuf, NULL }, + { "Treed Quarry", "treed_quarry", 9007, "treed quarry symbol", NULL, &wp_treed_quarry_large_pixbuf, NULL }, + { "Water Source", "water_source", 9008, "water source symbol", NULL, &wp_water_source_large_pixbuf, NULL }, + { "Food Source", "food_source", 9009, "food source symbol", NULL, &wp_food_source_large_pixbuf, NULL }, + { "Animal Tracks", "animal_tracks", 9010, "animal tracks symbol", NULL, &wp_animal_tracks_large_pixbuf, NULL }, + { "Blood Trail", "blood_trail", 9011, "blood trail symbol", NULL, &wp_blood_trail_large_pixbuf, NULL }, + { "Truck", "truck", 9012, "truck symbol", NULL, &wp_truck_large_pixbuf, NULL }, + { "ATV", "atv", 9013, "atv symbol", NULL, &wp_atv_large_pixbuf, NULL }, + { "Blind", "blind", 9014, "blind symbol", NULL, &wp_blind_large_pixbuf, NULL }, + { "Tree Stand", "tree_stand", 9015, "tree stand symbol", NULL, &wp_tree_stand_large_pixbuf, NULL }, + /*--------------------------------------------------------------- + Aviation symbols + ---------------------------------------------------------------*/ + { "Airport", "airport", 16384, "airport symbol", &wp_airplane_pixbuf, &wp_airplane_large_pixbuf, NULL }, + { "Intersection", "int", 16385, "intersection symbol", NULL, NULL, NULL }, + { "Non-directional beacon", "ndb", 16386, "non-directional beacon symbol", NULL, NULL, NULL }, + { "VHF Omni-range", "vor", 16387, "VHF omni-range symbol", NULL, NULL, NULL }, + { "Heliport", "heliport", 16388, "heliport symbol", NULL, &wp_helipad_large_pixbuf, NULL }, + { "Private Field", "private", 16389, "private field symbol", NULL, NULL, NULL }, + { "Soft Field", "soft_fld", 16390, "soft field symbol", NULL, NULL, NULL }, + { "Tall Tower", "tall_tower", 16391, "tall tower symbol", NULL, &wp_tall_tower_large_pixbuf, NULL }, + { "Short Tower", "short_tower", 16392, "short tower symbol", NULL, &wp_short_tower_large_pixbuf, NULL }, + { "Glider Area", "glider", 16393, "glider symbol", NULL, &wp_glider_large_pixbuf, NULL }, + { "Ultralight Area", "ultralight", 16394, "ultralight symbol", NULL, &wp_ultralight_large_pixbuf, NULL }, + { "Parachute Area", "parachute", 16395, "parachute symbol", NULL, &wp_parachute_large_pixbuf, NULL }, + { "VOR/TACAN", "vortac", 16396, "VOR/TACAN symbol", NULL, NULL, NULL }, + { "VOR-DME", "vordme", 16397, "VOR-DME symbol", NULL, NULL, NULL }, + { "First approach fix", "faf", 16398, "first approach fix", NULL, NULL, NULL }, + { "Localizer Outer Marker", "lom", 16399, "localizer outer marker", NULL, NULL, NULL }, + { "Missed Approach Point", "map", 16400, "missed approach point", NULL, NULL, NULL }, + { "TACAN", "tacan", 16401, "TACAN symbol", NULL, NULL, NULL }, + { "Seaplane Base", "seaplane", 16402, "Seaplane Base", NULL, NULL, NULL } +}; + +static GHashTable *icons = NULL; +static GHashTable *old_icons = NULL; + +static gboolean str_equal_casefold ( gconstpointer v1, gconstpointer v2 ) { + gboolean equal; + gchar *v1_lower; + gchar *v2_lower; + + v1_lower = g_utf8_casefold ( v1, -1 ); + if (!v1_lower) + return FALSE; + v2_lower = g_utf8_casefold ( v2, -1 ); + if (!v2_lower) { + g_free ( v1_lower ); + return FALSE; + } + + equal = g_str_equal( v1_lower, v2_lower ); + + g_free ( v1_lower ); + g_free ( v2_lower ); + + return equal; +} + +static guint str_hash_casefold ( gconstpointer key ) { + guint h; + gchar *key_lower; + + key_lower = g_utf8_casefold ( key, -1 ); + if (!key_lower) + return 0; + + h = g_str_hash ( key_lower ); + + g_free ( key_lower ); + + return h; +} + +static void init_icons() { + icons = g_hash_table_new_full ( str_hash_casefold, str_equal_casefold, NULL, NULL); + old_icons = g_hash_table_new_full ( str_hash_casefold, str_equal_casefold, NULL, NULL); + gint i; + for (i=0; i + * + * 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., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA + * + */ + +#ifndef __VIKING_GARMINSYMBOLS_H +#define __VIKING_GARMINSYMBOLS_H + +#include +#include +#include + +G_BEGIN_DECLS + +GdkPixbuf *a_get_wp_sym ( const gchar *sym ); +const gchar *a_get_hashed_sym ( const gchar *sym ); +void a_populate_sym_list ( GtkListStore *list ); +/* Use when preferences have changed to reload icons*/ +void clear_garmin_icon_syms (); + +G_END_DECLS + +#endif diff --git a/src/geojson.c b/src/geojson.c new file mode 100644 index 0000000..b6be478 --- /dev/null +++ b/src/geojson.c @@ -0,0 +1,188 @@ +/* -*- Mode: C; indent-tabs-mode: t; c-basic-offset: 4; tab-width: 4 -*- */ +/* + * viking -- GPS Data and Topo Analyzer, Explorer, and Manager + * + * Copyright (c) 2014, Rob Norris + * + * 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., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA + * + * See http://geojson.org/ for the specification + * + */ + +#include "geojson.h" +#include "gpx.h" +#include "globals.h" +#include "vikwindow.h" + +#include +#include +#include + +/** + * Perform any cleanup actions once program has completed running + */ +static void my_watch ( GPid pid, + gint status, + gpointer user_data ) +{ + g_spawn_close_pid ( pid ); +} + +/** + * a_geojson_write_file: + * + * Returns TRUE if successfully written + */ +gboolean a_geojson_write_file ( VikTrwLayer *vtl, FILE *ff ) +{ + gboolean result = FALSE; + + gchar *tmp_filename = a_gpx_write_tmp_file ( vtl, NULL ); + if ( !tmp_filename ) + return result; + + GPid pid; + gint mystdout; + + // geojson program should be on the $PATH + gchar **argv; + argv = g_new (gchar*, 5); + argv[0] = g_strdup (a_geojson_program_export()); + argv[1] = g_strdup ("-f"); + argv[2] = g_strdup ("gpx"); + argv[3] = g_strdup (tmp_filename); + argv[4] = NULL; + + GError *error = NULL; + // TODO: monitor stderr? + if (!g_spawn_async_with_pipes (NULL, argv, NULL, (GSpawnFlags) G_SPAWN_SEARCH_PATH | G_SPAWN_DO_NOT_REAP_CHILD, NULL, NULL, &pid, NULL, &mystdout, NULL, &error)) { + + if ( IS_VIK_WINDOW ((VikWindow *)VIK_GTK_WINDOW_FROM_LAYER(vtl)) ) { + gchar* msg = g_strdup_printf ( _("%s command failed: %s"), argv[0], error->message ); + vik_window_statusbar_update ( (VikWindow*)VIK_GTK_WINDOW_FROM_LAYER(vtl), msg, VIK_STATUSBAR_INFO ); + g_free (msg); + } + else + g_warning ("Async command failed: %s", error->message); + + g_error_free(error); + } + else { + // Probably should use GIOChannels... + gchar line[512]; + FILE *fout = fdopen(mystdout, "r"); + setvbuf(fout, NULL, _IONBF, 0); + + while (fgets(line, sizeof(line), fout)) { + fprintf ( ff, "%s", line ); + } + + fclose(fout); + + g_child_watch_add ( pid, (GChildWatchFunc) my_watch, NULL ); + result = TRUE; + } + + g_strfreev (argv); + + // Delete the temporary file + (void)g_remove (tmp_filename); + g_free (tmp_filename); + + return result; +} + +// +// https://github.com/mapbox/togeojson +// +// https://www.npmjs.org/package/togeojson +// +// Tested with version 0.7.0 +const gchar* a_geojson_program_export ( void ) +{ + return "togeojson"; +} + +// +// https://github.com/tyrasd/togpx +// +// https://www.npmjs.org/package/togpx +// +// Tested with version 0.3.1 +const gchar* a_geojson_program_import ( void ) +{ + return "togpx"; +} + +/** + * a_geojson_import_to_gpx: + * + * @filename: The source GeoJSON file + * + * Returns: The name of newly created temporary GPX file + * This file should be removed once used and the string freed. + * If NULL then the process failed. + */ +gchar* a_geojson_import_to_gpx ( const gchar *filename ) +{ + gchar *gpx_filename = NULL; + GError *error = NULL; + // Opening temporary file + int fd = g_file_open_tmp("vik_geojson_XXXXXX.gpx", &gpx_filename, &error); + if (fd < 0) { + g_warning ( _("failed to open temporary file: %s"), error->message ); + g_clear_error ( &error ); + return NULL; + } + g_debug ( "%s: temporary file = %s", __FUNCTION__, gpx_filename ); + + GPid pid; + gint mystdout; + + // geojson program should be on the $PATH + gchar **argv; + argv = g_new (gchar*, 3); + argv[0] = g_strdup (a_geojson_program_import()); + argv[1] = g_strdup (filename); + argv[2] = NULL; + + FILE *gpxfile = fdopen (fd, "w"); + + // TODO: monitor stderr? + if (!g_spawn_async_with_pipes (NULL, argv, NULL, (GSpawnFlags) G_SPAWN_SEARCH_PATH | G_SPAWN_DO_NOT_REAP_CHILD, NULL, NULL, &pid, NULL, &mystdout, NULL, &error)) { + g_warning ("Async command failed: %s", error->message); + g_error_free(error); + } + else { + // Probably should use GIOChannels... + gchar line[512]; + FILE *fout = fdopen(mystdout, "r"); + setvbuf(fout, NULL, _IONBF, 0); + + while (fgets(line, sizeof(line), fout)) { + fprintf ( gpxfile, "%s", line ); + } + + fclose(fout); + g_child_watch_add ( pid, (GChildWatchFunc) my_watch, NULL ); + } + + fclose (gpxfile); + + g_strfreev (argv); + + return gpx_filename; +} diff --git a/src/geojson.h b/src/geojson.h new file mode 100644 index 0000000..2c89a1a --- /dev/null +++ b/src/geojson.h @@ -0,0 +1,38 @@ +/* -*- Mode: C; indent-tabs-mode: t; c-basic-offset: 4; tab-width: 4 -*- */ +/* + * viking -- GPS Data and Topo Analyzer, Explorer, and Manager + * + * Copyright (c) 2014, Rob Norris + * + * 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., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA + * + */ +#ifndef _VIKING_GEOJSON_H +#define _VIKING_GEOJSON_H + +#include "viktrwlayer.h" + +G_BEGIN_DECLS + +gboolean a_geojson_write_file ( VikTrwLayer *vtl, FILE *ff ); + +const gchar* a_geojson_program_export ( void ); +const gchar* a_geojson_program_import ( void ); + +gchar* a_geojson_import_to_gpx ( const gchar *filename ); + +G_END_DECLS + +#endif diff --git a/src/geonames.c b/src/geonames.c new file mode 100644 index 0000000..f7ef48b --- /dev/null +++ b/src/geonames.c @@ -0,0 +1,44 @@ +/* + * viking -- GPS Data and Topo Analyzer, Explorer, and Manager + * + * Copyright (C) 2009, Guilhem Bonnefille + * + * 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., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA + * + */ +#ifdef HAVE_CONFIG_H +#include "config.h" +#endif + +#include + +#include "geonames.h" + +#include "vikgotoxmltool.h" +#include "vikgoto.h" + +/* initialisation */ +void geonames_init () { + // Goto + VikGotoXmlTool *geonames = VIK_GOTO_XML_TOOL ( g_object_new ( VIK_GOTO_XML_TOOL_TYPE, "label", "Geonames", + "url-format", "http://api.geonames.org/search?q=%s&lang=en&style=short&username="VIK_CONFIG_GEONAMES_USERNAME, + "lat-path", "/geonames/geoname/lat", + "lon-path", "/geonames/geoname/lng", + "desc-path", "/geonames/geoname/toponymName", + NULL ) ); + vik_goto_register ( VIK_GOTO_TOOL ( geonames ) ); + g_object_unref ( geonames ); +} + diff --git a/src/geonames.h b/src/geonames.h new file mode 100644 index 0000000..00c36f2 --- /dev/null +++ b/src/geonames.h @@ -0,0 +1,27 @@ +/* + * viking -- GPS Data and Topo Analyzer, Explorer, and Manager + * + * Copyright (C) 2009, Guilhem Bonnefille + * + * 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., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA + * + */ + +#ifndef __GEONAMES_H +#define __GEONAMES_H + +void geonames_init (); + +#endif diff --git a/src/geonamessearch.c b/src/geonamessearch.c new file mode 100644 index 0000000..b80e36f --- /dev/null +++ b/src/geonamessearch.c @@ -0,0 +1,497 @@ +/* + * viking -- GPS Data and Topo Analyzer, Explorer, and Manager + * + * Copyright (C) 2009, Hein Ragas + * Copyright (C) 2013, Rob Norris + * + * 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., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA + * + */ +#ifdef HAVE_CONFIG_H +#include "config.h" +#endif +#include +#include +#include +#include +#include +#include +#include + +#include "viking.h" +#include "geonamessearch.h" + +/* Compatibility */ +#if ! GLIB_CHECK_VERSION(2,22,0) +#define g_mapped_file_unref g_mapped_file_free +#endif + +// TODO - offer configuration of this value somewhere +// ATM decided it's not essential enough to warrant putting in the preferences +#define GEONAMES_MAX_ENTRIES 20 + +#define GEONAMES_WIKIPEDIA_URL_FMT "http://api.geonames.org/wikipediaBoundingBoxJSON?formatted=true&north=%s&south=%s&east=%s&west=%s&lang=%s&maxRows=%d&username="VIK_CONFIG_GEONAMES_USERNAME + +#define GEONAMES_FEATURE_PATTERN "\"feature\": \"" +#define GEONAMES_LONGITUDE_PATTERN "\"lng\": " +#define GEONAMES_NAME_PATTERN "\"name\": \"" +#define GEONAMES_LATITUDE_PATTERN "\"lat\": " +#define GEONAMES_ELEVATION_PATTERN "\"elevation\": " +#define GEONAMES_TITLE_PATTERN "\"title\": \"" +#define GEONAMES_WIKIPEDIAURL_PATTERN "\"wikipediaUrl\": \"" +#define GEONAMES_THUMBNAILIMG_PATTERN "\"thumbnailImg\": \"" +#define GEONAMES_SEARCH_NOT_FOUND "not understand the location" + +/* found_geoname: Type to contain data returned from GeoNames.org */ + +typedef struct { + gchar *name; + gchar *feature; + struct LatLon ll; + gdouble elevation; + gchar *cmt; + gchar *desc; +} found_geoname; + +static found_geoname *new_found_geoname() +{ + found_geoname *ret; + + ret = (found_geoname *)g_malloc(sizeof(found_geoname)); + ret->name = NULL; + ret->feature = NULL; + ret->cmt = NULL; + ret->desc = NULL; + ret->ll.lat = 0.0; + ret->ll.lon = 0.0; + ret->elevation = VIK_DEFAULT_ALTITUDE; + return ret; +} + +static found_geoname *copy_found_geoname(found_geoname *src) +{ + found_geoname *dest = new_found_geoname(); + dest->name = g_strdup(src->name); + dest->feature = g_strdup(src->feature); + dest->ll.lat = src->ll.lat; + dest->ll.lon = src->ll.lon; + dest->elevation = src->elevation; + dest->cmt = g_strdup(src->cmt); + dest->desc = g_strdup(src->desc); + return(dest); +} + +static void free_list_geonames(found_geoname *geoname, gpointer userdata) +{ + g_free(geoname->name); + g_free(geoname->feature); + g_free(geoname->cmt); + g_free(geoname->desc); +} + +static void free_geoname_list(GList *found_places) +{ + g_list_foreach(found_places, (GFunc)free_list_geonames, NULL); + g_list_free(found_places); +} + +static void none_found(VikWindow *vw) +{ + GtkWidget *dialog = NULL; + + dialog = gtk_dialog_new_with_buttons ( "", GTK_WINDOW(vw), 0, GTK_STOCK_OK, GTK_RESPONSE_ACCEPT, NULL ); + gtk_window_set_title(GTK_WINDOW(dialog), _("Search")); + + GtkWidget *search_label = gtk_label_new(_("No entries found!")); + gtk_box_pack_start ( GTK_BOX(gtk_dialog_get_content_area(GTK_DIALOG(dialog))), search_label, FALSE, FALSE, 5 ); + gtk_dialog_set_default_response ( GTK_DIALOG(dialog), GTK_RESPONSE_ACCEPT ); + gtk_widget_show_all(dialog); + + gtk_dialog_run ( GTK_DIALOG(dialog) ); + gtk_widget_destroy(dialog); +} + +static GList *a_select_geoname_from_list(GtkWindow *parent, GList *geonames, gboolean multiple_selection_allowed, const gchar *title, const gchar *msg) +{ + GtkTreeIter iter; + GtkCellRenderer *renderer; + GtkWidget *view; + found_geoname *geoname; + gchar *latlon_string; + int column_runner; + + GtkWidget *dialog = gtk_dialog_new_with_buttons (title, + parent, + GTK_DIALOG_MODAL | GTK_DIALOG_DESTROY_WITH_PARENT, + GTK_STOCK_CANCEL, + GTK_RESPONSE_REJECT, + GTK_STOCK_OK, + GTK_RESPONSE_ACCEPT, + NULL); + /* When something is selected then OK */ + gtk_dialog_set_default_response ( GTK_DIALOG(dialog), GTK_RESPONSE_ACCEPT ); + GtkWidget *response_w = NULL; +#if GTK_CHECK_VERSION (2, 20, 0) + /* Default to not apply - as initially nothing is selected! */ + response_w = gtk_dialog_get_widget_for_response ( GTK_DIALOG(dialog), GTK_RESPONSE_REJECT ); +#endif + GtkWidget *label = gtk_label_new ( msg ); + GtkTreeStore *store = gtk_tree_store_new(3, G_TYPE_STRING, G_TYPE_STRING, G_TYPE_STRING); + + GList *geoname_runner = geonames; + while (geoname_runner) + { + geoname = (found_geoname *)geoname_runner->data; + latlon_string = g_strdup_printf("(%f,%f)", geoname->ll.lat, geoname->ll.lon); + gtk_tree_store_append(store, &iter, NULL); + gtk_tree_store_set(store, &iter, 0, geoname->name, 1, geoname->feature, 2, latlon_string, -1); + geoname_runner = g_list_next(geoname_runner); + g_free(latlon_string); + } + + view = gtk_tree_view_new(); + renderer = gtk_cell_renderer_text_new(); + column_runner = 0; + GtkTreeViewColumn *column; + // NB could allow columns to be shifted around by doing this after each new + // gtk_tree_view_column_set_reorderable ( column, TRUE ); + // However I don't think is that useful, so I haven't put it in + column = gtk_tree_view_column_new_with_attributes( _("Name"), renderer, "text", column_runner, NULL); + gtk_tree_view_column_set_sort_column_id (column, column_runner); + gtk_tree_view_append_column (GTK_TREE_VIEW (view), column); + + column_runner++; + column = gtk_tree_view_column_new_with_attributes( _("Feature"), renderer, "text", column_runner, NULL); + gtk_tree_view_column_set_sort_column_id (column, column_runner); + gtk_tree_view_append_column (GTK_TREE_VIEW (view), column); + + column_runner++; + column = gtk_tree_view_column_new_with_attributes( _("Lat/Lon"), renderer, "text", column_runner, NULL); + gtk_tree_view_column_set_sort_column_id (column, column_runner); + gtk_tree_view_append_column (GTK_TREE_VIEW (view), column); + + gtk_tree_view_set_model(GTK_TREE_VIEW(view), GTK_TREE_MODEL(store)); + gtk_tree_selection_set_mode( gtk_tree_view_get_selection(GTK_TREE_VIEW(view)), + multiple_selection_allowed ? GTK_SELECTION_MULTIPLE : GTK_SELECTION_BROWSE ); + g_object_unref(store); + + GtkWidget *scrolledwindow = gtk_scrolled_window_new ( NULL, NULL ); + gtk_scrolled_window_set_policy ( GTK_SCROLLED_WINDOW(scrolledwindow), GTK_POLICY_NEVER, GTK_POLICY_AUTOMATIC ); + gtk_container_add ( GTK_CONTAINER(scrolledwindow), view ); + + gtk_box_pack_start (GTK_BOX(gtk_dialog_get_content_area(GTK_DIALOG(dialog))), label, FALSE, FALSE, 0); + gtk_box_pack_start (GTK_BOX(gtk_dialog_get_content_area(GTK_DIALOG(dialog))), scrolledwindow, TRUE, TRUE, 0); + + // Ensure a reasonable number of items are shown, but let the width be automatically sized + gtk_widget_set_size_request ( dialog, -1, 400) ; + gtk_widget_show_all ( dialog ); + + if ( response_w ) + gtk_widget_grab_focus ( response_w ); + + while ( gtk_dialog_run (GTK_DIALOG (dialog)) == GTK_RESPONSE_ACCEPT ) + { + GtkTreeSelection *selection = gtk_tree_view_get_selection(GTK_TREE_VIEW(view)); + GList *selected_geonames = NULL; + + // Possibily not the fastest method but we don't have thousands of entries to process... + if ( gtk_tree_model_get_iter_first( GTK_TREE_MODEL(store), &iter) ) { + do { + if ( gtk_tree_selection_iter_is_selected ( selection, &iter ) ) { + // For every selected item, + // compare the name from the displayed view to every geoname entry to find the geoname this selection represents + gchar* name; + gtk_tree_model_get (GTK_TREE_MODEL(store), &iter, 0, &name, -1 ); + // I believe the name of these items to be always unique + geoname_runner = geonames; + while ( geoname_runner ) { + if ( !strcmp ( ((found_geoname*)geoname_runner->data)->name, name ) ) { + found_geoname *copied = copy_found_geoname(geoname_runner->data); + selected_geonames = g_list_prepend(selected_geonames, copied); + break; + } + geoname_runner = g_list_next(geoname_runner); + } + g_free ( name ); + } + } + while ( gtk_tree_model_iter_next ( GTK_TREE_MODEL(store), &iter ) ); + } + + if (selected_geonames) + { + gtk_widget_destroy ( dialog ); + return selected_geonames; + } + a_dialog_error_msg(parent, _("Nothing was selected")); + } + gtk_widget_destroy ( dialog ); + return NULL; +} + +static GList *get_entries_from_file(gchar *file_name) +{ + gchar *text, *pat; + GMappedFile *mf; + gsize len; + gboolean more = TRUE; + gchar lat_buf[32], lon_buf[32], elev_buf[32]; + gchar *s; + gint fragment_len; + GList *found_places = NULL; + found_geoname *geoname = NULL; + gchar **found_entries; + gchar *entry; + int entry_runner; + gchar *wikipedia_url = NULL; + gchar *thumbnail_url = NULL; + + lat_buf[0] = lon_buf[0] = elev_buf[0] = '\0'; + + if ((mf = g_mapped_file_new(file_name, FALSE, NULL)) == NULL) { + g_critical(_("couldn't map temp file")); + return NULL; + } + len = g_mapped_file_get_length(mf); + text = g_mapped_file_get_contents(mf); + + if (g_strstr_len(text, len, GEONAMES_SEARCH_NOT_FOUND) != NULL) { + more = FALSE; + } + found_entries = g_strsplit(text, "},", 0); + entry_runner = 0; + entry = found_entries[entry_runner]; + while (entry) + { + more = TRUE; + geoname = new_found_geoname(); + if ((pat = g_strstr_len(entry, strlen(entry), GEONAMES_FEATURE_PATTERN))) { + pat += strlen(GEONAMES_FEATURE_PATTERN); + fragment_len = 0; + s = pat; + while (*pat != '"') { + fragment_len++; + pat++; + } + geoname->feature = g_strndup(s, fragment_len); + } + if ((pat = g_strstr_len(entry, strlen(entry), GEONAMES_LONGITUDE_PATTERN)) == NULL) { + more = FALSE; + } + else { + pat += strlen(GEONAMES_LONGITUDE_PATTERN); + s = lon_buf; + if (*pat == '-') + *s++ = *pat++; + while ((s < (lon_buf + sizeof(lon_buf))) && (pat < (text + len)) && + (g_ascii_isdigit(*pat) || (*pat == '.'))) + *s++ = *pat++; + *s = '\0'; + if ((pat >= (text + len)) || (lon_buf[0] == '\0')) { + more = FALSE; + } + geoname->ll.lon = g_ascii_strtod(lon_buf, NULL); + } + if ((pat = g_strstr_len(entry, strlen(entry), GEONAMES_ELEVATION_PATTERN))) { + pat += strlen(GEONAMES_ELEVATION_PATTERN); + s = elev_buf; + if (*pat == '-') + *s++ = *pat++; + while ((s < (elev_buf + sizeof(elev_buf))) && (pat < (text + len)) && + (g_ascii_isdigit(*pat) || (*pat == '.'))) + *s++ = *pat++; + *s = '\0'; + geoname->elevation = g_ascii_strtod(elev_buf, NULL); + } + if ((pat = g_strstr_len(entry, strlen(entry), GEONAMES_NAME_PATTERN))) { + pat += strlen(GEONAMES_NAME_PATTERN); + fragment_len = 0; + s = pat; + while (*pat != '"') { + fragment_len++; + pat++; + } + geoname -> name = g_strndup(s, fragment_len); + } + if ((pat = g_strstr_len(entry, strlen(entry), GEONAMES_TITLE_PATTERN))) { + pat += strlen(GEONAMES_TITLE_PATTERN); + fragment_len = 0; + s = pat; + while (*pat != '"') { + fragment_len++; + pat++; + } + geoname -> name = g_strndup(s, fragment_len); + } + if ((pat = g_strstr_len(entry, strlen(entry), GEONAMES_WIKIPEDIAURL_PATTERN))) { + pat += strlen(GEONAMES_WIKIPEDIAURL_PATTERN); + fragment_len = 0; + s = pat; + while (*pat != '"') { + fragment_len++; + pat++; + } + wikipedia_url = g_strndup(s, fragment_len); + } + if ((pat = g_strstr_len(entry, strlen(entry), GEONAMES_THUMBNAILIMG_PATTERN))) { + pat += strlen(GEONAMES_THUMBNAILIMG_PATTERN); + fragment_len = 0; + s = pat; + while (*pat != '"') { + fragment_len++; + pat++; + } + thumbnail_url = g_strndup(s, fragment_len); + } + if ((pat = g_strstr_len(entry, strlen(entry), GEONAMES_LATITUDE_PATTERN)) == NULL) { + more = FALSE; + } + else { + pat += strlen(GEONAMES_LATITUDE_PATTERN); + s = lat_buf; + if (*pat == '-') + *s++ = *pat++; + while ((s < (lat_buf + sizeof(lat_buf))) && (pat < (text + len)) && + (g_ascii_isdigit(*pat) || (*pat == '.'))) + *s++ = *pat++; + *s = '\0'; + if ((pat >= (text + len)) || (lat_buf[0] == '\0')) { + more = FALSE; + } + geoname->ll.lat = g_ascii_strtod(lat_buf, NULL); + } + if (!more) { + if (geoname) { + g_free(geoname); + } + } + else { + if (wikipedia_url) { + // Really we should support the GPX URL tag and then put that in there... + geoname->cmt = g_strdup_printf("http://%s", wikipedia_url); + if (thumbnail_url) { + geoname -> desc = g_strdup_printf("", wikipedia_url, thumbnail_url); + } + else { + geoname -> desc = g_strdup_printf("%s", wikipedia_url, geoname->name); + } + } + if (wikipedia_url) { + g_free(wikipedia_url); + wikipedia_url = NULL; + } + if (thumbnail_url) { + g_free(thumbnail_url); + thumbnail_url = NULL; + } + found_places = g_list_prepend(found_places, geoname); + } + entry_runner++; + entry = found_entries[entry_runner]; + } + g_strfreev(found_entries); + found_places = g_list_reverse(found_places); + g_mapped_file_unref(mf); + return(found_places); +} + +void a_geonames_wikipedia_box ( VikWindow *vw, VikTrwLayer *vtl, LatLonBBox bbox ) +{ + gchar *uri; + gchar *tmpname; + GList *wiki_places; + GList *selected; + GList *wp_runner; + VikWaypoint *wiki_wp; + found_geoname *wiki_geoname; + + /** + * See http://www.geonames.org/export/wikipedia-webservice.html#wikipediaBoundingBox + */ + // Wikipedia articles supported languages are de,en,es,fr,it,nl,pl,pt,ru,zh (default = en) + gboolean got_language = FALSE; + const gchar *language = g_getenv("LANGUAGE"); + gchar lang[3] = "en"; + if (strlen(language) > 1) { + got_language = TRUE; + } else { + language = g_getenv("LANG"); + if (strlen(language) > 1) + got_language = TRUE; + } + if ( got_language ) { + lang[0] = language[0]; + lang[1] = language[1]; + } + + /* encode doubles in a C locale */ + gchar *north = a_coords_dtostr(bbox.north); + gchar *south = a_coords_dtostr(bbox.south); + gchar *east = a_coords_dtostr(bbox.east); + gchar *west = a_coords_dtostr(bbox.west); + uri = g_strdup_printf ( GEONAMES_WIKIPEDIA_URL_FMT, north, south, east, west, lang, GEONAMES_MAX_ENTRIES ); + g_free(north); north = NULL; + g_free(south); south = NULL; + g_free(east); east = NULL; + g_free(west); west = NULL; + tmpname = a_download_uri_to_tmp_file ( uri, NULL ); + if (!tmpname) { + none_found(vw); + return; + } + wiki_places = get_entries_from_file(tmpname); + if (g_list_length(wiki_places) == 0) { + none_found(vw); + goto done; + } + selected = a_select_geoname_from_list(VIK_GTK_WINDOW_FROM_WIDGET(vw), wiki_places, TRUE, _("Select articles"), _("Select the articles you want to add.")); + wp_runner = selected; + while (wp_runner) { + wiki_geoname = (found_geoname *)wp_runner->data; + wiki_wp = vik_waypoint_new(); + wiki_wp->visible = TRUE; + vik_coord_load_from_latlon(&(wiki_wp->coord), vik_trw_layer_get_coord_mode ( vtl ), &(wiki_geoname->ll)); + wiki_wp->altitude = wiki_geoname->elevation; + vik_waypoint_set_comment(wiki_wp, wiki_geoname->cmt); + vik_waypoint_set_description(wiki_wp, wiki_geoname->desc); + // Use the featue type to generate a suitable waypoint icon + // http://www.geonames.org/wikipedia/wikipedia_features.html + // Only a few values supported as only a few symbols make sense + // The feature name may not be translated + // Double check the english and the translated + if ( wiki_geoname->feature ) { + if ( !strcmp (wiki_geoname->feature, "city") || !strcmp (wiki_geoname->feature, _("city"))) + vik_waypoint_set_symbol(wiki_wp, "city (medium)"); + if ( !strcmp (wiki_geoname->feature, "edu") || !strcmp (wiki_geoname->feature, _("edu"))) + vik_waypoint_set_symbol(wiki_wp, "school"); + if ( !strcmp (wiki_geoname->feature, "airport") || !strcmp (wiki_geoname->feature, _("airport"))) + vik_waypoint_set_symbol(wiki_wp, "airport"); + if ( !strcmp (wiki_geoname->feature, "mountain") || !strcmp (wiki_geoname->feature, _("mountain"))) + vik_waypoint_set_symbol(wiki_wp, "summit"); + if ( !strcmp (wiki_geoname->feature, "forest") || !strcmp (wiki_geoname->feature, _("forest"))) + vik_waypoint_set_symbol(wiki_wp, "forest"); + if ( !strcmp (wiki_geoname->feature, "church") || !strcmp (wiki_geoname->feature, _("church"))) + vik_waypoint_set_symbol(wiki_wp, "church"); + } + vik_trw_layer_filein_add_waypoint ( vtl, wiki_geoname->name, wiki_wp ); + wp_runner = g_list_next(wp_runner); + } + free_geoname_list(wiki_places); + free_geoname_list(selected); + g_free(uri); +done: + (void)util_remove(tmpname); + g_free(tmpname); +} diff --git a/src/geonamessearch.h b/src/geonamessearch.h new file mode 100644 index 0000000..1052a40 --- /dev/null +++ b/src/geonamessearch.h @@ -0,0 +1,33 @@ +/* + * viking -- GPS Data and Topo Analyzer, Explorer, and Manager + * + * Copyright (C) 2009, Hein Ragas + * + * 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., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA + * + */ +#ifndef __VIK_GEONAMESSEARCH_H +#define __VIK_GEONAMESSEARCH_H + +#include "viking.h" + +G_BEGIN_DECLS + +/* Finding Wikipedia entries within a certain box */ +void a_geonames_wikipedia_box ( VikWindow *vw, VikTrwLayer *vtl, LatLonBBox bbox ); + +G_END_DECLS + +#endif diff --git a/src/geotag_exif.c b/src/geotag_exif.c new file mode 100644 index 0000000..0e879a3 --- /dev/null +++ b/src/geotag_exif.c @@ -0,0 +1,906 @@ +/* -*- Mode: C; indent-tabs-mode: t; c-basic-offset: 4; tab-width: 4 -*- */ +/* + * viking -- GPS Data and Topo Analyzer, Explorer, and Manager + * + * Copyright (C) 2011-2014, Rob Norris + * + * 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., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA + * + */ + +/* + * This uses EXIF information from images to create waypoints at those positions + * + * The initial implementation uses libexif, which keeps Viking a pure C program. + * Now libgexiv2 is available (in C as a wrapper around the more powerful libexiv2 [C++]) so this is the preferred build. + * The attentative reader will notice the use of gexiv2 is a lot simpler as well. + * For the time being the libexif code + build is still made available. + */ +#include +#include "geotag_exif.h" +#include "config.h" +#include "globals.h" +#include "file.h" + +#include +#ifdef HAVE_UTIME_H +#include +#endif +#include +#include +#include +#include +#include +#ifdef HAVE_LIBGEXIV2 +#include +#endif +#ifdef HAVE_LIBEXIF +#include +#include "libjpeg/jpeg-data.h" +#endif + +#define EXIF_GPS_IMGDIR "Exif.GPSInfo.GPSImgDirection" +#define EXIF_GPS_IMGDIR_REF "Exif.GPSInfo.GPSImgDirectionRef" + +#ifdef HAVE_LIBGEXIV2 +// Compatibility +static void metadata_free ( GExiv2Metadata *gemd ) +{ +#if GEXIV2_CHECK_VERSION (0,10,4) + g_object_unref ( gemd ); +#else + gexiv2_metadata_free ( gemd ); +#endif +} + +/** + * Attempt to get a single comment from the various exif fields + */ +static gchar* geotag_get_exif_comment ( GExiv2Metadata *gemd ) +{ + // + // Try various options to create a comment + // + if ( gexiv2_metadata_has_tag ( gemd, "Exif.Image.ImageDescription" ) ) + return g_strdup ( gexiv2_metadata_get_tag_interpreted_string ( gemd, "Exif.Image.ImageDescription" ) ); + + if ( gexiv2_metadata_has_tag ( gemd, "Exif.Image.XPComment" ) ) + return g_strdup ( gexiv2_metadata_get_tag_interpreted_string ( gemd, "Exif.Image.XPComment" ) ); + + if ( gexiv2_metadata_has_tag ( gemd, "Exif.Image.XPSubject" ) ) + return g_strdup ( gexiv2_metadata_get_tag_interpreted_string ( gemd, "Exif.Image.XPSubject" ) ); + + if ( gexiv2_metadata_has_tag ( gemd, "Exif.Image.DateTimeOriginal" ) ) + return g_strdup ( gexiv2_metadata_get_tag_interpreted_string ( gemd, "Exif.Image.DateTimeOriginal" ) ); + + // Otherwise nothing found + return NULL; +} +#endif + +#ifdef HAVE_LIBEXIF +/** + * Attempt to get a single comment from the various exif fields + */ +static gchar* geotag_get_exif_comment ( ExifData *ed ) +{ + gchar str[128]; + ExifEntry *ee; + // + // Try various options to create a comment + // + ee = exif_content_get_entry (ed->ifd[EXIF_IFD_0], EXIF_TAG_IMAGE_DESCRIPTION); + if ( ee ) { + exif_entry_get_value ( ee, str, 128 ); + return g_strdup ( str ); + } + + ee = exif_content_get_entry (ed->ifd[EXIF_IFD_0], EXIF_TAG_XP_COMMENT); + if ( ee ) { + exif_entry_get_value ( ee, str, 128 ); + return g_strdup ( str ); + } + + ee = exif_content_get_entry (ed->ifd[EXIF_IFD_0], EXIF_TAG_XP_SUBJECT); + if ( ee ) { + exif_entry_get_value ( ee, str, 128 ); + return g_strdup ( str ); + } + + // Consider using these for existing GPS info?? + //#define EXIF_TAG_GPS_TIME_STAMP 0x0007 + //#define EXIF_TAG_GPS_DATE_STAMP 0x001d + ee = exif_content_get_entry (ed->ifd[EXIF_IFD_EXIF], EXIF_TAG_DATE_TIME_ORIGINAL); + if ( ee ) { + exif_entry_get_value ( ee, str, 128 ); + return g_strdup ( str ); + } + + // Otherwise nothing found + return NULL; +} + +/** + * Handles 3 part location Rationals + * Handles 1 part rational (must specify 0 for the offset) + */ +static gdouble Rational2Double ( unsigned char *data, int offset, ExifByteOrder order ) +{ + // Explaination from GPS Correlate 'exif-gps.cpp' v 1.6.1 + // What we are trying to do here is convert the three rationals: + // dd/v mm/v ss/v + // To a decimal + // dd.dddddd... + // dd/v is easy: result = dd/v. + // mm/v is harder: + // mm + // -- / 60 = result. + // v + // ss/v is sorta easy. + // ss + // -- / 3600 = result + // v + // Each part is added to the final number. + gdouble ans; + ExifRational er; + er = exif_get_rational (data, order); + ans = (gdouble)er.numerator / (gdouble)er.denominator; + if (offset <= 0) + return ans; + + er = exif_get_rational (data+(1*offset), order); + ans = ans + ( ( (gdouble)er.numerator / (gdouble)er.denominator ) / 60.0 ); + er = exif_get_rational (data+(2*offset), order); + ans = ans + ( ( (gdouble)er.numerator / (gdouble)er.denominator ) / 3600.0 ); + + return ans; +} + +static struct LatLon get_latlon ( ExifData *ed ) +{ + struct LatLon ll = { 0.0, 0.0 }; + const struct LatLon ll0 = { 0.0, 0.0 }; + + gchar str[128]; + ExifEntry *ee; + // + // Lat & Long is necessary to form a waypoint. + // + ee = exif_content_get_entry (ed->ifd[EXIF_IFD_GPS], EXIF_TAG_GPS_LATITUDE); + if ( ! ( ee && ee->components == 3 && ee->format == EXIF_FORMAT_RATIONAL ) ) + return ll0; + + ll.lat = Rational2Double ( ee->data, + exif_format_get_size(ee->format), + exif_data_get_byte_order(ed) ); + + ee = exif_content_get_entry (ed->ifd[EXIF_IFD_GPS], EXIF_TAG_GPS_LATITUDE_REF); + if ( ee ) { + exif_entry_get_value ( ee, str, 128 ); + if ( str[0] == 'S' ) + ll.lat = -ll.lat; + } + + ee = exif_content_get_entry (ed->ifd[EXIF_IFD_GPS], EXIF_TAG_GPS_LONGITUDE); + if ( ! ( ee && ee->components == 3 && ee->format == EXIF_FORMAT_RATIONAL ) ) + return ll0; + + ll.lon = Rational2Double ( ee->data, + exif_format_get_size(ee->format), + exif_data_get_byte_order(ed) ); + + ee = exif_content_get_entry (ed->ifd[EXIF_IFD_GPS], EXIF_TAG_GPS_LONGITUDE_REF); + if ( ee ) { + exif_entry_get_value ( ee, str, 128 ); + if ( str[0] == 'W' ) + ll.lon = -ll.lon; + } + + return ll; +} +#endif + +/** + * a_geotag_get_position: + * + * @filename: The (JPG) file with EXIF information in it + * + * Returns: The position in LatLon format. + * It will be 0,0 if some kind of failure occurs. + */ +struct LatLon a_geotag_get_position ( const gchar *filename ) +{ + struct LatLon ll = { 0.0, 0.0 }; + +#ifdef HAVE_LIBGEXIV2 + GExiv2Metadata *gemd = gexiv2_metadata_new (); + if ( gexiv2_metadata_open_path ( gemd, filename, NULL ) ) { + gdouble lat; + gdouble lon; + gdouble alt; + if ( gexiv2_metadata_get_gps_info ( gemd, &lon, &lat, &alt ) ) { + ll.lat = lat; + ll.lon = lon; + } + } + metadata_free ( gemd ); +#else +#ifdef HAVE_LIBEXIF + // open image with libexif + ExifData *ed = exif_data_new_from_file ( filename ); + + // Detect EXIF load failure + if ( !ed ) + return ll; + + ExifEntry *ee = exif_content_get_entry (ed->ifd[EXIF_IFD_GPS], EXIF_TAG_GPS_VERSION_ID); + // Confirm this has a GPS Id - normally "2.0.0.0" or "2.2.0.0" + if ( ! ( ee && ee->components == 4 ) ) + goto MyReturn0; + + ll = get_latlon ( ed ); + +MyReturn0: + // Finished with EXIF + exif_data_free ( ed ); +#endif +#endif + + return ll; +} + +/** + * a_geotag_create_waypoint_from_file: + * @filename: The image file to process + * @vcmode: The current location mode to use in the positioning of Waypoint + * @name: Returns a name for the Waypoint (can be NULL) + * + * Returns: An allocated Waypoint or NULL if Waypoint could not be generated (e.g. no EXIF info) + * + */ +VikWaypoint* a_geotag_create_waypoint_from_file ( const gchar *filename, VikCoordMode vcmode, gchar **name ) +{ + // Default return values (for failures) + *name = NULL; + VikWaypoint *wp = NULL; + +#ifdef HAVE_LIBGEXIV2 + GExiv2Metadata *gemd = gexiv2_metadata_new (); + if ( gexiv2_metadata_open_path ( gemd, filename, NULL ) ) { + gdouble lat; + gdouble lon; + gdouble alt; + if ( gexiv2_metadata_get_gps_info ( gemd, &lon, &lat, &alt ) ) { + struct LatLon ll; + ll.lat = lat; + ll.lon = lon; + + // + // Now create Waypoint with acquired information + // + wp = vik_waypoint_new(); + wp->visible = TRUE; + // Set info from exif values + // Location + vik_coord_load_from_latlon ( &(wp->coord), vcmode, &ll ); + // Altitude + wp->altitude = alt; + + if ( gexiv2_metadata_has_tag ( gemd, "Exif.Image.XPTitle" ) ) + *name = g_strdup ( gexiv2_metadata_get_tag_interpreted_string ( gemd, "Exif.Image.XPTitle" ) ); + wp->comment = geotag_get_exif_comment ( gemd ); + + // Direction + VikWaypointImageDirectionRef ref = WP_IMAGE_DIRECTION_REF_TRUE; + if ( gexiv2_metadata_has_tag ( gemd, EXIF_GPS_IMGDIR_REF ) ) { + gchar* ref_str = gexiv2_metadata_get_tag_interpreted_string(gemd, EXIF_GPS_IMGDIR_REF); + if ( ref_str && g_ascii_strncasecmp ("M", ref_str, 1) == 0 ) + ref = WP_IMAGE_DIRECTION_REF_MAGNETIC; + g_free ( ref_str ); + } + if ( gexiv2_metadata_has_tag ( gemd, EXIF_GPS_IMGDIR ) ) { + gint nom; + gint den; + gdouble direction = NAN; + if ( gexiv2_metadata_get_exif_tag_rational (gemd, EXIF_GPS_IMGDIR, &nom, &den) ) + if ( den != 0 ) + direction = (gdouble)nom/(gdouble)den; + + if ( !isnan(direction) ) + vik_waypoint_set_image_direction_info ( wp, direction, ref ); + } + + vik_waypoint_set_image ( wp, filename ); + } + } + metadata_free ( gemd ); +#else +#ifdef HAVE_LIBEXIF + // TODO use log? + //ExifLog *log = NULL; + + // open image with libexif + ExifData *ed = exif_data_new_from_file ( filename ); + + // Detect EXIF load failure + if ( !ed ) + // return with no Waypoint + return wp; + + struct LatLon ll; + + gchar str[128]; + ExifEntry *ee; + + ee = exif_content_get_entry (ed->ifd[EXIF_IFD_GPS], EXIF_TAG_GPS_VERSION_ID); + // Confirm this has a GPS Id - normally "2.0.0.0" or "2.2.0.0" + if ( ! ( ee && ee->components == 4 ) ) + goto MyReturn; + // Could test for these versions explicitly but may have byte order issues... + //if ( ! ( ee->data[0] == 2 && ee->data[2] == 0 && ee->data[3] == 0 ) ) + // goto MyReturn; + + ll = get_latlon ( ed ); + + // Hopefully won't have valid images at 0,0! + if ( ll.lat == 0.0 && ll.lon == 0.0 ) + goto MyReturn; + + // + // Not worried if none of the other fields exist, as can default the values to something + // + + gdouble alt = VIK_DEFAULT_ALTITUDE; + ee = exif_content_get_entry (ed->ifd[EXIF_IFD_GPS], EXIF_TAG_GPS_ALTITUDE); + if ( ee && ee->components == 1 && ee->format == EXIF_FORMAT_RATIONAL ) { + alt = Rational2Double ( ee->data, + 0, + exif_data_get_byte_order(ed) ); + + ee = exif_content_get_entry (ed->ifd[EXIF_IFD_GPS], EXIF_TAG_GPS_ALTITUDE_REF); + if ( ee && ee->components == 1 && ee->format == EXIF_FORMAT_BYTE && ee->data[0] == 1 ) + alt = -alt; + } + + // Name + ee = exif_content_get_entry (ed->ifd[EXIF_IFD_0], EXIF_TAG_XP_TITLE); + if ( ee ) { + exif_entry_get_value ( ee, str, 128 ); + *name = g_strdup ( str ); + } + + // + // Now create Waypoint with acquired information + // + wp = vik_waypoint_new(); + wp->visible = TRUE; + // Set info from exif values + // Location + vik_coord_load_from_latlon ( &(wp->coord), vcmode, &ll ); + // Altitude + wp->altitude = alt; + + wp->comment = geotag_get_exif_comment ( ed ); + + vik_waypoint_set_image ( wp, filename ); + +MyReturn: + // Finished with EXIF + exif_data_free ( ed ); +#endif +#endif + + return wp; +} + +/** + * a_geotag_waypoint_positioned: + * @filename: The image file to process + * @coord: The location for positioning the Waypoint + * @name: Returns a name for the Waypoint (can be NULL) + * @waypoint: An existing waypoint to update (can be NULL to generate a new waypoint) + * + * Returns: An allocated waypoint if the input waypoint is NULL, + * otherwise the passed in waypoint is updated + * + * Here EXIF processing is used to get non position related information (i.e. just the comment) + * + */ +VikWaypoint* a_geotag_waypoint_positioned ( const gchar *filename, VikCoord coord, gdouble alt, gchar **name, VikWaypoint *wp ) +{ + *name = NULL; + if ( wp == NULL ) { + // Need to create waypoint + wp = vik_waypoint_new(); + wp->visible = TRUE; + } + wp->coord = coord; + wp->altitude = alt; + +#ifdef HAVE_LIBGEXIV2 + GExiv2Metadata *gemd = gexiv2_metadata_new (); + if ( gexiv2_metadata_open_path ( gemd, filename, NULL ) ) { + wp->comment = geotag_get_exif_comment ( gemd ); + if ( gexiv2_metadata_has_tag ( gemd, "Exif.Image.XPTitle" ) ) + *name = g_strdup ( gexiv2_metadata_get_tag_interpreted_string ( gemd, "Exif.Image.XPTitle" ) ); + } + metadata_free ( gemd ); +#else +#ifdef HAVE_LIBEXIF + ExifData *ed = exif_data_new_from_file ( filename ); + + // Set info from exif values + if ( ed ) { + wp->comment = geotag_get_exif_comment ( ed ); + + gchar str[128]; + ExifEntry *ee; + // Name + ee = exif_content_get_entry (ed->ifd[EXIF_IFD_0], EXIF_TAG_XP_TITLE); + if ( ee ) { + exif_entry_get_value ( ee, str, 128 ); + *name = g_strdup ( str ); + } + + // Finished with EXIF + exif_data_free ( ed ); + } +#endif +#endif + + vik_waypoint_set_image ( wp, filename ); + + return wp; +} + +/** + * a_geotag_get_exif_date_from_file: + * @filename: The image file to process + * @has_GPS_info: Returns whether the file has existing GPS information + * + * Returns: An allocated string with the date and time in EXIF_DATE_FORMAT, otherwise NULL if some kind of failure + * + * Here EXIF processing is used to get time information + * + */ +gchar* a_geotag_get_exif_date_from_file ( const gchar *filename, gboolean *has_GPS_info ) +{ + gchar* datetime = NULL; + *has_GPS_info = FALSE; + +#ifdef HAVE_LIBGEXIV2 + GExiv2Metadata *gemd = gexiv2_metadata_new (); + if ( gexiv2_metadata_open_path ( gemd, filename, NULL ) ) { + gdouble lat, lon; + *has_GPS_info = ( gexiv2_metadata_get_gps_longitude(gemd,&lon) && gexiv2_metadata_get_gps_latitude(gemd,&lat) ); + + // Prefer 'Photo' version over 'Image' + if ( gexiv2_metadata_has_tag ( gemd, "Exif.Photo.DateTimeOriginal" ) ) + datetime = g_strdup ( gexiv2_metadata_get_tag_interpreted_string ( gemd, "Exif.Photo.DateTimeOriginal" ) ); + else + datetime = g_strdup ( gexiv2_metadata_get_tag_interpreted_string ( gemd, "Exif.Image.DateTimeOriginal" ) ); + } + metadata_free ( gemd ); +#else +#ifdef HAVE_LIBEXIF + ExifData *ed = exif_data_new_from_file ( filename ); + + // Detect EXIF load failure + if ( !ed ) + return datetime; + + gchar str[128]; + ExifEntry *ee; + + ee = exif_content_get_entry (ed->ifd[EXIF_IFD_EXIF], EXIF_TAG_DATE_TIME_ORIGINAL); + if ( ee ) { + exif_entry_get_value ( ee, str, 128 ); + datetime = g_strdup ( str ); + } + + // Check GPS Info + + ee = exif_content_get_entry (ed->ifd[EXIF_IFD_GPS], EXIF_TAG_GPS_VERSION_ID); + // Confirm this has a GPS Id - normally "2.0.0.0" or "2.2.0.0" + if ( ee && ee->components == 4 ) + *has_GPS_info = TRUE; + + // Check other basic GPS fields exist too + // I have encountered some images which have just the EXIF_TAG_GPS_VERSION_ID but nothing else + // So to confirm check more EXIF GPS TAGS: + ee = exif_content_get_entry (ed->ifd[EXIF_IFD_GPS], EXIF_TAG_GPS_LATITUDE); + if ( !ee ) + *has_GPS_info = FALSE; + ee = exif_content_get_entry (ed->ifd[EXIF_IFD_GPS], EXIF_TAG_GPS_LONGITUDE); + if ( !ee ) + *has_GPS_info = FALSE; + + exif_data_free ( ed ); +#endif +#endif + return datetime; +} + + +#ifdef HAVE_LIBEXIF +/**! If the entry doesn't exist, create it. + * Based on exif command line action_create_value function in exif 0.6.20 + */ +static ExifEntry* my_exif_create_value (ExifData *ed, ExifTag tag, ExifIfd ifd) +{ + ExifEntry *e = exif_content_get_entry (ed->ifd[ifd], tag); + if ( !e ) { + e = exif_entry_new (); + exif_content_add_entry (ed->ifd[ifd], e); + + exif_entry_initialize (e, tag); + + // exif_entry_initialize doesn't seem to do much, especially for the GPS tags + // so have to setup fields ourselves: + e->tag = tag; + + if ( tag == EXIF_TAG_GPS_VERSION_ID ) { + e->format = EXIF_FORMAT_BYTE; + e->components = 4; + e->size = sizeof (char) * e->components; + if ( e->data ) + g_free (e->data); + e->data = g_malloc (e->size); + } + if ( tag == EXIF_TAG_GPS_MAP_DATUM || + tag == EXIF_TAG_GPS_LATITUDE_REF || tag == EXIF_TAG_GPS_LONGITUDE_REF || + tag == EXIF_TAG_GPS_PROCESSING_METHOD ) { + e->format = EXIF_FORMAT_ASCII; + // NB Allocation is handled later on when the actual string used is known + } + if ( tag == EXIF_TAG_GPS_LATITUDE || tag == EXIF_TAG_GPS_LONGITUDE ) { + e->format = EXIF_FORMAT_RATIONAL; + e->components = 3; + e->size = sizeof (ExifRational) * e->components; + if ( e->data ) + g_free (e->data); + e->data = g_malloc (e->size); + } + if ( tag == EXIF_TAG_GPS_ALTITUDE ) { + e->format = EXIF_FORMAT_RATIONAL; + e->components = 1; + e->size = sizeof (ExifRational) * e->components; + if ( e->data ) + g_free (e->data); + e->data = g_malloc (e->size); + } + if ( tag == EXIF_TAG_GPS_ALTITUDE_REF ) { + e->components = 1; + e->size = sizeof (char) * e->components; + if ( e->data ) + g_free (e->data); + e->data = g_malloc (e->size); + } + /* The entry has been added to the IFD, so we can unref it */ + //exif_entry_unref(e); + // Crashes later on, when saving to jpeg if the above unref is enabled!! + // ?Some other malloc problem somewhere? + } + return e; +} + +/** Heavily based on convert_arg_to_entry from exif command line tool. + * But without ExifLog, exitting, use of g_* io functions + * and can take a gdouble value instead of a string + */ +static void convert_to_entry (const char *set_value, gdouble gdvalue, ExifEntry *e, ExifByteOrder o) +{ + unsigned int i, numcomponents; + char *value_p = NULL; + char *buf = NULL; + /* + * ASCII strings are handled separately, + * since they don't require any conversion. + */ + if (e->format == EXIF_FORMAT_ASCII || + e->tag == EXIF_TAG_USER_COMMENT) { + if (e->data) g_free (e->data); + e->components = strlen (set_value) + 1; + if (e->tag == EXIF_TAG_USER_COMMENT) + e->components += 8 - 1; + e->size = sizeof (char) * e->components; + e->data = g_malloc (e->size); + if (!e->data) { + g_warning (_("Not enough memory.")); + return; + } + if (e->tag == EXIF_TAG_USER_COMMENT) { + /* assume ASCII charset */ + /* TODO: get this from the current locale */ + memcpy ((char *) e->data, "ASCII\0\0\0", 8); + memcpy ((char *) e->data + 8, set_value, + strlen (set_value)); + } else + strcpy ((char *) e->data, set_value); + return; + } + + /* + * Make sure we can handle this entry + */ + if ((e->components == 0) && *set_value) { + g_warning (_("Setting a value for this tag is unsupported!")); + return; + } + + gboolean use_string = (set_value != NULL); + if ( use_string ) { + /* Copy the string so we can modify it */ + buf = g_strdup (set_value); + if (!buf) + return; + value_p = strtok (buf, " "); + } + + numcomponents = e->components; + for (i = 0; i < numcomponents; ++i) { + unsigned char s; + + if ( use_string ) { + if (!value_p) { + g_warning (_("Too few components specified (need %d, found %d)\n"), numcomponents, i); + return; + } + if (!isdigit(*value_p) && (*value_p != '+') && (*value_p != '-')) { + g_warning (_("Numeric value expected\n")); + return; + } + } + + s = exif_format_get_size (e->format); + switch (e->format) { + case EXIF_FORMAT_ASCII: + g_warning (_("This shouldn't happen!")); + return; + break; + case EXIF_FORMAT_SHORT: + exif_set_short (e->data + (s * i), o, atoi (value_p)); + break; + case EXIF_FORMAT_SSHORT: + exif_set_sshort (e->data + (s * i), o, atoi (value_p)); + break; + case EXIF_FORMAT_RATIONAL: { + ExifRational er; + + double val = 0.0 ; + if ( use_string && value_p ) + val = fabs (atol (value_p)); + else + val = fabs (gdvalue); + + if ( i == 0 ) { + // One (or first) part rational + + // Sneak peek into tag as location tags need rounding down to give just the degrees part + if ( e->tag == EXIF_TAG_GPS_LATITUDE || e->tag == EXIF_TAG_GPS_LONGITUDE ) { + er.numerator = (ExifLong) floor ( val ); + er.denominator = 1.0; + } + else { + // I don't see any point in doing anything too complicated here, + // such as trying to work out the 'best' denominator + // For the moment use KISS principle. + // Fix a precision of 1/100 metre as that's more than enough for GPS accuracy especially altitudes! + er.denominator = 100.0; + er.numerator = (ExifLong) (val * er.denominator); + } + } + + // Now for Location 3 part rationals do Mins and Seconds format + + // Rounded down minutes + if ( i == 1 ) { + er.denominator = 1.0; + er.numerator = (ExifLong) ( (int) floor ( ( val - floor (val) ) * 60.0 ) ); + } + + // Finally seconds + if ( i == 2 ) { + er.denominator = 100.0; + + // Fractional minute. + double FracPart = ((val - floor(val)) * 60) - (double)(int) floor ( ( val - floor (val) ) * 60.0 ); + er.numerator = (ExifLong) ( (int)floor(FracPart * 6000) ); // Convert to seconds. + } + exif_set_rational (e->data + (s * i), o, er ); + break; + } + case EXIF_FORMAT_LONG: + exif_set_long (e->data + (s * i), o, atol (value_p)); + break; + case EXIF_FORMAT_SLONG: + exif_set_slong (e->data + (s * i), o, atol (value_p)); + break; + case EXIF_FORMAT_BYTE: + case EXIF_FORMAT_SBYTE: + case EXIF_FORMAT_UNDEFINED: /* treat as byte array */ + e->data[s * i] = atoi (value_p); + break; + case EXIF_FORMAT_FLOAT: + case EXIF_FORMAT_DOUBLE: + case EXIF_FORMAT_SRATIONAL: + default: + g_warning (_("Not yet implemented!")); + return; + } + + if ( use_string ) + value_p = strtok (NULL, " "); + + } + + g_free (buf); + + if ( use_string ) + if ( value_p ) + g_warning (_("Warning; Too many components specified!")); +} +#endif + +/** + * a_geotag_write_exif_gps: + * @filename: The image file to save information in + * @coord: The location + * @alt: The elevation + * @direction: The image direction (if NAN then these direction fields are not written) + * @direction_ref: The image direction value type + * + * Returns: A value indicating success: 0, or some other value for failure + * + */ +gint a_geotag_write_exif_gps ( const gchar *filename, VikCoord coord, gdouble alt, + gdouble direction, VikWaypointImageDirectionRef direction_ref, + gboolean no_change_mtime ) +{ + gint result = 0; // OK so far... + + // Save mtime for later use + struct stat stat_save; + if ( no_change_mtime ) + if ( stat ( filename, &stat_save ) != 0 ) + g_warning ( "%s couldn't read: %s", __FUNCTION__, filename ); + +#ifdef HAVE_LIBGEXIV2 + GExiv2Metadata *gemd = gexiv2_metadata_new (); + if ( gexiv2_metadata_open_path ( gemd, filename, NULL ) ) { + struct LatLon ll; + vik_coord_to_latlon ( &coord, &ll ); + if ( ! gexiv2_metadata_set_gps_info ( gemd, ll.lon, ll.lat, alt ) ) { + result = 1; // Failed + } + else { + if ( !isnan(direction) ) { + gint nom = (gint)round(direction * 10.0); + gboolean set_d = gexiv2_metadata_set_exif_tag_rational ( gemd, EXIF_GPS_IMGDIR, nom, 10 ); + if ( !set_d ) result = 1; // Failed + gboolean set_r = gexiv2_metadata_set_tag_string ( gemd, EXIF_GPS_IMGDIR_REF, direction_ref == WP_IMAGE_DIRECTION_REF_TRUE ? "T" : "M" ); + if ( !set_r ) result = 1; // Failed + } + // Still OK to save - no fails yet + if ( result == 0 ) { + GError *error = NULL; + if ( ! gexiv2_metadata_save_file ( gemd, filename, &error ) ) { + result = 2; + g_warning ( "Write EXIF failure:%s" , error->message ); + g_error_free ( error ); + } + } + } + } + metadata_free ( gemd ); +#else +#ifdef HAVE_LIBEXIF + /* + Appears libexif doesn't actually support writing EXIF data directly to files + Thus embed command line exif writing method within Viking + (for example this is done by Enlightment - http://www.enlightenment.org/ ) + This appears to be JPEG only, but is probably 99% of our use case + Alternatively consider using libexiv2 and C++... + */ + + // Actual EXIF settings here... + JPEGData *jdata; + + /* Parse the JPEG file. */ + jdata = jpeg_data_new (); + jpeg_data_load_file (jdata, filename); + + // Get current values + ExifData *ed = exif_data_new_from_file ( filename ); + if ( !ed ) + ed = exif_data_new (); + + // Update ExifData with our new settings + ExifEntry *ee; + // + // I don't understand it, but when saving the 'ed' nothing gets set after putting in the GPS ID tag - so it must come last + // (unless of course there is some bug in the setting of the ID, that prevents subsequent tags) + // + + ee = my_exif_create_value (ed, EXIF_TAG_GPS_ALTITUDE, EXIF_IFD_GPS); + convert_to_entry ( NULL, alt, ee, exif_data_get_byte_order(ed) ); + + // byte 0 meaning "sea level" or 1 if the value is negative. + ee = my_exif_create_value (ed, EXIF_TAG_GPS_ALTITUDE_REF, EXIF_IFD_GPS); + convert_to_entry ( alt < 0.0 ? "1" : "0", 0.0, ee, exif_data_get_byte_order(ed) ); + + ee = my_exif_create_value (ed, EXIF_TAG_GPS_PROCESSING_METHOD, EXIF_IFD_GPS); + // see http://www.sno.phy.queensu.ca/~phil/exiftool/TagNames/GPS.html + convert_to_entry ( "MANUAL", 0.0, ee, exif_data_get_byte_order(ed) ); + + ee = my_exif_create_value (ed, EXIF_TAG_GPS_MAP_DATUM, EXIF_IFD_GPS); + convert_to_entry ( "WGS-84", 0.0, ee, exif_data_get_byte_order(ed) ); + + struct LatLon ll; + vik_coord_to_latlon ( &coord, &ll ); + + ee = my_exif_create_value (ed, EXIF_TAG_GPS_LATITUDE_REF, EXIF_IFD_GPS); + // N or S + convert_to_entry ( ll.lat < 0.0 ? "S" : "N", 0.0, ee, exif_data_get_byte_order(ed) ); + + ee = my_exif_create_value (ed, EXIF_TAG_GPS_LATITUDE, EXIF_IFD_GPS); + convert_to_entry ( NULL, ll.lat, ee, exif_data_get_byte_order(ed) ); + + ee = my_exif_create_value (ed, EXIF_TAG_GPS_LONGITUDE_REF, EXIF_IFD_GPS); + // E or W + convert_to_entry ( ll.lon < 0.0 ? "W" : "E", 0.0, ee, exif_data_get_byte_order(ed) ); + + ee = my_exif_create_value (ed, EXIF_TAG_GPS_LONGITUDE, EXIF_IFD_GPS); + convert_to_entry ( NULL, ll.lon, ee, exif_data_get_byte_order(ed) ); + + ee = my_exif_create_value (ed, EXIF_TAG_GPS_VERSION_ID, EXIF_IFD_GPS); + //convert_to_entry ( "2 0 0 0", 0.0, ee, exif_data_get_byte_order(ed) ); + convert_to_entry ( "2 2 0 0", 0.0, ee, exif_data_get_byte_order(ed) ); + + jpeg_data_set_exif_data (jdata, ed); + + if ( jdata ) { + /* Save the modified image. */ + result = jpeg_data_save_file (jdata, filename); + + // Convert result from 1 for success, 0 for failure into our scheme + result = !result; + + jpeg_data_unref (jdata); + } + else { + // Epic fail - file probably not a JPEG + result = 2; + } + + exif_data_free ( ed ); +#endif +#endif + + if ( no_change_mtime ) { + // Restore mtime, using the saved value + struct stat stat_tmp; + struct utimbuf utb; + (void)stat ( filename, &stat_tmp ); + utb.actime = stat_tmp.st_atime; + utb.modtime = stat_save.st_mtime; + // Not security critical, thus potential Time of Check Time of Use race condition is not bad + // coverity[toctou] + if ( g_utime ( filename, &utb ) != 0 ) + g_warning ( "%s couldn't set time on: %s", __FUNCTION__, filename ); + } + + return result; +} diff --git a/src/geotag_exif.h b/src/geotag_exif.h new file mode 100644 index 0000000..79a02df --- /dev/null +++ b/src/geotag_exif.h @@ -0,0 +1,51 @@ +/* -*- Mode: C; indent-tabs-mode: t; c-basic-offset: 4; tab-width: 4 -*- */ +/* + * viking -- GPS Data and Topo Analyzer, Explorer, and Manager + * + * Copyright (C) 2011-2014, Rob Norris + * + * 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., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA + * + */ + +#ifndef _VIKING_GEOTAG_EXIF_H +#define _VIKING_GEOTAG_EXIF_H + +#include "vikwaypoint.h" +#include "vikcoord.h" + +G_BEGIN_DECLS + +typedef struct { + struct LatLon ll; + gdouble direction; + VikWaypointImageDirectionRef directionRef; +} exif_gps_info_t; + +VikWaypoint* a_geotag_create_waypoint_from_file ( const gchar *filename, VikCoordMode vcmode, gchar **name ); + +VikWaypoint* a_geotag_waypoint_positioned ( const gchar *filename, VikCoord coord, gdouble alt, gchar **name, VikWaypoint *wp ); + +gchar* a_geotag_get_exif_date_from_file ( const gchar *filename, gboolean *has_GPS_info ); + +struct LatLon a_geotag_get_position ( const gchar *filename ); + +gint a_geotag_write_exif_gps ( const gchar *filename, VikCoord coord, gdouble alt, + gdouble direction, VikWaypointImageDirectionRef direction_ref, + gboolean no_change_mtime ); + +G_END_DECLS + +#endif // _VIKING_GEOTAG_EXIF_H diff --git a/src/globals.c b/src/globals.c new file mode 100644 index 0000000..34e61bb --- /dev/null +++ b/src/globals.c @@ -0,0 +1,432 @@ +/* + * viking -- GPS Data and Topo Analyzer, Explorer, and Manager + * + * Copyright (C) 2003-2005, Evan Battaglia + * Copyright (C) 2008, Guilhem Bonnefille + * Copyright (C) 2010-2013, Rob Norris + * + * 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., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA + * + */ +#ifdef HAVE_CONFIG_H +#include "config.h" +#endif +#ifdef HAVE_STDLIB_H +#include +#endif + +#include + +#include "globals.h" +#include "preferences.h" +#include "math.h" +#include "dir.h" + +gboolean vik_debug = FALSE; +gboolean vik_verbose = FALSE; +gboolean vik_version = FALSE; + +/** + * viking_version_to_number: + * @version: The string of the Viking version. + * This should be in the form of N.N.N.N, where the 3rd + 4th numbers are optional + * Often you'll want to pass in VIKING_VERSION + * + * Returns: a single number useful for comparison + */ +gint viking_version_to_number ( gchar *version ) +{ + // Basic method, probably can be improved + gint version_number = 0; + gchar** parts = g_strsplit ( version, ".", 0 ); + gint part_num = 0; + gchar *part = parts[part_num]; + // Allow upto 4 parts to the version number + while ( part && part_num < 4 ) { + // Allow each part to have upto 100 + version_number = version_number + ( atol(part) * pow(100, 3-part_num) ); + part_num++; + part = parts[part_num]; + } + g_strfreev ( parts ); + return version_number; +} + +static gchar * params_degree_formats[] = {N_("DDD"), N_("DMM"), N_("DMS"), N_("Raw"), NULL}; +static gchar * params_units_distance[] = {N_("Kilometres"), N_("Miles"), N_("Nautical Miles"), NULL}; +static gchar * params_units_speed[] = {N_("km/h"), N_("mph"), N_("m/s"), N_("knots"), N_("s/km"), N_("min/km"), N_("s/mi"), N_("min/mi"), NULL}; +static gchar * params_units_height[] = {N_("Metres"), N_("Feet"), NULL}; +static VikLayerParamScale params_scales_lat[] = { {-90.0, 90.0, 0.05, 2} }; +static VikLayerParamScale params_scales_long[] = { {-180.0, 180.0, 0.05, 2} }; +static gchar * params_time_ref_frame[] = {N_("Locale"), N_("World"), N_("UTC"), NULL}; + +static VikLayerParam general_prefs[] = { + { VIK_LAYER_NUM_TYPES, VIKING_PREFERENCES_NAMESPACE "degree_format", VIK_LAYER_PARAM_UINT, VIK_LAYER_GROUP_NONE, N_("Degree format:"), VIK_LAYER_WIDGET_COMBOBOX, params_degree_formats, NULL, NULL, NULL, NULL, NULL }, + { VIK_LAYER_NUM_TYPES, VIKING_PREFERENCES_NAMESPACE "units_distance", VIK_LAYER_PARAM_UINT, VIK_LAYER_GROUP_NONE, N_("Distance units:"), VIK_LAYER_WIDGET_COMBOBOX, params_units_distance, NULL, NULL, NULL, NULL, NULL }, + { VIK_LAYER_NUM_TYPES, VIKING_PREFERENCES_NAMESPACE "units_speed", VIK_LAYER_PARAM_UINT, VIK_LAYER_GROUP_NONE, N_("Speed units:"), VIK_LAYER_WIDGET_COMBOBOX, params_units_speed, NULL, NULL, NULL, NULL, NULL }, + { VIK_LAYER_NUM_TYPES, VIKING_PREFERENCES_NAMESPACE "units_height", VIK_LAYER_PARAM_UINT, VIK_LAYER_GROUP_NONE, N_("Height units:"), VIK_LAYER_WIDGET_COMBOBOX, params_units_height, NULL, NULL, NULL, NULL, NULL }, + { VIK_LAYER_NUM_TYPES, VIKING_PREFERENCES_NAMESPACE "use_large_waypoint_icons", VIK_LAYER_PARAM_BOOLEAN, VIK_LAYER_GROUP_NONE, N_("Use large waypoint icons:"), VIK_LAYER_WIDGET_CHECKBUTTON, NULL, NULL, NULL, NULL, NULL, NULL }, + { VIK_LAYER_NUM_TYPES, VIKING_PREFERENCES_NAMESPACE "default_latitude", VIK_LAYER_PARAM_DOUBLE, VIK_LAYER_GROUP_NONE, N_("Default latitude:"), VIK_LAYER_WIDGET_SPINBUTTON, params_scales_lat, NULL, NULL, NULL, NULL, NULL }, + { VIK_LAYER_NUM_TYPES, VIKING_PREFERENCES_NAMESPACE "default_longitude", VIK_LAYER_PARAM_DOUBLE, VIK_LAYER_GROUP_NONE, N_("Default longitude:"), VIK_LAYER_WIDGET_SPINBUTTON, params_scales_long, NULL, NULL, NULL, NULL, NULL }, + { VIK_LAYER_NUM_TYPES, VIKING_PREFERENCES_NAMESPACE "time_reference_frame", VIK_LAYER_PARAM_UINT, VIK_LAYER_GROUP_NONE, N_("Time Display:"), VIK_LAYER_WIDGET_COMBOBOX, params_time_ref_frame, NULL, + N_("Display times according to the reference frame. Locale is the user's system setting. World is relative to the location of the object."), NULL, NULL, NULL }, +}; + +/* External/Export Options */ + +static gchar * params_kml_export_units[] = {"Metric", "Statute", "Nautical", NULL}; +static gchar * params_gpx_export_trk_sort[] = {N_("Alphabetical"), N_("Time"), N_("Creation"), NULL }; +static gchar * params_gpx_export_wpt_symbols[] = {N_("Title Case"), N_("Lowercase"), NULL}; + +static VikLayerParam io_prefs[] = { + { VIK_LAYER_NUM_TYPES, VIKING_PREFERENCES_IO_NAMESPACE "kml_export_units", VIK_LAYER_PARAM_UINT, VIK_LAYER_GROUP_NONE, N_("KML File Export Units:"), VIK_LAYER_WIDGET_COMBOBOX, params_kml_export_units, NULL, NULL, NULL, NULL, NULL }, + { VIK_LAYER_NUM_TYPES, VIKING_PREFERENCES_IO_NAMESPACE "gpx_export_track_sort", VIK_LAYER_PARAM_UINT, VIK_LAYER_GROUP_NONE, N_("GPX Track Order:"), VIK_LAYER_WIDGET_COMBOBOX, params_gpx_export_trk_sort, NULL, NULL, NULL, NULL, NULL }, + { VIK_LAYER_NUM_TYPES, VIKING_PREFERENCES_IO_NAMESPACE "gpx_export_wpt_sym_names", VIK_LAYER_PARAM_UINT, VIK_LAYER_GROUP_NONE, N_("GPX Waypoint Symbols:"), VIK_LAYER_WIDGET_COMBOBOX, params_gpx_export_wpt_symbols, NULL, + N_("Save GPX Waypoint Symbol names in the specified case. May be useful for compatibility with various devices"), NULL, NULL, NULL }, + { VIK_LAYER_NUM_TYPES, VIKING_PREFERENCES_IO_NAMESPACE "gpx_export_creator", VIK_LAYER_PARAM_STRING, VIK_LAYER_GROUP_NONE, N_("GPX Creator:"), VIK_LAYER_WIDGET_ENTRY, NULL, NULL, + N_("The creator value when writing a GPX file. Otherwise when blank a default is used."), NULL, NULL, NULL }, +}; + +#ifndef WINDOWS +static VikLayerParam io_prefs_non_windows[] = { + { VIK_LAYER_NUM_TYPES, VIKING_PREFERENCES_IO_NAMESPACE "image_viewer", VIK_LAYER_PARAM_STRING, VIK_LAYER_GROUP_NONE, N_("Image Viewer:"), VIK_LAYER_WIDGET_FILEENTRY, NULL, NULL, NULL, NULL, NULL, NULL }, +}; +#endif + +static VikLayerParam io_prefs_external_gpx[] = { + { VIK_LAYER_NUM_TYPES, VIKING_PREFERENCES_IO_NAMESPACE "external_gpx_1", VIK_LAYER_PARAM_STRING, VIK_LAYER_GROUP_NONE, N_("External GPX Program 1:"), VIK_LAYER_WIDGET_FILEENTRY, NULL, NULL, NULL, NULL, NULL, NULL }, + { VIK_LAYER_NUM_TYPES, VIKING_PREFERENCES_IO_NAMESPACE "external_gpx_2", VIK_LAYER_PARAM_STRING, VIK_LAYER_GROUP_NONE, N_("External GPX Program 2:"), VIK_LAYER_WIDGET_FILEENTRY, NULL, NULL, NULL, NULL, NULL, NULL }, +}; + +static gchar * params_vik_fileref[] = {N_("Absolute"), N_("Relative"), NULL}; +static VikLayerParamScale params_recent_files[] = { {-1, 25, 1, 0} }; + +static VikLayerParam prefs_advanced[] = { + { VIK_LAYER_NUM_TYPES, VIKING_PREFERENCES_ADVANCED_NAMESPACE "save_file_reference_mode", VIK_LAYER_PARAM_UINT, VIK_LAYER_GROUP_NONE, N_("Save File Reference Mode:"), VIK_LAYER_WIDGET_COMBOBOX, params_vik_fileref, NULL, + N_("When saving a Viking .vik file, this determines how the directory paths of filenames are written."), NULL, NULL, NULL }, + { VIK_LAYER_NUM_TYPES, VIKING_PREFERENCES_ADVANCED_NAMESPACE "ask_for_create_track_name", VIK_LAYER_PARAM_BOOLEAN, VIK_LAYER_GROUP_NONE, N_("Ask for Name before Track Creation:"), VIK_LAYER_WIDGET_CHECKBUTTON, NULL, NULL, NULL, NULL, NULL, NULL }, + { VIK_LAYER_NUM_TYPES, VIKING_PREFERENCES_ADVANCED_NAMESPACE "create_track_tooltip", VIK_LAYER_PARAM_BOOLEAN, VIK_LAYER_GROUP_NONE, N_("Show Tooltip during Track Creation:"), VIK_LAYER_WIDGET_CHECKBUTTON, NULL, NULL, NULL, NULL, NULL, NULL }, + { VIK_LAYER_NUM_TYPES, VIKING_PREFERENCES_ADVANCED_NAMESPACE "number_recent_files", VIK_LAYER_PARAM_INT, VIK_LAYER_GROUP_NONE, N_("The number of recent files:"), VIK_LAYER_WIDGET_SPINBUTTON, params_recent_files, NULL, + N_("Only applies to new windows or on application restart. -1 means all available files."), NULL, NULL, NULL }, + { VIK_LAYER_NUM_TYPES, VIKING_PREFERENCES_ADVANCED_NAMESPACE "open_files_in_selected_layer", VIK_LAYER_PARAM_BOOLEAN, VIK_LAYER_GROUP_NONE, N_("Open files in selected layer:"), VIK_LAYER_WIDGET_CHECKBUTTON, NULL, NULL, + N_("Open files (but not .vik ones) into the selected TrackWaypoint layer."), NULL, NULL, NULL }, + { VIK_LAYER_NUM_TYPES, VIKING_PREFERENCES_ADVANCED_NAMESPACE "calendar_show_day_names", VIK_LAYER_PARAM_BOOLEAN, VIK_LAYER_GROUP_NONE, N_("Show calendar day names:"), VIK_LAYER_WIDGET_CHECKBUTTON, NULL, NULL, NULL, NULL, NULL, NULL }, +}; + +static gchar * params_startup_methods[] = {N_("Home Location"), N_("Last Location"), N_("Specified File"), N_("Auto Location"), NULL}; + +static VikLayerParam startup_prefs[] = { + { VIK_LAYER_NUM_TYPES, VIKING_PREFERENCES_STARTUP_NAMESPACE "restore_window_state", VIK_LAYER_PARAM_BOOLEAN, VIK_LAYER_GROUP_NONE, N_("Restore Window Setup:"), VIK_LAYER_WIDGET_CHECKBUTTON, NULL, NULL, + N_("Restore window size and layout"), NULL, NULL, NULL}, + { VIK_LAYER_NUM_TYPES, VIKING_PREFERENCES_STARTUP_NAMESPACE "add_default_map_layer", VIK_LAYER_PARAM_BOOLEAN, VIK_LAYER_GROUP_NONE, N_("Add a Default Map Layer:"), VIK_LAYER_WIDGET_CHECKBUTTON, NULL, NULL, + N_("The default map layer added is defined by the Layer Defaults. Use the menu Edit->Layer Defaults->Map... to change the map type and other values."), NULL, NULL, NULL}, + { VIK_LAYER_NUM_TYPES, VIKING_PREFERENCES_STARTUP_NAMESPACE "startup_method", VIK_LAYER_PARAM_UINT, VIK_LAYER_GROUP_NONE, N_("Startup Method:"), VIK_LAYER_WIDGET_COMBOBOX, params_startup_methods, NULL, NULL, NULL, NULL, NULL }, + { VIK_LAYER_NUM_TYPES, VIKING_PREFERENCES_STARTUP_NAMESPACE "startup_file", VIK_LAYER_PARAM_STRING, VIK_LAYER_GROUP_NONE, N_("Startup File:"), VIK_LAYER_WIDGET_FILEENTRY, NULL, NULL, + N_("The default file to load on startup. Only applies when the startup method is set to 'Specified File'"), NULL, NULL, NULL }, + { VIK_LAYER_NUM_TYPES, VIKING_PREFERENCES_STARTUP_NAMESPACE "check_version", VIK_LAYER_PARAM_BOOLEAN, VIK_LAYER_GROUP_NONE, N_("Check For New Version:"), VIK_LAYER_WIDGET_CHECKBUTTON, NULL, NULL, + N_("Periodically check to see if a new version of Viking is available"), NULL, NULL, NULL }, +}; +/* End of Options static stuff */ + +/** + * Detect when Viking is run for the very first time + * Call this very early in the startup sequence to ensure subsequent correct results + * The return value is cached, since later on the test will no longer be true + */ +gboolean a_vik_very_first_run () +{ + static gboolean vik_very_first_run_known = FALSE; + static gboolean vik_very_first_run = FALSE; + + // use cached result if available + if ( vik_very_first_run_known ) + return vik_very_first_run; + + gchar *dir = a_get_viking_dir_no_create(); + // NB: will need extra logic if default dir gets changed e.g. from ~/.viking to ~/.config/viking + if ( dir ) { + // If directory exists - Viking has been run before + vik_very_first_run = ! g_file_test ( dir, G_FILE_TEST_EXISTS ); + g_free ( dir ); + } + else + vik_very_first_run = TRUE; + vik_very_first_run_known = TRUE; + + return vik_very_first_run; +} + +void a_vik_preferences_init () +{ + g_debug ( "VIKING VERSION as number: %d", viking_version_to_number (VIKING_VERSION) ); + + // Defaults for the options are setup here + a_preferences_register_group ( VIKING_PREFERENCES_GROUP_KEY, _("General") ); + + VikLayerParamData tmp; + tmp.u = VIK_DEGREE_FORMAT_DMS; + a_preferences_register(&general_prefs[0], tmp, VIKING_PREFERENCES_GROUP_KEY); + + tmp.u = VIK_UNITS_DISTANCE_KILOMETRES; + a_preferences_register(&general_prefs[1], tmp, VIKING_PREFERENCES_GROUP_KEY); + + tmp.u = VIK_UNITS_SPEED_KILOMETRES_PER_HOUR; + a_preferences_register(&general_prefs[2], tmp, VIKING_PREFERENCES_GROUP_KEY); + + tmp.u = VIK_UNITS_HEIGHT_METRES; + a_preferences_register(&general_prefs[3], tmp, VIKING_PREFERENCES_GROUP_KEY); + + tmp.b = TRUE; + a_preferences_register(&general_prefs[4], tmp, VIKING_PREFERENCES_GROUP_KEY); + + /* Maintain the default location to New York */ + tmp.d = 40.714490; + a_preferences_register(&general_prefs[5], tmp, VIKING_PREFERENCES_GROUP_KEY); + tmp.d = -74.007130; + a_preferences_register(&general_prefs[6], tmp, VIKING_PREFERENCES_GROUP_KEY); + + tmp.u = VIK_TIME_REF_LOCALE; + a_preferences_register(&general_prefs[7], tmp, VIKING_PREFERENCES_GROUP_KEY); + + // New Tab + a_preferences_register_group ( VIKING_PREFERENCES_STARTUP_GROUP_KEY, _("Startup") ); + + tmp.b = FALSE; + a_preferences_register(&startup_prefs[0], tmp, VIKING_PREFERENCES_STARTUP_GROUP_KEY); + + tmp.b = FALSE; + a_preferences_register(&startup_prefs[1], tmp, VIKING_PREFERENCES_STARTUP_GROUP_KEY); + + tmp.u = VIK_STARTUP_METHOD_HOME_LOCATION; + a_preferences_register(&startup_prefs[2], tmp, VIKING_PREFERENCES_STARTUP_GROUP_KEY); + + tmp.s = ""; + a_preferences_register(&startup_prefs[3], tmp, VIKING_PREFERENCES_STARTUP_GROUP_KEY); + + tmp.b = FALSE; + a_preferences_register(&startup_prefs[4], tmp, VIKING_PREFERENCES_STARTUP_GROUP_KEY); + + // New Tab + a_preferences_register_group ( VIKING_PREFERENCES_IO_GROUP_KEY, _("Export/External") ); + + tmp.u = VIK_KML_EXPORT_UNITS_METRIC; + a_preferences_register(&io_prefs[0], tmp, VIKING_PREFERENCES_IO_GROUP_KEY); + + tmp.u = VIK_GPX_EXPORT_TRK_SORT_TIME; + a_preferences_register(&io_prefs[1], tmp, VIKING_PREFERENCES_IO_GROUP_KEY); + + tmp.u = VIK_GPX_EXPORT_WPT_SYM_NAME_TITLECASE; + a_preferences_register(&io_prefs[2], tmp, VIKING_PREFERENCES_IO_GROUP_KEY); + + tmp.s = ""; + a_preferences_register(&io_prefs[3], tmp, VIKING_PREFERENCES_IO_GROUP_KEY); + +#ifndef WINDOWS + tmp.s = "xdg-open"; + a_preferences_register(&io_prefs_non_windows[0], tmp, VIKING_PREFERENCES_IO_GROUP_KEY); +#endif + + // JOSM for OSM editing around a GPX track + tmp.s = "josm"; + a_preferences_register(&io_prefs_external_gpx[0], tmp, VIKING_PREFERENCES_IO_GROUP_KEY); + // Add a second external program - another OSM editor by default + tmp.s = "merkaartor"; + a_preferences_register(&io_prefs_external_gpx[1], tmp, VIKING_PREFERENCES_IO_GROUP_KEY); + + // 'Advanced' Properties + a_preferences_register_group ( VIKING_PREFERENCES_ADVANCED_GROUP_KEY, _("Advanced") ); + + tmp.u = VIK_FILE_REF_FORMAT_ABSOLUTE; + a_preferences_register(&prefs_advanced[0], tmp, VIKING_PREFERENCES_ADVANCED_GROUP_KEY); + + tmp.b = TRUE; + a_preferences_register(&prefs_advanced[1], tmp, VIKING_PREFERENCES_ADVANCED_GROUP_KEY); + + tmp.b = TRUE; + a_preferences_register(&prefs_advanced[2], tmp, VIKING_PREFERENCES_ADVANCED_GROUP_KEY); + + tmp.i = 10; // Seemingly GTK's default for the number of recent files + a_preferences_register(&prefs_advanced[3], tmp, VIKING_PREFERENCES_ADVANCED_GROUP_KEY); + + tmp.b = FALSE; + a_preferences_register(&prefs_advanced[4], tmp, VIKING_PREFERENCES_ADVANCED_GROUP_KEY); + + tmp.b = TRUE; + a_preferences_register(&prefs_advanced[5], tmp, VIKING_PREFERENCES_ADVANCED_GROUP_KEY); +} + +vik_degree_format_t a_vik_get_degree_format ( ) +{ + vik_degree_format_t format; + format = a_preferences_get(VIKING_PREFERENCES_NAMESPACE "degree_format")->u; + return format; +} + +vik_units_distance_t a_vik_get_units_distance ( ) +{ + vik_units_distance_t units; + units = a_preferences_get(VIKING_PREFERENCES_NAMESPACE "units_distance")->u; + return units; +} + +vik_units_speed_t a_vik_get_units_speed ( ) +{ + vik_units_speed_t units; + units = a_preferences_get(VIKING_PREFERENCES_NAMESPACE "units_speed")->u; + return units; +} + +vik_units_height_t a_vik_get_units_height ( ) +{ + vik_units_height_t units; + units = a_preferences_get(VIKING_PREFERENCES_NAMESPACE "units_height")->u; + return units; +} + +gboolean a_vik_get_use_large_waypoint_icons ( ) +{ + gboolean use_large_waypoint_icons; + use_large_waypoint_icons = a_preferences_get(VIKING_PREFERENCES_NAMESPACE "use_large_waypoint_icons")->b; + return use_large_waypoint_icons; +} + +gdouble a_vik_get_default_lat ( ) +{ + gdouble data; + data = a_preferences_get(VIKING_PREFERENCES_NAMESPACE "default_latitude")->d; + return data; +} + +gdouble a_vik_get_default_long ( ) +{ + gdouble data; + data = a_preferences_get(VIKING_PREFERENCES_NAMESPACE "default_longitude")->d; + return data; +} + +vik_time_ref_frame_t a_vik_get_time_ref_frame ( ) +{ + return a_preferences_get(VIKING_PREFERENCES_NAMESPACE "time_reference_frame")->u; +} + +/* External/Export Options */ + +vik_kml_export_units_t a_vik_get_kml_export_units ( ) +{ + vik_kml_export_units_t units; + units = a_preferences_get(VIKING_PREFERENCES_IO_NAMESPACE "kml_export_units")->u; + return units; +} + +vik_gpx_export_trk_sort_t a_vik_get_gpx_export_trk_sort ( ) +{ + vik_gpx_export_trk_sort_t sort; + sort = a_preferences_get(VIKING_PREFERENCES_IO_NAMESPACE "gpx_export_track_sort")->u; + return sort; +} + +vik_gpx_export_wpt_sym_name_t a_vik_gpx_export_wpt_sym_name ( ) +{ + gboolean val; + val = a_preferences_get(VIKING_PREFERENCES_IO_NAMESPACE "gpx_export_wpt_sym_names")->u; + return val; +} + +const gchar* a_vik_gpx_export_creator ( ) +{ + return a_preferences_get(VIKING_PREFERENCES_IO_NAMESPACE "gpx_export_creator")->s; +} + +#ifndef WINDOWS +const gchar* a_vik_get_image_viewer ( ) +{ + return a_preferences_get(VIKING_PREFERENCES_IO_NAMESPACE "image_viewer")->s; +} +#endif + +const gchar* a_vik_get_external_gpx_program_1 ( ) +{ + return a_preferences_get(VIKING_PREFERENCES_IO_NAMESPACE "external_gpx_1")->s; +} + +const gchar* a_vik_get_external_gpx_program_2 ( ) +{ + return a_preferences_get(VIKING_PREFERENCES_IO_NAMESPACE "external_gpx_2")->s; +} + +// Advanced Options +vik_file_ref_format_t a_vik_get_file_ref_format ( ) +{ + vik_file_ref_format_t format; + format = a_preferences_get(VIKING_PREFERENCES_ADVANCED_NAMESPACE "save_file_reference_mode")->u; + return format; +} + +gboolean a_vik_get_ask_for_create_track_name ( ) +{ + return a_preferences_get(VIKING_PREFERENCES_ADVANCED_NAMESPACE "ask_for_create_track_name")->b; +} + +gboolean a_vik_get_create_track_tooltip ( ) +{ + return a_preferences_get(VIKING_PREFERENCES_ADVANCED_NAMESPACE "create_track_tooltip")->b; +} + +gint a_vik_get_recent_number_files ( ) +{ + return a_preferences_get(VIKING_PREFERENCES_ADVANCED_NAMESPACE "number_recent_files")->i; +} + +gboolean a_vik_get_open_files_in_selected_layer ( ) +{ + return a_preferences_get(VIKING_PREFERENCES_ADVANCED_NAMESPACE "open_files_in_selected_layer")->b; +} + +gboolean a_vik_get_calendar_show_day_names ( ) +{ + return a_preferences_get(VIKING_PREFERENCES_ADVANCED_NAMESPACE "calendar_show_day_names")->b; +} + +// Startup Options +gboolean a_vik_get_restore_window_state ( ) +{ + gboolean data; + data = a_preferences_get(VIKING_PREFERENCES_STARTUP_NAMESPACE "restore_window_state")->b; + return data; +} + +gboolean a_vik_get_add_default_map_layer ( ) +{ + gboolean data; + data = a_preferences_get(VIKING_PREFERENCES_STARTUP_NAMESPACE "add_default_map_layer")->b; + return data; +} + +vik_startup_method_t a_vik_get_startup_method ( ) +{ + vik_startup_method_t data; + data = a_preferences_get(VIKING_PREFERENCES_STARTUP_NAMESPACE "startup_method")->u; + return data; +} + +const gchar *a_vik_get_startup_file ( ) +{ + return a_preferences_get(VIKING_PREFERENCES_STARTUP_NAMESPACE "startup_file")->s; +} + +gboolean a_vik_get_check_version ( ) +{ + return a_preferences_get(VIKING_PREFERENCES_STARTUP_NAMESPACE "check_version")->b; +} diff --git a/src/globals.h b/src/globals.h new file mode 100644 index 0000000..70d1a61 --- /dev/null +++ b/src/globals.h @@ -0,0 +1,273 @@ +/* + * viking -- GPS Data and Topo Analyzer, Explorer, and Manager + * + * Copyright (C) 2003-2005, Evan Battaglia + * Copyright (C) 2013, Rob Norris + * + * 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., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA + * + */ + +#ifndef __VIKING_GLOBALS_H +#define __VIKING_GLOBALS_H + +#include + +G_BEGIN_DECLS + +#define PROJECT "Viking" +#define VIKING_VERSION PACKAGE_VERSION +#define VIKING_VERSION_NAME "This Name For Rent" +#define VIKING_URL PACKAGE_URL + +#define ALTI_TO_MPP 1.4017295 + +#define VIK_FEET_IN_METER 3.2808399 +#define VIK_METERS_TO_FEET(X) ((X)*VIK_FEET_IN_METER) +#define VIK_FEET_TO_METERS(X) ((X)/VIK_FEET_IN_METER) + +#define VIK_MILES_IN_METER 0.000621371192 +#define VIK_METERS_TO_MILES(X) ((X)*VIK_MILES_IN_METER) +#define VIK_MILES_TO_METERS(X) ((X)/VIK_MILES_IN_METER) + +#define VIK_NAUTICAL_MILES_IN_METER 0.000539957 +#define VIK_METERS_TO_NAUTICAL_MILES(X) ((X)*VIK_NAUTICAL_MILES_IN_METER) +#define VIK_NAUTICAL_MILES_TO_METERS(X) ((X)/VIK_NAUTICAL_MILES_IN_METER) + +/* MPS - Metres Per Second */ +/* MPH - Metres Per Hour */ +#define VIK_MPH_IN_MPS 2.23693629 +#define VIK_MPS_TO_MPH(X) ((X)*VIK_MPH_IN_MPS) +#define VIK_MPH_TO_MPS(X) ((X)/VIK_MPH_IN_MPS) + +/* KPH - Kilometres Per Hour */ +#define VIK_KPH_IN_MPS 3.6 +#define VIK_MPS_TO_KPH(X) ((X)*VIK_KPH_IN_MPS) +#define VIK_KPH_TO_MPS(X) ((X)/VIK_KPH_IN_MPS) + +/* Pace is a running unit of "speed" basically defined as the +time it takes to cover a given distance. It is useful for two +reasons: first, usually the distance to cover is fixed and +therefore the needed time can be found with a multiplication +(instead of a division) which is easy to perform by mind; +second, it is more sensitive to small differences, so it is +useful in races when differences between getting the podium +or not often depends on small differences in speed. + +Note that pace is infinite for speed=0, or very large +for very small speeds, which are usually not interesting +cases to analyze for a runner. To avoid overflows, and to +avoid the graph y-scale being overwhelmed by these numbers, +a cutting at 60s/km or equivalent (in other units) has been set*/ + +/* PACE_SPK, Seconds per Kilometer */ +#define VIK_MPS_TO_PACE_SPK(X) ((X) > 1.0 ? 3600./((X) * VIK_KPH_IN_MPS) : 0) + +/* PACE_MPK, Minutes per Kilometer */ +#define VIK_MPS_TO_PACE_MPK(X) ((X) > 1.0 ? 60./((X) * VIK_KPH_IN_MPS) : 0) + +/* PACE_SPM, Seconds per Mile */ +#define VIK_MPS_TO_PACE_SPM(X) ((X) > 1.0 ? 5793.6384 /((X) * VIK_KPH_IN_MPS) : 0) + +/* PACE_MPM, Minutes per Mile */ +#define VIK_MPS_TO_PACE_MPM(X) ((X) > 1.0 ? 96.56064 /((X) * VIK_KPH_IN_MPS) : 0) + +#define VIK_KNOTS_IN_MPS 1.94384449 +#define VIK_MPS_TO_KNOTS(X) ((X)*VIK_KNOTS_IN_MPS) +#define VIK_KNOTS_TO_MPS(X) ((X)/VIK_KNOTS_IN_MPS) + +#define VIK_DEFAULT_ALTITUDE 0.0 +#define VIK_DEFAULT_DOP 0.0 + +#define VIK_GTK_WINDOW_FROM_WIDGET(x) GTK_WINDOW(gtk_widget_get_toplevel(GTK_WIDGET(x))) +#define VIK_GTK_WINDOW_FROM_LAYER(x) VIK_GTK_WINDOW_FROM_WIDGET(VIK_LAYER(x)->vt) + +#define DEG2RAD(x) ((x)*(M_PI/180)) +#define RAD2DEG(x) ((x)*(180/M_PI)) + +/* mercator projection, latitude conversion (degrees) */ +#define MERCLAT(x) (RAD2DEG(log(tan((0.25 * M_PI) + (0.5 * DEG2RAD(x)))))) +#define DEMERCLAT(x) (RAD2DEG(atan(sinh(DEG2RAD(x))))) + +/* Some command line options */ +extern gboolean vik_debug; +extern gboolean vik_verbose; +extern gboolean vik_version; + +/* Allow comparing versions */ +gint viking_version_to_number ( gchar *version ); + +/* Very first run */ +gboolean a_vik_very_first_run (); + +/* Global preferences */ +void a_vik_preferences_init (); + +/* Coord display preferences */ +typedef enum { + VIK_DEGREE_FORMAT_DDD, + VIK_DEGREE_FORMAT_DMM, + VIK_DEGREE_FORMAT_DMS, + VIK_DEGREE_FORMAT_RAW, +} vik_degree_format_t; + +vik_degree_format_t a_vik_get_degree_format ( ); + +/* Distance preferences */ +typedef enum { + VIK_UNITS_DISTANCE_KILOMETRES, + VIK_UNITS_DISTANCE_MILES, + VIK_UNITS_DISTANCE_NAUTICAL_MILES, +} vik_units_distance_t; + +vik_units_distance_t a_vik_get_units_distance ( ); + +/* Speed preferences */ +typedef enum { + VIK_UNITS_SPEED_KILOMETRES_PER_HOUR, + VIK_UNITS_SPEED_MILES_PER_HOUR, + VIK_UNITS_SPEED_METRES_PER_SECOND, + VIK_UNITS_SPEED_KNOTS, + VIK_UNITS_SPEED_SECONDS_PER_KM, + VIK_UNITS_SPEED_MINUTES_PER_KM, + VIK_UNITS_SPEED_SECONDS_PER_MILE, + VIK_UNITS_SPEED_MINUTES_PER_MILE, +} vik_units_speed_t; + +vik_units_speed_t a_vik_get_units_speed ( ); + +/* Height (Depth) preferences */ +typedef enum { + VIK_UNITS_HEIGHT_METRES, + VIK_UNITS_HEIGHT_FEET, +} vik_units_height_t; + +vik_units_height_t a_vik_get_units_height ( ); + +gboolean a_vik_get_use_large_waypoint_icons ( ); + +/* Location preferences */ +typedef enum { + VIK_LOCATION_LAT, + VIK_LOCATION_LONG, +} vik_location_t; + +gdouble a_vik_get_default_lat ( ); +gdouble a_vik_get_default_long ( ); + +// Time display format +typedef enum { + VIK_TIME_REF_LOCALE, // User's locale + VIK_TIME_REF_WORLD, // Derive the local timezone at the object's position + VIK_TIME_REF_UTC, +} vik_time_ref_frame_t; + +vik_time_ref_frame_t a_vik_get_time_ref_frame ( ); + +/* KML export preferences */ +typedef enum { + VIK_KML_EXPORT_UNITS_METRIC, + VIK_KML_EXPORT_UNITS_STATUTE, + VIK_KML_EXPORT_UNITS_NAUTICAL, +} vik_kml_export_units_t; + +vik_kml_export_units_t a_vik_get_kml_export_units ( ); + +typedef enum { + VIK_GPX_EXPORT_TRK_SORT_ALPHA, + VIK_GPX_EXPORT_TRK_SORT_TIME, + VIK_GPX_EXPORT_TRK_SORT_CREATION, +} vik_gpx_export_trk_sort_t; + +vik_gpx_export_trk_sort_t a_vik_get_gpx_export_trk_sort ( ); + +typedef enum { + VIK_GPX_EXPORT_WPT_SYM_NAME_TITLECASE, + VIK_GPX_EXPORT_WPT_SYM_NAME_LOWERCASE, +} vik_gpx_export_wpt_sym_name_t; + +vik_gpx_export_wpt_sym_name_t a_vik_gpx_export_wpt_sym_name ( ); + +const gchar* a_vik_gpx_export_creator ( ); + +#ifndef WINDOWS +/* Windows automatically uses the system defined viewer + ATM for other systems need to specify the program to use */ +const gchar* a_vik_get_image_viewer ( ); +#endif + +const gchar* a_vik_get_external_gpx_program_1 ( ); + +const gchar* a_vik_get_external_gpx_program_2 ( ); + +/* File reference preferences - mainly in saving of a viking file */ +typedef enum { + VIK_FILE_REF_FORMAT_ABSOLUTE, + VIK_FILE_REF_FORMAT_RELATIVE, +} vik_file_ref_format_t; + +vik_file_ref_format_t a_vik_get_file_ref_format ( ); + +gboolean a_vik_get_ask_for_create_track_name ( ); + +gboolean a_vik_get_create_track_tooltip ( ); + +gboolean a_vik_get_open_files_in_selected_layer ( ); + +gboolean a_vik_get_calendar_show_day_names ( ); + +gboolean a_vik_get_restore_window_state ( ); + +gboolean a_vik_get_add_default_map_layer ( ); + +typedef enum { + VIK_STARTUP_METHOD_HOME_LOCATION, + VIK_STARTUP_METHOD_LAST_LOCATION, + VIK_STARTUP_METHOD_SPECIFIED_FILE, + VIK_STARTUP_METHOD_AUTO_LOCATION, +} vik_startup_method_t; + +vik_startup_method_t a_vik_get_startup_method ( ); + +const gchar *a_vik_get_startup_file ( ); + +gboolean a_vik_get_check_version ( ); + +gint a_vik_get_recent_number_files ( ); + +/* Group for global preferences */ +#define VIKING_PREFERENCES_GROUP_KEY "viking.globals" +#define VIKING_PREFERENCES_NAMESPACE "viking.globals." + +/* Another group of global preferences, + but in a separate section to try to keep things organized */ +/* AKA Export/External Prefs */ +#define VIKING_PREFERENCES_IO_GROUP_KEY "viking.io" +#define VIKING_PREFERENCES_IO_NAMESPACE "viking.io." + +/* Group for global preferences - but 'advanced' + User changeable but only for those that need it */ +#define VIKING_PREFERENCES_ADVANCED_GROUP_KEY "viking.advanced" +#define VIKING_PREFERENCES_ADVANCED_NAMESPACE "viking.advanced." + +#define VIKING_PREFERENCES_STARTUP_GROUP_KEY "viking.startup" +#define VIKING_PREFERENCES_STARTUP_NAMESPACE "viking.startup." + +// Additions to 'Stock Icons' +#define VIK_ICON_SHOW_PICTURE "vik-icon-Show Picture" + +G_END_DECLS + +#endif diff --git a/src/google.c b/src/google.c new file mode 100644 index 0000000..981fa68 --- /dev/null +++ b/src/google.c @@ -0,0 +1,88 @@ +/* + * viking -- GPS Data and Topo Analyzer, Explorer, and Manager + * + * Copyright (C) 2003-2005, Evan Battaglia + * + * 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., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA + * + */ +#ifdef HAVE_CONFIG_H +#include "config.h" +#endif + +#include + +#include "globals.h" +#include "google.h" +#include "vikexttools.h" +#include "vikwebtoolcenter.h" +#include "vikgoto.h" +#include "googlesearch.h" +#include "vikrouting.h" +#include "vikroutingwebengine.h" +#include "babel.h" + +void google_init () { + // Webtools + VikWebtoolCenter *webtool = vik_webtool_center_new_with_members ( _("Google"), "http://maps.google.com/maps/@%s,%s,%dz" ); + vik_ext_tools_register ( VIK_EXT_TOOL ( webtool ) ); + g_object_unref ( webtool ); + + // Goto + /* + * Google no longer supports the API we used + * + * If this is reinstated, implement + * google_goto_tool_parse_file_for_candidates in googlesearch.c + * + GoogleGotoTool *gototool = google_goto_tool_new ( ); + vik_goto_register ( VIK_GOTO_TOOL ( gototool ) ); + g_object_unref ( gototool ); + */ +} + +/** + * Delayed initialization part as the check for gpsbabel availability needs to have been performed + */ +void google_post_init () +{ + // Routing + /* Google Directions service as routing engine. + * + * Technical details are available here: + * https://developers.google.com/maps/documentation/directions/#DirectionsResponses + * + * gpsbabel supports this format. + */ + /* + * Google no longer supports the API we used + * + if ( a_babel_available() ) { + VikRoutingEngine *routing = g_object_new ( VIK_ROUTING_WEB_ENGINE_TYPE, + "id", "google", + "label", "Google", + "format", "google", + "url-base", "http://maps.google.com/maps?output=js&q=", + "url-start-ll", "from:%s,%s", + "url-stop-ll", "+to:%s,%s", + "url-start-dir", "from:%s", + "url-stop-dir", "+to:%s", + "referer", "http://maps.google.com/", + NULL); + vik_routing_register ( VIK_ROUTING_ENGINE ( routing ) ); + g_object_unref ( routing ); + } + */ +} diff --git a/src/google.h b/src/google.h new file mode 100644 index 0000000..82ffbbc --- /dev/null +++ b/src/google.h @@ -0,0 +1,28 @@ +/* + * viking -- GPS Data and Topo Analyzer, Explorer, and Manager + * + * Copyright (C) 2003-2005, Evan Battaglia + * + * 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., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA + * + */ + +#ifndef __VIKING_GOOGLE_H +#define __VIKING_GOOGLE_H + +void google_init(); +void google_post_init(); + +#endif diff --git a/src/googlesearch.c b/src/googlesearch.c new file mode 100644 index 0000000..f6afb5a --- /dev/null +++ b/src/googlesearch.c @@ -0,0 +1,171 @@ +/* + * viking -- GPS Data and Topo Analyzer, Explorer, and Manager + * + * Copyright (C) 2003-2005, Quy Tonthat + * Copyright (C) 2009, Guilhem Bonnefille + * + * 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., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA + */ +#ifdef HAVE_CONFIG_H +#include "config.h" +#endif +#include +#include +#include +#include +#include +#include +#include + +#include "viking.h" +#include "curl_download.h" + +#include "googlesearch.h" + +/* Compatibility */ +#if ! GLIB_CHECK_VERSION(2,22,0) +#define g_mapped_file_unref g_mapped_file_free +#endif + +#define GOOGLE_GOTO_URL_FMT "http://maps.google.com/maps?q=%s&output=js" +#define GOOGLE_GOTO_PATTERN_1 "{center:{lat:" +#define GOOGLE_GOTO_PATTERN_2 ",lng:" +#define GOOGLE_GOTO_NOT_FOUND "not understand the location" + +static DownloadFileOptions googlesearch_options = { FALSE, FALSE, "http://maps.google.com/", 2, a_check_map_file, NULL, NULL }; + +static void google_goto_tool_finalize ( GObject *gob ); + +static gchar *google_goto_tool_get_url_format ( VikGotoTool *self ); +static DownloadFileOptions *google_goto_tool_get_download_options ( VikGotoTool *self ); +static gboolean google_goto_tool_parse_file_for_latlon(VikGotoTool *self, gchar *filename, struct LatLon *ll); +static gboolean google_goto_tool_parse_file_for_candidates(VikGotoTool *self, gchar *filename, GList **candidates); + +G_DEFINE_TYPE (GoogleGotoTool, google_goto_tool, VIK_GOTO_TOOL_TYPE) + +static void google_goto_tool_class_init ( GoogleGotoToolClass *klass ) +{ + GObjectClass *object_class; + VikGotoToolClass *parent_class; + + object_class = G_OBJECT_CLASS (klass); + + object_class->finalize = google_goto_tool_finalize; + + parent_class = VIK_GOTO_TOOL_CLASS (klass); + + parent_class->get_url_format = google_goto_tool_get_url_format; + parent_class->get_download_options = google_goto_tool_get_download_options; + parent_class->parse_file_for_latlon = google_goto_tool_parse_file_for_latlon; + parent_class->parse_file_for_candidates = google_goto_tool_parse_file_for_candidates; +} + +GoogleGotoTool *google_goto_tool_new () +{ + return GOOGLE_GOTO_TOOL ( g_object_new ( GOOGLE_GOTO_TOOL_TYPE, "label", "Google", NULL ) ); +} + +static void google_goto_tool_init ( GoogleGotoTool *vlp ) +{ +} + +static void google_goto_tool_finalize ( GObject *gob ) +{ + G_OBJECT_GET_CLASS(gob)->finalize(gob); +} + +static gboolean google_goto_tool_parse_file_for_latlon(VikGotoTool *self, gchar *file_name, struct LatLon *ll) +{ + gchar *text, *pat; + GMappedFile *mf; + gsize len; + gboolean found = TRUE; + gchar lat_buf[32], lon_buf[32]; + gchar *s; + + lat_buf[0] = lon_buf[0] = '\0'; + + if ((mf = g_mapped_file_new(file_name, FALSE, NULL)) == NULL) { + g_critical(_("couldn't map temp file")); + return FALSE; + } + len = g_mapped_file_get_length(mf); + text = g_mapped_file_get_contents(mf); + + if (g_strstr_len(text, len, GOOGLE_GOTO_NOT_FOUND) != NULL) { + found = FALSE; + goto done; + } + + if ((pat = g_strstr_len(text, len, GOOGLE_GOTO_PATTERN_1)) == NULL) { + found = FALSE; + goto done; + } + pat += strlen(GOOGLE_GOTO_PATTERN_1); + s = lat_buf; + if (*pat == '-') + *s++ = *pat++; + while ((s < (lat_buf + sizeof(lat_buf))) && (pat < (text + len)) && + (g_ascii_isdigit(*pat) || (*pat == '.'))) + *s++ = *pat++; + *s = '\0'; + if ((pat >= (text + len)) || (lat_buf[0] == '\0')) { + found = FALSE; + goto done; + } + + if (strncmp(pat, GOOGLE_GOTO_PATTERN_2, strlen(GOOGLE_GOTO_PATTERN_2))) { + found = FALSE; + goto done; + } + + pat += strlen(GOOGLE_GOTO_PATTERN_2); + s = lon_buf; + + if (*pat == '-') + *s++ = *pat++; + while ((s < (lon_buf + sizeof(lon_buf))) && (pat < (text + len)) && + (g_ascii_isdigit(*pat) || (*pat == '.'))) + *s++ = *pat++; + *s = '\0'; + if ((pat >= (text + len)) || (lon_buf[0] == '\0')) { + found = FALSE; + goto done; + } + + ll->lat = g_ascii_strtod(lat_buf, NULL); + ll->lon = g_ascii_strtod(lon_buf, NULL); + +done: + g_mapped_file_unref(mf); + return (found); + +} + +// TODO: implement this -- The Google API is currently disabled +static gboolean google_goto_tool_parse_file_for_candidates(VikGotoTool *self, gchar *file_name, GList **candidates) +{ + return FALSE; +} + +static gchar *google_goto_tool_get_url_format ( VikGotoTool *self ) +{ + return GOOGLE_GOTO_URL_FMT; +} + +DownloadFileOptions *google_goto_tool_get_download_options ( VikGotoTool *self ) +{ + return &googlesearch_options; +} diff --git a/src/googlesearch.h b/src/googlesearch.h new file mode 100644 index 0000000..5aca908 --- /dev/null +++ b/src/googlesearch.h @@ -0,0 +1,58 @@ +/* + * viking -- GPS Data and Topo Analyzer, Explorer, and Manager + * + * Copyright (C) 2003-2005, Quy Tonthat + * Copyright (C) 2009, Guilhem Bonnefille + * + * 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., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA + */ +#ifndef __VIK_GOOGLEGOTO_H +#define __VIK_GOOGLEGOTO_H + +#include + +#include "vikwindow.h" + +#include "vikgototool.h" + +G_BEGIN_DECLS + +#define GOOGLE_GOTO_TOOL_TYPE (google_goto_tool_get_type ()) +#define GOOGLE_GOTO_TOOL(obj) (G_TYPE_CHECK_INSTANCE_CAST ((obj), GOOGLE_GOTO_TOOL_TYPE, GoogleGotoTool)) +#define GOOGLE_GOTO_TOOL_CLASS(klass) (G_TYPE_CHECK_CLASS_CAST ((klass), GOOGLE_GOTO_TOOL_TYPE, GoogleGotoToolClass)) +#define IS_GOOGLE_GOTO_TOOL(obj) (G_TYPE_CHECK_INSTANCE_TYPE ((obj), GOOGLE_GOTO_TOOL_TYPE)) +#define IS_GOOGLE_GOTO_TOOL_CLASS(klass) (G_TYPE_CHECK_CLASS_TYPE ((klass), GOOGLE_GOTO_TOOL_TYPE)) +#define GOOGLE_GOTO_TOOL_GET_CLASS(obj) (G_TYPE_INSTANCE_GET_CLASS ((obj), GOOGLE_GOTO_TOOL_TYPE, GoogleGotoToolClass)) + + +typedef struct _GoogleGotoTool GoogleGotoTool; +typedef struct _GoogleGotoToolClass GoogleGotoToolClass; + +struct _GoogleGotoToolClass +{ + VikGotoToolClass object_class; +}; + +GType google_goto_tool_get_type (); + +struct _GoogleGotoTool { + VikGotoTool obj; +}; + +GoogleGotoTool *google_goto_tool_new (); + +G_END_DECLS + +#endif diff --git a/src/gpsmapper.c b/src/gpsmapper.c new file mode 100644 index 0000000..c64c80c --- /dev/null +++ b/src/gpsmapper.c @@ -0,0 +1,150 @@ +/* + * viking -- GPS Data and Topo Analyzer, Explorer, and Manager + * + * Copyright (C) 2003-2005, Evan Battaglia + * + * 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., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA + * + */ +#include "viking.h" + +#include + +/* Name of layer -> RGN type and Type + format: Name RGN40 0x40 + or: Name RGN10 0x2f06 +*/ +/* returns 0 if invalid/no rgn stuff, else returns len of */ +static guint print_rgn_stuff ( const gchar *nm, FILE *f ) +{ + guint len; + gchar *layers; + gchar *name; + + if (!nm) + return 0; + + name = g_strdup ( nm ); + + len = strlen(name); + + + + /* --------------------------------------------- */ + /* added by oddgeir@oddgeirkvien.com, 2005.02.02 */ + /* Format may also be: Name RGN40 0x40 Layers=1 */ + /* or: Name RGN10 0x2f06 Layers=1 */ + + if ( len > 20 && strncasecmp(name+len-8,"LAYERS=",7) == 0 ) /* Layers is added to the description */ + { + layers=name+len-8; + *(name+len-9)=0; + len = strlen(name); + } + else + { + layers=0; + } + /* --------------------------------------------- */ + + + + if ( len > 11 && strncasecmp(name+len-10,"RGN",3) == 0 && +strncasecmp(name+len-4,"0x",2) == 0 ) + { + fprintf ( f, "[%.5s]\nType=%.4s\nLabel=", name+len-10, name+len-4 ); + fwrite ( name, sizeof(gchar), len - 11, f ); + fprintf ( f, "\n" ); + +/* added by oddgeir@oddgeirkvien.com, 2005.02.02 */ + if (layers) fprintf( f, "%s\n",layers); + + g_free ( name ); + + return len - 11; + } + else if ( len > 13 && strncasecmp(name+len-12,"RGN",3) == 0 && +strncasecmp(name+len-6,"0x",2) == 0 ) + { + fprintf ( f, "[%.5s]\nType=%.6s\nLabel=", name+len-12, name+len-6 ); + fwrite ( name, sizeof(gchar), len - 13, f ); + fprintf ( f, "\n" ); + +/* added by oddgeir@oddgeirkvien.com, 2005.02.02 */ + if (layers) fprintf( f, "%s\n",layers); + + g_free ( name ); + + return len - 13; + } + else { + g_free ( name ); + return 0; + } +} + +static void write_waypoint ( const gchar *name, VikWaypoint *wp, FILE *f ) +{ + static struct LatLon ll; + guint len = print_rgn_stuff ( wp->comment, f ); + if ( len ) + { + gchar *s_lat, *s_lon; + vik_coord_to_latlon ( &(wp->coord), &ll ); + s_lat = a_coords_dtostr(ll.lat); + s_lon = a_coords_dtostr(ll.lon); + fprintf ( f, "Data0=(%s,%s)\n", s_lat, s_lon ); + g_free ( s_lat ); + g_free ( s_lon ); + fprintf ( f, "[END-%.5s]\n\n", wp->comment+len+1 ); + } +} + +static void write_trackpoint ( VikTrackpoint *tp, FILE *f ) +{ + static struct LatLon ll; + gchar *s_lat, *s_lon; + vik_coord_to_latlon ( &(tp->coord), &ll ); + s_lat = a_coords_dtostr(ll.lat); + s_lon = a_coords_dtostr(ll.lon); + fprintf ( f, "(%s,%s),", s_lat, s_lon ); + g_free ( s_lat ); + g_free ( s_lon ); +} + +static void write_track ( const gchar *name, VikTrack *t, FILE *f ) +{ + guint len = print_rgn_stuff ( t->comment, f ); + if ( len ) + { + fprintf ( f, "Data0=" ); + g_list_foreach ( t->trackpoints, (GFunc) write_trackpoint, f ); + fprintf ( f, "\n[END-%.5s]\n\n", t->comment+len+1 ); + } +} + +void a_gpsmapper_write_file ( VikTrwLayer *trw, FILE *f ) +{ + GHashTable *tracks = vik_trw_layer_get_tracks ( trw ); + GHashTable *waypoints = vik_trw_layer_get_waypoints ( trw ); + + fprintf ( f, "[IMG ID]\nID=%s\nName=%s\nTreSize=1000\nRgnLimit=700\nLevels=2\nLevel0=22\nLevel1=18\nZoom0=0\nZoom1=1\n[END-IMG ID]\n\n", + VIK_LAYER(trw)->name, VIK_LAYER(trw)->name ); + + g_hash_table_foreach ( waypoints, (GHFunc) write_waypoint, f ); + g_hash_table_foreach ( tracks, (GHFunc) write_track, f ); +} + + diff --git a/src/gpsmapper.h b/src/gpsmapper.h new file mode 100644 index 0000000..17a52b1 --- /dev/null +++ b/src/gpsmapper.h @@ -0,0 +1,33 @@ +/* + * viking -- GPS Data and Topo Analyzer, Explorer, and Manager + * + * Copyright (C) 2003-2005, Evan Battaglia + * + * 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., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA + * + */ + +#ifndef __GPSMAPPER_H +#define __GPSMAPPER_H + +#include "viktrwlayer.h" + +G_BEGIN_DECLS + +void a_gpsmapper_write_file ( VikTrwLayer *trw, FILE *f ); + +G_END_DECLS + +#endif diff --git a/src/gpspoint.c b/src/gpspoint.c new file mode 100644 index 0000000..3f185f5 --- /dev/null +++ b/src/gpspoint.c @@ -0,0 +1,836 @@ +/* + * viking -- GPS Data and Topo Analyzer, Explorer, and Manager + * + * Copyright (C) 2003-2005, Evan Battaglia + * Copyright (C) 2012-2013, Rob Norris + * + * 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., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA + * + */ +#ifdef HAVE_CONFIG_H +#include "config.h" +#endif + +#ifdef HAVE_MATH_H +#include +#endif + +#include "viking.h" +#include "vikutils.h" + +#include +#ifdef HAVE_STRING_H +#include +#endif + +#include +/* strtod */ + +typedef struct { + FILE *f; + gboolean is_route; +} TP_write_info_type; + +static void a_gpspoint_write_track ( const gpointer id, const VikTrack *t, FILE *f ); +static void a_gpspoint_write_trackpoint ( VikTrackpoint *tp, TP_write_info_type *write_info ); + +/* outline for file gpspoint.c + +reading file: + +take a line. +get first tag, if not type, skip it. +if type, record type. if waypoint list, etc move on. if track, make a new track, make it current track, add it, etc. +if waypoint, read on and store to the waypoint. +if trackpoint, make trackpoint, store to current track (error / skip if none) + +*/ + +/* Thanks to etrex-cache's gpsbabel's gpspoint.c for starting me off! */ +#define VIKING_LINE_SIZE 4096 +static char line_buffer[VIKING_LINE_SIZE]; + +#define GPSPOINT_TYPE_NONE 0 +#define GPSPOINT_TYPE_WAYPOINT 1 +#define GPSPOINT_TYPE_TRACKPOINT 2 +#define GPSPOINT_TYPE_ROUTEPOINT 3 +#define GPSPOINT_TYPE_TRACK 4 +#define GPSPOINT_TYPE_TRACK_END 5 +#define GPSPOINT_TYPE_ROUTE 6 +#define GPSPOINT_TYPE_ROUTE_END 7 + +static VikTrack *current_track; /* pointer to pointer to first GList */ + +static gint line_type = GPSPOINT_TYPE_NONE; +static struct LatLon line_latlon; +static gchar *line_name; +static gchar *line_comment; +static gchar *line_description; +static gchar *line_source; +static gchar *line_xtype; +static gchar *line_color; +static gint line_name_label = 0; +static gint line_dist_label = 0; +static gchar *line_image; +static gchar *line_symbol; +static gdouble line_image_direction = NAN; +static VikWaypointImageDirectionRef line_image_direction_ref = WP_IMAGE_DIRECTION_REF_TRUE; +static gboolean line_newsegment = FALSE; +static gboolean line_has_timestamp = FALSE; +static time_t line_timestamp = 0; +static gdouble line_altitude = VIK_DEFAULT_ALTITUDE; +static gboolean line_visible = TRUE; + +static gboolean line_extended = FALSE; +static gdouble line_speed = NAN; +static gdouble line_course = NAN; +static gint line_sat = 0; +static gint line_fix = 0; +static gdouble line_hdop = VIK_DEFAULT_DOP; +static gdouble line_vdop = VIK_DEFAULT_DOP; +static gdouble line_pdop = VIK_DEFAULT_DOP; +/* other possible properties go here */ + + +static void gpspoint_process_tag ( const gchar *tag, guint len ); +static void gpspoint_process_key_and_value ( const gchar *key, guint key_len, const gchar *value, guint value_len ); + +static gchar *slashdup(const gchar *str) +{ + size_t len = strlen(str); + size_t need_bs_count, i, j; + gchar *rv; + for ( i = 0, need_bs_count = 0; i < len; i++ ) + if ( str[i] == '\\' || str[i] == '"' ) + need_bs_count++; + rv = g_malloc ( (len+need_bs_count+1) * sizeof(gchar) ); + for ( i = 0, j = 0; i < len; i++, j++ ) + { + if ( str[i] == '\\' || str[i] == '"' ) + rv[j++] = '\\'; + rv[j] = str[i]; + // Basic normalization of strings - replace Linefeed and Carriage returns as blanks. + // although allowed in GPX Spec - Viking file format can't handle multi-line strings yet... + if ( str[i] == '\n' || str[i] == '\r' ) + rv[j] = ' '; + } + rv[j] = '\0'; + return rv; +} + +static gchar *deslashndup ( const gchar *str, guint16 len ) +{ + guint16 i,j, bs_count, new_len; + gboolean backslash = FALSE; + gchar *rv; + + if ( len < 1 ) + return NULL; + + for ( i = 0, bs_count = 0; i < len; i++ ) + if ( str[i] == '\\' ) + { + bs_count++; + i++; + } + + if ( str[i-1] == '\\' && (len == 1 || str[i-2] != '\\') ) + bs_count--; + + new_len = len - bs_count; + rv = g_malloc ( (new_len+1) * sizeof(gchar) ); + for ( i = 0, j = 0; i < len && j < new_len; i++ ) + if ( str[i] == '\\' && !backslash ) + backslash = TRUE; + else + { + rv[j++] = str[i]; + backslash = FALSE; + } + + rv[new_len] = '\0'; + return rv; +} + + +static void trackpoints_end () +{ + if ( current_track ) + if ( current_track->trackpoints ) { + current_track->trackpoints = g_list_reverse ( current_track->trackpoints ); + current_track = NULL; + } +} + +/* + * Returns whether file read was a success + * No obvious way to test for a 'gpspoint' file, + * thus set a flag if any actual tag found during processing of the file + */ +gboolean a_gpspoint_read_file(VikTrwLayer *trw, FILE *f, const gchar *dirpath ) { + VikCoordMode coord_mode = vik_trw_layer_get_coord_mode ( trw ); + gchar *tag_start, *tag_end; + g_assert ( f != NULL && trw != NULL ); + line_type = GPSPOINT_TYPE_NONE; + line_timestamp = 0; + line_newsegment = FALSE; + line_image = NULL; + line_symbol = NULL; + current_track = NULL; + gboolean have_read_something = FALSE; + + while (fgets(line_buffer, VIKING_LINE_SIZE, f)) + { + gboolean inside_quote = 0; + gboolean backslash = 0; + + line_buffer[strlen(line_buffer)-1] = '\0'; /* chop off newline */ + + /* for gpspoint files wrapped inside */ + if ( strlen(line_buffer) >= 13 && strncmp ( line_buffer, "~EndLayerData", 13 ) == 0 ) { + // Even just a blank TRW is ok when in a .vik file + have_read_something = TRUE; + break; + } + + /* each line: nullify stuff, make thing if nes, free name if ness */ + tag_start = line_buffer; + for (;;) + { + /* my addition: find first non-whitespace character. if the null, skip line. */ + while (*tag_start != '\0' && isspace(*tag_start)) + tag_start++; + if (*tag_start == '\0') + break; + + if (*tag_start == '#') + break; + + tag_end = tag_start; + if (*tag_end == '"') + inside_quote = !inside_quote; + while (*tag_end != '\0' && (!isspace(*tag_end) || inside_quote)) { + tag_end++; + if (*tag_end == '\\' && !backslash) + backslash = TRUE; + else if (backslash) + backslash = FALSE; + else if (*tag_end == '"') + inside_quote = !inside_quote; + } + + // Won't have super massively long strings, so potential truncation in cast is acceptable. + guint len = (guint)(tag_end - tag_start); + gpspoint_process_tag ( tag_start, len ); + + if (*tag_end == '\0' ) + break; + else + tag_start = tag_end+1; + } + if (line_type == GPSPOINT_TYPE_TRACK_END || line_type == GPSPOINT_TYPE_ROUTE_END) { + trackpoints_end (); + } + if (line_type == GPSPOINT_TYPE_WAYPOINT && line_name) + { + // Handle a badly formatted file in case of missing explicit track/route end (this shouldn't happen) + trackpoints_end (); + have_read_something = TRUE; + VikWaypoint *wp = vik_waypoint_new(); + wp->visible = line_visible; + wp->altitude = line_altitude; + wp->has_timestamp = line_has_timestamp; + wp->timestamp = line_timestamp; + + vik_coord_load_from_latlon ( &(wp->coord), coord_mode, &line_latlon ); + + vik_trw_layer_filein_add_waypoint ( trw, line_name, wp ); + g_free ( line_name ); + line_name = NULL; + + if ( line_comment ) + vik_waypoint_set_comment ( wp, line_comment ); + + if ( line_description ) + vik_waypoint_set_description ( wp, line_description ); + + if ( line_source ) + vik_waypoint_set_source ( wp, line_source ); + + if ( line_xtype ) + vik_waypoint_set_type ( wp, line_xtype ); + + if ( line_image ) { + gchar *fn = util_make_absolute_filename ( line_image, dirpath ); + vik_waypoint_set_image ( wp, fn ? fn : line_image ); + g_free ( fn ); + } + + if ( !isnan(line_image_direction) ) { + wp->image_direction = line_image_direction; + wp->image_direction_ref = line_image_direction_ref; + } + + if ( line_symbol ) + vik_waypoint_set_symbol ( wp, line_symbol ); + } + else if ((line_type == GPSPOINT_TYPE_TRACK || line_type == GPSPOINT_TYPE_ROUTE) && line_name) + { + // Handle a badly formatted file in case of missing explicit track/route end (this shouldn't happen) + trackpoints_end (); + have_read_something = TRUE; + VikTrack *pl = vik_track_new(); + // NB don't set defaults here as all properties are stored in the GPS_POINT format + //vik_track_set_defaults ( pl ); + + /* Thanks to Peter Jones for this Fix */ + if (!line_name) line_name = g_strdup("UNK"); + + pl->visible = line_visible; + pl->is_route = (line_type == GPSPOINT_TYPE_ROUTE); + + if ( line_comment ) + vik_track_set_comment ( pl, line_comment ); + + if ( line_description ) + vik_track_set_description ( pl, line_description ); + + if ( line_source ) + vik_track_set_source ( pl, line_source ); + + if ( line_xtype ) + vik_track_set_type ( pl, line_xtype ); + + if ( line_color ) + { + if ( gdk_color_parse ( line_color, &(pl->color) ) ) + pl->has_color = TRUE; + } + + pl->draw_name_mode = line_name_label; + pl->max_number_dist_labels = line_dist_label; + + pl->trackpoints = NULL; + vik_trw_layer_filein_add_track ( trw, line_name, pl ); + g_free ( line_name ); + line_name = NULL; + + current_track = pl; + } + else if ((line_type == GPSPOINT_TYPE_TRACKPOINT || line_type == GPSPOINT_TYPE_ROUTEPOINT) && current_track) + { + have_read_something = TRUE; + VikTrackpoint *tp = vik_trackpoint_new(); + vik_coord_load_from_latlon ( &(tp->coord), coord_mode, &line_latlon ); + tp->newsegment = line_newsegment; + tp->has_timestamp = line_has_timestamp; + tp->timestamp = line_timestamp; + tp->altitude = line_altitude; + vik_trackpoint_set_name ( tp, line_name ); + if (line_extended) { + tp->speed = line_speed; + tp->course = line_course; + tp->nsats = line_sat; + tp->fix_mode = line_fix; + tp->hdop = line_hdop; + tp->vdop = line_vdop; + tp->pdop = line_pdop; + } + // Much faster to prepend and then reverse list once all points read in + // Especially if hunderds of thousands or more trackpoints in a file + current_track->trackpoints = g_list_prepend ( current_track->trackpoints, tp ); + } + + if (line_name) + g_free ( line_name ); + line_name = NULL; + if (line_comment) + g_free ( line_comment ); + if (line_description) + g_free ( line_description ); + if (line_source) + g_free ( line_source ); + if (line_xtype) + g_free ( line_xtype ); + if (line_color) + g_free ( line_color ); + if (line_image) + g_free ( line_image ); + if (line_symbol) + g_free ( line_symbol ); + line_comment = NULL; + line_description = NULL; + line_source = NULL; + line_xtype = NULL; + line_color = NULL; + line_image = NULL; + line_image_direction = NAN; + line_image_direction_ref = WP_IMAGE_DIRECTION_REF_TRUE; + line_symbol = NULL; + line_type = GPSPOINT_TYPE_NONE; + line_newsegment = FALSE; + line_has_timestamp = FALSE; + line_timestamp = 0; + line_altitude = VIK_DEFAULT_ALTITUDE; + line_visible = TRUE; + line_symbol = NULL; + + line_extended = FALSE; + line_speed = NAN; + line_course = NAN; + line_sat = 0; + line_fix = 0; + line_hdop = VIK_DEFAULT_DOP; + line_vdop = VIK_DEFAULT_DOP; + line_pdop = VIK_DEFAULT_DOP; + line_name_label = 0; + line_dist_label = 0; + } + + // Handle a badly formatted file in case of missing explicit track/route end (this shouldn't happen) + trackpoints_end (); + + return have_read_something; +} + +/* Tag will be of a few defined forms: + ^[:alpha:]*=".*"$ + ^[:alpha:]*=.*$ + + + +So we must determine end of tag name, start of value, end of value. +*/ +static void gpspoint_process_tag ( const gchar *tag, guint len ) +{ + const gchar *key_end, *value_start, *value_end; + + /* Searching for key end */ + key_end = tag; + + while (++key_end - tag < len) + if (*key_end == '=') + break; + + if (key_end - tag == len) + return; /* no good */ + + if (key_end - tag == len + 1) + value_start = value_end = 0; /* size = 0 */ + else + { + value_start = key_end + 1; /* equal_sign plus one */ + + if (*value_start == '"') + { + value_start++; + if (*value_start == '"') + value_start = value_end = 0; /* size = 0 */ + else + { + if (*(tag+len-1) == '"') + value_end = tag + len - 1; + else + return; /* bogus */ + } + } + else + value_end = tag + len; /* value start really IS value start. */ + + // Detect broken lines which end without any text or the enclosing ". i.e. like: comment=" + if ( (value_end - value_start) < 0 ) + return; + + gpspoint_process_key_and_value(tag, key_end - tag, value_start, value_end - value_start); + } +} + +/* +value = NULL for none +*/ +static void gpspoint_process_key_and_value ( const gchar *key, guint key_len, const gchar *value, guint value_len ) +{ + if (key_len == 4 && strncasecmp( key, "type", key_len ) == 0 ) + { + if (value == NULL) + line_type = GPSPOINT_TYPE_NONE; + else if (value_len == 5 && strncasecmp( value, "track", value_len ) == 0 ) + line_type = GPSPOINT_TYPE_TRACK; + else if (value_len == 8 && strncasecmp( value, "trackend", value_len ) == 0 ) + line_type = GPSPOINT_TYPE_TRACK_END; + else if (value_len == 10 && strncasecmp( value, "trackpoint", value_len ) == 0 ) + line_type = GPSPOINT_TYPE_TRACKPOINT; + else if (value_len == 8 && strncasecmp( value, "waypoint", value_len ) == 0 ) + line_type = GPSPOINT_TYPE_WAYPOINT; + else if (value_len == 5 && strncasecmp( value, "route", value_len ) == 0 ) + line_type = GPSPOINT_TYPE_ROUTE; + else if (value_len == 8 && strncasecmp( value, "routeend", value_len ) == 0 ) + line_type = GPSPOINT_TYPE_ROUTE_END; + else if (value_len == 10 && strncasecmp( value, "routepoint", value_len ) == 0 ) + line_type = GPSPOINT_TYPE_ROUTEPOINT; + else + /* all others are ignored */ + line_type = GPSPOINT_TYPE_NONE; + } + else if (key_len == 4 && strncasecmp( key, "name", key_len ) == 0 && value != NULL) + { + if (line_name == NULL) + { + line_name = deslashndup ( value, value_len ); + } + } + else if (key_len == 7 && strncasecmp( key, "comment", key_len ) == 0 && value != NULL) + { + if (line_comment == NULL) + line_comment = deslashndup ( value, value_len ); + } + else if (key_len == 11 && strncasecmp( key, "description", key_len ) == 0 && value != NULL) + { + if (line_description == NULL) + line_description = deslashndup ( value, value_len ); + } + else if (key_len == 6 && strncasecmp( key, "source", key_len ) == 0 && value != NULL) + { + if (line_source == NULL) + line_source = deslashndup ( value, value_len ); + } + // NB using 'xtype' to differentiate from our own 'type' key + else if (key_len == 5 && strncasecmp( key, "xtype", key_len ) == 0 && value != NULL) + { + if (line_xtype == NULL) + line_xtype = deslashndup ( value, value_len ); + } + else if (key_len == 5 && strncasecmp( key, "color", key_len ) == 0 && value != NULL) + { + if (line_color == NULL) + line_color = deslashndup ( value, value_len ); + } + else if (key_len == 14 && strncasecmp( key, "draw_name_mode", key_len ) == 0 && value != NULL) + { + line_name_label = atoi(value); + } + else if (key_len == 18 && strncasecmp( key, "number_dist_labels", key_len ) == 0 && value != NULL) + { + line_dist_label = atoi(value); + } + else if (key_len == 5 && strncasecmp( key, "image", key_len ) == 0 && value != NULL) + { + if (line_image == NULL) + line_image = deslashndup ( value, value_len ); + } + else if (key_len == 15 && strncasecmp( key, "image_direction", key_len ) == 0 && value != NULL) + { + line_image_direction = g_ascii_strtod(value, NULL); + } + else if (key_len == 19 && strncasecmp( key, "image_direction_ref", key_len ) == 0 && value != NULL) + { + line_image_direction_ref = atoi(value); + } + else if (key_len == 8 && strncasecmp( key, "latitude", key_len ) == 0 && value != NULL) + { + line_latlon.lat = g_ascii_strtod(value, NULL); + } + else if (key_len == 9 && strncasecmp( key, "longitude", key_len ) == 0 && value != NULL) + { + line_latlon.lon = g_ascii_strtod(value, NULL); + } + else if (key_len == 8 && strncasecmp( key, "altitude", key_len ) == 0 && value != NULL) + { + line_altitude = g_ascii_strtod(value, NULL); + } + else if (key_len == 7 && strncasecmp( key, "visible", key_len ) == 0 && value != NULL && value[0] != 'y' && value[0] != 'Y' && value[0] != 't' && value[0] != 'T') + { + line_visible = FALSE; + } + else if (key_len == 6 && strncasecmp( key, "symbol", key_len ) == 0 && value != NULL) + { + line_symbol = g_strndup ( value, value_len ); + } + else if (key_len == 8 && strncasecmp( key, "unixtime", key_len ) == 0 && value != NULL) + { + line_timestamp = g_ascii_strtod(value, NULL); + if ( line_timestamp != 0x80000000 ) + line_has_timestamp = TRUE; + } + else if (key_len == 10 && strncasecmp( key, "newsegment", key_len ) == 0 && value != NULL) + { + line_newsegment = TRUE; + } + else if (key_len == 8 && strncasecmp( key, "extended", key_len ) == 0 && value != NULL) + { + line_extended = TRUE; + } + else if (key_len == 5 && strncasecmp( key, "speed", key_len ) == 0 && value != NULL) + { + line_speed = g_ascii_strtod(value, NULL); + } + else if (key_len == 6 && strncasecmp( key, "course", key_len ) == 0 && value != NULL) + { + line_course = g_ascii_strtod(value, NULL); + } + else if (key_len == 3 && strncasecmp( key, "sat", key_len ) == 0 && value != NULL) + { + line_sat = atoi(value); + } + else if (key_len == 3 && strncasecmp( key, "fix", key_len ) == 0 && value != NULL) + { + line_fix = atoi(value); + } + else if (key_len == 4 && strncasecmp( key, "hdop", key_len ) == 0 && value != NULL) + { + line_hdop = g_ascii_strtod(value, NULL); + } + else if (key_len == 4 && strncasecmp( key, "vdop", key_len ) == 0 && value != NULL) + { + line_vdop = g_ascii_strtod(value, NULL); + } + else if (key_len == 4 && strncasecmp( key, "pdop", key_len ) == 0 && value != NULL) + { + line_pdop = g_ascii_strtod(value, NULL); + } +} + +typedef struct { + FILE *file; + const gchar *dirpath; +} WritingContext; + +static void a_gpspoint_write_waypoint ( const gpointer id, const VikWaypoint *wp, WritingContext *wc ) +{ + struct LatLon ll; + gchar s_lat[COORDS_STR_BUFFER_SIZE]; + gchar s_lon[COORDS_STR_BUFFER_SIZE]; + // Sanity clauses + if ( !wp ) + return; + if ( !(wp->name) ) + return; + if ( !wc ) + return; + + FILE *f = wc->file; + + vik_coord_to_latlon ( &(wp->coord), &ll ); + a_coords_dtostr_buffer ( ll.lat, s_lat ); + a_coords_dtostr_buffer ( ll.lon, s_lon ); + gchar *tmp_name = slashdup(wp->name); + fprintf ( f, "type=\"waypoint\" latitude=\"%s\" longitude=\"%s\" name=\"%s\"", s_lat, s_lon, tmp_name ); + g_free ( tmp_name ); + + if ( wp->altitude != VIK_DEFAULT_ALTITUDE ) { + gchar s_alt[COORDS_STR_BUFFER_SIZE]; + a_coords_dtostr_buffer ( wp->altitude, s_alt ); + fprintf ( f, " altitude=\"%s\"", s_alt ); + } + if ( wp->has_timestamp ) + fprintf ( f, " unixtime=\"%ld\"", wp->timestamp ); + if ( wp->comment ) + { + gchar *tmp_comment = slashdup(wp->comment); + fprintf ( f, " comment=\"%s\"", tmp_comment ); + g_free ( tmp_comment ); + } + if ( wp->description ) + { + gchar *tmp_description = slashdup(wp->description); + fprintf ( f, " description=\"%s\"", tmp_description ); + g_free ( tmp_description ); + } + if ( wp->source ) + { + gchar *tmp_source = slashdup(wp->source); + fprintf ( f, " source=\"%s\"", tmp_source ); + g_free ( tmp_source ); + } + if ( wp->type ) + { + gchar *tmp_type = slashdup(wp->type); + fprintf ( f, " xtype=\"%s\"", tmp_type ); + g_free ( tmp_type ); + } + if ( wp->image ) + { + gchar *tmp_image = NULL; + if ( a_vik_get_file_ref_format() == VIK_FILE_REF_FORMAT_RELATIVE ) { + if ( wc->dirpath ) + tmp_image = g_strdup ( file_GetRelativeFilename ( (gchar*)wc->dirpath, wp->image ) ); + } + + // if tmp_image not available - use image filename as is + // this should be an absolute path as set in thumbnails + if ( !tmp_image ) + tmp_image = slashdup(wp->image); + + if ( tmp_image ) + fprintf ( f, " image=\"%s\"", tmp_image ); + + g_free ( tmp_image ); + } + if ( !isnan(wp->image_direction) ) + { + gchar *tmp = util_formatd ( "%.2f", wp->image_direction ); + fprintf ( f, " image_direction=\"%s\"", tmp ); + g_free ( tmp ); + fprintf ( f, " image_direction_ref=\"%d\"", wp->image_direction_ref ); + } + if ( wp->symbol ) + { + // Due to changes in garminsymbols - the symbol name is now in Title Case + // However to keep newly generated .vik files better compatible with older Viking versions + // The symbol names will always be lowercase + gchar *tmp_symbol = g_utf8_strdown(wp->symbol, -1); + fprintf ( f, " symbol=\"%s\"", tmp_symbol ); + g_free ( tmp_symbol ); + } + if ( ! wp->visible ) + fprintf ( f, " visible=\"n\"" ); + fprintf ( f, "\n" ); +} + +static void a_gpspoint_write_trackpoint ( VikTrackpoint *tp, TP_write_info_type *write_info ) +{ + struct LatLon ll; + gchar s_lat[COORDS_STR_BUFFER_SIZE]; + gchar s_lon[COORDS_STR_BUFFER_SIZE]; + gchar s_alt[COORDS_STR_BUFFER_SIZE]; + vik_coord_to_latlon ( &(tp->coord), &ll ); + + FILE *f = write_info->f; + + a_coords_dtostr_buffer ( ll.lat, s_lat ); + a_coords_dtostr_buffer ( ll.lon, s_lon ); + fprintf ( f, "type=\"%spoint\" latitude=\"%s\" longitude=\"%s\"", write_info->is_route ? "route" : "track", s_lat, s_lon ); + + if ( tp->name ) { + gchar *name = slashdup(tp->name); + fprintf ( f, " name=\"%s\"", name ); + g_free(name); + } + + if ( tp->altitude != VIK_DEFAULT_ALTITUDE ) { + a_coords_dtostr_buffer ( tp->altitude, s_alt ); + fprintf ( f, " altitude=\"%s\"", s_alt ); + } + if ( tp->has_timestamp ) + fprintf ( f, " unixtime=\"%ld\"", tp->timestamp ); + if ( tp->newsegment ) + fprintf ( f, " newsegment=\"yes\"" ); + + if (!isnan(tp->speed) || !isnan(tp->course) || tp->nsats > 0) { + fprintf ( f, " extended=\"yes\"" ); + if (!isnan(tp->speed)) { + gchar s_speed[COORDS_STR_BUFFER_SIZE]; + a_coords_dtostr_buffer ( tp->speed, s_speed ); + fprintf ( f, " speed=\"%s\"", s_speed ); + } + if (!isnan(tp->course)) { + gchar s_course[COORDS_STR_BUFFER_SIZE]; + a_coords_dtostr_buffer ( tp->course, s_course ); + fprintf ( f, " course=\"%s\"", s_course ); + } + if (tp->nsats > 0) + fprintf ( f, " sat=\"%d\"", tp->nsats ); + if (tp->fix_mode > 0) + fprintf ( f, " fix=\"%d\"", tp->fix_mode ); + + if ( tp->hdop != VIK_DEFAULT_DOP ) { + gchar ss[COORDS_STR_BUFFER_SIZE]; + a_coords_dtostr_buffer ( tp->hdop, ss ); + fprintf ( f, " hdop=\"%s\"", ss ); + } + if ( tp->vdop != VIK_DEFAULT_DOP ) { + gchar ss[COORDS_STR_BUFFER_SIZE]; + a_coords_dtostr_buffer ( tp->vdop, ss ); + fprintf ( f, " vdop=\"%s\"", ss ); + } + if ( tp->pdop != VIK_DEFAULT_DOP ) { + gchar ss[COORDS_STR_BUFFER_SIZE]; + a_coords_dtostr_buffer ( tp->pdop, ss ); + fprintf ( f, " pdop=\"%s\"", ss ); + } + } + fprintf ( f, "\n" ); +} + + +static void a_gpspoint_write_track ( const gpointer id, const VikTrack *trk, FILE *f ) +{ + // Sanity clauses + if ( !trk ) + return; + if ( !(trk->name) ) + return; + + gchar *tmp_name = slashdup(trk->name); + fprintf ( f, "type=\"%s\" name=\"%s\"", trk->is_route ? "route" : "track", tmp_name ); + g_free ( tmp_name ); + + if ( trk->comment ) { + gchar *tmp = slashdup(trk->comment); + fprintf ( f, " comment=\"%s\"", tmp ); + g_free ( tmp ); + } + + if ( trk->description ) { + gchar *tmp = slashdup(trk->description); + fprintf ( f, " description=\"%s\"", tmp ); + g_free ( tmp ); + } + + if ( trk->source ) { + gchar *tmp = slashdup(trk->source); + fprintf ( f, " source=\"%s\"", tmp ); + g_free ( tmp ); + } + + if ( trk->type ) { + gchar *tmp = slashdup(trk->type); + fprintf ( f, " xtype=\"%s\"", tmp ); + g_free ( tmp ); + } + + if ( trk->has_color ) { + fprintf ( f, " color=#%.2x%.2x%.2x", (int)(trk->color.red/256),(int)(trk->color.green/256),(int)(trk->color.blue/256)); + } + + if ( trk->draw_name_mode > 0 ) + fprintf ( f, " draw_name_mode=\"%d\"", trk->draw_name_mode ); + + if ( trk->max_number_dist_labels > 0 ) + fprintf ( f, " number_dist_labels=\"%d\"", trk->max_number_dist_labels ); + + if ( ! trk->visible ) { + fprintf ( f, " visible=\"n\"" ); + } + fprintf ( f, "\n" ); + + TP_write_info_type tp_write_info = { f, trk->is_route }; + g_list_foreach ( trk->trackpoints, (GFunc) a_gpspoint_write_trackpoint, &tp_write_info ); + fprintf ( f, "type=\"%send\"\n", trk->is_route ? "route" : "track" ); +} + +void a_gpspoint_write_file ( VikTrwLayer *trw, FILE *f, const gchar *dirpath ) +{ + GHashTable *tracks = vik_trw_layer_get_tracks ( trw ); + GHashTable *routes = vik_trw_layer_get_routes ( trw ); + GHashTable *waypoints = vik_trw_layer_get_waypoints ( trw ); + + WritingContext wc = { f, dirpath }; + fprintf ( f, "type=\"waypointlist\"\n" ); + g_hash_table_foreach ( waypoints, (GHFunc) a_gpspoint_write_waypoint, &wc ); + fprintf ( f, "type=\"waypointlistend\"\n" ); + g_hash_table_foreach ( tracks, (GHFunc) a_gpspoint_write_track, f ); + g_hash_table_foreach ( routes, (GHFunc) a_gpspoint_write_track, f ); +} diff --git a/src/gpspoint.h b/src/gpspoint.h new file mode 100644 index 0000000..cc77518 --- /dev/null +++ b/src/gpspoint.h @@ -0,0 +1,34 @@ +/* + * viking -- GPS Data and Topo Analyzer, Explorer, and Manager + * + * Copyright (C) 2003-2005, Evan Battaglia + * + * 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., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA + * + */ + +#ifndef _VIKING_GPSPOINT_H +#define _VIKING_GPSPOINT_H + +#include "viktrwlayer.h" + +G_BEGIN_DECLS + +gboolean a_gpspoint_read_file ( VikTrwLayer *trw, FILE *f, const gchar *dirpath ); +void a_gpspoint_write_file ( VikTrwLayer *trw, FILE *f, const gchar *dirpath ); + +G_END_DECLS + +#endif diff --git a/src/gpx.c b/src/gpx.c new file mode 100644 index 0000000..6fcb08f --- /dev/null +++ b/src/gpx.c @@ -0,0 +1,1361 @@ +/* + * viking -- GPS Data and Topo Analyzer, Explorer, and Manager + * + * Copyright (C) 2003-2007, Evan Battaglia + * Copyright (C) 2007, Quy Tonthat + * Copyright (C) 2008, Hein Ragas + * Copyright (C) 2009, Tal B + * Copyright (c) 2012-2014, Rob Norris + * + * Some of the code adapted from GPSBabel 1.2.7 + * http://gpsbabel.sf.net/ + * Copyright (C) 2002, 2003, 2004, 2005 Robert Lipe, robertlipe@usa.net + * + * 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., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA + * + */ +#ifdef HAVE_CONFIG_H +#include "config.h" +#endif + +#define _XOPEN_SOURCE /* glibc2 needs this */ + +#include "gpx.h" +#include "viking.h" +#include "vikutils.h" +#include +#include "misc/gtkhtml-private.h" +#ifdef HAVE_STRING_H +#include +#endif +#include +#include +#include +#ifdef HAVE_MATH_H +#include +#endif +#include + +typedef enum { + tt_unknown = 0, + + tt_gpx, + tt_gpx_name, + tt_gpx_desc, + tt_gpx_author, + tt_gpx_time, + tt_gpx_keywords, + + tt_wpt, + tt_wpt_cmt, + tt_wpt_desc, + tt_wpt_src, + tt_wpt_type, + tt_wpt_name, + tt_wpt_ele, + tt_wpt_sym, + tt_wpt_time, + tt_wpt_url, + tt_wpt_link, /* New in GPX 1.1 */ + + tt_trk, + tt_trk_cmt, + tt_trk_desc, + tt_trk_src, + tt_trk_type, + tt_trk_name, + + tt_rte, + + tt_trk_trkseg, + tt_trk_trkseg_trkpt, + tt_trk_trkseg_trkpt_ele, + tt_trk_trkseg_trkpt_time, + tt_trk_trkseg_trkpt_name, + /* extended */ + tt_trk_trkseg_trkpt_course, + tt_trk_trkseg_trkpt_speed, + tt_trk_trkseg_trkpt_fix, + tt_trk_trkseg_trkpt_sat, + + tt_trk_trkseg_trkpt_hdop, + tt_trk_trkseg_trkpt_vdop, + tt_trk_trkseg_trkpt_pdop, + + tt_waypoint, + tt_waypoint_coord, + tt_waypoint_name, +} tag_type; + +typedef struct tag_mapping { + tag_type tag_type; /* enum from above for this tag */ + const char *tag_name; /* xpath-ish tag name */ +} tag_mapping; + +typedef struct { + GpxWritingOptions *options; + FILE *file; + const gchar *dirpath; +} GpxWritingContext; + +/* + * xpath(ish) mappings between full tag paths and internal identifiers. + * These appear in the order they appear in the GPX specification. + * If it's not a tag we explicitly handle, it doesn't go here. + */ + +tag_mapping tag_path_map[] = { + + { tt_gpx, "/gpx" }, + { tt_gpx_name, "/gpx/name" }, + { tt_gpx_desc, "/gpx/desc" }, + { tt_gpx_time, "/gpx/time" }, + { tt_gpx_author, "/gpx/author" }, + { tt_gpx_keywords, "/gpx/keywords" }, + + // GPX 1.1 variant - basic properties moved into metadata namespace + { tt_gpx_name, "/gpx/metadata/name" }, + { tt_gpx_desc, "/gpx/metadata/desc" }, + { tt_gpx_time, "/gpx/metadata/time" }, + { tt_gpx_author, "/gpx/metadata/author/name" }, + { tt_gpx_keywords, "/gpx/metadata/keywords" }, + + { tt_wpt, "/gpx/wpt" }, + + { tt_waypoint, "/loc/waypoint" }, + { tt_waypoint_coord, "/loc/waypoint/coord" }, + { tt_waypoint_name, "/loc/waypoint/name" }, + + { tt_wpt_ele, "/gpx/wpt/ele" }, + { tt_wpt_time, "/gpx/wpt/time" }, + { tt_wpt_name, "/gpx/wpt/name" }, + { tt_wpt_cmt, "/gpx/wpt/cmt" }, + { tt_wpt_desc, "/gpx/wpt/desc" }, + { tt_wpt_src, "/gpx/wpt/src" }, + { tt_wpt_type, "/gpx/wpt/type" }, + { tt_wpt_sym, "/gpx/wpt/sym" }, + { tt_wpt_sym, "/loc/waypoint/type" }, + { tt_wpt_url, "/gpx/wpt/url" }, + { tt_wpt_link, "/gpx/wpt/link" }, /* GPX 1.1 */ + + { tt_trk, "/gpx/trk" }, + { tt_trk_name, "/gpx/trk/name" }, + { tt_trk_cmt, "/gpx/trk/cmt" }, + { tt_trk_desc, "/gpx/trk/desc" }, + { tt_trk_src, "/gpx/trk/src" }, + { tt_trk_type, "/gpx/trk/type" }, + { tt_trk_trkseg, "/gpx/trk/trkseg" }, + { tt_trk_trkseg_trkpt, "/gpx/trk/trkseg/trkpt" }, + { tt_trk_trkseg_trkpt_ele, "/gpx/trk/trkseg/trkpt/ele" }, + { tt_trk_trkseg_trkpt_time, "/gpx/trk/trkseg/trkpt/time" }, + { tt_trk_trkseg_trkpt_name, "/gpx/trk/trkseg/trkpt/name" }, + /* extended */ + { tt_trk_trkseg_trkpt_course, "/gpx/trk/trkseg/trkpt/course" }, + { tt_trk_trkseg_trkpt_speed, "/gpx/trk/trkseg/trkpt/speed" }, + { tt_trk_trkseg_trkpt_fix, "/gpx/trk/trkseg/trkpt/fix" }, + { tt_trk_trkseg_trkpt_sat, "/gpx/trk/trkseg/trkpt/sat" }, + + { tt_trk_trkseg_trkpt_hdop, "/gpx/trk/trkseg/trkpt/hdop" }, + { tt_trk_trkseg_trkpt_vdop, "/gpx/trk/trkseg/trkpt/vdop" }, + { tt_trk_trkseg_trkpt_pdop, "/gpx/trk/trkseg/trkpt/pdop" }, + + { tt_rte, "/gpx/rte" }, + // NB Route reuses track point feature tags + { tt_trk_name, "/gpx/rte/name" }, + { tt_trk_cmt, "/gpx/rte/cmt" }, + { tt_trk_desc, "/gpx/rte/desc" }, + { tt_trk_src, "/gpx/rte/src" }, + { tt_trk_trkseg_trkpt, "/gpx/rte/rtept" }, + { tt_trk_trkseg_trkpt_name, "/gpx/rte/rtept/name" }, + { tt_trk_trkseg_trkpt_ele, "/gpx/rte/rtept/ele" }, + + {0} +}; + +static tag_type get_tag(const char *t) +{ + tag_mapping *tm; + for (tm = tag_path_map; tm->tag_type != 0; tm++) + if (0 == strcmp(tm->tag_name, t)) + return tm->tag_type; + return tt_unknown; +} + +/******************************************/ + +tag_type current_tag = tt_unknown; +GString *xpath = NULL; +GString *c_cdata = NULL; + +/* current ("c_") objects */ +VikTrackpoint *c_tp = NULL; +VikWaypoint *c_wp = NULL; +VikTrack *c_tr = NULL; +VikTRWMetadata *c_md = NULL; + +gchar *c_wp_name = NULL; +gchar *c_tr_name = NULL; + +/* temporary things so we don't have to create them lots of times */ +const gchar *c_slat, *c_slon; +struct LatLon c_ll; + +/* specialty flags / etc */ +gboolean f_tr_newseg; +const gchar *c_link = NULL; +guint unnamed_waypoints = 0; +guint unnamed_tracks = 0; +guint unnamed_routes = 0; + +typedef struct { + VikTrwLayer *vtl; + const gchar *dirpath; +} UserDataT; + +static const char *get_attr ( const char **attr, const char *key ) +{ + while ( *attr ) { + if ( strcmp(*attr,key) == 0 ) + return *(attr + 1); + attr += 2; + } + return NULL; +} + +static gboolean set_c_ll ( const char **attr ) +{ + if ( (c_slat = get_attr ( attr, "lat" )) && (c_slon = get_attr ( attr, "lon" )) ) { + c_ll.lat = g_ascii_strtod(c_slat, NULL); + c_ll.lon = g_ascii_strtod(c_slon, NULL); + return TRUE; + } + return FALSE; +} + +static void gpx_start(UserDataT *ud, const char *el, const char **attr) +{ + static const gchar *tmp; + VikTrwLayer *vtl = ud->vtl; + + g_string_append_c ( xpath, '/' ); + g_string_append ( xpath, el ); + current_tag = get_tag ( xpath->str ); + + switch ( current_tag ) { + + case tt_gpx: + c_md = vik_trw_metadata_new(); + // Store creator information if possible + const gchar *crt = get_attr ( attr, "creator" ); + if ( crt ) { + // If there is an actual description field it will overwrite this value + c_md->description = g_strdup_printf ( _("Created by: %s"), crt ); + } + break; + + case tt_wpt: + if ( set_c_ll( attr ) ) { + c_wp = vik_waypoint_new (); + c_wp->visible = TRUE; + if ( get_attr ( attr, "hidden" ) ) + c_wp->visible = FALSE; + + vik_coord_load_from_latlon ( &(c_wp->coord), vik_trw_layer_get_coord_mode ( vtl ), &c_ll ); + } + break; + + case tt_trk: + case tt_rte: + c_tr = vik_track_new (); + vik_track_set_defaults ( c_tr ); + c_tr->is_route = (current_tag == tt_rte) ? TRUE : FALSE; + c_tr->visible = TRUE; + if ( get_attr ( attr, "hidden" ) ) + c_tr->visible = FALSE; + break; + + case tt_trk_trkseg: + f_tr_newseg = TRUE; + break; + + case tt_trk_trkseg_trkpt: + if ( set_c_ll( attr ) ) { + c_tp = vik_trackpoint_new (); + vik_coord_load_from_latlon ( &(c_tp->coord), vik_trw_layer_get_coord_mode ( vtl ), &c_ll ); + if ( f_tr_newseg ) { + c_tp->newsegment = TRUE; + f_tr_newseg = FALSE; + } + c_tr->trackpoints = g_list_prepend ( c_tr->trackpoints, c_tp ); + } + break; + + case tt_wpt_link: + c_link = get_attr ( attr, "href" ); + break; + case tt_gpx_name: + case tt_gpx_author: + case tt_gpx_desc: + case tt_gpx_keywords: + case tt_gpx_time: + case tt_trk_trkseg_trkpt_name: + case tt_trk_trkseg_trkpt_ele: + case tt_trk_trkseg_trkpt_time: + case tt_wpt_cmt: + case tt_wpt_desc: + case tt_wpt_src: + case tt_wpt_type: + case tt_wpt_name: + case tt_wpt_ele: + case tt_wpt_time: + case tt_wpt_url: + case tt_trk_cmt: + case tt_trk_desc: + case tt_trk_src: + case tt_trk_type: + case tt_trk_name: + g_string_erase ( c_cdata, 0, -1 ); /* clear the cdata buffer */ + break; + + case tt_waypoint: + c_wp = vik_waypoint_new (); + c_wp->visible = TRUE; + break; + + case tt_waypoint_coord: + if ( set_c_ll( attr ) ) + vik_coord_load_from_latlon ( &(c_wp->coord), vik_trw_layer_get_coord_mode ( vtl ), &c_ll ); + break; + + case tt_waypoint_name: + if ( ( tmp = get_attr(attr, "id") ) ) { + if ( c_wp_name ) + g_free ( c_wp_name ); + c_wp_name = g_strdup ( tmp ); + } + g_string_erase ( c_cdata, 0, -1 ); /* clear the cdata buffer for description */ + break; + + default: break; + } +} + +// Allow user override / refinement of GPX tidying +#define VIK_SETTINGS_GPX_TIDY "gpx_tidy_points" +#define VIK_SETTINGS_GPX_TIDY_SPEED "gpx_tidy_points_max_speed" + +/** + * + */ +static void track_tidy_processing ( VikTrwLayer *vtl ) +{ + // Default to automatically attempt tiding + gboolean do_tidy = TRUE; + gboolean btmp = TRUE; + if ( a_settings_get_boolean ( VIK_SETTINGS_GPX_TIDY, &btmp ) ) + do_tidy = btmp; + + if ( do_tidy ) { + // highly unlikely to be going faster than this, especially for the first point + guint speed = 340; // Speed of Sound + + gint itmp = 0; + if ( a_settings_get_integer ( VIK_SETTINGS_GPX_TIDY_SPEED, &itmp ) ) + speed = (guint)itmp; + + // NB bounds calculated in subsequent layer post read, + // so no need to do it now + vik_trw_layer_tidy_tracks ( vtl, speed, FALSE ); + } +} + +static void gpx_end(UserDataT *ud, const char *el) +{ + static GTimeVal tp_time; + static GTimeVal wp_time; + VikTrwLayer *vtl = ud->vtl; + + g_string_truncate ( xpath, xpath->len - strlen(el) - 1 ); + + switch ( current_tag ) { + + case tt_gpx: + vik_trw_layer_set_metadata ( vtl, c_md ); + c_md = NULL; + + // Essentially the end for a TrackWaypoint layer, + // so any specific GPX post processing can occur here + track_tidy_processing ( vtl ); + + break; + + case tt_gpx_name: + vik_layer_rename ( VIK_LAYER(vtl), c_cdata->str ); + g_string_erase ( c_cdata, 0, -1 ); + break; + + case tt_gpx_author: + if ( c_md->author ) + g_free ( c_md->author ); + c_md->author = g_strdup ( c_cdata->str ); + g_string_erase ( c_cdata, 0, -1 ); + break; + + case tt_gpx_desc: + if ( c_md->description ) + g_free ( c_md->description ); + c_md->description = g_strdup ( c_cdata->str ); + g_string_erase ( c_cdata, 0, -1 ); + break; + + case tt_gpx_keywords: + if ( c_md->keywords ) + g_free ( c_md->keywords ); + c_md->keywords = g_strdup ( c_cdata->str ); + g_string_erase ( c_cdata, 0, -1 ); + break; + + case tt_gpx_time: + if ( c_md->timestamp ) + g_free ( c_md->timestamp ); + c_md->timestamp = g_strdup ( c_cdata->str ); + g_string_erase ( c_cdata, 0, -1 ); + break; + + case tt_waypoint: + case tt_wpt: + if ( ! c_wp_name ) + c_wp_name = g_strdup_printf("VIKING_WP%04d", unnamed_waypoints++); + vik_trw_layer_filein_add_waypoint ( vtl, c_wp_name, c_wp ); + g_free ( c_wp_name ); + c_wp = NULL; + c_wp_name = NULL; + break; + + case tt_trk: + if ( ! c_tr_name ) + c_tr_name = g_strdup_printf("VIKING_TR%03d", unnamed_tracks++); + // Delibrate fall through + case tt_rte: + if ( ! c_tr_name ) + c_tr_name = g_strdup_printf("VIKING_RT%03d", unnamed_routes++); + c_tr->trackpoints = g_list_reverse ( c_tr->trackpoints ); + vik_trw_layer_filein_add_track ( vtl, c_tr_name, c_tr ); + g_free ( c_tr_name ); + c_tr = NULL; + c_tr_name = NULL; + break; + + case tt_wpt_name: + if ( c_wp_name ) + g_free ( c_wp_name ); + c_wp_name = g_strdup ( c_cdata->str ); + g_string_erase ( c_cdata, 0, -1 ); + break; + + case tt_trk_name: + if ( c_tr_name ) + g_free ( c_tr_name ); + c_tr_name = g_strdup ( c_cdata->str ); + g_string_erase ( c_cdata, 0, -1 ); + break; + + case tt_wpt_ele: + c_wp->altitude = g_ascii_strtod ( c_cdata->str, NULL ); + g_string_erase ( c_cdata, 0, -1 ); + break; + + case tt_trk_trkseg_trkpt_ele: + c_tp->altitude = g_ascii_strtod ( c_cdata->str, NULL ); + g_string_erase ( c_cdata, 0, -1 ); + break; + + case tt_waypoint_name: /* .loc name is really description. */ + case tt_wpt_desc: + vik_waypoint_set_description ( c_wp, c_cdata->str ); + g_string_erase ( c_cdata, 0, -1 ); + break; + + case tt_wpt_cmt: + vik_waypoint_set_comment ( c_wp, c_cdata->str ); + g_string_erase ( c_cdata, 0, -1 ); + break; + + case tt_wpt_src: + vik_waypoint_set_source ( c_wp, c_cdata->str ); + g_string_erase ( c_cdata, 0, -1 ); + break; + + case tt_wpt_type: + vik_waypoint_set_type ( c_wp, c_cdata->str ); + g_string_erase ( c_cdata, 0, -1 ); + break; + + case tt_wpt_url: + vik_waypoint_set_url ( c_wp, c_cdata->str ); + g_string_erase ( c_cdata, 0, -1 ); + break; + + case tt_wpt_link: + if ( c_link ) { + // Correct format + if ( util_is_url(c_link) ) { + vik_waypoint_set_url ( c_wp, c_link ); + } + else { + vu_waypoint_set_image_uri ( c_wp, c_link, ud->dirpath ); + } + } + else { + // Fallback for incorrect GPX format (probably from previous versions of Viking!) + // of the form file + gchar *fn = util_make_absolute_filename ( c_cdata->str, ud->dirpath ); + vik_waypoint_set_image ( c_wp, fn ? fn : c_cdata->str ); + g_free ( fn ); + } + c_link = NULL; + g_string_erase ( c_cdata, 0, -1 ); + break; + + case tt_wpt_sym: + vik_waypoint_set_symbol ( c_wp, c_cdata->str ); + g_string_erase ( c_cdata, 0, -1 ); + break; + + case tt_trk_desc: + vik_track_set_description ( c_tr, c_cdata->str ); + g_string_erase ( c_cdata, 0, -1 ); + break; + + case tt_trk_src: + vik_track_set_source ( c_tr, c_cdata->str ); + g_string_erase ( c_cdata, 0, -1 ); + break; + + case tt_trk_type: + vik_track_set_type ( c_tr, c_cdata->str ); + g_string_erase ( c_cdata, 0, -1 ); + break; + + case tt_trk_cmt: + vik_track_set_comment ( c_tr, c_cdata->str ); + g_string_erase ( c_cdata, 0, -1 ); + break; + + case tt_wpt_time: + if ( g_time_val_from_iso8601(c_cdata->str, &wp_time) ) { + c_wp->timestamp = wp_time.tv_sec; + c_wp->has_timestamp = TRUE; + } + g_string_erase ( c_cdata, 0, -1 ); + break; + + case tt_trk_trkseg_trkpt_name: + vik_trackpoint_set_name ( c_tp, c_cdata->str ); + g_string_erase ( c_cdata, 0, -1 ); + break; + + case tt_trk_trkseg_trkpt_time: + if ( g_time_val_from_iso8601(c_cdata->str, &tp_time) ) { + c_tp->timestamp = tp_time.tv_sec; + c_tp->has_timestamp = TRUE; + } + g_string_erase ( c_cdata, 0, -1 ); + break; + + case tt_trk_trkseg_trkpt_course: + c_tp->course = g_ascii_strtod ( c_cdata->str, NULL ); + g_string_erase ( c_cdata, 0, -1 ); + break; + + case tt_trk_trkseg_trkpt_speed: + c_tp->speed = g_ascii_strtod ( c_cdata->str, NULL ); + g_string_erase ( c_cdata, 0, -1 ); + break; + + case tt_trk_trkseg_trkpt_fix: + if (!strcmp("2d", c_cdata->str)) + c_tp->fix_mode = VIK_GPS_MODE_2D; + else if (!strcmp("3d", c_cdata->str)) + c_tp->fix_mode = VIK_GPS_MODE_3D; + else if (!strcmp("dgps", c_cdata->str)) + c_tp->fix_mode = VIK_GPS_MODE_DGPS; + else if (!strcmp("pps", c_cdata->str)) + c_tp->fix_mode = VIK_GPS_MODE_PPS; + else + c_tp->fix_mode = VIK_GPS_MODE_NOT_SEEN; + g_string_erase ( c_cdata, 0, -1 ); + break; + + case tt_trk_trkseg_trkpt_sat: + c_tp->nsats = atoi ( c_cdata->str ); + g_string_erase ( c_cdata, 0, -1 ); + break; + + case tt_trk_trkseg_trkpt_hdop: + c_tp->hdop = g_strtod ( c_cdata->str, NULL ); + g_string_erase ( c_cdata, 0, -1 ); + break; + + case tt_trk_trkseg_trkpt_vdop: + c_tp->vdop = g_strtod ( c_cdata->str, NULL ); + g_string_erase ( c_cdata, 0, -1 ); + break; + + case tt_trk_trkseg_trkpt_pdop: + c_tp->pdop = g_strtod ( c_cdata->str, NULL ); + g_string_erase ( c_cdata, 0, -1 ); + break; + + default: break; + } + + current_tag = get_tag ( xpath->str ); +} + +static void gpx_cdata(void *dta, const XML_Char *s, int len) +{ + switch ( current_tag ) { + case tt_gpx_name: + case tt_gpx_author: + case tt_gpx_desc: + case tt_gpx_keywords: + case tt_gpx_time: + case tt_wpt_name: + case tt_trk_name: + case tt_wpt_ele: + case tt_trk_trkseg_trkpt_ele: + case tt_wpt_cmt: + case tt_wpt_desc: + case tt_wpt_src: + case tt_wpt_type: + case tt_wpt_sym: + case tt_wpt_url: + case tt_wpt_link: + case tt_trk_cmt: + case tt_trk_desc: + case tt_trk_src: + case tt_trk_type: + case tt_trk_trkseg_trkpt_time: + case tt_wpt_time: + case tt_trk_trkseg_trkpt_name: + case tt_trk_trkseg_trkpt_course: + case tt_trk_trkseg_trkpt_speed: + case tt_trk_trkseg_trkpt_fix: + case tt_trk_trkseg_trkpt_sat: + case tt_trk_trkseg_trkpt_hdop: + case tt_trk_trkseg_trkpt_vdop: + case tt_trk_trkseg_trkpt_pdop: + case tt_waypoint_name: /* .loc name is really description. */ + g_string_append_len ( c_cdata, s, len ); + break; + + default: break; /* ignore cdata from other things */ + } +} + +// make like a "stack" of tag names +// like gpspoint's separated like /gpx/wpt/whatever + +gboolean a_gpx_read_file( VikTrwLayer *vtl, FILE *f, const gchar* dirpath ) { + XML_Parser parser = XML_ParserCreate(NULL); + int done=0, len; + enum XML_Status status = XML_STATUS_ERROR; + + UserDataT *ud = g_malloc (sizeof(UserDataT)); + ud->vtl = vtl; + ud->dirpath = dirpath; + + XML_SetElementHandler(parser, (XML_StartElementHandler) gpx_start, (XML_EndElementHandler) gpx_end); + XML_SetUserData(parser, ud); + XML_SetCharacterDataHandler(parser, (XML_CharacterDataHandler) gpx_cdata); + + gchar buf[4096]; + + g_assert ( f != NULL && vtl != NULL ); + + xpath = g_string_new ( "" ); + c_cdata = g_string_new ( "" ); + + unnamed_waypoints = 1; + unnamed_tracks = 1; + unnamed_routes = 1; + + while (!done) { + len = fread(buf, 1, sizeof(buf)-7, f); + done = feof(f) || !len; + status = XML_Parse(parser, buf, len, done); + } + + XML_ParserFree (parser); + g_free ( ud ); + g_string_free ( xpath, TRUE ); + g_string_free ( c_cdata, TRUE ); + + return status != XML_STATUS_ERROR; +} + +/**** entitize from GPSBabel ****/ +typedef struct { + const char * text; + const char * entity; + int not_html; +} entity_types; + +static +entity_types stdentities[] = { + { "&", "&", 0 }, + { "'", "'", 1 }, + { "<", "<", 0 }, + { ">", ">", 0 }, + { "\"", """, 0 }, + { NULL, NULL, 0 } +}; + +void utf8_to_int( const char *cp, int *bytes, int *value ) +{ + if ( (*cp & 0xe0) == 0xc0 ) { + if ( (*(cp+1) & 0xc0) != 0x80 ) goto dodefault; + *bytes = 2; + *value = ((*cp & 0x1f) << 6) | + (*(cp+1) & 0x3f); + } + else if ( (*cp & 0xf0) == 0xe0 ) { + if ( (*(cp+1) & 0xc0) != 0x80 ) goto dodefault; + if ( (*(cp+2) & 0xc0) != 0x80 ) goto dodefault; + *bytes = 3; + *value = ((*cp & 0x0f) << 12) | + ((*(cp+1) & 0x3f) << 6) | + (*(cp+2) & 0x3f); + } + else if ( (*cp & 0xf8) == 0xf0 ) { + if ( (*(cp+1) & 0xc0) != 0x80 ) goto dodefault; + if ( (*(cp+2) & 0xc0) != 0x80 ) goto dodefault; + if ( (*(cp+3) & 0xc0) != 0x80 ) goto dodefault; + *bytes = 4; + *value = ((*cp & 0x07) << 18) | + ((*(cp+1) & 0x3f) << 12) | + ((*(cp+2) & 0x3f) << 6) | + (*(cp+3) & 0x3f); + } + else if ( (*cp & 0xfc) == 0xf8 ) { + if ( (*(cp+1) & 0xc0) != 0x80 ) goto dodefault; + if ( (*(cp+2) & 0xc0) != 0x80 ) goto dodefault; + if ( (*(cp+3) & 0xc0) != 0x80 ) goto dodefault; + if ( (*(cp+4) & 0xc0) != 0x80 ) goto dodefault; + *bytes = 5; + *value = ((*cp & 0x03) << 24) | + ((*(cp+1) & 0x3f) << 18) | + ((*(cp+2) & 0x3f) << 12) | + ((*(cp+3) & 0x3f) << 6) | + (*(cp+4) & 0x3f); + } + else if ( (*cp & 0xfe) == 0xfc ) { + if ( (*(cp+1) & 0xc0) != 0x80 ) goto dodefault; + if ( (*(cp+2) & 0xc0) != 0x80 ) goto dodefault; + if ( (*(cp+3) & 0xc0) != 0x80 ) goto dodefault; + if ( (*(cp+4) & 0xc0) != 0x80 ) goto dodefault; + if ( (*(cp+5) & 0xc0) != 0x80 ) goto dodefault; + *bytes = 6; + *value = ((*cp & 0x01) << 30) | + ((*(cp+1) & 0x3f) << 24) | + ((*(cp+2) & 0x3f) << 18) | + ((*(cp+3) & 0x3f) << 12) | + ((*(cp+4) & 0x3f) << 6) | + (*(cp+5) & 0x3f); + } + else { +dodefault: + *bytes = 1; + *value = (unsigned char)*cp; + } +} + +static +char * +entitize(const char * str) +{ + int elen, ecount, nsecount; + entity_types *ep; + const char * cp; + char * p, * tmp, * xstr; + + char tmpsub[20]; + int bytes = 0; + int value = 0; + ep = stdentities; + elen = ecount = nsecount = 0; + + /* figure # of entity replacements and additional size. */ + while (ep->text) { + cp = str; + while ((cp = strstr(cp, ep->text)) != NULL) { + elen += strlen(ep->entity) - strlen(ep->text); + ecount++; + cp += strlen(ep->text); + } + ep++; + } + + /* figure the same for other than standard entities (i.e. anything + * that isn't in the range U+0000 to U+007F */ + for ( cp = str; *cp; cp++ ) { + if ( *cp & 0x80 ) { + + utf8_to_int( cp, &bytes, &value ); + cp += bytes-1; + elen += sprintf( tmpsub, "&#x%x;", value ) - bytes; + nsecount++; + } + } + + /* enough space for the whole string plus entity replacements, if any */ + tmp = g_malloc((strlen(str) + elen + 1)); + strcpy(tmp, str); + + /* no entity replacements */ + if (ecount == 0 && nsecount == 0) + return (tmp); + + if ( ecount != 0 ) { + for (ep = stdentities; ep->text; ep++) { + p = tmp; + while ((p = strstr(p, ep->text)) != NULL) { + elen = strlen(ep->entity); + + xstr = g_strdup(p + strlen(ep->text)); + + strcpy(p, ep->entity); + strcpy(p + elen, xstr); + + g_free(xstr); + + p += elen; + } + } + } + + if ( nsecount != 0 ) { + p = tmp; + while (*p) { + if ( *p & 0x80 ) { + utf8_to_int( p, &bytes, &value ); + if ( p[bytes] ) { + xstr = g_strdup( p + bytes ); + } + else { + xstr = NULL; + } + sprintf( p, "&#x%x;", value ); + p = p+strlen(p); + if ( xstr ) { + strcpy( p, xstr ); + g_free(xstr); + } + } + else { + p++; + } + } + } + return (tmp); +} +/**** end GPSBabel code ****/ + +/* export GPX */ + +/** + * Note that elements are written in the schema specification order + */ +static void gpx_write_waypoint ( VikWaypoint *wp, GpxWritingContext *context ) +{ + // Don't write invisible waypoints when specified + if (context->options && !context->options->hidden && !wp->visible) + return; + + FILE *f = context->file; + struct LatLon ll; + gchar s_lat[COORDS_STR_BUFFER_SIZE]; + gchar s_lon[COORDS_STR_BUFFER_SIZE]; + gchar *tmp; + vik_coord_to_latlon ( &(wp->coord), &ll ); + a_coords_dtostr_buffer ( ll.lat, s_lat ); + a_coords_dtostr_buffer ( ll.lon, s_lon ); + // NB 'hidden' is not part of any GPX standard - this appears to be a made up Viking 'extension' + // luckily most other GPX processing software ignores things they don't understand + fprintf ( f, "\n", + s_lat, s_lon, wp->visible ? "" : " hidden=\"hidden\"" ); + + if ( wp->altitude != VIK_DEFAULT_ALTITUDE ) + { + gchar s_alt[COORDS_STR_BUFFER_SIZE]; + a_coords_dtostr_buffer ( wp->altitude, s_alt ); + fprintf ( f, " %s\n", s_alt ); + } + + if ( wp->has_timestamp ) { + GTimeVal timestamp; + timestamp.tv_sec = wp->timestamp; + timestamp.tv_usec = 0; + + gchar *time_iso8601 = g_time_val_to_iso8601 ( ×tamp ); + if ( time_iso8601 != NULL ) + fprintf ( f, " \n", time_iso8601 ); + g_free ( time_iso8601 ); + } + + // Sanity clause + if ( wp->name ) + tmp = entitize ( wp->name ); + else + tmp = g_strdup ("waypoint"); + + fprintf ( f, " %s\n", tmp ); + g_free ( tmp); + + if ( wp->comment ) + { + tmp = entitize(wp->comment); + fprintf ( f, " %s\n", tmp ); + g_free ( tmp ); + } + if ( wp->description ) + { + tmp = entitize(wp->description); + fprintf ( f, " %s\n", tmp ); + g_free ( tmp ); + } + if ( wp->source ) + { + tmp = entitize(wp->source); + fprintf ( f, " %s\n", tmp ); + g_free ( tmp ); + } + if ( wp->url ) + { + tmp = entitize(wp->url); + fprintf ( f, " %s\n", tmp ); + g_free ( tmp ); + } + if ( wp->image ) + { + gchar *tmp = NULL; + if ( a_vik_get_file_ref_format() == VIK_FILE_REF_FORMAT_RELATIVE ) { + if ( context->dirpath ) { + gchar *rtmp = g_strdup ( file_GetRelativeFilename ( (gchar*)context->dirpath, wp->image ) ); + if ( rtmp ) { + tmp = gtk_html_filename_to_uri ( rtmp ); + } + } + } + if ( !tmp ) + tmp = gtk_html_filename_to_uri ( wp->image ); + fprintf ( f, " \n", tmp ); + g_free ( tmp ); + } + if ( wp->symbol ) + { + tmp = entitize(wp->symbol); + if ( a_vik_gpx_export_wpt_sym_name ( ) ) { + // Lowercase the symbol name + gchar *tmp2 = g_utf8_strdown ( tmp, -1 ); + fprintf ( f, " %s\n", tmp2 ); + g_free ( tmp2 ); + } + else + fprintf ( f, " %s\n", tmp); + g_free ( tmp ); + } + if ( wp->type ) + { + tmp = entitize(wp->type); + fprintf ( f, " %s\n", tmp ); + g_free ( tmp ); + } + + fprintf ( f, "\n" ); +} + +/** + * Note that elements are written in the schema specification order + */ +static void gpx_write_trackpoint ( VikTrackpoint *tp, GpxWritingContext *context ) +{ + FILE *f = context->file; + struct LatLon ll; + gchar s_lat[COORDS_STR_BUFFER_SIZE]; + gchar s_lon[COORDS_STR_BUFFER_SIZE]; + gchar s_alt[COORDS_STR_BUFFER_SIZE]; + gchar s_dop[COORDS_STR_BUFFER_SIZE]; + gchar *time_iso8601; + vik_coord_to_latlon ( &(tp->coord), &ll ); + + // No such thing as a rteseg! So make sure we don't put them in + if ( context->options && !context->options->is_route && tp->newsegment ) + fprintf ( f, " \n \n" ); + + a_coords_dtostr_buffer ( ll.lat, s_lat ); + a_coords_dtostr_buffer ( ll.lon, s_lon ); + fprintf ( f, " <%spt lat=\"%s\" lon=\"%s\">\n", (context->options && context->options->is_route) ? "rte" : "trk", s_lat, s_lon ); + + if ( tp->altitude != VIK_DEFAULT_ALTITUDE ) + { + a_coords_dtostr_buffer ( tp->altitude, s_alt ); + fprintf ( f, " %s\n", s_alt ); + } + else if ( context->options != NULL && context->options->force_ele ) + { + fprintf ( f, " 0\n" ); + } + + time_iso8601 = NULL; + if ( tp->has_timestamp ) { + GTimeVal timestamp; + timestamp.tv_sec = tp->timestamp; + timestamp.tv_usec = 0; + + time_iso8601 = g_time_val_to_iso8601 ( ×tamp ); + } + else if ( context->options != NULL && context->options->force_time ) + { + GTimeVal current; + g_get_current_time ( ¤t ); + + time_iso8601 = g_time_val_to_iso8601 ( ¤t ); + } + if ( time_iso8601 != NULL ) + fprintf ( f, " \n", time_iso8601 ); + g_free(time_iso8601); + time_iso8601 = NULL; + + if (!isnan(tp->course)) { + gchar s_course[COORDS_STR_BUFFER_SIZE]; + a_coords_dtostr_buffer ( tp->course, s_course ); + fprintf ( f, " %s\n", s_course ); + } + if (!isnan(tp->speed)) { + gchar s_speed[COORDS_STR_BUFFER_SIZE]; + a_coords_dtostr_buffer ( tp->speed, s_speed ); + fprintf ( f, " %s\n", s_speed ); + } + + if (tp->name) { + gchar *s_name = entitize(tp->name); + fprintf ( f, " %s\n", s_name ); + g_free(s_name); + } + + if (tp->fix_mode == VIK_GPS_MODE_2D) + fprintf ( f, " 2d\n"); + if (tp->fix_mode == VIK_GPS_MODE_3D) + fprintf ( f, " 3d\n"); + if (tp->fix_mode == VIK_GPS_MODE_DGPS) + fprintf ( f, " dgps\n"); + if (tp->fix_mode == VIK_GPS_MODE_PPS) + fprintf ( f, " pps\n"); + if (tp->nsats > 0) + fprintf ( f, " %d\n", tp->nsats ); + + if ( tp->hdop != VIK_DEFAULT_DOP ) { + a_coords_dtostr_buffer ( tp->hdop, s_dop ); + fprintf ( f, " %s\n", s_dop ); + } + + if ( tp->vdop != VIK_DEFAULT_DOP ) { + a_coords_dtostr_buffer ( tp->vdop, s_dop ); + fprintf ( f, " %s\n", s_dop ); + } + + if ( tp->pdop != VIK_DEFAULT_DOP ) { + a_coords_dtostr_buffer ( tp->pdop, s_dop ); + fprintf ( f, " %s\n", s_dop ); + } + + fprintf ( f, " \n", (context->options && context->options->is_route) ? "rte" : "trk" ); +} + + +static void gpx_write_track ( VikTrack *t, GpxWritingContext *context ) +{ + // Don't write invisible tracks when specified + if (context->options && !context->options->hidden && !t->visible) + return; + + FILE *f = context->file; + gchar *tmp; + gboolean first_tp_is_newsegment = FALSE; /* must temporarily make it not so, but we want to restore state. not that it matters. */ + + // Sanity clause + if ( t->name ) + tmp = entitize ( t->name ); + else + tmp = g_strdup ("track"); + + // NB 'hidden' is not part of any GPX standard - this appears to be a made up Viking 'extension' + // luckily most other GPX processing software ignores things they don't understand + fprintf ( f, "<%s%s>\n %s\n", + t->is_route ? "rte" : "trk", + t->visible ? "" : " hidden=\"hidden\"", + tmp ); + g_free ( tmp ); + + if ( t->comment ) + { + tmp = entitize ( t->comment ); + fprintf ( f, " %s\n", tmp ); + g_free ( tmp ); + } + + if ( t->description ) + { + tmp = entitize ( t->description ); + fprintf ( f, " %s\n", tmp ); + g_free ( tmp ); + } + + if ( t->source ) + { + tmp = entitize ( t->source ); + fprintf ( f, " %s\n", tmp ); + g_free ( tmp ); + } + + if ( t->type ) + { + tmp = entitize ( t->type ); + fprintf ( f, " %s\n", tmp ); + g_free ( tmp ); + } + + /* No such thing as a rteseg! */ + if ( !t->is_route ) + fprintf ( f, " \n" ); + + if ( t->trackpoints && t->trackpoints->data ) { + first_tp_is_newsegment = VIK_TRACKPOINT(t->trackpoints->data)->newsegment; + VIK_TRACKPOINT(t->trackpoints->data)->newsegment = FALSE; /* so we won't write already */ + g_list_foreach ( t->trackpoints, (GFunc) gpx_write_trackpoint, context ); + VIK_TRACKPOINT(t->trackpoints->data)->newsegment = first_tp_is_newsegment; /* restore state */ + } + + /* NB apparently no such thing as a rteseg! */ + if (!t->is_route) + fprintf ( f, " \n"); + + fprintf ( f, "\n", t->is_route ? "rte" : "trk" ); +} + +static void gpx_write_header( FILE *f ) +{ + // Allow overriding the creator value + // E.g. if something actually cares about it, see for example: + // http://strava.github.io/api/v3/uploads/ + gchar *creator = g_strdup(a_vik_gpx_export_creator()); + if ( g_strcmp0(creator, "") == 0 ) + creator = g_strdup_printf("Viking %s -- %s", PACKAGE_VERSION, PACKAGE_URL); + + fprintf(f, "\n" + "\n"); + g_free(creator); +} + +static void gpx_write_footer( FILE *f ) +{ + fprintf(f, "\n"); +} + +static int gpx_waypoint_compare(const void *x, const void *y) +{ + VikWaypoint *a = (VikWaypoint *)x; + VikWaypoint *b = (VikWaypoint *)y; + return strcmp(a->name,b->name); +} + +static int gpx_track_compare_name(const void *x, const void *y) +{ + VikTrack *a = (VikTrack *)x; + VikTrack *b = (VikTrack *)y; + return strcmp(a->name,b->name); +} + +void a_gpx_write_file ( VikTrwLayer *vtl, FILE *f, GpxWritingOptions *options, const gchar* dirpath ) +{ + GpxWritingContext context = { options, f, dirpath }; + + gpx_write_header ( f ); + + gchar *tmp; + const gchar *name = vik_layer_get_name(VIK_LAYER(vtl)); + if ( name ) { + tmp = entitize ( name ); + fprintf ( f, " %s\n", tmp ); + g_free ( tmp ); + } + + VikTRWMetadata *md = vik_trw_layer_get_metadata (vtl); + if ( md ) { + if ( md->author && strlen(md->author) > 0 ) { + tmp = entitize ( md->author ); + fprintf ( f, " %s\n", tmp ); + g_free ( tmp ); + } + if ( md->description && strlen(md->description) > 0) { + tmp = entitize ( md->description ); + fprintf ( f, " %s\n", tmp ); + g_free ( tmp ); + } + if ( md->timestamp ) { + tmp = entitize ( md->timestamp ); + fprintf ( f, " \n", tmp ); + g_free ( tmp ); + } + if ( md->keywords && strlen(md->keywords) > 0) { + tmp = entitize ( md->keywords ); + fprintf ( f, " %s\n", tmp ); + g_free ( tmp ); + } + } + + if ( vik_trw_layer_get_waypoints_visibility(vtl) || (options && options->hidden) ) { + // gather waypoints in a list, then sort + GList *gl = g_hash_table_get_values ( vik_trw_layer_get_waypoints ( vtl ) ); + gl = g_list_sort ( gl, gpx_waypoint_compare ); + + for (GList *iter = g_list_first (gl); iter != NULL; iter = g_list_next (iter)) { + gpx_write_waypoint ( (VikWaypoint*)iter->data, &context ); + } + g_list_free ( gl ); + } + + GList *gl = NULL; + if ( vik_trw_layer_get_tracks_visibility(vtl) || (options && options->hidden) ) { + //gl = g_hash_table_get_values ( vik_trw_layer_get_tracks ( vtl ) ); + // Forming the list manually seems to produce one that is more likely to be nearer to the creation order + gpointer key, value; + GHashTableIter ght_iter; + g_hash_table_iter_init ( &ght_iter, vik_trw_layer_get_tracks ( vtl ) ); + while ( g_hash_table_iter_next (&ght_iter, &key, &value) ) { + gl = g_list_prepend ( gl ,value ); + } + gl = g_list_reverse ( gl ); + + // Sort method determined by preference + if ( a_vik_get_gpx_export_trk_sort() == VIK_GPX_EXPORT_TRK_SORT_TIME ) + gl = g_list_sort ( gl, vik_track_compare_timestamp ); + else if ( a_vik_get_gpx_export_trk_sort() == VIK_GPX_EXPORT_TRK_SORT_ALPHA ) + gl = g_list_sort ( gl, gpx_track_compare_name ); + } + + GList *glrte = NULL; + // Routes sorted by name + if ( vik_trw_layer_get_routes_visibility(vtl) || (options && options->hidden) ) { + glrte = g_hash_table_get_values ( vik_trw_layer_get_routes ( vtl ) ); + glrte = g_list_sort ( glrte, gpx_track_compare_name ); + } + + // g_list_concat doesn't copy memory properly + // so process each list separately + + GpxWritingContext context_tmp = context; + GpxWritingOptions opt_tmp = { FALSE, FALSE, FALSE, FALSE }; + // Force trackpoints on tracks + if ( !context.options ) + context_tmp.options = &opt_tmp; + context_tmp.options->is_route = FALSE; + + // Loop around each list and write each one + for (GList *iter = g_list_first (gl); iter != NULL; iter = g_list_next (iter)) { + gpx_write_track ( (VikTrack*)iter->data, &context_tmp ); + } + + // Routes (to get routepoints) + context_tmp.options->is_route = TRUE; + for (GList *iter = g_list_first (glrte); iter != NULL; iter = g_list_next (iter)) { + gpx_write_track ( (VikTrack*)iter->data, &context_tmp ); + } + + g_list_free ( gl ); + g_list_free ( glrte ); + + gpx_write_footer ( f ); +} + +void a_gpx_write_track_file ( VikTrack *trk, FILE *f, GpxWritingOptions *options ) +{ + GpxWritingContext context = {options, f}; + gpx_write_header ( f ); + gpx_write_track ( trk, &context ); + gpx_write_footer ( f ); +} + +/** + * Common write of a temporary GPX file + */ +static gchar* write_tmp_file ( VikTrwLayer *vtl, VikTrack *trk, GpxWritingOptions *options ) +{ + gchar *tmp_filename = NULL; + GError *error = NULL; + // Opening temporary file + int fd = g_file_open_tmp("viking_XXXXXX.gpx", &tmp_filename, &error); + if (fd < 0) { + g_warning ( _("failed to open temporary file: %s"), error->message ); + g_clear_error ( &error ); + return NULL; + } + g_debug ("%s: temporary file = %s", __FUNCTION__, tmp_filename); + + FILE *ff = fdopen (fd, "w"); + + if ( trk ) + a_gpx_write_track_file ( trk, ff, options ); + else + a_gpx_write_file ( vtl, ff, options, NULL ); + + fclose (ff); + + return tmp_filename; +} + +/* + * a_gpx_write_tmp_file: + * @vtl: The #VikTrwLayer to write + * @options: Possible ways of writing the file data (can be NULL) + * + * Returns: The name of newly created temporary GPX file + * This file should be removed once used and the string freed. + * If NULL then the process failed. + */ +gchar* a_gpx_write_tmp_file ( VikTrwLayer *vtl, GpxWritingOptions *options ) +{ + return write_tmp_file ( vtl, NULL, options ); +} + +/* + * a_gpx_write_track_tmp_file: + * @trk: The #VikTrack to write + * @options: Possible ways of writing the file data (can be NULL) + * + * Returns: The name of newly created temporary GPX file + * This file should be removed once used and the string freed. + * If NULL then the process failed. + */ +gchar* a_gpx_write_track_tmp_file ( VikTrack *trk, GpxWritingOptions *options ) +{ + return write_tmp_file ( NULL, trk, options ); +} diff --git a/src/gpx.h b/src/gpx.h new file mode 100644 index 0000000..968f89c --- /dev/null +++ b/src/gpx.h @@ -0,0 +1,49 @@ +/* + * viking -- GPS Data and Topo Analyzer, Explorer, and Manager + * + * Copyright (C) 2003-2005, Evan Battaglia + * + * 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., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA + * + */ + +#ifndef _VIKING_GPX_H +#define _VIKING_GPX_H + +#include "viktrwlayer.h" + +G_BEGIN_DECLS + +/** + * Options adapting GPX writing. + */ +typedef struct { + // NB force options only apply to trackpoints + gboolean force_ele; /// Force ele field + gboolean force_time; /// Force time field + gboolean hidden; /// Write invisible tracks/waypoints (default is yes) + gboolean is_route; /// For internal convenience +} GpxWritingOptions; + +gboolean a_gpx_read_file ( VikTrwLayer *trw, FILE *f, const gchar* dirpath ); +void a_gpx_write_file ( VikTrwLayer *trw, FILE *f, GpxWritingOptions *options, const gchar *dirpath ); +void a_gpx_write_track_file ( VikTrack *trk, FILE *f, GpxWritingOptions *options ); + +gchar* a_gpx_write_tmp_file ( VikTrwLayer *vtl, GpxWritingOptions *options ); +gchar* a_gpx_write_track_tmp_file ( VikTrack *trk, GpxWritingOptions *options ); + +G_END_DECLS + +#endif diff --git a/src/icons/Makefile.am b/src/icons/Makefile.am new file mode 100644 index 0000000..6dcc5bd --- /dev/null +++ b/src/icons/Makefile.am @@ -0,0 +1,309 @@ +WAYPOINT_ICONS = \ + wp_camp.png \ + wp_car.png \ + wp_deer.png \ + wp_flag.png \ + wp_geocache.png \ + wp_geocache_fnd.png \ + wp_house.png \ + wp_wpt_dot.png \ + wp_dollar.png \ + wp_golf.png \ + wp_summit.png \ + wp_anchor.png \ + wp_forest.png \ + wp_parking.png \ + wp_sml_cty.png \ + wp_med_cty.png \ + wp_lrg_cty.png \ + wp_cap_cty.png \ + wp_bell.png \ + wp_diamond_grn.png \ + wp_diamond_red.png \ + wp_dive1.png \ + wp_dive2.png \ + wp_fish.png \ + wp_fuel.png \ + wp_horn.png \ + wp_knife.png \ + wp_light.png \ + wp_mug.png \ + wp_skull.png \ + wp_square_grn.png \ + wp_square_red.png \ + wp_wbuoy.png \ + wp_wreck.png \ + wp_null.png \ + wp_mine.png \ + wp_school.png \ + wp_cemetery.png \ + wp_church.png \ + wp_military.png \ + wp_mob.png \ + wp_buoy_ambr.png \ + wp_buoy_blck.png \ + wp_buoy_blue.png \ + wp_buoy_grn.png \ + wp_buoy_grn_red.png \ + wp_buoy_grn_wht.png \ + wp_buoy_orng.png \ + wp_buoy_red.png \ + wp_buoy_red_grn.png \ + wp_buoy_red_wht.png \ + wp_buoy_violet.png \ + wp_buoy_wht.png \ + wp_buoy_wht_grn.png \ + wp_buoy_wht_red.png \ + wp_dot.png \ + wp_rbcn.png \ + wp_boat_ramp.png \ + wp_restroom.png \ + wp_shower.png \ + wp_drinking_wtr.png \ + wp_phone.png \ + wp_1st_aid.png \ + wp_info.png \ + wp_park.png \ + wp_picnic.png \ + wp_scenic.png \ + wp_skiing.png \ + wp_swimming.png \ + wp_dam.png \ + wp_controlled.png \ + wp_danger.png \ + wp_restricted.png \ + wp_ball.png \ + wp_rv_park.png \ + wp_bridge.png \ + wp_building.png \ + wp_tunnel.png \ + wp_beach.png \ + wp_airplane.png \ + wp_ice_skating.png + +WAYPOINT_ICONS_LARGE = +WAYPOINT_ICONS_LARGE += wp_1st_aid_large.png +WAYPOINT_ICONS_LARGE += wp_airplane_large.png +WAYPOINT_ICONS_LARGE += wp_amuse_pk_large.png +WAYPOINT_ICONS_LARGE += wp_anchor_large.png +WAYPOINT_ICONS_LARGE += wp_animal_tracks_large.png +WAYPOINT_ICONS_LARGE += wp_atv_large.png +WAYPOINT_ICONS_LARGE += wp_ball_large.png +WAYPOINT_ICONS_LARGE += wp_beach_large.png +WAYPOINT_ICONS_LARGE += wp_bell_large.png +WAYPOINT_ICONS_LARGE += wp_big_game_large.png +WAYPOINT_ICONS_LARGE += wp_bike_trail_large.png +WAYPOINT_ICONS_LARGE += wp_blind_large.png +WAYPOINT_ICONS_LARGE += wp_blood_trail_large.png +WAYPOINT_ICONS_LARGE += wp_block_blue_large.png +WAYPOINT_ICONS_LARGE += wp_block_green_large.png +WAYPOINT_ICONS_LARGE += wp_block_red_large.png +WAYPOINT_ICONS_LARGE += wp_boat_ramp_large.png +WAYPOINT_ICONS_LARGE += wp_bowling_large.png +WAYPOINT_ICONS_LARGE += wp_bridge_large.png +WAYPOINT_ICONS_LARGE += wp_building_large.png +WAYPOINT_ICONS_LARGE += wp_buoy_ambr_large.png +WAYPOINT_ICONS_LARGE += wp_buoy_blck_large.png +WAYPOINT_ICONS_LARGE += wp_buoy_blue_large.png +WAYPOINT_ICONS_LARGE += wp_buoy_grn_large.png +WAYPOINT_ICONS_LARGE += wp_buoy_grn_red_large.png +WAYPOINT_ICONS_LARGE += wp_buoy_grn_wht_large.png +WAYPOINT_ICONS_LARGE += wp_buoy_orng_large.png +WAYPOINT_ICONS_LARGE += wp_buoy_red_grn_large.png +WAYPOINT_ICONS_LARGE += wp_buoy_red_large.png +WAYPOINT_ICONS_LARGE += wp_buoy_red_wht_large.png +WAYPOINT_ICONS_LARGE += wp_buoy_violet_large.png +WAYPOINT_ICONS_LARGE += wp_buoy_wht_grn_large.png +WAYPOINT_ICONS_LARGE += wp_buoy_wht_large.png +WAYPOINT_ICONS_LARGE += wp_buoy_wht_red_large.png +WAYPOINT_ICONS_LARGE += wp_camp_large.png +WAYPOINT_ICONS_LARGE += wp_car_large.png +WAYPOINT_ICONS_LARGE += wp_car_rental_large.png +WAYPOINT_ICONS_LARGE += wp_car_repair_large.png +WAYPOINT_ICONS_LARGE += wp_cemetery_large.png +WAYPOINT_ICONS_LARGE += wp_church_large.png +WAYPOINT_ICONS_LARGE += wp_civil_large.png +WAYPOINT_ICONS_LARGE += wp_controlled_large.png +WAYPOINT_ICONS_LARGE += wp_conv_store_large.png +WAYPOINT_ICONS_LARGE += wp_cover_large.png +WAYPOINT_ICONS_LARGE += wp_covey_large.png +WAYPOINT_ICONS_LARGE += wp_crossing_large.png +WAYPOINT_ICONS_LARGE += wp_dam_large.png +WAYPOINT_ICONS_LARGE += wp_danger_large.png +WAYPOINT_ICONS_LARGE += wp_deer_large.png +WAYPOINT_ICONS_LARGE += wp_dive1_large.png +WAYPOINT_ICONS_LARGE += wp_dive2_large.png +WAYPOINT_ICONS_LARGE += wp_dollar_large.png +WAYPOINT_ICONS_LARGE += wp_drinking_wtr_large.png +WAYPOINT_ICONS_LARGE += wp_exit_large.png +WAYPOINT_ICONS_LARGE += wp_fastfood_large.png +WAYPOINT_ICONS_LARGE += wp_fhs_facility_large.png +WAYPOINT_ICONS_LARGE += wp_fish_large.png +WAYPOINT_ICONS_LARGE += wp_fitness_large.png +WAYPOINT_ICONS_LARGE += wp_flag_blue_large.png +WAYPOINT_ICONS_LARGE += wp_flag_green_large.png +WAYPOINT_ICONS_LARGE += wp_flag_red_large.png +WAYPOINT_ICONS_LARGE += wp_food_source_large.png +WAYPOINT_ICONS_LARGE += wp_forest_large.png +WAYPOINT_ICONS_LARGE += wp_fuel_large.png +WAYPOINT_ICONS_LARGE += wp_furbearer_large.png +WAYPOINT_ICONS_LARGE += wp_geocache_fnd_large.png +WAYPOINT_ICONS_LARGE += wp_geocache_large.png +WAYPOINT_ICONS_LARGE += wp_glider_large.png +WAYPOINT_ICONS_LARGE += wp_golf_large.png +WAYPOINT_ICONS_LARGE += wp_grnd_trans_large.png +WAYPOINT_ICONS_LARGE += wp_helipad_large.png +WAYPOINT_ICONS_LARGE += wp_horn_large.png +WAYPOINT_ICONS_LARGE += wp_house_large.png +WAYPOINT_ICONS_LARGE += wp_ice_skating_large.png +WAYPOINT_ICONS_LARGE += wp_info_large.png +WAYPOINT_ICONS_LARGE += wp_knife_large.png +WAYPOINT_ICONS_LARGE += wp_light_large.png +WAYPOINT_ICONS_LARGE += wp_lodging_large.png +WAYPOINT_ICONS_LARGE += wp_lodge_large.png +WAYPOINT_ICONS_LARGE += wp_lrg_cty_large.png +WAYPOINT_ICONS_LARGE += wp_med_cty_large.png +WAYPOINT_ICONS_LARGE += wp_mine_large.png +WAYPOINT_ICONS_LARGE += wp_mob_large.png +WAYPOINT_ICONS_LARGE += wp_movie_large.png +WAYPOINT_ICONS_LARGE += wp_mug_large.png +WAYPOINT_ICONS_LARGE += wp_museum_large.png +WAYPOINT_ICONS_LARGE += wp_oil_field_large.png +WAYPOINT_ICONS_LARGE += wp_parachute_large.png +WAYPOINT_ICONS_LARGE += wp_parking_large.png +WAYPOINT_ICONS_LARGE += wp_park_large.png +WAYPOINT_ICONS_LARGE += wp_pharmacy_large.png +WAYPOINT_ICONS_LARGE += wp_phone_large.png +WAYPOINT_ICONS_LARGE += wp_picnic_large.png +WAYPOINT_ICONS_LARGE += wp_pin_blue_large.png +WAYPOINT_ICONS_LARGE += wp_pin_green_large.png +WAYPOINT_ICONS_LARGE += wp_pin_red_large.png +WAYPOINT_ICONS_LARGE += wp_pizza_large.png +WAYPOINT_ICONS_LARGE += wp_police_large.png +WAYPOINT_ICONS_LARGE += wp_post_ofc_large.png +WAYPOINT_ICONS_LARGE += wp_rbcn_large.png +WAYPOINT_ICONS_LARGE += wp_restricted_large.png +WAYPOINT_ICONS_LARGE += wp_restroom_large.png +WAYPOINT_ICONS_LARGE += wp_rv_park_large.png +WAYPOINT_ICONS_LARGE += wp_scenic_large.png +WAYPOINT_ICONS_LARGE += wp_school_large.png +WAYPOINT_ICONS_LARGE += wp_shopping_large.png +WAYPOINT_ICONS_LARGE += wp_short_tower_large.png +WAYPOINT_ICONS_LARGE += wp_shower_large.png +WAYPOINT_ICONS_LARGE += wp_skiing_large.png +WAYPOINT_ICONS_LARGE += wp_ski_resort_large.png +WAYPOINT_ICONS_LARGE += wp_skull_large.png +WAYPOINT_ICONS_LARGE += wp_small_game_large.png +WAYPOINT_ICONS_LARGE += wp_sml_cty_large.png +WAYPOINT_ICONS_LARGE += wp_stadium_large.png +WAYPOINT_ICONS_LARGE += wp_store_large.png +WAYPOINT_ICONS_LARGE += wp_summit_large.png +WAYPOINT_ICONS_LARGE += wp_swimming_large.png +WAYPOINT_ICONS_LARGE += wp_tall_tower_large.png +WAYPOINT_ICONS_LARGE += wp_theater_large.png +WAYPOINT_ICONS_LARGE += wp_toll_booth_large.png +WAYPOINT_ICONS_LARGE += wp_trail_head_large.png +WAYPOINT_ICONS_LARGE += wp_tree_stand_large.png +WAYPOINT_ICONS_LARGE += wp_treed_quarry_large.png +WAYPOINT_ICONS_LARGE += wp_truck_large.png +WAYPOINT_ICONS_LARGE += wp_truck_stop_large.png +WAYPOINT_ICONS_LARGE += wp_tunnel_large.png +WAYPOINT_ICONS_LARGE += wp_upland_game_large.png +WAYPOINT_ICONS_LARGE += wp_ultralight_large.png +WAYPOINT_ICONS_LARGE += wp_water_source_large.png +WAYPOINT_ICONS_LARGE += wp_waterfowl_large.png +WAYPOINT_ICONS_LARGE += wp_wbuoy_large.png +WAYPOINT_ICONS_LARGE += wp_weigh_station_large.png +WAYPOINT_ICONS_LARGE += wp_wrecker_large.png +WAYPOINT_ICONS_LARGE += wp_wreck_large.png +WAYPOINT_ICONS_LARGE += wp_zoo_large.png + +ICONS = \ + viking.png \ + bing_maps.png \ + addtr_18.png \ + vik_new_route_18.png \ + addwp_18.png \ + edtr_18.png \ + edwp_18.png \ + geomove_18.png \ + geozoom_18.png \ + mapdl_18.png \ + demdl_18.png \ + mover_22.png \ + ruler_18.png \ + showpic_18.png \ + zoom_18.png \ + route_finder_18.png \ + splitter_18.png \ + select_18.png \ + thumbnails.png \ + vikaggregatelayer.png \ + vikcoordlayer.png \ + vikdemlayer.png \ + vikgeoreflayer.png \ + vikgpslayer.png \ + vikmapslayer.png \ + vikmapniklayer.png \ + viktrwlayer.png \ + viktrwlayer_external.png \ + viktrwlayer_external_nowrite.png + +CURSORS = \ + cursor_addtr.png \ + cursor_new_route.png \ + cursor_edtr.png \ + cursor_geozoom.png \ + cursor_ruler.png \ + cursor_addwp.png \ + cursor_edwp.png \ + cursor_route_finder.png \ + cursor_splitter.png \ + cursor_showpic.png \ + cursor_demdl.png \ + cursor_geomove.png \ + cursor_mapdl.png \ + cursor_zoom.png + +ALL_ICONS = $(ICONS) $(WAYPOINT_ICONS) $(WAYPOINT_ICONS_LARGE) $(CURSORS) +EXTRA_DIST = $(ALL_ICONS) +ALL_ICONS_HEADER = $(ALL_ICONS:.png=_pixmap.h) + +BUILT_SOURCES = $(ALL_ICONS_HEADER) icons.c icons.h +CLEANFILES = $(BUILT_SOURCES) +SUFFIXES = .png _pixmap.h + +.png_pixmap.h: + gdk-pixbuf-csource --name="`basename $< .png`_pixbuf" --struct --extern $< > $@ + cat $@ | sed -e 's/\(pixel_data: ..\)/\1 (unsigned char \*)/' > temp$@.h + mv temp$@.h $@ + +noinst_LIBRARIES = libicons.a +libicons_a_SOURCES = icons.c icons.h + +icons.h: $(ALL_ICONS_HEADER) + echo "/* Generated file */" > $@ + sed -n "s/^\(const.*\) = {/extern \1;/p" $(ALL_ICONS_HEADER) >> $@ + +icons.c: $(ALL_ICONS_HEADER) + echo "/* Generated file */" > $@ + echo "#include " >> $@ + for file in $(ALL_ICONS_HEADER) ; do echo "#include \"$$file\"" >> $@ ; done + +$(BUILT_SOURCES): $(srcdir)/Makefile.am + +AM_CFLAGS = -Wall -g -D_GNU_SOURCE \ + $(PACKAGE_CFLAGS) + +iconsdir = $(datadir)/icons/hicolor/48x48/apps +icons_DATA = viking.png +gtk_update_icon_cache = gtk-update-icon-cache -f -t $(datadir)/icons/hicolor + +install-data-hook: + @-if test -z "$(DESTDIR)"; then \ + echo "Updating Gtk icon cache."; \ + $(gtk_update_icon_cache); \ + else \ + echo "*** Icon cache not updated. After install, run this:"; \ + echo "*** $(gtk_update_icon_cache)"; \ + fi diff --git a/src/icons/Makefile.in b/src/icons/Makefile.in new file mode 100644 index 0000000..bbb693b --- /dev/null +++ b/src/icons/Makefile.in @@ -0,0 +1,923 @@ +# Makefile.in generated by automake 1.16.1 from Makefile.am. +# @configure_input@ + +# Copyright (C) 1994-2018 Free Software Foundation, Inc. + +# This Makefile.in is free software; the Free Software Foundation +# gives unlimited permission to copy and/or distribute it, +# with or without modifications, as long as this notice is preserved. + +# This program is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY, to the extent permitted by law; without +# even the implied warranty of MERCHANTABILITY or FITNESS FOR A +# PARTICULAR PURPOSE. + +@SET_MAKE@ + + +VPATH = @srcdir@ +am__is_gnu_make = { \ + if test -z '$(MAKELEVEL)'; then \ + false; \ + elif test -n '$(MAKE_HOST)'; then \ + true; \ + elif test -n '$(MAKE_VERSION)' && test -n '$(CURDIR)'; then \ + true; \ + else \ + false; \ + fi; \ +} +am__make_running_with_option = \ + case $${target_option-} in \ + ?) ;; \ + *) echo "am__make_running_with_option: internal error: invalid" \ + "target option '$${target_option-}' specified" >&2; \ + exit 1;; \ + esac; \ + has_opt=no; \ + sane_makeflags=$$MAKEFLAGS; \ + if $(am__is_gnu_make); then \ + sane_makeflags=$$MFLAGS; \ + else \ + case $$MAKEFLAGS in \ + *\\[\ \ ]*) \ + bs=\\; \ + sane_makeflags=`printf '%s\n' "$$MAKEFLAGS" \ + | sed "s/$$bs$$bs[$$bs $$bs ]*//g"`;; \ + esac; \ + fi; \ + skip_next=no; \ + strip_trailopt () \ + { \ + flg=`printf '%s\n' "$$flg" | sed "s/$$1.*$$//"`; \ + }; \ + for flg in $$sane_makeflags; do \ + test $$skip_next = yes && { skip_next=no; continue; }; \ + case $$flg in \ + *=*|--*) continue;; \ + -*I) strip_trailopt 'I'; skip_next=yes;; \ + -*I?*) strip_trailopt 'I';; \ + -*O) strip_trailopt 'O'; skip_next=yes;; \ + -*O?*) strip_trailopt 'O';; \ + -*l) strip_trailopt 'l'; skip_next=yes;; \ + -*l?*) strip_trailopt 'l';; \ + -[dEDm]) skip_next=yes;; \ + -[JT]) skip_next=yes;; \ + esac; \ + case $$flg in \ + *$$target_option*) has_opt=yes; break;; \ + esac; \ + done; \ + test $$has_opt = yes +am__make_dryrun = (target_option=n; $(am__make_running_with_option)) +am__make_keepgoing = (target_option=k; $(am__make_running_with_option)) +pkgdatadir = $(datadir)/@PACKAGE@ +pkgincludedir = $(includedir)/@PACKAGE@ +pkglibdir = $(libdir)/@PACKAGE@ +pkglibexecdir = $(libexecdir)/@PACKAGE@ +am__cd = CDPATH="$${ZSH_VERSION+.}$(PATH_SEPARATOR)" && cd +install_sh_DATA = $(install_sh) -c -m 644 +install_sh_PROGRAM = $(install_sh) -c +install_sh_SCRIPT = $(install_sh) -c +INSTALL_HEADER = $(INSTALL_DATA) +transform = $(program_transform_name) +NORMAL_INSTALL = : +PRE_INSTALL = : +POST_INSTALL = : +NORMAL_UNINSTALL = : +PRE_UNINSTALL = : +POST_UNINSTALL = : +build_triplet = @build@ +host_triplet = @host@ +target_triplet = @target@ +subdir = src/icons +ACLOCAL_M4 = $(top_srcdir)/aclocal.m4 +am__aclocal_m4_deps = $(top_srcdir)/m4/expat.m4 \ + $(top_srcdir)/m4/gettext.m4 $(top_srcdir)/m4/iconv.m4 \ + $(top_srcdir)/m4/intlmacosx.m4 $(top_srcdir)/m4/lib-ld.m4 \ + $(top_srcdir)/m4/lib-link.m4 $(top_srcdir)/m4/lib-prefix.m4 \ + $(top_srcdir)/m4/libcurl.m4 $(top_srcdir)/m4/nls.m4 \ + $(top_srcdir)/m4/po.m4 $(top_srcdir)/m4/progtest.m4 \ + $(top_srcdir)/configure.ac +am__configure_deps = $(am__aclocal_m4_deps) $(CONFIGURE_DEPENDENCIES) \ + $(ACLOCAL_M4) +DIST_COMMON = $(srcdir)/Makefile.am $(am__DIST_COMMON) +mkinstalldirs = $(SHELL) $(top_srcdir)/mkinstalldirs +CONFIG_HEADER = $(top_builddir)/src/config.h +CONFIG_CLEAN_FILES = +CONFIG_CLEAN_VPATH_FILES = +LIBRARIES = $(noinst_LIBRARIES) +AR = ar +ARFLAGS = cru +AM_V_AR = $(am__v_AR_@AM_V@) +am__v_AR_ = $(am__v_AR_@AM_DEFAULT_V@) +am__v_AR_0 = @echo " AR " $@; +am__v_AR_1 = +libicons_a_AR = $(AR) $(ARFLAGS) +libicons_a_LIBADD = +am_libicons_a_OBJECTS = icons.$(OBJEXT) +libicons_a_OBJECTS = $(am_libicons_a_OBJECTS) +AM_V_P = $(am__v_P_@AM_V@) +am__v_P_ = $(am__v_P_@AM_DEFAULT_V@) +am__v_P_0 = false +am__v_P_1 = : +AM_V_GEN = $(am__v_GEN_@AM_V@) +am__v_GEN_ = $(am__v_GEN_@AM_DEFAULT_V@) +am__v_GEN_0 = @echo " GEN " $@; +am__v_GEN_1 = +AM_V_at = $(am__v_at_@AM_V@) +am__v_at_ = $(am__v_at_@AM_DEFAULT_V@) +am__v_at_0 = @ +am__v_at_1 = +DEFAULT_INCLUDES = -I.@am__isrc@ -I$(top_builddir)/src +depcomp = $(SHELL) $(top_srcdir)/depcomp +am__maybe_remake_depfiles = depfiles +am__depfiles_remade = ./$(DEPDIR)/icons.Po +am__mv = mv -f +COMPILE = $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) \ + $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) +AM_V_CC = $(am__v_CC_@AM_V@) +am__v_CC_ = $(am__v_CC_@AM_DEFAULT_V@) +am__v_CC_0 = @echo " CC " $@; +am__v_CC_1 = +CCLD = $(CC) +LINK = $(CCLD) $(AM_CFLAGS) $(CFLAGS) $(AM_LDFLAGS) $(LDFLAGS) -o $@ +AM_V_CCLD = $(am__v_CCLD_@AM_V@) +am__v_CCLD_ = $(am__v_CCLD_@AM_DEFAULT_V@) +am__v_CCLD_0 = @echo " CCLD " $@; +am__v_CCLD_1 = +SOURCES = $(libicons_a_SOURCES) +DIST_SOURCES = $(libicons_a_SOURCES) +am__can_run_installinfo = \ + case $$AM_UPDATE_INFO_DIR in \ + n|no|NO) false;; \ + *) (install-info --version) >/dev/null 2>&1;; \ + esac +am__vpath_adj_setup = srcdirstrip=`echo "$(srcdir)" | sed 's|.|.|g'`; +am__vpath_adj = case $$p in \ + $(srcdir)/*) f=`echo "$$p" | sed "s|^$$srcdirstrip/||"`;; \ + *) f=$$p;; \ + esac; +am__strip_dir = f=`echo $$p | sed -e 's|^.*/||'`; +am__install_max = 40 +am__nobase_strip_setup = \ + srcdirstrip=`echo "$(srcdir)" | sed 's/[].[^$$\\*|]/\\\\&/g'` +am__nobase_strip = \ + for p in $$list; do echo "$$p"; done | sed -e "s|$$srcdirstrip/||" +am__nobase_list = $(am__nobase_strip_setup); \ + for p in $$list; do echo "$$p $$p"; done | \ + sed "s| $$srcdirstrip/| |;"' / .*\//!s/ .*/ ./; s,\( .*\)/[^/]*$$,\1,' | \ + $(AWK) 'BEGIN { files["."] = "" } { files[$$2] = files[$$2] " " $$1; \ + if (++n[$$2] == $(am__install_max)) \ + { print $$2, files[$$2]; n[$$2] = 0; files[$$2] = "" } } \ + END { for (dir in files) print dir, files[dir] }' +am__base_list = \ + sed '$$!N;$$!N;$$!N;$$!N;$$!N;$$!N;$$!N;s/\n/ /g' | \ + sed '$$!N;$$!N;$$!N;$$!N;s/\n/ /g' +am__uninstall_files_from_dir = { \ + test -z "$$files" \ + || { test ! -d "$$dir" && test ! -f "$$dir" && test ! -r "$$dir"; } \ + || { echo " ( cd '$$dir' && rm -f" $$files ")"; \ + $(am__cd) "$$dir" && rm -f $$files; }; \ + } +am__installdirs = "$(DESTDIR)$(iconsdir)" +DATA = $(icons_DATA) +am__tagged_files = $(HEADERS) $(SOURCES) $(TAGS_FILES) $(LISP) +# Read a list of newline-separated strings from the standard input, +# and print each of them once, without duplicates. Input order is +# *not* preserved. +am__uniquify_input = $(AWK) '\ + BEGIN { nonempty = 0; } \ + { items[$$0] = 1; nonempty = 1; } \ + END { if (nonempty) { for (i in items) print i; }; } \ +' +# Make sure the list of sources is unique. This is necessary because, +# e.g., the same source file might be shared among _SOURCES variables +# for different programs/libraries. +am__define_uniq_tagged_files = \ + list='$(am__tagged_files)'; \ + unique=`for i in $$list; do \ + if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \ + done | $(am__uniquify_input)` +ETAGS = etags +CTAGS = ctags +am__DIST_COMMON = $(srcdir)/Makefile.in $(top_srcdir)/depcomp \ + $(top_srcdir)/mkinstalldirs +DISTFILES = $(DIST_COMMON) $(DIST_SOURCES) $(TEXINFOS) $(EXTRA_DIST) +ACLOCAL = @ACLOCAL@ +ACLOCAL_AMFLAGS = @ACLOCAL_AMFLAGS@ +ALL_LINGUAS = @ALL_LINGUAS@ +AMTAR = @AMTAR@ +AM_DEFAULT_VERBOSITY = @AM_DEFAULT_VERBOSITY@ +AUTOCONF = @AUTOCONF@ +AUTOHEADER = @AUTOHEADER@ +AUTOMAKE = @AUTOMAKE@ +AWK = @AWK@ +CATALOGS = @CATALOGS@ +CATOBJEXT = @CATOBJEXT@ +CC = @CC@ +CCDEPMODE = @CCDEPMODE@ +CFLAGS = @CFLAGS@ +CONFIG_STATUS_DEPENDENCIES = @CONFIG_STATUS_DEPENDENCIES@ +CPP = @CPP@ +CPPFLAGS = @CPPFLAGS@ +CXX = @CXX@ +CXXCPP = @CXXCPP@ +CXXDEPMODE = @CXXDEPMODE@ +CXXFLAGS = @CXXFLAGS@ +CYGPATH_W = @CYGPATH_W@ +DATADIRNAME = @DATADIRNAME@ +DB2MAN_XSL = @DB2MAN_XSL@ +DEFS = @DEFS@ +DEPDIR = @DEPDIR@ +DISTCHECK_CONFIGURE_FLAGS = @DISTCHECK_CONFIGURE_FLAGS@ +DOC_USER_FORMATS = @DOC_USER_FORMATS@ +ECHO_C = @ECHO_C@ +ECHO_N = @ECHO_N@ +ECHO_T = @ECHO_T@ +EGREP = @EGREP@ +EXEEXT = @EXEEXT@ +EXPAT_CFLAGS = @EXPAT_CFLAGS@ +EXPAT_LIBS = @EXPAT_LIBS@ +GDK_PIXBUF_CSOURCE = @GDK_PIXBUF_CSOURCE@ +GETTEXT_MACRO_VERSION = @GETTEXT_MACRO_VERSION@ +GETTEXT_PACKAGE = @GETTEXT_PACKAGE@ +GLIB_MKENUMS = @GLIB_MKENUMS@ +GMOFILES = @GMOFILES@ +GMSGFMT = @GMSGFMT@ +GMSGFMT_015 = @GMSGFMT_015@ +GREP = @GREP@ +GTKDOC_CHECK = @GTKDOC_CHECK@ +GTKDOC_CHECK_PATH = @GTKDOC_CHECK_PATH@ +GTKDOC_DEPS_CFLAGS = @GTKDOC_DEPS_CFLAGS@ +GTKDOC_DEPS_LIBS = @GTKDOC_DEPS_LIBS@ +GTKDOC_MKPDF = @GTKDOC_MKPDF@ +GTKDOC_REBASE = @GTKDOC_REBASE@ +HAVE_SCROLLKEEPER = @HAVE_SCROLLKEEPER@ +HELP_DIR = @HELP_DIR@ +HTML_DIR = @HTML_DIR@ +INSTALL = @INSTALL@ +INSTALL_DATA = @INSTALL_DATA@ +INSTALL_PROGRAM = @INSTALL_PROGRAM@ +INSTALL_SCRIPT = @INSTALL_SCRIPT@ +INSTALL_STRIP_PROGRAM = @INSTALL_STRIP_PROGRAM@ +INSTOBJEXT = @INSTOBJEXT@ +INTLLIBS = @INTLLIBS@ +INTLTOOL_EXTRACT = @INTLTOOL_EXTRACT@ +INTLTOOL_MERGE = @INTLTOOL_MERGE@ +INTLTOOL_PERL = @INTLTOOL_PERL@ +INTLTOOL_UPDATE = @INTLTOOL_UPDATE@ +INTLTOOL_V_MERGE = @INTLTOOL_V_MERGE@ +INTLTOOL_V_MERGE_OPTIONS = @INTLTOOL_V_MERGE_OPTIONS@ +INTLTOOL__v_MERGE_ = @INTLTOOL__v_MERGE_@ +INTLTOOL__v_MERGE_0 = @INTLTOOL__v_MERGE_0@ +INTL_MACOSX_LIBS = @INTL_MACOSX_LIBS@ +ISODATE = @ISODATE@ +LDFLAGS = @LDFLAGS@ +LIBCURL = @LIBCURL@ +LIBCURL_CPPFLAGS = @LIBCURL_CPPFLAGS@ +LIBGEOCLUE_CFLAGS = @LIBGEOCLUE_CFLAGS@ +LIBGEOCLUE_LIBS = @LIBGEOCLUE_LIBS@ +LIBICONV = @LIBICONV@ +LIBINTL = @LIBINTL@ +LIBOBJS = @LIBOBJS@ +LIBS = @LIBS@ +LIBZIP_CFLAGS = @LIBZIP_CFLAGS@ +LIBZIP_LIBS = @LIBZIP_LIBS@ +LN_S = @LN_S@ +LTLIBICONV = @LTLIBICONV@ +LTLIBINTL = @LTLIBINTL@ +LTLIBOBJS = @LTLIBOBJS@ +MAKEINFO = @MAKEINFO@ +MKDIR_P = @MKDIR_P@ +MKINSTALLDIRS = @MKINSTALLDIRS@ +MSGFMT = @MSGFMT@ +MSGFMT_015 = @MSGFMT_015@ +MSGFMT_OPTS = @MSGFMT_OPTS@ +MSGMERGE = @MSGMERGE@ +OBJEXT = @OBJEXT@ +OMF_DIR = @OMF_DIR@ +PACKAGE = @PACKAGE@ +PACKAGE_BUGREPORT = @PACKAGE_BUGREPORT@ +PACKAGE_CFLAGS = @PACKAGE_CFLAGS@ +PACKAGE_LIBS = @PACKAGE_LIBS@ +PACKAGE_NAME = @PACKAGE_NAME@ +PACKAGE_STRING = @PACKAGE_STRING@ +PACKAGE_TARNAME = @PACKAGE_TARNAME@ +PACKAGE_URL = @PACKAGE_URL@ +PACKAGE_VERSION = @PACKAGE_VERSION@ +PATH_SEPARATOR = @PATH_SEPARATOR@ +PKG_CONFIG = @PKG_CONFIG@ +PKG_CONFIG_LIBDIR = @PKG_CONFIG_LIBDIR@ +PKG_CONFIG_PATH = @PKG_CONFIG_PATH@ +POFILES = @POFILES@ +POSUB = @POSUB@ +PO_IN_DATADIR_FALSE = @PO_IN_DATADIR_FALSE@ +PO_IN_DATADIR_TRUE = @PO_IN_DATADIR_TRUE@ +RANLIB = @RANLIB@ +SET_MAKE = @SET_MAKE@ +SHELL = @SHELL@ +STRIP = @STRIP@ +USE_NLS = @USE_NLS@ +VERSION = @VERSION@ +XGETTEXT = @XGETTEXT@ +XGETTEXT_015 = @XGETTEXT_015@ +XGETTEXT_EXTRA_OPTIONS = @XGETTEXT_EXTRA_OPTIONS@ +XP = @XP@ +_libcurl_config = @_libcurl_config@ +abs_builddir = @abs_builddir@ +abs_srcdir = @abs_srcdir@ +abs_top_builddir = @abs_top_builddir@ +abs_top_srcdir = @abs_top_srcdir@ +ac_ct_CC = @ac_ct_CC@ +ac_ct_CXX = @ac_ct_CXX@ +am__include = @am__include@ +am__leading_dot = @am__leading_dot@ +am__quote = @am__quote@ +am__tar = @am__tar@ +am__untar = @am__untar@ +bindir = @bindir@ +build = @build@ +build_alias = @build_alias@ +build_cpu = @build_cpu@ +build_os = @build_os@ +build_vendor = @build_vendor@ +builddir = @builddir@ +datadir = @datadir@ +datarootdir = @datarootdir@ +docdir = @docdir@ +dvidir = @dvidir@ +exec_prefix = @exec_prefix@ +host = @host@ +host_alias = @host_alias@ +host_cpu = @host_cpu@ +host_os = @host_os@ +host_vendor = @host_vendor@ +htmldir = @htmldir@ +includedir = @includedir@ +infodir = @infodir@ +install_sh = @install_sh@ +intltool__v_merge_options_ = @intltool__v_merge_options_@ +intltool__v_merge_options_0 = @intltool__v_merge_options_0@ +libdir = @libdir@ +libexecdir = @libexecdir@ +localedir = @localedir@ +localstatedir = @localstatedir@ +mandir = @mandir@ +mkdir_p = @mkdir_p@ +oldincludedir = @oldincludedir@ +pdfdir = @pdfdir@ +prefix = @prefix@ +program_transform_name = @program_transform_name@ +psdir = @psdir@ +runstatedir = @runstatedir@ +sbindir = @sbindir@ +sharedstatedir = @sharedstatedir@ +srcdir = @srcdir@ +sysconfdir = @sysconfdir@ +target = @target@ +target_alias = @target_alias@ +target_cpu = @target_cpu@ +target_os = @target_os@ +target_vendor = @target_vendor@ +top_build_prefix = @top_build_prefix@ +top_builddir = @top_builddir@ +top_srcdir = @top_srcdir@ +WAYPOINT_ICONS = \ + wp_camp.png \ + wp_car.png \ + wp_deer.png \ + wp_flag.png \ + wp_geocache.png \ + wp_geocache_fnd.png \ + wp_house.png \ + wp_wpt_dot.png \ + wp_dollar.png \ + wp_golf.png \ + wp_summit.png \ + wp_anchor.png \ + wp_forest.png \ + wp_parking.png \ + wp_sml_cty.png \ + wp_med_cty.png \ + wp_lrg_cty.png \ + wp_cap_cty.png \ + wp_bell.png \ + wp_diamond_grn.png \ + wp_diamond_red.png \ + wp_dive1.png \ + wp_dive2.png \ + wp_fish.png \ + wp_fuel.png \ + wp_horn.png \ + wp_knife.png \ + wp_light.png \ + wp_mug.png \ + wp_skull.png \ + wp_square_grn.png \ + wp_square_red.png \ + wp_wbuoy.png \ + wp_wreck.png \ + wp_null.png \ + wp_mine.png \ + wp_school.png \ + wp_cemetery.png \ + wp_church.png \ + wp_military.png \ + wp_mob.png \ + wp_buoy_ambr.png \ + wp_buoy_blck.png \ + wp_buoy_blue.png \ + wp_buoy_grn.png \ + wp_buoy_grn_red.png \ + wp_buoy_grn_wht.png \ + wp_buoy_orng.png \ + wp_buoy_red.png \ + wp_buoy_red_grn.png \ + wp_buoy_red_wht.png \ + wp_buoy_violet.png \ + wp_buoy_wht.png \ + wp_buoy_wht_grn.png \ + wp_buoy_wht_red.png \ + wp_dot.png \ + wp_rbcn.png \ + wp_boat_ramp.png \ + wp_restroom.png \ + wp_shower.png \ + wp_drinking_wtr.png \ + wp_phone.png \ + wp_1st_aid.png \ + wp_info.png \ + wp_park.png \ + wp_picnic.png \ + wp_scenic.png \ + wp_skiing.png \ + wp_swimming.png \ + wp_dam.png \ + wp_controlled.png \ + wp_danger.png \ + wp_restricted.png \ + wp_ball.png \ + wp_rv_park.png \ + wp_bridge.png \ + wp_building.png \ + wp_tunnel.png \ + wp_beach.png \ + wp_airplane.png \ + wp_ice_skating.png + +WAYPOINT_ICONS_LARGE = wp_1st_aid_large.png wp_airplane_large.png \ + wp_amuse_pk_large.png wp_anchor_large.png \ + wp_animal_tracks_large.png wp_atv_large.png wp_ball_large.png \ + wp_beach_large.png wp_bell_large.png wp_big_game_large.png \ + wp_bike_trail_large.png wp_blind_large.png \ + wp_blood_trail_large.png wp_block_blue_large.png \ + wp_block_green_large.png wp_block_red_large.png \ + wp_boat_ramp_large.png wp_bowling_large.png \ + wp_bridge_large.png wp_building_large.png \ + wp_buoy_ambr_large.png wp_buoy_blck_large.png \ + wp_buoy_blue_large.png wp_buoy_grn_large.png \ + wp_buoy_grn_red_large.png wp_buoy_grn_wht_large.png \ + wp_buoy_orng_large.png wp_buoy_red_grn_large.png \ + wp_buoy_red_large.png wp_buoy_red_wht_large.png \ + wp_buoy_violet_large.png wp_buoy_wht_grn_large.png \ + wp_buoy_wht_large.png wp_buoy_wht_red_large.png \ + wp_camp_large.png wp_car_large.png wp_car_rental_large.png \ + wp_car_repair_large.png wp_cemetery_large.png \ + wp_church_large.png wp_civil_large.png wp_controlled_large.png \ + wp_conv_store_large.png wp_cover_large.png wp_covey_large.png \ + wp_crossing_large.png wp_dam_large.png wp_danger_large.png \ + wp_deer_large.png wp_dive1_large.png wp_dive2_large.png \ + wp_dollar_large.png wp_drinking_wtr_large.png \ + wp_exit_large.png wp_fastfood_large.png \ + wp_fhs_facility_large.png wp_fish_large.png \ + wp_fitness_large.png wp_flag_blue_large.png \ + wp_flag_green_large.png wp_flag_red_large.png \ + wp_food_source_large.png wp_forest_large.png wp_fuel_large.png \ + wp_furbearer_large.png wp_geocache_fnd_large.png \ + wp_geocache_large.png wp_glider_large.png wp_golf_large.png \ + wp_grnd_trans_large.png wp_helipad_large.png wp_horn_large.png \ + wp_house_large.png wp_ice_skating_large.png wp_info_large.png \ + wp_knife_large.png wp_light_large.png wp_lodging_large.png \ + wp_lodge_large.png wp_lrg_cty_large.png wp_med_cty_large.png \ + wp_mine_large.png wp_mob_large.png wp_movie_large.png \ + wp_mug_large.png wp_museum_large.png wp_oil_field_large.png \ + wp_parachute_large.png wp_parking_large.png wp_park_large.png \ + wp_pharmacy_large.png wp_phone_large.png wp_picnic_large.png \ + wp_pin_blue_large.png wp_pin_green_large.png \ + wp_pin_red_large.png wp_pizza_large.png wp_police_large.png \ + wp_post_ofc_large.png wp_rbcn_large.png \ + wp_restricted_large.png wp_restroom_large.png \ + wp_rv_park_large.png wp_scenic_large.png wp_school_large.png \ + wp_shopping_large.png wp_short_tower_large.png \ + wp_shower_large.png wp_skiing_large.png \ + wp_ski_resort_large.png wp_skull_large.png \ + wp_small_game_large.png wp_sml_cty_large.png \ + wp_stadium_large.png wp_store_large.png wp_summit_large.png \ + wp_swimming_large.png wp_tall_tower_large.png \ + wp_theater_large.png wp_toll_booth_large.png \ + wp_trail_head_large.png wp_tree_stand_large.png \ + wp_treed_quarry_large.png wp_truck_large.png \ + wp_truck_stop_large.png wp_tunnel_large.png \ + wp_upland_game_large.png wp_ultralight_large.png \ + wp_water_source_large.png wp_waterfowl_large.png \ + wp_wbuoy_large.png wp_weigh_station_large.png \ + wp_wrecker_large.png wp_wreck_large.png wp_zoo_large.png +ICONS = \ + viking.png \ + bing_maps.png \ + addtr_18.png \ + vik_new_route_18.png \ + addwp_18.png \ + edtr_18.png \ + edwp_18.png \ + geomove_18.png \ + geozoom_18.png \ + mapdl_18.png \ + demdl_18.png \ + mover_22.png \ + ruler_18.png \ + showpic_18.png \ + zoom_18.png \ + route_finder_18.png \ + splitter_18.png \ + select_18.png \ + thumbnails.png \ + vikaggregatelayer.png \ + vikcoordlayer.png \ + vikdemlayer.png \ + vikgeoreflayer.png \ + vikgpslayer.png \ + vikmapslayer.png \ + vikmapniklayer.png \ + viktrwlayer.png \ + viktrwlayer_external.png \ + viktrwlayer_external_nowrite.png + +CURSORS = \ + cursor_addtr.png \ + cursor_new_route.png \ + cursor_edtr.png \ + cursor_geozoom.png \ + cursor_ruler.png \ + cursor_addwp.png \ + cursor_edwp.png \ + cursor_route_finder.png \ + cursor_splitter.png \ + cursor_showpic.png \ + cursor_demdl.png \ + cursor_geomove.png \ + cursor_mapdl.png \ + cursor_zoom.png + +ALL_ICONS = $(ICONS) $(WAYPOINT_ICONS) $(WAYPOINT_ICONS_LARGE) $(CURSORS) +EXTRA_DIST = $(ALL_ICONS) +ALL_ICONS_HEADER = $(ALL_ICONS:.png=_pixmap.h) +BUILT_SOURCES = $(ALL_ICONS_HEADER) icons.c icons.h +CLEANFILES = $(BUILT_SOURCES) +SUFFIXES = .png _pixmap.h +noinst_LIBRARIES = libicons.a +libicons_a_SOURCES = icons.c icons.h +AM_CFLAGS = -Wall -g -D_GNU_SOURCE \ + $(PACKAGE_CFLAGS) + +iconsdir = $(datadir)/icons/hicolor/48x48/apps +icons_DATA = viking.png +gtk_update_icon_cache = gtk-update-icon-cache -f -t $(datadir)/icons/hicolor +all: $(BUILT_SOURCES) + $(MAKE) $(AM_MAKEFLAGS) all-am + +.SUFFIXES: +.SUFFIXES: .png _pixmap.h .c .o .obj +$(srcdir)/Makefile.in: $(srcdir)/Makefile.am $(am__configure_deps) + @for dep in $?; do \ + case '$(am__configure_deps)' in \ + *$$dep*) \ + ( cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh ) \ + && { if test -f $@; then exit 0; else break; fi; }; \ + exit 1;; \ + esac; \ + done; \ + echo ' cd $(top_srcdir) && $(AUTOMAKE) --gnu src/icons/Makefile'; \ + $(am__cd) $(top_srcdir) && \ + $(AUTOMAKE) --gnu src/icons/Makefile +Makefile: $(srcdir)/Makefile.in $(top_builddir)/config.status + @case '$?' in \ + *config.status*) \ + cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh;; \ + *) \ + echo ' cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__maybe_remake_depfiles)'; \ + cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__maybe_remake_depfiles);; \ + esac; + +$(top_builddir)/config.status: $(top_srcdir)/configure $(CONFIG_STATUS_DEPENDENCIES) + cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh + +$(top_srcdir)/configure: $(am__configure_deps) + cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh +$(ACLOCAL_M4): $(am__aclocal_m4_deps) + cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh +$(am__aclocal_m4_deps): + +clean-noinstLIBRARIES: + -test -z "$(noinst_LIBRARIES)" || rm -f $(noinst_LIBRARIES) + +libicons.a: $(libicons_a_OBJECTS) $(libicons_a_DEPENDENCIES) $(EXTRA_libicons_a_DEPENDENCIES) + $(AM_V_at)-rm -f libicons.a + $(AM_V_AR)$(libicons_a_AR) libicons.a $(libicons_a_OBJECTS) $(libicons_a_LIBADD) + $(AM_V_at)$(RANLIB) libicons.a + +mostlyclean-compile: + -rm -f *.$(OBJEXT) + +distclean-compile: + -rm -f *.tab.c + +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/icons.Po@am__quote@ # am--include-marker + +$(am__depfiles_remade): + @$(MKDIR_P) $(@D) + @echo '# dummy' >$@-t && $(am__mv) $@-t $@ + +am--depfiles: $(am__depfiles_remade) + +.c.o: +@am__fastdepCC_TRUE@ $(AM_V_CC)depbase=`echo $@ | sed 's|[^/]*$$|$(DEPDIR)/&|;s|\.o$$||'`;\ +@am__fastdepCC_TRUE@ $(COMPILE) -MT $@ -MD -MP -MF $$depbase.Tpo -c -o $@ $< &&\ +@am__fastdepCC_TRUE@ $(am__mv) $$depbase.Tpo $$depbase.Po +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='$<' object='$@' libtool=no @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(COMPILE) -c -o $@ $< + +.c.obj: +@am__fastdepCC_TRUE@ $(AM_V_CC)depbase=`echo $@ | sed 's|[^/]*$$|$(DEPDIR)/&|;s|\.obj$$||'`;\ +@am__fastdepCC_TRUE@ $(COMPILE) -MT $@ -MD -MP -MF $$depbase.Tpo -c -o $@ `$(CYGPATH_W) '$<'` &&\ +@am__fastdepCC_TRUE@ $(am__mv) $$depbase.Tpo $$depbase.Po +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='$<' object='$@' libtool=no @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(COMPILE) -c -o $@ `$(CYGPATH_W) '$<'` +install-iconsDATA: $(icons_DATA) + @$(NORMAL_INSTALL) + @list='$(icons_DATA)'; test -n "$(iconsdir)" || list=; \ + if test -n "$$list"; then \ + echo " $(MKDIR_P) '$(DESTDIR)$(iconsdir)'"; \ + $(MKDIR_P) "$(DESTDIR)$(iconsdir)" || exit 1; \ + fi; \ + for p in $$list; do \ + if test -f "$$p"; then d=; else d="$(srcdir)/"; fi; \ + echo "$$d$$p"; \ + done | $(am__base_list) | \ + while read files; do \ + echo " $(INSTALL_DATA) $$files '$(DESTDIR)$(iconsdir)'"; \ + $(INSTALL_DATA) $$files "$(DESTDIR)$(iconsdir)" || exit $$?; \ + done + +uninstall-iconsDATA: + @$(NORMAL_UNINSTALL) + @list='$(icons_DATA)'; test -n "$(iconsdir)" || list=; \ + files=`for p in $$list; do echo $$p; done | sed -e 's|^.*/||'`; \ + dir='$(DESTDIR)$(iconsdir)'; $(am__uninstall_files_from_dir) + +ID: $(am__tagged_files) + $(am__define_uniq_tagged_files); mkid -fID $$unique +tags: tags-am +TAGS: tags + +tags-am: $(TAGS_DEPENDENCIES) $(am__tagged_files) + set x; \ + here=`pwd`; \ + $(am__define_uniq_tagged_files); \ + shift; \ + if test -z "$(ETAGS_ARGS)$$*$$unique"; then :; else \ + test -n "$$unique" || unique=$$empty_fix; \ + if test $$# -gt 0; then \ + $(ETAGS) $(ETAGSFLAGS) $(AM_ETAGSFLAGS) $(ETAGS_ARGS) \ + "$$@" $$unique; \ + else \ + $(ETAGS) $(ETAGSFLAGS) $(AM_ETAGSFLAGS) $(ETAGS_ARGS) \ + $$unique; \ + fi; \ + fi +ctags: ctags-am + +CTAGS: ctags +ctags-am: $(TAGS_DEPENDENCIES) $(am__tagged_files) + $(am__define_uniq_tagged_files); \ + test -z "$(CTAGS_ARGS)$$unique" \ + || $(CTAGS) $(CTAGSFLAGS) $(AM_CTAGSFLAGS) $(CTAGS_ARGS) \ + $$unique + +GTAGS: + here=`$(am__cd) $(top_builddir) && pwd` \ + && $(am__cd) $(top_srcdir) \ + && gtags -i $(GTAGS_ARGS) "$$here" +cscopelist: cscopelist-am + +cscopelist-am: $(am__tagged_files) + list='$(am__tagged_files)'; \ + case "$(srcdir)" in \ + [\\/]* | ?:[\\/]*) sdir="$(srcdir)" ;; \ + *) sdir=$(subdir)/$(srcdir) ;; \ + esac; \ + for i in $$list; do \ + if test -f "$$i"; then \ + echo "$(subdir)/$$i"; \ + else \ + echo "$$sdir/$$i"; \ + fi; \ + done >> $(top_builddir)/cscope.files + +distclean-tags: + -rm -f TAGS ID GTAGS GRTAGS GSYMS GPATH tags + +distdir: $(BUILT_SOURCES) + $(MAKE) $(AM_MAKEFLAGS) distdir-am + +distdir-am: $(DISTFILES) + @srcdirstrip=`echo "$(srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \ + topsrcdirstrip=`echo "$(top_srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \ + list='$(DISTFILES)'; \ + dist_files=`for file in $$list; do echo $$file; done | \ + sed -e "s|^$$srcdirstrip/||;t" \ + -e "s|^$$topsrcdirstrip/|$(top_builddir)/|;t"`; \ + case $$dist_files in \ + */*) $(MKDIR_P) `echo "$$dist_files" | \ + sed '/\//!d;s|^|$(distdir)/|;s,/[^/]*$$,,' | \ + sort -u` ;; \ + esac; \ + for file in $$dist_files; do \ + if test -f $$file || test -d $$file; then d=.; else d=$(srcdir); fi; \ + if test -d $$d/$$file; then \ + dir=`echo "/$$file" | sed -e 's,/[^/]*$$,,'`; \ + if test -d "$(distdir)/$$file"; then \ + find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \ + fi; \ + if test -d $(srcdir)/$$file && test $$d != $(srcdir); then \ + cp -fpR $(srcdir)/$$file "$(distdir)$$dir" || exit 1; \ + find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \ + fi; \ + cp -fpR $$d/$$file "$(distdir)$$dir" || exit 1; \ + else \ + test -f "$(distdir)/$$file" \ + || cp -p $$d/$$file "$(distdir)/$$file" \ + || exit 1; \ + fi; \ + done +check-am: all-am +check: $(BUILT_SOURCES) + $(MAKE) $(AM_MAKEFLAGS) check-am +all-am: Makefile $(LIBRARIES) $(DATA) +installdirs: + for dir in "$(DESTDIR)$(iconsdir)"; do \ + test -z "$$dir" || $(MKDIR_P) "$$dir"; \ + done +install: $(BUILT_SOURCES) + $(MAKE) $(AM_MAKEFLAGS) install-am +install-exec: install-exec-am +install-data: install-data-am +uninstall: uninstall-am + +install-am: all-am + @$(MAKE) $(AM_MAKEFLAGS) install-exec-am install-data-am + +installcheck: installcheck-am +install-strip: + if test -z '$(STRIP)'; then \ + $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \ + install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \ + install; \ + else \ + $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \ + install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \ + "INSTALL_PROGRAM_ENV=STRIPPROG='$(STRIP)'" install; \ + fi +mostlyclean-generic: + +clean-generic: + -test -z "$(CLEANFILES)" || rm -f $(CLEANFILES) + +distclean-generic: + -test -z "$(CONFIG_CLEAN_FILES)" || rm -f $(CONFIG_CLEAN_FILES) + -test . = "$(srcdir)" || test -z "$(CONFIG_CLEAN_VPATH_FILES)" || rm -f $(CONFIG_CLEAN_VPATH_FILES) + +maintainer-clean-generic: + @echo "This command is intended for maintainers to use" + @echo "it deletes files that may require special tools to rebuild." + -test -z "$(BUILT_SOURCES)" || rm -f $(BUILT_SOURCES) +clean: clean-am + +clean-am: clean-generic clean-noinstLIBRARIES mostlyclean-am + +distclean: distclean-am + -rm -f ./$(DEPDIR)/icons.Po + -rm -f Makefile +distclean-am: clean-am distclean-compile distclean-generic \ + distclean-tags + +dvi: dvi-am + +dvi-am: + +html: html-am + +html-am: + +info: info-am + +info-am: + +install-data-am: install-iconsDATA + @$(NORMAL_INSTALL) + $(MAKE) $(AM_MAKEFLAGS) install-data-hook +install-dvi: install-dvi-am + +install-dvi-am: + +install-exec-am: + +install-html: install-html-am + +install-html-am: + +install-info: install-info-am + +install-info-am: + +install-man: + +install-pdf: install-pdf-am + +install-pdf-am: + +install-ps: install-ps-am + +install-ps-am: + +installcheck-am: + +maintainer-clean: maintainer-clean-am + -rm -f ./$(DEPDIR)/icons.Po + -rm -f Makefile +maintainer-clean-am: distclean-am maintainer-clean-generic + +mostlyclean: mostlyclean-am + +mostlyclean-am: mostlyclean-compile mostlyclean-generic + +pdf: pdf-am + +pdf-am: + +ps: ps-am + +ps-am: + +uninstall-am: uninstall-iconsDATA + +.MAKE: all check install install-am install-data-am install-strip + +.PHONY: CTAGS GTAGS TAGS all all-am am--depfiles check check-am clean \ + clean-generic clean-noinstLIBRARIES cscopelist-am ctags \ + ctags-am distclean distclean-compile distclean-generic \ + distclean-tags distdir dvi dvi-am html html-am info info-am \ + install install-am install-data install-data-am \ + install-data-hook install-dvi install-dvi-am install-exec \ + install-exec-am install-html install-html-am install-iconsDATA \ + install-info install-info-am install-man install-pdf \ + install-pdf-am install-ps install-ps-am install-strip \ + installcheck installcheck-am installdirs maintainer-clean \ + maintainer-clean-generic mostlyclean mostlyclean-compile \ + mostlyclean-generic pdf pdf-am ps ps-am tags tags-am uninstall \ + uninstall-am uninstall-iconsDATA + +.PRECIOUS: Makefile + + +.png_pixmap.h: + gdk-pixbuf-csource --name="`basename $< .png`_pixbuf" --struct --extern $< > $@ + cat $@ | sed -e 's/\(pixel_data: ..\)/\1 (unsigned char \*)/' > temp$@.h + mv temp$@.h $@ + +icons.h: $(ALL_ICONS_HEADER) + echo "/* Generated file */" > $@ + sed -n "s/^\(const.*\) = {/extern \1;/p" $(ALL_ICONS_HEADER) >> $@ + +icons.c: $(ALL_ICONS_HEADER) + echo "/* Generated file */" > $@ + echo "#include " >> $@ + for file in $(ALL_ICONS_HEADER) ; do echo "#include \"$$file\"" >> $@ ; done + +$(BUILT_SOURCES): $(srcdir)/Makefile.am + +install-data-hook: + @-if test -z "$(DESTDIR)"; then \ + echo "Updating Gtk icon cache."; \ + $(gtk_update_icon_cache); \ + else \ + echo "*** Icon cache not updated. After install, run this:"; \ + echo "*** $(gtk_update_icon_cache)"; \ + fi + +# Tell versions [3.59,3.63) of GNU make to not export all variables. +# Otherwise a system limit (for SysV at least) may be exceeded. +.NOEXPORT: diff --git a/src/icons/addtr_18.png b/src/icons/addtr_18.png new file mode 100644 index 0000000..4d12151 Binary files /dev/null and b/src/icons/addtr_18.png differ diff --git a/src/icons/addwp_18.png b/src/icons/addwp_18.png new file mode 100644 index 0000000..3b1747d Binary files /dev/null and b/src/icons/addwp_18.png differ diff --git a/src/icons/bing_maps.png b/src/icons/bing_maps.png new file mode 100644 index 0000000..ae4367e Binary files /dev/null and b/src/icons/bing_maps.png differ diff --git a/src/icons/cursor_addtr.png b/src/icons/cursor_addtr.png new file mode 100644 index 0000000..5bd4d59 Binary files /dev/null and b/src/icons/cursor_addtr.png differ diff --git a/src/icons/cursor_addwp.png b/src/icons/cursor_addwp.png new file mode 100644 index 0000000..b3fe726 Binary files /dev/null and b/src/icons/cursor_addwp.png differ diff --git a/src/icons/cursor_demdl.png b/src/icons/cursor_demdl.png new file mode 100644 index 0000000..c03b52b Binary files /dev/null and b/src/icons/cursor_demdl.png differ diff --git a/src/icons/cursor_edtr.png b/src/icons/cursor_edtr.png new file mode 100644 index 0000000..4b28d30 Binary files /dev/null and b/src/icons/cursor_edtr.png differ diff --git a/src/icons/cursor_edwp.png b/src/icons/cursor_edwp.png new file mode 100644 index 0000000..d8f1f8f Binary files /dev/null and b/src/icons/cursor_edwp.png differ diff --git a/src/icons/cursor_geomove.png b/src/icons/cursor_geomove.png new file mode 100644 index 0000000..09a8a73 Binary files /dev/null and b/src/icons/cursor_geomove.png differ diff --git a/src/icons/cursor_geozoom.png b/src/icons/cursor_geozoom.png new file mode 100644 index 0000000..dfe1987 Binary files /dev/null and b/src/icons/cursor_geozoom.png differ diff --git a/src/icons/cursor_mapdl.png b/src/icons/cursor_mapdl.png new file mode 100644 index 0000000..df20a9e Binary files /dev/null and b/src/icons/cursor_mapdl.png differ diff --git a/src/icons/cursor_new_route.png b/src/icons/cursor_new_route.png new file mode 100644 index 0000000..c3dbd35 Binary files /dev/null and b/src/icons/cursor_new_route.png differ diff --git a/src/icons/cursor_route_finder.png b/src/icons/cursor_route_finder.png new file mode 100644 index 0000000..4b19f13 Binary files /dev/null and b/src/icons/cursor_route_finder.png differ diff --git a/src/icons/cursor_ruler.png b/src/icons/cursor_ruler.png new file mode 100644 index 0000000..1c34ad8 Binary files /dev/null and b/src/icons/cursor_ruler.png differ diff --git a/src/icons/cursor_showpic.png b/src/icons/cursor_showpic.png new file mode 100644 index 0000000..c97f41a Binary files /dev/null and b/src/icons/cursor_showpic.png differ diff --git a/src/icons/cursor_splitter.png b/src/icons/cursor_splitter.png new file mode 100644 index 0000000..31df3f1 Binary files /dev/null and b/src/icons/cursor_splitter.png differ diff --git a/src/icons/cursor_zoom.png b/src/icons/cursor_zoom.png new file mode 100644 index 0000000..243849d Binary files /dev/null and b/src/icons/cursor_zoom.png differ diff --git a/src/icons/demdl_18.png b/src/icons/demdl_18.png new file mode 100644 index 0000000..a27de8f Binary files /dev/null and b/src/icons/demdl_18.png differ diff --git a/src/icons/edtr_18.png b/src/icons/edtr_18.png new file mode 100644 index 0000000..687cdb5 Binary files /dev/null and b/src/icons/edtr_18.png differ diff --git a/src/icons/edwp_18.png b/src/icons/edwp_18.png new file mode 100644 index 0000000..eeab250 Binary files /dev/null and b/src/icons/edwp_18.png differ diff --git a/src/icons/geomove_18.png b/src/icons/geomove_18.png new file mode 100644 index 0000000..34aae19 Binary files /dev/null and b/src/icons/geomove_18.png differ diff --git a/src/icons/geozoom_18.png b/src/icons/geozoom_18.png new file mode 100644 index 0000000..9e1fe34 Binary files /dev/null and b/src/icons/geozoom_18.png differ diff --git a/src/icons/icons.c b/src/icons/icons.c new file mode 100644 index 0000000..add7122 --- /dev/null +++ b/src/icons/icons.c @@ -0,0 +1,261 @@ +/* Generated file */ +#include +#include "viking_pixmap.h" +#include "bing_maps_pixmap.h" +#include "addtr_18_pixmap.h" +#include "vik_new_route_18_pixmap.h" +#include "addwp_18_pixmap.h" +#include "edtr_18_pixmap.h" +#include "edwp_18_pixmap.h" +#include "geomove_18_pixmap.h" +#include "geozoom_18_pixmap.h" +#include "mapdl_18_pixmap.h" +#include "demdl_18_pixmap.h" +#include "mover_22_pixmap.h" +#include "ruler_18_pixmap.h" +#include "showpic_18_pixmap.h" +#include "zoom_18_pixmap.h" +#include "route_finder_18_pixmap.h" +#include "splitter_18_pixmap.h" +#include "select_18_pixmap.h" +#include "thumbnails_pixmap.h" +#include "vikaggregatelayer_pixmap.h" +#include "vikcoordlayer_pixmap.h" +#include "vikdemlayer_pixmap.h" +#include "vikgeoreflayer_pixmap.h" +#include "vikgpslayer_pixmap.h" +#include "vikmapslayer_pixmap.h" +#include "vikmapniklayer_pixmap.h" +#include "viktrwlayer_pixmap.h" +#include "viktrwlayer_external_pixmap.h" +#include "viktrwlayer_external_nowrite_pixmap.h" +#include "wp_camp_pixmap.h" +#include "wp_car_pixmap.h" +#include "wp_deer_pixmap.h" +#include "wp_flag_pixmap.h" +#include "wp_geocache_pixmap.h" +#include "wp_geocache_fnd_pixmap.h" +#include "wp_house_pixmap.h" +#include "wp_wpt_dot_pixmap.h" +#include "wp_dollar_pixmap.h" +#include "wp_golf_pixmap.h" +#include "wp_summit_pixmap.h" +#include "wp_anchor_pixmap.h" +#include "wp_forest_pixmap.h" +#include "wp_parking_pixmap.h" +#include "wp_sml_cty_pixmap.h" +#include "wp_med_cty_pixmap.h" +#include "wp_lrg_cty_pixmap.h" +#include "wp_cap_cty_pixmap.h" +#include "wp_bell_pixmap.h" +#include "wp_diamond_grn_pixmap.h" +#include "wp_diamond_red_pixmap.h" +#include "wp_dive1_pixmap.h" +#include "wp_dive2_pixmap.h" +#include "wp_fish_pixmap.h" +#include "wp_fuel_pixmap.h" +#include "wp_horn_pixmap.h" +#include "wp_knife_pixmap.h" +#include "wp_light_pixmap.h" +#include "wp_mug_pixmap.h" +#include "wp_skull_pixmap.h" +#include "wp_square_grn_pixmap.h" +#include "wp_square_red_pixmap.h" +#include "wp_wbuoy_pixmap.h" +#include "wp_wreck_pixmap.h" +#include "wp_null_pixmap.h" +#include "wp_mine_pixmap.h" +#include "wp_school_pixmap.h" +#include "wp_cemetery_pixmap.h" +#include "wp_church_pixmap.h" +#include "wp_military_pixmap.h" +#include "wp_mob_pixmap.h" +#include "wp_buoy_ambr_pixmap.h" +#include "wp_buoy_blck_pixmap.h" +#include "wp_buoy_blue_pixmap.h" +#include "wp_buoy_grn_pixmap.h" +#include "wp_buoy_grn_red_pixmap.h" +#include "wp_buoy_grn_wht_pixmap.h" +#include "wp_buoy_orng_pixmap.h" +#include "wp_buoy_red_pixmap.h" +#include "wp_buoy_red_grn_pixmap.h" +#include "wp_buoy_red_wht_pixmap.h" +#include "wp_buoy_violet_pixmap.h" +#include "wp_buoy_wht_pixmap.h" +#include "wp_buoy_wht_grn_pixmap.h" +#include "wp_buoy_wht_red_pixmap.h" +#include "wp_dot_pixmap.h" +#include "wp_rbcn_pixmap.h" +#include "wp_boat_ramp_pixmap.h" +#include "wp_restroom_pixmap.h" +#include "wp_shower_pixmap.h" +#include "wp_drinking_wtr_pixmap.h" +#include "wp_phone_pixmap.h" +#include "wp_1st_aid_pixmap.h" +#include "wp_info_pixmap.h" +#include "wp_park_pixmap.h" +#include "wp_picnic_pixmap.h" +#include "wp_scenic_pixmap.h" +#include "wp_skiing_pixmap.h" +#include "wp_swimming_pixmap.h" +#include "wp_dam_pixmap.h" +#include "wp_controlled_pixmap.h" +#include "wp_danger_pixmap.h" +#include "wp_restricted_pixmap.h" +#include "wp_ball_pixmap.h" +#include "wp_rv_park_pixmap.h" +#include "wp_bridge_pixmap.h" +#include "wp_building_pixmap.h" +#include "wp_tunnel_pixmap.h" +#include "wp_beach_pixmap.h" +#include "wp_airplane_pixmap.h" +#include "wp_ice_skating_pixmap.h" +#include "wp_1st_aid_large_pixmap.h" +#include "wp_airplane_large_pixmap.h" +#include "wp_amuse_pk_large_pixmap.h" +#include "wp_anchor_large_pixmap.h" +#include "wp_animal_tracks_large_pixmap.h" +#include "wp_atv_large_pixmap.h" +#include "wp_ball_large_pixmap.h" +#include "wp_beach_large_pixmap.h" +#include "wp_bell_large_pixmap.h" +#include "wp_big_game_large_pixmap.h" +#include "wp_bike_trail_large_pixmap.h" +#include "wp_blind_large_pixmap.h" +#include "wp_blood_trail_large_pixmap.h" +#include "wp_block_blue_large_pixmap.h" +#include "wp_block_green_large_pixmap.h" +#include "wp_block_red_large_pixmap.h" +#include "wp_boat_ramp_large_pixmap.h" +#include "wp_bowling_large_pixmap.h" +#include "wp_bridge_large_pixmap.h" +#include "wp_building_large_pixmap.h" +#include "wp_buoy_ambr_large_pixmap.h" +#include "wp_buoy_blck_large_pixmap.h" +#include "wp_buoy_blue_large_pixmap.h" +#include "wp_buoy_grn_large_pixmap.h" +#include "wp_buoy_grn_red_large_pixmap.h" +#include "wp_buoy_grn_wht_large_pixmap.h" +#include "wp_buoy_orng_large_pixmap.h" +#include "wp_buoy_red_grn_large_pixmap.h" +#include "wp_buoy_red_large_pixmap.h" +#include "wp_buoy_red_wht_large_pixmap.h" +#include "wp_buoy_violet_large_pixmap.h" +#include "wp_buoy_wht_grn_large_pixmap.h" +#include "wp_buoy_wht_large_pixmap.h" +#include "wp_buoy_wht_red_large_pixmap.h" +#include "wp_camp_large_pixmap.h" +#include "wp_car_large_pixmap.h" +#include "wp_car_rental_large_pixmap.h" +#include "wp_car_repair_large_pixmap.h" +#include "wp_cemetery_large_pixmap.h" +#include "wp_church_large_pixmap.h" +#include "wp_civil_large_pixmap.h" +#include "wp_controlled_large_pixmap.h" +#include "wp_conv_store_large_pixmap.h" +#include "wp_cover_large_pixmap.h" +#include "wp_covey_large_pixmap.h" +#include "wp_crossing_large_pixmap.h" +#include "wp_dam_large_pixmap.h" +#include "wp_danger_large_pixmap.h" +#include "wp_deer_large_pixmap.h" +#include "wp_dive1_large_pixmap.h" +#include "wp_dive2_large_pixmap.h" +#include "wp_dollar_large_pixmap.h" +#include "wp_drinking_wtr_large_pixmap.h" +#include "wp_exit_large_pixmap.h" +#include "wp_fastfood_large_pixmap.h" +#include "wp_fhs_facility_large_pixmap.h" +#include "wp_fish_large_pixmap.h" +#include "wp_fitness_large_pixmap.h" +#include "wp_flag_blue_large_pixmap.h" +#include "wp_flag_green_large_pixmap.h" +#include "wp_flag_red_large_pixmap.h" +#include "wp_food_source_large_pixmap.h" +#include "wp_forest_large_pixmap.h" +#include "wp_fuel_large_pixmap.h" +#include "wp_furbearer_large_pixmap.h" +#include "wp_geocache_fnd_large_pixmap.h" +#include "wp_geocache_large_pixmap.h" +#include "wp_glider_large_pixmap.h" +#include "wp_golf_large_pixmap.h" +#include "wp_grnd_trans_large_pixmap.h" +#include "wp_helipad_large_pixmap.h" +#include "wp_horn_large_pixmap.h" +#include "wp_house_large_pixmap.h" +#include "wp_ice_skating_large_pixmap.h" +#include "wp_info_large_pixmap.h" +#include "wp_knife_large_pixmap.h" +#include "wp_light_large_pixmap.h" +#include "wp_lodging_large_pixmap.h" +#include "wp_lodge_large_pixmap.h" +#include "wp_lrg_cty_large_pixmap.h" +#include "wp_med_cty_large_pixmap.h" +#include "wp_mine_large_pixmap.h" +#include "wp_mob_large_pixmap.h" +#include "wp_movie_large_pixmap.h" +#include "wp_mug_large_pixmap.h" +#include "wp_museum_large_pixmap.h" +#include "wp_oil_field_large_pixmap.h" +#include "wp_parachute_large_pixmap.h" +#include "wp_parking_large_pixmap.h" +#include "wp_park_large_pixmap.h" +#include "wp_pharmacy_large_pixmap.h" +#include "wp_phone_large_pixmap.h" +#include "wp_picnic_large_pixmap.h" +#include "wp_pin_blue_large_pixmap.h" +#include "wp_pin_green_large_pixmap.h" +#include "wp_pin_red_large_pixmap.h" +#include "wp_pizza_large_pixmap.h" +#include "wp_police_large_pixmap.h" +#include "wp_post_ofc_large_pixmap.h" +#include "wp_rbcn_large_pixmap.h" +#include "wp_restricted_large_pixmap.h" +#include "wp_restroom_large_pixmap.h" +#include "wp_rv_park_large_pixmap.h" +#include "wp_scenic_large_pixmap.h" +#include "wp_school_large_pixmap.h" +#include "wp_shopping_large_pixmap.h" +#include "wp_short_tower_large_pixmap.h" +#include "wp_shower_large_pixmap.h" +#include "wp_skiing_large_pixmap.h" +#include "wp_ski_resort_large_pixmap.h" +#include "wp_skull_large_pixmap.h" +#include "wp_small_game_large_pixmap.h" +#include "wp_sml_cty_large_pixmap.h" +#include "wp_stadium_large_pixmap.h" +#include "wp_store_large_pixmap.h" +#include "wp_summit_large_pixmap.h" +#include "wp_swimming_large_pixmap.h" +#include "wp_tall_tower_large_pixmap.h" +#include "wp_theater_large_pixmap.h" +#include "wp_toll_booth_large_pixmap.h" +#include "wp_trail_head_large_pixmap.h" +#include "wp_tree_stand_large_pixmap.h" +#include "wp_treed_quarry_large_pixmap.h" +#include "wp_truck_large_pixmap.h" +#include "wp_truck_stop_large_pixmap.h" +#include "wp_tunnel_large_pixmap.h" +#include "wp_upland_game_large_pixmap.h" +#include "wp_ultralight_large_pixmap.h" +#include "wp_water_source_large_pixmap.h" +#include "wp_waterfowl_large_pixmap.h" +#include "wp_wbuoy_large_pixmap.h" +#include "wp_weigh_station_large_pixmap.h" +#include "wp_wrecker_large_pixmap.h" +#include "wp_wreck_large_pixmap.h" +#include "wp_zoo_large_pixmap.h" +#include "cursor_addtr_pixmap.h" +#include "cursor_new_route_pixmap.h" +#include "cursor_edtr_pixmap.h" +#include "cursor_geozoom_pixmap.h" +#include "cursor_ruler_pixmap.h" +#include "cursor_addwp_pixmap.h" +#include "cursor_edwp_pixmap.h" +#include "cursor_route_finder_pixmap.h" +#include "cursor_splitter_pixmap.h" +#include "cursor_showpic_pixmap.h" +#include "cursor_demdl_pixmap.h" +#include "cursor_geomove_pixmap.h" +#include "cursor_mapdl_pixmap.h" +#include "cursor_zoom_pixmap.h" diff --git a/src/icons/icons.h b/src/icons/icons.h new file mode 100644 index 0000000..1fcb8d3 --- /dev/null +++ b/src/icons/icons.h @@ -0,0 +1,260 @@ +/* Generated file */ +extern const GdkPixdata viking_pixbuf; +extern const GdkPixdata bing_maps_pixbuf; +extern const GdkPixdata addtr_18_pixbuf; +extern const GdkPixdata vik_new_route_18_pixbuf; +extern const GdkPixdata addwp_18_pixbuf; +extern const GdkPixdata edtr_18_pixbuf; +extern const GdkPixdata edwp_18_pixbuf; +extern const GdkPixdata geomove_18_pixbuf; +extern const GdkPixdata geozoom_18_pixbuf; +extern const GdkPixdata mapdl_18_pixbuf; +extern const GdkPixdata demdl_18_pixbuf; +extern const GdkPixdata mover_22_pixbuf; +extern const GdkPixdata ruler_18_pixbuf; +extern const GdkPixdata showpic_18_pixbuf; +extern const GdkPixdata zoom_18_pixbuf; +extern const GdkPixdata route_finder_18_pixbuf; +extern const GdkPixdata splitter_18_pixbuf; +extern const GdkPixdata select_18_pixbuf; +extern const GdkPixdata thumbnails_pixbuf; +extern const GdkPixdata vikaggregatelayer_pixbuf; +extern const GdkPixdata vikcoordlayer_pixbuf; +extern const GdkPixdata vikdemlayer_pixbuf; +extern const GdkPixdata vikgeoreflayer_pixbuf; +extern const GdkPixdata vikgpslayer_pixbuf; +extern const GdkPixdata vikmapslayer_pixbuf; +extern const GdkPixdata vikmapniklayer_pixbuf; +extern const GdkPixdata viktrwlayer_pixbuf; +extern const GdkPixdata viktrwlayer_external_pixbuf; +extern const GdkPixdata viktrwlayer_external_nowrite_pixbuf; +extern const GdkPixdata wp_camp_pixbuf; +extern const GdkPixdata wp_car_pixbuf; +extern const GdkPixdata wp_deer_pixbuf; +extern const GdkPixdata wp_flag_pixbuf; +extern const GdkPixdata wp_geocache_pixbuf; +extern const GdkPixdata wp_geocache_fnd_pixbuf; +extern const GdkPixdata wp_house_pixbuf; +extern const GdkPixdata wp_wpt_dot_pixbuf; +extern const GdkPixdata wp_dollar_pixbuf; +extern const GdkPixdata wp_golf_pixbuf; +extern const GdkPixdata wp_summit_pixbuf; +extern const GdkPixdata wp_anchor_pixbuf; +extern const GdkPixdata wp_forest_pixbuf; +extern const GdkPixdata wp_parking_pixbuf; +extern const GdkPixdata wp_sml_cty_pixbuf; +extern const GdkPixdata wp_med_cty_pixbuf; +extern const GdkPixdata wp_lrg_cty_pixbuf; +extern const GdkPixdata wp_cap_cty_pixbuf; +extern const GdkPixdata wp_bell_pixbuf; +extern const GdkPixdata wp_diamond_grn_pixbuf; +extern const GdkPixdata wp_diamond_red_pixbuf; +extern const GdkPixdata wp_dive1_pixbuf; +extern const GdkPixdata wp_dive2_pixbuf; +extern const GdkPixdata wp_fish_pixbuf; +extern const GdkPixdata wp_fuel_pixbuf; +extern const GdkPixdata wp_horn_pixbuf; +extern const GdkPixdata wp_knife_pixbuf; +extern const GdkPixdata wp_light_pixbuf; +extern const GdkPixdata wp_mug_pixbuf; +extern const GdkPixdata wp_skull_pixbuf; +extern const GdkPixdata wp_square_grn_pixbuf; +extern const GdkPixdata wp_square_red_pixbuf; +extern const GdkPixdata wp_wbuoy_pixbuf; +extern const GdkPixdata wp_wreck_pixbuf; +extern const GdkPixdata wp_null_pixbuf; +extern const GdkPixdata wp_mine_pixbuf; +extern const GdkPixdata wp_school_pixbuf; +extern const GdkPixdata wp_cemetery_pixbuf; +extern const GdkPixdata wp_church_pixbuf; +extern const GdkPixdata wp_military_pixbuf; +extern const GdkPixdata wp_mob_pixbuf; +extern const GdkPixdata wp_buoy_ambr_pixbuf; +extern const GdkPixdata wp_buoy_blck_pixbuf; +extern const GdkPixdata wp_buoy_blue_pixbuf; +extern const GdkPixdata wp_buoy_grn_pixbuf; +extern const GdkPixdata wp_buoy_grn_red_pixbuf; +extern const GdkPixdata wp_buoy_grn_wht_pixbuf; +extern const GdkPixdata wp_buoy_orng_pixbuf; +extern const GdkPixdata wp_buoy_red_pixbuf; +extern const GdkPixdata wp_buoy_red_grn_pixbuf; +extern const GdkPixdata wp_buoy_red_wht_pixbuf; +extern const GdkPixdata wp_buoy_violet_pixbuf; +extern const GdkPixdata wp_buoy_wht_pixbuf; +extern const GdkPixdata wp_buoy_wht_grn_pixbuf; +extern const GdkPixdata wp_buoy_wht_red_pixbuf; +extern const GdkPixdata wp_dot_pixbuf; +extern const GdkPixdata wp_rbcn_pixbuf; +extern const GdkPixdata wp_boat_ramp_pixbuf; +extern const GdkPixdata wp_restroom_pixbuf; +extern const GdkPixdata wp_shower_pixbuf; +extern const GdkPixdata wp_drinking_wtr_pixbuf; +extern const GdkPixdata wp_phone_pixbuf; +extern const GdkPixdata wp_1st_aid_pixbuf; +extern const GdkPixdata wp_info_pixbuf; +extern const GdkPixdata wp_park_pixbuf; +extern const GdkPixdata wp_picnic_pixbuf; +extern const GdkPixdata wp_scenic_pixbuf; +extern const GdkPixdata wp_skiing_pixbuf; +extern const GdkPixdata wp_swimming_pixbuf; +extern const GdkPixdata wp_dam_pixbuf; +extern const GdkPixdata wp_controlled_pixbuf; +extern const GdkPixdata wp_danger_pixbuf; +extern const GdkPixdata wp_restricted_pixbuf; +extern const GdkPixdata wp_ball_pixbuf; +extern const GdkPixdata wp_rv_park_pixbuf; +extern const GdkPixdata wp_bridge_pixbuf; +extern const GdkPixdata wp_building_pixbuf; +extern const GdkPixdata wp_tunnel_pixbuf; +extern const GdkPixdata wp_beach_pixbuf; +extern const GdkPixdata wp_airplane_pixbuf; +extern const GdkPixdata wp_ice_skating_pixbuf; +extern const GdkPixdata wp_1st_aid_large_pixbuf; +extern const GdkPixdata wp_airplane_large_pixbuf; +extern const GdkPixdata wp_amuse_pk_large_pixbuf; +extern const GdkPixdata wp_anchor_large_pixbuf; +extern const GdkPixdata wp_animal_tracks_large_pixbuf; +extern const GdkPixdata wp_atv_large_pixbuf; +extern const GdkPixdata wp_ball_large_pixbuf; +extern const GdkPixdata wp_beach_large_pixbuf; +extern const GdkPixdata wp_bell_large_pixbuf; +extern const GdkPixdata wp_big_game_large_pixbuf; +extern const GdkPixdata wp_bike_trail_large_pixbuf; +extern const GdkPixdata wp_blind_large_pixbuf; +extern const GdkPixdata wp_blood_trail_large_pixbuf; +extern const GdkPixdata wp_block_blue_large_pixbuf; +extern const GdkPixdata wp_block_green_large_pixbuf; +extern const GdkPixdata wp_block_red_large_pixbuf; +extern const GdkPixdata wp_boat_ramp_large_pixbuf; +extern const GdkPixdata wp_bowling_large_pixbuf; +extern const GdkPixdata wp_bridge_large_pixbuf; +extern const GdkPixdata wp_building_large_pixbuf; +extern const GdkPixdata wp_buoy_ambr_large_pixbuf; +extern const GdkPixdata wp_buoy_blck_large_pixbuf; +extern const GdkPixdata wp_buoy_blue_large_pixbuf; +extern const GdkPixdata wp_buoy_grn_large_pixbuf; +extern const GdkPixdata wp_buoy_grn_red_large_pixbuf; +extern const GdkPixdata wp_buoy_grn_wht_large_pixbuf; +extern const GdkPixdata wp_buoy_orng_large_pixbuf; +extern const GdkPixdata wp_buoy_red_grn_large_pixbuf; +extern const GdkPixdata wp_buoy_red_large_pixbuf; +extern const GdkPixdata wp_buoy_red_wht_large_pixbuf; +extern const GdkPixdata wp_buoy_violet_large_pixbuf; +extern const GdkPixdata wp_buoy_wht_grn_large_pixbuf; +extern const GdkPixdata wp_buoy_wht_large_pixbuf; +extern const GdkPixdata wp_buoy_wht_red_large_pixbuf; +extern const GdkPixdata wp_camp_large_pixbuf; +extern const GdkPixdata wp_car_large_pixbuf; +extern const GdkPixdata wp_car_rental_large_pixbuf; +extern const GdkPixdata wp_car_repair_large_pixbuf; +extern const GdkPixdata wp_cemetery_large_pixbuf; +extern const GdkPixdata wp_church_large_pixbuf; +extern const GdkPixdata wp_civil_large_pixbuf; +extern const GdkPixdata wp_controlled_large_pixbuf; +extern const GdkPixdata wp_conv_store_large_pixbuf; +extern const GdkPixdata wp_cover_large_pixbuf; +extern const GdkPixdata wp_covey_large_pixbuf; +extern const GdkPixdata wp_crossing_large_pixbuf; +extern const GdkPixdata wp_dam_large_pixbuf; +extern const GdkPixdata wp_danger_large_pixbuf; +extern const GdkPixdata wp_deer_large_pixbuf; +extern const GdkPixdata wp_dive1_large_pixbuf; +extern const GdkPixdata wp_dive2_large_pixbuf; +extern const GdkPixdata wp_dollar_large_pixbuf; +extern const GdkPixdata wp_drinking_wtr_large_pixbuf; +extern const GdkPixdata wp_exit_large_pixbuf; +extern const GdkPixdata wp_fastfood_large_pixbuf; +extern const GdkPixdata wp_fhs_facility_large_pixbuf; +extern const GdkPixdata wp_fish_large_pixbuf; +extern const GdkPixdata wp_fitness_large_pixbuf; +extern const GdkPixdata wp_flag_blue_large_pixbuf; +extern const GdkPixdata wp_flag_green_large_pixbuf; +extern const GdkPixdata wp_flag_red_large_pixbuf; +extern const GdkPixdata wp_food_source_large_pixbuf; +extern const GdkPixdata wp_forest_large_pixbuf; +extern const GdkPixdata wp_fuel_large_pixbuf; +extern const GdkPixdata wp_furbearer_large_pixbuf; +extern const GdkPixdata wp_geocache_fnd_large_pixbuf; +extern const GdkPixdata wp_geocache_large_pixbuf; +extern const GdkPixdata wp_glider_large_pixbuf; +extern const GdkPixdata wp_golf_large_pixbuf; +extern const GdkPixdata wp_grnd_trans_large_pixbuf; +extern const GdkPixdata wp_helipad_large_pixbuf; +extern const GdkPixdata wp_horn_large_pixbuf; +extern const GdkPixdata wp_house_large_pixbuf; +extern const GdkPixdata wp_ice_skating_large_pixbuf; +extern const GdkPixdata wp_info_large_pixbuf; +extern const GdkPixdata wp_knife_large_pixbuf; +extern const GdkPixdata wp_light_large_pixbuf; +extern const GdkPixdata wp_lodging_large_pixbuf; +extern const GdkPixdata wp_lodge_large_pixbuf; +extern const GdkPixdata wp_lrg_cty_large_pixbuf; +extern const GdkPixdata wp_med_cty_large_pixbuf; +extern const GdkPixdata wp_mine_large_pixbuf; +extern const GdkPixdata wp_mob_large_pixbuf; +extern const GdkPixdata wp_movie_large_pixbuf; +extern const GdkPixdata wp_mug_large_pixbuf; +extern const GdkPixdata wp_museum_large_pixbuf; +extern const GdkPixdata wp_oil_field_large_pixbuf; +extern const GdkPixdata wp_parachute_large_pixbuf; +extern const GdkPixdata wp_parking_large_pixbuf; +extern const GdkPixdata wp_park_large_pixbuf; +extern const GdkPixdata wp_pharmacy_large_pixbuf; +extern const GdkPixdata wp_phone_large_pixbuf; +extern const GdkPixdata wp_picnic_large_pixbuf; +extern const GdkPixdata wp_pin_blue_large_pixbuf; +extern const GdkPixdata wp_pin_green_large_pixbuf; +extern const GdkPixdata wp_pin_red_large_pixbuf; +extern const GdkPixdata wp_pizza_large_pixbuf; +extern const GdkPixdata wp_police_large_pixbuf; +extern const GdkPixdata wp_post_ofc_large_pixbuf; +extern const GdkPixdata wp_rbcn_large_pixbuf; +extern const GdkPixdata wp_restricted_large_pixbuf; +extern const GdkPixdata wp_restroom_large_pixbuf; +extern const GdkPixdata wp_rv_park_large_pixbuf; +extern const GdkPixdata wp_scenic_large_pixbuf; +extern const GdkPixdata wp_school_large_pixbuf; +extern const GdkPixdata wp_shopping_large_pixbuf; +extern const GdkPixdata wp_short_tower_large_pixbuf; +extern const GdkPixdata wp_shower_large_pixbuf; +extern const GdkPixdata wp_skiing_large_pixbuf; +extern const GdkPixdata wp_ski_resort_large_pixbuf; +extern const GdkPixdata wp_skull_large_pixbuf; +extern const GdkPixdata wp_small_game_large_pixbuf; +extern const GdkPixdata wp_sml_cty_large_pixbuf; +extern const GdkPixdata wp_stadium_large_pixbuf; +extern const GdkPixdata wp_store_large_pixbuf; +extern const GdkPixdata wp_summit_large_pixbuf; +extern const GdkPixdata wp_swimming_large_pixbuf; +extern const GdkPixdata wp_tall_tower_large_pixbuf; +extern const GdkPixdata wp_theater_large_pixbuf; +extern const GdkPixdata wp_toll_booth_large_pixbuf; +extern const GdkPixdata wp_trail_head_large_pixbuf; +extern const GdkPixdata wp_tree_stand_large_pixbuf; +extern const GdkPixdata wp_treed_quarry_large_pixbuf; +extern const GdkPixdata wp_truck_large_pixbuf; +extern const GdkPixdata wp_truck_stop_large_pixbuf; +extern const GdkPixdata wp_tunnel_large_pixbuf; +extern const GdkPixdata wp_upland_game_large_pixbuf; +extern const GdkPixdata wp_ultralight_large_pixbuf; +extern const GdkPixdata wp_water_source_large_pixbuf; +extern const GdkPixdata wp_waterfowl_large_pixbuf; +extern const GdkPixdata wp_wbuoy_large_pixbuf; +extern const GdkPixdata wp_weigh_station_large_pixbuf; +extern const GdkPixdata wp_wrecker_large_pixbuf; +extern const GdkPixdata wp_wreck_large_pixbuf; +extern const GdkPixdata wp_zoo_large_pixbuf; +extern const GdkPixdata cursor_addtr_pixbuf; +extern const GdkPixdata cursor_new_route_pixbuf; +extern const GdkPixdata cursor_edtr_pixbuf; +extern const GdkPixdata cursor_geozoom_pixbuf; +extern const GdkPixdata cursor_ruler_pixbuf; +extern const GdkPixdata cursor_addwp_pixbuf; +extern const GdkPixdata cursor_edwp_pixbuf; +extern const GdkPixdata cursor_route_finder_pixbuf; +extern const GdkPixdata cursor_splitter_pixbuf; +extern const GdkPixdata cursor_showpic_pixbuf; +extern const GdkPixdata cursor_demdl_pixbuf; +extern const GdkPixdata cursor_geomove_pixbuf; +extern const GdkPixdata cursor_mapdl_pixbuf; +extern const GdkPixdata cursor_zoom_pixbuf; diff --git a/src/icons/mapdl_18.png b/src/icons/mapdl_18.png new file mode 100644 index 0000000..b60dcf7 Binary files /dev/null and b/src/icons/mapdl_18.png differ diff --git a/src/icons/mover_22.png b/src/icons/mover_22.png new file mode 100644 index 0000000..b99d3e4 Binary files /dev/null and b/src/icons/mover_22.png differ diff --git a/src/icons/route_finder_18.png b/src/icons/route_finder_18.png new file mode 100644 index 0000000..15def87 Binary files /dev/null and b/src/icons/route_finder_18.png differ diff --git a/src/icons/ruler_18.png b/src/icons/ruler_18.png new file mode 100644 index 0000000..eb4c544 Binary files /dev/null and b/src/icons/ruler_18.png differ diff --git a/src/icons/select_18.png b/src/icons/select_18.png new file mode 100644 index 0000000..6a40830 Binary files /dev/null and b/src/icons/select_18.png differ diff --git a/src/icons/showpic_18.png b/src/icons/showpic_18.png new file mode 100644 index 0000000..b629a4a Binary files /dev/null and b/src/icons/showpic_18.png differ diff --git a/src/icons/splitter_18.png b/src/icons/splitter_18.png new file mode 100644 index 0000000..257648a Binary files /dev/null and b/src/icons/splitter_18.png differ diff --git a/src/icons/thumbnails.png b/src/icons/thumbnails.png new file mode 100644 index 0000000..13763dc Binary files /dev/null and b/src/icons/thumbnails.png differ diff --git a/src/icons/vik_new_route_18.png b/src/icons/vik_new_route_18.png new file mode 100644 index 0000000..cb2c6bc Binary files /dev/null and b/src/icons/vik_new_route_18.png differ diff --git a/src/icons/vikaggregatelayer.png b/src/icons/vikaggregatelayer.png new file mode 100644 index 0000000..356b3f2 Binary files /dev/null and b/src/icons/vikaggregatelayer.png differ diff --git a/src/icons/vikcoordlayer.png b/src/icons/vikcoordlayer.png new file mode 100644 index 0000000..0dad8cc Binary files /dev/null and b/src/icons/vikcoordlayer.png differ diff --git a/src/icons/vikdemlayer.png b/src/icons/vikdemlayer.png new file mode 100644 index 0000000..4d497b5 Binary files /dev/null and b/src/icons/vikdemlayer.png differ diff --git a/src/icons/vikgeoreflayer.png b/src/icons/vikgeoreflayer.png new file mode 100644 index 0000000..5f6d1e0 Binary files /dev/null and b/src/icons/vikgeoreflayer.png differ diff --git a/src/icons/vikgpslayer.png b/src/icons/vikgpslayer.png new file mode 100644 index 0000000..f068d3a Binary files /dev/null and b/src/icons/vikgpslayer.png differ diff --git a/src/icons/viking.png b/src/icons/viking.png new file mode 100644 index 0000000..1130523 Binary files /dev/null and b/src/icons/viking.png differ diff --git a/src/icons/vikmapniklayer.png b/src/icons/vikmapniklayer.png new file mode 100644 index 0000000..b3359d1 Binary files /dev/null and b/src/icons/vikmapniklayer.png differ diff --git a/src/icons/vikmapslayer.png b/src/icons/vikmapslayer.png new file mode 100644 index 0000000..90d31ed Binary files /dev/null and b/src/icons/vikmapslayer.png differ diff --git a/src/icons/viktrwlayer.png b/src/icons/viktrwlayer.png new file mode 100644 index 0000000..30e93e6 Binary files /dev/null and b/src/icons/viktrwlayer.png differ diff --git a/src/icons/viktrwlayer_external.png b/src/icons/viktrwlayer_external.png new file mode 100644 index 0000000..7d3b530 Binary files /dev/null and b/src/icons/viktrwlayer_external.png differ diff --git a/src/icons/viktrwlayer_external_nowrite.png b/src/icons/viktrwlayer_external_nowrite.png new file mode 100644 index 0000000..a889fd9 Binary files /dev/null and b/src/icons/viktrwlayer_external_nowrite.png differ diff --git a/src/icons/wp_1st_aid.png b/src/icons/wp_1st_aid.png new file mode 100644 index 0000000..f3c8446 Binary files /dev/null and b/src/icons/wp_1st_aid.png differ diff --git a/src/icons/wp_1st_aid_large.png b/src/icons/wp_1st_aid_large.png new file mode 100644 index 0000000..8297da6 Binary files /dev/null and b/src/icons/wp_1st_aid_large.png differ diff --git a/src/icons/wp_airplane.png b/src/icons/wp_airplane.png new file mode 100644 index 0000000..3ad0027 Binary files /dev/null and b/src/icons/wp_airplane.png differ diff --git a/src/icons/wp_airplane_large.png b/src/icons/wp_airplane_large.png new file mode 100644 index 0000000..9a82326 Binary files /dev/null and b/src/icons/wp_airplane_large.png differ diff --git a/src/icons/wp_amuse_pk_large.png b/src/icons/wp_amuse_pk_large.png new file mode 100644 index 0000000..5f8711a Binary files /dev/null and b/src/icons/wp_amuse_pk_large.png differ diff --git a/src/icons/wp_anchor.png b/src/icons/wp_anchor.png new file mode 100644 index 0000000..a662646 Binary files /dev/null and b/src/icons/wp_anchor.png differ diff --git a/src/icons/wp_anchor_large.png b/src/icons/wp_anchor_large.png new file mode 100644 index 0000000..0a153fd Binary files /dev/null and b/src/icons/wp_anchor_large.png differ diff --git a/src/icons/wp_animal_tracks_large.png b/src/icons/wp_animal_tracks_large.png new file mode 100644 index 0000000..a78969a Binary files /dev/null and b/src/icons/wp_animal_tracks_large.png differ diff --git a/src/icons/wp_atv_large.png b/src/icons/wp_atv_large.png new file mode 100644 index 0000000..e58ae53 Binary files /dev/null and b/src/icons/wp_atv_large.png differ diff --git a/src/icons/wp_ball.png b/src/icons/wp_ball.png new file mode 100644 index 0000000..f276196 Binary files /dev/null and b/src/icons/wp_ball.png differ diff --git a/src/icons/wp_ball_large.png b/src/icons/wp_ball_large.png new file mode 100644 index 0000000..821439d Binary files /dev/null and b/src/icons/wp_ball_large.png differ diff --git a/src/icons/wp_beach.png b/src/icons/wp_beach.png new file mode 100644 index 0000000..d2ecb30 Binary files /dev/null and b/src/icons/wp_beach.png differ diff --git a/src/icons/wp_beach_large.png b/src/icons/wp_beach_large.png new file mode 100644 index 0000000..87747e1 Binary files /dev/null and b/src/icons/wp_beach_large.png differ diff --git a/src/icons/wp_bell.png b/src/icons/wp_bell.png new file mode 100644 index 0000000..e81488d Binary files /dev/null and b/src/icons/wp_bell.png differ diff --git a/src/icons/wp_bell_large.png b/src/icons/wp_bell_large.png new file mode 100644 index 0000000..11bd076 Binary files /dev/null and b/src/icons/wp_bell_large.png differ diff --git a/src/icons/wp_big_game_large.png b/src/icons/wp_big_game_large.png new file mode 100644 index 0000000..6876661 Binary files /dev/null and b/src/icons/wp_big_game_large.png differ diff --git a/src/icons/wp_bike_trail_large.png b/src/icons/wp_bike_trail_large.png new file mode 100644 index 0000000..bb026d2 Binary files /dev/null and b/src/icons/wp_bike_trail_large.png differ diff --git a/src/icons/wp_blind_large.png b/src/icons/wp_blind_large.png new file mode 100644 index 0000000..ede2858 Binary files /dev/null and b/src/icons/wp_blind_large.png differ diff --git a/src/icons/wp_block_blue_large.png b/src/icons/wp_block_blue_large.png new file mode 100644 index 0000000..b19ff55 Binary files /dev/null and b/src/icons/wp_block_blue_large.png differ diff --git a/src/icons/wp_block_green_large.png b/src/icons/wp_block_green_large.png new file mode 100644 index 0000000..cc276ad Binary files /dev/null and b/src/icons/wp_block_green_large.png differ diff --git a/src/icons/wp_block_red_large.png b/src/icons/wp_block_red_large.png new file mode 100644 index 0000000..6b6c1f3 Binary files /dev/null and b/src/icons/wp_block_red_large.png differ diff --git a/src/icons/wp_blood_trail_large.png b/src/icons/wp_blood_trail_large.png new file mode 100644 index 0000000..9d3ed6a Binary files /dev/null and b/src/icons/wp_blood_trail_large.png differ diff --git a/src/icons/wp_boat_ramp.png b/src/icons/wp_boat_ramp.png new file mode 100644 index 0000000..5160cb4 Binary files /dev/null and b/src/icons/wp_boat_ramp.png differ diff --git a/src/icons/wp_boat_ramp_large.png b/src/icons/wp_boat_ramp_large.png new file mode 100644 index 0000000..d3a07d2 Binary files /dev/null and b/src/icons/wp_boat_ramp_large.png differ diff --git a/src/icons/wp_bowling_large.png b/src/icons/wp_bowling_large.png new file mode 100644 index 0000000..53cd484 Binary files /dev/null and b/src/icons/wp_bowling_large.png differ diff --git a/src/icons/wp_bridge.png b/src/icons/wp_bridge.png new file mode 100644 index 0000000..2468620 Binary files /dev/null and b/src/icons/wp_bridge.png differ diff --git a/src/icons/wp_bridge_large.png b/src/icons/wp_bridge_large.png new file mode 100644 index 0000000..61f4cee Binary files /dev/null and b/src/icons/wp_bridge_large.png differ diff --git a/src/icons/wp_building.png b/src/icons/wp_building.png new file mode 100644 index 0000000..47b3647 Binary files /dev/null and b/src/icons/wp_building.png differ diff --git a/src/icons/wp_building_large.png b/src/icons/wp_building_large.png new file mode 100644 index 0000000..f5ae15b Binary files /dev/null and b/src/icons/wp_building_large.png differ diff --git a/src/icons/wp_buoy_ambr.png b/src/icons/wp_buoy_ambr.png new file mode 100644 index 0000000..c5f5cd3 Binary files /dev/null and b/src/icons/wp_buoy_ambr.png differ diff --git a/src/icons/wp_buoy_ambr_large.png b/src/icons/wp_buoy_ambr_large.png new file mode 100644 index 0000000..b790c3f Binary files /dev/null and b/src/icons/wp_buoy_ambr_large.png differ diff --git a/src/icons/wp_buoy_blck.png b/src/icons/wp_buoy_blck.png new file mode 100644 index 0000000..874c47e Binary files /dev/null and b/src/icons/wp_buoy_blck.png differ diff --git a/src/icons/wp_buoy_blck_large.png b/src/icons/wp_buoy_blck_large.png new file mode 100644 index 0000000..52b8b02 Binary files /dev/null and b/src/icons/wp_buoy_blck_large.png differ diff --git a/src/icons/wp_buoy_blue.png b/src/icons/wp_buoy_blue.png new file mode 100644 index 0000000..4a6691a Binary files /dev/null and b/src/icons/wp_buoy_blue.png differ diff --git a/src/icons/wp_buoy_blue_large.png b/src/icons/wp_buoy_blue_large.png new file mode 100644 index 0000000..d9f2ff8 Binary files /dev/null and b/src/icons/wp_buoy_blue_large.png differ diff --git a/src/icons/wp_buoy_grn.png b/src/icons/wp_buoy_grn.png new file mode 100644 index 0000000..1138200 Binary files /dev/null and b/src/icons/wp_buoy_grn.png differ diff --git a/src/icons/wp_buoy_grn_large.png b/src/icons/wp_buoy_grn_large.png new file mode 100644 index 0000000..66cabe2 Binary files /dev/null and b/src/icons/wp_buoy_grn_large.png differ diff --git a/src/icons/wp_buoy_grn_red.png b/src/icons/wp_buoy_grn_red.png new file mode 100644 index 0000000..2a9187c Binary files /dev/null and b/src/icons/wp_buoy_grn_red.png differ diff --git a/src/icons/wp_buoy_grn_red_large.png b/src/icons/wp_buoy_grn_red_large.png new file mode 100644 index 0000000..6ce5efb Binary files /dev/null and b/src/icons/wp_buoy_grn_red_large.png differ diff --git a/src/icons/wp_buoy_grn_wht.png b/src/icons/wp_buoy_grn_wht.png new file mode 100644 index 0000000..c9185e4 Binary files /dev/null and b/src/icons/wp_buoy_grn_wht.png differ diff --git a/src/icons/wp_buoy_grn_wht_large.png b/src/icons/wp_buoy_grn_wht_large.png new file mode 100644 index 0000000..c3f469d Binary files /dev/null and b/src/icons/wp_buoy_grn_wht_large.png differ diff --git a/src/icons/wp_buoy_orng.png b/src/icons/wp_buoy_orng.png new file mode 100644 index 0000000..065383d Binary files /dev/null and b/src/icons/wp_buoy_orng.png differ diff --git a/src/icons/wp_buoy_orng_large.png b/src/icons/wp_buoy_orng_large.png new file mode 100644 index 0000000..b7f875e Binary files /dev/null and b/src/icons/wp_buoy_orng_large.png differ diff --git a/src/icons/wp_buoy_red.png b/src/icons/wp_buoy_red.png new file mode 100644 index 0000000..f06fd04 Binary files /dev/null and b/src/icons/wp_buoy_red.png differ diff --git a/src/icons/wp_buoy_red_grn.png b/src/icons/wp_buoy_red_grn.png new file mode 100644 index 0000000..422933b Binary files /dev/null and b/src/icons/wp_buoy_red_grn.png differ diff --git a/src/icons/wp_buoy_red_grn_large.png b/src/icons/wp_buoy_red_grn_large.png new file mode 100644 index 0000000..442c42b Binary files /dev/null and b/src/icons/wp_buoy_red_grn_large.png differ diff --git a/src/icons/wp_buoy_red_large.png b/src/icons/wp_buoy_red_large.png new file mode 100644 index 0000000..0875d59 Binary files /dev/null and b/src/icons/wp_buoy_red_large.png differ diff --git a/src/icons/wp_buoy_red_wht.png b/src/icons/wp_buoy_red_wht.png new file mode 100644 index 0000000..32b9fb7 Binary files /dev/null and b/src/icons/wp_buoy_red_wht.png differ diff --git a/src/icons/wp_buoy_red_wht_large.png b/src/icons/wp_buoy_red_wht_large.png new file mode 100644 index 0000000..232efcf Binary files /dev/null and b/src/icons/wp_buoy_red_wht_large.png differ diff --git a/src/icons/wp_buoy_violet.png b/src/icons/wp_buoy_violet.png new file mode 100644 index 0000000..88c9724 Binary files /dev/null and b/src/icons/wp_buoy_violet.png differ diff --git a/src/icons/wp_buoy_violet_large.png b/src/icons/wp_buoy_violet_large.png new file mode 100644 index 0000000..ff9c204 Binary files /dev/null and b/src/icons/wp_buoy_violet_large.png differ diff --git a/src/icons/wp_buoy_wht.png b/src/icons/wp_buoy_wht.png new file mode 100644 index 0000000..653432f Binary files /dev/null and b/src/icons/wp_buoy_wht.png differ diff --git a/src/icons/wp_buoy_wht_grn.png b/src/icons/wp_buoy_wht_grn.png new file mode 100644 index 0000000..857c4fb Binary files /dev/null and b/src/icons/wp_buoy_wht_grn.png differ diff --git a/src/icons/wp_buoy_wht_grn_large.png b/src/icons/wp_buoy_wht_grn_large.png new file mode 100644 index 0000000..ccfdb8c Binary files /dev/null and b/src/icons/wp_buoy_wht_grn_large.png differ diff --git a/src/icons/wp_buoy_wht_large.png b/src/icons/wp_buoy_wht_large.png new file mode 100644 index 0000000..7d24971 Binary files /dev/null and b/src/icons/wp_buoy_wht_large.png differ diff --git a/src/icons/wp_buoy_wht_red.png b/src/icons/wp_buoy_wht_red.png new file mode 100644 index 0000000..fe9c0ec Binary files /dev/null and b/src/icons/wp_buoy_wht_red.png differ diff --git a/src/icons/wp_buoy_wht_red_large.png b/src/icons/wp_buoy_wht_red_large.png new file mode 100644 index 0000000..cde331c Binary files /dev/null and b/src/icons/wp_buoy_wht_red_large.png differ diff --git a/src/icons/wp_camp.png b/src/icons/wp_camp.png new file mode 100644 index 0000000..05089ce Binary files /dev/null and b/src/icons/wp_camp.png differ diff --git a/src/icons/wp_camp_large.png b/src/icons/wp_camp_large.png new file mode 100644 index 0000000..3e2741e Binary files /dev/null and b/src/icons/wp_camp_large.png differ diff --git a/src/icons/wp_cap_cty.png b/src/icons/wp_cap_cty.png new file mode 100644 index 0000000..6d8327f Binary files /dev/null and b/src/icons/wp_cap_cty.png differ diff --git a/src/icons/wp_car.png b/src/icons/wp_car.png new file mode 100644 index 0000000..aa53bc8 Binary files /dev/null and b/src/icons/wp_car.png differ diff --git a/src/icons/wp_car_large.png b/src/icons/wp_car_large.png new file mode 100644 index 0000000..b6d4db3 Binary files /dev/null and b/src/icons/wp_car_large.png differ diff --git a/src/icons/wp_car_rental_large.png b/src/icons/wp_car_rental_large.png new file mode 100644 index 0000000..616e4ad Binary files /dev/null and b/src/icons/wp_car_rental_large.png differ diff --git a/src/icons/wp_car_repair_large.png b/src/icons/wp_car_repair_large.png new file mode 100644 index 0000000..3afe1de Binary files /dev/null and b/src/icons/wp_car_repair_large.png differ diff --git a/src/icons/wp_cemetery.png b/src/icons/wp_cemetery.png new file mode 100644 index 0000000..ad9babf Binary files /dev/null and b/src/icons/wp_cemetery.png differ diff --git a/src/icons/wp_cemetery_large.png b/src/icons/wp_cemetery_large.png new file mode 100644 index 0000000..c36ea06 Binary files /dev/null and b/src/icons/wp_cemetery_large.png differ diff --git a/src/icons/wp_church.png b/src/icons/wp_church.png new file mode 100644 index 0000000..4ebc57d Binary files /dev/null and b/src/icons/wp_church.png differ diff --git a/src/icons/wp_church_large.png b/src/icons/wp_church_large.png new file mode 100644 index 0000000..c099fbb Binary files /dev/null and b/src/icons/wp_church_large.png differ diff --git a/src/icons/wp_civil_large.png b/src/icons/wp_civil_large.png new file mode 100644 index 0000000..ebb3d66 Binary files /dev/null and b/src/icons/wp_civil_large.png differ diff --git a/src/icons/wp_controlled.png b/src/icons/wp_controlled.png new file mode 100644 index 0000000..240e924 Binary files /dev/null and b/src/icons/wp_controlled.png differ diff --git a/src/icons/wp_controlled_large.png b/src/icons/wp_controlled_large.png new file mode 100644 index 0000000..8ab83e2 Binary files /dev/null and b/src/icons/wp_controlled_large.png differ diff --git a/src/icons/wp_conv_store_large.png b/src/icons/wp_conv_store_large.png new file mode 100644 index 0000000..96622c5 Binary files /dev/null and b/src/icons/wp_conv_store_large.png differ diff --git a/src/icons/wp_cover_large.png b/src/icons/wp_cover_large.png new file mode 100644 index 0000000..5aeed51 Binary files /dev/null and b/src/icons/wp_cover_large.png differ diff --git a/src/icons/wp_covey_large.png b/src/icons/wp_covey_large.png new file mode 100644 index 0000000..28ffcd9 Binary files /dev/null and b/src/icons/wp_covey_large.png differ diff --git a/src/icons/wp_crossing_large.png b/src/icons/wp_crossing_large.png new file mode 100644 index 0000000..2b657be Binary files /dev/null and b/src/icons/wp_crossing_large.png differ diff --git a/src/icons/wp_dam.png b/src/icons/wp_dam.png new file mode 100644 index 0000000..c7ed4a1 Binary files /dev/null and b/src/icons/wp_dam.png differ diff --git a/src/icons/wp_dam_large.png b/src/icons/wp_dam_large.png new file mode 100644 index 0000000..7f85b89 Binary files /dev/null and b/src/icons/wp_dam_large.png differ diff --git a/src/icons/wp_danger.png b/src/icons/wp_danger.png new file mode 100644 index 0000000..46414af Binary files /dev/null and b/src/icons/wp_danger.png differ diff --git a/src/icons/wp_danger_large.png b/src/icons/wp_danger_large.png new file mode 100644 index 0000000..7fff673 Binary files /dev/null and b/src/icons/wp_danger_large.png differ diff --git a/src/icons/wp_deer.png b/src/icons/wp_deer.png new file mode 100644 index 0000000..540f4b4 Binary files /dev/null and b/src/icons/wp_deer.png differ diff --git a/src/icons/wp_deer_large.png b/src/icons/wp_deer_large.png new file mode 100644 index 0000000..59c1c13 Binary files /dev/null and b/src/icons/wp_deer_large.png differ diff --git a/src/icons/wp_diamond_grn.png b/src/icons/wp_diamond_grn.png new file mode 100644 index 0000000..3e4c09e Binary files /dev/null and b/src/icons/wp_diamond_grn.png differ diff --git a/src/icons/wp_diamond_red.png b/src/icons/wp_diamond_red.png new file mode 100644 index 0000000..f5105e9 Binary files /dev/null and b/src/icons/wp_diamond_red.png differ diff --git a/src/icons/wp_dive1.png b/src/icons/wp_dive1.png new file mode 100644 index 0000000..b9664af Binary files /dev/null and b/src/icons/wp_dive1.png differ diff --git a/src/icons/wp_dive1_large.png b/src/icons/wp_dive1_large.png new file mode 100644 index 0000000..55a431c Binary files /dev/null and b/src/icons/wp_dive1_large.png differ diff --git a/src/icons/wp_dive2.png b/src/icons/wp_dive2.png new file mode 100644 index 0000000..f585698 Binary files /dev/null and b/src/icons/wp_dive2.png differ diff --git a/src/icons/wp_dive2_large.png b/src/icons/wp_dive2_large.png new file mode 100644 index 0000000..002f8a9 Binary files /dev/null and b/src/icons/wp_dive2_large.png differ diff --git a/src/icons/wp_dollar.png b/src/icons/wp_dollar.png new file mode 100644 index 0000000..2ab7aaa Binary files /dev/null and b/src/icons/wp_dollar.png differ diff --git a/src/icons/wp_dollar_large.png b/src/icons/wp_dollar_large.png new file mode 100644 index 0000000..57485fc Binary files /dev/null and b/src/icons/wp_dollar_large.png differ diff --git a/src/icons/wp_dot.png b/src/icons/wp_dot.png new file mode 100644 index 0000000..968fda2 Binary files /dev/null and b/src/icons/wp_dot.png differ diff --git a/src/icons/wp_drinking_wtr.png b/src/icons/wp_drinking_wtr.png new file mode 100644 index 0000000..e7d9283 Binary files /dev/null and b/src/icons/wp_drinking_wtr.png differ diff --git a/src/icons/wp_drinking_wtr_large.png b/src/icons/wp_drinking_wtr_large.png new file mode 100644 index 0000000..0ce9529 Binary files /dev/null and b/src/icons/wp_drinking_wtr_large.png differ diff --git a/src/icons/wp_exit_large.png b/src/icons/wp_exit_large.png new file mode 100644 index 0000000..1ff9cbc Binary files /dev/null and b/src/icons/wp_exit_large.png differ diff --git a/src/icons/wp_fastfood_large.png b/src/icons/wp_fastfood_large.png new file mode 100644 index 0000000..21157cd Binary files /dev/null and b/src/icons/wp_fastfood_large.png differ diff --git a/src/icons/wp_fhs_facility_large.png b/src/icons/wp_fhs_facility_large.png new file mode 100644 index 0000000..65dc317 Binary files /dev/null and b/src/icons/wp_fhs_facility_large.png differ diff --git a/src/icons/wp_fish.png b/src/icons/wp_fish.png new file mode 100644 index 0000000..d13a1ab Binary files /dev/null and b/src/icons/wp_fish.png differ diff --git a/src/icons/wp_fish_large.png b/src/icons/wp_fish_large.png new file mode 100644 index 0000000..894164d Binary files /dev/null and b/src/icons/wp_fish_large.png differ diff --git a/src/icons/wp_fitness_large.png b/src/icons/wp_fitness_large.png new file mode 100644 index 0000000..67c3cbd Binary files /dev/null and b/src/icons/wp_fitness_large.png differ diff --git a/src/icons/wp_flag.png b/src/icons/wp_flag.png new file mode 100644 index 0000000..2edae7a Binary files /dev/null and b/src/icons/wp_flag.png differ diff --git a/src/icons/wp_flag_blue_large.png b/src/icons/wp_flag_blue_large.png new file mode 100644 index 0000000..d4fce69 Binary files /dev/null and b/src/icons/wp_flag_blue_large.png differ diff --git a/src/icons/wp_flag_green_large.png b/src/icons/wp_flag_green_large.png new file mode 100644 index 0000000..6a6b3e4 Binary files /dev/null and b/src/icons/wp_flag_green_large.png differ diff --git a/src/icons/wp_flag_red_large.png b/src/icons/wp_flag_red_large.png new file mode 100644 index 0000000..140d691 Binary files /dev/null and b/src/icons/wp_flag_red_large.png differ diff --git a/src/icons/wp_food_source_large.png b/src/icons/wp_food_source_large.png new file mode 100644 index 0000000..6080132 Binary files /dev/null and b/src/icons/wp_food_source_large.png differ diff --git a/src/icons/wp_forest.png b/src/icons/wp_forest.png new file mode 100644 index 0000000..c1e3fcb Binary files /dev/null and b/src/icons/wp_forest.png differ diff --git a/src/icons/wp_forest_large.png b/src/icons/wp_forest_large.png new file mode 100644 index 0000000..7abec98 Binary files /dev/null and b/src/icons/wp_forest_large.png differ diff --git a/src/icons/wp_fuel.png b/src/icons/wp_fuel.png new file mode 100644 index 0000000..794af66 Binary files /dev/null and b/src/icons/wp_fuel.png differ diff --git a/src/icons/wp_fuel_large.png b/src/icons/wp_fuel_large.png new file mode 100644 index 0000000..3597fab Binary files /dev/null and b/src/icons/wp_fuel_large.png differ diff --git a/src/icons/wp_furbearer_large.png b/src/icons/wp_furbearer_large.png new file mode 100644 index 0000000..7269886 Binary files /dev/null and b/src/icons/wp_furbearer_large.png differ diff --git a/src/icons/wp_geocache.png b/src/icons/wp_geocache.png new file mode 100644 index 0000000..1f20462 Binary files /dev/null and b/src/icons/wp_geocache.png differ diff --git a/src/icons/wp_geocache_fnd.png b/src/icons/wp_geocache_fnd.png new file mode 100644 index 0000000..6d73952 Binary files /dev/null and b/src/icons/wp_geocache_fnd.png differ diff --git a/src/icons/wp_geocache_fnd_large.png b/src/icons/wp_geocache_fnd_large.png new file mode 100644 index 0000000..05e76ca Binary files /dev/null and b/src/icons/wp_geocache_fnd_large.png differ diff --git a/src/icons/wp_geocache_large.png b/src/icons/wp_geocache_large.png new file mode 100644 index 0000000..6987804 Binary files /dev/null and b/src/icons/wp_geocache_large.png differ diff --git a/src/icons/wp_glider_large.png b/src/icons/wp_glider_large.png new file mode 100644 index 0000000..746bf22 Binary files /dev/null and b/src/icons/wp_glider_large.png differ diff --git a/src/icons/wp_golf.png b/src/icons/wp_golf.png new file mode 100644 index 0000000..e587cf4 Binary files /dev/null and b/src/icons/wp_golf.png differ diff --git a/src/icons/wp_golf_large.png b/src/icons/wp_golf_large.png new file mode 100644 index 0000000..29e4d61 Binary files /dev/null and b/src/icons/wp_golf_large.png differ diff --git a/src/icons/wp_grnd_trans_large.png b/src/icons/wp_grnd_trans_large.png new file mode 100644 index 0000000..aa8a0e6 Binary files /dev/null and b/src/icons/wp_grnd_trans_large.png differ diff --git a/src/icons/wp_helipad_large.png b/src/icons/wp_helipad_large.png new file mode 100644 index 0000000..1b47b2e Binary files /dev/null and b/src/icons/wp_helipad_large.png differ diff --git a/src/icons/wp_horn.png b/src/icons/wp_horn.png new file mode 100644 index 0000000..bc33b15 Binary files /dev/null and b/src/icons/wp_horn.png differ diff --git a/src/icons/wp_horn_large.png b/src/icons/wp_horn_large.png new file mode 100644 index 0000000..4d22532 Binary files /dev/null and b/src/icons/wp_horn_large.png differ diff --git a/src/icons/wp_house.png b/src/icons/wp_house.png new file mode 100644 index 0000000..d96beb2 Binary files /dev/null and b/src/icons/wp_house.png differ diff --git a/src/icons/wp_house_large.png b/src/icons/wp_house_large.png new file mode 100644 index 0000000..2c7187b Binary files /dev/null and b/src/icons/wp_house_large.png differ diff --git a/src/icons/wp_ice_skating.png b/src/icons/wp_ice_skating.png new file mode 100644 index 0000000..21b8c5b Binary files /dev/null and b/src/icons/wp_ice_skating.png differ diff --git a/src/icons/wp_ice_skating_large.png b/src/icons/wp_ice_skating_large.png new file mode 100644 index 0000000..a6ae318 Binary files /dev/null and b/src/icons/wp_ice_skating_large.png differ diff --git a/src/icons/wp_info.png b/src/icons/wp_info.png new file mode 100644 index 0000000..fc19b79 Binary files /dev/null and b/src/icons/wp_info.png differ diff --git a/src/icons/wp_info_large.png b/src/icons/wp_info_large.png new file mode 100644 index 0000000..1e6d3c1 Binary files /dev/null and b/src/icons/wp_info_large.png differ diff --git a/src/icons/wp_knife.png b/src/icons/wp_knife.png new file mode 100644 index 0000000..a5b69c5 Binary files /dev/null and b/src/icons/wp_knife.png differ diff --git a/src/icons/wp_knife_large.png b/src/icons/wp_knife_large.png new file mode 100644 index 0000000..562028d Binary files /dev/null and b/src/icons/wp_knife_large.png differ diff --git a/src/icons/wp_light.png b/src/icons/wp_light.png new file mode 100644 index 0000000..130e092 Binary files /dev/null and b/src/icons/wp_light.png differ diff --git a/src/icons/wp_light_large.png b/src/icons/wp_light_large.png new file mode 100644 index 0000000..2969dfd Binary files /dev/null and b/src/icons/wp_light_large.png differ diff --git a/src/icons/wp_lodge_large.png b/src/icons/wp_lodge_large.png new file mode 100644 index 0000000..59a108c Binary files /dev/null and b/src/icons/wp_lodge_large.png differ diff --git a/src/icons/wp_lodging_large.png b/src/icons/wp_lodging_large.png new file mode 100644 index 0000000..92eba4d Binary files /dev/null and b/src/icons/wp_lodging_large.png differ diff --git a/src/icons/wp_lrg_cty.png b/src/icons/wp_lrg_cty.png new file mode 100644 index 0000000..73851de Binary files /dev/null and b/src/icons/wp_lrg_cty.png differ diff --git a/src/icons/wp_lrg_cty_large.png b/src/icons/wp_lrg_cty_large.png new file mode 100644 index 0000000..3ba7e3b Binary files /dev/null and b/src/icons/wp_lrg_cty_large.png differ diff --git a/src/icons/wp_med_cty.png b/src/icons/wp_med_cty.png new file mode 100644 index 0000000..9926fd1 Binary files /dev/null and b/src/icons/wp_med_cty.png differ diff --git a/src/icons/wp_med_cty_large.png b/src/icons/wp_med_cty_large.png new file mode 100644 index 0000000..3766db8 Binary files /dev/null and b/src/icons/wp_med_cty_large.png differ diff --git a/src/icons/wp_military.png b/src/icons/wp_military.png new file mode 100644 index 0000000..29085fb Binary files /dev/null and b/src/icons/wp_military.png differ diff --git a/src/icons/wp_mine.png b/src/icons/wp_mine.png new file mode 100644 index 0000000..ba90777 Binary files /dev/null and b/src/icons/wp_mine.png differ diff --git a/src/icons/wp_mine_large.png b/src/icons/wp_mine_large.png new file mode 100644 index 0000000..bee2a0a Binary files /dev/null and b/src/icons/wp_mine_large.png differ diff --git a/src/icons/wp_mob.png b/src/icons/wp_mob.png new file mode 100644 index 0000000..5e99d9c Binary files /dev/null and b/src/icons/wp_mob.png differ diff --git a/src/icons/wp_mob_large.png b/src/icons/wp_mob_large.png new file mode 100644 index 0000000..4928444 Binary files /dev/null and b/src/icons/wp_mob_large.png differ diff --git a/src/icons/wp_movie_large.png b/src/icons/wp_movie_large.png new file mode 100644 index 0000000..158def3 Binary files /dev/null and b/src/icons/wp_movie_large.png differ diff --git a/src/icons/wp_mug.png b/src/icons/wp_mug.png new file mode 100644 index 0000000..680c1fc Binary files /dev/null and b/src/icons/wp_mug.png differ diff --git a/src/icons/wp_mug_large.png b/src/icons/wp_mug_large.png new file mode 100644 index 0000000..c3c0f39 Binary files /dev/null and b/src/icons/wp_mug_large.png differ diff --git a/src/icons/wp_museum_large.png b/src/icons/wp_museum_large.png new file mode 100644 index 0000000..9daccdd Binary files /dev/null and b/src/icons/wp_museum_large.png differ diff --git a/src/icons/wp_null.png b/src/icons/wp_null.png new file mode 100644 index 0000000..1db1ccd Binary files /dev/null and b/src/icons/wp_null.png differ diff --git a/src/icons/wp_oil_field_large.png b/src/icons/wp_oil_field_large.png new file mode 100644 index 0000000..074bc0c Binary files /dev/null and b/src/icons/wp_oil_field_large.png differ diff --git a/src/icons/wp_parachute_large.png b/src/icons/wp_parachute_large.png new file mode 100644 index 0000000..3b6249f Binary files /dev/null and b/src/icons/wp_parachute_large.png differ diff --git a/src/icons/wp_park.png b/src/icons/wp_park.png new file mode 100644 index 0000000..e54e60c Binary files /dev/null and b/src/icons/wp_park.png differ diff --git a/src/icons/wp_park_large.png b/src/icons/wp_park_large.png new file mode 100644 index 0000000..f8f86c2 Binary files /dev/null and b/src/icons/wp_park_large.png differ diff --git a/src/icons/wp_parking.png b/src/icons/wp_parking.png new file mode 100644 index 0000000..7bb667c Binary files /dev/null and b/src/icons/wp_parking.png differ diff --git a/src/icons/wp_parking_large.png b/src/icons/wp_parking_large.png new file mode 100644 index 0000000..612ecbe Binary files /dev/null and b/src/icons/wp_parking_large.png differ diff --git a/src/icons/wp_pharmacy_large.png b/src/icons/wp_pharmacy_large.png new file mode 100644 index 0000000..b583f1e Binary files /dev/null and b/src/icons/wp_pharmacy_large.png differ diff --git a/src/icons/wp_phone.png b/src/icons/wp_phone.png new file mode 100644 index 0000000..cf255b9 Binary files /dev/null and b/src/icons/wp_phone.png differ diff --git a/src/icons/wp_phone_large.png b/src/icons/wp_phone_large.png new file mode 100644 index 0000000..cbebe8a Binary files /dev/null and b/src/icons/wp_phone_large.png differ diff --git a/src/icons/wp_picnic.png b/src/icons/wp_picnic.png new file mode 100644 index 0000000..b348dfd Binary files /dev/null and b/src/icons/wp_picnic.png differ diff --git a/src/icons/wp_picnic_large.png b/src/icons/wp_picnic_large.png new file mode 100644 index 0000000..cc57df1 Binary files /dev/null and b/src/icons/wp_picnic_large.png differ diff --git a/src/icons/wp_pin_blue_large.png b/src/icons/wp_pin_blue_large.png new file mode 100644 index 0000000..90132f9 Binary files /dev/null and b/src/icons/wp_pin_blue_large.png differ diff --git a/src/icons/wp_pin_green_large.png b/src/icons/wp_pin_green_large.png new file mode 100644 index 0000000..3ad1d8a Binary files /dev/null and b/src/icons/wp_pin_green_large.png differ diff --git a/src/icons/wp_pin_red_large.png b/src/icons/wp_pin_red_large.png new file mode 100644 index 0000000..f1e709b Binary files /dev/null and b/src/icons/wp_pin_red_large.png differ diff --git a/src/icons/wp_pizza_large.png b/src/icons/wp_pizza_large.png new file mode 100644 index 0000000..b686205 Binary files /dev/null and b/src/icons/wp_pizza_large.png differ diff --git a/src/icons/wp_police_large.png b/src/icons/wp_police_large.png new file mode 100644 index 0000000..72d759c Binary files /dev/null and b/src/icons/wp_police_large.png differ diff --git a/src/icons/wp_post_ofc_large.png b/src/icons/wp_post_ofc_large.png new file mode 100644 index 0000000..f31dc6a Binary files /dev/null and b/src/icons/wp_post_ofc_large.png differ diff --git a/src/icons/wp_rbcn.png b/src/icons/wp_rbcn.png new file mode 100644 index 0000000..728fe4e Binary files /dev/null and b/src/icons/wp_rbcn.png differ diff --git a/src/icons/wp_rbcn_large.png b/src/icons/wp_rbcn_large.png new file mode 100644 index 0000000..e30331f Binary files /dev/null and b/src/icons/wp_rbcn_large.png differ diff --git a/src/icons/wp_restricted.png b/src/icons/wp_restricted.png new file mode 100644 index 0000000..2d50742 Binary files /dev/null and b/src/icons/wp_restricted.png differ diff --git a/src/icons/wp_restricted_large.png b/src/icons/wp_restricted_large.png new file mode 100644 index 0000000..f075902 Binary files /dev/null and b/src/icons/wp_restricted_large.png differ diff --git a/src/icons/wp_restroom.png b/src/icons/wp_restroom.png new file mode 100644 index 0000000..2402f20 Binary files /dev/null and b/src/icons/wp_restroom.png differ diff --git a/src/icons/wp_restroom_large.png b/src/icons/wp_restroom_large.png new file mode 100644 index 0000000..6b6ec97 Binary files /dev/null and b/src/icons/wp_restroom_large.png differ diff --git a/src/icons/wp_rv_park.png b/src/icons/wp_rv_park.png new file mode 100644 index 0000000..3aade67 Binary files /dev/null and b/src/icons/wp_rv_park.png differ diff --git a/src/icons/wp_rv_park_large.png b/src/icons/wp_rv_park_large.png new file mode 100644 index 0000000..503a9bc Binary files /dev/null and b/src/icons/wp_rv_park_large.png differ diff --git a/src/icons/wp_scenic.png b/src/icons/wp_scenic.png new file mode 100644 index 0000000..ca211cb Binary files /dev/null and b/src/icons/wp_scenic.png differ diff --git a/src/icons/wp_scenic_large.png b/src/icons/wp_scenic_large.png new file mode 100644 index 0000000..7e3ddf5 Binary files /dev/null and b/src/icons/wp_scenic_large.png differ diff --git a/src/icons/wp_school.png b/src/icons/wp_school.png new file mode 100644 index 0000000..edcf3b1 Binary files /dev/null and b/src/icons/wp_school.png differ diff --git a/src/icons/wp_school_large.png b/src/icons/wp_school_large.png new file mode 100644 index 0000000..e0afdbf Binary files /dev/null and b/src/icons/wp_school_large.png differ diff --git a/src/icons/wp_shopping_large.png b/src/icons/wp_shopping_large.png new file mode 100644 index 0000000..045d1fa Binary files /dev/null and b/src/icons/wp_shopping_large.png differ diff --git a/src/icons/wp_short_tower_large.png b/src/icons/wp_short_tower_large.png new file mode 100644 index 0000000..eae0316 Binary files /dev/null and b/src/icons/wp_short_tower_large.png differ diff --git a/src/icons/wp_shower.png b/src/icons/wp_shower.png new file mode 100644 index 0000000..f89b079 Binary files /dev/null and b/src/icons/wp_shower.png differ diff --git a/src/icons/wp_shower_large.png b/src/icons/wp_shower_large.png new file mode 100644 index 0000000..5631f30 Binary files /dev/null and b/src/icons/wp_shower_large.png differ diff --git a/src/icons/wp_ski_resort_large.png b/src/icons/wp_ski_resort_large.png new file mode 100644 index 0000000..06da17e Binary files /dev/null and b/src/icons/wp_ski_resort_large.png differ diff --git a/src/icons/wp_skiing.png b/src/icons/wp_skiing.png new file mode 100644 index 0000000..b3c9167 Binary files /dev/null and b/src/icons/wp_skiing.png differ diff --git a/src/icons/wp_skiing_large.png b/src/icons/wp_skiing_large.png new file mode 100644 index 0000000..1f6eb8d Binary files /dev/null and b/src/icons/wp_skiing_large.png differ diff --git a/src/icons/wp_skull.png b/src/icons/wp_skull.png new file mode 100644 index 0000000..7deb96a Binary files /dev/null and b/src/icons/wp_skull.png differ diff --git a/src/icons/wp_skull_large.png b/src/icons/wp_skull_large.png new file mode 100644 index 0000000..ce126e4 Binary files /dev/null and b/src/icons/wp_skull_large.png differ diff --git a/src/icons/wp_small_game_large.png b/src/icons/wp_small_game_large.png new file mode 100644 index 0000000..0726055 Binary files /dev/null and b/src/icons/wp_small_game_large.png differ diff --git a/src/icons/wp_sml_cty.png b/src/icons/wp_sml_cty.png new file mode 100644 index 0000000..eee13da Binary files /dev/null and b/src/icons/wp_sml_cty.png differ diff --git a/src/icons/wp_sml_cty_large.png b/src/icons/wp_sml_cty_large.png new file mode 100644 index 0000000..6f85702 Binary files /dev/null and b/src/icons/wp_sml_cty_large.png differ diff --git a/src/icons/wp_square_grn.png b/src/icons/wp_square_grn.png new file mode 100644 index 0000000..57da468 Binary files /dev/null and b/src/icons/wp_square_grn.png differ diff --git a/src/icons/wp_square_red.png b/src/icons/wp_square_red.png new file mode 100644 index 0000000..2f129e6 Binary files /dev/null and b/src/icons/wp_square_red.png differ diff --git a/src/icons/wp_stadium_large.png b/src/icons/wp_stadium_large.png new file mode 100644 index 0000000..a353e3e Binary files /dev/null and b/src/icons/wp_stadium_large.png differ diff --git a/src/icons/wp_store_large.png b/src/icons/wp_store_large.png new file mode 100644 index 0000000..bda0506 Binary files /dev/null and b/src/icons/wp_store_large.png differ diff --git a/src/icons/wp_summit.png b/src/icons/wp_summit.png new file mode 100644 index 0000000..48216a0 Binary files /dev/null and b/src/icons/wp_summit.png differ diff --git a/src/icons/wp_summit_large.png b/src/icons/wp_summit_large.png new file mode 100644 index 0000000..2d244ba Binary files /dev/null and b/src/icons/wp_summit_large.png differ diff --git a/src/icons/wp_swimming.png b/src/icons/wp_swimming.png new file mode 100644 index 0000000..61a862a Binary files /dev/null and b/src/icons/wp_swimming.png differ diff --git a/src/icons/wp_swimming_large.png b/src/icons/wp_swimming_large.png new file mode 100644 index 0000000..20f016c Binary files /dev/null and b/src/icons/wp_swimming_large.png differ diff --git a/src/icons/wp_tall_tower_large.png b/src/icons/wp_tall_tower_large.png new file mode 100644 index 0000000..02f0eab Binary files /dev/null and b/src/icons/wp_tall_tower_large.png differ diff --git a/src/icons/wp_theater_large.png b/src/icons/wp_theater_large.png new file mode 100644 index 0000000..53ffb90 Binary files /dev/null and b/src/icons/wp_theater_large.png differ diff --git a/src/icons/wp_toll_booth_large.png b/src/icons/wp_toll_booth_large.png new file mode 100644 index 0000000..9e06b94 Binary files /dev/null and b/src/icons/wp_toll_booth_large.png differ diff --git a/src/icons/wp_trail_head_large.png b/src/icons/wp_trail_head_large.png new file mode 100644 index 0000000..1fa25d7 Binary files /dev/null and b/src/icons/wp_trail_head_large.png differ diff --git a/src/icons/wp_tree_stand_large.png b/src/icons/wp_tree_stand_large.png new file mode 100644 index 0000000..b8321d7 Binary files /dev/null and b/src/icons/wp_tree_stand_large.png differ diff --git a/src/icons/wp_treed_quarry_large.png b/src/icons/wp_treed_quarry_large.png new file mode 100644 index 0000000..3567456 Binary files /dev/null and b/src/icons/wp_treed_quarry_large.png differ diff --git a/src/icons/wp_truck_large.png b/src/icons/wp_truck_large.png new file mode 100644 index 0000000..d51288d Binary files /dev/null and b/src/icons/wp_truck_large.png differ diff --git a/src/icons/wp_truck_stop_large.png b/src/icons/wp_truck_stop_large.png new file mode 100644 index 0000000..254e537 Binary files /dev/null and b/src/icons/wp_truck_stop_large.png differ diff --git a/src/icons/wp_tunnel.png b/src/icons/wp_tunnel.png new file mode 100644 index 0000000..7e4b474 Binary files /dev/null and b/src/icons/wp_tunnel.png differ diff --git a/src/icons/wp_tunnel_large.png b/src/icons/wp_tunnel_large.png new file mode 100644 index 0000000..507de7c Binary files /dev/null and b/src/icons/wp_tunnel_large.png differ diff --git a/src/icons/wp_ultralight_large.png b/src/icons/wp_ultralight_large.png new file mode 100644 index 0000000..2eac154 Binary files /dev/null and b/src/icons/wp_ultralight_large.png differ diff --git a/src/icons/wp_upland_game_large.png b/src/icons/wp_upland_game_large.png new file mode 100644 index 0000000..180f787 Binary files /dev/null and b/src/icons/wp_upland_game_large.png differ diff --git a/src/icons/wp_water_source_large.png b/src/icons/wp_water_source_large.png new file mode 100644 index 0000000..e2e53f7 Binary files /dev/null and b/src/icons/wp_water_source_large.png differ diff --git a/src/icons/wp_waterfowl_large.png b/src/icons/wp_waterfowl_large.png new file mode 100644 index 0000000..67be04a Binary files /dev/null and b/src/icons/wp_waterfowl_large.png differ diff --git a/src/icons/wp_wbuoy.png b/src/icons/wp_wbuoy.png new file mode 100644 index 0000000..e6d2582 Binary files /dev/null and b/src/icons/wp_wbuoy.png differ diff --git a/src/icons/wp_wbuoy_large.png b/src/icons/wp_wbuoy_large.png new file mode 100644 index 0000000..6fbb1ab Binary files /dev/null and b/src/icons/wp_wbuoy_large.png differ diff --git a/src/icons/wp_weigh_station_large.png b/src/icons/wp_weigh_station_large.png new file mode 100644 index 0000000..cc0208a Binary files /dev/null and b/src/icons/wp_weigh_station_large.png differ diff --git a/src/icons/wp_wpt_dot.png b/src/icons/wp_wpt_dot.png new file mode 100644 index 0000000..41bd3ca Binary files /dev/null and b/src/icons/wp_wpt_dot.png differ diff --git a/src/icons/wp_wreck.png b/src/icons/wp_wreck.png new file mode 100644 index 0000000..0b25a51 Binary files /dev/null and b/src/icons/wp_wreck.png differ diff --git a/src/icons/wp_wreck_large.png b/src/icons/wp_wreck_large.png new file mode 100644 index 0000000..f650636 Binary files /dev/null and b/src/icons/wp_wreck_large.png differ diff --git a/src/icons/wp_wrecker_large.png b/src/icons/wp_wrecker_large.png new file mode 100644 index 0000000..d984079 Binary files /dev/null and b/src/icons/wp_wrecker_large.png differ diff --git a/src/icons/wp_zoo_large.png b/src/icons/wp_zoo_large.png new file mode 100644 index 0000000..8bff5a7 Binary files /dev/null and b/src/icons/wp_zoo_large.png differ diff --git a/src/icons/zoom_18.png b/src/icons/zoom_18.png new file mode 100644 index 0000000..75c10db Binary files /dev/null and b/src/icons/zoom_18.png differ diff --git a/src/jpg.c b/src/jpg.c new file mode 100644 index 0000000..1b83b0c --- /dev/null +++ b/src/jpg.c @@ -0,0 +1,103 @@ +/* -*- Mode: C; indent-tabs-mode: t; c-basic-offset: 4; tab-width: 4 -*- */ +/* + * viking -- GPS Data and Topo Analyzer, Explorer, and Manager + * + * Copyright (C) 2014, Rob Norris + * + * 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., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA + * + */ + +#ifdef HAVE_CONFIG_H +#include "config.h" +#endif +#include "jpg.h" +#include "file_magic.h" +#ifdef VIK_CONFIG_GEOTAG +#include "geotag_exif.h" +#endif + +/** + * a_jpg_magic_check: + * @filename: The file + * + * Returns: Whether the file is a JPG + */ +gboolean a_jpg_magic_check ( const gchar *filename ) +{ + return file_magic_check ( filename, "image/jpeg", ".jpg" ); +} + +/** + * Load a single JPG into a Trackwaypoint Layer as a waypoint + * + * @top: The Aggregate layer that a new TRW layer may be created in + * @filename: The JPG filename + * @vvp: The viewport + * + * Returns: Whether the loading was a success or not + * + * If the JPG has geotag information then the waypoint will be created with the appropriate position. + * Otherwise the waypoint will be positioned at the current screen center. + * If a TRW layer is already selected the waypoint will be created in that layer. + */ +gboolean a_jpg_load_file ( VikAggregateLayer *top, const gchar *filename, VikViewport *vvp ) +{ + gboolean auto_zoom = TRUE; + VikWindow *vw = (VikWindow *)(VIK_GTK_WINDOW_FROM_LAYER(VIK_LAYER(top))); + VikLayersPanel *vlp = vik_window_layers_panel ( vw ); + // Auto load into TrackWaypoint layer if one is selected + VikLayer *vtl = vik_layers_panel_get_selected ( vlp ); + + gboolean create_layer = FALSE; + if ( vtl == NULL || vtl->type != VIK_LAYER_TRW ) { + // Create layer if necessary + vtl = vik_layer_create ( VIK_LAYER_TRW, vvp, FALSE ); + vik_layer_rename ( vtl, a_file_basename ( filename ) ); + create_layer = TRUE; + } + + gchar *name = NULL; + VikWaypoint *wp = NULL; +#ifdef VIK_CONFIG_GEOTAG + wp = a_geotag_create_waypoint_from_file ( filename, vik_viewport_get_coord_mode (vvp), &name ); +#endif + if ( wp ) { + // Create name if geotag method didn't return one + if ( !name ) + name = g_strdup ( a_file_basename ( filename ) ); + vik_trw_layer_filein_add_waypoint ( VIK_TRW_LAYER(vtl), name, wp ); + g_free ( name ); + } + else { + wp = vik_waypoint_new (); + wp->visible = TRUE; + vik_trw_layer_filein_add_waypoint ( VIK_TRW_LAYER(vtl), (gchar*) a_file_basename(filename), wp ); + vik_waypoint_set_image ( wp, filename ); + // Simply set position to the current center + wp->coord = *( vik_viewport_get_center ( vvp ) ); + auto_zoom = FALSE; + } + + // Complete the setup + vik_layer_post_read ( vtl, vvp, TRUE ); + if ( create_layer ) + vik_aggregate_layer_add_layer ( top, vtl, FALSE ); + if ( auto_zoom ) + vik_trw_layer_auto_set_view ( VIK_TRW_LAYER(vtl), vvp ); + + // ATM This routine can't fail + return TRUE; +} diff --git a/src/jpg.h b/src/jpg.h new file mode 100644 index 0000000..7d1880a --- /dev/null +++ b/src/jpg.h @@ -0,0 +1,35 @@ +/* -*- Mode: C; indent-tabs-mode: t; c-basic-offset: 4; tab-width: 4 -*- */ +/* + * viking -- GPS Data and Topo Analyzer, Explorer, and Manager + * + * Copyright (C) 2014, Rob Norris + * + * 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., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA + * + */ + +#ifndef _VIKING_JPG_H +#define _VIKING_JPG_H + +#include "viking.h" + +G_BEGIN_DECLS + +gboolean a_jpg_magic_check ( const gchar *filename ); +gboolean a_jpg_load_file ( VikAggregateLayer *top, const gchar *filename, VikViewport *vvp ); + +G_END_DECLS + +#endif diff --git a/src/kmz.c b/src/kmz.c new file mode 100644 index 0000000..daad6b1 --- /dev/null +++ b/src/kmz.c @@ -0,0 +1,496 @@ +/* + * viking -- GPS Data and Topo Analyzer, Explorer, and Manager + * + * Copyright (C) 2015, Rob Norris + * + * 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., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA + * + */ + +#include "kmz.h" + +#ifdef HAVE_CONFIG_H +#include "config.h" +#endif +#ifdef HAVE_ZIP_H +#include +#endif +#include "viking.h" +#include +#include +#include +#ifdef HAVE_EXPAT_H +#include +#endif +#include + +#ifdef HAVE_ZIP_H +/** + * Simple KML 'file' with a Ground Overlay + * + * See https://developers.google.com/kml/documentation/kmlreference + * + * AFAIK the projection is always in Web Mercator + * Probably for normal use case of not too large an area coverage (on a Garmin device) the projection is near enough... + */ +// Hopefully image_filename will not break the XML file tag structure +static gchar* doc_kml_str ( const gchar *name, const gchar *image_filename, gdouble north, gdouble south, gdouble east, gdouble west ) +{ + gchar *tmp_n = a_coords_dtostr ( north ); + gchar *tmp_s = a_coords_dtostr ( south ); + gchar *tmp_e = a_coords_dtostr ( east ); + gchar *tmp_w = a_coords_dtostr ( west ); + + gchar *doc_kml = g_strdup_printf ( + "\n" + "\n" + "\n" + " %s\n" + " \n" + " %s\n" + " \n" + " \n" + " %s\n" + " %s\n" + " %s\n" + " %s\n" + " 0\n" // Rotation always zero + " \n" + "\n" + "\n", + name, image_filename, tmp_n, tmp_s, tmp_e, tmp_w ); + + g_free ( tmp_n ); + g_free ( tmp_s ); + g_free ( tmp_e ); + g_free ( tmp_w ); + + return doc_kml; +} +#endif + +/** + * kmz_save_file: + * + * @pixbuf: The image to save + * @filename: Save the KMZ as this filename + * @north: Top latitude in degrees + * @east: Right most longitude in degrees + * @south: Bottom latitude in degrees + * @west: Left most longitude in degrees + * + * Returns: + * -1 if KMZ not supported (this shouldn't happen) + * 0 on success + * >0 some kind of error + * + * Mostly intended for use with as a Custom Map on a Garmin + * + * See http://garminbasecamp.wikispaces.com/Custom+Maps + * + * The KMZ is a zipped file containing a KML file with the associated image + */ +int kmz_save_file ( GdkPixbuf *pixbuf, const gchar* filename, gdouble north, gdouble east, gdouble south, gdouble west ) +{ +#ifdef HAVE_ZIP_H +// Older libzip compatibility: +#ifndef zip_source_t +typedef struct zip_source zip_source_t; +#endif + + int ans = ZIP_ER_OK; + gchar *image_filename = "image.jpg"; + + // Generate KMZ file (a zip file) + struct zip* archive = zip_open ( filename, ZIP_CREATE | ZIP_TRUNCATE, &ans ); + if ( !archive ) { + g_warning ( "Unable to create archive: '%s' Error code %d", filename, ans ); + goto finish; + } + + // Generate KML file + gchar *dk = doc_kml_str ( a_file_basename(filename), image_filename, north, south, east, west ); + int dkl = strlen ( dk ); + + // KML must be named doc.kml in the kmz file + zip_source_t *src_kml = zip_source_buffer ( archive, dk, dkl, 0 ); + zip_file_add ( archive, "doc.kml", src_kml, ZIP_FL_OVERWRITE ); + + GError *error = NULL; + gchar *buffer; + gsize blen; + gdk_pixbuf_save_to_buffer ( pixbuf, &buffer, &blen, "jpeg", &error, "x-dpi", "72", "y-dpi", "72", NULL ); + if ( error ) { + g_warning ( "Save to buffer error: %s", error->message ); + g_error_free (error); + zip_discard ( archive ); + ans = 130; + goto kml_cleanup; + } + + zip_source_t *src_img = zip_source_buffer ( archive, buffer, (int)blen, 0 ); + zip_file_add ( archive, image_filename, src_img, ZIP_FL_OVERWRITE ); + // NB Only store as limited use trying to (further) compress a JPG + zip_set_file_compression ( archive, 1, ZIP_CM_STORE, 0 ); + + ans = zip_close ( archive ); + + g_free ( buffer ); + + kml_cleanup: + g_free ( dk ); + finish: + return ans; +#else + return -1; +#endif +} + +typedef enum { + tt_unknown = 0, + tt_kml, + tt_kml_go, + tt_kml_go_name, + tt_kml_go_image, + tt_kml_go_latlonbox, + tt_kml_go_latlonbox_n, + tt_kml_go_latlonbox_e, + tt_kml_go_latlonbox_s, + tt_kml_go_latlonbox_w, +} xtag_type; + +typedef struct { + xtag_type tag_type; /* enum from above for this tag */ + const char *tag_name; /* xpath-ish tag name */ +} xtag_mapping; + +#ifdef HAVE_ZIP_H +// Older libzip compatibility: +#ifndef zip_t +typedef struct zip zip_t; +typedef struct zip_file zip_file_t; +#endif +#ifndef ZIP_RDONLY +#define ZIP_RDONLY 0 +#endif + +#ifdef HAVE_EXPAT_H +typedef struct { + GString *xpath; + GString *c_cdata; + xtag_type current_tag; + gchar *name; + gchar *image; // AKA icon + gdouble north; + gdouble east; + gdouble south; + gdouble west; + zip_t *archive; + struct zip_stat* zs; + VikViewport *vvp; + VikLayersPanel *vlp; +} xml_data; + +// NB No support for orientation ATM +static xtag_mapping xtag_path_map[] = { + { tt_kml, "/kml" }, + { tt_kml_go, "/kml/GroundOverlay" }, + { tt_kml_go_name, "/kml/GroundOverlay/name" }, + { tt_kml_go_image, "/kml/GroundOverlay/Icon/href" }, + { tt_kml_go_latlonbox, "/kml/GroundOverlay/LatLonBox" }, + { tt_kml_go_latlonbox_n, "/kml/GroundOverlay/LatLonBox/north" }, + { tt_kml_go_latlonbox_e, "/kml/GroundOverlay/LatLonBox/east" }, + { tt_kml_go_latlonbox_s, "/kml/GroundOverlay/LatLonBox/south" }, + { tt_kml_go_latlonbox_w, "/kml/GroundOverlay/LatLonBox/west" }, + // Some KML files have a 'Document' level + { tt_kml_go, "/kml/Document/GroundOverlay" }, + { tt_kml_go_name, "/kml/Document/GroundOverlay/name" }, + { tt_kml_go_image, "/kml/Document/GroundOverlay/Icon/href" }, + { tt_kml_go_latlonbox, "/kml/Document/GroundOverlay/LatLonBox" }, + { tt_kml_go_latlonbox_n, "/kml/Document/GroundOverlay/LatLonBox/north" }, + { tt_kml_go_latlonbox_e, "/kml/Document/GroundOverlay/LatLonBox/east" }, + { tt_kml_go_latlonbox_s, "/kml/Document/GroundOverlay/LatLonBox/south" }, + { tt_kml_go_latlonbox_w, "/kml/Document/GroundOverlay/LatLonBox/west" }, +}; + +// NB Don't be pedantic about matching case of strings for tags +static xtag_type get_tag ( const char *t ) +{ + xtag_mapping *tm; + for (tm = xtag_path_map; tm->tag_type != 0; tm++) + if (tm->tag_name != NULL) + if (0 == g_ascii_strcasecmp(tm->tag_name, t)) + return tm->tag_type; + return tt_unknown; +} + +static void kml_start ( xml_data *xd, const char *el, const char **attr ) +{ + g_string_append_c ( xd->xpath, '/' ); + g_string_append ( xd->xpath, el ); + + xd->current_tag = get_tag ( xd->xpath->str ); + switch ( xd->current_tag ) { + case tt_kml_go: + // Reset values + xd->name = NULL; + xd->image = NULL; + xd->north = NAN; + xd->south = NAN; + xd->east = NAN; + xd->west = NAN; + break; + case tt_kml_go_name: + case tt_kml_go_image: + case tt_kml_go_latlonbox_n: + case tt_kml_go_latlonbox_s: + case tt_kml_go_latlonbox_e: + case tt_kml_go_latlonbox_w: + g_string_erase ( xd->c_cdata, 0, -1 ); + break; + default: break; // ignore cdata from other things + } +} + +// Fwd declaration +void ground_overlay_load ( xml_data *xd ); + +static void kml_end ( xml_data *xd, const char *el ) +{ + g_string_truncate ( xd->xpath, xd->xpath->len - strlen(el) - 1 ); + + switch ( xd->current_tag ) { + case tt_kml_go: + ground_overlay_load ( xd ); + break; + case tt_kml_go_name: + g_free ( xd->name ); + xd->name = g_strdup ( xd->c_cdata->str ); + g_string_erase ( xd->c_cdata, 0, -1 ); + break; + case tt_kml_go_image: + g_free ( xd->image ); + xd->image = g_strdup ( xd->c_cdata->str ); + g_string_erase ( xd->c_cdata, 0, -1 ); + break; + case tt_kml_go_latlonbox_n: + xd->north = g_ascii_strtod ( xd->c_cdata->str, NULL ); + g_string_erase ( xd->c_cdata, 0, -1 ); + break; + case tt_kml_go_latlonbox_s: + xd->south = g_ascii_strtod ( xd->c_cdata->str, NULL ); + g_string_erase ( xd->c_cdata, 0, -1 ); + break; + case tt_kml_go_latlonbox_e: + xd->east = g_ascii_strtod ( xd->c_cdata->str, NULL ); + g_string_erase ( xd->c_cdata, 0, -1 ); + break; + case tt_kml_go_latlonbox_w: + xd->west = g_ascii_strtod ( xd->c_cdata->str, NULL ); + g_string_erase ( xd->c_cdata, 0, -1 ); + break; + default: + break; + } + + xd->current_tag = get_tag ( xd->xpath->str ); +} + +static void kml_cdata ( xml_data *xd, const XML_Char *s, int len ) +{ + switch ( xd->current_tag ) { + case tt_kml_go_name: + case tt_kml_go_image: + case tt_kml_go_latlonbox_n: + case tt_kml_go_latlonbox_s: + case tt_kml_go_latlonbox_e: + case tt_kml_go_latlonbox_w: + g_string_append_len ( xd->c_cdata, s, len ); + break; + default: break; // ignore cdata from other things + } +} + +/** + * Create a vikgeoreflayer for each in the kml file + * + */ +void ground_overlay_load ( xml_data *xd ) +{ + // Some simple detection of broken position values + if ( isnan(xd->north) || isnan(xd->west) || + isnan(xd->south) || isnan(xd->east) || + xd->north > 90.001 || xd->north < -90.001 || + xd->south > 90.001 || xd->south < -90.001 || + xd->west > 180.001 || xd->west < -180.001 || + xd->east > 180.001 || xd->east < -180.001 ) { + g_warning ("%s: %s %s: N%f,S%f E%f,W%f", __FUNCTION__, "invalid lat/lon values detected in", + xd->name, xd->north, xd->south, xd->east, xd->west ); + return; + } + + GdkPixbuf *pixbuf = NULL; + + // Read zip for image... + if ( xd->image ) { + if ( zip_stat ( xd->archive, xd->image, ZIP_FL_NOCASE | ZIP_FL_ENC_GUESS, xd->zs ) == 0) { + zip_file_t *zfi = zip_fopen_index ( xd->archive, xd->zs->index, 0 ); + // Don't know a way to create a pixbuf using streams. + // Thus write out to file + // Could read in chunks rather than one big buffer, but don't expect images to be that big + char *ibuffer = g_malloc(xd->zs->size); + int ilen = zip_fread ( zfi, ibuffer, xd->zs->size ); + if ( ilen != xd->zs->size ) { + g_warning ( "Unable to read %s from zip file", xd->image ); + } + else { + gchar *image_file = util_write_tmp_file_from_bytes ( ibuffer, ilen ); + GError *error = NULL; + pixbuf = gdk_pixbuf_new_from_file ( image_file, &error ); + if ( error ) { + g_warning ("%s: %s", __FUNCTION__, error->message ); + g_error_free ( error ); + } + else { + util_remove ( image_file ); + } + g_free ( image_file ); + } + g_free ( ibuffer ); + } + g_free ( xd->image ); + } + + if ( pixbuf ) { + VikCoord vc_tl, vc_br; + struct LatLon ll_tl, ll_br; + ll_tl.lat = xd->north; + ll_tl.lon = xd->west; + ll_br.lat = xd->south; + ll_br.lon = xd->east; + vik_coord_load_from_latlon ( &vc_tl, vik_viewport_get_coord_mode(xd->vvp), &ll_tl ); + vik_coord_load_from_latlon ( &vc_br, vik_viewport_get_coord_mode(xd->vvp), &ll_br ); + + VikGeorefLayer *vgl = vik_georef_layer_create ( xd->vvp, xd->vlp, xd->name ? xd->name : "GeoRef", pixbuf, &vc_tl, &vc_br ); + if ( vgl ) { + VikAggregateLayer *top = vik_layers_panel_get_top_layer ( xd->vlp ); + vik_aggregate_layer_add_layer ( top, VIK_LAYER(vgl), FALSE ); + } + } +} + +/** + * + */ +static gboolean parse_kml ( const char* buffer, int len, VikViewport *vvp, VikLayersPanel *vlp, zip_t *archive, struct zip_stat* zs ) +{ + XML_Parser parser = XML_ParserCreate(NULL); + enum XML_Status status = XML_STATUS_ERROR; + + xml_data *xd = g_malloc ( sizeof (xml_data) ); + // Set default (invalid) values; + xd->xpath = g_string_new ( "" ); + xd->c_cdata = g_string_new ( "" ); + xd->current_tag = tt_unknown; + xd->north = NAN; + xd->south = NAN; + xd->east = NAN; + xd->west = NAN; + xd->name = NULL; + xd->image = NULL; + xd->archive = archive; + xd->zs = zs; + xd->vvp = vvp; + xd->vlp = vlp; + + XML_SetElementHandler(parser, (XML_StartElementHandler) kml_start, (XML_EndElementHandler) kml_end); + XML_SetUserData(parser, xd); + XML_SetCharacterDataHandler(parser, (XML_CharacterDataHandler) kml_cdata); + + status = XML_Parse(parser, buffer, len, TRUE); + + XML_ParserFree (parser); + + g_string_free ( xd->xpath, TRUE ); + g_string_free ( xd->c_cdata, TRUE ); + g_free ( xd ); + + return status != XML_STATUS_ERROR; +} +#endif +#endif + +/** + * kmz_open_file: + * @filename: The KMZ file to open + * @vvp: The #VikViewport + * @vlp: The #VikLayersPanel that the converted KMZ will be stored in + * + * Returns: + * -1 if KMZ not supported (this shouldn't happen) + * 0 on success + * >0 <128 ZIP error code + * 128 - No doc.kml file in KMZ + * 129 - Couldn't understand the doc.kml file + */ +int kmz_open_file ( const gchar* filename, VikViewport *vvp, VikLayersPanel *vlp ) +{ + // Unzip +#ifdef HAVE_ZIP_H + + int ans = ZIP_ER_OK; + zip_t *archive = zip_open ( filename, ZIP_RDONLY, &ans ); + if ( !archive ) { + g_warning ( "Unable to open archive: '%s' Error code %d", filename, ans ); + goto cleanup; + } + + zip_int64_t zindex = zip_name_locate ( archive, "doc.kml", ZIP_FL_NOCASE | ZIP_FL_ENC_GUESS ); + if ( zindex == -1 ) { + g_warning ( "Unable to find doc.kml" ); + goto kmz_cleanup; + } + + struct zip_stat zs; + if ( zip_stat_index( archive, zindex, 0, &zs ) == 0) { + zip_file_t *zf = zip_fopen_index ( archive, zindex, 0 ); + char *buffer = g_malloc(zs.size); + int len = zip_fread ( zf, buffer, zs.size ); + if ( len != zs.size ) { + ans = 128; + g_free ( buffer ); + g_warning ( "Unable to read doc.kml from zip file" ); + goto kmz_cleanup; + } + + gboolean parsed = FALSE; +#ifdef HAVE_EXPAT_H + parsed = parse_kml ( buffer, len, vvp, vlp, archive, &zs ); +#endif + g_free ( buffer ); + + if ( !parsed ) { + ans = 129; + } + } + +kmz_cleanup: + zip_discard ( archive ); // Close and ensure unchanged + cleanup: + return ans; +#else + return -1; +#endif +} diff --git a/src/kmz.h b/src/kmz.h new file mode 100644 index 0000000..762041f --- /dev/null +++ b/src/kmz.h @@ -0,0 +1,37 @@ +/* + * viking -- GPS Data and Topo Analyzer, Explorer, and Manager + * + * Copyright (C) 2015, Rob Norris + * + * 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., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA + * + */ +#ifndef _VIKING_KMZ_H +#define _VIKING_KMZ_H + +#include +#include +#include "vikviewport.h" +#include "viklayerspanel.h" + +G_BEGIN_DECLS + +int kmz_save_file ( GdkPixbuf *pixbuf, const gchar* filename, gdouble north, gdouble east, gdouble south, gdouble west ); + +int kmz_open_file ( const gchar* filename, VikViewport *vvp, VikLayersPanel *vlp ); + +G_END_DECLS + +#endif diff --git a/src/libgeoclue.c b/src/libgeoclue.c new file mode 100644 index 0000000..ce8e753 --- /dev/null +++ b/src/libgeoclue.c @@ -0,0 +1,119 @@ +/* -*- Mode: C; indent-tabs-mode: t; c-basic-offset: 4; tab-width: 4 -*- */ +/* + * viking -- GPS Data and Topo Analyzer, Explorer, and Manager + * + * Copyright (C) 2017, Rob Norris + * + * 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., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA + * + */ +#include +#include +#include +#include + +#include "globals.h" +#include "libgeoclue.h" +#include "settings.h" + +void libgeoclue_print_location (GClueLocation *location) +{ + g_print ("%s:\n\tLatitude: %f°\n\tLongitude: %f°\n\tAccuracy: %.3f meters\n", + __FUNCTION__, + gclue_location_get_latitude (location), + gclue_location_get_longitude (location), + gclue_location_get_accuracy (location)); + const char *description = gclue_location_get_description (location); + if (strlen (description) > 0) + g_print ("Description: %s\n", description); +} + +typedef struct { + VikWindow *vw; + callback func; + struct LatLon ll; + gdouble accuracy; +} clue_t; + +static void +on_simple_ready (GObject *source_object, + GAsyncResult *res, + gpointer user_data) +{ + GError *error = NULL; + clue_t *clue = (clue_t*)user_data; + clue->ll.lat = NAN; + clue->ll.lon = NAN; + + GClueSimple *simple = gclue_simple_new_finish ( res, &error ); + if ( error != NULL ) { + g_warning ( "Failed to connect to service: %s", error->message ); + g_error_free ( error ); + goto finish; + } + + GClueLocation *location = gclue_simple_get_location ( simple ); + if ( vik_verbose ) + libgeoclue_print_location ( location ); + + clue->ll.lat = gclue_location_get_latitude ( location ); + clue->ll.lon = gclue_location_get_longitude ( location ); + clue->accuracy = gclue_location_get_accuracy ( location ); + +#if GLIB_CHECK_VERSION(2,28,0) + g_clear_object ( &simple ); +#endif +finish: + clue->func(clue->vw, clue->ll, clue->accuracy); + g_free ( clue ); +} + +#define VIK_SETTINGS_GC_ACC "geoclue_accuracy_level" + +/** + * libgeoclue_where_am_i: + * + * Use geoclue to get location information + * As this is asynchronous, use a callback to inform when the process + * has completed. + */ +void libgeoclue_where_am_i ( VikWindow *vw, callback func ) +{ + clue_t *clue = g_malloc ( sizeof(clue_t) ); + clue->vw = vw; + clue->func = func; + + int accuracy; + if ( a_settings_get_integer ( VIK_SETTINGS_GC_ACC, &accuracy ) ) { + // Ensure valid value + if ( !( accuracy == GCLUE_ACCURACY_LEVEL_NONE || + accuracy == GCLUE_ACCURACY_LEVEL_COUNTRY || + accuracy == GCLUE_ACCURACY_LEVEL_CITY || + accuracy == GCLUE_ACCURACY_LEVEL_NEIGHBORHOOD || + accuracy == GCLUE_ACCURACY_LEVEL_STREET || + accuracy == GCLUE_ACCURACY_LEVEL_EXACT ) ) { + g_warning ( "%s: Invalid geoclue accuracy level value '%d', using the default instead", __FUNCTION__, accuracy ); + accuracy = GCLUE_ACCURACY_LEVEL_CITY; + } + } + else + accuracy = GCLUE_ACCURACY_LEVEL_CITY; + + gclue_simple_new (PACKAGE, + accuracy, + NULL, + on_simple_ready, + clue); +} diff --git a/src/libgeoclue.h b/src/libgeoclue.h new file mode 100644 index 0000000..e6cfe23 --- /dev/null +++ b/src/libgeoclue.h @@ -0,0 +1,39 @@ +/* -*- Mode: C; indent-tabs-mode: t; c-basic-offset: 4; tab-width: 4 -*- */ +/* + * viking -- GPS Data and Topo Analyzer, Explorer, and Manager + * + * Copyright (C) 2017, Rob Norris + * + * 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., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA + * + */ +#ifndef __VIKING_LIBGEOCLUE_H +#define __VIKING_LIBGEOCLUE_H + +#include +#include +#include "vikwindow.h" + +G_BEGIN_DECLS + +typedef void (*callback)(VikWindow*, struct LatLon, gdouble); + +void libgeoclue_where_am_i ( VikWindow *vw, callback func ); + +void libgeoclue_print_location (GClueLocation *location); + +G_END_DECLS + +#endif // __VIKING_LIBGEOCLUE_H diff --git a/src/libjpeg/jpeg-data.c b/src/libjpeg/jpeg-data.c new file mode 100644 index 0000000..9848301 --- /dev/null +++ b/src/libjpeg/jpeg-data.c @@ -0,0 +1,485 @@ +/* jpeg-data.c + * + * Copyright 2001 Lutz Mller + * + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU Lesser 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 + * Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser 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. + */ + +#include "config.h" +#include "jpeg-data.h" + +#include +#include +#include +#include + +/* realloc that cleans up on memory failure and returns to caller */ +#define CLEANUP_REALLOC(p,s) { \ + unsigned char *cleanup_ptr = realloc((p),(s)); \ + if (!cleanup_ptr) { free(p); (p) = NULL; return; } \ + (p) = cleanup_ptr; \ +} + +struct _JPEGDataPrivate +{ + unsigned int ref_count; + + ExifLog *log; +}; + +JPEGData * +jpeg_data_new (void) +{ + JPEGData *data; + + data = malloc (sizeof (JPEGData)); + if (!data) + return (NULL); + memset (data, 0, sizeof (JPEGData)); + data->priv = malloc (sizeof (JPEGDataPrivate)); + if (!data->priv) { + free (data); + return (NULL); + } + memset (data->priv, 0, sizeof (JPEGDataPrivate)); + data->priv->ref_count = 1; + + return (data); +} + +void +jpeg_data_append_section (JPEGData *data) +{ + JPEGSection *s; + + if (!data) return; + + if (!data->count) + s = malloc (sizeof (JPEGSection)); + else + s = realloc (data->sections, + sizeof (JPEGSection) * (data->count + 1)); + if (!s) { + EXIF_LOG_NO_MEMORY (data->priv->log, "jpeg-data", + sizeof (JPEGSection) * (data->count + 1)); + return; + } + memset(s + data->count, 0, sizeof (JPEGSection)); + data->sections = s; + data->count++; +} + +/*! jpeg_data_save_file returns 1 on success, 0 on failure */ +int +jpeg_data_save_file (JPEGData *data, const char *path) +{ + FILE *f; + unsigned char *d = NULL; + unsigned int size = 0, written; + + jpeg_data_save_data (data, &d, &size); + if (!d) + return 0; + + f = fopen (path, "wb"); + if (!f) { + free (d); + return 0; + } + written = fwrite (d, 1, size, f); + fclose (f); + free (d); + if (written == size) { + return 1; + } + remove(path); + return 0; +} + +void +jpeg_data_save_data (JPEGData *data, unsigned char **d, unsigned int *ds) +{ + unsigned int i, eds = 0; + JPEGSection s; + unsigned char *ed = NULL; + + if (!data) + return; + if (!d) + return; + if (!ds) + return; + + for (*ds = i = 0; i < data->count; i++) { + s = data->sections[i]; + + /* Write the marker */ + CLEANUP_REALLOC (*d, sizeof (char) * (*ds + 2)); + (*d)[*ds + 0] = 0xff; + (*d)[*ds + 1] = s.marker; + *ds += 2; + + switch (s.marker) { + case JPEG_MARKER_SOI: + case JPEG_MARKER_EOI: + break; + case JPEG_MARKER_APP1: + exif_data_save_data (s.content.app1, &ed, &eds); + if (!ed) break; + CLEANUP_REALLOC (*d, sizeof (char) * (*ds + 2)); + (*d)[*ds + 0] = (eds + 2) >> 8; + (*d)[*ds + 1] = (eds + 2) >> 0; + *ds += 2; + CLEANUP_REALLOC (*d, sizeof (char) * (*ds + eds)); + memcpy (*d + *ds, ed, eds); + *ds += eds; + free (ed); + break; + default: + CLEANUP_REALLOC (*d, sizeof (char) * + (*ds + s.content.generic.size + 2)); + (*d)[*ds + 0] = (s.content.generic.size + 2) >> 8; + (*d)[*ds + 1] = (s.content.generic.size + 2) >> 0; + *ds += 2; + memcpy (*d + *ds, s.content.generic.data, + s.content.generic.size); + *ds += s.content.generic.size; + + /* In case of SOS, we need to write the data. */ + if (s.marker == JPEG_MARKER_SOS) { + CLEANUP_REALLOC (*d, *ds + data->size); + memcpy (*d + *ds, data->data, data->size); + *ds += data->size; + } + break; + } + } +} + +JPEGData * +jpeg_data_new_from_data (const unsigned char *d, + unsigned int size) +{ + JPEGData *data; + + data = jpeg_data_new (); + jpeg_data_load_data (data, d, size); + return (data); +} + +void +jpeg_data_load_data (JPEGData *data, const unsigned char *d, + unsigned int size) +{ + unsigned int i, o, len; + JPEGSection *s; + JPEGMarker marker; + + if (!data) return; + if (!d) return; + + for (o = 0; o < size;) { + + /* + * JPEG sections start with 0xff. The first byte that is + * not 0xff is a marker (hopefully). + */ + for (i = 0; i < MIN(7, size - o); i++) + if (d[o + i] != 0xff) + break; + if ((i >= size - o) || !JPEG_IS_MARKER (d[o + i])) { + exif_log (data->priv->log, EXIF_LOG_CODE_CORRUPT_DATA, "jpeg-data", + _("Data does not follow JPEG specification.")); + return; + } + marker = d[o + i]; + + /* Append this section */ + jpeg_data_append_section (data); + if (!data->count) return; + s = &data->sections[data->count - 1]; + s->marker = marker; + o += i + 1; + + switch (s->marker) { + case JPEG_MARKER_SOI: + case JPEG_MARKER_EOI: + break; + default: + + /* Read the length of the section */ + if (2 > size - o) { o = size; break; } + len = ((d[o] << 8) | d[o + 1]) - 2; + if (len > size) { o = size; break; } + o += 2; + if (len > size - o) { o = size; break; } + + switch (s->marker) { + case JPEG_MARKER_APP1: + s->content.app1 = exif_data_new_from_data ( + d + o - 4, len + 4); + break; + default: + s->content.generic.data = + malloc (sizeof (char) * len); + if (!s->content.generic.data) { + EXIF_LOG_NO_MEMORY (data->priv->log, "jpeg-data", sizeof (char) * len); + return; + } + s->content.generic.size = len; + memcpy (s->content.generic.data, &d[o], len); + + /* In case of SOS, image data will follow. */ + if (s->marker == JPEG_MARKER_SOS) { + data->size = size - o - len; + if (data->size >= 2) { + /* -2 means 'take all but the last 2 bytes which are + hoped to be JPEG_MARKER_EOI */ + data->size -= 2; + if (d[o + len + data->size] != 0xFF) { + /* A truncated file (i.e. w/o JPEG_MARKER_EOI at the end). + Instead of trying to use the last two bytes as marker, + touching memory beyond allocated memory and posssibly saving + back screwed file, we rather take the rest of the file. */ + data->size += 2; + } + } + data->data = malloc ( + sizeof (char) * data->size); + if (!data->data) { + EXIF_LOG_NO_MEMORY (data->priv->log, "jpeg-data", sizeof (char) * data->size); + data->size = 0; + return; + } + memcpy (data->data, d + o + len, + data->size); + o += data->size; + } + break; + } + o += len; + break; + } + } +} + +JPEGData * +jpeg_data_new_from_file (const char *path) +{ + JPEGData *data; + + data = jpeg_data_new (); + jpeg_data_load_file (data, path); + return (data); +} + +void +jpeg_data_load_file (JPEGData *data, const char *path) +{ + FILE *f; + unsigned char *d; + unsigned int size; + + if (!data) return; + if (!path) return; + + f = fopen (path, "rb"); + if (!f) { + exif_log (data->priv->log, EXIF_LOG_CODE_CORRUPT_DATA, "jpeg-data", + _("Path '%s' invalid."), path); + return; + } + + /* For now, we read the data into memory. Patches welcome... */ + fseek (f, 0, SEEK_END); + size = ftell (f); + fseek (f, 0, SEEK_SET); + d = malloc (size); + if (!d) { + EXIF_LOG_NO_MEMORY (data->priv->log, "jpeg-data", size); + fclose (f); + return; + } + if (fread (d, 1, size, f) != size) { + free (d); + fclose (f); + exif_log (data->priv->log, EXIF_LOG_CODE_CORRUPT_DATA, "jpeg-data", + _("Could not read '%s'."), path); + return; + } + fclose (f); + + jpeg_data_load_data (data, d, size); + free (d); +} + +void +jpeg_data_ref (JPEGData *data) +{ + if (!data) + return; + + data->priv->ref_count++; +} + +void +jpeg_data_unref (JPEGData *data) +{ + if (!data) + return; + + if (data->priv) { + data->priv->ref_count--; + if (!data->priv->ref_count) + jpeg_data_free (data); + } +} + +void +jpeg_data_free (JPEGData *data) +{ + unsigned int i; + JPEGSection s; + + if (!data) + return; + + if (data->count) { + for (i = 0; i < data->count; i++) { + s = data->sections[i]; + switch (s.marker) { + case JPEG_MARKER_SOI: + case JPEG_MARKER_EOI: + break; + case JPEG_MARKER_APP1: + exif_data_unref (s.content.app1); + break; + default: + free (s.content.generic.data); + break; + } + } + free (data->sections); + } + + if (data->data) + free (data->data); + + if (data->priv) { + if (data->priv->log) { + exif_log_unref (data->priv->log); + data->priv->log = NULL; + } + free (data->priv); + } + + free (data); +} + +void +jpeg_data_dump (JPEGData *data) +{ + unsigned int i; + JPEGContent content; + JPEGMarker marker; + + if (!data) + return; + + printf ("Dumping JPEG data (%i bytes of data)...\n", data->size); + for (i = 0; i < data->count; i++) { + marker = data->sections[i].marker; + content = data->sections[i].content; + printf ("Section %i (marker 0x%x - %s):\n", i, marker, + jpeg_marker_get_name (marker)); + printf (" Description: %s\n", + jpeg_marker_get_description (marker)); + switch (marker) { + case JPEG_MARKER_SOI: + case JPEG_MARKER_EOI: + break; + case JPEG_MARKER_APP1: + exif_data_dump (content.app1); + break; + default: + printf (" Size: %i\n", content.generic.size); + printf (" Unknown content.\n"); + break; + } + } +} + +static JPEGSection * +jpeg_data_get_section (JPEGData *data, JPEGMarker marker) +{ + unsigned int i; + + if (!data) + return (NULL); + + for (i = 0; i < data->count; i++) + if (data->sections[i].marker == marker) + return (&data->sections[i]); + return (NULL); +} + +ExifData * +jpeg_data_get_exif_data (JPEGData *data) +{ + JPEGSection *section; + + if (!data) + return NULL; + + section = jpeg_data_get_section (data, JPEG_MARKER_APP1); + if (section) { + exif_data_ref (section->content.app1); + return (section->content.app1); + } + + return (NULL); +} + +void +jpeg_data_set_exif_data (JPEGData *data, ExifData *exif_data) +{ + JPEGSection *section; + + if (!data) return; + + section = jpeg_data_get_section (data, JPEG_MARKER_APP1); + if (!section) { + jpeg_data_append_section (data); + if (data->count < 2) return; + memmove (&data->sections[2], &data->sections[1], + sizeof (JPEGSection) * (data->count - 2)); + section = &data->sections[1]; + } else { + exif_data_unref (section->content.app1); + } + section->marker = JPEG_MARKER_APP1; + section->content.app1 = exif_data; + exif_data_ref (exif_data); +} + +void +jpeg_data_log (JPEGData *data, ExifLog *log) +{ + if (!data || !data->priv) return; + if (data->priv->log) exif_log_unref (data->priv->log); + data->priv->log = log; + exif_log_ref (log); +} diff --git a/src/libjpeg/jpeg-data.h b/src/libjpeg/jpeg-data.h new file mode 100644 index 0000000..bb6ba0c --- /dev/null +++ b/src/libjpeg/jpeg-data.h @@ -0,0 +1,92 @@ +/* jpeg-data.h + * + * Copyright 2001 Lutz Mller + * + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU Lesser 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 + * Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser 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. + */ + +#ifndef __JPEG_DATA_H__ +#define __JPEG_DATA_H__ + +#include "libjpeg/jpeg-marker.h" + +#include +#include + +typedef ExifData * JPEGContentAPP1; + +typedef struct _JPEGContentGeneric JPEGContentGeneric; +struct _JPEGContentGeneric +{ + unsigned char *data; + unsigned int size; +}; + +typedef union _JPEGContent JPEGContent; +union _JPEGContent +{ + JPEGContentGeneric generic; + JPEGContentAPP1 app1; +}; + +typedef struct _JPEGSection JPEGSection; +struct _JPEGSection +{ + JPEGMarker marker; + JPEGContent content; +}; + +typedef struct _JPEGData JPEGData; +typedef struct _JPEGDataPrivate JPEGDataPrivate; + +struct _JPEGData +{ + JPEGSection *sections; + unsigned int count; + + unsigned char *data; + unsigned int size; + + JPEGDataPrivate *priv; +}; + +JPEGData *jpeg_data_new (void); +JPEGData *jpeg_data_new_from_file (const char *path); +JPEGData *jpeg_data_new_from_data (const unsigned char *data, + unsigned int size); + +void jpeg_data_ref (JPEGData *data); +void jpeg_data_unref (JPEGData *data); +void jpeg_data_free (JPEGData *data); + +void jpeg_data_load_data (JPEGData *data, const unsigned char *d, + unsigned int size); +void jpeg_data_save_data (JPEGData *data, unsigned char **d, + unsigned int *size); + +void jpeg_data_load_file (JPEGData *data, const char *path); +int jpeg_data_save_file (JPEGData *data, const char *path); + +void jpeg_data_set_exif_data (JPEGData *data, ExifData *exif_data); +ExifData *jpeg_data_get_exif_data (JPEGData *data); + +void jpeg_data_dump (JPEGData *data); + +void jpeg_data_append_section (JPEGData *data); + +void jpeg_data_log (JPEGData *data, ExifLog *log); + +#endif /* __JPEG_DATA_H__ */ diff --git a/src/libjpeg/jpeg-marker.c b/src/libjpeg/jpeg-marker.c new file mode 100644 index 0000000..10824d2 --- /dev/null +++ b/src/libjpeg/jpeg-marker.c @@ -0,0 +1,122 @@ +/* jpeg-marker.c + * + * Copyright 2001-2008 Lutz Mller + * + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU Lesser 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 + * Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser 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. + */ +#include "config.h" +#include "jpeg-marker.h" + +#include + +static const struct { + JPEGMarker marker; + const char *name; + const char *description; +} JPEGMarkerTable[] = { + {JPEG_MARKER_SOF0, "SOF0", "Encoding (baseline)"}, + {JPEG_MARKER_SOF1, "SOF1", "Encoding (extended sequential)"}, + {JPEG_MARKER_SOF2, "SOF2", "Encoding (progressive)"}, + {JPEG_MARKER_SOF3, "SOF3", "Encoding (lossless)"}, + {JPEG_MARKER_SOF5, "SOF5", "Encoding (differential sequential)"}, + {JPEG_MARKER_SOF6, "SOF6", "Encoding (differential progressive)"}, + {JPEG_MARKER_SOF7, "SOF7", "Encoding (differential lossless)"}, + {JPEG_MARKER_SOF9, "SOF9", + "Encoding (extended sequential, arithmetic)"}, + {JPEG_MARKER_SOF10, "SOF10", "Encoding (progressive, arithmetic)"}, + {JPEG_MARKER_SOF11, "SOF11", "Encoding (lossless, arithmetic)"}, + {JPEG_MARKER_SOF13, "SOF13", + "Encoding (differential sequential, arithmetic)"}, + {JPEG_MARKER_SOF14, "SOF14", + "Encoding (differential progressive, arithmetic)"}, + {JPEG_MARKER_SOF15, "SOF15", + "Encoding (differential lossless, arithmetic)"}, + {JPEG_MARKER_SOI, "SOI", "Start of image"}, + {JPEG_MARKER_EOI, "EOI", "End of image"}, + {JPEG_MARKER_SOS, "SOS", "Start of scan"}, + {JPEG_MARKER_COM, "COM", "Comment"}, + {JPEG_MARKER_DHT, "DHT", "Define Huffman table"}, + {JPEG_MARKER_JPG, "JPG", "Extension"}, + {JPEG_MARKER_DAC, "DAC", "Define arithmetic coding conditioning"}, + {JPEG_MARKER_RST1, "RST1", "Restart 1"}, + {JPEG_MARKER_RST2, "RST2", "Restart 2"}, + {JPEG_MARKER_RST3, "RST3", "Restart 3"}, + {JPEG_MARKER_RST4, "RST4", "Restart 4"}, + {JPEG_MARKER_RST5, "RST5", "Restart 5"}, + {JPEG_MARKER_RST6, "RST6", "Restart 6"}, + {JPEG_MARKER_RST7, "RST7", "Restart 7"}, + {JPEG_MARKER_DQT, "DQT", "Define quantization table"}, + {JPEG_MARKER_DNL, "DNL", "Define number of lines"}, + {JPEG_MARKER_DRI, "DRI", "Define restart interval"}, + {JPEG_MARKER_DHP, "DHP", "Define hierarchical progression"}, + {JPEG_MARKER_EXP, "EXP", "Expand reference component"}, + {JPEG_MARKER_APP0, "APP0", "Application segment 0"}, + {JPEG_MARKER_APP1, "APP1", "Application segment 1"}, + {JPEG_MARKER_APP2, "APP2", "Application segment 2"}, + {JPEG_MARKER_APP3, "APP3", "Application segment 3"}, + {JPEG_MARKER_APP4, "APP4", "Application segment 4"}, + {JPEG_MARKER_APP5, "APP5", "Application segment 5"}, + {JPEG_MARKER_APP6, "APP6", "Application segment 6"}, + {JPEG_MARKER_APP7, "APP7", "Application segment 7"}, + {JPEG_MARKER_APP8, "APP8", "Application segment 8"}, + {JPEG_MARKER_APP9, "APP9", "Application segment 9"}, + {JPEG_MARKER_APP10, "APP10", "Application segment 10"}, + {JPEG_MARKER_APP11, "APP11", "Application segment 11"}, + {JPEG_MARKER_APP12, "APP12", "Application segment 12"}, + {JPEG_MARKER_APP13, "APP13", "Application segment 13"}, + {JPEG_MARKER_APP14, "APP14", "Application segment 14"}, + {JPEG_MARKER_APP15, "APP15", "Application segment 15"}, + {JPEG_MARKER_JPG0, "JPG0", "Extension 0"}, + {JPEG_MARKER_JPG1, "JPG1", "Extension 1"}, + {JPEG_MARKER_JPG2, "JPG2", "Extension 2"}, + {JPEG_MARKER_JPG3, "JPG3", "Extension 3"}, + {JPEG_MARKER_JPG4, "JPG4", "Extension 4"}, + {JPEG_MARKER_JPG5, "JPG5", "Extension 5"}, + {JPEG_MARKER_JPG6, "JPG6", "Extension 6"}, + {JPEG_MARKER_JPG7, "JPG7", "Extension 7"}, + {JPEG_MARKER_JPG8, "JPG8", "Extension 8"}, + {JPEG_MARKER_JPG9, "JPG9", "Extension 9"}, + {JPEG_MARKER_JPG10, "JPG10", "Extension 10"}, + {JPEG_MARKER_JPG11, "JPG11", "Extension 11"}, + {JPEG_MARKER_JPG12, "JPG12", "Extension 12"}, + {JPEG_MARKER_JPG13, "JPG13", "Extension 13"}, + {0, NULL, NULL} +}; + +const char * +jpeg_marker_get_name (JPEGMarker marker) +{ + unsigned int i; + + for (i = 0; JPEGMarkerTable[i].name; i++) + if (JPEGMarkerTable[i].marker == marker) + break; + + return (JPEGMarkerTable[i].name); +} + +const char * +jpeg_marker_get_description (JPEGMarker marker) +{ + unsigned int i; + + for (i = 0; JPEGMarkerTable[i].description; i++) + if (JPEGMarkerTable[i].marker == marker) + break; + + return (JPEGMarkerTable[i].description); +} + diff --git a/src/libjpeg/jpeg-marker.h b/src/libjpeg/jpeg-marker.h new file mode 100644 index 0000000..88bfe48 --- /dev/null +++ b/src/libjpeg/jpeg-marker.h @@ -0,0 +1,103 @@ +/* jpeg-marker.h + * + * Copyright 2001 Lutz Mller + * + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU Lesser 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 + * Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser 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. + */ +#ifndef __JPEG_MARKER_H__ +#define __JPEG_MARKER_H__ + +#ifdef __cplusplus +extern "C" { +#endif /* __cplusplus */ + +typedef enum { + JPEG_MARKER_SOF0 = 0xc0, + JPEG_MARKER_SOF1 = 0xc1, + JPEG_MARKER_SOF2 = 0xc2, + JPEG_MARKER_SOF3 = 0xc3, + JPEG_MARKER_DHT = 0xc4, + JPEG_MARKER_SOF5 = 0xc5, + JPEG_MARKER_SOF6 = 0xc6, + JPEG_MARKER_SOF7 = 0xc7, + JPEG_MARKER_JPG = 0xc8, + JPEG_MARKER_SOF9 = 0xc9, + JPEG_MARKER_SOF10 = 0xca, + JPEG_MARKER_SOF11 = 0xcb, + JPEG_MARKER_DAC = 0xcc, + JPEG_MARKER_SOF13 = 0xcd, + JPEG_MARKER_SOF14 = 0xce, + JPEG_MARKER_SOF15 = 0xcf, + JPEG_MARKER_RST0 = 0xd0, + JPEG_MARKER_RST1 = 0xd1, + JPEG_MARKER_RST2 = 0xd2, + JPEG_MARKER_RST3 = 0xd3, + JPEG_MARKER_RST4 = 0xd4, + JPEG_MARKER_RST5 = 0xd5, + JPEG_MARKER_RST6 = 0xd6, + JPEG_MARKER_RST7 = 0xd7, + JPEG_MARKER_SOI = 0xd8, + JPEG_MARKER_EOI = 0xd9, + JPEG_MARKER_SOS = 0xda, + JPEG_MARKER_DQT = 0xdb, + JPEG_MARKER_DNL = 0xdc, + JPEG_MARKER_DRI = 0xdd, + JPEG_MARKER_DHP = 0xde, + JPEG_MARKER_EXP = 0xdf, + JPEG_MARKER_APP0 = 0xe0, + JPEG_MARKER_APP1 = 0xe1, + JPEG_MARKER_APP2 = 0xe2, + JPEG_MARKER_APP3 = 0xe3, + JPEG_MARKER_APP4 = 0xe4, + JPEG_MARKER_APP5 = 0xe5, + JPEG_MARKER_APP6 = 0xe6, + JPEG_MARKER_APP7 = 0xe7, + JPEG_MARKER_APP8 = 0xe8, + JPEG_MARKER_APP9 = 0xe9, + JPEG_MARKER_APP10 = 0xea, + JPEG_MARKER_APP11 = 0xeb, + JPEG_MARKER_APP12 = 0xec, + JPEG_MARKER_APP13 = 0xed, + JPEG_MARKER_APP14 = 0xee, + JPEG_MARKER_APP15 = 0xef, + JPEG_MARKER_JPG0 = 0xf0, + JPEG_MARKER_JPG1 = 0xf1, + JPEG_MARKER_JPG2 = 0xf2, + JPEG_MARKER_JPG3 = 0xf3, + JPEG_MARKER_JPG4 = 0xf4, + JPEG_MARKER_JPG5 = 0xf5, + JPEG_MARKER_JPG6 = 0xf6, + JPEG_MARKER_JPG7 = 0xf7, + JPEG_MARKER_JPG8 = 0xf8, + JPEG_MARKER_JPG9 = 0xf9, + JPEG_MARKER_JPG10 = 0xfa, + JPEG_MARKER_JPG11 = 0xfb, + JPEG_MARKER_JPG12 = 0xfc, + JPEG_MARKER_JPG13 = 0xfd, + JPEG_MARKER_COM = 0xfe +} JPEGMarker; + +#define JPEG_IS_MARKER(m) (((m) >= JPEG_MARKER_SOF0) && \ + ((m) <= JPEG_MARKER_COM)) + +const char *jpeg_marker_get_name (JPEGMarker marker); +const char *jpeg_marker_get_description (JPEGMarker marker); + +#ifdef __cplusplus +} +#endif /* __cplusplus */ + +#endif /* __JPEG_MARKER_H__ */ diff --git a/src/main.c b/src/main.c new file mode 100644 index 0000000..7f43dbb --- /dev/null +++ b/src/main.c @@ -0,0 +1,299 @@ +/* + * viking -- GPS Data and Topo Analyzer, Explorer, and Manager + * + * Copyright (C) 2003-2005, Evan Battaglia + * + * 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., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA + * + */ + +#ifdef HAVE_CONFIG +#include "config.h" +#endif /* HAVE_CONFIG */ + +#include "viking.h" +#include "icons/icons.h" +#include "mapcache.h" +#include "background.h" +#include "dems.h" +#include "babel.h" +#include "curl_download.h" +#include "preferences.h" +#include "viklayer_defaults.h" +#include "globals.h" +#include "vikmapslayer.h" +#include "vikgeoreflayer.h" +#include "vikrouting.h" +#include "util.h" +#include "toolbar.h" +#include "thumbnails.h" +#include "viktrwlayer_export.h" + +#ifdef HAVE_STDLIB_H +#include +#endif +#ifdef HAVE_STRING_H +#include +#endif + +#include +#include + +#include "modules.h" + +/* FIXME LOCALEDIR must be configured by ./configure --localedir */ +/* But something does not work actually. */ +/* So, we need to redefine this variable on windows. */ +#ifdef WINDOWS +#undef LOCALEDIR +#define LOCALEDIR "locale" +#endif + +#ifdef HAVE_X11_XLIB_H +#include "X11/Xlib.h" +#endif + +#if GLIB_CHECK_VERSION (2, 32, 0) +/* Callback to log message */ +static void log_debug(const gchar *log_domain, + GLogLevelFlags log_level, + const gchar *message, + gpointer user_data) +{ + g_print("** (viking): DEBUG: %s\n", message); +} +#else +/* Callback to mute log message */ +static void mute_log(const gchar *log_domain, + GLogLevelFlags log_level, + const gchar *message, + gpointer user_data) +{ + /* Nothing to do, we just want to mute */ +} +#endif + +#if HAVE_X11_XLIB_H +static int myXErrorHandler(Display *display, XErrorEvent *theEvent) +{ + (void)g_fprintf (stderr, + _("Ignoring Xlib error: error code %d request code %d\n"), + theEvent->error_code, + theEvent->request_code); + // No exit on X errors! + // mainly to handle out of memory error when requesting large pixbuf from user request + // see vikwindow.c::save_image_file () + return 0; +} +#endif + +// Default values that won't actually get applied unless changed by command line parameter values +static gdouble latitude = 0.0; +static gdouble longitude = 0.0; +static gint zoom_level_osm = -1; +static gint map_id = -1; + +/* Options */ +static GOptionEntry entries[] = +{ + { "debug", 'd', 0, G_OPTION_ARG_NONE, &vik_debug, N_("Enable debug output"), NULL }, + { "verbose", 'V', 0, G_OPTION_ARG_NONE, &vik_verbose, N_("Enable verbose output"), NULL }, + { "version", 'v', 0, G_OPTION_ARG_NONE, &vik_version, N_("Show version"), NULL }, + { "latitude", 0, 0, G_OPTION_ARG_DOUBLE, &latitude, N_("Latitude in decimal degrees"), NULL }, + { "longitude", 0, 0, G_OPTION_ARG_DOUBLE, &longitude, N_("Longitude in decimal degrees"), NULL }, + { "zoom", 'z', 0, G_OPTION_ARG_INT, &zoom_level_osm, N_("Zoom Level (OSM). Value can be 0 - 22"), NULL }, + { "map", 'm', 0, G_OPTION_ARG_INT, &map_id, N_("Add a map layer by id value. Use 0 for the default map."), NULL }, + { NULL } +}; + +int main( int argc, char *argv[] ) +{ + VikWindow *first_window; + GdkPixbuf *main_icon; + gboolean dashdash_already = FALSE; + int i = 0; + GError *error = NULL; + gboolean gui_initialized; + + bindtextdomain (GETTEXT_PACKAGE, LOCALEDIR); + bind_textdomain_codeset (GETTEXT_PACKAGE, "UTF-8"); + textdomain (GETTEXT_PACKAGE); + +#if ! GLIB_CHECK_VERSION (2, 32, 0) + g_thread_init ( NULL ); +#endif + + gui_initialized = gtk_init_with_args (&argc, &argv, "files+", entries, NULL, &error); + if (!gui_initialized) + { + /* check if we have an error message */ + if (error == NULL) + { + /* no error message, the GUI initialization failed */ + const gchar *display_name = gdk_get_display_arg_name (); + (void)g_fprintf (stderr, "Failed to open display: %s\n", (display_name != NULL) ? display_name : " "); + } + else + { + /* yep, there's an error, so print it */ + (void)g_fprintf (stderr, "Parsing command line options failed: %s\n", error->message); + g_error_free (error); + (void)g_fprintf (stderr, "Run \"%s --help\" to see the list of recognized options.\n",argv[0]); + } + return EXIT_FAILURE; + } + + if (vik_version) + { + (void)g_printf (_("%s %s\nCopyright (c) 2003-2008 Evan Battaglia\nCopyright (c) 2008-%s Viking's contributors\n"), PACKAGE_NAME, PACKAGE_VERSION, THEYEAR); + return EXIT_SUCCESS; + } + +#if GLIB_CHECK_VERSION (2, 32, 0) + if (vik_debug) + g_log_set_handler (NULL, G_LOG_LEVEL_DEBUG, log_debug, NULL); +#else + if (!vik_debug) + g_log_set_handler (NULL, G_LOG_LEVEL_DEBUG, mute_log, NULL); +#endif + +#if HAVE_X11_XLIB_H + XSetErrorHandler(myXErrorHandler); +#endif + + // Ensure correct capitalization of the program name + g_set_application_name ("Viking"); + + // Discover if this is the very first run + a_vik_very_first_run (); + + a_settings_init (); + a_preferences_init (); + a_thumbnails_init (); + + /* + * First stage initialization + * + * Should not use a_preferences_get() yet + * + * Since the first time a_preferences_get() is called it loads any preferences values from disk, + * but of course for preferences not registered yet it can't actually understand them + * so subsequent initial attempts to get those preferences return the default value, until the values have changed + */ + a_vik_preferences_init (); + + a_layer_defaults_init (); + + a_download_init(); + curl_download_init(); + + a_babel_init (); + + /* Init modules/plugins */ + modules_init(); + + vik_georef_layer_init (); + maps_layer_init (); + a_mapcache_init (); + a_background_init (); + + a_toolbar_init(); + vik_routing_prefs_init(); + vik_trw_layer_export_init(); + + /* + * Second stage initialization + * + * Can now use a_preferences_get() + */ + a_background_post_init (); + a_babel_post_init (); + modules_post_init (); + + // May need to initialize the Positonal TimeZone lookup + if ( a_vik_get_time_ref_frame() == VIK_TIME_REF_WORLD ) + vu_setup_lat_lon_tz_lookup(); + + /* Set the icon */ + main_icon = gdk_pixbuf_from_pixdata(&viking_pixbuf, FALSE, NULL); + gtk_window_set_default_icon(main_icon); + + // Ask for confirmation of default settings on first run + vu_set_auto_features_on_first_run (); + + /* Create the first window */ + first_window = vik_window_new_window(); + + vu_check_latest_version ( GTK_WINDOW(first_window) ); + + // Load startup file first so that subsequent files are loaded on top + // Especially so that new tracks+waypoints will be above any maps in a startup file + if ( a_vik_get_startup_method () == VIK_STARTUP_METHOD_SPECIFIED_FILE ) { + gboolean load_startup_file = TRUE; + // When a viking file is to be loaded via the command line + // then we'll skip loading any startup file + int jj = 0; + while ( ++jj < argc ) { + if ( check_file_magic_vik(argv[jj]) ) + load_startup_file = FALSE; + } + if ( load_startup_file ) + vik_window_open_file ( first_window, a_vik_get_startup_file(), TRUE, TRUE, TRUE, TRUE ); + } + + while ( ++i < argc ) { + if ( strcmp(argv[i],"--") == 0 && !dashdash_already ) + dashdash_already = TRUE; /* hack to open '-' */ + else { + VikWindow *newvw = first_window; + gboolean change_filename = (i == 1); + + // Open any subsequent .vik files in their own window + if ( i > 1 && check_file_magic_vik ( argv[i] ) ) { + newvw = vik_window_new_window (); + change_filename = TRUE; + } + + vik_window_open_file ( newvw, argv[i], change_filename, (i==1), (i+1 == argc), TRUE ); + } + } + + vik_window_new_window_finish ( first_window ); + + vu_command_line ( first_window, latitude, longitude, zoom_level_osm, map_id ); + + gtk_main (); + + a_babel_uninit (); + a_toolbar_uninit (); + a_background_uninit (); + a_mapcache_uninit (); + a_dems_uninit (); + a_layer_defaults_uninit (); + a_thumbnails_uninit (); + a_preferences_uninit (); + a_settings_uninit (); + + modules_uninit(); + + curl_download_uninit(); + + vu_finalize_lat_lon_tz_lookup (); + + // Clean up any temporary files + util_remove_all_in_deletion_list (); + + return 0; +} diff --git a/src/map_ids.h b/src/map_ids.h new file mode 100644 index 0000000..d22743d --- /dev/null +++ b/src/map_ids.h @@ -0,0 +1,54 @@ +/* -*- Mode: C; indent-tabs-mode: t; c-basic-offset: 4; tab-width: 4 -*- */ +/* + * viking -- GPS Data and Topo Analyzer, Explorer, and Manager + * + * Copyright (C) 2014, Rob Norris + * + * 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., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA + * + */ +#ifndef __MAP_IDS_H +#define __MAP_IDS_H + +// OLD Terraserver ids - listed for compatibility +#define MAP_ID_TERRASERVER_AERIAL 1 +#define MAP_ID_TERRASERVER_TOPO 2 +#define MAP_ID_TERRASERVER_URBAN 4 + +#define MAP_ID_EXPEDIA 5 + +#define MAP_ID_MAPNIK_RENDER 7 + +// Mostly OSM related - except the Blue Marble value +#define MAP_ID_OSM_MAPNIK 13 +#define MAP_ID_BLUE_MARBLE 15 +#define MAP_ID_OSM_CYCLE 17 +//#define MAP_ID_MAPQUEST_OSM 19 // Tile Service discontinued +#define MAP_ID_OSM_TRANSPORT 20 +#define MAP_ID_OSM_ON_DISK 21 +#define MAP_ID_OSM_HUMANITARIAN 22 +#define MAP_ID_MBTILES 23 +#define MAP_ID_OSM_METATILES 24 +#define MAP_ID_MAPBOX_OUTDOORS 25 + +#define MAP_ID_BING_AERIAL 212 + +// Unfortunately previous ID allocations have been a little haphazard, +// but hopefully future IDs can be follow this scheme: +// 0 to 31 are intended for hard coded internal defaults +// 32-127 are intended for XML configuration map supplied defaults: see data/maps.xml +// 128 and above are intended for end user configurations. + +#endif diff --git a/src/mapcache.c b/src/mapcache.c new file mode 100644 index 0000000..585649b --- /dev/null +++ b/src/mapcache.c @@ -0,0 +1,338 @@ +/* + * viking -- GPS Data and Topo Analyzer, Explorer, and Manager + * + * Copyright (C) 2003-2005, Evan Battaglia + * + * 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., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA + * + */ +#ifdef HAVE_CONFIG_H +#include "config.h" +#endif + +#include +#include +#include +#include "globals.h" +#include "mapcache.h" +#include "preferences.h" +#include "vik_compat.h" + +#define MC_KEY_SIZE 64 + +typedef struct _List { + struct _List *next; + gchar *key; +} List; + +/* a circular linked list, a pointer to the tail, and the tail points to the head */ +/* this is so we can free the last */ +static List *queue_tail = NULL; +static int queue_count = 0; + +static guint32 cache_size = 0; +static guint32 max_cache_size = VIK_CONFIG_MAPCACHE_SIZE * 1024 * 1024; + +static GHashTable *cache = NULL; + +typedef struct { + GdkPixbuf *pixbuf; + mapcache_extra_t extra; +} cache_item_t; + +static GMutex *mc_mutex = NULL; + +#define HASHKEY_FORMAT_STRING "%d-%d-%d-%d-%d-%d-%d-%.3f-%.3f" +#define HASHKEY_FORMAT_STRING_NOSHRINK_NOR_ALPHA "%d-%d-%d-%d-%d-%d-" +#define HASHKEY_FORMAT_STRING_TYPE "%d-" + +static VikLayerParamScale params_scales[] = { + /* min, max, step, digits (decimal places) */ + { 1, 1024, 1, 0 }, +}; + +static VikLayerParam prefs[] = { + { VIK_LAYER_NUM_TYPES, VIKING_PREFERENCES_NAMESPACE "mapcache_size", VIK_LAYER_PARAM_UINT, VIK_LAYER_GROUP_NONE, N_("Map cache memory size (MB):"), VIK_LAYER_WIDGET_HSCALE, params_scales, NULL, NULL, NULL, NULL, NULL }, +}; + +static void cache_item_free (cache_item_t *ci) +{ + g_object_unref ( ci->pixbuf ); + g_free ( ci ); +} + +void a_mapcache_init () +{ + VikLayerParamData tmp; + tmp.u = VIK_CONFIG_MAPCACHE_SIZE; + a_preferences_register(prefs, tmp, VIKING_PREFERENCES_GROUP_KEY); + + mc_mutex = vik_mutex_new (); + cache = g_hash_table_new_full ( g_str_hash, g_str_equal, g_free, (GDestroyNotify) cache_item_free ); +} + +static void cache_add(gchar *key, GdkPixbuf *pixbuf, mapcache_extra_t extra) +{ + cache_item_t *ci = g_malloc ( sizeof(cache_item_t) ); + ci->pixbuf = pixbuf; + ci->extra = extra; +#if !GLIB_CHECK_VERSION(2,26,0) + // Only later versions of GLib actually return a value for this function + // Annoyingly the documentation doesn't say anything about this interface change :( + if ( g_hash_table_insert ( cache, key, ci ) ) +#else + g_hash_table_insert ( cache, key, ci ); +#endif + { + cache_size += gdk_pixbuf_get_rowstride(pixbuf) * gdk_pixbuf_get_height(pixbuf); + // ATM size of 'extra' data hardly worth trying to count (compared to pixbuf sizes) + // Not sure what this 100 represents anyway - probably a guess at an average pixbuf metadata size + cache_size += 100; + } +} + +static void cache_remove(const gchar *key) +{ + cache_item_t *ci = g_hash_table_lookup ( cache, key ); + if (ci && ci->pixbuf) { + cache_size -= gdk_pixbuf_get_rowstride(ci->pixbuf) * gdk_pixbuf_get_height(ci->pixbuf); + cache_size -= 100; + g_hash_table_remove ( cache, key ); + } +} + +/* returns key from head, adds on newtailkey to tail. */ +static gchar *list_shift_add_entry ( gchar *newtailkey ) +{ + gchar *oldheadkey = queue_tail->next->key; + queue_tail->next->key = newtailkey; + queue_tail = queue_tail->next; + return oldheadkey; +} + +static gchar *list_shift () +{ + gchar *oldheadkey = queue_tail->next->key; + List *oldhead = queue_tail->next; + queue_tail->next = queue_tail->next->next; + g_free ( oldhead ); + queue_count--; + return oldheadkey; +} + +/* adds key to tail */ +static void list_add_entry ( gchar *key ) +{ + List *newlist = g_malloc ( sizeof ( List ) ); + newlist->key = key; + if ( queue_tail ) { + newlist->next = queue_tail->next; + queue_tail->next = newlist; + queue_tail = newlist; + } else { + newlist->next = newlist; + queue_tail = newlist; + } + queue_count++; +} + +/** + * Function increments reference counter of pixbuf. + * Caller may (and should) decrease it's reference. + */ +void a_mapcache_add ( GdkPixbuf *pixbuf, mapcache_extra_t extra, gint x, gint y, gint z, guint16 type, gint zoom, guint8 alpha, gdouble xshrinkfactor, gdouble yshrinkfactor, const gchar* name ) +{ + if ( ! GDK_IS_PIXBUF(pixbuf) ) { + g_debug ( "Not caching corrupt pixbuf for maptype %d at %d %d %d %d", type, x, y, z, zoom ); + return; + } + + guint nn = name ? g_str_hash ( name ) : 0; + gchar *key = g_strdup_printf ( HASHKEY_FORMAT_STRING, type, x, y, z, zoom, nn, alpha, xshrinkfactor, yshrinkfactor ); + + g_mutex_lock(mc_mutex); + g_object_ref(pixbuf); + cache_add(key, pixbuf, extra); + + // TODO: that should be done on preference change only... + max_cache_size = a_preferences_get(VIKING_PREFERENCES_NAMESPACE "mapcache_size")->u * 1024 * 1024; + + if ( cache_size > max_cache_size ) { + if ( queue_tail ) { + gchar *oldkey = list_shift_add_entry ( key ); + cache_remove(oldkey); + + while ( cache_size > max_cache_size && + (queue_tail->next != queue_tail) ) { /* make sure there's more than one thing to delete */ + oldkey = list_shift (); + cache_remove(oldkey); + } + } + /* chop off 'start' etc */ + } else { + list_add_entry ( key ); + /* business as usual */ + } + g_mutex_unlock(mc_mutex); + + static int tmp = 0; + if ( (++tmp == 100 )) { g_debug("DEBUG: cache count=%d size=%u list count=%d\n", g_hash_table_size(cache), cache_size, queue_count ); tmp=0; } +} + +/** + * Function increases reference counter of pixels buffer in behalf of caller. + * Caller have to decrease references counter, when buffer is no longer needed. + */ +GdkPixbuf *a_mapcache_get ( gint x, gint y, gint z, guint16 type, gint zoom, guint8 alpha, gdouble xshrinkfactor, gdouble yshrinkfactor, const gchar* name ) +{ + static char key[MC_KEY_SIZE]; + guint nn = name ? g_str_hash ( name ) : 0; + g_snprintf ( key, sizeof(key), HASHKEY_FORMAT_STRING, type, x, y, z, zoom, nn, alpha, xshrinkfactor, yshrinkfactor ); + g_mutex_lock(mc_mutex); /* prevent returning pixbuf when cache is being cleared */ + cache_item_t *ci = g_hash_table_lookup ( cache, key ); + if ( ci ) { + g_object_ref(ci->pixbuf); + g_mutex_unlock(mc_mutex); + return ci->pixbuf; + } else { + g_mutex_unlock(mc_mutex); + return NULL; + } +} + +mapcache_extra_t a_mapcache_get_extra ( gint x, gint y, gint z, guint16 type, gint zoom, guint8 alpha, gdouble xshrinkfactor, gdouble yshrinkfactor, const gchar* name ) +{ + static char key[MC_KEY_SIZE]; + guint nn = name ? g_str_hash ( name ) : 0; + g_snprintf ( key, sizeof(key), HASHKEY_FORMAT_STRING, type, x, y, z, zoom, nn, alpha, xshrinkfactor, yshrinkfactor ); + cache_item_t *ci = g_hash_table_lookup ( cache, key ); + if ( ci ) + return ci->extra; + else + return (mapcache_extra_t) { 0.0 }; +} + +/** + * Common function to remove cache items for keys starting with the specified string + */ +static void flush_matching ( gchar *str ) +{ + g_mutex_lock(mc_mutex); + + if ( queue_tail == NULL ) { + g_mutex_unlock(mc_mutex); + return; + } + + // The 'loop' variable must be assigned within the mutex lock section, + // otherwise where it points to might not be valid anymore when the actual processing occurs + List *loop = queue_tail; + List *tmp; + gint len = strlen(str); + + do { + tmp = loop->next; + if ( tmp ) { + if ( strncmp(tmp->key, str, len) == 0 ) + { + cache_remove(tmp->key); + if ( tmp == loop ) /* we deleted the last thing in the queue! */ + loop = queue_tail = NULL; + else { + loop->next = tmp->next; + if ( tmp == queue_tail ) + queue_tail = tmp->next; + } + g_free ( tmp ); + tmp = NULL; + queue_count--; + } + else + loop = tmp; + } else + loop = NULL; + } while ( loop && (loop != queue_tail || tmp == NULL) ); + /* loop thru list, looking for the one, compare first whatever chars */ + + cache_remove(str); + g_mutex_unlock(mc_mutex); +} + +/** + * Appears this is only used when redownloading tiles (i.e. to invalidate old images) + */ +void a_mapcache_remove_all_shrinkfactors ( gint x, gint y, gint z, guint16 type, gint zoom, const gchar* name ) +{ + char key[MC_KEY_SIZE]; + guint nn = name ? g_str_hash ( name ) : 0; + g_snprintf ( key, sizeof(key), HASHKEY_FORMAT_STRING_NOSHRINK_NOR_ALPHA, type, x, y, z, zoom, nn ); + flush_matching ( key ); +} + +void a_mapcache_flush () +{ + // Everything happens within the mutex lock section + g_mutex_lock(mc_mutex); + + List *loop = queue_tail; + List *tmp; + + while ( loop ) { + tmp = loop->next; + cache_remove(tmp->key); + if ( tmp == queue_tail ) /* we deleted the last thing in the queue */ + loop = queue_tail = NULL; + else + loop->next = tmp->next; + g_free ( tmp ); + tmp = NULL; + } + + g_mutex_unlock(mc_mutex); +} + +/** + * a_mapcache_flush_type: + * @type: Specified map type + * + * Just remove cache items for the specified map type + * i.e. all related xyz+zoom+alpha+etc... + */ +void a_mapcache_flush_type ( guint16 type ) +{ + char key[MC_KEY_SIZE]; + g_snprintf ( key, sizeof(key), HASHKEY_FORMAT_STRING_TYPE, type ); + flush_matching ( key ); +} + +void a_mapcache_uninit () +{ + g_hash_table_destroy ( cache ); + /* free list */ + cache = NULL; + vik_mutex_free (mc_mutex); +} + +// Size of mapcache in memory +gint a_mapcache_get_size () +{ + return cache_size; +} + +// Count of items in the mapcache +gint a_mapcache_get_count () +{ + return g_hash_table_size ( cache ); +} diff --git a/src/mapcache.h b/src/mapcache.h new file mode 100644 index 0000000..debc693 --- /dev/null +++ b/src/mapcache.h @@ -0,0 +1,48 @@ +/* + * viking -- GPS Data and Topo Analyzer, Explorer, and Manager + * + * Copyright (C) 2003-2005, Evan Battaglia + * + * 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., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA + * + */ + +#ifndef __VIKING_MAPCACHE_H +#define __VIKING_MAPCACHE_H + +#include +#include + +G_BEGIN_DECLS + +typedef struct { + gdouble duration; // Mostly for Mapnik Rendering duration - negative values indicate not rendered (i.e. read from disk) +} mapcache_extra_t; + +void a_mapcache_init (); +void a_mapcache_add ( GdkPixbuf *pixbuf, mapcache_extra_t extra, gint x, gint y, gint z, guint16 type, gint zoom, guint8 alpha, gdouble xshrinkfactor, gdouble yshrinkfactor, const gchar *name ); +GdkPixbuf *a_mapcache_get ( gint x, gint y, gint z, guint16 type, gint zoom, guint8 alpha, gdouble xshrinkfactor, gdouble yshrinkfactor, const gchar *name ); +mapcache_extra_t a_mapcache_get_extra ( gint x, gint y, gint z, guint16 type, gint zoom, guint8 alpha, gdouble xshrinkfactor, gdouble yshrinkfactor, const gchar* name ); +void a_mapcache_remove_all_shrinkfactors ( gint x, gint y, gint z, guint16 type, gint zoom, const gchar* name ); +void a_mapcache_flush (); +void a_mapcache_flush_type ( guint16 type ); +void a_mapcache_uninit (); + +gint a_mapcache_get_size (); +gint a_mapcache_get_count (); + +G_END_DECLS + +#endif diff --git a/src/mapcoord.h b/src/mapcoord.h new file mode 100644 index 0000000..1b50eda --- /dev/null +++ b/src/mapcoord.h @@ -0,0 +1,40 @@ +/* + * viking -- GPS Data and Topo Analyzer, Explorer, and Manager + * + * Copyright (C) 2003-2005, Evan Battaglia + * + * 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., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA + * + */ + +#ifndef __MAP_COORD_H +#define __MAP_COORD_H + +#include + +G_BEGIN_DECLS + +/* common struct to all map types and map layer, to hold info about a + * particular tile */ + +typedef struct { + gint x, y; + gint z; /* zone or anything else */ + gint scale; +} MapCoord; + +G_END_DECLS + +#endif diff --git a/src/mapnik_interface.cpp b/src/mapnik_interface.cpp new file mode 100644 index 0000000..45ba4a1 --- /dev/null +++ b/src/mapnik_interface.cpp @@ -0,0 +1,330 @@ +/* -*- Mode: C; indent-tabs-mode: t; c-basic-offset: 4; tab-width: 4 -*- */ +/* + * viking -- GPS Data and Topo Analyzer, Explorer, and Manager + * + * Copyright (C) 2015, Rob Norris + * + * 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., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA + * + */ +#include +#include +#include +#include +#include +#include +#if MAPNIK_VERSION < 300000 +#include +#else +#include +#endif +#include + +#include +#include +#include +#include +#include + +#include +#include +#include + +#include "mapnik_interface.h" +#include "globals.h" +#include "settings.h" + +#if MAPNIK_VERSION < 200000 +#include +#define image_32 Image32 +#define image_data_32 ImageData32 +#define box2d Envelope +#define zoom_to_box zoomToBox +#else +#include +#if MAPNIK_VERSION >= 300000 +// In Mapnik3 'image_32' has changed names once again +#define image_32 image_rgba8 +#define raw_data data +#endif +#endif + +#define MAPNIK_INTERFACE_TYPE (mapnik_interface_get_type ()) +#define MAPNIK_INTERFACE(obj) (G_TYPE_CHECK_INSTANCE_CAST ((obj), MAPNIK_INTERFACE_TYPE, MapnikInterface)) +#define MAPNIK_INTERFACE_CLASS(klass) (G_TYPE_CHECK_CLASS_CAST ((klass), MAPNIK_INTERFACE_TYPE, MapnikInterfaceClass)) +#define IS_MAPNIK_INTERFACE(obj) (G_TYPE_CHECK_INSTANCE_TYPE ((obj), MAPNIK_INTERFACE_TYPE)) +#define IS_MAPNIK_INTERFACE_CLASS(klass) (G_TYPE_CHECK_CLASS_TYPE ((klass), MAPNIK_INTERFACE_TYPE)) + +typedef struct _MapnikInterfaceClass MapnikInterfaceClass; +typedef struct _MapnikInterface MapnikInterface; + +GType mapnik_interface_get_type (); +struct _MapnikInterfaceClass +{ + GObjectClass object_class; +}; + +static void mapnik_interface_class_init ( MapnikInterfaceClass *mic ) +{ +} + +static void mapnik_interface_init ( MapnikInterface *mi ) +{ +} + +struct _MapnikInterface { + GObject obj; + mapnik::Map *myMap; + gchar *copyright; // Cached Mapnik parameter to save looking it up each time +}; + +G_DEFINE_TYPE (MapnikInterface, mapnik_interface, G_TYPE_OBJECT) + +// Can't change prj after init - but ATM only support drawing in Spherical Mercator +static mapnik::projection prj( mapnik::MAPNIK_GMERC_PROJ ); + +MapnikInterface* mapnik_interface_new () +{ + MapnikInterface* mi = MAPNIK_INTERFACE ( g_object_new ( MAPNIK_INTERFACE_TYPE, NULL ) ); + mi->myMap = new mapnik::Map; + mi->copyright = NULL; + return mi; +} + +void mapnik_interface_free (MapnikInterface* mi) +{ + if ( mi ) { + g_free ( mi->copyright ); + delete mi->myMap; + } + g_object_unref ( G_OBJECT(mi) ); +} + +/** + * mapnik_interface_initialize: + */ +void mapnik_interface_initialize (const char *plugins_dir, const char* font_dir, int font_dir_recurse) +{ + g_debug ("using mapnik version %s", MAPNIK_VERSION_STRING ); + try { + if ( plugins_dir ) +#if MAPNIK_VERSION >= 200200 + mapnik::datasource_cache::instance().register_datasources(plugins_dir); +#else + mapnik::datasource_cache::instance()->register_datasources(plugins_dir); +#endif + if ( font_dir ) + if ( ! mapnik::freetype_engine::register_fonts(font_dir, font_dir_recurse ? true : false) ) + g_warning ("%s: No fonts found", __FUNCTION__); + } catch (std::exception const& ex) { + g_warning ("An error occurred while initialising mapnik: %s", ex.what()); + } catch (...) { + g_warning ("An unknown error occurred while initialising mapnik"); + } +} + +/** + * caching this answer instead of looking it up each time + */ +static void set_copyright ( MapnikInterface* mi ) +{ + g_free ( mi->copyright ); + mi->copyright = NULL; + + mapnik::parameters pmts = mi->myMap->get_extra_parameters(); +#if MAPNIK_VERSION < 300000 + for (mapnik::parameters::const_iterator ii = pmts.begin(); ii != pmts.end(); ii++) { + if ( ii->first == "attribution" || ii->first == "copyright" ) { + std::stringstream ss; + ss << ii->second; + // Copy it + mi->copyright = g_strdup ( (gchar*)ss.str().c_str() ); + break; + } + } +#else + if ( pmts.get("attribution") ) + mi->copyright = g_strdup ( (*pmts.get("attribution")).c_str() ); + + if ( !mi->copyright ) + if ( pmts.get("copyright") ) + mi->copyright = g_strdup ( (*pmts.get("copyright")).c_str() ); +#endif +} + +#define VIK_SETTINGS_MAPNIK_BUFFER_SIZE "mapnik_buffer_size" + +/** + * mapnik_interface_load_map_file: + * + * Returns NULL on success otherwise a string about what went wrong. + * This string should be freed once it has been used. + */ +gchar* mapnik_interface_load_map_file ( MapnikInterface* mi, + const gchar *filename, + guint width, + guint height ) +{ + gchar *msg = NULL; + if ( !mi ) return g_strdup ("Internal Error"); + try { + mi->myMap->remove_all(); // Support reloading + mapnik::load_map(*mi->myMap, filename); + + mi->myMap->resize(width,height); + mi->myMap->set_srs ( mapnik::MAPNIK_GMERC_PROJ ); // ONLY WEB MERCATOR output supported ATM + + // IIRC This size is the number of pixels outside the tile to be considered so stuff is shown (i.e. particularly labels) + // Only set buffer size if the buffer size isn't explicitly set in the mapnik stylesheet. + // Alternatively render a bigger 'virtual' tile and then only use the appropriate subset + if (mi->myMap->buffer_size() == 0) { + gint buffer_size = (width+height/4); // e.g. 128 for a 256x256 image. + gint tmp; + if ( a_settings_get_integer ( VIK_SETTINGS_MAPNIK_BUFFER_SIZE, &tmp ) ) + buffer_size = tmp; + + mi->myMap->set_buffer_size(buffer_size); + } + + set_copyright ( mi ); + + g_debug ("%s layers: %d", __FUNCTION__, (guint)mi->myMap->layer_count() ); + } catch (std::exception const& ex) { + msg = g_strdup ( ex.what() ); + } catch (...) { + msg = g_strdup ("unknown error"); + } + return msg; +} + + +/** + * mapnik_interface_render: + * + * Returns a #GdkPixbuf of the specified area. #GdkPixbuf may be NULL + */ +GdkPixbuf* mapnik_interface_render ( MapnikInterface* mi, double lat_tl, double lon_tl, double lat_br, double lon_br ) +{ + if ( !mi ) return NULL; + + // Copy main object to local map variable + // This enables rendering to work when this function is called from different threads + mapnik::Map myMap(*mi->myMap); + + // Note prj & bbox want stuff in lon,lat order! + double p0x = lon_tl; + double p0y = lat_tl; + double p1x = lon_br; + double p1y = lat_br; + + // Convert into projection coordinates for bbox + prj.forward(p0x, p0y); + prj.forward(p1x, p1y); + + GdkPixbuf *pixbuf = NULL; + try { + unsigned width = myMap.width(); + unsigned height = myMap.height(); + mapnik::image_32 image(width,height); + mapnik::box2d bbox(p0x, p0y, p1x, p1y); + myMap.zoom_to_box(bbox); + // FUTURE: option to use cairo / grid renderers? + mapnik::agg_renderer render(myMap,image); + render.apply(); + + if ( image.painted() ) { + unsigned char *ImageRawDataPtr = (unsigned char *) g_malloc(width * 4 * height); + if (!ImageRawDataPtr) + return NULL; + memcpy(ImageRawDataPtr, image.raw_data(), width * height * 4); + pixbuf = gdk_pixbuf_new_from_data(ImageRawDataPtr, GDK_COLORSPACE_RGB, TRUE, 8, width, height, width * 4, NULL, NULL); + } + else + g_warning ("%s not rendered", __FUNCTION__ ); + } + catch (const std::exception & ex) { + g_warning ("An error occurred while rendering: %s", ex.what()); + } catch (...) { + g_warning ("An unknown error occurred while rendering"); + } + + return pixbuf; +} + +/** + * Copyright/Attribution information about the Map - string maybe NULL + * + * Free returned string after use + */ +gchar* mapnik_interface_get_copyright ( MapnikInterface* mi ) +{ + if ( !mi ) return NULL; + return mi->copyright; +} + +/** + * 'Parameter' information about the Map configuration + * + * Free every string element and the returned GArray itself after use + */ +GArray* mapnik_interface_get_parameters ( MapnikInterface* mi ) +{ + GArray *array = g_array_new (FALSE, TRUE, sizeof(gchar*)); + + mapnik::parameters pmts = mi->myMap->get_extra_parameters(); + // Simply want the strings of each parameter so we can display something... +#if MAPNIK_VERSION < 300000 + for (mapnik::parameters::const_iterator pmt = pmts.begin(); pmt != pmts.end(); pmt++) { + std::stringstream ss; + ss << pmt->first << ": " << pmt->second; +#else + for (auto const& pmt : pmts) { + std::stringstream ss; + ss << pmt.first << ": " << *(pmts.get(pmt.first,"empty")); +#endif + // Copy - otherwise ss goes output scope and junk memory would be referenced. + gchar *str2 = g_strdup ( (gchar*)ss.str().c_str() ); + g_array_append_val ( array, str2 ); + } + + return array; +} + +/** + * General information about Mapnik + * + * Free the returned string after use + */ +gchar * mapnik_interface_about ( void ) +{ + // Normally about 10 plugins so list them all +#if MAPNIK_VERSION >= 200200 + std::vector plugins = mapnik::datasource_cache::instance().plugin_names(); +#else + std::vector plugins = mapnik::datasource_cache::instance()->plugin_names(); +#endif + std::string str; + for (uint nn = 0; nn < plugins.size(); nn++ ) + str += plugins[nn] + ','; + str += '\n'; + // NB Can have a couple hundred fonts loaded when using system directories + // So ATM don't list them all - otherwise need better GUI feedback display. + gchar *msg = g_strdup_printf ( _("%s %s\nPlugins=%sFonts loaded=%d"), + _("Mapnik"), + MAPNIK_VERSION_STRING, + str.c_str(), + (guint)mapnik::freetype_engine::face_names().size() ); + return msg; +} diff --git a/src/mapnik_interface.h b/src/mapnik_interface.h new file mode 100644 index 0000000..f7f3a7b --- /dev/null +++ b/src/mapnik_interface.h @@ -0,0 +1,56 @@ +/* -*- Mode: C; indent-tabs-mode: t; c-basic-offset: 4; tab-width: 4 -*- */ +/* + * viking -- GPS Data and Topo Analyzer, Explorer, and Manager + * + * Copyright (C) 2015, Rob Norris + * + * 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., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA + * + */ +#ifndef __VIKING_MAPNIK_IF_H +#define __VIKING_MAPNIK_IF_H + +#ifdef __cplusplus +extern "C" { +#endif + +#include +#include + +typedef struct _MapnikInterface MapnikInterface; + +void mapnik_interface_initialize (const char *plugins_dir, const char* font_dir, int font_dir_recurse); + +MapnikInterface* mapnik_interface_new (); +void mapnik_interface_free (MapnikInterface* mi); + +gchar* mapnik_interface_load_map_file ( MapnikInterface* mi, + const gchar *filename, + guint width, + guint height ); + +GdkPixbuf* mapnik_interface_render ( MapnikInterface* mi, double lat_tl, double lon_tl, double lat_br, double lon_br ); + +gchar* mapnik_interface_get_copyright ( MapnikInterface* mi ); + +GArray* mapnik_interface_get_parameters ( MapnikInterface* mi ); + +gchar * mapnik_interface_about ( void ); + +#ifdef __cplusplus +} +#endif + +#endif diff --git a/src/maputils.c b/src/maputils.c new file mode 100644 index 0000000..8890a13 --- /dev/null +++ b/src/maputils.c @@ -0,0 +1,156 @@ +/* -*- Mode: C; indent-tabs-mode: t; c-basic-offset: 4; tab-width: 4 -*- */ +/* + * viking -- GPS Data and Topo Analyzer, Explorer, and Manager + * + * Copyright (C) 2013-2014, Rob Norris + * + * 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., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA + * + */ +#include "maputils.h" +#include "globals.h" +#include + +// World Scale: VIK_GZ(17) +// down to +// Submeter scale: 1/VIK_GZ(5) +// No map provider is going to have tiles at the highest zoom in level - but we can interpolate to that. + +static const gdouble scale_mpps[] = { VIK_GZ(0), VIK_GZ(1), VIK_GZ(2), VIK_GZ(3), VIK_GZ(4), VIK_GZ(5), + VIK_GZ(6), VIK_GZ(7), VIK_GZ(8), VIK_GZ(9), VIK_GZ(10), VIK_GZ(11), + VIK_GZ(12), VIK_GZ(13), VIK_GZ(14), VIK_GZ(15), VIK_GZ(16), VIK_GZ(17) }; +static const gint num_scales = (sizeof(scale_mpps) / sizeof(scale_mpps[0])); + +static const gdouble scale_neg_mpps[] = { 1.0/VIK_GZ(0), 1.0/VIK_GZ(1), 1.0/VIK_GZ(2), + 1.0/VIK_GZ(3), 1.0/VIK_GZ(4), 1.0/VIK_GZ(5) }; +static const gint num_scales_neg = (sizeof(scale_neg_mpps) / sizeof(scale_neg_mpps[0])); + +#define ERROR_MARGIN 0.01 +/** + * map_utils_mpp_to_scale: + * @mpp: The so called 'mpp' + * + * Returns: the zoom scale value which may be negative. + */ +gint map_utils_mpp_to_scale ( gdouble mpp ) { + gint i; + for ( i = 0; i < num_scales; i++ ) { + if ( ABS(scale_mpps[i] - mpp) < ERROR_MARGIN ) { + return i; + } + } + for ( i = 0; i < num_scales_neg; i++ ) { + if ( ABS(scale_neg_mpps[i] - mpp) < 0.000001 ) { + return -i; + } + } + + return 255; +} + +/** + * map_utils_mpp_to_zoom_level: + * @mpp: The so called 'mpp' + * + * Returns: a Zoom Level + * See: http://wiki.openstreetmap.org/wiki/Zoom_levels + */ +guint8 map_utils_mpp_to_zoom_level ( gdouble mpp ) +{ + gint answer = 17 - map_utils_mpp_to_scale ( mpp ); + if ( answer < 0 ) + answer = 17; + return answer; +} + +/** + * SECTION:maputils + * @short_description: Notes about TMS / Spherical Mercator conversion + * + * VikCoords are in Spherical Mercator projection (#VIK_COORD_LATLON) + * MapCoords are in Inverse TMS + * + * See: http://docs.openlayers.org/library/spherical_mercator.html + * See: http://wiki.osgeo.org/wiki/Tile_Map_Service_Specification + * NB: the Y axis is inverted, ie the origin is at top-left corner. + */ + +/** + * map_utils_vikcoord_to_iTMS: + * @src: Original #VikCoord in #VIK_COORD_LATLON format + * @xzoom: Viking zoom level in x direction + * @yzoom: Viking zoom level in y direction (actually needs to be same as xzoom) + * @dest: The resulting Inverse TMS coordinates in #MapCoord + * + * Convert a #VikCoord in VIK_COORD_LATLON format into Inverse TMS coordinates + * + * Returns: whether the conversion was performed + */ +gboolean map_utils_vikcoord_to_iTMS ( const VikCoord *src, gdouble xzoom, gdouble yzoom, MapCoord *dest ) +{ + if ( src->mode != VIK_COORD_LATLON ) + return FALSE; + + if ( xzoom != yzoom ) + return FALSE; + + dest->scale = map_utils_mpp_to_scale ( xzoom ); + if ( dest->scale == 255 ) + return FALSE; + + dest->x = (src->east_west + 180) / 360 * VIK_GZ(17) / xzoom; + dest->y = (180 - MERCLAT(src->north_south)) / 360 * VIK_GZ(17) / xzoom; + dest->z = 0; + + return TRUE; +} + +// Internal convenience function +static void _to_vikcoord_with_offset ( const MapCoord *src, VikCoord *dest, gdouble offset ) +{ + gdouble socalled_mpp; + if (src->scale >= 0) + socalled_mpp = VIK_GZ(src->scale); + else + socalled_mpp = 1.0/VIK_GZ(-src->scale); + dest->mode = VIK_COORD_LATLON; + dest->east_west = ((src->x+offset) / VIK_GZ(17) * socalled_mpp * 360) - 180; + dest->north_south = DEMERCLAT(180 - ((src->y+offset) / VIK_GZ(17) * socalled_mpp * 360)); +} + +/** + * map_utils_iTMS_to_center_vikcoord: + * @src: Original #MapCoord in Inverse TMS format + * @dest: The resulting Spherical Mercator coordinates in #VikCoord + * + * Convert a #MapCoord in Inverse TMS format into Spherical Mercator coordinates for the center of the TMS area + */ +void map_utils_iTMS_to_center_vikcoord ( const MapCoord *src, VikCoord *dest ) +{ + _to_vikcoord_with_offset ( src, dest, 0.5 ); +} + +/** + * map_utils_iTMS_to_vikcoord: + * @src: Original #MapCoord in Inverse TMS format + * @dest: The resulting Spherical Mercator coordinates in #VikCoord + * + * Convert a #MapCoord in Inverse TMS format into Spherical Mercator coordinates + * (for the top left corner of the Inverse TMS area) + */ +void map_utils_iTMS_to_vikcoord ( const MapCoord *src, VikCoord *dest ) +{ + _to_vikcoord_with_offset ( src, dest, 0.0 ); +} diff --git a/src/maputils.h b/src/maputils.h new file mode 100644 index 0000000..6a51dd2 --- /dev/null +++ b/src/maputils.h @@ -0,0 +1,47 @@ +/* -*- Mode: C; indent-tabs-mode: t; c-basic-offset: 4; tab-width: 4 -*- */ +/* + * viking -- GPS Data and Topo Analyzer, Explorer, and Manager + * + * Copyright (C) 2013-2014, Rob Norris + * + * 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., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA + * + */ +#ifndef _MAP_UTILS_H +#define _MAP_UTILS_H + +#include +#include "mapcoord.h" +#include "vikcoord.h" + +G_BEGIN_DECLS + +/* 1 << (x) is like a 2**(x) */ +#define VIK_GZ(x) ((1<<(x))) +// Not sure what GZ stands for probably Google Zoom + +gint map_utils_mpp_to_scale ( gdouble mpp ); + +guint8 map_utils_mpp_to_zoom_level ( gdouble mpp ); + +gboolean map_utils_vikcoord_to_iTMS ( const VikCoord *src, gdouble xzoom, gdouble yzoom, MapCoord *dest ); + +void map_utils_iTMS_to_center_vikcoord ( const MapCoord *src, VikCoord *dest ); + +void map_utils_iTMS_to_vikcoord ( const MapCoord *src, VikCoord *dest ); + +G_BEGIN_DECLS + +#endif diff --git a/src/md5_hash.c b/src/md5_hash.c new file mode 100644 index 0000000..eaec835 --- /dev/null +++ b/src/md5_hash.c @@ -0,0 +1,61 @@ +/* + * viking -- GPS Data and Topo Analyzer, Explorer, and Manager + * + * Copyright (C) 2016 Rob Norris + * + * 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., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA + * + */ +#include "md5_hash.h" +#include +#include +#include +#ifdef HAVE_CONFIG_H +#include "config.h" +#endif +#ifdef HAVE_LIBNETTLE +#include +#endif + +/** + * Get MD5 hash of a string using a library function + */ +char *md5_hash(const char *message) +{ + char *answer = NULL; +#ifdef HAVE_LIBNETTLE + unsigned char result[16]; + MD5_CTX ctx; + MD5Init ( &ctx ); + MD5Update ( &ctx, (const unsigned char*)message, strlen(message) ); + MD5Final ( &result[0], &ctx ); + /* + g_printf ( "%s: of string '%s' is: ", __FUNCTION__, message ); + for(int i = 0; i < 16; i++) + g_printf ( "%02x", result[i]); + g_printf("\n"); + */ + // Should be nicer way of converting this but I can't think of one ATM + answer = g_strdup_printf ( "%02x%02x%02x%02x%02x%02x%02x%02x%02x%02x%02x%02x%02x%02x%02x%02x", + result[0],result[1],result[2],result[3],result[4],result[5],result[6],result[7], + result[8],result[9],result[10],result[11],result[12],result[13],result[14],result[15]); +#else + // Return something that might vaguely work in case you've disabled MD5 support + // but you should know what you've doing and uses of it (such as thumbnail caching) now won't work well + guint value = g_str_hash ( message ); + answer = g_strdup_printf ( "%d", value ); +#endif + return answer; +} diff --git a/src/md5_hash.h b/src/md5_hash.h new file mode 100644 index 0000000..2ff4f30 --- /dev/null +++ b/src/md5_hash.h @@ -0,0 +1,32 @@ +/* + * viking -- GPS Data and Topo Analyzer, Explorer, and Manager + * + * Copyright (C) 2016 Rob Norris + * + * 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., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA + * + */ +#ifndef __VIKING_MD5_H +#define __VIKING_MD5_H + +#include + +G_BEGIN_DECLS + +char *md5_hash(const char *message); + +G_END_DECLS + +#endif diff --git a/src/menu.xml.h b/src/menu.xml.h new file mode 100644 index 0000000..6ba84e4 --- /dev/null +++ b/src/menu.xml.h @@ -0,0 +1,132 @@ +#ifndef __VIKING_MENU_XML_H +#define __VIKING_MENU_XML_H + +static const char *menu_xml = + "" + " " + " " + " " + " " + " " + " " + " " + " " + " " + " " + " " + " " + " " + " " + " " + " " +#ifdef VIK_CONFIG_OPENSTREETMAP + " " + " " +#endif +#ifdef VIK_CONFIG_GEOCACHES + " " +#endif +#ifdef VIK_CONFIG_GEOTAG + " " +#endif + " " +#ifdef VIK_CONFIG_GEONAMES + " " +#endif + " " +#ifdef HAVE_ZIP_H + " " +#endif + " " +#ifdef HAVE_ZIP_H + " " +#endif + " " + " " + " " + " " + " " + " " + " " + " " + " " + " " + " " + " " + " " + " " + " " + " " + " " + " " + " " + " " + " " + " " +#ifdef VIK_CONFIG_EXPEDIA + " " +#endif + " " + " " + " " + " " + " " + " " + " " + " " + " " + " " + " " + " " + " " + " " + " " + " " + " " + " " + " " + " " + " " + " " + " " + " " + " " + " " + " " + " " + " " + " " + " " + " " + " " + " " + " " + " " + " " + " " + " " + " " + " " + " " + " " + " " + " " + " " + " " + " " + " " + " " + " " + " " + " " + " " + " " + " " + " " + " " + " " + " " + "" +; + +#endif diff --git a/src/metatile.c b/src/metatile.c new file mode 100644 index 0000000..516ec8f --- /dev/null +++ b/src/metatile.c @@ -0,0 +1,191 @@ +/* -*- Mode: C; indent-tabs-mode: t; c-basic-offset: 4; tab-width: 4 -*- */ +/* + * viking -- GPS Data and Topo Analyzer, Explorer, and Manager + * + * Copyright (C) 2014, Rob Norris + * + * 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., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA + * + */ +/* + * Mostly imported from https://github.com/openstreetmap/mod_tile/ + * Release 0.4 + */ +#include +#include +#include +#include +#include +#include +#include +#include +#include + +#include "metatile.h" +/** + * metatile.h + */ +#define META_MAGIC "META" +#define META_MAGIC_COMPRESSED "METZ" + +struct entry { + int offset; + int size; +}; + +struct meta_layout { + char magic[4]; // META_MAGIC or META_MAGIC_COMPRESSED + int count; // METATILE ^ 2 + int x, y, z; // lowest x,y of this metatile, plus z + struct entry index[]; // count entries + // Followed by the tile data + // The index offsets are measured from the start of the file +}; + +// Use this to enable meta-tiles which will render NxN tiles at once +// Note: This should be a power of 2 (2, 4, 8, 16 ...) +#define METATILE (8) + +/** + * xyz_to_meta: + * Based on function from mod_tile/src/store_file_utils.c + * + * Returns the path to the meta-tile and the offset within the meta-tile + */ +int xyz_to_meta(char *path, size_t len, const char *dir, int x, int y, int z) +{ + unsigned char i, hash[5], offset, mask; + + // Each meta tile winds up in its own file, with several in each leaf directory + // the .meta tile name is based on the sub-tile at (0,0) + mask = METATILE - 1; + offset = (x & mask) * METATILE + (y & mask); + x &= ~mask; + y &= ~mask; + + for (i=0; i<5; i++) { + hash[i] = ((x & 0x0f) << 4) | (y & 0x0f); + x >>= 4; + y >>= 4; + } + + snprintf(path, len, "%s/%d/%u/%u/%u/%u/%u.meta", dir, z, hash[4], hash[3], hash[2], hash[1], hash[0]); + return offset; +} + +/** + * metatile_read: + * From function in mod_tile/src/store_file.c + * Slightly reworked to use simplified xyz_to_meta() above + * + * Reads into buf upto size specified by sz + * + * Returns whether the file is in a compressed format (possibly only gzip) + * + * Error messages returned in log_msg + */ +int metatile_read(const char *dir, int x, int y, int z, char *buf, size_t sz, int * compressed, char * log_msg) +{ + char path[PATH_MAX]; + int meta_offset, fd; + unsigned int pos; + unsigned int header_len = sizeof(struct meta_layout) + METATILE*METATILE*sizeof(struct entry); + struct meta_layout *meta = (struct meta_layout *)malloc(header_len); + size_t file_offset, tile_size; + + meta_offset = xyz_to_meta(path, sizeof(path), dir, x, y, z); + + fd = open(path, O_RDONLY); + if (fd < 0) { + snprintf(log_msg,PATH_MAX - 1, "Could not open metatile %s. Reason: %s\n", path, strerror(errno)); + free(meta); + return -1; + } + + pos = 0; + while (pos < header_len) { + size_t len = header_len - pos; + int got = read(fd, ((unsigned char *) meta) + pos, len); + if (got < 0) { + snprintf(log_msg,PATH_MAX - 1, "Failed to read complete header for metatile %s Reason: %s\n", path, strerror(errno)); + close(fd); + free(meta); + return -2; + } else if (got > 0) { + pos += got; + } else { + break; + } + } + if (pos < header_len) { + snprintf(log_msg,PATH_MAX - 1, "Meta file %s too small to contain header\n", path); + close(fd); + free(meta); + return -3; + } + if (memcmp(meta->magic, META_MAGIC, strlen(META_MAGIC))) { + if (memcmp(meta->magic, META_MAGIC_COMPRESSED, strlen(META_MAGIC_COMPRESSED))) { + snprintf(log_msg,PATH_MAX - 1, "Meta file %s header magic mismatch\n", path); + close(fd); + free(meta); + return -4; + } else { + *compressed = 1; + } + } else *compressed = 0; + + // Currently this code only works with fixed metatile sizes (due to xyz_to_meta above) + if (meta->count != (METATILE * METATILE)) { + snprintf(log_msg, PATH_MAX - 1, "Meta file %s header bad count %d != %d\n", path, meta->count, METATILE * METATILE); + free(meta); + close(fd); + return -5; + } + + file_offset = meta->index[meta_offset].offset; + tile_size = meta->index[meta_offset].size; + + free(meta); + + if (tile_size > sz) { + snprintf(log_msg, PATH_MAX - 1, "Truncating tile %zd to fit buffer of %zd\n", tile_size, sz); + tile_size = sz; + close(fd); + return -6; + } + + if (lseek(fd, file_offset, SEEK_SET) < 0) { + snprintf(log_msg, PATH_MAX - 1, "Meta file %s seek error: %s\n", path, strerror(errno)); + close(fd); + return -7; + } + + pos = 0; + while (pos < tile_size) { + size_t len = tile_size - pos; + int got = read(fd, buf + pos, len); + if (got < 0) { + snprintf(log_msg, PATH_MAX - 1, "Failed to read data from file %s. Reason: %s\n", path, strerror(errno)); + close(fd); + return -8; + } else if (got > 0) { + pos += got; + } else { + break; + } + } + close(fd); + return pos; +} diff --git a/src/metatile.h b/src/metatile.h new file mode 100644 index 0000000..0206133 --- /dev/null +++ b/src/metatile.h @@ -0,0 +1,28 @@ +/* -*- Mode: C; indent-tabs-mode: t; c-basic-offset: 4; tab-width: 4 -*- */ +/* + * viking -- GPS Data and Topo Analyzer, Explorer, and Manager + * + * Copyright (C) 2014, Rob Norris + * + * 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., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA + * + */ + +// MAX_SIZE is the biggest file which we will return to the user +#define METATILE_MAX_SIZE (1 * 1024 * 1024) + +int xyz_to_meta(char *path, size_t len, const char *dir, int x, int y, int z); + +int metatile_read(const char *dir, int x, int y, int z, char *buf, size_t sz, int * compressed, char * log_msg); diff --git a/src/misc/fpconv-license.txt b/src/misc/fpconv-license.txt new file mode 100644 index 0000000..28d0bcb --- /dev/null +++ b/src/misc/fpconv-license.txt @@ -0,0 +1,22 @@ +The MIT License + +Copyright (c) 2013 Andreas Samoljuk + +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. diff --git a/src/misc/fpconv.c b/src/misc/fpconv.c new file mode 100644 index 0000000..a24fb44 --- /dev/null +++ b/src/misc/fpconv.c @@ -0,0 +1,359 @@ +#include +#include + +#include "fpconv.h" +#include "powers.h" + +#define fracmask 0x000FFFFFFFFFFFFFU +#define expmask 0x7FF0000000000000U +#define hiddenbit 0x0010000000000000U +#define signmask 0x8000000000000000U +#define expbias (1023 + 52) + +#define absv(n) ((n) < 0 ? -(n) : (n)) +#define minv(a, b) ((a) < (b) ? (a) : (b)) + +static uint64_t tens[] = { + 10000000000000000000U, 1000000000000000000U, 100000000000000000U, + 10000000000000000U, 1000000000000000U, 100000000000000U, + 10000000000000U, 1000000000000U, 100000000000U, + 10000000000U, 1000000000U, 100000000U, + 10000000U, 1000000U, 100000U, + 10000U, 1000U, 100U, + 10U, 1U +}; + +static inline uint64_t get_dbits(double d) +{ + union { + double dbl; + uint64_t i; + } dbl_bits = { d }; + + return dbl_bits.i; +} + +static Fp build_fp(double d) +{ + uint64_t bits = get_dbits(d); + + Fp fp; + fp.frac = bits & fracmask; + fp.exp = (bits & expmask) >> 52; + + if(fp.exp) { + fp.frac += hiddenbit; + fp.exp -= expbias; + + } else { + fp.exp = -expbias + 1; + } + + return fp; +} + +static void normalize(Fp* fp) +{ + while ((fp->frac & hiddenbit) == 0) { + fp->frac <<= 1; + fp->exp--; + } + + int shift = 64 - 52 - 1; + fp->frac <<= shift; + fp->exp -= shift; +} + +static void get_normalized_boundaries(Fp* fp, Fp* lower, Fp* upper) +{ + upper->frac = (fp->frac << 1) + 1; + upper->exp = fp->exp - 1; + + while ((upper->frac & (hiddenbit << 1)) == 0) { + upper->frac <<= 1; + upper->exp--; + } + + int u_shift = 64 - 52 - 2; + + upper->frac <<= u_shift; + upper->exp = upper->exp - u_shift; + + + int l_shift = fp->frac == hiddenbit ? 2 : 1; + + lower->frac = (fp->frac << l_shift) - 1; + lower->exp = fp->exp - l_shift; + + + lower->frac <<= lower->exp - upper->exp; + lower->exp = upper->exp; +} + +static Fp multiply(Fp* a, Fp* b) +{ + const uint64_t lomask = 0x00000000FFFFFFFF; + + uint64_t ah_bl = (a->frac >> 32) * (b->frac & lomask); + uint64_t al_bh = (a->frac & lomask) * (b->frac >> 32); + uint64_t al_bl = (a->frac & lomask) * (b->frac & lomask); + uint64_t ah_bh = (a->frac >> 32) * (b->frac >> 32); + + uint64_t tmp = (ah_bl & lomask) + (al_bh & lomask) + (al_bl >> 32); + /* round up */ + tmp += 1U << 31; + + Fp fp = { + ah_bh + (ah_bl >> 32) + (al_bh >> 32) + (tmp >> 32), + a->exp + b->exp + 64 + }; + + return fp; +} + +static void round_digit(char* digits, int ndigits, uint64_t delta, uint64_t rem, uint64_t kappa, uint64_t frac) +{ + while (rem < frac && delta - rem >= kappa && + (rem + kappa < frac || frac - rem > rem + kappa - frac)) { + + digits[ndigits - 1]--; + rem += kappa; + } +} + +static int generate_digits(Fp* fp, Fp* upper, Fp* lower, char* digits, int* K) +{ + uint64_t wfrac = upper->frac - fp->frac; + uint64_t delta = upper->frac - lower->frac; + + Fp one; + one.frac = 1ULL << -upper->exp; + one.exp = upper->exp; + + uint64_t part1 = upper->frac >> -one.exp; + uint64_t part2 = upper->frac & (one.frac - 1); + + int idx = 0, kappa = 10; + uint64_t* divp; + /* 1000000000 */ + for(divp = tens + 10; kappa > 0; divp++) { + + uint64_t div = *divp; + unsigned digit = part1 / div; + + if (digit || idx) { + digits[idx++] = digit + '0'; + } + + part1 -= digit * div; + kappa--; + + uint64_t tmp = (part1 <<-one.exp) + part2; + if (tmp <= delta) { + *K += kappa; + round_digit(digits, idx, delta, tmp, div << -one.exp, wfrac); + + return idx; + } + } + + /* 10 */ + uint64_t* unit = tens + 18; + + while(true) { + part2 *= 10; + delta *= 10; + kappa--; + + unsigned digit = part2 >> -one.exp; + if (digit || idx) { + digits[idx++] = digit + '0'; + } + + part2 &= one.frac - 1; + if (part2 < delta) { + *K += kappa; + round_digit(digits, idx, delta, part2, one.frac, wfrac * *unit); + + return idx; + } + + unit--; + } +} + +static int grisu2(double d, char* digits, int* K) +{ + Fp w = build_fp(d); + + Fp lower, upper; + get_normalized_boundaries(&w, &lower, &upper); + + normalize(&w); + + int k; + Fp cp = find_cachedpow10(upper.exp, &k); + + w = multiply(&w, &cp); + upper = multiply(&upper, &cp); + lower = multiply(&lower, &cp); + + lower.frac++; + upper.frac--; + + *K = -k; + + return generate_digits(&w, &upper, &lower, digits, K); +} + +static int emit_digits(char* digits, int ndigits, char* dest, int K, bool neg, bool is_decimal) +{ + int exp = absv(K + ndigits - 1); + + /* write plain integer */ + if(K >= 0 && (exp < (ndigits + 7))) { + memcpy(dest, digits, ndigits); + memset(dest + ndigits, '0', K); + + return ndigits + K; + } + + /* write decimal w/o scientific notation */ + /* Or force decimal format if desired + * even though it's longer than the scientific notation output */ + if(K < 0 && ((K > -7 || exp < 4) || is_decimal)) { + int offset = ndigits - absv(K); + /* fp < 1.0 -> write leading zero(s) */ + if(offset <= 0) { + /* Pathological case of practically all zeroes */ + /* NB this can lead to the result being '-0' */ + if ( exp > (21-(int)neg) ) { + memset(dest, '0', 1); + return 1; + } + offset = -offset; + dest[0] = '0'; + dest[1] = '.'; + memset(dest + 2, '0', offset); + /* Now having potentially written a bunch of zeros, + * ensure copying only as many digits that fit into the rest of the buffer + * hence this is just truncation + * but as this is along way down in the precision with a 24 char buffer + * it's not of concern for our intended usage + * (e.g 0.00...01919 -> 0.00...001 rather than 0.00...002 */ + int n = ndigits; + if ( (offset + ndigits) > (21-(int)neg) ) { + n = 21-(int)neg - offset; + } + memcpy(dest + offset + 2, digits, n); + + return n + 2 + offset; + + /* fp > 1.0 */ + } else { + memcpy(dest, digits, offset); + dest[offset] = '.'; + memcpy(dest + offset + 1, digits + offset, ndigits - offset); + + return ndigits + 1; + } + } + + /* Force decimal format if desired + * even though it's longer than the scientific notation output */ + if(is_decimal) { + memcpy(dest, digits, ndigits); + memset(dest + ndigits, '0', K); + return ndigits + K; + } + + /* write decimal w/ scientific notation */ + ndigits = minv(ndigits, 18 - neg); + + int idx = 0; + dest[idx++] = digits[0]; + + if(ndigits > 1) { + dest[idx++] = '.'; + memcpy(dest + idx, digits + 1, ndigits - 1); + idx += ndigits - 1; + } + + dest[idx++] = 'e'; + + char sign = K + ndigits - 1 < 0 ? '-' : '+'; + dest[idx++] = sign; + + int cent = 0; + + if(exp > 99) { + cent = exp / 100; + dest[idx++] = cent + '0'; + exp -= cent * 100; + } + if(exp > 9) { + int dec = exp / 10; + dest[idx++] = dec + '0'; + exp -= dec * 10; + + } else if(cent) { + dest[idx++] = '0'; + } + + dest[idx++] = exp % 10 + '0'; + + return idx; +} + +static int filter_special(double fp, char* dest) +{ + if(fp == 0.0) { + dest[0] = '0'; + return 1; + } + + uint64_t bits = get_dbits(fp); + + bool nan = (bits & expmask) == expmask; + + if(!nan) { + return 0; + } + + if(bits & fracmask) { + dest[0] = 'n'; dest[1] = 'a'; dest[2] = 'n'; + + } else { + dest[0] = 'i'; dest[1] = 'n'; dest[2] = 'f'; + } + + return 3; +} + +int fpconv_dtoa(double d, char dest[24], int is_decimal) +{ + char digits[18]; + + int str_len = 0; + bool neg = false; + bool decimal = (is_decimal != 0); + + if(get_dbits(d) & signmask) { + dest[0] = '-'; + str_len++; + neg = true; + } + + int spec = filter_special(d, dest + str_len); + + if(spec) { + return str_len + spec; + } + + int K = 0; + int ndigits = grisu2(d, digits, &K); + + str_len += emit_digits(digits, ndigits, dest + str_len, K, neg, decimal); + + return str_len; +} diff --git a/src/misc/fpconv.h b/src/misc/fpconv.h new file mode 100644 index 0000000..9a8d036 --- /dev/null +++ b/src/misc/fpconv.h @@ -0,0 +1,34 @@ +#ifndef FPCONV_H +#define FPCONV_H + +/* Fast and accurate double to string conversion based on Florian Loitsch's + * Grisu-algorithm[1]. + * + * Input: + * fp -> the double to convert, dest -> destination buffer, + * is_decimal -> force decimal output even if scientific notation is shorter. + * The generated string will never be longer than 24 characters. + * Make sure to pass a pointer to at least 24 bytes of memory. + * The emitted string will not be null terminated. + * + * Output: + * The number of written characters. + * + * Exemplary usage: + * + * void print(double d) + * { + * char buf[24 + 1] // plus null terminator + * int str_len = fpconv_dtoa(d, buf, 0); + * + * buf[str_len] = '\0'; + * printf("%s", buf); + * } + * + */ + +int fpconv_dtoa(double fp, char dest[24], int is_decimal); + +#endif + +/* [1] http://florian.loitsch.com/publications/dtoa-pldi2010.pdf */ diff --git a/src/misc/gtkhtml-private.h b/src/misc/gtkhtml-private.h new file mode 100644 index 0000000..5fe1dca --- /dev/null +++ b/src/misc/gtkhtml-private.h @@ -0,0 +1,32 @@ +/* -*- Mode: C; tab-width: 8; indent-tabs-mode: t; c-basic-offset: 8 -*- */ +/* This file is part of the GtkHTML library. + * + * Copyright 1999, 2000 Helix Code, Inc. + * + * 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; see the file COPYING.LIB. If not, write to + * the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, + * Boston, MA 02110-1301, USA. +*/ +/* + * Viking note: This is an extract from GtkHTML 4.10.0 for URI functions + */ +#ifndef _GTKHTML_PRIVATE_H +#define _GTKHTML_PRIVATE_H + +#include + +gchar *gtk_html_filename_to_uri (const gchar *filename); +gchar *gtk_html_filename_from_uri (const gchar *uri); + +#endif /* _GTKHTML_PRIVATE_H */ diff --git a/src/misc/gtkhtml.c b/src/misc/gtkhtml.c new file mode 100644 index 0000000..5565cf1 --- /dev/null +++ b/src/misc/gtkhtml.c @@ -0,0 +1,193 @@ +/* -*- Mode: C; tab-width: 8; indent-tabs-mode: t; c-basic-offset: 8 -*- */ +/* This file is part of the GtkHTML library. + * + * Copyright 1999, 2000 Helix Code, Inc. + * + * 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; see the file COPYING.LIB. If not, write to + * the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, + * Boston, MA 02110-1301, USA. +*/ +/* + * Viking note: This is an extract from GtkHTML 4.10.0 for URI functions + */ +#include "gtkhtml-private.h" +#include + +gchar * +gtk_html_filename_from_uri (const gchar *uri) +{ + const gchar *relative_fpath; + gchar *temp_uri, *temp_filename; + gchar *retval; + + if (!uri || !*uri) + return NULL; + + if (g_ascii_strncasecmp (uri, "file://", 7) == 0) + return g_filename_from_uri (uri, NULL, NULL); + + if (g_ascii_strncasecmp (uri, "file:", 5) == 0) { + /* Relative (file or other) URIs shouldn't contain the + * scheme prefix at all. But accept such broken URIs + * anyway. Whether they are URI-encoded or not is + * anybody's guess, assume they are. + */ + relative_fpath = uri + 5; + } else { + /* A proper relative file URI. Just do the URI-decoding. */ + relative_fpath = uri; + } + + if (g_path_is_absolute (relative_fpath)) { + /* The totally broken case of "file:" followed + * directly by an absolute pathname. + */ + /* file:/foo/bar.zap or file:c:/foo/bar.zap */ +#ifdef G_OS_WIN32 + if (g_ascii_isalpha (relative_fpath[0]) && relative_fpath[1] == ':') + temp_uri = g_strconcat ("file:///", relative_fpath, NULL); + else + temp_uri = g_strconcat ("file://", relative_fpath, NULL); +#else + temp_uri = g_strconcat ("file://", relative_fpath, NULL); +#endif + retval = g_filename_from_uri (temp_uri, NULL, NULL); + g_free (temp_uri); + + return retval; + } + + /* Create a dummy absolute file: URI and call + * g_filename_from_uri(), then strip off the dummy + * prefix. + */ +#ifdef G_OS_WIN32 + if (g_ascii_isalpha (relative_fpath[0]) && relative_fpath[1] == ':') { + /* file:c:relative/path/foo.bar */ + gchar drive_letter = relative_fpath[0]; + + temp_uri = g_strconcat ("file:///dummy/", relative_fpath + 2, NULL); + temp_filename = g_filename_from_uri (temp_uri, NULL, NULL); + g_free (temp_uri); + + if (temp_filename == NULL) + return NULL; + + g_assert (strncmp (temp_filename, G_DIR_SEPARATOR_S "dummy" G_DIR_SEPARATOR_S, 7) == 0); + + retval = g_strdup_printf ("%c:%s", drive_letter, temp_filename + 7); + g_free (temp_filename); + + return retval; + } +#endif + temp_uri = g_strconcat ("file:///dummy/", relative_fpath, NULL); + temp_filename = g_filename_from_uri (temp_uri, NULL, NULL); + g_free (temp_uri); + + if (temp_filename == NULL) + return NULL; + + g_assert (strncmp (temp_filename, G_DIR_SEPARATOR_S "dummy" G_DIR_SEPARATOR_S, 7) == 0); + + retval = g_strdup (temp_filename + 7); + g_free (temp_filename); + + return retval; +} + +gchar * +gtk_html_filename_to_uri (const gchar *filename) +{ + gchar *fake_filename, *fake_uri, *retval; + const gchar dummy_prefix[] = "file:///dummy/"; + const gint dummy_prefix_len = sizeof (dummy_prefix) - 1; +#ifdef G_OS_WIN32 + gchar drive_letter = 0; +#else + gchar *first_end, *colon; +#endif + + if (!filename || !*filename) + return NULL; + + if (g_path_is_absolute (filename)) + return g_filename_to_uri (filename, NULL, NULL); + + /* filename is a relative path, and the corresponding URI is + * filename as such but URI-escaped. Instead of yet again + * copy-pasteing the URI-escape code from gconvert.c (or + * somewhere else), prefix a fake top-level directory to make + * it into an absolute path, call g_filename_to_uri() to turn it + * into a full file: URI, and then strip away the file:/// and + * the fake top-level directory. + */ + +#ifdef G_OS_WIN32 + if (g_ascii_isalpha (*filename) && filename[1] == ':') { + /* A non-absolute path, but with a drive letter. Ugh. */ + drive_letter = *filename; + filename += 2; + } +#endif + fake_filename = g_build_filename ("/dummy", filename, NULL); + fake_uri = g_filename_to_uri (fake_filename, NULL, NULL); + g_free (fake_filename); + + if (fake_uri == NULL) + return NULL; + + g_assert (strncmp (fake_uri, dummy_prefix, dummy_prefix_len) == 0); + +#ifdef G_OS_WIN32 + /* Re-insert the drive letter if we had one. Double ugh. + * URI-encode the colon so the drive letter isn't taken for a + * URI scheme! + */ + if (drive_letter) + retval = g_strdup_printf ("%c%%3a%s", + drive_letter, + fake_uri + dummy_prefix_len); + else + retval = g_strdup (fake_uri + dummy_prefix_len); +#else + retval = g_strdup (fake_uri + dummy_prefix_len); +#endif + g_free (fake_uri); + +#ifdef G_OS_UNIX + /* Check if there are colons in the first component of the + * pathname, and URI-encode them so that the part up to the + * colon isn't taken for a URI scheme name! This isn't + * necessary on Win32 as there can't be colons in a file name + * in the first place. + */ + first_end = strchr (retval, '/'); + if (first_end == NULL) + first_end = retval + strlen (retval); + + while ((colon = strchr (retval, ':')) != NULL && colon < first_end) { + gchar *new_retval = g_malloc (strlen (retval) + 3); + + strncpy (new_retval, retval, colon - retval); + strcpy (new_retval + (colon - retval), "%3a"); + strcpy (new_retval + (colon - retval) + 3, colon + 1); + + g_free (retval); + retval = new_retval; + } +#endif + + return retval; +} diff --git a/src/misc/kdtree.c b/src/misc/kdtree.c new file mode 100644 index 0000000..8b84ed4 --- /dev/null +++ b/src/misc/kdtree.c @@ -0,0 +1,836 @@ +/* +This file is part of ``kdtree'', a library for working with kd-trees. +Copyright (C) 2007-2011 John Tsiombikas + +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. +3. The name of the author may not be used to endorse or promote products + derived from this software without specific prior written permission. + +THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``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 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. +*/ +/* single nearest neighbor search written by Tamas Nepusz */ +#include +#include +#include +#include +#include "kdtree.h" + +#if defined(WIN32) || defined(__WIN32__) +#include +#endif + +#ifdef USE_LIST_NODE_ALLOCATOR + +#ifndef NO_PTHREADS +#include +#else + +#ifndef I_WANT_THREAD_BUGS +#error "You are compiling with the fast list node allocator, with pthreads disabled! This WILL break if used from multiple threads." +#endif /* I want thread bugs */ + +#endif /* pthread support */ +#endif /* use list node allocator */ + +struct kdhyperrect { + int dim; + double *min, *max; /* minimum/maximum coords */ +}; + +struct kdnode { + double *pos; + int dir; + void *data; + + struct kdnode *left, *right; /* negative/positive side */ +}; + +struct res_node { + struct kdnode *item; + double dist_sq; + struct res_node *next; +}; + +struct kdtree { + int dim; + struct kdnode *root; + struct kdhyperrect *rect; + void (*destr)(void*); +}; + +struct kdres { + struct kdtree *tree; + struct res_node *rlist, *riter; + int size; +}; + +#define SQ(x) ((x) * (x)) + + +static void clear_rec(struct kdnode *node, void (*destr)(void*)); +static int insert_rec(struct kdnode **node, const double *pos, void *data, int dir, int dim); +static int rlist_insert(struct res_node *list, struct kdnode *item, double dist_sq); +static void clear_results(struct kdres *set); + +static struct kdhyperrect* hyperrect_create(int dim, const double *min, const double *max); +static void hyperrect_free(struct kdhyperrect *rect); +static struct kdhyperrect* hyperrect_duplicate(const struct kdhyperrect *rect); +static void hyperrect_extend(struct kdhyperrect *rect, const double *pos); +static double hyperrect_dist_sq(struct kdhyperrect *rect, const double *pos); + +#ifdef USE_LIST_NODE_ALLOCATOR +static struct res_node *alloc_resnode(void); +static void free_resnode(struct res_node*); +#else +#define alloc_resnode() malloc(sizeof(struct res_node)) +#define free_resnode(n) free(n) +#endif + + + +struct kdtree *kd_create(int k) +{ + struct kdtree *tree; + + if(!(tree = malloc(sizeof *tree))) { + return 0; + } + + tree->dim = k; + tree->root = 0; + tree->destr = 0; + tree->rect = 0; + + return tree; +} + +void kd_free(struct kdtree *tree) +{ + if(tree) { + kd_clear(tree); + free(tree); + } +} + +static void clear_rec(struct kdnode *node, void (*destr)(void*)) +{ + if(!node) return; + + clear_rec(node->left, destr); + clear_rec(node->right, destr); + + if(destr) { + destr(node->data); + } + free(node->pos); + free(node); +} + +void kd_clear(struct kdtree *tree) +{ + clear_rec(tree->root, tree->destr); + tree->root = 0; + + if (tree->rect) { + hyperrect_free(tree->rect); + tree->rect = 0; + } +} + +void kd_data_destructor(struct kdtree *tree, void (*destr)(void*)) +{ + tree->destr = destr; +} + + +static int insert_rec(struct kdnode **nptr, const double *pos, void *data, int dir, int dim) +{ + int new_dir; + struct kdnode *node; + + if(!*nptr) { + if(!(node = malloc(sizeof *node))) { + return -1; + } + if(!(node->pos = malloc(dim * sizeof *node->pos))) { + free(node); + return -1; + } + memcpy(node->pos, pos, dim * sizeof *node->pos); + node->data = data; + node->dir = dir; + node->left = node->right = 0; + *nptr = node; + return 0; + } + + node = *nptr; + new_dir = (node->dir + 1) % dim; + if(pos[node->dir] < node->pos[node->dir]) { + return insert_rec(&(*nptr)->left, pos, data, new_dir, dim); + } + return insert_rec(&(*nptr)->right, pos, data, new_dir, dim); +} + +int kd_insert(struct kdtree *tree, const double *pos, void *data) +{ + if (insert_rec(&tree->root, pos, data, 0, tree->dim)) { + return -1; + } + + if (tree->rect == 0) { + tree->rect = hyperrect_create(tree->dim, pos, pos); + } else { + hyperrect_extend(tree->rect, pos); + } + + return 0; +} + +int kd_insertf(struct kdtree *tree, const float *pos, void *data) +{ + static double sbuf[16]; + double *bptr, *buf = 0; + int res, dim = tree->dim; + + if(dim > 16) { +#ifndef NO_ALLOCA + if(dim <= 256) + bptr = buf = alloca(dim * sizeof *bptr); + else +#endif + if(!(bptr = buf = malloc(dim * sizeof *bptr))) { + return -1; + } + } else { + bptr = buf = sbuf; + } + + while(dim-- > 0) { + *bptr++ = *pos++; + } + + res = kd_insert(tree, buf, data); +#ifndef NO_ALLOCA + if(tree->dim > 256) +#else + if(tree->dim > 16) +#endif + free(buf); + return res; +} + +int kd_insert3(struct kdtree *tree, double x, double y, double z, void *data) +{ + double buf[3]; + buf[0] = x; + buf[1] = y; + buf[2] = z; + return kd_insert(tree, buf, data); +} + +int kd_insert3f(struct kdtree *tree, float x, float y, float z, void *data) +{ + double buf[3]; + buf[0] = x; + buf[1] = y; + buf[2] = z; + return kd_insert(tree, buf, data); +} + +static int find_nearest(struct kdnode *node, const double *pos, double range, struct res_node *list, int ordered, int dim) +{ + double dist_sq, dx; + int i, ret, added_res = 0; + + if(!node) return 0; + + dist_sq = 0; + for(i=0; ipos[i] - pos[i]); + } + if(dist_sq <= SQ(range)) { + if(rlist_insert(list, node, ordered ? dist_sq : -1.0) == -1) { + return -1; + } + added_res = 1; + } + + dx = pos[node->dir] - node->pos[node->dir]; + + ret = find_nearest(dx <= 0.0 ? node->left : node->right, pos, range, list, ordered, dim); + if(ret >= 0 && fabs(dx) < range) { + added_res += ret; + ret = find_nearest(dx <= 0.0 ? node->right : node->left, pos, range, list, ordered, dim); + } + if(ret == -1) { + return -1; + } + added_res += ret; + + return added_res; +} + +#if 0 +static int find_nearest_n(struct kdnode *node, const double *pos, double range, int num, struct rheap *heap, int dim) +{ + double dist_sq, dx; + int i, ret, added_res = 0; + + if(!node) return 0; + + /* if the photon is close enough, add it to the result heap */ + dist_sq = 0; + for(i=0; ipos[i] - pos[i]); + } + if(dist_sq <= range_sq) { + if(heap->size >= num) { + /* get furthest element */ + struct res_node *maxelem = rheap_get_max(heap); + + /* and check if the new one is closer than that */ + if(maxelem->dist_sq > dist_sq) { + rheap_remove_max(heap); + + if(rheap_insert(heap, node, dist_sq) == -1) { + return -1; + } + added_res = 1; + + range_sq = dist_sq; + } + } else { + if(rheap_insert(heap, node, dist_sq) == -1) { + return =1; + } + added_res = 1; + } + } + + + /* find signed distance from the splitting plane */ + dx = pos[node->dir] - node->pos[node->dir]; + + ret = find_nearest_n(dx <= 0.0 ? node->left : node->right, pos, range, num, heap, dim); + if(ret >= 0 && fabs(dx) < range) { + added_res += ret; + ret = find_nearest_n(dx <= 0.0 ? node->right : node->left, pos, range, num, heap, dim); + } + +} +#endif + +static void kd_nearest_i(struct kdnode *node, const double *pos, struct kdnode **result, double *result_dist_sq, struct kdhyperrect* rect) +{ + int dir = node->dir; + int i; + double dummy, dist_sq; + struct kdnode *nearer_subtree, *farther_subtree; + double *nearer_hyperrect_coord, *farther_hyperrect_coord; + + /* Decide whether to go left or right in the tree */ + dummy = pos[dir] - node->pos[dir]; + if (dummy <= 0) { + nearer_subtree = node->left; + farther_subtree = node->right; + nearer_hyperrect_coord = rect->max + dir; + farther_hyperrect_coord = rect->min + dir; + } else { + nearer_subtree = node->right; + farther_subtree = node->left; + nearer_hyperrect_coord = rect->min + dir; + farther_hyperrect_coord = rect->max + dir; + } + + if (nearer_subtree) { + /* Slice the hyperrect to get the hyperrect of the nearer subtree */ + dummy = *nearer_hyperrect_coord; + *nearer_hyperrect_coord = node->pos[dir]; + /* Recurse down into nearer subtree */ + kd_nearest_i(nearer_subtree, pos, result, result_dist_sq, rect); + /* Undo the slice */ + *nearer_hyperrect_coord = dummy; + } + + /* Check the distance of the point at the current node, compare it + * with our best so far */ + dist_sq = 0; + for(i=0; i < rect->dim; i++) { + dist_sq += SQ(node->pos[i] - pos[i]); + } + if (dist_sq < *result_dist_sq) { + *result = node; + *result_dist_sq = dist_sq; + } + + if (farther_subtree) { + /* Get the hyperrect of the farther subtree */ + dummy = *farther_hyperrect_coord; + *farther_hyperrect_coord = node->pos[dir]; + /* Check if we have to recurse down by calculating the closest + * point of the hyperrect and see if it's closer than our + * minimum distance in result_dist_sq. */ + if (hyperrect_dist_sq(rect, pos) < *result_dist_sq) { + /* Recurse down into farther subtree */ + kd_nearest_i(farther_subtree, pos, result, result_dist_sq, rect); + } + /* Undo the slice on the hyperrect */ + *farther_hyperrect_coord = dummy; + } +} + +struct kdres *kd_nearest(struct kdtree *kd, const double *pos) +{ + struct kdhyperrect *rect; + struct kdnode *result; + struct kdres *rset; + double dist_sq; + int i; + + if (!kd) return 0; + if (!kd->rect) return 0; + + /* Allocate result set */ + if(!(rset = malloc(sizeof *rset))) { + return 0; + } + if(!(rset->rlist = alloc_resnode())) { + free(rset); + return 0; + } + rset->rlist->next = 0; + rset->tree = kd; + + /* Duplicate the bounding hyperrectangle, we will work on the copy */ + if (!(rect = hyperrect_duplicate(kd->rect))) { + kd_res_free(rset); + return 0; + } + + /* Our first guesstimate is the root node */ + result = kd->root; + dist_sq = 0; + for (i = 0; i < kd->dim; i++) + dist_sq += SQ(result->pos[i] - pos[i]); + + /* Search for the nearest neighbour recursively */ + kd_nearest_i(kd->root, pos, &result, &dist_sq, rect); + + /* Free the copy of the hyperrect */ + hyperrect_free(rect); + + /* Store the result */ + if (result) { + if (rlist_insert(rset->rlist, result, -1.0) == -1) { + kd_res_free(rset); + return 0; + } + rset->size = 1; + kd_res_rewind(rset); + return rset; + } else { + kd_res_free(rset); + return 0; + } +} + +struct kdres *kd_nearestf(struct kdtree *tree, const float *pos) +{ + static double sbuf[16]; + double *bptr, *buf = 0; + int dim = tree->dim; + struct kdres *res; + + if(dim > 16) { +#ifndef NO_ALLOCA + if(dim <= 256) + bptr = buf = alloca(dim * sizeof *bptr); + else +#endif + if(!(bptr = buf = malloc(dim * sizeof *bptr))) { + return 0; + } + } else { + bptr = buf = sbuf; + } + + while(dim-- > 0) { + *bptr++ = *pos++; + } + + res = kd_nearest(tree, buf); +#ifndef NO_ALLOCA + if(tree->dim > 256) +#else + if(tree->dim > 16) +#endif + free(buf); + return res; +} + +struct kdres *kd_nearest3(struct kdtree *tree, double x, double y, double z) +{ + double pos[3]; + pos[0] = x; + pos[1] = y; + pos[2] = z; + return kd_nearest(tree, pos); +} + +struct kdres *kd_nearest3f(struct kdtree *tree, float x, float y, float z) +{ + double pos[3]; + pos[0] = x; + pos[1] = y; + pos[2] = z; + return kd_nearest(tree, pos); +} + +/* ---- nearest N search ---- */ +/* +static kdres *kd_nearest_n(struct kdtree *kd, const double *pos, int num) +{ + int ret; + struct kdres *rset; + + if(!(rset = malloc(sizeof *rset))) { + return 0; + } + if(!(rset->rlist = alloc_resnode())) { + free(rset); + return 0; + } + rset->rlist->next = 0; + rset->tree = kd; + + if((ret = find_nearest_n(kd->root, pos, range, num, rset->rlist, kd->dim)) == -1) { + kd_res_free(rset); + return 0; + } + rset->size = ret; + kd_res_rewind(rset); + return rset; +}*/ + +struct kdres *kd_nearest_range(struct kdtree *kd, const double *pos, double range) +{ + int ret; + struct kdres *rset; + + if(!(rset = malloc(sizeof *rset))) { + return 0; + } + if(!(rset->rlist = alloc_resnode())) { + free(rset); + return 0; + } + rset->rlist->next = 0; + rset->tree = kd; + + if((ret = find_nearest(kd->root, pos, range, rset->rlist, 0, kd->dim)) == -1) { + kd_res_free(rset); + return 0; + } + rset->size = ret; + kd_res_rewind(rset); + return rset; +} + +struct kdres *kd_nearest_rangef(struct kdtree *kd, const float *pos, float range) +{ + static double sbuf[16]; + double *bptr, *buf = 0; + int dim = kd->dim; + struct kdres *res; + + if(dim > 16) { +#ifndef NO_ALLOCA + if(dim <= 256) + bptr = buf = alloca(dim * sizeof *bptr); + else +#endif + if(!(bptr = buf = malloc(dim * sizeof *bptr))) { + return 0; + } + } else { + bptr = buf = sbuf; + } + + while(dim-- > 0) { + *bptr++ = *pos++; + } + + res = kd_nearest_range(kd, buf, range); +#ifndef NO_ALLOCA + if(kd->dim > 256) +#else + if(kd->dim > 16) +#endif + free(buf); + return res; +} + +struct kdres *kd_nearest_range3(struct kdtree *tree, double x, double y, double z, double range) +{ + double buf[3]; + buf[0] = x; + buf[1] = y; + buf[2] = z; + return kd_nearest_range(tree, buf, range); +} + +struct kdres *kd_nearest_range3f(struct kdtree *tree, float x, float y, float z, float range) +{ + double buf[3]; + buf[0] = x; + buf[1] = y; + buf[2] = z; + return kd_nearest_range(tree, buf, range); +} + +void kd_res_free(struct kdres *rset) +{ + clear_results(rset); + free_resnode(rset->rlist); + free(rset); +} + +int kd_res_size(struct kdres *set) +{ + return (set->size); +} + +void kd_res_rewind(struct kdres *rset) +{ + rset->riter = rset->rlist->next; +} + +int kd_res_end(struct kdres *rset) +{ + return rset->riter == 0; +} + +int kd_res_next(struct kdres *rset) +{ + rset->riter = rset->riter->next; + return rset->riter != 0; +} + +void *kd_res_item(struct kdres *rset, double *pos) +{ + if(rset->riter) { + if(pos) { + memcpy(pos, rset->riter->item->pos, rset->tree->dim * sizeof *pos); + } + return rset->riter->item->data; + } + return 0; +} + +void *kd_res_itemf(struct kdres *rset, float *pos) +{ + if(rset->riter) { + if(pos) { + int i; + for(i=0; itree->dim; i++) { + pos[i] = rset->riter->item->pos[i]; + } + } + return rset->riter->item->data; + } + return 0; +} + +void *kd_res_item3(struct kdres *rset, double *x, double *y, double *z) +{ + if(rset->riter) { + if(*x) *x = rset->riter->item->pos[0]; + if(*y) *y = rset->riter->item->pos[1]; + if(*z) *z = rset->riter->item->pos[2]; + } + return 0; +} + +void *kd_res_item3f(struct kdres *rset, float *x, float *y, float *z) +{ + if(rset->riter) { + if(*x) *x = rset->riter->item->pos[0]; + if(*y) *y = rset->riter->item->pos[1]; + if(*z) *z = rset->riter->item->pos[2]; + } + return 0; +} + +void *kd_res_item_data(struct kdres *set) +{ + return kd_res_item(set, 0); +} + +/* ---- hyperrectangle helpers ---- */ +static struct kdhyperrect* hyperrect_create(int dim, const double *min, const double *max) +{ + size_t size = dim * sizeof(double); + struct kdhyperrect* rect = 0; + + if (!(rect = malloc(sizeof(struct kdhyperrect)))) { + return 0; + } + + rect->dim = dim; + if (!(rect->min = malloc(size))) { + free(rect); + return 0; + } + if (!(rect->max = malloc(size))) { + free(rect->min); + free(rect); + return 0; + } + memcpy(rect->min, min, size); + memcpy(rect->max, max, size); + + return rect; +} + +static void hyperrect_free(struct kdhyperrect *rect) +{ + free(rect->min); + free(rect->max); + free(rect); +} + +static struct kdhyperrect* hyperrect_duplicate(const struct kdhyperrect *rect) +{ + return hyperrect_create(rect->dim, rect->min, rect->max); +} + +static void hyperrect_extend(struct kdhyperrect *rect, const double *pos) +{ + int i; + + for (i=0; i < rect->dim; i++) { + if (pos[i] < rect->min[i]) { + rect->min[i] = pos[i]; + } + if (pos[i] > rect->max[i]) { + rect->max[i] = pos[i]; + } + } +} + +static double hyperrect_dist_sq(struct kdhyperrect *rect, const double *pos) +{ + int i; + double result = 0; + + for (i=0; i < rect->dim; i++) { + if (pos[i] < rect->min[i]) { + result += SQ(rect->min[i] - pos[i]); + } else if (pos[i] > rect->max[i]) { + result += SQ(rect->max[i] - pos[i]); + } + } + + return result; +} + +/* ---- static helpers ---- */ + +#ifdef USE_LIST_NODE_ALLOCATOR +/* special list node allocators. */ +static struct res_node *free_nodes; + +#ifndef NO_PTHREADS +static pthread_mutex_t alloc_mutex = PTHREAD_MUTEX_INITIALIZER; +#endif + +static struct res_node *alloc_resnode(void) +{ + struct res_node *node; + +#ifndef NO_PTHREADS + pthread_mutex_lock(&alloc_mutex); +#endif + + if(!free_nodes) { + node = malloc(sizeof *node); + } else { + node = free_nodes; + free_nodes = free_nodes->next; + node->next = 0; + } + +#ifndef NO_PTHREADS + pthread_mutex_unlock(&alloc_mutex); +#endif + + return node; +} + +static void free_resnode(struct res_node *node) +{ +#ifndef NO_PTHREADS + pthread_mutex_lock(&alloc_mutex); +#endif + + node->next = free_nodes; + free_nodes = node; + +#ifndef NO_PTHREADS + pthread_mutex_unlock(&alloc_mutex); +#endif +} +#endif /* list node allocator or not */ + + +/* inserts the item. if dist_sq is >= 0, then do an ordered insert */ +/* TODO make the ordering code use heapsort */ +static int rlist_insert(struct res_node *list, struct kdnode *item, double dist_sq) +{ + struct res_node *rnode; + + if(!(rnode = alloc_resnode())) { + return -1; + } + rnode->item = item; + rnode->dist_sq = dist_sq; + + if(dist_sq >= 0.0) { + while(list->next && list->next->dist_sq < dist_sq) { + list = list->next; + } + } + rnode->next = list->next; + list->next = rnode; + return 0; +} + +static void clear_results(struct kdres *rset) +{ + struct res_node *tmp, *node = rset->rlist->next; + + while(node) { + tmp = node; + node = node->next; + free_resnode(tmp); + } + + rset->rlist->next = 0; +} diff --git a/src/misc/kdtree.h b/src/misc/kdtree.h new file mode 100644 index 0000000..92d43e4 --- /dev/null +++ b/src/misc/kdtree.h @@ -0,0 +1,129 @@ +/* +This file is part of ``kdtree'', a library for working with kd-trees. +Copyright (C) 2007-2011 John Tsiombikas + +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. +3. The name of the author may not be used to endorse or promote products + derived from this software without specific prior written permission. + +THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``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 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. +*/ +#ifndef _KDTREE_H_ +#define _KDTREE_H_ + +#ifdef __cplusplus +extern "C" { +#endif + +struct kdtree; +struct kdres; + + +/* create a kd-tree for "k"-dimensional data */ +struct kdtree *kd_create(int k); + +/* free the struct kdtree */ +void kd_free(struct kdtree *tree); + +/* remove all the elements from the tree */ +void kd_clear(struct kdtree *tree); + +/* if called with non-null 2nd argument, the function provided + * will be called on data pointers (see kd_insert) when nodes + * are to be removed from the tree. + */ +void kd_data_destructor(struct kdtree *tree, void (*destr)(void*)); + +/* insert a node, specifying its position, and optional data */ +int kd_insert(struct kdtree *tree, const double *pos, void *data); +int kd_insertf(struct kdtree *tree, const float *pos, void *data); +int kd_insert3(struct kdtree *tree, double x, double y, double z, void *data); +int kd_insert3f(struct kdtree *tree, float x, float y, float z, void *data); + +/* Find the nearest node from a given point. + * + * This function returns a pointer to a result set with at most one element. + */ +struct kdres *kd_nearest(struct kdtree *tree, const double *pos); +struct kdres *kd_nearestf(struct kdtree *tree, const float *pos); +struct kdres *kd_nearest3(struct kdtree *tree, double x, double y, double z); +struct kdres *kd_nearest3f(struct kdtree *tree, float x, float y, float z); + +/* Find the N nearest nodes from a given point. + * + * This function returns a pointer to a result set, with at most N elements, + * which can be manipulated with the kd_res_* functions. + * The returned pointer can be null as an indication of an error. Otherwise + * a valid result set is always returned which may contain 0 or more elements. + * The result set must be deallocated with kd_res_free after use. + */ +/* +struct kdres *kd_nearest_n(struct kdtree *tree, const double *pos, int num); +struct kdres *kd_nearest_nf(struct kdtree *tree, const float *pos, int num); +struct kdres *kd_nearest_n3(struct kdtree *tree, double x, double y, double z); +struct kdres *kd_nearest_n3f(struct kdtree *tree, float x, float y, float z); +*/ + +/* Find any nearest nodes from a given point within a range. + * + * This function returns a pointer to a result set, which can be manipulated + * by the kd_res_* functions. + * The returned pointer can be null as an indication of an error. Otherwise + * a valid result set is always returned which may contain 0 or more elements. + * The result set must be deallocated with kd_res_free after use. + */ +struct kdres *kd_nearest_range(struct kdtree *tree, const double *pos, double range); +struct kdres *kd_nearest_rangef(struct kdtree *tree, const float *pos, float range); +struct kdres *kd_nearest_range3(struct kdtree *tree, double x, double y, double z, double range); +struct kdres *kd_nearest_range3f(struct kdtree *tree, float x, float y, float z, float range); + +/* frees a result set returned by kd_nearest_range() */ +void kd_res_free(struct kdres *set); + +/* returns the size of the result set (in elements) */ +int kd_res_size(struct kdres *set); + +/* rewinds the result set iterator */ +void kd_res_rewind(struct kdres *set); + +/* returns non-zero if the set iterator reached the end after the last element */ +int kd_res_end(struct kdres *set); + +/* advances the result set iterator, returns non-zero on success, zero if + * there are no more elements in the result set. + */ +int kd_res_next(struct kdres *set); + +/* returns the data pointer (can be null) of the current result set item + * and optionally sets its position to the pointers(s) if not null. + */ +void *kd_res_item(struct kdres *set, double *pos); +void *kd_res_itemf(struct kdres *set, float *pos); +void *kd_res_item3(struct kdres *set, double *x, double *y, double *z); +void *kd_res_item3f(struct kdres *set, float *x, float *y, float *z); + +/* equivalent to kd_res_item(set, 0) */ +void *kd_res_item_data(struct kdres *set); + + +#ifdef __cplusplus +} +#endif + +#endif /* _KDTREE_H_ */ diff --git a/src/misc/powers.h b/src/misc/powers.h new file mode 100644 index 0000000..c707eed --- /dev/null +++ b/src/misc/powers.h @@ -0,0 +1,87 @@ +#include + +#define npowers 87 +#define steppowers 8 +#define firstpower -348 /* 10 ^ -348 */ + +#define expmax -32 +#define expmin -60 + + +typedef struct Fp { + uint64_t frac; + int exp; +} Fp; + +static Fp powers_ten[] = { + { 18054884314459144840U, -1220 }, { 13451937075301367670U, -1193 }, + { 10022474136428063862U, -1166 }, { 14934650266808366570U, -1140 }, + { 11127181549972568877U, -1113 }, { 16580792590934885855U, -1087 }, + { 12353653155963782858U, -1060 }, { 18408377700990114895U, -1034 }, + { 13715310171984221708U, -1007 }, { 10218702384817765436U, -980 }, + { 15227053142812498563U, -954 }, { 11345038669416679861U, -927 }, + { 16905424996341287883U, -901 }, { 12595523146049147757U, -874 }, + { 9384396036005875287U, -847 }, { 13983839803942852151U, -821 }, + { 10418772551374772303U, -794 }, { 15525180923007089351U, -768 }, + { 11567161174868858868U, -741 }, { 17236413322193710309U, -715 }, + { 12842128665889583758U, -688 }, { 9568131466127621947U, -661 }, + { 14257626930069360058U, -635 }, { 10622759856335341974U, -608 }, + { 15829145694278690180U, -582 }, { 11793632577567316726U, -555 }, + { 17573882009934360870U, -529 }, { 13093562431584567480U, -502 }, + { 9755464219737475723U, -475 }, { 14536774485912137811U, -449 }, + { 10830740992659433045U, -422 }, { 16139061738043178685U, -396 }, + { 12024538023802026127U, -369 }, { 17917957937422433684U, -343 }, + { 13349918974505688015U, -316 }, { 9946464728195732843U, -289 }, + { 14821387422376473014U, -263 }, { 11042794154864902060U, -236 }, + { 16455045573212060422U, -210 }, { 12259964326927110867U, -183 }, + { 18268770466636286478U, -157 }, { 13611294676837538539U, -130 }, + { 10141204801825835212U, -103 }, { 15111572745182864684U, -77 }, + { 11258999068426240000U, -50 }, { 16777216000000000000U, -24 }, + { 12500000000000000000U, 3 }, { 9313225746154785156U, 30 }, + { 13877787807814456755U, 56 }, { 10339757656912845936U, 83 }, + { 15407439555097886824U, 109 }, { 11479437019748901445U, 136 }, + { 17105694144590052135U, 162 }, { 12744735289059618216U, 189 }, + { 9495567745759798747U, 216 }, { 14149498560666738074U, 242 }, + { 10542197943230523224U, 269 }, { 15709099088952724970U, 295 }, + { 11704190886730495818U, 322 }, { 17440603504673385349U, 348 }, + { 12994262207056124023U, 375 }, { 9681479787123295682U, 402 }, + { 14426529090290212157U, 428 }, { 10748601772107342003U, 455 }, + { 16016664761464807395U, 481 }, { 11933345169920330789U, 508 }, + { 17782069995880619868U, 534 }, { 13248674568444952270U, 561 }, + { 9871031767461413346U, 588 }, { 14708983551653345445U, 614 }, + { 10959046745042015199U, 641 }, { 16330252207878254650U, 667 }, + { 12166986024289022870U, 694 }, { 18130221999122236476U, 720 }, + { 13508068024458167312U, 747 }, { 10064294952495520794U, 774 }, + { 14996968138956309548U, 800 }, { 11173611982879273257U, 827 }, + { 16649979327439178909U, 853 }, { 12405201291620119593U, 880 }, + { 9242595204427927429U, 907 }, { 13772540099066387757U, 933 }, + { 10261342003245940623U, 960 }, { 15290591125556738113U, 986 }, + { 11392378155556871081U, 1013 }, { 16975966327722178521U, 1039 }, + { 12648080533535911531U, 1066 } +}; + +static Fp find_cachedpow10(int exp, int* k) +{ + const double one_log_ten = 0.30102999566398114; + + int approx = -(exp + npowers) * one_log_ten; + int idx = (approx - firstpower) / steppowers; + + while(1) { + int current = exp + powers_ten[idx].exp + 64; + + if(current < expmin) { + idx++; + continue; + } + + if(current > expmax) { + idx--; + continue; + } + + *k = (firstpower + idx * steppowers); + + return powers_ten[idx]; + } +} diff --git a/src/misc/strtod.c b/src/misc/strtod.c new file mode 100644 index 0000000..1492a10 --- /dev/null +++ b/src/misc/strtod.c @@ -0,0 +1,158 @@ +// +// strtod.c +// +// Convert string to double +// +// Copyright (C) 2002 Michael Ringgaard. 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. +// 3. Neither the name of the project nor the names of its contributors +// may be used to endorse or promote products derived from this software +// without specific prior written permission. +// +// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS 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 COPYRIGHT OWNER 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. +// + +// Tweaked version for Viking project to read in values containing ',' or '.' as the decimal separator +// Modified functions to prevent clashing with the system ones + +#include +#include +#include +#include +#include + +double strtod_i8n(const char *str, char **endptr) { + double number; + int exponent; + int negative; + char *p = (char *) str; + double p10; + int n; + int num_digits; + int num_decimals; + + // Skip leading whitespace + while (isspace(*p)) p++; + + // Handle optional sign + negative = 0; + switch (*p) { + case '-': negative = 1; // Fall through to increment position + case '+': p++; + } + + number = 0.; + exponent = 0; + num_digits = 0; + num_decimals = 0; + + // Process string of digits + while (isdigit(*p)) { + number = number * 10. + (*p - '0'); + p++; + num_digits++; + } + + // Process decimal part + if (*p == '.' || *p == ',') { + p++; + + while (isdigit(*p)) { + number = number * 10. + (*p - '0'); + p++; + num_digits++; + num_decimals++; + } + + exponent -= num_decimals; + } + + if (num_digits == 0) { + errno = ERANGE; + return 0.0; + } + + // Correct for sign + if (negative) number = -number; + + // Process an exponent string + if (*p == 'e' || *p == 'E') { + // Handle optional sign + negative = 0; + switch (*++p) { + case '-': negative = 1; // Fall through to increment pos + case '+': p++; + } + + // Process string of digits + n = 0; + while (isdigit(*p)) { + n = n * 10 + (*p - '0'); + p++; + } + + if (negative) { + exponent -= n; + } else { + exponent += n; + } + } + + if (exponent < DBL_MIN_EXP || exponent > DBL_MAX_EXP) { + errno = ERANGE; + return HUGE_VAL; + } + + // Scale the result + p10 = 10.; + n = exponent; + if (n < 0) n = -n; + while (n) { + if (n & 1) { + if (exponent < 0) { + number /= p10; + } else { + number *= p10; + } + } + n >>= 1; + p10 *= p10; + } + + if (number == HUGE_VAL) errno = ERANGE; + if (endptr) *endptr = p; + + return number; +} + +float strtof_i8n(const char *str, char **endptr) { + return (float) strtod_i8n(str, endptr); +} + + +long double strtold_i8n(const char *str, char **endptr) { + return strtod_i8n(str, endptr); +} + +double atof_i8n(const char *str) { + return strtod_i8n(str, NULL); +} diff --git a/src/misc/strtod.h b/src/misc/strtod.h new file mode 100644 index 0000000..d138a47 --- /dev/null +++ b/src/misc/strtod.h @@ -0,0 +1,22 @@ +// License: CC0 +// Basic interface to strtod.c from the Sanos Operating System Kernel (http://www.jbox.dk/sanos/) +// Function names modified to prevent clashing with whatever OS this code is being built with + + +#ifndef __STRTOD_H +#define __STRTOD_H + +#ifdef __cplusplus +extern "C" { +#endif + +double strtod_i8n(const char *str, char **endptr); +float strtof_i8n(const char *str, char **endptr); +long double strtold_i8n(const char *str, char **endptr); +double atof_i8n(const char *str); + +#ifdef __cplusplus +} +#endif + +#endif diff --git a/src/modules.c b/src/modules.c new file mode 100644 index 0000000..b7898d7 --- /dev/null +++ b/src/modules.c @@ -0,0 +1,303 @@ +/* + * viking -- GPS Data and Topo Analyzer, Explorer, and Manager + * + * Copyright (C) 2006-2012, Guilhem Bonnefille + * + * 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., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA + * + */ + +#ifdef HAVE_CONFIG_H +#include "config.h" +#endif + +#include +#include +#ifdef HAVE_UNISTD_H +#include +#endif + +#include "modules.h" + +#include "bing.h" +#include "google.h" +#include "terraserver.h" +#include "expedia.h" +#include "osm.h" +#include "osm-traces.h" +#include "bluemarble.h" +#include "geonames.h" +#include "dir.h" +#include "datasources.h" +#include "vikmapslayer.h" +#include "vikexttools.h" +#include "vikexttool_datasources.h" +#include "vikgoto.h" +#include "vikrouting.h" + +/* Loadable types */ +#include "vikslippymapsource.h" +#include "viktmsmapsource.h" +#include "vikwmscmapsource.h" +#include "vikwebtoolcenter.h" +#include "vikwebtoolbounds.h" +#include "vikgotoxmltool.h" +#include "vikwebtool_datasource.h" +#include "vikroutingwebengine.h" + +#include "vikgobjectbuilder.h" + +#ifdef HAVE_LIBMAPNIK +#include "vikmapniklayer.h" +#endif + +#define VIKING_MAPS_FILE "maps.xml" +#define VIKING_EXTTOOLS_FILE "external_tools.xml" +#define VIKING_DATASOURCES_FILE "datasources.xml" +#define VIKING_GOTOTOOLS_FILE "goto_tools.xml" +#define VIKING_ROUTING_FILE "routing.xml" + +static void +modules_register_map_source(VikGobjectBuilder *self, GObject *object) +{ + g_debug (__FUNCTION__); + VikMapSource *mapsource = VIK_MAP_SOURCE (object); + /* FIXME label should be hosted by object */ + maps_layer_register_map_source (mapsource); +} + +static void +modules_register_exttools(VikGobjectBuilder *self, GObject *object) +{ + g_debug (__FUNCTION__); + VikExtTool *tool = VIK_EXT_TOOL (object); + vik_ext_tools_register (tool); +} + +static void +modules_register_datasources(VikGobjectBuilder *self, GObject *object) +{ + g_debug (__FUNCTION__); + VikExtTool *tool = VIK_EXT_TOOL (object); + vik_ext_tool_datasources_register (tool); +} + +static void +modules_register_gototools(VikGobjectBuilder *self, GObject *object) +{ + g_debug (__FUNCTION__); + VikGotoTool *tool = VIK_GOTO_TOOL (object); + vik_goto_register (tool); +} + +static void +modules_register_routing_engine(VikGobjectBuilder *self, GObject *object) +{ + g_debug (__FUNCTION__); + VikRoutingEngine *engine = VIK_ROUTING_ENGINE (object); + vik_routing_register (engine); +} + +static void +modules_load_config_dir(const gchar *dir) +{ + g_debug("Loading configurations from directory %s", dir); + + /* Maps sources */ + gchar *maps = g_build_filename(dir, VIKING_MAPS_FILE, NULL); + if (g_access (maps, R_OK) == 0) + { + VikGobjectBuilder *builder = vik_gobject_builder_new (); + g_signal_connect (builder, "new-object", G_CALLBACK (modules_register_map_source), NULL); + vik_gobject_builder_parse (builder, maps); + g_object_unref (builder); + } + g_free ( maps ); + + /* External tools */ + gchar *tools = g_build_filename(dir, VIKING_EXTTOOLS_FILE, NULL); + if (g_access (tools, R_OK) == 0) + { + VikGobjectBuilder *builder = vik_gobject_builder_new (); + g_signal_connect (builder, "new-object", G_CALLBACK (modules_register_exttools), NULL); + vik_gobject_builder_parse (builder, tools); + g_object_unref (builder); + } + g_free ( tools ); + + gchar *datasources = g_build_filename(dir, VIKING_DATASOURCES_FILE, NULL); + if (g_access (datasources, R_OK) == 0) + { + VikGobjectBuilder *builder = vik_gobject_builder_new (); + g_signal_connect (builder, "new-object", G_CALLBACK (modules_register_datasources), NULL); + vik_gobject_builder_parse (builder, datasources); + g_object_unref (builder); + } + g_free ( datasources ); + + /* Go-to search engines */ + gchar *go_to = g_build_filename(dir, VIKING_GOTOTOOLS_FILE, NULL); + if (g_access (go_to, R_OK) == 0) + { + VikGobjectBuilder *builder = vik_gobject_builder_new (); + g_signal_connect (builder, "new-object", G_CALLBACK (modules_register_gototools), NULL); + vik_gobject_builder_parse (builder, go_to); + g_object_unref (builder); + } + g_free ( go_to ); + + /* Routing engines */ + gchar *routing = g_build_filename(dir, VIKING_ROUTING_FILE, NULL); + if (g_access (routing, R_OK) == 0) + { + VikGobjectBuilder *builder = vik_gobject_builder_new (); + g_signal_connect (builder, "new-object", G_CALLBACK (modules_register_routing_engine), NULL); + vik_gobject_builder_parse (builder, routing); + g_object_unref (builder); + } + g_free ( routing ); +} + +static void +modules_load_config(void) +{ + /* Look in the directories of data path */ + gchar * * data_dirs = a_get_viking_data_path(); + /* Priority is standard one: + left element is more important than right one. + But our logic is to load all existing files and overwrite + overlapping config with last recent one. + So, we have to process directories in reverse order. */ + int nb_data_dirs = g_strv_length ( data_dirs ); + for (; nb_data_dirs > 0 ; nb_data_dirs--) + { + modules_load_config_dir(data_dirs[nb_data_dirs-1]); + } + g_strfreev(data_dirs); + + /* Check if system config is set */ + modules_load_config_dir(VIKING_SYSCONFDIR); + + const gchar *data_home = a_get_viking_data_home (); + if (data_home) + { + modules_load_config_dir(data_home); + } + g_free ( (gchar*)data_home ); + + /* Check user's home config */ + modules_load_config_dir(a_get_viking_dir()); +} + +static void +register_loadable_types(void) +{ + /* Force registering of loadable types */ + volatile GType types[] = { + /* Maps */ + VIK_TYPE_SLIPPY_MAP_SOURCE, + VIK_TYPE_TMS_MAP_SOURCE, + VIK_TYPE_WMSC_MAP_SOURCE, + + /* Goto */ + VIK_GOTO_XML_TOOL_TYPE, + + /* Tools */ + VIK_WEBTOOL_CENTER_TYPE, + VIK_WEBTOOL_BOUNDS_TYPE, + + /* Datasource */ + VIK_WEBTOOL_DATASOURCE_TYPE, + + /* Routing */ + VIK_ROUTING_WEB_ENGINE_TYPE + }; + + /* kill 'unused variable' + argument type warnings */ + g_debug("%d types loaded", (int)sizeof(types)/(int)sizeof(GType)); +} + +/** + * First stage initialization + * Can not use a_get_preferences() yet... + * See comment in main.c + */ +void modules_init() +{ +// OSM done first so this will be the default service for searching/routing/etc... +#ifdef VIK_CONFIG_OPENSTREETMAP + osm_init(); + osm_traces_init(); +#endif +#ifdef VIK_CONFIG_BING + bing_init(); +#endif +#ifdef VIK_CONFIG_GOOGLE + google_init(); +#endif +#ifdef VIK_CONFIG_EXPEDIA + expedia_init(); +#endif +#ifdef VIK_CONFIG_TERRASERVER + terraserver_init(); +#endif +#ifdef VIK_CONFIG_BLUEMARBLE + bluemarble_init(); +#endif +#ifdef VIK_CONFIG_GEONAMES + geonames_init(); +#endif +#ifdef VIK_CONFIG_GEOCACHES + a_datasource_gc_init(); +#endif + +#ifdef HAVE_LIBMAPNIK + vik_mapnik_layer_init(); +#endif + + register_loadable_types (); + + /* As modules are loaded, we can load configuration files */ + modules_load_config (); +} + +/** + * modules_post_init: + * + * Secondary stage initialization + * Can now use a_get_preferences() and a_babel_available() + */ +void modules_post_init () +{ +#ifdef VIK_CONFIG_GOOGLE + google_post_init(); +#endif +#ifdef HAVE_LIBMAPNIK + vik_mapnik_layer_post_init(); +#endif +} + +/** + * + */ +void modules_uninit() +{ +#ifdef VIK_CONFIG_OPENSTREETMAP + osm_traces_uninit(); +#endif +#ifdef HAVE_LIBMAPNIK + vik_mapnik_layer_uninit(); +#endif +} diff --git a/src/modules.h b/src/modules.h new file mode 100644 index 0000000..3672f19 --- /dev/null +++ b/src/modules.h @@ -0,0 +1,29 @@ +/* + * viking -- GPS Data and Topo Analyzer, Explorer, and Manager + * + * Copyright (C) 2006-2007, Guilhem Bonnefille + * + * 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., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA + * + */ + +#ifndef __VIKING_MODULES_H +#define __VIKING_MODULES_H + +void modules_init(); +void modules_post_init (); +void modules_uninit(); + +#endif diff --git a/src/osm-traces.c b/src/osm-traces.c new file mode 100644 index 0000000..0fb560e --- /dev/null +++ b/src/osm-traces.c @@ -0,0 +1,830 @@ +/* + * viking -- GPS Data and Topo Analyzer, Explorer, and Manager + * + * Copyright (C) 2007, Guilhem Bonnefille + * + * 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., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA + * + */ +#ifdef HAVE_CONFIG_H +#include "config.h" +#endif + +#include +#include +#include +#include +#include + +#include +#include + +#include +#include +#include + +#include "viking.h" +#include "viktrwlayer.h" +#include "osm-traces.h" +#include "gpx.h" +#include "ui_util.h" +#include "background.h" +#include "preferences.h" +#include "curl_download.h" +#ifdef HAVE_OAUTH_H +#include +#endif + +#define VIKING_OSM_TRACES_PARAMS_GROUP_KEY "osm_traces" +#define VIKING_OSM_TRACES_PARAMS_NAMESPACE "osm_traces." + +#define OSM_USERNAME VIKING_OSM_TRACES_PARAMS_NAMESPACE"username" +#define OSM_PASSWORD VIKING_OSM_TRACES_PARAMS_NAMESPACE"password" +#define OSM_ACCESS_BUTTON VIKING_OSM_TRACES_PARAMS_NAMESPACE"NOTSAVEDaccessbutton" +#define OSM_ACCESS_TOKEN_KEY VIKING_OSM_TRACES_PARAMS_NAMESPACE"access_token_key" +#define OSM_ACCESS_TOKEN_SECRET VIKING_OSM_TRACES_PARAMS_NAMESPACE"access_token_secret" + +#define VIK_SETTINGS_OSM_TRACE_VIS "osm_trace_visibility" +#define VIK_SETTINGS_OSM_TRACE_URL "osm_trace_url" +static gint last_active = -1; + +/** + * Login to use for OSM uploading. + */ +static gchar *osm_user = NULL; + +/** + * Password to use for OSM uploading. + */ +static gchar *osm_password = NULL; + +/** + * Mutex to protect auth. token + */ +static GMutex *login_mutex = NULL; + +/** + * Different type of trace visibility. + */ +typedef struct _OsmTraceVis_t { + const gchar *combostr; + const gchar *apistr; +} OsmTraceVis_t; + +static const OsmTraceVis_t OsmTraceVis[] = { + { N_("Identifiable (public w/ timestamps)"), "identifiable" }, + { N_("Trackable (private w/ timestamps)"), "trackable" }, + { N_("Public"), "public" }, + { N_("Private"), "private" }, + { NULL, NULL }, +}; + +/** + * Struct hosting needed info. + */ +typedef struct _OsmTracesInfo { + gchar *name; + gchar *description; + gchar *tags; + gboolean anonymize_times; // ATM only available on a single track. + const OsmTraceVis_t *vistype; + VikTrwLayer *vtl; + VikTrack *trk; +} OsmTracesInfo; + +static VikLayerParam prefs[] = { + { VIK_LAYER_NUM_TYPES, OSM_ACCESS_BUTTON, VIK_LAYER_PARAM_PTR, VIK_LAYER_GROUP_NONE, N_("Access Token:"), VIK_LAYER_WIDGET_BUTTON, N_("Get New OSM Access Tokens"), NULL, NULL, NULL, NULL, NULL }, + { VIK_LAYER_NUM_TYPES, OSM_ACCESS_TOKEN_KEY, VIK_LAYER_PARAM_STRING, VIK_LAYER_GROUP_NONE, N_("Access Token Key:"), VIK_LAYER_WIDGET_ENTRY, NULL, NULL, NULL, NULL, NULL, NULL }, + { VIK_LAYER_NUM_TYPES, OSM_ACCESS_TOKEN_SECRET, VIK_LAYER_PARAM_STRING, VIK_LAYER_GROUP_NONE, N_("Access Token Secret:"), VIK_LAYER_WIDGET_ENTRY, NULL, NULL, NULL, NULL, NULL, NULL }, + { VIK_LAYER_NUM_TYPES, OSM_USERNAME, VIK_LAYER_PARAM_STRING, VIK_LAYER_GROUP_NONE, N_("OSM username:"), VIK_LAYER_WIDGET_ENTRY, NULL, NULL, NULL, NULL, NULL, NULL }, + { VIK_LAYER_NUM_TYPES, OSM_PASSWORD, VIK_LAYER_PARAM_STRING, VIK_LAYER_GROUP_NONE, N_("OSM password:"), VIK_LAYER_WIDGET_PASSWORD, NULL, NULL, NULL, NULL, NULL, NULL }, +}; + +/** + * Free an OsmTracesInfo struct. + */ +static void oti_free(OsmTracesInfo *oti) +{ + if (oti) { + /* Fields have been g_strdup'ed */ + g_free(oti->name); oti->name = NULL; + g_free(oti->description); oti->description = NULL; + g_free(oti->tags); oti->tags = NULL; + + g_object_unref(oti->vtl); oti->vtl = NULL; + } + /* Main struct has been g_malloc'ed */ + g_free(oti); +} + +static const gchar *get_default_user() +{ + const gchar *default_user = NULL; + + /* Retrieve "standard" EMAIL varenv */ + default_user = g_getenv("EMAIL"); + + return default_user; +} + +void osm_set_login(const gchar *user, const gchar *password) +{ + g_mutex_lock(login_mutex); + g_free(osm_user); osm_user = NULL; + g_free(osm_password); osm_password = NULL; + osm_user = g_strdup(user); + osm_password = g_strdup(password); + g_mutex_unlock(login_mutex); +} + +gchar *osm_get_login() +{ + gchar *user_pass = NULL; + g_mutex_lock(login_mutex); + user_pass = g_strdup_printf("%s:%s", osm_user, osm_password); + g_mutex_unlock(login_mutex); + return user_pass; +} + +#ifdef HAVE_OAUTH_H +#define OSM_OAUTH_BASE_URL "https://www.openstreetmap.org/oauth" +// +// Viking registered using https://sourceforge.net/projects/viking +// via 'https://www.openstreetmap.org/user/username/oauth_clients/new' +// +// https://wiki.openstreetmap.org/wiki/OAuth +// +static const gchar *viking_consumer_key = "bAUxFBhGSzwXo9R43gJ1JXqx8cVphItXLo0PsRV3"; +static const gchar *viking_consumer_secret = "DKWT1ydfZUF9VpiUVkMn3p7faIaUB2cBawh86a0z"; // Not exactly a secret as publically viewable right here! + +/** + * split and parse URL parameters replied by the server + * into oauth_token and oauth_token_secret. + */ +static gboolean liboauth_parse_reply ( const char *reply, gchar **token, gchar **secret ) +{ + int rc; + gboolean parsed = FALSE; + char **rv = NULL; + rc = oauth_split_url_parameters ( reply, &rv ); + qsort ( rv, rc, sizeof(char *), oauth_cmpstringp ); + if ( rc==2 + && !strncmp(rv[0],"oauth_token=",11) + && !strncmp(rv[1],"oauth_token_secret=",18) ) { + parsed = TRUE; + if (token) + *token = g_strdup ( &(rv[0][12]) ); + if (secret) + *secret = g_strdup ( &(rv[1][19]) ); + } + g_free ( rv ); + return parsed; +} + +/** + * Get new OAUTH access tokens from OSM + */ +static gint get_new_access_tokens ( gchar *request_token_key, gchar *request_token_secret, gchar **access_token_key, gchar **access_token_secret ) +{ + gchar *access = oauth_sign_url2 ( OSM_OAUTH_BASE_URL"/access_token", + NULL, OA_HMAC, NULL, viking_consumer_key, viking_consumer_secret, request_token_key, request_token_secret ); + char* reply = curl_download_get_ptr ( access, NULL ); + free ( access ); + + if ( !reply ) + return -1; + + if ( !liboauth_parse_reply ( reply, access_token_key, access_token_secret ) ) + return -2; + free ( reply ); + + g_debug ( "%s:%s", __FUNCTION__, *access_token_key ); + g_debug ( "%s:%s", __FUNCTION__, *access_token_secret ); + + return 0; +} + +/** + * Get new OAUTH request tokens from OSM + */ +static gint get_request_tokens ( gchar **token_key, gchar **token_secret ) +{ + char *request = oauth_sign_url2 ( OSM_OAUTH_BASE_URL"/request_token", + NULL, OA_HMAC, NULL, viking_consumer_key, viking_consumer_secret, NULL, NULL ); + char* reply = curl_download_get_ptr ( request, NULL ); + free ( request ); + + if ( !reply ) + return -1; + + if ( !liboauth_parse_reply ( reply, token_key, token_secret ) ) + return -2; + free ( reply ); + + g_debug ( "%s:%s", __FUNCTION__, *token_key ); + g_debug ( "%s:%s", __FUNCTION__, *token_secret ); + + return 0; +} + +/** + * Returns the Authorization URL for OSM + */ +static gchar* get_authorize_url ( gchar *request_token_key ) +{ + return g_strdup_printf ( "%s?oauth_token=%s", OSM_OAUTH_BASE_URL"/authorize", request_token_key ); +} + +/** + * Start request for New OSM Access Token + */ +static void new_access_token_cb ( ) +{ + GtkWindow *parent = GTK_WINDOW(a_vik_window_get_a_window()); + + const gchar *access_token_key_pref = a_preferences_get(OSM_ACCESS_TOKEN_KEY)->s; + const gchar *access_token_secret_pref = a_preferences_get(OSM_ACCESS_TOKEN_SECRET)->s; + if ( access_token_key_pref && access_token_secret_pref && + strlen(access_token_key_pref) > 1 && strlen(access_token_secret_pref) > 1 ) { + + // Check to really override existing values... + if ( !a_dialog_yes_or_no(parent, _("Do you want to overwrite existing values?"), NULL) ) + return; + } + + gchar *request_key = NULL; + gchar *request_secret = NULL; + // Request + gint grt = get_request_tokens ( &request_key, &request_secret ); + if ( grt != 0 ) + g_warning ( "get_request_tokens() returned %d", grt ); + + if ( !request_key || !request_secret ) { + a_dialog_error_msg ( parent, _("Not able to generate OSM request tokens.") ); + return; + } + + // JOSM uses some kind of Out of Bound 'OOB' method which doesn't direct the user to the webpage. + // However I'm unclear how this works at a low level + // it's possible that liboauth doesn't support this 1.0A feature anyway + + // Auto authorize if possible... + // gboolean authorized = liboauth_authorize_url ( request_key ); + // if ( !authorized ) { + // msg(); + // return; + // } + + // So for now just direct user to OSM website (you will have to enter credentials there & grant permissions) + gchar *authorize_url = get_authorize_url ( request_key ); + g_debug ( "%s:%s", __FUNCTION__, authorize_url ); + if ( authorize_url ) { + gtk_show_uri ( gdk_screen_get_default(), authorize_url, GDK_CURRENT_TIME, NULL ); + } + g_free ( authorize_url ); + + GtkWidget *dialog = gtk_message_dialog_new ( parent, GTK_DIALOG_MODAL | GTK_DIALOG_DESTROY_WITH_PARENT, GTK_MESSAGE_WARNING, GTK_BUTTONS_OK_CANCEL, + _("Waiting for authorization approval.\nEnsure you have granted access at the website before continuing here.")); + gtk_dialog_set_default_response ( GTK_DIALOG(dialog), GTK_RESPONSE_REJECT ); + if ( gtk_dialog_run(GTK_DIALOG(dialog)) != GTK_RESPONSE_OK ) { + gtk_widget_destroy ( dialog ); + return; + } + gtk_widget_destroy ( dialog ); + + gchar *access_token_key = NULL; + gchar *access_token_secret = NULL; + + gint gnat = get_new_access_tokens ( request_key, request_secret, &access_token_key, &access_token_secret ); + if ( gnat != 0 ) + g_warning ( "get_new_access_tokens() returned %d", gnat ); + + if ( !access_token_key || !access_token_key ) { + a_dialog_error_msg ( parent, _("No Authorization.") ); + return; + } + + // Save the values + VikLayerParamData vlp_data; + VikLayerParam *pref_key = a_preferences_get_param ( OSM_ACCESS_TOKEN_KEY ); + VikLayerParam *pref_secret = a_preferences_get_param ( OSM_ACCESS_TOKEN_SECRET ); + if ( !pref_key || !pref_secret ) { + g_critical ("%s: preference not found", __FUNCTION__); + return; + } + + // Unfortunately since the callback mechanism in preferences only allows a function call with no parameters + // we have no way of accessing the dialog to effect any updates, other than closing it + a_uibuilder_factory_close ( GTK_RESPONSE_REJECT ); + // Note since we are in an event handler already, using GTK_RESPONSE_ACCEPT means this signal + // is processed after this current function finishes. + // This then in turn means it would save the values from the dialog, + // overwriting the values set here :( + // The current side effect is that any other preferences the user has modified in the dialog are lost + + // Now apply the new values + vlp_data.s = access_token_key; + a_preferences_run_setparam ( vlp_data, pref_key ); + vlp_data.s = access_token_secret; + a_preferences_run_setparam ( vlp_data, pref_secret ); + + a_preferences_save_to_file (); + + g_free ( access_token_key ); + g_free ( access_token_secret ); + + // On success mention can remove username/password if they already exist + VikLayerParamData *pref_user = a_preferences_get ( OSM_USERNAME ); + VikLayerParamData *pref_pwd = a_preferences_get ( OSM_PASSWORD ); + + if ( pref_user && pref_pwd && + pref_user->s && pref_pwd->s && strlen(pref_user->s) > 1 ) { + a_dialog_info_msg ( parent, _("OSM Username and Password preferences are not required anymore. You can now remove them.") ); + return; + } +} + +/** + * Free after use + */ +gchar* osm_oauth_sign_url ( const gchar* url, const char *method ) +{ + gchar *signed_url = NULL; + const gchar *access_token_key_pref = a_preferences_get(OSM_ACCESS_TOKEN_KEY)->s; + const gchar *access_token_secret_pref = a_preferences_get(OSM_ACCESS_TOKEN_SECRET)->s; + + if ( access_token_key_pref && access_token_secret_pref && + strlen(access_token_key_pref) > 1 && strlen(access_token_secret_pref) > 1 ) { + signed_url = oauth_sign_url2 ( url, NULL, OA_HMAC, method, viking_consumer_key, viking_consumer_secret, access_token_key_pref, access_token_secret_pref ); + } + return signed_url; +} +#endif + +/* initialisation */ +void osm_traces_init () { + /* Preferences */ + a_preferences_register_group ( VIKING_OSM_TRACES_PARAMS_GROUP_KEY, _("OpenStreetMap Traces") ); + + guint ii = 0; + VikLayerParamData tmp; +#ifdef HAVE_OAUTH_H + tmp.ptr = new_access_token_cb; + a_preferences_register(&prefs[ii++], tmp, VIKING_OSM_TRACES_PARAMS_GROUP_KEY); + tmp.s = ""; + a_preferences_register(&prefs[ii++], tmp, VIKING_OSM_TRACES_PARAMS_GROUP_KEY); + tmp.s = ""; + a_preferences_register(&prefs[ii++], tmp, VIKING_OSM_TRACES_PARAMS_GROUP_KEY); +#endif + // Only register depreciated preferences if they already exist + // or being forced to use the basic method + if ( osm_use_basic_auth() || + (a_preferences_lookup("OSM_USERNAME") && a_preferences_lookup(OSM_PASSWORD)) ) { + tmp.s = ""; + a_preferences_register(&prefs[ii++], tmp, VIKING_OSM_TRACES_PARAMS_GROUP_KEY); + tmp.s = ""; + a_preferences_register(&prefs[ii++], tmp, VIKING_OSM_TRACES_PARAMS_GROUP_KEY); + } + + login_mutex = vik_mutex_new(); +} + +void osm_traces_uninit() +{ + vik_mutex_free(login_mutex); +} + +#define OSM_GPX_UPLOAD_URL "https://www.openstreetmap.org/api/0.6/gpx/create" + +/* + * Upload a file + * returns a basic status: + * < 0 : curl error + * == 0 : OK + * > 0 : HTTP error + * 1001 : URL signing error + */ +static gint osm_traces_upload_file(const char *user, + const char *password, + const char *file, + const char *filename, + const char *description, + const char *tags, + const OsmTraceVis_t *vistype) +{ + CURL *curl; + CURLcode res; + char curl_error_buffer[CURL_ERROR_SIZE]; + struct curl_slist *headers = NULL; + struct curl_httppost *post=NULL; + struct curl_httppost *last=NULL; + + gchar *trace_url = NULL; + if ( !a_settings_get_string ( VIK_SETTINGS_OSM_TRACE_URL, &trace_url ) ) + trace_url = g_strdup ( OSM_GPX_UPLOAD_URL ); + + gchar *user_pass = osm_get_login(); +#ifdef HAVE_OAUTH_H + char *base_url = osm_oauth_sign_url ( trace_url, "POST" ); + if ( !base_url ) { + g_free ( trace_url ); + return 1001; + } +#else + char *base_url = trace_url; +#endif + gint result = 0; // Default to it worked! + + g_debug("%s: %s %s %s %s %s %s %s", __FUNCTION__, + base_url, user, password, file, filename, description, tags); + + /* Init CURL */ + curl = curl_easy_init(); + + /* Filling the form */ + curl_formadd(&post, &last, + CURLFORM_COPYNAME, "description", + CURLFORM_COPYCONTENTS, description, CURLFORM_END); + curl_formadd(&post, &last, + CURLFORM_COPYNAME, "tags", + CURLFORM_COPYCONTENTS, tags, CURLFORM_END); + curl_formadd(&post, &last, + CURLFORM_COPYNAME, "visibility", + CURLFORM_COPYCONTENTS, vistype->apistr, CURLFORM_END); + curl_formadd(&post, &last, + CURLFORM_COPYNAME, "file", + CURLFORM_FILE, file, + CURLFORM_FILENAME, filename, + CURLFORM_CONTENTTYPE, "text/xml", CURLFORM_END); + + /* Prepare request */ + /* As explained in http://wiki.openstreetmap.org/index.php/User:LA2 */ + /* Expect: header seems to produce incompatibilites between curl and httpd */ + headers = curl_slist_append(headers, "Expect: "); + curl_easy_setopt(curl, CURLOPT_HTTPHEADER, headers); + curl_easy_setopt(curl, CURLOPT_HTTPPOST, post); + curl_easy_setopt(curl, CURLOPT_URL, base_url); +#ifndef HAVE_OAUTH_H + curl_easy_setopt(curl, CURLOPT_USERPWD, user_pass); + curl_easy_setopt(curl, CURLOPT_HTTPAUTH, CURLAUTH_ANY); +#else + if ( osm_use_basic_auth() ) { + curl_easy_setopt(curl, CURLOPT_USERPWD, user_pass); + curl_easy_setopt(curl, CURLOPT_HTTPAUTH, CURLAUTH_ANY); + } +#endif + curl_easy_setopt(curl, CURLOPT_ERRORBUFFER, curl_error_buffer); + curl_easy_setopt(curl, CURLOPT_FOLLOWLOCATION, 1L); + curl_easy_setopt(curl, CURLOPT_MAXREDIRS, 3L); + if (vik_verbose) + curl_easy_setopt ( curl, CURLOPT_VERBOSE, 1 ); + + /* Execute request */ + res = curl_easy_perform(curl); + if (res == CURLE_OK) + { + long code; + res = curl_easy_getinfo(curl, CURLINFO_RESPONSE_CODE, &code); + if (res == CURLE_OK) + { + g_debug("received valid curl response: %ld", code); + if (code != 200) { + g_warning(_("failed to upload data: HTTP response is %ld"), code); + result = code; + } + } + else { + g_critical(_("curl_easy_getinfo failed: %d"), res); + result = -1; + } + } + else { + g_warning(_("curl request failed: %s"), curl_error_buffer); + result = -2; + } + + /* Memory */ + g_free(base_url); + g_free(user_pass); user_pass = NULL; + g_free(base_url); + + curl_formfree(post); + curl_easy_cleanup(curl); + return result; +} + +/** + * uploading function executed by the background" thread + */ +static void osm_traces_upload_thread ( OsmTracesInfo *oti, gpointer threaddata ) +{ + /* Due to OSM limits, we have to enforce ele and time fields + also don't upload invisible tracks */ + static GpxWritingOptions options = { TRUE, TRUE, FALSE, FALSE }; + + if (!oti) + return; + + gchar *filename = NULL; + + /* writing gpx file */ + if (oti->trk != NULL) + { + /* Upload only the selected track */ + if ( oti->anonymize_times ) + { + VikTrack *trk = vik_track_copy(oti->trk, TRUE); + vik_track_anonymize_times(trk); + filename = a_gpx_write_track_tmp_file(trk, &options); + vik_track_free(trk); + } + else + filename = a_gpx_write_track_tmp_file (oti->trk, &options); + } + else + { + /* Upload the whole VikTrwLayer */ + filename = a_gpx_write_tmp_file (oti->vtl, &options); + } + + if ( !filename ) + return; + + /* finally, upload it */ + gint ans = osm_traces_upload_file(osm_user, osm_password, filename, + oti->name, oti->description, oti->tags, oti->vistype); + + // + // Show result in statusbar or failure in dialog for user feedback + // + + // Get current time to put into message to show when result was generated + // since need to show difference between operations (when displayed on statusbar) + // NB If on dialog then don't need time. + time_t timenow; + struct tm* timeinfo; + time ( &timenow ); + timeinfo = localtime ( &timenow ); + gchar timestr[80]; + // Compact time only - as days/date isn't very useful here + strftime ( timestr, sizeof(timestr), "%X)", timeinfo ); + + // + // Test to see if window it was invoked on is still valid + // Not sure if this test really works! (i.e. if the window was closed in the mean time) + // + if ( IS_VIK_WINDOW ((VikWindow *)VIK_GTK_WINDOW_FROM_LAYER(oti->vtl)) ) { + gchar* msg; + if ( ans == 0 ) { + // Success + msg = g_strdup_printf ( "%s (@%s)", _("Uploaded to OSM"), timestr ); + } + // Use UPPER CASE for bad news :( + else if ( ans == 1001 ) { + msg = g_strdup_printf ( "%s (@%s)", _("FAILED TO UPLOAD DATA TO OSM - Ensure the OSM access token preferences are setup."), timestr ); + } + else if ( ans < 0 ) { + msg = g_strdup_printf ( "%s (@%s)", _("FAILED TO UPLOAD DATA TO OSM - CURL PROBLEM"), timestr ); + } + else { + msg = g_strdup_printf ( "%s : %s %d (@%s)", _("FAILED TO UPLOAD DATA TO OSM"), _("HTTP response code"), ans, timestr ); + } + vik_window_statusbar_update ( (VikWindow*)VIK_GTK_WINDOW_FROM_LAYER(oti->vtl), msg, VIK_STATUSBAR_INFO ); + g_free (msg); + } + /* Removing temporary file */ + int ret = g_unlink(filename); + if (ret != 0) { + g_critical(_("failed to unlink temporary file: %s"), strerror(errno)); + } +} + +/** + * + */ +void osm_login_widgets (GtkWidget *user_entry, GtkWidget *password_entry) +{ + if (!user_entry || !password_entry) + return; + + const gchar *default_user = get_default_user(); + VikLayerParamData *pref_user = a_preferences_get ( OSM_USERNAME ); + VikLayerParamData *pref_password = a_preferences_get ( OSM_PASSWORD ); + + if (osm_user != NULL && osm_user[0] != '\0') + gtk_entry_set_text(GTK_ENTRY(user_entry), osm_user); + else if (pref_user && pref_user->s && pref_user->s[0] != '\0') + gtk_entry_set_text(GTK_ENTRY(user_entry), pref_user->s); + else if (default_user != NULL) + gtk_entry_set_text(GTK_ENTRY(user_entry), default_user); + + if (osm_password != NULL && osm_password[0] != '\0') + gtk_entry_set_text(GTK_ENTRY(password_entry), osm_password); + else if (pref_password && pref_password->s) + gtk_entry_set_text(GTK_ENTRY(password_entry), pref_password->s); + /* This is a password -> invisible */ + gtk_entry_set_visibility(GTK_ENTRY(password_entry), FALSE); +} + +#define VIK_SETTINGS_OSM_BASIC_AUTH "osm_basic_auth" +// Optional way to force basic auth method when OAuth is built in +gboolean osm_use_basic_auth ( void ) +{ +#ifdef HAVE_OAUTH_H + gboolean basic_auth = FALSE; + gboolean setting; + if ( a_settings_get_boolean ( VIK_SETTINGS_OSM_BASIC_AUTH, &setting ) ) + basic_auth = setting; +#else + gboolean basic_auth = TRUE; +#endif + return basic_auth; +} + +/** + * Uploading a VikTrwLayer + * + * @param vtl VikTrwLayer + * @param trk if not null, the track to upload + */ +void osm_traces_upload_viktrwlayer ( VikTrwLayer *vtl, VikTrack *trk ) +{ + GtkWidget *dia = gtk_dialog_new_with_buttons (_("OSM upload"), + VIK_GTK_WINDOW_FROM_LAYER(vtl), + GTK_DIALOG_MODAL | GTK_DIALOG_DESTROY_WITH_PARENT, + GTK_STOCK_CANCEL, + GTK_RESPONSE_REJECT, + GTK_STOCK_OK, + GTK_RESPONSE_ACCEPT, + NULL); + + const gchar *name = NULL; + GtkWidget *user_label, *user_entry = NULL; + GtkWidget *password_label, *password_entry = NULL; + GtkWidget *name_label, *name_entry; + GtkWidget *description_label, *description_entry; + GtkWidget *tags_label, *tags_entry; + GtkWidget *visibility; + GtkWidget *anonymize_checkbutton = NULL; + const OsmTraceVis_t *vis_t; + + if ( osm_use_basic_auth() ) { + user_label = gtk_label_new(_("Email/username:")); + user_entry = ui_entry_new ( NULL, GTK_ENTRY_ICON_SECONDARY ); + gtk_box_pack_start(GTK_BOX(gtk_dialog_get_content_area(GTK_DIALOG(dia))), user_label, FALSE, FALSE, 0); + gtk_box_pack_start(GTK_BOX(gtk_dialog_get_content_area(GTK_DIALOG(dia))), user_entry, FALSE, FALSE, 0); + gtk_widget_set_tooltip_markup(GTK_WIDGET(user_entry), + _("The email/username used as login\n" + "Enter the email/username you use to login into www.openstreetmap.org.")); + + password_label = gtk_label_new(_("Password:")); + password_entry = ui_entry_new ( NULL, GTK_ENTRY_ICON_SECONDARY ); + gtk_box_pack_start(GTK_BOX(gtk_dialog_get_content_area(GTK_DIALOG(dia))), password_label, FALSE, FALSE, 0); + gtk_box_pack_start(GTK_BOX(gtk_dialog_get_content_area(GTK_DIALOG(dia))), password_entry, FALSE, FALSE, 0); + gtk_widget_set_tooltip_markup(GTK_WIDGET(password_entry), + _("The password used to login\n" + "Enter the password you use to login into www.openstreetmap.org.")); + + osm_login_widgets ( user_entry, password_entry ); + } + + name_label = gtk_label_new(_("File's name:")); + name_entry = ui_entry_new ( NULL, GTK_ENTRY_ICON_SECONDARY ); + if (trk != NULL) + name = trk->name; + else + name = vik_layer_get_name(VIK_LAYER(vtl)); + gtk_entry_set_text(GTK_ENTRY(name_entry), name); + gtk_box_pack_start(GTK_BOX(gtk_dialog_get_content_area(GTK_DIALOG(dia))), name_label, FALSE, FALSE, 0); + gtk_box_pack_start(GTK_BOX(gtk_dialog_get_content_area(GTK_DIALOG(dia))), name_entry, FALSE, FALSE, 0); + gtk_widget_set_tooltip_markup(GTK_WIDGET(name_entry), + _("The name of the file on OSM\n" + "This is the name of the file created on the server." + "This is not the name of the local file.")); + + description_label = gtk_label_new(_("Description:")); + description_entry = ui_entry_new ( NULL, GTK_ENTRY_ICON_SECONDARY ); + const gchar *description = NULL; + if (trk != NULL) + description = trk->description; + else { + VikTRWMetadata *md = vik_trw_layer_get_metadata (vtl); + description = md ? md->description : NULL; + } + if (description) + gtk_entry_set_text(GTK_ENTRY(description_entry), description); + gtk_box_pack_start(GTK_BOX(gtk_dialog_get_content_area(GTK_DIALOG(dia))), description_label, FALSE, FALSE, 0); + gtk_box_pack_start(GTK_BOX(gtk_dialog_get_content_area(GTK_DIALOG(dia))), description_entry, FALSE, FALSE, 0); + gtk_widget_set_tooltip_text(GTK_WIDGET(description_entry), + _("The description of the trace")); + + if (trk != NULL) { + GtkWidget *label = gtk_label_new(_("Anonymize Times:")); + anonymize_checkbutton = gtk_check_button_new (); + gtk_box_pack_start(GTK_BOX(gtk_dialog_get_content_area(GTK_DIALOG(dia))), label, FALSE, FALSE, 0); + gtk_box_pack_start(GTK_BOX(gtk_dialog_get_content_area(GTK_DIALOG(dia))), anonymize_checkbutton, FALSE, FALSE, 0); + gtk_widget_set_tooltip_text(GTK_WIDGET(anonymize_checkbutton), + _("Anonymize times of the trace.\n" + "You may choose to make the trace identifiable, yet mask the actual real time values")); + } + + tags_label = gtk_label_new(_("Tags:")); + tags_entry = ui_entry_new ( NULL, GTK_ENTRY_ICON_SECONDARY ); + VikTRWMetadata *md = vik_trw_layer_get_metadata (vtl); + if (md->keywords) + gtk_entry_set_text(GTK_ENTRY(tags_entry), md->keywords); + gtk_box_pack_start(GTK_BOX(gtk_dialog_get_content_area(GTK_DIALOG(dia))), tags_label, FALSE, FALSE, 0); + gtk_box_pack_start(GTK_BOX(gtk_dialog_get_content_area(GTK_DIALOG(dia))), tags_entry, FALSE, FALSE, 0); + gtk_widget_set_tooltip_text(GTK_WIDGET(tags_entry), + _("The tags associated to the trace")); + + visibility = vik_combo_box_text_new(); + for (vis_t = OsmTraceVis; vis_t->combostr != NULL; vis_t++) + vik_combo_box_text_append (visibility, vis_t->combostr); + + // Set identifiable by default or use the settings for the value + if ( last_active < 0 ) { + gint find_entry = -1; + gint wanted_entry = -1; + gchar *vis = NULL; + if ( a_settings_get_string ( VIK_SETTINGS_OSM_TRACE_VIS, &vis ) ) { + // Use setting + if ( vis ) { + for (vis_t = OsmTraceVis; vis_t->apistr != NULL; vis_t++) { + find_entry++; + if (!strcmp(vis, vis_t->apistr)) { + wanted_entry = find_entry; + } + } + } + g_free ( vis ); + // If not found set it to the first entry, otherwise use the entry + last_active = ( wanted_entry < 0 ) ? 0 : wanted_entry; + } + else + last_active = 0; + } + gtk_combo_box_set_active(GTK_COMBO_BOX(visibility), last_active); + gtk_box_pack_start(GTK_BOX(gtk_dialog_get_content_area(GTK_DIALOG(dia))), GTK_WIDGET(visibility), FALSE, FALSE, 0); + + /* User should think about it first... */ + gtk_dialog_set_default_response ( GTK_DIALOG(dia), GTK_RESPONSE_REJECT ); + + gtk_widget_show_all ( dia ); + gtk_widget_grab_focus ( description_entry ); + + if ( gtk_dialog_run ( GTK_DIALOG(dia) ) == GTK_RESPONSE_ACCEPT ) + { + gchar *title = NULL; + + if ( osm_use_basic_auth() ) { + /* overwrite authentication info */ + osm_set_login(gtk_entry_get_text(GTK_ENTRY(user_entry)), + gtk_entry_get_text(GTK_ENTRY(password_entry))); + } + + /* Storing data for the future thread */ + OsmTracesInfo *info = g_malloc(sizeof(OsmTracesInfo)); + info->name = g_strdup(gtk_entry_get_text(GTK_ENTRY(name_entry))); + info->description = g_strdup(gtk_entry_get_text(GTK_ENTRY(description_entry))); + /* TODO Normalize tags: they will be used as URL part */ + info->tags = g_strdup(gtk_entry_get_text(GTK_ENTRY(tags_entry))); + info->vistype = &OsmTraceVis[gtk_combo_box_get_active(GTK_COMBO_BOX(visibility))]; + info->vtl = VIK_TRW_LAYER(g_object_ref(vtl)); + info->trk = trk; + if (trk != NULL && anonymize_checkbutton != NULL ) + info->anonymize_times = gtk_toggle_button_get_active(GTK_TOGGLE_BUTTON(anonymize_checkbutton)); + else + info->anonymize_times = FALSE; + + // Save visibility value for default reuse + last_active = gtk_combo_box_get_active(GTK_COMBO_BOX(visibility)); + a_settings_set_string ( VIK_SETTINGS_OSM_TRACE_VIS, OsmTraceVis[last_active].apistr ); + + title = g_strdup_printf(_("Uploading %s to OSM"), info->name); + + // launch the thread + a_background_thread( BACKGROUND_POOL_REMOTE, + VIK_GTK_WINDOW_FROM_LAYER(vtl), /* parent window */ + title, /* description string */ + (vik_thr_func) osm_traces_upload_thread, /* function to call within thread */ + info, /* pass along data */ + (vik_thr_free_func) oti_free, /* function to free pass along data */ + (vik_thr_free_func) NULL, + 1 ); + g_free ( title ); title = NULL; + } + gtk_widget_destroy ( dia ); +} diff --git a/src/osm-traces.h b/src/osm-traces.h new file mode 100644 index 0000000..19550a0 --- /dev/null +++ b/src/osm-traces.h @@ -0,0 +1,45 @@ +/* + * viking -- GPS Data and Topo Analyzer, Explorer, and Manager + * + * Copyright (C) 2007, Guilhem Bonnefille + * + * 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., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA + * + */ + +#ifndef __VIKING_OSM_TRACES_H +#define __VIKING_OSM_TRACES_H + +#include +#include + +#include "viktrwlayer.h" + +G_BEGIN_DECLS + +void osm_traces_init(); +void osm_traces_uninit(); +void osm_traces_upload_viktrwlayer ( VikTrwLayer *vtl, VikTrack *trk ); + +void osm_set_login (const gchar *user, const gchar *password); +gchar *osm_get_login(); +void osm_login_widgets (GtkWidget *user_entry, GtkWidget *password_entry); + +gboolean osm_use_basic_auth(); +gchar* osm_oauth_sign_url ( const gchar* url, const char *method ); + +G_END_DECLS + +#endif diff --git a/src/osm.c b/src/osm.c new file mode 100644 index 0000000..fc74a32 --- /dev/null +++ b/src/osm.c @@ -0,0 +1,225 @@ +/* + * viking -- GPS Data and Topo Analyzer, Explorer, and Manager + * + * Copyright (C) 2003-2005, Evan Battaglia + * Copyright (C) 2007,2013, Guilhem Bonnefille + * Copyright (c) 2012-2014, Rob Norris + * + * 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., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA + * + */ +#ifdef HAVE_CONFIG_H +#include "config.h" +#endif + +#include + +#include "osm.h" +#include "map_ids.h" +#include "vikmapslayer.h" +#include "vikslippymapsource.h" +#include "vikwmscmapsource.h" +#include "vikwebtoolcenter.h" +#include "vikwebtoolbounds.h" +#include "vikwebtoolformat.h" +#include "vikwebtool_datasource.h" +#include "vikexttools.h" +#include "vikexttool_datasources.h" +#include "vikgotoxmltool.h" +#include "vikgoto.h" +#include "vikrouting.h" +#include "vikroutingwebengine.h" + +/* initialisation */ +void osm_init () { + VikMapSource *mapnik_type = + VIK_MAP_SOURCE(g_object_new(VIK_TYPE_SLIPPY_MAP_SOURCE, + "id", MAP_ID_OSM_MAPNIK, + "label", _("OpenStreetMap (Mapnik)"), + "name", "OSM-Mapnik", + "hostname", "tile.openstreetmap.org", + "url", "/%d/%d/%d.png", + "check-file-server-time", FALSE, + "use-etag", TRUE, + "zoom-min", 0, + "zoom-max", 19, + "copyright", "© OpenStreetMap contributors", + "license", "CC-BY-SA", + "license-url", "http://www.openstreetmap.org/copyright", + NULL)); + VikMapSource *cycle_type = + VIK_MAP_SOURCE(g_object_new(VIK_TYPE_SLIPPY_MAP_SOURCE, + "id", MAP_ID_OSM_CYCLE, + "label", _("OpenStreetMap (Cycle)"), + "name", "OSM-Cycle", + "url", "https://tile.thunderforest.com/cycle/%d/%d/%d.png?apikey="VIK_CONFIG_THUNDERFOREST_KEY, + "check-file-server-time", TRUE, + "use-etag", FALSE, + "zoom-min", 0, + "zoom-max", 18, + "copyright", "Tiles courtesy of Andy Allan © OpenStreetMap contributors", + "license", "CC-BY-SA", + "license-url", "http://www.openstreetmap.org/copyright", + NULL)); + VikMapSource *transport_type = + VIK_MAP_SOURCE(g_object_new(VIK_TYPE_SLIPPY_MAP_SOURCE, + "id", MAP_ID_OSM_TRANSPORT, + "label", _("OpenStreetMap (Transport)"), + "name", "OSM-Transport", + "hostname", "tile2.opencyclemap.org", + "url", "/transport/%d/%d/%d.png", + "check-file-server-time", TRUE, + "use-etag", FALSE, + "zoom-min", 0, + "zoom-max", 18, + "copyright", "Tiles courtesy of Andy Allan © OpenStreetMap contributors", + "license", "CC-BY-SA", + "license-url", "http://www.openstreetmap.org/copyright", + NULL)); + VikMapSource *hot_type = + VIK_MAP_SOURCE(g_object_new(VIK_TYPE_SLIPPY_MAP_SOURCE, + "id", MAP_ID_OSM_HUMANITARIAN, + "name", "OSM-Humanitarian", + "label", _("OpenStreetMap (Humanitarian)"), + "hostname", "c.tile.openstreetmap.fr", + "url", "/hot/%d/%d/%d.png", + "check-file-server-time", TRUE, + "use-etag", FALSE, + "zoom-min", 0, + "zoom-max", 20, // Super detail!! + "copyright", "© OpenStreetMap contributors. Tiles courtesy of Humanitarian OpenStreetMap Team", + "license", "CC-BY-SA", + "license-url", "http://www.openstreetmap.org/copyright", + NULL)); + + // NB no cache needed for this type!! + VikMapSource *direct_type = + VIK_MAP_SOURCE(g_object_new(VIK_TYPE_SLIPPY_MAP_SOURCE, + "id", MAP_ID_OSM_ON_DISK, + "label", _("On Disk OSM Tile Format"), + // For using your own generated data assumed you know the license already! + "copyright", "© OpenStreetMap contributors", // probably + "use-direct-file-access", TRUE, + NULL)); + + // NB no cache needed for this type!! + VikMapSource *mbtiles_type = + VIK_MAP_SOURCE(g_object_new(VIK_TYPE_SLIPPY_MAP_SOURCE, + "id", MAP_ID_MBTILES, + "label", _("MBTiles File"), + // For using your own generated data assumed you know the license already! + "copyright", "© OpenStreetMap contributors", // probably + "use-direct-file-access", TRUE, + "is-mbtiles", TRUE, + NULL)); + + // NB no cache needed for this type!! + VikMapSource *metatiles_type = + VIK_MAP_SOURCE(g_object_new(VIK_TYPE_SLIPPY_MAP_SOURCE, + "id", MAP_ID_OSM_METATILES, + "label", _("OSM Metatiles"), + // For using your own generated data assumed you know the license already! + "copyright", "© OpenStreetMap contributors", // probably + "use-direct-file-access", TRUE, + "is-osm-meta-tiles", TRUE, + NULL)); + + // Note using a registered token for the Mapbox Tileservice + // Thus not only will the (free) service allocation limit be reached by normal users + // but by anymore who cares to read these sources and use the default themselves. + VikMapSource *mapbox_type = + VIK_MAP_SOURCE(g_object_new(VIK_TYPE_SLIPPY_MAP_SOURCE, + "id", MAP_ID_MAPBOX_OUTDOORS, + "name", "Mapbox-Outdoors", + "label", _("Mapbox Outdoors"), + "url", "https://api.tiles.mapbox.com/styles/v1/mapbox/outdoors-v9/tiles/256/%d/%d/%d?access_token="VIK_CONFIG_MAPBOX_TOKEN, + "check-file-server-time", TRUE, + "use-etag", FALSE, + "zoom-min", 0, + "zoom-max", 19, + "copyright", "© Mapbox © OpenStreetMap", + "license", _("Mapbox Specific"), + "license-url", "https://www.mapbox.com/tos", + NULL)); + + // NB The first registered map source is the default + // (unless the user has specified Map Layer defaults) + maps_layer_register_map_source (mapbox_type); + maps_layer_register_map_source (mapnik_type); + maps_layer_register_map_source (cycle_type); + maps_layer_register_map_source (transport_type); + maps_layer_register_map_source (hot_type); + maps_layer_register_map_source (direct_type); + maps_layer_register_map_source (mbtiles_type); + maps_layer_register_map_source (metatiles_type); + + // Webtools + VikWebtoolCenter *webtool = NULL; + webtool = vik_webtool_center_new_with_members ( _("OSM (view)"), "http://www.openstreetmap.org/?lat=%s&lon=%s&zoom=%d" ); + vik_ext_tools_register ( VIK_EXT_TOOL ( webtool ) ); + g_object_unref ( webtool ); + + webtool = vik_webtool_center_new_with_members ( _("OSM (edit)"), "http://www.openstreetmap.org/edit?lat=%s&lon=%s&zoom=%d" ); + vik_ext_tools_register ( VIK_EXT_TOOL ( webtool ) ); + g_object_unref ( webtool ); + + // Note the use of positional parameters + webtool = vik_webtool_center_new_with_members ( _("OSM (query)"), "http://www.openstreetmap.org/query?lat=%1$s&lon=%2$s#map=%3$d/%1$s/%2$s" ); + vik_ext_tools_register ( VIK_EXT_TOOL ( webtool ) ); + g_object_unref ( webtool ); + + webtool = vik_webtool_center_new_with_members ( _("OSM (render)"), "http://www.informationfreeway.org/?lat=%s&lon=%s&zoom=%d&layers=B0000F000F" ); + vik_ext_tools_register ( VIK_EXT_TOOL ( webtool ) ); + g_object_unref ( webtool ); + + VikWebtoolBounds *webtoolbounds = NULL; + // Example: http://127.0.0.1:8111/load_and_zoom?left=8.19&right=8.20&top=48.605&bottom=48.590&select=node413602999 + // JOSM or merkaartor must already be running with remote interface enabled + webtoolbounds = vik_webtool_bounds_new_with_members ( _("Local port 8111 (eg JOSM)"), "http://localhost:8111/load_and_zoom?left=%s&right=%s&bottom=%s&top=%s" ); + vik_ext_tools_register ( VIK_EXT_TOOL ( webtoolbounds ) ); + g_object_unref ( webtoolbounds ); + + VikWebtoolFormat *vwtf = NULL; + vwtf = vik_webtool_format_new_with_members ( _("Geofabrik Map Compare"), + "http://tools.geofabrik.de/mc/#%s/%s/%s", + "ZAO" ); + vik_ext_tools_register ( VIK_EXT_TOOL ( vwtf ) ); + g_object_unref ( vwtf ); + + // Datasource + VikWebtoolDatasource *vwtds = NULL; + vwtds = vik_webtool_datasource_new_with_members ( _("OpenStreetMap Notes"), "https://api.openstreetmap.org/api/0.6/notes.gpx?bbox=%s,%s,%s,%s&closed=0", "LBRT", NULL, NULL, NULL ); + vik_ext_tool_datasources_register ( VIK_EXT_TOOL ( vwtds ) ); + g_object_unref ( vwtds ); + + // Goto + VikGotoXmlTool *nominatim = VIK_GOTO_XML_TOOL ( g_object_new ( VIK_GOTO_XML_TOOL_TYPE, "label", "OSM Nominatim", + "url-format", "https://nominatim.openstreetmap.org/search?q=%s&format=xml", + "lat-path", "/searchresults/place", + "lat-attr", "lat", + "lon-path", "/searchresults/place", + "lon-attr", "lon", + "desc-path", "/searchresults/place", + "desc-attr", "display_name", + NULL ) ); + vik_goto_register ( VIK_GOTO_TOOL ( nominatim ) ); + g_object_unref ( nominatim ); + + // Not really OSM but can't be bothered to create somewhere else to put it... + webtool = vik_webtool_center_new_with_members ( _("Wikimedia Toolserver GeoHack"), "http://tools.wmflabs.org/geohack/geohack.php?params=%s;%s" ); + vik_ext_tools_register ( VIK_EXT_TOOL ( webtool ) ); + g_object_unref ( webtool ); +} + diff --git a/src/osm.h b/src/osm.h new file mode 100644 index 0000000..b8df125 --- /dev/null +++ b/src/osm.h @@ -0,0 +1,27 @@ +/* + * viking -- GPS Data and Topo Analyzer, Explorer, and Manager + * + * Copyright (C) 2003-2005, Evan Battaglia + * + * 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., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA + * + */ + +#ifndef __VIKING_OSM_H +#define __VIKING_OSM_H + +void osm_init (); + +#endif diff --git a/src/preferences.c b/src/preferences.c new file mode 100644 index 0000000..ccc11cf --- /dev/null +++ b/src/preferences.c @@ -0,0 +1,320 @@ +/* + * viking -- GPS Data and Topo Analyzer, Explorer, and Manager + * + * Copyright (C) 2003-2007, Evan Battaglia + * + * 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., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA + * + */ +#include +#include +#include +#include +#include +#include "preferences.h" +#include "dir.h" +#include "file.h" +#include "util.h" + +// TODO: STRING_LIST +// TODO: share code in file reading +// TODO: remove hackaround in show_window + +#define VIKING_PREFS_FILE "viking.prefs" + +static GPtrArray *params; +static GHashTable *values; +gboolean loaded; + +/************ groups *********/ + +static GPtrArray *groups_names; +static GHashTable *groups_keys_to_indices; // contains gint, NULL (0) is not found, instead 1 is used for 0, 2 for 1, etc. + +static void preferences_groups_init() +{ + groups_names = g_ptr_array_new(); + groups_keys_to_indices = g_hash_table_new_full ( g_str_hash, g_str_equal, g_free, NULL ); +} + +static void preferences_groups_uninit() +{ + g_ptr_array_foreach ( groups_names, (GFunc)g_free, NULL ); + g_ptr_array_free ( groups_names, TRUE ); + g_hash_table_destroy ( groups_keys_to_indices ); +} + +void a_preferences_register_group ( const gchar *key, const gchar *name ) +{ + if ( g_hash_table_lookup ( groups_keys_to_indices, key ) ) + g_critical("Duplicate preferences group keys"); + else { + g_ptr_array_add ( groups_names, g_strdup(name) ); + g_hash_table_insert ( groups_keys_to_indices, g_strdup(key), GINT_TO_POINTER ( (gint) groups_names->len ) ); /* index + 1 */ + } +} + +/* returns -1 if not found. */ +static gint16 preferences_groups_key_to_index( const gchar *key ) +{ + gint index = GPOINTER_TO_INT ( g_hash_table_lookup ( groups_keys_to_indices, key ) ); + if ( ! index ) + return VIK_LAYER_GROUP_NONE; /* which should be -1 anyway */ + return (gint16) (index - 1); +} + +/*****************************/ + +static gboolean preferences_load_from_file() +{ + gchar *fn = g_build_filename(a_get_viking_dir(), VIKING_PREFS_FILE, NULL); + FILE *f = g_fopen(fn, "r"); + g_free ( fn ); + + if ( f ) { + gchar buf[4096]; + gchar *key = NULL; + gchar *val = NULL; + VikLayerTypedParamData *oldval, *newval; + while ( ! feof (f) ) { + if (fgets(buf,sizeof(buf),f) == NULL) + break; + if ( split_string_from_file_on_equals ( buf, &key, &val ) ) { + // if it's not in there, ignore it + oldval = g_hash_table_lookup ( values, key ); + if ( ! oldval ) { + g_free(key); + g_free(val); + continue; + } + + // otherwise change it (you know the type!) + // if it's a string list do some funky stuff ... yuck... not yet. + if ( oldval->type == VIK_LAYER_PARAM_STRING_LIST ) + g_critical ( "Param strings not implemented in preferences"); // fake it + + newval = vik_layer_data_typed_param_copy_from_string ( oldval->type, val ); + g_hash_table_insert ( values, key, newval ); + + g_free(key); + g_free(val); + // change value + } + } + fclose(f); + f = NULL; + return TRUE; + } + return FALSE; +} + +static void preferences_run_setparam ( gpointer notused, guint16 i, VikLayerParamData data, VikLayerParam *vlparams ) +{ + // Don't change stored pointer values + if ( vlparams[i].type == VIK_LAYER_PARAM_PTR ) + return; + if ( vlparams[i].type == VIK_LAYER_PARAM_STRING_LIST ) + g_critical ( "Param strings not implemented in preferences"); //fake it + g_hash_table_insert ( values, (gchar *)(vlparams[i].name), vik_layer_typed_param_data_copy_from_data(vlparams[i].type, data) ); +} + +/* Allow preferences to be manipulated externally */ +void a_preferences_run_setparam ( VikLayerParamData data, VikLayerParam *vlparams ) +{ + preferences_run_setparam (NULL, 0, data, vlparams); +} + +static VikLayerParamData preferences_run_getparam ( gpointer notused, guint16 i, gboolean notused2 ) +{ + VikLayerTypedParamData *val = (VikLayerTypedParamData *) g_hash_table_lookup ( values, ((VikLayerParam *)g_ptr_array_index(params,i))->name ); + g_assert ( val != NULL ); + if ( val->type == VIK_LAYER_PARAM_STRING_LIST ) + g_critical ( "Param strings not implemented in preferences"); //fake it + return val->data; +} + +/** + * a_preferences_save_to_file: + * + * Returns: TRUE on success + */ +gboolean a_preferences_save_to_file() +{ + gchar *fn = g_build_filename(a_get_viking_dir(), VIKING_PREFS_FILE, NULL); + + FILE *f = g_fopen(fn, "w"); + // Since preferences file may contain sensitive information, + // it'll be better to store it so it can only be read by the user + if ( g_chmod(fn, 0600) != 0 ) + g_warning ( "%s: Failed to set permissions on %s", __FUNCTION__, fn ); + g_free ( fn ); + + if ( f ) { + VikLayerParam *param; + VikLayerTypedParamData *val; + int i; + for ( i = 0; i < params->len; i++ ) { + param = (VikLayerParam *) g_ptr_array_index(params,i); + val = (VikLayerTypedParamData *) g_hash_table_lookup ( values, param->name ); + if ( val ) + if ( val->type != VIK_LAYER_PARAM_PTR ) + file_write_layer_param ( f, param->name, val->type, val->data ); + } + fclose(f); + f = NULL; + return TRUE; + } + + return FALSE; +} + + +void a_preferences_show_window(GtkWindow *parent) { + //VikLayerParamData *a_uibuilder_run_dialog ( GtkWindow *parent, VikLayerParam \*params, // guint16 params_count, gchar **groups, guint8 groups_count, // VikLayerParamData *params_defaults ) + // TODO: THIS IS A MAJOR HACKAROUND, but ok when we have only a couple preferences. + gint params_count = params->len; + VikLayerParam *contiguous_params = g_new(VikLayerParam,params_count); + int i; + for ( i = 0; i < params->len; i++ ) { + contiguous_params[i] = *((VikLayerParam*)(g_ptr_array_index(params,i))); + } + loaded = TRUE; + preferences_load_from_file(); + if ( a_uibuilder_properties_factory ( _("Preferences"), parent, contiguous_params, params_count, + (gchar **) groups_names->pdata, groups_names->len, // groups, groups_count, // groups? what groups?! + NULL, + (gboolean (*) (gpointer,guint16,VikLayerParamData,gpointer)) preferences_run_setparam, + NULL /* not used */, contiguous_params, + preferences_run_getparam, NULL, NULL, // not used + FALSE, NULL, NULL ) ) { + a_preferences_save_to_file(); + } + g_free ( contiguous_params ); +} + +void a_preferences_register(VikLayerParam *pref, VikLayerParamData defaultval, const gchar *group_key ) +{ + // All preferences should be registered before loading + if ( loaded ) + g_critical ( "REGISTERING preference %s after LOADING from " VIKING_PREFS_FILE, pref->name ); + /* copy value */ + VikLayerParam *newpref = g_new(VikLayerParam,1); + *newpref = *pref; + VikLayerTypedParamData *newval = vik_layer_typed_param_data_copy_from_data(pref->type, defaultval); + if ( group_key ) + newpref->group = preferences_groups_key_to_index ( group_key ); + + g_ptr_array_add ( params, newpref ); + g_hash_table_insert ( values, (gchar *)pref->name, newval ); +} + +void a_preferences_init() +{ + preferences_groups_init(); + + /* not copied */ + params = g_ptr_array_new (); + + /* key not copied (same ptr as in pref), actual param data yes */ + values = g_hash_table_new_full ( g_str_hash, g_str_equal, NULL, vik_layer_typed_param_data_free); + + loaded = FALSE; +} + +void a_preferences_uninit() +{ + preferences_groups_uninit(); + + g_ptr_array_foreach ( params, (GFunc)g_free, NULL ); + g_ptr_array_free ( params, TRUE ); + g_hash_table_destroy ( values ); +} + + + +VikLayerParamData *a_preferences_get(const gchar *key) +{ + if ( ! loaded ) { + g_debug ( "%s: First time: %s\n", __FUNCTION__, key ); + /* since we can't load the file in a_preferences_init (no params registered yet), + * do it once before we get the first key. */ + preferences_load_from_file(); + loaded = TRUE; + } + return g_hash_table_lookup ( values, key ); +} + +/** + * a_preferences_get_param: + * @key: The name of a preference + * + * Returns the #VikLayerParam of the specified preference. + * This may be NULL if the preference doesn't exist. + */ +VikLayerParam *a_preferences_get_param(const gchar *key) +{ + if ( ! loaded ) { + g_debug ( "%s: First time: %s\n", __FUNCTION__, key ); + preferences_load_from_file(); + loaded = TRUE; + } + // Search GPtrArray *params for the name + for ( int ii = 0; ii < params->len; ii++ ) { + VikLayerParam *param = (VikLayerParam*)g_ptr_array_index ( params,ii ); + if ( g_strcmp0 (key, param->name) == 0 ) + return param; + } + return NULL; +} + +/** + * a_preferences_lookup: + * @key: The name of a preference + * + * See if a key exists in the preferences file + * (without actually processing the file into preferences) + */ +gboolean a_preferences_lookup(const gchar *key) +{ + gchar *fn = g_build_filename(a_get_viking_dir(), VIKING_PREFS_FILE, NULL); + FILE *f = g_fopen(fn, "r"); + g_free ( fn ); + + gboolean ans = FALSE; + + if ( f ) { + gchar buf[4096]; + gchar *fkey = NULL; + gchar *val = NULL; + gboolean exit_now = FALSE; + + while ( ! feof (f) ) { + if (fgets(buf,sizeof(buf),f) == NULL) + break; + if ( split_string_from_file_on_equals ( buf, &fkey, &val ) ) { + if ( g_strcmp0 (key, fkey) == 0 ) { + ans = TRUE; + exit_now = TRUE; + } + g_free(fkey); + g_free(val); + if ( exit_now ) + break; + } + } + fclose(f); + } + return ans; +} diff --git a/src/preferences.h b/src/preferences.h new file mode 100644 index 0000000..2cfeb54 --- /dev/null +++ b/src/preferences.h @@ -0,0 +1,61 @@ +/* + * viking -- GPS Data and Topo Analyzer, Explorer, and Manager + * + * Copyright (C) 2003-2007, Evan Battaglia + * + * 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., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA + * + */ +#ifndef __VIKING_PREFERENCES_H +#define __VIKING_PREFERENCES_H + +#include "uibuilder.h" + +G_BEGIN_DECLS + +// TODO IMPORTANT!!!! add REGISTER_GROUP !!! OR SOMETHING!!! CURRENTLY GROUPLESS!!! + +void a_preferences_init(); +void a_preferences_uninit(); + +/* pref should be persistent thruout the life of the preference. */ + + +/* must call FIRST */ +void a_preferences_register_group ( const gchar *key, const gchar *name ); + +/* nothing in pref is copied neither but pref itself is copied. (TODO: COPY EVERYTHING IN PREF WE NEED, IF ANYTHING), + so pref key is not copied. default param data IS copied. */ +/* group field (integer) will be overwritten */ +void a_preferences_register( VikLayerParam *pref, VikLayerParamData defaultval, const gchar *group_key ); + + +void a_preferences_show_window(GtkWindow *parent); + +VikLayerParamData *a_preferences_get(const gchar *key); + +VikLayerParam *a_preferences_get_param(const gchar *key); + +gboolean a_preferences_lookup(const gchar *key); + +/* Allow preferences to be manipulated externally */ +void a_preferences_run_setparam ( VikLayerParamData data, VikLayerParam *vlparams ); + +gboolean a_preferences_save_to_file(); + + +G_END_DECLS + +#endif diff --git a/src/print-preview.c b/src/print-preview.c new file mode 100644 index 0000000..0ac7ab6 --- /dev/null +++ b/src/print-preview.c @@ -0,0 +1,590 @@ +/* GIMP - The GNU Image Manipulation Program + * Copyright (C) 1995 Spencer Kimball and Peter Mattis + * + * 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., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. + */ +/* + * Modified for viking by Quy Tonthat + */ + +#include + +#include "print-preview.h" + + +#define DRAWING_AREA_SIZE 200 + + +enum +{ + OFFSETS_CHANGED, + LAST_SIGNAL +}; + + +static void vik_print_preview_finalize (GObject *object); + +static void vik_print_preview_size_allocate (GtkWidget *widget, + GtkAllocation *allocation, + VikPrintPreview *preview); +static void vik_print_preview_realize (GtkWidget *widget); +static gboolean vik_print_preview_event (GtkWidget *widget, + GdkEvent *event, + VikPrintPreview *preview); + +static gboolean vik_print_preview_expose_event (GtkWidget *widget, + GdkEventExpose *eevent, + VikPrintPreview *preview); + +static gdouble vik_print_preview_get_scale (VikPrintPreview *preview); + +static void vik_print_preview_get_page_margins (VikPrintPreview *preview, + gdouble *left_margin, + gdouble *right_margin, + gdouble *top_margin, + gdouble *bottom_margin); + +static void print_preview_queue_draw (VikPrintPreview *preview); + + +G_DEFINE_TYPE (VikPrintPreview, vik_print_preview, GTK_TYPE_ASPECT_FRAME) + +#define parent_class vik_print_preview_parent_class + +static guint vik_print_preview_signals[LAST_SIGNAL] = { 0 }; + + +#define g_marshal_value_peek_double(v) (v)->data[0].v_double + +static void +marshal_VOID__DOUBLE_DOUBLE (GClosure *closure, + GValue *return_value, + guint n_param_values, + const GValue *param_values, + gpointer invocation_hint, + gpointer marshal_data) +{ + typedef void (*GMarshalFunc_VOID__DOUBLE_DOUBLE) (gpointer data1, + gdouble arg_1, + gdouble arg_2, + gpointer data2); + register GMarshalFunc_VOID__DOUBLE_DOUBLE callback; + register GCClosure *cc = (GCClosure*) closure; + register gpointer data1, data2; + + g_return_if_fail (n_param_values == 3); + + if (G_CCLOSURE_SWAP_DATA (closure)) + { + data1 = closure->data; + data2 = g_value_peek_pointer (param_values + 0); + } + else + { + data1 = g_value_peek_pointer (param_values + 0); + data2 = closure->data; + } + + callback = (GMarshalFunc_VOID__DOUBLE_DOUBLE) (marshal_data ? + marshal_data : cc->callback); + + callback (data1, + g_marshal_value_peek_double (param_values + 1), + g_marshal_value_peek_double (param_values + 2), + data2); +} + +static void +vik_print_preview_class_init (VikPrintPreviewClass *klass) +{ + GObjectClass *object_class = G_OBJECT_CLASS (klass); + + vik_print_preview_signals[OFFSETS_CHANGED] = + g_signal_new ("offsets-changed", + G_TYPE_FROM_CLASS (klass), + G_SIGNAL_RUN_FIRST, + G_STRUCT_OFFSET (VikPrintPreviewClass, offsets_changed), + NULL, NULL, + marshal_VOID__DOUBLE_DOUBLE, + G_TYPE_NONE, 2, + G_TYPE_DOUBLE, + G_TYPE_DOUBLE); + + object_class->finalize = vik_print_preview_finalize; + + klass->offsets_changed = NULL; +} + +static void +vik_print_preview_init (VikPrintPreview *preview) +{ + preview->page = NULL; + preview->pixbuf = NULL; + preview->dragging = FALSE; + preview->image_offset_x = 0.0; + preview->image_offset_y = 0.0; + preview->image_offset_x_max = 0.0; + preview->image_offset_y_max = 0.0; + preview->image_xres = 230.0; // 1.0 + preview->image_yres = 230.0; + preview->use_full_page = FALSE; + + preview->area = gtk_drawing_area_new(); + gtk_container_add (GTK_CONTAINER (preview), preview->area); + gtk_widget_show (preview->area); + + gtk_widget_add_events (GTK_WIDGET (preview->area), GDK_BUTTON_PRESS_MASK); + + g_signal_connect (preview->area, "size-allocate", + G_CALLBACK (vik_print_preview_size_allocate), + preview); + g_signal_connect (preview->area, "realize", + G_CALLBACK (vik_print_preview_realize), + NULL); + g_signal_connect (preview->area, "event", + G_CALLBACK (vik_print_preview_event), + preview); + g_signal_connect (preview->area, "expose-event", + G_CALLBACK (vik_print_preview_expose_event), + preview); +} + + +static void +vik_print_preview_finalize (GObject *object) +{ + VikPrintPreview *preview = VIK_PRINT_PREVIEW (object); + + if (preview->drawable) + { + preview->drawable = NULL; + } + + if (preview->pixbuf) + { + g_object_unref (preview->pixbuf); + preview->pixbuf = NULL; + } + + if (preview->page) + { + g_object_unref (preview->page); + preview->page = NULL; + } + + G_OBJECT_CLASS (vik_print_preview_parent_class)->finalize (object); +} + +/** + * vik_print_preview_new: + * @page: page setup + * @drawable_id: the drawable to print + * + * Creates a new #VikPrintPreview widget. + * + * Return value: the new #VikPrintPreview widget. + **/ +GtkWidget * +vik_print_preview_new (GtkPageSetup *page, + GdkDrawable *drawable) +{ + VikPrintPreview *preview; + gfloat ratio; + + preview = g_object_new (VIK_TYPE_PRINT_PREVIEW, NULL); + + preview->drawable = drawable; + + if (page != NULL) + preview->page = gtk_page_setup_copy (page); + else + preview->page = gtk_page_setup_new (); + + ratio = (gtk_page_setup_get_paper_width (preview->page, GTK_UNIT_POINTS) / + gtk_page_setup_get_paper_height (preview->page, GTK_UNIT_POINTS)); + + gtk_aspect_frame_set (GTK_ASPECT_FRAME (preview), 0.5, 0.5, ratio, FALSE); + + gtk_widget_set_size_request (preview->area, + DRAWING_AREA_SIZE, DRAWING_AREA_SIZE); + + return GTK_WIDGET (preview); +} + +/** + * vik_print_preview_set_image_dpi: + * @preview: a #VikPrintPreview. + * @xres: the X resolution + * @yres: the Y resolution + * + * Sets the resolution of the image/drawable displayed by the + * #VikPrintPreview. + **/ +void +vik_print_preview_set_image_dpi (VikPrintPreview *preview, + gdouble xres, + gdouble yres) +{ + g_return_if_fail (VIK_IS_PRINT_PREVIEW (preview)); + + if (preview->image_xres != xres || preview->image_yres != yres) + { + preview->image_xres = xres; + preview->image_yres = yres; + + print_preview_queue_draw (preview); + } +} + +/** + * vik_print_preview_set_page_setup: + * @preview: a #VikPrintPreview. + * @page: the page setup to use + * + * Sets the page setup to use by the #VikPrintPreview. + **/ +void +vik_print_preview_set_page_setup (VikPrintPreview *preview, + GtkPageSetup *page) +{ + gfloat ratio; + + if (preview->page) + g_object_unref (preview->page); + + preview->page = gtk_page_setup_copy (page); + + ratio = (gtk_page_setup_get_paper_width (page, GTK_UNIT_POINTS) / + gtk_page_setup_get_paper_height (page, GTK_UNIT_POINTS)); + + gtk_aspect_frame_set (GTK_ASPECT_FRAME (preview), 0.5, 0.5, ratio, FALSE); + + print_preview_queue_draw (preview); +} + +/** + * vik_print_preview_set_image_offsets: + * @preview: a #VikPrintPreview. + * @offset_x: the X offset + * @offset_y: the Y offset + * + * Sets the offsets of the image/drawable displayed by the #VikPrintPreview. + * It does not emit the "offsets-changed" signal. + **/ +void +vik_print_preview_set_image_offsets (VikPrintPreview *preview, + gdouble offset_x, + gdouble offset_y) +{ + g_return_if_fail (VIK_IS_PRINT_PREVIEW (preview)); + + preview->image_offset_x = offset_x; + preview->image_offset_y = offset_y; + + print_preview_queue_draw (preview); +} + +/** + * vik_print_preview_set_image_offsets_max: + * @preview: a #VikPrintPreview. + * @offset_x_max: the maximum X offset allowed + * @offset_y_max: the maximum Y offset allowed + * + * Sets the maximum offsets of the image/drawable displayed by the + * #VikPrintPreview. It does not emit the "offsets-changed" signal. + **/ +void +vik_print_preview_set_image_offsets_max (VikPrintPreview *preview, + gdouble offset_x_max, + gdouble offset_y_max) +{ + g_return_if_fail (VIK_IS_PRINT_PREVIEW (preview)); + + preview->image_offset_x_max = offset_x_max; + preview->image_offset_y_max = offset_y_max; + + print_preview_queue_draw (preview); +} + +/** + * vik_print_preview_set_use_full_page: + * @preview: a #VikPrintPreview. + * @full_page: TRUE to ignore the page margins + * + * If @full_page is TRUE, the page margins are ignored and the full page + * can be used to setup printing. + **/ +void +vik_print_preview_set_use_full_page (VikPrintPreview *preview, + gboolean full_page) +{ + g_return_if_fail (VIK_IS_PRINT_PREVIEW (preview)); + + preview->use_full_page = full_page; + + print_preview_queue_draw (preview); +} + +static void +vik_print_preview_realize (GtkWidget *widget) +{ + GdkCursor *cursor; + + cursor = gdk_cursor_new_for_display (gtk_widget_get_display (widget), + GDK_FLEUR); + gdk_window_set_cursor (gtk_widget_get_window(widget), cursor); + gdk_cursor_unref (cursor); +} + +static gboolean +vik_print_preview_event (GtkWidget *widget, + GdkEvent *event, + VikPrintPreview *preview) +{ + static gdouble orig_offset_x = 0.0; + static gdouble orig_offset_y = 0.0; + static gint start_x = 0; + static gint start_y = 0; + + gdouble offset_x; + gdouble offset_y; + gdouble scale; + + switch (event->type) + { + case GDK_BUTTON_PRESS: + gdk_pointer_grab (gtk_widget_get_window(widget), FALSE, + (GDK_BUTTON1_MOTION_MASK | + GDK_BUTTON_RELEASE_MASK), + NULL, NULL, event->button.time); + + orig_offset_x = preview->image_offset_x; + orig_offset_y = preview->image_offset_y; + + start_x = event->button.x; + start_y = event->button.y; + + preview->dragging = TRUE; + break; + + case GDK_MOTION_NOTIFY: + scale = vik_print_preview_get_scale (preview); + + offset_x = (orig_offset_x + (event->motion.x - start_x) / scale); + offset_y = (orig_offset_y + (event->motion.y - start_y) / scale); + + offset_x = CLAMP (offset_x, 0, preview->image_offset_x_max); + offset_y = CLAMP (offset_y, 0, preview->image_offset_y_max); + + if (preview->image_offset_x != offset_x || + preview->image_offset_y != offset_y) + { + vik_print_preview_set_image_offsets (preview, offset_x, offset_y); + + g_signal_emit (preview, + vik_print_preview_signals[OFFSETS_CHANGED], 0, + preview->image_offset_x, preview->image_offset_y); + } + break; + + case GDK_BUTTON_RELEASE: + gdk_display_pointer_ungrab (gtk_widget_get_display (widget), + event->button.time); + start_x = start_y = 0; + preview->dragging = FALSE; + + print_preview_queue_draw (preview); + break; + + default: + break; + } + + return FALSE; +} + +static GdkPixbuf *get_thumbnail(GdkDrawable *drawable, gint thumb_width, gint thumb_height) +{ + gint width, height; + GdkPixbuf *pixbuf; + GdkPixbuf *thumbnail; + + gdk_drawable_get_size(drawable, &width, &height); + pixbuf = gdk_pixbuf_get_from_drawable(NULL, drawable, + NULL, 0, 0, 0, 0, width, height); + thumbnail = gdk_pixbuf_scale_simple(pixbuf, thumb_width, thumb_height, + GDK_INTERP_BILINEAR); + g_object_unref(pixbuf); + return thumbnail; +} + +static gboolean +vik_print_preview_expose_event (GtkWidget *widget, + GdkEventExpose *eevent, + VikPrintPreview *preview) +{ + gdouble paper_width; + gdouble paper_height; + gdouble left_margin; + gdouble right_margin; + gdouble top_margin; + gdouble bottom_margin; + gdouble scale; + cairo_t *cr; + + paper_width = gtk_page_setup_get_paper_width (preview->page, + GTK_UNIT_POINTS); + paper_height = gtk_page_setup_get_paper_height (preview->page, + GTK_UNIT_POINTS); + vik_print_preview_get_page_margins (preview, + &left_margin, + &right_margin, + &top_margin, + &bottom_margin); + + cr = gdk_cairo_create (gtk_widget_get_window(widget)); + + scale = vik_print_preview_get_scale (preview); + + /* draw background */ + cairo_scale (cr, scale, scale); + gdk_cairo_set_source_color (cr, >k_widget_get_style(widget)->white); + cairo_rectangle (cr, 0, 0, paper_width, paper_height); + cairo_fill (cr); + + /* draw page_margins */ + gdk_cairo_set_source_color (cr, >k_widget_get_style(widget)->black); + cairo_rectangle (cr, + left_margin, + top_margin, + paper_width - left_margin - right_margin, + paper_height - top_margin - bottom_margin); + cairo_stroke (cr); + + if (preview->dragging) + { + gint width, height; + gdk_drawable_get_size(preview->drawable, &width, &height); + cairo_rectangle (cr, + left_margin + preview->image_offset_x, + top_margin + preview->image_offset_y, + (gdouble) width * 72.0 / preview->image_xres, + (gdouble) height * 72.0 / preview->image_yres); + cairo_stroke (cr); + } + else + { + GdkDrawable *drawable = preview->drawable; + + /* draw image */ + cairo_translate (cr, + left_margin + preview->image_offset_x, + top_margin + preview->image_offset_y); + + if (preview->pixbuf == NULL) + { + GtkAllocation allocation; + gtk_widget_get_allocation ( widget, &allocation ); + gint width = MIN (allocation.width, 1024); + gint height = MIN (allocation.height, 1024); + + preview->pixbuf = get_thumbnail(drawable, width, height); + } + + if (preview->pixbuf != NULL) + { + gint width, height; + gdk_drawable_get_size(drawable, &width, &height); + + gdouble scale_x = ((gdouble) width / + gdk_pixbuf_get_width (preview->pixbuf)); + gdouble scale_y = ((gdouble) height / + gdk_pixbuf_get_height (preview->pixbuf)); + + scale_x = scale_x * 72.0 / preview->image_xres; + scale_y = scale_y * 72.0 / preview->image_yres; + + cairo_scale (cr, scale_x, scale_y); + + gdk_cairo_set_source_pixbuf (cr, preview->pixbuf, 0, 0); + + cairo_paint (cr); + } + } + + cairo_destroy (cr); + + return FALSE; +} + +static gdouble +vik_print_preview_get_scale (VikPrintPreview* preview) +{ + gdouble scale_x; + gdouble scale_y; + + scale_x = ((gdouble) preview->area->allocation.width / + gtk_page_setup_get_paper_width (preview->page, GTK_UNIT_POINTS)); + + scale_y = ((gdouble) preview->area->allocation.height / + gtk_page_setup_get_paper_height (preview->page, GTK_UNIT_POINTS)); + + return MIN (scale_x, scale_y); +} + +static void +vik_print_preview_size_allocate (GtkWidget *widget, + GtkAllocation *allocation, + VikPrintPreview *preview) +{ + if (preview->pixbuf != NULL) + { + g_object_unref (preview->pixbuf); + preview->pixbuf = NULL; + } +} + +static void +vik_print_preview_get_page_margins (VikPrintPreview *preview, + gdouble *left_margin, + gdouble *right_margin, + gdouble *top_margin, + gdouble *bottom_margin) +{ + if (preview->use_full_page) + { + *left_margin = 0.0; + *right_margin = 0.0; + *top_margin = 0.0; + *bottom_margin = 0.0; + } + else + { + *left_margin = gtk_page_setup_get_left_margin (preview->page, + GTK_UNIT_POINTS); + *right_margin = gtk_page_setup_get_right_margin (preview->page, + GTK_UNIT_POINTS); + *top_margin = gtk_page_setup_get_top_margin (preview->page, + GTK_UNIT_POINTS); + *bottom_margin = gtk_page_setup_get_bottom_margin (preview->page, + GTK_UNIT_POINTS); + } +} + +static void +print_preview_queue_draw (VikPrintPreview *preview) +{ + gtk_widget_queue_draw (GTK_WIDGET (preview->area)); +} diff --git a/src/print-preview.h b/src/print-preview.h new file mode 100644 index 0000000..623ff5b --- /dev/null +++ b/src/print-preview.h @@ -0,0 +1,91 @@ +/* GIMP - The GNU Image Manipulation Program + * Copyright (C) 1995 Spencer Kimball and Peter Mattis + * + * 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., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. + */ + +#ifndef __VIK_PRINT_PREVIEW_H__ +#define __VIK_PRINT_PREVIEW_H__ + +G_BEGIN_DECLS + + +#define VIK_TYPE_PRINT_PREVIEW (vik_print_preview_get_type ()) +#define VIK_PRINT_PREVIEW(obj) (G_TYPE_CHECK_INSTANCE_CAST ((obj), VIK_TYPE_PRINT_PREVIEW, VikPrintPreview)) +#define VIK_PRINT_PREVIEW_CLASS(klass) (G_TYPE_CHECK_CLASS_CAST ((klass), VIK_TYPE_PRINT_PREVIEW, VikPrintPreviewClass)) +#define VIK_IS_PRINT_PREVIEW(obj) (G_TYPE_CHECK_INSTANCE_TYPE ((obj), VIK_TYPE_PRINT_PREVIEW)) +#define VIK_IS_PRINT_PREVIEW_CLASS(klass) (G_TYPE_CHECK_CLASS_TYPE ((klass), VIK_TYPE_PRINT_PREVIEW)) +#define VIK_PRINT_PREVIEW_GET_CLASS(obj) (G_TYPE_INSTANCE_GET_CLASS ((obj), VIK_TYPE_PRINT_PREVIEW, VikPrintPreviewClass)) + +typedef struct _VikPrintPreview VikPrintPreview; +typedef struct _VikPrintPreviewClass VikPrintPreviewClass; + +struct _VikPrintPreview +{ + GtkAspectFrame parent_instance; + + GtkWidget *area; + GtkPageSetup *page; + GdkPixbuf *pixbuf; + gboolean dragging; + + GdkDrawable *drawable; + + gdouble image_offset_x; + gdouble image_offset_y; + gdouble image_offset_x_max; + gdouble image_offset_y_max; + gdouble image_xres; + gdouble image_yres; + + gboolean use_full_page; +}; + +struct _VikPrintPreviewClass +{ + GtkAspectFrameClass parent_class; + + void (* offsets_changed) (VikPrintPreview *print_preview, + gint offset_x, + gint offset_y); +}; + + +GType vik_print_preview_get_type (void) G_GNUC_CONST; + +GtkWidget * vik_print_preview_new (GtkPageSetup *page, + GdkDrawable *drawable); + +void vik_print_preview_set_image_dpi (VikPrintPreview *preview, + gdouble xres, + gdouble yres); + +void vik_print_preview_set_page_setup (VikPrintPreview *preview, + GtkPageSetup *page); + +void vik_print_preview_set_image_offsets (VikPrintPreview *preview, + gdouble offset_x, + gdouble offset_y); + +void vik_print_preview_set_image_offsets_max (VikPrintPreview *preview, + gdouble offset_x_max, + gdouble offset_y_max); + +void vik_print_preview_set_use_full_page (VikPrintPreview *preview, + gboolean full_page); + +G_END_DECLS + +#endif /* __VIK_PRINT_PREVIEW_H__ */ diff --git a/src/print.c b/src/print.c new file mode 100644 index 0000000..285e3af --- /dev/null +++ b/src/print.c @@ -0,0 +1,674 @@ +/* + * viking -- GPS Data and Topo Analyzer, Explorer, and Manager + * + * Copyright (C) 2003-2005, Evan Battaglia + * + * print.c + * Copyright (C) 2007, Quy Tonthat + * + * 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., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA + * + */ +#ifdef HAVE_CONFIG_H +#include "config.h" +#endif + +#include +#include +#include +#include + +#include "viking.h" +#include "print.h" +#include "print-preview.h" + +typedef enum +{ + VIK_PRINT_CENTER_NONE = 0, + VIK_PRINT_CENTER_HORIZONTALLY, + VIK_PRINT_CENTER_VERTICALLY, + VIK_PRINT_CENTER_BOTH, +} PrintCenterMode; + +typedef struct { + gchar *name; + PrintCenterMode mode; +} PrintCenterName; + +static const PrintCenterName center_modes[] = { + {N_("None"), VIK_PRINT_CENTER_NONE}, + {N_("Horizontally"), VIK_PRINT_CENTER_HORIZONTALLY}, + {N_("Vertically"), VIK_PRINT_CENTER_VERTICALLY}, + {N_("Both"), VIK_PRINT_CENTER_BOTH}, + {NULL, -1} +}; + +typedef struct { + gint num_pages; + gboolean show_info_header; + VikWindow *vw; + VikViewport *vvp; + gdouble xmpp, ympp; /* zoom level (meters/pixel) */ + gdouble xres; + gdouble yres; + gint width; + gint height; + gdouble offset_x; + gdouble offset_y; + PrintCenterMode center; + gboolean use_full_page; + GtkPrintOperation *operation; +} PrintData; + +static GtkWidget *create_custom_widget_cb(GtkPrintOperation *operation, PrintData *data); +static void begin_print(GtkPrintOperation *operation, GtkPrintContext *context, PrintData *data); +static void draw_page(GtkPrintOperation *print, GtkPrintContext *context, gint page_nr, PrintData *data); +static void end_print(GtkPrintOperation *operation, GtkPrintContext *context, PrintData *data); + +void a_print(VikWindow *vw, VikViewport *vvp) +{ + /* TODO: make print_settings non-static when saving_settings_to_file is + * implemented. Keep it static for now to retain settings for each + * viking session + */ + static GtkPrintSettings *print_settings = NULL; + + GtkPrintOperation *print_oper; + GtkPrintOperationResult res; + PrintData data; + + print_oper = gtk_print_operation_new (); + + data.num_pages = 1; + data.vw = vw; + data.vvp = vvp; + data.offset_x = 0; + data.offset_y = 0; + data.center = VIK_PRINT_CENTER_BOTH; + data.use_full_page = FALSE; + data.operation = print_oper; + + data.xmpp = vik_viewport_get_xmpp(vvp); + data.ympp = vik_viewport_get_ympp(vvp); + data.width = vik_viewport_get_width(vvp); + data.height = vik_viewport_get_height(vvp); + + data.xres = data.yres = 1; // This forces it to default to a 100% page size + + if (print_settings != NULL) + gtk_print_operation_set_print_settings (print_oper, print_settings); + + g_signal_connect (print_oper, "begin_print", G_CALLBACK (begin_print), &data); + g_signal_connect (print_oper, "draw_page", G_CALLBACK (draw_page), &data); + g_signal_connect (print_oper, "end-print", G_CALLBACK (end_print), &data); + g_signal_connect (print_oper, "create-custom-widget", G_CALLBACK (create_custom_widget_cb), &data); + + gtk_print_operation_set_custom_tab_label (print_oper, _("Image Settings")); + + res = gtk_print_operation_run (print_oper, + GTK_PRINT_OPERATION_ACTION_PRINT_DIALOG, + GTK_WINDOW (vw), NULL); + + if (res == GTK_PRINT_OPERATION_RESULT_APPLY) { + if (print_settings != NULL) + g_object_unref (print_settings); + print_settings = g_object_ref (gtk_print_operation_get_print_settings (print_oper)); + } + + g_object_unref (print_oper); +} + +static void begin_print(GtkPrintOperation *operation, + GtkPrintContext *context, + PrintData *data) +{ + // fputs("DEBUG: begin_print() called\n", stderr); + gtk_print_operation_set_n_pages (operation, data->num_pages); + gtk_print_operation_set_use_full_page (operation, data->use_full_page); + +} + +static void end_print(GtkPrintOperation *operation, + GtkPrintContext *context, + PrintData *data) +{ + // fputs("DEBUG: end_print() called\n", stderr); + +} + +static void copy_row_from_rgb(guchar *surface_pixels, guchar *pixbuf_pixels, gint width) +{ + guint32 *cairo_data = (guint32 *) surface_pixels; + guchar *p; + gint i; + + for (i = 0, p = pixbuf_pixels; i < width; i++) { + guint32 r = *p++; + guint32 g = *p++; + guint32 b = *p++; + cairo_data[i] = 0xFF000000 | (r << 16) | (g << 8) | b; + } +} + +#define INT_MULT(a,b,t) ((t) = (a) * (b) + 0x80, ((((t) >> 8) + (t)) >> 8)) +#define INT_BLEND(a,b,alpha,tmp) (INT_MULT((a) - (b), alpha, tmp) + (b)) +static void copy_row_from_rgba(guchar *surface_pixels, guchar *pixbuf_pixels, gint width) +{ + guint32 *cairo_data = (guint32 *) surface_pixels; + guchar *p; + gint i; + + for (i = 0, p = pixbuf_pixels; i < width; i++) { + guint32 r = *p++; + guint32 g = *p++; + guint32 b = *p++; + guint32 a = *p++; + + if (a != 255) { + guint32 tmp; + /* composite on a white background */ + r = INT_BLEND (r, 255, a, tmp); + g = INT_BLEND (g, 255, a, tmp); + b = INT_BLEND (b, 255, a, tmp); + } + cairo_data[i] = 0xFF000000 | (r << 16) | (g << 8) | b; + } +} + +static void draw_page_cairo(GtkPrintContext *context, PrintData *data) +{ + cairo_t *cr; + GdkPixbuf *pixbuf_to_draw; + cairo_surface_t *surface; + guchar *surface_pixels; + guchar *pixbuf_pixels; + gint stride; + gint pixbuf_stride; + gint pixbuf_n_channels; + gdouble cr_dpi_x; + gdouble cr_dpi_y; + gdouble scale_x; + gdouble scale_y; + gint y; + + cr = gtk_print_context_get_cairo_context(context); + pixbuf_to_draw = gdk_pixbuf_get_from_drawable(NULL, + GDK_DRAWABLE(vik_viewport_get_pixmap(data->vvp)), + NULL, 0, 0, 0, 0, data->width, data->height); + surface = cairo_image_surface_create(CAIRO_FORMAT_RGB24, + data->width, data->height); + + cr_dpi_x = gtk_print_context_get_dpi_x (context); + cr_dpi_y = gtk_print_context_get_dpi_y (context); + + scale_x = cr_dpi_x / data->xres; + scale_y = cr_dpi_y / data->yres; + + cairo_translate (cr, + data->offset_x / cr_dpi_x * 72.0, + data->offset_y / cr_dpi_y * 72.0); + cairo_scale (cr, scale_x, scale_y); + + surface_pixels = cairo_image_surface_get_data (surface); + stride = cairo_image_surface_get_stride (surface); + pixbuf_pixels = gdk_pixbuf_get_pixels (pixbuf_to_draw); + pixbuf_stride = gdk_pixbuf_get_rowstride(pixbuf_to_draw); + pixbuf_n_channels = gdk_pixbuf_get_n_channels(pixbuf_to_draw); + + // fprintf(stderr, "DEBUG: %s() surface_pixels=%p pixbuf_pixels=%p size=%d surface_width=%d surface_height=%d stride=%d data_height=%d pixmap_stride=%d pixmap_nchannels=%d pixmap_bit_per_Sample=%d\n", __PRETTY_FUNCTION__, surface_pixels, pixbuf_pixels, stride * data->height, cairo_image_surface_get_width(surface), cairo_image_surface_get_height(surface), stride, data->height, gdk_pixbuf_get_rowstride(pixbuf_to_draw), gdk_pixbuf_get_n_channels(pixbuf_to_draw), gdk_pixbuf_get_bits_per_sample(pixbuf_to_draw)); + + /* Assume the pixbuf has 8 bits per channel */ + for (y = 0; y < data->height; y++, surface_pixels += stride, pixbuf_pixels += pixbuf_stride) { + switch (pixbuf_n_channels) { + case 3: + copy_row_from_rgb (surface_pixels, pixbuf_pixels, data->width); + break; + case 4: + copy_row_from_rgba (surface_pixels, pixbuf_pixels, data->width); + break; + default: break; + } + } + + g_object_unref(G_OBJECT(pixbuf_to_draw)); + + cairo_set_source_surface(cr, surface, 0, 0); + cairo_rectangle(cr, 0, 0, data->width, data->height); + cairo_fill(cr); + cairo_surface_destroy(surface); +} + +static void draw_page(GtkPrintOperation *print, + GtkPrintContext *context, + gint page_nr, + PrintData *data) +{ + // fprintf(stderr, "DEBUG: draw_page() page_nr=%d\n", page_nr); + draw_page_cairo(context, data); + +} + +/*********************** page layout gui *********************/ +typedef struct +{ + PrintData *data; + GtkWidget *center_combo; + GtkWidget *scale; + GtkWidget *scale_label; + GtkWidget *preview; +} CustomWidgetInfo; + +enum +{ + BOTTOM, + TOP, + RIGHT, + LEFT, + WIDTH, + HEIGHT +}; + +static gboolean scale_change_value_cb(GtkRange *range, GtkScrollType scroll, gdouble value, CustomWidgetInfo *pinfo); +static void get_page_dimensions (CustomWidgetInfo *info, gdouble *page_width, gdouble *page_height, GtkUnit unit); +static void center_changed_cb (GtkWidget *combo, CustomWidgetInfo *info); +static void get_max_offsets (CustomWidgetInfo *info, gdouble *offset_x_max, gdouble *offset_y_max); +static void update_offsets (CustomWidgetInfo *info); + +static void set_scale_label(CustomWidgetInfo *pinfo, gdouble scale_val) +{ + static const gdouble inch_to_mm = 25.4; + gchar label_text[64]; + + g_snprintf(label_text, sizeof(label_text), "%.0fx%0.f mm (%.0f%%)", + inch_to_mm * pinfo->data->width / pinfo->data->xres, + inch_to_mm * pinfo->data->height / pinfo->data->yres, + scale_val); + gtk_label_set_markup (GTK_LABEL (pinfo->scale_label), label_text); +} + +static void set_scale_value(CustomWidgetInfo *pinfo) +{ + gdouble width; + gdouble height; + gdouble ratio, ratio_w, ratio_h; + + + get_page_dimensions (pinfo, &width, &height, GTK_UNIT_INCH); + ratio_w = 100 * pinfo->data->width / pinfo->data->xres / width; + ratio_h = 100 * pinfo->data->height / pinfo->data->yres / height; + + ratio = MAX(ratio_w, ratio_h); + g_signal_handlers_block_by_func(GTK_RANGE(pinfo->scale), scale_change_value_cb, pinfo); + gtk_range_set_value(GTK_RANGE(pinfo->scale), ratio); + g_signal_handlers_unblock_by_func(GTK_RANGE(pinfo->scale), scale_change_value_cb, pinfo); + set_scale_label(pinfo, ratio); +} + +static void update_page_setup (CustomWidgetInfo *pinfo) +{ + gdouble paper_width; + gdouble paper_height; + gdouble offset_x_max, offset_y_max; + PrintData *data = pinfo->data; + + get_page_dimensions (pinfo, &paper_width, &paper_height, GTK_UNIT_INCH); + if ((paper_width < (pinfo->data->width / data->xres)) || + (paper_height < (pinfo->data->height / data->yres))) { + gdouble xres, yres; + xres = (gdouble) pinfo->data->width / paper_width; + yres = (gdouble) pinfo->data->height / paper_height; + data->xres = data->yres = MAX(xres, yres); + vik_print_preview_set_image_dpi (VIK_PRINT_PREVIEW (pinfo->preview), + data->xres, data->yres); + } + get_max_offsets (pinfo, &offset_x_max, &offset_y_max); + vik_print_preview_set_image_offsets_max (VIK_PRINT_PREVIEW (pinfo->preview), + offset_x_max, offset_y_max); + update_offsets (pinfo); + set_scale_value(pinfo); + if (pinfo->preview) + vik_print_preview_set_image_offsets (VIK_PRINT_PREVIEW (pinfo->preview), + pinfo->data->offset_x, pinfo->data->offset_y); + +} + +static void page_setup_cb (GtkWidget *widget, CustomWidgetInfo *info) +{ + PrintData *data = info->data; + GtkPrintOperation *operation = data->operation; + GtkPrintSettings *settings; + GtkPageSetup *page_setup; + GtkWidget *toplevel; + + toplevel = gtk_widget_get_toplevel (widget); +#if GTK_CHECK_VERSION (2,18,0) + if (! gtk_widget_is_toplevel (toplevel)) +#else + if (! GTK_WIDGET_TOPLEVEL (toplevel)) +#endif + toplevel = NULL; + + settings = gtk_print_operation_get_print_settings (operation); + if (! settings) + settings = gtk_print_settings_new (); + + page_setup = gtk_print_operation_get_default_page_setup (operation); + + page_setup = gtk_print_run_page_setup_dialog (GTK_WINDOW (toplevel), + page_setup, settings); + + gtk_print_operation_set_default_page_setup (operation, page_setup); + + vik_print_preview_set_page_setup (VIK_PRINT_PREVIEW (info->preview), + page_setup); + + update_page_setup (info); + +} + +static void full_page_toggled_cb (GtkWidget *widget, CustomWidgetInfo *pinfo) +{ + gboolean active = gtk_toggle_button_get_active(GTK_TOGGLE_BUTTON(widget)); + + pinfo->data->use_full_page = active; + update_page_setup (pinfo); + vik_print_preview_set_use_full_page (VIK_PRINT_PREVIEW(pinfo->preview), + active); +} + +static void set_center_none (CustomWidgetInfo *info) +{ + info->data->center = VIK_PRINT_CENTER_NONE; + + if (info->center_combo) { + g_signal_handlers_block_by_func (info->center_combo, + center_changed_cb, info); + + info->data->center = VIK_PRINT_CENTER_NONE; + gtk_combo_box_set_active(GTK_COMBO_BOX(info->center_combo), info->data->center); + g_signal_handlers_unblock_by_func (info->center_combo, + center_changed_cb, info); + } +} + +static void preview_offsets_changed_cb (GtkWidget *widget, + gdouble offset_x, gdouble offset_y, + CustomWidgetInfo *info) +{ + set_center_none (info); + + info->data->offset_x = offset_x; + info->data->offset_y = offset_y; + + update_offsets (info); + +} + +static void get_page_dimensions (CustomWidgetInfo *info, + gdouble *page_width, + gdouble *page_height, + GtkUnit unit) +{ + GtkPageSetup *setup; + + setup = gtk_print_operation_get_default_page_setup (info->data->operation); + + *page_width = gtk_page_setup_get_paper_width (setup, unit); + *page_height = gtk_page_setup_get_paper_height (setup, unit); + + if (!info->data->use_full_page) { + gdouble left_margin = gtk_page_setup_get_left_margin (setup, unit); + gdouble right_margin = gtk_page_setup_get_right_margin (setup, unit); + gdouble top_margin = gtk_page_setup_get_top_margin (setup, unit); + gdouble bottom_margin = gtk_page_setup_get_bottom_margin (setup, unit); + + *page_width -= left_margin + right_margin; + *page_height -= top_margin + bottom_margin; + } + +} + +static void get_max_offsets (CustomWidgetInfo *info, + gdouble *offset_x_max, + gdouble *offset_y_max) +{ + gdouble width; + gdouble height; + + get_page_dimensions (info, &width, &height, GTK_UNIT_POINTS); + + *offset_x_max = width - 72.0 * info->data->width / info->data->xres; + *offset_x_max = MAX (0, *offset_x_max); + + *offset_y_max = height - 72.0 * info->data->height / info->data->yres; + *offset_y_max = MAX (0, *offset_y_max); +} + +static void update_offsets (CustomWidgetInfo *info) +{ + PrintData *data = info->data; + gdouble offset_x_max; + gdouble offset_y_max; + + get_max_offsets (info, &offset_x_max, &offset_y_max); + + switch (data->center) { + case VIK_PRINT_CENTER_NONE: + if (data->offset_x > offset_x_max) + data->offset_x = offset_x_max; + if (data->offset_y > offset_y_max) + data->offset_y = offset_y_max; + break; + + case VIK_PRINT_CENTER_HORIZONTALLY: + data->offset_x = offset_x_max / 2.0; + break; + + case VIK_PRINT_CENTER_VERTICALLY: + data->offset_y = offset_y_max / 2.0; + break; + + case VIK_PRINT_CENTER_BOTH: + data->offset_x = offset_x_max / 2.0; + data->offset_y = offset_y_max / 2.0; + break; + + default: break; + } +} + +static void center_changed_cb (GtkWidget *combo, CustomWidgetInfo *info) +{ + info->data->center = gtk_combo_box_get_active(GTK_COMBO_BOX(combo)); + update_offsets (info); + + if (info->preview) + vik_print_preview_set_image_offsets (VIK_PRINT_PREVIEW (info->preview), + info->data->offset_x, info->data->offset_y); +} + +static gboolean scale_change_value_cb(GtkRange *range, + GtkScrollType scroll, + gdouble value, + CustomWidgetInfo *pinfo) +{ + gdouble paper_width; + gdouble paper_height; + gdouble xres, yres, res; + gdouble offset_x_max, offset_y_max; + gdouble scale = CLAMP(value, 1, 100); + + get_page_dimensions (pinfo, &paper_width, &paper_height, GTK_UNIT_INCH); + xres = pinfo->data->width * 100 / paper_width / scale; + yres = pinfo->data->height * 100 / paper_height / scale; + res = MAX(xres, yres); + pinfo->data->xres = pinfo->data->yres = res; + get_max_offsets (pinfo, &offset_x_max, &offset_y_max); + update_offsets (pinfo); + if (pinfo->preview) { + vik_print_preview_set_image_dpi (VIK_PRINT_PREVIEW (pinfo->preview), + pinfo->data->xres, pinfo->data->yres); + vik_print_preview_set_image_offsets (VIK_PRINT_PREVIEW (pinfo->preview), + pinfo->data->offset_x, pinfo->data->offset_y); + vik_print_preview_set_image_offsets_max (VIK_PRINT_PREVIEW (pinfo->preview), + offset_x_max, offset_y_max); + } + + set_scale_label(pinfo, scale); + + return FALSE; +} + +static void custom_widgets_cleanup(CustomWidgetInfo *info) +{ + g_free(info); +} + +static GtkWidget *create_custom_widget_cb(GtkPrintOperation *operation, PrintData *data) +{ + GtkWidget *layout; + GtkWidget *main_hbox; + GtkWidget *main_vbox; + GtkWidget *hbox; + GtkWidget *vbox; + GtkWidget *button; + GtkWidget *label; + GtkPageSetup *setup; + + CustomWidgetInfo *info = g_malloc0(sizeof(CustomWidgetInfo)); + g_signal_connect_swapped (data->operation, _("done"), G_CALLBACK (custom_widgets_cleanup), info); + + + info->data = data; + + setup = gtk_print_operation_get_default_page_setup (data->operation); + if (! setup) { + setup = gtk_page_setup_new (); + gtk_print_operation_set_default_page_setup (data->operation, setup); + } + + layout = gtk_vbox_new (FALSE, 6); + gtk_container_set_border_width (GTK_CONTAINER (layout), 12); + + /* main hbox */ + main_hbox = gtk_hbox_new (FALSE, 12); + gtk_box_pack_start (GTK_BOX (layout), main_hbox, TRUE, TRUE, 0); + gtk_widget_show (main_hbox); + + /* main vbox */ + main_vbox = gtk_vbox_new (FALSE, 12); + gtk_box_pack_start (GTK_BOX (main_hbox), main_vbox, FALSE, FALSE, 0); + gtk_widget_show (main_vbox); + + vbox = gtk_vbox_new (FALSE, 6); + gtk_box_pack_start (GTK_BOX (main_vbox), vbox, FALSE, FALSE, 0); + gtk_widget_show (vbox); + + /* Page Size */ + button = gtk_button_new_with_mnemonic (_("_Adjust Page Size " + "and Orientation")); + gtk_box_pack_start (GTK_BOX (main_vbox), button, FALSE, FALSE, 0); + g_signal_connect (G_OBJECT (button), "clicked", + G_CALLBACK (page_setup_cb), + info); + gtk_widget_show (button); + + /* Center */ + GtkWidget *combo; + const PrintCenterName *center; + + hbox = gtk_hbox_new (FALSE, 6); + gtk_box_pack_start (GTK_BOX (main_vbox), hbox, FALSE, FALSE, 0); + gtk_widget_show (hbox); + + label = gtk_label_new_with_mnemonic (_("C_enter:")); + gtk_misc_set_alignment (GTK_MISC (label), 0.0, 0.5); + gtk_box_pack_start (GTK_BOX (hbox), label, FALSE, FALSE, 0); + gtk_widget_show (label); + + combo = vik_combo_box_text_new (); + for (center = center_modes; center->name; center++) { + vik_combo_box_text_append (combo, _(center->name)); + } + gtk_combo_box_set_active(GTK_COMBO_BOX(combo), VIK_PRINT_CENTER_BOTH); + gtk_box_pack_start (GTK_BOX (hbox), combo, TRUE, TRUE, 0); + gtk_widget_show (combo); + gtk_label_set_mnemonic_widget (GTK_LABEL (label), combo); + g_signal_connect(combo, "changed", + G_CALLBACK(center_changed_cb), info); + info->center_combo = combo; + + /* ignore page margins */ + button = gtk_check_button_new_with_mnemonic (_("Ignore Page _Margins")); + + gtk_toggle_button_set_active (GTK_TOGGLE_BUTTON (button), + data->use_full_page); + gtk_box_pack_start (GTK_BOX (main_vbox), button, FALSE, FALSE, 0); + g_signal_connect (button, "toggled", + G_CALLBACK (full_page_toggled_cb), + info); + gtk_widget_show (button); + + /* scale */ + vbox = gtk_vbox_new (FALSE, 1); + gtk_box_pack_start (GTK_BOX (main_vbox), vbox, FALSE, FALSE, 0); + gtk_widget_show (vbox); + + hbox = gtk_hbox_new (FALSE, 6); + gtk_box_pack_start (GTK_BOX (vbox), hbox, FALSE, FALSE, 0); + gtk_widget_show (hbox); + + label = gtk_label_new_with_mnemonic (_("Image S_ize:")); + gtk_misc_set_alignment (GTK_MISC (label), 0.0, 0.5); + gtk_box_pack_start (GTK_BOX (hbox), label, FALSE, FALSE, 0); + gtk_widget_show (label); + + label = gtk_label_new (NULL); + gtk_misc_set_alignment (GTK_MISC (label), 0.0, 0.5); + info->scale_label = label; + gtk_box_pack_start (GTK_BOX (hbox), info->scale_label, TRUE, TRUE, 0); + gtk_widget_show (info->scale_label); + + info->scale = gtk_hscale_new_with_range(1, 100, 1); + gtk_box_pack_start (GTK_BOX (vbox), info->scale, TRUE, TRUE, 0); + gtk_scale_set_draw_value(GTK_SCALE(info->scale), FALSE); + gtk_widget_show (info->scale); + gtk_label_set_mnemonic_widget (GTK_LABEL (label), info->scale); + + g_signal_connect(info->scale, "change_value", + G_CALLBACK(scale_change_value_cb), info); + + + info->preview = vik_print_preview_new (setup, GDK_DRAWABLE(vik_viewport_get_pixmap(data->vvp))); + vik_print_preview_set_use_full_page (VIK_PRINT_PREVIEW(info->preview), + data->use_full_page); + gtk_box_pack_start (GTK_BOX (main_hbox), info->preview, TRUE, TRUE, 0); + gtk_widget_show (info->preview); + + g_signal_connect (info->preview, "offsets-changed", + G_CALLBACK (preview_offsets_changed_cb), + info); + + update_page_setup (info); + + gdouble offset_x_max, offset_y_max; + get_max_offsets (info, &offset_x_max, &offset_y_max); + vik_print_preview_set_image_offsets_max (VIK_PRINT_PREVIEW (info->preview), + offset_x_max, offset_y_max); + + set_scale_value(info); + + return layout; +} diff --git a/src/print.h b/src/print.h new file mode 100644 index 0000000..901ee40 --- /dev/null +++ b/src/print.h @@ -0,0 +1,35 @@ +/* + * viking -- GPS Data and Topo Analyzer, Explorer, and Manager + * + * Copyright (C) 2003-2005, Evan Battaglia + * + * print.h + * Copyright (C) 2007, Quy Tonthat + * + * 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., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA + * + */ +#ifndef __VIKING_PRINT_H +#define __VIKING_PRINT_H + +#include "vikwindow.h" + +G_BEGIN_DECLS + +void a_print(VikWindow *vw, VikViewport *vvp); + +G_END_DECLS + +#endif /*__VIKING_PRINT_H*/ diff --git a/src/settings.c b/src/settings.c new file mode 100644 index 0000000..7c97b88 --- /dev/null +++ b/src/settings.c @@ -0,0 +1,294 @@ +/* -*- Mode: C; indent-tabs-mode: t; c-basic-offset: 4; tab-width: 4 -*- */ +/* + * viking -- GPS Data and Topo Analyzer, Explorer, and Manager + * + * Copyright (C) 2013, Rob Norris + * + * 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., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA + * + */ + /* + * Sort of like the globals file, but values are automatically saved via program use. + * Some settings are *not* intended to have any GUI controls. + * Other settings be can used to set other GUI elements. + * + * ATM This is implemented using the simple (for me!) GKeyFile API - AKA an .ini file + * One might wish to consider the more modern alternative such as: + * http://developer.gnome.org/gio/2.26/GSettings.html + * Since these settings are 'internal' I have no problem with them *not* being supported + * between various Viking versions, should one switch to different API/storage methods. + * Indeed even the internal settings themselves can be liable to change. + */ +#include +#include "dir.h" + +static GKeyFile *keyfile; + +#define VIKING_INI_FILE "viking.ini" + +static gboolean settings_load_from_file() +{ + GKeyFileFlags flags = G_KEY_FILE_KEEP_COMMENTS; + + GError *error = NULL; + + gchar *fn = g_build_filename ( a_get_viking_dir(), VIKING_INI_FILE, NULL ); + + if ( !g_key_file_load_from_file ( keyfile, fn, flags, &error ) ) { + g_warning ( "%s: %s", error->message, fn ); + g_free ( fn ); + g_error_free ( error ); + return FALSE; + } + + g_free ( fn ); + + return TRUE; +} + +void a_settings_init() +{ + keyfile = g_key_file_new(); + settings_load_from_file(); +} + +/** + * a_settings_uninit: + * + * ATM: The only time settings are saved is on program exit + * Could change this to occur on window exit or dialog exit or have memory hash of values...? + */ +void a_settings_uninit() +{ + GError *error = NULL; + gchar *fn = g_build_filename ( a_get_viking_dir(), VIKING_INI_FILE, NULL ); + gsize size; + + gchar *keyfilestr = g_key_file_to_data ( keyfile, &size, &error ); + + if ( error ) { + g_warning ( "%s", error->message ); + g_error_free ( error ); + goto tidy; + } + + g_file_set_contents ( fn, keyfilestr, size, &error ); + if ( error ) { + g_warning ( "%s: %s", error->message, fn ); + g_error_free ( error ); + } + + g_key_file_free ( keyfile ); + tidy: + g_free ( keyfilestr ); + g_free ( fn ); +} + +// ATM, can't see a point in having any more than one group for various settings +#define VIKING_SETTINGS_GROUP "viking" + +static gboolean settings_get_boolean ( const gchar *group, const gchar *name, gboolean *val ) +{ + GError *error = NULL; + gboolean success = TRUE; + gboolean bb = g_key_file_get_boolean ( keyfile, group, name, &error ); + if ( error ) { + // Only print on debug - as often may have requests for keys not in the file + g_debug ( "%s", error->message ); + g_error_free ( error ); + success = FALSE; + } + *val = bb; + return success; +} + +gboolean a_settings_get_boolean ( const gchar *name, gboolean *val ) +{ + return settings_get_boolean ( VIKING_SETTINGS_GROUP, name, val ); +} + +void a_settings_set_boolean ( const gchar *name, gboolean val ) +{ + g_key_file_set_boolean ( keyfile, VIKING_SETTINGS_GROUP, name, val ); +} + +static gboolean settings_get_string ( const gchar *group, const gchar *name, gchar **val ) +{ + GError *error = NULL; + gboolean success = TRUE; + gchar *str = g_key_file_get_string ( keyfile, group, name, &error ); + if ( error ) { + // Only print on debug - as often may have requests for keys not in the file + g_debug ( "%s", error->message ); + g_error_free ( error ); + success = FALSE; + } + *val = str; + return success; +} + +/** + * Free the returned string in @val after use + */ +gboolean a_settings_get_string ( const gchar *name, gchar **val ) +{ + return settings_get_string ( VIKING_SETTINGS_GROUP, name, val ); +} + +void a_settings_set_string ( const gchar *name, const gchar *val ) +{ + g_key_file_set_string ( keyfile, VIKING_SETTINGS_GROUP, name, val ); +} + +static gboolean settings_get_integer ( const gchar *group, const gchar *name, gint *val ) +{ + GError *error = NULL; + gboolean success = TRUE; + gint ii = g_key_file_get_integer ( keyfile, group, name, &error ); + if ( error ) { + // Only print on debug - as often may have requests for keys not in the file + g_debug ( "%s", error->message ); + g_error_free ( error ); + success = FALSE; + } + *val = ii; + return success; +} + +gboolean a_settings_get_integer ( const gchar *name, gint *val ) +{ + return settings_get_integer ( VIKING_SETTINGS_GROUP, name, val ); +} + +void a_settings_set_integer ( const gchar *name, gint val ) +{ + g_key_file_set_integer ( keyfile, VIKING_SETTINGS_GROUP, name, val ); +} + +static gboolean settings_get_double ( const gchar *group, const gchar *name, gdouble *val ) +{ + GError *error = NULL; + gboolean success = TRUE; + gdouble dd = g_key_file_get_double ( keyfile, group, name, &error ); + if ( error ) { + // Only print on debug - as often may have requests for keys not in the file + g_debug ( "%s", error->message ); + g_error_free ( error ); + success = FALSE; + } + *val = dd; + return success; +} + +gboolean a_settings_get_double ( const gchar *name, gdouble *val ) +{ + return settings_get_double ( VIKING_SETTINGS_GROUP, name, val ); +} + +void a_settings_set_double ( const gchar *name, gdouble val ) +{ + g_key_file_set_double ( keyfile, VIKING_SETTINGS_GROUP, name, val ); +} + +static gboolean settings_get_integer_list ( const gchar *group, const gchar *name, gint **vals, gsize *length ) +{ + GError *error = NULL; + gboolean success = TRUE; + gint *ints = g_key_file_get_integer_list ( keyfile, group, name, length, &error ); + if ( error ) { + // Only print on debug - as often may have requests for keys not in the file + g_debug ( "%s", error->message ); + g_error_free ( error ); + success = FALSE; + } + *vals = ints; + return success; +} + +/* + * The returned list of integers should be freed when no longer needed + */ +static gboolean a_settings_get_integer_list ( const gchar *name, gint **vals, gsize* length ) +{ + return settings_get_integer_list ( VIKING_SETTINGS_GROUP, name, vals, length ); +} + +static void a_settings_set_integer_list ( const gchar *name, gint vals[], gsize length ) +{ + g_key_file_set_integer_list ( keyfile, VIKING_SETTINGS_GROUP, name, vals, length ); +} + +gboolean a_settings_get_integer_list_contains ( const gchar *name, gint val ) +{ + gint* vals = NULL; + gsize length; + // Get current list and see if the value supplied is in the list + gboolean contains = FALSE; + // Get current list + if ( a_settings_get_integer_list ( name, &vals, &length ) ) { + // See if it's not already there + gint ii = 0; + if ( vals && length ) { + while ( ii < length ) { + if ( vals[ii] == val ) { + contains = TRUE; + break; + } + ii++; + } + // Free old array + g_free (vals); + } + } + return contains; +} + +void a_settings_set_integer_list_containing ( const gchar *name, gint val ) +{ + gint* vals = NULL; + gsize length = 0; + gboolean need_to_add = TRUE; + gint ii = 0; + // Get current list + if ( a_settings_get_integer_list ( name, &vals, &length ) ) { + // See if it's not already there + if ( vals ) { + while ( ii < length ) { + if ( vals[ii] == val ) { + need_to_add = FALSE; + break; + } + ii++; + } + } + } + // Add value into array if necessary + if ( need_to_add ) { + // NB not bothering to sort this 'list' ATM as there is not much to be gained + guint new_length = length + 1; + gint new_vals[new_length]; + // Copy any previous values + if ( vals ) { + for ( ii = 0; ii < length; ii++ ) { + new_vals[ii] = vals[ii]; + } + } + new_vals[length] = val; // Set the new value + // Apply + a_settings_set_integer_list ( name, new_vals, new_length ); + // Free old array + g_free (vals); + } +} diff --git a/src/settings.h b/src/settings.h new file mode 100644 index 0000000..812926e --- /dev/null +++ b/src/settings.h @@ -0,0 +1,58 @@ +/* -*- Mode: C; indent-tabs-mode: t; c-basic-offset: 4; tab-width: 4 -*- */ +/* + * viking -- GPS Data and Topo Analyzer, Explorer, and Manager + * + * Copyright (C) 2013, Rob Norris + * + * 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., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA + * + */ +#ifndef __SETTINGS_H +#define __SETTINGS_H + +G_BEGIN_DECLS + +void a_settings_init(); + +void a_settings_uninit(); + +gboolean a_settings_get_boolean ( const gchar *name, gboolean *val ); + +void a_settings_set_boolean ( const gchar *name, gboolean val ); + +gboolean a_settings_get_string ( const gchar *name, gchar **val ); + +void a_settings_set_string ( const gchar *name, const gchar *val ); + +gboolean a_settings_get_integer ( const gchar *name, gint *val ); + +void a_settings_set_integer ( const gchar *name, gint val ); + +gboolean a_settings_get_double ( const gchar *name, gdouble *val ); + +void a_settings_set_double ( const gchar *name, gdouble val ); + +/* +gboolean a_settings_get_integer_list ( const gchar *name, gint *vals, gsize* length ); + +void a_settings_set_integer_list ( const gchar *name, gint vals[], gsize length ); +*/ +gboolean a_settings_get_integer_list_contains ( const gchar *name, gint val ); + +void a_settings_set_integer_list_containing ( const gchar *name, gint val ); + +G_END_DECLS + +#endif diff --git a/src/srtm_continent.c b/src/srtm_continent.c new file mode 100644 index 0000000..02eb01b --- /dev/null +++ b/src/srtm_continent.c @@ -0,0 +1,2960 @@ +/* + * viking -- GPS Data and Topo Analyzer, Explorer, and Manager + * + * Copyright (C) 2007, Quy Tonthat + * + * 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., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA + * + */ +/* Generated file -- Do not edit */ +/* Generated from directory listing of the server. */ + +const char *_srtm_continent_data[] = { + "Africa", + "N00E006", "N11W016", "N20W014", "N29E039", "S10E036", + "N00E009", "N11W017", "N20W015", "N29E040", "S10E037", + "N00E010", "N12E000", "N20W016", "N29E041", "S10E038", + "N00E011", "N12E001", "N20W017", "N29E042", "S10E039", + "N00E012", "N12E002", "N20W018", "N29E043", "S10E046", + "N00E013", "N12E003", "N21E000", "N29E044", "S10E047", + "N00E014", "N12E004", "N21E001", "N29E045", "S10E050", + "N00E015", "N12E005", "N21E002", "N29E046", "S10E051", + "N00E016", "N12E006", "N21E003", "N29E047", "S11E013", + "N00E017", "N12E007", "N21E004", "N29E048", "S11E014", + "N00E018", "N12E008", "N21E005", "N29E049", "S11E015", + "N00E019", "N12E009", "N21E006", "N29E050", "S11E016", + "N00E020", "N12E010", "N21E007", "N29E051", "S11E017", + "N00E021", "N12E011", "N21E008", "N29E052", "S11E018", + "N00E022", "N12E012", "N21E009", "N29E053", "S11E019", + "N00E023", "N12E013", "N21E010", "N29E054", "S11E020", + "N00E024", "N12E014", "N21E011", "N29E055", "S11E021", + "N00E025", "N12E015", "N21E012", "N29E056", "S11E022", + "N00E026", "N12E016", "N21E013", "N29E057", "S11E023", + "N00E027", "N12E017", "N21E014", "N29E058", "S11E024", + "N00E028", "N12E018", "N21E015", "N29E059", "S11E025", + "N00E029", "N12E019", "N21E016", "N29W001", "S11E026", + "N00E030", "N12E020", "N21E017", "N29W002", "S11E027", + "N00E031", "N12E021", "N21E018", "N29W003", "S11E028", + "N00E032", "N12E022", "N21E019", "N29W004", "S11E029", + "N00E033", "N12E023", "N21E020", "N29W005", "S11E030", + "N00E034", "N12E024", "N21E021", "N29W006", "S11E031", + "N00E035", "N12E025", "N21E022", "N29W007", "S11E032", + "N00E036", "N12E026", "N21E023", "N29W008", "S11E033", + "N00E037", "N12E027", "N21E024", "N29W009", "S11E034", + "N00E038", "N12E028", "N21E025", "N29W010", "S11E035", + "N00E039", "N12E029", "N21E026", "N29W011", "S11E036", + "N00E040", "N12E030", "N21E027", "N29W014", "S11E037", + "N00E041", "N12E031", "N21E028", "N30E000", "S11E038", + "N00E042", "N12E032", "N21E029", "N30E001", "S11E039", + "N00E043", "N12E033", "N21E030", "N30E002", "S11E040", + "N01E007", "N12E034", "N21E031", "N30E003", "S11E047", + "N01E009", "N12E035", "N21E032", "N30E004", "S11E051", + "N01E010", "N12E036", "N21E033", "N30E005", "S11E056", + "N01E011", "N12E037", "N21E034", "N30E006", "S12E013", + "N01E012", "N12E038", "N21E035", "N30E007", "S12E014", + "N01E013", "N12E039", "N21E036", "N30E008", "S12E015", + "N01E014", "N12E040", "N21E037", "N30E009", "S12E016", + "N01E015", "N12E041", "N21E038", "N30E010", "S12E017", + "N01E016", "N12E042", "N21E039", "N30E011", "S12E018", + "N01E017", "N12E043", "N21E040", "N30E012", "S12E019", + "N01E018", "N12E044", "N21E041", "N30E013", "S12E020", + "N01E019", "N12E045", "N21E042", "N30E014", "S12E021", + "N01E020", "N12E052", "N21E043", "N30E015", "S12E022", + "N01E021", "N12E053", "N21E044", "N30E016", "S12E023", + "N01E022", "N12E054", "N21E045", "N30E017", "S12E024", + "N01E023", "N12W001", "N21E046", "N30E018", "S12E025", + "N01E024", "N12W002", "N21E047", "N30E019", "S12E026", + "N01E025", "N12W003", "N21E048", "N30E020", "S12E027", + "N01E026", "N12W004", "N21E049", "N30E021", "S12E028", + "N01E027", "N12W005", "N21E050", "N30E022", "S12E029", + "N01E028", "N12W006", "N21E051", "N30E023", "S12E030", + "N01E029", "N12W007", "N21E052", "N30E024", "S12E031", + "N01E030", "N12W008", "N21E053", "N30E025", "S12E032", + "N01E031", "N12W009", "N21E054", "N30E026", "S12E033", + "N01E032", "N12W010", "N21E055", "N30E027", "S12E034", + "N01E033", "N12W011", "N21E056", "N30E028", "S12E035", + "N01E034", "N12W012", "N21E057", "N30E029", "S12E036", + "N01E035", "N12W013", "N21E058", "N30E030", "S12E037", + "N01E036", "N12W014", "N21E059", "N30E031", "S12E038", + "N01E037", "N12W015", "N21W001", "N30E032", "S12E039", + "N01E038", "N12W016", "N21W002", "N30E033", "S12E040", + "N01E039", "N12W017", "N21W003", "N30E034", "S12E043", + "N01E040", "N13E000", "N21W004", "N30E035", "S12E047", + "N01E041", "N13E001", "N21W005", "N30E036", "S12E049", + "N01E042", "N13E002", "N21W006", "N30E037", "S13E012", + "N01E043", "N13E003", "N21W007", "N30E038", "S13E013", + "N01E044", "N13E004", "N21W008", "N30E039", "S13E014", + "N01E045", "N13E005", "N21W009", "N30E040", "S13E015", + "N02E009", "N13E006", "N21W010", "N30E041", "S13E016", + "N02E010", "N13E007", "N21W011", "N30E042", "S13E017", + "N02E011", "N13E008", "N21W012", "N30E043", "S13E018", + "N02E012", "N13E009", "N21W013", "N30E044", "S13E019", + "N02E013", "N13E010", "N21W014", "N30E045", "S13E020", + "N02E014", "N13E011", "N21W015", "N30E046", "S13E021", + "N02E015", "N13E012", "N21W016", "N30E047", "S13E022", + "N02E016", "N13E013", "N21W017", "N30E048", "S13E023", + "N02E017", "N13E014", "N21W018", "N30E049", "S13E024", + "N02E018", "N13E015", "N22E000", "N30E050", "S13E025", + "N02E019", "N13E016", "N22E001", "N30E051", "S13E026", + "N02E020", "N13E017", "N22E002", "N30E052", "S13E027", + "N02E021", "N13E018", "N22E003", "N30E053", "S13E028", + "N02E022", "N13E019", "N22E004", "N30E054", "S13E029", + "N02E023", "N13E020", "N22E005", "N30E055", "S13E030", + "N02E024", "N13E021", "N22E006", "N30E056", "S13E031", + "N02E025", "N13E022", "N22E007", "N30E057", "S13E032", + "N02E026", "N13E023", "N22E008", "N30E058", "S13E033", + "N02E027", "N13E024", "N22E009", "N30E059", "S13E034", + "N02E028", "N13E025", "N22E010", "N30W001", "S13E035", + "N02E029", "N13E026", "N22E011", "N30W002", "S13E036", + "N02E030", "N13E027", "N22E012", "N30W003", "S13E037", + "N02E031", "N13E028", "N22E013", "N30W004", "S13E038", + "N02E032", "N13E029", "N22E014", "N30W005", "S13E039", + "N02E033", "N13E030", "N22E015", "N30W006", "S13E040", + "N02E034", "N13E031", "N22E016", "N30W007", "S13E043", + "N02E035", "N13E032", "N22E017", "N30W008", "S13E044", + "N02E036", "N13E033", "N22E018", "N30W009", "S13E045", + "N02E037", "N13E034", "N22E019", "N30W010", "S13E048", + "N02E038", "N13E035", "N22E020", "N30W016", "S13E049", + "N02E039", "N13E036", "N22E021", "N30W017", "S14E012", + "N02E040", "N13E037", "N22E022", "N31E000", "S14E013", + "N02E041", "N13E038", "N22E023", "N31E001", "S14E014", + "N02E042", "N13E039", "N22E024", "N31E002", "S14E015", + "N02E043", "N13E040", "N22E025", "N31E003", "S14E016", + "N02E044", "N13E041", "N22E026", "N31E004", "S14E017", + "N02E045", "N13E042", "N22E027", "N31E005", "S14E018", + "N02E046", "N13E043", "N22E028", "N31E006", "S14E019", + "N03E008", "N13E044", "N22E029", "N31E007", "S14E020", + "N03E009", "N13E045", "N22E030", "N31E008", "S14E021", + "N03E010", "N13E046", "N22E031", "N31E009", "S14E022", + "N03E011", "N13E047", "N22E032", "N31E010", "S14E023", + "N03E012", "N13E048", "N22E033", "N31E011", "S14E024", + "N03E013", "N13W001", "N22E034", "N31E012", "S14E025", + "N03E014", "N13W002", "N22E035", "N31E013", "S14E026", + "N03E015", "N13W003", "N22E036", "N31E014", "S14E027", + "N03E016", "N13W004", "N22E038", "N31E015", "S14E028", + "N03E017", "N13W005", "N22E039", "N31E016", "S14E029", + "N03E018", "N13W006", "N22E040", "N31E017", "S14E030", + "N03E019", "N13W007", "N22E041", "N31E019", "S14E031", + "N03E020", "N13W008", "N22E042", "N31E020", "S14E032", + "N03E021", "N13W009", "N22E043", "N31E021", "S14E033", + "N03E022", "N13W010", "N22E044", "N31E022", "S14E034", + "N03E023", "N13W011", "N22E045", "N31E023", "S14E035", + "N03E024", "N13W012", "N22E046", "N31E024", "S14E036", + "N03E025", "N13W013", "N22E047", "N31E025", "S14E037", + "N03E026", "N13W014", "N22E048", "N31E026", "S14E038", + "N03E027", "N13W015", "N22E049", "N31E027", "S14E039", + "N03E028", "N13W016", "N22E050", "N31E028", "S14E040", + "N03E029", "N13W017", "N22E051", "N31E029", "S14E045", + "N03E030", "N14E000", "N22E052", "N31E030", "S14E047", + "N03E031", "N14E001", "N22E053", "N31E031", "S14E048", + "N03E032", "N14E002", "N22E054", "N31E032", "S14E049", + "N03E033", "N14E003", "N22E055", "N31E033", "S14E050", + "N03E034", "N14E004", "N22E056", "N31E034", "S15E012", + "N03E035", "N14E005", "N22E057", "N31E035", "S15E013", + "N03E036", "N14E006", "N22E058", "N31E036", "S15E014", + "N03E037", "N14E007", "N22E059", "N31E037", "S15E015", + "N03E038", "N14E008", "N22W001", "N31E038", "S15E016", + "N03E039", "N14E009", "N22W002", "N31E039", "S15E017", + "N03E040", "N14E010", "N22W003", "N31E040", "S15E018", + "N03E041", "N14E011", "N22W004", "N31E041", "S15E019", + "N03E042", "N14E012", "N22W005", "N31E042", "S15E020", + "N03E043", "N14E013", "N22W006", "N31E043", "S15E021", + "N03E044", "N14E014", "N22W007", "N31E044", "S15E022", + "N03E045", "N14E015", "N22W008", "N31E045", "S15E023", + "N03E046", "N14E016", "N22W009", "N31E046", "S15E024", + "N03E047", "N14E017", "N22W010", "N31E047", "S15E025", + "N04E005", "N14E018", "N22W011", "N31E048", "S15E026", + "N04E006", "N14E019", "N22W012", "N31E049", "S15E027", + "N04E007", "N14E020", "N22W013", "N31E050", "S15E028", + "N04E008", "N14E021", "N22W014", "N31E051", "S15E029", + "N04E009", "N14E022", "N22W015", "N31E052", "S15E030", + "N04E010", "N14E023", "N22W016", "N31E053", "S15E031", + "N04E011", "N14E024", "N22W017", "N31E054", "S15E032", + "N04E012", "N14E025", "N23E000", "N31E055", "S15E033", + "N04E013", "N14E026", "N23E001", "N31E056", "S15E034", + "N04E014", "N14E027", "N23E002", "N31E057", "S15E035", + "N04E015", "N14E028", "N23E003", "N31E058", "S15E036", + "N04E016", "N14E029", "N23E004", "N31E059", "S15E037", + "N04E017", "N14E030", "N23E005", "N31W001", "S15E038", + "N04E018", "N14E031", "N23E006", "N31W002", "S15E039", + "N04E019", "N14E032", "N23E007", "N31W003", "S15E040", + "N04E020", "N14E033", "N23E008", "N31W004", "S15E047", + "N04E021", "N14E034", "N23E009", "N31W005", "S15E048", + "N04E022", "N14E035", "N23E010", "N31W006", "S15E049", + "N04E023", "N14E036", "N23E011", "N31W007", "S15E050", + "N04E024", "N14E037", "N23E012", "N31W008", "S16E011", + "N04E025", "N14E038", "N23E013", "N31W009", "S16E012", + "N04E026", "N14E039", "N23E014", "N31W010", "S16E013", + "N04E027", "N14E040", "N23E015", "N32E000", "S16E014", + "N04E028", "N14E041", "N23E016", "N32E001", "S16E015", + "N04E029", "N14E042", "N23E017", "N32E002", "S16E016", + "N04E030", "N14E043", "N23E018", "N32E003", "S16E017", + "N04E031", "N14E044", "N23E019", "N32E004", "S16E018", + "N04E032", "N14E045", "N23E020", "N32E005", "S16E019", + "N04E033", "N14E046", "N23E021", "N32E006", "S16E020", + "N04E034", "N14E047", "N23E022", "N32E007", "S16E021", + "N04E035", "N14E048", "N23E023", "N32E008", "S16E022", + "N04E036", "N14E049", "N23E024", "N32E009", "S16E023", + "N04E037", "N14E050", "N23E025", "N32E010", "S16E024", + "N04E038", "N14W001", "N23E026", "N32E011", "S16E025", + "N04E039", "N14W002", "N23E027", "N32E012", "S16E026", + "N04E040", "N14W003", "N23E028", "N32E013", "S16E027", + "N04E041", "N14W004", "N23E029", "N32E014", "S16E028", + "N04E042", "N14W005", "N23E030", "N32E015", "S16E029", + "N04E043", "N14W006", "N23E031", "N32E019", "S16E030", + "N04E044", "N14W007", "N23E032", "N32E020", "S16E031", + "N04E045", "N14W008", "N23E033", "N32E021", "S16E032", + "N04E046", "N14W009", "N23E034", "N32E022", "S16E033", + "N04E047", "N14W010", "N23E035", "N32E023", "S16E034", + "N04E048", "N14W011", "N23E036", "N32E024", "S16E035", + "N04W002", "N14W012", "N23E038", "N32E034", "S16E036", + "N04W003", "N14W013", "N23E039", "N32E035", "S16E037", + "N04W006", "N14W014", "N23E040", "N32E036", "S16E038", + "N04W007", "N14W015", "N23E041", "N32E037", "S16E039", + "N04W008", "N14W016", "N23E042", "N32E038", "S16E040", + "N04W009", "N14W017", "N23E043", "N32E039", "S16E045", + "N04W010", "N14W018", "N23E044", "N32E040", "S16E046", + "N05E000", "N14W024", "N23E045", "N32E041", "S16E047", + "N05E001", "N14W025", "N23E046", "N32E042", "S16E048", + "N05E004", "N15E000", "N23E047", "N32E043", "S16E049", + "N05E005", "N15E001", "N23E048", "N32E044", "S16E050", + "N05E006", "N15E002", "N23E049", "N32E045", "S16E054", + "N05E007", "N15E003", "N23E050", "N32E046", "S17E011", + "N05E008", "N15E004", "N23E051", "N32E047", "S17E012", + "N05E009", "N15E005", "N23E052", "N32E048", "S17E013", + "N05E010", "N15E006", "N23E053", "N32E049", "S17E014", + "N05E011", "N15E007", "N23E054", "N32E050", "S17E015", + "N05E012", "N15E008", "N23E055", "N32E051", "S17E016", + "N05E013", "N15E009", "N23E056", "N32E052", "S17E017", + "N05E014", "N15E010", "N23E057", "N32E053", "S17E018", + "N05E015", "N15E011", "N23E058", "N32E054", "S17E019", + "N05E016", "N15E012", "N23E059", "N32E055", "S17E020", + "N05E017", "N15E013", "N23W001", "N32E056", "S17E021", + "N05E018", "N15E014", "N23W002", "N32E057", "S17E022", + "N05E019", "N15E015", "N23W003", "N32E058", "S17E023", + "N05E020", "N15E016", "N23W004", "N32E059", "S17E024", + "N05E021", "N15E017", "N23W005", "N32W001", "S17E025", + "N05E022", "N15E018", "N23W006", "N32W002", "S17E026", + "N05E023", "N15E019", "N23W007", "N32W003", "S17E027", + "N05E024", "N15E020", "N23W008", "N32W004", "S17E028", + "N05E025", "N15E021", "N23W009", "N32W005", "S17E029", + "N05E026", "N15E022", "N23W010", "N32W006", "S17E030", + "N05E027", "N15E023", "N23W011", "N32W007", "S17E031", + "N05E028", "N15E024", "N23W012", "N32W008", "S17E032", + "N05E029", "N15E025", "N23W013", "N32W009", "S17E033", + "N05E030", "N15E026", "N23W014", "N32W010", "S17E034", + "N05E031", "N15E027", "N23W015", "N32W017", "S17E035", + "N05E032", "N15E028", "N23W016", "N32W018", "S17E036", + "N05E033", "N15E029", "N23W017", "N33E000", "S17E037", + "N05E034", "N15E030", "N24E000", "N33E001", "S17E038", + "N05E035", "N15E031", "N24E001", "N33E002", "S17E039", + "N05E036", "N15E032", "N24E002", "N33E003", "S17E040", + "N05E037", "N15E033", "N24E003", "N33E004", "S17E043", + "N05E038", "N15E034", "N24E004", "N33E005", "S17E044", + "N05E039", "N15E035", "N24E005", "N33E006", "S17E045", + "N05E040", "N15E036", "N24E006", "N33E007", "S17E046", + "N05E041", "N15E037", "N24E007", "N33E008", "S17E047", + "N05E042", "N15E038", "N24E008", "N33E009", "S17E048", + "N05E043", "N15E039", "N24E009", "N33E010", "S17E049", + "N05E044", "N15E040", "N24E010", "N33E011", "S17E050", + "N05E045", "N15E041", "N24E011", "N33E035", "S17E059", + "N05E046", "N15E042", "N24E012", "N33E036", "S18E011", + "N05E047", "N15E043", "N24E013", "N33E037", "S18E012", + "N05E048", "N15E044", "N24E014", "N33E038", "S18E013", + "N05W001", "N15E045", "N24E015", "N33E039", "S18E014", + "N05W002", "N15E046", "N24E016", "N33E040", "S18E015", + "N05W003", "N15E047", "N24E017", "N33E041", "S18E016", + "N05W004", "N15E048", "N24E018", "N33E042", "S18E017", + "N05W005", "N15E049", "N24E019", "N33E043", "S18E018", + "N05W006", "N15E050", "N24E020", "N33E044", "S18E019", + "N05W007", "N15E051", "N24E021", "N33E045", "S18E020", + "N05W008", "N15E052", "N24E022", "N33E046", "S18E021", + "N05W009", "N15W001", "N24E023", "N33E047", "S18E022", + "N05W010", "N15W002", "N24E024", "N33E048", "S18E023", + "N05W011", "N15W003", "N24E025", "N33E049", "S18E024", + "N06E000", "N15W004", "N24E026", "N33E050", "S18E025", + "N06E001", "N15W005", "N24E027", "N33E051", "S18E026", + "N06E002", "N15W006", "N24E028", "N33E052", "S18E027", + "N06E003", "N15W007", "N24E029", "N33E053", "S18E028", + "N06E004", "N15W008", "N24E030", "N33E054", "S18E029", + "N06E005", "N15W009", "N24E031", "N33E055", "S18E030", + "N06E006", "N15W010", "N24E032", "N33E056", "S18E031", + "N06E007", "N15W011", "N24E033", "N33E057", "S18E032", + "N06E008", "N15W012", "N24E034", "N33E058", "S18E033", + "N06E009", "N15W013", "N24E035", "N33E059", "S18E034", + "N06E010", "N15W014", "N24E037", "N33W001", "S18E035", + "N06E011", "N15W015", "N24E038", "N33W002", "S18E036", + "N06E012", "N15W016", "N24E039", "N33W003", "S18E037", + "N06E013", "N15W017", "N24E040", "N33W004", "S18E038", + "N06E014", "N15W018", "N24E041", "N33W005", "S18E039", + "N06E015", "N15W023", "N24E042", "N33W006", "S18E042", + "N06E016", "N15W024", "N24E043", "N33W007", "S18E043", + "N06E017", "N15W025", "N24E044", "N33W008", "S18E044", + "N06E018", "N16E000", "N24E045", "N33W009", "S18E045", + "N06E019", "N16E001", "N24E046", "N33W017", "S18E046", + "N06E020", "N16E002", "N24E047", "N34E000", "S18E047", + "N06E021", "N16E003", "N24E048", "N34E001", "S18E048", + "N06E022", "N16E004", "N24E049", "N34E002", "S18E049", + "N06E023", "N16E005", "N24E050", "N34E003", "S19E011", + "N06E024", "N16E006", "N24E051", "N34E004", "S19E012", + "N06E025", "N16E007", "N24E052", "N34E005", "S19E013", + "N06E026", "N16E008", "N24E053", "N34E006", "S19E014", + "N06E027", "N16E009", "N24E054", "N34E007", "S19E015", + "N06E028", "N16E010", "N24E055", "N34E008", "S19E016", + "N06E029", "N16E011", "N24E056", "N34E009", "S19E017", + "N06E030", "N16E012", "N24E057", "N34E010", "S19E018", + "N06E031", "N16E013", "N24W001", "N34E011", "S19E019", + "N06E032", "N16E014", "N24W002", "N34E023", "S19E020", + "N06E033", "N16E015", "N24W003", "N34E024", "S19E021", + "N06E034", "N16E016", "N24W004", "N34E025", "S19E022", + "N06E035", "N16E017", "N24W005", "N34E026", "S19E023", + "N06E036", "N16E018", "N24W006", "N34E032", "S19E024", + "N06E037", "N16E019", "N24W007", "N34E033", "S19E025", + "N06E038", "N16E020", "N24W008", "N34E034", "S19E026", + "N06E039", "N16E021", "N24W009", "N34E035", "S19E027", + "N06E040", "N16E022", "N24W010", "N34E036", "S19E028", + "N06E041", "N16E023", "N24W011", "N34E037", "S19E029", + "N06E042", "N16E024", "N24W012", "N34E038", "S19E030", + "N06E043", "N16E025", "N24W013", "N34E039", "S19E031", + "N06E044", "N16E026", "N24W014", "N34E040", "S19E032", + "N06E045", "N16E027", "N24W015", "N34E041", "S19E033", + "N06E046", "N16E028", "N24W016", "N34E042", "S19E034", + "N06E047", "N16E029", "N25E000", "N34E043", "S19E035", + "N06E048", "N16E030", "N25E001", "N34E044", "S19E036", + "N06E049", "N16E031", "N25E002", "N34E045", "S19E037", + "N06W001", "N16E032", "N25E003", "N34E046", "S19E043", + "N06W002", "N16E033", "N25E004", "N34E047", "S19E044", + "N06W003", "N16E034", "N25E005", "N34E048", "S19E045", + "N06W004", "N16E035", "N25E006", "N34E049", "S19E046", + "N06W005", "N16E036", "N25E007", "N34E050", "S19E047", + "N06W006", "N16E037", "N25E008", "N34E051", "S19E048", + "N06W007", "N16E038", "N25E009", "N34E052", "S19E049", + "N06W008", "N16E039", "N25E010", "N34E053", "S20E012", + "N06W009", "N16E040", "N25E011", "N34E054", "S20E013", + "N06W010", "N16E041", "N25E012", "N34E055", "S20E014", + "N06W011", "N16E042", "N25E013", "N34E056", "S20E015", + "N06W012", "N16E043", "N25E014", "N34E057", "S20E016", + "N07E000", "N16E044", "N25E015", "N34E058", "S20E017", + "N07E001", "N16E045", "N25E016", "N34E059", "S20E018", + "N07E002", "N16E046", "N25E017", "N34W001", "S20E019", + "N07E003", "N16E047", "N25E018", "N34W002", "S20E020", + "N07E004", "N16E048", "N25E019", "N34W003", "S20E021", + "N07E005", "N16E049", "N25E020", "N34W004", "S20E022", + "N07E006", "N16E050", "N25E021", "N34W005", "S20E023", + "N07E007", "N16E051", "N25E022", "N34W006", "S20E024", + "N07E008", "N16E052", "N25E023", "N34W007", "S20E025", + "N07E009", "N16E053", "N25E024", "N36W026", "S20E026", + "N07E010", "N16E054", "N25E025", "N37W025", "S20E027", + "N07E011", "N16E055", "N25E026", "N37W026", "S20E028", + "N07E012", "N16W001", "N25E027", "N38W028", "S20E029", + "N07E013", "N16W002", "N25E028", "N38W029", "S20E030", + "N07E014", "N16W003", "N25E029", "N39W028", "S20E031", + "N07E015", "N16W004", "N25E030", "N39W029", "S20E032", + "N07E016", "N16W005", "N25E031", "N39W032", "S20E033", + "N07E017", "N16W006", "N25E032", "S01E006", "S20E034", + "N07E018", "N16W007", "N25E033", "S01E008", "S20E035", + "N07E019", "N16W008", "N25E034", "S01E009", "S20E044", + "N07E020", "N16W009", "N25E036", "S01E010", "S20E045", + "N07E021", "N16W010", "N25E037", "S01E011", "S20E046", + "N07E022", "N16W011", "N25E038", "S01E012", "S20E047", + "N07E023", "N16W012", "N25E039", "S01E013", "S20E048", + "N07E024", "N16W013", "N25E040", "S01E014", "S20E049", + "N07E025", "N16W014", "N25E041", "S01E015", "S20E057", + "N07E026", "N16W015", "N25E042", "S01E016", "S20E063", + "N07E027", "N16W016", "N25E043", "S01E017", "S21E013", + "N07E028", "N16W017", "N25E044", "S01E018", "S21E014", + "N07E029", "N16W023", "N25E045", "S01E019", "S21E015", + "N07E030", "N16W025", "N25E046", "S01E020", "S21E016", + "N07E031", "N16W026", "N25E047", "S01E021", "S21E017", + "N07E032", "N17E000", "N25E048", "S01E022", "S21E018", + "N07E033", "N17E001", "N25E049", "S01E023", "S21E019", + "N07E034", "N17E002", "N25E050", "S01E024", "S21E020", + "N07E035", "N17E003", "N25E051", "S01E025", "S21E021", + "N07E036", "N17E004", "N25E052", "S01E026", "S21E022", + "N07E037", "N17E005", "N25E054", "S01E027", "S21E023", + "N07E038", "N17E006", "N25E055", "S01E028", "S21E024", + "N07E039", "N17E007", "N25E056", "S01E029", "S21E025", + "N07E040", "N17E008", "N25E057", "S01E030", "S21E026", + "N07E041", "N17E009", "N25E058", "S01E031", "S21E027", + "N07E042", "N17E010", "N25E059", "S01E032", "S21E028", + "N07E043", "N17E011", "N25W001", "S01E033", "S21E029", + "N07E044", "N17E012", "N25W002", "S01E034", "S21E030", + "N07E045", "N17E013", "N25W003", "S01E035", "S21E031", + "N07E046", "N17E014", "N25W004", "S01E036", "S21E032", + "N07E047", "N17E015", "N25W005", "S01E037", "S21E033", + "N07E048", "N17E016", "N25W006", "S01E038", "S21E034", + "N07E049", "N17E017", "N25W007", "S01E039", "S21E035", + "N07W001", "N17E018", "N25W008", "S01E040", "S21E043", + "N07W002", "N17E019", "N25W009", "S01E041", "S21E044", + "N07W003", "N17E020", "N25W010", "S01E042", "S21E045", + "N07W004", "N17E021", "N25W011", "S02E005", "S21E046", + "N07W005", "N17E022", "N25W012", "S02E008", "S21E047", + "N07W006", "N17E023", "N25W013", "S02E009", "S21E048", + "N07W007", "N17E024", "N25W014", "S02E010", "S21E055", + "N07W008", "N17E025", "N25W015", "S02E011", "S21E057", + "N07W009", "N17E026", "N26E000", "S02E012", "S22E013", + "N07W010", "N17E027", "N26E001", "S02E013", "S22E014", + "N07W011", "N17E028", "N26E002", "S02E014", "S22E015", + "N07W012", "N17E029", "N26E003", "S02E015", "S22E016", + "N07W013", "N17E030", "N26E004", "S02E016", "S22E017", + "N07W014", "N17E031", "N26E005", "S02E017", "S22E018", + "N08E000", "N17E032", "N26E006", "S02E018", "S22E019", + "N08E001", "N17E033", "N26E007", "S02E019", "S22E020", + "N08E002", "N17E034", "N26E008", "S02E020", "S22E021", + "N08E003", "N17E035", "N26E009", "S02E021", "S22E022", + "N08E004", "N17E036", "N26E010", "S02E022", "S22E023", + "N08E005", "N17E037", "N26E011", "S02E023", "S22E024", + "N08E006", "N17E038", "N26E012", "S02E024", "S22E025", + "N08E007", "N17E039", "N26E013", "S02E025", "S22E026", + "N08E008", "N17E041", "N26E014", "S02E026", "S22E027", + "N08E009", "N17E042", "N26E015", "S02E027", "S22E028", + "N08E010", "N17E043", "N26E016", "S02E028", "S22E029", + "N08E011", "N17E044", "N26E017", "S02E029", "S22E030", + "N08E012", "N17E045", "N26E018", "S02E030", "S22E031", + "N08E013", "N17E046", "N26E019", "S02E031", "S22E032", + "N08E014", "N17E047", "N26E020", "S02E032", "S22E033", + "N08E015", "N17E048", "N26E021", "S02E033", "S22E034", + "N08E016", "N17E049", "N26E022", "S02E034", "S22E035", + "N08E017", "N17E050", "N26E023", "S02E035", "S22E043", + "N08E018", "N17E051", "N26E024", "S02E036", "S22E044", + "N08E019", "N17E052", "N26E025", "S02E037", "S22E045", + "N08E020", "N17E053", "N26E026", "S02E038", "S22E046", + "N08E021", "N17E054", "N26E027", "S02E039", "S22E047", + "N08E022", "N17E055", "N26E028", "S02E040", "S22E048", + "N08E023", "N17E056", "N26E029", "S02E041", "S22E055", + "N08E024", "N17W001", "N26E030", "S02E042", "S23E014", + "N08E025", "N17W002", "N26E031", "S03E009", "S23E015", + "N08E026", "N17W003", "N26E032", "S03E010", "S23E016", + "N08E027", "N17W004", "N26E033", "S03E011", "S23E017", + "N08E028", "N17W005", "N26E034", "S03E012", "S23E018", + "N08E029", "N17W006", "N26E035", "S03E013", "S23E019", + "N08E030", "N17W007", "N26E036", "S03E014", "S23E020", + "N08E031", "N17W008", "N26E037", "S03E015", "S23E021", + "N08E032", "N17W009", "N26E038", "S03E016", "S23E022", + "N08E033", "N17W010", "N26E039", "S03E017", "S23E023", + "N08E034", "N17W011", "N26E040", "S03E018", "S23E024", + "N08E035", "N17W012", "N26E041", "S03E019", "S23E025", + "N08E036", "N17W013", "N26E042", "S03E020", "S23E026", + "N08E037", "N17W014", "N26E043", "S03E021", "S23E027", + "N08E038", "N17W015", "N26E044", "S03E022", "S23E028", + "N08E039", "N17W016", "N26E045", "S03E023", "S23E029", + "N08E040", "N17W017", "N26E046", "S03E024", "S23E030", + "N08E041", "N17W025", "N26E047", "S03E025", "S23E031", + "N08E042", "N17W026", "N26E048", "S03E026", "S23E032", + "N08E043", "N18E000", "N26E049", "S03E027", "S23E033", + "N08E044", "N18E001", "N26E050", "S03E028", "S23E034", + "N08E045", "N18E002", "N26E051", "S03E029", "S23E035", + "N08E046", "N18E003", "N26E053", "S03E030", "S23E040", + "N08E047", "N18E004", "N26E054", "S03E031", "S23E043", + "N08E048", "N18E005", "N26E055", "S03E032", "S23E044", + "N08E049", "N18E006", "N26E056", "S03E033", "S23E045", + "N08E050", "N18E007", "N26E057", "S03E034", "S23E046", + "N08W001", "N18E008", "N26E058", "S03E035", "S23E047", + "N08W002", "N18E009", "N26E059", "S03E036", "S23E048", + "N08W003", "N18E010", "N26W001", "S03E037", "S24E014", + "N08W004", "N18E011", "N26W002", "S03E038", "S24E015", + "N08W005", "N18E012", "N26W003", "S03E039", "S24E016", + "N08W006", "N18E013", "N26W004", "S03E040", "S24E017", + "N08W007", "N18E014", "N26W005", "S03E041", "S24E018", + "N08W008", "N18E015", "N26W006", "S04E010", "S24E019", + "N08W009", "N18E016", "N26W007", "S04E011", "S24E020", + "N08W010", "N18E017", "N26W008", "S04E012", "S24E021", + "N08W011", "N18E018", "N26W009", "S04E013", "S24E022", + "N08W012", "N18E019", "N26W010", "S04E014", "S24E023", + "N08W013", "N18E020", "N26W011", "S04E015", "S24E024", + "N08W014", "N18E021", "N26W012", "S04E016", "S24E025", + "N09E000", "N18E022", "N26W013", "S04E017", "S24E026", + "N09E001", "N18E023", "N26W014", "S04E018", "S24E027", + "N09E002", "N18E024", "N26W015", "S04E019", "S24E028", + "N09E003", "N18E025", "N27E000", "S04E020", "S24E029", + "N09E004", "N18E026", "N27E001", "S04E021", "S24E030", + "N09E005", "N18E027", "N27E002", "S04E022", "S24E031", + "N09E006", "N18E028", "N27E003", "S04E023", "S24E032", + "N09E007", "N18E029", "N27E004", "S04E024", "S24E033", + "N09E008", "N18E030", "N27E005", "S04E025", "S24E034", + "N09E009", "N18E031", "N27E006", "S04E026", "S24E035", + "N09E010", "N18E032", "N27E007", "S04E027", "S24E043", + "N09E011", "N18E033", "N27E008", "S04E028", "S24E044", + "N09E012", "N18E034", "N27E009", "S04E029", "S24E045", + "N09E013", "N18E035", "N27E010", "S04E030", "S24E046", + "N09E014", "N18E036", "N27E011", "S04E031", "S24E047", + "N09E015", "N18E037", "N27E012", "S04E032", "S25E014", + "N09E016", "N18E038", "N27E013", "S04E033", "S25E015", + "N09E017", "N18E040", "N27E014", "S04E034", "S25E016", + "N09E018", "N18E041", "N27E015", "S04E035", "S25E017", + "N09E019", "N18E042", "N27E016", "S04E036", "S25E018", + "N09E020", "N18E043", "N27E017", "S04E037", "S25E019", + "N09E021", "N18E044", "N27E018", "S04E038", "S25E020", + "N09E022", "N18E045", "N27E019", "S04E039", "S25E021", + "N09E023", "N18E046", "N27E020", "S04E040", "S25E022", + "N09E024", "N18E047", "N27E021", "S04E055", "S25E023", + "N09E025", "N18E048", "N27E022", "S05E011", "S25E024", + "N09E026", "N18E049", "N27E023", "S05E012", "S25E025", + "N09E027", "N18E050", "N27E024", "S05E013", "S25E026", + "N09E028", "N18E051", "N27E025", "S05E014", "S25E027", + "N09E029", "N18E052", "N27E026", "S05E015", "S25E028", + "N09E030", "N18E053", "N27E027", "S05E016", "S25E029", + "N09E031", "N18E054", "N27E028", "S05E017", "S25E030", + "N09E032", "N18E055", "N27E029", "S05E018", "S25E031", + "N09E033", "N18E056", "N27E030", "S05E019", "S25E032", + "N09E034", "N18E057", "N27E031", "S05E020", "S25E033", + "N09E035", "N18W001", "N27E032", "S05E021", "S25E034", + "N09E036", "N18W002", "N27E033", "S05E022", "S25E035", + "N09E037", "N18W003", "N27E034", "S05E023", "S25E043", + "N09E038", "N18W004", "N27E035", "S05E024", "S25E044", + "N09E039", "N18W005", "N27E036", "S05E025", "S25E045", + "N09E040", "N18W006", "N27E037", "S05E026", "S25E046", + "N09E041", "N18W007", "N27E038", "S05E027", "S25E047", + "N09E042", "N18W008", "N27E039", "S05E028", "S26E014", + "N09E043", "N18W009", "N27E040", "S05E029", "S26E015", + "N09E044", "N18W010", "N27E041", "S05E030", "S26E016", + "N09E045", "N18W011", "N27E042", "S05E031", "S26E017", + "N09E046", "N18W012", "N27E043", "S05E032", "S26E018", + "N09E047", "N18W013", "N27E044", "S05E033", "S26E019", + "N09E048", "N18W014", "N27E045", "S05E034", "S26E020", + "N09E049", "N18W015", "N27E046", "S05E035", "S26E021", + "N09E050", "N18W016", "N27E047", "S05E036", "S26E022", + "N09W001", "N18W017", "N27E048", "S05E037", "S26E023", + "N09W002", "N19E000", "N27E049", "S05E038", "S26E024", + "N09W003", "N19E001", "N27E050", "S05E039", "S26E025", + "N09W004", "N19E002", "N27E051", "S05E053", "S26E026", + "N09W005", "N19E003", "N27E052", "S05E055", "S26E027", + "N09W006", "N19E004", "N27E053", "S06E011", "S26E028", + "N09W007", "N19E005", "N27E054", "S06E012", "S26E029", + "N09W008", "N19E006", "N27E055", "S06E013", "S26E030", + "N09W009", "N19E007", "N27E056", "S06E014", "S26E031", + "N09W010", "N19E008", "N27E057", "S06E015", "S26E032", + "N09W011", "N19E009", "N27E058", "S06E016", "S26E033", + "N09W012", "N19E010", "N27E059", "S06E017", "S26E034", + "N09W013", "N19E011", "N27W001", "S06E018", "S26E044", + "N09W014", "N19E012", "N27W002", "S06E019", "S26E045", + "N09W015", "N19E013", "N27W003", "S06E020", "S26E046", + "N10E000", "N19E014", "N27W004", "S06E021", "S26E047", + "N10E001", "N19E015", "N27W005", "S06E022", "S27E014", + "N10E002", "N19E016", "N27W006", "S06E023", "S27E015", + "N10E003", "N19E017", "N27W007", "S06E024", "S27E016", + "N10E004", "N19E018", "N27W008", "S06E025", "S27E017", + "N10E005", "N19E019", "N27W009", "S06E026", "S27E018", + "N10E006", "N19E020", "N27W010", "S06E027", "S27E019", + "N10E007", "N19E021", "N27W011", "S06E028", "S27E020", + "N10E008", "N19E022", "N27W012", "S06E029", "S27E021", + "N10E009", "N19E023", "N27W013", "S06E030", "S27E022", + "N10E010", "N19E024", "N27W014", "S06E031", "S27E023", + "N10E011", "N19E025", "N27W016", "S06E032", "S27E024", + "N10E012", "N19E026", "N27W017", "S06E033", "S27E025", + "N10E013", "N19E027", "N27W018", "S06E034", "S27E026", + "N10E014", "N19E028", "N27W019", "S06E035", "S27E027", + "N10E015", "N19E029", "N28E000", "S06E036", "S27E028", + "N10E016", "N19E030", "N28E001", "S06E037", "S27E029", + "N10E017", "N19E031", "N28E002", "S06E038", "S27E030", + "N10E018", "N19E032", "N28E003", "S06E039", "S27E031", + "N10E019", "N19E033", "N28E004", "S06E053", "S27E032", + "N10E020", "N19E034", "N28E005", "S06E055", "S28E015", + "N10E021", "N19E035", "N28E006", "S07E012", "S28E016", + "N10E022", "N19E036", "N28E007", "S07E013", "S28E017", + "N10E023", "N19E037", "N28E008", "S07E014", "S28E018", + "N10E024", "N19E038", "N28E009", "S07E015", "S28E019", + "N10E025", "N19E039", "N28E010", "S07E016", "S28E020", + "N10E026", "N19E040", "N28E011", "S07E017", "S28E021", + "N10E027", "N19E041", "N28E012", "S07E018", "S28E022", + "N10E028", "N19E042", "N28E013", "S07E019", "S28E023", + "N10E029", "N19E043", "N28E014", "S07E020", "S28E024", + "N10E030", "N19E044", "N28E015", "S07E021", "S28E025", + "N10E031", "N19E045", "N28E016", "S07E022", "S28E026", + "N10E032", "N19E046", "N28E017", "S07E023", "S28E027", + "N10E033", "N19E047", "N28E018", "S07E024", "S28E028", + "N10E034", "N19E048", "N28E019", "S07E025", "S28E029", + "N10E035", "N19E049", "N28E020", "S07E026", "S28E030", + "N10E036", "N19E050", "N28E021", "S07E027", "S28E031", + "N10E037", "N19E051", "N28E022", "S07E028", "S28E032", + "N10E038", "N19E052", "N28E023", "S07E029", "S29E015", + "N10E039", "N19E053", "N28E024", "S07E030", "S29E016", + "N10E040", "N19E054", "N28E025", "S07E031", "S29E017", + "N10E041", "N19E055", "N28E026", "S07E032", "S29E018", + "N10E042", "N19E056", "N28E027", "S07E033", "S29E019", + "N10E043", "N19E057", "N28E028", "S07E034", "S29E020", + "N10E044", "N19W001", "N28E029", "S07E035", "S29E021", + "N10E045", "N19W002", "N28E030", "S07E036", "S29E022", + "N10E046", "N19W003", "N28E031", "S07E037", "S29E023", + "N10E047", "N19W004", "N28E032", "S07E038", "S29E024", + "N10E048", "N19W005", "N28E033", "S07E039", "S29E025", + "N10E049", "N19W006", "N28E034", "S07E052", "S29E026", + "N10E050", "N19W007", "N28E035", "S07E053", "S29E027", + "N10E051", "N19W008", "N28E036", "S08E012", "S29E028", + "N10W001", "N19W009", "N28E037", "S08E013", "S29E029", + "N10W002", "N19W010", "N28E038", "S08E014", "S29E030", + "N10W003", "N19W011", "N28E039", "S08E015", "S29E031", + "N10W004", "N19W012", "N28E040", "S08E016", "S29E032", + "N10W005", "N19W013", "N28E041", "S08E017", "S30E016", + "N10W006", "N19W014", "N28E042", "S08E018", "S30E017", + "N10W007", "N19W015", "N28E043", "S08E019", "S30E018", + "N10W008", "N19W016", "N28E044", "S08E020", "S30E019", + "N10W009", "N19W017", "N28E045", "S08E021", "S30E020", + "N10W010", "N20E000", "N28E046", "S08E022", "S30E021", + "N10W011", "N20E001", "N28E047", "S08E023", "S30E022", + "N10W012", "N20E002", "N28E048", "S08E024", "S30E023", + "N10W013", "N20E003", "N28E050", "S08E025", "S30E024", + "N10W014", "N20E004", "N28E051", "S08E026", "S30E025", + "N10W015", "N20E005", "N28E052", "S08E027", "S30E026", + "N10W016", "N20E006", "N28E053", "S08E028", "S30E027", + "N11E000", "N20E007", "N28E054", "S08E029", "S30E028", + "N11E001", "N20E008", "N28E055", "S08E030", "S30E029", + "N11E002", "N20E009", "N28E056", "S08E031", "S30E030", + "N11E003", "N20E010", "N28E057", "S08E032", "S30E031", + "N11E004", "N20E011", "N28E058", "S08E033", "S31E017", + "N11E005", "N20E012", "N28E059", "S08E034", "S31E018", + "N11E006", "N20E013", "N28W001", "S08E035", "S31E019", + "N11E007", "N20E014", "N28W002", "S08E036", "S31E020", + "N11E008", "N20E015", "N28W003", "S08E037", "S31E021", + "N11E009", "N20E016", "N28W004", "S08E038", "S31E022", + "N11E010", "N20E017", "N28W005", "S08E039", "S31E023", + "N11E011", "N20E018", "N28W006", "S08E052", "S31E024", + "N11E012", "N20E019", "N28W007", "S08E056", "S31E025", + "N11E013", "N20E020", "N28W008", "S09E013", "S31E026", + "N11E014", "N20E021", "N28W009", "S09E014", "S31E027", + "N11E015", "N20E022", "N28W010", "S09E015", "S31E028", + "N11E016", "N20E023", "N28W011", "S09E016", "S31E029", + "N11E017", "N20E024", "N28W012", "S09E017", "S31E030", + "N11E018", "N20E025", "N28W013", "S09E018", "S32E017", + "N11E019", "N20E026", "N28W014", "S09E019", "S32E018", + "N11E020", "N20E027", "N28W015", "S09E020", "S32E019", + "N11E021", "N20E028", "N28W016", "S09E021", "S32E020", + "N11E022", "N20E029", "N28W017", "S09E022", "S32E021", + "N11E023", "N20E030", "N28W018", "S09E023", "S32E022", + "N11E024", "N20E031", "N28W019", "S09E024", "S32E023", + "N11E025", "N20E032", "N29E000", "S09E025", "S32E024", + "N11E026", "N20E033", "N29E001", "S09E026", "S32E025", + "N11E027", "N20E034", "N29E002", "S09E027", "S32E026", + "N11E028", "N20E035", "N29E003", "S09E028", "S32E027", + "N11E029", "N20E036", "N29E004", "S09E029", "S32E028", + "N11E030", "N20E037", "N29E005", "S09E030", "S32E029", + "N11E031", "N20E039", "N29E006", "S09E031", "S32E030", + "N11E032", "N20E040", "N29E007", "S09E032", "S33E017", + "N11E033", "N20E041", "N29E008", "S09E033", "S33E018", + "N11E034", "N20E042", "N29E009", "S09E034", "S33E019", + "N11E035", "N20E043", "N29E010", "S09E035", "S33E020", + "N11E036", "N20E044", "N29E011", "S09E036", "S33E021", + "N11E037", "N20E045", "N29E012", "S09E037", "S33E022", + "N11E038", "N20E046", "N29E013", "S09E038", "S33E023", + "N11E039", "N20E047", "N29E014", "S09E039", "S33E024", + "N11E040", "N20E048", "N29E015", "S10E012", "S33E025", + "N11E041", "N20E049", "N29E016", "S10E013", "S33E026", + "N11E042", "N20E050", "N29E017", "S10E014", "S33E027", + "N11E043", "N20E051", "N29E018", "S10E015", "S33E028", + "N11E047", "N20E052", "N29E019", "S10E016", "S33E029", + "N11E048", "N20E053", "N29E020", "S10E017", "S34E017", + "N11E049", "N20E054", "N29E021", "S10E018", "S34E018", + "N11E050", "N20E055", "N29E022", "S10E019", "S34E019", + "N11E051", "N20E056", "N29E023", "S10E020", "S34E020", + "N11W001", "N20E057", "N29E024", "S10E021", "S34E021", + "N11W002", "N20E058", "N29E025", "S10E022", "S34E022", + "N11W003", "N20W001", "N29E026", "S10E023", "S34E023", + "N11W004", "N20W002", "N29E027", "S10E024", "S34E024", + "N11W005", "N20W003", "N29E028", "S10E025", "S34E025", + "N11W006", "N20W004", "N29E029", "S10E026", "S34E026", + "N11W007", "N20W005", "N29E030", "S10E027", "S34E027", + "N11W008", "N20W006", "N29E031", "S10E028", "S35E018", + "N11W009", "N20W007", "N29E032", "S10E029", "S35E019", + "N11W010", "N20W008", "N29E033", "S10E030", "S35E020", + "N11W011", "N20W009", "N29E034", "S10E031", "S35E021", + "N11W012", "N20W010", "N29E035", "S10E032", "S35E022", + "N11W013", "N20W011", "N29E036", "S10E033", "S35E023", + "N11W014", "N20W012", "N29E037", "S10E034", "S35E024", + "N11W015", "N20W013", "N29E038", "S10E035", "S35E025", + (char *)0, + + "Australia", + "S11E119", "S18E128", "S22E138", "S26E147", "S31E151", + "S11E120", "S18E129", "S22E139", "S26E148", "S31E152", + "S11E121", "S18E130", "S22E140", "S26E149", "S31E153", + "S11E122", "S18E131", "S22E141", "S26E150", "S32E115", + "S11E123", "S18E132", "S22E142", "S26E151", "S32E116", + "S11E124", "S18E133", "S22E143", "S26E152", "S32E117", + "S11E132", "S18E134", "S22E144", "S26E153", "S32E118", + "S11E133", "S18E135", "S22E145", "S26W131", "S32E119", + "S11E141", "S18E136", "S22E146", "S27E113", "S32E120", + "S11E142", "S18E137", "S22E147", "S27E114", "S32E121", + "S11E143", "S18E138", "S22E148", "S27E115", "S32E122", + "S11E147", "S18E139", "S22E149", "S27E116", "S32E123", + "S11E148", "S18E140", "S22E150", "S27E117", "S32E124", + "S11E149", "S18E141", "S22E151", "S27E118", "S32E125", + "S11E150", "S18E142", "S22E152", "S27E119", "S32E126", + "S11E151", "S18E143", "S22E153", "S27E120", "S32E127", + "S11E152", "S18E144", "S22E154", "S27E121", "S32E128", + "S11E153", "S18E145", "S22E155", "S27E122", "S32E129", + "S11E161", "S18E146", "S22E158", "S27E123", "S32E130", + "S11E162", "S18E148", "S22E164", "S27E124", "S32E131", + "S11E165", "S18E155", "S22E165", "S27E125", "S32E132", + "S11E166", "S18E168", "S22E166", "S27E126", "S32E133", + "S11E179", "S18E176", "S22E167", "S27E127", "S32E134", + "S11W140", "S18E177", "S22E168", "S27E128", "S32E135", + "S11W151", "S18E178", "S22W136", "S27E129", "S32E136", + "S11W161", "S18E179", "S22W137", "S27E130", "S32E137", + "S11W162", "S18W139", "S22W139", "S27E131", "S32E138", + "S11W166", "S18W141", "S22W140", "S27E132", "S32E139", + "S12E122", "S18W142", "S22W141", "S27E133", "S32E140", + "S12E130", "S18W143", "S22W155", "S27E134", "S32E141", + "S12E131", "S18W144", "S22W158", "S27E135", "S32E142", + "S12E132", "S18W145", "S22W160", "S27E136", "S32E143", + "S12E133", "S18W146", "S22W175", "S27E137", "S32E144", + "S12E134", "S18W149", "S22W176", "S27E138", "S32E145", + "S12E135", "S18W150", "S22W179", "S27E139", "S32E146", + "S12E136", "S18W151", "S23E113", "S27E140", "S32E147", + "S12E141", "S18W179", "S23E114", "S27E141", "S32E148", + "S12E142", "S18W180", "S23E115", "S27E142", "S32E149", + "S12E143", "S19E121", "S23E116", "S27E143", "S32E150", + "S12E144", "S19E122", "S23E117", "S27E144", "S32E151", + "S12E151", "S19E123", "S23E118", "S27E145", "S32E152", + "S12E152", "S19E124", "S23E119", "S27E146", "S32E153", + "S12E153", "S19E125", "S23E120", "S27E147", "S32E159", + "S12E154", "S19E126", "S23E121", "S27E148", "S33E115", + "S12E159", "S19E127", "S23E122", "S27E149", "S33E116", + "S12E160", "S19E128", "S23E123", "S27E150", "S33E117", + "S12E166", "S19E129", "S23E124", "S27E151", "S33E118", + "S12E169", "S19E130", "S23E125", "S27E152", "S33E119", + "S12E170", "S19E131", "S23E126", "S27E153", "S33E120", + "S12W152", "S19E132", "S23E127", "S27W106", "S33E121", + "S12W166", "S19E133", "S23E128", "S28E113", "S33E122", + "S12W172", "S19E134", "S23E129", "S28E114", "S33E123", + "S13E122", "S19E135", "S23E130", "S28E115", "S33E124", + "S13E123", "S19E136", "S23E131", "S28E116", "S33E125", + "S13E130", "S19E137", "S23E132", "S28E117", "S33E126", + "S13E131", "S19E138", "S23E133", "S28E118", "S33E127", + "S13E132", "S19E139", "S23E134", "S28E119", "S33E128", + "S13E133", "S19E140", "S23E135", "S28E120", "S33E132", + "S13E134", "S19E141", "S23E136", "S28E121", "S33E133", + "S13E135", "S19E142", "S23E137", "S28E122", "S33E134", + "S13E136", "S19E143", "S23E138", "S28E123", "S33E135", + "S13E141", "S19E144", "S23E139", "S28E124", "S33E136", + "S13E142", "S19E145", "S23E140", "S28E125", "S33E137", + "S13E143", "S19E146", "S23E141", "S28E126", "S33E138", + "S13E168", "S19E162", "S23E142", "S28E127", "S33E139", + "S13E176", "S19E163", "S23E143", "S28E128", "S33E140", + "S13E177", "S19E168", "S23E144", "S28E129", "S33E141", + "S14E125", "S19E169", "S23E145", "S28E130", "S33E142", + "S14E126", "S19E177", "S23E146", "S28E131", "S33E143", + "S14E127", "S19E178", "S23E147", "S28E132", "S33E144", + "S14E129", "S19E179", "S23E148", "S28E133", "S33E145", + "S14E130", "S19W137", "S23E149", "S28E134", "S33E146", + "S14E131", "S19W138", "S23E150", "S28E135", "S33E147", + "S14E132", "S19W139", "S23E152", "S28E136", "S33E148", + "S14E133", "S19W140", "S23E155", "S28E137", "S33E149", + "S14E134", "S19W141", "S23E165", "S28E138", "S33E150", + "S14E135", "S19W142", "S23E166", "S28E139", "S33E151", + "S14E136", "S19W143", "S23E167", "S28E140", "S33E152", + "S14E141", "S19W160", "S23E168", "S28E141", "S34E114", + "S14E142", "S19W164", "S23E171", "S28E142", "S34E115", + "S14E143", "S19W170", "S23E172", "S28E143", "S34E116", + "S14E144", "S19W174", "S23W135", "S28E144", "S34E117", + "S14E166", "S19W175", "S23W137", "S28E145", "S34E118", + "S14E167", "S19W179", "S23W139", "S28E146", "S34E119", + "S14W164", "S19W180", "S23W152", "S28E147", "S34E120", + "S14W172", "S20E118", "S23W153", "S28E148", "S34E121", + "S14W173", "S20E119", "S23W177", "S28E149", "S34E122", + "S14W177", "S20E120", "S24E113", "S28E150", "S34E123", + "S15E121", "S20E121", "S24E114", "S28E151", "S34E124", + "S15E123", "S20E122", "S24E115", "S28E152", "S34E134", + "S15E124", "S20E123", "S24E116", "S28E153", "S34E135", + "S15E125", "S20E124", "S24E117", "S28W110", "S34E136", + "S15E126", "S20E125", "S24E118", "S28W144", "S34E137", + "S15E127", "S20E126", "S24E119", "S28W145", "S34E138", + "S15E128", "S20E127", "S24E120", "S29E113", "S34E139", + "S15E129", "S20E128", "S24E121", "S29E114", "S34E140", + "S15E130", "S20E129", "S24E122", "S29E115", "S34E141", + "S15E131", "S20E130", "S24E123", "S29E116", "S34E142", + "S15E132", "S20E131", "S24E124", "S29E117", "S34E143", + "S15E133", "S20E132", "S24E125", "S29E118", "S34E144", + "S15E134", "S20E133", "S24E126", "S29E119", "S34E145", + "S15E135", "S20E134", "S24E127", "S29E120", "S34E146", + "S15E136", "S20E135", "S24E128", "S29E121", "S34E147", + "S15E141", "S20E136", "S24E129", "S29E122", "S34E148", + "S15E142", "S20E137", "S24E130", "S29E123", "S34E149", + "S15E143", "S20E138", "S24E131", "S29E124", "S34E150", + "S15E144", "S20E139", "S24E132", "S29E125", "S34E151", + "S15E145", "S20E140", "S24E133", "S29E126", "S35E114", + "S15E166", "S20E141", "S24E134", "S29E127", "S35E115", + "S15E167", "S20E142", "S24E135", "S29E128", "S35E116", + "S15E168", "S20E143", "S24E136", "S29E129", "S35E117", + "S15W139", "S20E144", "S24E137", "S29E130", "S35E118", + "S15W142", "S20E145", "S24E138", "S29E131", "S35E119", + "S15W145", "S20E146", "S24E139", "S29E132", "S35E120", + "S15W146", "S20E147", "S24E140", "S29E133", "S35E121", + "S15W147", "S20E148", "S24E141", "S29E134", "S35E122", + "S15W148", "S20E158", "S24E142", "S29E135", "S35E123", + "S15W149", "S20E163", "S24E143", "S29E136", "S35E134", + "S15W169", "S20E169", "S24E144", "S29E137", "S35E135", + "S15W170", "S20E170", "S24E145", "S29E138", "S35E136", + "S15W171", "S20E177", "S24E146", "S29E139", "S35E137", + "S15W172", "S20E178", "S24E147", "S29E140", "S35E138", + "S15W178", "S20E179", "S24E148", "S29E141", "S35E139", + "S15W179", "S20W139", "S24E149", "S29E142", "S35E140", + "S16E123", "S20W140", "S24E150", "S29E143", "S35E141", + "S16E124", "S20W141", "S24E151", "S29E144", "S35E142", + "S16E125", "S20W142", "S24E152", "S29E145", "S35E143", + "S16E126", "S20W145", "S24E155", "S29E146", "S35E144", + "S16E127", "S20W146", "S24W131", "S29E147", "S35E145", + "S16E128", "S20W158", "S24W135", "S29E148", "S35E146", + "S16E129", "S20W159", "S24W136", "S29E149", "S35E147", + "S16E130", "S20W170", "S24W138", "S29E150", "S35E148", + "S16E131", "S20W175", "S24W148", "S29E151", "S35E149", + "S16E132", "S20W176", "S24W150", "S29E152", "S35E150", + "S16E133", "S20W179", "S25E113", "S29E153", "S35E151", + "S16E134", "S20W180", "S25E114", "S30E114", "S36E116", + "S16E135", "S21E115", "S25E115", "S30E115", "S36E117", + "S16E136", "S21E116", "S25E116", "S30E116", "S36E118", + "S16E137", "S21E117", "S25E117", "S30E117", "S36E135", + "S16E141", "S21E118", "S25E118", "S30E118", "S36E136", + "S16E142", "S21E119", "S25E119", "S30E119", "S36E137", + "S16E143", "S21E120", "S25E120", "S30E120", "S36E138", + "S16E144", "S21E121", "S25E121", "S30E121", "S36E139", + "S16E145", "S21E122", "S25E122", "S30E122", "S36E140", + "S16E166", "S21E123", "S25E123", "S30E123", "S36E141", + "S16E167", "S21E124", "S25E124", "S30E124", "S36E142", + "S16E168", "S21E125", "S25E125", "S30E125", "S36E143", + "S16W141", "S21E126", "S25E126", "S30E126", "S36E144", + "S16W143", "S21E127", "S25E127", "S30E127", "S36E145", + "S16W145", "S21E128", "S25E128", "S30E128", "S36E146", + "S16W146", "S21E129", "S25E129", "S30E129", "S36E147", + "S16W147", "S21E130", "S25E130", "S30E130", "S36E148", + "S16W148", "S21E131", "S25E131", "S30E131", "S36E149", + "S16W149", "S21E132", "S25E132", "S30E132", "S36E150", + "S16W155", "S21E133", "S25E133", "S30E133", "S37E136", + "S16W174", "S21E134", "S25E134", "S30E134", "S37E137", + "S16W176", "S21E135", "S25E135", "S30E135", "S37E139", + "S16W180", "S21E136", "S25E136", "S30E136", "S37E140", + "S17E122", "S21E137", "S25E137", "S30E137", "S37E141", + "S17E123", "S21E138", "S25E138", "S30E138", "S37E142", + "S17E124", "S21E139", "S25E139", "S30E139", "S37E143", + "S17E125", "S21E140", "S25E140", "S30E140", "S37E144", + "S17E126", "S21E141", "S25E141", "S30E141", "S37E145", + "S17E127", "S21E142", "S25E142", "S30E142", "S37E146", + "S17E128", "S21E143", "S25E143", "S30E143", "S37E147", + "S17E129", "S21E144", "S25E144", "S30E144", "S37E148", + "S17E130", "S21E145", "S25E145", "S30E145", "S37E149", + "S17E131", "S21E146", "S25E146", "S30E146", "S37E150", + "S17E132", "S21E147", "S25E147", "S30E147", "S38E139", + "S17E133", "S21E148", "S25E148", "S30E148", "S38E140", + "S17E134", "S21E149", "S25E149", "S30E149", "S38E141", + "S17E135", "S21E150", "S25E150", "S30E150", "S38E142", + "S17E136", "S21E154", "S25E151", "S30E151", "S38E143", + "S17E137", "S21E163", "S25E152", "S30E152", "S38E144", + "S17E138", "S21E164", "S25E153", "S30E153", "S38E145", + "S17E139", "S21E165", "S25W125", "S31E114", "S38E146", + "S17E140", "S21E166", "S25W129", "S31E115", "S38E147", + "S17E141", "S21E167", "S26E112", "S31E116", "S38E148", + "S17E142", "S21E169", "S26E113", "S31E117", "S38E149", + "S17E143", "S21W139", "S26E114", "S31E118", "S38E150", + "S17E144", "S21W140", "S26E115", "S31E119", "S39E140", + "S17E145", "S21W144", "S26E116", "S31E120", "S39E141", + "S17E146", "S21W158", "S26E117", "S31E121", "S39E142", + "S17E149", "S21W159", "S26E118", "S31E122", "S39E143", + "S17E150", "S21W175", "S26E119", "S31E123", "S39E144", + "S17E167", "S21W176", "S26E120", "S31E124", "S39E145", + "S17E168", "S21W179", "S26E121", "S31E125", "S39E146", + "S17E177", "S22E113", "S26E122", "S31E126", "S39E147", + "S17E178", "S22E114", "S26E123", "S31E127", "S40E143", + "S17E179", "S22E115", "S26E124", "S31E128", "S40E144", + "S17W141", "S22E116", "S26E125", "S31E129", "S40E146", + "S17W142", "S22E117", "S26E126", "S31E130", "S40E147", + "S17W143", "S22E118", "S26E127", "S31E131", "S40E148", + "S17W144", "S22E119", "S26E128", "S31E132", "S41E143", + "S17W145", "S22E120", "S26E129", "S31E133", "S41E144", + "S17W146", "S22E121", "S26E130", "S31E134", "S41E145", + "S17W147", "S22E122", "S26E131", "S31E135", "S41E146", + "S17W150", "S22E123", "S26E132", "S31E136", "S41E147", + "S17W151", "S22E124", "S26E133", "S31E137", "S41E148", + "S17W152", "S22E125", "S26E134", "S31E138", "S42E144", + "S17W153", "S22E126", "S26E135", "S31E139", "S42E145", + "S17W154", "S22E127", "S26E136", "S31E140", "S42E146", + "S17W155", "S22E128", "S26E137", "S31E141", "S42E147", + "S17W180", "S22E129", "S26E138", "S31E142", "S42E148", + "S18E118", "S22E130", "S26E139", "S31E143", "S43E145", + "S18E119", "S22E131", "S26E140", "S31E144", "S43E146", + "S18E122", "S22E132", "S26E141", "S31E145", "S43E147", + "S18E123", "S22E133", "S26E142", "S31E146", "S43E148", + "S18E124", "S22E134", "S26E143", "S31E147", "S44E145", + "S18E125", "S22E135", "S26E144", "S31E148", "S44E146", + "S18E126", "S22E136", "S26E145", "S31E149", "S44E147", + "S18E127", "S22E137", "S26E146", "S31E150", "S44E148", + (char *)0, + + "Eurasia", + "N00E072", "N29E061", "N40E110", "N48W004", "N56E089", + "N00E073", "N29E062", "N40E111", "N48W005", "N56E090", + "N00E097", "N29E063", "N40E112", "N48W006", "N56E091", + "N00E098", "N29E064", "N40E113", "N49E000", "N56E092", + "N00E099", "N29E065", "N40E114", "N49E001", "N56E093", + "N00E100", "N29E066", "N40E115", "N49E002", "N56E094", + "N00E101", "N29E067", "N40E116", "N49E003", "N56E095", + "N00E102", "N29E068", "N40E117", "N49E004", "N56E096", + "N00E103", "N29E069", "N40E118", "N49E005", "N56E097", + "N00E104", "N29E070", "N40E119", "N49E006", "N56E098", + "N00E106", "N29E071", "N40E120", "N49E007", "N56E099", + "N00E107", "N29E072", "N40E121", "N49E008", "N56E100", + "N00E108", "N29E073", "N40E122", "N49E009", "N56E101", + "N00E109", "N29E074", "N40E123", "N49E010", "N56E102", + "N00E110", "N29E075", "N40E124", "N49E011", "N56E103", + "N00E111", "N29E076", "N40E125", "N49E012", "N56E104", + "N00E112", "N29E077", "N40E126", "N49E013", "N56E105", + "N00E113", "N29E078", "N40E127", "N49E014", "N56E106", + "N00E114", "N29E079", "N40E128", "N49E015", "N56E107", + "N00E115", "N29E080", "N40E129", "N49E016", "N56E108", + "N00E116", "N29E081", "N40E139", "N49E017", "N56E109", + "N00E117", "N29E082", "N40E140", "N49E018", "N56E110", + "N00E118", "N29E083", "N40E141", "N49E019", "N56E111", + "N00E119", "N29E084", "N40W001", "N49E020", "N56E112", + "N00E120", "N29E085", "N40W002", "N49E021", "N56E113", + "N00E121", "N29E086", "N40W003", "N49E022", "N56E114", + "N00E122", "N29E087", "N40W004", "N49E023", "N56E115", + "N00E123", "N29E088", "N40W005", "N49E024", "N56E116", + "N00E124", "N29E089", "N40W006", "N49E025", "N56E117", + "N00E126", "N29E090", "N40W007", "N49E026", "N56E118", + "N00E127", "N29E091", "N40W008", "N49E027", "N56E119", + "N00E128", "N29E092", "N40W009", "N49E028", "N56E120", + "N00E129", "N29E093", "N41E000", "N49E029", "N56E121", + "N00E130", "N29E094", "N41E001", "N49E030", "N56E122", + "N00E131", "N29E095", "N41E002", "N49E031", "N56E123", + "N00E134", "N29E096", "N41E003", "N49E032", "N56E124", + "N00E172", "N29E097", "N41E008", "N49E033", "N56E125", + "N00E173", "N29E098", "N41E009", "N49E034", "N56E126", + "N00W177", "N29E099", "N41E011", "N49E035", "N56E127", + "N01E073", "N29E100", "N41E012", "N49E036", "N56E128", + "N01E097", "N29E101", "N41E013", "N49E037", "N56E129", + "N01E098", "N29E102", "N41E014", "N49E038", "N56E130", + "N01E099", "N29E103", "N41E015", "N49E039", "N56E131", + "N01E100", "N29E104", "N41E016", "N49E040", "N56E132", + "N01E101", "N29E105", "N41E017", "N49E041", "N56E133", + "N01E102", "N29E106", "N41E019", "N49E042", "N56E134", + "N01E103", "N29E107", "N41E020", "N49E043", "N56E135", + "N01E104", "N29E108", "N41E021", "N49E044", "N56E136", + "N01E106", "N29E109", "N41E022", "N49E045", "N56E137", + "N01E107", "N29E110", "N41E023", "N49E046", "N56E138", + "N01E108", "N29E111", "N41E024", "N49E047", "N56E143", + "N01E109", "N29E112", "N41E025", "N49E048", "N56E155", + "N01E110", "N29E113", "N41E026", "N49E049", "N56E156", + "N01E111", "N29E114", "N41E027", "N49E050", "N56E157", + "N01E112", "N29E115", "N41E028", "N49E051", "N56E158", + "N01E113", "N29E116", "N41E029", "N49E052", "N56E159", + "N01E114", "N29E117", "N41E030", "N49E053", "N56E160", + "N01E115", "N29E118", "N41E031", "N49E054", "N56E161", + "N01E116", "N29E119", "N41E032", "N49E055", "N56E162", + "N01E117", "N29E120", "N41E033", "N49E056", "N56E163", + "N01E118", "N29E121", "N41E034", "N49E057", "N56W003", + "N01E119", "N29E122", "N41E035", "N49E058", "N56W004", + "N01E120", "N29E129", "N41E036", "N49E059", "N56W005", + "N01E121", "N29E140", "N41E037", "N49E060", "N56W006", + "N01E122", "N30E060", "N41E038", "N49E061", "N56W007", + "N01E124", "N30E061", "N41E039", "N49E062", "N56W008", + "N01E125", "N30E062", "N41E040", "N49E063", "N57E006", + "N01E126", "N30E063", "N41E041", "N49E064", "N57E007", + "N01E127", "N30E064", "N41E042", "N49E065", "N57E008", + "N01E128", "N30E065", "N41E043", "N49E066", "N57E009", + "N01E131", "N30E066", "N41E044", "N49E067", "N57E010", + "N01E154", "N30E067", "N41E045", "N49E068", "N57E011", + "N01E172", "N30E068", "N41E046", "N49E069", "N57E012", + "N01E173", "N30E069", "N41E047", "N49E070", "N57E013", + "N01W158", "N30E070", "N41E048", "N49E071", "N57E014", + "N02E072", "N30E071", "N41E049", "N49E072", "N57E015", + "N02E073", "N30E072", "N41E052", "N49E073", "N57E016", + "N02E095", "N30E073", "N41E053", "N49E074", "N57E017", + "N02E096", "N30E074", "N41E054", "N49E075", "N57E018", + "N02E097", "N30E075", "N41E055", "N49E076", "N57E019", + "N02E098", "N30E076", "N41E056", "N49E077", "N57E021", + "N02E099", "N30E077", "N41E057", "N49E078", "N57E022", + "N02E100", "N30E078", "N41E058", "N49E079", "N57E023", + "N02E101", "N30E079", "N41E059", "N49E080", "N57E024", + "N02E102", "N30E080", "N41E060", "N49E081", "N57E025", + "N02E103", "N30E081", "N41E061", "N49E082", "N57E026", + "N02E104", "N30E082", "N41E062", "N49E083", "N57E027", + "N02E105", "N30E083", "N41E063", "N49E084", "N57E028", + "N02E106", "N30E084", "N41E064", "N49E085", "N57E029", + "N02E107", "N30E085", "N41E065", "N49E086", "N57E030", + "N02E108", "N30E086", "N41E066", "N49E087", "N57E031", + "N02E109", "N30E087", "N41E067", "N49E088", "N57E032", + "N02E111", "N30E088", "N41E068", "N49E089", "N57E033", + "N02E112", "N30E089", "N41E069", "N49E090", "N57E034", + "N02E113", "N30E090", "N41E070", "N49E091", "N57E035", + "N02E114", "N30E091", "N41E071", "N49E092", "N57E036", + "N02E115", "N30E092", "N41E072", "N49E093", "N57E037", + "N02E116", "N30E093", "N41E073", "N49E094", "N57E038", + "N02E117", "N30E094", "N41E074", "N49E095", "N57E039", + "N02E118", "N30E095", "N41E075", "N49E096", "N57E040", + "N02E125", "N30E096", "N41E076", "N49E097", "N57E041", + "N02E127", "N30E097", "N41E077", "N49E098", "N57E042", + "N02E128", "N30E098", "N41E078", "N49E099", "N57E043", + "N02E131", "N30E099", "N41E079", "N49E100", "N57E044", + "N02E173", "N30E100", "N41E080", "N49E101", "N57E045", + "N02W158", "N30E101", "N41E081", "N49E102", "N57E046", + "N03E072", "N30E102", "N41E082", "N49E103", "N57E047", + "N03E073", "N30E103", "N41E083", "N49E104", "N57E048", + "N03E095", "N30E104", "N41E084", "N49E105", "N57E049", + "N03E096", "N30E105", "N41E085", "N49E106", "N57E050", + "N03E097", "N30E106", "N41E086", "N49E107", "N57E051", + "N03E098", "N30E107", "N41E087", "N49E108", "N57E052", + "N03E099", "N30E108", "N41E088", "N49E109", "N57E053", + "N03E100", "N30E109", "N41E089", "N49E110", "N57E054", + "N03E101", "N30E110", "N41E090", "N49E111", "N57E055", + "N03E102", "N30E111", "N41E091", "N49E112", "N57E056", + "N03E103", "N30E112", "N41E092", "N49E113", "N57E057", + "N03E105", "N30E113", "N41E093", "N49E114", "N57E058", + "N03E106", "N30E114", "N41E094", "N49E115", "N57E059", + "N03E107", "N30E115", "N41E095", "N49E116", "N57E060", + "N03E108", "N30E116", "N41E096", "N49E117", "N57E061", + "N03E112", "N30E117", "N41E097", "N49E118", "N57E062", + "N03E113", "N30E118", "N41E098", "N49E119", "N57E063", + "N03E114", "N30E119", "N41E099", "N49E120", "N57E064", + "N03E115", "N30E120", "N41E100", "N49E121", "N57E065", + "N03E116", "N30E121", "N41E101", "N49E122", "N57E066", + "N03E117", "N30E122", "N41E102", "N49E123", "N57E067", + "N03E125", "N30E129", "N41E103", "N49E124", "N57E068", + "N03E126", "N30E130", "N41E104", "N49E125", "N57E069", + "N03E131", "N30E131", "N41E105", "N49E126", "N57E070", + "N03E154", "N30E140", "N41E106", "N49E127", "N57E071", + "N03E172", "N31E060", "N41E107", "N49E128", "N57E072", + "N03E173", "N31E061", "N41E108", "N49E129", "N57E073", + "N03W160", "N31E062", "N41E109", "N49E130", "N57E074", + "N04E072", "N31E063", "N41E110", "N49E131", "N57E075", + "N04E073", "N31E064", "N41E111", "N49E132", "N57E076", + "N04E095", "N31E065", "N41E112", "N49E133", "N57E077", + "N04E096", "N31E066", "N41E113", "N49E134", "N57E078", + "N04E097", "N31E067", "N41E114", "N49E135", "N57E079", + "N04E098", "N31E068", "N41E115", "N49E136", "N57E080", + "N04E100", "N31E069", "N41E116", "N49E137", "N57E081", + "N04E101", "N31E070", "N41E117", "N49E138", "N57E082", + "N04E102", "N31E071", "N41E118", "N49E139", "N57E083", + "N04E103", "N31E072", "N41E119", "N49E140", "N57E084", + "N04E107", "N31E073", "N41E120", "N49E142", "N57E085", + "N04E108", "N31E074", "N41E121", "N49E143", "N57E086", + "N04E113", "N31E075", "N41E122", "N49E144", "N57E087", + "N04E114", "N31E076", "N41E123", "N49E154", "N57E088", + "N04E115", "N31E077", "N41E124", "N49E155", "N57E089", + "N04E116", "N31E078", "N41E125", "N49W001", "N57E090", + "N04E117", "N31E079", "N41E126", "N49W002", "N57E091", + "N04E118", "N31E080", "N41E127", "N49W003", "N57E092", + "N04E119", "N31E081", "N41E128", "N49W006", "N57E093", + "N04E125", "N31E082", "N41E129", "N49W007", "N57E094", + "N04E126", "N31E083", "N41E130", "N50E000", "N57E095", + "N04E127", "N31E084", "N41E139", "N50E001", "N57E096", + "N04E131", "N31E085", "N41E140", "N50E002", "N57E097", + "N04E132", "N31E086", "N41E141", "N50E003", "N57E098", + "N04E168", "N31E087", "N41E143", "N50E004", "N57E099", + "N04W161", "N31E088", "N41W001", "N50E005", "N57E100", + "N05E072", "N31E089", "N41W002", "N50E006", "N57E101", + "N05E073", "N31E090", "N41W003", "N50E007", "N57E102", + "N05E080", "N31E091", "N41W004", "N50E008", "N57E103", + "N05E094", "N31E092", "N41W005", "N50E009", "N57E104", + "N05E095", "N31E093", "N41W006", "N50E010", "N57E105", + "N05E096", "N31E094", "N41W007", "N50E011", "N57E106", + "N05E097", "N31E095", "N41W008", "N50E012", "N57E107", + "N05E100", "N31E096", "N41W009", "N50E013", "N57E108", + "N05E101", "N31E097", "N42E000", "N50E014", "N57E109", + "N05E102", "N31E098", "N42E001", "N50E015", "N57E110", + "N05E103", "N31E099", "N42E002", "N50E016", "N57E111", + "N05E114", "N31E100", "N42E003", "N50E017", "N57E112", + "N05E115", "N31E101", "N42E006", "N50E018", "N57E113", + "N05E116", "N31E102", "N42E008", "N50E019", "N57E114", + "N05E117", "N31E103", "N42E009", "N50E020", "N57E115", + "N05E118", "N31E104", "N42E010", "N50E021", "N57E116", + "N05E119", "N31E105", "N42E011", "N50E022", "N57E117", + "N05E120", "N31E106", "N42E012", "N50E023", "N57E118", + "N05E121", "N31E107", "N42E013", "N50E024", "N57E119", + "N05E124", "N31E108", "N42E014", "N50E025", "N57E120", + "N05E125", "N31E109", "N42E015", "N50E026", "N57E121", + "N05E126", "N31E110", "N42E016", "N50E027", "N57E122", + "N05E132", "N31E111", "N42E017", "N50E028", "N57E123", + "N05E153", "N31E112", "N42E018", "N50E029", "N57E124", + "N05E157", "N31E113", "N42E019", "N50E030", "N57E125", + "N05E162", "N31E114", "N42E020", "N50E031", "N57E126", + "N05E163", "N31E115", "N42E021", "N50E032", "N57E127", + "N05E168", "N31E116", "N42E022", "N50E033", "N57E128", + "N05E169", "N31E117", "N42E023", "N50E034", "N57E129", + "N05E172", "N31E118", "N42E024", "N50E035", "N57E130", + "N05W163", "N31E119", "N42E025", "N50E036", "N57E131", + "N06E072", "N31E120", "N42E026", "N50E037", "N57E132", + "N06E073", "N31E121", "N42E027", "N50E038", "N57E133", + "N06E079", "N31E122", "N42E028", "N50E039", "N57E134", + "N06E080", "N31E128", "N42E033", "N50E040", "N57E135", + "N06E081", "N31E129", "N42E034", "N50E041", "N57E136", + "N06E093", "N31E130", "N42E035", "N50E042", "N57E137", + "N06E095", "N31E131", "N42E040", "N50E043", "N57E138", + "N06E099", "N31E139", "N42E041", "N50E044", "N57E139", + "N06E100", "N31E140", "N42E042", "N50E045", "N57E140", + "N06E101", "N32E060", "N42E043", "N50E046", "N57E156", + "N06E102", "N32E061", "N42E044", "N50E047", "N57E157", + "N06E115", "N32E062", "N42E045", "N50E048", "N57E158", + "N06E116", "N32E063", "N42E046", "N50E049", "N57E159", + "N06E117", "N32E064", "N42E047", "N50E050", "N57E160", + "N06E118", "N32E065", "N42E048", "N50E051", "N57E161", + "N06E120", "N32E066", "N42E051", "N50E052", "N57E162", + "N06E121", "N32E067", "N42E052", "N50E053", "N57E163", + "N06E122", "N32E068", "N42E053", "N50E054", "N57W002", + "N06E123", "N32E069", "N42E054", "N50E055", "N57W003", + "N06E124", "N32E070", "N42E055", "N50E056", "N57W004", + "N06E125", "N32E071", "N42E056", "N50E057", "N57W005", + "N06E126", "N32E072", "N42E057", "N50E058", "N57W006", + "N06E134", "N32E073", "N42E058", "N50E059", "N57W007", + "N06E143", "N32E074", "N42E059", "N50E060", "N57W008", + "N06E149", "N32E075", "N42E060", "N50E061", "N57W009", + "N06E151", "N32E076", "N42E061", "N50E062", "N57W014", + "N06E152", "N32E077", "N42E062", "N50E063", "N57W171", + "N06E157", "N32E078", "N42E063", "N50E064", "N58E005", + "N06E158", "N32E079", "N42E064", "N50E065", "N58E006", + "N06E159", "N32E080", "N42E065", "N50E066", "N58E007", + "N06E160", "N32E081", "N42E066", "N50E067", "N58E008", + "N06E169", "N32E082", "N42E067", "N50E068", "N58E009", + "N06E171", "N32E083", "N42E068", "N50E069", "N58E010", + "N06E172", "N32E084", "N42E069", "N50E070", "N58E011", + "N06W163", "N32E085", "N42E070", "N50E071", "N58E012", + "N07E072", "N32E086", "N42E071", "N50E072", "N58E013", + "N07E073", "N32E087", "N42E072", "N50E073", "N58E014", + "N07E079", "N32E088", "N42E073", "N50E074", "N58E015", + "N07E080", "N32E089", "N42E074", "N50E075", "N58E016", + "N07E081", "N32E090", "N42E075", "N50E076", "N58E017", + "N07E093", "N32E091", "N42E076", "N50E077", "N58E018", + "N07E098", "N32E092", "N42E077", "N50E078", "N58E019", + "N07E099", "N32E093", "N42E078", "N50E079", "N58E021", + "N07E100", "N32E094", "N42E079", "N50E080", "N58E022", + "N07E113", "N32E095", "N42E080", "N50E081", "N58E023", + "N07E116", "N32E096", "N42E081", "N50E082", "N58E024", + "N07E117", "N32E097", "N42E082", "N50E083", "N58E025", + "N07E118", "N32E098", "N42E083", "N50E084", "N58E026", + "N07E121", "N32E099", "N42E084", "N50E085", "N58E027", + "N07E122", "N32E100", "N42E085", "N50E086", "N58E028", + "N07E123", "N32E101", "N42E086", "N50E087", "N58E029", + "N07E124", "N32E102", "N42E087", "N50E088", "N58E030", + "N07E125", "N32E103", "N42E088", "N50E089", "N58E031", + "N07E126", "N32E104", "N42E089", "N50E090", "N58E032", + "N07E134", "N32E105", "N42E090", "N50E091", "N58E033", + "N07E143", "N32E106", "N42E091", "N50E092", "N58E034", + "N07E144", "N32E107", "N42E092", "N50E093", "N58E035", + "N07E145", "N32E108", "N42E093", "N50E094", "N58E036", + "N07E146", "N32E109", "N42E094", "N50E095", "N58E037", + "N07E147", "N32E110", "N42E095", "N50E096", "N58E038", + "N07E149", "N32E111", "N42E096", "N50E097", "N58E039", + "N07E151", "N32E112", "N42E097", "N50E098", "N58E040", + "N07E152", "N32E113", "N42E098", "N50E099", "N58E041", + "N07E155", "N32E114", "N42E099", "N50E100", "N58E042", + "N07E157", "N32E115", "N42E100", "N50E101", "N58E043", + "N07E158", "N32E116", "N42E101", "N50E102", "N58E044", + "N07E168", "N32E117", "N42E102", "N50E103", "N58E045", + "N07E171", "N32E118", "N42E103", "N50E104", "N58E046", + "N08E073", "N32E119", "N42E104", "N50E105", "N58E047", + "N08E076", "N32E120", "N42E105", "N50E106", "N58E048", + "N08E077", "N32E121", "N42E106", "N50E107", "N58E049", + "N08E078", "N32E128", "N42E107", "N50E108", "N58E050", + "N08E079", "N32E129", "N42E108", "N50E109", "N58E051", + "N08E080", "N32E130", "N42E109", "N50E110", "N58E052", + "N08E081", "N32E131", "N42E110", "N50E111", "N58E053", + "N08E092", "N32E132", "N42E111", "N50E112", "N58E054", + "N08E093", "N32E133", "N42E112", "N50E113", "N58E055", + "N08E097", "N32E139", "N42E113", "N50E114", "N58E056", + "N08E098", "N33E060", "N42E114", "N50E115", "N58E057", + "N08E099", "N33E061", "N42E115", "N50E116", "N58E058", + "N08E100", "N33E062", "N42E116", "N50E117", "N58E059", + "N08E104", "N33E063", "N42E117", "N50E118", "N58E060", + "N08E105", "N33E064", "N42E118", "N50E119", "N58E061", + "N08E106", "N33E065", "N42E119", "N50E120", "N58E062", + "N08E111", "N33E066", "N42E120", "N50E121", "N58E063", + "N08E116", "N33E067", "N42E121", "N50E122", "N58E064", + "N08E117", "N33E068", "N42E122", "N50E123", "N58E065", + "N08E118", "N33E069", "N42E123", "N50E124", "N58E066", + "N08E122", "N33E070", "N42E124", "N50E125", "N58E067", + "N08E123", "N33E071", "N42E125", "N50E126", "N58E068", + "N08E124", "N33E072", "N42E126", "N50E127", "N58E069", + "N08E125", "N33E073", "N42E127", "N50E128", "N58E070", + "N08E126", "N33E074", "N42E128", "N50E129", "N58E071", + "N08E134", "N33E075", "N42E129", "N50E130", "N58E072", + "N08E137", "N33E076", "N42E130", "N50E131", "N58E073", + "N08E140", "N33E077", "N42E131", "N50E132", "N58E074", + "N08E144", "N33E078", "N42E132", "N50E133", "N58E075", + "N08E146", "N33E079", "N42E133", "N50E134", "N58E076", + "N08E147", "N33E080", "N42E134", "N50E135", "N58E077", + "N08E149", "N33E081", "N42E139", "N50E136", "N58E078", + "N08E150", "N33E082", "N42E140", "N50E137", "N58E079", + "N08E151", "N33E083", "N42E141", "N50E138", "N58E080", + "N08E152", "N33E084", "N42E142", "N50E139", "N58E081", + "N08E154", "N33E085", "N42E143", "N50E140", "N58E082", + "N08E165", "N33E086", "N42E144", "N50E142", "N58E083", + "N08E166", "N33E087", "N42E145", "N50E143", "N58E084", + "N08E167", "N33E088", "N42W001", "N50E154", "N58E085", + "N08E168", "N33E089", "N42W002", "N50E155", "N58E086", + "N08E170", "N33E090", "N42W003", "N50E156", "N58E087", + "N08E171", "N33E091", "N42W004", "N50W001", "N58E088", + "N09E076", "N33E092", "N42W005", "N50W002", "N58E089", + "N09E077", "N33E093", "N42W006", "N50W003", "N58E090", + "N09E078", "N33E094", "N42W007", "N50W004", "N58E091", + "N09E079", "N33E095", "N42W008", "N50W005", "N58E092", + "N09E080", "N33E096", "N42W009", "N50W006", "N58E093", + "N09E092", "N33E097", "N42W010", "N51E000", "N58E094", + "N09E097", "N33E098", "N43E000", "N51E001", "N58E095", + "N09E098", "N33E099", "N43E001", "N51E002", "N58E096", + "N09E099", "N33E100", "N43E002", "N51E003", "N58E097", + "N09E100", "N33E101", "N43E003", "N51E004", "N58E098", + "N09E102", "N33E102", "N43E004", "N51E005", "N58E099", + "N09E103", "N33E103", "N43E005", "N51E006", "N58E100", + "N09E104", "N33E104", "N43E006", "N51E007", "N58E101", + "N09E105", "N33E105", "N43E007", "N51E008", "N58E102", + "N09E106", "N33E106", "N43E008", "N51E009", "N58E103", + "N09E109", "N33E107", "N43E009", "N51E010", "N58E104", + "N09E117", "N33E108", "N43E010", "N51E011", "N58E105", + "N09E118", "N33E109", "N43E011", "N51E012", "N58E106", + "N09E119", "N33E110", "N43E012", "N51E013", "N58E107", + "N09E120", "N33E111", "N43E013", "N51E014", "N58E108", + "N09E121", "N33E112", "N43E015", "N51E015", "N58E109", + "N09E122", "N33E113", "N43E016", "N51E016", "N58E110", + "N09E123", "N33E114", "N43E017", "N51E017", "N58E111", + "N09E124", "N33E115", "N43E018", "N51E018", "N58E112", + "N09E125", "N33E116", "N43E019", "N51E019", "N58E113", + "N09E126", "N33E117", "N43E020", "N51E020", "N58E114", + "N09E138", "N33E118", "N43E021", "N51E021", "N58E115", + "N09E139", "N33E119", "N43E022", "N51E022", "N58E116", + "N09E140", "N33E120", "N43E023", "N51E023", "N58E117", + "N09E145", "N33E126", "N43E024", "N51E024", "N58E118", + "N09E160", "N33E128", "N43E025", "N51E025", "N58E119", + "N09E165", "N33E129", "N43E026", "N51E026", "N58E120", + "N09E166", "N33E130", "N43E027", "N51E027", "N58E121", + "N09E167", "N33E131", "N43E028", "N51E028", "N58E122", + "N09E169", "N33E132", "N43E039", "N51E029", "N58E123", + "N09E170", "N33E133", "N43E040", "N51E030", "N58E124", + "N10E072", "N33E134", "N43E041", "N51E031", "N58E125", + "N10E073", "N33E135", "N43E042", "N51E032", "N58E126", + "N10E075", "N33E136", "N43E043", "N51E033", "N58E127", + "N10E076", "N33E138", "N43E044", "N51E034", "N58E128", + "N10E077", "N33E139", "N43E045", "N51E035", "N58E129", + "N10E078", "N34E060", "N43E046", "N51E036", "N58E130", + "N10E079", "N34E061", "N43E047", "N51E037", "N58E131", + "N10E092", "N34E062", "N43E050", "N51E038", "N58E132", + "N10E097", "N34E063", "N43E051", "N51E039", "N58E133", + "N10E098", "N34E064", "N43E052", "N51E040", "N58E134", + "N10E099", "N34E065", "N43E053", "N51E041", "N58E135", + "N10E102", "N34E066", "N43E054", "N51E042", "N58E136", + "N10E103", "N34E067", "N43E055", "N51E043", "N58E137", + "N10E104", "N34E068", "N43E056", "N51E044", "N58E138", + "N10E105", "N34E069", "N43E057", "N51E045", "N58E139", + "N10E106", "N34E070", "N43E058", "N51E046", "N58E140", + "N10E107", "N34E071", "N43E059", "N51E047", "N58E141", + "N10E108", "N34E072", "N43E060", "N51E048", "N58E142", + "N10E114", "N34E073", "N43E061", "N51E049", "N58E150", + "N10E115", "N34E074", "N43E062", "N51E050", "N58E151", + "N10E118", "N34E075", "N43E063", "N51E051", "N58E152", + "N10E119", "N34E076", "N43E064", "N51E052", "N58E157", + "N10E120", "N34E077", "N43E065", "N51E053", "N58E158", + "N10E121", "N34E078", "N43E066", "N51E054", "N58E159", + "N10E122", "N34E079", "N43E067", "N51E055", "N58E160", + "N10E123", "N34E080", "N43E068", "N51E056", "N58E161", + "N10E124", "N34E081", "N43E069", "N51E057", "N58E162", + "N10E125", "N34E082", "N43E070", "N51E058", "N58E163", + "N10E126", "N34E083", "N43E071", "N51E059", "N58E164", + "N10E139", "N34E084", "N43E072", "N51E060", "N58W003", + "N10E165", "N34E085", "N43E073", "N51E061", "N58W004", + "N10E166", "N34E086", "N43E074", "N51E062", "N58W005", + "N10E168", "N34E087", "N43E075", "N51E063", "N58W006", + "N10E169", "N34E088", "N43E076", "N51E064", "N58W007", + "N10E170", "N34E089", "N43E077", "N51E065", "N58W008", + "N11E072", "N34E090", "N43E078", "N51E066", "N59E004", + "N11E073", "N34E091", "N43E079", "N51E067", "N59E005", + "N11E075", "N34E092", "N43E080", "N51E068", "N59E006", + "N11E076", "N34E093", "N43E081", "N51E069", "N59E007", + "N11E077", "N34E094", "N43E082", "N51E070", "N59E008", + "N11E078", "N34E095", "N43E083", "N51E071", "N59E009", + "N11E079", "N34E096", "N43E084", "N51E072", "N59E010", + "N11E092", "N34E097", "N43E085", "N51E073", "N59E011", + "N11E093", "N34E098", "N43E086", "N51E074", "N59E012", + "N11E097", "N34E099", "N43E087", "N51E075", "N59E013", + "N11E098", "N34E100", "N43E088", "N51E076", "N59E014", + "N11E099", "N34E101", "N43E089", "N51E077", "N59E015", + "N11E102", "N34E102", "N43E090", "N51E078", "N59E016", + "N11E103", "N34E103", "N43E091", "N51E079", "N59E017", + "N11E104", "N34E104", "N43E092", "N51E080", "N59E018", + "N11E105", "N34E105", "N43E093", "N51E081", "N59E019", + "N11E106", "N34E106", "N43E094", "N51E082", "N59E020", + "N11E107", "N34E107", "N43E095", "N51E083", "N59E021", + "N11E108", "N34E108", "N43E096", "N51E084", "N59E022", + "N11E109", "N34E109", "N43E097", "N51E085", "N59E023", + "N11E114", "N34E110", "N43E098", "N51E086", "N59E024", + "N11E115", "N34E111", "N43E099", "N51E087", "N59E025", + "N11E119", "N34E112", "N43E100", "N51E088", "N59E026", + "N11E120", "N34E113", "N43E101", "N51E089", "N59E027", + "N11E121", "N34E114", "N43E102", "N51E090", "N59E028", + "N11E122", "N34E115", "N43E103", "N51E091", "N59E029", + "N11E123", "N34E116", "N43E104", "N51E092", "N59E030", + "N11E124", "N34E117", "N43E105", "N51E093", "N59E031", + "N11E125", "N34E118", "N43E106", "N51E094", "N59E032", + "N11E162", "N34E119", "N43E107", "N51E095", "N59E033", + "N11E165", "N34E120", "N43E108", "N51E096", "N59E034", + "N11E166", "N34E125", "N43E109", "N51E097", "N59E035", + "N11E167", "N34E126", "N43E110", "N51E098", "N59E036", + "N11E169", "N34E127", "N43E111", "N51E099", "N59E037", + "N12E074", "N34E128", "N43E112", "N51E100", "N59E038", + "N12E075", "N34E129", "N43E113", "N51E101", "N59E039", + "N12E076", "N34E130", "N43E114", "N51E102", "N59E040", + "N12E077", "N34E131", "N43E115", "N51E103", "N59E041", + "N12E078", "N34E132", "N43E116", "N51E104", "N59E042", + "N12E079", "N34E133", "N43E117", "N51E105", "N59E043", + "N12E080", "N34E134", "N43E118", "N51E106", "N59E044", + "N12E092", "N34E135", "N43E119", "N51E107", "N59E045", + "N12E093", "N34E136", "N43E120", "N51E108", "N59E046", + "N12E097", "N34E137", "N43E121", "N51E109", "N59E047", + "N12E098", "N34E138", "N43E122", "N51E110", "N59E048", + "N12E099", "N34E139", "N43E123", "N51E111", "N59E049", + "N12E100", "N35E000", "N43E124", "N51E112", "N59E050", + "N12E101", "N35E001", "N43E125", "N51E113", "N59E051", + "N12E102", "N35E002", "N43E126", "N51E114", "N59E052", + "N12E103", "N35E003", "N43E127", "N51E115", "N59E053", + "N12E104", "N35E004", "N43E128", "N51E116", "N59E054", + "N12E105", "N35E005", "N43E129", "N51E117", "N59E055", + "N12E106", "N35E006", "N43E130", "N51E118", "N59E056", + "N12E107", "N35E007", "N43E131", "N51E119", "N59E057", + "N12E108", "N35E008", "N43E132", "N51E120", "N59E058", + "N12E109", "N35E009", "N43E133", "N51E121", "N59E059", + "N12E119", "N35E010", "N43E134", "N51E122", "N59E060", + "N12E120", "N35E011", "N43E135", "N51E123", "N59E061", + "N12E121", "N35E012", "N43E140", "N51E124", "N59E062", + "N12E122", "N35E014", "N43E141", "N51E125", "N59E063", + "N12E123", "N35E023", "N43E142", "N51E126", "N59E064", + "N12E124", "N35E024", "N43E143", "N51E127", "N59E065", + "N12E125", "N35E025", "N43E144", "N51E128", "N59E066", + "N12E170", "N35E026", "N43E145", "N51E129", "N59E067", + "N13E074", "N35E027", "N43E146", "N51E130", "N59E068", + "N13E075", "N35E032", "N43W001", "N51E131", "N59E069", + "N13E076", "N35E033", "N43W002", "N51E132", "N59E070", + "N13E077", "N35E034", "N43W003", "N51E133", "N59E071", + "N13E078", "N35E035", "N43W004", "N51E134", "N59E072", + "N13E079", "N35E036", "N43W005", "N51E135", "N59E073", + "N13E080", "N35E037", "N43W006", "N51E136", "N59E074", + "N13E092", "N35E038", "N43W007", "N51E137", "N59E075", + "N13E093", "N35E039", "N43W008", "N51E138", "N59E076", + "N13E094", "N35E040", "N43W009", "N51E139", "N59E077", + "N13E097", "N35E041", "N43W010", "N51E140", "N59E078", + "N13E098", "N35E042", "N44E000", "N51E141", "N59E079", + "N13E099", "N35E043", "N44E001", "N51E142", "N59E080", + "N13E100", "N35E044", "N44E002", "N51E143", "N59E081", + "N13E101", "N35E045", "N44E003", "N51E156", "N59E082", + "N13E102", "N35E046", "N44E004", "N51E157", "N59E083", + "N13E103", "N35E047", "N44E005", "N51E158", "N59E084", + "N13E104", "N35E048", "N44E006", "N51E177", "N59E085", + "N13E105", "N35E049", "N44E007", "N51E178", "N59E086", + "N13E106", "N35E050", "N44E008", "N51E179", "N59E087", + "N13E107", "N35E051", "N44E009", "N51W001", "N59E088", + "N13E108", "N35E052", "N44E010", "N51W002", "N59E089", + "N13E109", "N35E053", "N44E011", "N51W003", "N59E090", + "N13E120", "N35E054", "N44E012", "N51W004", "N59E091", + "N13E121", "N35E055", "N44E013", "N51W005", "N59E092", + "N13E122", "N35E056", "N44E014", "N51W006", "N59E093", + "N13E123", "N35E057", "N44E015", "N51W008", "N59E094", + "N13E124", "N35E058", "N44E016", "N51W009", "N59E095", + "N13E144", "N35E059", "N44E017", "N51W010", "N59E096", + "N14E074", "N35E060", "N44E018", "N51W011", "N59E097", + "N14E075", "N35E061", "N44E019", "N51W176", "N59E098", + "N14E076", "N35E062", "N44E020", "N51W177", "N59E099", + "N14E077", "N35E063", "N44E021", "N51W178", "N59E100", + "N14E078", "N35E064", "N44E022", "N51W179", "N59E101", + "N14E079", "N35E065", "N44E023", "N51W180", "N59E102", + "N14E080", "N35E066", "N44E024", "N52E000", "N59E103", + "N14E093", "N35E067", "N44E025", "N52E001", "N59E104", + "N14E097", "N35E068", "N44E026", "N52E004", "N59E105", + "N14E098", "N35E069", "N44E027", "N52E005", "N59E106", + "N14E099", "N35E070", "N44E028", "N52E006", "N59E107", + "N14E100", "N35E071", "N44E029", "N52E007", "N59E108", + "N14E101", "N35E072", "N44E033", "N52E008", "N59E109", + "N14E102", "N35E073", "N44E034", "N52E009", "N59E110", + "N14E103", "N35E074", "N44E035", "N52E010", "N59E111", + "N14E104", "N35E075", "N44E037", "N52E011", "N59E112", + "N14E105", "N35E076", "N44E038", "N52E012", "N59E113", + "N14E106", "N35E077", "N44E039", "N52E013", "N59E114", + "N14E107", "N35E078", "N44E040", "N52E014", "N59E115", + "N14E108", "N35E079", "N44E041", "N52E015", "N59E116", + "N14E109", "N35E080", "N44E042", "N52E016", "N59E117", + "N14E120", "N35E081", "N44E043", "N52E017", "N59E118", + "N14E121", "N35E082", "N44E044", "N52E018", "N59E119", + "N14E122", "N35E083", "N44E045", "N52E019", "N59E120", + "N14E123", "N35E084", "N44E046", "N52E020", "N59E121", + "N14E124", "N35E085", "N44E047", "N52E021", "N59E122", + "N14E145", "N35E086", "N44E050", "N52E022", "N59E123", + "N14E168", "N35E087", "N44E051", "N52E023", "N59E124", + "N14E169", "N35E088", "N44E052", "N52E024", "N59E125", + "N15E073", "N35E089", "N44E053", "N52E025", "N59E126", + "N15E074", "N35E090", "N44E054", "N52E026", "N59E127", + "N15E075", "N35E091", "N44E055", "N52E027", "N59E128", + "N15E076", "N35E092", "N44E056", "N52E028", "N59E129", + "N15E077", "N35E093", "N44E057", "N52E029", "N59E130", + "N15E078", "N35E094", "N44E058", "N52E030", "N59E131", + "N15E079", "N35E095", "N44E059", "N52E031", "N59E132", + "N15E080", "N35E096", "N44E060", "N52E032", "N59E133", + "N15E081", "N35E097", "N44E061", "N52E033", "N59E134", + "N15E094", "N35E098", "N44E062", "N52E034", "N59E135", + "N15E095", "N35E099", "N44E063", "N52E035", "N59E136", + "N15E097", "N35E100", "N44E064", "N52E036", "N59E137", + "N15E098", "N35E101", "N44E065", "N52E037", "N59E138", + "N15E099", "N35E102", "N44E066", "N52E038", "N59E139", + "N15E100", "N35E103", "N44E067", "N52E039", "N59E140", + "N15E101", "N35E104", "N44E068", "N52E040", "N59E141", + "N15E102", "N35E105", "N44E069", "N52E041", "N59E142", + "N15E103", "N35E106", "N44E070", "N52E042", "N59E143", + "N15E104", "N35E107", "N44E071", "N52E043", "N59E144", + "N15E105", "N35E108", "N44E072", "N52E044", "N59E145", + "N15E106", "N35E109", "N44E073", "N52E045", "N59E146", + "N15E107", "N35E110", "N44E074", "N52E046", "N59E147", + "N15E108", "N35E111", "N44E075", "N52E047", "N59E148", + "N15E109", "N35E112", "N44E076", "N52E048", "N59E149", + "N15E111", "N35E113", "N44E077", "N52E049", "N59E150", + "N15E119", "N35E114", "N44E078", "N52E050", "N59E151", + "N15E120", "N35E115", "N44E079", "N52E051", "N59E152", + "N15E121", "N35E116", "N44E080", "N52E052", "N59E153", + "N15E122", "N35E117", "N44E081", "N52E053", "N59E154", + "N15E145", "N35E118", "N44E082", "N52E054", "N59E155", + "N16E073", "N35E119", "N44E083", "N52E055", "N59E159", + "N16E074", "N35E120", "N44E084", "N52E056", "N59E160", + "N16E075", "N35E125", "N44E085", "N52E057", "N59E161", + "N16E076", "N35E126", "N44E086", "N52E058", "N59E162", + "N16E077", "N35E127", "N44E087", "N52E059", "N59E163", + "N16E078", "N35E128", "N44E088", "N52E060", "N59E164", + "N16E079", "N35E129", "N44E089", "N52E061", "N59E165", + "N16E080", "N35E132", "N44E090", "N52E062", "N59E166", + "N16E081", "N35E133", "N44E091", "N52E063", "N59W002", + "N16E082", "N35E134", "N44E092", "N52E064", "N59W003", + "N16E094", "N35E135", "N44E093", "N52E065", "N59W004", + "N16E095", "N35E136", "N44E094", "N52E066", "N59W005", + "N16E096", "N35E137", "N44E095", "N52E067", "N59W006", + "N16E097", "N35E138", "N44E096", "N52E068", "N59W007", + "N16E098", "N35E139", "N44E097", "N52E069", "N60E004", + "N16E099", "N35E140", "N44E098", "N52E070", "N60E005", + "N16E100", "N35W001", "N44E099", "N52E071", "N60E006", + "N16E101", "N35W002", "N44E100", "N52E072", "N60E007", + "N16E102", "N35W003", "N44E101", "N52E073", "N60E008", + "N16E103", "N35W004", "N44E102", "N52E074", "N60E009", + "N16E104", "N35W005", "N44E103", "N52E075", "N60E010", + "N16E105", "N35W006", "N44E104", "N52E076", "N60E011", + "N16E106", "N35W007", "N44E105", "N52E077", "N60E012", + "N16E107", "N36E000", "N44E106", "N52E078", "N60E013", + "N16E108", "N36E001", "N44E107", "N52E079", "N60E014", + "N16E111", "N36E002", "N44E108", "N52E080", "N60E015", + "N16E112", "N36E003", "N44E109", "N52E081", "N60E016", + "N16E119", "N36E004", "N44E110", "N52E082", "N60E017", + "N16E120", "N36E005", "N44E111", "N52E083", "N60E018", + "N16E121", "N36E006", "N44E112", "N52E084", "N60E019", + "N16E122", "N36E007", "N44E113", "N52E085", "N60E020", + "N16E145", "N36E008", "N44E114", "N52E086", "N60E021", + "N16E146", "N36E009", "N44E115", "N52E087", "N60E022", + "N17E073", "N36E010", "N44E116", "N52E088", "N60E023", + "N17E074", "N36E011", "N44E117", "N52E089", "N60E024", + "N17E075", "N36E012", "N44E118", "N52E090", "N60E025", + "N17E076", "N36E014", "N44E119", "N52E091", "N60E026", + "N17E077", "N36E015", "N44E120", "N52E092", "N60E027", + "N17E078", "N36E021", "N44E121", "N52E093", "N60E028", + "N17E079", "N36E022", "N44E122", "N52E094", "N60E029", + "N17E080", "N36E023", "N44E123", "N52E095", "N60E030", + "N17E081", "N36E024", "N44E124", "N52E096", "N60E031", + "N17E082", "N36E025", "N44E125", "N52E097", "N60E032", + "N17E083", "N36E026", "N44E126", "N52E098", "N60E033", + "N17E094", "N36E027", "N44E127", "N52E099", "N60E034", + "N17E095", "N36E028", "N44E128", "N52E100", "N60E035", + "N17E096", "N36E029", "N44E129", "N52E101", "N60E036", + "N17E097", "N36E030", "N44E130", "N52E102", "N60E037", + "N17E098", "N36E031", "N44E131", "N52E103", "N60E038", + "N17E099", "N36E032", "N44E132", "N52E104", "N60E039", + "N17E100", "N36E033", "N44E133", "N52E105", "N60E040", + "N17E101", "N36E034", "N44E134", "N52E106", "N60E041", + "N17E102", "N36E035", "N44E135", "N52E107", "N60E042", + "N17E103", "N36E036", "N44E136", "N52E108", "N60E043", + "N17E104", "N36E037", "N44E141", "N52E109", "N60E044", + "N17E105", "N36E038", "N44E142", "N52E110", "N60E045", + "N17E106", "N36E039", "N44E143", "N52E111", "N60E046", + "N17E107", "N36E040", "N44E144", "N52E112", "N60E047", + "N17E120", "N36E041", "N44E145", "N52E113", "N60E048", + "N17E121", "N36E042", "N44E146", "N52E114", "N60E049", + "N17E122", "N36E043", "N44E147", "N52E115", "N60E050", + "N17E145", "N36E044", "N44W001", "N52E116", "N60E051", + "N18E072", "N36E045", "N44W002", "N52E117", "N60E052", + "N18E073", "N36E046", "N45E000", "N52E118", "N60E053", + "N18E074", "N36E047", "N45E001", "N52E119", "N60E054", + "N18E075", "N36E048", "N45E002", "N52E120", "N60E055", + "N18E076", "N36E049", "N45E003", "N52E121", "N60E056", + "N18E077", "N36E050", "N45E004", "N52E122", "N60E057", + "N18E078", "N36E051", "N45E005", "N52E123", "N60E058", + "N18E079", "N36E052", "N45E006", "N52E124", "N60E059", + "N18E080", "N36E053", "N45E007", "N52E125", "N60E060", + "N18E081", "N36E054", "N45E008", "N52E126", "N60E061", + "N18E082", "N36E055", "N45E009", "N52E127", "N60E062", + "N18E083", "N36E056", "N45E010", "N52E128", "N60E063", + "N18E084", "N36E057", "N45E011", "N52E129", "N60E064", + "N18E093", "N36E058", "N45E012", "N52E130", "N60E065", + "N18E094", "N36E059", "N45E013", "N52E131", "N60E066", + "N18E095", "N36E060", "N45E014", "N52E132", "N60E067", + "N18E096", "N36E061", "N45E015", "N52E133", "N60E068", + "N18E097", "N36E062", "N45E016", "N52E134", "N60E069", + "N18E098", "N36E063", "N45E017", "N52E135", "N60E070", + "N18E099", "N36E064", "N45E018", "N52E136", "N60E071", + "N18E100", "N36E065", "N45E019", "N52E137", "N60E072", + "N18E101", "N36E066", "N45E020", "N52E138", "N60E073", + "N18E102", "N36E067", "N45E021", "N52E139", "N60E074", + "N18E103", "N36E068", "N45E022", "N52E140", "N60E075", + "N18E104", "N36E069", "N45E023", "N52E141", "N60E076", + "N18E105", "N36E070", "N45E024", "N52E142", "N60E077", + "N18E106", "N36E071", "N45E025", "N52E143", "N60E078", + "N18E108", "N36E072", "N45E026", "N52E156", "N60E079", + "N18E109", "N36E073", "N45E027", "N52E157", "N60E080", + "N18E110", "N36E074", "N45E028", "N52E158", "N60E081", + "N18E120", "N36E075", "N45E029", "N52E172", "N60E082", + "N18E121", "N36E076", "N45E030", "N52E173", "N60E083", + "N18E122", "N36E077", "N45E032", "N52E174", "N60E084", + "N18E145", "N36E078", "N45E033", "N52E175", "N60E085", + "N19E072", "N36E079", "N45E034", "N52E177", "N60E086", + "N19E073", "N36E080", "N45E035", "N52E178", "N60E087", + "N19E074", "N36E081", "N45E036", "N52E179", "N60E088", + "N19E075", "N36E082", "N45E037", "N52W001", "N60E089", + "N19E076", "N36E083", "N45E038", "N52W002", "N60E090", + "N19E077", "N36E084", "N45E039", "N52W003", "N60E091", + "N19E078", "N36E085", "N45E040", "N52W004", "N60E092", + "N19E079", "N36E086", "N45E041", "N52W005", "N60E093", + "N19E080", "N36E087", "N45E042", "N52W006", "N60E094", + "N19E081", "N36E088", "N45E043", "N52W007", "N60E095", + "N19E082", "N36E089", "N45E044", "N52W008", "N60E096", + "N19E083", "N36E090", "N45E045", "N52W009", "N60E097", + "N19E084", "N36E091", "N45E046", "N52W010", "N60E098", + "N19E085", "N36E092", "N45E047", "N52W011", "N60E099", + "N19E086", "N36E093", "N45E048", "N52W171", "N60E100", + "N19E092", "N36E094", "N45E049", "N52W172", "N60E101", + "N19E093", "N36E095", "N45E050", "N52W173", "N60E102", + "N19E094", "N36E096", "N45E051", "N52W174", "N60E103", + "N19E095", "N36E097", "N45E052", "N52W175", "N60E104", + "N19E096", "N36E098", "N45E053", "N52W176", "N60E105", + "N19E097", "N36E099", "N45E054", "N52W177", "N60E106", + "N19E098", "N36E100", "N45E055", "N53E000", "N60E107", + "N19E099", "N36E101", "N45E056", "N53E004", "N60E108", + "N19E100", "N36E102", "N45E057", "N53E005", "N60E109", + "N19E101", "N36E103", "N45E058", "N53E006", "N60E110", + "N19E102", "N36E104", "N45E059", "N53E007", "N60E111", + "N19E103", "N36E105", "N45E060", "N53E008", "N60E112", + "N19E104", "N36E106", "N45E061", "N53E009", "N60E113", + "N19E105", "N36E107", "N45E062", "N53E010", "N60E114", + "N19E106", "N36E108", "N45E063", "N53E011", "N60E115", + "N19E108", "N36E109", "N45E064", "N53E012", "N60E116", + "N19E109", "N36E110", "N45E065", "N53E013", "N60E117", + "N19E110", "N36E111", "N45E066", "N53E014", "N60E118", + "N19E111", "N36E112", "N45E067", "N53E015", "N60E119", + "N19E121", "N36E113", "N45E068", "N53E016", "N60E120", + "N19E122", "N36E114", "N45E069", "N53E017", "N60E121", + "N19E145", "N36E115", "N45E070", "N53E018", "N60E122", + "N19E166", "N36E116", "N45E071", "N53E019", "N60E123", + "N20E070", "N36E117", "N45E072", "N53E020", "N60E124", + "N20E071", "N36E118", "N45E073", "N53E021", "N60E125", + "N20E072", "N36E119", "N45E074", "N53E022", "N60E126", + "N20E073", "N36E120", "N45E075", "N53E023", "N60E127", + "N20E074", "N36E121", "N45E076", "N53E024", "N60E128", + "N20E075", "N36E122", "N45E077", "N53E025", "N60E129", + "N20E076", "N36E125", "N45E078", "N53E026", "N60E130", + "N20E077", "N36E126", "N45E079", "N53E027", "N60E131", + "N20E078", "N36E127", "N45E080", "N53E028", "N60E132", + "N20E079", "N36E128", "N45E081", "N53E029", "N60E133", + "N20E080", "N36E129", "N45E082", "N53E030", "N60E134", + "N20E081", "N36E132", "N45E083", "N53E031", "N60E135", + "N20E082", "N36E133", "N45E084", "N53E032", "N60E136", + "N20E083", "N36E135", "N45E085", "N53E033", "N60E137", + "N20E084", "N36E136", "N45E086", "N53E034", "N60E138", + "N20E085", "N36E137", "N45E087", "N53E035", "N60E139", + "N20E086", "N36E138", "N45E088", "N53E036", "N60E140", + "N20E087", "N36E139", "N45E089", "N53E037", "N60E141", + "N20E092", "N36E140", "N45E090", "N53E038", "N60E142", + "N20E093", "N36W002", "N45E091", "N53E039", "N60E143", + "N20E094", "N36W003", "N45E092", "N53E040", "N60E144", + "N20E095", "N36W004", "N45E093", "N53E041", "N60E145", + "N20E096", "N36W005", "N45E094", "N53E042", "N60E146", + "N20E097", "N36W006", "N45E095", "N53E043", "N60E147", + "N20E098", "N36W007", "N45E096", "N53E044", "N60E148", + "N20E099", "N36W008", "N45E097", "N53E045", "N60E149", + "N20E100", "N36W009", "N45E098", "N53E046", "N60E150", + "N20E101", "N37E006", "N45E099", "N53E047", "N60E151", + "N20E102", "N37E007", "N45E100", "N53E048", "N60E152", + "N20E103", "N37E008", "N45E101", "N53E049", "N60E153", + "N20E104", "N37E009", "N45E102", "N53E050", "N60E154", + "N20E105", "N37E010", "N45E103", "N53E051", "N60E155", + "N20E106", "N37E011", "N45E104", "N53E052", "N60E156", + "N20E107", "N37E012", "N45E105", "N53E053", "N60E159", + "N20E109", "N37E013", "N45E106", "N53E054", "N60E160", + "N20E110", "N37E014", "N45E107", "N53E055", "N60E161", + "N20E116", "N37E015", "N45E108", "N53E056", "N60E162", + "N20E121", "N37E016", "N45E109", "N53E057", "N60E163", + "N20E122", "N37E020", "N45E110", "N53E058", "N60E164", + "N20E136", "N37E021", "N45E111", "N53E059", "N60E165", + "N20E144", "N37E022", "N45E112", "N53E060", "N60E166", + "N20E145", "N37E023", "N45E113", "N53E061", "N60E167", + "N21E069", "N37E024", "N45E114", "N53E062", "N60E168", + "N21E070", "N37E025", "N45E115", "N53E063", "N60E169", + "N21E071", "N37E026", "N45E116", "N53E064", "N60E170", + "N21E072", "N37E027", "N45E117", "N53E065", "N60E171", + "N21E073", "N37E028", "N45E118", "N53E066", "N60E172", + "N21E074", "N37E029", "N45E119", "N53E067", "N60W001", + "N21E075", "N37E030", "N45E120", "N53E068", "N60W002", + "N21E076", "N37E031", "N45E121", "N53E069", "N60W003", + "N21E077", "N37E032", "N45E122", "N53E070", "N60W173", + "N21E078", "N37E033", "N45E123", "N53E071", "N60W174", + "N21E079", "N37E034", "N45E124", "N53E072", "S01E073", + "N21E080", "N37E035", "N45E125", "N53E073", "S01E098", + "N21E081", "N37E036", "N45E126", "N53E074", "S01E099", + "N21E082", "N37E037", "N45E127", "N53E075", "S01E100", + "N21E083", "N37E038", "N45E128", "N53E076", "S01E101", + "N21E084", "N37E039", "N45E129", "N53E077", "S01E102", + "N21E085", "N37E040", "N45E130", "N53E078", "S01E103", + "N21E086", "N37E041", "N45E131", "N53E079", "S01E104", + "N21E087", "N37E042", "N45E132", "N53E080", "S01E105", + "N21E088", "N37E043", "N45E133", "N53E081", "S01E109", + "N21E089", "N37E044", "N45E134", "N53E082", "S01E110", + "N21E090", "N37E045", "N45E135", "N53E083", "S01E111", + "N21E091", "N37E046", "N45E136", "N53E084", "S01E112", + "N21E092", "N37E047", "N45E137", "N53E085", "S01E113", + "N21E093", "N37E048", "N45E140", "N53E086", "S01E114", + "N21E094", "N37E049", "N45E141", "N53E087", "S01E115", + "N21E095", "N37E050", "N45E142", "N53E088", "S01E116", + "N21E096", "N37E053", "N45E147", "N53E089", "S01E117", + "N21E097", "N37E054", "N45E148", "N53E090", "S01E119", + "N21E098", "N37E055", "N45E149", "N53E091", "S01E120", + "N21E099", "N37E056", "N45E150", "N53E092", "S01E121", + "N21E100", "N37E057", "N45W001", "N53E093", "S01E122", + "N21E101", "N37E058", "N45W002", "N53E094", "S01E123", + "N21E102", "N37E059", "N46E000", "N53E095", "S01E127", + "N21E103", "N37E060", "N46E001", "N53E096", "S01E128", + "N21E104", "N37E061", "N46E002", "N53E097", "S01E129", + "N21E105", "N37E062", "N46E003", "N53E098", "S01E130", + "N21E106", "N37E063", "N46E004", "N53E099", "S01E131", + "N21E107", "N37E064", "N46E005", "N53E100", "S01E132", + "N21E108", "N37E065", "N46E006", "N53E101", "S01E133", + "N21E109", "N37E066", "N46E007", "N53E102", "S01E134", + "N21E110", "N37E067", "N46E008", "N53E103", "S01E135", + "N21E111", "N37E068", "N46E009", "N53E104", "S01E136", + "N21E112", "N37E069", "N46E010", "N53E105", "S01E145", + "N21E113", "N37E070", "N46E011", "N53E106", "S01E166", + "N21E114", "N37E071", "N46E012", "N53E107", "S01E169", + "N21E120", "N37E072", "N46E013", "N53E108", "S01E174", + "N21E121", "N37E073", "N46E014", "N53E109", "S01W161", + "N22E068", "N37E074", "N46E015", "N53E110", "S02E098", + "N22E069", "N37E075", "N46E016", "N53E111", "S02E099", + "N22E070", "N37E076", "N46E017", "N53E112", "S02E100", + "N22E071", "N37E077", "N46E018", "N53E113", "S02E101", + "N22E072", "N37E078", "N46E019", "N53E114", "S02E102", + "N22E073", "N37E079", "N46E020", "N53E115", "S02E103", + "N22E074", "N37E080", "N46E021", "N53E116", "S02E104", + "N22E075", "N37E081", "N46E022", "N53E117", "S02E105", + "N22E076", "N37E082", "N46E023", "N53E118", "S02E106", + "N22E077", "N37E083", "N46E024", "N53E119", "S02E108", + "N22E078", "N37E084", "N46E025", "N53E120", "S02E109", + "N22E079", "N37E085", "N46E026", "N53E121", "S02E110", + "N22E080", "N37E086", "N46E027", "N53E122", "S02E111", + "N22E081", "N37E087", "N46E028", "N53E123", "S02E112", + "N22E082", "N37E088", "N46E029", "N53E124", "S02E113", + "N22E083", "N37E089", "N46E030", "N53E125", "S02E114", + "N22E084", "N37E090", "N46E031", "N53E126", "S02E115", + "N22E085", "N37E091", "N46E032", "N53E127", "S02E116", + "N22E086", "N37E092", "N46E033", "N53E128", "S02E117", + "N22E087", "N37E093", "N46E034", "N53E129", "S02E119", + "N22E088", "N37E094", "N46E035", "N53E130", "S02E120", + "N22E089", "N37E095", "N46E036", "N53E131", "S02E121", + "N22E090", "N37E096", "N46E037", "N53E132", "S02E122", + "N22E091", "N37E097", "N46E038", "N53E133", "S02E123", + "N22E092", "N37E098", "N46E039", "N53E134", "S02E124", + "N22E093", "N37E099", "N46E040", "N53E135", "S02E125", + "N22E094", "N37E100", "N46E041", "N53E136", "S02E126", + "N22E095", "N37E101", "N46E042", "N53E137", "S02E127", + "N22E096", "N37E102", "N46E043", "N53E138", "S02E128", + "N22E097", "N37E103", "N46E044", "N53E139", "S02E129", + "N22E098", "N37E104", "N46E045", "N53E140", "S02E130", + "N22E099", "N37E105", "N46E046", "N53E141", "S02E131", + "N22E100", "N37E106", "N46E047", "N53E142", "S02E132", + "N22E101", "N37E107", "N46E048", "N53E143", "S02E133", + "N22E102", "N37E108", "N46E049", "N53E155", "S02E134", + "N22E103", "N37E109", "N46E050", "N53E156", "S02E135", + "N22E104", "N37E110", "N46E051", "N53E157", "S02E136", + "N22E105", "N37E111", "N46E052", "N53E158", "S02E137", + "N22E106", "N37E112", "N46E053", "N53E159", "S02E138", + "N22E107", "N37E113", "N46E054", "N53E160", "S02E139", + "N22E108", "N37E114", "N46E055", "N53E172", "S02E142", + "N22E109", "N37E115", "N46E056", "N53W001", "S02E143", + "N22E110", "N37E116", "N46E057", "N53W002", "S02E144", + "N22E111", "N37E117", "N46E058", "N53W003", "S02E145", + "N22E112", "N37E118", "N46E059", "N53W004", "S02E146", + "N22E113", "N37E119", "N46E060", "N53W005", "S02E147", + "N22E114", "N37E120", "N46E061", "N53W006", "S02E148", + "N22E115", "N37E121", "N46E062", "N53W007", "S02E149", + "N22E116", "N37E122", "N46E063", "N53W008", "S02E150", + "N22E120", "N37E124", "N46E064", "N53W009", "S02E174", + "N22E121", "N37E125", "N46E065", "N53W010", "S02E175", + "N23E067", "N37E126", "N46E066", "N53W011", "S02E176", + "N23E068", "N37E127", "N46E067", "N54E007", "S03E099", + "N23E069", "N37E128", "N46E068", "N54E008", "S03E100", + "N23E070", "N37E129", "N46E069", "N54E009", "S03E101", + "N23E071", "N37E130", "N46E070", "N54E010", "S03E102", + "N23E072", "N37E131", "N46E071", "N54E011", "S03E103", + "N23E073", "N37E136", "N46E072", "N54E012", "S03E104", + "N23E074", "N37E137", "N46E073", "N54E013", "S03E105", + "N23E075", "N37E138", "N46E074", "N54E014", "S03E106", + "N23E076", "N37E139", "N46E075", "N54E015", "S03E107", + "N23E077", "N37E140", "N46E076", "N54E016", "S03E108", + "N23E078", "N37E141", "N46E077", "N54E017", "S03E110", + "N23E079", "N37W001", "N46E078", "N54E018", "S03E111", + "N23E080", "N37W002", "N46E079", "N54E019", "S03E112", + "N23E081", "N37W003", "N46E080", "N54E020", "S03E113", + "N23E082", "N37W004", "N46E081", "N54E021", "S03E114", + "N23E083", "N37W005", "N46E082", "N54E022", "S03E115", + "N23E084", "N37W006", "N46E083", "N54E023", "S03E116", + "N23E085", "N37W007", "N46E084", "N54E024", "S03E117", + "N23E086", "N37W008", "N46E085", "N54E025", "S03E118", + "N23E087", "N37W009", "N46E086", "N54E026", "S03E119", + "N23E088", "N38E000", "N46E087", "N54E027", "S03E120", + "N23E089", "N38E001", "N46E088", "N54E028", "S03E121", + "N23E090", "N38E008", "N46E089", "N54E029", "S03E122", + "N23E091", "N38E009", "N46E090", "N54E030", "S03E123", + "N23E092", "N38E012", "N46E091", "N54E031", "S03E124", + "N23E093", "N38E013", "N46E092", "N54E032", "S03E125", + "N23E094", "N38E014", "N46E093", "N54E033", "S03E126", + "N23E095", "N38E015", "N46E094", "N54E034", "S03E127", + "N23E096", "N38E016", "N46E095", "N54E035", "S03E128", + "N23E097", "N38E017", "N46E096", "N54E036", "S03E129", + "N23E098", "N38E020", "N46E097", "N54E037", "S03E130", + "N23E099", "N38E021", "N46E098", "N54E038", "S03E131", + "N23E100", "N38E022", "N46E099", "N54E039", "S03E132", + "N23E101", "N38E023", "N46E100", "N54E040", "S03E133", + "N23E102", "N38E024", "N46E101", "N54E041", "S03E134", + "N23E103", "N38E025", "N46E102", "N54E042", "S03E135", + "N23E104", "N38E026", "N46E103", "N54E043", "S03E136", + "N23E105", "N38E027", "N46E104", "N54E044", "S03E137", + "N23E106", "N38E028", "N46E105", "N54E045", "S03E138", + "N23E107", "N38E029", "N46E106", "N54E046", "S03E139", + "N23E108", "N38E030", "N46E107", "N54E047", "S03E140", + "N23E109", "N38E031", "N46E108", "N54E048", "S03E141", + "N23E110", "N38E032", "N46E109", "N54E049", "S03E142", + "N23E111", "N38E033", "N46E110", "N54E050", "S03E145", + "N23E112", "N38E034", "N46E111", "N54E051", "S03E146", + "N23E113", "N38E035", "N46E112", "N54E052", "S03E147", + "N23E114", "N38E036", "N46E113", "N54E053", "S03E148", + "N23E115", "N38E037", "N46E114", "N54E054", "S03E149", + "N23E116", "N38E038", "N46E115", "N54E055", "S03E150", + "N23E117", "N38E039", "N46E116", "N54E056", "S03E151", + "N23E119", "N38E040", "N46E117", "N54E057", "S03E152", + "N23E120", "N38E041", "N46E118", "N54E058", "S03E175", + "N23E121", "N38E042", "N46E119", "N54E059", "S03E176", + "N24E066", "N38E043", "N46E120", "N54E060", "S03W172", + "N24E067", "N38E044", "N46E121", "N54E061", "S04E100", + "N24E068", "N38E045", "N46E122", "N54E062", "S04E101", + "N24E069", "N38E046", "N46E123", "N54E063", "S04E102", + "N24E070", "N38E047", "N46E124", "N54E064", "S04E103", + "N24E071", "N38E048", "N46E125", "N54E065", "S04E104", + "N24E072", "N38E049", "N46E126", "N54E066", "S04E105", + "N24E073", "N38E053", "N46E127", "N54E067", "S04E106", + "N24E074", "N38E054", "N46E128", "N54E068", "S04E107", + "N24E075", "N38E055", "N46E129", "N54E069", "S04E108", + "N24E076", "N38E056", "N46E130", "N54E070", "S04E110", + "N24E077", "N38E057", "N46E131", "N54E071", "S04E111", + "N24E078", "N38E058", "N46E132", "N54E072", "S04E112", + "N24E079", "N38E059", "N46E133", "N54E073", "S04E113", + "N24E080", "N38E060", "N46E134", "N54E074", "S04E114", + "N24E081", "N38E061", "N46E135", "N54E075", "S04E115", + "N24E082", "N38E062", "N46E136", "N54E076", "S04E116", + "N24E083", "N38E063", "N46E137", "N54E077", "S04E117", + "N24E084", "N38E064", "N46E138", "N54E078", "S04E118", + "N24E085", "N38E065", "N46E141", "N54E079", "S04E119", + "N24E086", "N38E066", "N46E142", "N54E080", "S04E120", + "N24E087", "N38E067", "N46E143", "N54E081", "S04E121", + "N24E088", "N38E068", "N46E149", "N54E082", "S04E122", + "N24E089", "N38E069", "N46E150", "N54E083", "S04E123", + "N24E090", "N38E070", "N46E151", "N54E084", "S04E125", + "N24E091", "N38E071", "N46E152", "N54E085", "S04E126", + "N24E092", "N38E072", "N46W001", "N54E086", "S04E127", + "N24E093", "N38E073", "N46W002", "N54E087", "S04E128", + "N24E094", "N38E074", "N46W003", "N54E088", "S04E129", + "N24E095", "N38E075", "N47E000", "N54E089", "S04E130", + "N24E096", "N38E076", "N47E001", "N54E090", "S04E131", + "N24E097", "N38E077", "N47E002", "N54E091", "S04E132", + "N24E098", "N38E078", "N47E003", "N54E092", "S04E133", + "N24E099", "N38E079", "N47E004", "N54E093", "S04E134", + "N24E100", "N38E080", "N47E005", "N54E094", "S04E135", + "N24E101", "N38E081", "N47E006", "N54E095", "S04E136", + "N24E102", "N38E082", "N47E007", "N54E096", "S04E137", + "N24E103", "N38E083", "N47E008", "N54E097", "S04E138", + "N24E104", "N38E084", "N47E009", "N54E098", "S04E139", + "N24E105", "N38E085", "N47E010", "N54E099", "S04E140", + "N24E106", "N38E086", "N47E011", "N54E100", "S04E141", + "N24E107", "N38E087", "N47E012", "N54E101", "S04E142", + "N24E108", "N38E088", "N47E013", "N54E102", "S04E143", + "N24E109", "N38E089", "N47E014", "N54E103", "S04E144", + "N24E110", "N38E090", "N47E015", "N54E104", "S04E150", + "N24E111", "N38E091", "N47E016", "N54E105", "S04E151", + "N24E112", "N38E092", "N47E017", "N54E106", "S04E152", + "N24E113", "N38E093", "N47E018", "N54E107", "S04E153", + "N24E114", "N38E094", "N47E019", "N54E108", "S04E154", + "N24E115", "N38E095", "N47E020", "N54E109", "S04W155", + "N24E116", "N38E096", "N47E021", "N54E110", "S04W171", + "N24E117", "N38E097", "N47E022", "N54E111", "S04W172", + "N24E118", "N38E098", "N47E023", "N54E112", "S04W175", + "N24E119", "N38E099", "N47E024", "N54E113", "S05E101", + "N24E120", "N38E100", "N47E025", "N54E114", "S05E102", + "N24E121", "N38E101", "N47E026", "N54E115", "S05E103", + "N24E122", "N38E102", "N47E027", "N54E116", "S05E104", + "N24E123", "N38E103", "N47E028", "N54E117", "S05E105", + "N24E124", "N38E104", "N47E029", "N54E118", "S05E114", + "N24E125", "N38E105", "N47E030", "N54E119", "S05E115", + "N24E131", "N38E106", "N47E031", "N54E120", "S05E116", + "N24E141", "N38E107", "N47E032", "N54E121", "S05E119", + "N24E153", "N38E108", "N47E033", "N54E122", "S05E120", + "N25E060", "N38E109", "N47E034", "N54E123", "S05E121", + "N25E061", "N38E110", "N47E035", "N54E124", "S05E122", + "N25E062", "N38E111", "N47E036", "N54E125", "S05E123", + "N25E063", "N38E112", "N47E037", "N54E126", "S05E129", + "N25E064", "N38E113", "N47E038", "N54E127", "S05E130", + "N25E065", "N38E114", "N47E039", "N54E128", "S05E131", + "N25E066", "N38E115", "N47E040", "N54E129", "S05E132", + "N25E067", "N38E116", "N47E041", "N54E130", "S05E133", + "N25E068", "N38E117", "N47E042", "N54E131", "S05E134", + "N25E069", "N38E118", "N47E043", "N54E132", "S05E135", + "N25E070", "N38E120", "N47E044", "N54E133", "S05E136", + "N25E071", "N38E121", "N47E045", "N54E134", "S05E137", + "N25E072", "N38E124", "N47E046", "N54E135", "S05E138", + "N25E073", "N38E125", "N47E047", "N54E136", "S05E139", + "N25E074", "N38E126", "N47E048", "N54E137", "S05E140", + "N25E075", "N38E127", "N47E049", "N54E138", "S05E141", + "N25E076", "N38E128", "N47E050", "N54E139", "S05E142", + "N25E077", "N38E138", "N47E051", "N54E140", "S05E143", + "N25E078", "N38E139", "N47E052", "N54E142", "S05E144", + "N25E079", "N38E140", "N47E053", "N54E155", "S05E145", + "N25E080", "N38E141", "N47E054", "N54E156", "S05E146", + "N25E081", "N38W001", "N47E055", "N54E157", "S05E149", + "N25E082", "N38W002", "N47E056", "N54E158", "S05E150", + "N25E083", "N38W003", "N47E057", "N54E159", "S05E151", + "N25E084", "N38W004", "N47E058", "N54E160", "S05E152", + "N25E085", "N38W005", "N47E059", "N54E161", "S05E153", + "N25E086", "N38W006", "N47E060", "N54E162", "S05E154", + "N25E087", "N38W007", "N47E061", "N54E166", "S05E155", + "N25E088", "N38W008", "N47E062", "N54E167", "S05E156", + "N25E089", "N38W009", "N47E063", "N54E168", "S05E157", + "N25E090", "N38W010", "N47E064", "N54W001", "S05E159", + "N25E091", "N39E000", "N47E065", "N54W002", "S05W155", + "N25E092", "N39E001", "N47E066", "N54W003", "S05W172", + "N25E093", "N39E002", "N47E067", "N54W004", "S05W173", + "N25E094", "N39E003", "N47E068", "N54W005", "S05W175", + "N25E095", "N39E004", "N47E069", "N54W006", "S06E071", + "N25E096", "N39E008", "N47E070", "N54W007", "S06E072", + "N25E097", "N39E009", "N47E071", "N54W008", "S06E102", + "N25E098", "N39E015", "N47E072", "N54W009", "S06E103", + "N25E099", "N39E016", "N47E073", "N54W010", "S06E104", + "N25E100", "N39E017", "N47E074", "N54W011", "S06E105", + "N25E101", "N39E018", "N47E075", "N55E008", "S06E106", + "N25E102", "N39E019", "N47E076", "N55E009", "S06E107", + "N25E103", "N39E020", "N47E077", "N55E010", "S06E108", + "N25E104", "N39E021", "N47E078", "N55E011", "S06E110", + "N25E105", "N39E022", "N47E079", "N55E012", "S06E112", + "N25E106", "N39E023", "N47E080", "N55E013", "S06E114", + "N25E107", "N39E024", "N47E081", "N55E014", "S06E117", + "N25E108", "N39E025", "N47E082", "N55E015", "S06E118", + "N25E109", "N39E026", "N47E083", "N55E020", "S06E119", + "N25E110", "N39E027", "N47E084", "N55E021", "S06E120", + "N25E111", "N39E028", "N47E085", "N55E022", "S06E121", + "N25E112", "N39E029", "N47E086", "N55E023", "S06E122", + "N25E113", "N39E030", "N47E087", "N55E024", "S06E123", + "N25E114", "N39E031", "N47E088", "N55E025", "S06E124", + "N25E115", "N39E032", "N47E089", "N55E026", "S06E127", + "N25E116", "N39E033", "N47E090", "N55E027", "S06E130", + "N25E117", "N39E034", "N47E091", "N55E028", "S06E131", + "N25E118", "N39E035", "N47E092", "N55E029", "S06E132", + "N25E119", "N39E036", "N47E093", "N55E030", "S06E133", + "N25E121", "N39E037", "N47E094", "N55E031", "S06E134", + "N25E122", "N39E038", "N47E095", "N55E032", "S06E137", + "N25E123", "N39E039", "N47E096", "N55E033", "S06E138", + "N25E124", "N39E040", "N47E097", "N55E034", "S06E139", + "N25E131", "N39E041", "N47E098", "N55E035", "S06E140", + "N25E141", "N39E042", "N47E099", "N55E036", "S06E141", + "N26E060", "N39E043", "N47E100", "N55E037", "S06E142", + "N26E061", "N39E044", "N47E101", "N55E038", "S06E143", + "N26E062", "N39E045", "N47E102", "N55E039", "S06E144", + "N26E063", "N39E046", "N47E103", "N55E040", "S06E145", + "N26E064", "N39E047", "N47E104", "N55E041", "S06E146", + "N26E065", "N39E048", "N47E105", "N55E042", "S06E147", + "N26E066", "N39E049", "N47E106", "N55E043", "S06E148", + "N26E067", "N39E052", "N47E107", "N55E044", "S06E149", + "N26E068", "N39E053", "N47E108", "N55E045", "S06E150", + "N26E069", "N39E054", "N47E109", "N55E046", "S06E151", + "N26E070", "N39E055", "N47E110", "N55E047", "S06E152", + "N26E071", "N39E056", "N47E111", "N55E048", "S06E154", + "N26E072", "N39E057", "N47E112", "N55E049", "S06E155", + "N26E073", "N39E058", "N47E113", "N55E050", "S06E159", + "N26E074", "N39E059", "N47E114", "N55E051", "S06E176", + "N26E075", "N39E060", "N47E115", "N55E052", "S06W156", + "N26E076", "N39E061", "N47E116", "N55E053", "S07E071", + "N26E077", "N39E062", "N47E117", "N55E054", "S07E105", + "N26E078", "N39E063", "N47E118", "N55E055", "S07E106", + "N26E079", "N39E064", "N47E119", "N55E056", "S07E107", + "N26E080", "N39E065", "N47E120", "N55E057", "S07E108", + "N26E081", "N39E066", "N47E121", "N55E058", "S07E109", + "N26E082", "N39E067", "N47E122", "N55E059", "S07E110", + "N26E083", "N39E068", "N47E123", "N55E060", "S07E111", + "N26E084", "N39E069", "N47E124", "N55E061", "S07E112", + "N26E085", "N39E070", "N47E125", "N55E062", "S07E113", + "N26E086", "N39E071", "N47E126", "N55E063", "S07E114", + "N26E087", "N39E072", "N47E127", "N55E064", "S07E115", + "N26E088", "N39E073", "N47E128", "N55E065", "S07E116", + "N26E089", "N39E074", "N47E129", "N55E066", "S07E118", + "N26E090", "N39E075", "N47E130", "N55E067", "S07E119", + "N26E091", "N39E076", "N47E131", "N55E068", "S07E120", + "N26E092", "N39E077", "N47E132", "N55E069", "S07E121", + "N26E093", "N39E078", "N47E133", "N55E070", "S07E122", + "N26E094", "N39E079", "N47E134", "N55E071", "S07E124", + "N26E095", "N39E080", "N47E135", "N55E072", "S07E126", + "N26E096", "N39E081", "N47E136", "N55E073", "S07E129", + "N26E097", "N39E082", "N47E137", "N55E074", "S07E130", + "N26E098", "N39E083", "N47E138", "N55E075", "S07E131", + "N26E099", "N39E084", "N47E139", "N55E076", "S07E132", + "N26E100", "N39E085", "N47E141", "N55E077", "S07E134", + "N26E101", "N39E086", "N47E142", "N55E078", "S07E138", + "N26E102", "N39E087", "N47E143", "N55E079", "S07E139", + "N26E103", "N39E088", "N47E152", "N55E080", "S07E140", + "N26E104", "N39E089", "N47E153", "N55E081", "S07E141", + "N26E105", "N39E090", "N47W001", "N55E082", "S07E142", + "N26E106", "N39E091", "N47W002", "N55E083", "S07E143", + "N26E107", "N39E092", "N47W003", "N55E084", "S07E144", + "N26E108", "N39E093", "N47W004", "N55E085", "S07E145", + "N26E109", "N39E094", "N47W005", "N55E086", "S07E146", + "N26E110", "N39E095", "N48E000", "N55E087", "S07E147", + "N26E111", "N39E096", "N48E001", "N55E088", "S07E148", + "N26E112", "N39E097", "N48E002", "N55E089", "S07E149", + "N26E113", "N39E098", "N48E003", "N55E090", "S07E150", + "N26E114", "N39E099", "N48E004", "N55E091", "S07E151", + "N26E115", "N39E100", "N48E005", "N55E092", "S07E154", + "N26E116", "N39E101", "N48E006", "N55E093", "S07E155", + "N26E117", "N39E102", "N48E007", "N55E094", "S07E156", + "N26E118", "N39E103", "N48E008", "N55E095", "S07E157", + "N26E119", "N39E104", "N48E009", "N55E096", "S07E176", + "N26E120", "N39E105", "N48E010", "N55E097", "S07E177", + "N26E126", "N39E106", "N48E011", "N55E098", "S08E072", + "N26E127", "N39E107", "N48E012", "N55E099", "S08E105", + "N26E128", "N39E108", "N48E013", "N55E100", "S08E106", + "N26E142", "N39E109", "N48E014", "N55E101", "S08E107", + "N27E060", "N39E110", "N48E015", "N55E102", "S08E108", + "N27E061", "N39E111", "N48E016", "N55E103", "S08E109", + "N27E062", "N39E112", "N48E017", "N55E104", "S08E110", + "N27E063", "N39E113", "N48E018", "N55E105", "S08E111", + "N27E064", "N39E114", "N48E019", "N55E106", "S08E112", + "N27E065", "N39E115", "N48E020", "N55E107", "S08E113", + "N27E066", "N39E116", "N48E021", "N55E108", "S08E114", + "N27E067", "N39E117", "N48E022", "N55E109", "S08E115", + "N27E068", "N39E118", "N48E023", "N55E110", "S08E117", + "N27E069", "N39E119", "N48E024", "N55E111", "S08E118", + "N27E070", "N39E121", "N48E025", "N55E112", "S08E120", + "N27E071", "N39E122", "N48E026", "N55E113", "S08E121", + "N27E072", "N39E123", "N48E027", "N55E114", "S08E122", + "N27E073", "N39E124", "N48E028", "N55E115", "S08E123", + "N27E074", "N39E125", "N48E029", "N55E116", "S08E125", + "N27E075", "N39E126", "N48E030", "N55E117", "S08E126", + "N27E076", "N39E127", "N48E031", "N55E118", "S08E127", + "N27E077", "N39E128", "N48E032", "N55E119", "S08E128", + "N27E078", "N39E139", "N48E033", "N55E120", "S08E129", + "N27E079", "N39E140", "N48E034", "N55E121", "S08E130", + "N27E080", "N39E141", "N48E035", "N55E122", "S08E131", + "N27E081", "N39E142", "N48E036", "N55E123", "S08E134", + "N27E082", "N39W001", "N48E037", "N55E124", "S08E137", + "N27E083", "N39W002", "N48E038", "N55E125", "S08E138", + "N27E084", "N39W003", "N48E039", "N55E126", "S08E139", + "N27E085", "N39W004", "N48E040", "N55E127", "S08E140", + "N27E086", "N39W005", "N48E041", "N55E128", "S08E141", + "N27E087", "N39W006", "N48E042", "N55E129", "S08E142", + "N27E088", "N39W007", "N48E043", "N55E130", "S08E143", + "N27E089", "N39W008", "N48E044", "N55E131", "S08E144", + "N27E090", "N39W009", "N48E045", "N55E132", "S08E145", + "N27E091", "N39W010", "N48E046", "N55E133", "S08E146", + "N27E092", "N40E000", "N48E047", "N55E134", "S08E147", + "N27E093", "N40E003", "N48E048", "N55E135", "S08E155", + "N27E094", "N40E004", "N48E049", "N55E136", "S08E156", + "N27E095", "N40E008", "N48E050", "N55E137", "S08E157", + "N27E096", "N40E009", "N48E051", "N55E138", "S08E158", + "N27E097", "N40E012", "N48E052", "N55E155", "S08E159", + "N27E098", "N40E013", "N48E053", "N55E156", "S08E160", + "N27E099", "N40E014", "N48E054", "N55E157", "S08E177", + "N27E100", "N40E015", "N48E055", "N55E158", "S08E178", + "N27E101", "N40E016", "N48E056", "N55E159", "S08W141", + "N27E102", "N40E017", "N48E057", "N55E160", "S09E110", + "N27E103", "N40E018", "N48E058", "N55E161", "S09E111", + "N27E104", "N40E019", "N48E059", "N55E162", "S09E112", + "N27E105", "N40E020", "N48E060", "N55E165", "S09E113", + "N27E106", "N40E021", "N48E061", "N55E166", "S09E114", + "N27E107", "N40E022", "N48E062", "N55W002", "S09E115", + "N27E108", "N40E023", "N48E063", "N55W003", "S09E116", + "N27E109", "N40E024", "N48E064", "N55W004", "S09E117", + "N27E110", "N40E025", "N48E065", "N55W005", "S09E118", + "N27E111", "N40E026", "N48E066", "N55W006", "S09E119", + "N27E112", "N40E027", "N48E067", "N55W007", "S09E120", + "N27E113", "N40E028", "N48E068", "N55W008", "S09E121", + "N27E114", "N40E029", "N48E069", "N55W009", "S09E122", + "N27E115", "N40E030", "N48E070", "N56E008", "S09E123", + "N27E116", "N40E031", "N48E071", "N56E009", "S09E124", + "N27E117", "N40E032", "N48E072", "N56E010", "S09E125", + "N27E118", "N40E033", "N48E073", "N56E011", "S09E126", + "N27E119", "N40E034", "N48E074", "N56E012", "S09E127", + "N27E120", "N40E035", "N48E075", "N56E013", "S09E128", + "N27E121", "N40E036", "N48E076", "N56E014", "S09E129", + "N27E127", "N40E037", "N48E077", "N56E015", "S09E130", + "N27E128", "N40E038", "N48E078", "N56E016", "S09E131", + "N27E129", "N40E039", "N48E079", "N56E018", "S09E137", + "N27E140", "N40E040", "N48E080", "N56E020", "S09E138", + "N27E142", "N40E041", "N48E081", "N56E021", "S09E139", + "N28E060", "N40E042", "N48E082", "N56E022", "S09E140", + "N28E061", "N40E043", "N48E083", "N56E023", "S09E141", + "N28E062", "N40E044", "N48E084", "N56E024", "S09E142", + "N28E063", "N40E045", "N48E085", "N56E025", "S09E143", + "N28E064", "N40E046", "N48E086", "N56E026", "S09E145", + "N28E065", "N40E047", "N48E087", "N56E027", "S09E146", + "N28E066", "N40E048", "N48E088", "N56E028", "S09E147", + "N28E067", "N40E049", "N48E089", "N56E029", "S09E148", + "N28E068", "N40E050", "N48E090", "N56E030", "S09E149", + "N28E069", "N40E052", "N48E091", "N56E031", "S09E150", + "N28E070", "N40E053", "N48E092", "N56E032", "S09E151", + "N28E071", "N40E054", "N48E093", "N56E033", "S09E152", + "N28E072", "N40E055", "N48E094", "N56E034", "S09E156", + "N28E073", "N40E056", "N48E095", "N56E035", "S09E157", + "N28E074", "N40E057", "N48E096", "N56E036", "S09E158", + "N28E075", "N40E058", "N48E097", "N56E037", "S09E159", + "N28E076", "N40E059", "N48E098", "N56E038", "S09E160", + "N28E077", "N40E060", "N48E099", "N56E039", "S09E161", + "N28E078", "N40E061", "N48E100", "N56E040", "S09E178", + "N28E079", "N40E062", "N48E101", "N56E041", "S09E179", + "N28E080", "N40E063", "N48E102", "N56E042", "S09W140", + "N28E081", "N40E064", "N48E103", "N56E043", "S09W141", + "N28E082", "N40E065", "N48E104", "N56E044", "S09W158", + "N28E083", "N40E066", "N48E105", "N56E045", "S09W159", + "N28E084", "N40E067", "N48E106", "N56E046", "S09W173", + "N28E085", "N40E068", "N48E107", "N56E047", "S10E116", + "N28E086", "N40E069", "N48E108", "N56E048", "S10E117", + "N28E087", "N40E070", "N48E109", "N56E049", "S10E118", + "N28E088", "N40E071", "N48E110", "N56E050", "S10E119", + "N28E089", "N40E072", "N48E111", "N56E051", "S10E120", + "N28E090", "N40E073", "N48E112", "N56E052", "S10E123", + "N28E091", "N40E074", "N48E113", "N56E053", "S10E124", + "N28E092", "N40E075", "N48E114", "N56E054", "S10E125", + "N28E093", "N40E076", "N48E115", "N56E055", "S10E126", + "N28E094", "N40E077", "N48E116", "N56E056", "S10E140", + "N28E095", "N40E078", "N48E117", "N56E057", "S10E141", + "N28E096", "N40E079", "N48E118", "N56E058", "S10E142", + "N28E097", "N40E080", "N48E119", "N56E059", "S10E143", + "N28E098", "N40E081", "N48E120", "N56E060", "S10E144", + "N28E099", "N40E082", "N48E121", "N56E061", "S10E146", + "N28E100", "N40E083", "N48E122", "N56E062", "S10E147", + "N28E101", "N40E084", "N48E123", "N56E063", "S10E148", + "N28E102", "N40E085", "N48E124", "N56E064", "S10E149", + "N28E103", "N40E086", "N48E125", "N56E065", "S10E150", + "N28E104", "N40E087", "N48E126", "N56E066", "S10E151", + "N28E105", "N40E088", "N48E127", "N56E067", "S10E152", + "N28E106", "N40E089", "N48E128", "N56E068", "S10E153", + "N28E107", "N40E090", "N48E129", "N56E069", "S10E158", + "N28E108", "N40E091", "N48E130", "N56E070", "S10E159", + "N28E109", "N40E092", "N48E131", "N56E071", "S10E160", + "N28E110", "N40E093", "N48E132", "N56E072", "S10E161", + "N28E111", "N40E094", "N48E133", "N56E073", "S10E167", + "N28E112", "N40E095", "N48E134", "N56E074", "S10E179", + "N28E113", "N40E096", "N48E135", "N56E075", "S10W139", + "N28E114", "N40E097", "N48E136", "N56E076", "S10W140", + "N28E115", "N40E098", "N48E137", "N56E077", "S10W141", + "N28E116", "N40E099", "N48E138", "N56E078", "S10W151", + "N28E117", "N40E100", "N48E139", "N56E079", "S10W158", + "N28E118", "N40E101", "N48E140", "N56E080", "S10W159", + "N28E119", "N40E102", "N48E141", "N56E081", "S10W162", + "N28E120", "N40E103", "N48E142", "N56E082", "S10W172", + "N28E121", "N40E104", "N48E144", "N56E083", "S11E105", + "N28E122", "N40E105", "N48E153", "N56E084", "S12E096", + "N28E128", "N40E106", "N48E154", "N56E085", "S13E096", + "N28E129", "N40E107", "N48W001", "N56E086", + "N28E130", "N40E108", "N48W002", "N56E087", + "N29E060", "N40E109", "N48W003", "N56E088", + (char *)0, + + "Islands", + "N16W170", "S21W030", "S40E174", "S44W176", "S49E068", + "N18W156", "S29E167", "S40E175", "S44W177", "S49E069", + "N19W155", "S30E167", "S40E176", "S45E167", "S49E166", + "N19W156", "S30W178", "S40E177", "S45E168", "S50E068", + "N19W157", "S31W179", "S40E178", "S45E169", "S50E069", + "N20W156", "S32W179", "S41E172", "S45E170", "S50E070", + "N20W157", "S35E172", "S41E173", "S45E171", "S50E178", + "N20W158", "S35E173", "S41E174", "S45W176", "S51E068", + "N21W157", "S36E173", "S41E175", "S45W177", "S51E165", + "N21W158", "S36E174", "S41E176", "S46E050", "S51E166", + "N21W159", "S36E175", "S41W010", "S46E166", "S53E073", + "N21W160", "S37E173", "S41W011", "S46E167", "S53E168", + "N21W161", "S37E174", "S42E171", "S46E168", "S53E169", + "N22W160", "S37E175", "S42E172", "S46E169", "S54E072", + "N22W161", "S37E176", "S42E173", "S46E170", "S54E073", + "N23W162", "S38E077", "S42E174", "S46E171", "S54W038", + "N23W165", "S38E174", "S42E175", "S47E037", "S54W039", + "N23W167", "S38E175", "S42E176", "S47E038", "S55E003", + "N24W168", "S38E176", "S43E170", "S47E050", "S55E158", + "N25W168", "S38E177", "S43E171", "S47E051", "S55W036", + "N25W172", "S38E178", "S43E172", "S47E052", "S55W037", + "N26W174", "S38W013", "S43E173", "S47E166", "S55W038", + "N27W176", "S39E077", "S43E174", "S47E167", "S55W039", + "N28W178", "S39E174", "S44E168", "S47E168", "S56E158", + "N28W179", "S39E175", "S44E169", "S47E169", "S56W035", + "S08W015", "S39E176", "S44E170", "S47E170", + "S16W006", "S39E177", "S44E171", "S48E167", + "S17W006", "S39E178", "S44E172", "S48E168", + "S21W029", "S40E173", "S44E173", "S48E179", + (char *)0, + + "North_America", + "N10W110", "N32W095", "N42W086", "N49W093", "N55W084", + "N15W062", "N32W096", "N42W087", "N49W094", "N55W085", + "N15W064", "N32W097", "N42W088", "N49W095", "N55W086", + "N15W079", "N32W098", "N42W089", "N49W096", "N55W087", + "N15W080", "N32W099", "N42W090", "N49W097", "N55W088", + "N15W083", "N32W100", "N42W091", "N49W098", "N55W089", + "N15W084", "N32W101", "N42W092", "N49W099", "N55W090", + "N15W085", "N32W102", "N42W093", "N49W100", "N55W091", + "N15W086", "N32W103", "N42W094", "N49W101", "N55W092", + "N15W087", "N32W104", "N42W095", "N49W102", "N55W093", + "N15W088", "N32W105", "N42W096", "N49W103", "N55W094", + "N15W089", "N32W106", "N42W097", "N49W104", "N55W095", + "N15W090", "N32W107", "N42W098", "N49W105", "N55W096", + "N15W091", "N32W108", "N42W099", "N49W106", "N55W097", + "N15W092", "N32W109", "N42W100", "N49W107", "N55W098", + "N15W093", "N32W110", "N42W101", "N49W108", "N55W099", + "N15W094", "N32W111", "N42W102", "N49W109", "N55W100", + "N15W096", "N32W112", "N42W103", "N49W110", "N55W101", + "N15W097", "N32W113", "N42W104", "N49W111", "N55W102", + "N15W098", "N32W114", "N42W105", "N49W112", "N55W103", + "N16W062", "N32W115", "N42W106", "N49W113", "N55W104", + "N16W063", "N32W116", "N42W107", "N49W114", "N55W105", + "N16W086", "N32W117", "N42W108", "N49W115", "N55W106", + "N16W087", "N32W118", "N42W109", "N49W116", "N55W107", + "N16W088", "N32W119", "N42W110", "N49W117", "N55W108", + "N16W089", "N33W078", "N42W111", "N49W118", "N55W109", + "N16W090", "N33W079", "N42W112", "N49W119", "N55W110", + "N16W091", "N33W080", "N42W113", "N49W120", "N55W111", + "N16W092", "N33W081", "N42W114", "N49W121", "N55W112", + "N16W093", "N33W082", "N42W115", "N49W122", "N55W113", + "N16W094", "N33W083", "N42W116", "N49W123", "N55W114", + "N16W095", "N33W084", "N42W117", "N49W124", "N55W115", + "N16W096", "N33W085", "N42W118", "N49W125", "N55W116", + "N16W097", "N33W086", "N42W119", "N49W126", "N55W117", + "N16W098", "N33W087", "N42W120", "N49W127", "N55W118", + "N16W099", "N33W088", "N42W121", "N49W128", "N55W119", + "N16W100", "N33W089", "N42W122", "N50W056", "N55W120", + "N16W101", "N33W090", "N42W123", "N50W057", "N55W121", + "N17W062", "N33W091", "N42W124", "N50W058", "N55W122", + "N17W063", "N33W092", "N42W125", "N50W059", "N55W123", + "N17W064", "N33W093", "N43W060", "N50W060", "N55W124", + "N17W065", "N33W094", "N43W061", "N50W061", "N55W125", + "N17W066", "N33W095", "N43W065", "N50W062", "N55W126", + "N17W067", "N33W096", "N43W066", "N50W063", "N55W127", + "N17W068", "N33W097", "N43W067", "N50W064", "N55W128", + "N17W072", "N33W098", "N43W069", "N50W065", "N55W129", + "N17W076", "N33W099", "N43W070", "N50W066", "N55W130", + "N17W077", "N33W100", "N43W071", "N50W067", "N55W131", + "N17W078", "N33W101", "N43W072", "N50W068", "N55W132", + "N17W084", "N33W102", "N43W073", "N50W069", "N55W133", + "N17W088", "N33W103", "N43W074", "N50W070", "N55W134", + "N17W089", "N33W104", "N43W075", "N50W071", "N55W135", + "N17W090", "N33W105", "N43W076", "N50W072", "N55W156", + "N17W091", "N33W106", "N43W077", "N50W073", "N55W157", + "N17W092", "N33W107", "N43W078", "N50W074", "N55W159", + "N17W093", "N33W108", "N43W079", "N50W075", "N55W160", + "N17W094", "N33W109", "N43W080", "N50W076", "N55W161", + "N17W095", "N33W110", "N43W081", "N50W077", "N55W162", + "N17W096", "N33W111", "N43W082", "N50W078", "N55W163", + "N17W097", "N33W112", "N43W083", "N50W079", "N55W164", + "N17W098", "N33W113", "N43W084", "N50W080", "N56W061", + "N17W099", "N33W114", "N43W085", "N50W081", "N56W062", + "N17W100", "N33W115", "N43W086", "N50W082", "N56W063", + "N17W101", "N33W116", "N43W087", "N50W083", "N56W064", + "N17W102", "N33W117", "N43W088", "N50W084", "N56W065", + "N17W103", "N33W118", "N43W089", "N50W085", "N56W066", + "N18W063", "N33W119", "N43W090", "N50W086", "N56W067", + "N18W064", "N33W120", "N43W091", "N50W087", "N56W068", + "N18W065", "N33W121", "N43W092", "N50W088", "N56W069", + "N18W066", "N34W077", "N43W093", "N50W089", "N56W070", + "N18W067", "N34W078", "N43W094", "N50W090", "N56W071", + "N18W068", "N34W079", "N43W095", "N50W091", "N56W072", + "N18W069", "N34W080", "N43W096", "N50W092", "N56W073", + "N18W070", "N34W081", "N43W097", "N50W093", "N56W074", + "N18W071", "N34W082", "N43W098", "N50W094", "N56W075", + "N18W072", "N34W083", "N43W099", "N50W095", "N56W076", + "N18W073", "N34W084", "N43W100", "N50W096", "N56W077", + "N18W074", "N34W085", "N43W101", "N50W097", "N56W078", + "N18W075", "N34W086", "N43W102", "N50W098", "N56W079", + "N18W076", "N34W087", "N43W103", "N50W099", "N56W080", + "N18W077", "N34W088", "N43W104", "N50W100", "N56W081", + "N18W078", "N34W089", "N43W105", "N50W101", "N56W088", + "N18W079", "N34W090", "N43W106", "N50W102", "N56W089", + "N18W088", "N34W091", "N43W107", "N50W103", "N56W090", + "N18W089", "N34W092", "N43W108", "N50W104", "N56W091", + "N18W090", "N34W093", "N43W109", "N50W105", "N56W092", + "N18W091", "N34W094", "N43W110", "N50W106", "N56W093", + "N18W092", "N34W095", "N43W111", "N50W107", "N56W094", + "N18W093", "N34W096", "N43W112", "N50W108", "N56W095", + "N18W094", "N34W097", "N43W113", "N50W109", "N56W096", + "N18W095", "N34W098", "N43W114", "N50W110", "N56W097", + "N18W096", "N34W099", "N43W115", "N50W111", "N56W098", + "N18W097", "N34W100", "N43W116", "N50W112", "N56W099", + "N18W098", "N34W101", "N43W117", "N50W113", "N56W100", + "N18W099", "N34W102", "N43W118", "N50W114", "N56W101", + "N18W100", "N34W103", "N43W119", "N50W115", "N56W102", + "N18W101", "N34W104", "N43W120", "N50W116", "N56W103", + "N18W102", "N34W105", "N43W121", "N50W117", "N56W104", + "N18W103", "N34W106", "N43W122", "N50W118", "N56W105", + "N18W104", "N34W107", "N43W123", "N50W119", "N56W106", + "N18W105", "N34W108", "N43W124", "N50W120", "N56W107", + "N18W111", "N34W109", "N43W125", "N50W121", "N56W108", + "N18W112", "N34W110", "N44W060", "N50W122", "N56W109", + "N18W115", "N34W111", "N44W062", "N50W123", "N56W110", + "N19W069", "N34W112", "N44W063", "N50W124", "N56W111", + "N19W070", "N34W113", "N44W064", "N50W125", "N56W112", + "N19W071", "N34W114", "N44W065", "N50W126", "N56W113", + "N19W072", "N34W115", "N44W066", "N50W127", "N56W114", + "N19W073", "N34W116", "N44W067", "N50W128", "N56W115", + "N19W074", "N34W117", "N44W068", "N50W129", "N56W116", + "N19W075", "N34W118", "N44W069", "N50W130", "N56W117", + "N19W076", "N34W119", "N44W070", "N51E177", "N56W118", + "N19W077", "N34W120", "N44W071", "N51E178", "N56W119", + "N19W078", "N34W121", "N44W072", "N51E179", "N56W120", + "N19W080", "N35W076", "N44W073", "N51W056", "N56W121", + "N19W081", "N35W077", "N44W074", "N51W057", "N56W122", + "N19W082", "N35W078", "N44W075", "N51W058", "N56W123", + "N19W088", "N35W079", "N44W076", "N51W059", "N56W124", + "N19W089", "N35W080", "N44W077", "N51W060", "N56W125", + "N19W090", "N35W081", "N44W078", "N51W061", "N56W126", + "N19W091", "N35W082", "N44W079", "N51W062", "N56W127", + "N19W092", "N35W083", "N44W080", "N51W063", "N56W128", + "N19W096", "N35W084", "N44W081", "N51W064", "N56W129", + "N19W097", "N35W085", "N44W082", "N51W065", "N56W130", + "N19W098", "N35W086", "N44W083", "N51W066", "N56W131", + "N19W099", "N35W087", "N44W084", "N51W067", "N56W132", + "N19W100", "N35W088", "N44W085", "N51W068", "N56W133", + "N19W101", "N35W089", "N44W086", "N51W069", "N56W134", + "N19W102", "N35W090", "N44W087", "N51W070", "N56W135", + "N19W103", "N35W091", "N44W088", "N51W071", "N56W136", + "N19W104", "N35W092", "N44W089", "N51W072", "N56W154", + "N19W105", "N35W093", "N44W090", "N51W073", "N56W155", + "N19W106", "N35W094", "N44W091", "N51W074", "N56W157", + "N19W111", "N35W095", "N44W092", "N51W075", "N56W158", + "N20W073", "N35W096", "N44W093", "N51W076", "N56W159", + "N20W074", "N35W097", "N44W094", "N51W077", "N56W160", + "N20W075", "N35W098", "N44W095", "N51W078", "N56W161", + "N20W076", "N35W099", "N44W096", "N51W079", "N56W162", + "N20W077", "N35W100", "N44W097", "N51W080", "N56W170", + "N20W078", "N35W101", "N44W098", "N51W081", "N57W062", + "N20W079", "N35W102", "N44W099", "N51W082", "N57W063", + "N20W080", "N35W103", "N44W100", "N51W083", "N57W064", + "N20W087", "N35W104", "N44W101", "N51W084", "N57W065", + "N20W088", "N35W105", "N44W102", "N51W085", "N57W066", + "N20W089", "N35W106", "N44W103", "N51W086", "N57W067", + "N20W090", "N35W107", "N44W104", "N51W087", "N57W068", + "N20W091", "N35W108", "N44W105", "N51W088", "N57W069", + "N20W092", "N35W109", "N44W106", "N51W089", "N57W070", + "N20W093", "N35W110", "N44W107", "N51W090", "N57W071", + "N20W097", "N35W111", "N44W108", "N51W091", "N57W072", + "N20W098", "N35W112", "N44W109", "N51W092", "N57W073", + "N20W099", "N35W113", "N44W110", "N51W093", "N57W074", + "N20W100", "N35W114", "N44W111", "N51W094", "N57W075", + "N20W101", "N35W115", "N44W112", "N51W095", "N57W076", + "N20W102", "N35W116", "N44W113", "N51W096", "N57W077", + "N20W103", "N35W117", "N44W114", "N51W097", "N57W078", + "N20W104", "N35W118", "N44W115", "N51W098", "N57W079", + "N20W105", "N35W119", "N44W116", "N51W099", "N57W080", + "N20W106", "N35W120", "N44W117", "N51W100", "N57W090", + "N21W072", "N35W121", "N44W118", "N51W101", "N57W091", + "N21W073", "N35W122", "N44W119", "N51W102", "N57W092", + "N21W074", "N36W076", "N44W120", "N51W103", "N57W093", + "N21W076", "N36W077", "N44W121", "N51W104", "N57W094", + "N21W077", "N36W078", "N44W122", "N51W105", "N57W095", + "N21W078", "N36W079", "N44W123", "N51W106", "N57W096", + "N21W079", "N36W080", "N44W124", "N51W107", "N57W097", + "N21W080", "N36W081", "N44W125", "N51W108", "N57W098", + "N21W081", "N36W082", "N45W060", "N51W109", "N57W099", + "N21W082", "N36W083", "N45W061", "N51W110", "N57W100", + "N21W083", "N36W084", "N45W062", "N51W111", "N57W101", + "N21W084", "N36W085", "N45W063", "N51W112", "N57W102", + "N21W085", "N36W086", "N45W064", "N51W113", "N57W103", + "N21W087", "N36W087", "N45W065", "N51W114", "N57W104", + "N21W088", "N36W088", "N45W066", "N51W115", "N57W105", + "N21W089", "N36W089", "N45W067", "N51W116", "N57W106", + "N21W090", "N36W090", "N45W068", "N51W117", "N57W107", + "N21W091", "N36W091", "N45W069", "N51W118", "N57W108", + "N21W098", "N36W092", "N45W070", "N51W119", "N57W109", + "N21W099", "N36W093", "N45W071", "N51W120", "N57W110", + "N21W100", "N36W094", "N45W072", "N51W121", "N57W111", + "N21W101", "N36W095", "N45W073", "N51W122", "N57W112", + "N21W102", "N36W096", "N45W074", "N51W123", "N57W113", + "N21W103", "N36W097", "N45W075", "N51W124", "N57W114", + "N21W104", "N36W098", "N45W076", "N51W125", "N57W115", + "N21W105", "N36W099", "N45W077", "N51W126", "N57W116", + "N21W106", "N36W100", "N45W078", "N51W127", "N57W117", + "N21W107", "N36W101", "N45W079", "N51W128", "N57W118", + "N22W073", "N36W102", "N45W080", "N51W129", "N57W119", + "N22W074", "N36W103", "N45W081", "N51W131", "N57W120", + "N22W075", "N36W104", "N45W082", "N51W132", "N57W121", + "N22W076", "N36W105", "N45W083", "N51W176", "N57W122", + "N22W078", "N36W106", "N45W084", "N51W177", "N57W123", + "N22W079", "N36W107", "N45W085", "N51W178", "N57W124", + "N22W080", "N36W108", "N45W086", "N51W179", "N57W125", + "N22W081", "N36W109", "N45W087", "N51W180", "N57W126", + "N22W082", "N36W110", "N45W088", "N52E172", "N57W127", + "N22W083", "N36W111", "N45W089", "N52E173", "N57W128", + "N22W084", "N36W112", "N45W090", "N52E174", "N57W129", + "N22W085", "N36W113", "N45W091", "N52E175", "N57W130", + "N22W090", "N36W114", "N45W092", "N52E177", "N57W131", + "N22W092", "N36W115", "N45W093", "N52E178", "N57W132", + "N22W098", "N36W116", "N45W094", "N52E179", "N57W133", + "N22W099", "N36W117", "N45W095", "N52W056", "N57W134", + "N22W100", "N36W118", "N45W096", "N52W057", "N57W135", + "N22W101", "N36W119", "N45W097", "N52W058", "N57W136", + "N22W102", "N36W120", "N45W098", "N52W059", "N57W137", + "N22W103", "N36W121", "N45W099", "N52W060", "N57W153", + "N22W104", "N36W122", "N45W100", "N52W061", "N57W154", + "N22W105", "N36W123", "N45W101", "N52W062", "N57W155", + "N22W106", "N37W076", "N45W102", "N52W063", "N57W156", + "N22W107", "N37W077", "N45W103", "N52W064", "N57W157", + "N22W110", "N37W078", "N45W104", "N52W065", "N57W158", + "N22W111", "N37W079", "N45W105", "N52W066", "N57W159", + "N23W074", "N37W080", "N45W106", "N52W067", "N57W170", + "N23W075", "N37W081", "N45W107", "N52W068", "N57W171", + "N23W076", "N37W082", "N45W108", "N52W069", "N58W063", + "N23W077", "N37W083", "N45W109", "N52W070", "N58W064", + "N23W078", "N37W084", "N45W110", "N52W071", "N58W065", + "N23W080", "N37W085", "N45W111", "N52W072", "N58W066", + "N23W081", "N37W086", "N45W112", "N52W073", "N58W067", + "N23W082", "N37W087", "N45W113", "N52W074", "N58W068", + "N23W083", "N37W088", "N45W114", "N52W075", "N58W069", + "N23W084", "N37W089", "N45W115", "N52W076", "N58W070", + "N23W098", "N37W090", "N45W116", "N52W077", "N58W071", + "N23W099", "N37W091", "N45W117", "N52W078", "N58W072", + "N23W100", "N37W092", "N45W118", "N52W079", "N58W073", + "N23W101", "N37W093", "N45W119", "N52W080", "N58W074", + "N23W102", "N37W094", "N45W120", "N52W081", "N58W075", + "N23W103", "N37W095", "N45W121", "N52W082", "N58W076", + "N23W104", "N37W096", "N45W122", "N52W083", "N58W077", + "N23W105", "N37W097", "N45W123", "N52W084", "N58W078", + "N23W106", "N37W098", "N45W124", "N52W085", "N58W079", + "N23W107", "N37W099", "N45W125", "N52W086", "N58W080", + "N23W108", "N37W100", "N46W053", "N52W087", "N58W081", + "N23W110", "N37W101", "N46W054", "N52W088", "N58W093", + "N23W111", "N37W102", "N46W055", "N52W089", "N58W094", + "N24W075", "N37W103", "N46W056", "N52W090", "N58W095", + "N24W076", "N37W104", "N46W057", "N52W091", "N58W096", + "N24W077", "N37W105", "N46W060", "N52W092", "N58W097", + "N24W078", "N37W106", "N46W061", "N52W093", "N58W098", + "N24W079", "N37W107", "N46W062", "N52W094", "N58W099", + "N24W080", "N37W108", "N46W063", "N52W095", "N58W100", + "N24W081", "N37W109", "N46W064", "N52W096", "N58W101", + "N24W082", "N37W110", "N46W065", "N52W097", "N58W102", + "N24W083", "N37W111", "N46W066", "N52W098", "N58W103", + "N24W098", "N37W112", "N46W067", "N52W099", "N58W104", + "N24W099", "N37W113", "N46W068", "N52W100", "N58W105", + "N24W100", "N37W114", "N46W069", "N52W101", "N58W106", + "N24W101", "N37W115", "N46W070", "N52W102", "N58W107", + "N24W102", "N37W116", "N46W071", "N52W103", "N58W108", + "N24W103", "N37W117", "N46W072", "N52W104", "N58W109", + "N24W104", "N37W118", "N46W073", "N52W105", "N58W110", + "N24W105", "N37W119", "N46W074", "N52W106", "N58W111", + "N24W106", "N37W120", "N46W075", "N52W107", "N58W112", + "N24W107", "N37W121", "N46W076", "N52W108", "N58W113", + "N24W108", "N37W122", "N46W077", "N52W109", "N58W114", + "N24W109", "N37W123", "N46W078", "N52W110", "N58W115", + "N24W110", "N37W124", "N46W079", "N52W111", "N58W116", + "N24W111", "N38W075", "N46W080", "N52W112", "N58W117", + "N24W112", "N38W076", "N46W081", "N52W113", "N58W118", + "N24W113", "N38W077", "N46W082", "N52W114", "N58W119", + "N24W116", "N38W078", "N46W083", "N52W115", "N58W120", + "N25W077", "N38W079", "N46W084", "N52W116", "N58W121", + "N25W078", "N38W080", "N46W085", "N52W117", "N58W122", + "N25W079", "N38W081", "N46W086", "N52W118", "N58W123", + "N25W080", "N38W082", "N46W087", "N52W119", "N58W124", + "N25W081", "N38W083", "N46W088", "N52W120", "N58W125", + "N25W082", "N38W084", "N46W089", "N52W121", "N58W126", + "N25W098", "N38W085", "N46W090", "N52W122", "N58W127", + "N25W099", "N38W086", "N46W091", "N52W123", "N58W128", + "N25W100", "N38W087", "N46W092", "N52W124", "N58W129", + "N25W101", "N38W088", "N46W093", "N52W125", "N58W130", + "N25W102", "N38W089", "N46W094", "N52W126", "N58W131", + "N25W103", "N38W090", "N46W095", "N52W127", "N58W132", + "N25W104", "N38W091", "N46W096", "N52W128", "N58W133", + "N25W105", "N38W092", "N46W097", "N52W129", "N58W134", + "N25W106", "N38W093", "N46W098", "N52W130", "N58W135", + "N25W107", "N38W094", "N46W099", "N52W131", "N58W136", + "N25W108", "N38W095", "N46W100", "N52W132", "N58W137", + "N25W109", "N38W096", "N46W101", "N52W133", "N58W138", + "N25W110", "N38W097", "N46W102", "N52W169", "N58W139", + "N25W111", "N38W098", "N46W103", "N52W170", "N58W152", + "N25W112", "N38W099", "N46W104", "N52W171", "N58W153", + "N25W113", "N38W100", "N46W105", "N52W172", "N58W154", + "N26W077", "N38W101", "N46W106", "N52W173", "N58W155", + "N26W078", "N38W102", "N46W107", "N52W174", "N58W156", + "N26W079", "N38W103", "N46W108", "N52W175", "N58W157", + "N26W080", "N38W104", "N46W109", "N52W176", "N58W158", + "N26W081", "N38W105", "N46W110", "N52W177", "N58W159", + "N26W082", "N38W106", "N46W111", "N53E172", "N58W160", + "N26W083", "N38W107", "N46W112", "N53W056", "N58W161", + "N26W098", "N38W108", "N46W113", "N53W057", "N58W162", + "N26W099", "N38W109", "N46W114", "N53W058", "N58W163", + "N26W100", "N38W110", "N46W115", "N53W059", "N59W044", + "N26W101", "N38W111", "N46W116", "N53W060", "N59W045", + "N26W102", "N38W112", "N46W117", "N53W061", "N59W046", + "N26W103", "N38W113", "N46W118", "N53W062", "N59W064", + "N26W104", "N38W114", "N46W119", "N53W063", "N59W065", + "N26W105", "N38W115", "N46W120", "N53W064", "N59W066", + "N26W106", "N38W116", "N46W121", "N53W065", "N59W067", + "N26W107", "N38W117", "N46W122", "N53W066", "N59W069", + "N26W108", "N38W118", "N46W123", "N53W067", "N59W070", + "N26W109", "N38W119", "N46W124", "N53W068", "N59W071", + "N26W110", "N38W120", "N46W125", "N53W069", "N59W072", + "N26W112", "N38W121", "N47W053", "N53W070", "N59W073", + "N26W113", "N38W122", "N47W054", "N53W071", "N59W074", + "N26W114", "N38W123", "N47W055", "N53W072", "N59W075", + "N26W115", "N38W124", "N47W056", "N53W073", "N59W076", + "N27W078", "N39W075", "N47W057", "N53W074", "N59W077", + "N27W079", "N39W076", "N47W058", "N53W075", "N59W078", + "N27W081", "N39W077", "N47W059", "N53W076", "N59W079", + "N27W082", "N39W078", "N47W060", "N53W077", "N59W080", + "N27W083", "N39W079", "N47W061", "N53W078", "N59W081", + "N27W097", "N39W080", "N47W062", "N53W079", "N59W095", + "N27W098", "N39W081", "N47W063", "N53W080", "N59W096", + "N27W099", "N39W082", "N47W064", "N53W081", "N59W097", + "N27W100", "N39W083", "N47W065", "N53W082", "N59W098", + "N27W101", "N39W084", "N47W066", "N53W083", "N59W099", + "N27W102", "N39W085", "N47W067", "N53W084", "N59W100", + "N27W103", "N39W086", "N47W068", "N53W085", "N59W101", + "N27W104", "N39W087", "N47W069", "N53W086", "N59W102", + "N27W105", "N39W088", "N47W070", "N53W087", "N59W103", + "N27W106", "N39W089", "N47W071", "N53W088", "N59W104", + "N27W107", "N39W090", "N47W072", "N53W089", "N59W105", + "N27W108", "N39W091", "N47W073", "N53W090", "N59W106", + "N27W109", "N39W092", "N47W074", "N53W091", "N59W107", + "N27W110", "N39W093", "N47W075", "N53W092", "N59W108", + "N27W111", "N39W094", "N47W076", "N53W093", "N59W109", + "N27W112", "N39W095", "N47W077", "N53W094", "N59W110", + "N27W113", "N39W096", "N47W078", "N53W095", "N59W111", + "N27W114", "N39W097", "N47W079", "N53W096", "N59W112", + "N27W115", "N39W098", "N47W080", "N53W097", "N59W113", + "N27W116", "N39W099", "N47W081", "N53W098", "N59W114", + "N28W081", "N39W100", "N47W082", "N53W099", "N59W115", + "N28W082", "N39W101", "N47W083", "N53W100", "N59W116", + "N28W083", "N39W102", "N47W084", "N53W101", "N59W117", + "N28W090", "N39W103", "N47W085", "N53W102", "N59W118", + "N28W096", "N39W104", "N47W086", "N53W103", "N59W119", + "N28W097", "N39W105", "N47W088", "N53W104", "N59W120", + "N28W098", "N39W106", "N47W089", "N53W105", "N59W121", + "N28W099", "N39W107", "N47W090", "N53W106", "N59W122", + "N28W100", "N39W108", "N47W091", "N53W107", "N59W123", + "N28W101", "N39W109", "N47W092", "N53W108", "N59W124", + "N28W102", "N39W110", "N47W093", "N53W109", "N59W125", + "N28W103", "N39W111", "N47W094", "N53W110", "N59W126", + "N28W104", "N39W112", "N47W095", "N53W111", "N59W127", + "N28W105", "N39W113", "N47W096", "N53W112", "N59W128", + "N28W106", "N39W114", "N47W097", "N53W113", "N59W129", + "N28W107", "N39W115", "N47W098", "N53W114", "N59W130", + "N28W108", "N39W116", "N47W099", "N53W115", "N59W131", + "N28W109", "N39W117", "N47W100", "N53W116", "N59W132", + "N28W110", "N39W118", "N47W101", "N53W117", "N59W133", + "N28W111", "N39W119", "N47W102", "N53W118", "N59W134", + "N28W112", "N39W120", "N47W103", "N53W119", "N59W135", + "N28W113", "N39W121", "N47W104", "N53W120", "N59W136", + "N28W114", "N39W122", "N47W105", "N53W121", "N59W137", + "N28W115", "N39W123", "N47W106", "N53W122", "N59W138", + "N28W116", "N39W124", "N47W107", "N53W123", "N59W139", + "N28W119", "N39W125", "N47W108", "N53W124", "N59W140", + "N29W081", "N40W073", "N47W109", "N53W125", "N59W141", + "N29W082", "N40W074", "N47W110", "N53W126", "N59W142", + "N29W083", "N40W075", "N47W111", "N53W127", "N59W144", + "N29W084", "N40W076", "N47W112", "N53W128", "N59W145", + "N29W085", "N40W077", "N47W113", "N53W129", "N59W147", + "N29W086", "N40W078", "N47W114", "N53W130", "N59W148", + "N29W089", "N40W079", "N47W115", "N53W131", "N59W149", + "N29W090", "N40W080", "N47W116", "N53W132", "N59W150", + "N29W091", "N40W081", "N47W117", "N53W133", "N59W151", + "N29W092", "N40W082", "N47W118", "N53W134", "N59W152", + "N29W093", "N40W083", "N47W119", "N53W167", "N59W153", + "N29W094", "N40W084", "N47W120", "N53W168", "N59W154", + "N29W095", "N40W085", "N47W121", "N53W169", "N59W155", + "N29W096", "N40W086", "N47W122", "N53W170", "N59W156", + "N29W097", "N40W087", "N47W123", "N54W057", "N59W157", + "N29W098", "N40W088", "N47W124", "N54W058", "N59W158", + "N29W099", "N40W089", "N47W125", "N54W059", "N59W159", + "N29W100", "N40W090", "N48W053", "N54W060", "N59W160", + "N29W101", "N40W091", "N48W054", "N54W061", "N59W161", + "N29W102", "N40W092", "N48W055", "N54W062", "N59W162", + "N29W103", "N40W093", "N48W056", "N54W063", "N59W163", + "N29W104", "N40W094", "N48W057", "N54W064", "N59W164", + "N29W105", "N40W095", "N48W058", "N54W065", "N59W165", + "N29W106", "N40W096", "N48W059", "N54W066", "N60W043", + "N29W107", "N40W097", "N48W060", "N54W067", "N60W044", + "N29W108", "N40W098", "N48W065", "N54W068", "N60W045", + "N29W109", "N40W099", "N48W066", "N54W069", "N60W046", + "N29W110", "N40W100", "N48W067", "N54W070", "N60W047", + "N29W111", "N40W101", "N48W068", "N54W071", "N60W048", + "N29W112", "N40W102", "N48W069", "N54W072", "N60W049", + "N29W113", "N40W103", "N48W070", "N54W073", "N60W064", + "N29W114", "N40W104", "N48W071", "N54W074", "N60W065", + "N29W115", "N40W105", "N48W072", "N54W075", "N60W066", + "N29W116", "N40W106", "N48W073", "N54W076", "N60W068", + "N29W119", "N40W107", "N48W074", "N54W077", "N60W069", + "N30W082", "N40W108", "N48W075", "N54W078", "N60W070", + "N30W083", "N40W109", "N48W076", "N54W079", "N60W071", + "N30W084", "N40W110", "N48W077", "N54W080", "N60W072", + "N30W085", "N40W111", "N48W078", "N54W081", "N60W073", + "N30W086", "N40W112", "N48W079", "N54W082", "N60W074", + "N30W087", "N40W113", "N48W080", "N54W083", "N60W075", + "N30W088", "N40W114", "N48W081", "N54W084", "N60W076", + "N30W089", "N40W115", "N48W082", "N54W085", "N60W077", + "N30W090", "N40W116", "N48W083", "N54W086", "N60W078", + "N30W091", "N40W117", "N48W084", "N54W087", "N60W079", + "N30W092", "N40W118", "N48W085", "N54W088", "N60W095", + "N30W093", "N40W119", "N48W086", "N54W089", "N60W096", + "N30W094", "N40W120", "N48W087", "N54W090", "N60W097", + "N30W095", "N40W121", "N48W088", "N54W091", "N60W098", + "N30W096", "N40W122", "N48W089", "N54W092", "N60W099", + "N30W097", "N40W123", "N48W090", "N54W093", "N60W100", + "N30W098", "N40W124", "N48W091", "N54W094", "N60W101", + "N30W099", "N40W125", "N48W092", "N54W095", "N60W102", + "N30W100", "N41W070", "N48W093", "N54W096", "N60W103", + "N30W101", "N41W071", "N48W094", "N54W097", "N60W104", + "N30W102", "N41W072", "N48W095", "N54W098", "N60W105", + "N30W103", "N41W073", "N48W096", "N54W099", "N60W106", + "N30W104", "N41W074", "N48W097", "N54W100", "N60W107", + "N30W105", "N41W075", "N48W098", "N54W101", "N60W108", + "N30W106", "N41W076", "N48W099", "N54W102", "N60W109", + "N30W107", "N41W077", "N48W100", "N54W103", "N60W110", + "N30W108", "N41W078", "N48W101", "N54W104", "N60W111", + "N30W109", "N41W079", "N48W102", "N54W105", "N60W112", + "N30W110", "N41W080", "N48W103", "N54W106", "N60W113", + "N30W111", "N41W081", "N48W104", "N54W107", "N60W114", + "N30W112", "N41W082", "N48W105", "N54W108", "N60W115", + "N30W113", "N41W083", "N48W106", "N54W109", "N60W116", + "N30W114", "N41W084", "N48W107", "N54W110", "N60W117", + "N30W115", "N41W085", "N48W108", "N54W111", "N60W118", + "N30W116", "N41W086", "N48W109", "N54W112", "N60W119", + "N30W117", "N41W087", "N48W110", "N54W113", "N60W120", + "N31W081", "N41W088", "N48W111", "N54W114", "N60W121", + "N31W082", "N41W089", "N48W112", "N54W115", "N60W122", + "N31W083", "N41W090", "N48W113", "N54W116", "N60W123", + "N31W084", "N41W091", "N48W114", "N54W117", "N60W124", + "N31W085", "N41W092", "N48W115", "N54W118", "N60W125", + "N31W086", "N41W093", "N48W116", "N54W119", "N60W126", + "N31W087", "N41W094", "N48W117", "N54W120", "N60W127", + "N31W088", "N41W095", "N48W118", "N54W121", "N60W128", + "N31W089", "N41W096", "N48W119", "N54W122", "N60W129", + "N31W090", "N41W097", "N48W120", "N54W123", "N60W130", + "N31W091", "N41W098", "N48W121", "N54W124", "N60W131", + "N31W092", "N41W099", "N48W122", "N54W125", "N60W132", + "N31W093", "N41W100", "N48W123", "N54W126", "N60W133", + "N31W094", "N41W101", "N48W124", "N54W127", "N60W134", + "N31W095", "N41W102", "N48W125", "N54W128", "N60W135", + "N31W096", "N41W103", "N48W126", "N54W129", "N60W136", + "N31W097", "N41W104", "N49W054", "N54W130", "N60W137", + "N31W098", "N41W105", "N49W055", "N54W131", "N60W138", + "N31W099", "N41W106", "N49W056", "N54W132", "N60W139", + "N31W100", "N41W107", "N49W057", "N54W133", "N60W140", + "N31W101", "N41W108", "N49W058", "N54W134", "N60W141", + "N31W102", "N41W109", "N49W059", "N54W160", "N60W142", + "N31W103", "N41W110", "N49W062", "N54W161", "N60W143", + "N31W104", "N41W111", "N49W063", "N54W162", "N60W144", + "N31W105", "N41W112", "N49W064", "N54W163", "N60W145", + "N31W106", "N41W113", "N49W065", "N54W164", "N60W146", + "N31W107", "N41W114", "N49W066", "N54W165", "N60W147", + "N31W108", "N41W115", "N49W067", "N54W166", "N60W148", + "N31W109", "N41W116", "N49W068", "N54W167", "N60W149", + "N31W110", "N41W117", "N49W069", "N55W059", "N60W150", + "N31W111", "N41W118", "N49W070", "N55W060", "N60W151", + "N31W112", "N41W119", "N49W071", "N55W061", "N60W152", + "N31W113", "N41W120", "N49W072", "N55W062", "N60W153", + "N31W114", "N41W121", "N49W073", "N55W063", "N60W154", + "N31W115", "N41W122", "N49W074", "N55W064", "N60W155", + "N31W116", "N41W123", "N49W075", "N55W065", "N60W156", + "N31W117", "N41W124", "N49W076", "N55W066", "N60W157", + "N32W065", "N41W125", "N49W077", "N55W067", "N60W158", + "N32W080", "N42W071", "N49W078", "N55W068", "N60W159", + "N32W081", "N42W072", "N49W079", "N55W069", "N60W160", + "N32W082", "N42W073", "N49W080", "N55W070", "N60W161", + "N32W083", "N42W074", "N49W081", "N55W071", "N60W162", + "N32W084", "N42W075", "N49W082", "N55W072", "N60W163", + "N32W085", "N42W076", "N49W083", "N55W073", "N60W164", + "N32W086", "N42W077", "N49W084", "N55W074", "N60W165", + "N32W087", "N42W078", "N49W085", "N55W075", "N60W166", + "N32W088", "N42W079", "N49W086", "N55W076", "N60W167", + "N32W089", "N42W080", "N49W087", "N55W077", "N60W168", + "N32W090", "N42W081", "N49W088", "N55W078", "N60W173", + "N32W091", "N42W082", "N49W089", "N55W079", "N60W174", + "N32W092", "N42W083", "N49W090", "N55W080", + "N32W093", "N42W084", "N49W091", "N55W081", + "N32W094", "N42W085", "N49W092", "N55W083", + (char *)0, + + "South_America", + "N00W050", "S01W052", "S09W048", "S18W046", "S31W052", + "N00W051", "S01W053", "S09W049", "S18W047", "S31W053", + "N00W052", "S01W054", "S09W050", "S18W048", "S31W054", + "N00W053", "S01W055", "S09W051", "S18W049", "S31W055", + "N00W054", "S01W056", "S09W052", "S18W050", "S31W056", + "N00W055", "S01W057", "S09W053", "S18W051", "S31W057", + "N00W056", "S01W058", "S09W054", "S18W052", "S31W058", + "N00W057", "S01W059", "S09W055", "S18W053", "S31W059", + "N00W058", "S01W060", "S09W056", "S18W054", "S31W060", + "N00W059", "S01W061", "S09W057", "S18W055", "S31W061", + "N00W060", "S01W062", "S09W058", "S18W056", "S31W062", + "N00W061", "S01W063", "S09W059", "S18W057", "S31W063", + "N00W062", "S01W064", "S09W060", "S18W058", "S31W064", + "N00W063", "S01W065", "S09W061", "S18W059", "S31W065", + "N00W064", "S01W066", "S09W062", "S18W060", "S31W066", + "N00W065", "S01W067", "S09W063", "S18W061", "S31W067", + "N00W066", "S01W068", "S09W064", "S18W062", "S31W068", + "N00W067", "S01W069", "S09W065", "S18W063", "S31W069", + "N00W068", "S01W070", "S09W066", "S18W064", "S31W070", + "N00W069", "S01W071", "S09W067", "S18W065", "S31W071", + "N00W070", "S01W072", "S09W068", "S18W066", "S31W072", + "N00W071", "S01W073", "S09W069", "S18W067", "S32W051", + "N00W072", "S01W074", "S09W070", "S18W068", "S32W052", + "N00W073", "S01W075", "S09W071", "S18W069", "S32W053", + "N00W074", "S01W076", "S09W072", "S18W070", "S32W054", + "N00W075", "S01W077", "S09W073", "S18W071", "S32W055", + "N00W076", "S01W078", "S09W074", "S18W072", "S32W056", + "N00W077", "S01W079", "S09W075", "S18W073", "S32W057", + "N00W078", "S01W080", "S09W076", "S19W040", "S32W058", + "N00W079", "S01W081", "S09W077", "S19W041", "S32W059", + "N00W080", "S01W090", "S09W078", "S19W042", "S32W060", + "N00W081", "S01W091", "S09W079", "S19W043", "S32W061", + "N00W090", "S01W092", "S09W080", "S19W044", "S32W062", + "N00W091", "S02W045", "S10W036", "S19W045", "S32W063", + "N00W092", "S02W046", "S10W037", "S19W046", "S32W064", + "N01W050", "S02W047", "S10W038", "S19W047", "S32W065", + "N01W051", "S02W048", "S10W039", "S19W048", "S32W066", + "N01W052", "S02W049", "S10W040", "S19W049", "S32W067", + "N01W053", "S02W050", "S10W041", "S19W050", "S32W068", + "N01W054", "S02W051", "S10W042", "S19W051", "S32W069", + "N01W055", "S02W052", "S10W043", "S19W052", "S32W070", + "N01W056", "S02W053", "S10W044", "S19W053", "S32W071", + "N01W057", "S02W054", "S10W045", "S19W054", "S32W072", + "N01W058", "S02W055", "S10W046", "S19W055", "S33W052", + "N01W059", "S02W056", "S10W047", "S19W056", "S33W053", + "N01W060", "S02W057", "S10W048", "S19W057", "S33W054", + "N01W061", "S02W058", "S10W049", "S19W058", "S33W055", + "N01W062", "S02W059", "S10W050", "S19W059", "S33W056", + "N01W063", "S02W060", "S10W051", "S19W060", "S33W057", + "N01W064", "S02W061", "S10W052", "S19W061", "S33W058", + "N01W065", "S02W062", "S10W053", "S19W062", "S33W059", + "N01W066", "S02W063", "S10W054", "S19W063", "S33W060", + "N01W067", "S02W064", "S10W055", "S19W064", "S33W061", + "N01W068", "S02W065", "S10W056", "S19W065", "S33W062", + "N01W069", "S02W066", "S10W057", "S19W066", "S33W063", + "N01W070", "S02W067", "S10W058", "S19W067", "S33W064", + "N01W071", "S02W068", "S10W059", "S19W068", "S33W065", + "N01W072", "S02W069", "S10W060", "S19W069", "S33W066", + "N01W073", "S02W070", "S10W061", "S19W070", "S33W067", + "N01W074", "S02W071", "S10W062", "S19W071", "S33W068", + "N01W075", "S02W072", "S10W063", "S20W040", "S33W069", + "N01W076", "S02W073", "S10W064", "S20W041", "S33W070", + "N01W077", "S02W074", "S10W065", "S20W042", "S33W071", + "N01W078", "S02W075", "S10W066", "S20W043", "S33W072", + "N01W079", "S02W076", "S10W067", "S20W044", "S34W053", + "N01W080", "S02W077", "S10W068", "S20W045", "S34W054", + "N01W092", "S02W078", "S10W069", "S20W046", "S34W055", + "N02W051", "S02W079", "S10W070", "S20W047", "S34W056", + "N02W052", "S02W080", "S10W071", "S20W048", "S34W057", + "N02W053", "S02W081", "S10W072", "S20W049", "S34W058", + "N02W054", "S02W082", "S10W073", "S20W050", "S34W059", + "N02W055", "S02W090", "S10W074", "S20W051", "S34W060", + "N02W056", "S02W091", "S10W075", "S20W052", "S34W061", + "N02W057", "S02W092", "S10W076", "S20W053", "S34W062", + "N02W058", "S03W040", "S10W077", "S20W054", "S34W063", + "N02W059", "S03W041", "S10W078", "S20W055", "S34W064", + "N02W060", "S03W042", "S10W079", "S20W056", "S34W065", + "N02W061", "S03W043", "S11W037", "S20W057", "S34W066", + "N02W062", "S03W044", "S11W038", "S20W058", "S34W067", + "N02W063", "S03W045", "S11W039", "S20W059", "S34W068", + "N02W064", "S03W046", "S11W040", "S20W060", "S34W069", + "N02W065", "S03W047", "S11W041", "S20W061", "S34W070", + "N02W066", "S03W048", "S11W042", "S20W062", "S34W071", + "N02W067", "S03W049", "S11W043", "S20W063", "S34W072", + "N02W068", "S03W050", "S11W044", "S20W064", "S34W079", + "N02W069", "S03W051", "S11W045", "S20W065", "S34W081", + "N02W070", "S03W052", "S11W046", "S20W066", "S35W054", + "N02W071", "S03W053", "S11W047", "S20W067", "S35W055", + "N02W072", "S03W054", "S11W048", "S20W068", "S35W056", + "N02W073", "S03W055", "S11W049", "S20W069", "S35W057", + "N02W074", "S03W056", "S11W050", "S20W070", "S35W058", + "N02W075", "S03W057", "S11W051", "S20W071", "S35W059", + "N02W076", "S03W058", "S11W052", "S21W041", "S35W060", + "N02W077", "S03W059", "S11W053", "S21W042", "S35W061", + "N02W078", "S03W060", "S11W054", "S21W043", "S35W062", + "N02W079", "S03W061", "S11W055", "S21W044", "S35W063", + "N03W051", "S03W062", "S11W056", "S21W045", "S35W064", + "N03W052", "S03W063", "S11W057", "S21W046", "S35W065", + "N03W053", "S03W064", "S11W058", "S21W047", "S35W066", + "N03W054", "S03W065", "S11W059", "S21W048", "S35W067", + "N03W055", "S03W066", "S11W060", "S21W049", "S35W068", + "N03W056", "S03W067", "S11W061", "S21W050", "S35W069", + "N03W057", "S03W068", "S11W062", "S21W051", "S35W070", + "N03W058", "S03W069", "S11W063", "S21W052", "S35W071", + "N03W059", "S03W070", "S11W064", "S21W053", "S35W072", + "N03W060", "S03W071", "S11W065", "S21W054", "S35W073", + "N03W061", "S03W072", "S11W066", "S21W055", "S36W058", + "N03W062", "S03W073", "S11W067", "S21W056", "S36W059", + "N03W063", "S03W074", "S11W068", "S21W057", "S36W060", + "N03W064", "S03W075", "S11W069", "S21W058", "S36W061", + "N03W065", "S03W076", "S11W070", "S21W059", "S36W062", + "N03W066", "S03W077", "S11W071", "S21W060", "S36W063", + "N03W067", "S03W078", "S11W072", "S21W061", "S36W064", + "N03W068", "S03W079", "S11W073", "S21W062", "S36W065", + "N03W069", "S03W080", "S11W074", "S21W063", "S36W066", + "N03W070", "S03W081", "S11W075", "S21W064", "S36W067", + "N03W071", "S03W082", "S11W076", "S21W065", "S36W068", + "N03W072", "S04W033", "S11W077", "S21W066", "S36W069", + "N03W073", "S04W034", "S11W078", "S21W067", "S36W070", + "N03W074", "S04W039", "S11W079", "S21W068", "S36W071", + "N03W075", "S04W040", "S12W038", "S21W069", "S36W072", + "N03W076", "S04W041", "S12W039", "S21W070", "S36W073", + "N03W077", "S04W042", "S12W040", "S21W071", "S37W057", + "N03W078", "S04W043", "S12W041", "S22W041", "S37W058", + "N03W079", "S04W044", "S12W042", "S22W042", "S37W059", + "N03W082", "S04W045", "S12W043", "S22W043", "S37W060", + "N04W052", "S04W046", "S12W044", "S22W044", "S37W061", + "N04W053", "S04W047", "S12W045", "S22W045", "S37W062", + "N04W054", "S04W048", "S12W046", "S22W046", "S37W063", + "N04W055", "S04W049", "S12W047", "S22W047", "S37W064", + "N04W056", "S04W050", "S12W048", "S22W048", "S37W065", + "N04W057", "S04W051", "S12W049", "S22W049", "S37W066", + "N04W058", "S04W052", "S12W050", "S22W050", "S37W067", + "N04W059", "S04W053", "S12W051", "S22W051", "S37W068", + "N04W060", "S04W054", "S12W052", "S22W052", "S37W069", + "N04W061", "S04W055", "S12W053", "S22W053", "S37W070", + "N04W062", "S04W056", "S12W054", "S22W054", "S37W071", + "N04W063", "S04W057", "S12W055", "S22W055", "S37W072", + "N04W064", "S04W058", "S12W056", "S22W056", "S37W073", + "N04W065", "S04W059", "S12W057", "S22W057", "S37W074", + "N04W066", "S04W060", "S12W058", "S22W058", "S38W057", + "N04W067", "S04W061", "S12W059", "S22W059", "S38W058", + "N04W068", "S04W062", "S12W060", "S22W060", "S38W059", + "N04W069", "S04W063", "S12W061", "S22W061", "S38W060", + "N04W070", "S04W064", "S12W062", "S22W062", "S38W061", + "N04W071", "S04W065", "S12W063", "S22W063", "S38W062", + "N04W072", "S04W066", "S12W064", "S22W064", "S38W063", + "N04W073", "S04W067", "S12W065", "S22W065", "S38W064", + "N04W074", "S04W068", "S12W066", "S22W066", "S38W065", + "N04W075", "S04W069", "S12W067", "S22W067", "S38W066", + "N04W076", "S04W070", "S12W068", "S22W068", "S38W067", + "N04W077", "S04W071", "S12W069", "S22W069", "S38W068", + "N04W078", "S04W072", "S12W070", "S22W070", "S38W069", + "N04W082", "S04W073", "S12W071", "S22W071", "S38W070", + "N05W053", "S04W074", "S12W072", "S23W041", "S38W071", + "N05W054", "S04W075", "S12W073", "S23W042", "S38W072", + "N05W055", "S04W076", "S12W074", "S23W043", "S38W073", + "N05W056", "S04W077", "S12W075", "S23W044", "S38W074", + "N05W057", "S04W078", "S12W076", "S23W045", "S39W058", + "N05W058", "S04W079", "S12W077", "S23W046", "S39W059", + "N05W059", "S04W080", "S12W078", "S23W047", "S39W060", + "N05W060", "S04W081", "S13W038", "S23W048", "S39W061", + "N05W061", "S05W037", "S13W039", "S23W049", "S39W062", + "N05W062", "S05W038", "S13W040", "S23W050", "S39W063", + "N05W063", "S05W039", "S13W041", "S23W051", "S39W064", + "N05W064", "S05W040", "S13W042", "S23W052", "S39W065", + "N05W065", "S05W041", "S13W043", "S23W053", "S39W066", + "N05W066", "S05W042", "S13W044", "S23W054", "S39W067", + "N05W067", "S05W043", "S13W045", "S23W055", "S39W068", + "N05W068", "S05W044", "S13W046", "S23W056", "S39W069", + "N05W069", "S05W045", "S13W047", "S23W057", "S39W070", + "N05W070", "S05W046", "S13W048", "S23W058", "S39W071", + "N05W071", "S05W047", "S13W049", "S23W059", "S39W072", + "N05W072", "S05W048", "S13W050", "S23W060", "S39W073", + "N05W073", "S05W049", "S13W051", "S23W061", "S39W074", + "N05W074", "S05W050", "S13W052", "S23W062", "S40W062", + "N05W075", "S05W051", "S13W053", "S23W063", "S40W063", + "N05W076", "S05W052", "S13W054", "S23W064", "S40W064", + "N05W077", "S05W053", "S13W055", "S23W065", "S40W065", + "N05W078", "S05W054", "S13W056", "S23W066", "S40W066", + "N05W088", "S05W055", "S13W057", "S23W067", "S40W067", + "N06W056", "S05W056", "S13W058", "S23W068", "S40W068", + "N06W057", "S05W057", "S13W059", "S23W069", "S40W069", + "N06W058", "S05W058", "S13W060", "S23W070", "S40W070", + "N06W059", "S05W059", "S13W061", "S23W071", "S40W071", + "N06W060", "S05W060", "S13W062", "S24W042", "S40W072", + "N06W061", "S05W061", "S13W063", "S24W043", "S40W073", + "N06W062", "S05W062", "S13W064", "S24W044", "S40W074", + "N06W063", "S05W063", "S13W065", "S24W045", "S41W063", + "N06W064", "S05W064", "S13W066", "S24W046", "S41W064", + "N06W065", "S05W065", "S13W067", "S24W047", "S41W065", + "N06W066", "S05W066", "S13W068", "S24W048", "S41W066", + "N06W067", "S05W067", "S13W069", "S24W049", "S41W067", + "N06W068", "S05W068", "S13W070", "S24W050", "S41W068", + "N06W069", "S05W069", "S13W071", "S24W051", "S41W069", + "N06W070", "S05W070", "S13W072", "S24W052", "S41W070", + "N06W071", "S05W071", "S13W073", "S24W053", "S41W071", + "N06W072", "S05W072", "S13W074", "S24W054", "S41W072", + "N06W073", "S05W073", "S13W075", "S24W055", "S41W073", + "N06W074", "S05W074", "S13W076", "S24W056", "S41W074", + "N06W075", "S05W075", "S13W077", "S24W057", "S42W063", + "N06W076", "S05W076", "S13W078", "S24W058", "S42W064", + "N06W077", "S05W077", "S14W039", "S24W059", "S42W065", + "N06W078", "S05W078", "S14W040", "S24W060", "S42W066", + "N07W059", "S05W079", "S14W041", "S24W061", "S42W067", + "N07W060", "S05W080", "S14W042", "S24W062", "S42W068", + "N07W061", "S05W081", "S14W043", "S24W063", "S42W069", + "N07W062", "S05W082", "S14W044", "S24W064", "S42W070", + "N07W063", "S06W036", "S14W045", "S24W065", "S42W071", + "N07W064", "S06W037", "S14W046", "S24W066", "S42W072", + "N07W065", "S06W038", "S14W047", "S24W067", "S42W073", + "N07W066", "S06W039", "S14W048", "S24W068", "S42W074", + "N07W067", "S06W040", "S14W049", "S24W069", "S42W075", + "N07W068", "S06W041", "S14W050", "S24W070", "S43W064", + "N07W069", "S06W042", "S14W051", "S24W071", "S43W065", + "N07W070", "S06W043", "S14W052", "S25W046", "S43W066", + "N07W071", "S06W044", "S14W053", "S25W047", "S43W067", + "N07W072", "S06W045", "S14W054", "S25W048", "S43W068", + "N07W073", "S06W046", "S14W055", "S25W049", "S43W069", + "N07W074", "S06W047", "S14W056", "S25W050", "S43W070", + "N07W075", "S06W048", "S14W057", "S25W051", "S43W071", + "N07W076", "S06W049", "S14W058", "S25W052", "S43W072", + "N07W077", "S06W050", "S14W059", "S25W053", "S43W073", + "N07W078", "S06W051", "S14W060", "S25W054", "S43W074", + "N07W079", "S06W052", "S14W061", "S25W055", "S43W075", + "N07W080", "S06W053", "S14W062", "S25W056", "S44W065", + "N07W081", "S06W054", "S14W063", "S25W057", "S44W066", + "N07W082", "S06W055", "S14W064", "S25W058", "S44W067", + "N07W083", "S06W056", "S14W065", "S25W059", "S44W068", + "N08W060", "S06W057", "S14W066", "S25W060", "S44W069", + "N08W061", "S06W058", "S14W067", "S25W061", "S44W070", + "N08W062", "S06W059", "S14W068", "S25W062", "S44W071", + "N08W063", "S06W060", "S14W069", "S25W063", "S44W072", + "N08W064", "S06W061", "S14W070", "S25W064", "S44W073", + "N08W065", "S06W062", "S14W071", "S25W065", "S44W074", + "N08W066", "S06W063", "S14W072", "S25W066", "S44W075", + "N08W067", "S06W064", "S14W073", "S25W067", "S45W066", + "N08W068", "S06W065", "S14W074", "S25W068", "S45W067", + "N08W069", "S06W066", "S14W075", "S25W069", "S45W068", + "N08W070", "S06W067", "S14W076", "S25W070", "S45W069", + "N08W071", "S06W068", "S14W077", "S25W071", "S45W070", + "N08W072", "S06W069", "S15W039", "S26W048", "S45W071", + "N08W073", "S06W070", "S15W040", "S26W049", "S45W072", + "N08W074", "S06W071", "S15W041", "S26W050", "S45W073", + "N08W075", "S06W072", "S15W042", "S26W051", "S45W074", + "N08W076", "S06W073", "S15W043", "S26W052", "S45W075", + "N08W077", "S06W074", "S15W044", "S26W053", "S45W076", + "N08W078", "S06W075", "S15W045", "S26W054", "S46W066", + "N08W079", "S06W076", "S15W046", "S26W055", "S46W067", + "N08W080", "S06W077", "S15W047", "S26W056", "S46W068", + "N08W081", "S06W078", "S15W048", "S26W057", "S46W069", + "N08W082", "S06W079", "S15W049", "S26W058", "S46W070", + "N08W083", "S06W080", "S15W050", "S26W059", "S46W071", + "N08W084", "S06W081", "S15W051", "S26W060", "S46W072", + "N09W061", "S06W082", "S15W052", "S26W061", "S46W073", + "N09W062", "S07W035", "S15W053", "S26W062", "S46W074", + "N09W063", "S07W036", "S15W054", "S26W063", "S46W075", + "N09W064", "S07W037", "S15W055", "S26W064", "S46W076", + "N09W065", "S07W038", "S15W056", "S26W065", "S47W067", + "N09W066", "S07W039", "S15W057", "S26W066", "S47W068", + "N09W067", "S07W040", "S15W058", "S26W067", "S47W069", + "N09W068", "S07W041", "S15W059", "S26W068", "S47W070", + "N09W069", "S07W042", "S15W060", "S26W069", "S47W071", + "N09W070", "S07W043", "S15W061", "S26W070", "S47W072", + "N09W071", "S07W044", "S15W062", "S26W071", "S47W073", + "N09W072", "S07W045", "S15W063", "S27W049", "S47W074", + "N09W073", "S07W046", "S15W064", "S27W050", "S47W075", + "N09W074", "S07W047", "S15W065", "S27W051", "S47W076", + "N09W075", "S07W048", "S15W066", "S27W052", "S48W066", + "N09W076", "S07W049", "S15W067", "S27W053", "S48W067", + "N09W077", "S07W050", "S15W068", "S27W054", "S48W068", + "N09W078", "S07W051", "S15W069", "S27W055", "S48W069", + "N09W079", "S07W052", "S15W070", "S27W056", "S48W070", + "N09W080", "S07W053", "S15W071", "S27W057", "S48W071", + "N09W081", "S07W054", "S15W072", "S27W058", "S48W072", + "N09W082", "S07W055", "S15W073", "S27W059", "S48W073", + "N09W083", "S07W056", "S15W074", "S27W060", "S48W074", + "N09W084", "S07W057", "S15W075", "S27W061", "S48W075", + "N09W085", "S07W058", "S15W076", "S27W062", "S48W076", + "N09W086", "S07W059", "S15W077", "S27W063", "S49W066", + "N10W061", "S07W060", "S16W039", "S27W064", "S49W067", + "N10W062", "S07W061", "S16W040", "S27W065", "S49W068", + "N10W063", "S07W062", "S16W041", "S27W066", "S49W069", + "N10W064", "S07W063", "S16W042", "S27W067", "S49W070", + "N10W065", "S07W064", "S16W043", "S27W068", "S49W071", + "N10W066", "S07W065", "S16W044", "S27W069", "S49W072", + "N10W067", "S07W066", "S16W045", "S27W070", "S49W073", + "N10W068", "S07W067", "S16W046", "S27W071", "S49W074", + "N10W069", "S07W068", "S16W047", "S27W080", "S49W075", + "N10W070", "S07W069", "S16W048", "S27W081", "S49W076", + "N10W071", "S07W070", "S16W049", "S28W049", "S50W068", + "N10W072", "S07W071", "S16W050", "S28W050", "S50W069", + "N10W073", "S07W072", "S16W051", "S28W051", "S50W070", + "N10W074", "S07W073", "S16W052", "S28W052", "S50W071", + "N10W075", "S07W074", "S16W053", "S28W053", "S50W072", + "N10W076", "S07W075", "S16W054", "S28W054", "S50W073", + "N10W084", "S07W076", "S16W055", "S28W055", "S50W074", + "N10W085", "S07W077", "S16W056", "S28W056", "S50W075", + "N10W086", "S07W078", "S16W057", "S28W057", "S50W076", + "N11W061", "S07W079", "S16W058", "S28W058", "S51W062", + "N11W062", "S07W080", "S16W059", "S28W059", "S51W068", + "N11W064", "S07W081", "S16W060", "S28W060", "S51W069", + "N11W065", "S07W082", "S16W061", "S28W061", "S51W070", + "N11W067", "S08W035", "S16W062", "S28W062", "S51W071", + "N11W068", "S08W036", "S16W063", "S28W063", "S51W072", + "N11W069", "S08W037", "S16W064", "S28W064", "S51W073", + "N11W070", "S08W038", "S16W065", "S28W065", "S51W074", + "N11W071", "S08W039", "S16W066", "S28W066", "S51W075", + "N11W072", "S08W040", "S16W067", "S28W067", "S51W076", + "N11W073", "S08W041", "S16W068", "S28W068", "S52W058", + "N11W074", "S08W042", "S16W069", "S28W069", "S52W059", + "N11W075", "S08W043", "S16W070", "S28W070", "S52W060", + "N11W084", "S08W044", "S16W071", "S28W071", "S52W061", + "N11W085", "S08W045", "S16W072", "S28W072", "S52W062", + "N11W086", "S08W046", "S16W073", "S29W049", "S52W069", + "N11W087", "S08W047", "S16W074", "S29W050", "S52W070", + "N12W062", "S08W048", "S16W075", "S29W051", "S52W071", + "N12W069", "S08W049", "S16W076", "S29W052", "S52W072", + "N12W070", "S08W050", "S17W039", "S29W053", "S52W073", + "N12W071", "S08W051", "S17W040", "S29W054", "S52W074", + "N12W072", "S08W052", "S17W041", "S29W055", "S52W075", + "N12W073", "S08W053", "S17W042", "S29W056", "S52W076", + "N12W082", "S08W054", "S17W043", "S29W057", "S53W059", + "N12W083", "S08W055", "S17W044", "S29W058", "S53W060", + "N12W084", "S08W056", "S17W045", "S29W059", "S53W061", + "N12W085", "S08W057", "S17W046", "S29W060", "S53W062", + "N12W086", "S08W058", "S17W047", "S29W061", "S53W069", + "N12W087", "S08W059", "S17W048", "S29W062", "S53W070", + "N12W088", "S08W060", "S17W049", "S29W063", "S53W071", + "N13W060", "S08W061", "S17W050", "S29W064", "S53W072", + "N13W061", "S08W062", "S17W051", "S29W065", "S53W073", + "N13W062", "S08W063", "S17W052", "S29W066", "S53W074", + "N13W081", "S08W064", "S17W053", "S29W067", "S53W075", + "N13W082", "S08W065", "S17W054", "S29W068", "S53W076", + "N13W084", "S08W066", "S17W055", "S29W069", "S54W068", + "N13W085", "S08W067", "S17W056", "S29W070", "S54W069", + "N13W086", "S08W068", "S17W057", "S29W071", "S54W070", + "N13W087", "S08W069", "S17W058", "S29W072", "S54W071", + "N13W088", "S08W070", "S17W059", "S30W050", "S54W072", + "N13W089", "S08W071", "S17W060", "S30W051", "S54W073", + "N13W090", "S08W072", "S17W061", "S30W052", "S54W074", + "N13W091", "S08W073", "S17W062", "S30W053", "S54W075", + "N13W092", "S08W074", "S17W063", "S30W054", "S55W064", + "N14W061", "S08W075", "S17W064", "S30W055", "S55W065", + "N14W062", "S08W076", "S17W065", "S30W056", "S55W066", + "N14W081", "S08W077", "S17W066", "S30W057", "S55W067", + "N14W083", "S08W078", "S17W067", "S30W058", "S55W068", + "N14W084", "S08W079", "S17W068", "S30W059", "S55W069", + "N14W085", "S08W080", "S17W069", "S30W060", "S55W070", + "N14W086", "S09W035", "S17W070", "S30W061", "S55W071", + "N14W087", "S09W036", "S17W071", "S30W062", "S55W072", + "N14W088", "S09W037", "S17W072", "S30W063", "S55W073", + "N14W089", "S09W038", "S17W073", "S30W064", "S55W074", + "N14W090", "S09W039", "S17W074", "S30W065", "S56W067", + "N14W091", "S09W040", "S17W075", "S30W066", "S56W068", + "N14W092", "S09W041", "S18W039", "S30W067", "S56W069", + "N14W093", "S09W042", "S18W040", "S30W068", "S56W070", + "S01W047", "S09W043", "S18W041", "S30W069", "S56W071", + "S01W048", "S09W044", "S18W042", "S30W070", "S56W072", + "S01W049", "S09W045", "S18W043", "S30W071", + "S01W050", "S09W046", "S18W044", "S30W072", + "S01W051", "S09W047", "S18W045", "S31W051", + (char *)0, + + (char *) -1 }; diff --git a/src/terraserver.c b/src/terraserver.c new file mode 100644 index 0000000..f5c6924 --- /dev/null +++ b/src/terraserver.c @@ -0,0 +1,38 @@ +/* + * viking -- GPS Data and Topo Analyzer, Explorer, and Manager + * + * Copyright (C) 2003-2005, Evan Battaglia + * + * 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., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA + * + */ +#ifdef HAVE_CONFIG_H +#include "config.h" +#endif + +#include "terraserver.h" +#include "terraservermapsource.h" +#include "vikmapslayer.h" +#include "map_ids.h" + +void terraserver_init () { + VikMapSource *map_type_1 = VIK_MAP_SOURCE(terraserver_map_source_new_with_id( MAP_ID_TERRASERVER_TOPO, "Terraserver Topos", MAP_ID_TERRASERVER_TOPO )); + VikMapSource *map_type_2 = VIK_MAP_SOURCE(terraserver_map_source_new_with_id( MAP_ID_TERRASERVER_AERIAL, "Terraserver Aerials", MAP_ID_TERRASERVER_AERIAL )); + VikMapSource *map_type_3 = VIK_MAP_SOURCE(terraserver_map_source_new_with_id( MAP_ID_TERRASERVER_URBAN, "Terraserver Urban Areas", MAP_ID_TERRASERVER_URBAN )); + + maps_layer_register_map_source (map_type_1); + maps_layer_register_map_source (map_type_2); + maps_layer_register_map_source (map_type_3); +} diff --git a/src/terraserver.h b/src/terraserver.h new file mode 100644 index 0000000..8ccf19a --- /dev/null +++ b/src/terraserver.h @@ -0,0 +1,36 @@ +/* + * viking -- GPS Data and Topo Analyzer, Explorer, and Manager + * + * Copyright (C) 2003-2005, Evan Battaglia + * + * 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., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA + * + */ + +#ifndef __VIKING_TERRASERVER_H +#define __VIKING_TERRASERVER_H + +#include + +G_BEGIN_DECLS + +#include "vikcoord.h" +#include "mapcoord.h" + +void terraserver_init(); + +G_END_DECLS + +#endif diff --git a/src/terraservermapsource.c b/src/terraservermapsource.c new file mode 100644 index 0000000..9082c56 --- /dev/null +++ b/src/terraservermapsource.c @@ -0,0 +1,287 @@ +/* -*- Mode: C; indent-tabs-mode: t; c-basic-offset: 4; tab-width: 4 -*- */ +/* + * viking + * Copyright (C) 2009, Guilhem Bonnefille + * + * viking 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 3 of the License, or + * (at your option) any later version. + * + * viking 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, see . + */ +#ifdef HAVE_CONFIG_H +#include "config.h" +#endif + +#ifdef HAVE_MATH_H +#include +#endif + +#include "globals.h" +#include "terraservermapsource.h" + +static gboolean _coord_to_mapcoord ( VikMapSource *self, const VikCoord *src, gdouble xzoom, gdouble yzoom, MapCoord *dest ); +static void _mapcoord_to_center_coord ( VikMapSource *self, MapCoord *src, VikCoord *dest ); +static gboolean _is_direct_file_access ( VikMapSource *self ); +static gboolean _is_mbtiles ( VikMapSource *self ); + +static gchar *_get_uri( VikMapSourceDefault *self, MapCoord *src ); +static gchar *_get_hostname( VikMapSourceDefault *self ); +static DownloadFileOptions *_get_download_options( VikMapSourceDefault *self ); + +/* FIXME Huge gruik */ +static DownloadFileOptions terraserver_options = { FALSE, FALSE, NULL, 0, a_check_map_file, NULL, NULL }; + +typedef struct _TerraserverMapSourcePrivate TerraserverMapSourcePrivate; +struct _TerraserverMapSourcePrivate +{ + guint8 type; +}; + +#define TERRASERVER_MAP_SOURCE_PRIVATE(o) (G_TYPE_INSTANCE_GET_PRIVATE ((o), TERRASERVER_TYPE_MAP_SOURCE, TerraserverMapSourcePrivate)) + +/* properties */ +enum +{ + PROP_0, + + PROP_TYPE, +}; + +G_DEFINE_TYPE (TerraserverMapSource, terraserver_map_source, VIK_TYPE_MAP_SOURCE_DEFAULT); + +static void +terraserver_map_source_init (TerraserverMapSource *self) +{ + /* initialize the object here */ + g_object_set (G_OBJECT (self), + "tilesize-x", 200, + "tilesize-y", 200, + "drawmode", VIK_VIEWPORT_DRAWMODE_UTM, + NULL); +} + +static void +terraserver_map_source_finalize (GObject *object) +{ + /* TODO: Add deinitalization code here */ + + G_OBJECT_CLASS (terraserver_map_source_parent_class)->finalize (object); +} + +static void +terraserver_map_source_set_property (GObject *object, + guint property_id, + const GValue *value, + GParamSpec *pspec) +{ + TerraserverMapSource *self = TERRASERVER_MAP_SOURCE (object); + TerraserverMapSourcePrivate *priv = TERRASERVER_MAP_SOURCE_PRIVATE (self); + + switch (property_id) + { + case PROP_TYPE: + priv->type = g_value_get_uint (value); + break; + + default: + /* We don't have any other property... */ + G_OBJECT_WARN_INVALID_PROPERTY_ID (object, property_id, pspec); + break; + } +} + +static void +terraserver_map_source_get_property (GObject *object, + guint property_id, + GValue *value, + GParamSpec *pspec) +{ + TerraserverMapSource *self = TERRASERVER_MAP_SOURCE (object); + TerraserverMapSourcePrivate *priv = TERRASERVER_MAP_SOURCE_PRIVATE (self); + + switch (property_id) + { + case PROP_TYPE: + g_value_set_uint (value, priv->type); + break; + + default: + /* We don't have any other property... */ + G_OBJECT_WARN_INVALID_PROPERTY_ID (object, property_id, pspec); + break; + } +} + +static void +terraserver_map_source_class_init (TerraserverMapSourceClass *klass) +{ + GObjectClass* object_class = G_OBJECT_CLASS (klass); + VikMapSourceClass* grandparent_class = VIK_MAP_SOURCE_CLASS (klass); + VikMapSourceDefaultClass* parent_class = VIK_MAP_SOURCE_DEFAULT_CLASS (klass); + GParamSpec *pspec = NULL; + + object_class->set_property = terraserver_map_source_set_property; + object_class->get_property = terraserver_map_source_get_property; + + /* Overiding methods */ + grandparent_class->coord_to_mapcoord = _coord_to_mapcoord; + grandparent_class->mapcoord_to_center_coord = _mapcoord_to_center_coord; + grandparent_class->is_direct_file_access = _is_direct_file_access; + grandparent_class->is_mbtiles = _is_mbtiles; + + parent_class->get_uri = _get_uri; + parent_class->get_hostname = _get_hostname; + parent_class->get_download_options = _get_download_options; + + pspec = g_param_spec_uint ("type", + "Type", + "Type of Terraserver map", + 0 /* minimum value */, + G_MAXUINT8 /* maximum value */, + 0 /* default value */, + G_PARAM_CONSTRUCT_ONLY | G_PARAM_READWRITE); + g_object_class_install_property (object_class, PROP_TYPE, pspec); + + g_type_class_add_private (klass, sizeof (TerraserverMapSourcePrivate)); + + object_class->finalize = terraserver_map_source_finalize; +} + +#define TERRASERVER_SITE "msrmaps.com" +#define MARGIN_OF_ERROR 0.001 + +static int mpp_to_scale ( gdouble mpp, guint8 type ) +{ + mpp *= 4; + gint t = (gint) mpp; + if ( ABS(mpp - t) > MARGIN_OF_ERROR ) + return FALSE; + + switch ( t ) { + case 1: return (type == 4) ? 8 : 0; + case 2: return (type == 4) ? 9 : 0; + case 4: return (type != 2) ? 10 : 0; + case 8: return 11; + case 16: return 12; + case 32: return 13; + case 64: return 14; + case 128: return 15; + case 256: return 16; + case 512: return 17; + case 1024: return 18; + case 2048: return 19; + default: return 0; + } +} + +static gdouble scale_to_mpp ( gint scale ) +{ + return pow(2,scale - 10); +} + +static gboolean +_coord_to_mapcoord ( VikMapSource *self, const VikCoord *src, gdouble xmpp, gdouble ympp, MapCoord *dest ) +{ + g_return_val_if_fail(TERRASERVER_IS_MAP_SOURCE(self), FALSE); + + TerraserverMapSourcePrivate *priv = TERRASERVER_MAP_SOURCE_PRIVATE(self); + int type = priv->type; + if ( src->mode != VIK_COORD_UTM ) + return FALSE; + + if ( xmpp != ympp ) + return FALSE; + + dest->scale = mpp_to_scale ( xmpp, type ); + if ( ! dest->scale ) + return FALSE; + + dest->x = (gint)(((gint)(src->east_west))/(200*xmpp)); + dest->y = (gint)(((gint)(src->north_south))/(200*xmpp)); + dest->z = src->utm_zone; + return TRUE; +} + +static gboolean +_is_direct_file_access ( VikMapSource *self ) +{ + return FALSE; +} + +static gboolean +_is_mbtiles ( VikMapSource *self ) +{ + return FALSE; +} + +static void +_mapcoord_to_center_coord ( VikMapSource *self, MapCoord *src, VikCoord *dest ) +{ + // FIXME: slowdown here! + gdouble mpp = scale_to_mpp ( src->scale ); + dest->mode = VIK_COORD_UTM; + dest->utm_zone = src->z; + dest->east_west = ((src->x * 200) + 100) * mpp; + dest->north_south = ((src->y * 200) + 100) * mpp; +} + +static gchar * +_get_uri( VikMapSourceDefault *self, MapCoord *src ) +{ + g_return_val_if_fail (TERRASERVER_IS_MAP_SOURCE(self), NULL); + + TerraserverMapSourcePrivate *priv = TERRASERVER_MAP_SOURCE_PRIVATE(self); + int type = priv->type; + gchar *uri = g_strdup_printf ( "/tile.ashx?T=%d&S=%d&X=%d&Y=%d&Z=%d", type, + src->scale, src->x, src->y, src->z ); + return uri; +} + +static gchar * +_get_hostname( VikMapSourceDefault *self ) +{ + g_return_val_if_fail (TERRASERVER_IS_MAP_SOURCE(self), NULL); + + return g_strdup( TERRASERVER_SITE ); +} + +static DownloadFileOptions * +_get_download_options( VikMapSourceDefault *self ) +{ + g_return_val_if_fail (TERRASERVER_IS_MAP_SOURCE(self), NULL); + + return &terraserver_options; +} + +TerraserverMapSource * +terraserver_map_source_new_with_id (guint16 id, const char *label, int type) +{ + char *copyright = NULL; + switch (type) + { + case 1: + copyright = "© DigitalGlobe"; + break; + case 2: + copyright = "© LandVoyage"; + break; + case 4: + copyright = "© DigitalGlobe"; + break; + default: + g_critical("Houston, we've had a problem. type=%d", type); + } + + return g_object_new(TERRASERVER_TYPE_MAP_SOURCE, + "id", id, "label", label, "type", type, + "copyright", copyright, + NULL); +} diff --git a/src/terraservermapsource.h b/src/terraservermapsource.h new file mode 100644 index 0000000..673d44c --- /dev/null +++ b/src/terraservermapsource.h @@ -0,0 +1,55 @@ +/* -*- Mode: C; indent-tabs-mode: t; c-basic-offset: 4; tab-width: 4 -*- */ +/* + * viking + * Copyright (C) 2009, Guilhem Bonnefille + * + * viking 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. + * + * viking 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, see . + */ + +#ifndef _TERRASERVER_MAP_SOURCE_H +#define _TERRASERVER_MAP_SOURCE_H + +#include "vikcoord.h" +#include "mapcoord.h" +#include "vikmapsourcedefault.h" + +G_BEGIN_DECLS + +#define TERRASERVER_TYPE_MAP_SOURCE (terraserver_map_source_get_type ()) +#define TERRASERVER_MAP_SOURCE(obj) (G_TYPE_CHECK_INSTANCE_CAST ((obj), TERRASERVER_TYPE_MAP_SOURCE, TerraserverMapSource)) +#define TERRASERVER_MAP_SOURCE_CLASS(klass) (G_TYPE_CHECK_CLASS_CAST ((klass), TERRASERVER_TYPE_MAP_SOURCE, TerraserverMapSourceClass)) +#define TERRASERVER_IS_MAP_SOURCE(obj) (G_TYPE_CHECK_INSTANCE_TYPE ((obj), TERRASERVER_TYPE_MAP_SOURCE)) +#define TERRASERVER_IS_MAP_SOURCE_CLASS(klass) (G_TYPE_CHECK_CLASS_TYPE ((klass), TERRASERVER_TYPE_MAP_SOURCE)) +#define TERRASERVER_MAP_SOURCE_GET_CLASS(obj) (G_TYPE_INSTANCE_GET_CLASS ((obj), TERRASERVER_TYPE_MAP_SOURCE, TerraserverMapSourceClass)) + +typedef struct _TerraserverMapSourceClass TerraserverMapSourceClass; +typedef struct _TerraserverMapSource TerraserverMapSource; + +struct _TerraserverMapSourceClass +{ + VikMapSourceDefaultClass parent_class; +}; + +struct _TerraserverMapSource +{ + VikMapSourceDefault parent_instance; +}; + +GType terraserver_map_source_get_type (void) G_GNUC_CONST; + +TerraserverMapSource * terraserver_map_source_new_with_id (guint16 id, const char *label, int type); + +G_END_DECLS + +#endif /* _TERRASERVER_MAP_SOURCE_H_ */ diff --git a/src/thumbnails.c b/src/thumbnails.c new file mode 100644 index 0000000..2eca0e8 --- /dev/null +++ b/src/thumbnails.c @@ -0,0 +1,323 @@ +/* + * viking -- GPS Data and Topo Analyzer, Explorer, and Manager + * + * Copyright (C) 2003-2005, Evan Battaglia + * + * 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., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA + * + */ + +/* + * Large (and important) sections of this file were adapted from + * ROX-Filer source code, Copyright (C) 2003, the ROX-Filer team, + * originally licensed under the GPL v2 or greater (as above). + * + */ + +#ifdef HAVE_CONFIG_H +#include "config.h" +#endif + +#include +#ifdef HAVE_UNISTD_H +#include +#endif +#include +#include +#include +#include +#include "viking.h" +#include "thumbnails.h" +#include "icons/icons.h" +#include "md5_hash.h" + +#ifdef __CYGWIN__ +#ifdef __CYGWIN_USE_BIG_TYPES__ +#define ST_SIZE_FMT "%lld" +#else +#define ST_SIZE_FMT "%ld" +#endif +#else +/* FIXME -- on some systems this may need to me "lld", see ROX-Filer code */ +#define ST_SIZE_FMT "%ld" +#endif + +static gchar* thumb_dir = NULL; + +#ifdef WINDOWS +static void set_thumb_dir () +{ + thumb_dir = g_strconcat ( g_get_home_dir(), "\\THUMBNAILS\\normal\\", NULL ) ; +} +#else +static void set_thumb_dir () +{ + const gchar *xdg_cache_home = g_getenv("XDG_CACHE_HOME"); + if ( xdg_cache_home && g_strcmp0 (xdg_cache_home, "") != 0 ) + thumb_dir = g_strconcat ( xdg_cache_home, "/thumbnails/normal/", NULL ); + else + thumb_dir = g_strconcat ( g_get_home_dir(), "/.cache/thumbnails/normal/", NULL ); +} +#endif + +#define PIXMAP_THUMB_SIZE 128 + +static GdkPixbuf *save_thumbnail(const char *pathname, GdkPixbuf *full); +static GdkPixbuf *child_create_thumbnail(const gchar *path); + +gboolean a_thumbnails_exists ( const gchar *filename ) +{ + GdkPixbuf *pixbuf = a_thumbnails_get(filename); + if ( pixbuf ) + { + g_object_unref ( G_OBJECT ( pixbuf ) ); + return TRUE; + } + return FALSE; +} + +GdkPixbuf *a_thumbnails_get_default () +{ + return gdk_pixbuf_from_pixdata ( &thumbnails_pixbuf, FALSE, NULL ); +} + +/* filename must be absolute. you could have a function to make sure it exists and absolutize it */ + +void a_thumbnails_create(const gchar *filename) +{ + GdkPixbuf *pixbuf = a_thumbnails_get(filename); + + if ( ! pixbuf ) + pixbuf = child_create_thumbnail(filename); + + if ( pixbuf ) + g_object_unref ( G_OBJECT ( pixbuf ) ); +} + +GdkPixbuf *a_thumbnails_scale_pixbuf(GdkPixbuf *src, int max_w, int max_h) +{ + int w, h; + + w = gdk_pixbuf_get_width(src); + h = gdk_pixbuf_get_height(src); + + if (w <= max_w && h <= max_h) + { + g_object_ref ( G_OBJECT ( src ) ); + return src; + } + else + { + float scale_x = ((float) w) / max_w; + float scale_y = ((float) h) / max_h; + float scale = MAX(scale_x, scale_y); + int dest_w = w / scale; + int dest_h = h / scale; + + return gdk_pixbuf_scale_simple(src, + MAX(dest_w, 1), + MAX(dest_h, 1), + GDK_INTERP_BILINEAR); + } +} + +static GdkPixbuf *child_create_thumbnail(const gchar *path) +{ + GdkPixbuf *image, *tmpbuf; + + image = gdk_pixbuf_new_from_file(path, NULL); + if (!image) + return NULL; + + tmpbuf = gdk_pixbuf_apply_embedded_orientation(image); + g_object_unref(G_OBJECT(image)); + image = tmpbuf; + + if (image) + { + GdkPixbuf *thumb = save_thumbnail(path, image); + g_object_unref ( G_OBJECT ( image ) ); + return thumb; + } + + return NULL; +} + +static GdkPixbuf *save_thumbnail(const char *pathname, GdkPixbuf *full) +{ + struct stat info; + gchar *path; + int original_width, original_height; + const gchar* orientation; + GString *to; + char *md5, *swidth, *sheight, *ssize, *smtime, *uri; + mode_t old_mask; + int name_len; + GdkPixbuf *thumb; + + if (stat(pathname, &info) != 0) + return NULL; + + thumb = a_thumbnails_scale_pixbuf(full, PIXMAP_THUMB_SIZE, PIXMAP_THUMB_SIZE); + + orientation = gdk_pixbuf_get_option (full, "orientation"); + + original_width = gdk_pixbuf_get_width(full); + original_height = gdk_pixbuf_get_height(full); + + + swidth = g_strdup_printf("%d", original_width); + sheight = g_strdup_printf("%d", original_height); + ssize = g_strdup_printf(ST_SIZE_FMT, info.st_size); + smtime = g_strdup_printf("%ld", (long) info.st_mtime); + + path = file_realpath_dup(pathname); + uri = g_strconcat("file://", path, NULL); + md5 = md5_hash(uri); + g_free(path); + + to = g_string_new ( thumb_dir ); + if ( g_mkdir_with_parents(to->str, 0700) != 0 ) + g_warning ("%s: Failed to mkdir %s", __FUNCTION__, to->str ); + g_string_append(to, md5); + name_len = to->len + 4; /* Truncate to this length when renaming */ +#ifdef WINDOWS + g_string_append_printf(to, ".png.Viking"); +#else + g_string_append_printf(to, ".png.Viking-%ld", (long) getpid()); +#endif + + g_free(md5); + + // Thumb::URI must be in ISO-8859-1 encoding otherwise gdk_pixbuf_save() will fail + // - e.g. if characters such as 'ě' are encountered + // Also see http://en.wikipedia.org/wiki/ISO/IEC_8859-1 + // ATM GLIB Manual doesn't specify in which version this function became available + // find out that it's fairly recent so may break builds without this test +#if GLIB_CHECK_VERSION(2,40,0) + char *thumb_uri = g_str_to_ascii ( uri, NULL ); +#else + char *thumb_uri = g_strdup ( uri ); +#endif + old_mask = umask(0077); + GError *error = NULL; + gdk_pixbuf_save(thumb, to->str, "png", &error, + "tEXt::Thumb::Image::Width", swidth, + "tEXt::Thumb::Image::Height", sheight, + "tEXt::Thumb::Size", ssize, + "tEXt::Thumb::MTime", smtime, + "tEXt::Thumb::URI", thumb_uri, + "tEXt::Software", PROJECT, + "tEXt::Software::Orientation", orientation ? orientation : "0", + NULL); + umask(old_mask); + g_free(thumb_uri); + + if (error) { + g_warning ( "%s::%s", __FUNCTION__, error->message ); + g_error_free ( error ); + g_object_unref ( G_OBJECT(thumb) ); + thumb = NULL; /* return NULL */ + } + else + /* We create the file ###.png.Viking-PID and rename it to avoid + * a race condition if two programs create the same thumb at + * once. + */ + { + gchar *final; + + final = g_strndup(to->str, name_len); + if (rename(to->str, final)) + { + g_warning("Failed to rename '%s' to '%s': %s", + to->str, final, g_strerror(errno)); + g_object_unref ( G_OBJECT(thumb) ); + thumb = NULL; /* return NULL */ + } + + g_free(final); + } + + g_string_free(to, TRUE); + g_free(swidth); + g_free(sheight); + g_free(ssize); + g_free(smtime); + g_free(uri); + + return thumb; +} + + +GdkPixbuf *a_thumbnails_get(const gchar *pathname) +{ + GdkPixbuf *thumb = NULL; + char *thumb_path, *md5, *uri, *path; + const char *ssize, *smtime; + struct stat info; + + path = file_realpath_dup(pathname); + uri = g_strconcat("file://", path, NULL); + md5 = md5_hash(uri); + g_free(uri); + + thumb_path = g_strdup_printf("%s%s.png", thumb_dir, md5); + + g_free(md5); + + thumb = gdk_pixbuf_new_from_file(thumb_path, NULL); + if (!thumb) + goto err; + + /* Note that these don't need freeing... */ + ssize = gdk_pixbuf_get_option(thumb, "tEXt::Thumb::Size"); + if (!ssize) + goto err; + + smtime = gdk_pixbuf_get_option(thumb, "tEXt::Thumb::MTime"); + if (!smtime) + goto err; + + if (stat(path, &info) != 0) + goto err; + + if (info.st_mtime != atol(smtime) || info.st_size != atol(ssize)) + goto err; + + goto out; +err: + if (thumb) + g_object_unref ( G_OBJECT ( thumb ) ); + thumb = NULL; +out: + g_free(path); + g_free(thumb_path); + return thumb; +} + +/* + * Startup and finish routines + */ + +void a_thumbnails_init () +{ + set_thumb_dir (); +} + +void a_thumbnails_uninit () +{ + g_free ( thumb_dir ); +} diff --git a/src/thumbnails.h b/src/thumbnails.h new file mode 100644 index 0000000..b5f4412 --- /dev/null +++ b/src/thumbnails.h @@ -0,0 +1,41 @@ +/* + * viking -- GPS Data and Topo Analyzer, Explorer, and Manager + * + * Copyright (C) 2003-2005, Evan Battaglia + * + * 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., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA + * + */ + +#ifndef __VIKING_THUMBNAILS_H +#define __VIKING_THUMBNAILS_H + +#include +#include + +G_BEGIN_DECLS + +void a_thumbnails_init (); +void a_thumbnails_uninit (); + +gboolean a_thumbnails_exists ( const gchar *filename ); +void a_thumbnails_create ( const gchar *filename ); +GdkPixbuf *a_thumbnails_get(const gchar *filename); +GdkPixbuf *a_thumbnails_get_default (); +GdkPixbuf *a_thumbnails_scale_pixbuf(GdkPixbuf *src, int max_w, int max_h); + +G_END_DECLS + +#endif diff --git a/src/toolbar.c b/src/toolbar.c new file mode 100644 index 0000000..2a0d26d --- /dev/null +++ b/src/toolbar.c @@ -0,0 +1,1203 @@ +/* -*- Mode: C; indent-tabs-mode: t; c-basic-offset: 4; tab-width: 4 -*- */ +/* + * toolbar.c - this file was part of Geany (v1.24.1), a fast and lightweight IDE + * + * Copyright 2009-2012 Enrico Tröger + * Copyright 2009-2012 Nick Treleaven + * Copyright 2014 Rob Norris + * + * 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. + */ + +/** + * @file toolbar.h + * Toolbar (prefs). + */ +/* Utility functions to create the toolbar */ + +#ifdef HAVE_CONFIG_H +# include "config.h" +#endif + +#include "toolbar.h" +#include "dir.h" +#include "ui_util.h" +#include "util.h" +#include +#include +#include +#include + +#include "preferences.h" + + +struct _VikToolbarClass +{ + GObjectClass object_class; +}; + +struct _VikToolbar { + GObject obj; + GtkWidget *widget; + GtkUIManager *uim; + guint merge_id; + GtkActionGroup *group_actions; + GtkActionGroup *group_toggles; + GtkActionGroup *group_tools; + GtkActionGroup *group_modes; + GSList *list_of_actions; + GSList *list_of_toggles; + GSList *list_of_tools; + GSList *list_of_modes; +}; + +G_DEFINE_TYPE (VikToolbar, vik_toolbar, G_TYPE_OBJECT) + +static void vik_toolbar_class_init (VikToolbarClass *klass) +{ +} + +static void vik_toolbar_init (VikToolbar *vtb) +{ + vtb->widget = NULL; + vtb->merge_id = 0; + vtb->list_of_actions = NULL; + vtb->list_of_toggles = NULL; + vtb->list_of_tools = NULL; + vtb->list_of_modes = NULL; +} + +VikToolbar *vik_toolbar_new () +{ + VikToolbar *vtb = (VikToolbar *)g_object_new(vik_toolbar_get_type(), NULL); + return vtb; +} + +#define TOOLBAR_PARAMS_GROUP_KEY "toolbar" +#define TOOLBAR_PARAMS_NAMESPACE "toolbar." + +static gchar *params_icon_size[] = { N_("System Default"), N_("Small"), N_("Medium"), N_("Large"), NULL }; +static gchar *params_icon_style[] = { N_("System Default"), N_("Icons Only"), N_("Text Only"), N_("Icons and Text"), NULL }; + +typedef struct { + VikToolbar *vtb; + GtkWindow *parent; + GtkWidget *vbox; + GtkWidget *hbox; + ReloadCB *reload_cb; + gpointer user_data; +} config_t; + +static config_t extra_widget_data; + +static VikLayerParam prefs[] = { + { VIK_LAYER_NUM_TYPES, TOOLBAR_PARAMS_NAMESPACE "append_to_menu", VIK_LAYER_PARAM_BOOLEAN, VIK_LAYER_GROUP_NONE, N_("Append to Menu:"), VIK_LAYER_WIDGET_CHECKBUTTON, NULL, NULL, + N_("Pack the toolbar to the main menu to save vertical space"), NULL, NULL, NULL }, + { VIK_LAYER_NUM_TYPES, TOOLBAR_PARAMS_NAMESPACE "icon_size", VIK_LAYER_PARAM_UINT, VIK_LAYER_GROUP_NONE, N_("Icon Size:"), VIK_LAYER_WIDGET_COMBOBOX, params_icon_size, NULL, + NULL, NULL, NULL, NULL }, + { VIK_LAYER_NUM_TYPES, TOOLBAR_PARAMS_NAMESPACE "icon_style", VIK_LAYER_PARAM_UINT, VIK_LAYER_GROUP_NONE, N_("Icon Style:"), VIK_LAYER_WIDGET_COMBOBOX, params_icon_style, NULL, + NULL, NULL, NULL, NULL }, + { VIK_LAYER_NUM_TYPES, TOOLBAR_PARAMS_NAMESPACE "NOTSAVED1", VIK_LAYER_PARAM_PTR, VIK_LAYER_GROUP_NONE, N_("Customize:"), VIK_LAYER_WIDGET_BUTTON, N_("Customize Buttons"), NULL, + NULL, NULL, NULL, NULL }, +}; + +// Global storage to enable freeing upon closure +static GHashTable *signal_data; +static GSList *toggle_overrides = NULL; + +// Forward declaration +void toolbar_configure (VikToolbar *vtb, GtkWidget *toolbar, GtkWindow *parent, GtkWidget *vbox, GtkWidget *hbox, ReloadCB reload_cb, gpointer user_data); + +void toolbar_configure_cb(void) +{ + // Values not known at prefs initialization. + // So trying to pass these values via the UI builder is not possible currently. + // ATM cheat via internal values - although this doesn't work properly for multiple Windows... + toolbar_configure ( extra_widget_data.vtb, + extra_widget_data.vtb->widget, + extra_widget_data.parent, + extra_widget_data.vbox, + extra_widget_data.hbox, + extra_widget_data.reload_cb, + extra_widget_data.user_data ); +} + +/** + * a_toolbar_init: + * + * Initialize stuff for the toolbar. + */ +void a_toolbar_init (void) +{ + // Preferences + a_preferences_register_group ( TOOLBAR_PARAMS_GROUP_KEY, _("Toolbar") ); + + guint i = 0; + VikLayerParamData tmp; + tmp.b = FALSE; + a_preferences_register (&prefs[i++], tmp, TOOLBAR_PARAMS_GROUP_KEY); + tmp.u = 0; + a_preferences_register (&prefs[i++], tmp, TOOLBAR_PARAMS_GROUP_KEY); +#ifdef WINDOWS + tmp.u = 1; // Small Icons for Windows by default as 'System Defaults' is more GNOME Theme driven. +#else + tmp.u = 0; +#endif + a_preferences_register (&prefs[i++], tmp, TOOLBAR_PARAMS_GROUP_KEY); + tmp.ptr = toolbar_configure_cb; + a_preferences_register (&prefs[i++], tmp, TOOLBAR_PARAMS_GROUP_KEY); + + // Signal data hash + signal_data = g_hash_table_new_full ( g_direct_hash, g_direct_equal, NULL, g_free ); +} + +/** + * a_toolbar_uninit: + * + * Uninitialize toolbar related stuff. + */ +void a_toolbar_uninit ( void ) +{ + g_hash_table_destroy ( signal_data ); + g_slist_foreach ( toggle_overrides, (GFunc)g_free, NULL ); + g_slist_free ( toggle_overrides ); +} + +static gboolean prefs_get_append_to_menu (void) +{ + return a_preferences_get(TOOLBAR_PARAMS_NAMESPACE "append_to_menu")->b; +} + +static guint prefs_get_icon_size (void) +{ + return a_preferences_get(TOOLBAR_PARAMS_NAMESPACE "icon_size")->u; +} + +static guint prefs_get_icon_style (void) +{ + return a_preferences_get(TOOLBAR_PARAMS_NAMESPACE "icon_style")->u; +} + +/* Note: The returned widget pointer is only valid until the toolbar is reloaded. So, either + * update the widget pointer in this case (i.e. request it again) or better use + * toolbar_get_action_by_name() instead. The action objects will remain the same even when the + * toolbar is reloaded. */ +GtkWidget *toolbar_get_widget_by_name(VikToolbar *vtb, const gchar *name) +{ + GtkWidget *widget; + gchar *path; + + g_return_val_if_fail(name != NULL, NULL); + g_return_val_if_fail(VIK_IS_TOOLBAR(vtb), NULL); + + path = g_strconcat("/ui/MainToolbar/", name, NULL); + widget = gtk_ui_manager_get_widget(vtb->uim, path); + + g_free(path); + return widget; +} + +static GtkAction *get_action ( VikToolbar *vtb, const gchar *name ) +{ + // Try all groups + GtkAction *action = gtk_action_group_get_action (vtb->group_actions, name); + if ( !action ) + action = gtk_action_group_get_action (vtb->group_tools, name); + if ( !action ) + action = gtk_action_group_get_action (vtb->group_toggles, name); + if ( !action ) + action = gtk_action_group_get_action (vtb->group_modes, name); + return action; +} + +/** + * toolbar_get_action_by_name: + * + * Find an action in the specified toolbar via the action name + */ +GtkAction *toolbar_get_action_by_name(VikToolbar *vtb, const gchar *name) +{ + g_return_val_if_fail(name != NULL, NULL); + g_return_val_if_fail(VIK_IS_TOOLBAR(vtb), NULL); + + return get_action(vtb,name); +} + +/** + * toolbar_action_tool_entry_register: + * + * Register a tool button in the specified toolbar + * Only one of these tools can be active at a time (hence it is a GtkRadioActionEntry) + */ +void toolbar_action_tool_entry_register(VikToolbar *vtb, GtkRadioActionEntry *action) +{ + g_return_if_fail(VIK_IS_TOOLBAR(vtb)); + g_return_if_fail(action != NULL); + vtb->list_of_tools = g_slist_append(vtb->list_of_tools, action); +} + +/** + * toolbar_action_mode_entry_register: + * + * Register a drawing projection mode button in the specified toolbar + * Only one of these modes can be active at a time (hence it is a GtkRadioActionEntry) + */ +void toolbar_action_mode_entry_register(VikToolbar *vtb, GtkRadioActionEntry *action) +{ + g_return_if_fail(VIK_IS_TOOLBAR(vtb)); + g_return_if_fail(action != NULL); + vtb->list_of_modes = g_slist_append(vtb->list_of_modes, action); +} + +/** + * toolbar_action_toggle_entry_register: + * + * Register a toggle button in the specified toolbar with the specified callback + * Used in preventing circluar callbacks of a toolbar toggle event calling the menu toggle event + * (that then calls toolbar callback and so on and so on...) + * The toggle action must be given a pointer to a function that is used on the callback for toolbar only + * (that must offer a way to have a finite call chain!) + */ +void toolbar_action_toggle_entry_register(VikToolbar *vtb, GtkToggleActionEntry *action, gpointer callback) +{ + g_return_if_fail(VIK_IS_TOOLBAR(vtb)); + g_return_if_fail(action != NULL); + + GtkToggleActionEntry *myaction = g_malloc (sizeof (GtkToggleActionEntry) ); + memcpy ( myaction, action, sizeof (GtkToggleActionEntry) ); + // Overwrite with specific callback + myaction->callback = callback; + vtb->list_of_toggles = g_slist_append(vtb->list_of_toggles, myaction); + + // Store override so it can be freed upon toolbar destruction + toggle_overrides = g_slist_append ( toggle_overrides, myaction ); +} + +/** + * toolbar_action_entry_register: + * + * Register a standard action button in the specified toolbar + */ +void toolbar_action_entry_register(VikToolbar *vtb, GtkActionEntry *action) +{ + g_return_if_fail(VIK_IS_TOOLBAR(vtb)); + g_return_if_fail(action != NULL); + vtb->list_of_actions = g_slist_append(vtb->list_of_actions, action); +} + +static void configure_cb (GtkWidget *widget, gpointer user_data) +{ + config_t *data = (config_t*)user_data; + toolbar_configure ( data->vtb, data->vtb->widget, data->parent, data->vbox, data->hbox, data->reload_cb, data->user_data); +} + +static gboolean toolbar_popup_menu (GtkWidget *widget, GdkEventButton *event, gpointer user_data) +{ + // Only display menu on right button clicks + if (event->button == 3) { + GtkWidget *tmenu; + tmenu = gtk_menu_new(); + GtkWidget *item = gtk_menu_item_new_with_mnemonic ( _("_Customize") ); + g_signal_connect ( G_OBJECT(item), "activate", G_CALLBACK(configure_cb), user_data ); + gtk_menu_shell_append ( GTK_MENU_SHELL(tmenu), item ); + gtk_menu_popup ( GTK_MENU(tmenu), NULL, NULL, NULL, NULL, event->button, event->time ); + gtk_widget_show_all ( GTK_WIDGET(tmenu) ); + g_object_ref_sink (tmenu); + return TRUE; + } + return FALSE; +} + +/* sets the icon style of the toolbar */ +static void toolbar_set_icon_style (GtkWidget *toolbar) +{ + gint icon_style = prefs_get_icon_style(); + + if (icon_style == 0) + icon_style = ui_get_gtk_settings_integer("gtk-toolbar-style", GTK_TOOLBAR_ICONS); + else + // Adjust to enum GtkToolbarStyle + icon_style--; + + gtk_toolbar_set_style(GTK_TOOLBAR(toolbar), icon_style); +} + + +/* sets the icon size of the toolbar */ +static void toolbar_set_icon_size (GtkWidget *toolbar) +{ + gint icon_size = prefs_get_icon_size(); + + if ( icon_size == 0 ) + icon_size = ui_get_gtk_settings_integer("gtk-toolbar-icon-size", GTK_ICON_SIZE_SMALL_TOOLBAR); + else { + // Adjust to enum GtkIconSize + if ( icon_size == 1 ) + icon_size = GTK_ICON_SIZE_SMALL_TOOLBAR; + else if ( icon_size == 2 ) + icon_size = GTK_ICON_SIZE_LARGE_TOOLBAR; + else if ( icon_size == 3 ) + icon_size = GTK_ICON_SIZE_DND; + } + + gtk_toolbar_set_icon_size(GTK_TOOLBAR(toolbar), icon_size); +} + +/** + * toolbar_apply_settings: + * @vbox: Potential vertical container for the specified toolbar + * @hbox: Potential horizontal container for the specified toolbar + * @Reset: Specify if the toolbar should be reparented + * (when called externally this should always be TRUE) + * + * Updates the specified toolbar with current setting values + */ +void toolbar_apply_settings(VikToolbar *vtb, + GtkWidget *vbox, + GtkWidget *hbox, + gboolean reset) +{ + g_return_if_fail(VIK_IS_TOOLBAR(vtb)); + + if ( reset ) { + g_object_ref (vtb->widget); // ensure not deleted when removed + // Try both places it could be + if ( gtk_widget_get_parent (vtb->widget) == hbox ) + gtk_container_remove(GTK_CONTAINER(hbox), vtb->widget ); + if ( gtk_widget_get_parent (vtb->widget) == vbox ) + gtk_container_remove(GTK_CONTAINER(vbox), vtb->widget ); + } + + toolbar_set_icon_style(vtb->widget); + toolbar_set_icon_size(vtb->widget); + + /* add the toolbar again to the main window */ + // Use reorder to ensure toolbar always comes after the menu + if (prefs_get_append_to_menu()) + { + if ( hbox ) { + gtk_box_pack_start(GTK_BOX(hbox), vtb->widget, TRUE, TRUE, 0); + gtk_box_reorder_child(GTK_BOX(hbox), vtb->widget, 1); + } + } + else + { + if ( vbox ) { + gtk_box_pack_start(GTK_BOX(vbox), vtb->widget, FALSE, TRUE, 0); + gtk_box_reorder_child(GTK_BOX(vbox), vtb->widget, 1); + } + } +} + +/** + * toolbar_get_widget: + * + */ +GtkWidget* toolbar_get_widget(VikToolbar *vtb) +{ + g_return_val_if_fail(VIK_IS_TOOLBAR(vtb), NULL); + return vtb->widget; +} + +#include "toolbar.xml.h" +static void toolbar_reload ( VikToolbar *vtb, + const gchar *markup, + GtkWindow *parent, + GtkWidget *vbox, + GtkWidget *hbox, + ReloadCB reload_cb, + gpointer user_data ) +{ + GError *error = NULL; + g_debug ( "%s: %d", __FUNCTION__, g_hash_table_size(signal_data) ); + + /* Cleanup old toolbar */ + if (vtb->merge_id > 0) + { + /* Get rid of it! */ + gtk_widget_destroy(vtb->widget); + + gtk_ui_manager_remove_ui(vtb->uim, vtb->merge_id); + gtk_ui_manager_ensure_update(vtb->uim); + + g_hash_table_remove ( signal_data, vtb ); + } + + if (markup != NULL) + { + vtb->merge_id = gtk_ui_manager_add_ui_from_string(vtb->uim, markup, -1, &error); + } + else + { + gchar *filename = NULL; + /* Load the toolbar UI XML file from disk */ + // Consider using a_get_viking_data_path() first + filename = g_build_filename (a_get_viking_dir(), "ui_toolbar.xml", NULL); + vtb->merge_id = gtk_ui_manager_add_ui_from_file(vtb->uim, filename, &error); + g_free(filename); + } + if (error != NULL) + { + g_debug("UI creation failed, using internal fallback definition. Error message: %s", error->message); + g_error_free(error); + error = NULL; + + /* finally load the internally defined markup as fallback */ + vtb->merge_id = gtk_ui_manager_add_ui_from_string(vtb->uim, toolbar_xml, -1, &error); + if (error) { + // Abort - this should only happen if you're missing around with the code + g_error("Internal UI creation failed. Error message: %s", error->message); + } + + } + vtb->widget = gtk_ui_manager_get_widget(vtb->uim, "/ui/MainToolbar"); + + /* update button states */ + reload_cb ( vtb->group_actions, user_data ); + + toolbar_apply_settings(vtb, vbox, hbox, FALSE); + + gtk_widget_show(vtb->widget); + + /* Signals */ + config_t *data = g_malloc(sizeof(config_t)); + data->vtb = vtb; + data->parent = parent; + data->vbox = vbox; + data->hbox = hbox; + data->reload_cb = reload_cb; + data->user_data = user_data; + + // Store data in a hash so it can be freed when the toolbar is reconfigured + g_hash_table_insert (signal_data, vtb, data); + + g_signal_connect(vtb->widget, "button-press-event", G_CALLBACK(toolbar_popup_menu), data); + + /* We don't need to disconnect those signals as this is done automatically when the entry + * widgets are destroyed, happens when the toolbar itself is destroyed. */ +} + +static void toolbar_notify_style_cb(GObject *object, GParamSpec *arg1, gpointer data) +{ + const gchar *arg_name = g_param_spec_get_name(arg1); + gint value; + + if (prefs_get_icon_style() == 0 && !g_strcmp0(arg_name, "gtk-toolbar-style")) + { + value = ui_get_gtk_settings_integer(arg_name, GTK_TOOLBAR_ICONS); + if ( GTK_IS_TOOLBAR (data) ) + gtk_toolbar_set_style(GTK_TOOLBAR(data), value); + } + else if (prefs_get_icon_size() == 0 && !g_strcmp0(arg_name, "gtk-toolbar-size")) + { + value = ui_get_gtk_settings_integer(arg_name, GTK_ICON_SIZE_SMALL_TOOLBAR); + if ( GTK_IS_TOOLBAR (data) ) + gtk_toolbar_set_icon_size(GTK_TOOLBAR(data), value); + } +} + +/** + * toolbar_init: + * + * Initialize the specified toolbar using the given values + */ +void toolbar_init (VikToolbar *vtb, + GtkWindow *parent, + GtkWidget *vbox, + GtkWidget *hbox, + ToolCB tool_cb, + ReloadCB reload_cb, + gpointer user_data) +{ + vtb->uim = gtk_ui_manager_new(); + + vtb->group_actions = gtk_action_group_new("MainToolbar"); + gtk_action_group_set_translation_domain(vtb->group_actions, GETTEXT_PACKAGE); + GtkActionEntry *actions = NULL; + GSList *gl; + gint nn = 0; + foreach_slist(gl, vtb->list_of_actions) { + GtkActionEntry *action = gl->data; + actions = g_renew(GtkActionEntry, actions, nn+1); + actions[nn] = *action; + nn++; + } + gtk_action_group_add_actions(vtb->group_actions, actions, nn, user_data); + gtk_ui_manager_insert_action_group(vtb->uim, vtb->group_actions, 0); + + vtb->group_toggles = gtk_action_group_new("UIItems"); + gtk_action_group_set_translation_domain(vtb->group_toggles, GETTEXT_PACKAGE); + GtkToggleActionEntry *toggle_actions = NULL; + nn = 0; + foreach_slist(gl, vtb->list_of_toggles) { + GtkToggleActionEntry *action = gl->data; + toggle_actions = g_renew(GtkToggleActionEntry, toggle_actions, nn+1); + toggle_actions[nn] = *action; + nn++; + } + gtk_action_group_add_toggle_actions(vtb->group_toggles, toggle_actions, nn, user_data); + gtk_ui_manager_insert_action_group(vtb->uim, vtb->group_toggles, 0); + + vtb->group_tools = gtk_action_group_new("ToolItems"); + gtk_action_group_set_translation_domain(vtb->group_tools, GETTEXT_PACKAGE); + + GtkRadioActionEntry *tool_actions = NULL; + nn = 0; + foreach_slist(gl, vtb->list_of_tools) { + GtkRadioActionEntry *action = gl->data; + tool_actions = g_renew(GtkRadioActionEntry, tool_actions, nn+1); + tool_actions[nn] = *action; + tool_actions[nn].value = nn; + nn++; + } + gtk_action_group_add_radio_actions(vtb->group_tools, tool_actions, nn, 0, G_CALLBACK(tool_cb), user_data); + gtk_ui_manager_insert_action_group(vtb->uim, vtb->group_tools, 0); + + vtb->group_modes = gtk_action_group_new("ModeItems"); + gtk_action_group_set_translation_domain(vtb->group_modes, GETTEXT_PACKAGE); + + GtkRadioActionEntry *mode_actions = NULL; + nn = 0; + foreach_slist(gl, vtb->list_of_modes) { + GtkRadioActionEntry *action = gl->data; + mode_actions = g_renew(GtkRadioActionEntry, mode_actions, nn+1); + mode_actions[nn] = *action; + mode_actions[nn].value = nn; + nn++; + } + gtk_action_group_add_radio_actions(vtb->group_modes, mode_actions, nn, 0, G_CALLBACK(tool_cb), user_data); + gtk_ui_manager_insert_action_group(vtb->uim, vtb->group_modes, 0); + + toolbar_reload(vtb, NULL, parent, vbox, hbox, reload_cb, user_data); + +#if GTK_CHECK_VERSION(3, 0, 0) + gtk_style_context_add_class(gtk_widget_get_style_context(vtb->widget), "primary-toolbar"); +#endif + + GtkSettings *gtk_settings = gtk_widget_get_settings(vtb->widget); + if (gtk_settings != NULL) + { + g_signal_connect(gtk_settings, "notify::gtk-toolbar-style", + G_CALLBACK(toolbar_notify_style_cb), vtb->widget); + } + + extra_widget_data.vtb = vtb; + extra_widget_data.parent = parent; + extra_widget_data.vbox = vbox; + extra_widget_data.reload_cb = reload_cb; + extra_widget_data.user_data = user_data; +} + +/** + * toolbar_action_set_sensitive: + * + * Set sensitivity of a particular action + */ +void toolbar_action_set_sensitive (VikToolbar *vtb, const gchar *name, gboolean sensitive) +{ + g_return_if_fail(VIK_IS_TOOLBAR(vtb)); + g_return_if_fail(name != NULL); + // Try all groups + GtkAction *action = get_action ( vtb, name ); + if ( action ) + g_object_set ( action, "sensitive", sensitive, NULL); +} + +/** + * vik_toolbar_finalize: + * + * Memory cleanups upon toolbar destruction + */ +void vik_toolbar_finalize ( VikToolbar *vtb ) +{ + g_hash_table_remove ( signal_data, vtb ); + + /* unref'ing the GtkUIManager object will destroy all its widgets unless they were ref'ed */ + g_object_unref(vtb->uim); + g_object_unref(vtb->group_actions); + g_object_unref(vtb->group_tools); + g_object_unref(vtb->group_toggles); + g_object_unref(vtb->group_modes); + + g_slist_free(vtb->list_of_actions); + g_slist_free(vtb->list_of_tools); + g_slist_free(vtb->list_of_toggles); + g_slist_free(vtb->list_of_modes); +} + + +#define TB_EDITOR_SEPARATOR _("Separator") +#define TB_EDITOR_SEPARATOR_LABEL _("--- Separator ---") +typedef struct +{ + GtkWidget *dialog; + + GtkTreeView *tree_available; + GtkTreeView *tree_used; + + GtkListStore *store_available; + GtkListStore *store_used; + + GtkTreePath *last_drag_path; + GtkTreeViewDropPosition last_drag_pos; + + GtkWidget *drag_source; + + config_t config; +} TBEditorWidget; + +static const GtkTargetEntry tb_editor_dnd_targets[] = +{ + { "VIKING_TB_EDITOR_ROW", 0, 0 } +}; +static const gint tb_editor_dnd_targets_len = G_N_ELEMENTS(tb_editor_dnd_targets); + +enum +{ + TB_EDITOR_COL_ACTION, + TB_EDITOR_COL_LABEL, + TB_EDITOR_COL_ICON, + TB_EDITOR_COLS_MAX +}; + +static void tb_editor_handler_start_element(GMarkupParseContext *context, const gchar *element_name, + const gchar **attribute_names, + const gchar **attribute_values, gpointer data, + GError **error) +{ + gint i; + GSList **actions = data; + + /* This is very basic parsing, stripped down any error checking, requires a valid UI markup. */ + if (!g_strcmp0(element_name, "separator")) + *actions = g_slist_append(*actions, g_strdup(TB_EDITOR_SEPARATOR)); + + for (i = 0; attribute_names[i] != NULL; i++) + { + if (!g_strcmp0(attribute_names[i], "action")) + { + *actions = g_slist_append(*actions, g_strdup(attribute_values[i])); + } + } +} + + +static const GMarkupParser tb_editor_xml_parser = +{ + tb_editor_handler_start_element, NULL, NULL, NULL, NULL +}; + + +static GSList *tb_editor_parse_ui(const gchar *buffer, gssize length, GError **error) +{ + GMarkupParseContext *context; + GSList *list = NULL; + + context = g_markup_parse_context_new(&tb_editor_xml_parser, 0, &list, NULL); + g_markup_parse_context_parse(context, buffer, length, error); + g_markup_parse_context_free(context); + + return list; +} + + +static void tb_editor_set_item_values(VikToolbar *vtb, const gchar *name, GtkListStore *store, GtkTreeIter *iter) +{ + gchar *icon = NULL; + gchar *label = NULL; + gchar *label_clean = NULL; + + // Tries all action groups + GtkAction *action = get_action ( vtb, name ); + + if (action == NULL) { + if (!g_strcmp0(name, TB_EDITOR_SEPARATOR)) + label_clean = g_strdup(TB_EDITOR_SEPARATOR_LABEL); + else + return; + } + if (action != NULL) { + g_object_get(action, "icon-name", &icon, NULL); + if (icon == NULL) + g_object_get(action, "stock-id", &icon, NULL); + + g_object_get(action, "label", &label, NULL); + if (label != NULL) + label_clean = util_str_remove_chars(g_strdup(label), "_"); + } + + gtk_list_store_set(store, iter, + TB_EDITOR_COL_ACTION, name, + TB_EDITOR_COL_LABEL, label_clean, + TB_EDITOR_COL_ICON, icon, + -1); + + g_free(icon); + g_free(label); + g_free(label_clean); +} + + +static void tb_editor_scroll_to_iter(GtkTreeView *treeview, GtkTreeIter *iter) +{ + GtkTreePath *path = gtk_tree_model_get_path(gtk_tree_view_get_model(treeview), iter); + gtk_tree_view_scroll_to_cell(treeview, path, NULL, TRUE, 0.5, 0.0); + gtk_tree_path_free(path); +} + + +static void tb_editor_free_path(TBEditorWidget *tbw) +{ + if (tbw->last_drag_path != NULL) + { + gtk_tree_path_free(tbw->last_drag_path); + tbw->last_drag_path = NULL; + } +} + + +static void tb_editor_btn_remove_clicked_cb(GtkWidget *button, TBEditorWidget *tbw) +{ + GtkTreeModel *model_used; + GtkTreeSelection *selection_used; + GtkTreeIter iter_used, iter_new; + gchar *action_name; + + selection_used = gtk_tree_view_get_selection(tbw->tree_used); + if (gtk_tree_selection_get_selected(selection_used, &model_used, &iter_used)) + { + gtk_tree_model_get(model_used, &iter_used, TB_EDITOR_COL_ACTION, &action_name, -1); + if (gtk_list_store_remove(tbw->store_used, &iter_used)) + gtk_tree_selection_select_iter(selection_used, &iter_used); + + if (g_strcmp0(action_name, TB_EDITOR_SEPARATOR)) + { + gtk_list_store_append(tbw->store_available, &iter_new); + tb_editor_set_item_values(tbw->config.vtb, action_name, tbw->store_available, &iter_new); + tb_editor_scroll_to_iter(tbw->tree_available, &iter_new); + } + + g_free(action_name); + } +} + + +static void tb_editor_btn_add_clicked_cb(GtkWidget *button, TBEditorWidget *tbw) +{ + GtkTreeModel *model_available; + GtkTreeSelection *selection_available, *selection_used; + GtkTreeIter iter_available, iter_new, iter_selected; + gchar *action_name; + + selection_available = gtk_tree_view_get_selection(tbw->tree_available); + if (gtk_tree_selection_get_selected(selection_available, &model_available, &iter_available)) + { + gtk_tree_model_get(model_available, &iter_available, + TB_EDITOR_COL_ACTION, &action_name, -1); + if (g_strcmp0(action_name, TB_EDITOR_SEPARATOR)) + { + if (gtk_list_store_remove(tbw->store_available, &iter_available)) + gtk_tree_selection_select_iter(selection_available, &iter_available); + } + + selection_used = gtk_tree_view_get_selection(tbw->tree_used); + if (gtk_tree_selection_get_selected(selection_used, NULL, &iter_selected)) + gtk_list_store_insert_before(tbw->store_used, &iter_new, &iter_selected); + else + gtk_list_store_append(tbw->store_used, &iter_new); + + tb_editor_set_item_values(tbw->config.vtb, action_name, tbw->store_used, &iter_new); + tb_editor_scroll_to_iter(tbw->tree_used, &iter_new); + + g_free(action_name); + } +} + + +static gboolean tb_editor_drag_motion_cb(GtkWidget *widget, GdkDragContext *drag_context, + gint x, gint y, guint ltime, TBEditorWidget *tbw) +{ + if (tbw->last_drag_path != NULL) + gtk_tree_path_free(tbw->last_drag_path); + gtk_tree_view_get_drag_dest_row(GTK_TREE_VIEW(widget), + &(tbw->last_drag_path), &(tbw->last_drag_pos)); + + return FALSE; +} + + +static void tb_editor_drag_data_get_cb(GtkWidget *widget, GdkDragContext *context, + GtkSelectionData *data, guint info, guint ltime, + TBEditorWidget *tbw) +{ + GtkTreeIter iter; + GtkTreeSelection *selection; + GtkTreeModel *model; + GdkAtom atom; + gchar *name; + + selection = gtk_tree_view_get_selection(GTK_TREE_VIEW(widget)); + if (! gtk_tree_selection_get_selected(selection, &model, &iter)) + return; + + gtk_tree_model_get(model, &iter, TB_EDITOR_COL_ACTION, &name, -1); + if (G_UNLIKELY(EMPTY(name))) + { + g_free(name); + return; + } + + atom = gdk_atom_intern(tb_editor_dnd_targets[0].target, FALSE); + gtk_selection_data_set(data, atom, 8, (guchar*) name, strlen(name)); + + g_free(name); + + tbw->drag_source = widget; +} + + +static void tb_editor_drag_data_rcvd_cb(GtkWidget *widget, GdkDragContext *context, + gint x, gint y, GtkSelectionData *data, guint info, + guint ltime, TBEditorWidget *tbw) +{ + GtkTreeView *tree = GTK_TREE_VIEW(widget); + gboolean del = FALSE; + + if (gtk_selection_data_get_length(data) >= 0 && gtk_selection_data_get_format(data) == 8) + { + gboolean is_sep; + gchar *text = NULL; + + text = (gchar*) gtk_selection_data_get_data(data); + is_sep = !g_strcmp0(text, TB_EDITOR_SEPARATOR); + /* If the source of the action is equal to the target, we do just re-order and so need + * to delete the separator to get it moved, not just copied. */ + if (is_sep && widget == tbw->drag_source) + is_sep = FALSE; + + if (tree != tbw->tree_available || ! is_sep) + { + GtkTreeIter iter, iter_before, *iter_before_ptr; + GtkListStore *store = GTK_LIST_STORE(gtk_tree_view_get_model(tree)); + + if (tbw->last_drag_path != NULL) + { + gtk_tree_model_get_iter(GTK_TREE_MODEL(store), &iter_before, tbw->last_drag_path); + + if (gtk_list_store_iter_is_valid(store, &iter_before)) + iter_before_ptr = &iter_before; + else + iter_before_ptr = NULL; + + if (tbw->last_drag_pos == GTK_TREE_VIEW_DROP_BEFORE || + tbw->last_drag_pos == GTK_TREE_VIEW_DROP_INTO_OR_BEFORE) + gtk_list_store_insert_before(store, &iter, iter_before_ptr); + else + gtk_list_store_insert_after(store, &iter, iter_before_ptr); + } + else + gtk_list_store_append(store, &iter); + + tb_editor_set_item_values(tbw->config.vtb, text, store, &iter); + tb_editor_scroll_to_iter(tree, &iter); + } + if (tree != tbw->tree_used || ! is_sep) + del = TRUE; + } + + tbw->drag_source = NULL; /* reset the value just to be sure */ + tb_editor_free_path(tbw); + gtk_drag_finish(context, TRUE, del, ltime); +} + + +static gboolean tb_editor_foreach_used(GtkTreeModel *model, GtkTreePath *path, + GtkTreeIter *iter, gpointer data) +{ + gchar *action_name; + + gtk_tree_model_get(model, iter, TB_EDITOR_COL_ACTION, &action_name, -1); + + if (!g_strcmp0(action_name, TB_EDITOR_SEPARATOR)) + g_string_append_printf(data, "\t\t\n"); + else if (G_LIKELY(!EMPTY(action_name))) + g_string_append_printf(data, "\t\t\n", action_name); + + g_free(action_name); + return FALSE; +} + + +static void tb_editor_write_markup(TBEditorWidget *tbw) +{ + /* must be the first tag, otherwise gtk_ui_manager_add_ui_from_string() will fail. */ + const gchar *template = "\n\n\ +\t\n"; + GString *str = g_string_new(template); + + gtk_tree_model_foreach(GTK_TREE_MODEL(tbw->store_used), tb_editor_foreach_used, str); + + g_string_append(str, "\t\n\n"); + + toolbar_reload(tbw->config.vtb, + str->str, + tbw->config.parent, + tbw->config.vbox, + tbw->config.hbox, + tbw->config.reload_cb, + tbw->config.user_data); + + // ATM always save the toolbar when changed + gchar *filename = g_build_filename(a_get_viking_dir (), "ui_toolbar.xml", NULL); + GError *error = NULL; + if (! g_file_set_contents(filename, str->str, -1, &error)) { + g_warning ("%s: could not write to file %s (%s)", __FUNCTION__, filename, error->message); + g_error_free(error); + } + g_free(filename); + + g_string_free(str, TRUE); +} + + +static void tb_editor_available_items_changed_cb(GtkTreeModel *model, GtkTreePath *arg1, + GtkTreeIter *arg2, TBEditorWidget *tbw) +{ + tb_editor_write_markup(tbw); +} + + +static void tb_editor_available_items_deleted_cb(GtkTreeModel *model, GtkTreePath *arg1, + TBEditorWidget *tbw) +{ + tb_editor_write_markup(tbw); +} + + +static TBEditorWidget *tb_editor_create_dialog(VikToolbar *vtb, GtkWindow *parent, GtkWidget *toolbar, GtkWidget *vbox, GtkWidget *menu_hbox, ReloadCB reload_cb, gpointer user_data) +{ + GtkWidget *dialog, *hbox, *vbox_buttons, *button_add, *button_remove; + GtkWidget *swin_available, *swin_used, *tree_available, *tree_used, *label; + GtkCellRenderer *text_renderer, *icon_renderer; + GtkTreeViewColumn *column; + + if (parent == NULL) { + g_warning ( "No parent" ); + return NULL; + } + + TBEditorWidget *tbw = g_new0(TBEditorWidget, 1); + + dialog = gtk_dialog_new_with_buttons(_("Customize Toolbar"), + GTK_WINDOW(parent), + GTK_DIALOG_DESTROY_WITH_PARENT, + GTK_STOCK_CLOSE, GTK_RESPONSE_CLOSE, NULL); + gtk_widget_set_name(dialog, "VikingDialog"); + gtk_window_set_default_size(GTK_WINDOW(dialog), -1, 400); + gtk_dialog_set_default_response(GTK_DIALOG(dialog), GTK_RESPONSE_CLOSE); + + tbw->store_available = gtk_list_store_new(TB_EDITOR_COLS_MAX, + G_TYPE_STRING, G_TYPE_STRING, G_TYPE_STRING); + tbw->store_used = gtk_list_store_new(TB_EDITOR_COLS_MAX, + G_TYPE_STRING, G_TYPE_STRING, G_TYPE_STRING); + + tbw->config.vtb = vtb; + tbw->config.parent = parent; + tbw->config.vbox = vbox; + tbw->config.hbox = menu_hbox; + tbw->config.reload_cb = reload_cb; + tbw->config.user_data = user_data; + + label = gtk_label_new( + _("Select items to be displayed on the toolbar. Items can be reordered by drag and drop.")); + gtk_misc_set_alignment(GTK_MISC(label), 0.0, 0.5); + + tree_available = gtk_tree_view_new(); + gtk_tree_view_set_model(GTK_TREE_VIEW(tree_available), GTK_TREE_MODEL(tbw->store_available)); + gtk_tree_view_set_rules_hint(GTK_TREE_VIEW(tree_available), TRUE); + gtk_tree_sortable_set_sort_column_id( + GTK_TREE_SORTABLE(tbw->store_available), TB_EDITOR_COL_LABEL, GTK_SORT_ASCENDING); + + icon_renderer = gtk_cell_renderer_pixbuf_new(); + column = gtk_tree_view_column_new_with_attributes( + NULL, icon_renderer, "stock-id", TB_EDITOR_COL_ICON, NULL); + gtk_tree_view_append_column(GTK_TREE_VIEW(tree_available), column); + + text_renderer = gtk_cell_renderer_text_new(); + column = gtk_tree_view_column_new_with_attributes( + _("Available Items"), text_renderer, "text", TB_EDITOR_COL_LABEL, NULL); + gtk_tree_view_append_column(GTK_TREE_VIEW(tree_available), column); + + swin_available = gtk_scrolled_window_new(NULL, NULL); + gtk_scrolled_window_set_policy(GTK_SCROLLED_WINDOW(swin_available), + GTK_POLICY_NEVER, GTK_POLICY_AUTOMATIC); + gtk_scrolled_window_set_shadow_type(GTK_SCROLLED_WINDOW(swin_available), GTK_SHADOW_ETCHED_IN); + gtk_container_add(GTK_CONTAINER(swin_available), tree_available); + + tree_used = gtk_tree_view_new(); + gtk_tree_view_set_model(GTK_TREE_VIEW(tree_used), GTK_TREE_MODEL(tbw->store_used)); + gtk_tree_view_set_rules_hint(GTK_TREE_VIEW(tree_used), TRUE); + gtk_tree_view_set_reorderable(GTK_TREE_VIEW(tree_used), TRUE); + + icon_renderer = gtk_cell_renderer_pixbuf_new(); + column = gtk_tree_view_column_new_with_attributes( + NULL, icon_renderer, "stock-id", TB_EDITOR_COL_ICON, NULL); + gtk_tree_view_append_column(GTK_TREE_VIEW(tree_used), column); + + text_renderer = gtk_cell_renderer_text_new(); + column = gtk_tree_view_column_new_with_attributes( + _("Displayed Items"), text_renderer, "text", TB_EDITOR_COL_LABEL, NULL); + gtk_tree_view_append_column(GTK_TREE_VIEW(tree_used), column); + + swin_used = gtk_scrolled_window_new(NULL, NULL); + gtk_scrolled_window_set_policy(GTK_SCROLLED_WINDOW(swin_used), + GTK_POLICY_NEVER, GTK_POLICY_AUTOMATIC); + gtk_scrolled_window_set_shadow_type(GTK_SCROLLED_WINDOW(swin_used), GTK_SHADOW_ETCHED_IN); + gtk_container_add(GTK_CONTAINER(swin_used), tree_used); + + /* drag'n'drop */ + gtk_tree_view_enable_model_drag_source(GTK_TREE_VIEW(tree_available), GDK_BUTTON1_MASK, + tb_editor_dnd_targets, tb_editor_dnd_targets_len, GDK_ACTION_MOVE); + gtk_tree_view_enable_model_drag_dest(GTK_TREE_VIEW(tree_available), + tb_editor_dnd_targets, tb_editor_dnd_targets_len, GDK_ACTION_MOVE); + g_signal_connect(tree_available, "drag-data-get", + G_CALLBACK(tb_editor_drag_data_get_cb), tbw); + g_signal_connect(tree_available, "drag-data-received", + G_CALLBACK(tb_editor_drag_data_rcvd_cb), tbw); + g_signal_connect(tree_available, "drag-motion", + G_CALLBACK(tb_editor_drag_motion_cb), tbw); + + gtk_tree_view_enable_model_drag_source(GTK_TREE_VIEW(tree_used), GDK_BUTTON1_MASK, + tb_editor_dnd_targets, tb_editor_dnd_targets_len, GDK_ACTION_MOVE); + gtk_tree_view_enable_model_drag_dest(GTK_TREE_VIEW(tree_used), + tb_editor_dnd_targets, tb_editor_dnd_targets_len, GDK_ACTION_MOVE); + g_signal_connect(tree_used, "drag-data-get", + G_CALLBACK(tb_editor_drag_data_get_cb), tbw); + g_signal_connect(tree_used, "drag-data-received", + G_CALLBACK(tb_editor_drag_data_rcvd_cb), tbw); + g_signal_connect(tree_used, "drag-motion", + G_CALLBACK(tb_editor_drag_motion_cb), tbw); + + + button_add = ui_button_new_with_image(GTK_STOCK_GO_FORWARD, NULL); + button_remove = ui_button_new_with_image(GTK_STOCK_GO_BACK, NULL); + g_signal_connect(button_add, "clicked", G_CALLBACK(tb_editor_btn_add_clicked_cb), tbw); + g_signal_connect(button_remove, "clicked", G_CALLBACK(tb_editor_btn_remove_clicked_cb), tbw); + + vbox_buttons = gtk_vbox_new(FALSE, 6); + /* FIXME this is a little hack'ish, any better ideas? */ + gtk_box_pack_start(GTK_BOX(vbox_buttons), gtk_label_new(""), TRUE, TRUE, 0); + gtk_box_pack_start(GTK_BOX(vbox_buttons), button_add, FALSE, FALSE, 0); + gtk_box_pack_start(GTK_BOX(vbox_buttons), button_remove, FALSE, FALSE, 0); + gtk_box_pack_start(GTK_BOX(vbox_buttons), gtk_label_new(""), TRUE, TRUE, 0); + + hbox = gtk_hbox_new(FALSE, 6); + gtk_box_pack_start(GTK_BOX(hbox), swin_available, TRUE, TRUE, 0); + gtk_box_pack_start(GTK_BOX(hbox), vbox_buttons, FALSE, FALSE, 0); + gtk_box_pack_start(GTK_BOX(hbox), swin_used, TRUE, TRUE, 0); + + gtk_box_pack_start(GTK_BOX(GTK_DIALOG(dialog)->vbox), label, FALSE, FALSE, 6); + gtk_box_pack_start(GTK_BOX(GTK_DIALOG(dialog)->vbox), hbox, TRUE, TRUE, 0); + + gtk_widget_show_all(dialog); + + g_object_unref(tbw->store_available); + g_object_unref(tbw->store_used); + + tbw->dialog = dialog; + tbw->tree_available = GTK_TREE_VIEW(tree_available); + tbw->tree_used = GTK_TREE_VIEW(tree_used); + + tbw->last_drag_path = NULL; + + return tbw; +} + +/** + * toolbar_configure: + * + */ +void toolbar_configure (VikToolbar *vtb, GtkWidget *toolbar, GtkWindow *parent, GtkWidget *vbox, GtkWidget *hbox, ReloadCB reload_cb, gpointer user_data) +{ + gchar *markup; + const gchar *name; + GSList *sl, *used_items; + GList *l, *all_items; + GtkTreeIter iter; + GtkTreePath *path; + TBEditorWidget *tbw; + + /* read the current active toolbar items */ + markup = gtk_ui_manager_get_ui(vtb->uim); + used_items = tb_editor_parse_ui(markup, -1, NULL); + g_free(markup); + + /* get all available actions */ + all_items = gtk_action_group_list_actions(vtb->group_actions); + all_items = g_list_concat ( all_items, gtk_action_group_list_actions(vtb->group_toggles) ); + all_items = g_list_concat ( all_items, gtk_action_group_list_actions(vtb->group_tools) ); + all_items = g_list_concat ( all_items, gtk_action_group_list_actions(vtb->group_modes) ); + + /* create the GUI */ + tbw = tb_editor_create_dialog(vtb, parent, toolbar, vbox, hbox, reload_cb, user_data); + + /* fill the stores */ + gtk_list_store_insert_with_values(tbw->store_available, NULL, -1, + TB_EDITOR_COL_ACTION, TB_EDITOR_SEPARATOR, + TB_EDITOR_COL_LABEL, TB_EDITOR_SEPARATOR_LABEL, + -1); + foreach_list(l, all_items) + { + name = gtk_action_get_name(l->data); + if (g_slist_find_custom(used_items, name, (GCompareFunc) strcmp) == NULL) + { + gtk_list_store_append(tbw->store_available, &iter); + tb_editor_set_item_values(vtb, name, tbw->store_available, &iter); + } + } + foreach_slist(sl, used_items) + { + // Ensure only valid actions are added to the list + if ( get_action(vtb, sl->data) ) { + gtk_list_store_append(tbw->store_used, &iter); + tb_editor_set_item_values(vtb, sl->data, tbw->store_used, &iter); + } + } + /* select first item */ + path = gtk_tree_path_new_from_string("0"); + gtk_tree_selection_select_path(gtk_tree_view_get_selection(tbw->tree_used), path); + gtk_tree_path_free(path); + + /* connect the changed signals after populating the store */ + g_signal_connect(tbw->store_used, "row-changed", + G_CALLBACK(tb_editor_available_items_changed_cb), tbw); + g_signal_connect(tbw->store_used, "row-deleted", + G_CALLBACK(tb_editor_available_items_deleted_cb), tbw); + + /* run it */ + gtk_dialog_run(GTK_DIALOG(tbw->dialog)); + + gtk_widget_destroy(tbw->dialog); + + g_slist_foreach(used_items, (GFunc) g_free, NULL); + g_slist_free(used_items); + g_list_free(all_items); + tb_editor_free_path(tbw); + g_free(tbw); +} diff --git a/src/toolbar.h b/src/toolbar.h new file mode 100644 index 0000000..4ab8db1 --- /dev/null +++ b/src/toolbar.h @@ -0,0 +1,80 @@ +/* -*- Mode: C; indent-tabs-mode: t; c-basic-offset: 4; tab-width: 4 -*- */ +/* + * toolbar.h - this file was part of Geany (v1.24.1), a fast and lightweight IDE + * + * Copyright 2009-2012 Enrico Tröger + * Copyright 2009-2012 Nick Treleaven + * Copyright 2014 Rob Norris + * + * 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. + */ + +#ifndef VIKING_TOOLBAR_H +#define VIKING_TOOLBAR_H 1 + +#include + +G_BEGIN_DECLS + +#define VIK_TOOLBAR_TYPE (vik_toolbar_get_type ()) +#define VIK_TOOLBAR(obj) (G_TYPE_CHECK_INSTANCE_CAST ((obj), VIK_TOOLBAR_TYPE, VikToolbar)) +#define VIK_TOOLBAR_CLASS(klass) (G_TYPE_CHECK_CLASS_CAST ((klass), VIK_TOOLBAR_TYPE, VikToolbarClass)) +#define VIK_IS_TOOLBAR(obj) (G_TYPE_CHECK_INSTANCE_TYPE ((obj), VIK_TOOLBAR_TYPE)) +#define VIK_IS_TOOLBAR_CLASS(klass) (G_TYPE_CHECK_CLASS_TYPE ((klass), VIK_TOOLBAR_TYPE)) +#define VIK_TOOLBAR_GET_CLASS(obj) (G_TYPE_INSTANCE_GET_CLASS ((obj), VIK_TOOLBAR_TYPE, VikToolbarClass)) + +typedef struct _VikToolbarClass VikToolbarClass; +typedef struct _VikToolbar VikToolbar; + +GType vik_toolbar_get_type (); + +VikToolbar *vik_toolbar_new (void); +void vik_toolbar_finalize ( VikToolbar *vtb ); + +GtkWidget *toolbar_get_widget_by_name(VikToolbar *vtb, const gchar *name); +GtkAction *toolbar_get_action_by_name(VikToolbar *vtb, const gchar *name); + +void toolbar_action_tool_entry_register(VikToolbar *vtb, GtkRadioActionEntry *action); +void toolbar_action_mode_entry_register(VikToolbar *vtb, GtkRadioActionEntry *action); +void toolbar_action_toggle_entry_register(VikToolbar *vtb, GtkToggleActionEntry *action, gpointer callback); +void toolbar_action_entry_register(VikToolbar *vtb, GtkActionEntry *action); + +void toolbar_action_set_sensitive (VikToolbar *vtb, const gchar *name, gboolean sensitive); + +typedef void (ToolCB) (GtkAction *, GtkAction *, gpointer); // gpointer is actually a VikWindow +typedef void (ReloadCB) (GtkActionGroup *, gpointer); // gpointer is actually a VikWindow + +void toolbar_init(VikToolbar *vtb, + GtkWindow *parent, + GtkWidget *vbox, + GtkWidget *hbox, + ToolCB tool_cb, + ReloadCB reload_cb, + gpointer user_data); + +void toolbar_apply_settings(VikToolbar *vtb, + GtkWidget *vbox, + GtkWidget *hbox, + gboolean reset); + +GtkWidget* toolbar_get_widget(VikToolbar *vtb); + +void a_toolbar_init (void); + +void a_toolbar_uninit (void); + +G_END_DECLS + +#endif diff --git a/src/toolbar.xml.h b/src/toolbar.xml.h new file mode 100644 index 0000000..70bd5d7 --- /dev/null +++ b/src/toolbar.xml.h @@ -0,0 +1,51 @@ +#include "config.h" +#ifndef __VIKING_TOOBAR_XML_H +#define __VIKING_TOOBAR_XML_H + +static const char *toolbar_xml = +"" +" " +" " +" " +" " +" " +" " +" " +" " +" " +" " +" " +" " +" " +" " +" " +" " +" " +" " +" " +" " +" " +" " +" " +" " +" " +" " +" " +" " +" " +" " +" " +" " +" " +" " +" " +" " +#ifdef HAVE_LIBMAPNIK +" " +" " +#endif +" " +"" +; + +#endif diff --git a/src/ui_util.c b/src/ui_util.c new file mode 100644 index 0000000..017acf5 --- /dev/null +++ b/src/ui_util.c @@ -0,0 +1,342 @@ +/* -*- Mode: C; indent-tabs-mode: t; c-basic-offset: 4; tab-width: 4 -*- */ +/* + * Viking - GPS data editor + * Copyright (C) 2014, Rob Norris + * Copyright 2006-2012 Enrico Tröger + * Copyright 2006-2012 Nick Treleaven + * Copyright 2011-2012 Matthew Brush + * + * 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 St, Fifth Floor, Boston, MA 02110-1301 USA + */ + /* + * Ideally dependencies should just be on Gtk, + * see vikutils for things that further depend on other Viking types + * see utils for things only depend on Glib + */ +#ifdef HAVE_CONFIG_H +#include "config.h" +#endif + +#include +#include +#include + +#include "util.h" +#include "dialog.h" +#include "settings.h" + +#ifdef WINDOWS +#include +#endif + + +#ifndef WINDOWS +static gboolean spawn_command_line_async(const gchar * cmd, + const gchar * arg) +{ + gchar *cmdline = NULL; + gboolean status; + + cmdline = g_strdup_printf("%s '%s'", cmd, arg); + g_debug("Running: %s", cmdline); + + status = g_spawn_command_line_async(cmdline, NULL); + + g_free(cmdline); + + return status; +} +#endif + + +// Annoyingly gtk_show_uri() doesn't work so resort to ShellExecute method +// (non working at least in our Windows build with GTK+2.24.10 on Windows 7) + +void open_url(GtkWindow *parent, const gchar * url) +{ +#ifdef WINDOWS + ShellExecute(NULL, NULL, (char *) url, NULL, ".\\", 0); +#else + gboolean use_browser = FALSE; + if ( a_settings_get_boolean ( "use_env_browser", &use_browser ) ) { + const gchar *browser = g_getenv("BROWSER"); + if (browser == NULL || browser[0] == '\0') { + browser = "firefox"; + } + if (spawn_command_line_async(browser, url)) { + return; + } + else + g_warning("Failed to run: %s on %s", browser, url); + } + else { + GError *error = NULL; + gtk_show_uri ( gtk_widget_get_screen (GTK_WIDGET(parent)), url, GDK_CURRENT_TIME, &error ); + if ( error ) { + a_dialog_error_msg_extra ( parent, _("Could not launch web browser. %s"), error->message ); + g_error_free ( error ); + } + } +#endif +} + +void new_email(GtkWindow *parent, const gchar * address) +{ + gchar *uri = g_strdup_printf("mailto:%s", address); + GError *error = NULL; + gtk_show_uri ( gtk_widget_get_screen (GTK_WIDGET(parent)), uri, GDK_CURRENT_TIME, &error ); + if ( error ) { + a_dialog_error_msg_extra ( parent, _("Could not create new email. %s"), error->message ); + g_error_free ( error ); + } + /* +#ifdef WINDOWS + ShellExecute(NULL, NULL, (char *) uri, NULL, ".\\", 0); +#else + if (!spawn_command_line_async("xdg-email", uri)) + a_dialog_error_msg ( parent, _("Could not create new email.") ); +#endif + */ + g_free(uri); + uri = NULL; +} + +/** Creates a @c GtkButton with custom text and a stock image similar to + * @c gtk_button_new_from_stock(). + * @param stock_id A @c GTK_STOCK_NAME string. + * @param text Button label text, can include mnemonics. + * @return The new @c GtkButton. + */ +GtkWidget *ui_button_new_with_image(const gchar *stock_id, const gchar *text) +{ + GtkWidget *image, *button; + + button = gtk_button_new_with_mnemonic(text); + gtk_widget_show(button); + image = gtk_image_new_from_stock(stock_id, GTK_ICON_SIZE_BUTTON); + gtk_button_set_image(GTK_BUTTON(button), image); + // note: image is shown by gtk + return button; +} + +/** Reads an integer from the GTK default settings registry + * (see http://library.gnome.org/devel/gtk/stable/GtkSettings.html). + * @param property_name The property to read. + * @param default_value The default value in case the value could not be read. + * @return The value for the property if it exists, otherwise the @a default_value. + */ +gint ui_get_gtk_settings_integer(const gchar *property_name, gint default_value) +{ + if (g_object_class_find_property(G_OBJECT_GET_CLASS(G_OBJECT( + gtk_settings_get_default())), property_name)) + { + gint value; + g_object_get(G_OBJECT(gtk_settings_get_default()), property_name, &value, NULL); + return value; + } + else + return default_value; +} + + +/** Returns a widget from a name in a component, usually created by Glade. + * Call it with the toplevel widget in the component (i.e. a window/dialog), + * or alternatively any widget in the component, and the name of the widget + * you want returned. + * @param widget Widget with the @a widget_name property set. + * @param widget_name Name to lookup. + * @return The widget found. + * @see ui_hookup_widget(). + * + */ +GtkWidget *ui_lookup_widget(GtkWidget *widget, const gchar *widget_name) +{ + GtkWidget *parent, *found_widget; + + g_return_val_if_fail(widget != NULL, NULL); + g_return_val_if_fail(widget_name != NULL, NULL); + + for (;;) + { + if (GTK_IS_MENU(widget)) + parent = gtk_menu_get_attach_widget(GTK_MENU(widget)); + else + parent = gtk_widget_get_parent(widget); + if (parent == NULL) + parent = (GtkWidget*) g_object_get_data(G_OBJECT(widget), "GladeParentKey"); + if (parent == NULL) + break; + widget = parent; + } + + found_widget = (GtkWidget*) g_object_get_data(G_OBJECT(widget), widget_name); + if (G_UNLIKELY(found_widget == NULL)) + g_warning("Widget not found: %s", widget_name); + return found_widget; +} + +/** + * Returns a label widget that is made selectable (i.e. the user can copy the text) + * @param text String to display - maybe NULL + * @return The label widget + */ +GtkWidget* ui_label_new_selectable ( const gchar* text ) +{ + GtkWidget *widget = gtk_label_new ( text ); + gtk_label_set_selectable ( GTK_LABEL(widget), TRUE ); + return widget; +} + +/** + * Apply the alpha value to the specified pixbuf + */ +GdkPixbuf *ui_pixbuf_set_alpha ( GdkPixbuf *pixbuf, guint8 alpha ) +{ + guchar *pixels; + gint width, height, iii, jjj; + + if ( ! gdk_pixbuf_get_has_alpha ( pixbuf ) ) + { + GdkPixbuf *tmp = gdk_pixbuf_add_alpha(pixbuf,FALSE,0,0,0); + g_object_unref(G_OBJECT(pixbuf)); + pixbuf = tmp; + if ( !pixbuf ) + return NULL; + } + + pixels = gdk_pixbuf_get_pixels(pixbuf); + width = gdk_pixbuf_get_width(pixbuf); + height = gdk_pixbuf_get_height(pixbuf); + + /* r,g,b,a,r,g,b,a.... */ + for (iii = 0; iii < width; iii++) for (jjj = 0; jjj < height; jjj++) + { + pixels += 3; + if ( *pixels != 0 ) + *pixels = alpha; + pixels++; + } + return pixbuf; +} + + +/** + * Reduce the alpha value of the specified pixbuf by alpha / 255 + */ +GdkPixbuf *ui_pixbuf_scale_alpha ( GdkPixbuf *pixbuf, guint8 alpha ) +{ + guchar *pixels; + gint width, height, iii, jjj; + + if ( ! gdk_pixbuf_get_has_alpha ( pixbuf ) ) + { + GdkPixbuf *tmp = gdk_pixbuf_add_alpha(pixbuf,FALSE,0,0,0); + g_object_unref(G_OBJECT(pixbuf)); + pixbuf = tmp; + if ( !pixbuf ) + return NULL; + } + + pixels = gdk_pixbuf_get_pixels(pixbuf); + width = gdk_pixbuf_get_width(pixbuf); + height = gdk_pixbuf_get_height(pixbuf); + + /* r,g,b,a,r,g,b,a.... */ + for (iii = 0; iii < width; iii++) for (jjj = 0; jjj < height; jjj++) + { + pixels += 3; + if ( *pixels != 0 ) + *pixels = (guint8)(((guint16)*pixels * (guint16)alpha) / 255); + pixels++; + } + return pixbuf; +} + + + +/** + * + */ +void ui_add_recent_file ( const gchar *filename ) +{ + if ( filename ) { + GtkRecentManager *manager = gtk_recent_manager_get_default(); + GFile *file = g_file_new_for_commandline_arg ( filename ); + gchar *uri = g_file_get_uri ( file ); + if ( uri && manager ) + gtk_recent_manager_add_item ( manager, uri ); + g_object_unref( file ); + g_free (uri); + } +} + +/** + * Clear the entry text if the specified icon is pressed + */ +static void ui_icon_clear_entry ( GtkEntry *entry, + GtkEntryIconPosition position, + GdkEventButton *event, + gpointer data ) +{ + if ( position == GPOINTER_TO_INT(data) ) + gtk_entry_set_text ( entry, "" ); +} + +static void +text_changed_cb (GtkEntry *entry, + GParamSpec *pspec, + gpointer data) +{ + if ( data ) { + gboolean has_text = gtk_entry_get_text_length(entry) > 0; + gtk_entry_set_icon_sensitive ( entry, GPOINTER_TO_INT(data), has_text ); + } +} + +/** + * Create an entry field with an icon to clear the entry + * + * Ideal for entries used for getting user entered transitory data, + * so it is easy to delete the text and start again. + */ +GtkWidget *ui_entry_new ( const gchar *str, GtkEntryIconPosition position ) +{ + GtkWidget *entry = gtk_entry_new(); + if ( str ) + gtk_entry_set_text ( GTK_ENTRY(entry), str ); + gtk_entry_set_icon_from_stock ( GTK_ENTRY(entry), position, GTK_STOCK_CLEAR ); +#if GTK_CHECK_VERSION (2,20,0) + text_changed_cb ( GTK_ENTRY(entry), NULL, GINT_TO_POINTER(position) ); + g_signal_connect ( entry, "notify::text", G_CALLBACK(text_changed_cb), GINT_TO_POINTER(position) ); +#endif + g_signal_connect ( entry, "icon-release", G_CALLBACK(ui_icon_clear_entry), GINT_TO_POINTER(position) ); + return entry; +} + +/** + * Create a spinbutton with an icon to clear the entry + * + * Ideal for entries used for getting user entered transitory data, + * so it is easy to delete the number and start again. + */ +GtkWidget *ui_spin_button_new ( GtkAdjustment *adjustment, + gdouble climb_rate, + guint digits ) +{ + GtkWidget *spin = gtk_spin_button_new ( adjustment, climb_rate, digits ); + gtk_entry_set_icon_from_stock ( GTK_ENTRY(spin), GTK_ENTRY_ICON_PRIMARY, GTK_STOCK_CLEAR ); + g_signal_connect ( spin, "icon-release", G_CALLBACK(ui_icon_clear_entry), GINT_TO_POINTER(GTK_ENTRY_ICON_PRIMARY) ); + return spin; +} diff --git a/src/ui_util.h b/src/ui_util.h new file mode 100644 index 0000000..5ca34ac --- /dev/null +++ b/src/ui_util.h @@ -0,0 +1,50 @@ +/* -*- Mode: C; indent-tabs-mode: t; c-basic-offset: 4; tab-width: 4 -*- */ +/* + * viking -- GPS Data and Topo Analyzer, Explorer, and Manager + * + * Copyright (C) 2007-2009, Guilhem Bonnefille + * Copyright (C) 2014, Rob Norris + * + * 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., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA + * + */ + +#ifndef _VIKING_UI_UTIL_H +#define _VIKING_UI_UTIL_H + +#include +#include + +G_BEGIN_DECLS + +void open_url(GtkWindow *parent, const gchar * url); +void new_email(GtkWindow *parent, const gchar * address); + +GtkWidget *ui_button_new_with_image(const gchar *stock_id, const gchar *text); +gint ui_get_gtk_settings_integer(const gchar *property_name, gint default_value); +GtkWidget *ui_lookup_widget(GtkWidget *widget, const gchar *widget_name); +GtkWidget* ui_label_new_selectable ( const gchar* text ); +GtkWidget *ui_entry_new ( const gchar *str, GtkEntryIconPosition position ); +GtkWidget *ui_spin_button_new ( GtkAdjustment *adjustment, + gdouble climb_rate, + guint digits ); + +GdkPixbuf *ui_pixbuf_set_alpha ( GdkPixbuf *pixbuf, guint8 alpha ); +GdkPixbuf *ui_pixbuf_scale_alpha ( GdkPixbuf *pixbuf, guint8 alpha ); +void ui_add_recent_file ( const gchar *filename ); + +G_END_DECLS + +#endif diff --git a/src/uibuilder.c b/src/uibuilder.c new file mode 100644 index 0000000..d37c1ff --- /dev/null +++ b/src/uibuilder.c @@ -0,0 +1,630 @@ +/* + * viking -- GPS Data and Topo Analyzer, Explorer, and Manager + * + * Copyright (C) 2003-2007, Evan Battaglia + * + * 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., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA + * + */ +#ifdef HAVE_CONFIG_H +#include "config.h" +#endif + +#include +#include +#include "dialog.h" +#include "fileutils.h" +#include "globals.h" +#include "uibuilder.h" +#include "vikradiogroup.h" +#include "vikfileentry.h" +#include "vikfilelist.h" +#include "ui_util.h" + +VikLayerParamData vik_lpd_true_default ( void ) { return VIK_LPD_BOOLEAN ( TRUE ); } +VikLayerParamData vik_lpd_false_default ( void ) { return VIK_LPD_BOOLEAN ( FALSE ); } +static gboolean file_save_cb ( VikFileEntry *vfe, gpointer user_data ); + +/** i18n note + * Since UI builder often uses static structures, the text is marked with N_() + * however to actually get it to apply the widget (e.g. to a label) then + * an additional call to _() needs to occur on that string + **/ + +GtkWidget *a_uibuilder_new_widget ( VikLayerParam *param, VikLayerParamData data ) +{ + // Perform pre conversion if necessary + VikLayerParamData vlpd = data; + if ( param->convert_to_display ) + vlpd = param->convert_to_display ( data ); + + GtkWidget *rv = NULL; + switch ( param->widget_type ) + { + case VIK_LAYER_WIDGET_COLOR: + if ( param->type == VIK_LAYER_PARAM_COLOR ) + rv = gtk_color_button_new_with_color ( &(vlpd.c) ); + break; + case VIK_LAYER_WIDGET_CHECKBUTTON: + if ( param->type == VIK_LAYER_PARAM_BOOLEAN ) + { + //rv = gtk_check_button_new_with_label ( //param->title ); + rv = gtk_check_button_new (); + if ( vlpd.b ) + gtk_toggle_button_set_active ( GTK_TOGGLE_BUTTON(rv), TRUE ); + } + break; + case VIK_LAYER_WIDGET_COMBOBOX: + if ( param->type == VIK_LAYER_PARAM_UINT && param->widget_data ) + { + /* Build a simple combobox */ + gchar **pstr = param->widget_data; + rv = vik_combo_box_text_new (); + while ( *pstr ) + vik_combo_box_text_append ( rv, _(*(pstr++)) ); + if ( param->extra_widget_data ) /* map of alternate uint values for options */ + { + /* Set the effective default value */ + int i; + for ( i = 0; ((const char **)param->widget_data)[i]; i++ ) + if ( ((guint *)param->extra_widget_data)[i] == vlpd.u ) + { + /* Match default value */ + gtk_combo_box_set_active ( GTK_COMBO_BOX(rv), i ); + break; + } + } + else + gtk_combo_box_set_active ( GTK_COMBO_BOX ( rv ), vlpd.u ); + } + else if ( param->type == VIK_LAYER_PARAM_STRING && param->widget_data && !param->extra_widget_data ) + { + /* Build a combobox with editable text */ + gchar **pstr = param->widget_data; +#if GTK_CHECK_VERSION (2, 24, 0) + rv = gtk_combo_box_text_new_with_entry (); +#else + rv = gtk_combo_box_entry_new_text (); +#endif + if ( vlpd.s ) + vik_combo_box_text_append ( rv, _(vlpd.s) ); + while ( *pstr ) + vik_combo_box_text_append ( rv, _(*(pstr++)) ); + if ( vlpd.s ) + gtk_combo_box_set_active ( GTK_COMBO_BOX ( rv ), 0 ); + } + else if ( param->type == VIK_LAYER_PARAM_STRING && param->widget_data && param->extra_widget_data) + { + /* Build a combobox with fixed selections without editable text */ + gchar **pstr = param->widget_data; + rv = GTK_WIDGET ( vik_combo_box_text_new () ); + while ( *pstr ) + vik_combo_box_text_append ( rv, _(*(pstr++)) ); + if ( vlpd.s ) + { + /* Set the effective default value */ + /* In case of value does not exist, set the first value */ + gtk_combo_box_set_active ( GTK_COMBO_BOX ( rv ), 0 ); + int i; + for ( i = 0; ((const char **)param->widget_data)[i]; i++ ) + if ( strcmp(((const char **)param->extra_widget_data)[i], vlpd.s) == 0 ) + { + /* Match default value */ + gtk_combo_box_set_active ( GTK_COMBO_BOX ( rv ), i ); + break; + } + } + else + gtk_combo_box_set_active ( GTK_COMBO_BOX ( rv ), 0 ); + } + break; + case VIK_LAYER_WIDGET_RADIOGROUP: + /* widget_data and extra_widget_data are GList */ + if ( param->type == VIK_LAYER_PARAM_UINT && param->widget_data ) + { + rv = vik_radio_group_new ( param->widget_data ); + if ( param->extra_widget_data ) /* map of alternate uint values for options */ + { + int i; + int nb_elem = g_list_length(param->widget_data); + for ( i = 0; i < nb_elem; i++ ) + if ( GPOINTER_TO_UINT ( g_list_nth_data(param->extra_widget_data, i) ) == vlpd.u ) + { + vik_radio_group_set_selected ( VIK_RADIO_GROUP(rv), i ); + break; + } + } + else if ( vlpd.u ) /* zero is already default */ + vik_radio_group_set_selected ( VIK_RADIO_GROUP(rv), vlpd.u ); + } + break; + case VIK_LAYER_WIDGET_RADIOGROUP_STATIC: + if ( param->type == VIK_LAYER_PARAM_UINT && param->widget_data ) + { + rv = vik_radio_group_new_static ( (const gchar **) param->widget_data ); + if ( param->extra_widget_data ) /* map of alternate uint values for options */ + { + int i; + for ( i = 0; ((const char **)param->widget_data)[i]; i++ ) + if ( ((guint *)param->extra_widget_data)[i] == vlpd.u ) + { + vik_radio_group_set_selected ( VIK_RADIO_GROUP(rv), i ); + break; + } + } + else if ( vlpd.u ) /* zero is already default */ + vik_radio_group_set_selected ( VIK_RADIO_GROUP(rv), vlpd.u ); + } + break; + case VIK_LAYER_WIDGET_SPINBUTTON: + if ( (param->type == VIK_LAYER_PARAM_DOUBLE || param->type == VIK_LAYER_PARAM_UINT + || param->type == VIK_LAYER_PARAM_INT) && param->widget_data ) + { + gdouble init_val = (param->type == VIK_LAYER_PARAM_DOUBLE) ? vlpd.d : (param->type == VIK_LAYER_PARAM_UINT ? vlpd.u : vlpd.i); + VikLayerParamScale *scale = (VikLayerParamScale *) param->widget_data; + rv = gtk_spin_button_new ( GTK_ADJUSTMENT(gtk_adjustment_new( init_val, scale->min, scale->max, scale->step, scale->step, 0 )), scale->step, scale->digits ); + } + break; + case VIK_LAYER_WIDGET_ENTRY: + if ( param->type == VIK_LAYER_PARAM_STRING ) + { + rv = ui_entry_new ( NULL, GTK_ENTRY_ICON_SECONDARY ); + if ( vlpd.s ) + gtk_entry_set_text ( GTK_ENTRY(rv), vlpd.s ); + } + break; + case VIK_LAYER_WIDGET_PASSWORD: + if ( param->type == VIK_LAYER_PARAM_STRING ) + { + rv = ui_entry_new ( NULL, GTK_ENTRY_ICON_SECONDARY ); + gtk_entry_set_visibility ( GTK_ENTRY(rv), FALSE ); + if ( vlpd.s ) + gtk_entry_set_text ( GTK_ENTRY(rv), vlpd.s ); + gtk_widget_set_tooltip_text ( GTK_WIDGET(rv), + _("Take care that this password will be stored clearly in a plain file.") ); + } + break; + case VIK_LAYER_WIDGET_FILEENTRY: + if ( param->type == VIK_LAYER_PARAM_STRING ) + { + rv = vik_file_entry_new (GTK_FILE_CHOOSER_ACTION_OPEN, GPOINTER_TO_INT(param->widget_data), NULL, NULL); + if ( vlpd.s ) + vik_file_entry_set_filename ( VIK_FILE_ENTRY(rv), vlpd.s ); + } + break; + case VIK_LAYER_WIDGET_FILESAVE: + if ( param->type == VIK_LAYER_PARAM_STRING ) + { + rv = vik_file_entry_new (GTK_FILE_CHOOSER_ACTION_SAVE, GPOINTER_TO_INT(param->widget_data), file_save_cb, NULL ); + if ( vlpd.s ) + vik_file_entry_set_filename ( VIK_FILE_ENTRY(rv), vlpd.s ); + } + break; + case VIK_LAYER_WIDGET_FOLDERENTRY: + if ( param->type == VIK_LAYER_PARAM_STRING ) + { + rv = vik_file_entry_new (GTK_FILE_CHOOSER_ACTION_SELECT_FOLDER, VF_FILTER_NONE, NULL, NULL); + if ( vlpd.s ) + vik_file_entry_set_filename ( VIK_FILE_ENTRY(rv), vlpd.s ); + } + break; + + case VIK_LAYER_WIDGET_FILELIST: + if ( param->type == VIK_LAYER_PARAM_STRING_LIST ) + { + rv = vik_file_list_new ( _(param->title), NULL ); + vik_file_list_set_files ( VIK_FILE_LIST(rv), vlpd.sl ); + } + break; + case VIK_LAYER_WIDGET_HSCALE: + if ( (param->type == VIK_LAYER_PARAM_DOUBLE || param->type == VIK_LAYER_PARAM_UINT + || param->type == VIK_LAYER_PARAM_INT) && param->widget_data ) + { + gdouble init_val = (param->type == VIK_LAYER_PARAM_DOUBLE) ? vlpd.d : (param->type == VIK_LAYER_PARAM_UINT ? vlpd.u : vlpd.i); + VikLayerParamScale *scale = (VikLayerParamScale *) param->widget_data; + rv = gtk_hscale_new_with_range ( scale->min, scale->max, scale->step ); + gtk_scale_set_digits ( GTK_SCALE(rv), scale->digits ); + gtk_range_set_value ( GTK_RANGE(rv), init_val ); + } + break; + + case VIK_LAYER_WIDGET_BUTTON: + if ( param->type == VIK_LAYER_PARAM_PTR && param->widget_data ) { + rv = gtk_button_new_with_label ( _(param->widget_data) ); + g_signal_connect ( G_OBJECT(rv), "clicked", G_CALLBACK (vlpd.ptr), param->extra_widget_data ); + } + break; + + default: break; + } + if ( rv && !gtk_widget_get_tooltip_text ( rv ) ) { + if ( param->tooltip ) + gtk_widget_set_tooltip_text ( rv, _(param->tooltip) ); + } + return rv; +} + +VikLayerParamData a_uibuilder_widget_get_value ( GtkWidget *widget, VikLayerParam *param ) +{ + VikLayerParamData rv; + switch ( param->widget_type ) + { + case VIK_LAYER_WIDGET_COLOR: + gtk_color_button_get_color ( GTK_COLOR_BUTTON(widget), &(rv.c) ); + break; + case VIK_LAYER_WIDGET_CHECKBUTTON: + rv.b = gtk_toggle_button_get_active(GTK_TOGGLE_BUTTON(widget)); + break; + case VIK_LAYER_WIDGET_COMBOBOX: + if ( param->type == VIK_LAYER_PARAM_UINT ) + { + rv.i = gtk_combo_box_get_active ( GTK_COMBO_BOX(widget) ); + if ( rv.i == -1 ) rv.i = 0; + rv.u = rv.i; + if ( param->extra_widget_data ) + rv.u = ((guint *)param->extra_widget_data)[rv.u]; + } + if ( param->type == VIK_LAYER_PARAM_STRING) + { + if ( param->extra_widget_data ) + { + /* Combobox displays labels and we want values from extra */ + int pos = gtk_combo_box_get_active ( GTK_COMBO_BOX(widget) ); + rv.s = ((const char **)param->extra_widget_data)[pos]; + } + else + { + /* Return raw value */ +#if GTK_CHECK_VERSION (2, 24, 0) + rv.s = gtk_entry_get_text (GTK_ENTRY (gtk_bin_get_child (GTK_BIN (widget)))); +#else + rv.s = gtk_combo_box_get_active_text ( GTK_COMBO_BOX(widget) ); +#endif + } + g_debug("%s: %s", __FUNCTION__, rv.s); + } + break; + case VIK_LAYER_WIDGET_RADIOGROUP: + case VIK_LAYER_WIDGET_RADIOGROUP_STATIC: + rv.u = vik_radio_group_get_selected(VIK_RADIO_GROUP(widget)); + if ( param->extra_widget_data ) + rv.u = GPOINTER_TO_UINT ( g_list_nth_data(param->extra_widget_data, rv.u) ); + break; + case VIK_LAYER_WIDGET_SPINBUTTON: + if ( param->type == VIK_LAYER_PARAM_UINT ) + rv.u = gtk_spin_button_get_value_as_int ( GTK_SPIN_BUTTON(widget) ); + else if ( param->type == VIK_LAYER_PARAM_INT ) + rv.i = gtk_spin_button_get_value_as_int ( GTK_SPIN_BUTTON(widget) ); + else + rv.d = gtk_spin_button_get_value ( GTK_SPIN_BUTTON(widget) ); + break; + case VIK_LAYER_WIDGET_ENTRY: + case VIK_LAYER_WIDGET_PASSWORD: + rv.s = gtk_entry_get_text ( GTK_ENTRY(widget) ); + break; + case VIK_LAYER_WIDGET_FILEENTRY: + case VIK_LAYER_WIDGET_FILESAVE: + case VIK_LAYER_WIDGET_FOLDERENTRY: + rv.s = vik_file_entry_get_filename ( VIK_FILE_ENTRY(widget) ); + break; + case VIK_LAYER_WIDGET_FILELIST: + rv.sl = vik_file_list_get_files ( VIK_FILE_LIST(widget) ); + break; + case VIK_LAYER_WIDGET_HSCALE: + if ( param->type == VIK_LAYER_PARAM_UINT ) + rv.u = (guint32) gtk_range_get_value ( GTK_RANGE(widget) ); + else if ( param->type == VIK_LAYER_PARAM_INT ) + rv.i = (gint32) gtk_range_get_value ( GTK_RANGE(widget) ); + else + rv.d = gtk_range_get_value ( GTK_RANGE(widget) ); + break; + default: break; + } + + // Perform conversion if necessary + if ( param->convert_to_internal ) + rv = param->convert_to_internal ( rv ); + + return rv; +} + +static GtkWidget *dialog = NULL; + +/** + * Hacky method to enable closing the dialog within preference code + */ +void a_uibuilder_factory_close ( gint response_id ) +{ + if ( dialog ) { + gtk_dialog_response ( GTK_DIALOG(dialog), response_id ); + } +} + +/** + * @have_apply_button: Whether the dialog should have an apply button + * @redraw: Function to be invoked to redraw when apply button is pressed + * Typically expected to be #vik_layer_emit_update() + * @redraw_param: Parameter to be passed to the redraw(), so typically a VikLayer* + * + * Returns: + * 0 = Dialog cancelled + * 1 = No parameters to be displayed + * 2 = Parameter changed that needs redraw + * 3 = Parameter changed but redraw not necessary + */ +gint a_uibuilder_properties_factory ( const gchar *dialog_name, + GtkWindow *parent, + VikLayerParam *params, + guint16 params_count, + gchar **groups, + guint8 groups_count, + gboolean (*setparam) (gpointer,gpointer), + gboolean (*setparam4) (gpointer,guint16,VikLayerParamData,gpointer), + gpointer pass_along1, + gpointer pass_along2, + VikLayerParamData (*getparam) (gpointer,guint16,gboolean), + gpointer pass_along_getparam, + void (*changeparam) (GtkWidget*, ui_change_values), + gboolean have_apply_button, + void (*redraw) (gpointer), + gpointer redraw_param ) +{ + guint16 i, j, widget_count = 0; + gboolean must_redraw = FALSE; + + if ( ! params ) + return 1; /* no params == no options, so all is good */ + + for ( i = 0; i < params_count; i++ ) + if ( params[i].group != VIK_LAYER_NOT_IN_PROPERTIES ) + widget_count++; + + if ( widget_count == 0) + return 0; /* TODO -- should be one? */ + else + { + /* create widgets and titles; place in table */ + dialog = gtk_dialog_new_with_buttons ( dialog_name, parent, + GTK_DIALOG_MODAL | GTK_DIALOG_DESTROY_WITH_PARENT, + GTK_STOCK_CANCEL, GTK_RESPONSE_REJECT, NULL ); + if ( have_apply_button ) + gtk_dialog_add_button ( GTK_DIALOG(dialog), GTK_STOCK_APPLY, GTK_RESPONSE_APPLY ); + gtk_dialog_add_button ( GTK_DIALOG(dialog), GTK_STOCK_OK, GTK_RESPONSE_ACCEPT ); + + gtk_dialog_set_default_response ( GTK_DIALOG(dialog), GTK_RESPONSE_ACCEPT ); + GtkWidget *response_w = NULL; +#if GTK_CHECK_VERSION (2, 20, 0) + response_w = gtk_dialog_get_widget_for_response ( GTK_DIALOG(dialog), GTK_RESPONSE_ACCEPT ); +#endif + GtkWidget *table = NULL; + GtkWidget **tables = NULL; /* for more than one group */ + + GtkWidget *notebook = NULL; + GtkWidget **labels = g_malloc ( sizeof(GtkWidget *) * widget_count ); + GtkWidget **widgets = g_malloc ( sizeof(GtkWidget *) * widget_count ); + ui_change_values *change_values = g_malloc ( sizeof(ui_change_values) * widget_count ); + + if ( groups && groups_count > 1 ) + { + guint8 current_group; + guint16 tab_widget_count; + notebook = gtk_notebook_new (); + // Switch to vertical notebook mode when many groups + if ( groups_count > 4 ) + gtk_notebook_set_tab_pos ( GTK_NOTEBOOK(notebook), GTK_POS_LEFT ); + gtk_box_pack_start (GTK_BOX(gtk_dialog_get_content_area(GTK_DIALOG(dialog))), notebook, TRUE, TRUE, 0); + tables = g_malloc ( sizeof(GtkWidget *) * groups_count ); + for ( current_group = 0; current_group < groups_count; current_group++ ) + { + tab_widget_count = 0; + for ( j = 0; j < params_count; j ++ ) + if ( params[j].group == current_group ) + tab_widget_count++; + + if ( tab_widget_count ) + { + tables[current_group] = gtk_table_new ( tab_widget_count, 1, FALSE ); + gtk_notebook_append_page ( GTK_NOTEBOOK(notebook), tables[current_group], gtk_label_new(groups[current_group]) ); + } + } + } + else + { + table = gtk_table_new( widget_count, 1, FALSE ); + gtk_box_pack_start (GTK_BOX(gtk_dialog_get_content_area(GTK_DIALOG(dialog))), table, TRUE, TRUE, 0); + } + + for ( i = 0, j = 0; i < params_count; i++ ) + { + if ( params[i].group != VIK_LAYER_NOT_IN_PROPERTIES ) + { + if ( tables ) + table = tables[MAX(0, params[i].group)]; /* round up NOT_IN_GROUP, that's not reasonable here */ + + widgets[j] = a_uibuilder_new_widget ( &(params[i]), getparam ( pass_along_getparam, i, FALSE ) ); + + if ( widgets[j] ) { + labels[j] = gtk_label_new(_(params[i].title)); + gtk_table_attach ( GTK_TABLE(table), labels[j], 0, 1, j, j+1, 0, 0, 0, 0 ); + gtk_table_attach ( GTK_TABLE(table), widgets[j], 1, 2, j, j+1, GTK_EXPAND | GTK_FILL, + params[i].type == VIK_LAYER_PARAM_STRING_LIST ? GTK_EXPAND | GTK_FILL : 0, 2, 2 ); + + if ( changeparam ) + { + change_values[j][UI_CHG_LAYER] = pass_along1; + change_values[j][UI_CHG_PARAM] = ¶ms[i]; + change_values[j][UI_CHG_PARAM_ID] = GINT_TO_POINTER((gint)i); + change_values[j][UI_CHG_WIDGETS] = widgets; + change_values[j][UI_CHG_LABELS] = labels; + + switch ( params[i].widget_type ) + { + // Change conditions for other widget types can be added when needed + case VIK_LAYER_WIDGET_COMBOBOX: + g_signal_connect ( G_OBJECT(widgets[j]), "changed", G_CALLBACK(changeparam), change_values[j] ); + break; + case VIK_LAYER_WIDGET_CHECKBUTTON: + g_signal_connect ( G_OBJECT(widgets[j]), "toggled", G_CALLBACK(changeparam), change_values[j] ); + break; + default: break; + } + } + } + j++; + } + } + + // Repeat run through to force changeparam callbacks now that the widgets have been created + // This primarily so the widget sensitivities get set up + if ( changeparam ) { + for ( i = 0, j = 0; i < params_count; i++ ) { + if ( params[i].group != VIK_LAYER_NOT_IN_PROPERTIES ) { + if ( widgets[j] ) { + changeparam ( widgets[j], change_values[j] ); + } + j++; + } + } + } + + if ( response_w ) + gtk_widget_grab_focus ( response_w ); + + gtk_widget_show_all ( dialog ); + + gint resp = GTK_RESPONSE_APPLY; + gint answer = 0; + while ( resp == GTK_RESPONSE_APPLY ) { + resp = gtk_dialog_run (GTK_DIALOG (dialog)); + if ( resp == GTK_RESPONSE_ACCEPT || resp == GTK_RESPONSE_APPLY ) { + VikLayerSetParam vlsp; + vlsp.is_file_operation = FALSE; + vlsp.dirpath = NULL; + for ( i = 0, j = 0; i < params_count; i++ ) { + if ( params[i].group != VIK_LAYER_NOT_IN_PROPERTIES ) { + vlsp.id = i; + vlsp.vp = pass_along2; + vlsp.data = a_uibuilder_widget_get_value ( widgets[j], &(params[i]) ); + // Main callback into each layer's setparam + if ( setparam && setparam ( pass_along1, &vlsp ) ) + must_redraw = TRUE; + // Or a basic callback for each parameter + else if ( setparam4 && setparam4 ( pass_along1, i, vlsp.data, pass_along2 ) ) + must_redraw = TRUE; + j++; + } + } + + if ( resp == GTK_RESPONSE_APPLY ) { + if ( redraw && redraw_param ) + redraw ( redraw_param ); + answer = 0; + } + else + answer = must_redraw ? 2 : 3; // user clicked OK + } + } + + g_free ( widgets ); + g_free ( labels ); + g_free ( change_values ); + if ( tables ) + g_free ( tables ); + gtk_widget_destroy ( dialog ); + dialog = NULL; + + return answer; + } +} + +static void uibuilder_run_setparam ( VikLayerParamData *paramdatas, guint16 i, VikLayerParamData data, VikLayerParam *params ) +{ + /* could have to copy it if it's a string! */ + switch ( params[i].type ) { + case VIK_LAYER_PARAM_STRING: + paramdatas[i].s = g_strdup ( data.s ); + break; + default: + paramdatas[i] = data; /* string list will have to be freed by layer. anything else not freed */ + } +} + +static VikLayerParamData uibuilder_run_getparam ( VikLayerParamData *params_defaults, guint16 i ) +{ + return params_defaults[i]; +} + + +VikLayerParamData *a_uibuilder_run_dialog ( const gchar *dialog_name, GtkWindow *parent, VikLayerParam *params, + guint16 params_count, gchar **groups, guint8 groups_count, + VikLayerParamData *params_defaults ) +{ + VikLayerParamData *paramdatas = g_new(VikLayerParamData, params_count); + if ( a_uibuilder_properties_factory ( dialog_name, + parent, + params, + params_count, + groups, + groups_count, + NULL, + (gpointer) uibuilder_run_setparam, + paramdatas, + params, + (gpointer) uibuilder_run_getparam, + params_defaults, + NULL, + FALSE, + NULL, + NULL) > 0 ) { + + return paramdatas; + } + g_free ( paramdatas ); + return NULL; +} + +/* frees data from last (if ness) */ +void a_uibuilder_free_paramdatas ( VikLayerParamData *paramdatas, VikLayerParam *params, guint16 params_count ) +{ + int i; + /* may have to free strings, etc. */ + for ( i = 0; i < params_count; i++ ) { + switch ( params[i].type ) { + case VIK_LAYER_PARAM_STRING: + g_free ( (gchar *) paramdatas[i].s ); + break; + case VIK_LAYER_PARAM_STRING_LIST: { + /* should make a util function out of this */ + GList *iter = paramdatas[i].sl; + while ( iter ) { + g_free ( iter->data ); + iter = iter->next; + } + g_list_free ( paramdatas[i].sl ); + break; + default: + break; + } + } + } + g_free ( paramdatas ); +} + +static gboolean file_save_cb ( VikFileEntry *vfe, gpointer user_data ) { + const gchar *entry = vik_file_entry_get_filename ( vfe ); + return ( g_file_test ( entry, G_FILE_TEST_EXISTS ) == FALSE || + a_dialog_yes_or_no ( VIK_GTK_WINDOW_FROM_WIDGET(vfe), _("The file \"%s\" exists, do you wish to overwrite it?"), a_file_basename ( entry ) ) ); +} + diff --git a/src/uibuilder.h b/src/uibuilder.h new file mode 100644 index 0000000..9083df6 --- /dev/null +++ b/src/uibuilder.h @@ -0,0 +1,211 @@ +/* + * viking -- GPS Data and Topo Analyzer, Explorer, and Manager + * + * Copyright (C) 2003-2007, Evan Battaglia + * + * 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., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA + * + */ +#ifndef _VIKING_UIBUILDER_H +#define _VIKING_UIBUILDER_H + +#include +#include "vik_compat.h" +#include "config.h" + +G_BEGIN_DECLS + +/* Parameters (for I/O and Properties) */ + +typedef union { + gdouble d; + guint32 u; + gint32 i; + gboolean b; + const gchar *s; + GdkColor c; + GList *sl; + gpointer ptr; // For internal usage - don't save this value in a file! +} VikLayerParamData; + +typedef struct { + guint16 id; + VikLayerParamData data; + gpointer vp; // AKA VikViewport* + gboolean is_file_operation; // denotes if for file I/O, as opposed to display/cut/copy etc... operations + const gchar* dirpath; // The directory - so if the data is a relative file path, we know what it is relative to +} VikLayerSetParam; + +typedef enum { + VIK_LAYER_WIDGET_CHECKBUTTON=0, + VIK_LAYER_WIDGET_RADIOGROUP, + VIK_LAYER_WIDGET_RADIOGROUP_STATIC, + VIK_LAYER_WIDGET_SPINBUTTON, + VIK_LAYER_WIDGET_ENTRY, + VIK_LAYER_WIDGET_PASSWORD, + VIK_LAYER_WIDGET_FILEENTRY, + VIK_LAYER_WIDGET_FILESAVE, + VIK_LAYER_WIDGET_FOLDERENTRY, + VIK_LAYER_WIDGET_HSCALE, + VIK_LAYER_WIDGET_COLOR, + VIK_LAYER_WIDGET_COMBOBOX, + VIK_LAYER_WIDGET_FILELIST, + VIK_LAYER_WIDGET_BUTTON, +} VikLayerWidgetType; + +/* id is index */ +typedef enum { +VIK_LAYER_PARAM_DOUBLE=1, +VIK_LAYER_PARAM_UINT, +VIK_LAYER_PARAM_INT, + +/* in my_layer_set_param, if you want to use the string, you should dup it + * in my_layer_get_param, the string returned will NOT be free'd, you are responsible for managing it (I think) */ +VIK_LAYER_PARAM_STRING, +VIK_LAYER_PARAM_BOOLEAN, +VIK_LAYER_PARAM_COLOR, + +/* NOTE: string list works uniquely: data.sl should NOT be free'd when + * the internals call get_param -- i.e. it should be managed w/in the layer. + * The value passed by the internals into set_param should also be managed + * by the layer -- i.e. free'd by the layer. + */ + +VIK_LAYER_PARAM_STRING_LIST, +VIK_LAYER_PARAM_PTR, // Not really a 'parameter' but useful to route to extended configuration (e.g. toolbar order) +} VikLayerParamType; + +typedef enum { + VIK_LAYER_AGGREGATE = 0, + VIK_LAYER_TRW, + VIK_LAYER_COORD, + VIK_LAYER_GEOREF, + VIK_LAYER_GPS, + VIK_LAYER_MAPS, + VIK_LAYER_DEM, +#ifdef HAVE_LIBMAPNIK + VIK_LAYER_MAPNIK, +#endif + VIK_LAYER_NUM_TYPES // Also use this value to indicate no layer association +} VikLayerTypeEnum; + +// Default value has to be returned via a function +// because certain types value are can not be statically allocated +// (i.e. a string value that is dependent on other functions) +// Also easier for colours to be set via a function call rather than a static assignment +typedef VikLayerParamData (*VikLayerDefaultFunc) ( void ); + +// Convert between the value held internally and the value used for display +// e.g. keep the internal value in seconds yet use days in the display +typedef VikLayerParamData (*VikLayerConvertFunc) ( VikLayerParamData ); + +typedef struct { + VikLayerTypeEnum layer; + const gchar *name; + VikLayerParamType type; + gint16 group; + const gchar *title; + VikLayerWidgetType widget_type; + gpointer widget_data; + gpointer extra_widget_data; + const gchar *tooltip; + VikLayerDefaultFunc default_value; + VikLayerConvertFunc convert_to_display; + VikLayerConvertFunc convert_to_internal; +} VikLayerParam; + +enum { +VIK_LAYER_NOT_IN_PROPERTIES=-2, +VIK_LAYER_GROUP_NONE=-1 +}; + +typedef struct { + gdouble min; + gdouble max; + gdouble step; + guint8 digits; +} VikLayerParamScale; + + + /* Annoyingly 'C' cannot initialize unions properly */ + /* It's dependent on the standard used or the compiler support... */ +#if defined __STDC_VERSION__ && __STDC_VERSION__ >= 199901L || __GNUC__ +#define VIK_LPD_BOOLEAN(X) (VikLayerParamData) { .b = (X) } +#define VIK_LPD_INT(X) (VikLayerParamData) { .u = (X) } +#define VIK_LPD_UINT(X) (VikLayerParamData) { .i = (X) } +#define VIK_LPD_COLOR(X,Y,Z,A) (VikLayerParamData) { .c = (GdkColor){ (X), (Y), (Z), (A) } } +#define VIK_LPD_DOUBLE(X) (VikLayerParamData) { .d = (X) } +#else +#define VIK_LPD_BOOLEAN(X) (VikLayerParamData) { (X) } +#define VIK_LPD_INT(X) (VikLayerParamData) { (X) } +#define VIK_LPD_UINT(X) (VikLayerParamData) { (X) } +#define VIK_LPD_COLOR(X,Y,Z,A) (VikLayerParamData) { (X), (Y), (Z), (A) } +#define VIK_LPD_DOUBLE(X) (VikLayerParamData) { (X) } +#endif + +VikLayerParamData vik_lpd_true_default ( void ); +VikLayerParamData vik_lpd_false_default ( void ); + +typedef enum { + UI_CHG_LAYER = 0, + UI_CHG_PARAM, + UI_CHG_PARAM_ID, + UI_CHG_WIDGETS, + UI_CHG_LABELS, + UI_CHG_LAST +} ui_change_index; + +typedef gpointer ui_change_values[UI_CHG_LAST]; + +GtkWidget *a_uibuilder_new_widget ( VikLayerParam *param, VikLayerParamData data ); +VikLayerParamData a_uibuilder_widget_get_value ( GtkWidget *widget, VikLayerParam *param ); +gint a_uibuilder_properties_factory ( const gchar *dialog_name, + GtkWindow *parent, + VikLayerParam *params, + guint16 params_count, + gchar **groups, + guint8 groups_count, + gboolean (*setparam) (gpointer,gpointer), // AKA VikLayerFuncSetParam in viklayer.h + gboolean (*setparam4) (gpointer,guint16,VikLayerParamData,gpointer), // Fixed 4 Parameter version + gpointer pass_along1, // Possibly VikLayer* or own type for 4 param call used as first parameter + gpointer pass_along2, // Possibly VikViewport* or own type for 4 param call used as last parameter + VikLayerParamData (*getparam) (gpointer,guint16,gboolean), // AKA VikLayerFuncGetParam in viklayer.h + gpointer pass_along_getparam, + void (*changeparam) (GtkWidget*, ui_change_values), // AKA VikLayerFuncChangeParam in viklayer.h + gboolean have_apply_button, + void (*redraw) (gpointer), // Normally vik_layer_emit_update() + gpointer redraw_param ); // Normally VikLayer* + +void a_uibuilder_factory_close ( gint response_id ); + +VikLayerParamData *a_uibuilder_run_dialog ( const gchar *dialog_name, GtkWindow *parent, VikLayerParam *params, + guint16 params_count, gchar **groups, guint8 groups_count, + VikLayerParamData *params_defaults ); + +/* frees data from last (if ness) */ +void a_uibuilder_free_paramdatas ( VikLayerParamData *paramdatas, VikLayerParam *params, guint16 params_count ); + +typedef enum { + VL_SO_NONE = 0, + VL_SO_ALPHABETICAL_ASCENDING, + VL_SO_ALPHABETICAL_DESCENDING, + VL_SO_DATE_ASCENDING, + VL_SO_DATE_DESCENDING, + VL_SO_LAST +} vik_layer_sort_order_t; + +G_END_DECLS + +#endif diff --git a/src/util.c b/src/util.c new file mode 100644 index 0000000..bec2345 --- /dev/null +++ b/src/util.c @@ -0,0 +1,341 @@ +/* + * Viking - GPS data editor + * Copyright (C) 2007, Guilhem Bonnefille + * Copyright (C) 2014, Rob Norris + * + * 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 St, Fifth Floor, Boston, MA 02110-1301 USA + */ + /* + * Dependencies must be just on Glib + * see ui_utils for thing that depend on Gtk + * see vikutils for things that further depend on other Viking types + */ +#ifdef HAVE_CONFIG_H +#include "config.h" +#endif + +#include +#include +#include +#include + +#include "util.h" +#include "globals.h" +#include "fileutils.h" + +#ifdef WINDOWS +#include +#else +#include +#endif + +guint util_get_number_of_cpus () +{ +#if GLIB_CHECK_VERSION (2, 36, 0) + return g_get_num_processors(); +#else + long nprocs = 1; +#ifdef WINDOWS + SYSTEM_INFO info; + GetSystemInfo(&info); + nprocs = info.dwNumberOfProcessors; +#else +#ifdef _SC_NPROCESSORS_ONLN + nprocs = sysconf(_SC_NPROCESSORS_ONLN); + if (nprocs < 1) + nprocs = 1; +#endif +#endif + return nprocs; +#endif +} + +/** + * split_string_from_file_on_equals: + * + * @buf: the input string + * @key: newly allocated string that is before the '=' + * @val: newly allocated string after the '=' + * + * Designed for file line processing, so it ignores strings beginning with special + * characters, such as '#'; returns false in such situations. + * Also returns false if no equals character is found + * + * e.g. if buf = "GPS.parameter=42" + * key = "GPS.parameter" + * val = "42" + */ +gboolean split_string_from_file_on_equals ( const gchar *buf, gchar **key, gchar **val ) +{ + // comments, special characters in viking file format + if ( buf == NULL || buf[0] == '\0' || buf[0] == '~' || buf[0] == '=' || buf[0] == '#' ) + return FALSE; + + if ( ! strchr ( buf, '=' ) ) + return FALSE; + + gchar **strv = g_strsplit ( buf, "=", 2 ); + + gint gi = 0; + gchar *str = strv[gi]; + while ( str ) { + if ( gi == 0 ) + *key = g_strdup ( str ); + else + *val = g_strdup ( str ); + gi++; + str = strv[gi]; + } + + g_strfreev ( strv ); + + // Remove newline from val and also any other whitespace + *key = g_strstrip ( *key ); + *val = g_strstrip ( *val ); + return TRUE; +} + +static GSList* deletion_list = NULL; + +/** + * util_add_to_deletion_list: + * + * Add a name of a file into the list that is to be deleted on program exit + * Normally this is for files that get used asynchronously, + * so we don't know when it's time to delete them - other than at this program's end + */ +void util_add_to_deletion_list ( const gchar* filename ) +{ + deletion_list = g_slist_append ( deletion_list, g_strdup (filename) ); +} + +/** + * util_remove_all_in_deletion_list: + * + * Delete all the files in the deletion list + * This should only be called on program exit + */ +void util_remove_all_in_deletion_list ( void ) +{ + while ( deletion_list ) + { + if ( g_remove ( (const char*)deletion_list->data ) ) + g_warning ( "%s: Failed to remove %s", __FUNCTION__, (char*)deletion_list->data ); + g_free ( deletion_list->data ); + deletion_list = g_slist_delete_link ( deletion_list, deletion_list ); + } +} + +/** + * Removes characters from a string, in place. + * + * @param string String to search. + * @param chars Characters to remove. + * + * @return @a string - return value is only useful when nesting function calls, e.g.: + * @code str = utils_str_remove_chars(g_strdup("f_o_o"), "_"); @endcode + * + * @see @c g_strdelimit. + **/ +gchar *util_str_remove_chars(gchar *string, const gchar *chars) +{ + const gchar *r; + gchar *w = string; + + g_return_val_if_fail(string, NULL); + if (G_UNLIKELY(EMPTY(chars))) + return string; + + foreach_str(r, string) + { + if (!strchr(chars, *r)) + *w++ = *r; + } + *w = 0x0; + return string; +} + +/** + * In 'extreme' debug mode don't remove temporary files + * thus the contents can be inspected if things go wrong + * with the trade off the user may need to delete tmp files manually + * Only use this for 'occasional' downloaded temporary files that need interpretation, + * rather than large volume items such as Bing attributions. + */ +int util_remove ( const gchar *filename ) +{ + if ( vik_debug && vik_verbose ) { + g_warning ( "Not removing file: %s", filename ); + return 0; + } + else + return g_remove ( filename ); +} + +/** + * Stream write buffer to a temporary file (in one go) + * + * @param buffer The buffer to write + * @param count Size of the buffer to write + * + * @return the filename of the buffer that was written + */ +gchar* util_write_tmp_file_from_bytes ( const void *buffer, gsize count ) +{ + GFileIOStream *gios; + GError *error = NULL; + gchar *tmpname = NULL; + +#if GLIB_CHECK_VERSION(2,32,0) + GFile *gf = g_file_new_tmp ( "vik-tmp.XXXXXX", &gios, &error ); + tmpname = g_file_get_path (gf); +#else + gint fd = g_file_open_tmp ( "vik-tmp.XXXXXX", &tmpname, &error ); + if ( error ) { + g_warning ( "%s", error->message ); + g_error_free ( error ); + return NULL; + } + gios = g_file_open_readwrite ( g_file_new_for_path (tmpname), NULL, &error ); + if ( error ) { + g_warning ( "%s", error->message ); + g_error_free ( error ); + return NULL; + } +#endif + + gios = g_file_open_readwrite ( g_file_new_for_path (tmpname), NULL, &error ); + if ( error ) { + g_warning ( "%s", error->message ); + g_error_free ( error ); + return NULL; + } + + GOutputStream *gos = g_io_stream_get_output_stream ( G_IO_STREAM(gios) ); + if ( g_output_stream_write ( gos, buffer, count, NULL, &error ) < 0 ) { + g_critical ( "Couldn't write tmp %s file due to %s", tmpname, error->message ); + g_free (tmpname); + tmpname = NULL; + } + + g_output_stream_close ( gos, NULL, &error ); + g_object_unref ( gios ); + + return tmpname; +} + +/** + * util_formatd: + * + * Convert a double to a string WITHOUT LOCALE in the specified format + * + * The returned value must be freed by g_free. + */ +gchar* util_formatd ( const gchar *format, gdouble dd ) +{ + gchar *buffer = g_malloc(G_ASCII_DTOSTR_BUF_SIZE*sizeof(gchar)); + g_ascii_formatd (buffer, G_ASCII_DTOSTR_BUF_SIZE, format, dd); + return buffer; +} + +/** + * util_make_absolute_filename: + * + * Returns a newly allocated string of the absolute filename or + * NULL if name is already absolute (or dirpath is unusable) + */ +gchar* util_make_absolute_filename ( const gchar *filename, const gchar *dirpath ) +{ + if ( !dirpath ) return NULL; + + // Is it ready absolute? + if ( g_path_is_absolute ( filename ) ) { + return NULL; + } + else { + // Otherwise create the absolute filename from the given directory and filename + gchar *full = g_strconcat ( dirpath, G_DIR_SEPARATOR_S, filename, NULL ); + gchar *absolute = file_realpath_dup ( full ); // resolved into the canonical name + g_free ( full ); + return absolute; + } +} + +/** + * util_make_absolute_filenames: + * + * Ensures the supplied list of filenames are all absolute + */ +void util_make_absolute_filenames ( GList *filenames, const gchar *dirpath ) +{ + if ( !filenames ) return; + if ( !dirpath ) return; + + GList *gl; + foreach_list ( gl, filenames ) { + gchar *fn = util_make_absolute_filename ( gl->data, dirpath ); + if ( fn ) { + g_free ( gl->data ); + gl->data = fn; + } + } +} + +/** + * Some systems don't have timegm() + */ +time_t util_timegm (struct tm *tm) +{ +#ifdef _DEFAULT_SOURCE + return timegm ( tm ); +#else + // Assumed tm is mostly valid + // array access is constrained by use of '%' + // Not bothered with leapseconds + static const gint yeardays[12] = { 0, 31, 59, 90, 120, 151, 181, 212, 243, 273, 304, 334 }; + + gint year = 1900 + tm->tm_year + tm->tm_mon / 12; + gint leapdays = ((year - 1968) / 4) - ((year - 1900) / 100) + ((year - 1600) / 400); + // First in days + // Check if passed in year is a leapyear but not gone past the leapday + if ( (year % 4) == 0 && ((year % 100) != 0 || (year % 400) == 0) && (tm->tm_mon % 12) < 2 ) + leapdays--; + // Sum up days, hours, minutes & seconds + time_t result = ((((year - 1970) * 365) + yeardays[tm->tm_mon % 12] + tm->tm_mday-1 + leapdays) * 24); // days + result = ((result + tm->tm_hour ) * 60 ) + tm->tm_min; // minutes + result = (result * 60) + tm->tm_sec; // seconds + + if ( tm->tm_isdst == 1 ) + result -= 3600; + + return result; +#endif +} + +/** + * util_is_url: + * + * See if a string URI starts with 'http:' or similar + * + */ +gboolean util_is_url ( const gchar *str ) +{ + if ( g_ascii_strncasecmp(str, "http://", 7) == 0 || + g_ascii_strncasecmp(str, "https://", 8) == 0 || + g_ascii_strncasecmp(str, "ftp://", 6) == 0 ) { + return TRUE; + } + return FALSE; +} diff --git a/src/util.h b/src/util.h new file mode 100644 index 0000000..0c7af7d --- /dev/null +++ b/src/util.h @@ -0,0 +1,81 @@ +/* + * viking -- GPS Data and Topo Analyzer, Explorer, and Manager + * + * Copyright (C) 2007-2009, Guilhem Bonnefille + * Copyright (C) 2014, Rob Norris + * Based on: + * Copyright (C) 2003-2007, Leandro A. F. Pereira + * + * 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., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA + * + */ + +#ifndef _VIKING_UTIL_H +#define _VIKING_UTIL_H + +#include +#include + +G_BEGIN_DECLS + +guint util_get_number_of_cpus (void); + +gboolean split_string_from_file_on_equals ( const gchar *buf, gchar **key, gchar **val ); + +void util_add_to_deletion_list ( const gchar* filename ); +void util_remove_all_in_deletion_list ( void ); + +gchar *util_str_remove_chars(gchar *string, const gchar *chars); + +/** Returns @c TRUE if @a ptr is @c NULL or @c *ptr is @c FALSE. */ +#define EMPTY(ptr) \ + (!(ptr) || !*(ptr)) + +/** Iterates all the nodes in @a list. + * @param node should be a (@c GList*). + * @param list @c GList to traverse. */ +#define foreach_list(node, list) \ + for (node = list; node != NULL; node = node->next) + +/** Iterates all the nodes in @a list. + * @param node should be a (@c GSList*). + * @param list @c GSList to traverse. */ +#define foreach_slist(node, list) \ + foreach_list(node, list) + +/** Iterates through each character in @a string. + * @param char_ptr Pointer to character. + * @param string String to traverse. + * @warning Doesn't include null terminating character. */ +#define foreach_str(char_ptr, string) \ + for (char_ptr = string; *char_ptr; char_ptr++) + +int util_remove ( const gchar *filename ); + +gchar* util_write_tmp_file_from_bytes ( const void *buffer, gsize count ); + +gchar* util_make_absolute_filename ( const gchar *filename, const gchar *dirpath ); + +void util_make_absolute_filenames ( GList *filenames, const gchar *dirpath ); + +time_t util_timegm (struct tm *tm); + +gchar* util_formatd ( const gchar *format, gdouble dd ); + +gboolean util_is_url ( const gchar *str ); + +G_END_DECLS + +#endif diff --git a/src/vik_compat.c b/src/vik_compat.c new file mode 100644 index 0000000..ded6fc6 --- /dev/null +++ b/src/vik_compat.c @@ -0,0 +1,44 @@ +/* -*- Mode: C; indent-tabs-mode: t; c-basic-offset: 4; tab-width: 4 -*- */ +/* + * viking -- GPS Data and Topo Analyzer, Explorer, and Manager + * + * Copyright (C) 2014, Rob Norris + * + * 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., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA + * + */ + +#include "vik_compat.h" + +GMutex * vik_mutex_new () +{ +#if GLIB_CHECK_VERSION (2, 32, 0) + GMutex *mutex = g_new (GMutex, 1); + g_mutex_init(mutex); +#else + GMutex *mutex = g_mutex_new(); +#endif + return mutex; +} + +void vik_mutex_free (GMutex *mutex) +{ +#if GLIB_CHECK_VERSION (2, 32, 0) + g_mutex_clear (mutex); + g_free (mutex); +#else + g_mutex_free (mutex); +#endif +} diff --git a/src/vik_compat.h b/src/vik_compat.h new file mode 100644 index 0000000..46ed7ba --- /dev/null +++ b/src/vik_compat.h @@ -0,0 +1,53 @@ +/* -*- Mode: C; indent-tabs-mode: t; c-basic-offset: 4; tab-width: 4 -*- */ +/* + * viking -- GPS Data and Topo Analyzer, Explorer, and Manager + * + * Copyright (C) 2014, Rob Norris + * + * 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., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA + * + */ +#ifndef __VIKING_COMPAT_H +#define __VIKING_COMPAT_H + +#include +#include + +G_BEGIN_DECLS + +#if !GLIB_CHECK_VERSION(2,26,0) +typedef struct stat GStatBuf; +#endif + +// Hide ifdef complexities of function variants here + +GMutex * vik_mutex_new (); +void vik_mutex_free (GMutex *mutex); + +/* + * Since combo boxes are used in various places + * keep the code reasonably tidy and only have one ifdef to cater for the naming variances + */ +#if GTK_CHECK_VERSION (2, 24, 0) +#define vik_combo_box_text_new gtk_combo_box_text_new +#define vik_combo_box_text_append(X,Y) gtk_combo_box_text_append_text(GTK_COMBO_BOX_TEXT(X),Y) +#else +#define vik_combo_box_text_new gtk_combo_box_new_text +#define vik_combo_box_text_append(X,Y) gtk_combo_box_append_text(GTK_COMBO_BOX(X),Y) +#endif + +G_END_DECLS + +#endif diff --git a/src/vikaggregatelayer.c b/src/vikaggregatelayer.c new file mode 100644 index 0000000..60542cb --- /dev/null +++ b/src/vikaggregatelayer.c @@ -0,0 +1,1029 @@ +/* + * viking -- GPS Data and Topo Analyzer, Explorer, and Manager + * + * Copyright (C) 2003-2005, Evan Battaglia + * Copyright (C) 2013-2015, Rob Norris + * + * 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., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA + * + */ + +#include "viking.h" +#include "viktrwlayer_analysis.h" +#include "viktrwlayer_tracklist.h" +#include "viktrwlayer_waypointlist.h" +#include "icons/icons.h" + +#include +#include + +static void aggregate_layer_marshall( VikAggregateLayer *val, guint8 **data, guint *len ); +static VikAggregateLayer *aggregate_layer_unmarshall( guint8 *data, guint len, VikViewport *vvp ); +static void aggregate_layer_change_coord_mode ( VikAggregateLayer *val, VikCoordMode mode ); +static void aggregate_layer_drag_drop_request ( VikAggregateLayer *val_src, VikAggregateLayer *val_dest, GtkTreeIter *src_item_iter, GtkTreePath *dest_path ); +static const gchar* aggregate_layer_tooltip ( VikAggregateLayer *val ); +static void aggregate_layer_add_menu_items ( VikAggregateLayer *val, GtkMenu *menu, gpointer vlp ); + +VikLayerInterface vik_aggregate_layer_interface = { + "Aggregate", + N_("Aggregate"), + "A", + &vikaggregatelayer_pixbuf, + + NULL, + 0, + + NULL, + 0, + NULL, + 0, + + VIK_MENU_ITEM_ALL, + + (VikLayerFuncCreate) vik_aggregate_layer_create, + (VikLayerFuncRealize) vik_aggregate_layer_realize, + (VikLayerFuncPostRead) NULL, + (VikLayerFuncFree) vik_aggregate_layer_free, + + (VikLayerFuncProperties) NULL, + (VikLayerFuncDraw) vik_aggregate_layer_draw, + (VikLayerFuncChangeCoordMode) aggregate_layer_change_coord_mode, + + (VikLayerFuncGetTimestamp) NULL, + + (VikLayerFuncSetMenuItemsSelection) NULL, + (VikLayerFuncGetMenuItemsSelection) NULL, + + (VikLayerFuncAddMenuItems) aggregate_layer_add_menu_items, + (VikLayerFuncSublayerAddMenuItems) NULL, + + (VikLayerFuncSublayerRenameRequest) NULL, + (VikLayerFuncSublayerToggleVisible) NULL, + (VikLayerFuncSublayerTooltip) NULL, + (VikLayerFuncLayerTooltip) aggregate_layer_tooltip, + (VikLayerFuncLayerSelected) NULL, + + (VikLayerFuncMarshall) aggregate_layer_marshall, + (VikLayerFuncUnmarshall) aggregate_layer_unmarshall, + + (VikLayerFuncSetParam) NULL, + (VikLayerFuncGetParam) NULL, + (VikLayerFuncChangeParam) NULL, + + (VikLayerFuncReadFileData) NULL, + (VikLayerFuncWriteFileData) NULL, + + (VikLayerFuncDeleteItem) NULL, + (VikLayerFuncCutItem) NULL, + (VikLayerFuncCopyItem) NULL, + (VikLayerFuncPasteItem) NULL, + (VikLayerFuncFreeCopiedItem) NULL, + (VikLayerFuncDragDropRequest) aggregate_layer_drag_drop_request, + + (VikLayerFuncSelectClick) NULL, + (VikLayerFuncSelectMove) NULL, + (VikLayerFuncSelectRelease) NULL, + (VikLayerFuncSelectedViewportMenu) NULL, +}; + +struct _VikAggregateLayer { + VikLayer vl; + GList *children; + // One per layer + GtkWidget *tracks_analysis_dialog; +}; + +GType vik_aggregate_layer_get_type () +{ + static GType val_type = 0; + + if (!val_type) + { + static const GTypeInfo val_info = + { + sizeof (VikAggregateLayerClass), + NULL, /* base_init */ + NULL, /* base_finalize */ + NULL, /* class init */ + NULL, /* class_finalize */ + NULL, /* class_data */ + sizeof (VikAggregateLayer), + 0, + NULL /* instance init */ + }; + val_type = g_type_register_static ( VIK_LAYER_TYPE, "VikAggregateLayer", &val_info, 0 ); + } + + return val_type; +} + +VikAggregateLayer *vik_aggregate_layer_create (VikViewport *vp) +{ + VikAggregateLayer *rv = vik_aggregate_layer_new (); + vik_layer_rename ( VIK_LAYER(rv), vik_aggregate_layer_interface.name ); + return rv; +} + +static void aggregate_layer_marshall( VikAggregateLayer *val, guint8 **data, guint *datalen ) +{ + GList *child = val->children; + VikLayer *child_layer; + guint8 *ld; + guint ll; + GByteArray* b = g_byte_array_new (); + guint len; + +#define alm_append(obj, sz) \ + len = (sz); \ + g_byte_array_append ( b, (guint8 *)&len, sizeof(len) ); \ + g_byte_array_append ( b, (guint8 *)(obj), len ); + + vik_layer_marshall_params(VIK_LAYER(val), &ld, &ll); + alm_append(ld, ll); + g_free(ld); + + while (child) { + child_layer = VIK_LAYER(child->data); + vik_layer_marshall ( child_layer, &ld, &ll ); + if (ld) { + alm_append(ld, ll); + g_free(ld); + } + child = child->next; + } + *data = b->data; + *datalen = b->len; + g_byte_array_free(b, FALSE); +#undef alm_append +} + +static VikAggregateLayer *aggregate_layer_unmarshall( guint8 *data, guint len, VikViewport *vvp ) +{ +#define alm_size (*(guint *)data) +#define alm_next \ + len -= sizeof(gint) + alm_size; \ + data += sizeof(gint) + alm_size; + + VikAggregateLayer *rv = vik_aggregate_layer_new(); + VikLayer *child_layer; + + vik_layer_unmarshall_params ( VIK_LAYER(rv), data+sizeof(guint), alm_size, vvp ); + alm_next; + + while (len>0) { + child_layer = vik_layer_unmarshall ( data + sizeof(guint), alm_size, vvp ); + if (child_layer) { + rv->children = g_list_append ( rv->children, child_layer ); + g_signal_connect_swapped ( G_OBJECT(child_layer), "update", G_CALLBACK(vik_layer_emit_update_secondary), rv ); + } + alm_next; + } + // g_print("aggregate_layer_unmarshall ended with len=%d\n", len); + return rv; +#undef alm_size +#undef alm_next +} + +VikAggregateLayer *vik_aggregate_layer_new () +{ + VikAggregateLayer *val = VIK_AGGREGATE_LAYER ( g_object_new ( VIK_AGGREGATE_LAYER_TYPE, NULL ) ); + vik_layer_set_type ( VIK_LAYER(val), VIK_LAYER_AGGREGATE ); + val->children = NULL; + return val; +} + +void vik_aggregate_layer_insert_layer ( VikAggregateLayer *val, VikLayer *l, GtkTreeIter *replace_iter ) +{ + GtkTreeIter iter; + VikLayer *vl = VIK_LAYER(val); + + // By default layers are inserted above the selected layer + gboolean put_above = TRUE; + + // These types are 'base' types in that you what other information on top + if ( l->type == VIK_LAYER_MAPS || l->type == VIK_LAYER_DEM || l->type == VIK_LAYER_GEOREF ) + put_above = FALSE; + + if ( vl->realized ) + { + vik_treeview_insert_layer ( vl->vt, &(vl->iter), &iter, l->name, val, put_above, l, l->type, l->type, replace_iter, vik_layer_get_timestamp(l) ); + if ( ! l->visible ) + vik_treeview_item_set_visible ( vl->vt, &iter, FALSE ); + vik_layer_realize ( l, vl->vt, &iter ); + + if ( val->children == NULL ) + vik_treeview_expand ( vl->vt, &(vl->iter) ); + } + + if (replace_iter) { + GList *theone = g_list_find ( val->children, vik_treeview_item_get_pointer ( vl->vt, replace_iter ) ); + if ( put_above ) + val->children = g_list_insert ( val->children, l, g_list_position(val->children,theone)+1 ); + else + // Thus insert 'here' (so don't add 1) + val->children = g_list_insert ( val->children, l, g_list_position(val->children,theone) ); + } else { + // Effectively insert at 'end' of the list to match how displayed in the treeview + // - but since it is drawn from 'bottom first' it is actually the first in the child list + // This ordering is especially important if it is a map or similar type, + // which needs be drawn first for the layering draw method to work properly. + // ATM this only happens when a layer is drag/dropped to the end of an aggregate layer + val->children = g_list_prepend ( val->children, l ); + } + g_signal_connect_swapped ( G_OBJECT(l), "update", G_CALLBACK(vik_layer_emit_update_secondary), val ); +} + +/** + * vik_aggregate_layer_add_layer: + * @allow_reordering: should be set for GUI interactions, + * whereas loading from a file needs strict ordering and so should be FALSE + */ +void vik_aggregate_layer_add_layer ( VikAggregateLayer *val, VikLayer *l, gboolean allow_reordering ) +{ + GtkTreeIter iter; + VikLayer *vl = VIK_LAYER(val); + + // By default layers go to the top + gboolean put_above = TRUE; + + if ( allow_reordering ) { + // These types are 'base' types in that you what other information on top + if ( l->type == VIK_LAYER_MAPS || l->type == VIK_LAYER_DEM || l->type == VIK_LAYER_GEOREF ) + put_above = FALSE; + } + + if ( vl->realized ) + { + vik_treeview_add_layer ( vl->vt, &(vl->iter), &iter, l->name, val, put_above, l, l->type, l->type, vik_layer_get_timestamp(l) ); + if ( ! l->visible ) + vik_treeview_item_set_visible ( vl->vt, &iter, FALSE ); + vik_layer_realize ( l, vl->vt, &iter ); + + if ( val->children == NULL ) + vik_treeview_expand ( vl->vt, &(vl->iter) ); + } + + if ( put_above ) + val->children = g_list_append ( val->children, l ); + else + val->children = g_list_prepend ( val->children, l ); + + g_signal_connect_swapped ( G_OBJECT(l), "update", G_CALLBACK(vik_layer_emit_update_secondary), val ); +} + +void vik_aggregate_layer_move_layer ( VikAggregateLayer *val, GtkTreeIter *child_iter, gboolean up ) +{ + GList *theone, *first, *second; + VikLayer *vl = VIK_LAYER(val); + vik_treeview_move_item ( vl->vt, child_iter, up ); + + theone = g_list_find ( val->children, vik_treeview_item_get_pointer ( vl->vt, child_iter ) ); + + g_assert ( theone != NULL ); + + /* the old switcheroo */ + if ( up && theone->next ) + { + first = theone; + second = theone->next; + } + else if ( !up && theone->prev ) + { + first = theone->prev; + second = theone; + } + else + return; + + first->next = second->next; + second->prev = first->prev; + first->prev = second; + second->next = first; + + /* second is now first */ + + if ( second->prev ) + second->prev->next = second; + if ( first->next ) + first->next->prev = first; + + if ( second->prev == NULL ) + val->children = second; +} + +/* Draw the aggregate layer. If vik viewport is in half_drawn mode, this means we are only + * to draw the layers above and including the trigger layer. + * To do this we don't draw any layers if in half drawn mode, unless we find the + * trigger layer, in which case we pull up the saved pixmap, turn off half drawn mode and + * start drawing layers. + * Also, if we were never in half drawn mode, we save a snapshot + * of the pixmap before drawing the trigger layer so we can use it again + * later. + */ +void vik_aggregate_layer_draw ( VikAggregateLayer *val, VikViewport *vp ) +{ + GList *iter = val->children; + VikLayer *vl; + VikLayer *trigger = VIK_LAYER(vik_viewport_get_trigger( vp )); + while ( iter ) { + vl = VIK_LAYER(iter->data); + if ( vl == trigger ) { + if ( vik_viewport_get_half_drawn ( vp ) ) { + vik_viewport_set_half_drawn ( vp, FALSE ); + vik_viewport_snapshot_load( vp ); + } else { + vik_viewport_snapshot_save( vp ); + } + } + if ( vl->type == VIK_LAYER_AGGREGATE || vl->type == VIK_LAYER_GPS || ! vik_viewport_get_half_drawn( vp ) ) + vik_layer_draw ( vl, vp ); + iter = iter->next; + } +} + +static void aggregate_layer_change_coord_mode ( VikAggregateLayer *val, VikCoordMode mode ) +{ + GList *iter = val->children; + while ( iter ) + { + vik_layer_change_coord_mode ( VIK_LAYER(iter->data), mode ); + iter = iter->next; + } +} + +// A slightly better way of defining the menu callback information +// This should be easier to extend/rework compared to previously +typedef enum { + MA_VAL = 0, + MA_VLP, + MA_LAST +} menu_array_index; + +typedef gpointer menu_array_values[MA_LAST]; + +static void aggregate_layer_child_visible_toggle ( menu_array_values values ) +{ + VikAggregateLayer *val = VIK_AGGREGATE_LAYER ( values[MA_VAL] ); + VikLayersPanel *vlp = VIK_LAYERS_PANEL ( values[MA_VLP] ); + VikLayer *vl; + + // Loop around all (child) layers applying visibility setting + // This does not descend the tree if there are aggregates within aggregrate - just the first level of layers held + GList *iter = val->children; + while ( iter ) { + vl = VIK_LAYER ( iter->data ); + vl->visible = !vl->visible; + // Also set checkbox on/off + vik_treeview_item_toggle_visible ( vik_layers_panel_get_treeview ( vlp ), &(vl->iter) ); + iter = iter->next; + } + // Redraw as view may have changed + vik_layer_emit_update ( VIK_LAYER ( val ) ); +} + +static void aggregate_layer_child_visible ( menu_array_values values, gboolean on_off) +{ + // Convert data back to correct types + VikAggregateLayer *val = VIK_AGGREGATE_LAYER ( values[MA_VAL] ); + VikLayersPanel *vlp = VIK_LAYERS_PANEL ( values[MA_VLP] ); + VikLayer *vl; + + // Loop around all (child) layers applying visibility setting + // This does not descend the tree if there are aggregates within aggregrate - just the first level of layers held + GList *iter = val->children; + while ( iter ) { + vl = VIK_LAYER ( iter->data ); + vl->visible = on_off; + // Also set checkbox on_off + vik_treeview_item_set_visible ( vik_layers_panel_get_treeview ( vlp ), &(vl->iter), on_off ); + iter = iter->next; + } + // Redraw as view may have changed + vik_layer_emit_update ( VIK_LAYER ( val ) ); +} + +static void aggregate_layer_child_visible_on ( menu_array_values values ) +{ + aggregate_layer_child_visible ( values, TRUE ); +} + +static void aggregate_layer_child_visible_off ( menu_array_values values ) +{ + aggregate_layer_child_visible ( values, FALSE ); +} + +/** + * If order is true sort ascending, otherwise a descending sort + */ +static gint sort_layer_compare ( gconstpointer a, gconstpointer b, gpointer order ) +{ + VikLayer *sa = (VikLayer *)a; + VikLayer *sb = (VikLayer *)b; + + // Default ascending order + gint answer = g_strcmp0 ( sa->name, sb->name ); + + if ( GPOINTER_TO_INT(order) ) { + // Invert sort order for ascending order + answer = -answer; + } + + return answer; +} + +static void aggregate_layer_sort_a2z ( menu_array_values values ) +{ + VikAggregateLayer *val = VIK_AGGREGATE_LAYER ( values[MA_VAL] ); + vik_treeview_sort_children ( VIK_LAYER(val)->vt, &(VIK_LAYER(val)->iter), VL_SO_ALPHABETICAL_ASCENDING ); + val->children = g_list_sort_with_data ( val->children, sort_layer_compare, GINT_TO_POINTER(TRUE) ); +} + +static void aggregate_layer_sort_z2a ( menu_array_values values ) +{ + VikAggregateLayer *val = VIK_AGGREGATE_LAYER ( values[MA_VAL] ); + vik_treeview_sort_children ( VIK_LAYER(val)->vt, &(VIK_LAYER(val)->iter), VL_SO_ALPHABETICAL_DESCENDING ); + val->children = g_list_sort_with_data ( val->children, sort_layer_compare, GINT_TO_POINTER(FALSE) ); +} + +/** + * If order is true sort ascending, otherwise a descending sort + */ +static gint sort_layer_compare_timestamp ( gconstpointer a, gconstpointer b, gpointer order ) +{ + VikLayer *sa = (VikLayer *)a; + VikLayer *sb = (VikLayer *)b; + + // Default ascending order + // NB This might be relatively slow... + gint answer = ( vik_layer_get_timestamp(sa) > vik_layer_get_timestamp(sb) ); + + if ( GPOINTER_TO_INT(order) ) { + // Invert sort order for ascending order + answer = !answer; + } + + return answer; +} + +static void aggregate_layer_sort_timestamp_ascend ( menu_array_values values ) +{ + VikAggregateLayer *val = VIK_AGGREGATE_LAYER ( values[MA_VAL] ); + vik_treeview_sort_children ( VIK_LAYER(val)->vt, &(VIK_LAYER(val)->iter), VL_SO_DATE_ASCENDING ); + val->children = g_list_sort_with_data ( val->children, sort_layer_compare_timestamp, GINT_TO_POINTER(TRUE) ); +} + +static void aggregate_layer_sort_timestamp_descend ( menu_array_values values ) +{ + VikAggregateLayer *val = VIK_AGGREGATE_LAYER ( values[MA_VAL] ); + vik_treeview_sort_children ( VIK_LAYER(val)->vt, &(VIK_LAYER(val)->iter), VL_SO_DATE_DESCENDING ); + val->children = g_list_sort_with_data ( val->children, sort_layer_compare_timestamp, GINT_TO_POINTER(FALSE) ); +} + +/** + * aggregate_layer_waypoint_create_list: + * @vl: The layer that should create the waypoint and layers list + * @user_data: Not used in this function + * + * Returns: A list of #vik_trw_waypoint_list_t + */ +static GList* aggregate_layer_waypoint_create_list ( VikLayer *vl, gpointer user_data ) +{ + VikAggregateLayer *val = VIK_AGGREGATE_LAYER(vl); + + // Get all TRW layers + GList *layers = NULL; + layers = vik_aggregate_layer_get_all_layers_of_type ( val, layers, VIK_LAYER_TRW, TRUE ); + + // For each TRW layers keep adding the waypoints to build a list of all of them + GList *waypoints_and_layers = NULL; + layers = g_list_first ( layers ); + while ( layers ) { + GList *waypoints = NULL; + waypoints = g_list_concat ( waypoints, g_hash_table_get_values ( vik_trw_layer_get_waypoints( VIK_TRW_LAYER(layers->data) ) ) ); + + waypoints_and_layers = g_list_concat ( waypoints_and_layers, vik_trw_layer_build_waypoint_list_t ( VIK_TRW_LAYER(layers->data), waypoints ) ); + + layers = g_list_next ( layers ); + } + g_list_free ( layers ); + + return waypoints_and_layers; +} + +static void aggregate_layer_waypoint_list_dialog ( menu_array_values values ) +{ + VikAggregateLayer *val = VIK_AGGREGATE_LAYER ( values[MA_VAL] ); + gchar *title = g_strdup_printf ( _("%s: Waypoint List"), VIK_LAYER(val)->name ); + vik_trw_layer_waypoint_list_show_dialog ( title, VIK_LAYER(val), NULL, aggregate_layer_waypoint_create_list, TRUE ); + g_free ( title ); +} + +/** + * + */ +gboolean vik_aggregate_layer_search_date ( VikAggregateLayer *val, gchar *date_str ) +{ + gboolean found = FALSE; + VikViewport *vvp = vik_window_viewport ( VIK_WINDOW(VIK_GTK_WINDOW_FROM_LAYER(val)) ); + + VikCoord position; + GList *layers = NULL; + layers = vik_aggregate_layer_get_all_layers_of_type ( val, layers, VIK_LAYER_TRW, TRUE ); + GList *gl = layers; + // Search tracks first + while ( gl && !found ) { + // Make it auto select the item if found + found = vik_trw_layer_find_date ( VIK_TRW_LAYER(gl->data), date_str, &position, vvp, TRUE, TRUE ); + gl = g_list_next ( gl ); + } + if ( !found ) { + // Reset and try on Waypoints + gl = g_list_first ( layers ); + while ( gl && !found ) { + // Make it auto select the item if found + found = vik_trw_layer_find_date ( VIK_TRW_LAYER(gl->data), date_str, &position, vvp, FALSE, TRUE ); + gl = g_list_next ( gl ); + } + } + g_list_free ( layers ); + + return found; +} +/** + * Search all TrackWaypoint layers in this aggregate layer for an item on the user specified date + */ +static void aggregate_layer_search_date ( menu_array_values values ) +{ + VikAggregateLayer *val = VIK_AGGREGATE_LAYER ( values[MA_VAL] ); + gchar *date_str = a_dialog_get_date ( VIK_GTK_WINDOW_FROM_LAYER(val), _("Search by Date") ); + if ( !date_str ) + return; + + gboolean found = vik_aggregate_layer_search_date ( val, date_str ); + if ( !found ) + a_dialog_info_msg ( VIK_GTK_WINDOW_FROM_LAYER(val), _("No items found with the requested date.") ); + g_free ( date_str ); +} + +/** + * aggregate_layer_track_create_list: + * @vl: The layer that should create the track and layers list + * @user_data: Not used in this function + * + * Returns: A list of #vik_trw_track_list_t + */ +static GList* aggregate_layer_track_create_list ( VikLayer *vl, gpointer user_data ) +{ + VikAggregateLayer *val = VIK_AGGREGATE_LAYER(vl); + + // Get all TRW layers + GList *layers = NULL; + layers = vik_aggregate_layer_get_all_layers_of_type ( val, layers, VIK_LAYER_TRW, TRUE ); + + // For each TRW layers keep adding the tracks and routes to build a list of all of them + GList *tracks_and_layers = NULL; + layers = g_list_first ( layers ); + while ( layers ) { + GList *tracks = NULL; + tracks = g_list_concat ( tracks, g_hash_table_get_values ( vik_trw_layer_get_tracks( VIK_TRW_LAYER(layers->data) ) ) ); + tracks = g_list_concat ( tracks, g_hash_table_get_values ( vik_trw_layer_get_routes( VIK_TRW_LAYER(layers->data) ) ) ); + + tracks_and_layers = g_list_concat ( tracks_and_layers, vik_trw_layer_build_track_list_t ( VIK_TRW_LAYER(layers->data), tracks ) ); + + layers = g_list_next ( layers ); + } + g_list_free ( layers ); + + return tracks_and_layers; +} + +static void aggregate_layer_track_list_dialog ( menu_array_values values ) +{ + VikAggregateLayer *val = VIK_AGGREGATE_LAYER ( values[MA_VAL] ); + gchar *title = g_strdup_printf ( _("%s: Track and Route List"), VIK_LAYER(val)->name ); + vik_trw_layer_track_list_show_dialog ( title, VIK_LAYER(val), NULL, aggregate_layer_track_create_list, TRUE ); + g_free ( title ); +} + +/** + * aggregate_layer_analyse_close: + * + * Stuff to do on dialog closure + */ +static void aggregate_layer_analyse_close ( GtkWidget *dialog, gint resp, VikLayer* vl ) +{ + VikAggregateLayer *val = VIK_AGGREGATE_LAYER(vl); + gtk_widget_destroy ( dialog ); + val->tracks_analysis_dialog = NULL; +} + +static void aggregate_layer_analyse ( menu_array_values values ) +{ + VikAggregateLayer *val = VIK_AGGREGATE_LAYER ( values[MA_VAL] ); + + // There can only be one! + if ( val->tracks_analysis_dialog ) + return; + + val->tracks_analysis_dialog = vik_trw_layer_analyse_this ( VIK_GTK_WINDOW_FROM_LAYER(VIK_LAYER(val)), + VIK_LAYER(val)->name, + VIK_LAYER(val), + NULL, + aggregate_layer_track_create_list, + aggregate_layer_analyse_close ); +} + +static void aggregate_layer_load_external_layers ( VikAggregateLayer *val ) +{ + GList *iter = val->children; + while ( iter ) { + VikLayer *vl = VIK_LAYER ( iter->data ); + g_debug ( "child %d", vl->type ); + switch ( vl->type ) { + case VIK_LAYER_TRW: trw_ensure_layer_loaded ( VIK_TRW_LAYER ( iter->data ) ); break; + case VIK_LAYER_AGGREGATE: aggregate_layer_load_external_layers ( VIK_AGGREGATE_LAYER ( iter->data ) ); break; + default: /* do nothing */ break; + } + iter = iter->next; + } +} + +static void aggregate_layer_load_external_layers_click ( menu_array_values values ) +{ + aggregate_layer_load_external_layers ( VIK_AGGREGATE_LAYER ( values[MA_VAL] ) ); + vik_layers_panel_calendar_update ( values[MA_VLP] ); +} + +static void aggregate_layer_add_menu_items ( VikAggregateLayer *val, GtkMenu *menu, gpointer vlp ) +{ + // Data to pass on in menu functions + static menu_array_values values; + values[MA_VAL] = val; + values[MA_VLP] = vlp; + + GtkWidget *item = gtk_menu_item_new(); + gtk_menu_shell_append ( GTK_MENU_SHELL(menu), item ); + gtk_widget_show ( item ); + + GtkWidget *vis_submenu = gtk_menu_new (); + item = gtk_menu_item_new_with_mnemonic ( _("_Visibility") ); + gtk_menu_shell_append (GTK_MENU_SHELL (menu), item); + gtk_widget_show ( item ); + gtk_menu_item_set_submenu (GTK_MENU_ITEM (item), vis_submenu ); + + item = gtk_image_menu_item_new_with_mnemonic ( _("_Show All") ); + gtk_image_menu_item_set_image ( (GtkImageMenuItem*)item, gtk_image_new_from_stock (GTK_STOCK_APPLY, GTK_ICON_SIZE_MENU) ); + g_signal_connect_swapped ( G_OBJECT(item), "activate", G_CALLBACK(aggregate_layer_child_visible_on), values ); + gtk_menu_shell_append (GTK_MENU_SHELL (vis_submenu), item); + gtk_widget_show ( item ); + + item = gtk_image_menu_item_new_with_mnemonic ( _("_Hide All") ); + gtk_image_menu_item_set_image ( (GtkImageMenuItem*)item, gtk_image_new_from_stock (GTK_STOCK_CLEAR, GTK_ICON_SIZE_MENU) ); + g_signal_connect_swapped ( G_OBJECT(item), "activate", G_CALLBACK(aggregate_layer_child_visible_off), values ); + gtk_menu_shell_append (GTK_MENU_SHELL (vis_submenu), item); + gtk_widget_show ( item ); + + item = gtk_image_menu_item_new_with_mnemonic ( _("_Toggle") ); + gtk_image_menu_item_set_image ( (GtkImageMenuItem*)item, gtk_image_new_from_stock (GTK_STOCK_REFRESH, GTK_ICON_SIZE_MENU) ); + g_signal_connect_swapped ( G_OBJECT(item), "activate", G_CALLBACK(aggregate_layer_child_visible_toggle), values ); + gtk_menu_shell_append (GTK_MENU_SHELL (vis_submenu), item); + gtk_widget_show ( item ); + + GtkWidget *submenu_sort = gtk_menu_new (); + item = gtk_image_menu_item_new_with_mnemonic ( _("_Sort") ); + gtk_image_menu_item_set_image ( (GtkImageMenuItem*)item, gtk_image_new_from_stock (GTK_STOCK_REFRESH, GTK_ICON_SIZE_MENU) ); + gtk_menu_shell_append (GTK_MENU_SHELL (menu), item); + gtk_widget_show ( item ); + gtk_menu_item_set_submenu (GTK_MENU_ITEM (item), submenu_sort ); + + item = gtk_image_menu_item_new_with_mnemonic ( _("Name _Ascending") ); + gtk_image_menu_item_set_image ( (GtkImageMenuItem*)item, gtk_image_new_from_stock (GTK_STOCK_SORT_ASCENDING, GTK_ICON_SIZE_MENU) ); + g_signal_connect_swapped ( G_OBJECT(item), "activate", G_CALLBACK(aggregate_layer_sort_a2z), values ); + gtk_menu_shell_append ( GTK_MENU_SHELL(submenu_sort), item ); + gtk_widget_show ( item ); + + item = gtk_image_menu_item_new_with_mnemonic ( _("Name _Descending") ); + gtk_image_menu_item_set_image ( (GtkImageMenuItem*)item, gtk_image_new_from_stock (GTK_STOCK_SORT_DESCENDING, GTK_ICON_SIZE_MENU) ); + g_signal_connect_swapped ( G_OBJECT(item), "activate", G_CALLBACK(aggregate_layer_sort_z2a), values ); + gtk_menu_shell_append ( GTK_MENU_SHELL(submenu_sort), item ); + gtk_widget_show ( item ); + + item = gtk_image_menu_item_new_with_mnemonic ( _("Date Ascending") ); + gtk_image_menu_item_set_image ( (GtkImageMenuItem*)item, gtk_image_new_from_stock (GTK_STOCK_SORT_ASCENDING, GTK_ICON_SIZE_MENU) ); + g_signal_connect_swapped ( G_OBJECT(item), "activate", G_CALLBACK(aggregate_layer_sort_timestamp_ascend), values ); + gtk_menu_shell_append ( GTK_MENU_SHELL(submenu_sort), item ); + gtk_widget_show ( item ); + + item = gtk_image_menu_item_new_with_mnemonic ( _("Date Descending") ); + gtk_image_menu_item_set_image ( (GtkImageMenuItem*)item, gtk_image_new_from_stock (GTK_STOCK_SORT_DESCENDING, GTK_ICON_SIZE_MENU) ); + g_signal_connect_swapped ( G_OBJECT(item), "activate", G_CALLBACK(aggregate_layer_sort_timestamp_descend), values ); + gtk_menu_shell_append ( GTK_MENU_SHELL(submenu_sort), item ); + gtk_widget_show ( item ); + + item = gtk_menu_item_new_with_mnemonic ( _("_Statistics") ); + g_signal_connect_swapped ( G_OBJECT(item), "activate", G_CALLBACK(aggregate_layer_analyse), values ); + gtk_menu_shell_append (GTK_MENU_SHELL (menu), item); + gtk_widget_show ( item ); + + item = gtk_image_menu_item_new_with_mnemonic ( _("Track _List...") ); + gtk_image_menu_item_set_image ( (GtkImageMenuItem*)item, gtk_image_new_from_stock (GTK_STOCK_INDEX, GTK_ICON_SIZE_MENU) ); + g_signal_connect_swapped ( G_OBJECT(item), "activate", G_CALLBACK(aggregate_layer_track_list_dialog), values ); + gtk_menu_shell_append ( GTK_MENU_SHELL(menu), item ); + gtk_widget_show ( item ); + + item = gtk_image_menu_item_new_with_mnemonic ( _("_Waypoint List...") ); + gtk_image_menu_item_set_image ( (GtkImageMenuItem*)item, gtk_image_new_from_stock (GTK_STOCK_INDEX, GTK_ICON_SIZE_MENU) ); + g_signal_connect_swapped ( G_OBJECT(item), "activate", G_CALLBACK(aggregate_layer_waypoint_list_dialog), values ); + gtk_menu_shell_append ( GTK_MENU_SHELL(menu), item ); + gtk_widget_show ( item ); + + GtkWidget *search_submenu = gtk_menu_new (); + item = gtk_image_menu_item_new_with_mnemonic ( _("Searc_h") ); + gtk_image_menu_item_set_image ( (GtkImageMenuItem*)item, gtk_image_new_from_stock (GTK_STOCK_JUMP_TO, GTK_ICON_SIZE_MENU) ); + gtk_menu_shell_append (GTK_MENU_SHELL (menu), item); + gtk_widget_show ( item ); + gtk_menu_item_set_submenu (GTK_MENU_ITEM (item), search_submenu ); + + item = gtk_menu_item_new_with_mnemonic ( _("By _Date...") ); + g_signal_connect_swapped ( G_OBJECT(item), "activate", G_CALLBACK(aggregate_layer_search_date), values ); + gtk_menu_shell_append ( GTK_MENU_SHELL(search_submenu), item ); + gtk_widget_set_tooltip_text (item, _("Find the first item with a specified date")); + gtk_widget_show ( item ); + + item = gtk_image_menu_item_new_with_mnemonic ( _("Load E_xternal Layers") ); + gtk_image_menu_item_set_image ( (GtkImageMenuItem*)item, NULL ); + g_signal_connect_swapped ( G_OBJECT(item), "activate", G_CALLBACK(aggregate_layer_load_external_layers_click), values ); + gtk_menu_shell_append ( GTK_MENU_SHELL(menu), item ); + gtk_widget_show ( item ); +} + +static void disconnect_layer_signal ( VikLayer *vl, VikAggregateLayer *val ) +{ + guint number_handlers = g_signal_handlers_disconnect_matched(vl, G_SIGNAL_MATCH_DATA, 0, 0, 0, 0, val); + if ( number_handlers != 1 ) + g_critical ("%s: Unexpected number of disconnect handlers: %d", __FUNCTION__, number_handlers); +} + +void vik_aggregate_layer_free ( VikAggregateLayer *val ) +{ + g_list_foreach ( val->children, (GFunc)(disconnect_layer_signal), val ); + g_list_foreach ( val->children, (GFunc)(g_object_unref), NULL ); + g_list_free ( val->children ); + if ( val->tracks_analysis_dialog != NULL ) + gtk_widget_destroy ( val->tracks_analysis_dialog ); +} + +static void delete_layer_iter ( VikLayer *vl ) +{ + if ( vl->realized ) + vik_treeview_item_delete ( vl->vt, &(vl->iter) ); +} + +void vik_aggregate_layer_clear ( VikAggregateLayer *val ) +{ + g_list_foreach ( val->children, (GFunc)(disconnect_layer_signal), val ); + g_list_foreach ( val->children, (GFunc)(delete_layer_iter), NULL ); + g_list_foreach ( val->children, (GFunc)(g_object_unref), NULL ); + g_list_free ( val->children ); + val->children = NULL; +} + +static void aggregate_layer_delete_common ( VikAggregateLayer *val, VikLayer *vl ) +{ + val->children = g_list_remove ( val->children, vl ); + disconnect_layer_signal ( vl, val ); + g_object_unref ( vl ); +} + +gboolean vik_aggregate_layer_delete ( VikAggregateLayer *val, GtkTreeIter *iter ) +{ + VikLayer *l = VIK_LAYER( vik_treeview_item_get_pointer ( VIK_LAYER(val)->vt, iter ) ); + gboolean was_visible = l->visible; + + vik_treeview_item_delete ( VIK_LAYER(val)->vt, iter ); + aggregate_layer_delete_common ( val, l ); + + return was_visible; +} + +/** + * Delete a child layer from the aggregate layer + */ +gboolean vik_aggregate_layer_delete_layer ( VikAggregateLayer *val, VikLayer *vl ) +{ + gboolean was_visible = vl->visible; + + if ( vl->realized && &vl->iter ) + vik_treeview_item_delete ( VIK_LAYER(val)->vt, &vl->iter ); + aggregate_layer_delete_common ( val, vl ); + + return was_visible; +} + +#if 0 +/* returns 0 == we're good, 1 == didn't find any layers, 2 == got rejected */ +guint vik_aggregate_layer_tool ( VikAggregateLayer *val, VikLayerTypeEnum layer_type, VikToolInterfaceFunc tool_func, GdkEventButton *event, VikViewport *vvp ) +{ + GList *iter = val->children; + gboolean found_rej = FALSE; + if (!iter) + return FALSE; + while (iter->next) + iter = iter->next; + + while ( iter ) + { + /* if this layer "accepts" the tool call */ + if ( VIK_LAYER(iter->data)->visible && VIK_LAYER(iter->data)->type == layer_type ) + { + if ( tool_func ( VIK_LAYER(iter->data), event, vvp ) ) + return 0; + else + found_rej = TRUE; + } + + /* recursive -- try the same for the child aggregate layer. */ + else if ( VIK_LAYER(iter->data)->visible && VIK_LAYER(iter->data)->type == VIK_LAYER_AGGREGATE ) + { + gint rv = vik_aggregate_layer_tool(VIK_AGGREGATE_LAYER(iter->data), layer_type, tool_func, event, vvp); + if ( rv == 0 ) + return 0; + else if ( rv == 2 ) + found_rej = TRUE; + } + iter = iter->prev; + } + return found_rej ? 2 : 1; /* no one wanted to accept the tool call in this layer */ +} +#endif + +VikLayer *vik_aggregate_layer_get_top_visible_layer_of_type ( VikAggregateLayer *val, VikLayerTypeEnum type ) +{ + VikLayer *rv; + GList *ls = val->children; + if (!ls) + return NULL; + while (ls->next) + ls = ls->next; + + while ( ls ) + { + VikLayer *vl = VIK_LAYER(ls->data); + if ( vl->visible && vl->type == type ) + return vl; + else if ( vl->visible && vl->type == VIK_LAYER_AGGREGATE ) + { + rv = vik_aggregate_layer_get_top_visible_layer_of_type(VIK_AGGREGATE_LAYER(vl), type); + if ( rv ) + return rv; + } + ls = ls->prev; + } + return NULL; +} + +GList *vik_aggregate_layer_get_all_layers_of_type(VikAggregateLayer *val, GList *layers, VikLayerTypeEnum type, gboolean include_invisible) +{ + GList *l = layers; + GList *children = val->children; + VikLayer *vl; + if (!children) + return layers; + + // Where appropriate *don't* include non-visible layers + while (children) { + vl = VIK_LAYER(children->data); + if (vl->type == VIK_LAYER_AGGREGATE ) { + // Don't even consider invisible aggregrates, unless told to + if (vl->visible || include_invisible) + l = vik_aggregate_layer_get_all_layers_of_type(VIK_AGGREGATE_LAYER(children->data), l, type, include_invisible); + } + else if (vl->type == type) { + if (vl->visible || include_invisible) + l = g_list_prepend(l, children->data); /* now in top down order */ + } + else if (type == VIK_LAYER_TRW) { + /* GPS layers contain TRW layers. cf with usage in file.c */ + if (VIK_LAYER(children->data)->type == VIK_LAYER_GPS) { + if (VIK_LAYER(children->data)->visible || include_invisible) { + if (!vik_gps_layer_is_empty(VIK_GPS_LAYER(children->data))) { + /* + can not use g_list_concat due to wrong copy method - crashes if used a couple times !! + l = g_list_concat (l, vik_gps_layer_get_children (VIK_GPS_LAYER(children->data))); + */ + /* create own copy method instead :( */ + GList *gps_trw_layers = (GList *)vik_gps_layer_get_children (VIK_GPS_LAYER(children->data)); + int n_layers = g_list_length (gps_trw_layers); + int layer = 0; + for ( layer = 0; layer < n_layers; layer++) { + l = g_list_prepend(l, gps_trw_layers->data); + gps_trw_layers = gps_trw_layers->next; + } + g_list_free(gps_trw_layers); + } + } + } + } + children = children->next; + } + return l; +} + +void vik_aggregate_layer_realize ( VikAggregateLayer *val, VikTreeview *vt, GtkTreeIter *layer_iter ) +{ + GList *i = val->children; + GtkTreeIter iter; + VikLayer *vl = VIK_LAYER(val); + VikLayer *vli; + while ( i ) + { + vli = VIK_LAYER(i->data); + vik_treeview_add_layer ( vl->vt, layer_iter, &iter, vli->name, val, TRUE, + vli, vli->type, vli->type, vik_layer_get_timestamp(vli) ); + if ( ! vli->visible ) + vik_treeview_item_set_visible ( vl->vt, &iter, FALSE ); + vik_layer_realize ( vli, vl->vt, &iter ); + i = i->next; + } +} + +const GList *vik_aggregate_layer_get_children ( VikAggregateLayer *val ) +{ + return val->children; +} + +gboolean vik_aggregate_layer_is_empty ( VikAggregateLayer *val ) +{ + if ( val->children ) + return FALSE; + return TRUE; +} + +static void aggregate_layer_drag_drop_request ( VikAggregateLayer *val_src, VikAggregateLayer *val_dest, GtkTreeIter *src_item_iter, GtkTreePath *dest_path ) +{ + VikTreeview *vt = VIK_LAYER(val_src)->vt; + VikLayer *vl = vik_treeview_item_get_pointer(vt, src_item_iter); + GtkTreeIter dest_iter; + gchar *dp; + gboolean target_exists; + + dp = gtk_tree_path_to_string(dest_path); + target_exists = vik_treeview_get_iter_from_path_str(vt, &dest_iter, dp); + + /* vik_aggregate_layer_delete unrefs, but we don't want that here. + * we're still using the layer. */ + g_object_ref ( vl ); + vik_aggregate_layer_delete(val_src, src_item_iter); + + if (target_exists) { + vik_aggregate_layer_insert_layer(val_dest, vl, &dest_iter); + } else { + vik_aggregate_layer_insert_layer(val_dest, vl, NULL); /* append */ + } + g_free(dp); +} + +/** + * Generate tooltip text for the layer. + */ +static const gchar* aggregate_layer_tooltip ( VikAggregateLayer *val ) +{ + static gchar tmp_buf[128]; + tmp_buf[0] = '\0'; + + GList *children = val->children; + if ( children ) { + gint nn = g_list_length (children); + // Could have a more complicated tooltip that numbers each type of layers, + // but for now a simple overall count + g_snprintf (tmp_buf, sizeof(tmp_buf), ngettext("One layer", "%d layers", nn), nn ); + } + else + g_snprintf (tmp_buf, sizeof(tmp_buf), _("Empty") ); + return tmp_buf; +} + +/** + * Return number of layers held + */ +guint vik_aggregate_layer_count ( VikAggregateLayer *val ) +{ + guint nn = 0; + GList *children = val->children; + if ( children ) { + nn = g_list_length (children); + } + return nn; +} diff --git a/src/vikaggregatelayer.h b/src/vikaggregatelayer.h new file mode 100644 index 0000000..03000b6 --- /dev/null +++ b/src/vikaggregatelayer.h @@ -0,0 +1,74 @@ +/* + * viking -- GPS Data and Topo Analyzer, Explorer, and Manager + * + * Copyright (C) 2003-2005, Evan Battaglia + * + * 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., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA + * + */ + +#ifndef _VIKING_AGGREGATELAYER_H +#define _VIKING_AGGREGATELAYER_H + +#include + +#include "viklayer.h" + +G_BEGIN_DECLS + +#define VIK_AGGREGATE_LAYER_TYPE (vik_aggregate_layer_get_type ()) +#define VIK_AGGREGATE_LAYER(obj) (G_TYPE_CHECK_INSTANCE_CAST ((obj), VIK_AGGREGATE_LAYER_TYPE, VikAggregateLayer)) +#define VIK_AGGREGATE_LAYER_CLASS(klass) (G_TYPE_CHECK_CLASS_CAST ((klass), VIK_AGGREGATE_LAYER_TYPE, VikAggregateLayerClass)) +#define IS_VIK_AGGREGATE_LAYER(obj) (G_TYPE_CHECK_INSTANCE_TYPE ((obj), VIK_AGGREGATE_LAYER_TYPE)) +#define IS_VIK_AGGREGATE_LAYER_CLASS(klass) (G_TYPE_CHECK_CLASS_TYPE ((klass), VIK_AGGREGATE_LAYER_TYPE)) + +typedef struct _VikAggregateLayerClass VikAggregateLayerClass; +struct _VikAggregateLayerClass +{ + VikLayerClass vik_layer_class; +}; + +GType vik_aggregate_layer_get_type (); + +typedef struct _VikAggregateLayer VikAggregateLayer; + +VikAggregateLayer *vik_aggregate_layer_new (); +void vik_aggregate_layer_add_layer ( VikAggregateLayer *val, VikLayer *l, gboolean allow_reordering ); +void vik_aggregate_layer_insert_layer ( VikAggregateLayer *val, VikLayer *l, GtkTreeIter *replace_layer ); +void vik_aggregate_layer_move_layer ( VikAggregateLayer *val, GtkTreeIter *child_iter, gboolean up ); +void vik_aggregate_layer_draw ( VikAggregateLayer *val, VikViewport *vp ); +void vik_aggregate_layer_free ( VikAggregateLayer *val ); +void vik_aggregate_layer_clear ( VikAggregateLayer *val ); +gboolean vik_aggregate_layer_delete ( VikAggregateLayer *val, GtkTreeIter *iter ); +gboolean vik_aggregate_layer_delete_layer ( VikAggregateLayer *val, VikLayer *vl ); +VikAggregateLayer *vik_aggregate_layer_create (VikViewport *vp); + +/* returns: 0 = success, 1 = none appl. found, 2 = found but rejected */ +// guint vik_aggregate_layer_tool ( VikAggregateLayer *val, guint16 layer_type, VikToolInterfaceFunc tool_func, GdkEventButton *event, VikViewport *vvp); + +VikLayer *vik_aggregate_layer_get_top_visible_layer_of_type ( VikAggregateLayer *val, VikLayerTypeEnum type ); +void vik_aggregate_layer_realize ( VikAggregateLayer *val, VikTreeview *vt, GtkTreeIter *layer_iter ); +gboolean vik_aggregate_layer_load_layers ( VikAggregateLayer *val, FILE *f, gpointer vp ); +gboolean vik_aggregate_layer_is_empty ( VikAggregateLayer *val ); + +const GList *vik_aggregate_layer_get_children ( VikAggregateLayer *val ); +GList *vik_aggregate_layer_get_all_layers_of_type(VikAggregateLayer *val, GList *layers, VikLayerTypeEnum type, gboolean include_invisible); +guint vik_aggregate_layer_count ( VikAggregateLayer *val ); + +gboolean vik_aggregate_layer_search_date ( VikAggregateLayer *val, gchar *date_str ); + +G_END_DECLS + +#endif diff --git a/src/vikcoord.c b/src/vikcoord.c new file mode 100644 index 0000000..6fc1f63 --- /dev/null +++ b/src/vikcoord.c @@ -0,0 +1,227 @@ +/* + * viking -- GPS Data and Topo Analyzer, Explorer, and Manager + * + * Copyright (C) 2003-2005, Evan Battaglia + * + * 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., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA + * + */ + +#include "coords.h" +#include "vikcoord.h" +#include "globals.h" +#include + +/* all coord operations MUST BE ABSTRACTED!!! */ + +void vik_coord_convert(VikCoord *coord, VikCoordMode dest_mode) +{ + VikCoord tmp; + if ( coord->mode != dest_mode ) + { + if ( dest_mode == VIK_COORD_LATLON ) { + a_coords_utm_to_latlon ( (struct UTM *)coord, (struct LatLon *)&tmp ); + *((struct LatLon *)coord) = *((struct LatLon *)&tmp); + } else { + a_coords_latlon_to_utm ( (struct LatLon *)coord, (struct UTM *)&tmp ); + *((struct UTM *)coord) = *((struct UTM *)&tmp); + } + coord->mode = dest_mode; + } +} + +void vik_coord_copy_convert(const VikCoord *coord, VikCoordMode dest_mode, VikCoord *dest) +{ + if ( coord->mode == dest_mode ) { + *dest = *coord; + } else { + if ( dest_mode == VIK_COORD_LATLON ) + a_coords_utm_to_latlon ( (struct UTM *)coord, (struct LatLon *)dest ); + else + a_coords_latlon_to_utm ( (struct LatLon *)coord, (struct UTM *)dest ); + dest->mode = dest_mode; + } +} + +static gdouble vik_coord_diff_safe(const VikCoord *c1, const VikCoord *c2) +{ + struct LatLon a, b; + vik_coord_to_latlon ( c1, &a ); + vik_coord_to_latlon ( c2, &b ); + return a_coords_latlon_diff ( &a, &b ); +} + +gdouble vik_coord_diff(const VikCoord *c1, const VikCoord *c2) +{ + if ( c1->mode == c2->mode ) + return vik_coord_diff_safe ( c1, c2 ); + if ( c1->mode == VIK_COORD_UTM ) + return a_coords_utm_diff ( (const struct UTM *) c1, (const struct UTM *) c2 ); + else + return a_coords_latlon_diff ( (const struct LatLon *) c1, (const struct LatLon *) c2 ); +} + +void vik_coord_load_from_latlon ( VikCoord *coord, VikCoordMode mode, const struct LatLon *ll ) +{ + if ( mode == VIK_COORD_LATLON ) + *((struct LatLon *)coord) = *ll; + else + a_coords_latlon_to_utm ( ll, (struct UTM *) coord ); + coord->mode = mode; +} + +void vik_coord_load_from_utm ( VikCoord *coord, VikCoordMode mode, const struct UTM *utm ) +{ + if ( mode == VIK_COORD_UTM ) + *((struct UTM *)coord) = *utm; + else + a_coords_utm_to_latlon ( utm, (struct LatLon *) coord ); + coord->mode = mode; +} + +void vik_coord_to_latlon ( const VikCoord *coord, struct LatLon *dest ) +{ + if ( coord->mode == VIK_COORD_LATLON ) + *dest = *((const struct LatLon *)coord); + else + a_coords_utm_to_latlon ( (const struct UTM *) coord, dest ); +} + +void vik_coord_to_utm ( const VikCoord *coord, struct UTM *dest ) +{ + if ( coord->mode == VIK_COORD_UTM ) + *dest = *((const struct UTM *)coord); + else + a_coords_latlon_to_utm ( (const struct LatLon *) coord, dest ); +} + +gboolean vik_coord_equals ( const VikCoord *coord1, const VikCoord *coord2 ) +{ + if ( coord1->mode != coord2->mode ) + return FALSE; + if ( coord1->mode == VIK_COORD_LATLON ) + return coord1->north_south == coord2->north_south && coord1->east_west == coord2->east_west; + else /* VIK_COORD_UTM */ + return coord1->utm_zone == coord2->utm_zone && coord1->north_south == coord2->north_south && coord1->east_west == coord2->east_west; +} + +/** + * vik_coord_equalish: + * A more sensible comparsion that allows for some small tolerance in comparing floating point numbers + */ +gboolean vik_coord_equalish ( const VikCoord *coord1, const VikCoord *coord2 ) +{ + static const gdouble TOLERANCE = 0.000005; // ATM use for both coordinate modes + if ( coord1->mode != coord2->mode ) + return FALSE; + if ( coord1->mode == VIK_COORD_LATLON ) + return coord1->north_south >= coord2->north_south - TOLERANCE && + coord1->north_south <= coord2->north_south + TOLERANCE && + coord1->east_west >= coord2->east_west - TOLERANCE && + coord1->east_west <= coord2->east_west + TOLERANCE; + else /* VIK_COORD_UTM */ + return coord1->utm_zone == coord2->utm_zone && + coord1->north_south >= coord2->north_south - TOLERANCE && + coord1->north_south <= coord2->north_south + TOLERANCE && + coord1->east_west >= coord2->east_west - TOLERANCE && + coord1->east_west <= coord2->east_west + TOLERANCE; +} + +static void get_north_west(struct LatLon *center, struct LatLon *dist, struct LatLon *nw) +{ + nw->lat = center->lat + dist->lat; + nw->lon = center->lon - dist->lon; + if (nw->lon < -180) + nw->lon += 360.0; + if (nw->lat > 90.0) { /* over north pole */ + nw->lat = 180 - nw->lat; + nw->lon = nw->lon - 180; + } +} + +static void get_south_east(struct LatLon *center, struct LatLon *dist, struct LatLon *se) +{ + se->lat = center->lat - dist->lat; + se->lon = center->lon + dist->lon; + if (se->lon > 180.0) + se->lon -= 360.0; + if (se->lat < -90.0) { /* over south pole */ + se->lat += 180; + se->lon = se->lon - 180; + } +} + +void vik_coord_set_area(const VikCoord *coord, const struct LatLon *wh, VikCoord *tl, VikCoord *br) +{ + struct LatLon center, nw, se; + struct LatLon dist; + + dist.lat = wh->lat/2; + dist.lon = wh->lon/2; + + vik_coord_to_latlon(coord, ¢er); + get_north_west(¢er, &dist, &nw); + get_south_east(¢er, &dist, &se); + + *((struct LatLon *)tl) = nw; + *((struct LatLon *)br) = se; + tl->mode = br->mode = VIK_COORD_LATLON; +} + +gboolean vik_coord_inside(const VikCoord *coord, const VikCoord *tl, const VikCoord *br) +{ + struct LatLon ll, tl_ll, br_ll; + + vik_coord_to_latlon(coord, &ll); + vik_coord_to_latlon(tl, &tl_ll); + vik_coord_to_latlon(br, &br_ll); + + if ((ll.lat > tl_ll.lat) || (ll.lon < tl_ll.lon)) + return FALSE; + if ((ll.lat < br_ll.lat) || (ll.lon > br_ll.lon)) + return FALSE; + return TRUE; +} + +/** + * vik_coord_angle: + * + * Get angle of the second coord from the first one in degrees + * + */ +gdouble vik_coord_angle (const VikCoord *vc1, const VikCoord *vc2) +{ + struct LatLon ll1, ll2; + vik_coord_to_latlon ( vc1, &ll1 ); + vik_coord_to_latlon ( vc2, &ll2 ); + + // Convert to radians for use in the algorithm + gdouble rlat1 = DEG2RAD(ll1.lat); + gdouble rlong1 = DEG2RAD(ll1.lon); + gdouble rlat2 = DEG2RAD(ll2.lat); + gdouble rlong2 = DEG2RAD(ll2.lon); + + // This formula is for the initial bearing (ometimes referred to as forward azimuth) + //θ = atan2( sin Δλ ⋅ cos φ2 , cos φ1 ⋅ sin φ2 − sin φ1 ⋅ cos φ2 ⋅ cos Δλ ) + // in -pi to +pi radians + gdouble dLon = (rlong2 - rlong1); + gdouble y = sin(dLon) * cos(rlat2); + gdouble x = (cos(rlat1) * sin(rlat2)) - (sin(rlat1) * cos(rlat2) * cos(dLon)); + gdouble angle = atan2(y, x); + + // Bring into range 0..360 degrees + angle = fmod (RAD2DEG(angle) + 360.0, 360); + return angle; +} diff --git a/src/vikcoord.h b/src/vikcoord.h new file mode 100644 index 0000000..f78dd56 --- /dev/null +++ b/src/vikcoord.h @@ -0,0 +1,68 @@ +/* + * viking -- GPS Data and Topo Analyzer, Explorer, and Manager + * + * Copyright (C) 2003-2005, Evan Battaglia + * + * 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., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA + * + */ + +#ifndef _VIKING_VIKCOORD_H +#define _VIKING_VIKCOORD_H + +#include "coords.h" + +G_BEGIN_DECLS + +typedef gshort VikCoordMode; +#define VIK_COORD_UTM 0 +#define VIK_COORD_LATLON 1 + +#define VIK_UTM(x) ((struct UTM *)(x)) +#define VIK_LATLON(x) ((struct LatLon *)(x)) + +typedef struct { + gdouble north_south; /* northing or lat */ + gdouble east_west; /* easting or lon */ + gchar utm_zone; + gchar utm_letter; + + VikCoordMode mode; +} VikCoord; +/* notice we can cast to either UTM or LatLon */ +/* possible more modes to come? xy? we'll leave that as an option */ + +void vik_coord_convert(VikCoord *coord, VikCoordMode dest_mode); +void vik_coord_copy_convert(const VikCoord *coord, VikCoordMode dest_mode, VikCoord *dest); +gdouble vik_coord_diff(const VikCoord *c1, const VikCoord *c2); + +void vik_coord_load_from_latlon ( VikCoord *coord, VikCoordMode mode, const struct LatLon *ll ); +void vik_coord_load_from_utm ( VikCoord *coord, VikCoordMode mode, const struct UTM *utm ); + +void vik_coord_to_latlon ( const VikCoord *coord, struct LatLon *dest ); +void vik_coord_to_utm ( const VikCoord *coord, struct UTM *dest ); + +gboolean vik_coord_equals ( const VikCoord *coord1, const VikCoord *coord2 ); +gboolean vik_coord_equalish ( const VikCoord *coord1, const VikCoord *coord2 ); + +void vik_coord_set_area(const VikCoord *coord, const struct LatLon *wh, VikCoord *tl, VikCoord *br); +gboolean vik_coord_inside(const VikCoord *coord, const VikCoord *tl, const VikCoord *br); +/* all coord operations MUST BE ABSTRACTED!!! */ + +gdouble vik_coord_angle (const VikCoord *vc1, const VikCoord *vc2); + +G_END_DECLS + +#endif diff --git a/src/vikcoordlayer.c b/src/vikcoordlayer.c new file mode 100644 index 0000000..be77187 --- /dev/null +++ b/src/vikcoordlayer.c @@ -0,0 +1,412 @@ +/* + * viking -- GPS Data and Topo Analyzer, Explorer, and Manager + * + * Copyright (C) 2003-2005, Evan Battaglia + * + * 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., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA + * + */ +#ifdef HAVE_CONFIG_H +#include "config.h" +#endif + +#ifdef HAVE_MATH_H +#include +#endif +#include + +#include "viking.h" +#include "icons/icons.h" + +static VikCoordLayer *coord_layer_new ( VikViewport *vp ); +static void coord_layer_draw ( VikCoordLayer *vcl, VikViewport *vp ); +static void coord_layer_free ( VikCoordLayer *vcl ); +static VikCoordLayer *coord_layer_create ( VikViewport *vp ); +static void coord_layer_marshall( VikCoordLayer *vcl, guint8 **data, guint *len ); +static VikCoordLayer *coord_layer_unmarshall( guint8 *data, guint len, VikViewport *vvp ); +static gboolean coord_layer_set_param ( VikCoordLayer *vcl, VikLayerSetParam *vlsp ); +static VikLayerParamData coord_layer_get_param ( VikCoordLayer *vcl, guint16 id, gboolean is_file_operation ); +static void coord_layer_post_read ( VikLayer *vl, VikViewport *vp, gboolean from_file ); +static void coord_layer_update_gc ( VikCoordLayer *vcl, VikViewport *vp ); + +static VikLayerParamScale param_scales[] = { + { 0.05, 60.0, 0.25, 10 }, + { 1, 10, 1, 0 }, +}; + +static VikLayerParamData color_default ( void ) { + VikLayerParamData data; gdk_color_parse ( "red", &data.c ); return data; + // or: return VIK_LPD_COLOR ( 0, 65535, 0, 0 ); +} +static VikLayerParamData min_inc_default ( void ) { return VIK_LPD_DOUBLE ( 1.0 ); } +static VikLayerParamData line_thickness_default ( void ) { return VIK_LPD_UINT ( 3 ); } + +static VikLayerParam coord_layer_params[] = { + { VIK_LAYER_COORD, "color", VIK_LAYER_PARAM_COLOR, VIK_LAYER_GROUP_NONE, N_("Color:"), VIK_LAYER_WIDGET_COLOR, NULL, NULL, NULL, color_default, NULL, NULL }, + { VIK_LAYER_COORD, "min_inc", VIK_LAYER_PARAM_DOUBLE, VIK_LAYER_GROUP_NONE, N_("Minutes Width:"), VIK_LAYER_WIDGET_SPINBUTTON, ¶m_scales[0], NULL, NULL, min_inc_default, NULL, NULL }, + { VIK_LAYER_COORD, "line_thickness", VIK_LAYER_PARAM_UINT, VIK_LAYER_GROUP_NONE, N_("Line Thickness:"), VIK_LAYER_WIDGET_SPINBUTTON, ¶m_scales[1], NULL, NULL, line_thickness_default, NULL, NULL }, +}; + +enum { PARAM_COLOR = 0, PARAM_MIN_INC, PARAM_LINE_THICKNESS, NUM_PARAMS }; + +VikLayerInterface vik_coord_layer_interface = { + "Coord", + N_("Coordinate"), + NULL, + &vikcoordlayer_pixbuf, + + NULL, + 0, + + coord_layer_params, + NUM_PARAMS, + NULL, + 0, + + VIK_MENU_ITEM_ALL, + + (VikLayerFuncCreate) coord_layer_create, + (VikLayerFuncRealize) NULL, + (VikLayerFuncPostRead) coord_layer_post_read, + (VikLayerFuncFree) coord_layer_free, + + (VikLayerFuncProperties) NULL, + (VikLayerFuncDraw) coord_layer_draw, + (VikLayerFuncChangeCoordMode) NULL, + + (VikLayerFuncGetTimestamp) NULL, + + (VikLayerFuncSetMenuItemsSelection) NULL, + (VikLayerFuncGetMenuItemsSelection) NULL, + + (VikLayerFuncAddMenuItems) NULL, + (VikLayerFuncSublayerAddMenuItems) NULL, + + (VikLayerFuncSublayerRenameRequest) NULL, + (VikLayerFuncSublayerToggleVisible) NULL, + (VikLayerFuncSublayerTooltip) NULL, + (VikLayerFuncLayerTooltip) NULL, + (VikLayerFuncLayerSelected) NULL, + + (VikLayerFuncMarshall) coord_layer_marshall, + (VikLayerFuncUnmarshall) coord_layer_unmarshall, + + (VikLayerFuncSetParam) coord_layer_set_param, + (VikLayerFuncGetParam) coord_layer_get_param, + (VikLayerFuncChangeParam) NULL, + + (VikLayerFuncReadFileData) NULL, + (VikLayerFuncWriteFileData) NULL, + + (VikLayerFuncDeleteItem) NULL, + (VikLayerFuncCutItem) NULL, + (VikLayerFuncCopyItem) NULL, + (VikLayerFuncPasteItem) NULL, + (VikLayerFuncFreeCopiedItem) NULL, + (VikLayerFuncDragDropRequest) NULL, + + (VikLayerFuncSelectClick) NULL, + (VikLayerFuncSelectMove) NULL, + (VikLayerFuncSelectRelease) NULL, + (VikLayerFuncSelectedViewportMenu) NULL, +}; + +struct _VikCoordLayer { + VikLayer vl; + GdkGC *gc; + gdouble deg_inc; + guint8 line_thickness; + GdkColor color; +}; + +GType vik_coord_layer_get_type () +{ + static GType vcl_type = 0; + + if (!vcl_type) + { + static const GTypeInfo vcl_info = + { + sizeof (VikCoordLayerClass), + NULL, /* base_init */ + NULL, /* base_finalize */ + NULL, /* class init */ + NULL, /* class_finalize */ + NULL, /* class_data */ + sizeof (VikCoordLayer), + 0, + NULL /* instance init */ + }; + vcl_type = g_type_register_static ( VIK_LAYER_TYPE, "VikCoordLayer", &vcl_info, 0 ); + } + + return vcl_type; +} + +static void coord_layer_marshall( VikCoordLayer *vcl, guint8 **data, guint *len ) +{ + vik_layer_marshall_params ( VIK_LAYER(vcl), data, len ); +} + +static VikCoordLayer *coord_layer_unmarshall( guint8 *data, guint len, VikViewport *vvp ) +{ + VikCoordLayer *rv = coord_layer_new ( vvp ); + vik_layer_unmarshall_params ( VIK_LAYER(rv), data, len, vvp ); + coord_layer_update_gc ( rv, vvp ); + return rv; +} + +// NB VikViewport can be null as it's not used ATM +gboolean coord_layer_set_param ( VikCoordLayer *vcl, VikLayerSetParam *vlsp ) +{ + switch ( vlsp->id ) + { + case PARAM_COLOR: vcl->color = vlsp->data.c; break; + case PARAM_MIN_INC: vcl->deg_inc = vlsp->data.d / 60.0; break; + case PARAM_LINE_THICKNESS: if ( vlsp->data.u >= 1 && vlsp->data.u <= 15 ) vcl->line_thickness = vlsp->data.u; break; + default: break; + } + return TRUE; +} + +static VikLayerParamData coord_layer_get_param ( VikCoordLayer *vcl, guint16 id, gboolean is_file_operation ) +{ + VikLayerParamData rv; + switch ( id ) + { + case PARAM_COLOR: rv.c = vcl->color; break; + case PARAM_MIN_INC: rv.d = vcl->deg_inc * 60.0; break; + case PARAM_LINE_THICKNESS: rv.i = vcl->line_thickness; break; + default: break; + } + return rv; +} + +static void coord_layer_post_read ( VikLayer *vl, VikViewport *vp, gboolean from_file ) +{ + VikCoordLayer *vcl = VIK_COORD_LAYER(vl); + if ( vcl->gc ) + g_object_unref ( G_OBJECT(vcl->gc) ); + + vcl->gc = vik_viewport_new_gc_from_color ( vp, &(vcl->color), vcl->line_thickness ); +} + +static VikCoordLayer *coord_layer_new ( VikViewport *vvp ) +{ + VikCoordLayer *vcl = VIK_COORD_LAYER ( g_object_new ( VIK_COORD_LAYER_TYPE, NULL ) ); + vik_layer_set_type ( VIK_LAYER(vcl), VIK_LAYER_COORD ); + + vik_layer_set_defaults ( VIK_LAYER(vcl), vvp ); + + vcl->gc = NULL; + + return vcl; +} + +static void coord_layer_draw ( VikCoordLayer *vcl, VikViewport *vp ) +{ + if ( !vcl->gc ) { + return; + } + + if ( vik_viewport_get_coord_mode(vp) != VIK_COORD_UTM ) + { + VikCoord left, right, left2, right2; + gdouble l, r, i, j; + gint x1, y1, x2, y2, smod = 1, mmod = 1; + gboolean mins = FALSE, secs = FALSE; + GdkGC *dgc = vik_viewport_new_gc_from_color(vp, &(vcl->color), vcl->line_thickness); + GdkGC *mgc = vik_viewport_new_gc_from_color(vp, &(vcl->color), MAX(vcl->line_thickness/2, 1)); + GdkGC *sgc = vik_viewport_new_gc_from_color(vp, &(vcl->color), MAX(vcl->line_thickness/5, 1)); + + vik_viewport_screen_to_coord ( vp, 0, 0, &left ); + vik_viewport_screen_to_coord ( vp, vik_viewport_get_width(vp), 0, &right ); + vik_viewport_screen_to_coord ( vp, 0, vik_viewport_get_height(vp), &left2 ); + vik_viewport_screen_to_coord ( vp, vik_viewport_get_width(vp), vik_viewport_get_height(vp), &right2 ); + +#define CLINE(gc, c1, c2) { \ + vik_viewport_coord_to_screen(vp, (c1), &x1, &y1); \ + vik_viewport_coord_to_screen(vp, (c2), &x2, &y2); \ + vik_viewport_draw_line (vp, (gc), x1, y1, x2, y2); \ + } + + l = left.east_west; + r = right.east_west; + if (60*fabs(l-r) < 4) { + secs = TRUE; + smod = MIN(6, (int)ceil(3600*fabs(l-r)/30.0)); + } + if (fabs(l-r) < 4) { + mins = TRUE; + mmod = MIN(6, (int)ceil(60*fabs(l-r)/30.0)); + } + for (i=floor(l*60); inorthing - ( ympp * height / 2 ); + + a_coords_utm_to_latlon ( &utm, &ll ); + + utm.northing = center->northing + ( ympp * height / 2 ); + + a_coords_utm_to_latlon ( &utm, &ll2 ); + + { + /* find corner coords in lat/lon. + start at whichever is less: top or bottom left lon. goto whichever more: top or bottom right lon + */ + struct LatLon topleft, topright, bottomleft, bottomright; + struct UTM temp_utm; + temp_utm = *center; + temp_utm.easting -= (width/2)*xmpp; + temp_utm.northing += (height/2)*ympp; + a_coords_utm_to_latlon ( &temp_utm, &topleft ); + temp_utm.easting += (width*xmpp); + a_coords_utm_to_latlon ( &temp_utm, &topright ); + temp_utm.northing -= (height*ympp); + a_coords_utm_to_latlon ( &temp_utm, &bottomright ); + temp_utm.easting -= (width*xmpp); + a_coords_utm_to_latlon ( &temp_utm, &bottomleft ); + min.lon = (topleft.lon < bottomleft.lon) ? topleft.lon : bottomleft.lon; + max.lon = (topright.lon > bottomright.lon) ? topright.lon : bottomright.lon; + min.lat = (bottomleft.lat < bottomright.lat) ? bottomleft.lat : bottomright.lat; + max.lat = (topleft.lat > topright.lat) ? topleft.lat : topright.lat; + } + + /* Can zoom out more than whole world and so the above can give invalid positions */ + /* Restrict values properly so drawing doesn't go into a near 'infinite' loop */ + if ( min.lon < -180.0 ) + min.lon = -180.0; + if ( max.lon > 180.0 ) + max.lon = 180.0; + if ( min.lat < -90.0 ) + min.lat = -90.0; + if ( max.lat > 90.0 ) + max.lat = 90.0; + + lon = ((double) ((long) ((min.lon)/ vcl->deg_inc))) * vcl->deg_inc; + ll.lon = ll2.lon = lon; + + for (; ll.lon <= max.lon; ll.lon+=vcl->deg_inc, ll2.lon+=vcl->deg_inc ) + { + a_coords_latlon_to_utm ( &ll, &utm ); + x1 = ( (utm.easting - center->easting) / xmpp ) + (width / 2); + a_coords_latlon_to_utm ( &ll2, &utm ); + x2 = ( (utm.easting - center->easting) / xmpp ) + (width / 2); + vik_viewport_draw_line (vp, vcl->gc, x1, height, x2, 0); + } + + utm = *center; + utm.easting = center->easting - ( xmpp * width / 2 ); + + a_coords_utm_to_latlon ( &utm, &ll ); + + utm.easting = center->easting + ( xmpp * width / 2 ); + + a_coords_utm_to_latlon ( &utm, &ll2 ); + + /* really lat, just reusing a variable */ + lon = ((double) ((long) ((min.lat)/ vcl->deg_inc))) * vcl->deg_inc; + ll.lat = ll2.lat = lon; + + for (; ll.lat <= max.lat ; ll.lat+=vcl->deg_inc, ll2.lat+=vcl->deg_inc ) + { + a_coords_latlon_to_utm ( &ll, &utm ); + x1 = (height / 2) - ( (utm.northing - center->northing) / ympp ); + a_coords_latlon_to_utm ( &ll2, &utm ); + x2 = (height / 2) - ( (utm.northing - center->northing) / ympp ); + vik_viewport_draw_line (vp, vcl->gc, width, x2, 0, x1); + } + } +} + +static void coord_layer_free ( VikCoordLayer *vcl ) +{ + if ( vcl->gc != NULL ) + g_object_unref ( G_OBJECT(vcl->gc) ); +} + +static void coord_layer_update_gc ( VikCoordLayer *vcl, VikViewport *vp ) +{ + if ( vcl->gc ) + g_object_unref ( G_OBJECT(vcl->gc) ); + + vcl->gc = vik_viewport_new_gc_from_color ( vp, &(vcl->color), vcl->line_thickness ); +} + +static VikCoordLayer *coord_layer_create ( VikViewport *vp ) +{ + VikCoordLayer *vcl = coord_layer_new ( vp ); + if ( vp ) + coord_layer_update_gc ( vcl, vp ); + return vcl; +} diff --git a/src/vikcoordlayer.h b/src/vikcoordlayer.h new file mode 100644 index 0000000..591a531 --- /dev/null +++ b/src/vikcoordlayer.h @@ -0,0 +1,47 @@ +/* + * viking -- GPS Data and Topo Analyzer, Explorer, and Manager + * + * Copyright (C) 2003-2005, Evan Battaglia + * + * 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., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA + * + */ + +#ifndef _VIKING_COORDLAYER_H +#define _VIKING_COORDLAYER_H + +#include "viklayer.h" + +G_BEGIN_DECLS + +#define VIK_COORD_LAYER_TYPE (vik_coord_layer_get_type ()) +#define VIK_COORD_LAYER(obj) (G_TYPE_CHECK_INSTANCE_CAST ((obj), VIK_COORD_LAYER_TYPE, VikCoordLayer)) +#define VIK_COORD_LAYER_CLASS(klass) (G_TYPE_CHECK_CLASS_CAST ((klass), VIK_COORD_LAYER_TYPE, VikCoordLayerClass)) +#define IS_VIK_COORD_LAYER(obj) (G_TYPE_CHECK_INSTANCE_TYPE ((obj), VIK_COORD_LAYER_TYPE)) +#define IS_VIK_COORD_LAYER_CLASS(klass) (G_TYPE_CHECK_CLASS_TYPE ((klass), VIK_COORD_LAYER_TYPE)) + +typedef struct _VikCoordLayerClass VikCoordLayerClass; +struct _VikCoordLayerClass +{ + VikLayerClass object_class; +}; + +GType vik_coord_layer_get_type (); + +typedef struct _VikCoordLayer VikCoordLayer; + +G_END_DECLS + +#endif diff --git a/src/vikdatetime_edit_dialog.c b/src/vikdatetime_edit_dialog.c new file mode 100644 index 0000000..528b441 --- /dev/null +++ b/src/vikdatetime_edit_dialog.c @@ -0,0 +1,138 @@ +/* -*- Mode: C; indent-tabs-mode: t; c-basic-offset: 4; tab-width: 4 -*- */ +/* + * viking -- GPS Data and Topo Analyzer, Explorer, and Manager + * + * Copyright (C) 2014, Rob Norris + * + * 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., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA + * + */ +#include "vikdatetime_edit_dialog.h" + +// Show leading zeros +static gboolean on_output ( GtkSpinButton *spin, gpointer data ) +{ + GtkAdjustment *adjustment = gtk_spin_button_get_adjustment ( spin ); + gint value = (gint)gtk_adjustment_get_value ( adjustment ); + gchar *text = g_strdup_printf ( "%02d", value ); + gtk_entry_set_text ( GTK_ENTRY (spin), text ); + g_free ( text ); + + return TRUE; +} + +/** + * vik_datetime_edit_dialog: + * @parent: The parent window + * @title: The title to use for the dialog + * @initial_time: The inital date/time to be shown + * @tz: The #GTimeZone this dialog will operate in + * + * Returns: A time selected by the user via this dialog + * Even though a time of zero is notionally valid - consider it unlikely to be actually wanted! + * Thus if the time is zero then the dialog was cancelled or somehow an invalid date was encountered. + */ +time_t vik_datetime_edit_dialog ( GtkWindow *parent, const gchar *title, time_t initial_time, GTimeZone *tz ) +{ + g_return_val_if_fail ( tz, 0 ); + + GtkWidget *dialog = gtk_dialog_new_with_buttons ( title, + parent, + GTK_DIALOG_MODAL | GTK_DIALOG_DESTROY_WITH_PARENT, + GTK_STOCK_CANCEL, GTK_RESPONSE_REJECT, + GTK_STOCK_OK, GTK_RESPONSE_ACCEPT, + NULL ); + + gtk_dialog_set_default_response ( GTK_DIALOG(dialog), GTK_RESPONSE_ACCEPT ); + GtkWidget *response_w = NULL; +#if GTK_CHECK_VERSION (2, 20, 0) + response_w = gtk_dialog_get_widget_for_response ( GTK_DIALOG(dialog), GTK_RESPONSE_ACCEPT ); +#endif + + GtkWidget *label; + GtkWidget *cal = gtk_calendar_new (); + + // Set according to the given date/time + timezone for display + GDateTime *gdt_in = g_date_time_new_from_unix_utc ( (gint64)initial_time ); + GDateTime *gdt_tz = g_date_time_to_timezone ( gdt_in, tz ); + g_date_time_unref ( gdt_in ); + + gtk_calendar_select_month ( GTK_CALENDAR(cal), g_date_time_get_month(gdt_tz)-1, g_date_time_get_year (gdt_tz) ); + gtk_calendar_select_day ( GTK_CALENDAR(cal), g_date_time_get_day_of_month(gdt_tz) ); + + GtkWidget *hbox_time = gtk_hbox_new ( FALSE, 1 ); + + label = gtk_label_new ( g_date_time_get_timezone_abbreviation(gdt_tz) ); + gtk_box_pack_start ( GTK_BOX(hbox_time), label, FALSE, FALSE, 5 ); + + GtkWidget *sb_hours = gtk_spin_button_new_with_range ( 0.0, 23.0, 1.0 ); + gtk_box_pack_start ( GTK_BOX(hbox_time), sb_hours, FALSE, FALSE, 0 ); + gtk_spin_button_set_value ( GTK_SPIN_BUTTON(sb_hours), g_date_time_get_hour(gdt_tz) ); + g_signal_connect ( sb_hours, "output", G_CALLBACK(on_output), NULL ); + + label = gtk_label_new ( ":" ); + gtk_box_pack_start ( GTK_BOX(hbox_time), label, FALSE, FALSE, 0 ); + + GtkWidget *sb_minutes = gtk_spin_button_new_with_range ( 0.0, 59.0, 1.0 ); + gtk_box_pack_start ( GTK_BOX(hbox_time), sb_minutes, FALSE, FALSE, 0); + gtk_spin_button_set_value ( GTK_SPIN_BUTTON(sb_minutes), g_date_time_get_minute(gdt_tz) ); + g_signal_connect ( sb_minutes, "output", G_CALLBACK(on_output), NULL ); + + label = gtk_label_new ( ":" ); + gtk_box_pack_start(GTK_BOX(hbox_time), label, FALSE, FALSE, 0); + + GtkWidget *sb_seconds = gtk_spin_button_new_with_range ( 0.0, 59.0, 1.0 ); + gtk_box_pack_start ( GTK_BOX(hbox_time), sb_seconds, FALSE, FALSE, 0 ); + gtk_spin_button_set_value ( GTK_SPIN_BUTTON(sb_seconds), g_date_time_get_second(gdt_tz) ); + g_signal_connect ( sb_seconds, "output", G_CALLBACK(on_output), NULL ); + + gtk_box_pack_start ( GTK_BOX(gtk_dialog_get_content_area(GTK_DIALOG(dialog))), cal, FALSE, FALSE, 0 ); + gtk_box_pack_start ( GTK_BOX(gtk_dialog_get_content_area(GTK_DIALOG(dialog))), hbox_time, FALSE, FALSE, 5 ); + + if ( response_w ) + gtk_widget_grab_focus ( response_w ); + + g_date_time_unref ( gdt_tz ); + + gtk_widget_show_all ( dialog ); + if ( gtk_dialog_run ( GTK_DIALOG(dialog) ) != GTK_RESPONSE_ACCEPT ) { + gtk_widget_destroy ( dialog ); + return 0; + } + + // Read values + guint year = 0; + guint month = 0; + guint day = 0; + guint hours = 0; + guint minutes = 0; + guint seconds = 0; + + gtk_calendar_get_date ( GTK_CALENDAR(cal), &year, &month, &day ); + hours = gtk_spin_button_get_value_as_int ( GTK_SPIN_BUTTON(sb_hours) ); + minutes = gtk_spin_button_get_value_as_int ( GTK_SPIN_BUTTON(sb_minutes) ); + seconds = gtk_spin_button_get_value_as_int ( GTK_SPIN_BUTTON(sb_seconds) ); + + gtk_widget_destroy(dialog); + + time_t ans = initial_time; + GDateTime *gdt_ans = g_date_time_new ( tz, year, month+1, day, hours, minutes, (gdouble)seconds ); + if ( gdt_ans ) { + ans = g_date_time_to_unix ( gdt_ans ); + g_date_time_unref ( gdt_ans ); + } + + return ans; +} diff --git a/src/vikdatetime_edit_dialog.h b/src/vikdatetime_edit_dialog.h new file mode 100644 index 0000000..d513e2b --- /dev/null +++ b/src/vikdatetime_edit_dialog.h @@ -0,0 +1,35 @@ +/* -*- Mode: C; indent-tabs-mode: t; c-basic-offset: 4; tab-width: 4 -*- */ +/* + * viking -- GPS Data and Topo Analyzer, Explorer, and Manager + * + * Copyright (C) 2014, Rob Norris + * + * 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., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA + * + */ +#ifndef _VIK_DATE_TIME_EDIT_H +#define _VIK_DATE_TIME_EDIT_H + +#include +#include +#include + +G_BEGIN_DECLS + +time_t vik_datetime_edit_dialog ( GtkWindow *parent, const gchar *title, time_t initial_time, GTimeZone *tz ); + +G_END_DECLS + +#endif diff --git a/src/vikdemlayer.c b/src/vikdemlayer.c new file mode 100644 index 0000000..7067bba --- /dev/null +++ b/src/vikdemlayer.c @@ -0,0 +1,1313 @@ +/* + * viking -- GPS Data and Topo Analyzer, Explorer, and Manager + * + * Copyright (C) 2003-2005, Evan Battaglia + * + * 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., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA + * + */ +#ifdef HAVE_CONFIG_H +#include "config.h" +#endif + +#ifdef HAVE_MATH_H +#include +#endif +#ifdef HAVE_SYS_TYPES_H +#include +#endif +#ifdef HAVE_SYS_STAT_H +#include +#endif +#ifdef HAVE_STRING_H +#include +#endif +#include +#include +#include + +#include "background.h" +#include "viking.h" +#include "vikmapslayer.h" +#include "vikdemlayer.h" +#include "dem.h" +#include "dems.h" +#include "icons/icons.h" +#include "bbox.h" + +#define MAPS_CACHE_DIR maps_layer_default_dir() +#define SRTM_CACHE_TEMPLATE "%ssrtm3-%s%s%c%02d%c%03d.hgt.zip" + +#define SRTM_HTTP_BASE_URL "https://dds.cr.usgs.gov/srtm/version2_1/SRTM3" +static gchar *base_url = NULL; +#define VIK_SETTINGS_SRTM_HTTP_BASE_URL "srtm_http_base_url" + +#ifdef VIK_CONFIG_DEM24K +#define DEM24K_DOWNLOAD_SCRIPT "dem24k.pl" +#endif + +#define UNUSED_LINE_THICKNESS 3 + +static VikDEMLayer *dem_layer_new ( VikViewport *vvp ); +static void dem_layer_draw ( VikDEMLayer *vdl, VikViewport *vp ); +static void dem_layer_free ( VikDEMLayer *vdl ); +static VikDEMLayer *dem_layer_create ( VikViewport *vp ); +static const gchar* dem_layer_tooltip( VikDEMLayer *vdl ); +static void dem_layer_marshall( VikDEMLayer *vdl, guint8 **data, guint *len ); +static VikDEMLayer *dem_layer_unmarshall( guint8 *data, guint len, VikViewport *vvp ); +static gboolean dem_layer_set_param ( VikDEMLayer *vdl, VikLayerSetParam *vlsp ); +static VikLayerParamData dem_layer_get_param ( VikDEMLayer *vdl, guint16 id, gboolean is_file_operation ); +static void dem_layer_post_read ( VikLayer *vl, VikViewport *vp, gboolean from_file ); +static void srtm_draw_existence ( VikViewport *vp ); + +#ifdef VIK_CONFIG_DEM24K +static void dem24k_draw_existence ( VikViewport *vp ); +#endif + +/* Upped upper limit incase units are feet */ +static VikLayerParamScale param_scales[] = { + { 0, 30000, 10, 1 }, + { 1, 30000, 10, 1 }, +}; + +static gchar *params_source[] = { + N_("SRTM Global 90m (3 arcsec)"), +#ifdef VIK_CONFIG_DEM24K + "USA 10m (USGS 24k)", +#endif + NULL + }; + +static gchar *params_type[] = { + N_("Absolute height"), + N_("Height gradient"), + NULL +}; + +enum { DEM_SOURCE_SRTM, +#ifdef VIK_CONFIG_DEM24K + DEM_SOURCE_DEM24K, +#endif + }; + +enum { DEM_TYPE_HEIGHT = 0, + DEM_TYPE_GRADIENT, + DEM_TYPE_NONE, +}; + +static VikLayerParamData color_default ( void ) { + VikLayerParamData data; gdk_color_parse ( "blue", &data.c ); return data; +} + +static VikLayerParamData source_default ( void ) { return VIK_LPD_UINT ( DEM_SOURCE_SRTM ); } +static VikLayerParamData type_default ( void ) { return VIK_LPD_UINT ( DEM_TYPE_HEIGHT ); } +static VikLayerParamData min_elev_default ( void ) { return VIK_LPD_DOUBLE ( 0.0 ); } +static VikLayerParamData max_elev_default ( void ) { return VIK_LPD_DOUBLE ( 1000.0 ); } + +static VikLayerParam dem_layer_params[] = { + { VIK_LAYER_DEM, "files", VIK_LAYER_PARAM_STRING_LIST, VIK_LAYER_GROUP_NONE, N_("DEM Files:"), VIK_LAYER_WIDGET_FILELIST, NULL, NULL, NULL, NULL, NULL, NULL }, + { VIK_LAYER_DEM, "source", VIK_LAYER_PARAM_UINT, VIK_LAYER_GROUP_NONE, N_("Download Source:"), VIK_LAYER_WIDGET_RADIOGROUP_STATIC, params_source, NULL, NULL, source_default, NULL, NULL }, + { VIK_LAYER_DEM, "color", VIK_LAYER_PARAM_COLOR, VIK_LAYER_GROUP_NONE, N_("Min Elev Color:"), VIK_LAYER_WIDGET_COLOR, NULL, NULL, NULL, color_default, NULL, NULL }, + { VIK_LAYER_DEM, "type", VIK_LAYER_PARAM_UINT, VIK_LAYER_GROUP_NONE, N_("Type:"), VIK_LAYER_WIDGET_RADIOGROUP_STATIC, params_type, NULL, NULL, type_default, NULL, NULL }, + { VIK_LAYER_DEM, "min_elev", VIK_LAYER_PARAM_DOUBLE, VIK_LAYER_GROUP_NONE, N_("Min Elev:"), VIK_LAYER_WIDGET_SPINBUTTON, param_scales + 0, NULL, NULL, min_elev_default, NULL, NULL }, + { VIK_LAYER_DEM, "max_elev", VIK_LAYER_PARAM_DOUBLE, VIK_LAYER_GROUP_NONE, N_("Max Elev:"), VIK_LAYER_WIDGET_SPINBUTTON, param_scales + 0, NULL, NULL, max_elev_default, NULL, NULL }, +}; + + +enum { PARAM_FILES=0, PARAM_SOURCE, PARAM_COLOR, PARAM_TYPE, PARAM_MIN_ELEV, PARAM_MAX_ELEV, NUM_PARAMS }; + +static gpointer dem_layer_download_create ( VikWindow *vw, VikViewport *vvp); +static gboolean dem_layer_download_release ( VikDEMLayer *vdl, GdkEventButton *event, VikViewport *vvp ); +static gboolean dem_layer_download_click ( VikDEMLayer *vdl, GdkEventButton *event, VikViewport *vvp ); + +static VikToolInterface dem_tools[] = { + { &demdl_18_pixbuf, + { "DEMDownload", "vik-icon-DEM Download", N_("_DEM Download"), NULL, N_("DEM Download"), 0 }, + (VikToolConstructorFunc) dem_layer_download_create, NULL, NULL, NULL, + (VikToolMouseFunc) dem_layer_download_click, NULL, (VikToolMouseFunc) dem_layer_download_release, + (VikToolKeyFunc) NULL, + (VikToolKeyFunc) NULL, + FALSE, + GDK_CURSOR_IS_PIXMAP, &cursor_demdl_pixbuf, NULL }, +}; + + +/* HEIGHT COLORS + The first entry is blue for a default 'sea' colour, + however the value used by the corresponding gc can be configured as part of the DEM layer properties. + The other colours, shaded from brown to white are used to give an indication of height. +*/ +static gchar *dem_height_colors[] = { +"#0000FF", +"#9b793c", "#9c7d40", "#9d8144", "#9e8549", "#9f894d", "#a08d51", "#a29156", "#a3955a", "#a4995e", "#a69d63", +"#a89f65", "#aaa267", "#ada569", "#afa76b", "#b1aa6d", "#b4ad6f", "#b6b071", "#b9b373", "#bcb676", "#beb978", +"#c0bc7a", "#c2c07d", "#c4c37f", "#c6c681", "#c8ca84", "#cacd86", "#ccd188", "#cfd58b", "#c2ce84", "#b5c87e", +"#a9c278", "#9cbb71", "#8fb56b", "#83af65", "#76a95e", "#6aa358", "#5e9d52", "#63a055", "#69a458", "#6fa85c", +"#74ac5f", "#7ab063", "#80b467", "#86b86a", "#8cbc6e", "#92c072", "#94c175", "#97c278", "#9ac47c", "#9cc57f", +"#9fc682", "#a2c886", "#a4c989", "#a7cb8d", "#aacd91", "#afce99", "#b5d0a1", "#bbd2aa", "#c0d3b2", "#c6d5ba", +"#ccd7c3", "#d1d9cb", "#d7dbd4", "#DDDDDD", "#e0e0e0", "#e4e4e4", "#e8e8e8", "#ebebeb", "#efefef", "#f3f3f3", +"#f7f7f7", "#fbfbfb", "#ffffff" +}; + +static const guint DEM_N_HEIGHT_COLORS = sizeof(dem_height_colors)/sizeof(dem_height_colors[0]); + +/* +"#9b793c", "#9e8549", "#a29156", "#a69d63", "#ada569", "#b4ad6f", "#bcb676", "#c2c07d", "#c8ca84", "#cfd58b", +"#a9c278", "#83af65", "#5e9d52", "#6fa85c", "#80b467", "#92c072", "#9ac47c", "#a2c886", "#aacd91", "#bbd2aa", +"#ccd7c3", "#DDDDDD", "#e8e8e8", "#f3f3f3", "#FFFFFF" +}; +*/ + +static gchar *dem_gradient_colors[] = { +"#AAAAAA", +"#000000", "#000011", "#000022", "#000033", "#000044", "#00004c", "#000055", "#00005d", "#000066", "#00006e", +"#000077", "#00007f", "#000088", "#000090", "#000099", "#0000a1", "#0000aa", "#0000b2", "#0000bb", "#0000c3", +"#0000cc", "#0000d4", "#0000dd", "#0000e5", "#0000ee", "#0000f6", "#0000ff", "#0008f7", "#0011ee", "#0019e6", +"#0022dd", "#002ad5", "#0033cc", "#003bc4", "#0044bb", "#004cb3", "#0055aa", "#005da2", "#006699", "#006e91", +"#007788", "#007f80", "#008877", "#00906f", "#009966", "#00a15e", "#00aa55", "#00b24d", "#00bb44", "#00c33c", +"#00cc33", "#00d42b", "#00dd22", "#00e51a", "#00ee11", "#00f609", "#00ff00", "#08f700", "#11ee00", "#19e600", +"#22dd00", "#2ad500", "#33cc00", "#3bc400", "#44bb00", "#4cb300", "#55aa00", "#5da200", "#669900", "#6e9100", +"#778800", "#7f8000", "#887700", "#906f00", "#996600", "#a15e00", "#aa5500", "#b24d00", "#bb4400", "#c33c00", +"#cc3300", "#d42b00", "#dd2200", "#e51a00", "#ee1100", "#f60900", "#ff0000", +"#FFFFFF" +}; + +static const guint DEM_N_GRADIENT_COLORS = sizeof(dem_gradient_colors)/sizeof(dem_gradient_colors[0]); + + +VikLayerInterface vik_dem_layer_interface = { + "DEM", + N_("DEM"), + "D", + &vikdemlayer_pixbuf, + + dem_tools, + sizeof(dem_tools) / sizeof(dem_tools[0]), + + dem_layer_params, + NUM_PARAMS, + NULL, + 0, + + VIK_MENU_ITEM_ALL, + + (VikLayerFuncCreate) dem_layer_create, + (VikLayerFuncRealize) NULL, + (VikLayerFuncPostRead) dem_layer_post_read, + (VikLayerFuncFree) dem_layer_free, + + (VikLayerFuncProperties) NULL, + (VikLayerFuncDraw) dem_layer_draw, + (VikLayerFuncChangeCoordMode) NULL, + + (VikLayerFuncGetTimestamp) NULL, + + (VikLayerFuncSetMenuItemsSelection) NULL, + (VikLayerFuncGetMenuItemsSelection) NULL, + + (VikLayerFuncAddMenuItems) NULL, + (VikLayerFuncSublayerAddMenuItems) NULL, + + (VikLayerFuncSublayerRenameRequest) NULL, + (VikLayerFuncSublayerToggleVisible) NULL, + (VikLayerFuncSublayerTooltip) NULL, + (VikLayerFuncLayerTooltip) dem_layer_tooltip, + (VikLayerFuncLayerSelected) NULL, + + (VikLayerFuncMarshall) dem_layer_marshall, + (VikLayerFuncUnmarshall) dem_layer_unmarshall, + + (VikLayerFuncSetParam) dem_layer_set_param, + (VikLayerFuncGetParam) dem_layer_get_param, + (VikLayerFuncChangeParam) NULL, + + (VikLayerFuncReadFileData) NULL, + (VikLayerFuncWriteFileData) NULL, + + (VikLayerFuncDeleteItem) NULL, + (VikLayerFuncCutItem) NULL, + (VikLayerFuncCopyItem) NULL, + (VikLayerFuncPasteItem) NULL, + (VikLayerFuncFreeCopiedItem) NULL, + (VikLayerFuncDragDropRequest) NULL, + + (VikLayerFuncSelectClick) NULL, + (VikLayerFuncSelectMove) NULL, + (VikLayerFuncSelectRelease) NULL, + (VikLayerFuncSelectedViewportMenu) NULL, +}; + +struct _VikDEMLayer { + VikLayer vl; + GdkGC **gcs; + GdkGC **gcsgradient; + GList *files; + gdouble min_elev; + gdouble max_elev; + GdkColor color; + guint source; + guint type; + + // right click menu only stuff - similar to mapslayer + GtkMenu *right_click_menu; +}; + +// NB Only performed once per program run +static void vik_dem_class_init ( VikDEMLayerClass *klass ) +{ + // Note if suppling your own base URL - the site must still follow the Continent directory layout + if ( ! a_settings_get_string ( VIK_SETTINGS_SRTM_HTTP_BASE_URL, &base_url ) ) { + // Otherwise use the default + base_url = g_strdup ( SRTM_HTTP_BASE_URL ); + } +} + +GType vik_dem_layer_get_type () +{ + static GType vdl_type = 0; + + if (!vdl_type) + { + static const GTypeInfo vdl_info = + { + sizeof (VikDEMLayerClass), + NULL, /* base_init */ + NULL, /* base_finalize */ + (GClassInitFunc) vik_dem_class_init, /* class init */ + NULL, /* class_finalize */ + NULL, /* class_data */ + sizeof (VikDEMLayer), + 0, + NULL /* instance init */ + }; + vdl_type = g_type_register_static ( VIK_LAYER_TYPE, "VikDEMLayer", &vdl_info, 0 ); + } + + return vdl_type; +} + +static const gchar* dem_layer_tooltip( VikDEMLayer *vdl ) +{ + static gchar tmp_buf[100]; + g_snprintf (tmp_buf, sizeof(tmp_buf), _("Number of files: %d"), g_list_length (vdl->files)); + return tmp_buf; +} + +static void dem_layer_marshall( VikDEMLayer *vdl, guint8 **data, guint *len ) +{ + vik_layer_marshall_params ( VIK_LAYER(vdl), data, len ); +} + +static VikDEMLayer *dem_layer_unmarshall( guint8 *data, guint len, VikViewport *vvp ) +{ + VikDEMLayer *rv = dem_layer_new ( vvp ); + gint i; + + /* TODO: share GCS between layers */ + for ( i = 0; i < DEM_N_HEIGHT_COLORS; i++ ) { + if ( i == 0 ) + rv->gcs[i] = vik_viewport_new_gc_from_color ( vvp, &(rv->color), UNUSED_LINE_THICKNESS ); + else + rv->gcs[i] = vik_viewport_new_gc ( vvp, dem_height_colors[i], UNUSED_LINE_THICKNESS ); + } + for ( i = 0; i < DEM_N_GRADIENT_COLORS; i++ ) + rv->gcsgradient[i] = vik_viewport_new_gc ( vvp, dem_gradient_colors[i], UNUSED_LINE_THICKNESS ); + + vik_layer_unmarshall_params ( VIK_LAYER(rv), data, len, vvp ); + return rv; +} + +/* Structure for DEM data used in background thread */ +typedef struct { + VikDEMLayer *vdl; +} dem_load_thread_data; + +/* + * Function for starting the DEM file loading as a background thread + */ +static int dem_layer_load_list_thread ( dem_load_thread_data *dltd, gpointer threaddata ) +{ + int result = 0; // Default to good + // Actual Load + if ( a_dems_load_list ( &(dltd->vdl->files), threaddata ) ) { + // Thread cancelled + result = -1; + } + + // ATM as each file is processed the screen is not updated (no mechanism exposed to a_dems_load_list) + // Thus force draw only at the end, as loading is complete/aborted + // Test is helpful to prevent Gtk-CRITICAL warnings if the program is exitted whilst loading + if ( IS_VIK_LAYER(dltd->vdl) ) + vik_layer_emit_update ( VIK_LAYER(dltd->vdl) ); // NB update requested from background thread + + return result; +} + +static void dem_layer_thread_data_free ( dem_load_thread_data *data ) +{ + // Simple release + g_free ( data ); +} + +static void dem_layer_thread_cancel ( dem_load_thread_data *data ) +{ + // Abort loading + // Instead of freeing the list, leave it as partially processed + // Thus we can see/use what was done +} + +/** + * Process the list of DEM files and convert each one to a relative path + */ +static GList *dem_layer_convert_to_relative_filenaming ( GList *files ) +{ + gchar *cwd = g_get_current_dir(); + if ( !cwd ) + return files; + + GList *relfiles = NULL; + + while ( files ) { + gchar *file = g_strdup ( file_GetRelativeFilename ( cwd, files->data ) ); + relfiles = g_list_prepend ( relfiles, file ); + files = files->next; + } + + g_free ( cwd ); + + if ( relfiles ) { + // Replacing current list, so delete old values first. + GList *iter = files; + while ( iter ) { + g_free ( iter->data ); + iter = iter->next; + } + g_list_free ( files ); + + return relfiles; + } + + return files; +} + +gboolean dem_layer_set_param ( VikDEMLayer *vdl, VikLayerSetParam *vlsp ) +{ + switch ( vlsp->id ) + { + case PARAM_COLOR: vdl->color = vlsp->data.c; gdk_gc_set_rgb_fg_color ( vdl->gcs[0], &(vdl->color) ); break; + case PARAM_SOURCE: vdl->source = vlsp->data.u; break; + case PARAM_TYPE: vdl->type = vlsp->data.u; break; + case PARAM_MIN_ELEV: + /* Convert to store internally + NB file operation always in internal units (metres) */ + if (!vlsp->is_file_operation && a_vik_get_units_height () == VIK_UNITS_HEIGHT_FEET ) + vdl->min_elev = VIK_FEET_TO_METERS(vlsp->data.d); + else + vdl->min_elev = vlsp->data.d; + break; + case PARAM_MAX_ELEV: + /* Convert to store internally + NB file operation always in internal units (metres) */ + if (!vlsp->is_file_operation && a_vik_get_units_height () == VIK_UNITS_HEIGHT_FEET ) + vdl->max_elev = VIK_FEET_TO_METERS(vlsp->data.d); + else + vdl->max_elev = vlsp->data.d; + break; + case PARAM_FILES: + { + // Clear out old settings - if any commonalities with new settings they will have to be read again + a_dems_list_free ( vdl->files ); + + // Set file list so any other intermediate screen drawing updates will show currently loaded DEMs by the working thread + vdl->files = vlsp->data.sl; + // Ensure resolving of any relative path names + util_make_absolute_filenames ( vdl->files, vlsp->dirpath ); + + // No need for thread if no files + if ( vdl->files ) { + // Thread Load + dem_load_thread_data *dltd = g_malloc ( sizeof(dem_load_thread_data) ); + dltd->vdl = vdl; + + a_background_thread ( BACKGROUND_POOL_LOCAL, + VIK_GTK_WINDOW_FROM_WIDGET(vlsp->vp), + _("DEM Loading"), + (vik_thr_func) dem_layer_load_list_thread, + dltd, + (vik_thr_free_func) dem_layer_thread_data_free, + (vik_thr_free_func) dem_layer_thread_cancel, + g_list_length ( vlsp->data.sl ) ); // Number of DEM files + } + break; + } + default: break; + } + return TRUE; +} + +static VikLayerParamData dem_layer_get_param ( VikDEMLayer *vdl, guint16 id, gboolean is_file_operation ) +{ + VikLayerParamData rv; + switch ( id ) + { + case PARAM_FILES: + rv.sl = vdl->files; + if ( is_file_operation ) + // Save in relative format if necessary + if ( a_vik_get_file_ref_format() == VIK_FILE_REF_FORMAT_RELATIVE ) + rv.sl = dem_layer_convert_to_relative_filenaming ( rv.sl ); + break; + case PARAM_SOURCE: rv.u = vdl->source; break; + case PARAM_TYPE: rv.u = vdl->type; break; + case PARAM_COLOR: rv.c = vdl->color; break; + case PARAM_MIN_ELEV: + /* Convert for display in desired units + NB file operation always in internal units (metres) */ + if (!is_file_operation && a_vik_get_units_height () == VIK_UNITS_HEIGHT_FEET ) + rv.d = VIK_METERS_TO_FEET(vdl->min_elev); + else + rv.d = vdl->min_elev; + break; + case PARAM_MAX_ELEV: + /* Convert for display in desired units + NB file operation always in internal units (metres) */ + if (!is_file_operation && a_vik_get_units_height () == VIK_UNITS_HEIGHT_FEET ) + rv.d = VIK_METERS_TO_FEET(vdl->max_elev); + else + rv.d = vdl->max_elev; + break; + default: break; + } + return rv; +} + +static void dem_layer_post_read ( VikLayer *vl, VikViewport *vp, gboolean from_file ) +{ + /* nothing ATM, but keep in case it's needed the future */ +} + +static VikDEMLayer *dem_layer_new ( VikViewport *vvp ) +{ + VikDEMLayer *vdl = VIK_DEM_LAYER ( g_object_new ( VIK_DEM_LAYER_TYPE, NULL ) ); + + vik_layer_set_type ( VIK_LAYER(vdl), VIK_LAYER_DEM ); + + vdl->files = NULL; + + vdl->gcs = g_malloc(sizeof(GdkGC *)*DEM_N_HEIGHT_COLORS); + vdl->gcsgradient = g_malloc(sizeof(GdkGC *)*DEM_N_GRADIENT_COLORS); + /* make new gcs only if we need it (copy layer -> use old) */ + + // Ensure the base GC is available so the default colour can be applied + if ( vvp ) vdl->gcs[0] = vik_viewport_new_gc ( vvp, "#0000FF", 1 ); + + vik_layer_set_defaults ( VIK_LAYER(vdl), vvp ); + + return vdl; +} + + +static inline guint16 get_height_difference(gint16 elev, gint16 new_elev) +{ + if(new_elev == VIK_DEM_INVALID_ELEVATION) + return 0; + else + return abs(new_elev - elev); +} + +static void vik_dem_layer_draw_dem ( VikDEMLayer *vdl, VikViewport *vp, VikDEM *dem ) +{ + VikDEMColumn *column, *prevcolumn, *nextcolumn; + + LatLonBBox vp_bbox = vik_viewport_get_bbox ( vp ); + LatLonBBox dem_bbox = vik_dem_get_bbox ( dem ); + + /**** Check if viewport and DEM data overlap ****/ + if ( ! BBOX_INTERSECT(dem_bbox, vp_bbox) ) { + return; + } + + /* boxes to show where we have DEM instead of actually drawing the DEM. + * useful if we want to see what areas we have coverage for (if we want + * to get elevation data for a track) but don't want to cover the map. + */ + + #if 0 + /* draw a box if a DEM is loaded. in future I'd like to add an option for this + * this is useful if we want to see what areas we have dem for but don't want to + * cover the map (or maybe we just need translucent DEM?) */ + { + VikCoord demne, demsw; + gint x1, y1, x2, y2; + vik_coord_load_from_latlon(&demne, vik_viewport_get_coord_mode(vp), &dem_northeast); + vik_coord_load_from_latlon(&demsw, vik_viewport_get_coord_mode(vp), &dem_southwest); + + vik_viewport_coord_to_screen ( vp, &demne, &x1, &y1 ); + vik_viewport_coord_to_screen ( vp, &demsw, &x2, &y2 ); + + if ( x1 > vik_viewport_get_width(vp) ) x1=vik_viewport_get_width(vp); + if ( y2 > vik_viewport_get_height(vp) ) y2=vik_viewport_get_height(vp); + if ( x2 < 0 ) x2 = 0; + if ( y1 < 0 ) y1 = 0; + vik_viewport_draw_rectangle ( vp, gtk_widget_get_style(GTK_WIDGET(vp))->black_gc, + FALSE, x2, y1, x1-x2, y2-y1 ); + return; + } + #endif + + if ( dem->horiz_units == VIK_DEM_HORIZ_LL_ARCSECONDS ) { + VikCoord tmp; /* TODO: don't use coord_load_from_latlon, especially if in latlon drawing mode */ + + gdouble max_lat_as, max_lon_as, min_lat_as, min_lon_as; + gdouble start_lat_as, end_lat_as, start_lon_as, end_lon_as; + + gdouble start_lat, end_lat, start_lon, end_lon; + + struct LatLon counter; + + guint x, y, start_x, start_y; + + gint16 elev; + + guint skip_factor = ceil ( vik_viewport_get_xmpp(vp) / 80 ); /* todo: smarter calculation. */ + + gdouble nscale_deg = dem->north_scale / ((gdouble) 3600); + gdouble escale_deg = dem->east_scale / ((gdouble) 3600); + + max_lat_as = vp_bbox.north * 3600; + min_lat_as = vp_bbox.south * 3600; + max_lon_as = vp_bbox.east * 3600; + min_lon_as = vp_bbox.west * 3600; + + start_lat_as = MAX(min_lat_as, dem->min_north); + end_lat_as = MIN(max_lat_as, dem->max_north); + start_lon_as = MAX(min_lon_as, dem->min_east); + end_lon_as = MIN(max_lon_as, dem->max_east); + + start_lat = floor(start_lat_as / dem->north_scale) * nscale_deg; + end_lat = ceil (end_lat_as / dem->north_scale) * nscale_deg; + start_lon = floor(start_lon_as / dem->east_scale) * escale_deg; + end_lon = ceil (end_lon_as / dem->east_scale) * escale_deg; + + vik_dem_east_north_to_xy ( dem, start_lon_as, start_lat_as, &start_x, &start_y ); + guint gradient_skip_factor = 1; + if(vdl->type == DEM_TYPE_GRADIENT) + gradient_skip_factor = skip_factor; + + /* verify sane elev interval */ + if ( vdl->max_elev <= vdl->min_elev ) + vdl->max_elev = vdl->min_elev + 1; + + for ( x=start_x, counter.lon = start_lon; counter.lon <= end_lon+escale_deg*skip_factor; counter.lon += escale_deg * skip_factor, x += skip_factor ) { + // NOTE: ( counter.lon <= end_lon + ESCALE_DEG*SKIP_FACTOR ) is neccessary so in high zoom modes, + // the leftmost column does also get drawn, if the center point is out of viewport. + if ( x < dem->n_columns ) { + column = g_ptr_array_index ( dem->columns, x ); + // get previous and next column. catch out-of-bound. + gint32 new_x = x; + new_x -= gradient_skip_factor; + if(new_x < 1) + prevcolumn = g_ptr_array_index ( dem->columns, x+1); + else + prevcolumn = g_ptr_array_index ( dem->columns, new_x); + new_x = x; + new_x += gradient_skip_factor; + if(new_x >= dem->n_columns) + nextcolumn = g_ptr_array_index ( dem->columns, x-1); + else + nextcolumn = g_ptr_array_index ( dem->columns, new_x); + + for ( y=start_y, counter.lat = start_lat; counter.lat <= end_lat; counter.lat += nscale_deg * skip_factor, y += skip_factor ) { + if ( y > column->n_points ) + break; + + elev = column->points[y]; + + // calculate bounding box for drawing + gint box_x, box_y, box_width, box_height; + struct LatLon box_c; + box_c = counter; + box_c.lat += (nscale_deg * skip_factor)/2; + box_c.lon -= (escale_deg * skip_factor)/2; + vik_coord_load_from_latlon(&tmp, vik_viewport_get_coord_mode(vp), &box_c); + vik_viewport_coord_to_screen(vp, &tmp, &box_x, &box_y); + // catch box at borders + if(box_x < 0) + box_x = 0; + if(box_y < 0) + box_y = 0; + box_c.lat -= nscale_deg * skip_factor; + box_c.lon += escale_deg * skip_factor; + vik_coord_load_from_latlon(&tmp, vik_viewport_get_coord_mode(vp), &box_c); + vik_viewport_coord_to_screen(vp, &tmp, &box_width, &box_height); + box_width -= box_x; + box_height -= box_y; + // catch box at borders + if(box_width < 0 || box_height < 0) + // skip this as is out of the viewport (e.g. zoomed in so this point is way off screen) + continue; + + gboolean below_minimum = FALSE; + if(vdl->type == DEM_TYPE_HEIGHT) { + if ( elev != VIK_DEM_INVALID_ELEVATION && elev < vdl->min_elev ) { + // Prevent 'elev - vdl->min_elev' from being negative so can safely use as array index + elev = ceil ( vdl->min_elev ); + below_minimum = TRUE; + } + if ( elev != VIK_DEM_INVALID_ELEVATION && elev > vdl->max_elev ) + elev = vdl->max_elev; + } + + { + if(vdl->type == DEM_TYPE_GRADIENT) { + if( elev == VIK_DEM_INVALID_ELEVATION ) { + /* don't draw it */ + } else { + // calculate and sum gradient in all directions + gint16 change = 0; + gint32 new_y; + + // calculate gradient from height points all around the current one + new_y = y - gradient_skip_factor; + if(new_y < 0) + new_y = y; + change += get_height_difference(elev, prevcolumn->points[new_y]); + change += get_height_difference(elev, column->points[new_y]); + change += get_height_difference(elev, nextcolumn->points[new_y]); + + change += get_height_difference(elev, prevcolumn->points[y]); + change += get_height_difference(elev, nextcolumn->points[y]); + + new_y = y + gradient_skip_factor; + if(new_y >= column->n_points) + new_y = y; + change += get_height_difference(elev, prevcolumn->points[new_y]); + change += get_height_difference(elev, column->points[new_y]); + change += get_height_difference(elev, nextcolumn->points[new_y]); + + change = change / ((skip_factor > 1) ? log(skip_factor) : 0.55); // FIXME: better calc. + + if(change < vdl->min_elev) + // Prevent 'change - vdl->min_elev' from being negative so can safely use as array index + change = ceil ( vdl->min_elev ); + + if(change > vdl->max_elev) + change = vdl->max_elev; + + // void vik_viewport_draw_rectangle ( VikViewport *vvp, GdkGC *gc, gboolean filled, gint x1, gint y1, gint x2, gint y2 ); + vik_viewport_draw_rectangle(vp, vdl->gcsgradient[(gint)floor(((change - vdl->min_elev)/(vdl->max_elev - vdl->min_elev))*(DEM_N_GRADIENT_COLORS-2))+1], TRUE, box_x, box_y, box_width, box_height); + } + } else { + if(vdl->type == DEM_TYPE_HEIGHT) { + if ( elev == VIK_DEM_INVALID_ELEVATION ) + ; /* don't draw it */ + else if ( elev <= 0 || below_minimum ) + /* If 'sea' colour or below the defined mininum draw in the configurable colour */ + vik_viewport_draw_rectangle(vp, vdl->gcs[0], TRUE, box_x, box_y, box_width, box_height); + else + vik_viewport_draw_rectangle(vp, vdl->gcs[(gint)floor(((elev - vdl->min_elev)/(vdl->max_elev - vdl->min_elev))*(DEM_N_HEIGHT_COLORS-2))+1], TRUE, box_x, box_y, box_width, box_height); + } + } + } + } /* for y= */ + } + } /* for x= */ + } else if ( dem->horiz_units == VIK_DEM_HORIZ_UTM_METERS ) { + gdouble max_nor, max_eas, min_nor, min_eas; + gdouble start_nor, start_eas, end_nor, end_eas; + + gint16 elev; + + guint x, y, start_x, start_y; + + VikCoord tmp; /* TODO: don't use coord_load_from_latlon, especially if in latlon drawing mode */ + struct UTM counter; + + guint skip_factor = ceil ( vik_viewport_get_xmpp(vp) / 10 ); /* todo: smarter calculation. */ + + VikCoord tleft, tright, bleft, bright; + + vik_viewport_screen_to_coord ( vp, 0, 0, &tleft ); + vik_viewport_screen_to_coord ( vp, vik_viewport_get_width(vp), 0, &tright ); + vik_viewport_screen_to_coord ( vp, 0, vik_viewport_get_height(vp), &bleft ); + vik_viewport_screen_to_coord ( vp, vik_viewport_get_width(vp), vik_viewport_get_height(vp), &bright ); + + + vik_coord_convert(&tleft, VIK_COORD_UTM); + vik_coord_convert(&tright, VIK_COORD_UTM); + vik_coord_convert(&bleft, VIK_COORD_UTM); + vik_coord_convert(&bright, VIK_COORD_UTM); + + max_nor = MAX(tleft.north_south, tright.north_south); + min_nor = MIN(bleft.north_south, bright.north_south); + max_eas = MAX(bright.east_west, tright.east_west); + min_eas = MIN(bleft.east_west, tleft.east_west); + + start_nor = MAX(min_nor, dem->min_north); + end_nor = MIN(max_nor, dem->max_north); + if ( tleft.utm_zone == dem->utm_zone && bleft.utm_zone == dem->utm_zone + && (tleft.utm_letter >= 'N') == (dem->utm_letter >= 'N') + && (bleft.utm_letter >= 'N') == (dem->utm_letter >= 'N') ) /* if the utm zones/hemispheres are different, min_eas will be bogus */ + start_eas = MAX(min_eas, dem->min_east); + else + start_eas = dem->min_east; + if ( tright.utm_zone == dem->utm_zone && bright.utm_zone == dem->utm_zone + && (tright.utm_letter >= 'N') == (dem->utm_letter >= 'N') + && (bright.utm_letter >= 'N') == (dem->utm_letter >= 'N') ) /* if the utm zones/hemispheres are different, min_eas will be bogus */ + end_eas = MIN(max_eas, dem->max_east); + else + end_eas = dem->max_east; + + start_nor = floor(start_nor / dem->north_scale) * dem->north_scale; + end_nor = ceil (end_nor / dem->north_scale) * dem->north_scale; + start_eas = floor(start_eas / dem->east_scale) * dem->east_scale; + end_eas = ceil (end_eas / dem->east_scale) * dem->east_scale; + + vik_dem_east_north_to_xy ( dem, start_eas, start_nor, &start_x, &start_y ); + + /* TODO: why start_x and start_y are -1 -- rounding error from above? */ + + counter.zone = dem->utm_zone; + counter.letter = dem->utm_letter; + + for ( x=start_x, counter.easting = start_eas; counter.easting <= end_eas; counter.easting += dem->east_scale * skip_factor, x += skip_factor ) { + if ( x > 0 && x < dem->n_columns ) { + column = g_ptr_array_index ( dem->columns, x ); + for ( y=start_y, counter.northing = start_nor; counter.northing <= end_nor; counter.northing += dem->north_scale * skip_factor, y += skip_factor ) { + if ( y > column->n_points ) + continue; + elev = column->points[y]; + if ( elev != VIK_DEM_INVALID_ELEVATION && elev < vdl->min_elev ) + elev=vdl->min_elev; + if ( elev != VIK_DEM_INVALID_ELEVATION && elev > vdl->max_elev ) + elev=vdl->max_elev; + + { + gint a, b; + vik_coord_load_from_utm(&tmp, vik_viewport_get_coord_mode(vp), &counter); + vik_viewport_coord_to_screen(vp, &tmp, &a, &b); + if ( elev == VIK_DEM_INVALID_ELEVATION ) + ; /* don't draw it */ + else if ( elev <= 0 ) + vik_viewport_draw_rectangle(vp, vdl->gcs[0], TRUE, a-1, b-1, 2, 2 ); + else + vik_viewport_draw_rectangle(vp, vdl->gcs[(gint)floor((elev - vdl->min_elev)/(vdl->max_elev - vdl->min_elev)*(DEM_N_HEIGHT_COLORS-2))+1], TRUE, a-1, b-1, 2, 2 ); + } + } /* for y= */ + } + } /* for x= */ + } +} + +/* return the continent for the specified lat, lon */ +/* TODO */ +static const gchar *srtm_continent_dir ( gint lat, gint lon ) +{ + extern const char *_srtm_continent_data[]; + static GHashTable *srtm_continent = NULL; + const gchar *continent; + gchar name[16]; + + if (!srtm_continent) { + const gchar **s; + + srtm_continent = g_hash_table_new(g_str_hash, g_str_equal); + s = _srtm_continent_data; + while (*s != (gchar *)-1) { + continent = *s++; + while (*s) { + g_hash_table_insert(srtm_continent, (gpointer) *s, (gpointer) continent); + s++; + } + s++; + } + } + g_snprintf(name, sizeof(name), "%c%02d%c%03d", + (lat >= 0) ? 'N' : 'S', ABS(lat), + (lon >= 0) ? 'E' : 'W', ABS(lon)); + + return(g_hash_table_lookup(srtm_continent, name)); +} + +static void dem_layer_draw ( VikDEMLayer *vdl, VikViewport *vp ) +{ + GList *dems_iter = vdl->files; + VikDEM *dem; + + + /* search for SRTM3 90m */ + + if ( vdl->source == DEM_SOURCE_SRTM ) + srtm_draw_existence ( vp ); +#ifdef VIK_CONFIG_DEM24K + else if ( vdl->source == DEM_SOURCE_DEM24K ) + dem24k_draw_existence ( vp ); +#endif + + while ( dems_iter ) { + dem = a_dems_get ( (const char *) (dems_iter->data) ); + if ( dem ) + vik_dem_layer_draw_dem ( vdl, vp, dem ); + dems_iter = dems_iter->next; + } +} + +static void dem_layer_free ( VikDEMLayer *vdl ) +{ + gint i; + if ( vdl->gcs ) + for ( i = 0; i < DEM_N_HEIGHT_COLORS; i++ ) + g_object_unref ( vdl->gcs[i] ); + g_free ( vdl->gcs ); + + if ( vdl->gcsgradient ) + for ( i = 0; i < DEM_N_GRADIENT_COLORS; i++ ) + g_object_unref ( vdl->gcsgradient[i] ); + g_free ( vdl->gcsgradient ); + + a_dems_list_free ( vdl->files ); +} + +VikDEMLayer *dem_layer_create ( VikViewport *vp ) +{ + VikDEMLayer *vdl = dem_layer_new ( vp ); + gint i; + if ( vp ) { + /* TODO: share GCS between layers */ + for ( i = 0; i < DEM_N_HEIGHT_COLORS; i++ ) { + if ( i > 0 ) + vdl->gcs[i] = vik_viewport_new_gc ( vp, dem_height_colors[i], UNUSED_LINE_THICKNESS ); + } + for ( i = 0; i < DEM_N_GRADIENT_COLORS; i++ ) + vdl->gcsgradient[i] = vik_viewport_new_gc ( vp, dem_gradient_colors[i], UNUSED_LINE_THICKNESS ); + } + return vdl; +} +/************************************************************** + **** SOURCES & DOWNLOADING + **************************************************************/ +typedef struct { + gchar *dest; + gdouble lat, lon; + + GMutex *mutex; + VikDEMLayer *vdl; /* NULL if not alive */ + + guint source; +} DEMDownloadParams; + + +/************************************************** + * SOURCE: SRTM * + **************************************************/ + +static void srtm_dem_download_thread ( DEMDownloadParams *p, gpointer threaddata ) +{ + gint intlat, intlon; + const gchar *continent_dir; + + intlat = (int)floor(p->lat); + intlon = (int)floor(p->lon); + continent_dir = srtm_continent_dir(intlat, intlon); + + if (!continent_dir) { + if ( p->vdl ) { + gchar *msg = g_strdup_printf ( _("No SRTM data available for %f, %f"), p->lat, p->lon ); + vik_window_statusbar_update ( (VikWindow*)VIK_GTK_WINDOW_FROM_LAYER(p->vdl), msg, VIK_STATUSBAR_INFO ); + g_free ( msg ); + } + return; + } + + gchar *src_url = g_strdup_printf("%s/%s/%c%02d%c%03d.hgt.zip", + base_url, + continent_dir, + (intlat >= 0) ? 'N' : 'S', + ABS(intlat), + (intlon >= 0) ? 'E' : 'W', + ABS(intlon) ); + + static DownloadFileOptions options = { FALSE, FALSE, NULL, 5, a_check_map_file, NULL, NULL }; + DownloadResult_t result = a_http_download_get_url ( src_url, NULL, p->dest, &options, NULL ); + switch ( result ) { + case DOWNLOAD_PARAMETERS_ERROR: + case DOWNLOAD_CONTENT_ERROR: + case DOWNLOAD_HTTP_ERROR: { + gchar *msg = g_strdup_printf ( _("DEM download failure for %f, %f"), p->lat, p->lon ); + vik_window_statusbar_update ( (VikWindow*)VIK_GTK_WINDOW_FROM_LAYER(p->vdl), msg, VIK_STATUSBAR_INFO ); + g_free ( msg ); + break; + } + case DOWNLOAD_FILE_WRITE_ERROR: { + gchar *msg = g_strdup_printf ( _("DEM write failure for %s"), p->dest ); + vik_window_statusbar_update ( (VikWindow*)VIK_GTK_WINDOW_FROM_LAYER(p->vdl), msg, VIK_STATUSBAR_INFO ); + g_free ( msg ); + break; + } + case DOWNLOAD_SUCCESS: + case DOWNLOAD_NOT_REQUIRED: + default: + break; + } + g_free ( src_url ); +} + +static gchar *srtm_lat_lon_to_dest_fn ( gdouble lat, gdouble lon ) +{ + gint intlat, intlon; + const gchar *continent_dir; + + intlat = (int)floor(lat); + intlon = (int)floor(lon); + continent_dir = srtm_continent_dir(intlat, intlon); + + if (!continent_dir) + continent_dir = "nowhere"; + + return g_strdup_printf("srtm3-%s%s%c%02d%c%03d.hgt.zip", + continent_dir, + G_DIR_SEPARATOR_S, + (intlat >= 0) ? 'N' : 'S', + ABS(intlat), + (intlon >= 0) ? 'E' : 'W', + ABS(intlon) ); + +} + +/* TODO: generalize */ +static void srtm_draw_existence ( VikViewport *vp ) +{ + gdouble max_lat, max_lon, min_lat, min_lon; + gchar buf[strlen(MAPS_CACHE_DIR)+strlen(SRTM_CACHE_TEMPLATE)+30]; + gint i, j; + + vik_viewport_get_min_max_lat_lon ( vp, &min_lat, &max_lat, &min_lon, &max_lon ); + + for (i = floor(min_lat); i <= floor(max_lat); i++) { + for (j = floor(min_lon); j <= floor(max_lon); j++) { + const gchar *continent_dir; + if ((continent_dir = srtm_continent_dir(i, j)) == NULL) + continue; + g_snprintf(buf, sizeof(buf), SRTM_CACHE_TEMPLATE, + MAPS_CACHE_DIR, + continent_dir, + G_DIR_SEPARATOR_S, + (i >= 0) ? 'N' : 'S', + ABS(i), + (j >= 0) ? 'E' : 'W', + ABS(j) ); + if ( g_file_test(buf, G_FILE_TEST_EXISTS ) == TRUE ) { + VikCoord ne, sw; + gint x1, y1, x2, y2; + sw.north_south = i; + sw.east_west = j; + sw.mode = VIK_COORD_LATLON; + ne.north_south = i+1; + ne.east_west = j+1; + ne.mode = VIK_COORD_LATLON; + vik_viewport_coord_to_screen ( vp, &sw, &x1, &y1 ); + vik_viewport_coord_to_screen ( vp, &ne, &x2, &y2 ); + if ( x1 < 0 ) x1 = 0; + if ( y2 < 0 ) y2 = 0; + vik_viewport_draw_rectangle ( vp, gtk_widget_get_style(GTK_WIDGET(vp))->black_gc, + FALSE, x1, y2, x2-x1, y1-y2 ); + } + } + } +} + + +/************************************************** + * SOURCE: USGS 24K * + **************************************************/ + +#ifdef VIK_CONFIG_DEM24K + +static void dem24k_dem_download_thread ( DEMDownloadParams *p, gpointer threaddata ) +{ + /* TODO: dest dir */ + gchar *cmdline = g_strdup_printf("%s %.03f %.03f", + DEM24K_DOWNLOAD_SCRIPT, + floor(p->lat*8)/8, + ceil(p->lon*8)/8 ); + /* FIX: don't use system, use execv or something. check for existence */ + system(cmdline); + g_free ( cmdline ); +} + +static gchar *dem24k_lat_lon_to_dest_fn ( gdouble lat, gdouble lon ) +{ + return g_strdup_printf("dem24k/%d/%d/%.03f,%.03f.dem", + (gint) lat, + (gint) lon, + floor(lat*8)/8, + ceil(lon*8)/8); +} + +/* TODO: generalize */ +static void dem24k_draw_existence ( VikViewport *vp ) +{ + gdouble max_lat, max_lon, min_lat, min_lon; + gchar buf[strlen(MAPS_CACHE_DIR)+40]; + gdouble i, j; + + vik_viewport_get_min_max_lat_lon ( vp, &min_lat, &max_lat, &min_lon, &max_lon ); + + for (i = floor(min_lat*8)/8; i <= floor(max_lat*8)/8; i+=0.125) { + /* check lat dir first -- faster */ + g_snprintf(buf, sizeof(buf), "%sdem24k/%d/", + MAPS_CACHE_DIR, + (gint) i ); + if ( g_file_test(buf, G_FILE_TEST_EXISTS) == FALSE ) + continue; + for (j = floor(min_lon*8)/8; j <= floor(max_lon*8)/8; j+=0.125) { + /* check lon dir first -- faster */ + g_snprintf(buf, sizeof(buf), "%sdem24k/%d/%d/", + MAPS_CACHE_DIR, + (gint) i, + (gint) j ); + if ( g_file_test(buf, G_FILE_TEST_EXISTS) == FALSE ) + continue; + g_snprintf(buf, sizeof(buf), "%sdem24k/%d/%d/%.03f,%.03f.dem", + MAPS_CACHE_DIR, + (gint) i, + (gint) j, + floor(i*8)/8, + floor(j*8)/8 ); + if ( g_file_test(buf, G_FILE_TEST_EXISTS ) == TRUE ) { + VikCoord ne, sw; + gint x1, y1, x2, y2; + sw.north_south = i; + sw.east_west = j-0.125; + sw.mode = VIK_COORD_LATLON; + ne.north_south = i+0.125; + ne.east_west = j; + ne.mode = VIK_COORD_LATLON; + vik_viewport_coord_to_screen ( vp, &sw, &x1, &y1 ); + vik_viewport_coord_to_screen ( vp, &ne, &x2, &y2 ); + if ( x1 < 0 ) x1 = 0; + if ( y2 < 0 ) y2 = 0; + vik_viewport_draw_rectangle ( vp, gtk_widget_get_style(GTK_WIDGET(vp))->black_gc, + FALSE, x1, y2, x2-x1, y1-y2 ); + } + } + } +} +#endif + +/************************************************** + * SOURCES -- DOWNLOADING & IMPORTING TOOL * + ************************************************** + */ + +static void weak_ref_cb ( gpointer ptr, GObject * dead_vdl ) +{ + DEMDownloadParams *p = ptr; + g_mutex_lock ( p->mutex ); + p->vdl = NULL; + g_mutex_unlock ( p->mutex ); +} + +/* Try to add file full_path. + * filename will be copied. + * returns FALSE if file does not exists, TRUE otherwise. + */ +static gboolean dem_layer_add_file ( VikDEMLayer *vdl, const gchar *filename ) +{ + if ( g_file_test(filename, G_FILE_TEST_EXISTS) == TRUE ) { + /* only load if file size is not 0 (not in progress) */ + GStatBuf sb; + (void)g_stat ( filename, &sb ); + if ( sb.st_size ) { + gchar *duped_path = g_strdup(filename); + vdl->files = g_list_prepend ( vdl->files, duped_path ); + a_dems_load ( duped_path ); + g_debug("%s: %s", __FUNCTION__, duped_path); + } + return TRUE; + } else + return FALSE; +} + +static void dem_download_thread ( DEMDownloadParams *p, gpointer threaddata ) +{ + if ( p->source == DEM_SOURCE_SRTM ) + srtm_dem_download_thread ( p, threaddata ); +#ifdef VIK_CONFIG_DEM24K + else if ( p->source == DEM_SOURCE_DEM24K ) + dem24k_dem_download_thread ( p, threaddata ); +#endif + else + return; + + g_mutex_lock ( p->mutex ); + if ( p->vdl ) { + g_object_weak_unref ( G_OBJECT(p->vdl), weak_ref_cb, p ); + + if ( dem_layer_add_file ( p->vdl, p->dest ) ) + vik_layer_emit_update ( VIK_LAYER(p->vdl) ); // NB update requested from background thread + } + g_mutex_unlock ( p->mutex ); +} + + +static void free_dem_download_params ( DEMDownloadParams *p ) +{ + vik_mutex_free ( p->mutex ); + g_free ( p->dest ); + g_free ( p ); +} + +static gpointer dem_layer_download_create ( VikWindow *vw, VikViewport *vvp) +{ + return vvp; +} + +/** + * Display a simple dialog with information about the DEM file at this location + */ +static void dem_layer_file_info ( GtkWidget *widget, struct LatLon *ll ) +{ + gint intlat, intlon; + const gchar *continent_dir; + + intlat = (int)floor(ll->lat); + intlon = (int)floor(ll->lon); + continent_dir = srtm_continent_dir(intlat, intlon); + + gchar *source = NULL; + if ( continent_dir ) + source = g_strdup_printf ( "%s/%s/%c%02d%c%03d.hgt.zip", + base_url, + continent_dir, + (intlat >= 0) ? 'N' : 'S', + ABS(intlat), + (intlon >= 0) ? 'E' : 'W', + ABS(intlon) ); + else + // Probably not over any land... + source = g_strdup ( _("No DEM File Available") ); + + gchar *filename = NULL; + gchar *dem_file = NULL; +#ifdef VIK_CONFIG_DEM24K + dem_file = dem24k_lat_lon_to_dest_fn ( ll->lat, ll->lon ); +#else + dem_file = srtm_lat_lon_to_dest_fn ( ll->lat, ll->lon ); +#endif + gchar *message = NULL; + + filename = g_strdup_printf ( "%s%s", MAPS_CACHE_DIR, dem_file ); + + if ( g_file_test ( filename, G_FILE_TEST_EXISTS ) ) { + // Get some timestamp information of the file + GStatBuf stat_buf; + if ( g_stat ( filename, &stat_buf ) == 0 ) { + gchar time_buf[64]; + strftime ( time_buf, sizeof(time_buf), "%c", gmtime((const time_t *)&stat_buf.st_mtime) ); + message = g_strdup_printf ( _("\nSource: %s\n\nDEM File: %s\nDEM File Timestamp: %s"), source, filename, time_buf ); + } + } + else + message = g_strdup_printf ( _("Source: %s\n\nNo DEM File!"), source ); + + // Show the info + a_dialog_info_msg ( GTK_WINDOW(gtk_widget_get_toplevel(widget)), message ); + + g_free ( message ); + g_free ( source ); + g_free ( dem_file ); + g_free ( filename ); +} + +static gboolean dem_layer_download_release ( VikDEMLayer *vdl, GdkEventButton *event, VikViewport *vvp ) +{ + VikCoord coord; + static struct LatLon ll; + + gchar *full_path; + gchar *dem_file = NULL; + + vik_viewport_screen_to_coord ( vvp, event->x, event->y, &coord ); + vik_coord_to_latlon ( &coord, &ll ); + + + if ( vdl->source == DEM_SOURCE_SRTM ) + dem_file = srtm_lat_lon_to_dest_fn ( ll.lat, ll.lon ); +#ifdef VIK_CONFIG_DEM24K + else if ( vdl->source == DEM_SOURCE_DEM24K ) + dem_file = dem24k_lat_lon_to_dest_fn ( ll.lat, ll.lon ); +#endif + + if ( ! dem_file ) + return TRUE; + + full_path = g_strdup_printf("%s%s", MAPS_CACHE_DIR, dem_file ); + + g_debug("%s: %s", __FUNCTION__, full_path); + + if ( event->button == 1 ) { + // TODO: check if already in filelist + if ( ! dem_layer_add_file(vdl, full_path) ) { + gchar *tmp = g_strdup_printf ( _("Downloading DEM %s"), dem_file ); + DEMDownloadParams *p = g_malloc(sizeof(DEMDownloadParams)); + p->dest = g_strdup(full_path); + p->lat = ll.lat; + p->lon = ll.lon; + p->vdl = vdl; + p->mutex = vik_mutex_new(); + p->source = vdl->source; + g_object_weak_ref(G_OBJECT(p->vdl), weak_ref_cb, p ); + + a_background_thread ( BACKGROUND_POOL_REMOTE, + VIK_GTK_WINDOW_FROM_LAYER(vdl), tmp, + (vik_thr_func) dem_download_thread, p, + (vik_thr_free_func) free_dem_download_params, NULL, 1 ); + + g_free ( tmp ); + } + else + vik_layer_emit_update ( VIK_LAYER(vdl) ); + } + else { + if ( !vdl->right_click_menu ) { + GtkWidget *item; + vdl->right_click_menu = GTK_MENU ( gtk_menu_new () ); + + item = gtk_image_menu_item_new_with_mnemonic ( _("_Show DEM File Information") ); + gtk_image_menu_item_set_image ( (GtkImageMenuItem*)item, gtk_image_new_from_stock (GTK_STOCK_INFO, GTK_ICON_SIZE_MENU) ); + g_signal_connect ( G_OBJECT(item), "activate", G_CALLBACK(dem_layer_file_info), &ll ); + gtk_menu_shell_append (GTK_MENU_SHELL(vdl->right_click_menu), item); + } + + gtk_menu_popup ( vdl->right_click_menu, NULL, NULL, NULL, NULL, event->button, event->time ); + gtk_widget_show_all ( GTK_WIDGET(vdl->right_click_menu) ); + } + + g_free ( dem_file ); + g_free ( full_path ); + + return TRUE; +} + +static gboolean dem_layer_download_click ( VikDEMLayer *vdl, GdkEventButton *event, VikViewport *vvp ) +{ +/* choose & keep track of cache dir + * download in background thread + * download over area */ + return TRUE; +} + + diff --git a/src/vikdemlayer.h b/src/vikdemlayer.h new file mode 100644 index 0000000..e36cf78 --- /dev/null +++ b/src/vikdemlayer.h @@ -0,0 +1,47 @@ +/* + * viking -- GPS Data and Topo Analyzer, Explorer, and Manager + * + * Copyright (C) 2003-2005, Evan Battaglia + * + * 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., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA + * + */ + +#ifndef _VIKING_DEMLAYER_H +#define _VIKING_DEMLAYER_H + +#include "viklayer.h" + +G_BEGIN_DECLS + +#define VIK_DEM_LAYER_TYPE (vik_dem_layer_get_type ()) +#define VIK_DEM_LAYER(obj) (G_TYPE_CHECK_INSTANCE_CAST ((obj), VIK_DEM_LAYER_TYPE, VikDEMLayer)) +#define VIK_DEM_LAYER_CLASS(klass) (G_TYPE_CHECK_CLASS_CAST ((klass), VIK_DEM_LAYER_TYPE, VikDEMLayerClass)) +#define IS_VIK_DEM_LAYER(obj) (G_TYPE_CHECK_INSTANCE_TYPE ((obj), VIK_DEM_LAYER_TYPE)) +#define IS_VIK_DEM_LAYER_CLASS(klass) (G_TYPE_CHECK_CLASS_TYPE ((klass), VIK_DEM_LAYER_TYPE)) + +typedef struct _VikDEMLayerClass VikDEMLayerClass; +struct _VikDEMLayerClass +{ + VikLayerClass object_class; +}; + +GType vik_dem_layer_get_type (); + +typedef struct _VikDEMLayer VikDEMLayer; + +G_END_DECLS + +#endif diff --git a/src/vikenumtypes.c b/src/vikenumtypes.c new file mode 100644 index 0000000..b48fe6d --- /dev/null +++ b/src/vikenumtypes.c @@ -0,0 +1,37 @@ + +/* This file is generated by glib-mkenums, do not modify it. This code is licensed under the same license as the containing project. Note that it links to GLib, so must comply with the LGPL linking clauses. */ + +#include "vikenumtypes.h" +/* enumerations from "vikviewport.h" */ +#include "vikviewport.h" +GType +vik_viewport_draw_mode_get_type (void) +{ + static GType the_type = 0; + + if (the_type == 0) + { + static const GEnumValue values[] = { + { VIK_VIEWPORT_DRAWMODE_UTM, + "VIK_VIEWPORT_DRAWMODE_UTM", + "utm" }, + { VIK_VIEWPORT_DRAWMODE_EXPEDIA, + "VIK_VIEWPORT_DRAWMODE_EXPEDIA", + "expedia" }, + { VIK_VIEWPORT_DRAWMODE_MERCATOR, + "VIK_VIEWPORT_DRAWMODE_MERCATOR", + "mercator" }, + { VIK_VIEWPORT_DRAWMODE_LATLON, + "VIK_VIEWPORT_DRAWMODE_LATLON", + "latlon" }, + { 0, NULL, NULL } + }; + the_type = g_enum_register_static ( + g_intern_static_string ("VikViewportDrawMode"), + values); + } + return the_type; +} + +/* Generated data ends here */ + diff --git a/src/vikenumtypes.c.template b/src/vikenumtypes.c.template new file mode 100644 index 0000000..04cbe95 --- /dev/null +++ b/src/vikenumtypes.c.template @@ -0,0 +1,40 @@ +/*** BEGIN file-header ***/ +#include "vikenumtypes.h" + +/*** END file-header ***/ + +/*** BEGIN file-production ***/ +/* enumerations from "@filename@" */ +#include "@filename@" + +/*** END file-production ***/ + +/*** BEGIN value-header ***/ +GType +@enum_name@_get_type (void) +{ + static GType the_type = 0; + + if (the_type == 0) + { + static const G@Type@Value values[] = { +/*** END value-header ***/ + +/*** BEGIN value-production ***/ + { @VALUENAME@, + "@VALUENAME@", + "@valuenick@" }, +/*** END value-production ***/ + +/*** BEGIN value-tail ***/ + { 0, NULL, NULL } + }; + the_type = g_@type@_register_static ( + g_intern_static_string ("@EnumName@"), + values); + } + return the_type; +} + +/*** END value-tail ***/ + diff --git a/src/vikenumtypes.h b/src/vikenumtypes.h new file mode 100644 index 0000000..b372dc8 --- /dev/null +++ b/src/vikenumtypes.h @@ -0,0 +1,18 @@ + +/* This file is generated by glib-mkenums, do not modify it. This code is licensed under the same license as the containing project. Note that it links to GLib, so must comply with the LGPL linking clauses. */ + +#ifndef __VIK_ENUM_TYPES_H__ +#define __VIK_ENUM_TYPES_H__ + +#include + +G_BEGIN_DECLS +/* Enumerations from "vikviewport.h" */ +#define VIK_TYPE_VIEWPORT_DRAW_MODE (vik_viewport_draw_mode_get_type()) +GType vik_viewport_draw_mode_get_type (void) G_GNUC_CONST; +G_END_DECLS + +#endif /* __GITG_ENUM_TYPES_H__ */ + +/* Generated data ends here */ + diff --git a/src/vikenumtypes.h.template b/src/vikenumtypes.h.template new file mode 100644 index 0000000..66e5480 --- /dev/null +++ b/src/vikenumtypes.h.template @@ -0,0 +1,28 @@ +/*** BEGIN file-header ***/ +#ifndef __VIK_ENUM_TYPES_H__ +#define __VIK_ENUM_TYPES_H__ + +#include + +G_BEGIN_DECLS + +/*** END file-header ***/ + +/*** BEGIN file-production ***/ +/* Enumerations from "@filename@" */ + +/*** END file-production ***/ + +/*** BEGIN enumeration-production ***/ +#define VIK_TYPE_@ENUMSHORT@ (@enum_name@_get_type()) +GType @enum_name@_get_type (void) G_GNUC_CONST; + +/*** END enumeration-production ***/ + +/*** BEGIN file-tail ***/ +G_END_DECLS + +#endif /* __GITG_ENUM_TYPES_H__ */ +/*** END file-tail ***/ + + diff --git a/src/vikexttool.c b/src/vikexttool.c new file mode 100644 index 0000000..d76dcc8 --- /dev/null +++ b/src/vikexttool.c @@ -0,0 +1,185 @@ +/* + * viking -- GPS Data and Topo Analyzer, Explorer, and Manager + * + * Copyright (C) 2008, Guilhem Bonnefille + * + * 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., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA + * + */ + +#ifdef HAVE_CONFIG_H +#include "config.h" +#endif + +#include "vikexttool.h" + +#include + +#include + +static GObjectClass *parent_class; + +static void ext_tool_finalize ( GObject *gob ); +static gchar *ext_tool_get_label ( VikExtTool *vw ); + +typedef struct _VikExtToolPrivate VikExtToolPrivate; + +struct _VikExtToolPrivate +{ + gint id; + gchar *label; +}; + +#define EXT_TOOL_GET_PRIVATE(o) (G_TYPE_INSTANCE_GET_PRIVATE ((o), \ + VIK_EXT_TOOL_TYPE, \ + VikExtToolPrivate)) + +G_DEFINE_ABSTRACT_TYPE (VikExtTool, vik_ext_tool, G_TYPE_OBJECT) + +enum +{ + PROP_0, + + PROP_ID, + PROP_LABEL, +}; + +static void +ext_tool_set_property (GObject *object, + guint property_id, + const GValue *value, + GParamSpec *pspec) +{ + VikExtTool *self = VIK_EXT_TOOL (object); + VikExtToolPrivate *priv = EXT_TOOL_GET_PRIVATE (self); + + switch (property_id) + { + case PROP_ID: + priv->id = g_value_get_uint (value); + g_debug ("VikExtTool.id: %d", priv->id); + break; + + case PROP_LABEL: + g_free (priv->label); + priv->label = g_value_dup_string (value); + g_debug ("VikExtTool.label: %s", priv->label); + break; + + default: + /* We don't have any other property... */ + G_OBJECT_WARN_INVALID_PROPERTY_ID (object, property_id, pspec); + break; + } +} + +static void +ext_tool_get_property (GObject *object, + guint property_id, + GValue *value, + GParamSpec *pspec) +{ + VikExtTool *self = VIK_EXT_TOOL (object); + VikExtToolPrivate *priv = EXT_TOOL_GET_PRIVATE (self); + + switch (property_id) + { + case PROP_ID: + g_value_set_uint (value, priv->id); + break; + + case PROP_LABEL: + g_value_set_string (value, priv->label); + break; + + default: + /* We don't have any other property... */ + G_OBJECT_WARN_INVALID_PROPERTY_ID (object, property_id, pspec); + break; + } +} + +static void vik_ext_tool_class_init ( VikExtToolClass *klass ) +{ + GObjectClass *gobject_class; + GParamSpec *pspec; + + gobject_class = G_OBJECT_CLASS (klass); + gobject_class->finalize = ext_tool_finalize; + gobject_class->set_property = ext_tool_set_property; + gobject_class->get_property = ext_tool_get_property; + + pspec = g_param_spec_string ("label", + "Label", + "Set the label", + "" /* default value */, + G_PARAM_CONSTRUCT_ONLY | G_PARAM_READWRITE); + g_object_class_install_property (gobject_class, + PROP_LABEL, + pspec); + + pspec = g_param_spec_uint ("id", + "Id of the tool", + "Set the id", + 0 /* minimum value */, + G_MAXUINT16 /* maximum value */, + 0 /* default value */, + G_PARAM_CONSTRUCT_ONLY | G_PARAM_READWRITE); + g_object_class_install_property (gobject_class, + PROP_ID, + pspec); + + klass->get_label = ext_tool_get_label; + + parent_class = g_type_class_peek_parent (klass); + + g_type_class_add_private (klass, sizeof (VikExtToolPrivate)); +} + +static void vik_ext_tool_init ( VikExtTool *self ) +{ + VikExtToolPrivate *priv = EXT_TOOL_GET_PRIVATE (self); + priv->label = NULL; +} + +static void ext_tool_finalize ( GObject *gob ) +{ + VikExtToolPrivate *priv = EXT_TOOL_GET_PRIVATE ( gob ); + g_free ( priv->label ); priv->label = NULL; + G_OBJECT_CLASS(parent_class)->finalize(gob); +} + +static gchar *ext_tool_get_label ( VikExtTool *self ) +{ + VikExtToolPrivate *priv = NULL; + priv = EXT_TOOL_GET_PRIVATE (self); + return g_strdup ( priv->label ); +} + +gchar *vik_ext_tool_get_label ( VikExtTool *w ) +{ + return VIK_EXT_TOOL_GET_CLASS( w )->get_label( w ); +} + +void vik_ext_tool_open ( VikExtTool *self, VikWindow *vwindow ) +{ + VIK_EXT_TOOL_GET_CLASS( self )->open( self, vwindow ); +} + +void vik_ext_tool_open_at_position ( VikExtTool *self, VikWindow *vwindow, VikCoord *vc ) +{ + if ( VIK_EXT_TOOL_GET_CLASS( self )->open_at_position ) + VIK_EXT_TOOL_GET_CLASS( self )->open_at_position( self, vwindow, vc ); +} diff --git a/src/vikexttool.h b/src/vikexttool.h new file mode 100644 index 0000000..14e625c --- /dev/null +++ b/src/vikexttool.h @@ -0,0 +1,62 @@ +/* + * viking -- GPS Data and Topo Analyzer, Explorer, and Manager + * + * Copyright (C) 2008, Guilhem Bonnefille + * + * 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., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA + * + */ +#ifndef _VIKING_EXT_TOOL_H +#define _VIKING_EXT_TOOL_H + +#include + +#include "vikwindow.h" +#include "vikcoord.h" + +G_BEGIN_DECLS + +#define VIK_EXT_TOOL_TYPE (vik_ext_tool_get_type ()) +#define VIK_EXT_TOOL(obj) (G_TYPE_CHECK_INSTANCE_CAST ((obj), VIK_EXT_TOOL_TYPE, VikExtTool)) +#define VIK_EXT_TOOL_CLASS(klass) (G_TYPE_CHECK_CLASS_CAST ((klass), VIK_EXT_TOOL_TYPE, VikExtToolClass)) +#define IS_VIK_EXT_TOOL(obj) (G_TYPE_CHECK_INSTANCE_TYPE ((obj), VIK_EXT_TOOL_TYPE)) +#define IS_VIK_EXT_TOOL_CLASS(klass) (G_TYPE_CHECK_CLASS_TYPE ((klass), VIK_EXT_TOOL_TYPE)) +#define VIK_EXT_TOOL_GET_CLASS(obj) (G_TYPE_INSTANCE_GET_CLASS ((obj), VIK_EXT_TOOL_TYPE, VikExtToolClass)) + + +typedef struct _VikExtTool VikExtTool; +typedef struct _VikExtToolClass VikExtToolClass; + +struct _VikExtToolClass +{ + GObjectClass object_class; + gchar *(* get_label) (VikExtTool *self); + void (* open) (VikExtTool *self, VikWindow *vwindow); + void (* open_at_position) (VikExtTool *self, VikWindow *vwindow, VikCoord *vc); +}; + +GType vik_ext_tool_get_type (); + +struct _VikExtTool { + GObject obj; +}; + +gchar *vik_ext_tool_get_label ( VikExtTool *self ); +void vik_ext_tool_open ( VikExtTool *self, VikWindow *vwindow ); +void vik_ext_tool_open_at_position ( VikExtTool *self, VikWindow *vwindow, VikCoord *vc ); + +G_END_DECLS + +#endif diff --git a/src/vikexttool_datasources.c b/src/vikexttool_datasources.c new file mode 100644 index 0000000..fbe707b --- /dev/null +++ b/src/vikexttool_datasources.c @@ -0,0 +1,89 @@ +/* -*- Mode: C; indent-tabs-mode: t; c-basic-offset: 4; tab-width: 4 -*- */ +/* + * viking -- GPS Data and Topo Analyzer, Explorer, and Manager + * + * Copyright (C) 2013, Rob Norris + * + * 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., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA + * + */ + +#ifdef HAVE_CONFIG_H +#include "config.h" +#endif + +#include "vikexttools.h" + +#include + +#include + +#define VIK_TOOL_DATASOURCE_KEY "vik-datasource-tool" + +static GList *ext_tool_datasources_list = NULL; + +void vik_ext_tool_datasources_register ( VikExtTool *tool ) +{ + if ( IS_VIK_EXT_TOOL( tool ) ) + ext_tool_datasources_list = g_list_append ( ext_tool_datasources_list, g_object_ref ( tool ) ); +} + +void vik_ext_tool_datasources_unregister_all () +{ + g_list_foreach ( ext_tool_datasources_list, (GFunc) g_object_unref, NULL ); +} + +static void ext_tool_datasources_open_cb ( GtkWidget *widget, VikWindow *vw ) +{ + gpointer ptr = g_object_get_data ( G_OBJECT(widget), VIK_TOOL_DATASOURCE_KEY ); + VikExtTool *ext_tool = VIK_EXT_TOOL ( ptr ); + vik_ext_tool_open ( ext_tool, vw ); +} + +/** + * Add to any menu + * mostly for allowing to assign for TrackWaypoint layer menus + */ +void vik_ext_tool_datasources_add_menu_items_to_menu ( VikWindow *vw, GtkMenu *menu ) +{ + GList *iter; + for (iter = ext_tool_datasources_list; iter; iter = iter->next) { + VikExtTool *ext_tool = NULL; + gchar *label = NULL; + ext_tool = VIK_EXT_TOOL ( iter->data ); + label = vik_ext_tool_get_label ( ext_tool ); + if ( label ) { + GtkWidget *item = NULL; + item = gtk_menu_item_new_with_label ( _(label) ); + g_free ( label ); label = NULL; + // Store tool's ref into the menu entry + g_object_set_data ( G_OBJECT(item), VIK_TOOL_DATASOURCE_KEY, ext_tool ); + g_signal_connect ( G_OBJECT(item), "activate", G_CALLBACK(ext_tool_datasources_open_cb), vw ); + gtk_menu_shell_append (GTK_MENU_SHELL (menu), item); + gtk_widget_show ( item ); + } + } +} + +/** + * Adds to the File->Acquire menu only + */ +void vik_ext_tool_datasources_add_menu_items ( VikWindow *vw, GtkUIManager *uim ) +{ + GtkWidget *widget = gtk_ui_manager_get_widget ( uim, "/MainMenu/File/Acquire/" ); + GtkMenu *menu = GTK_MENU ( gtk_menu_item_get_submenu ( GTK_MENU_ITEM(widget) ) ); + vik_ext_tool_datasources_add_menu_items_to_menu ( vw, menu ); + gtk_widget_show ( widget ); +} diff --git a/src/vikexttool_datasources.h b/src/vikexttool_datasources.h new file mode 100644 index 0000000..52be479 --- /dev/null +++ b/src/vikexttool_datasources.h @@ -0,0 +1,40 @@ +/* -*- Mode: C; indent-tabs-mode: t; c-basic-offset: 4; tab-width: 4 -*- */ +/* + * viking -- GPS Data and Topo Analyzer, Explorer, and Manager + * + * Copyright (C) 2013, Rob Norris + * + * 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., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA + * + */ +#ifndef _VIKING_EXT_TOOL_DATASOURCES_H +#define _VIKING_EXT_TOOL_DATASOURCES_H + +#include + +#include "vikwindow.h" + +#include "vikexttool.h" + +G_BEGIN_DECLS + +void vik_ext_tool_datasources_register ( VikExtTool *tool ); +void vik_ext_tool_datasources_unregister_all (); +void vik_ext_tool_datasources_add_menu_items_to_menu ( VikWindow *vw, GtkMenu *menu ); +void vik_ext_tool_datasources_add_menu_items ( VikWindow *vw, GtkUIManager *uim ); + +G_END_DECLS + +#endif diff --git a/src/vikexttools.c b/src/vikexttools.c new file mode 100644 index 0000000..d504a50 --- /dev/null +++ b/src/vikexttools.c @@ -0,0 +1,119 @@ +/* + * viking -- GPS Data and Topo Analyzer, Explorer, and Manager + * + * Copyright (C) 2008, Guilhem Bonnefille + * + * 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., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA + * + */ + +#ifdef HAVE_CONFIG_H +#include "config.h" +#endif + +#include "vikexttools.h" + +#include + +#include + +#define VIK_TOOL_DATA_KEY "vik-tool-data" +#define VIK_TOOL_WIN_KEY "vik-tool-win" + +static GList *ext_tools_list = NULL; + +void vik_ext_tools_register ( VikExtTool *tool ) +{ + if ( IS_VIK_EXT_TOOL( tool ) ) + ext_tools_list = g_list_append ( ext_tools_list, g_object_ref ( tool ) ); +} + +void vik_ext_tools_unregister_all () +{ + g_list_foreach ( ext_tools_list, (GFunc) g_object_unref, NULL ); +} + +static void ext_tools_open_cb ( GtkWidget *widget, VikWindow *vwindow ) +{ + gpointer ptr = g_object_get_data ( G_OBJECT(widget), VIK_TOOL_DATA_KEY ); + VikExtTool *ext_tool = VIK_EXT_TOOL ( ptr ); + vik_ext_tool_open ( ext_tool, vwindow ); +} + +void vik_ext_tools_add_action_items ( VikWindow *vwindow, GtkUIManager *uim, GtkActionGroup *action_group, guint mid ) +{ + GList *iter; + for (iter = ext_tools_list; iter; iter = iter->next) + { + VikExtTool *ext_tool = NULL; + gchar *label = NULL; + ext_tool = VIK_EXT_TOOL ( iter->data ); + label = vik_ext_tool_get_label ( ext_tool ); + if ( label ) + { + gtk_ui_manager_add_ui ( uim, mid, "/ui/MainMenu/Tools/Exttools", + _(label), + label, + GTK_UI_MANAGER_MENUITEM, FALSE ); + + GtkAction *action = gtk_action_new ( label, label, NULL, NULL ); + g_object_set_data ( G_OBJECT(action), VIK_TOOL_DATA_KEY, ext_tool ); + g_signal_connect ( G_OBJECT(action), "activate", G_CALLBACK(ext_tools_open_cb), vwindow ); + + gtk_action_group_add_action ( action_group, action ); + + g_object_unref ( action ); + + g_free ( label ); label = NULL; + } + } +} + +static void ext_tool_open_at_position_cb ( GtkWidget *widget, VikCoord *vc ) +{ + gpointer ptr = g_object_get_data ( G_OBJECT(widget), VIK_TOOL_DATA_KEY ); + VikExtTool *ext_tool = VIK_EXT_TOOL ( ptr ); + gpointer wptr = g_object_get_data ( G_OBJECT(widget), VIK_TOOL_WIN_KEY ); + VikWindow *vw = VIK_WINDOW ( wptr ); + vik_ext_tool_open_at_position ( ext_tool, vw, vc ); +} + +/** + * Add to any menu + * mostly for allowing to assign for TrackWaypoint layer menus + */ +void vik_ext_tools_add_menu_items_to_menu ( VikWindow *vw, GtkMenu *menu, VikCoord *vc ) +{ + for (GList *iter = ext_tools_list; iter; iter = iter->next) { + VikExtTool *ext_tool = NULL; + gchar *label = NULL; + ext_tool = VIK_EXT_TOOL ( iter->data ); + label = vik_ext_tool_get_label ( ext_tool ); + if ( label ) { + GtkWidget *item = NULL; + item = gtk_menu_item_new_with_label ( _(label) ); + g_free ( label ); label = NULL; + // Store some data into the menu entry + g_object_set_data ( G_OBJECT(item), VIK_TOOL_DATA_KEY, ext_tool ); + g_object_set_data ( G_OBJECT(item), VIK_TOOL_WIN_KEY, vw ); + if ( vc ) + g_signal_connect ( G_OBJECT(item), "activate", G_CALLBACK(ext_tool_open_at_position_cb), vc ); + else + g_signal_connect ( G_OBJECT(item), "activate", G_CALLBACK(ext_tools_open_cb), vw ); + gtk_menu_shell_append (GTK_MENU_SHELL (menu), item); + gtk_widget_show ( item ); + } + } +} diff --git a/src/vikexttools.h b/src/vikexttools.h new file mode 100644 index 0000000..c767146 --- /dev/null +++ b/src/vikexttools.h @@ -0,0 +1,39 @@ +/* + * viking -- GPS Data and Topo Analyzer, Explorer, and Manager + * + * Copyright (C) 2008, Guilhem Bonnefille + * + * 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., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA + * + */ +#ifndef _VIKING_EXT_TOOLS_H +#define _VIKING_EXT_TOOLS_H + +#include + +#include "vikwindow.h" + +#include "vikexttool.h" + +G_BEGIN_DECLS + +void vik_ext_tools_register ( VikExtTool *tool ); +void vik_ext_tools_unregister_all (); +void vik_ext_tools_add_action_items ( VikWindow *vwindow, GtkUIManager *uim, GtkActionGroup *action_group, guint mid ); +void vik_ext_tools_add_menu_items_to_menu ( VikWindow *vw, GtkMenu *menu, VikCoord *vc ); + +G_END_DECLS + +#endif diff --git a/src/vikfileentry.c b/src/vikfileentry.c new file mode 100644 index 0000000..ba3a0b0 --- /dev/null +++ b/src/vikfileentry.c @@ -0,0 +1,191 @@ +/* + * viking -- GPS Data and Topo Analyzer, Explorer, and Manager + * + * Copyright (C) 2003-2005, Evan Battaglia + * + * 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., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA + * + */ + +#ifdef HAVE_CONFIG_H +#include "config.h" +#endif + +#include +#include + +#include "vikfileentry.h" + +struct _VikFileEntry { + GtkHBox parent; + GtkWidget *entry, *button; + GtkWidget *file_selector; + GtkFileChooserAction action; + gint filter_type; + VikFileEntryFunc on_finish; + gpointer user_data; +}; + +GType vik_file_entry_get_type (void) +{ + static GType vs_type = 0; + + if (!vs_type) + { + static const GTypeInfo vs_info = + { + sizeof (VikFileEntryClass), + NULL, /* base_init */ + NULL, /* base_finalize */ + NULL, /* class init */ + NULL, /* class_finalize */ + NULL, /* class_data */ + sizeof (VikFileEntry), + 0, + NULL /* instance init */ + }; + vs_type = g_type_register_static ( GTK_TYPE_HBOX, "VikFileEntry", &vs_info, 0 ); + } + + return vs_type; +} + +/** + * Create a file entry with an optional file filter and an optional callback on completion + */ +GtkWidget *vik_file_entry_new (GtkFileChooserAction action, vf_filter_type filter_type, VikFileEntryFunc cb, gpointer user_data ) +{ + VikFileEntry *vfe = VIK_FILE_ENTRY ( g_object_new ( VIK_FILE_ENTRY_TYPE, NULL ) ); + vfe->entry = gtk_entry_new (); + vfe->button = gtk_button_new_with_label ( _("Browse...") ); + vfe->action = action; + vfe->on_finish = cb; + vfe->user_data = user_data; + g_signal_connect_swapped ( G_OBJECT(vfe->button), "clicked", G_CALLBACK(choose_file), vfe ); + + gtk_box_pack_start ( GTK_BOX(vfe), vfe->entry, TRUE, TRUE, 3 ); + gtk_box_pack_start ( GTK_BOX(vfe), vfe->button, FALSE, FALSE, 3 ); + + vfe->file_selector = NULL; + vfe->filter_type = filter_type; + + return GTK_WIDGET(vfe); +} + +const gchar *vik_file_entry_get_filename ( VikFileEntry *vfe ) +{ + return gtk_entry_get_text ( GTK_ENTRY(vfe->entry) ); +} + +void vik_file_entry_set_filename ( VikFileEntry *vfe, const gchar *filename ) +{ + gtk_entry_set_text ( GTK_ENTRY(vfe->entry), filename ); +} + +void choose_file ( VikFileEntry *vfe ) +{ + if ( ! vfe->file_selector ) + { + GtkWidget *win = gtk_widget_get_toplevel(GTK_WIDGET(vfe)); + g_assert ( win ); + vfe->file_selector = gtk_file_chooser_dialog_new (_("Choose file"), + GTK_WINDOW(win), + vfe->action, /* open file or directory */ + GTK_STOCK_CANCEL, GTK_RESPONSE_CANCEL, + GTK_STOCK_OPEN, GTK_RESPONSE_ACCEPT, + NULL); + gtk_window_set_transient_for ( GTK_WINDOW(vfe->file_selector), GTK_WINDOW(win) ); + gtk_window_set_destroy_with_parent ( GTK_WINDOW(vfe->file_selector), TRUE ); + + switch ( vfe->filter_type ) { + case VF_FILTER_IMAGE: { + GtkFileFilter *filter = gtk_file_filter_new (); + gtk_file_filter_set_name ( filter, _("JPG") ); + gtk_file_filter_add_mime_type ( filter, "image/jpeg"); + gtk_file_chooser_add_filter ( GTK_FILE_CHOOSER(vfe->file_selector), filter ); + + filter = gtk_file_filter_new (); + gtk_file_filter_set_name ( filter, _("PNG") ); + gtk_file_filter_add_mime_type ( filter, "image/png"); + gtk_file_chooser_add_filter ( GTK_FILE_CHOOSER(vfe->file_selector), filter ); + + filter = gtk_file_filter_new (); + gtk_file_filter_set_name ( filter, _("TIFF") ); + gtk_file_filter_add_mime_type ( filter, "image/tiff"); + gtk_file_chooser_add_filter ( GTK_FILE_CHOOSER(vfe->file_selector), filter ); + + break; + } + case VF_FILTER_MBTILES: { + GtkFileFilter *filter = gtk_file_filter_new (); + gtk_file_filter_set_name ( filter, _("MBTiles") ); + gtk_file_filter_add_pattern ( filter, "*.sqlite" ); + gtk_file_filter_add_pattern ( filter, "*.mbtiles" ); + gtk_file_filter_add_pattern ( filter, "*.db3" ); + gtk_file_chooser_add_filter ( GTK_FILE_CHOOSER(vfe->file_selector), filter ); + break; + } + case VF_FILTER_XML: { + GtkFileFilter *filter = gtk_file_filter_new (); + gtk_file_filter_set_name ( filter, _("XML") ); + gtk_file_filter_add_pattern ( filter, "*.xml" ); + gtk_file_chooser_add_filter ( GTK_FILE_CHOOSER(vfe->file_selector), filter ); + break; + } + case VF_FILTER_CARTO: { + GtkFileFilter *filter = gtk_file_filter_new (); + gtk_file_filter_set_name ( filter, _("MML") ); + gtk_file_filter_add_pattern ( filter, "*.mml" ); + gtk_file_chooser_add_filter ( GTK_FILE_CHOOSER(vfe->file_selector), filter ); + + filter = gtk_file_filter_new (); + gtk_file_filter_set_name ( filter, _("MSS") ); + gtk_file_filter_add_pattern ( filter, "*.mss" ); + gtk_file_chooser_add_filter ( GTK_FILE_CHOOSER(vfe->file_selector), filter ); + break; + } + case VF_FILTER_GPX: { + GtkFileFilter *filter = gtk_file_filter_new (); + gtk_file_filter_set_name ( filter, _("GPX") ); + gtk_file_filter_add_pattern ( filter, "*.gpx" ); + gtk_file_chooser_add_filter ( GTK_FILE_CHOOSER(vfe->file_selector), filter ); + break; + } + default: break; + } + if ( vfe->filter_type ) { + // Always have an catch all filter at the end + GtkFileFilter *filter = gtk_file_filter_new (); + gtk_file_filter_set_name( filter, _("All") ); + gtk_file_filter_add_pattern ( filter, "*" ); + gtk_file_chooser_add_filter (GTK_FILE_CHOOSER(vfe->file_selector), filter); + } + } + + while ( gtk_dialog_run ( GTK_DIALOG(vfe->file_selector) ) == GTK_RESPONSE_ACCEPT ) { + gchar *old_entry = g_strdup ( vik_file_entry_get_filename ( vfe ) ); + gtk_entry_set_text ( GTK_ENTRY (vfe->entry), gtk_file_chooser_get_filename ( GTK_FILE_CHOOSER(vfe->file_selector) ) ); + // Ideally this should only be called if the entry has changed, but ATM it's any time OK is selected. + if ( vfe->on_finish ) + if ( vfe->on_finish(vfe, vfe->user_data) ) + break; + else + vik_file_entry_set_filename ( vfe, old_entry ); + else + break; + g_free ( old_entry ); + } + gtk_widget_hide ( vfe->file_selector ); +} diff --git a/src/vikfileentry.h b/src/vikfileentry.h new file mode 100644 index 0000000..c29e1fd --- /dev/null +++ b/src/vikfileentry.h @@ -0,0 +1,66 @@ +/* + * viking -- GPS Data and Topo Analyzer, Explorer, and Manager + * + * Copyright (C) 2003-2005, Evan Battaglia + * + * 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., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA + * + */ + +#ifndef _VIKING_FILEENTRY_H +#define _VIKING_FILEENTRY_H + +#include +#include +#include + +G_BEGIN_DECLS + +#define VIK_FILE_ENTRY_TYPE (vik_file_entry_get_type ()) +#define VIK_FILE_ENTRY(obj) (G_TYPE_CHECK_INSTANCE_CAST ((obj), VIK_FILE_ENTRY_TYPE, VikFileEntry)) +#define VIK_FILE_ENTRY_CLASS(klass) (G_TYPE_CHECK_CLASS_CAST ((klass), VIK_FILE_ENTRY_TYPE, VikFileEntryClass)) +#define IS_VIK_FILE_ENTRY(obj) (G_TYPE_CHECK_INSTANCE_TYPE ((obj), VIK_FILE_ENTRY_TYPE)) +#define IS_VIK_FILE_ENTRY_CLASS(klass) (G_TYPE_CHECK_CLASS_TYPE ((klass), VIK_FILE_ENTRY_TYPE)) + +typedef struct _VikFileEntry VikFileEntry; +typedef struct _VikFileEntryClass VikFileEntryClass; + +struct _VikFileEntryClass +{ + GtkHBoxClass hbox_class; +}; + +GType vik_file_entry_get_type (); + +typedef enum { + VF_FILTER_NONE = 0, + VF_FILTER_IMAGE, // JPG+PNG+TIFF + VF_FILTER_MBTILES, + VF_FILTER_XML, + VF_FILTER_CARTO, // MML + MSS + VF_FILTER_GPX, + VF_FILTER_LAST +} vf_filter_type; + +typedef gboolean (*VikFileEntryFunc) (VikFileEntry *, gpointer); + +GtkWidget *vik_file_entry_new (GtkFileChooserAction action, vf_filter_type filter_type, VikFileEntryFunc cb, gpointer user_data); +const gchar *vik_file_entry_get_filename ( VikFileEntry *vfe ); +void vik_file_entry_set_filename ( VikFileEntry *vfe, const gchar *filename ); +void choose_file ( VikFileEntry *vfe ); + +G_END_DECLS + +#endif diff --git a/src/vikfilelist.c b/src/vikfilelist.c new file mode 100644 index 0000000..1f20c7b --- /dev/null +++ b/src/vikfilelist.c @@ -0,0 +1,231 @@ +/* + * viking -- GPS Data and Topo Analyzer, Explorer, and Manager + * + * Copyright (C) 2003-2005, Evan Battaglia + * Copyright (C) 2011, Rob Norris + * + * 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., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA + * + */ + +#ifdef HAVE_CONFIG_H +#include "config.h" +#endif + +#include +#include + +#include "vikfilelist.h" + +struct _VikFileList { + GtkVBox parent; + GtkWidget *treeview; + GtkWidget *file_selector; + GtkTreeModel *model; + GtkFileFilter *filter; +}; + +static void file_list_add ( VikFileList *vfl ) +{ + GSList *files = NULL; + GSList *fiter = NULL; + + if ( ! vfl->file_selector ) + { + GtkWidget *win = gtk_widget_get_toplevel(GTK_WIDGET(vfl)); + g_assert ( win ); + vfl->file_selector = gtk_file_chooser_dialog_new (_("Choose file(s)"), + GTK_WINDOW(win), + GTK_FILE_CHOOSER_ACTION_OPEN, + GTK_STOCK_CANCEL, GTK_RESPONSE_CANCEL, + GTK_STOCK_OPEN, GTK_RESPONSE_ACCEPT, + NULL); + gtk_file_chooser_set_select_multiple ( GTK_FILE_CHOOSER(vfl->file_selector), TRUE ); + gtk_window_set_transient_for ( GTK_WINDOW(vfl->file_selector), GTK_WINDOW(win) ); + gtk_window_set_destroy_with_parent ( GTK_WINDOW(vfl->file_selector), TRUE ); + + if ( vfl->filter ) + gtk_file_chooser_add_filter ( GTK_FILE_CHOOSER(vfl->file_selector), vfl->filter ); + } + + if ( gtk_dialog_run ( GTK_DIALOG(vfl->file_selector) ) == GTK_RESPONSE_ACCEPT ) { + files = gtk_file_chooser_get_filenames (GTK_FILE_CHOOSER(vfl->file_selector) ); + fiter = files; + GtkTreeIter iter; + while ( fiter ) { + gchar *file_name = fiter->data; + + gtk_list_store_append ( GTK_LIST_STORE(vfl->model), &iter ); + gtk_list_store_set ( GTK_LIST_STORE(vfl->model), &iter, 0, file_name, -1 ); + + g_free (file_name); + + fiter = g_slist_next (fiter); + } + g_slist_free (files); + } + gtk_widget_hide ( vfl->file_selector ); +} + + +static GtkTreeRowReference** file_list_get_selected_refs (GtkTreeModel *model, + GList *list) +{ + GtkTreeRowReference **arr; + GList *iter; + + arr = g_new (GtkTreeRowReference *, g_list_length (list) + 1); + + gint pos = 0; + for (iter = g_list_first (list); iter != NULL; iter = g_list_next (iter)) { + GtkTreePath *path = (GtkTreePath *)(iter->data); + arr[pos] = gtk_tree_row_reference_new (model, path); + pos++; + } + arr[pos] = NULL; + + return arr; +} + +static void file_list_store_delete_refs (GtkTreeModel *model, + GtkTreeRowReference * const *rrefs) +{ + GtkTreePath *path; + GtkTreeIter iter; + + gint rr; + for ( rr = 0; rrefs[rr] != NULL; rr++ ) { + path = gtk_tree_row_reference_get_path (rrefs[rr]); + gtk_tree_model_get_iter (model, &iter, path); + gtk_list_store_remove (GTK_LIST_STORE (model), &iter); + } +} + + +static void file_list_del ( VikFileList *vfl ) +{ + GtkTreeSelection *ts = gtk_tree_view_get_selection (GTK_TREE_VIEW(vfl->treeview)); + GList *list = gtk_tree_selection_get_selected_rows ( ts, &(vfl->model) ); + + // For multi delete need to store references to selected rows + GtkTreeRowReference **rrefs = file_list_get_selected_refs ( vfl->model, list ); + // And then delete each one individually as the path will have changed + file_list_store_delete_refs ( vfl->model, rrefs ); + + // Cleanup + g_list_foreach ( list, (GFunc) gtk_tree_path_free, NULL ); + g_list_free ( list ); + g_free (rrefs); +} + +GType vik_file_list_get_type (void) +{ + static GType vs_type = 0; + + if (!vs_type) + { + static const GTypeInfo vs_info = + { + sizeof (VikFileListClass), + NULL, /* base_init */ + NULL, /* base_finalize */ + NULL, /* class init */ + NULL, /* class_finalize */ + NULL, /* class_data */ + sizeof (VikFileList), + 0, + NULL /* instance init */ + }; + vs_type = g_type_register_static ( GTK_TYPE_VBOX, "VikFileList", &vs_info, 0 ); + } + + return vs_type; +} + +/** + * Support just one filter, as that's all that's needed ATM + * Probably need to use a GList of them if more than one is required + */ +GtkWidget *vik_file_list_new ( const gchar *title, GtkFileFilter *filter ) +{ + GtkWidget *add_btn, *del_btn; + GtkWidget *hbox, *scrolledwindow; + VikFileList *vfl = VIK_FILE_LIST ( g_object_new ( VIK_FILE_LIST_TYPE, NULL ) ); + + vfl->filter = filter; + + GtkTreeViewColumn *column; + + vfl->model = GTK_TREE_MODEL ( gtk_list_store_new(1, G_TYPE_STRING) ); + + vfl->treeview = gtk_tree_view_new ( ); + gtk_tree_view_set_model ( GTK_TREE_VIEW(vfl->treeview), vfl->model ); + column = gtk_tree_view_column_new_with_attributes ( title, gtk_cell_renderer_text_new (), "text", 0, NULL); + gtk_tree_view_append_column (GTK_TREE_VIEW (vfl->treeview), column); + + gtk_tree_selection_set_mode ( gtk_tree_view_get_selection (GTK_TREE_VIEW(vfl->treeview)), GTK_SELECTION_MULTIPLE ); + + gtk_widget_set_size_request ( vfl->treeview, -1, -1); + + add_btn = gtk_button_new_with_label(_("Add...")); + del_btn = gtk_button_new_with_label(_("Delete")); + + g_signal_connect_swapped ( G_OBJECT(add_btn), "clicked", G_CALLBACK(file_list_add), vfl ); + g_signal_connect_swapped ( G_OBJECT(del_btn), "clicked", G_CALLBACK(file_list_del), vfl ); + + hbox = gtk_hbox_new(FALSE, 2); + + scrolledwindow = gtk_scrolled_window_new ( NULL, NULL ); + gtk_scrolled_window_set_policy ( GTK_SCROLLED_WINDOW(scrolledwindow), GTK_POLICY_AUTOMATIC, GTK_POLICY_AUTOMATIC ); + gtk_container_add ( GTK_CONTAINER(scrolledwindow), GTK_WIDGET(vfl->treeview) ); + + gtk_box_pack_start ( GTK_BOX(vfl), scrolledwindow, TRUE, TRUE, 3 ); + + + gtk_box_pack_start ( GTK_BOX(hbox), add_btn, TRUE, TRUE, 3 ); + gtk_box_pack_start ( GTK_BOX(hbox), del_btn, TRUE, TRUE, 3 ); + gtk_box_pack_start ( GTK_BOX(vfl), hbox, FALSE, FALSE, 3 ); + gtk_widget_show_all(GTK_WIDGET(vfl)); + + vfl->file_selector = NULL; + + return GTK_WIDGET(vfl); +} + +static gboolean get_file_name(GtkTreeModel *model, GtkTreePath *path, GtkTreeIter *iter, GList **list) +{ + gchar *str; + gtk_tree_model_get ( model, iter, 0, &str, -1 ); + g_debug ("%s: %s", __FUNCTION__, str); + (*list) = g_list_append((*list), str); // NB str is already a copy + return FALSE; +} + +GList *vik_file_list_get_files ( VikFileList *vfl ) +{ + GList *list = NULL; + gtk_tree_model_foreach (vfl->model, (GtkTreeModelForeachFunc) get_file_name, &list); + return list; +} + +void vik_file_list_set_files ( VikFileList *vfl, GList *files ) +{ + while (files) { + GtkTreeIter iter; + gtk_list_store_append ( GTK_LIST_STORE(vfl->model), &iter ); + gtk_list_store_set ( GTK_LIST_STORE(vfl->model), &iter, 0, files->data, -1 ); + files = files->next; + } +} diff --git a/src/vikfilelist.h b/src/vikfilelist.h new file mode 100644 index 0000000..faa9869 --- /dev/null +++ b/src/vikfilelist.h @@ -0,0 +1,54 @@ +/* + * viking -- GPS Data and Topo Analyzer, Explorer, and Manager + * + * Copyright (C) 2003-2005, Evan Battaglia + * + * 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., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA + * + */ + +#ifndef _VIKING_FILELIST_H +#define _VIKING_FILELIST_H + +#include +#include +#include + +G_BEGIN_DECLS + +#define VIK_FILE_LIST_TYPE (vik_file_list_get_type ()) +#define VIK_FILE_LIST(obj) (G_TYPE_CHECK_INSTANCE_CAST ((obj), VIK_FILE_LIST_TYPE, VikFileList)) +#define VIK_FILE_LIST_CLASS(klass) (G_TYPE_CHECK_CLASS_CAST ((klass), VIK_FILE_LIST_TYPE, VikFileListClass)) +#define IS_VIK_FILE_LIST(obj) (G_TYPE_CHECK_INSTANCE_TYPE ((obj), VIK_FILE_LIST_TYPE)) +#define IS_VIK_FILE_LIST_CLASS(klass) (G_TYPE_CHECK_CLASS_TYPE ((klass), VIK_FILE_LIST_TYPE)) + +typedef struct _VikFileList VikFileList; +typedef struct _VikFileListClass VikFileListClass; + +struct _VikFileListClass +{ + GtkVBoxClass vbox_class; +}; + +GType vik_file_list_get_type (); + +GtkWidget *vik_file_list_new ( const gchar *title, GtkFileFilter *filter ); +/* result must be freed */ +GList *vik_file_list_get_files ( VikFileList *vfl ); +void vik_file_list_set_files ( VikFileList *vfl, GList * ); + +G_END_DECLS + +#endif diff --git a/src/vikgeoreflayer.c b/src/vikgeoreflayer.c new file mode 100644 index 0000000..9c50f01 --- /dev/null +++ b/src/vikgeoreflayer.c @@ -0,0 +1,1207 @@ +/* + * viking -- GPS Data and Topo Analyzer, Explorer, and Manager + * + * Copyright (C) 2003-2005, Evan Battaglia + * Copyright (c) 2014, Rob Norris + * + * 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., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA + * + */ + +#ifdef HAVE_CONFIG_H +#include "config.h" +#endif + +#include "viking.h" +#include +#include +#include +#include +#include +#include +#include + +#include "ui_util.h" +#include "preferences.h" +#include "icons/icons.h" +#include "vikmapslayer.h" + +/* +static VikLayerParamData image_default ( void ) +{ + VikLayerParamData data; + data.s = g_strdup (""); + return data; +} +*/ + +VikLayerParam georef_layer_params[] = { + { VIK_LAYER_GEOREF, "image", VIK_LAYER_PARAM_STRING, VIK_LAYER_NOT_IN_PROPERTIES, NULL, 0, NULL, NULL, NULL, NULL, NULL, NULL }, + { VIK_LAYER_GEOREF, "corner_easting", VIK_LAYER_PARAM_DOUBLE, VIK_LAYER_NOT_IN_PROPERTIES, NULL, 0, NULL, NULL, NULL, NULL, NULL, NULL }, + { VIK_LAYER_GEOREF, "corner_northing", VIK_LAYER_PARAM_DOUBLE, VIK_LAYER_NOT_IN_PROPERTIES, NULL, 0, NULL, NULL, NULL, NULL, NULL, NULL }, + { VIK_LAYER_GEOREF, "mpp_easting", VIK_LAYER_PARAM_DOUBLE, VIK_LAYER_NOT_IN_PROPERTIES, NULL, 0, NULL, NULL, NULL, NULL, NULL, NULL }, + { VIK_LAYER_GEOREF, "mpp_northing", VIK_LAYER_PARAM_DOUBLE, VIK_LAYER_NOT_IN_PROPERTIES, NULL, 0, NULL, NULL, NULL, NULL, NULL, NULL }, + { VIK_LAYER_GEOREF, "corner_zone", VIK_LAYER_PARAM_UINT, VIK_LAYER_NOT_IN_PROPERTIES, NULL, 0, NULL, NULL, NULL, NULL, NULL, NULL }, + { VIK_LAYER_GEOREF, "corner_letter_as_int", VIK_LAYER_PARAM_UINT, VIK_LAYER_NOT_IN_PROPERTIES, NULL, 0, NULL, NULL, NULL, NULL, NULL, NULL }, + { VIK_LAYER_GEOREF, "alpha", VIK_LAYER_PARAM_UINT, VIK_LAYER_NOT_IN_PROPERTIES, NULL, 0, NULL, NULL, NULL, NULL, NULL, NULL }, +}; + +enum { + PARAM_IMAGE = 0, + PARAM_CE, + PARAM_CN, + PARAM_ME, + PARAM_MN, + PARAM_CZ, + PARAM_CL, + PARAM_AA, + NUM_PARAMS }; + +static const gchar* georef_layer_tooltip ( VikGeorefLayer *vgl ); +static void georef_layer_marshall( VikGeorefLayer *vgl, guint8 **data, guint *len ); +static VikGeorefLayer *georef_layer_unmarshall( guint8 *data, guint len, VikViewport *vvp ); +static gboolean georef_layer_set_param ( VikGeorefLayer *vgl, VikLayerSetParam *vlsp ); +static VikLayerParamData georef_layer_get_param ( VikGeorefLayer *vgl, guint16 id, gboolean is_file_operation ); +static VikGeorefLayer *georef_layer_new ( VikViewport *vvp ); +static VikGeorefLayer *georef_layer_create ( VikViewport *vp ); +static void georef_layer_free ( VikGeorefLayer *vgl ); +static gboolean georef_layer_properties ( VikGeorefLayer *vgl, gpointer vp, gboolean have_apply ); +static void georef_layer_draw ( VikGeorefLayer *vgl, VikViewport *vp ); +static void georef_layer_add_menu_items ( VikGeorefLayer *vgl, GtkMenu *menu, gpointer vlp ); +static void georef_layer_set_image ( VikGeorefLayer *vgl, const gchar *image ); +static gboolean georef_layer_dialog ( VikGeorefLayer *vgl, gpointer vp, GtkWindow *w, gboolean have_apply_button ); +static void georef_layer_load_image ( VikGeorefLayer *vgl, VikViewport *vp, gboolean from_file ); + +/* tools */ +static gpointer georef_layer_move_create ( VikWindow *vw, VikViewport *vvp); +static gboolean georef_layer_move_release ( VikGeorefLayer *vgl, GdkEventButton *event, VikViewport *vvp ); +static gboolean georef_layer_move_press ( VikGeorefLayer *vgl, GdkEventButton *event, VikViewport *vvp ); +static gpointer georef_layer_zoom_create ( VikWindow *vw, VikViewport *vvp); +static gboolean georef_layer_zoom_press ( VikGeorefLayer *vgl, GdkEventButton *event, VikViewport *vvp ); + +// See comment in viktrwlayer.c for advice on values used +static VikToolInterface georef_tools[] = { + { &geomove_18_pixbuf, + { "GeorefMoveMap", "vik-icon-Georef Move Map", N_("_Georef Move Map"), NULL, N_("Georef Move Map"), 0 }, + (VikToolConstructorFunc) georef_layer_move_create, NULL, NULL, NULL, + (VikToolMouseFunc) georef_layer_move_press, NULL, (VikToolMouseFunc) georef_layer_move_release, + (VikToolKeyFunc) NULL, + (VikToolKeyFunc) NULL, + FALSE, + GDK_CURSOR_IS_PIXMAP, &cursor_geomove_pixbuf, NULL }, + + { &geozoom_18_pixbuf, + { "GeorefZoomTool", "vik-icon-Georef Zoom Tool", N_("Georef Z_oom Tool"), NULL, N_("Georef Zoom Tool"), 0 }, + (VikToolConstructorFunc) georef_layer_zoom_create, NULL, NULL, NULL, + (VikToolMouseFunc) georef_layer_zoom_press, NULL, NULL, + (VikToolKeyFunc) NULL, + (VikToolKeyFunc) NULL, + FALSE, + GDK_CURSOR_IS_PIXMAP, &cursor_geozoom_pixbuf, NULL }, +}; + +VikLayerInterface vik_georef_layer_interface = { + "GeoRef Map", + N_("GeoRef Map"), + NULL, + &vikgeoreflayer_pixbuf, /*icon */ + + georef_tools, + sizeof(georef_tools) / sizeof(VikToolInterface), + + georef_layer_params, + NUM_PARAMS, + NULL, + 0, + + VIK_MENU_ITEM_ALL, + + (VikLayerFuncCreate) georef_layer_create, + (VikLayerFuncRealize) NULL, + (VikLayerFuncPostRead) georef_layer_load_image, + (VikLayerFuncFree) georef_layer_free, + + (VikLayerFuncProperties) georef_layer_properties, + (VikLayerFuncDraw) georef_layer_draw, + (VikLayerFuncChangeCoordMode) NULL, + + (VikLayerFuncGetTimestamp) NULL, + + (VikLayerFuncSetMenuItemsSelection) NULL, + (VikLayerFuncGetMenuItemsSelection) NULL, + + (VikLayerFuncAddMenuItems) georef_layer_add_menu_items, + (VikLayerFuncSublayerAddMenuItems) NULL, + + (VikLayerFuncSublayerRenameRequest) NULL, + (VikLayerFuncSublayerToggleVisible) NULL, + (VikLayerFuncSublayerTooltip) NULL, + (VikLayerFuncLayerTooltip) georef_layer_tooltip, + (VikLayerFuncLayerSelected) NULL, + + (VikLayerFuncMarshall) georef_layer_marshall, + (VikLayerFuncUnmarshall) georef_layer_unmarshall, + + (VikLayerFuncSetParam) georef_layer_set_param, + (VikLayerFuncGetParam) georef_layer_get_param, + (VikLayerFuncChangeParam) NULL, + + (VikLayerFuncReadFileData) NULL, + (VikLayerFuncWriteFileData) NULL, + + (VikLayerFuncDeleteItem) NULL, + (VikLayerFuncCutItem) NULL, + (VikLayerFuncCopyItem) NULL, + (VikLayerFuncPasteItem) NULL, + (VikLayerFuncFreeCopiedItem) NULL, + (VikLayerFuncDragDropRequest) NULL, + + (VikLayerFuncSelectClick) NULL, + (VikLayerFuncSelectMove) NULL, + (VikLayerFuncSelectRelease) NULL, + (VikLayerFuncSelectedViewportMenu) NULL, +}; + +typedef struct { + GtkWidget *x_spin; + GtkWidget *y_spin; + // UTM widgets + GtkWidget *ce_spin; // top left + GtkWidget *cn_spin; // " + GtkWidget *utm_zone_spin; + GtkWidget *utm_letter_entry; + + GtkWidget *lat_tl_spin; + GtkWidget *lon_tl_spin; + GtkWidget *lat_br_spin; + GtkWidget *lon_br_spin; + // + GtkWidget *tabs; + GtkWidget *imageentry; +} changeable_widgets; + +struct _VikGeorefLayer { + VikLayer vl; + gchar *image; + GdkPixbuf *pixbuf; + guint8 alpha; + + struct UTM corner; // Top Left + gdouble mpp_easting, mpp_northing; + struct LatLon ll_br; // Bottom Right + guint width, height; + + GdkPixbuf *scaled; + guint32 scaled_width, scaled_height; + + gint click_x, click_y; + changeable_widgets cw; +}; + +static VikLayerParam io_prefs[] = { + { VIK_LAYER_NUM_TYPES, VIKING_PREFERENCES_IO_NAMESPACE "georef_auto_read_world_file", VIK_LAYER_PARAM_BOOLEAN, VIK_LAYER_GROUP_NONE, N_("Auto Read World Files:"), VIK_LAYER_WIDGET_CHECKBUTTON, NULL, NULL, + N_("Automatically attempt to read associated world file of a new image for a GeoRef layer"), NULL, NULL, NULL} +}; + +void vik_georef_layer_init (void) +{ + VikLayerParamData tmp; + tmp.b = TRUE; + a_preferences_register(&io_prefs[0], tmp, VIKING_PREFERENCES_IO_GROUP_KEY); +} + +GType vik_georef_layer_get_type () +{ + static GType vgl_type = 0; + + if (!vgl_type) + { + static const GTypeInfo vgl_info = + { + sizeof (VikGeorefLayerClass), + NULL, /* base_init */ + NULL, /* base_finalize */ + NULL, /* class init */ + NULL, /* class_finalize */ + NULL, /* class_data */ + sizeof (VikGeorefLayer), + 0, + NULL /* instance init */ + }; + vgl_type = g_type_register_static ( VIK_LAYER_TYPE, "VikGeorefLayer", &vgl_info, 0 ); + } + + return vgl_type; +} + +static const gchar* georef_layer_tooltip ( VikGeorefLayer *vgl ) +{ + return vgl->image; +} + +static void georef_layer_marshall( VikGeorefLayer *vgl, guint8 **data, guint *len ) +{ + vik_layer_marshall_params ( VIK_LAYER(vgl), data, len ); +} + +static VikGeorefLayer *georef_layer_unmarshall( guint8 *data, guint len, VikViewport *vvp ) +{ + VikGeorefLayer *rv = georef_layer_new ( vvp ); + vik_layer_unmarshall_params ( VIK_LAYER(rv), data, len, vvp ); + if (rv->image) { + georef_layer_load_image ( rv, vvp, TRUE ); + } + return rv; +} + +static gboolean georef_layer_set_param ( VikGeorefLayer *vgl, VikLayerSetParam *vlsp ) +{ + switch ( vlsp->id ) + { + case PARAM_IMAGE: georef_layer_set_image ( vgl, vlsp->data.s ); break; + case PARAM_CN: vgl->corner.northing = vlsp->data.d; break; + case PARAM_CE: vgl->corner.easting = vlsp->data.d; break; + case PARAM_MN: vgl->mpp_northing = vlsp->data.d; break; + case PARAM_ME: vgl->mpp_easting = vlsp->data.d; break; + case PARAM_CZ: if ( vlsp->data.u <= 60 ) vgl->corner.zone = vlsp->data.u; break; + case PARAM_CL: if ( vlsp->data.u >= 65 || vlsp->data.u <= 90 ) vgl->corner.letter = vlsp->data.u; break; + case PARAM_AA: if ( vlsp->data.u <= 255 ) vgl->alpha = vlsp->data.u; break; + default: break; + } + return TRUE; +} + +static void create_image_file ( VikGeorefLayer *vgl ) +{ + // Create in .viking-maps + gchar *filename = g_strconcat ( maps_layer_default_dir(), vik_layer_get_name(VIK_LAYER(vgl)), ".jpg", NULL ); + GError *error = NULL; + gdk_pixbuf_save ( vgl->pixbuf, filename, "jpeg", &error, NULL ); + if ( error ) { + g_warning ( "%s", error->message ); + g_error_free ( error ); + } + else + vgl->image = g_strdup ( filename ); + + g_free ( filename ); +} + +static VikLayerParamData georef_layer_get_param ( VikGeorefLayer *vgl, guint16 id, gboolean is_file_operation ) +{ + VikLayerParamData rv; + switch ( id ) + { + case PARAM_IMAGE: { + gboolean set = FALSE; + if ( is_file_operation ) { + if ( vgl->pixbuf && !vgl->image ) { + // Force creation of image file + create_image_file ( vgl ); + } + if ( a_vik_get_file_ref_format() == VIK_FILE_REF_FORMAT_RELATIVE ) { + gchar *cwd = g_get_current_dir(); + if ( cwd ) { + rv.s = file_GetRelativeFilename ( cwd, vgl->image ); + if ( !rv.s ) rv.s = ""; + set = TRUE; + } + } + } + if ( !set ) + rv.s = vgl->image ? vgl->image : ""; + break; + } + case PARAM_CN: rv.d = vgl->corner.northing; break; + case PARAM_CE: rv.d = vgl->corner.easting; break; + case PARAM_MN: rv.d = vgl->mpp_northing; break; + case PARAM_ME: rv.d = vgl->mpp_easting; break; + case PARAM_CZ: rv.u = vgl->corner.zone; break; + case PARAM_CL: rv.u = vgl->corner.letter; break; + case PARAM_AA: rv.u = vgl->alpha; break; + default: break; + } + return rv; +} + +static VikGeorefLayer *georef_layer_new ( VikViewport *vvp ) +{ + VikGeorefLayer *vgl = VIK_GEOREF_LAYER ( g_object_new ( VIK_GEOREF_LAYER_TYPE, NULL ) ); + vik_layer_set_type ( VIK_LAYER(vgl), VIK_LAYER_GEOREF ); + + // Since GeoRef layer doesn't use uibuilder + // initializing this way won't do anything yet.. + vik_layer_set_defaults ( VIK_LAYER(vgl), vvp ); + + // Make these defaults based on the current view + vgl->mpp_northing = vik_viewport_get_ympp ( vvp ); + vgl->mpp_easting = vik_viewport_get_xmpp ( vvp ); + vik_coord_to_utm ( vik_viewport_get_center ( vvp ), &(vgl->corner) ); + + vgl->image = NULL; + vgl->pixbuf = NULL; + vgl->click_x = -1; + vgl->click_y = -1; + vgl->scaled = NULL; + vgl->scaled_width = 0; + vgl->scaled_height = 0; + vgl->ll_br.lat = 0.0; + vgl->ll_br.lon = 0.0; + vgl->alpha = 255; + return vgl; +} + +/** + * Return mpp for the given coords, coord mode and image size. + */ +static void georef_layer_mpp_from_coords ( VikCoordMode mode, struct LatLon ll_tl, struct LatLon ll_br, guint width, guint height, gdouble *xmpp, gdouble *ympp ) +{ + struct LatLon ll_tr; + ll_tr.lat = ll_tl.lat; + ll_tr.lon = ll_br.lon; + + struct LatLon ll_bl; + ll_bl.lat = ll_br.lat; + ll_bl.lon = ll_tl.lon; + + gdouble diffx; + // UTM mode should be exact MPP + gdouble factor = 1.0; + if ( mode == VIK_COORD_LATLON ) { + // NB the 1.193 - is at the Equator. + // http://wiki.openstreetmap.org/wiki/Zoom_levels + + // Convert from actual image MPP to Viking 'pixelfact' + gdouble mid_lat = (ll_bl.lat + ll_tr.lat ) / 2.0; + // Protect against div by zero (but shouldn't have 90 degrees for mid latitude...) + if ( fabs(mid_lat) < 89.9 ) + factor = cos(DEG2RAD(mid_lat)) * 1.193; + + // Work out the xmpp in a relationship to the centre of the coords + // Consider an area with a large difference in latitude, it will have differing factors + // Thus an average factor at the centre will have less distortion. + struct LatLon ll_ml; + ll_ml.lat = mid_lat; + ll_ml.lon = ll_tl.lon; + + struct LatLon ll_mr; + ll_mr.lat = mid_lat; + ll_mr.lon = ll_tr.lon; + + diffx = a_coords_latlon_diff ( &ll_ml, &ll_mr ); + } else { + diffx = a_coords_latlon_diff ( &ll_tl, &ll_tr ); + } + + *xmpp = (diffx / width) / factor; + + gdouble diffy = a_coords_latlon_diff ( &ll_tl, &ll_bl ); + *ympp = (diffy / height) / factor; +} + +static void georef_layer_draw ( VikGeorefLayer *vgl, VikViewport *vp ) +{ + if ( vgl->pixbuf ) + { + gdouble xmpp = vik_viewport_get_xmpp(vp), ympp = vik_viewport_get_ympp(vp); + GdkPixbuf *pixbuf = vgl->pixbuf; + guint layer_width = vgl->width; + guint layer_height = vgl->height; + + guint width = vik_viewport_get_width(vp), height = vik_viewport_get_height(vp); + gint32 x, y; + VikCoord corner_coord; + vik_coord_load_from_utm ( &corner_coord, vik_viewport_get_coord_mode(vp), &(vgl->corner) ); + vik_viewport_coord_to_screen ( vp, &corner_coord, &x, &y ); + + /* mark to scale the pixbuf if it doesn't match our dimensions */ + gboolean scale = FALSE; + if ( xmpp != vgl->mpp_easting || ympp != vgl->mpp_northing ) + { + scale = TRUE; + layer_width = round(vgl->width * vgl->mpp_easting / xmpp); + layer_height = round(vgl->height * vgl->mpp_northing / ympp); + + // Has the scaling worked? + if ( layer_width == 0 || layer_height == 0 ) + return; + } + + // If image not in viewport bounds - no need to draw it (or bother with any scaling) + if ( (x < 0 || x < width) && (y < 0 || y < height) && x+layer_width > 0 && y+layer_height > 0 ) { + + if ( scale ) + { + /* rescale if necessary */ + if (layer_width == vgl->scaled_width && layer_height == vgl->scaled_height && vgl->scaled != NULL) + pixbuf = vgl->scaled; + else + { + pixbuf = gdk_pixbuf_scale_simple( + vgl->pixbuf, + layer_width, + layer_height, + GDK_INTERP_BILINEAR + ); + + if (vgl->scaled != NULL) + g_object_unref(vgl->scaled); + + vgl->scaled = pixbuf; + vgl->scaled_width = layer_width; + vgl->scaled_height = layer_height; + } + } + vik_viewport_draw_pixbuf ( vp, pixbuf, 0, 0, x, y, layer_width, layer_height ); /* todo: draw only what we need to. */ + } + } +} + +static void georef_layer_free ( VikGeorefLayer *vgl ) +{ + if ( vgl->image ) + g_free ( vgl->image ); + if ( vgl->scaled ) + g_object_unref ( vgl->scaled ); + if ( vgl->pixbuf ) + g_object_unref ( vgl->pixbuf ); +} + +static VikGeorefLayer *georef_layer_create ( VikViewport *vp ) +{ + return georef_layer_new ( vp ); +} + +static gboolean georef_layer_properties ( VikGeorefLayer *vgl, gpointer vp, gboolean have_apply ) +{ + return georef_layer_dialog ( vgl, vp, VIK_GTK_WINDOW_FROM_WIDGET(vp), have_apply ); +} + +static void georef_layer_load_image ( VikGeorefLayer *vgl, VikViewport *vp, gboolean from_file ) +{ + GError *gx = NULL; + if ( vgl->image == NULL ) + return; + + if ( vgl->pixbuf ) + g_object_unref ( G_OBJECT(vgl->pixbuf) ); + if ( vgl->scaled ) + { + g_object_unref ( G_OBJECT(vgl->scaled) ); + vgl->scaled = NULL; + } + + vgl->pixbuf = gdk_pixbuf_new_from_file ( vgl->image, &gx ); + + if (gx) + { + if ( !from_file ) + a_dialog_error_msg_extra ( VIK_GTK_WINDOW_FROM_WIDGET(vp), _("Couldn't open image file: %s"), gx->message ); + g_error_free ( gx ); + } + else + { + vgl->width = gdk_pixbuf_get_width ( vgl->pixbuf ); + vgl->height = gdk_pixbuf_get_height ( vgl->pixbuf ); + + if ( vgl->pixbuf && vgl->alpha <= 255 ) + vgl->pixbuf = ui_pixbuf_set_alpha ( vgl->pixbuf, vgl->alpha ); + } + /* should find length and width here too */ +} + +static void georef_layer_set_image ( VikGeorefLayer *vgl, const gchar *image ) +{ + if ( vgl->image ) + g_free ( vgl->image ); + if ( vgl->scaled ) + { + g_object_unref ( vgl->scaled ); + vgl->scaled = NULL; + } + if ( image == NULL ) + vgl->image = NULL; + + if ( g_strcmp0 (image, "") != 0 ) + vgl->image = vu_get_canonical_filename ( VIK_LAYER(vgl), image ); + else + vgl->image = g_strdup (image); +} + +// Only positive values allowed here +static void gdouble2spinwidget ( GtkWidget *widget, gdouble val ) +{ + gtk_spin_button_set_value ( GTK_SPIN_BUTTON(widget), val > 0 ? val : -val ); +} + +static void set_widget_values ( changeable_widgets *cw, gdouble values[4] ) +{ + gdouble2spinwidget ( cw->x_spin, values[0] ); + gdouble2spinwidget ( cw->y_spin, values[1] ); + gdouble2spinwidget ( cw->ce_spin, values[2] ); + gdouble2spinwidget ( cw->cn_spin, values[3] ); +} + +static gboolean world_file_read_line ( FILE *ff, gdouble *value, gboolean use_value ) +{ + gboolean answer = TRUE; // Success + gchar buffer[1024]; + if ( !fgets ( buffer, 1024, ff ) ) { + answer = FALSE; + } + if ( answer && use_value ) + *value = g_strtod ( buffer, NULL ); + + return answer; +} + +/** + * http://en.wikipedia.org/wiki/World_file + * + * Note world files do not define the units and nor are the units standardized :( + * Currently Viking only supports: + * x&y scale as meters per pixel + * x&y coords as UTM eastings and northings respectively + */ +static gint world_file_read_file ( const gchar* filename, gdouble values[4] ) +{ + g_debug ("%s - trying world file %s", __FUNCTION__, filename); + + FILE *f = g_fopen ( filename, "r" ); + if ( !f ) + return 1; + else { + gint answer = 2; // Not enough info read yet + // **We do not handle 'skew' values ATM - normally they are a value of 0 anyway to align with the UTM grid + if ( world_file_read_line ( f, &values[0], TRUE ) // x scale + && world_file_read_line ( f, NULL, FALSE ) // Ignore value in y-skew line** + && world_file_read_line ( f, NULL, FALSE ) // Ignore value in x-skew line** + && world_file_read_line ( f, &values[1], TRUE ) // y scale + && world_file_read_line ( f, &values[2], TRUE ) // x-coordinate of the upper left pixel + && world_file_read_line ( f, &values[3], TRUE ) // y-coordinate of the upper left pixel + ) + { + // Success + g_debug ("%s - %s - world file read success", __FUNCTION__, filename); + answer = 0; + } + fclose ( f ); + return answer; + } +} + +static void georef_layer_dialog_load ( changeable_widgets *cw ) +{ + GtkWidget *file_selector = gtk_file_chooser_dialog_new (_("Choose World file"), + NULL, + GTK_FILE_CHOOSER_ACTION_OPEN, + GTK_STOCK_CANCEL, GTK_RESPONSE_CANCEL, + GTK_STOCK_OPEN, GTK_RESPONSE_ACCEPT, + NULL); + + if ( gtk_dialog_run ( GTK_DIALOG ( file_selector ) ) == GTK_RESPONSE_ACCEPT ) + { + gdouble values[4]; + gint answer = world_file_read_file ( gtk_file_chooser_get_filename(GTK_FILE_CHOOSER(file_selector)), values ); + if ( answer == 1 ) + a_dialog_error_msg ( VIK_GTK_WINDOW_FROM_WIDGET(cw->x_spin), _("The World file you requested could not be opened for reading.") ); + else if ( answer == 2 ) + a_dialog_error_msg ( VIK_GTK_WINDOW_FROM_WIDGET(cw->x_spin), _("Unexpected end of file reading World file.") ); + else + // NB answer should == 0 for success + set_widget_values ( cw, values ); + } + + gtk_widget_destroy ( file_selector ); +} + +static void georef_layer_export_params ( gpointer *pass_along[2] ) +{ + VikGeorefLayer *vgl = VIK_GEOREF_LAYER(pass_along[0]); + GtkWidget *file_selector = gtk_file_chooser_dialog_new (_("Choose World file"), + NULL, + GTK_FILE_CHOOSER_ACTION_SAVE, + GTK_STOCK_CANCEL, GTK_RESPONSE_CANCEL, + GTK_STOCK_OPEN, GTK_RESPONSE_ACCEPT, + NULL); + if ( gtk_dialog_run ( GTK_DIALOG ( file_selector ) ) == GTK_RESPONSE_ACCEPT ) + { + FILE *f = g_fopen ( gtk_file_chooser_get_filename ( GTK_FILE_CHOOSER(file_selector) ), "w" ); + + gtk_widget_destroy ( file_selector ); + if ( !f ) + { + a_dialog_error_msg ( VIK_GTK_WINDOW_FROM_WIDGET(pass_along[0]), _("The file you requested could not be opened for writing.") ); + return; + } + else + { + fprintf ( f, "%f\n%f\n%f\n%f\n%f\n%f\n", vgl->mpp_easting, 0.0, 0.0, vgl->mpp_northing, vgl->corner.easting, vgl->corner.northing ); + fclose ( f ); + f = NULL; + } + } + else + gtk_widget_destroy ( file_selector ); +} + +/** + * Auto attempt to read the world file associated with the image used for the georef + * Based on simple file name conventions + * Only attempted if the preference is on. + */ +static gboolean maybe_read_world_file ( VikFileEntry *vfe, gpointer user_data ) +{ + if ( a_preferences_get (VIKING_PREFERENCES_IO_NAMESPACE "georef_auto_read_world_file")->b ) { + const gchar* filename = vik_file_entry_get_filename(VIK_FILE_ENTRY(vfe)); + gdouble values[4]; + if ( filename && user_data ) { + + changeable_widgets *cw = user_data; + + gboolean upper = g_ascii_isupper (filename[strlen(filename)-1]); + gchar* filew = g_strconcat ( filename, (upper ? "W" : "w") , NULL ); + + if ( world_file_read_file ( filew, values ) == 0 ) { + set_widget_values ( cw, values ); + } + else { + if ( strlen(filename) > 3 ) { + gchar* file0 = g_strndup ( filename, strlen(filename)-2 ); + gchar* file1 = g_strdup_printf ( "%s%c%c", file0, filename[strlen(filename)-1], (upper ? 'W' : 'w') ); + if ( world_file_read_file ( file1, values ) == 0 ) { + set_widget_values ( cw, values ); + } + g_free ( file1 ); + g_free ( file0 ); + } + } + g_free ( filew ); + } + } + return TRUE; +} + +static struct LatLon get_ll_tl (VikGeorefLayer *vgl) +{ + struct LatLon ll_tl; + ll_tl.lat = gtk_spin_button_get_value ( GTK_SPIN_BUTTON(vgl->cw.lat_tl_spin) ); + ll_tl.lon = gtk_spin_button_get_value ( GTK_SPIN_BUTTON(vgl->cw.lon_tl_spin) ); + return ll_tl; +} + +static struct LatLon get_ll_br (VikGeorefLayer *vgl) +{ + struct LatLon ll_br; + ll_br.lat = gtk_spin_button_get_value ( GTK_SPIN_BUTTON(vgl->cw.lat_br_spin) ); + ll_br.lon = gtk_spin_button_get_value ( GTK_SPIN_BUTTON(vgl->cw.lon_br_spin) ); + return ll_br; +} + +// Align displayed UTM values with displayed Lat/Lon values +static void align_utm2ll (VikGeorefLayer *vgl) +{ + struct LatLon ll_tl = get_ll_tl (vgl); + + struct UTM utm; + a_coords_latlon_to_utm ( &ll_tl, &utm ); + gtk_spin_button_set_value ( GTK_SPIN_BUTTON(vgl->cw.ce_spin), utm.easting ); + gtk_spin_button_set_value ( GTK_SPIN_BUTTON(vgl->cw.cn_spin), utm.northing ); + + gchar tmp_letter[2]; + tmp_letter[0] = utm.letter; + tmp_letter[1] = '\0'; + gtk_entry_set_text ( GTK_ENTRY(vgl->cw.utm_letter_entry), tmp_letter ); + + gtk_spin_button_set_value ( GTK_SPIN_BUTTON(vgl->cw.utm_zone_spin), utm.zone ); +} + +// Align displayed Lat/Lon values with displayed UTM values +static void align_ll2utm (VikGeorefLayer *vgl) +{ + struct UTM corner; + const gchar *letter = gtk_entry_get_text ( GTK_ENTRY(vgl->cw.utm_letter_entry) ); + if (*letter) + corner.letter = toupper(*letter); + corner.zone = gtk_spin_button_get_value_as_int ( GTK_SPIN_BUTTON(vgl->cw.utm_zone_spin) ); + corner.easting = gtk_spin_button_get_value ( GTK_SPIN_BUTTON(vgl->cw.ce_spin) ); + corner.northing = gtk_spin_button_get_value ( GTK_SPIN_BUTTON(vgl->cw.cn_spin) ); + + struct LatLon ll; + a_coords_utm_to_latlon ( &corner, &ll ); + gtk_spin_button_set_value ( GTK_SPIN_BUTTON(vgl->cw.lat_tl_spin), ll.lat ); + gtk_spin_button_set_value ( GTK_SPIN_BUTTON(vgl->cw.lon_tl_spin), ll.lon ); +} + +/** + * Align coordinates between tabs as the user may have changed the values + * Use this before acting on the user input + * This is easier then trying to use the 'value-changed' signal for each individual coordinate + * especiallly since it tends to end up in an infinite loop continually updating each other. + */ +static void align_coords ( VikGeorefLayer *vgl ) +{ + if (gtk_notebook_get_current_page(GTK_NOTEBOOK(vgl->cw.tabs)) == 0) + align_ll2utm ( vgl ); + else + align_utm2ll ( vgl ); +} + +static void switch_tab (GtkNotebook *notebook, gpointer tab, guint tab_num, gpointer user_data) +{ + VikGeorefLayer *vgl = user_data; + if ( tab_num == 0 ) + align_utm2ll (vgl); + else + align_ll2utm (vgl); +} + +/** + * + */ +static void check_br_is_good_or_msg_user ( VikGeorefLayer *vgl ) +{ + // if a 'blank' ll value that's alright + if ( vgl->ll_br.lat == 0.0 && vgl->ll_br.lon == 0.0 ) + return; + + struct LatLon ll_tl = get_ll_tl (vgl); + if ( ll_tl.lat < vgl->ll_br.lat || ll_tl.lon > vgl->ll_br.lon ) + a_dialog_warning_msg ( VIK_GTK_WINDOW_FROM_LAYER(vgl), _("Lower right corner values may not be consistent with upper right values") ); +} + +/** + * + */ +static void calculate_mpp_from_coords ( GtkWidget *ww, VikGeorefLayer *vgl ) +{ + const gchar* filename = vik_file_entry_get_filename(VIK_FILE_ENTRY(vgl->cw.imageentry)); + if ( !filename ) { + return; + } + GError *gx = NULL; + GdkPixbuf *pixbuf = gdk_pixbuf_new_from_file ( filename, &gx ); + if ( gx ) { + a_dialog_error_msg_extra ( VIK_GTK_WINDOW_FROM_WIDGET(ww), _("Couldn't open image file: %s"), gx->message ); + g_error_free ( gx ); + return; + } + + guint width = gdk_pixbuf_get_width ( pixbuf ); + guint height = gdk_pixbuf_get_height ( pixbuf ); + + if ( width == 0 || height == 0 ) { + a_dialog_error_msg_extra ( VIK_GTK_WINDOW_FROM_WIDGET(ww), _("Invalid image size: %s"), filename); + } + else { + align_coords ( vgl ); + + struct LatLon ll_tl = get_ll_tl (vgl); + struct LatLon ll_br = get_ll_br (vgl); + + gdouble xmpp, ympp; + georef_layer_mpp_from_coords ( VIK_COORD_LATLON, ll_tl, ll_br, width, height, &xmpp, &ympp ); + + gtk_spin_button_set_value ( GTK_SPIN_BUTTON(vgl->cw.x_spin), xmpp ); + gtk_spin_button_set_value ( GTK_SPIN_BUTTON(vgl->cw.y_spin), ympp ); + + check_br_is_good_or_msg_user ( vgl ); + } + + g_object_unref ( G_OBJECT(pixbuf) ); +} + +#define VIK_SETTINGS_GEOREF_TAB "georef_coordinate_tab" + +/* returns TRUE if OK was pressed. */ +static gboolean georef_layer_dialog ( VikGeorefLayer *vgl, gpointer vp, GtkWindow *w, gboolean have_apply_button ) +{ + GtkWidget *dialog = gtk_dialog_new_with_buttons (_("Layer Properties"), w, + GTK_DIALOG_MODAL | GTK_DIALOG_DESTROY_WITH_PARENT, + GTK_STOCK_CANCEL, GTK_RESPONSE_REJECT, NULL ); + if ( have_apply_button ) + gtk_dialog_add_button ( GTK_DIALOG(dialog), GTK_STOCK_APPLY, GTK_RESPONSE_APPLY ); + gtk_dialog_add_button ( GTK_DIALOG(dialog), GTK_STOCK_OK, GTK_RESPONSE_ACCEPT ); + + /* Default to reject as user really needs to specify map file first */ + gtk_dialog_set_default_response ( GTK_DIALOG(dialog), GTK_RESPONSE_REJECT ); + GtkWidget *response_w = NULL; +#if GTK_CHECK_VERSION (2, 20, 0) + response_w = gtk_dialog_get_widget_for_response ( GTK_DIALOG(dialog), GTK_RESPONSE_REJECT ); +#endif + GtkWidget *table, *wfp_hbox, *wfp_label, *wfp_button, *ce_label, *cn_label, *xlabel, *ylabel, *imagelabel; + changeable_widgets cw; + + GtkBox *dgbox = GTK_BOX(gtk_dialog_get_content_area(GTK_DIALOG(dialog))); + table = gtk_table_new ( 4, 2, FALSE ); + gtk_box_pack_start ( dgbox, table, TRUE, TRUE, 0 ); + + wfp_hbox = gtk_hbox_new ( FALSE, 0 ); + wfp_label = gtk_label_new ( _("World File Parameters:") ); + wfp_button = gtk_button_new_with_label ( _("Load From File...") ); + + gtk_box_pack_start ( GTK_BOX(wfp_hbox), wfp_label, TRUE, TRUE, 0 ); + gtk_box_pack_start ( GTK_BOX(wfp_hbox), wfp_button, FALSE, FALSE, 3 ); + + ce_label = gtk_label_new ( _("Corner pixel easting:") ); + cw.ce_spin = gtk_spin_button_new ( (GtkAdjustment *) gtk_adjustment_new ( 4, -15000000.0, 1500000.0, 1, 5, 0 ), 1, 4 ); + gtk_widget_set_tooltip_text ( GTK_WIDGET(cw.ce_spin), _("the UTM \"easting\" value of the upper-left corner pixel of the map") ); + + cn_label = gtk_label_new ( _("Corner pixel northing:") ); + cw.cn_spin = gtk_spin_button_new ( (GtkAdjustment *) gtk_adjustment_new ( 4, -15000000.0, 15000000.0, 1, 5, 0 ), 1, 4 ); + gtk_widget_set_tooltip_text ( GTK_WIDGET(cw.cn_spin), _("the UTM \"northing\" value of the upper-left corner pixel of the map") ); + + xlabel = gtk_label_new ( _("X (easting) scale (mpp): ")); + ylabel = gtk_label_new ( _("Y (northing) scale (mpp): ")); + + cw.x_spin = gtk_spin_button_new ( (GtkAdjustment *) gtk_adjustment_new ( 4, VIK_VIEWPORT_MIN_ZOOM, VIK_VIEWPORT_MAX_ZOOM, 1, 5, 0 ), 1, 8 ); + gtk_widget_set_tooltip_text ( GTK_WIDGET(cw.x_spin), _("the scale of the map in the X direction (meters per pixel)") ); + cw.y_spin = gtk_spin_button_new ( (GtkAdjustment *) gtk_adjustment_new ( 4, VIK_VIEWPORT_MIN_ZOOM, VIK_VIEWPORT_MAX_ZOOM, 1, 5, 0 ), 1, 8 ); + gtk_widget_set_tooltip_text ( GTK_WIDGET(cw.y_spin), _("the scale of the map in the Y direction (meters per pixel)") ); + + imagelabel = gtk_label_new ( _("Map Image:") ); + cw.imageentry = vik_file_entry_new (GTK_FILE_CHOOSER_ACTION_OPEN, VF_FILTER_IMAGE, maybe_read_world_file, &cw); + + gtk_spin_button_set_value ( GTK_SPIN_BUTTON(cw.ce_spin), vgl->corner.easting ); + gtk_spin_button_set_value ( GTK_SPIN_BUTTON(cw.cn_spin), vgl->corner.northing ); + gtk_spin_button_set_value ( GTK_SPIN_BUTTON(cw.x_spin), vgl->mpp_easting ); + gtk_spin_button_set_value ( GTK_SPIN_BUTTON(cw.y_spin), vgl->mpp_northing ); + if ( vgl->image ) + vik_file_entry_set_filename ( VIK_FILE_ENTRY(cw.imageentry), vgl->image ); + + gtk_table_attach_defaults ( GTK_TABLE(table), imagelabel, 0, 1, 0, 1 ); + gtk_table_attach_defaults ( GTK_TABLE(table), cw.imageentry, 1, 2, 0, 1 ); + gtk_table_attach_defaults ( GTK_TABLE(table), wfp_hbox, 0, 2, 1, 2 ); + gtk_table_attach_defaults ( GTK_TABLE(table), xlabel, 0, 1, 2, 3 ); + gtk_table_attach_defaults ( GTK_TABLE(table), cw.x_spin, 1, 2, 2, 3 ); + gtk_table_attach_defaults ( GTK_TABLE(table), ylabel, 0, 1, 3, 4 ); + gtk_table_attach_defaults ( GTK_TABLE(table), cw.y_spin, 1, 2, 3, 4 ); + + cw.tabs = gtk_notebook_new(); + GtkWidget *table_utm = gtk_table_new ( 3, 2, FALSE ); + + gtk_table_attach_defaults ( GTK_TABLE(table_utm), ce_label, 0, 1, 0, 1 ); + gtk_table_attach_defaults ( GTK_TABLE(table_utm), cw.ce_spin, 1, 2, 0, 1 ); + gtk_table_attach_defaults ( GTK_TABLE(table_utm), cn_label, 0, 1, 1, 2 ); + gtk_table_attach_defaults ( GTK_TABLE(table_utm), cw.cn_spin, 1, 2, 1, 2 ); + + GtkWidget *utm_hbox = gtk_hbox_new ( FALSE, 0 ); + cw.utm_zone_spin = gtk_spin_button_new ((GtkAdjustment*)gtk_adjustment_new( vgl->corner.zone, 1, 60, 1, 5, 0 ), 1, 0 ); + gtk_box_pack_start ( GTK_BOX(utm_hbox), gtk_label_new(_("Zone:")), TRUE, TRUE, 0 ); + gtk_box_pack_start ( GTK_BOX(utm_hbox), cw.utm_zone_spin, TRUE, TRUE, 0 ); + gtk_box_pack_start ( GTK_BOX(utm_hbox), gtk_label_new(_("Letter:")), TRUE, TRUE, 0 ); + cw.utm_letter_entry = gtk_entry_new (); + gtk_entry_set_max_length ( GTK_ENTRY(cw.utm_letter_entry), 1 ); + gtk_entry_set_width_chars ( GTK_ENTRY(cw.utm_letter_entry), 2 ); + gchar tmp_letter[2]; + tmp_letter[0] = vgl->corner.letter; + tmp_letter[1] = '\0'; + gtk_entry_set_text ( GTK_ENTRY(cw.utm_letter_entry), tmp_letter ); + gtk_box_pack_start ( GTK_BOX(utm_hbox), cw.utm_letter_entry, TRUE, TRUE, 0 ); + + gtk_table_attach_defaults ( GTK_TABLE(table_utm), utm_hbox, 0, 2, 2, 3 ); + + // Lat/Lon + GtkWidget *table_ll = gtk_table_new ( 5, 2, FALSE ); + + GtkWidget *lat_tl_label = gtk_label_new ( _("Upper left latitude:") ); + cw.lat_tl_spin = gtk_spin_button_new ( (GtkAdjustment *) gtk_adjustment_new (0.0,-90,90.0,0.05,0.1,0), 0.1, 6 ); + GtkWidget *lon_tl_label = gtk_label_new ( _("Upper left longitude:") ); + cw.lon_tl_spin = gtk_spin_button_new ( (GtkAdjustment *) gtk_adjustment_new (0.0,-180,180.0,0.05,0.1,0), 0.1, 6 ); + GtkWidget *lat_br_label = gtk_label_new ( _("Lower right latitude:") ); + cw.lat_br_spin = gtk_spin_button_new ( (GtkAdjustment *) gtk_adjustment_new (0.0,-90,90.0,0.05,0.1,0), 0.1, 6 ); + GtkWidget *lon_br_label = gtk_label_new ( _("Lower right longitude:") ); + cw.lon_br_spin = gtk_spin_button_new ( (GtkAdjustment *) gtk_adjustment_new (0.0,-180.0,180.0,0.05,0.1,0), 0.1, 6 ); + + gtk_table_attach_defaults ( GTK_TABLE(table_ll), lat_tl_label, 0, 1, 0, 1 ); + gtk_table_attach_defaults ( GTK_TABLE(table_ll), cw.lat_tl_spin, 1, 2, 0, 1 ); + gtk_table_attach_defaults ( GTK_TABLE(table_ll), lon_tl_label, 0, 1, 1, 2 ); + gtk_table_attach_defaults ( GTK_TABLE(table_ll), cw.lon_tl_spin, 1, 2, 1, 2 ); + gtk_table_attach_defaults ( GTK_TABLE(table_ll), lat_br_label, 0, 1, 2, 3 ); + gtk_table_attach_defaults ( GTK_TABLE(table_ll), cw.lat_br_spin, 1, 2, 2, 3 ); + gtk_table_attach_defaults ( GTK_TABLE(table_ll), lon_br_label, 0, 1, 3, 4 ); + gtk_table_attach_defaults ( GTK_TABLE(table_ll), cw.lon_br_spin, 1, 2, 3, 4 ); + + GtkWidget *calc_mpp_button = gtk_button_new_with_label ( _("Calculate MPP values from coordinates") ); + gtk_widget_set_tooltip_text ( calc_mpp_button, _("Enter all corner coordinates before calculating the MPP values from the image size") ); + gtk_table_attach_defaults ( GTK_TABLE(table_ll), calc_mpp_button, 0, 2, 4, 5 ); + + VikCoord vc; + vik_coord_load_from_utm (&vc, VIK_COORD_LATLON, &(vgl->corner)); + gtk_spin_button_set_value ( GTK_SPIN_BUTTON(cw.lat_tl_spin), vc.north_south ); + gtk_spin_button_set_value ( GTK_SPIN_BUTTON(cw.lon_tl_spin), vc.east_west ); + gtk_spin_button_set_value ( GTK_SPIN_BUTTON(cw.lat_br_spin), vgl->ll_br.lat ); + gtk_spin_button_set_value ( GTK_SPIN_BUTTON(cw.lon_br_spin), vgl->ll_br.lon ); + + gtk_notebook_append_page(GTK_NOTEBOOK(cw.tabs), GTK_WIDGET(table_utm), gtk_label_new(_("UTM"))); + gtk_notebook_append_page(GTK_NOTEBOOK(cw.tabs), GTK_WIDGET(table_ll), gtk_label_new(_("Latitude/Longitude"))); + gtk_box_pack_start ( dgbox, cw.tabs, TRUE, TRUE, 0 ); + + GtkWidget *alpha_hbox = gtk_hbox_new ( FALSE, 0 ); + // GTK3 => GtkWidget *alpha_scale = gtk_scale_new_with_range ( GTK_ORIENTATION_HORIZONTAL, 0, 255, 1 ); + GtkWidget *alpha_scale = gtk_hscale_new_with_range ( 0, 255, 1 ); + gtk_scale_set_digits ( GTK_SCALE(alpha_scale), 0 ); + gtk_range_set_value ( GTK_RANGE(alpha_scale), vgl->alpha ); + gtk_box_pack_start ( GTK_BOX(alpha_hbox), gtk_label_new(_("Alpha:")), TRUE, TRUE, 0 ); + gtk_box_pack_start ( GTK_BOX(alpha_hbox), alpha_scale, TRUE, TRUE, 0 ); + gtk_box_pack_start ( dgbox, alpha_hbox, TRUE, TRUE, 0 ); + + vgl->cw = cw; + + g_signal_connect ( G_OBJECT(vgl->cw.tabs), "switch-page", G_CALLBACK(switch_tab), vgl ); + g_signal_connect ( G_OBJECT(calc_mpp_button), "clicked", G_CALLBACK(calculate_mpp_from_coords), vgl ); + + g_signal_connect_swapped ( G_OBJECT(wfp_button), "clicked", G_CALLBACK(georef_layer_dialog_load), &cw ); + + if ( response_w ) + gtk_widget_grab_focus ( response_w ); + + gtk_widget_show_all ( dialog ); + + // Remember setting the notebook page must be done after the widget is visible. + gint page_num = 0; + if ( a_settings_get_integer ( VIK_SETTINGS_GEOREF_TAB, &page_num ) ) + if ( page_num < 0 || page_num > 1 ) + page_num = 0; + gtk_notebook_set_current_page ( GTK_NOTEBOOK(cw.tabs), page_num ); + + gboolean answer = FALSE; + gint resp = GTK_RESPONSE_APPLY; + while ( resp == GTK_RESPONSE_APPLY ) { + resp = gtk_dialog_run ( GTK_DIALOG(dialog) ); + if ( resp == GTK_RESPONSE_ACCEPT || resp == GTK_RESPONSE_APPLY ) { + align_coords ( vgl ); + + vgl->corner.easting = gtk_spin_button_get_value ( GTK_SPIN_BUTTON(cw.ce_spin) ); + vgl->corner.northing = gtk_spin_button_get_value ( GTK_SPIN_BUTTON(cw.cn_spin) ); + vgl->corner.zone = gtk_spin_button_get_value_as_int ( GTK_SPIN_BUTTON(cw.utm_zone_spin) ); + const gchar *letter = gtk_entry_get_text ( GTK_ENTRY(cw.utm_letter_entry) ); + if (*letter) + vgl->corner.letter = toupper(*letter); + vgl->mpp_easting = gtk_spin_button_get_value ( GTK_SPIN_BUTTON(cw.x_spin) ); + vgl->mpp_northing = gtk_spin_button_get_value ( GTK_SPIN_BUTTON(cw.y_spin) ); + vgl->ll_br = get_ll_br (vgl); + check_br_is_good_or_msg_user ( vgl ); + // TODO check if image has changed otherwise no need to regenerate pixbuf + if ( !vgl->pixbuf ) { + if ( g_strcmp0 (vgl->image, vik_file_entry_get_filename(VIK_FILE_ENTRY(cw.imageentry)) ) != 0 ) { + georef_layer_set_image ( vgl, vik_file_entry_get_filename(VIK_FILE_ENTRY(cw.imageentry)) ); + georef_layer_load_image ( vgl, VIK_VIEWPORT(vp), FALSE ); + } + } + + vgl->alpha = (guint8) gtk_range_get_value ( GTK_RANGE(alpha_scale) ); + if ( vgl->pixbuf && vgl->alpha <= 255 ) + vgl->pixbuf = ui_pixbuf_set_alpha ( vgl->pixbuf, vgl->alpha ); + if ( vgl->scaled && vgl->alpha <= 255 ) + vgl->scaled = ui_pixbuf_set_alpha ( vgl->scaled, vgl->alpha ); + + a_settings_set_integer ( VIK_SETTINGS_GEOREF_TAB, gtk_notebook_get_current_page(GTK_NOTEBOOK(cw.tabs)) ); + + if ( resp == GTK_RESPONSE_APPLY ) { + vik_layer_emit_update ( VIK_LAYER(vgl) ); + answer = FALSE; + } + else + answer = TRUE; + } + } + gtk_widget_destroy ( GTK_WIDGET(dialog) ); + return answer; +} + +static void georef_layer_zoom_to_fit ( gpointer vgl_vlp[2] ) +{ + vik_viewport_set_xmpp ( vik_layers_panel_get_viewport(VIK_LAYERS_PANEL(vgl_vlp[1])), VIK_GEOREF_LAYER(vgl_vlp[0])->mpp_easting ); + vik_viewport_set_ympp ( vik_layers_panel_get_viewport(VIK_LAYERS_PANEL(vgl_vlp[1])), VIK_GEOREF_LAYER(vgl_vlp[0])->mpp_northing ); + vik_layers_panel_emit_update ( VIK_LAYERS_PANEL(vgl_vlp[1]) ); +} + +static void georef_layer_goto_center ( gpointer vgl_vlp[2] ) +{ + VikGeorefLayer *vgl = VIK_GEOREF_LAYER ( vgl_vlp[0] ); + VikViewport *vp = vik_layers_panel_get_viewport(VIK_LAYERS_PANEL(vgl_vlp[1])); + struct UTM utm; + VikCoord coord; + + vik_coord_to_utm ( vik_viewport_get_center ( vp ), &utm ); + + utm.easting = vgl->corner.easting + (vgl->width * vgl->mpp_easting / 2); /* only an approximation */ + utm.northing = vgl->corner.northing - (vgl->height * vgl->mpp_northing / 2); + + vik_coord_load_from_utm ( &coord, vik_viewport_get_coord_mode ( vp ), &utm ); + vik_viewport_set_center_coord ( vp, &coord, TRUE ); + + vik_layers_panel_emit_update ( VIK_LAYERS_PANEL(vgl_vlp[1]) ); +} + +static void georef_layer_add_menu_items ( VikGeorefLayer *vgl, GtkMenu *menu, gpointer vlp ) +{ + static gpointer pass_along[2]; + GtkWidget *item; + pass_along[0] = vgl; + pass_along[1] = vlp; + + item = gtk_menu_item_new(); + gtk_menu_shell_append ( GTK_MENU_SHELL(menu), item ); + gtk_widget_show ( item ); + + /* Now with icons */ + item = gtk_image_menu_item_new_with_mnemonic ( _("_Zoom to Fit Map") ); + gtk_image_menu_item_set_image ( (GtkImageMenuItem*)item, gtk_image_new_from_stock (GTK_STOCK_ZOOM_FIT, GTK_ICON_SIZE_MENU) ); + g_signal_connect_swapped ( G_OBJECT(item), "activate", G_CALLBACK(georef_layer_zoom_to_fit), pass_along ); + gtk_menu_shell_append (GTK_MENU_SHELL (menu), item); + gtk_widget_show ( item ); + + item = gtk_image_menu_item_new_with_mnemonic ( _("_Goto Map Center") ); + gtk_image_menu_item_set_image ( (GtkImageMenuItem*)item, gtk_image_new_from_stock (GTK_STOCK_JUMP_TO, GTK_ICON_SIZE_MENU) ); + g_signal_connect_swapped ( G_OBJECT(item), "activate", G_CALLBACK(georef_layer_goto_center), pass_along ); + gtk_menu_shell_append (GTK_MENU_SHELL (menu), item); + gtk_widget_show ( item ); + + item = gtk_image_menu_item_new_with_mnemonic ( _("_Export to World File") ); + gtk_image_menu_item_set_image ( (GtkImageMenuItem*)item, gtk_image_new_from_stock (GTK_STOCK_HARDDISK, GTK_ICON_SIZE_MENU) ); + g_signal_connect_swapped ( G_OBJECT(item), "activate", G_CALLBACK(georef_layer_export_params), pass_along ); + gtk_menu_shell_append (GTK_MENU_SHELL (menu), item); + gtk_widget_show ( item ); +} + + +static gpointer georef_layer_move_create ( VikWindow *vw, VikViewport *vvp) +{ + return vvp; +} + +static gboolean georef_layer_move_release ( VikGeorefLayer *vgl, GdkEventButton *event, VikViewport *vvp ) +{ + if (!vgl || vgl->vl.type != VIK_LAYER_GEOREF) + return FALSE; + + if ( vgl->click_x != -1 ) + { + vgl->corner.easting += (event->x - vgl->click_x) * vik_viewport_get_xmpp (vvp); + vgl->corner.northing -= (event->y - vgl->click_y) * vik_viewport_get_ympp (vvp); + vik_layer_emit_update ( VIK_LAYER(vgl) ); + return TRUE; + } + return FALSE; /* I didn't move anything on this layer! */ +} + +static gpointer georef_layer_zoom_create ( VikWindow *vw, VikViewport *vvp) +{ + return vvp; +} + +static gboolean georef_layer_zoom_press ( VikGeorefLayer *vgl, GdkEventButton *event, VikViewport *vvp ) +{ + if (!vgl || vgl->vl.type != VIK_LAYER_GEOREF) + return FALSE; + if ( event->button == 1 ) + { + if ( vgl->mpp_easting < (VIK_VIEWPORT_MAX_ZOOM / 1.05) && vgl->mpp_northing < (VIK_VIEWPORT_MAX_ZOOM / 1.05) ) + { + vgl->mpp_easting *= 1.01; + vgl->mpp_northing *= 1.01; + } + } + else + { + if ( vgl->mpp_easting > (VIK_VIEWPORT_MIN_ZOOM * 1.05) && vgl->mpp_northing > (VIK_VIEWPORT_MIN_ZOOM * 1.05) ) + { + vgl->mpp_easting /= 1.01; + vgl->mpp_northing /= 1.01; + } + } + vik_viewport_set_xmpp ( vvp, vgl->mpp_easting ); + vik_viewport_set_ympp ( vvp, vgl->mpp_northing ); + vik_layer_emit_update ( VIK_LAYER(vgl) ); + return TRUE; +} + +static gboolean georef_layer_move_press ( VikGeorefLayer *vgl, GdkEventButton *event, VikViewport *vvp ) +{ + if (!vgl || vgl->vl.type != VIK_LAYER_GEOREF) + return FALSE; + vgl->click_x = event->x; + vgl->click_y = event->y; + return TRUE; +} + +static void goto_center_ll ( VikViewport *vp, + struct LatLon ll_tl, + struct LatLon ll_br ) +{ + VikCoord vc_center; + struct LatLon ll_center; + + ll_center.lat = (ll_tl.lat + ll_br.lat) / 2.0; + ll_center.lon = (ll_tl.lon + ll_br.lon) / 2.0; + + vik_coord_load_from_latlon ( &vc_center, vik_viewport_get_coord_mode (vp), &ll_center ); + vik_viewport_set_center_coord ( vp, &vc_center, TRUE ); +} + +/** + * vik_georef_layer_create: + * + * @name: Name for the Georef layer. This string is copied. + * @pixbuf: Pixbuf becomes owned by the Georef layer and will manage the freeing of it + */ +VikGeorefLayer *vik_georef_layer_create ( VikViewport *vp, + VikLayersPanel *vlp, + const gchar *name, + GdkPixbuf *pixbuf, + VikCoord *coord_tl, + VikCoord *coord_br ) +{ + VikGeorefLayer *vgl = georef_layer_new ( vp ); + vik_layer_rename ( VIK_LAYER(vgl), name ); + + vgl->pixbuf = pixbuf; + + vik_coord_to_utm ( coord_tl, &(vgl->corner) ); + vik_coord_to_latlon ( coord_br, &(vgl->ll_br) ); + + if ( vgl->pixbuf ) { + vgl->width = gdk_pixbuf_get_width ( vgl->pixbuf ); + vgl->height = gdk_pixbuf_get_height ( vgl->pixbuf ); + + if ( vgl->width > 0 && vgl->height > 0 ) { + + struct LatLon ll_tl; + vik_coord_to_latlon ( coord_tl, &ll_tl); + struct LatLon ll_br; + vik_coord_to_latlon ( coord_br, &ll_br); + + VikCoordMode mode = vik_viewport_get_coord_mode (vp); + + gdouble xmpp, ympp; + georef_layer_mpp_from_coords ( mode, ll_tl, ll_br, vgl->width, vgl->height, &xmpp, &ympp ); + vgl->mpp_easting = xmpp; + vgl->mpp_northing = ympp; + + goto_center_ll ( vp, ll_tl, ll_br); + // Set best zoom level + struct LatLon maxmin[2] = { ll_tl, ll_br }; + vu_zoom_to_show_latlons ( vik_viewport_get_coord_mode(vp), vp, maxmin ); + + return vgl; + } + } + + // Bad image + georef_layer_free ( vgl ); + return NULL; +} diff --git a/src/vikgeoreflayer.h b/src/vikgeoreflayer.h new file mode 100644 index 0000000..7a1d341 --- /dev/null +++ b/src/vikgeoreflayer.h @@ -0,0 +1,56 @@ +/* + * viking -- GPS Data and Topo Analyzer, Explorer, and Manager + * + * Copyright (C) 2003-2005, Evan Battaglia + * + * 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., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA + * + */ + +#ifndef _VIKING_GEOREFLAYER_H +#define _VIKING_GEOREFLAYER_H + +#include "viklayer.h" + +G_BEGIN_DECLS + +#define VIK_GEOREF_LAYER_TYPE (vik_georef_layer_get_type ()) +#define VIK_GEOREF_LAYER(obj) (G_TYPE_CHECK_INSTANCE_CAST ((obj), VIK_GEOREF_LAYER_TYPE, VikGeorefLayer)) +#define VIK_GEOREF_LAYER_CLASS(klass) (G_TYPE_CHECK_CLASS_CAST ((klass), VIK_GEOREF_LAYER_TYPE, VikGeorefLayerClass)) +#define IS_VIK_GEOREF_LAYER(obj) (G_TYPE_CHECK_INSTANCE_TYPE ((obj), VIK_GEOREF_LAYER_TYPE)) +#define IS_VIK_GEOREF_LAYER_CLASS(klass) (G_TYPE_CHECK_CLASS_TYPE ((klass), VIK_GEOREF_LAYER_TYPE)) + +typedef struct _VikGeorefLayerClass VikGeorefLayerClass; +struct _VikGeorefLayerClass +{ + VikLayerClass object_class; +}; + +GType vik_georef_layer_get_type (); + +typedef struct _VikGeorefLayer VikGeorefLayer; + +void vik_georef_layer_init (void); + +VikGeorefLayer *vik_georef_layer_create ( VikViewport *vp, + VikLayersPanel *vlp, + const gchar *name, + GdkPixbuf *pibxbuf, + VikCoord *coord_tr, + VikCoord *coord_br ); + +G_END_DECLS + +#endif diff --git a/src/vikgobjectbuilder.c b/src/vikgobjectbuilder.c new file mode 100644 index 0000000..f864837 --- /dev/null +++ b/src/vikgobjectbuilder.c @@ -0,0 +1,256 @@ +/* -*- Mode: C; indent-tabs-mode: t; c-basic-offset: 4; tab-width: 4 -*- */ +/* + * viking + * Copyright (C) 2009, Guilhem Bonnefille + * + * viking 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. + * + * viking 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, see . + */ + +#ifdef HAVE_CONFIG_H +#include "config.h" +#endif + +#include +#ifdef HAVE_STRING_H +#include +#endif + +#include +#include + +#include + +#include "vikgobjectbuilder.h" + +/* FIXME use private fields */ +GType gtype = 0; +gchar *property_name = NULL; +GParameter *parameters = NULL; +gint nb_parameters = 0; + +/* signals */ +enum +{ + NEW_OBJECT, + + LAST_SIGNAL +}; + + +static guint gobject_builder_signals[LAST_SIGNAL] = { 0 }; + +G_DEFINE_TYPE (VikGobjectBuilder, vik_gobject_builder, G_TYPE_OBJECT); + +static void +vik_gobject_builder_init (VikGobjectBuilder *object) +{ + /* TODO: Add initialization code here */ +} + +static void +vik_gobject_builder_finalize (GObject *object) +{ + /* TODO: Add deinitalization code here */ + + G_OBJECT_CLASS (vik_gobject_builder_parent_class)->finalize (object); +} + +static void +vik_gobject_builder_new_object (VikGobjectBuilder *self, GObject *object) +{ + /* TODO: Add default signal handler implementation here */ +} + +static void +vik_gobject_builder_class_init (VikGobjectBuilderClass *klass) +{ + GObjectClass* object_class = G_OBJECT_CLASS (klass); + + object_class->finalize = vik_gobject_builder_finalize; + + klass->new_object = vik_gobject_builder_new_object; + + gobject_builder_signals[NEW_OBJECT] = + g_signal_new ("new-object", + G_OBJECT_CLASS_TYPE (klass), + 0, + G_STRUCT_OFFSET (VikGobjectBuilderClass, new_object), + NULL, NULL, + g_cclosure_marshal_VOID__OBJECT, + G_TYPE_NONE, 1, + G_TYPE_OBJECT); +} + +/* Called for open tags */ +static void +_start_element (GMarkupParseContext *context, + const gchar *element_name, + const gchar **attribute_names, + const gchar **attribute_values, + gpointer user_data, + GError **error) +{ + if (strcmp(element_name, "object") == 0) + { + gchar *class_name = g_strdup(attribute_values[0]); + gtype = g_type_from_name (class_name); + if (gtype == 0) + { + g_warning("Unknown GObject type '%s'", class_name); + return; + } + g_free (class_name); + } + if (strcmp(element_name, "property") == 0 && gtype != 0) + { + int i=0; + while (attribute_names[i] != NULL) + { + if (strcmp (attribute_names[i], "name") == 0) + { + g_free (property_name); + property_name = g_strdup (attribute_values[i]); + } + i++; + } + } +} + +/* Called for close tags */ +static void +_end_element (GMarkupParseContext *context, + const gchar *element_name, + gpointer user_data, + GError **error) +{ + VikGobjectBuilder *self = VIK_GOBJECT_BUILDER (user_data); + gpointer object = NULL; + if (strcmp(element_name, "object") == 0 && gtype != 0) + { + object = g_object_newv(gtype, nb_parameters, parameters); + if (object != NULL) + { + g_debug("VikGobjectBuilder: new GObject of type %s", g_type_name(gtype)); + g_signal_emit ( G_OBJECT(self), gobject_builder_signals[NEW_OBJECT], 0, object ); + g_object_unref (object); + } + /* Free memory */ + int i = 0; + for (i = 0 ; i < nb_parameters ; i++) + { + g_free ((gchar *)parameters[i].name); + g_value_unset (&(parameters[i].value)); + } + g_free (parameters); + parameters = NULL; + nb_parameters = 0; + gtype = 0; + } + if (strcmp(element_name, "property") == 0) + { + g_free (property_name); + property_name = NULL; + } +} + +/* Called for character data */ +/* text is not nul-terminated */ +static void +_text (GMarkupParseContext *context, + const gchar *text, + gsize text_len, + gpointer user_data, + GError **error) +{ + if (strcmp (g_markup_parse_context_get_element (context), "property") == 0) + { + GValue gvalue = {0}; + gboolean found = FALSE; + if (gtype != 0 && property_name != NULL) + { + /* parameter value */ + /* We have to retrieve the expected type of the value + * in order to do the correct transformation */ + GObjectClass *oclass; + oclass = g_type_class_ref (gtype); + g_assert (oclass != NULL); + GParamSpec *pspec; + pspec = g_object_class_find_property (G_OBJECT_CLASS (oclass), property_name); + if (!pspec) + { + g_warning ("Unknown property: %s.%s", g_type_name (gtype), property_name); + return; + } + gchar *value = g_strndup (text, text_len); + found = gtk_builder_value_from_string_type(NULL, pspec->value_type, value, &gvalue, NULL); + g_free (value); + } + if (G_IS_VALUE (&gvalue) && found == TRUE) + { + /* store new parameter */ + g_debug("VikGobjectBuilder: store new GParameter for %s: (%s)%s=%*s", + g_type_name(gtype), g_type_name(G_VALUE_TYPE(&gvalue)), property_name, (gint)text_len, text); + nb_parameters++; + parameters = g_realloc(parameters, sizeof(GParameter)*nb_parameters); + /* parameter name */ + parameters[nb_parameters-1].name = g_strdup(property_name); + /* parameter value */ + parameters[nb_parameters-1].value = gvalue; + } + } +} + +VikGobjectBuilder * +vik_gobject_builder_new (void) +{ + return g_object_new (VIK_TYPE_GOBJECT_BUILDER, NULL); +} + +void +vik_gobject_builder_parse (VikGobjectBuilder *self, const gchar *filename) +{ + GMarkupParser xml_parser; + GMarkupParseContext *xml_context; + GError *error = NULL; + + FILE *file = g_fopen (filename, "r"); + if (file == NULL) + /* TODO emit warning */ + return; + + /* setup context parse (ie callbacks) */ + xml_parser.start_element = &_start_element; + xml_parser.end_element = &_end_element; + xml_parser.text = &_text; + xml_parser.passthrough = NULL; + xml_parser.error = NULL; + + xml_context = g_markup_parse_context_new(&xml_parser, 0, self, NULL); + + gchar buff[BUFSIZ]; + size_t nb; + while ((nb = fread (buff, sizeof(gchar), BUFSIZ, file)) > 0) + { + if (!g_markup_parse_context_parse(xml_context, buff, nb, &error)) + g_warning("%s: parsing error: %s", __FUNCTION__, + error != NULL ? error->message : "???"); + } + /* cleanup */ + if (!g_markup_parse_context_end_parse(xml_context, &error)) + g_warning("%s: errors occurred reading file '%s': %s", __FUNCTION__, filename, + error != NULL ? error->message : "???"); + + g_markup_parse_context_free(xml_context); + fclose (file); +} diff --git a/src/vikgobjectbuilder.h b/src/vikgobjectbuilder.h new file mode 100644 index 0000000..ea1a1ca --- /dev/null +++ b/src/vikgobjectbuilder.h @@ -0,0 +1,57 @@ +/* -*- Mode: C; indent-tabs-mode: t; c-basic-offset: 4; tab-width: 4 -*- */ +/* + * viking + * Copyright (C) 2009, Guilhem Bonnefille + * + * viking 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. + * + * viking 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, see . + */ + +#ifndef _VIK_GOBJECT_BUILDER_H_ +#define _VIK_GOBJECT_BUILDER_H_ + +#include + +G_BEGIN_DECLS + +#define VIK_TYPE_GOBJECT_BUILDER (vik_gobject_builder_get_type ()) +#define VIK_GOBJECT_BUILDER(obj) (G_TYPE_CHECK_INSTANCE_CAST ((obj), VIK_TYPE_GOBJECT_BUILDER, VikGobjectBuilder)) +#define VIK_GOBJECT_BUILDER_CLASS(klass) (G_TYPE_CHECK_CLASS_CAST ((klass), VIK_TYPE_GOBJECT_BUILDER, VikGobjectBuilderClass)) +#define VIK_IS_GOBJECT_BUILDER(obj) (G_TYPE_CHECK_INSTANCE_TYPE ((obj), VIK_TYPE_GOBJECT_BUILDER)) +#define VIK_IS_GOBJECT_BUILDER_CLASS(klass) (G_TYPE_CHECK_CLASS_TYPE ((klass), VIK_TYPE_GOBJECT_BUILDER)) +#define VIK_GOBJECT_BUILDER_GET_CLASS(obj) (G_TYPE_INSTANCE_GET_CLASS ((obj), VIK_TYPE_GOBJECT_BUILDER, VikGobjectBuilderClass)) + +typedef struct _VikGobjectBuilderClass VikGobjectBuilderClass; +typedef struct _VikGobjectBuilder VikGobjectBuilder; + +struct _VikGobjectBuilderClass +{ + GObjectClass parent_class; + + /* Signals */ + void(* new_object) (VikGobjectBuilder *self, GObject *object); +}; + +struct _VikGobjectBuilder +{ + GObject parent_instance; +}; + +GType vik_gobject_builder_get_type (void) G_GNUC_CONST; +VikGobjectBuilder *vik_gobject_builder_new (void); + +void vik_gobject_builder_parse (VikGobjectBuilder *self, const gchar *filename); + +G_END_DECLS + +#endif /* _VIK_GOBJECT_BUILDER_H_ */ diff --git a/src/vikgoto.c b/src/vikgoto.c new file mode 100644 index 0000000..7fb6b0b --- /dev/null +++ b/src/vikgoto.c @@ -0,0 +1,534 @@ +/* + * viking -- GPS Data and Topo Analyzer, Explorer, and Manager + * + * Copyright (C) 2003-2005, Evan Battaglia + * Copyright (C) 2009, Guilhem Bonnefille + * + * 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., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA + * + */ +#ifdef HAVE_CONFIG_H +#include "config.h" +#endif +#include +#include +#include +#include +#include +#include +#include + +#include "viking.h" +#include "vikgototool.h" +#include "vikgoto.h" +#include "ui_util.h" + +/* Compatibility */ +#if ! GLIB_CHECK_VERSION(2,22,0) +#define g_mapped_file_unref g_mapped_file_free +#endif + +static gchar *last_goto_str = NULL; +static VikCoord *last_coord = NULL; +static gchar *last_successful_goto_str = NULL; + +static GList *goto_tools_list = NULL; + +#define VIK_SETTINGS_GOTO_PROVIDER "goto_provider" +int last_goto_tool = -1; + +struct VikGotoSearchWinData { + VikWindow *vw; + VikViewport * vvp; + GtkWidget *dialog; + GtkEntry *goto_entry; + GtkWidget *tool_list; + GtkWidget *scroll_view; + GtkTreeView *results_view; +}; + +enum { + VIK_GOTO_SEARCH_DESC_COL = 0, + VIK_GOTO_SEARCH_LAT_COL, + VIK_GOTO_SEARCH_LON_COL, + VIK_GOTO_SEARCH_NUM_COLS +}; + +void vik_goto_register ( VikGotoTool *tool ) +{ + if ( IS_VIK_GOTO_TOOL( tool ) ) + goto_tools_list = g_list_append ( goto_tools_list, g_object_ref ( tool ) ); +} + +void vik_goto_unregister_all () +{ + g_list_foreach ( goto_tools_list, (GFunc) g_object_unref, NULL ); +} + +gchar * a_vik_goto_get_search_string_for_this_place(VikWindow *vw) +{ + if (!last_coord) + return NULL; + + VikViewport *vvp = vik_window_viewport(vw); + const VikCoord *cur_center = vik_viewport_get_center(vvp); + if (vik_coord_equals(cur_center, last_coord)) { + return(last_successful_goto_str); + } + else + return NULL; +} + +static void display_no_tool(VikWindow *vw) +{ + GtkWidget *dialog = NULL; + + dialog = gtk_message_dialog_new ( GTK_WINDOW(vw), GTK_DIALOG_MODAL, GTK_MESSAGE_WARNING, GTK_BUTTONS_OK, _("No goto tool available.") ); + + gtk_dialog_run ( GTK_DIALOG(dialog) ); + + gtk_widget_destroy(dialog); +} + +static gint find_entry = -1; +static gint wanted_entry = -1; + +static void find_provider (gpointer elem, gpointer user_data) +{ + const gchar *name = vik_goto_tool_get_label (elem); + const gchar *provider = user_data; + find_entry++; + if (!strcmp(name, provider)) { + wanted_entry = find_entry; + } +} + +/** + * Setup last_goto_tool value + */ +static void get_provider () +{ + // Use setting for the provider if available + if ( last_goto_tool < 0 ) { + find_entry = -1; + wanted_entry = -1; + gchar *provider = NULL; + if ( a_settings_get_string ( VIK_SETTINGS_GOTO_PROVIDER, &provider ) ) { + // Use setting + if ( provider ) + g_list_foreach (goto_tools_list, find_provider, provider); + // If not found set it to the first entry, otherwise use the entry + last_goto_tool = ( wanted_entry < 0 ) ? 0 : wanted_entry; + g_free ( provider ); + } + else + last_goto_tool = 0; + } +} + +static void +text_changed_cb (GtkEntry *entry, + GParamSpec *pspec, + GtkWidget *button) +{ + gboolean has_text = gtk_entry_get_text_length(entry) > 0; + gtk_entry_set_icon_sensitive ( entry, GTK_ENTRY_ICON_SECONDARY, has_text ); + gtk_widget_set_sensitive ( button, has_text ); +} + +/** + * Goto a place when we already have a string to search on + * + * Returns: %TRUE if a successful lookup + */ +static gboolean vik_goto_place ( VikWindow *vw, VikViewport *vvp, gchar* name, VikCoord *vcoord ) +{ + // Ensure last_goto_tool is given a value + get_provider (); + + if ( goto_tools_list ) { + VikGotoTool *gototool = g_list_nth_data ( goto_tools_list, last_goto_tool ); + if ( gototool ) { + if ( vik_goto_tool_get_coord ( gototool, vw, vvp, name, vcoord ) == 0 ) + return TRUE; + } + } + return FALSE; +} + +static gboolean vik_goto_search_list_select ( GtkTreeSelection *sel, GtkTreeModel *model, GtkTreePath *path, gboolean path_currently_selected, gpointer pdata ) +{ + struct VikGotoSearchWinData *data = (struct VikGotoSearchWinData *) pdata; + GtkTreeIter iter; + + if ( path_currently_selected ) + return TRUE; + + if ( gtk_tree_model_get_iter ( model, &iter, path ) ) + { + gdouble lat; + gdouble lon; + + gtk_tree_model_get ( model, &iter, VIK_GOTO_SEARCH_LAT_COL, &lat, -1 ); + gtk_tree_model_get ( model, &iter, VIK_GOTO_SEARCH_LON_COL, &lon, -1 ); + + if ( last_coord ) + g_free ( last_coord ); + last_coord = g_malloc( sizeof(VikCoord) ); + + struct LatLon ll = { lat, lon }; + vik_coord_load_from_latlon ( last_coord, VIK_COORD_LATLON, &ll ); + + if ( last_successful_goto_str ) + g_free ( last_successful_goto_str ); + last_successful_goto_str = g_strdup ( last_goto_str ); + + vik_viewport_set_center_coord( data->vvp, last_coord, TRUE ); + vik_layers_panel_emit_update ( vik_window_layers_panel(data->vw) ); + } + + return TRUE; +} + +static void vik_goto_search_response ( struct VikGotoSearchWinData *data, gint response ) +{ + if ( response == GTK_RESPONSE_ACCEPT ) + { + // TODO check if list is empty + last_goto_tool = gtk_combo_box_get_active ( GTK_COMBO_BOX(data->tool_list) ); + gchar *provider = vik_goto_tool_get_label ( g_list_nth_data (goto_tools_list, last_goto_tool) ); + a_settings_set_string ( VIK_SETTINGS_GOTO_PROVIDER, provider ); + + gchar *goto_str = g_strdup ( gtk_entry_get_text ( GTK_ENTRY(data->goto_entry) ) ); + + if (goto_str[0] != '\0') { + if ( last_goto_str ) + g_free ( last_goto_str ); + last_goto_str = g_strdup ( goto_str ); + } + + VikGotoTool *tool = g_list_nth_data ( goto_tools_list, last_goto_tool ); + + GList *candidates = NULL; + + vik_window_set_busy_cursor_widget ( data->dialog, data->vw ); + int ans = vik_goto_tool_get_candidates ( tool, data->vw, data->vvp, goto_str, &candidates ); + vik_window_clear_busy_cursor_widget ( data->dialog, data->vw ); + + if ( ans == 0 ) { + // make results visible + gtk_widget_set_size_request( GTK_WIDGET(data->scroll_view), 320, 240 ); + gtk_widget_set_size_request( GTK_WIDGET(data->results_view), 320, 240 ); + gtk_widget_show ( data->scroll_view ); + + GtkListStore *results_store = gtk_list_store_new ( VIK_GOTO_SEARCH_NUM_COLS, + G_TYPE_STRING, + G_TYPE_DOUBLE, + G_TYPE_DOUBLE ); + GtkTreeIter results_iter; + + for ( GList *l = candidates; l != NULL; l = l->next ) + { + struct VikGotoCandidate *cand = (struct VikGotoCandidate *) l->data; + gtk_list_store_append ( results_store, &results_iter ); + gtk_list_store_set ( results_store, &results_iter, + VIK_GOTO_SEARCH_DESC_COL, cand->description,//cand->description, + VIK_GOTO_SEARCH_LAT_COL, cand->ll.lat, + VIK_GOTO_SEARCH_LON_COL, cand->ll.lon, + -1 ); + } + + gtk_tree_view_set_model ( data->results_view, GTK_TREE_MODEL(results_store) ); + + if ( g_list_length( candidates ) > 0 ) + { + GtkTreeIter first_iter; + gtk_tree_model_get_iter_first ( GTK_TREE_MODEL(results_store), &first_iter); + GtkTreeSelection *selection = gtk_tree_view_get_selection( data->results_view ); + gtk_tree_selection_select_iter ( selection, &first_iter ); + } + + g_object_unref ( results_store ); + g_free ( goto_str ); + g_list_free_full ( candidates, vik_goto_tool_free_candidate ); + } + else + { + a_dialog_error_msg ( GTK_WINDOW(data->vw), "Service request failure." ); + } + } + else if ( response == GTK_RESPONSE_CLOSE ) + { + gtk_widget_destroy ( data->dialog ); + g_free( data ); + } +} + +void a_vik_goto ( VikWindow *vw, VikViewport *vvp ) +{ + GtkWidget *dialog = NULL; + + if ( goto_tools_list == NULL ) + { + /* Empty list */ + display_no_tool ( vw ); + return; + } + + dialog = gtk_dialog_new_with_buttons ( "", GTK_WINDOW(vw), 0, + GTK_STOCK_FIND, GTK_RESPONSE_ACCEPT, + GTK_STOCK_CLOSE, GTK_RESPONSE_CLOSE, + NULL ); + gtk_window_set_transient_for ( GTK_WINDOW(dialog), GTK_WINDOW(vw) ); + gtk_window_set_title( GTK_WINDOW(dialog), _("goto") ); + + GtkWidget *tool_label = gtk_label_new( _("goto provider:") ); + GtkWidget *tool_list = vik_combo_box_text_new (); + GList *current = g_list_first ( goto_tools_list ); + while ( current != NULL ) + { + char *label = NULL; + VikGotoTool *tool = current->data; + label = vik_goto_tool_get_label ( tool ); + vik_combo_box_text_append ( tool_list, label ); + current = g_list_next ( current ); + } + + get_provider (); + gtk_combo_box_set_active ( GTK_COMBO_BOX( tool_list ), last_goto_tool ); + + GtkWidget *goto_label = gtk_label_new(_("Enter address or place name:")); + GtkWidget *goto_entry = ui_entry_new ( last_goto_str, GTK_ENTRY_ICON_SECONDARY ); + + // 'ok' when press return in the entry + g_signal_connect_swapped ( goto_entry, "activate", G_CALLBACK(a_dialog_response_accept), dialog ); + +#if GTK_CHECK_VERSION (2,20,0) + GtkWidget *search_button = gtk_dialog_get_widget_for_response ( GTK_DIALOG(dialog), GTK_RESPONSE_ACCEPT ); + text_changed_cb ( GTK_ENTRY(goto_entry), NULL, search_button ); + g_signal_connect ( goto_entry, "notify::text", G_CALLBACK(text_changed_cb), search_button ); +#endif + + GtkWidget *results_view = gtk_tree_view_new (); + GtkWidget *scroll_view = gtk_scrolled_window_new ( NULL, NULL ); + + gtk_widget_set_size_request( GTK_WIDGET(scroll_view), 0, 0 ); + + gtk_container_add ( GTK_CONTAINER(scroll_view), results_view ); + gtk_scrolled_window_set_policy ( GTK_SCROLLED_WINDOW(scroll_view), GTK_POLICY_AUTOMATIC, GTK_POLICY_AUTOMATIC ); + + GtkCellRenderer *desc_renderer = gtk_cell_renderer_text_new (); + gtk_tree_view_insert_column_with_attributes ( GTK_TREE_VIEW(results_view), + -1, + "Description", + desc_renderer, + "text", VIK_GOTO_SEARCH_DESC_COL, + NULL ); + + GtkTreeViewColumn *lat_col; + lat_col = gtk_tree_view_column_new_with_attributes ( "Latitude", + gtk_cell_renderer_text_new (), + "text", VIK_GOTO_SEARCH_LAT_COL, + NULL ); + gtk_tree_view_column_set_visible ( lat_col, FALSE ); + gtk_tree_view_append_column ( GTK_TREE_VIEW(results_view), lat_col ); + + GtkTreeViewColumn *lon_col; + lon_col = gtk_tree_view_column_new_with_attributes ( "Longitude", + gtk_cell_renderer_text_new (), + "text", VIK_GOTO_SEARCH_LON_COL, + NULL ); + gtk_tree_view_column_set_visible ( lon_col, FALSE ); + gtk_tree_view_append_column ( GTK_TREE_VIEW(results_view), lon_col ); + + struct VikGotoSearchWinData *win_data = g_malloc ( sizeof(struct VikGotoSearchWinData) ); + win_data->vw = vw; + win_data->vvp = vvp; + win_data->dialog = dialog; + win_data->goto_entry = GTK_ENTRY(goto_entry); + win_data->scroll_view = scroll_view; + win_data->results_view = GTK_TREE_VIEW(results_view); + win_data->tool_list = tool_list; + + GtkTreeSelection *selection = gtk_tree_view_get_selection ( GTK_TREE_VIEW(results_view) ); + gtk_tree_selection_set_select_function ( selection, vik_goto_search_list_select, win_data, NULL ); + + gtk_box_pack_start ( GTK_BOX(gtk_dialog_get_content_area(GTK_DIALOG(dialog))), tool_label, FALSE, FALSE, 5 ); + gtk_box_pack_start ( GTK_BOX(gtk_dialog_get_content_area(GTK_DIALOG(dialog))), tool_list, FALSE, FALSE, 5 ); + gtk_box_pack_start ( GTK_BOX(gtk_dialog_get_content_area(GTK_DIALOG(dialog))), goto_label, FALSE, FALSE, 5 ); + gtk_box_pack_start ( GTK_BOX(gtk_dialog_get_content_area(GTK_DIALOG(dialog))), goto_entry, FALSE, FALSE, 5 ); + gtk_box_pack_start ( GTK_BOX(gtk_dialog_get_content_area(GTK_DIALOG(dialog))), scroll_view, TRUE, TRUE, 5 ); + gtk_dialog_set_default_response ( GTK_DIALOG(dialog), GTK_RESPONSE_ACCEPT ); + g_signal_connect_swapped ( GTK_DIALOG(dialog), "response", G_CALLBACK(vik_goto_search_response), win_data ); + + gtk_widget_show_all ( dialog ); + // don't show the scroll view until we have something to show + gtk_widget_hide ( scroll_view ); + + // Ensure the text field has focus so we can start typing straight away + gtk_widget_grab_focus ( goto_entry ); + + gtk_widget_show ( dialog ); +} + +#define JSON_LATITUDE_PATTERN "\"geoplugin_latitude\":\"" +#define JSON_LONGITUDE_PATTERN "\"geoplugin_longitude\":\"" +#define JSON_CITY_PATTERN "\"geoplugin_city\":\"" +#define JSON_COUNTRY_PATTERN "\"geoplugin_countryName\":\"" + +/** + * Automatic attempt to find out where you are using: + * 1. http://www.geoplugin.com ++ + * 2. if not specific enough fallback to using the default goto tool with a country name + * ++ Using returned JSON information + * c.f. with googlesearch.c - similar implementation is used here + * + * returns: + * 0 if failed to locate anything + * 1 if exact latitude/longitude found + * 2 if position only as precise as a city + * 3 if position only as precise as a country + * @name: Contains the name of place found. Free this string after use. + */ +gint a_vik_goto_where_am_i ( VikViewport *vvp, struct LatLon *ll, gchar **name ) +{ + gint result = 0; + *name = NULL; + + gchar *tmpname = a_download_uri_to_tmp_file ( "http://www.geoplugin.net/json.gp", NULL ); + //gchar *tmpname = g_strdup ("../test/www.geoplugin.net-slash-json.gp.result"); + if (!tmpname) { + return result; + } + + ll->lat = 0.0; + ll->lon = 0.0; + + gchar *pat; + GMappedFile *mf; + gchar *ss; + gint fragment_len; + + gchar lat_buf[32], lon_buf[32]; + lat_buf[0] = lon_buf[0] = '\0'; + gchar *country = NULL; + gchar *city = NULL; + + if ((mf = g_mapped_file_new(tmpname, FALSE, NULL)) == NULL) { + g_critical(_("couldn't map temp file")); + goto tidy; + } + + gsize len = g_mapped_file_get_length(mf); + gchar *text = g_mapped_file_get_contents(mf); + + if ((pat = g_strstr_len(text, len, JSON_COUNTRY_PATTERN))) { + pat += strlen(JSON_COUNTRY_PATTERN); + fragment_len = 0; + ss = pat; + while (*pat != '"') { + fragment_len++; + pat++; + } + country = g_strndup(ss, fragment_len); + } + + if ((pat = g_strstr_len(text, len, JSON_CITY_PATTERN))) { + pat += strlen(JSON_CITY_PATTERN); + fragment_len = 0; + ss = pat; + while (*pat != '"') { + fragment_len++; + pat++; + } + city = g_strndup(ss, fragment_len); + } + + if ((pat = g_strstr_len(text, len, JSON_LATITUDE_PATTERN))) { + pat += strlen(JSON_LATITUDE_PATTERN); + ss = lat_buf; + if (*pat == '-') + *ss++ = *pat++; + while ((ss < (lat_buf + sizeof(lat_buf))) && (pat < (text + len)) && + (g_ascii_isdigit(*pat) || (*pat == '.'))) + *ss++ = *pat++; + *ss = '\0'; + ll->lat = g_ascii_strtod(lat_buf, NULL); + } + + if ((pat = g_strstr_len(text, len, JSON_LONGITUDE_PATTERN))) { + pat += strlen(JSON_LONGITUDE_PATTERN); + ss = lon_buf; + if (*pat == '-') + *ss++ = *pat++; + while ((ss < (lon_buf + sizeof(lon_buf))) && (pat < (text + len)) && + (g_ascii_isdigit(*pat) || (*pat == '.'))) + *ss++ = *pat++; + *ss = '\0'; + ll->lon = g_ascii_strtod(lon_buf, NULL); + } + + if ( ll->lat != 0.0 && ll->lon != 0.0 ) { + if ( ll->lat > -90.0 && ll->lat < 90.0 && ll->lon > -180.0 && ll->lon < 180.0 ) { + // Found a 'sensible' & 'precise' location + result = 1; + *name = g_strdup ( _("Locality") ); //Albeit maybe not known by an actual name! + } + } + else { + // Hopefully city name is unique enough to lookup position on + // For American places the service may append the State code on the end + // But if the country code is not appended if could easily get confused + // e.g. 'Portsmouth' could be at least + // Portsmouth, Hampshire, UK or + // Portsmouth, Viginia, USA. + + // Try city name lookup + if ( city ) { + g_debug ( "%s: found city %s", __FUNCTION__, city ); + if ( strcmp ( city, "(Unknown city)" ) != 0 ) { + VikCoord new_center; + if ( vik_goto_place ( NULL, vvp, city, &new_center ) ) { + // Got something + vik_coord_to_latlon ( &new_center, ll ); + result = 2; + *name = city; + goto tidy; + } + } + } + + // Try country name lookup + if ( country ) { + g_debug ( "%s: found country %s", __FUNCTION__, country ); + if ( strcmp ( country, "(Unknown Country)" ) != 0 ) { + VikCoord new_center; + if ( vik_goto_place ( NULL, vvp, country, &new_center ) ) { + // Finally got something + vik_coord_to_latlon ( &new_center, ll ); + result = 3; + *name = country; + goto tidy; + } + } + } + } + + tidy: + g_mapped_file_unref ( mf ); + (void)g_remove ( tmpname ); + g_free ( tmpname ); + return result; +} diff --git a/src/vikgoto.h b/src/vikgoto.h new file mode 100644 index 0000000..49019ae --- /dev/null +++ b/src/vikgoto.h @@ -0,0 +1,40 @@ +/* + * viking -- GPS Data and Topo Analyzer, Explorer, and Manager + * + * Copyright (C) 2003-2005, Evan Battaglia + * Copyright (C) 2009, Guilhem Bonnefille + * + * 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., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA + * + */ +#ifndef __VIK_SEARCH_H +#define __VIK_SEARCH_H + +#include "vikwindow.h" +#include "vikviewport.h" +#include "vikgototool.h" + +G_BEGIN_DECLS + +void vik_goto_register (VikGotoTool *tool); +void vik_goto_unregister_all (void); + +gint a_vik_goto_where_am_i ( VikViewport *vvp, struct LatLon *ll, gchar **name ); +void a_vik_goto(VikWindow *vw, VikViewport *vvp); +gchar * a_vik_goto_get_search_string_for_this_place(VikWindow *vw); + +G_END_DECLS + +#endif diff --git a/src/vikgototool.c b/src/vikgototool.c new file mode 100644 index 0000000..7e4aac3 --- /dev/null +++ b/src/vikgototool.c @@ -0,0 +1,319 @@ +/* + * viking -- GPS Data and Topo Analyzer, Explorer, and Manager + * + * Copyright (C) 2009, Guilhem Bonnefille + * + * 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., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA + * + */ + +#ifdef HAVE_CONFIG_H +#include "config.h" +#endif + +#include "vikgototool.h" +#include "util.h" + +#include + +#include +#include +#include + +static GObjectClass *parent_class; + +static void goto_tool_finalize ( GObject *gob ); +static gchar *goto_tool_get_label ( VikGotoTool *vw ); +static DownloadFileOptions *goto_tool_get_download_options ( VikGotoTool *self ); + +typedef struct _VikGotoToolPrivate VikGotoToolPrivate; + +struct _VikGotoToolPrivate +{ + gint id; + gchar *label; +}; + +#define GOTO_TOOL_GET_PRIVATE(o) (G_TYPE_INSTANCE_GET_PRIVATE ((o), \ + VIK_GOTO_TOOL_TYPE, \ + VikGotoToolPrivate)) + +G_DEFINE_ABSTRACT_TYPE (VikGotoTool, vik_goto_tool, G_TYPE_OBJECT) + +enum +{ + PROP_0, + + PROP_ID, + PROP_LABEL, +}; + +static void +goto_tool_set_property (GObject *object, + guint property_id, + const GValue *value, + GParamSpec *pspec) +{ + VikGotoTool *self = VIK_GOTO_TOOL (object); + VikGotoToolPrivate *priv = GOTO_TOOL_GET_PRIVATE (self); + + switch (property_id) + { + case PROP_ID: + priv->id = g_value_get_uint (value); + g_debug ("VikGotoTool.id: %d", priv->id); + break; + + case PROP_LABEL: + g_free (priv->label); + priv->label = g_value_dup_string (value); + g_debug ("VikGotoTool.label: %s", priv->label); + break; + + default: + /* We don't have any other property... */ + G_OBJECT_WARN_INVALID_PROPERTY_ID (object, property_id, pspec); + break; + } +} + +static void +goto_tool_get_property (GObject *object, + guint property_id, + GValue *value, + GParamSpec *pspec) +{ + VikGotoTool *self = VIK_GOTO_TOOL (object); + VikGotoToolPrivate *priv = GOTO_TOOL_GET_PRIVATE (self); + + switch (property_id) + { + case PROP_ID: + g_value_set_uint (value, priv->id); + break; + + case PROP_LABEL: + g_value_set_string (value, priv->label); + break; + + default: + /* We don't have any other property... */ + G_OBJECT_WARN_INVALID_PROPERTY_ID (object, property_id, pspec); + break; + } +} + +static void vik_goto_tool_class_init ( VikGotoToolClass *klass ) +{ + GObjectClass *gobject_class; + GParamSpec *pspec; + + gobject_class = G_OBJECT_CLASS (klass); + gobject_class->finalize = goto_tool_finalize; + gobject_class->set_property = goto_tool_set_property; + gobject_class->get_property = goto_tool_get_property; + + pspec = g_param_spec_string ("label", + "Label", + "Set the label", + "" /* default value */, + G_PARAM_CONSTRUCT_ONLY | G_PARAM_READWRITE); + g_object_class_install_property (gobject_class, + PROP_LABEL, + pspec); + + pspec = g_param_spec_uint ("id", + "Id of the tool", + "Set the id", + 0 /* minimum value */, + G_MAXUINT16 /* maximum value */, + 0 /* default value */, + G_PARAM_CONSTRUCT_ONLY | G_PARAM_READWRITE); + g_object_class_install_property (gobject_class, + PROP_ID, + pspec); + + klass->get_label = goto_tool_get_label; + klass->get_download_options = goto_tool_get_download_options; + + parent_class = g_type_class_peek_parent (klass); + + g_type_class_add_private (klass, sizeof (VikGotoToolPrivate)); +} + +VikGotoTool *vik_goto_tool_new () +{ + return VIK_GOTO_TOOL ( g_object_new ( VIK_GOTO_TOOL_TYPE, NULL ) ); +} + +static void vik_goto_tool_init ( VikGotoTool *self ) +{ + VikGotoToolPrivate *priv = GOTO_TOOL_GET_PRIVATE (self); + priv->label = NULL; +} + +static void goto_tool_finalize ( GObject *gob ) +{ + VikGotoToolPrivate *priv = GOTO_TOOL_GET_PRIVATE ( gob ); + g_free ( priv->label ); priv->label = NULL; + G_OBJECT_CLASS(parent_class)->finalize(gob); +} + +static gchar *goto_tool_get_label ( VikGotoTool *self ) +{ + VikGotoToolPrivate *priv = NULL; + priv = GOTO_TOOL_GET_PRIVATE (self); + return g_strdup ( priv->label ); +} + +static DownloadFileOptions *goto_tool_get_download_options ( VikGotoTool *self ) +{ + // Default: return NULL + return NULL; +} + +gchar *vik_goto_tool_get_label ( VikGotoTool *self ) +{ + return VIK_GOTO_TOOL_GET_CLASS( self )->get_label( self ); +} + +gchar *vik_goto_tool_get_url_format ( VikGotoTool *self ) +{ + return VIK_GOTO_TOOL_GET_CLASS( self )->get_url_format( self ); +} + +DownloadFileOptions *vik_goto_tool_get_download_options ( VikGotoTool *self ) +{ + return VIK_GOTO_TOOL_GET_CLASS( self )->get_download_options( self ); +} + +gboolean vik_goto_tool_parse_file_for_latlon (VikGotoTool *self, gchar *filename, struct LatLon *ll) +{ + return VIK_GOTO_TOOL_GET_CLASS( self )->parse_file_for_latlon( self, filename, ll ); +} + +gboolean vik_goto_tool_parse_file_for_candidates (VikGotoTool *self, gchar *filename, GList **candidates) +{ + return VIK_GOTO_TOOL_GET_CLASS( self )->parse_file_for_candidates( self, filename, candidates ); +} + +/** + * vik_goto_tool_get_coord: + * + * @self: The #VikGotoTool + * @vvp: The #VikViewport + * @srch_str: The string to search with + * @coord: Returns the top match position for a successful search + * + * Returns: An integer value indicating: + * 0 = search found something + * -1 = search place not found by the #VikGotoTool + * 1 = search unavailable in the #VikGotoTool due to communication issue + * + */ +int vik_goto_tool_get_coord ( VikGotoTool *self, VikWindow *vw, VikViewport *vvp, gchar *srch_str, VikCoord *coord ) +{ + gchar *tmpname; + gchar *uri; + gchar *escaped_srch_str; + int ret = 0; /* OK */ + struct LatLon ll; + + escaped_srch_str = g_uri_escape_string(srch_str, NULL, TRUE); + + uri = g_strdup_printf(vik_goto_tool_get_url_format(self), escaped_srch_str); + + tmpname = a_download_uri_to_tmp_file ( uri, vik_goto_tool_get_download_options(self) ); + + if ( !tmpname ) { + // Some kind of download error, so no tmp file + ret = 1; + goto done_no_file; + } + + if (!vik_goto_tool_parse_file_for_latlon(self, tmpname, &ll)) { + ret = -1; + goto done; + } + vik_coord_load_from_latlon ( coord, vik_viewport_get_coord_mode(vvp), &ll ); + +done: + (void)util_remove(tmpname); +done_no_file: + g_free(tmpname); + g_free(escaped_srch_str); + g_free(uri); + return ret; +} + +/** + * vik_goto_tool_get_candidates + * + * @self: The #VikGotoTool + * @vvp: The #VikViewport + * @srch_str: The string to search with + * @candidates: Returns a list of matches + * + * Returns: An integer value indicating: + * 0 = search found something + * -1 = search place not found by the #VikGotoTool + * 1 = search unavailable in the #VikGotoTool due to communication issue + * + */ +int vik_goto_tool_get_candidates ( VikGotoTool *self, VikWindow *vw, VikViewport *vvp, gchar *srch_str, GList **candidates ) +{ + gchar *tmpname; + gchar *uri; + gchar *escaped_srch_str; + int ret = 0; /* OK */ + + escaped_srch_str = g_uri_escape_string(srch_str, NULL, TRUE); + + uri = g_strdup_printf(vik_goto_tool_get_url_format(self), escaped_srch_str); + + tmpname = a_download_uri_to_tmp_file ( uri, vik_goto_tool_get_download_options(self) ); + + if ( !tmpname ) { + // Some kind of download error, so no tmp file + ret = 1; + goto done_no_file; + } + + g_debug("%s: %s", __FILE__, tmpname); + if (!vik_goto_tool_parse_file_for_candidates(self, tmpname, candidates)) { + ret = -1; + goto done; + } + +done: + (void)util_remove(tmpname); +done_no_file: + g_free(tmpname); + g_free(escaped_srch_str); + g_free(uri); + return ret; +} + +/** + * vik_goto_tool_free_candidates + * + * @data: The candidate object to free + */ +void vik_goto_tool_free_candidate ( gpointer data ) +{ + struct VikGotoCandidate *candidate = data; + g_free ( candidate->description ); + g_free ( candidate ); +} diff --git a/src/vikgototool.h b/src/vikgototool.h new file mode 100644 index 0000000..ad31092 --- /dev/null +++ b/src/vikgototool.h @@ -0,0 +1,73 @@ +/* + * viking -- GPS Data and Topo Analyzer, Explorer, and Manager + * + * Copyright (C) 2009, Guilhem Bonnefille + * + * 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., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA + * + */ +#ifndef _VIKING_GOTO_TOOL_H +#define _VIKING_GOTO_TOOL_H + +#include + +#include "vikwindow.h" +#include "download.h" + +G_BEGIN_DECLS + +#define VIK_GOTO_TOOL_TYPE (vik_goto_tool_get_type ()) +#define VIK_GOTO_TOOL(obj) (G_TYPE_CHECK_INSTANCE_CAST ((obj), VIK_GOTO_TOOL_TYPE, VikGotoTool)) +#define VIK_GOTO_TOOL_CLASS(klass) (G_TYPE_CHECK_CLASS_CAST ((klass), VIK_GOTO_TOOL_TYPE, VikGotoToolClass)) +#define IS_VIK_GOTO_TOOL(obj) (G_TYPE_CHECK_INSTANCE_TYPE ((obj), VIK_GOTO_TOOL_TYPE)) +#define IS_VIK_GOTO_TOOL_CLASS(klass) (G_TYPE_CHECK_CLASS_TYPE ((klass), VIK_GOTO_TOOL_TYPE)) +#define VIK_GOTO_TOOL_GET_CLASS(obj) (G_TYPE_INSTANCE_GET_CLASS ((obj), VIK_GOTO_TOOL_TYPE, VikGotoToolClass)) + + +typedef struct _VikGotoTool VikGotoTool; +typedef struct _VikGotoToolClass VikGotoToolClass; + +struct _VikGotoToolClass +{ + GObjectClass object_class; + gchar *(* get_label) (VikGotoTool *self); + gchar *(* get_url_format) (VikGotoTool *self); + DownloadFileOptions *(* get_download_options) (VikGotoTool *self); + gboolean (* parse_file_for_latlon) (VikGotoTool *self, gchar *filename, struct LatLon *ll); + gboolean (* parse_file_for_candidates) (VikGotoTool *self, gchar *filename, GList **candidates); +}; + +GType vik_goto_tool_get_type (); + +struct _VikGotoTool { + GObject obj; +}; + +struct VikGotoCandidate { + gchar *description; + struct LatLon ll; +}; + +gchar *vik_goto_tool_get_label ( VikGotoTool *self ); +gchar *vik_goto_tool_get_url_format ( VikGotoTool *self ); +DownloadFileOptions *vik_goto_tool_get_download_options ( VikGotoTool *self ); +gboolean vik_goto_tool_parse_file_for_latlon ( VikGotoTool *self, gchar *filename, struct LatLon *ll ); +int vik_goto_tool_get_coord ( VikGotoTool *self, VikWindow *vw, VikViewport *vvp, gchar *srch_str, VikCoord *coord ); +int vik_goto_tool_get_candidates ( VikGotoTool *self, VikWindow *vw, VikViewport *vvp, gchar *srch_str, GList **candidates ); +void vik_goto_tool_free_candidate ( gpointer candidate ); + +G_END_DECLS + +#endif diff --git a/src/vikgotoxmltool.c b/src/vikgotoxmltool.c new file mode 100644 index 0000000..6bf7e59 --- /dev/null +++ b/src/vikgotoxmltool.c @@ -0,0 +1,590 @@ +/* + * viking -- GPS Data and Topo Analyzer, Explorer, and Manager + * + * Copyright (C) 2003-2005, Evan Battaglia + * Copyright (C) 2009, Guilhem Bonnefille + * + * 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., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA + * + */ +#ifdef HAVE_CONFIG_H +#include "config.h" +#endif +#include +#include +#include +#ifdef HAVE_MATH_H +#include +#endif +#include +#include +#include +#include + +#include "viking.h" + +#include "vikgotoxmltool.h" + +static void vik_goto_xml_tool_finalize ( GObject *gob ); + +static gchar *vik_goto_xml_tool_get_url_format ( VikGotoTool *self ); +static gboolean vik_goto_xml_tool_parse_file(VikGotoTool *self, gchar *filename); +static gboolean vik_goto_xml_tool_parse_file_for_latlon(VikGotoTool *self, gchar *filename, struct LatLon *ll); +static gboolean vik_goto_xml_tool_parse_file_for_candidates(VikGotoTool *self, gchar *filename, GList **candidates); + +typedef struct _VikGotoXmlToolPrivate VikGotoXmlToolPrivate; + +struct _VikGotoXmlToolPrivate +{ + gchar *url_format; + gchar *lat_path; + gchar *lat_attr; + gchar *lon_path; + gchar *lon_attr; + gchar *desc_path; + gchar *desc_attr; + + struct LatLon ll; + gchar *description; + + // if not null, load in all candidates + GList **candidates; +}; + +#define GOTO_XML_TOOL_GET_PRIVATE(o) (G_TYPE_INSTANCE_GET_PRIVATE ((o), \ + VIK_GOTO_XML_TOOL_TYPE, \ + VikGotoXmlToolPrivate)) + +G_DEFINE_TYPE (VikGotoXmlTool, vik_goto_xml_tool, VIK_GOTO_TOOL_TYPE) + +enum +{ + PROP_0, + + PROP_URL_FORMAT, + PROP_LAT_PATH, + PROP_LAT_ATTR, + PROP_LON_PATH, + PROP_LON_ATTR, + PROP_DESC_PATH, + PROP_DESC_ATTR, +}; + +static void +vik_goto_xml_tool_set_property (GObject *object, + guint property_id, + const GValue *value, + GParamSpec *pspec) +{ + VikGotoXmlTool *self = VIK_GOTO_XML_TOOL (object); + VikGotoXmlToolPrivate *priv = GOTO_XML_TOOL_GET_PRIVATE (self); + gchar **splitted = NULL; + + switch (property_id) + { + case PROP_URL_FORMAT: + g_free (priv->url_format); + priv->url_format = g_value_dup_string (value); + break; + + case PROP_LAT_PATH: + splitted = g_strsplit (g_value_get_string (value), "@", 2); + g_free (priv->lat_path); + priv->lat_path = splitted[0]; + if (splitted[1]) + { + g_object_set (object, "lat-attr", splitted[1], NULL); + g_free (splitted[1]); + } + /* only free the tab, not the strings */ + g_free (splitted); + splitted = NULL; + break; + + case PROP_LAT_ATTR: + /* Avoid to overwrite XPATH value */ + /* NB: This disable future overwriting, + but as property is CONSTRUCT_ONLY there is no matter */ + if (!priv->lat_attr || g_value_get_string (value)) + { + g_free (priv->lat_attr); + priv->lat_attr = g_value_dup_string (value); + } + break; + + case PROP_LON_PATH: + splitted = g_strsplit (g_value_get_string (value), "@", 2); + g_free (priv->lon_path); + priv->lon_path = splitted[0]; + if (splitted[1]) + { + g_object_set (object, "lon-attr", splitted[1], NULL); + g_free (splitted[1]); + } + /* only free the tab, not the strings */ + g_free (splitted); + splitted = NULL; + break; + + case PROP_LON_ATTR: + /* Avoid to overwrite XPATH value */ + /* NB: This disable future overwriting, + but as property is CONSTRUCT_ONLY there is no matter */ + if (!priv->lon_attr || g_value_get_string (value)) + { + g_free (priv->lon_attr); + priv->lon_attr = g_value_dup_string (value); + } + break; + + case PROP_DESC_PATH: + splitted = g_strsplit (g_value_get_string (value), "@", 2); + g_free (priv->desc_path); + priv->desc_path = splitted[0]; + if (splitted[1]) + { + g_object_set (object, "desc-attr", splitted[1], NULL); + g_free (splitted[1]); + } + /* only free the tab, not the strings */ + g_free (splitted); + splitted = NULL; + break; + + case PROP_DESC_ATTR: + /* Avoid to overwrite XPATH value */ + /* NB: This disable future overwriting, + but as property is CONSTRUCT_ONLY there is no matter */ + if (!priv->desc_attr || g_value_get_string (value)) + { + g_free (priv->desc_attr); + priv->desc_attr = g_value_dup_string (value); + } + break; + + default: + /* We don't have any other property... */ + G_OBJECT_WARN_INVALID_PROPERTY_ID (object, property_id, pspec); + break; + } +} + +static void +vik_goto_xml_tool_get_property (GObject *object, + guint property_id, + GValue *value, + GParamSpec *pspec) +{ + VikGotoXmlTool *self = VIK_GOTO_XML_TOOL (object); + VikGotoXmlToolPrivate *priv = GOTO_XML_TOOL_GET_PRIVATE (self); + + switch (property_id) + { + case PROP_URL_FORMAT: + g_value_set_string (value, priv->url_format); + break; + + case PROP_LAT_PATH: + g_value_set_string (value, priv->lat_path); + break; + + case PROP_LAT_ATTR: + g_value_set_string (value, priv->lat_attr); + break; + + case PROP_LON_PATH: + g_value_set_string (value, priv->lon_path); + break; + + case PROP_LON_ATTR: + g_value_set_string (value, priv->lon_attr); + break; + + case PROP_DESC_PATH: + g_value_set_string (value, priv->desc_path); + break; + + case PROP_DESC_ATTR: + g_value_set_string (value, priv->desc_attr); + break; + + default: + /* We don't have any other property... */ + G_OBJECT_WARN_INVALID_PROPERTY_ID (object, property_id, pspec); + break; + } +} + +static void +vik_goto_xml_tool_class_init ( VikGotoXmlToolClass *klass ) +{ + GObjectClass *object_class; + VikGotoToolClass *parent_class; + GParamSpec *pspec; + + object_class = G_OBJECT_CLASS (klass); + + object_class->finalize = vik_goto_xml_tool_finalize; + object_class->set_property = vik_goto_xml_tool_set_property; + object_class->get_property = vik_goto_xml_tool_get_property; + + + pspec = g_param_spec_string ("url-format", + "URL format", + "The format of the URL", + "" /* default value */, + G_PARAM_CONSTRUCT_ONLY | G_PARAM_READWRITE); + g_object_class_install_property (object_class, + PROP_URL_FORMAT, + pspec); + + pspec = g_param_spec_string ("lat-path", + "Latitude path", + "XPath of the latitude", + "" /* default value */, + G_PARAM_CONSTRUCT_ONLY | G_PARAM_READWRITE); + g_object_class_install_property (object_class, + PROP_LAT_PATH, + pspec); + + pspec = g_param_spec_string ("lat-attr", + "Latitude attribute", + "XML attribute of the latitude", + NULL /* default value */, + G_PARAM_CONSTRUCT_ONLY | G_PARAM_READWRITE); + g_object_class_install_property (object_class, + PROP_LAT_ATTR, + pspec); + + pspec = g_param_spec_string ("lon-path", + "Longitude path", + "XPath of the longitude", + "" /* default value */, + G_PARAM_CONSTRUCT_ONLY | G_PARAM_READWRITE); + g_object_class_install_property (object_class, + PROP_LON_PATH, + pspec); + + pspec = g_param_spec_string ("lon-attr", + "Longitude attribute", + "XML attribute of the longitude", + NULL /* default value */, + G_PARAM_CONSTRUCT_ONLY | G_PARAM_READWRITE); + g_object_class_install_property (object_class, + PROP_LON_ATTR, + pspec); + + pspec = g_param_spec_string ("desc-path", + "Description path", + "XPath of the description", + "" /* default value */, + G_PARAM_CONSTRUCT_ONLY | G_PARAM_READWRITE); + g_object_class_install_property (object_class, + PROP_DESC_PATH, + pspec); + + pspec = g_param_spec_string ("desc-attr", + "Description attribute", + "XML attribute of the description", + NULL /* default value */, + G_PARAM_CONSTRUCT_ONLY | G_PARAM_READWRITE); + g_object_class_install_property (object_class, + PROP_DESC_ATTR, + pspec); + + parent_class = VIK_GOTO_TOOL_CLASS (klass); + + parent_class->get_url_format = vik_goto_xml_tool_get_url_format; + parent_class->parse_file_for_latlon = vik_goto_xml_tool_parse_file_for_latlon; + parent_class->parse_file_for_candidates = vik_goto_xml_tool_parse_file_for_candidates; + + g_type_class_add_private (klass, sizeof (VikGotoXmlToolPrivate)); +} + +VikGotoXmlTool * +vik_goto_xml_tool_new () +{ + return VIK_GOTO_XML_TOOL ( g_object_new ( VIK_GOTO_XML_TOOL_TYPE, "label", "Google", NULL ) ); +} + +static void +vik_goto_xml_tool_init ( VikGotoXmlTool *self ) +{ + VikGotoXmlToolPrivate *priv = GOTO_XML_TOOL_GET_PRIVATE (self); + priv->url_format = NULL; + priv->lat_path = NULL; + priv->lat_attr = NULL; + priv->lon_path = NULL; + priv->lon_attr = NULL; + priv->desc_path = NULL; + priv->desc_attr = NULL; + // + priv->ll.lat = NAN; + priv->ll.lon = NAN; + priv->description = NULL; + priv->candidates = NULL; +} + +static void +vik_goto_xml_tool_finalize ( GObject *gob ) +{ + G_OBJECT_GET_CLASS(gob)->finalize(gob); +} + +static gboolean +stack_is_path (const GSList *stack, + const gchar *path) +{ + gboolean equal = TRUE; + int stack_len = g_list_length((GList *)stack); + int i = 0; + i = stack_len - 1; + while (equal == TRUE && i >= 0) + { + if (*path != '/') + equal = FALSE; + else + path++; + const gchar *current = g_list_nth_data((GList *)stack, i); + size_t len = strlen(current); + if (strncmp(path, current, len) != 0 ) + equal = FALSE; + else + { + path += len; + } + i--; + } + if (*path != '\0') + equal = FALSE; + return equal; +} + +/* If a complete entry has been found and we want to get all candidates, + * then move it to the candidate list */ +static void +vik_goto_xml_tool_process_if_complete(VikGotoXmlToolPrivate *priv) +{ + if(!isnan(priv->ll.lon) && + !isnan(priv->ll.lat) && + priv->description != NULL && + priv->candidates != NULL) + { + struct VikGotoCandidate *cand = g_malloc(sizeof(struct VikGotoCandidate)); + cand->ll.lon = priv->ll.lon; + cand->ll.lat = priv->ll.lat; + cand->description = priv->description; + *priv->candidates = g_list_prepend(*priv->candidates, cand); + + priv->ll.lon = NAN; + priv->ll.lat = NAN; + priv->description = NULL; + } +} + +/* Called for open tags */ +static void +_start_element (GMarkupParseContext *context, + const gchar *element_name, + const gchar **attribute_names, + const gchar **attribute_values, + gpointer user_data, + GError **error) +{ + VikGotoXmlTool *self = VIK_GOTO_XML_TOOL (user_data); + VikGotoXmlToolPrivate *priv = GOTO_XML_TOOL_GET_PRIVATE (self); + const GSList *stack = g_markup_parse_context_get_element_stack (context); + /* Longitude */ + if (priv->lon_attr != NULL && isnan(priv->ll.lon) && stack_is_path (stack, priv->lon_path)) + { + int i=0; + while (attribute_names[i] != NULL) + { + if (strcmp (attribute_names[i], priv->lon_attr) == 0) + { + priv->ll.lon = g_ascii_strtod(attribute_values[i], NULL); + } + i++; + } + } + /* Latitude */ + if (priv->lat_attr != NULL && isnan(priv->ll.lat) && stack_is_path (stack, priv->lat_path)) + { + int i=0; + while (attribute_names[i] != NULL) + { + if (strcmp (attribute_names[i], priv->lat_attr) == 0) + { + priv->ll.lat = g_ascii_strtod(attribute_values[i], NULL); + } + i++; + } + } + /* Description */ + if (priv->desc_attr != NULL && priv->description == NULL && stack_is_path (stack, priv->desc_path)) + { + int i=0; + while (attribute_names[i] != NULL) + { + if (strcmp (attribute_names[i], priv->desc_attr) == 0) + { + priv->description = g_strdup(attribute_values[i]); + } + i++; + } + } + + vik_goto_xml_tool_process_if_complete(priv); +} + +/* Called for character data */ +/* text is not nul-terminated */ +static void +_text (GMarkupParseContext *context, + const gchar *text, + gsize text_len, + gpointer user_data, + GError **error) +{ + VikGotoXmlTool *self = VIK_GOTO_XML_TOOL (user_data); + VikGotoXmlToolPrivate *priv = GOTO_XML_TOOL_GET_PRIVATE (self); + const GSList *stack = g_markup_parse_context_get_element_stack (context); + gchar *textl = g_strndup(text, text_len); + /* Store only first result */ + if (priv->lat_attr == NULL && isnan(priv->ll.lat) && stack_is_path (stack, priv->lat_path)) + { + priv->ll.lat = g_ascii_strtod(textl, NULL); + } + if (priv->lon_attr == NULL && isnan(priv->ll.lon) && stack_is_path (stack, priv->lon_path)) + { + priv->ll.lon = g_ascii_strtod(textl, NULL); + } + if (priv->desc_attr == NULL && priv->description == NULL && stack_is_path (stack, priv->desc_path)) + { + priv->description = g_strdup(textl); + } + + vik_goto_xml_tool_process_if_complete(priv); + + g_free(textl); +} + +static gboolean +vik_goto_xml_tool_parse_file(VikGotoTool *self, gchar *filename) +{ + g_debug("Parse %s\n", filename); + GMarkupParser xml_parser; + GMarkupParseContext *xml_context = NULL; + GError *error = NULL; + VikGotoXmlToolPrivate *priv = GOTO_XML_TOOL_GET_PRIVATE (self); + g_return_val_if_fail(priv != NULL, FALSE); + + g_debug ("%s: %s@%s, %s@%s, %s@%s", + __FUNCTION__, + priv->lat_path, priv->lat_attr, + priv->lon_path, priv->lon_attr, + priv->desc_path, priv->desc_attr); + + FILE *file = g_fopen (filename, "r"); + if (file == NULL) + /* TODO emit warning */ + return FALSE; + + /* setup context parse (ie callbacks) */ + if (priv->lat_attr != NULL || priv->lon_attr != NULL) + // At least one coordinate uses an attribute + xml_parser.start_element = &_start_element; + else + xml_parser.start_element = NULL; + xml_parser.end_element = NULL; + if (priv->lat_attr == NULL || priv->lon_attr == NULL) + // At least one coordinate uses a raw element + xml_parser.text = &_text; + else + xml_parser.text = NULL; + xml_parser.passthrough = NULL; + xml_parser.error = NULL; + + xml_context = g_markup_parse_context_new(&xml_parser, 0, self, NULL); + + /* setup result */ + priv->ll.lat = NAN; + priv->ll.lon = NAN; + + gchar buff[BUFSIZ]; + size_t nb; + while (xml_context && + (nb = fread (buff, sizeof(gchar), BUFSIZ, file)) > 0) + { + if (!g_markup_parse_context_parse(xml_context, buff, nb, &error)) + { + fprintf(stderr, "%s: parsing error: %s.\n", + __FUNCTION__, error->message); + g_markup_parse_context_free(xml_context); + xml_context = NULL; + } + g_clear_error (&error); + } + /* cleanup */ + if (xml_context && + !g_markup_parse_context_end_parse(xml_context, &error)) + fprintf(stderr, "%s: errors occurred while reading file: %s.\n", + __FUNCTION__, error->message); + g_clear_error (&error); + + if (xml_context) + g_markup_parse_context_free(xml_context); + xml_context = NULL; + fclose (file); + + return TRUE; +} + +static gboolean +vik_goto_xml_tool_parse_file_for_latlon(VikGotoTool *self, gchar *filename, struct LatLon *ll) +{ + if (!vik_goto_xml_tool_parse_file(self, filename)) + return FALSE; + + VikGotoXmlToolPrivate *priv = GOTO_XML_TOOL_GET_PRIVATE (self); + + if (ll != NULL) + { + *ll = priv->ll; + } + + if (isnan(priv->ll.lat) || isnan(priv->ll.lat)) + /* At least one coordinate not found */ + return FALSE; + else + return TRUE; +} + +static gboolean +vik_goto_xml_tool_parse_file_for_candidates(VikGotoTool *self, gchar *filename, GList **candidates) +{ + VikGotoXmlToolPrivate *priv = GOTO_XML_TOOL_GET_PRIVATE (self); + priv->candidates = candidates; + + return vik_goto_xml_tool_parse_file(self, filename); +} + +static gchar * +vik_goto_xml_tool_get_url_format ( VikGotoTool *self ) +{ + VikGotoXmlToolPrivate *priv = GOTO_XML_TOOL_GET_PRIVATE (self); + g_return_val_if_fail(priv != NULL, NULL); + return priv->url_format; +} diff --git a/src/vikgotoxmltool.h b/src/vikgotoxmltool.h new file mode 100644 index 0000000..7a68d5b --- /dev/null +++ b/src/vikgotoxmltool.h @@ -0,0 +1,59 @@ +/* + * viking -- GPS Data and Topo Analyzer, Explorer, and Manager + * + * Copyright (C) 2003-2005, Evan Battaglia + * Copyright (C) 2009, Guilhem Bonnefille + * + * 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., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA + * + */ +#ifndef __VIK_GOTO_XML_TOOL_H +#define __VIK_GOTO_XML_TOOL_H + +#include + +#include "vikwindow.h" + +#include "vikgototool.h" + +G_BEGIN_DECLS + +#define VIK_GOTO_XML_TOOL_TYPE (vik_goto_xml_tool_get_type ()) +#define VIK_GOTO_XML_TOOL(obj) (G_TYPE_CHECK_INSTANCE_CAST ((obj), VIK_GOTO_XML_TOOL_TYPE, VikGotoXmlTool)) +#define VIK_GOTO_XML_TOOL_CLASS(klass) (G_TYPE_CHECK_CLASS_CAST ((klass), VIK_GOTO_XML_TOOL_TYPE, VikGotoXmlToolClass)) +#define IS_VIK_GOTO_XML_TOOL(obj) (G_TYPE_CHECK_INSTANCE_TYPE ((obj), VIK_GOTO_XML_TOOL_TYPE)) +#define IS_VIK_GOTO_XML_TOOL_CLASS(klass) (G_TYPE_CHECK_CLASS_TYPE ((klass), VIK_GOTO_XML_TOOL_TYPE)) +#define VIK_GOTO_XML_TOOL_GET_CLASS(obj) (G_TYPE_INSTANCE_GET_CLASS ((obj), VIK_GOTO_XML_TOOL_TYPE, VikGotoXmlToolClass)) + + +typedef struct _VikGotoXmlTool VikGotoXmlTool; +typedef struct _VikGotoXmlToolClass VikGotoXmlToolClass; + +struct _VikGotoXmlToolClass +{ + VikGotoToolClass object_class; +}; + +GType vik_goto_xml_tool_get_type (); + +struct _VikGotoXmlTool { + VikGotoTool obj; +}; + +VikGotoXmlTool *vik_goto_xml_tool_new (); + +G_END_DECLS + +#endif diff --git a/src/vikgpslayer.c b/src/vikgpslayer.c new file mode 100644 index 0000000..e7de267 --- /dev/null +++ b/src/vikgpslayer.c @@ -0,0 +1,2088 @@ +/* + * viking -- GPS Data and Topo Analyzer, Explorer, and Manager + * + * Copyright (C) 2003-2005, Evan Battaglia + * Copyright (C) 2006-2008, Quy Tonthat + * Copyright (C) 2016, Rob Norris + * + * 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., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA + * + */ + +#ifdef HAVE_CONFIG_H +#include "config.h" +#endif + +#include +#ifdef HAVE_MATH_H +#include +#endif +#include "viking.h" +#include "icons/icons.h" +#include "babel.h" +#include "viktrwlayer.h" + +#ifdef HAVE_UNISTD_H +#include +#endif +#ifdef HAVE_STRING_H +#include +#endif +#include +#include +#include +#ifdef VIK_CONFIG_REALTIME_GPS_TRACKING +#include +#endif + +static VikGpsLayer *vik_gps_layer_create (VikViewport *vp); +static void vik_gps_layer_realize ( VikGpsLayer *vgl, VikTreeview *vt, GtkTreeIter *layer_iter ); +static void vik_gps_layer_free ( VikGpsLayer *vgl ); +static void vik_gps_layer_draw ( VikGpsLayer *vgl, VikViewport *vp ); +static VikGpsLayer *vik_gps_layer_new ( VikViewport *vp ); +static void vik_gps_layer_post_read ( VikGpsLayer *vgl, VikViewport *vp, gboolean from_file ); + +static void gps_layer_marshall( VikGpsLayer *vgl, guint8 **data, guint *len ); +static VikGpsLayer *gps_layer_unmarshall( guint8 *data, guint len, VikViewport *vvp ); +static gboolean gps_layer_set_param ( VikGpsLayer *vgl, VikLayerSetParam *vlsp ); +static VikLayerParamData gps_layer_get_param ( VikGpsLayer *vgl, guint16 id, gboolean is_file_operation ); + +static const gchar* gps_layer_tooltip ( VikGpsLayer *vgl ); + +static void gps_layer_change_coord_mode ( VikGpsLayer *vgl, VikCoordMode mode ); +static void gps_layer_add_menu_items( VikGpsLayer *vtl, GtkMenu *menu, gpointer vlp ); + +static void gps_upload_cb( gpointer layer_and_vlp[2] ); +static void gps_download_cb( gpointer layer_and_vlp[2] ); +static void gps_empty_upload_cb( gpointer layer_and_vlp[2] ); +static void gps_empty_download_cb( gpointer layer_and_vlp[2] ); +static void gps_empty_all_cb( gpointer layer_and_vlp[2] ); +#if defined (VIK_CONFIG_REALTIME_GPS_TRACKING) && defined (GPSD_API_MAJOR_VERSION) +static void gps_empty_realtime_cb( gpointer layer_and_vlp[2] ); +static void gps_start_stop_tracking_cb( gpointer layer_and_vlp[2] ); +static void realtime_tracking_draw(VikGpsLayer *vgl, VikViewport *vp); +static void rt_gpsd_disconnect(VikGpsLayer *vgl); +static gboolean rt_gpsd_connect(VikGpsLayer *vgl, gboolean ask_if_failed); +#endif + +// Shouldn't need to use these much any more as the protocol is now saved as a string. +// They are kept for compatibility loading old .vik files +typedef enum {GARMIN_P = 0, MAGELLAN_P, DELORME_P, NAVILINK_P, OLD_NUM_PROTOCOLS} vik_gps_proto; +static gchar * protocols_args[] = {"garmin", "magellan", "delbin", "navilink", NULL}; +#ifdef WINDOWS +static gchar * params_ports[] = {"com1", "usb:", NULL}; +#else +static gchar * params_ports[] = {"/dev/ttyS0", "/dev/ttyS1", "/dev/ttyUSB0", "/dev/ttyUSB1", "usb:", NULL}; +#endif +/* NUM_PORTS not actually used */ +/* #define NUM_PORTS (sizeof(params_ports)/sizeof(params_ports[0]) - 1) */ +/* Compatibility with previous versions */ +#ifdef WINDOWS +static gchar * old_params_ports[] = {"com1", "usb:", NULL}; +#else +static gchar * old_params_ports[] = {"/dev/ttyS0", "/dev/ttyS1", "/dev/ttyUSB0", "/dev/ttyUSB1", "usb:", NULL}; +#endif +#define OLD_NUM_PORTS (sizeof(old_params_ports)/sizeof(old_params_ports[0]) - 1) + +typedef struct { + GMutex *mutex; + gboolean ok; + gboolean thread_complete; + vik_gps_dir direction; + gchar *port; + gint wpt_total_count; + gint wpt_count; + gint trk_total_count; + gint trk_count; + gint rte_total_count; + gint rte_count; + VikTrwLayer *vtl; + VikTrack *track; + gchar *babelargs; + GtkWidget *dialog; + GtkWidget *status_label; + GtkWidget *gps_label; + GtkWidget *wpt_label; + GtkWidget *trk_label; + GtkWidget *rte_label; + vik_gps_xfer_type progress_type; + gboolean result; + gchar *info; + // GUI Updates + gint id_status_working; + gint id_status_end; + gint id_info; + gint id_total_count; + gint id_count; + VikViewport *vvp; +#if defined (VIK_CONFIG_REALTIME_GPS_TRACKING) && defined (GPSD_API_MAJOR_VERSION) + gboolean realtime_tracking; +#endif +} GpsSession; +static void gps_session_delete(GpsSession *sess); + +static gchar *params_groups[] = { + N_("Data Mode"), +#if defined (VIK_CONFIG_REALTIME_GPS_TRACKING) && defined (GPSD_API_MAJOR_VERSION) + N_("Realtime Tracking Mode"), +#endif +}; + +enum {GROUP_DATA_MODE, GROUP_REALTIME_MODE}; + + +static VikLayerParamData gps_protocol_default ( void ) +{ + VikLayerParamData data; + data.s = g_strdup ( "garmin" ); + return data; +} + +static VikLayerParamData gps_port_default ( void ) +{ + VikLayerParamData data; + data.s = g_strdup ( "usb:" ); +#ifndef WINDOWS + /* Attempt to auto set default USB serial port entry */ + /* Ordered to make lowest device favourite if available */ + if (g_access ("/dev/ttyUSB1", R_OK) == 0) { + if ( data.s ) + g_free ( (gchar *)data.s ); + data.s = g_strdup ("/dev/ttyUSB1"); + } + if (g_access ("/dev/ttyUSB0", R_OK) == 0) { + if ( data.s ) + g_free ( (gchar *)data.s ); + data.s = g_strdup ("/dev/ttyUSB0"); + } +#endif + return data; +} + +#if defined (VIK_CONFIG_REALTIME_GPS_TRACKING) && defined (GPSD_API_MAJOR_VERSION) +static gchar *params_vehicle_position[] = { + N_("Keep vehicle at center"), + N_("Keep vehicle on screen"), + N_("Disable"), + NULL +}; +enum { + VEHICLE_POSITION_CENTERED = 0, + VEHICLE_POSITION_ON_SCREEN, + VEHICLE_POSITION_NONE, +}; + +static VikLayerParamData moving_map_method_default ( void ) { return VIK_LPD_UINT ( VEHICLE_POSITION_ON_SCREEN ); } + +static VikLayerParamData gpsd_host_default ( void ) +{ + VikLayerParamData data; + data.s = g_strdup ( "localhost" ); + return data; +} + +static VikLayerParamData gpsd_port_default ( void ) +{ + VikLayerParamData data; + data.s = g_strdup ( DEFAULT_GPSD_PORT ); + return data; +} + +static VikLayerParamData gpsd_retry_interval_default ( void ) +{ + VikLayerParamData data; + data.s = g_strdup ( "10" ); + return data; +} + +#endif + +static VikLayerParam gps_layer_params[] = { + // NB gps_layer_inst_init() is performed after parameter registeration + // thus to give the protocols some potential values use the old static list + // TODO: find another way to use gps_layer_inst_init()? + { VIK_LAYER_GPS, "gps_protocol", VIK_LAYER_PARAM_STRING, GROUP_DATA_MODE, N_("GPS Protocol:"), VIK_LAYER_WIDGET_COMBOBOX, protocols_args, NULL, NULL, gps_protocol_default, NULL, NULL }, // List reassigned at runtime + { VIK_LAYER_GPS, "gps_port", VIK_LAYER_PARAM_STRING, GROUP_DATA_MODE, N_("Serial Port:"), VIK_LAYER_WIDGET_COMBOBOX, params_ports, NULL, NULL, gps_port_default, NULL, NULL }, + { VIK_LAYER_GPS, "gps_download_tracks", VIK_LAYER_PARAM_BOOLEAN, GROUP_DATA_MODE, N_("Download Tracks:"), VIK_LAYER_WIDGET_CHECKBUTTON, NULL, NULL, NULL, vik_lpd_true_default, NULL, NULL }, + { VIK_LAYER_GPS, "gps_upload_tracks", VIK_LAYER_PARAM_BOOLEAN, GROUP_DATA_MODE, N_("Upload Tracks:"), VIK_LAYER_WIDGET_CHECKBUTTON, NULL, NULL, NULL, vik_lpd_true_default, NULL, NULL }, + { VIK_LAYER_GPS, "gps_download_routes", VIK_LAYER_PARAM_BOOLEAN, GROUP_DATA_MODE, N_("Download Routes:"), VIK_LAYER_WIDGET_CHECKBUTTON, NULL, NULL, NULL, vik_lpd_true_default, NULL, NULL }, + { VIK_LAYER_GPS, "gps_upload_routes", VIK_LAYER_PARAM_BOOLEAN, GROUP_DATA_MODE, N_("Upload Routes:"), VIK_LAYER_WIDGET_CHECKBUTTON, NULL, NULL, NULL, vik_lpd_true_default, NULL, NULL }, + { VIK_LAYER_GPS, "gps_download_waypoints", VIK_LAYER_PARAM_BOOLEAN, GROUP_DATA_MODE, N_("Download Waypoints:"), VIK_LAYER_WIDGET_CHECKBUTTON, NULL, NULL, NULL, vik_lpd_true_default, NULL, NULL }, + { VIK_LAYER_GPS, "gps_upload_waypoints", VIK_LAYER_PARAM_BOOLEAN, GROUP_DATA_MODE, N_("Upload Waypoints:"), VIK_LAYER_WIDGET_CHECKBUTTON, NULL, NULL, NULL, vik_lpd_true_default, NULL, NULL }, +#if defined (VIK_CONFIG_REALTIME_GPS_TRACKING) && defined (GPSD_API_MAJOR_VERSION) + { VIK_LAYER_GPS, "record_tracking", VIK_LAYER_PARAM_BOOLEAN, GROUP_REALTIME_MODE, N_("Recording tracks"), VIK_LAYER_WIDGET_CHECKBUTTON, NULL, NULL, NULL, vik_lpd_true_default, NULL, NULL }, + { VIK_LAYER_GPS, "center_start_tracking", VIK_LAYER_PARAM_BOOLEAN, GROUP_REALTIME_MODE, N_("Jump to current position on start"), VIK_LAYER_WIDGET_CHECKBUTTON, NULL, NULL, NULL, vik_lpd_false_default, NULL, NULL }, + { VIK_LAYER_GPS, "moving_map_method", VIK_LAYER_PARAM_UINT, GROUP_REALTIME_MODE, N_("Moving Map Method:"), VIK_LAYER_WIDGET_RADIOGROUP_STATIC, params_vehicle_position, NULL, NULL, moving_map_method_default, NULL, NULL }, + { VIK_LAYER_GPS, "realtime_update_statusbar", VIK_LAYER_PARAM_BOOLEAN, GROUP_REALTIME_MODE, N_("Update Statusbar:"), VIK_LAYER_WIDGET_CHECKBUTTON, NULL, NULL, N_("Display information in the statusbar on GPS updates"), vik_lpd_true_default, NULL, NULL }, + { VIK_LAYER_GPS, "auto_connect", VIK_LAYER_PARAM_BOOLEAN, GROUP_REALTIME_MODE, N_("Auto Connect"), VIK_LAYER_WIDGET_CHECKBUTTON, NULL, NULL, N_("Automatically connect to GPSD"), vik_lpd_false_default, NULL, NULL }, + { VIK_LAYER_GPS, "gpsd_host", VIK_LAYER_PARAM_STRING, GROUP_REALTIME_MODE, N_("Gpsd Host:"), VIK_LAYER_WIDGET_ENTRY, NULL, NULL, NULL, gpsd_host_default, NULL, NULL }, + { VIK_LAYER_GPS, "gpsd_port", VIK_LAYER_PARAM_STRING, GROUP_REALTIME_MODE, N_("Gpsd Port:"), VIK_LAYER_WIDGET_ENTRY, NULL, NULL, NULL, gpsd_port_default, NULL, NULL }, + { VIK_LAYER_GPS, "gpsd_retry_interval", VIK_LAYER_PARAM_STRING, GROUP_REALTIME_MODE, N_("Gpsd Retry Interval (seconds):"), VIK_LAYER_WIDGET_ENTRY, NULL, NULL, NULL, gpsd_retry_interval_default, NULL, NULL }, +#endif /* VIK_CONFIG_REALTIME_GPS_TRACKING */ +}; +enum { + PARAM_PROTOCOL=0, PARAM_PORT, + PARAM_DOWNLOAD_TRACKS, PARAM_UPLOAD_TRACKS, + PARAM_DOWNLOAD_ROUTES, PARAM_UPLOAD_ROUTES, + PARAM_DOWNLOAD_WAYPOINTS, PARAM_UPLOAD_WAYPOINTS, +#if defined (VIK_CONFIG_REALTIME_GPS_TRACKING) && defined (GPSD_API_MAJOR_VERSION) + PARAM_REALTIME_REC, + PARAM_REALTIME_CENTER_START, + PARAM_VEHICLE_POSITION, + PARAM_REALTIME_UPDATE_STATUSBAR, + PARAM_GPSD_CONNECT, + PARAM_GPSD_HOST, + PARAM_GPSD_PORT, + PARAM_GPSD_RETRY_INTERVAL, +#endif /* VIK_CONFIG_REALTIME_GPS_TRACKING */ + NUM_PARAMS}; + +VikLayerInterface vik_gps_layer_interface = { + "GPS", + N_("GPS"), + NULL, + &vikgpslayer_pixbuf, + + NULL, + 0, + + gps_layer_params, + NUM_PARAMS, + params_groups, + sizeof(params_groups)/sizeof(params_groups[0]), + + VIK_MENU_ITEM_ALL, + + (VikLayerFuncCreate) vik_gps_layer_create, + (VikLayerFuncRealize) vik_gps_layer_realize, + (VikLayerFuncPostRead) vik_gps_layer_post_read, + (VikLayerFuncFree) vik_gps_layer_free, + + (VikLayerFuncProperties) NULL, + (VikLayerFuncDraw) vik_gps_layer_draw, + (VikLayerFuncChangeCoordMode) gps_layer_change_coord_mode, + + (VikLayerFuncGetTimestamp) NULL, + + (VikLayerFuncSetMenuItemsSelection) NULL, + (VikLayerFuncGetMenuItemsSelection) NULL, + + (VikLayerFuncAddMenuItems) gps_layer_add_menu_items, + (VikLayerFuncSublayerAddMenuItems) NULL, + + (VikLayerFuncSublayerRenameRequest) NULL, + (VikLayerFuncSublayerToggleVisible) NULL, + (VikLayerFuncSublayerTooltip) NULL, + (VikLayerFuncLayerTooltip) gps_layer_tooltip, + (VikLayerFuncLayerSelected) NULL, + + (VikLayerFuncMarshall) gps_layer_marshall, + (VikLayerFuncUnmarshall) gps_layer_unmarshall, + + (VikLayerFuncSetParam) gps_layer_set_param, + (VikLayerFuncGetParam) gps_layer_get_param, + (VikLayerFuncChangeParam) NULL, + + (VikLayerFuncReadFileData) NULL, + (VikLayerFuncWriteFileData) NULL, + + (VikLayerFuncDeleteItem) NULL, + (VikLayerFuncCutItem) NULL, + (VikLayerFuncCopyItem) NULL, + (VikLayerFuncPasteItem) NULL, + (VikLayerFuncFreeCopiedItem) NULL, + (VikLayerFuncDragDropRequest) NULL, + + (VikLayerFuncSelectClick) NULL, + (VikLayerFuncSelectMove) NULL, + (VikLayerFuncSelectRelease) NULL, + (VikLayerFuncSelectedViewportMenu) NULL, +}; + +enum {TRW_DOWNLOAD=0, TRW_UPLOAD, +#if defined (VIK_CONFIG_REALTIME_GPS_TRACKING) && defined (GPSD_API_MAJOR_VERSION) + TRW_REALTIME, +#endif + NUM_TRW}; +static gchar * trw_names[] = { + N_("GPS Download"), N_("GPS Upload"), +#if defined (VIK_CONFIG_REALTIME_GPS_TRACKING) && defined (GPSD_API_MAJOR_VERSION) + N_("GPS Realtime Tracking"), +#endif +}; + +#if defined (VIK_CONFIG_REALTIME_GPS_TRACKING) && defined (GPSD_API_MAJOR_VERSION) +typedef struct { + struct gps_data_t gpsd; + VikGpsLayer *vgl; + int gpsd_open; +} VglGpsd; + +typedef struct { + struct gps_fix_t fix; + gint satellites_used; + gboolean dirty; /* needs to be saved */ +} GpsFix; +#endif /* VIK_CONFIG_REALTIME_GPS_TRACKING */ + +struct _VikGpsLayer { + VikLayer vl; + VikTrwLayer * trw_children[NUM_TRW]; + GList * children; /* used only for writing file */ + int cur_read_child; /* used only for reading file */ +#if defined (VIK_CONFIG_REALTIME_GPS_TRACKING) && defined (GPSD_API_MAJOR_VERSION) + VglGpsd *vgpsd; + gboolean connected_to_gpsd; + gboolean realtime_tracking; + gboolean first_realtime_trackpoint; + GpsFix realtime_fix; + GpsFix last_fix; + + VikTrack *realtime_track; + + GIOChannel *realtime_io_channel; + guint realtime_io_watch_id; + guint realtime_retry_timer; + GdkGC *realtime_track_gc; + GdkGC *realtime_track_bg_gc; + GdkGC *realtime_track_pt_gc; + GdkGC *realtime_track_pt1_gc; + GdkGC *realtime_track_pt2_gc; + + /* params */ + gboolean auto_connect_to_gpsd; + gchar *gpsd_host; + gchar *gpsd_port; + gint gpsd_retry_interval; + gboolean realtime_record; + gboolean realtime_jump_to_start; + guint vehicle_position; + gboolean realtime_update_statusbar; + VikTrackpoint *trkpt; + VikTrackpoint *trkpt_prev; +#endif /* VIK_CONFIG_REALTIME_GPS_TRACKING */ + gchar *protocol; + gchar *serial_port; + gboolean download_tracks; + gboolean download_routes; + gboolean download_waypoints; + gboolean upload_tracks; + gboolean upload_routes; + gboolean upload_waypoints; +}; + +/** + * Overwrite the static setup with dynamically generated GPS Babel device list + */ +static void gps_layer_inst_init ( VikGpsLayer *self ) +{ + gint new_proto = 0; + // +1 for luck (i.e the NULL terminator) + gchar **new_protocols = g_malloc_n(1 + g_list_length(a_babel_device_list), sizeof(gpointer)); + + GList *gl = g_list_first ( a_babel_device_list ); + while ( gl ) { + // should be using label property but use name for now + // thus don't need to mess around converting label to name later on + new_protocols[new_proto++] = ((BabelDevice*)gl->data)->name; + gl = g_list_next ( gl ); + } + new_protocols[new_proto] = NULL; + + vik_gps_layer_interface.params[PARAM_PROTOCOL].widget_data = new_protocols; +} + +GType vik_gps_layer_get_type () +{ + static GType val_type = 0; + + if (!val_type) + { + static const GTypeInfo val_info = + { + sizeof (VikGpsLayerClass), + NULL, /* base_init */ + NULL, /* base_finalize */ + NULL, /* class init */ + NULL, /* class_finalize */ + NULL, /* class_data */ + sizeof (VikGpsLayer), + 0, + (GInstanceInitFunc) gps_layer_inst_init, + }; + val_type = g_type_register_static ( VIK_LAYER_TYPE, "VikGpsLayer", &val_info, 0 ); + } + + return val_type; +} + +static VikGpsLayer *vik_gps_layer_create (VikViewport *vp) +{ + int i; + + VikGpsLayer *rv = vik_gps_layer_new (vp); + vik_layer_rename ( VIK_LAYER(rv), vik_gps_layer_interface.name ); + + for (i = 0; i < NUM_TRW; i++) { + rv->trw_children[i] = VIK_TRW_LAYER(vik_layer_create ( VIK_LAYER_TRW, vp, FALSE )); + vik_layer_set_menu_items_selection(VIK_LAYER(rv->trw_children[i]), VIK_MENU_ITEM_ALL & ~(VIK_MENU_ITEM_CUT|VIK_MENU_ITEM_DELETE)); + } + return rv; +} + +static const gchar* gps_layer_tooltip ( VikGpsLayer *vgl ) +{ + static gchar buf1[256]; + buf1[0] = '\0'; + static gchar rbuf[512]; + rbuf[0] = '\0'; + + g_snprintf (buf1, sizeof(buf1), "%s:%s", vgl->protocol, vgl->serial_port); + +#if defined (VIK_CONFIG_REALTIME_GPS_TRACKING) && defined (GPSD_API_MAJOR_VERSION) + static gchar buf2[256]; + buf2[0] = '\0'; + if ( vgl->connected_to_gpsd ) + g_snprintf (buf2, sizeof(buf2), "GPSD:%s:%s %s", vgl->gpsd_host, vgl->gpsd_port, _("Connected")); + else + g_snprintf (buf2, sizeof(buf2), "GPSD:%s:%s %s", vgl->gpsd_host, vgl->gpsd_port, _("Disconnected")); + + g_snprintf (rbuf, sizeof(rbuf), "%s\n%s", buf1, buf2); +#else + g_snprintf (rbuf, sizeof(rbuf), "%s", buf1); +#endif + return rbuf; +} + +/* "Copy" */ +static void gps_layer_marshall( VikGpsLayer *vgl, guint8 **data, guint *datalen ) +{ + VikLayer *child_layer; + guint8 *ld; + guint ll; + GByteArray* b = g_byte_array_new (); + guint len; + guint i; + +#define alm_append(obj, sz) \ + len = (sz); \ + g_byte_array_append ( b, (guint8 *)&len, sizeof(len) ); \ + g_byte_array_append ( b, (guint8 *)(obj), len ); + + vik_layer_marshall_params(VIK_LAYER(vgl), &ld, &ll); + alm_append(ld, ll); + g_free(ld); + + for (i = 0; i < NUM_TRW; i++) { + child_layer = VIK_LAYER(vgl->trw_children[i]); + vik_layer_marshall(child_layer, &ld, &ll); + if (ld) { + alm_append(ld, ll); + g_free(ld); + } + } + *data = b->data; + *datalen = b->len; + g_byte_array_free(b, FALSE); +#undef alm_append +} + +/* "Paste" */ +static VikGpsLayer *gps_layer_unmarshall( guint8 *data, guint len, VikViewport *vvp ) +{ +#define alm_size (*(guint *)data) +#define alm_next \ + len -= sizeof(guint) + alm_size; \ + data += sizeof(guint) + alm_size; + + VikGpsLayer *rv = vik_gps_layer_new(vvp); + VikLayer *child_layer; + gint i; + + vik_layer_unmarshall_params ( VIK_LAYER(rv), data+sizeof(guint), alm_size, vvp ); + alm_next; + + i = 0; + while (len>0 && i < NUM_TRW) { + child_layer = vik_layer_unmarshall ( data + sizeof(guint), alm_size, vvp ); + if (child_layer) { + rv->trw_children[i++] = (VikTrwLayer *)child_layer; + // NB no need to attach signal update handler here + // as this will always be performed later on in vik_gps_layer_realize() + } + alm_next; + } + // g_print("gps_layer_unmarshall ended with len=%d\n", len); + g_assert(len == 0); + return rv; +#undef alm_size +#undef alm_next +} + +static gboolean gps_layer_set_param ( VikGpsLayer *vgl, VikLayerSetParam *vlsp ) +{ + switch ( vlsp->id ) + { + case PARAM_PROTOCOL: + if (vlsp->data.s) { + g_free(vgl->protocol); + // Backwards Compatibility: previous versions data.s[0] - '0'; + if (vlsp->data.s[0] != '\0' && + g_ascii_isdigit (vlsp->data.s[0]) && + vlsp->data.s[1] == '\0' && + index < OLD_NUM_PROTOCOLS) + // It is a single digit: activate compatibility + vgl->protocol = g_strdup(protocols_args[index]); + else + vgl->protocol = g_strdup(vlsp->data.s); + g_debug("%s: %s", __FUNCTION__, vgl->protocol); + } + else + g_warning(_("Unknown GPS Protocol")); + break; + case PARAM_PORT: + if (vlsp->data.s) { + g_free(vgl->serial_port); + // Backwards Compatibility: previous versions data.s[0] - '0'; + if (vlsp->data.s[0] != '\0' && + g_ascii_isdigit (vlsp->data.s[0]) && + vlsp->data.s[1] == '\0' && + index < OLD_NUM_PORTS) + /* It is a single digit: activate compatibility */ + vgl->serial_port = g_strdup(old_params_ports[index]); + else + vgl->serial_port = g_strdup(vlsp->data.s); + g_debug("%s: %s", __FUNCTION__, vgl->serial_port); + } + else + g_warning(_("Unknown serial port device")); + break; + case PARAM_DOWNLOAD_TRACKS: + vgl->download_tracks = vlsp->data.b; + break; + case PARAM_UPLOAD_TRACKS: + vgl->upload_tracks = vlsp->data.b; + break; + case PARAM_DOWNLOAD_ROUTES: + vgl->download_routes = vlsp->data.b; + break; + case PARAM_UPLOAD_ROUTES: + vgl->upload_routes = vlsp->data.b; + break; + case PARAM_DOWNLOAD_WAYPOINTS: + vgl->download_waypoints = vlsp->data.b; + break; + case PARAM_UPLOAD_WAYPOINTS: + vgl->upload_waypoints = vlsp->data.b; + break; +#if defined (VIK_CONFIG_REALTIME_GPS_TRACKING) && defined (GPSD_API_MAJOR_VERSION) + case PARAM_GPSD_CONNECT: + vgl->auto_connect_to_gpsd = vlsp->data.b; + break; + case PARAM_GPSD_HOST: + if (vlsp->data.s) { + if (vgl->gpsd_host) + g_free(vgl->gpsd_host); + vgl->gpsd_host = g_strdup(vlsp->data.s); + } + break; + case PARAM_GPSD_PORT: + if (vlsp->data.s) { + if (vgl->gpsd_port) + g_free(vgl->gpsd_port); + vgl->gpsd_port = g_strdup(vlsp->data.s); + } + break; + case PARAM_GPSD_RETRY_INTERVAL: + vgl->gpsd_retry_interval = strtol(vlsp->data.s, NULL, 10); + break; + case PARAM_REALTIME_REC: + vgl->realtime_record = vlsp->data.b; + break; + case PARAM_REALTIME_CENTER_START: + vgl->realtime_jump_to_start = vlsp->data.b; + break; + case PARAM_VEHICLE_POSITION: + vgl->vehicle_position = vlsp->data.u; + break; + case PARAM_REALTIME_UPDATE_STATUSBAR: + vgl->realtime_update_statusbar = vlsp->data.b; + break; +#endif /* VIK_CONFIG_REALTIME_GPS_TRACKING */ + default: + g_warning("gps_layer_set_param(): unknown parameter"); + } + + return TRUE; +} + +static VikLayerParamData gps_layer_get_param ( VikGpsLayer *vgl, guint16 id, gboolean is_file_operation ) +{ + VikLayerParamData rv; + switch ( id ) + { + case PARAM_PROTOCOL: + rv.s = vgl->protocol; + g_debug("%s: %s", __FUNCTION__, rv.s); + break; + case PARAM_PORT: + rv.s = vgl->serial_port; + g_debug("%s: %s", __FUNCTION__, rv.s); + break; + case PARAM_DOWNLOAD_TRACKS: + rv.b = vgl->download_tracks; + break; + case PARAM_UPLOAD_TRACKS: + rv.b = vgl->upload_tracks; + break; + case PARAM_DOWNLOAD_ROUTES: + rv.b = vgl->download_routes; + break; + case PARAM_UPLOAD_ROUTES: + rv.b = vgl->upload_routes; + break; + case PARAM_DOWNLOAD_WAYPOINTS: + rv.b = vgl->download_waypoints; + break; + case PARAM_UPLOAD_WAYPOINTS: + rv.b = vgl->upload_waypoints; + break; +#if defined (VIK_CONFIG_REALTIME_GPS_TRACKING) && defined (GPSD_API_MAJOR_VERSION) + case PARAM_GPSD_CONNECT: + rv.b = vgl->auto_connect_to_gpsd; + break; + case PARAM_GPSD_HOST: + rv.s = vgl->gpsd_host ? vgl->gpsd_host : ""; + break; + case PARAM_GPSD_PORT: + rv.s = vgl->gpsd_port ? vgl->gpsd_port : g_strdup(DEFAULT_GPSD_PORT); + break; + case PARAM_GPSD_RETRY_INTERVAL: + rv.s = g_strdup_printf("%d", vgl->gpsd_retry_interval); + break; + case PARAM_REALTIME_REC: + rv.b = vgl->realtime_record; + break; + case PARAM_REALTIME_CENTER_START: + rv.b = vgl->realtime_jump_to_start; + break; + case PARAM_VEHICLE_POSITION: + rv.u = vgl->vehicle_position; + break; + case PARAM_REALTIME_UPDATE_STATUSBAR: + rv.u = vgl->realtime_update_statusbar; + break; +#endif /* VIK_CONFIG_REALTIME_GPS_TRACKING */ + default: + g_warning(_("%s: unknown parameter"), __FUNCTION__); + } + + return rv; +} + +VikGpsLayer *vik_gps_layer_new (VikViewport *vp) +{ + gint i; + VikGpsLayer *vgl = VIK_GPS_LAYER ( g_object_new ( VIK_GPS_LAYER_TYPE, NULL ) ); + vik_layer_set_type ( VIK_LAYER(vgl), VIK_LAYER_GPS ); + for (i = 0; i < NUM_TRW; i++) { + vgl->trw_children[i] = NULL; + } + vgl->children = NULL; + vgl->cur_read_child = 0; + +#if defined (VIK_CONFIG_REALTIME_GPS_TRACKING) && defined (GPSD_API_MAJOR_VERSION) + vgl->first_realtime_trackpoint = FALSE; + vgl->trkpt = NULL; + vgl->trkpt_prev = NULL; + vgl->vgpsd = NULL; + vgl->realtime_io_channel = NULL; + vgl->realtime_io_watch_id = 0; + vgl->realtime_retry_timer = 0; + if ( vp ) { + vgl->realtime_track_gc = vik_viewport_new_gc ( vp, "#203070", 2 ); + vgl->realtime_track_bg_gc = vik_viewport_new_gc ( vp, "grey", 2 ); + vgl->realtime_track_pt1_gc = vik_viewport_new_gc ( vp, "red", 2 ); + vgl->realtime_track_pt2_gc = vik_viewport_new_gc ( vp, "green", 2 ); + vgl->realtime_track_pt_gc = vgl->realtime_track_pt1_gc; + } + vgl->realtime_track = NULL; +#endif // VIK_CONFIG_REALTIME_GPS_TRACKING + + vik_layer_set_defaults ( VIK_LAYER(vgl), vp ); + + return vgl; +} + +static void vik_gps_layer_post_read ( VikGpsLayer *vgl, VikViewport *vvp, gboolean from_file ) +{ + for (guint i = 0; i < NUM_TRW; i++) { + trw_layer_calculate_bounds_waypoints ( vgl->trw_children[i] ); + trw_layer_calculate_bounds_tracks ( vgl->trw_children[i] ); + } +} + +static void vik_gps_layer_draw ( VikGpsLayer *vgl, VikViewport *vp ) +{ + gint i; + VikLayer *vl; + VikLayer *trigger = VIK_LAYER(vik_viewport_get_trigger( vp )); + + for (i = 0; i < NUM_TRW; i++) { + vl = VIK_LAYER(vgl->trw_children[i]); + if (vl == trigger) { + if ( vik_viewport_get_half_drawn ( vp ) ) { + vik_viewport_set_half_drawn ( vp, FALSE ); + vik_viewport_snapshot_load( vp ); + } else { + vik_viewport_snapshot_save( vp ); + } + } + if (!vik_viewport_get_half_drawn(vp)) + vik_layer_draw ( vl, vp ); + } +#if defined (VIK_CONFIG_REALTIME_GPS_TRACKING) && defined (GPSD_API_MAJOR_VERSION) + if (vgl->realtime_tracking) { + if (VIK_LAYER(vgl) == trigger) { + if ( vik_viewport_get_half_drawn ( vp ) ) { + vik_viewport_set_half_drawn ( vp, FALSE ); + vik_viewport_snapshot_load( vp ); + } else { + vik_viewport_snapshot_save( vp ); + } + } + if (!vik_viewport_get_half_drawn(vp)) + realtime_tracking_draw(vgl, vp); + } +#endif /* VIK_CONFIG_REALTIME_GPS_TRACKING */ +} + +static void gps_layer_change_coord_mode ( VikGpsLayer *vgl, VikCoordMode mode ) +{ + gint i; + for (i = 0; i < NUM_TRW; i++) { + vik_layer_change_coord_mode(VIK_LAYER(vgl->trw_children[i]), mode); + } +} + +static void gps_layer_add_menu_items( VikGpsLayer *vgl, GtkMenu *menu, gpointer vlp ) +{ + static gpointer pass_along[2]; + GtkWidget *item; + pass_along[0] = vgl; + pass_along[1] = vlp; + + item = gtk_menu_item_new(); + gtk_menu_shell_append ( GTK_MENU_SHELL(menu), item ); + gtk_widget_show ( item ); + + /* Now with icons */ + item = gtk_image_menu_item_new_with_mnemonic ( _("_Upload to GPS") ); + gtk_image_menu_item_set_image ( (GtkImageMenuItem*)item, gtk_image_new_from_stock (GTK_STOCK_GO_UP, GTK_ICON_SIZE_MENU) ); + g_signal_connect_swapped ( G_OBJECT(item), "activate", G_CALLBACK(gps_upload_cb), pass_along ); + gtk_menu_shell_append (GTK_MENU_SHELL (menu), item); + gtk_widget_show ( item ); + + item = gtk_image_menu_item_new_with_mnemonic ( _("Download from _GPS") ); + gtk_image_menu_item_set_image ( (GtkImageMenuItem*)item, gtk_image_new_from_stock (GTK_STOCK_GO_DOWN, GTK_ICON_SIZE_MENU) ); + g_signal_connect_swapped ( G_OBJECT(item), "activate", G_CALLBACK(gps_download_cb), pass_along ); + gtk_menu_shell_append (GTK_MENU_SHELL (menu), item); + gtk_widget_show ( item ); + +#if defined (VIK_CONFIG_REALTIME_GPS_TRACKING) && defined (GPSD_API_MAJOR_VERSION) + item = gtk_image_menu_item_new_with_mnemonic ( vgl->realtime_tracking ? + "_Stop Realtime Tracking" : + "_Start Realtime Tracking" ); + gtk_image_menu_item_set_image ( (GtkImageMenuItem*)item, vgl->realtime_tracking ? + gtk_image_new_from_stock (GTK_STOCK_MEDIA_STOP, GTK_ICON_SIZE_MENU) : + gtk_image_new_from_stock (GTK_STOCK_MEDIA_PLAY, GTK_ICON_SIZE_MENU) ); + g_signal_connect_swapped ( G_OBJECT(item), "activate", G_CALLBACK(gps_start_stop_tracking_cb), pass_along ); + gtk_menu_shell_append (GTK_MENU_SHELL (menu), item); + gtk_widget_show ( item ); + + item = gtk_menu_item_new(); + gtk_menu_shell_append ( GTK_MENU_SHELL(menu), item ); + gtk_widget_show ( item ); + + item = gtk_image_menu_item_new_with_mnemonic ( _("Empty _Realtime") ); + gtk_image_menu_item_set_image ( (GtkImageMenuItem*)item, gtk_image_new_from_stock (GTK_STOCK_REMOVE, GTK_ICON_SIZE_MENU) ); + g_signal_connect_swapped ( G_OBJECT(item), "activate", G_CALLBACK(gps_empty_realtime_cb), pass_along ); + gtk_menu_shell_append (GTK_MENU_SHELL (menu), item); + gtk_widget_show ( item ); +#endif /* VIK_CONFIG_REALTIME_GPS_TRACKING */ + + item = gtk_image_menu_item_new_with_mnemonic ( _("E_mpty Upload") ); + gtk_image_menu_item_set_image ( (GtkImageMenuItem*)item, gtk_image_new_from_stock (GTK_STOCK_REMOVE, GTK_ICON_SIZE_MENU) ); + g_signal_connect_swapped ( G_OBJECT(item), "activate", G_CALLBACK(gps_empty_upload_cb), pass_along ); + gtk_menu_shell_append (GTK_MENU_SHELL (menu), item); + gtk_widget_show ( item ); + + item = gtk_image_menu_item_new_with_mnemonic ( _("_Empty Download") ); + gtk_image_menu_item_set_image ( (GtkImageMenuItem*)item, gtk_image_new_from_stock (GTK_STOCK_REMOVE, GTK_ICON_SIZE_MENU) ); + g_signal_connect_swapped ( G_OBJECT(item), "activate", G_CALLBACK(gps_empty_download_cb), pass_along ); + gtk_menu_shell_append (GTK_MENU_SHELL (menu), item); + gtk_widget_show ( item ); + + item = gtk_image_menu_item_new_with_mnemonic ( _("Empty _All") ); + gtk_image_menu_item_set_image ( (GtkImageMenuItem*)item, gtk_image_new_from_stock (GTK_STOCK_REMOVE, GTK_ICON_SIZE_MENU) ); + g_signal_connect_swapped ( G_OBJECT(item), "activate", G_CALLBACK(gps_empty_all_cb), pass_along ); + gtk_menu_shell_append (GTK_MENU_SHELL (menu), item); + gtk_widget_show ( item ); + +} + +static void disconnect_layer_signal ( VikLayer *vl, VikGpsLayer *vgl ) +{ + guint number_handlers = g_signal_handlers_disconnect_matched(vl, G_SIGNAL_MATCH_DATA, 0, 0, 0, 0, vgl); + if ( number_handlers != 1 ) { + g_critical(_("Unexpected number of disconnected handlers: %d"), number_handlers); + } +} + +static void vik_gps_layer_free ( VikGpsLayer *vgl ) +{ + gint i; + for (i = 0; i < NUM_TRW; i++) { + if (vgl->vl.realized) + disconnect_layer_signal(VIK_LAYER(vgl->trw_children[i]), vgl); + g_object_unref(vgl->trw_children[i]); + } +#if defined (VIK_CONFIG_REALTIME_GPS_TRACKING) && defined (GPSD_API_MAJOR_VERSION) + rt_gpsd_disconnect(vgl); + if (vgl->realtime_track_gc != NULL) + g_object_unref(vgl->realtime_track_gc); + if (vgl->realtime_track_bg_gc != NULL) + g_object_unref(vgl->realtime_track_bg_gc); + if (vgl->realtime_track_pt1_gc != NULL) + g_object_unref(vgl->realtime_track_pt1_gc); + if (vgl->realtime_track_pt2_gc != NULL) + g_object_unref(vgl->realtime_track_pt2_gc); +#endif /* VIK_CONFIG_REALTIME_GPS_TRACKING */ +} + +static void vik_gps_layer_realize ( VikGpsLayer *vgl, VikTreeview *vt, GtkTreeIter *layer_iter ) +{ + GtkTreeIter iter; + int ix; + + // TODO set to garmin by default + //if (a_babel_device_list) + // device = ((BabelDevice*)g_list_nth_data(a_babel_device_list, last_active))->name; + // Need to access uibuild widgets somehow.... + + for (ix = 0; ix < NUM_TRW; ix++) { + VikLayer * trw = VIK_LAYER(vgl->trw_children[ix]); + vik_treeview_add_layer ( VIK_LAYER(vgl)->vt, layer_iter, &iter, + _(trw_names[ix]), vgl, TRUE, + trw, trw->type, trw->type, vik_layer_get_timestamp(trw) ); + if ( ! trw->visible ) + vik_treeview_item_set_visible ( VIK_LAYER(vgl)->vt, &iter, FALSE ); + vik_layer_realize ( trw, VIK_LAYER(vgl)->vt, &iter ); + g_signal_connect_swapped ( G_OBJECT(trw), "update", G_CALLBACK(vik_layer_emit_update_secondary), vgl ); + } + +#if defined (VIK_CONFIG_REALTIME_GPS_TRACKING) && defined (GPSD_API_MAJOR_VERSION) + if ( vgl->auto_connect_to_gpsd ) { + vgl->realtime_tracking = TRUE; + vgl->first_realtime_trackpoint = TRUE; + (void)rt_gpsd_connect ( vgl, FALSE ); + } +#endif /* VIK_CONFIG_REALTIME_GPS_TRACKING */ +} + +const GList *vik_gps_layer_get_children ( VikGpsLayer *vgl ) +{ + int i; + + if (vgl->children == NULL) { + for (i = NUM_TRW - 1; i >= 0; i--) + vgl->children = g_list_prepend(vgl->children, vgl->trw_children[i]); + } + return vgl->children; +} + +VikTrwLayer * vik_gps_layer_get_a_child(VikGpsLayer *vgl) +{ + g_assert ((vgl->cur_read_child >= 0) && (vgl->cur_read_child < NUM_TRW)); + + VikTrwLayer * vtl = vgl->trw_children[vgl->cur_read_child]; + if (++(vgl->cur_read_child) >= NUM_TRW) + vgl->cur_read_child = 0; + return(vtl); +} + +gboolean vik_gps_layer_is_empty ( VikGpsLayer *vgl ) +{ + if ( vgl->trw_children[0] ) + return FALSE; + return TRUE; +} + +static void gps_session_delete(GpsSession *sess) +{ + vik_mutex_free(sess->mutex); + // Remove any outstanding GUI update requests + if ( sess->id_status_working ) + g_source_remove ( sess->id_status_working ); + if ( sess->id_status_end ) + g_source_remove ( sess->id_status_end ); + if ( sess->id_info ) + g_source_remove ( sess->id_info ); + if ( sess->id_total_count ) + g_source_remove ( sess->id_total_count ); + if ( sess->id_count ) + g_source_remove ( sess->id_count ); + g_free(sess->babelargs); + g_free(sess->info); + g_free(sess->port); + g_free(sess); +} + +static gboolean show_total_count(GpsSession *sess) +{ + g_mutex_lock(sess->mutex); + if (sess->ok) { + const gchar *tmp_str; + gint tc; + GtkWidget *progress_label; + if (sess->direction == GPS_DOWN) + { + switch (sess->progress_type) { + case WPT: + tmp_str = ngettext("Downloading %d waypoint...", "Downloading %d waypoints...", sess->wpt_total_count); + tc = sess->wpt_total_count; + progress_label = sess->wpt_label; + break; + case TRK: + tmp_str = ngettext("Downloading %d trackpoint...", "Downloading %d trackpoints...", sess->trk_total_count); + tc = sess->trk_total_count; + progress_label = sess->trk_label; + break; + default: + tmp_str = ngettext("Downloading %d routepoint...", "Downloading %d routepoints...", sess->rte_total_count); + tc = sess->rte_total_count; + progress_label = sess->rte_label; + break; +/* + { + // Maybe a gpsbabel bug/feature (upto at least v1.4.3 or maybe my Garmin device) but the count always seems x2 too many for routepoints + gint mycnt = (cnt / 2) + 1; + tmp_str = ngettext("Downloading %d routepoint...", "Downloading %d routepoints...", mycnt); + tc = mycnt; + break; + } + */ + } + } + else + { + switch (sess->progress_type) { + case WPT: + tmp_str = ngettext("Uploading %d waypoint...", "Uploading %d waypoints...", sess->wpt_total_count); + tc = sess->wpt_total_count; + progress_label = sess->wpt_label; + break; + case TRK: + tmp_str = ngettext("Uploading %d trackpoint...", "Uploading %d trackpoints...", sess->trk_total_count); + tc = sess->trk_total_count; + progress_label = sess->trk_label; + break; + default: + tmp_str = ngettext("Uploading %d routepoint...", "Uploading %d routepoints...", sess->rte_total_count); + tc = sess->rte_total_count; + progress_label = sess->rte_label; + break; + } + } + + gchar s[128]; + g_snprintf(s, 128, tmp_str, tc); + gtk_label_set_text ( GTK_LABEL(progress_label), s ); + gtk_widget_show ( progress_label ); + } + sess->id_total_count = 0; + g_mutex_unlock(sess->mutex); + return FALSE; +} + +static gboolean show_current_count(GpsSession *sess) +{ + g_mutex_lock(sess->mutex); + if (sess->ok) { + gchar s[128]; + gint count, total_count; + const gchar *tmp_str; + GtkWidget *progress_label; + if (sess->wpt_count < sess->wpt_total_count) { + if (sess->direction == GPS_DOWN) { + switch (sess->progress_type) { + case WPT: + tmp_str = ngettext("Downloaded %d out of %d waypoint...", "Downloaded %d out of %d waypoints...", sess->wpt_total_count); + count = sess->wpt_count; + total_count = sess->wpt_total_count; + progress_label = sess->wpt_label; + break; + case TRK: + tmp_str = ngettext("Downloaded %d out of %d trackpoint...", "Downloaded %d out of %d trackpoints...", sess->trk_total_count); + count = sess->trk_count; + total_count = sess->trk_total_count; + progress_label = sess->trk_label; + break; + default: + tmp_str = ngettext("Downloaded %d out of %d routepoint...", "Downloaded %d out of %d routepoints...", sess->rte_total_count); + count = sess->rte_count; + total_count = sess->rte_total_count; + progress_label = sess->rte_label; + break; + } + } + else { + switch (sess->progress_type) { + case WPT: + tmp_str = ngettext("Uploaded %d out of %d waypoint...", "Uploaded %d out of %d waypoints...", sess->wpt_total_count); + count = sess->wpt_count; + total_count = sess->wpt_total_count; + progress_label = sess->wpt_label; + break; + case TRK: + tmp_str = ngettext("Uploaded %d out of %d trackpoint...", "Uploaded %d out of %d trackpoints...", sess->trk_total_count); + count = sess->trk_count; + total_count = sess->trk_total_count; + progress_label = sess->trk_label; + break; + default: + tmp_str = ngettext("Uploaded %d out of %d routepoint...", "Uploaded %d out of %d routepoints...", sess->rte_total_count); + count = sess->rte_count; + total_count = sess->rte_total_count; + progress_label = sess->rte_label; + break; + } + } + } else { + if (sess->direction == GPS_DOWN) { + switch (sess->progress_type) { + case WPT: + tmp_str = ngettext("Downloaded %d waypoint", "Downloaded %d waypoints", sess->wpt_count); + count = sess->wpt_count; + total_count = sess->wpt_total_count; + progress_label = sess->wpt_label; + break; + case TRK: + tmp_str = ngettext("Downloaded %d trackpoint", "Downloaded %d trackpoints", sess->trk_count); + count = sess->trk_count; + total_count = sess->trk_total_count; + progress_label = sess->trk_label; + break; + default: + tmp_str = ngettext("Downloaded %d routepoint", "Downloaded %d routepoints", sess->rte_count); + count = sess->rte_count; + total_count = sess->rte_total_count; + progress_label = sess->rte_label; + break; + } + } + else { + switch (sess->progress_type) { + case WPT: + tmp_str = ngettext("Uploaded %d waypoint", "Uploaded %d waypoints", sess->wpt_count); + count = sess->wpt_count; + total_count = sess->wpt_total_count; + progress_label = sess->wpt_label; + break; + case TRK: + tmp_str = ngettext("Uploaded %d trackpoint", "Uploaded %d trackpoints", sess->trk_count); + count = sess->trk_count; + total_count = sess->trk_total_count; + progress_label = sess->trk_label; + break; + default: + tmp_str = ngettext("Uploaded %d routepoint", "Uploaded %d routepoints", sess->rte_count); + count = sess->rte_count; + total_count = sess->rte_total_count; + progress_label = sess->rte_label; + break; + } + } + } + g_snprintf(s, 128, tmp_str, count, total_count); + gtk_label_set_text ( GTK_LABEL(progress_label), s ); + } + sess->id_count = 0; + g_mutex_unlock(sess->mutex); + return FALSE; +} + +static gboolean show_gps_info(GpsSession *sess) +{ + g_mutex_lock(sess->mutex); + if (sess->ok) { + gchar s[256]; + g_snprintf(s, 256, _("GPS Device: %s"), sess->info); + gtk_label_set_text ( GTK_LABEL(sess->gps_label), s ); + } + sess->id_info = 0; + g_mutex_unlock(sess->mutex); + return FALSE; +} + +/* + * Common processing for GPS Device information + * It doesn't matter whether we're uploading or downloading + */ +static void process_line_for_gps_info ( const gchar *line, GpsSession *sess ) +{ + if (strstr(line, "PRDDAT")) { + gchar **tokens = g_strsplit(line, " ", 0); + gchar info[128]; + int ilen = 0; + int i; + int n_tokens = 0; + + while (tokens[n_tokens]) + n_tokens++; + + // I'm not entirely clear what information this is trying to get... + // Obviously trying to decipher some kind of text/naming scheme + // Anyway this will be superceded if there is 'Unit:' information + if (n_tokens > 8) { + for (i=8; tokens[i] && ilen < sizeof(info)-2 && strcmp(tokens[i], "00"); i++) { + guint ch; + sscanf(tokens[i], "%x", &ch); + info[ilen++] = ch; + } + info[ilen++] = 0; + sess->info = g_strdup (info); + sess->id_info = gdk_threads_add_idle ( (GSourceFunc)show_gps_info, sess ); + } + g_strfreev(tokens); + } + + /* eg: "Unit:\teTrex Legend HCx Software Version 2.90\n" */ + if (strstr(line, "Unit:")) { + gchar **tokens = g_strsplit(line, "\t", 0); + int n_tokens = 0; + while (tokens[n_tokens]) + n_tokens++; + + if (n_tokens > 1) { + sess->info = g_strdup (tokens[1]); + sess->id_info = gdk_threads_add_idle ( (GSourceFunc)show_gps_info, sess ); + } + g_strfreev(tokens); + } + + if (strstr(line, "[ERROR] GPS")) { + gchar **tokens = g_strsplit(line, "\n", 0); + sess->info = g_strdup(tokens[0]); + sess->id_info = gdk_threads_add_idle ( (GSourceFunc)show_gps_info, sess ); + g_strfreev(tokens); + } + + if (strstr(line, "an't in")) { + gchar **tokens = g_strsplit(line, "\n", 0); + sess->info = g_strdup(tokens[0]); + sess->id_info = gdk_threads_add_idle ( (GSourceFunc)show_gps_info, sess ); + g_strfreev(tokens); + } + + if (strstr(line, "Can't get waypoint")) { + gchar **tokens = g_strsplit(line, "\n", 0); + sess->info = g_strdup(tokens[0]); + sess->id_info = gdk_threads_add_idle ( (GSourceFunc)show_gps_info, sess ); + g_strfreev(tokens); + } +} + +static gboolean show_gps_status_working ( GpsSession *sess ) +{ + g_mutex_lock(sess->mutex); + if ( sess->ok ) { + gtk_label_set_text ( GTK_LABEL(sess->status_label), _("Status: Working...") ); + } + sess->id_status_working = 0; + g_mutex_unlock(sess->mutex); + return FALSE; +} + +static void gps_download_progress_func(BabelProgressCode c, gpointer data, GpsSession * sess ) +{ + gchar *line; + + if ( !sess->ok ) { + //gps_session_delete(sess); + sess->thread_complete = TRUE; + g_debug ("THREAD EXIT INTERUPPT"); + g_thread_exit ( NULL ); + } + + switch(c) { + case BABEL_DIAG_OUTPUT: + line = (gchar *)data; + + sess->id_status_working = gdk_threads_add_idle ( (GSourceFunc)show_gps_status_working, sess ); + + /* tells us the type of items that will follow */ + if (strstr(line, "Xfer Wpt")) { + sess->progress_type = WPT; + } + if (strstr(line, "Xfer Trk")) { + sess->progress_type = TRK; + } + if (strstr(line, "Xfer Rte")) { + sess->progress_type = RTE; + } + + process_line_for_gps_info ( line, sess ); + + if (strstr(line, "RECORD")) { + int lsb, msb, cnt; + + if (strlen(line) > 20) { + sscanf(line+17, "%x", &lsb); + sscanf(line+20, "%x", &msb); + cnt = lsb + msb * 256; + if ( sess->progress_type == RTE ) { + // Maybe a gpsbabel bug/feature (upto at least v1.4.3 or maybe my Garmin device) but the count always seems x2 too many for routepoints + gint mycnt = (cnt / 2) + 1; + sess->rte_total_count = mycnt; + sess->rte_count = 0; + } + else if ( sess->progress_type == WPT ) { + sess->wpt_total_count = cnt; + sess->wpt_count = 0; + } + else { + sess->trk_total_count = cnt; + sess->trk_count = 0; + } + sess->id_total_count = gdk_threads_add_idle ( (GSourceFunc)show_total_count, sess); + } + } + if ( strstr(line, "WPTDAT") || strstr(line, "TRKHDR") || strstr(line, "TRKDAT") || strstr(line, "RTEHDR") || strstr(line, "RTEWPT") ) { + if ( strstr(line, "WPTDAT") ) + sess->wpt_count++; + else if ( strstr(line, "TRKHDR") || strstr(line, "TRKDAT") ) + sess->trk_count++; + else + // "RTEHDR" || "RTEWPT" + sess->rte_count++; + sess->id_count = gdk_threads_add_idle ( (GSourceFunc)show_current_count, sess); + } + break; + case BABEL_DONE: + break; + default: + break; + } +} + +static void gps_upload_progress_func(BabelProgressCode c, gpointer data, GpsSession * sess ) +{ + gchar *line; + static int cnt = 0; + + if ( !sess->ok ) { + //gps_session_delete(sess); + sess->thread_complete = TRUE; + g_thread_exit ( NULL ); + } + + switch(c) { + case BABEL_DIAG_OUTPUT: + line = (gchar *)data; + + sess->id_status_working = gdk_threads_add_idle ( (GSourceFunc)show_gps_status_working, sess ); + + process_line_for_gps_info ( line, sess ); + + if (strstr(line, "RECORD")) { + int lsb, msb; + + if (strlen(line) > 20) { + sscanf(line+17, "%x", &lsb); + sscanf(line+20, "%x", &msb); + cnt = lsb + msb * 256; + //sess->count = 0; ?? wpt, trk and/or rte?? or none + } + } + if ( strstr(line, "WPTDAT")) { + sess->progress_type = WPT; + if (sess->wpt_count == 0) { + sess->wpt_total_count = cnt; + sess->id_total_count = gdk_threads_add_idle ( (GSourceFunc)show_total_count, sess ); + } + sess->wpt_count++; + sess->id_count = gdk_threads_add_idle ( (GSourceFunc)show_current_count, sess ); + } + if ( strstr(line, "RTEHDR") || strstr(line, "RTEWPT") ) { + sess->progress_type = RTE; + if (sess->rte_count == 0) { + // Maybe a gpsbabel bug/feature (upto at least v1.4.3 or maybe my Garmin device) but the count always seems x2 too many for routepoints + // Anyway since we're uploading - we should know how many points we're going to put! + cnt = (cnt / 2) + 1; + sess->id_total_count = gdk_threads_add_idle ( (GSourceFunc)show_total_count, sess); + } + sess->rte_count++; + sess->id_count = gdk_threads_add_idle ( (GSourceFunc)show_current_count, sess); + } + if ( strstr(line, "TRKHDR") || strstr(line, "TRKDAT") ) { + sess->progress_type = TRK; + if (sess->trk_count == 0) { + sess->id_total_count = gdk_threads_add_idle ( (GSourceFunc)show_total_count, sess); + } + sess->trk_count++; + sess->id_count = gdk_threads_add_idle ( (GSourceFunc)show_current_count, sess); + } + break; + case BABEL_DONE: + break; + default: + break; + } +} + +static gboolean show_gps_status_end ( GpsSession *sess ) +{ + g_mutex_lock(sess->mutex); + // (Download)Failure could be due to a number of reasons: such as no/wrong device attached or GPSBabel not installed + if (!sess->result) { + gtk_label_set_text ( GTK_LABEL(sess->status_label), _("Error: No result.") ); + } + else { + if (sess->ok) { + gtk_label_set_text ( GTK_LABEL(sess->status_label), _("Done.") ); + gtk_dialog_set_response_sensitive ( GTK_DIALOG(sess->dialog), GTK_RESPONSE_ACCEPT, TRUE ); + gtk_dialog_set_response_sensitive ( GTK_DIALOG(sess->dialog), GTK_RESPONSE_REJECT, FALSE ); + } + } + sess->id_status_end = 0; + g_mutex_unlock(sess->mutex); + return FALSE; +} + +/** + * + */ +static void gps_comm_thread(GpsSession *sess) +{ + if (sess->direction == GPS_DOWN) { + ProcessOptions po = { sess->babelargs, sess->port, NULL, NULL, NULL, NULL }; + sess->result = a_babel_convert_from (sess->vtl, &po, (BabelStatusFunc) gps_download_progress_func, sess, NULL); + } + else { + sess->result = a_babel_convert_to (sess->vtl, sess->track, sess->babelargs, sess->port, + (BabelStatusFunc) gps_upload_progress_func, sess); + } + + sess->id_status_end = gdk_threads_add_idle ( (GSourceFunc)show_gps_status_end, sess ); + + if (sess->result) { + if (sess->ok) { + /* Do not change the view if we are following the current GPS position */ +#if defined (VIK_CONFIG_REALTIME_GPS_TRACKING) && defined (GPSD_API_MAJOR_VERSION) + if (!sess->realtime_tracking) +#endif + { + if ( sess->vvp && sess->direction == GPS_DOWN ) { + vik_layer_post_read ( VIK_LAYER(sess->vtl), sess->vvp, TRUE ); + /* View the data available */ + vik_trw_layer_auto_set_view ( sess->vtl, sess->vvp ) ; + vik_layer_emit_update ( VIK_LAYER(sess->vtl) ); // NB update request from background thread + } + } + } else { + /* cancelled */ + } + } + + if (sess->ok) { + // Thread has completed successfully, but now set to false to avoid 'tell thread to stop' test after dialog run + sess->ok = FALSE; + } + + sess->thread_complete = TRUE; + g_thread_exit(NULL); +} + +/** + * vik_gps_comm: + * @vtl: The TrackWaypoint layer to operate on + * @track: Operate on a particular track when specified + * @dir: The direction of the transfer + * @protocol: The GPS device communication protocol + * @port: The GPS serial port + * @tracking: If tracking then viewport display update will be skipped + * @vvp: A viewport is required as the display may get updated + * @vlp: A layers panel is needed for uploading as the items maybe modified + * @do_tracks: Whether tracks shoud be processed + * @do_waypoints: Whether waypoints shoud be processed + * @turn_off: Whether we should attempt to turn off the GPS device after the transfer (only some devices support this) + * + * Talk to a GPS Device using a thread which updates a dialog with the progress + */ +gint vik_gps_comm ( VikTrwLayer *vtl, + VikTrack *track, + vik_gps_dir dir, + gchar *protocol, + gchar *port, + gboolean tracking, + VikViewport *vvp, + VikLayersPanel *vlp, + gboolean do_tracks, + gboolean do_routes, + gboolean do_waypoints, + gboolean turn_off ) +{ + GpsSession *sess = g_malloc0(sizeof(GpsSession)); + char *tracks = NULL; + char *routes = NULL; + char *waypoints = NULL; + + sess->mutex = vik_mutex_new(); + sess->direction = dir; + sess->vtl = vtl; + sess->track = track; + sess->port = g_strdup(port); + sess->ok = TRUE; + sess->vvp = vvp; + + // This must be done inside the main thread as the uniquify causes screen updates + // (originally performed this nearer the point of upload in the thread) + if ( dir == GPS_UP ) { + // Enforce unique names in the layer upload to the GPS device + // NB this may only be a Garmin device restriction (and may be not every Garmin device either...) + // Thus this maintains the older code in built restriction + if ( ! vik_trw_layer_uniquify ( sess->vtl, vlp ) ) + vik_statusbar_set_message ( vik_window_get_statusbar (VIK_WINDOW(VIK_GTK_WINDOW_FROM_LAYER(sess->vtl))), VIK_STATUSBAR_INFO, + _("Warning - GPS Upload items may overwrite each other") ); + } + +#if defined (VIK_CONFIG_REALTIME_GPS_TRACKING) && defined (GPSD_API_MAJOR_VERSION) + sess->realtime_tracking = tracking; +#endif + + if (do_tracks) + tracks = "-t"; + else + tracks = ""; + if (do_routes) + routes = "-r"; + else + routes = ""; + if (do_waypoints) + waypoints = "-w"; + else + waypoints = ""; + + sess->babelargs = g_strdup_printf("-D 9 %s %s %s -%c %s", + tracks, routes, waypoints, (dir == GPS_DOWN) ? 'i' : 'o', protocol); + tracks = NULL; + waypoints = NULL; + + GtkWidget *dialog = NULL; + + // Only create dialog if we're going to do some transferring + if ( do_tracks || do_waypoints || do_routes ) { + dialog = gtk_dialog_new_with_buttons ( "", VIK_GTK_WINDOW_FROM_LAYER(vtl), 0, GTK_STOCK_OK, GTK_RESPONSE_ACCEPT, GTK_STOCK_CANCEL, GTK_RESPONSE_REJECT, NULL ); + sess->dialog = dialog; + gtk_dialog_set_response_sensitive ( GTK_DIALOG(sess->dialog), + GTK_RESPONSE_ACCEPT, FALSE ); + gtk_window_set_title ( GTK_WINDOW(sess->dialog), (dir == GPS_DOWN) ? _("GPS Download") : _("GPS Upload") ); + + sess->status_label = gtk_label_new (_("Status: detecting gpsbabel")); + gtk_box_pack_start ( GTK_BOX(gtk_dialog_get_content_area(GTK_DIALOG(sess->dialog))), sess->status_label, FALSE, FALSE, 5 ); + + sess->gps_label = gtk_label_new (_("GPS device: N/A")); + sess->wpt_label = gtk_label_new (""); + sess->trk_label = gtk_label_new (""); + sess->rte_label = gtk_label_new (""); + + gtk_box_pack_start ( GTK_BOX(gtk_dialog_get_content_area(GTK_DIALOG(sess->dialog))), sess->gps_label, FALSE, FALSE, 5 ); + gtk_box_pack_start ( GTK_BOX(gtk_dialog_get_content_area(GTK_DIALOG(sess->dialog))), sess->wpt_label, FALSE, FALSE, 5 ); + gtk_box_pack_start ( GTK_BOX(gtk_dialog_get_content_area(GTK_DIALOG(sess->dialog))), sess->trk_label, FALSE, FALSE, 5 ); + gtk_box_pack_start ( GTK_BOX(gtk_dialog_get_content_area(GTK_DIALOG(sess->dialog))), sess->rte_label, FALSE, FALSE, 5 ); + + gtk_widget_show_all(sess->dialog); + + gtk_dialog_set_default_response ( GTK_DIALOG(sess->dialog), GTK_RESPONSE_ACCEPT ); + // Starting gps read/write thread +#if GLIB_CHECK_VERSION (2, 32, 0) + g_thread_try_new ( "gps_comm_thread", (GThreadFunc)gps_comm_thread, sess, NULL ); +#else + g_thread_create ( (GThreadFunc)gps_comm_thread, sess, FALSE, NULL ); +#endif + + gtk_dialog_run(GTK_DIALOG(dialog)); + } + else { + if ( !turn_off ) + a_dialog_info_msg ( VIK_GTK_WINDOW_FROM_LAYER(vtl), _("No GPS items selected for transfer.") ); + } + + if (sess->ok) { + sess->ok = FALSE; /* tell thread to stop */ + } + else { + if ( turn_off ) { + // No need for thread for powering off device (should be quick operation...) - so use babel command directly: + gchar *device_off = g_strdup_printf("-i %s,%s", protocol, "power_off"); + ProcessOptions po = { device_off, port, NULL, NULL, NULL, NULL }; + gboolean result = a_babel_convert_from (NULL, &po, NULL, NULL, NULL); + if ( !result ) + a_dialog_error_msg ( VIK_GTK_WINDOW_FROM_LAYER(vtl), _("Could not turn off device.") ); + g_free ( device_off ); + } + } + + if ( dialog ) { + while ( !sess->thread_complete ) { + g_usleep (G_USEC_PER_SEC/10); + } + gtk_widget_destroy(dialog); + } + gps_session_delete(sess); + return 0; +} + +static void gps_upload_cb( gpointer layer_and_vlp[2] ) +{ + VikGpsLayer *vgl = (VikGpsLayer *)layer_and_vlp[0]; + VikLayersPanel *vlp = VIK_LAYERS_PANEL(layer_and_vlp[1]); + VikTrwLayer *vtl = vgl->trw_children[TRW_UPLOAD]; + VikWindow *vw = VIK_WINDOW(VIK_GTK_WINDOW_FROM_LAYER(vgl)); + VikViewport *vvp = vik_window_viewport(vw); + vik_gps_comm(vtl, NULL, GPS_UP, vgl->protocol, vgl->serial_port, FALSE, vvp, vlp, vgl->upload_tracks, vgl->upload_routes, vgl->upload_waypoints, FALSE); +} + +static void gps_download_cb( gpointer layer_and_vlp[2] ) +{ + VikGpsLayer *vgl = (VikGpsLayer *)layer_and_vlp[0]; + VikTrwLayer *vtl = vgl->trw_children[TRW_DOWNLOAD]; + VikWindow *vw = VIK_WINDOW(VIK_GTK_WINDOW_FROM_LAYER(vgl)); + VikViewport *vvp = vik_window_viewport(vw); +#if defined (VIK_CONFIG_REALTIME_GPS_TRACKING) && defined (GPSD_API_MAJOR_VERSION) + vik_gps_comm(vtl, NULL, GPS_DOWN, vgl->protocol, vgl->serial_port, vgl->realtime_tracking, vvp, NULL, vgl->download_tracks, vgl->download_routes, vgl->download_waypoints, FALSE); +#else + vik_gps_comm(vtl, NULL, GPS_DOWN, vgl->protocol, vgl->serial_port, FALSE, vvp, NULL, vgl->download_tracks, vgl->download_routes, vgl->download_waypoints, FALSE); +#endif +} + +static void gps_empty_upload_cb( gpointer layer_and_vlp[2] ) +{ + VikGpsLayer *vgl = (VikGpsLayer *)layer_and_vlp[0]; + // Get confirmation from the user + if ( ! a_dialog_yes_or_no ( VIK_GTK_WINDOW_FROM_WIDGET(layer_and_vlp[1]), + _("Are you sure you want to delete GPS Upload data?"), + NULL ) ) + return; + vik_trw_layer_delete_all_waypoints ( vgl-> trw_children[TRW_UPLOAD]); + vik_trw_layer_delete_all_tracks ( vgl-> trw_children[TRW_UPLOAD]); + vik_trw_layer_delete_all_routes ( vgl-> trw_children[TRW_UPLOAD]); +} + +static void gps_empty_download_cb( gpointer layer_and_vlp[2] ) +{ + VikGpsLayer *vgl = (VikGpsLayer *)layer_and_vlp[0]; + // Get confirmation from the user + if ( ! a_dialog_yes_or_no ( VIK_GTK_WINDOW_FROM_WIDGET(layer_and_vlp[1]), + _("Are you sure you want to delete GPS Download data?"), + NULL ) ) + return; + vik_trw_layer_delete_all_waypoints ( vgl-> trw_children[TRW_DOWNLOAD]); + vik_trw_layer_delete_all_tracks ( vgl-> trw_children[TRW_DOWNLOAD]); + vik_trw_layer_delete_all_routes ( vgl-> trw_children[TRW_DOWNLOAD]); +} + +#if defined (VIK_CONFIG_REALTIME_GPS_TRACKING) && defined (GPSD_API_MAJOR_VERSION) +static void gps_empty_realtime_cb( gpointer layer_and_vlp[2] ) +{ + VikGpsLayer *vgl = (VikGpsLayer *)layer_and_vlp[0]; + // Get confirmation from the user + if ( ! a_dialog_yes_or_no ( VIK_GTK_WINDOW_FROM_WIDGET(layer_and_vlp[1]), + _("Are you sure you want to delete GPS Realtime data?"), + NULL ) ) + return; + vik_trw_layer_delete_all_waypoints ( vgl-> trw_children[TRW_REALTIME]); + vik_trw_layer_delete_all_tracks ( vgl-> trw_children[TRW_REALTIME]); + vik_trw_layer_delete_all_routes ( vgl-> trw_children[TRW_REALTIME]); +} +#endif + +static void gps_empty_all_cb( gpointer layer_and_vlp[2] ) +{ + VikGpsLayer *vgl = (VikGpsLayer *)layer_and_vlp[0]; + // Get confirmation from the user + if ( ! a_dialog_yes_or_no ( VIK_GTK_WINDOW_FROM_WIDGET(layer_and_vlp[1]), + _("Are you sure you want to delete All GPS data?"), + NULL ) ) + return; + vik_trw_layer_delete_all_waypoints ( vgl-> trw_children[TRW_UPLOAD]); + vik_trw_layer_delete_all_tracks ( vgl-> trw_children[TRW_UPLOAD]); + vik_trw_layer_delete_all_routes ( vgl-> trw_children[TRW_UPLOAD]); + vik_trw_layer_delete_all_waypoints ( vgl-> trw_children[TRW_DOWNLOAD]); + vik_trw_layer_delete_all_tracks ( vgl-> trw_children[TRW_DOWNLOAD]); + vik_trw_layer_delete_all_routes ( vgl-> trw_children[TRW_DOWNLOAD]); +#if defined (VIK_CONFIG_REALTIME_GPS_TRACKING) && defined (GPSD_API_MAJOR_VERSION) + vik_trw_layer_delete_all_waypoints ( vgl-> trw_children[TRW_REALTIME]); + vik_trw_layer_delete_all_tracks ( vgl-> trw_children[TRW_REALTIME]); + vik_trw_layer_delete_all_routes ( vgl-> trw_children[TRW_REALTIME]); +#endif +} + +#if defined (VIK_CONFIG_REALTIME_GPS_TRACKING) && defined (GPSD_API_MAJOR_VERSION) +static void realtime_tracking_draw(VikGpsLayer *vgl, VikViewport *vp) +{ + struct LatLon ll; + VikCoord nw, se; + struct LatLon lnw, lse; + vik_viewport_screen_to_coord ( vp, -20, -20, &nw ); + vik_viewport_screen_to_coord ( vp, vik_viewport_get_width(vp)+20, vik_viewport_get_width(vp)+20, &se ); + vik_coord_to_latlon ( &nw, &lnw ); + vik_coord_to_latlon ( &se, &lse ); + if ( vgl->realtime_fix.fix.latitude > lse.lat && + vgl->realtime_fix.fix.latitude < lnw.lat && + vgl->realtime_fix.fix.longitude > lnw.lon && + vgl->realtime_fix.fix.longitude < lse.lon && + !isnan (vgl->realtime_fix.fix.track) ) { + VikCoord gps; + gint x, y; + gint half_back_x, half_back_y; + gint half_back_bg_x, half_back_bg_y; + gint pt_x, pt_y; + gint ptbg_x; + gint side1_x, side1_y, side2_x, side2_y; + gint side1bg_x, side1bg_y, side2bg_x, side2bg_y; + + ll.lat = vgl->realtime_fix.fix.latitude; + ll.lon = vgl->realtime_fix.fix.longitude; + vik_coord_load_from_latlon ( &gps, vik_viewport_get_coord_mode(vp), &ll); + vik_viewport_coord_to_screen ( vp, &gps, &x, &y ); + + gdouble heading_cos = cos(DEG2RAD(vgl->realtime_fix.fix.track)); + gdouble heading_sin = sin(DEG2RAD(vgl->realtime_fix.fix.track)); + + half_back_y = y+8*heading_cos; + half_back_x = x-8*heading_sin; + half_back_bg_y = y+10*heading_cos; + half_back_bg_x = x-10*heading_sin; + + pt_y = half_back_y-24*heading_cos; + pt_x = half_back_x+24*heading_sin; + //ptbg_y = half_back_bg_y-28*heading_cos; + ptbg_x = half_back_bg_x+28*heading_sin; + + side1_y = half_back_y+9*heading_sin; + side1_x = half_back_x+9*heading_cos; + side1bg_y = half_back_bg_y+11*heading_sin; + side1bg_x = half_back_bg_x+11*heading_cos; + + side2_y = half_back_y-9*heading_sin; + side2_x = half_back_x-9*heading_cos; + side2bg_y = half_back_bg_y-11*heading_sin; + side2bg_x = half_back_bg_x-11*heading_cos; + + GdkPoint trian[3] = { { pt_x, pt_y }, {side1_x, side1_y}, {side2_x, side2_y} }; + GdkPoint trian_bg[3] = { { ptbg_x, pt_y }, {side1bg_x, side1bg_y}, {side2bg_x, side2bg_y} }; + + vik_viewport_draw_polygon ( vp, vgl->realtime_track_bg_gc, TRUE, trian_bg, 3 ); + vik_viewport_draw_polygon ( vp, vgl->realtime_track_gc, TRUE, trian, 3 ); + vik_viewport_draw_rectangle ( vp, + (vgl->realtime_fix.fix.mode > MODE_2D) ? vgl->realtime_track_pt2_gc : vgl->realtime_track_pt1_gc, + TRUE, x-2, y-2, 4, 4 ); + //vgl->realtime_track_pt_gc = (vgl->realtime_track_pt_gc == vgl->realtime_track_pt1_gc) ? vgl->realtime_track_pt2_gc : vgl->realtime_track_pt1_gc; + } +} + +static VikTrackpoint* create_realtime_trackpoint(VikGpsLayer *vgl, gboolean forced) +{ + struct LatLon ll; + GList *last_tp; + + /* Note that fix.time is a double, but it should not affect the precision + for most GPS */ + time_t cur_timestamp = vgl->realtime_fix.fix.time; + time_t last_timestamp = vgl->last_fix.fix.time; + + if (cur_timestamp < last_timestamp) { + return NULL; + } + + if (vgl->realtime_record && vgl->realtime_fix.dirty) { + gboolean replace = FALSE; + int heading = isnan(vgl->realtime_fix.fix.track) ? 0 : (int)floor(vgl->realtime_fix.fix.track); + int last_heading = isnan(vgl->last_fix.fix.track) ? 0 : (int)floor(vgl->last_fix.fix.track); + int alt = isnan(vgl->realtime_fix.fix.altitude) ? VIK_DEFAULT_ALTITUDE : floor(vgl->realtime_fix.fix.altitude); + int last_alt = isnan(vgl->last_fix.fix.altitude) ? VIK_DEFAULT_ALTITUDE : floor(vgl->last_fix.fix.altitude); + if (((last_tp = g_list_last(vgl->realtime_track->trackpoints)) != NULL) && + (vgl->realtime_fix.fix.mode > MODE_2D) && + (vgl->last_fix.fix.mode <= MODE_2D) && + ((cur_timestamp - last_timestamp) < 2)) { + g_free(last_tp->data); + vgl->realtime_track->trackpoints = g_list_delete_link(vgl->realtime_track->trackpoints, last_tp); + replace = TRUE; + } + if (replace || + ((cur_timestamp != last_timestamp) && + ((forced || + ((heading < last_heading) && (heading < (last_heading - 3))) || + ((heading > last_heading) && (heading > (last_heading + 3))) || + ((alt != VIK_DEFAULT_ALTITUDE) && (alt != last_alt)))))) { + /* TODO: check for new segments */ + VikTrackpoint *tp = vik_trackpoint_new(); + tp->newsegment = FALSE; + tp->has_timestamp = TRUE; + tp->timestamp = vgl->realtime_fix.fix.time; + tp->altitude = alt; + /* speed only available for 3D fix. Check for NAN when use this speed */ + tp->speed = vgl->realtime_fix.fix.speed; + tp->course = vgl->realtime_fix.fix.track; + tp->nsats = vgl->realtime_fix.satellites_used; + tp->fix_mode = vgl->realtime_fix.fix.mode; + + ll.lat = vgl->realtime_fix.fix.latitude; + ll.lon = vgl->realtime_fix.fix.longitude; + vik_coord_load_from_latlon(&tp->coord, + vik_trw_layer_get_coord_mode(vgl->trw_children[TRW_REALTIME]), &ll); + + vik_track_add_trackpoint ( vgl->realtime_track, tp, TRUE ); // Ensure bounds is recalculated + vgl->realtime_fix.dirty = FALSE; + vgl->realtime_fix.satellites_used = 0; + vgl->last_fix = vgl->realtime_fix; + return tp; + } + } + return NULL; +} + +#define VIK_SETTINGS_GPS_STATUSBAR_FORMAT "gps_statusbar_format" + +static void update_statusbar ( VikGpsLayer *vgl, VikWindow *vw ) +{ + gchar *statusbar_format_code = NULL; + if ( !a_settings_get_string ( VIK_SETTINGS_GPS_STATUSBAR_FORMAT, &statusbar_format_code ) ) { + // Otherwise use default + statusbar_format_code = g_strdup ( "GSA" ); + } + + gchar *msg = vu_trackpoint_formatted_message ( statusbar_format_code, vgl->trkpt, vgl->trkpt_prev, vgl->realtime_track, vgl->last_fix.fix.climb ); + vik_statusbar_set_message ( vik_window_get_statusbar (vw), VIK_STATUSBAR_INFO, msg ); + g_free ( msg ); + g_free ( statusbar_format_code ); +} + +static void gpsd_raw_hook(VglGpsd *vgpsd, gchar *data) +{ + gboolean update_all = FALSE; + VikGpsLayer *vgl = vgpsd->vgl; + + if (!vgl->realtime_tracking) { + g_warning("%s: receiving GPS data while not in realtime mode", __PRETTY_FUNCTION__); + return; + } + + if ((vgpsd->gpsd.fix.mode >= MODE_2D) && + !isnan(vgpsd->gpsd.fix.latitude) && + !isnan(vgpsd->gpsd.fix.longitude)) { + + VikWindow *vw = VIK_WINDOW(VIK_GTK_WINDOW_FROM_LAYER(vgl)); + VikViewport *vvp = vik_window_viewport(vw); + vgl->realtime_fix.fix = vgpsd->gpsd.fix; + vgl->realtime_fix.satellites_used = vgpsd->gpsd.satellites_used; + vgl->realtime_fix.dirty = TRUE; + + struct LatLon ll; + VikCoord vehicle_coord; + + ll.lat = vgl->realtime_fix.fix.latitude; + ll.lon = vgl->realtime_fix.fix.longitude; + vik_coord_load_from_latlon(&vehicle_coord, + vik_trw_layer_get_coord_mode(vgl->trw_children[TRW_REALTIME]), &ll); + + if ((vgl->vehicle_position == VEHICLE_POSITION_CENTERED) || + (vgl->realtime_jump_to_start && vgl->first_realtime_trackpoint)) { + vik_viewport_set_center_coord(vvp, &vehicle_coord, FALSE); + update_all = TRUE; + } + else if (vgl->vehicle_position == VEHICLE_POSITION_ON_SCREEN) { + const int hdiv = 6; + const int vdiv = 6; + const int px = 20; /* adjust ment in pixels to make sure vehicle is inside the box */ + gint width = vik_viewport_get_width(vvp); + gint height = vik_viewport_get_height(vvp); + gint vx, vy; + + vik_viewport_coord_to_screen(vvp, &vehicle_coord, &vx, &vy); + update_all = TRUE; + if (vx < (width/hdiv)) + vik_viewport_set_center_screen(vvp, vx - width/2 + width/hdiv + px, vy); + else if (vx > (width - width/hdiv)) + vik_viewport_set_center_screen(vvp, vx + width/2 - width/hdiv - px, vy); + else if (vy < (height/vdiv)) + vik_viewport_set_center_screen(vvp, vx, vy - height/2 + height/vdiv + px); + else if (vy > (height - height/vdiv)) + vik_viewport_set_center_screen(vvp, vx, vy + height/2 - height/vdiv - px); + else + update_all = FALSE; + } + + vgl->first_realtime_trackpoint = FALSE; + + vgl->trkpt = create_realtime_trackpoint ( vgl, FALSE ); + + if ( vgl->trkpt ) { + if ( vgl->realtime_update_statusbar ) + update_statusbar ( vgl, vw ); + vgl->trkpt_prev = vgl->trkpt; + } + + vik_layer_emit_update ( update_all ? VIK_LAYER(vgl) : VIK_LAYER(vgl->trw_children[TRW_REALTIME]) ); // NB update from background thread + } +} + +#ifdef WINDOWS +/** + * Simple version for use with polling method + */ +static gboolean gpsd_data_check(gpointer user_data) +{ + VikGpsLayer *vgl = user_data; +#if GPSD_API_MAJOR_VERSION >= 5 + if (gps_read(&vgl->vgpsd->gpsd) > -1) { + gpsd_raw_hook(vgl->vgpsd, NULL); + } +#endif + return TRUE; +} +#else +/** + * Version for use with IO watch + */ +static gboolean gpsd_data_available(GIOChannel *source, GIOCondition condition, gpointer data) +{ + VikGpsLayer *vgl = data; + if (condition == G_IO_IN) { +#if GPSD_API_MAJOR_VERSION == 3 || GPSD_API_MAJOR_VERSION == 4 + if (!gps_poll(&vgl->vgpsd->gpsd)) { +#elif GPSD_API_MAJOR_VERSION == 5 || GPSD_API_MAJOR_VERSION == 6 + if (gps_read(&vgl->vgpsd->gpsd) > -1) { +#elif GPSD_API_MAJOR_VERSION >= 7 + if (gps_read(&vgl->vgpsd->gpsd, NULL, 0) > -1) { +#else + // Broken compile +#endif + // Reuse old function to perform operations on the new GPS data + gpsd_raw_hook(vgl->vgpsd, NULL); + return TRUE; + } + else { + g_warning("Disconnected from gpsd. Trying to reconnect"); + rt_gpsd_disconnect(vgl); + (void)rt_gpsd_connect(vgl, FALSE); + } + } + return FALSE; /* no further calling */ +} +#endif + +/** + * make_track_name: + * + * returns allocated string for a new realtime track name + * NB no i18n ATM + * free string after use + */ +static gchar *make_track_name(VikTrwLayer *vtl) +{ + const gchar basename[] = "REALTIME"; + const gint bufsize = sizeof(basename) + 5; + gchar *name = g_malloc(bufsize); + strcpy(name, basename); + gint i = 2; + + while (vik_trw_layer_get_track(vtl, name) != NULL) { + g_snprintf(name, bufsize, "%s#%d", basename, i); + i++; + } + return(name); +} + +/** + * rt_gpsd_try_connect: + * + * ATM Known to work up to at least GPSD_API_MAJOR_VERSION 7 + * + * Support for the old/very old GPSD API versions is increasingly subject + * to bitrot due to difficulty of creating/maintaining a test environment + * of old software versions + * + */ +static gboolean rt_gpsd_try_connect(gpointer *data) +{ + VikGpsLayer *vgl = (VikGpsLayer *)data; +#if GPSD_API_MAJOR_VERSION == 3 + struct gps_data_t *gpsd = gps_open(vgl->gpsd_host, vgl->gpsd_port); + + if (gpsd == NULL) { +#elif GPSD_API_MAJOR_VERSION == 4 + vgl->vgpsd = g_malloc(sizeof(VglGpsd)); + + if (gps_open_r(vgl->gpsd_host, vgl->gpsd_port, /*(struct gps_data_t *)*/vgl->vgpsd) != 0) { +#elif GPSD_API_MAJOR_VERSION >= 5 + vgl->vgpsd = g_malloc(sizeof(VglGpsd)); + vgl->vgpsd->gpsd_open = gps_open ( vgl->gpsd_host, vgl->gpsd_port, &vgl->vgpsd->gpsd ); + if ( vgl->vgpsd->gpsd_open != 0 ) { +#else +// Delibrately break compilation... +#endif + g_debug("Failed to connect to gpsd at %s (port %s). Will retry in %d seconds", + vgl->gpsd_host, vgl->gpsd_port, vgl->gpsd_retry_interval); + return TRUE; /* keep timer running */ + } + + vgl->connected_to_gpsd = TRUE; +#if GPSD_API_MAJOR_VERSION == 3 + vgl->vgpsd = realloc(gpsd, sizeof(VglGpsd)); +#endif + vgl->vgpsd->vgl = vgl; + + vgl->realtime_fix.dirty = vgl->last_fix.dirty = FALSE; + /* track alt/time graph uses VIK_DEFAULT_ALTITUDE (0.0) as invalid */ + vgl->realtime_fix.fix.altitude = vgl->last_fix.fix.altitude = VIK_DEFAULT_ALTITUDE; + vgl->realtime_fix.fix.speed = vgl->last_fix.fix.speed = NAN; + + if (vgl->realtime_record) { + VikTrwLayer *vtl = vgl->trw_children[TRW_REALTIME]; + vgl->realtime_track = vik_track_new(); + vgl->realtime_track->visible = TRUE; + gchar *name = make_track_name(vtl); + vik_trw_layer_add_track(vtl, name, vgl->realtime_track); + g_free(name); + } + + vgl->connected_to_gpsd = TRUE; + +#if GPSD_API_MAJOR_VERSION == 3 || GPSD_API_MAJOR_VERSION == 4 + gps_set_raw_hook(&vgl->vgpsd->gpsd, gpsd_raw_hook); +#endif + +#ifdef WINDOWS + // On Windows use a simple polling mechanism to read any latest gpsd data + vgl->realtime_io_watch_id = g_timeout_add (500, gpsd_data_check, vgl); +#else + vgl->realtime_io_channel = g_io_channel_unix_new(vgl->vgpsd->gpsd.gps_fd); + vgl->realtime_io_watch_id = g_io_add_watch( vgl->realtime_io_channel, + G_IO_IN | G_IO_ERR | G_IO_HUP, gpsd_data_available, vgl); +#endif + +#if GPSD_API_MAJOR_VERSION == 3 + gps_query(&vgl->vgpsd->gpsd, "w+x"); +#endif +#if GPSD_API_MAJOR_VERSION >= 4 + if ( gps_stream(&vgl->vgpsd->gpsd, WATCH_ENABLE, NULL) == -1 ) + g_critical ( "gps_stream error" ); +#endif + + return FALSE; /* no longer called by timeout */ +} + +static gboolean rt_ask_retry(VikGpsLayer *vgl) +{ + gchar *msg = g_strdup_printf ( _("Failed to connect to gpsd at %s (port %s)\n" + "Should Viking keep trying (every %d seconds)?"), + vgl->gpsd_host, vgl->gpsd_port, vgl->gpsd_retry_interval ); + gboolean ans = a_dialog_yes_or_no ( VIK_GTK_WINDOW_FROM_LAYER(vgl), msg, NULL ); + g_free ( msg ); + return ans; +} + +static gboolean rt_gpsd_connect(VikGpsLayer *vgl, gboolean ask_if_failed) +{ + vgl->realtime_retry_timer = 0; + if (rt_gpsd_try_connect((gpointer *)vgl)) { + if (vgl->gpsd_retry_interval <= 0) { + g_warning("Failed to connect to gpsd but will not retry because retry interval was set to %d (which is 0 or negative)", vgl->gpsd_retry_interval); + return FALSE; + } + else if (ask_if_failed && !rt_ask_retry(vgl)) + return FALSE; + else + vgl->realtime_retry_timer = g_timeout_add_seconds(vgl->gpsd_retry_interval, + (GSourceFunc)rt_gpsd_try_connect, (gpointer *)vgl); + } + return TRUE; +} + +static void rt_gpsd_disconnect(VikGpsLayer *vgl) +{ + if (vgl->realtime_retry_timer) { + g_source_remove(vgl->realtime_retry_timer); + vgl->realtime_retry_timer = 0; + } + if (vgl->realtime_io_watch_id) { + g_source_remove(vgl->realtime_io_watch_id); + vgl->realtime_io_watch_id = 0; + } + if (vgl->realtime_io_channel) { + GError *error = NULL; + g_io_channel_shutdown (vgl->realtime_io_channel, FALSE, &error); + vgl->realtime_io_channel = NULL; + } + if (vgl->vgpsd) { +#if GPSD_API_MAJOR_VERSION >= 4 + gps_stream(&vgl->vgpsd->gpsd, WATCH_DISABLE, NULL); +#endif + if ( vgl->vgpsd->gpsd_open == 0 ) + (void)gps_close(&vgl->vgpsd->gpsd); +#if GPSD_API_MAJOR_VERSION == 3 + free(vgl->vgpsd); +#elif GPSD_API_MAJOR_VERSION >= 4 + g_free(vgl->vgpsd); +#endif + vgl->vgpsd = NULL; + } + + if (vgl->realtime_record && vgl->realtime_track) { + if ((vgl->realtime_track->trackpoints == NULL) || (vgl->realtime_track->trackpoints->next == NULL)) + vik_trw_layer_delete_track(vgl->trw_children[TRW_REALTIME], vgl->realtime_track); + vgl->realtime_track = NULL; + } + vgl->connected_to_gpsd = FALSE; +} + +static void gps_start_stop_tracking_cb( gpointer layer_and_vlp[2]) +{ + VikGpsLayer *vgl = (VikGpsLayer *)layer_and_vlp[0]; + vgl->realtime_tracking = (vgl->realtime_tracking == FALSE); + + /* Make sure we are still in the boat with libgps */ + g_assert((VIK_GPS_MODE_2D == MODE_2D) && (VIK_GPS_MODE_3D == MODE_3D)); + + if (vgl->realtime_tracking) { + vgl->first_realtime_trackpoint = TRUE; + if (!rt_gpsd_connect(vgl, TRUE)) { + vgl->first_realtime_trackpoint = FALSE; + vgl->realtime_tracking = FALSE; + vgl->trkpt = NULL; + } + } + else { /* stop realtime tracking */ + vgl->first_realtime_trackpoint = FALSE; + vgl->trkpt = NULL; + rt_gpsd_disconnect(vgl); + } +} +#endif /* VIK_CONFIG_REALTIME_GPS_TRACKING */ diff --git a/src/vikgpslayer.h b/src/vikgpslayer.h new file mode 100644 index 0000000..47d5ac6 --- /dev/null +++ b/src/vikgpslayer.h @@ -0,0 +1,78 @@ +/* + * viking -- GPS Data and Topo Analyzer, Explorer, and Manager + * + * Copyright (C) 2003-2005, Evan Battaglia + * Copyright (C) 2006-2008, Quy Tonthat + * + * 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., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA + * + */ + +#ifndef _VIKING_GPSLAYER_H +#define _VIKING_GPSLAYER_H + +#include "viklayer.h" +#include "viktrack.h" + +G_BEGIN_DECLS + +#define VIK_GPS_LAYER_TYPE (vik_gps_layer_get_type ()) +#define VIK_GPS_LAYER(obj) (G_TYPE_CHECK_INSTANCE_CAST ((obj), VIK_GPS_LAYER_TYPE, VikGpsLayer)) +#define VIK_GPS_LAYER_CLASS(klass) (G_TYPE_CHECK_CLASS_CAST ((klass), VIK_GPS_LAYER_TYPE, VikGpsLayerClass)) +#define IS_VIK_GPS_LAYER(obj) (G_TYPE_CHECK_INSTANCE_TYPE ((obj), VIK_GPS_LAYER_TYPE)) +#define IS_VIK_GPS_LAYER_CLASS(klass) (G_TYPE_CHECK_CLASS_TYPE ((klass), VIK_GPS_LAYER_TYPE)) + +typedef struct _VikGpsLayerClass VikGpsLayerClass; +struct _VikGpsLayerClass +{ + VikLayerClass vik_layer_class; +}; + +GType vik_gps_layer_get_type (); + +typedef enum { + GPS_DOWN=0, + GPS_UP +} vik_gps_dir; + +typedef enum { + WPT=0, + TRK=1, + RTE=2 +} vik_gps_xfer_type; + +typedef struct _VikGpsLayer VikGpsLayer; + +gboolean vik_gps_layer_is_empty ( VikGpsLayer *vgl ); +const GList *vik_gps_layer_get_children ( VikGpsLayer *vgl ); +VikTrwLayer * vik_gps_layer_get_a_child(VikGpsLayer *vgl); + +// Non layer specific but expose communal method +gint vik_gps_comm ( VikTrwLayer *vtl, + VikTrack *track, + vik_gps_dir dir, + gchar *protocol, + gchar *port, + gboolean tracking, + VikViewport *vvp, + VikLayersPanel *vlp, + gboolean do_tracks, + gboolean do_routes, + gboolean do_waypoints, + gboolean turn_off); + +G_END_DECLS + +#endif diff --git a/src/viking.desktop.in b/src/viking.desktop.in new file mode 100644 index 0000000..ef1e4d2 --- /dev/null +++ b/src/viking.desktop.in @@ -0,0 +1,12 @@ +[Desktop Entry] +Version=1.0 +_Name=Viking +_GenericName=GPS Data Manager +_Comment=Map Based GPS Data Manager (live data capable). +Exec=viking %F +Icon=viking +Terminal=false +Type=Application +StartupNotify=true +Categories=GTK;Science;Maps;Geography;Education; +MimeType=application/vnd.google-earth.kml+xml;application/gpx+xml; diff --git a/src/viking.h b/src/viking.h new file mode 100644 index 0000000..cc4b148 --- /dev/null +++ b/src/viking.h @@ -0,0 +1,68 @@ +/* + * viking -- GPS Data and Topo Analyzer, Explorer, and Manager + * + * Copyright (C) 2003-2005, Evan Battaglia + * + * 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., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA + * + */ + +#ifndef __VIKING_VIKING_H +#define __VIKING_VIKING_H + +#include +#include +#include + +#ifdef WINDOWS +#include +#include +#endif + +#include "config.h" + +#include "globals.h" +#include "coords.h" +#include "vikcoord.h" +#include "vik_compat.h" +#include "download.h" +#include "vikwaypoint.h" +#include "viktrack.h" +#include "vikviewport.h" +#include "viktreeview.h" +#include "viklayer.h" +#include "viklayer_defaults.h" +#include "vikaggregatelayer.h" +#include "viklayerspanel.h" +#include "vikcoordlayer.h" +#include "vikgeoreflayer.h" +#include "vikstatus.h" +#include "vikfileentry.h" +#include "viktrwlayer.h" +#include "vikgpslayer.h" +#ifdef HAVE_LIBMAPNIK +#include "vikmapniklayer.h" +#endif +#include "clipboard.h" +#include "dialog.h" +#include "file.h" +#include "fileutils.h" +#include "vikwindow.h" +#include "gpspoint.h" +#include "settings.h" +#include "util.h" +#include "vikutils.h" + +#endif diff --git a/src/viklayer.c b/src/viklayer.c new file mode 100644 index 0000000..61cd531 --- /dev/null +++ b/src/viklayer.c @@ -0,0 +1,705 @@ +/* + * viking -- GPS Data and Topo Analyzer, Explorer, and Manager + * + * Copyright (C) 2005, Alex Foobarian + * Copyright (C) 2003-2007, Evan Battaglia + * Copyright (C) 2013, Rob Norris + * + * 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., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA + * + */ + +#ifdef HAVE_CONFIG_H +#include "config.h" +#endif + +#include + +#include "viking.h" +#include +#include +#include "viklayer_defaults.h" + +/* functions common to all layers. */ +/* TODO longone: rename interface free -> finalize */ + +extern VikLayerInterface vik_aggregate_layer_interface; +extern VikLayerInterface vik_trw_layer_interface; +extern VikLayerInterface vik_maps_layer_interface; +extern VikLayerInterface vik_coord_layer_interface; +extern VikLayerInterface vik_georef_layer_interface; +extern VikLayerInterface vik_gps_layer_interface; +extern VikLayerInterface vik_dem_layer_interface; +#ifdef HAVE_LIBMAPNIK +extern VikLayerInterface vik_mapnik_layer_interface; +#endif + +enum { + VL_UPDATE_SIGNAL, + VL_LAST_SIGNAL +}; +static guint layer_signals[VL_LAST_SIGNAL] = { 0 }; + +static GObjectClass *parent_class; + +static void vik_layer_finalize ( VikLayer *vl ); +static gboolean vik_layer_properties_factory ( VikLayer *vl, VikViewport *vp, gboolean have_apply ); +static gboolean layer_defaults_register ( VikLayerTypeEnum type ); + +G_DEFINE_TYPE (VikLayer, vik_layer, G_TYPE_OBJECT) + +static void vik_layer_class_init (VikLayerClass *klass) +{ + GObjectClass *object_class; + + object_class = G_OBJECT_CLASS (klass); + + object_class->finalize = (GObjectFinalizeFunc) vik_layer_finalize; + + parent_class = g_type_class_peek_parent (klass); + + layer_signals[VL_UPDATE_SIGNAL] = g_signal_new ( "update", G_TYPE_FROM_CLASS (klass), + G_SIGNAL_RUN_FIRST | G_SIGNAL_ACTION, G_STRUCT_OFFSET (VikLayerClass, update), NULL, NULL, + g_cclosure_marshal_VOID__VOID, G_TYPE_NONE, 0); + + // Register all parameter defaults, early in the start up sequence + VikLayerTypeEnum layer; + for ( layer = 0; layer < VIK_LAYER_NUM_TYPES; layer++ ) + // ATM ignore the returned value + layer_defaults_register ( layer ); +} + +/** + * Invoke the actual drawing via signal method + */ +static gboolean idle_draw ( VikLayer *vl ) +{ + g_signal_emit ( G_OBJECT(vl), layer_signals[VL_UPDATE_SIGNAL], 0 ); + return FALSE; // Nothing else to do +} + +/** + * Draw specified layer + */ +void vik_layer_emit_update ( VikLayer *vl ) +{ + if ( vl->visible && vl->realized ) { + GThread *thread = vik_window_get_thread ( VIK_WINDOW(VIK_GTK_WINDOW_FROM_LAYER(vl)) ); + if ( !thread ) + // Do nothing + return; + + vik_window_set_redraw_trigger(vl); + + // Only ever draw when there is time to do so + if ( g_thread_self() != thread ) + // Drawing requested from another (background) thread, so handle via the gdk thread method + gdk_threads_add_idle ( (GSourceFunc) idle_draw, vl ); + else + g_idle_add ( (GSourceFunc) idle_draw, vl ); + } +} + +/** + * should only be done by VikLayersPanel (hence never used from the background) + * need to redraw and record trigger when we make a layer invisible. + */ +void vik_layer_emit_update_although_invisible ( VikLayer *vl ) +{ + vik_window_set_redraw_trigger(vl); + g_idle_add ( (GSourceFunc) idle_draw, vl ); +} + +/* doesn't set the trigger. should be done by aggregate layer when child emits update. */ +void vik_layer_emit_update_secondary ( VikLayer *vl ) +{ + if ( vl->visible ) + // TODO: this can used from the background - eg in acquire + // so will need to flow background update status through too + g_idle_add ( (GSourceFunc) idle_draw, vl ); +} + +static VikLayerInterface *vik_layer_interfaces[VIK_LAYER_NUM_TYPES] = { + &vik_aggregate_layer_interface, + &vik_trw_layer_interface, + &vik_coord_layer_interface, + &vik_georef_layer_interface, + &vik_gps_layer_interface, + &vik_maps_layer_interface, + &vik_dem_layer_interface, +#ifdef HAVE_LIBMAPNIK + &vik_mapnik_layer_interface, +#endif +}; + +VikLayerInterface *vik_layer_get_interface ( VikLayerTypeEnum type ) +{ + g_assert ( type < VIK_LAYER_NUM_TYPES ); + return vik_layer_interfaces[type]; +} + +/** + * Store default values for this layer + * + * Returns whether any parameters where registered + */ +static gboolean layer_defaults_register ( VikLayerTypeEnum type ) +{ + // See if any parameters + VikLayerParam *params = vik_layer_interfaces[type]->params; + if ( ! params ) + return FALSE; + + gboolean answer = FALSE; // Incase all parameters are 'not in properties' + guint16 params_count = vik_layer_interfaces[type]->params_count; + guint16 i; + // Process each parameter + for ( i = 0; i < params_count; i++ ) { + if ( params[i].group != VIK_LAYER_NOT_IN_PROPERTIES ) { + if ( params[i].default_value ) { + VikLayerParamData paramd = params[i].default_value(); + a_layer_defaults_register ( ¶ms[i], paramd, vik_layer_interfaces[type]->fixed_layer_name ); + answer = TRUE; + } + } + } + + return answer; +} + +static void vik_layer_init ( VikLayer *vl ) +{ + vl->visible = TRUE; + vl->name = NULL; + vl->realized = FALSE; +} + +void vik_layer_set_type ( VikLayer *vl, VikLayerTypeEnum type ) +{ + vl->type = type; +} + +/* frees old name */ +void vik_layer_rename ( VikLayer *l, const gchar *new_name ) +{ + g_assert ( l != NULL ); + g_assert ( new_name != NULL ); + g_free ( l->name ); + l->name = g_strdup ( new_name ); +} + +void vik_layer_rename_no_copy ( VikLayer *l, gchar *new_name ) +{ + g_assert ( l != NULL ); + g_assert ( new_name != NULL ); + g_free ( l->name ); + l->name = new_name; +} + +const gchar *vik_layer_get_name ( VikLayer *l ) +{ + g_assert ( l != NULL); + return l->name; +} + +time_t vik_layer_get_timestamp ( VikLayer *vl ) +{ + if ( vik_layer_interfaces[vl->type]->get_timestamp ) + return vik_layer_interfaces[vl->type]->get_timestamp ( vl ); + return 0; +} + +VikLayer *vik_layer_create ( VikLayerTypeEnum type, VikViewport *vp, gboolean interactive ) +{ + VikLayer *new_layer = NULL; + g_assert ( type < VIK_LAYER_NUM_TYPES ); + + new_layer = vik_layer_interfaces[type]->create ( vp ); + + g_assert ( new_layer != NULL ); + + if ( interactive ) + { + if ( vik_layer_properties ( new_layer, vp, FALSE ) ) + /* We translate the name here */ + /* in order to avoid translating name set by user */ + vik_layer_rename ( VIK_LAYER(new_layer), _(vik_layer_interfaces[type]->name) ); + else + { + g_object_unref ( G_OBJECT(new_layer) ); /* cancel that */ + new_layer = NULL; + } + } + return new_layer; +} + +/** + * @have_apply: Whether the properties dialog should have an apply button + * + * Returns: + * TRUE if OK was pressed + * (i.e. should redraw as the properties could have changed) + */ +gboolean vik_layer_properties ( VikLayer *layer, VikViewport *vp, gboolean have_apply ) +{ + if ( vik_layer_interfaces[layer->type]->properties ) + return vik_layer_interfaces[layer->type]->properties ( layer, vp, have_apply ); + return vik_layer_properties_factory ( layer, vp, have_apply ); +} + +void vik_layer_draw ( VikLayer *l, VikViewport *vp ) +{ + if ( l->visible ) + if ( vik_layer_interfaces[l->type]->draw ) + vik_layer_interfaces[l->type]->draw ( l, vp ); +} + +void vik_layer_change_coord_mode ( VikLayer *l, VikCoordMode mode ) +{ + if ( vik_layer_interfaces[l->type]->change_coord_mode ) + vik_layer_interfaces[l->type]->change_coord_mode ( l, mode ); +} + +typedef struct { + VikLayerTypeEnum layer_type; + guint len; + guint8 data[0]; +} header_t; + +void vik_layer_marshall ( VikLayer *vl, guint8 **data, guint *len ) +{ + header_t *header; + if ( vl && vik_layer_interfaces[vl->type]->marshall ) { + vik_layer_interfaces[vl->type]->marshall ( vl, data, len ); + if (*data) { + header = g_malloc(*len + sizeof(*header)); + header->layer_type = vl->type; + header->len = *len; + memcpy(header->data, *data, *len); + g_free(*data); + *data = (guint8 *)header; + *len = *len + sizeof(*header); + } + } else { + *data = NULL; + } +} + +void vik_layer_marshall_params ( VikLayer *vl, guint8 **data, guint *datalen ) +{ + VikLayerParam *params = vik_layer_get_interface(vl->type)->params; + VikLayerFuncGetParam get_param = vik_layer_get_interface(vl->type)->get_param; + GByteArray* b = g_byte_array_new (); + guint len; + +#define vlm_append(obj, sz) \ + len = (sz); \ + g_byte_array_append ( b, (guint8 *)&len, sizeof(len) ); \ + g_byte_array_append ( b, (guint8 *)(obj), len ); + + // Store the internal properties first + vlm_append(&vl->visible, sizeof(vl->visible)); + vlm_append(vl->name, strlen(vl->name)); + + // Now the actual parameters + if ( params && get_param ) + { + VikLayerParamData d; + guint16 i, params_count = vik_layer_get_interface(vl->type)->params_count; + for ( i = 0; i < params_count; i++ ) + { + g_debug("%s: %s", __FUNCTION__, params[i].name); + d = get_param(vl, i, FALSE); + switch ( params[i].type ) + { + case VIK_LAYER_PARAM_STRING: + // Remember need braces as these are macro calls, not single statement functions! + if ( d.s ) { + vlm_append(d.s, strlen(d.s)); + } + else { + // Need to insert empty string otherwise the unmarshall will get confused + vlm_append("", 0); + } + break; + /* print out the string list in the array */ + case VIK_LAYER_PARAM_STRING_LIST: { + GList *list = d.sl; + + /* write length of list (# of strings) */ + guint listlen = g_list_length ( list ); + g_byte_array_append ( b, (guint8 *)&listlen, sizeof(listlen) ); + + /* write each string */ + while ( list ) { + gchar *s = (gchar *) list->data; + vlm_append(s, strlen(s)); + list = list->next; + } + + break; + } + default: + vlm_append(&d, sizeof(d)); + break; + } + } + } + + *data = b->data; + *datalen = b->len; + g_byte_array_free ( b, FALSE ); + +#undef vlm_append +} + +void vik_layer_unmarshall_params ( VikLayer *vl, const guint8 *data, guint datalen, VikViewport *vvp ) +{ + VikLayerParam *params = vik_layer_get_interface(vl->type)->params; + VikLayerFuncSetParam set_param = vik_layer_get_interface(vl->type)->set_param; + gchar *s; + guint8 *b = (guint8 *)data; + +#define vlm_size (*(gint *)b) +#define vlm_read(obj) \ + memcpy((obj), b+sizeof(guint), vlm_size); \ + b += sizeof(guint) + vlm_size; + + vlm_read(&vl->visible); + + s = g_malloc(vlm_size + 1); + s[vlm_size]=0; + vlm_read(s); + vik_layer_rename(vl, s); + g_free(s); + + if ( params && set_param ) + { + VikLayerSetParam vlsp; + vlsp.vp = vvp; + vlsp.is_file_operation = FALSE; + vlsp.dirpath = NULL; + guint16 i, params_count = vik_layer_get_interface(vl->type)->params_count; + for ( i = 0; i < params_count; i++ ) + { + vlsp.id = i; + g_debug("%s: %s", __FUNCTION__, params[i].name); + switch ( params[i].type ) + { + case VIK_LAYER_PARAM_STRING: + s = g_malloc(vlm_size + 1); + s[vlm_size]=0; + vlm_read(s); + vlsp.data.s = s; + (void)set_param(vl, &vlsp); + g_free(s); + break; + case VIK_LAYER_PARAM_STRING_LIST: { + guint listlen = vlm_size, j; + GList *list = NULL; + b += sizeof(guint); /* skip listlen */; + + for ( j = 0; j < listlen; j++ ) { + /* get a string */ + s = g_malloc(vlm_size + 1); + s[vlm_size]=0; + vlm_read(s); + list = g_list_append ( list, s ); + } + vlsp.data.sl = list; + (void)set_param(vl, &vlsp); + /* don't free -- string list is responsibility of the layer */ + + break; + } + default: + vlm_read(&vlsp.data); + (void)set_param(vl, &vlsp); + break; + } + } + } +} + +VikLayer *vik_layer_unmarshall ( const guint8 *data, guint len, VikViewport *vvp ) +{ + header_t *header; + header = (header_t *)data; + + if ( vik_layer_interfaces[header->layer_type]->unmarshall ) { + return vik_layer_interfaces[header->layer_type]->unmarshall ( header->data, header->len, vvp ); + } else { + return NULL; + } +} + +static void vik_layer_finalize ( VikLayer *vl ) +{ + g_assert ( vl != NULL ); + if ( vik_layer_interfaces[vl->type]->free ) + vik_layer_interfaces[vl->type]->free ( vl ); + if ( vl->name ) + g_free ( vl->name ); + G_OBJECT_CLASS(parent_class)->finalize(G_OBJECT(vl)); +} + +/* sublayer switching */ +gboolean vik_layer_sublayer_toggle_visible ( VikLayer *l, gint subtype, gpointer sublayer ) +{ + if ( vik_layer_interfaces[l->type]->sublayer_toggle_visible ) + return vik_layer_interfaces[l->type]->sublayer_toggle_visible ( l, subtype, sublayer ); + return TRUE; /* if unknown, will always be visible */ +} + +gboolean vik_layer_selected ( VikLayer *l, gint subtype, gpointer sublayer, gint type, gpointer vlp ) +{ + if ( vik_layer_interfaces[l->type]->layer_selected ) + return vik_layer_interfaces[l->type]->layer_selected ( l, subtype, sublayer, type, vlp ); + /* Since no 'layer_selected' function explicitly turn off here */ + return vik_window_clear_highlight ( (VikWindow *)VIK_GTK_WINDOW_FROM_LAYER(l) ); +} + +void vik_layer_realize ( VikLayer *l, VikTreeview *vt, GtkTreeIter *layer_iter ) +{ + l->vt = vt; + l->iter = *layer_iter; + l->realized = TRUE; + if ( vik_layer_interfaces[l->type]->realize ) + vik_layer_interfaces[l->type]->realize ( l, vt, layer_iter ); +} + +void vik_layer_set_menu_items_selection(VikLayer *l, guint16 selection) +{ + if ( vik_layer_interfaces[l->type]->set_menu_selection ) + vik_layer_interfaces[l->type]->set_menu_selection ( l, selection ); +} + +guint16 vik_layer_get_menu_items_selection(VikLayer *l) +{ + if ( vik_layer_interfaces[l->type]->get_menu_selection ) + return(vik_layer_interfaces[l->type]->get_menu_selection (l)); + else + return(vik_layer_interfaces[l->type]->menu_items_selection); +} + +void vik_layer_add_menu_items ( VikLayer *l, GtkMenu *menu, gpointer vlp ) +{ + if ( vik_layer_interfaces[l->type]->add_menu_items ) + vik_layer_interfaces[l->type]->add_menu_items ( l, menu, vlp ); +} + +gboolean vik_layer_sublayer_add_menu_items ( VikLayer *l, GtkMenu *menu, gpointer vlp, gint subtype, gpointer sublayer, GtkTreeIter *iter, VikViewport *vvp ) +{ + if ( vik_layer_interfaces[l->type]->sublayer_add_menu_items ) + return vik_layer_interfaces[l->type]->sublayer_add_menu_items ( l, menu, vlp, subtype, sublayer, iter, vvp ); + return FALSE; +} + + +const gchar *vik_layer_sublayer_rename_request ( VikLayer *l, const gchar *newname, gpointer vlp, gint subtype, gpointer sublayer, GtkTreeIter *iter ) +{ + if ( vik_layer_interfaces[l->type]->sublayer_rename_request ) + return vik_layer_interfaces[l->type]->sublayer_rename_request ( l, newname, vlp, subtype, sublayer, iter ); + return NULL; +} + +const gchar* vik_layer_sublayer_tooltip ( VikLayer *l, gint subtype, gpointer sublayer ) +{ + if ( vik_layer_interfaces[l->type]->sublayer_tooltip ) + return vik_layer_interfaces[l->type]->sublayer_tooltip ( l, subtype, sublayer ); + return NULL; +} + +const gchar* vik_layer_layer_tooltip ( VikLayer *l ) +{ + if ( vik_layer_interfaces[l->type]->layer_tooltip ) + return vik_layer_interfaces[l->type]->layer_tooltip ( l ); + return NULL; +} + +GdkPixbuf *vik_layer_load_icon ( VikLayerTypeEnum type ) +{ + g_assert ( type < VIK_LAYER_NUM_TYPES ); + if ( vik_layer_interfaces[type]->icon ) + return gdk_pixbuf_from_pixdata ( vik_layer_interfaces[type]->icon, FALSE, NULL ); + return NULL; +} + +gboolean vik_layer_set_param ( VikLayer *vl, VikLayerSetParam *vlsp ) +{ + if ( vik_layer_interfaces[vl->type]->set_param ) + return vik_layer_interfaces[vl->type]->set_param ( vl, vlsp ); + return FALSE; +} + +void vik_layer_post_read ( VikLayer *layer, VikViewport *vp, gboolean from_file ) +{ + if ( vik_layer_interfaces[layer->type]->post_read ) + vik_layer_interfaces[layer->type]->post_read ( layer, vp, from_file ); +} + +// Wrapper function to keep compiler happy +static void layer_emit_update_internal ( gpointer gp ) +{ + vik_layer_emit_update ( VIK_LAYER(gp)); +} + +static gboolean vik_layer_properties_factory ( VikLayer *vl, VikViewport *vp, gboolean have_apply ) +{ + switch ( a_uibuilder_properties_factory ( _("Layer Properties"), + VIK_GTK_WINDOW_FROM_WIDGET(vp), + vik_layer_interfaces[vl->type]->params, + vik_layer_interfaces[vl->type]->params_count, + vik_layer_interfaces[vl->type]->params_groups, + vik_layer_interfaces[vl->type]->params_groups_count, + (gpointer) vik_layer_interfaces[vl->type]->set_param, + NULL, + vl, + vp, + (gpointer) vik_layer_interfaces[vl->type]->get_param, + vl, + (gpointer) vik_layer_interfaces[vl->type]->change_param, + have_apply, + layer_emit_update_internal, + (gpointer)vl) ) { + case 0: + case 3: + return FALSE; + /* redraw (?) */ + case 2: + vik_layer_post_read ( vl, vp, FALSE ); /* update any gc's */ + default: + return TRUE; + } +} + +VikLayerTypeEnum vik_layer_type_from_string ( const gchar *str ) +{ + VikLayerTypeEnum i; + for ( i = 0; i < VIK_LAYER_NUM_TYPES; i++ ) + if ( strcasecmp ( str, vik_layer_get_interface(i)->fixed_layer_name ) == 0 ) + return i; + return VIK_LAYER_NUM_TYPES; +} + +void vik_layer_typed_param_data_free ( gpointer gp ) +{ + VikLayerTypedParamData *val = (VikLayerTypedParamData *)gp; + switch ( val->type ) { + case VIK_LAYER_PARAM_STRING: + if ( val->data.s ) + g_free ( (gpointer)val->data.s ); + break; + /* TODO: APPLICABLE TO US? NOTE: string layer works auniquely: data.sl should NOT be free'd when + * the internals call get_param -- i.e. it should be managed w/in the layer. + * The value passed by the internals into set_param should also be managed + * by the layer -- i.e. free'd by the layer. + */ + case VIK_LAYER_PARAM_STRING_LIST: + g_warning ("Param strings not implemented"); //fake it + break; + default: + break; + } + g_free ( val ); +} + +VikLayerTypedParamData *vik_layer_typed_param_data_copy_from_data (VikLayerParamType type, VikLayerParamData val) { + VikLayerTypedParamData *newval = g_new(VikLayerTypedParamData,1); + newval->data = val; + newval->type = type; + switch ( newval->type ) { + case VIK_LAYER_PARAM_STRING: { + gchar *s = g_strdup(newval->data.s); + newval->data.s = s; + break; + } + /* TODO: APPLICABLE TO US? NOTE: string layer works auniquely: data.sl should NOT be free'd when + * the internals call get_param -- i.e. it should be managed w/in the layer. + * The value passed by the internals into set_param should also be managed + * by the layer -- i.e. free'd by the layer. + */ + case VIK_LAYER_PARAM_STRING_LIST: + g_critical ( "Param strings not implemented"); //fake it + break; + default: + break; + } + return newval; +} + +#define TEST_BOOLEAN(str) (! ((str)[0] == '\0' || (str)[0] == '0' || (str)[0] == 'n' || (str)[0] == 'N' || (str)[0] == 'f' || (str)[0] == 'F') ) + +VikLayerTypedParamData *vik_layer_data_typed_param_copy_from_string ( VikLayerParamType type, const gchar *str ) +{ + VikLayerTypedParamData *rv = g_new(VikLayerTypedParamData,1); + rv->type = type; + switch ( type ) + { + case VIK_LAYER_PARAM_DOUBLE: rv->data.d = strtod(str, NULL); break; + case VIK_LAYER_PARAM_UINT: rv->data.u = strtoul(str, NULL, 10); break; + case VIK_LAYER_PARAM_INT: rv->data.i = strtol(str, NULL, 10); break; + case VIK_LAYER_PARAM_BOOLEAN: rv->data.b = TEST_BOOLEAN(str); break; + case VIK_LAYER_PARAM_COLOR: memset(&(rv->data.c), 0, sizeof(rv->data.c)); /* default: black */ + gdk_color_parse ( str, &(rv->data.c) ); break; + /* STRING or STRING_LIST -- if STRING_LIST, just set param to add a STRING */ + default: { + gchar *s = g_strdup(str); + rv->data.s = s; + } + } + return rv; +} + + +/** + * vik_layer_set_defaults: + * + * Loop around all parameters for the specified layer to call the function to get the + * default value for that parameter + */ +void vik_layer_set_defaults ( VikLayer *vl, VikViewport *vvp ) +{ + // Sneaky initialize of the viewport value here + vl->vvp = vvp; + VikLayerInterface *vli = vik_layer_get_interface ( vl->type ); + const gchar *layer_name = vli->fixed_layer_name; + VikLayerSetParam vlsp; + + vlsp.is_file_operation = TRUE; // Possibly come from a file + vlsp.dirpath = NULL; + vlsp.vp = vvp; + int i; + for ( i = 0; i < vli->params_count; i++ ) { + vlsp.id = i; + // Ensure parameter is for use + if ( vli->params[i].group > VIK_LAYER_NOT_IN_PROPERTIES ) { + // ATM can't handle string lists + // only DEM files uses this currently + if ( vli->params[i].type != VIK_LAYER_PARAM_STRING_LIST ) { + vlsp.data = a_layer_defaults_get ( layer_name, vli->params[i].name, vli->params[i].type ); + (void)vik_layer_set_param ( vl, &vlsp ); + } + } + } +} + +/** + * Make the layer more accessible within the treeview + */ +void vik_layer_expand_tree ( VikLayer *vl ) +{ + vik_treeview_expand ( vl->vt, &vl->iter ); +} diff --git a/src/viklayer.h b/src/viklayer.h new file mode 100644 index 0000000..657b196 --- /dev/null +++ b/src/viklayer.h @@ -0,0 +1,331 @@ +/* + * viking -- GPS Data and Topo Analyzer, Explorer, and Manager + * + * Copyright (C) 2003-2005, Evan Battaglia + * + * 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., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA + * + */ +#ifndef _VIKING_LAYER_H +#define _VIKING_LAYER_H + +#include +#include +#include +#include + +#include "uibuilder.h" +#include "vikwindow.h" +#include "viktreeview.h" +#include "vikviewport.h" + +G_BEGIN_DECLS + +#define VIK_LAYER_TYPE (vik_layer_get_type ()) +#define VIK_LAYER(obj) (G_TYPE_CHECK_INSTANCE_CAST ((obj), VIK_LAYER_TYPE, VikLayer)) +#define VIK_LAYER_CLASS(klass) (G_TYPE_CHECK_CLASS_CAST ((klass), VIK_LAYER_TYPE, VikLayerClass)) +#define IS_VIK_LAYER(obj) (G_TYPE_CHECK_INSTANCE_TYPE ((obj), VIK_LAYER_TYPE)) +#define IS_VIK_LAYER_CLASS(klass) (G_TYPE_CHECK_CLASS_TYPE ((klass), VIK_LAYER_TYPE)) + +typedef struct _VikLayer VikLayer; +typedef struct _VikLayerClass VikLayerClass; + +struct _VikLayerClass +{ + GObjectClass object_class; + void (* update) (VikLayer *vl); +}; + +GType vik_layer_get_type (); + +struct _VikLayer { + GObject obj; + gchar *name; + gboolean visible; + + gboolean realized; + VikViewport *vvp;/* simply a reference */ + VikTreeview *vt; /* simply a reference */ + GtkTreeIter iter; + + /* for explicit "polymorphism" (function type switching) */ + VikLayerTypeEnum type; +}; + +/* I think most of these are ignored, + * returning GRAB_FOCUS grabs the focus for mouse move, + * mouse click, release always grabs focus. Focus allows key presses + * to be handled. + * It used to be that, if ignored, Viking could look for other layers. + * this was useful for clicking a way/trackpoint in any layer, + * if no layer was selected (find way/trackpoint) + */ +typedef enum { + VIK_LAYER_TOOL_IGNORED=0, + VIK_LAYER_TOOL_ACK, + VIK_LAYER_TOOL_ACK_REDRAW_ABOVE, + VIK_LAYER_TOOL_ACK_REDRAW_ALL, + VIK_LAYER_TOOL_ACK_REDRAW_IF_VISIBLE, + VIK_LAYER_TOOL_ACK_GRAB_FOCUS, /* only for move */ +} VikLayerToolFuncStatus; + +/* gpointer is tool-specific state created in the constructor */ +typedef gpointer (*VikToolConstructorFunc) (VikWindow *, VikViewport *); +typedef void (*VikToolDestructorFunc) (gpointer); +typedef VikLayerToolFuncStatus (*VikToolMouseFunc) (VikLayer *, GdkEventButton *, gpointer); +typedef VikLayerToolFuncStatus (*VikToolMouseMoveFunc) (VikLayer *, GdkEventMotion *, gpointer); +typedef void (*VikToolActivationFunc) (VikLayer *, gpointer); +typedef gboolean (*VikToolKeyFunc) (VikLayer *, GdkEventKey *, gpointer); + +typedef struct _VikToolInterface VikToolInterface; +struct _VikToolInterface { + const GdkPixdata *icon; + GtkRadioActionEntry radioActionEntry; + VikToolConstructorFunc create; + VikToolDestructorFunc destroy; + VikToolActivationFunc activate; + VikToolActivationFunc deactivate; + VikToolMouseFunc click; + VikToolMouseMoveFunc move; + VikToolMouseFunc release; + VikToolKeyFunc key_press; /* return FALSE if we don't use the key press -- should return FALSE most of the time if we want any shortcuts / UI keybindings to work! use sparingly. */ + VikToolKeyFunc key_release; /* as above */ + gboolean pan_handler; // Call click & release funtions even when 'Pan Mode' is on + GdkCursorType cursor_type; + const GdkPixdata *cursor_data; + const GdkCursor *cursor; +}; + +/* Parameters (for I/O and Properties) */ +/* --> moved to uibuilder.h */ + +/* layer interface functions */ + +/* Create a new layer of a certain type. Should be filled with defaults */ +typedef VikLayer * (*VikLayerFuncCreate) (VikViewport *); + +/* normally only needed for layers with sublayers. This is called when they + * are added to the treeview so they can add sublayers to the treeview. */ +typedef void (*VikLayerFuncRealize) (VikLayer *,VikTreeview *,GtkTreeIter *); + +/* rarely used, this is called after a read operation or properties box is run. + * usually used to create GC's that depend on params, + * but GC's can also be created from create() or set_param() */ +typedef void (*VikLayerFuncPostRead) (VikLayer *,VikViewport *vp,gboolean from_file); + +typedef void (*VikLayerFuncFree) (VikLayer *); + +/* do _not_ use this unless absolutely neccesary. Use the dynamic properties (see coordlayer for example) + * returns TRUE if OK was pressed */ +typedef gboolean (*VikLayerFuncProperties) (VikLayer *,VikViewport *, gboolean); // gboolean is for using an apply button + +typedef void (*VikLayerFuncDraw) (VikLayer *,VikViewport *); +typedef void (*VikLayerFuncChangeCoordMode) (VikLayer *,VikCoordMode); + +typedef void (*VikLayerFuncSetMenuItemsSelection) (VikLayer *,guint16); +typedef guint16 (*VikLayerFuncGetMenuItemsSelection) (VikLayer *); + +typedef void (*VikLayerFuncAddMenuItems) (VikLayer *,GtkMenu *,gpointer); /* gpointer is a VikLayersPanel */ +typedef gboolean (*VikLayerFuncSublayerAddMenuItems) (VikLayer *,GtkMenu *,gpointer, /* first gpointer is a VikLayersPanel */ + gint,gpointer,GtkTreeIter *,VikViewport *); +typedef const gchar * (*VikLayerFuncSublayerRenameRequest) (VikLayer *,const gchar *,gpointer, + gint,VikViewport *,GtkTreeIter *); /* first gpointer is a VikLayersPanel */ +typedef gboolean (*VikLayerFuncSublayerToggleVisible) (VikLayer *,gint,gpointer); +typedef const gchar * (*VikLayerFuncSublayerTooltip) (VikLayer *,gint,gpointer); +typedef const gchar * (*VikLayerFuncLayerTooltip) (VikLayer *); +typedef gboolean (*VikLayerFuncLayerSelected) (VikLayer *,gint,gpointer,gint,gpointer); /* 2nd gpointer is a VikLayersPanel */ + +typedef void (*VikLayerFuncMarshall) (VikLayer *, guint8 **, guint *); +typedef VikLayer * (*VikLayerFuncUnmarshall) (guint8 *, guint, VikViewport *); + +/* returns TRUE if needs to redraw due to changed param */ +typedef gboolean (*VikLayerFuncSetParam) (VikLayer *, VikLayerSetParam* ); + +/* in parameter gboolean denotes if for file I/O, as opposed to display/cut/copy etc... operations */ +typedef VikLayerParamData + (*VikLayerFuncGetParam) (VikLayer *, guint16, gboolean); + +typedef void (*VikLayerFuncChangeParam) (GtkWidget *, ui_change_values ); + +typedef gboolean (*VikLayerFuncReadFileData) (VikLayer *, FILE *, const gchar *); // gchar* is the directory path. Function should report success or failure +typedef void (*VikLayerFuncWriteFileData) (VikLayer *, FILE *, const gchar *); // gchar* is the directory path. + +/* item manipulation */ +typedef void (*VikLayerFuncDeleteItem) (VikLayer *, gint, gpointer); + /* layer, subtype, pointer to sub-item */ +typedef void (*VikLayerFuncCutItem) (VikLayer *, gint, gpointer); +typedef void (*VikLayerFuncCopyItem) (VikLayer *, gint, gpointer, guint8 **, guint *); + /* layer, subtype, pointer to sub-item, return pointer, return len */ +typedef gboolean (*VikLayerFuncPasteItem) (VikLayer *, gint, guint8 *, guint); +typedef void (*VikLayerFuncFreeCopiedItem) (gint, gpointer); + +/* treeview drag and drop method. called on the destination layer. it is given a source and destination layer, + * and the source and destination iters in the treeview. + */ +typedef void (*VikLayerFuncDragDropRequest) (VikLayer *, VikLayer *, GtkTreeIter *, GtkTreePath *); + +typedef gboolean (*VikLayerFuncSelectClick) (VikLayer *, GdkEventButton *, VikViewport *, tool_ed_t*); +typedef gboolean (*VikLayerFuncSelectMove) (VikLayer *, GdkEventMotion *, VikViewport *, tool_ed_t*); +typedef gboolean (*VikLayerFuncSelectRelease) (VikLayer *, GdkEventButton *, VikViewport *, tool_ed_t*); +typedef gboolean (*VikLayerFuncSelectedViewportMenu) (VikLayer *, GdkEventButton *, VikViewport *); + +typedef time_t (*VikLayerFuncGetTimestamp) (VikLayer *); + +typedef enum { + VIK_MENU_ITEM_PROPERTY=1, + VIK_MENU_ITEM_CUT=2, + VIK_MENU_ITEM_COPY=4, + VIK_MENU_ITEM_PASTE=8, + VIK_MENU_ITEM_DELETE=16, + VIK_MENU_ITEM_ALL=0xff +} VikStdLayerMenuItem; + +typedef struct _VikLayerInterface VikLayerInterface; + +/* See vik_layer_* for function parameter names */ +struct _VikLayerInterface { + const gchar * fixed_layer_name; // Used in .vik files - this should never change to maintain file compatibility + const gchar * name; // Translate-able name used for display purposes + const gchar * accelerator; + const GdkPixdata * icon; + + VikToolInterface * tools; + guint16 tools_count; + + /* for I/O reading to and from .vik files -- params like coordline width, color, etc. */ + VikLayerParam * params; + guint16 params_count; + gchar ** params_groups; + guint8 params_groups_count; + + /* menu items to be created */ + VikStdLayerMenuItem menu_items_selection; + + VikLayerFuncCreate create; + VikLayerFuncRealize realize; + VikLayerFuncPostRead post_read; + VikLayerFuncFree free; + + VikLayerFuncProperties properties; + VikLayerFuncDraw draw; + VikLayerFuncChangeCoordMode change_coord_mode; + + VikLayerFuncGetTimestamp get_timestamp; + + VikLayerFuncSetMenuItemsSelection set_menu_selection; + VikLayerFuncGetMenuItemsSelection get_menu_selection; + + VikLayerFuncAddMenuItems add_menu_items; + VikLayerFuncSublayerAddMenuItems sublayer_add_menu_items; + VikLayerFuncSublayerRenameRequest sublayer_rename_request; + VikLayerFuncSublayerToggleVisible sublayer_toggle_visible; + VikLayerFuncSublayerTooltip sublayer_tooltip; + VikLayerFuncLayerTooltip layer_tooltip; + VikLayerFuncLayerSelected layer_selected; + + VikLayerFuncMarshall marshall; + VikLayerFuncUnmarshall unmarshall; + + /* for I/O */ + VikLayerFuncSetParam set_param; + VikLayerFuncGetParam get_param; + VikLayerFuncChangeParam change_param; + + /* for I/O -- extra non-param data like TrwLayer data */ + VikLayerFuncReadFileData read_file_data; + VikLayerFuncWriteFileData write_file_data; + + VikLayerFuncDeleteItem delete_item; + VikLayerFuncCutItem cut_item; + VikLayerFuncCopyItem copy_item; + VikLayerFuncPasteItem paste_item; + VikLayerFuncFreeCopiedItem free_copied_item; + + VikLayerFuncDragDropRequest drag_drop_request; + + VikLayerFuncSelectClick select_click; + VikLayerFuncSelectMove select_move; + VikLayerFuncSelectRelease select_release; + VikLayerFuncSelectedViewportMenu show_viewport_menu; +}; + +VikLayerInterface *vik_layer_get_interface ( VikLayerTypeEnum type ); + + +void vik_layer_set_type ( VikLayer *vl, VikLayerTypeEnum type ); +void vik_layer_draw ( VikLayer *l, VikViewport *vp ); +void vik_layer_change_coord_mode ( VikLayer *l, VikCoordMode mode ); +void vik_layer_rename ( VikLayer *l, const gchar *new_name ); +void vik_layer_rename_no_copy ( VikLayer *l, gchar *new_name ); +const gchar *vik_layer_get_name ( VikLayer *l ); + +time_t vik_layer_get_timestamp ( VikLayer *vl ); + +gboolean vik_layer_set_param ( VikLayer *vl, VikLayerSetParam *vlsp ); + +void vik_layer_set_defaults ( VikLayer *vl, VikViewport *vvp ); + +void vik_layer_emit_update ( VikLayer *vl ); + +/* GUI */ +void vik_layer_set_menu_items_selection(VikLayer *l, guint16 selection); +guint16 vik_layer_get_menu_items_selection(VikLayer *l); +void vik_layer_add_menu_items ( VikLayer *l, GtkMenu *menu, gpointer vlp ); +VikLayer *vik_layer_create ( VikLayerTypeEnum type, VikViewport *vp, gboolean interactive ); +gboolean vik_layer_properties ( VikLayer *layer, VikViewport *vp, gboolean have_apply ); + +void vik_layer_realize ( VikLayer *l, VikTreeview *vt, GtkTreeIter * layer_iter ); +void vik_layer_post_read ( VikLayer *layer, VikViewport *vp, gboolean from_file ); + +gboolean vik_layer_sublayer_add_menu_items ( VikLayer *l, GtkMenu *menu, gpointer vlp, gint subtype, gpointer sublayer, GtkTreeIter *iter, VikViewport *vvp ); + +void vik_layer_marshall ( VikLayer *vl, guint8 **data, guint *len ); +VikLayer *vik_layer_unmarshall ( const guint8 *data, guint len, VikViewport *vvp ); +void vik_layer_marshall_params ( VikLayer *vl, guint8 **data, guint *len ); +void vik_layer_unmarshall_params ( VikLayer *vl, const guint8 *data, guint len, VikViewport *vvp ); + +const gchar *vik_layer_sublayer_rename_request ( VikLayer *l, const gchar *newname, gpointer vlp, gint subtype, gpointer sublayer, GtkTreeIter *iter ); + +gboolean vik_layer_sublayer_toggle_visible ( VikLayer *l, gint subtype, gpointer sublayer ); + +const gchar* vik_layer_sublayer_tooltip ( VikLayer *l, gint subtype, gpointer sublayer ); + +const gchar* vik_layer_layer_tooltip ( VikLayer *l ); + +gboolean vik_layer_selected ( VikLayer *l, gint subtype, gpointer sublayer, gint type, gpointer vlp ); + +/* TODO: put in layerspanel */ +GdkPixbuf *vik_layer_load_icon ( VikLayerTypeEnum type ); + +VikLayer *vik_layer_get_and_reset_trigger(); +void vik_layer_emit_update_secondary ( VikLayer *vl ); /* to be called by aggregate layer only. doesn't set the trigger */ +void vik_layer_emit_update_although_invisible ( VikLayer *vl ); + +void vik_layer_expand_tree ( VikLayer *vl ); + +VikLayerTypeEnum vik_layer_type_from_string ( const gchar *str ); + +typedef struct { + VikLayerParamData data; + VikLayerParamType type; +} VikLayerTypedParamData; + +void vik_layer_typed_param_data_free ( gpointer gp ); +VikLayerTypedParamData *vik_layer_typed_param_data_copy_from_data ( VikLayerParamType type, VikLayerParamData val ); +VikLayerTypedParamData *vik_layer_data_typed_param_copy_from_string ( VikLayerParamType type, const gchar *str ); + +G_END_DECLS + +#endif diff --git a/src/viklayer_defaults.c b/src/viklayer_defaults.c new file mode 100644 index 0000000..8f6483e --- /dev/null +++ b/src/viklayer_defaults.c @@ -0,0 +1,418 @@ +/* -*- Mode: C; indent-tabs-mode: t; c-basic-offset: 4; tab-width: 4 -*- */ +/* + * viking -- GPS Data and Topo Analyzer, Explorer, and Manager + * + * Copyright (C) 2013, Rob Norris + * + * 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., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA + * + */ +#include +#include +#include +#include +#include +#include +#include "viklayer_defaults.h" +#include "dir.h" +#include "file.h" + +#define VIKING_LAYER_DEFAULTS_INI_FILE "viking_layer_defaults.ini" + +// A list of the parameter types in use +static GPtrArray *paramsVD; + +static GKeyFile *keyfile; + +static gboolean loaded; + +static VikLayerParamData get_default_data_answer ( const gchar *group, const gchar *name, VikLayerParamType ptype, gpointer *success ) +{ + VikLayerParamData data = VIK_LPD_BOOLEAN ( FALSE ); + + GError *error = NULL; + + switch ( ptype ) { + case VIK_LAYER_PARAM_DOUBLE: { + gdouble dd = g_key_file_get_double ( keyfile, group, name, &error ); + if ( !error ) data.d = dd; + break; + } + case VIK_LAYER_PARAM_UINT: { + guint32 uu = g_key_file_get_integer ( keyfile, group, name, &error ); + if ( !error ) data.u = uu; + break; + } + case VIK_LAYER_PARAM_INT: { + gint32 ii = g_key_file_get_integer ( keyfile, group, name, &error ); + if ( !error ) data.i = ii; + break; + } + case VIK_LAYER_PARAM_BOOLEAN: { + gboolean bb = g_key_file_get_boolean ( keyfile, group, name, &error ); + if ( !error ) data.b = bb; + break; + } + case VIK_LAYER_PARAM_STRING: { + gchar *str = g_key_file_get_string ( keyfile, group, name, &error ); + if ( !error ) data.s = str; + break; + } + //case VIK_LAYER_PARAM_STRING_LIST: { + // gchar **str = g_key_file_get_string_list ( keyfile, group, name, &error ); + // data.sl = str_to_glist (str); //TODO convert + // break; + //} + case VIK_LAYER_PARAM_COLOR: { + gchar *str = g_key_file_get_string ( keyfile, group, name, &error ); + if ( !error ) { + memset(&(data.c), 0, sizeof(data.c)); + gdk_color_parse ( str, &(data.c) ); + } + g_free ( str ); + break; + } + default: break; + } + *success = GINT_TO_POINTER (TRUE); + if ( error ) { + g_warning ( "%s", error->message ); + g_error_free ( error ); + *success = GINT_TO_POINTER (FALSE); + } + + return data; +} + +static VikLayerParamData get_default_data ( const gchar *group, const gchar *name, VikLayerParamType ptype ) +{ + gpointer success = GINT_TO_POINTER (TRUE); + // NB This should always succeed - don't worry about 'success' + return get_default_data_answer ( group, name, ptype, &success ); +} + +static void set_default_data ( VikLayerParamData data, const gchar *group, const gchar *name, VikLayerParamType ptype ) +{ + switch ( ptype ) { + case VIK_LAYER_PARAM_DOUBLE: + g_key_file_set_double ( keyfile, group, name, data.d ); + break; + case VIK_LAYER_PARAM_UINT: + g_key_file_set_integer ( keyfile, group, name, data.u ); + break; + case VIK_LAYER_PARAM_INT: + g_key_file_set_integer ( keyfile, group, name, data.i ); + break; + case VIK_LAYER_PARAM_BOOLEAN: + g_key_file_set_boolean ( keyfile, group, name, data.b ); + break; + case VIK_LAYER_PARAM_STRING: + g_key_file_set_string ( keyfile, group, name, data.s ); + break; + case VIK_LAYER_PARAM_COLOR: { + gchar *str = g_strdup_printf ( "#%.2x%.2x%.2x", (int)(data.c.red/256),(int)(data.c.green/256),(int)(data.c.blue/256)); + g_key_file_set_string ( keyfile, group, name, str ); + g_free ( str ); + break; + } + default: break; + } +} + +static void defaults_run_setparam ( gpointer index_ptr, guint16 i, VikLayerParamData data, VikLayerParam *params ) +{ + // Index is only an index into values from this layer + gint index = GPOINTER_TO_INT ( index_ptr ); + VikLayerParam *vlp = (VikLayerParam *)g_ptr_array_index(paramsVD,index+i); + + set_default_data ( data, vik_layer_get_interface(vlp->layer)->fixed_layer_name, vlp->name, vlp->type ); +} + +static VikLayerParamData defaults_run_getparam ( gpointer index_ptr, guint16 i, gboolean notused2 ) +{ + // Index is only an index into values from this layer + gint index = GPOINTER_TO_INT ( index_ptr ); + VikLayerParam *vlp = (VikLayerParam *)g_ptr_array_index(paramsVD,index+i); + + return get_default_data ( vik_layer_get_interface(vlp->layer)->fixed_layer_name, vlp->name, vlp->type ); +} + +static void use_internal_defaults_if_missing_default ( VikLayerTypeEnum type ) +{ + VikLayerParam *params = vik_layer_get_interface(type)->params; + if ( ! params ) + return; + + guint16 params_count = vik_layer_get_interface(type)->params_count; + guint16 i; + // Process each parameter + for ( i = 0; i < params_count; i++ ) { + if ( params[i].group != VIK_LAYER_NOT_IN_PROPERTIES ) { + gpointer success = GINT_TO_POINTER (FALSE); + // Check current default is available + (void)get_default_data_answer ( vik_layer_get_interface(type)->fixed_layer_name, params[i].name, params[i].type, &success ); + // If no longer have a viable default + if ( ! GPOINTER_TO_INT (success) ) { + // Reset value + if ( params[i].default_value ) { + VikLayerParamData paramd = params[i].default_value(); + set_default_data ( paramd, vik_layer_get_interface(type)->fixed_layer_name, params[i].name, params[i].type ); + } + } + } + } +} + +static gboolean defaults_load_from_file() +{ + GKeyFileFlags flags = G_KEY_FILE_KEEP_COMMENTS; + + GError *error = NULL; + + gchar *fn = g_build_filename ( a_get_viking_dir(), VIKING_LAYER_DEFAULTS_INI_FILE, NULL ); + + if ( !g_key_file_load_from_file ( keyfile, fn, flags, &error ) ) { + g_warning ( "%s: %s", error->message, fn ); + g_free ( fn ); + g_error_free ( error ); + return FALSE; + } + + g_free ( fn ); + + // Ensure if have a key file, then any missing values are set from the internal defaults + VikLayerTypeEnum layer; + for ( layer = 0; layer < VIK_LAYER_NUM_TYPES; layer++ ) { + use_internal_defaults_if_missing_default ( layer ); + } + + return TRUE; +} + +/* TRUE on success */ +static gboolean layer_defaults_save_to_file() +{ + gboolean answer = TRUE; + GError *error = NULL; + gchar *fn = g_build_filename ( a_get_viking_dir(), VIKING_LAYER_DEFAULTS_INI_FILE, NULL ); + gsize size; + + gchar *keyfilestr = g_key_file_to_data ( keyfile, &size, &error ); + + if ( error ) { + g_warning ( "%s", error->message ); + g_error_free ( error ); + answer = FALSE; + goto tidy; + } + + // optionally could do: + // g_file_set_contents ( fn, keyfilestr, size, &error ); + // if ( error ) { + // g_warning ( "%s: %s", error->message, fn ); + // g_error_free ( error ); + // answer = FALSE; + // goto tidy; + // } + + FILE *ff; + if ( !(ff = g_fopen ( fn, "w")) ) { + g_warning ( _("Could not open file: %s"), fn ); + answer = FALSE; + goto tidy; + } + // Layer defaults not that secret, but just incase... + if ( g_chmod ( fn, 0600 ) != 0 ) + g_warning ( "%s: Failed to set permissions on %s", __FUNCTION__, fn ); + + fputs ( keyfilestr, ff ); + fclose ( ff ); + +tidy: + g_free ( keyfilestr ); + g_free ( fn ); + + return answer; +} + +/** + * a_layer_defaults_show_window: + * @parent: The Window + * @layername: The layer + * + * This displays a Window showing the default parameter values for the selected layer + * It allows the parameters to be changed. + * + * Returns: %TRUE if the window is displayed (because there are parameters to view) + */ +gboolean a_layer_defaults_show_window ( GtkWindow *parent, const gchar *layername ) +{ + if ( ! loaded ) { + // since we can't load the file in a_defaults_init (no params registered yet), + // do it once before we display the params. + defaults_load_from_file(); + loaded = TRUE; + } + + VikLayerTypeEnum layer = vik_layer_type_from_string ( layername ); + + // Need to know where the params start and they finish for this layer + + // 1. inspect every registered param - see if it has the layer value required to determine overall size + // [they are contiguous from the start index] + // 2. copy the these params from the main list into a tmp struct + // + // Then pass this tmp struct to uibuilder for display + + guint layer_params_count = 0; + + gboolean found_first = FALSE; + gint index = 0; + int i; + for ( i = 0; i < paramsVD->len; i++ ) { + VikLayerParam *param = (VikLayerParam*)(g_ptr_array_index(paramsVD,i)); + if ( param->layer == layer ) { + layer_params_count++; + if ( !found_first ) { + index = i; + found_first = TRUE; + } + } + } + + // Have we any parameters to show! + if ( !layer_params_count ) + return FALSE; + + VikLayerParam *params = g_new(VikLayerParam,layer_params_count); + for ( i = 0; i < layer_params_count; i++ ) { + params[i] = *((VikLayerParam*)(g_ptr_array_index(paramsVD,i+index))); + } + + gchar *title = g_strconcat ( layername, ": ", _("Layer Defaults"), NULL ); + + if ( a_uibuilder_properties_factory ( title, + parent, + params, + layer_params_count, + vik_layer_get_interface(layer)->params_groups, + vik_layer_get_interface(layer)->params_groups_count, + NULL, + (gboolean (*) (gpointer,guint16,VikLayerParamData,gpointer)) defaults_run_setparam, + GINT_TO_POINTER ( index ), + params, + defaults_run_getparam, + GINT_TO_POINTER ( index ), + NULL, + FALSE, + NULL, + NULL) ) { + // Save + layer_defaults_save_to_file(); + } + + g_free ( title ); + g_free ( params ); + + return TRUE; +} + +/** + * a_layer_defaults_register: + * @vlp: The parameter + * @defaultval: The default value + * @layername: The layer in which the parameter resides + * + * Call this function on to set the default value for the particular parameter + */ +void a_layer_defaults_register (VikLayerParam *vlp, VikLayerParamData defaultval, const gchar *layername ) +{ + /* copy value */ + VikLayerParam *newvlp = g_new(VikLayerParam,1); + *newvlp = *vlp; + + g_ptr_array_add ( paramsVD, newvlp ); + + set_default_data ( defaultval, layername, vlp->name, vlp->type ); +} + +/** + * a_layer_defaults_init: + * + * Call this function at startup + */ +void a_layer_defaults_init() +{ + keyfile = g_key_file_new(); + + /* not copied */ + paramsVD = g_ptr_array_new (); + + loaded = FALSE; +} + +/** + * a_layer_defaults_uninit: + * + * Call this function on program exit + */ +void a_layer_defaults_uninit() +{ + g_key_file_free ( keyfile ); + g_ptr_array_foreach ( paramsVD, (GFunc)g_free, NULL ); + g_ptr_array_free ( paramsVD, TRUE ); +} + +/** + * a_layer_defaults_get: + * @layername: String name of the layer + * @param_name: String name of the parameter + * @param_type: The parameter type + * + * Call this function to get the default value for the parameter requested + */ +VikLayerParamData a_layer_defaults_get ( const gchar *layername, const gchar *param_name, VikLayerParamType param_type ) +{ + if ( ! loaded ) { + // since we can't load the file in a_defaults_init (no params registered yet), + // do it once before we get the first key. + defaults_load_from_file(); + loaded = TRUE; + } + + return get_default_data ( layername, param_name, param_type ); +} + +/** + * a_layer_defaults_save: + * + * Call this function to save the current layer defaults + * Normally should only be performed if any layer defaults have been changed via direct manipulation of the layer + * rather than the user changing the preferences via the dialog window above + * + * This must only be performed once all layer parameters have been initialized + * + * Returns: %TRUE if saving was successful + */ +gboolean a_layer_defaults_save () +{ + // Generate defaults + VikLayerTypeEnum layer; + for ( layer = 0; layer < VIK_LAYER_NUM_TYPES; layer++ ) { + use_internal_defaults_if_missing_default ( layer ); + } + + return layer_defaults_save_to_file(); +} diff --git a/src/viklayer_defaults.h b/src/viklayer_defaults.h new file mode 100644 index 0000000..4350629 --- /dev/null +++ b/src/viklayer_defaults.h @@ -0,0 +1,42 @@ +/* -*- Mode: C; indent-tabs-mode: t; c-basic-offset: 4; tab-width: 4 -*- */ +/* + * viking -- GPS Data and Topo Analyzer, Explorer, and Manager + * + * Copyright (C) 2013, Rob Norris + * + * 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., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA + * + */ +#ifndef __VIKING_LAYER_DEFAULTS_H +#define __VIKING_LAYER_DEFAULTS_H + +#include "uibuilder.h" + +G_BEGIN_DECLS + +void a_layer_defaults_init(); +void a_layer_defaults_uninit(); + +void a_layer_defaults_register ( VikLayerParam *vlp, VikLayerParamData defaultval, const gchar *layername ); + +gboolean a_layer_defaults_show_window ( GtkWindow *parent, const gchar *layername ); + +VikLayerParamData a_layer_defaults_get ( const gchar *layername, const gchar *param_name, VikLayerParamType param_type ); + +gboolean a_layer_defaults_save (); + +G_END_DECLS + +#endif diff --git a/src/viklayerspanel.c b/src/viklayerspanel.c new file mode 100644 index 0000000..1c0ce5d --- /dev/null +++ b/src/viklayerspanel.c @@ -0,0 +1,1025 @@ +/* + * viking -- GPS Data and Topo Analyzer, Explorer, and Manager + * + * Copyright (C) 2003-2005, Evan Battaglia + * Copyright (c) 2018, Rob Norris + * + * 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., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA + * + */ + +#ifdef HAVE_CONFIG_H +#include "config.h" +#endif + +#include "viking.h" +#include "settings.h" + +#include +#include + +#include +#include + +enum { + VLP_UPDATE_SIGNAL, + VLP_DELETE_LAYER_SIGNAL, + VLP_LAST_SIGNAL +}; + +// Calendar markup +typedef enum { + VLP_CAL_MU_NONE = 0, + VLP_CAL_MU_MARKED, + VLP_CAL_MU_DETAIL, + VLP_CAL_MU_AUTO, + VLP_CAL_MU_LAST, +} calendar_mu_t; + +static guint layers_panel_signals[VLP_LAST_SIGNAL] = { 0 }; + +static GObjectClass *parent_class; + +struct _VikLayersPanel { + GtkVBox vbox; + GtkWidget *hbox; + GtkWidget *calendar; + // Could use gtk_widget_get_visible () instead, but needs Gtk2.18 + // ATM still using Gtk2.16 - so manually track the state for now + // NB Doesn't consider if the layers panel is shown or not. + gboolean cal_shown; + calendar_mu_t cal_markup; + + VikAggregateLayer *toplayer; + GtkTreeIter toplayer_iter; + + VikTreeview *vt; + VikViewport *vvp; /* reference */ +}; + +static GtkActionEntry entries[] = { + { "Cut", GTK_STOCK_CUT, N_("C_ut"), NULL, NULL, (GCallback) vik_layers_panel_cut_selected }, + { "Copy", GTK_STOCK_COPY, N_("_Copy"), NULL, NULL, (GCallback) vik_layers_panel_copy_selected }, + { "Paste", GTK_STOCK_PASTE, N_("_Paste"), NULL, NULL, (GCallback) vik_layers_panel_paste_selected }, + { "Delete", GTK_STOCK_DELETE, N_("_Delete"), NULL, NULL, (GCallback) vik_layers_panel_delete_selected }, +}; + +static void layers_item_toggled (VikLayersPanel *vlp, GtkTreeIter *iter); +static void layers_item_edited (VikLayersPanel *vlp, GtkTreeIter *iter, const gchar *new_text); +static void menu_popup_cb (VikLayersPanel *vlp); +static void layers_popup_cb (VikLayersPanel *vlp); +static void layers_popup ( VikLayersPanel *vlp, GtkTreeIter *iter, gint mouse_button ); +static gboolean layers_button_press_cb (VikLayersPanel *vlp, GdkEventButton *event); +static gboolean layers_key_press_cb (VikLayersPanel *vlp, GdkEventKey *event); +static void layers_move_item ( VikLayersPanel *vlp, gboolean up ); +static void layers_move_item_up ( VikLayersPanel *vlp ); +static void layers_move_item_down ( VikLayersPanel *vlp ); +static void layers_panel_finalize ( GObject *gob ); + +G_DEFINE_TYPE (VikLayersPanel, vik_layers_panel, GTK_TYPE_VBOX) + +static void vik_layers_panel_class_init ( VikLayersPanelClass *klass ) +{ + GObjectClass *object_class; + + object_class = G_OBJECT_CLASS (klass); + + object_class->finalize = layers_panel_finalize; + + parent_class = g_type_class_peek_parent (klass); + + layers_panel_signals[VLP_UPDATE_SIGNAL] = g_signal_new ( "update", G_TYPE_FROM_CLASS (klass), G_SIGNAL_RUN_FIRST | G_SIGNAL_ACTION, G_STRUCT_OFFSET (VikLayersPanelClass, update), NULL, NULL, g_cclosure_marshal_VOID__VOID, G_TYPE_NONE, 0); + layers_panel_signals[VLP_DELETE_LAYER_SIGNAL] = g_signal_new ( "delete_layer", G_TYPE_FROM_CLASS (klass), G_SIGNAL_RUN_FIRST | G_SIGNAL_ACTION, G_STRUCT_OFFSET (VikLayersPanelClass, update), NULL, NULL, g_cclosure_marshal_VOID__VOID, G_TYPE_NONE, 0); + } + +VikLayersPanel *vik_layers_panel_new () +{ + return VIK_LAYERS_PANEL ( g_object_new ( VIK_LAYERS_PANEL_TYPE, NULL ) ); +} + +void vik_layers_panel_set_viewport ( VikLayersPanel *vlp, VikViewport *vvp ) +{ + vlp->vvp = vvp; + /* TODO: also update GCs (?) */ +} + +VikViewport *vik_layers_panel_get_viewport ( VikLayersPanel *vlp ) +{ + return vlp->vvp; +} + +static gboolean layers_panel_new_layer ( gpointer lpnl[2] ) +{ + return vik_layers_panel_new_layer ( lpnl[0], GPOINTER_TO_INT(lpnl[1]) ); +} + +/** + * Create menu popup on demand + * @full: offer cut/copy options as well - not just the new layer options + */ +static GtkWidget* layers_panel_create_popup ( VikLayersPanel *vlp, gboolean full ) +{ + GtkWidget *menu = gtk_menu_new (); + GtkWidget *menuitem; + guint ii; + + if ( full ) { + for ( ii = 0; ii < G_N_ELEMENTS(entries); ii++ ) { + if ( entries[ii].stock_id ) { + menuitem = gtk_image_menu_item_new_with_mnemonic ( entries[ii].label ); + gtk_image_menu_item_set_image ( (GtkImageMenuItem*)menuitem, gtk_image_new_from_stock (entries[ii].stock_id, GTK_ICON_SIZE_MENU) ); + } + else + menuitem = gtk_menu_item_new_with_mnemonic ( entries[ii].label ); + + g_signal_connect_swapped ( G_OBJECT(menuitem), "activate", G_CALLBACK(entries[ii].callback), vlp ); + gtk_menu_shell_append (GTK_MENU_SHELL (menu), menuitem); + gtk_widget_show ( menuitem ); + } + } + + GtkWidget *submenu = gtk_menu_new(); + menuitem = gtk_menu_item_new_with_mnemonic ( _("New Layer") ); + gtk_menu_shell_append (GTK_MENU_SHELL (menu), menuitem); + gtk_widget_show ( menuitem ); + gtk_menu_item_set_submenu (GTK_MENU_ITEM (menuitem), submenu ); + + // Static: so memory accessible yet not continually allocated + static gpointer lpnl[VIK_LAYER_NUM_TYPES][2]; + + for ( ii = 0; ii < VIK_LAYER_NUM_TYPES; ii++ ) { + if ( vik_layer_get_interface(ii)->icon ) { + menuitem = gtk_image_menu_item_new_with_mnemonic ( _(vik_layer_get_interface(ii)->name) ); + gtk_image_menu_item_set_image ( (GtkImageMenuItem*)menuitem, gtk_image_new_from_pixbuf ( vik_layer_load_icon (ii) ) ); + } + else + menuitem = gtk_menu_item_new_with_mnemonic ( _(vik_layer_get_interface(ii)->name) ); + + lpnl[ii][0] = vlp; + lpnl[ii][1] = GINT_TO_POINTER(ii); + + g_signal_connect_swapped ( G_OBJECT(menuitem), "activate", G_CALLBACK(layers_panel_new_layer), lpnl[ii] ); + gtk_menu_shell_append (GTK_MENU_SHELL (submenu), menuitem); + gtk_widget_show ( menuitem ); + } + + return menu; +} + +static void calendar_mark_layer_in_month ( VikLayersPanel *vlp, VikTrwLayer *vtl ) +{ + guint year, month, day; + gtk_calendar_get_date ( GTK_CALENDAR(vlp->calendar), &year, &month, &day ); + GDate *gd = g_date_new(); + GHashTable *trks = vik_trw_layer_get_tracks ( vtl ); + GHashTableIter iter; + gpointer key, value; + // Foreach Track + g_hash_table_iter_init ( &iter, trks ); + while ( g_hash_table_iter_next ( &iter, &key, &value ) ) { + VikTrack *trk = VIK_TRACK(value); + // First trackpoint + if ( trk->trackpoints && VIK_TRACKPOINT(trk->trackpoints->data)->has_timestamp ) { + g_date_set_time_t ( gd, VIK_TRACKPOINT(trk->trackpoints->data)->timestamp ); + // Is in selected month? + if ( g_date_get_year(gd) == year && (g_date_get_month(gd) == (month+1)) ) { + gtk_calendar_mark_day ( GTK_CALENDAR(vlp->calendar), g_date_get_day(gd) ); + break; + } + } + } + g_date_free ( gd ); +} + +/** + * + */ +void layers_panel_calendar_update ( VikLayersPanel *vlp ) +{ + // Skip if not shown... + if ( !vlp->cal_shown ) + return; + + gtk_calendar_clear_marks ( GTK_CALENDAR(vlp->calendar) ); + + GList *layers = vik_layers_panel_get_all_layers_of_type ( vlp, VIK_LAYER_TRW, TRUE ); + if ( !layers ) + return; + + while ( layers ) { + VikTrwLayer *vtl = VIK_TRW_LAYER(layers->data); + calendar_mark_layer_in_month ( vlp, vtl ); + layers = g_list_next ( layers ); + } + g_list_free ( layers ); +} + +/** + * + */ +void vik_layers_panel_calendar_update ( VikLayersPanel *vlp ) +{ + if ( vlp->cal_markup == VLP_CAL_MU_NONE ) + return; + + clock_t begin = clock(); + layers_panel_calendar_update ( vlp ); + clock_t end = clock(); + double time_spent = (double)(end - begin) / CLOCKS_PER_SEC; + g_debug ( "%s: %f", __FUNCTION__, time_spent ); + // Downgrade automatic detail if taking too long + // Since ATM the detail method invokes x30 searches, + // it could get noticably slow + if ( vlp->cal_markup == VLP_CAL_MU_AUTO ) + if ( time_spent > (0.5/30.0) ) + vlp->cal_markup = VLP_CAL_MU_MARKED; +} + +static void layers_calendar_day_selected_dc_cb ( VikLayersPanel *vlp ) +{ + // Ideally only need to search if the day is marked... + guint year, month, day; + gtk_calendar_get_date ( GTK_CALENDAR(vlp->calendar), &year, &month, &day ); + gchar *date_str = g_strdup_printf ( "%d-%02d-%02d", year, month+1, day ); + (void)vik_aggregate_layer_search_date ( vlp->toplayer, date_str ); + g_free ( date_str ); +} + +static gchar *calendar_detail ( GtkCalendar *calendar, + guint year, + guint month, + guint day, + gpointer user_data ) +{ + VikLayersPanel *vlp = (VikLayersPanel*)user_data; + // Skip if not shown... + if ( !vlp->cal_shown ) + return NULL; + + // Check that detail is wanted + if ( vlp->cal_markup < VLP_CAL_MU_DETAIL ) + return NULL; + + guint ayear, amonth, aday; + gtk_calendar_get_date ( GTK_CALENDAR(vlp->calendar), &ayear, &amonth, &aday ); + + // Only bother for this actual month + // As this event gets fired for the surrounding days too + if ( amonth != month ) + return NULL; + + GList *layers = vik_layers_panel_get_all_layers_of_type ( vlp, VIK_LAYER_TRW, TRUE ); + if ( !layers ) + return NULL; + + gboolean need_to_break = FALSE; + VikTrwLayer *vtl = NULL; + GDate *gd = g_date_new(); + while ( layers ) { + vtl = VIK_TRW_LAYER(layers->data); + + GHashTable *trks = vik_trw_layer_get_tracks ( vtl ); + GHashTableIter iter; + gpointer key, value; + // Foreach Track + g_hash_table_iter_init ( &iter, trks ); + while ( g_hash_table_iter_next ( &iter, &key, &value ) ) { + VikTrack *trk = VIK_TRACK(value); + // First trackpoint + if ( trk->trackpoints && VIK_TRACKPOINT(trk->trackpoints->data)->has_timestamp ) { + g_date_set_time_t ( gd, VIK_TRACKPOINT(trk->trackpoints->data)->timestamp ); + // Is of this day? + if ( g_date_get_year(gd) == year && + g_date_get_month(gd) == (month+1) && + g_date_get_day(gd) == day ) { + need_to_break = TRUE; + break; + } + } + } + // Fully exit + if ( need_to_break ) + break; + + layers = g_list_next ( layers ); + vtl = NULL; + } + g_date_free ( gd ); + g_list_free ( layers ); + + if ( vtl) + return g_strdup (vik_layer_get_name ( VIK_LAYER(vtl) )); + + return NULL; +} + +#define VIK_SETTINGS_CAL_MUM "layers_panel_calendar_markup_mode" + +static void vik_layers_panel_init ( VikLayersPanel *vlp ) +{ + GtkWidget *addbutton, *addimage; + GtkWidget *removebutton, *removeimage; + GtkWidget *upbutton, *upimage; + GtkWidget *downbutton, *downimage; + GtkWidget *cutbutton, *cutimage; + GtkWidget *copybutton, *copyimage; + GtkWidget *pastebutton, *pasteimage; + GtkWidget *scrolledwindow; + + vlp->vvp = NULL; + + vlp->hbox = gtk_hbox_new ( TRUE, 2 ); + vlp->vt = vik_treeview_new ( ); + + vlp->toplayer = vik_aggregate_layer_new (); + vik_layer_rename ( VIK_LAYER(vlp->toplayer), _("Top Layer")); + g_signal_connect_swapped ( G_OBJECT(vlp->toplayer), "update", G_CALLBACK(vik_layers_panel_emit_update), vlp ); + + vik_treeview_add_layer ( vlp->vt, NULL, &(vlp->toplayer_iter), VIK_LAYER(vlp->toplayer)->name, NULL, TRUE, vlp->toplayer, VIK_LAYER_AGGREGATE, VIK_LAYER_AGGREGATE, 0 ); + vik_layer_realize ( VIK_LAYER(vlp->toplayer), vlp->vt, &(vlp->toplayer_iter) ); + + g_signal_connect_swapped ( vlp->vt, "popup_menu", G_CALLBACK(menu_popup_cb), vlp); + g_signal_connect_swapped ( vlp->vt, "button_press_event", G_CALLBACK(layers_button_press_cb), vlp); + g_signal_connect_swapped ( vlp->vt, "item_toggled", G_CALLBACK(layers_item_toggled), vlp); + g_signal_connect_swapped ( vlp->vt, "item_edited", G_CALLBACK(layers_item_edited), vlp); + g_signal_connect_swapped ( vlp->vt, "key_press_event", G_CALLBACK(layers_key_press_cb), vlp); + + /* Add button */ + addimage = gtk_image_new_from_stock ( GTK_STOCK_ADD, GTK_ICON_SIZE_SMALL_TOOLBAR ); + addbutton = gtk_button_new ( ); + gtk_container_add ( GTK_CONTAINER(addbutton), addimage ); + gtk_widget_set_tooltip_text ( GTK_WIDGET(addbutton), _("Add new layer")); + gtk_box_pack_start ( GTK_BOX(vlp->hbox), addbutton, TRUE, TRUE, 0 ); + g_signal_connect_swapped ( G_OBJECT(addbutton), "clicked", G_CALLBACK(layers_popup_cb), vlp ); + /* Remove button */ + removeimage = gtk_image_new_from_stock ( GTK_STOCK_REMOVE, GTK_ICON_SIZE_SMALL_TOOLBAR ); + removebutton = gtk_button_new ( ); + gtk_container_add ( GTK_CONTAINER(removebutton), removeimage ); + gtk_widget_set_tooltip_text ( GTK_WIDGET(removebutton), _("Remove selected layer")); + gtk_box_pack_start ( GTK_BOX(vlp->hbox), removebutton, TRUE, TRUE, 0 ); + g_signal_connect_swapped ( G_OBJECT(removebutton), "clicked", G_CALLBACK(vik_layers_panel_delete_selected), vlp ); + /* Up button */ + upimage = gtk_image_new_from_stock ( GTK_STOCK_GO_UP, GTK_ICON_SIZE_SMALL_TOOLBAR ); + upbutton = gtk_button_new ( ); + gtk_container_add ( GTK_CONTAINER(upbutton), upimage ); + gtk_widget_set_tooltip_text ( GTK_WIDGET(upbutton), _("Move selected layer up")); + gtk_box_pack_start ( GTK_BOX(vlp->hbox), upbutton, TRUE, TRUE, 0 ); + g_signal_connect_swapped ( G_OBJECT(upbutton), "clicked", G_CALLBACK(layers_move_item_up), vlp ); + /* Down button */ + downimage = gtk_image_new_from_stock ( GTK_STOCK_GO_DOWN, GTK_ICON_SIZE_SMALL_TOOLBAR ); + downbutton = gtk_button_new ( ); + gtk_container_add ( GTK_CONTAINER(downbutton), downimage ); + gtk_widget_set_tooltip_text ( GTK_WIDGET(downbutton), _("Move selected layer down")); + gtk_box_pack_start ( GTK_BOX(vlp->hbox), downbutton, TRUE, TRUE, 0 ); + g_signal_connect_swapped ( G_OBJECT(downbutton), "clicked", G_CALLBACK(layers_move_item_down), vlp ); + /* Cut button */ + cutimage = gtk_image_new_from_stock ( GTK_STOCK_CUT, GTK_ICON_SIZE_SMALL_TOOLBAR ); + cutbutton = gtk_button_new ( ); + gtk_container_add ( GTK_CONTAINER(cutbutton), cutimage ); + gtk_widget_set_tooltip_text ( GTK_WIDGET(cutbutton), _("Cut selected layer")); + gtk_box_pack_start ( GTK_BOX(vlp->hbox), cutbutton, TRUE, TRUE, 0 ); + g_signal_connect_swapped ( G_OBJECT(cutbutton), "clicked", G_CALLBACK(vik_layers_panel_cut_selected), vlp ); + /* Copy button */ + copyimage = gtk_image_new_from_stock ( GTK_STOCK_COPY, GTK_ICON_SIZE_SMALL_TOOLBAR ); + copybutton = gtk_button_new ( ); + gtk_container_add ( GTK_CONTAINER(copybutton), copyimage ); + gtk_widget_set_tooltip_text ( GTK_WIDGET(copybutton), _("Copy selected layer")); + gtk_box_pack_start ( GTK_BOX(vlp->hbox), copybutton, TRUE, TRUE, 0 ); + g_signal_connect_swapped ( G_OBJECT(copybutton), "clicked", G_CALLBACK(vik_layers_panel_copy_selected), vlp ); + /* Paste button */ + pasteimage = gtk_image_new_from_stock ( GTK_STOCK_PASTE, GTK_ICON_SIZE_SMALL_TOOLBAR ); + pastebutton = gtk_button_new ( ); + gtk_container_add ( GTK_CONTAINER(pastebutton),pasteimage ); + gtk_widget_set_tooltip_text ( GTK_WIDGET(pastebutton), _("Paste layer into selected container layer or otherwise above selected layer")); + gtk_box_pack_start ( GTK_BOX(vlp->hbox), pastebutton, TRUE, TRUE, 0 ); + g_signal_connect_swapped ( G_OBJECT(pastebutton), "clicked", G_CALLBACK(vik_layers_panel_paste_selected), vlp ); + + scrolledwindow = gtk_scrolled_window_new ( NULL, NULL ); + gtk_scrolled_window_set_policy ( GTK_SCROLLED_WINDOW(scrolledwindow), GTK_POLICY_NEVER, GTK_POLICY_AUTOMATIC ); + gtk_container_add ( GTK_CONTAINER(scrolledwindow), GTK_WIDGET(vlp->vt) ); + + int cal_markup; + if ( a_settings_get_integer ( VIK_SETTINGS_CAL_MUM, &cal_markup ) ) { + if ( cal_markup >= VLP_CAL_MU_NONE && cal_markup < VLP_CAL_MU_LAST ) + vlp->cal_markup = cal_markup; + else + vlp->cal_markup = VLP_CAL_MU_AUTO; + } + else + vlp->cal_markup = VLP_CAL_MU_AUTO; + + vlp->calendar = gtk_calendar_new(); + g_signal_connect_swapped ( vlp->calendar, "month-changed", G_CALLBACK(vik_layers_panel_calendar_update), vlp); + // Use double click event, rather than just the day-selected event, + // since changing month/year causes the day-selected event to occur + // (and then possibly this results in selecting a track) which would be counter intuitive + g_signal_connect_swapped ( vlp->calendar, "day-selected-double-click", G_CALLBACK(layers_calendar_day_selected_dc_cb), vlp); + vlp->cal_shown = TRUE; + + // Ensure any detail results in a tooltip rather than embedded in the calendar display + GValue sd = { 0 }; + g_value_init ( &sd, G_TYPE_BOOLEAN ); + g_value_set_boolean ( &sd, FALSE ); + g_object_set_property ( G_OBJECT(vlp->calendar), "show-details", &sd ); + + gtk_calendar_set_detail_func ( GTK_CALENDAR(vlp->calendar), calendar_detail, vlp, NULL ); + vik_layers_panel_set_preferences ( vlp ); + + gtk_box_pack_start ( GTK_BOX(vlp), scrolledwindow, TRUE, TRUE, 0 ); + gtk_box_pack_start ( GTK_BOX(vlp), vlp->calendar, FALSE, FALSE, 0 ); + gtk_box_pack_start ( GTK_BOX(vlp), vlp->hbox, FALSE, FALSE, 0 ); +} + +/** + * Invoke the actual drawing via signal method + */ +static gboolean idle_draw_panel ( VikLayersPanel *vlp ) +{ + g_signal_emit ( G_OBJECT(vlp), layers_panel_signals[VLP_UPDATE_SIGNAL], 0 ); + return FALSE; // Nothing else to do +} + +void vik_layers_panel_emit_update ( VikLayersPanel *vlp ) +{ + GThread *thread = vik_window_get_thread (VIK_WINDOW(VIK_GTK_WINDOW_FROM_WIDGET(vlp))); + if ( !thread ) + // Do nothing + return; + + // Only ever draw when there is time to do so + if ( g_thread_self() != thread ) + // Drawing requested from another (background) thread, so handle via the gdk thread method + gdk_threads_add_idle ( (GSourceFunc) idle_draw_panel, vlp ); + else + g_idle_add ( (GSourceFunc) idle_draw_panel, vlp ); +} + +static void layers_item_toggled (VikLayersPanel *vlp, GtkTreeIter *iter) +{ + gboolean visible; + gpointer p; + gint type; + + /* get type and data */ + type = vik_treeview_item_get_type ( vlp->vt, iter ); + p = vik_treeview_item_get_pointer ( vlp->vt, iter ); + + switch ( type ) + { + case VIK_TREEVIEW_TYPE_LAYER: + visible = (VIK_LAYER(p)->visible ^= 1); + vik_layer_emit_update_although_invisible ( VIK_LAYER(p) ); /* set trigger for half-drawn */ + break; + case VIK_TREEVIEW_TYPE_SUBLAYER: + visible = vik_layer_sublayer_toggle_visible ( VIK_LAYER(vik_treeview_item_get_parent(vlp->vt, iter)), + vik_treeview_item_get_data(vlp->vt, iter), p); + vik_layer_emit_update_although_invisible ( VIK_LAYER(vik_treeview_item_get_parent(vlp->vt, iter)) ); + break; + default: return; + } + + vik_treeview_item_set_visible ( vlp->vt, iter, visible ); +} + +static void layers_item_edited (VikLayersPanel *vlp, GtkTreeIter *iter, const gchar *new_text) +{ + if ( !new_text ) + return; + + if ( new_text[0] == '\0' ) { + a_dialog_error_msg ( GTK_WINDOW(VIK_WINDOW_FROM_WIDGET(vlp)), _("New name can not be blank.") ); + return; + } + + if ( vik_treeview_item_get_type ( vlp->vt, iter ) == VIK_TREEVIEW_TYPE_LAYER ) + { + VikLayer *l; + + /* get iter and layer */ + l = VIK_LAYER ( vik_treeview_item_get_pointer ( vlp->vt, iter ) ); + + if ( strcmp ( l->name, new_text ) != 0 ) + { + vik_layer_rename ( l, new_text ); + vik_treeview_item_set_name ( vlp->vt, iter, l->name ); + } + } + else + { + const gchar *name = vik_layer_sublayer_rename_request ( vik_treeview_item_get_parent ( vlp->vt, iter ), new_text, vlp, vik_treeview_item_get_data ( vlp->vt, iter ), vik_treeview_item_get_pointer ( vlp->vt, iter ), iter ); + if ( name ) + vik_treeview_item_set_name ( vlp->vt, iter, name); + } +} + +static gboolean layers_button_press_cb ( VikLayersPanel *vlp, GdkEventButton *event ) +{ + if (event->button == 3) + { + static GtkTreeIter iter; + if ( vik_treeview_get_iter_at_pos ( vlp->vt, &iter, event->x, event->y ) ) + { + layers_popup ( vlp, &iter, 3 ); + vik_treeview_item_select ( vlp->vt, &iter ); + } + else + layers_popup ( vlp, NULL, 3 ); + return TRUE; + } + return FALSE; +} + +static gboolean layers_key_press_cb ( VikLayersPanel *vlp, GdkEventKey *event ) +{ + // Accept all forms of delete keys + if (event->keyval == GDK_Delete || event->keyval == GDK_KP_Delete || event->keyval == GDK_BackSpace) { + vik_layers_panel_delete_selected (vlp); + return TRUE; + } + return FALSE; +} + +static void layers_popup ( VikLayersPanel *vlp, GtkTreeIter *iter, gint mouse_button ) +{ + GtkMenu *menu = NULL; + + + if ( iter ) + { + if ( vik_treeview_item_get_type ( vlp->vt, iter ) == VIK_TREEVIEW_TYPE_LAYER ) + { + VikLayer *layer = VIK_LAYER(vik_treeview_item_get_pointer ( vlp->vt, iter )); + + if ( layer->type == VIK_LAYER_AGGREGATE ) + menu = GTK_MENU ( layers_panel_create_popup ( vlp, TRUE ) ); + else + { + GtkWidget *del, *prop; + VikStdLayerMenuItem menu_selection = vik_layer_get_menu_items_selection(layer); + + menu = GTK_MENU ( gtk_menu_new () ); + + if (menu_selection & VIK_MENU_ITEM_PROPERTY) { + prop = gtk_image_menu_item_new_from_stock ( GTK_STOCK_PROPERTIES, NULL ); + g_signal_connect_swapped ( G_OBJECT(prop), "activate", G_CALLBACK(vik_layers_panel_properties), vlp ); + gtk_menu_shell_append (GTK_MENU_SHELL (menu), prop); + gtk_widget_show ( prop ); + } + + if (menu_selection & VIK_MENU_ITEM_CUT) { + del = gtk_image_menu_item_new_from_stock ( GTK_STOCK_CUT, NULL ); + g_signal_connect_swapped ( G_OBJECT(del), "activate", G_CALLBACK(vik_layers_panel_cut_selected), vlp ); + gtk_menu_shell_append (GTK_MENU_SHELL (menu), del); + gtk_widget_show ( del ); + } + + if (menu_selection & VIK_MENU_ITEM_COPY) { + del = gtk_image_menu_item_new_from_stock ( GTK_STOCK_COPY, NULL ); + g_signal_connect_swapped ( G_OBJECT(del), "activate", G_CALLBACK(vik_layers_panel_copy_selected), vlp ); + gtk_menu_shell_append (GTK_MENU_SHELL (menu), del); + gtk_widget_show ( del ); + } + + if (menu_selection & VIK_MENU_ITEM_PASTE) { + del = gtk_image_menu_item_new_from_stock ( GTK_STOCK_PASTE, NULL ); + g_signal_connect_swapped ( G_OBJECT(del), "activate", G_CALLBACK(vik_layers_panel_paste_selected), vlp ); + gtk_menu_shell_append (GTK_MENU_SHELL (menu), del); + gtk_widget_show ( del ); + } + + if (menu_selection & VIK_MENU_ITEM_DELETE) { + del = gtk_image_menu_item_new_from_stock ( GTK_STOCK_DELETE, NULL ); + g_signal_connect_swapped ( G_OBJECT(del), "activate", G_CALLBACK(vik_layers_panel_delete_selected), vlp ); + gtk_menu_shell_append (GTK_MENU_SHELL (menu), del); + gtk_widget_show ( del ); + } + } + vik_layer_add_menu_items ( layer, menu, vlp ); + } + else + { + menu = GTK_MENU ( gtk_menu_new () ); + if ( ! vik_layer_sublayer_add_menu_items ( vik_treeview_item_get_parent ( vlp->vt, iter ), menu, vlp, vik_treeview_item_get_data ( vlp->vt, iter ), vik_treeview_item_get_pointer ( vlp->vt, iter ), iter, vlp->vvp ) ) + { + gtk_widget_destroy ( GTK_WIDGET(menu) ); + return; + } + /* TODO: specific things for different types */ + } + } + else + { + menu = GTK_MENU ( layers_panel_create_popup ( vlp, FALSE ) ); + } + gtk_menu_popup ( menu, NULL, NULL, NULL, NULL, mouse_button, gtk_get_current_event_time() ); +} + +static void menu_popup_cb ( VikLayersPanel *vlp ) +{ + GtkTreeIter iter; + layers_popup ( vlp, vik_treeview_get_selected_iter ( vlp->vt, &iter ) ? &iter : NULL, 0 ); +} + +static void layers_popup_cb ( VikLayersPanel *vlp ) +{ + layers_popup ( vlp, NULL, 0 ); +} + +#define VIK_SETTINGS_LAYERS_TRW_CREATE_DEFAULT "layers_create_trw_auto_default" +/** + * vik_layers_panel_new_layer: + * @type: type of the new layer + * + * Create a new layer and add to panel. + */ +gboolean vik_layers_panel_new_layer ( VikLayersPanel *vlp, VikLayerTypeEnum type ) +{ + VikLayer *l; + g_assert ( vlp->vvp ); + gboolean ask_user = FALSE; + if ( type == VIK_LAYER_TRW ) + (void)a_settings_get_boolean ( VIK_SETTINGS_LAYERS_TRW_CREATE_DEFAULT, &ask_user ); + ask_user = !ask_user; + l = vik_layer_create ( type, vlp->vvp, ask_user ); + if ( l ) + { + vik_layers_panel_add_layer ( vlp, l ); + return TRUE; + } + return FALSE; +} + +/** + * vik_layers_panel_add_layer: + * @l: existing layer + * + * Add an existing layer to panel. + */ +void vik_layers_panel_add_layer ( VikLayersPanel *vlp, VikLayer *l ) +{ + GtkTreeIter iter; + GtkTreeIter *replace_iter = NULL; + + /* could be something different so we have to do this */ + vik_layer_change_coord_mode ( l, vik_viewport_get_coord_mode(vlp->vvp) ); + + if ( ! vik_treeview_get_selected_iter ( vlp->vt, &iter ) ) + vik_aggregate_layer_add_layer ( vlp->toplayer, l, TRUE ); + else + { + VikAggregateLayer *addtoagg; + if (vik_treeview_item_get_type ( vlp->vt, &iter ) == VIK_TREEVIEW_TYPE_LAYER ) + { + if ( IS_VIK_AGGREGATE_LAYER(vik_treeview_item_get_pointer ( vlp->vt, &iter )) ) + addtoagg = VIK_AGGREGATE_LAYER(vik_treeview_item_get_pointer ( vlp->vt, &iter )); + else { + VikLayer *vl = VIK_LAYER(vik_treeview_item_get_parent ( vlp->vt, &iter )); + while ( ! IS_VIK_AGGREGATE_LAYER(vl) ) { + iter = vl->iter; + vl = VIK_LAYER(vik_treeview_item_get_parent ( vlp->vt, &vl->iter )); + g_assert ( vl->realized ); + } + addtoagg = VIK_AGGREGATE_LAYER(vl); + replace_iter = &iter; + } + } + else + { + /* a sublayer is selected, first get its parent (layer), then find the layer's parent (aggr. layer) */ + VikLayer *vl = VIK_LAYER(vik_treeview_item_get_parent ( vlp->vt, &iter )); + replace_iter = &(vl->iter); + g_assert ( vl->realized ); + VikLayer *grandpa = (vik_treeview_item_get_parent ( vlp->vt, &(vl->iter) ) ); + if (IS_VIK_AGGREGATE_LAYER(grandpa)) + addtoagg = VIK_AGGREGATE_LAYER(grandpa); + else { + addtoagg = vlp->toplayer; + replace_iter = &grandpa->iter; + } + } + if ( replace_iter ) + vik_aggregate_layer_insert_layer ( addtoagg, l, replace_iter ); + else + vik_aggregate_layer_add_layer ( addtoagg, l, TRUE ); + } + + vik_layers_panel_emit_update ( vlp ); +} + +static void layers_move_item ( VikLayersPanel *vlp, gboolean up ) +{ + GtkTreeIter iter; + VikAggregateLayer *parent; + + /* TODO: deactivate the buttons and stuff */ + if ( ! vik_treeview_get_selected_iter ( vlp->vt, &iter ) ) + return; + + vik_treeview_select_iter ( vlp->vt, &iter, FALSE ); /* cancel any layer-name editing going on... */ + + if ( vik_treeview_item_get_type ( vlp->vt, &iter ) == VIK_TREEVIEW_TYPE_LAYER ) + { + parent = VIK_AGGREGATE_LAYER(vik_treeview_item_get_parent ( vlp->vt, &iter )); + if ( parent ) /* not toplevel */ + { + vik_aggregate_layer_move_layer ( parent, &iter, up ); + vik_layers_panel_emit_update ( vlp ); + } + } +} + +gboolean vik_layers_panel_properties ( VikLayersPanel *vlp ) +{ + GtkTreeIter iter; + g_assert ( vlp->vvp ); + + if ( vik_treeview_get_selected_iter ( vlp->vt, &iter ) && vik_treeview_item_get_type ( vlp->vt, &iter ) == VIK_TREEVIEW_TYPE_LAYER ) + { + if ( vik_treeview_item_get_data ( vlp->vt, &iter ) == VIK_LAYER_AGGREGATE ) + a_dialog_info_msg ( VIK_GTK_WINDOW_FROM_WIDGET(vlp), _("Aggregate Layers have no settable properties.") ); + VikLayer *layer = VIK_LAYER( vik_treeview_item_get_pointer ( vlp->vt, &iter ) ); + if ( vik_layer_properties ( layer, vlp->vvp, TRUE )) + vik_layer_emit_update ( layer ); + return TRUE; + } + else + return FALSE; +} + +void vik_layers_panel_draw_all ( VikLayersPanel *vlp ) +{ + if ( vlp->vvp && VIK_LAYER(vlp->toplayer)->visible ) + vik_aggregate_layer_draw ( vlp->toplayer, vlp->vvp ); +} + +void vik_layers_panel_cut_selected ( VikLayersPanel *vlp ) +{ + gint type; + GtkTreeIter iter; + + if ( ! vik_treeview_get_selected_iter ( vlp->vt, &iter ) ) + /* Nothing to do */ + return; + + type = vik_treeview_item_get_type ( vlp->vt, &iter ); + + if ( type == VIK_TREEVIEW_TYPE_LAYER ) + { + VikAggregateLayer *parent = vik_treeview_item_get_parent ( vlp->vt, &iter ); + if ( parent ) + { + /* reset trigger if trigger deleted */ + if ( vik_layers_panel_get_selected ( vlp ) == vik_viewport_get_trigger ( vlp->vvp ) ) + vik_viewport_set_trigger ( vlp->vvp, NULL ); + + a_clipboard_copy_selected ( vlp ); + + if (IS_VIK_AGGREGATE_LAYER(parent)) { + + g_signal_emit ( G_OBJECT(vlp), layers_panel_signals[VLP_DELETE_LAYER_SIGNAL], 0 ); + + if ( vik_aggregate_layer_delete ( parent, &iter ) ) + vik_layers_panel_emit_update ( vlp ); + } + } + else + a_dialog_info_msg ( VIK_GTK_WINDOW_FROM_WIDGET(vlp), _("You cannot cut the Top Layer.") ); + } + else if (type == VIK_TREEVIEW_TYPE_SUBLAYER) { + VikLayer *sel = vik_layers_panel_get_selected ( vlp ); + if ( vik_layer_get_interface(sel->type)->cut_item ) { + gint subtype = vik_treeview_item_get_data( vlp->vt, &iter); + vik_layer_get_interface(sel->type)->cut_item ( sel, subtype, vik_treeview_item_get_pointer(sel->vt, &iter) ); + } + } +} + +void vik_layers_panel_copy_selected ( VikLayersPanel *vlp ) +{ + GtkTreeIter iter; + if ( ! vik_treeview_get_selected_iter ( vlp->vt, &iter ) ) + /* Nothing to do */ + return; + // NB clipboard contains layer vs sublayer logic, so don't need to do it here + a_clipboard_copy_selected ( vlp ); +} + +gboolean vik_layers_panel_paste_selected ( VikLayersPanel *vlp ) +{ + GtkTreeIter iter; + if ( ! vik_treeview_get_selected_iter ( vlp->vt, &iter ) ) + /* Nothing to do */ + return FALSE; + return a_clipboard_paste ( vlp ); +} + +void vik_layers_panel_delete_selected ( VikLayersPanel *vlp ) +{ + gint type; + GtkTreeIter iter; + + if ( ! vik_treeview_get_selected_iter ( vlp->vt, &iter ) ) + /* Nothing to do */ + return; + + type = vik_treeview_item_get_type ( vlp->vt, &iter ); + + if ( type == VIK_TREEVIEW_TYPE_LAYER ) + { + // Get confirmation from the user + if ( ! a_dialog_yes_or_no ( VIK_GTK_WINDOW_FROM_WIDGET(vlp), + _("Are you sure you want to delete %s?"), + vik_layer_get_name ( VIK_LAYER(vik_treeview_item_get_pointer ( vlp->vt, &iter )) ) ) ) + return; + + VikAggregateLayer *parent = vik_treeview_item_get_parent ( vlp->vt, &iter ); + if ( parent ) + { + /* reset trigger if trigger deleted */ + if ( vik_layers_panel_get_selected ( vlp ) == vik_viewport_get_trigger ( vlp->vvp ) ) + vik_viewport_set_trigger ( vlp->vvp, NULL ); + + if (IS_VIK_AGGREGATE_LAYER(parent)) { + + g_signal_emit ( G_OBJECT(vlp), layers_panel_signals[VLP_DELETE_LAYER_SIGNAL], 0 ); + + if ( vik_aggregate_layer_delete ( parent, &iter ) ) + vik_layers_panel_emit_update ( vlp ); + } + } + else + a_dialog_info_msg ( VIK_GTK_WINDOW_FROM_WIDGET(vlp), _("You cannot delete the Top Layer.") ); + } + else if (type == VIK_TREEVIEW_TYPE_SUBLAYER) { + VikLayer *sel = vik_layers_panel_get_selected ( vlp ); + if ( vik_layer_get_interface(sel->type)->delete_item ) { + gint subtype = vik_treeview_item_get_data( vlp->vt, &iter); + vik_layer_get_interface(sel->type)->delete_item ( sel, subtype, vik_treeview_item_get_pointer(sel->vt, &iter) ); + } + } + // Always attempt to update the calendar on any delete (even if not actually deleted anything) + vik_layers_panel_calendar_update ( vlp ); +} + +VikLayer *vik_layers_panel_get_selected ( VikLayersPanel *vlp ) +{ + GtkTreeIter iter, parent; + gint type; + + if ( ! vik_treeview_get_selected_iter ( vlp->vt, &iter ) ) + return NULL; + + type = vik_treeview_item_get_type ( vlp->vt, &iter ); + + while ( type != VIK_TREEVIEW_TYPE_LAYER ) + { + if ( ! vik_treeview_item_get_parent_iter ( vlp->vt, &iter, &parent ) ) + return NULL; + iter = parent; + type = vik_treeview_item_get_type ( vlp->vt, &iter ); + } + + return VIK_LAYER( vik_treeview_item_get_pointer ( vlp->vt, &iter ) ); +} + +static void layers_move_item_up ( VikLayersPanel *vlp ) +{ + layers_move_item ( vlp, TRUE ); +} + +static void layers_move_item_down ( VikLayersPanel *vlp ) +{ + layers_move_item ( vlp, FALSE ); +} + +#if 0 +gboolean vik_layers_panel_tool ( VikLayersPanel *vlp, guint16 layer_type, VikToolInterfaceFunc tool_func, GdkEventButton *event, VikViewport *vvp ) +{ + VikLayer *vl = vik_layers_panel_get_selected ( vlp ); + if ( vl && vl->type == layer_type ) + { + tool_func ( vl, event, vvp ); + return TRUE; + } + else if ( VIK_LAYER(vlp->toplayer)->visible && + vik_aggregate_layer_tool ( vlp->toplayer, layer_type, tool_func, event, vvp ) != 1 ) /* either accepted or rejected, but a layer was found */ + return TRUE; + return FALSE; +} +#endif + +VikLayer *vik_layers_panel_get_layer_of_type ( VikLayersPanel *vlp, VikLayerTypeEnum type ) +{ + VikLayer *rv = vik_layers_panel_get_selected ( vlp ); + if ( rv == NULL || rv->type != type ) + if ( VIK_LAYER(vlp->toplayer)->visible ) + return vik_aggregate_layer_get_top_visible_layer_of_type ( vlp->toplayer, type ); + else + return NULL; + else + return rv; +} + +GList *vik_layers_panel_get_all_layers_of_type(VikLayersPanel *vlp, gint type, gboolean include_invisible) +{ + GList *layers = NULL; + + return (vik_aggregate_layer_get_all_layers_of_type ( vlp->toplayer, layers, type, include_invisible)); +} + +VikAggregateLayer *vik_layers_panel_get_top_layer ( VikLayersPanel *vlp ) +{ + return vlp->toplayer; +} + +/** + * Remove all layers + */ +void vik_layers_panel_clear ( VikLayersPanel *vlp ) +{ + if ( ! vik_aggregate_layer_is_empty(vlp->toplayer) ) { + g_signal_emit ( G_OBJECT(vlp), layers_panel_signals[VLP_DELETE_LAYER_SIGNAL], 0 ); + vik_aggregate_layer_clear ( vlp->toplayer ); /* simply deletes all layers */ + gtk_calendar_clear_marks ( GTK_CALENDAR(vlp->calendar) ); + } +} + +void vik_layers_panel_change_coord_mode ( VikLayersPanel *vlp, VikCoordMode mode ) +{ + vik_layer_change_coord_mode ( VIK_LAYER(vlp->toplayer), mode ); +} + +static void layers_panel_finalize ( GObject *gob ) +{ + VikLayersPanel *vlp = VIK_LAYERS_PANEL ( gob ); + g_object_unref ( VIK_LAYER(vlp->toplayer) ); + G_OBJECT_CLASS(parent_class)->finalize(gob); +} + +VikTreeview *vik_layers_panel_get_treeview ( VikLayersPanel *vlp ) +{ + return vlp->vt; +} + +void vik_layers_panel_show_buttons ( VikLayersPanel *vlp, gboolean show ) +{ + if ( show ) + gtk_widget_show ( vlp->hbox ); + else + gtk_widget_hide ( vlp->hbox ); +} + +void vik_layers_panel_show_calendar ( VikLayersPanel *vlp, gboolean show ) +{ + if ( show ) { + vlp->cal_shown = TRUE; + vik_layers_panel_calendar_update ( vlp ); + gtk_widget_show ( vlp->calendar ); + } + else { + vlp->cal_shown = FALSE; + gtk_widget_hide ( vlp->calendar ); + } +} + +/** + * + */ +void vik_layers_panel_calendar_today ( VikLayersPanel *vlp ) +{ + vu_calendar_set_to_today (vlp->calendar); +} + +void vik_layers_panel_calendar_date ( VikLayersPanel *vlp, time_t timestamp ) +{ + GDate *gd = g_date_new(); + g_date_set_time_t ( gd, timestamp ); + gtk_calendar_select_month ( GTK_CALENDAR(vlp->calendar), g_date_get_month(gd)-1, g_date_get_year(gd) ); + gtk_calendar_select_day ( GTK_CALENDAR(vlp->calendar), g_date_get_day(gd) ); + g_date_free ( gd ); +} + +/** + * vik_layers_panel_set_preferences: + * + * Allow reapplying preferences (i.e from the preferences dialog) + */ +void vik_layers_panel_set_preferences ( VikLayersPanel *vlp ) +{ + GValue sd = { 0 }; + g_value_init ( &sd, G_TYPE_BOOLEAN ); + g_value_set_boolean ( &sd, a_vik_get_calendar_show_day_names() ); + g_object_set_property ( G_OBJECT(vlp->calendar), "show-day-names", &sd ); +} diff --git a/src/viklayerspanel.h b/src/viklayerspanel.h new file mode 100644 index 0000000..683afaf --- /dev/null +++ b/src/viklayerspanel.h @@ -0,0 +1,82 @@ +/* + * viking -- GPS Data and Topo Analyzer, Explorer, and Manager + * + * Copyright (C) 2003-2005, Evan Battaglia + * + * 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., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA + * + */ + +#ifndef _VIKING_LAYERS_PANEL_H +#define _VIKING_LAYERS_PANEL_H + +#include +#include +#include + +#include "viklayer.h" +#include "vikaggregatelayer.h" + +G_BEGIN_DECLS + +#define VIK_LAYERS_PANEL_TYPE (vik_layers_panel_get_type ()) +#define VIK_LAYERS_PANEL(obj) (G_TYPE_CHECK_INSTANCE_CAST ((obj), VIK_LAYERS_PANEL_TYPE, VikLayersPanel)) +#define VIK_LAYERS_PANEL_CLASS(klass) (G_TYPE_CHECK_CLASS_CAST ((klass), VIK_LAYERS_PANEL_TYPE, VikLayersPanelClass)) +#define IS_VIK_LAYERS_PANEL(obj) (G_TYPE_CHECK_INSTANCE_TYPE ((obj), VIK_LAYERS_PANEL_TYPE)) +#define IS_VIK_LAYERS_PANEL_CLASS(klass) (G_TYPE_CHECK_CLASS_TYPE ((klass), VIK_LAYERS_PANEL_TYPE)) + +typedef struct _VikLayersPanel VikLayersPanel; +typedef struct _VikLayersPanelClass VikLayersPanelClass; + +struct _VikLayersPanelClass +{ + GtkVBoxClass vbox_class; + + void (* update) (VikLayersPanel *vlp); + void (* delete_layer) (VikLayersPanel *vlp); // NB Just before (actual layer *not* specified ATM) it is deleted +}; + +GType vik_layers_panel_get_type (); +VikLayersPanel *vik_layers_panel_new (); +void vik_layers_panel_free ( VikLayersPanel *vlp ); +void vik_layers_panel_add_layer ( VikLayersPanel *vlp, VikLayer *l ); +void vik_layers_panel_draw_all ( VikLayersPanel *vlp ); +VikLayer *vik_layers_panel_get_selected ( VikLayersPanel *vlp ); +void vik_layers_panel_cut_selected ( VikLayersPanel *vlp ); +void vik_layers_panel_copy_selected ( VikLayersPanel *vlp ); +gboolean vik_layers_panel_paste_selected ( VikLayersPanel *vlp ); +void vik_layers_panel_delete_selected ( VikLayersPanel *vlp ); +VikLayer *vik_layers_panel_get_layer_of_type ( VikLayersPanel *vlp, VikLayerTypeEnum type ); +void vik_layers_panel_set_viewport ( VikLayersPanel *vlp, VikViewport *vvp ); +//gboolean vik_layers_panel_tool ( VikLayersPanel *vlp, guint16 layer_type, VikToolInterfaceFunc tool_func, GdkEventButton *event, VikViewport *vvp ); +VikViewport *vik_layers_panel_get_viewport ( VikLayersPanel *vlp ); +void vik_layers_panel_emit_update ( VikLayersPanel *vlp ); +gboolean vik_layers_panel_properties ( VikLayersPanel *vlp ); +gboolean vik_layers_panel_new_layer ( VikLayersPanel *vlp, VikLayerTypeEnum type ); +void vik_layers_panel_clear ( VikLayersPanel *vlp ); +VikAggregateLayer *vik_layers_panel_get_top_layer ( VikLayersPanel *vlp ); +void vik_layers_panel_change_coord_mode ( VikLayersPanel *vlp, VikCoordMode mode ); +GList *vik_layers_panel_get_all_layers_of_type(VikLayersPanel *vlp, gint type, gboolean include_invisible); +VikTreeview *vik_layers_panel_get_treeview ( VikLayersPanel *vlp ); +void vik_layers_panel_show_buttons ( VikLayersPanel *vlp, gboolean show ); +void vik_layers_panel_show_calendar ( VikLayersPanel *vlp, gboolean show ); +void vik_layers_panel_calendar_update ( VikLayersPanel *vlp ); +void vik_layers_panel_calendar_today ( VikLayersPanel *vlp ); +void vik_layers_panel_calendar_date ( VikLayersPanel *vlp, time_t timestamp ); +void vik_layers_panel_set_preferences ( VikLayersPanel *vlp ); + +G_END_DECLS + +#endif diff --git a/src/vikmapniklayer.c b/src/vikmapniklayer.c new file mode 100644 index 0000000..723844a --- /dev/null +++ b/src/vikmapniklayer.c @@ -0,0 +1,1161 @@ +/* + * viking -- GPS Data and Topo Analyzer, Explorer, and Manager + * + * Copyright (c) 2015, Rob Norris + * + * 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., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA + * + */ + +#ifdef HAVE_CONFIG_H +#include "config.h" +#endif + +#include "viking.h" +#include +#include +#include +#include +#include +#include +#include + +#include "map_ids.h" +#include "maputils.h" +#include "mapcoord.h" +#include "mapcache.h" +#include "dir.h" +#include "util.h" +#include "ui_util.h" +#include "preferences.h" +#include "icons/icons.h" +#include "mapnik_interface.h" +#include "background.h" + +#include "vikmapslayer.h" + +struct _VikMapnikLayerClass +{ + VikLayerClass object_class; +}; + +static VikLayerParamData file_default ( void ) +{ + VikLayerParamData data; + data.s = ""; + return data; +} + +static VikLayerParamData size_default ( void ) { return VIK_LPD_UINT ( 256 ); } +static VikLayerParamData alpha_default ( void ) { return VIK_LPD_UINT ( 255 ); } + +static VikLayerParamData cache_dir_default ( void ) +{ + VikLayerParamData data; + data.s = g_strconcat ( maps_layer_default_dir(), "MapnikRendering", NULL ); + return data; +} + +static VikLayerParamScale scales[] = { + { 0, 255, 5, 0 }, // Alpha + { 64, 1024, 8, 0 }, // Tile size + { 0, 1024, 12, 0 }, // Rerender timeout hours +}; + +VikLayerParam mapnik_layer_params[] = { + { VIK_LAYER_MAPNIK, "config-file-mml", VIK_LAYER_PARAM_STRING, VIK_LAYER_GROUP_NONE, N_("CSS (MML) Config File:"), VIK_LAYER_WIDGET_FILEENTRY, GINT_TO_POINTER(VF_FILTER_CARTO), NULL, + N_("CartoCSS configuration file"), file_default, NULL, NULL }, + { VIK_LAYER_MAPNIK, "config-file-xml", VIK_LAYER_PARAM_STRING, VIK_LAYER_GROUP_NONE, N_("XML Config File:"), VIK_LAYER_WIDGET_FILEENTRY, GINT_TO_POINTER(VF_FILTER_XML), NULL, + N_("Mapnik XML configuration file"), file_default, NULL, NULL }, + { VIK_LAYER_MAPNIK, "alpha", VIK_LAYER_PARAM_UINT, VIK_LAYER_GROUP_NONE, N_("Alpha:"), VIK_LAYER_WIDGET_HSCALE, &scales[0], NULL, + NULL, alpha_default, NULL, NULL }, + { VIK_LAYER_MAPNIK, "use-file-cache", VIK_LAYER_PARAM_BOOLEAN, VIK_LAYER_GROUP_NONE, N_("Use File Cache:"), VIK_LAYER_WIDGET_CHECKBUTTON, NULL, NULL, + NULL, vik_lpd_true_default, NULL, NULL }, + { VIK_LAYER_MAPNIK, "file-cache-dir", VIK_LAYER_PARAM_STRING, VIK_LAYER_GROUP_NONE, N_("File Cache Directory:"), VIK_LAYER_WIDGET_FOLDERENTRY, NULL, NULL, + NULL, cache_dir_default, NULL, NULL }, +}; + +enum { + PARAM_CONFIG_CSS = 0, + PARAM_CONFIG_XML, + PARAM_ALPHA, + PARAM_USE_FILE_CACHE, + PARAM_FILE_CACHE_DIR, + NUM_PARAMS }; + +static const gchar* mapnik_layer_tooltip ( VikMapnikLayer *vml ); +static void mapnik_layer_marshall( VikMapnikLayer *vml, guint8 **data, guint *len ); +static VikMapnikLayer *mapnik_layer_unmarshall( guint8 *data, guint len, VikViewport *vvp ); +static gboolean mapnik_layer_set_param ( VikMapnikLayer *vml, guint16 id, VikLayerParamData data, VikViewport *vp, gboolean is_file_operation ); +static VikLayerParamData mapnik_layer_get_param ( VikMapnikLayer *vml, guint16 id, gboolean is_file_operation ); +static VikMapnikLayer *mapnik_layer_new ( VikViewport *vvp ); +static VikMapnikLayer *mapnik_layer_create ( VikViewport *vp ); +static void mapnik_layer_free ( VikMapnikLayer *vml ); +static void mapnik_layer_draw ( VikMapnikLayer *vml, VikViewport *vp ); +static void mapnik_layer_add_menu_items ( VikMapnikLayer *vml, GtkMenu *menu, gpointer vlp ); + +static gpointer mapnik_feature_create ( VikWindow *vw, VikViewport *vvp) +{ + return vvp; +} + +static gboolean mapnik_feature_release ( VikMapnikLayer *vml, GdkEventButton *event, VikViewport *vvp ); + +// See comment in viktrwlayer.c for advice on values used +// FUTURE: +static VikToolInterface mapnik_tools[] = { + // Layer Info + // Zoom All? + { NULL, + { "MapnikFeatures", GTK_STOCK_INFO, N_("_Mapnik Features"), NULL, N_("Mapnik Features"), 0 }, + (VikToolConstructorFunc) mapnik_feature_create, + NULL, + NULL, + NULL, + NULL, + NULL, + (VikToolMouseFunc) mapnik_feature_release, + NULL, + NULL, + FALSE, + GDK_LEFT_PTR, NULL, NULL }, +}; + +static void mapnik_layer_post_read (VikLayer *vl, VikViewport *vvp, gboolean from_file); + +VikLayerInterface vik_mapnik_layer_interface = { + "Mapnik Rendering", + N_("Mapnik Rendering"), + NULL, + &vikmapniklayer_pixbuf, // icon + + mapnik_tools, + sizeof(mapnik_tools) / sizeof(VikToolInterface), + + mapnik_layer_params, + NUM_PARAMS, + NULL, + 0, + + VIK_MENU_ITEM_ALL, + + (VikLayerFuncCreate) mapnik_layer_create, + (VikLayerFuncRealize) NULL, + (VikLayerFuncPostRead) mapnik_layer_post_read, + (VikLayerFuncFree) mapnik_layer_free, + + (VikLayerFuncProperties) NULL, + (VikLayerFuncDraw) mapnik_layer_draw, + (VikLayerFuncChangeCoordMode) NULL, + + (VikLayerFuncGetTimestamp) NULL, + + (VikLayerFuncSetMenuItemsSelection) NULL, + (VikLayerFuncGetMenuItemsSelection) NULL, + + (VikLayerFuncAddMenuItems) mapnik_layer_add_menu_items, + (VikLayerFuncSublayerAddMenuItems) NULL, + + (VikLayerFuncSublayerRenameRequest) NULL, + (VikLayerFuncSublayerToggleVisible) NULL, + (VikLayerFuncSublayerTooltip) NULL, + (VikLayerFuncLayerTooltip) mapnik_layer_tooltip, + (VikLayerFuncLayerSelected) NULL, + + (VikLayerFuncMarshall) mapnik_layer_marshall, + (VikLayerFuncUnmarshall) mapnik_layer_unmarshall, + + (VikLayerFuncSetParam) mapnik_layer_set_param, + (VikLayerFuncGetParam) mapnik_layer_get_param, + (VikLayerFuncChangeParam) NULL, + + (VikLayerFuncReadFileData) NULL, + (VikLayerFuncWriteFileData) NULL, + + (VikLayerFuncDeleteItem) NULL, + (VikLayerFuncCutItem) NULL, + (VikLayerFuncCopyItem) NULL, + (VikLayerFuncPasteItem) NULL, + (VikLayerFuncFreeCopiedItem) NULL, + (VikLayerFuncDragDropRequest) NULL, + + (VikLayerFuncSelectClick) NULL, + (VikLayerFuncSelectMove) NULL, + (VikLayerFuncSelectRelease) NULL, + (VikLayerFuncSelectedViewportMenu) NULL, +}; + +struct _VikMapnikLayer { + VikLayer vl; + gchar *filename_css; // CartoCSS MML File - use 'carto' to convert into xml + gchar *filename_xml; + guint8 alpha; + + guint tile_size_x; // Y is the same as X ATM + gboolean loaded; + MapnikInterface* mi; + guint rerender_timeout; + + gboolean use_file_cache; + gchar *file_cache_dir; + + VikCoord rerender_ul; + VikCoord rerender_br; + gdouble rerender_zoom; + GtkWidget *right_click_menu; +}; + +#define MAPNIK_PREFS_GROUP_KEY "mapnik" +#define MAPNIK_PREFS_NAMESPACE "mapnik." + +static VikLayerParamData plugins_default ( void ) +{ + VikLayerParamData data; +#ifdef WINDOWS + data.s = g_strdup ( "input" ); +#else + if ( g_file_test ( "/usr/lib/mapnik/input", G_FILE_TEST_EXISTS ) ) + data.s = g_strdup ( "/usr/lib/mapnik/input" ); + // Current Debian locations + else if ( g_file_test ( "/usr/lib/mapnik/3.0/input", G_FILE_TEST_EXISTS ) ) + data.s = g_strdup ( "/usr/lib/mapnik/3.0/input" ); + else if ( g_file_test ( "/usr/lib/mapnik/2.2/input", G_FILE_TEST_EXISTS ) ) + data.s = g_strdup ( "/usr/lib/mapnik/2.2/input" ); + else + data.s = g_strdup ( "" ); +#endif + return data; +} + +static VikLayerParamData fonts_default ( void ) +{ + // Possibly should be string list to allow loading from multiple directories + VikLayerParamData data; +#ifdef WINDOWS + data.s = g_strdup ( "C:\\Windows\\Fonts" ); +#elif defined __APPLE__ + data.s = g_strdup ( "/Library/Fonts" ); +#else + data.s = g_strdup ( "/usr/share/fonts" ); +#endif + return data; +} + +static VikLayerParam prefs[] = { + // Changing these values only applies before first mapnik layer is 'created' + { VIK_LAYER_NUM_TYPES, MAPNIK_PREFS_NAMESPACE"plugins_directory", VIK_LAYER_PARAM_STRING, VIK_LAYER_GROUP_NONE, N_("Plugins Directory:"), VIK_LAYER_WIDGET_FOLDERENTRY, NULL, NULL, N_("You need to restart Viking for a change to this value to be used"), plugins_default, NULL, NULL }, + { VIK_LAYER_NUM_TYPES, MAPNIK_PREFS_NAMESPACE"fonts_directory", VIK_LAYER_PARAM_STRING, VIK_LAYER_GROUP_NONE, N_("Fonts Directory:"), VIK_LAYER_WIDGET_FOLDERENTRY, NULL, NULL, N_("You need to restart Viking for a change to this value to be used"), fonts_default, NULL, NULL }, + { VIK_LAYER_NUM_TYPES, MAPNIK_PREFS_NAMESPACE"recurse_fonts_directory", VIK_LAYER_PARAM_BOOLEAN, VIK_LAYER_GROUP_NONE, N_("Recurse Fonts Directory:"), VIK_LAYER_WIDGET_CHECKBUTTON, NULL, NULL, N_("You need to restart Viking for a change to this value to be used"), vik_lpd_true_default, NULL, NULL }, + { VIK_LAYER_NUM_TYPES, MAPNIK_PREFS_NAMESPACE"rerender_after", VIK_LAYER_PARAM_UINT, VIK_LAYER_GROUP_NONE, N_("Rerender Timeout (hours):"), VIK_LAYER_WIDGET_SPINBUTTON, &scales[2], NULL, N_("You need to restart Viking for a change to this value to be used"), NULL, NULL, NULL }, + // Changeable any time + { VIK_LAYER_NUM_TYPES, MAPNIK_PREFS_NAMESPACE"carto", VIK_LAYER_PARAM_STRING, VIK_LAYER_GROUP_NONE, N_("CartoCSS:"), VIK_LAYER_WIDGET_FILEENTRY, NULL, NULL, N_("The program to convert CartoCSS files into Mapnik XML"), NULL, NULL, NULL }, +}; + +static time_t planet_import_time; + +static GMutex *tp_mutex; +static GHashTable *requests = NULL; + +/** + * vik_mapnik_layer_init: + * + * Just initialize preferences + */ +void vik_mapnik_layer_init (void) +{ + a_preferences_register_group ( MAPNIK_PREFS_GROUP_KEY, _("Mapnik") ); + + guint i = 0; + VikLayerParamData tmp = plugins_default(); + a_preferences_register(&prefs[i++], tmp, MAPNIK_PREFS_GROUP_KEY); + + tmp = fonts_default(); + a_preferences_register(&prefs[i++], tmp, MAPNIK_PREFS_GROUP_KEY); + + tmp.b = TRUE; + a_preferences_register(&prefs[i++], tmp, MAPNIK_PREFS_GROUP_KEY); + + tmp.u = 168; // One week + a_preferences_register(&prefs[i++], tmp, MAPNIK_PREFS_GROUP_KEY); + + tmp.s = "carto"; + a_preferences_register(&prefs[i++], tmp, MAPNIK_PREFS_GROUP_KEY); +} + +/** + * vik_mapnik_layer_post_init: + * + * Initialize data structures - now that reading preferences is OK to perform + */ +void vik_mapnik_layer_post_init (void) +{ + tp_mutex = vik_mutex_new(); + + // Just storing keys only + requests = g_hash_table_new_full ( g_str_hash, g_str_equal, g_free, NULL ); + + guint hours = a_preferences_get (MAPNIK_PREFS_NAMESPACE"rerender_after")->u; + GDateTime *now = g_date_time_new_now_local (); + GDateTime *then = g_date_time_add_hours (now, -hours); + planet_import_time = g_date_time_to_unix (then); + g_date_time_unref ( now ); + g_date_time_unref ( then ); + + GStatBuf gsb; + // Similar to mod_tile method to mark DB has been imported/significantly changed to cause a rerendering of all tiles + gchar *import_time_file = g_strconcat ( a_get_viking_dir(), G_DIR_SEPARATOR_S, "planet-import-complete", NULL ); + if ( g_stat ( import_time_file, &gsb ) == 0 ) { + // Only update if newer + if ( planet_import_time > gsb.st_mtime ) + planet_import_time = gsb.st_mtime; + } + g_free ( import_time_file ); +} + +void vik_mapnik_layer_uninit () +{ + vik_mutex_free (tp_mutex); +} + +// NB Only performed once per program run +static void mapnik_layer_class_init ( VikMapnikLayerClass *klass ) +{ + VikLayerParamData *pd = a_preferences_get (MAPNIK_PREFS_NAMESPACE"plugins_directory"); + VikLayerParamData *fd = a_preferences_get (MAPNIK_PREFS_NAMESPACE"fonts_directory"); + VikLayerParamData *rfd = a_preferences_get (MAPNIK_PREFS_NAMESPACE"recurse_fonts_directory"); + + if ( pd && fd && rfd ) + mapnik_interface_initialize ( pd->s, fd->s, rfd->b ); + else + g_critical ( "Unable to initialize mapnik interface from preferences" ); +} + +GType vik_mapnik_layer_get_type () +{ + static GType vml_type = 0; + + if (!vml_type) { + static const GTypeInfo vml_info = { + sizeof (VikMapnikLayerClass), + NULL, /* base_init */ + NULL, /* base_finalize */ + (GClassInitFunc) mapnik_layer_class_init, /* class init */ + NULL, /* class_finalize */ + NULL, /* class_data */ + sizeof (VikMapnikLayer), + 0, + NULL /* instance init */ + }; + vml_type = g_type_register_static ( VIK_LAYER_TYPE, "VikMapnikLayer", &vml_info, 0 ); + } + + return vml_type; +} + +static const gchar* mapnik_layer_tooltip ( VikMapnikLayer *vml ) +{ + return vml->filename_xml; +} + +static void mapnik_layer_set_file_xml ( VikMapnikLayer *vml, const gchar *name ) +{ + if ( vml->filename_xml ) + g_free (vml->filename_xml); + // Mapnik doesn't seem to cope with relative filenames + if ( g_strcmp0 (name, "" ) ) + vml->filename_xml = vu_get_canonical_filename ( VIK_LAYER(vml), name); + else + vml->filename_xml = g_strdup (name); +} + +static void mapnik_layer_set_file_css ( VikMapnikLayer *vml, const gchar *name ) +{ + if ( vml->filename_css ) + g_free (vml->filename_css); + vml->filename_css = g_strdup (name); +} + +static void mapnik_layer_set_cache_dir ( VikMapnikLayer *vml, const gchar *name ) +{ + if ( vml->file_cache_dir ) + g_free (vml->file_cache_dir); + vml->file_cache_dir = g_strdup (name); +} + +static void mapnik_layer_marshall( VikMapnikLayer *vml, guint8 **data, guint *len ) +{ + vik_layer_marshall_params ( VIK_LAYER(vml), data, len ); +} + +static VikMapnikLayer *mapnik_layer_unmarshall( guint8 *data, guint len, VikViewport *vvp ) +{ + VikMapnikLayer *rv = mapnik_layer_new ( vvp ); + vik_layer_unmarshall_params ( VIK_LAYER(rv), data, len, vvp ); + return rv; +} + +static gboolean mapnik_layer_set_param ( VikMapnikLayer *vml, guint16 id, VikLayerParamData data, VikViewport *vp, gboolean is_file_operation ) +{ + switch ( id ) { + case PARAM_CONFIG_CSS: mapnik_layer_set_file_css (vml, data.s); break; + case PARAM_CONFIG_XML: mapnik_layer_set_file_xml (vml, data.s); break; + case PARAM_ALPHA: if ( data.u <= 255 ) vml->alpha = data.u; break; + case PARAM_USE_FILE_CACHE: vml->use_file_cache = data.b; break; + case PARAM_FILE_CACHE_DIR: mapnik_layer_set_cache_dir (vml, data.s); break; + default: break; + } + return TRUE; +} + +static VikLayerParamData mapnik_layer_get_param ( VikMapnikLayer *vml, guint16 id, gboolean is_file_operation ) +{ + VikLayerParamData data; + switch ( id ) { + case PARAM_CONFIG_CSS: { + data.s = vml->filename_css; + gboolean set = FALSE; + if ( is_file_operation ) { + if ( a_vik_get_file_ref_format() == VIK_FILE_REF_FORMAT_RELATIVE ) { + gchar *cwd = g_get_current_dir(); + if ( cwd ) { + data.s = file_GetRelativeFilename ( cwd, vml->filename_css ); + if ( !data.s ) data.s = ""; + set = TRUE; + } + } + } + if ( !set ) + data.s = vml->filename_css ? vml->filename_css : ""; + break; + } + case PARAM_CONFIG_XML: { + data.s = vml->filename_xml; + gboolean set = FALSE; + if ( is_file_operation ) { + if ( a_vik_get_file_ref_format() == VIK_FILE_REF_FORMAT_RELATIVE ) { + gchar *cwd = g_get_current_dir(); + if ( cwd ) { + data.s = file_GetRelativeFilename ( cwd, vml->filename_xml ); + if ( !data.s ) data.s = ""; + set = TRUE; + } + } + } + if ( !set ) + data.s = vml->filename_xml ? vml->filename_xml : ""; + break; + } + case PARAM_ALPHA: data.u = vml->alpha; break; + case PARAM_USE_FILE_CACHE: data.b = vml->use_file_cache; break; + case PARAM_FILE_CACHE_DIR: data.s = vml->file_cache_dir; break; + default: break; + } + return data; +} + +/** + * + */ +static VikMapnikLayer *mapnik_layer_new ( VikViewport *vvp ) +{ + VikMapnikLayer *vml = VIK_MAPNIK_LAYER ( g_object_new ( VIK_MAPNIK_LAYER_TYPE, NULL ) ); + vik_layer_set_type ( VIK_LAYER(vml), VIK_LAYER_MAPNIK ); + vik_layer_set_defaults ( VIK_LAYER(vml), vvp ); + vml->tile_size_x = size_default().u; // FUTURE: Is there any use in this being configurable? + vml->loaded = FALSE; + vml->mi = mapnik_interface_new(); + return vml; +} + +/** + * Run carto command + * ATM don't have any version issues AFAIK + * Tested with carto 0.14.0 + */ +gboolean carto_load ( VikMapnikLayer *vml, VikViewport *vvp ) +{ + gchar *mystdout = NULL; + gchar *mystderr = NULL; + GError *error = NULL; + + VikLayerParamData *vlpd = a_preferences_get(MAPNIK_PREFS_NAMESPACE"carto"); + gchar *command = g_strdup_printf ( "%s %s", vlpd->s, vml->filename_css ); + + gboolean answer = TRUE; + //gchar *args[2]; args[0] = vlpd->s; args[1] = vml->filename_css; + //GPid pid; + //if ( g_spawn_async_with_pipes ( NULL, args, NULL, G_SPAWN_SEARCH_PATH, NULL, NULL, &pid, NULL, &carto_stdout, &carto_error, &error ) ) { + // cf code in babel.c to handle stdout + + // NB Running carto may take several seconds + // especially for large style sheets like the default OSM Mapnik style (~6 seconds on my system) + VikWindow *vw = VIK_WINDOW(VIK_GTK_WINDOW_FROM_WIDGET(vvp)); + if ( vw ) { + gchar *msg = g_strdup_printf ( "%s: %s", _("Running"), command ); + vik_window_statusbar_update ( vw, msg, VIK_STATUSBAR_INFO ); + vik_window_set_busy_cursor ( vw ); + g_free ( msg ); + } + + gint64 tt1 = 0; + gint64 tt2 = 0; + // You won't get a sensible timing measurement if running too old a GLIB +#if GLIB_CHECK_VERSION (2, 28, 0) + tt1 = g_get_real_time (); +#endif + + if ( g_spawn_command_line_sync ( command, &mystdout, &mystderr, NULL, &error ) ) { +#if GLIB_CHECK_VERSION (2, 28, 0) + tt2 = g_get_real_time (); +#endif + if ( mystderr ) + if ( strlen(mystderr) > 1 ) { + a_dialog_error_msg_extra ( VIK_GTK_WINDOW_FROM_WIDGET(vvp), _("Error running carto command:\n%s"), mystderr ); + answer = FALSE; + } + if ( mystdout ) { + // NB This will overwrite the specified XML file + if ( ! ( vml->filename_xml && strlen (vml->filename_xml) > 1 ) ) { + // XML Not specified so try to create based on CSS file name + GRegex *regex = g_regex_new ( "\\.mml$|\\.mss|\\.css$", G_REGEX_CASELESS, 0, &error ); + if ( error ) + g_critical ("%s: %s", __FUNCTION__, error->message ); + if ( vml->filename_xml ) + g_free (vml->filename_xml); + vml->filename_xml = g_regex_replace_literal ( regex, vml->filename_css, -1, 0, ".xml", 0, &error ); + if ( error ) + g_warning ("%s: %s", __FUNCTION__, error->message ); + // Prevent overwriting self + if ( !g_strcmp0 ( vml->filename_xml, vml->filename_css ) ) { + vml->filename_xml = g_strconcat ( vml->filename_css, ".xml", NULL ); + } + g_regex_unref ( regex ); + } + if ( !g_file_set_contents (vml->filename_xml, mystdout, -1, &error) ) { + g_warning ("%s: %s", __FUNCTION__, error->message ); + g_error_free (error); + } + } + g_free ( mystdout ); + g_free ( mystderr ); + } + else { + g_warning ("%s: %s", __FUNCTION__, error->message ); + g_error_free (error); + } + g_free ( command ); + + if ( vw ) { + gchar *msg = g_strdup_printf ( "%s %s %.1f %s", vlpd->s, _(" completed in "), (gdouble)(tt2-tt1)/G_USEC_PER_SEC, _("seconds") ); + vik_window_statusbar_update ( vw, msg, VIK_STATUSBAR_INFO ); + g_free ( msg ); + vik_window_clear_busy_cursor ( vw ); + } + return answer; +} + +/** + * + */ +static void mapnik_layer_post_read (VikLayer *vl, VikViewport *vvp, gboolean from_file) +{ + VikMapnikLayer *vml = VIK_MAPNIK_LAYER(vl); + + // Determine if carto needs to be run + gboolean do_carto = FALSE; + if ( vml->filename_css && strlen(vml->filename_css) > 1 ) { + if ( vml->filename_xml && strlen(vml->filename_xml) > 1) { + // Compare timestamps + GStatBuf gsb1; + if ( g_stat ( vml->filename_xml, &gsb1 ) == 0 ) { + GStatBuf gsb2; + if ( g_stat ( vml->filename_css, &gsb2 ) == 0 ) { + // Is CSS file newer than the XML file + if ( gsb2.st_mtime > gsb1.st_mtime ) + do_carto = TRUE; + else + g_debug ( "No need to run carto" ); + } + } + else { + // XML file doesn't exist + do_carto = TRUE; + } + } + else { + // No XML specified thus need to generate + do_carto = TRUE; + } + } + + if ( do_carto ) + // Don't load the XML config if carto load fails + if ( !carto_load ( vml, vvp ) ) + return; + + gchar* ans = mapnik_interface_load_map_file ( vml->mi, vml->filename_xml, vml->tile_size_x, vml->tile_size_x ); + if ( ans ) { + a_dialog_error_msg_extra ( VIK_GTK_WINDOW_FROM_WIDGET(vvp), + _("Mapnik error loading configuration file:\n%s"), + ans ); + g_free ( ans ); + } + else { + vml->loaded = TRUE; + if ( !from_file ) + ui_add_recent_file ( vml->filename_xml ); + } +} + +#define MAPNIK_LAYER_FILE_CACHE_LAYOUT "%s"G_DIR_SEPARATOR_S"%d"G_DIR_SEPARATOR_S"%d"G_DIR_SEPARATOR_S"%d.png" + +// Free returned string after use +static gchar *get_filename ( gchar *dir, guint x, guint y, guint z) +{ + return g_strdup_printf ( MAPNIK_LAYER_FILE_CACHE_LAYOUT, dir, (17-z), x, y ); +} + +static void possibly_save_pixbuf ( VikMapnikLayer *vml, GdkPixbuf *pixbuf, MapCoord *ulm ) +{ + if ( vml->use_file_cache ) { + if ( vml->file_cache_dir ) { + GError *error = NULL; + gchar *filename = get_filename ( vml->file_cache_dir, ulm->x, ulm->y, ulm->scale ); + + gchar *dir = g_path_get_dirname ( filename ); + if ( !g_file_test ( filename, G_FILE_TEST_EXISTS ) ) + if ( g_mkdir_with_parents ( dir , 0777 ) != 0 ) + g_warning ("%s: Failed to mkdir %s", __FUNCTION__, dir ); + g_free ( dir ); + + if ( !gdk_pixbuf_save (pixbuf, filename, "png", &error, NULL ) ) { + g_warning ("%s: %s", __FUNCTION__, error->message ); + g_error_free (error); + } + g_free (filename); + } + } +} + +typedef struct +{ + VikMapnikLayer *vml; + VikCoord *ul; + VikCoord *br; + MapCoord *ulmc; + const gchar* request; +} RenderInfo; + +/** + * render: + * + * Common render function which can run in separate thread + */ +static void render ( VikMapnikLayer *vml, VikCoord *ul, VikCoord *br, MapCoord *ulm ) +{ + gint64 tt1 = g_get_real_time (); + GdkPixbuf *pixbuf = mapnik_interface_render ( vml->mi, ul->north_south, ul->east_west, br->north_south, br->east_west ); + gint64 tt2 = g_get_real_time (); + gdouble tt = (gdouble)(tt2-tt1)/1000000; + g_debug ( "Mapnik rendering completed in %.3f seconds", tt ); + if ( !pixbuf ) { + // A pixbuf to stick into cache incase of an unrenderable area - otherwise will get continually re-requested + pixbuf = gdk_pixbuf_scale_simple ( gdk_pixbuf_from_pixdata(&vikmapniklayer_pixbuf, FALSE, NULL), vml->tile_size_x, vml->tile_size_x, GDK_INTERP_BILINEAR ); + } + possibly_save_pixbuf ( vml, pixbuf, ulm ); + + // NB Mapnik can apply alpha, but use our own function for now + if ( vml->alpha < 255 ) + pixbuf = ui_pixbuf_scale_alpha ( pixbuf, vml->alpha ); + a_mapcache_add ( pixbuf, (mapcache_extra_t){ tt }, ulm->x, ulm->y, ulm->z, MAP_ID_MAPNIK_RENDER, ulm->scale, vml->alpha, 0.0, 0.0, vml->filename_xml ); + g_object_unref(pixbuf); +} + +static void render_info_free ( RenderInfo *data ) +{ + g_free ( data->ul ); + g_free ( data->br ); + g_free ( data->ulmc ); + // NB No need to free the request/key - as this is freed by the hash table destructor + g_free ( data ); +} + +static void background ( RenderInfo *data, gpointer threaddata ) +{ + int res = a_background_thread_progress ( threaddata, 0 ); + if (res == 0) { + render ( data->vml, data->ul, data->br, data->ulmc ); + } + + g_mutex_lock(tp_mutex); + g_hash_table_remove (requests, data->request); + g_mutex_unlock(tp_mutex); + + if (res == 0) + vik_layer_emit_update ( VIK_LAYER(data->vml) ); // NB update display from background +} + +static void render_cancel_cleanup (RenderInfo *data) +{ + // Anything? +} + +#define REQUEST_HASHKEY_FORMAT "%d-%d-%d-%d-%d" + +/** + * Thread + */ +static void thread_add (VikMapnikLayer *vml, MapCoord *mul, VikCoord *ul, VikCoord *br, gint x, gint y, gint z, gint zoom, const gchar* name ) +{ + // Create request + guint nn = name ? g_str_hash ( name ) : 0; + gchar *request = g_strdup_printf ( REQUEST_HASHKEY_FORMAT, x, y, z, zoom, nn ); + + g_mutex_lock(tp_mutex); + + if ( g_hash_table_lookup_extended (requests, request, NULL, NULL ) ) { + g_free ( request ); + g_mutex_unlock (tp_mutex); + return; + } + + RenderInfo *ri = g_malloc ( sizeof(RenderInfo) ); + ri->vml = vml; + ri->ul = g_malloc ( sizeof(VikCoord) ); + ri->br = g_malloc ( sizeof(VikCoord) ); + ri->ulmc = g_malloc ( sizeof(MapCoord) ); + memcpy(ri->ul, ul, sizeof(VikCoord)); + memcpy(ri->br, br, sizeof(VikCoord)); + memcpy(ri->ulmc, mul, sizeof(MapCoord)); + ri->request = request; + + g_hash_table_insert ( requests, request, NULL ); + + g_mutex_unlock (tp_mutex); + + gchar *basename = g_path_get_basename (name); + gchar *description = g_strdup_printf ( _("Mapnik Render %d:%d:%d %s"), zoom, x, y, basename ); + g_free ( basename ); + a_background_thread ( BACKGROUND_POOL_LOCAL_MAPNIK, + VIK_GTK_WINDOW_FROM_LAYER(vml), + description, + (vik_thr_func) background, + ri, + (vik_thr_free_func) render_info_free, + (vik_thr_free_func) render_cancel_cleanup, + 1 ); + g_free ( description ); +} + +/** + * load_pixbuf: + * + * If function returns GdkPixbuf properly, reference counter to this + * buffer has to be decreased, when buffer is no longer needed. + */ +static GdkPixbuf *load_pixbuf ( VikMapnikLayer *vml, MapCoord *ulm, MapCoord *brm, gboolean *rerender ) +{ + *rerender = FALSE; + GdkPixbuf *pixbuf = NULL; + gchar *filename = get_filename ( vml->file_cache_dir, ulm->x, ulm->y, ulm->scale ); + + GStatBuf gsb; + if ( g_stat ( filename, &gsb ) == 0 ) { + // Get from disk + GError *error = NULL; + pixbuf = gdk_pixbuf_new_from_file ( filename, &error ); + if ( error ) { + g_warning ("%s: %s", __FUNCTION__, error->message ); + g_error_free ( error ); + } + else { + if ( vml->alpha < 255 ) + pixbuf = ui_pixbuf_set_alpha ( pixbuf, vml->alpha ); + a_mapcache_add ( pixbuf, (mapcache_extra_t) { -42.0 }, ulm->x, ulm->y, ulm->z, MAP_ID_MAPNIK_RENDER, ulm->scale, vml->alpha, 0.0, 0.0, vml->filename_xml ); + } + // If file is too old mark for rerendering + if ( planet_import_time < gsb.st_mtime ) { + *rerender = TRUE; + } + } + g_free ( filename ); + + return pixbuf; +} + +/** + * Caller has to decrease reference counter of returned + * GdkPixbuf, when buffer is no longer needed. + */ +static GdkPixbuf *get_pixbuf ( VikMapnikLayer *vml, MapCoord *ulm, MapCoord *brm ) +{ + VikCoord ul; VikCoord br; + GdkPixbuf *pixbuf = NULL; + + map_utils_iTMS_to_vikcoord (ulm, &ul); + map_utils_iTMS_to_vikcoord (brm, &br); + + pixbuf = a_mapcache_get ( ulm->x, ulm->y, ulm->z, MAP_ID_MAPNIK_RENDER, ulm->scale, vml->alpha, 0.0, 0.0, vml->filename_xml ); + + if ( ! pixbuf ) { + gboolean rerender = FALSE; + if ( vml->use_file_cache && vml->file_cache_dir ) + pixbuf = load_pixbuf ( vml, ulm, brm, &rerender ); + if ( ! pixbuf || rerender ) { + if ( TRUE ) + thread_add (vml, ulm, &ul, &br, ulm->x, ulm->y, ulm->z, ulm->scale, vml->filename_xml ); + else { + // Run in the foreground + render ( vml, &ul, &br, ulm ); + vik_layer_emit_update ( VIK_LAYER(vml) ); + } + } + } + + return pixbuf; +} + +/** + * + */ +static void mapnik_layer_draw ( VikMapnikLayer *vml, VikViewport *vvp ) +{ + if ( !vml->loaded ) + return; + + if ( vik_viewport_get_drawmode(vvp) != VIK_VIEWPORT_DRAWMODE_MERCATOR ) { + vik_statusbar_set_message ( vik_window_get_statusbar (VIK_WINDOW(VIK_GTK_WINDOW_FROM_LAYER(vml))), + VIK_STATUSBAR_INFO, _("Mapnik Rendering must be in Mercator mode") ); + return; + } + + if ( vml->mi ) { + gchar *copyright = mapnik_interface_get_copyright ( vml->mi ); + if ( copyright ) { + vik_viewport_add_copyright ( vvp, copyright ); + } + } + + VikCoord ul, br; + ul.mode = VIK_COORD_LATLON; + br.mode = VIK_COORD_LATLON; + vik_viewport_screen_to_coord ( vvp, 0, 0, &ul ); + vik_viewport_screen_to_coord ( vvp, vik_viewport_get_width(vvp), vik_viewport_get_height(vvp), &br ); + + gdouble xzoom = vik_viewport_get_xmpp ( vvp ); + gdouble yzoom = vik_viewport_get_ympp ( vvp ); + + MapCoord ulm, brm; + + if ( map_utils_vikcoord_to_iTMS ( &ul, xzoom, yzoom, &ulm ) && + map_utils_vikcoord_to_iTMS ( &br, xzoom, yzoom, &brm ) ) { + // TODO: Understand if tilesize != 256 does this need to use shrinkfactors?? + GdkPixbuf *pixbuf; + VikCoord coord; + gint xx, yy; + + gint xmin = MIN(ulm.x, brm.x), xmax = MAX(ulm.x, brm.x); + gint ymin = MIN(ulm.y, brm.y), ymax = MAX(ulm.y, brm.y); + + // Split rendering into a grid for the current viewport + // thus each individual 'tile' can then be stored in the map cache + for (gint x = xmin; x <= xmax; x++ ) { + for (gint y = ymin; y <= ymax; y++ ) { + ulm.x = x; + ulm.y = y; + brm.x = x+1; + brm.y = y+1; + + pixbuf = get_pixbuf ( vml, &ulm, &brm ); + + if ( pixbuf ) { + map_utils_iTMS_to_vikcoord ( &ulm, &coord ); + vik_viewport_coord_to_screen ( vvp, &coord, &xx, &yy ); + vik_viewport_draw_pixbuf ( vvp, pixbuf, 0, 0, xx, yy, vml->tile_size_x, vml->tile_size_x ); + g_object_unref(pixbuf); + } + } + } + + // Done after so drawn on top + // Just a handy guide to tile blocks. + if ( vik_debug && vik_verbose ) { + GdkGC *black_gc = GTK_WIDGET(vvp)->style->black_gc; + gint width = vik_viewport_get_width(vvp); + gint height = vik_viewport_get_height(vvp); + gint xx, yy; + ulm.x = xmin; ulm.y = ymin; + map_utils_iTMS_to_center_vikcoord ( &ulm, &coord ); + vik_viewport_coord_to_screen ( vvp, &coord, &xx, &yy ); + xx = xx - (vml->tile_size_x/2); + yy = yy - (vml->tile_size_x/2); // Yes use X ATM + for (gint x = xmin; x <= xmax; x++ ) { + vik_viewport_draw_line ( vvp, black_gc, xx, 0, xx, height ); + xx += vml->tile_size_x; + } + for (gint y = ymin; y <= ymax; y++ ) { + vik_viewport_draw_line ( vvp, black_gc, 0, yy, width, yy ); + yy += vml->tile_size_x; // Yes use X ATM + } + } + } +} + +/** + * + */ +static void mapnik_layer_free ( VikMapnikLayer *vml ) +{ + mapnik_interface_free ( vml->mi ); + if ( vml->filename_css ) + g_free ( vml->filename_css ); + if ( vml->filename_xml ) + g_free ( vml->filename_xml ); +} + +static VikMapnikLayer *mapnik_layer_create ( VikViewport *vp ) +{ + return mapnik_layer_new ( vp ); +} + +typedef enum { + MA_VML = 0, + MA_VVP, + MA_LAST +} menu_array_index; + +typedef gpointer menu_array_values[MA_LAST]; + +/** + * + */ +static void mapnik_layer_flush_memory ( menu_array_values values ) +{ + a_mapcache_flush_type ( MAP_ID_MAPNIK_RENDER ); +} + +/** + * + */ +static void mapnik_layer_reload ( menu_array_values values ) +{ + VikMapnikLayer *vml = values[MA_VML]; + VikViewport *vvp = values[MA_VVP]; + mapnik_layer_post_read (VIK_LAYER(vml), vvp, FALSE); + mapnik_layer_draw ( vml, vvp ); +} + +/** + * Force carto run + * + * Most carto projects will consist of many files + * ATM don't have a way of detecting when any of the included files have changed + * Thus allow a manual method to force re-running carto + */ +static void mapnik_layer_carto ( menu_array_values values ) +{ + VikMapnikLayer *vml = values[MA_VML]; + VikViewport *vvp = values[MA_VVP]; + + // Don't load the XML config if carto load fails + if ( !carto_load ( vml, vvp ) ) + return; + + gchar* ans = mapnik_interface_load_map_file ( vml->mi, vml->filename_xml, vml->tile_size_x, vml->tile_size_x ); + if ( ans ) { + a_dialog_error_msg_extra ( VIK_GTK_WINDOW_FROM_WIDGET(vvp), + _("Mapnik error loading configuration file:\n%s"), + ans ); + g_free ( ans ); + } + else + mapnik_layer_draw ( vml, vvp ); +} + +/** + * Show Mapnik configuration parameters + */ +static void mapnik_layer_information ( menu_array_values values ) +{ + VikMapnikLayer *vml = values[MA_VML]; + if ( !vml->mi ) + return; + GArray *array = mapnik_interface_get_parameters( vml->mi ); + if ( array->len ) { + a_dialog_list ( VIK_GTK_WINDOW_FROM_LAYER(vml), _("Mapnik Information"), array, 1 ); + // Free the copied strings + for ( int i = 0; i < array->len; i++ ) + g_free ( g_array_index(array,gchar*,i) ); + } + g_array_free ( array, FALSE ); +} + +/** + * + */ +static void mapnik_layer_about ( menu_array_values values ) +{ + VikMapnikLayer *vml = values[MA_VML]; + gchar *msg = mapnik_interface_about(); + a_dialog_info_msg ( VIK_GTK_WINDOW_FROM_LAYER(vml), msg ); + g_free ( msg ); +} + +/** + * + */ +static void mapnik_layer_add_menu_items ( VikMapnikLayer *vml, GtkMenu *menu, gpointer vlp ) +{ + static menu_array_values values; + values[MA_VML] = vml; + values[MA_VVP] = vik_layers_panel_get_viewport( VIK_LAYERS_PANEL(vlp) ); + + GtkWidget *item = gtk_menu_item_new(); + gtk_menu_shell_append ( GTK_MENU_SHELL(menu), item ); + gtk_widget_show ( item ); + + // Typical users shouldn't need to use this functionality - so debug only ATM + if ( vik_debug ) { + item = gtk_image_menu_item_new_with_mnemonic ( _("_Flush Memory Cache") ); + gtk_image_menu_item_set_image ( (GtkImageMenuItem*)item, gtk_image_new_from_stock (GTK_STOCK_REMOVE, GTK_ICON_SIZE_MENU) ); + g_signal_connect_swapped ( G_OBJECT(item), "activate", G_CALLBACK(mapnik_layer_flush_memory), values ); + gtk_menu_shell_append (GTK_MENU_SHELL (menu), item); + gtk_widget_show ( item ); + } + + item = gtk_image_menu_item_new_from_stock ( GTK_STOCK_REFRESH, NULL ); + g_signal_connect_swapped ( G_OBJECT(item), "activate", G_CALLBACK(mapnik_layer_reload), values ); + gtk_menu_shell_append (GTK_MENU_SHELL (menu), item); + gtk_widget_show ( item ); + + if ( g_strcmp0 ("", vml->filename_css) ) { + item = gtk_image_menu_item_new_with_mnemonic ( _("_Run Carto Command") ); + gtk_image_menu_item_set_image ( (GtkImageMenuItem*)item, gtk_image_new_from_stock (GTK_STOCK_EXECUTE, GTK_ICON_SIZE_MENU) ); + g_signal_connect_swapped ( G_OBJECT(item), "activate", G_CALLBACK(mapnik_layer_carto), values ); + gtk_menu_shell_append (GTK_MENU_SHELL (menu), item); + gtk_widget_show ( item ); + } + + item = gtk_image_menu_item_new_from_stock ( GTK_STOCK_INFO, NULL ); + g_signal_connect_swapped ( G_OBJECT(item), "activate", G_CALLBACK(mapnik_layer_information), values ); + gtk_menu_shell_append (GTK_MENU_SHELL (menu), item); + gtk_widget_show ( item ); + + item = gtk_image_menu_item_new_from_stock ( GTK_STOCK_ABOUT, NULL ); + g_signal_connect_swapped ( G_OBJECT(item), "activate", G_CALLBACK(mapnik_layer_about), values ); + gtk_menu_shell_append (GTK_MENU_SHELL (menu), item); + gtk_widget_show ( item ); +} + +/** + * Rerender a specific tile + */ +static void mapnik_layer_rerender ( VikMapnikLayer *vml ) +{ + MapCoord ulm; + // Requested position to map coord + map_utils_vikcoord_to_iTMS ( &vml->rerender_ul, vml->rerender_zoom, vml->rerender_zoom, &ulm ); + // Reconvert back - thus getting the coordinate at the tile *ul corner* + map_utils_iTMS_to_vikcoord (&ulm, &vml->rerender_ul ); + // Bottom right bound is simply +1 in TMS coords + MapCoord brm = ulm; + brm.x = brm.x+1; + brm.y = brm.y+1; + map_utils_iTMS_to_vikcoord (&brm, &vml->rerender_br ); + thread_add (vml, &ulm, &vml->rerender_ul, &vml->rerender_br, ulm.x, ulm.y, ulm.z, ulm.scale, vml->filename_xml ); +} + +/** + * Info + */ +static void mapnik_layer_tile_info ( VikMapnikLayer *vml ) +{ + MapCoord ulm; + // Requested position to map coord + map_utils_vikcoord_to_iTMS ( &vml->rerender_ul, vml->rerender_zoom, vml->rerender_zoom, &ulm ); + + mapcache_extra_t extra = a_mapcache_get_extra ( ulm.x, ulm.y, ulm.z, MAP_ID_MAPNIK_RENDER, ulm.scale, vml->alpha, 0.0, 0.0, vml->filename_xml ); + + gchar *filename = get_filename ( vml->file_cache_dir, ulm.x, ulm.y, ulm.scale ); + gchar *filemsg = NULL; + gchar *timemsg = NULL; + + if ( g_file_test ( filename, G_FILE_TEST_EXISTS ) ) { + filemsg = g_strconcat ( "Tile File: ", filename, NULL ); + // Get some timestamp information of the tile + GStatBuf stat_buf; + if ( g_stat ( filename, &stat_buf ) == 0 ) { + gchar time_buf[64]; + strftime ( time_buf, sizeof(time_buf), "%c", gmtime((const time_t *)&stat_buf.st_mtime) ); + timemsg = g_strdup_printf ( _("Tile File Timestamp: %s"), time_buf ); + } + else { + timemsg = g_strdup ( _("Tile File Timestamp: Not Available") ); + } + } + else { + filemsg = g_strdup_printf ( "Tile File: %s [Not Available]", filename ); + timemsg = g_strdup(""); + } + + GArray *array = g_array_new (FALSE, TRUE, sizeof(gchar*)); + g_array_append_val ( array, filemsg ); + g_array_append_val ( array, timemsg ); + + gchar *rendmsg = NULL; + // Show the info + if ( extra.duration > 0.0 ) { + rendmsg = g_strdup_printf ( _("Rendering time %.2f seconds"), extra.duration ); + g_array_append_val ( array, rendmsg ); + } + + a_dialog_list ( VIK_GTK_WINDOW_FROM_LAYER(vml), _("Tile Information"), array, 5 ); + g_array_free ( array, FALSE ); + + g_free ( rendmsg ); + g_free ( timemsg ); + g_free ( filemsg ); + g_free ( filename ); +} + +static gboolean mapnik_feature_release ( VikMapnikLayer *vml, GdkEventButton *event, VikViewport *vvp ) +{ + if ( !vml ) + return FALSE; + if ( event->button == 3 ) { + vik_viewport_screen_to_coord ( vvp, MAX(0, event->x), MAX(0, event->y), &vml->rerender_ul ); + vml->rerender_zoom = vik_viewport_get_zoom ( vvp ); + + if ( ! vml->right_click_menu ) { + GtkWidget *item; + vml->right_click_menu = gtk_menu_new (); + + item = gtk_image_menu_item_new_with_mnemonic ( _("_Rerender Tile") ); + gtk_image_menu_item_set_image ( (GtkImageMenuItem*)item, gtk_image_new_from_stock (GTK_STOCK_REFRESH, GTK_ICON_SIZE_MENU) ); + g_signal_connect_swapped ( G_OBJECT(item), "activate", G_CALLBACK(mapnik_layer_rerender), vml ); + gtk_menu_shell_append ( GTK_MENU_SHELL(vml->right_click_menu), item ); + + item = gtk_image_menu_item_new_with_mnemonic ( _("_Info") ); + gtk_image_menu_item_set_image ( (GtkImageMenuItem*)item, gtk_image_new_from_stock (GTK_STOCK_INFO, GTK_ICON_SIZE_MENU) ); + g_signal_connect_swapped ( G_OBJECT(item), "activate", G_CALLBACK(mapnik_layer_tile_info), vml ); + gtk_menu_shell_append ( GTK_MENU_SHELL(vml->right_click_menu), item ); + } + + gtk_menu_popup ( GTK_MENU(vml->right_click_menu), NULL, NULL, NULL, NULL, event->button, event->time ); + gtk_widget_show_all ( GTK_WIDGET(vml->right_click_menu) ); + } + + return FALSE; +} diff --git a/src/vikmapniklayer.h b/src/vikmapniklayer.h new file mode 100644 index 0000000..bb4690d --- /dev/null +++ b/src/vikmapniklayer.h @@ -0,0 +1,47 @@ +/* + * viking -- GPS Data and Topo Analyzer, Explorer, and Manager + * + * Copyright (c) 2015, Rob Norris + * + * 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., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA + * + */ + +#ifndef _VIKING_MAPNIKLAYER_H +#define _VIKING_MAPNIKLAYER_H + +#include "viklayer.h" + +G_BEGIN_DECLS + +#define VIK_MAPNIK_LAYER_TYPE (vik_mapnik_layer_get_type ()) +#define VIK_MAPNIK_LAYER(obj) (G_TYPE_CHECK_INSTANCE_CAST ((obj), VIK_MAPNIK_LAYER_TYPE, VikMapnikLayer)) +#define VIK_MAPNIK_LAYER_CLASS(klass) (G_TYPE_CHECK_CLASS_CAST ((klass), VIK_MAPNIK_LAYER_TYPE, VikMapnikLayerClass)) +#define IS_VIK_MAPNIK_LAYER(obj) (G_TYPE_CHECK_INSTANCE_TYPE ((obj), VIK_MAPNIK_LAYER_TYPE)) +#define IS_VIK_MAPNIK_LAYER_CLASS(klass) (G_TYPE_CHECK_CLASS_TYPE ((klass), VIK_MAPNIK_LAYER_TYPE)) + +typedef struct _VikMapnikLayerClass VikMapnikLayerClass; + +GType vik_mapnik_layer_get_type (); + +typedef struct _VikMapnikLayer VikMapnikLayer; + +void vik_mapnik_layer_init (void); +void vik_mapnik_layer_post_init (void); +void vik_mapnik_layer_uninit (void); + +G_END_DECLS + +#endif diff --git a/src/vikmapslayer.c b/src/vikmapslayer.c new file mode 100644 index 0000000..6a89fd0 --- /dev/null +++ b/src/vikmapslayer.c @@ -0,0 +1,2580 @@ +/* + * viking -- GPS Data and Topo Analyzer, Explorer, and Manager + * + * Copyright (C) 2005, Evan Battaglia + * Copyright (C) 2010, Guilhem Bonnefille + * Copyright (c) 2013, Rob Norris + * UTM multi-zone stuff by Kit Transue + * Dynamic map type by Guilhem Bonnefille + * + * 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., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA + * + */ + +#ifdef HAVE_CONFIG_H +#include "config.h" +#endif + +#include +#include +#include +#include +#include + +#ifdef HAVE_STRING_H +#include +#endif +#ifdef HAVE_MATH_H +#include +#endif + +#ifdef HAVE_UNISTD_H +#include +#endif + +#include "viking.h" +#include "vikmapsourcedefault.h" +#include "maputils.h" +#include "mapcache.h" +#include "background.h" +#include "preferences.h" +#include "vikmapslayer.h" +#include "icons/icons.h" +#include "metatile.h" +#include "ui_util.h" +#include "map_ids.h" + +#ifdef HAVE_SQLITE3_H +#include "sqlite3.h" +#include +#endif + +#define VIK_SETTINGS_MAP_MAX_TILES "maps_max_tiles" +static gint MAX_TILES = 1000; + +#define VIK_SETTINGS_MAP_MIN_SHRINKFACTOR "maps_min_shrinkfactor" +#define VIK_SETTINGS_MAP_MAX_SHRINKFACTOR "maps_max_shrinkfactor" +static gdouble MAX_SHRINKFACTOR = 8.0000001; /* zoom 1 viewing 8-tiles */ +static gdouble MIN_SHRINKFACTOR = 0.0312499; /* zoom 32 viewing 1-tiles */ + +#define VIK_SETTINGS_MAP_REAL_MIN_SHRINKFACTOR "maps_real_min_shrinkfactor" +static gdouble REAL_MIN_SHRINKFACTOR = 0.0039062499; /* if shrinkfactor is between MAX and REAL_MAX, will only check for existence */ + +#define VIK_SETTINGS_MAP_SCALE_INC_UP "maps_scale_inc_up" +static guint SCALE_INC_UP = 2; +#define VIK_SETTINGS_MAP_SCALE_INC_DOWN "maps_scale_inc_down" +static guint SCALE_INC_DOWN = 4; +#define VIK_SETTINGS_MAP_SCALE_SMALLER_ZOOM_FIRST "maps_scale_smaller_zoom_first" +static gboolean SCALE_SMALLER_ZOOM_FIRST = TRUE; + +/****** MAP TYPES ******/ + +static GList *__map_types = NULL; + +#define NUM_MAP_TYPES g_list_length(__map_types) + +/* List of label for each map type */ +static gchar **params_maptypes = NULL; + +/* Corresponding IDS. (Cf. field uniq_id in VikMapsLayer struct) */ +static guint *params_maptypes_ids = NULL; + +/******** MAPZOOMS *********/ + +static gchar *params_mapzooms[] = { N_("Use Viking Zoom Level"), "0.125", "0.25", "0.5", "1", "2", "4", "8", "16", "32", "64", "128", "256", "512", "1024", "USGS 10k", "USGS 24k", "USGS 25k", "USGS 50k", "USGS 100k", "USGS 200k", "USGS 250k", NULL }; +static gdouble __mapzooms_x[] = { 0.0, 0.125, 0.25, 0.5, 1.0, 2.0, 4.0, 8.0, 16.0, 32.0, 64.0, 128.0, 256.0, 512.0, 1024.0, 1.016, 2.4384, 2.54, 5.08, 10.16, 20.32, 25.4 }; +static gdouble __mapzooms_y[] = { 0.0, 0.125, 0.25, 0.5, 1.0, 2.0, 4.0, 8.0, 16.0, 32.0, 64.0, 128.0, 256.0, 512.0, 1024.0, 1.016, 2.4384, 2.54, 5.08, 10.16, 20.32, 25.4 }; + +#define NUM_MAPZOOMS (sizeof(params_mapzooms)/sizeof(params_mapzooms[0]) - 1) + +/**************************/ + + +static void maps_layer_post_read (VikLayer *vl, VikViewport *vp, gboolean from_file); +static const gchar* maps_layer_tooltip ( VikMapsLayer *vml ); +static void maps_layer_marshall( VikMapsLayer *vml, guint8 **data, guint *len ); +static VikMapsLayer *maps_layer_unmarshall( guint8 *data, guint len, VikViewport *vvp ); +static gboolean maps_layer_set_param ( VikMapsLayer *vml, VikLayerSetParam *vlsp ); +static VikLayerParamData maps_layer_get_param ( VikMapsLayer *vml, guint16 id, gboolean is_file_operation ); +static void maps_layer_change_param ( GtkWidget *widget, ui_change_values values ); +static void maps_layer_draw ( VikMapsLayer *vml, VikViewport *vvp ); +static VikMapsLayer *maps_layer_new ( VikViewport *vvp ); +static void maps_layer_free ( VikMapsLayer *vml ); +static gboolean maps_layer_download_release ( VikMapsLayer *vml, GdkEventButton *event, VikViewport *vvp ); +static gboolean maps_layer_download_click ( VikMapsLayer *vml, GdkEventButton *event, VikViewport *vvp ); +static gpointer maps_layer_download_create ( VikWindow *vw, VikViewport *vvp ); +static void maps_layer_set_cache_dir ( VikMapsLayer *vml, const gchar *dir ); +static void start_download_thread ( VikMapsLayer *vml, VikViewport *vvp, const VikCoord *ul, const VikCoord *br, gint redownload ); +static void maps_layer_add_menu_items ( VikMapsLayer *vml, GtkMenu *menu, VikLayersPanel *vlp ); +static guint map_uniq_id_to_index ( guint uniq_id ); + + +static VikLayerParamScale params_scales[] = { + /* min, max, step, digits (decimal places) */ + { 0, 255, 3, 0 }, /* alpha */ +}; + +static VikLayerParamData id_default ( void ) { return VIK_LPD_UINT ( MAP_ID_MAPBOX_OUTDOORS ); } +static VikLayerParamData directory_default ( void ) +{ + VikLayerParamData data; + VikLayerParamData *pref = a_preferences_get(VIKING_PREFERENCES_NAMESPACE "maplayer_default_dir"); + if (pref) data.s = g_strdup ( pref->s ); else data.s = ""; + return data; +} +static VikLayerParamData file_default ( void ) +{ + VikLayerParamData data; + data.s = ""; + return data; +} +static VikLayerParamData alpha_default ( void ) { return VIK_LPD_UINT ( 255 ); } +static VikLayerParamData mapzoom_default ( void ) { return VIK_LPD_UINT ( 0 ); } + +static gchar *cache_types[] = { "Viking", N_("OSM"), NULL }; +static VikMapsCacheLayout cache_layout_default_value = VIK_MAPS_CACHE_LAYOUT_VIKING; +static VikLayerParamData cache_layout_default ( void ) { return VIK_LPD_UINT ( cache_layout_default_value ); } + +VikLayerParam maps_layer_params[] = { + // NB mode => id - But can't break file format just to rename something better + { VIK_LAYER_MAPS, "mode", VIK_LAYER_PARAM_UINT, VIK_LAYER_GROUP_NONE, N_("Map Type:"), VIK_LAYER_WIDGET_COMBOBOX, NULL, NULL, NULL, id_default, NULL, NULL }, + { VIK_LAYER_MAPS, "directory", VIK_LAYER_PARAM_STRING, VIK_LAYER_GROUP_NONE, N_("Maps Directory:"), VIK_LAYER_WIDGET_FOLDERENTRY, NULL, NULL, NULL, directory_default, NULL, NULL }, + { VIK_LAYER_MAPS, "cache_type", VIK_LAYER_PARAM_UINT, VIK_LAYER_GROUP_NONE, N_("Cache Layout:"), VIK_LAYER_WIDGET_COMBOBOX, cache_types, NULL, + N_("This determines the tile storage layout on disk"), cache_layout_default, NULL, NULL }, + { VIK_LAYER_MAPS, "mapfile", VIK_LAYER_PARAM_STRING, VIK_LAYER_GROUP_NONE, N_("Map File:"), VIK_LAYER_WIDGET_FILEENTRY, GINT_TO_POINTER(VF_FILTER_MBTILES), NULL, + N_("An MBTiles file. Only applies when the map type method is 'MBTiles'"), file_default, NULL, NULL }, + { VIK_LAYER_MAPS, "alpha", VIK_LAYER_PARAM_UINT, VIK_LAYER_GROUP_NONE, N_("Alpha:"), VIK_LAYER_WIDGET_HSCALE, params_scales, NULL, + N_("Control the Alpha value for transparency effects"), alpha_default, NULL, NULL }, + { VIK_LAYER_MAPS, "autodownload", VIK_LAYER_PARAM_BOOLEAN, VIK_LAYER_GROUP_NONE, N_("Autodownload maps:"), VIK_LAYER_WIDGET_CHECKBUTTON, NULL, NULL, NULL, vik_lpd_true_default, NULL, NULL }, + { VIK_LAYER_MAPS, "adlonlymissing", VIK_LAYER_PARAM_BOOLEAN, VIK_LAYER_GROUP_NONE, N_("Autodownload Only Gets Missing Maps:"), VIK_LAYER_WIDGET_CHECKBUTTON, NULL, NULL, + N_("Using this option avoids attempting to update already acquired tiles. This can be useful if you want to restrict the network usage, without having to resort to manual control. Only applies when 'Autodownload Maps' is on."), vik_lpd_false_default, NULL, NULL }, + { VIK_LAYER_MAPS, "mapzoom", VIK_LAYER_PARAM_UINT, VIK_LAYER_GROUP_NONE, N_("Zoom Level:"), VIK_LAYER_WIDGET_COMBOBOX, params_mapzooms, NULL, + N_("Determines the method of displaying map tiles for the current zoom level. 'Viking Zoom Level' uses the best matching level, otherwise setting a fixed value will always use map tiles of the specified value regardless of the actual zoom level."), + mapzoom_default, NULL, NULL }, +}; + +enum { + PARAM_MAPTYPE=0, + PARAM_CACHE_DIR, + PARAM_CACHE_LAYOUT, + PARAM_FILE, + PARAM_ALPHA, + PARAM_AUTODOWNLOAD, + PARAM_ONLYMISSING, + PARAM_MAPZOOM, + NUM_PARAMS +}; + +void maps_layer_set_autodownload_default ( gboolean autodownload ) +{ + // Set appropriate function + if ( autodownload ) + maps_layer_params[PARAM_AUTODOWNLOAD].default_value = vik_lpd_true_default; + else + maps_layer_params[PARAM_AUTODOWNLOAD].default_value = vik_lpd_false_default; +} + +void maps_layer_set_cache_default ( VikMapsCacheLayout layout ) +{ + // Override default value returned by the default param function + cache_layout_default_value = layout; +} + +static VikToolInterface maps_tools[] = { + { &mapdl_18_pixbuf, + { "MapsDownload", "vik-icon-Maps Download", N_("_Maps Download"), NULL, N_("Maps Download"), 0 }, + (VikToolConstructorFunc) maps_layer_download_create, + NULL, + NULL, + NULL, + (VikToolMouseFunc) maps_layer_download_click, + NULL, + (VikToolMouseFunc) maps_layer_download_release, + NULL, + NULL, + FALSE, + GDK_CURSOR_IS_PIXMAP, &cursor_mapdl_pixbuf, NULL }, +}; + +VikLayerInterface vik_maps_layer_interface = { + "Map", + N_("Map"), + "M", + &vikmapslayer_pixbuf, + + maps_tools, + sizeof(maps_tools) / sizeof(maps_tools[0]), + + maps_layer_params, + NUM_PARAMS, + NULL, + 0, + + VIK_MENU_ITEM_ALL, + + (VikLayerFuncCreate) maps_layer_new, + (VikLayerFuncRealize) NULL, + (VikLayerFuncPostRead) maps_layer_post_read, + (VikLayerFuncFree) maps_layer_free, + + (VikLayerFuncProperties) NULL, + (VikLayerFuncDraw) maps_layer_draw, + (VikLayerFuncChangeCoordMode) NULL, + + (VikLayerFuncGetTimestamp) NULL, + + (VikLayerFuncSetMenuItemsSelection) NULL, + (VikLayerFuncGetMenuItemsSelection) NULL, + + (VikLayerFuncAddMenuItems) maps_layer_add_menu_items, + (VikLayerFuncSublayerAddMenuItems) NULL, + + (VikLayerFuncSublayerRenameRequest) NULL, + (VikLayerFuncSublayerToggleVisible) NULL, + (VikLayerFuncSublayerTooltip) NULL, + (VikLayerFuncLayerTooltip) maps_layer_tooltip, + (VikLayerFuncLayerSelected) NULL, + + (VikLayerFuncMarshall) maps_layer_marshall, + (VikLayerFuncUnmarshall) maps_layer_unmarshall, + + (VikLayerFuncSetParam) maps_layer_set_param, + (VikLayerFuncGetParam) maps_layer_get_param, + (VikLayerFuncChangeParam) maps_layer_change_param, + + (VikLayerFuncReadFileData) NULL, + (VikLayerFuncWriteFileData) NULL, + + (VikLayerFuncDeleteItem) NULL, + (VikLayerFuncCutItem) NULL, + (VikLayerFuncCopyItem) NULL, + (VikLayerFuncPasteItem) NULL, + (VikLayerFuncFreeCopiedItem) NULL, + (VikLayerFuncDragDropRequest) NULL, + + (VikLayerFuncSelectClick) NULL, + (VikLayerFuncSelectMove) NULL, + (VikLayerFuncSelectRelease) NULL, + (VikLayerFuncSelectedViewportMenu) NULL, +}; + +struct _VikMapsLayer { + VikLayer vl; + guint maptype; + gchar *cache_dir; + VikMapsCacheLayout cache_layout; + guint8 alpha; + guint mapzoom_id; + gdouble xmapzoom, ymapzoom; + + gboolean autodownload; + gboolean adl_only_missing; + VikCoord *last_center; + gdouble last_xmpp; + gdouble last_ympp; + + gint dl_tool_x, dl_tool_y; + + GtkMenu *dl_right_click_menu; + VikCoord redownload_ul, redownload_br; /* right click menu only */ + VikViewport *redownload_vvp; + gchar *filename; +#ifdef HAVE_SQLITE3_H + sqlite3 *mbtiles; +#endif +}; + +enum { REDOWNLOAD_NONE = 0, /* download only missing maps */ + REDOWNLOAD_BAD, /* download missing and bad maps */ + REDOWNLOAD_NEW, /* download missing maps that are newer on server only */ + REDOWNLOAD_ALL, /* download all maps */ + DOWNLOAD_OR_REFRESH }; /* download missing maps and refresh cache */ + +static VikLayerParam prefs[] = { + { VIK_LAYER_NUM_TYPES, VIKING_PREFERENCES_NAMESPACE "maplayer_default_dir", VIK_LAYER_PARAM_STRING, VIK_LAYER_GROUP_NONE, N_("Default map layer directory:"), VIK_LAYER_WIDGET_FOLDERENTRY, NULL, NULL, N_("Choose a directory to store cached Map tiles for this layer"), NULL, NULL, NULL }, +}; + +void maps_layer_init () +{ + VikLayerParamData tmp; + tmp.s = maps_layer_default_dir(); + a_preferences_register(prefs, tmp, VIKING_PREFERENCES_GROUP_KEY); + + gint max_tiles = MAX_TILES; + if ( a_settings_get_integer ( VIK_SETTINGS_MAP_MAX_TILES, &max_tiles ) ) + MAX_TILES = max_tiles; + + gdouble gdtmp; + if ( a_settings_get_double ( VIK_SETTINGS_MAP_MIN_SHRINKFACTOR, &gdtmp ) ) + MIN_SHRINKFACTOR = gdtmp; + + if ( a_settings_get_double ( VIK_SETTINGS_MAP_MAX_SHRINKFACTOR, &gdtmp ) ) + MAX_SHRINKFACTOR = gdtmp; + + if ( a_settings_get_double ( VIK_SETTINGS_MAP_REAL_MIN_SHRINKFACTOR, &gdtmp ) ) + REAL_MIN_SHRINKFACTOR = gdtmp; + + gint gitmp = 0; + if ( a_settings_get_integer ( VIK_SETTINGS_MAP_SCALE_INC_UP, &gitmp ) ) + SCALE_INC_UP = gitmp; + + if ( a_settings_get_integer ( VIK_SETTINGS_MAP_SCALE_INC_DOWN, &gitmp ) ) + SCALE_INC_DOWN = gitmp; + + gboolean gbtmp = TRUE; + if ( a_settings_get_boolean ( VIK_SETTINGS_MAP_SCALE_SMALLER_ZOOM_FIRST, &gbtmp ) ) + SCALE_SMALLER_ZOOM_FIRST = gbtmp; + +} + +/****************************************/ +/******** MAPS LAYER TYPES **************/ +/****************************************/ + +void _add_map_source ( guint16 id, const char *label, VikMapSource *map ) +{ + gsize len = 0; + if (params_maptypes) + len = g_strv_length (params_maptypes); + /* Add the label */ + params_maptypes = g_realloc (params_maptypes, (len+2)*sizeof(gchar*)); + params_maptypes[len] = g_strdup (label); + params_maptypes[len+1] = NULL; + + /* Add the id */ + params_maptypes_ids = g_realloc (params_maptypes_ids, (len+2)*sizeof(guint)); + params_maptypes_ids[len] = id; + params_maptypes_ids[len+1] = 0; + + /* We have to clone */ + VikMapSource *clone = VIK_MAP_SOURCE(g_object_ref(map)); + /* Register the clone in the list */ + __map_types = g_list_append(__map_types, clone); + + /* Hack + We have to ensure the mode LayerParam references the up-to-date + GLists. + */ + /* + memcpy(&maps_layer_params[0].widget_data, ¶ms_maptypes, sizeof(gpointer)); + memcpy(&maps_layer_params[0].extra_widget_data, ¶ms_maptypes_ids, sizeof(gpointer)); + */ + maps_layer_params[0].widget_data = params_maptypes; + maps_layer_params[0].extra_widget_data = params_maptypes_ids; +} + +void _update_map_source ( const char *label, VikMapSource *map, int index ) +{ + GList *item = g_list_nth (__map_types, index); + g_object_unref (item->data); + item->data = g_object_ref (map); + /* Change previous data */ + g_free (params_maptypes[index]); + params_maptypes[index] = g_strdup (label); +} + +/** + * maps_layer_register_map_source: + * @map: the new VikMapSource + * + * Register a new VikMapSource. + * Override existing one (equality of id). + */ +void maps_layer_register_map_source ( VikMapSource *map ) +{ + g_assert(map != NULL); + + guint16 id = vik_map_source_get_uniq_id(map); + const char *label = vik_map_source_get_label(map); + g_assert(label != NULL); + + int previous = map_uniq_id_to_index (id); + if (previous != NUM_MAP_TYPES) + { + _update_map_source (label, map, previous); + } + else + { + _add_map_source (id, label, map); + } +} + +#define MAPS_LAYER_NTH_LABEL(n) (params_maptypes[n]) +#define MAPS_LAYER_NTH_ID(n) (params_maptypes_ids[n]) +#define MAPS_LAYER_NTH_TYPE(n) (VIK_MAP_SOURCE(g_list_nth_data(__map_types, (n)))) + +/** + * vik_maps_layer_get_map_type: + * + * Returns the actual map id (rather than the internal type index value) + */ +guint vik_maps_layer_get_map_type(VikMapsLayer *vml) +{ + return MAPS_LAYER_NTH_ID(vml->maptype); +} + +/** + * vik_maps_layer_set_map_type: + * + */ +void vik_maps_layer_set_map_type(VikMapsLayer *vml, guint map_type) +{ + gint maptype = map_uniq_id_to_index(map_type); + if ( maptype == NUM_MAP_TYPES ) + g_warning(_("Unknown map type")); + else + vml->maptype = maptype; +} + +/** + * vik_maps_layer_get_default_map_type: + * + */ +guint vik_maps_layer_get_default_map_type () +{ + VikLayerInterface *vli = vik_layer_get_interface ( VIK_LAYER_MAPS ); + VikLayerParamData vlpd = a_layer_defaults_get ( vli->fixed_layer_name, "mode", VIK_LAYER_PARAM_UINT ); + if ( vlpd.u == 0 ) + vlpd = id_default(); + return vlpd.u; +} + +gchar *vik_maps_layer_get_map_label(VikMapsLayer *vml) +{ + return(g_strdup(MAPS_LAYER_NTH_LABEL(vml->maptype))); +} + +/****************************************/ +/******** CACHE DIR STUFF ***************/ +/****************************************/ + +#define DIRECTDIRACCESS "%s%d" G_DIR_SEPARATOR_S "%d" G_DIR_SEPARATOR_S "%d%s" +#define DIRECTDIRACCESS_WITH_NAME "%s%s" G_DIR_SEPARATOR_S "%d" G_DIR_SEPARATOR_S "%d" G_DIR_SEPARATOR_S "%d%s" +#define DIRSTRUCTURE "%st%ds%dz%d" G_DIR_SEPARATOR_S "%d" G_DIR_SEPARATOR_S "%d" +#define MAPS_CACHE_DIR maps_layer_default_dir() + +#ifdef WINDOWS +#include +#define GLOBAL_MAPS_DIR "C:\\VIKING-MAPS\\" +#define LOCAL_MAPS_DIR "VIKING-MAPS" +#elif defined __APPLE__ +#include +#define GLOBAL_MAPS_DIR "/Library/cache/Viking/maps/" +#define LOCAL_MAPS_DIR "/Library/Application Support/Viking/viking-maps" +#else /* POSIX */ +#include +#define GLOBAL_MAPS_DIR "/var/cache/maps/" +#define LOCAL_MAPS_DIR ".viking-maps" +#endif + +gchar *maps_layer_default_dir () +{ + static gchar *defaultdir = NULL; + if ( ! defaultdir ) + { + /* Thanks to Mike Davison for the $VIKING_MAPS usage */ + const gchar *mapdir = g_getenv("VIKING_MAPS"); + if ( mapdir ) { + defaultdir = g_strdup ( mapdir ); + } else if ( g_access ( GLOBAL_MAPS_DIR, W_OK ) == 0 ) { + defaultdir = g_strdup ( GLOBAL_MAPS_DIR ); + } else { + const gchar *home = g_get_home_dir(); + if (!home || g_access(home, W_OK)) + home = g_get_home_dir (); + if ( home ) + defaultdir = g_build_filename ( home, LOCAL_MAPS_DIR, NULL ); + else + defaultdir = g_strdup ( LOCAL_MAPS_DIR ); + } + if (defaultdir && (defaultdir[strlen(defaultdir)-1] != G_DIR_SEPARATOR)) + { + /* Add the separator at the end */ + gchar *tmp = defaultdir; + defaultdir = g_strconcat(tmp, G_DIR_SEPARATOR_S, NULL); + g_free(tmp); + } + g_debug("%s: defaultdir=%s", __FUNCTION__, defaultdir); + } + return defaultdir; +} + +static void maps_layer_mkdir_if_default_dir ( VikMapsLayer *vml ) +{ + if ( vml->cache_dir && strcmp ( vml->cache_dir, MAPS_CACHE_DIR ) == 0 && g_file_test ( vml->cache_dir, G_FILE_TEST_EXISTS ) == FALSE ) + { + if ( g_mkdir ( vml->cache_dir, 0777 ) != 0 ) + g_warning ( "%s: Failed to create directory %s", __FUNCTION__, vml->cache_dir ); + } +} + +static void maps_layer_set_cache_dir ( VikMapsLayer *vml, const gchar *dir ) +{ + g_assert ( vml != NULL); + g_free ( vml->cache_dir ); + vml->cache_dir = NULL; + const gchar *mydir = dir; + + if ( dir == NULL || dir[0] == '\0' ) + { + if ( a_preferences_get(VIKING_PREFERENCES_NAMESPACE "maplayer_default_dir") ) + mydir = a_preferences_get(VIKING_PREFERENCES_NAMESPACE "maplayer_default_dir")->s; + } + + gchar *canonical_dir = vu_get_canonical_filename ( VIK_LAYER(vml), mydir ); + + // Ensure cache_dir always ends with a separator + guint len = strlen(canonical_dir); + // Unless the dir is not valid + if ( len > 0 ) + { + if ( canonical_dir[len-1] != G_DIR_SEPARATOR ) + { + vml->cache_dir = g_strconcat ( canonical_dir, G_DIR_SEPARATOR_S, NULL ); + g_free ( canonical_dir ); + } + else { + vml->cache_dir = canonical_dir; + } + + maps_layer_mkdir_if_default_dir ( vml ); + } +} + +static void maps_layer_set_file ( VikMapsLayer *vml, const gchar *name ) +{ + if ( vml->filename ) + g_free (vml->filename); + vml->filename = g_strdup (name); +} + +/****************************************/ +/******** GOBJECT STUFF *****************/ +/****************************************/ + +GType vik_maps_layer_get_type () +{ + static GType vml_type = 0; + + if (!vml_type) + { + static const GTypeInfo vml_info = + { + sizeof (VikMapsLayerClass), + NULL, /* base_init */ + NULL, /* base_finalize */ + NULL, /* class init */ + NULL, /* class_finalize */ + NULL, /* class_data */ + sizeof (VikMapsLayer), + 0, + NULL /* instance init */ + }; + vml_type = g_type_register_static ( VIK_LAYER_TYPE, "VikMapsLayer", &vml_info, 0 ); + } + + return vml_type; +} + +/****************************************/ +/************** PARAMETERS **************/ +/****************************************/ + +static guint map_index_to_uniq_id (guint16 index) +{ + g_assert ( index < NUM_MAP_TYPES ); + return vik_map_source_get_uniq_id(MAPS_LAYER_NTH_TYPE(index)); +} + +static guint map_uniq_id_to_index ( guint uniq_id ) +{ + gint i; + for ( i = 0; i < NUM_MAP_TYPES; i++ ) + if ( vik_map_source_get_uniq_id(MAPS_LAYER_NTH_TYPE(i)) == uniq_id ) + return i; + return NUM_MAP_TYPES; /* no such thing */ +} + +#define VIK_SETTINGS_MAP_LICENSE_SHOWN "map_license_shown" + +/** + * Convenience function to display the license + */ +static void maps_show_license ( GtkWindow *parent, VikMapSource *map ) +{ + a_dialog_license ( parent, + vik_map_source_get_label (map), + vik_map_source_get_license (map), + vik_map_source_get_license_url (map) ); +} + +static gboolean maps_layer_set_param ( VikMapsLayer *vml, VikLayerSetParam *vlsp ) +{ + switch ( vlsp->id ) + { + case PARAM_CACHE_DIR: maps_layer_set_cache_dir ( vml, vlsp->data.s ); break; + case PARAM_CACHE_LAYOUT: if ( vlsp->data.u < VIK_MAPS_CACHE_LAYOUT_NUM ) vml->cache_layout = vlsp->data.u; break; + case PARAM_FILE: maps_layer_set_file ( vml, vlsp->data.s ); break; + case PARAM_MAPTYPE: { + gint maptype = map_uniq_id_to_index(vlsp->data.u); + if ( maptype == NUM_MAP_TYPES ) + g_warning(_("Unknown map type")); + else { + vml->maptype = maptype; + + // When loading from a file don't need the license reminder - ensure it's saved into the 'seen' list + if ( vlsp->is_file_operation ) { + a_settings_set_integer_list_containing ( VIK_SETTINGS_MAP_LICENSE_SHOWN, vlsp->data.u ); + } + else { + VikMapSource *map = MAPS_LAYER_NTH_TYPE(vml->maptype); + if (vik_map_source_get_license (map) != NULL) { + // Check if licence for this map type has been shown before + if ( ! a_settings_get_integer_list_contains ( VIK_SETTINGS_MAP_LICENSE_SHOWN, vlsp->data.u ) ) { + if ( vlsp->vp ) + maps_show_license ( VIK_GTK_WINDOW_FROM_WIDGET(vlsp->vp), map ); + a_settings_set_integer_list_containing ( VIK_SETTINGS_MAP_LICENSE_SHOWN, vlsp->data.u ); + } + } + } + } + break; + } + case PARAM_ALPHA: if ( vlsp->data.u <= 255 ) vml->alpha = vlsp->data.u; break; + case PARAM_AUTODOWNLOAD: vml->autodownload = vlsp->data.b; break; + case PARAM_ONLYMISSING: vml->adl_only_missing = vlsp->data.b; break; + case PARAM_MAPZOOM: + if ( vlsp->data.u < NUM_MAPZOOMS ) { + vml->mapzoom_id = vlsp->data.u; + vml->xmapzoom = __mapzooms_x [vlsp->data.u]; + vml->ymapzoom = __mapzooms_y [vlsp->data.u]; + } else + g_warning (_("Unknown Map Zoom")); + break; + default: break; + } + return TRUE; +} + +static VikLayerParamData maps_layer_get_param ( VikMapsLayer *vml, guint16 id, gboolean is_file_operation ) +{ + VikLayerParamData rv; + switch ( id ) + { + case PARAM_CACHE_DIR: + { + gboolean set = FALSE; + /* Only save a blank when the map cache location equals the default + On reading in, when it is blank then the default is reconstructed + Since the default changes dependent on the user and OS, it means the resultant file is more portable */ + if ( is_file_operation && vml->cache_dir && strcmp ( vml->cache_dir, MAPS_CACHE_DIR ) == 0 ) { + rv.s = ""; + set = TRUE; + } + else if ( is_file_operation && vml->cache_dir ) { + if ( a_vik_get_file_ref_format() == VIK_FILE_REF_FORMAT_RELATIVE ) { + gchar *cwd = g_get_current_dir(); + if ( cwd ) { + rv.s = file_GetRelativeFilename ( cwd, vml->cache_dir ); + if ( !rv.s ) rv.s = ""; + set = TRUE; + } + } + } + if ( !set ) + rv.s = vml->cache_dir ? vml->cache_dir : ""; + break; + } + case PARAM_CACHE_LAYOUT: rv.u = vml->cache_layout; break; + case PARAM_FILE: rv.s = vml->filename; break; + case PARAM_MAPTYPE: rv.u = map_index_to_uniq_id ( vml->maptype ); break; + case PARAM_ALPHA: rv.u = vml->alpha; break; + case PARAM_AUTODOWNLOAD: rv.u = vml->autodownload; break; + case PARAM_ONLYMISSING: rv.u = vml->adl_only_missing; break; + case PARAM_MAPZOOM: rv.u = vml->mapzoom_id; break; + default: break; + } + return rv; +} + +static void maps_layer_change_param ( GtkWidget *widget, ui_change_values values ) +{ + switch ( GPOINTER_TO_INT(values[UI_CHG_PARAM_ID]) ) { + // Alter sensitivity of download option widgets according to the maptype setting. + case PARAM_MAPTYPE: { + // Get new value + VikLayerParamData vlpd = a_uibuilder_widget_get_value ( widget, values[UI_CHG_PARAM] ); + // Is it *not* the OSM On Disk Tile Layout or the MBTiles type or the OSM Metatiles type + gboolean sensitive = ( MAP_ID_OSM_ON_DISK != vlpd.u && + MAP_ID_MBTILES != vlpd.u && + MAP_ID_OSM_METATILES != vlpd.u ); + GtkWidget **ww1 = values[UI_CHG_WIDGETS]; + GtkWidget **ww2 = values[UI_CHG_LABELS]; + GtkWidget *w1 = ww1[PARAM_ONLYMISSING]; + GtkWidget *w2 = ww2[PARAM_ONLYMISSING]; + GtkWidget *w3 = ww1[PARAM_AUTODOWNLOAD]; + GtkWidget *w4 = ww2[PARAM_AUTODOWNLOAD]; + // Depends on autodownload value + gboolean missing_sense = sensitive && VIK_MAPS_LAYER(values[UI_CHG_LAYER])->autodownload; + if ( w1 ) gtk_widget_set_sensitive ( w1, missing_sense ); + if ( w2 ) gtk_widget_set_sensitive ( w2, missing_sense ); + if ( w3 ) gtk_widget_set_sensitive ( w3, sensitive ); + if ( w4 ) gtk_widget_set_sensitive ( w4, sensitive ); + + // Cache type not applicable either + GtkWidget *w9 = ww1[PARAM_CACHE_LAYOUT]; + GtkWidget *w10 = ww2[PARAM_CACHE_LAYOUT]; + if ( w9 ) gtk_widget_set_sensitive ( w9, sensitive ); + if ( w10 ) gtk_widget_set_sensitive ( w10, sensitive ); + + // File only applicable for MBTiles type + // Directory for all other types + sensitive = ( MAP_ID_MBTILES == vlpd.u); + GtkWidget *w5 = ww1[PARAM_FILE]; + GtkWidget *w6 = ww2[PARAM_FILE]; + GtkWidget *w7 = ww1[PARAM_CACHE_DIR]; + GtkWidget *w8 = ww2[PARAM_CACHE_DIR]; + if ( w5 ) gtk_widget_set_sensitive ( w5, sensitive ); + if ( w6 ) gtk_widget_set_sensitive ( w6, sensitive ); + if ( w7 ) gtk_widget_set_sensitive ( w7, !sensitive ); + if ( w8 ) gtk_widget_set_sensitive ( w8, !sensitive ); + + break; + } + + // Alter sensitivity of 'download only missing' widgets according to the autodownload setting. + case PARAM_AUTODOWNLOAD: { + // Get new value + VikLayerParamData vlpd = a_uibuilder_widget_get_value ( widget, values[UI_CHG_PARAM] ); + GtkWidget **ww1 = values[UI_CHG_WIDGETS]; + GtkWidget **ww2 = values[UI_CHG_LABELS]; + GtkWidget *w1 = ww1[PARAM_ONLYMISSING]; + GtkWidget *w2 = ww2[PARAM_ONLYMISSING]; + if ( w1 ) gtk_widget_set_sensitive ( w1, vlpd.b ); + if ( w2 ) gtk_widget_set_sensitive ( w2, vlpd.b ); + break; + } + default: break; + } +} + +/****************************************/ +/****** CREATING, COPYING, FREEING ******/ +/****************************************/ + +static VikMapsLayer *maps_layer_new ( VikViewport *vvp ) +{ + VikMapsLayer *vml = VIK_MAPS_LAYER ( g_object_new ( VIK_MAPS_LAYER_TYPE, NULL ) ); + vik_layer_set_type ( VIK_LAYER(vml), VIK_LAYER_MAPS ); + + vml->filename = NULL; + vik_layer_set_defaults ( VIK_LAYER(vml), vvp ); + + vml->dl_tool_x = vml->dl_tool_y = -1; + vml->last_center = NULL; + vml->last_xmpp = 0.0; + vml->last_ympp = 0.0; + + vml->dl_right_click_menu = NULL; + return vml; +} + +static void maps_layer_free ( VikMapsLayer *vml ) +{ + g_free ( vml->cache_dir ); + vml->cache_dir = NULL; + if ( vml->dl_right_click_menu ) + g_object_ref_sink ( G_OBJECT(vml->dl_right_click_menu) ); + g_free(vml->last_center); + vml->last_center = NULL; + g_free ( vml->filename ); + vml->filename = NULL; + +#ifdef HAVE_SQLITE3_H + VikMapSource *map = MAPS_LAYER_NTH_TYPE(vml->maptype); + if ( vik_map_source_is_mbtiles ( map ) ) { + if ( vml->mbtiles ) { + int ans = sqlite3_close ( vml->mbtiles ); + if ( ans != SQLITE_OK ) { + // Only to console for information purposes only + g_warning ( "SQL Close problem: %d", ans ); + } + } + } +#endif +} + +static void maps_layer_mbtiles_open ( VikMapsLayer *vml, VikViewport *vp, VikMapSource *map ) +{ +#ifdef HAVE_SQLITE3_H + // Do some SQL stuff + if ( vik_map_source_is_mbtiles ( map ) ) { + int ans = sqlite3_open_v2 ( vml->filename, + &(vml->mbtiles), + SQLITE_OPEN_READONLY, + NULL ); + if ( ans != SQLITE_OK ) { + // That didn't work, so here's why: + g_warning ( "%s: %s", __FUNCTION__, sqlite3_errmsg ( vml->mbtiles ) ); + + a_dialog_error_msg_extra ( VIK_GTK_WINDOW_FROM_WIDGET(vp), + _("Failed to open MBTiles file: %s"), + vml->filename ); + vml->mbtiles = NULL; + } + } +#endif +} + +static void maps_layer_post_read (VikLayer *vl, VikViewport *vp, gboolean from_file) +{ + VikMapsLayer *vml = VIK_MAPS_LAYER(vl); + VikMapSource *map = MAPS_LAYER_NTH_TYPE(vml->maptype); + + if (!from_file) + { + /* If this method is not called in file reading context + * it is called in GUI context. + * So, we can check if we have to inform the user about inconsistency */ + VikViewportDrawMode vp_drawmode; + vp_drawmode = vik_viewport_get_drawmode ( vp ); + + if (vik_map_source_get_drawmode(map) != vp_drawmode) { + const gchar *drawmode_name = vik_viewport_get_drawmode_name (vp, vik_map_source_get_drawmode(map)); + gchar *msg = g_strdup_printf(_("New map cannot be displayed in the current drawmode.\nSelect \"%s\" from View menu to view it."), drawmode_name); + a_dialog_warning_msg ( VIK_GTK_WINDOW_FROM_WIDGET(vp), msg ); + g_free(msg); + } + } + + // Performed in post read as we now know the map type + maps_layer_mbtiles_open ( vml, vp, map ); + + // If the on Disk OSM Tile Layout type + if ( vik_map_source_get_uniq_id(map) == MAP_ID_OSM_ON_DISK ) { + // Copy the directory into filename + // thus the mapcache look up will be unique when using more than one of these map types + g_free ( vml->filename ); + vml->filename = g_strdup (vml->cache_dir); + } +} + +static const gchar* maps_layer_tooltip ( VikMapsLayer *vml ) +{ + return vik_maps_layer_get_map_label ( vml ); +} + +static void maps_layer_marshall( VikMapsLayer *vml, guint8 **data, guint *len ) +{ + vik_layer_marshall_params ( VIK_LAYER(vml), data, len ); +} + +static VikMapsLayer *maps_layer_unmarshall( guint8 *data, guint len, VikViewport *vvp ) +{ + VikMapsLayer *rv = maps_layer_new ( vvp ); + vik_layer_unmarshall_params ( VIK_LAYER(rv), data, len, vvp ); + maps_layer_post_read ( VIK_LAYER(rv), vvp, FALSE ); + return rv; +} + +/*********************/ +/****** DRAWING ******/ +/*********************/ + +static GdkPixbuf *pixbuf_shrink ( GdkPixbuf *pixbuf, gdouble xshrinkfactor, gdouble yshrinkfactor ) +{ + GdkPixbuf *tmp; + guint16 width = gdk_pixbuf_get_width(pixbuf), height = gdk_pixbuf_get_height(pixbuf); + tmp = gdk_pixbuf_scale_simple(pixbuf, ceil(width * xshrinkfactor), ceil(height * yshrinkfactor), GDK_INTERP_BILINEAR); + g_object_unref ( G_OBJECT(pixbuf) ); + return tmp; +} + +#ifdef HAVE_SQLITE3_H +/* +static int sql_select_tile_dump_cb (void *data, int cols, char **fields, char **col_names ) +{ + g_warning ( "Found %d columns", cols ); + int i; + for ( i = 0; i < cols; i++ ) { + g_warning ( "SQL processing %s = %s", col_names[i], fields[i] ); + } + return 0; +} +*/ + +/** + * + */ +static GdkPixbuf *get_pixbuf_sql_exec ( sqlite3 *sql, gint xx, gint yy, gint zoom ) +{ + GdkPixbuf *pixbuf = NULL; + + // MBTiles stored internally with the flipping y thingy (i.e. TMS scheme). + gint flip_y = (gint) pow(2, zoom)-1 - yy; + gchar *statement = g_strdup_printf ( "SELECT tile_data FROM tiles WHERE zoom_level=%d AND tile_column=%d AND tile_row=%d;", zoom, xx, flip_y ); + + gboolean finished = FALSE; + + sqlite3_stmt *sql_stmt = NULL; + int ans = sqlite3_prepare_v2 ( sql, statement, -1, &sql_stmt, NULL ); + if ( ans != SQLITE_OK ) { + g_warning ( "%s: %s - %d: %s", __FUNCTION__, "prepare failure", ans, statement ); + finished = TRUE; + } + + while ( !finished ) { + ans = sqlite3_step ( sql_stmt ); + switch (ans) { + case SQLITE_ROW: { + // Get tile_data blob + int count = sqlite3_column_count(sql_stmt); + if ( count != 1 ) { + g_warning ( "%s: %s - %d", __FUNCTION__, "count not one", count ); + finished = TRUE; + } + else { + const void *data = sqlite3_column_blob ( sql_stmt, 0 ); + int bytes = sqlite3_column_bytes ( sql_stmt, 0 ); + if ( bytes < 1 ) { + g_warning ( "%s: %s (%d)", __FUNCTION__, "not enough bytes", bytes ); + finished = TRUE; + } + else { + // Convert these blob bytes into a pixbuf via these streaming operations + GInputStream *stream = g_memory_input_stream_new_from_data ( data, bytes, NULL ); + GError *error = NULL; + pixbuf = gdk_pixbuf_new_from_stream ( stream, NULL, &error ); + if ( error ) { + g_warning ( "%s: %s", __FUNCTION__, error->message ); + g_error_free ( error ); + } + g_input_stream_close ( stream, NULL, NULL ); + } + } + break; + } + default: + // e.g. SQLITE_DONE | SQLITE_ERROR | SQLITE_MISUSE | etc... + // Finished normally + // and give up on any errors + if ( ans != SQLITE_DONE ) + g_warning ( "%s: %s - %d", __FUNCTION__, "step issue", ans ); + finished = TRUE; + break; + } + } + (void)sqlite3_finalize ( sql_stmt ); + + g_free ( statement ); + + return pixbuf; +} +#endif + +static GdkPixbuf *get_mbtiles_pixbuf ( VikMapsLayer *vml, gint xx, gint yy, gint zoom ) +{ + GdkPixbuf *pixbuf = NULL; + +#ifdef HAVE_SQLITE3_H + if ( vml->mbtiles ) { + /* + gchar *statement = g_strdup_printf ( "SELECT name FROM sqlite_master WHERE type='table';" ); + char *errMsg = NULL; + int ans = sqlite3_exec ( vml->mbtiles, statement, sql_select_tile_dump_cb, pixbuf, &errMsg ); + if ( ans != SQLITE_OK ) { + // Only to console for information purposes only + g_warning ( "SQL problem: %d for %s - error: %s", ans, statement, errMsg ); + sqlite3_free( errMsg ); + } + g_free ( statement ); + */ + + // Reading BLOBS is a bit more involved and so can't use the simpler sqlite3_exec () + // Hence this specific function + pixbuf = get_pixbuf_sql_exec ( vml->mbtiles, xx, yy, zoom ); + } +#endif + + return pixbuf; +} + +static GdkPixbuf *get_pixbuf_from_metatile ( VikMapsLayer *vml, gint xx, gint yy, gint zz ) +{ + const int tile_max = METATILE_MAX_SIZE; + char err_msg[PATH_MAX]; + char *buf; + int len; + int compressed; + + buf = g_malloc(tile_max); + if (!buf) { + return NULL; + } + + err_msg[0] = 0; + len = metatile_read(vml->cache_dir, xx, yy, zz, buf, tile_max, &compressed, err_msg); + + if (len > 0) { + if (compressed) { + // Not handled yet - I don't think this is used often - so implement later if necessary + g_warning ( "Compressed metatiles not implemented:%s\n", __FUNCTION__); + g_free(buf); + return NULL; + } + + // Convert these buf bytes into a pixbuf via these streaming operations + GdkPixbuf *pixbuf = NULL; + + GInputStream *stream = g_memory_input_stream_new_from_data ( buf, len, NULL ); + GError *error = NULL; + pixbuf = gdk_pixbuf_new_from_stream ( stream, NULL, &error ); + if (error) { + g_warning ( "%s: %s", __FUNCTION__, error->message ); + g_error_free ( error ); + } + g_input_stream_close ( stream, NULL, NULL ); + + g_free(buf); + return pixbuf; + } + else { + g_free(buf); + g_warning ( "FAILED:%s %s", __FUNCTION__, err_msg); + return NULL; + } +} + +/** + * Caller has to decrease reference counter of returned + * GdkPixbuf, when buffer is no longer needed. + */ +static GdkPixbuf *pixbuf_apply_settings ( GdkPixbuf *pixbuf, VikMapsLayer *vml, guint vp_scale, + MapCoord *mapcoord, gdouble xshrinkfactor, gdouble yshrinkfactor ) +{ + VikMapSource *map = MAPS_LAYER_NTH_TYPE(vml->maptype); + // Apply alpha setting + if ( pixbuf && vml->alpha < 255 ) + pixbuf = ui_pixbuf_set_alpha ( pixbuf, vml->alpha ); + + if ( pixbuf && ( xshrinkfactor != 1.0 || yshrinkfactor != 1.0 ) ) + pixbuf = pixbuf_shrink ( pixbuf, xshrinkfactor, yshrinkfactor ); + + // TODO reconsider combining with shrinkfactors above... + if ( pixbuf && ( vp_scale != 1 || vik_map_source_get_scale(map) != 1 ) ) { + gdouble xscale = vp_scale; + gdouble yscale = vp_scale; + if ( vik_map_source_get_scale(map) != 0.0 ) { + xscale = vp_scale / vik_map_source_get_scale(map); + yscale = vp_scale / vik_map_source_get_scale(map); + } + pixbuf = pixbuf_shrink ( pixbuf, xscale, yscale ); + } + + if ( pixbuf ) + a_mapcache_add ( pixbuf, (mapcache_extra_t) {0.0}, mapcoord->x, mapcoord->y, + mapcoord->z, vik_map_source_get_uniq_id(map), + mapcoord->scale, vml->alpha, xshrinkfactor, yshrinkfactor, vml->filename ); + + return pixbuf; +} + +static void get_filename ( const gchar *cache_dir, + VikMapsCacheLayout cl, + guint16 id, + const gchar *name, + gint scale, + gint z, + gint x, + gint y, + gchar *filename_buf, + gint buf_len, + const gchar* file_extension ) +{ + switch ( cl ) { + case VIK_MAPS_CACHE_LAYOUT_OSM: + if ( name ) { + if ( g_strcmp0 ( cache_dir, MAPS_CACHE_DIR ) ) + // Cache dir not the default - assume it's been directed somewhere specific + g_snprintf ( filename_buf, buf_len, DIRECTDIRACCESS, cache_dir, (17 - scale), x, y, file_extension ); + else + // Using default cache - so use the map name in the directory path + g_snprintf ( filename_buf, buf_len, DIRECTDIRACCESS_WITH_NAME, cache_dir, name, (17 - scale), x, y, file_extension ); + } + else + g_snprintf ( filename_buf, buf_len, DIRECTDIRACCESS, cache_dir, (17 - scale), x, y, file_extension ); + break; + default: + g_snprintf ( filename_buf, buf_len, DIRSTRUCTURE, cache_dir, id, scale, z, x, y ); + break; + } +} + +/** + * Caller has to decrease reference counter of returned + * GdkPixbuf, when buffer is no longer needed. + */ +static GdkPixbuf *get_pixbuf ( VikMapsLayer *vml, guint16 id, guint vp_scale, const gchar* mapname, MapCoord *mapcoord, + gchar *filename_buf, gint buf_len, gdouble xshrinkfactor, gdouble yshrinkfactor ) +{ + GdkPixbuf *pixbuf; + + /* get the thing */ + pixbuf = a_mapcache_get ( mapcoord->x, mapcoord->y, mapcoord->z, + id, mapcoord->scale, vml->alpha, xshrinkfactor, yshrinkfactor, vml->filename ); + + if ( ! pixbuf ) { + VikMapSource *map = MAPS_LAYER_NTH_TYPE(vml->maptype); + if ( vik_map_source_is_direct_file_access(map) ) { + // ATM MBTiles must be 'a direct access type' + if ( vik_map_source_is_mbtiles(map) ) { + pixbuf = get_mbtiles_pixbuf ( vml, mapcoord->x, mapcoord->y, (17 - mapcoord->scale) ); + pixbuf = pixbuf_apply_settings ( pixbuf, vml, vp_scale, mapcoord, xshrinkfactor, yshrinkfactor ); + // return now to avoid file tests that aren't appropriate for this map type + return pixbuf; + } + else if ( vik_map_source_is_osm_meta_tiles(map) ) { + pixbuf = get_pixbuf_from_metatile ( vml, mapcoord->x, mapcoord->y, (17 - mapcoord->scale) ); + pixbuf = pixbuf_apply_settings ( pixbuf, vml, vp_scale, mapcoord, xshrinkfactor, yshrinkfactor ); + return pixbuf; + } + else + get_filename ( vml->cache_dir, VIK_MAPS_CACHE_LAYOUT_OSM, id, NULL, + mapcoord->scale, mapcoord->z, mapcoord->x, mapcoord->y, filename_buf, buf_len, + vik_map_source_get_file_extension(map) ); + } + else + get_filename ( vml->cache_dir, vml->cache_layout, id, mapname, + mapcoord->scale, mapcoord->z, mapcoord->x, mapcoord->y, filename_buf, buf_len, + vik_map_source_get_file_extension(map) ); + + if ( g_file_test ( filename_buf, G_FILE_TEST_EXISTS ) == TRUE) + { + GError *gx = NULL; + pixbuf = gdk_pixbuf_new_from_file ( filename_buf, &gx ); + + /* free the pixbuf on error */ + if (gx) + { + if ( gx->domain != GDK_PIXBUF_ERROR || gx->code != GDK_PIXBUF_ERROR_CORRUPT_IMAGE ) { + // Report a warning + if ( IS_VIK_WINDOW ((VikWindow*)VIK_GTK_WINDOW_FROM_LAYER(vml)) ) { + gchar* msg = g_strdup_printf ( _("Couldn't open image file: %s"), gx->message ); + vik_window_statusbar_update ( (VikWindow*)VIK_GTK_WINDOW_FROM_LAYER(vml), msg, VIK_STATUSBAR_INFO ); + g_free (msg); + } + } + + g_error_free ( gx ); + if ( pixbuf ) + g_object_unref ( G_OBJECT(pixbuf) ); + pixbuf = NULL; + } else { + pixbuf = pixbuf_apply_settings ( pixbuf, vml, vp_scale, mapcoord, xshrinkfactor, yshrinkfactor ); + } + } + } + return pixbuf; +} + +static gboolean should_start_autodownload(VikMapsLayer *vml, VikViewport *vvp) +{ + const VikCoord *center = vik_viewport_get_center ( vvp ); + + if (vik_window_get_pan_move (VIK_WINDOW(VIK_GTK_WINDOW_FROM_WIDGET(GTK_WIDGET(vvp))))) + /* D'n'D pan in action: do not download */ + return FALSE; + + // Don't attempt to download unsupported zoom levels + gdouble xzoom = vik_viewport_get_xmpp ( vvp ); + VikMapSource *map = MAPS_LAYER_NTH_TYPE(vml->maptype); + guint8 zl = map_utils_mpp_to_zoom_level ( xzoom ); + if ( zl < vik_map_source_get_zoom_min(map) || zl > vik_map_source_get_zoom_max(map) ) + return FALSE; + + if (vml->last_center == NULL) { + VikCoord *new_center = g_malloc(sizeof(VikCoord)); + *new_center = *center; + vml->last_center = new_center; + vml->last_xmpp = vik_viewport_get_xmpp(vvp); + vml->last_ympp = vik_viewport_get_ympp(vvp); + return TRUE; + } + + /* TODO: perhaps vik_coord_diff() */ + if (vik_coord_equals(vml->last_center, center) + && (vml->last_xmpp == vik_viewport_get_xmpp(vvp)) + && (vml->last_ympp == vik_viewport_get_ympp(vvp))) + return FALSE; + + *(vml->last_center) = *center; + vml->last_xmpp = vik_viewport_get_xmpp(vvp); + vml->last_ympp = vik_viewport_get_ympp(vvp); + return TRUE; +} + +/** + * + */ +gboolean try_draw_scale_down (VikMapsLayer *vml, VikViewport *vvp, guint vp_scale, MapCoord ulm, gint xx, gint yy, gint tilesize_x_ceil, gint tilesize_y_ceil, + gdouble xshrinkfactor, gdouble yshrinkfactor, guint id, const gchar *mapname, gchar *path_buf, guint max_path_len) +{ + GdkPixbuf *pixbuf; + int scale_inc; + for (scale_inc = 1; scale_inc <= SCALE_INC_DOWN; scale_inc++) { + // Try with smaller zooms + int scale_factor = 1 << scale_inc; /* 2^scale_inc */ + MapCoord ulm2 = ulm; + ulm2.x = ulm.x / scale_factor; + ulm2.y = ulm.y / scale_factor; + ulm2.scale = ulm.scale + scale_inc; + pixbuf = get_pixbuf ( vml, id, vp_scale, mapname, &ulm2, path_buf, max_path_len, xshrinkfactor * scale_factor, yshrinkfactor * scale_factor ); + if ( pixbuf ) { + gint src_x = (ulm.x % scale_factor) * tilesize_x_ceil; + gint src_y = (ulm.y % scale_factor) * tilesize_y_ceil; + vik_viewport_draw_pixbuf ( vvp, pixbuf, src_x, src_y, xx, yy, tilesize_x_ceil, tilesize_y_ceil ); + g_object_unref(pixbuf); + return TRUE; + } + } + return FALSE; +} + +/** + * + */ +gboolean try_draw_scale_up (VikMapsLayer *vml, VikViewport *vvp, guint vp_scale, MapCoord ulm, gint xx, gint yy, gint tilesize_x_ceil, gint tilesize_y_ceil, + gdouble xshrinkfactor, gdouble yshrinkfactor, guint id, const gchar *mapname, gchar *path_buf, guint max_path_len) +{ + GdkPixbuf *pixbuf; + // Try with bigger zooms + int scale_dec; + for (scale_dec = 1; scale_dec <= SCALE_INC_UP; scale_dec++) { + int pict_x, pict_y; + int scale_factor = 1 << scale_dec; /* 2^scale_dec */ + MapCoord ulm2 = ulm; + ulm2.x = ulm.x * scale_factor; + ulm2.y = ulm.y * scale_factor; + ulm2.scale = ulm.scale - scale_dec; + for (pict_x = 0; pict_x < scale_factor; pict_x ++) { + for (pict_y = 0; pict_y < scale_factor; pict_y ++) { + MapCoord ulm3 = ulm2; + ulm3.x += pict_x; + ulm3.y += pict_y; + pixbuf = get_pixbuf ( vml, id, vp_scale, mapname, &ulm3, path_buf, max_path_len, xshrinkfactor / scale_factor, yshrinkfactor / scale_factor ); + if ( pixbuf ) { + gint src_x = 0; + gint src_y = 0; + gint dest_x = xx + pict_x * (tilesize_x_ceil / scale_factor); + gint dest_y = yy + pict_y * (tilesize_y_ceil / scale_factor); + vik_viewport_draw_pixbuf ( vvp, pixbuf, src_x, src_y, dest_x, dest_y, tilesize_x_ceil / scale_factor, tilesize_y_ceil / scale_factor ); + g_object_unref(pixbuf); + return TRUE; + } + } + } + } + return FALSE; +} + +static void maps_layer_draw_section ( VikMapsLayer *vml, VikViewport *vvp, VikCoord *ul, VikCoord *br ) +{ + MapCoord ulm, brm; + gdouble xzoom = vik_viewport_get_xmpp ( vvp ); + gdouble yzoom = vik_viewport_get_ympp ( vvp ); + gdouble xshrinkfactor = 1.0, yshrinkfactor = 1.0; + gboolean existence_only = FALSE; + + if ( vml->xmapzoom && (vml->xmapzoom != xzoom || vml->ymapzoom != yzoom) ) { + xshrinkfactor = vml->xmapzoom / xzoom; + yshrinkfactor = vml->ymapzoom / yzoom; + xzoom = vml->xmapzoom; + yzoom = vml->xmapzoom; + if ( ! (xshrinkfactor > MIN_SHRINKFACTOR && xshrinkfactor < MAX_SHRINKFACTOR && + yshrinkfactor > MIN_SHRINKFACTOR && yshrinkfactor < MAX_SHRINKFACTOR ) ) { + if ( xshrinkfactor > REAL_MIN_SHRINKFACTOR && yshrinkfactor > REAL_MIN_SHRINKFACTOR ) { + g_debug ( "%s: existence_only due to SHRINKFACTORS", __FUNCTION__ ); + existence_only = TRUE; + } + else { + // Report the reason for not drawing + if ( IS_VIK_WINDOW ((VikWindow*)VIK_GTK_WINDOW_FROM_LAYER(vml)) ) { + gchar* msg = g_strdup_printf ( _("Cowardly refusing to draw tiles or existence of tiles beyond %d zoom out factor"), (int)( 1.0/REAL_MIN_SHRINKFACTOR)); + vik_window_statusbar_update ( (VikWindow*)VIK_GTK_WINDOW_FROM_LAYER(vml), msg, VIK_STATUSBAR_INFO ); + g_free (msg); + } + return; + } + } + } + + /* coord -> ID */ + VikMapSource *map = MAPS_LAYER_NTH_TYPE(vml->maptype); + if ( vik_map_source_coord_to_mapcoord ( map, ul, xzoom, yzoom, &ulm ) && + vik_map_source_coord_to_mapcoord ( map, br, xzoom, yzoom, &brm ) ) { + + /* loop & draw */ + gint x, y; + gint xmin = MIN(ulm.x, brm.x), xmax = MAX(ulm.x, brm.x); + gint ymin = MIN(ulm.y, brm.y), ymax = MAX(ulm.y, brm.y); + guint16 id = vik_map_source_get_uniq_id(map); + const gchar *mapname = vik_map_source_get_name(map); + + VikCoord coord; + gint xx, yy, width, height; + GdkPixbuf *pixbuf; + + // Prevent the program grinding to a halt if trying to deal with thousands of tiles + // which can happen when using a small fixed zoom level and viewing large areas. + // Also prevents very large number of tile download requests + gint tiles = (xmax-xmin) * (ymax-ymin); + if ( tiles > MAX_TILES ) { + g_debug ( "%s: existence_only due to wanting too many tiles (%d)", __FUNCTION__, tiles ); + existence_only = TRUE; + } + + guint max_path_len = strlen(vml->cache_dir) + 40; + gchar *path_buf = g_malloc ( max_path_len * sizeof(char) ); + + guint vp_scale = vik_viewport_get_scale ( vvp ); + + if ( (!existence_only) && vml->autodownload && should_start_autodownload(vml, vvp)) { + g_debug("%s: Starting autodownload", __FUNCTION__); + if ( !vml->adl_only_missing && vik_map_source_supports_download_only_new (map) ) + // Try to download newer tiles + start_download_thread ( vml, vvp, ul, br, REDOWNLOAD_NEW ); + else + // Download only missing tiles + start_download_thread ( vml, vvp, ul, br, REDOWNLOAD_NONE ); + } + + if ( vik_map_source_get_tilesize_x(map) == 0 && !existence_only ) { + for ( x = xmin; x <= xmax; x++ ) { + for ( y = ymin; y <= ymax; y++ ) { + ulm.x = x; + ulm.y = y; + pixbuf = get_pixbuf ( vml, id, vp_scale, mapname, &ulm, path_buf, max_path_len, xshrinkfactor, yshrinkfactor ); + if ( pixbuf ) { + width = gdk_pixbuf_get_width ( pixbuf ); + height = gdk_pixbuf_get_height ( pixbuf ); + + vik_map_source_mapcoord_to_center_coord ( map, &ulm, &coord ); + vik_viewport_coord_to_screen ( vvp, &coord, &xx, &yy ); + xx -= (width/2); + yy -= (height/2); + + vik_viewport_draw_pixbuf ( vvp, pixbuf, 0, 0, xx, yy, width, height ); + g_object_unref(pixbuf); + } + } + } + } else { /* tilesize is known, don't have to keep converting coords */ + gdouble tilesize_x = vik_map_source_get_tilesize_x(map) * xshrinkfactor * vp_scale; + gdouble tilesize_y = vik_map_source_get_tilesize_y(map) * yshrinkfactor * vp_scale; + /* ceiled so tiles will be maximum size in the case of funky shrinkfactor */ + gint tilesize_x_ceil = ceil ( tilesize_x ); + gint tilesize_y_ceil = ceil ( tilesize_y ); + gint8 xinc = (ulm.x == xmin) ? 1 : -1; + gint8 yinc = (ulm.y == ymin) ? 1 : -1; + gint xx_tmp, yy_tmp; + gint base_yy, xend, yend; + + xend = (xinc == 1) ? (xmax+1) : (xmin-1); + yend = (yinc == 1) ? (ymax+1) : (ymin-1); + + vik_map_source_mapcoord_to_center_coord ( map, &ulm, &coord ); + vik_viewport_coord_to_screen ( vvp, &coord, &xx_tmp, &yy_tmp ); + xx = xx_tmp; yy = yy_tmp; + /* above trick so xx,yy doubles. this is so shrinkfactors aren't rounded off + * eg if tile size 128, shrinkfactor 0.333 */ + xx -= (tilesize_x/2); + base_yy = yy - (tilesize_y/2); + + for ( x = ((xinc == 1) ? xmin : xmax); x != xend; x+=xinc ) { + yy = base_yy; + for ( y = ((yinc == 1) ? ymin : ymax); y != yend; y+=yinc ) { + ulm.x = x; + ulm.y = y; + + if ( existence_only ) { + if ( vik_map_source_is_direct_file_access (MAPS_LAYER_NTH_TYPE(vml->maptype)) ) + get_filename ( vml->cache_dir, VIK_MAPS_CACHE_LAYOUT_OSM, id, vik_map_source_get_name(map), + ulm.scale, ulm.z, ulm.x, ulm.y, path_buf, max_path_len, vik_map_source_get_file_extension(map) ); + else + get_filename ( vml->cache_dir, vml->cache_layout, id, vik_map_source_get_name(map), + ulm.scale, ulm.z, ulm.x, ulm.y, path_buf, max_path_len, vik_map_source_get_file_extension(map) ); + + if ( g_file_test ( path_buf, G_FILE_TEST_EXISTS ) == TRUE ) { + GdkGC *black_gc = gtk_widget_get_style(GTK_WIDGET(vvp))->black_gc; + vik_viewport_draw_line ( vvp, black_gc, xx+tilesize_x_ceil, yy, xx, yy+tilesize_y_ceil ); + } + } else { + // Try correct scale first + int scale_factor = 1; + pixbuf = get_pixbuf ( vml, id, vp_scale, mapname, &ulm, path_buf, max_path_len, xshrinkfactor * scale_factor, yshrinkfactor * scale_factor ); + if ( pixbuf ) { + gint src_x = (ulm.x % scale_factor) * tilesize_x_ceil; + gint src_y = (ulm.y % scale_factor) * tilesize_y_ceil; + vik_viewport_draw_pixbuf ( vvp, pixbuf, src_x, src_y, xx, yy, tilesize_x_ceil, tilesize_y_ceil ); + g_object_unref(pixbuf); + } + else { + // Otherwise try different scales + if ( SCALE_SMALLER_ZOOM_FIRST ) { + if ( !try_draw_scale_down(vml,vvp,vp_scale,ulm,xx,yy,tilesize_x_ceil,tilesize_y_ceil,xshrinkfactor,yshrinkfactor,id,mapname,path_buf,max_path_len) ) { + try_draw_scale_up(vml,vvp,vp_scale,ulm,xx,yy,tilesize_x_ceil,tilesize_y_ceil,xshrinkfactor,yshrinkfactor,id,mapname,path_buf,max_path_len); + } + } + else { + if ( !try_draw_scale_up(vml,vvp,vp_scale,ulm,xx,yy,tilesize_x_ceil,tilesize_y_ceil,xshrinkfactor,yshrinkfactor,id,mapname,path_buf,max_path_len) ) { + try_draw_scale_down(vml,vvp,vp_scale,ulm,xx,yy,tilesize_x_ceil,tilesize_y_ceil,xshrinkfactor,yshrinkfactor,id,mapname,path_buf,max_path_len); + } + } + } + } + + yy += tilesize_y; + } + xx += tilesize_x; + } + + // ATM Only show tile grid lines in extreme debug mode + if ( vik_debug && vik_verbose ) { + /* Grid drawing here so it gets drawn on top of the map */ + /* Thus loop around x & y again, but this time separately */ + /* Only showing grid for the current scale */ + GdkGC *black_gc = GTK_WIDGET(vvp)->style->black_gc; + /* Draw single grid lines across the whole screen */ + gint width = vik_viewport_get_width(vvp); + gint height = vik_viewport_get_height(vvp); + xx = xx_tmp; yy = yy_tmp; + gint base_xx = xx - (tilesize_x/2); + base_yy = yy - (tilesize_y/2); + + xx = base_xx; + for ( x = ((xinc == 1) ? xmin : xmax); x != xend; x+=xinc ) { + vik_viewport_draw_line ( vvp, black_gc, xx, base_yy, xx, height ); + xx += tilesize_x; + } + + yy = base_yy; + for ( y = ((yinc == 1) ? ymin : ymax); y != yend; y+=yinc ) { + vik_viewport_draw_line ( vvp, black_gc, base_xx, yy, width, yy ); + yy += tilesize_y; + } + } + + } + g_free ( path_buf ); + } +} + +static void maps_layer_draw ( VikMapsLayer *vml, VikViewport *vvp ) +{ + if ( vik_map_source_get_drawmode(MAPS_LAYER_NTH_TYPE(vml->maptype)) == vik_viewport_get_drawmode ( vvp ) ) + { + VikCoord ul, br; + + /* Copyright */ + gdouble level = vik_viewport_get_zoom ( vvp ); + LatLonBBox bbox = vik_viewport_get_bbox ( vvp ); + vik_map_source_get_copyright ( MAPS_LAYER_NTH_TYPE(vml->maptype), bbox, level, vik_viewport_add_copyright, vvp ); + + /* Logo */ + const GdkPixbuf *logo = vik_map_source_get_logo ( MAPS_LAYER_NTH_TYPE(vml->maptype) ); + vik_viewport_add_logo ( vvp, logo ); + + /* get corner coords */ + if ( vik_viewport_get_coord_mode ( vvp ) == VIK_COORD_UTM && ! vik_viewport_is_one_zone ( vvp ) ) { + /* UTM multi-zone stuff by Kit Transue */ + gchar leftmost_zone, rightmost_zone, i; + leftmost_zone = vik_viewport_leftmost_zone( vvp ); + rightmost_zone = vik_viewport_rightmost_zone( vvp ); + for ( i = leftmost_zone; i <= rightmost_zone; ++i ) { + vik_viewport_corners_for_zonen ( vvp, i, &ul, &br ); + maps_layer_draw_section ( vml, vvp, &ul, &br ); + } + } + else { + vik_viewport_screen_to_coord ( vvp, 0, 0, &ul ); + vik_viewport_screen_to_coord ( vvp, vik_viewport_get_width(vvp), vik_viewport_get_height(vvp), &br ); + + maps_layer_draw_section ( vml, vvp, &ul, &br ); + } + } +} + +/*************************/ +/****** DOWNLOADING ******/ +/*************************/ + +/* pass along data to thread, exists even if layer is deleted. */ +typedef struct { + gchar *cache_dir; + gchar *filename_buf; + VikMapsCacheLayout cache_layout; + gint x0, y0, xf, yf; + MapCoord mapcoord; + gint maptype; + gint maxlen; + gint mapstoget; + gint redownload; + gboolean refresh_display; + VikMapsLayer *vml; + VikViewport *vvp; + gboolean map_layer_alive; + GMutex *mutex; +} MapDownloadInfo; + +static void mdi_free ( MapDownloadInfo *mdi ) +{ + vik_mutex_free(mdi->mutex); + g_free ( mdi->cache_dir ); + mdi->cache_dir = NULL; + g_free ( mdi->filename_buf ); + mdi->filename_buf = NULL; + g_free ( mdi ); +} + +static void weak_ref_cb(gpointer ptr, GObject * dead_vml) +{ + MapDownloadInfo *mdi = ptr; + g_mutex_lock(mdi->mutex); + mdi->map_layer_alive = FALSE; + g_mutex_unlock(mdi->mutex); +} + +static gboolean is_in_area (VikMapSource *map, MapCoord mc) +{ + VikCoord vc; + vik_map_source_mapcoord_to_center_coord ( map, &mc, &vc ); + + struct LatLon tl; + tl.lat = vik_map_source_get_lat_max(map); + tl.lon = vik_map_source_get_lon_min(map); + struct LatLon br; + br.lat = vik_map_source_get_lat_min(map); + br.lon = vik_map_source_get_lon_max(map); + VikCoord vctl; + vik_coord_load_from_latlon (&vctl, VIK_COORD_LATLON, &tl); + VikCoord vcbr; + vik_coord_load_from_latlon (&vcbr, VIK_COORD_LATLON, &br); + + return vik_coord_inside ( &vc, &vctl, &vcbr ); +} + +static int map_download_thread ( MapDownloadInfo *mdi, gpointer threaddata ) +{ + void *handle = vik_map_source_download_handle_init(MAPS_LAYER_NTH_TYPE(mdi->maptype)); + guint donemaps = 0; + MapCoord mcoord = mdi->mapcoord; + gint x, y; + for ( x = mdi->x0; x <= mdi->xf; x++ ) + { + mcoord.x = x; + for ( y = mdi->y0; y <= mdi->yf; y++ ) + { + mcoord.y = y; + // Only attempt to download a tile from supported areas + if ( is_in_area ( MAPS_LAYER_NTH_TYPE(mdi->maptype), mcoord ) ) + { + gboolean remove_mem_cache = FALSE; + gboolean need_download = FALSE; + + get_filename ( mdi->cache_dir, mdi->cache_layout, + vik_map_source_get_uniq_id(MAPS_LAYER_NTH_TYPE(mdi->maptype)), + vik_map_source_get_name(MAPS_LAYER_NTH_TYPE(mdi->maptype)), + mdi->mapcoord.scale, mdi->mapcoord.z, x, y, mdi->filename_buf, mdi->maxlen, + vik_map_source_get_file_extension(MAPS_LAYER_NTH_TYPE(mdi->maptype)) ); + + donemaps++; + int res = a_background_thread_progress ( threaddata, ((gdouble)donemaps) / mdi->mapstoget ); /* this also calls testcancel */ + if (res != 0) { + vik_map_source_download_handle_cleanup(MAPS_LAYER_NTH_TYPE(mdi->maptype), handle); + return -1; + } + + if ( g_file_test ( mdi->filename_buf, G_FILE_TEST_EXISTS ) == FALSE ) { + need_download = TRUE; + remove_mem_cache = TRUE; + + } else { /* in case map file already exists */ + switch (mdi->redownload) { + case REDOWNLOAD_NONE: + continue; + + case REDOWNLOAD_BAD: + { + /* see if this one is bad or what */ + GError *gx = NULL; + GdkPixbuf *pixbuf = gdk_pixbuf_new_from_file ( mdi->filename_buf, &gx ); + if (gx || (!pixbuf)) { + if ( g_remove ( mdi->filename_buf ) ) + g_warning ( "REDOWNLOAD failed to remove: %s", mdi->filename_buf ); + need_download = TRUE; + remove_mem_cache = TRUE; + g_error_free ( gx ); + + } else { + g_object_unref ( pixbuf ); + } + break; + } + + case REDOWNLOAD_NEW: + need_download = TRUE; + remove_mem_cache = TRUE; + break; + + case REDOWNLOAD_ALL: + /* FIXME: need a better way than to erase file in case of server/network problem */ + if ( g_remove ( mdi->filename_buf ) ) + g_warning ( "REDOWNLOAD failed to remove: %s", mdi->filename_buf ); + need_download = TRUE; + remove_mem_cache = TRUE; + break; + + case DOWNLOAD_OR_REFRESH: + remove_mem_cache = TRUE; + break; + + default: + g_warning ( "redownload state %d unknown\n", mdi->redownload); + } + } + + mdi->mapcoord.x = x; mdi->mapcoord.y = y; + + if (need_download) { + DownloadResult_t dr = vik_map_source_download( MAPS_LAYER_NTH_TYPE(mdi->maptype), &(mdi->mapcoord), mdi->filename_buf, handle); + switch ( dr ) { + case DOWNLOAD_PARAMETERS_ERROR: + case DOWNLOAD_HTTP_ERROR: + case DOWNLOAD_CONTENT_ERROR: { + // TODO: ?? count up the number of download errors somehow... + gchar* msg = g_strdup_printf ( "%s: %s", vik_maps_layer_get_map_label (mdi->vml), _("Failed to download tile") ); + vik_window_statusbar_update ( (VikWindow*)VIK_GTK_WINDOW_FROM_LAYER(mdi->vml), msg, VIK_STATUSBAR_INFO ); + g_free (msg); + break; + } + case DOWNLOAD_FILE_WRITE_ERROR: { + gchar* msg = g_strdup_printf ( "%s: %s", vik_maps_layer_get_map_label (mdi->vml), _("Unable to save tile") ); + vik_window_statusbar_update ( (VikWindow*)VIK_GTK_WINDOW_FROM_LAYER(mdi->vml), msg, VIK_STATUSBAR_INFO ); + g_free (msg); + break; + } + case DOWNLOAD_SUCCESS: + case DOWNLOAD_NOT_REQUIRED: + default: + break; + } + } + + g_mutex_lock(mdi->mutex); + if (remove_mem_cache) + a_mapcache_remove_all_shrinkfactors ( x, y, mdi->mapcoord.z, vik_map_source_get_uniq_id(MAPS_LAYER_NTH_TYPE(mdi->maptype)), mdi->mapcoord.scale, mdi->vml->filename ); + if (mdi->refresh_display && mdi->map_layer_alive) { + /* TODO: check if it's on visible area */ + vik_layer_emit_update ( VIK_LAYER(mdi->vml) ); // NB update display from background + } + g_mutex_unlock(mdi->mutex); + mdi->mapcoord.x = mdi->mapcoord.y = 0; /* we're temporarily between downloads */ + } + } + } + vik_map_source_download_handle_cleanup(MAPS_LAYER_NTH_TYPE(mdi->maptype), handle); + g_mutex_lock(mdi->mutex); + if (mdi->map_layer_alive) + g_object_weak_unref(G_OBJECT(mdi->vml), weak_ref_cb, mdi); + g_mutex_unlock(mdi->mutex); + return 0; +} + +static void mdi_cancel_cleanup ( MapDownloadInfo *mdi ) +{ + if ( mdi->mapcoord.x || mdi->mapcoord.y ) + { + get_filename ( mdi->cache_dir, mdi->cache_layout, + vik_map_source_get_uniq_id(MAPS_LAYER_NTH_TYPE(mdi->maptype)), + vik_map_source_get_name(MAPS_LAYER_NTH_TYPE(mdi->maptype)), + mdi->mapcoord.scale, mdi->mapcoord.z, mdi->mapcoord.x, mdi->mapcoord.y, mdi->filename_buf, mdi->maxlen, + vik_map_source_get_file_extension(MAPS_LAYER_NTH_TYPE(mdi->maptype)) ); + if ( g_file_test ( mdi->filename_buf, G_FILE_TEST_EXISTS ) == TRUE) + { + if ( g_remove ( mdi->filename_buf ) ) + g_warning ( "Cleanup failed to remove: %s", mdi->filename_buf ); + } + } +} + +static void start_download_thread ( VikMapsLayer *vml, VikViewport *vvp, const VikCoord *ul, const VikCoord *br, gint redownload ) +{ + gdouble xzoom = vml->xmapzoom ? vml->xmapzoom : vik_viewport_get_xmpp ( vvp ); + gdouble yzoom = vml->ymapzoom ? vml->ymapzoom : vik_viewport_get_ympp ( vvp ); + MapCoord ulm, brm; + VikMapSource *map = MAPS_LAYER_NTH_TYPE(vml->maptype); + + // Don't ever attempt download on direct access + if ( vik_map_source_is_direct_file_access ( map ) ) + return; + + if ( vik_map_source_coord_to_mapcoord ( map, ul, xzoom, yzoom, &ulm ) + && vik_map_source_coord_to_mapcoord ( map, br, xzoom, yzoom, &brm ) ) + { + MapDownloadInfo *mdi = g_malloc ( sizeof(MapDownloadInfo) ); + gint a, b; + + mdi->vml = vml; + mdi->vvp = vvp; + mdi->map_layer_alive = TRUE; + mdi->mutex = vik_mutex_new(); + mdi->refresh_display = TRUE; + + /* cache_dir and buffer for dest filename */ + mdi->cache_dir = g_strdup ( vml->cache_dir ); + mdi->maxlen = strlen ( vml->cache_dir ) + 40; + mdi->filename_buf = g_malloc ( mdi->maxlen * sizeof(gchar) ); + mdi->cache_layout = vml->cache_layout; + mdi->maptype = vml->maptype; + + mdi->mapcoord = ulm; + mdi->redownload = redownload; + + mdi->x0 = MIN(ulm.x, brm.x); + mdi->xf = MAX(ulm.x, brm.x); + mdi->y0 = MIN(ulm.y, brm.y); + mdi->yf = MAX(ulm.y, brm.y); + + mdi->mapstoget = 0; + + MapCoord mcoord = mdi->mapcoord; + + if ( mdi->redownload ) { + mdi->mapstoget = (mdi->xf - mdi->x0 + 1) * (mdi->yf - mdi->y0 + 1); + } else { + /* calculate how many we need */ + for ( a = mdi->x0; a <= mdi->xf; a++ ) + { + mcoord.x = a; + for ( b = mdi->y0; b <= mdi->yf; b++ ) + { + mcoord.y = b; + // Only count tiles from supported areas + if ( is_in_area (map, mcoord) ) + { + get_filename ( mdi->cache_dir, mdi->cache_layout, + vik_map_source_get_uniq_id(map), + vik_map_source_get_name(map), + ulm.scale, ulm.z, a, b, mdi->filename_buf, mdi->maxlen, + vik_map_source_get_file_extension(map) ); + if ( g_file_test ( mdi->filename_buf, G_FILE_TEST_EXISTS ) == FALSE ) + mdi->mapstoget++; + } + } + } + } + + mdi->mapcoord.x = mdi->mapcoord.y = 0; /* for cleanup -- no current map */ + + if ( mdi->mapstoget ) + { + const gchar *tmp_str; + gchar *tmp; + + if (redownload) + { + if (redownload == REDOWNLOAD_BAD) + tmp_str = ngettext("Redownloading up to %d %s map...", "Redownloading up to %d %s maps...", mdi->mapstoget); + else + tmp_str = ngettext("Redownloading %d %s map...", "Redownloading %d %s maps...", mdi->mapstoget); + } + else + { + tmp_str = ngettext("Downloading %d %s map...", "Downloading %d %s maps...", mdi->mapstoget); + } + tmp = g_strdup_printf ( tmp_str, mdi->mapstoget, MAPS_LAYER_NTH_LABEL(vml->maptype)); + + g_object_weak_ref(G_OBJECT(mdi->vml), weak_ref_cb, mdi); + /* launch the thread */ + a_background_thread ( BACKGROUND_POOL_REMOTE, + VIK_GTK_WINDOW_FROM_LAYER(vml), /* parent window */ + tmp, /* description string */ + (vik_thr_func) map_download_thread, /* function to call within thread */ + mdi, /* pass along data */ + (vik_thr_free_func) mdi_free, /* function to free pass along data */ + (vik_thr_free_func) mdi_cancel_cleanup, + mdi->mapstoget ); + g_free ( tmp ); + } + else + mdi_free ( mdi ); + } +} + +static void maps_layer_download_section ( VikMapsLayer *vml, VikViewport *vvp, VikCoord *ul, VikCoord *br, gdouble zoom, gint download_method ) +{ + MapCoord ulm, brm; + VikMapSource *map = MAPS_LAYER_NTH_TYPE(vml->maptype); + + // Don't ever attempt download on direct access + if ( vik_map_source_is_direct_file_access ( map ) ) + return; + + if (!vik_map_source_coord_to_mapcoord(map, ul, zoom, zoom, &ulm) + || !vik_map_source_coord_to_mapcoord(map, br, zoom, zoom, &brm)) { + g_warning("%s() coord_to_mapcoord() failed", __PRETTY_FUNCTION__); + return; + } + + MapDownloadInfo *mdi = g_malloc(sizeof(MapDownloadInfo)); + gint i, j; + + mdi->vml = vml; + mdi->vvp = vvp; + mdi->map_layer_alive = TRUE; + mdi->mutex = vik_mutex_new(); + mdi->refresh_display = TRUE; + + mdi->cache_dir = g_strdup ( vml->cache_dir ); + mdi->maxlen = strlen ( vml->cache_dir ) + 40; + mdi->filename_buf = g_malloc ( mdi->maxlen * sizeof(gchar) ); + mdi->maptype = vml->maptype; + mdi->cache_layout = vml->cache_layout; + + mdi->mapcoord = ulm; + mdi->redownload = download_method; + + mdi->x0 = MIN(ulm.x, brm.x); + mdi->xf = MAX(ulm.x, brm.x); + mdi->y0 = MIN(ulm.y, brm.y); + mdi->yf = MAX(ulm.y, brm.y); + + mdi->mapstoget = 0; + + MapCoord mcoord = mdi->mapcoord; + + for (i = mdi->x0; i <= mdi->xf; i++) { + mcoord.x = i; + for (j = mdi->y0; j <= mdi->yf; j++) { + mcoord.y = j; + // Only count tiles from supported areas + if ( is_in_area (map, mcoord) ) { + get_filename ( mdi->cache_dir, mdi->cache_layout, + vik_map_source_get_uniq_id(map), + vik_map_source_get_name(map), + ulm.scale, ulm.z, i, j, mdi->filename_buf, mdi->maxlen, + vik_map_source_get_file_extension(map) ); + if ( g_file_test ( mdi->filename_buf, G_FILE_TEST_EXISTS ) == FALSE ) + mdi->mapstoget++; + } + } + } + + mdi->mapcoord.x = mdi->mapcoord.y = 0; /* for cleanup -- no current map */ + + if (mdi->mapstoget) { + gchar *tmp; + const gchar *fmt; + fmt = ngettext("Downloading %d %s map...", + "Downloading %d %s maps...", + mdi->mapstoget); + tmp = g_strdup_printf ( fmt, mdi->mapstoget, MAPS_LAYER_NTH_LABEL(vml->maptype) ); + + g_object_weak_ref(G_OBJECT(mdi->vml), weak_ref_cb, mdi); + + // launch the thread + a_background_thread ( BACKGROUND_POOL_REMOTE, + VIK_GTK_WINDOW_FROM_LAYER(vml), /* parent window */ + tmp, /* description string */ + (vik_thr_func) map_download_thread, /* function to call within thread */ + mdi, /* pass along data */ + (vik_thr_free_func) mdi_free, /* function to free pass along data */ + (vik_thr_free_func) mdi_cancel_cleanup, + mdi->mapstoget ); + g_free ( tmp ); + } + else + mdi_free ( mdi ); +} + +/** + * vik_maps_layer_download_section: + * @vml: The Map Layer + * @vvp: The Viewport that the map is on + * @ul: Upper left coordinate of the area to be downloaded + * @br: Bottom right coordinate of the area to be downloaded + * @zoom: The zoom level at which the maps are to be download + * + * Download a specified map area at a certain zoom level + */ +void vik_maps_layer_download_section ( VikMapsLayer *vml, VikViewport *vvp, VikCoord *ul, VikCoord *br, gdouble zoom ) +{ + maps_layer_download_section (vml, vvp, ul, br, zoom, REDOWNLOAD_NONE); +} + +static void maps_layer_redownload_bad ( VikMapsLayer *vml ) +{ + start_download_thread ( vml, vml->redownload_vvp, &(vml->redownload_ul), &(vml->redownload_br), REDOWNLOAD_BAD ); +} + +static void maps_layer_redownload_all ( VikMapsLayer *vml ) +{ + start_download_thread ( vml, vml->redownload_vvp, &(vml->redownload_ul), &(vml->redownload_br), REDOWNLOAD_ALL ); +} + +static void maps_layer_redownload_new ( VikMapsLayer *vml ) +{ + start_download_thread ( vml, vml->redownload_vvp, &(vml->redownload_ul), &(vml->redownload_br), REDOWNLOAD_NEW ); +} + +/** + * Display a simple dialog with information about this particular map tile + */ +static void maps_layer_tile_info ( VikMapsLayer *vml ) +{ + VikMapSource *map = MAPS_LAYER_NTH_TYPE(vml->maptype); + + gdouble xzoom = vml->xmapzoom ? vml->xmapzoom : vik_viewport_get_xmpp ( vml->redownload_vvp ); + gdouble yzoom = vml->ymapzoom ? vml->ymapzoom : vik_viewport_get_ympp ( vml->redownload_vvp ); + MapCoord ulm; + + if ( !vik_map_source_coord_to_mapcoord ( map, &(vml->redownload_ul), xzoom, yzoom, &ulm ) ) + return; + + gchar *filename = NULL; + gchar *source = NULL; + + if ( vik_map_source_is_direct_file_access ( map ) ) { + if ( vik_map_source_is_mbtiles ( map ) ) { + filename = g_strdup ( vml->filename ); +#ifdef HAVE_SQLITE3_H + // And whether to bother going into the SQL to check it's really there or not... + gchar *exists = NULL; + gint zoom = 17 - ulm.scale; + if ( vml->mbtiles ) { + GdkPixbuf *pixbuf = get_pixbuf_sql_exec ( vml->mbtiles, ulm.x, ulm.y, zoom ); + if ( pixbuf ) { + exists = g_strdup ( _("YES") ); + g_object_unref ( G_OBJECT(pixbuf) ); + } + else { + exists = g_strdup ( _("NO") ); + } + } + else + exists = g_strdup ( _("NO") ); + gint flip_y = (gint) pow(2, zoom)-1 - ulm.y; + // NB Also handles .jpg automatically due to pixbuf_new_from () support - although just print png for now. + source = g_strdup_printf ( _("Source: %s (%d%s%d%s%d.%s %s)"), filename, zoom, G_DIR_SEPARATOR_S, ulm.x, G_DIR_SEPARATOR_S, flip_y, "png", exists ); + g_free ( exists ); +#else + source = g_strdup ( _("Source: Not available") ); +#endif + } + else if ( vik_map_source_is_osm_meta_tiles ( map ) ) { + char path[PATH_MAX]; + xyz_to_meta(path, sizeof(path), vml->cache_dir, ulm.x, ulm.y, 17-ulm.scale ); + source = g_strdup ( path ); + filename = g_strdup ( path ); + } + else { + guint max_path_len = strlen(vml->cache_dir) + 40; + filename = g_malloc ( max_path_len * sizeof(char) ); + get_filename ( vml->cache_dir, VIK_MAPS_CACHE_LAYOUT_OSM, + vik_map_source_get_uniq_id(map), + NULL, + ulm.scale, ulm.z, ulm.x, ulm.y, filename, max_path_len, + vik_map_source_get_file_extension(map) ); + source = g_strconcat ( _("Source: file://"), filename, NULL ); + } + } + else { + guint max_path_len = strlen(vml->cache_dir) + 40; + filename = g_malloc ( max_path_len * sizeof(char) ); + get_filename ( vml->cache_dir, vml->cache_layout, + vik_map_source_get_uniq_id(map), + vik_map_source_get_name(map), + ulm.scale, ulm.z, ulm.x, ulm.y, filename, max_path_len, + vik_map_source_get_file_extension(map) ); + gchar *url = vik_map_source_default_get_url_display ( VIK_MAP_SOURCE_DEFAULT(map), &ulm ); + source = g_markup_printf_escaped ( _("Source: %s"), url ); + g_free ( url ); + } + + GArray *array = g_array_new (FALSE, TRUE, sizeof(gchar*)); + g_array_append_val ( array, source ); + + gchar *filemsg = NULL; + gchar *timemsg = NULL; + + if ( g_file_test ( filename, G_FILE_TEST_EXISTS ) ) { + filemsg = g_strconcat ( "Tile File: ", filename, NULL ); + // Get some timestamp information of the tile + GStatBuf stat_buf; + if ( g_stat ( filename, &stat_buf ) == 0 ) { + gchar time_buf[64]; + strftime ( time_buf, sizeof(time_buf), "%c", gmtime((const time_t *)&stat_buf.st_mtime) ); + timemsg = g_strdup_printf ( _("Tile File Timestamp: %s"), time_buf ); + } + else { + timemsg = g_strdup ( _("Tile File Timestamp: Not Available") ); + } + g_array_append_val ( array, filemsg ); + g_array_append_val ( array, timemsg ); + } + else { + filemsg = g_strdup_printf ( _("Tile File: %s [Not Available]"), filename ); + g_array_append_val ( array, filemsg ); + } + + a_dialog_list ( VIK_GTK_WINDOW_FROM_LAYER(vml), _("Tile Information"), array, 5 ); + g_array_free ( array, FALSE ); + + g_free ( timemsg ); + g_free ( filemsg ); + g_free ( source ); + g_free ( filename ); +} + +static gboolean maps_layer_download_release ( VikMapsLayer *vml, GdkEventButton *event, VikViewport *vvp ) +{ + if (!vml || vml->vl.type != VIK_LAYER_MAPS) + return FALSE; + if ( vml->dl_tool_x != -1 && vml->dl_tool_y != -1 ) + { + if ( event->button == 1 ) + { + VikCoord ul, br; + vik_viewport_screen_to_coord ( vvp, MAX(0, MIN(event->x, vml->dl_tool_x)), MAX(0, MIN(event->y, vml->dl_tool_y)), &ul ); + vik_viewport_screen_to_coord ( vvp, MIN(vik_viewport_get_width(vvp), MAX(event->x, vml->dl_tool_x)), MIN(vik_viewport_get_height(vvp), MAX ( event->y, vml->dl_tool_y ) ), &br ); + start_download_thread ( vml, vvp, &ul, &br, DOWNLOAD_OR_REFRESH ); + vml->dl_tool_x = vml->dl_tool_y = -1; + return TRUE; + } + else + { + vik_viewport_screen_to_coord ( vvp, MAX(0, MIN(event->x, vml->dl_tool_x)), MAX(0, MIN(event->y, vml->dl_tool_y)), &(vml->redownload_ul) ); + vik_viewport_screen_to_coord ( vvp, MIN(vik_viewport_get_width(vvp), MAX(event->x, vml->dl_tool_x)), MIN(vik_viewport_get_height(vvp), MAX ( event->y, vml->dl_tool_y ) ), &(vml->redownload_br) ); + + vml->redownload_vvp = vvp; + + vml->dl_tool_x = vml->dl_tool_y = -1; + + if ( ! vml->dl_right_click_menu ) { + GtkWidget *item; + VikMapSource *map = MAPS_LAYER_NTH_TYPE(vml->maptype); + + vml->dl_right_click_menu = GTK_MENU ( gtk_menu_new () ); + + // Download options aren't for on disk only maps + if ( ! (vik_map_source_is_mbtiles(map) || + vik_map_source_is_direct_file_access(map) || + vik_map_source_is_osm_meta_tiles(map)) ) { + + item = gtk_menu_item_new_with_mnemonic ( _("Redownload _Bad Map(s)") ); + g_signal_connect_swapped ( G_OBJECT(item), "activate", G_CALLBACK(maps_layer_redownload_bad), vml ); + gtk_menu_shell_append ( GTK_MENU_SHELL(vml->dl_right_click_menu), item ); + + item = gtk_menu_item_new_with_mnemonic ( _("Redownload _New Map(s)") ); + g_signal_connect_swapped ( G_OBJECT(item), "activate", G_CALLBACK(maps_layer_redownload_new), vml ); + gtk_menu_shell_append ( GTK_MENU_SHELL(vml->dl_right_click_menu), item ); + + item = gtk_menu_item_new_with_mnemonic ( _("Redownload _All Map(s)") ); + g_signal_connect_swapped ( G_OBJECT(item), "activate", G_CALLBACK(maps_layer_redownload_all), vml ); + gtk_menu_shell_append ( GTK_MENU_SHELL(vml->dl_right_click_menu), item ); + } + + item = gtk_image_menu_item_new_with_mnemonic ( _("_Show Tile Information") ); + gtk_image_menu_item_set_image ( (GtkImageMenuItem*)item, gtk_image_new_from_stock (GTK_STOCK_INFO, GTK_ICON_SIZE_MENU) ); + g_signal_connect_swapped ( G_OBJECT(item), "activate", G_CALLBACK(maps_layer_tile_info), vml ); + gtk_menu_shell_append (GTK_MENU_SHELL(vml->dl_right_click_menu), item); + } + + gtk_menu_popup ( vml->dl_right_click_menu, NULL, NULL, NULL, NULL, event->button, event->time ); + gtk_widget_show_all ( GTK_WIDGET(vml->dl_right_click_menu) ); + } + } + return FALSE; +} + +static gpointer maps_layer_download_create ( VikWindow *vw, VikViewport *vvp) +{ + return vvp; +} + +static gboolean maps_layer_download_click ( VikMapsLayer *vml, GdkEventButton *event, VikViewport *vvp ) +{ + MapCoord tmp; + if (!vml || vml->vl.type != VIK_LAYER_MAPS) + return FALSE; + VikMapSource *map = MAPS_LAYER_NTH_TYPE(vml->maptype); + if ( vik_map_source_get_drawmode(map) == vik_viewport_get_drawmode ( vvp ) && + vik_map_source_coord_to_mapcoord ( map, vik_viewport_get_center ( vvp ), + vml->xmapzoom ? vml->xmapzoom : vik_viewport_get_xmpp ( vvp ), + vml->ymapzoom ? vml->ymapzoom : vik_viewport_get_ympp ( vvp ), + &tmp ) ) { + vml->dl_tool_x = event->x, vml->dl_tool_y = event->y; + return TRUE; + } + return FALSE; +} + +// A slightly better way of defining the menu callback information +// This should be easier to extend/rework compared to previously +typedef enum { + MA_VML = 0, + MA_VVP, + MA_LAST +} menu_array_index; + +typedef gpointer menu_array_values[MA_LAST]; + +static void download_onscreen_maps ( menu_array_values values, gint redownload ) +{ + VikMapsLayer *vml = VIK_MAPS_LAYER(values[MA_VML]); + VikViewport *vvp = VIK_VIEWPORT(values[MA_VVP]); + VikViewportDrawMode vp_drawmode = vik_viewport_get_drawmode ( vvp ); + + gdouble xzoom = vml->xmapzoom ? vml->xmapzoom : vik_viewport_get_xmpp ( vvp ); + gdouble yzoom = vml->ymapzoom ? vml->ymapzoom : vik_viewport_get_ympp ( vvp ); + + VikCoord ul, br; + MapCoord ulm, brm; + + vik_viewport_screen_to_coord ( vvp, 0, 0, &ul ); + vik_viewport_screen_to_coord ( vvp, vik_viewport_get_width(vvp), vik_viewport_get_height(vvp), &br ); + + VikMapSource *map = MAPS_LAYER_NTH_TYPE(vml->maptype); + if ( vik_map_source_get_drawmode(map) == vp_drawmode && + vik_map_source_coord_to_mapcoord ( map, &ul, xzoom, yzoom, &ulm ) && + vik_map_source_coord_to_mapcoord ( map, &br, xzoom, yzoom, &brm ) ) + start_download_thread ( vml, vvp, &ul, &br, redownload ); + else if (vik_map_source_get_drawmode(map) != vp_drawmode) { + const gchar *drawmode_name = vik_viewport_get_drawmode_name (vvp, vik_map_source_get_drawmode(map)); + gchar *err = g_strdup_printf(_("Wrong drawmode for this map.\nSelect \"%s\" from View menu and try again."), _(drawmode_name)); + a_dialog_error_msg ( VIK_GTK_WINDOW_FROM_LAYER(vml), err ); + g_free(err); + } + else + a_dialog_error_msg ( VIK_GTK_WINDOW_FROM_LAYER(vml), _("Wrong zoom level for this map.") ); + +} + +static void maps_layer_download_missing_onscreen_maps ( menu_array_values values ) +{ + download_onscreen_maps( values, REDOWNLOAD_NONE); +} + +static void maps_layer_download_new_onscreen_maps ( menu_array_values values ) +{ + download_onscreen_maps( values, REDOWNLOAD_NEW); +} + +static void maps_layer_redownload_all_onscreen_maps ( menu_array_values values ) +{ + download_onscreen_maps( values, REDOWNLOAD_ALL); +} + +static void maps_layer_about ( menu_array_values values ) +{ + VikMapsLayer *vml = VIK_MAPS_LAYER(values[MA_VML]); + VikMapSource *map = MAPS_LAYER_NTH_TYPE(vml->maptype); + + if ( vik_map_source_get_license (map) ) + maps_show_license ( VIK_GTK_WINDOW_FROM_LAYER(vml), map ); + else + a_dialog_info_msg ( VIK_GTK_WINDOW_FROM_LAYER(vml), + vik_map_source_get_label (map) ); +} + +static void maps_layer_mbtiles_open_cb ( menu_array_values values ) +{ + VikMapsLayer *vml = VIK_MAPS_LAYER(values[MA_VML]); + VikViewport *vvp = VIK_VIEWPORT(values[MA_VVP]); + VikMapSource *map = MAPS_LAYER_NTH_TYPE(vml->maptype); + + maps_layer_mbtiles_open ( vml, vvp, map ); + vik_layer_emit_update ( VIK_LAYER(vml) ); +} + +/** + * maps_layer_how_many_maps: + * Copied from maps_layer_download_section but without the actual download and this returns a value + */ +static gint maps_layer_how_many_maps ( VikMapsLayer *vml, VikViewport *vvp, VikCoord *ul, VikCoord *br, gdouble zoom, gint redownload ) +{ + MapCoord ulm, brm; + VikMapSource *map = MAPS_LAYER_NTH_TYPE(vml->maptype); + + if ( vik_map_source_is_direct_file_access ( map ) ) + return 0; + + if (!vik_map_source_coord_to_mapcoord(map, ul, zoom, zoom, &ulm) + || !vik_map_source_coord_to_mapcoord(map, br, zoom, zoom, &brm)) { + g_warning("%s() coord_to_mapcoord() failed", __PRETTY_FUNCTION__); + return 0; + } + + MapDownloadInfo *mdi = g_malloc(sizeof(MapDownloadInfo)); + gint i, j; + + mdi->vml = vml; + mdi->vvp = vvp; + mdi->map_layer_alive = TRUE; + mdi->mutex = vik_mutex_new(); + mdi->refresh_display = FALSE; + + mdi->cache_dir = g_strdup ( vml->cache_dir ); + mdi->maxlen = strlen ( vml->cache_dir ) + 40; + mdi->filename_buf = g_malloc ( mdi->maxlen * sizeof(gchar) ); + mdi->maptype = vml->maptype; + mdi->cache_layout = vml->cache_layout; + + mdi->mapcoord = ulm; + mdi->redownload = redownload; + + mdi->x0 = MIN(ulm.x, brm.x); + mdi->xf = MAX(ulm.x, brm.x); + mdi->y0 = MIN(ulm.y, brm.y); + mdi->yf = MAX(ulm.y, brm.y); + + mdi->mapstoget = 0; + + if ( mdi->redownload == REDOWNLOAD_ALL ) { + mdi->mapstoget = (mdi->xf - mdi->x0 + 1) * (mdi->yf - mdi->y0 + 1); + } + else { + /* calculate how many we need */ + MapCoord mcoord = mdi->mapcoord; + for (i = mdi->x0; i <= mdi->xf; i++) { + mcoord.x = i; + for (j = mdi->y0; j <= mdi->yf; j++) { + mcoord.y = j; + // Only count tiles from supported areas + if ( is_in_area ( map, mcoord ) ) { + get_filename ( mdi->cache_dir, mdi->cache_layout, + vik_map_source_get_uniq_id(map), + vik_map_source_get_name(map), + ulm.scale, ulm.z, i, j, mdi->filename_buf, mdi->maxlen, + vik_map_source_get_file_extension(map) ); + if ( mdi->redownload == REDOWNLOAD_NEW ) { + // Assume the worst - always a new file + // Absolute value would require a server lookup - but that is too slow + mdi->mapstoget++; + } + else { + if ( g_file_test ( mdi->filename_buf, G_FILE_TEST_EXISTS ) == FALSE ) { + // Missing + mdi->mapstoget++; + } + else { + if ( mdi->redownload == REDOWNLOAD_BAD ) { + /* see if this one is bad or what */ + GdkPixbuf *pixbuf = gdk_pixbuf_new_from_file ( mdi->filename_buf, NULL ); + if ( !pixbuf ) { + mdi->mapstoget++; + } else { + g_object_unref ( pixbuf ); + } + break; + // Other download cases already considered or just ignored + } + } + } + } + } + } + } + + gint rv = mdi->mapstoget; + + mdi_free ( mdi ); + + return rv; +} + +/** + * maps_dialog_zoom_between: + * This dialog is specific to the map layer, so it's here rather than in dialog.c + */ +gboolean maps_dialog_zoom_between ( GtkWindow *parent, + gchar *title, + gchar *zoom_list[], + gint default_zoom1, + gint default_zoom2, + gint *selected_zoom1, + gint *selected_zoom2, + gchar *download_list[], + gint default_download, + gint *selected_download ) +{ + GtkWidget *dialog = gtk_dialog_new_with_buttons ( title, + parent, + GTK_DIALOG_MODAL | GTK_DIALOG_DESTROY_WITH_PARENT, + GTK_STOCK_OK, GTK_RESPONSE_ACCEPT, + GTK_STOCK_CANCEL, GTK_RESPONSE_REJECT, + NULL ); + gtk_dialog_set_default_response ( GTK_DIALOG(dialog), GTK_RESPONSE_ACCEPT ); + GtkWidget *response_w = NULL; +#if GTK_CHECK_VERSION (2, 20, 0) + response_w = gtk_dialog_get_widget_for_response ( GTK_DIALOG(dialog), GTK_RESPONSE_ACCEPT ); +#endif + GtkWidget *zoom_label1 = gtk_label_new ( _("Zoom Start:") ); + GtkWidget *zoom_combo1 = vik_combo_box_text_new(); + gchar **s; + for (s = zoom_list; *s; s++) + vik_combo_box_text_append ( zoom_combo1, *s ); + gtk_combo_box_set_active ( GTK_COMBO_BOX(zoom_combo1), default_zoom1 ); + + GtkWidget *zoom_label2 = gtk_label_new ( _("Zoom End:") ); + GtkWidget *zoom_combo2 = vik_combo_box_text_new(); + for (s = zoom_list; *s; s++) + vik_combo_box_text_append ( zoom_combo2, *s ); + gtk_combo_box_set_active ( GTK_COMBO_BOX(zoom_combo2), default_zoom2 ); + + GtkWidget *download_label = gtk_label_new(_("Download Maps Method:")); + GtkWidget *download_combo = vik_combo_box_text_new(); + for (s = download_list; *s; s++) + vik_combo_box_text_append ( download_combo, *s ); + gtk_combo_box_set_active ( GTK_COMBO_BOX(download_combo), default_download ); + + GtkTable *box = GTK_TABLE(gtk_table_new(3, 2, FALSE)); + gtk_table_attach_defaults (box, GTK_WIDGET(zoom_label1), 0, 1, 0, 1); + gtk_table_attach_defaults (box, GTK_WIDGET(zoom_combo1), 1, 2, 0, 1); + gtk_table_attach_defaults (box, GTK_WIDGET(zoom_label2), 0, 1, 1, 2); + gtk_table_attach_defaults (box, GTK_WIDGET(zoom_combo2), 1, 2, 1, 2); + gtk_table_attach_defaults (box, GTK_WIDGET(download_label), 0, 1, 2, 3); + gtk_table_attach_defaults (box, GTK_WIDGET(download_combo), 1, 2, 2, 3); + + gtk_box_pack_start ( GTK_BOX(gtk_dialog_get_content_area(GTK_DIALOG(dialog))), GTK_WIDGET(box), FALSE, FALSE, 5 ); + + if ( response_w ) + gtk_widget_grab_focus ( response_w ); + + gtk_widget_show_all ( dialog ); + if ( gtk_dialog_run ( GTK_DIALOG(dialog) ) != GTK_RESPONSE_ACCEPT ) { + gtk_widget_destroy(dialog); + return FALSE; + } + + // Return selected options + *selected_zoom1 = gtk_combo_box_get_active ( GTK_COMBO_BOX(zoom_combo1) ); + *selected_zoom2 = gtk_combo_box_get_active ( GTK_COMBO_BOX(zoom_combo2) ); + *selected_download = gtk_combo_box_get_active ( GTK_COMBO_BOX(download_combo) ); + + gtk_widget_destroy(dialog); + return TRUE; +} + +// My best guess of sensible limits +#define REALLY_LARGE_AMOUNT_OF_TILES 5000 +#define CONFIRM_LARGE_AMOUNT_OF_TILES 500 + +/** + * Get all maps in the region for zoom levels specified by the user + * Sort of similar to trw_layer_download_map_along_track_cb function + */ +static void maps_layer_download_all ( menu_array_values values ) +{ + VikMapsLayer *vml = VIK_MAPS_LAYER(values[MA_VML]); + VikViewport *vvp = VIK_VIEWPORT(values[MA_VVP]); + + // I don't think we should allow users to hammer the servers too much... + // Delibrately not allowing lowest zoom levels + // Still can give massive numbers to download + // A screen size of 1600x1200 gives around 300,000 tiles between 1..128 when none exist before !! + gchar *zoom_list[] = {"1", "2", "4", "8", "16", "32", "64", "128", "256", "512", "1024", NULL }; + gdouble zoom_vals[] = {1, 2, 4, 8, 16, 32, 64, 128, 256, 512, 1024}; + + gint selected_zoom1, selected_zoom2, default_zoom, lower_zoom; + gint selected_download_method; + + gdouble cur_zoom = vik_viewport_get_zoom(vvp); + + for (default_zoom = 0; default_zoom < sizeof(zoom_vals)/sizeof(gdouble); default_zoom++) { + if (cur_zoom == zoom_vals[default_zoom]) + break; + } + default_zoom = (default_zoom == sizeof(zoom_vals)/sizeof(gdouble)) ? sizeof(zoom_vals)/sizeof(gdouble) - 1 : default_zoom; + + // Default to only 2 zoom levels below the current one + if (default_zoom > 1 ) + lower_zoom = default_zoom - 2; + else + lower_zoom = default_zoom; + + // redownload method - needs to align with REDOWNLOAD* macro values + gchar *download_list[] = { _("Missing"), _("Bad"), _("New"), _("Reload All"), NULL }; + + gchar *title = g_strdup_printf ( ("%s: %s"), vik_maps_layer_get_map_label (vml), _("Download for Zoom Levels") ); + + if ( ! maps_dialog_zoom_between ( VIK_GTK_WINDOW_FROM_LAYER(vml), + title, + zoom_list, + lower_zoom, + default_zoom, + &selected_zoom1, + &selected_zoom2, + download_list, + REDOWNLOAD_NONE, // AKA Missing + &selected_download_method ) ) { + // Cancelled + g_free ( title ); + return; + } + g_free ( title ); + + // Find out new current positions + gdouble min_lat, max_lat, min_lon, max_lon; + VikCoord vc_ul, vc_br; + vik_viewport_get_min_max_lat_lon ( vvp, &min_lat, &max_lat, &min_lon, &max_lon ); + struct LatLon ll_ul = { max_lat, min_lon }; + struct LatLon ll_br = { min_lat, max_lon }; + vik_coord_load_from_latlon ( &vc_ul, vik_viewport_get_coord_mode (vvp), &ll_ul ); + vik_coord_load_from_latlon ( &vc_br, vik_viewport_get_coord_mode (vvp), &ll_br ); + + // Get Maps Count - call for each zoom level (in reverse) + // With REDOWNLOAD_NEW this is a possible maximum + // With REDOWNLOAD_NONE this only missing ones - however still has a server lookup per tile + gint map_count = 0; + gint zz; + for ( zz = selected_zoom2; zz >= selected_zoom1; zz-- ) { + map_count = map_count + maps_layer_how_many_maps ( vml, vvp, &vc_ul, &vc_br, zoom_vals[zz], selected_download_method ); + } + + g_debug ("vikmapslayer: download request map count %d for method %d", map_count, selected_download_method); + + // Absolute protection of hammering a map server + if ( map_count > REALLY_LARGE_AMOUNT_OF_TILES ) { + gchar *str = g_strdup_printf (_("You are not allowed to download more than %d tiles in one go (requested %d)"), REALLY_LARGE_AMOUNT_OF_TILES, map_count); + a_dialog_error_msg ( VIK_GTK_WINDOW_FROM_LAYER(vml), str ); + g_free (str); + return; + } + + // Confirm really want to do this + if ( map_count > CONFIRM_LARGE_AMOUNT_OF_TILES ) { + gchar *str = g_strdup_printf (_("Do you really want to download %d tiles?"), map_count); + gboolean ans = a_dialog_yes_or_no ( VIK_GTK_WINDOW_FROM_LAYER(vml), str, NULL ); + g_free (str); + if ( ! ans ) + return; + } + + // Get Maps - call for each zoom level (in reverse) + for ( zz = selected_zoom2; zz >= selected_zoom1; zz-- ) { + maps_layer_download_section ( vml, vvp, &vc_ul, &vc_br, zoom_vals[zz], selected_download_method ); + } +} + +/** + * + */ +static void maps_layer_flush ( menu_array_values values ) +{ + VikMapsLayer *vml = VIK_MAPS_LAYER(values[MA_VML]); + a_mapcache_flush_type ( vik_map_source_get_uniq_id(MAPS_LAYER_NTH_TYPE(vml->maptype)) ); +} + +static void maps_layer_add_menu_items ( VikMapsLayer *vml, GtkMenu *menu, VikLayersPanel *vlp ) +{ + GtkWidget *item; + static menu_array_values values; + values[MA_VML] = vml; + values[MA_VVP] = vik_layers_panel_get_viewport( VIK_LAYERS_PANEL(vlp) ); + + VikMapSource *map = MAPS_LAYER_NTH_TYPE(vml->maptype); + + item = gtk_menu_item_new(); + gtk_menu_shell_append ( GTK_MENU_SHELL(menu), item ); + gtk_widget_show ( item ); + + // Download options aren't for on disk only maps + if ( ! (vik_map_source_is_mbtiles(map) || + vik_map_source_is_direct_file_access(map) || + vik_map_source_is_osm_meta_tiles(map)) ) { + /* Now with icons */ + item = gtk_image_menu_item_new_with_mnemonic ( _("Download _Missing Onscreen Maps") ); + gtk_image_menu_item_set_image ( (GtkImageMenuItem*)item, gtk_image_new_from_stock (GTK_STOCK_ADD, GTK_ICON_SIZE_MENU) ); + g_signal_connect_swapped ( G_OBJECT(item), "activate", G_CALLBACK(maps_layer_download_missing_onscreen_maps), values ); + gtk_menu_shell_append (GTK_MENU_SHELL (menu), item); + gtk_widget_show ( item ); + + if ( vik_map_source_supports_download_only_new (MAPS_LAYER_NTH_TYPE(vml->maptype)) ) { + item = gtk_image_menu_item_new_with_mnemonic ( _("Download _New Onscreen Maps") ); + gtk_image_menu_item_set_image ( (GtkImageMenuItem*)item, gtk_image_new_from_stock (GTK_STOCK_REDO, GTK_ICON_SIZE_MENU) ); + g_signal_connect_swapped ( G_OBJECT(item), "activate", G_CALLBACK(maps_layer_download_new_onscreen_maps), values ); + gtk_menu_shell_append (GTK_MENU_SHELL (menu), item); + gtk_widget_show ( item ); + } + + item = gtk_image_menu_item_new_with_mnemonic ( _("Reload _All Onscreen Maps") ); + gtk_image_menu_item_set_image ( (GtkImageMenuItem*)item, gtk_image_new_from_stock (GTK_STOCK_REFRESH, GTK_ICON_SIZE_MENU) ); + g_signal_connect_swapped ( G_OBJECT(item), "activate", G_CALLBACK(maps_layer_redownload_all_onscreen_maps), values ); + gtk_menu_shell_append (GTK_MENU_SHELL (menu), item); + gtk_widget_show ( item ); + + item = gtk_image_menu_item_new_with_mnemonic ( _("Download Maps in _Zoom Levels...") ); + gtk_image_menu_item_set_image ( (GtkImageMenuItem*)item, gtk_image_new_from_stock (GTK_STOCK_DND_MULTIPLE, GTK_ICON_SIZE_MENU) ); + g_signal_connect_swapped ( G_OBJECT(item), "activate", G_CALLBACK(maps_layer_download_all), values ); + gtk_menu_shell_append (GTK_MENU_SHELL (menu), item); + gtk_widget_show ( item ); + } + + // Quick way to reopen MBTiles file - e.g. if it wasn't available at the time of a .vik file load + if ( vik_map_source_is_mbtiles ( map ) ) { + if ( !vml->mbtiles ) { + item = gtk_image_menu_item_new_with_mnemonic ( _("_Open MBTiles Files") ); + gtk_image_menu_item_set_image ( (GtkImageMenuItem*)item, gtk_image_new_from_stock (GTK_STOCK_OPEN, GTK_ICON_SIZE_MENU) ); + g_signal_connect_swapped ( G_OBJECT(item), "activate", G_CALLBACK(maps_layer_mbtiles_open_cb), values ); + gtk_menu_shell_append (GTK_MENU_SHELL (menu), item); + gtk_widget_show ( item ); + } + } + + item = gtk_image_menu_item_new_from_stock ( GTK_STOCK_ABOUT, NULL ); + g_signal_connect_swapped ( G_OBJECT(item), "activate", G_CALLBACK(maps_layer_about), values ); + gtk_menu_shell_append (GTK_MENU_SHELL (menu), item); + gtk_widget_show ( item ); + + // Typical users shouldn't need to use this functionality - so debug only ATM + if ( vik_debug ) { + item = gtk_image_menu_item_new_with_mnemonic ( _("Flush Map Cache") ); + gtk_image_menu_item_set_image ( (GtkImageMenuItem*)item, gtk_image_new_from_stock (GTK_STOCK_REMOVE, GTK_ICON_SIZE_MENU) ); + g_signal_connect_swapped ( G_OBJECT(item), "activate", G_CALLBACK(maps_layer_flush), values ); + gtk_menu_shell_append (GTK_MENU_SHELL (menu), item); + gtk_widget_show ( item ); + } +} + +/** + * Enable downloading maps of the current screen area either 'new' or 'everything' + */ +void vik_maps_layer_download ( VikMapsLayer *vml, VikViewport *vvp, gboolean only_new ) +{ + if ( !vml ) return; + if ( !vvp ) return; + + static menu_array_values values; + values[MA_VML] = vml; + values[MA_VVP] = vvp; + + if ( only_new ) + // Get only new maps + maps_layer_download_new_onscreen_maps ( values ); + else + // Redownload everything + maps_layer_redownload_all_onscreen_maps ( values ); +} diff --git a/src/vikmapslayer.h b/src/vikmapslayer.h new file mode 100644 index 0000000..3dbfeae --- /dev/null +++ b/src/vikmapslayer.h @@ -0,0 +1,75 @@ +/* + * viking -- GPS Data and Topo Analyzer, Explorer, and Manager + * + * Copyright (C) 2003-2005, Evan Battaglia + * + * 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., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA + * + */ + +#ifndef _VIKING_MAPSLAYER_H +#define _VIKING_MAPSLAYER_H + +#include "vikcoord.h" +#include "viklayer.h" +#include "vikviewport.h" +#include "vikmapsource.h" +#include "mapcoord.h" +#include "vikmapslayer_compat.h" + +G_BEGIN_DECLS + +#define VIK_MAPS_LAYER_TYPE (vik_maps_layer_get_type ()) +#define VIK_MAPS_LAYER(obj) (G_TYPE_CHECK_INSTANCE_CAST ((obj), VIK_MAPS_LAYER_TYPE, VikMapsLayer)) +#define VIK_MAPS_LAYER_CLASS(klass) (G_TYPE_CHECK_CLASS_CAST ((klass), VIK_MAPS_LAYER_TYPE, VikMapsLayerClass)) +#define IS_VIK_MAPS_LAYER(obj) (G_TYPE_CHECK_INSTANCE_TYPE ((obj), VIK_MAPS_LAYER_TYPE)) +#define IS_VIK_MAPS_LAYER_CLASS(klass) (G_TYPE_CHECK_CLASS_TYPE ((klass), VIK_MAPS_LAYER_TYPE)) + +typedef struct _VikMapsLayerClass VikMapsLayerClass; +struct _VikMapsLayerClass +{ + VikLayerClass object_class; +}; + +GType vik_maps_layer_get_type (); + +typedef struct _VikMapsLayer VikMapsLayer; + +typedef enum { + VIK_MAPS_CACHE_LAYOUT_VIKING=0, // CacheDir/tsz0/X/Y (NB no file extension) - Legacy default layout + VIK_MAPS_CACHE_LAYOUT_OSM, // CacheDir//OSMZoomLevel/X/Y.ext (Default ext=png) + VIK_MAPS_CACHE_LAYOUT_NUM // Last enum +} VikMapsCacheLayout; + +// OSM definition is a TMS derivative, (Global Mercator profile with Flipped Y) +// http://wiki.openstreetmap.org/wiki/Slippy_map_tilenames +// http://wiki.openstreetmap.org/wiki/TMS +// http://wiki.osgeo.org/wiki/Tile_Map_Service_Specification + +void maps_layer_init (); +void maps_layer_set_autodownload_default ( gboolean autodownload ); +void maps_layer_set_cache_default ( VikMapsCacheLayout layout ); +guint vik_maps_layer_get_default_map_type (); +void maps_layer_register_map_source ( VikMapSource *map ); +void vik_maps_layer_download_section ( VikMapsLayer *vml, VikViewport *vvp, VikCoord *ul, VikCoord *br, gdouble zoom ); +guint vik_maps_layer_get_map_type(VikMapsLayer *vml); +void vik_maps_layer_set_map_type(VikMapsLayer *vml, guint map_type); +gchar *vik_maps_layer_get_map_label(VikMapsLayer *vml); +gchar *maps_layer_default_dir (); +void vik_maps_layer_download ( VikMapsLayer *vml, VikViewport *vvp, gboolean only_new ); + +G_END_DECLS + +#endif diff --git a/src/vikmapslayer_compat.c b/src/vikmapslayer_compat.c new file mode 100644 index 0000000..f143265 --- /dev/null +++ b/src/vikmapslayer_compat.c @@ -0,0 +1,39 @@ +/* + * viking -- GPS Data and Topo Analyzer, Explorer, and Manager + * + * Copyright (C) 2005, Evan Battaglia + * Copyright (C) 2008-2009, Guilhem Bonnefille + * + * UTM multi-zone stuff by Kit Transue + * Dynamic map type by Guilhem Bonnefille + * + * 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., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA + * + */ + +#ifdef HAVE_CONFIG_H +#include "config.h" +#endif + +#include "vikmapslayer.h" +#include "vikmapslayer_compat.h" +#include "vikmaptype.h" + +void maps_layer_register_type ( const char *label, guint id, VikMapsLayer_MapType *map_type ) +{ + g_assert(id == map_type->uniq_id); + VikMapType *object = vik_map_type_new_with_id (*map_type, label); + maps_layer_register_map_source ( VIK_MAP_SOURCE (object) ); +} diff --git a/src/vikmapslayer_compat.h b/src/vikmapslayer_compat.h new file mode 100644 index 0000000..c149705 --- /dev/null +++ b/src/vikmapslayer_compat.h @@ -0,0 +1,48 @@ +/* + * viking -- GPS Data and Topo Analyzer, Explorer, and Manager + * + * Copyright (C) 2003-2005, Evan Battaglia + * + * 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., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA + * + */ + +#ifndef _VIKING_MAPSLAYER_COMPAT_H +#define _VIKING_MAPSLAYER_COMPAT_H + +#include "vikcoord.h" +#include "vikviewport.h" +#include "mapcoord.h" + +G_BEGIN_DECLS + +typedef struct { + guint16 uniq_id; + guint16 tilesize_x; + guint16 tilesize_y; + guint drawmode; + gboolean (*coord_to_mapcoord) ( const VikCoord *src, gdouble xzoom, gdouble yzoom, MapCoord *dest ); + void (*mapcoord_to_center_coord) ( MapCoord *src, VikCoord *dest ); + int (*download) ( MapCoord *src, const gchar *dest_fn, void *handle ); + void *(*download_handle_init) ( ); + void (*download_handle_cleanup) ( void *handle ); + /* TODO: constant size (yay!) */ +} VikMapsLayer_MapType; + +void maps_layer_register_type ( const char *label, guint id, VikMapsLayer_MapType *map_type ); + +G_END_DECLS + +#endif diff --git a/src/vikmapsource.c b/src/vikmapsource.c new file mode 100644 index 0000000..2d5d1fa --- /dev/null +++ b/src/vikmapsource.c @@ -0,0 +1,503 @@ +/* -*- Mode: C; indent-tabs-mode: t; c-basic-offset: 4; tab-width: 4 -*- */ +/* + * viking + * Copyright (C) 2009-2010, Guilhem Bonnefille + * + * viking 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 3 of the License, or + * (at your option) any later version. + * + * viking 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, see . + */ + + /** + * SECTION:vikmapsource + * @short_description: the base class to describe map source + * + * The #VikMapSource class is both the interface and the base class + * for the hierarchie of map source. + */ +#ifdef HAVE_CONFIG_H +#include "config.h" +#endif + +#include "vikviewport.h" +#include "vikcoord.h" +#include "mapcoord.h" +#include "download.h" +#include "vikmapsource.h" + +static void vik_map_source_init (VikMapSource *object); +static void vik_map_source_finalize (GObject *object); +static void vik_map_source_class_init (VikMapSourceClass *klass); + +static gboolean _supports_download_only_new (VikMapSource *object); + +G_DEFINE_ABSTRACT_TYPE (VikMapSource, vik_map_source, G_TYPE_OBJECT); + +static void +vik_map_source_init (VikMapSource *object) +{ + /* TODO: Add initialization code here */ +} + +static void +vik_map_source_finalize (GObject *object) +{ + /* TODO: Add deinitalization code here */ + + G_OBJECT_CLASS (vik_map_source_parent_class)->finalize (object); +} + +static void +vik_map_source_class_init (VikMapSourceClass *klass) +{ + GObjectClass* object_class = G_OBJECT_CLASS (klass); + + klass->get_copyright = NULL; + klass->get_license = NULL; + klass->get_license_url = NULL; + klass->get_logo = NULL; + klass->get_name = NULL; + klass->get_uniq_id = NULL; + klass->get_label = NULL; + klass->get_tilesize_x = NULL; + klass->get_tilesize_y = NULL; + klass->get_scale = NULL; + klass->get_drawmode = NULL; + klass->is_direct_file_access = NULL; + klass->is_mbtiles = NULL; + klass->supports_download_only_new = _supports_download_only_new; + klass->get_zoom_min = NULL; + klass->get_zoom_max = NULL; + klass->get_lat_min = NULL; + klass->get_lat_max = NULL; + klass->get_lon_min = NULL; + klass->get_lon_max = NULL; + klass->coord_to_mapcoord = NULL; + klass->mapcoord_to_center_coord = NULL; + klass->download = NULL; + klass->download_handle_init = NULL; + klass->download_handle_cleanup = NULL; + + object_class->finalize = vik_map_source_finalize; +} + +gboolean +_supports_download_only_new (VikMapSource *self) +{ + // Default feature: does not support + return FALSE; +} + +/** + * vik_map_source_get_copyright: + * @self: the VikMapSource of interest. + * @bbox: bounding box of interest. + * @zoom: the zoom level of interest. + * @fct: the callback function to use to return matching copyrights. + * @data: the user data to use to call the callbaack function. + * + * Retrieve copyright(s) for the corresponding bounding box and zoom level. + */ +void +vik_map_source_get_copyright (VikMapSource *self, LatLonBBox bbox, gdouble zoom, void (*fct)(VikViewport*,const gchar*), void *data) +{ + VikMapSourceClass *klass; + g_return_if_fail (self != NULL); + g_return_if_fail (VIK_IS_MAP_SOURCE (self)); + klass = VIK_MAP_SOURCE_GET_CLASS(self); + + g_return_if_fail (klass->get_copyright != NULL); + + (*klass->get_copyright)(self, bbox, zoom, fct, data); +} + +const gchar * +vik_map_source_get_license (VikMapSource *self) +{ + VikMapSourceClass *klass; + g_return_val_if_fail (self != NULL, NULL); + g_return_val_if_fail (VIK_IS_MAP_SOURCE (self), NULL); + klass = VIK_MAP_SOURCE_GET_CLASS(self); + + g_return_val_if_fail (klass->get_license != NULL, NULL); + + return (*klass->get_license)(self); +} + +const gchar * +vik_map_source_get_license_url (VikMapSource *self) +{ + VikMapSourceClass *klass; + g_return_val_if_fail (self != NULL, NULL); + g_return_val_if_fail (VIK_IS_MAP_SOURCE (self), NULL); + klass = VIK_MAP_SOURCE_GET_CLASS(self); + + g_return_val_if_fail (klass->get_license_url != NULL, NULL); + + return (*klass->get_license_url)(self); +} + +const GdkPixbuf * +vik_map_source_get_logo (VikMapSource *self) +{ + VikMapSourceClass *klass; + g_return_val_if_fail (self != NULL, NULL); + g_return_val_if_fail (VIK_IS_MAP_SOURCE (self), NULL); + klass = VIK_MAP_SOURCE_GET_CLASS(self); + + g_return_val_if_fail (klass->get_logo != NULL, NULL); + + return (*klass->get_logo)(self); +} + +const gchar * +vik_map_source_get_name (VikMapSource *self) +{ + VikMapSourceClass *klass; + g_return_val_if_fail (self != NULL, NULL); + g_return_val_if_fail (VIK_IS_MAP_SOURCE (self), NULL); + klass = VIK_MAP_SOURCE_GET_CLASS(self); + + g_return_val_if_fail (klass->get_name != NULL, NULL); + + return (*klass->get_name)(self); +} + +guint16 +vik_map_source_get_uniq_id (VikMapSource *self) +{ + VikMapSourceClass *klass; + g_return_val_if_fail (self != NULL, (guint16 )0); + g_return_val_if_fail (VIK_IS_MAP_SOURCE (self), (guint16 )0); + klass = VIK_MAP_SOURCE_GET_CLASS(self); + + g_return_val_if_fail (klass->get_uniq_id != NULL, (guint16 )0); + + return (*klass->get_uniq_id)(self); +} + +const gchar * +vik_map_source_get_label (VikMapSource *self) +{ + VikMapSourceClass *klass; + g_return_val_if_fail (self != NULL, NULL); + g_return_val_if_fail (VIK_IS_MAP_SOURCE (self), NULL); + klass = VIK_MAP_SOURCE_GET_CLASS(self); + + g_return_val_if_fail (klass->get_label != NULL, NULL); + + return (*klass->get_label)(self); +} + +guint16 +vik_map_source_get_tilesize_x (VikMapSource *self) +{ + VikMapSourceClass *klass; + g_return_val_if_fail (self != NULL, (guint16 )0); + g_return_val_if_fail (VIK_IS_MAP_SOURCE (self), (guint16 )0); + klass = VIK_MAP_SOURCE_GET_CLASS(self); + + g_return_val_if_fail (klass->get_tilesize_x != NULL, (guint16 )0); + + return (*klass->get_tilesize_x)(self); +} + +guint16 +vik_map_source_get_tilesize_y (VikMapSource *self) +{ + VikMapSourceClass *klass; + g_return_val_if_fail (self != NULL, (guint16 )0); + g_return_val_if_fail (VIK_IS_MAP_SOURCE (self), (guint16 )0); + klass = VIK_MAP_SOURCE_GET_CLASS(self); + + g_return_val_if_fail (klass->get_tilesize_y != NULL, (guint16 )0); + + return (*klass->get_tilesize_y)(self); +} + +gdouble +vik_map_source_get_scale (VikMapSource *self) +{ + VikMapSourceClass *klass; + g_return_val_if_fail (self != NULL, (gdouble)1.0); + g_return_val_if_fail (VIK_IS_MAP_SOURCE (self), (gdouble)1.0); + klass = VIK_MAP_SOURCE_GET_CLASS(self); + + g_return_val_if_fail (klass->get_scale != NULL, (gdouble)1.0); + + return (*klass->get_scale)(self); +} + +VikViewportDrawMode +vik_map_source_get_drawmode (VikMapSource *self) +{ + VikMapSourceClass *klass; + g_return_val_if_fail (self != NULL, (VikViewportDrawMode )0); + g_return_val_if_fail (VIK_IS_MAP_SOURCE (self), (VikViewportDrawMode )0); + klass = VIK_MAP_SOURCE_GET_CLASS(self); + + g_return_val_if_fail (klass->get_drawmode != NULL, (VikViewportDrawMode )0); + + return (*klass->get_drawmode)(self); +} + +/** + * vik_map_source_is_direct_file_access: + * @self: the VikMapSource of interest. + * + * Return true when we can bypass all this download malarky + * Treat the files as a pre generated data set in OSM tile server layout: tiledir/%d/%d/%d.png + */ +gboolean +vik_map_source_is_direct_file_access (VikMapSource * self) +{ + VikMapSourceClass *klass; + g_return_val_if_fail (self != NULL, 0); + g_return_val_if_fail (VIK_IS_MAP_SOURCE (self), 0); + klass = VIK_MAP_SOURCE_GET_CLASS(self); + + g_return_val_if_fail (klass->is_direct_file_access != NULL, 0); + + return (*klass->is_direct_file_access)(self); +} + +/** + * vik_map_source_is_mbtiles: + * @self: the VikMapSource of interest. + * + * Return true when the map is in an MB Tiles format. + * See http://github.com/mapbox/mbtiles-spec + * (Read Only ATM) + */ +gboolean +vik_map_source_is_mbtiles (VikMapSource * self) +{ + VikMapSourceClass *klass; + g_return_val_if_fail (self != NULL, 0); + g_return_val_if_fail (VIK_IS_MAP_SOURCE (self), 0); + klass = VIK_MAP_SOURCE_GET_CLASS(self); + + g_return_val_if_fail (klass->is_mbtiles != NULL, 0); + + return (*klass->is_mbtiles)(self); +} + +/** + * vik_map_source_is_osm_meta_tiles: + * @self: the VikMapSource of interest. + * + * Treat the files as a pre generated data set directly by tirex or renderd + * tiledir/Z/[xxxxyyyy]/[xxxxyyyy]/[xxxxyyyy]/[xxxxyyyy]/[xxxxyyyy].meta + */ +gboolean vik_map_source_is_osm_meta_tiles (VikMapSource * self) +{ + VikMapSourceClass *klass; + g_return_val_if_fail (self != NULL, 0); + g_return_val_if_fail (VIK_IS_MAP_SOURCE (self), 0); + klass = VIK_MAP_SOURCE_GET_CLASS(self); + + g_return_val_if_fail (klass->is_osm_meta_tiles != NULL, 0); + + return (*klass->is_osm_meta_tiles)(self); +} + +gboolean +vik_map_source_supports_download_only_new (VikMapSource * self) +{ + VikMapSourceClass *klass; + g_return_val_if_fail (self != NULL, 0); + g_return_val_if_fail (VIK_IS_MAP_SOURCE (self), 0); + klass = VIK_MAP_SOURCE_GET_CLASS(self); + + g_return_val_if_fail (klass->supports_download_only_new != NULL, 0); + + return (*klass->supports_download_only_new)(self); +} + +/** + * + */ +guint8 +vik_map_source_get_zoom_min (VikMapSource * self) +{ + VikMapSourceClass *klass; + g_return_val_if_fail (self != NULL, 0); + g_return_val_if_fail (VIK_IS_MAP_SOURCE (self), 0); + klass = VIK_MAP_SOURCE_GET_CLASS(self); + g_return_val_if_fail (klass->get_zoom_min != NULL, 0); + return (*klass->get_zoom_min)(self); +} + +/** + * + */ +guint8 +vik_map_source_get_zoom_max (VikMapSource * self) +{ + VikMapSourceClass *klass; + g_return_val_if_fail (self != NULL, 18); + g_return_val_if_fail (VIK_IS_MAP_SOURCE (self), 18); + klass = VIK_MAP_SOURCE_GET_CLASS(self); + g_return_val_if_fail (klass->get_zoom_max != NULL, 18); + return (*klass->get_zoom_max)(self); +} + +/** + * + */ +gdouble +vik_map_source_get_lat_max (VikMapSource * self) +{ + VikMapSourceClass *klass; + g_return_val_if_fail (self != NULL, 90.0); + g_return_val_if_fail (VIK_IS_MAP_SOURCE (self), 90.0); + klass = VIK_MAP_SOURCE_GET_CLASS(self); + g_return_val_if_fail (klass->get_lat_max != NULL, 90.0); + return (*klass->get_lat_max)(self); +} + +/** + * + */ +gdouble +vik_map_source_get_lat_min (VikMapSource * self) +{ + VikMapSourceClass *klass; + g_return_val_if_fail (self != NULL, -90.0); + g_return_val_if_fail (VIK_IS_MAP_SOURCE (self), -90.0); + klass = VIK_MAP_SOURCE_GET_CLASS(self); + g_return_val_if_fail (klass->get_lat_min != NULL, -90.0); + return (*klass->get_lat_min)(self); +} + +/** + * + */ +gdouble +vik_map_source_get_lon_max (VikMapSource * self) +{ + VikMapSourceClass *klass; + g_return_val_if_fail (self != NULL, 180.0); + g_return_val_if_fail (VIK_IS_MAP_SOURCE (self), 180.0); + klass = VIK_MAP_SOURCE_GET_CLASS(self); + g_return_val_if_fail (klass->get_lon_max != NULL, 180.0); + return (*klass->get_lon_max)(self); +} + +/** + * + */ +gdouble +vik_map_source_get_lon_min (VikMapSource * self) +{ + VikMapSourceClass *klass; + g_return_val_if_fail (self != NULL, -180.0); + g_return_val_if_fail (VIK_IS_MAP_SOURCE (self), -180.0); + klass = VIK_MAP_SOURCE_GET_CLASS(self); + g_return_val_if_fail (klass->get_lon_min != NULL, -180.0); + return (*klass->get_lon_min)(self); +} + +/** + * vik_map_source_get_file_extension: + * @self: the VikMapSource of interest. + * + * Returns the file extension of files held on disk. + * Typically .png but may be .jpg or whatever the user defines + * + */ +const gchar * +vik_map_source_get_file_extension (VikMapSource * self) +{ + VikMapSourceClass *klass; + g_return_val_if_fail (self != NULL, NULL); + g_return_val_if_fail (VIK_IS_MAP_SOURCE (self), NULL); + klass = VIK_MAP_SOURCE_GET_CLASS(self); + + g_return_val_if_fail (klass->get_file_extension != NULL, NULL); + + return (*klass->get_file_extension)(self); +} + +gboolean +vik_map_source_coord_to_mapcoord (VikMapSource *self, const VikCoord *src, gdouble xzoom, gdouble yzoom, MapCoord *dest ) +{ + VikMapSourceClass *klass; + g_return_val_if_fail (self != NULL, FALSE); + g_return_val_if_fail (VIK_IS_MAP_SOURCE (self), FALSE); + klass = VIK_MAP_SOURCE_GET_CLASS(self); + + g_return_val_if_fail (klass->coord_to_mapcoord != NULL, FALSE); + + return (*klass->coord_to_mapcoord)(self, src, xzoom, yzoom, dest); +} + +void +vik_map_source_mapcoord_to_center_coord (VikMapSource *self, MapCoord *src, VikCoord *dest) +{ + VikMapSourceClass *klass; + g_return_if_fail (self != NULL); + g_return_if_fail (VIK_IS_MAP_SOURCE (self)); + klass = VIK_MAP_SOURCE_GET_CLASS(self); + + g_return_if_fail (klass->mapcoord_to_center_coord != NULL); + + (*klass->mapcoord_to_center_coord)(self, src, dest); +} + +/** + * vik_map_source_download: + * @self: The VikMapSource of interest. + * @src: The map location to download + * @dest_fn: The filename to save the result in + * @handle: Potential reusable Curl Handle (may be NULL) + * + * Returns: How successful the download was as per the type #DownloadResult_t + */ +DownloadResult_t +vik_map_source_download (VikMapSource * self, MapCoord * src, const gchar * dest_fn, void *handle) +{ + VikMapSourceClass *klass; + g_return_val_if_fail (self != NULL, 0); + g_return_val_if_fail (VIK_IS_MAP_SOURCE (self), 0); + klass = VIK_MAP_SOURCE_GET_CLASS(self); + + g_return_val_if_fail (klass->download != NULL, 0); + + return (*klass->download)(self, src, dest_fn, handle); +} + +void * +vik_map_source_download_handle_init (VikMapSource *self) +{ + VikMapSourceClass *klass; + g_return_val_if_fail (self != NULL, 0); + g_return_val_if_fail (VIK_IS_MAP_SOURCE (self), 0); + klass = VIK_MAP_SOURCE_GET_CLASS(self); + + g_return_val_if_fail (klass->download_handle_init != NULL, 0); + + return (*klass->download_handle_init)(self); +} + +void +vik_map_source_download_handle_cleanup (VikMapSource * self, void * handle) +{ + VikMapSourceClass *klass; + g_return_if_fail (self != NULL); + g_return_if_fail (VIK_IS_MAP_SOURCE (self)); + klass = VIK_MAP_SOURCE_GET_CLASS(self); + + g_return_if_fail (klass->download_handle_cleanup != NULL); + + (*klass->download_handle_cleanup)(self, handle); +} diff --git a/src/vikmapsource.h b/src/vikmapsource.h new file mode 100644 index 0000000..df5f5e2 --- /dev/null +++ b/src/vikmapsource.h @@ -0,0 +1,115 @@ +/* -*- Mode: C; indent-tabs-mode: t; c-basic-offset: 4; tab-width: 4 -*- */ +/* + * viking + * Copyright (C) 2009-2010, Guilhem Bonnefille + * + * viking 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 3 of the License, or + * (at your option) any later version. + * + * viking 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, see . + */ + +#ifndef _VIK_MAP_SOURCE_H_ +#define _VIK_MAP_SOURCE_H_ + +#include + +#include "vikviewport.h" +#include "vikcoord.h" +#include "mapcoord.h" +#include "bbox.h" + +G_BEGIN_DECLS + +#define VIK_TYPE_MAP_SOURCE (vik_map_source_get_type ()) +#define VIK_MAP_SOURCE(obj) (G_TYPE_CHECK_INSTANCE_CAST ((obj), VIK_TYPE_MAP_SOURCE, VikMapSource)) +#define VIK_MAP_SOURCE_CLASS(klass) (G_TYPE_CHECK_CLASS_CAST ((klass), VIK_TYPE_MAP_SOURCE, VikMapSourceClass)) +#define VIK_IS_MAP_SOURCE(obj) (G_TYPE_CHECK_INSTANCE_TYPE ((obj), VIK_TYPE_MAP_SOURCE)) +#define VIK_IS_MAP_SOURCE_CLASS(klass) (G_TYPE_CHECK_CLASS_TYPE ((klass), VIK_TYPE_MAP_SOURCE)) +#define VIK_MAP_SOURCE_GET_CLASS(obj) (G_TYPE_INSTANCE_GET_CLASS ((obj), VIK_TYPE_MAP_SOURCE, VikMapSourceClass)) + +typedef struct _VikMapSourceClass VikMapSourceClass; +typedef struct _VikMapSource VikMapSource; + +struct _VikMapSourceClass +{ + GObjectClass parent_class; + + /* Legal info */ + void (* get_copyright) (VikMapSource * self, LatLonBBox bbox, gdouble zoom, void (*fct)(VikViewport*,const gchar*), void *data); + const gchar *(* get_license) (VikMapSource * self); + const gchar *(* get_license_url) (VikMapSource * self); + const GdkPixbuf *(* get_logo) (VikMapSource * self); + + const gchar *(* get_name) (VikMapSource * self); + guint16 (* get_uniq_id) (VikMapSource * self); + const gchar * (* get_label) (VikMapSource * self); + guint16 (* get_tilesize_x) (VikMapSource * self); + guint16 (* get_tilesize_y) (VikMapSource * self); + gdouble (* get_scale) (VikMapSource * self); + VikViewportDrawMode (* get_drawmode) (VikMapSource * self); + gboolean (* is_direct_file_access) (VikMapSource * self); + gboolean (* is_mbtiles) (VikMapSource * self); + gboolean (* is_osm_meta_tiles) (VikMapSource * self); + gboolean (* supports_download_only_new) (VikMapSource * self); + guint8 (* get_zoom_min) (VikMapSource * self); + guint8 (* get_zoom_max) (VikMapSource * self); + gdouble (* get_lat_min) (VikMapSource * self); + gdouble (* get_lat_max) (VikMapSource * self); + gdouble (* get_lon_min) (VikMapSource * self); + gdouble (* get_lon_max) (VikMapSource * self); + const gchar * (* get_file_extension) (VikMapSource * self); + gboolean (* coord_to_mapcoord) (VikMapSource * self, const VikCoord * src, gdouble xzoom, gdouble yzoom, MapCoord * dest); + void (* mapcoord_to_center_coord) (VikMapSource * self, MapCoord * src, VikCoord * dest); + int (* download) (VikMapSource * self, MapCoord * src, const gchar * dest_fn, void * handle); + void * (* download_handle_init) (VikMapSource * self); + void (* download_handle_cleanup) (VikMapSource * self, void * handle); +}; + +struct _VikMapSource +{ + GObject parent_instance; +}; + +GType vik_map_source_get_type (void) G_GNUC_CONST; + +void vik_map_source_get_copyright (VikMapSource * self, LatLonBBox bbox, gdouble zoom, void (*fct)(VikViewport*,const gchar*), void *data); +const gchar *vik_map_source_get_license (VikMapSource * self); +const gchar *vik_map_source_get_license_url (VikMapSource * self); +const GdkPixbuf *vik_map_source_get_logo (VikMapSource * self); + +const gchar *vik_map_source_get_name (VikMapSource * self); +guint16 vik_map_source_get_uniq_id (VikMapSource * self); +const gchar *vik_map_source_get_label (VikMapSource * self); +guint16 vik_map_source_get_tilesize_x (VikMapSource * self); +guint16 vik_map_source_get_tilesize_y (VikMapSource * self); +gdouble vik_map_source_get_scale (VikMapSource * self); +VikViewportDrawMode vik_map_source_get_drawmode (VikMapSource * self); +gboolean vik_map_source_is_direct_file_access (VikMapSource * self); +gboolean vik_map_source_is_mbtiles (VikMapSource * self); +gboolean vik_map_source_is_osm_meta_tiles (VikMapSource * self); +gboolean vik_map_source_supports_download_only_new (VikMapSource * self); +guint8 vik_map_source_get_zoom_min (VikMapSource * self); +guint8 vik_map_source_get_zoom_max (VikMapSource * self); +gdouble vik_map_source_get_lat_min (VikMapSource * self); +gdouble vik_map_source_get_lat_max (VikMapSource * self); +gdouble vik_map_source_get_lon_min (VikMapSource * self); +gdouble vik_map_source_get_lon_max (VikMapSource * self); +const gchar * vik_map_source_get_file_extension (VikMapSource * self); +gboolean vik_map_source_coord_to_mapcoord (VikMapSource * self, const VikCoord *src, gdouble xzoom, gdouble yzoom, MapCoord *dest ); +void vik_map_source_mapcoord_to_center_coord (VikMapSource * self, MapCoord *src, VikCoord *dest); +int vik_map_source_download (VikMapSource * self, MapCoord * src, const gchar * dest_fn, void * handle); +void * vik_map_source_download_handle_init (VikMapSource * self); +void vik_map_source_download_handle_cleanup (VikMapSource * self, void * handle); + +G_END_DECLS + +#endif /* _VIK_MAP_SOURCE_H_ */ diff --git a/src/vikmapsourcedefault.c b/src/vikmapsourcedefault.c new file mode 100644 index 0000000..df5bb02 --- /dev/null +++ b/src/vikmapsourcedefault.c @@ -0,0 +1,604 @@ +/* -*- Mode: C; indent-tabs-mode: t; c-basic-offset: 4; tab-width: 4 -*- */ +/* + * viking + * Copyright (C) 2009-2010, Guilhem Bonnefille + * + * viking 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 3 of the License, or + * (at your option) any later version. + * + * viking 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, see . + */ + + /** + * SECTION:vikmapsourcedefault + * @short_description: the base class implementing most of generic features + * + * The #VikMapSourceDefault class is the base class implementing most of + * generic feature, using properties or reducing complexity of some + * functions. + */ + +#include "vikmapsourcedefault.h" +#include "vikenumtypes.h" +#include "download.h" +#include "string.h" + +static void map_source_get_copyright (VikMapSource *self, LatLonBBox bbox, gdouble zoom, void (*fct)(VikViewport*,const gchar*), void *data); +static const gchar *map_source_get_license (VikMapSource *self); +static const gchar *map_source_get_license_url (VikMapSource *self); +static const GdkPixbuf *map_source_get_logo (VikMapSource *self); + +static const gchar *map_source_get_name (VikMapSource *self); +static guint16 map_source_get_uniq_id (VikMapSource *self); +static const gchar *map_source_get_label (VikMapSource *self); +static guint16 map_source_get_tilesize_x (VikMapSource *self); +static guint16 map_source_get_tilesize_y (VikMapSource *self); +static gdouble map_source_get_scale (VikMapSource *self); +static VikViewportDrawMode map_source_get_drawmode (VikMapSource *self); +static const gchar *map_source_get_file_extension (VikMapSource *self); + +static DownloadResult_t _download ( VikMapSource *self, MapCoord *src, const gchar *dest_fn, void *handle ); +static void * _download_handle_init ( VikMapSource *self ); +static void _download_handle_cleanup ( VikMapSource *self, void *handle ); + +typedef struct _VikMapSourceDefaultPrivate VikMapSourceDefaultPrivate; +struct _VikMapSourceDefaultPrivate +{ + /* legal stuff */ + gchar *copyright; + gchar *license; + gchar *license_url; + GdkPixbuf *logo; + + gchar *name; + guint16 uniq_id; + gchar *label; + guint16 tilesize_x; + guint16 tilesize_y; + gdouble scale; + VikViewportDrawMode drawmode; + gchar *file_extension; +}; + +#define VIK_MAP_SOURCE_DEFAULT_PRIVATE(o) (G_TYPE_INSTANCE_GET_PRIVATE ((o), VIK_TYPE_MAP_SOURCE_DEFAULT, VikMapSourceDefaultPrivate)) + +/* properties */ +enum +{ + PROP_0, + + PROP_NAME, + PROP_ID, + PROP_LABEL, + PROP_TILESIZE_X, + PROP_TILESIZE_Y, + PROP_SCALE, + PROP_DRAWMODE, + PROP_COPYRIGHT, + PROP_LICENSE, + PROP_LICENSE_URL, + PROP_FILE_EXTENSION, +}; + +G_DEFINE_ABSTRACT_TYPE (VikMapSourceDefault, vik_map_source_default, VIK_TYPE_MAP_SOURCE); + +static void +vik_map_source_default_init (VikMapSourceDefault *object) +{ + VikMapSourceDefault *self = VIK_MAP_SOURCE_DEFAULT (object); + VikMapSourceDefaultPrivate *priv = VIK_MAP_SOURCE_DEFAULT_PRIVATE (self); + + priv->label = NULL; + priv->copyright = NULL; + priv->license = NULL; + priv->license_url = NULL; + priv->logo = NULL; + priv->name = NULL; + priv->file_extension = NULL; +} + +static void +vik_map_source_default_finalize (GObject *object) +{ + VikMapSourceDefault *self = VIK_MAP_SOURCE_DEFAULT (object); + VikMapSourceDefaultPrivate *priv = VIK_MAP_SOURCE_DEFAULT_PRIVATE (self); + + g_free (priv->label); + priv->label = NULL; + g_free (priv->copyright); + priv->copyright = NULL; + g_free (priv->license); + priv->license = NULL; + g_free (priv->license_url); + priv->license_url = NULL; + g_free (priv->logo); + priv->license_url = NULL; + g_free (priv->name); + priv->name = NULL; + g_free (priv->file_extension); + priv->file_extension = NULL; + + G_OBJECT_CLASS (vik_map_source_default_parent_class)->finalize (object); +} + +static void +vik_map_source_default_set_property (GObject *object, + guint property_id, + const GValue *value, + GParamSpec *pspec) +{ + VikMapSourceDefault *self = VIK_MAP_SOURCE_DEFAULT (object); + VikMapSourceDefaultPrivate *priv = VIK_MAP_SOURCE_DEFAULT_PRIVATE (self); + + switch (property_id) + { + case PROP_NAME: + // Sanitize the name here for file usage + // A simple check just to prevent containing slashes ATM + g_free (priv->name); + priv->name = g_strdup(g_value_get_string (value)); + g_strdelimit (priv->name, "\\/", 'x' ); + break; + + case PROP_ID: + priv->uniq_id = g_value_get_uint (value); + break; + + case PROP_LABEL: + g_free (priv->label); + priv->label = g_strdup(g_value_get_string (value)); + break; + + case PROP_TILESIZE_X: + priv->tilesize_x = g_value_get_uint (value); + break; + + case PROP_TILESIZE_Y: + priv->tilesize_y = g_value_get_uint (value); + break; + + case PROP_SCALE: + priv->scale = g_value_get_double (value); + break; + + case PROP_DRAWMODE: + priv->drawmode = g_value_get_enum(value); + break; + + case PROP_COPYRIGHT: + g_free (priv->copyright); + priv->copyright = g_strdup(g_value_get_string (value)); + break; + + case PROP_LICENSE: + g_free (priv->license); + priv->license = g_strdup(g_value_get_string (value)); + break; + + case PROP_LICENSE_URL: + g_free (priv->license_url); + priv->license_url = g_strdup(g_value_get_string (value)); + break; + + case PROP_FILE_EXTENSION: + g_free (priv->file_extension); + priv->file_extension = g_strdup(g_value_get_string(value)); + break; + + default: + /* We don't have any other property... */ + G_OBJECT_WARN_INVALID_PROPERTY_ID (object, property_id, pspec); + break; + } +} + +static void +vik_map_source_default_get_property (GObject *object, + guint property_id, + GValue *value, + GParamSpec *pspec) +{ + VikMapSourceDefault *self = VIK_MAP_SOURCE_DEFAULT (object); + VikMapSourceDefaultPrivate *priv = VIK_MAP_SOURCE_DEFAULT_PRIVATE (self); + + switch (property_id) + { + case PROP_NAME: + g_value_set_string (value, priv->name); + break; + + case PROP_ID: + g_value_set_uint (value, priv->uniq_id); + break; + + case PROP_LABEL: + g_value_set_string (value, priv->label); + break; + + case PROP_TILESIZE_X: + g_value_set_uint (value, priv->tilesize_x); + break; + + case PROP_TILESIZE_Y: + g_value_set_uint (value, priv->tilesize_y); + break; + + case PROP_SCALE: + g_value_set_double (value, priv->scale); + break; + + case PROP_DRAWMODE: + g_value_set_enum (value, priv->drawmode); + break; + + case PROP_COPYRIGHT: + g_value_set_string (value, priv->copyright); + break; + + case PROP_LICENSE: + g_value_set_string (value, priv->license); + break; + + case PROP_LICENSE_URL: + g_value_set_string (value, priv->license_url); + break; + + case PROP_FILE_EXTENSION: + g_value_set_string (value, priv->file_extension); + break; + + default: + /* We don't have any other property... */ + G_OBJECT_WARN_INVALID_PROPERTY_ID (object, property_id, pspec); + break; + } +} + +static void +vik_map_source_default_class_init (VikMapSourceDefaultClass *klass) +{ + GObjectClass* object_class = G_OBJECT_CLASS (klass); + VikMapSourceClass* parent_class = VIK_MAP_SOURCE_CLASS (klass); + GParamSpec *pspec = NULL; + + object_class->set_property = vik_map_source_default_set_property; + object_class->get_property = vik_map_source_default_get_property; + + /* Overiding methods */ + parent_class->get_copyright = map_source_get_copyright; + parent_class->get_license = map_source_get_license; + parent_class->get_license_url = map_source_get_license_url; + parent_class->get_logo = map_source_get_logo; + parent_class->get_name = map_source_get_name; + parent_class->get_uniq_id = map_source_get_uniq_id; + parent_class->get_label = map_source_get_label; + parent_class->get_tilesize_x = map_source_get_tilesize_x; + parent_class->get_tilesize_y = map_source_get_tilesize_y; + parent_class->get_scale = map_source_get_scale; + parent_class->get_drawmode = map_source_get_drawmode; + parent_class->get_file_extension = map_source_get_file_extension; + parent_class->download = _download; + parent_class->download_handle_init = _download_handle_init; + parent_class->download_handle_cleanup = _download_handle_cleanup; + + /* Default implementation of methods */ + klass->get_uri = NULL; + klass->get_hostname = NULL; + klass->get_download_options = NULL; + + pspec = g_param_spec_string ("name", + "Name", + "The name of the map that may be used as the file cache directory", + "Unknown" /* default value */, + G_PARAM_CONSTRUCT_ONLY | G_PARAM_READWRITE); + g_object_class_install_property (object_class, PROP_NAME, pspec); + + pspec = g_param_spec_uint ("id", + "Id of the tool", + "Set the id", + 0 /* minimum value */, + G_MAXUINT /* maximum value */, + 0 /* default value */, + G_PARAM_CONSTRUCT_ONLY | G_PARAM_READWRITE); + g_object_class_install_property (object_class, PROP_ID, pspec); + + pspec = g_param_spec_string ("label", + "Label", + "The label of the map source", + "" /* default value */, + G_PARAM_CONSTRUCT_ONLY | G_PARAM_READWRITE); + g_object_class_install_property (object_class, PROP_LABEL, pspec); + + pspec = g_param_spec_uint ("tilesize-x", + "TileSizeX", + "Set the size of the tile (x)", + 0 /* minimum value */, + G_MAXUINT16 /* maximum value */, + 0 /* default value */, + G_PARAM_READWRITE); + g_object_class_install_property (object_class, PROP_TILESIZE_X, pspec); + + pspec = g_param_spec_uint ("tilesize-y", + "TileSizeY", + "Set the size of the tile (y)", + 0 /* minimum value */, + G_MAXUINT16 /* maximum value */, + 0 /* default value */, + G_PARAM_READWRITE); + g_object_class_install_property (object_class, PROP_TILESIZE_Y, pspec); + + pspec = g_param_spec_double ("scale", + "Scale", + "Scale of a tile", + 0.0, // minimum value + 99999.0, // maximum value + 1.0, // default value + G_PARAM_READWRITE); + g_object_class_install_property (object_class, PROP_SCALE, pspec); + + pspec = g_param_spec_enum("drawmode", + "Drawmode", + "The mode used to draw map", + VIK_TYPE_VIEWPORT_DRAW_MODE, + VIK_VIEWPORT_DRAWMODE_UTM, + G_PARAM_READWRITE); + g_object_class_install_property(object_class, PROP_DRAWMODE, pspec); + + pspec = g_param_spec_string ("copyright", + "Copyright", + "The copyright of the map source", + NULL, + G_PARAM_READWRITE); + g_object_class_install_property (object_class, PROP_COPYRIGHT, pspec); + + pspec = g_param_spec_string ("license", + "License", + "The license of the map source", + NULL, + G_PARAM_CONSTRUCT_ONLY | G_PARAM_READWRITE); + g_object_class_install_property (object_class, PROP_LICENSE, pspec); + + pspec = g_param_spec_string ("license-url", + "License URL", + "The URL of the license of the map source", + NULL, + G_PARAM_CONSTRUCT_ONLY | G_PARAM_READWRITE); + g_object_class_install_property (object_class, PROP_LICENSE_URL, pspec); + + pspec = g_param_spec_string ("file-extension", + "File Extension", + "The file extension of tile files on disk", + ".png" /* default value */, + G_PARAM_CONSTRUCT_ONLY | G_PARAM_READWRITE); + g_object_class_install_property (object_class, PROP_FILE_EXTENSION, pspec); + + g_type_class_add_private (klass, sizeof (VikMapSourceDefaultPrivate)); + + object_class->finalize = vik_map_source_default_finalize; +} + +static void +map_source_get_copyright (VikMapSource *self, LatLonBBox bbox, gdouble zoom, void (*fct)(VikViewport*,const gchar*), void *data) +{ + /* Just ignore bbox and zoom level */ + g_return_if_fail (VIK_IS_MAP_SOURCE_DEFAULT(self)); + + VikMapSourceDefaultPrivate *priv = VIK_MAP_SOURCE_DEFAULT_PRIVATE(self); + + (*fct) (data, priv->copyright); +} + +static const gchar * +map_source_get_license (VikMapSource *self) +{ + g_return_val_if_fail (VIK_IS_MAP_SOURCE_DEFAULT(self), NULL); + + VikMapSourceDefaultPrivate *priv = VIK_MAP_SOURCE_DEFAULT_PRIVATE(self); + + return priv->license; +} + +static const gchar * +map_source_get_license_url (VikMapSource *self) +{ + g_return_val_if_fail (VIK_IS_MAP_SOURCE_DEFAULT(self), NULL); + + VikMapSourceDefaultPrivate *priv = VIK_MAP_SOURCE_DEFAULT_PRIVATE(self); + + return priv->license_url; +} + +static const GdkPixbuf * +map_source_get_logo (VikMapSource *self) +{ + g_return_val_if_fail (VIK_IS_MAP_SOURCE_DEFAULT(self), NULL); + + VikMapSourceDefaultPrivate *priv = VIK_MAP_SOURCE_DEFAULT_PRIVATE(self); + + return priv->logo; +} + +static const gchar * +map_source_get_name (VikMapSource *self) +{ + g_return_val_if_fail (VIK_IS_MAP_SOURCE_DEFAULT(self), NULL); + VikMapSourceDefaultPrivate *priv = VIK_MAP_SOURCE_DEFAULT_PRIVATE(self); + return priv->name; +} + +static guint16 +map_source_get_uniq_id (VikMapSource *self) +{ + g_return_val_if_fail (VIK_IS_MAP_SOURCE_DEFAULT(self), (guint16)0); + + VikMapSourceDefaultPrivate *priv = VIK_MAP_SOURCE_DEFAULT_PRIVATE(self); + + return priv->uniq_id; +} + +static const gchar * +map_source_get_label (VikMapSource *self) +{ + g_return_val_if_fail (VIK_IS_MAP_SOURCE_DEFAULT(self), NULL); + + VikMapSourceDefaultPrivate *priv = VIK_MAP_SOURCE_DEFAULT_PRIVATE(self); + + return priv->label; +} + +static guint16 +map_source_get_tilesize_x (VikMapSource *self) +{ + g_return_val_if_fail (VIK_IS_MAP_SOURCE_DEFAULT(self), (guint16)0); + + VikMapSourceDefaultPrivate *priv = VIK_MAP_SOURCE_DEFAULT_PRIVATE(self); + + return priv->tilesize_x; +} + +static guint16 +map_source_get_tilesize_y (VikMapSource *self) +{ + g_return_val_if_fail (VIK_IS_MAP_SOURCE_DEFAULT(self), (guint16)0); + + VikMapSourceDefaultPrivate *priv = VIK_MAP_SOURCE_DEFAULT_PRIVATE(self); + + return priv->tilesize_y; +} + +static double +map_source_get_scale (VikMapSource *self) +{ + g_return_val_if_fail (VIK_IS_MAP_SOURCE_DEFAULT(self), (gdouble)1.0); + + VikMapSourceDefaultPrivate *priv = VIK_MAP_SOURCE_DEFAULT_PRIVATE(self); + + return priv->scale; +} + +static VikViewportDrawMode +map_source_get_drawmode (VikMapSource *self) +{ + g_return_val_if_fail (VIK_IS_MAP_SOURCE_DEFAULT(self), (VikViewportDrawMode)0); + + VikMapSourceDefaultPrivate *priv = VIK_MAP_SOURCE_DEFAULT_PRIVATE(self); + + return priv->drawmode; +} + +static DownloadResult_t +_download ( VikMapSource *self, MapCoord *src, const gchar *dest_fn, void *handle ) +{ + gchar *uri = vik_map_source_default_get_uri(VIK_MAP_SOURCE_DEFAULT(self), src); + gchar *host = vik_map_source_default_get_hostname(VIK_MAP_SOURCE_DEFAULT(self)); + DownloadFileOptions *options = vik_map_source_default_get_download_options(VIK_MAP_SOURCE_DEFAULT(self)); + DownloadResult_t res = a_http_download_get_url ( host, uri, dest_fn, options, handle ); + g_free ( uri ); + g_free ( host ); + return res; +} + +static const gchar * +map_source_get_file_extension (VikMapSource *self) +{ + g_return_val_if_fail (VIK_IS_MAP_SOURCE_DEFAULT(self), NULL); + VikMapSourceDefaultPrivate *priv = VIK_MAP_SOURCE_DEFAULT_PRIVATE(self); + return priv->file_extension; +} + +static void * +_download_handle_init ( VikMapSource *self ) +{ + return a_download_handle_init (); +} + + +static void +_download_handle_cleanup ( VikMapSource *self, void *handle ) +{ + a_download_handle_cleanup ( handle ); +} + +gchar * +vik_map_source_default_get_uri( VikMapSourceDefault *self, MapCoord *src ) +{ + VikMapSourceDefaultClass *klass; + g_return_val_if_fail (self != NULL, 0); + g_return_val_if_fail (VIK_IS_MAP_SOURCE_DEFAULT (self), 0); + klass = VIK_MAP_SOURCE_DEFAULT_GET_CLASS(self); + + g_return_val_if_fail (klass->get_uri != NULL, 0); + + return (*klass->get_uri)(self, src); +} + +gchar * +vik_map_source_default_get_hostname( VikMapSourceDefault *self ) +{ + VikMapSourceDefaultClass *klass; + g_return_val_if_fail (self != NULL, 0); + g_return_val_if_fail (VIK_IS_MAP_SOURCE_DEFAULT (self), 0); + klass = VIK_MAP_SOURCE_DEFAULT_GET_CLASS(self); + + g_return_val_if_fail (klass->get_hostname != NULL, 0); + + return (*klass->get_hostname)(self); +} + +DownloadFileOptions * +vik_map_source_default_get_download_options( VikMapSourceDefault *self ) +{ + VikMapSourceDefaultClass *klass; + g_return_val_if_fail (self != NULL, 0); + g_return_val_if_fail (VIK_IS_MAP_SOURCE_DEFAULT (self), 0); + klass = VIK_MAP_SOURCE_DEFAULT_GET_CLASS(self); + + g_return_val_if_fail (klass->get_download_options != NULL, 0); + + return (*klass->get_download_options)(self); +} + +gchar * +vik_map_source_default_get_url_display( VikMapSourceDefault *self, MapCoord *src ) +{ + VikMapSourceDefaultClass *klass; + g_return_val_if_fail (self != NULL, 0); + g_return_val_if_fail (VIK_IS_MAP_SOURCE_DEFAULT (self), 0); + klass = VIK_MAP_SOURCE_DEFAULT_GET_CLASS(self); + + g_return_val_if_fail (klass->get_uri != NULL, 0); + g_return_val_if_fail (klass->get_hostname != NULL, 0); + + gchar *newstr = NULL; + gchar *hostname = (*klass->get_hostname)(self); + gchar *url = (*klass->get_uri)(self, src); + if ( hostname && strlen(hostname)>1 ) { + if ( strstr (hostname, "://") == NULL ) { + //prepend http + newstr = g_strdup_printf ( "http://%s", hostname ); + } + else { + newstr = g_strdup ( hostname ); + } + } + if ( url && strlen(url)>1 ) { + if ( newstr ) { + gchar *tmp = g_strdup ( newstr ); + newstr = g_strdup_printf ( "%s%s", newstr, url ); + g_free ( tmp ); + } + else { + newstr = g_strdup ( url ); + } + } + + return newstr; +} diff --git a/src/vikmapsourcedefault.h b/src/vikmapsourcedefault.h new file mode 100644 index 0000000..bcab546 --- /dev/null +++ b/src/vikmapsourcedefault.h @@ -0,0 +1,62 @@ +/* -*- Mode: C; indent-tabs-mode: t; c-basic-offset: 4; tab-width: 4 -*- */ +/* + * viking + * Copyright (C) 2009, Guilhem Bonnefille + * + * viking 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. + * + * viking 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, see . + */ + +#ifndef _VIK_MAP_SOURCE_DEFAULT_H_ +#define _VIK_MAP_SOURCE_DEFAULT_H_ + +#include + +#include "vikmapsource.h" +#include "download.h" + +G_BEGIN_DECLS + +#define VIK_TYPE_MAP_SOURCE_DEFAULT (vik_map_source_default_get_type ()) +#define VIK_MAP_SOURCE_DEFAULT(obj) (G_TYPE_CHECK_INSTANCE_CAST ((obj), VIK_TYPE_MAP_SOURCE_DEFAULT, VikMapSourceDefault)) +#define VIK_MAP_SOURCE_DEFAULT_CLASS(klass) (G_TYPE_CHECK_CLASS_CAST ((klass), VIK_TYPE_MAP_SOURCE_DEFAULT, VikMapSourceDefaultClass)) +#define VIK_IS_MAP_SOURCE_DEFAULT(obj) (G_TYPE_CHECK_INSTANCE_TYPE ((obj), VIK_TYPE_MAP_SOURCE_DEFAULT)) +#define VIK_IS_MAP_SOURCE_DEFAULT_CLASS(klass) (G_TYPE_CHECK_CLASS_TYPE ((klass), VIK_TYPE_MAP_SOURCE_DEFAULT)) +#define VIK_MAP_SOURCE_DEFAULT_GET_CLASS(obj) (G_TYPE_INSTANCE_GET_CLASS ((obj), VIK_TYPE_MAP_SOURCE_DEFAULT, VikMapSourceDefaultClass)) + +typedef struct _VikMapSourceDefaultClass VikMapSourceDefaultClass; +typedef struct _VikMapSourceDefault VikMapSourceDefault; + +struct _VikMapSourceDefaultClass +{ + VikMapSourceClass parent_class; + + gchar * (*get_uri) ( VikMapSourceDefault *self, MapCoord *src ); + gchar * (*get_hostname) ( VikMapSourceDefault *self ); + DownloadFileOptions * (*get_download_options) ( VikMapSourceDefault *self ); +}; + +struct _VikMapSourceDefault +{ + VikMapSource parent_instance; +}; + +GType vik_map_source_default_get_type (void) G_GNUC_CONST; +gchar * vik_map_source_default_get_uri( VikMapSourceDefault *self, MapCoord *src ); +gchar * vik_map_source_default_get_hostname( VikMapSourceDefault *self ); +DownloadFileOptions * vik_map_source_default_get_download_options( VikMapSourceDefault *self ); +gchar * vik_map_source_default_get_url_display( VikMapSourceDefault *self, MapCoord *src ); + +G_END_DECLS + +#endif /* _VIK_MAP_SOURCE_DEFAULT_H_ */ diff --git a/src/vikmaptype.c b/src/vikmaptype.c new file mode 100644 index 0000000..ae3b889 --- /dev/null +++ b/src/vikmaptype.c @@ -0,0 +1,210 @@ +/* -*- Mode: C; indent-tabs-mode: t; c-basic-offset: 4; tab-width: 4 -*- */ +/* + * viking + * Copyright (C) 2009, Guilhem Bonnefille + * + * viking 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 3 of the License, or + * (at your option) any later version. + * + * viking 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, see . + */ + + /** + * SECTION:vikmaptype + * @short_description: the adapter class to support old map source declaration + * + * The #VikMapType class handles is an adapter to allow to reuse + * old map source (see #VikMapsLayer_MapType). + */ + +#ifdef HAVE_CONFIG_H +#include "config.h" +#endif + +#include "vikmaptype.h" +#include "vikmapslayer_compat.h" +#include "download.h" + +static const gchar *map_type_get_name (VikMapSource *self); +static guint16 map_type_get_uniq_id (VikMapSource *self); +static const gchar *map_type_get_label (VikMapSource *self); +static guint16 map_type_get_tilesize_x (VikMapSource *self); +static guint16 map_type_get_tilesize_y (VikMapSource *self); +static VikViewportDrawMode map_type_get_drawmode (VikMapSource *self); +static gboolean map_type_coord_to_mapcoord (VikMapSource *self, const VikCoord *src, gdouble xzoom, gdouble yzoom, MapCoord *dest ); +static void map_type_mapcoord_to_center_coord (VikMapSource *self, MapCoord *src, VikCoord *dest); +static DownloadResult_t map_type_download (VikMapSource * self, MapCoord * src, const gchar * dest_fn, void * handle); +static void * map_type_download_handle_init (VikMapSource * self); +static void map_type_download_handle_cleanup (VikMapSource * self, void * handle); + +typedef struct _VikMapTypePrivate VikMapTypePrivate; +struct _VikMapTypePrivate +{ + gchar *label; + gchar *name; + VikMapsLayer_MapType map_type; +}; + +#define VIK_MAP_TYPE_PRIVATE(o) (G_TYPE_INSTANCE_GET_PRIVATE ((o), VIK_TYPE_MAP_TYPE, VikMapTypePrivate)) + + +G_DEFINE_TYPE (VikMapType, vik_map_type, VIK_TYPE_MAP_SOURCE); + +static void +vik_map_type_init (VikMapType *object) +{ + VikMapTypePrivate *priv = VIK_MAP_TYPE_PRIVATE(object); + priv->label = NULL; + priv->name = NULL; +} + +VikMapType * +vik_map_type_new_with_id (VikMapsLayer_MapType map_type, const char *label) +{ + VikMapType *ret = (VikMapType *)g_object_new(vik_map_type_get_type(), NULL); + VikMapTypePrivate *priv = VIK_MAP_TYPE_PRIVATE(ret); + priv->map_type = map_type; + priv->label = g_strdup (label); + return ret; +} + +static void +vik_map_type_finalize (GObject *object) +{ + VikMapTypePrivate *priv = VIK_MAP_TYPE_PRIVATE(object); + g_free (priv->label); + priv->label = NULL; + + G_OBJECT_CLASS (vik_map_type_parent_class)->finalize (object); +} + +static void +vik_map_type_class_init (VikMapTypeClass *klass) +{ + GObjectClass* object_class = G_OBJECT_CLASS (klass); + VikMapSourceClass* parent_class = VIK_MAP_SOURCE_CLASS (klass); + + /* Overiding methods */ + parent_class->get_name = map_type_get_name; + parent_class->get_uniq_id = map_type_get_uniq_id; + parent_class->get_label = map_type_get_label; + parent_class->get_tilesize_x = map_type_get_tilesize_x; + parent_class->get_tilesize_y = map_type_get_tilesize_y; + parent_class->get_drawmode = map_type_get_drawmode; + parent_class->coord_to_mapcoord = map_type_coord_to_mapcoord; + parent_class->mapcoord_to_center_coord = map_type_mapcoord_to_center_coord; + parent_class->download = map_type_download; + parent_class->download_handle_init = map_type_download_handle_init; + parent_class->download_handle_cleanup = map_type_download_handle_cleanup; + + g_type_class_add_private (klass, sizeof (VikMapTypePrivate)); + + object_class->finalize = vik_map_type_finalize; +} + +static const gchar * +map_type_get_name (VikMapSource *self) +{ + VikMapTypePrivate *priv = VIK_MAP_TYPE_PRIVATE(self); + g_return_val_if_fail (priv != NULL, NULL); + + return priv->name; +} + +static guint16 +map_type_get_uniq_id (VikMapSource *self) +{ + VikMapTypePrivate *priv = VIK_MAP_TYPE_PRIVATE(self); + g_return_val_if_fail (priv != NULL, (guint16)0); + + return priv->map_type.uniq_id; +} + +static const gchar * +map_type_get_label (VikMapSource *self) +{ + VikMapTypePrivate *priv = VIK_MAP_TYPE_PRIVATE(self); + g_return_val_if_fail (priv != NULL, FALSE); + + return priv->label; +} + +static guint16 +map_type_get_tilesize_x (VikMapSource *self) +{ + VikMapTypePrivate *priv = VIK_MAP_TYPE_PRIVATE(self); + g_return_val_if_fail (priv != NULL, (guint16)0); + + return priv->map_type.tilesize_x; +} + +static guint16 +map_type_get_tilesize_y (VikMapSource *self) +{ + VikMapTypePrivate *priv = VIK_MAP_TYPE_PRIVATE(self); + g_return_val_if_fail (priv != NULL, (guint16)0); + + return priv->map_type.tilesize_y; +} + +static VikViewportDrawMode +map_type_get_drawmode (VikMapSource *self) +{ + VikMapTypePrivate *priv = VIK_MAP_TYPE_PRIVATE(self); + g_return_val_if_fail (priv != NULL, (VikViewportDrawMode)0); + + return priv->map_type.drawmode; +} + +static gboolean +map_type_coord_to_mapcoord (VikMapSource *self, const VikCoord *src, gdouble xzoom, gdouble yzoom, MapCoord *dest ) +{ + VikMapTypePrivate *priv = VIK_MAP_TYPE_PRIVATE(self); + g_return_val_if_fail (priv != NULL, FALSE); + + return (priv->map_type.coord_to_mapcoord)(src, xzoom, yzoom, dest); +} + +static void +map_type_mapcoord_to_center_coord (VikMapSource *self, MapCoord *src, VikCoord *dest) +{ + VikMapTypePrivate *priv = VIK_MAP_TYPE_PRIVATE(self); + g_return_if_fail (self != NULL); + + (priv->map_type.mapcoord_to_center_coord)(src, dest); +} + +static DownloadResult_t +map_type_download (VikMapSource * self, MapCoord * src, const gchar * dest_fn, void * handle) +{ + VikMapTypePrivate *priv = VIK_MAP_TYPE_PRIVATE(self); + g_return_val_if_fail (priv != NULL, 0); + + return (priv->map_type.download)(src, dest_fn, handle); +} + +static void * +map_type_download_handle_init (VikMapSource * self) +{ + VikMapTypePrivate *priv = VIK_MAP_TYPE_PRIVATE(self); + g_return_val_if_fail (priv != NULL, 0); + + return (priv->map_type.download_handle_init)(); +} + +static void +map_type_download_handle_cleanup (VikMapSource * self, void * handle) +{ + VikMapTypePrivate *priv = VIK_MAP_TYPE_PRIVATE(self); + g_return_if_fail ( priv != NULL ); + + (priv->map_type.download_handle_cleanup)(handle); +} diff --git a/src/vikmaptype.h b/src/vikmaptype.h new file mode 100644 index 0000000..ae5672d --- /dev/null +++ b/src/vikmaptype.h @@ -0,0 +1,55 @@ +/* -*- Mode: C; indent-tabs-mode: t; c-basic-offset: 4; tab-width: 4 -*- */ +/* + * viking + * Copyright (C) 2009, Guilhem Bonnefille + * + * viking 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. + * + * viking 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, see . + */ + +#ifndef _VIK_MAP_TYPE_H_ +#define _VIK_MAP_TYPE_H_ + +#include + +#include "vikmapsource.h" +#include "vikmapslayer_compat.h" + +G_BEGIN_DECLS + +#define VIK_TYPE_MAP_TYPE (vik_map_type_get_type ()) +#define VIK_MAP_TYPE(obj) (G_TYPE_CHECK_INSTANCE_CAST ((obj), VIK_TYPE_MAP_TYPE, VikMapType)) +#define VIK_MAP_TYPE_CLASS(klass) (G_TYPE_CHECK_CLASS_CAST ((klass), VIK_TYPE_MAP_TYPE, VikMapTypeClass)) +#define VIK_IS_MAP_TYPE(obj) (G_TYPE_CHECK_INSTANCE_TYPE ((obj), VIK_TYPE_MAP_TYPE)) +#define VIK_IS_MAP_TYPE_CLASS(klass) (G_TYPE_CHECK_CLASS_TYPE ((klass), VIK_TYPE_MAP_TYPE)) +#define VIK_MAP_TYPE_GET_CLASS(obj) (G_TYPE_INSTANCE_GET_CLASS ((obj), VIK_TYPE_MAP_TYPE, VikMapTypeClass)) + +typedef struct _VikMapTypeClass VikMapTypeClass; +typedef struct _VikMapType VikMapType; + +struct _VikMapTypeClass +{ + VikMapSourceClass parent_class; +}; + +struct _VikMapType +{ + VikMapSource parent_instance; +}; + +GType vik_map_type_get_type (void) G_GNUC_CONST; +VikMapType *vik_map_type_new_with_id (VikMapsLayer_MapType map_type, const char *label); + +G_END_DECLS + +#endif /* _VIK_MAP_TYPE_H_ */ diff --git a/src/vikradiogroup.c b/src/vikradiogroup.c new file mode 100644 index 0000000..cbe9fef --- /dev/null +++ b/src/vikradiogroup.c @@ -0,0 +1,163 @@ +/* + * viking -- GPS Data and Topo Analyzer, Explorer, and Manager + * + * Copyright (C) 2003-2005, Evan Battaglia + * + * 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., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA + * + */ + +#include +#include + +#include "vikradiogroup.h" + +static GObjectClass *parent_class; + +static void radio_group_finalize ( GObject *gob ); +static void radio_group_class_init ( VikRadioGroupClass *klass ); + +struct _VikRadioGroup { + GtkVBox parent; + GSList *radios; + guint options_count; +}; + +GType vik_radio_group_get_type (void) +{ + static GType vrg_type = 0; + + if (!vrg_type) + { + static const GTypeInfo vrg_info = + { + sizeof (VikRadioGroupClass), + NULL, /* base_init */ + NULL, /* base_finalize */ + (GClassInitFunc) radio_group_class_init, /* class init */ + NULL, /* class_finalize */ + NULL, /* class_data */ + sizeof (VikRadioGroup), + 0, + NULL /* instance init */ + }; + vrg_type = g_type_register_static ( GTK_TYPE_VBOX, "VikRadioGroup", &vrg_info, 0 ); + } + + return vrg_type; +} + +static void radio_group_class_init ( VikRadioGroupClass *klass ) +{ + /* Destructor */ + GObjectClass *object_class; + + object_class = G_OBJECT_CLASS (klass); + + object_class->finalize = radio_group_finalize; + + parent_class = g_type_class_peek_parent (klass); +} + +GtkWidget *vik_radio_group_new ( GList *options ) +{ + VikRadioGroup *vrg; + GtkWidget *t; + gchar *label; + GList *option = options; + + if ( ! options ) + return NULL; + + vrg = VIK_RADIO_GROUP ( g_object_new ( VIK_RADIO_GROUP_TYPE, NULL ) ); + + label = g_list_nth_data(options, 0); + t = gtk_radio_button_new_with_label ( NULL, _(label) ); + gtk_toggle_button_set_active ( GTK_TOGGLE_BUTTON(t), TRUE ); + gtk_box_pack_start ( GTK_BOX(vrg), t, FALSE, FALSE, 0 ); + + vrg->radios = g_slist_append ( NULL, t ); + vrg->options_count = 1; + + while ( ( option = g_list_next(option) ) != NULL ) + { + label = option->data; + t = gtk_radio_button_new_with_label_from_widget ( + GTK_RADIO_BUTTON(vrg->radios->data), _(label)); + vrg->radios = g_slist_append( vrg->radios, t ); + gtk_box_pack_start ( GTK_BOX(vrg), GTK_WIDGET(t), FALSE, FALSE, 0 ); + vrg->options_count++; + } + + return GTK_WIDGET(vrg); +} + +GtkWidget *vik_radio_group_new_static ( const gchar **options ) +{ + VikRadioGroup *vrg; + GtkWidget *t; + + if ( ! *options ) + return NULL; + + vrg = VIK_RADIO_GROUP ( g_object_new ( VIK_RADIO_GROUP_TYPE, NULL ) ); + + t = gtk_radio_button_new_with_label ( NULL, _(options[0]) ); + gtk_toggle_button_set_active ( GTK_TOGGLE_BUTTON(t), TRUE ); + gtk_box_pack_start ( GTK_BOX(vrg), t, FALSE, FALSE, 0 ); + + vrg->radios = g_slist_append ( NULL, t ); + vrg->options_count = 1; + + for ( options++ ; *options ; options++ ) + { + t = gtk_radio_button_new_with_label_from_widget ( GTK_RADIO_BUTTON(vrg->radios->data), _(*options) ); + vrg->radios = g_slist_append( vrg->radios, t ); + gtk_box_pack_start ( GTK_BOX(vrg), GTK_WIDGET(t), FALSE, FALSE, 0 ); + vrg->options_count++; + } + + return GTK_WIDGET(vrg); +} + + +void vik_radio_group_set_selected ( VikRadioGroup *vrg, guint8 i ) +{ + if ( i < vrg->options_count ) + gtk_toggle_button_set_active ( GTK_TOGGLE_BUTTON(g_slist_nth_data(vrg->radios,i)), TRUE ); +} + +guint8 vik_radio_group_get_selected ( VikRadioGroup *vrg ) +{ + guint8 i = 0; + GSList *iter = vrg->radios; + while ( iter ) + { + if ( gtk_toggle_button_get_active ( GTK_TOGGLE_BUTTON(iter->data) ) ) + return i; + iter = iter->next; + i++; + } + return 0; +} + +static void radio_group_finalize ( GObject *gob ) +{ + VikRadioGroup *vrg = VIK_RADIO_GROUP ( gob ); + if ( vrg->radios ) + g_slist_free ( vrg->radios ); + G_OBJECT_CLASS(parent_class)->finalize(gob); +} + diff --git a/src/vikradiogroup.h b/src/vikradiogroup.h new file mode 100644 index 0000000..d5a2ed2 --- /dev/null +++ b/src/vikradiogroup.h @@ -0,0 +1,54 @@ +/* + * viking -- GPS Data and Topo Analyzer, Explorer, and Manager + * + * Copyright (C) 2003-2005, Evan Battaglia + * + * 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., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA + * + */ + +#ifndef _VIKING_RADIOGROUP_H +#define _VIKING_RADIOGROUP_H + +#include +#include +#include + +G_BEGIN_DECLS + +#define VIK_RADIO_GROUP_TYPE (vik_radio_group_get_type ()) +#define VIK_RADIO_GROUP(obj) (G_TYPE_CHECK_INSTANCE_CAST ((obj), VIK_RADIO_GROUP_TYPE, VikRadioGroup)) +#define VIK_RADIO_GROUP_CLASS(klass) (G_TYPE_CHECK_CLASS_CAST ((klass), VIK_RADIO_GROUP_TYPE, VikRadioGroupClass)) +#define IS_VIK_RADIO_GROUP(obj) (G_TYPE_CHECK_INSTANCE_TYPE ((obj), VIK_RADIO_GROUP_TYPE)) +#define IS_VIK_RADIO_GROUP_CLASS(klass) (G_TYPE_CHECK_CLASS_TYPE ((klass), VIK_RADIO_GROUP_TYPE)) + +typedef struct _VikRadioGroup VikRadioGroup; +typedef struct _VikRadioGroupClass VikRadioGroupClass; + +struct _VikRadioGroupClass +{ + GtkVBoxClass vbox_class; +}; + +GType vik_radio_group_get_type (); + +GtkWidget *vik_radio_group_new ( GList *options ); +void vik_radio_group_set_selected ( VikRadioGroup *vrg, guint8 i ); +guint8 vik_radio_group_get_selected ( VikRadioGroup *vrg ); +GtkWidget *vik_radio_group_new_static ( const gchar **options ); + +G_END_DECLS + +#endif diff --git a/src/vikrouting.c b/src/vikrouting.c new file mode 100644 index 0000000..79e96e0 --- /dev/null +++ b/src/vikrouting.c @@ -0,0 +1,336 @@ +/* + * viking -- GPS Data and Topo Analyzer, Explorer, and Manager + * + * Copyright (C) 2012-2013, Guilhem Bonnefille + * + * 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., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA + */ + +/** + * SECTION:vikrouting + * @short_description: the routing framework + * + * This module handles the list of #VikRoutingEngine. + * It also handles the "default" functions. + */ + +#ifdef HAVE_CONFIG_H +#include "config.h" +#endif + +#include +#include +#include + +#include "curl_download.h" +#include "babel.h" + +#include "preferences.h" + +#include "vikrouting.h" +#include "vikroutingengine.h" + +/* params will be routing.default */ +/* we have to make sure these don't collide. */ +#define VIKING_ROUTING_PARAMS_GROUP_KEY "routing" +#define VIKING_ROUTING_PARAMS_NAMESPACE "routing." + +/* List to register all routing engines */ +static GList *routing_engine_list = NULL; + +static VikLayerParam prefs[] = { + { VIK_LAYER_NUM_TYPES, VIKING_ROUTING_PARAMS_NAMESPACE "default", VIK_LAYER_PARAM_STRING, VIK_LAYER_GROUP_NONE, N_("Default engine:"), VIK_LAYER_WIDGET_COMBOBOX, NULL, NULL, NULL, NULL, NULL, NULL }, +}; + +gchar **routing_engine_labels = NULL; +gchar **routing_engine_ids = NULL; + +/** + * vik_routing_prefs_init: + * + * Initialize the preferences of the routing feature. + */ +void +vik_routing_prefs_init() +{ + a_preferences_register_group ( VIKING_ROUTING_PARAMS_GROUP_KEY, _("Routing") ); + + VikLayerParamData tmp; + tmp.s = NULL; + a_preferences_register(prefs, tmp, VIKING_ROUTING_PARAMS_GROUP_KEY); +} + +/* @see g_list_find_custom */ +static gint +search_by_id (gconstpointer a, + gconstpointer b) +{ + const gchar *id = b; + VikRoutingEngine *engine = (VikRoutingEngine *)a; + gchar *engineId = vik_routing_engine_get_id (engine); + if (id && engine) + return strcmp(id, engineId); + else + return -1; +} + +/** + * vik_routing_find_engine: + * @id: the id of the engine we are looking for + * + * Returns: the found engine or %NULL + */ +VikRoutingEngine * +vik_routing_find_engine ( const gchar *id ) +{ + VikRoutingEngine *engine = NULL; + GList *elem = g_list_find_custom (routing_engine_list, id, search_by_id); + if (elem) + engine = elem->data; + return engine; +} + +/** + * vik_routing_default_engine: + * + * Retrieve the default engine, based on user's preferences. + * + * Returns: the default engine + */ +VikRoutingEngine * +vik_routing_default_engine ( void ) +{ + const gchar *id = a_preferences_get ( VIKING_ROUTING_PARAMS_NAMESPACE "default")->s; + VikRoutingEngine *engine = vik_routing_find_engine(id); + if (engine == NULL && routing_engine_list != NULL && g_list_first (routing_engine_list) != NULL) + /* Fallback to first element */ + engine = g_list_first (routing_engine_list)->data; + + return engine; +} + +/** + * vik_routing_default_find: + * + * Route computation with default engine. + * + * Return indicates success or not + */ +gboolean +vik_routing_default_find(VikTrwLayer *vt, struct LatLon start, struct LatLon end) +{ + /* The engine */ + VikRoutingEngine *engine = vik_routing_default_engine ( ); + /* The route computation */ + return vik_routing_engine_find ( engine, vt, start, end ); +} + +/** + * vik_routing_register: + * @engine: new routing engine to register + * + * Register a new routing engine. + */ +void +vik_routing_register( VikRoutingEngine *engine ) +{ + gchar *label = vik_routing_engine_get_label ( engine ); + gchar *id = vik_routing_engine_get_id ( engine ); + gsize len = 0; + + /* check if id already exists in list */ + GList *elem = g_list_find_custom (routing_engine_list, id, search_by_id); + if (elem != NULL) { + g_debug("%s: %s already exists: update", __FUNCTION__, id); + + /* Update main list */ + g_object_unref (elem->data); + elem->data = g_object_ref ( engine ); + + /* Update GUI arrays */ + len = g_strv_length (routing_engine_labels); + for (; len > 0 ; len--) { + if (strcmp (routing_engine_ids[len-1], id) == 0) + break; + } + /* Update the label (possibly different */ + g_free (routing_engine_labels[len-1]); + routing_engine_labels[len-1] = g_strdup (label); + + } else { + g_debug("%s: %s is new: append", __FUNCTION__, id); + routing_engine_list = g_list_append ( routing_engine_list, g_object_ref ( engine ) ); + + if (routing_engine_labels) + len = g_strv_length (routing_engine_labels); + + /* Add the label */ + routing_engine_labels = g_realloc (routing_engine_labels, (len+2)*sizeof(gchar*)); + routing_engine_labels[len] = g_strdup (label); + routing_engine_labels[len+1] = NULL; + + /* Add the id */ + routing_engine_ids = g_realloc (routing_engine_ids, (len+2)*sizeof(gchar*)); + routing_engine_ids[len] = g_strdup (id); + routing_engine_ids[len+1] = NULL; + + /* Hack + We have to ensure the mode LayerParam references the up-to-date + GLists. + */ + /* + memcpy(&maps_layer_params[0].widget_data, ¶ms_maptypes, sizeof(gpointer)); + memcpy(&maps_layer_params[0].extra_widget_data, ¶ms_maptypes_ids, sizeof(gpointer)); + */ + prefs[0].widget_data = routing_engine_labels; + prefs[0].extra_widget_data = routing_engine_ids; + } +} + +/** + * vik_routing_unregister_all: + * + * Unregister all registered routing engines. + */ +void +vik_routing_unregister_all () +{ + g_list_foreach ( routing_engine_list, (GFunc) g_object_unref, NULL ); + g_strfreev ( routing_engine_labels ); + g_strfreev ( routing_engine_ids ); +} + +/** + * vik_routing_foreach_engine: + * @func: the function to run on each element + * @user_data: user's data to give to each call of @func + * + * Loop over all registered routing engines. + */ +void +vik_routing_foreach_engine (GFunc func, gpointer user_data) +{ + g_list_foreach ( routing_engine_list, func, user_data ); +} + +/* + * This function is called for all routing engine registered. + * Following result of the predicate function, the current engine + * is added to the combobox. In order to retrieve the VikRoutingEngine + * object, we store a list of added engine in a GObject's data "engines". + * + * @see g_list_foreach() + */ +static void +fill_engine_box (gpointer data, gpointer user_data) +{ + VikRoutingEngine *engine = (VikRoutingEngine*) data; + /* Retrieve combo */ + GtkWidget *widget = (GtkWidget*) user_data; + + /* Only register engine fulfilling expected behaviour */ + Predicate predicate = g_object_get_data ( G_OBJECT ( widget ), "func" ); + gpointer predicate_data = g_object_get_data ( G_OBJECT ( widget ), "user_data" ); + /* No predicate means to register all engines */ + gboolean ok = predicate == NULL || predicate (engine, predicate_data); + + if (ok) + { + /* Add item in widget */ + const gchar *label = vik_routing_engine_get_label (engine); + vik_combo_box_text_append (widget, label); + /* Save engine in internal list */ + GList *engines = (GList*) g_object_get_data ( G_OBJECT ( widget ) , "engines" ); + engines = g_list_append ( engines, engine ); + g_object_set_data ( G_OBJECT ( widget ), "engines", engines ); + } +} + +/** + * vik_routing_ui_selector_new: + * @func: user function to decide if an engine has to be added or not + * @user_data: user data for previous function + * + * Creates a combo box to allow selection of a routing engine. + * + * We use GObject data hashtable to store and retrieve the VikRoutingEngine + * associated to the selection. + * + * Returns: the combo box + */ +GtkWidget * +vik_routing_ui_selector_new (Predicate func, gpointer user_data) +{ + /* Create the combo */ + GtkWidget * combo = vik_combo_box_text_new (); + + /* Save data for foreach function */ + g_object_set_data ( G_OBJECT ( combo ), "func", func ); + g_object_set_data ( G_OBJECT ( combo ), "user_data", user_data ); + + /* Filter all engines with given user function */ + vik_routing_foreach_engine (fill_engine_box, combo); + + return combo; +} + +/** + * vik_routing_ui_selector_get_nth: + * @combo: the GtkWidget combobox + * @pos: the selected position + * + * Retrieve the VikRoutingEngine stored in a list attached to @combo + * via the "engines" property. + * + * Returns: the VikRoutingEngine object associated to @pos + */ +VikRoutingEngine * +vik_routing_ui_selector_get_nth (GtkWidget *combo, int pos) +{ + /* Retrieve engine */ + GList *engines = (GList*) g_object_get_data ( G_OBJECT ( combo ) , "engines" ); + VikRoutingEngine *engine = g_list_nth_data ( engines, pos ); + + return engine; +} + +// For simplicity a variable with visibility to multiple functions +static guint engine_count = 0; + +static void +count_engine_directions (gpointer data, gpointer user_data) +{ + VikRoutingEngine *engine = (VikRoutingEngine*) data; + if ( vik_routing_engine_supports_direction ( engine ) ) + engine_count++; +} + +/** + * vik_routing_number_of_engines: + * + * Returns: the number of engines available + */ +guint vik_routing_number_of_engines ( VikRoutingMethodType method ) +{ + engine_count = 0; + if ( routing_engine_list ) { + if ( method == VIK_ROUTING_METHOD_DIRECTIONS ) + vik_routing_foreach_engine ( count_engine_directions, NULL ); + else + // ATM Every engine supports Lat/Lon requests + engine_count = g_list_length ( routing_engine_list ); + } + return engine_count; +} diff --git a/src/vikrouting.h b/src/vikrouting.h new file mode 100644 index 0000000..7ba4d83 --- /dev/null +++ b/src/vikrouting.h @@ -0,0 +1,57 @@ +/* + * viking -- GPS Data and Topo Analyzer, Explorer, and Manager + * + * Copyright (C) 2012-2013, Guilhem Bonnefille + * + * 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., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA + * + */ +#ifndef _VIKING_ROUTING_H +#define _VIKING_ROUTING_H + +#include + +#include "vikroutingengine.h" + +G_BEGIN_DECLS + +/* Default */ +gboolean vik_routing_default_find ( VikTrwLayer *vt, struct LatLon start, struct LatLon end ); + +/* Routing engines management */ +void vik_routing_prefs_init(); +void vik_routing_register( VikRoutingEngine *engine ); +void vik_routing_unregister_all (); +void vik_routing_foreach_engine ( GFunc func, gpointer user_data ); + +/* How many are available ? */ +typedef enum { + VIK_ROUTING_METHOD_DIRECTIONS, + VIK_ROUTING_METHOD_LATLON +} VikRoutingMethodType; +guint vik_routing_number_of_engines ( VikRoutingMethodType method ); + +/* UI */ +typedef gboolean (*Predicate)( gpointer data, gpointer user_data ); +GtkWidget *vik_routing_ui_selector_new ( Predicate func, gpointer user_data ); +VikRoutingEngine *vik_routing_ui_selector_get_nth ( GtkWidget *combo, int pos ); + +/* Needs to be visible to display info about which routing engine is getting the route in viktrwlayer.c */ +VikRoutingEngine * vik_routing_default_engine ( void ); + + +G_END_DECLS + +#endif diff --git a/src/vikroutingengine.c b/src/vikroutingengine.c new file mode 100644 index 0000000..00b8689 --- /dev/null +++ b/src/vikroutingengine.c @@ -0,0 +1,347 @@ +/* + * viking -- GPS Data and Topo Analyzer, Explorer, and Manager + * + * Copyright (C) 2012-2013, Guilhem Bonnefille + * + * 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., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA + */ + +/** + * SECTION:vikroutingengine + * @short_description: the base class to describe routing engine + * + * The #VikRoutingEngine class is both the interface and the base class + * for the hierarchie of routing engines. + */ + +#ifdef HAVE_CONFIG_H +#include "config.h" +#endif + +#include +#include +#include + +#include "babel.h" + +#include "vikroutingengine.h" + +static void vik_routing_engine_finalize ( GObject *gob ); +static GObjectClass *parent_class; + +typedef struct _VikRoutingPrivate VikRoutingPrivate; +struct _VikRoutingPrivate +{ + gchar *id; + gchar *label; + gchar *format; +}; + +#define VIK_ROUTING_ENGINE_PRIVATE(o) (G_TYPE_INSTANCE_GET_PRIVATE ((o), VIK_ROUTING_ENGINE_TYPE, VikRoutingPrivate)) + +/* properties */ +enum +{ + PROP_0, + + PROP_ID, + PROP_LABEL, + PROP_FORMAT, +}; + +G_DEFINE_ABSTRACT_TYPE (VikRoutingEngine, vik_routing_engine, G_TYPE_OBJECT) + +static void +vik_routing_engine_set_property (GObject *object, + guint property_id, + const GValue *value, + GParamSpec *pspec) +{ + VikRoutingPrivate *priv = VIK_ROUTING_ENGINE_PRIVATE ( object ); + + switch (property_id) + { + case PROP_ID: + g_free (priv->id); + priv->id = g_strdup(g_value_get_string (value)); + break; + + case PROP_LABEL: + g_free (priv->label); + priv->label = g_strdup(g_value_get_string (value)); + break; + + case PROP_FORMAT: + g_free (priv->format); + priv->format = g_strdup(g_value_get_string (value)); + break; + + default: + /* We don't have any other property... */ + G_OBJECT_WARN_INVALID_PROPERTY_ID (object, property_id, pspec); + break; + } +} + +static void +vik_routing_engine_get_property (GObject *object, + guint property_id, + GValue *value, + GParamSpec *pspec) +{ + VikRoutingPrivate *priv = VIK_ROUTING_ENGINE_PRIVATE ( object ); + + switch (property_id) + { + case PROP_ID: + g_value_set_string (value, priv->id); + break; + + case PROP_LABEL: + g_value_set_string (value, priv->label); + break; + + case PROP_FORMAT: + g_value_set_string (value, priv->format); + break; + + default: + /* We don't have any other property... */ + G_OBJECT_WARN_INVALID_PROPERTY_ID (object, property_id, pspec); + break; + } +} + +static void +vik_routing_engine_class_init ( VikRoutingEngineClass *klass ) +{ + GObjectClass *object_class; + VikRoutingEngineClass *routing_class; + GParamSpec *pspec = NULL; + + object_class = G_OBJECT_CLASS (klass); + + object_class->set_property = vik_routing_engine_set_property; + object_class->get_property = vik_routing_engine_get_property; + object_class->finalize = vik_routing_engine_finalize; + + parent_class = g_type_class_peek_parent (klass); + + routing_class = VIK_ROUTING_ENGINE_CLASS ( klass ); + routing_class->find = NULL; + + routing_class->supports_direction = NULL; + routing_class->get_url_from_directions = NULL; + + routing_class->refine = NULL; + routing_class->supports_refine = NULL; + + pspec = g_param_spec_string ("id", + "Identifier", + "The identifier of the routing engine", + "" /* default value */, + G_PARAM_CONSTRUCT_ONLY | G_PARAM_READWRITE); + g_object_class_install_property (object_class, PROP_ID, pspec); + + pspec = g_param_spec_string ("label", + "Label", + "The label of the routing engine", + "" /* default value */, + G_PARAM_CONSTRUCT_ONLY | G_PARAM_READWRITE); + g_object_class_install_property (object_class, PROP_LABEL, pspec); + + pspec = g_param_spec_string ("format", + "Format", + "The format of the output (see gpsbabel)", + "" /* default value */, + G_PARAM_CONSTRUCT_ONLY | G_PARAM_READWRITE); + g_object_class_install_property (object_class, PROP_FORMAT, pspec); + + g_type_class_add_private (klass, sizeof (VikRoutingPrivate)); +} + +static void +vik_routing_engine_init ( VikRoutingEngine *self ) +{ + VikRoutingPrivate *priv = VIK_ROUTING_ENGINE_PRIVATE (self); + + priv->id = NULL; + priv->label = NULL; + priv->format = NULL; +} + +static void +vik_routing_engine_finalize ( GObject *self ) +{ + VikRoutingPrivate *priv = VIK_ROUTING_ENGINE_PRIVATE (self); + + g_free (priv->id); + priv->id = NULL; + + g_free (priv->label); + priv->label = NULL; + + g_free (priv->format); + priv->format = NULL; + + G_OBJECT_CLASS(parent_class)->finalize(self); +} + +/** + * vik_routing_engine_find: + * @self: self object + * @vtl: + * @start: starting point + * @end: ending point + * + * Retrieve a route between two coordinates. + * + * Returns: indicates success or not. + */ +gboolean +vik_routing_engine_find ( VikRoutingEngine *self, VikTrwLayer *vtl, struct LatLon start, struct LatLon end ) +{ + VikRoutingEngineClass *klass; + + g_return_val_if_fail ( VIK_IS_ROUTING_ENGINE (self), 0 ); + klass = VIK_ROUTING_ENGINE_GET_CLASS( self ); + g_return_val_if_fail ( klass->find != NULL, 0 ); + + return klass->find( self, vtl, start, end ); +} + +/** + * vik_routing_engine_get_id: + * + * Returns: the id of self + */ +gchar * +vik_routing_engine_get_id ( VikRoutingEngine *self ) +{ + VikRoutingPrivate *priv = VIK_ROUTING_ENGINE_PRIVATE (self); + + return priv->id; +} + +/** + * vik_routing_engine_get_label: + * + * Returns: the label of self + */ +gchar * +vik_routing_engine_get_label ( VikRoutingEngine *self ) +{ + VikRoutingPrivate *priv = VIK_ROUTING_ENGINE_PRIVATE (self); + + return priv->label; +} + +/** + * vik_routing_engine_get_format: + * + * GPSbabel's Format of result. + * + * Returns: the format of self + */ +gchar * +vik_routing_engine_get_format ( VikRoutingEngine *self ) +{ + VikRoutingPrivate *priv = VIK_ROUTING_ENGINE_PRIVATE (self); + + return priv->format; +} + +/** + * vik_routing_engine_supports_direction: + * + * Returns: %TRUE if this engine supports the route finding based on directions + */ +gboolean +vik_routing_engine_supports_direction ( VikRoutingEngine *self ) +{ + VikRoutingEngineClass *klass; + + g_return_val_if_fail ( VIK_IS_ROUTING_ENGINE (self), FALSE ); + klass = VIK_ROUTING_ENGINE_GET_CLASS( self ); + g_return_val_if_fail ( klass->supports_direction != NULL, FALSE ); + + return klass->supports_direction( self ); +} + +/** + * vik_routing_engine_get_url_from_directions: + * @self: routing engine + * @start: the start direction + * @end: the end direction + * + * Compute the URL used with the acquire framework. + * + * Returns: the computed URL + */ +gchar * +vik_routing_engine_get_url_from_directions ( VikRoutingEngine *self, const gchar *start, const gchar *end ) +{ + VikRoutingEngineClass *klass; + + g_return_val_if_fail ( VIK_IS_ROUTING_ENGINE (self), NULL ); + klass = VIK_ROUTING_ENGINE_GET_CLASS( self ); + g_return_val_if_fail ( klass->get_url_from_directions != NULL, NULL ); + + return klass->get_url_from_directions( self, start, end ); +} + +/** + * vik_routing_engine_refine: + * @self: self object + * @vtl: layer where to create new track + * @vt: the simple route to refine + * + * Retrieve a route refining the @vt track/route. + * + * A refined route is computed from @vt. + * The route is computed from first trackpoint to last trackpoint, + * and going via all intermediate trackpoints. + * + * Returns: indicates success or not. + */ +gboolean +vik_routing_engine_refine ( VikRoutingEngine *self, VikTrwLayer *vtl, VikTrack *vt ) +{ + VikRoutingEngineClass *klass; + + g_return_val_if_fail ( VIK_IS_ROUTING_ENGINE (self), 0 ); + klass = VIK_ROUTING_ENGINE_GET_CLASS ( self ); + g_return_val_if_fail ( klass->refine != NULL, 0 ); + + return klass->refine ( self, vtl, vt ); +} + +/** + * vik_routing_engine_supports_refine: + * @self: routing engine + * + * Returns: %TRUE if this engine supports the refine of track + */ +gboolean +vik_routing_engine_supports_refine ( VikRoutingEngine *self ) +{ + VikRoutingEngineClass *klass; + + g_return_val_if_fail ( VIK_IS_ROUTING_ENGINE (self), FALSE ); + klass = VIK_ROUTING_ENGINE_GET_CLASS ( self ); + g_return_val_if_fail ( klass->supports_refine != NULL, FALSE ); + + return klass->supports_refine ( self ); +} diff --git a/src/vikroutingengine.h b/src/vikroutingengine.h new file mode 100644 index 0000000..a23cc1e --- /dev/null +++ b/src/vikroutingengine.h @@ -0,0 +1,75 @@ +/* + * viking -- GPS Data and Topo Analyzer, Explorer, and Manager + * + * Copyright (C) 2012-2013, Guilhem Bonnefille + * + * 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., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA + * + */ +#ifndef _VIKING_ROUTING_ENGINE_H +#define _VIKING_ROUTING_ENGINE_H + +#include + +#include "viktrwlayer.h" +#include "coords.h" +#include "download.h" + +#include "vikwindow.h" + +G_BEGIN_DECLS + +#define VIK_ROUTING_ENGINE_TYPE (vik_routing_engine_get_type ()) +#define VIK_ROUTING_ENGINE(obj) (G_TYPE_CHECK_INSTANCE_CAST ((obj), VIK_ROUTING_ENGINE_TYPE, VikRoutingEngine)) +#define VIK_ROUTING_ENGINE_CLASS(klass) (G_TYPE_CHECK_CLASS_CAST ((klass), VIK_ROUTING_ENGINE_TYPE, VikRoutingEngineClass)) +#define VIK_IS_ROUTING_ENGINE(obj) (G_TYPE_CHECK_INSTANCE_TYPE ((obj), VIK_ROUTING_ENGINE_TYPE)) +#define VIK_IS_ROUTING_ENGINE_CLASS(klass) (G_TYPE_CHECK_CLASS_TYPE ((klass), VIK_ROUTING_ENGINE_TYPE)) +#define VIK_ROUTING_ENGINE_GET_CLASS(obj) (G_TYPE_INSTANCE_GET_CLASS ((obj), VIK_ROUTING_ENGINE_TYPE, VikRoutingEngineClass)) + + +typedef struct _VikRoutingEngine VikRoutingEngine; +typedef struct _VikRoutingEngineClass VikRoutingEngineClass; + +struct _VikRoutingEngineClass +{ + GObjectClass object_class; + gboolean (*find)(VikRoutingEngine *self, VikTrwLayer *vtl, struct LatLon start, struct LatLon end); + gchar *(*get_url_from_directions)(VikRoutingEngine *self, const gchar *start, const gchar *end); + gboolean (*supports_direction)(VikRoutingEngine *self); + gboolean (*refine)(VikRoutingEngine *self, VikTrwLayer *vtl, VikTrack *vt); + gboolean (*supports_refine)(VikRoutingEngine *self); +}; + +GType vik_routing_engine_get_type (); + +struct _VikRoutingEngine { + GObject obj; +}; + +gboolean vik_routing_engine_find ( VikRoutingEngine *self, VikTrwLayer *vtl, struct LatLon start, struct LatLon end ); +gboolean vik_routing_engine_refine ( VikRoutingEngine *self, VikTrwLayer *vtl, VikTrack *vt ); +gchar *vik_routing_engine_get_url_from_directions ( VikRoutingEngine *self, const gchar *start, const gchar *end ); + +/* Acessors */ +gchar *vik_routing_engine_get_id ( VikRoutingEngine *self ); +gchar *vik_routing_engine_get_label ( VikRoutingEngine *self ); +gchar *vik_routing_engine_get_format ( VikRoutingEngine *self ); + +gboolean vik_routing_engine_supports_direction ( VikRoutingEngine *self ); +gboolean vik_routing_engine_supports_refine ( VikRoutingEngine *self ); + +G_END_DECLS + +#endif diff --git a/src/vikroutingwebengine.c b/src/vikroutingwebengine.c new file mode 100644 index 0000000..0d42ada --- /dev/null +++ b/src/vikroutingwebengine.c @@ -0,0 +1,624 @@ +/* + * viking -- GPS Data and Topo Analyzer, Explorer, and Manager + * + * Copyright (c) 2013, Guilhem Bonnefille + * + * 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., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA + * + */ + +/** + * SECTION:vikroutingwebengine + * @short_description: A generic class for WEB based routing engine + * + * The #VikRoutingWebEngine class handles WEB based + * routing engine. + */ + +#ifdef HAVE_CONFIG_H +#include "config.h" +#endif + +#include + +#include +#include + +#include "babel.h" + +#include "vikroutingwebengine.h" + +static void vik_routing_web_engine_finalize ( GObject *gob ); + +static gboolean vik_routing_web_engine_find ( VikRoutingEngine *self, VikTrwLayer *vtl, struct LatLon start, struct LatLon end ); +static gchar *vik_routing_web_engine_get_url_from_directions(VikRoutingEngine *self, const gchar *start, const gchar *end); +static gboolean vik_routing_web_engine_supports_direction(VikRoutingEngine *self); +static gboolean vik_routing_web_engine_refine ( VikRoutingEngine *self, VikTrwLayer *vtl, VikTrack *vt ); +static gboolean vik_routing_web_engine_supports_refine ( VikRoutingEngine *self ); + +typedef struct _VikRoutingWebEnginePrivate VikRoutingWebEnginePrivate; +struct _VikRoutingWebEnginePrivate +{ + gchar *url_base; + + /* LatLon */ + gchar *url_start_ll_fmt; + gchar *url_stop_ll_fmt; + gchar *url_via_ll_fmt; + gboolean url_ll_lat_first_fmt; + + /* Directions */ + gchar *url_start_dir_fmt; + gchar *url_stop_dir_fmt; + + DownloadFileOptions options; +}; + +#define VIK_ROUTING_WEB_ENGINE_PRIVATE(o) (G_TYPE_INSTANCE_GET_PRIVATE ((o), VIK_ROUTING_WEB_ENGINE_TYPE, VikRoutingWebEnginePrivate)) + +/* properties */ +enum +{ + PROP_0, + + PROP_URL_BASE, + + /* LatLon */ + PROP_URL_START_LL, + PROP_URL_STOP_LL, + PROP_URL_LL_LAT_FIRST, + PROP_URL_VIA_LL, + + /* Direction */ + PROP_URL_START_DIR, + PROP_URL_STOP_DIR, + + PROP_REFERER, + PROP_FOLLOW_LOCATION, +}; + +G_DEFINE_TYPE (VikRoutingWebEngine, vik_routing_web_engine, VIK_ROUTING_ENGINE_TYPE) + +static void +vik_routing_web_engine_set_property (GObject *object, + guint property_id, + const GValue *value, + GParamSpec *pspec) +{ + VikRoutingWebEnginePrivate *priv = VIK_ROUTING_WEB_ENGINE_PRIVATE ( object ); + + switch (property_id) + { + case PROP_URL_BASE: + g_free (priv->url_base); + priv->url_base = g_strdup(g_value_get_string (value)); + break; + + case PROP_URL_START_LL: + g_free (priv->url_start_ll_fmt); + priv->url_start_ll_fmt = g_strdup(g_value_get_string (value)); + break; + + case PROP_URL_STOP_LL: + g_free (priv->url_stop_ll_fmt); + priv->url_stop_ll_fmt = g_strdup(g_value_get_string (value)); + break; + + case PROP_URL_LL_LAT_FIRST: + priv->url_ll_lat_first_fmt = g_value_get_boolean (value); + break; + + case PROP_URL_VIA_LL: + g_free (priv->url_via_ll_fmt); + priv->url_via_ll_fmt = g_strdup(g_value_get_string (value)); + break; + + case PROP_URL_START_DIR: + g_free (priv->url_start_dir_fmt); + priv->url_start_dir_fmt = g_strdup(g_value_get_string (value)); + break; + + case PROP_URL_STOP_DIR: + g_free (priv->url_stop_dir_fmt); + priv->url_stop_dir_fmt = g_strdup(g_value_get_string (value)); + break; + + case PROP_REFERER: + g_free (priv->options.referer); + priv->options.referer = g_value_dup_string (value); + break; + + case PROP_FOLLOW_LOCATION: + priv->options.follow_location = g_value_get_long (value); + break; + + default: + /* We don't have any other property... */ + G_OBJECT_WARN_INVALID_PROPERTY_ID (object, property_id, pspec); + break; + } +} + +static void +vik_routing_web_engine_get_property (GObject *object, + guint property_id, + GValue *value, + GParamSpec *pspec) +{ + VikRoutingWebEnginePrivate *priv = VIK_ROUTING_WEB_ENGINE_PRIVATE ( object ); + + switch (property_id) + { + case PROP_URL_BASE: + g_value_set_string (value, priv->url_base); + break; + + case PROP_URL_START_LL: + g_value_set_string (value, priv->url_start_ll_fmt); + break; + + case PROP_URL_STOP_LL: + g_value_set_string (value, priv->url_stop_ll_fmt); + break; + + case PROP_URL_LL_LAT_FIRST: + g_value_set_boolean (value, priv->url_ll_lat_first_fmt); + break; + + case PROP_URL_VIA_LL: + g_value_set_string (value, priv->url_via_ll_fmt); + break; + + case PROP_URL_START_DIR: + g_value_set_string (value, priv->url_start_dir_fmt); + break; + + case PROP_URL_STOP_DIR: + g_value_set_string (value, priv->url_stop_dir_fmt); + break; + + case PROP_REFERER: + g_value_set_string (value, priv->options.referer); + break; + + case PROP_FOLLOW_LOCATION: + g_value_set_long (value, priv->options.follow_location); + break; + + default: + /* We don't have any other property... */ + G_OBJECT_WARN_INVALID_PROPERTY_ID (object, property_id, pspec); + break; + } +} + +static void vik_routing_web_engine_class_init ( VikRoutingWebEngineClass *klass ) +{ + GObjectClass *object_class; + VikRoutingEngineClass *parent_class; + GParamSpec *pspec = NULL; + + object_class = G_OBJECT_CLASS (klass); + + object_class->set_property = vik_routing_web_engine_set_property; + object_class->get_property = vik_routing_web_engine_get_property; + object_class->finalize = vik_routing_web_engine_finalize; + + parent_class = VIK_ROUTING_ENGINE_CLASS (klass); + + parent_class->find = vik_routing_web_engine_find; + parent_class->supports_direction = vik_routing_web_engine_supports_direction; + parent_class->get_url_from_directions = vik_routing_web_engine_get_url_from_directions; + parent_class->refine = vik_routing_web_engine_refine; + parent_class->supports_refine = vik_routing_web_engine_supports_refine; + + /** + * VikRoutingWebEngine:url-base: + * + * The base URL of the routing engine. + */ + pspec = g_param_spec_string ("url-base", + "URL's base", + "The base URL of the routing engine", + "" /* default value */, + G_PARAM_CONSTRUCT_ONLY | G_PARAM_READWRITE); + g_object_class_install_property (object_class, PROP_URL_BASE, pspec); + + + /** + * VikRoutingWebEngine:url-start-ll: + * + * The part of the request hosting the end point. + */ + pspec = g_param_spec_string ("url-start-ll", + "Start part of the URL", + "The part of the request hosting the start point", + "" /* default value */, + G_PARAM_CONSTRUCT_ONLY | G_PARAM_READWRITE); + g_object_class_install_property (object_class, PROP_URL_START_LL, pspec); + + + /** + * VikRoutingWebEngine:url-ll-lat-first: + * + * Coordinates are in latitude,longitude form if true (longitude,latitue else). + */ + pspec = g_param_spec_boolean ("url-ll-lat-first", + "Latitude first", + "Coordinates in latitude,longitude (instead of default longitude,latitude)", + TRUE/* default value */, + G_PARAM_CONSTRUCT_ONLY | G_PARAM_READWRITE); + g_object_class_install_property (object_class, PROP_URL_LL_LAT_FIRST, pspec); + + + /** + * VikRoutingWebEngine:url-stop-ll: + * + * The part of the request hosting the end point. + */ + pspec = g_param_spec_string ("url-stop-ll", + "Stop part of the URL", + "The part of the request hosting the end point", + "" /* default value */, + G_PARAM_CONSTRUCT_ONLY | G_PARAM_READWRITE); + g_object_class_install_property (object_class, PROP_URL_STOP_LL, pspec); + + + /** + * VikRoutingWebEngine:url-via-ll: + * + * The param of the request for setting a via point. + */ + pspec = g_param_spec_string ("url-via-ll", + "Via part of the URL", + "The param of the request for setting a via point", + NULL /* default value */, + G_PARAM_CONSTRUCT_ONLY | G_PARAM_READWRITE); + g_object_class_install_property (object_class, PROP_URL_VIA_LL, pspec); + + + /** + * VikRoutingWebEngine:url-start-dir: + * + * The part of the request hosting the end point. + */ + pspec = g_param_spec_string ("url-start-dir", + "Start part of the URL", + "The part of the request hosting the start point", + NULL /* default value */, + G_PARAM_CONSTRUCT_ONLY | G_PARAM_READWRITE); + g_object_class_install_property (object_class, PROP_URL_START_DIR, pspec); + + + /** + * VikRoutingWebEngine:url-stop-dir: + * + * The part of the request hosting the end point. + */ + pspec = g_param_spec_string ("url-stop-dir", + "Stop part of the URL", + "The part of the request hosting the end point", + NULL /* default value */, + G_PARAM_CONSTRUCT_ONLY | G_PARAM_READWRITE); + g_object_class_install_property (object_class, PROP_URL_STOP_DIR, pspec); + + + /** + * VikRoutingWebEngine:referer: + * + * The REFERER string to use in HTTP request. + */ + pspec = g_param_spec_string ("referer", + "Referer", + "The REFERER string to use in HTTP request", + NULL /* default value */, + G_PARAM_CONSTRUCT_ONLY | G_PARAM_READWRITE); + g_object_class_install_property (object_class, PROP_REFERER, pspec); + + + /** + * VikRoutingWebEngine:follow-location: + * + * Specifies the number of retries to follow a redirect while downloading a page. + */ + pspec = g_param_spec_long ("follow-location", + "Follow location", + "Specifies the number of retries to follow a redirect while downloading a page", + 0 /* minimum value */, + G_MAXLONG /* maximum value */, + 2 /* default value */, + G_PARAM_CONSTRUCT_ONLY | G_PARAM_READWRITE); + g_object_class_install_property (object_class, PROP_FOLLOW_LOCATION, pspec); + + g_type_class_add_private (klass, sizeof (VikRoutingWebEnginePrivate)); +} + +static void vik_routing_web_engine_init ( VikRoutingWebEngine *self ) +{ + VikRoutingWebEnginePrivate *priv = VIK_ROUTING_WEB_ENGINE_PRIVATE ( self ); + + priv->url_base = NULL; + + /* LatLon */ + priv->url_start_ll_fmt = NULL; + priv->url_stop_ll_fmt = NULL; + priv->url_via_ll_fmt = NULL; + priv->url_ll_lat_first_fmt = TRUE; + + /* Directions */ + priv->url_start_dir_fmt = NULL; + priv->url_stop_dir_fmt = NULL; + + priv->options.referer = NULL; + priv->options.follow_location = 0; + priv->options.check_file = NULL; + priv->options.check_file_server_time = FALSE; + priv->options.use_etag = FALSE; +} + +static void vik_routing_web_engine_finalize ( GObject *gob ) +{ + VikRoutingWebEnginePrivate *priv = VIK_ROUTING_WEB_ENGINE_PRIVATE ( gob ); + + g_free (priv->url_base); + priv->url_base = NULL; + + /* LatLon */ + g_free (priv->url_start_ll_fmt); + priv->url_start_ll_fmt = NULL; + g_free (priv->url_stop_ll_fmt); + priv->url_stop_ll_fmt = NULL; + g_free (priv->url_via_ll_fmt); + priv->url_via_ll_fmt = NULL; + priv->url_ll_lat_first_fmt = TRUE; + + /* Directions */ + g_free (priv->url_start_dir_fmt); + priv->url_start_dir_fmt = NULL; + g_free (priv->url_stop_dir_fmt); + priv->url_stop_dir_fmt = NULL; + + g_free (priv->options.referer); + priv->options.referer = NULL; + + G_OBJECT_CLASS (vik_routing_web_engine_parent_class)->finalize(gob); +} + +static DownloadFileOptions * +vik_routing_web_engine_get_download_options ( VikRoutingEngine *self ) +{ + g_return_val_if_fail (VIK_IS_ROUTING_WEB_ENGINE(self), NULL); + + VikRoutingWebEnginePrivate *priv = VIK_ROUTING_WEB_ENGINE_PRIVATE(self); + + return &(priv->options); +} + +static gchar * +substitute_latlon ( const gchar *fmt, struct LatLon ll ) +{ + gchar lat[G_ASCII_DTOSTR_BUF_SIZE], lon[G_ASCII_DTOSTR_BUF_SIZE]; + gchar *substituted = g_strdup_printf(fmt, + g_ascii_dtostr (lat, G_ASCII_DTOSTR_BUF_SIZE, (gdouble) ll.lat), + g_ascii_dtostr (lon, G_ASCII_DTOSTR_BUF_SIZE, (gdouble) ll.lon)); + return substituted; +} + +static gchar * +substitute_lonlat ( const gchar *fmt, struct LatLon ll ) +{ + gchar lat[G_ASCII_DTOSTR_BUF_SIZE], lon[G_ASCII_DTOSTR_BUF_SIZE]; + gchar *substituted = g_strdup_printf(fmt, + g_ascii_dtostr (lon, G_ASCII_DTOSTR_BUF_SIZE, (gdouble) ll.lon), + g_ascii_dtostr (lat, G_ASCII_DTOSTR_BUF_SIZE, (gdouble) ll.lat)); + return substituted; +} + +static gchar * +vik_routing_web_engine_get_url_for_coords ( VikRoutingEngine *self, struct LatLon start, struct LatLon end ) +{ + gchar *startURL; + gchar *endURL; + gchar *url; + + g_return_val_if_fail ( VIK_IS_ROUTING_WEB_ENGINE (self), NULL); + + VikRoutingWebEnginePrivate *priv = VIK_ROUTING_WEB_ENGINE_PRIVATE ( self ); + + g_return_val_if_fail ( priv->url_base != NULL, NULL); + g_return_val_if_fail ( priv->url_start_ll_fmt != NULL, NULL); + g_return_val_if_fail ( priv->url_stop_ll_fmt != NULL, NULL); + + startURL = (priv->url_ll_lat_first_fmt) ? + substitute_latlon ( priv->url_start_ll_fmt, start ): + substitute_lonlat ( priv->url_start_ll_fmt, start ); + endURL = (priv->url_ll_lat_first_fmt) ? + substitute_latlon ( priv->url_stop_ll_fmt, end ): + substitute_lonlat ( priv->url_stop_ll_fmt, end ); + url = g_strconcat ( priv->url_base, startURL, endURL, NULL ); + + /* Free memory */ + g_free ( startURL ); + g_free ( endURL ); + + return url; +} + +static gboolean +vik_routing_web_engine_find ( VikRoutingEngine *self, VikTrwLayer *vtl, struct LatLon start, struct LatLon end ) +{ + gchar *uri = vik_routing_web_engine_get_url_for_coords(self, start, end); + + DownloadFileOptions *options = vik_routing_web_engine_get_download_options(self); + + gchar *format = vik_routing_engine_get_format ( self ); + ProcessOptions po = { NULL, NULL, format, uri, NULL, NULL }; + gboolean ret = a_babel_convert_from ( vtl, &po, NULL, NULL, options ); + + g_free(uri); + + return ret; +} + +static gchar * +vik_routing_web_engine_get_url_from_directions ( VikRoutingEngine *self, const gchar *start, const gchar *end ) +{ + g_return_val_if_fail ( VIK_IS_ROUTING_WEB_ENGINE (self), NULL); + + VikRoutingWebEnginePrivate *priv = VIK_ROUTING_WEB_ENGINE_PRIVATE ( self ); + + g_return_val_if_fail ( priv->url_base != NULL, NULL); + g_return_val_if_fail ( priv->url_start_dir_fmt != NULL, NULL); + g_return_val_if_fail ( priv->url_stop_dir_fmt != NULL, NULL); + + gchar *from_quoted, *to_quoted; + gchar **from_split, **to_split; + from_quoted = g_shell_quote ( start ); + to_quoted = g_shell_quote ( end ); + + from_split = g_strsplit( from_quoted, " ", 0); + to_split = g_strsplit( to_quoted, " ", 0); + + from_quoted = g_strjoinv( "%20", from_split); + to_quoted = g_strjoinv( "%20", to_split); + + gchar *url_fmt = g_strconcat ( priv->url_base, priv->url_start_dir_fmt, priv->url_stop_dir_fmt, NULL ); + gchar *url = g_strdup_printf ( url_fmt, from_quoted, to_quoted ); + + g_free ( url_fmt ); + + g_free(from_quoted); + g_free(to_quoted); + g_strfreev(from_split); + g_strfreev(to_split); + + return url; +} + +static gboolean +vik_routing_web_engine_supports_direction ( VikRoutingEngine *self ) +{ + g_return_val_if_fail ( VIK_IS_ROUTING_WEB_ENGINE (self), FALSE); + + VikRoutingWebEnginePrivate *priv = VIK_ROUTING_WEB_ENGINE_PRIVATE ( self ); + + return (priv->url_start_dir_fmt) != NULL; +} + +struct _append_ctx { + VikRoutingWebEnginePrivate *priv; + gchar **urlParts; + int nb; +}; + +static void +_append_stringified_coords ( gpointer data, gpointer user_data ) +{ + VikTrackpoint *vtp = (VikTrackpoint*)data; + struct _append_ctx *ctx = (struct _append_ctx*)user_data; + + /* Stringify coordinate */ + struct LatLon position; + vik_coord_to_latlon ( &(vtp->coord), &position ); + gchar *string = (ctx->priv->url_ll_lat_first_fmt) ? + substitute_latlon ( ctx->priv->url_via_ll_fmt, position ): + substitute_lonlat ( ctx->priv->url_via_ll_fmt, position ); + + /* Append */ + ctx->urlParts[ctx->nb] = string; + ctx->nb++; +} + +static gchar * +vik_routing_web_engine_get_url_for_track ( VikRoutingEngine *self, VikTrack *vt ) +{ + gchar **urlParts; + gchar *url; + + VikRoutingWebEnginePrivate *priv = VIK_ROUTING_WEB_ENGINE_PRIVATE ( self ); + + g_return_val_if_fail ( priv->url_base != NULL, NULL ); + g_return_val_if_fail ( priv->url_start_ll_fmt != NULL, NULL ); + g_return_val_if_fail ( priv->url_stop_ll_fmt != NULL, NULL ); + g_return_val_if_fail ( priv->url_via_ll_fmt != NULL, NULL ); + + /* Init temporary storage */ + gsize len = 1 + g_list_length ( vt->trackpoints ) + 1; /* base + trackpoints + NULL */ + urlParts = g_malloc ( sizeof(gchar*)*len ); + urlParts[0] = g_strdup ( priv->url_base ); + urlParts[len-1] = NULL; + + struct _append_ctx ctx; + ctx.priv = priv; + ctx.urlParts = urlParts; + ctx.nb = 1; /* First cell available, previous used for base URL */ + + /* Append all trackpoints to URL */ + g_list_foreach ( vt->trackpoints, _append_stringified_coords, &ctx ); + + /* Override first and last positions with associated formats */ + struct LatLon position; + VikTrackpoint *vtp; + g_free ( urlParts[1] ); + vtp = g_list_first ( vt->trackpoints )->data; + vik_coord_to_latlon ( &(vtp->coord ), &position ); + urlParts[1] = (priv->url_ll_lat_first_fmt) ? + substitute_latlon ( priv->url_start_ll_fmt, position ): + substitute_lonlat ( priv->url_start_ll_fmt, position ); + g_free ( urlParts[len-2] ); + vtp = g_list_last ( vt->trackpoints )->data; + vik_coord_to_latlon ( &(vtp->coord), &position ); + urlParts[len-2] = (priv->url_ll_lat_first_fmt) ? + substitute_latlon ( priv->url_stop_ll_fmt, position ): + substitute_lonlat ( priv->url_stop_ll_fmt, position ); + + /* Concat */ + url = g_strjoinv ( NULL, urlParts ); + g_debug ( "%s: %s", __FUNCTION__, url ); + + /* Free */ + g_strfreev ( urlParts ); + + return url; +} + +static gboolean +vik_routing_web_engine_refine ( VikRoutingEngine *self, VikTrwLayer *vtl, VikTrack *vt ) +{ + /* Compute URL */ + gchar *uri = vik_routing_web_engine_get_url_for_track ( self, vt ); + + /* Download data */ + DownloadFileOptions *options = vik_routing_web_engine_get_download_options ( self ); + + /* Convert and insert data in model */ + gchar *format = vik_routing_engine_get_format ( self ); + ProcessOptions po = { NULL, NULL, format, uri, NULL, NULL }; + gboolean ret = a_babel_convert_from ( vtl, &po, NULL, NULL, options ); + + g_free(uri); + + return ret; +} + +static gboolean +vik_routing_web_engine_supports_refine ( VikRoutingEngine *self ) +{ + g_return_val_if_fail ( VIK_IS_ROUTING_WEB_ENGINE (self), FALSE); + + VikRoutingWebEnginePrivate *priv = VIK_ROUTING_WEB_ENGINE_PRIVATE ( self ); + + return priv->url_via_ll_fmt != NULL; +} diff --git a/src/vikroutingwebengine.h b/src/vikroutingwebengine.h new file mode 100644 index 0000000..a8300b8 --- /dev/null +++ b/src/vikroutingwebengine.h @@ -0,0 +1,54 @@ +/* + * viking -- GPS Data and Topo Analyzer, Explorer, and Manager + * + * Copyright (C) 2012-2013, Guilhem Bonnefille + * + * 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., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA + * + */ +#ifndef _WEB_ROUTING_H +#define _WEB_ROUTING_H + +#include + +#include "vikroutingengine.h" + +G_BEGIN_DECLS + +#define VIK_ROUTING_WEB_ENGINE_TYPE (vik_routing_web_engine_get_type ()) +#define VIK_ROUTING_WEB_ENGINE(obj) (G_TYPE_CHECK_INSTANCE_CAST ((obj), VIK_ROUTING_WEB_ENGINE_TYPE, VikRoutingWebEngine)) +#define VIK_ROUTING_WEB_ENGINE_CLASS(klass) (G_TYPE_CHECK_CLASS_CAST ((klass), VIK_ROUTING_WEB_ENGINE_TYPE, VikRoutingWebEngineClass)) +#define VIK_IS_ROUTING_WEB_ENGINE(obj) (G_TYPE_CHECK_INSTANCE_TYPE ((obj), VIK_ROUTING_WEB_ENGINE_TYPE)) +#define VIK_IS_ROUTING_WEB_ENGINE_CLASS(klass) (G_TYPE_CHECK_CLASS_TYPE ((klass), VIK_ROUTING_WEB_ENGINE_TYPE)) +#define VIK_ROUTING_WEB_ENGINE_GET_CLASS(obj) (G_TYPE_INSTANCE_GET_CLASS ((obj), VIK_ROUTING_WEB_ENGINE_TYPE, VikRoutingWebEngineClass)) + + +typedef struct _VikRoutingWebEngine VikRoutingWebEngine; +typedef struct _VikRoutingWebEngineClass VikRoutingWebEngineClass; + +struct _VikRoutingWebEngineClass +{ + VikRoutingEngineClass object_class; +}; + +GType vik_routing_web_engine_get_type (); + +struct _VikRoutingWebEngine { + VikRoutingEngine obj; +}; + +G_END_DECLS + +#endif diff --git a/src/vikslippymapsource.c b/src/vikslippymapsource.c new file mode 100644 index 0000000..34eec61 --- /dev/null +++ b/src/vikslippymapsource.c @@ -0,0 +1,651 @@ +/* -*- Mode: C; indent-tabs-mode: t; c-basic-offset: 4; tab-width: 4 -*- */ +/* + * viking + * Copyright (C) 2009, Guilhem Bonnefille + * + * viking 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 3 of the License, or + * (at your option) any later version. + * + * viking 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, see . + */ + + /** + * SECTION:vikslippymapsource + * @short_description: the class for SlippyMap oriented map sources + * + * The #VikSlippyMapSource class handles slippy map oriented map sources. + * The related service is tile oriented, à la Google. + * + * The tiles are in 'google spherical mercator', which is + * basically a mercator projection that assumes a spherical earth. + * http://docs.openlayers.org/library/spherical_mercator.html + * + * Such service is also a type of TMS (Tile Map Service) as defined in + * OSGeo's wiki. + * http://wiki.osgeo.org/wiki/Tile_Map_Service_Specification + * But take care that the Y axis is inverted, ie the origin is at top-left + * corner. + * Following this specification, the protocol handled by this class + * follows the global-mercator profile. + * + * You can also find many interesting information on the OSM's wiki. + * http://wiki.openstreetmap.org/wiki/Slippy_map_tilenames + * http://wiki.openstreetmap.org/wiki/Setting_up_TMS + */ + +#ifdef HAVE_CONFIG_H +#include "config.h" +#endif + +#include "vikslippymapsource.h" +#include "maputils.h" + +static gboolean _coord_to_mapcoord ( VikMapSource *self, const VikCoord *src, gdouble xzoom, gdouble yzoom, MapCoord *dest ); +static void _mapcoord_to_center_coord ( VikMapSource *self, MapCoord *src, VikCoord *dest ); + +static gboolean _is_direct_file_access (VikMapSource *self ); +static gboolean _is_mbtiles (VikMapSource *self ); +static gboolean _is_osm_meta_tiles (VikMapSource *self ); +static gboolean _supports_download_only_new (VikMapSource *self ); +static guint8 _get_zoom_min(VikMapSource *self ); +static guint8 _get_zoom_max(VikMapSource *self ); +static gdouble _get_lat_min(VikMapSource *self ); +static gdouble _get_lat_max(VikMapSource *self ); +static gdouble _get_lon_min(VikMapSource *self ); +static gdouble _get_lon_max(VikMapSource *self ); + +static gchar *_get_uri( VikMapSourceDefault *self, MapCoord *src ); +static gchar *_get_hostname( VikMapSourceDefault *self ); +static DownloadFileOptions *_get_download_options( VikMapSourceDefault *self ); + +typedef struct _VikSlippyMapSourcePrivate VikSlippyMapSourcePrivate; +struct _VikSlippyMapSourcePrivate +{ + gchar *hostname; + gchar *url; + DownloadFileOptions options; + // NB Probably best to keep the above fields in same order to be common across Slippy, TMS & WMS map definitions + guint zoom_min; // TMS Zoom level: 0 = Whole World // http://wiki.openstreetmap.org/wiki/Slippy_map_tilenames + guint zoom_max; // TMS Zoom level: Often 18 for zoomed in. + gdouble lat_min; // Degrees + gdouble lat_max; // Degrees + gdouble lon_min; // Degrees + gdouble lon_max; // Degrees + gboolean is_direct_file_access; + gboolean is_mbtiles; + gboolean is_osm_meta_tiles; // http://wiki.openstreetmap.org/wiki/Meta_tiles as used by tirex or renderd + // Mainly for ARCGIS Tile Server URL Layout // http://help.arcgis.com/EN/arcgisserver/10.0/apis/rest/tile.html + gboolean switch_xy; +}; + +#define VIK_SLIPPY_MAP_SOURCE_PRIVATE(o) (G_TYPE_INSTANCE_GET_PRIVATE ((o), VIK_TYPE_SLIPPY_MAP_SOURCE, VikSlippyMapSourcePrivate)) + +/* properties */ +enum +{ + PROP_0, + + PROP_HOSTNAME, + PROP_URL, + PROP_ZOOM_MIN, + PROP_ZOOM_MAX, + PROP_LAT_MIN, + PROP_LAT_MAX, + PROP_LON_MIN, + PROP_LON_MAX, + PROP_REFERER, + PROP_FOLLOW_LOCATION, + PROP_CHECK_FILE_SERVER_TIME, + PROP_USE_ETAG, + PROP_IS_DIRECT_FILE_ACCESS, + PROP_IS_MBTILES, + PROP_IS_OSM_META_TILES, + PROP_SWITCH_XY, +}; + +G_DEFINE_TYPE (VikSlippyMapSource, vik_slippy_map_source, VIK_TYPE_MAP_SOURCE_DEFAULT); + +static void +vik_slippy_map_source_init (VikSlippyMapSource *self) +{ + /* initialize the object here */ + VikSlippyMapSourcePrivate *priv = VIK_SLIPPY_MAP_SOURCE_PRIVATE (self); + + priv->hostname = NULL; + priv->url = NULL; + priv->zoom_min = 0; + priv->zoom_max = 18; + priv->lat_min = -90.0; + priv->lat_max = 90.0; + priv->lon_min = -180.0; + priv->lon_max = 180.0; + priv->options.referer = NULL; + priv->options.follow_location = 0; + priv->options.check_file = a_check_map_file; + priv->options.check_file_server_time = FALSE; + priv->options.use_etag = FALSE; + priv->is_direct_file_access = FALSE; + priv->is_mbtiles = FALSE; + priv->is_osm_meta_tiles = FALSE; + priv->switch_xy = FALSE; + + g_object_set (G_OBJECT (self), + "tilesize-x", 256, + "tilesize-y", 256, + "scale", 1.0, + "drawmode", VIK_VIEWPORT_DRAWMODE_MERCATOR, + NULL); +} + +static void +vik_slippy_map_source_finalize (GObject *object) +{ + VikSlippyMapSource *self = VIK_SLIPPY_MAP_SOURCE (object); + VikSlippyMapSourcePrivate *priv = VIK_SLIPPY_MAP_SOURCE_PRIVATE (self); + + g_free (priv->hostname); + priv->hostname = NULL; + g_free (priv->url); + priv->url = NULL; + g_free (priv->options.referer); + priv->options.referer = NULL; + + G_OBJECT_CLASS (vik_slippy_map_source_parent_class)->finalize (object); +} + +static void +vik_slippy_map_source_set_property (GObject *object, + guint property_id, + const GValue *value, + GParamSpec *pspec) +{ + VikSlippyMapSource *self = VIK_SLIPPY_MAP_SOURCE (object); + VikSlippyMapSourcePrivate *priv = VIK_SLIPPY_MAP_SOURCE_PRIVATE (self); + + switch (property_id) + { + case PROP_HOSTNAME: + g_free (priv->hostname); + priv->hostname = g_value_dup_string (value); + break; + + case PROP_URL: + g_free (priv->url); + priv->url = g_value_dup_string (value); + break; + + case PROP_ZOOM_MIN: + priv->zoom_min = g_value_get_uint (value); + break; + + case PROP_ZOOM_MAX: + priv->zoom_max = g_value_get_uint (value); + break; + + case PROP_LAT_MIN: + priv->lat_min = g_value_get_double (value); + break; + + case PROP_LAT_MAX: + priv->lat_max = g_value_get_double (value); + break; + + case PROP_LON_MIN: + priv->lon_min = g_value_get_double (value); + break; + + case PROP_LON_MAX: + priv->lon_max = g_value_get_double (value); + break; + + case PROP_REFERER: + g_free (priv->options.referer); + priv->options.referer = g_value_dup_string (value); + break; + + case PROP_FOLLOW_LOCATION: + priv->options.follow_location = g_value_get_long (value); + break; + + case PROP_CHECK_FILE_SERVER_TIME: + priv->options.check_file_server_time = g_value_get_boolean (value); + break; + + case PROP_USE_ETAG: + priv->options.use_etag = g_value_get_boolean (value); + break; + + case PROP_IS_DIRECT_FILE_ACCESS: + priv->is_direct_file_access = g_value_get_boolean (value); + break; + + case PROP_IS_MBTILES: + priv->is_mbtiles = g_value_get_boolean (value); + break; + + case PROP_IS_OSM_META_TILES: + priv->is_osm_meta_tiles = g_value_get_boolean (value); + break; + + case PROP_SWITCH_XY: + priv->switch_xy = g_value_get_boolean (value); + break; + + default: + /* We don't have any other property... */ + G_OBJECT_WARN_INVALID_PROPERTY_ID (object, property_id, pspec); + break; + } +} + +static void +vik_slippy_map_source_get_property (GObject *object, + guint property_id, + GValue *value, + GParamSpec *pspec) +{ + VikSlippyMapSource *self = VIK_SLIPPY_MAP_SOURCE (object); + VikSlippyMapSourcePrivate *priv = VIK_SLIPPY_MAP_SOURCE_PRIVATE (self); + + switch (property_id) + { + case PROP_HOSTNAME: + g_value_set_string (value, priv->hostname); + break; + + case PROP_URL: + g_value_set_string (value, priv->url); + break; + + case PROP_ZOOM_MIN: + g_value_set_uint (value, priv->zoom_min); + break; + + case PROP_ZOOM_MAX: + g_value_set_uint (value, priv->zoom_max); + break; + + case PROP_LON_MIN: + g_value_set_double (value, priv->lon_min); + break; + + case PROP_LON_MAX: + g_value_set_double (value, priv->lon_max); + break; + + case PROP_LAT_MIN: + g_value_set_double (value, priv->lat_min); + break; + + case PROP_LAT_MAX: + g_value_set_double (value, priv->lat_max); + break; + + case PROP_REFERER: + g_value_set_string (value, priv->options.referer); + break; + + case PROP_FOLLOW_LOCATION: + g_value_set_long (value, priv->options.follow_location); + break; + + case PROP_CHECK_FILE_SERVER_TIME: + g_value_set_boolean (value, priv->options.check_file_server_time); + break; + + case PROP_USE_ETAG: + g_value_set_boolean (value, priv->options.use_etag); + break; + + case PROP_IS_DIRECT_FILE_ACCESS: + g_value_set_boolean (value, priv->is_direct_file_access); + break; + + case PROP_IS_MBTILES: + g_value_set_boolean (value, priv->is_mbtiles); + break; + + case PROP_IS_OSM_META_TILES: + g_value_set_boolean (value, priv->is_osm_meta_tiles); + break; + + case PROP_SWITCH_XY: + g_value_set_boolean (value, priv->switch_xy); + break; + + default: + /* We don't have any other property... */ + G_OBJECT_WARN_INVALID_PROPERTY_ID (object, property_id, pspec); + break; + } +} + +static void +vik_slippy_map_source_class_init (VikSlippyMapSourceClass *klass) +{ + GObjectClass* object_class = G_OBJECT_CLASS (klass); + VikMapSourceClass* grandparent_class = VIK_MAP_SOURCE_CLASS (klass); + VikMapSourceDefaultClass* parent_class = VIK_MAP_SOURCE_DEFAULT_CLASS (klass); + GParamSpec *pspec = NULL; + + object_class->set_property = vik_slippy_map_source_set_property; + object_class->get_property = vik_slippy_map_source_get_property; + + /* Overiding methods */ + grandparent_class->coord_to_mapcoord = _coord_to_mapcoord; + grandparent_class->mapcoord_to_center_coord = _mapcoord_to_center_coord; + grandparent_class->is_direct_file_access = _is_direct_file_access; + grandparent_class->is_mbtiles = _is_mbtiles; + grandparent_class->is_osm_meta_tiles = _is_osm_meta_tiles; + grandparent_class->supports_download_only_new = _supports_download_only_new; + grandparent_class->get_zoom_min = _get_zoom_min; + grandparent_class->get_zoom_max = _get_zoom_max; + grandparent_class->get_lat_min = _get_lat_min; + grandparent_class->get_lat_max = _get_lat_max; + grandparent_class->get_lon_min = _get_lon_min; + grandparent_class->get_lon_max = _get_lon_max; + + parent_class->get_uri = _get_uri; + parent_class->get_hostname = _get_hostname; + parent_class->get_download_options = _get_download_options; + + pspec = g_param_spec_string ("hostname", + "Hostname", + "The hostname of the map server", + "" /* default value */, + G_PARAM_READWRITE); + g_object_class_install_property (object_class, PROP_HOSTNAME, pspec); + + pspec = g_param_spec_string ("url", + "URL", + "The template of the tiles' URL", + "" /* default value */, + G_PARAM_READWRITE); + g_object_class_install_property (object_class, PROP_URL, pspec); + + pspec = g_param_spec_uint ("zoom-min", + "Minimum zoom", + "Minimum Zoom level supported by the map provider", + 0, // minimum value, + 22, // maximum value + 0, // default value + G_PARAM_CONSTRUCT_ONLY | G_PARAM_READWRITE); + g_object_class_install_property (object_class, PROP_ZOOM_MIN, pspec); + + pspec = g_param_spec_uint ("zoom-max", + "Maximum zoom", + "Maximum Zoom level supported by the map provider", + 0, // minimum value, + 22, // maximum value + 18, // default value + G_PARAM_CONSTRUCT_ONLY | G_PARAM_READWRITE); + g_object_class_install_property (object_class, PROP_ZOOM_MAX, pspec); + + pspec = g_param_spec_double ("lat-min", + "Minimum latitude", + "Minimum latitude in degrees supported by the map provider", + -90.0, // minimum value + 90.0, // maximum value + -90.0, // default value + G_PARAM_CONSTRUCT_ONLY | G_PARAM_READWRITE); + g_object_class_install_property (object_class, PROP_LAT_MIN, pspec); + + pspec = g_param_spec_double ("lat-max", + "Maximum latitude", + "Maximum latitude in degrees supported by the map provider", + -90.0, // minimum value + 90.0, // maximum value + 90.0, // default value + G_PARAM_CONSTRUCT_ONLY | G_PARAM_READWRITE); + g_object_class_install_property (object_class, PROP_LAT_MAX, pspec); + + pspec = g_param_spec_double ("lon-min", + "Minimum longitude", + "Minimum longitude in degrees supported by the map provider", + -180.0, // minimum value + 180.0, // maximum value + -180.0, // default value + G_PARAM_CONSTRUCT_ONLY | G_PARAM_READWRITE); + g_object_class_install_property (object_class, PROP_LON_MIN, pspec); + + pspec = g_param_spec_double ("lon-max", + "Maximum longitude", + "Maximum longitude in degrees supported by the map provider", + -180.0, // minimum value + 180.0, // maximum value + 180.0, // default value + G_PARAM_CONSTRUCT_ONLY | G_PARAM_READWRITE); + g_object_class_install_property (object_class, PROP_LON_MAX, pspec); + + pspec = g_param_spec_string ("referer", + "Referer", + "The REFERER string to use in HTTP request", + NULL /* default value */, + G_PARAM_CONSTRUCT_ONLY | G_PARAM_READWRITE); + g_object_class_install_property (object_class, PROP_REFERER, pspec); + + pspec = g_param_spec_long ("follow-location", + "Follow location", + "Specifies the number of retries to follow a redirect while downloading a page", + 0 /* minimum value */, + G_MAXLONG /* maximum value */, + 0 /* default value */, + G_PARAM_CONSTRUCT_ONLY | G_PARAM_READWRITE); + g_object_class_install_property (object_class, PROP_FOLLOW_LOCATION, pspec); + + pspec = g_param_spec_boolean ("check-file-server-time", + "Check file server time", + "Age of current cache before redownloading tile", + FALSE /* default value */, + G_PARAM_CONSTRUCT_ONLY | G_PARAM_READWRITE); + g_object_class_install_property (object_class, PROP_CHECK_FILE_SERVER_TIME, pspec); + + pspec = g_param_spec_boolean ("use-etag", + "Use etag values with server", + "Store etag in a file, and send it to server to check if we have the latest file", + FALSE /* default value */, + G_PARAM_CONSTRUCT_ONLY | G_PARAM_READWRITE); + g_object_class_install_property (object_class, PROP_USE_ETAG, pspec); + + pspec = g_param_spec_boolean ("use-direct-file-access", + "Use direct file access", + "Use direct file access to OSM like tile images - no need for a webservice", + FALSE /* default value */, + G_PARAM_CONSTRUCT_ONLY | G_PARAM_READWRITE); + g_object_class_install_property (object_class, PROP_IS_DIRECT_FILE_ACCESS, pspec); + + pspec = g_param_spec_boolean ("is-mbtiles", + "Is an SQL MBTiles File", + "Use an SQL MBTiles File for the tileset - no need for a webservice", + FALSE /* default value */, + G_PARAM_CONSTRUCT_ONLY | G_PARAM_READWRITE); + g_object_class_install_property (object_class, PROP_IS_MBTILES, pspec); + + pspec = g_param_spec_boolean ("is-osm-meta-tiles", + "Is in OSM Meta Tile format", + "Read from OSM Meta Tiles - Should be 'use-direct-file-access' as well", + FALSE /* default value */, + G_PARAM_CONSTRUCT_ONLY | G_PARAM_READWRITE); + g_object_class_install_property (object_class, PROP_IS_OSM_META_TILES, pspec); + + pspec = g_param_spec_boolean ("switch-xy", + "Switch the order of x,y components in the URL", + "Switch the order of x,y components in the URL (such as used by ARCGIS Tile Server", + FALSE /* default value */, + G_PARAM_CONSTRUCT_ONLY | G_PARAM_READWRITE); + g_object_class_install_property (object_class, PROP_SWITCH_XY, pspec); + + g_type_class_add_private (klass, sizeof (VikSlippyMapSourcePrivate)); + + object_class->finalize = vik_slippy_map_source_finalize; +} + +static gboolean +_is_direct_file_access (VikMapSource *self) +{ + g_return_val_if_fail (VIK_IS_SLIPPY_MAP_SOURCE(self), FALSE); + + VikSlippyMapSourcePrivate *priv = VIK_SLIPPY_MAP_SOURCE_PRIVATE(self); + + return priv->is_direct_file_access; +} + +static gboolean +_is_mbtiles (VikMapSource *self) +{ + g_return_val_if_fail (VIK_IS_SLIPPY_MAP_SOURCE(self), FALSE); + + VikSlippyMapSourcePrivate *priv = VIK_SLIPPY_MAP_SOURCE_PRIVATE(self); + + return priv->is_mbtiles; +} + +/** + * + */ +static gboolean +_is_osm_meta_tiles (VikMapSource *self) +{ + g_return_val_if_fail (VIK_IS_SLIPPY_MAP_SOURCE(self), FALSE); + VikSlippyMapSourcePrivate *priv = VIK_SLIPPY_MAP_SOURCE_PRIVATE(self); + return priv->is_osm_meta_tiles; +} + +static gboolean +_supports_download_only_new (VikMapSource *self) +{ + g_return_val_if_fail (VIK_IS_SLIPPY_MAP_SOURCE(self), FALSE); + + VikSlippyMapSourcePrivate *priv = VIK_SLIPPY_MAP_SOURCE_PRIVATE(self); + + return priv->options.check_file_server_time || priv->options.use_etag; +} + +/** + * + */ +static guint8 +_get_zoom_min (VikMapSource *self) +{ + g_return_val_if_fail (VIK_IS_SLIPPY_MAP_SOURCE(self), FALSE); + VikSlippyMapSourcePrivate *priv = VIK_SLIPPY_MAP_SOURCE_PRIVATE(self); + return priv->zoom_min; +} + +/** + * + */ +static guint8 +_get_zoom_max (VikMapSource *self) +{ + g_return_val_if_fail (VIK_IS_SLIPPY_MAP_SOURCE(self), FALSE); + VikSlippyMapSourcePrivate *priv = VIK_SLIPPY_MAP_SOURCE_PRIVATE(self); + return priv->zoom_max; +} + +/** + * + */ +static gdouble +_get_lat_min (VikMapSource *self) +{ + g_return_val_if_fail (VIK_IS_SLIPPY_MAP_SOURCE(self), FALSE); + VikSlippyMapSourcePrivate *priv = VIK_SLIPPY_MAP_SOURCE_PRIVATE(self); + return priv->lat_min; +} + +/** + * + */ +static gdouble +_get_lat_max (VikMapSource *self) +{ + g_return_val_if_fail (VIK_IS_SLIPPY_MAP_SOURCE(self), FALSE); + VikSlippyMapSourcePrivate *priv = VIK_SLIPPY_MAP_SOURCE_PRIVATE(self); + return priv->lat_max; +} + +/** + * + */ +static gdouble +_get_lon_min (VikMapSource *self) +{ + g_return_val_if_fail (VIK_IS_SLIPPY_MAP_SOURCE(self), FALSE); + VikSlippyMapSourcePrivate *priv = VIK_SLIPPY_MAP_SOURCE_PRIVATE(self); + return priv->lon_min; +} + +/** + * + */ +static gdouble +_get_lon_max (VikMapSource *self) +{ + g_return_val_if_fail (VIK_IS_SLIPPY_MAP_SOURCE(self), FALSE); + VikSlippyMapSourcePrivate *priv = VIK_SLIPPY_MAP_SOURCE_PRIVATE(self); + return priv->lon_max; +} + +static gboolean +_coord_to_mapcoord ( VikMapSource *self, const VikCoord *src, gdouble xzoom, gdouble yzoom, MapCoord *dest ) +{ + return map_utils_vikcoord_to_iTMS ( src, xzoom, yzoom, dest ); +} + +static void +_mapcoord_to_center_coord ( VikMapSource *self, MapCoord *src, VikCoord *dest ) +{ + map_utils_iTMS_to_center_vikcoord ( src, dest ); +} + +static gchar * +_get_uri( VikMapSourceDefault *self, MapCoord *src ) +{ + g_return_val_if_fail (VIK_IS_SLIPPY_MAP_SOURCE(self), NULL); + + VikSlippyMapSourcePrivate *priv = VIK_SLIPPY_MAP_SOURCE_PRIVATE(self); + + gchar *uri = NULL; + if ( priv->switch_xy ) + // 'ARC GIS' Tile Server layout ordering + uri = g_strdup_printf (priv->url, 17 - src->scale, src->y, src->x); + else + // (Default) Standard OSM Tile Server layout ordering + uri = g_strdup_printf (priv->url, 17 - src->scale, src->x, src->y); + + return uri; +} + +static gchar * +_get_hostname( VikMapSourceDefault *self ) +{ + g_return_val_if_fail (VIK_IS_SLIPPY_MAP_SOURCE(self), NULL); + + VikSlippyMapSourcePrivate *priv = VIK_SLIPPY_MAP_SOURCE_PRIVATE(self); + return g_strdup( priv->hostname ); +} + +static DownloadFileOptions * +_get_download_options( VikMapSourceDefault *self ) +{ + g_return_val_if_fail (VIK_IS_SLIPPY_MAP_SOURCE(self), NULL); + + VikSlippyMapSourcePrivate *priv = VIK_SLIPPY_MAP_SOURCE_PRIVATE(self); + return &(priv->options); +} + +VikSlippyMapSource * +vik_slippy_map_source_new_with_id (guint16 id, const gchar *label, const gchar *hostname, const gchar *url) +{ + return g_object_new(VIK_TYPE_SLIPPY_MAP_SOURCE, + "id", id, "label", label, "hostname", hostname, "url", url, NULL); +} diff --git a/src/vikslippymapsource.h b/src/vikslippymapsource.h new file mode 100644 index 0000000..9ec2b05 --- /dev/null +++ b/src/vikslippymapsource.h @@ -0,0 +1,57 @@ +/* -*- Mode: C; indent-tabs-mode: t; c-basic-offset: 4; tab-width: 4 -*- */ +/* + * viking + * Copyright (C) 2009, Guilhem Bonnefille + * + * viking 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. + * + * viking 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, see . + */ + +#ifndef _VIK_SLIPPY_MAP_SOURCE_H +#define _VIK_SLIPPY_MAP_SOURCE_H + +#include + +#include "vikcoord.h" +#include "mapcoord.h" +#include "vikmapsourcedefault.h" + +G_BEGIN_DECLS + +#define VIK_TYPE_SLIPPY_MAP_SOURCE (vik_slippy_map_source_get_type ()) +#define VIK_SLIPPY_MAP_SOURCE(obj) (G_TYPE_CHECK_INSTANCE_CAST ((obj), VIK_TYPE_SLIPPY_MAP_SOURCE, VikSlippyMapSource)) +#define VIK_SLIPPY_MAP_SOURCE_CLASS(klass) (G_TYPE_CHECK_CLASS_CAST ((klass), VIK_TYPE_SLIPPY_MAP_SOURCE, VikSlippyMapSourceClass)) +#define VIK_IS_SLIPPY_MAP_SOURCE(obj) (G_TYPE_CHECK_INSTANCE_TYPE ((obj), VIK_TYPE_SLIPPY_MAP_SOURCE)) +#define VIK_IS_SLIPPY_MAP_SOURCE_CLASS(klass) (G_TYPE_CHECK_CLASS_TYPE ((klass), VIK_TYPE_SLIPPY_MAP_SOURCE)) +#define VIK_SLIPPY_MAP_SOURCE_GET_CLASS(obj) (G_TYPE_INSTANCE_GET_CLASS ((obj), VIK_TYPE_SLIPPY_MAP_SOURCE, VikSlippyMapSourceClass)) + +typedef struct _VikSlippyMapSourceClass VikSlippyMapSourceClass; +typedef struct _VikSlippyMapSource VikSlippyMapSource; + +struct _VikSlippyMapSourceClass +{ + VikMapSourceDefaultClass parent_class; +}; + +struct _VikSlippyMapSource +{ + VikMapSourceDefault parent_instance; +}; + +GType vik_slippy_map_source_get_type (void) G_GNUC_CONST; + +VikSlippyMapSource * vik_slippy_map_source_new_with_id (guint16 id, const gchar *label, const gchar *hostname, const gchar *url); + +G_END_DECLS + +#endif /* _VIK_SLIPPY_MAP_SOURCE_H_ */ diff --git a/src/vikstatus.c b/src/vikstatus.c new file mode 100644 index 0000000..36427d7 --- /dev/null +++ b/src/vikstatus.c @@ -0,0 +1,199 @@ +/* + * viking -- GPS Data and Topo Analyzer, Explorer, and Manager + * + * Copyright (C) 2003-2005, Evan Battaglia + * Copyright (C) 2012, Guilhem Bonnefille + * Copyright (C) 2018, Rob Norris + * + * 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., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA + * + */ + +/* gtk status bars: just plain dumb. this file shouldn't have to exist. + NB as of gtk 2.18 there are 'info bars' that could be useful... */ +#include + +#include + +#include + +#include "vikstatus.h" +#include "background.h" + +enum +{ + CLICKED, + LAST_SIGNAL +}; + +struct _VikStatusbar { + GtkHBox hbox; + GtkWidget *status[VIK_STATUSBAR_NUM_TYPES]; + gboolean empty[VIK_STATUSBAR_NUM_TYPES]; +}; + +G_DEFINE_TYPE (VikStatusbar, vik_statusbar, GTK_TYPE_HBOX) + +static guint vik_statusbar_signals[LAST_SIGNAL] = { 0 }; + +static gint +forward_signal (GObject *object, gpointer user_data) +{ + gint item = GPOINTER_TO_INT (g_object_get_data ( object, "type" )); + VikStatusbar *vs = VIK_STATUSBAR (user_data); + + // Clicking on the items field will bring up the background jobs window + if ( item == VIK_STATUSBAR_ITEMS ) + a_background_show_window(); + else if ( item == VIK_STATUSBAR_INFO ) + // Clear current info message + vik_statusbar_set_message ( vs, VIK_STATUSBAR_INFO, "" ); + else + g_signal_emit (G_OBJECT (vs), + vik_statusbar_signals[CLICKED], 0, + item); + + return TRUE; +} + +static void +vik_statusbar_class_init (VikStatusbarClass *klass) +{ + vik_statusbar_signals[CLICKED] = + g_signal_new ("clicked", + G_TYPE_FROM_CLASS (klass), + G_SIGNAL_RUN_FIRST, + G_STRUCT_OFFSET (VikStatusbarClass, clicked), + NULL, NULL, + g_cclosure_marshal_VOID__INT, + G_TYPE_NONE, 1, + G_TYPE_INT); + + klass->clicked = NULL; +} + +static gboolean button_release_event (GtkWidget* widget, GdkEvent *event, gpointer *user_data) +{ + if ( ((GdkEventButton*)event)->button == 3 ) { + gint type = GPOINTER_TO_INT (g_object_get_data ( G_OBJECT(widget), "type" )); + VikStatusbar *vs = VIK_STATUSBAR (user_data); + // Right Click: so copy the text in the INFO buffer only ATM + if ( type == VIK_STATUSBAR_INFO ) { + const gchar* msg = gtk_button_get_label (GTK_BUTTON(vs->status[VIK_STATUSBAR_INFO])); + if ( msg ) { + GtkClipboard *clipboard = gtk_clipboard_get ( GDK_SELECTION_CLIPBOARD ); + gtk_clipboard_set_text ( clipboard, msg, -1 ); + } + } + // We've handled the event + return TRUE; + } + // Otherwise carry on with other event handlers - i.e. ensure forward_signal() is called + return FALSE; +} + +static void +vik_statusbar_init (VikStatusbar *vs) +{ + gint i; + + for ( i = 0; i < VIK_STATUSBAR_NUM_TYPES; i++ ) { + vs->empty[i] = TRUE; + + if (i == VIK_STATUSBAR_ITEMS || i == VIK_STATUSBAR_ZOOM || i == VIK_STATUSBAR_INFO ) + vs->status[i] = gtk_button_new(); + else + { + vs->status[i] = gtk_statusbar_new(); + gtk_statusbar_set_has_resize_grip ( GTK_STATUSBAR(vs->status[i]), FALSE ); + } + g_object_set_data (G_OBJECT (vs->status[i]), "type", GINT_TO_POINTER(i)); + } + + gtk_box_pack_start ( GTK_BOX(vs), vs->status[VIK_STATUSBAR_TOOL], FALSE, FALSE, 1); + + g_signal_connect ( G_OBJECT(vs->status[VIK_STATUSBAR_ITEMS]), "clicked", G_CALLBACK (forward_signal), vs); + gtk_button_set_relief ( GTK_BUTTON(vs->status[VIK_STATUSBAR_ITEMS]), GTK_RELIEF_NONE ); + gtk_widget_set_tooltip_text (GTK_WIDGET (vs->status[VIK_STATUSBAR_ITEMS]), _("Current number of background tasks. Click to see the background jobs.")); + gtk_box_pack_start ( GTK_BOX(vs), vs->status[VIK_STATUSBAR_ITEMS], FALSE, FALSE, 1); + + g_signal_connect ( G_OBJECT(vs->status[VIK_STATUSBAR_ZOOM]), "clicked", G_CALLBACK (forward_signal), vs); + gtk_button_set_relief ( GTK_BUTTON(vs->status[VIK_STATUSBAR_ZOOM]), GTK_RELIEF_NONE ); + gtk_widget_set_tooltip_text (GTK_WIDGET (vs->status[VIK_STATUSBAR_ZOOM]), _("Current zoom level. Click to select a new one.")); + gtk_box_pack_start ( GTK_BOX(vs), vs->status[VIK_STATUSBAR_ZOOM], FALSE, FALSE, 1); + + gtk_box_pack_start ( GTK_BOX(vs), vs->status[VIK_STATUSBAR_POSITION], FALSE, FALSE, 1); + + g_signal_connect ( G_OBJECT(vs->status[VIK_STATUSBAR_INFO]), "button-release-event", G_CALLBACK (button_release_event), vs); + g_signal_connect ( G_OBJECT(vs->status[VIK_STATUSBAR_INFO]), "clicked", G_CALLBACK (forward_signal), vs); + gtk_widget_set_tooltip_text (GTK_WIDGET (vs->status[VIK_STATUSBAR_INFO]), _("Left click to clear the message. Right click to copy the message.")); + gtk_button_set_alignment ( GTK_BUTTON(vs->status[VIK_STATUSBAR_INFO]), 0.0, 0.5 ); // Left align the text + gtk_box_pack_end ( GTK_BOX(vs), vs->status[VIK_STATUSBAR_INFO], TRUE, TRUE, 1); +} + +/** + * vik_statusbar_new: + * + * Creates a new #VikStatusbar widget. + * + * Return value: the new #VikStatusbar widget. + **/ +VikStatusbar * +vik_statusbar_new (guint scale) +{ + VikStatusbar *vs = VIK_STATUSBAR ( g_object_new ( VIK_STATUSBAR_TYPE, NULL ) ); + + gtk_widget_set_size_request ( vs->status[VIK_STATUSBAR_TOOL], 125*scale, -1 ); + gtk_widget_set_size_request ( vs->status[VIK_STATUSBAR_ITEMS], 100*scale, -1 ); + gtk_widget_set_size_request ( vs->status[VIK_STATUSBAR_ZOOM], 100*scale, -1 ); + gtk_widget_set_size_request ( vs->status[VIK_STATUSBAR_POSITION], 275*scale, -1 ); + // Set minimum overall size + // otherwise the individual size_requests above create an implicit overall size, + // and so one can't downsize horizontally as much as may be desired when the statusbar is on + gtk_widget_set_size_request ( GTK_WIDGET(vs), 50*scale, -1 ); + + return vs; +} + +/** + * vik_statusbar_set_message: + * @vs: the #VikStatusbar itself + * @field: the field to update + * @message: the message to use + * + * Update the message of the given field. + **/ +void +vik_statusbar_set_message ( VikStatusbar *vs, vik_statusbar_type_t field, const gchar *message ) +{ + if ( field >= 0 && field < VIK_STATUSBAR_NUM_TYPES ) + { + if ( field == VIK_STATUSBAR_ITEMS || field == VIK_STATUSBAR_ZOOM || field == VIK_STATUSBAR_INFO ) + { + gtk_button_set_label ( GTK_BUTTON(vs->status[field]), message); + } + else + { + GtkStatusbar *gsb = GTK_STATUSBAR(vs->status[field]); + + if ( !vs->empty[field] ) + gtk_statusbar_pop ( gsb, 0 ); + else + vs->empty[field] = FALSE; + + gtk_statusbar_push ( gsb, 0, message ); + } + } +} diff --git a/src/vikstatus.h b/src/vikstatus.h new file mode 100644 index 0000000..b0b084e --- /dev/null +++ b/src/vikstatus.h @@ -0,0 +1,65 @@ +/* + * viking -- GPS Data and Topo Analyzer, Explorer, and Manager + * + * Copyright (C) 2003-2005, Evan Battaglia + * + * 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., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA + * + */ + +#ifndef _VIKING_STATUS_H +#define _VIKING_STATUS_H + +#include +#include +#include + +G_BEGIN_DECLS + +#define VIK_STATUSBAR_TYPE (vik_statusbar_get_type ()) +#define VIK_STATUSBAR(obj) (G_TYPE_CHECK_INSTANCE_CAST ((obj), VIK_STATUSBAR_TYPE, VikStatusbar)) +#define VIK_STATUSBAR_CLASS(klass) (G_TYPE_CHECK_CLASS_CAST ((klass), VIK_STATUSBAR_TYPE, VikStatusbarClass)) +#define IS_VIK_STATUSBAR(obj) (G_TYPE_CHECK_INSTANCE_TYPE ((obj), VIK_STATUSBAR_TYPE)) +#define IS_VIK_STATUSBAR_CLASS(klass) (G_TYPE_CHECK_CLASS_TYPE ((klass), VIK_STATUSBAR_TYPE)) + +typedef struct _VikStatusbar VikStatusbar; +typedef struct _VikStatusbarClass VikStatusbarClass; + +struct _VikStatusbarClass +{ + GtkStatusbarClass statusbar_class; + + void (* clicked) (VikStatusbar *vs, + gint item); +}; + +GType vik_statusbar_get_type (); + + +typedef enum { + VIK_STATUSBAR_TOOL, + VIK_STATUSBAR_ITEMS, + VIK_STATUSBAR_ZOOM, + VIK_STATUSBAR_INFO, + VIK_STATUSBAR_POSITION, + VIK_STATUSBAR_NUM_TYPES +} vik_statusbar_type_t; + +VikStatusbar *vik_statusbar_new ( guint scale ); +void vik_statusbar_set_message ( VikStatusbar *vs, vik_statusbar_type_t field, const gchar *message ); + +G_END_DECLS + +#endif diff --git a/src/viktmsmapsource.c b/src/viktmsmapsource.c new file mode 100644 index 0000000..c95ee37 --- /dev/null +++ b/src/viktmsmapsource.c @@ -0,0 +1,574 @@ +/* -*- Mode: C; indent-tabs-mode: t; c-basic-offset: 4; tab-width: 4 -*- */ +/* + * viking + * Copyright (C) 2010, Guilhem Bonnefille + * + * viking 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. + * + * viking 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, see . + */ + + /** + * SECTION:viktmsmapsource + * @short_description: the class for TMS oriented map sources + * + * The #VikTmsMapSource class handles TMS oriented map sources. + * + * The tiles are in 'equirectangular'. + * http://en.wikipedia.org/wiki/Equirectangular_projection + * + * Such service is also a type of TMS (Tile Map Service) as defined in + * OSGeo's wiki. + * http://wiki.osgeo.org/wiki/Tile_Map_Service_Specification + * Following this specification, the protocol handled by this class + * follows the global-geodetic profile. + */ + +#ifdef HAVE_CONFIG_H +#include "config.h" +#endif + +#ifdef HAVE_MATH_H +#include +#endif + +#include "globals.h" +#include "viktmsmapsource.h" +#include "maputils.h" + +static gboolean _coord_to_mapcoord ( VikMapSource *self, const VikCoord *src, gdouble xzoom, gdouble yzoom, MapCoord *dest ); +static void _mapcoord_to_center_coord ( VikMapSource *self, MapCoord *src, VikCoord *dest ); +static gboolean _supports_download_only_new ( VikMapSource *self ); +static gboolean _is_direct_file_access ( VikMapSource *self ); +static gboolean _is_mbtiles ( VikMapSource *self ); +static gboolean _is_osm_meta_tiles (VikMapSource *self ); +static guint8 _get_zoom_min(VikMapSource *self ); +static guint8 _get_zoom_max(VikMapSource *self ); +static gdouble _get_lat_min(VikMapSource *self ); +static gdouble _get_lat_max(VikMapSource *self ); +static gdouble _get_lon_min(VikMapSource *self ); +static gdouble _get_lon_max(VikMapSource *self ); + +static gchar *_get_uri( VikMapSourceDefault *self, MapCoord *src ); +static gchar *_get_hostname( VikMapSourceDefault *self ); +static DownloadFileOptions *_get_download_options( VikMapSourceDefault *self ); + +typedef struct _VikTmsMapSourcePrivate VikTmsMapSourcePrivate; +struct _VikTmsMapSourcePrivate +{ + gchar *hostname; + gchar *url; + DownloadFileOptions options; + guint zoom_min; // TMS Zoom level: 0 = Whole World // http://wiki.openstreetmap.org/wiki/Slippy_map_tilenames + guint zoom_max; // TMS Zoom level: Often 18 for zoomed in. + gdouble lat_min; // Degrees + gdouble lat_max; // Degrees + gdouble lon_min; // Degrees + gdouble lon_max; // Degrees +}; + +#define VIK_TMS_MAP_SOURCE_PRIVATE(o) (G_TYPE_INSTANCE_GET_PRIVATE ((o), VIK_TYPE_TMS_MAP_SOURCE, VikTmsMapSourcePrivate)) + +/* properties */ +enum +{ + PROP_0, + + PROP_HOSTNAME, + PROP_URL, + PROP_REFERER, + PROP_FOLLOW_LOCATION, + PROP_CHECK_FILE_SERVER_TIME, + PROP_ZOOM_MIN, + PROP_ZOOM_MAX, + PROP_LAT_MIN, + PROP_LAT_MAX, + PROP_LON_MIN, + PROP_LON_MAX, +}; + +G_DEFINE_TYPE (VikTmsMapSource, vik_tms_map_source, VIK_TYPE_MAP_SOURCE_DEFAULT); + +static void +vik_tms_map_source_init (VikTmsMapSource *self) +{ + /* initialize the object here */ + VikTmsMapSourcePrivate *priv = VIK_TMS_MAP_SOURCE_PRIVATE (self); + + priv->hostname = NULL; + priv->url = NULL; + priv->options.referer = NULL; + priv->options.follow_location = 0; + priv->options.check_file = a_check_map_file; + priv->options.check_file_server_time = FALSE; + priv->zoom_min = 0; + priv->zoom_max = 18; + priv->lat_min = -90.0; + priv->lat_max = 90.0; + priv->lon_min = -180.0; + priv->lon_max = 180.0; + + g_object_set (G_OBJECT (self), + "tilesize-x", 256, + "tilesize-y", 256, + "drawmode", VIK_VIEWPORT_DRAWMODE_LATLON, + NULL); +} + +static void +vik_tms_map_source_finalize (GObject *object) +{ + VikTmsMapSource *self = VIK_TMS_MAP_SOURCE (object); + VikTmsMapSourcePrivate *priv = VIK_TMS_MAP_SOURCE_PRIVATE (self); + + g_free (priv->hostname); + priv->hostname = NULL; + g_free (priv->url); + priv->url = NULL; + g_free (priv->options.referer); + priv->options.referer = NULL; + + G_OBJECT_CLASS (vik_tms_map_source_parent_class)->finalize (object); +} + +static void +vik_tms_map_source_set_property (GObject *object, + guint property_id, + const GValue *value, + GParamSpec *pspec) +{ + VikTmsMapSource *self = VIK_TMS_MAP_SOURCE (object); + VikTmsMapSourcePrivate *priv = VIK_TMS_MAP_SOURCE_PRIVATE (self); + + switch (property_id) + { + case PROP_HOSTNAME: + g_free (priv->hostname); + priv->hostname = g_value_dup_string (value); + break; + + case PROP_URL: + g_free (priv->url); + priv->url = g_value_dup_string (value); + break; + + case PROP_REFERER: + g_free (priv->options.referer); + priv->options.referer = g_value_dup_string (value); + break; + + case PROP_FOLLOW_LOCATION: + priv->options.follow_location = g_value_get_long (value); + break; + + case PROP_CHECK_FILE_SERVER_TIME: + priv->options.check_file_server_time = g_value_get_boolean (value); + break; + + case PROP_ZOOM_MIN: + priv->zoom_min = g_value_get_uint (value); + break; + + case PROP_ZOOM_MAX: + priv->zoom_max = g_value_get_uint (value); + break; + + case PROP_LAT_MIN: + priv->lat_min = g_value_get_double (value); + break; + + case PROP_LAT_MAX: + priv->lat_max = g_value_get_double (value); + break; + + case PROP_LON_MIN: + priv->lon_min = g_value_get_double (value); + break; + + case PROP_LON_MAX: + priv->lon_max = g_value_get_double (value); + break; + + default: + /* We don't have any other property... */ + G_OBJECT_WARN_INVALID_PROPERTY_ID (object, property_id, pspec); + break; + } +} + +static void +vik_tms_map_source_get_property (GObject *object, + guint property_id, + GValue *value, + GParamSpec *pspec) +{ + VikTmsMapSource *self = VIK_TMS_MAP_SOURCE (object); + VikTmsMapSourcePrivate *priv = VIK_TMS_MAP_SOURCE_PRIVATE (self); + + switch (property_id) + { + case PROP_HOSTNAME: + g_value_set_string (value, priv->hostname); + break; + + case PROP_URL: + g_value_set_string (value, priv->url); + break; + + case PROP_REFERER: + g_value_set_string (value, priv->options.referer); + break; + + case PROP_FOLLOW_LOCATION: + g_value_set_long (value, priv->options.follow_location); + break; + + case PROP_CHECK_FILE_SERVER_TIME: + g_value_set_boolean (value, priv->options.check_file_server_time); + break; + + case PROP_ZOOM_MIN: + g_value_set_uint (value, priv->zoom_min); + break; + + case PROP_ZOOM_MAX: + g_value_set_uint (value, priv->zoom_max); + break; + + case PROP_LON_MIN: + g_value_set_double (value, priv->lon_min); + break; + + case PROP_LON_MAX: + g_value_set_double (value, priv->lon_max); + break; + + case PROP_LAT_MIN: + g_value_set_double (value, priv->lat_min); + break; + + case PROP_LAT_MAX: + g_value_set_double (value, priv->lat_max); + break; + + default: + /* We don't have any other property... */ + G_OBJECT_WARN_INVALID_PROPERTY_ID (object, property_id, pspec); + break; + } +} + +static void +vik_tms_map_source_class_init (VikTmsMapSourceClass *klass) +{ + GObjectClass* object_class = G_OBJECT_CLASS (klass); + VikMapSourceClass* grandparent_class = VIK_MAP_SOURCE_CLASS (klass); + VikMapSourceDefaultClass* parent_class = VIK_MAP_SOURCE_DEFAULT_CLASS (klass); + GParamSpec *pspec = NULL; + + object_class->set_property = vik_tms_map_source_set_property; + object_class->get_property = vik_tms_map_source_get_property; + + /* Overiding methods */ + grandparent_class->coord_to_mapcoord = _coord_to_mapcoord; + grandparent_class->mapcoord_to_center_coord = _mapcoord_to_center_coord; + grandparent_class->supports_download_only_new = _supports_download_only_new; + grandparent_class->is_direct_file_access = _is_direct_file_access; + grandparent_class->is_mbtiles = _is_mbtiles; + grandparent_class->is_osm_meta_tiles = _is_osm_meta_tiles; + grandparent_class->get_zoom_min = _get_zoom_min; + grandparent_class->get_zoom_max = _get_zoom_max; + grandparent_class->get_lat_min = _get_lat_min; + grandparent_class->get_lat_max = _get_lat_max; + grandparent_class->get_lon_min = _get_lon_min; + grandparent_class->get_lon_max = _get_lon_max; + + parent_class->get_uri = _get_uri; + parent_class->get_hostname = _get_hostname; + parent_class->get_download_options = _get_download_options; + + pspec = g_param_spec_string ("hostname", + "Hostname", + "The hostname of the map server", + "" /* default value */, + G_PARAM_CONSTRUCT_ONLY | G_PARAM_READWRITE); + g_object_class_install_property (object_class, PROP_HOSTNAME, pspec); + + pspec = g_param_spec_string ("url", + "URL", + "The template of the tiles' URL", + "" /* default value */, + G_PARAM_CONSTRUCT_ONLY | G_PARAM_READWRITE); + g_object_class_install_property (object_class, PROP_URL, pspec); + + pspec = g_param_spec_string ("referer", + "Referer", + "The REFERER string to use in HTTP request", + NULL /* default value */, + G_PARAM_CONSTRUCT_ONLY | G_PARAM_READWRITE); + g_object_class_install_property (object_class, PROP_REFERER, pspec); + + pspec = g_param_spec_long ("follow-location", + "Follow location", + "Specifies the number of retries to follow a redirect while downloading a page", + 0 /* minimum value */, + G_MAXLONG /* maximum value */, + 0 /* default value */, + G_PARAM_CONSTRUCT_ONLY | G_PARAM_READWRITE); + g_object_class_install_property (object_class, PROP_FOLLOW_LOCATION, pspec); + + pspec = g_param_spec_boolean ("check-file-server-time", + "Check file server time", + "Age of current cache before redownloading tile", + FALSE /* default value */, + G_PARAM_CONSTRUCT_ONLY | G_PARAM_READWRITE); + g_object_class_install_property (object_class, PROP_CHECK_FILE_SERVER_TIME, pspec); + + pspec = g_param_spec_uint ("zoom-min", + "Minimum zoom", + "Minimum Zoom level supported by the map provider", + 0, // minimum value, + 22, // maximum value + 0, // default value + G_PARAM_CONSTRUCT_ONLY | G_PARAM_READWRITE); + g_object_class_install_property (object_class, PROP_ZOOM_MIN, pspec); + + pspec = g_param_spec_uint ("zoom-max", + "Maximum zoom", + "Maximum Zoom level supported by the map provider", + 0, // minimum value, + 22, // maximum value + 18, // default value + G_PARAM_CONSTRUCT_ONLY | G_PARAM_READWRITE); + g_object_class_install_property (object_class, PROP_ZOOM_MAX, pspec); + + pspec = g_param_spec_double ("lat-min", + "Minimum latitude", + "Minimum latitude in degrees supported by the map provider", + -90.0, // minimum value + 90.0, // maximum value + -90.0, // default value + G_PARAM_CONSTRUCT_ONLY | G_PARAM_READWRITE); + g_object_class_install_property (object_class, PROP_LAT_MIN, pspec); + + pspec = g_param_spec_double ("lat-max", + "Maximum latitude", + "Maximum latitude in degrees supported by the map provider", + -90.0, // minimum value + 90.0, // maximum value + 90.0, // default value + G_PARAM_CONSTRUCT_ONLY | G_PARAM_READWRITE); + g_object_class_install_property (object_class, PROP_LAT_MAX, pspec); + + pspec = g_param_spec_double ("lon-min", + "Minimum longitude", + "Minimum longitude in degrees supported by the map provider", + -180.0, // minimum value + 180.0, // maximum value + -180.0, // default value + G_PARAM_CONSTRUCT_ONLY | G_PARAM_READWRITE); + g_object_class_install_property (object_class, PROP_LON_MIN, pspec); + + pspec = g_param_spec_double ("lon-max", + "Maximum longitude", + "Maximum longitude in degrees supported by the map provider", + -180.0, // minimum value + 180.0, // maximum value + 180.0, // default value + G_PARAM_CONSTRUCT_ONLY | G_PARAM_READWRITE); + g_object_class_install_property (object_class, PROP_LON_MAX, pspec); + + g_type_class_add_private (klass, sizeof (VikTmsMapSourcePrivate)); + + object_class->finalize = vik_tms_map_source_finalize; +} + +static gboolean +_is_direct_file_access ( VikMapSource *self ) +{ + return FALSE; +} + +static gboolean +_is_mbtiles ( VikMapSource *self ) +{ + return FALSE; +} + +static gboolean +_is_osm_meta_tiles ( VikMapSource *self ) +{ + return FALSE; +} + +static gboolean +_supports_download_only_new ( VikMapSource *self ) +{ + g_return_val_if_fail (VIK_IS_TMS_MAP_SOURCE(self), FALSE); + + VikTmsMapSourcePrivate *priv = VIK_TMS_MAP_SOURCE_PRIVATE(self); + + return priv->options.check_file_server_time; +} + +static gboolean +_coord_to_mapcoord ( VikMapSource *self, const VikCoord *src, gdouble xzoom, gdouble yzoom, MapCoord *dest ) +{ + g_assert ( src->mode == VIK_COORD_LATLON ); + + if ( xzoom != yzoom ) + return FALSE; + + dest->scale = map_utils_mpp_to_scale ( xzoom ); + if ( dest->scale == 255 ) + return FALSE; + + /* Note : VIK_GZ(17) / xzoom / 2 = number of tile on Y axis */ + g_debug("%s: xzoom=%f yzoom=%f -> %f", __FUNCTION__, + xzoom, yzoom, VIK_GZ(17) / xzoom / 2); + dest->x = floor((src->east_west + 180) / 180 * VIK_GZ(17) / xzoom / 2); + /* We should restore logic of viking: + * tile index on Y axis follow a screen logic (top -> down) + */ + dest->y = floor((180 - (src->north_south + 90)) / 180 * VIK_GZ(17) / xzoom / 2); + dest->z = 0; + g_debug("%s: %f,%f -> %d,%d", __FUNCTION__, + src->east_west, src->north_south, dest->x, dest->y); + return TRUE; +} + +static void +_mapcoord_to_center_coord ( VikMapSource *self, MapCoord *src, VikCoord *dest ) +{ + gdouble socalled_mpp; + if (src->scale >= 0) + socalled_mpp = VIK_GZ(src->scale); + else + socalled_mpp = 1.0/VIK_GZ(-src->scale); + dest->mode = VIK_COORD_LATLON; + dest->east_west = (src->x+0.5) * 180 / VIK_GZ(17) * socalled_mpp * 2 - 180; + /* We should restore logic of viking: + * tile index on Y axis follow a screen logic (top -> down) + */ + dest->north_south = -((src->y+0.5) * 180 / VIK_GZ(17) * socalled_mpp * 2 - 90); + g_debug("%s: %d,%d -> %f,%f", __FUNCTION__, + src->x, src->y, dest->east_west, dest->north_south); +} + +static gchar * +_get_uri( VikMapSourceDefault *self, MapCoord *src ) +{ + g_return_val_if_fail (VIK_IS_TMS_MAP_SOURCE(self), NULL); + + VikTmsMapSourcePrivate *priv = VIK_TMS_MAP_SOURCE_PRIVATE(self); + /* We should restore logic of viking: + * tile index on Y axis follow a screen logic (top -> down) + */ + + /* Note : nb tiles on Y axis */ + gint nb_tiles = VIK_GZ(17 - src->scale - 1); + + gchar *uri = g_strdup_printf (priv->url, 17 - src->scale - 1, src->x, nb_tiles - src->y - 1); + + return uri; +} + +static gchar * +_get_hostname( VikMapSourceDefault *self ) +{ + g_return_val_if_fail (VIK_IS_TMS_MAP_SOURCE(self), NULL); + + VikTmsMapSourcePrivate *priv = VIK_TMS_MAP_SOURCE_PRIVATE(self); + return g_strdup( priv->hostname ); +} + +static DownloadFileOptions * +_get_download_options( VikMapSourceDefault *self ) +{ + g_return_val_if_fail (VIK_IS_TMS_MAP_SOURCE(self), NULL); + + VikTmsMapSourcePrivate *priv = VIK_TMS_MAP_SOURCE_PRIVATE(self); + return &(priv->options); +} + +/** + * + */ +static guint8 +_get_zoom_min (VikMapSource *self) +{ + g_return_val_if_fail (VIK_IS_TMS_MAP_SOURCE(self), FALSE); + VikTmsMapSourcePrivate *priv = VIK_TMS_MAP_SOURCE_PRIVATE(self); + return priv->zoom_min; +} + +/** + * + */ +static guint8 +_get_zoom_max (VikMapSource *self) +{ + g_return_val_if_fail (VIK_IS_TMS_MAP_SOURCE(self), FALSE); + VikTmsMapSourcePrivate *priv = VIK_TMS_MAP_SOURCE_PRIVATE(self); + return priv->zoom_max; +} + +/** + * + */ +static gdouble +_get_lat_min (VikMapSource *self) +{ + g_return_val_if_fail (VIK_IS_TMS_MAP_SOURCE(self), FALSE); + VikTmsMapSourcePrivate *priv = VIK_TMS_MAP_SOURCE_PRIVATE(self); + return priv->lat_min; +} + +/** + * + */ +static gdouble +_get_lat_max (VikMapSource *self) +{ + g_return_val_if_fail (VIK_IS_TMS_MAP_SOURCE(self), FALSE); + VikTmsMapSourcePrivate *priv = VIK_TMS_MAP_SOURCE_PRIVATE(self); + return priv->lat_max; +} + +/** + * + */ +static gdouble +_get_lon_min (VikMapSource *self) +{ + g_return_val_if_fail (VIK_IS_TMS_MAP_SOURCE(self), FALSE); + VikTmsMapSourcePrivate *priv = VIK_TMS_MAP_SOURCE_PRIVATE(self); + return priv->lon_min; +} + +/** + * + */ +static gdouble +_get_lon_max (VikMapSource *self) +{ + g_return_val_if_fail (VIK_IS_TMS_MAP_SOURCE(self), FALSE); + VikTmsMapSourcePrivate *priv = VIK_TMS_MAP_SOURCE_PRIVATE(self); + return priv->lon_max; +} + +VikTmsMapSource * +vik_tms_map_source_new_with_id (guint16 id, const gchar *label, const gchar *hostname, const gchar *url) +{ + return g_object_new(VIK_TYPE_TMS_MAP_SOURCE, + "id", id, "label", label, "hostname", hostname, "url", url, NULL); +} diff --git a/src/viktmsmapsource.h b/src/viktmsmapsource.h new file mode 100644 index 0000000..354067d --- /dev/null +++ b/src/viktmsmapsource.h @@ -0,0 +1,55 @@ +/* -*- Mode: C; indent-tabs-mode: t; c-basic-offset: 4; tab-width: 4 -*- */ +/* + * viking + * Copyright (C) 2010, Guilhem Bonnefille + * + * viking 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. + * + * viking 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, see . + */ + +#ifndef _VIK_TMS_MAP_SOURCE_H +#define _VIK_TMS_MAP_SOURCE_H + +#include "vikcoord.h" +#include "mapcoord.h" +#include "vikmapsourcedefault.h" + +G_BEGIN_DECLS + +#define VIK_TYPE_TMS_MAP_SOURCE (vik_tms_map_source_get_type ()) +#define VIK_TMS_MAP_SOURCE(obj) (G_TYPE_CHECK_INSTANCE_CAST ((obj), VIK_TYPE_TMS_MAP_SOURCE, VikTmsMapSource)) +#define VIK_TMS_MAP_SOURCE_CLASS(klass) (G_TYPE_CHECK_CLASS_CAST ((klass), VIK_TYPE_TMS_MAP_SOURCE, VikTmsMapSourceClass)) +#define VIK_IS_TMS_MAP_SOURCE(obj) (G_TYPE_CHECK_INSTANCE_TYPE ((obj), VIK_TYPE_TMS_MAP_SOURCE)) +#define VIK_IS_TMS_MAP_SOURCE_CLASS(klass) (G_TYPE_CHECK_CLASS_TYPE ((klass), VIK_TYPE_TMS_MAP_SOURCE)) +#define VIK_TMS_MAP_SOURCE_GET_CLASS(obj) (G_TYPE_INSTANCE_GET_CLASS ((obj), VIK_TYPE_TMS_MAP_SOURCE, VikTmsMapSourceClass)) + +typedef struct _VikTmsMapSourceClass VikTmsMapSourceClass; +typedef struct _VikTmsMapSource VikTmsMapSource; + +struct _VikTmsMapSourceClass +{ + VikMapSourceDefaultClass parent_class; +}; + +struct _VikTmsMapSource +{ + VikMapSourceDefault parent_instance; +}; + +GType vik_tms_map_source_get_type (void) G_GNUC_CONST; + +VikTmsMapSource * vik_tms_map_source_new_with_id (guint16 id, const gchar *label, const gchar *hostname, const gchar *url); + +G_END_DECLS + +#endif /* _VIK_TMS_MAP_SOURCE_H_ */ diff --git a/src/viktrack.c b/src/viktrack.c new file mode 100644 index 0000000..5240144 --- /dev/null +++ b/src/viktrack.c @@ -0,0 +1,2014 @@ +/* + * viking -- GPS Data and Topo Analyzer, Explorer, and Manager + * + * Copyright (C) 2003-2005, Evan Battaglia + * Copyright (c) 2012, Rob Norris + * + * 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., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA + * + */ +#ifdef HAVE_CONFIG_H +#include "config.h" +#endif + +#include +#include +#include +#ifdef HAVE_STRING_H +#include +#endif +#ifdef HAVE_MATH_H +#include +#endif + +#include "coords.h" +#include "vikcoord.h" +#include "viktrack.h" +#include "globals.h" +#include "dems.h" +#include "settings.h" + +VikTrack *vik_track_new() +{ + VikTrack *tr = g_malloc0 ( sizeof ( VikTrack ) ); + tr->ref_count = 1; + return tr; +} + +#define VIK_SETTINGS_TRACK_NAME_MODE "track_draw_name_mode" +#define VIK_SETTINGS_TRACK_NUM_DIST_LABELS "track_number_dist_labels" + +/** + * vik_track_set_defaults: + * + * Set some default values for a track. + * ATM This uses the 'settings' method to get values, + * so there is no GUI way to control these yet... + */ +void vik_track_set_defaults(VikTrack *tr) +{ + gint tmp; + if ( a_settings_get_integer ( VIK_SETTINGS_TRACK_NAME_MODE, &tmp ) ) + tr->draw_name_mode = tmp; + + if ( a_settings_get_integer ( VIK_SETTINGS_TRACK_NUM_DIST_LABELS, &tmp ) ) + tr->max_number_dist_labels = tmp; +} + +void vik_track_set_comment_no_copy(VikTrack *tr, gchar *comment) +{ + if ( tr->comment ) + g_free ( tr->comment ); + tr->comment = comment; +} + + +void vik_track_set_name(VikTrack *tr, const gchar *name) +{ + if ( tr->name ) + g_free ( tr->name ); + + tr->name = g_strdup(name); +} + +void vik_track_set_comment(VikTrack *tr, const gchar *comment) +{ + if ( tr->comment ) + g_free ( tr->comment ); + + if ( comment && comment[0] != '\0' ) + tr->comment = g_strdup(comment); + else + tr->comment = NULL; +} + +void vik_track_set_description(VikTrack *tr, const gchar *description) +{ + if ( tr->description ) + g_free ( tr->description ); + + if ( description && description[0] != '\0' ) + tr->description = g_strdup(description); + else + tr->description = NULL; +} + +void vik_track_set_source(VikTrack *tr, const gchar *source) +{ + if ( tr->source ) + g_free ( tr->source ); + + if ( source && source[0] != '\0' ) + tr->source = g_strdup(source); + else + tr->source = NULL; +} + +void vik_track_set_type(VikTrack *tr, const gchar *type) +{ + if ( tr->type ) + g_free ( tr->type ); + + if ( type && type[0] != '\0' ) + tr->type = g_strdup(type); + else + tr->type = NULL; +} + +void vik_track_ref(VikTrack *tr) +{ + tr->ref_count++; +} + +void vik_track_set_property_dialog(VikTrack *tr, GtkWidget *dialog) +{ + /* Warning: does not check for existing dialog */ + tr->property_dialog = dialog; +} + +void vik_track_clear_property_dialog(VikTrack *tr) +{ + tr->property_dialog = NULL; +} + +void vik_track_free(VikTrack *tr) +{ + if ( tr->ref_count-- > 1 ) + return; + + if ( tr->name ) + g_free ( tr->name ); + if ( tr->comment ) + g_free ( tr->comment ); + if ( tr->description ) + g_free ( tr->description ); + if ( tr->source ) + g_free ( tr->source ); + if ( tr->type ) + g_free ( tr->type ); + g_list_foreach ( tr->trackpoints, (GFunc) vik_trackpoint_free, NULL ); + g_list_free( tr->trackpoints ); + if (tr->property_dialog) + if ( GTK_IS_WIDGET(tr->property_dialog) ) + gtk_widget_destroy ( GTK_WIDGET(tr->property_dialog) ); + g_free ( tr ); +} + +/** + * vik_track_copy: + * @tr: The Track to copy + * @copy_points: Whether to copy the track points or not + * + * Normally for copying the track it's best to copy all the trackpoints + * However for some operations such as splitting tracks the trackpoints will be managed separately, so no need to copy them. + * + * Returns: the copied VikTrack + */ +VikTrack *vik_track_copy ( const VikTrack *tr, gboolean copy_points ) +{ + VikTrack *new_tr = vik_track_new(); + new_tr->visible = tr->visible; + new_tr->is_route = tr->is_route; + new_tr->draw_name_mode = tr->draw_name_mode; + new_tr->max_number_dist_labels = tr->max_number_dist_labels; + new_tr->has_color = tr->has_color; + new_tr->color = tr->color; + new_tr->bbox = tr->bbox; + new_tr->trackpoints = NULL; + if ( copy_points ) + { + GList *tp_iter = tr->trackpoints; + while ( tp_iter ) + { + VikTrackpoint *new_tp = vik_trackpoint_copy ( (VikTrackpoint*)(tp_iter->data) ); + new_tr->trackpoints = g_list_prepend ( new_tr->trackpoints, new_tp ); + tp_iter = tp_iter->next; + } + if ( new_tr->trackpoints ) + new_tr->trackpoints = g_list_reverse ( new_tr->trackpoints ); + } + vik_track_set_name(new_tr,tr->name); + vik_track_set_comment(new_tr,tr->comment); + vik_track_set_description(new_tr,tr->description); + vik_track_set_source(new_tr,tr->source); + return new_tr; +} + +VikTrackpoint *vik_trackpoint_new() +{ + VikTrackpoint *tp = g_malloc0(sizeof(VikTrackpoint)); + tp->speed = NAN; + tp->course = NAN; + tp->altitude = VIK_DEFAULT_ALTITUDE; + tp->hdop = VIK_DEFAULT_DOP; + tp->vdop = VIK_DEFAULT_DOP; + tp->pdop = VIK_DEFAULT_DOP; + return tp; +} + +void vik_trackpoint_free(VikTrackpoint *tp) +{ + g_free(tp->name); + g_free(tp); +} + +void vik_trackpoint_set_name(VikTrackpoint *tp, const gchar *name) +{ + if ( tp->name ) + g_free ( tp->name ); + + // If the name is blank then completely remove it + if ( name && name[0] == '\0' ) + tp->name = NULL; + else if ( name ) + tp->name = g_strdup(name); + else + tp->name = NULL; +} + +VikTrackpoint *vik_trackpoint_copy(VikTrackpoint *tp) +{ + VikTrackpoint *new_tp = vik_trackpoint_new(); + memcpy ( new_tp, tp, sizeof(VikTrackpoint) ); + if ( tp->name ) + new_tp->name = g_strdup (tp->name); + return new_tp; +} + +/** + * track_recalculate_bounds_last_tp: + * @trk: The track to consider the recalculation on + * + * A faster bounds check, since it only considers the last track point + */ +static void track_recalculate_bounds_last_tp ( VikTrack *trk ) +{ + GList *tpl = g_list_last ( trk->trackpoints ); + + if ( tpl ) { + struct LatLon ll; + // See if this trackpoint increases the track bounds and update if so + vik_coord_to_latlon ( &(VIK_TRACKPOINT(tpl->data)->coord), &ll ); + if ( ll.lat > trk->bbox.north ) + trk->bbox.north = ll.lat; + if ( ll.lon < trk->bbox.west ) + trk->bbox.west = ll.lon; + if ( ll.lat < trk->bbox.south ) + trk->bbox.south = ll.lat; + if ( ll.lon > trk->bbox.east ) + trk->bbox.east = ll.lon; + } +} + +/** + * vik_track_add_trackpoint: + * @tr: The track to which the trackpoint will be added + * @tp: The trackpoint to add + * @recalculate: Whether to perform any associated properties recalculations + * Generally one should avoid recalculation via this method if adding lots of points + * (But ensure calculate_bounds() is called after adding all points!!) + * + * The trackpoint is added to the end of the existing trackpoint list + */ +void vik_track_add_trackpoint ( VikTrack *tr, VikTrackpoint *tp, gboolean recalculate ) +{ + // When it's the first trackpoint need to ensure the bounding box is initialized correctly + gboolean adding_first_point = tr->trackpoints ? FALSE : TRUE; + tr->trackpoints = g_list_append ( tr->trackpoints, tp ); + if ( adding_first_point ) + vik_track_calculate_bounds ( tr ); + else if ( recalculate ) + track_recalculate_bounds_last_tp ( tr ); +} + +/** + * vik_track_get_length_to_trackpoint: + * + */ +gdouble vik_track_get_length_to_trackpoint (const VikTrack *tr, const VikTrackpoint *tp) +{ + gdouble len = 0.0; + if ( tr->trackpoints ) + { + // Is it the very first track point? + if ( VIK_TRACKPOINT(tr->trackpoints->data) == tp ) + return len; + + GList *iter = tr->trackpoints->next; + while (iter) + { + VikTrackpoint *tp1 = VIK_TRACKPOINT(iter->data); + if ( ! tp1->newsegment ) + len += vik_coord_diff ( &(tp1->coord), + &(VIK_TRACKPOINT(iter->prev->data)->coord) ); + + // Exit when we reach the desired point + if ( tp1 == tp ) + break; + + iter = iter->next; + } + } + return len; +} + +gdouble vik_track_get_length(const VikTrack *tr) +{ + gdouble len = 0.0; + if ( tr->trackpoints ) + { + GList *iter = tr->trackpoints->next; + while (iter) + { + if ( ! VIK_TRACKPOINT(iter->data)->newsegment ) + len += vik_coord_diff ( &(VIK_TRACKPOINT(iter->data)->coord), + &(VIK_TRACKPOINT(iter->prev->data)->coord) ); + iter = iter->next; + } + } + return len; +} + +gdouble vik_track_get_length_including_gaps(const VikTrack *tr) +{ + gdouble len = 0.0; + if ( tr->trackpoints ) + { + GList *iter = tr->trackpoints->next; + while (iter) + { + len += vik_coord_diff ( &(VIK_TRACKPOINT(iter->data)->coord), + &(VIK_TRACKPOINT(iter->prev->data)->coord) ); + iter = iter->next; + } + } + return len; +} + +gulong vik_track_get_tp_count(const VikTrack *tr) +{ + return g_list_length(tr->trackpoints); +} + +gulong vik_track_get_dup_point_count ( const VikTrack *tr ) +{ + gulong num = 0; + GList *iter = tr->trackpoints; + while ( iter ) + { + if ( iter->next && vik_coord_equals ( &(VIK_TRACKPOINT(iter->data)->coord), + &(VIK_TRACKPOINT(iter->next->data)->coord) ) ) + num++; + iter = iter->next; + } + return num; +} + +/* + * Deletes adjacent points that have the same position + * Returns the number of points that were deleted + */ +gulong vik_track_remove_dup_points ( VikTrack *tr ) +{ + gulong num = 0; + GList *iter = tr->trackpoints; + while ( iter ) + { + if ( iter->next && vik_coord_equals ( &(VIK_TRACKPOINT(iter->data)->coord), + &(VIK_TRACKPOINT(iter->next->data)->coord) ) ) + { + num++; + // Maintain track segments + if ( VIK_TRACKPOINT(iter->next->data)->newsegment && (iter->next)->next ) + VIK_TRACKPOINT(((iter->next)->next)->data)->newsegment = TRUE; + + vik_trackpoint_free ( iter->next->data ); + tr->trackpoints = g_list_delete_link ( tr->trackpoints, iter->next ); + } + else + iter = iter->next; + } + + // NB isn't really be necessary as removing duplicate points shouldn't alter the bounds! + vik_track_calculate_bounds ( tr ); + + return num; +} + +/* + * Get a count of trackpoints with the same defined timestamp + * Note is using timestamps with a resolution with 1 second + */ +gulong vik_track_get_same_time_point_count ( const VikTrack *tr ) +{ + gulong num = 0; + GList *iter = tr->trackpoints; + while ( iter ) { + if ( iter->next && + ( VIK_TRACKPOINT(iter->data)->has_timestamp && + VIK_TRACKPOINT(iter->next->data)->has_timestamp ) && + ( VIK_TRACKPOINT(iter->data)->timestamp == + VIK_TRACKPOINT(iter->next->data)->timestamp) ) + num++; + iter = iter->next; + } + return num; +} + +/* + * Deletes adjacent points that have the same defined timestamp + * Returns the number of points that were deleted + */ +gulong vik_track_remove_same_time_points ( VikTrack *tr ) +{ + gulong num = 0; + GList *iter = tr->trackpoints; + while ( iter ) { + if ( iter->next && + ( VIK_TRACKPOINT(iter->data)->has_timestamp && + VIK_TRACKPOINT(iter->next->data)->has_timestamp ) && + ( VIK_TRACKPOINT(iter->data)->timestamp == + VIK_TRACKPOINT(iter->next->data)->timestamp) ) { + + num++; + + // Maintain track segments + if ( VIK_TRACKPOINT(iter->next->data)->newsegment && (iter->next)->next ) + VIK_TRACKPOINT(((iter->next)->next)->data)->newsegment = TRUE; + + vik_trackpoint_free ( iter->next->data ); + tr->trackpoints = g_list_delete_link ( tr->trackpoints, iter->next ); + } + else + iter = iter->next; + } + + vik_track_calculate_bounds ( tr ); + + return num; +} + +/** + * vik_track_remove_dodgy_first_point: + * @vt: The track + * @speed: Maximum speed in m/s between points allowed + * @recalc_bounds: Whether track bounds should be recalculated + * (i.e. can be skipped if bounds will get calculated later on) + * + * Returns: Whether the first point was removed + * + * ATM Primarily to remove dodgy first point inserted back at previous + * location by some Garmin GPS Etrex units after being significantly moved + * e.g. you've driven somewhere else and start recording a new cycle/walk etc... + * + * NB This function is limited to just handling first point issues, + * rather than a more comprehensive attempt to remove any suspicious points + * through-out the track. + */ +gboolean vik_track_remove_dodgy_first_point ( VikTrack *vt, guint speed, gboolean recalc_bounds ) +{ + gboolean deleted = FALSE; + + if ( vt->trackpoints ) { + GList *iter = g_list_first ( vt->trackpoints ); + VikTrackpoint *tp1 = VIK_TRACKPOINT(iter->data); + + if ( tp1->has_timestamp ) { + if ( iter->next ) { + VikTrackpoint *tp2 = VIK_TRACKPOINT(iter->next->data); + if ( tp2->has_timestamp ) { + gdouble dist_diff = vik_coord_diff ( &tp1->coord, &tp2->coord ); + time_t time_diff = tp2->timestamp - tp1->timestamp; + + gdouble spd = fabs(dist_diff / (gint)time_diff); + if ( spd > speed ) { + deleted = TRUE; + vik_trackpoint_free ( tp1 ); + vt->trackpoints = g_list_delete_link ( vt->trackpoints, iter ); + if ( recalc_bounds ) + vik_track_calculate_bounds ( vt ); + } + } + } + } + } + + return deleted; +} + +/* + * Deletes all 'extra' trackpoint information + * such as time stamps, speed, course etc... + */ +void vik_track_to_routepoints ( VikTrack *tr ) +{ + GList *iter = tr->trackpoints; + while ( iter ) { + + // c.f. with vik_trackpoint_new() + + VIK_TRACKPOINT(iter->data)->has_timestamp = FALSE; + VIK_TRACKPOINT(iter->data)->timestamp = 0; + VIK_TRACKPOINT(iter->data)->speed = NAN; + VIK_TRACKPOINT(iter->data)->course = NAN; + VIK_TRACKPOINT(iter->data)->hdop = VIK_DEFAULT_DOP; + VIK_TRACKPOINT(iter->data)->vdop = VIK_DEFAULT_DOP; + VIK_TRACKPOINT(iter->data)->pdop = VIK_DEFAULT_DOP; + VIK_TRACKPOINT(iter->data)->nsats = 0; + VIK_TRACKPOINT(iter->data)->fix_mode = VIK_GPS_MODE_NOT_SEEN; + + iter = iter->next; + } +} + +guint vik_track_get_segment_count(const VikTrack *tr) +{ + guint num = 1; + GList *iter = tr->trackpoints; + if ( !iter ) + return 0; + while ( (iter = iter->next) ) + { + if ( VIK_TRACKPOINT(iter->data)->newsegment ) + num++; + } + return num; +} + +VikTrack **vik_track_split_into_segments(VikTrack *t, guint *ret_len) +{ + VikTrack **rv; + VikTrack *tr; + guint i; + guint segs = vik_track_get_segment_count(t); + GList *iter; + + if ( segs < 2 ) + { + *ret_len = 0; + return NULL; + } + + rv = g_malloc ( segs * sizeof(VikTrack *) ); + tr = vik_track_copy ( t, TRUE ); + rv[0] = tr; + iter = tr->trackpoints; + + i = 1; + while ( (iter = iter->next) ) + { + if ( VIK_TRACKPOINT(iter->data)->newsegment ) + { + iter->prev->next = NULL; + iter->prev = NULL; + rv[i] = vik_track_copy ( tr, FALSE ); + rv[i]->trackpoints = iter; + + vik_track_calculate_bounds ( rv[i] ); + + i++; + } + } + *ret_len = segs; + return rv; +} + +/* + * Simply remove any subsequent segment markers in a track to form one continuous track + * Return the number of segments merged + */ +guint vik_track_merge_segments(VikTrack *tr) +{ + guint num = 0; + GList *iter = tr->trackpoints; + if ( !iter ) + return num; + + // Always skip the first point as this should be the first segment + iter = iter->next; + + while ( (iter = iter->next) ) + { + if ( VIK_TRACKPOINT(iter->data)->newsegment ) { + VIK_TRACKPOINT(iter->data)->newsegment = FALSE; + num++; + } + } + return num; +} + +void vik_track_reverse ( VikTrack *tr ) +{ + if ( ! tr->trackpoints ) + return; + + tr->trackpoints = g_list_reverse(tr->trackpoints); + + /* fix 'newsegment' */ + GList *iter = g_list_last ( tr->trackpoints ); + while ( iter ) + { + if ( ! iter->next ) /* last segment, was first, cancel newsegment. */ + VIK_TRACKPOINT(iter->data)->newsegment = FALSE; + if ( ! iter->prev ) /* first segment by convention has newsegment flag. */ + VIK_TRACKPOINT(iter->data)->newsegment = TRUE; + else if ( VIK_TRACKPOINT(iter->data)->newsegment && iter->next ) + { + VIK_TRACKPOINT(iter->next->data)->newsegment = TRUE; + VIK_TRACKPOINT(iter->data)->newsegment = FALSE; + } + iter = iter->prev; + } +} + +/** + * vik_track_get_duration: + * @trk: The track + * @segment_gaps: Whether the duration should include gaps between segments + * + * Returns: The time in seconds + * NB this may be negative particularly if the track has been reversed + */ +time_t vik_track_get_duration(const VikTrack *trk, gboolean segment_gaps) +{ + time_t duration = 0; + if ( trk->trackpoints ) { + // Ensure times are available + if ( vik_track_get_tp_first(trk)->has_timestamp ) { + // Get trkpt only once - as using vik_track_get_tp_last() iterates whole track each time + if (segment_gaps) { + // Simple duration + VikTrackpoint *trkpt_last = vik_track_get_tp_last(trk); + if ( trkpt_last->has_timestamp ) { + time_t t1 = vik_track_get_tp_first(trk)->timestamp; + time_t t2 = trkpt_last->timestamp; + duration = t2 - t1; + } + } + else { + // Total within segments + GList *iter = trk->trackpoints->next; + while (iter) { + if ( VIK_TRACKPOINT(iter->data)->has_timestamp && + VIK_TRACKPOINT(iter->prev->data)->has_timestamp && + (!VIK_TRACKPOINT(iter->data)->newsegment) ) { + duration += ABS(VIK_TRACKPOINT(iter->data)->timestamp - VIK_TRACKPOINT(iter->prev->data)->timestamp); + } + iter = iter->next; + } + } + } + } + return duration; +} + +gdouble vik_track_get_average_speed(const VikTrack *tr) +{ + gdouble len = 0.0; + guint32 time = 0; + if ( tr->trackpoints ) + { + GList *iter = tr->trackpoints->next; + while (iter) + { + if ( VIK_TRACKPOINT(iter->data)->has_timestamp && + VIK_TRACKPOINT(iter->prev->data)->has_timestamp && + (! VIK_TRACKPOINT(iter->data)->newsegment) ) + { + len += vik_coord_diff ( &(VIK_TRACKPOINT(iter->data)->coord), + &(VIK_TRACKPOINT(iter->prev->data)->coord) ); + time += ABS(VIK_TRACKPOINT(iter->data)->timestamp - VIK_TRACKPOINT(iter->prev->data)->timestamp); + } + iter = iter->next; + } + } + return (time == 0) ? 0 : ABS(len/time); +} + +/** + * Based on a simple average speed, but with a twist - to give a moving average. + * . GPSs often report a moving average in their statistics output + * . bicycle speedos often don't factor in time when stopped - hence reporting a moving average for speed + * + * Often GPS track will record every second but not when stationary + * This method doesn't use samples that differ over the specified time limit - effectively skipping that time chunk from the total time + * + * Suggest to use 60 seconds as the stop length (as the default used in the TrackWaypoint draw stops factor) + */ +gdouble vik_track_get_average_speed_moving (const VikTrack *tr, int stop_length_seconds) +{ + gdouble len = 0.0; + guint32 time = 0; + if ( tr->trackpoints ) + { + GList *iter = tr->trackpoints->next; + while (iter) + { + if ( VIK_TRACKPOINT(iter->data)->has_timestamp && + VIK_TRACKPOINT(iter->prev->data)->has_timestamp && + (! VIK_TRACKPOINT(iter->data)->newsegment) ) + { + if ( ( VIK_TRACKPOINT(iter->data)->timestamp - VIK_TRACKPOINT(iter->prev->data)->timestamp ) < stop_length_seconds ) { + len += vik_coord_diff ( &(VIK_TRACKPOINT(iter->data)->coord), + &(VIK_TRACKPOINT(iter->prev->data)->coord) ); + + time += ABS(VIK_TRACKPOINT(iter->data)->timestamp - VIK_TRACKPOINT(iter->prev->data)->timestamp); + } + } + iter = iter->next; + } + } + return (time == 0) ? 0 : ABS(len/time); +} + +gdouble vik_track_get_max_speed(const VikTrack *tr) +{ + gdouble maxspeed = 0.0, speed = 0.0; + if ( tr->trackpoints ) + { + GList *iter = tr->trackpoints->next; + while (iter) + { + if ( VIK_TRACKPOINT(iter->data)->has_timestamp && + VIK_TRACKPOINT(iter->prev->data)->has_timestamp && + (! VIK_TRACKPOINT(iter->data)->newsegment) ) + { + speed = vik_coord_diff ( &(VIK_TRACKPOINT(iter->data)->coord), &(VIK_TRACKPOINT(iter->prev->data)->coord) ) + / ABS(VIK_TRACKPOINT(iter->data)->timestamp - VIK_TRACKPOINT(iter->prev->data)->timestamp); + if ( speed > maxspeed ) + maxspeed = speed; + } + iter = iter->next; + } + } + return maxspeed; +} + +void vik_track_convert ( VikTrack *tr, VikCoordMode dest_mode ) +{ + GList *iter = tr->trackpoints; + while (iter) + { + vik_coord_convert ( &(VIK_TRACKPOINT(iter->data)->coord), dest_mode ); + iter = iter->next; + } +} + +/* I understood this when I wrote it ... maybe ... Basically it eats up the + * proper amounts of length on the track and averages elevation over that. */ +gdouble *vik_track_make_elevation_map ( const VikTrack *tr, guint16 num_chunks ) +{ + gdouble *pts; + gdouble total_length, chunk_length, current_dist, current_area_under_curve, current_seg_length, dist_along_seg = 0.0; + gdouble altitude1, altitude2; + guint16 current_chunk; + gboolean ignore_it = FALSE; + + GList *iter = tr->trackpoints; + + if (!iter || !iter->next) /* zero- or one-point track */ + return NULL; + + { /* test if there's anything worth calculating */ + gboolean okay = FALSE; + while ( iter ) + { + // Sometimes a GPS device (or indeed any random file) can have stupid numbers for elevations + // Since when is 9.9999e+24 a valid elevation!! + // This can happen when a track (with no elevations) is uploaded to a GPS device and then redownloaded (e.g. using a Garmin Legend EtrexHCx) + // Some protection against trying to work with crazily massive numbers (otherwise get SIGFPE, Arithmetic exception) + if ( VIK_TRACKPOINT(iter->data)->altitude != VIK_DEFAULT_ALTITUDE && + VIK_TRACKPOINT(iter->data)->altitude < 1E9 ) { + okay = TRUE; break; + } + iter = iter->next; + } + if ( ! okay ) + return NULL; + } + + iter = tr->trackpoints; + + g_assert ( num_chunks < 16000 ); + + pts = g_malloc ( sizeof(gdouble) * num_chunks ); + + total_length = vik_track_get_length_including_gaps ( tr ); + chunk_length = total_length / num_chunks; + + /* Zero chunk_length (eg, track of 2 tp with the same loc) will cause crash */ + if (chunk_length <= 0) { + g_free(pts); + return NULL; + } + + current_dist = 0.0; + current_area_under_curve = 0; + current_chunk = 0; + current_seg_length = 0; + + current_seg_length = vik_coord_diff ( &(VIK_TRACKPOINT(iter->data)->coord), + &(VIK_TRACKPOINT(iter->next->data)->coord) ); + altitude1 = VIK_TRACKPOINT(iter->data)->altitude; + altitude2 = VIK_TRACKPOINT(iter->next->data)->altitude; + dist_along_seg = 0; + + while ( current_chunk < num_chunks ) { + + /* go along current seg */ + if ( current_seg_length && (current_seg_length - dist_along_seg) > chunk_length ) { + dist_along_seg += chunk_length; + + /* / + * pt2 * + * /x altitude = alt_at_pt_1 + alt_at_pt_2 / 2 = altitude1 + slope * dist_value_of_pt_inbetween_pt1_and_pt2 + * /xx avg altitude = area under curve / chunk len + *pt1 *xxx avg altitude = altitude1 + (altitude2-altitude1)/(current_seg_length)*(dist_along_seg + (chunk_len/2)) + * / xxx + * / xxx + **/ + + if ( ignore_it ) + // Seemly can't determine average for this section - so use last known good value (much better than just sticking in zero) + pts[current_chunk] = altitude1; + else + pts[current_chunk] = altitude1 + (altitude2-altitude1)*((dist_along_seg - (chunk_length/2))/current_seg_length); + + current_chunk++; + } else { + /* finish current seg */ + if ( current_seg_length ) { + gdouble altitude_at_dist_along_seg = altitude1 + (altitude2-altitude1)/(current_seg_length)*dist_along_seg; + current_dist = current_seg_length - dist_along_seg; + current_area_under_curve = current_dist*(altitude_at_dist_along_seg + altitude2)*0.5; + } else { current_dist = current_area_under_curve = 0; } /* should only happen if first current_seg_length == 0 */ + + /* get intervening segs */ + iter = iter->next; + while ( iter && iter->next ) { + current_seg_length = vik_coord_diff ( &(VIK_TRACKPOINT(iter->data)->coord), + &(VIK_TRACKPOINT(iter->next->data)->coord) ); + altitude1 = VIK_TRACKPOINT(iter->data)->altitude; + altitude2 = VIK_TRACKPOINT(iter->next->data)->altitude; + ignore_it = VIK_TRACKPOINT(iter->next->data)->newsegment; + + if ( chunk_length - current_dist >= current_seg_length ) { + current_dist += current_seg_length; + current_area_under_curve += current_seg_length * (altitude1+altitude2) * 0.5; + iter = iter->next; + } else { + break; + } + } + + /* final seg */ + dist_along_seg = chunk_length - current_dist; + if ( ignore_it || ( iter && !iter->next ) ) { + pts[current_chunk] = current_area_under_curve / current_dist; + if (!iter->next) { + int i; + for (i = current_chunk + 1; i < num_chunks; i++) + pts[i] = pts[current_chunk]; + break; + } + } + else { + current_area_under_curve += dist_along_seg * (altitude1 + (altitude2 - altitude1)*dist_along_seg/current_seg_length); + pts[current_chunk] = current_area_under_curve / chunk_length; + } + + current_dist = 0; + current_chunk++; + } + } + + return pts; +} + + +void vik_track_get_total_elevation_gain(const VikTrack *tr, gdouble *up, gdouble *down) +{ + gdouble diff; + *up = *down = 0; + if ( tr->trackpoints ) { + GList *iter = tr->trackpoints->next; + while (iter) { + VikTrackpoint *tp1 = VIK_TRACKPOINT(iter->data); + VikTrackpoint *tp2 = VIK_TRACKPOINT(iter->prev->data); + if ( (tp1->altitude != VIK_DEFAULT_ALTITUDE) && + (tp2->altitude != VIK_DEFAULT_ALTITUDE) ) { + diff = tp1->altitude - tp2->altitude; + if ( diff > 0 ) + *up += diff; + else + *down -= diff; + } + iter = iter->next; + } + } else + *up = *down = VIK_DEFAULT_ALTITUDE; +} + +gdouble *vik_track_make_gradient_map ( const VikTrack *tr, guint16 num_chunks ) +{ + gdouble *pts; + gdouble *altitudes; + gdouble total_length, chunk_length, current_gradient; + gdouble altitude1, altitude2; + guint16 current_chunk; + + g_assert ( num_chunks < 16000 ); + + total_length = vik_track_get_length_including_gaps ( tr ); + chunk_length = total_length / num_chunks; + + /* Zero chunk_length (eg, track of 2 tp with the same loc) will cause crash */ + if (chunk_length <= 0) { + return NULL; + } + + altitudes = vik_track_make_elevation_map (tr, num_chunks); + if (altitudes == NULL) { + return NULL; + } + + current_gradient = 0.0; + pts = g_malloc ( sizeof(gdouble) * num_chunks ); + for (current_chunk = 0; current_chunk < (num_chunks - 1); current_chunk++) { + altitude1 = altitudes[current_chunk]; + altitude2 = altitudes[current_chunk + 1]; + current_gradient = 100.0 * (altitude2 - altitude1) / chunk_length; + + pts[current_chunk] = current_gradient; + } + + pts[current_chunk] = current_gradient; + + g_free ( altitudes ); + + return pts; +} + +/* by Alex Foobarian */ +gdouble *vik_track_make_speed_map ( const VikTrack *tr, guint16 num_chunks ) +{ + gdouble *v, *s, *t; + gdouble duration, chunk_dur; + time_t t1, t2; + int i, pt_count, numpts, index; + GList *iter; + + if ( ! tr->trackpoints ) + return NULL; + + g_assert ( num_chunks < 16000 ); + + t1 = VIK_TRACKPOINT(tr->trackpoints->data)->timestamp; + t2 = VIK_TRACKPOINT(g_list_last(tr->trackpoints)->data)->timestamp; + duration = t2 - t1; + + if ( !t1 || !t2 || !duration ) + return NULL; + + if (duration < 0) { + g_warning("negative duration: unsorted trackpoint timestamps?"); + return NULL; + } + pt_count = vik_track_get_tp_count(tr); + + v = g_malloc ( sizeof(gdouble) * num_chunks ); + chunk_dur = duration / num_chunks; + + s = g_malloc(sizeof(double) * pt_count); + t = g_malloc(sizeof(double) * pt_count); + + iter = tr->trackpoints->next; + numpts = 0; + s[0] = 0; + t[0] = VIK_TRACKPOINT(tr->trackpoints->data)->timestamp; + numpts++; + while (iter) { + s[numpts] = s[numpts-1] + vik_coord_diff ( &(VIK_TRACKPOINT(iter->prev->data)->coord), &(VIK_TRACKPOINT(iter->data)->coord) ); + t[numpts] = VIK_TRACKPOINT(iter->data)->timestamp; + numpts++; + iter = iter->next; + } + + /* In the following computation, we iterate through periods of time of duration chunk_dur. + * The first period begins at the beginning of the track. The last period ends at the end of the track. + */ + index = 0; /* index of the current trackpoint. */ + for (i = 0; i < num_chunks; i++) { + /* we are now covering the interval from t[0] + i*chunk_dur to t[0] + (i+1)*chunk_dur. + * find the first trackpoint outside the current interval, averaging the speeds between intermediate trackpoints. + */ + if (t[0] + i*chunk_dur >= t[index]) { + gdouble acc_t = 0, acc_s = 0; + while (t[0] + i*chunk_dur >= t[index]) { + acc_s += (s[index+1]-s[index]); + acc_t += (t[index+1]-t[index]); + index++; + } + v[i] = acc_s/acc_t; + } + else if (i) { + v[i] = v[i-1]; + } + else { + v[i] = 0; + } + } + g_free(s); + g_free(t); + return v; +} + +/** + * Make a distance/time map, heavily based on the vik_track_make_speed_map method + */ +gdouble *vik_track_make_distance_map ( const VikTrack *tr, guint16 num_chunks ) +{ + gdouble *v, *s, *t; + gdouble duration, chunk_dur; + time_t t1, t2; + int i, pt_count, numpts, index; + GList *iter; + + if ( ! tr->trackpoints ) + return NULL; + + t1 = VIK_TRACKPOINT(tr->trackpoints->data)->timestamp; + t2 = VIK_TRACKPOINT(g_list_last(tr->trackpoints)->data)->timestamp; + duration = t2 - t1; + + if ( !t1 || !t2 || !duration ) + return NULL; + + if (duration < 0) { + g_warning("negative duration: unsorted trackpoint timestamps?"); + return NULL; + } + pt_count = vik_track_get_tp_count(tr); + + v = g_malloc ( sizeof(gdouble) * num_chunks ); + chunk_dur = duration / num_chunks; + + s = g_malloc(sizeof(double) * pt_count); + t = g_malloc(sizeof(double) * pt_count); + + iter = tr->trackpoints->next; + numpts = 0; + s[0] = 0; + t[0] = VIK_TRACKPOINT(tr->trackpoints->data)->timestamp; + numpts++; + while (iter) { + s[numpts] = s[numpts-1] + vik_coord_diff ( &(VIK_TRACKPOINT(iter->prev->data)->coord), &(VIK_TRACKPOINT(iter->data)->coord) ); + t[numpts] = VIK_TRACKPOINT(iter->data)->timestamp; + numpts++; + iter = iter->next; + } + + /* In the following computation, we iterate through periods of time of duration chunk_dur. + * The first period begins at the beginning of the track. The last period ends at the end of the track. + */ + index = 0; /* index of the current trackpoint. */ + for (i = 0; i < num_chunks; i++) { + /* we are now covering the interval from t[0] + i*chunk_dur to t[0] + (i+1)*chunk_dur. + * find the first trackpoint outside the current interval, averaging the distance between intermediate trackpoints. + */ + if (t[0] + i*chunk_dur >= t[index]) { + gdouble acc_s = 0; // No need for acc_t + while (t[0] + i*chunk_dur >= t[index]) { + acc_s += (s[index+1]-s[index]); + index++; + } + // The only bit that's really different from the speed map - just keep an accululative record distance + v[i] = i ? v[i-1]+acc_s : acc_s; + } + else if (i) { + v[i] = v[i-1]; + } + else { + v[i] = 0; + } + } + g_free(s); + g_free(t); + return v; +} + +/** + * This uses the 'time' based method to make the graph, (which is a simpler compared to the elevation/distance) + * This results in a slightly blocky graph when it does not have many trackpoints: <60 + * NB Somehow the elevation/distance applies some kind of smoothing algorithm, + * but I don't think any one understands it any more (I certainly don't ATM) + */ +gdouble *vik_track_make_elevation_time_map ( const VikTrack *tr, guint16 num_chunks ) +{ + time_t t1, t2; + gdouble duration, chunk_dur; + GList *iter = tr->trackpoints; + + if (!iter || !iter->next) /* zero- or one-point track */ + return NULL; + + /* test if there's anything worth calculating */ + gboolean okay = FALSE; + while ( iter ) { + if ( VIK_TRACKPOINT(iter->data)->altitude != VIK_DEFAULT_ALTITUDE ) { + okay = TRUE; + break; + } + iter = iter->next; + } + if ( ! okay ) + return NULL; + + t1 = VIK_TRACKPOINT(tr->trackpoints->data)->timestamp; + t2 = VIK_TRACKPOINT(g_list_last(tr->trackpoints)->data)->timestamp; + duration = t2 - t1; + + if ( !t1 || !t2 || !duration ) + return NULL; + + if (duration < 0) { + g_warning("negative duration: unsorted trackpoint timestamps?"); + return NULL; + } + gint pt_count = vik_track_get_tp_count(tr); + + // Reset iterator back to the beginning + iter = tr->trackpoints; + + gdouble *pts = g_malloc ( sizeof(gdouble) * num_chunks ); // The return altitude values + gdouble *s = g_malloc(sizeof(double) * pt_count); // calculation altitudes + gdouble *t = g_malloc(sizeof(double) * pt_count); // calculation times + + chunk_dur = duration / num_chunks; + + s[0] = VIK_TRACKPOINT(iter->data)->altitude; + t[0] = VIK_TRACKPOINT(iter->data)->timestamp; + iter = tr->trackpoints->next; + gint numpts = 1; + while (iter) { + s[numpts] = VIK_TRACKPOINT(iter->data)->altitude; + t[numpts] = VIK_TRACKPOINT(iter->data)->timestamp; + numpts++; + iter = iter->next; + } + + /* In the following computation, we iterate through periods of time of duration chunk_dur. + * The first period begins at the beginning of the track. The last period ends at the end of the track. + */ + gint index = 0; /* index of the current trackpoint. */ + gint i; + for (i = 0; i < num_chunks; i++) { + /* we are now covering the interval from t[0] + i*chunk_dur to t[0] + (i+1)*chunk_dur. + * find the first trackpoint outside the current interval, averaging the heights between intermediate trackpoints. + */ + if (t[0] + i*chunk_dur >= t[index]) { + gdouble acc_s = s[index]; // initialise to first point + while (t[0] + i*chunk_dur >= t[index]) { + acc_s += (s[index+1]-s[index]); + index++; + } + pts[i] = acc_s; + } + else if (i) { + pts[i] = pts[i-1]; + } + else { + pts[i] = 0; + } + } + g_free(s); + g_free(t); + + return pts; +} + +/** + * Make a speed/distance map + */ +gdouble *vik_track_make_speed_dist_map ( const VikTrack *tr, guint16 num_chunks ) +{ + gdouble *v, *s, *t; + time_t t1, t2; + gint i, pt_count, numpts, index; + GList *iter; + gdouble duration, total_length, chunk_length; + + if ( ! tr->trackpoints ) + return NULL; + + t1 = VIK_TRACKPOINT(tr->trackpoints->data)->timestamp; + t2 = VIK_TRACKPOINT(g_list_last(tr->trackpoints)->data)->timestamp; + duration = t2 - t1; + + if ( !t1 || !t2 || !duration ) + return NULL; + + if (duration < 0) { + g_warning("negative duration: unsorted trackpoint timestamps?"); + return NULL; + } + + total_length = vik_track_get_length_including_gaps ( tr ); + chunk_length = total_length / num_chunks; + pt_count = vik_track_get_tp_count(tr); + + if (chunk_length <= 0) { + return NULL; + } + + v = g_malloc ( sizeof(gdouble) * num_chunks ); + s = g_malloc ( sizeof(double) * pt_count ); + t = g_malloc ( sizeof(double) * pt_count ); + + // No special handling of segments ATM... + iter = tr->trackpoints->next; + numpts = 0; + s[0] = 0; + t[0] = VIK_TRACKPOINT(tr->trackpoints->data)->timestamp; + numpts++; + while (iter) { + s[numpts] = s[numpts-1] + vik_coord_diff ( &(VIK_TRACKPOINT(iter->prev->data)->coord), &(VIK_TRACKPOINT(iter->data)->coord) ); + t[numpts] = VIK_TRACKPOINT(iter->data)->timestamp; + numpts++; + iter = iter->next; + } + + // Iterate through a portion of the track to get an average speed for that part + // This will essentially interpolate between segments, which I think is right given the usage of 'get_length_including_gaps' + index = 0; /* index of the current trackpoint. */ + for (i = 0; i < num_chunks; i++) { + // Similar to the make_speed_map, but instead of using a time chunk, use a distance chunk + if (s[0] + i*chunk_length >= s[index]) { + gdouble acc_t = 0, acc_s = 0; + while (s[0] + i*chunk_length >= s[index]) { + acc_s += (s[index+1]-s[index]); + acc_t += (t[index+1]-t[index]); + index++; + } + v[i] = acc_s/acc_t; + } + else if (i) { + v[i] = v[i-1]; + } + else { + v[i] = 0; + } + } + g_free(s); + g_free(t); + return v; +} + +/** + * vik_track_get_tp_by_dist: + * @trk: The Track on which to find a Trackpoint + * @meters_from_start: The distance along a track that the trackpoint returned is near + * @get_next_point: Since there is a choice of trackpoints, this determines which one to return + * @tp_metres_from_start: For the returned Trackpoint, returns the distance along the track + * + * TODO: Consider changing the boolean get_next_point into an enum with these options PREVIOUS, NEXT, NEAREST + * + * Returns: The #VikTrackpoint fitting the criteria or NULL + */ +VikTrackpoint *vik_track_get_tp_by_dist ( VikTrack *trk, gdouble meters_from_start, gboolean get_next_point, gdouble *tp_metres_from_start ) +{ + gdouble current_dist = 0.0; + gdouble current_inc = 0.0; + if ( tp_metres_from_start ) + *tp_metres_from_start = 0.0; + + if ( trk->trackpoints ) { + GList *iter = g_list_next ( g_list_first ( trk->trackpoints ) ); + while (iter) { + current_inc = vik_coord_diff ( &(VIK_TRACKPOINT(iter->data)->coord), + &(VIK_TRACKPOINT(iter->prev->data)->coord) ); + current_dist += current_inc; + if ( current_dist >= meters_from_start ) + break; + iter = g_list_next ( iter ); + } + // passed the end of the track + if ( !iter ) + return NULL; + + if ( tp_metres_from_start ) + *tp_metres_from_start = current_dist; + + // we've gone past the distance already, is the previous trackpoint wanted? + if ( !get_next_point ) { + if ( iter->prev ) { + if ( tp_metres_from_start ) + *tp_metres_from_start = current_dist-current_inc; + return VIK_TRACKPOINT(iter->prev->data); + } + } + return VIK_TRACKPOINT(iter->data); + } + + return NULL; +} + +/* by Alex Foobarian */ +VikTrackpoint *vik_track_get_closest_tp_by_percentage_dist ( VikTrack *tr, gdouble reldist, gdouble *meters_from_start ) +{ + gdouble dist = vik_track_get_length_including_gaps(tr) * reldist; + gdouble current_dist = 0.0; + gdouble current_inc = 0.0; + if ( tr->trackpoints ) + { + GList *iter = tr->trackpoints->next; + GList *last_iter = NULL; + gdouble last_dist = 0.0; + while (iter) + { + current_inc = vik_coord_diff ( &(VIK_TRACKPOINT(iter->data)->coord), + &(VIK_TRACKPOINT(iter->prev->data)->coord) ); + last_dist = current_dist; + current_dist += current_inc; + if ( current_dist >= dist ) + break; + last_iter = iter; + iter = iter->next; + } + if (!iter) { /* passing the end the track */ + if (last_iter) { + if (meters_from_start) + *meters_from_start = last_dist; + return(VIK_TRACKPOINT(last_iter->data)); + } + else + return NULL; + } + /* we've gone past the dist already, was prev trackpoint closer? */ + /* should do a vik_coord_average_weighted() thingy. */ + if ( iter->prev && fabs(current_dist-current_inc-dist) < fabs(current_dist-dist) ) { + if (meters_from_start) + *meters_from_start = last_dist; + iter = iter->prev; + } + else + if (meters_from_start) + *meters_from_start = current_dist; + + return VIK_TRACKPOINT(iter->data); + + } + return NULL; +} + +VikTrackpoint *vik_track_get_closest_tp_by_percentage_time ( VikTrack *tr, gdouble reltime, time_t *seconds_from_start ) +{ + if ( !tr->trackpoints ) + return NULL; + + time_t t_pos, t_start, t_end, t_total; + t_start = VIK_TRACKPOINT(tr->trackpoints->data)->timestamp; + t_end = VIK_TRACKPOINT(g_list_last(tr->trackpoints)->data)->timestamp; + t_total = t_end - t_start; + + t_pos = t_start + t_total * reltime; + + GList *iter = tr->trackpoints; + + while (iter) { + if (VIK_TRACKPOINT(iter->data)->timestamp == t_pos) + break; + if (VIK_TRACKPOINT(iter->data)->timestamp > t_pos) { + if (iter->prev == NULL) /* first trackpoint */ + break; + time_t t_before = t_pos - VIK_TRACKPOINT(iter->prev->data)->timestamp; + time_t t_after = VIK_TRACKPOINT(iter->data)->timestamp - t_pos; + if (t_before <= t_after) + iter = iter->prev; + break; + } + else if ((iter->next == NULL) && (t_pos < (VIK_TRACKPOINT(iter->data)->timestamp + 3))) /* last trackpoint: accommodate for round-off */ + break; + iter = iter->next; + } + + if (!iter) + return NULL; + if (seconds_from_start) + *seconds_from_start = VIK_TRACKPOINT(iter->data)->timestamp - VIK_TRACKPOINT(tr->trackpoints->data)->timestamp; + return VIK_TRACKPOINT(iter->data); +} + +VikTrackpoint* vik_track_get_tp_by_max_speed ( const VikTrack *tr ) +{ + gdouble maxspeed = 0.0, speed = 0.0; + + if ( !tr->trackpoints ) + return NULL; + + GList *iter = tr->trackpoints; + VikTrackpoint *max_speed_tp = NULL; + + while (iter) { + if (iter->prev) { + if ( VIK_TRACKPOINT(iter->data)->has_timestamp && + VIK_TRACKPOINT(iter->prev->data)->has_timestamp && + (! VIK_TRACKPOINT(iter->data)->newsegment) ) { + speed = vik_coord_diff ( &(VIK_TRACKPOINT(iter->data)->coord), &(VIK_TRACKPOINT(iter->prev->data)->coord) ) + / ABS(VIK_TRACKPOINT(iter->data)->timestamp - VIK_TRACKPOINT(iter->prev->data)->timestamp); + if ( speed > maxspeed ) { + maxspeed = speed; + max_speed_tp = VIK_TRACKPOINT(iter->data); + } + } + } + iter = iter->next; + } + + if (!max_speed_tp) + return NULL; + + return max_speed_tp; +} + +VikTrackpoint* vik_track_get_tp_by_max_alt ( const VikTrack *tr ) +{ + gdouble maxalt = -5000.0; + if ( !tr->trackpoints ) + return NULL; + + GList *iter = tr->trackpoints; + VikTrackpoint *max_alt_tp = NULL; + + while (iter) { + if ( VIK_TRACKPOINT(iter->data)->altitude > maxalt ) { + maxalt = VIK_TRACKPOINT(iter->data)->altitude; + max_alt_tp = VIK_TRACKPOINT(iter->data); + } + iter = iter->next; + } + + if (!max_alt_tp) + return NULL; + + return max_alt_tp; +} + +VikTrackpoint* vik_track_get_tp_by_min_alt ( const VikTrack *tr ) +{ + gdouble minalt = 25000.0; + if ( !tr->trackpoints ) + return NULL; + + GList *iter = tr->trackpoints; + VikTrackpoint *min_alt_tp = NULL; + + while (iter) { + if ( VIK_TRACKPOINT(iter->data)->altitude < minalt ) { + minalt = VIK_TRACKPOINT(iter->data)->altitude; + min_alt_tp = VIK_TRACKPOINT(iter->data); + } + iter = iter->next; + } + + if (!min_alt_tp) + return NULL; + + return min_alt_tp; +} + +VikTrackpoint *vik_track_get_tp_first( const VikTrack *tr ) +{ + if ( !tr->trackpoints ) + return NULL; + + return (VikTrackpoint*)g_list_first(tr->trackpoints)->data; +} + +VikTrackpoint *vik_track_get_tp_last ( const VikTrack *tr ) +{ + if ( !tr->trackpoints ) + return NULL; + + return (VikTrackpoint*)g_list_last(tr->trackpoints)->data; +} + +VikTrackpoint *vik_track_get_tp_prev ( const VikTrack *tr, VikTrackpoint *tp ) +{ + if ( !tr->trackpoints ) + return NULL; + + GList *iter = tr->trackpoints; + VikTrackpoint *tp_prev = NULL; + + while (iter) { + if (iter->prev) { + if ( VIK_TRACKPOINT(iter->data) == tp ) { + tp_prev = VIK_TRACKPOINT(iter->prev->data); + break; + } + } + iter = iter->next; + } + + return tp_prev; +} + +/** + * vik_track_get_minmax_alt: + * + * Finds the minimum and maximum altitudes in the specified track + * + * Returns: Whether any altitudes where found + */ +gboolean vik_track_get_minmax_alt ( const VikTrack *tr, gdouble *min_alt, gdouble *max_alt ) +{ + *min_alt = 25000; + *max_alt = -5000; + if ( tr && tr->trackpoints ) { + GList *iter = tr->trackpoints; + gdouble tmp_alt; + while (iter) { + VikTrackpoint *tp = VIK_TRACKPOINT(iter->data); + if ( tp->altitude != VIK_DEFAULT_ALTITUDE ) { + tmp_alt = tp->altitude; + if ( tmp_alt > *max_alt ) + *max_alt = tmp_alt; + if ( tmp_alt < *min_alt ) + *min_alt = tmp_alt; + } + iter = iter->next; + } + return (*min_alt != 25000); + } + return FALSE; +} + +void vik_track_marshall ( VikTrack *tr, guint8 **data, guint *datalen) +{ + GList *tps; + GByteArray *b = g_byte_array_new(); + guint len; + guint intp, ntp; + + g_byte_array_append(b, (guint8 *)tr, sizeof(*tr)); + + /* we'll fill out number of trackpoints later */ + intp = b->len; + g_byte_array_append(b, (guint8 *)&len, sizeof(len)); + + // This allocates space for variant sized strings + // and copies that amount of data from the track to byte array +#define vtm_append(s) \ + len = (s) ? strlen(s)+1 : 0; \ + g_byte_array_append(b, (guint8 *)&len, sizeof(len)); \ + if (s) g_byte_array_append(b, (guint8 *)s, len); + + tps = tr->trackpoints; + ntp = 0; + while (tps) { + g_byte_array_append(b, (guint8 *)tps->data, sizeof(VikTrackpoint)); + vtm_append(VIK_TRACKPOINT(tps->data)->name); + tps = tps->next; + ntp++; + } + *(guint *)(b->data + intp) = ntp; + + vtm_append(tr->name); + vtm_append(tr->comment); + vtm_append(tr->description); + vtm_append(tr->source); + + *data = b->data; + *datalen = b->len; + g_byte_array_free(b, FALSE); +} + +/* + * Take a byte array and convert it into a Track + */ +VikTrack *vik_track_unmarshall (const guint8 *data_in, guint datalen) +{ + guint len; + VikTrack *new_tr = vik_track_new(); + VikTrackpoint *new_tp; + guint ntp; + gint i; + guint8 *data = (guint8*)data_in; + + /* basic properties: */ + new_tr->visible = ((VikTrack *)data)->visible; + new_tr->is_route = ((VikTrack *)data)->is_route; + new_tr->draw_name_mode = ((VikTrack *)data)->draw_name_mode; + new_tr->max_number_dist_labels = ((VikTrack *)data)->max_number_dist_labels; + new_tr->has_color = ((VikTrack *)data)->has_color; + new_tr->color = ((VikTrack *)data)->color; + new_tr->bbox = ((VikTrack *)data)->bbox; + + data += sizeof(*new_tr); + + ntp = *(guint *)data; + data += sizeof(ntp); + +#define vtu_get(s) \ + len = *(guint *)data; \ + data += sizeof(len); \ + if (len) { \ + (s) = g_strdup((gchar *)data); \ + } else { \ + (s) = NULL; \ + } \ + data += len; + + for (i=0; iname); + new_tr->trackpoints = g_list_prepend(new_tr->trackpoints, new_tp); + } + if ( new_tr->trackpoints ) + new_tr->trackpoints = g_list_reverse(new_tr->trackpoints); + + vtu_get(new_tr->name); + vtu_get(new_tr->comment); + vtu_get(new_tr->description); + vtu_get(new_tr->source); + + return new_tr; +} + +/** + * (Re)Calculate the bounds of the given track, + * updating the track's bounds data. + * This should be called whenever a track's trackpoints are changed + */ +void vik_track_calculate_bounds ( VikTrack *trk ) +{ + GList *tp_iter; + tp_iter = trk->trackpoints; + + struct LatLon topleft, bottomright, ll; + + // Set bounds to first point + if ( tp_iter ) { + vik_coord_to_latlon ( &(VIK_TRACKPOINT(tp_iter->data)->coord), &topleft ); + vik_coord_to_latlon ( &(VIK_TRACKPOINT(tp_iter->data)->coord), &bottomright ); + } + while ( tp_iter ) { + + // See if this trackpoint increases the track bounds. + + vik_coord_to_latlon ( &(VIK_TRACKPOINT(tp_iter->data)->coord), &ll ); + + if ( ll.lat > topleft.lat) topleft.lat = ll.lat; + if ( ll.lon < topleft.lon) topleft.lon = ll.lon; + if ( ll.lat < bottomright.lat) bottomright.lat = ll.lat; + if ( ll.lon > bottomright.lon) bottomright.lon = ll.lon; + + tp_iter = tp_iter->next; + } + + g_debug ( "Bounds of track: '%s' is: %f,%f to: %f,%f", trk->name, topleft.lat, topleft.lon, bottomright.lat, bottomright.lon ); + + trk->bbox.north = topleft.lat; + trk->bbox.east = bottomright.lon; + trk->bbox.south = bottomright.lat; + trk->bbox.west = topleft.lon; +} + +/** + * vik_track_anonymize_times: + * + * Shift all timestamps to be relatively offset from 1901-01-01 + */ +void vik_track_anonymize_times ( VikTrack *tr ) +{ + GTimeVal gtv; + // Check result just to please Coverity - even though it shouldn't fail as it's a hard coded value here! + if ( !g_time_val_from_iso8601 ( "1901-01-01T00:00:00Z", >v ) ) { + g_critical ( "Calendar time value failure" ); + return; + } + + time_t anon_timestamp = gtv.tv_sec; + time_t offset = 0; + + GList *tp_iter; + tp_iter = tr->trackpoints; + while ( tp_iter ) { + VikTrackpoint *tp = VIK_TRACKPOINT(tp_iter->data); + if ( tp->has_timestamp ) { + // Calculate an offset in time using the first available timestamp + if ( offset == 0 ) + offset = tp->timestamp - anon_timestamp; + + // Apply this offset to shift all timestamps towards 1901 & hence anonymising the time + // Note that the relative difference between timestamps is kept - thus calculating speeds will still work + tp->timestamp = tp->timestamp - offset; + } + tp_iter = tp_iter->next; + } +} + +/** + * vik_track_interpolate_times: + * + * Interpolate the timestamps between first and last trackpoint, + * so that the track is driven at equal speed, regardless of the + * distance between individual trackpoints. + * + * NB This will overwrite any existing trackpoint timestamps + */ +void vik_track_interpolate_times ( VikTrack *tr ) +{ + gdouble tr_dist, cur_dist; + time_t tsdiff, tsfirst; + + GList *iter; + iter = tr->trackpoints; + + VikTrackpoint *tp = VIK_TRACKPOINT(iter->data); + if ( tp->has_timestamp ) { + tsfirst = tp->timestamp; + + // Find the end of the track and the last timestamp + while ( iter->next ) { + iter = iter->next; + } + tp = VIK_TRACKPOINT(iter->data); + if ( tp->has_timestamp ) { + tsdiff = tp->timestamp - tsfirst; + + tr_dist = vik_track_get_length_including_gaps ( tr ); + cur_dist = 0.0; + + if ( tr_dist > 0 ) { + iter = tr->trackpoints; + // Apply the calculated timestamp to all trackpoints except the first and last ones + while ( iter->next && iter->next->next ) { + iter = iter->next; + tp = VIK_TRACKPOINT(iter->data); + cur_dist += vik_coord_diff ( &(tp->coord), &(VIK_TRACKPOINT(iter->prev->data)->coord) ); + + tp->timestamp = (cur_dist / tr_dist) * tsdiff + tsfirst; + tp->has_timestamp = TRUE; + } + // Some points may now have the same time so remove them. + vik_track_remove_same_time_points ( tr ); + } + } + } +} + +/** + * vik_track_apply_dem_data: + * @skip_existing: When TRUE, don't change the elevation if the trackpoint already has a value + * + * Set elevation data for a track using any available DEM information + */ +gulong vik_track_apply_dem_data ( VikTrack *tr, gboolean skip_existing ) +{ + gulong num = 0; + GList *tp_iter; + gint16 elev; + tp_iter = tr->trackpoints; + while ( tp_iter ) { + // Don't apply if the point already has a value and the overwrite is off + if ( !(skip_existing && VIK_TRACKPOINT(tp_iter->data)->altitude != VIK_DEFAULT_ALTITUDE) ) { + /* TODO: of the 4 possible choices we have for choosing an elevation + * (trackpoint in between samples), choose the one with the least elevation change + * as the last */ + elev = a_dems_get_elev_by_coord ( &(VIK_TRACKPOINT(tp_iter->data)->coord), VIK_DEM_INTERPOL_BEST ); + + if ( elev != VIK_DEM_INVALID_ELEVATION ) { + VIK_TRACKPOINT(tp_iter->data)->altitude = elev; + num++; + } + } + tp_iter = tp_iter->next; + } + return num; +} + +/** + * vik_track_apply_dem_data_last_trackpoint: + * Apply DEM data (if available) - to only the last trackpoint + */ +void vik_track_apply_dem_data_last_trackpoint ( VikTrack *tr ) +{ + gint16 elev; + if ( tr->trackpoints ) { + /* As in vik_track_apply_dem_data above - use 'best' interpolation method */ + elev = a_dems_get_elev_by_coord ( &(VIK_TRACKPOINT(g_list_last(tr->trackpoints)->data)->coord), VIK_DEM_INTERPOL_BEST ); + if ( elev != VIK_DEM_INVALID_ELEVATION ) + VIK_TRACKPOINT(g_list_last(tr->trackpoints)->data)->altitude = elev; + } +} + + +/** + * smoothie: + * + * Apply elevation smoothing over range of trackpoints between the list start and end points + */ +static void smoothie ( GList *tp1, GList *tp2, gdouble elev1, gdouble elev2, guint points ) +{ + // If was really clever could try and weigh interpolation according to the distance between trackpoints somehow + // Instead a simple average interpolation for the number of points given. + gdouble change = (elev2 - elev1)/(points+1); + gint count = 1; + GList *tp_iter = tp1; + while ( tp_iter != tp2 && tp_iter ) { + VikTrackpoint *tp = VIK_TRACKPOINT(tp_iter->data); + + tp->altitude = elev1 + (change*count); + + count++; + tp_iter = tp_iter->next; + } +} + +/** + * vik_track_smooth_missing_elevation_data: + * @flat: Specify how the missing elevations will be set. + * When TRUE it uses a simple flat method, using the last known elevation + * When FALSE is uses an interpolation method to the next known elevation + * + * For each point with a missing elevation, set it to use the last known available elevation value. + * Primarily of use for smallish DEM holes where it is missing elevation data. + * Eg see Austria: around N47.3 & E13.8 + * + * Returns: The number of points that were adjusted + */ +gulong vik_track_smooth_missing_elevation_data ( VikTrack *tr, gboolean flat ) +{ + gulong num = 0; + + GList *tp_iter; + gdouble elev = VIK_DEFAULT_ALTITUDE; + + VikTrackpoint *tp_missing = NULL; + GList *iter_first = NULL; + guint points = 0; + + tp_iter = tr->trackpoints; + while ( tp_iter ) { + VikTrackpoint *tp = VIK_TRACKPOINT(tp_iter->data); + + if ( VIK_DEFAULT_ALTITUDE == tp->altitude ) { + if ( flat ) { + // Simply assign to last known value + if ( elev != VIK_DEFAULT_ALTITUDE ) { + tp->altitude = elev; + num++; + } + } + else { + if ( !tp_missing ) { + // Remember the first trackpoint (and the list pointer to it) of a section of no altitudes + tp_missing = tp; + iter_first = tp_iter; + points = 1; + } + else { + // More missing altitudes + points++; + } + } + } + else { + // Altitude available (maybe again!) + // If this marks the end of a section of altitude-less points + // then apply smoothing for that section of points + if ( points > 0 && elev != VIK_DEFAULT_ALTITUDE ) + if ( !flat ) { + smoothie ( iter_first, tp_iter, elev, tp->altitude, points ); + num = num + points; + } + + // reset + points = 0; + tp_missing = NULL; + + // Store for reuse as the last known good value + elev = tp->altitude; + } + + tp_iter = tp_iter->next; + } + + return num; +} + +/** + * vik_track_steal_and_append_trackpoints: + * + * appends t2 to t1, leaving t2 with no trackpoints + */ +void vik_track_steal_and_append_trackpoints ( VikTrack *t1, VikTrack *t2 ) +{ + if ( t1->trackpoints ) { + t1->trackpoints = g_list_concat ( t1->trackpoints, t2->trackpoints ); + } else + t1->trackpoints = t2->trackpoints; + t2->trackpoints = NULL; + + // Trackpoints updated - so update the bounds + vik_track_calculate_bounds ( t1 ); +} + +/** + * vik_track_cut_back_to_double_point: + * + * starting at the end, looks backwards for the last "double point", a duplicate trackpoint. + * If there is no double point, deletes all the trackpoints. + * + * Returns: the new end of the track (or the start if there are no double points) + */ +VikCoord *vik_track_cut_back_to_double_point ( VikTrack *tr ) +{ + GList *iter = tr->trackpoints; + VikCoord *rv; + + if ( !iter ) + return NULL; + while ( iter->next ) + iter = iter->next; + + + while ( iter->prev ) { + VikCoord *cur_coord = &((VikTrackpoint*)iter->data)->coord; + VikCoord *prev_coord = &((VikTrackpoint*)iter->prev->data)->coord; + if ( vik_coord_equals(cur_coord, prev_coord) ) { + GList *prev = iter->prev; + + rv = g_malloc(sizeof(VikCoord)); + *rv = *cur_coord; + + /* truncate trackpoint list */ + iter->prev = NULL; /* pretend it's the end */ + g_list_foreach ( iter, (GFunc) g_free, NULL ); + g_list_free( iter ); + + prev->next = NULL; + + return rv; + } + iter = iter->prev; + } + + /* no double point found! */ + rv = g_malloc(sizeof(VikCoord)); + *rv = ((VikTrackpoint*) tr->trackpoints->data)->coord; + g_list_foreach ( tr->trackpoints, (GFunc) g_free, NULL ); + g_list_free( tr->trackpoints ); + tr->trackpoints = NULL; + return rv; +} + +/** + * Function to compare two tracks by their first timestamp + * If same timestamp, fall back on name + **/ +int vik_track_compare_timestamp (const void *x, const void *y) +{ + VikTrack *a = (VikTrack *)x; + VikTrack *b = (VikTrack *)y; + + VikTrackpoint *tpa = NULL; + VikTrackpoint *tpb = NULL; + + if ( a->trackpoints ) + tpa = VIK_TRACKPOINT(g_list_first(a->trackpoints)->data); + + if ( b->trackpoints ) + tpb = VIK_TRACKPOINT(g_list_first(b->trackpoints)->data); + + if ( tpa && tpb ) { + if ( tpa->timestamp < tpb->timestamp ) + return -1; + if ( tpa->timestamp > tpb->timestamp ) + return 1; + } + + if ( tpa && !tpb ) + return 1; + + if ( !tpa && tpb ) + return -1; + + return strcmp ( a->name, b->name ); +} diff --git a/src/viktrack.h b/src/viktrack.h new file mode 100644 index 0000000..5acc86b --- /dev/null +++ b/src/viktrack.h @@ -0,0 +1,177 @@ +/* + * viking -- GPS Data and Topo Analyzer, Explorer, and Manager + * + * Copyright (C) 2003-2005, Evan Battaglia + * + * 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., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA + * + */ + +#ifndef _VIKING_TRACK_H +#define _VIKING_TRACK_H + +#include +#include +#include + +#include "vikcoord.h" +#include "bbox.h" + +G_BEGIN_DECLS + +/* todo important: put these in their own header file, maybe.probably also rename */ + +#define VIK_TRACK(x) ((VikTrack *)(x)) +#define VIK_TRACKPOINT(x) ((VikTrackpoint *)(x)) + +typedef struct _VikTrackpoint VikTrackpoint; +struct _VikTrackpoint { + gchar* name; + VikCoord coord; + gboolean newsegment; + gboolean has_timestamp; + time_t timestamp; + gdouble altitude; /* VIK_DEFAULT_ALTITUDE if data unavailable */ + gdouble speed; /* NAN if data unavailable */ + gdouble course; /* NAN if data unavailable */ + guint nsats; /* number of satellites used. 0 if data unavailable */ +#define VIK_GPS_MODE_NOT_SEEN 0 /* mode update not seen yet */ +#define VIK_GPS_MODE_NO_FIX 1 /* none */ +#define VIK_GPS_MODE_2D 2 /* good for latitude/longitude */ +#define VIK_GPS_MODE_3D 3 /* good for altitude/climb too */ +#define VIK_GPS_MODE_DGPS 4 +#define VIK_GPS_MODE_PPS 5 /* military signal used */ + gint fix_mode; /* VIK_GPS_MODE_NOT_SEEN if data unavailable */ + gdouble hdop; /* VIK_DEFAULT_DOP if data unavailable */ + gdouble vdop; /* VIK_DEFAULT_DOP if data unavailable */ + gdouble pdop; /* VIK_DEFAULT_DOP if data unavailable */ +}; + +typedef enum { + TRACK_DRAWNAME_NO=0, + TRACK_DRAWNAME_CENTRE, + TRACK_DRAWNAME_START, + TRACK_DRAWNAME_END, + TRACK_DRAWNAME_START_END, + TRACK_DRAWNAME_START_END_CENTRE, + NUM_TRACK_DRAWNAMES +} VikTrackDrawnameType; + +// Instead of having a separate VikRoute type, routes are considered tracks +// Thus all track operations must cope with a 'route' version +// [track functions handle having no timestamps anyway - so there is no practical difference in most cases] +// This is simpler than having to rewrite particularly every track function for route version +// given that they do the same things +// Mostly this matters in the display in deciding where and how they are shown +typedef struct _VikTrack VikTrack; +struct _VikTrack { + GList *trackpoints; + gboolean visible; + gboolean is_route; + VikTrackDrawnameType draw_name_mode; + guint8 max_number_dist_labels; + gchar *comment; + gchar *description; + gchar *source; + gchar *type; + guint8 ref_count; + gchar *name; + GtkWidget *property_dialog; + gboolean has_color; + GdkColor color; + LatLonBBox bbox; +}; + +VikTrack *vik_track_new(); +void vik_track_set_defaults(VikTrack *tr); +void vik_track_set_name(VikTrack *tr, const gchar *name); +void vik_track_set_comment(VikTrack *tr, const gchar *comment); +void vik_track_set_description(VikTrack *tr, const gchar *description); +void vik_track_set_source(VikTrack *tr, const gchar *source); +void vik_track_set_type(VikTrack *tr, const gchar *type); +void vik_track_ref(VikTrack *tr); +void vik_track_free(VikTrack *tr); +VikTrack *vik_track_copy ( const VikTrack *tr, gboolean copy_points ); +void vik_track_set_comment_no_copy(VikTrack *tr, gchar *comment); +VikTrackpoint *vik_trackpoint_new(); +void vik_trackpoint_free(VikTrackpoint *tp); +VikTrackpoint *vik_trackpoint_copy(VikTrackpoint *tp); +void vik_trackpoint_set_name(VikTrackpoint *tp, const gchar *name); + +void vik_track_add_trackpoint(VikTrack *tr, VikTrackpoint *tp, gboolean recalculate); +gdouble vik_track_get_length_to_trackpoint (const VikTrack *tr, const VikTrackpoint *tp); +gdouble vik_track_get_length(const VikTrack *tr); +gdouble vik_track_get_length_including_gaps(const VikTrack *tr); +gulong vik_track_get_tp_count(const VikTrack *tr); +guint vik_track_get_segment_count(const VikTrack *tr); +VikTrack **vik_track_split_into_segments(VikTrack *tr, guint *ret_len); +guint vik_track_merge_segments(VikTrack *tr); +void vik_track_reverse(VikTrack *tr); +time_t vik_track_get_duration(const VikTrack *trk, gboolean include_segments); + +gulong vik_track_get_dup_point_count ( const VikTrack *vt ); +gulong vik_track_remove_dup_points ( VikTrack *vt ); +gulong vik_track_get_same_time_point_count ( const VikTrack *vt ); +gulong vik_track_remove_same_time_points ( VikTrack *vt ); + +gboolean vik_track_remove_dodgy_first_point ( VikTrack *vt, guint speed, gboolean recalc_bounds ); + +void vik_track_to_routepoints ( VikTrack *tr ); + +gdouble vik_track_get_max_speed(const VikTrack *tr); +gdouble vik_track_get_average_speed(const VikTrack *tr); +gdouble vik_track_get_average_speed_moving ( const VikTrack *tr, int stop_length_seconds ); + +void vik_track_convert ( VikTrack *tr, VikCoordMode dest_mode ); +gdouble *vik_track_make_elevation_map ( const VikTrack *tr, guint16 num_chunks ); +void vik_track_get_total_elevation_gain(const VikTrack *tr, gdouble *up, gdouble *down); +VikTrackpoint *vik_track_get_tp_by_dist ( VikTrack *trk, gdouble meters_from_start, gboolean get_next_point, gdouble *tp_metres_from_start ); +VikTrackpoint *vik_track_get_closest_tp_by_percentage_dist ( VikTrack *tr, gdouble reldist, gdouble *meters_from_start ); +VikTrackpoint *vik_track_get_closest_tp_by_percentage_time ( VikTrack *tr, gdouble reldist, time_t *seconds_from_start ); +VikTrackpoint *vik_track_get_tp_by_max_speed ( const VikTrack *tr ); +VikTrackpoint *vik_track_get_tp_by_max_alt ( const VikTrack *tr ); +VikTrackpoint *vik_track_get_tp_by_min_alt ( const VikTrack *tr ); +VikTrackpoint *vik_track_get_tp_first ( const VikTrack *tr ); +VikTrackpoint *vik_track_get_tp_last ( const VikTrack *tr ); +VikTrackpoint *vik_track_get_tp_prev ( const VikTrack *tr, VikTrackpoint *tp ); +gdouble *vik_track_make_gradient_map ( const VikTrack *tr, guint16 num_chunks ); +gdouble *vik_track_make_speed_map ( const VikTrack *tr, guint16 num_chunks ); +gdouble *vik_track_make_distance_map ( const VikTrack *tr, guint16 num_chunks ); +gdouble *vik_track_make_elevation_time_map ( const VikTrack *tr, guint16 num_chunks ); +gdouble *vik_track_make_speed_dist_map ( const VikTrack *tr, guint16 num_chunks ); +gboolean vik_track_get_minmax_alt ( const VikTrack *tr, gdouble *min_alt, gdouble *max_alt ); +void vik_track_marshall ( VikTrack *tr, guint8 **data, guint *len); +VikTrack *vik_track_unmarshall (const guint8 *data_in, guint datalen); + +void vik_track_calculate_bounds ( VikTrack *trk ); + +void vik_track_anonymize_times ( VikTrack *tr ); +void vik_track_interpolate_times ( VikTrack *tr ); +gulong vik_track_apply_dem_data ( VikTrack *tr, gboolean skip_existing ); +void vik_track_apply_dem_data_last_trackpoint ( VikTrack *tr ); +gulong vik_track_smooth_missing_elevation_data ( VikTrack *tr, gboolean flat ); + +void vik_track_steal_and_append_trackpoints ( VikTrack *t1, VikTrack *t2 ); + +VikCoord *vik_track_cut_back_to_double_point ( VikTrack *tr ); + +int vik_track_compare_timestamp (const void *x, const void *y); + +void vik_track_set_property_dialog(VikTrack *tr, GtkWidget *dialog); +void vik_track_clear_property_dialog(VikTrack *tr); + +G_END_DECLS + +#endif diff --git a/src/viktreeview.c b/src/viktreeview.c new file mode 100644 index 0000000..d81b926 --- /dev/null +++ b/src/viktreeview.c @@ -0,0 +1,927 @@ +/* + * viking -- GPS Data and Topo Analyzer, Explorer, and Manager + * + * Copyright (C) 2003-2005, Evan Battaglia + * Copyright (C) 2010-2015, Rob Norris + * + * 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., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA + * + */ + +#ifdef HAVE_CONFIG_H +#include "config.h" +#endif + +#include +#include + +#include + +#include "viking.h" +#include "config.h" + +#define TREEVIEW_GET(model,iter,what,dest) gtk_tree_model_get(GTK_TREE_MODEL(model),(iter),(what),(dest),-1) + +enum { + VT_ITEM_EDITED_SIGNAL, + VT_ITEM_TOGGLED_SIGNAL, + VT_LAST_SIGNAL +}; + +static guint treeview_signals[VT_LAST_SIGNAL] = { 0, 0 }; + +static GObjectClass *parent_class; + +enum +{ + NAME_COLUMN = 0, + VISIBLE_COLUMN, + ICON_COLUMN, + /* invisible */ + + TYPE_COLUMN, + ITEM_PARENT_COLUMN, + ITEM_POINTER_COLUMN, + ITEM_DATA_COLUMN, + EDITABLE_COLUMN, + ITEM_TIMESTAMP_COLUMN, // Date timestamp stored in tree model to enable sorting on this value + NUM_COLUMNS +}; + +struct _VikTreeview { + GtkTreeView treeview; + GtkTreeModel *model; + + GdkPixbuf *layer_type_icons[VIK_LAYER_NUM_TYPES]; + + gboolean was_a_toggle; + gboolean editing; +}; + +/* TODO: find, make "static" and put up here all non-"a_" functions */ +static void vik_treeview_finalize ( GObject *gob ); +static void vik_treeview_add_columns ( VikTreeview *vt ); + +static gboolean vik_treeview_drag_data_received ( GtkTreeDragDest *drag_dest, GtkTreePath *dest, GtkSelectionData *selection_data ); +static gboolean vik_treeview_drag_data_delete ( GtkTreeDragSource *drag_source, GtkTreePath *path ); + +G_DEFINE_TYPE (VikTreeview, vik_treeview, GTK_TYPE_TREE_VIEW) + +static void vik_cclosure_marshal_VOID__POINTER_POINTER ( GClosure *closure, + GValue *return_value, + guint n_param_vals, + const GValue *param_values, + gpointer invocation_hint, + gpointer marshal_data ) +{ + typedef gboolean (*VikMarshalFunc_VOID__POINTER_POINTER) ( gpointer data1, + gconstpointer arg_1, + gconstpointer arg_2, + gpointer data2 ); + + register VikMarshalFunc_VOID__POINTER_POINTER callback; + register GCClosure* cc = (GCClosure*) closure; + register gpointer data1, data2; + + g_return_if_fail (n_param_vals == 3); + + if (G_CCLOSURE_SWAP_DATA(closure)) { + data1 = closure->data; + data2 = g_value_peek_pointer (param_values + 0); + } + else { + data1 = g_value_peek_pointer (param_values + 0); + data2 = closure->data; + } + callback = (VikMarshalFunc_VOID__POINTER_POINTER) (marshal_data ? marshal_data : cc->callback); + callback ( data1, + g_value_get_pointer(param_values + 1), + g_value_get_pointer(param_values + 2), + data2 ); +} + +static void vik_treeview_class_init ( VikTreeviewClass *klass ) +{ + /* Destructor */ + GObjectClass *object_class; + + object_class = G_OBJECT_CLASS (klass); + + object_class->finalize = vik_treeview_finalize; + + parent_class = g_type_class_peek_parent (klass); + + treeview_signals[VT_ITEM_EDITED_SIGNAL] = g_signal_new ( "item_edited", G_TYPE_FROM_CLASS (klass), G_SIGNAL_RUN_FIRST | G_SIGNAL_ACTION, G_STRUCT_OFFSET (VikTreeviewClass, item_edited), NULL, NULL, + vik_cclosure_marshal_VOID__POINTER_POINTER, G_TYPE_NONE, 2, G_TYPE_POINTER, G_TYPE_POINTER); + + treeview_signals[VT_ITEM_TOGGLED_SIGNAL] = g_signal_new ( "item_toggled", G_TYPE_FROM_CLASS (klass), G_SIGNAL_RUN_FIRST | G_SIGNAL_ACTION, G_STRUCT_OFFSET (VikTreeviewClass, item_toggled), NULL, NULL, + g_cclosure_marshal_VOID__POINTER, G_TYPE_NONE, 1, G_TYPE_POINTER ); +} + +static void vik_treeview_edited_cb (GtkCellRendererText *cell, gchar *path_str, const gchar *new_name, VikTreeview *vt) +{ + vt->editing = FALSE; + GtkTreeIter iter; + + /* get type and data */ + vik_treeview_get_iter_from_path_str ( vt, &iter, path_str ); + + g_signal_emit ( G_OBJECT(vt), treeview_signals[VT_ITEM_EDITED_SIGNAL], 0, &iter, new_name ); +} + +static void vik_treeview_edit_start_cb (GtkCellRenderer *cell, GtkCellEditable *editable, gchar *path, VikTreeview *vt) +{ + vt->editing = TRUE; +} + +static void vik_treeview_edit_stop_cb (GtkCellRenderer *cell, VikTreeview *vt) +{ + vt->editing = FALSE; +} + +static void vik_treeview_toggled_cb (GtkCellRendererToggle *cell, gchar *path_str, VikTreeview *vt) +{ + GtkTreeIter iter_toggle; + GtkTreeIter iter_selected; + + /* get type and data */ + vik_treeview_get_iter_from_path_str ( vt, &iter_toggle, path_str ); + + GtkTreePath *tp_toggle = gtk_tree_model_get_path ( vt->model, &iter_toggle ); + + if ( gtk_tree_selection_get_selected ( gtk_tree_view_get_selection ( GTK_TREE_VIEW ( vt ) ), NULL, &iter_selected ) ) { + GtkTreePath *tp_selected = gtk_tree_model_get_path ( vt->model, &iter_selected ); + if ( gtk_tree_path_compare ( tp_toggle, tp_selected ) ) + // Toggle set on different path + // therefore prevent subsequent auto selection (otherwise no action needed) + vt->was_a_toggle = TRUE; + gtk_tree_path_free ( tp_selected ); + } + else + // Toggle set on new path + // therefore prevent subsequent auto selection + vt->was_a_toggle = TRUE; + + gtk_tree_path_free ( tp_toggle ); + + g_signal_emit ( G_OBJECT(vt), treeview_signals[VT_ITEM_TOGGLED_SIGNAL], 0, &iter_toggle ); +} + +/* Inspired by GTK+ test + * http://git.gnome.org/browse/gtk+/tree/tests/testtooltips.c + */ +static gboolean +vik_treeview_tooltip_cb (GtkWidget *widget, + gint x, + gint y, + gboolean keyboard_tip, + GtkTooltip *tooltip, + gpointer data) +{ + GtkTreeIter iter; + GtkTreeView *tree_view = GTK_TREE_VIEW (widget); + GtkTreeModel *model = gtk_tree_view_get_model (tree_view); + GtkTreePath *path = NULL; + + char buffer[256]; + + if (!gtk_tree_view_get_tooltip_context (tree_view, &x, &y, + keyboard_tip, + &model, &path, &iter)) + return FALSE; + + /* ATM normally treeview doesn't call into layers - maybe another level of redirection required? */ + gint rv; + gtk_tree_model_get (model, &iter, TYPE_COLUMN, &rv, -1); + if ( rv == VIK_TREEVIEW_TYPE_SUBLAYER ) { + + gtk_tree_model_get (model, &iter, ITEM_DATA_COLUMN, &rv, -1); + + gpointer sublayer; + gtk_tree_model_get (model, &iter, ITEM_POINTER_COLUMN, &sublayer, -1); + + gpointer parent; + gtk_tree_model_get (model, &iter, ITEM_PARENT_COLUMN, &parent, -1); + + g_snprintf (buffer, sizeof(buffer), "%s", vik_layer_sublayer_tooltip (VIK_LAYER(parent), rv, sublayer)); + } + else if ( rv == VIK_TREEVIEW_TYPE_LAYER ) { + gpointer layer; + gtk_tree_model_get (model, &iter, ITEM_POINTER_COLUMN, &layer, -1); + g_snprintf (buffer, sizeof(buffer), "%s", vik_layer_layer_tooltip (VIK_LAYER(layer))); + } + else { + gtk_tree_path_free (path); + return FALSE; + } + + // Don't display null strings :) + if ( strncmp (buffer, "(null)", 6) == 0 ) { + gtk_tree_path_free (path); + return FALSE; + } + else { + // No point in using (Pango) markup verson - gtk_tooltip_set_markup() + // especially as waypoint comments may well contain HTML markup which confuses the pango markup parser + // This plain text is probably faster too. + gtk_tooltip_set_text (tooltip, buffer); + } + + gtk_tree_view_set_tooltip_row (tree_view, tooltip, path); + + gtk_tree_path_free (path); + + return TRUE; +} + +VikTreeview *vik_treeview_new () +{ + return VIK_TREEVIEW ( g_object_new ( VIK_TREEVIEW_TYPE, NULL ) ); +} + +gint vik_treeview_item_get_type ( VikTreeview *vt, GtkTreeIter *iter ) +{ + gint rv; + TREEVIEW_GET ( vt->model, iter, TYPE_COLUMN, &rv ); + return rv; +} + +gchar* vik_treeview_item_get_name ( VikTreeview *vt, GtkTreeIter *iter ) +{ + gchar *rv; + TREEVIEW_GET ( vt->model, iter, NAME_COLUMN, &rv ); + return rv; +} + +gint vik_treeview_item_get_data ( VikTreeview *vt, GtkTreeIter *iter ) +{ + gint rv; + TREEVIEW_GET ( vt->model, iter, ITEM_DATA_COLUMN, &rv ); + return rv; +} + +gpointer vik_treeview_item_get_pointer ( VikTreeview *vt, GtkTreeIter *iter ) +{ + gpointer rv; + TREEVIEW_GET ( vt->model, iter, ITEM_POINTER_COLUMN, &rv ); + return rv; +} + +void vik_treeview_item_set_pointer ( VikTreeview *vt, GtkTreeIter *iter, gpointer pointer ) +{ + gtk_tree_store_set ( GTK_TREE_STORE(vt->model), iter, ITEM_POINTER_COLUMN, pointer, -1 ); +} + +void vik_treeview_item_set_timestamp ( VikTreeview *vt, GtkTreeIter *iter, time_t timestamp ) +{ + gtk_tree_store_set ( GTK_TREE_STORE(vt->model), iter, ITEM_TIMESTAMP_COLUMN, (gint64)timestamp, -1 ); +} + +gpointer vik_treeview_item_get_parent ( VikTreeview *vt, GtkTreeIter *iter ) +{ + gpointer rv; + TREEVIEW_GET ( vt->model, iter, ITEM_PARENT_COLUMN, &rv ); + return rv; +} + +gboolean vik_treeview_get_iter_from_path_str ( VikTreeview *vt, GtkTreeIter *iter, const gchar *path_str ) +{ + return gtk_tree_model_get_iter_from_string ( GTK_TREE_MODEL(vt->model), iter, path_str ); +} + +/** + * Get visibility of an item considering visibility of all parents + * i.e. if any parent is off then this item will also be considered off + * (even though itself may be marked as on.) + */ +gboolean vik_treeview_item_get_visible_tree ( VikTreeview *vt, GtkTreeIter *iter ) +{ + gboolean ans; + TREEVIEW_GET ( vt->model, iter, VISIBLE_COLUMN, &ans ); + + if ( !ans ) + return ans; + + GtkTreeIter parent; + GtkTreeIter child = *iter; + while ( gtk_tree_model_iter_parent (vt->model, &parent, &child) ) { + // Visibility of this parent + TREEVIEW_GET ( vt->model, &parent, VISIBLE_COLUMN, &ans ); + // If not visible, no need to check further ancestors + if ( !ans ) + break; + child = parent; + } + return ans; +} + +static void vik_treeview_add_columns ( VikTreeview *vt ) +{ + gint col_offset; + GtkCellRenderer *renderer; + GtkTreeViewColumn *column; + + /* Layer column */ + renderer = gtk_cell_renderer_text_new (); + g_signal_connect (renderer, "edited", + G_CALLBACK (vik_treeview_edited_cb), vt); + + g_signal_connect (renderer, "editing-started", G_CALLBACK (vik_treeview_edit_start_cb), vt); + g_signal_connect (renderer, "editing-canceled", G_CALLBACK (vik_treeview_edit_stop_cb), vt); + + g_object_set (G_OBJECT (renderer), "xalign", 0.0, "ellipsize", PANGO_ELLIPSIZE_END, NULL); + + col_offset = gtk_tree_view_insert_column_with_attributes (GTK_TREE_VIEW (vt), + -1, _("Layer Name"), + renderer, "text", + NAME_COLUMN, + "editable", EDITABLE_COLUMN, + NULL); + + /* ATM the minimum overall width (and starting default) of the treeview size is determined + by the buttons added to the bottom of the layerspanel */ + column = gtk_tree_view_get_column (GTK_TREE_VIEW (vt), col_offset - 1); + gtk_tree_view_column_set_sizing (GTK_TREE_VIEW_COLUMN (column), + GTK_TREE_VIEW_COLUMN_FIXED); + gtk_tree_view_column_set_expand (GTK_TREE_VIEW_COLUMN (column), TRUE); + + /* Layer type */ + renderer = gtk_cell_renderer_pixbuf_new (); + + g_object_set (G_OBJECT (renderer), "xalign", 0.5, NULL); + + col_offset = gtk_tree_view_insert_column_with_attributes (GTK_TREE_VIEW (vt), + -1, "", + renderer, "pixbuf", + ICON_COLUMN, + NULL); + + column = gtk_tree_view_get_column (GTK_TREE_VIEW (vt), col_offset - 1); + gtk_tree_view_column_set_sizing (GTK_TREE_VIEW_COLUMN (column), + GTK_TREE_VIEW_COLUMN_AUTOSIZE); + + /* Layer visible */ + renderer = gtk_cell_renderer_toggle_new (); + g_object_set (G_OBJECT (renderer), "xalign", 0.5, NULL); + + g_signal_connect (renderer, "toggled", G_CALLBACK (vik_treeview_toggled_cb), vt); + + col_offset = gtk_tree_view_insert_column_with_attributes (GTK_TREE_VIEW (vt), + -1, "", + renderer, + "active", + VISIBLE_COLUMN, + NULL); + + column = gtk_tree_view_get_column (GTK_TREE_VIEW (vt), col_offset - 1); + gtk_tree_view_column_set_sizing (GTK_TREE_VIEW_COLUMN (column), + GTK_TREE_VIEW_COLUMN_AUTOSIZE); + + + g_object_set (GTK_TREE_VIEW (vt), "has-tooltip", TRUE, NULL); + g_signal_connect (GTK_TREE_VIEW (vt), "query-tooltip", G_CALLBACK (vik_treeview_tooltip_cb), vt); +} + +static void select_cb(GtkTreeSelection *selection, gpointer data) +{ + VikTreeview *vt = data; + gint type; + GtkTreeIter iter, parent; + VikLayer *vl; + VikWindow * vw; + + gpointer tmp_layer; + VikLayer *tmp_vl = NULL; + gint tmp_subtype = 0; + gint tmp_type = VIK_TREEVIEW_TYPE_LAYER; + + if (!gtk_tree_selection_get_selected(selection, NULL, &iter)) return; + type = vik_treeview_item_get_type( vt, &iter); + + /* Find the Sublayer type if possible */ + tmp_layer = vik_treeview_item_get_pointer ( vt, &iter ); + if (tmp_layer) { + if (type == VIK_TREEVIEW_TYPE_SUBLAYER) { + tmp_vl = VIK_LAYER(vik_treeview_item_get_parent(vt, &iter)); + tmp_subtype = vik_treeview_item_get_data(vt, &iter); + tmp_type = VIK_TREEVIEW_TYPE_SUBLAYER; + } + } + else { + tmp_subtype = vik_treeview_item_get_data(vt, &iter); + tmp_type = VIK_TREEVIEW_TYPE_SUBLAYER; + } + + /* Go up the tree to find the Vik Layer */ + while ( type != VIK_TREEVIEW_TYPE_LAYER ) { + if ( ! vik_treeview_item_get_parent_iter ( vt, &iter, &parent ) ) + return; + iter = parent; + type = vik_treeview_item_get_type (vt, &iter ); + } + + vl = VIK_LAYER( vik_treeview_item_get_pointer ( vt, &iter ) ); + + vw = VIK_WINDOW(VIK_GTK_WINDOW_FROM_LAYER(vl)); + vik_window_selected_layer(vw, vl); + + if (tmp_vl == NULL) + tmp_vl = vl; + /* Apply settings now we have the all details */ + if ( vik_layer_selected ( tmp_vl, + tmp_subtype, + tmp_layer, + tmp_type, + vik_window_layers_panel(vw) ) ) { + /* Redraw required */ + vik_layers_panel_emit_update ( vik_window_layers_panel(vw) ); + } + +} + +static gboolean vik_treeview_selection_filter(GtkTreeSelection *selection, GtkTreeModel *model, GtkTreePath *path, gboolean path_currently_selected, gpointer data) +{ + VikTreeview *vt = data; + + if (vt->was_a_toggle) { + vt->was_a_toggle = FALSE; + return FALSE; + } + + return TRUE; +} + +void vik_treeview_init ( VikTreeview *vt ) +{ + vt->was_a_toggle = FALSE; + vt->editing = FALSE; + + // ATM The dates are stored on initial creation and updated when items are deleted + // this should be good enough for most purposes, although it may get inaccurate if items are edited in a particular manner + // NB implicit conversion of time_t to gint64 + vt->model = GTK_TREE_MODEL(gtk_tree_store_new ( NUM_COLUMNS, + G_TYPE_STRING, // Name + G_TYPE_BOOLEAN, // Visibility + GDK_TYPE_PIXBUF,// The Icon + G_TYPE_INT, // Layer Type + G_TYPE_POINTER, // pointer to TV parent + G_TYPE_POINTER, // pointer to the layer or sublayer + G_TYPE_INT, // type of the sublayer + G_TYPE_BOOLEAN, // Editable + G_TYPE_INT64 )); // Timestamp + + /* create tree view */ + gtk_tree_selection_set_select_function(gtk_tree_view_get_selection (GTK_TREE_VIEW(vt)), vik_treeview_selection_filter, vt, NULL); + + gtk_tree_view_set_model ( GTK_TREE_VIEW(vt), vt->model ); + vik_treeview_add_columns ( vt ); + + // Can not specify 'auto' sort order with a 'GtkTreeSortable' on the name since we want to control the ordering of layers + // Thus need to create special sort to operate on a subsection of treeview (i.e. from a specific child either a layer or sublayer) + // see vik_treeview_sort_children() + + g_object_unref (vt->model); + + gtk_tree_view_set_rules_hint (GTK_TREE_VIEW (vt), TRUE); + gtk_tree_selection_set_mode (gtk_tree_view_get_selection (GTK_TREE_VIEW (vt)), + GTK_SELECTION_SINGLE); + + /* Override treestore's dnd methods only; this is easier than deriving from GtkTreeStore. + * The downside is that all treestores will have this behavior, so this needs to be + * changed if we add more treeviews in the future. //Alex + */ + if (1) { + GtkTreeDragSourceIface *isrc; + GtkTreeDragDestIface *idest; + + isrc = g_type_interface_peek (g_type_class_peek(G_OBJECT_TYPE(vt->model)), GTK_TYPE_TREE_DRAG_SOURCE); + isrc->drag_data_delete = vik_treeview_drag_data_delete; + + idest = g_type_interface_peek (g_type_class_peek(G_OBJECT_TYPE(vt->model)), GTK_TYPE_TREE_DRAG_DEST); + idest->drag_data_received = vik_treeview_drag_data_received; + } + + VikLayerTypeEnum i; + for ( i = 0; i < VIK_LAYER_NUM_TYPES; i++ ) + vt->layer_type_icons[i] = vik_layer_load_icon ( i ); /* if icon can't be loaded, it will be null and simply not be shown. */ + + gtk_tree_view_set_reorderable (GTK_TREE_VIEW(vt), TRUE); + g_signal_connect(gtk_tree_view_get_selection (GTK_TREE_VIEW (vt)), "changed", + G_CALLBACK(select_cb), vt); + +} + +gboolean vik_treeview_item_get_parent_iter ( VikTreeview *vt, GtkTreeIter *iter, GtkTreeIter *parent ) +{ + return gtk_tree_model_iter_parent ( GTK_TREE_MODEL(vt->model), parent, iter ); +} + +gboolean vik_treeview_move_item ( VikTreeview *vt, GtkTreeIter *iter, gboolean up ) +{ + gint t = vik_treeview_item_get_type ( vt, iter ); + if ( t == VIK_TREEVIEW_TYPE_LAYER ) + { + GtkTreeIter switch_iter; + if (up) + { + /* iter to path to iter */ + GtkTreePath *path = gtk_tree_model_get_path ( vt->model, iter ); + if ( !gtk_tree_path_prev ( path ) || !gtk_tree_model_get_iter ( vt->model, &switch_iter, path ) ) + { + gtk_tree_path_free ( path ); + return FALSE; + } + gtk_tree_path_free ( path ); + } + else + { + switch_iter = *iter; + if ( !gtk_tree_model_iter_next ( vt->model, &switch_iter ) ) + return FALSE; + } + gtk_tree_store_swap ( GTK_TREE_STORE(vt->model), iter, &switch_iter ); + return TRUE; + /* now, the easy part. actually switching them, not the GUI */ + } /* if item is map */ + return FALSE; +} + +gboolean vik_treeview_get_iter_at_pos ( VikTreeview *vt, GtkTreeIter *iter, gint x, gint y ) +{ + GtkTreePath *path; + (void)gtk_tree_view_get_path_at_pos ( GTK_TREE_VIEW(vt), x, y, &path, NULL, NULL, NULL ); + if ( ! path ) + return FALSE; + + gtk_tree_model_get_iter (GTK_TREE_MODEL(vt->model), iter, path); + gtk_tree_path_free ( path ); + return TRUE; +} + +/* Option to ensure visible */ +void vik_treeview_select_iter ( VikTreeview *vt, GtkTreeIter *iter, gboolean view_all ) +{ + GtkTreeView *tree_view = GTK_TREE_VIEW ( vt ); + GtkTreePath *path; + + if ( view_all ) { + path = gtk_tree_model_get_path ( gtk_tree_view_get_model (tree_view), iter ); + gtk_tree_view_expand_to_path ( tree_view, path ); + } + + gtk_tree_selection_select_iter ( gtk_tree_view_get_selection ( tree_view ), iter ); + + if ( view_all ) { + gtk_tree_view_scroll_to_cell ( tree_view, + path, + gtk_tree_view_get_expander_column (tree_view), + FALSE, + 0.0, 0.0 ); + gtk_tree_path_free ( path ); + } +} + +gboolean vik_treeview_get_selected_iter ( VikTreeview *vt, GtkTreeIter *iter ) +{ + return gtk_tree_selection_get_selected ( gtk_tree_view_get_selection ( GTK_TREE_VIEW ( vt ) ), NULL, iter ); +} + +gboolean vik_treeview_get_editing ( VikTreeview *vt ) +{ + // Don't know how to get cell for the selected item + //return GPOINTER_TO_INT(g_object_get_data ( G_OBJECT(cell), "editing" )); + // Instead maintain our own value applying to the whole tree + return vt->editing; +} + +void vik_treeview_item_delete ( VikTreeview *vt, GtkTreeIter *iter ) +{ + gtk_tree_store_remove ( GTK_TREE_STORE(vt->model), iter ); +} + +/* Treeview Reform Project */ + +void vik_treeview_item_set_icon ( VikTreeview *vt, GtkTreeIter *iter, const GdkPixbuf *icon ) +{ + g_return_if_fail ( iter != NULL ); + gtk_tree_store_set ( GTK_TREE_STORE(vt->model), iter, ICON_COLUMN, icon, -1); +} + +void vik_treeview_item_set_name ( VikTreeview *vt, GtkTreeIter *iter, const gchar *to ) +{ + g_return_if_fail ( iter != NULL && to != NULL ); + gtk_tree_store_set ( GTK_TREE_STORE(vt->model), iter, NAME_COLUMN, to, -1); +} + +void vik_treeview_item_set_visible ( VikTreeview *vt, GtkTreeIter *iter, gboolean to ) +{ + g_return_if_fail ( iter != NULL ); + gtk_tree_store_set ( GTK_TREE_STORE(vt->model), iter, VISIBLE_COLUMN, to, -1 ); +} + +void vik_treeview_item_toggle_visible ( VikTreeview *vt, GtkTreeIter *iter ) +{ + g_return_if_fail ( iter != NULL ); + gboolean to; + TREEVIEW_GET ( vt->model, iter, VISIBLE_COLUMN, &to ); + to = !to; + gtk_tree_store_set ( GTK_TREE_STORE(vt->model), iter, VISIBLE_COLUMN, to, -1 ); +} + +void vik_treeview_expand ( VikTreeview *vt, GtkTreeIter *iter ) +{ + GtkTreePath *path; + path = gtk_tree_model_get_path ( vt->model, iter ); + gtk_tree_view_expand_row ( GTK_TREE_VIEW(vt), path, FALSE ); + gtk_tree_path_free ( path ); +} + +void vik_treeview_item_select ( VikTreeview *vt, GtkTreeIter *iter ) +{ + gtk_tree_selection_select_iter ( gtk_tree_view_get_selection ( GTK_TREE_VIEW ( vt ) ), iter ); +} + +void vik_treeview_item_unselect ( VikTreeview *vt, GtkTreeIter *iter ) +{ + gtk_tree_selection_unselect_iter ( gtk_tree_view_get_selection ( GTK_TREE_VIEW ( vt ) ), iter ); +} + +void vik_treeview_add_layer ( VikTreeview *vt, GtkTreeIter *parent_iter, GtkTreeIter *iter, const gchar *name, gpointer parent, gboolean above, + gpointer item, gint data, VikLayerTypeEnum layer_type, time_t timestamp ) +{ + g_assert ( iter != NULL ); + if ( above ) + gtk_tree_store_prepend ( GTK_TREE_STORE(vt->model), iter, parent_iter ); + else + gtk_tree_store_append ( GTK_TREE_STORE(vt->model), iter, parent_iter ); + gtk_tree_store_set ( GTK_TREE_STORE(vt->model), iter, + NAME_COLUMN, name, + VISIBLE_COLUMN, TRUE, + TYPE_COLUMN, VIK_TREEVIEW_TYPE_LAYER, + ITEM_PARENT_COLUMN, parent, + ITEM_POINTER_COLUMN, item, + ITEM_DATA_COLUMN, data, + EDITABLE_COLUMN, parent == NULL ? FALSE : TRUE, + ICON_COLUMN, layer_type >= 0 ? vt->layer_type_icons[layer_type] : NULL, + ITEM_TIMESTAMP_COLUMN, (gint64)timestamp, + -1 ); +} + +void vik_treeview_insert_layer ( VikTreeview *vt, GtkTreeIter *parent_iter, GtkTreeIter *iter, const gchar *name, gpointer parent, gboolean above, + gpointer item, gint data, VikLayerTypeEnum layer_type, GtkTreeIter *sibling, time_t timestamp ) +{ + g_assert ( iter != NULL ); + if (sibling) { + if (above) + gtk_tree_store_insert_before ( GTK_TREE_STORE(vt->model), iter, parent_iter, sibling ); + else + gtk_tree_store_insert_after ( GTK_TREE_STORE(vt->model), iter, parent_iter, sibling ); + } else { + if (above) + gtk_tree_store_append ( GTK_TREE_STORE(vt->model), iter, parent_iter ); + else + gtk_tree_store_prepend ( GTK_TREE_STORE(vt->model), iter, parent_iter ); + } + + gtk_tree_store_set ( GTK_TREE_STORE(vt->model), iter, + NAME_COLUMN, name, + VISIBLE_COLUMN, TRUE, + TYPE_COLUMN, VIK_TREEVIEW_TYPE_LAYER, + ITEM_PARENT_COLUMN, parent, + ITEM_POINTER_COLUMN, item, + ITEM_DATA_COLUMN, data, + EDITABLE_COLUMN, TRUE, + ICON_COLUMN, layer_type >= 0 ? vt->layer_type_icons[layer_type] : NULL, + ITEM_TIMESTAMP_COLUMN, (gint64)timestamp, + -1 ); +} + +void vik_treeview_add_sublayer ( VikTreeview *vt, GtkTreeIter *parent_iter, GtkTreeIter *iter, const gchar *name, gpointer parent, gpointer item, + gint data, GdkPixbuf *icon, gboolean editable, time_t timestamp ) +{ + g_assert ( iter != NULL ); + + gtk_tree_store_append ( GTK_TREE_STORE(vt->model), iter, parent_iter ); + gtk_tree_store_set ( GTK_TREE_STORE(vt->model), iter, + NAME_COLUMN, name, + VISIBLE_COLUMN, TRUE, + TYPE_COLUMN, VIK_TREEVIEW_TYPE_SUBLAYER, + ITEM_PARENT_COLUMN, parent, + ITEM_POINTER_COLUMN, item, + ITEM_DATA_COLUMN, data, + EDITABLE_COLUMN, editable, + ICON_COLUMN, icon, + ITEM_TIMESTAMP_COLUMN, (gint64)timestamp, + -1 ); +} + +// Inspired by the internals of GtkTreeView sorting itself +typedef struct _SortTuple +{ + gint offset; + gchar *name; + gint64 timestamp; +} SortTuple; + +/** + * + */ +static gint sort_tuple_compare ( gconstpointer a, gconstpointer b, gpointer order ) +{ + SortTuple *sa = (SortTuple *)a; + SortTuple *sb = (SortTuple *)b; + + gint answer = -1; + if ( GPOINTER_TO_INT(order) < VL_SO_DATE_ASCENDING ) { + // Alphabetical comparison + // Default ascending order + answer = g_strcmp0 ( sa->name, sb->name ); + // Invert sort order for descending order + if ( GPOINTER_TO_INT(order) == VL_SO_ALPHABETICAL_DESCENDING ) + answer = -answer; + } + else { + // Date comparison + gboolean ans = ( sa->timestamp > sb->timestamp ); + if ( ans ) + answer = 1; + // Invert sort order for descending order + if ( GPOINTER_TO_INT(order) == VL_SO_DATE_DESCENDING ) + answer = -answer; + } + return answer; +} + +/** + * Note: I don't believe we can sensibility use built in model sort gtk_tree_model_sort_new_with_model() on the name, + * since that would also sort the layers - but that needs to be user controlled for ordering, such as which maps get drawn on top. + * + * vik_treeview_sort_children: + * @vt: The treeview to operate on + * @parent: The level within the treeview to sort + * @order: How the items should be sorted + * + * Use the gtk_tree_store_reorder method as it very quick + * + * This ordering can be performed on demand and works for any parent iterator (i.e. both sublayer and layer levels) + * + * It should be called whenever an individual sublayer item is added or renamed (or after a group of sublayer items have been added). + * + * Previously with insertion sort on every sublayer addition: adding 10,000 items would take over 30 seconds! + * Now sorting after simply adding all tracks takes 1 second. + * For a KML file with over 10,000 tracks (3Mb zipped) - See 'UK Hampshire Rights of Way' + * http://www3.hants.gov.uk/row/row-maps.htm + */ +void vik_treeview_sort_children ( VikTreeview *vt, GtkTreeIter *parent, vik_layer_sort_order_t order ) +{ + if ( order == VL_SO_NONE ) + // Nothing to do + return; + + GtkTreeModel *model = vt->model; + GtkTreeIter child; + if ( !gtk_tree_model_iter_children ( model, &child, parent ) ) + return; + + guint length = gtk_tree_model_iter_n_children ( model, parent ); + + // Create an array to store the position offsets + SortTuple *sort_array; + sort_array = g_new ( SortTuple, length ); + + guint ii = 0; + do { + sort_array[ii].offset = ii; + gtk_tree_model_get ( model, &child, NAME_COLUMN, &(sort_array[ii].name), -1 ); + gtk_tree_model_get ( model, &child, ITEM_TIMESTAMP_COLUMN, &(sort_array[ii].timestamp), -1 ); + ii++; + } while ( gtk_tree_model_iter_next (model, &child) ); + + // Sort list... + g_qsort_with_data (sort_array, + length, + sizeof (SortTuple), + sort_tuple_compare, + GINT_TO_POINTER(order)); + + // As the sorted list contains the reordered position offsets, extract this and then apply to the treeview + gint *positions = g_malloc ( sizeof(gint) * length ); + for ( ii = 0; ii < length; ii++ ) { + positions[ii] = sort_array[ii].offset; + g_free ( sort_array[ii].name ); + } + g_free ( sort_array ); + + // This is extremely fast compared to the old alphabetical insertion + gtk_tree_store_reorder ( GTK_TREE_STORE(model), parent, positions ); + g_free ( positions ); +} + +static void vik_treeview_finalize ( GObject *gob ) +{ + VikTreeview *vt = VIK_TREEVIEW ( gob ); + VikLayerTypeEnum i; + for ( i = 0; i < VIK_LAYER_NUM_TYPES; i++ ) + if ( vt->layer_type_icons[i] != NULL ) + g_object_unref ( G_OBJECT(vt->layer_type_icons[i]) ); + + G_OBJECT_CLASS(parent_class)->finalize(gob); +} + +static gboolean vik_treeview_drag_data_received (GtkTreeDragDest *drag_dest, GtkTreePath *dest, GtkSelectionData *selection_data) +{ + GtkTreeModel *tree_model; + GtkTreeModel *src_model = NULL; + GtkTreePath *src_path = NULL, *dest_cp = NULL; + gboolean retval = FALSE; + GtkTreeIter src_iter, root_iter, dest_parent; + VikTreeview *vt; + VikLayer *vl; + + g_return_val_if_fail (GTK_IS_TREE_STORE (drag_dest), FALSE); + + tree_model = GTK_TREE_MODEL (drag_dest); + + if (gtk_tree_get_row_drag_data (selection_data, &src_model, &src_path) && src_model == tree_model) { + /* + * Copy src_path to dest. There are two subcases here, depending on what + * is being dragged. + * + * 1. src_path is a layer. In this case, interpret the drop + * as a request to move the layer to a different aggregate layer. + * If the destination is not an aggregate layer, use the first + * ancestor that is. + * + * 2. src_path is a sublayer. In this case, find ancestors of + * both source and destination nodes who are full layers, + * and call the move method of that layer type. + * + */ + if (!gtk_tree_model_get_iter (src_model, &src_iter, src_path)) { + goto out; + } + if (!gtk_tree_path_compare(src_path, dest)) { + goto out; + } + + dest_cp = gtk_tree_path_copy (dest); + + gtk_tree_model_get_iter_first(tree_model, &root_iter); + TREEVIEW_GET(tree_model, &root_iter, ITEM_POINTER_COLUMN, &vl); + vt = vl->vt; + + + if (gtk_tree_path_get_depth(dest_cp)>1) { /* can't be sibling of top layer */ + VikLayer *vl_src, *vl_dest; + + /* Find the first ancestor that is a full layer, and store in dest_parent. */ + do { + gtk_tree_path_up(dest_cp); + gtk_tree_model_get_iter (src_model, &dest_parent, dest_cp); + } while (gtk_tree_path_get_depth(dest_cp)>1 && + vik_treeview_item_get_type(vt, &dest_parent) != VIK_TREEVIEW_TYPE_LAYER); + + + vl_src = vik_treeview_item_get_parent(vt, &src_iter); + g_assert ( vl_src ); + vl_dest = vik_treeview_item_get_pointer(vt, &dest_parent); + + /* TODO: might want to allow different types, and let the clients handle how they want */ + if (vl_src->type == vl_dest->type && vik_layer_get_interface(vl_dest->type)->drag_drop_request) { + // g_print("moving an item from layer '%s' into layer '%s'\n", vl_src->name, vl_dest->name); + vik_layer_get_interface(vl_dest->type)->drag_drop_request(vl_src, vl_dest, &src_iter, dest); + } + } + } + + out: + if (dest_cp) + gtk_tree_path_free(dest_cp); + if (src_path) + gtk_tree_path_free (src_path); + + return retval; +} + +/* + * This may not be necessary. + */ +static gboolean vik_treeview_drag_data_delete ( GtkTreeDragSource *drag_source, GtkTreePath *path ) +{ + gchar *s_dest = gtk_tree_path_to_string(path); + g_print(_("delete data from %s\n"), s_dest); + g_free(s_dest); + return FALSE; +} diff --git a/src/viktreeview.h b/src/viktreeview.h new file mode 100644 index 0000000..5c50599 --- /dev/null +++ b/src/viktreeview.h @@ -0,0 +1,105 @@ +/* + * viking -- GPS Data and Topo Analyzer, Explorer, and Manager + * + * Copyright (C) 2003-2005, Evan Battaglia + * + * 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., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA + * + */ + +#ifndef _VIKING_TREEVIEW_H +#define _VIKING_TREEVIEW_H + +#include "config.h" +#include "uibuilder.h" + +#include +#include +#include + +G_BEGIN_DECLS + +#define VIK_TREEVIEW_TYPE (vik_treeview_get_type ()) +#define VIK_TREEVIEW(obj) (G_TYPE_CHECK_INSTANCE_CAST ((obj), VIK_TREEVIEW_TYPE, VikTreeview)) +#define VIK_TREEVIEW_CLASS(klass) (G_TYPE_CHECK_CLASS_CAST ((klass), VIK_TREEVIEW_TYPE, VikTreeviewClass)) +#define IS_VIK_TREEVIEW(obj) (G_TYPE_CHECK_INSTANCE_TYPE ((obj), VIK_TREEVIEW_TYPE)) +#define IS_VIK_TREEVIEW_CLASS(klass) (G_TYPE_CHECK_CLASS_TYPE ((klass), VIK_TREEVIEW_TYPE)) + +typedef struct _VikTreeview VikTreeview; +typedef struct _VikTreeviewClass VikTreeviewClass; + +struct _VikTreeviewClass +{ + GtkTreeViewClass vbox_class; + void (* item_edited) (VikTreeview *vt, GtkTreeIter *iter, const gchar *new_name); + void (* item_toggled) (VikTreeview *vt,GtkTreeIter *iter); +}; + +enum { + VIK_TREEVIEW_TYPE_LAYER = 0, + VIK_TREEVIEW_TYPE_SUBLAYER +}; + +GType vik_treeview_get_type (); + + +VikTreeview *vik_treeview_new (); + +GtkWidget *vik_treeview_get_widget ( VikTreeview *vt ); + +gint vik_treeview_item_get_data ( VikTreeview *vt, GtkTreeIter *iter ); +gint vik_treeview_item_get_type ( VikTreeview *vt, GtkTreeIter *iter ); +gchar *vik_treeview_item_get_name ( VikTreeview *vt, GtkTreeIter *iter ); +gpointer vik_treeview_item_get_pointer ( VikTreeview *vt, GtkTreeIter *iter ); +void vik_treeview_item_set_pointer ( VikTreeview *vt, GtkTreeIter *iter, gpointer pointer ); +void vik_treeview_item_set_timestamp ( VikTreeview *vt, GtkTreeIter *iter, time_t timestamp ); + +gpointer vik_treeview_item_get_parent ( VikTreeview *vt, GtkTreeIter *iter ); +gboolean vik_treeview_item_get_visible_tree ( VikTreeview *vt, GtkTreeIter *iter ); + +void vik_treeview_select_iter ( VikTreeview *vt, GtkTreeIter *iter, gboolean view_all ); +gboolean vik_treeview_get_selected_iter ( VikTreeview *vt, GtkTreeIter *iter ); +gboolean vik_treeview_get_editing ( VikTreeview *vt ); + +void vik_treeview_item_set_icon ( VikTreeview *vt, GtkTreeIter *iter, const GdkPixbuf *icon ); +void vik_treeview_item_set_name ( VikTreeview *vt, GtkTreeIter *iter, const gchar *to ); +void vik_treeview_item_set_visible ( VikTreeview *vt, GtkTreeIter *iter, gboolean to ); +void vik_treeview_item_toggle_visible ( VikTreeview *vt, GtkTreeIter *iter ); +void vik_treeview_item_delete ( VikTreeview *vt, GtkTreeIter *iter ); + +gboolean vik_treeview_get_iter_at_pos ( VikTreeview *vt, GtkTreeIter *iter, gint x, gint y ); + +gboolean vik_treeview_get_iter_from_path_str ( VikTreeview *vt, GtkTreeIter *iter, const gchar *path_str ); +gboolean vik_treeview_move_item ( VikTreeview *vt, GtkTreeIter *iter, gboolean up ); +void vik_treeview_item_select ( VikTreeview *vt, GtkTreeIter *iter ); +void vik_treeview_item_unselect ( VikTreeview *vt, GtkTreeIter *iter ); + +gboolean vik_treeview_item_get_parent_iter ( VikTreeview *vt, GtkTreeIter *iter, GtkTreeIter *parent ); +void vik_treeview_expand ( VikTreeview *vt, GtkTreeIter *iter ); + +void vik_treeview_add_layer ( VikTreeview *vt, GtkTreeIter *parent_iter, GtkTreeIter *iter, const gchar *name, gpointer parent, gboolean above, + gpointer item, gint data, VikLayerTypeEnum layer_type, time_t timestamp ); +void vik_treeview_insert_layer ( VikTreeview *vt, GtkTreeIter *parent_iter, GtkTreeIter *iter, const gchar *name, gpointer parent, gboolean above, + gpointer item, gint data, VikLayerTypeEnum layer_type, GtkTreeIter *sibling, time_t timestamp ); +void vik_treeview_add_sublayer ( VikTreeview *vt, GtkTreeIter *parent_iter, GtkTreeIter *iter, const gchar *name, gpointer parent, gpointer item, + gint data, GdkPixbuf *icon, gboolean editable, time_t timestamp ); + +gboolean vik_treeview_get_iter_with_name ( VikTreeview *vt, GtkTreeIter *iter, GtkTreeIter *parent_iter, const gchar *name ); + +void vik_treeview_sort_children ( VikTreeview *vt, GtkTreeIter *parent, vik_layer_sort_order_t order ); + +G_END_DECLS + +#endif diff --git a/src/viktrwlayer.c b/src/viktrwlayer.c new file mode 100644 index 0000000..7f38f47 --- /dev/null +++ b/src/viktrwlayer.c @@ -0,0 +1,11860 @@ +/* + * viking -- GPS Data and Topo Analyzer, Explorer, and Manager + * + * Copyright (C) 2003-2007, Evan Battaglia + * Copyright (C) 2005-2008, Alex Foobarian + * Copyright (C) 2007, Quy Tonthat + * Copyright (C) 2009, Hein Ragas + * Copyright (c) 2012-2015, Rob Norris + * Copyright (c) 2012-2013, Guilhem Bonnefille + * + * 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., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA + * + */ +/* WARNING: If you go beyond this point, we are NOT responsible for any ill effects on your sanity */ +/* viktrwlayer.c -- 8000+ lines can make a difference in the state of things */ + +#ifdef HAVE_CONFIG_H +#include "config.h" +#endif + +#include "viking.h" +#include "vikmapslayer.h" +#include "vikgpslayer.h" +#include "viktrwlayer_export.h" +#include "viktrwlayer_tpwin.h" +#include "viktrwlayer_wpwin.h" +#include "viktrwlayer_propwin.h" +#include "viktrwlayer_analysis.h" +#include "viktrwlayer_tracklist.h" +#include "viktrwlayer_waypointlist.h" +#ifdef VIK_CONFIG_GEOTAG +#include "viktrwlayer_geotag.h" +#include "geotag_exif.h" +#endif +#include "garminsymbols.h" +#include "thumbnails.h" +#include "background.h" +#include "gpx.h" +#include "geojson.h" +#include "babel.h" +#include "dem.h" +#include "dems.h" +#include "geonamessearch.h" +#ifdef VIK_CONFIG_OPENSTREETMAP +#include "osm-traces.h" +#endif +#include "acquire.h" +#include "datasources.h" +#include "datasource_gps.h" +#include "vikexttools.h" +#include "vikexttool_datasources.h" +#include "ui_util.h" +#include "vikrouting.h" + +#include "icons/icons.h" + +#ifdef HAVE_MATH_H +#include +#endif +#ifdef HAVE_STRING_H +#include +#endif +#ifdef HAVE_STDLIB_H +#include +#endif +#include +#include + +#include +#include +#include +#include + +#define VIK_TRW_LAYER_TRACK_GC 6 +#define VIK_TRW_LAYER_TRACK_GCS 10 +#define VIK_TRW_LAYER_TRACK_GC_BLACK 0 +#define VIK_TRW_LAYER_TRACK_GC_SLOW 1 +#define VIK_TRW_LAYER_TRACK_GC_AVER 2 +#define VIK_TRW_LAYER_TRACK_GC_FAST 3 +#define VIK_TRW_LAYER_TRACK_GC_STOP 4 +#define VIK_TRW_LAYER_TRACK_GC_SINGLE 5 + +#define DRAWMODE_BY_TRACK 0 +#define DRAWMODE_BY_SPEED 1 +#define DRAWMODE_ALL_SAME_COLOR 2 +// Note using DRAWMODE_BY_SPEED may be slow especially for vast numbers of trackpoints +// as we are (re)calculating the colour for every point + +#define POINTS 1 +#define LINES 2 + +/* this is how it knows when you click if you are clicking close to a trackpoint. */ +#define TRACKPOINT_SIZE_APPROX 5 +#define WAYPOINT_SIZE_APPROX 5 + +#define MIN_STOP_LENGTH 15 +#define MAX_STOP_LENGTH 86400 +#define DRAW_ELEVATION_FACTOR 30 /* height of elevation plotting, sort of relative to zoom level ("mpp" that isn't mpp necessarily) */ + /* this is multiplied by user-inputted value from 1-100. */ + +enum { WP_SYMBOL_FILLED_SQUARE, WP_SYMBOL_SQUARE, WP_SYMBOL_CIRCLE, WP_SYMBOL_X, WP_NUM_SYMBOLS }; + +// See http://developer.gnome.org/pango/stable/PangoMarkupFormat.html +typedef enum { + FS_XX_SMALL = 0, // 'xx-small' + FS_X_SMALL, + FS_SMALL, + FS_MEDIUM, // DEFAULT + FS_LARGE, + FS_X_LARGE, + FS_XX_LARGE, + FS_NUM_SIZES +} font_size_t; + +typedef enum { + VIK_TRW_LAYER_INTERNAL = 0, + VIK_TRW_LAYER_EXTERNAL, + VIK_TRW_LAYER_EXTERNAL_NO_WRITE, + VIK_EXTERNAL_TYPE_LAST +} trw_external_type_t; + +struct _VikTrwLayer { + VikLayer vl; + GHashTable *tracks; + GHashTable *tracks_iters; + GHashTable *routes; + GHashTable *routes_iters; + GHashTable *waypoints_iters; + GHashTable *waypoints; + GtkTreeIter tracks_iter, routes_iter, waypoints_iter; + gboolean tracks_visible, routes_visible, waypoints_visible; + LatLonBBox waypoints_bbox; + + gboolean track_draw_labels; + guint8 drawmode; + guint8 drawpoints; + guint8 drawpoints_size; + guint8 drawelevation; + guint8 elevation_factor; + guint8 drawstops; + guint32 stop_length; + guint8 drawlines; + guint8 drawdirections; + guint8 drawdirections_size; + guint8 line_thickness; + guint8 bg_line_thickness; + vik_layer_sort_order_t track_sort_order; + + // Metadata + VikTRWMetadata *metadata; + + PangoLayout *tracklabellayout; + font_size_t track_font_size; + gchar *track_fsize_str; + + guint8 wp_symbol; + guint8 wp_size; + gboolean wp_draw_symbols; + font_size_t wp_font_size; + gchar *wp_fsize_str; + vik_layer_sort_order_t wp_sort_order; + + gdouble track_draw_speed_factor; + GArray *track_gc; + GdkGC *track_1color_gc; + GdkColor track_color; + GdkGC *current_track_gc; + // Separate GC for a track's potential new point as drawn via separate method + // (compared to the actual track points drawn in the main trw_layer_draw_track function) + GdkGC *current_track_newpoint_gc; + GdkGC *track_bg_gc; GdkColor track_bg_color; + GdkGC *waypoint_gc; GdkColor waypoint_color; + GdkGC *waypoint_text_gc; GdkColor waypoint_text_color; + GdkGC *waypoint_bg_gc; GdkColor waypoint_bg_color; + gboolean wpbgand; + VikTrack *current_track; // ATM shared between new tracks and new routes + guint16 ct_x1, ct_y1, ct_x2, ct_y2; + gboolean draw_sync_done; + gboolean draw_sync_do; + GdkCursor *crosshair_cursor; + + VikCoordMode coord_mode; + + /* wp editing tool */ + VikWaypoint *current_wp; + gpointer current_wp_id; + gboolean moving_wp; + gboolean waypoint_rightclick; + + /* track editing tool */ + GList *current_tpl; + VikTrack *current_tp_track; + gpointer current_tp_id; + VikTrwLayerTpwin *tpwin; + + /* track editing tool -- more specifically, moving tps */ + gboolean moving_tp; + + /* route finder tool */ + gboolean route_finder_check_added_track; + VikTrack *route_finder_added_track; + gboolean route_finder_append; + + gboolean drawlabels; + gboolean drawimages; + guint8 image_alpha; + GHashTable *image_cache; + guint8 image_size; + guint16 image_cache_size; + + /* for waypoint text */ + PangoLayout *wplabellayout; + + gboolean has_verified_thumbnails; + + GtkMenu *wp_right_click_menu; + GtkMenu *track_right_click_menu; + + /* menu */ + VikStdLayerMenuItem menu_selection; + + gint highest_wp_number; + + // One per layer + GtkWidget *tracks_analysis_dialog; + + trw_external_type_t external_layer; + gchar *external_file; + gboolean external_loaded; + gchar *external_dirpath; +}; + +struct DrawingParams { + VikViewport *vp; + VikTrwLayer *vtl; + VikWindow *vw; + gdouble xmpp, ympp; + guint16 width, height; + gdouble cc; // Cosine factor in track directions + gdouble ss; // Sine factor in track directions + const VikCoord *center; + gboolean one_zone, lat_lon; + gdouble ce1, ce2, cn1, cn2; + LatLonBBox bbox; + gboolean highlight; +}; + +static gboolean trw_layer_delete_waypoint ( VikTrwLayer *vtl, VikWaypoint *wp ); + +typedef enum { + MA_VTL = 0, + MA_VLP, + MA_SUBTYPE, // OR END for Layer only + MA_SUBLAYER_ID, + MA_CONFIRM, + MA_VVP, + MA_TV_ITER, + MA_MISC, + MA_LAST, +} menu_array_index; + +typedef gpointer menu_array_layer[2]; +typedef gpointer menu_array_sublayer[MA_LAST]; + +static void trw_layer_delete_item ( menu_array_sublayer values ); +static void trw_layer_copy_item_cb ( menu_array_sublayer values ); +static void trw_layer_cut_item_cb ( menu_array_sublayer values ); + +static void trw_layer_find_maxmin_tracks ( const gpointer id, const VikTrack *trk, struct LatLon maxmin[2] ); +static void trw_layer_find_maxmin (VikTrwLayer *vtl, struct LatLon maxmin[2]); + +static void trw_layer_edit_track_gcs ( VikTrwLayer *vtl, VikViewport *vp ); +static void trw_layer_free_track_gcs ( VikTrwLayer *vtl ); + +static void trw_layer_draw_track_cb ( const gpointer id, VikTrack *track, struct DrawingParams *dp ); +static void trw_layer_draw_waypoint ( const gpointer id, VikWaypoint *wp, struct DrawingParams *dp ); + +static void goto_coord ( gpointer *vlp, gpointer vvp, gpointer vl, const VikCoord *coord ); +static void trw_layer_goto_track_startpoint ( menu_array_sublayer values ); +static void trw_layer_goto_track_endpoint ( menu_array_sublayer values ); +static void trw_layer_goto_track_max_speed ( menu_array_sublayer values ); +static void trw_layer_goto_track_max_alt ( menu_array_sublayer values ); +static void trw_layer_goto_track_min_alt ( menu_array_sublayer values ); +static void trw_layer_goto_track_center ( menu_array_sublayer values ); +static void trw_layer_goto_track_date ( menu_array_sublayer values ); +static void trw_layer_merge_by_segment ( menu_array_sublayer values ); +static void trw_layer_merge_by_timestamp ( menu_array_sublayer values ); +static void trw_layer_merge_with_other ( menu_array_sublayer values ); +static void trw_layer_append_track ( menu_array_sublayer values ); +static void trw_layer_split_by_timestamp ( menu_array_sublayer values ); +static void trw_layer_split_by_n_points ( menu_array_sublayer values ); +static void trw_layer_split_at_trackpoint ( menu_array_sublayer values ); +static void trw_layer_split_segments ( menu_array_sublayer values ); +static void trw_layer_delete_point_selected ( menu_array_sublayer values ); +static void trw_layer_delete_points_same_position ( menu_array_sublayer values ); +static void trw_layer_delete_points_same_time ( menu_array_sublayer values ); +static void trw_layer_reverse ( menu_array_sublayer values ); +static void trw_layer_download_map_along_track_cb ( menu_array_sublayer values ); +static void trw_layer_edit_trackpoint ( menu_array_sublayer values ); +static void trw_layer_show_picture ( menu_array_sublayer values ); +static void trw_layer_gps_upload_any ( menu_array_sublayer values ); + +static void trw_layer_centerize ( menu_array_layer values ); +static void trw_layer_auto_view ( menu_array_layer values ); +static void trw_layer_goto_wp ( menu_array_layer values ); +static void trw_layer_new_wp ( menu_array_layer values ); +static void trw_layer_edit_track ( menu_array_layer values ); +static void trw_layer_edit_route ( menu_array_layer values ); +static void trw_layer_finish_track ( menu_array_layer values ); +static void trw_layer_auto_waypoints_view ( menu_array_layer values ); +static void trw_layer_auto_tracks_view ( menu_array_layer values ); +static void trw_layer_delete_all_tracks ( menu_array_layer values ); +static void trw_layer_delete_tracks_from_selection ( menu_array_layer values ); +static void trw_layer_delete_all_waypoints ( menu_array_layer values ); +static void trw_layer_delete_waypoints_from_selection ( menu_array_layer values ); +static void trw_layer_delete_duplicate_waypoints ( menu_array_layer values ); +static void trw_layer_new_wikipedia_wp_viewport ( menu_array_layer values ); +static void trw_layer_new_wikipedia_wp_layer ( menu_array_layer values ); +#ifdef VIK_CONFIG_GEOTAG +static void trw_layer_geotagging_waypoint_mtime_keep ( menu_array_sublayer values ); +static void trw_layer_geotagging_waypoint_mtime_update ( menu_array_sublayer values ); +static void trw_layer_geotagging_track ( menu_array_sublayer values ); +static void trw_layer_geotagging ( menu_array_layer values ); +#endif +static void trw_layer_acquire_gps_cb ( menu_array_layer values ); +static void trw_layer_acquire_routing_cb ( menu_array_layer values ); +static void trw_layer_acquire_url_cb ( menu_array_layer values ); +#ifdef VIK_CONFIG_OPENSTREETMAP +static void trw_layer_acquire_osm_cb ( menu_array_layer values ); +static void trw_layer_acquire_osm_my_traces_cb ( menu_array_layer values ); +#endif +#ifdef VIK_CONFIG_GEOCACHES +static void trw_layer_acquire_geocache_cb ( menu_array_layer values ); +#endif +#ifdef VIK_CONFIG_GEOTAG +static void trw_layer_acquire_geotagged_cb ( menu_array_layer values ); +#endif +static void trw_layer_acquire_file_cb ( menu_array_layer values ); +static void trw_layer_gps_upload ( menu_array_layer values ); + +static void trw_layer_track_list_dialog_single ( menu_array_sublayer values ); +static void trw_layer_track_list_dialog ( menu_array_layer values ); +static void trw_layer_waypoint_list_dialog ( menu_array_layer values ); + +// Specific route versions: +// Most track handling functions can handle operating on the route list +// However these ones are easier in separate functions +static void trw_layer_auto_routes_view ( menu_array_layer values ); +static void trw_layer_delete_all_routes ( menu_array_layer values ); +static void trw_layer_delete_routes_from_selection ( menu_array_layer values ); + +/* pop-up items */ +static void trw_layer_properties_item ( gpointer pass_along[7] ); //TODO?? +static void trw_layer_goto_waypoint ( menu_array_sublayer values ); +static void trw_layer_waypoint_gc_webpage ( menu_array_sublayer values ); +static void trw_layer_waypoint_webpage ( menu_array_sublayer values ); + +static void trw_layer_realize_waypoint ( gpointer id, VikWaypoint *wp, gpointer pass_along[5] ); +static void trw_layer_realize_track ( gpointer id, VikTrack *track, gpointer pass_along[5] ); + +static void trw_layer_insert_tp_beside_current_tp ( VikTrwLayer *vtl, gboolean ); +static void trw_layer_cancel_current_tp ( VikTrwLayer *vtl, gboolean destroy ); +static void trw_layer_tpwin_response ( VikTrwLayer *vtl, gint response ); +static void trw_layer_tpwin_init ( VikTrwLayer *vtl ); + +static void trw_layer_sort_all ( VikTrwLayer *vtl ); + +static gpointer tool_edit_trackpoint_create ( VikWindow *vw, VikViewport *vvp); +static void tool_edit_trackpoint_destroy ( tool_ed_t *t ); +static gboolean tool_edit_trackpoint_click ( VikTrwLayer *vtl, GdkEventButton *event, gpointer data ); +static gboolean tool_edit_trackpoint_move ( VikTrwLayer *vtl, GdkEventMotion *event, gpointer data ); +static gboolean tool_edit_trackpoint_release ( VikTrwLayer *vtl, GdkEventButton *event, gpointer data ); +static gpointer tool_show_picture_create ( VikWindow *vw, VikViewport *vvp); +static gboolean tool_show_picture_click ( VikTrwLayer *vtl, GdkEventButton *event, VikViewport *vvp ); +static gpointer tool_edit_waypoint_create ( VikWindow *vw, VikViewport *vvp); +static void tool_edit_waypoint_destroy ( tool_ed_t *t ); +static gboolean tool_edit_waypoint_click ( VikTrwLayer *vtl, GdkEventButton *event, gpointer data ); +static gboolean tool_edit_waypoint_move ( VikTrwLayer *vtl, GdkEventMotion *event, gpointer data ); +static gboolean tool_edit_waypoint_release ( VikTrwLayer *vtl, GdkEventButton *event, gpointer data ); +static gpointer tool_edit_route_create ( VikWindow *vw, VikViewport *vvp); +static gboolean tool_edit_route_click ( VikTrwLayer *vtl, GdkEventButton *event, VikViewport *vvp ); +static gpointer tool_edit_track_create ( VikWindow *vw, VikViewport *vvp); +static gboolean tool_edit_track_click ( VikTrwLayer *vtl, GdkEventButton *event, VikViewport *vvp ); +static VikLayerToolFuncStatus tool_edit_track_move ( VikTrwLayer *vtl, GdkEventMotion *event, VikViewport *vvp ); +static void tool_edit_track_release ( VikTrwLayer *vtl, GdkEventButton *event, VikViewport *vvp ); +static gboolean tool_edit_track_key_press ( VikTrwLayer *vtl, GdkEventKey *event, VikViewport *vvp ); +static gboolean tool_edit_track_key_release ( VikTrwLayer *vtl, GdkEventKey *event, VikViewport *vvp ); +static gpointer tool_new_waypoint_create ( VikWindow *vw, VikViewport *vvp); +static gboolean tool_new_waypoint_click ( VikTrwLayer *vtl, GdkEventButton *event, VikViewport *vvp ); +static gpointer tool_extended_route_finder_create ( VikWindow *vw, VikViewport *vvp); +static gboolean tool_extended_route_finder_click ( VikTrwLayer *vtl, GdkEventButton *event, VikViewport *vvp ); +static gboolean tool_extended_route_finder_key_press ( VikTrwLayer *vtl, GdkEventKey *event, VikViewport *vvp ); +static gpointer tool_splitter_create ( VikWindow *vw, VikViewport *vvp); +static gboolean tool_splitter_click ( VikTrwLayer *vtl, GdkEventButton *event, VikViewport *vvp ); + +static VikTrackpoint *closest_tp_in_five_pixel_interval ( VikTrwLayer *vtl, VikViewport *vvp, gint x, gint y ); +static VikWaypoint *closest_wp_in_five_pixel_interval ( VikTrwLayer *vtl, VikViewport *vvp, gint x, gint y ); + +static void waypoint_convert ( const gpointer id, VikWaypoint *wp, VikCoordMode *dest_mode ); +static void track_convert ( const gpointer id, VikTrack *tr, VikCoordMode *dest_mode ); + +static gchar *highest_wp_number_get(VikTrwLayer *vtl); +static void highest_wp_number_reset(VikTrwLayer *vtl); +static void highest_wp_number_add_wp(VikTrwLayer *vtl, const gchar *new_wp_name); +static void highest_wp_number_remove_wp(VikTrwLayer *vtl, const gchar *old_wp_name); + +// Note for the following tool GtkRadioActionEntry texts: +// the very first text value is an internal name not displayed anywhere +// the first N_ text value is the name used for menu entries - hence has an underscore for the keyboard accelerator +// * remember not to clash with the values used for VikWindow level tools (Pan, Zoom, Ruler + Select) +// the second N_ text value is used for the button tooltip (i.e. generally don't want an underscore here) +// the value is always set to 0 and the tool loader in VikWindow will set the actual appropriate value used +static VikToolInterface trw_layer_tools[] = { + { &addwp_18_pixbuf, + { "CreateWaypoint", "vik-icon-Create Waypoint", N_("Create _Waypoint"), "W", N_("Create Waypoint"), 0 }, + (VikToolConstructorFunc) tool_new_waypoint_create, NULL, NULL, NULL, + (VikToolMouseFunc) tool_new_waypoint_click, NULL, NULL, + (VikToolKeyFunc) NULL, + (VikToolKeyFunc) NULL, + FALSE, + GDK_CURSOR_IS_PIXMAP, &cursor_addwp_pixbuf, NULL }, + + // CreateTrack instead of EditTrack for backwards compatibility + { &addtr_18_pixbuf, + { "CreateTrack", "vik-icon-Edit Track", N_("Edit _Track"), "T", N_("Edit Track"), 0 }, + (VikToolConstructorFunc) tool_edit_track_create, NULL, NULL, NULL, + (VikToolMouseFunc) tool_edit_track_click, + (VikToolMouseMoveFunc) tool_edit_track_move, + (VikToolMouseFunc) tool_edit_track_release, + (VikToolKeyFunc) tool_edit_track_key_press, + (VikToolKeyFunc) tool_edit_track_key_release, + TRUE, // Still need to handle clicks when in PAN mode to disable the potential trackpoint drawing + GDK_CURSOR_IS_PIXMAP, &cursor_addtr_pixbuf, NULL }, + + // CreateRoute instead of EditRoute for backwards compatibility + { &vik_new_route_18_pixbuf, + { "CreateRoute", "vik-icon-Edit Route", N_("Edit _Route"), "B", N_("Edit Route"), 0 }, + (VikToolConstructorFunc) tool_edit_route_create, NULL, NULL, NULL, + (VikToolMouseFunc) tool_edit_route_click, + (VikToolMouseMoveFunc) tool_edit_track_move, // -\# + (VikToolMouseFunc) tool_edit_track_release, // -> Reuse these track methods on a route + (VikToolKeyFunc) tool_edit_track_key_press, // -/# + (VikToolKeyFunc) tool_edit_track_key_release, + TRUE, // Still need to handle clicks when in PAN mode to disable the potential trackpoint drawing + GDK_CURSOR_IS_PIXMAP, &cursor_new_route_pixbuf, NULL }, + + { &route_finder_18_pixbuf, + { "ExtendedRouteFinder", "vik-icon-Route Finder", N_("Route _Finder"), "F", N_("Route Finder"), 0 }, + (VikToolConstructorFunc) tool_extended_route_finder_create, NULL, NULL, NULL, + (VikToolMouseFunc) tool_extended_route_finder_click, + (VikToolMouseMoveFunc) tool_edit_track_move, // -\# + (VikToolMouseFunc) tool_edit_track_release, // -> Reuse these track methods on a route + (VikToolKeyFunc) tool_extended_route_finder_key_press, + (VikToolKeyFunc) tool_edit_track_key_release, + TRUE, // Still need to handle clicks when in PAN mode to disable the potential trackpoint drawing + GDK_CURSOR_IS_PIXMAP, &cursor_route_finder_pixbuf, NULL }, + + { &splitter_18_pixbuf, + { "Splitter", "vik-icon-Splitter", N_("Splitter"), "L", N_("Splitter"), 0 }, + (VikToolConstructorFunc) tool_splitter_create, NULL, NULL, NULL, + (VikToolMouseFunc) tool_splitter_click, + (VikToolMouseMoveFunc) NULL, + (VikToolMouseFunc) NULL, + (VikToolKeyFunc) NULL, + (VikToolKeyFunc) NULL, + TRUE, // Still need to handle clicks when in PAN mode to disable the potential trackpoint drawing + GDK_CURSOR_IS_PIXMAP, &cursor_splitter_pixbuf, NULL }, + + { &edwp_18_pixbuf, + { "EditWaypoint", "vik-icon-Edit Waypoint", N_("_Edit Waypoint"), "E", N_("Edit Waypoint"), 0 }, + (VikToolConstructorFunc) tool_edit_waypoint_create, + (VikToolDestructorFunc) tool_edit_waypoint_destroy, + NULL, NULL, + (VikToolMouseFunc) tool_edit_waypoint_click, + (VikToolMouseMoveFunc) tool_edit_waypoint_move, + (VikToolMouseFunc) tool_edit_waypoint_release, + (VikToolKeyFunc) NULL, + (VikToolKeyFunc) NULL, + FALSE, + GDK_CURSOR_IS_PIXMAP, &cursor_edwp_pixbuf, NULL }, + + { &edtr_18_pixbuf, + { "EditTrackpoint", "vik-icon-Edit Trackpoint", N_("Edit Trac_kpoint"), "K", N_("Edit Trackpoint"), 0 }, + (VikToolConstructorFunc) tool_edit_trackpoint_create, + (VikToolDestructorFunc) tool_edit_trackpoint_destroy, + NULL, NULL, + (VikToolMouseFunc) tool_edit_trackpoint_click, + (VikToolMouseMoveFunc) tool_edit_trackpoint_move, + (VikToolMouseFunc) tool_edit_trackpoint_release, + (VikToolKeyFunc) NULL, + (VikToolKeyFunc) NULL, + FALSE, + GDK_CURSOR_IS_PIXMAP, &cursor_edtr_pixbuf, NULL }, + + { NULL, // a pixbuf for this one is already made globally available + { "ShowPicture", VIK_ICON_SHOW_PICTURE, N_("Show P_icture"), "I", N_("Show Picture"), 0 }, + (VikToolConstructorFunc) tool_show_picture_create, NULL, NULL, NULL, + (VikToolMouseFunc) tool_show_picture_click, NULL, NULL, + (VikToolKeyFunc) NULL, + (VikToolKeyFunc) NULL, + FALSE, + GDK_CURSOR_IS_PIXMAP, &cursor_showpic_pixbuf, NULL }, + +}; + +enum { + TOOL_CREATE_WAYPOINT=0, + TOOL_CREATE_TRACK, + TOOL_CREATE_ROUTE, + TOOL_ROUTE_FINDER, + TOOL_EDIT_WAYPOINT, + TOOL_EDIT_TRACKPOINT, + TOOL_SHOW_PICTURE, + NUM_TOOLS +}; + +/****** PARAMETERS ******/ + +static gchar *params_groups[] = { N_("Waypoints"), N_("Tracks"), N_("Waypoint Images"), N_("Tracks Advanced"), N_("Metadata"), N_("Filesystem") }; +enum { GROUP_WAYPOINTS, GROUP_TRACKS, GROUP_IMAGES, GROUP_TRACKS_ADV, GROUP_METADATA, GROUP_FILESYSTEM }; + +static gchar *params_drawmodes[] = { N_("Draw by Track"), N_("Draw by Speed"), N_("All Tracks Same Color"), NULL }; +static gchar *params_wpsymbols[] = { N_("Filled Square"), N_("Square"), N_("Circle"), N_("X"), 0 }; + +#define MIN_POINT_SIZE 2 +#define MAX_POINT_SIZE 10 + +#define MIN_ARROW_SIZE 3 +#define MAX_ARROW_SIZE 20 + +static VikLayerParamScale params_scales[] = { + /* min max step digits */ + { 1, 10, 1, 0 }, /* line_thickness */ + { 0, 100, 1, 0 }, /* track draw speed factor */ + { 1.0, 100.0, 1.0, 2 }, /* UNUSED */ + /* 5 * step == how much to turn */ + { 16, 128, 4, 0 }, // 3: image_size - NB step size ignored when an HSCALE used + { 0, 255, 5, 0 }, // 4: image alpha - " " " " + { 5, 500, 5, 0 }, // 5: image cache_size - " " + { 0, 8, 1, 0 }, // 6: Background line thickness + { 1, 64, 1, 0 }, /* wpsize */ + { MIN_STOP_LENGTH, MAX_STOP_LENGTH, 1, 0 }, /* stop_length */ + { 1, 100, 1, 0 }, // 9: elevation factor + { MIN_POINT_SIZE, MAX_POINT_SIZE, 1, 0 }, // 10: track point size + { MIN_ARROW_SIZE, MAX_ARROW_SIZE, 1, 0 }, // 11: direction arrow size +}; + +static gchar* params_font_sizes[] = { + N_("Extra Extra Small"), + N_("Extra Small"), + N_("Small"), + N_("Medium"), + N_("Large"), + N_("Extra Large"), + N_("Extra Extra Large"), + NULL }; + +// Needs to align with vik_layer_sort_order_t +static gchar* params_sort_order[] = { + N_("None"), + N_("Name Ascending"), + N_("Name Descending"), + N_("Date Ascending"), + N_("Date Descending"), + NULL +}; + +// Needs to align with trw_external_type_t +static gchar* params_external_type[] = { + N_("No"), + N_("Yes"), + N_("No write"), + NULL +}; + +static VikLayerParamData black_color_default ( void ) { + VikLayerParamData data; gdk_color_parse ( "#000000", &data.c ); return data; // Black +} +static VikLayerParamData drawmode_default ( void ) { return VIK_LPD_UINT ( DRAWMODE_BY_TRACK ); } +static VikLayerParamData line_thickness_default ( void ) { return VIK_LPD_UINT ( 1 * vik_viewport_get_scale(NULL) ); } +static VikLayerParamData trkpointsize_default ( void ) { return VIK_LPD_UINT ( MIN_POINT_SIZE * vik_viewport_get_scale (NULL) ); } +static VikLayerParamData trkdirectionsize_default ( void ) { return VIK_LPD_UINT ( 5 * vik_viewport_get_scale(NULL) ); } +static VikLayerParamData bg_line_thickness_default ( void ) { return VIK_LPD_UINT ( 0 ); } +static VikLayerParamData trackbgcolor_default ( void ) { + VikLayerParamData data; gdk_color_parse ( "#FFFFFF", &data.c ); return data; // White +} +static VikLayerParamData elevation_factor_default ( void ) { return VIK_LPD_UINT ( 30 ); } +static VikLayerParamData stop_length_default ( void ) { return VIK_LPD_UINT ( 60 ); } +static VikLayerParamData speed_factor_default ( void ) { return VIK_LPD_DOUBLE ( 30.0 ); } + +static VikLayerParamData tnfontsize_default ( void ) +{ + if ( vik_viewport_get_scale(NULL) < 2 ) + return VIK_LPD_UINT ( FS_MEDIUM ); + else + return VIK_LPD_UINT ( FS_LARGE ); +} + +static VikLayerParamData wpfontsize_default ( void ) +{ + if ( vik_viewport_get_scale(NULL) < 2 ) + return VIK_LPD_UINT ( FS_MEDIUM ); + else + return VIK_LPD_UINT ( FS_LARGE ); +} + +static VikLayerParamData wptextcolor_default ( void ) { + VikLayerParamData data; gdk_color_parse ( "#FFFFFF", &data.c ); return data; // White +} +static VikLayerParamData wpbgcolor_default ( void ) { + VikLayerParamData data; gdk_color_parse ( "#8383C4", &data.c ); return data; // Kind of Blue +} +static VikLayerParamData wpsize_default ( void ) { return VIK_LPD_UINT ( 4 * vik_viewport_get_scale(NULL) ); +} +static VikLayerParamData wpsymbol_default ( void ) { return VIK_LPD_UINT ( WP_SYMBOL_FILLED_SQUARE ); } + +static VikLayerParamData image_size_default ( void ) { return VIK_LPD_UINT ( 64 * vik_viewport_get_scale(NULL) ); } +static VikLayerParamData image_alpha_default ( void ) { return VIK_LPD_UINT ( 255 * vik_viewport_get_scale(NULL) ); } +static VikLayerParamData image_cache_size_default ( void ) { return VIK_LPD_UINT ( 300 ); } + +static VikLayerParamData sort_order_default ( void ) { return VIK_LPD_UINT ( 0 ); } + +static VikLayerParamData string_default ( void ) +{ + VikLayerParamData data; + data.s = ""; + return data; +} + +static VikLayerParamData external_layer_default ( void ) { return VIK_LPD_UINT ( VIK_TRW_LAYER_INTERNAL ); } + +VikLayerParam trw_layer_params[] = { + { VIK_LAYER_TRW, "tracks_visible", VIK_LAYER_PARAM_BOOLEAN, VIK_LAYER_NOT_IN_PROPERTIES, NULL, 0, NULL, NULL, NULL, vik_lpd_true_default, NULL, NULL }, + { VIK_LAYER_TRW, "waypoints_visible", VIK_LAYER_PARAM_BOOLEAN, VIK_LAYER_NOT_IN_PROPERTIES, NULL, 0, NULL, NULL, NULL, vik_lpd_true_default, NULL, NULL }, + { VIK_LAYER_TRW, "routes_visible", VIK_LAYER_PARAM_BOOLEAN, VIK_LAYER_NOT_IN_PROPERTIES, NULL, 0, NULL, NULL, NULL, vik_lpd_true_default, NULL, NULL }, + + { VIK_LAYER_TRW, "trackdrawlabels", VIK_LAYER_PARAM_BOOLEAN, GROUP_TRACKS, N_("Draw Labels"), VIK_LAYER_WIDGET_CHECKBUTTON, NULL, NULL, + N_("Note: the individual track controls what labels may be displayed"), vik_lpd_true_default, NULL, NULL }, + { VIK_LAYER_TRW, "trackfontsize", VIK_LAYER_PARAM_UINT, GROUP_TRACKS_ADV, N_("Track Labels Font Size:"), VIK_LAYER_WIDGET_COMBOBOX, params_font_sizes, NULL, NULL, tnfontsize_default, NULL, NULL }, + { VIK_LAYER_TRW, "drawmode", VIK_LAYER_PARAM_UINT, GROUP_TRACKS, N_("Track Drawing Mode:"), VIK_LAYER_WIDGET_COMBOBOX, params_drawmodes, NULL, NULL, drawmode_default, NULL, NULL }, + { VIK_LAYER_TRW, "trackcolor", VIK_LAYER_PARAM_COLOR, GROUP_TRACKS, N_("All Tracks Color:"), VIK_LAYER_WIDGET_COLOR, NULL, NULL, + N_("The color used when 'All Tracks Same Color' drawing mode is selected"), black_color_default, NULL, NULL }, + { VIK_LAYER_TRW, "drawlines", VIK_LAYER_PARAM_BOOLEAN, GROUP_TRACKS, N_("Draw Track Lines"), VIK_LAYER_WIDGET_CHECKBUTTON, NULL, NULL, NULL, vik_lpd_true_default, NULL, NULL }, + { VIK_LAYER_TRW, "line_thickness", VIK_LAYER_PARAM_UINT, GROUP_TRACKS_ADV, N_("Track Thickness:"), VIK_LAYER_WIDGET_SPINBUTTON, ¶ms_scales[0], NULL, NULL, line_thickness_default, NULL, NULL }, + { VIK_LAYER_TRW, "drawdirections", VIK_LAYER_PARAM_BOOLEAN, GROUP_TRACKS, N_("Draw Track Direction"), VIK_LAYER_WIDGET_CHECKBUTTON, NULL, NULL, NULL, vik_lpd_false_default, NULL, NULL }, + { VIK_LAYER_TRW, "trkdirectionsize", VIK_LAYER_PARAM_UINT, GROUP_TRACKS_ADV, N_("Direction Size:"), VIK_LAYER_WIDGET_SPINBUTTON, ¶ms_scales[11], NULL, NULL, trkdirectionsize_default, NULL, NULL }, + { VIK_LAYER_TRW, "drawpoints", VIK_LAYER_PARAM_BOOLEAN, GROUP_TRACKS, N_("Draw Trackpoints"), VIK_LAYER_WIDGET_CHECKBUTTON, NULL, NULL, NULL, vik_lpd_true_default, NULL, NULL }, + { VIK_LAYER_TRW, "trkpointsize", VIK_LAYER_PARAM_UINT, GROUP_TRACKS_ADV, N_("Trackpoint Size:"), VIK_LAYER_WIDGET_SPINBUTTON, ¶ms_scales[10], NULL, NULL, trkpointsize_default, NULL, NULL }, + { VIK_LAYER_TRW, "drawelevation", VIK_LAYER_PARAM_BOOLEAN, GROUP_TRACKS, N_("Draw Elevation"), VIK_LAYER_WIDGET_CHECKBUTTON, NULL, NULL, NULL, vik_lpd_false_default, NULL, NULL }, + { VIK_LAYER_TRW, "elevation_factor", VIK_LAYER_PARAM_UINT, GROUP_TRACKS_ADV, N_("Draw Elevation Height %:"), VIK_LAYER_WIDGET_HSCALE, ¶ms_scales[9], NULL, NULL, elevation_factor_default, NULL, NULL }, + { VIK_LAYER_TRW, "drawstops", VIK_LAYER_PARAM_BOOLEAN, GROUP_TRACKS, N_("Draw Stops"), VIK_LAYER_WIDGET_CHECKBUTTON, NULL, NULL, + N_("Whether to draw a marker when trackpoints are at the same position but over the minimum stop length apart in time"), vik_lpd_false_default, NULL, NULL }, + { VIK_LAYER_TRW, "stop_length", VIK_LAYER_PARAM_UINT, GROUP_TRACKS_ADV, N_("Min Stop Length (seconds):"), VIK_LAYER_WIDGET_SPINBUTTON, ¶ms_scales[8], NULL, NULL, stop_length_default, NULL, NULL }, + + { VIK_LAYER_TRW, "bg_line_thickness", VIK_LAYER_PARAM_UINT, GROUP_TRACKS_ADV, N_("Track BG Thickness:"), VIK_LAYER_WIDGET_SPINBUTTON, ¶ms_scales[6], NULL, NULL, bg_line_thickness_default, NULL, NULL }, + { VIK_LAYER_TRW, "trackbgcolor", VIK_LAYER_PARAM_COLOR, GROUP_TRACKS_ADV, N_("Track Background Color"), VIK_LAYER_WIDGET_COLOR, NULL, NULL, NULL, trackbgcolor_default, NULL, NULL }, + { VIK_LAYER_TRW, "speed_factor", VIK_LAYER_PARAM_DOUBLE, GROUP_TRACKS_ADV, N_("Draw by Speed Factor (%):"), VIK_LAYER_WIDGET_HSCALE, ¶ms_scales[1], NULL, + N_("The percentage factor away from the average speed determining the color used"), speed_factor_default, NULL, NULL }, + { VIK_LAYER_TRW, "tracksortorder", VIK_LAYER_PARAM_UINT, GROUP_TRACKS_ADV, N_("Track Sort Order:"), VIK_LAYER_WIDGET_COMBOBOX, params_sort_order, NULL, NULL, sort_order_default, NULL, NULL }, + + { VIK_LAYER_TRW, "drawlabels", VIK_LAYER_PARAM_BOOLEAN, GROUP_WAYPOINTS, N_("Draw Labels"), VIK_LAYER_WIDGET_CHECKBUTTON, NULL, NULL, NULL, vik_lpd_true_default, NULL, NULL }, + { VIK_LAYER_TRW, "wpfontsize", VIK_LAYER_PARAM_UINT, GROUP_WAYPOINTS, N_("Waypoint Font Size:"), VIK_LAYER_WIDGET_COMBOBOX, params_font_sizes, NULL, NULL, wpfontsize_default, NULL, NULL }, + { VIK_LAYER_TRW, "wpcolor", VIK_LAYER_PARAM_COLOR, GROUP_WAYPOINTS, N_("Waypoint Color:"), VIK_LAYER_WIDGET_COLOR, NULL, NULL, NULL, black_color_default, NULL, NULL }, + { VIK_LAYER_TRW, "wptextcolor", VIK_LAYER_PARAM_COLOR, GROUP_WAYPOINTS, N_("Waypoint Text:"), VIK_LAYER_WIDGET_COLOR, NULL, NULL, NULL, wptextcolor_default, NULL, NULL }, + { VIK_LAYER_TRW, "wpbgcolor", VIK_LAYER_PARAM_COLOR, GROUP_WAYPOINTS, N_("Background:"), VIK_LAYER_WIDGET_COLOR, NULL, NULL, NULL, wpbgcolor_default, NULL, NULL }, + { VIK_LAYER_TRW, "wpbgand", VIK_LAYER_PARAM_BOOLEAN, GROUP_WAYPOINTS, N_("Fake BG Color Translucency:"), VIK_LAYER_WIDGET_CHECKBUTTON, NULL, NULL, NULL, vik_lpd_false_default, NULL, NULL }, + { VIK_LAYER_TRW, "wpsymbol", VIK_LAYER_PARAM_UINT, GROUP_WAYPOINTS, N_("Waypoint marker:"), VIK_LAYER_WIDGET_COMBOBOX, params_wpsymbols, NULL, NULL, wpsymbol_default, NULL, NULL }, + { VIK_LAYER_TRW, "wpsize", VIK_LAYER_PARAM_UINT, GROUP_WAYPOINTS, N_("Waypoint size:"), VIK_LAYER_WIDGET_SPINBUTTON, ¶ms_scales[7], NULL, NULL, wpsize_default, NULL, NULL }, + { VIK_LAYER_TRW, "wpsyms", VIK_LAYER_PARAM_BOOLEAN, GROUP_WAYPOINTS, N_("Draw Waypoint Symbols:"), VIK_LAYER_WIDGET_CHECKBUTTON, NULL, NULL, NULL, vik_lpd_true_default, NULL, NULL }, + { VIK_LAYER_TRW, "wpsortorder", VIK_LAYER_PARAM_UINT, GROUP_WAYPOINTS, N_("Waypoint Sort Order:"), VIK_LAYER_WIDGET_COMBOBOX, params_sort_order, NULL, NULL, sort_order_default, NULL, NULL }, + + { VIK_LAYER_TRW, "drawimages", VIK_LAYER_PARAM_BOOLEAN, GROUP_IMAGES, N_("Draw Waypoint Images"), VIK_LAYER_WIDGET_CHECKBUTTON, NULL, NULL, NULL, vik_lpd_true_default, NULL, NULL }, + { VIK_LAYER_TRW, "image_size", VIK_LAYER_PARAM_UINT, GROUP_IMAGES, N_("Image Size (pixels):"), VIK_LAYER_WIDGET_HSCALE, ¶ms_scales[3], NULL, NULL, image_size_default, NULL, NULL }, + { VIK_LAYER_TRW, "image_alpha", VIK_LAYER_PARAM_UINT, GROUP_IMAGES, N_("Image Alpha:"), VIK_LAYER_WIDGET_HSCALE, ¶ms_scales[4], NULL, NULL, image_alpha_default, NULL, NULL }, + { VIK_LAYER_TRW, "image_cache_size", VIK_LAYER_PARAM_UINT, GROUP_IMAGES, N_("Image Memory Cache Size:"), VIK_LAYER_WIDGET_HSCALE, ¶ms_scales[5], NULL, NULL, image_cache_size_default, NULL, NULL }, + + { VIK_LAYER_TRW, "metadatadesc", VIK_LAYER_PARAM_STRING, GROUP_METADATA, N_("Description"), VIK_LAYER_WIDGET_ENTRY, NULL, NULL, NULL, string_default, NULL, NULL }, + { VIK_LAYER_TRW, "metadataauthor", VIK_LAYER_PARAM_STRING, GROUP_METADATA, N_("Author"), VIK_LAYER_WIDGET_ENTRY, NULL, NULL, NULL, string_default, NULL, NULL }, + { VIK_LAYER_TRW, "metadatatime", VIK_LAYER_PARAM_STRING, GROUP_METADATA, N_("Creation Time"), VIK_LAYER_WIDGET_ENTRY, NULL, NULL, NULL, string_default, NULL, NULL }, + { VIK_LAYER_TRW, "metadatakeywords", VIK_LAYER_PARAM_STRING, GROUP_METADATA, N_("Keywords"), VIK_LAYER_WIDGET_ENTRY, NULL, NULL, NULL, string_default, NULL, NULL }, + { VIK_LAYER_TRW, "external_layer", VIK_LAYER_PARAM_UINT, GROUP_FILESYSTEM, N_("External layer:"), VIK_LAYER_WIDGET_COMBOBOX, params_external_type, NULL, N_("Layer data stored in the Viking file, in an external file, or in an external file but changes are not written to the file (file only loaded at startup)"), external_layer_default, NULL, NULL }, + { VIK_LAYER_TRW, "external_file", VIK_LAYER_PARAM_STRING, GROUP_FILESYSTEM, N_("Save layer as:"), VIK_LAYER_WIDGET_FILESAVE, GINT_TO_POINTER(VF_FILTER_GPX), NULL, N_("Specify where layer should be saved. Overwrites file if it exists."), string_default, NULL, NULL }, +}; + +// ENUMERATION MUST BE IN THE SAME ORDER AS THE NAMED PARAMS ABOVE +enum { + // Sublayer visibilities + PARAM_TV, + PARAM_WV, + PARAM_RV, + // Tracks + PARAM_TDL, + PARAM_TLFONTSIZE, + PARAM_DM, + PARAM_TC, + PARAM_DL, + PARAM_LT, + PARAM_DD, + PARAM_DDS, + PARAM_DP, + PARAM_DPS, + PARAM_DE, + PARAM_EF, + PARAM_DS, + PARAM_SL, + PARAM_BLT, + PARAM_TBGC, + PARAM_TDSF, + PARAM_TSO, + // Waypoints + PARAM_DLA, + PARAM_WPFONTSIZE, + PARAM_WPC, + PARAM_WPTC, + PARAM_WPBC, + PARAM_WPBA, + PARAM_WPSYM, + PARAM_WPSIZE, + PARAM_WPSYMS, + PARAM_WPSO, + // WP images + PARAM_DI, + PARAM_IS, + PARAM_IA, + PARAM_ICS, + // Metadata + PARAM_MDDESC, + PARAM_MDAUTH, + PARAM_MDTIME, + PARAM_MDKEYS, + PARAM_EXTL, + PARAM_EXTF, + NUM_PARAMS +}; + +/*** TO ADD A PARAM: + *** 1) Add to trw_layer_params and enumeration + *** 2) Handle in get_param & set_param (presumably adding on to VikTrwLayer struct) + ***/ + +/****** END PARAMETERS ******/ + +/* Layer Interface function definitions */ +static VikTrwLayer* trw_layer_create ( VikViewport *vp ); +static void trw_layer_realize ( VikTrwLayer *vtl, VikTreeview *vt, GtkTreeIter *layer_iter ); +static void trw_layer_post_read ( VikTrwLayer *vtl, VikViewport *vvp, gboolean from_file ); +static void trw_layer_free ( VikTrwLayer *trwlayer ); +static void trw_layer_draw ( VikTrwLayer *l, gpointer data ); +static void trw_layer_change_coord_mode ( VikTrwLayer *vtl, VikCoordMode dest_mode ); +static time_t trw_layer_get_timestamp ( VikTrwLayer *vtl ); +static void trw_layer_set_menu_selection ( VikTrwLayer *vtl, guint16 ); +static guint16 trw_layer_get_menu_selection ( VikTrwLayer *vtl ); +static void trw_layer_add_menu_items ( VikTrwLayer *vtl, GtkMenu *menu, gpointer vlp ); +static gboolean trw_layer_sublayer_add_menu_items ( VikTrwLayer *l, GtkMenu *menu, gpointer vlp, gint subtype, gpointer sublayer, GtkTreeIter *iter, VikViewport *vvp ); +static const gchar* trw_layer_sublayer_rename_request ( VikTrwLayer *l, const gchar *newname, gpointer vlp, gint subtype, gpointer sublayer, GtkTreeIter *iter ); +static gboolean trw_layer_sublayer_toggle_visible ( VikTrwLayer *l, gint subtype, gpointer sublayer ); +static const gchar* trw_layer_layer_tooltip ( VikTrwLayer *vtl ); +static const gchar* trw_layer_sublayer_tooltip ( VikTrwLayer *l, gint subtype, gpointer sublayer ); +static gboolean trw_layer_selected ( VikTrwLayer *l, gint subtype, gpointer sublayer, gint type, gpointer vlp ); +static void trw_layer_marshall ( VikTrwLayer *vtl, guint8 **data, guint *len ); +static VikTrwLayer *trw_layer_unmarshall ( const guint8 *data_in, guint len, VikViewport *vvp ); +static gboolean trw_layer_set_param ( VikTrwLayer *vtl, VikLayerSetParam *vlsp ); +static VikLayerParamData trw_layer_get_param ( VikTrwLayer *vtl, guint16 id, gboolean is_file_operation ); +static void trw_layer_change_param ( GtkWidget *widget, ui_change_values values ); +static void trw_layer_del_item ( VikTrwLayer *vtl, gint subtype, gpointer sublayer ); +static void trw_layer_cut_item ( VikTrwLayer *vtl, gint subtype, gpointer sublayer ); +static void trw_layer_copy_item ( VikTrwLayer *vtl, gint subtype, gpointer sublayer, guint8 **item, guint *len ); +static gboolean trw_layer_paste_item ( VikTrwLayer *vtl, gint subtype, guint8 *item, guint len ); +static void trw_layer_free_copied_item ( gint subtype, gpointer item ); +static void trw_layer_drag_drop_request ( VikTrwLayer *vtl_src, VikTrwLayer *vtl_dest, GtkTreeIter *src_item_iter, GtkTreePath *dest_path ); +static gboolean trw_layer_select_click ( VikTrwLayer *vtl, GdkEventButton *event, VikViewport *vvp, tool_ed_t *t ); +static gboolean trw_layer_select_move ( VikTrwLayer *vtl, GdkEventMotion *event, VikViewport *vvp, tool_ed_t *t ); +static gboolean trw_layer_select_release ( VikTrwLayer *vtl, GdkEventButton *event, VikViewport *vvp, tool_ed_t *t ); +static gboolean trw_layer_show_selected_viewport_menu ( VikTrwLayer *vtl, GdkEventButton *event, VikViewport *vvp ); +static void trw_write_file ( VikTrwLayer *trw, FILE *f, const gchar *dirpath ); +static gboolean trw_read_file ( VikTrwLayer *trw, FILE *f, const gchar *dirpath ); +static void trw_write_file_external ( VikTrwLayer *trw, FILE *f, const gchar *dirpath ); +static gboolean trw_read_file_external ( VikTrwLayer *trw, FILE *f, const gchar *dirpath ); +static gboolean trw_load_external_layer ( VikTrwLayer *trw ); +static void trw_update_layer_icon ( VikTrwLayer *trw ); + +/* End Layer Interface function definitions */ + +VikLayerInterface vik_trw_layer_interface = { + "TrackWaypoint", + N_("TrackWaypoint"), + "Y", + &viktrwlayer_pixbuf, + + trw_layer_tools, + sizeof(trw_layer_tools) / sizeof(VikToolInterface), + + trw_layer_params, + NUM_PARAMS, + params_groups, /* params_groups */ + sizeof(params_groups)/sizeof(params_groups[0]), /* number of groups */ + + VIK_MENU_ITEM_ALL, + + (VikLayerFuncCreate) trw_layer_create, + (VikLayerFuncRealize) trw_layer_realize, + (VikLayerFuncPostRead) trw_layer_post_read, + (VikLayerFuncFree) trw_layer_free, + + (VikLayerFuncProperties) NULL, + (VikLayerFuncDraw) trw_layer_draw, + (VikLayerFuncChangeCoordMode) trw_layer_change_coord_mode, + (VikLayerFuncGetTimestamp) trw_layer_get_timestamp, + + (VikLayerFuncSetMenuItemsSelection) trw_layer_set_menu_selection, + (VikLayerFuncGetMenuItemsSelection) trw_layer_get_menu_selection, + + (VikLayerFuncAddMenuItems) trw_layer_add_menu_items, + (VikLayerFuncSublayerAddMenuItems) trw_layer_sublayer_add_menu_items, + + (VikLayerFuncSublayerRenameRequest) trw_layer_sublayer_rename_request, + (VikLayerFuncSublayerToggleVisible) trw_layer_sublayer_toggle_visible, + (VikLayerFuncSublayerTooltip) trw_layer_sublayer_tooltip, + (VikLayerFuncLayerTooltip) trw_layer_layer_tooltip, + (VikLayerFuncLayerSelected) trw_layer_selected, + + (VikLayerFuncMarshall) trw_layer_marshall, + (VikLayerFuncUnmarshall) trw_layer_unmarshall, + + (VikLayerFuncSetParam) trw_layer_set_param, + (VikLayerFuncGetParam) trw_layer_get_param, + (VikLayerFuncChangeParam) trw_layer_change_param, + + (VikLayerFuncReadFileData) trw_read_file, + (VikLayerFuncWriteFileData) trw_write_file, + + (VikLayerFuncDeleteItem) trw_layer_del_item, + (VikLayerFuncCutItem) trw_layer_cut_item, + (VikLayerFuncCopyItem) trw_layer_copy_item, + (VikLayerFuncPasteItem) trw_layer_paste_item, + (VikLayerFuncFreeCopiedItem) trw_layer_free_copied_item, + + (VikLayerFuncDragDropRequest) trw_layer_drag_drop_request, + + (VikLayerFuncSelectClick) trw_layer_select_click, + (VikLayerFuncSelectMove) trw_layer_select_move, + (VikLayerFuncSelectRelease) trw_layer_select_release, + (VikLayerFuncSelectedViewportMenu) trw_layer_show_selected_viewport_menu, +}; + +static gboolean have_diary_program = FALSE; +static gchar *diary_program = NULL; +#define VIK_SETTINGS_EXTERNAL_DIARY_PROGRAM "external_diary_program" + +static gboolean have_geojson_export = FALSE; + +static gboolean have_astro_program = FALSE; +static gchar *astro_program = NULL; +#define VIK_SETTINGS_EXTERNAL_ASTRO_PROGRAM "external_astro_program" + +// NB Only performed once per program run +static void vik_trwlayer_class_init ( VikTrwLayerClass *klass ) +{ + if ( ! a_settings_get_string ( VIK_SETTINGS_EXTERNAL_DIARY_PROGRAM, &diary_program ) ) { +#ifdef WINDOWS + //diary_program = g_strdup ( "C:\\Program Files\\Rednotebook\\rednotebook.exe" ); + diary_program = g_strdup ( "C:/Progra~1/Rednotebook/rednotebook.exe" ); +#else + diary_program = g_strdup ( "rednotebook" ); +#endif + } + else { + // User specified so assume it works + have_diary_program = TRUE; + } + + if ( g_find_program_in_path( diary_program ) ) { + gchar *mystdout = NULL; + gchar *mystderr = NULL; + // Needs RedNotebook 1.7.3+ for support of opening on a specified date + gchar *cmd = g_strconcat ( diary_program, " --version", NULL ); // "rednotebook --version" + if ( g_spawn_command_line_sync ( cmd, &mystdout, &mystderr, NULL, NULL ) ) { + // Annoyingly 1.7.1|2|3 versions of RedNotebook prints the version to stderr!! + if ( mystdout ) + g_debug ("Diary: %s", mystdout ); // Should be something like 'RedNotebook 1.4' + if ( mystderr ) + g_warning ("Diary: stderr: %s", mystderr ); + + gchar **tokens = NULL; + if ( mystdout && g_strcmp0(mystdout, "") ) + tokens = g_strsplit(mystdout, " ", 0); + else if ( mystderr ) + tokens = g_strsplit(mystderr, " ", 0); + + if ( tokens ) { + gint num = 0; + gchar *token = tokens[num]; + while ( token && num < 2 ) { + if (num == 1) { + if ( viking_version_to_number(token) >= viking_version_to_number("1.7.3") ) + have_diary_program = TRUE; + } + num++; + token = tokens[num]; + } + } + g_strfreev ( tokens ); + } + g_free ( mystdout ); + g_free ( mystderr ); + g_free ( cmd ); + } + + if ( g_find_program_in_path ( a_geojson_program_export() ) ) { + have_geojson_export = TRUE; + } + + // Astronomy Domain + if ( ! a_settings_get_string ( VIK_SETTINGS_EXTERNAL_ASTRO_PROGRAM, &astro_program ) ) { +#ifdef WINDOWS + //astro_program = g_strdup ( "C:\\Program Files\\Stellarium\\stellarium.exe" ); + astro_program = g_strdup ( "C:/Progra~1/Stellarium/stellarium.exe" ); +#else + astro_program = g_strdup ( "stellarium" ); +#endif + } + else { + // User specified so assume it works + have_astro_program = TRUE; + } + if ( g_find_program_in_path( astro_program ) ) { + have_astro_program = TRUE; + } +} + +GType vik_trw_layer_get_type () +{ + static GType vtl_type = 0; + + if (!vtl_type) + { + static const GTypeInfo vtl_info = + { + sizeof (VikTrwLayerClass), + NULL, /* base_init */ + NULL, /* base_finalize */ + (GClassInitFunc) vik_trwlayer_class_init, /* class init */ + NULL, /* class_finalize */ + NULL, /* class_data */ + sizeof (VikTrwLayer), + 0, + NULL /* instance init */ + }; + vtl_type = g_type_register_static ( VIK_LAYER_TYPE, "VikTrwLayer", &vtl_info, 0 ); + } + return vtl_type; +} + +VikTRWMetadata *vik_trw_metadata_new() +{ + return (VikTRWMetadata*)g_malloc0(sizeof(VikTRWMetadata)); +} + +void vik_trw_metadata_free ( VikTRWMetadata *metadata) +{ + g_free (metadata); +} + +VikTRWMetadata *vik_trw_layer_get_metadata ( VikTrwLayer *vtl ) +{ + return vtl->metadata; +} + +void vik_trw_layer_set_metadata ( VikTrwLayer *vtl, VikTRWMetadata *metadata) +{ + if ( vtl->metadata ) + vik_trw_metadata_free ( vtl->metadata ); + vtl->metadata = metadata; +} + +typedef struct { + gboolean found; + const gchar *date_str; + const VikTrack *trk; + const VikWaypoint *wpt; + gpointer trk_id; + gpointer wpt_id; +} date_finder_type; + +static gboolean trw_layer_find_date_track ( const gpointer id, const VikTrack *trk, date_finder_type *df ) +{ + gchar date_buf[20]; + date_buf[0] = '\0'; + // Might be an easier way to compare dates rather than converting the strings all the time... + if ( trk->trackpoints && VIK_TRACKPOINT(trk->trackpoints->data)->has_timestamp ) { + strftime (date_buf, sizeof(date_buf), "%Y-%m-%d", gmtime(&(VIK_TRACKPOINT(trk->trackpoints->data)->timestamp))); + + if ( ! g_strcmp0 ( df->date_str, date_buf ) ) { + df->found = TRUE; + df->trk = trk; + df->trk_id = id; + } + } + return df->found; +} + +static gboolean trw_layer_find_date_waypoint ( const gpointer id, const VikWaypoint *wpt, date_finder_type *df ) +{ + gchar date_buf[20]; + date_buf[0] = '\0'; + // Might be an easier way to compare dates rather than converting the strings all the time... + if ( wpt->has_timestamp ) { + strftime (date_buf, sizeof(date_buf), "%Y-%m-%d", gmtime(&(wpt->timestamp))); + + if ( ! g_strcmp0 ( df->date_str, date_buf ) ) { + df->found = TRUE; + df->wpt = wpt; + df->wpt_id = id; + } + } + return df->found; +} + +/** + * Find an item by date + */ +gboolean vik_trw_layer_find_date ( VikTrwLayer *vtl, const gchar *date_str, VikCoord *position, VikViewport *vvp, gboolean do_tracks, gboolean select ) +{ + date_finder_type df; + df.found = FALSE; + df.date_str = date_str; + df.trk = NULL; + df.wpt = NULL; + // Only tracks ATM + if ( do_tracks ) + g_hash_table_find ( vtl->tracks, (GHRFunc) trw_layer_find_date_track, &df ); + else + g_hash_table_find ( vtl->waypoints, (GHRFunc) trw_layer_find_date_waypoint, &df ); + + if ( select && df.found ) { + if ( do_tracks && df.trk ) { + struct LatLon maxmin[2] = { {0,0}, {0,0} }; + trw_layer_find_maxmin_tracks ( NULL, df.trk, maxmin ); + trw_layer_zoom_to_show_latlons ( vtl, vvp, maxmin ); + vik_treeview_select_iter ( VIK_LAYER(vtl)->vt, g_hash_table_lookup (vtl->tracks_iters, df.trk_id), TRUE ); + } + else if ( df.wpt ) { + vik_viewport_set_center_coord ( vvp, &(df.wpt->coord), TRUE ); + vik_treeview_select_iter ( VIK_LAYER(vtl)->vt, g_hash_table_lookup (vtl->waypoints_iters, df.wpt_id), TRUE ); + } + vik_layer_emit_update ( VIK_LAYER(vtl) ); + } + return df.found; +} + +static void trw_layer_del_item ( VikTrwLayer *vtl, gint subtype, gpointer sublayer ) +{ + static menu_array_sublayer values; + if (!sublayer) { + return; + } + + gint ii; + for ( ii = MA_VTL; ii < MA_LAST; ii++ ) + values[ii] = NULL; + + values[MA_VTL] = vtl; + values[MA_SUBTYPE] = GINT_TO_POINTER (subtype); + values[MA_SUBLAYER_ID] = sublayer; + values[MA_CONFIRM] = GINT_TO_POINTER (1); // Confirm delete request + + trw_layer_delete_item ( values ); +} + +static void trw_layer_cut_item ( VikTrwLayer *vtl, gint subtype, gpointer sublayer ) +{ + static menu_array_sublayer values; + if (!sublayer) { + return; + } + + gint ii; + for ( ii = MA_VTL; ii < MA_LAST; ii++ ) + values[ii] = NULL; + + values[MA_VTL] = vtl; + values[MA_SUBTYPE] = GINT_TO_POINTER (subtype); + values[MA_SUBLAYER_ID] = sublayer; + values[MA_CONFIRM] = GINT_TO_POINTER (1); // Confirm delete request + + trw_layer_copy_item_cb(values); + trw_layer_cut_item_cb(values); +} + +static void trw_layer_copy_item_cb ( menu_array_sublayer values) +{ + VikTrwLayer *vtl = VIK_TRW_LAYER(values[MA_VTL]); + gint subtype = GPOINTER_TO_INT (values[MA_SUBTYPE]); + gpointer sublayer = values[MA_SUBLAYER_ID]; + guint8 *data = NULL; + guint len; + + trw_layer_copy_item( vtl, subtype, sublayer, &data, &len); + + if (data) { + const gchar* name; + if ( subtype == VIK_TRW_LAYER_SUBLAYER_WAYPOINT ) { + VikWaypoint *wp = g_hash_table_lookup ( vtl->waypoints, sublayer); + if ( wp && wp->name ) + name = wp->name; + else + name = NULL; // Broken :( + } + else if ( subtype == VIK_TRW_LAYER_SUBLAYER_TRACK ) { + VikTrack *trk = g_hash_table_lookup ( vtl->tracks, sublayer); + if ( trk && trk->name ) + name = trk->name; + else + name = NULL; // Broken :( + } + else { + VikTrack *trk = g_hash_table_lookup ( vtl->routes, sublayer); + if ( trk && trk->name ) + name = trk->name; + else + name = NULL; // Broken :( + } + + a_clipboard_copy( VIK_CLIPBOARD_DATA_SUBLAYER, VIK_LAYER_TRW, + subtype, len, name, data); + } +} + +static void trw_layer_cut_item_cb ( menu_array_sublayer values) +{ + trw_layer_copy_item_cb(values); + values[MA_CONFIRM] = GINT_TO_POINTER (0); // Never need to confirm automatic delete + trw_layer_delete_item(values); +} + +static void trw_layer_paste_item_cb ( menu_array_sublayer values) +{ + // Slightly cheating method, routing via the panels capability + a_clipboard_paste (VIK_LAYERS_PANEL(values[MA_VLP])); +} + +static void trw_layer_copy_item ( VikTrwLayer *vtl, gint subtype, gpointer sublayer, guint8 **item, guint *len ) +{ + guint8 *id; + guint il; + + if (!sublayer) { + *item = NULL; + return; + } + + GByteArray *ba = g_byte_array_new (); + + if ( subtype == VIK_TRW_LAYER_SUBLAYER_WAYPOINT ) { + vik_waypoint_marshall ( g_hash_table_lookup ( vtl->waypoints, sublayer ), &id, &il ); + } else if ( subtype == VIK_TRW_LAYER_SUBLAYER_TRACK ) { + vik_track_marshall ( g_hash_table_lookup ( vtl->tracks, sublayer ), &id, &il ); + } else { + vik_track_marshall ( g_hash_table_lookup ( vtl->routes, sublayer ), &id, &il ); + } + + g_byte_array_append ( ba, id, il ); + + g_free(id); + + *len = ba->len; + *item = ba->data; +} + +static gboolean trw_layer_paste_item ( VikTrwLayer *vtl, gint subtype, guint8 *item, guint len ) +{ + if ( !item ) + return FALSE; + + gchar *name; + + if ( subtype == VIK_TRW_LAYER_SUBLAYER_WAYPOINT ) + { + VikWaypoint *w; + + w = vik_waypoint_unmarshall ( item, len ); + // When copying - we'll create a new name based on the original + name = trw_layer_new_unique_sublayer_name(vtl, VIK_TRW_LAYER_SUBLAYER_WAYPOINT, w->name); + vik_trw_layer_add_waypoint ( vtl, name, w ); + waypoint_convert (NULL, w, &vtl->coord_mode); + g_free ( name ); + + trw_layer_calculate_bounds_waypoints ( vtl ); + + // Consider if redraw necessary for the new item + if ( vtl->vl.visible && vtl->waypoints_visible && w->visible ) + vik_layer_emit_update ( VIK_LAYER(vtl) ); + return TRUE; + } + if ( subtype == VIK_TRW_LAYER_SUBLAYER_TRACK ) + { + VikTrack *t; + + t = vik_track_unmarshall ( item, len ); + // When copying - we'll create a new name based on the original + name = trw_layer_new_unique_sublayer_name(vtl, VIK_TRW_LAYER_SUBLAYER_TRACK, t->name); + vik_trw_layer_add_track ( vtl, name, t ); + vik_track_convert (t, vtl->coord_mode); + g_free ( name ); + + // Consider if redraw necessary for the new item + if ( vtl->vl.visible && vtl->tracks_visible && t->visible ) + vik_layer_emit_update ( VIK_LAYER(vtl) ); + return TRUE; + } + if ( subtype == VIK_TRW_LAYER_SUBLAYER_ROUTE ) + { + VikTrack *t; + + t = vik_track_unmarshall ( item, len ); + // When copying - we'll create a new name based on the original + name = trw_layer_new_unique_sublayer_name(vtl, VIK_TRW_LAYER_SUBLAYER_ROUTE, t->name); + vik_trw_layer_add_route ( vtl, name, t ); + vik_track_convert (t, vtl->coord_mode); + g_free ( name ); + + // Consider if redraw necessary for the new item + if ( vtl->vl.visible && vtl->routes_visible && t->visible ) + vik_layer_emit_update ( VIK_LAYER(vtl) ); + return TRUE; + } + return FALSE; +} + +static void trw_layer_free_copied_item ( gint subtype, gpointer item ) +{ + if (item) { + g_free(item); + } +} + +static gboolean trw_layer_set_param ( VikTrwLayer *vtl, VikLayerSetParam *vlsp ) +{ + switch ( vlsp->id ) + { + case PARAM_TV: vtl->tracks_visible = vlsp->data.b; break; + case PARAM_WV: vtl->waypoints_visible = vlsp->data.b; break; + case PARAM_RV: vtl->routes_visible = vlsp->data.b; break; + case PARAM_TDL: vtl->track_draw_labels = vlsp->data.b; break; + case PARAM_TLFONTSIZE: + if ( vlsp->data.u < FS_NUM_SIZES ) { + vtl->track_font_size = vlsp->data.u; + g_free ( vtl->track_fsize_str ); + switch ( vtl->track_font_size ) { + case FS_XX_SMALL: vtl->track_fsize_str = g_strdup ( "xx-small" ); break; + case FS_X_SMALL: vtl->track_fsize_str = g_strdup ( "x-small" ); break; + case FS_SMALL: vtl->track_fsize_str = g_strdup ( "small" ); break; + case FS_LARGE: vtl->track_fsize_str = g_strdup ( "large" ); break; + case FS_X_LARGE: vtl->track_fsize_str = g_strdup ( "x-large" ); break; + case FS_XX_LARGE: vtl->track_fsize_str = g_strdup ( "xx-large" ); break; + default: vtl->track_fsize_str = g_strdup ( "medium" ); break; + } + } + break; + case PARAM_DM: vtl->drawmode = vlsp->data.u; break; + case PARAM_TC: + vtl->track_color = vlsp->data.c; + if ( vlsp->vp ) trw_layer_edit_track_gcs ( vtl, vlsp->vp ); + break; + case PARAM_DP: vtl->drawpoints = vlsp->data.b; break; + case PARAM_DPS: + if ( vlsp->data.u >= MIN_POINT_SIZE && vlsp->data.u <= MAX_POINT_SIZE ) + vtl->drawpoints_size = vlsp->data.u; + break; + case PARAM_DE: vtl->drawelevation = vlsp->data.b; break; + case PARAM_DS: vtl->drawstops = vlsp->data.b; break; + case PARAM_DL: vtl->drawlines = vlsp->data.b; break; + case PARAM_DD: vtl->drawdirections = vlsp->data.b; break; + case PARAM_DDS: + if ( vlsp->data.u >= MIN_ARROW_SIZE && vlsp->data.u <= MAX_ARROW_SIZE ) + vtl->drawdirections_size = vlsp->data.u; + break; + case PARAM_SL: + if ( vlsp->data.u >= MIN_STOP_LENGTH && vlsp->data.u <= MAX_STOP_LENGTH ) + vtl->stop_length = vlsp->data.u; + break; + case PARAM_EF: + if ( vlsp->data.u >= 1 && vlsp->data.u <= 100 ) + vtl->elevation_factor = vlsp->data.u; + break; + case PARAM_LT: + if ( vlsp->data.u > 0 && vlsp->data.u < 15 && vlsp->data.u != vtl->line_thickness ) { + vtl->line_thickness = vlsp->data.u; + if ( vlsp->vp ) trw_layer_edit_track_gcs ( vtl, vlsp->vp ); + } + break; + case PARAM_BLT: + if ( vlsp->data.u <= 8 && vlsp->data.u != vtl->bg_line_thickness ) { + vtl->bg_line_thickness = vlsp->data.u; + if ( vlsp->vp ) trw_layer_edit_track_gcs ( vtl, vlsp->vp ); + } + break; + case PARAM_TBGC: + vtl->track_bg_color = vlsp->data.c; + if ( vtl->track_bg_gc ) + gdk_gc_set_rgb_fg_color(vtl->track_bg_gc, &(vtl->track_bg_color)); + break; + case PARAM_TDSF: vtl->track_draw_speed_factor = vlsp->data.d; break; + case PARAM_TSO: if ( vlsp->data.u < VL_SO_LAST ) vtl->track_sort_order = vlsp->data.u; break; + case PARAM_DLA: vtl->drawlabels = vlsp->data.b; break; + case PARAM_DI: vtl->drawimages = vlsp->data.b; break; + case PARAM_IS: + if ( vlsp->data.u != vtl->image_size ) { + vtl->image_size = vlsp->data.u; + g_hash_table_remove_all ( vtl->image_cache ); + } + break; + case PARAM_IA: + if ( vlsp->data.u != vtl->image_alpha ) { + vtl->image_alpha = vlsp->data.u; + g_hash_table_remove_all ( vtl->image_cache ); + } + break; + case PARAM_ICS: + // If cache size is made smaller, then reset cache + if ( vlsp->data.u < vtl->image_cache_size ) + g_hash_table_remove_all ( vtl->image_cache ); + vtl->image_cache_size = vlsp->data.u; + break; + case PARAM_WPC: + vtl->waypoint_color = vlsp->data.c; + if ( vtl->waypoint_gc ) + gdk_gc_set_rgb_fg_color(vtl->waypoint_gc, &(vtl->waypoint_color)); + break; + case PARAM_WPTC: + vtl->waypoint_text_color = vlsp->data.c; + if ( vtl->waypoint_text_gc ) + gdk_gc_set_rgb_fg_color(vtl->waypoint_text_gc, &(vtl->waypoint_text_color)); + break; + case PARAM_WPBC: + vtl->waypoint_bg_color = vlsp->data.c; + if ( vtl->waypoint_bg_gc ) + gdk_gc_set_rgb_fg_color(vtl->waypoint_bg_gc, &(vtl->waypoint_bg_color)); + break; + case PARAM_WPBA: + vtl->wpbgand = vlsp->data.b; + if ( vtl->waypoint_bg_gc ) + gdk_gc_set_function(vtl->waypoint_bg_gc, vlsp->data.b ? GDK_AND : GDK_COPY ); + break; + case PARAM_WPSYM: if ( vlsp->data.u < WP_NUM_SYMBOLS ) vtl->wp_symbol = vlsp->data.u; break; + case PARAM_WPSIZE: if ( vlsp->data.u > 0 && vlsp->data.u <= 64 ) vtl->wp_size = vlsp->data.u; break; + case PARAM_WPSYMS: vtl->wp_draw_symbols = vlsp->data.b; break; + case PARAM_WPFONTSIZE: + if ( vlsp->data.u < FS_NUM_SIZES ) { + vtl->wp_font_size = vlsp->data.u; + g_free ( vtl->wp_fsize_str ); + switch ( vtl->wp_font_size ) { + case FS_XX_SMALL: vtl->wp_fsize_str = g_strdup ( "xx-small" ); break; + case FS_X_SMALL: vtl->wp_fsize_str = g_strdup ( "x-small" ); break; + case FS_SMALL: vtl->wp_fsize_str = g_strdup ( "small" ); break; + case FS_LARGE: vtl->wp_fsize_str = g_strdup ( "large" ); break; + case FS_X_LARGE: vtl->wp_fsize_str = g_strdup ( "x-large" ); break; + case FS_XX_LARGE: vtl->wp_fsize_str = g_strdup ( "xx-large" ); break; + default: vtl->wp_fsize_str = g_strdup ( "medium" ); break; + } + } + break; + case PARAM_WPSO: if ( vlsp->data.u < VL_SO_LAST ) vtl->wp_sort_order = vlsp->data.u; break; + // Metadata + case PARAM_MDDESC: if ( vlsp->data.s && vtl->metadata ) vtl->metadata->description = g_strdup (vlsp->data.s); break; + case PARAM_MDAUTH: if ( vlsp->data.s && vtl->metadata ) vtl->metadata->author = g_strdup (vlsp->data.s); break; + case PARAM_MDTIME: if ( vlsp->data.s && vtl->metadata ) vtl->metadata->timestamp = g_strdup (vlsp->data.s); break; + case PARAM_MDKEYS: if ( vlsp->data.s && vtl->metadata ) vtl->metadata->keywords = g_strdup (vlsp->data.s); break; + case PARAM_EXTL: + if ( vlsp->data.u < VIK_EXTERNAL_TYPE_LAST ) { + vtl->external_layer = vlsp->data.u; + trw_update_layer_icon ( vtl ); + } + break; + case PARAM_EXTF: + if ( vlsp->data.s ) { + g_free (vtl->external_file); + vtl->external_file = g_strdup (vlsp->data.s); + } + break; + default: break; + } + return TRUE; +} + +static VikLayerParamData trw_layer_get_param ( VikTrwLayer *vtl, guint16 id, gboolean is_file_operation ) +{ + VikLayerParamData rv; + switch ( id ) + { + case PARAM_TV: rv.b = vtl->tracks_visible; break; + case PARAM_WV: rv.b = vtl->waypoints_visible; break; + case PARAM_RV: rv.b = vtl->routes_visible; break; + case PARAM_TDL: rv.b = vtl->track_draw_labels; break; + case PARAM_TLFONTSIZE: rv.u = vtl->track_font_size; break; + case PARAM_DM: rv.u = vtl->drawmode; break; + case PARAM_TC: rv.c = vtl->track_color; break; + case PARAM_DP: rv.b = vtl->drawpoints; break; + case PARAM_DPS: rv.u = vtl->drawpoints_size; break; + case PARAM_DE: rv.b = vtl->drawelevation; break; + case PARAM_EF: rv.u = vtl->elevation_factor; break; + case PARAM_DS: rv.b = vtl->drawstops; break; + case PARAM_SL: rv.u = vtl->stop_length; break; + case PARAM_DL: rv.b = vtl->drawlines; break; + case PARAM_DD: rv.b = vtl->drawdirections; break; + case PARAM_DDS: rv.u = vtl->drawdirections_size; break; + case PARAM_LT: rv.u = vtl->line_thickness; break; + case PARAM_BLT: rv.u = vtl->bg_line_thickness; break; + case PARAM_DLA: rv.b = vtl->drawlabels; break; + case PARAM_DI: rv.b = vtl->drawimages; break; + case PARAM_TBGC: rv.c = vtl->track_bg_color; break; + case PARAM_TDSF: rv.d = vtl->track_draw_speed_factor; break; + case PARAM_TSO: rv.u = vtl->track_sort_order; break; + case PARAM_IS: rv.u = vtl->image_size; break; + case PARAM_IA: rv.u = vtl->image_alpha; break; + case PARAM_ICS: rv.u = vtl->image_cache_size; break; + case PARAM_WPC: rv.c = vtl->waypoint_color; break; + case PARAM_WPTC: rv.c = vtl->waypoint_text_color; break; + case PARAM_WPBC: rv.c = vtl->waypoint_bg_color; break; + case PARAM_WPBA: rv.b = vtl->wpbgand; break; + case PARAM_WPSYM: rv.u = vtl->wp_symbol; break; + case PARAM_WPSIZE: rv.u = vtl->wp_size; break; + case PARAM_WPSYMS: rv.b = vtl->wp_draw_symbols; break; + case PARAM_WPFONTSIZE: rv.u = vtl->wp_font_size; break; + case PARAM_WPSO: rv.u = vtl->wp_sort_order; break; + // Metadata + case PARAM_MDDESC: if (vtl->metadata) { rv.s = vtl->metadata->description; } break; + case PARAM_MDAUTH: if (vtl->metadata) { rv.s = vtl->metadata->author; } break; + case PARAM_MDTIME: if (vtl->metadata) { rv.s = vtl->metadata->timestamp; } break; + case PARAM_MDKEYS: if (vtl->metadata) { rv.s = vtl->metadata->keywords; } break; + case PARAM_EXTL: rv.u = vtl->external_layer; break; + case PARAM_EXTF: rv.s = vtl->external_file; break; + default: break; + } + return rv; +} + +static void trw_layer_change_param ( GtkWidget *widget, ui_change_values values ) +{ + // This '-3' is to account for the first few parameters not in the properties + const gint OFFSET = -3; + + switch ( GPOINTER_TO_INT(values[UI_CHG_PARAM_ID]) ) { + // Alter sensitivity of waypoint draw image related widgets according to the draw image setting. + case PARAM_DI: { + // Get new value + VikLayerParamData vlpd = a_uibuilder_widget_get_value ( widget, values[UI_CHG_PARAM] ); + GtkWidget **ww1 = values[UI_CHG_WIDGETS]; + GtkWidget **ww2 = values[UI_CHG_LABELS]; + GtkWidget *w1 = ww1[OFFSET + PARAM_IS]; + GtkWidget *w2 = ww2[OFFSET + PARAM_IS]; + GtkWidget *w3 = ww1[OFFSET + PARAM_IA]; + GtkWidget *w4 = ww2[OFFSET + PARAM_IA]; + GtkWidget *w5 = ww1[OFFSET + PARAM_ICS]; + GtkWidget *w6 = ww2[OFFSET + PARAM_ICS]; + if ( w1 ) gtk_widget_set_sensitive ( w1, vlpd.b ); + if ( w2 ) gtk_widget_set_sensitive ( w2, vlpd.b ); + if ( w3 ) gtk_widget_set_sensitive ( w3, vlpd.b ); + if ( w4 ) gtk_widget_set_sensitive ( w4, vlpd.b ); + if ( w5 ) gtk_widget_set_sensitive ( w5, vlpd.b ); + if ( w6 ) gtk_widget_set_sensitive ( w6, vlpd.b ); + break; + } + // Alter sensitivity of waypoint label related widgets according to the draw label setting. + case PARAM_DLA: { + // Get new value + VikLayerParamData vlpd = a_uibuilder_widget_get_value ( widget, values[UI_CHG_PARAM] ); + GtkWidget **ww1 = values[UI_CHG_WIDGETS]; + GtkWidget **ww2 = values[UI_CHG_LABELS]; + GtkWidget *w1 = ww1[OFFSET + PARAM_WPTC]; + GtkWidget *w2 = ww2[OFFSET + PARAM_WPTC]; + GtkWidget *w3 = ww1[OFFSET + PARAM_WPBC]; + GtkWidget *w4 = ww2[OFFSET + PARAM_WPBC]; + GtkWidget *w5 = ww1[OFFSET + PARAM_WPBA]; + GtkWidget *w6 = ww2[OFFSET + PARAM_WPBA]; + GtkWidget *w7 = ww1[OFFSET + PARAM_WPFONTSIZE]; + GtkWidget *w8 = ww2[OFFSET + PARAM_WPFONTSIZE]; + if ( w1 ) gtk_widget_set_sensitive ( w1, vlpd.b ); + if ( w2 ) gtk_widget_set_sensitive ( w2, vlpd.b ); + if ( w3 ) gtk_widget_set_sensitive ( w3, vlpd.b ); + if ( w4 ) gtk_widget_set_sensitive ( w4, vlpd.b ); + if ( w5 ) gtk_widget_set_sensitive ( w5, vlpd.b ); + if ( w6 ) gtk_widget_set_sensitive ( w6, vlpd.b ); + if ( w7 ) gtk_widget_set_sensitive ( w7, vlpd.b ); + if ( w8 ) gtk_widget_set_sensitive ( w8, vlpd.b ); + break; + } + // Alter sensitivity of all track colours according to the draw track mode. + case PARAM_DM: { + // Get new value + VikLayerParamData vlpd = a_uibuilder_widget_get_value ( widget, values[UI_CHG_PARAM] ); + gboolean sensitive = ( vlpd.u == DRAWMODE_ALL_SAME_COLOR ); + GtkWidget **ww1 = values[UI_CHG_WIDGETS]; + GtkWidget **ww2 = values[UI_CHG_LABELS]; + GtkWidget *w1 = ww1[OFFSET + PARAM_TC]; + GtkWidget *w2 = ww2[OFFSET + PARAM_TC]; + if ( w1 ) gtk_widget_set_sensitive ( w1, sensitive ); + if ( w2 ) gtk_widget_set_sensitive ( w2, sensitive ); + break; + } + case PARAM_MDTIME: { + // Force metadata->timestamp to be always read-only for now. + GtkWidget **ww = values[UI_CHG_WIDGETS]; + GtkWidget *w1 = ww[OFFSET + PARAM_MDTIME]; + if ( w1 ) gtk_widget_set_sensitive ( w1, FALSE ); + } + // NB Since other track settings have been split across tabs, + // I don't think it's useful to set sensitivities on widgets you can't immediately see + case PARAM_EXTL: { + VikLayerParamData vlpd = a_uibuilder_widget_get_value ( widget, values[UI_CHG_PARAM] ); + gboolean sensitive = ( vlpd.u == VIK_TRW_LAYER_EXTERNAL || vlpd.u == VIK_TRW_LAYER_EXTERNAL_NO_WRITE ); + GtkWidget **ww1 = values[UI_CHG_WIDGETS]; + GtkWidget **ww2 = values[UI_CHG_LABELS]; + GtkWidget *w1 = ww1[OFFSET + PARAM_EXTF]; + GtkWidget *w2 = ww2[OFFSET + PARAM_EXTF]; + GtkWidget *w3 = ww1[OFFSET + PARAM_EXTL]; + VikFileEntry *vfe = VIK_FILE_ENTRY(w1); + const gchar *file_name = vik_file_entry_get_filename ( vfe ); + if ( w1 ) { + gtk_widget_set_sensitive ( w1, sensitive ); + if ( sensitive && strlen( file_name ) == 0) + choose_file(VIK_FILE_ENTRY(w1)); + } + if ( w2 ) gtk_widget_set_sensitive ( w2, sensitive ); + if ( w3 && strlen ( file_name ) == 0 && vlpd.u != VIK_TRW_LAYER_EXTERNAL_NO_WRITE ) + gtk_combo_box_text_remove ( GTK_COMBO_BOX_TEXT(w3), VIK_TRW_LAYER_EXTERNAL_NO_WRITE ); + } + default: break; + } +} + +static void trw_layer_marshall( VikTrwLayer *vtl, guint8 **data, guint *len ) +{ + guint8 *pd; + guint pl; + + *data = NULL; + + // Use byte arrays to store sublayer data + // much like done elsewhere e.g. vik_layer_marshall_params() + GByteArray *ba = g_byte_array_new ( ); + + guint8 *sl_data; + guint sl_len; + + guint object_length; + guint subtype; + // store: + // the length of the item + // the sublayer type of item + // the the actual item +#define tlm_append(object_pointer, size, type) \ + subtype = (type); \ + object_length = (size); \ + g_byte_array_append ( ba, (guint8 *)&object_length, sizeof(object_length) ); \ + g_byte_array_append ( ba, (guint8 *)&subtype, sizeof(subtype) ); \ + g_byte_array_append ( ba, (object_pointer), object_length ); + + // Layer parameters first + vik_layer_marshall_params(VIK_LAYER(vtl), &pd, &pl); + g_byte_array_append ( ba, (guint8 *)&pl, sizeof(pl) ); \ + g_byte_array_append ( ba, pd, pl ); + g_free ( pd ); + + // Now sublayer data + GHashTableIter iter; + gpointer key, value; + + // Waypoints + g_hash_table_iter_init ( &iter, vtl->waypoints ); + while ( g_hash_table_iter_next (&iter, &key, &value) ) { + vik_waypoint_marshall ( VIK_WAYPOINT(value), &sl_data, &sl_len ); + tlm_append ( sl_data, sl_len, VIK_TRW_LAYER_SUBLAYER_WAYPOINT ); + g_free ( sl_data ); + } + + // Tracks + g_hash_table_iter_init ( &iter, vtl->tracks ); + while ( g_hash_table_iter_next (&iter, &key, &value) ) { + vik_track_marshall ( VIK_TRACK(value), &sl_data, &sl_len ); + tlm_append ( sl_data, sl_len, VIK_TRW_LAYER_SUBLAYER_TRACK ); + g_free ( sl_data ); + } + + // Routes + g_hash_table_iter_init ( &iter, vtl->routes ); + while ( g_hash_table_iter_next (&iter, &key, &value) ) { + vik_track_marshall ( VIK_TRACK(value), &sl_data, &sl_len ); + tlm_append ( sl_data, sl_len, VIK_TRW_LAYER_SUBLAYER_ROUTE ); + g_free ( sl_data ); + } + +#undef tlm_append + + *data = ba->data; + *len = ba->len; +} + +static VikTrwLayer *trw_layer_unmarshall ( const guint8 *data_in, guint len, VikViewport *vvp ) +{ + VikTrwLayer *vtl = VIK_TRW_LAYER(vik_layer_create ( VIK_LAYER_TRW, vvp, FALSE )); + guint pl; + guint consumed_length; + guint8 *data = (guint8*)data_in; + + // First the overall layer parameters + memcpy(&pl, data, sizeof(pl)); + data += sizeof(pl); + vik_layer_unmarshall_params ( VIK_LAYER(vtl), data, pl, vvp ); + data += pl; + + consumed_length = pl; + const guint sizeof_len_and_subtype = sizeof(guint) + sizeof(guint); + +#define tlm_size (*(guint *)data) + // See marshalling above for order of how this is written + + // Now the individual sublayers: + while ( data && (consumed_length < len) ) { + // Normally four extra bytes at the end of the datastream + // (since it's a GByteArray and that's where it's length is stored) + // So only attempt read when there's an actual block of sublayer data + if ( consumed_length + tlm_size < len ) { + + // Reuse pl to read the subtype from the data stream + memcpy(&pl, data+sizeof(guint), sizeof(pl)); + + // Also remember to (attempt to) convert each coordinate in case this is pasted into a different drawmode + if ( pl == VIK_TRW_LAYER_SUBLAYER_TRACK ) { + VikTrack *trk = vik_track_unmarshall ( data + sizeof_len_and_subtype, 0 ); + gchar *name = g_strdup ( trk->name ); + vik_trw_layer_add_track ( vtl, name, trk ); + g_free ( name ); + vik_track_convert (trk, vtl->coord_mode); + } + if ( pl == VIK_TRW_LAYER_SUBLAYER_WAYPOINT ) { + VikWaypoint *wp = vik_waypoint_unmarshall ( data + sizeof_len_and_subtype, 0 ); + gchar *name = g_strdup ( wp->name ); + vik_trw_layer_add_waypoint ( vtl, name, wp ); + g_free ( name ); + waypoint_convert (NULL, wp, &vtl->coord_mode); + } + if ( pl == VIK_TRW_LAYER_SUBLAYER_ROUTE ) { + VikTrack *trk = vik_track_unmarshall ( data + sizeof_len_and_subtype, 0 ); + gchar *name = g_strdup ( trk->name ); + vik_trw_layer_add_route ( vtl, name, trk ); + g_free ( name ); + vik_track_convert (trk, vtl->coord_mode); + } + } + // Don't shift data pointer to beyond our buffer of data - as otherwise it could point to anything + if ( consumed_length + tlm_size < len ) { + consumed_length += tlm_size + sizeof_len_and_subtype; + //g_debug ("data %d, consumed_length %d vs len %d", tlm_size, consumed_length, len); + data += sizeof_len_and_subtype + tlm_size; + } + else + // Done + data = NULL; + } + + // Not stored anywhere else so need to regenerate + trw_layer_calculate_bounds_waypoints ( vtl ); + + return vtl; +} + +// Keep interesting hash function at least visible +/* +static guint strcase_hash(gconstpointer v) +{ + // 31 bit hash function + int i; + const gchar *t = v; + gchar s[128]; // malloc is too slow for reading big files + gchar *p = s; + + for (i = 0; (i < (sizeof(s)- 1)) && t[i]; i++) + p[i] = toupper(t[i]); + p[i] = '\0'; + + p = s; + guint32 h = *p; + if (h) { + for (p += 1; *p != '\0'; p++) + h = (h << 5) - h + *p; + } + + return h; +} +*/ + +static void pixbuf_free ( GdkPixbuf *pixbuf ) +{ + g_object_unref ( G_OBJECT(pixbuf) ); +} + +// Stick a 1 at the end of the function name to make it more unique +// thus more easily searchable in a simple text editor +static VikTrwLayer* trw_layer_new1 ( VikViewport *vvp ) +{ + VikTrwLayer *rv = VIK_TRW_LAYER ( g_object_new ( VIK_TRW_LAYER_TYPE, NULL ) ); + vik_layer_set_type ( VIK_LAYER(rv), VIK_LAYER_TRW ); + + // It's not entirely clear the benefits of hash tables usage here - possibly the simplicity of first implementation for unique names + // Now with the name of the item stored as part of the item - these tables are effectively straightforward lists + + // For this reworking I've choosen to keep the use of hash tables since for the expected data sizes + // - even many hundreds of waypoints and tracks is quite small in the grand scheme of things, + // and with normal PC processing capabilities - it has negligibile performance impact + // This also minimized the amount of rework - as the management of the hash tables already exists. + + // The hash tables are indexed by simple integers acting as a UUID hash, which again shouldn't affect performance much + // we have to maintain a uniqueness (as before when multiple names where not allowed), + // this is to ensure it refers to the same item in the data structures used on the viewport and on the layers panel + + rv->waypoints = g_hash_table_new_full ( g_direct_hash, g_direct_equal, NULL, (GDestroyNotify) vik_waypoint_free ); + rv->waypoints_iters = g_hash_table_new_full ( g_direct_hash, g_direct_equal, NULL, g_free ); + rv->tracks = g_hash_table_new_full ( g_direct_hash, g_direct_equal, NULL, (GDestroyNotify) vik_track_free ); + rv->tracks_iters = g_hash_table_new_full ( g_direct_hash, g_direct_equal, NULL, g_free ); + rv->routes = g_hash_table_new_full ( g_direct_hash, g_direct_equal, NULL, (GDestroyNotify) vik_track_free ); + rv->routes_iters = g_hash_table_new_full ( g_direct_hash, g_direct_equal, NULL, g_free ); + + rv->image_cache = g_hash_table_new_full ( g_str_hash, g_str_equal, NULL, (GDestroyNotify) pixbuf_free ); // Must be performed before set_params via set_defaults + + vik_layer_set_defaults ( VIK_LAYER(rv), vvp ); + + // Param settings that are not available via the GUI + // Force to on after processing params (which defaults them to off with a zero value) + rv->waypoints_visible = rv->tracks_visible = rv->routes_visible = TRUE; + + rv->metadata = vik_trw_metadata_new (); + rv->draw_sync_done = TRUE; + rv->draw_sync_do = TRUE; + rv->coord_mode = VIK_COORD_LATLON; + + // Everything else is 0, FALSE or NULL + + return rv; +} + + +static void trw_layer_free ( VikTrwLayer *trwlayer ) +{ + g_hash_table_destroy(trwlayer->waypoints); + g_hash_table_destroy(trwlayer->waypoints_iters); + g_hash_table_destroy(trwlayer->tracks); + g_hash_table_destroy(trwlayer->tracks_iters); + g_hash_table_destroy(trwlayer->routes); + g_hash_table_destroy(trwlayer->routes_iters); + + /* ODC: replace with GArray */ + trw_layer_free_track_gcs ( trwlayer ); + + if ( trwlayer->wp_right_click_menu ) + g_object_ref_sink ( G_OBJECT(trwlayer->wp_right_click_menu) ); + + if ( trwlayer->track_right_click_menu ) + g_object_ref_sink ( G_OBJECT(trwlayer->track_right_click_menu) ); + + if ( trwlayer->tracklabellayout != NULL) + g_object_unref ( G_OBJECT ( trwlayer->tracklabellayout ) ); + + if ( trwlayer->wplabellayout != NULL) + g_object_unref ( G_OBJECT ( trwlayer->wplabellayout ) ); + + if ( trwlayer->waypoint_gc != NULL ) + g_object_unref ( G_OBJECT ( trwlayer->waypoint_gc ) ); + + if ( trwlayer->waypoint_text_gc != NULL ) + g_object_unref ( G_OBJECT ( trwlayer->waypoint_text_gc ) ); + + if ( trwlayer->waypoint_bg_gc != NULL ) + g_object_unref ( G_OBJECT ( trwlayer->waypoint_bg_gc ) ); + + g_free ( trwlayer->wp_fsize_str ); + g_free ( trwlayer->track_fsize_str ); + + if ( trwlayer->tpwin != NULL ) + gtk_widget_destroy ( GTK_WIDGET(trwlayer->tpwin) ); + + if ( trwlayer->tracks_analysis_dialog != NULL ) + gtk_widget_destroy ( GTK_WIDGET(trwlayer->tracks_analysis_dialog) ); + + g_hash_table_destroy ( trwlayer->image_cache ); + + g_free ( trwlayer->external_file ); + g_free ( trwlayer->external_dirpath ); + + if ( trwlayer->crosshair_cursor ) + { + gdk_cursor_unref ( trwlayer->crosshair_cursor ); + trwlayer->crosshair_cursor = NULL; + } +} + +static void init_drawing_params ( struct DrawingParams *dp, VikTrwLayer *vtl, VikViewport *vp, gboolean highlight ) +{ + dp->vtl = vtl; + dp->vp = vp; + dp->highlight = highlight; + dp->vw = (VikWindow *)VIK_GTK_WINDOW_FROM_LAYER(dp->vtl); + dp->xmpp = vik_viewport_get_xmpp ( vp ); + dp->ympp = vik_viewport_get_ympp ( vp ); + dp->width = vik_viewport_get_width ( vp ); + dp->height = vik_viewport_get_height ( vp ); + dp->cc = vtl->drawdirections_size*cos(DEG2RAD(45)); // Calculate once per vtl update - even if not used + dp->ss = vtl->drawdirections_size*sin(DEG2RAD(45)); // Calculate once per vtl update - even if not used + + dp->center = vik_viewport_get_center ( vp ); + dp->one_zone = vik_viewport_is_one_zone ( vp ); /* false if some other projection besides UTM */ + dp->lat_lon = vik_viewport_get_coord_mode ( vp ) == VIK_COORD_LATLON; + + if ( dp->one_zone ) + { + gint w2, h2; + w2 = dp->xmpp * (dp->width / 2) + 1600 / dp->xmpp; + h2 = dp->ympp * (dp->height / 2) + 1600 / dp->ympp; + /* leniency -- for tracks. Obviously for waypoints this SHOULD be a lot smaller */ + + dp->ce1 = dp->center->east_west-w2; + dp->ce2 = dp->center->east_west+w2; + dp->cn1 = dp->center->north_south-h2; + dp->cn2 = dp->center->north_south+h2; + } else if ( dp->lat_lon ) { + VikCoord upperleft, bottomright; + /* quick & dirty calculation; really want to check all corners due to lat/lon smaller at top in northern hemisphere */ + /* this also DOESN'T WORK if you are crossing 180/-180 lon. I don't plan to in the near future... */ + vik_viewport_screen_to_coord ( vp, -500, -500, &upperleft ); + vik_viewport_screen_to_coord ( vp, dp->width+500, dp->height+500, &bottomright ); + dp->ce1 = upperleft.east_west; + dp->ce2 = bottomright.east_west; + dp->cn1 = bottomright.north_south; + dp->cn2 = upperleft.north_south; + } + + dp->bbox = vik_viewport_get_bbox ( vp ); +} + +/* + * Determine the colour of the trackpoint (and/or trackline) relative to the average speed + * Here a simple traffic like light colour system is used: + * . slow points are red + * . average is yellow + * . fast points are green + */ +static gint track_section_colour_by_speed ( VikTrwLayer *vtl, VikTrackpoint *tp1, VikTrackpoint *tp2, gdouble average_speed, gdouble low_speed, gdouble high_speed ) +{ + gdouble rv = 0; + if ( tp1->has_timestamp && tp2->has_timestamp ) { + if ( average_speed > 0 ) { + rv = ( vik_coord_diff ( &(tp1->coord), &(tp2->coord) ) / (tp1->timestamp - tp2->timestamp) ); + if ( rv < low_speed ) + return VIK_TRW_LAYER_TRACK_GC_SLOW; + else if ( rv > high_speed ) + return VIK_TRW_LAYER_TRACK_GC_FAST; + else + return VIK_TRW_LAYER_TRACK_GC_AVER; + } + } + return VIK_TRW_LAYER_TRACK_GC_BLACK; +} + +static void draw_utm_skip_insignia ( VikViewport *vvp, GdkGC *gc, gint x, gint y ) +{ + vik_viewport_draw_line ( vvp, gc, x+5, y, x-5, y ); + vik_viewport_draw_line ( vvp, gc, x, y+5, x, y-5 ); + vik_viewport_draw_line ( vvp, gc, x+5, y+5, x-5, y-5 ); + vik_viewport_draw_line ( vvp, gc, x+5, y-5, x-5, y+5 ); +} + + +static void trw_layer_draw_track_label ( gchar *name, gchar *fgcolour, gchar *bgcolour, struct DrawingParams *dp, VikCoord *coord ) +{ + gchar *label_markup = g_strdup_printf ( "%s", fgcolour, bgcolour, dp->vtl->track_fsize_str, name ); + + if ( pango_parse_markup ( label_markup, -1, 0, NULL, NULL, NULL, NULL ) ) + pango_layout_set_markup ( dp->vtl->tracklabellayout, label_markup, -1 ); + else + // Fallback if parse failure + pango_layout_set_text ( dp->vtl->tracklabellayout, name, -1 ); + + g_free ( label_markup ); + + gint label_x, label_y; + gint width, height; + pango_layout_get_pixel_size ( dp->vtl->tracklabellayout, &width, &height ); + + vik_viewport_coord_to_screen ( dp->vp, coord, &label_x, &label_y ); + vik_viewport_draw_layout ( dp->vp, dp->vtl->track_bg_gc, label_x-width/2, label_y-height/2, dp->vtl->tracklabellayout ); +} + +/** + * distance_in_preferred_units: + * @dist: The source distance in standard SI Units (i.e. metres) + * + * TODO: This is a generic function that could be moved into globals.c or utils.c + * + * Probably best used if you have a only few conversions to perform. + * However if doing many points (such as on all points along a track) then this may be a bit slow, + * since it will be doing the preference check on each call + * + * Returns: The distance in the units as specified by the preferences + */ +static gdouble distance_in_preferred_units ( gdouble dist ) +{ + gdouble mydist; + vik_units_distance_t dist_units = a_vik_get_units_distance (); + switch (dist_units) { + case VIK_UNITS_DISTANCE_MILES: + mydist = VIK_METERS_TO_MILES(dist); + break; + case VIK_UNITS_DISTANCE_NAUTICAL_MILES: + mydist = VIK_METERS_TO_NAUTICAL_MILES(dist); + break; + // VIK_UNITS_DISTANCE_KILOMETRES: + default: + mydist = dist/1000.0; + break; + } + return mydist; +} + +/** + * trw_layer_draw_dist_labels: + * + * Draw a few labels along a track at nicely seperated distances + * This might slow things down if there's many tracks being displayed with this on. + */ +static void trw_layer_draw_dist_labels ( struct DrawingParams *dp, VikTrack *trk, gboolean drawing_highlight ) +{ + static const gdouble chunksd[] = {0.25, 0.5, 1.0, 2.0, 5.0, 10.0, 15.0, 20.0, + 25.0, 40.0, 50.0, 75.0, 100.0, + 150.0, 200.0, 250.0, 500.0, 1000.0}; + + gdouble dist = vik_track_get_length_including_gaps ( trk ) / (trk->max_number_dist_labels+1); + + // Convert to specified unit to find the friendly breakdown value + dist = distance_in_preferred_units ( dist ); + + gint index = 0; + gint i=0; + for ( i = 0; i < G_N_ELEMENTS(chunksd); i++ ) { + if ( chunksd[i] > dist ) { + index = i; + dist = chunksd[index]; + break; + } + } + + vik_units_distance_t dist_units = a_vik_get_units_distance (); + + for ( i = 1; i < trk->max_number_dist_labels+1; i++ ) { + gdouble dist_i = dist * i; + + // Convert distance back into metres for use in finding a trackpoint + switch (dist_units) { + case VIK_UNITS_DISTANCE_MILES: + dist_i = VIK_MILES_TO_METERS(dist_i); + break; + case VIK_UNITS_DISTANCE_NAUTICAL_MILES: + dist_i = VIK_NAUTICAL_MILES_TO_METERS(dist_i); + break; + // VIK_UNITS_DISTANCE_KILOMETRES: + default: + dist_i = dist_i*1000.0; + break; + } + + gdouble dist_current = 0.0; + VikTrackpoint *tp_current = vik_track_get_tp_by_dist ( trk, dist_i, FALSE, &dist_current ); + gdouble dist_next = 0.0; + VikTrackpoint *tp_next = vik_track_get_tp_by_dist ( trk, dist_i, TRUE, &dist_next ); + + gdouble dist_between_tps = fabs (dist_next - dist_current); + gdouble ratio = 0.0; + // Prevent division by 0 errors + if ( dist_between_tps > 0.0 ) + ratio = fabs(dist_i-dist_current)/dist_between_tps; + + if ( tp_current && tp_next ) { + // Construct the name based on the distance value + gchar *name; + gchar *units; + switch (dist_units) { + case VIK_UNITS_DISTANCE_MILES: + units = g_strdup ( _("miles") ); + break; + case VIK_UNITS_DISTANCE_NAUTICAL_MILES: + units = g_strdup ( _("NM") ); + break; + // VIK_UNITS_DISTANCE_KILOMETRES: + default: + units = g_strdup ( _("km") ); + break; + } + + // Convert for display + dist_i = distance_in_preferred_units ( dist_i ); + + // Make the precision of the output related to the unit size. + if ( index == 0 ) + name = g_strdup_printf ( "%.2f %s", dist_i, units); + else if ( index == 1 ) + name = g_strdup_printf ( "%.1f %s", dist_i, units); + else + name = g_strdup_printf ( "%d %s", (gint)round(dist_i), units); // TODO single vs plurals + g_free ( units ); + + struct LatLon ll_current, ll_next; + vik_coord_to_latlon ( &tp_current->coord, &ll_current ); + vik_coord_to_latlon ( &tp_next->coord, &ll_next ); + + // positional interpolation + // Using a simple ratio - may not be perfectly correct due to lat/long projections + // but should be good enough over the small scale that I anticipate usage on + struct LatLon ll_new = { ll_current.lat + (ll_next.lat-ll_current.lat)*ratio, + ll_current.lon + (ll_next.lon-ll_current.lon)*ratio }; + VikCoord coord; + vik_coord_load_from_latlon ( &coord, dp->vtl->coord_mode, &ll_new ); + + gchar *fgcolour; + if ( dp->vtl->drawmode == DRAWMODE_BY_TRACK ) + fgcolour = gdk_color_to_string ( &(trk->color) ); + else + fgcolour = gdk_color_to_string ( &(dp->vtl->track_color) ); + + // if highlight mode on, then colour the background in the highlight colour + gchar *bgcolour; + if ( drawing_highlight ) + bgcolour = g_strdup ( vik_viewport_get_highlight_color ( dp->vp ) ); + else + bgcolour = gdk_color_to_string ( &(dp->vtl->track_bg_color) ); + + trw_layer_draw_track_label ( name, fgcolour, bgcolour, dp, &coord ); + + g_free ( fgcolour ); + g_free ( bgcolour ); + g_free ( name ); + } + } +} + +/** + * trw_layer_draw_track_name_labels: + * + * Draw a label (or labels) for the track name somewhere depending on the track's properties + */ +static void trw_layer_draw_track_name_labels ( struct DrawingParams *dp, VikTrack *trk, gboolean drawing_highlight ) +{ + gchar *fgcolour; + if ( dp->vtl->drawmode == DRAWMODE_BY_TRACK ) + fgcolour = gdk_color_to_string ( &(trk->color) ); + else + fgcolour = gdk_color_to_string ( &(dp->vtl->track_color) ); + + // if highlight mode on, then colour the background in the highlight colour + gchar *bgcolour; + if ( drawing_highlight ) + bgcolour = g_strdup ( vik_viewport_get_highlight_color ( dp->vp ) ); + else + bgcolour = gdk_color_to_string ( &(dp->vtl->track_bg_color) ); + + gchar *ename = g_markup_escape_text ( trk->name, -1 ); + + if ( trk->draw_name_mode == TRACK_DRAWNAME_START_END_CENTRE || + trk->draw_name_mode == TRACK_DRAWNAME_CENTRE ) { + struct LatLon average, maxmin[2] = { {0,0}, {0,0} }; + trw_layer_find_maxmin_tracks ( NULL, trk, maxmin ); + average.lat = (maxmin[0].lat+maxmin[1].lat)/2; + average.lon = (maxmin[0].lon+maxmin[1].lon)/2; + VikCoord coord; + vik_coord_load_from_latlon ( &coord, dp->vtl->coord_mode, &average ); + + trw_layer_draw_track_label ( ename, fgcolour, bgcolour, dp, &coord ); + } + + if ( trk->draw_name_mode == TRACK_DRAWNAME_CENTRE ) + // No other labels to draw + return; + + VikTrackpoint *tp_end = vik_track_get_tp_last ( trk ); + if ( !tp_end ) + return; + VikTrackpoint *tp_begin = vik_track_get_tp_first ( trk ); + if ( !tp_begin ) + return; + VikCoord begin_coord = tp_begin->coord; + VikCoord end_coord = tp_end->coord; + + gboolean done_start_end = FALSE; + + if ( trk->draw_name_mode == TRACK_DRAWNAME_START_END || + trk->draw_name_mode == TRACK_DRAWNAME_START_END_CENTRE ) { + + // This number can be configured via the settings if you really want to change it + gdouble distance_diff; + if ( ! a_settings_get_double ( "trackwaypoint_start_end_distance_diff", &distance_diff ) ) + distance_diff = 100.0; // Metres + + if ( vik_coord_diff ( &begin_coord, &end_coord ) < distance_diff ) { + // Start and end 'close' together so only draw one label at an average location + gint x1, x2, y1, y2; + vik_viewport_coord_to_screen ( dp->vp, &begin_coord, &x1, &y1); + vik_viewport_coord_to_screen ( dp->vp, &end_coord, &x2, &y2); + VikCoord av_coord; + vik_viewport_screen_to_coord ( dp->vp, (x1 + x2) / 2, (y1 + y2) / 2, &av_coord ); + + gchar *name = g_strdup_printf ( "%s: %s", ename, _("start/end") ); + trw_layer_draw_track_label ( name, fgcolour, bgcolour, dp, &av_coord ); + g_free ( name ); + + done_start_end = TRUE; + } + } + + if ( ! done_start_end ) { + if ( trk->draw_name_mode == TRACK_DRAWNAME_START || + trk->draw_name_mode == TRACK_DRAWNAME_START_END || + trk->draw_name_mode == TRACK_DRAWNAME_START_END_CENTRE ) { + gchar *name_start = g_strdup_printf ( "%s: %s", ename, _("start") ); + trw_layer_draw_track_label ( name_start, fgcolour, bgcolour, dp, &begin_coord ); + g_free ( name_start ); + } + // Don't draw end label if this is the one being created + if ( trk != dp->vtl->current_track ) { + if ( trk->draw_name_mode == TRACK_DRAWNAME_END || + trk->draw_name_mode == TRACK_DRAWNAME_START_END || + trk->draw_name_mode == TRACK_DRAWNAME_START_END_CENTRE ) { + gchar *name_end = g_strdup_printf ( "%s: %s", ename, _("end") ); + trw_layer_draw_track_label ( name_end, fgcolour, bgcolour, dp, &end_coord ); + g_free ( name_end ); + } + } + } + + g_free ( fgcolour ); + g_free ( bgcolour ); + g_free ( ename ); +} + + +/** + * trw_layer_draw_point_names: + * + * Draw a point labels along a track + * This might slow things down if there's many tracks being displayed with this on. + */ +static void trw_layer_draw_point_names ( struct DrawingParams *dp, VikTrack *trk, gboolean drawing_highlight ) +{ + GList *list = trk->trackpoints; + if (!list) return; + VikTrackpoint *tp = VIK_TRACKPOINT(list->data); + gchar *fgcolour; + if ( dp->vtl->drawmode == DRAWMODE_BY_TRACK ) + fgcolour = gdk_color_to_string ( &(trk->color) ); + else + fgcolour = gdk_color_to_string ( &(dp->vtl->track_color) ); + gchar *bgcolour; + if ( drawing_highlight ) + bgcolour = g_strdup ( vik_viewport_get_highlight_color ( dp->vp ) ); + else + bgcolour = gdk_color_to_string ( &(dp->vtl->track_bg_color) ); + if ( tp->name ) + trw_layer_draw_track_label ( tp->name, fgcolour, bgcolour, dp, &tp->coord ); + while ((list = g_list_next(list))) + { + tp = VIK_TRACKPOINT(list->data); + if ( tp->name ) + trw_layer_draw_track_label ( tp->name, fgcolour, bgcolour, dp, &tp->coord ); + }; + g_free ( fgcolour ); + g_free ( bgcolour ); +} + +static void trw_layer_draw_track ( const gpointer id, VikTrack *track, struct DrawingParams *dp, gboolean draw_track_outline ) +{ + if ( ! track->visible ) + return; + + /* TODO: this function is a mess, get rid of any redundancy */ + GList *list = track->trackpoints; + GdkGC *main_gc; + gboolean useoldvals = TRUE; + + gboolean drawpoints; + gboolean drawstops; + gboolean drawelevation; + gdouble min_alt, max_alt, alt_diff = 0; + + const guint8 tp_size_reg = dp->vtl->drawpoints_size; + const guint8 tp_size_cur = dp->vtl->drawpoints_size*2; + guint8 tp_size; + + if ( dp->vtl->drawelevation ) { + if ( ( drawelevation = vik_track_get_minmax_alt ( track, &min_alt, &max_alt ) ) ) + alt_diff = max_alt - min_alt; + } + + /* admittedly this is not an efficient way to do it because we go through the whole GC thing all over... */ + if ( dp->vtl->bg_line_thickness && !draw_track_outline ) + trw_layer_draw_track ( id, track, dp, TRUE ); + + if ( draw_track_outline ) + drawpoints = drawstops = FALSE; + else { + drawpoints = dp->vtl->drawpoints; + drawstops = dp->vtl->drawstops; + } + + gboolean drawing_highlight = FALSE; + /* Current track - used for creation */ + if ( track == dp->vtl->current_track ) + main_gc = dp->vtl->current_track_gc; + else { + if ( dp->highlight ) { + /* Draw all tracks of the layer in special colour + NB this supercedes the drawmode */ + main_gc = vik_viewport_get_gc_highlight (dp->vp); + drawing_highlight = TRUE; + } + if ( !drawing_highlight ) { + // Still need to figure out the gc according to the drawing mode: + switch ( dp->vtl->drawmode ) { + case DRAWMODE_BY_TRACK: + if ( dp->vtl->track_1color_gc ) + g_object_unref ( dp->vtl->track_1color_gc ); + dp->vtl->track_1color_gc = vik_viewport_new_gc_from_color ( dp->vp, &track->color, dp->vtl->line_thickness ); + main_gc = dp->vtl->track_1color_gc; + break; + default: + // Mostly for DRAWMODE_ALL_SAME_COLOR + // but includes DRAWMODE_BY_SPEED, main_gc is set later on as necessary + main_gc = g_array_index(dp->vtl->track_gc, GdkGC *, VIK_TRW_LAYER_TRACK_GC_SINGLE); + break; + } + } + } + + if (list) { + int x, y, oldx, oldy; + VikTrackpoint *tp = VIK_TRACKPOINT(list->data); + + tp_size = (list == dp->vtl->current_tpl) ? tp_size_cur : tp_size_reg; + + vik_viewport_coord_to_screen ( dp->vp, &(tp->coord), &x, &y ); + + // Draw the first point as something a bit different from the normal points + // ATM it's slightly bigger and a triangle + if ( drawpoints ) { + GdkPoint trian[3] = { { x, y-(3*tp_size) }, { x-(2*tp_size), y+(2*tp_size) }, {x+(2*tp_size), y+(2*tp_size)} }; + vik_viewport_draw_polygon ( dp->vp, main_gc, TRUE, trian, 3 ); + } + + oldx = x; + oldy = y; + + gdouble average_speed = 0.0; + gdouble low_speed = 0.0; + gdouble high_speed = 0.0; + // If necessary calculate these values - which is done only once per track redraw + if ( dp->vtl->drawmode == DRAWMODE_BY_SPEED ) { + // the percentage factor away from the average speed determines transistions between the levels + average_speed = vik_track_get_average_speed_moving(track, dp->vtl->stop_length); + low_speed = average_speed - (average_speed*(dp->vtl->track_draw_speed_factor/100.0)); + high_speed = average_speed + (average_speed*(dp->vtl->track_draw_speed_factor/100.0)); + } + + while ((list = g_list_next(list))) + { + tp = VIK_TRACKPOINT(list->data); + tp_size = (list == dp->vtl->current_tpl) ? tp_size_cur : tp_size_reg; + + VikTrackpoint *tp2 = VIK_TRACKPOINT(list->prev->data); + // See if in a different lat/lon 'quadrant' so don't draw massively long lines (presumably wrong way around the Earth) + // Mainly to prevent wrong lines drawn when a track crosses the 180 degrees East-West longitude boundary + // (since vik_viewport_draw_line() only copes with pixel value and has no concept of the globe) + if ( dp->lat_lon && + (( tp2->coord.east_west < -90.0 && tp->coord.east_west > 90.0 ) || + ( tp2->coord.east_west > 90.0 && tp->coord.east_west < -90.0 )) ) { + useoldvals = FALSE; + continue; + } + /* check some stuff -- but only if we're in UTM and there's only ONE ZONE; or lat lon */ + if ( (!dp->one_zone && !dp->lat_lon) || /* UTM & zones; do everything */ + ( ((!dp->one_zone) || tp->coord.utm_zone == dp->center->utm_zone) && /* only check zones if UTM & one_zone */ + tp->coord.east_west < dp->ce2 && tp->coord.east_west > dp->ce1 && /* both UTM and lat lon */ + tp->coord.north_south > dp->cn1 && tp->coord.north_south < dp->cn2 ) ) + { + vik_viewport_coord_to_screen ( dp->vp, &(tp->coord), &x, &y ); + + /* + * If points are the same in display coordinates, don't draw. + */ + if ( useoldvals && x == oldx && y == oldy ) + { + // Still need to process points to ensure 'stops' are drawn if required + if ( drawstops && drawpoints && ! draw_track_outline && list->next && + (VIK_TRACKPOINT(list->next->data)->timestamp - VIK_TRACKPOINT(list->data)->timestamp > dp->vtl->stop_length) ) + vik_viewport_draw_arc ( dp->vp, g_array_index(dp->vtl->track_gc, GdkGC *, VIK_TRW_LAYER_TRACK_GC_STOP), TRUE, x-(3*tp_size), y-(3*tp_size), 6*tp_size, 6*tp_size, 0, 360*64 ); + + goto skip; + } + + if ( drawpoints || dp->vtl->drawlines ) { + // setup main_gc for both point and line drawing + if ( !drawing_highlight && (dp->vtl->drawmode == DRAWMODE_BY_SPEED) ) { + main_gc = g_array_index(dp->vtl->track_gc, GdkGC *, track_section_colour_by_speed ( dp->vtl, tp, tp2, average_speed, low_speed, high_speed ) ); + } + } + + if ( drawpoints && ! draw_track_outline ) + { + + if ( list->next ) { + /* + * The concept of drawing stops is that a trackpoint + * that is if the next trackpoint has a timestamp far into + * the future, we draw a circle of 6x trackpoint size, + * instead of a rectangle of 2x trackpoint size. + * This is drawn first so the trackpoint will be drawn on top + */ + /* stops */ + if ( drawstops && VIK_TRACKPOINT(list->next->data)->timestamp - VIK_TRACKPOINT(list->data)->timestamp > dp->vtl->stop_length ) + /* Stop point. Draw 6x circle. Always in redish colour */ + vik_viewport_draw_arc ( dp->vp, g_array_index(dp->vtl->track_gc, GdkGC *, VIK_TRW_LAYER_TRACK_GC_STOP), TRUE, x-(3*tp_size), y-(3*tp_size), 6*tp_size, 6*tp_size, 0, 360*64 ); + + /* Regular point - draw 2x square. */ + vik_viewport_draw_rectangle ( dp->vp, main_gc, TRUE, x-tp_size, y-tp_size, 2*tp_size, 2*tp_size ); + } + else + /* Final point - draw 4x circle. */ + vik_viewport_draw_arc ( dp->vp, main_gc, TRUE, x-(2*tp_size), y-(2*tp_size), 4*tp_size, 4*tp_size, 0, 360*64 ); + } + + if ((!tp->newsegment) && (dp->vtl->drawlines)) + { + + /* UTM only: zone check */ + if ( drawpoints && dp->vtl->coord_mode == VIK_COORD_UTM && tp->coord.utm_zone != dp->center->utm_zone ) + draw_utm_skip_insignia ( dp->vp, main_gc, x, y); + + if (!useoldvals) + vik_viewport_coord_to_screen ( dp->vp, &(tp2->coord), &oldx, &oldy ); + + if ( draw_track_outline ) { + vik_viewport_draw_line ( dp->vp, dp->vtl->track_bg_gc, oldx, oldy, x, y); + } + else { + + vik_viewport_draw_line ( dp->vp, main_gc, oldx, oldy, x, y); + + if ( dp->vtl->drawelevation && list->next && VIK_TRACKPOINT(list->next->data)->altitude != VIK_DEFAULT_ALTITUDE ) { + GdkPoint tmp[4]; + #define FIXALTITUDE(what) ((VIK_TRACKPOINT((what))->altitude-min_alt)/alt_diff*DRAW_ELEVATION_FACTOR*dp->vtl->elevation_factor/dp->xmpp) + + tmp[0].x = oldx; + tmp[0].y = oldy; + tmp[1].x = oldx; + tmp[1].y = oldy-FIXALTITUDE(list->data); + tmp[2].x = x; + tmp[2].y = y-FIXALTITUDE(list->next->data); + tmp[3].x = x; + tmp[3].y = y; + + GdkGC *tmp_gc; + if ( ((oldx - x) > 0 && (oldy - y) > 0) || ((oldx - x) < 0 && (oldy - y) < 0)) + tmp_gc = gtk_widget_get_style(GTK_WIDGET(dp->vp))->light_gc[3]; + else + tmp_gc = gtk_widget_get_style(GTK_WIDGET(dp->vp))->dark_gc[0]; + vik_viewport_draw_polygon ( dp->vp, tmp_gc, TRUE, tmp, 4); + + vik_viewport_draw_line ( dp->vp, main_gc, oldx, oldy-FIXALTITUDE(list->data), x, y-FIXALTITUDE(list->next->data)); + } + } + } + + if ( (!tp->newsegment) && dp->vtl->drawdirections ) { + // Draw an arrow at the mid point to show the direction of the track + // Code is a rework from vikwindow::draw_ruler() + gint midx = (oldx + x) / 2; + gint midy = (oldy + y) / 2; + + gdouble len = sqrt ( ((midx-oldx) * (midx-oldx)) + ((midy-oldy) * (midy-oldy)) ); + // Avoid divide by zero and ensure at least 1 pixel big + if ( len > 1 ) { + gdouble dx = (oldx - midx) / len; + gdouble dy = (oldy - midy) / len; + vik_viewport_draw_line ( dp->vp, main_gc, midx, midy, midx + (dx * dp->cc + dy * dp->ss), midy + (dy * dp->cc - dx * dp->ss) ); + vik_viewport_draw_line ( dp->vp, main_gc, midx, midy, midx + (dx * dp->cc - dy * dp->ss), midy + (dy * dp->cc + dx * dp->ss) ); + } + } + + skip: + oldx = x; + oldy = y; + useoldvals = TRUE; + } + else { + if (useoldvals && dp->vtl->drawlines && (!tp->newsegment)) + { + if ( dp->vtl->coord_mode != VIK_COORD_UTM || tp->coord.utm_zone == dp->center->utm_zone ) + { + vik_viewport_coord_to_screen ( dp->vp, &(tp->coord), &x, &y ); + + if ( !drawing_highlight && (dp->vtl->drawmode == DRAWMODE_BY_SPEED) ) { + main_gc = g_array_index(dp->vtl->track_gc, GdkGC *, track_section_colour_by_speed ( dp->vtl, tp, tp2, average_speed, low_speed, high_speed )); + } + + /* + * If points are the same in display coordinates, don't draw. + */ + if ( x != oldx || y != oldy ) + { + if ( draw_track_outline ) + vik_viewport_draw_line ( dp->vp, dp->vtl->track_bg_gc, oldx, oldy, x, y); + else + vik_viewport_draw_line ( dp->vp, main_gc, oldx, oldy, x, y); + } + } + else + { + /* + * If points are the same in display coordinates, don't draw. + */ + if ( x != oldx || y != oldy ) + { + vik_viewport_coord_to_screen ( dp->vp, &(tp2->coord), &x, &y ); + draw_utm_skip_insignia ( dp->vp, main_gc, x, y ); + } + } + } + useoldvals = FALSE; + } + } + + // Labels drawn after the trackpoints, so the labels are on top + if ( dp->vtl->track_draw_labels ) { + if ( track->max_number_dist_labels > 0 ) { + trw_layer_draw_dist_labels ( dp, track, drawing_highlight ); + } + trw_layer_draw_point_names (dp, track, drawing_highlight ); + + if ( track->draw_name_mode != TRACK_DRAWNAME_NO ) { + trw_layer_draw_track_name_labels ( dp, track, drawing_highlight ); + } + } + } +} + +static void trw_layer_draw_track_cb ( const gpointer id, VikTrack *track, struct DrawingParams *dp ) +{ + if ( BBOX_INTERSECT ( track->bbox, dp->bbox ) ) { + trw_layer_draw_track ( id, track, dp, FALSE ); + } +} + +static void trw_layer_draw_waypoint ( const gpointer id, VikWaypoint *wp, struct DrawingParams *dp ) +{ + if ( wp->visible ) + if ( (!dp->one_zone && !dp->lat_lon) || ( ( dp->lat_lon || wp->coord.utm_zone == dp->center->utm_zone ) && + wp->coord.east_west < dp->ce2 && wp->coord.east_west > dp->ce1 && + wp->coord.north_south > dp->cn1 && wp->coord.north_south < dp->cn2 ) ) + { + gint x, y; + vik_viewport_coord_to_screen ( dp->vp, &(wp->coord), &x, &y ); + + /* if in shrunken_cache, get that. If not, get and add to shrunken_cache */ + + if ( wp->image && dp->vtl->drawimages ) + { + if ( dp->vtl->image_alpha == 0) + return; + + GdkPixbuf *pixbuf = g_hash_table_lookup ( dp->vtl->image_cache, wp->image ); + if ( !pixbuf ) + { + gchar *image = wp->image; + GdkPixbuf *regularthumb = a_thumbnails_get ( wp->image ); + if ( ! regularthumb ) + { + regularthumb = a_thumbnails_get_default (); /* cache one 'not yet loaded' for all thumbs not loaded */ + image = "\x12\x00"; /* this shouldn't occur naturally. */ + } + if ( regularthumb ) + { + if ( dp->vtl->image_size == 128 ) + pixbuf = regularthumb; + else + { + pixbuf = a_thumbnails_scale_pixbuf(regularthumb, dp->vtl->image_size, dp->vtl->image_size); + g_object_unref ( G_OBJECT(regularthumb) ); + } + + // Apply alpha setting to the image before the pixbuf gets stored in the cache + if ( dp->vtl->image_alpha != 255 ) + pixbuf = ui_pixbuf_set_alpha ( pixbuf, dp->vtl->image_alpha ); + + /* needed so 'click picture' tool knows how big the pic is; we don't + * store it in the cache because they may have been freed already. */ + wp->image_width = gdk_pixbuf_get_width ( pixbuf ); + wp->image_height = gdk_pixbuf_get_height ( pixbuf ); + + if ( g_hash_table_size(dp->vtl->image_cache) < dp->vtl->image_cache_size ) + g_hash_table_insert ( dp->vtl->image_cache, image, pixbuf ); + } + else + { + pixbuf = a_thumbnails_get_default (); /* thumbnail not yet loaded */ + } + } + if ( pixbuf ) + { + gint w, h; + w = gdk_pixbuf_get_width ( pixbuf ); + h = gdk_pixbuf_get_height ( pixbuf ); + + if ( x+(w/2) > 0 && y+(h/2) > 0 && x-(w/2) < dp->width && y-(h/2) < dp->height ) /* always draw within boundaries */ + { + if ( dp->highlight ) { + // Highlighted - so draw a little border around the chosen one + // single line seems a little weak so draw 2 of them + vik_viewport_draw_rectangle (dp->vp, vik_viewport_get_gc_highlight (dp->vp), FALSE, + x - (w/2) - 1, y - (h/2) - 1, w + 2, h + 2 ); + vik_viewport_draw_rectangle (dp->vp, vik_viewport_get_gc_highlight (dp->vp), FALSE, + x - (w/2) - 2, y - (h/2) - 2, w + 4, h + 4 ); + } + + vik_viewport_draw_pixbuf ( dp->vp, pixbuf, 0, 0, x - (w/2), y - (h/2), w, h ); + } + return; /* if failed to draw picture, default to drawing regular waypoint (below) */ + } + } + + // Draw appropriate symbol - either symbol image or simple types + if ( dp->vtl->wp_draw_symbols && wp->symbol && wp->symbol_pixbuf ) { + vik_viewport_draw_pixbuf ( dp->vp, wp->symbol_pixbuf, 0, 0, x - gdk_pixbuf_get_width(wp->symbol_pixbuf)/2, y - gdk_pixbuf_get_height(wp->symbol_pixbuf)/2, -1, -1 ); + } + else if ( wp == dp->vtl->current_wp ) { + switch ( dp->vtl->wp_symbol ) { + case WP_SYMBOL_FILLED_SQUARE: vik_viewport_draw_rectangle ( dp->vp, dp->vtl->waypoint_gc, TRUE, x - (dp->vtl->wp_size), y - (dp->vtl->wp_size), dp->vtl->wp_size*2, dp->vtl->wp_size*2 ); break; + case WP_SYMBOL_SQUARE: vik_viewport_draw_rectangle ( dp->vp, dp->vtl->waypoint_gc, FALSE, x - (dp->vtl->wp_size), y - (dp->vtl->wp_size), dp->vtl->wp_size*2, dp->vtl->wp_size*2 ); break; + case WP_SYMBOL_CIRCLE: vik_viewport_draw_arc ( dp->vp, dp->vtl->waypoint_gc, TRUE, x - dp->vtl->wp_size, y - dp->vtl->wp_size, dp->vtl->wp_size, dp->vtl->wp_size, 0, 360*64 ); break; + case WP_SYMBOL_X: vik_viewport_draw_line ( dp->vp, dp->vtl->waypoint_gc, x - dp->vtl->wp_size*2, y - dp->vtl->wp_size*2, x + dp->vtl->wp_size*2, y + dp->vtl->wp_size*2 ); + vik_viewport_draw_line ( dp->vp, dp->vtl->waypoint_gc, x - dp->vtl->wp_size*2, y + dp->vtl->wp_size*2, x + dp->vtl->wp_size*2, y - dp->vtl->wp_size*2 ); + default: break; + } + } + else { + switch ( dp->vtl->wp_symbol ) { + case WP_SYMBOL_FILLED_SQUARE: vik_viewport_draw_rectangle ( dp->vp, dp->vtl->waypoint_gc, TRUE, x - dp->vtl->wp_size/2, y - dp->vtl->wp_size/2, dp->vtl->wp_size, dp->vtl->wp_size ); break; + case WP_SYMBOL_SQUARE: vik_viewport_draw_rectangle ( dp->vp, dp->vtl->waypoint_gc, FALSE, x - dp->vtl->wp_size/2, y - dp->vtl->wp_size/2, dp->vtl->wp_size, dp->vtl->wp_size ); break; + case WP_SYMBOL_CIRCLE: vik_viewport_draw_arc ( dp->vp, dp->vtl->waypoint_gc, TRUE, x-dp->vtl->wp_size/2, y-dp->vtl->wp_size/2, dp->vtl->wp_size, dp->vtl->wp_size, 0, 360*64 ); break; + case WP_SYMBOL_X: vik_viewport_draw_line ( dp->vp, dp->vtl->waypoint_gc, x-dp->vtl->wp_size, y-dp->vtl->wp_size, x+dp->vtl->wp_size, y+dp->vtl->wp_size ); + vik_viewport_draw_line ( dp->vp, dp->vtl->waypoint_gc, x-dp->vtl->wp_size, y+dp->vtl->wp_size, x+dp->vtl->wp_size, y-dp->vtl->wp_size ); break; + default: break; + } + } + + if ( dp->vtl->drawlabels ) + { + /* thanks to the GPSDrive people (Fritz Ganter et al.) for hints on this part ... yah, I'm too lazy to study documentation */ + gint label_x, label_y; + gint width, height; + // Hopefully name won't break the markup (may need to sanitize - g_markup_escape_text()) + + // Could this stored in the waypoint rather than recreating each pass? + gchar *wp_label_markup = g_strdup_printf ( "%s", dp->vtl->wp_fsize_str, wp->name ); + + if ( pango_parse_markup ( wp_label_markup, -1, 0, NULL, NULL, NULL, NULL ) ) + pango_layout_set_markup ( dp->vtl->wplabellayout, wp_label_markup, -1 ); + else + // Fallback if parse failure + pango_layout_set_text ( dp->vtl->wplabellayout, wp->name, -1 ); + + g_free ( wp_label_markup ); + + pango_layout_get_pixel_size ( dp->vtl->wplabellayout, &width, &height ); + label_x = x - width/2; + if ( wp->symbol_pixbuf ) + label_y = y - height - 2 - gdk_pixbuf_get_height(wp->symbol_pixbuf)/2; + else + label_y = y - dp->vtl->wp_size - height - 2; + + /* if highlight mode on, then draw background text in highlight colour */ + if ( dp->highlight ) + vik_viewport_draw_rectangle ( dp->vp, vik_viewport_get_gc_highlight (dp->vp), TRUE, label_x - 1, label_y-1,width+2,height+2); + else + vik_viewport_draw_rectangle ( dp->vp, dp->vtl->waypoint_bg_gc, TRUE, label_x - 1, label_y-1,width+2,height+2); + vik_viewport_draw_layout ( dp->vp, dp->vtl->waypoint_text_gc, label_x, label_y, dp->vtl->wplabellayout ); + } + } +} + +static void trw_layer_draw_waypoint_cb ( gpointer id, VikWaypoint *wp, struct DrawingParams *dp ) +{ + if ( BBOX_INTERSECT ( dp->vtl->waypoints_bbox, dp->bbox ) ) { + trw_layer_draw_waypoint ( id, wp, dp ); + } +} + +static void trw_layer_draw_with_highlight ( VikTrwLayer *l, gpointer data, gboolean highlight ) +{ + static struct DrawingParams dp; + g_assert ( l != NULL ); + + init_drawing_params ( &dp, l, VIK_VIEWPORT(data), highlight ); + + if ( l->tracks_visible ) + g_hash_table_foreach ( l->tracks, (GHFunc) trw_layer_draw_track_cb, &dp ); + + if ( l->routes_visible ) + g_hash_table_foreach ( l->routes, (GHFunc) trw_layer_draw_track_cb, &dp ); + + if (l->waypoints_visible) + g_hash_table_foreach ( l->waypoints, (GHFunc) trw_layer_draw_waypoint_cb, &dp ); +} + +static void trw_layer_draw ( VikTrwLayer *l, gpointer data ) +{ + trw_ensure_layer_loaded ( l ); + // If this layer is to be highlighted - then don't draw now - as it will be drawn later on in the specific highlight draw stage + // This may seem slightly inefficient to test each time for every layer + // but for a layer with *lots* of tracks & waypoints this can save some effort by not drawing the items twice + if ( vik_viewport_get_draw_highlight ( (VikViewport*)data ) && + vik_window_get_selected_trw_layer ((VikWindow*)VIK_GTK_WINDOW_FROM_LAYER((VikLayer*)l)) == l ) + return; + trw_layer_draw_with_highlight ( l, data, FALSE ); +} + +void vik_trw_layer_draw_highlight ( VikTrwLayer *vtl, VikViewport *vvp ) +{ + // Check the layer for visibility (including all the parents visibilities) + if ( !vik_treeview_item_get_visible_tree (VIK_LAYER(vtl)->vt, &(VIK_LAYER(vtl)->iter)) ) + return; + trw_layer_draw_with_highlight ( vtl, vvp, TRUE ); +} + +/** + * vik_trw_layer_draw_highlight_item: + * + * Only handles a single track or waypoint ATM + * It assumes the track or waypoint belongs to the TRW Layer (it doesn't check this is the case) + */ +void vik_trw_layer_draw_highlight_item ( VikTrwLayer *vtl, VikTrack *trk, VikWaypoint *wpt, VikViewport *vvp ) +{ + // Check the layer for visibility (including all the parents visibilities) + if ( !vik_treeview_item_get_visible_tree (VIK_LAYER(vtl)->vt, &(VIK_LAYER(vtl)->iter)) ) + return; + + static struct DrawingParams dp; + init_drawing_params ( &dp, vtl, vvp, TRUE ); + + if ( trk ) { + gboolean draw = ( trk->is_route && vtl->routes_visible ) || ( !trk->is_route && vtl->tracks_visible ); + if ( draw ) + trw_layer_draw_track_cb ( NULL, trk, &dp ); + } + if ( vtl->waypoints_visible && wpt ) { + trw_layer_draw_waypoint_cb ( NULL, wpt, &dp ); + } +} + +/** + * vik_trw_layer_draw_highlight_items: + * + * Generally for drawing all tracks or routes or waypoints + * trks may be actually routes + * It assumes they belong to the TRW Layer (it doesn't check this is the case) + */ +void vik_trw_layer_draw_highlight_items ( VikTrwLayer *vtl, GHashTable *trks, GHashTable *wpts, VikViewport *vvp ) +{ + // Check the layer for visibility (including all the parents visibilities) + if ( !vik_treeview_item_get_visible_tree (VIK_LAYER(vtl)->vt, &(VIK_LAYER(vtl)->iter)) ) + return; + + static struct DrawingParams dp; + init_drawing_params ( &dp, vtl, vvp, TRUE ); + + if ( trks ) { + gboolean is_routes = (trks == vtl->routes); + gboolean draw = ( is_routes && vtl->routes_visible ) || ( !is_routes && vtl->tracks_visible ); + if ( draw ) + g_hash_table_foreach ( trks, (GHFunc) trw_layer_draw_track_cb, &dp ); + } + + if ( vtl->waypoints_visible && wpts ) + g_hash_table_foreach ( wpts, (GHFunc) trw_layer_draw_waypoint_cb, &dp ); +} + +static void trw_layer_free_track_gcs ( VikTrwLayer *vtl ) +{ + int i; + if ( vtl->track_bg_gc ) + { + g_object_unref ( vtl->track_bg_gc ); + vtl->track_bg_gc = NULL; + } + if ( vtl->track_1color_gc ) + { + g_object_unref ( vtl->track_1color_gc ); + vtl->track_1color_gc = NULL; + } + if ( vtl->current_track_gc ) + { + g_object_unref ( vtl->current_track_gc ); + vtl->current_track_gc = NULL; + } + if ( vtl->current_track_newpoint_gc ) + { + g_object_unref ( vtl->current_track_newpoint_gc ); + vtl->current_track_newpoint_gc = NULL; + } + + if ( ! vtl->track_gc ) + return; + for ( i = vtl->track_gc->len - 1; i >= 0; i-- ) + g_object_unref ( g_array_index ( vtl->track_gc, GObject *, i ) ); + g_array_free ( vtl->track_gc, TRUE ); + vtl->track_gc = NULL; +} + +static void trw_layer_edit_track_gcs ( VikTrwLayer *vtl, VikViewport *vp ) +{ + GdkGC *gc[ VIK_TRW_LAYER_TRACK_GC ]; + gint width = vtl->line_thickness; + + if ( vtl->track_gc ) + trw_layer_free_track_gcs ( vtl ); + + if ( vtl->track_bg_gc ) + g_object_unref ( vtl->track_bg_gc ); + vtl->track_bg_gc = vik_viewport_new_gc_from_color ( vp, &(vtl->track_bg_color), width + vtl->bg_line_thickness ); + + // Ensure new track drawing heeds line thickness setting + // however always have a minium of 2, as 1 pixel is really narrow + gint new_track_width = (vtl->line_thickness < 2) ? 2 : vtl->line_thickness; + + if ( vtl->current_track_gc ) + g_object_unref ( vtl->current_track_gc ); + vtl->current_track_gc = vik_viewport_new_gc ( vp, "#FF0000", new_track_width ); + gdk_gc_set_line_attributes ( vtl->current_track_gc, new_track_width, GDK_LINE_ON_OFF_DASH, GDK_CAP_ROUND, GDK_JOIN_ROUND ); + + // 'newpoint' gc is exactly the same as the current track gc + if ( vtl->current_track_newpoint_gc ) + g_object_unref ( vtl->current_track_newpoint_gc ); + vtl->current_track_newpoint_gc = vik_viewport_new_gc ( vp, "#FF0000", new_track_width ); + gdk_gc_set_line_attributes ( vtl->current_track_newpoint_gc, new_track_width, GDK_LINE_ON_OFF_DASH, GDK_CAP_ROUND, GDK_JOIN_ROUND ); + + vtl->track_gc = g_array_sized_new ( FALSE, FALSE, sizeof ( GdkGC * ), VIK_TRW_LAYER_TRACK_GC ); + + gc[VIK_TRW_LAYER_TRACK_GC_STOP] = vik_viewport_new_gc ( vp, "#874200", width ); + gc[VIK_TRW_LAYER_TRACK_GC_BLACK] = vik_viewport_new_gc ( vp, "#000000", width ); // black + + gc[VIK_TRW_LAYER_TRACK_GC_SLOW] = vik_viewport_new_gc ( vp, "#E6202E", width ); // red-ish + gc[VIK_TRW_LAYER_TRACK_GC_AVER] = vik_viewport_new_gc ( vp, "#D2CD26", width ); // yellow-ish + gc[VIK_TRW_LAYER_TRACK_GC_FAST] = vik_viewport_new_gc ( vp, "#2B8700", width ); // green-ish + + gc[VIK_TRW_LAYER_TRACK_GC_SINGLE] = vik_viewport_new_gc_from_color ( vp, &(vtl->track_color), width ); + + g_array_append_vals ( vtl->track_gc, gc, VIK_TRW_LAYER_TRACK_GC ); +} + +static VikTrwLayer* trw_layer_create ( VikViewport *vp ) +{ + VikTrwLayer *rv = trw_layer_new1 ( vp ); + vik_layer_rename ( VIK_LAYER(rv), vik_trw_layer_interface.name ); + + if ( vp == NULL || gtk_widget_get_window(GTK_WIDGET(vp)) == NULL ) { + /* early exit, as the rest is GUI related */ + return rv; + } + + rv->crosshair_cursor = gdk_cursor_new ( GDK_CROSSHAIR ); + + rv->wplabellayout = gtk_widget_create_pango_layout (GTK_WIDGET(vp), NULL); + pango_layout_set_font_description (rv->wplabellayout, gtk_widget_get_style(GTK_WIDGET(vp))->font_desc); + + rv->tracklabellayout = gtk_widget_create_pango_layout (GTK_WIDGET(vp), NULL); + pango_layout_set_font_description (rv->tracklabellayout, gtk_widget_get_style(GTK_WIDGET(vp))->font_desc); + + trw_layer_edit_track_gcs ( rv, vp ); + + rv->waypoint_gc = vik_viewport_new_gc_from_color ( vp, &(rv->waypoint_color), 2 ); + rv->waypoint_text_gc = vik_viewport_new_gc_from_color ( vp, &(rv->waypoint_text_color), 1 ); + rv->waypoint_bg_gc = vik_viewport_new_gc_from_color ( vp, &(rv->waypoint_bg_color), 1 ); + gdk_gc_set_function ( rv->waypoint_bg_gc, rv->wpbgand ); + + rv->coord_mode = vik_viewport_get_coord_mode ( vp ); + + rv->menu_selection = vik_layer_get_interface(VIK_LAYER(rv)->type)->menu_items_selection; + + // only set to false if load really needed + rv->external_loaded = TRUE; + + return rv; +} + +#define SMALL_ICON_SIZE 18 +/* + * Can accept a null symbol, and may return null value + */ +GdkPixbuf* get_wp_sym_small ( gchar *symbol ) +{ + GdkPixbuf* wp_icon = a_get_wp_sym (symbol); + // ATM a_get_wp_sym returns a cached icon, with the size dependent on the preferences. + // So needing a small icon for the treeview may need some resizing: + if ( wp_icon && gdk_pixbuf_get_width ( wp_icon ) != SMALL_ICON_SIZE ) + wp_icon = gdk_pixbuf_scale_simple ( wp_icon, SMALL_ICON_SIZE, SMALL_ICON_SIZE, GDK_INTERP_BILINEAR ); + return wp_icon; +} + +static void trw_layer_realize_track ( gpointer id, VikTrack *track, gpointer pass_along[5] ) +{ + GtkTreeIter *new_iter = g_malloc(sizeof(GtkTreeIter)); + + GdkPixbuf *pixbuf = NULL; + + if ( track->has_color ) { + pixbuf = gdk_pixbuf_new ( GDK_COLORSPACE_RGB, FALSE, 8, SMALL_ICON_SIZE, SMALL_ICON_SIZE ); + // Annoyingly the GdkColor.pixel does not give the correct color when passed to gdk_pixbuf_fill (even when alloc'ed) + // Here is some magic found to do the conversion + // http://www.cs.binghamton.edu/~sgreene/cs360-2011s/topics/gtk+-2.20.1/gtk/gtkcolorbutton.c + guint32 pixel = ((track->color.red & 0xff00) << 16) | + ((track->color.green & 0xff00) << 8) | + (track->color.blue & 0xff00); + + gdk_pixbuf_fill ( pixbuf, pixel ); + } + + time_t timestamp = 0; + VikTrackpoint *tpt = vik_track_get_tp_first(track); + if ( tpt && tpt->has_timestamp ) + timestamp = tpt->timestamp; + + vik_treeview_add_sublayer ( (VikTreeview *) pass_along[3], (GtkTreeIter *) pass_along[0], (GtkTreeIter *) pass_along[1], track->name, pass_along[2], id, GPOINTER_TO_INT (pass_along[4]), pixbuf, TRUE, timestamp ); + + if ( pixbuf ) + g_object_unref (pixbuf); + + *new_iter = *((GtkTreeIter *) pass_along[1]); + if ( track->is_route ) + g_hash_table_insert ( VIK_TRW_LAYER(pass_along[2])->routes_iters, id, new_iter ); + else + g_hash_table_insert ( VIK_TRW_LAYER(pass_along[2])->tracks_iters, id, new_iter ); + + if ( ! track->visible ) + vik_treeview_item_set_visible ( (VikTreeview *) pass_along[3], (GtkTreeIter *) pass_along[1], FALSE ); +} + +static void trw_layer_realize_waypoint ( gpointer id, VikWaypoint *wp, gpointer pass_along[5] ) +{ + GtkTreeIter *new_iter = g_malloc(sizeof(GtkTreeIter)); + + time_t timestamp = 0; + if ( wp->has_timestamp ) + timestamp = wp->timestamp; + + vik_treeview_add_sublayer ( (VikTreeview *) pass_along[3], (GtkTreeIter *) pass_along[0], (GtkTreeIter *) pass_along[1], wp->name, pass_along[2], id, GPOINTER_TO_UINT (pass_along[4]), get_wp_sym_small (wp->symbol), TRUE, timestamp ); + + *new_iter = *((GtkTreeIter *) pass_along[1]); + g_hash_table_insert ( VIK_TRW_LAYER(pass_along[2])->waypoints_iters, id, new_iter ); + + if ( ! wp->visible ) + vik_treeview_item_set_visible ( (VikTreeview *) pass_along[3], (GtkTreeIter *) pass_along[1], FALSE ); +} + +static void trw_layer_add_sublayer_tracks ( VikTrwLayer *vtl, VikTreeview *vt, GtkTreeIter *layer_iter ) +{ + vik_treeview_add_sublayer ( (VikTreeview *) vt, layer_iter, &(vtl->tracks_iter), _("Tracks"), vtl, NULL, VIK_TRW_LAYER_SUBLAYER_TRACKS, NULL, FALSE, 0 ); +} + +static void trw_layer_add_sublayer_waypoints ( VikTrwLayer *vtl, VikTreeview *vt, GtkTreeIter *layer_iter ) +{ + vik_treeview_add_sublayer ( (VikTreeview *) vt, layer_iter, &(vtl->waypoints_iter), _("Waypoints"), vtl, NULL, VIK_TRW_LAYER_SUBLAYER_WAYPOINTS, NULL, FALSE, 0 ); +} + +static void trw_layer_add_sublayer_routes ( VikTrwLayer *vtl, VikTreeview *vt, GtkTreeIter *layer_iter ) +{ + vik_treeview_add_sublayer ( (VikTreeview *) vt, layer_iter, &(vtl->routes_iter), _("Routes"), vtl, NULL, VIK_TRW_LAYER_SUBLAYER_ROUTES, NULL, FALSE, 0 ); +} + +static void trw_layer_realize ( VikTrwLayer *vtl, VikTreeview *vt, GtkTreeIter *layer_iter ) +{ + GtkTreeIter iter2; + gpointer pass_along[5] = { &(vtl->tracks_iter), &iter2, vtl, vt, GINT_TO_POINTER(VIK_TRW_LAYER_SUBLAYER_TRACK) }; + + if ( g_hash_table_size (vtl->tracks) > 0 ) { + trw_layer_add_sublayer_tracks ( vtl, vt , layer_iter ); + + g_hash_table_foreach ( vtl->tracks, (GHFunc) trw_layer_realize_track, pass_along ); + + vik_treeview_item_set_visible ( vt, &(vtl->tracks_iter), vtl->tracks_visible ); + } + + if ( g_hash_table_size (vtl->routes) > 0 ) { + trw_layer_add_sublayer_routes ( vtl, vt, layer_iter ); + + pass_along[0] = &(vtl->routes_iter); + pass_along[4] = GINT_TO_POINTER(VIK_TRW_LAYER_SUBLAYER_ROUTE); + + g_hash_table_foreach ( vtl->routes, (GHFunc) trw_layer_realize_track, pass_along ); + + vik_treeview_item_set_visible ( (VikTreeview *) vt, &(vtl->routes_iter), vtl->routes_visible ); + } + + if ( g_hash_table_size (vtl->waypoints) > 0 ) { + trw_layer_add_sublayer_waypoints ( vtl, vt, layer_iter ); + + pass_along[0] = &(vtl->waypoints_iter); + pass_along[4] = GINT_TO_POINTER(VIK_TRW_LAYER_SUBLAYER_WAYPOINT); + + g_hash_table_foreach ( vtl->waypoints, (GHFunc) trw_layer_realize_waypoint, pass_along ); + + vik_treeview_item_set_visible ( (VikTreeview *) vt, &(vtl->waypoints_iter), vtl->waypoints_visible ); + } + + trw_layer_verify_thumbnails ( vtl ); + + trw_layer_sort_all ( vtl ); + + trw_update_layer_icon ( vtl ); +} + +static gboolean trw_layer_sublayer_toggle_visible ( VikTrwLayer *l, gint subtype, gpointer sublayer ) +{ + switch ( subtype ) + { + case VIK_TRW_LAYER_SUBLAYER_TRACKS: return (l->tracks_visible ^= 1); + case VIK_TRW_LAYER_SUBLAYER_WAYPOINTS: return (l->waypoints_visible ^= 1); + case VIK_TRW_LAYER_SUBLAYER_ROUTES: return (l->routes_visible ^= 1); + case VIK_TRW_LAYER_SUBLAYER_TRACK: + { + VikTrack *t = g_hash_table_lookup ( l->tracks, sublayer ); + if (t) + return (t->visible ^= 1); + else + return TRUE; + } + case VIK_TRW_LAYER_SUBLAYER_WAYPOINT: + { + VikWaypoint *t = g_hash_table_lookup ( l->waypoints, sublayer ); + if (t) + return (t->visible ^= 1); + else + return TRUE; + } + case VIK_TRW_LAYER_SUBLAYER_ROUTE: + { + VikTrack *t = g_hash_table_lookup ( l->routes, sublayer ); + if (t) + return (t->visible ^= 1); + else + return TRUE; + } + default: break; + } + return TRUE; +} + +/* + * Return a property about tracks for this layer + */ +gint vik_trw_layer_get_property_tracks_line_thickness ( VikTrwLayer *vtl ) +{ + return vtl->line_thickness; +} + +/* + * Build up multiple routes information + */ +static void trw_layer_routes_tooltip ( const gpointer id, VikTrack *tr, gdouble *length ) +{ + *length = *length + vik_track_get_length (tr); +} + +// Structure to hold multiple track information for a layer +typedef struct { + gdouble length; + time_t start_time; + time_t end_time; + gint duration; +} tooltip_tracks; + +/* + * Build up layer multiple track information via updating the tooltip_tracks structure + */ +static void trw_layer_tracks_tooltip ( const gpointer id, VikTrack *tr, tooltip_tracks *tt ) +{ + tt->length = tt->length + vik_track_get_length (tr); + + // Ensure times are available + if ( tr->trackpoints && vik_track_get_tp_first(tr)->has_timestamp ) { + // Get trkpt only once - as using vik_track_get_tp_last() iterates whole track each time + VikTrackpoint *trkpt_last = vik_track_get_tp_last(tr); + if ( trkpt_last->has_timestamp ) { + time_t t1, t2; + t1 = vik_track_get_tp_first(tr)->timestamp; + t2 = trkpt_last->timestamp; + + // Assume never actually have a track with a time of 0 (1st Jan 1970) + // Hence initialize to the first 'proper' value + if ( tt->start_time == 0 ) + tt->start_time = t1; + if ( tt->end_time == 0 ) + tt->end_time = t2; + + // Update find the earliest / last times + if ( t1 < tt->start_time ) + tt->start_time = t1; + if ( t2 > tt->end_time ) + tt->end_time = t2; + + // Keep track of total time + // there maybe gaps within a track (eg segments) + // but this should be generally good enough for a simple indicator + tt->duration = tt->duration + (int)(t2-t1); + } + } +} + +/* + * Generate tooltip text for the layer. + * This is relatively complicated as it considers information for + * no tracks, a single track or multiple tracks + * (which may or may not have timing information) + */ +static const gchar* trw_layer_layer_tooltip ( VikTrwLayer *vtl ) +{ + gchar tbuf1[64]; + gchar tbuf2[64]; + gchar tbuf3[64]; + gchar tbuf4[10]; + tbuf1[0] = '\0'; + tbuf2[0] = '\0'; + tbuf3[0] = '\0'; + tbuf4[0] = '\0'; + + static gchar tmp_buf[128]; + tmp_buf[0] = '\0'; + + // For compact date format I'm using '%x' [The preferred date representation for the current locale without the time.] + + // Safety check - I think these should always be valid + if ( vtl->tracks && vtl->waypoints ) { + tooltip_tracks tt = { 0.0, 0, 0, 0 }; + g_hash_table_foreach ( vtl->tracks, (GHFunc) trw_layer_tracks_tooltip, &tt ); + + GDate* gdate_start = g_date_new (); + g_date_set_time_t (gdate_start, tt.start_time); + + GDate* gdate_end = g_date_new (); + g_date_set_time_t (gdate_end, tt.end_time); + + if ( g_date_compare (gdate_start, gdate_end) ) { + // Dates differ so print range on separate line + g_date_strftime (tbuf1, sizeof(tbuf1), "%x", gdate_start); + g_date_strftime (tbuf2, sizeof(tbuf2), "%x", gdate_end); + g_snprintf (tbuf3, sizeof(tbuf3), "%s to %s\n", tbuf1, tbuf2); + } + else { + // Same date so just show it and keep rest of text on the same line - provided it's a valid time! + if ( tt.start_time != 0 ) + g_date_strftime (tbuf3, sizeof(tbuf3), "%x: ", gdate_start); + } + + tbuf2[0] = '\0'; + if ( tt.length > 0.0 ) { + gdouble len_in_units; + + // Setup info dependent on distance units + switch ( a_vik_get_units_distance() ) { + case VIK_UNITS_DISTANCE_MILES: + g_snprintf (tbuf4, sizeof(tbuf4), "miles"); + len_in_units = VIK_METERS_TO_MILES(tt.length); + break; + case VIK_UNITS_DISTANCE_NAUTICAL_MILES: + g_snprintf (tbuf4, sizeof(tbuf4), "NM"); + len_in_units = VIK_METERS_TO_NAUTICAL_MILES(tt.length); + break; + default: + g_snprintf (tbuf4, sizeof(tbuf4), "kms"); + len_in_units = tt.length/1000.0; + break; + } + + // Timing information if available + tbuf1[0] = '\0'; + if ( tt.duration > 0 ) { + g_snprintf (tbuf1, sizeof(tbuf1), + _(" in %d:%02d hrs:mins"), + (int)(tt.duration/3600), (int)round(tt.duration/60.0)%60); + } + g_snprintf (tbuf2, sizeof(tbuf2), + _("\n%sTotal Length %.1f %s%s"), + tbuf3, len_in_units, tbuf4, tbuf1); + } + + tbuf1[0] = '\0'; + gdouble rlength = 0.0; + g_hash_table_foreach ( vtl->routes, (GHFunc) trw_layer_routes_tooltip, &rlength ); + if ( rlength > 0.0 ) { + gdouble len_in_units; + // Setup info dependent on distance units + switch ( a_vik_get_units_distance() ) { + case VIK_UNITS_DISTANCE_MILES: + g_snprintf (tbuf4, sizeof(tbuf4), "miles"); + len_in_units = VIK_METERS_TO_MILES(rlength); + break; + case VIK_UNITS_DISTANCE_NAUTICAL_MILES: + g_snprintf (tbuf4, sizeof(tbuf4), "NM"); + len_in_units = VIK_METERS_TO_NAUTICAL_MILES(rlength); + break; + default: + g_snprintf (tbuf4, sizeof(tbuf4), "kms"); + len_in_units = rlength/1000.0; + break; + } + g_snprintf (tbuf1, sizeof(tbuf1), _("\nTotal route length %.1f %s"), len_in_units, tbuf4); + } + + // Put together all the elements to form compact tooltip text + g_snprintf (tmp_buf, sizeof(tmp_buf), + _("Tracks: %d - Waypoints: %d - Routes: %d%s%s"), + g_hash_table_size (vtl->tracks), g_hash_table_size (vtl->waypoints), g_hash_table_size (vtl->routes), tbuf2, tbuf1); + + g_date_free (gdate_start); + g_date_free (gdate_end); + } + + return tmp_buf; +} + +static const gchar* trw_layer_sublayer_tooltip ( VikTrwLayer *l, gint subtype, gpointer sublayer ) +{ + switch ( subtype ) + { + case VIK_TRW_LAYER_SUBLAYER_TRACKS: + { + // Very simple tooltip - may expand detail in the future... + static gchar tmp_buf[32]; + g_snprintf (tmp_buf, sizeof(tmp_buf), + _("Tracks: %d"), + g_hash_table_size (l->tracks)); + return tmp_buf; + } + break; + case VIK_TRW_LAYER_SUBLAYER_ROUTES: + { + // Very simple tooltip - may expand detail in the future... + static gchar tmp_buf[32]; + g_snprintf (tmp_buf, sizeof(tmp_buf), + _("Routes: %d"), + g_hash_table_size (l->routes)); + return tmp_buf; + } + break; + + case VIK_TRW_LAYER_SUBLAYER_ROUTE: + // Same tooltip for a route + case VIK_TRW_LAYER_SUBLAYER_TRACK: + { + VikTrack *tr; + if ( subtype == VIK_TRW_LAYER_SUBLAYER_TRACK ) + tr = g_hash_table_lookup ( l->tracks, sublayer ); + else + tr = g_hash_table_lookup ( l->routes, sublayer ); + + if ( tr ) { + // Could be a better way of handling strings - but this works... + gchar time_buf1[20]; + gchar time_buf2[20]; + time_buf1[0] = '\0'; + time_buf2[0] = '\0'; + static gchar tmp_buf[100]; + // Compact info: Short date eg (11/20/99), duration and length + // Hopefully these are the things that are most useful and so promoted into the tooltip + if ( tr->trackpoints && vik_track_get_tp_first(tr)->has_timestamp ) { + // %x The preferred date representation for the current locale without the time. + strftime (time_buf1, sizeof(time_buf1), "%x: ", gmtime(&(vik_track_get_tp_first(tr)->timestamp))); + time_t dur = vik_track_get_duration ( tr, TRUE ); + if ( dur > 0 ) + g_snprintf ( time_buf2, sizeof(time_buf2), _("- %d:%02d hrs:mins"), (int)(dur/3600), (int)round(dur/60.0)%60 ); + } + // Get length and consider the appropriate distance units + gdouble tr_len = vik_track_get_length(tr); + vik_units_distance_t dist_units = a_vik_get_units_distance (); + switch (dist_units) { + case VIK_UNITS_DISTANCE_KILOMETRES: + g_snprintf (tmp_buf, sizeof(tmp_buf), _("%s%.1f km %s"), time_buf1, tr_len/1000.0, time_buf2); + break; + case VIK_UNITS_DISTANCE_MILES: + g_snprintf (tmp_buf, sizeof(tmp_buf), _("%s%.1f miles %s"), time_buf1, VIK_METERS_TO_MILES(tr_len), time_buf2); + break; + case VIK_UNITS_DISTANCE_NAUTICAL_MILES: + g_snprintf (tmp_buf, sizeof(tmp_buf), _("%s%.1f NM %s"), time_buf1, VIK_METERS_TO_NAUTICAL_MILES(tr_len), time_buf2); + break; + default: + break; + } + return tmp_buf; + } + } + break; + case VIK_TRW_LAYER_SUBLAYER_WAYPOINTS: + { + // Very simple tooltip - may expand detail in the future... + static gchar tmp_buf[32]; + g_snprintf (tmp_buf, sizeof(tmp_buf), + _("Waypoints: %d"), + g_hash_table_size (l->waypoints)); + return tmp_buf; + } + break; + case VIK_TRW_LAYER_SUBLAYER_WAYPOINT: + { + VikWaypoint *w = g_hash_table_lookup ( l->waypoints, sublayer ); + // NB It's OK to return NULL + if ( w ) { + if ( w->comment ) + return w->comment; + else + return w->description; + } + } + break; + default: break; + } + return NULL; +} + +#define VIK_SETTINGS_TRKPT_SELECTED_STATUSBAR_FORMAT "trkpt_selected_statusbar_format" + +/** + * set_statusbar_msg_info_trkpt: + * + * Function to show track point information on the statusbar + * Items displayed is controlled by the settings format code + */ +static void set_statusbar_msg_info_trkpt ( VikTrwLayer *vtl, VikTrackpoint *trkpt ) +{ + gchar *statusbar_format_code = NULL; + VikTrackpoint *trkpt_prev = NULL; + if ( !a_settings_get_string ( VIK_SETTINGS_TRKPT_SELECTED_STATUSBAR_FORMAT, &statusbar_format_code ) ) { + // Otherwise use default + statusbar_format_code = g_strdup ( "KEATDN" ); + } + else { + // Format code may want to show speed - so may need previous trkpt to work it out + trkpt_prev = vik_track_get_tp_prev ( vtl->current_tp_track, trkpt ); + } + + gchar *msg = vu_trackpoint_formatted_message ( statusbar_format_code, trkpt, trkpt_prev, vtl->current_tp_track, NAN ); + vik_statusbar_set_message ( vik_window_get_statusbar (VIK_WINDOW(VIK_GTK_WINDOW_FROM_LAYER(vtl))), VIK_STATUSBAR_INFO, msg ); + g_free ( msg ); + g_free ( statusbar_format_code ); +} + +/* + * Function to show basic waypoint information on the statusbar + */ +static void set_statusbar_msg_info_wpt ( VikTrwLayer *vtl, VikWaypoint *wpt ) +{ + gchar tmp_buf1[64]; + switch (a_vik_get_units_height ()) { + case VIK_UNITS_HEIGHT_FEET: + g_snprintf(tmp_buf1, sizeof(tmp_buf1), _("Wpt: Alt %dft"), (int)round(VIK_METERS_TO_FEET(wpt->altitude))); + break; + default: + //VIK_UNITS_HEIGHT_METRES: + g_snprintf(tmp_buf1, sizeof(tmp_buf1), _("Wpt: Alt %dm"), (int)round(wpt->altitude)); + } + + // Position part + // Position is put last, as this bit is most likely not to be seen if the display is not big enough, + // one can easily use the current pointer position to see this if needed + gchar *lat = NULL, *lon = NULL; + static struct LatLon ll; + vik_coord_to_latlon (&(wpt->coord), &ll); + a_coords_latlon_to_string ( &ll, &lat, &lon ); + + // Combine parts to make overall message + gchar *msg; + if ( wpt->comment ) + // Add comment if available + msg = g_strdup_printf ( _("%s | %s %s | Comment: %s"), tmp_buf1, lat, lon, wpt->comment ); + else + msg = g_strdup_printf ( _("%s | %s %s"), tmp_buf1, lat, lon ); + vik_statusbar_set_message ( vik_window_get_statusbar (VIK_WINDOW(VIK_GTK_WINDOW_FROM_LAYER(vtl))), VIK_STATUSBAR_INFO, msg ); + g_free ( lat ); + g_free ( lon ); + g_free ( msg ); +} + +/** + * General layer selection function, find out which bit is selected and take appropriate action + */ +static gboolean trw_layer_selected ( VikTrwLayer *l, gint subtype, gpointer sublayer, gint type, gpointer vlp ) +{ + trw_ensure_layer_loaded ( l ); + + // Reset + l->current_wp = NULL; + l->current_wp_id = NULL; + trw_layer_cancel_current_tp ( l, FALSE ); + + // Clear statusbar + vik_statusbar_set_message ( vik_window_get_statusbar (VIK_WINDOW(VIK_GTK_WINDOW_FROM_LAYER(l))), VIK_STATUSBAR_INFO, "" ); + + switch ( type ) + { + case VIK_TREEVIEW_TYPE_LAYER: + { + vik_window_set_selected_trw_layer ( (VikWindow *)VIK_GTK_WINDOW_FROM_LAYER(l), l ); + /* Mark for redraw */ + return TRUE; + } + break; + + case VIK_TREEVIEW_TYPE_SUBLAYER: + { + switch ( subtype ) + { + case VIK_TRW_LAYER_SUBLAYER_TRACKS: + { + vik_window_set_selected_tracks ( (VikWindow *)VIK_GTK_WINDOW_FROM_LAYER(l), l->tracks, l ); + /* Mark for redraw */ + return TRUE; + } + break; + case VIK_TRW_LAYER_SUBLAYER_TRACK: + { + VikTrack *track = g_hash_table_lookup ( l->tracks, sublayer ); + vik_window_set_selected_track ( (VikWindow *)VIK_GTK_WINDOW_FROM_LAYER(l), (gpointer)track, l ); + /* Mark for redraw */ + return TRUE; + } + break; + case VIK_TRW_LAYER_SUBLAYER_ROUTES: + { + vik_window_set_selected_tracks ( (VikWindow *)VIK_GTK_WINDOW_FROM_LAYER(l), l->routes, l ); + /* Mark for redraw */ + return TRUE; + } + break; + case VIK_TRW_LAYER_SUBLAYER_ROUTE: + { + VikTrack *track = g_hash_table_lookup ( l->routes, sublayer ); + vik_window_set_selected_track ( (VikWindow *)VIK_GTK_WINDOW_FROM_LAYER(l), (gpointer)track, l ); + /* Mark for redraw */ + return TRUE; + } + break; + case VIK_TRW_LAYER_SUBLAYER_WAYPOINTS: + { + vik_window_set_selected_waypoints ( (VikWindow *)VIK_GTK_WINDOW_FROM_LAYER(l), l->waypoints, l ); + /* Mark for redraw */ + return TRUE; + } + break; + case VIK_TRW_LAYER_SUBLAYER_WAYPOINT: + { + VikWaypoint *wpt = g_hash_table_lookup ( l->waypoints, sublayer ); + if ( wpt ) { + vik_window_set_selected_waypoint ( (VikWindow *)VIK_GTK_WINDOW_FROM_LAYER(l), (gpointer)wpt, l ); + // Show some waypoint info + set_statusbar_msg_info_wpt ( l, wpt ); + /* Mark for redraw */ + return TRUE; + } + } + break; + default: + { + return vik_window_clear_highlight ( (VikWindow *)VIK_GTK_WINDOW_FROM_LAYER(l) ); + } + break; + } + return FALSE; + } + break; + + default: + return vik_window_clear_highlight ( (VikWindow *)VIK_GTK_WINDOW_FROM_LAYER(l) ); + break; + } +} + +GHashTable *vik_trw_layer_get_tracks ( VikTrwLayer *l ) +{ + return l->tracks; +} + +GHashTable *vik_trw_layer_get_routes ( VikTrwLayer *l ) +{ + return l->routes; +} + +GHashTable *vik_trw_layer_get_waypoints ( VikTrwLayer *l ) +{ + return l->waypoints; +} + +GHashTable *vik_trw_layer_get_tracks_iters ( VikTrwLayer *vtl ) +{ + return vtl->tracks_iters; +} + +GHashTable *vik_trw_layer_get_routes_iters ( VikTrwLayer *vtl ) +{ + return vtl->routes_iters; +} + +GHashTable *vik_trw_layer_get_waypoints_iters ( VikTrwLayer *vtl ) +{ + return vtl->waypoints_iters; +} + +gboolean vik_trw_layer_is_empty ( VikTrwLayer *vtl ) +{ + return ! ( g_hash_table_size ( vtl->tracks ) || + g_hash_table_size ( vtl->routes ) || + g_hash_table_size ( vtl->waypoints ) ); +} + +gboolean vik_trw_layer_get_tracks_visibility ( VikTrwLayer *vtl ) +{ + return vtl->tracks_visible; +} + +gboolean vik_trw_layer_get_routes_visibility ( VikTrwLayer *vtl ) +{ + return vtl->routes_visible; +} + +gboolean vik_trw_layer_get_waypoints_visibility ( VikTrwLayer *vtl ) +{ + return vtl->waypoints_visible; +} + +/* + * ATM use a case sensitive find + * Finds the first one + */ +static gboolean trw_layer_waypoint_find ( const gpointer id, const VikWaypoint *wp, const gchar *name ) +{ + if ( wp && wp->name ) + if ( ! strcmp ( wp->name, name ) ) + return TRUE; + return FALSE; +} + +/* + * Get waypoint by name - not guaranteed to be unique + * Finds the first one + */ +VikWaypoint *vik_trw_layer_get_waypoint ( VikTrwLayer *vtl, const gchar *name ) +{ + return g_hash_table_find ( vtl->waypoints, (GHRFunc) trw_layer_waypoint_find, (gpointer) name ); +} + +/* + * ATM use a case sensitive find + * Finds the first one + */ +static gboolean trw_layer_track_find ( const gpointer id, const VikTrack *trk, const gchar *name ) +{ + if ( trk && trk->name ) + if ( ! strcmp ( trk->name, name ) ) + return TRUE; + return FALSE; +} + +/* + * Get track by name - not guaranteed to be unique + * Finds the first one + */ +VikTrack *vik_trw_layer_get_track ( VikTrwLayer *vtl, const gchar *name ) +{ + return g_hash_table_find ( vtl->tracks, (GHRFunc) trw_layer_track_find, (gpointer) name ); +} + +/* + * Get route by name - not guaranteed to be unique + * Finds the first one + */ +VikTrack *vik_trw_layer_get_route ( VikTrwLayer *vtl, const gchar *name ) +{ + return g_hash_table_find ( vtl->routes, (GHRFunc) trw_layer_track_find, (gpointer) name ); +} + +static void trw_layer_find_maxmin_tracks ( const gpointer id, const VikTrack *trk, struct LatLon maxmin[2] ) +{ + if ( trk->bbox.north > maxmin[0].lat || maxmin[0].lat == 0.0 ) + maxmin[0].lat = trk->bbox.north; + if ( trk->bbox.south < maxmin[1].lat || maxmin[1].lat == 0.0 ) + maxmin[1].lat = trk->bbox.south; + if ( trk->bbox.east > maxmin[0].lon || maxmin[0].lon == 0.0 ) + maxmin[0].lon = trk->bbox.east; + if ( trk->bbox.west < maxmin[1].lon || maxmin[1].lon == 0.0 ) + maxmin[1].lon = trk->bbox.west; +} + +static void trw_layer_find_maxmin (VikTrwLayer *vtl, struct LatLon maxmin[2]) +{ + // Continually reuse maxmin to find the latest maximum and minimum values + // First set to waypoints bounds + maxmin[0].lat = vtl->waypoints_bbox.north; + maxmin[1].lat = vtl->waypoints_bbox.south; + maxmin[0].lon = vtl->waypoints_bbox.east; + maxmin[1].lon = vtl->waypoints_bbox.west; + g_hash_table_foreach ( vtl->tracks, (GHFunc) trw_layer_find_maxmin_tracks, maxmin ); + g_hash_table_foreach ( vtl->routes, (GHFunc) trw_layer_find_maxmin_tracks, maxmin ); +} + +static LatLonBBox trw_layer_get_bbox ( VikTrwLayer *vtl ) +{ + struct LatLon maxmin[2] = { {0.0,0.0}, {0.0,0.0} }; + trw_layer_find_maxmin (vtl, maxmin); + LatLonBBox bbox; + bbox.south = maxmin[1].lat; + bbox.north = maxmin[0].lat; + bbox.east = maxmin[0].lon; + bbox.west = maxmin[1].lon; + return bbox; +} + +gboolean vik_trw_layer_find_center ( VikTrwLayer *vtl, VikCoord *dest ) +{ + /* TODO: what if there's only one waypoint @ 0,0, it will think nothing found. like I don't have more important things to worry about... */ + struct LatLon maxmin[2] = { {0.0,0.0}, {0.0,0.0} }; + trw_layer_find_maxmin (vtl, maxmin); + if (maxmin[0].lat == 0.0 && maxmin[0].lon == 0.0 && maxmin[1].lat == 0.0 && maxmin[1].lon == 0.0) + return FALSE; + else + { + struct LatLon average = { (maxmin[0].lat+maxmin[1].lat)/2, (maxmin[0].lon+maxmin[1].lon)/2 }; + vik_coord_load_from_latlon ( dest, vtl->coord_mode, &average ); + return TRUE; + } +} + +static void trw_layer_centerize ( menu_array_layer values ) +{ + VikTrwLayer *vtl = VIK_TRW_LAYER(values[MA_VTL]); + VikCoord coord; + if ( vik_trw_layer_find_center ( vtl, &coord ) ) + goto_coord ( values[MA_VLP], NULL, NULL, &coord ); + else + a_dialog_info_msg ( VIK_GTK_WINDOW_FROM_LAYER(vtl), _("This layer has no waypoints or trackpoints.") ); +} + +void trw_layer_zoom_to_show_latlons ( VikTrwLayer *vtl, VikViewport *vvp, struct LatLon maxmin[2] ) +{ + vu_zoom_to_show_latlons ( vtl->coord_mode, vvp, maxmin ); +} + +gboolean vik_trw_layer_auto_set_view ( VikTrwLayer *vtl, VikViewport *vvp ) +{ + /* TODO: what if there's only one waypoint @ 0,0, it will think nothing found. */ + struct LatLon maxmin[2] = { {0.0,0.0}, {0.0,0.0} }; + trw_layer_find_maxmin (vtl, maxmin); + if (maxmin[0].lat == 0.0 && maxmin[0].lon == 0.0 && maxmin[1].lat == 0.0 && maxmin[1].lon == 0.0) + return FALSE; + else { + trw_layer_zoom_to_show_latlons ( vtl, vvp, maxmin ); + return TRUE; + } +} + +static void trw_layer_auto_view ( menu_array_layer values ) +{ + VikTrwLayer *vtl = VIK_TRW_LAYER(values[MA_VTL]); + VikLayersPanel *vlp = VIK_LAYERS_PANEL(values[MA_VLP]); + if ( vik_trw_layer_auto_set_view ( vtl, vik_layers_panel_get_viewport (vlp) ) ) { + vik_layers_panel_emit_update ( vlp ); + } + else + a_dialog_info_msg ( VIK_GTK_WINDOW_FROM_LAYER(vtl), _("This layer has no waypoints or trackpoints.") ); +} + +static void trw_layer_export_gpspoint ( menu_array_layer values ) +{ + gchar *auto_save_name = append_file_ext ( vik_layer_get_name(VIK_LAYER(values[MA_VTL])), FILE_TYPE_GPSPOINT ); + + vik_trw_layer_export ( VIK_TRW_LAYER (values[MA_VTL]), _("Export Layer"), auto_save_name, NULL, FILE_TYPE_GPSPOINT ); + + g_free ( auto_save_name ); +} + +static void trw_layer_export_gpsmapper ( menu_array_layer values ) +{ + gchar *auto_save_name = append_file_ext ( vik_layer_get_name(VIK_LAYER(values[MA_VTL])), FILE_TYPE_GPSMAPPER ); + + vik_trw_layer_export ( VIK_TRW_LAYER (values[MA_VTL]), _("Export Layer"), auto_save_name, NULL, FILE_TYPE_GPSMAPPER ); + + g_free ( auto_save_name ); +} + +static void trw_layer_export_gpx ( menu_array_layer values ) +{ + gchar *auto_save_name = append_file_ext ( vik_layer_get_name(VIK_LAYER(values[MA_VTL])), FILE_TYPE_GPX ); + + vik_trw_layer_export ( VIK_TRW_LAYER (values[MA_VTL]), _("Export Layer"), auto_save_name, NULL, FILE_TYPE_GPX ); + + g_free ( auto_save_name ); +} + +static void trw_layer_export_kml ( menu_array_layer values ) +{ + gchar *auto_save_name = append_file_ext ( vik_layer_get_name(VIK_LAYER(values[MA_VTL])), FILE_TYPE_KML ); + + vik_trw_layer_export ( VIK_TRW_LAYER (values[MA_VTL]), _("Export Layer"), auto_save_name, NULL, FILE_TYPE_KML ); + + g_free ( auto_save_name ); +} + +static void trw_layer_export_geojson ( menu_array_layer values ) +{ + gchar *auto_save_name = append_file_ext ( vik_layer_get_name(VIK_LAYER(values[MA_VTL])), FILE_TYPE_GEOJSON ); + + vik_trw_layer_export ( VIK_TRW_LAYER (values[MA_VTL]), _("Export Layer"), auto_save_name, NULL, FILE_TYPE_GEOJSON ); + + g_free ( auto_save_name ); +} + +static void trw_layer_export_babel ( gpointer layer_and_vlp[2] ) +{ + const gchar *auto_save_name = vik_layer_get_name(VIK_LAYER(layer_and_vlp[0])); + vik_trw_layer_export_gpsbabel ( VIK_TRW_LAYER (layer_and_vlp[0]), _("Export Layer"), auto_save_name ); +} + +static void trw_layer_export_external_gpx_1 ( menu_array_layer values ) +{ + vik_trw_layer_export_external_gpx ( VIK_TRW_LAYER (values[MA_VTL]), a_vik_get_external_gpx_program_1() ); +} + +static void trw_layer_export_external_gpx_2 ( menu_array_layer values ) +{ + vik_trw_layer_export_external_gpx ( VIK_TRW_LAYER (values[MA_VTL]), a_vik_get_external_gpx_program_2() ); +} + +static void trw_layer_export_gpx_track ( menu_array_sublayer values ) +{ + VikTrwLayer *vtl = VIK_TRW_LAYER(values[MA_VTL]); + VikTrack *trk; + if ( GPOINTER_TO_INT (values[MA_SUBTYPE]) == VIK_TRW_LAYER_SUBLAYER_ROUTE ) + trk = (VikTrack *) g_hash_table_lookup ( vtl->routes, values[MA_SUBLAYER_ID] ); + else + trk = (VikTrack *) g_hash_table_lookup ( vtl->tracks, values[MA_SUBLAYER_ID] ); + + if ( !trk || !trk->name ) + return; + + gchar *auto_save_name = append_file_ext ( trk->name, FILE_TYPE_GPX ); + + gchar *label = NULL; + if ( GPOINTER_TO_INT (values[MA_SUBTYPE]) == VIK_TRW_LAYER_SUBLAYER_ROUTE ) + label = _("Export Route as GPX"); + else + label = _("Export Track as GPX"); + vik_trw_layer_export ( VIK_TRW_LAYER (values[MA_VTL]), label, auto_save_name, trk, FILE_TYPE_GPX ); + + g_free ( auto_save_name ); +} + +gboolean trw_layer_waypoint_find_uuid ( const gpointer id, const VikWaypoint *wp, gpointer udata ) +{ + wpu_udata *user_data = udata; + if ( wp == user_data->wp ) { + user_data->uuid = id; + return TRUE; + } + return FALSE; +} + +static void trw_layer_goto_wp ( menu_array_layer values ) +{ + VikTrwLayer *vtl = VIK_TRW_LAYER(values[MA_VTL]); + VikLayersPanel *vlp = VIK_LAYERS_PANEL(values[MA_VLP]); + GtkWidget *dia = gtk_dialog_new_with_buttons (_("Find"), + VIK_GTK_WINDOW_FROM_LAYER(vtl), + GTK_DIALOG_MODAL | GTK_DIALOG_DESTROY_WITH_PARENT, + GTK_STOCK_CANCEL, + GTK_RESPONSE_REJECT, + GTK_STOCK_OK, + GTK_RESPONSE_ACCEPT, + NULL); + + GtkWidget *label, *entry; + label = gtk_label_new(_("Waypoint Name:")); + entry = ui_entry_new ( NULL, GTK_ENTRY_ICON_SECONDARY ); + + gtk_box_pack_start(GTK_BOX(gtk_dialog_get_content_area(GTK_DIALOG(dia))), label, FALSE, FALSE, 0); + gtk_box_pack_start(GTK_BOX(gtk_dialog_get_content_area(GTK_DIALOG(dia))), entry, FALSE, FALSE, 0); + gtk_widget_show_all ( dia ); + // 'ok' when press return in the entry + g_signal_connect_swapped ( entry, "activate", G_CALLBACK(a_dialog_response_accept), dia ); + gtk_dialog_set_default_response ( GTK_DIALOG(dia), GTK_RESPONSE_ACCEPT ); + + while ( gtk_dialog_run ( GTK_DIALOG(dia) ) == GTK_RESPONSE_ACCEPT ) + { + gchar *name = g_strdup(gtk_entry_get_text(GTK_ENTRY(entry))); + // Find *first* wp with the given name + VikWaypoint *wp = vik_trw_layer_get_waypoint ( vtl, name ); + + if ( !wp ) + a_dialog_error_msg ( VIK_GTK_WINDOW_FROM_LAYER(vtl), _("Waypoint not found in this layer.") ); + else + { + vik_viewport_set_center_coord ( vik_layers_panel_get_viewport(vlp), &(wp->coord), TRUE ); + vik_layers_panel_emit_update ( vlp ); + + // Find and select on the side panel + wpu_udata udata; + udata.wp = wp; + udata.uuid = NULL; + + // Hmmm, want key of it + gpointer wpf = g_hash_table_find ( vtl->waypoints, (GHRFunc) trw_layer_waypoint_find_uuid, (gpointer) &udata ); + + if ( wpf && udata.uuid ) { + GtkTreeIter *it = g_hash_table_lookup ( vtl->waypoints_iters, udata.uuid ); + vik_treeview_select_iter ( VIK_LAYER(vtl)->vt, it, TRUE ); + } + + break; + } + + g_free ( name ); + + } + gtk_widget_destroy ( dia ); +} + +gboolean vik_trw_layer_new_waypoint ( VikTrwLayer *vtl, GtkWindow *w, const VikCoord *def_coord ) +{ + gchar *default_name = highest_wp_number_get(vtl); + VikWaypoint *wp = vik_waypoint_new(); + gchar *returned_name; + gboolean updated; + wp->coord = *def_coord; + + // Attempt to auto set height if DEM data is available + vik_waypoint_apply_dem_data ( wp, TRUE ); + + returned_name = a_dialog_waypoint ( w, default_name, vtl, wp, vtl->coord_mode, TRUE, &updated ); + + if ( returned_name ) + { + wp->visible = TRUE; + vik_trw_layer_add_waypoint ( vtl, returned_name, wp ); + g_free (default_name); + g_free (returned_name); + return TRUE; + } + g_free (default_name); + vik_waypoint_free(wp); + return FALSE; +} + +static void trw_layer_new_wikipedia_wp_viewport ( menu_array_layer values ) +{ + VikTrwLayer *vtl = VIK_TRW_LAYER(values[MA_VTL]); + VikLayersPanel *vlp = VIK_LAYERS_PANEL(values[MA_VLP]); + VikWindow *vw = (VikWindow *)(VIK_GTK_WINDOW_FROM_LAYER(vtl)); + VikViewport *vvp = vik_window_viewport(vw); + LatLonBBox bbox = vik_viewport_get_bbox ( vvp ); + a_geonames_wikipedia_box ( (VikWindow *)(VIK_GTK_WINDOW_FROM_LAYER(vtl)), vtl, bbox ); + trw_layer_calculate_bounds_waypoints ( vtl ); + vik_layers_panel_emit_update ( vlp ); +} + +static void trw_layer_new_wikipedia_wp_layer ( menu_array_layer values ) +{ + VikTrwLayer *vtl = VIK_TRW_LAYER(values[MA_VTL]); + VikLayersPanel *vlp = VIK_LAYERS_PANEL(values[MA_VLP]); + a_geonames_wikipedia_box ( (VikWindow *)(VIK_GTK_WINDOW_FROM_LAYER(vtl)), vtl, trw_layer_get_bbox(vtl) ); + trw_layer_calculate_bounds_waypoints ( vtl ); + vik_layers_panel_emit_update ( vlp ); +} + +#ifdef VIK_CONFIG_GEOTAG +static void trw_layer_geotagging_waypoint_mtime_keep ( menu_array_sublayer values ) +{ + VikWaypoint *wp = g_hash_table_lookup ( VIK_TRW_LAYER(values[MA_VTL])->waypoints, values[MA_SUBLAYER_ID] ); + if ( wp ) + // Update directly - not changing the mtime + a_geotag_write_exif_gps ( wp->image, wp->coord, wp->altitude, wp->image_direction, wp->image_direction_ref, TRUE ); +} + +static void trw_layer_geotagging_waypoint_mtime_update ( menu_array_sublayer values ) +{ + VikWaypoint *wp = g_hash_table_lookup ( VIK_TRW_LAYER(values[MA_VTL])->waypoints, values[MA_SUBLAYER_ID] ); + if ( wp ) + // Update directly + a_geotag_write_exif_gps ( wp->image, wp->coord, wp->altitude, wp->image_direction, wp->image_direction_ref, FALSE ); +} + +/* + * Use code in separate file for this feature as reasonably complex + */ +static void trw_layer_geotagging_track ( menu_array_sublayer values ) +{ + VikTrwLayer *vtl = VIK_TRW_LAYER(values[MA_VTL]); + VikTrack *track = g_hash_table_lookup ( vtl->tracks, values[MA_SUBLAYER_ID] ); + // Unset so can be reverified later if necessary + vtl->has_verified_thumbnails = FALSE; + + trw_layer_geotag_dialog ( VIK_GTK_WINDOW_FROM_LAYER(vtl), + vtl, + NULL, + track ); +} + +static void trw_layer_geotagging_waypoint ( menu_array_sublayer values ) +{ + VikTrwLayer *vtl = VIK_TRW_LAYER(values[MA_VTL]); + VikWaypoint *wpt = g_hash_table_lookup ( vtl->waypoints, values[MA_SUBLAYER_ID] ); + + trw_layer_geotag_dialog ( VIK_GTK_WINDOW_FROM_LAYER(vtl), + vtl, + wpt, + NULL ); +} + +static void trw_layer_geotagging ( menu_array_layer values ) +{ + VikTrwLayer *vtl = VIK_TRW_LAYER(values[MA_VTL]); + // Unset so can be reverified later if necessary + vtl->has_verified_thumbnails = FALSE; + + trw_layer_geotag_dialog ( VIK_GTK_WINDOW_FROM_LAYER(vtl), + vtl, + NULL, + NULL ); +} +#endif + +// 'Acquires' - Same as in File Menu -> Acquire - applies into the selected TRW Layer // + +static void trw_layer_acquire ( menu_array_layer values, VikDataSourceInterface *datasource ) +{ + VikTrwLayer *vtl = VIK_TRW_LAYER(values[MA_VTL]); + VikLayersPanel *vlp = VIK_LAYERS_PANEL(values[MA_VLP]); + VikWindow *vw = (VikWindow *)(VIK_GTK_WINDOW_FROM_LAYER(vtl)); + VikViewport *vvp = vik_window_viewport(vw); + + vik_datasource_mode_t mode = datasource->mode; + if ( mode == VIK_DATASOURCE_AUTO_LAYER_MANAGEMENT ) + mode = VIK_DATASOURCE_ADDTOLAYER; + a_acquire ( vw, vlp, vvp, mode, datasource, NULL, NULL ); +} + +/* + * Acquire into this TRW Layer straight from GPS Device + */ +static void trw_layer_acquire_gps_cb ( menu_array_layer values ) +{ + trw_layer_acquire ( values, &vik_datasource_gps_interface ); +} + +/* + * Acquire into this TRW Layer from Directions + */ +static void trw_layer_acquire_routing_cb ( menu_array_layer values ) +{ + trw_layer_acquire ( values, &vik_datasource_routing_interface ); +} + +/* + * Acquire into this TRW Layer from an entered URL + */ +static void trw_layer_acquire_url_cb ( menu_array_layer values ) +{ + trw_layer_acquire ( values, &vik_datasource_url_interface ); +} + +#ifdef VIK_CONFIG_OPENSTREETMAP +/* + * Acquire into this TRW Layer from OSM + */ +static void trw_layer_acquire_osm_cb ( menu_array_layer values ) +{ + trw_layer_acquire ( values, &vik_datasource_osm_interface ); +} + +/** + * Acquire into this TRW Layer from OSM for 'My' Traces + */ +static void trw_layer_acquire_osm_my_traces_cb ( menu_array_layer values ) +{ + trw_layer_acquire ( values, &vik_datasource_osm_my_traces_interface ); +} +#endif + +#ifdef VIK_CONFIG_GEOCACHES +/* + * Acquire into this TRW Layer from Geocaching.com + */ +static void trw_layer_acquire_geocache_cb ( menu_array_layer values ) +{ + trw_layer_acquire ( values, &vik_datasource_gc_interface ); +} +#endif + +#ifdef VIK_CONFIG_GEOTAG +/* + * Acquire into this TRW Layer from images + */ +static void trw_layer_acquire_geotagged_cb ( menu_array_layer values ) +{ + VikTrwLayer *vtl = VIK_TRW_LAYER(values[MA_VTL]); + + trw_layer_acquire ( values, &vik_datasource_geotag_interface ); + + // Reverify thumbnails as they may have changed + vtl->has_verified_thumbnails = FALSE; + trw_layer_verify_thumbnails ( vtl ); +} +#endif + +/* + * Acquire into this TRW Layer from any GPS Babel supported file + */ +static void trw_layer_acquire_file_cb ( menu_array_layer values ) +{ + trw_layer_acquire ( values, &vik_datasource_file_interface ); +} + +static void trw_layer_gps_upload ( menu_array_layer values ) +{ + menu_array_sublayer data; + gint ii; + for ( ii = MA_VTL; ii < MA_LAST; ii++ ) + data[ii] = NULL; + data[MA_VTL] = values[MA_VTL]; + data[MA_VLP] = values[MA_VLP]; + + trw_layer_gps_upload_any ( data ); +} + +/** + * If pass_along[3] is defined that this will upload just that track + */ +static void trw_layer_gps_upload_any ( menu_array_sublayer values ) +{ + VikTrwLayer *vtl = VIK_TRW_LAYER(values[MA_VTL]); + VikLayersPanel *vlp = VIK_LAYERS_PANEL(values[MA_VLP]); + + // May not actually get a track here as values[2&3] can be null + VikTrack *track = NULL; + vik_gps_xfer_type xfer_type = TRK; // VIK_TRW_LAYER_SUBLAYER_TRACKS = 0 so hard to test different from NULL! + gboolean xfer_all = FALSE; + + if ( values[MA_SUBTYPE] ) { + xfer_all = FALSE; + if ( GPOINTER_TO_INT (values[MA_SUBTYPE]) == VIK_TRW_LAYER_SUBLAYER_ROUTE ) { + track = (VikTrack *) g_hash_table_lookup ( vtl->routes, values[MA_SUBLAYER_ID] ); + xfer_type = RTE; + } + else if ( GPOINTER_TO_INT (values[MA_SUBTYPE]) == VIK_TRW_LAYER_SUBLAYER_TRACK ) { + track = (VikTrack *) g_hash_table_lookup ( vtl->tracks, values[MA_SUBLAYER_ID] ); + xfer_type = TRK; + } + else if ( GPOINTER_TO_INT (values[MA_SUBTYPE]) == VIK_TRW_LAYER_SUBLAYER_WAYPOINTS ) { + xfer_type = WPT; + } + else if ( GPOINTER_TO_INT (values[MA_SUBTYPE]) == VIK_TRW_LAYER_SUBLAYER_ROUTES ) { + xfer_type = RTE; + } + } + else if ( !values[MA_CONFIRM] ) + xfer_all = TRUE; // i.e. whole layer + + if (track && !track->visible) { + a_dialog_error_msg ( VIK_GTK_WINDOW_FROM_LAYER(vtl), _("Can not upload invisible track.") ); + return; + } + + GtkWidget *dialog = gtk_dialog_new_with_buttons ( _("GPS Upload"), + VIK_GTK_WINDOW_FROM_LAYER(vtl), + GTK_DIALOG_DESTROY_WITH_PARENT, + GTK_STOCK_OK, + GTK_RESPONSE_ACCEPT, + GTK_STOCK_CANCEL, + GTK_RESPONSE_REJECT, + NULL ); + + gtk_dialog_set_default_response ( GTK_DIALOG(dialog), GTK_RESPONSE_ACCEPT ); + GtkWidget *response_w = NULL; +#if GTK_CHECK_VERSION (2, 20, 0) + response_w = gtk_dialog_get_widget_for_response ( GTK_DIALOG(dialog), GTK_RESPONSE_ACCEPT ); +#endif + + if ( response_w ) + gtk_widget_grab_focus ( response_w ); + + gpointer dgs = datasource_gps_setup ( dialog, xfer_type, xfer_all ); + + if ( gtk_dialog_run ( GTK_DIALOG(dialog) ) != GTK_RESPONSE_ACCEPT ) { + datasource_gps_clean_up ( dgs ); + gtk_widget_destroy ( dialog ); + return; + } + + // Get info from reused datasource dialog widgets + gchar* protocol = datasource_gps_get_protocol ( dgs ); + gchar* port = datasource_gps_get_descriptor ( dgs ); + // NB don't free the above strings as they're references to values held elsewhere + gboolean do_tracks = datasource_gps_get_do_tracks ( dgs ); + gboolean do_routes = datasource_gps_get_do_routes ( dgs ); + gboolean do_waypoints = datasource_gps_get_do_waypoints ( dgs ); + gboolean turn_off = datasource_gps_get_off ( dgs ); + + gtk_widget_destroy ( dialog ); + + // When called from the viewport - work the corresponding layerspanel: + if ( !vlp ) { + vlp = vik_window_layers_panel ( VIK_WINDOW(VIK_GTK_WINDOW_FROM_LAYER(vtl)) ); + } + + // Apply settings to transfer to the GPS device + vik_gps_comm ( vtl, + track, + GPS_UP, + protocol, + port, + FALSE, + vik_layers_panel_get_viewport (vlp), + vlp, + do_tracks, + do_routes, + do_waypoints, + turn_off ); +} + +static void trw_layer_new_wp ( menu_array_layer values ) +{ + VikTrwLayer *vtl = VIK_TRW_LAYER(values[MA_VTL]); + VikLayersPanel *vlp = VIK_LAYERS_PANEL(values[MA_VLP]); + /* TODO longone: okay, if layer above (aggregate) is invisible but vtl->visible is true, this redraws for no reason. + instead return true if you want to update. */ + if ( vik_trw_layer_new_waypoint ( vtl, VIK_GTK_WINDOW_FROM_LAYER(vtl), vik_viewport_get_center(vik_layers_panel_get_viewport(vlp))) ) { + trw_layer_calculate_bounds_waypoints ( vtl ); + if ( VIK_LAYER(vtl)->visible ) + vik_layers_panel_emit_update ( vlp ); + } +} + +static void edit_track_create_common ( VikTrwLayer *vtl, gchar *name ) +{ + vtl->current_track = vik_track_new(); + vik_track_set_defaults ( vtl->current_track ); + vtl->current_track->visible = TRUE; + if ( vtl->drawmode == DRAWMODE_ALL_SAME_COLOR ) + // Create track with the preferred colour from the layer properties + vtl->current_track->color = vtl->track_color; + else + gdk_color_parse ( "#000000", &(vtl->current_track->color) ); + vtl->current_track->has_color = TRUE; + vik_trw_layer_add_track ( vtl, name, vtl->current_track ); +} + +static void trw_layer_edit_track ( menu_array_layer values ) +{ + VikTrwLayer *vtl = VIK_TRW_LAYER(values[MA_VTL]); + + if ( ! vtl->current_track ) { + gchar *name = trw_layer_new_unique_sublayer_name ( vtl, VIK_TRW_LAYER_SUBLAYER_TRACK, _("Track")) ; + edit_track_create_common ( vtl, name ); + g_free ( name ); + + vik_window_enable_layer_tool ( VIK_WINDOW(VIK_GTK_WINDOW_FROM_LAYER(vtl)), VIK_LAYER_TRW, TOOL_CREATE_TRACK ); + } +} + +static void edit_route_create_common ( VikTrwLayer *vtl, gchar *name ) +{ + vtl->current_track = vik_track_new(); + vik_track_set_defaults ( vtl->current_track ); + vtl->current_track->visible = TRUE; + vtl->current_track->is_route = TRUE; + // By default make all routes red + vtl->current_track->has_color = TRUE; + gdk_color_parse ( "red", &vtl->current_track->color ); + vik_trw_layer_add_route ( vtl, name, vtl->current_track ); +} + +static void trw_layer_edit_route ( menu_array_layer values ) +{ + VikTrwLayer *vtl = VIK_TRW_LAYER(values[MA_VTL]); + + if ( ! vtl->current_track ) { + gchar *name = trw_layer_new_unique_sublayer_name ( vtl, VIK_TRW_LAYER_SUBLAYER_ROUTE, _("Route")) ; + edit_route_create_common ( vtl, name ); + g_free ( name ); + vik_window_enable_layer_tool ( VIK_WINDOW(VIK_GTK_WINDOW_FROM_LAYER(vtl)), VIK_LAYER_TRW, TOOL_CREATE_ROUTE ); + } +} + +static void trw_layer_auto_routes_view ( menu_array_layer values ) +{ + VikTrwLayer *vtl = VIK_TRW_LAYER(values[MA_VTL]); + VikLayersPanel *vlp = VIK_LAYERS_PANEL(values[MA_VLP]); + + if ( g_hash_table_size (vtl->routes) > 0 ) { + struct LatLon maxmin[2] = { {0,0}, {0,0} }; + g_hash_table_foreach ( vtl->routes, (GHFunc) trw_layer_find_maxmin_tracks, maxmin ); + trw_layer_zoom_to_show_latlons ( vtl, vik_layers_panel_get_viewport (vlp), maxmin ); + vik_layers_panel_emit_update ( vlp ); + } +} + + +static void trw_layer_finish_track ( menu_array_layer values ) +{ + VikTrwLayer *vtl = VIK_TRW_LAYER(values[MA_VTL]); + vtl->current_track = NULL; + vik_layer_emit_update ( VIK_LAYER(vtl) ); +} + +static void trw_layer_auto_tracks_view ( menu_array_layer values ) +{ + VikTrwLayer *vtl = VIK_TRW_LAYER(values[MA_VTL]); + VikLayersPanel *vlp = VIK_LAYERS_PANEL(values[MA_VLP]); + + if ( g_hash_table_size (vtl->tracks) > 0 ) { + struct LatLon maxmin[2] = { {0,0}, {0,0} }; + g_hash_table_foreach ( vtl->tracks, (GHFunc) trw_layer_find_maxmin_tracks, maxmin ); + trw_layer_zoom_to_show_latlons ( vtl, vik_layers_panel_get_viewport (vlp), maxmin ); + vik_layers_panel_emit_update ( vlp ); + } +} + +static void trw_layer_single_waypoint_jump ( const gpointer id, const VikWaypoint *wp, gpointer vvp ) +{ + /* NB do not care if wp is visible or not */ + vik_viewport_set_center_coord ( VIK_VIEWPORT(vvp), &(wp->coord), TRUE ); +} + +static void trw_layer_auto_waypoints_view ( menu_array_layer values ) +{ + VikTrwLayer *vtl = VIK_TRW_LAYER(values[MA_VTL]); + VikLayersPanel *vlp = VIK_LAYERS_PANEL(values[MA_VLP]); + + /* Only 1 waypoint - jump straight to it */ + if ( g_hash_table_size (vtl->waypoints) == 1 ) { + VikViewport *vvp = vik_layers_panel_get_viewport (vlp); + g_hash_table_foreach ( vtl->waypoints, (GHFunc) trw_layer_single_waypoint_jump, (gpointer) vvp ); + } + /* If at least 2 waypoints - find center and then zoom to fit */ + else if ( g_hash_table_size (vtl->waypoints) > 1 ) + { + struct LatLon maxmin[2] = { {0,0}, {0,0} }; + maxmin[0].lat = vtl->waypoints_bbox.north; + maxmin[1].lat = vtl->waypoints_bbox.south; + maxmin[0].lon = vtl->waypoints_bbox.east; + maxmin[1].lon = vtl->waypoints_bbox.west; + trw_layer_zoom_to_show_latlons ( vtl, vik_layers_panel_get_viewport (vlp), maxmin ); + } + + vik_layers_panel_emit_update ( vlp ); +} + +void trw_layer_osm_traces_upload_cb ( menu_array_layer values ) +{ + osm_traces_upload_viktrwlayer(VIK_TRW_LAYER(values[MA_VTL]), NULL); +} + +void trw_layer_osm_traces_upload_track_cb ( menu_array_sublayer values ) +{ + if ( values[MA_MISC] ) { + VikTrack *trk = VIK_TRACK(values[MA_MISC]); + osm_traces_upload_viktrwlayer(VIK_TRW_LAYER(values[MA_VTL]), trk); + } +} + +static GtkWidget* create_external_submenu ( GtkMenu *menu ) +{ + GtkWidget *external_submenu = gtk_menu_new (); + GtkWidget *item = gtk_image_menu_item_new_with_mnemonic ( _("Externa_l") ); + gtk_image_menu_item_set_image ( (GtkImageMenuItem*)item, gtk_image_new_from_stock (GTK_STOCK_EXECUTE, GTK_ICON_SIZE_MENU) ); + gtk_menu_shell_append (GTK_MENU_SHELL (menu), item); + gtk_widget_show ( item ); + gtk_menu_item_set_submenu (GTK_MENU_ITEM (item), external_submenu ); + return external_submenu; +} + +static void trw_layer_add_menu_items ( VikTrwLayer *vtl, GtkMenu *menu, gpointer vlp ) +{ + static menu_array_layer pass_along; + GtkWidget *item; + GtkWidget *export_submenu; + pass_along[MA_VTL] = vtl; + pass_along[MA_VLP] = vlp; + + item = gtk_menu_item_new(); + gtk_menu_shell_append ( GTK_MENU_SHELL(menu), item ); + gtk_widget_show ( item ); + + if ( vtl->current_track ) { + if ( vtl->current_track->is_route ) + item = gtk_menu_item_new_with_mnemonic ( _("_Finish Route") ); + else + item = gtk_menu_item_new_with_mnemonic ( _("_Finish Track") ); + g_signal_connect_swapped ( G_OBJECT(item), "activate", G_CALLBACK(trw_layer_finish_track), pass_along ); + gtk_menu_shell_append (GTK_MENU_SHELL (menu), item); + gtk_widget_show ( item ); + + // Add separator + item = gtk_menu_item_new (); + gtk_menu_shell_append ( GTK_MENU_SHELL(menu), item ); + gtk_widget_show ( item ); + } + + /* Now with icons */ + item = gtk_image_menu_item_new_with_mnemonic ( _("_View Layer") ); + gtk_image_menu_item_set_image ( (GtkImageMenuItem*)item, gtk_image_new_from_stock (GTK_STOCK_ZOOM_FIT, GTK_ICON_SIZE_MENU) ); + g_signal_connect_swapped ( G_OBJECT(item), "activate", G_CALLBACK(trw_layer_auto_view), pass_along ); + gtk_menu_shell_append (GTK_MENU_SHELL (menu), item); + gtk_widget_show ( item ); + + GtkWidget *view_submenu = gtk_menu_new(); + item = gtk_image_menu_item_new_with_mnemonic ( _("V_iew") ); + gtk_image_menu_item_set_image ( (GtkImageMenuItem*)item, gtk_image_new_from_stock (GTK_STOCK_FIND, GTK_ICON_SIZE_MENU) ); + gtk_menu_shell_append (GTK_MENU_SHELL (menu), item); + gtk_widget_show ( item ); + gtk_menu_item_set_submenu (GTK_MENU_ITEM (item), view_submenu ); + + item = gtk_menu_item_new_with_mnemonic ( _("View All _Tracks") ); + g_signal_connect_swapped ( G_OBJECT(item), "activate", G_CALLBACK(trw_layer_auto_tracks_view), pass_along ); + gtk_menu_shell_append (GTK_MENU_SHELL (view_submenu), item); + gtk_widget_show ( item ); + + item = gtk_menu_item_new_with_mnemonic ( _("View All _Routes") ); + g_signal_connect_swapped ( G_OBJECT(item), "activate", G_CALLBACK(trw_layer_auto_routes_view), pass_along ); + gtk_menu_shell_append (GTK_MENU_SHELL (view_submenu), item); + gtk_widget_show ( item ); + + item = gtk_menu_item_new_with_mnemonic ( _("View All _Waypoints") ); + g_signal_connect_swapped ( G_OBJECT(item), "activate", G_CALLBACK(trw_layer_auto_waypoints_view), pass_along ); + gtk_menu_shell_append (GTK_MENU_SHELL (view_submenu), item); + gtk_widget_show ( item ); + + item = gtk_image_menu_item_new_with_mnemonic ( _("_Goto Center of Layer") ); + gtk_image_menu_item_set_image ( (GtkImageMenuItem*)item, gtk_image_new_from_stock (GTK_STOCK_JUMP_TO, GTK_ICON_SIZE_MENU) ); + g_signal_connect_swapped ( G_OBJECT(item), "activate", G_CALLBACK(trw_layer_centerize), pass_along ); + gtk_menu_shell_append (GTK_MENU_SHELL (menu), item); + gtk_widget_show ( item ); + + item = gtk_menu_item_new_with_mnemonic ( _("Goto _Waypoint...") ); + g_signal_connect_swapped ( G_OBJECT(item), "activate", G_CALLBACK(trw_layer_goto_wp), pass_along ); + gtk_menu_shell_append (GTK_MENU_SHELL (menu), item); + gtk_widget_show ( item ); + + export_submenu = gtk_menu_new (); + item = gtk_image_menu_item_new_with_mnemonic ( _("_Export Layer") ); + gtk_image_menu_item_set_image ( (GtkImageMenuItem*)item, gtk_image_new_from_stock (GTK_STOCK_HARDDISK, GTK_ICON_SIZE_MENU) ); + gtk_menu_shell_append (GTK_MENU_SHELL (menu), item); + gtk_widget_show ( item ); + gtk_menu_item_set_submenu (GTK_MENU_ITEM (item), export_submenu ); + + item = gtk_menu_item_new_with_mnemonic ( _("Export as GPS_Point...") ); + g_signal_connect_swapped ( G_OBJECT(item), "activate", G_CALLBACK(trw_layer_export_gpspoint), pass_along ); + gtk_menu_shell_append (GTK_MENU_SHELL (export_submenu), item); + gtk_widget_show ( item ); + + item = gtk_menu_item_new_with_mnemonic ( _("Export as GPS_Mapper...") ); + g_signal_connect_swapped ( G_OBJECT(item), "activate", G_CALLBACK(trw_layer_export_gpsmapper), pass_along ); + gtk_menu_shell_append (GTK_MENU_SHELL (export_submenu), item); + gtk_widget_show ( item ); + + item = gtk_menu_item_new_with_mnemonic ( _("Export as _GPX...") ); + g_signal_connect_swapped ( G_OBJECT(item), "activate", G_CALLBACK(trw_layer_export_gpx), pass_along ); + gtk_menu_shell_append (GTK_MENU_SHELL (export_submenu), item); + gtk_widget_show ( item ); + + if ( a_babel_available () ) { + item = gtk_menu_item_new_with_mnemonic ( _("Export as _KML...") ); + g_signal_connect_swapped ( G_OBJECT(item), "activate", G_CALLBACK(trw_layer_export_kml), pass_along ); + gtk_menu_shell_append (GTK_MENU_SHELL (export_submenu), item); + gtk_widget_show ( item ); + } + + if ( have_geojson_export ) { + item = gtk_menu_item_new_with_mnemonic ( _("Export as GEO_JSON...") ); + g_signal_connect_swapped ( G_OBJECT(item), "activate", G_CALLBACK(trw_layer_export_geojson), pass_along ); + gtk_menu_shell_append (GTK_MENU_SHELL (export_submenu), item); + gtk_widget_show ( item ); + } + + if ( a_babel_available () ) { + item = gtk_menu_item_new_with_mnemonic ( _("Export via GPSbabel...") ); + g_signal_connect_swapped ( G_OBJECT(item), "activate", G_CALLBACK(trw_layer_export_babel), pass_along ); + gtk_menu_shell_append (GTK_MENU_SHELL (export_submenu), item); + gtk_widget_show ( item ); + } + + gchar* external1 = g_strdup_printf ( _("Open with External Program_1: %s"), a_vik_get_external_gpx_program_1() ); + item = gtk_menu_item_new_with_mnemonic ( external1 ); + g_free ( external1 ); + g_signal_connect_swapped ( G_OBJECT(item), "activate", G_CALLBACK(trw_layer_export_external_gpx_1), pass_along ); + gtk_menu_shell_append (GTK_MENU_SHELL (export_submenu), item); + gtk_widget_show ( item ); + + gchar* external2 = g_strdup_printf ( _("Open with External Program_2: %s"), a_vik_get_external_gpx_program_2() ); + item = gtk_menu_item_new_with_mnemonic ( external2 ); + g_free ( external2 ); + g_signal_connect_swapped ( G_OBJECT(item), "activate", G_CALLBACK(trw_layer_export_external_gpx_2), pass_along ); + gtk_menu_shell_append (GTK_MENU_SHELL (export_submenu), item); + gtk_widget_show ( item ); + + GtkWidget *new_submenu = gtk_menu_new(); + item = gtk_image_menu_item_new_with_mnemonic ( _("_New") ); + gtk_image_menu_item_set_image ( (GtkImageMenuItem*)item, gtk_image_new_from_stock (GTK_STOCK_NEW, GTK_ICON_SIZE_MENU) ); + gtk_menu_shell_append(GTK_MENU_SHELL (menu), item); + gtk_widget_show(item); + gtk_menu_item_set_submenu(GTK_MENU_ITEM(item), new_submenu); + + item = gtk_image_menu_item_new_with_mnemonic ( _("New _Waypoint...") ); + gtk_image_menu_item_set_image ( (GtkImageMenuItem*)item, gtk_image_new_from_stock (GTK_STOCK_NEW, GTK_ICON_SIZE_MENU) ); + g_signal_connect_swapped ( G_OBJECT(item), "activate", G_CALLBACK(trw_layer_new_wp), pass_along ); + gtk_menu_shell_append (GTK_MENU_SHELL (new_submenu), item); + gtk_widget_show ( item ); + + item = gtk_image_menu_item_new_with_mnemonic ( _("New _Track") ); + gtk_image_menu_item_set_image ( (GtkImageMenuItem*)item, gtk_image_new_from_stock (GTK_STOCK_NEW, GTK_ICON_SIZE_MENU) ); + g_signal_connect_swapped ( G_OBJECT(item), "activate", G_CALLBACK(trw_layer_edit_track), pass_along ); + gtk_menu_shell_append (GTK_MENU_SHELL (new_submenu), item); + gtk_widget_show ( item ); + // Make it available only when a new track *not* already in progress + gtk_widget_set_sensitive ( item, ! (gboolean)GPOINTER_TO_INT(vtl->current_track) ); + + item = gtk_image_menu_item_new_with_mnemonic ( _("New _Route") ); + gtk_image_menu_item_set_image ( (GtkImageMenuItem*)item, gtk_image_new_from_stock (GTK_STOCK_NEW, GTK_ICON_SIZE_MENU) ); + g_signal_connect_swapped ( G_OBJECT(item), "activate", G_CALLBACK(trw_layer_edit_route), pass_along ); + gtk_menu_shell_append (GTK_MENU_SHELL (new_submenu), item); + gtk_widget_show ( item ); + // Make it available only when a new track *not* already in progress + gtk_widget_set_sensitive ( item, ! (gboolean)GPOINTER_TO_INT(vtl->current_track) ); + +#ifdef VIK_CONFIG_GEOTAG + item = gtk_menu_item_new_with_mnemonic ( _("Geotag _Images...") ); + g_signal_connect_swapped ( G_OBJECT(item), "activate", G_CALLBACK(trw_layer_geotagging), pass_along ); + gtk_menu_shell_append (GTK_MENU_SHELL (menu), item); + gtk_widget_show ( item ); +#endif + + GtkWidget *acquire_submenu = gtk_menu_new (); + item = gtk_image_menu_item_new_with_mnemonic ( _("_Acquire") ); + gtk_image_menu_item_set_image ( (GtkImageMenuItem*)item, gtk_image_new_from_stock (GTK_STOCK_GO_DOWN, GTK_ICON_SIZE_MENU) ); + gtk_menu_shell_append (GTK_MENU_SHELL (menu), item); + gtk_widget_show ( item ); + gtk_menu_item_set_submenu (GTK_MENU_ITEM (item), acquire_submenu ); + + item = gtk_menu_item_new_with_mnemonic ( _("From _GPS...") ); + g_signal_connect_swapped ( G_OBJECT(item), "activate", G_CALLBACK(trw_layer_acquire_gps_cb), pass_along ); + gtk_menu_shell_append (GTK_MENU_SHELL (acquire_submenu), item); + gtk_widget_show ( item ); + + /* FIXME: only add menu when at least a routing engine has support for Directions */ + item = gtk_menu_item_new_with_mnemonic ( _("From _Directions...") ); + g_signal_connect_swapped ( G_OBJECT(item), "activate", G_CALLBACK(trw_layer_acquire_routing_cb), pass_along ); + gtk_menu_shell_append (GTK_MENU_SHELL (acquire_submenu), item); + gtk_widget_show ( item ); + +#ifdef VIK_CONFIG_OPENSTREETMAP + item = gtk_menu_item_new_with_mnemonic ( _("From _OSM Traces...") ); + g_signal_connect_swapped ( G_OBJECT(item), "activate", G_CALLBACK(trw_layer_acquire_osm_cb), pass_along ); + gtk_menu_shell_append (GTK_MENU_SHELL (acquire_submenu), item); + gtk_widget_show ( item ); + + item = gtk_menu_item_new_with_mnemonic ( _("From _My OSM Traces...") ); + g_signal_connect_swapped ( G_OBJECT(item), "activate", G_CALLBACK(trw_layer_acquire_osm_my_traces_cb), pass_along ); + gtk_menu_shell_append (GTK_MENU_SHELL (acquire_submenu), item); + gtk_widget_show ( item ); +#endif + + item = gtk_menu_item_new_with_mnemonic ( _("From _URL...") ); + g_signal_connect_swapped ( G_OBJECT(item), "activate", G_CALLBACK(trw_layer_acquire_url_cb), pass_along ); + gtk_menu_shell_append (GTK_MENU_SHELL (acquire_submenu), item); + gtk_widget_show ( item ); + +#ifdef VIK_CONFIG_GEONAMES + GtkWidget *wikipedia_submenu = gtk_menu_new(); + item = gtk_image_menu_item_new_with_mnemonic ( _("From _Wikipedia Waypoints") ); + gtk_image_menu_item_set_image ( (GtkImageMenuItem*)item, gtk_image_new_from_stock (GTK_STOCK_ADD, GTK_ICON_SIZE_MENU) ); + gtk_menu_shell_append(GTK_MENU_SHELL (acquire_submenu), item); + gtk_widget_show(item); + gtk_menu_item_set_submenu(GTK_MENU_ITEM(item), wikipedia_submenu); + + item = gtk_image_menu_item_new_with_mnemonic ( _("Within _Layer Bounds") ); + gtk_image_menu_item_set_image ( (GtkImageMenuItem*)item, gtk_image_new_from_stock (GTK_STOCK_ZOOM_FIT, GTK_ICON_SIZE_MENU) ); + g_signal_connect_swapped ( G_OBJECT(item), "activate", G_CALLBACK(trw_layer_new_wikipedia_wp_layer), pass_along ); + gtk_menu_shell_append (GTK_MENU_SHELL (wikipedia_submenu), item); + gtk_widget_show ( item ); + + item = gtk_image_menu_item_new_with_mnemonic ( _("Within _Current View") ); + gtk_image_menu_item_set_image ( (GtkImageMenuItem*)item, gtk_image_new_from_stock (GTK_STOCK_ZOOM_100, GTK_ICON_SIZE_MENU) ); + g_signal_connect_swapped ( G_OBJECT(item), "activate", G_CALLBACK(trw_layer_new_wikipedia_wp_viewport), pass_along ); + gtk_menu_shell_append (GTK_MENU_SHELL (wikipedia_submenu), item); + gtk_widget_show ( item ); +#endif + +#ifdef VIK_CONFIG_GEOCACHES + item = gtk_menu_item_new_with_mnemonic ( _("From Geo_caching...") ); + g_signal_connect_swapped ( G_OBJECT(item), "activate", G_CALLBACK(trw_layer_acquire_geocache_cb), pass_along ); + gtk_menu_shell_append (GTK_MENU_SHELL (acquire_submenu), item); + gtk_widget_show ( item ); +#endif + +#ifdef VIK_CONFIG_GEOTAG + item = gtk_menu_item_new_with_mnemonic ( _("From Geotagged _Images...") ); + g_signal_connect_swapped ( G_OBJECT(item), "activate", G_CALLBACK(trw_layer_acquire_geotagged_cb), pass_along ); + gtk_menu_shell_append (GTK_MENU_SHELL (acquire_submenu), item); + gtk_widget_show ( item ); +#endif + + if ( a_babel_available () ) { + item = gtk_menu_item_new_with_mnemonic ( _("From _File...") ); + g_signal_connect_swapped ( G_OBJECT(item), "activate", G_CALLBACK(trw_layer_acquire_file_cb), pass_along ); + gtk_menu_shell_append (GTK_MENU_SHELL (acquire_submenu), item); + gtk_widget_set_tooltip_text (item, _("Import File With GPS_Babel...")); + gtk_widget_show ( item ); + } + + vik_ext_tool_datasources_add_menu_items_to_menu ( VIK_WINDOW(VIK_GTK_WINDOW_FROM_LAYER(vtl)), GTK_MENU (acquire_submenu) ); + + GtkWidget *upload_submenu = gtk_menu_new (); + item = gtk_image_menu_item_new_with_mnemonic ( _("_Upload") ); + gtk_image_menu_item_set_image ( (GtkImageMenuItem*)item, gtk_image_new_from_stock (GTK_STOCK_GO_UP, GTK_ICON_SIZE_MENU) ); + gtk_menu_shell_append (GTK_MENU_SHELL (menu), item); + gtk_widget_show ( item ); + gtk_menu_item_set_submenu (GTK_MENU_ITEM (item), upload_submenu ); + + item = gtk_image_menu_item_new_with_mnemonic ( _("Upload to _GPS...") ); + gtk_image_menu_item_set_image ( (GtkImageMenuItem*)item, gtk_image_new_from_stock (GTK_STOCK_GO_FORWARD, GTK_ICON_SIZE_MENU) ); + g_signal_connect_swapped ( G_OBJECT(item), "activate", G_CALLBACK(trw_layer_gps_upload), pass_along ); + gtk_menu_shell_append (GTK_MENU_SHELL (upload_submenu), item); + gtk_widget_show ( item ); + +#ifdef VIK_CONFIG_OPENSTREETMAP + item = gtk_image_menu_item_new_with_mnemonic ( _("Upload to _OSM...") ); + gtk_image_menu_item_set_image ( (GtkImageMenuItem*)item, gtk_image_new_from_stock (GTK_STOCK_GO_UP, GTK_ICON_SIZE_MENU) ); + g_signal_connect_swapped ( G_OBJECT(item), "activate", G_CALLBACK(trw_layer_osm_traces_upload_cb), pass_along ); + gtk_menu_shell_append (GTK_MENU_SHELL (upload_submenu), item); + gtk_widget_show ( item ); +#endif + + GtkWidget *delete_submenu = gtk_menu_new (); + item = gtk_image_menu_item_new_with_mnemonic ( _("De_lete") ); + gtk_image_menu_item_set_image ( (GtkImageMenuItem*)item, gtk_image_new_from_stock (GTK_STOCK_REMOVE, GTK_ICON_SIZE_MENU) ); + gtk_menu_shell_append (GTK_MENU_SHELL (menu), item); + gtk_widget_show ( item ); + gtk_menu_item_set_submenu (GTK_MENU_ITEM (item), delete_submenu ); + + item = gtk_image_menu_item_new_with_mnemonic ( _("Delete All _Tracks") ); + gtk_image_menu_item_set_image ( (GtkImageMenuItem*)item, gtk_image_new_from_stock (GTK_STOCK_REMOVE, GTK_ICON_SIZE_MENU) ); + g_signal_connect_swapped ( G_OBJECT(item), "activate", G_CALLBACK(trw_layer_delete_all_tracks), pass_along ); + gtk_menu_shell_append ( GTK_MENU_SHELL(delete_submenu), item ); + gtk_widget_show ( item ); + gtk_widget_set_sensitive ( item, (gboolean)(g_hash_table_size (vtl->tracks)) ); + + item = gtk_image_menu_item_new_with_mnemonic ( _("Delete Tracks _From Selection...") ); + gtk_image_menu_item_set_image ( (GtkImageMenuItem*)item, gtk_image_new_from_stock (GTK_STOCK_INDEX, GTK_ICON_SIZE_MENU) ); + g_signal_connect_swapped ( G_OBJECT(item), "activate", G_CALLBACK(trw_layer_delete_tracks_from_selection), pass_along ); + gtk_menu_shell_append ( GTK_MENU_SHELL(delete_submenu), item ); + gtk_widget_show ( item ); + gtk_widget_set_sensitive ( item, (gboolean)(g_hash_table_size (vtl->tracks)) ); + + item = gtk_image_menu_item_new_with_mnemonic ( _("Delete _All Routes") ); + gtk_image_menu_item_set_image ( (GtkImageMenuItem*)item, gtk_image_new_from_stock (GTK_STOCK_REMOVE, GTK_ICON_SIZE_MENU) ); + g_signal_connect_swapped ( G_OBJECT(item), "activate", G_CALLBACK(trw_layer_delete_all_routes), pass_along ); + gtk_menu_shell_append ( GTK_MENU_SHELL(delete_submenu), item ); + gtk_widget_show ( item ); + gtk_widget_set_sensitive ( item, (gboolean)(g_hash_table_size (vtl->routes)) ); + + item = gtk_image_menu_item_new_with_mnemonic ( _("_Delete Routes From Selection...") ); + gtk_image_menu_item_set_image ( (GtkImageMenuItem*)item, gtk_image_new_from_stock (GTK_STOCK_INDEX, GTK_ICON_SIZE_MENU) ); + g_signal_connect_swapped ( G_OBJECT(item), "activate", G_CALLBACK(trw_layer_delete_routes_from_selection), pass_along ); + gtk_menu_shell_append ( GTK_MENU_SHELL(delete_submenu), item ); + gtk_widget_show ( item ); + gtk_widget_set_sensitive ( item, (gboolean)(g_hash_table_size (vtl->routes)) ); + + item = gtk_image_menu_item_new_with_mnemonic ( _("Delete All _Waypoints") ); + gtk_image_menu_item_set_image ( (GtkImageMenuItem*)item, gtk_image_new_from_stock (GTK_STOCK_REMOVE, GTK_ICON_SIZE_MENU) ); + g_signal_connect_swapped ( G_OBJECT(item), "activate", G_CALLBACK(trw_layer_delete_all_waypoints), pass_along ); + gtk_menu_shell_append ( GTK_MENU_SHELL(delete_submenu), item ); + gtk_widget_show ( item ); + gtk_widget_set_sensitive ( item, (gboolean)(g_hash_table_size (vtl->waypoints)) ); + + item = gtk_image_menu_item_new_with_mnemonic ( _("Delete Waypoints From _Selection...") ); + gtk_image_menu_item_set_image ( (GtkImageMenuItem*)item, gtk_image_new_from_stock (GTK_STOCK_INDEX, GTK_ICON_SIZE_MENU) ); + g_signal_connect_swapped ( G_OBJECT(item), "activate", G_CALLBACK(trw_layer_delete_waypoints_from_selection), pass_along ); + gtk_menu_shell_append ( GTK_MENU_SHELL(delete_submenu), item ); + gtk_widget_show ( item ); + gtk_widget_set_sensitive ( item, (gboolean)(g_hash_table_size (vtl->waypoints)) ); + + item = gtk_image_menu_item_new_with_mnemonic ( _("Delete Duplicate Waypoints") ); + gtk_image_menu_item_set_image ( (GtkImageMenuItem*)item, gtk_image_new_from_stock (GTK_STOCK_DELETE, GTK_ICON_SIZE_MENU) ); + g_signal_connect_swapped ( G_OBJECT(item), "activate", G_CALLBACK(trw_layer_delete_duplicate_waypoints), pass_along ); + gtk_menu_shell_append ( GTK_MENU_SHELL(delete_submenu), item ); + gtk_widget_show ( item ); + gtk_widget_set_sensitive ( item, (gboolean)(g_hash_table_size (vtl->waypoints)) ); + + item = a_acquire_trwlayer_menu ( VIK_WINDOW(VIK_GTK_WINDOW_FROM_LAYER(vtl)), vlp, + vik_layers_panel_get_viewport(VIK_LAYERS_PANEL(vlp)), vtl ); + if ( item ) { + gtk_menu_shell_append (GTK_MENU_SHELL (menu), item); + gtk_widget_show ( item ); + } + + item = a_acquire_trwlayer_track_menu ( VIK_WINDOW(VIK_GTK_WINDOW_FROM_LAYER(vtl)), vlp, + vik_layers_panel_get_viewport(VIK_LAYERS_PANEL(vlp)), vtl ); + if ( item ) { + gtk_menu_shell_append (GTK_MENU_SHELL (menu), item); + gtk_widget_show ( item ); + } + + item = gtk_image_menu_item_new_with_mnemonic ( _("Track _List...") ); + gtk_image_menu_item_set_image ( (GtkImageMenuItem*)item, gtk_image_new_from_stock (GTK_STOCK_INDEX, GTK_ICON_SIZE_MENU) ); + g_signal_connect_swapped ( G_OBJECT(item), "activate", G_CALLBACK(trw_layer_track_list_dialog), pass_along ); + gtk_menu_shell_append ( GTK_MENU_SHELL(menu), item ); + gtk_widget_show ( item ); + gtk_widget_set_sensitive ( item, (gboolean)(g_hash_table_size (vtl->tracks)+g_hash_table_size (vtl->routes)) ); + + item = gtk_image_menu_item_new_with_mnemonic ( _("_Waypoint List...") ); + gtk_image_menu_item_set_image ( (GtkImageMenuItem*)item, gtk_image_new_from_stock (GTK_STOCK_INDEX, GTK_ICON_SIZE_MENU) ); + g_signal_connect_swapped ( G_OBJECT(item), "activate", G_CALLBACK(trw_layer_waypoint_list_dialog), pass_along ); + gtk_menu_shell_append ( GTK_MENU_SHELL(menu), item ); + gtk_widget_show ( item ); + gtk_widget_set_sensitive ( item, (gboolean)(g_hash_table_size (vtl->waypoints)) ); + + GtkWidget *external_submenu = create_external_submenu ( menu ); + // TODO: Should use selected layer's centre - rather than implicitly using the current viewport + vik_ext_tools_add_menu_items_to_menu ( VIK_WINDOW(VIK_GTK_WINDOW_FROM_LAYER(vtl)), GTK_MENU (external_submenu), NULL ); +} + +// Fake Waypoint UUIDs vi simple increasing integer +static guint wp_uuid = 0; + +void vik_trw_layer_add_waypoint ( VikTrwLayer *vtl, gchar *name, VikWaypoint *wp ) +{ + wp_uuid++; + + vik_waypoint_set_name (wp, name); + + if ( VIK_LAYER(vtl)->realized ) + { + // Do we need to create the sublayer: + if ( g_hash_table_size (vtl->waypoints) == 0 ) { + trw_layer_add_sublayer_waypoints ( vtl, VIK_LAYER(vtl)->vt, &(VIK_LAYER(vtl)->iter) ); + } + + GtkTreeIter *iter = g_malloc(sizeof(GtkTreeIter)); + + time_t timestamp = 0; + if ( wp->has_timestamp ) + timestamp = wp->timestamp; + + // Visibility column always needed for waypoints + vik_treeview_add_sublayer ( VIK_LAYER(vtl)->vt, &(vtl->waypoints_iter), iter, name, vtl, GUINT_TO_POINTER(wp_uuid), VIK_TRW_LAYER_SUBLAYER_WAYPOINT, get_wp_sym_small (wp->symbol), TRUE, timestamp ); + + // Actual setting of visibility dependent on the waypoint + vik_treeview_item_set_visible ( VIK_LAYER(vtl)->vt, iter, wp->visible ); + + g_hash_table_insert ( vtl->waypoints_iters, GUINT_TO_POINTER(wp_uuid), iter ); + + // Sort now as post_read is not called on a realized waypoint + vik_treeview_sort_children ( VIK_LAYER(vtl)->vt, &(vtl->waypoints_iter), vtl->wp_sort_order ); + } + + highest_wp_number_add_wp(vtl, name); + g_hash_table_insert ( vtl->waypoints, GUINT_TO_POINTER(wp_uuid), wp ); + +} + +// Fake Track UUIDs vi simple increasing integer +static guint tr_uuid = 0; + +void vik_trw_layer_add_track ( VikTrwLayer *vtl, gchar *name, VikTrack *t ) +{ + tr_uuid++; + + vik_track_set_name (t, name); + + if ( VIK_LAYER(vtl)->realized ) + { + // Do we need to create the sublayer: + if ( g_hash_table_size (vtl->tracks) == 0 ) { + trw_layer_add_sublayer_tracks ( vtl, VIK_LAYER(vtl)->vt, &(VIK_LAYER(vtl)->iter) ); + } + + GtkTreeIter *iter = g_malloc(sizeof(GtkTreeIter)); + + time_t timestamp = 0; + VikTrackpoint *tpt = vik_track_get_tp_first(t); + if ( tpt && tpt->has_timestamp ) + timestamp = tpt->timestamp; + + // Visibility column always needed for tracks + vik_treeview_add_sublayer ( VIK_LAYER(vtl)->vt, &(vtl->tracks_iter), iter, name, vtl, GUINT_TO_POINTER(tr_uuid), VIK_TRW_LAYER_SUBLAYER_TRACK, NULL, TRUE, timestamp ); + + // Actual setting of visibility dependent on the track + vik_treeview_item_set_visible ( VIK_LAYER(vtl)->vt, iter, t->visible ); + + g_hash_table_insert ( vtl->tracks_iters, GUINT_TO_POINTER(tr_uuid), iter ); + + // Sort now as post_read is not called on a realized track + vik_treeview_sort_children ( VIK_LAYER(vtl)->vt, &(vtl->tracks_iter), vtl->track_sort_order ); + } + + g_hash_table_insert ( vtl->tracks, GUINT_TO_POINTER(tr_uuid), t ); + + trw_layer_update_treeview ( vtl, t ); +} + +// Fake Route UUIDs vi simple increasing integer +static guint rt_uuid = 0; + +void vik_trw_layer_add_route ( VikTrwLayer *vtl, gchar *name, VikTrack *t ) +{ + rt_uuid++; + + vik_track_set_name (t, name); + + if ( VIK_LAYER(vtl)->realized ) + { + // Do we need to create the sublayer: + if ( g_hash_table_size (vtl->routes) == 0 ) { + trw_layer_add_sublayer_routes ( vtl, VIK_LAYER(vtl)->vt, &(VIK_LAYER(vtl)->iter) ); + } + + GtkTreeIter *iter = g_malloc(sizeof(GtkTreeIter)); + // Visibility column always needed for routes + vik_treeview_add_sublayer ( VIK_LAYER(vtl)->vt, &(vtl->routes_iter), iter, name, vtl, GUINT_TO_POINTER(rt_uuid), VIK_TRW_LAYER_SUBLAYER_ROUTE, NULL, TRUE, 0 ); // Routes don't have times + // Actual setting of visibility dependent on the route + vik_treeview_item_set_visible ( VIK_LAYER(vtl)->vt, iter, t->visible ); + + g_hash_table_insert ( vtl->routes_iters, GUINT_TO_POINTER(rt_uuid), iter ); + + // Sort now as post_read is not called on a realized route + vik_treeview_sort_children ( VIK_LAYER(vtl)->vt, &(vtl->routes_iter), vtl->track_sort_order ); + } + + g_hash_table_insert ( vtl->routes, GUINT_TO_POINTER(rt_uuid), t ); + + trw_layer_update_treeview ( vtl, t ); +} + +/* to be called whenever a track has been deleted or may have been changed. */ +void trw_layer_cancel_tps_of_track ( VikTrwLayer *vtl, VikTrack *trk ) +{ + if (vtl->current_tp_track == trk ) + trw_layer_cancel_current_tp ( vtl, FALSE ); +} + +/** + * Normally this is done to due the waypoint size preference having changed + */ +void vik_trw_layer_reset_waypoints ( VikTrwLayer *vtl ) +{ + GHashTableIter iter; + gpointer key, value; + + // Foreach waypoint + g_hash_table_iter_init ( &iter, vtl->waypoints ); + while ( g_hash_table_iter_next ( &iter, &key, &value ) ) { + VikWaypoint *wp = VIK_WAYPOINT(value); + if ( wp->symbol ) { + // Reapply symbol setting to update the pixbuf + gchar *tmp_symbol = g_strdup ( wp->symbol ); + vik_waypoint_set_symbol ( wp, tmp_symbol ); + g_free ( tmp_symbol ); + } + } +} + +/** + * trw_layer_new_unique_sublayer_name: + * + * Allocates a unique new name + */ +gchar *trw_layer_new_unique_sublayer_name (VikTrwLayer *vtl, gint sublayer_type, const gchar *name) +{ + gint i = 2; + gchar *newname = g_strdup(name); + + gpointer id = NULL; + do { + id = NULL; + switch ( sublayer_type ) { + case VIK_TRW_LAYER_SUBLAYER_TRACK: + id = (gpointer) vik_trw_layer_get_track ( vtl, newname ); + break; + case VIK_TRW_LAYER_SUBLAYER_WAYPOINT: + id = (gpointer) vik_trw_layer_get_waypoint ( vtl, newname ); + break; + default: + id = (gpointer) vik_trw_layer_get_route ( vtl, newname ); + break; + } + // If found a name already in use try adding 1 to it and we try again + if ( id ) { + const gchar *corename = newname; + gint newi = i; + // If name is already of the form text#N + // set name to text and i to N+1 + gchar **tokens = g_regex_split_simple ( "#(\\d+)", newname, G_REGEX_CASELESS, 0 ); + if ( tokens ) { + corename = tokens[0]; + if ( tokens[1] ) { + newi = atoi ( tokens[1] ) + 1; + } + } + gchar *new_newname = g_strdup_printf("%s#%d", corename, newi); + g_strfreev ( tokens ); + g_free(newname); + newname = new_newname; + i++; + } + } while ( id != NULL); + + return newname; +} + +void vik_trw_layer_filein_add_waypoint ( VikTrwLayer *vtl, gchar *name, VikWaypoint *wp ) +{ + // No more uniqueness of name forced when loading from a file + // This now makes this function a little redunant as we just flow the parameters through + vik_trw_layer_add_waypoint ( vtl, name, wp ); +} + +void vik_trw_layer_filein_add_track ( VikTrwLayer *vtl, gchar *name, VikTrack *tr ) +{ + if ( vtl->route_finder_append && vtl->current_track ) { + vik_track_remove_dup_points ( tr ); /* make "double point" track work to undo */ + + // enforce end of current track equal to start of tr + VikTrackpoint *cur_end = vik_track_get_tp_last ( vtl->current_track ); + VikTrackpoint *new_start = vik_track_get_tp_first ( tr ); + if ( cur_end && new_start ) { + if ( ! vik_coord_equals ( &cur_end->coord, &new_start->coord ) ) { + vik_track_add_trackpoint ( vtl->current_track, + vik_trackpoint_copy ( cur_end ), + FALSE ); + } + } + + vik_track_steal_and_append_trackpoints ( vtl->current_track, tr ); + vik_track_free ( tr ); + vtl->route_finder_append = FALSE; /* this means we have added it */ + } else { + + // No more uniqueness of name forced when loading from a file + if ( tr->is_route ) + vik_trw_layer_add_route ( vtl, name, tr ); + else + vik_trw_layer_add_track ( vtl, name, tr ); + + if ( vtl->route_finder_check_added_track ) { + vik_track_remove_dup_points ( tr ); /* make "double point" track work to undo */ + vtl->route_finder_added_track = tr; + } + } +} + +/** + * ATM Only for removing bad first points + */ +void vik_trw_layer_tidy_tracks ( VikTrwLayer *vtl, guint speed, gboolean recalc_bounds ) +{ + GHashTableIter iter; + gpointer key, value; + + g_hash_table_iter_init ( &iter, vtl->tracks ); + while ( g_hash_table_iter_next (&iter, &key, &value) ) { + VikTrack *trk = VIK_TRACK(value); + if ( vik_track_remove_dodgy_first_point ( trk, speed, FALSE ) ) + g_printf ( "%s: Removed dodgy first point from track: %s\n", __FUNCTION__, trk->name ); + } +} + +static void trw_layer_enum_item ( gpointer id, GList **tr, GList **l ) +{ + *l = g_list_append(*l, id); +} + +/* + * Move an item from one TRW layer to another TRW layer + */ +static void trw_layer_move_item ( VikTrwLayer *vtl_src, VikTrwLayer *vtl_dest, gpointer id, gint type ) +{ + // When an item is moved the name is checked to see if it clashes with an existing name + // in the destination layer and if so then it is allocated a new name + + // TODO reconsider strategy when moving within layer (if anything...) + if ( vtl_src == vtl_dest ) + return; + + if (type == VIK_TRW_LAYER_SUBLAYER_TRACK) { + VikTrack *trk = g_hash_table_lookup ( vtl_src->tracks, id ); + + gchar *newname = trw_layer_new_unique_sublayer_name ( vtl_dest, type, trk->name ); + + VikTrack *trk2 = vik_track_copy ( trk, TRUE ); + vik_trw_layer_add_track ( vtl_dest, newname, trk2 ); + g_free ( newname ); + vik_trw_layer_delete_track ( vtl_src, trk ); + // Reset layer timestamps in case they have now changed + vik_treeview_item_set_timestamp ( vtl_dest->vl.vt, &vtl_dest->vl.iter, trw_layer_get_timestamp(vtl_dest) ); + vik_treeview_item_set_timestamp ( vtl_src->vl.vt, &vtl_src->vl.iter, trw_layer_get_timestamp(vtl_src) ); + } + + if (type == VIK_TRW_LAYER_SUBLAYER_ROUTE) { + VikTrack *trk = g_hash_table_lookup ( vtl_src->routes, id ); + + gchar *newname = trw_layer_new_unique_sublayer_name ( vtl_dest, type, trk->name ); + + VikTrack *trk2 = vik_track_copy ( trk, TRUE ); + vik_trw_layer_add_route ( vtl_dest, newname, trk2 ); + g_free ( newname ); + vik_trw_layer_delete_route ( vtl_src, trk ); + } + + if (type == VIK_TRW_LAYER_SUBLAYER_WAYPOINT) { + VikWaypoint *wp = g_hash_table_lookup ( vtl_src->waypoints, id ); + + gchar *newname = trw_layer_new_unique_sublayer_name ( vtl_dest, type, wp->name ); + + VikWaypoint *wp2 = vik_waypoint_copy ( wp ); + vik_trw_layer_add_waypoint ( vtl_dest, newname, wp2 ); + g_free ( newname ); + trw_layer_delete_waypoint ( vtl_src, wp ); + + // Recalculate bounds even if not renamed as maybe dragged between layers + trw_layer_calculate_bounds_waypoints ( vtl_dest ); + trw_layer_calculate_bounds_waypoints ( vtl_src ); + // Reset layer timestamps in case they have now changed + vik_treeview_item_set_timestamp ( vtl_dest->vl.vt, &vtl_dest->vl.iter, trw_layer_get_timestamp(vtl_dest) ); + vik_treeview_item_set_timestamp ( vtl_src->vl.vt, &vtl_src->vl.iter, trw_layer_get_timestamp(vtl_src) ); + } +} + +static void trw_layer_drag_drop_request ( VikTrwLayer *vtl_src, VikTrwLayer *vtl_dest, GtkTreeIter *src_item_iter, GtkTreePath *dest_path ) +{ + VikTreeview *vt = VIK_LAYER(vtl_src)->vt; + gint type = vik_treeview_item_get_data(vt, src_item_iter); + + if (!vik_treeview_item_get_pointer(vt, src_item_iter)) { + GList *items = NULL; + GList *iter; + + if (type==VIK_TRW_LAYER_SUBLAYER_TRACKS) { + g_hash_table_foreach ( vtl_src->tracks, (GHFunc)trw_layer_enum_item, &items); + } + if (type==VIK_TRW_LAYER_SUBLAYER_WAYPOINTS) { + g_hash_table_foreach ( vtl_src->waypoints, (GHFunc)trw_layer_enum_item, &items); + } + if (type==VIK_TRW_LAYER_SUBLAYER_ROUTES) { + g_hash_table_foreach ( vtl_src->routes, (GHFunc)trw_layer_enum_item, &items); + } + + iter = items; + while (iter) { + if (type==VIK_TRW_LAYER_SUBLAYER_TRACKS) { + trw_layer_move_item ( vtl_src, vtl_dest, iter->data, VIK_TRW_LAYER_SUBLAYER_TRACK); + } else if (type==VIK_TRW_LAYER_SUBLAYER_ROUTES) { + trw_layer_move_item ( vtl_src, vtl_dest, iter->data, VIK_TRW_LAYER_SUBLAYER_ROUTE); + } else { + trw_layer_move_item ( vtl_src, vtl_dest, iter->data, VIK_TRW_LAYER_SUBLAYER_WAYPOINT); + } + iter = iter->next; + } + if (items) + g_list_free(items); + } else { + gpointer ptr = vik_treeview_item_get_pointer ( vt, src_item_iter ); + trw_layer_move_item ( vtl_src, vtl_dest, ptr, type ); + } +} + +gboolean trw_layer_track_find_uuid ( const gpointer id, const VikTrack *trk, gpointer udata ) +{ + trku_udata *user_data = udata; + if ( trk == user_data->trk ) { + user_data->uuid = id; + return TRUE; + } + return FALSE; +} + +gboolean vik_trw_layer_delete_track ( VikTrwLayer *vtl, VikTrack *trk ) +{ + gboolean was_visible = FALSE; + if ( trk && trk->name ) { + + if ( trk == vtl->current_track ) { + vtl->current_track = NULL; + vtl->current_tp_track = NULL; + vtl->current_tp_id = NULL; + vtl->moving_tp = FALSE; + } + + was_visible = trk->visible; + + if ( trk == vtl->route_finder_added_track ) + vtl->route_finder_added_track = NULL; + + trku_udata udata; + udata.trk = trk; + udata.uuid = NULL; + + // Hmmm, want key of it + gpointer trkf = g_hash_table_find ( vtl->tracks, (GHRFunc) trw_layer_track_find_uuid, &udata ); + + if ( trkf && udata.uuid ) { + /* could be current_tp, so we have to check */ + trw_layer_cancel_tps_of_track ( vtl, trk ); + + GtkTreeIter *it = g_hash_table_lookup ( vtl->tracks_iters, udata.uuid ); + + if ( it ) { + vik_treeview_item_delete ( VIK_LAYER(vtl)->vt, it ); + g_hash_table_remove ( vtl->tracks_iters, udata.uuid ); + g_hash_table_remove ( vtl->tracks, udata.uuid ); + + // If last sublayer, then remove sublayer container + if ( g_hash_table_size (vtl->tracks) == 0 ) { + vik_treeview_item_delete ( VIK_LAYER(vtl)->vt, &(vtl->tracks_iter) ); + } + } + // Incase it was selected (no item delete signal ATM) + vik_window_clear_highlight ( VIK_WINDOW(VIK_GTK_WINDOW_FROM_LAYER(vtl)) ); + } + } + return was_visible; +} + +gboolean vik_trw_layer_delete_route ( VikTrwLayer *vtl, VikTrack *trk ) +{ + gboolean was_visible = FALSE; + + if ( trk && trk->name ) { + + if ( trk == vtl->current_track ) { + vtl->current_track = NULL; + vtl->current_tp_track = NULL; + vtl->current_tp_id = NULL; + vtl->moving_tp = FALSE; + } + + was_visible = trk->visible; + + if ( trk == vtl->route_finder_added_track ) + vtl->route_finder_added_track = NULL; + + trku_udata udata; + udata.trk = trk; + udata.uuid = NULL; + + // Hmmm, want key of it + gpointer trkf = g_hash_table_find ( vtl->routes, (GHRFunc) trw_layer_track_find_uuid, &udata ); + + if ( trkf && udata.uuid ) { + /* could be current_tp, so we have to check */ + trw_layer_cancel_tps_of_track ( vtl, trk ); + + GtkTreeIter *it = g_hash_table_lookup ( vtl->routes_iters, udata.uuid ); + + if ( it ) { + vik_treeview_item_delete ( VIK_LAYER(vtl)->vt, it ); + g_hash_table_remove ( vtl->routes_iters, udata.uuid ); + g_hash_table_remove ( vtl->routes, udata.uuid ); + + // If last sublayer, then remove sublayer container + if ( g_hash_table_size (vtl->routes) == 0 ) { + vik_treeview_item_delete ( VIK_LAYER(vtl)->vt, &(vtl->routes_iter) ); + } + } + // Incase it was selected (no item delete signal ATM) + vik_window_clear_highlight ( VIK_WINDOW(VIK_GTK_WINDOW_FROM_LAYER(vtl)) ); + } + } + return was_visible; +} + +static void delete_waypoint_low_level ( VikTrwLayer *vtl, VikWaypoint *wp, gpointer uuid, GtkTreeIter *it ) +{ + vik_treeview_item_delete ( VIK_LAYER(vtl)->vt, it ); + g_hash_table_remove ( vtl->waypoints_iters, uuid ); + + highest_wp_number_remove_wp ( vtl, wp->name ); + g_hash_table_remove ( vtl->waypoints, uuid ); // last because this frees the name +} + +static gboolean trw_layer_delete_waypoint ( VikTrwLayer *vtl, VikWaypoint *wp ) +{ + gboolean was_visible = FALSE; + + if ( wp && wp->name ) { + + if ( wp == vtl->current_wp ) { + vtl->current_wp = NULL; + vtl->current_wp_id = NULL; + vtl->moving_wp = FALSE; + } + + was_visible = wp->visible; + + wpu_udata udata; + udata.wp = wp; + udata.uuid = NULL; + + // Hmmm, want key of it + gpointer wpf = g_hash_table_find ( vtl->waypoints, (GHRFunc) trw_layer_waypoint_find_uuid, (gpointer) &udata ); + + if ( wpf && udata.uuid ) { + GtkTreeIter *it = g_hash_table_lookup ( vtl->waypoints_iters, udata.uuid ); + + if ( it ) { + delete_waypoint_low_level ( vtl, wp, udata.uuid, it ); + + // If last sublayer, then remove sublayer container + if ( g_hash_table_size (vtl->waypoints) == 0 ) { + vik_treeview_item_delete ( VIK_LAYER(vtl)->vt, &(vtl->waypoints_iter) ); + } + } + // Incase it was selected (no item delete signal ATM) + vik_window_clear_highlight ( VIK_WINDOW(VIK_GTK_WINDOW_FROM_LAYER(vtl)) ); + } + + } + + return was_visible; +} + +// Only for temporary use by trw_layer_delete_waypoint_by_name +static gboolean trw_layer_waypoint_find_uuid_by_name ( const gpointer id, const VikWaypoint *wp, gpointer udata ) +{ + wpu_udata *user_data = udata; + if ( ! strcmp ( wp->name, user_data->wp->name ) ) { + user_data->uuid = id; + return TRUE; + } + return FALSE; +} + +/* + * Delete a waypoint by the given name + * NOTE: ATM this will delete the first encountered Waypoint with the specified name + * as there be multiple waypoints with the same name + */ +static gboolean trw_layer_delete_waypoint_by_name ( VikTrwLayer *vtl, const gchar *name ) +{ + wpu_udata udata; + // Fake a waypoint with the given name + udata.wp = vik_waypoint_new (); + vik_waypoint_set_name (udata.wp, name); + // Currently only the name is used in this waypoint find function + udata.uuid = NULL; + + // Hmmm, want key of it + gpointer wpf = g_hash_table_find ( vtl->waypoints, (GHRFunc) trw_layer_waypoint_find_uuid_by_name, (gpointer) &udata ); + + vik_waypoint_free (udata.wp); + + if ( wpf && udata.uuid ) + return trw_layer_delete_waypoint (vtl, g_hash_table_lookup ( vtl->waypoints, udata.uuid )); + else + return FALSE; +} + +typedef struct { + VikTrack *trk; // input + gpointer uuid; // output +} tpu_udata; + +// Only for temporary use by trw_layer_delete_track_by_name +static gboolean trw_layer_track_find_uuid_by_name ( const gpointer id, const VikTrack *trk, gpointer udata ) +{ + tpu_udata *user_data = udata; + if ( ! strcmp ( trk->name, user_data->trk->name ) ) { + user_data->uuid = id; + return TRUE; + } + return FALSE; +} + +/* + * Delete a track by the given name + * NOTE: ATM this will delete the first encountered Track with the specified name + * as there may be multiple tracks with the same name within the specified hash table + */ +static gboolean trw_layer_delete_track_by_name ( VikTrwLayer *vtl, const gchar *name, GHashTable *ht_tracks ) +{ + tpu_udata udata; + // Fake a track with the given name + udata.trk = vik_track_new (); + vik_track_set_name (udata.trk, name); + // Currently only the name is used in this waypoint find function + udata.uuid = NULL; + + // Hmmm, want key of it + gpointer trkf = g_hash_table_find ( ht_tracks, (GHRFunc) trw_layer_track_find_uuid_by_name, &udata ); + + vik_track_free (udata.trk); + + if ( trkf && udata.uuid ) { + // This could be a little better written... + if ( vtl->tracks == ht_tracks ) + return vik_trw_layer_delete_track (vtl, g_hash_table_lookup ( ht_tracks, udata.uuid )); + if ( vtl->routes == ht_tracks ) + return vik_trw_layer_delete_route (vtl, g_hash_table_lookup ( ht_tracks, udata.uuid )); + return FALSE; + } + else + return FALSE; +} + +static void remove_item_from_treeview ( const gpointer id, GtkTreeIter *it, VikTreeview * vt ) +{ + vik_treeview_item_delete (vt, it ); +} + +void vik_trw_layer_delete_all_routes ( VikTrwLayer *vtl ) +{ + + vtl->current_track = NULL; + vtl->route_finder_added_track = NULL; + if (vtl->current_tp_track) + trw_layer_cancel_current_tp(vtl, FALSE); + + g_hash_table_foreach(vtl->routes_iters, (GHFunc) remove_item_from_treeview, VIK_LAYER(vtl)->vt); + g_hash_table_remove_all(vtl->routes_iters); + + if ( g_hash_table_size (vtl->routes) > 0 ) + vik_treeview_item_delete ( VIK_LAYER(vtl)->vt, &(vtl->routes_iter) ); + g_hash_table_remove_all(vtl->routes); + + vik_layer_emit_update ( VIK_LAYER(vtl) ); +} + +void vik_trw_layer_delete_all_tracks ( VikTrwLayer *vtl ) +{ + + vtl->current_track = NULL; + vtl->route_finder_added_track = NULL; + if (vtl->current_tp_track) + trw_layer_cancel_current_tp(vtl, FALSE); + + g_hash_table_foreach(vtl->tracks_iters, (GHFunc) remove_item_from_treeview, VIK_LAYER(vtl)->vt); + g_hash_table_remove_all(vtl->tracks_iters); + + if ( g_hash_table_size (vtl->tracks) > 0 ) + vik_treeview_item_delete ( VIK_LAYER(vtl)->vt, &(vtl->tracks_iter) ); + g_hash_table_remove_all(vtl->tracks); + + vik_layer_emit_update ( VIK_LAYER(vtl) ); +} + +void vik_trw_layer_delete_all_waypoints ( VikTrwLayer *vtl ) +{ + vtl->current_wp = NULL; + vtl->current_wp_id = NULL; + vtl->moving_wp = FALSE; + + highest_wp_number_reset(vtl); + + g_hash_table_foreach(vtl->waypoints_iters, (GHFunc) remove_item_from_treeview, VIK_LAYER(vtl)->vt); + g_hash_table_remove_all(vtl->waypoints_iters); + + if ( g_hash_table_size (vtl->waypoints) > 0 ) + vik_treeview_item_delete ( VIK_LAYER(vtl)->vt, &(vtl->waypoints_iter) ); + g_hash_table_remove_all(vtl->waypoints); + + vik_layer_emit_update ( VIK_LAYER(vtl) ); +} + +static void trw_layer_delete_all_tracks ( menu_array_layer values ) +{ + VikTrwLayer *vtl = VIK_TRW_LAYER(values[MA_VTL]); + // Get confirmation from the user + if ( a_dialog_yes_or_no ( VIK_GTK_WINDOW_FROM_LAYER(vtl), + _("Are you sure you want to delete all tracks in %s?"), + vik_layer_get_name ( VIK_LAYER(vtl) ) ) ) { + vik_trw_layer_delete_all_tracks (vtl); + if ( values[MA_VLP] ) + vik_layers_panel_calendar_update ( VIK_LAYERS_PANEL(values[MA_VLP]) ); + } +} + +static void trw_layer_delete_all_routes ( menu_array_layer values ) +{ + VikTrwLayer *vtl = VIK_TRW_LAYER(values[MA_VTL]); + // Get confirmation from the user + if ( a_dialog_yes_or_no ( VIK_GTK_WINDOW_FROM_LAYER(vtl), + _("Are you sure you want to delete all routes in %s?"), + vik_layer_get_name ( VIK_LAYER(vtl) ) ) ) + vik_trw_layer_delete_all_routes (vtl); +} + +static void trw_layer_delete_all_waypoints ( menu_array_layer values ) +{ + VikTrwLayer *vtl = VIK_TRW_LAYER(values[MA_VTL]); + // Get confirmation from the user + if ( a_dialog_yes_or_no ( VIK_GTK_WINDOW_FROM_LAYER(vtl), + _("Are you sure you want to delete all waypoints in %s?"), + vik_layer_get_name ( VIK_LAYER(vtl) ) ) ) + vik_trw_layer_delete_all_waypoints (vtl); +} + +static void trw_layer_delete_item ( menu_array_sublayer values ) +{ + VikTrwLayer *vtl = VIK_TRW_LAYER(values[MA_VTL]); + gboolean was_visible = FALSE; + if ( GPOINTER_TO_INT (values[MA_SUBTYPE]) == VIK_TRW_LAYER_SUBLAYER_WAYPOINT ) + { + VikWaypoint *wp = g_hash_table_lookup ( vtl->waypoints, values[MA_SUBLAYER_ID] ); + if ( wp && wp->name ) { + if ( GPOINTER_TO_INT (values[MA_CONFIRM]) ) + // Get confirmation from the user + // Maybe this Waypoint Delete should be optional as is it could get annoying... + if ( ! a_dialog_yes_or_no ( VIK_GTK_WINDOW_FROM_LAYER(vtl), + _("Are you sure you want to delete the waypoint \"%s\"?"), + wp->name ) ) + return; + was_visible = trw_layer_delete_waypoint ( vtl, wp ); + trw_layer_calculate_bounds_waypoints ( vtl ); + // Reset layer timestamp in case it has now changed + vik_treeview_item_set_timestamp ( vtl->vl.vt, &vtl->vl.iter, trw_layer_get_timestamp(vtl) ); + } + } + else if ( GPOINTER_TO_INT (values[MA_SUBTYPE]) == VIK_TRW_LAYER_SUBLAYER_TRACK ) + { + VikTrack *trk = g_hash_table_lookup ( vtl->tracks, values[MA_SUBLAYER_ID] ); + if ( trk && trk->name ) { + if ( GPOINTER_TO_INT (values[MA_CONFIRM]) ) + // Get confirmation from the user + if ( ! a_dialog_yes_or_no ( VIK_GTK_WINDOW_FROM_LAYER(vtl), + _("Are you sure you want to delete the track \"%s\"?"), + trk->name ) ) + return; + was_visible = vik_trw_layer_delete_track ( vtl, trk ); + // Reset layer timestamp in case it has now changed + vik_treeview_item_set_timestamp ( vtl->vl.vt, &vtl->vl.iter, trw_layer_get_timestamp(vtl) ); + if ( values[MA_VLP] ) + vik_layers_panel_calendar_update ( VIK_LAYERS_PANEL(values[MA_VLP]) ); + } + } + else + { + VikTrack *trk = g_hash_table_lookup ( vtl->routes, values[MA_SUBLAYER_ID] ); + if ( trk && trk->name ) { + if ( GPOINTER_TO_INT (values[MA_CONFIRM]) ) + // Get confirmation from the user + if ( ! a_dialog_yes_or_no ( VIK_GTK_WINDOW_FROM_LAYER(vtl), + _("Are you sure you want to delete the route \"%s\"?"), + trk->name ) ) + return; + was_visible = vik_trw_layer_delete_route ( vtl, trk ); + } + } + if ( was_visible ) + vik_layer_emit_update ( VIK_LAYER(vtl) ); +} + +/** + * Rename waypoint and maintain corresponding name of waypoint in the treeview + */ +void trw_layer_waypoint_rename ( VikTrwLayer *vtl, VikWaypoint *wp, const gchar *new_name ) +{ + vik_waypoint_set_name ( wp, new_name ); + + // Now update the treeview as well + wpu_udata udataU; + udataU.wp = wp; + udataU.uuid = NULL; + + // Need key of it for treeview update + gpointer wpf = g_hash_table_find ( vtl->waypoints, (GHRFunc) trw_layer_waypoint_find_uuid, &udataU ); + + if ( wpf && udataU.uuid ) { + GtkTreeIter *it = g_hash_table_lookup ( vtl->waypoints_iters, udataU.uuid ); + + if ( it ) { + vik_treeview_item_set_name ( VIK_LAYER(vtl)->vt, it, new_name ); + vik_treeview_sort_children ( VIK_LAYER(vtl)->vt, &(vtl->waypoints_iter), vtl->wp_sort_order ); + } + } +} + +/** + * Maintain icon of waypoint in the treeview + */ +void trw_layer_waypoint_reset_icon ( VikTrwLayer *vtl, VikWaypoint *wp ) +{ + // update the treeview + wpu_udata udataU; + udataU.wp = wp; + udataU.uuid = NULL; + + // Need key of it for treeview update + gpointer wpf = g_hash_table_find ( vtl->waypoints, (GHRFunc) trw_layer_waypoint_find_uuid, &udataU ); + + if ( wpf && udataU.uuid ) { + GtkTreeIter *it = g_hash_table_lookup ( vtl->waypoints_iters, udataU.uuid ); + + if ( it ) { + vik_treeview_item_set_icon ( VIK_LAYER(vtl)->vt, it, get_wp_sym_small (wp->symbol) ); + } + } +} + +static void trw_layer_properties_item ( menu_array_sublayer values ) +{ + VikTrwLayer *vtl = VIK_TRW_LAYER(values[MA_VTL]); + if ( GPOINTER_TO_INT (values[MA_SUBTYPE]) == VIK_TRW_LAYER_SUBLAYER_WAYPOINT ) + { + VikWaypoint *wp = g_hash_table_lookup ( vtl->waypoints, values[MA_SUBLAYER_ID] ); + + if ( wp && wp->name ) + { + gboolean updated = FALSE; + gchar *new_name = a_dialog_waypoint ( VIK_GTK_WINDOW_FROM_LAYER(vtl), wp->name, vtl, wp, vtl->coord_mode, FALSE, &updated ); + if ( new_name ) + trw_layer_waypoint_rename ( vtl, wp, new_name ); + + if ( updated && values[MA_TV_ITER] ) + vik_treeview_item_set_icon ( VIK_LAYER(vtl)->vt, values[MA_TV_ITER], get_wp_sym_small (wp->symbol) ); + + if ( updated && VIK_LAYER(vtl)->visible ) + vik_layer_emit_update ( VIK_LAYER(vtl) ); + + // Position could have changed + if ( updated ) + trw_layer_calculate_bounds_waypoints ( vtl ); + } + } + else + { + VikTrack *tr; + if ( GPOINTER_TO_INT (values[MA_SUBTYPE]) == VIK_TRW_LAYER_SUBLAYER_TRACK ) + tr = g_hash_table_lookup ( vtl->tracks, values[MA_SUBLAYER_ID] ); + else + tr = g_hash_table_lookup ( vtl->routes, values[MA_SUBLAYER_ID] ); + + if ( tr && tr->name ) + { + vik_trw_layer_propwin_run ( VIK_GTK_WINDOW_FROM_LAYER(vtl), + vtl, + tr, + values[MA_VLP], + values[MA_VVP], + FALSE ); + } + } +} + +/** + * trw_layer_track_statistics: + * + * Show track statistics. + * ATM jump to the stats page in the properties + * TODO: consider separating the stats into an individual dialog? + */ +static void trw_layer_track_statistics ( menu_array_sublayer values ) +{ + VikTrwLayer *vtl = VIK_TRW_LAYER(values[MA_VTL]); + VikTrack *trk; + if ( GPOINTER_TO_INT (values[MA_SUBTYPE]) == VIK_TRW_LAYER_SUBLAYER_TRACK ) + trk = g_hash_table_lookup ( vtl->tracks, values[MA_SUBLAYER_ID] ); + else + trk = g_hash_table_lookup ( vtl->routes, values[MA_SUBLAYER_ID] ); + + if ( trk && trk->name ) { + vik_trw_layer_propwin_run ( VIK_GTK_WINDOW_FROM_LAYER(vtl), + vtl, + trk, + values[MA_VLP], + values[MA_VVP], + TRUE ); + } +} + +/* + * Update the treeview of the track id - primarily to update the icon + */ +void trw_layer_update_treeview ( VikTrwLayer *vtl, VikTrack *trk ) +{ + trku_udata udata; + udata.trk = trk; + udata.uuid = NULL; + + gpointer trkf = NULL; + if ( trk->is_route ) + trkf = g_hash_table_find ( vtl->routes, (GHRFunc) trw_layer_track_find_uuid, &udata ); + else + trkf = g_hash_table_find ( vtl->tracks, (GHRFunc) trw_layer_track_find_uuid, &udata ); + + if ( trkf && udata.uuid ) { + + GtkTreeIter *iter = NULL; + if ( trk->is_route ) + iter = g_hash_table_lookup ( vtl->routes_iters, udata.uuid ); + else + iter = g_hash_table_lookup ( vtl->tracks_iters, udata.uuid ); + + if ( iter ) { + // TODO: Make this a function + GdkPixbuf *pixbuf = gdk_pixbuf_new ( GDK_COLORSPACE_RGB, FALSE, 8, 18, 18); + guint32 pixel = ((trk->color.red & 0xff00) << 16) | + ((trk->color.green & 0xff00) << 8) | + (trk->color.blue & 0xff00); + gdk_pixbuf_fill ( pixbuf, pixel ); + vik_treeview_item_set_icon ( VIK_LAYER(vtl)->vt, iter, pixbuf ); + g_object_unref (pixbuf); + } + + } +} + +/* + Parameter 1 -> VikLayersPanel + Parameter 2 -> VikLayer + Parameter 3 -> VikViewport +*/ +static void goto_coord ( gpointer *vlp, gpointer vl, gpointer vvp, const VikCoord *coord ) +{ + if ( vlp ) { + vik_viewport_set_center_coord ( vik_layers_panel_get_viewport (VIK_LAYERS_PANEL(vlp)), coord, TRUE ); + vik_layers_panel_emit_update ( VIK_LAYERS_PANEL(vlp) ); + } + else { + /* since vlp not set, vl & vvp should be valid instead! */ + if ( vl && vvp ) { + vik_viewport_set_center_coord ( VIK_VIEWPORT(vvp), coord, TRUE ); + vik_layer_emit_update ( VIK_LAYER(vl) ); + } + } +} + +static void trw_layer_goto_track_startpoint ( menu_array_sublayer values ) +{ + VikTrwLayer *vtl = (VikTrwLayer *)values[MA_VTL]; + VikTrack *track; + if ( GPOINTER_TO_INT (values[MA_SUBTYPE]) == VIK_TRW_LAYER_SUBLAYER_ROUTE ) + track = (VikTrack *) g_hash_table_lookup ( vtl->routes, values[MA_SUBLAYER_ID] ); + else + track = (VikTrack *) g_hash_table_lookup ( vtl->tracks, values[MA_SUBLAYER_ID] ); + + if ( track && track->trackpoints ) + goto_coord ( values[MA_VLP], vtl, values[MA_VVP], &(vik_track_get_tp_first(track)->coord) ); +} + +static void trw_layer_goto_track_center ( menu_array_sublayer values ) +{ + VikTrwLayer *vtl = (VikTrwLayer *)values[MA_VTL]; + VikTrack *track; + if ( GPOINTER_TO_INT (values[MA_SUBTYPE]) == VIK_TRW_LAYER_SUBLAYER_ROUTE ) + track = (VikTrack *) g_hash_table_lookup ( vtl->routes, values[MA_SUBLAYER_ID] ); + else + track = (VikTrack *) g_hash_table_lookup ( vtl->tracks, values[MA_SUBLAYER_ID] ); + + if ( track && track->trackpoints ) + { + struct LatLon average, maxmin[2] = { {0,0}, {0,0} }; + VikCoord coord; + trw_layer_find_maxmin_tracks ( NULL, track, maxmin ); + average.lat = (maxmin[0].lat+maxmin[1].lat)/2; + average.lon = (maxmin[0].lon+maxmin[1].lon)/2; + vik_coord_load_from_latlon ( &coord, vtl->coord_mode, &average ); + goto_coord ( values[MA_VLP], vtl, values[MA_VVP], &coord); + } +} + +static void trw_layer_goto_track_date ( menu_array_sublayer values ) +{ + VikTrwLayer *vtl = (VikTrwLayer *)values[MA_VTL]; + VikTrack *track; + if ( GPOINTER_TO_INT (values[MA_SUBTYPE]) == VIK_TRW_LAYER_SUBLAYER_TRACK ) + track = (VikTrack *) g_hash_table_lookup ( vtl->tracks, values[MA_SUBLAYER_ID] ); + else + // No dates on routes + return; + + if ( track && track->trackpoints ) { + VikTrackpoint *tp = vik_track_get_tp_first( track ); + if ( tp->has_timestamp ) { + vik_layers_panel_calendar_date ( VIK_LAYERS_PANEL(values[MA_VLP]), tp->timestamp ); + } + } +} + +static void trw_layer_convert_track_route ( menu_array_sublayer values ) +{ + VikTrwLayer *vtl = (VikTrwLayer *)values[MA_VTL]; + VikTrack *trk; + if ( GPOINTER_TO_INT (values[MA_SUBTYPE]) == VIK_TRW_LAYER_SUBLAYER_ROUTE ) + trk = (VikTrack *) g_hash_table_lookup ( vtl->routes, values[MA_SUBLAYER_ID] ); + else + trk = (VikTrack *) g_hash_table_lookup ( vtl->tracks, values[MA_SUBLAYER_ID] ); + + if ( !trk ) + return; + + // Converting a track to a route can be a bit more complicated, + // so give a chance to change our minds: + if ( !trk->is_route && + ( ( vik_track_get_segment_count ( trk ) > 1 ) || + ( vik_track_get_average_speed ( trk ) > 0.0 ) ) ) { + + if ( ! a_dialog_yes_or_no ( VIK_GTK_WINDOW_FROM_LAYER(vtl), + _("Converting a track to a route removes extra track data such as segments, timestamps, etc...\nDo you want to continue?"), NULL ) ) + return; +} + + // Copy it + VikTrack *trk_copy = vik_track_copy ( trk, TRUE ); + + // Convert + trk_copy->is_route = !trk_copy->is_route; + + // ATM can't set name to self - so must create temporary copy + gchar *name = g_strdup ( trk_copy->name ); + + // Delete old one and then add new one + if ( trk->is_route ) { + vik_trw_layer_delete_route ( vtl, trk ); + vik_trw_layer_add_track ( vtl, name, trk_copy ); + } + else { + // Extra route conversion bits... + (void)vik_track_merge_segments ( trk_copy ); + vik_track_to_routepoints ( trk_copy ); + + vik_trw_layer_delete_track ( vtl, trk ); + vik_trw_layer_add_route ( vtl, name, trk_copy ); + } + g_free ( name ); + + // Update in case color of track / route changes when moving between sublayers + vik_layer_emit_update ( VIK_LAYER(vtl) ); +} + +static void trw_layer_anonymize_times ( menu_array_sublayer values ) +{ + VikTrwLayer *vtl = (VikTrwLayer *)values[MA_VTL]; + VikTrack *track; + if ( GPOINTER_TO_INT (values[MA_SUBTYPE]) == VIK_TRW_LAYER_SUBLAYER_ROUTE ) + track = (VikTrack *) g_hash_table_lookup ( vtl->routes, values[MA_SUBLAYER_ID] ); + else + track = (VikTrack *) g_hash_table_lookup ( vtl->tracks, values[MA_SUBLAYER_ID] ); + + if ( track ) + vik_track_anonymize_times ( track ); +} + +static void trw_layer_interpolate_times ( menu_array_sublayer values ) +{ + VikTrwLayer *vtl = (VikTrwLayer *)values[MA_VTL]; + VikTrack *track; + if ( GPOINTER_TO_INT (values[MA_SUBTYPE]) == VIK_TRW_LAYER_SUBLAYER_ROUTE ) + track = (VikTrack *) g_hash_table_lookup ( vtl->routes, values[MA_SUBLAYER_ID] ); + else + track = (VikTrack *) g_hash_table_lookup ( vtl->tracks, values[MA_SUBLAYER_ID] ); + + if ( track ) + vik_track_interpolate_times ( track ); +} + +static void trw_layer_extend_track_end ( menu_array_sublayer values ) +{ + VikTrwLayer *vtl = VIK_TRW_LAYER(values[MA_VTL]); + VikTrack *track; + if ( GPOINTER_TO_INT (values[MA_SUBTYPE]) == VIK_TRW_LAYER_SUBLAYER_ROUTE ) + track = (VikTrack *) g_hash_table_lookup ( vtl->routes, values[MA_SUBLAYER_ID] ); + else + track = (VikTrack *) g_hash_table_lookup ( vtl->tracks, values[MA_SUBLAYER_ID] ); + + if ( !track ) + return; + + vtl->current_track = track; + vik_window_enable_layer_tool ( VIK_WINDOW(VIK_GTK_WINDOW_FROM_LAYER(vtl)), VIK_LAYER_TRW, track->is_route ? TOOL_CREATE_ROUTE : TOOL_CREATE_TRACK); + + if ( track->trackpoints ) + goto_coord ( values[MA_VLP], vtl, values[MA_VVP], &(vik_track_get_tp_last(track)->coord) ); +} + +/** + * extend a track using route finder + */ +static void trw_layer_extend_track_end_route_finder ( menu_array_sublayer values ) +{ + VikTrwLayer *vtl = VIK_TRW_LAYER(values[MA_VTL]); + VikTrack *track = g_hash_table_lookup ( vtl->routes, values[MA_SUBLAYER_ID] ); + if ( !track ) + return; + + vik_window_enable_layer_tool ( VIK_WINDOW(VIK_GTK_WINDOW_FROM_LAYER(vtl)), VIK_LAYER_TRW, TOOL_ROUTE_FINDER ); + vtl->current_track = track; + + if ( track->trackpoints ) + goto_coord ( values[MA_VLP], vtl, values[MA_VVP], &vik_track_get_tp_last(track)->coord ); +} + +/** + * + */ +static gboolean trw_layer_dem_test ( VikTrwLayer *vtl, VikLayersPanel *vlp ) +{ + // If have a vlp then perform a basic test to see if any DEM info available... + if ( vlp ) { + GList *dems = vik_layers_panel_get_all_layers_of_type (vlp, VIK_LAYER_DEM, TRUE); // Includes hidden DEM layer types + + if ( !g_list_length(dems) ) { + a_dialog_error_msg (VIK_GTK_WINDOW_FROM_LAYER(vtl), _("No DEM layers available, thus no DEM values can be applied.") ); + return FALSE; + } + } + return TRUE; +} + +/** + * apply_dem_data_common: + * + * A common function for applying the DEM values and reporting the results. + */ +static void apply_dem_data_common ( VikTrwLayer *vtl, VikLayersPanel *vlp, VikTrack *track, gboolean skip_existing_elevations ) +{ + if ( !trw_layer_dem_test ( vtl, vlp ) ) + return; + + gulong changed = vik_track_apply_dem_data ( track, skip_existing_elevations ); + // Inform user how much was changed + gchar str[64]; + const gchar *tmp_str = ngettext("%ld point adjusted", "%ld points adjusted", changed); + g_snprintf(str, 64, tmp_str, changed); + a_dialog_info_msg (VIK_GTK_WINDOW_FROM_LAYER(vtl), str); +} + +static void trw_layer_apply_dem_data_all ( menu_array_sublayer values ) +{ + VikTrwLayer *vtl = (VikTrwLayer *)values[MA_VTL]; + VikTrack *track; + if ( GPOINTER_TO_INT (values[MA_SUBTYPE]) == VIK_TRW_LAYER_SUBLAYER_ROUTE ) + track = (VikTrack *) g_hash_table_lookup ( vtl->routes, values[MA_SUBLAYER_ID] ); + else + track = (VikTrack *) g_hash_table_lookup ( vtl->tracks, values[MA_SUBLAYER_ID] ); + + if ( track ) + apply_dem_data_common ( vtl, values[MA_VLP], track, FALSE ); +} + +static void trw_layer_apply_dem_data_only_missing ( menu_array_sublayer values ) +{ + VikTrwLayer *vtl = (VikTrwLayer *)values[MA_VTL]; + VikTrack *track; + if ( GPOINTER_TO_INT (values[MA_SUBTYPE]) == VIK_TRW_LAYER_SUBLAYER_ROUTE ) + track = (VikTrack *) g_hash_table_lookup ( vtl->routes, values[MA_SUBLAYER_ID] ); + else + track = (VikTrack *) g_hash_table_lookup ( vtl->tracks, values[MA_SUBLAYER_ID] ); + + if ( track ) + apply_dem_data_common ( vtl, values[MA_VLP], track, TRUE ); +} + +/** + * smooth_it: + * + * A common function for applying the elevation smoothing and reporting the results. + */ +static void smooth_it ( VikTrwLayer *vtl, VikTrack *track, gboolean flat ) +{ + gulong changed = vik_track_smooth_missing_elevation_data ( track, flat ); + // Inform user how much was changed + gchar str[64]; + const gchar *tmp_str = ngettext("%ld point adjusted", "%ld points adjusted", changed); + g_snprintf(str, 64, tmp_str, changed); + a_dialog_info_msg (VIK_GTK_WINDOW_FROM_LAYER(vtl), str); +} + +/** + * + */ +static void trw_layer_missing_elevation_data_interp ( menu_array_sublayer values ) +{ + VikTrwLayer *vtl = (VikTrwLayer *)values[MA_VTL]; + VikTrack *track; + if ( GPOINTER_TO_INT (values[MA_SUBTYPE]) == VIK_TRW_LAYER_SUBLAYER_ROUTE ) + track = (VikTrack *) g_hash_table_lookup ( vtl->routes, values[MA_SUBLAYER_ID] ); + else + track = (VikTrack *) g_hash_table_lookup ( vtl->tracks, values[MA_SUBLAYER_ID] ); + + if ( !track ) + return; + + smooth_it ( vtl, track, FALSE ); +} + +static void trw_layer_missing_elevation_data_flat ( menu_array_sublayer values ) +{ + VikTrwLayer *vtl = (VikTrwLayer *)values[MA_VTL]; + VikTrack *track; + if ( GPOINTER_TO_INT (values[MA_SUBTYPE]) == VIK_TRW_LAYER_SUBLAYER_ROUTE ) + track = (VikTrack *) g_hash_table_lookup ( vtl->routes, values[MA_SUBLAYER_ID] ); + else + track = (VikTrack *) g_hash_table_lookup ( vtl->tracks, values[MA_SUBLAYER_ID] ); + + if ( !track ) + return; + + smooth_it ( vtl, track, TRUE ); +} + +/** + * Commonal helper function + */ +static void wp_changed_message ( VikTrwLayer *vtl, gint changed ) +{ + gchar str[64]; + const gchar *tmp_str = ngettext("%ld waypoint changed", "%ld waypoints changed", changed); + g_snprintf(str, 64, tmp_str, changed); + a_dialog_info_msg (VIK_GTK_WINDOW_FROM_LAYER(vtl), str); +} + +static void trw_layer_apply_dem_data_wpt_all ( menu_array_sublayer values ) +{ + VikTrwLayer *vtl = (VikTrwLayer *)values[MA_VTL]; + VikLayersPanel *vlp = (VikLayersPanel *)values[MA_VLP]; + + if ( !trw_layer_dem_test ( vtl, vlp ) ) + return; + + gint changed = 0; + if ( GPOINTER_TO_INT (values[MA_SUBTYPE]) == VIK_TRW_LAYER_SUBLAYER_WAYPOINT ) { + // Single Waypoint + VikWaypoint *wp = (VikWaypoint *) g_hash_table_lookup ( vtl->waypoints, values[MA_SUBLAYER_ID] ); + if ( wp ) + changed = (gint)vik_waypoint_apply_dem_data ( wp, FALSE ); + } + else { + // All waypoints + GHashTableIter iter; + gpointer key, value; + + g_hash_table_iter_init ( &iter, vtl->waypoints ); + while ( g_hash_table_iter_next (&iter, &key, &value) ) { + VikWaypoint *wp = VIK_WAYPOINT(value); + changed = changed + (gint)vik_waypoint_apply_dem_data ( wp, FALSE ); + } + } + wp_changed_message ( vtl, changed ); +} + +static void trw_layer_apply_dem_data_wpt_only_missing ( menu_array_sublayer values ) +{ + VikTrwLayer *vtl = (VikTrwLayer *)values[MA_VTL]; + VikLayersPanel *vlp = (VikLayersPanel *)values[MA_VLP]; + + if ( !trw_layer_dem_test ( vtl, vlp ) ) + return; + + gint changed = 0; + if ( GPOINTER_TO_INT (values[MA_SUBTYPE]) == VIK_TRW_LAYER_SUBLAYER_WAYPOINT ) { + // Single Waypoint + VikWaypoint *wp = (VikWaypoint *) g_hash_table_lookup ( vtl->waypoints, values[MA_SUBLAYER_ID] ); + if ( wp ) + changed = (gint)vik_waypoint_apply_dem_data ( wp, TRUE ); + } + else { + // All waypoints + GHashTableIter iter; + gpointer key, value; + + g_hash_table_iter_init ( &iter, vtl->waypoints ); + while ( g_hash_table_iter_next (&iter, &key, &value) ) { + VikWaypoint *wp = VIK_WAYPOINT(value); + changed = changed + (gint)vik_waypoint_apply_dem_data ( wp, TRUE ); + } + } + wp_changed_message ( vtl, changed ); +} + +static void trw_layer_goto_track_endpoint ( menu_array_sublayer values ) +{ + VikTrwLayer *vtl = (VikTrwLayer *)values[MA_VTL]; + VikTrack *track; + if ( GPOINTER_TO_INT (values[MA_SUBTYPE]) == VIK_TRW_LAYER_SUBLAYER_ROUTE ) + track = (VikTrack *) g_hash_table_lookup ( vtl->routes, values[MA_SUBLAYER_ID] ); + else + track = (VikTrack *) g_hash_table_lookup ( vtl->tracks, values[MA_SUBLAYER_ID] ); + + if ( !track ) + return; + if ( !track->trackpoints ) + return; + goto_coord ( values[MA_VLP], vtl, values[MA_VVP], &(vik_track_get_tp_last(track)->coord)); +} + +static void trw_layer_goto_track_max_speed ( menu_array_sublayer values ) +{ + VikTrwLayer *vtl = (VikTrwLayer *)values[MA_VTL]; + VikTrack *track; + if ( GPOINTER_TO_INT (values[MA_SUBTYPE]) == VIK_TRW_LAYER_SUBLAYER_ROUTE ) + track = (VikTrack *) g_hash_table_lookup ( vtl->routes, values[MA_SUBLAYER_ID] ); + else + track = (VikTrack *) g_hash_table_lookup ( vtl->tracks, values[MA_SUBLAYER_ID] ); + + if ( !track ) + return; + + VikTrackpoint* vtp = vik_track_get_tp_by_max_speed ( track ); + if ( !vtp ) + return; + goto_coord ( values[MA_VLP], vtl, values[MA_VVP], &(vtp->coord)); +} + +static void trw_layer_goto_track_max_alt ( menu_array_sublayer values ) +{ + VikTrwLayer *vtl = (VikTrwLayer *)values[MA_VTL]; + VikTrack *track; + if ( GPOINTER_TO_INT (values[MA_SUBTYPE]) == VIK_TRW_LAYER_SUBLAYER_ROUTE ) + track = (VikTrack *) g_hash_table_lookup ( vtl->routes, values[MA_SUBLAYER_ID] ); + else + track = (VikTrack *) g_hash_table_lookup ( vtl->tracks, values[MA_SUBLAYER_ID] ); + + if ( !track ) + return; + + VikTrackpoint* vtp = vik_track_get_tp_by_max_alt ( track ); + if ( !vtp ) + return; + goto_coord ( values[MA_VLP], vtl, values[MA_VVP], &(vtp->coord)); +} + +static void trw_layer_goto_track_min_alt ( menu_array_sublayer values ) +{ + VikTrwLayer *vtl = (VikTrwLayer *)values[MA_VTL]; + VikTrack *track; + if ( GPOINTER_TO_INT (values[MA_SUBTYPE]) == VIK_TRW_LAYER_SUBLAYER_ROUTE ) + track = (VikTrack *) g_hash_table_lookup ( vtl->routes, values[MA_SUBLAYER_ID] ); + else + track = (VikTrack *) g_hash_table_lookup ( vtl->tracks, values[MA_SUBLAYER_ID] ); + + if ( !track ) + return; + + VikTrackpoint* vtp = vik_track_get_tp_by_min_alt ( track ); + if ( !vtp ) + return; + goto_coord ( values[MA_VLP], vtl, values[MA_VVP], &(vtp->coord)); +} + +/* + * Automatically change the viewport to center on the track and zoom to see the extent of the track + */ +static void trw_layer_auto_track_view ( menu_array_sublayer values ) +{ + VikTrwLayer *vtl = VIK_TRW_LAYER(values[MA_VTL]); + VikTrack *trk; + if ( GPOINTER_TO_INT (values[MA_SUBTYPE]) == VIK_TRW_LAYER_SUBLAYER_ROUTE ) + trk = (VikTrack *) g_hash_table_lookup ( vtl->routes, values[MA_SUBLAYER_ID] ); + else + trk = (VikTrack *) g_hash_table_lookup ( vtl->tracks, values[MA_SUBLAYER_ID] ); + + if ( trk && trk->trackpoints ) + { + struct LatLon maxmin[2] = { {0,0}, {0,0} }; + trw_layer_find_maxmin_tracks ( NULL, trk, maxmin ); + trw_layer_zoom_to_show_latlons ( vtl, values[MA_VVP], maxmin ); + if ( values[MA_VLP] ) + vik_layers_panel_emit_update ( VIK_LAYERS_PANEL(values[MA_VLP]) ); + else + vik_layer_emit_update ( VIK_LAYER(vtl) ); + } +} + +/* + * Refine the selected track/route with a routing engine. + * The routing engine is selected by the user, when requestiong the job. + */ +static void trw_layer_route_refine ( menu_array_sublayer values ) +{ + static gint last_engine = 0; + VikTrwLayer *vtl = VIK_TRW_LAYER(values[MA_VTL]); + VikTrack *trk; + + if ( GPOINTER_TO_INT (values[MA_SUBTYPE]) == VIK_TRW_LAYER_SUBLAYER_ROUTE ) + trk = (VikTrack *) g_hash_table_lookup ( vtl->routes, values[MA_SUBLAYER_ID] ); + else + trk = (VikTrack *) g_hash_table_lookup ( vtl->tracks, values[MA_SUBLAYER_ID] ); + + if ( trk && trk->trackpoints ) + { + /* Check size of the route */ + int nb = vik_track_get_tp_count(trk); + if (nb > 100) { + GtkWidget *dialog = gtk_message_dialog_new (VIK_GTK_WINDOW_FROM_LAYER (vtl), + GTK_DIALOG_MODAL | GTK_DIALOG_DESTROY_WITH_PARENT, + GTK_MESSAGE_WARNING, + GTK_BUTTONS_OK_CANCEL, + _("Refining a track with many points (%d) is unlikely to yield sensible results. Do you want to Continue?"), + nb); + gint response = gtk_dialog_run ( GTK_DIALOG(dialog) ); + gtk_widget_destroy ( dialog ); + if (response != GTK_RESPONSE_OK ) + return; + } + /* Select engine from dialog */ + GtkWidget *dialog = gtk_dialog_new_with_buttons (_("Refine Route with Routing Engine..."), + VIK_GTK_WINDOW_FROM_LAYER (vtl), + GTK_DIALOG_MODAL | GTK_DIALOG_DESTROY_WITH_PARENT, + GTK_STOCK_CANCEL, + GTK_RESPONSE_REJECT, + GTK_STOCK_OK, + GTK_RESPONSE_ACCEPT, + NULL); + GtkWidget *label = gtk_label_new ( _("Select routing engine") ); + gtk_widget_show_all(label); + + gtk_box_pack_start ( GTK_BOX(gtk_dialog_get_content_area(GTK_DIALOG(dialog))), label, TRUE, TRUE, 0 ); + + GtkWidget * combo = vik_routing_ui_selector_new ( (Predicate)vik_routing_engine_supports_refine, NULL ); + gtk_combo_box_set_active (GTK_COMBO_BOX (combo), last_engine); + gtk_widget_show_all(combo); + + gtk_box_pack_start ( GTK_BOX(gtk_dialog_get_content_area(GTK_DIALOG(dialog))), combo, TRUE, TRUE, 0 ); + + gtk_dialog_set_default_response ( GTK_DIALOG(dialog), GTK_RESPONSE_ACCEPT ); + + if ( gtk_dialog_run ( GTK_DIALOG(dialog) ) == GTK_RESPONSE_ACCEPT ) + { + /* Dialog validated: retrieve selected engine and do the job */ + last_engine = gtk_combo_box_get_active ( GTK_COMBO_BOX(combo) ); + VikRoutingEngine *routing = vik_routing_ui_selector_get_nth (combo, last_engine); + + /* Change cursor */ + vik_window_set_busy_cursor ( VIK_WINDOW(VIK_GTK_WINDOW_FROM_LAYER(vtl)) ); + + /* Force saving track */ + /* FIXME: remove or rename this hack */ + vtl->route_finder_check_added_track = TRUE; + + /* the job */ + vik_routing_engine_refine (routing, vtl, trk); + + /* FIXME: remove or rename this hack */ + if ( vtl->route_finder_added_track ) + vik_track_calculate_bounds ( vtl->route_finder_added_track ); + + vtl->route_finder_added_track = NULL; + vtl->route_finder_check_added_track = FALSE; + + vik_layer_emit_update ( VIK_LAYER(vtl) ); + + /* Restore cursor */ + vik_window_clear_busy_cursor ( VIK_WINDOW(VIK_GTK_WINDOW_FROM_LAYER(vtl)) ); + } + gtk_widget_destroy ( dialog ); + } +} + +static void trw_layer_edit_trackpoint ( menu_array_sublayer values ) +{ + VikTrwLayer *vtl = VIK_TRW_LAYER(values[MA_VTL]); + trw_layer_tpwin_init ( vtl ); +} + +/************************************* + * merge/split by time routines + *************************************/ + +/* called for each key in track hash table. + * If the current track has the same time stamp type, add it to the result, + * except the one pointed by "exclude". + * set exclude to NULL if there is no exclude to check. + * Note that the result is in reverse (for performance reasons). + */ +typedef struct { + GList **result; + VikTrack *exclude; + gboolean with_timestamps; +} twt_udata; +static void find_tracks_with_timestamp_type(gpointer key, gpointer value, gpointer udata) +{ + twt_udata *user_data = udata; + VikTrackpoint *p1, *p2; + VikTrack *trk = VIK_TRACK(value); + if (trk == user_data->exclude) { + return; + } + + if (trk->trackpoints) { + p1 = vik_track_get_tp_first(trk); + p2 = vik_track_get_tp_last(trk); + + if ( user_data->with_timestamps ) { + if (!p1->has_timestamp || !p2->has_timestamp) { + return; + } + } + else { + // Don't add tracks with timestamps when getting non timestamp tracks + if (p1->has_timestamp || p2->has_timestamp) { + return; + } + } + } + + *(user_data->result) = g_list_prepend(*(user_data->result), key); +} + +/** + * find_nearby_tracks_by_time: + * + * Called for each track in track hash table. + * If the original track (in user_data[1]) is close enough (threshold period in user_data[2]) + * to the current track, then the current track is added to the list in user_data[0] + */ +static void find_nearby_tracks_by_time (gpointer key, gpointer value, gpointer user_data) +{ + VikTrack *trk = VIK_TRACK(value); + + GList **nearby_tracks = ((gpointer *)user_data)[0]; + VikTrack *orig_trk = VIK_TRACK(((gpointer *)user_data)[1]); + + if ( !orig_trk || !orig_trk->trackpoints ) + return; + + /* outline: + * detect reasons for not merging, and return + * if no reason is found not to merge, then do it. + */ + + twt_udata *udata = user_data; + // Exclude the original track from the compiled list + if (trk == udata->exclude) { + return; + } + + time_t t1 = vik_track_get_tp_first(orig_trk)->timestamp; + time_t t2 = vik_track_get_tp_last(orig_trk)->timestamp; + + if (trk->trackpoints) { + + VikTrackpoint *p1 = vik_track_get_tp_first(trk); + VikTrackpoint *p2 = vik_track_get_tp_last(trk); + + if (!p1->has_timestamp || !p2->has_timestamp) { + //g_print("no timestamp\n"); + return; + } + + guint threshold = GPOINTER_TO_UINT (((gpointer *)user_data)[2]); + //g_print("Got track named %s, times %d, %d\n", trk->name, p1->timestamp, p2->timestamp); + if (! (labs(t1 - p2->timestamp) < threshold || + /* p1 p2 t1 t2 */ + labs(p1->timestamp - t2) < threshold) + /* t1 t2 p1 p2 */ + ) { + return; + } + } + + *nearby_tracks = g_list_prepend(*nearby_tracks, value); +} + +/* comparison function used to sort tracks; a and b are hash table keys */ +/* Not actively used - can be restored if needed +static gint track_compare(gconstpointer a, gconstpointer b, gpointer user_data) +{ + GHashTable *tracks = user_data; + time_t t1, t2; + + t1 = VIK_TRACKPOINT(VIK_TRACK(g_hash_table_lookup(tracks, a))->trackpoints->data)->timestamp; + t2 = VIK_TRACKPOINT(VIK_TRACK(g_hash_table_lookup(tracks, b))->trackpoints->data)->timestamp; + + if (t1 < t2) return -1; + if (t1 > t2) return 1; + return 0; +} +*/ + +/* comparison function used to sort trackpoints */ +static gint trackpoint_compare(gconstpointer a, gconstpointer b) +{ + time_t t1 = VIK_TRACKPOINT(a)->timestamp, t2 = VIK_TRACKPOINT(b)->timestamp; + + if (t1 < t2) return -1; + if (t1 > t2) return 1; + return 0; +} + +/** + * comparison function which can be used to sort tracks or waypoints by name + */ +static gint sort_alphabetically (gconstpointer a, gconstpointer b) +{ + const gchar* namea = (const gchar*) a; + const gchar* nameb = (const gchar*) b; + if ( namea == NULL || nameb == NULL) + return 0; + else + // Same sort method as used in the vik_treeview_*_alphabetize functions + return strcmp ( namea, nameb ); +} + +/** + * Attempt to merge selected track with other tracks specified by the user + * Tracks to merge with must be of the same 'type' as the selected track - + * either all with timestamps, or all without timestamps + */ +static void trw_layer_merge_with_other ( menu_array_sublayer values ) +{ + VikTrwLayer *vtl = (VikTrwLayer *)values[MA_VTL]; + GList *other_tracks = NULL; + GHashTable *ght_tracks; + if ( GPOINTER_TO_INT (values[MA_SUBTYPE]) == VIK_TRW_LAYER_SUBLAYER_ROUTE ) + ght_tracks = vtl->routes; + else + ght_tracks = vtl->tracks; + + VikTrack *track = (VikTrack *) g_hash_table_lookup ( ght_tracks, values[MA_SUBLAYER_ID] ); + + if ( !track ) + return; + + if ( !track->trackpoints ) + return; + + twt_udata udata; + udata.result = &other_tracks; + udata.exclude = track; + // Allow merging with 'similar' time type time tracks + // i.e. either those times, or those without + udata.with_timestamps = vik_track_get_tp_first(track)->has_timestamp; + + g_hash_table_foreach(ght_tracks, find_tracks_with_timestamp_type, (gpointer)&udata); + other_tracks = g_list_reverse(other_tracks); + + if ( !other_tracks ) { + if ( udata.with_timestamps ) + a_dialog_error_msg(VIK_GTK_WINDOW_FROM_LAYER(vtl), _("Failed. No other tracks with timestamps in this layer found")); + else + a_dialog_error_msg(VIK_GTK_WINDOW_FROM_LAYER(vtl), _("Failed. No other tracks without timestamps in this layer found")); + return; + } + + // Sort alphabetically for user presentation + // Convert into list of names for usage with dialog function + // TODO: Need to consider how to work best when we can have multiple tracks the same name... + GList *other_tracks_names = NULL; + GList *iter = g_list_first ( other_tracks ); + while ( iter ) { + other_tracks_names = g_list_append ( other_tracks_names, VIK_TRACK(g_hash_table_lookup (ght_tracks, iter->data))->name ); + iter = g_list_next ( iter ); + } + + other_tracks_names = g_list_sort (other_tracks_names, sort_alphabetically); + + GList *merge_list = a_dialog_select_from_list(VIK_GTK_WINDOW_FROM_LAYER(vtl), + other_tracks_names, + TRUE, + _("Merge with..."), + track->is_route ? _("Select route to merge with") : _("Select track to merge with")); + g_list_free(other_tracks); + g_list_free(other_tracks_names); + + if (merge_list) + { + GList *l; + for (l = merge_list; l != NULL; l = g_list_next(l)) { + VikTrack *merge_track; + if ( track->is_route ) + merge_track = vik_trw_layer_get_route ( vtl, l->data ); + else + merge_track = vik_trw_layer_get_track ( vtl, l->data ); + + if (merge_track) { + vik_track_steal_and_append_trackpoints ( track, merge_track ); + if ( track->is_route ) + vik_trw_layer_delete_route (vtl, merge_track); + else + vik_trw_layer_delete_track (vtl, merge_track); + track->trackpoints = g_list_sort(track->trackpoints, trackpoint_compare); + } + } + for (l = merge_list; l != NULL; l = g_list_next(l)) + g_free(l->data); + g_list_free(merge_list); + + vik_layer_emit_update( VIK_LAYER(vtl) ); + } +} + +// c.f. trw_layer_sorted_track_id_by_name_list +// but don't add the specified track to the list (normally current track) +static void trw_layer_sorted_track_id_by_name_list_exclude_self (const gpointer id, const VikTrack *trk, gpointer udata) +{ + twt_udata *user_data = udata; + + // Skip self + if (trk == user_data->exclude) { + return; + } + + // Sort named list alphabetically + *(user_data->result) = g_list_insert_sorted (*(user_data->result), trk->name, sort_alphabetically); +} + +/** + * Join - this allows combining 'tracks' and 'track routes' + * i.e. doesn't care about whether tracks have consistent timestamps + * ATM can only append one track at a time to the currently selected track + */ +static void trw_layer_append_track ( menu_array_sublayer values ) +{ + + VikTrwLayer *vtl = (VikTrwLayer *)values[MA_VTL]; + VikTrack *trk; + GHashTable *ght_tracks; + if ( GPOINTER_TO_INT (values[MA_SUBTYPE]) == VIK_TRW_LAYER_SUBLAYER_ROUTE ) + ght_tracks = vtl->routes; + else + ght_tracks = vtl->tracks; + + trk = (VikTrack *) g_hash_table_lookup ( ght_tracks, values[MA_SUBLAYER_ID] ); + + if ( !trk ) + return; + + GList *other_tracks_names = NULL; + + // Sort alphabetically for user presentation + // Convert into list of names for usage with dialog function + // TODO: Need to consider how to work best when we can have multiple tracks the same name... + twt_udata udata; + udata.result = &other_tracks_names; + udata.exclude = trk; + + g_hash_table_foreach(ght_tracks, (GHFunc) trw_layer_sorted_track_id_by_name_list_exclude_self, (gpointer)&udata); + + // Note the limit to selecting one track only + // this is to control the ordering of appending tracks, i.e. the selected track always goes after the current track + // (otherwise with multiple select the ordering would not be controllable by the user - automatically being alphabetically) + GList *append_list = a_dialog_select_from_list(VIK_GTK_WINDOW_FROM_LAYER(vtl), + other_tracks_names, + FALSE, + trk->is_route ? _("Append Route"): _("Append Track"), + trk->is_route ? _("Select the route to append after the current route") : + _("Select the track to append after the current track") ); + + g_list_free(other_tracks_names); + + // It's a list, but shouldn't contain more than one other track! + if ( append_list ) { + GList *l; + for (l = append_list; l != NULL; l = g_list_next(l)) { + // TODO: at present this uses the first track found by name, + // which with potential multiple same named tracks may not be the one selected... + VikTrack *append_track; + if ( trk->is_route ) + append_track = vik_trw_layer_get_route ( vtl, l->data ); + else + append_track = vik_trw_layer_get_track ( vtl, l->data ); + + if ( append_track ) { + vik_track_steal_and_append_trackpoints ( trk, append_track ); + if ( trk->is_route ) + vik_trw_layer_delete_route (vtl, append_track); + else + vik_trw_layer_delete_track (vtl, append_track); + } + } + for (l = append_list; l != NULL; l = g_list_next(l)) + g_free(l->data); + g_list_free(append_list); + + // Routes can only have one segment + if ( trk->is_route ) { + (void)vik_track_merge_segments ( trk ); + } + + vik_layer_emit_update( VIK_LAYER(vtl) ); + } +} + +/** + * Very similar to trw_layer_append_track for joining + * but this allows selection from the 'other' list + * If a track is selected, then is shows routes and joins the selected one + * If a route is selected, then is shows tracks and joins the selected one + */ +static void trw_layer_append_other ( menu_array_sublayer values ) +{ + + VikTrwLayer *vtl = (VikTrwLayer *)values[MA_VTL]; + VikTrack *trk; + GHashTable *ght_mykind, *ght_others; + if ( GPOINTER_TO_INT (values[MA_SUBTYPE]) == VIK_TRW_LAYER_SUBLAYER_ROUTE ) { + ght_mykind = vtl->routes; + ght_others = vtl->tracks; + } + else { + ght_mykind = vtl->tracks; + ght_others = vtl->routes; + } + + trk = (VikTrack *) g_hash_table_lookup ( ght_mykind, values[MA_SUBLAYER_ID] ); + + if ( !trk ) + return; + + GList *other_tracks_names = NULL; + + // Sort alphabetically for user presentation + // Convert into list of names for usage with dialog function + // TODO: Need to consider how to work best when we can have multiple tracks the same name... + twt_udata udata; + udata.result = &other_tracks_names; + udata.exclude = trk; + + g_hash_table_foreach(ght_others, (GHFunc) trw_layer_sorted_track_id_by_name_list_exclude_self, (gpointer)&udata); + + // Note the limit to selecting one track only + // this is to control the ordering of appending tracks, i.e. the selected track always goes after the current track + // (otherwise with multiple select the ordering would not be controllable by the user - automatically being alphabetically) + GList *append_list = a_dialog_select_from_list(VIK_GTK_WINDOW_FROM_LAYER(vtl), + other_tracks_names, + FALSE, + trk->is_route ? _("Append Track"): _("Append Route"), + trk->is_route ? _("Select the track to append after the current route") : + _("Select the route to append after the current track") ); + + g_list_free(other_tracks_names); + + // It's a list, but shouldn't contain more than one other track! + if ( append_list ) { + GList *l; + for (l = append_list; l != NULL; l = g_list_next(l)) { + // TODO: at present this uses the first track found by name, + // which with potential multiple same named tracks may not be the one selected... + + // Get FROM THE OTHER TYPE list + VikTrack *append_track; + if ( trk->is_route ) + append_track = vik_trw_layer_get_track ( vtl, l->data ); + else + append_track = vik_trw_layer_get_route ( vtl, l->data ); + + if ( append_track ) { + + if ( !append_track->is_route && + ( ( vik_track_get_segment_count ( append_track ) > 1 ) || + ( vik_track_get_average_speed ( append_track ) > 0.0 ) ) ) { + + if ( a_dialog_yes_or_no ( VIK_GTK_WINDOW_FROM_LAYER(vtl), + _("Converting a track to a route removes extra track data such as segments, timestamps, etc...\nDo you want to continue?"), NULL ) ) { + (void)vik_track_merge_segments ( append_track ); + vik_track_to_routepoints ( append_track ); + } + else { + break; + } + } + + vik_track_steal_and_append_trackpoints ( trk, append_track ); + + // Delete copied which is FROM THE OTHER TYPE list + if ( trk->is_route ) + vik_trw_layer_delete_track (vtl, append_track); + else + vik_trw_layer_delete_route (vtl, append_track); + } + } + for (l = append_list; l != NULL; l = g_list_next(l)) + g_free(l->data); + g_list_free(append_list); + + // Routes can only have one segment + if ( trk->is_route ) { + (void)vik_track_merge_segments ( trk ); + } + + vik_layer_emit_update( VIK_LAYER(vtl) ); + } +} + +/* merge by segments */ +static void trw_layer_merge_by_segment ( menu_array_sublayer values ) +{ + VikTrwLayer *vtl = (VikTrwLayer *)values[MA_VTL]; + VikTrack *trk = (VikTrack *) g_hash_table_lookup ( vtl->tracks, values[MA_SUBLAYER_ID] ); + guint segments = vik_track_merge_segments ( trk ); + vik_layer_emit_update ( VIK_LAYER(vtl) ); + // Any gaps previously in tracks may be too small to notice that they've now gone, + // so put up a message to confirm what has happened. + gchar str[64]; + const gchar *tmp_str = ngettext("%d segment merged", "%d segments merged", segments); + g_snprintf(str, 64, tmp_str, segments); + a_dialog_info_msg (VIK_GTK_WINDOW_FROM_LAYER(vtl), str ); +} + +/* merge by time routine */ +static void trw_layer_merge_by_timestamp ( menu_array_sublayer values ) +{ + VikTrwLayer *vtl = (VikTrwLayer *)values[MA_VTL]; + + //time_t t1, t2; + + GList *tracks_with_timestamp = NULL; + VikTrack *orig_trk = (VikTrack *) g_hash_table_lookup ( vtl->tracks, values[MA_SUBLAYER_ID] ); + if (orig_trk->trackpoints && + !vik_track_get_tp_first(orig_trk)->has_timestamp) { + a_dialog_error_msg(VIK_GTK_WINDOW_FROM_LAYER(vtl), _("Failed. This track does not have timestamp")); + return; + } + + twt_udata udata; + udata.result = &tracks_with_timestamp; + udata.exclude = orig_trk; + udata.with_timestamps = TRUE; + g_hash_table_foreach(vtl->tracks, find_tracks_with_timestamp_type, (gpointer)&udata); + tracks_with_timestamp = g_list_reverse(tracks_with_timestamp); + + if (!tracks_with_timestamp) { + a_dialog_error_msg(VIK_GTK_WINDOW_FROM_LAYER(vtl), _("Failed. No other track in this layer has timestamp")); + return; + } + g_list_free(tracks_with_timestamp); + + static guint threshold_in_minutes = 1; + if (!a_dialog_time_threshold(VIK_GTK_WINDOW_FROM_LAYER(vtl), + _("Merge Threshold..."), + _("Merge when time between tracks less than:"), + &threshold_in_minutes)) { + return; + } + + // keep attempting to merge all tracks until no merges within the time specified is possible + gboolean attempt_merge = TRUE; + GList *nearby_tracks = NULL; + GList *trps; + static gpointer params[3]; + + while ( attempt_merge ) { + + // Don't try again unless tracks have changed + attempt_merge = FALSE; + + trps = orig_trk->trackpoints; + if ( !trps ) + return; + + if (nearby_tracks) { + g_list_free(nearby_tracks); + nearby_tracks = NULL; + } + + params[0] = &nearby_tracks; + params[1] = orig_trk; + params[2] = GUINT_TO_POINTER (threshold_in_minutes*60); // In seconds + + /* get a list of adjacent-in-time tracks */ + g_hash_table_foreach(vtl->tracks, find_nearby_tracks_by_time, params); + + /* merge them */ + GList *l = nearby_tracks; + while ( l ) { + /* remove trackpoints from merged track, delete track */ + vik_track_steal_and_append_trackpoints ( orig_trk, VIK_TRACK(l->data) ); + vik_trw_layer_delete_track (vtl, VIK_TRACK(l->data)); + + // Tracks have changed, therefore retry again against all the remaining tracks + attempt_merge = TRUE; + + l = g_list_next(l); + } + + orig_trk->trackpoints = g_list_sort(orig_trk->trackpoints, trackpoint_compare); + } + + g_list_free(nearby_tracks); + + if ( values[MA_VLP] ) + vik_layers_panel_calendar_update ( VIK_LAYERS_PANEL(values[MA_VLP]) ); + + vik_layer_emit_update( VIK_LAYER(vtl) ); +} + +/** + * Split a track at the currently selected trackpoint + */ +static void trw_layer_split_at_selected_trackpoint ( VikTrwLayer *vtl, gint subtype ) +{ + if ( !vtl->current_tpl ) + return; + + if ( vtl->current_tpl->next && vtl->current_tpl->prev ) { + gchar *name = trw_layer_new_unique_sublayer_name(vtl, subtype, vtl->current_tp_track->name); + if ( name ) { + VikTrack *tr = vik_track_copy ( vtl->current_tp_track, FALSE ); + GList *newglist = g_list_alloc (); + newglist->prev = NULL; + newglist->next = vtl->current_tpl->next; + newglist->data = vik_trackpoint_copy(VIK_TRACKPOINT(vtl->current_tpl->data)); + tr->trackpoints = newglist; + + vtl->current_tpl->next->prev = newglist; /* end old track here */ + vtl->current_tpl->next = NULL; + + // Bounds of the selected track changed due to the split + vik_track_calculate_bounds ( vtl->current_tp_track ); + + vtl->current_tpl = newglist; /* change tp to first of new track. */ + vtl->current_tp_track = tr; + + if ( tr->is_route ) + vik_trw_layer_add_route ( vtl, name, tr ); + else + vik_trw_layer_add_track ( vtl, name, tr ); + + // Bounds of the new track created by the split + vik_track_calculate_bounds ( tr ); + + trku_udata udata; + udata.trk = tr; + udata.uuid = NULL; + + // Also need id of newly created track + gpointer trkf; + if ( tr->is_route ) + trkf = g_hash_table_find ( vtl->routes, (GHRFunc) trw_layer_track_find_uuid, &udata ); + else + trkf = g_hash_table_find ( vtl->tracks, (GHRFunc) trw_layer_track_find_uuid, &udata ); + + if ( trkf && udata.uuid ) + vtl->current_tp_id = udata.uuid; + else + vtl->current_tp_id = NULL; + + vik_layer_emit_update(VIK_LAYER(vtl)); + } + g_free ( name ); + } +} + +/* split by time routine */ +static void trw_layer_split_by_timestamp ( menu_array_sublayer values ) +{ + VikTrwLayer *vtl = (VikTrwLayer *)values[MA_VTL]; + VikTrack *track = (VikTrack *) g_hash_table_lookup ( vtl->tracks, values[MA_SUBLAYER_ID] ); + GList *trps = track->trackpoints; + GList *iter; + GList *newlists = NULL; + GList *newtps = NULL; + static guint thr = 1; + + time_t ts, prev_ts; + + if ( !trps ) + return; + + if (!a_dialog_time_threshold(VIK_GTK_WINDOW_FROM_LAYER(vtl), + _("Split Threshold..."), + _("Split when time between trackpoints exceeds:"), + &thr)) { + return; + } + + /* iterate through trackpoints, and copy them into new lists without touching original list */ + prev_ts = VIK_TRACKPOINT(trps->data)->timestamp; + iter = trps; + + while (iter) { + ts = VIK_TRACKPOINT(iter->data)->timestamp; + + // Check for unordered time points - this is quite a rare occurence - unless one has reversed a track. + if (ts < prev_ts) { + gchar tmp_str[64]; + strftime ( tmp_str, sizeof(tmp_str), "%c", localtime(&ts) ); + if ( a_dialog_yes_or_no ( VIK_GTK_WINDOW_FROM_LAYER(vtl), + _("Can not split track due to trackpoints not ordered in time - such as at %s.\n\nGoto this trackpoint?"), + tmp_str ) ) { + goto_coord ( values[MA_VLP], vtl, values[MA_VVP], &(VIK_TRACKPOINT(iter->data)->coord) ); + } + return; + } + + if (ts - prev_ts > thr*60) { + /* flush accumulated trackpoints into new list */ + newlists = g_list_append(newlists, g_list_reverse(newtps)); + newtps = NULL; + } + + /* accumulate trackpoint copies in newtps, in reverse order */ + newtps = g_list_prepend(newtps, vik_trackpoint_copy(VIK_TRACKPOINT(iter->data))); + prev_ts = ts; + iter = g_list_next(iter); + } + if (newtps) { + newlists = g_list_append(newlists, g_list_reverse(newtps)); + } + + /* put lists of trackpoints into tracks */ + iter = newlists; + // Only bother updating if the split results in new tracks + if (g_list_length (newlists) > 1) { + while (iter) { + gchar *new_tr_name; + VikTrack *tr; + + tr = vik_track_copy ( track, FALSE ); + tr->trackpoints = (GList *)(iter->data); + + new_tr_name = trw_layer_new_unique_sublayer_name ( vtl, VIK_TRW_LAYER_SUBLAYER_TRACK, track->name); + vik_trw_layer_add_track(vtl, new_tr_name, tr); + g_free ( new_tr_name ); + vik_track_calculate_bounds ( tr ); + iter = g_list_next(iter); + } + // Remove original track and then update the display + vik_trw_layer_delete_track (vtl, track); + vik_layer_emit_update(VIK_LAYER(vtl)); + + if ( values[MA_VLP] ) + vik_layers_panel_calendar_update ( VIK_LAYERS_PANEL(values[MA_VLP]) ); + } + g_list_free(newlists); +} + +/** + * Split a track by the number of points as specified by the user + */ +static void trw_layer_split_by_n_points ( menu_array_sublayer values ) +{ + VikTrwLayer *vtl = (VikTrwLayer *)values[MA_VTL]; + VikTrack *track; + if ( GPOINTER_TO_INT (values[MA_SUBTYPE]) == VIK_TRW_LAYER_SUBLAYER_ROUTE ) + track = (VikTrack *) g_hash_table_lookup ( vtl->routes, values[MA_SUBLAYER_ID] ); + else + track = (VikTrack *) g_hash_table_lookup ( vtl->tracks, values[MA_SUBLAYER_ID] ); + + if ( !track ) + return; + + // Check valid track + GList *trps = track->trackpoints; + if ( !trps ) + return; + + gint points = a_dialog_get_positive_number(VIK_GTK_WINDOW_FROM_LAYER(vtl), + _("Split Every Nth Point"), + _("Split on every Nth point:"), + 250, // Default value as per typical limited track capacity of various GPS devices + 2, // Min + 65536, // Max + 5); // Step + // Was a valid number returned? + if (!points) + return; + + // Now split... + GList *iter; + GList *newlists = NULL; + GList *newtps = NULL; + gint count = 0; + iter = trps; + + while (iter) { + /* accumulate trackpoint copies in newtps, in reverse order */ + newtps = g_list_prepend(newtps, vik_trackpoint_copy(VIK_TRACKPOINT(iter->data))); + count++; + if (count >= points) { + /* flush accumulated trackpoints into new list */ + newlists = g_list_append(newlists, g_list_reverse(newtps)); + newtps = NULL; + count = 0; + } + iter = g_list_next(iter); + } + + // If there is a remaining chunk put that into the new split list + // This may well be the whole track if no split points were encountered + if (newtps) { + newlists = g_list_append(newlists, g_list_reverse(newtps)); + } + + /* put lists of trackpoints into tracks */ + iter = newlists; + // Only bother updating if the split results in new tracks + if (g_list_length (newlists) > 1) { + while (iter) { + gchar *new_tr_name; + VikTrack *tr; + + tr = vik_track_copy ( track, FALSE ); + tr->trackpoints = (GList *)(iter->data); + + if ( track->is_route ) { + new_tr_name = trw_layer_new_unique_sublayer_name ( vtl, VIK_TRW_LAYER_SUBLAYER_ROUTE, track->name); + vik_trw_layer_add_route(vtl, new_tr_name, tr); + } + else { + new_tr_name = trw_layer_new_unique_sublayer_name ( vtl, VIK_TRW_LAYER_SUBLAYER_TRACK, track->name); + vik_trw_layer_add_track(vtl, new_tr_name, tr); + } + g_free ( new_tr_name ); + vik_track_calculate_bounds ( tr ); + + iter = g_list_next(iter); + } + // Remove original track and then update the display + if ( track->is_route ) + vik_trw_layer_delete_route (vtl, track); + else + vik_trw_layer_delete_track (vtl, track); + vik_layer_emit_update(VIK_LAYER(vtl)); + } + g_list_free(newlists); +} + +/** + * Split a track at the currently selected trackpoint + */ +static void trw_layer_split_at_trackpoint ( menu_array_sublayer values ) +{ + VikTrwLayer *vtl = (VikTrwLayer *)values[MA_VTL]; + gint subtype = GPOINTER_TO_INT (values[MA_SUBTYPE]); + trw_layer_split_at_selected_trackpoint ( vtl, subtype ); +} + +/** + * Split a track by its segments + * Routes do not have segments so don't call this for routes + */ +static void trw_layer_split_segments ( menu_array_sublayer values ) +{ + VikTrwLayer *vtl = (VikTrwLayer *)values[MA_VTL]; + VikTrack *trk = g_hash_table_lookup ( vtl->tracks, values[MA_SUBLAYER_ID] ); + + if ( !trk ) + return; + + guint ntracks; + + VikTrack **tracks = vik_track_split_into_segments (trk, &ntracks); + gchar *new_tr_name; + guint i; + for ( i = 0; i < ntracks; i++ ) { + if ( tracks[i] ) { + new_tr_name = trw_layer_new_unique_sublayer_name ( vtl, VIK_TRW_LAYER_SUBLAYER_TRACK, trk->name); + vik_trw_layer_add_track ( vtl, new_tr_name, tracks[i] ); + g_free ( new_tr_name ); + } + } + if ( tracks ) { + g_free ( tracks ); + // Remove original track + vik_trw_layer_delete_track ( vtl, trk ); + vik_layer_emit_update ( VIK_LAYER(vtl) ); + } + else { + a_dialog_error_msg (VIK_GTK_WINDOW_FROM_LAYER(vtl), _("Can not split track as it has no segments")); + } +} +/* end of split/merge routines */ + +static void trw_layer_trackpoint_selected_delete ( VikTrwLayer *vtl, VikTrack *trk ) +{ + GList *new_tpl; + + // Find available adjacent trackpoint + if ( (new_tpl = vtl->current_tpl->next) || (new_tpl = vtl->current_tpl->prev) ) { + if ( VIK_TRACKPOINT(vtl->current_tpl->data)->newsegment && vtl->current_tpl->next ) + VIK_TRACKPOINT(vtl->current_tpl->next->data)->newsegment = TRUE; /* don't concat segments on del */ + + // Delete current trackpoint + vik_trackpoint_free ( vtl->current_tpl->data ); + trk->trackpoints = g_list_delete_link ( trk->trackpoints, vtl->current_tpl ); + + // Set to current to the available adjacent trackpoint + vtl->current_tpl = new_tpl; + + if ( vtl->current_tp_track ) { + vik_track_calculate_bounds ( vtl->current_tp_track ); + } + } + else { + // Delete current trackpoint + vik_trackpoint_free ( vtl->current_tpl->data ); + trk->trackpoints = g_list_delete_link ( trk->trackpoints, vtl->current_tpl ); + trw_layer_cancel_current_tp ( vtl, FALSE ); + } +} + +/** + * Delete the selected point + */ +static void trw_layer_delete_point_selected ( menu_array_sublayer values ) +{ + VikTrwLayer *vtl = (VikTrwLayer *)values[MA_VTL]; + VikTrack *trk; + if ( GPOINTER_TO_INT (values[MA_SUBTYPE]) == VIK_TRW_LAYER_SUBLAYER_ROUTE ) + trk = (VikTrack *) g_hash_table_lookup ( vtl->routes, values[MA_SUBLAYER_ID] ); + else + trk = (VikTrack *) g_hash_table_lookup ( vtl->tracks, values[MA_SUBLAYER_ID] ); + + if ( !trk ) + return; + + if ( !vtl->current_tpl ) + return; + + trw_layer_trackpoint_selected_delete ( vtl, trk ); + + // Track has been updated so update tps: + trw_layer_cancel_tps_of_track ( vtl, trk ); + + vik_layer_emit_update ( VIK_LAYER(vtl) ); +} + +/** + * Delete adjacent track points at the same position + * AKA Delete Dulplicates on the Properties Window + */ +static void trw_layer_delete_points_same_position ( menu_array_sublayer values ) +{ + VikTrwLayer *vtl = (VikTrwLayer *)values[MA_VTL]; + VikTrack *trk; + if ( GPOINTER_TO_INT (values[MA_SUBTYPE]) == VIK_TRW_LAYER_SUBLAYER_ROUTE ) + trk = (VikTrack *) g_hash_table_lookup ( vtl->routes, values[MA_SUBLAYER_ID] ); + else + trk = (VikTrack *) g_hash_table_lookup ( vtl->tracks, values[MA_SUBLAYER_ID] ); + + if ( !trk ) + return; + + gulong removed = vik_track_remove_dup_points ( trk ); + + // Track has been updated so update tps: + trw_layer_cancel_tps_of_track ( vtl, trk ); + + // Inform user how much was deleted as it's not obvious from the normal view + gchar str[64]; + const gchar *tmp_str = ngettext("Deleted %ld point", "Deleted %ld points", removed); + g_snprintf(str, 64, tmp_str, removed); + a_dialog_info_msg (VIK_GTK_WINDOW_FROM_LAYER(vtl), str); + + vik_layer_emit_update ( VIK_LAYER(vtl) ); +} + +/** + * Delete adjacent track points with the same timestamp + * Normally new tracks that are 'routes' won't have any timestamps so should be OK to clean up the track + */ +static void trw_layer_delete_points_same_time ( menu_array_sublayer values ) +{ + VikTrwLayer *vtl = (VikTrwLayer *)values[MA_VTL]; + VikTrack *trk; + if ( GPOINTER_TO_INT (values[MA_SUBTYPE]) == VIK_TRW_LAYER_SUBLAYER_ROUTE ) + trk = (VikTrack *) g_hash_table_lookup ( vtl->routes, values[MA_SUBLAYER_ID] ); + else + trk = (VikTrack *) g_hash_table_lookup ( vtl->tracks, values[MA_SUBLAYER_ID] ); + + if ( !trk ) + return; + + gulong removed = vik_track_remove_same_time_points ( trk ); + + // Track has been updated so update tps: + trw_layer_cancel_tps_of_track ( vtl, trk ); + + // Inform user how much was deleted as it's not obvious from the normal view + gchar str[64]; + const gchar *tmp_str = ngettext("Deleted %ld point", "Deleted %ld points", removed); + g_snprintf(str, 64, tmp_str, removed); + a_dialog_info_msg (VIK_GTK_WINDOW_FROM_LAYER(vtl), str); + + vik_layer_emit_update ( VIK_LAYER(vtl) ); +} + +/** + * Insert a point + */ +static void trw_layer_insert_point_after ( menu_array_sublayer values ) +{ + VikTrwLayer *vtl = (VikTrwLayer *)values[MA_VTL]; + VikTrack *track; + if ( GPOINTER_TO_INT (values[MA_SUBTYPE]) == VIK_TRW_LAYER_SUBLAYER_ROUTE ) + track = (VikTrack *) g_hash_table_lookup ( vtl->routes, values[MA_SUBLAYER_ID] ); + else + track = (VikTrack *) g_hash_table_lookup ( vtl->tracks, values[MA_SUBLAYER_ID] ); + + if ( ! track ) + return; + + trw_layer_insert_tp_beside_current_tp ( vtl, FALSE ); + + vik_layer_emit_update ( VIK_LAYER(vtl) ); +} + +static void trw_layer_insert_point_before ( menu_array_sublayer values ) +{ + VikTrwLayer *vtl = (VikTrwLayer *)values[MA_VTL]; + VikTrack *track; + if ( GPOINTER_TO_INT (values[MA_SUBTYPE]) == VIK_TRW_LAYER_SUBLAYER_ROUTE ) + track = (VikTrack *) g_hash_table_lookup ( vtl->routes, values[MA_SUBLAYER_ID] ); + else + track = (VikTrack *) g_hash_table_lookup ( vtl->tracks, values[MA_SUBLAYER_ID] ); + + if ( ! track ) + return; + + trw_layer_insert_tp_beside_current_tp ( vtl, TRUE ); + + vik_layer_emit_update ( VIK_LAYER(vtl) ); +} + +/** + * Reverse a track + */ +static void trw_layer_reverse ( menu_array_sublayer values ) +{ + VikTrwLayer *vtl = (VikTrwLayer *)values[MA_VTL]; + VikTrack *track; + if ( GPOINTER_TO_INT (values[MA_SUBTYPE]) == VIK_TRW_LAYER_SUBLAYER_ROUTE ) + track = (VikTrack *) g_hash_table_lookup ( vtl->routes, values[MA_SUBLAYER_ID] ); + else + track = (VikTrack *) g_hash_table_lookup ( vtl->tracks, values[MA_SUBLAYER_ID] ); + + if ( ! track ) + return; + + vik_track_reverse ( track ); + + vik_layer_emit_update ( VIK_LAYER(vtl) ); +} + +/** + * Open a program at the specified date + * Mainly for RedNotebook - http://rednotebook.sourceforge.net/ + * But could work with any program that accepts a command line of --date= + * FUTURE: Allow configuring of command line options + date format + */ +static void trw_layer_diary_open ( VikTrwLayer *vtl, const gchar *date_str ) +{ + GError *err = NULL; + gchar *cmd = g_strdup_printf ( "%s %s%s", diary_program, "--date=", date_str ); + if ( ! g_spawn_command_line_async ( cmd, &err ) ) { + a_dialog_error_msg_extra ( VIK_GTK_WINDOW_FROM_LAYER(vtl), _("Could not launch %s to open file."), diary_program ); + g_warning ( "%s", err->message ); + g_error_free ( err ); + } + g_free ( cmd ); +} + +/** + * Open a diary at the date of the track or waypoint + */ +static void trw_layer_diary ( menu_array_sublayer values ) +{ + VikTrwLayer *vtl = VIK_TRW_LAYER(values[MA_VTL]); + + if ( GPOINTER_TO_INT(values[MA_SUBTYPE]) == VIK_TRW_LAYER_SUBLAYER_TRACK ) { + VikTrack *trk = (VikTrack *) g_hash_table_lookup ( vtl->tracks, values[MA_SUBLAYER_ID] ); + if ( ! trk ) + return; + + gchar date_buf[20]; + date_buf[0] = '\0'; + if ( trk->trackpoints && VIK_TRACKPOINT(trk->trackpoints->data)->has_timestamp ) { + strftime (date_buf, sizeof(date_buf), "%Y-%m-%d", gmtime(&(VIK_TRACKPOINT(trk->trackpoints->data)->timestamp))); + trw_layer_diary_open ( vtl, date_buf ); + } + else + a_dialog_info_msg ( VIK_GTK_WINDOW_FROM_LAYER(vtl), _("This track has no date information.") ); + } + else if ( GPOINTER_TO_INT(values[MA_SUBTYPE]) == VIK_TRW_LAYER_SUBLAYER_WAYPOINT ) { + VikWaypoint *wpt = (VikWaypoint *) g_hash_table_lookup ( vtl->waypoints, values[MA_SUBLAYER_ID] ); + if ( ! wpt ) + return; + + gchar date_buf[20]; + date_buf[0] = '\0'; + if ( wpt->has_timestamp ) { + strftime (date_buf, sizeof(date_buf), "%Y-%m-%d", gmtime(&(wpt->timestamp))); + trw_layer_diary_open ( vtl, date_buf ); + } + else + a_dialog_info_msg ( VIK_GTK_WINDOW_FROM_LAYER(vtl), _("This waypoint has no date information.") ); + } +} + +/** + * Open a program at the specified date + * Mainly for Stellarium - http://stellarium.org/ + * But could work with any program that accepts the same command line options... + * FUTURE: Allow configuring of command line options + format or parameters + */ +static void trw_layer_astro_open ( VikTrwLayer *vtl, const gchar *date_str, const gchar *time_str, const gchar *lat_str, const gchar *lon_str, const gchar *alt_str ) +{ + GError *err = NULL; + gchar *tmp; + gint fd = g_file_open_tmp ( "vik-astro-XXXXXX.ini", &tmp, &err ); + if (fd < 0) { + g_warning ( "%s: Failed to open temporary file: %s", __FUNCTION__, err->message ); + g_clear_error ( &err ); + return; + } + gchar *cmd = g_strdup_printf ( "%s %s %s %s %s %s %s %s %s %s %s %s %s %s", + astro_program, "-c", tmp, "--full-screen no", "--sky-date", date_str, "--sky-time", time_str, "--latitude", lat_str, "--longitude", lon_str, "--altitude", alt_str ); + g_warning ( "%s", cmd ); + if ( ! g_spawn_command_line_async ( cmd, &err ) ) { + a_dialog_error_msg_extra ( VIK_GTK_WINDOW_FROM_LAYER(vtl), _("Could not launch %s"), astro_program ); + g_warning ( "%s", err->message ); + g_error_free ( err ); + } + util_add_to_deletion_list ( tmp ); + g_free ( tmp ); + g_free ( cmd ); +} + +// Format of stellarium lat & lon seems designed to be particularly awkward +// who uses ' & " in the parameters for the command line?! +// -1d4'27.48" +// +53d58'16.65" +static gchar *convert_to_dms ( gdouble dec ) +{ + gdouble tmp; + gchar sign_c = ' '; + gint val_d, val_m; + gdouble val_s; + gchar *result = NULL; + + if ( dec > 0 ) + sign_c = '+'; + else if ( dec < 0 ) + sign_c = '-'; + else // Nul value + sign_c = ' '; + + // Degrees + tmp = fabs(dec); + val_d = (gint)tmp; + + // Minutes + tmp = (tmp - val_d) * 60; + val_m = (gint)tmp; + + // Seconds + val_s = (tmp - val_m) * 60; + + // Format + result = g_strdup_printf ( "%c%dd%d\\\'%.4f\\\"", sign_c, val_d, val_m, val_s ); + return result; +} + +/** + * Open an astronomy program at the date & position of the track center, trackpoint or waypoint + */ +static void trw_layer_astro ( menu_array_sublayer values ) +{ + VikTrwLayer *vtl = VIK_TRW_LAYER(values[MA_VTL]); + + if ( GPOINTER_TO_INT(values[MA_SUBTYPE]) == VIK_TRW_LAYER_SUBLAYER_TRACK ) { + VikTrack *trk = (VikTrack *) g_hash_table_lookup ( vtl->tracks, values[MA_SUBLAYER_ID] ); + if ( ! trk ) + return; + + VikTrackpoint *tp = NULL; + if ( vtl->current_tpl ) + // Current Trackpoint + tp = VIK_TRACKPOINT(vtl->current_tpl->data); + else if ( trk->trackpoints ) + // Otherwise first trackpoint + tp = VIK_TRACKPOINT(trk->trackpoints->data); + else + // Give up + return; + + if ( tp->has_timestamp ) { + gchar date_buf[20]; + strftime (date_buf, sizeof(date_buf), "%Y%m%d", gmtime(&(tp->timestamp))); + gchar time_buf[20]; + strftime (time_buf, sizeof(time_buf), "%H:%M:%S", gmtime(&(tp->timestamp))); + struct LatLon ll; + vik_coord_to_latlon ( &tp->coord, &ll ); + gchar *lat_str = convert_to_dms ( ll.lat ); + gchar *lon_str = convert_to_dms ( ll.lon ); + gchar alt_buf[20]; + snprintf (alt_buf, sizeof(alt_buf), "%d", (gint)round(tp->altitude) ); + trw_layer_astro_open ( vtl, date_buf, time_buf, lat_str, lon_str, alt_buf); + g_free ( lat_str ); + g_free ( lon_str ); + } + else + a_dialog_info_msg ( VIK_GTK_WINDOW_FROM_LAYER(vtl), _("This track has no date information.") ); + } + else if ( GPOINTER_TO_INT(values[MA_SUBTYPE]) == VIK_TRW_LAYER_SUBLAYER_WAYPOINT ) { + VikWaypoint *wpt = (VikWaypoint *) g_hash_table_lookup ( vtl->waypoints, values[MA_SUBLAYER_ID] ); + if ( ! wpt ) + return; + + if ( wpt->has_timestamp ) { + gchar date_buf[20]; + strftime (date_buf, sizeof(date_buf), "%Y%m%d", gmtime(&(wpt->timestamp))); + gchar time_buf[20]; + strftime (time_buf, sizeof(time_buf), "%H:%M:%S", gmtime(&(wpt->timestamp))); + struct LatLon ll; + vik_coord_to_latlon ( &wpt->coord, &ll ); + gchar *lat_str = convert_to_dms ( ll.lat ); + gchar *lon_str = convert_to_dms ( ll.lon ); + gchar alt_buf[20]; + snprintf (alt_buf, sizeof(alt_buf), "%d", (gint)round(wpt->altitude) ); + trw_layer_astro_open ( vtl, date_buf, time_buf, lat_str, lon_str, alt_buf ); + g_free ( lat_str ); + g_free ( lon_str ); + } + else + a_dialog_info_msg ( VIK_GTK_WINDOW_FROM_LAYER(vtl), _("This waypoint has no date information.") ); + } +} + +/** + * Similar to trw_layer_enum_item, but this uses a sorted method + */ +/* Currently unused +static void trw_layer_sorted_name_list(gpointer key, gpointer value, gpointer udata) +{ + GList **list = (GList**)udata; + // *list = g_list_prepend(*all, key); //unsorted method + // Sort named list alphabetically + *list = g_list_insert_sorted (*list, key, sort_alphabetically); +} +*/ + +/** + * Now Waypoint specific sort + */ +static void trw_layer_sorted_wp_id_by_name_list (const gpointer id, const VikWaypoint *wp, gpointer udata) +{ + GList **list = (GList**)udata; + // Sort named list alphabetically + *list = g_list_insert_sorted (*list, wp->name, sort_alphabetically); +} + +/** + * Track specific sort + */ +static void trw_layer_sorted_track_id_by_name_list (const gpointer id, const VikTrack *trk, gpointer udata) +{ + GList **list = (GList**)udata; + // Sort named list alphabetically + *list = g_list_insert_sorted (*list, trk->name, sort_alphabetically); +} + + +typedef struct { + gboolean has_same_track_name; + const gchar *same_track_name; +} same_track_name_udata; + +static gint check_tracks_for_same_name ( gconstpointer aa, gconstpointer bb, gpointer udata ) +{ + const gchar* namea = (const gchar*) aa; + const gchar* nameb = (const gchar*) bb; + + // the test + gint result = strcmp ( namea, nameb ); + + if ( result == 0 ) { + // Found two names the same + same_track_name_udata *user_data = udata; + user_data->has_same_track_name = TRUE; + user_data->same_track_name = namea; + } + + // Leave ordering the same + return 0; +} + +/** + * Find out if any tracks have the same name in this hash table + */ +static gboolean trw_layer_has_same_track_names ( GHashTable *ht_tracks ) +{ + // Sort items by name, then compare if any next to each other are the same + + GList *track_names = NULL; + g_hash_table_foreach ( ht_tracks, (GHFunc) trw_layer_sorted_track_id_by_name_list, &track_names ); + + // No tracks + if ( ! track_names ) + return FALSE; + + same_track_name_udata udata; + udata.has_same_track_name = FALSE; + + // Use sort routine to traverse list comparing items + // Don't care how this list ends up ordered ( doesn't actually change ) - care about the returned status + GList *dummy_list = g_list_sort_with_data ( track_names, check_tracks_for_same_name, &udata ); + // Still no tracks... + if ( ! dummy_list ) + return FALSE; + + return udata.has_same_track_name; +} + +/** + * Force unqiue track names for the track table specified + * Note the panel is a required parameter to enable the update of the names displayed + * Specify if on tracks or else on routes + */ +static void vik_trw_layer_uniquify_tracks ( VikTrwLayer *vtl, VikLayersPanel *vlp, GHashTable *track_table, gboolean ontrack ) +{ + // . Search list for an instance of repeated name + // . get track of this name + // . create new name + // . rename track & update equiv. treeview iter + // . repeat until all different + + same_track_name_udata udata; + + GList *track_names = NULL; + udata.has_same_track_name = FALSE; + udata.same_track_name = NULL; + + g_hash_table_foreach ( track_table, (GHFunc) trw_layer_sorted_track_id_by_name_list, &track_names ); + + // No tracks + if ( ! track_names ) + return; + + GList *dummy_list1 = g_list_sort_with_data ( track_names, check_tracks_for_same_name, &udata ); + + // Still no tracks... + if ( ! dummy_list1 ) + return; + + while ( udata.has_same_track_name ) { + + // Find a track with the same name + VikTrack *trk; + if ( ontrack ) + trk = vik_trw_layer_get_track ( vtl, (gpointer) udata.same_track_name ); + else + trk = vik_trw_layer_get_route ( vtl, (gpointer) udata.same_track_name ); + + if ( ! trk ) { + // Broken :( + g_critical("Houston, we've had a problem."); + vik_statusbar_set_message ( vik_window_get_statusbar (VIK_WINDOW(VIK_GTK_WINDOW_FROM_LAYER(vtl))), VIK_STATUSBAR_INFO, + _("Internal Error in vik_trw_layer_uniquify_tracks") ); + return; + } + + // Rename it + gchar *newname = trw_layer_new_unique_sublayer_name ( vtl, VIK_TRW_LAYER_SUBLAYER_TRACK, udata.same_track_name ); + vik_track_set_name ( trk, newname ); + + trku_udata udataU; + udataU.trk = trk; + udataU.uuid = NULL; + + // Need want key of it for treeview update + gpointer trkf = g_hash_table_find ( track_table, (GHRFunc) trw_layer_track_find_uuid, &udataU ); + + if ( trkf && udataU.uuid ) { + + GtkTreeIter *it; + if ( ontrack ) + it = g_hash_table_lookup ( vtl->tracks_iters, udataU.uuid ); + else + it = g_hash_table_lookup ( vtl->routes_iters, udataU.uuid ); + + if ( it ) { + vik_treeview_item_set_name ( VIK_LAYER(vtl)->vt, it, newname ); + if ( ontrack ) + vik_treeview_sort_children ( VIK_LAYER(vtl)->vt, &(vtl->tracks_iter), vtl->track_sort_order ); + else + vik_treeview_sort_children ( VIK_LAYER(vtl)->vt, &(vtl->routes_iter), vtl->track_sort_order ); + } + } + g_free ( newname ); + + // Start trying to find same names again... + track_names = NULL; + g_hash_table_foreach ( track_table, (GHFunc) trw_layer_sorted_track_id_by_name_list, &track_names ); + udata.has_same_track_name = FALSE; + GList *dummy_list2 = g_list_sort_with_data ( track_names, check_tracks_for_same_name, &udata ); + + // No tracks any more - give up searching + if ( ! dummy_list2 ) + udata.has_same_track_name = FALSE; + } + + // Update + vik_layers_panel_emit_update ( vlp ); +} + +static void trw_layer_sort_order_specified ( VikTrwLayer *vtl, guint sublayer_type, vik_layer_sort_order_t order ) +{ + GtkTreeIter *iter; + + switch (sublayer_type) { + case VIK_TRW_LAYER_SUBLAYER_TRACKS: + iter = &(vtl->tracks_iter); + vtl->track_sort_order = order; + break; + case VIK_TRW_LAYER_SUBLAYER_ROUTES: + iter = &(vtl->routes_iter); + vtl->track_sort_order = order; + break; + default: // VIK_TRW_LAYER_SUBLAYER_WAYPOINTS: + iter = &(vtl->waypoints_iter); + vtl->wp_sort_order = order; + break; + } + + vik_treeview_sort_children ( VIK_LAYER(vtl)->vt, iter, order ); +} + +static void trw_layer_sort_order_a2z ( menu_array_sublayer values ) +{ + VikTrwLayer *vtl = VIK_TRW_LAYER(values[MA_VTL]); + trw_layer_sort_order_specified ( vtl, GPOINTER_TO_INT(values[MA_SUBTYPE]), VL_SO_ALPHABETICAL_ASCENDING ); +} + +static void trw_layer_sort_order_z2a ( menu_array_sublayer values ) +{ + VikTrwLayer *vtl = VIK_TRW_LAYER(values[MA_VTL]); + trw_layer_sort_order_specified ( vtl, GPOINTER_TO_INT(values[MA_SUBTYPE]), VL_SO_ALPHABETICAL_DESCENDING ); +} + +static void trw_layer_sort_order_timestamp_ascend ( menu_array_sublayer values ) +{ + VikTrwLayer *vtl = VIK_TRW_LAYER(values[MA_VTL]); + trw_layer_sort_order_specified ( vtl, GPOINTER_TO_INT(values[MA_SUBTYPE]), VL_SO_DATE_ASCENDING ); +} + +static void trw_layer_sort_order_timestamp_descend ( menu_array_sublayer values ) +{ + VikTrwLayer *vtl = VIK_TRW_LAYER(values[MA_VTL]); + trw_layer_sort_order_specified ( vtl, GPOINTER_TO_INT(values[MA_SUBTYPE]), VL_SO_DATE_DESCENDING ); +} + +/** + * + */ +static void trw_layer_delete_tracks_from_selection ( menu_array_layer values ) +{ + VikTrwLayer *vtl = VIK_TRW_LAYER(values[MA_VTL]); + GList *all = NULL; + + // Ensure list of track names offered is unique + if ( trw_layer_has_same_track_names ( vtl->tracks ) ) { + if ( a_dialog_yes_or_no ( VIK_GTK_WINDOW_FROM_LAYER(vtl), + _("Multiple entries with the same name exist. This method only works with unique names. Force unique names now?"), NULL ) ) { + vik_trw_layer_uniquify_tracks ( vtl, VIK_LAYERS_PANEL(values[MA_VLP]), vtl->tracks, TRUE ); + } + else + return; + } + + // Sort list alphabetically for better presentation + g_hash_table_foreach(vtl->tracks, (GHFunc) trw_layer_sorted_track_id_by_name_list, &all); + + if ( ! all ) { + a_dialog_error_msg (VIK_GTK_WINDOW_FROM_LAYER(vtl), _("No tracks found")); + return; + } + + // Get list of items to delete from the user + GList *delete_list = a_dialog_select_from_list(VIK_GTK_WINDOW_FROM_LAYER(vtl), + all, + TRUE, + _("Delete Selection"), + _("Select tracks to delete")); + g_list_free(all); + + // Delete requested tracks + // since specificly requested, IMHO no need for extra confirmation + if ( delete_list ) { + GList *l; + for (l = delete_list; l != NULL; l = g_list_next(l)) { + // This deletes first trk it finds of that name (but uniqueness is enforced above) + trw_layer_delete_track_by_name (vtl, l->data, vtl->tracks); + } + g_list_free(delete_list); + // Reset layer timestamps in case they have now changed + vik_treeview_item_set_timestamp ( vtl->vl.vt, &vtl->vl.iter, trw_layer_get_timestamp(vtl) ); + + vik_layer_emit_update( VIK_LAYER(vtl) ); + } +} + +/** + * + */ +static void trw_layer_delete_routes_from_selection ( menu_array_layer values ) +{ + VikTrwLayer *vtl = VIK_TRW_LAYER(values[MA_VTL]); + GList *all = NULL; + + // Ensure list of track names offered is unique + if ( trw_layer_has_same_track_names ( vtl->routes ) ) { + if ( a_dialog_yes_or_no ( VIK_GTK_WINDOW_FROM_LAYER(vtl), + _("Multiple entries with the same name exist. This method only works with unique names. Force unique names now?"), NULL ) ) { + vik_trw_layer_uniquify_tracks ( vtl, VIK_LAYERS_PANEL(values[MA_VLP]), vtl->routes, FALSE ); + } + else + return; + } + + // Sort list alphabetically for better presentation + g_hash_table_foreach(vtl->routes, (GHFunc) trw_layer_sorted_track_id_by_name_list, &all); + + if ( ! all ) { + a_dialog_error_msg (VIK_GTK_WINDOW_FROM_LAYER(vtl), _("No routes found")); + return; + } + + // Get list of items to delete from the user + GList *delete_list = a_dialog_select_from_list ( VIK_GTK_WINDOW_FROM_LAYER(vtl), + all, + TRUE, + _("Delete Selection"), + _("Select routes to delete") ); + g_list_free(all); + + // Delete requested routes + // since specificly requested, IMHO no need for extra confirmation + if ( delete_list ) { + GList *l; + for (l = delete_list; l != NULL; l = g_list_next(l)) { + // This deletes first route it finds of that name (but uniqueness is enforced above) + trw_layer_delete_track_by_name (vtl, l->data, vtl->routes); + } + g_list_free(delete_list); + vik_layer_emit_update( VIK_LAYER(vtl) ); + } +} + +typedef struct { + gboolean has_same_waypoint_name; + const gchar *same_waypoint_name; +} same_waypoint_name_udata; + +static gint check_waypoints_for_same_name ( gconstpointer aa, gconstpointer bb, gpointer udata ) +{ + const gchar* namea = (const gchar*) aa; + const gchar* nameb = (const gchar*) bb; + + // the test + gint result = strcmp ( namea, nameb ); + + if ( result == 0 ) { + // Found two names the same + same_waypoint_name_udata *user_data = udata; + user_data->has_same_waypoint_name = TRUE; + user_data->same_waypoint_name = namea; + } + + // Leave ordering the same + return 0; +} + +/** + * Find out if any waypoints have the same name in this layer + */ +gboolean trw_layer_has_same_waypoint_names ( VikTrwLayer *vtl ) +{ + // Sort items by name, then compare if any next to each other are the same + + GList *waypoint_names = NULL; + g_hash_table_foreach ( vtl->waypoints, (GHFunc) trw_layer_sorted_wp_id_by_name_list, &waypoint_names ); + + // No waypoints + if ( ! waypoint_names ) + return FALSE; + + same_waypoint_name_udata udata; + udata.has_same_waypoint_name = FALSE; + + // Use sort routine to traverse list comparing items + // Don't care how this list ends up ordered ( doesn't actually change ) - care about the returned status + GList *dummy_list = g_list_sort_with_data ( waypoint_names, check_waypoints_for_same_name, &udata ); + // Still no waypoints... + if ( ! dummy_list ) + return FALSE; + + return udata.has_same_waypoint_name; +} + +/** + * Force unqiue waypoint names for this layer + * Note the panel is a required parameter to enable the update of the names displayed + */ +static void vik_trw_layer_uniquify_waypoints ( VikTrwLayer *vtl, VikLayersPanel *vlp ) +{ + // . Search list for an instance of repeated name + // . get waypoint of this name + // . create new name + // . rename waypoint & update equiv. treeview iter + // . repeat until all different + + same_waypoint_name_udata udata; + + GList *waypoint_names = NULL; + udata.has_same_waypoint_name = FALSE; + udata.same_waypoint_name = NULL; + + g_hash_table_foreach ( vtl->waypoints, (GHFunc) trw_layer_sorted_wp_id_by_name_list, &waypoint_names ); + + // No waypoints + if ( ! waypoint_names ) + return; + + GList *dummy_list1 = g_list_sort_with_data ( waypoint_names, check_waypoints_for_same_name, &udata ); + + // Still no waypoints... + if ( ! dummy_list1 ) + return; + + while ( udata.has_same_waypoint_name ) { + + // Find a waypoint with the same name + VikWaypoint *waypoint = vik_trw_layer_get_waypoint ( vtl, (gpointer) udata.same_waypoint_name ); + + if ( ! waypoint ) { + // Broken :( + g_critical("Houston, we've had a problem."); + vik_statusbar_set_message ( vik_window_get_statusbar (VIK_WINDOW(VIK_GTK_WINDOW_FROM_LAYER(vtl))), VIK_STATUSBAR_INFO, + _("Internal Error in vik_trw_layer_uniquify_waypoints") ); + return; + } + + // Rename it + gchar *newname = trw_layer_new_unique_sublayer_name ( vtl, VIK_TRW_LAYER_SUBLAYER_WAYPOINT, udata.same_waypoint_name ); + + trw_layer_waypoint_rename ( vtl, waypoint, newname ); + + g_free (newname); + + // Start trying to find same names again... + waypoint_names = NULL; + g_hash_table_foreach ( vtl->waypoints, (GHFunc) trw_layer_sorted_wp_id_by_name_list, &waypoint_names ); + udata.has_same_waypoint_name = FALSE; + GList *dummy_list2 = g_list_sort_with_data ( waypoint_names, check_waypoints_for_same_name, &udata ); + + // No waypoints any more - give up searching + if ( ! dummy_list2 ) + udata.has_same_waypoint_name = FALSE; + } + + // Update + vik_layers_panel_emit_update ( vlp ); +} + +/** + * + */ +static void trw_layer_delete_waypoints_from_selection ( menu_array_layer values ) +{ + VikTrwLayer *vtl = VIK_TRW_LAYER(values[MA_VTL]); + GList *all = NULL; + + // Ensure list of waypoint names offered is unique + if ( trw_layer_has_same_waypoint_names ( vtl ) ) { + if ( a_dialog_yes_or_no ( VIK_GTK_WINDOW_FROM_LAYER(vtl), + _("Multiple entries with the same name exist. This method only works with unique names. Force unique names now?"), NULL ) ) { + vik_trw_layer_uniquify_waypoints ( vtl, VIK_LAYERS_PANEL(values[MA_VLP]) ); + } + else + return; + } + + // Sort list alphabetically for better presentation + g_hash_table_foreach ( vtl->waypoints, (GHFunc) trw_layer_sorted_wp_id_by_name_list, &all); + if ( ! all ) { + a_dialog_error_msg (VIK_GTK_WINDOW_FROM_LAYER(vtl), _("No waypoints found")); + return; + } + + all = g_list_sort(all, sort_alphabetically); + + // Get list of items to delete from the user + GList *delete_list = a_dialog_select_from_list(VIK_GTK_WINDOW_FROM_LAYER(vtl), + all, + TRUE, + _("Delete Selection"), + _("Select waypoints to delete")); + g_list_free(all); + + // Delete requested waypoints + // since specificly requested, IMHO no need for extra confirmation + if ( delete_list ) { + GList *l; + for (l = delete_list; l != NULL; l = g_list_next(l)) { + // This deletes first waypoint it finds of that name (but uniqueness is enforced above) + trw_layer_delete_waypoint_by_name (vtl, l->data); + } + g_list_free(delete_list); + + trw_layer_calculate_bounds_waypoints ( vtl ); + // Reset layer timestamp in case it has now changed + vik_treeview_item_set_timestamp ( vtl->vl.vt, &vtl->vl.iter, trw_layer_get_timestamp(vtl) ); + vik_layer_emit_update( VIK_LAYER(vtl) ); + } + +} + +/** + * Only deletes first copy of each duplicated waypoint + * Thus call repeatedly to remove all duplicates + */ +static guint trw_layer_delete_duplicate_waypoints_main ( VikTrwLayer *vtl ) +{ + GHashTableIter iter; + gpointer key, value; + + guint delete_count = 0; + guint sz = g_hash_table_size ( vtl->waypoints ); + + for ( int ii = 0; ii < (sz - delete_count); ii++ ) { + g_hash_table_iter_init ( &iter, vtl->waypoints ); + g_hash_table_iter_next ( &iter, &key, &value ); + // Progress to the nth waypoint + for ( int jj = 0; jj < ii; jj++ ) { + g_hash_table_iter_next ( &iter, &key, &value ); + } + VikWaypoint *wpt1 = VIK_WAYPOINT(value); + if ( wpt1 ) { + // Compare against rest of the list + gboolean done = FALSE; + while ( !done && g_hash_table_iter_next (&iter, &key, &value) ) { + VikWaypoint *wpt2 = VIK_WAYPOINT(value); + // Just how many other fields is it sensible to compare? altitude, comment, etc ??? + if ( vik_coord_equalish(&(wpt1->coord), &(wpt2->coord)) && + !g_strcmp0(wpt1->symbol, wpt2->symbol) ) { + + GtkTreeIter *it = g_hash_table_lookup ( vtl->waypoints_iters, key ); + if ( it ) { + delete_waypoint_low_level ( vtl, wpt2, key, it ); + // Have to exit now as hash table changed + // (as otherwise continuing iterating over it can go badly wrong) + done = TRUE; + delete_count++; + } + } + } + } + } + return delete_count; +} + +/** + * + */ +static void trw_layer_delete_duplicate_waypoints ( menu_array_layer values ) +{ + VikTrwLayer *vtl = VIK_TRW_LAYER(values[MA_VTL]); + + guint delete_count = 0; + guint cnt = 0; + // Continually call until nothing more deleted + do { + cnt = trw_layer_delete_duplicate_waypoints_main ( vtl ); + delete_count += cnt; + } while ( cnt ); + + if ( delete_count ) { + // Inform user how much was changed + gchar str[64]; + const gchar *tmp_str = ngettext("%ld waypoint deleted", "%ld waypoints deleted", delete_count); + g_snprintf(str, 64, tmp_str, delete_count); + a_dialog_info_msg ( VIK_GTK_WINDOW_FROM_LAYER(vtl), str ); + vik_layer_emit_update ( VIK_LAYER(vtl) ); + } + else { + a_dialog_info_msg ( VIK_GTK_WINDOW_FROM_LAYER(vtl), _("No duplicates found") ); + } +} + +/** + * + */ +static void trw_layer_iter_visibility_toggle ( gpointer id, GtkTreeIter *it, VikTreeview *vt ) +{ + vik_treeview_item_toggle_visible ( vt, it ); +} + +/** + * + */ +static void trw_layer_iter_visibility ( gpointer id, GtkTreeIter *it, gpointer vis_data[2] ) +{ + vik_treeview_item_set_visible ( (VikTreeview*)vis_data[0], it, GPOINTER_TO_INT (vis_data[1]) ); +} + +/** + * + */ +static void trw_layer_waypoints_visibility ( gpointer id, VikWaypoint *wp, gpointer on_off ) +{ + wp->visible = GPOINTER_TO_INT (on_off); +} + +/** + * + */ +static void trw_layer_waypoints_toggle_visibility ( gpointer id, VikWaypoint *wp ) +{ + wp->visible = !wp->visible; +} + +/** + * + */ +static void trw_layer_waypoints_visibility_off ( menu_array_layer values ) +{ + VikTrwLayer *vtl = VIK_TRW_LAYER(values[MA_VTL]); + gpointer vis_data[2] = { VIK_LAYER(vtl)->vt, GINT_TO_POINTER(FALSE) }; + g_hash_table_foreach ( vtl->waypoints_iters, (GHFunc) trw_layer_iter_visibility, vis_data ); + g_hash_table_foreach ( vtl->waypoints, (GHFunc) trw_layer_waypoints_visibility, vis_data[1] ); + // Redraw + vik_layer_emit_update ( VIK_LAYER(vtl) ); +} + +/** + * + */ +static void trw_layer_waypoints_visibility_on ( menu_array_layer values ) +{ + VikTrwLayer *vtl = VIK_TRW_LAYER(values[MA_VTL]); + gpointer vis_data[2] = { VIK_LAYER(vtl)->vt, GINT_TO_POINTER(TRUE) }; + g_hash_table_foreach ( vtl->waypoints_iters, (GHFunc) trw_layer_iter_visibility, vis_data ); + g_hash_table_foreach ( vtl->waypoints, (GHFunc) trw_layer_waypoints_visibility, vis_data[1] ); + // Redraw + vik_layer_emit_update ( VIK_LAYER(vtl) ); +} + +/** + * + */ +static void trw_layer_waypoints_visibility_toggle ( menu_array_layer values ) +{ + VikTrwLayer *vtl = VIK_TRW_LAYER(values[MA_VTL]); + g_hash_table_foreach ( vtl->waypoints_iters, (GHFunc) trw_layer_iter_visibility_toggle, VIK_LAYER(vtl)->vt ); + g_hash_table_foreach ( vtl->waypoints, (GHFunc) trw_layer_waypoints_toggle_visibility, NULL ); + // Redraw + vik_layer_emit_update ( VIK_LAYER(vtl) ); +} + +/** + * + */ +static void trw_layer_tracks_visibility ( gpointer id, VikTrack *trk, gpointer on_off ) +{ + trk->visible = GPOINTER_TO_INT (on_off); +} + +/** + * + */ +static void trw_layer_tracks_toggle_visibility ( gpointer id, VikTrack *trk ) +{ + trk->visible = !trk->visible; +} + +/** + * + */ +static void trw_layer_tracks_visibility_off ( menu_array_layer values ) +{ + VikTrwLayer *vtl = VIK_TRW_LAYER(values[MA_VTL]); + gpointer vis_data[2] = { VIK_LAYER(vtl)->vt, GINT_TO_POINTER(FALSE) }; + g_hash_table_foreach ( vtl->tracks_iters, (GHFunc) trw_layer_iter_visibility, vis_data ); + g_hash_table_foreach ( vtl->tracks, (GHFunc) trw_layer_tracks_visibility, vis_data[1] ); + // Redraw + vik_layer_emit_update ( VIK_LAYER(vtl) ); +} + +/** + * + */ +static void trw_layer_tracks_visibility_on ( menu_array_layer values ) +{ + VikTrwLayer *vtl = VIK_TRW_LAYER(values[MA_VTL]); + gpointer vis_data[2] = { VIK_LAYER(vtl)->vt, GINT_TO_POINTER(TRUE) }; + g_hash_table_foreach ( vtl->tracks_iters, (GHFunc) trw_layer_iter_visibility, vis_data ); + g_hash_table_foreach ( vtl->tracks, (GHFunc) trw_layer_tracks_visibility, vis_data[1] ); + // Redraw + vik_layer_emit_update ( VIK_LAYER(vtl) ); +} + +/** + * + */ +static void trw_layer_tracks_visibility_toggle ( menu_array_layer values ) +{ + VikTrwLayer *vtl = VIK_TRW_LAYER(values[MA_VTL]); + g_hash_table_foreach ( vtl->tracks_iters, (GHFunc) trw_layer_iter_visibility_toggle, VIK_LAYER(vtl)->vt ); + g_hash_table_foreach ( vtl->tracks, (GHFunc) trw_layer_tracks_toggle_visibility, NULL ); + // Redraw + vik_layer_emit_update ( VIK_LAYER(vtl) ); +} + +/** + * + */ +static void trw_layer_routes_visibility_off ( menu_array_layer values ) +{ + VikTrwLayer *vtl = VIK_TRW_LAYER(values[MA_VTL]); + gpointer vis_data[2] = { VIK_LAYER(vtl)->vt, GINT_TO_POINTER(FALSE) }; + g_hash_table_foreach ( vtl->routes_iters, (GHFunc) trw_layer_iter_visibility, vis_data ); + g_hash_table_foreach ( vtl->routes, (GHFunc) trw_layer_tracks_visibility, vis_data[1] ); + // Redraw + vik_layer_emit_update ( VIK_LAYER(vtl) ); +} + +/** + * + */ +static void trw_layer_routes_visibility_on ( menu_array_layer values ) +{ + VikTrwLayer *vtl = VIK_TRW_LAYER(values[MA_VTL]); + gpointer vis_data[2] = { VIK_LAYER(vtl)->vt, GINT_TO_POINTER(TRUE) }; + g_hash_table_foreach ( vtl->routes_iters, (GHFunc) trw_layer_iter_visibility, vis_data ); + g_hash_table_foreach ( vtl->routes, (GHFunc) trw_layer_tracks_visibility, vis_data[1] ); + // Redraw + vik_layer_emit_update ( VIK_LAYER(vtl) ); +} + +/** + * + */ +static void trw_layer_routes_visibility_toggle ( menu_array_layer values ) +{ + VikTrwLayer *vtl = VIK_TRW_LAYER(values[MA_VTL]); + g_hash_table_foreach ( vtl->routes_iters, (GHFunc) trw_layer_iter_visibility_toggle, VIK_LAYER(vtl)->vt ); + g_hash_table_foreach ( vtl->routes, (GHFunc) trw_layer_tracks_toggle_visibility, NULL ); + // Redraw + vik_layer_emit_update ( VIK_LAYER(vtl) ); +} + +/** + * vik_trw_layer_build_waypoint_list_t: + * + * Helper function to construct a list of #vik_trw_waypoint_list_t + */ +GList *vik_trw_layer_build_waypoint_list_t ( VikTrwLayer *vtl, GList *waypoints ) +{ + GList *waypoints_and_layers = NULL; + // build waypoints_and_layers list + while ( waypoints ) { + vik_trw_waypoint_list_t *vtdl = g_malloc (sizeof(vik_trw_waypoint_list_t)); + vtdl->wpt = VIK_WAYPOINT(waypoints->data); + vtdl->vtl = vtl; + waypoints_and_layers = g_list_prepend ( waypoints_and_layers, vtdl ); + waypoints = g_list_next ( waypoints ); + } + return waypoints_and_layers; +} + +/** + * trw_layer_create_waypoint_list: + * + * Create the latest list of waypoints with the associated layer(s) + * Although this will always be from a single layer here + */ +static GList* trw_layer_create_waypoint_list ( VikLayer *vl, gpointer user_data ) +{ + VikTrwLayer *vtl = VIK_TRW_LAYER(vl); + GList *waypoints = g_hash_table_get_values ( vik_trw_layer_get_waypoints(vtl) ); + + return vik_trw_layer_build_waypoint_list_t ( vtl, waypoints ); +} + +/** + * trw_layer_analyse_close: + * + * Stuff to do on dialog closure + */ +static void trw_layer_analyse_close ( GtkWidget *dialog, gint resp, VikLayer* vl ) +{ + VikTrwLayer *vtl = VIK_TRW_LAYER(vl); + gtk_widget_destroy ( dialog ); + vtl->tracks_analysis_dialog = NULL; +} + +/** + * vik_trw_layer_build_track_list_t: + * + * Helper function to construct a list of #vik_trw_track_list_t + */ +GList *vik_trw_layer_build_track_list_t ( VikTrwLayer *vtl, GList *tracks ) +{ + GList *tracks_and_layers = NULL; + // build tracks_and_layers list + while ( tracks ) { + vik_trw_track_list_t *vtdl = g_malloc (sizeof(vik_trw_track_list_t)); + vtdl->trk = VIK_TRACK(tracks->data); + vtdl->vtl = vtl; + tracks_and_layers = g_list_prepend ( tracks_and_layers, vtdl ); + tracks = g_list_next ( tracks ); + } + return tracks_and_layers; +} + +/** + * trw_layer_create_track_list: + * + * Create the latest list of tracks with the associated layer(s) + * Although this will always be from a single layer here + */ +static GList* trw_layer_create_track_list ( VikLayer *vl, gpointer user_data ) +{ + VikTrwLayer *vtl = VIK_TRW_LAYER(vl); + GList *tracks = NULL; + if ( GPOINTER_TO_INT(user_data) == VIK_TRW_LAYER_SUBLAYER_TRACKS ) + tracks = g_hash_table_get_values ( vik_trw_layer_get_tracks(vtl) ); + else + tracks = g_hash_table_get_values ( vik_trw_layer_get_routes(vtl) ); + + return vik_trw_layer_build_track_list_t ( vtl, tracks ); +} + +static void trw_layer_tracks_stats ( menu_array_layer values ) +{ + VikTrwLayer *vtl = VIK_TRW_LAYER(values[MA_VTL]); + // There can only be one! + if ( vtl->tracks_analysis_dialog ) + return; + + vtl->tracks_analysis_dialog = vik_trw_layer_analyse_this ( VIK_GTK_WINDOW_FROM_LAYER(vtl), + VIK_LAYER(vtl)->name, + VIK_LAYER(vtl), + GINT_TO_POINTER(VIK_TRW_LAYER_SUBLAYER_TRACKS), + trw_layer_create_track_list, + trw_layer_analyse_close ); +} + +/** + * + */ +static void trw_layer_routes_stats ( menu_array_layer values ) +{ + VikTrwLayer *vtl = VIK_TRW_LAYER(values[MA_VTL]); + // There can only be one! + if ( vtl->tracks_analysis_dialog ) + return; + + vtl->tracks_analysis_dialog = vik_trw_layer_analyse_this ( VIK_GTK_WINDOW_FROM_LAYER(vtl), + VIK_LAYER(vtl)->name, + VIK_LAYER(vtl), + GINT_TO_POINTER(VIK_TRW_LAYER_SUBLAYER_ROUTES), + trw_layer_create_track_list, + trw_layer_analyse_close ); +} + +static void trw_layer_goto_waypoint ( menu_array_sublayer values ) +{ + VikTrwLayer *vtl = VIK_TRW_LAYER(values[MA_VTL]); + VikWaypoint *wp = g_hash_table_lookup ( vtl->waypoints, values[MA_SUBLAYER_ID] ); + if ( wp ) + goto_coord ( values[MA_VLP], vtl, values[MA_VVP], &(wp->coord) ); +} + +static void trw_layer_waypoint_gc_webpage ( menu_array_sublayer values ) +{ + VikTrwLayer *vtl = VIK_TRW_LAYER(values[MA_VTL]); + VikWaypoint *wp = g_hash_table_lookup ( vtl->waypoints, values[MA_SUBLAYER_ID] ); + if ( !wp ) + return; + gchar *webpage = g_strdup_printf("http://www.geocaching.com/seek/cache_details.aspx?wp=%s", wp->name ); + open_url(VIK_GTK_WINDOW_FROM_LAYER(VIK_LAYER(vtl)), webpage); + g_free ( webpage ); +} + +static void trw_layer_waypoint_webpage ( menu_array_sublayer values ) +{ + VikTrwLayer *vtl = VIK_TRW_LAYER(values[MA_VTL]); + VikWaypoint *wp = g_hash_table_lookup ( vtl->waypoints, values[MA_SUBLAYER_ID] ); + if ( !wp ) + return; + if ( wp->url ) { + open_url(VIK_GTK_WINDOW_FROM_LAYER(VIK_LAYER(vtl)), wp->url); + } else if ( !strncmp(wp->comment, "http", 4) ) { + open_url(VIK_GTK_WINDOW_FROM_LAYER(VIK_LAYER(vtl)), wp->comment); + } else if ( !strncmp(wp->description, "http", 4) ) { + open_url(VIK_GTK_WINDOW_FROM_LAYER(VIK_LAYER(vtl)), wp->description); + } +} + +static const gchar* trw_layer_sublayer_rename_request ( VikTrwLayer *l, const gchar *newname, gpointer vlp, gint subtype, gpointer sublayer, GtkTreeIter *iter ) +{ + if ( subtype == VIK_TRW_LAYER_SUBLAYER_WAYPOINT ) + { + VikWaypoint *wp = g_hash_table_lookup ( l->waypoints, sublayer ); + + // No actual change to the name supplied + if ( wp->name ) + if (strcmp(newname, wp->name) == 0 ) + return NULL; + + VikWaypoint *wpf = vik_trw_layer_get_waypoint ( l, newname ); + + if ( wpf ) { + // An existing waypoint has been found with the requested name + if ( ! a_dialog_yes_or_no ( VIK_GTK_WINDOW_FROM_LAYER(l), + _("A waypoint with the name \"%s\" already exists. Really rename to the same name?"), + newname ) ) + return NULL; + } + + // Update WP name and refresh the treeview + vik_waypoint_set_name (wp, newname); + + vik_treeview_item_set_name ( VIK_LAYER(l)->vt, iter, newname ); + vik_treeview_sort_children ( VIK_LAYER(l)->vt, &(l->waypoints_iter), l->wp_sort_order ); + + vik_layers_panel_emit_update ( VIK_LAYERS_PANEL(vlp) ); + + return newname; + } + + if ( subtype == VIK_TRW_LAYER_SUBLAYER_TRACK ) + { + VikTrack *trk = g_hash_table_lookup ( l->tracks, sublayer ); + + // No actual change to the name supplied + if ( trk->name ) + if (strcmp(newname, trk->name) == 0) + return NULL; + + VikTrack *trkf = vik_trw_layer_get_track ( l, (gpointer) newname ); + + if ( trkf ) { + // An existing track has been found with the requested name + if ( ! a_dialog_yes_or_no ( VIK_GTK_WINDOW_FROM_LAYER(l), + _("A track with the name \"%s\" already exists. Really rename to the same name?"), + newname ) ) + return NULL; + } + // Update track name and refresh GUI parts + vik_track_set_name (trk, newname); + + // Update any subwindows that could be displaying this track which has changed name + // Only one Track Edit Window + if ( l->current_tp_track == trk && l->tpwin ) { + vik_trw_layer_tpwin_set_track_name ( l->tpwin, newname ); + } + // Property Dialog of the track + vik_trw_layer_propwin_update ( trk ); + + vik_treeview_item_set_name ( VIK_LAYER(l)->vt, iter, newname ); + vik_treeview_sort_children ( VIK_LAYER(l)->vt, &(l->tracks_iter), l->track_sort_order ); + + vik_layers_panel_emit_update ( VIK_LAYERS_PANEL(vlp) ); + + return newname; + } + + if ( subtype == VIK_TRW_LAYER_SUBLAYER_ROUTE ) + { + VikTrack *trk = g_hash_table_lookup ( l->routes, sublayer ); + + // No actual change to the name supplied + if ( trk->name ) + if (strcmp(newname, trk->name) == 0) + return NULL; + + VikTrack *trkf = vik_trw_layer_get_route ( l, (gpointer) newname ); + + if ( trkf ) { + // An existing track has been found with the requested name + if ( ! a_dialog_yes_or_no ( VIK_GTK_WINDOW_FROM_LAYER(l), + _("A route with the name \"%s\" already exists. Really rename to the same name?"), + newname ) ) + return NULL; + } + // Update track name and refresh GUI parts + vik_track_set_name (trk, newname); + + // Update any subwindows that could be displaying this track which has changed name + // Only one Track Edit Window + if ( l->current_tp_track == trk && l->tpwin ) { + vik_trw_layer_tpwin_set_track_name ( l->tpwin, newname ); + } + // Property Dialog of the track + vik_trw_layer_propwin_update ( trk ); + + vik_treeview_item_set_name ( VIK_LAYER(l)->vt, iter, newname ); + vik_treeview_sort_children ( VIK_LAYER(l)->vt, &(l->tracks_iter), l->track_sort_order ); + + vik_layers_panel_emit_update ( VIK_LAYERS_PANEL(vlp) ); + + return newname; + } + return NULL; +} + +static gboolean is_valid_geocache_name ( gchar *str ) +{ + gint len = strlen ( str ); + return len >= 3 && len <= 7 && str[0] == 'G' && str[1] == 'C' && isalnum(str[2]) && (len < 4 || isalnum(str[3])) && (len < 5 || isalnum(str[4])) && (len < 6 || isalnum(str[5])) && (len < 7 || isalnum(str[6])); +} + +#ifndef WINDOWS +static void trw_layer_track_use_with_filter ( menu_array_sublayer values ) +{ + VikTrack *trk = g_hash_table_lookup ( VIK_TRW_LAYER(values[MA_VTL])->tracks, values[MA_SUBLAYER_ID] ); + a_acquire_set_filter_track ( trk ); +} +#endif + +#ifdef VIK_CONFIG_GOOGLE +static gboolean is_valid_google_route ( VikTrwLayer *vtl, const gpointer track_id ) +{ + VikTrack *tr = g_hash_table_lookup ( vtl->routes, track_id ); + return ( tr && tr->comment && strlen(tr->comment) > 7 && !strncmp(tr->comment, "from:", 5) ); +} + +static void trw_layer_google_route_webpage ( menu_array_sublayer values ) +{ + VikTrack *tr = g_hash_table_lookup ( VIK_TRW_LAYER(values[MA_VTL])->routes, values[MA_SUBLAYER_ID] ); + if ( tr ) { + gchar *escaped = g_uri_escape_string ( tr->comment, NULL, TRUE ); + gchar *webpage = g_strdup_printf("http://maps.google.com/maps?f=q&hl=en&q=%s", escaped ); + open_url(VIK_GTK_WINDOW_FROM_LAYER(VIK_LAYER(values[MA_VTL])), webpage); + g_free ( escaped ); + g_free ( webpage ); + } +} +#endif + +/* vlp can be NULL if necessary - i.e. right-click from a tool */ +/* viewpoint is now available instead */ +static gboolean trw_layer_sublayer_add_menu_items ( VikTrwLayer *l, GtkMenu *menu, gpointer vlp, gint subtype, gpointer sublayer, GtkTreeIter *iter, VikViewport *vvp ) +{ + static menu_array_sublayer pass_along; + GtkWidget *item; + gboolean rv = FALSE; + + pass_along[MA_VTL] = l; + pass_along[MA_VLP] = vlp; + pass_along[MA_SUBTYPE] = GINT_TO_POINTER (subtype); + pass_along[MA_SUBLAYER_ID] = sublayer; + pass_along[MA_CONFIRM] = GINT_TO_POINTER (1); // Confirm delete request + pass_along[MA_VVP] = vvp; + pass_along[MA_TV_ITER] = iter; + pass_along[MA_MISC] = NULL; // For misc purposes - maybe track or waypoint + + if ( subtype == VIK_TRW_LAYER_SUBLAYER_WAYPOINT || subtype == VIK_TRW_LAYER_SUBLAYER_TRACK || subtype == VIK_TRW_LAYER_SUBLAYER_ROUTE ) + { + rv = TRUE; + + item = gtk_image_menu_item_new_from_stock ( GTK_STOCK_PROPERTIES, NULL ); + g_signal_connect_swapped ( G_OBJECT(item), "activate", G_CALLBACK(trw_layer_properties_item), pass_along ); + gtk_menu_shell_append ( GTK_MENU_SHELL(menu), item ); + gtk_widget_show ( item ); + + if (subtype == VIK_TRW_LAYER_SUBLAYER_TRACK) { + VikTrack *tr = g_hash_table_lookup ( l->tracks, sublayer ); + if (tr && tr->property_dialog) + gtk_widget_set_sensitive(GTK_WIDGET(item), FALSE ); + } + if (subtype == VIK_TRW_LAYER_SUBLAYER_ROUTE) { + VikTrack *tr = g_hash_table_lookup ( l->routes, sublayer ); + if (tr && tr->property_dialog) + gtk_widget_set_sensitive(GTK_WIDGET(item), FALSE ); + } + + item = gtk_image_menu_item_new_from_stock ( GTK_STOCK_CUT, NULL ); + g_signal_connect_swapped ( G_OBJECT(item), "activate", G_CALLBACK(trw_layer_cut_item_cb), pass_along ); + gtk_menu_shell_append ( GTK_MENU_SHELL(menu), item ); + gtk_widget_show ( item ); + + item = gtk_image_menu_item_new_from_stock ( GTK_STOCK_COPY, NULL ); + g_signal_connect_swapped ( G_OBJECT(item), "activate", G_CALLBACK(trw_layer_copy_item_cb), pass_along ); + gtk_menu_shell_append ( GTK_MENU_SHELL(menu), item ); + gtk_widget_show ( item ); + + item = gtk_image_menu_item_new_from_stock ( GTK_STOCK_DELETE, NULL ); + g_signal_connect_swapped ( G_OBJECT(item), "activate", G_CALLBACK(trw_layer_delete_item), pass_along ); + gtk_menu_shell_append ( GTK_MENU_SHELL(menu), item ); + gtk_widget_show ( item ); + + if ( subtype == VIK_TRW_LAYER_SUBLAYER_WAYPOINT ) + { + // Always create separator as now there is always at least the transform menu option + item = gtk_menu_item_new (); + gtk_menu_shell_append ( GTK_MENU_SHELL(menu), item ); + gtk_widget_show ( item ); + + /* could be a right-click using the tool */ + if ( vlp != NULL ) { + item = gtk_image_menu_item_new_with_mnemonic ( _("_Goto") ); + gtk_image_menu_item_set_image ( (GtkImageMenuItem*)item, gtk_image_new_from_stock (GTK_STOCK_JUMP_TO, GTK_ICON_SIZE_MENU) ); + g_signal_connect_swapped ( G_OBJECT(item), "activate", G_CALLBACK(trw_layer_goto_waypoint), pass_along ); + gtk_menu_shell_append ( GTK_MENU_SHELL(menu), item ); + gtk_widget_show ( item ); + } + + VikWaypoint *wp = g_hash_table_lookup ( VIK_TRW_LAYER(l)->waypoints, sublayer ); + + if ( wp && wp->name ) { + if ( is_valid_geocache_name ( wp->name ) ) { + item = gtk_menu_item_new_with_mnemonic ( _("_Visit Geocache Webpage") ); + g_signal_connect_swapped ( G_OBJECT(item), "activate", G_CALLBACK(trw_layer_waypoint_gc_webpage), pass_along ); + gtk_menu_shell_append ( GTK_MENU_SHELL(menu), item ); + gtk_widget_show ( item ); + } +#ifdef VIK_CONFIG_GEOTAG + item = gtk_menu_item_new_with_mnemonic ( _("Geotag _Images...") ); + g_signal_connect_swapped ( G_OBJECT(item), "activate", G_CALLBACK(trw_layer_geotagging_waypoint), pass_along ); + gtk_menu_shell_append (GTK_MENU_SHELL (menu), item); + gtk_widget_set_tooltip_text (item, _("Geotag multiple images against this waypoint")); + gtk_widget_show ( item ); +#endif + } + + if ( wp && wp->image ) + { + // Set up image paramater + pass_along[MA_MISC] = wp->image; + + item = gtk_image_menu_item_new_with_mnemonic ( _("_Show Picture...") ); + gtk_image_menu_item_set_image ( (GtkImageMenuItem*)item, gtk_image_new_from_stock ("vik-icon-Show Picture", GTK_ICON_SIZE_MENU) ); // Own icon - see stock_icons in vikwindow.c + g_signal_connect_swapped ( G_OBJECT(item), "activate", G_CALLBACK(trw_layer_show_picture), pass_along ); + gtk_menu_shell_append ( GTK_MENU_SHELL(menu), item ); + gtk_widget_show ( item ); + +#ifdef VIK_CONFIG_GEOTAG + GtkWidget *geotag_submenu = gtk_menu_new (); + item = gtk_image_menu_item_new_with_mnemonic ( _("Update Geotag on _Image") ); + gtk_image_menu_item_set_image ( (GtkImageMenuItem*)item, gtk_image_new_from_stock (GTK_STOCK_REFRESH, GTK_ICON_SIZE_MENU) ); + gtk_menu_shell_append (GTK_MENU_SHELL (menu), item); + gtk_widget_show ( item ); + gtk_menu_item_set_submenu (GTK_MENU_ITEM (item), geotag_submenu ); + + item = gtk_menu_item_new_with_mnemonic ( _("_Update") ); + g_signal_connect_swapped ( G_OBJECT(item), "activate", G_CALLBACK(trw_layer_geotagging_waypoint_mtime_update), pass_along ); + gtk_menu_shell_append (GTK_MENU_SHELL (geotag_submenu), item); + gtk_widget_show ( item ); + + item = gtk_menu_item_new_with_mnemonic ( _("Update and _Keep File Timestamp") ); + g_signal_connect_swapped ( G_OBJECT(item), "activate", G_CALLBACK(trw_layer_geotagging_waypoint_mtime_keep), pass_along ); + gtk_menu_shell_append (GTK_MENU_SHELL (geotag_submenu), item); + gtk_widget_show ( item ); +#endif + } + + if ( wp ) + { + if ( wp->url || + ( wp->comment && !strncmp(wp->comment, "http", 4) ) || + ( wp->description && !strncmp(wp->description, "http", 4) )) { + item = gtk_image_menu_item_new_with_mnemonic ( _("Visit _Webpage") ); + gtk_image_menu_item_set_image ( (GtkImageMenuItem*)item, gtk_image_new_from_stock (GTK_STOCK_NETWORK, GTK_ICON_SIZE_MENU) ); + g_signal_connect_swapped ( G_OBJECT(item), "activate", G_CALLBACK(trw_layer_waypoint_webpage), pass_along ); + gtk_menu_shell_append (GTK_MENU_SHELL (menu), item); + gtk_widget_show ( item ); + } + } + } + } + + if ( subtype == VIK_TRW_LAYER_SUBLAYER_WAYPOINTS || subtype == VIK_TRW_LAYER_SUBLAYER_TRACKS || subtype == VIK_TRW_LAYER_SUBLAYER_ROUTES ) { + item = gtk_image_menu_item_new_from_stock ( GTK_STOCK_PASTE, NULL ); + g_signal_connect_swapped ( G_OBJECT(item), "activate", G_CALLBACK(trw_layer_paste_item_cb), pass_along ); + gtk_menu_shell_append ( GTK_MENU_SHELL(menu), item ); + gtk_widget_show ( item ); + // TODO: only enable if suitable item is in clipboard - want to determine *which* sublayer type + if ( a_clipboard_type ( ) == VIK_CLIPBOARD_DATA_SUBLAYER ) + gtk_widget_set_sensitive ( item, TRUE ); + else + gtk_widget_set_sensitive ( item, FALSE ); + + // Add separator + item = gtk_menu_item_new (); + gtk_menu_shell_append ( GTK_MENU_SHELL(menu), item ); + gtk_widget_show ( item ); + } + + if ( vlp && (subtype == VIK_TRW_LAYER_SUBLAYER_WAYPOINTS || subtype == VIK_TRW_LAYER_SUBLAYER_WAYPOINT) ) + { + rv = TRUE; + item = gtk_image_menu_item_new_with_mnemonic ( _("_New Waypoint...") ); + gtk_image_menu_item_set_image ( (GtkImageMenuItem*)item, gtk_image_new_from_stock (GTK_STOCK_NEW, GTK_ICON_SIZE_MENU) ); + g_signal_connect_swapped ( G_OBJECT(item), "activate", G_CALLBACK(trw_layer_new_wp), pass_along ); + gtk_menu_shell_append (GTK_MENU_SHELL (menu), item); + gtk_widget_show ( item ); + } + + if ( subtype == VIK_TRW_LAYER_SUBLAYER_WAYPOINTS ) + { + item = gtk_image_menu_item_new_with_mnemonic ( _("_View All Waypoints") ); + gtk_image_menu_item_set_image ( (GtkImageMenuItem*)item, gtk_image_new_from_stock (GTK_STOCK_ZOOM_FIT, GTK_ICON_SIZE_MENU) ); + g_signal_connect_swapped ( G_OBJECT(item), "activate", G_CALLBACK(trw_layer_auto_waypoints_view), pass_along ); + gtk_menu_shell_append (GTK_MENU_SHELL (menu), item); + gtk_widget_show ( item ); + + item = gtk_image_menu_item_new_with_mnemonic ( _("Goto _Waypoint...") ); + gtk_image_menu_item_set_image ( (GtkImageMenuItem*)item, gtk_image_new_from_stock (GTK_STOCK_JUMP_TO, GTK_ICON_SIZE_MENU) ); + g_signal_connect_swapped ( G_OBJECT(item), "activate", G_CALLBACK(trw_layer_goto_wp), pass_along ); + gtk_menu_shell_append (GTK_MENU_SHELL (menu), item); + gtk_widget_show ( item ); + + item = gtk_image_menu_item_new_with_mnemonic ( _("Delete _All Waypoints") ); + gtk_image_menu_item_set_image ( (GtkImageMenuItem*)item, gtk_image_new_from_stock (GTK_STOCK_REMOVE, GTK_ICON_SIZE_MENU) ); + g_signal_connect_swapped ( G_OBJECT(item), "activate", G_CALLBACK(trw_layer_delete_all_waypoints), pass_along ); + gtk_menu_shell_append ( GTK_MENU_SHELL(menu), item ); + gtk_widget_show ( item ); + + item = gtk_image_menu_item_new_with_mnemonic ( _("_Delete Waypoints From Selection...") ); + gtk_image_menu_item_set_image ( (GtkImageMenuItem*)item, gtk_image_new_from_stock (GTK_STOCK_INDEX, GTK_ICON_SIZE_MENU) ); + g_signal_connect_swapped ( G_OBJECT(item), "activate", G_CALLBACK(trw_layer_delete_waypoints_from_selection), pass_along ); + gtk_menu_shell_append ( GTK_MENU_SHELL(menu), item ); + gtk_widget_show ( item ); + + item = gtk_image_menu_item_new_with_mnemonic ( _("Delete Duplicate Waypoints") ); + gtk_image_menu_item_set_image ( (GtkImageMenuItem*)item, gtk_image_new_from_stock (GTK_STOCK_DELETE, GTK_ICON_SIZE_MENU) ); + g_signal_connect_swapped ( G_OBJECT(item), "activate", G_CALLBACK(trw_layer_delete_duplicate_waypoints), pass_along ); + gtk_menu_shell_append ( GTK_MENU_SHELL(menu), item ); + gtk_widget_show ( item ); + + GtkWidget *vis_submenu = gtk_menu_new (); + item = gtk_menu_item_new_with_mnemonic ( _("_Visibility") ); + gtk_menu_shell_append (GTK_MENU_SHELL (menu), item); + gtk_widget_show ( item ); + gtk_menu_item_set_submenu (GTK_MENU_ITEM (item), vis_submenu ); + + item = gtk_image_menu_item_new_with_mnemonic ( _("_Show All Waypoints") ); + gtk_image_menu_item_set_image ( (GtkImageMenuItem*)item, gtk_image_new_from_stock (GTK_STOCK_APPLY, GTK_ICON_SIZE_MENU) ); + g_signal_connect_swapped ( G_OBJECT(item), "activate", G_CALLBACK(trw_layer_waypoints_visibility_on), pass_along ); + gtk_menu_shell_append ( GTK_MENU_SHELL(vis_submenu), item ); + gtk_widget_show ( item ); + + item = gtk_image_menu_item_new_with_mnemonic ( _("_Hide All Waypoints") ); + gtk_image_menu_item_set_image ( (GtkImageMenuItem*)item, gtk_image_new_from_stock (GTK_STOCK_CLEAR, GTK_ICON_SIZE_MENU) ); + g_signal_connect_swapped ( G_OBJECT(item), "activate", G_CALLBACK(trw_layer_waypoints_visibility_off), pass_along ); + gtk_menu_shell_append ( GTK_MENU_SHELL(vis_submenu), item ); + gtk_widget_show ( item ); + + item = gtk_image_menu_item_new_with_mnemonic ( _("_Toggle") ); + gtk_image_menu_item_set_image ( (GtkImageMenuItem*)item, gtk_image_new_from_stock (GTK_STOCK_REFRESH, GTK_ICON_SIZE_MENU) ); + g_signal_connect_swapped ( G_OBJECT(item), "activate", G_CALLBACK(trw_layer_waypoints_visibility_toggle), pass_along ); + gtk_menu_shell_append ( GTK_MENU_SHELL(vis_submenu), item ); + gtk_widget_show ( item ); + + item = gtk_image_menu_item_new_with_mnemonic ( _("_List Waypoints...") ); + gtk_image_menu_item_set_image ( (GtkImageMenuItem*)item, gtk_image_new_from_stock (GTK_STOCK_INDEX, GTK_ICON_SIZE_MENU) ); + g_signal_connect_swapped ( G_OBJECT(item), "activate", G_CALLBACK(trw_layer_waypoint_list_dialog), pass_along ); + gtk_menu_shell_append ( GTK_MENU_SHELL(menu), item ); + } + + if ( subtype == VIK_TRW_LAYER_SUBLAYER_TRACKS ) + { + rv = TRUE; + + if ( l->current_track && !l->current_track->is_route ) { + item = gtk_menu_item_new_with_mnemonic ( _("_Finish Track") ); + g_signal_connect_swapped ( G_OBJECT(item), "activate", G_CALLBACK(trw_layer_finish_track), pass_along ); + gtk_menu_shell_append (GTK_MENU_SHELL (menu), item); + gtk_widget_show ( item ); + // Add separator + item = gtk_menu_item_new (); + gtk_menu_shell_append ( GTK_MENU_SHELL(menu), item ); + gtk_widget_show ( item ); + } + + item = gtk_image_menu_item_new_with_mnemonic ( _("_View All Tracks") ); + gtk_image_menu_item_set_image ( (GtkImageMenuItem*)item, gtk_image_new_from_stock (GTK_STOCK_ZOOM_FIT, GTK_ICON_SIZE_MENU) ); + g_signal_connect_swapped ( G_OBJECT(item), "activate", G_CALLBACK(trw_layer_auto_tracks_view), pass_along ); + gtk_menu_shell_append (GTK_MENU_SHELL (menu), item); + gtk_widget_show ( item ); + + item = gtk_image_menu_item_new_with_mnemonic ( _("_New Track") ); + gtk_image_menu_item_set_image ( (GtkImageMenuItem*)item, gtk_image_new_from_stock (GTK_STOCK_NEW, GTK_ICON_SIZE_MENU) ); + g_signal_connect_swapped ( G_OBJECT(item), "activate", G_CALLBACK(trw_layer_edit_track), pass_along ); + gtk_menu_shell_append (GTK_MENU_SHELL (menu), item); + gtk_widget_show ( item ); + // Make it available only when a new track *not* already in progress + gtk_widget_set_sensitive ( item, ! (gboolean)GPOINTER_TO_INT(l->current_track) ); + + item = gtk_image_menu_item_new_with_mnemonic ( _("Delete _All Tracks") ); + gtk_image_menu_item_set_image ( (GtkImageMenuItem*)item, gtk_image_new_from_stock (GTK_STOCK_REMOVE, GTK_ICON_SIZE_MENU) ); + g_signal_connect_swapped ( G_OBJECT(item), "activate", G_CALLBACK(trw_layer_delete_all_tracks), pass_along ); + gtk_menu_shell_append ( GTK_MENU_SHELL(menu), item ); + gtk_widget_show ( item ); + + item = gtk_image_menu_item_new_with_mnemonic ( _("_Delete Tracks From Selection...") ); + gtk_image_menu_item_set_image ( (GtkImageMenuItem*)item, gtk_image_new_from_stock (GTK_STOCK_INDEX, GTK_ICON_SIZE_MENU) ); + g_signal_connect_swapped ( G_OBJECT(item), "activate", G_CALLBACK(trw_layer_delete_tracks_from_selection), pass_along ); + gtk_menu_shell_append ( GTK_MENU_SHELL(menu), item ); + gtk_widget_show ( item ); + + GtkWidget *vis_submenu = gtk_menu_new (); + item = gtk_menu_item_new_with_mnemonic ( _("_Visibility") ); + gtk_menu_shell_append (GTK_MENU_SHELL (menu), item); + gtk_widget_show ( item ); + gtk_menu_item_set_submenu (GTK_MENU_ITEM (item), vis_submenu ); + + item = gtk_image_menu_item_new_with_mnemonic ( _("_Show All Tracks") ); + gtk_image_menu_item_set_image ( (GtkImageMenuItem*)item, gtk_image_new_from_stock (GTK_STOCK_APPLY, GTK_ICON_SIZE_MENU) ); + g_signal_connect_swapped ( G_OBJECT(item), "activate", G_CALLBACK(trw_layer_tracks_visibility_on), pass_along ); + gtk_menu_shell_append ( GTK_MENU_SHELL(vis_submenu), item ); + gtk_widget_show ( item ); + + item = gtk_image_menu_item_new_with_mnemonic ( _("_Hide All Tracks") ); + gtk_image_menu_item_set_image ( (GtkImageMenuItem*)item, gtk_image_new_from_stock (GTK_STOCK_CLEAR, GTK_ICON_SIZE_MENU) ); + g_signal_connect_swapped ( G_OBJECT(item), "activate", G_CALLBACK(trw_layer_tracks_visibility_off), pass_along ); + gtk_menu_shell_append ( GTK_MENU_SHELL(vis_submenu), item ); + gtk_widget_show ( item ); + + item = gtk_image_menu_item_new_with_mnemonic ( _("_Toggle") ); + gtk_image_menu_item_set_image ( (GtkImageMenuItem*)item, gtk_image_new_from_stock (GTK_STOCK_REFRESH, GTK_ICON_SIZE_MENU) ); + g_signal_connect_swapped ( G_OBJECT(item), "activate", G_CALLBACK(trw_layer_tracks_visibility_toggle), pass_along ); + gtk_menu_shell_append ( GTK_MENU_SHELL(vis_submenu), item ); + + item = gtk_image_menu_item_new_with_mnemonic ( _("_List Tracks...") ); + gtk_image_menu_item_set_image ( (GtkImageMenuItem*)item, gtk_image_new_from_stock (GTK_STOCK_INDEX, GTK_ICON_SIZE_MENU) ); + g_signal_connect_swapped ( G_OBJECT(item), "activate", G_CALLBACK(trw_layer_track_list_dialog_single), pass_along ); + gtk_menu_shell_append ( GTK_MENU_SHELL(menu), item ); + gtk_widget_show ( item ); + + item = gtk_menu_item_new_with_mnemonic ( _("_Statistics") ); + g_signal_connect_swapped ( G_OBJECT(item), "activate", G_CALLBACK(trw_layer_tracks_stats), pass_along ); + gtk_menu_shell_append ( GTK_MENU_SHELL(menu), item ); + gtk_widget_show ( item ); + } + + if ( subtype == VIK_TRW_LAYER_SUBLAYER_ROUTES ) + { + rv = TRUE; + + if ( l->current_track && l->current_track->is_route ) { + item = gtk_menu_item_new_with_mnemonic ( _("_Finish Route") ); + // Reuse finish track method + g_signal_connect_swapped ( G_OBJECT(item), "activate", G_CALLBACK(trw_layer_finish_track), pass_along ); + gtk_menu_shell_append (GTK_MENU_SHELL (menu), item); + gtk_widget_show ( item ); + // Add separator + item = gtk_menu_item_new (); + gtk_menu_shell_append ( GTK_MENU_SHELL(menu), item ); + gtk_widget_show ( item ); + } + + item = gtk_image_menu_item_new_with_mnemonic ( _("_View All Routes") ); + gtk_image_menu_item_set_image ( (GtkImageMenuItem*)item, gtk_image_new_from_stock (GTK_STOCK_ZOOM_FIT, GTK_ICON_SIZE_MENU) ); + g_signal_connect_swapped ( G_OBJECT(item), "activate", G_CALLBACK(trw_layer_auto_routes_view), pass_along ); + gtk_menu_shell_append (GTK_MENU_SHELL (menu), item); + gtk_widget_show ( item ); + + item = gtk_image_menu_item_new_with_mnemonic ( _("_New Route") ); + gtk_image_menu_item_set_image ( (GtkImageMenuItem*)item, gtk_image_new_from_stock (GTK_STOCK_NEW, GTK_ICON_SIZE_MENU) ); + g_signal_connect_swapped ( G_OBJECT(item), "activate", G_CALLBACK(trw_layer_edit_route), pass_along ); + gtk_menu_shell_append (GTK_MENU_SHELL (menu), item); + gtk_widget_show ( item ); + // Make it available only when a new track *not* already in progress + gtk_widget_set_sensitive ( item, ! (gboolean)GPOINTER_TO_INT(l->current_track) ); + + item = gtk_image_menu_item_new_with_mnemonic ( _("Delete _All Routes") ); + gtk_image_menu_item_set_image ( (GtkImageMenuItem*)item, gtk_image_new_from_stock (GTK_STOCK_REMOVE, GTK_ICON_SIZE_MENU) ); + g_signal_connect_swapped ( G_OBJECT(item), "activate", G_CALLBACK(trw_layer_delete_all_routes), pass_along ); + gtk_menu_shell_append ( GTK_MENU_SHELL(menu), item ); + gtk_widget_show ( item ); + + item = gtk_image_menu_item_new_with_mnemonic ( _("_Delete Routes From Selection...") ); + gtk_image_menu_item_set_image ( (GtkImageMenuItem*)item, gtk_image_new_from_stock (GTK_STOCK_INDEX, GTK_ICON_SIZE_MENU) ); + g_signal_connect_swapped ( G_OBJECT(item), "activate", G_CALLBACK(trw_layer_delete_routes_from_selection), pass_along ); + gtk_menu_shell_append ( GTK_MENU_SHELL(menu), item ); + gtk_widget_show ( item ); + + GtkWidget *vis_submenu = gtk_menu_new (); + item = gtk_menu_item_new_with_mnemonic ( _("_Visibility") ); + gtk_menu_shell_append (GTK_MENU_SHELL (menu), item); + gtk_widget_show ( item ); + gtk_menu_item_set_submenu (GTK_MENU_ITEM (item), vis_submenu ); + + item = gtk_image_menu_item_new_with_mnemonic ( _("_Show All Routes") ); + gtk_image_menu_item_set_image ( (GtkImageMenuItem*)item, gtk_image_new_from_stock (GTK_STOCK_APPLY, GTK_ICON_SIZE_MENU) ); + g_signal_connect_swapped ( G_OBJECT(item), "activate", G_CALLBACK(trw_layer_routes_visibility_on), pass_along ); + gtk_menu_shell_append ( GTK_MENU_SHELL(vis_submenu), item ); + gtk_widget_show ( item ); + + item = gtk_image_menu_item_new_with_mnemonic ( _("_Hide All Routes") ); + gtk_image_menu_item_set_image ( (GtkImageMenuItem*)item, gtk_image_new_from_stock (GTK_STOCK_CLEAR, GTK_ICON_SIZE_MENU) ); + g_signal_connect_swapped ( G_OBJECT(item), "activate", G_CALLBACK(trw_layer_routes_visibility_off), pass_along ); + gtk_menu_shell_append ( GTK_MENU_SHELL(vis_submenu), item ); + gtk_widget_show ( item ); + + item = gtk_image_menu_item_new_with_mnemonic ( _("_Toggle") ); + gtk_image_menu_item_set_image ( (GtkImageMenuItem*)item, gtk_image_new_from_stock (GTK_STOCK_REFRESH, GTK_ICON_SIZE_MENU) ); + g_signal_connect_swapped ( G_OBJECT(item), "activate", G_CALLBACK(trw_layer_routes_visibility_toggle), pass_along ); + gtk_menu_shell_append ( GTK_MENU_SHELL(vis_submenu), item ); + + item = gtk_image_menu_item_new_with_mnemonic ( _("_List Routes...") ); + gtk_image_menu_item_set_image ( (GtkImageMenuItem*)item, gtk_image_new_from_stock (GTK_STOCK_INDEX, GTK_ICON_SIZE_MENU) ); + g_signal_connect_swapped ( G_OBJECT(item), "activate", G_CALLBACK(trw_layer_track_list_dialog_single), pass_along ); + gtk_menu_shell_append ( GTK_MENU_SHELL(menu), item ); + + gtk_widget_show ( item ); + + item = gtk_menu_item_new_with_mnemonic ( _("_Statistics") ); + g_signal_connect_swapped ( G_OBJECT(item), "activate", G_CALLBACK(trw_layer_routes_stats), pass_along ); + gtk_menu_shell_append ( GTK_MENU_SHELL(menu), item ); + gtk_widget_show ( item ); + } + + + if ( subtype == VIK_TRW_LAYER_SUBLAYER_WAYPOINTS || subtype == VIK_TRW_LAYER_SUBLAYER_TRACKS || subtype == VIK_TRW_LAYER_SUBLAYER_ROUTES ) { + GtkWidget *submenu_sort = gtk_menu_new (); + item = gtk_image_menu_item_new_with_mnemonic ( _("_Sort") ); + gtk_image_menu_item_set_image ( (GtkImageMenuItem*)item, gtk_image_new_from_stock (GTK_STOCK_REFRESH, GTK_ICON_SIZE_MENU) ); + gtk_menu_shell_append (GTK_MENU_SHELL (menu), item); + gtk_widget_show ( item ); + gtk_menu_item_set_submenu (GTK_MENU_ITEM (item), submenu_sort ); + + item = gtk_image_menu_item_new_with_mnemonic ( _("Name _Ascending") ); + gtk_image_menu_item_set_image ( (GtkImageMenuItem*)item, gtk_image_new_from_stock (GTK_STOCK_SORT_ASCENDING, GTK_ICON_SIZE_MENU) ); + g_signal_connect_swapped ( G_OBJECT(item), "activate", G_CALLBACK(trw_layer_sort_order_a2z), pass_along ); + gtk_menu_shell_append ( GTK_MENU_SHELL(submenu_sort), item ); + gtk_widget_show ( item ); + + item = gtk_image_menu_item_new_with_mnemonic ( _("Name _Descending") ); + gtk_image_menu_item_set_image ( (GtkImageMenuItem*)item, gtk_image_new_from_stock (GTK_STOCK_SORT_DESCENDING, GTK_ICON_SIZE_MENU) ); + g_signal_connect_swapped ( G_OBJECT(item), "activate", G_CALLBACK(trw_layer_sort_order_z2a), pass_along ); + gtk_menu_shell_append ( GTK_MENU_SHELL(submenu_sort), item ); + gtk_widget_show ( item ); + + item = gtk_image_menu_item_new_with_mnemonic ( _("Date Ascending") ); + gtk_image_menu_item_set_image ( (GtkImageMenuItem*)item, gtk_image_new_from_stock (GTK_STOCK_SORT_ASCENDING, GTK_ICON_SIZE_MENU) ); + g_signal_connect_swapped ( G_OBJECT(item), "activate", G_CALLBACK(trw_layer_sort_order_timestamp_ascend), pass_along ); + gtk_menu_shell_append ( GTK_MENU_SHELL(submenu_sort), item ); + gtk_widget_show ( item ); + + item = gtk_image_menu_item_new_with_mnemonic ( _("Date Descending") ); + gtk_image_menu_item_set_image ( (GtkImageMenuItem*)item, gtk_image_new_from_stock (GTK_STOCK_SORT_DESCENDING, GTK_ICON_SIZE_MENU) ); + g_signal_connect_swapped ( G_OBJECT(item), "activate", G_CALLBACK(trw_layer_sort_order_timestamp_descend), pass_along ); + gtk_menu_shell_append ( GTK_MENU_SHELL(submenu_sort), item ); + gtk_widget_show ( item ); + } + + GtkWidget *upload_submenu = gtk_menu_new (); + + if ( subtype == VIK_TRW_LAYER_SUBLAYER_TRACK || subtype == VIK_TRW_LAYER_SUBLAYER_ROUTE ) + { + item = gtk_menu_item_new (); + gtk_menu_shell_append ( GTK_MENU_SHELL(menu), item ); + gtk_widget_show ( item ); + + if ( l->current_track && subtype == VIK_TRW_LAYER_SUBLAYER_TRACK && !l->current_track->is_route ) + item = gtk_menu_item_new_with_mnemonic ( _("_Finish Track") ); + if ( l->current_track && subtype == VIK_TRW_LAYER_SUBLAYER_ROUTE && l->current_track->is_route ) + item = gtk_menu_item_new_with_mnemonic ( _("_Finish Route") ); + if ( l->current_track ) { + g_signal_connect_swapped ( G_OBJECT(item), "activate", G_CALLBACK(trw_layer_finish_track), pass_along ); + gtk_menu_shell_append (GTK_MENU_SHELL (menu), item); + gtk_widget_show ( item ); + + // Add separator + item = gtk_menu_item_new (); + gtk_menu_shell_append ( GTK_MENU_SHELL(menu), item ); + gtk_widget_show ( item ); + } + + if ( subtype == VIK_TRW_LAYER_SUBLAYER_TRACK ) + item = gtk_image_menu_item_new_with_mnemonic ( _("_View Track") ); + else + item = gtk_image_menu_item_new_with_mnemonic ( _("_View Route") ); + gtk_image_menu_item_set_image ( (GtkImageMenuItem*)item, gtk_image_new_from_stock (GTK_STOCK_ZOOM_FIT, GTK_ICON_SIZE_MENU) ); + g_signal_connect_swapped ( G_OBJECT(item), "activate", G_CALLBACK(trw_layer_auto_track_view), pass_along ); + gtk_menu_shell_append ( GTK_MENU_SHELL(menu), item ); + gtk_widget_show ( item ); + + item = gtk_menu_item_new_with_mnemonic ( _("_Statistics") ); + g_signal_connect_swapped ( G_OBJECT(item), "activate", G_CALLBACK(trw_layer_track_statistics), pass_along ); + gtk_menu_shell_append ( GTK_MENU_SHELL(menu), item ); + gtk_widget_show ( item ); + + GtkWidget *goto_submenu; + goto_submenu = gtk_menu_new (); + item = gtk_image_menu_item_new_with_mnemonic ( _("_Goto") ); + gtk_image_menu_item_set_image ( (GtkImageMenuItem*)item, gtk_image_new_from_stock (GTK_STOCK_JUMP_TO, GTK_ICON_SIZE_MENU) ); + gtk_menu_shell_append (GTK_MENU_SHELL (menu), item); + gtk_widget_show ( item ); + gtk_menu_item_set_submenu (GTK_MENU_ITEM (item), goto_submenu ); + + item = gtk_image_menu_item_new_with_mnemonic ( _("_Startpoint") ); + gtk_image_menu_item_set_image ( (GtkImageMenuItem*)item, gtk_image_new_from_stock (GTK_STOCK_GOTO_FIRST, GTK_ICON_SIZE_MENU) ); + g_signal_connect_swapped ( G_OBJECT(item), "activate", G_CALLBACK(trw_layer_goto_track_startpoint), pass_along ); + gtk_menu_shell_append ( GTK_MENU_SHELL(goto_submenu), item ); + gtk_widget_show ( item ); + + item = gtk_image_menu_item_new_with_mnemonic ( _("\"_Center\"") ); + gtk_image_menu_item_set_image ( (GtkImageMenuItem*)item, gtk_image_new_from_stock (GTK_STOCK_JUMP_TO, GTK_ICON_SIZE_MENU) ); + g_signal_connect_swapped ( G_OBJECT(item), "activate", G_CALLBACK(trw_layer_goto_track_center), pass_along ); + gtk_menu_shell_append ( GTK_MENU_SHELL(goto_submenu), item ); + gtk_widget_show ( item ); + + item = gtk_image_menu_item_new_with_mnemonic ( _("_Endpoint") ); + gtk_image_menu_item_set_image ( (GtkImageMenuItem*)item, gtk_image_new_from_stock (GTK_STOCK_GOTO_LAST, GTK_ICON_SIZE_MENU) ); + g_signal_connect_swapped ( G_OBJECT(item), "activate", G_CALLBACK(trw_layer_goto_track_endpoint), pass_along ); + gtk_menu_shell_append ( GTK_MENU_SHELL(goto_submenu), item ); + gtk_widget_show ( item ); + + item = gtk_image_menu_item_new_with_mnemonic ( _("_Highest Altitude") ); + gtk_image_menu_item_set_image ( (GtkImageMenuItem*)item, gtk_image_new_from_stock (GTK_STOCK_GOTO_TOP, GTK_ICON_SIZE_MENU) ); + g_signal_connect_swapped ( G_OBJECT(item), "activate", G_CALLBACK(trw_layer_goto_track_max_alt), pass_along ); + gtk_menu_shell_append ( GTK_MENU_SHELL(goto_submenu), item ); + gtk_widget_show ( item ); + + item = gtk_image_menu_item_new_with_mnemonic ( _("_Lowest Altitude") ); + gtk_image_menu_item_set_image ( (GtkImageMenuItem*)item, gtk_image_new_from_stock (GTK_STOCK_GOTO_BOTTOM, GTK_ICON_SIZE_MENU) ); + g_signal_connect_swapped ( G_OBJECT(item), "activate", G_CALLBACK(trw_layer_goto_track_min_alt), pass_along ); + gtk_menu_shell_append ( GTK_MENU_SHELL(goto_submenu), item ); + gtk_widget_show ( item ); + + // Routes don't have speeds or dates + if ( subtype == VIK_TRW_LAYER_SUBLAYER_TRACK ) { + item = gtk_image_menu_item_new_with_mnemonic ( _("_Maximum Speed") ); + gtk_image_menu_item_set_image ( (GtkImageMenuItem*)item, gtk_image_new_from_stock (GTK_STOCK_MEDIA_FORWARD, GTK_ICON_SIZE_MENU) ); + g_signal_connect_swapped ( G_OBJECT(item), "activate", G_CALLBACK(trw_layer_goto_track_max_speed), pass_along ); + gtk_menu_shell_append ( GTK_MENU_SHELL(goto_submenu), item ); + gtk_widget_show ( item ); + + item = gtk_image_menu_item_new_with_mnemonic ( _("_Date") ); + gtk_image_menu_item_set_image ( (GtkImageMenuItem*)item, gtk_image_new_from_stock (GTK_STOCK_JUMP_TO, GTK_ICON_SIZE_MENU) ); + g_signal_connect_swapped ( G_OBJECT(item), "activate", G_CALLBACK(trw_layer_goto_track_date), pass_along ); + gtk_menu_shell_append ( GTK_MENU_SHELL(goto_submenu), item ); + gtk_widget_show ( item ); + } + + GtkWidget *combine_submenu; + combine_submenu = gtk_menu_new (); + item = gtk_image_menu_item_new_with_mnemonic ( _("Co_mbine") ); + gtk_image_menu_item_set_image ( (GtkImageMenuItem*)item, gtk_image_new_from_stock (GTK_STOCK_CONNECT, GTK_ICON_SIZE_MENU) ); + gtk_menu_shell_append (GTK_MENU_SHELL (menu), item); + gtk_widget_show ( item ); + gtk_menu_item_set_submenu (GTK_MENU_ITEM (item), combine_submenu ); + + // Routes don't have times or segments... + if ( subtype == VIK_TRW_LAYER_SUBLAYER_TRACK ) { + item = gtk_menu_item_new_with_mnemonic ( _("_Merge By Time...") ); + g_signal_connect_swapped ( G_OBJECT(item), "activate", G_CALLBACK(trw_layer_merge_by_timestamp), pass_along ); + gtk_menu_shell_append ( GTK_MENU_SHELL(combine_submenu), item ); + gtk_widget_show ( item ); + + item = gtk_menu_item_new_with_mnemonic ( _("Merge _Segments") ); + g_signal_connect_swapped ( G_OBJECT(item), "activate", G_CALLBACK(trw_layer_merge_by_segment), pass_along ); + gtk_menu_shell_append ( GTK_MENU_SHELL(combine_submenu), item ); + gtk_widget_show ( item ); + } + + if ( subtype == VIK_TRW_LAYER_SUBLAYER_TRACK ) { + item = gtk_menu_item_new_with_mnemonic ( _("Merge _With Other Tracks...") ); + g_signal_connect_swapped ( G_OBJECT(item), "activate", G_CALLBACK(trw_layer_merge_with_other), pass_along ); + gtk_menu_shell_append ( GTK_MENU_SHELL(combine_submenu), item ); + gtk_widget_show ( item ); + } + + if ( subtype == VIK_TRW_LAYER_SUBLAYER_TRACK ) + item = gtk_menu_item_new_with_mnemonic ( _("_Append Track...") ); + else + item = gtk_menu_item_new_with_mnemonic ( _("_Append Route...") ); + g_signal_connect_swapped ( G_OBJECT(item), "activate", G_CALLBACK(trw_layer_append_track), pass_along ); + gtk_menu_shell_append ( GTK_MENU_SHELL(combine_submenu), item ); + gtk_widget_show ( item ); + + if ( subtype == VIK_TRW_LAYER_SUBLAYER_TRACK ) + item = gtk_menu_item_new_with_mnemonic ( _("Append _Route...") ); + else + item = gtk_menu_item_new_with_mnemonic ( _("Append _Track...") ); + g_signal_connect_swapped ( G_OBJECT(item), "activate", G_CALLBACK(trw_layer_append_other), pass_along ); + gtk_menu_shell_append ( GTK_MENU_SHELL(combine_submenu), item ); + gtk_widget_show ( item ); + + GtkWidget *split_submenu; + split_submenu = gtk_menu_new (); + item = gtk_image_menu_item_new_with_mnemonic ( _("_Split") ); + gtk_image_menu_item_set_image ( (GtkImageMenuItem*)item, gtk_image_new_from_stock (GTK_STOCK_DISCONNECT, GTK_ICON_SIZE_MENU) ); + gtk_menu_shell_append (GTK_MENU_SHELL (menu), item); + gtk_widget_show ( item ); + gtk_menu_item_set_submenu (GTK_MENU_ITEM (item), split_submenu ); + + // Routes don't have times or segments... + if ( subtype == VIK_TRW_LAYER_SUBLAYER_TRACK ) { + item = gtk_menu_item_new_with_mnemonic ( _("_Split By Time...") ); + g_signal_connect_swapped ( G_OBJECT(item), "activate", G_CALLBACK(trw_layer_split_by_timestamp), pass_along ); + gtk_menu_shell_append ( GTK_MENU_SHELL(split_submenu), item ); + gtk_widget_show ( item ); + + // ATM always enable this entry - don't want to have to analyse the track before displaying the menu - to keep the menu speedy + item = gtk_menu_item_new_with_mnemonic ( _("Split Se_gments") ); + g_signal_connect_swapped ( G_OBJECT(item), "activate", G_CALLBACK(trw_layer_split_segments), pass_along ); + gtk_menu_shell_append ( GTK_MENU_SHELL(split_submenu), item ); + gtk_widget_show ( item ); + } + + item = gtk_menu_item_new_with_mnemonic ( _("Split By _Number of Points...") ); + g_signal_connect_swapped ( G_OBJECT(item), "activate", G_CALLBACK(trw_layer_split_by_n_points), pass_along ); + gtk_menu_shell_append ( GTK_MENU_SHELL(split_submenu), item ); + gtk_widget_show ( item ); + + item = gtk_menu_item_new_with_mnemonic ( _("Split at _Trackpoint") ); + g_signal_connect_swapped ( G_OBJECT(item), "activate", G_CALLBACK(trw_layer_split_at_trackpoint), pass_along ); + gtk_menu_shell_append ( GTK_MENU_SHELL(split_submenu), item ); + gtk_widget_show ( item ); + // Make it available only when a trackpoint is selected. + gtk_widget_set_sensitive ( item, (gboolean)GPOINTER_TO_INT(l->current_tpl) ); + + GtkWidget *insert_submenu = gtk_menu_new (); + item = gtk_image_menu_item_new_with_mnemonic ( _("_Insert Points") ); + gtk_image_menu_item_set_image ( (GtkImageMenuItem*)item, gtk_image_new_from_stock (GTK_STOCK_ADD, GTK_ICON_SIZE_MENU) ); + gtk_menu_shell_append (GTK_MENU_SHELL (menu), item); + gtk_widget_show ( item ); + gtk_menu_item_set_submenu (GTK_MENU_ITEM (item), insert_submenu ); + + item = gtk_menu_item_new_with_mnemonic ( _("Insert Point _Before Selected Point") ); + g_signal_connect_swapped ( G_OBJECT(item), "activate", G_CALLBACK(trw_layer_insert_point_before), pass_along ); + gtk_menu_shell_append ( GTK_MENU_SHELL(insert_submenu), item ); + gtk_widget_show ( item ); + // Make it available only when a point is selected + gtk_widget_set_sensitive ( item, (gboolean)GPOINTER_TO_INT(l->current_tpl) ); + + item = gtk_menu_item_new_with_mnemonic ( _("Insert Point _After Selected Point") ); + g_signal_connect_swapped ( G_OBJECT(item), "activate", G_CALLBACK(trw_layer_insert_point_after), pass_along ); + gtk_menu_shell_append ( GTK_MENU_SHELL(insert_submenu), item ); + gtk_widget_show ( item ); + // Make it available only when a point is selected + gtk_widget_set_sensitive ( item, (gboolean)GPOINTER_TO_INT(l->current_tpl) ); + + GtkWidget *delete_submenu; + delete_submenu = gtk_menu_new (); + item = gtk_image_menu_item_new_with_mnemonic ( _("Delete Poi_nts") ); + gtk_image_menu_item_set_image ( (GtkImageMenuItem*)item, gtk_image_new_from_stock (GTK_STOCK_DELETE, GTK_ICON_SIZE_MENU) ); + gtk_menu_shell_append (GTK_MENU_SHELL (menu), item); + gtk_widget_show ( item ); + gtk_menu_item_set_submenu (GTK_MENU_ITEM (item), delete_submenu ); + + item = gtk_image_menu_item_new_with_mnemonic ( _("Delete _Selected Point") ); + gtk_image_menu_item_set_image ( (GtkImageMenuItem*)item, gtk_image_new_from_stock (GTK_STOCK_DELETE, GTK_ICON_SIZE_MENU) ); + g_signal_connect_swapped ( G_OBJECT(item), "activate", G_CALLBACK(trw_layer_delete_point_selected), pass_along ); + gtk_menu_shell_append ( GTK_MENU_SHELL(delete_submenu), item ); + gtk_widget_show ( item ); + // Make it available only when a point is selected + gtk_widget_set_sensitive ( item, (gboolean)GPOINTER_TO_INT(l->current_tpl) ); + + item = gtk_menu_item_new_with_mnemonic ( _("Delete Points With The Same _Position") ); + g_signal_connect_swapped ( G_OBJECT(item), "activate", G_CALLBACK(trw_layer_delete_points_same_position), pass_along ); + gtk_menu_shell_append ( GTK_MENU_SHELL(delete_submenu), item ); + gtk_widget_show ( item ); + + item = gtk_menu_item_new_with_mnemonic ( _("Delete Points With The Same _Time") ); + g_signal_connect_swapped ( G_OBJECT(item), "activate", G_CALLBACK(trw_layer_delete_points_same_time), pass_along ); + gtk_menu_shell_append ( GTK_MENU_SHELL(delete_submenu), item ); + gtk_widget_show ( item ); + + GtkWidget *transform_submenu; + transform_submenu = gtk_menu_new (); + item = gtk_image_menu_item_new_with_mnemonic ( _("_Transform") ); + gtk_image_menu_item_set_image ( (GtkImageMenuItem*)item, gtk_image_new_from_stock (GTK_STOCK_CONVERT, GTK_ICON_SIZE_MENU) ); + gtk_menu_shell_append (GTK_MENU_SHELL (menu), item); + gtk_widget_show ( item ); + gtk_menu_item_set_submenu (GTK_MENU_ITEM (item), transform_submenu ); + + GtkWidget *dem_submenu; + dem_submenu = gtk_menu_new (); + item = gtk_image_menu_item_new_with_mnemonic ( _("_Apply DEM Data") ); + gtk_image_menu_item_set_image ( (GtkImageMenuItem*)item, gtk_image_new_from_stock ("vik-icon-DEM Download", GTK_ICON_SIZE_MENU) ); // Own icon - see stock_icons in vikwindow.c + gtk_menu_shell_append ( GTK_MENU_SHELL(transform_submenu), item ); + gtk_menu_item_set_submenu (GTK_MENU_ITEM (item), dem_submenu ); + + item = gtk_image_menu_item_new_with_mnemonic ( _("_Overwrite") ); + g_signal_connect_swapped ( G_OBJECT(item), "activate", G_CALLBACK(trw_layer_apply_dem_data_all), pass_along ); + gtk_menu_shell_append ( GTK_MENU_SHELL(dem_submenu), item ); + gtk_widget_set_tooltip_text (item, _("Overwrite any existing elevation values with DEM values")); + gtk_widget_show ( item ); + + item = gtk_image_menu_item_new_with_mnemonic ( _("_Keep Existing") ); + g_signal_connect_swapped ( G_OBJECT(item), "activate", G_CALLBACK(trw_layer_apply_dem_data_only_missing), pass_along ); + gtk_menu_shell_append ( GTK_MENU_SHELL(dem_submenu), item ); + gtk_widget_set_tooltip_text (item, _("Keep existing elevation values, only attempt for missing values")); + gtk_widget_show ( item ); + + GtkWidget *smooth_submenu; + smooth_submenu = gtk_menu_new (); + item = gtk_menu_item_new_with_mnemonic ( _("_Smooth Missing Elevation Data") ); + gtk_menu_shell_append ( GTK_MENU_SHELL(transform_submenu), item ); + gtk_widget_show ( item ); + gtk_menu_item_set_submenu (GTK_MENU_ITEM (item), smooth_submenu ); + + item = gtk_image_menu_item_new_with_mnemonic ( _("_Interpolated") ); + g_signal_connect_swapped ( G_OBJECT(item), "activate", G_CALLBACK(trw_layer_missing_elevation_data_interp), pass_along ); + gtk_menu_shell_append ( GTK_MENU_SHELL(smooth_submenu), item ); + gtk_widget_set_tooltip_text (item, _("Interpolate between known elevation values to derive values for the missing elevations")); + gtk_widget_show ( item ); + + item = gtk_image_menu_item_new_with_mnemonic ( _("_Flat") ); + g_signal_connect_swapped ( G_OBJECT(item), "activate", G_CALLBACK(trw_layer_missing_elevation_data_flat), pass_along ); + gtk_menu_shell_append ( GTK_MENU_SHELL(smooth_submenu), item ); + gtk_widget_set_tooltip_text (item, _("Set unknown elevation values to the last known value")); + gtk_widget_show ( item ); + + if ( subtype == VIK_TRW_LAYER_SUBLAYER_TRACK ) + item = gtk_image_menu_item_new_with_mnemonic ( _("C_onvert to a Route") ); + else + item = gtk_image_menu_item_new_with_mnemonic ( _("C_onvert to a Track") ); + gtk_image_menu_item_set_image ( (GtkImageMenuItem*)item, gtk_image_new_from_stock (GTK_STOCK_CONVERT, GTK_ICON_SIZE_MENU) ); + g_signal_connect_swapped ( G_OBJECT(item), "activate", G_CALLBACK(trw_layer_convert_track_route), pass_along ); + gtk_menu_shell_append ( GTK_MENU_SHELL(transform_submenu), item ); + gtk_widget_show ( item ); + + // Routes don't have timestamps - so these are only available for tracks + if ( subtype == VIK_TRW_LAYER_SUBLAYER_TRACK ) { + item = gtk_image_menu_item_new_with_mnemonic ( _("_Anonymize Times") ); + g_signal_connect_swapped ( G_OBJECT(item), "activate", G_CALLBACK(trw_layer_anonymize_times), pass_along ); + gtk_menu_shell_append ( GTK_MENU_SHELL(transform_submenu), item ); + gtk_widget_set_tooltip_text (item, _("Shift timestamps to a relative offset from 1901-01-01")); + gtk_widget_show ( item ); + + item = gtk_image_menu_item_new_with_mnemonic ( _("_Interpolate Times") ); + g_signal_connect_swapped ( G_OBJECT(item), "activate", G_CALLBACK(trw_layer_interpolate_times), pass_along ); + gtk_menu_shell_append ( GTK_MENU_SHELL(transform_submenu), item ); + gtk_widget_set_tooltip_text (item, _("Reset trackpoint timestamps between the first and last points such that track is traveled at equal speed")); + gtk_widget_show ( item ); + } + + if ( subtype == VIK_TRW_LAYER_SUBLAYER_TRACK ) + item = gtk_image_menu_item_new_with_mnemonic ( _("_Reverse Track") ); + else + item = gtk_image_menu_item_new_with_mnemonic ( _("_Reverse Route") ); + gtk_image_menu_item_set_image ( (GtkImageMenuItem*)item, gtk_image_new_from_stock (GTK_STOCK_GO_BACK, GTK_ICON_SIZE_MENU) ); + g_signal_connect_swapped ( G_OBJECT(item), "activate", G_CALLBACK(trw_layer_reverse), pass_along ); + gtk_menu_shell_append ( GTK_MENU_SHELL(menu), item ); + gtk_widget_show ( item ); + + if ( subtype == VIK_TRW_LAYER_SUBLAYER_ROUTE ) { + item = gtk_image_menu_item_new_with_mnemonic ( _("Refine Route...") ); + gtk_image_menu_item_set_image ( (GtkImageMenuItem*)item, gtk_image_new_from_stock (GTK_STOCK_FIND, GTK_ICON_SIZE_MENU) ); + g_signal_connect_swapped ( G_OBJECT(item), "activate", G_CALLBACK(trw_layer_route_refine), pass_along ); + gtk_menu_shell_append ( GTK_MENU_SHELL(menu), item ); + gtk_widget_show ( item ); + } + + /* ATM This function is only available via the layers panel, due to the method in finding out the maps in use */ + if ( vlp ) { + if ( subtype == VIK_TRW_LAYER_SUBLAYER_TRACK ) + item = gtk_image_menu_item_new_with_mnemonic ( _("Down_load Maps Along Track...") ); + else + item = gtk_image_menu_item_new_with_mnemonic ( _("Down_load Maps Along Route...") ); + gtk_image_menu_item_set_image ( (GtkImageMenuItem*)item, gtk_image_new_from_stock ("vik-icon-Maps Download", GTK_ICON_SIZE_MENU) ); // Own icon - see stock_icons in vikwindow.c + g_signal_connect_swapped ( G_OBJECT(item), "activate", G_CALLBACK(trw_layer_download_map_along_track_cb), pass_along ); + gtk_menu_shell_append ( GTK_MENU_SHELL(menu), item ); + gtk_widget_show ( item ); + } + + if ( subtype == VIK_TRW_LAYER_SUBLAYER_TRACK ) + item = gtk_image_menu_item_new_with_mnemonic ( _("_Export Track as GPX...") ); + else + item = gtk_image_menu_item_new_with_mnemonic ( _("_Export Route as GPX...") ); + gtk_image_menu_item_set_image ( (GtkImageMenuItem*)item, gtk_image_new_from_stock (GTK_STOCK_HARDDISK, GTK_ICON_SIZE_MENU) ); + g_signal_connect_swapped ( G_OBJECT(item), "activate", G_CALLBACK(trw_layer_export_gpx_track), pass_along ); + gtk_menu_shell_append ( GTK_MENU_SHELL(menu), item ); + gtk_widget_show ( item ); + + if ( subtype == VIK_TRW_LAYER_SUBLAYER_TRACK ) + item = gtk_image_menu_item_new_with_mnemonic ( _("E_xtend Track End") ); + else + item = gtk_image_menu_item_new_with_mnemonic ( _("E_xtend Route End") ); + gtk_image_menu_item_set_image ( (GtkImageMenuItem*)item, gtk_image_new_from_stock (GTK_STOCK_ADD, GTK_ICON_SIZE_MENU) ); + g_signal_connect_swapped ( G_OBJECT(item), "activate", G_CALLBACK(trw_layer_extend_track_end), pass_along ); + gtk_menu_shell_append ( GTK_MENU_SHELL(menu), item ); + gtk_widget_show ( item ); + + if ( subtype == VIK_TRW_LAYER_SUBLAYER_ROUTE ) { + item = gtk_image_menu_item_new_with_mnemonic ( _("Extend _Using Route Finder") ); + gtk_image_menu_item_set_image ( (GtkImageMenuItem*)item, gtk_image_new_from_stock ("vik-icon-Route Finder", GTK_ICON_SIZE_MENU) ); // Own icon - see stock_icons in vikwindow.c + g_signal_connect_swapped ( G_OBJECT(item), "activate", G_CALLBACK(trw_layer_extend_track_end_route_finder), pass_along ); + gtk_menu_shell_append ( GTK_MENU_SHELL(menu), item ); + gtk_widget_show ( item ); + } + + // ATM can't upload a single waypoint but can do waypoints to a GPS + if ( subtype != VIK_TRW_LAYER_SUBLAYER_WAYPOINT ) { + item = gtk_image_menu_item_new_with_mnemonic ( _("_Upload") ); + gtk_image_menu_item_set_image ( (GtkImageMenuItem*)item, gtk_image_new_from_stock (GTK_STOCK_GO_UP, GTK_ICON_SIZE_MENU) ); + gtk_menu_shell_append (GTK_MENU_SHELL (menu), item); + gtk_widget_show ( item ); + gtk_menu_item_set_submenu (GTK_MENU_ITEM (item), upload_submenu ); + + item = gtk_image_menu_item_new_with_mnemonic ( _("_Upload to GPS...") ); + gtk_image_menu_item_set_image ( (GtkImageMenuItem*)item, gtk_image_new_from_stock (GTK_STOCK_GO_FORWARD, GTK_ICON_SIZE_MENU) ); + g_signal_connect_swapped ( G_OBJECT(item), "activate", G_CALLBACK(trw_layer_gps_upload_any), pass_along ); + gtk_menu_shell_append ( GTK_MENU_SHELL(upload_submenu), item ); + gtk_widget_show ( item ); + } + } + + GtkWidget *external_submenu = create_external_submenu ( menu ); + + // These are only made available if a suitable program is installed + if ( (have_astro_program || have_diary_program) && + (subtype == VIK_TRW_LAYER_SUBLAYER_TRACK || subtype == VIK_TRW_LAYER_SUBLAYER_WAYPOINT) ) { + + if ( have_diary_program ) { + item = gtk_image_menu_item_new_with_mnemonic ( _("_Diary") ); + gtk_image_menu_item_set_image ( (GtkImageMenuItem*)item, gtk_image_new_from_stock (GTK_STOCK_SPELL_CHECK, GTK_ICON_SIZE_MENU) ); + g_signal_connect_swapped ( G_OBJECT(item), "activate", G_CALLBACK(trw_layer_diary), pass_along ); + gtk_menu_shell_append ( GTK_MENU_SHELL(external_submenu), item ); + gtk_widget_set_tooltip_text (item, _("Open diary program at this date")); + gtk_widget_show ( item ); + } + + if ( have_astro_program ) { + item = gtk_image_menu_item_new_with_mnemonic ( _("_Astronomy") ); + g_signal_connect_swapped ( G_OBJECT(item), "activate", G_CALLBACK(trw_layer_astro), pass_along ); + gtk_menu_shell_append ( GTK_MENU_SHELL(external_submenu), item ); + gtk_widget_set_tooltip_text (item, _("Open astronomy program at this date and location")); + gtk_widget_show ( item ); + } + } + + if ( l->current_tpl || l->current_wp ) { + // For the selected point + VikCoord *vc; + if ( l->current_tpl ) + vc = &(VIK_TRACKPOINT(l->current_tpl->data)->coord); + else + vc = &(l->current_wp->coord); + vik_ext_tools_add_menu_items_to_menu ( VIK_WINDOW(VIK_GTK_WINDOW_FROM_LAYER(l)), GTK_MENU (external_submenu), vc ); + } + else { + // Otherwise for the selected sublayer + // TODO: Should use selected items centre - rather than implicitly using the current viewport + vik_ext_tools_add_menu_items_to_menu ( VIK_WINDOW(VIK_GTK_WINDOW_FROM_LAYER(l)), GTK_MENU (external_submenu), NULL ); + } + + +#ifdef VIK_CONFIG_GOOGLE + if ( subtype == VIK_TRW_LAYER_SUBLAYER_ROUTE && is_valid_google_route ( l, sublayer ) ) + { + item = gtk_image_menu_item_new_with_mnemonic ( _("_View Google Directions") ); + gtk_image_menu_item_set_image ( (GtkImageMenuItem*)item, gtk_image_new_from_stock (GTK_STOCK_NETWORK, GTK_ICON_SIZE_MENU) ); + g_signal_connect_swapped ( G_OBJECT(item), "activate", G_CALLBACK(trw_layer_google_route_webpage), pass_along ); + gtk_menu_shell_append ( GTK_MENU_SHELL(menu), item ); + gtk_widget_show ( item ); + } +#endif + + // Some things aren't usable with routes + if ( subtype == VIK_TRW_LAYER_SUBLAYER_TRACK ) { +#ifdef VIK_CONFIG_OPENSTREETMAP + item = gtk_image_menu_item_new_with_mnemonic ( _("Upload to _OSM...") ); + // Convert internal pointer into track + pass_along[MA_MISC] = g_hash_table_lookup ( l->tracks, sublayer); + gtk_image_menu_item_set_image ( (GtkImageMenuItem*)item, gtk_image_new_from_stock (GTK_STOCK_GO_UP, GTK_ICON_SIZE_MENU) ); + g_signal_connect_swapped ( G_OBJECT(item), "activate", G_CALLBACK(trw_layer_osm_traces_upload_track_cb), pass_along ); + gtk_menu_shell_append ( GTK_MENU_SHELL(upload_submenu), item ); + gtk_widget_show ( item ); +#endif + + // Currently filter with functions all use shellcommands and thus don't work in Windows +#ifndef WINDOWS + item = gtk_image_menu_item_new_with_mnemonic ( _("Use with _Filter") ); + gtk_image_menu_item_set_image ( (GtkImageMenuItem*)item, gtk_image_new_from_stock (GTK_STOCK_INDEX, GTK_ICON_SIZE_MENU) ); + g_signal_connect_swapped ( G_OBJECT(item), "activate", G_CALLBACK(trw_layer_track_use_with_filter), pass_along ); + gtk_menu_shell_append ( GTK_MENU_SHELL(menu), item ); + gtk_widget_show ( item ); +#endif + + /* ATM This function is only available via the layers panel, due to needing a vlp */ + if ( vlp ) { + item = a_acquire_track_menu ( VIK_WINDOW(VIK_GTK_WINDOW_FROM_LAYER(l)), vlp, + vik_layers_panel_get_viewport(VIK_LAYERS_PANEL(vlp)), + g_hash_table_lookup ( l->tracks, (gchar *) sublayer ) ); + if ( item ) { + gtk_menu_shell_append (GTK_MENU_SHELL (menu), item); + gtk_widget_show ( item ); + } + } + +#ifdef VIK_CONFIG_GEOTAG + item = gtk_menu_item_new_with_mnemonic ( _("Geotag _Images...") ); + g_signal_connect_swapped ( G_OBJECT(item), "activate", G_CALLBACK(trw_layer_geotagging_track), pass_along ); + gtk_menu_shell_append (GTK_MENU_SHELL (menu), item); + gtk_widget_show ( item ); +#endif + } + + if ( subtype == VIK_TRW_LAYER_SUBLAYER_TRACK || subtype == VIK_TRW_LAYER_SUBLAYER_ROUTE ) { + // Only show on viewport popmenu when a trackpoint is selected + if ( ! vlp && l->current_tpl ) { + // Add separator + item = gtk_menu_item_new (); + gtk_menu_shell_append ( GTK_MENU_SHELL(menu), item ); + gtk_widget_show ( item ); + + item = gtk_image_menu_item_new_with_mnemonic ( _("_Edit Trackpoint") ); + gtk_image_menu_item_set_image ( (GtkImageMenuItem*)item, gtk_image_new_from_stock (GTK_STOCK_PROPERTIES, GTK_ICON_SIZE_MENU) ); + g_signal_connect_swapped ( G_OBJECT(item), "activate", G_CALLBACK(trw_layer_edit_trackpoint), pass_along ); + gtk_menu_shell_append ( GTK_MENU_SHELL(menu), item ); + gtk_widget_show ( item ); + } + } + + if ( subtype == VIK_TRW_LAYER_SUBLAYER_WAYPOINTS || subtype == VIK_TRW_LAYER_SUBLAYER_WAYPOINT ) { + GtkWidget *transform_submenu; + transform_submenu = gtk_menu_new (); + item = gtk_image_menu_item_new_with_mnemonic ( _("_Transform") ); + gtk_image_menu_item_set_image ( (GtkImageMenuItem*)item, gtk_image_new_from_stock (GTK_STOCK_CONVERT, GTK_ICON_SIZE_MENU) ); + gtk_menu_shell_append (GTK_MENU_SHELL (menu), item); + gtk_widget_show ( item ); + gtk_menu_item_set_submenu (GTK_MENU_ITEM (item), transform_submenu ); + + GtkWidget *dem_submenu; + dem_submenu = gtk_menu_new (); + item = gtk_image_menu_item_new_with_mnemonic ( _("_Apply DEM Data") ); + gtk_image_menu_item_set_image ( (GtkImageMenuItem*)item, gtk_image_new_from_stock ("vik-icon-DEM Download", GTK_ICON_SIZE_MENU) ); // Own icon - see stock_icons in vikwindow.c + gtk_menu_shell_append ( GTK_MENU_SHELL(transform_submenu), item ); + gtk_menu_item_set_submenu (GTK_MENU_ITEM (item), dem_submenu ); + + item = gtk_image_menu_item_new_with_mnemonic ( _("_Overwrite") ); + g_signal_connect_swapped ( G_OBJECT(item), "activate", G_CALLBACK(trw_layer_apply_dem_data_wpt_all), pass_along ); + gtk_menu_shell_append ( GTK_MENU_SHELL(dem_submenu), item ); + gtk_widget_set_tooltip_text (item, _("Overwrite any existing elevation values with DEM values")); + gtk_widget_show ( item ); + + item = gtk_image_menu_item_new_with_mnemonic ( _("_Keep Existing") ); + g_signal_connect_swapped ( G_OBJECT(item), "activate", G_CALLBACK(trw_layer_apply_dem_data_wpt_only_missing), pass_along ); + gtk_menu_shell_append ( GTK_MENU_SHELL(dem_submenu), item ); + gtk_widget_set_tooltip_text (item, _("Keep existing elevation values, only attempt for missing values")); + gtk_widget_show ( item ); + } + + gtk_widget_show_all ( GTK_WIDGET(menu) ); + + return rv; +} + +// TODO: Probably better to rework this track manipulation in viktrack.c +static void trw_layer_insert_tp_beside_current_tp ( VikTrwLayer *vtl, gboolean before ) +{ + // sanity check + if (!vtl->current_tpl) + return; + + VikTrackpoint *tp_current = VIK_TRACKPOINT(vtl->current_tpl->data); + VikTrackpoint *tp_other = NULL; + + if ( before ) { + if (!vtl->current_tpl->prev) + return; + tp_other = VIK_TRACKPOINT(vtl->current_tpl->prev->data); + } else { + if (!vtl->current_tpl->next) + return; + tp_other = VIK_TRACKPOINT(vtl->current_tpl->next->data); + } + + // Use current and other trackpoints to form a new track point which is inserted into the tracklist + if ( tp_other ) { + + VikTrackpoint *tp_new = vik_trackpoint_new(); + struct LatLon ll_current, ll_other; + vik_coord_to_latlon ( &tp_current->coord, &ll_current ); + vik_coord_to_latlon ( &tp_other->coord, &ll_other ); + + /* main positional interpolation */ + struct LatLon ll_new = { (ll_current.lat+ll_other.lat)/2, (ll_current.lon+ll_other.lon)/2 }; + vik_coord_load_from_latlon ( &(tp_new->coord), vtl->coord_mode, &ll_new ); + + /* Now other properties that can be interpolated */ + tp_new->altitude = (tp_current->altitude + tp_other->altitude) / 2; + + if (tp_current->has_timestamp && tp_other->has_timestamp) { + /* Note here the division is applied to each part, then added + This is to avoid potential overflow issues with a 32 time_t for dates after midpoint of this Unix time on 2004/01/04 */ + tp_new->timestamp = (tp_current->timestamp/2) + (tp_other->timestamp/2); + tp_new->has_timestamp = TRUE; + } + + if (tp_current->speed != NAN && tp_other->speed != NAN) + tp_new->speed = (tp_current->speed + tp_other->speed)/2; + + /* TODO - improve interpolation of course, as it may not be correct. + if courses in degrees are 350 + 020, the mid course more likely to be 005 (not 185) + [similar applies if value is in radians] */ + if (tp_current->course != NAN && tp_other->course != NAN) + tp_new->course = (tp_current->course + tp_other->course)/2; + + /* DOP / sat values remain at defaults as not they do not seem applicable to a dreamt up point */ + + // Insert new point into the appropriate trackpoint list, either before or after the current trackpoint as directed + VikTrack *trk = g_hash_table_lookup ( vtl->tracks, vtl->current_tp_id ); + if ( !trk ) + // Otherwise try routes + trk = g_hash_table_lookup ( vtl->routes, vtl->current_tp_id ); + if ( !trk ) + return; + + gint index = g_list_index ( trk->trackpoints, tp_current ); + if ( index > -1 ) { + if ( !before ) + index = index + 1; + // NB no recalculation of bounds since it is inserted between points + trk->trackpoints = g_list_insert ( trk->trackpoints, tp_new, index ); + } + } +} + +static void trw_layer_cancel_current_tp ( VikTrwLayer *vtl, gboolean destroy ) +{ + if ( vtl->tpwin ) + { + if ( destroy) + { + vik_trw_layer_tpwin_destroy ( vtl->tpwin ); + vtl->tpwin = NULL; + } + else + vik_trw_layer_tpwin_set_empty ( vtl->tpwin ); + } + if ( vtl->current_tpl ) + { + vtl->current_tpl = NULL; + vtl->current_tp_track = NULL; + vtl->current_tp_id = NULL; + vik_layer_emit_update(VIK_LAYER(vtl)); + } +} + +static void my_tpwin_set_tp ( VikTrwLayer *vtl ) +{ + VikTrack *trk = vtl->current_tp_track; + VikCoord vc; + // Notional center of a track is simply an average of the bounding box extremities + struct LatLon center = { (trk->bbox.north+trk->bbox.south)/2, (trk->bbox.east+trk->bbox.west)/2 }; + vik_coord_load_from_latlon ( &vc, vtl->coord_mode, ¢er ); + vik_trw_layer_tpwin_set_tp ( vtl->tpwin, vtl->current_tpl, trk->name, vtl->current_tp_track->is_route ); +} + +static void trw_layer_tpwin_response ( VikTrwLayer *vtl, gint response ) +{ + g_assert ( vtl->tpwin != NULL ); + if ( response == VIK_TRW_LAYER_TPWIN_CLOSE ) + trw_layer_cancel_current_tp ( vtl, TRUE ); + + if ( vtl->current_tpl == NULL ) + return; + + if ( response == VIK_TRW_LAYER_TPWIN_SPLIT && vtl->current_tpl->next && vtl->current_tpl->prev ) + { + trw_layer_split_at_selected_trackpoint ( vtl, vtl->current_tp_track->is_route ? VIK_TRW_LAYER_SUBLAYER_ROUTE : VIK_TRW_LAYER_SUBLAYER_TRACK ); + my_tpwin_set_tp ( vtl ); + } + else if ( response == VIK_TRW_LAYER_TPWIN_DELETE ) + { + VikTrack *tr = g_hash_table_lookup ( vtl->tracks, vtl->current_tp_id ); + if ( tr == NULL ) + tr = g_hash_table_lookup ( vtl->routes, vtl->current_tp_id ); + if ( tr == NULL ) + return; + + trw_layer_trackpoint_selected_delete ( vtl, tr ); + + if ( vtl->current_tpl ) + // Reset dialog with the available adjacent trackpoint + my_tpwin_set_tp ( vtl ); + + vik_layer_emit_update(VIK_LAYER(vtl)); + } + else if ( response == VIK_TRW_LAYER_TPWIN_FORWARD && vtl->current_tpl->next ) + { + if ( vtl->current_tp_track ) { + vtl->current_tpl = vtl->current_tpl->next; + my_tpwin_set_tp ( vtl ); + } + vik_layer_emit_update(VIK_LAYER(vtl)); /* TODO longone: either move or only update if tp is inside drawing window */ + } + else if ( response == VIK_TRW_LAYER_TPWIN_BACK && vtl->current_tpl->prev ) + { + if ( vtl->current_tp_track ) { + vtl->current_tpl = vtl->current_tpl->prev; + my_tpwin_set_tp ( vtl ); + } + vik_layer_emit_update(VIK_LAYER(vtl)); + } + else if ( response == VIK_TRW_LAYER_TPWIN_INSERT && vtl->current_tpl->next ) + { + trw_layer_insert_tp_beside_current_tp ( vtl, FALSE ); + vik_layer_emit_update(VIK_LAYER(vtl)); + } + else if ( response == VIK_TRW_LAYER_TPWIN_DATA_CHANGED ) + vik_layer_emit_update(VIK_LAYER(vtl)); +} + +/** + * trw_layer_dialog_shift: + * @vertical: The reposition strategy. If Vertical moves dialog vertically, otherwise moves it horizontally + * + * Try to reposition a dialog if it's over the specified coord + * so to not obscure the item of interest + */ +void trw_layer_dialog_shift ( VikTrwLayer *vtl, GtkWindow *dialog, VikCoord *coord, gboolean vertical ) +{ + GtkWindow *parent = VIK_GTK_WINDOW_FROM_LAYER(vtl); //i.e. the main window + + // Attempt force dialog to be shown so we can find out where it is more reliably... + while ( gtk_events_pending() ) + gtk_main_iteration (); + + // get parent window position & size + gint win_pos_x, win_pos_y; + gtk_window_get_position ( parent, &win_pos_x, &win_pos_y ); + + gint win_size_x, win_size_y; + gtk_window_get_size ( parent, &win_size_x, &win_size_y ); + + // get own dialog size + gint dia_size_x, dia_size_y; + gtk_window_get_size ( dialog, &dia_size_x, &dia_size_y ); + + // get own dialog position + gint dia_pos_x, dia_pos_y; + gtk_window_get_position ( dialog, &dia_pos_x, &dia_pos_y ); + + // Dialog not 'realized'/positioned - so can't really do any repositioning logic + if ( dia_pos_x > 2 && dia_pos_y > 2 ) { + + VikViewport *vvp = vik_window_viewport ( VIK_WINDOW(VIK_GTK_WINDOW_FROM_LAYER(vtl)) ); + + gint vp_xx, vp_yy; // In viewport pixels + vik_viewport_coord_to_screen ( vvp, coord, &vp_xx, &vp_yy ); + + // Work out the 'bounding box' in pixel terms of the dialog and only move it when over the position + + gint dest_x = 0; + gint dest_y = 0; + if ( gtk_widget_translate_coordinates ( GTK_WIDGET(vvp), GTK_WIDGET(parent), 0, 0, &dest_x, &dest_y ) ) { + + // Transform Viewport pixels into absolute pixels + gint tmp_xx = vp_xx + dest_x + win_pos_x - 10; + gint tmp_yy = vp_yy + dest_y + win_pos_y - 10; + + // Is dialog over the point (to within an ^^ edge value) + if ( (tmp_xx > dia_pos_x) && (tmp_xx < (dia_pos_x + dia_size_x)) && + (tmp_yy > dia_pos_y) && (tmp_yy < (dia_pos_y + dia_size_y)) ) { + + if ( vertical ) { + // Shift up<->down + gint hh = vik_viewport_get_height ( vvp ); + + // Consider the difference in viewport to the full window + gint offset_y = dest_y; + // Add difference between dialog and window sizes + offset_y += win_pos_y + (hh/2 - dia_size_y)/2; + + if ( vp_yy > hh/2 ) { + // Point in bottom half, move window to top half + gtk_window_move ( dialog, dia_pos_x, offset_y ); + } + else { + // Point in top half, move dialog down + gtk_window_move ( dialog, dia_pos_x, hh/2 + offset_y ); + } + } + else { + // Shift left<->right + gint ww = vik_viewport_get_width ( vvp ); + + // Consider the difference in viewport to the full window + gint offset_x = dest_x; + // Add difference between dialog and window sizes + offset_x += win_pos_x + (ww/2 - dia_size_x)/2; + + if ( vp_xx > ww/2 ) { + // Point on right, move window to left + gtk_window_move ( dialog, offset_x, dia_pos_y ); + } + else { + // Point on left, move right + gtk_window_move ( dialog, ww/2 + offset_x, dia_pos_y ); + } + } + } + } + } +} + +static void trw_layer_tpwin_init ( VikTrwLayer *vtl ) +{ + if ( ! vtl->tpwin ) + { + vtl->tpwin = vik_trw_layer_tpwin_new ( VIK_GTK_WINDOW_FROM_LAYER(vtl) ); + g_signal_connect_swapped ( GTK_DIALOG(vtl->tpwin), "response", G_CALLBACK(trw_layer_tpwin_response), vtl ); + /* connect signals -- DELETE SIGNAL VERY IMPORTANT TO SET TO NULL */ + g_signal_connect_swapped ( vtl->tpwin, "delete-event", G_CALLBACK(trw_layer_cancel_current_tp), vtl ); + + gtk_widget_show_all ( GTK_WIDGET(vtl->tpwin) ); + + if ( vtl->current_tpl ) { + // get tp pixel position + VikTrackpoint *tp = VIK_TRACKPOINT(vtl->current_tpl->data); + + // Shift up<->down to try not to obscure the trackpoint. + trw_layer_dialog_shift ( vtl, GTK_WINDOW(vtl->tpwin), &(tp->coord), TRUE ); + } + } + + if ( vtl->current_tpl ) + if ( vtl->current_tp_track ) + my_tpwin_set_tp ( vtl ); + /* set layer name and TP data */ +} + +/*************************************************************************** + ** Tool code + ***************************************************************************/ + +/*** Utility data structures and functions ****/ + +typedef struct { + gint x, y; + gint closest_x, closest_y; + gboolean draw_images; + gpointer closest_wp_id; + VikWaypoint *closest_wp; + VikViewport *vvp; +} WPSearchParams; + +typedef struct { + gint x, y; + gint closest_x, closest_y; + gpointer closest_track_id; + VikTrackpoint *closest_tp; + VikViewport *vvp; + GList *closest_tpl; + LatLonBBox bbox; +} TPSearchParams; + +static void waypoint_search_closest_tp ( gpointer id, VikWaypoint *wp, WPSearchParams *params ) +{ + gint x, y; + if ( !wp->visible ) + return; + + vik_viewport_coord_to_screen ( params->vvp, &(wp->coord), &x, &y ); + + // If waypoint has an image then use the image size to select + if ( params->draw_images && wp->image ) { + gint slackx, slacky; + slackx = wp->image_width / 2; + slacky = wp->image_height / 2; + + if ( x <= params->x + slackx && x >= params->x - slackx + && y <= params->y + slacky && y >= params->y - slacky ) { + params->closest_wp_id = id; + params->closest_wp = wp; + params->closest_x = x; + params->closest_y = y; + } + } + else if ( abs (x - params->x) <= WAYPOINT_SIZE_APPROX && abs (y - params->y) <= WAYPOINT_SIZE_APPROX && + ((!params->closest_wp) || /* was the old waypoint we already found closer than this one? */ + abs(x - params->x)+abs(y - params->y) < abs(x - params->closest_x)+abs(y - params->closest_y))) + { + params->closest_wp_id = id; + params->closest_wp = wp; + params->closest_x = x; + params->closest_y = y; + } +} + +static void track_search_closest_tp ( gpointer id, VikTrack *t, TPSearchParams *params ) +{ + GList *tpl = t->trackpoints; + VikTrackpoint *tp; + + if ( !t->visible ) + return; + + if ( ! BBOX_INTERSECT ( t->bbox, params->bbox ) ) + return; + + while (tpl) + { + gint x, y; + tp = VIK_TRACKPOINT(tpl->data); + + vik_viewport_coord_to_screen ( params->vvp, &(tp->coord), &x, &y ); + + if ( abs (x - params->x) <= TRACKPOINT_SIZE_APPROX && abs (y - params->y) <= TRACKPOINT_SIZE_APPROX && + ((!params->closest_tp) || /* was the old trackpoint we already found closer than this one? */ + abs(x - params->x)+abs(y - params->y) < abs(x - params->closest_x)+abs(y - params->closest_y))) + { + params->closest_track_id = id; + params->closest_tp = tp; + params->closest_tpl = tpl; + params->closest_x = x; + params->closest_y = y; + } + tpl = tpl->next; + } +} + +// ATM: Leave this as 'Track' only. +// Not overly bothered about having a snap to route trackpoint capability +static VikTrackpoint *closest_tp_in_five_pixel_interval ( VikTrwLayer *vtl, VikViewport *vvp, gint x, gint y ) +{ + TPSearchParams params; + params.x = x; + params.y = y; + params.vvp = vvp; + params.closest_track_id = NULL; + params.closest_tp = NULL; + params.bbox = vik_viewport_get_bbox ( params.vvp ); + g_hash_table_foreach ( vtl->tracks, (GHFunc) track_search_closest_tp, ¶ms); + return params.closest_tp; +} + +static VikWaypoint *closest_wp_in_five_pixel_interval ( VikTrwLayer *vtl, VikViewport *vvp, gint x, gint y ) +{ + WPSearchParams params; + params.x = x; + params.y = y; + params.vvp = vvp; + params.draw_images = vtl->drawimages; + params.closest_wp = NULL; + params.closest_wp_id = NULL; + g_hash_table_foreach ( vtl->waypoints, (GHFunc) waypoint_search_closest_tp, ¶ms); + return params.closest_wp; +} + + +// Some forward declarations +static void marker_begin_move ( tool_ed_t *t, gint x, gint y ); +static void marker_moveto ( tool_ed_t *t, gint x, gint y ); +static void marker_end_move ( tool_ed_t *t ); +// + +static gboolean trw_layer_select_move ( VikTrwLayer *vtl, GdkEventMotion *event, VikViewport *vvp, tool_ed_t* t ) +{ + if ( t->holding ) { + VikCoord new_coord; + vik_viewport_screen_to_coord ( vvp, event->x, event->y, &new_coord ); + + // Here always allow snapping back to the original location + // this is useful when one decides not to move the thing afterall + // If one wants to move the item only a little bit then don't hold down the 'snap' key! + + // snap to TP + if ( event->state & GDK_CONTROL_MASK ) + { + VikTrackpoint *tp = closest_tp_in_five_pixel_interval ( vtl, vvp, event->x, event->y ); + if ( tp ) + new_coord = tp->coord; + } + + // snap to WP + if ( event->state & GDK_SHIFT_MASK ) + { + VikWaypoint *wp = closest_wp_in_five_pixel_interval ( vtl, vvp, event->x, event->y ); + if ( wp ) + new_coord = wp->coord; + } + + gint x, y; + vik_viewport_coord_to_screen ( vvp, &new_coord, &x, &y ); + + marker_moveto ( t, x, y ); + + return TRUE; + } + return FALSE; +} + +static gboolean trw_layer_select_release ( VikTrwLayer *vtl, GdkEventButton *event, VikViewport *vvp, tool_ed_t* t ) +{ + if ( t->holding && event->button == 1 ) + { + // Prevent accidental (small) shifts when specific movement has not been requested + // (as the click release has occurred within the click object detection area) + if ( !t->moving ) + return FALSE; + + VikCoord new_coord; + vik_viewport_screen_to_coord ( vvp, event->x, event->y, &new_coord ); + + // snap to TP + if ( event->state & GDK_CONTROL_MASK ) + { + VikTrackpoint *tp = closest_tp_in_five_pixel_interval ( vtl, vvp, event->x, event->y ); + if ( tp ) + new_coord = tp->coord; + } + + // snap to WP + if ( event->state & GDK_SHIFT_MASK ) + { + VikWaypoint *wp = closest_wp_in_five_pixel_interval ( vtl, vvp, event->x, event->y ); + if ( wp ) + new_coord = wp->coord; + } + + marker_end_move ( t ); + + // Determine if working on a waypoint or a trackpoint + if ( t->is_waypoint ) { + // Update waypoint position + vtl->current_wp->coord = new_coord; + trw_layer_calculate_bounds_waypoints ( vtl ); + // Reset waypoint pointer + vtl->current_wp = NULL; + vtl->current_wp_id = NULL; + } + else { + if ( vtl->current_tpl ) { + VIK_TRACKPOINT(vtl->current_tpl->data)->coord = new_coord; + + if ( vtl->current_tp_track ) + vik_track_calculate_bounds ( vtl->current_tp_track ); + + if ( vtl->tpwin ) + if ( vtl->current_tp_track ) + my_tpwin_set_tp ( vtl ); + // NB don't reset the selected trackpoint, thus ensuring it's still in the tpwin + } + } + + vik_layer_emit_update ( VIK_LAYER(vtl) ); + return TRUE; + } + return FALSE; +} + +/* + Returns true if a waypoint or track is found near the requested event position for this particular layer + The item found is automatically selected + This is a tool like feature but routed via the layer interface, since it's instigated by a 'global' layer tool in vikwindow.c + */ +static gboolean trw_layer_select_click ( VikTrwLayer *vtl, GdkEventButton *event, VikViewport *vvp, tool_ed_t* tet ) +{ + if ( event->button != 1 ) + return FALSE; + + if (!vtl || vtl->vl.type != VIK_LAYER_TRW) + return FALSE; + + if ( !vtl->tracks_visible && !vtl->waypoints_visible && !vtl->routes_visible ) + return FALSE; + + LatLonBBox bbox = vik_viewport_get_bbox ( vvp ); + + // Go for waypoints first as these often will be near a track, but it's likely the wp is wanted rather then the track + + if ( vtl->waypoints_visible && BBOX_INTERSECT (vtl->waypoints_bbox, bbox ) ) { + WPSearchParams wp_params; + wp_params.vvp = vvp; + wp_params.x = event->x; + wp_params.y = event->y; + wp_params.draw_images = vtl->drawimages; + wp_params.closest_wp_id = NULL; + wp_params.closest_wp = NULL; + + g_hash_table_foreach ( vtl->waypoints, (GHFunc) waypoint_search_closest_tp, &wp_params); + + if ( wp_params.closest_wp ) { + + // Select + vik_treeview_select_iter ( VIK_LAYER(vtl)->vt, g_hash_table_lookup ( vtl->waypoints_iters, wp_params.closest_wp_id ), TRUE ); + + // Too easy to move it so must be holding shift to start immediately moving it + // or otherwise be previously selected but not have an image (otherwise clicking within image bounds (again) moves it) + if ( event->state & GDK_SHIFT_MASK || + ( vtl->current_wp == wp_params.closest_wp && !vtl->current_wp->image ) ) { + // Put into 'move buffer' + // NB vvp & vw already set in tet + tet->vtl = (gpointer)vtl; + tet->is_waypoint = TRUE; + + marker_begin_move (tet, event->x, event->y); + } + + vtl->current_wp = wp_params.closest_wp; + vtl->current_wp_id = wp_params.closest_wp_id; + + if ( event->type == GDK_2BUTTON_PRESS ) { + if ( vtl->current_wp->image ) { + menu_array_sublayer values; + values[MA_VTL] = vtl; + values[MA_MISC] = vtl->current_wp->image; + trw_layer_show_picture ( values ); + } + } + + vik_layer_emit_update ( VIK_LAYER(vtl) ); + + return TRUE; + } + } + + // Used for both track and route lists + TPSearchParams tp_params; + tp_params.vvp = vvp; + tp_params.x = event->x; + tp_params.y = event->y; + tp_params.closest_track_id = NULL; + tp_params.closest_tp = NULL; + tp_params.closest_tpl = NULL; + tp_params.bbox = bbox; + + if (vtl->tracks_visible) { + g_hash_table_foreach ( vtl->tracks, (GHFunc) track_search_closest_tp, &tp_params); + + if ( tp_params.closest_tp ) { + + // Always select + highlight the track + vik_treeview_select_iter ( VIK_LAYER(vtl)->vt, g_hash_table_lookup ( vtl->tracks_iters, tp_params.closest_track_id ), TRUE ); + + tet->is_waypoint = FALSE; + + // Select the Trackpoint + // Can move it immediately when control held or it's the previously selected tp + if ( event->state & GDK_CONTROL_MASK || + vtl->current_tpl == tp_params.closest_tpl ) { + // Put into 'move buffer' + // NB vvp & vw already set in tet + tet->vtl = (gpointer)vtl; + marker_begin_move (tet, event->x, event->y); + } + + vtl->current_tpl = tp_params.closest_tpl; + vtl->current_tp_id = tp_params.closest_track_id; + vtl->current_tp_track = g_hash_table_lookup ( vtl->tracks, tp_params.closest_track_id ); + + set_statusbar_msg_info_trkpt ( vtl, tp_params.closest_tp ); + + if ( vtl->tpwin ) + my_tpwin_set_tp ( vtl ); + + vik_layer_emit_update ( VIK_LAYER(vtl) ); + return TRUE; + } + } + + // Try again for routes + if (vtl->routes_visible) { + g_hash_table_foreach ( vtl->routes, (GHFunc) track_search_closest_tp, &tp_params); + + if ( tp_params.closest_tp ) { + + // Always select + highlight the track + vik_treeview_select_iter ( VIK_LAYER(vtl)->vt, g_hash_table_lookup ( vtl->routes_iters, tp_params.closest_track_id ), TRUE ); + + tet->is_waypoint = FALSE; + + // Select the Trackpoint + // Can move it immediately when control held or it's the previously selected tp + if ( event->state & GDK_CONTROL_MASK || + vtl->current_tpl == tp_params.closest_tpl ) { + // Put into 'move buffer' + // NB vvp & vw already set in tet + tet->vtl = (gpointer)vtl; + marker_begin_move (tet, event->x, event->y); + } + + vtl->current_tpl = tp_params.closest_tpl; + vtl->current_tp_id = tp_params.closest_track_id; + vtl->current_tp_track = g_hash_table_lookup ( vtl->routes, tp_params.closest_track_id ); + + set_statusbar_msg_info_trkpt ( vtl, tp_params.closest_tp ); + + if ( vtl->tpwin ) + my_tpwin_set_tp ( vtl ); + + vik_layer_emit_update ( VIK_LAYER(vtl) ); + return TRUE; + } + } + + /* these aren't the droids you're looking for */ + vtl->current_wp = NULL; + vtl->current_wp_id = NULL; + trw_layer_cancel_current_tp ( vtl, FALSE ); + + // Blank info + vik_statusbar_set_message ( vik_window_get_statusbar (VIK_WINDOW(VIK_GTK_WINDOW_FROM_LAYER(vtl))), VIK_STATUSBAR_INFO, "" ); + + return FALSE; +} + +static gboolean trw_layer_show_selected_viewport_menu ( VikTrwLayer *vtl, GdkEventButton *event, VikViewport *vvp ) +{ + if ( event->button != 3 ) + return FALSE; + + if (!vtl || vtl->vl.type != VIK_LAYER_TRW) + return FALSE; + + if ( !vtl->tracks_visible && !vtl->waypoints_visible && !vtl->routes_visible ) + return FALSE; + + /* Post menu for the currently selected item */ + + /* See if a track is selected */ + VikTrack *track = (VikTrack*)vik_window_get_selected_track ( (VikWindow *)VIK_GTK_WINDOW_FROM_LAYER(vtl) ); + if ( track && track->visible ) { + + if ( track->name ) { + + if ( vtl->track_right_click_menu ) + g_object_ref_sink ( G_OBJECT(vtl->track_right_click_menu) ); + + vtl->track_right_click_menu = GTK_MENU ( gtk_menu_new () ); + + trku_udata udataU; + udataU.trk = track; + udataU.uuid = NULL; + + gpointer trkf; + if ( track->is_route ) + trkf = g_hash_table_find ( vtl->routes, (GHRFunc) trw_layer_track_find_uuid, &udataU ); + else + trkf = g_hash_table_find ( vtl->tracks, (GHRFunc) trw_layer_track_find_uuid, &udataU ); + + if ( trkf && udataU.uuid ) { + + GtkTreeIter *iter; + if ( track->is_route ) + iter = g_hash_table_lookup ( vtl->routes_iters, udataU.uuid ); + else + iter = g_hash_table_lookup ( vtl->tracks_iters, udataU.uuid ); + + trw_layer_sublayer_add_menu_items ( vtl, + vtl->track_right_click_menu, + NULL, + track->is_route ? VIK_TRW_LAYER_SUBLAYER_ROUTE : VIK_TRW_LAYER_SUBLAYER_TRACK, + udataU.uuid, + iter, + vvp ); + } + + gtk_menu_popup ( vtl->track_right_click_menu, NULL, NULL, NULL, NULL, event->button, gtk_get_current_event_time() ); + + return TRUE; + } + } + + /* See if a waypoint is selected */ + VikWaypoint *waypoint = (VikWaypoint*)vik_window_get_selected_waypoint ( (VikWindow *)VIK_GTK_WINDOW_FROM_LAYER(vtl) ); + if ( waypoint && waypoint->visible ) { + if ( waypoint->name ) { + + if ( vtl->wp_right_click_menu ) + g_object_ref_sink ( G_OBJECT(vtl->wp_right_click_menu) ); + + vtl->wp_right_click_menu = GTK_MENU ( gtk_menu_new () ); + + wpu_udata udata; + udata.wp = waypoint; + udata.uuid = NULL; + + gpointer wpf = g_hash_table_find ( vtl->waypoints, (GHRFunc) trw_layer_waypoint_find_uuid, (gpointer) &udata ); + + if ( wpf && udata.uuid ) { + GtkTreeIter *iter = g_hash_table_lookup ( vtl->waypoints_iters, udata.uuid ); + + trw_layer_sublayer_add_menu_items ( vtl, + vtl->wp_right_click_menu, + NULL, + VIK_TRW_LAYER_SUBLAYER_WAYPOINT, + udata.uuid, + iter, + vvp ); + } + gtk_menu_popup ( vtl->wp_right_click_menu, NULL, NULL, NULL, NULL, event->button, gtk_get_current_event_time() ); + + return TRUE; + } + } + + return FALSE; +} + +/* background drawing hook, to be passed the viewport */ +static gboolean tool_sync_done = TRUE; + +static gboolean tool_sync(gpointer data) +{ + VikViewport *vvp = data; + vik_viewport_sync(vvp); + tool_sync_done = TRUE; + return FALSE; +} + +static void marker_begin_move ( tool_ed_t *t, gint x, gint y ) +{ + t->holding = TRUE; + t->gc = vik_viewport_new_gc (t->vvp, "black", 2); + gdk_gc_set_function ( t->gc, GDK_INVERT ); + vik_viewport_draw_rectangle ( t->vvp, t->gc, FALSE, x-3, y-3, 6, 6 ); + vik_viewport_sync(t->vvp); + t->oldx = x; + t->oldy = y; + t->moving = FALSE; +} + +static void marker_moveto ( tool_ed_t *t, gint x, gint y ) +{ + VikViewport *vvp = t->vvp; + vik_viewport_draw_rectangle ( vvp, t->gc, FALSE, t->oldx-3, t->oldy-3, 6, 6 ); + vik_viewport_draw_rectangle ( vvp, t->gc, FALSE, x-3, y-3, 6, 6 ); + t->oldx = x; + t->oldy = y; + t->moving = TRUE; + + if (tool_sync_done) { + g_idle_add_full (G_PRIORITY_HIGH_IDLE + 10, tool_sync, vvp, NULL); + tool_sync_done = FALSE; + } +} + +static void marker_end_move ( tool_ed_t *t ) +{ + vik_viewport_draw_rectangle ( t->vvp, t->gc, FALSE, t->oldx-3, t->oldy-3, 6, 6 ); + g_object_unref ( t->gc ); + t->holding = FALSE; + t->moving = FALSE; +} + +/*** Edit waypoint ****/ + +static gpointer tool_edit_waypoint_create ( VikWindow *vw, VikViewport *vvp) +{ + tool_ed_t *t = g_new0(tool_ed_t, 1); + t->vvp = vvp; + return t; +} + +static void tool_edit_waypoint_destroy ( tool_ed_t *t ) +{ + g_free ( t ); +} + +static gboolean tool_edit_waypoint_click ( VikTrwLayer *vtl, GdkEventButton *event, gpointer data ) +{ + WPSearchParams params; + tool_ed_t *t = data; + VikViewport *vvp = t->vvp; + + if (!vtl || vtl->vl.type != VIK_LAYER_TRW) + return FALSE; + + if ( t->holding ) { + return TRUE; + } + + if ( !vtl->vl.visible || !vtl->waypoints_visible ) + return FALSE; + + if ( vtl->current_wp && vtl->current_wp->visible ) + { + /* first check if current WP is within area (other may be 'closer', but we want to move the current) */ + gint x, y; + vik_viewport_coord_to_screen ( vvp, &(vtl->current_wp->coord), &x, &y ); + + if ( abs(x - (int)round(event->x)) <= WAYPOINT_SIZE_APPROX && + abs(y - (int)round(event->y)) <= WAYPOINT_SIZE_APPROX ) + { + if ( event->button == 3 ) + vtl->waypoint_rightclick = TRUE; /* remember that we're clicking; other layers will ignore release signal */ + else { + marker_begin_move(t, event->x, event->y); + } + return TRUE; + } + } + + params.vvp = vvp; + params.x = event->x; + params.y = event->y; + params.draw_images = vtl->drawimages; + params.closest_wp_id = NULL; + params.closest_wp = NULL; + g_hash_table_foreach ( vtl->waypoints, (GHFunc) waypoint_search_closest_tp, ¶ms); + if ( vtl->current_wp && (vtl->current_wp == params.closest_wp) ) + { + if ( event->button == 3 ) + vtl->waypoint_rightclick = TRUE; /* remember that we're clicking; other layers will ignore release signal */ + else + marker_begin_move(t, event->x, event->y); + return FALSE; + } + else if ( params.closest_wp ) + { + if ( event->button == 3 ) + vtl->waypoint_rightclick = TRUE; /* remember that we're clicking; other layers will ignore release signal */ + else + vtl->waypoint_rightclick = FALSE; + + vik_treeview_select_iter ( VIK_LAYER(vtl)->vt, g_hash_table_lookup ( vtl->waypoints_iters, params.closest_wp_id ), TRUE ); + + vtl->current_wp = params.closest_wp; + vtl->current_wp_id = params.closest_wp_id; + + /* could make it so don't update if old WP is off screen and new is null but oh well */ + vik_layer_emit_update ( VIK_LAYER(vtl) ); + return TRUE; + } + + vtl->current_wp = NULL; + vtl->current_wp_id = NULL; + vtl->waypoint_rightclick = FALSE; + vik_layer_emit_update ( VIK_LAYER(vtl) ); + return FALSE; +} + +static gboolean tool_edit_waypoint_move ( VikTrwLayer *vtl, GdkEventMotion *event, gpointer data ) +{ + tool_ed_t *t = data; + VikViewport *vvp = t->vvp; + + if (!vtl || vtl->vl.type != VIK_LAYER_TRW) + return FALSE; + + if ( t->holding ) { + VikCoord new_coord; + vik_viewport_screen_to_coord ( vvp, event->x, event->y, &new_coord ); + + /* snap to TP */ + if ( event->state & GDK_CONTROL_MASK ) + { + VikTrackpoint *tp = closest_tp_in_five_pixel_interval ( vtl, vvp, event->x, event->y ); + if ( tp ) + new_coord = tp->coord; + } + + /* snap to WP */ + if ( event->state & GDK_SHIFT_MASK ) + { + VikWaypoint *wp = closest_wp_in_five_pixel_interval ( vtl, vvp, event->x, event->y ); + if ( wp && wp != vtl->current_wp ) + new_coord = wp->coord; + } + + { + gint x, y; + vik_viewport_coord_to_screen ( vvp, &new_coord, &x, &y ); + + marker_moveto ( t, x, y ); + } + return TRUE; + } + return FALSE; +} + +static gboolean tool_edit_waypoint_release ( VikTrwLayer *vtl, GdkEventButton *event, gpointer data ) +{ + tool_ed_t *t = data; + VikViewport *vvp = t->vvp; + + if (!vtl || vtl->vl.type != VIK_LAYER_TRW) + return FALSE; + + if ( t->holding && event->button == 1 ) + { + VikCoord new_coord; + vik_viewport_screen_to_coord ( vvp, event->x, event->y, &new_coord ); + + /* snap to TP */ + if ( event->state & GDK_CONTROL_MASK ) + { + VikTrackpoint *tp = closest_tp_in_five_pixel_interval ( vtl, vvp, event->x, event->y ); + if ( tp ) + new_coord = tp->coord; + } + + /* snap to WP */ + if ( event->state & GDK_SHIFT_MASK ) + { + VikWaypoint *wp = closest_wp_in_five_pixel_interval ( vtl, vvp, event->x, event->y ); + if ( wp && wp != vtl->current_wp ) + new_coord = wp->coord; + } + + marker_end_move ( t ); + + vtl->current_wp->coord = new_coord; + + trw_layer_calculate_bounds_waypoints ( vtl ); + vik_layer_emit_update ( VIK_LAYER(vtl) ); + return TRUE; + } + /* PUT IN RIGHT PLACE!!! */ + if ( event->button == 3 && vtl->waypoint_rightclick ) + { + if ( vtl->wp_right_click_menu ) + g_object_ref_sink ( G_OBJECT(vtl->wp_right_click_menu) ); + if ( vtl->current_wp ) { + vtl->wp_right_click_menu = GTK_MENU ( gtk_menu_new () ); + trw_layer_sublayer_add_menu_items ( vtl, vtl->wp_right_click_menu, NULL, VIK_TRW_LAYER_SUBLAYER_WAYPOINT, vtl->current_wp_id, g_hash_table_lookup ( vtl->waypoints_iters, vtl->current_wp_id ), vvp ); + gtk_menu_popup ( vtl->wp_right_click_menu, NULL, NULL, NULL, NULL, event->button, gtk_get_current_event_time() ); + } + vtl->waypoint_rightclick = FALSE; + } + return FALSE; +} + +/*** Edit track or route (lots of common functionality) ****/ + +static gpointer tool_edit_track_create ( VikWindow *vw, VikViewport *vvp) +{ + return vvp; +} + +typedef struct { + VikTrwLayer *vtl; + GdkDrawable *drawable; + GdkGC *gc; + GdkPixmap *pixmap; +} draw_sync_t; + +/* + * Draw specified pixmap + */ +static gboolean draw_sync ( gpointer data ) +{ + draw_sync_t *ds = (draw_sync_t*) data; + // Sometimes don't want to draw + // normally because another update has taken precedent such as panning the display + // which means this pixmap is no longer valid + if ( ds->vtl->draw_sync_do ) { + gdk_draw_drawable (ds->drawable, + ds->gc, + ds->pixmap, + 0, 0, 0, 0, -1, -1); + ds->vtl->draw_sync_done = TRUE; + } + g_free ( ds ); + return FALSE; +} + +static gchar* distance_string (gdouble distance) +{ + gchar str[128]; + + /* draw label with distance */ + vik_units_distance_t dist_units = a_vik_get_units_distance (); + switch (dist_units) { + case VIK_UNITS_DISTANCE_MILES: + if (distance >= VIK_MILES_TO_METERS(1) && distance < VIK_MILES_TO_METERS(100)) { + g_sprintf(str, "%3.2f miles", VIK_METERS_TO_MILES(distance)); + } else if (distance < 1609.4) { + g_sprintf(str, "%d yards", (int)(distance*1.0936133)); + } else { + g_sprintf(str, "%d miles", (int)VIK_METERS_TO_MILES(distance)); + } + break; + case VIK_UNITS_DISTANCE_NAUTICAL_MILES: + if (distance >= VIK_NAUTICAL_MILES_TO_METERS(1) && distance < VIK_NAUTICAL_MILES_TO_METERS(100)) { + g_sprintf(str, "%3.2f NM", VIK_METERS_TO_NAUTICAL_MILES(distance)); + } else if (distance < VIK_NAUTICAL_MILES_TO_METERS(1)) { + g_sprintf(str, "%d yards", (int)(distance*1.0936133)); + } else { + g_sprintf(str, "%d NM", (int)VIK_METERS_TO_NAUTICAL_MILES(distance)); + } + break; + default: + // VIK_UNITS_DISTANCE_KILOMETRES + if (distance >= 1000 && distance < 100000) { + g_sprintf(str, "%3.2f km", distance/1000.0); + } else if (distance < 1000) { + g_sprintf(str, "%d m", (int)distance); + } else { + g_sprintf(str, "%d km", (int)distance/1000); + } + break; + } + return g_strdup (str); +} + +/* + * Actually set the message in statusbar + */ +static void statusbar_write (gdouble distance, gdouble elev_gain, gdouble elev_loss, gdouble last_step, gdouble angle, VikTrwLayer *vtl ) +{ + // Only show elevation data when track has some elevation properties + gchar str_gain_loss[64]; + str_gain_loss[0] = '\0'; + gchar str_last_step[64]; + str_last_step[0] = '\0'; + gchar *str_total = distance_string (distance); + + if ( (elev_gain > 0.1) || (elev_loss > 0.1) ) { + if ( a_vik_get_units_height () == VIK_UNITS_HEIGHT_METRES ) + g_sprintf(str_gain_loss, _(" - Gain %dm:Loss %dm"), (int)elev_gain, (int)elev_loss); + else + g_sprintf(str_gain_loss, _(" - Gain %dft:Loss %dft"), (int)VIK_METERS_TO_FEET(elev_gain), (int)VIK_METERS_TO_FEET(elev_loss)); + } + + if ( last_step > 0 ) { + gchar *tmp = distance_string (last_step); + g_sprintf(str_last_step, _(" - Bearing %3.1f° - Step %s"), RAD2DEG(angle), tmp); + g_free ( tmp ); + } + + VikWindow *vw = VIK_WINDOW(VIK_GTK_WINDOW_FROM_LAYER(vtl)); + + // Write with full gain/loss information + gchar *msg = g_strdup_printf ( "Total %s%s%s", str_total, str_last_step, str_gain_loss); + vik_statusbar_set_message ( vik_window_get_statusbar (vw), VIK_STATUSBAR_INFO, msg ); + g_free ( msg ); + g_free ( str_total ); +} + +/* + * Figure out what information should be set in the statusbar and then write it + */ +static void update_statusbar ( VikTrwLayer *vtl ) +{ + // Get elevation data + gdouble elev_gain, elev_loss; + vik_track_get_total_elevation_gain ( vtl->current_track, &elev_gain, &elev_loss); + + /* Find out actual distance of current track */ + gdouble distance = vik_track_get_length (vtl->current_track); + + statusbar_write (distance, elev_gain, elev_loss, 0, 0, vtl); +} + +// select a track point +static gboolean tool_select_tp ( VikTrwLayer *vtl, TPSearchParams *params, gboolean search_tracks, gboolean search_routes ) +{ + if ( vtl->tracks_visible && search_tracks ) + g_hash_table_foreach ( vtl->tracks, (GHFunc) track_search_closest_tp, params); + + if ( params->closest_tp ) + { + vik_treeview_select_iter ( VIK_LAYER(vtl)->vt, g_hash_table_lookup ( vtl->tracks_iters, params->closest_track_id ), TRUE ); + vtl->current_tpl = params->closest_tpl; + vtl->current_tp_id = params->closest_track_id; + vtl->current_tp_track = g_hash_table_lookup ( vtl->tracks, params->closest_track_id ); + set_statusbar_msg_info_trkpt ( vtl, params->closest_tp ); + vik_layer_emit_update ( VIK_LAYER(vtl) ); + return TRUE; + } + + if ( vtl->routes_visible && search_routes ) + g_hash_table_foreach ( vtl->routes, (GHFunc) track_search_closest_tp, params); + + if ( params->closest_tp ) + { + vik_treeview_select_iter ( VIK_LAYER(vtl)->vt, g_hash_table_lookup ( vtl->routes_iters, params->closest_track_id ), TRUE ); + vtl->current_tpl = params->closest_tpl; + vtl->current_tp_id = params->closest_track_id; + vtl->current_tp_track = g_hash_table_lookup ( vtl->routes, params->closest_track_id ); + set_statusbar_msg_info_trkpt ( vtl, params->closest_tp ); + vik_layer_emit_update ( VIK_LAYER(vtl) ); + return TRUE; + } + + return FALSE; +} + +// Select the given track in the tree view +static void tool_select_track ( VikTrwLayer *vtl, VikTrack *trk ) +{ + trku_udata udata; + udata.trk = trk; + udata.uuid = NULL; + + if ( trk->is_route ) + { + gpointer trkf = g_hash_table_find ( vtl->routes, (GHRFunc) trw_layer_track_find_uuid, &udata ); + if ( trkf && udata.uuid ) { + GtkTreeIter *it = g_hash_table_lookup ( vtl->routes_iters, udata.uuid ); + vik_treeview_select_iter ( VIK_LAYER(vtl)->vt, it, TRUE ); + } + } + else + { + gpointer trkf = g_hash_table_find ( vtl->tracks, (GHRFunc) trw_layer_track_find_uuid, &udata ); + if ( trkf && udata.uuid ) { + GtkTreeIter *it = g_hash_table_lookup ( vtl->tracks_iters, udata.uuid ); + vik_treeview_select_iter ( VIK_LAYER(vtl)->vt, it, TRUE ); + } + } +} + +// Add route to target to selected route, return TRUE on success +static gboolean tool_plot_route ( VikTrwLayer *vtl, VikCoord *target ) +{ + // make sure we have a route with at least one point to extend + if ( ! vtl->current_track || ! vtl->current_track->is_route || ! vik_track_get_tp_first ( vtl->current_track ) ) + return FALSE; + + struct LatLon start, end; + + VikTrackpoint *tp_start = vik_track_get_tp_last ( vtl->current_track ); + vik_coord_to_latlon ( &(tp_start->coord), &start ); + vik_coord_to_latlon ( target, &end ); + + vtl->route_finder_append = TRUE; // merge tracks. + + // update UI to let user know what's going on + VikStatusbar *sb = vik_window_get_statusbar (VIK_WINDOW(VIK_GTK_WINDOW_FROM_LAYER(vtl))); + VikRoutingEngine *engine = vik_routing_default_engine ( ); + if ( ! engine ) { + vik_statusbar_set_message ( sb, VIK_STATUSBAR_INFO, "Cannot plan route without a default routing engine." ); + return FALSE; + } + gchar *msg = g_strdup_printf ( _("Querying %s for route between (%.3f, %.3f) and (%.3f, %.3f)."), + vik_routing_engine_get_label ( engine ), + start.lat, start.lon, end.lat, end.lon ); + vik_statusbar_set_message ( sb, VIK_STATUSBAR_INFO, msg ); + g_free ( msg ); + vik_window_set_busy_cursor ( VIK_WINDOW(VIK_GTK_WINDOW_FROM_LAYER(vtl)) ); + + + /* Give GTK a change to display the new status bar before querying the web */ + while ( gtk_events_pending ( ) ) + gtk_main_iteration ( ); + + gboolean find_status = vik_routing_default_find ( vtl, start, end ); + + /* Update UI to say we're done */ + vik_window_clear_busy_cursor ( VIK_WINDOW(VIK_GTK_WINDOW_FROM_LAYER(vtl)) ); + msg = ( find_status ) ? g_strdup_printf ( _("%s returned route between (%.3f, %.3f) and (%.3f, %.3f)."), + vik_routing_engine_get_label ( engine ), + start.lat, start.lon, end.lat, end.lon ) + : g_strdup_printf ( _("Error getting route from %s."), + vik_routing_engine_get_label ( engine ) ); + vik_statusbar_set_message ( sb, VIK_STATUSBAR_INFO, msg ); + g_free ( msg ); + + return find_status; +} + + + + +static VikLayerToolFuncStatus tool_edit_track_move ( VikTrwLayer *vtl, GdkEventMotion *event, VikViewport *vvp ) +{ + /* if we haven't sync'ed yet, we don't have time to do more. */ + if ( vtl->draw_sync_done && vtl->current_track && vtl->current_track->trackpoints ) { + VikTrackpoint *last_tpt = vik_track_get_tp_last(vtl->current_track); + + static GdkPixmap *pixmap = NULL; + int w1, h1, w2, h2; + // Need to check in case window has been resized + w1 = vik_viewport_get_width(vvp); + h1 = vik_viewport_get_height(vvp); + if (!pixmap) { + pixmap = gdk_pixmap_new ( gtk_widget_get_window(GTK_WIDGET(vvp)), w1, h1, -1 ); + } + gdk_drawable_get_size (pixmap, &w2, &h2); + if (w1 != w2 || h1 != h2) { + g_object_unref ( G_OBJECT ( pixmap ) ); + pixmap = gdk_pixmap_new ( gtk_widget_get_window(GTK_WIDGET(vvp)), w1, h1, -1 ); + } + + // Reset to background + gdk_draw_drawable (pixmap, + vtl->current_track_newpoint_gc, + vik_viewport_get_pixmap(vvp), + 0, 0, 0, 0, -1, -1); + + draw_sync_t *passalong; + gint x1, y1; + + vik_viewport_coord_to_screen ( vvp, &(last_tpt->coord), &x1, &y1 ); + + // FOR SCREEN OVERLAYS WE MUST DRAW INTO THIS PIXMAP (when using the reset method) + // otherwise using vik_viewport_draw_* functions puts the data into the base pixmap, + // thus when we come to reset to the background it would include what we have already drawn!! + gdk_draw_line ( pixmap, + vtl->current_track_newpoint_gc, + x1, y1, event->x, event->y ); + // Using this reset method is more reliable than trying to undraw previous efforts via the GDK_INVERT method + + /* Find out actual distance of current track */ + gdouble distance = vik_track_get_length (vtl->current_track); + + // Now add distance to where the pointer is // + VikCoord coord; + struct LatLon ll; + vik_viewport_screen_to_coord ( vvp, (gint) event->x, (gint) event->y, &coord ); + vik_coord_to_latlon ( &coord, &ll ); + gdouble last_step = vik_coord_diff( &coord, &(last_tpt->coord)); + distance = distance + last_step; + + // Get elevation data + gdouble elev_gain, elev_loss; + vik_track_get_total_elevation_gain ( vtl->current_track, &elev_gain, &elev_loss); + + // Adjust elevation data (if available) for the current pointer position + gdouble elev_new; + elev_new = (gdouble) a_dems_get_elev_by_coord ( &coord, VIK_DEM_INTERPOL_BEST ); + if ( elev_new != VIK_DEM_INVALID_ELEVATION ) { + if ( last_tpt->altitude != VIK_DEFAULT_ALTITUDE ) { + // Adjust elevation of last track point + if ( elev_new > last_tpt->altitude ) + // Going up + elev_gain += elev_new - last_tpt->altitude; + else + // Going down + elev_loss += last_tpt->altitude - elev_new; + } + } + + // + // Display of the distance 'tooltip' during track creation is controlled by a preference + // + if ( a_vik_get_create_track_tooltip() ) { + + gchar *str = distance_string (distance); + + PangoLayout *pl = gtk_widget_create_pango_layout (GTK_WIDGET(vvp), NULL); + pango_layout_set_font_description (pl, gtk_widget_get_style(GTK_WIDGET(vvp))->font_desc); + pango_layout_set_text (pl, str, -1); + gint wd, hd; + pango_layout_get_pixel_size ( pl, &wd, &hd ); + + gint xd,yd; + // offset from cursor a bit depending on font size + xd = event->x + 10; + yd = event->y - hd; + + // Create a background block to make the text easier to read over the background map + GdkGC *background_block_gc = vik_viewport_new_gc ( vvp, "#cccccc", 1); + gdk_draw_rectangle (pixmap, background_block_gc, TRUE, xd-2, yd-2, wd+4, hd+2); + gdk_draw_layout (pixmap, vtl->current_track_newpoint_gc, xd, yd, pl); + + g_object_unref ( G_OBJECT ( pl ) ); + g_object_unref ( G_OBJECT ( background_block_gc ) ); + g_free (str); + } + + passalong = g_new0(draw_sync_t,1); // freed by draw_sync() + passalong->vtl = vtl; + passalong->pixmap = pixmap; + passalong->drawable = gtk_widget_get_window(GTK_WIDGET(vvp)); + passalong->gc = vtl->current_track_newpoint_gc; + + gdouble angle; + gdouble baseangle; + vik_viewport_compute_bearing ( vvp, x1, y1, event->x, event->y, &angle, &baseangle ); + + // Update statusbar with full gain/loss information + statusbar_write (distance, elev_gain, elev_loss, last_step, angle, vtl); + + // draw pixmap when we have time to + g_idle_add_full (G_PRIORITY_HIGH_IDLE + 10, draw_sync, passalong, NULL); + vtl->draw_sync_done = FALSE; + return VIK_LAYER_TOOL_ACK_GRAB_FOCUS; + } + return VIK_LAYER_TOOL_ACK; +} + +// NB vtl->current_track must be valid +static void undo_trackpoint_add ( VikTrwLayer *vtl ) +{ + // 'undo' + if ( vtl->current_track->trackpoints ) { + // TODO rework this... + //vik_trackpoint_free ( vik_track_get_tp_last (vtl->current_track) ); + GList *last = g_list_last(vtl->current_track->trackpoints); + g_free ( last->data ); + vtl->current_track->trackpoints = g_list_remove_link ( vtl->current_track->trackpoints, last ); + + vik_track_calculate_bounds ( vtl->current_track ); + } +} + +static gboolean tool_edit_track_key_press ( VikTrwLayer *vtl, GdkEventKey *event, VikViewport *vvp ) +{ + if ( vtl->current_track && event->keyval == GDK_Escape ) { + // Bin track if only one point as it's not very useful + if ( vik_track_get_tp_count(vtl->current_track) == 1 ) { + if ( vtl->current_track->is_route ) + vik_trw_layer_delete_route ( vtl, vtl->current_track ); + else + vik_trw_layer_delete_track ( vtl, vtl->current_track ); + } + vtl->current_track = NULL; + vik_layer_emit_update ( VIK_LAYER(vtl) ); + return TRUE; + } else if ( vtl->current_track && event->keyval == GDK_BackSpace ) { + undo_trackpoint_add ( vtl ); + update_statusbar ( vtl ); + vik_layer_emit_update ( VIK_LAYER(vtl) ); + return TRUE; + } else if ( event->keyval == GDK_Shift_L || event->keyval == GDK_Shift_R ) { + GdkWindow *gdkw = gtk_widget_get_window(GTK_WIDGET(vvp)); + gdk_window_set_cursor ( gdkw, vtl->crosshair_cursor ); + return TRUE; + } + + return FALSE; +} + +static gboolean tool_edit_track_key_release ( VikTrwLayer *vtl, GdkEventKey *event, VikViewport *vvp ) +{ + if ( event->keyval == GDK_Shift_L || event->keyval == GDK_Shift_R ) { + VikWindow *vw = VIK_WINDOW(VIK_GTK_WINDOW_FROM_LAYER(vtl)); + // this resets to standard tool cursor + vik_window_clear_busy_cursor ( vw ); + return TRUE; + } + return FALSE; +} + +/* + * Common function to handle trackpoint button requests on either a route or a track + * . enables adding a point via normal click + * . enables removal of last point via right click + * . finishing of the track or route via double clicking + */ +static gboolean tool_edit_track_or_route_click ( VikTrwLayer *vtl, GdkEventButton *event, VikViewport *vvp, gboolean newsegment ) +{ + VikTrackpoint *tp; + + if (!vtl || vtl->vl.type != VIK_LAYER_TRW) + return FALSE; + + if ( event->button == 2 ) { + // As the display is panning, the new track pixmap is now invalid so don't draw it + // otherwise this drawing done results in flickering back to an old image + vtl->draw_sync_do = FALSE; + return FALSE; + } + + if ( event->button == 3 ) + { + if ( !vtl->current_track ) + return FALSE; + undo_trackpoint_add ( vtl ); + update_statusbar ( vtl ); + vik_layer_emit_update ( VIK_LAYER(vtl) ); + return TRUE; + } + + if ( event->type == GDK_2BUTTON_PRESS ) + { + /* subtract last (duplicate from double click) tp then end */ + if ( vtl->current_track && vtl->current_track->trackpoints && vtl->ct_x1 == vtl->ct_x2 && vtl->ct_y1 == vtl->ct_y2 ) + { + /* undo last, then end */ + undo_trackpoint_add ( vtl ); + vtl->current_track = NULL; + } + vik_layer_emit_update ( VIK_LAYER(vtl) ); + return TRUE; + } + + tp = vik_trackpoint_new(); + vik_viewport_screen_to_coord ( vvp, event->x, event->y, &(tp->coord) ); + + /* snap to other TP */ + if ( event->state & GDK_CONTROL_MASK ) + { + VikTrackpoint *other_tp = closest_tp_in_five_pixel_interval ( vtl, vvp, event->x, event->y ); + if ( other_tp ) + tp->coord = other_tp->coord; + } + + tp->newsegment = newsegment; + tp->has_timestamp = FALSE; + tp->timestamp = 0; + + if ( vtl->current_track ) { + vik_track_add_trackpoint ( vtl->current_track, tp, TRUE ); // Ensure bounds is updated + /* Auto attempt to get elevation from DEM data (if it's available) */ + vik_track_apply_dem_data_last_trackpoint ( vtl->current_track ); + } + + vtl->ct_x1 = vtl->ct_x2; + vtl->ct_y1 = vtl->ct_y2; + vtl->ct_x2 = event->x; + vtl->ct_y2 = event->y; + + vik_layer_emit_update ( VIK_LAYER(vtl) ); + return TRUE; +} + +static gboolean tool_edit_track_new ( VikTrwLayer *vtl, GdkEventButton *event, VikViewport *vvp ) +{ + gboolean newsegment = FALSE; + // ----------------------------------------------------- if current is a route - switch to new track + if ( event->button == 1 && ( ! vtl->current_track || (vtl->current_track && vtl->current_track->is_route ) )) + { + gchar *name = trw_layer_new_unique_sublayer_name(vtl, VIK_TRW_LAYER_SUBLAYER_TRACK, _("Track")); + if ( a_vik_get_ask_for_create_track_name() ) { + gchar *newname = a_dialog_new_track ( VIK_GTK_WINDOW_FROM_LAYER(vtl), name, FALSE ); + if ( !newname ) { + g_free ( name ); + return FALSE; + } + name = newname; + } + edit_track_create_common ( vtl, name ); + g_free ( name ); + newsegment = TRUE; + } + return tool_edit_track_or_route_click ( vtl, event, vvp, newsegment ); +} + +static gboolean tool_edit_track_or_route_split ( VikTrwLayer *vtl, TPSearchParams *params, gboolean is_track ) +{ + if ( tool_select_tp ( vtl, params, is_track, ! is_track ) ) + { + VikTrack *origin_tp_track = vtl->current_tp_track; + + trw_layer_split_at_selected_trackpoint ( vtl, is_track ? VIK_TRW_LAYER_SUBLAYER_TRACK : VIK_TRW_LAYER_SUBLAYER_ROUTE ); + + vtl->current_track = origin_tp_track; + vtl->current_tpl = NULL; + vtl->current_tp_track = NULL; + vtl->current_tp_id = NULL; + + vik_layer_emit_update(VIK_LAYER(vtl)); + return TRUE; + } + return FALSE; +} + +// attempt to join to a track/route +// plot a route to join if in route finder tool +static gboolean tool_edit_track_or_route_join ( VikTrwLayer *vtl, TPSearchParams *params, gboolean in_route_finder ) +{ + if ( vtl->current_track == NULL ) + return FALSE; + + VikTrack *origin_track = vtl->current_track; + gboolean is_route = origin_track->is_route; + + if ( tool_select_tp ( vtl, params, ! is_route, is_route ) ) + { + // don't join to self + if ( vtl->current_tp_track == origin_track ) + return FALSE; + + if ( in_route_finder ) + { + VikCoord *target = &(VIK_TRACKPOINT(vtl->current_tpl->data)->coord); + if ( ! tool_plot_route ( vtl, target ) ) + return FALSE; + } + + trw_layer_split_at_selected_trackpoint ( vtl, is_route ? VIK_TRW_LAYER_SUBLAYER_ROUTE : VIK_TRW_LAYER_SUBLAYER_TRACK ); + vik_track_steal_and_append_trackpoints ( origin_track, vtl->current_tp_track ); + VIK_TRACKPOINT(vtl->current_tpl->data)->newsegment = FALSE; + + if ( is_route ) + vik_trw_layer_delete_route ( vtl, vtl->current_tp_track ); + else + vik_trw_layer_delete_track ( vtl, vtl->current_tp_track ); + + // Leave newly joined track selected + tool_select_track ( vtl, origin_track ); + vtl->current_tpl = NULL; + vtl->current_tp_track = NULL; + vtl->current_tp_id = NULL; + + vik_layer_emit_update( VIK_LAYER(vtl) ); + return TRUE; + } + return FALSE; +} + +static gboolean tool_edit_route_new ( VikTrwLayer *vtl, GdkEventButton *event, VikViewport *vvp ) +{ + gboolean newsegment = FALSE; + + // -------------------------- if current is a track - switch to new route, + if ( event->button == 1 && ( ! vtl->current_track || + (vtl->current_track && !vtl->current_track->is_route ) ) ) + { + gchar *name = trw_layer_new_unique_sublayer_name(vtl, VIK_TRW_LAYER_SUBLAYER_ROUTE, _("Route")); + if ( a_vik_get_ask_for_create_track_name() ) { + gchar *newname = a_dialog_new_track ( VIK_GTK_WINDOW_FROM_LAYER(vtl), name, TRUE ); + if ( !newname ) { + g_free ( name ); + return FALSE; + } + name = newname; + } + edit_route_create_common ( vtl, name ); + g_free ( name ); + newsegment = TRUE; + } + return tool_edit_track_or_route_click ( vtl, event, vvp, newsegment ); +} + +// Try the following: +// If not editing a track +// If click is on an existing trackpoint, +// split the track and continue editing from trackpoint +// Else create new tracka +// Else +// Try to join existing track +// If not, create new track point +static gboolean tool_edit_track_or_route_click_dispatch ( VikTrwLayer *vtl, GdkEventButton *event, VikViewport *vvp, gboolean is_track ) +{ + if ( event->button != 1 ) + return tool_edit_track_or_route_click ( vtl, event, vvp, FALSE ); + + TPSearchParams params; + params.vvp = vvp; + params.x = event->x; + params.y = event->y; + params.closest_track_id = NULL; + params.closest_tp = NULL; + params.closest_tpl = NULL; + params.bbox = vik_viewport_get_bbox ( vvp ); + + // if we're not already editing a track/route + // (is_track == is_route means we want a track, but have a route, or vice versa) + if ( ! vtl->current_track || (vtl->current_track && vtl->current_track->is_route == is_track ) ) + { + // attach to existing if shift pressed + if ( event->state & GDK_SHIFT_MASK ) + return tool_edit_track_or_route_split ( vtl, ¶ms, is_track ); + + // else, new track or route + if ( is_track ) + return tool_edit_track_new ( vtl, event, vvp ); + else + return tool_edit_route_new ( vtl, event, vvp ); + } + else + { + // try to join existing if shift pressed + if ( event->state & GDK_SHIFT_MASK ) + return tool_edit_track_or_route_join ( vtl, ¶ms, FALSE ); + else + return tool_edit_track_or_route_click ( vtl, event, vvp, FALSE ); + } +} + +static gboolean tool_edit_track_click ( VikTrwLayer *vtl, GdkEventButton *event, VikViewport *vvp ) +{ + return tool_edit_track_or_route_click_dispatch ( vtl, event, vvp, TRUE ); +} + +static void tool_edit_track_release ( VikTrwLayer *vtl, GdkEventButton *event, VikViewport *vvp ) +{ + if ( event->button == 2 ) { + // Pan moving ended - enable potential point drawing again + vtl->draw_sync_do = TRUE; + vtl->draw_sync_done = TRUE; + } +} + +static gpointer tool_edit_route_create ( VikWindow *vw, VikViewport *vvp) +{ + return vvp; +} + +static gboolean tool_edit_route_click ( VikTrwLayer *vtl, GdkEventButton *event, VikViewport *vvp ) +{ + return tool_edit_track_or_route_click_dispatch ( vtl, event, vvp, FALSE ); +} + +/*** New waypoint ****/ + +static gpointer tool_new_waypoint_create ( VikWindow *vw, VikViewport *vvp) +{ + return vvp; +} + +static gboolean tool_new_waypoint_click ( VikTrwLayer *vtl, GdkEventButton *event, VikViewport *vvp ) +{ + VikCoord coord; + if (!vtl || vtl->vl.type != VIK_LAYER_TRW) + return FALSE; + vik_viewport_screen_to_coord ( vvp, event->x, event->y, &coord ); + if ( vik_trw_layer_new_waypoint (vtl, VIK_GTK_WINDOW_FROM_LAYER(vtl), &coord) ) { + trw_layer_calculate_bounds_waypoints ( vtl ); + if ( VIK_LAYER(vtl)->visible ) + vik_layer_emit_update ( VIK_LAYER(vtl) ); + } + return TRUE; +} + + +/*** Edit trackpoint ****/ + +static gpointer tool_edit_trackpoint_create ( VikWindow *vw, VikViewport *vvp) +{ + tool_ed_t *t = g_new0(tool_ed_t, 1); + t->vvp = vvp; + return t; +} + +static void tool_edit_trackpoint_destroy ( tool_ed_t *t ) +{ + g_free ( t ); +} + +/** + * tool_edit_trackpoint_click: + * + * On 'initial' click: search for the nearest trackpoint or routepoint and store it as the current trackpoint + * Then update the viewport, statusbar and edit dialog to draw the point as being selected and it's information. + * On subsequent clicks: (as the current trackpoint is defined) and the click is very near the same point + * then initiate the move operation to drag the point to a new destination. + * NB The current trackpoint will get reset elsewhere. + */ +static gboolean tool_edit_trackpoint_click ( VikTrwLayer *vtl, GdkEventButton *event, gpointer data ) +{ + tool_ed_t *t = data; + VikViewport *vvp = t->vvp; + TPSearchParams params; + params.vvp = vvp; + params.x = event->x; + params.y = event->y; + params.closest_track_id = NULL; + params.closest_tp = NULL; + params.closest_tpl = NULL; + params.bbox = vik_viewport_get_bbox ( vvp ); + + if ( event->button != 1 ) + return FALSE; + + if (!vtl || vtl->vl.type != VIK_LAYER_TRW) + return FALSE; + + if ( !vtl->vl.visible || !(vtl->tracks_visible || vtl->routes_visible) ) + return FALSE; + + if ( vtl->current_tpl ) + { + /* first check if it is within range of prev. tp. and if current_tp track is shown. (if it is, we are moving that trackpoint.) */ + VikTrackpoint *tp = VIK_TRACKPOINT(vtl->current_tpl->data); + VikTrack *current_tr = VIK_TRACK(g_hash_table_lookup(vtl->tracks, vtl->current_tp_id)); + if ( !current_tr ) + current_tr = VIK_TRACK(g_hash_table_lookup(vtl->routes, vtl->current_tp_id)); + if ( !current_tr ) + return FALSE; + + gint x, y; + vik_viewport_coord_to_screen ( vvp, &(tp->coord), &x, &y ); + + if ( current_tr->visible && + abs(x - (int)round(event->x)) < TRACKPOINT_SIZE_APPROX && + abs(y - (int)round(event->y)) < TRACKPOINT_SIZE_APPROX ) { + marker_begin_move ( t, event->x, event->y ); + return TRUE; + } + + } + + if ( tool_select_tp ( vtl, ¶ms, TRUE, TRUE ) ) + { + trw_layer_tpwin_init ( vtl ); + return TRUE; + } + + /* these aren't the droids you're looking for */ + return FALSE; +} + +static gboolean tool_edit_trackpoint_move ( VikTrwLayer *vtl, GdkEventMotion *event, gpointer data ) +{ + tool_ed_t *t = data; + VikViewport *vvp = t->vvp; + + if (!vtl || vtl->vl.type != VIK_LAYER_TRW) + return FALSE; + + if ( t->holding ) + { + VikCoord new_coord; + vik_viewport_screen_to_coord ( vvp, event->x, event->y, &new_coord ); + + /* snap to TP */ + if ( event->state & GDK_CONTROL_MASK ) + { + VikTrackpoint *tp = closest_tp_in_five_pixel_interval ( vtl, vvp, event->x, event->y ); + if ( tp && tp != vtl->current_tpl->data ) + new_coord = tp->coord; + } + // VIK_TRACKPOINT(vtl->current_tpl->data)->coord = new_coord; + { + gint x, y; + vik_viewport_coord_to_screen ( vvp, &new_coord, &x, &y ); + marker_moveto ( t, x, y ); + } + + return TRUE; + } + return FALSE; +} + +static gboolean tool_edit_trackpoint_release ( VikTrwLayer *vtl, GdkEventButton *event, gpointer data ) +{ + tool_ed_t *t = data; + VikViewport *vvp = t->vvp; + + if (!vtl || vtl->vl.type != VIK_LAYER_TRW) + return FALSE; + if ( event->button != 1) + return FALSE; + + if ( t->holding ) { + VikCoord new_coord; + vik_viewport_screen_to_coord ( vvp, event->x, event->y, &new_coord ); + + /* snap to TP */ + if ( event->state & GDK_CONTROL_MASK ) + { + VikTrackpoint *tp = closest_tp_in_five_pixel_interval ( vtl, vvp, event->x, event->y ); + if ( tp && tp != vtl->current_tpl->data ) + new_coord = tp->coord; + } + + VIK_TRACKPOINT(vtl->current_tpl->data)->coord = new_coord; + if ( vtl->current_tp_track ) + vik_track_calculate_bounds ( vtl->current_tp_track ); + + marker_end_move ( t ); + + /* diff dist is diff from orig */ + if ( vtl->tpwin ) + if ( vtl->current_tp_track ) + my_tpwin_set_tp ( vtl ); + + vik_layer_emit_update ( VIK_LAYER(vtl) ); + return TRUE; + } + return FALSE; +} + + +/*** Extended Route Finder ***/ + +static gpointer tool_extended_route_finder_create ( VikWindow *vw, VikViewport *vvp) +{ + return vvp; +} + +static void tool_extended_route_finder_undo ( VikTrwLayer *vtl ) +{ + VikCoord *new_end; + new_end = vik_track_cut_back_to_double_point ( vtl->current_track ); + if ( new_end ) { + g_free ( new_end ); + vik_layer_emit_update ( VIK_LAYER(vtl) ); + + /* remove last ' to:...' */ + if ( vtl->current_track->comment ) { + gchar *last_to = strrchr ( vtl->current_track->comment, 't' ); + if ( last_to && (last_to - vtl->current_track->comment > 1) ) { + gchar *new_comment = g_strndup ( vtl->current_track->comment, + last_to - vtl->current_track->comment - 1); + vik_track_set_comment_no_copy ( vtl->current_track, new_comment ); + } + } + } +} + +static gboolean tool_extended_route_finder_click ( VikTrwLayer *vtl, GdkEventButton *event, VikViewport *vvp ) +{ + if ( !vtl ) return FALSE; + if ( event->button == 3 && vtl->current_track ) { + tool_extended_route_finder_undo ( vtl ); + } + else if ( event->button == 2 ) { + vtl->draw_sync_do = FALSE; + return FALSE; + } + // if we started the track but via undo deleted all the track points, begin again + else if ( vtl->current_track && vtl->current_track->is_route && ! vik_track_get_tp_first ( vtl->current_track ) ) { + return tool_edit_track_or_route_click ( vtl, event, vvp, TRUE ); + } + else if ( ( vtl->current_track && vtl->current_track->is_route ) ) { + if ( event->state & GDK_SHIFT_MASK ) + { + TPSearchParams params; + params.vvp = vvp; + params.x = event->x; + params.y = event->y; + params.closest_track_id = NULL; + params.closest_tp = NULL; + params.closest_tpl = NULL; + params.bbox = vik_viewport_get_bbox ( vvp ); + + tool_edit_track_or_route_join ( vtl, ¶ms, TRUE ); + } + else + { + VikCoord tmp; + vik_viewport_screen_to_coord ( vvp, event->x, event->y, &tmp ); + tool_plot_route ( vtl, &tmp ); + vik_layer_emit_update ( VIK_LAYER(vtl) ); + } + } else { + vtl->current_track = NULL; + + // create a new route where we will add the planned route to + gboolean ret = tool_edit_route_click( vtl, event, vvp ); + + return ret; + } + return TRUE; +} + +static gboolean tool_extended_route_finder_key_press ( VikTrwLayer *vtl, GdkEventKey *event, VikViewport *vvp ) +{ + if ( vtl->current_track && event->keyval == GDK_Escape ) { + vtl->current_track = NULL; + vik_layer_emit_update ( VIK_LAYER(vtl) ); + return TRUE; + } else if ( vtl->current_track && event->keyval == GDK_BackSpace ) { + tool_extended_route_finder_undo ( vtl ); + return TRUE; + } else if ( event->keyval == GDK_Shift_L || event->keyval == GDK_Shift_R ) { + GdkWindow *gdkw = gtk_widget_get_window(GTK_WIDGET(vvp)); + gdk_window_set_cursor ( gdkw, vtl->crosshair_cursor ); + return TRUE; + } + + return FALSE; +} + + + +/*** Show picture ****/ + +static gpointer tool_show_picture_create ( VikWindow *vw, VikViewport *vvp) +{ + return vvp; +} + +/* Params are: vvp, event, last match found or NULL */ +static void tool_show_picture_wp ( const gpointer id, VikWaypoint *wp, gpointer params[3] ) +{ + if ( wp->image && wp->visible ) + { + gint x, y, slackx, slacky; + GdkEventButton *event = (GdkEventButton *) params[1]; + + vik_viewport_coord_to_screen ( VIK_VIEWPORT(params[0]), &(wp->coord), &x, &y ); + slackx = wp->image_width / 2; + slacky = wp->image_height / 2; + if ( x <= event->x + slackx && x >= event->x - slackx + && y <= event->y + slacky && y >= event->y - slacky ) + { + params[2] = wp->image; /* we've found a match. however continue searching + * since we want to find the last match -- that + * is, the match that was drawn last. */ + } + } +} + +static void trw_layer_show_picture ( menu_array_sublayer values ) +{ + /* thanks to the Gaim people for showing me ShellExecute and g_spawn_command_line_async */ +#ifdef WINDOWS + ShellExecute(NULL, "open", (char *) values[MA_MISC], NULL, NULL, SW_SHOWNORMAL); +#else /* WINDOWS */ + GError *err = NULL; + gchar *quoted_file = g_shell_quote ( (gchar *) values[MA_MISC] ); + gchar *cmd = g_strdup_printf ( "%s %s", a_vik_get_image_viewer(), quoted_file ); + g_free ( quoted_file ); + if ( ! g_spawn_command_line_async ( cmd, &err ) ) + { + a_dialog_error_msg_extra ( VIK_GTK_WINDOW_FROM_LAYER(values[MA_VTL]), _("Could not launch %s to open file."), a_vik_get_image_viewer() ); + g_error_free ( err ); + } + g_free ( cmd ); +#endif /* WINDOWS */ +} + +static gboolean tool_show_picture_click ( VikTrwLayer *vtl, GdkEventButton *event, VikViewport *vvp ) +{ + gpointer params[3] = { vvp, event, NULL }; + if (!vtl || vtl->vl.type != VIK_LAYER_TRW) + return FALSE; + g_hash_table_foreach ( vtl->waypoints, (GHFunc) tool_show_picture_wp, params ); + if ( params[2] ) + { + static menu_array_sublayer values; + values[MA_VTL] = vtl; + values[MA_MISC] = params[2]; + trw_layer_show_picture ( values ); + return TRUE; /* found a match */ + } + else + return FALSE; /* go through other layers, searching for a match */ +} + +/*************************************************************************** + ** End tool code + ***************************************************************************/ + + +static void image_wp_make_list ( const gpointer id, VikWaypoint *wp, GSList **pics ) +{ + if ( wp->image && ( ! a_thumbnails_exists ( wp->image ) ) ) + *pics = g_slist_append ( *pics, (gpointer) g_strdup ( wp->image ) ); +} + +/* Structure for thumbnail creating data used in the background thread */ +typedef struct { + VikTrwLayer *vtl; // Layer needed for redrawing + GSList *pics; // Image list +} thumbnail_create_thread_data; + +static int create_thumbnails_thread ( thumbnail_create_thread_data *tctd, gpointer threaddata ) +{ + guint total = g_slist_length(tctd->pics), done = 0; + while ( tctd->pics ) + { + a_thumbnails_create ( (gchar *) tctd->pics->data ); + int result = a_background_thread_progress ( threaddata, ((gdouble) ++done) / total ); + if ( result != 0 ) + return -1; /* Abort thread */ + + tctd->pics = tctd->pics->next; + } + + // Redraw to show the thumbnails as they are now created + if ( IS_VIK_LAYER(tctd->vtl) ) + vik_layer_emit_update ( VIK_LAYER(tctd->vtl) ); // NB update from background thread + + return 0; +} + +static void thumbnail_create_thread_free ( thumbnail_create_thread_data *tctd ) +{ + while ( tctd->pics ) + { + g_free ( tctd->pics->data ); + tctd->pics = g_slist_delete_link ( tctd->pics, tctd->pics ); + } + g_free ( tctd ); +} + +void trw_layer_verify_thumbnails ( VikTrwLayer *vtl ) +{ + if ( ! vtl->has_verified_thumbnails ) + { + GSList *pics = NULL; + g_hash_table_foreach ( vtl->waypoints, (GHFunc) image_wp_make_list, &pics ); + if ( pics ) + { + gint len = g_slist_length ( pics ); + gchar *tmp = g_strdup_printf ( _("Creating %d Image Thumbnails..."), len ); + thumbnail_create_thread_data *tctd = g_malloc ( sizeof(thumbnail_create_thread_data) ); + tctd->vtl = vtl; + tctd->pics = pics; + a_background_thread ( BACKGROUND_POOL_LOCAL, + VIK_GTK_WINDOW_FROM_LAYER(vtl), + tmp, + (vik_thr_func) create_thumbnails_thread, + tctd, + (vik_thr_free_func) thumbnail_create_thread_free, + NULL, + len ); + g_free ( tmp ); + } + } +} + +static const gchar* my_track_colors ( gint ii ) +{ + static const gchar* colors[VIK_TRW_LAYER_TRACK_GCS] = { + "#2d870a", + "#135D34", + "#0a8783", + "#0e4d87", + "#05469f", + "#695CBB", + "#2d059f", + "#4a059f", + "#5A171A", + "#96059f" + }; + // Fast and reliable way of returning a colour + return colors[(ii % VIK_TRW_LAYER_TRACK_GCS)]; +} + +static void trw_layer_track_alloc_colors ( VikTrwLayer *vtl ) +{ + GHashTableIter iter; + gpointer key, value; + + gint ii = 0; + // Tracks + g_hash_table_iter_init ( &iter, vtl->tracks ); + + while ( g_hash_table_iter_next (&iter, &key, &value) ) { + + // Tracks get a random spread of colours if not already assigned + if ( ! VIK_TRACK(value)->has_color ) { + if ( vtl->drawmode == DRAWMODE_ALL_SAME_COLOR ) + VIK_TRACK(value)->color = vtl->track_color; + else { + gdk_color_parse ( my_track_colors (ii), &(VIK_TRACK(value)->color) ); + } + VIK_TRACK(value)->has_color = TRUE; + } + + trw_layer_update_treeview ( vtl, VIK_TRACK(value) ); + + ii++; + if (ii > VIK_TRW_LAYER_TRACK_GCS) + ii = 0; + } + + // Routes + ii = 0; + g_hash_table_iter_init ( &iter, vtl->routes ); + + while ( g_hash_table_iter_next (&iter, &key, &value) ) { + + // Routes get an intermix of reds + if ( ! VIK_TRACK(value)->has_color ) { + if ( ii ) + gdk_color_parse ( "#FF0000" , &(VIK_TRACK(value)->color) ); // Red + else + gdk_color_parse ( "#B40916" , &(VIK_TRACK(value)->color) ); // Dark Red + VIK_TRACK(value)->has_color = TRUE; + } + + trw_layer_update_treeview ( vtl, VIK_TRACK(value) ); + + ii = !ii; + } +} + +/* + * (Re)Calculate the bounds of the waypoints in this layer, + * This should be called whenever waypoints are changed + */ +void trw_layer_calculate_bounds_waypoints ( VikTrwLayer *vtl ) +{ + struct LatLon topleft = { 0.0, 0.0 }; + struct LatLon bottomright = { 0.0, 0.0 }; + struct LatLon ll; + + GHashTableIter iter; + gpointer key, value; + + g_hash_table_iter_init ( &iter, vtl->waypoints ); + + // Set bounds to first point + if ( g_hash_table_iter_next (&iter, &key, &value) ) { + vik_coord_to_latlon ( &(VIK_WAYPOINT(value)->coord), &topleft ); + vik_coord_to_latlon ( &(VIK_WAYPOINT(value)->coord), &bottomright ); + } + + // Ensure there is another point... + if ( g_hash_table_size ( vtl->waypoints ) > 1 ) { + + while ( g_hash_table_iter_next (&iter, &key, &value) ) { + + // See if this point increases the bounds. + vik_coord_to_latlon ( &(VIK_WAYPOINT(value)->coord), &ll ); + + if ( ll.lat > topleft.lat) topleft.lat = ll.lat; + if ( ll.lon < topleft.lon) topleft.lon = ll.lon; + if ( ll.lat < bottomright.lat) bottomright.lat = ll.lat; + if ( ll.lon > bottomright.lon) bottomright.lon = ll.lon; + } + } + + vtl->waypoints_bbox.north = topleft.lat; + vtl->waypoints_bbox.east = bottomright.lon; + vtl->waypoints_bbox.south = bottomright.lat; + vtl->waypoints_bbox.west = topleft.lon; +} + +static void trw_layer_calculate_bounds_track ( gpointer id, VikTrack *trk ) +{ + vik_track_calculate_bounds ( trk ); +} + +void trw_layer_calculate_bounds_tracks ( VikTrwLayer *vtl ) +{ + g_hash_table_foreach ( vtl->tracks, (GHFunc) trw_layer_calculate_bounds_track, NULL ); + g_hash_table_foreach ( vtl->routes, (GHFunc) trw_layer_calculate_bounds_track, NULL ); +} + +static void trw_layer_sort_all ( VikTrwLayer *vtl ) +{ + if ( ! VIK_LAYER(vtl)->vt ) + return; + + // Obviously need 2 to tango - sorting with only 1 (or less) is a lonely activity! + if ( g_hash_table_size (vtl->tracks) > 1 ) + vik_treeview_sort_children ( VIK_LAYER(vtl)->vt, &(vtl->tracks_iter), vtl->track_sort_order ); + + if ( g_hash_table_size (vtl->routes) > 1 ) + vik_treeview_sort_children ( VIK_LAYER(vtl)->vt, &(vtl->routes_iter), vtl->track_sort_order ); + + if ( g_hash_table_size (vtl->waypoints) > 1 ) + vik_treeview_sort_children ( VIK_LAYER(vtl)->vt, &(vtl->waypoints_iter), vtl->wp_sort_order ); +} + +/** + * Get the earliest timestamp available from all tracks + */ +static time_t trw_layer_get_timestamp_tracks ( VikTrwLayer *vtl ) +{ + time_t timestamp = 0; + GList *gl = g_hash_table_get_values ( vtl->tracks ); + gl = g_list_sort ( gl, vik_track_compare_timestamp ); + gl = g_list_first ( gl ); + + if ( gl ) { + // Only need to check the first track as they have been sorted by time + VikTrack *trk = (VikTrack*)gl->data; + // Assume trackpoints already sorted by time + VikTrackpoint *tpt = vik_track_get_tp_first(trk); + if ( tpt && tpt->has_timestamp ) { + timestamp = tpt->timestamp; + } + g_list_free ( gl ); + } + return timestamp; +} + +/** + * Get the earliest timestamp available from all waypoints + */ +static time_t trw_layer_get_timestamp_waypoints ( VikTrwLayer *vtl ) +{ + time_t timestamp = 0; + GList *gl = g_hash_table_get_values ( vtl->waypoints ); + GList *iter; + for (iter = g_list_first (gl); iter != NULL; iter = g_list_next (iter)) { + VikWaypoint *wpt = (VikWaypoint*)iter->data; + if ( wpt->has_timestamp ) { + // When timestamp not set yet - use the first value encountered + if ( timestamp == 0 ) + timestamp = wpt->timestamp; + else if ( timestamp > wpt->timestamp ) + timestamp = wpt->timestamp; + } + } + g_list_free ( gl ); + + return timestamp; +} + +/** + * Get the earliest timestamp available for this layer + */ +static time_t trw_layer_get_timestamp ( VikTrwLayer *vtl ) +{ + time_t timestamp_tracks = trw_layer_get_timestamp_tracks ( vtl ); + time_t timestamp_waypoints = trw_layer_get_timestamp_waypoints ( vtl ); + // NB routes don't have timestamps - hence they are not considered + + if ( !timestamp_tracks && !timestamp_waypoints ) { + // Fallback to get time from the metadata when no other timestamps available + GTimeVal gtv; + if ( vtl->metadata && vtl->metadata->timestamp && g_time_val_from_iso8601 ( vtl->metadata->timestamp, >v ) ) + return gtv.tv_sec; + } + if ( timestamp_tracks && !timestamp_waypoints ) + return timestamp_tracks; + if ( timestamp_tracks && timestamp_waypoints && (timestamp_tracks < timestamp_waypoints) ) + return timestamp_tracks; + return timestamp_waypoints; +} + +static void trw_layer_post_read ( VikTrwLayer *vtl, VikViewport *vvp, gboolean from_file ) +{ + if ( VIK_LAYER(vtl)->realized ) + trw_layer_verify_thumbnails ( vtl ); + trw_layer_track_alloc_colors ( vtl ); + + trw_layer_calculate_bounds_waypoints ( vtl ); + trw_layer_calculate_bounds_tracks ( vtl ); + + // Apply treeview sort after loading all the tracks for this layer + // (rather than sorted insert on each individual track additional) + // and after subsequent changes to the properties as the specified order may have changed. + // since the sorting of a treeview section is now very quick + // NB sorting is also performed after every name change as well to maintain the list order + trw_layer_sort_all ( vtl ); + + // Setting metadata time if not otherwise set + if ( vtl->metadata ) { + + gboolean need_to_set_time = TRUE; + if ( vtl->metadata->timestamp ) { + need_to_set_time = FALSE; + if ( !g_strcmp0(vtl->metadata->timestamp, "" ) ) + need_to_set_time = TRUE; + } + + if ( need_to_set_time ) { + GTimeVal timestamp; + timestamp.tv_usec = 0; + timestamp.tv_sec = trw_layer_get_timestamp ( vtl ); + + // No time found - so use 'now' for the metadata time + if ( timestamp.tv_sec == 0 ) { + g_get_current_time ( ×tamp ); + } + + vtl->metadata->timestamp = g_time_val_to_iso8601 ( ×tamp ); + } + } +} + +VikCoordMode vik_trw_layer_get_coord_mode ( VikTrwLayer *vtl ) +{ + return vtl->coord_mode; +} + +/** + * Uniquify the whole layer + * Also requires the layers panel as the names shown there need updating too + * Returns whether the operation was successful or not + */ +gboolean vik_trw_layer_uniquify ( VikTrwLayer *vtl, VikLayersPanel *vlp ) +{ + if ( vtl && vlp ) { + vik_trw_layer_uniquify_tracks ( vtl, vlp, vtl->tracks, TRUE ); + vik_trw_layer_uniquify_tracks ( vtl, vlp, vtl->routes, FALSE ); + vik_trw_layer_uniquify_waypoints ( vtl, vlp ); + return TRUE; + } + return FALSE; +} + +static void waypoint_convert ( const gpointer id, VikWaypoint *wp, VikCoordMode *dest_mode ) +{ + vik_coord_convert ( &(wp->coord), *dest_mode ); +} + +static void track_convert ( const gpointer id, VikTrack *tr, VikCoordMode *dest_mode ) +{ + vik_track_convert ( tr, *dest_mode ); +} + +static void trw_layer_change_coord_mode ( VikTrwLayer *vtl, VikCoordMode dest_mode ) +{ + if ( vtl->coord_mode != dest_mode ) + { + vtl->coord_mode = dest_mode; + g_hash_table_foreach ( vtl->waypoints, (GHFunc) waypoint_convert, &dest_mode ); + g_hash_table_foreach ( vtl->tracks, (GHFunc) track_convert, &dest_mode ); + g_hash_table_foreach ( vtl->routes, (GHFunc) track_convert, &dest_mode ); + } +} + +static void trw_layer_set_menu_selection ( VikTrwLayer *vtl, guint16 selection ) +{ + vtl->menu_selection = selection; +} + +static guint16 trw_layer_get_menu_selection ( VikTrwLayer *vtl ) +{ + return (vtl->menu_selection); +} + +/* ----------- Downloading maps along tracks --------------- */ + +static int get_download_area_width(VikViewport *vvp, gdouble zoom_level, struct LatLon *wh) +{ + /* TODO: calculating based on current size of viewport */ + const gdouble w_at_zoom_0_125 = 0.0013; + const gdouble h_at_zoom_0_125 = 0.0011; + gdouble zoom_factor = zoom_level/0.125; + + wh->lat = h_at_zoom_0_125 * zoom_factor; + wh->lon = w_at_zoom_0_125 * zoom_factor; + + return 0; /* all OK */ +} + +static VikCoord *get_next_coord(VikCoord *from, VikCoord *to, struct LatLon *dist, gdouble gradient) +{ + if ((dist->lon >= ABS(to->east_west - from->east_west)) && + (dist->lat >= ABS(to->north_south - from->north_south))) + return NULL; + + VikCoord *coord = g_malloc(sizeof(VikCoord)); + coord->mode = VIK_COORD_LATLON; + + if (ABS(gradient) < 1) { + if (from->east_west > to->east_west) + coord->east_west = from->east_west - dist->lon; + else + coord->east_west = from->east_west + dist->lon; + coord->north_south = gradient * (coord->east_west - from->east_west) + from->north_south; + } else { + if (from->north_south > to->north_south) + coord->north_south = from->north_south - dist->lat; + else + coord->north_south = from->north_south + dist->lat; + coord->east_west = (1/gradient) * (coord->north_south - from->north_south) + from->north_south; + } + + return coord; +} + +static GList *add_fillins(GList *list, VikCoord *from, VikCoord *to, struct LatLon *dist) +{ + /* TODO: handle virtical track (to->east_west - from->east_west == 0) */ + gdouble gradient = (to->north_south - from->north_south)/(to->east_west - from->east_west); + + VikCoord *next = from; + while (TRUE) { + if ((next = get_next_coord(next, to, dist, gradient)) == NULL) + break; + list = g_list_prepend(list, next); + } + + return list; +} + +void vik_track_download_map(VikTrack *tr, VikMapsLayer *vml, VikViewport *vvp, gdouble zoom_level) +{ + typedef struct _Rect { + VikCoord tl; + VikCoord br; + VikCoord center; + } Rect; +#define GLRECT(iter) ((Rect *)((iter)->data)) + + struct LatLon wh; + GList *rects_to_download = NULL; + GList *rect_iter; + + if (get_download_area_width(vvp, zoom_level, &wh)) + return; + + GList *iter = tr->trackpoints; + if (!iter) + return; + + gboolean new_map = TRUE; + VikCoord *cur_coord, tl, br; + Rect *rect; + while (iter) { + cur_coord = &(VIK_TRACKPOINT(iter->data))->coord; + if (new_map) { + vik_coord_set_area(cur_coord, &wh, &tl, &br); + rect = g_malloc(sizeof(Rect)); + rect->tl = tl; + rect->br = br; + rect->center = *cur_coord; + rects_to_download = g_list_prepend(rects_to_download, rect); + new_map = FALSE; + iter = iter->next; + continue; + } + gboolean found = FALSE; + for (rect_iter = rects_to_download; rect_iter; rect_iter = rect_iter->next) { + if (vik_coord_inside(cur_coord, &GLRECT(rect_iter)->tl, &GLRECT(rect_iter)->br)) { + found = TRUE; + break; + } + } + if (found) + iter = iter->next; + else + new_map = TRUE; + } + + GList *fillins = NULL; + /* 'fillin' doesn't work in UTM mode - potentially ending up in massive loop continually allocating memory - hence don't do it */ + /* seems that ATM the function get_next_coord works only for LATLON */ + if ( cur_coord->mode == VIK_COORD_LATLON ) { + /* fill-ins for far apart points */ + GList *cur_rect, *next_rect; + for (cur_rect = rects_to_download; + (next_rect = cur_rect->next) != NULL; + cur_rect = cur_rect->next) { + if ((wh.lon < ABS(GLRECT(cur_rect)->center.east_west - GLRECT(next_rect)->center.east_west)) || + (wh.lat < ABS(GLRECT(cur_rect)->center.north_south - GLRECT(next_rect)->center.north_south))) { + fillins = add_fillins(fillins, &GLRECT(cur_rect)->center, &GLRECT(next_rect)->center, &wh); + } + } + } else + g_message("%s: this feature works only in Mercator mode", __FUNCTION__); + + if (fillins) { + GList *fiter = fillins; + while (fiter) { + cur_coord = (VikCoord *)(fiter->data); + vik_coord_set_area(cur_coord, &wh, &tl, &br); + rect = g_malloc(sizeof(Rect)); + rect->tl = tl; + rect->br = br; + rect->center = *cur_coord; + rects_to_download = g_list_prepend(rects_to_download, rect); + fiter = fiter->next; + } + } + + for (rect_iter = rects_to_download; rect_iter; rect_iter = rect_iter->next) { + vik_maps_layer_download_section (vml, vvp, &(((Rect *)(rect_iter->data))->tl), &(((Rect *)(rect_iter->data))->br), zoom_level); + } + + if (fillins) { + for (iter = fillins; iter; iter = iter->next) + g_free(iter->data); + g_list_free(fillins); + } + if (rects_to_download) { + for (rect_iter = rects_to_download; rect_iter; rect_iter = rect_iter->next) + g_free(rect_iter->data); + g_list_free(rects_to_download); + } +} + +static void trw_layer_download_map_along_track_cb ( menu_array_sublayer values ) +{ + VikMapsLayer *vml; + gint selected_map; + gchar *zoomlist[] = {"0.125", "0.25", "0.5", "1", "2", "4", "8", "16", "32", "64", "128", "256", "512", "1024", NULL }; + gdouble zoom_vals[] = {0.125, 0.25, 0.5, 1, 2, 4, 8, 16, 32, 64, 128, 256, 512, 1024}; + gint selected_zoom, default_zoom; + + VikTrwLayer *vtl = values[MA_VTL]; + VikLayersPanel *vlp = values[MA_VLP]; + VikTrack *trk; + if ( GPOINTER_TO_INT (values[MA_SUBTYPE]) == VIK_TRW_LAYER_SUBLAYER_ROUTE ) + trk = (VikTrack *) g_hash_table_lookup ( vtl->routes, values[MA_SUBLAYER_ID] ); + else + trk = (VikTrack *) g_hash_table_lookup ( vtl->tracks, values[MA_SUBLAYER_ID] ); + if ( !trk ) + return; + + VikViewport *vvp = vik_window_viewport((VikWindow *)(VIK_GTK_WINDOW_FROM_LAYER(vtl))); + + GList *vmls = vik_layers_panel_get_all_layers_of_type(vlp, VIK_LAYER_MAPS, TRUE); // Includes hidden map layer types + int num_maps = g_list_length(vmls); + + if (!num_maps) { + a_dialog_error_msg(VIK_GTK_WINDOW_FROM_LAYER(vtl), _("No map layer in use. Create one first") ); + return; + } + + // Convert from list of vmls to list of names. Allowing the user to select one of them + gchar **map_names = g_malloc_n(1 + num_maps, sizeof(gpointer)); + VikMapsLayer **map_layers = g_malloc_n(1 + num_maps, sizeof(gpointer)); + + gchar **np = map_names; + VikMapsLayer **lp = map_layers; + int i; + for (i = 0; i < num_maps; i++) { + vml = (VikMapsLayer *)(vmls->data); + *lp++ = vml; + *np++ = vik_maps_layer_get_map_label(vml); + vmls = vmls->next; + } + // Mark end of the array lists + *lp = NULL; + *np = NULL; + + gdouble cur_zoom = vik_viewport_get_zoom(vvp); + for (default_zoom = 0; default_zoom < G_N_ELEMENTS(zoom_vals); default_zoom++) { + if (cur_zoom == zoom_vals[default_zoom]) + break; + } + default_zoom = (default_zoom == G_N_ELEMENTS(zoom_vals)) ? G_N_ELEMENTS(zoom_vals) - 1 : default_zoom; + + if (!a_dialog_map_n_zoom(VIK_GTK_WINDOW_FROM_LAYER(vtl), map_names, 0, zoomlist, default_zoom, &selected_map, &selected_zoom)) + goto done; + + vik_track_download_map(trk, map_layers[selected_map], vvp, zoom_vals[selected_zoom]); + +done: + for (i = 0; i < num_maps; i++) + g_free(map_names[i]); + g_free(map_names); + g_free(map_layers); + + g_list_free(vmls); + +} + +/**** lowest waypoint number calculation ***/ +static gint highest_wp_number_name_to_number(const gchar *name) { + if ( strlen(name) == 3 ) { + int n = atoi(name); + if ( n < 100 && name[0] != '0' ) + return -1; + if ( n < 10 && name[0] != '0' ) + return -1; + return n; + } + return -1; +} + + +static void highest_wp_number_reset(VikTrwLayer *vtl) +{ + vtl->highest_wp_number = 0; +} + +static void highest_wp_number_add_wp(VikTrwLayer *vtl, const gchar *new_wp_name) +{ + /* if is bigger that top, add it */ + gint new_wp_num = highest_wp_number_name_to_number(new_wp_name); + if ( new_wp_num > vtl->highest_wp_number ) + vtl->highest_wp_number = new_wp_num; +} + +static void highest_wp_number_remove_wp(VikTrwLayer *vtl, const gchar *old_wp_name) +{ + /* if wasn't top, do nothing. if was top, count backwards until we find one used */ + gint old_wp_num = highest_wp_number_name_to_number(old_wp_name); + if ( vtl->highest_wp_number == old_wp_num ) { + gchar buf[4]; + vtl->highest_wp_number--; + + g_snprintf(buf,4,"%03d", vtl->highest_wp_number ); + /* search down until we find something that *does* exist */ + + while ( vtl->highest_wp_number > 0 && ! vik_trw_layer_get_waypoint ( vtl, buf )) { + vtl->highest_wp_number--; + g_snprintf(buf,4,"%03d", vtl->highest_wp_number ); + } + } +} + +/* get lowest unused number */ +static gchar *highest_wp_number_get(VikTrwLayer *vtl) +{ + gchar buf[4]; + if ( vtl->highest_wp_number < 0 || vtl->highest_wp_number >= 999 ) + return NULL; + g_snprintf(buf,4,"%03d", vtl->highest_wp_number+1 ); + return g_strdup(buf); +} + +/** + * trw_layer_create_track_list_both: + * + * Create the latest list of tracks and routes + */ +static GList* trw_layer_create_track_list_both ( VikLayer *vl, gpointer user_data ) +{ + VikTrwLayer *vtl = VIK_TRW_LAYER(vl); + GList *tracks = NULL; + tracks = g_list_concat ( tracks, g_hash_table_get_values ( vik_trw_layer_get_tracks ( vtl ) ) ); + tracks = g_list_concat ( tracks, g_hash_table_get_values ( vik_trw_layer_get_routes ( vtl ) ) ); + + return vik_trw_layer_build_track_list_t ( vtl, tracks ); +} + +static void trw_layer_track_list_dialog_single ( menu_array_sublayer values ) +{ + VikTrwLayer *vtl = VIK_TRW_LAYER(values[MA_VTL]); + + gchar *title = NULL; + if ( GPOINTER_TO_INT(values[MA_SUBTYPE]) == VIK_TRW_LAYER_SUBLAYER_TRACKS ) + title = g_strdup_printf ( _("%s: Track List"), VIK_LAYER(vtl)->name ); + else + title = g_strdup_printf ( _("%s: Route List"), VIK_LAYER(vtl)->name ); + + vik_trw_layer_track_list_show_dialog ( title, VIK_LAYER(vtl), values[MA_SUBTYPE], trw_layer_create_track_list, FALSE ); + g_free ( title ); +} + +static void trw_layer_track_list_dialog ( menu_array_layer values ) +{ + VikTrwLayer *vtl = VIK_TRW_LAYER(values[MA_VTL]); + + gchar *title = g_strdup_printf ( _("%s: Track and Route List"), VIK_LAYER(vtl)->name ); + vik_trw_layer_track_list_show_dialog ( title, VIK_LAYER(vtl), NULL, trw_layer_create_track_list_both, FALSE ); + g_free ( title ); +} + +static void trw_layer_waypoint_list_dialog ( menu_array_layer values ) +{ + VikTrwLayer *vtl = VIK_TRW_LAYER(values[MA_VTL]); + + gchar *title = g_strdup_printf ( _("%s: Waypoint List"), VIK_LAYER(vtl)->name ); + vik_trw_layer_waypoint_list_show_dialog ( title, VIK_LAYER(vtl), NULL, trw_layer_create_waypoint_list, FALSE ); + g_free ( title ); +} + +static void trw_write_file ( VikTrwLayer *trw, FILE *f, const gchar *dirpath ) +{ + if ( trw->external_layer == VIK_TRW_LAYER_EXTERNAL ) { + trw_write_file_external ( trw, f, dirpath ); + } else if ( trw->external_layer != VIK_TRW_LAYER_EXTERNAL_NO_WRITE ) { + a_gpspoint_write_file( trw, f, dirpath ); + } +} + +gboolean trw_read_file ( VikTrwLayer *trw, FILE *f, const gchar *dirpath ) +{ + if ( trw->external_layer != VIK_TRW_LAYER_INTERNAL ) { + return trw_read_file_external ( trw, f, dirpath ); + } else { + return a_gpspoint_read_file( trw, f, dirpath ); + } +} + +static void trw_write_file_external ( VikTrwLayer *trw, FILE *f, const gchar *dirpath ) +{ + g_assert ( trw != NULL && trw->external_file != NULL ); + + // if never loaded or not for writing, no need to rewrite + if ( trw->external_layer != VIK_TRW_LAYER_EXTERNAL || ! trw->external_loaded ) + return; + + gboolean success = a_file_export ( trw, trw->external_file, FILE_TYPE_GPX, NULL, TRUE ); + + if ( ! success ) { + gchar *msg = g_strdup_printf ( _("Could not write external layer %s to %s, please fix and save before exiting or data will be lost"), VIK_LAYER(trw)->name, trw->external_file ); + a_dialog_error_msg ( VIK_GTK_WINDOW_FROM_LAYER(trw), msg ); + g_free ( msg ); + } +} + +static gboolean trw_read_file_external ( VikTrwLayer *trw, FILE *f, const gchar *dirpath ) +{ + g_assert ( trw != NULL && trw->external_file != NULL && f != NULL ); + + g_free ( trw->external_dirpath ); + trw->external_dirpath = g_strdup ( dirpath ); + + // leave loading to trw_layer_draw function + trw->external_loaded = FALSE; + + // read ~EndLayerData + static char line_buffer[15]; + (void)! fgets(line_buffer, 15, f); // Not worried about file read errors + gboolean success = ( strlen(line_buffer) >= 13 && strncmp ( line_buffer, "~EndLayerData", 13 ) == 0 ); + + return success; +} + +static gboolean trw_load_external_layer ( VikTrwLayer *trw ) +{ + g_assert ( trw != NULL && trw->external_file != NULL ); + + VikWindow *vw = VIK_WINDOW(VIK_GTK_WINDOW_FROM_LAYER(trw)); + gchar *extfile_full = util_make_absolute_filename ( trw->external_file, trw->external_dirpath ); + gchar *extfile = extfile_full ? extfile_full : trw->external_file; + + gboolean failed = TRUE; + FILE *ext_f = g_fopen ( extfile, "r" ); + if ( ext_f ) { + vik_window_set_busy_cursor ( vw ); + + gchar *dirpath = g_path_get_dirname ( extfile ); + failed = ! a_gpx_read_file ( trw, ext_f, dirpath ); + g_free ( dirpath ); + fclose ( ext_f ); + + vik_window_clear_busy_cursor ( vw ); + } + + trw->external_loaded = ! failed; + + if ( failed ) { + gchar *msg = g_strdup_printf ( _("WARNING: issues encountered loading external layer %s from %s"), VIK_LAYER(trw)->name, extfile ); + vik_statusbar_set_message ( vik_window_get_statusbar ( vw ), VIK_STATUSBAR_INFO, msg ); + g_free ( msg ); + } + + g_free ( extfile_full ); + + return ! failed; +} + +void trw_ensure_layer_loaded ( VikTrwLayer *trw ) +{ + if ( trw->external_layer != VIK_TRW_LAYER_INTERNAL && ! trw->external_loaded ) { + // set to true for now else the load will trigger redraws that will + // trigger reloads... + // trw_load_external_layer will set this to false if the load fails + trw->external_loaded = TRUE; + trw_load_external_layer ( trw ); + trw_layer_post_read ( trw, NULL, FALSE ); + } +} + +/** + * Convert layer to an external layer and load data from file specified + * by external_file. Set as a read only layer (i.e. don't write back to + * file by default) + */ +void trw_layer_replace_external ( VikTrwLayer *trw, gchar *external_file ) +{ + trw->external_layer = VIK_TRW_LAYER_EXTERNAL_NO_WRITE; + trw_update_layer_icon ( trw ); + g_free ( trw->external_file ); + trw->external_file = g_strdup ( external_file ); + trw->external_loaded = FALSE; + trw_ensure_layer_loaded ( trw ); +} + +static void trw_update_layer_icon ( VikTrwLayer *trw ) +{ + if ( ! VIK_LAYER(trw)->vt ) + return; + + const GdkPixdata *data; + switch ( trw->external_layer ) { + case VIK_TRW_LAYER_EXTERNAL: data = &viktrwlayer_external_pixbuf; break; + case VIK_TRW_LAYER_EXTERNAL_NO_WRITE: data = &viktrwlayer_external_nowrite_pixbuf; break; + default: data = &viktrwlayer_pixbuf; break; + } + + GdkPixbuf *buf = gdk_pixbuf_from_pixdata ( data, FALSE, NULL ); + vik_treeview_item_set_icon ( VIK_LAYER(trw)->vt, &(VIK_LAYER(trw)->iter), buf ); +} + +/*** Splitter ***/ + +static gpointer tool_splitter_create ( VikWindow *vw, VikViewport *vvp) +{ + return vvp; +} + +static gboolean tool_splitter_click ( VikTrwLayer *vtl, GdkEventButton *event, VikViewport *vvp ) +{ + TPSearchParams params; + params.vvp = vvp; + params.x = event->x; + params.y = event->y; + params.closest_track_id = NULL; + params.closest_tp = NULL; + params.closest_tpl = NULL; + params.bbox = vik_viewport_get_bbox ( vvp ); + + if ( tool_select_tp ( vtl, ¶ms, TRUE, TRUE ) ) + { + trw_layer_split_at_selected_trackpoint ( vtl, vtl->current_tp_track->is_route ? VIK_TRW_LAYER_SUBLAYER_ROUTE : VIK_TRW_LAYER_SUBLAYER_TRACK ); + return TRUE; + } + + return FALSE; +} diff --git a/src/viktrwlayer.h b/src/viktrwlayer.h new file mode 100644 index 0000000..c1012d0 --- /dev/null +++ b/src/viktrwlayer.h @@ -0,0 +1,185 @@ +/* + * viking -- GPS Data and Topo Analyzer, Explorer, and Manager + * + * Copyright (C) 2003-2005, Evan Battaglia + * Copyright (c) 2011-2013, Rob Norris + * + * 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., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA + * + */ + +#ifndef _VIKING_TRWLAYER_H +#define _VIKING_TRWLAYER_H + +#include "viklayer.h" +#include "vikviewport.h" +#include "vikwaypoint.h" +#include "viktrack.h" +#include "viklayerspanel.h" + +G_BEGIN_DECLS + +#define VIK_TRW_LAYER_TYPE (vik_trw_layer_get_type ()) +#define VIK_TRW_LAYER(obj) (G_TYPE_CHECK_INSTANCE_CAST ((obj), VIK_TRW_LAYER_TYPE, VikTrwLayer)) +#define VIK_TRW_LAYER_CLASS(klass) (G_TYPE_CHECK_CLASS_CAST ((klass), VIK_TRW_LAYER_TYPE, VikTrwLayerClass)) +#define IS_VIK_TRW_LAYER(obj) (G_TYPE_CHECK_INSTANCE_TYPE ((obj), VIK_TRW_LAYER_TYPE)) +#define IS_VIK_TRW_LAYER_CLASS(klass) (G_TYPE_CHECK_CLASS_TYPE ((klass), VIK_TRW_LAYER_TYPE)) + +enum { + VIK_TRW_LAYER_SUBLAYER_TRACKS, + VIK_TRW_LAYER_SUBLAYER_WAYPOINTS, + VIK_TRW_LAYER_SUBLAYER_TRACK, + VIK_TRW_LAYER_SUBLAYER_WAYPOINT, + VIK_TRW_LAYER_SUBLAYER_ROUTES, + VIK_TRW_LAYER_SUBLAYER_ROUTE +}; + +typedef struct _VikTrwLayerClass VikTrwLayerClass; +struct _VikTrwLayerClass +{ + VikLayerClass object_class; +}; + + +GType vik_trw_layer_get_type (); + +typedef struct _VikTrwLayer VikTrwLayer; + +typedef struct { + gchar *description; + gchar *author; + //gboolean has_time; + gchar *timestamp; // TODO: Consider storing as proper time_t. + gchar *keywords; // TODO: handling/storing a GList of individual tags? +} VikTRWMetadata; + +VikTRWMetadata *vik_trw_metadata_new(); +void vik_trw_metadata_free ( VikTRWMetadata *metadata); +VikTRWMetadata *vik_trw_layer_get_metadata ( VikTrwLayer *vtl ); +void vik_trw_layer_set_metadata ( VikTrwLayer *vtl, VikTRWMetadata *metadata); + +gboolean vik_trw_layer_find_date ( VikTrwLayer *vtl, const gchar *date_str, VikCoord *position, VikViewport *vvp, gboolean do_tracks, gboolean select ); + +/* These are meant for use in file loaders (gpspoint.c, gpx.c, etc). + * These copy the name, so you should free it if necessary. */ +void vik_trw_layer_filein_add_waypoint ( VikTrwLayer *vtl, gchar *name, VikWaypoint *wp ); +void vik_trw_layer_filein_add_track ( VikTrwLayer *vtl, gchar *name, VikTrack *tr ); + +void vik_trw_layer_tidy_tracks ( VikTrwLayer *vtl, guint speed, gboolean recalc_bounds ); + +gint vik_trw_layer_get_property_tracks_line_thickness ( VikTrwLayer *vtl ); + +void vik_trw_layer_add_waypoint ( VikTrwLayer *vtl, gchar *name, VikWaypoint *wp ); +void vik_trw_layer_add_track ( VikTrwLayer *vtl, gchar *name, VikTrack *t ); +void vik_trw_layer_add_route ( VikTrwLayer *vtl, gchar *name, VikTrack *t ); + +// Waypoint returned is the first one +VikWaypoint *vik_trw_layer_get_waypoint ( VikTrwLayer *vtl, const gchar *name ); + +// Track returned is the first one +VikTrack *vik_trw_layer_get_track ( VikTrwLayer *vtl, const gchar *name ); +gboolean vik_trw_layer_delete_track ( VikTrwLayer *vtl, VikTrack *trk ); +gboolean vik_trw_layer_delete_route ( VikTrwLayer *vtl, VikTrack *trk ); + +gboolean vik_trw_layer_auto_set_view ( VikTrwLayer *vtl, VikViewport *vvp ); +gboolean vik_trw_layer_find_center ( VikTrwLayer *vtl, VikCoord *dest ); +GHashTable *vik_trw_layer_get_tracks ( VikTrwLayer *l ); +GHashTable *vik_trw_layer_get_routes ( VikTrwLayer *l ); +GHashTable *vik_trw_layer_get_waypoints ( VikTrwLayer *l ); +gboolean vik_trw_layer_is_empty ( VikTrwLayer *vtl ); + +gboolean vik_trw_layer_new_waypoint ( VikTrwLayer *vtl, GtkWindow *w, const VikCoord *def_coord ); + +VikCoordMode vik_trw_layer_get_coord_mode ( VikTrwLayer *vtl ); + +gboolean vik_trw_layer_uniquify ( VikTrwLayer *vtl, VikLayersPanel *vlp ); + +void vik_trw_layer_delete_all_waypoints ( VikTrwLayer *vtl ); +void vik_trw_layer_delete_all_tracks ( VikTrwLayer *vtl ); +void vik_trw_layer_delete_all_routes ( VikTrwLayer *vtl ); +void trw_layer_cancel_tps_of_track ( VikTrwLayer *vtl, VikTrack *trk ); + +void vik_trw_layer_reset_waypoints ( VikTrwLayer *vtl ); + +void vik_trw_layer_draw_highlight ( VikTrwLayer *vtl, VikViewport *vvp ); +void vik_trw_layer_draw_highlight_item ( VikTrwLayer *vtl, VikTrack *trk, VikWaypoint *wpt, VikViewport *vvp ); +void vik_trw_layer_draw_highlight_items ( VikTrwLayer *vtl, GHashTable *trks, GHashTable *wpts, VikViewport *vvp ); + +// For creating a list of tracks with the corresponding layer it is in +// (thus a selection of tracks may be from differing layers) +typedef struct { + VikTrack *trk; + VikTrwLayer *vtl; +} vik_trw_track_list_t; + +typedef GList* (*VikTrwlayerGetTracksAndLayersFunc) (VikLayer*, gpointer); +GList *vik_trw_layer_build_track_list_t ( VikTrwLayer *vtl, GList *tracks ); + +// For creating a list of waypoints with the corresponding layer it is in +// (thus a selection of waypoints may be from differing layers) +typedef struct { + VikWaypoint *wpt; + VikTrwLayer *vtl; +} vik_trw_waypoint_list_t; + +typedef GList* (*VikTrwlayerGetWaypointsAndLayersFunc) (VikLayer*, gpointer); +GList *vik_trw_layer_build_waypoint_list_t ( VikTrwLayer *vtl, GList *waypoints ); + +GdkPixbuf* get_wp_sym_small ( gchar *symbol ); + +/* Exposed Layer Interface function definitions */ +// Intended only for use by other trw_layer subwindows +void trw_layer_verify_thumbnails ( VikTrwLayer *vtl ); +// Other functions only for use by other trw_layer subwindows +gchar *trw_layer_new_unique_sublayer_name ( VikTrwLayer *vtl, gint sublayer_type, const gchar *name ); +void trw_layer_waypoint_rename ( VikTrwLayer *vtl, VikWaypoint *wp, const gchar *new_name ); +void trw_layer_waypoint_reset_icon ( VikTrwLayer *vtl, VikWaypoint *wp ); +void trw_layer_calculate_bounds_waypoints ( VikTrwLayer *vtl ); +void trw_layer_calculate_bounds_tracks ( VikTrwLayer *vtl ); + +gboolean vik_trw_layer_get_tracks_visibility ( VikTrwLayer *vtl ); +gboolean vik_trw_layer_get_routes_visibility ( VikTrwLayer *vtl ); +gboolean vik_trw_layer_get_waypoints_visibility ( VikTrwLayer *vtl ); + +void trw_layer_update_treeview ( VikTrwLayer *vtl, VikTrack *trk ); + +void trw_layer_dialog_shift ( VikTrwLayer *vtl, GtkWindow *dialog, VikCoord *coord, gboolean vertical ); + +void trw_layer_replace_external ( VikTrwLayer *vtl, gchar *external_file ); +void trw_ensure_layer_loaded ( VikTrwLayer *trw ); + +typedef struct { + VikTrack *trk; // input + gpointer uuid; // output +} trku_udata; +gboolean trw_layer_track_find_uuid ( const gpointer id, const VikTrack *trk, gpointer udata ); + +typedef struct { + VikWaypoint *wp; // input + gpointer uuid; // output +} wpu_udata; +gboolean trw_layer_waypoint_find_uuid ( const gpointer id, const VikWaypoint *wp, gpointer udata ); + +void trw_layer_zoom_to_show_latlons ( VikTrwLayer *vtl, VikViewport *vvp, struct LatLon maxmin[2] ); + +GHashTable *vik_trw_layer_get_tracks_iters ( VikTrwLayer *vtl ); +GHashTable *vik_trw_layer_get_routes_iters ( VikTrwLayer *vtl ); +GHashTable *vik_trw_layer_get_waypoints_iters ( VikTrwLayer *vtl ); + +#define VIK_SETTINGS_LIST_DATE_FORMAT "list_date_format" + +G_END_DECLS + +#endif diff --git a/src/viktrwlayer_analysis.c b/src/viktrwlayer_analysis.c new file mode 100644 index 0000000..a8d2f3d --- /dev/null +++ b/src/viktrwlayer_analysis.c @@ -0,0 +1,669 @@ +/* -*- Mode: C; indent-tabs-mode: t; c-basic-offset: 4; tab-width: 4 -*- */ +/* + * viking -- GPS Data and Topo Analyzer, Explorer, and Manager + * + * Copyright (C) 2013 Rob Norris + * + * 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., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA + * + *********************************************************** + * + */ + +#include +#include +#include +#include +#include + +#include "viking.h" +#include "viktrwlayer_analysis.h" +#include "ui_util.h" + +// Units of each item are in SI Units +// (as returned by the appropriate internal viking track functions) +typedef struct { + gdouble min_alt; + gdouble max_alt; + gdouble elev_gain; + gdouble elev_loss; + gdouble length; + gdouble length_gaps; + gdouble max_speed; + gulong trackpoints; + guint segments; + gint duration; + time_t start_time; + time_t end_time; + gint count; + GList *e_list; // of guints to determine Eddington number + // https://en.wikipedia.org/wiki/Arthur_Eddington#Eddington_number_for_cycling +} track_stats; + +// Early incarnations of the code had facilities to print output for multiple files +// but has been rescoped to work on a single list of tracks for the GUI +typedef enum { + //TS_TRACK, + TS_TRACKS, + //TS_FILES, +} track_stat_block; +static track_stats tracks_stats[1]; + +// cf with vik_track_get_minmax_alt internals +#define VIK_VAL_MIN_ALT 25000.0 +#define VIK_VAL_MAX_ALT -5000.0 + +/** + * Reset the specified block + * Call this when starting to processing multiple items + */ +static void val_reset ( track_stat_block block ) +{ + tracks_stats[block].min_alt = VIK_VAL_MIN_ALT; + tracks_stats[block].max_alt = VIK_VAL_MAX_ALT; + tracks_stats[block].elev_gain = 0.0; + tracks_stats[block].elev_loss = 0.0; + tracks_stats[block].length = 0.0; + tracks_stats[block].length_gaps = 0.0; + tracks_stats[block].max_speed = 0.0; + tracks_stats[block].trackpoints = 0; + tracks_stats[block].segments = 0; + tracks_stats[block].duration = 0; + tracks_stats[block].start_time = 0; + tracks_stats[block].end_time = 0; + tracks_stats[block].count = 0; + tracks_stats[block].e_list = NULL; +} + +/** + * @val_analyse_track: + * @trk: The track to be analyse + * + * Function to collect statistics, using the internal track functions + */ +static void val_analyse_track ( VikTrack *trk ) +{ + //val_reset ( TS_TRACK ); + gdouble min_alt; + gdouble max_alt; + gdouble up; + gdouble down; + + gdouble length = 0.0; + gdouble length_gaps = 0.0; + gdouble max_speed = 0.0; + gulong trackpoints = 0; + guint segments = 0; + + tracks_stats[TS_TRACKS].count++; + + trackpoints = vik_track_get_tp_count (trk); + segments = vik_track_get_segment_count (trk); + length = vik_track_get_length (trk); + length_gaps = vik_track_get_length_including_gaps (trk); + max_speed = vik_track_get_max_speed (trk); + + if ( !trk->is_route ) { + // Eddington number will be in the current Units distance preference + gdouble e_len; + switch (a_vik_get_units_distance ()) { + case VIK_UNITS_DISTANCE_MILES: e_len = VIK_METERS_TO_MILES(length); break; + case VIK_UNITS_DISTANCE_NAUTICAL_MILES: e_len = VIK_METERS_TO_NAUTICAL_MILES(length); break; + //VIK_UNITS_DISTANCE_KILOMETRES + default: e_len = length/1000.0; break; + } + gdouble *gd = g_malloc ( sizeof(gdouble) ); + *gd = e_len; + tracks_stats[TS_TRACKS].e_list = g_list_prepend ( tracks_stats[TS_TRACKS].e_list, gd ); + } + + int ii; + for (ii = 0; ii < G_N_ELEMENTS(tracks_stats); ii++) { + tracks_stats[ii].trackpoints += trackpoints; + tracks_stats[ii].segments += segments; + tracks_stats[ii].length += length; + tracks_stats[ii].length_gaps += length_gaps; + if ( max_speed > tracks_stats[ii].max_speed ) + tracks_stats[ii].max_speed = max_speed; + } + + if ( vik_track_get_minmax_alt (trk, &min_alt, &max_alt) ) { + for (ii = 0; ii < G_N_ELEMENTS(tracks_stats); ii++) { + if ( min_alt < tracks_stats[ii].min_alt ) + tracks_stats[ii].min_alt = min_alt; + if ( max_alt > tracks_stats[ii].max_alt ) + tracks_stats[ii].max_alt = max_alt; + } + } + + vik_track_get_total_elevation_gain (trk, &up, &down ); + + for (ii = 0; ii < G_N_ELEMENTS(tracks_stats); ii++) { + tracks_stats[ii].elev_gain += up; + tracks_stats[ii].elev_loss += down; + } + + if ( trk->trackpoints && VIK_TRACKPOINT(trk->trackpoints->data)->timestamp ) { + time_t t1, t2; + t1 = VIK_TRACKPOINT(g_list_first(trk->trackpoints)->data)->timestamp; + t2 = VIK_TRACKPOINT(g_list_last(trk->trackpoints)->data)->timestamp; + + // Assume never actually have a track with a time of 0 (1st Jan 1970) + for (ii = 0; ii < G_N_ELEMENTS(tracks_stats); ii++) { + if ( tracks_stats[ii].start_time == 0) + tracks_stats[ii].start_time = t1; + if ( tracks_stats[ii].end_time == 0) + tracks_stats[ii].end_time = t2; + } + + // Initialize to the first value + for (ii = 0; ii < G_N_ELEMENTS(tracks_stats); ii++) { + if (t1 < tracks_stats[ii].start_time) + tracks_stats[ii].start_time = t1; + if (t2 > tracks_stats[ii].end_time) + tracks_stats[ii].end_time = t2; + } + + for (ii = 0; ii < G_N_ELEMENTS(tracks_stats); ii++) { + tracks_stats[ii].duration = tracks_stats[ii].duration + (int)(t2-t1); + } + } +} + +// Could use GtkGrids but that is Gtk3+ +static GtkWidget *create_table (int cnt, char *labels[], GtkWidget *contents[], gboolean extended) +{ + GtkTable *table; + int i; + + table = GTK_TABLE(gtk_table_new (cnt, 2, FALSE)); + gtk_table_set_col_spacing (table, 0, 10); + for (i=0; i%s:", _(labels[i]) ); + gtk_label_set_markup ( GTK_LABEL(label), markup ); + g_free ( markup ); + gtk_table_attach ( table, label, 0, 1, i, i+1, GTK_FILL, GTK_EXPAND, 4, 2 ); + if (GTK_IS_MISC(contents[i])) { + gtk_misc_set_alignment ( GTK_MISC(contents[i]), 0, 0.5 ); + } + gtk_table_attach_defaults ( table, contents[i], 1, 2, i, i+1 ); + } + } + return GTK_WIDGET (table); +} + +static gchar *label_texts[] = { + N_("Number of Tracks"), + N_("Date Range"), + N_("Total Length"), + N_("Average Length"), + N_("Eddington number"), // No.4: Extended display only + N_("Max Speed"), + N_("Avg. Speed"), + N_("Minimum Altitude"), + N_("Maximum Altitude"), + N_("Total Elevation Gain/Loss"), + N_("Avg. Elevation Gain/Loss"), + N_("Total Duration"), + N_("Avg. Duration"), +}; + +/** + * create_layout: + * + * Returns a widget to hold the stats information in a table grid layout + */ +static GtkWidget *create_layout ( GtkWidget *content[], gboolean extended ) +{ + int cnt = 0; + for ( cnt = 0; cnt < G_N_ELEMENTS(label_texts); cnt++ ) + content[cnt] = ui_label_new_selectable ( NULL ); + + if ( !extended ) + cnt = cnt - 1; + + return create_table (cnt, label_texts, content, extended ); +} + + +static gint rsort_by_distance (gconstpointer a, gconstpointer b) +{ + const gdouble* ad = (const gdouble*) a; + const gdouble* bd = (const gdouble*) b; + if ( *ad > *bd ) + return -1; + else + return 1; +} + +/** + * table_output: + * + * Update the given widgets table with the values from the track stats + */ +static void table_output ( track_stats ts, GtkWidget *content[], gboolean extended ) +{ + int cnt = 0; + + gchar tmp_buf[64]; + g_snprintf ( tmp_buf, sizeof(tmp_buf), "%d", ts.count ); + gtk_label_set_text ( GTK_LABEL(content[cnt++]), tmp_buf ); + + if ( ts.count == 0 ) { + // Blank all other fields + g_snprintf ( tmp_buf, sizeof(tmp_buf), "--" ); + for ( cnt = 1; cnt < G_N_ELEMENTS(label_texts); cnt++ ) + gtk_label_set_text ( GTK_LABEL(content[cnt]), tmp_buf ); + return; + } + + // Check for potential date range + // Test if the same day by comparing the date string of the timestamp + GDate* gdate_start = g_date_new (); + g_date_set_time_t ( gdate_start, ts.start_time ); + gchar time_start[32]; + g_date_strftime ( time_start, sizeof(time_start), "%x", gdate_start ); + g_date_free ( gdate_start ); + + GDate* gdate_end = g_date_new (); + g_date_set_time_t ( gdate_end, ts.end_time ); + gchar time_end[32]; + g_date_strftime ( time_end, sizeof(time_end), "%x", gdate_end ); + g_date_free ( gdate_end ); + + if ( ts.start_time == ts.end_time ) + g_snprintf ( tmp_buf, sizeof(tmp_buf), _("No Data") ); + else if ( strncmp(time_start, time_end, 32) ) + g_snprintf ( tmp_buf, sizeof(tmp_buf), "%s --> %s", time_start, time_end ); + else + g_snprintf ( tmp_buf, sizeof(tmp_buf), "%s", time_start ); + + gtk_label_set_text ( GTK_LABEL(content[cnt++]), tmp_buf ); + + switch (a_vik_get_units_distance ()) { + case VIK_UNITS_DISTANCE_MILES: + g_snprintf ( tmp_buf, sizeof(tmp_buf), _("%.1f miles"), VIK_METERS_TO_MILES(ts.length) ); + break; + case VIK_UNITS_DISTANCE_NAUTICAL_MILES: + g_snprintf ( tmp_buf, sizeof(tmp_buf), _("%.1f NM"), VIK_METERS_TO_NAUTICAL_MILES(ts.length) ); + break; + default: + //VIK_UNITS_DISTANCE_KILOMETRES + g_snprintf ( tmp_buf, sizeof(tmp_buf), _("%.1f km"), ts.length/1000.0 ); + break; + } + gtk_label_set_text ( GTK_LABEL(content[cnt++]), tmp_buf ); + + switch (a_vik_get_units_distance ()) { + case VIK_UNITS_DISTANCE_MILES: + g_snprintf ( tmp_buf, sizeof(tmp_buf), _("%.2f miles"), (VIK_METERS_TO_MILES(ts.length)/ts.count) ); + break; + case VIK_UNITS_DISTANCE_NAUTICAL_MILES: + g_snprintf ( tmp_buf, sizeof(tmp_buf), _("%.2f NM"), (VIK_METERS_TO_NAUTICAL_MILES(ts.length)/ts.count) ); + break; + default: + //VIK_UNITS_DISTANCE_KILOMETRES + g_snprintf ( tmp_buf, sizeof(tmp_buf), _("%.2f km"), ts.length/(1000.0*ts.count) ); + break; + } + gtk_label_set_text ( GTK_LABEL(content[cnt++]), tmp_buf ); + + if ( extended ) { + // Note that this currently is a simplified approach to calculate the Eddington number. + // In that a per track value is used, rather than trying to work out a length per day. + // (i.e. doesn't combine multiple tracks for a single day or split very long tracks into days) + tracks_stats[TS_TRACKS].e_list = g_list_sort ( tracks_stats[TS_TRACKS].e_list, rsort_by_distance ); + guint Eddington = 0; + guint position = 0; + for (GList *iter = g_list_first (tracks_stats[TS_TRACKS].e_list); iter != NULL; iter = g_list_next (iter)) { + position++; + gdouble *num = (gdouble*)iter->data; + if ( *num > position ) + Eddington = position; + } + g_snprintf ( tmp_buf, sizeof(tmp_buf), ("%d"), Eddington ); + gtk_label_set_text ( GTK_LABEL(content[cnt++]), tmp_buf ); + } else + cnt++; + + // I'm sure this could be cleaner... + g_snprintf ( tmp_buf, sizeof(tmp_buf), "--" ); + switch (a_vik_get_units_speed()) { + case VIK_UNITS_SPEED_MILES_PER_HOUR: + if ( ts.max_speed > 0 ) + g_snprintf ( tmp_buf, sizeof(tmp_buf), _("%.1f mph"), (double)VIK_MPS_TO_MPH(ts.max_speed) ); + gtk_label_set_text ( GTK_LABEL(content[cnt++]), tmp_buf ); + if ( ts.duration > 0 ) + g_snprintf ( tmp_buf, sizeof(tmp_buf), ("%.1f mph"), (double)VIK_MPS_TO_MPH(ts.length/ts.duration) ); + else + g_snprintf ( tmp_buf, sizeof(tmp_buf), "--" ); + break; + case VIK_UNITS_SPEED_METRES_PER_SECOND: + if ( ts.max_speed > 0 ) + g_snprintf ( tmp_buf, sizeof(tmp_buf), _("%.2f m/s"), (double)ts.max_speed ); + gtk_label_set_text ( GTK_LABEL(content[cnt++]), tmp_buf ); + if ( ts.duration > 0 ) + g_snprintf ( tmp_buf, sizeof(tmp_buf), ("%.2f m/s"), (double)(ts.length/ts.duration) ); + else + g_snprintf ( tmp_buf, sizeof(tmp_buf), "--" ); + break; + case VIK_UNITS_SPEED_KNOTS: + if ( ts.max_speed > 0 ) + g_snprintf ( tmp_buf, sizeof(tmp_buf), _("%.2f knots"), (double)VIK_MPS_TO_KNOTS(ts.max_speed) ); + gtk_label_set_text ( GTK_LABEL(content[cnt++]), tmp_buf ); + if ( ts.duration > 0 ) + g_snprintf ( tmp_buf, sizeof(tmp_buf), _("%.2f knots"), (double)VIK_MPS_TO_KNOTS(ts.length/ts.duration) ); + else + g_snprintf ( tmp_buf, sizeof(tmp_buf), "--" ); + break; + case VIK_UNITS_SPEED_SECONDS_PER_KM: + if ( ts.max_speed > 0 ) + g_snprintf ( tmp_buf, sizeof(tmp_buf), _("%d s/km"), (int)VIK_MPS_TO_PACE_SPK(ts.max_speed) ); + gtk_label_set_text ( GTK_LABEL(content[cnt++]), tmp_buf ); + if ( ts.duration > 0 ) + g_snprintf ( tmp_buf, sizeof(tmp_buf), _("%d s/km"), (int)VIK_MPS_TO_PACE_SPK(ts.length/ts.duration) ); + else + g_snprintf ( tmp_buf, sizeof(tmp_buf), "--" ); + break; + + case VIK_UNITS_SPEED_MINUTES_PER_KM: + if ( ts.max_speed > 0 ) + g_snprintf ( tmp_buf, sizeof(tmp_buf), _("%.1f min/km"), (double)VIK_MPS_TO_PACE_MPK(ts.max_speed) ); + gtk_label_set_text ( GTK_LABEL(content[cnt++]), tmp_buf ); + if ( ts.duration > 0 ) + g_snprintf ( tmp_buf, sizeof(tmp_buf), _("%.1f min/km"), (double)VIK_MPS_TO_PACE_MPK(ts.length/ts.duration) ); + else + g_snprintf ( tmp_buf, sizeof(tmp_buf), "--" ); + break; + + case VIK_UNITS_SPEED_SECONDS_PER_MILE: + if ( ts.max_speed > 0 ) + g_snprintf ( tmp_buf, sizeof(tmp_buf), _("%d sec/mi"), (int)VIK_MPS_TO_PACE_SPM(ts.max_speed) ); + gtk_label_set_text ( GTK_LABEL(content[cnt++]), tmp_buf ); + if ( ts.duration > 0 ) + g_snprintf ( tmp_buf, sizeof(tmp_buf), _("%d sec/mi"), (int)VIK_MPS_TO_PACE_SPM(ts.length/ts.duration) ); + else + g_snprintf ( tmp_buf, sizeof(tmp_buf), "--" ); + break; + + case VIK_UNITS_SPEED_MINUTES_PER_MILE: + if ( ts.max_speed > 0 ) + g_snprintf ( tmp_buf, sizeof(tmp_buf), _("%.1f min/mi"), (double)VIK_MPS_TO_PACE_MPM(ts.max_speed) ); + gtk_label_set_text ( GTK_LABEL(content[cnt++]), tmp_buf ); + if ( ts.duration > 0 ) + g_snprintf ( tmp_buf, sizeof(tmp_buf), _("%.1f min/mi"), (double)VIK_MPS_TO_PACE_MPM(ts.length/ts.duration) ); + else + g_snprintf ( tmp_buf, sizeof(tmp_buf), "--" ); + break; + + default: + //VIK_UNITS_SPEED_KILOMETRES_PER_HOUR: + if ( ts.max_speed > 0 ) + g_snprintf ( tmp_buf, sizeof(tmp_buf), _("%.2f km/h"), (double)VIK_MPS_TO_KPH(ts.max_speed) ); + gtk_label_set_text ( GTK_LABEL(content[cnt++]), tmp_buf ); + if ( ts.duration > 0 ) + g_snprintf ( tmp_buf, sizeof(tmp_buf), _("%.2f km/h"), (double)VIK_MPS_TO_KPH(ts.length/ts.duration) ); + else + g_snprintf ( tmp_buf, sizeof(tmp_buf), "--" ); + break; + } + gtk_label_set_text ( GTK_LABEL(content[cnt++]), tmp_buf ); + + switch ( a_vik_get_units_height() ) { + // Note always round off height value output since sub unit accuracy is overkill + case VIK_UNITS_HEIGHT_FEET: + if ( ts.min_alt != VIK_VAL_MIN_ALT ) + g_snprintf ( tmp_buf, sizeof(tmp_buf), _("%d feet"), (int)round(VIK_METERS_TO_FEET(ts.min_alt)) ); + else + g_snprintf ( tmp_buf, sizeof(tmp_buf), "--" ); + gtk_label_set_text ( GTK_LABEL(content[cnt++]), tmp_buf ); + + if ( ts.max_alt != VIK_VAL_MAX_ALT ) + g_snprintf ( tmp_buf, sizeof(tmp_buf), _("%d feet"), (int)round(VIK_METERS_TO_FEET(ts.max_alt)) ); + else + g_snprintf ( tmp_buf, sizeof(tmp_buf), "--" ); + gtk_label_set_text ( GTK_LABEL(content[cnt++]), tmp_buf ); + + g_snprintf ( tmp_buf, sizeof(tmp_buf), _("%d feet / %d feet"), (int)round(VIK_METERS_TO_FEET(ts.elev_gain)), (int)round(VIK_METERS_TO_FEET(ts.elev_loss)) ); + gtk_label_set_text ( GTK_LABEL(content[cnt++]), tmp_buf ); + g_snprintf ( tmp_buf, sizeof(tmp_buf), _("%d feet / %d feet"), (int)round(VIK_METERS_TO_FEET(ts.elev_gain/ts.count)), (int)round(VIK_METERS_TO_FEET(ts.elev_loss/ts.count)) ); + break; + default: + //VIK_UNITS_HEIGHT_METRES + if ( ts.min_alt != VIK_VAL_MIN_ALT ) + g_snprintf ( tmp_buf, sizeof(tmp_buf), _("%d m"), (int)round(ts.min_alt) ); + else + g_snprintf ( tmp_buf, sizeof(tmp_buf), "--" ); + gtk_label_set_text ( GTK_LABEL(content[cnt++]), tmp_buf ); + + if ( ts.max_alt != VIK_VAL_MAX_ALT ) + g_snprintf ( tmp_buf, sizeof(tmp_buf), _("%d m"), (int)round(ts.max_alt) ); + else + g_snprintf ( tmp_buf, sizeof(tmp_buf), "--" ); + gtk_label_set_text ( GTK_LABEL(content[cnt++]), tmp_buf ); + + g_snprintf ( tmp_buf, sizeof(tmp_buf), _("%d m / %d m"), (int)round(ts.elev_gain), (int)round(ts.elev_loss) ); + gtk_label_set_text ( GTK_LABEL(content[cnt++]), tmp_buf ); + g_snprintf ( tmp_buf, sizeof(tmp_buf), _("%d m / %d m"), (int)round(ts.elev_gain/ts.count), (int)round(ts.elev_loss/ts.count) ); + break; + } + gtk_label_set_text ( GTK_LABEL(content[cnt++]), tmp_buf ); + + gint hours; + gint minutes; + gint days; + // Total Duration + days = (gint)(ts.duration / (60*60*24)); + hours = (gint)floor((ts.duration - (days*60*60*24)) / (60*60)); + minutes = (gint)((ts.duration - (days*60*60*24) - (hours*60*60)) / 60); + g_snprintf ( tmp_buf, sizeof(tmp_buf), _("%d:%02d:%02d days:hrs:mins"), days, hours, minutes ); + gtk_label_set_text ( GTK_LABEL(content[cnt++]), tmp_buf ); + + // Average Duration + gint avg_dur = ts.duration / ts.count; + hours = (gint)floor(avg_dur / (60*60)); + minutes = (gint)((avg_dur - (hours*60*60)) / 60); + g_snprintf ( tmp_buf, sizeof(tmp_buf), _("%d:%02d hrs:mins"), hours, minutes ); + gtk_label_set_text ( GTK_LABEL(content[cnt++]), tmp_buf ); +} + +/** + * val_analyse_item_maybe: + * @vtlist: A track and the associated layer to consider for analysis + * @data: Whether to include invisible items + * + * Analyse this particular track + * considering whether it should be included depending on it's visibility + */ +static void val_analyse_item_maybe ( vik_trw_track_list_t *vtlist, const gpointer data ) +{ + gboolean include_invisible = GPOINTER_TO_INT(data); + VikTrack *trk = vtlist->trk; + VikTrwLayer *vtl = vtlist->vtl; + + // Safety first - items shouldn't be deleted... + if ( !IS_VIK_TRW_LAYER(vtl) ) return; + if ( !trk ) return; + + if ( !include_invisible ) { + // Skip invisible layers or sublayers + if ( !VIK_LAYER(vtl)->visible || + (trk->is_route && !vik_trw_layer_get_routes_visibility(vtl)) || + (!trk->is_route && !vik_trw_layer_get_tracks_visibility(vtl)) ) + return; + + // Skip invisible tracks + if ( !trk->visible ) + return; + } + + val_analyse_track ( trk ); +} + +/** + * val_analyse: + * @widgets: The widget layout + * @tracks_and_layers: A list of #vik_trw_track_list_t + * @include_invisible: Whether to include invisible layers and tracks + * + * Analyse each item in the @tracks_and_layers list + * + */ +void val_analyse ( GtkWidget *widgets[], GList *tracks_and_layers, gboolean include_invisible, gboolean extended ) +{ + val_reset ( TS_TRACKS ); + + GList *gl = g_list_first ( tracks_and_layers ); + if ( gl ) { + g_list_foreach ( gl, (GFunc) val_analyse_item_maybe, GINT_TO_POINTER(include_invisible) ); + } + + table_output ( tracks_stats[TS_TRACKS], widgets, extended ); + + g_list_free_full ( tracks_stats[TS_TRACKS].e_list, g_free ); +} + +typedef struct { + GtkWidget **widgets; + GtkWidget *layout; + GtkWidget *check_button; + GList *tracks_and_layers; + VikLayer *vl; + gpointer user_data; + VikTrwlayerGetTracksAndLayersFunc get_tracks_and_layers_cb; + VikTrwlayerAnalyseCloseFunc on_close_cb; + gboolean extended; +} analyse_cb_t; + +static void include_invisible_toggled_cb ( GtkToggleButton *togglebutton, analyse_cb_t *acb ) +{ + gboolean value = FALSE; + if ( gtk_toggle_button_get_active ( togglebutton ) ) + value = TRUE; + + // Delete old list of items + if ( acb->tracks_and_layers ) { + g_list_foreach ( acb->tracks_and_layers, (GFunc) g_free, NULL ); + g_list_free ( acb->tracks_and_layers ); + } + + // Get the latest list of items to analyse + acb->tracks_and_layers = acb->get_tracks_and_layers_cb ( acb->vl, acb->user_data ); + + val_analyse ( acb->widgets, acb->tracks_and_layers, value, acb->extended ); + gtk_widget_show_all ( acb->layout ); +} + +#define VIK_SETTINGS_ANALYSIS_DO_INVISIBLE "track_analysis_do_invisible" + +/** + * analyse_close: + * + * Multi stage closure - as we need to clear allocations made here + * before passing on to the callee so they know then the dialog is closed too + */ +static void analyse_close ( GtkWidget *dialog, gint resp, analyse_cb_t *data ) +{ + // Save current invisible value for next time + gboolean do_invisible = gtk_toggle_button_get_active ( GTK_TOGGLE_BUTTON(data->check_button) ); + a_settings_set_boolean ( VIK_SETTINGS_ANALYSIS_DO_INVISIBLE, do_invisible ); + + //g_free ( data->layout ); + g_free ( data->widgets ); + g_list_foreach ( data->tracks_and_layers, (GFunc) g_free, NULL ); + g_list_free ( data->tracks_and_layers ); + + if ( data->on_close_cb ) + data->on_close_cb ( dialog, resp, data->vl ); + + g_free ( data ); +} + +/** + * vik_trw_layer_analyse_this: + * @window: A window from which the dialog will be derived + * @name: The name to be shown + * @vl: The #VikLayer passed on into get_tracks_and_layers_cb() + * @user_data: Data passed on into get_tracks_and_layers_cb() + * @get_tracks_and_layers_cb: The function to call to construct items to be analysed + * + * Display a dialog with stats across many tracks + * + * Returns: The dialog that is created to display the analyse information + */ +GtkWidget* vik_trw_layer_analyse_this ( GtkWindow *window, + const gchar *name, + VikLayer *vl, + gpointer user_data, + VikTrwlayerGetTracksAndLayersFunc get_tracks_and_layers_cb, + VikTrwlayerAnalyseCloseFunc on_close_cb ) +{ + //VikWindow *vw = VIK_WINDOW(window); + + GtkWidget *dialog; + dialog = gtk_dialog_new_with_buttons ( _("Statistics"), + window, + GTK_DIALOG_DESTROY_WITH_PARENT, + GTK_STOCK_CLOSE, GTK_RESPONSE_CANCEL, + NULL ); + + GtkWidget *name_l = gtk_label_new ( NULL ); + gchar *myname = g_markup_printf_escaped ( "%s", name ); + gtk_label_set_markup ( GTK_LABEL(name_l), myname ); + g_free ( myname ); + + GtkWidget *content = gtk_dialog_get_content_area ( GTK_DIALOG(dialog) ); + gtk_box_pack_start ( GTK_BOX(content), name_l, FALSE, FALSE, 10); + + // Get previous value (if any) from the settings + gboolean include_invisible; + if ( ! a_settings_get_boolean ( VIK_SETTINGS_ANALYSIS_DO_INVISIBLE, &include_invisible ) ) + include_invisible = TRUE; + + analyse_cb_t *acb = g_malloc (sizeof(analyse_cb_t)); + acb->vl = vl; + acb->user_data = user_data; + acb->get_tracks_and_layers_cb = get_tracks_and_layers_cb; + acb->on_close_cb = on_close_cb; + acb->tracks_and_layers = get_tracks_and_layers_cb ( vl, user_data ); + acb->widgets = g_malloc ( sizeof(GtkWidget*) * G_N_ELEMENTS(label_texts) ); + acb->extended = vl->type == VIK_LAYER_AGGREGATE; + acb->layout = create_layout ( acb->widgets, acb->extended ); + + gtk_box_pack_start ( GTK_BOX(content), acb->layout, FALSE, FALSE, 0 ); + + // Analysis seems reasonably quick + // unless you have really large numbers of tracks (i.e. many many thousands or a really slow computer) + // One day might store stats in the track itself.... + val_analyse ( acb->widgets, acb->tracks_and_layers, include_invisible, acb->extended ); + + GtkWidget *cb = gtk_check_button_new_with_label ( _("Include Invisible Items") ); + gtk_toggle_button_set_active ( GTK_TOGGLE_BUTTON(cb), include_invisible ); + gtk_box_pack_start ( GTK_BOX(content), cb, FALSE, FALSE, 10); + acb->check_button = cb; + + gtk_widget_show_all ( dialog ); + + g_signal_connect ( G_OBJECT(cb), "toggled", G_CALLBACK(include_invisible_toggled_cb), acb ); + g_signal_connect ( G_OBJECT(dialog), "response", G_CALLBACK(analyse_close), acb ); + + return dialog; +} diff --git a/src/viktrwlayer_analysis.h b/src/viktrwlayer_analysis.h new file mode 100644 index 0000000..cb28065 --- /dev/null +++ b/src/viktrwlayer_analysis.h @@ -0,0 +1,41 @@ +/* -*- Mode: C; indent-tabs-mode: t; c-basic-offset: 4; tab-width: 4 -*- */ +/* + * viking -- GPS Data and Topo Analyzer, Explorer, and Manager + * + * Copyright (C) 2013 Rob Norris + * + * 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., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA + * + *********************************************************** + */ + +#ifndef _VIKING_TRWLAYER_ANALYSIS_H +#define _VIKING_TRWLAYER_ANALYSIS_H + +#include "viktrwlayer.h" + +G_BEGIN_DECLS +typedef void (*VikTrwlayerAnalyseCloseFunc) (GtkWidget*, gint, VikLayer*); + +GtkWidget* vik_trw_layer_analyse_this ( GtkWindow *window, + const gchar *name, + VikLayer *vl, + gpointer user_data, + VikTrwlayerGetTracksAndLayersFunc get_tracks_and_layers_cb, + VikTrwlayerAnalyseCloseFunc on_close_cb ); + +G_END_DECLS + +#endif diff --git a/src/viktrwlayer_export.c b/src/viktrwlayer_export.c new file mode 100644 index 0000000..4333f4c --- /dev/null +++ b/src/viktrwlayer_export.c @@ -0,0 +1,324 @@ + +/* -*- Mode: C; indent-tabs-mode: t; c-basic-offset: 4; tab-width: 4 -*- */ +/* + * viking -- GPS Data and Topo Analyzer, Explorer, and Manager + * + * Copyright (C) 2013, Guilhem Bonnefille + * + * 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., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA + * + */ +#include +#include +#include +#include +#include +#include +#include + +#include "babel.h" +#include "babel_ui.h" +#include "viking.h" +#include "viktrwlayer_export.h" +#include "gpx.h" +#include "preferences.h" + +static gchar *last_folder_uri = NULL; + +#define VIK_PREFS_EXPORT_DEVICE_SIMPLIFY VIKING_PREFERENCES_IO_NAMESPACE"external_auto_device_gpx_simplify" + +#define VIK_SETTINGS_EXPORT_DEVICE_PATH "export_device_path" +#define VIK_SETTINGS_EXPORT_DEVICE_SIMPLIFY_TRACKPOINT_LIMIT "export_device_trackpoint_limit" +#define VIK_SETTINGS_EXPORT_DEVICE_SIMPLIFY_ROUTEPOINT_LIMIT "export_device_routepoint_limit" + +static VikLayerParam io_prefs[] = { + { VIK_LAYER_NUM_TYPES, VIK_PREFS_EXPORT_DEVICE_SIMPLIFY, VIK_LAYER_PARAM_BOOLEAN, VIK_LAYER_GROUP_NONE, N_("Auto Device GPX Simplify:"), VIK_LAYER_WIDGET_CHECKBUTTON, NULL, NULL, + N_("GPX saves to certain devices will be simplified for device compatibility."), NULL, NULL, NULL }, +}; + +void vik_trw_layer_export_init () +{ + VikLayerParamData tmp; + tmp.b = FALSE; + a_preferences_register(&io_prefs[0], tmp, VIKING_PREFERENCES_IO_GROUP_KEY); +} + +static gboolean gpx_export_simplify_layer ( VikTrwLayer *vtl, const gchar *fn, VikTrack* trk ) +{ + // Note GPSBabel simplify has single value applied to tracks and routes + // Try to use the best value + // However this means if there is a mixture of tracks and routes, + // the tracks will be over-simplified + // The defaults are for Garmin Edge series + gint tmp; + guint limit = 10000; // ETrex 20 is 500 + if ( a_settings_get_integer ( VIK_SETTINGS_EXPORT_DEVICE_SIMPLIFY_TRACKPOINT_LIMIT, &tmp ) ) + limit = tmp; + + // If any routes - apply route limit as that's normally alot lower + gboolean got_route = FALSE; + if ( trk ) + got_route = trk->is_route; + + if ( !got_route ) { + if ( g_hash_table_size (vik_trw_layer_get_routes(vtl)) ) { + gint tmp; + if ( a_settings_get_integer ( VIK_SETTINGS_EXPORT_DEVICE_SIMPLIFY_ROUTEPOINT_LIMIT, &tmp ) ) + limit = tmp; + else + limit = 250; // Route capacity is relatively limited + } + // NB If there are tracks and trackpoints much > (route)limit, + // could warn that tracks may be overily simplified + // and ask to continue... + } + + gboolean need_simplify = FALSE; + if ( trk ) { + if ( vik_track_get_tp_count(trk) > limit ) + need_simplify = TRUE; + } + else { + // Check all tracks & routes in the layer + gpointer key, value; + GHashTableIter ght_iter; + // See if any tracks exceed point number limit + g_hash_table_iter_init ( &ght_iter, vik_trw_layer_get_tracks ( vtl ) ); + while ( g_hash_table_iter_next (&ght_iter, &key, &value) ) { + if ( vik_track_get_tp_count (VIK_TRACK(value)) > limit ) { + need_simplify = TRUE; + break; + } + } + if ( !need_simplify ) { + // See if any routes exceed point number limit + g_hash_table_iter_init ( &ght_iter, vik_trw_layer_get_routes ( vtl ) ); + while ( g_hash_table_iter_next (&ght_iter, &key, &value) ) { + if ( vik_track_get_tp_count (VIK_TRACK(value)) > limit ) { + need_simplify = TRUE; + break; + } + } + } + } + + gboolean ans = FALSE; + + if ( need_simplify ) { + if ( a_babel_available() ) { + gchar *filter = g_strdup_printf ( "-x simplify,count=%d -o gpx", limit ); + ans = a_babel_convert_to ( vtl, trk, filter, fn, NULL, NULL ); + g_free ( filter ); + if ( ans ) { + gchar *msg = g_strdup_printf ( _("Export of GPX file simplified using point limit: %d"), limit ); + a_dialog_info_msg ( VIK_GTK_WINDOW_FROM_LAYER(vtl), msg ); + g_free ( msg ); + } + } + } + + return ans; +} + +static gboolean gpx_export ( VikTrwLayer *vtl, const gchar *fn, VikTrack* trk ) +{ + // Note one could attempt to detect which device it is being saved to + // e.g. using libusb-1.0 - example: + // https://github.com/libusb/libusb/blob/master/examples/testlibusb.c + + // http://www.linux-usb.org/usb.ids + // And then knowledge of which GPSes have differing limits. + // It might not be possible to differentiate between devices if the USB id is the same + // e.g. Etrex 20 vs Etrex 30 - but I think these have the same limitations. + // and whether file is actually being saved on to the device(s) detected + gboolean auto_simplify = a_preferences_get (VIK_PREFS_EXPORT_DEVICE_SIMPLIFY)->b; + if ( auto_simplify ) { + // Check path of 'fn' for device match + gchar *device_path = NULL; + if ( !a_settings_get_string ( VIK_SETTINGS_EXPORT_DEVICE_PATH, &device_path ) ) { +#ifdef WINDOWS + device_path = g_strdup (":\Garmin\GPX"); +#else + device_path = g_strdup_printf ( "/media/%s/GARMIN/Garmin/GPX", g_getenv("USER") ); +#endif + } + gboolean simplified = FALSE; + if ( g_strrstr(fn, device_path) ) { + simplified = gpx_export_simplify_layer ( vtl, fn, trk ); + } + g_free ( device_path ); + if ( simplified ) + return TRUE; + } + + return a_file_export ( vtl, fn, FILE_TYPE_GPX, trk, trk ? TRUE : FALSE ); +} + +void vik_trw_layer_export ( VikTrwLayer *vtl, const gchar *title, const gchar* default_name, VikTrack* trk, VikFileType_t file_type ) +{ + GtkWidget *file_selector; + const gchar *fn; + gboolean failed = FALSE; + file_selector = gtk_file_chooser_dialog_new (title, + NULL, + GTK_FILE_CHOOSER_ACTION_SAVE, + GTK_STOCK_CANCEL, GTK_RESPONSE_CANCEL, + GTK_STOCK_SAVE, GTK_RESPONSE_ACCEPT, + NULL); + if ( last_folder_uri ) + gtk_file_chooser_set_current_folder_uri ( GTK_FILE_CHOOSER(file_selector), last_folder_uri ); + + gtk_file_chooser_set_current_name ( GTK_FILE_CHOOSER(file_selector), default_name ); + + while ( gtk_dialog_run ( GTK_DIALOG(file_selector) ) == GTK_RESPONSE_ACCEPT ) + { + fn = gtk_file_chooser_get_filename ( GTK_FILE_CHOOSER(file_selector) ); + if ( g_file_test ( fn, G_FILE_TEST_EXISTS ) == FALSE || + a_dialog_yes_or_no ( GTK_WINDOW(file_selector), _("The file \"%s\" exists, do you wish to overwrite it?"), a_file_basename ( fn ) ) ) + { + g_free ( last_folder_uri ); + last_folder_uri = gtk_file_chooser_get_current_folder_uri ( GTK_FILE_CHOOSER(file_selector) ); + + gtk_widget_hide ( file_selector ); + vik_window_set_busy_cursor ( VIK_WINDOW(VIK_GTK_WINDOW_FROM_LAYER(vtl)) ); + // Don't Export invisible items - unless requested on this specific track + if ( file_type == FILE_TYPE_GPX ) + failed = ! gpx_export ( vtl, fn, trk ); + else + failed = ! a_file_export ( vtl, fn, file_type, trk, trk ? TRUE : FALSE ); + vik_window_clear_busy_cursor ( VIK_WINDOW(VIK_GTK_WINDOW_FROM_LAYER(vtl)) ); + break; + } + } + gtk_widget_destroy ( file_selector ); + if ( failed ) + a_dialog_error_msg ( VIK_GTK_WINDOW_FROM_LAYER(vtl), _("The filename you requested could not be opened for writing.") ); +} + + +/** + * Convert the given TRW layer into a temporary GPX file and open it with the specified program + * + */ +void vik_trw_layer_export_external_gpx ( VikTrwLayer *vtl, const gchar* external_program ) +{ + // Don't Export invisible items + static GpxWritingOptions options = { TRUE, TRUE, FALSE, FALSE }; + gchar *name_used = a_gpx_write_tmp_file ( vtl, &options ); + + if ( name_used ) { + GError *err = NULL; + gchar *quoted_file = g_shell_quote ( name_used ); + gchar *cmd = g_strdup_printf ( "%s %s", external_program, quoted_file ); + g_free ( quoted_file ); + if ( ! g_spawn_command_line_async ( cmd, &err ) ) { + a_dialog_error_msg_extra ( VIK_GTK_WINDOW_FROM_LAYER( vtl), _("Could not launch %s."), external_program ); + g_error_free ( err ); + } + g_free ( cmd ); + util_add_to_deletion_list ( name_used ); + g_free ( name_used ); + } + else + a_dialog_error_msg (VIK_GTK_WINDOW_FROM_LAYER(vtl), _("Could not create temporary file for export.") ); +} + + +void vik_trw_layer_export_gpsbabel ( VikTrwLayer *vtl, const gchar *title, const gchar* default_name ) +{ + BabelMode mode = { 0, 0, 0, 0, 0, 0 }; + if ( g_hash_table_size (vik_trw_layer_get_routes(vtl)) ) { + mode.routesWrite = 1; + } + if ( g_hash_table_size (vik_trw_layer_get_tracks(vtl)) ) { + mode.tracksWrite = 1; + } + if ( g_hash_table_size (vik_trw_layer_get_waypoints(vtl)) ) { + mode.waypointsWrite = 1; + } + + GtkWidget *file_selector; + const gchar *fn; + gboolean failed = FALSE; + file_selector = gtk_file_chooser_dialog_new (title, + NULL, + GTK_FILE_CHOOSER_ACTION_SAVE, + GTK_STOCK_CANCEL, GTK_RESPONSE_CANCEL, + GTK_STOCK_SAVE, GTK_RESPONSE_ACCEPT, + NULL); + gchar *cwd = g_get_current_dir(); + if ( cwd ) { + gtk_file_chooser_set_current_folder ( GTK_FILE_CHOOSER(file_selector), cwd ); + g_free ( cwd ); + } + + /* Build the extra part of the widget */ + GtkWidget *babel_selector = a_babel_ui_file_type_selector_new ( mode ); + GtkWidget *label = gtk_label_new(_("File format:")); + GtkWidget *hbox = gtk_hbox_new(FALSE, 0); + gtk_box_pack_start ( GTK_BOX(hbox), label, TRUE, TRUE, 0 ); + gtk_box_pack_start ( GTK_BOX(hbox), babel_selector, TRUE, TRUE, 0 ); + gtk_widget_show (babel_selector); + gtk_widget_show (label); + gtk_widget_show_all (hbox); + + gtk_widget_set_tooltip_text( babel_selector, _("Select the file format.") ); + + GtkWidget *babel_modes = a_babel_ui_modes_new(mode.tracksWrite, mode.routesWrite, mode.waypointsWrite); + gtk_widget_show (babel_modes); + + gtk_widget_set_tooltip_text( babel_modes, _("Select the information to process.\n" + "Warning: the behavior of these switches is highly dependent of the file format selected.\n" + "Please, refer to GPSbabel if unsure.") ); + + GtkWidget *vbox = gtk_vbox_new(FALSE, 0); + gtk_box_pack_start ( GTK_BOX(vbox), hbox, TRUE, TRUE, 0 ); + gtk_box_pack_start ( GTK_BOX(vbox), babel_modes, TRUE, TRUE, 0 ); + gtk_widget_show_all (vbox); + + gtk_file_chooser_set_extra_widget (GTK_FILE_CHOOSER(file_selector), vbox); + + /* Add some dynamic: only allow dialog's validation when format selection is done */ + g_signal_connect (babel_selector, "changed", G_CALLBACK(a_babel_ui_type_selector_dialog_sensitivity_cb), file_selector); + /* Manually call the callback to fix the state */ + a_babel_ui_type_selector_dialog_sensitivity_cb ( GTK_COMBO_BOX(babel_selector), file_selector); + + /* Set possible name of the file */ + gtk_file_chooser_set_current_name (GTK_FILE_CHOOSER(file_selector), default_name); + + while ( gtk_dialog_run ( GTK_DIALOG(file_selector) ) == GTK_RESPONSE_ACCEPT ) + { + fn = gtk_file_chooser_get_filename (GTK_FILE_CHOOSER(file_selector) ); + if ( g_file_test ( fn, G_FILE_TEST_EXISTS ) == FALSE || + a_dialog_yes_or_no ( GTK_WINDOW(file_selector), _("The file \"%s\" exists, do you wish to overwrite it?"), a_file_basename ( fn ) ) ) + { + BabelFile *active = a_babel_ui_file_type_selector_get(babel_selector); + if (active == NULL) { + a_dialog_error_msg ( VIK_GTK_WINDOW_FROM_LAYER(vtl), _("You did not select a valid file format.") ); + } else { + gtk_widget_hide ( file_selector ); + vik_window_set_busy_cursor ( VIK_WINDOW(VIK_GTK_WINDOW_FROM_LAYER(vtl)) ); + gboolean tracks, routes, waypoints; + a_babel_ui_modes_get( babel_modes, &tracks, &routes, &waypoints ); + failed = ! a_file_export_babel ( vtl, fn, active->name, tracks, routes, waypoints ); + vik_window_clear_busy_cursor ( VIK_WINDOW(VIK_GTK_WINDOW_FROM_LAYER(vtl)) ); + break; + } + } + } + //babel_ui_selector_destroy(babel_selector); + gtk_widget_destroy ( file_selector ); + if ( failed ) + a_dialog_error_msg ( VIK_GTK_WINDOW_FROM_LAYER(vtl), _("The filename you requested could not be opened for writing.") ); +} diff --git a/src/viktrwlayer_export.h b/src/viktrwlayer_export.h new file mode 100644 index 0000000..6ee5374 --- /dev/null +++ b/src/viktrwlayer_export.h @@ -0,0 +1,40 @@ +/* -*- Mode: C; indent-tabs-mode: t; c-basic-offset: 4; tab-width: 4 -*- */ +/* + * viking -- GPS Data and Topo Analyzer, Explorer, and Manager + * + * Copyright (C) 2013, Guilhem Bonnefille + * + * 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., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA + * + */ + +#ifndef _VIKING_TRWLAYER_EXPORT_H +#define _VIKING_TRWLAYER_EXPORT_H + +#include "viktrwlayer.h" + +G_BEGIN_DECLS + +void vik_trw_layer_export ( VikTrwLayer *vtl, const gchar *title, const gchar* default_name, VikTrack* trk, VikFileType_t file_type ); + +void vik_trw_layer_export_external_gpx ( VikTrwLayer *vtl, const gchar* external_program ); + +void vik_trw_layer_export_gpsbabel ( VikTrwLayer *vtl, const gchar *title, const gchar* default_name ); + +void vik_trw_layer_export_init (); + +G_END_DECLS + +#endif diff --git a/src/viktrwlayer_geotag.c b/src/viktrwlayer_geotag.c new file mode 100644 index 0000000..40b2c91 --- /dev/null +++ b/src/viktrwlayer_geotag.c @@ -0,0 +1,767 @@ +/* -*- Mode: C; indent-tabs-mode: t; c-basic-offset: 4; tab-width: 4 -*- */ +/* + * viking -- GPS Data and Topo Analyzer, Explorer, and Manager + * + * Copyright (C) 2011, Rob Norris + * + * 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., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA + * + */ +/* + * Similar to the track and trackpoint properties dialogs, + * this is made a separate file for ease of grouping related stuff together + */ +#ifdef HAVE_CONFIG_H +#include "config.h" +#endif +#include +#include +#include +#include +#include +#include +#include "viking.h" +#include "vikfilelist.h" +#include "geotag_exif.h" +#include "thumbnails.h" +#include "background.h" + +// Function taken from GPSCorrelate 1.6.1 +// ConvertToUnixTime Copyright 2005 Daniel Foote. GPL2+ + +#define EXIF_DATE_FORMAT "%d:%d:%d %d:%d:%d" + +time_t ConvertToUnixTime(char* StringTime, char* Format, int TZOffsetHours, int TZOffsetMinutes) +{ + /* Read the time using the specified format. + * The format and string being read from must + * have the most significant time on the left, + * and the least significant on the right: + * ie, Year on the left, seconds on the right. */ + + /* Sanity check... */ + if (StringTime == NULL || Format == NULL) + { + return 0; + } + + /* Define and set up our structure. */ + struct tm Time; + Time.tm_wday = 0; + Time.tm_yday = 0; + Time.tm_isdst = 0; // there is no DST in UTC + + /* Read out the time from the string using our format. */ + sscanf(StringTime, Format, &Time.tm_year, &Time.tm_mon, + &Time.tm_mday, &Time.tm_hour, + &Time.tm_min, &Time.tm_sec); + + /* Adjust the years & months for valid tm struct values. */ + Time.tm_year -= 1900; + Time.tm_mon -= 1; + + /* Calculate the unix time. */ + time_t thetime = util_timegm ( &Time ); + + /* Add our timezone offset to the time. */ + /* Note also that we SUBTRACT these times. We want the + * result to be in UTC. */ + thetime -= TZOffsetHours * 60 * 60; + thetime -= TZOffsetMinutes * 60; + + return thetime; +} + +// GPSCorrelate END + +typedef struct { + GtkWidget *dialog; + VikFileList *files; + VikTrwLayer *vtl; // to pass on + VikWaypoint *wpt; // Use specified waypoint or otherwise the track(s) if NULL + VikTrack *track; // Use specified track or all tracks if NULL + GtkCheckButton *create_waypoints_b; + GtkLabel *overwrite_waypoints_l; // Referenced so the sensitivity can be changed + GtkCheckButton *overwrite_waypoints_b; + GtkCheckButton *write_exif_b; + GtkLabel *overwrite_gps_exif_l; // Referenced so the sensitivity can be changed + GtkCheckButton *overwrite_gps_exif_b; + GtkLabel *no_change_mtime_l; // Referenced so the sensitivity can be changed + GtkCheckButton *auto_image_direction_b; + GtkCheckButton *no_change_mtime_b; + GtkCheckButton *interpolate_segments_b; + GtkEntry *time_zone_b; // TODO consider a more user friendly tz widget eg libtimezonemap or similar + GtkEntry *time_offset_b; +} GeoTagWidgets; + +static GeoTagWidgets *geotag_widgets_new() +{ + GeoTagWidgets *widgets = g_malloc0(sizeof(GeoTagWidgets)); + return widgets; +} + +static void geotag_widgets_free ( GeoTagWidgets *widgets ) +{ + // Need to free VikFileList?? + g_free(widgets); +} + +typedef struct { + gboolean create_waypoints; + gboolean overwrite_waypoints; + gboolean write_exif; + gboolean overwrite_gps_exif; + gboolean auto_image_direction; + gboolean no_change_mtime; + gboolean interpolate_segments; + gint time_offset; + gint TimeZoneHours; + gint TimeZoneMins; +} option_values_t; + +typedef struct { + VikTrwLayer *vtl; + gchar *image; + VikWaypoint *wpt; // Use specified waypoint or otherwise the track(s) if NULL + VikTrack *track; // Use specified track or all tracks if NULL + // User options... + option_values_t ov; + GList *files; + time_t PhotoTime; + // Store answer from interpolation for an image + gboolean found_match; + VikCoord coord; + gdouble altitude; + gdouble image_direction; + // If anything has changed + gboolean redraw; +} geotag_options_t; + +#define VIK_SETTINGS_GEOTAG_CREATE_WAYPOINT "geotag_create_waypoints" +#define VIK_SETTINGS_GEOTAG_OVERWRITE_WAYPOINTS "geotag_overwrite_waypoints" +#define VIK_SETTINGS_GEOTAG_WRITE_EXIF "geotag_write_exif" +#define VIK_SETTINGS_GEOTAG_OVERWRITE_GPS_EXIF "geotag_overwrite_gps" +#define VIK_SETTINGS_GEOTAG_AUTO_IMAGE_DIRECTION "geotag_auto_image_direction" +#define VIK_SETTINGS_GEOTAG_NO_CHANGE_MTIME "geotag_no_change_mtime" +#define VIK_SETTINGS_GEOTAG_INTERPOLATE_SEGMENTS "geotag_interpolate_segments" +#define VIK_SETTINGS_GEOTAG_TIME_OFFSET "geotag_time_offset" +#define VIK_SETTINGS_GEOTAG_TIME_OFFSET_HOURS "geotag_time_offset_hours" +#define VIK_SETTINGS_GEOTAG_TIME_OFFSET_MINS "geotag_time_offset_mins" + +static void save_default_values ( option_values_t default_values ) +{ + a_settings_set_boolean ( VIK_SETTINGS_GEOTAG_CREATE_WAYPOINT, default_values.create_waypoints ); + a_settings_set_boolean ( VIK_SETTINGS_GEOTAG_OVERWRITE_WAYPOINTS, default_values.overwrite_waypoints ); + a_settings_set_boolean ( VIK_SETTINGS_GEOTAG_WRITE_EXIF, default_values.write_exif ); + a_settings_set_boolean ( VIK_SETTINGS_GEOTAG_OVERWRITE_GPS_EXIF, default_values.overwrite_gps_exif ); + a_settings_set_boolean ( VIK_SETTINGS_GEOTAG_AUTO_IMAGE_DIRECTION, default_values.auto_image_direction ); + a_settings_set_boolean ( VIK_SETTINGS_GEOTAG_NO_CHANGE_MTIME, default_values.no_change_mtime ); + a_settings_set_boolean ( VIK_SETTINGS_GEOTAG_INTERPOLATE_SEGMENTS, default_values.interpolate_segments ); + a_settings_set_integer ( VIK_SETTINGS_GEOTAG_TIME_OFFSET, default_values.time_offset ); + a_settings_set_integer ( VIK_SETTINGS_GEOTAG_TIME_OFFSET_HOURS, default_values.TimeZoneHours ); + a_settings_set_integer ( VIK_SETTINGS_GEOTAG_TIME_OFFSET_MINS, default_values.TimeZoneMins ); +} + +static option_values_t get_default_values ( ) +{ + option_values_t default_values; + if ( ! a_settings_get_boolean ( VIK_SETTINGS_GEOTAG_CREATE_WAYPOINT, &default_values.create_waypoints ) ) + default_values.create_waypoints = TRUE; + if ( ! a_settings_get_boolean ( VIK_SETTINGS_GEOTAG_OVERWRITE_WAYPOINTS, &default_values.overwrite_waypoints ) ) + default_values.overwrite_waypoints = TRUE; + if ( ! a_settings_get_boolean ( VIK_SETTINGS_GEOTAG_WRITE_EXIF, &default_values.write_exif ) ) + default_values.write_exif = TRUE; + if ( ! a_settings_get_boolean ( VIK_SETTINGS_GEOTAG_OVERWRITE_GPS_EXIF, &default_values.overwrite_gps_exif ) ) + default_values.overwrite_gps_exif = FALSE; + if ( ! a_settings_get_boolean ( VIK_SETTINGS_GEOTAG_AUTO_IMAGE_DIRECTION, &default_values.auto_image_direction ) ) + default_values.auto_image_direction = FALSE; + if ( ! a_settings_get_boolean ( VIK_SETTINGS_GEOTAG_NO_CHANGE_MTIME, &default_values.no_change_mtime ) ) + default_values.no_change_mtime = TRUE; + if ( ! a_settings_get_boolean ( VIK_SETTINGS_GEOTAG_INTERPOLATE_SEGMENTS, &default_values.interpolate_segments ) ) + default_values.interpolate_segments = TRUE; + if ( ! a_settings_get_integer ( VIK_SETTINGS_GEOTAG_TIME_OFFSET, &default_values.time_offset ) ) + default_values.time_offset = 0; + if ( ! a_settings_get_integer ( VIK_SETTINGS_GEOTAG_TIME_OFFSET_HOURS, &default_values.TimeZoneHours ) ) + default_values.TimeZoneHours = 0; + if ( ! a_settings_get_integer ( VIK_SETTINGS_GEOTAG_TIME_OFFSET_MINS, &default_values.TimeZoneMins ) ) + default_values.TimeZoneMins = 0; + return default_values; +} + +/** + * Get a heading from a single trkpoint + * + * Try using the adjacent trkpoints to get a direction + */ +static gdouble get_heading_from_trackpoint ( GList *mytrkpt ) +{ + VikTrackpoint *trkpt = VIK_TRACKPOINT(mytrkpt->data); + + if ( mytrkpt->prev ) + return vik_coord_angle ( &VIK_TRACKPOINT(mytrkpt->prev->data)->coord, &trkpt->coord ); + else if ( mytrkpt->next ) + return vik_coord_angle ( &trkpt->coord, &VIK_TRACKPOINT(mytrkpt->prev->data)->coord ); + + // In the unlikely event of a single trackpoint track - can't guess a direction + return NAN; +} + +/** + * Correlate the image against the specified track + */ +static void trw_layer_geotag_track ( const gpointer id, VikTrack *track, geotag_options_t *options ) +{ + // If already found match then don't need to check this track + if ( options->found_match ) + return; + + VikTrackpoint *trkpt; + VikTrackpoint *trkpt_next; + + GList *mytrkpt; + for ( mytrkpt = track->trackpoints; mytrkpt; mytrkpt = mytrkpt->next ) { + + // Do something for this trackpoint... + + trkpt = VIK_TRACKPOINT(mytrkpt->data); + + // is it exactly this point? + if ( options->PhotoTime == trkpt->timestamp ) { + options->coord = trkpt->coord; + options->altitude = trkpt->altitude; + options->found_match = TRUE; + if ( options->ov.auto_image_direction ) + options->image_direction = get_heading_from_trackpoint ( mytrkpt ); + break; + } + + // Now need two trackpoints, hence check next is available + if ( !mytrkpt->next ) break; + trkpt_next = VIK_TRACKPOINT(mytrkpt->next->data); + + // TODO need to use 'has_timestamp' property + if ( trkpt->timestamp == trkpt_next->timestamp ) continue; + if ( trkpt->timestamp > trkpt_next->timestamp ) continue; + + // When interpolating between segments, no need for any special segment handling + if ( !options->ov.interpolate_segments ) + // Don't check between segments + if ( trkpt_next->newsegment ) + // Simply move on to consider next point + continue; + + // Too far + if ( trkpt->timestamp > options->PhotoTime ) break; + + // Is is between this and the next point? + if ( (options->PhotoTime > trkpt->timestamp) && (options->PhotoTime < trkpt_next->timestamp) ) { + options->found_match = TRUE; + // Interpolate + /* Calculate the "scale": a decimal giving the relative distance + * in time between the two points. Ie, a number between 0 and 1 - + * 0 is the first point, 1 is the next point, and 0.5 would be + * half way. */ + gdouble tdiff = (gdouble)trkpt_next->timestamp - (gdouble)trkpt->timestamp; + gdouble scale = ((gdouble)options->PhotoTime - (gdouble)trkpt->timestamp) / tdiff; + + options->PhotoTime = options->PhotoTime + (time_t)(tdiff * scale); + + struct LatLon ll_result, ll1, ll2; + + vik_coord_to_latlon ( &(trkpt->coord), &ll1 ); + vik_coord_to_latlon ( &(trkpt_next->coord), &ll2 ); + + ll_result.lat = ll1.lat + ((ll2.lat - ll1.lat) * scale); + + // NB This won't cope with going over the 180 degrees longitude boundary + ll_result.lon = ll1.lon + ((ll2.lon - ll1.lon) * scale); + + // set coord + vik_coord_load_from_latlon ( &(options->coord), VIK_COORD_LATLON, &ll_result ); + + // Interpolate elevation + options->altitude = trkpt->altitude + ((trkpt_next->altitude - trkpt->altitude) * scale); + + if ( options->ov.auto_image_direction ) + options->image_direction = vik_coord_angle ( &trkpt->coord, &trkpt_next->coord ); + + break; + } + } +} + +/** + * Simply align the images the waypoint position + */ +static void trw_layer_geotag_waypoint ( geotag_options_t *options ) +{ + // Write EXIF if specified - although a fairly useless process if you've turned it off! + if ( options->ov.write_exif ) { + gboolean has_gps_exif = FALSE; + gchar* datetime = a_geotag_get_exif_date_from_file ( options->image, &has_gps_exif ); + // If image already has gps info - don't attempt to change it unless forced + if ( options->ov.overwrite_gps_exif || !has_gps_exif ) { + gint ans = a_geotag_write_exif_gps ( options->image, options->wpt->coord, options->wpt->altitude, + options->wpt->image_direction, options->wpt->image_direction_ref, + options->ov.no_change_mtime ); + if ( ans != 0 ) { + gchar *message = g_strdup_printf ( _("Failed updating EXIF on %s"), options->image ); + vik_window_statusbar_update ( VIK_WINDOW(VIK_GTK_WINDOW_FROM_LAYER(options->vtl)), message, VIK_STATUSBAR_INFO ); + g_free ( message ); + } + } + g_free ( datetime ); + } +} + +/** + * Correlate the image to any track within the TrackWaypoint layer + */ +static void trw_layer_geotag_process ( geotag_options_t *options ) +{ + if ( !options->vtl || !IS_VIK_LAYER(options->vtl) ) + return; + + if ( !options->image ) + return; + + if ( options->wpt ) { + trw_layer_geotag_waypoint ( options ); + return; + } + + gboolean has_gps_exif = FALSE; + gchar* datetime = a_geotag_get_exif_date_from_file ( options->image, &has_gps_exif ); + + if ( datetime ) { + + // If image already has gps info - don't attempt to change it. + if ( !options->ov.overwrite_gps_exif && has_gps_exif ) { + if ( options->ov.create_waypoints ) { + // Create waypoint with file information + gchar *name = NULL; + VikWaypoint *wp = a_geotag_create_waypoint_from_file ( options->image, vik_trw_layer_get_coord_mode (options->vtl), &name ); + if ( !wp ) { + // Couldn't create Waypoint + g_free ( datetime ); + return; + } + if ( !name ) + name = g_strdup ( a_file_basename ( options->image ) ); + + gboolean updated_waypoint = FALSE; + + if ( options->ov.overwrite_waypoints ) { + VikWaypoint *current_wp = vik_trw_layer_get_waypoint ( options->vtl, name ); + if ( current_wp ) { + // Existing wp found, so set new position, comment and image + (void)a_geotag_waypoint_positioned ( options->image, wp->coord, wp->altitude, &name, current_wp ); + updated_waypoint = TRUE; + } + } + + if ( !updated_waypoint ) { + vik_trw_layer_filein_add_waypoint ( options->vtl, name, wp ); + } + + g_free ( name ); + + // Mark for redraw + options->redraw = TRUE; + } + g_free ( datetime ); + return; + } + + options->PhotoTime = ConvertToUnixTime ( datetime, EXIF_DATE_FORMAT, options->ov.TimeZoneHours, options->ov.TimeZoneMins); + g_free ( datetime ); + + // Apply any offset + options->PhotoTime = options->PhotoTime + options->ov.time_offset; + + options->found_match = FALSE; + options->image_direction = NAN; + + if ( options->track ) { + // Single specified track + // NB Doesn't care about track id + trw_layer_geotag_track ( NULL, options->track, options ); + } + else { + // Try all tracks + GHashTable *tracks = vik_trw_layer_get_tracks ( options->vtl ); + if ( g_hash_table_size (tracks) > 0 ) { + g_hash_table_foreach ( tracks, (GHFunc) trw_layer_geotag_track, options ); + } + } + + // Match found ? + if ( options->found_match ) { + + if ( options->ov.create_waypoints ) { + + gboolean updated_waypoint = FALSE; + + if ( options->ov.overwrite_waypoints ) { + + // Update existing WP + // Find a WP with current name + gchar *name = NULL; + name = g_strdup ( a_file_basename ( options->image ) ); + VikWaypoint *wp = vik_trw_layer_get_waypoint ( options->vtl, name ); + if ( wp ) { + // Found, so set new position, comment and image + (void)a_geotag_waypoint_positioned ( options->image, options->coord, options->altitude, &name, wp ); + wp->image_direction_ref = WP_IMAGE_DIRECTION_REF_TRUE; + wp->image_direction = options->image_direction; + wp->has_timestamp = TRUE; + wp->timestamp = options->PhotoTime; + updated_waypoint = TRUE; + } + g_free ( name ); + } + + if ( !updated_waypoint ) { + // Create waypoint with found position + gchar *name = NULL; + VikWaypoint *wp = a_geotag_waypoint_positioned ( options->image, options->coord, options->altitude, &name, NULL ); + if ( !name ) + name = g_strdup ( a_file_basename ( options->image ) ); + wp->image_direction_ref = WP_IMAGE_DIRECTION_REF_TRUE; + wp->image_direction = options->image_direction; + wp->has_timestamp = TRUE; + wp->timestamp = options->PhotoTime; + vik_trw_layer_filein_add_waypoint ( options->vtl, name, wp ); + g_free ( name ); + } + + // Mark for redraw + options->redraw = TRUE; + } + + // Write EXIF if specified + if ( options->ov.write_exif ) { + gint ans = a_geotag_write_exif_gps ( options->image, options->coord, options->altitude, + options->image_direction, WP_IMAGE_DIRECTION_REF_TRUE, + options->ov.no_change_mtime ); + if ( ans != 0 ) { + gchar *message = g_strdup_printf ( _("Failed updating EXIF on %s"), options->image ); + vik_window_statusbar_update ( VIK_WINDOW(VIK_GTK_WINDOW_FROM_LAYER(options->vtl)), message, VIK_STATUSBAR_INFO ); + g_free ( message ); + } + } + } + } +} + +/* + * Tidy up + */ +static void trw_layer_geotag_thread_free ( geotag_options_t *gtd ) +{ + if ( gtd->files ) + g_list_free ( gtd->files ); + g_free ( gtd ); +} + +/** + * Run geotagging process in a separate thread + */ +static int trw_layer_geotag_thread ( geotag_options_t *options, gpointer threaddata ) +{ + guint total = g_list_length(options->files), done = 0; + + // TODO decide how to report any issues to the user ... + + // Foreach file attempt to geotag it + while ( options->files ) { + options->image = (gchar *) ( options->files->data ); + trw_layer_geotag_process ( options ); + options->files = options->files->next; + + // Update thread progress and detect stop requests + int result = a_background_thread_progress ( threaddata, ((gdouble) ++done) / total ); + if ( result != 0 ) + return -1; /* Abort thread */ + } + + if ( options->redraw ) { + if ( IS_VIK_LAYER(options->vtl) ) { + trw_layer_calculate_bounds_waypoints ( options->vtl ); + // Ensure any new images get shown + trw_layer_verify_thumbnails ( options->vtl ); + // Force redraw as verify only redraws if there are new thumbnails (they may already exist) + vik_layer_emit_update ( VIK_LAYER(options->vtl) ); // NB Update from background + } + } + + return 0; +} + +/** + * Parse user input from dialog response + */ +static void trw_layer_geotag_response_cb ( GtkDialog *dialog, gint resp, GeoTagWidgets *widgets ) +{ + switch (resp) { + case GTK_RESPONSE_DELETE_EVENT: /* received delete event (not from buttons) */ + case GTK_RESPONSE_REJECT: + break; + default: { + //GTK_RESPONSE_ACCEPT: + // Get options + geotag_options_t *options = g_malloc ( sizeof(geotag_options_t) ); + options->vtl = widgets->vtl; + options->wpt = widgets->wpt; + options->track = widgets->track; + // Values extracted from the widgets: + options->ov.create_waypoints = gtk_toggle_button_get_active ( GTK_TOGGLE_BUTTON(widgets->create_waypoints_b) ); + options->ov.overwrite_waypoints = gtk_toggle_button_get_active ( GTK_TOGGLE_BUTTON(widgets->overwrite_waypoints_b) ); + options->ov.write_exif = gtk_toggle_button_get_active ( GTK_TOGGLE_BUTTON(widgets->write_exif_b) ); + options->ov.overwrite_gps_exif = gtk_toggle_button_get_active ( GTK_TOGGLE_BUTTON(widgets->overwrite_gps_exif_b) ); + options->ov.auto_image_direction = gtk_toggle_button_get_active ( GTK_TOGGLE_BUTTON(widgets->auto_image_direction_b) ); + options->ov.no_change_mtime = gtk_toggle_button_get_active ( GTK_TOGGLE_BUTTON(widgets->no_change_mtime_b) ); + options->ov.interpolate_segments = gtk_toggle_button_get_active ( GTK_TOGGLE_BUTTON(widgets->interpolate_segments_b) ); + options->ov.TimeZoneHours = 0; + options->ov.TimeZoneMins = 0; + const gchar* TZString = gtk_entry_get_text(GTK_ENTRY(widgets->time_zone_b)); + /* Check the string. If there is a colon, then (hopefully) it's a time in xx:xx format. + * If not, it's probably just a +/-xx format. In all other cases, + * it will be interpreted as +/-xx, which, if given a string, returns 0. */ + if (strstr(TZString, ":")) { + /* Found colon. Split into two. */ + sscanf(TZString, "%d:%d", &options->ov.TimeZoneHours, &options->ov.TimeZoneMins); + if (options->ov.TimeZoneHours < 0) + options->ov.TimeZoneMins *= -1; + } else { + /* No colon. Just parse. */ + options->ov.TimeZoneHours = atoi(TZString); + } + options->ov.time_offset = atoi ( gtk_entry_get_text ( GTK_ENTRY(widgets->time_offset_b) ) ); + + options->redraw = FALSE; + + // Save settings for reuse + save_default_values ( options->ov ); + + options->files = g_list_copy ( vik_file_list_get_files ( widgets->files ) ); + + gint len = g_list_length ( options->files ); + gchar *tmp = g_strdup_printf ( _("Geotagging %d Images..."), len ); + + // Processing lots of files can take time - so run a background effort + a_background_thread ( BACKGROUND_POOL_LOCAL, + VIK_GTK_WINDOW_FROM_LAYER(options->vtl), + tmp, + (vik_thr_func) trw_layer_geotag_thread, + options, + (vik_thr_free_func) trw_layer_geotag_thread_free, + NULL, + len ); + + g_free ( tmp ); + + break; + } + } + geotag_widgets_free ( widgets ); + gtk_widget_destroy ( GTK_WIDGET(dialog) ); +} + +/** + * Handle widget sensitivities + */ +static void write_exif_b_cb ( GtkWidget *gw, GeoTagWidgets *gtw ) +{ + // Overwriting & file modification times are irrelevant if not going to write EXIF! + if ( gtk_toggle_button_get_active ( GTK_TOGGLE_BUTTON(gtw->write_exif_b) ) ) { + gtk_widget_set_sensitive ( GTK_WIDGET(gtw->overwrite_gps_exif_b), TRUE ); + gtk_widget_set_sensitive ( GTK_WIDGET(gtw->overwrite_gps_exif_l), TRUE ); + gtk_widget_set_sensitive ( GTK_WIDGET(gtw->no_change_mtime_b), TRUE ); + gtk_widget_set_sensitive ( GTK_WIDGET(gtw->no_change_mtime_l), TRUE ); + } + else { + gtk_widget_set_sensitive ( GTK_WIDGET(gtw->overwrite_gps_exif_b), FALSE ); + gtk_widget_set_sensitive ( GTK_WIDGET(gtw->overwrite_gps_exif_l), FALSE ); + gtk_widget_set_sensitive ( GTK_WIDGET(gtw->no_change_mtime_b), FALSE ); + gtk_widget_set_sensitive ( GTK_WIDGET(gtw->no_change_mtime_l), FALSE ); + } +} + +static void create_waypoints_b_cb ( GtkWidget *gw, GeoTagWidgets *gtw ) +{ + // Overwriting waypoints are irrelevant if not going to create them! + if ( gtk_toggle_button_get_active ( GTK_TOGGLE_BUTTON(gtw->create_waypoints_b) ) ) { + gtk_widget_set_sensitive ( GTK_WIDGET(gtw->overwrite_waypoints_b), TRUE ); + gtk_widget_set_sensitive ( GTK_WIDGET(gtw->overwrite_waypoints_l), TRUE ); + } + else { + gtk_widget_set_sensitive ( GTK_WIDGET(gtw->overwrite_waypoints_b), FALSE ); + gtk_widget_set_sensitive ( GTK_WIDGET(gtw->overwrite_waypoints_l), FALSE ); + } +} + +/** + * trw_layer_geotag_dialog: + * @parent: The Window of the calling process + * @vtl: The VikTrwLayer to use for correlating images to tracks + * @track: Optional - The particular track to use (if specified) for correlating images + * @track_name: Optional - The name of specified track to use + */ +void trw_layer_geotag_dialog ( GtkWindow *parent, + VikTrwLayer *vtl, + VikWaypoint *wpt, + VikTrack *track ) +{ + GeoTagWidgets *widgets = geotag_widgets_new(); + + widgets->dialog = gtk_dialog_new_with_buttons ( _("Geotag Images"), + parent, + GTK_DIALOG_DESTROY_WITH_PARENT, + GTK_STOCK_CANCEL, GTK_RESPONSE_REJECT, + GTK_STOCK_OK, GTK_RESPONSE_ACCEPT, + NULL ); + GtkFileFilter *filter = gtk_file_filter_new (); + gtk_file_filter_set_name ( filter, _("JPG") ); + gtk_file_filter_add_mime_type ( filter, "image/jpeg"); + + widgets->files = VIK_FILE_LIST(vik_file_list_new ( _("Images"), filter )); + widgets->vtl = vtl; + widgets->wpt = wpt; + widgets->track = track; + widgets->create_waypoints_b = GTK_CHECK_BUTTON ( gtk_check_button_new () ); + widgets->overwrite_waypoints_l = GTK_LABEL ( gtk_label_new ( _("Overwrite Existing Waypoints:") ) ); + widgets->overwrite_waypoints_b = GTK_CHECK_BUTTON ( gtk_check_button_new () ); + widgets->write_exif_b = GTK_CHECK_BUTTON ( gtk_check_button_new () ); + widgets->overwrite_gps_exif_l = GTK_LABEL ( gtk_label_new ( _("Overwrite Existing GPS Information:") ) ); + widgets->overwrite_gps_exif_b = GTK_CHECK_BUTTON ( gtk_check_button_new () ); + widgets->no_change_mtime_l = GTK_LABEL ( gtk_label_new ( _("Keep File Modification Timestamp:") ) ); + widgets->no_change_mtime_b = GTK_CHECK_BUTTON ( gtk_check_button_new () ); + widgets->auto_image_direction_b = GTK_CHECK_BUTTON ( gtk_check_button_new () ); + widgets->interpolate_segments_b = GTK_CHECK_BUTTON ( gtk_check_button_new () ); + widgets->time_zone_b = GTK_ENTRY ( gtk_entry_new () ); + widgets->time_offset_b = GTK_ENTRY ( gtk_entry_new () ); + + gtk_entry_set_width_chars ( widgets->time_zone_b, 7); + gtk_entry_set_width_chars ( widgets->time_offset_b, 7); + + // Defaults + option_values_t default_values = get_default_values (); + + gtk_toggle_button_set_active ( GTK_TOGGLE_BUTTON(widgets->create_waypoints_b), default_values.create_waypoints ); + gtk_toggle_button_set_active ( GTK_TOGGLE_BUTTON(widgets->overwrite_waypoints_b), default_values.overwrite_waypoints ); + gtk_toggle_button_set_active ( GTK_TOGGLE_BUTTON(widgets->write_exif_b), default_values.write_exif ); + gtk_toggle_button_set_active ( GTK_TOGGLE_BUTTON(widgets->overwrite_gps_exif_b), default_values.overwrite_gps_exif ); + gtk_toggle_button_set_active ( GTK_TOGGLE_BUTTON(widgets->auto_image_direction_b), default_values.auto_image_direction ); + gtk_toggle_button_set_active ( GTK_TOGGLE_BUTTON(widgets->no_change_mtime_b), default_values.no_change_mtime ); + gtk_toggle_button_set_active ( GTK_TOGGLE_BUTTON(widgets->interpolate_segments_b), default_values.interpolate_segments ); + gchar tmp_string[7]; + snprintf (tmp_string, 7, "%+02d:%02d", default_values.TimeZoneHours, abs (default_values.TimeZoneMins) ); + gtk_entry_set_text ( widgets->time_zone_b, tmp_string ); + snprintf (tmp_string, 7, "%d", default_values.time_offset ); + gtk_entry_set_text ( widgets->time_offset_b, tmp_string ); + + // Ensure sensitivities setup + write_exif_b_cb ( GTK_WIDGET(widgets->write_exif_b), widgets ); + g_signal_connect ( G_OBJECT(widgets->write_exif_b), "toggled", G_CALLBACK(write_exif_b_cb), widgets ); + + create_waypoints_b_cb ( GTK_WIDGET(widgets->create_waypoints_b), widgets ); + g_signal_connect ( G_OBJECT(widgets->create_waypoints_b), "toggled", G_CALLBACK(create_waypoints_b_cb), widgets ); + + GtkWidget *cw_hbox = gtk_hbox_new ( FALSE, 0 ); + GtkWidget *create_waypoints_l = gtk_label_new ( _("Create Waypoints:") ); + gtk_box_pack_start ( GTK_BOX(cw_hbox), create_waypoints_l, FALSE, FALSE, 5 ); + gtk_box_pack_start ( GTK_BOX(cw_hbox), GTK_WIDGET(widgets->create_waypoints_b), FALSE, FALSE, 5 ); + + GtkWidget *ow_hbox = gtk_hbox_new ( FALSE, 0 ); + gtk_box_pack_start ( GTK_BOX(ow_hbox), GTK_WIDGET(widgets->overwrite_waypoints_l), FALSE, FALSE, 5 ); + gtk_box_pack_start ( GTK_BOX(ow_hbox), GTK_WIDGET(widgets->overwrite_waypoints_b), FALSE, FALSE, 5 ); + + GtkWidget *we_hbox = gtk_hbox_new ( FALSE, 0 ); + gtk_box_pack_start ( GTK_BOX(we_hbox), gtk_label_new ( _("Write EXIF:") ), FALSE, FALSE, 5 ); + gtk_box_pack_start ( GTK_BOX(we_hbox), GTK_WIDGET(widgets->write_exif_b), FALSE, FALSE, 5 ); + + GtkWidget *og_hbox = gtk_hbox_new ( FALSE, 0 ); + gtk_box_pack_start ( GTK_BOX(og_hbox), GTK_WIDGET(widgets->overwrite_gps_exif_l), FALSE, FALSE, 5 ); + gtk_box_pack_start ( GTK_BOX(og_hbox), GTK_WIDGET(widgets->overwrite_gps_exif_b), FALSE, FALSE, 5 ); + + GtkWidget *fm_hbox = gtk_hbox_new ( FALSE, 0 ); + gtk_box_pack_start ( GTK_BOX(fm_hbox), GTK_WIDGET(widgets->no_change_mtime_l), FALSE, FALSE, 5 ); + gtk_box_pack_start ( GTK_BOX(fm_hbox), GTK_WIDGET(widgets->no_change_mtime_b), FALSE, FALSE, 5 ); + + GtkWidget *aid_hbox = gtk_hbox_new ( FALSE, 0 ); + gtk_box_pack_start ( GTK_BOX(aid_hbox), gtk_label_new ( _("Automatic Image Direction:") ), FALSE, FALSE, 5 ); + gtk_box_pack_start ( GTK_BOX(aid_hbox), GTK_WIDGET(widgets->auto_image_direction_b), FALSE, FALSE, 5 ); + gtk_widget_set_tooltip_text ( GTK_WIDGET(widgets->auto_image_direction_b), _("Set image direction based on a heading derived from the track") ); + + GtkWidget *is_hbox = gtk_hbox_new ( FALSE, 0 ); + GtkWidget *interpolate_segments_l = gtk_label_new ( _("Interpolate Between Track Segments:") ); + gtk_box_pack_start ( GTK_BOX(is_hbox), interpolate_segments_l, FALSE, FALSE, 5 ); + gtk_box_pack_start ( GTK_BOX(is_hbox), GTK_WIDGET(widgets->interpolate_segments_b), FALSE, FALSE, 5 ); + + GtkWidget *to_hbox = gtk_hbox_new ( FALSE, 0 ); + GtkWidget *time_offset_l = gtk_label_new ( _("Image Time Offset (Seconds):") ); + gtk_box_pack_start ( GTK_BOX(to_hbox), time_offset_l, FALSE, FALSE, 5 ); + gtk_box_pack_start ( GTK_BOX(to_hbox), GTK_WIDGET(widgets->time_offset_b), FALSE, FALSE, 5 ); + gtk_widget_set_tooltip_text ( GTK_WIDGET(widgets->time_offset_b), _("The number of seconds to ADD to the photos time to make it match the GPS data. Calculate this with (GPS - Photo). Can be negative or positive. Useful to adjust times when a camera's timestamp was incorrect.") ); + + GtkWidget *tz_hbox = gtk_hbox_new ( FALSE, 0 ); + GtkWidget *time_zone_l = gtk_label_new ( _("Image Timezone:") ); + gtk_box_pack_start ( GTK_BOX(tz_hbox), time_zone_l, FALSE, FALSE, 5 ); + gtk_box_pack_start ( GTK_BOX(tz_hbox), GTK_WIDGET(widgets->time_zone_b), FALSE, FALSE, 5 ); + gtk_widget_set_tooltip_text ( GTK_WIDGET(widgets->time_zone_b), _("The timezone that was used when the images were created. For example, if a camera is set to AWST or +8:00 hours. Enter +8:00 here so that the correct adjustment to the images' time can be made. GPS data is always in UTC.") ); + + gchar *track_string = NULL; + if ( widgets->wpt ) { + track_string = g_strdup_printf ( _("Using waypoint: %s"), wpt->name ); + // Control sensitivities + gtk_widget_set_sensitive ( GTK_WIDGET(widgets->create_waypoints_b), FALSE ); + gtk_widget_set_sensitive ( GTK_WIDGET(create_waypoints_l), FALSE ); + gtk_widget_set_sensitive ( GTK_WIDGET(widgets->overwrite_waypoints_b), FALSE ); + gtk_widget_set_sensitive ( GTK_WIDGET(widgets->overwrite_waypoints_l), FALSE ); + gtk_widget_set_sensitive ( GTK_WIDGET(widgets->interpolate_segments_b), FALSE ); + gtk_widget_set_sensitive ( GTK_WIDGET(interpolate_segments_l), FALSE ); + gtk_widget_set_sensitive ( GTK_WIDGET(widgets->time_offset_b), FALSE ); + gtk_widget_set_sensitive ( GTK_WIDGET(time_offset_l), FALSE ); + gtk_widget_set_sensitive ( GTK_WIDGET(widgets->time_zone_b), FALSE ); + gtk_widget_set_sensitive ( GTK_WIDGET(time_zone_l), FALSE ); + } + else if ( widgets->track ) + track_string = g_strdup_printf ( _("Using track: %s"), track->name ); + else + track_string = g_strdup_printf ( _("Using all tracks in: %s"), VIK_LAYER(widgets->vtl)->name ); + + gtk_box_pack_start ( GTK_BOX(gtk_dialog_get_content_area(GTK_DIALOG(widgets->dialog))), gtk_label_new ( track_string ), FALSE, FALSE, 5 ); + + gtk_box_pack_start ( GTK_BOX(gtk_dialog_get_content_area(GTK_DIALOG(widgets->dialog))), GTK_WIDGET(widgets->files), TRUE, TRUE, 0 ); + + gtk_box_pack_start ( GTK_BOX(gtk_dialog_get_content_area(GTK_DIALOG(widgets->dialog))), cw_hbox, FALSE, FALSE, 0); + gtk_box_pack_start ( GTK_BOX(gtk_dialog_get_content_area(GTK_DIALOG(widgets->dialog))), ow_hbox, FALSE, FALSE, 0); + gtk_box_pack_start ( GTK_BOX(gtk_dialog_get_content_area(GTK_DIALOG(widgets->dialog))), we_hbox, FALSE, FALSE, 0); + gtk_box_pack_start ( GTK_BOX(gtk_dialog_get_content_area(GTK_DIALOG(widgets->dialog))), og_hbox, FALSE, FALSE, 0); + gtk_box_pack_start ( GTK_BOX(gtk_dialog_get_content_area(GTK_DIALOG(widgets->dialog))), fm_hbox, FALSE, FALSE, 0); + gtk_box_pack_start ( GTK_BOX(gtk_dialog_get_content_area(GTK_DIALOG(widgets->dialog))), aid_hbox, FALSE, FALSE, 0); + gtk_box_pack_start ( GTK_BOX(gtk_dialog_get_content_area(GTK_DIALOG(widgets->dialog))), is_hbox, FALSE, FALSE, 0); + gtk_box_pack_start ( GTK_BOX(gtk_dialog_get_content_area(GTK_DIALOG(widgets->dialog))), to_hbox, FALSE, FALSE, 0); + gtk_box_pack_start ( GTK_BOX(gtk_dialog_get_content_area(GTK_DIALOG(widgets->dialog))), tz_hbox, FALSE, FALSE, 0); + + g_signal_connect ( widgets->dialog, "response", G_CALLBACK(trw_layer_geotag_response_cb), widgets ); + + gtk_dialog_set_default_response ( GTK_DIALOG(widgets->dialog), GTK_RESPONSE_REJECT ); + + gtk_widget_show_all ( widgets->dialog ); + + g_free ( track_string ); +} diff --git a/src/viktrwlayer_geotag.h b/src/viktrwlayer_geotag.h new file mode 100644 index 0000000..8b1ea69 --- /dev/null +++ b/src/viktrwlayer_geotag.h @@ -0,0 +1,39 @@ +/* -*- Mode: C; indent-tabs-mode: t; c-basic-offset: 4; tab-width: 4 -*- */ +/* + * viking -- GPS Data and Topo Analyzer, Explorer, and Manager + * + * Copyright (C) 2011, Rob Norris + * + * 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., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA + * + */ +#ifndef _VIKING_TRWLAYER_GEOTAG_H +#define _VIKING_TRWLAYER_GEOTAG_H + +#include +#include +#include "viktrwlayer.h" + +G_BEGIN_DECLS + +// To be only called from within viktrwlayer +void trw_layer_geotag_dialog ( GtkWindow *parent, + VikTrwLayer *vtl, + VikWaypoint *wpt, + VikTrack *track ); + +G_END_DECLS + +#endif diff --git a/src/viktrwlayer_propwin.c b/src/viktrwlayer_propwin.c new file mode 100644 index 0000000..98a7007 --- /dev/null +++ b/src/viktrwlayer_propwin.c @@ -0,0 +1,3749 @@ +/* + * viking -- GPS Data and Topo Analyzer, Explorer, and Manager + * + * Copyright (C) 2003-2005, Evan Battaglia + * Copyright (C) 2005-2007, Alex Foobarian + * Copyright (C) 2007-2008, Quy Tonthat + * Copyright (C) 2012-2014, Rob Norris + * + * 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., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA + * + */ + +#ifdef HAVE_CONFIG_H +#include "config.h" +#endif + +#ifdef HAVE_MATH_H +#include +#endif + +#include +#include +#include +#ifdef HAVE_STRING_H +#include +#endif +#include "viktrwlayer.h" +#include "viktrwlayer_propwin.h" +#include "dems.h" +#include "viking.h" +#include "vikviewport.h" /* ugh */ +#include "ui_util.h" +#include + +#define BLOB_SIZE 4 + +typedef enum { + PROPWIN_GRAPH_TYPE_ELEVATION_DISTANCE, + PROPWIN_GRAPH_TYPE_GRADIENT_DISTANCE, + PROPWIN_GRAPH_TYPE_SPEED_TIME, + PROPWIN_GRAPH_TYPE_DISTANCE_TIME, + PROPWIN_GRAPH_TYPE_ELEVATION_TIME, + PROPWIN_GRAPH_TYPE_SPEED_DISTANCE, + PROPWIN_GRAPH_TYPE_END, +} VikPropWinGraphType_t; + +/* (Hopefully!) Human friendly altitude grid sizes - note no fixed 'ratio' just numbers that look nice...*/ +static const gdouble chunksa[] = {2.0, 5.0, 10.0, 15.0, 20.0, + 25.0, 40.0, 50.0, 75.0, 100.0, + 150.0, 200.0, 250.0, 375.0, 500.0, + 750.0, 1000.0, 2000.0, 5000.0, 10000.0, 100000.0}; + +/* (Hopefully!) Human friendly gradient grid sizes - note no fixed 'ratio' just numbers that look nice...*/ +static const gdouble chunksg[] = {1.0, 2.0, 3.0, 4.0, 5.0, 8.0, 10.0, + 12.0, 15.0, 20.0, 25.0, 30.0, 35.0, 40.0, 45.0, 50.0, 75.0, + 100.0, 150.0, 200.0, 250.0, 375.0, 500.0, + 750.0, 1000.0, 10000.0, 100000.0}; +// Normally gradients should range up to couple hundred precent at most, +// however there are possibilities of having points with no altitude after a point with a big altitude +// (such as places with invalid DEM values in otherwise mountainous regions) - thus giving huge negative gradients. + +/* (Hopefully!) Human friendly grid sizes - note no fixed 'ratio' just numbers that look nice...*/ +/* As need to cover walking speeds - have many low numbers (but also may go up to airplane speeds!) */ +static const gdouble chunkss[] = {1.0, 2.0, 3.0, 4.0, 5.0, 8.0, 10.0, + 15.0, 20.0, 25.0, 40.0, 50.0, 75.0, + 100.0, 150.0, 200.0, 250.0, 375.0, 500.0, + 750.0, 1000.0, 10000.0}; + +/* (Hopefully!) Human friendly distance grid sizes - note no fixed 'ratio' just numbers that look nice...*/ +static const gdouble chunksd[] = {0.1, 0.2, 0.5, 1.0, 2.0, 3.0, 4.0, 5.0, 8.0, 10.0, + 15.0, 20.0, 25.0, 40.0, 50.0, 75.0, + 100.0, 150.0, 200.0, 250.0, 375.0, 500.0, + 750.0, 1000.0, 10000.0}; + +// Time chunks in seconds +static const time_t chunkst[] = { + 60, // 1 minute + 120, // 2 minutes + 300, // 5 minutes + 900, // 15 minutes + 1800, // half hour + 3600, // 1 hour + 10800, // 3 hours + 21600, // 6 hours + 43200, // 12 hours + 86400, // 1 day + 172800, // 2 days + 604800, // 1 week + 1209600,// 2 weeks + 2419200,// 4 weeks +}; + +// Local show settings to restore on dialog opening +static gboolean show_dem = TRUE; +static gboolean show_alt_gps_speed = TRUE; +static gboolean show_gps_speed = TRUE; +static gboolean show_gradient_gps_speed = TRUE; +static gboolean show_dist_speed = FALSE; +static gboolean show_elev_speed = FALSE; +static gboolean show_elev_dem = FALSE; +static gboolean show_sd_gps_speed = TRUE; + +typedef struct _propsaved { + gboolean saved; + GdkImage *img; +} PropSaved; + +typedef struct _propwidgets { + gboolean configure_dialog; + VikTrwLayer *vtl; + VikTrack *tr; + VikViewport *vvp; + VikLayersPanel *vlp; + gint profile_width; + gint profile_height; + gint profile_width_old; + gint profile_height_old; + gint profile_width_offset; + gint profile_height_offset; + GtkWidget *dialog; + GtkWidget *w_comment; + GtkWidget *w_description; + GtkWidget *w_source; + GtkWidget *w_type; + GtkWidget *w_track_length; + GtkWidget *w_tp_count; + GtkWidget *w_segment_count; + GtkWidget *w_duptp_count; + GtkWidget *w_max_speed; + GtkWidget *w_avg_speed; + GtkWidget *w_mvg_speed; + GtkWidget *w_avg_dist; + GtkWidget *w_elev_range; + GtkWidget *w_elev_gain; + GtkWidget *w_time_start; + GtkWidget *w_time_end; + GtkWidget *w_time_dur; + GtkWidget *w_color; + GtkWidget *w_namelabel; + GtkWidget *w_number_distlabels; + GtkWidget *w_cur_dist; /*< Current distance */ + GtkWidget *w_cur_elevation; + GtkWidget *w_cur_gradient_dist; /*< Current distance on gradient graph */ + GtkWidget *w_cur_gradient_gradient; /*< Current gradient on gradient graph */ + GtkWidget *w_cur_time; /*< Current track time */ + GtkWidget *w_cur_time_real; /*< Actual time as on a clock */ + GtkWidget *w_cur_speed; + GtkWidget *w_cur_dist_dist; /*< Current distance on distance graph */ + GtkWidget *w_cur_dist_time; /*< Current track time on distance graph */ + GtkWidget *w_cur_dist_time_real; // Clock time + GtkWidget *w_cur_elev_elev; + GtkWidget *w_cur_elev_time; // Track time + GtkWidget *w_cur_elev_time_real; // Clock time + GtkWidget *w_cur_speed_dist; + GtkWidget *w_cur_speed_speed; + GtkWidget *w_show_dem; + GtkWidget *w_show_alt_gps_speed; + GtkWidget *w_show_gps_speed; + GtkWidget *w_show_gradient_gps_speed; + GtkWidget *w_show_dist_speed; + GtkWidget *w_show_elev_speed; + GtkWidget *w_show_elev_dem; + GtkWidget *w_show_sd_gps_speed; + gdouble track_length; + gdouble track_length_inc_gaps; + PropSaved elev_graph_saved_img; + PropSaved gradient_graph_saved_img; + PropSaved speed_graph_saved_img; + PropSaved dist_graph_saved_img; + PropSaved elev_time_graph_saved_img; + PropSaved speed_dist_graph_saved_img; + GtkWidget *elev_box; + GtkWidget *gradient_box; + GtkWidget *speed_box; + GtkWidget *dist_box; + GtkWidget *elev_time_box; + GtkWidget *speed_dist_box; + gdouble *altitudes; + gdouble *ats; // altitudes in time + gdouble min_altitude; + gdouble max_altitude; + gdouble draw_min_altitude; + gdouble draw_min_altitude_time; + gint cia; // Chunk size Index into Altitudes + gint ciat; // Chunk size Index into Altitudes / Time + // NB cia & ciat are normally same value but sometimes not due to differing methods of altitude array creation + // thus also have draw_min_altitude for each altitude graph type + gdouble *gradients; + gdouble min_gradient; + gdouble max_gradient; + gdouble draw_min_gradient; + gint cig; // Chunk size Index into Gradients + gdouble *speeds; + gdouble *speeds_dist; + gdouble min_speed; + gdouble max_speed; + gdouble draw_min_speed; + gdouble max_speed_dist; + gint cis; // Chunk size Index into Speeds + gint cisd; // Chunk size Index into Speed/Distance + gdouble *distances; + gint cid; // Chunk size Index into Distance + VikTrackpoint *marker_tp; + gboolean is_marker_drawn; + VikTrackpoint *blob_tp; + gboolean is_blob_drawn; + time_t duration; + gchar *tz; // TimeZone at track's location +} PropWidgets; + +static PropWidgets *prop_widgets_new() +{ + PropWidgets *widgets = g_malloc0(sizeof(PropWidgets)); + + return widgets; +} + +static void prop_widgets_free(PropWidgets *widgets) +{ + if (widgets->elev_graph_saved_img.img) + g_object_unref(widgets->elev_graph_saved_img.img); + if (widgets->gradient_graph_saved_img.img) + g_object_unref(widgets->gradient_graph_saved_img.img); + if (widgets->speed_graph_saved_img.img) + g_object_unref(widgets->speed_graph_saved_img.img); + if (widgets->dist_graph_saved_img.img) + g_object_unref(widgets->dist_graph_saved_img.img); + if (widgets->elev_time_graph_saved_img.img) + g_object_unref(widgets->elev_time_graph_saved_img.img); + if (widgets->speed_dist_graph_saved_img.img) + g_object_unref(widgets->speed_dist_graph_saved_img.img); + if (widgets->altitudes) + g_free(widgets->altitudes); + if (widgets->gradients) + g_free(widgets->gradients); + if (widgets->speeds) + g_free(widgets->speeds); + if (widgets->distances) + g_free(widgets->distances); + if (widgets->ats) + g_free(widgets->ats); + if (widgets->speeds_dist) + g_free(widgets->speeds_dist); + g_free(widgets); +} + +static void minmax_array(const gdouble *array, gdouble *min, gdouble *max, gboolean NO_ALT_TEST, gint PROFILE_WIDTH) +{ + *max = -1000; + *min = 20000; + guint i; + for ( i=0; i < PROFILE_WIDTH; i++ ) { + if ( NO_ALT_TEST || (array[i] != VIK_DEFAULT_ALTITUDE) ) { + if ( array[i] > *max ) + *max = array[i]; + if ( array[i] < *min ) + *min = array[i]; + } + } +} + +#define MARGIN_X 70 +#define MARGIN_Y 20 +#define LINES 5 +/** + * get_new_min_and_chunk_index: + * Returns via pointers: + * the new minimum value to be used for the graph + * the index in to the chunk sizes array (ci = Chunk Index) + */ +static void get_new_min_and_chunk_index (gdouble mina, gdouble maxa, const gdouble *chunks, size_t chunky, gdouble *new_min, gint *ci) +{ + /* Get unitized chunk */ + /* Find suitable chunk index */ + *ci = 0; + gdouble diff_chunk = (maxa - mina)/LINES; + + /* Loop through to find best match */ + while (diff_chunk > chunks[*ci]) { + (*ci)++; + /* Last Resort Check */ + if ( *ci == chunky ) { + // Use previous value and exit loop + (*ci)--; + break; + } + } + + /* Ensure adjusted minimum .. maximum covers mina->maxa */ + + // Now work out adjusted minimum point to the nearest lowest chunk divisor value + // When negative ensure logic uses lowest value + if ( mina < 0 ) + *new_min = (gdouble) ( (gint)((mina - chunks[*ci]) / chunks[*ci]) * chunks[*ci] ); + else + *new_min = (gdouble) ( (gint)(mina / chunks[*ci]) * chunks[*ci] ); + + // Range not big enough - as new minimum has lowered + if ((*new_min + (chunks[*ci] * LINES) < maxa)) { + // Next chunk should cover it + if ( *ci < chunky-1 ) { + (*ci)++; + // Remember to adjust the minimum too... + if ( mina < 0 ) + *new_min = (gdouble) ( (gint)((mina - chunks[*ci]) / chunks[*ci]) * chunks[*ci] ); + else + *new_min = (gdouble) ( (gint)(mina / chunks[*ci]) * chunks[*ci] ); + } + } +} + +static guint get_time_chunk_index (time_t duration) +{ + // Grid split + time_t myduration = duration / LINES; + + // Search nearest chunk index + guint ci = 0; + guint last_chunk = G_N_ELEMENTS(chunkst); + + // Loop through to find best match + while (myduration > chunkst[ci]) { + ci++; + // Last Resort Check + if ( ci == last_chunk ) + break; + } + // Use previous value + if ( ci != 0 ) + ci--; + + return ci; +} + +/** + * + */ +static guint get_distance_chunk_index (gdouble length) +{ + // Grid split + gdouble mylength = length / LINES; + + // Search nearest chunk index + guint ci = 0; + guint last_chunk = G_N_ELEMENTS(chunksd); + + // Loop through to find best match + while (mylength > chunksd[ci]) { + ci++; + // Last Resort Check + if ( ci == last_chunk ) + break; + } + // Use previous value + if ( ci != 0 ) + ci--; + + return ci; +} + +static VikTrackpoint *set_center_at_graph_position(gdouble event_x, + gint img_width, + VikTrwLayer *vtl, + VikLayersPanel *vlp, + VikViewport *vvp, + VikTrack *tr, + gboolean time_base, + gint PROFILE_WIDTH) +{ + VikTrackpoint *trackpoint; + gdouble x = event_x - img_width / 2 + PROFILE_WIDTH / 2 - MARGIN_X / 2; + if (x < 0) + x = 0; + if (x > PROFILE_WIDTH) + x = PROFILE_WIDTH; + + if (time_base) + trackpoint = vik_track_get_closest_tp_by_percentage_time ( tr, (gdouble) x / PROFILE_WIDTH, NULL ); + else + trackpoint = vik_track_get_closest_tp_by_percentage_dist ( tr, (gdouble) x / PROFILE_WIDTH, NULL ); + + if ( trackpoint ) { + VikCoord coord = trackpoint->coord; + if ( vlp ) { + vik_viewport_set_center_coord ( vik_layers_panel_get_viewport(vlp), &coord, TRUE ); + vik_layers_panel_emit_update ( vlp ); + } + else { + /* since vlp not set, vvp should be valid instead! */ + if ( vvp ) + vik_viewport_set_center_coord ( vvp, &coord, TRUE ); + vik_layer_emit_update ( VIK_LAYER(vtl) ); + } + } + return trackpoint; +} + +/** + * Returns whether the marker was drawn or not and whether the blob was drawn or not + */ +static void save_image_and_draw_graph_marks (GtkWidget *image, + gdouble marker_x, + GdkGC *gc, + gint blob_x, + gint blob_y, + PropSaved *saved_img, + gint PROFILE_WIDTH, + gint PROFILE_HEIGHT, + guint blob_size, + gboolean *marker_drawn, + gboolean *blob_drawn) +{ + GdkPixmap *pix = NULL; + /* the pixmap = margin + graph area */ + gtk_image_get_pixmap(GTK_IMAGE(image), &pix, NULL); + + /* Restore previously saved image */ + if (saved_img->saved) { + gdk_draw_image(GDK_DRAWABLE(pix), gc, saved_img->img, 0, 0, 0, 0, MARGIN_X+PROFILE_WIDTH, MARGIN_Y+PROFILE_HEIGHT); + saved_img->saved = FALSE; + } + + // ATM always save whole image - as anywhere could have changed + if (saved_img->img) + gdk_drawable_copy_to_image(GDK_DRAWABLE(pix), saved_img->img, 0, 0, 0, 0, MARGIN_X+PROFILE_WIDTH, MARGIN_Y+PROFILE_HEIGHT); + else + saved_img->img = gdk_drawable_copy_to_image(GDK_DRAWABLE(pix), saved_img->img, 0, 0, 0, 0, MARGIN_X+PROFILE_WIDTH, MARGIN_Y+PROFILE_HEIGHT); + saved_img->saved = TRUE; + + if ((marker_x >= MARGIN_X) && (marker_x < (PROFILE_WIDTH + MARGIN_X))) { + gdk_draw_line (GDK_DRAWABLE(pix), gc, marker_x, MARGIN_Y, marker_x, PROFILE_HEIGHT + MARGIN_Y); + *marker_drawn = TRUE; + } + else + *marker_drawn = FALSE; + + // Draw a square blob to indicate where we are on track for this graph + if ( (blob_x >= MARGIN_X) && (blob_x < (PROFILE_WIDTH + MARGIN_X)) && (blob_y < PROFILE_HEIGHT+MARGIN_Y) ) { + gdk_draw_rectangle (GDK_DRAWABLE(pix), gc, TRUE, blob_x-3, blob_y-3, blob_size, blob_size); + *blob_drawn = TRUE; + } + else + *blob_drawn = FALSE; + + // Anywhere on image could have changed + if (*marker_drawn || *blob_drawn) + gtk_widget_queue_draw(image); +} + +/** + * Return the percentage of how far a trackpoint is a long a track via the time method + */ +static gdouble tp_percentage_by_time ( VikTrack *tr, VikTrackpoint *trackpoint ) +{ + gdouble pc = NAN; + if (trackpoint == NULL) + return pc; + time_t t_start, t_end, t_total; + t_start = VIK_TRACKPOINT(tr->trackpoints->data)->timestamp; + t_end = VIK_TRACKPOINT(g_list_last(tr->trackpoints)->data)->timestamp; + t_total = t_end - t_start; + pc = (gdouble)(trackpoint->timestamp - t_start)/t_total; + return pc; +} + +/** + * Return the percentage of how far a trackpoint is a long a track via the distance method + */ +static gdouble tp_percentage_by_distance ( VikTrack *tr, VikTrackpoint *trackpoint, gdouble track_length ) +{ + gdouble pc = NAN; + if (trackpoint == NULL) + return pc; + gdouble dist = 0.0; + GList *iter; + for (iter = tr->trackpoints->next; iter != NULL; iter = iter->next) { + dist += vik_coord_diff(&(VIK_TRACKPOINT(iter->data)->coord), + &(VIK_TRACKPOINT(iter->prev->data)->coord)); + /* Assuming trackpoint is not a copy */ + if (trackpoint == VIK_TRACKPOINT(iter->data)) + break; + } + if (iter != NULL) + pc = dist/track_length; + return pc; +} + +static void track_graph_click( GtkWidget *event_box, GdkEventButton *event, PropWidgets *widgets, VikPropWinGraphType_t graph_type ) +{ + gboolean is_time_graph = + ( graph_type == PROPWIN_GRAPH_TYPE_SPEED_TIME || + graph_type == PROPWIN_GRAPH_TYPE_DISTANCE_TIME || + graph_type == PROPWIN_GRAPH_TYPE_ELEVATION_TIME ); + + GtkAllocation allocation; + gtk_widget_get_allocation ( event_box, &allocation ); + + VikTrackpoint *trackpoint = set_center_at_graph_position(event->x, allocation.width, widgets->vtl, widgets->vlp, widgets->vvp, widgets->tr, is_time_graph, widgets->profile_width); + // Unable to get the point so give up + if ( trackpoint == NULL ) { + gtk_dialog_set_response_sensitive(GTK_DIALOG(widgets->dialog), VIK_TRW_LAYER_PROPWIN_SPLIT_MARKER, FALSE); + return; + } + + widgets->marker_tp = trackpoint; + + GList *child; + GtkWidget *image; + GtkWidget *window = gtk_widget_get_toplevel(GTK_WIDGET(event_box)); + GtkWidget *graph_box; + PropSaved *graph_saved_img; + gdouble pc = NAN; + + // Attempt to redraw marker on all graph types + gint graphite; + for ( graphite = PROPWIN_GRAPH_TYPE_ELEVATION_DISTANCE; + graphite < PROPWIN_GRAPH_TYPE_END; + graphite++ ) { + + // Switch commonal variables to particular graph type + switch (graphite) { + default: + case PROPWIN_GRAPH_TYPE_ELEVATION_DISTANCE: + graph_box = widgets->elev_box; + graph_saved_img = &widgets->elev_graph_saved_img; + is_time_graph = FALSE; + break; + case PROPWIN_GRAPH_TYPE_GRADIENT_DISTANCE: + graph_box = widgets->gradient_box; + graph_saved_img = &widgets->gradient_graph_saved_img; + is_time_graph = FALSE; + break; + case PROPWIN_GRAPH_TYPE_SPEED_TIME: + graph_box = widgets->speed_box; + graph_saved_img = &widgets->speed_graph_saved_img; + is_time_graph = TRUE; + break; + case PROPWIN_GRAPH_TYPE_DISTANCE_TIME: + graph_box = widgets->dist_box; + graph_saved_img = &widgets->dist_graph_saved_img; + is_time_graph = TRUE; + break; + case PROPWIN_GRAPH_TYPE_ELEVATION_TIME: + graph_box = widgets->elev_time_box; + graph_saved_img = &widgets->elev_time_graph_saved_img; + is_time_graph = TRUE; + break; + case PROPWIN_GRAPH_TYPE_SPEED_DISTANCE: + graph_box = widgets->speed_dist_box; + graph_saved_img = &widgets->speed_dist_graph_saved_img; + is_time_graph = FALSE; + break; + } + + // Commonal method of redrawing marker + if ( graph_box ) { + + child = gtk_container_get_children(GTK_CONTAINER(graph_box)); + image = GTK_WIDGET(child->data); + + if (is_time_graph) + pc = tp_percentage_by_time ( widgets->tr, trackpoint ); + else + pc = tp_percentage_by_distance ( widgets->tr, trackpoint, widgets->track_length_inc_gaps ); + + if (!isnan(pc)) { + gdouble marker_x = (pc * widgets->profile_width) + MARGIN_X; + save_image_and_draw_graph_marks(image, + marker_x, + gtk_widget_get_style(window)->black_gc, + -1, // Don't draw blob on clicks + 0, + graph_saved_img, + widgets->profile_width, + widgets->profile_height, + BLOB_SIZE * vik_viewport_get_scale(widgets->vvp), + &widgets->is_marker_drawn, + &widgets->is_blob_drawn); + } + g_list_free(child); + } + } + + gtk_dialog_set_response_sensitive(GTK_DIALOG(widgets->dialog), VIK_TRW_LAYER_PROPWIN_SPLIT_MARKER, widgets->is_marker_drawn); +} + +static gboolean track_profile_click( GtkWidget *event_box, GdkEventButton *event, gpointer ptr ) +{ + track_graph_click(event_box, event, ptr, PROPWIN_GRAPH_TYPE_ELEVATION_DISTANCE); + return TRUE; /* don't call other (further) callbacks */ +} + +static gboolean track_gradient_click( GtkWidget *event_box, GdkEventButton *event, gpointer ptr ) +{ + track_graph_click(event_box, event, ptr, PROPWIN_GRAPH_TYPE_GRADIENT_DISTANCE); + return TRUE; /* don't call other (further) callbacks */ +} + +static gboolean track_vt_click( GtkWidget *event_box, GdkEventButton *event, gpointer ptr ) +{ + track_graph_click(event_box, event, ptr, PROPWIN_GRAPH_TYPE_SPEED_TIME); + return TRUE; /* don't call other (further) callbacks */ +} + +static gboolean track_dt_click( GtkWidget *event_box, GdkEventButton *event, gpointer ptr ) +{ + track_graph_click(event_box, event, ptr, PROPWIN_GRAPH_TYPE_DISTANCE_TIME); + return TRUE; /* don't call other (further) callbacks */ +} + +static gboolean track_et_click( GtkWidget *event_box, GdkEventButton *event, gpointer ptr ) +{ + track_graph_click(event_box, event, ptr, PROPWIN_GRAPH_TYPE_ELEVATION_TIME); + return TRUE; /* don't call other (further) callbacks */ +} + +static gboolean track_sd_click( GtkWidget *event_box, GdkEventButton *event, gpointer ptr ) +{ + track_graph_click(event_box, event, ptr, PROPWIN_GRAPH_TYPE_SPEED_DISTANCE); + return TRUE; /* don't call other (further) callbacks */ +} + +/** + * Calculate y position for blob on elevation graph + */ +static gint blobby_altitude ( gdouble x_blob, PropWidgets *widgets ) +{ + gint ix = (gint)x_blob; + // Ensure ix is inbounds + if (ix == widgets->profile_width) + ix--; + + gint y_blob = widgets->profile_height-widgets->profile_height*(widgets->altitudes[ix]-widgets->draw_min_altitude)/(chunksa[widgets->cia]*LINES); + + return y_blob; +} + +/** + * Calculate y position for blob on gradient graph + */ +static gint blobby_gradient ( gdouble x_blob, PropWidgets *widgets ) +{ + gint ix = (gint)x_blob; + // Ensure ix is inbounds + if (ix == widgets->profile_width) + ix--; + + gint y_blob = widgets->profile_height-widgets->profile_height*(widgets->gradients[ix]-widgets->draw_min_gradient)/(chunksg[widgets->cig]*LINES); + + return y_blob; +} + +/** + * Calculate y position for blob on speed graph + */ +static gint blobby_speed ( gdouble x_blob, PropWidgets *widgets ) +{ + gint ix = (gint)x_blob; + // Ensure ix is inbounds + if (ix == widgets->profile_width) + ix--; + + gint y_blob = widgets->profile_height-widgets->profile_height*(widgets->speeds[ix]-widgets->draw_min_speed)/(chunkss[widgets->cis]*LINES); + + return y_blob; +} + +/** + * Calculate y position for blob on distance graph + */ +static gint blobby_distance ( gdouble x_blob, PropWidgets *widgets ) +{ + gint ix = (gint)x_blob; + // Ensure ix is inbounds + if (ix == widgets->profile_width) + ix--; + + gint y_blob = widgets->profile_height-widgets->profile_height*(widgets->distances[ix])/(chunksd[widgets->cid]*LINES); + //NB min distance is always 0, so no need to subtract that from this ______/ + + return y_blob; +} + +/** + * Calculate y position for blob on elevation/time graph + */ +static gint blobby_altitude_time ( gdouble x_blob, PropWidgets *widgets ) +{ + gint ix = (gint)x_blob; + // Ensure ix is inbounds + if (ix == widgets->profile_width) + ix--; + + gint y_blob = widgets->profile_height-widgets->profile_height*(widgets->ats[ix]-widgets->draw_min_altitude_time)/(chunksa[widgets->ciat]*LINES); + return y_blob; +} + +/** + * Calculate y position for blob on speed/dist graph + */ +static gint blobby_speed_dist ( gdouble x_blob, PropWidgets *widgets ) +{ + gint ix = (gint)x_blob; + // Ensure ix is inbounds + if (ix == widgets->profile_width) + ix--; + + gint y_blob = widgets->profile_height-widgets->profile_height*(widgets->speeds_dist[ix]-widgets->draw_min_speed)/(chunkss[widgets->cisd]*LINES); + + return y_blob; +} + + +void track_profile_move( GtkWidget *event_box, GdkEventMotion *event, PropWidgets *widgets ) +{ + int mouse_x, mouse_y; + GdkModifierType state; + + if (event->is_hint) + gdk_window_get_pointer (event->window, &mouse_x, &mouse_y, &state); + else + mouse_x = event->x; + + GtkAllocation allocation; + gtk_widget_get_allocation ( event_box, &allocation ); + + gdouble x = mouse_x - allocation.width / 2 + widgets->profile_width / 2 - MARGIN_X / 2; + if (x < 0) + x = 0; + if (x > widgets->profile_width) + x = widgets->profile_width; + + gdouble meters_from_start; + VikTrackpoint *trackpoint = vik_track_get_closest_tp_by_percentage_dist ( widgets->tr, (gdouble) x / widgets->profile_width, &meters_from_start ); + if (trackpoint && widgets->w_cur_dist) { + static gchar tmp_buf[20]; + vik_units_distance_t dist_units = a_vik_get_units_distance (); + switch (dist_units) { + case VIK_UNITS_DISTANCE_KILOMETRES: + g_snprintf(tmp_buf, sizeof(tmp_buf), "%.2f km", meters_from_start/1000.0); + break; + case VIK_UNITS_DISTANCE_MILES: + g_snprintf(tmp_buf, sizeof(tmp_buf), "%.2f miles", VIK_METERS_TO_MILES(meters_from_start) ); + break; + case VIK_UNITS_DISTANCE_NAUTICAL_MILES: + g_snprintf(tmp_buf, sizeof(tmp_buf), "%.2f NM", VIK_METERS_TO_NAUTICAL_MILES(meters_from_start) ); + break; + default: + g_critical("Houston, we've had a problem. distance=%d", dist_units); + } + gtk_label_set_text(GTK_LABEL(widgets->w_cur_dist), tmp_buf); + } + + // Show track elevation for this position - to the nearest whole number + if (trackpoint && widgets->w_cur_elevation) { + static gchar tmp_buf[20]; + if (a_vik_get_units_height () == VIK_UNITS_HEIGHT_FEET) + g_snprintf(tmp_buf, sizeof(tmp_buf), "%d ft", (int)VIK_METERS_TO_FEET(trackpoint->altitude)); + else + g_snprintf(tmp_buf, sizeof(tmp_buf), "%d m", (int)trackpoint->altitude); + gtk_label_set_text(GTK_LABEL(widgets->w_cur_elevation), tmp_buf); + } + + widgets->blob_tp = trackpoint; + + if ( widgets->altitudes == NULL ) + return; + + GtkWidget *window = gtk_widget_get_toplevel (event_box); + GList *child = gtk_container_get_children(GTK_CONTAINER(event_box)); + GtkWidget *image = GTK_WIDGET(child->data); + + gint y_blob = blobby_altitude (x, widgets); + + gdouble marker_x = -1.0; // i.e. Don't draw unless we get a valid value + if (widgets->is_marker_drawn) { + gdouble pc = tp_percentage_by_distance ( widgets->tr, widgets->marker_tp, widgets->track_length_inc_gaps ); + if (!isnan(pc)) { + marker_x = (pc * widgets->profile_width) + MARGIN_X; + } + } + + save_image_and_draw_graph_marks (image, + marker_x, + gtk_widget_get_style(window)->black_gc, + MARGIN_X+x, + MARGIN_Y+y_blob, + &widgets->elev_graph_saved_img, + widgets->profile_width, + widgets->profile_height, + BLOB_SIZE * vik_viewport_get_scale(widgets->vvp), + &widgets->is_marker_drawn, + &widgets->is_blob_drawn); + + g_list_free(child); +} + +void track_gradient_move( GtkWidget *event_box, GdkEventMotion *event, PropWidgets *widgets ) +{ + int mouse_x, mouse_y; + GdkModifierType state; + + if (event->is_hint) + gdk_window_get_pointer (event->window, &mouse_x, &mouse_y, &state); + else + mouse_x = event->x; + + GtkAllocation allocation; + gtk_widget_get_allocation ( event_box, &allocation ); + + gdouble x = mouse_x - allocation.width / 2 + widgets->profile_width / 2 - MARGIN_X / 2; + if (x < 0) + x = 0; + if (x > widgets->profile_width) + x = widgets->profile_width; + + gdouble meters_from_start; + VikTrackpoint *trackpoint = vik_track_get_closest_tp_by_percentage_dist ( widgets->tr, (gdouble) x / widgets->profile_width, &meters_from_start ); + if (trackpoint && widgets->w_cur_gradient_dist) { + static gchar tmp_buf[20]; + vik_units_distance_t dist_units = a_vik_get_units_distance (); + switch (dist_units) { + case VIK_UNITS_DISTANCE_KILOMETRES: + g_snprintf(tmp_buf, sizeof(tmp_buf), "%.2f km", meters_from_start/1000.0); + break; + case VIK_UNITS_DISTANCE_MILES: + g_snprintf(tmp_buf, sizeof(tmp_buf), "%.2f miles", VIK_METERS_TO_MILES(meters_from_start) ); + break; + case VIK_UNITS_DISTANCE_NAUTICAL_MILES: + g_snprintf(tmp_buf, sizeof(tmp_buf), "%.2f NM", VIK_METERS_TO_NAUTICAL_MILES(meters_from_start) ); + break; + default: + g_critical("Houston, we've had a problem. distance=%d", dist_units); + } + gtk_label_set_text(GTK_LABEL(widgets->w_cur_gradient_dist), tmp_buf); + } + + // Show track gradient for this position - to the nearest whole number + if (trackpoint && widgets->w_cur_gradient_gradient) { + static gchar tmp_buf[20]; + + double gradient = widgets->gradients[(int) x]; + + g_snprintf(tmp_buf, sizeof(tmp_buf), "%d%%", (int)gradient); + gtk_label_set_text(GTK_LABEL(widgets->w_cur_gradient_gradient), tmp_buf); + } + + widgets->blob_tp = trackpoint; + + if ( widgets->gradients == NULL ) + return; + + GtkWidget *window = gtk_widget_get_toplevel (event_box); + GList *child = gtk_container_get_children(GTK_CONTAINER(event_box)); + GtkWidget *image = GTK_WIDGET(child->data); + + gint y_blob = blobby_gradient (x, widgets); + + gdouble marker_x = -1.0; // i.e. Don't draw unless we get a valid value + if (widgets->is_marker_drawn) { + gdouble pc = tp_percentage_by_distance ( widgets->tr, widgets->marker_tp, widgets->track_length_inc_gaps ); + if (!isnan(pc)) { + marker_x = (pc * widgets->profile_width) + MARGIN_X; + } + } + + save_image_and_draw_graph_marks (image, + marker_x, + gtk_widget_get_style(window)->black_gc, + MARGIN_X+x, + MARGIN_Y+y_blob, + &widgets->gradient_graph_saved_img, + widgets->profile_width, + widgets->profile_height, + BLOB_SIZE * vik_viewport_get_scale(widgets->vvp), + &widgets->is_marker_drawn, + &widgets->is_blob_drawn); + + g_list_free(child); +} + +// +static void time_label_update (GtkWidget *widget, time_t seconds_from_start) +{ + static gchar tmp_buf[20]; + guint h = seconds_from_start/3600; + guint m = (seconds_from_start - h*3600)/60; + guint s = seconds_from_start - (3600*h) - (60*m); + g_snprintf(tmp_buf, sizeof(tmp_buf), "%02d:%02d:%02d", h, m, s); + gtk_label_set_text(GTK_LABEL(widget), tmp_buf); +} + +// +static void real_time_label_update ( PropWidgets *widgets, GtkWidget *widget, VikTrackpoint *trackpoint) +{ + static gchar tmp_buf[64]; + if ( trackpoint->has_timestamp ) { + // Alternatively could use %c format but I prefer a slightly more compact form here + // The full date can of course be seen on the Statistics tab + strftime (tmp_buf, sizeof(tmp_buf), "%X %x %Z", localtime(&(trackpoint->timestamp))); + } + else + g_snprintf (tmp_buf, sizeof(tmp_buf), _("No Data")); + gtk_label_set_text(GTK_LABEL(widget), tmp_buf); +} + +void track_vt_move( GtkWidget *event_box, GdkEventMotion *event, PropWidgets *widgets ) +{ + int mouse_x, mouse_y; + GdkModifierType state; + + if (event->is_hint) + gdk_window_get_pointer (event->window, &mouse_x, &mouse_y, &state); + else + mouse_x = event->x; + + GtkAllocation allocation; + gtk_widget_get_allocation ( event_box, &allocation ); + gdouble x = mouse_x - allocation.width / 2 + widgets->profile_width / 2 - MARGIN_X / 2; + if (x < 0) + x = 0; + if (x > widgets->profile_width) + x = widgets->profile_width; + + time_t seconds_from_start; + VikTrackpoint *trackpoint = vik_track_get_closest_tp_by_percentage_time ( widgets->tr, (gdouble) x / widgets->profile_width, &seconds_from_start ); + if (trackpoint && widgets->w_cur_time) { + time_label_update ( widgets->w_cur_time, seconds_from_start ); + } + + if (trackpoint && widgets->w_cur_time_real) { + real_time_label_update ( widgets, widgets->w_cur_time_real, trackpoint ); + } + + gint ix = (gint)x; + // Ensure ix is inbounds + if (ix == widgets->profile_width) + ix--; + + // Show track speed for this position + if (trackpoint && widgets->w_cur_speed) { + static gchar tmp_buf[20]; + // Even if GPS speed available (trackpoint->speed), the text will correspond to the speed map shown + // No conversions needed as already in appropriate units + vik_units_speed_t speed_units = a_vik_get_units_speed (); + switch (speed_units) { + case VIK_UNITS_SPEED_KILOMETRES_PER_HOUR: + g_snprintf(tmp_buf, sizeof(tmp_buf), _("%.1f kph"), widgets->speeds[ix]); + break; + case VIK_UNITS_SPEED_MILES_PER_HOUR: + g_snprintf(tmp_buf, sizeof(tmp_buf), _("%.1f mph"), widgets->speeds[ix]); + break; + case VIK_UNITS_SPEED_KNOTS: + g_snprintf(tmp_buf, sizeof(tmp_buf), _("%.1f knots"), widgets->speeds[ix]); + break; + case VIK_UNITS_SPEED_SECONDS_PER_KM: + g_snprintf(tmp_buf, sizeof(tmp_buf), _("%.1f s/km"), widgets->speeds[ix]); + break; + case VIK_UNITS_SPEED_MINUTES_PER_KM: + g_snprintf(tmp_buf, sizeof(tmp_buf), _("%.1f min/km"), widgets->speeds[ix]); + break; + case VIK_UNITS_SPEED_SECONDS_PER_MILE: + g_snprintf(tmp_buf, sizeof(tmp_buf), _("%.1f sec/mi"), widgets->speeds[ix]); + break; + case VIK_UNITS_SPEED_MINUTES_PER_MILE: + g_snprintf(tmp_buf, sizeof(tmp_buf), _("%.1f min/mi"), widgets->speeds[ix]); + break; + default: + // VIK_UNITS_SPEED_METRES_PER_SECOND: + g_snprintf(tmp_buf, sizeof(tmp_buf), _("%.1f m/s"), widgets->speeds[ix]); + break; + } + gtk_label_set_text(GTK_LABEL(widgets->w_cur_speed), tmp_buf); + } + + widgets->blob_tp = trackpoint; + + if ( widgets->speeds == NULL ) + return; + + GtkWidget *window = gtk_widget_get_toplevel (event_box); + GList *child = gtk_container_get_children(GTK_CONTAINER(event_box)); + GtkWidget *image = GTK_WIDGET(child->data); + + gint y_blob = blobby_speed (x, widgets); + + gdouble marker_x = -1.0; // i.e. Don't draw unless we get a valid value + if (widgets->is_marker_drawn) { + gdouble pc = tp_percentage_by_time ( widgets->tr, widgets->marker_tp ); + if (!isnan(pc)) { + marker_x = (pc * widgets->profile_width) + MARGIN_X; + } + } + + save_image_and_draw_graph_marks (image, + marker_x, + gtk_widget_get_style(window)->black_gc, + MARGIN_X+x, + MARGIN_Y+y_blob, + &widgets->speed_graph_saved_img, + widgets->profile_width, + widgets->profile_height, + BLOB_SIZE * vik_viewport_get_scale(widgets->vvp), + &widgets->is_marker_drawn, + &widgets->is_blob_drawn); + + g_list_free(child); +} + +/** + * Update labels and blob marker on mouse moves in the distance/time graph + */ +void track_dt_move( GtkWidget *event_box, GdkEventMotion *event, PropWidgets *widgets ) +{ + int mouse_x, mouse_y; + GdkModifierType state; + + if (event->is_hint) + gdk_window_get_pointer (event->window, &mouse_x, &mouse_y, &state); + else + mouse_x = event->x; + + GtkAllocation allocation; + gtk_widget_get_allocation ( event_box, &allocation ); + + gdouble x = mouse_x - allocation.width / 2 + widgets->profile_width / 2 - MARGIN_X / 2; + if (x < 0) + x = 0; + if (x > widgets->profile_width) + x = widgets->profile_width; + + time_t seconds_from_start; + VikTrackpoint *trackpoint = vik_track_get_closest_tp_by_percentage_time ( widgets->tr, (gdouble) x / widgets->profile_width, &seconds_from_start ); + if (trackpoint && widgets->w_cur_dist_time) { + time_label_update ( widgets->w_cur_dist_time, seconds_from_start ); + } + + if (trackpoint && widgets->w_cur_dist_time_real) { + real_time_label_update ( widgets, widgets->w_cur_dist_time_real, trackpoint ); + } + + gint ix = (gint)x; + // Ensure ix is inbounds + if (ix == widgets->profile_width) + ix--; + + if (trackpoint && widgets->w_cur_dist_dist) { + static gchar tmp_buf[20]; + switch ( a_vik_get_units_distance () ) { + case VIK_UNITS_DISTANCE_MILES: + g_snprintf(tmp_buf, sizeof(tmp_buf), "%.2f miles", widgets->distances[ix]); + break; + case VIK_UNITS_DISTANCE_NAUTICAL_MILES: + g_snprintf(tmp_buf, sizeof(tmp_buf), "%.2f NM", widgets->distances[ix]); + break; + default: + g_snprintf(tmp_buf, sizeof(tmp_buf), "%.2f km", widgets->distances[ix]); + break; + } + gtk_label_set_text(GTK_LABEL(widgets->w_cur_dist_dist), tmp_buf); + } + + widgets->blob_tp = trackpoint; + + if ( widgets->distances == NULL ) + return; + + GtkWidget *window = gtk_widget_get_toplevel (event_box); + GList *child = gtk_container_get_children(GTK_CONTAINER(event_box)); + GtkWidget *image = GTK_WIDGET(child->data); + + gint y_blob = blobby_distance (x, widgets); + + gdouble marker_x = -1.0; // i.e. Don't draw unless we get a valid value + if (widgets->is_marker_drawn) { + gdouble pc = tp_percentage_by_time ( widgets->tr, widgets->marker_tp ); + if (!isnan(pc)) { + marker_x = (pc * widgets->profile_width) + MARGIN_X; + } + } + + save_image_and_draw_graph_marks (image, + marker_x, + gtk_widget_get_style(window)->black_gc, + MARGIN_X+x, + MARGIN_Y+y_blob, + &widgets->dist_graph_saved_img, + widgets->profile_width, + widgets->profile_height, + BLOB_SIZE * vik_viewport_get_scale(widgets->vvp), + &widgets->is_marker_drawn, + &widgets->is_blob_drawn); + + g_list_free(child); +} + +/** + * Update labels and blob marker on mouse moves in the elevation/time graph + */ +void track_et_move( GtkWidget *event_box, GdkEventMotion *event, PropWidgets *widgets ) +{ + int mouse_x, mouse_y; + GdkModifierType state; + + if (event->is_hint) + gdk_window_get_pointer (event->window, &mouse_x, &mouse_y, &state); + else + mouse_x = event->x; + + GtkAllocation allocation; + gtk_widget_get_allocation ( event_box, &allocation ); + + gdouble x = mouse_x - allocation.width / 2 + widgets->profile_width / 2 - MARGIN_X / 2; + if (x < 0) + x = 0; + if (x > widgets->profile_width) + x = widgets->profile_width; + + time_t seconds_from_start; + VikTrackpoint *trackpoint = vik_track_get_closest_tp_by_percentage_time ( widgets->tr, (gdouble) x / widgets->profile_width, &seconds_from_start ); + if (trackpoint && widgets->w_cur_elev_time) { + time_label_update ( widgets->w_cur_elev_time, seconds_from_start ); + } + + if (trackpoint && widgets->w_cur_elev_time_real) { + real_time_label_update ( widgets, widgets->w_cur_elev_time_real, trackpoint ); + } + + gint ix = (gint)x; + // Ensure ix is inbounds + if (ix == widgets->profile_width) + ix--; + + if (trackpoint && widgets->w_cur_elev_elev) { + static gchar tmp_buf[20]; + if (a_vik_get_units_height () == VIK_UNITS_HEIGHT_FEET) + g_snprintf(tmp_buf, sizeof(tmp_buf), "%d ft", (int)VIK_METERS_TO_FEET(trackpoint->altitude)); + else + g_snprintf(tmp_buf, sizeof(tmp_buf), "%d m", (int)trackpoint->altitude); + gtk_label_set_text(GTK_LABEL(widgets->w_cur_elev_elev), tmp_buf); + } + + widgets->blob_tp = trackpoint; + + if ( widgets->ats == NULL ) + return; + + GtkWidget *window = gtk_widget_get_toplevel (event_box); + GList *child = gtk_container_get_children(GTK_CONTAINER(event_box)); + GtkWidget *image = GTK_WIDGET(child->data); + + gint y_blob = blobby_altitude_time (x, widgets); + + gdouble marker_x = -1.0; // i.e. Don't draw unless we get a valid value + if (widgets->is_marker_drawn) { + gdouble pc = tp_percentage_by_time ( widgets->tr, widgets->marker_tp ); + if (!isnan(pc)) { + marker_x = (pc * widgets->profile_width) + MARGIN_X; + } + } + + save_image_and_draw_graph_marks (image, + marker_x, + gtk_widget_get_style(window)->black_gc, + MARGIN_X+x, + MARGIN_Y+y_blob, + &widgets->elev_time_graph_saved_img, + widgets->profile_width, + widgets->profile_height, + BLOB_SIZE * vik_viewport_get_scale(widgets->vvp), + &widgets->is_marker_drawn, + &widgets->is_blob_drawn); + + g_list_free(child); +} + +void track_sd_move( GtkWidget *event_box, GdkEventMotion *event, PropWidgets *widgets ) +{ + int mouse_x, mouse_y; + GdkModifierType state; + + if (event->is_hint) + gdk_window_get_pointer (event->window, &mouse_x, &mouse_y, &state); + else + mouse_x = event->x; + + GtkAllocation allocation; + gtk_widget_get_allocation ( event_box, &allocation ); + + gdouble x = mouse_x - allocation.width / 2 + widgets->profile_width / 2 - MARGIN_X / 2; + if (x < 0) + x = 0; + if (x > widgets->profile_width) + x = widgets->profile_width; + + gdouble meters_from_start; + VikTrackpoint *trackpoint = vik_track_get_closest_tp_by_percentage_dist ( widgets->tr, (gdouble) x / widgets->profile_width, &meters_from_start ); + if (trackpoint && widgets->w_cur_speed_dist) { + static gchar tmp_buf[20]; + vik_units_distance_t dist_units = a_vik_get_units_distance (); + switch (dist_units) { + case VIK_UNITS_DISTANCE_KILOMETRES: + g_snprintf(tmp_buf, sizeof(tmp_buf), "%.2f km", meters_from_start/1000.0); + break; + case VIK_UNITS_DISTANCE_MILES: + g_snprintf(tmp_buf, sizeof(tmp_buf), "%.2f miles", VIK_METERS_TO_MILES(meters_from_start) ); + break; + case VIK_UNITS_DISTANCE_NAUTICAL_MILES: + g_snprintf(tmp_buf, sizeof(tmp_buf), "%.2f NM", VIK_METERS_TO_NAUTICAL_MILES(meters_from_start) ); + break; + default: + g_critical("Houston, we've had a problem. distance=%d", dist_units); + } + gtk_label_set_text(GTK_LABEL(widgets->w_cur_speed_dist), tmp_buf); + } + + gint ix = (gint)x; + // Ensure ix is inbounds + if (ix == widgets->profile_width) + ix--; + + if ( widgets->speeds_dist == NULL ) + return; + + // Show track speed for this position + if (widgets->w_cur_speed_speed) { + static gchar tmp_buf[20]; + // Even if GPS speed available (trackpoint->speed), the text will correspond to the speed map shown + // No conversions needed as already in appropriate units + vik_units_speed_t speed_units = a_vik_get_units_speed (); + switch (speed_units) { + case VIK_UNITS_SPEED_KILOMETRES_PER_HOUR: + g_snprintf(tmp_buf, sizeof(tmp_buf), _("%.1f kph"), widgets->speeds_dist[ix]); + break; + case VIK_UNITS_SPEED_MILES_PER_HOUR: + g_snprintf(tmp_buf, sizeof(tmp_buf), _("%.1f mph"), widgets->speeds_dist[ix]); + break; + case VIK_UNITS_SPEED_KNOTS: + g_snprintf(tmp_buf, sizeof(tmp_buf), _("%.1f knots"), widgets->speeds_dist[ix]); + break; + case VIK_UNITS_SPEED_SECONDS_PER_KM: + g_snprintf(tmp_buf, sizeof(tmp_buf), _("%.1f s/km"), widgets->speeds_dist[ix]); + break; + case VIK_UNITS_SPEED_MINUTES_PER_KM: + g_snprintf(tmp_buf, sizeof(tmp_buf), _("%.1f min/km"), widgets->speeds_dist[ix]); + break; + case VIK_UNITS_SPEED_SECONDS_PER_MILE: + g_snprintf(tmp_buf, sizeof(tmp_buf), _("%.1f sec/mi"), widgets->speeds_dist[ix]); + break; + case VIK_UNITS_SPEED_MINUTES_PER_MILE: + g_snprintf(tmp_buf, sizeof(tmp_buf), _("%.1f min/mi"), widgets->speeds_dist[ix]); + break; + default: + // VIK_UNITS_SPEED_METRES_PER_SECOND: + g_snprintf(tmp_buf, sizeof(tmp_buf), _("%.1f m/s"), widgets->speeds_dist[ix]); + break; + } + gtk_label_set_text(GTK_LABEL(widgets->w_cur_speed_speed), tmp_buf); + } + + widgets->blob_tp = trackpoint; + + GtkWidget *window = gtk_widget_get_toplevel (event_box); + GList *child = gtk_container_get_children(GTK_CONTAINER(event_box)); + GtkWidget *image = GTK_WIDGET(child->data); + + gint y_blob = blobby_speed_dist (x, widgets); + + gdouble marker_x = -1.0; // i.e. Don't draw unless we get a valid value + if (widgets->is_marker_drawn) { + gdouble pc = tp_percentage_by_distance ( widgets->tr, widgets->marker_tp, widgets->track_length_inc_gaps ); + if (!isnan(pc)) { + marker_x = (pc * widgets->profile_width) + MARGIN_X; + } + } + + save_image_and_draw_graph_marks (image, + marker_x, + gtk_widget_get_style(window)->black_gc, + MARGIN_X+x, + MARGIN_Y+y_blob, + &widgets->speed_dist_graph_saved_img, + widgets->profile_width, + widgets->profile_height, + BLOB_SIZE * vik_viewport_get_scale(widgets->vvp), + &widgets->is_marker_drawn, + &widgets->is_blob_drawn); + + g_list_free(child); +} + +/** + * Draws DEM points and a respresentative speed on the supplied pixmap + * (which is the elevations graph) + */ +static void draw_dem_alt_speed_dist(VikTrack *tr, + GdkDrawable *pix, + GdkGC *alt_gc, + GdkGC *speed_gc, + gdouble alt_offset, + gdouble alt_diff, + gdouble max_speed_in, + gint cia, + gint width, + gint height, + gint margin, + gboolean do_dem, + gboolean do_speed) +{ + GList *iter; + gdouble max_speed = 0; + gdouble total_length = vik_track_get_length_including_gaps(tr); + + // Calculate the max speed factor + if (do_speed) + max_speed = max_speed_in * 110 / 100; + + gdouble dist = 0; + gint h2 = height + MARGIN_Y; // Adjust height for x axis labelling offset + gint achunk = chunksa[cia]*LINES; + + for (iter = tr->trackpoints->next; iter; iter = iter->next) { + int x; + dist += vik_coord_diff ( &(VIK_TRACKPOINT(iter->data)->coord), + &(VIK_TRACKPOINT(iter->prev->data)->coord) ); + x = (width * dist)/total_length + margin; + if (do_dem) { + gint16 elev = a_dems_get_elev_by_coord(&(VIK_TRACKPOINT(iter->data)->coord), VIK_DEM_INTERPOL_BEST); + if ( elev != VIK_DEM_INVALID_ELEVATION ) { + // Convert into height units + if (a_vik_get_units_height () == VIK_UNITS_HEIGHT_FEET) + elev = VIK_METERS_TO_FEET(elev); + // No conversion needed if already in metres + + // offset is in current height units + elev -= alt_offset; + + // consider chunk size + int y_alt = h2 - ((height * elev)/achunk ); + gdk_draw_rectangle(GDK_DRAWABLE(pix), alt_gc, TRUE, x-2, y_alt-2, 4, 4); + } + } + if (do_speed) { + // This is just a speed indicator - no actual values can be inferred by user + if (!isnan(VIK_TRACKPOINT(iter->data)->speed)) { + int y_speed = h2 - (height * VIK_TRACKPOINT(iter->data)->speed)/max_speed; + gdk_draw_rectangle(GDK_DRAWABLE(pix), speed_gc, TRUE, x-2, y_speed-2, 4, 4); + } + } + } +} + +/** + * draw_grid_y: + * + * A common way to draw the grid with y axis labels + * + */ +static void draw_grid_y ( GtkWidget *window, GtkWidget *image, PropWidgets *widgets, GdkPixmap *pix, gchar *ss, gint i ) +{ + PangoLayout *pl = gtk_widget_create_pango_layout (GTK_WIDGET(image), NULL); + + pango_layout_set_alignment (pl, PANGO_ALIGN_RIGHT); + pango_layout_set_font_description (pl, gtk_widget_get_style(window)->font_desc); + + gchar *label_markup = g_strdup_printf ( "%s", ss ); + pango_layout_set_markup ( pl, label_markup, -1 ); + g_free ( label_markup ); + + int w, h; + pango_layout_get_pixel_size ( pl, &w, &h ); + + gdk_draw_layout ( GDK_DRAWABLE(pix), gtk_widget_get_style(window)->fg_gc[0], + MARGIN_X-w-3, + CLAMP((int)i*widgets->profile_height/LINES - h/2 + MARGIN_Y, 0, widgets->profile_height-h+MARGIN_Y), + pl ); + g_object_unref ( G_OBJECT ( pl ) ); + + gdk_draw_line ( GDK_DRAWABLE(pix), gtk_widget_get_style(window)->dark_gc[0], + MARGIN_X, MARGIN_Y + widgets->profile_height/LINES * i, + MARGIN_X + widgets->profile_width, MARGIN_Y + widgets->profile_height/LINES * i ); +} + +/** + * draw_grid_x_time: + * + * A common way to draw the grid with x axis labels for time graphs + * + */ +static void draw_grid_x_time ( GtkWidget *window, GtkWidget *image, PropWidgets *widgets, GdkPixmap *pix, guint ii, guint tt, guint xx ) +{ + gchar *label_markup = NULL; + switch (ii) { + case 0: + case 1: + case 2: + case 3: + // Minutes + label_markup = g_strdup_printf ( "%d %s", tt/60, _("mins") ); + break; + case 4: + case 5: + case 6: + case 7: + // Hours + label_markup = g_strdup_printf ( "%.1f %s", (gdouble)tt/(60*60), _("h") ); + break; + case 8: + case 9: + case 10: + // Days + label_markup = g_strdup_printf ( "%.1f %s", (gdouble)tt/(60*60*24), _("d") ); + break; + case 11: + case 12: + // Weeks + label_markup = g_strdup_printf ( "%.1f %s", (gdouble)tt/(60*60*24*7), _("w") ); + break; + case 13: + // 'Months' + label_markup = g_strdup_printf ( "%.1f %s", (gdouble)tt/(60*60*24*28), _("M") ); + break; + default: + break; + } + if ( label_markup ) { + + PangoLayout *pl = gtk_widget_create_pango_layout (GTK_WIDGET(image), NULL); + pango_layout_set_font_description (pl, gtk_widget_get_style(window)->font_desc); + + pango_layout_set_markup ( pl, label_markup, -1 ); + g_free ( label_markup ); + int ww, hh; + pango_layout_get_pixel_size ( pl, &ww, &hh ); + + gdk_draw_layout ( GDK_DRAWABLE(pix), gtk_widget_get_style(window)->fg_gc[0], + MARGIN_X+xx-ww/2, MARGIN_Y/2-hh/2, pl ); + g_object_unref ( G_OBJECT ( pl ) ); + } + + gdk_draw_line ( GDK_DRAWABLE(pix), gtk_widget_get_style(window)->dark_gc[0], + MARGIN_X+xx, MARGIN_Y, MARGIN_X+xx, MARGIN_Y+widgets->profile_height ); +} + +/** + * draw_grid_x_distance: + * + * A common way to draw the grid with x axis labels for distance graphs + * + */ +static void draw_grid_x_distance ( GtkWidget *window, GtkWidget *image, PropWidgets *widgets, GdkPixmap *pix, guint ii, gdouble dd, guint xx, vik_units_distance_t dist_units ) +{ + gchar *label_markup = NULL; + switch ( dist_units ) { + case VIK_UNITS_DISTANCE_MILES: + if ( ii > 4 ) + label_markup = g_strdup_printf ( "%d %s", (guint)dd, _("miles") ); + else + label_markup = g_strdup_printf ( "%.1f %s", dd, _("miles") ); + break; + case VIK_UNITS_DISTANCE_NAUTICAL_MILES: + if ( ii > 4 ) + label_markup = g_strdup_printf ( "%d %s", (guint)dd, _("NM") ); + else + label_markup = g_strdup_printf ( "%.1f %s", dd, _("NM") ); + break; + default: + // VIK_UNITS_DISTANCE_KILOMETRES: + if ( ii > 4 ) + label_markup = g_strdup_printf ( "%d %s", (guint)dd, _("km") ); + else + label_markup = g_strdup_printf ( "%.1f %s", dd, _("km") ); + break; + } + + if ( label_markup ) { + PangoLayout *pl = gtk_widget_create_pango_layout (GTK_WIDGET(image), NULL); + pango_layout_set_font_description (pl, gtk_widget_get_style(window)->font_desc); + + pango_layout_set_markup ( pl, label_markup, -1 ); + g_free ( label_markup ); + int ww, hh; + pango_layout_get_pixel_size ( pl, &ww, &hh ); + + gdk_draw_layout ( GDK_DRAWABLE(pix), gtk_widget_get_style(window)->fg_gc[0], + MARGIN_X+xx-ww/2, MARGIN_Y/2-hh/2, pl ); + g_object_unref ( G_OBJECT ( pl ) ); + } + + gdk_draw_line ( GDK_DRAWABLE(pix), gtk_widget_get_style(window)->dark_gc[0], + MARGIN_X+xx, MARGIN_Y, MARGIN_X+xx, MARGIN_Y+widgets->profile_height ); +} + +/** + * clear the images (scale texts & actual graph) + */ +static void clear_images (GdkPixmap *pix, GtkWidget *window, PropWidgets *widgets) +{ + gdk_draw_rectangle(GDK_DRAWABLE(pix), gtk_widget_get_style(window)->bg_gc[0], + TRUE, 0, 0, widgets->profile_width+MARGIN_X, widgets->profile_height+MARGIN_Y); + gdk_draw_rectangle(GDK_DRAWABLE(pix), gtk_widget_get_style(window)->mid_gc[0], + TRUE, 0, 0, widgets->profile_width+MARGIN_X, widgets->profile_height+MARGIN_Y); +} + +/** + * + */ +static void draw_distance_divisions ( GtkWidget *window, GtkWidget *image, GdkPixmap *pix, PropWidgets *widgets, vik_units_distance_t dist_units ) +{ + // Set to display units from length in metres. + gdouble length = widgets->track_length_inc_gaps; + switch (dist_units) { + case VIK_UNITS_DISTANCE_MILES: + length = VIK_METERS_TO_MILES(length); + break; + case VIK_UNITS_DISTANCE_NAUTICAL_MILES: + length = VIK_METERS_TO_NAUTICAL_MILES(length); + break; + default: + // KM + length = length/1000.0; + break; + } + guint index = get_distance_chunk_index ( length ); + gdouble dist_per_pixel = length/widgets->profile_width; + + for (guint i=1; chunksd[index]*i <= length; i++) { + draw_grid_x_distance ( window, image, widgets, pix, index, chunksd[index]*i, (guint)(chunksd[index]*i/dist_per_pixel), dist_units ); + } +} + +/** + * Draw just the height profile image + */ +static void draw_elevations (GtkWidget *image, VikTrack *tr, PropWidgets *widgets ) +{ + guint i; + + GdkGC *no_alt_info; + GdkColor color; + + // Free previous allocation + if ( widgets->altitudes ) + g_free ( widgets->altitudes ); + + widgets->altitudes = vik_track_make_elevation_map ( tr, widgets->profile_width ); + + if ( widgets->altitudes == NULL ) + return; + + // Convert into appropriate units + vik_units_height_t height_units = a_vik_get_units_height (); + if ( height_units == VIK_UNITS_HEIGHT_FEET ) { + // Convert altitudes into feet units + for ( i = 0; i < widgets->profile_width; i++ ) { + widgets->altitudes[i] = VIK_METERS_TO_FEET(widgets->altitudes[i]); + } + } + // Otherwise leave in metres + + minmax_array(widgets->altitudes, &widgets->min_altitude, &widgets->max_altitude, TRUE, widgets->profile_width); + + get_new_min_and_chunk_index (widgets->min_altitude, widgets->max_altitude, chunksa, G_N_ELEMENTS(chunksa), &widgets->draw_min_altitude, &widgets->cia); + + // Assign locally + gdouble mina = widgets->draw_min_altitude; + + GtkWidget *window = gtk_widget_get_toplevel (widgets->elev_box); + GdkPixmap *pix = gdk_pixmap_new( gtk_widget_get_window(window), widgets->profile_width+MARGIN_X, widgets->profile_height+MARGIN_Y, -1 ); + + gtk_image_set_from_pixmap ( GTK_IMAGE(image), pix, NULL ); + + no_alt_info = gdk_gc_new ( gtk_widget_get_window(window) ); + gdk_color_parse ( "yellow", &color ); + gdk_gc_set_rgb_fg_color ( no_alt_info, &color); + + // Reset before redrawing + clear_images (pix, window, widgets); + + /* draw grid */ + for (i=0; i<=LINES; i++) { + gchar s[32]; + + switch (height_units) { + case VIK_UNITS_HEIGHT_METRES: + sprintf(s, "%8dm", (int)(mina + (LINES-i)*chunksa[widgets->cia])); + break; + case VIK_UNITS_HEIGHT_FEET: + // NB values already converted into feet + sprintf(s, "%8dft", (int)(mina + (LINES-i)*chunksa[widgets->cia])); + break; + default: + sprintf(s, "--"); + g_critical("Houston, we've had a problem. height=%d", height_units); + } + + draw_grid_y ( window, image, widgets, pix, s, i ); + } + + draw_distance_divisions ( window, image, pix, widgets, a_vik_get_units_distance() ); + + /* draw elevations */ + guint height = MARGIN_Y+widgets->profile_height; + for ( i = 0; i < widgets->profile_width; i++ ) + if ( widgets->altitudes[i] == VIK_DEFAULT_ALTITUDE ) + gdk_draw_line ( GDK_DRAWABLE(pix), no_alt_info, + i + MARGIN_X, MARGIN_Y, i + MARGIN_X, height ); + else + gdk_draw_line ( GDK_DRAWABLE(pix), gtk_widget_get_style(window)->dark_gc[3], + i + MARGIN_X, height, i + MARGIN_X, height-widgets->profile_height*(widgets->altitudes[i]-mina)/(chunksa[widgets->cia]*LINES) ); + + if ( gtk_toggle_button_get_active (GTK_TOGGLE_BUTTON(widgets->w_show_dem)) || + gtk_toggle_button_get_active (GTK_TOGGLE_BUTTON(widgets->w_show_alt_gps_speed)) ) { + + GdkGC *dem_alt_gc = gdk_gc_new ( gtk_widget_get_window(window) ); + GdkGC *gps_speed_gc = gdk_gc_new ( gtk_widget_get_window(window) ); + + gdk_color_parse ( "green", &color ); + gdk_gc_set_rgb_fg_color ( dem_alt_gc, &color); + + gdk_color_parse ( "red", &color ); + gdk_gc_set_rgb_fg_color ( gps_speed_gc, &color); + + // Ensure somekind of max speed when not set + if ( widgets->max_speed < 0.01 ) + widgets->max_speed = vik_track_get_max_speed(tr); + + draw_dem_alt_speed_dist(tr, + GDK_DRAWABLE(pix), + dem_alt_gc, + gps_speed_gc, + mina, + widgets->max_altitude - mina, + widgets->max_speed, + widgets->cia, + widgets->profile_width, + widgets->profile_height, + MARGIN_X, + gtk_toggle_button_get_active (GTK_TOGGLE_BUTTON(widgets->w_show_dem)), + gtk_toggle_button_get_active (GTK_TOGGLE_BUTTON(widgets->w_show_alt_gps_speed))); + + g_object_unref ( G_OBJECT(dem_alt_gc) ); + g_object_unref ( G_OBJECT(gps_speed_gc) ); + } + + /* draw border */ + gdk_draw_rectangle(GDK_DRAWABLE(pix), gtk_widget_get_style(window)->black_gc, FALSE, MARGIN_X, MARGIN_Y, widgets->profile_width-1, widgets->profile_height-1); + + g_object_unref ( G_OBJECT(pix) ); + g_object_unref ( G_OBJECT(no_alt_info) ); +} + +/** + * Draws representative speed on the supplied pixmap + * (which is the gradients graph) + */ +static void draw_speed_dist(VikTrack *tr, + GdkDrawable *pix, + GdkGC *speed_gc, + gdouble max_speed_in, + gint width, + gint height, + gint margin, + gboolean do_speed) +{ + GList *iter; + gdouble max_speed = 0; + gdouble total_length = vik_track_get_length_including_gaps(tr); + + // Calculate the max speed factor + if (do_speed) + max_speed = max_speed_in * 110 / 100; + + gdouble dist = 0; + for (iter = tr->trackpoints->next; iter; iter = iter->next) { + int x; + dist += vik_coord_diff ( &(VIK_TRACKPOINT(iter->data)->coord), + &(VIK_TRACKPOINT(iter->prev->data)->coord) ); + x = (width * dist)/total_length + MARGIN_X; + if (do_speed) { + // This is just a speed indicator - no actual values can be inferred by user + if (!isnan(VIK_TRACKPOINT(iter->data)->speed)) { + int y_speed = height - (height * VIK_TRACKPOINT(iter->data)->speed)/max_speed; + gdk_draw_rectangle(GDK_DRAWABLE(pix), speed_gc, TRUE, x-2, y_speed-2, 4, 4); + } + } + } +} + +/** + * Draw just the gradient image + */ +static void draw_gradients (GtkWidget *image, VikTrack *tr, PropWidgets *widgets ) +{ + guint i; + + // Free previous allocation + if ( widgets->gradients ) + g_free ( widgets->gradients ); + + widgets->gradients = vik_track_make_gradient_map ( tr, widgets->profile_width ); + + if ( widgets->gradients == NULL ) + return; + + minmax_array(widgets->gradients, &widgets->min_gradient, &widgets->max_gradient, TRUE, widgets->profile_width); + + get_new_min_and_chunk_index (widgets->min_gradient, widgets->max_gradient, chunksg, G_N_ELEMENTS(chunksg), &widgets->draw_min_gradient, &widgets->cig); + + // Assign locally + gdouble mina = widgets->draw_min_gradient; + + GtkWidget *window = gtk_widget_get_toplevel (widgets->gradient_box); + GdkPixmap *pix = gdk_pixmap_new( gtk_widget_get_window(window), widgets->profile_width+MARGIN_X, widgets->profile_height+MARGIN_Y, -1 ); + + gtk_image_set_from_pixmap ( GTK_IMAGE(image), pix, NULL ); + + // Reset before redrawing + clear_images (pix, window, widgets); + + /* draw grid */ + for (i=0; i<=LINES; i++) { + gchar s[32]; + + sprintf(s, "%8d%%", (int)(mina + (LINES-i)*chunksg[widgets->cig])); + + draw_grid_y ( window, image, widgets, pix, s, i ); + } + + draw_distance_divisions ( window, image, pix, widgets, a_vik_get_units_distance() ); + + /* draw gradients */ + guint height = widgets->profile_height + MARGIN_Y; + for ( i = 0; i < widgets->profile_width; i++ ) + gdk_draw_line ( GDK_DRAWABLE(pix), gtk_widget_get_style(window)->dark_gc[3], + i + MARGIN_X, height, i + MARGIN_X, height - widgets->profile_height*(widgets->gradients[i]-mina)/(chunksg[widgets->cig]*LINES) ); + + if ( gtk_toggle_button_get_active (GTK_TOGGLE_BUTTON(widgets->w_show_gradient_gps_speed)) ) { + GdkGC *gps_speed_gc = gdk_gc_new ( gtk_widget_get_window(window) ); + + GdkColor color; + gdk_color_parse ( "red", &color ); + gdk_gc_set_rgb_fg_color ( gps_speed_gc, &color); + + // Ensure somekind of max speed when not set + if ( widgets->max_speed < 0.01 ) + widgets->max_speed = vik_track_get_max_speed(tr); + + draw_speed_dist(tr, + GDK_DRAWABLE(pix), + gps_speed_gc, + widgets->max_speed, + widgets->profile_width, + widgets->profile_height, + MARGIN_X, + gtk_toggle_button_get_active (GTK_TOGGLE_BUTTON(widgets->w_show_alt_gps_speed))); + + g_object_unref ( G_OBJECT(gps_speed_gc) ); + } + + /* draw border */ + gdk_draw_rectangle(GDK_DRAWABLE(pix), gtk_widget_get_style(window)->black_gc, FALSE, MARGIN_X, MARGIN_Y, widgets->profile_width-1, widgets->profile_height-1); + + g_object_unref ( G_OBJECT(pix) ); +} + +static void draw_time_lines ( GtkWidget *window, GtkWidget *image, GdkPixmap *pix, PropWidgets *widgets ) +{ + guint index = get_time_chunk_index ( widgets->duration ); + gdouble time_per_pixel = (gdouble)(widgets->duration)/widgets->profile_width; + + // If stupidly long track in time - don't bother trying to draw grid lines + if ( widgets->duration > chunkst[G_N_ELEMENTS(chunkst)-1]*LINES*LINES ) + return; + + for (guint i=1; chunkst[index]*i <= widgets->duration; i++) { + draw_grid_x_time ( window, image, widgets, pix, index, chunkst[index]*i, (guint)(chunkst[index]*i/time_per_pixel) ); + } +} + +/** + * Draw just the speed (velocity)/time image + */ +static void draw_vt ( GtkWidget *image, VikTrack *tr, PropWidgets *widgets ) +{ + guint i; + + // Free previous allocation + if ( widgets->speeds ) + g_free ( widgets->speeds ); + + widgets->speeds = vik_track_make_speed_map ( tr, widgets->profile_width ); + if ( widgets->speeds == NULL ) + return; + + widgets->duration = vik_track_get_duration ( tr, TRUE ); + // Negative time or other problem + if ( widgets->duration <= 0 ) + return; + + // Convert into appropriate units + vik_units_speed_t speed_units = a_vik_get_units_speed (); + switch (speed_units) { + case VIK_UNITS_SPEED_KILOMETRES_PER_HOUR: + for ( i = 0; i < widgets->profile_width; i++ ) { + widgets->speeds[i] = VIK_MPS_TO_KPH(widgets->speeds[i]); + } + break; + case VIK_UNITS_SPEED_MILES_PER_HOUR: + for ( i = 0; i < widgets->profile_width; i++ ) { + widgets->speeds[i] = VIK_MPS_TO_MPH(widgets->speeds[i]); + } + break; + case VIK_UNITS_SPEED_KNOTS: + for ( i = 0; i < widgets->profile_width; i++ ) { + widgets->speeds[i] = VIK_MPS_TO_KNOTS(widgets->speeds[i]); + } + break; + case VIK_UNITS_SPEED_SECONDS_PER_KM: + for ( i = 0; i < widgets->profile_width; i++ ) { + widgets->speeds[i] = VIK_MPS_TO_PACE_SPK(widgets->speeds[i]); + } + break; + case VIK_UNITS_SPEED_MINUTES_PER_KM: + for ( i = 0; i < widgets->profile_width; i++ ) { + widgets->speeds[i] = VIK_MPS_TO_PACE_MPK(widgets->speeds[i]); + } + break; + case VIK_UNITS_SPEED_SECONDS_PER_MILE: + for ( i = 0; i < widgets->profile_width; i++ ) { + widgets->speeds[i] = VIK_MPS_TO_PACE_SPM(widgets->speeds[i]); + } + break; + case VIK_UNITS_SPEED_MINUTES_PER_MILE: + for ( i = 0; i < widgets->profile_width; i++ ) { + widgets->speeds[i] = VIK_MPS_TO_PACE_MPM(widgets->speeds[i]); + } + break; + default: + // VIK_UNITS_SPEED_METRES_PER_SECOND: + // No need to convert as already in m/s + break; + } + + GtkWidget *window = gtk_widget_get_toplevel (widgets->speed_box); + GdkPixmap *pix = gdk_pixmap_new( gtk_widget_get_window(window), widgets->profile_width+MARGIN_X, widgets->profile_height+MARGIN_Y, -1 ); + + gtk_image_set_from_pixmap ( GTK_IMAGE(image), pix, NULL ); + + minmax_array(widgets->speeds, &widgets->min_speed, &widgets->max_speed, FALSE, widgets->profile_width); + if (widgets->min_speed < 0.0) + widgets->min_speed = 0; /* splines sometimes give negative speeds */ + + /* Find suitable chunk index */ + get_new_min_and_chunk_index (widgets->min_speed, widgets->max_speed, chunkss, G_N_ELEMENTS(chunkss), &widgets->draw_min_speed, &widgets->cis); + + // Assign locally + gdouble mins = widgets->draw_min_speed; + + // Reset before redrawing + clear_images (pix, window, widgets); + + /* draw grid */ + for (i=0; i<=LINES; i++) { + gchar s[32]; + + // NB: No need to convert here anymore as numbers are in the appropriate units + switch (speed_units) { + case VIK_UNITS_SPEED_KILOMETRES_PER_HOUR: + sprintf(s, "%8dkm/h", (int)(mins + (LINES-i)*chunkss[widgets->cis])); + break; + case VIK_UNITS_SPEED_MILES_PER_HOUR: + sprintf(s, "%8dmph", (int)(mins + (LINES-i)*chunkss[widgets->cis])); + break; + case VIK_UNITS_SPEED_METRES_PER_SECOND: + sprintf(s, "%8dm/s", (int)(mins + (LINES-i)*chunkss[widgets->cis])); + break; + case VIK_UNITS_SPEED_KNOTS: + sprintf(s, "%8dknots", (int)(mins + (LINES-i)*chunkss[widgets->cis])); + break; + case VIK_UNITS_SPEED_SECONDS_PER_KM: + sprintf(s, "%8ds/km", (int)(mins + (LINES-i)*chunkss[widgets->cis])); + break; + case VIK_UNITS_SPEED_MINUTES_PER_KM: + sprintf(s, "%8dmin/km", (int)(mins + (LINES-i)*chunkss[widgets->cis])); + break; + case VIK_UNITS_SPEED_SECONDS_PER_MILE: + sprintf(s, "%8dsec/mi", (int)(mins + (LINES-i)*chunkss[widgets->cis])); + break; + case VIK_UNITS_SPEED_MINUTES_PER_MILE: + sprintf(s, "%8dmin/mi", (int)(mins + (LINES-i)*chunkss[widgets->cis])); + break; + default: + sprintf(s, "--"); + g_critical("Houston, we've had a problem. speed=%d", speed_units); + } + + draw_grid_y ( window, image, widgets, pix, s, i ); + } + + draw_time_lines ( window, image, pix, widgets ); + + /* draw speeds */ + guint height = widgets->profile_height + MARGIN_Y; + for ( i = 0; i < widgets->profile_width; i++ ) + gdk_draw_line ( GDK_DRAWABLE(pix), gtk_widget_get_style(window)->dark_gc[3], + i + MARGIN_X, height, i + MARGIN_X, height - widgets->profile_height*(widgets->speeds[i]-mins)/(chunkss[widgets->cis]*LINES) ); + + if ( gtk_toggle_button_get_active(GTK_TOGGLE_BUTTON(widgets->w_show_gps_speed)) ) { + + GdkGC *gps_speed_gc = gdk_gc_new ( gtk_widget_get_window(window) ); + GdkColor color; + gdk_color_parse ( "red", &color ); + gdk_gc_set_rgb_fg_color ( gps_speed_gc, &color); + + time_t beg_time = VIK_TRACKPOINT(tr->trackpoints->data)->timestamp; + time_t dur = VIK_TRACKPOINT(g_list_last(tr->trackpoints)->data)->timestamp - beg_time; + + GList *iter; + for (iter = tr->trackpoints; iter; iter = iter->next) { + gdouble gps_speed = VIK_TRACKPOINT(iter->data)->speed; + if (isnan(gps_speed)) + continue; + switch (speed_units) { + case VIK_UNITS_SPEED_KILOMETRES_PER_HOUR: + gps_speed = VIK_MPS_TO_KPH(gps_speed); + break; + case VIK_UNITS_SPEED_MILES_PER_HOUR: + gps_speed = VIK_MPS_TO_MPH(gps_speed); + break; + case VIK_UNITS_SPEED_KNOTS: + gps_speed = VIK_MPS_TO_KNOTS(gps_speed); + break; + case VIK_UNITS_SPEED_SECONDS_PER_KM: + gps_speed = VIK_MPS_TO_PACE_SPK(gps_speed); + break; + case VIK_UNITS_SPEED_MINUTES_PER_KM: + gps_speed = VIK_MPS_TO_PACE_MPK(gps_speed); + break; + case VIK_UNITS_SPEED_SECONDS_PER_MILE: + gps_speed = VIK_MPS_TO_PACE_SPM(gps_speed); + break; + case VIK_UNITS_SPEED_MINUTES_PER_MILE: + gps_speed = VIK_MPS_TO_PACE_MPM(gps_speed); + break; + default: + // VIK_UNITS_SPEED_METRES_PER_SECOND: + // No need to convert as already in m/s + break; + } + int x = MARGIN_X + widgets->profile_width * (VIK_TRACKPOINT(iter->data)->timestamp - beg_time) / dur; + int y = height - widgets->profile_height*(gps_speed - mins)/(chunkss[widgets->cis]*LINES); + gdk_draw_rectangle(GDK_DRAWABLE(pix), gps_speed_gc, TRUE, x-2, y-2, 4, 4); + } + g_object_unref ( G_OBJECT(gps_speed_gc) ); + } + + /* draw border */ + gdk_draw_rectangle(GDK_DRAWABLE(pix), gtk_widget_get_style(window)->black_gc, FALSE, MARGIN_X, MARGIN_Y, widgets->profile_width-1, widgets->profile_height-1); + + g_object_unref ( G_OBJECT(pix) ); +} + +/** + * Draw just the distance/time image + */ +static void draw_dt ( GtkWidget *image, VikTrack *tr, PropWidgets *widgets ) +{ + guint i; + + // Free previous allocation + if ( widgets->distances ) + g_free ( widgets->distances ); + + widgets->distances = vik_track_make_distance_map ( tr, widgets->profile_width ); + if ( widgets->distances == NULL ) + return; + + // Convert into appropriate units + vik_units_distance_t dist_units = a_vik_get_units_distance (); + switch ( dist_units ) { + case VIK_UNITS_DISTANCE_MILES: + for ( i = 0; i < widgets->profile_width; i++ ) { + widgets->distances[i] = VIK_METERS_TO_MILES(widgets->distances[i]); + } + break; + case VIK_UNITS_DISTANCE_NAUTICAL_MILES: + for ( i = 0; i < widgets->profile_width; i++ ) { + widgets->distances[i] = VIK_METERS_TO_NAUTICAL_MILES(widgets->distances[i]); + } + break; + default: + // Metres - but want in kms + for ( i = 0; i < widgets->profile_width; i++ ) { + widgets->distances[i] = widgets->distances[i]/1000.0; + } + break; + } + + widgets->duration = vik_track_get_duration ( widgets->tr, TRUE ); + // Negative time or other problem + if ( widgets->duration <= 0 ) + return; + + GtkWidget *window = gtk_widget_get_toplevel (widgets->dist_box); + GdkPixmap *pix = gdk_pixmap_new( gtk_widget_get_window(window), widgets->profile_width+MARGIN_X, widgets->profile_height+MARGIN_Y, -1 ); + + gtk_image_set_from_pixmap ( GTK_IMAGE(image), pix, NULL ); + + // easy to work out min / max of distance! + // Assign locally + // mind = 0.0; - Thus not used + gdouble maxd; + switch ( dist_units ) { + case VIK_UNITS_DISTANCE_MILES: + maxd = VIK_METERS_TO_MILES(vik_track_get_length_including_gaps (tr)); + break; + case VIK_UNITS_DISTANCE_NAUTICAL_MILES: + maxd = VIK_METERS_TO_NAUTICAL_MILES(vik_track_get_length_including_gaps (tr)); + break; + default: + maxd = vik_track_get_length_including_gaps (tr) / 1000.0; + break; + } + + /* Find suitable chunk index */ + gdouble dummy = 0.0; // expect this to remain the same! (not that it's used) + get_new_min_and_chunk_index (0, maxd, chunksd, G_N_ELEMENTS(chunksd), &dummy, &widgets->cid); + + // Reset before redrawing + clear_images (pix, window, widgets); + + /* draw grid */ + for (i=0; i<=LINES; i++) { + gchar s[32]; + + switch ( dist_units ) { + case VIK_UNITS_DISTANCE_MILES: + sprintf(s, _("%.1f miles"), ((LINES-i)*chunksd[widgets->cid])); + break; + case VIK_UNITS_DISTANCE_NAUTICAL_MILES: + sprintf(s, _("%.1f NM"), ((LINES-i)*chunksd[widgets->cid])); + break; + default: + sprintf(s, _("%.1f km"), ((LINES-i)*chunksd[widgets->cid])); + break; + } + + draw_grid_y ( window, image, widgets, pix, s, i ); + } + + draw_time_lines ( window, image, pix, widgets ); + + /* draw distance */ + guint height = widgets->profile_height + MARGIN_Y; + for ( i = 0; i < widgets->profile_width; i++ ) + gdk_draw_line ( GDK_DRAWABLE(pix), gtk_widget_get_style(window)->dark_gc[3], + i + MARGIN_X, height, i + MARGIN_X, height - widgets->profile_height*(widgets->distances[i])/(chunksd[widgets->cid]*LINES) ); + + // Show speed indicator + if ( gtk_toggle_button_get_active(GTK_TOGGLE_BUTTON(widgets->w_show_dist_speed)) ) { + GdkGC *dist_speed_gc = gdk_gc_new ( gtk_widget_get_window(window) ); + GdkColor color; + gdk_color_parse ( "red", &color ); + gdk_gc_set_rgb_fg_color ( dist_speed_gc, &color); + + gdouble max_speed = 0; + max_speed = widgets->max_speed * 110 / 100; + + // This is just an indicator - no actual values can be inferred by user + for ( i = 0; i < widgets->profile_width; i++ ) { + int y_speed = widgets->profile_height - (widgets->profile_height * widgets->speeds[i])/max_speed; + gdk_draw_rectangle(GDK_DRAWABLE(pix), dist_speed_gc, TRUE, i+MARGIN_X-2, y_speed-2, 4, 4); + } + g_object_unref ( G_OBJECT(dist_speed_gc) ); + } + + /* draw border */ + gdk_draw_rectangle(GDK_DRAWABLE(pix), gtk_widget_get_style(window)->black_gc, FALSE, MARGIN_X, MARGIN_Y, widgets->profile_width-1, widgets->profile_height-1); + + g_object_unref ( G_OBJECT(pix) ); + +} + +/** + * Draw just the elevation/time image + */ +static void draw_et ( GtkWidget *image, VikTrack *tr, PropWidgets *widgets ) +{ + guint i; + + // Free previous allocation + if ( widgets->ats ) + g_free ( widgets->ats ); + + widgets->ats = vik_track_make_elevation_time_map ( tr, widgets->profile_width ); + + if ( widgets->ats == NULL ) + return; + + // Convert into appropriate units + vik_units_height_t height_units = a_vik_get_units_height (); + if ( height_units == VIK_UNITS_HEIGHT_FEET ) { + // Convert altitudes into feet units + for ( i = 0; i < widgets->profile_width; i++ ) { + widgets->ats[i] = VIK_METERS_TO_FEET(widgets->ats[i]); + } + } + // Otherwise leave in metres + + minmax_array(widgets->ats, &widgets->min_altitude, &widgets->max_altitude, TRUE, widgets->profile_width); + + get_new_min_and_chunk_index (widgets->min_altitude, widgets->max_altitude, chunksa, G_N_ELEMENTS(chunksa), &widgets->draw_min_altitude_time, &widgets->ciat); + + // Assign locally + gdouble mina = widgets->draw_min_altitude_time; + + widgets->duration = vik_track_get_duration ( widgets->tr, TRUE ); + // Negative time or other problem + if ( widgets->duration <= 0 ) + return; + + GtkWidget *window = gtk_widget_get_toplevel (widgets->elev_time_box); + GdkPixmap *pix = gdk_pixmap_new( gtk_widget_get_window(window), widgets->profile_width+MARGIN_X, widgets->profile_height+MARGIN_Y, -1 ); + + gtk_image_set_from_pixmap ( GTK_IMAGE(image), pix, NULL ); + + // Reset before redrawing + clear_images (pix, window, widgets); + + /* draw grid */ + for (i=0; i<=LINES; i++) { + gchar s[32]; + + switch (height_units) { + case VIK_UNITS_HEIGHT_METRES: + sprintf(s, "%8dm", (int)(mina + (LINES-i)*chunksa[widgets->ciat])); + break; + case VIK_UNITS_HEIGHT_FEET: + // NB values already converted into feet + sprintf(s, "%8dft", (int)(mina + (LINES-i)*chunksa[widgets->ciat])); + break; + default: + sprintf(s, "--"); + g_critical("Houston, we've had a problem. height=%d", height_units); + } + + draw_grid_y ( window, image, widgets, pix, s, i ); + } + + draw_time_lines ( window, image, pix, widgets ); + + /* draw elevations */ + guint height = widgets->profile_height + MARGIN_Y; + for ( i = 0; i < widgets->profile_width; i++ ) + gdk_draw_line ( GDK_DRAWABLE(pix), gtk_widget_get_style(window)->dark_gc[3], + i + MARGIN_X, height, i + MARGIN_X, height-widgets->profile_height*(widgets->ats[i]-mina)/(chunksa[widgets->ciat]*LINES) ); + + // Show DEMS + if ( gtk_toggle_button_get_active(GTK_TOGGLE_BUTTON(widgets->w_show_elev_dem)) ) { + GdkColor color; + GdkGC *dem_alt_gc = gdk_gc_new ( gtk_widget_get_window(window) ); + gdk_color_parse ( "green", &color ); + gdk_gc_set_rgb_fg_color ( dem_alt_gc, &color); + + gint h2 = widgets->profile_height + MARGIN_Y; // Adjust height for x axis labelling offset + gint achunk = chunksa[widgets->ciat]*LINES; + + for ( i = 0; i < widgets->profile_width; i++ ) { + // This could be slow doing this each time... + VikTrackpoint *tp = vik_track_get_closest_tp_by_percentage_time ( widgets->tr, ((gdouble)i/(gdouble)widgets->profile_width), NULL ); + if ( tp ) { + gint16 elev = a_dems_get_elev_by_coord(&(tp->coord), VIK_DEM_INTERPOL_SIMPLE); + if ( elev != VIK_DEM_INVALID_ELEVATION ) { + // Convert into height units + if ( a_vik_get_units_height () == VIK_UNITS_HEIGHT_FEET ) + elev = VIK_METERS_TO_FEET(elev); + // No conversion needed if already in metres + + // offset is in current height units + elev -= mina; + + // consider chunk size + int y_alt = h2 - ((widgets->profile_height * elev)/achunk ); + gdk_draw_rectangle(GDK_DRAWABLE(pix), dem_alt_gc, TRUE, i+MARGIN_X-2, y_alt-2, 4, 4); + } + } + } + g_object_unref ( G_OBJECT(dem_alt_gc) ); + } + + // Show speeds + if ( gtk_toggle_button_get_active(GTK_TOGGLE_BUTTON(widgets->w_show_elev_speed)) ) { + GdkColor color; + // This is just an indicator - no actual values can be inferred by user + GdkGC *elev_speed_gc = gdk_gc_new ( gtk_widget_get_window(window) ); + gdk_color_parse ( "red", &color ); + gdk_gc_set_rgb_fg_color ( elev_speed_gc, &color); + + gdouble max_speed = widgets->max_speed * 110 / 100; + + for ( i = 0; i < widgets->profile_width; i++ ) { + int y_speed = widgets->profile_height - (widgets->profile_height * widgets->speeds[i])/max_speed; + gdk_draw_rectangle(GDK_DRAWABLE(pix), elev_speed_gc, TRUE, i+MARGIN_X-2, y_speed-2, 4, 4); + } + + g_object_unref ( G_OBJECT(elev_speed_gc) ); + } + + /* draw border */ + gdk_draw_rectangle(GDK_DRAWABLE(pix), gtk_widget_get_style(window)->black_gc, FALSE, MARGIN_X, MARGIN_Y, widgets->profile_width-1, widgets->profile_height-1); + + g_object_unref ( G_OBJECT(pix) ); +} + +/** + * Draw just the speed/distance image + */ +static void draw_sd ( GtkWidget *image, VikTrack *tr, PropWidgets *widgets) +{ + gdouble mins; + guint i; + + // Free previous allocation + if ( widgets->speeds_dist ) + g_free ( widgets->speeds_dist ); + + widgets->speeds_dist = vik_track_make_speed_dist_map ( tr, widgets->profile_width ); + if ( widgets->speeds_dist == NULL ) + return; + + // Convert into appropriate units + vik_units_speed_t speed_units = a_vik_get_units_speed (); + switch (speed_units) { + case VIK_UNITS_SPEED_KILOMETRES_PER_HOUR: + for ( i = 0; i < widgets->profile_width; i++ ) { + widgets->speeds_dist[i] = VIK_MPS_TO_KPH(widgets->speeds_dist[i]); + } + break; + case VIK_UNITS_SPEED_MILES_PER_HOUR: + for ( i = 0; i < widgets->profile_width; i++ ) { + widgets->speeds_dist[i] = VIK_MPS_TO_MPH(widgets->speeds_dist[i]); + } + break; + case VIK_UNITS_SPEED_KNOTS: + for ( i = 0; i < widgets->profile_width; i++ ) { + widgets->speeds_dist[i] = VIK_MPS_TO_KNOTS(widgets->speeds_dist[i]); + } + break; + case VIK_UNITS_SPEED_SECONDS_PER_KM: + for ( i = 0; i < widgets->profile_width; i++ ) { + widgets->speeds_dist[i] = VIK_MPS_TO_PACE_SPK(widgets->speeds_dist[i]); + } + break; + case VIK_UNITS_SPEED_MINUTES_PER_KM: + for ( i = 0; i < widgets->profile_width; i++ ) { + widgets->speeds_dist[i] = VIK_MPS_TO_PACE_MPK(widgets->speeds_dist[i]); + } + break; + case VIK_UNITS_SPEED_SECONDS_PER_MILE: + for ( i = 0; i < widgets->profile_width; i++ ) { + widgets->speeds_dist[i] = VIK_MPS_TO_PACE_SPM(widgets->speeds_dist[i]); + } + break; + case VIK_UNITS_SPEED_MINUTES_PER_MILE: + for ( i = 0; i < widgets->profile_width; i++ ) { + widgets->speeds_dist[i] = VIK_MPS_TO_PACE_MPM(widgets->speeds_dist[i]); + } + break; + + default: + // VIK_UNITS_SPEED_METRES_PER_SECOND: + // No need to convert as already in m/s + break; + } + + GtkWidget *window = gtk_widget_get_toplevel (widgets->speed_dist_box); + GdkPixmap *pix = gdk_pixmap_new( gtk_widget_get_window(window), widgets->profile_width+MARGIN_X, widgets->profile_height+MARGIN_Y, -1 ); + + gtk_image_set_from_pixmap ( GTK_IMAGE(image), pix, NULL ); + + // OK to resuse min_speed here + minmax_array(widgets->speeds_dist, &widgets->min_speed, &widgets->max_speed_dist, FALSE, widgets->profile_width); + if (widgets->min_speed < 0.0) + widgets->min_speed = 0; /* splines sometimes give negative speeds */ + + /* Find suitable chunk index */ + get_new_min_and_chunk_index (widgets->min_speed, widgets->max_speed_dist, chunkss, G_N_ELEMENTS(chunkss), &widgets->draw_min_speed, &widgets->cisd); + + // Assign locally + mins = widgets->draw_min_speed; + + // Reset before redrawing + clear_images (pix, window, widgets); + + /* draw grid */ + for (i=0; i<=LINES; i++) { + gchar s[32]; + + // NB: No need to convert here anymore as numbers are in the appropriate units + switch (speed_units) { + case VIK_UNITS_SPEED_KILOMETRES_PER_HOUR: + sprintf(s, "%8dkm/h", (int)(mins + (LINES-i)*chunkss[widgets->cisd])); + break; + case VIK_UNITS_SPEED_MILES_PER_HOUR: + sprintf(s, "%8dmph", (int)(mins + (LINES-i)*chunkss[widgets->cisd])); + break; + case VIK_UNITS_SPEED_METRES_PER_SECOND: + sprintf(s, "%8dm/s", (int)(mins + (LINES-i)*chunkss[widgets->cisd])); + break; + case VIK_UNITS_SPEED_KNOTS: + sprintf(s, "%8dknots", (int)(mins + (LINES-i)*chunkss[widgets->cisd])); + break; + case VIK_UNITS_SPEED_SECONDS_PER_KM: + sprintf(s, "%8ds/km", (int)(mins + (LINES-i)*chunkss[widgets->cisd])); + break; + case VIK_UNITS_SPEED_MINUTES_PER_KM: + sprintf(s, "%8dmin/km", (int)(mins + (LINES-i)*chunkss[widgets->cisd])); + break; + case VIK_UNITS_SPEED_SECONDS_PER_MILE: + sprintf(s, "%8dsec/mi", (int)(mins + (LINES-i)*chunkss[widgets->cisd])); + break; + case VIK_UNITS_SPEED_MINUTES_PER_MILE: + sprintf(s, "%8dmin/mi", (int)(mins + (LINES-i)*chunkss[widgets->cisd])); + break; + default: + sprintf(s, "--"); + g_critical("Houston, we've had a problem. speed=%d", speed_units); + } + + draw_grid_y ( window, image, widgets, pix, s, i ); + } + + draw_distance_divisions ( window, image, pix, widgets, a_vik_get_units_distance() ); + + /* draw speeds */ + guint height = widgets->profile_height + MARGIN_Y; + for ( i = 0; i < widgets->profile_width; i++ ) + gdk_draw_line ( GDK_DRAWABLE(pix), gtk_widget_get_style(window)->dark_gc[3], + i + MARGIN_X, height, i + MARGIN_X, height - widgets->profile_height*(widgets->speeds_dist[i]-mins)/(chunkss[widgets->cisd]*LINES) ); + + + if ( gtk_toggle_button_get_active(GTK_TOGGLE_BUTTON(widgets->w_show_sd_gps_speed)) ) { + + GdkGC *gps_speed_gc = gdk_gc_new ( gtk_widget_get_window(window) ); + GdkColor color; + gdk_color_parse ( "red", &color ); + gdk_gc_set_rgb_fg_color ( gps_speed_gc, &color); + + gdouble dist = vik_track_get_length_including_gaps(tr); + gdouble dist_tp = 0.0; + + GList *iter = tr->trackpoints; + for (iter = iter->next; iter; iter = iter->next) { + gdouble gps_speed = VIK_TRACKPOINT(iter->data)->speed; + if (isnan(gps_speed)) + continue; + switch (speed_units) { + case VIK_UNITS_SPEED_KILOMETRES_PER_HOUR: + gps_speed = VIK_MPS_TO_KPH(gps_speed); + break; + case VIK_UNITS_SPEED_MILES_PER_HOUR: + gps_speed = VIK_MPS_TO_MPH(gps_speed); + break; + case VIK_UNITS_SPEED_KNOTS: + gps_speed = VIK_MPS_TO_KNOTS(gps_speed); + break; + case VIK_UNITS_SPEED_SECONDS_PER_KM: + gps_speed = VIK_MPS_TO_PACE_SPK(gps_speed); + break; + case VIK_UNITS_SPEED_MINUTES_PER_KM: + gps_speed = VIK_MPS_TO_PACE_MPK(gps_speed); + break; + case VIK_UNITS_SPEED_SECONDS_PER_MILE: + gps_speed = VIK_MPS_TO_PACE_SPM(gps_speed); + break; + case VIK_UNITS_SPEED_MINUTES_PER_MILE: + gps_speed = VIK_MPS_TO_PACE_MPM(gps_speed); + break; + default: + // VIK_UNITS_SPEED_METRES_PER_SECOND: + // No need to convert as already in m/s + break; + } + dist_tp += vik_coord_diff ( &(VIK_TRACKPOINT(iter->data)->coord), &(VIK_TRACKPOINT(iter->prev->data)->coord) ); + int x = MARGIN_X + (widgets->profile_width * dist_tp / dist); + int y = height - widgets->profile_height*(gps_speed - mins)/(chunkss[widgets->cisd]*LINES); + gdk_draw_rectangle(GDK_DRAWABLE(pix), gps_speed_gc, TRUE, x-2, y-2, 4, 4); + } + g_object_unref ( G_OBJECT(gps_speed_gc) ); + } + + /* draw border */ + gdk_draw_rectangle(GDK_DRAWABLE(pix), gtk_widget_get_style(window)->black_gc, FALSE, MARGIN_X, MARGIN_Y, widgets->profile_width-1, widgets->profile_height-1); + + g_object_unref ( G_OBJECT(pix) ); +} +#undef LINES + +/** + * Draw all graphs + */ +static void draw_all_graphs ( GtkWidget *widget, PropWidgets *widgets, gboolean resized ) +{ + // Draw graphs even if they are not visible + + GList *child = NULL; + GtkWidget *image = NULL; + GtkWidget *window = gtk_widget_get_toplevel(widget); + gdouble pc = NAN; + gdouble pc_blob = NAN; + + // Draw elevations + if (widgets->elev_box != NULL) { + + // Saved image no longer any good as we've resized, so we remove it here + if (resized && widgets->elev_graph_saved_img.img) { + g_object_unref(widgets->elev_graph_saved_img.img); + widgets->elev_graph_saved_img.img = NULL; + widgets->elev_graph_saved_img.saved = FALSE; + } + + child = gtk_container_get_children(GTK_CONTAINER(widgets->elev_box)); + draw_elevations (GTK_WIDGET(child->data), widgets->tr, widgets ); + + image = GTK_WIDGET(child->data); + g_list_free(child); + + // Ensure marker or blob are redrawn if necessary + if (widgets->is_marker_drawn || widgets->is_blob_drawn) { + + pc = tp_percentage_by_distance ( widgets->tr, widgets->marker_tp, widgets->track_length_inc_gaps ); + gdouble x_blob = -MARGIN_X - 1.0; // i.e. Don't draw unless we get a valid value + gint y_blob = 0; + if (widgets->is_blob_drawn) { + pc_blob = tp_percentage_by_distance ( widgets->tr, widgets->blob_tp, widgets->track_length_inc_gaps ); + if (!isnan(pc_blob)) { + x_blob = (pc_blob * widgets->profile_width); + } + y_blob = blobby_altitude (x_blob, widgets); + } + + gdouble marker_x = -1.0; // i.e. Don't draw unless we get a valid value + if (!isnan(pc)) { + marker_x = (pc * widgets->profile_width) + MARGIN_X; + } + + save_image_and_draw_graph_marks (image, + marker_x, + gtk_widget_get_style(window)->black_gc, + x_blob+MARGIN_X, + y_blob+MARGIN_Y, + &widgets->elev_graph_saved_img, + widgets->profile_width, + widgets->profile_height, + BLOB_SIZE * vik_viewport_get_scale(widgets->vvp), + &widgets->is_marker_drawn, + &widgets->is_blob_drawn); + } + } + + // Draw gradients + if (widgets->gradient_box != NULL) { + + // Saved image no longer any good as we've resized, so we remove it here + if (resized && widgets->gradient_graph_saved_img.img) { + g_object_unref(widgets->gradient_graph_saved_img.img); + widgets->gradient_graph_saved_img.img = NULL; + widgets->gradient_graph_saved_img.saved = FALSE; + } + + child = gtk_container_get_children(GTK_CONTAINER(widgets->gradient_box)); + draw_gradients (GTK_WIDGET(child->data), widgets->tr, widgets ); + + image = GTK_WIDGET(child->data); + g_list_free(child); + + // Ensure marker or blob are redrawn if necessary + if (widgets->is_marker_drawn || widgets->is_blob_drawn) { + + pc = tp_percentage_by_distance ( widgets->tr, widgets->marker_tp, widgets->track_length_inc_gaps ); + gdouble x_blob = -MARGIN_X - 1.0; // i.e. Don't draw unless we get a valid value + gint y_blob = 0; + if (widgets->is_blob_drawn) { + pc_blob = tp_percentage_by_distance ( widgets->tr, widgets->blob_tp, widgets->track_length_inc_gaps ); + if (!isnan(pc_blob)) { + x_blob = (pc_blob * widgets->profile_width); + } + y_blob = blobby_gradient (x_blob, widgets); + } + + gdouble marker_x = -1.0; // i.e. Don't draw unless we get a valid value + if (!isnan(pc)) { + marker_x = (pc * widgets->profile_width) + MARGIN_X; + } + + save_image_and_draw_graph_marks (image, + marker_x, + gtk_widget_get_style(window)->black_gc, + x_blob+MARGIN_X, + y_blob+MARGIN_Y, + &widgets->gradient_graph_saved_img, + widgets->profile_width, + widgets->profile_height, + BLOB_SIZE * vik_viewport_get_scale(widgets->vvp), + &widgets->is_marker_drawn, + &widgets->is_blob_drawn); + } + } + + // Draw speeds + if (widgets->speed_box != NULL) { + + // Saved image no longer any good as we've resized + if (resized && widgets->speed_graph_saved_img.img) { + g_object_unref(widgets->speed_graph_saved_img.img); + widgets->speed_graph_saved_img.img = NULL; + widgets->speed_graph_saved_img.saved = FALSE; + } + + child = gtk_container_get_children(GTK_CONTAINER(widgets->speed_box)); + draw_vt (GTK_WIDGET(child->data), widgets->tr, widgets ); + + image = GTK_WIDGET(child->data); + g_list_free(child); + + // Ensure marker or blob are redrawn if necessary + if (widgets->is_marker_drawn || widgets->is_blob_drawn) { + + pc = tp_percentage_by_time ( widgets->tr, widgets->marker_tp ); + + gdouble x_blob = -MARGIN_X - 1.0; // i.e. Don't draw unless we get a valid value + gint y_blob = 0; + if (widgets->is_blob_drawn) { + pc_blob = tp_percentage_by_time ( widgets->tr, widgets->blob_tp ); + if (!isnan(pc_blob)) { + x_blob = (pc_blob * widgets->profile_width); + } + + y_blob = blobby_speed (x_blob, widgets); + } + + gdouble marker_x = -1.0; // i.e. Don't draw unless we get a valid value + if (!isnan(pc)) { + marker_x = (pc * widgets->profile_width) + MARGIN_X; + } + + save_image_and_draw_graph_marks (image, + marker_x, + gtk_widget_get_style(window)->black_gc, + x_blob+MARGIN_X, + y_blob+MARGIN_Y, + &widgets->speed_graph_saved_img, + widgets->profile_width, + widgets->profile_height, + BLOB_SIZE * vik_viewport_get_scale(widgets->vvp), + &widgets->is_marker_drawn, + &widgets->is_blob_drawn); + } + } + + // Draw Distances + if (widgets->dist_box != NULL) { + + // Saved image no longer any good as we've resized + if (resized && widgets->dist_graph_saved_img.img) { + g_object_unref(widgets->dist_graph_saved_img.img); + widgets->dist_graph_saved_img.img = NULL; + widgets->dist_graph_saved_img.saved = FALSE; + } + + child = gtk_container_get_children(GTK_CONTAINER(widgets->dist_box)); + draw_dt (GTK_WIDGET(child->data), widgets->tr, widgets ); + + image = GTK_WIDGET(child->data); + g_list_free(child); + + // Ensure marker or blob are redrawn if necessary + if (widgets->is_marker_drawn || widgets->is_blob_drawn) { + + pc = tp_percentage_by_time ( widgets->tr, widgets->marker_tp ); + + gdouble x_blob = -MARGIN_X - 1.0; // i.e. Don't draw unless we get a valid value + gint y_blob = 0; + if (widgets->is_blob_drawn) { + pc_blob = tp_percentage_by_time ( widgets->tr, widgets->blob_tp ); + if (!isnan(pc_blob)) { + x_blob = (pc_blob * widgets->profile_width); + } + + y_blob = blobby_distance (x_blob, widgets); + } + + gdouble marker_x = -1.0; // i.e. Don't draw unless we get a valid value + if (!isnan(pc)) { + marker_x = (pc * widgets->profile_width) + MARGIN_X; + } + + save_image_and_draw_graph_marks (image, + marker_x, + gtk_widget_get_style(window)->black_gc, + x_blob+MARGIN_X, + y_blob+MARGIN_Y, + &widgets->dist_graph_saved_img, + widgets->profile_width, + widgets->profile_height, + BLOB_SIZE * vik_viewport_get_scale(widgets->vvp), + &widgets->is_marker_drawn, + &widgets->is_blob_drawn); + } + } + + // Draw Elevations in timely manner + if (widgets->elev_time_box != NULL) { + + // Saved image no longer any good as we've resized + if (resized && widgets->elev_time_graph_saved_img.img) { + g_object_unref(widgets->elev_time_graph_saved_img.img); + widgets->elev_time_graph_saved_img.img = NULL; + widgets->elev_time_graph_saved_img.saved = FALSE; + } + + child = gtk_container_get_children(GTK_CONTAINER(widgets->elev_time_box)); + draw_et (GTK_WIDGET(child->data), widgets->tr, widgets ); + + image = GTK_WIDGET(child->data); + g_list_free(child); + + // Ensure marker or blob are redrawn if necessary + if (widgets->is_marker_drawn || widgets->is_blob_drawn) { + + pc = tp_percentage_by_time ( widgets->tr, widgets->marker_tp ); + + gdouble x_blob = -MARGIN_X - 1.0; // i.e. Don't draw unless we get a valid value + gint y_blob = 0; + if (widgets->is_blob_drawn) { + pc_blob = tp_percentage_by_time ( widgets->tr, widgets->blob_tp ); + if (!isnan(pc_blob)) { + x_blob = (pc_blob * widgets->profile_width); + } + y_blob = blobby_altitude_time (x_blob, widgets); + } + + gdouble marker_x = -1.0; // i.e. Don't draw unless we get a valid value + if (!isnan(pc)) { + marker_x = (pc * widgets->profile_width) + MARGIN_X; + } + + save_image_and_draw_graph_marks (image, + marker_x, + gtk_widget_get_style(window)->black_gc, + x_blob+MARGIN_X, + y_blob+MARGIN_Y, + &widgets->elev_time_graph_saved_img, + widgets->profile_width, + widgets->profile_height, + BLOB_SIZE * vik_viewport_get_scale(widgets->vvp), + &widgets->is_marker_drawn, + &widgets->is_blob_drawn); + } + } + + // Draw speed distances + if (widgets->speed_dist_box != NULL) { + + // Saved image no longer any good as we've resized, so we remove it here + if (resized && widgets->speed_dist_graph_saved_img.img) { + g_object_unref(widgets->speed_dist_graph_saved_img.img); + widgets->speed_dist_graph_saved_img.img = NULL; + widgets->speed_dist_graph_saved_img.saved = FALSE; + } + + child = gtk_container_get_children(GTK_CONTAINER(widgets->speed_dist_box)); + draw_sd (GTK_WIDGET(child->data), widgets->tr, widgets ); + + image = GTK_WIDGET(child->data); + g_list_free(child); + + // Ensure marker or blob are redrawn if necessary + if (widgets->is_marker_drawn || widgets->is_blob_drawn) { + + pc = tp_percentage_by_distance ( widgets->tr, widgets->marker_tp, widgets->track_length_inc_gaps ); + gdouble x_blob = -MARGIN_X - 1.0; // i.e. Don't draw unless we get a valid value + gint y_blob = 0; + if (widgets->is_blob_drawn) { + pc_blob = tp_percentage_by_distance ( widgets->tr, widgets->blob_tp, widgets->track_length_inc_gaps ); + if (!isnan(pc_blob)) { + x_blob = (pc_blob * widgets->profile_width); + } + y_blob = blobby_speed_dist (x_blob, widgets); + } + + gdouble marker_x = -1.0; // i.e. Don't draw unless we get a valid value + if (!isnan(pc)) { + marker_x = (pc * widgets->profile_width) + MARGIN_X; + } + + save_image_and_draw_graph_marks (image, + marker_x, + gtk_widget_get_style(window)->black_gc, + x_blob+MARGIN_X, + y_blob+MARGIN_Y, + &widgets->speed_dist_graph_saved_img, + widgets->profile_width, + widgets->profile_height, + BLOB_SIZE * vik_viewport_get_scale(widgets->vvp), + &widgets->is_marker_drawn, + &widgets->is_blob_drawn); + } + } + +} + +/** + * Configure/Resize the profile & speed/time images + */ +static gboolean configure_event ( GtkWidget *widget, GdkEventConfigure *event, PropWidgets *widgets ) +{ + if (widgets->configure_dialog) { + // Determine size offsets between dialog size and size for images + // Only on the initialisation of the dialog + widgets->profile_width_offset = event->width - widgets->profile_width; + widgets->profile_height_offset = event->height - widgets->profile_height; + widgets->configure_dialog = FALSE; + + // Without this the settting, the dialog will only grow in vertical size - one can not then make it smaller! + gtk_widget_set_size_request ( widget, widgets->profile_width+widgets->profile_width_offset, widgets->profile_height+widgets->profile_height_offset ); + + // Allow resizing back down to a minimal size (especially useful if the initial size has been made bigger after restoring from the saved settings) + GdkGeometry geom = { 600+widgets->profile_width_offset, 300+widgets->profile_height_offset, 0, 0, 0, 0, 0, 0, 0, 0, GDK_GRAVITY_STATIC }; + gdk_window_set_geometry_hints ( gtk_widget_get_window(widget), &geom, GDK_HINT_MIN_SIZE ); + } + else { + widgets->profile_width_old = widgets->profile_width; + widgets->profile_height_old = widgets->profile_height; + } + + // Now adjust From Dialog size to get image size + widgets->profile_width = event->width - widgets->profile_width_offset; + widgets->profile_height = event->height - widgets->profile_height_offset; + + // ATM we receive configure_events when the dialog is moved and so no further action is necessary + if ( !widgets->configure_dialog && + (widgets->profile_width_old == widgets->profile_width) && (widgets->profile_height_old == widgets->profile_height) ) + return FALSE; + + // Draw stuff + draw_all_graphs ( widget, widgets, TRUE ); + + return FALSE; +} + +/** + * Create height profile widgets including the image and callbacks + */ +GtkWidget *vik_trw_layer_create_profile ( GtkWidget *window, PropWidgets *widgets, gdouble *min_alt, gdouble *max_alt) +{ + GdkPixmap *pix; + GtkWidget *image; + GtkWidget *eventbox; + + // First allocation + widgets->altitudes = vik_track_make_elevation_map ( widgets->tr, widgets->profile_width ); + + if ( widgets->altitudes == NULL ) { + *min_alt = *max_alt = VIK_DEFAULT_ALTITUDE; + return NULL; + } + + // Don't use minmax_array(widgets->altitudes), as that is a simplified representative of the points + // thus can miss the highest & lowest values by a few metres + if ( !vik_track_get_minmax_alt (widgets->tr, min_alt, max_alt) ) + *min_alt = *max_alt = VIK_DEFAULT_ALTITUDE; + + pix = gdk_pixmap_new( gtk_widget_get_window(window), widgets->profile_width+MARGIN_X, widgets->profile_height+MARGIN_Y, -1 ); + image = gtk_image_new_from_pixmap ( pix, NULL ); + + g_object_unref ( G_OBJECT(pix) ); + + eventbox = gtk_event_box_new (); + g_signal_connect ( G_OBJECT(eventbox), "button_press_event", G_CALLBACK(track_profile_click), widgets ); + g_signal_connect ( G_OBJECT(eventbox), "motion_notify_event", G_CALLBACK(track_profile_move), widgets ); + gtk_container_add ( GTK_CONTAINER(eventbox), image ); + gtk_widget_set_events (eventbox, GDK_BUTTON_PRESS_MASK | GDK_POINTER_MOTION_MASK | GDK_POINTER_MOTION_HINT_MASK | GDK_STRUCTURE_MASK); + + return eventbox; +} + +/** + * Create height profile widgets including the image and callbacks + */ +GtkWidget *vik_trw_layer_create_gradient ( GtkWidget *window, PropWidgets *widgets) +{ + GdkPixmap *pix; + GtkWidget *image; + GtkWidget *eventbox; + + // First allocation + widgets->gradients = vik_track_make_gradient_map ( widgets->tr, widgets->profile_width ); + + if ( widgets->gradients == NULL ) { + return NULL; + } + + pix = gdk_pixmap_new( gtk_widget_get_window(window), widgets->profile_width+MARGIN_X, widgets->profile_height+MARGIN_Y, -1 ); + image = gtk_image_new_from_pixmap ( pix, NULL ); + + g_object_unref ( G_OBJECT(pix) ); + + eventbox = gtk_event_box_new (); + g_signal_connect ( G_OBJECT(eventbox), "button_press_event", G_CALLBACK(track_gradient_click), widgets ); + g_signal_connect ( G_OBJECT(eventbox), "motion_notify_event", G_CALLBACK(track_gradient_move), widgets ); + gtk_container_add ( GTK_CONTAINER(eventbox), image ); + gtk_widget_set_events (eventbox, GDK_BUTTON_PRESS_MASK | GDK_POINTER_MOTION_MASK | GDK_POINTER_MOTION_HINT_MASK | GDK_STRUCTURE_MASK); + + return eventbox; +} + +/** + * Create speed/time widgets including the image and callbacks + */ +GtkWidget *vik_trw_layer_create_vtdiag ( GtkWidget *window, PropWidgets *widgets) +{ + GdkPixmap *pix; + GtkWidget *image; + GtkWidget *eventbox; + + // First allocation + widgets->speeds = vik_track_make_speed_map ( widgets->tr, widgets->profile_width ); + if ( widgets->speeds == NULL ) + return NULL; + + pix = gdk_pixmap_new( gtk_widget_get_window(window), widgets->profile_width+MARGIN_X, widgets->profile_height+MARGIN_Y, -1 ); + image = gtk_image_new_from_pixmap ( pix, NULL ); + +#if 0 + /* XXX this can go out, it's just a helpful dev tool */ + { + int j; + GdkGC **colors[8] = { gtk_widget_get_style(window)->bg_gc, + gtk_widget_get_style(window)->fg_gc, + gtk_widget_get_style(window)->light_gc, + gtk_widget_get_style(window)->dark_gc, + gtk_widget_get_style(window)->mid_gc, + gtk_widget_get_style(window)->text_gc, + gtk_widget_get_style(window)->base_gc, + gtk_widget_get_style(window)->text_aa_gc }; + for (i=0; i<5; i++) { + for (j=0; j<8; j++) { + gdk_draw_rectangle(GDK_DRAWABLE(pix), colors[j][i], + TRUE, i*20, j*20, 20, 20); + gdk_draw_rectangle(GDK_DRAWABLE(pix), gtk_widget_get_style(window)->black_gc, + FALSE, i*20, j*20, 20, 20); + } + } + } +#endif + + g_object_unref ( G_OBJECT(pix) ); + + eventbox = gtk_event_box_new (); + g_signal_connect ( G_OBJECT(eventbox), "button_press_event", G_CALLBACK(track_vt_click), widgets ); + g_signal_connect ( G_OBJECT(eventbox), "motion_notify_event", G_CALLBACK(track_vt_move), widgets ); + gtk_container_add ( GTK_CONTAINER(eventbox), image ); + gtk_widget_set_events (eventbox, GDK_BUTTON_PRESS_MASK | GDK_POINTER_MOTION_MASK | GDK_POINTER_MOTION_HINT_MASK); + + return eventbox; +} + +/** + * Create distance / time widgets including the image and callbacks + */ +GtkWidget *vik_trw_layer_create_dtdiag ( GtkWidget *window, PropWidgets *widgets) +{ + GdkPixmap *pix; + GtkWidget *image; + GtkWidget *eventbox; + + // First allocation + widgets->distances = vik_track_make_distance_map ( widgets->tr, widgets->profile_width ); + if ( widgets->distances == NULL ) + return NULL; + + pix = gdk_pixmap_new( gtk_widget_get_window(window), widgets->profile_width+MARGIN_X, widgets->profile_height+MARGIN_Y, -1 ); + image = gtk_image_new_from_pixmap ( pix, NULL ); + + g_object_unref ( G_OBJECT(pix) ); + + eventbox = gtk_event_box_new (); + g_signal_connect ( G_OBJECT(eventbox), "button_press_event", G_CALLBACK(track_dt_click), widgets ); + g_signal_connect ( G_OBJECT(eventbox), "motion_notify_event", G_CALLBACK(track_dt_move), widgets ); + //g_signal_connect_swapped ( G_OBJECT(eventbox), "destroy", G_CALLBACK(g_free), widgets ); + gtk_container_add ( GTK_CONTAINER(eventbox), image ); + gtk_widget_set_events (eventbox, GDK_BUTTON_PRESS_MASK | GDK_POINTER_MOTION_MASK | GDK_POINTER_MOTION_HINT_MASK); + + return eventbox; +} + +/** + * Create elevation / time widgets including the image and callbacks + */ +GtkWidget *vik_trw_layer_create_etdiag ( GtkWidget *window, PropWidgets *widgets) +{ + GdkPixmap *pix; + GtkWidget *image; + GtkWidget *eventbox; + + // First allocation + widgets->ats = vik_track_make_elevation_time_map ( widgets->tr, widgets->profile_width ); + if ( widgets->ats == NULL ) + return NULL; + + pix = gdk_pixmap_new( gtk_widget_get_window(window), widgets->profile_width+MARGIN_X, widgets->profile_height+MARGIN_Y, -1 ); + image = gtk_image_new_from_pixmap ( pix, NULL ); + + g_object_unref ( G_OBJECT(pix) ); + + eventbox = gtk_event_box_new (); + g_signal_connect ( G_OBJECT(eventbox), "button_press_event", G_CALLBACK(track_et_click), widgets ); + g_signal_connect ( G_OBJECT(eventbox), "motion_notify_event", G_CALLBACK(track_et_move), widgets ); + gtk_container_add ( GTK_CONTAINER(eventbox), image ); + gtk_widget_set_events (eventbox, GDK_BUTTON_PRESS_MASK | GDK_POINTER_MOTION_MASK | GDK_POINTER_MOTION_HINT_MASK); + + return eventbox; +} + +/** + * Create speed/distance widgets including the image and callbacks + */ +GtkWidget *vik_trw_layer_create_sddiag ( GtkWidget *window, PropWidgets *widgets) +{ + GdkPixmap *pix; + GtkWidget *image; + GtkWidget *eventbox; + + // First allocation + widgets->speeds_dist = vik_track_make_speed_dist_map ( widgets->tr, widgets->profile_width ); + if ( widgets->speeds_dist == NULL ) + return NULL; + + pix = gdk_pixmap_new( gtk_widget_get_window(window), widgets->profile_width+MARGIN_X, widgets->profile_height+MARGIN_Y, -1 ); + image = gtk_image_new_from_pixmap ( pix, NULL ); + + g_object_unref ( G_OBJECT(pix) ); + + eventbox = gtk_event_box_new (); + g_signal_connect ( G_OBJECT(eventbox), "button_press_event", G_CALLBACK(track_sd_click), widgets ); + g_signal_connect ( G_OBJECT(eventbox), "motion_notify_event", G_CALLBACK(track_sd_move), widgets ); + gtk_container_add ( GTK_CONTAINER(eventbox), image ); + gtk_widget_set_events (eventbox, GDK_BUTTON_PRESS_MASK | GDK_POINTER_MOTION_MASK | GDK_POINTER_MOTION_HINT_MASK); + + return eventbox; +} +#undef MARGIN_X + +#define VIK_SETTINGS_TRACK_PROFILE_WIDTH "track_profile_display_width" +#define VIK_SETTINGS_TRACK_PROFILE_HEIGHT "track_profile_display_height" + +static void save_values ( PropWidgets *widgets ) +{ + // Session settings + a_settings_set_integer ( VIK_SETTINGS_TRACK_PROFILE_WIDTH, widgets->profile_width ); + a_settings_set_integer ( VIK_SETTINGS_TRACK_PROFILE_HEIGHT, widgets->profile_height ); + + // Just for this session ATM + if ( widgets->w_show_dem ) + show_dem = gtk_toggle_button_get_active ( GTK_TOGGLE_BUTTON(widgets->w_show_dem) ); + if ( widgets->w_show_alt_gps_speed ) + show_alt_gps_speed = gtk_toggle_button_get_active ( GTK_TOGGLE_BUTTON(widgets->w_show_alt_gps_speed) ); + if ( widgets->w_show_gps_speed ) + show_gps_speed = gtk_toggle_button_get_active ( GTK_TOGGLE_BUTTON(widgets->w_show_gps_speed) ); + if ( widgets->w_show_gradient_gps_speed ) + show_gradient_gps_speed = gtk_toggle_button_get_active ( GTK_TOGGLE_BUTTON(widgets->w_show_gradient_gps_speed) ); + if ( widgets->w_show_dist_speed ) + show_dist_speed = gtk_toggle_button_get_active ( GTK_TOGGLE_BUTTON(widgets->w_show_dist_speed) ); + if ( widgets->w_show_elev_dem ) + show_elev_dem = gtk_toggle_button_get_active ( GTK_TOGGLE_BUTTON(widgets->w_show_elev_dem) ); + if ( widgets->w_show_elev_speed ) + show_elev_speed = gtk_toggle_button_get_active ( GTK_TOGGLE_BUTTON(widgets->w_show_elev_speed) ); + if ( widgets->w_show_sd_gps_speed ) + show_sd_gps_speed = gtk_toggle_button_get_active ( GTK_TOGGLE_BUTTON(widgets->w_show_sd_gps_speed) ); +} + +static void destroy_cb ( GtkDialog *dialog, PropWidgets *widgets ) +{ + save_values(widgets); + prop_widgets_free(widgets); +} + +static void propwin_response_cb( GtkDialog *dialog, gint resp, PropWidgets *widgets ) +{ + VikTrack *tr = widgets->tr; + VikTrwLayer *vtl = widgets->vtl; + gboolean keep_dialog = FALSE; + + /* FIXME: check and make sure the track still exists before doing anything to it */ + /* Note: destroying diaglog (eg, parent window exit) won't give "response" */ + switch (resp) { + case GTK_RESPONSE_DELETE_EVENT: /* received delete event (not from buttons) */ + case GTK_RESPONSE_REJECT: + break; + case GTK_RESPONSE_ACCEPT: + vik_track_set_comment(tr, gtk_entry_get_text(GTK_ENTRY(widgets->w_comment))); + vik_track_set_description(tr, gtk_entry_get_text(GTK_ENTRY(widgets->w_description))); + vik_track_set_source(tr, gtk_entry_get_text(GTK_ENTRY(widgets->w_source))); + vik_track_set_type(tr, gtk_entry_get_text(GTK_ENTRY(widgets->w_type))); + gtk_color_button_get_color ( GTK_COLOR_BUTTON(widgets->w_color), &(tr->color) ); + tr->draw_name_mode = gtk_combo_box_get_active ( GTK_COMBO_BOX(widgets->w_namelabel) ); + tr->max_number_dist_labels = gtk_spin_button_get_value_as_int ( GTK_SPIN_BUTTON(widgets->w_number_distlabels) ); + trw_layer_update_treeview ( widgets->vtl, widgets->tr ); + vik_layer_emit_update ( VIK_LAYER(vtl) ); + break; + case VIK_TRW_LAYER_PROPWIN_REVERSE: + vik_track_reverse(tr); + vik_layer_emit_update ( VIK_LAYER(vtl) ); + break; + case VIK_TRW_LAYER_PROPWIN_DEL_DUP: + (void)vik_track_remove_dup_points(tr); // NB ignore the returned answer + // As we could have seen the number of duplicates that would be deleted in the properties statistics tab, + // choose not to inform the user unnecessarily + + /* above operation could have deleted current_tp or last_tp */ + trw_layer_cancel_tps_of_track ( vtl, tr ); + vik_layer_emit_update ( VIK_LAYER(vtl) ); + break; + case VIK_TRW_LAYER_PROPWIN_SPLIT: + { + /* get new tracks, add them and then the delete old one. old can still exist on clipboard. */ + guint ntracks; + + VikTrack **tracks = vik_track_split_into_segments(tr, &ntracks); + gchar *new_tr_name; + guint i; + for ( i = 0; i < ntracks; i++ ) + { + if ( tracks[i] ) { + new_tr_name = trw_layer_new_unique_sublayer_name ( vtl, + widgets->tr->is_route ? VIK_TRW_LAYER_SUBLAYER_ROUTE : VIK_TRW_LAYER_SUBLAYER_TRACK, + widgets->tr->name); + if ( widgets->tr->is_route ) + vik_trw_layer_add_route ( vtl, new_tr_name, tracks[i] ); + else + vik_trw_layer_add_track ( vtl, new_tr_name, tracks[i] ); + vik_track_calculate_bounds ( tracks[i] ); + + g_free ( new_tr_name ); + } + } + if ( tracks ) + { + g_free ( tracks ); + /* Don't let track destroy this dialog */ + vik_track_clear_property_dialog(tr); + if ( widgets->tr->is_route ) + vik_trw_layer_delete_route ( vtl, tr ); + else + vik_trw_layer_delete_track ( vtl, tr ); + vik_layer_emit_update ( VIK_LAYER(vtl) ); /* chase thru the hoops */ + } + } + break; + case VIK_TRW_LAYER_PROPWIN_SPLIT_MARKER: + { + GList *iter = tr->trackpoints; + while ((iter = iter->next)) { + if (widgets->marker_tp == VIK_TRACKPOINT(iter->data)) + break; + } + if (iter == NULL) { + a_dialog_msg(VIK_GTK_WINDOW_FROM_LAYER(vtl), GTK_MESSAGE_ERROR, + _("Failed spliting track. Track unchanged"), NULL); + keep_dialog = TRUE; + break; + } + + gchar *r_name = trw_layer_new_unique_sublayer_name(vtl, + widgets->tr->is_route ? VIK_TRW_LAYER_SUBLAYER_ROUTE : VIK_TRW_LAYER_SUBLAYER_TRACK, + widgets->tr->name); + iter->prev->next = NULL; + iter->prev = NULL; + VikTrack *tr_right = vik_track_new(); + if ( tr->comment ) + vik_track_set_comment ( tr_right, tr->comment ); + tr_right->visible = tr->visible; + tr_right->is_route = tr->is_route; + tr_right->trackpoints = iter; + + if ( widgets->tr->is_route ) + vik_trw_layer_add_route(vtl, r_name, tr_right); + else + vik_trw_layer_add_track(vtl, r_name, tr_right); + vik_track_calculate_bounds ( tr ); + vik_track_calculate_bounds ( tr_right ); + + g_free ( r_name ); + + vik_layer_emit_update ( VIK_LAYER(vtl) ); + } + break; + default: + fprintf(stderr, "DEBUG: unknown response\n"); + return; + } + + /* Keep same behaviour for now: destroy dialog if click on any button */ + if (!keep_dialog) { + vik_track_clear_property_dialog(tr); + gtk_widget_destroy ( GTK_WIDGET(dialog) ); + } +} + +/** + * Force a redraw when checkbutton has been toggled to show/hide that information + */ +static void checkbutton_toggle_cb ( GtkToggleButton *togglebutton, PropWidgets *widgets, gpointer dummy ) +{ + // Even though not resized, we'll pretend it is - + // as this invalidates the saved images (since the image may have changed) + draw_all_graphs ( widgets->dialog, widgets, TRUE ); +} + +/** + * Create the widgets for the given graph tab + */ +static GtkWidget *create_graph_page ( GtkWidget *graph, + const gchar *markup, + GtkWidget *value, + const gchar *markup2, + GtkWidget *value2, + const gchar *markup3, + GtkWidget *value3, + GtkWidget *checkbutton1, + gboolean checkbutton1_default, + GtkWidget *checkbutton2, + gboolean checkbutton2_default ) +{ + GtkWidget *hbox = gtk_hbox_new ( FALSE, 10 ); + GtkWidget *vbox = gtk_vbox_new ( FALSE, 10 ); + GtkWidget *label = gtk_label_new (NULL); + GtkWidget *label2 = gtk_label_new (NULL); + GtkWidget *label3 = gtk_label_new (NULL); + gtk_box_pack_start (GTK_BOX(vbox), graph, FALSE, FALSE, 0); + gtk_label_set_markup ( GTK_LABEL(label), markup ); + gtk_label_set_markup ( GTK_LABEL(label2), markup2 ); + gtk_label_set_markup ( GTK_LABEL(label3), markup3 ); + gtk_box_pack_start (GTK_BOX(hbox), label, FALSE, FALSE, 0); + gtk_box_pack_start (GTK_BOX(hbox), value, FALSE, FALSE, 0); + gtk_box_pack_start (GTK_BOX(hbox), label2, FALSE, FALSE, 0); + gtk_box_pack_start (GTK_BOX(hbox), value2, FALSE, FALSE, 0); + if ( value3 ) { + gtk_box_pack_start (GTK_BOX(hbox), label3, FALSE, FALSE, 0); + gtk_box_pack_start (GTK_BOX(hbox), value3, FALSE, FALSE, 0); + } + if (checkbutton2) { + gtk_box_pack_end (GTK_BOX(hbox), checkbutton2, FALSE, FALSE, 0); + gtk_toggle_button_set_active (GTK_TOGGLE_BUTTON(checkbutton2), checkbutton2_default); + } + if (checkbutton1) { + gtk_box_pack_end (GTK_BOX(hbox), checkbutton1, FALSE, FALSE, 0); + gtk_toggle_button_set_active (GTK_TOGGLE_BUTTON(checkbutton1), checkbutton1_default); + } + gtk_box_pack_start (GTK_BOX(vbox), hbox, FALSE, FALSE, 0); + + return vbox; +} + +static GtkWidget *create_table (int cnt, char *labels[], GtkWidget *contents[]) +{ + GtkTable *table; + int i; + + table = GTK_TABLE(gtk_table_new (cnt, 2, FALSE)); + gtk_table_set_col_spacing (table, 0, 10); + for (i=0; ivtl = vtl; + widgets->vvp = vvp; + widgets->vlp = vlp; + widgets->tr = tr; + + gint profile_size_value; + // Ensure minimum values + widgets->profile_width = 600 * vik_viewport_get_scale(vvp); + if ( a_settings_get_integer ( VIK_SETTINGS_TRACK_PROFILE_WIDTH, &profile_size_value ) ) + if ( profile_size_value > widgets->profile_width ) + widgets->profile_width = profile_size_value; + + widgets->profile_height = 300 * vik_viewport_get_scale(vvp); + if ( a_settings_get_integer ( VIK_SETTINGS_TRACK_PROFILE_HEIGHT, &profile_size_value ) ) + if ( profile_size_value > widgets->profile_height ) + widgets->profile_height = profile_size_value; + + gchar *title = g_strdup_printf(_("%s - Track Properties"), tr->name); + GtkWidget *dialog = gtk_dialog_new_with_buttons (title, + parent, + GTK_DIALOG_DESTROY_WITH_PARENT | GTK_DIALOG_NO_SEPARATOR, + GTK_STOCK_CANCEL, GTK_RESPONSE_REJECT, + _("Split at _Marker"), VIK_TRW_LAYER_PROPWIN_SPLIT_MARKER, + _("Split _Segments"), VIK_TRW_LAYER_PROPWIN_SPLIT, + _("_Reverse"), VIK_TRW_LAYER_PROPWIN_REVERSE, + _("_Delete Dupl."), VIK_TRW_LAYER_PROPWIN_DEL_DUP, + GTK_STOCK_OK, GTK_RESPONSE_ACCEPT, + NULL); + widgets->dialog = dialog; + g_signal_connect( G_OBJECT(dialog), "response", G_CALLBACK(propwin_response_cb), widgets); + + g_free(title); + GtkWidget *table; + gdouble tr_len; + gulong tp_count; + guint seg_count; + + gboolean DEM_available = a_dems_overlaps_bbox (tr->bbox); + + gdouble min_alt, max_alt; + widgets->elev_box = vik_trw_layer_create_profile(GTK_WIDGET(parent), widgets, &min_alt, &max_alt); + widgets->gradient_box = vik_trw_layer_create_gradient(GTK_WIDGET(parent), widgets); + widgets->speed_box = vik_trw_layer_create_vtdiag(GTK_WIDGET(parent), widgets); + widgets->dist_box = vik_trw_layer_create_dtdiag(GTK_WIDGET(parent), widgets); + widgets->elev_time_box = vik_trw_layer_create_etdiag(GTK_WIDGET(parent), widgets); + widgets->speed_dist_box = vik_trw_layer_create_sddiag(GTK_WIDGET(parent), widgets); + GtkWidget *graphs = gtk_notebook_new(); + + GtkWidget *content_prop[20]; + int cnt_prop = 0; + + static gchar *label_texts[] = { + N_("Comment:"), + N_("Description:"), + N_("Source:"), + N_("Type:"), + N_("Color:"), + N_("Draw Name:"), + N_("Distance Labels:"), + }; + static gchar *stats_texts[] = { + N_("Track Length:"), + N_("Trackpoints:"), + N_("Segments:"), + N_("Duplicate Points:"), + N_("Max Speed:"), + N_("Avg. Speed:"), + N_("Moving Avg. Speed:"), + N_("Avg. Dist. Between TPs:"), + N_("Elevation Range:"), + N_("Total Elevation Gain/Loss:"), + N_("Start:"), + N_("End:"), + N_("Duration:"), + }; + static gchar tmp_buf[50]; + gdouble tmp_speed; + + // Properties + widgets->w_comment = ui_entry_new ( NULL, GTK_ENTRY_ICON_SECONDARY ); + if ( tr->comment ) + gtk_entry_set_text ( GTK_ENTRY(widgets->w_comment), tr->comment ); + content_prop[cnt_prop++] = widgets->w_comment; + + widgets->w_description = ui_entry_new ( NULL, GTK_ENTRY_ICON_SECONDARY ); + if ( tr->description ) + gtk_entry_set_text ( GTK_ENTRY(widgets->w_description), tr->description ); + content_prop[cnt_prop++] = widgets->w_description; + + widgets->w_source = ui_entry_new ( NULL, GTK_ENTRY_ICON_SECONDARY ); + if ( tr->source ) + gtk_entry_set_text ( GTK_ENTRY(widgets->w_source), tr->source ); + content_prop[cnt_prop++] = widgets->w_source; + + widgets->w_type = ui_entry_new ( NULL, GTK_ENTRY_ICON_SECONDARY ); + if ( tr->type ) + gtk_entry_set_text ( GTK_ENTRY(widgets->w_type), tr->type ); + content_prop[cnt_prop++] = widgets->w_type; + + widgets->w_color = content_prop[cnt_prop++] = gtk_color_button_new_with_color ( &(tr->color) ); + + static gchar *draw_name_labels[] = { + N_("No"), + N_("Centre"), + N_("Start only"), + N_("End only"), + N_("Start and End"), + N_("Centre, Start and End"), + NULL + }; + + widgets->w_namelabel = content_prop[cnt_prop++] = vik_combo_box_text_new (); + gchar **pstr = draw_name_labels; + while ( *pstr ) + vik_combo_box_text_append ( widgets->w_namelabel, *(pstr++) ); + gtk_combo_box_set_active ( GTK_COMBO_BOX(widgets->w_namelabel), tr->draw_name_mode ); + + widgets->w_number_distlabels = content_prop[cnt_prop++] = + gtk_spin_button_new ( GTK_ADJUSTMENT(gtk_adjustment_new(tr->max_number_dist_labels, 0, 100, 1, 1, 0)), 1, 0 ); + gtk_widget_set_tooltip_text ( GTK_WIDGET(widgets->w_number_distlabels), _("Maximum number of distance labels to be shown") ); + + table = create_table (cnt_prop, label_texts, content_prop); + + gtk_notebook_append_page(GTK_NOTEBOOK(graphs), GTK_WIDGET(table), gtk_label_new(_("Properties"))); + + // Statistics + GtkWidget *content[20]; + int cnt = 0; + + vik_units_distance_t dist_units = a_vik_get_units_distance (); + + // NB This value not shown yet - but is used by internal calculations + widgets->track_length_inc_gaps = vik_track_get_length_including_gaps(tr); + + tr_len = widgets->track_length = vik_track_get_length(tr); + switch (dist_units) { + case VIK_UNITS_DISTANCE_KILOMETRES: + g_snprintf(tmp_buf, sizeof(tmp_buf), "%.2f km", tr_len/1000.0 ); + break; + case VIK_UNITS_DISTANCE_MILES: + g_snprintf(tmp_buf, sizeof(tmp_buf), "%.2f miles", VIK_METERS_TO_MILES(tr_len) ); + break; + case VIK_UNITS_DISTANCE_NAUTICAL_MILES: + g_snprintf(tmp_buf, sizeof(tmp_buf), "%.2f NM", VIK_METERS_TO_NAUTICAL_MILES(tr_len) ); + break; + default: + g_critical("Houston, we've had a problem. distance=%d", dist_units); + } + widgets->w_track_length = content[cnt++] = ui_label_new_selectable ( tmp_buf ); + + tp_count = vik_track_get_tp_count(tr); + g_snprintf(tmp_buf, sizeof(tmp_buf), "%lu", tp_count ); + widgets->w_tp_count = content[cnt++] = ui_label_new_selectable ( tmp_buf ); + + seg_count = vik_track_get_segment_count(tr) ; + g_snprintf(tmp_buf, sizeof(tmp_buf), "%u", seg_count ); + widgets->w_segment_count = content[cnt++] = ui_label_new_selectable ( tmp_buf ); + + g_snprintf(tmp_buf, sizeof(tmp_buf), "%lu", vik_track_get_dup_point_count(tr) ); + widgets->w_duptp_count = content[cnt++] = ui_label_new_selectable ( tmp_buf ); + + vik_units_speed_t speed_units = a_vik_get_units_speed (); + tmp_speed = vik_track_get_max_speed(tr); + if ( tmp_speed == 0 ) + g_snprintf(tmp_buf, sizeof(tmp_buf), _("No Data")); + else { + switch (speed_units) { + case VIK_UNITS_SPEED_KILOMETRES_PER_HOUR: + g_snprintf(tmp_buf, sizeof(tmp_buf), "%.2f km/h", VIK_MPS_TO_KPH(tmp_speed)); + break; + case VIK_UNITS_SPEED_MILES_PER_HOUR: + g_snprintf(tmp_buf, sizeof(tmp_buf), "%.2f mph", VIK_MPS_TO_MPH(tmp_speed)); + break; + case VIK_UNITS_SPEED_METRES_PER_SECOND: + g_snprintf(tmp_buf, sizeof(tmp_buf), "%.2f m/s", tmp_speed ); + break; + case VIK_UNITS_SPEED_KNOTS: + g_snprintf(tmp_buf, sizeof(tmp_buf), "%.2f knots", VIK_MPS_TO_KNOTS(tmp_speed)); + break; + case VIK_UNITS_SPEED_SECONDS_PER_KM: + g_snprintf(tmp_buf, sizeof(tmp_buf), "%.2f s/km", VIK_MPS_TO_PACE_SPK(tmp_speed)); + break; + case VIK_UNITS_SPEED_MINUTES_PER_KM: + g_snprintf(tmp_buf, sizeof(tmp_buf), "%.2f min/km", VIK_MPS_TO_PACE_MPK(tmp_speed)); + break; + case VIK_UNITS_SPEED_SECONDS_PER_MILE: + g_snprintf(tmp_buf, sizeof(tmp_buf), "%.2f sec/mi", VIK_MPS_TO_PACE_SPM(tmp_speed)); + break; + case VIK_UNITS_SPEED_MINUTES_PER_MILE: + g_snprintf(tmp_buf, sizeof(tmp_buf), "%.2f min/mi", VIK_MPS_TO_PACE_MPM(tmp_speed)); + break; + default: + g_snprintf (tmp_buf, sizeof(tmp_buf), "--" ); + g_critical("Houston, we've had a problem. speed=%d", speed_units); + } + } + widgets->w_max_speed = content[cnt++] = ui_label_new_selectable ( tmp_buf ); + + tmp_speed = vik_track_get_average_speed(tr); + if ( tmp_speed == 0 ) + g_snprintf(tmp_buf, sizeof(tmp_buf), _("No Data")); + else { + switch (speed_units) { + case VIK_UNITS_SPEED_KILOMETRES_PER_HOUR: + g_snprintf(tmp_buf, sizeof(tmp_buf), "%.2f km/h", VIK_MPS_TO_KPH(tmp_speed)); + break; + case VIK_UNITS_SPEED_MILES_PER_HOUR: + g_snprintf(tmp_buf, sizeof(tmp_buf), "%.2f mph", VIK_MPS_TO_MPH(tmp_speed)); + break; + case VIK_UNITS_SPEED_METRES_PER_SECOND: + g_snprintf(tmp_buf, sizeof(tmp_buf), "%.2f m/s", tmp_speed ); + break; + case VIK_UNITS_SPEED_KNOTS: + g_snprintf(tmp_buf, sizeof(tmp_buf), "%.2f knots", VIK_MPS_TO_KNOTS(tmp_speed)); + break; + case VIK_UNITS_SPEED_SECONDS_PER_KM: + g_snprintf(tmp_buf, sizeof(tmp_buf), "%.2f s/km", VIK_MPS_TO_PACE_SPK(tmp_speed)); + break; + case VIK_UNITS_SPEED_MINUTES_PER_KM: + g_snprintf(tmp_buf, sizeof(tmp_buf), "%.2f min/km", VIK_MPS_TO_PACE_MPK(tmp_speed)); + break; + case VIK_UNITS_SPEED_SECONDS_PER_MILE: + g_snprintf(tmp_buf, sizeof(tmp_buf), "%.2f sec/mi", VIK_MPS_TO_PACE_SPM(tmp_speed)); + break; + case VIK_UNITS_SPEED_MINUTES_PER_MILE: + g_snprintf(tmp_buf, sizeof(tmp_buf), "%.2f min/mi", VIK_MPS_TO_PACE_MPM(tmp_speed)); + break; + default: + g_snprintf (tmp_buf, sizeof(tmp_buf), "--" ); + g_critical("Houston, we've had a problem. speed=%d", speed_units); + } + } + widgets->w_avg_speed = content[cnt++] = ui_label_new_selectable ( tmp_buf ); + + // Use 60sec as the default period to be considered stopped + // this is the TrackWaypoint draw stops default value 'vtl->stop_length' + // however this variable is not directly accessible - and I don't expect it's often changed from the default + // so ATM just put in the number + tmp_speed = vik_track_get_average_speed_moving(tr, 60); + if ( tmp_speed == 0 ) + g_snprintf(tmp_buf, sizeof(tmp_buf), _("No Data")); + else { + switch (speed_units) { + case VIK_UNITS_SPEED_KILOMETRES_PER_HOUR: + g_snprintf(tmp_buf, sizeof(tmp_buf), "%.2f km/h", VIK_MPS_TO_KPH(tmp_speed)); + break; + case VIK_UNITS_SPEED_MILES_PER_HOUR: + g_snprintf(tmp_buf, sizeof(tmp_buf), "%.2f mph", VIK_MPS_TO_MPH(tmp_speed)); + break; + case VIK_UNITS_SPEED_METRES_PER_SECOND: + g_snprintf(tmp_buf, sizeof(tmp_buf), "%.2f m/s", tmp_speed ); + break; + case VIK_UNITS_SPEED_KNOTS: + g_snprintf(tmp_buf, sizeof(tmp_buf), "%.2f knots", VIK_MPS_TO_KNOTS(tmp_speed)); + break; + case VIK_UNITS_SPEED_SECONDS_PER_KM: + g_snprintf(tmp_buf, sizeof(tmp_buf), "%.2f s/km", VIK_MPS_TO_PACE_SPK(tmp_speed)); + break; + case VIK_UNITS_SPEED_MINUTES_PER_KM: + g_snprintf(tmp_buf, sizeof(tmp_buf), "%.2f min/km", VIK_MPS_TO_PACE_MPK(tmp_speed)); + break; + case VIK_UNITS_SPEED_SECONDS_PER_MILE: + g_snprintf(tmp_buf, sizeof(tmp_buf), "%.2f sec/mi", VIK_MPS_TO_PACE_SPM(tmp_speed)); + break; + case VIK_UNITS_SPEED_MINUTES_PER_MILE: + g_snprintf(tmp_buf, sizeof(tmp_buf), "%.2f min/mi", VIK_MPS_TO_PACE_MPM(tmp_speed)); + break; + default: + g_snprintf (tmp_buf, sizeof(tmp_buf), "--" ); + g_critical("Houston, we've had a problem. speed=%d", speed_units); + } + } + widgets->w_mvg_speed = content[cnt++] = ui_label_new_selectable ( tmp_buf ); + + switch (dist_units) { + case VIK_UNITS_DISTANCE_KILOMETRES: + // Even though kilometres, the average distance between points is going to be quite small so keep in metres + g_snprintf(tmp_buf, sizeof(tmp_buf), "%.2f m", (tp_count - seg_count) == 0 ? 0 : tr_len / ( tp_count - seg_count ) ); + break; + case VIK_UNITS_DISTANCE_MILES: + g_snprintf(tmp_buf, sizeof(tmp_buf), "%.3f miles", (tp_count - seg_count) == 0 ? 0 : VIK_METERS_TO_MILES(tr_len / ( tp_count - seg_count )) ); + break; + case VIK_UNITS_DISTANCE_NAUTICAL_MILES: + g_snprintf(tmp_buf, sizeof(tmp_buf), "%.3f NM", (tp_count - seg_count) == 0 ? 0 : VIK_METERS_TO_NAUTICAL_MILES(tr_len / ( tp_count - seg_count )) ); + break; + default: + g_critical("Houston, we've had a problem. distance=%d", dist_units); + } + widgets->w_avg_dist = content[cnt++] = ui_label_new_selectable ( tmp_buf ); + + vik_units_height_t height_units = a_vik_get_units_height (); + if ( (min_alt == VIK_DEFAULT_ALTITUDE) && (max_alt == VIK_DEFAULT_ALTITUDE) ) + g_snprintf(tmp_buf, sizeof(tmp_buf), _("No Data")); + else { + switch (height_units) { + case VIK_UNITS_HEIGHT_METRES: + g_snprintf(tmp_buf, sizeof(tmp_buf), "%.0f m - %.0f m", min_alt, max_alt ); + break; + case VIK_UNITS_HEIGHT_FEET: + g_snprintf(tmp_buf, sizeof(tmp_buf), "%.0f feet - %.0f feet", VIK_METERS_TO_FEET(min_alt), VIK_METERS_TO_FEET(max_alt) ); + break; + default: + g_snprintf(tmp_buf, sizeof(tmp_buf), "--" ); + g_critical("Houston, we've had a problem. height=%d", height_units); + } + } + widgets->w_elev_range = content[cnt++] = ui_label_new_selectable ( tmp_buf ); + + vik_track_get_total_elevation_gain(tr, &max_alt, &min_alt ); + if ( (min_alt == VIK_DEFAULT_ALTITUDE) && (max_alt == VIK_DEFAULT_ALTITUDE) ) + g_snprintf(tmp_buf, sizeof(tmp_buf), _("No Data")); + else { + switch (height_units) { + case VIK_UNITS_HEIGHT_METRES: + g_snprintf(tmp_buf, sizeof(tmp_buf), "%.0f m / %.0f m", max_alt, min_alt ); + break; + case VIK_UNITS_HEIGHT_FEET: + g_snprintf(tmp_buf, sizeof(tmp_buf), "%.0f feet / %.0f feet", VIK_METERS_TO_FEET(max_alt), VIK_METERS_TO_FEET(min_alt) ); + break; + default: + g_snprintf(tmp_buf, sizeof(tmp_buf), "--" ); + g_critical("Houston, we've had a problem. height=%d", height_units); + } + } + widgets->w_elev_gain = content[cnt++] = ui_label_new_selectable ( tmp_buf ); + +#if 0 +#define PACK(w) gtk_box_pack_start (GTK_BOX(right_vbox), w, FALSE, FALSE, 0); + gtk_box_pack_start (GTK_BOX(right_vbox), e_cmt, FALSE, FALSE, 0); + PACK(l_len); + PACK(l_tps); + PACK(l_segs); + PACK(l_dups); + PACK(l_maxs); + PACK(l_avgs); + PACK(l_avgd); + PACK(l_elev); + PACK(l_galo); +#undef PACK; +#endif + + if ( tr->trackpoints && VIK_TRACKPOINT(tr->trackpoints->data)->timestamp ) + { + time_t t1, t2; + t1 = VIK_TRACKPOINT(tr->trackpoints->data)->timestamp; + t2 = VIK_TRACKPOINT(g_list_last(tr->trackpoints)->data)->timestamp; + + VikCoord vc; + // Notional center of a track is simply an average of the bounding box extremities + struct LatLon center = { (tr->bbox.north+tr->bbox.south)/2, (tr->bbox.east+tr->bbox.west)/2 }; + vik_coord_load_from_latlon ( &vc, vik_trw_layer_get_coord_mode(vtl), ¢er ); + + widgets->tz = vu_get_tz_at_location ( &vc ); + + gchar *msg; + msg = vu_get_time_string ( &t1, "%c", &vc, widgets->tz ); + widgets->w_time_start = content[cnt++] = ui_label_new_selectable(msg); + g_free ( msg ); + + msg = vu_get_time_string ( &t2, "%c", &vc, widgets->tz ); + widgets->w_time_end = content[cnt++] = ui_label_new_selectable(msg); + g_free ( msg ); + + gint total_duration_s = (gint)(t2-t1); + gint segments_duration_s = (gint)vik_track_get_duration(tr,FALSE); + gint total_duration_m = total_duration_s/60; + gint segments_duration_m = segments_duration_s/60; + g_snprintf(tmp_buf, sizeof(tmp_buf), _("%d minutes - %d minutes moving"), total_duration_m, segments_duration_m); + widgets->w_time_dur = content[cnt++] = ui_label_new_selectable(tmp_buf); + + // A tooltip to show in more readable hours:minutes + gchar tip_buf_total[20]; + guint h_tot = total_duration_s/3600; + guint m_tot = (total_duration_s - h_tot*3600)/60; + g_snprintf(tip_buf_total, sizeof(tip_buf_total), "%d:%02d", h_tot, m_tot); + gchar tip_buf_segments[20]; + guint h_seg = segments_duration_s/3600; + guint m_seg = (segments_duration_s - h_seg*3600)/60; + g_snprintf(tip_buf_segments, sizeof(tip_buf_segments), "%d:%02d", h_seg, m_seg); + gchar *tip = g_strdup_printf (_("%s total - %s in segments"), tip_buf_total, tip_buf_segments); + gtk_widget_set_tooltip_text ( GTK_WIDGET(widgets->w_time_dur), tip ); + g_free (tip); + } else { + widgets->w_time_start = content[cnt++] = gtk_label_new(_("No Data")); + widgets->w_time_end = content[cnt++] = gtk_label_new(_("No Data")); + widgets->w_time_dur = content[cnt++] = gtk_label_new(_("No Data")); + } + + table = create_table (cnt, stats_texts, content); + + gtk_notebook_append_page(GTK_NOTEBOOK(graphs), GTK_WIDGET(table), gtk_label_new(_("Statistics"))); + + if ( widgets->elev_box ) { + GtkWidget *page = NULL; + widgets->w_cur_dist = ui_label_new_selectable(_("No Data")); + widgets->w_cur_elevation = ui_label_new_selectable(_("No Data")); + widgets->w_show_dem = gtk_check_button_new_with_mnemonic(_("Show D_EM")); + gtk_widget_set_sensitive ( widgets->w_show_dem, DEM_available ); + widgets->w_show_alt_gps_speed = gtk_check_button_new_with_mnemonic(_("Show _GPS Speed")); + page = create_graph_page (widgets->elev_box, + _("Track Distance:"), widgets->w_cur_dist, + _("Track Height:"), widgets->w_cur_elevation, + NULL, NULL, + widgets->w_show_dem, show_dem, + widgets->w_show_alt_gps_speed, show_alt_gps_speed); + g_signal_connect (widgets->w_show_dem, "toggled", G_CALLBACK (checkbutton_toggle_cb), widgets); + g_signal_connect (widgets->w_show_alt_gps_speed, "toggled", G_CALLBACK (checkbutton_toggle_cb), widgets); + gtk_notebook_append_page(GTK_NOTEBOOK(graphs), page, gtk_label_new(_("Elevation-distance"))); + } + + if ( widgets->gradient_box ) { + GtkWidget *page = NULL; + widgets->w_cur_gradient_dist = ui_label_new_selectable(_("No Data")); + widgets->w_cur_gradient_gradient = ui_label_new_selectable(_("No Data")); + widgets->w_show_gradient_gps_speed = gtk_check_button_new_with_mnemonic(_("Show _GPS Speed")); + page = create_graph_page (widgets->gradient_box, + _("Track Distance:"), widgets->w_cur_gradient_dist, + _("Track Gradient:"), widgets->w_cur_gradient_gradient, + NULL, NULL, + widgets->w_show_gradient_gps_speed, show_gradient_gps_speed, + NULL, FALSE); + g_signal_connect (widgets->w_show_gradient_gps_speed, "toggled", G_CALLBACK (checkbutton_toggle_cb), widgets); + gtk_notebook_append_page(GTK_NOTEBOOK(graphs), page, gtk_label_new(_("Gradient-distance"))); + } + + if ( widgets->speed_box ) { + GtkWidget *page = NULL; + widgets->w_cur_time = ui_label_new_selectable(_("No Data")); + widgets->w_cur_speed = ui_label_new_selectable(_("No Data")); + widgets->w_cur_time_real = ui_label_new_selectable(_("No Data")); + widgets->w_show_gps_speed = gtk_check_button_new_with_mnemonic(_("Show _GPS Speed")); + page = create_graph_page (widgets->speed_box, + _("Track Time:"), widgets->w_cur_time, + _("Track Speed:"), widgets->w_cur_speed, + _("Time/Date:"), widgets->w_cur_time_real, + widgets->w_show_gps_speed, show_gps_speed, + NULL, FALSE); + g_signal_connect (widgets->w_show_gps_speed, "toggled", G_CALLBACK (checkbutton_toggle_cb), widgets); + gtk_notebook_append_page(GTK_NOTEBOOK(graphs), page, gtk_label_new(_("Speed-time"))); + } + + if ( widgets->dist_box ) { + GtkWidget *page = NULL; + widgets->w_cur_dist_time = ui_label_new_selectable(_("No Data")); + widgets->w_cur_dist_dist = ui_label_new_selectable(_("No Data")); + widgets->w_cur_dist_time_real = ui_label_new_selectable(_("No Data")); + widgets->w_show_dist_speed = gtk_check_button_new_with_mnemonic(_("Show S_peed")); + page = create_graph_page (widgets->dist_box, + _("Track Distance:"), widgets->w_cur_dist_dist, + _("Track Time:"), widgets->w_cur_dist_time, + _("Time/Date:"), widgets->w_cur_dist_time_real, + widgets->w_show_dist_speed, show_dist_speed, + NULL, FALSE); + g_signal_connect (widgets->w_show_dist_speed, "toggled", G_CALLBACK (checkbutton_toggle_cb), widgets); + gtk_notebook_append_page(GTK_NOTEBOOK(graphs), page, gtk_label_new(_("Distance-time"))); + } + + if ( widgets->elev_time_box ) { + GtkWidget *page = NULL; + widgets->w_cur_elev_time = ui_label_new_selectable(_("No Data")); + widgets->w_cur_elev_elev = ui_label_new_selectable(_("No Data")); + widgets->w_cur_elev_time_real = ui_label_new_selectable(_("No Data")); + widgets->w_show_elev_speed = gtk_check_button_new_with_mnemonic(_("Show S_peed")); + widgets->w_show_elev_dem = gtk_check_button_new_with_mnemonic(_("Show D_EM")); + gtk_widget_set_sensitive ( widgets->w_show_elev_dem, DEM_available ); + page = create_graph_page (widgets->elev_time_box, + _("Track Time:"), widgets->w_cur_elev_time, + _("Track Height:"), widgets->w_cur_elev_elev, + _("Time/Date:"), widgets->w_cur_elev_time_real, + widgets->w_show_elev_dem, show_elev_dem, + widgets->w_show_elev_speed, show_elev_speed); + g_signal_connect (widgets->w_show_elev_dem, "toggled", G_CALLBACK (checkbutton_toggle_cb), widgets); + g_signal_connect (widgets->w_show_elev_speed, "toggled", G_CALLBACK (checkbutton_toggle_cb), widgets); + gtk_notebook_append_page(GTK_NOTEBOOK(graphs), page, gtk_label_new(_("Elevation-time"))); + } + + if ( widgets->speed_dist_box ) { + GtkWidget *page = NULL; + widgets->w_cur_speed_dist = ui_label_new_selectable(_("No Data")); + widgets->w_cur_speed_speed = ui_label_new_selectable(_("No Data")); + widgets->w_show_sd_gps_speed = gtk_check_button_new_with_mnemonic(_("Show _GPS Speed")); + page = create_graph_page (widgets->speed_dist_box, + _("Track Distance:"), widgets->w_cur_speed_dist, + _("Track Speed:"), widgets->w_cur_speed_speed, + NULL, NULL, + widgets->w_show_sd_gps_speed, show_sd_gps_speed, + NULL, FALSE); + g_signal_connect (widgets->w_show_sd_gps_speed, "toggled", G_CALLBACK (checkbutton_toggle_cb), widgets); + gtk_notebook_append_page(GTK_NOTEBOOK(graphs), page, gtk_label_new(_("Speed-distance"))); + } + + gtk_box_pack_start (GTK_BOX(gtk_dialog_get_content_area(GTK_DIALOG(dialog))), graphs, FALSE, FALSE, 0); + + gtk_dialog_set_response_sensitive(GTK_DIALOG(dialog), VIK_TRW_LAYER_PROPWIN_SPLIT_MARKER, FALSE); + if (seg_count <= 1) + gtk_dialog_set_response_sensitive(GTK_DIALOG(dialog), VIK_TRW_LAYER_PROPWIN_SPLIT, FALSE); + if (vik_track_get_dup_point_count(tr) <= 0) + gtk_dialog_set_response_sensitive(GTK_DIALOG(dialog), VIK_TRW_LAYER_PROPWIN_DEL_DUP, FALSE); + + // On dialog realization configure_event causes the graphs to be initially drawn + widgets->configure_dialog = TRUE; + g_signal_connect ( G_OBJECT(dialog), "configure-event", G_CALLBACK (configure_event), widgets ); + + g_signal_connect ( G_OBJECT(dialog), "destroy", G_CALLBACK (destroy_cb), widgets ); + + vik_track_set_property_dialog(tr, dialog); + gtk_dialog_set_default_response ( GTK_DIALOG(dialog), GTK_RESPONSE_ACCEPT ); + gtk_widget_show_all ( dialog ); + + // Gtk note: due to historical reasons, this must be done after widgets are shown + if ( start_on_stats ) + gtk_notebook_set_current_page ( GTK_NOTEBOOK(graphs), 1 ); +} + + +/** + * Update this property dialog + * e.g. if the track has been renamed + */ +void vik_trw_layer_propwin_update ( VikTrack *trk ) +{ + // If not displayed do nothing + if ( !trk->property_dialog ) + return; + + // Update title with current name + if ( trk->name ) { + gchar *title = g_strdup_printf ( _("%s - Track Properties"), trk->name ); + gtk_window_set_title ( GTK_WINDOW(trk->property_dialog), title ); + g_free(title); + } + +} diff --git a/src/viktrwlayer_propwin.h b/src/viktrwlayer_propwin.h new file mode 100644 index 0000000..51db14f --- /dev/null +++ b/src/viktrwlayer_propwin.h @@ -0,0 +1,51 @@ +/* -*- Mode: C; indent-tabs-mode: t; c-basic-offset: 4; tab-width: 4 -*- */ +/* + * viking -- GPS Data and Topo Analyzer, Explorer, and Manager + * + * Copyright (C) 2003-2005, Evan Battaglia + * + * 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., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA + * + */ +#ifndef _VIKING_TRWLAYER_PROPWIN_H +#define _VIKING_TRWLAYER_PROPWIN_H + +#include +#include +#include "viktrack.h" + +G_BEGIN_DECLS + +#define VIK_TRW_LAYER_PROPWIN_SPLIT 1 +#define VIK_TRW_LAYER_PROPWIN_REVERSE 2 +#define VIK_TRW_LAYER_PROPWIN_DEL_DUP 3 +#define VIK_TRW_LAYER_PROPWIN_SPLIT_MARKER 4 + +void vik_trw_layer_propwin_run ( GtkWindow *parent, + VikTrwLayer *vtl, + VikTrack *tr, + gpointer vlp, + VikViewport *vvp, + gboolean start_on_stats ); + +/** + * Update this property dialog + * e.g. if the track has been renamed + */ +void vik_trw_layer_propwin_update ( VikTrack *trk ); + +G_END_DECLS + +#endif diff --git a/src/viktrwlayer_tpwin.c b/src/viktrwlayer_tpwin.c new file mode 100644 index 0000000..0255d6d --- /dev/null +++ b/src/viktrwlayer_tpwin.c @@ -0,0 +1,626 @@ +/* + * viking -- GPS Data and Topo Analyzer, Explorer, and Manager + * + * Copyright (C) 2003-2005, Evan Battaglia + * Copyright (C) 2015, Rob Norris + * + * 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., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA + * + */ + +#ifdef HAVE_CONFIG_H +#include "config.h" +#endif + +#include +#include +#include +#include + +#include "coords.h" +#include "vikcoord.h" +#include "viktrack.h" +#include "viktrwlayer_tpwin.h" +#include "vikwaypoint.h" +#include "vikutils.h" +#include "dialog.h" +#include "globals.h" +#include "vikdatetime_edit_dialog.h" +#include "ui_util.h" + +// For simplicity these are global values +// (i.e. would get shared between multiple windows) +static gint width = 0; +static gint height = 0; + +struct _VikTrwLayerTpwin { + GtkDialog parent; + GtkSpinButton *lat, *lon, *alt, *ts; + GtkWidget *trkpt_name; + GtkWidget *time; + GtkLabel *course, *diff_dist, *diff_time, *diff_speed, *speed, *hdop, *vdop, *pdop, *sat; + // Previously these buttons were in a glist, however I think the ordering behaviour is implicit + // thus control manually to ensure operating on the correct button + GtkWidget *button_close; + GtkWidget *button_delete; + GtkWidget *button_insert; + GtkWidget *button_split; + GtkWidget *button_back; + GtkWidget *button_forward; + VikTrackpoint *cur_tp; + gboolean sync_to_tp_block; + gboolean configured; +}; + +GType vik_trw_layer_tpwin_get_type (void) +{ + static GType tpwin_type = 0; + + if (!tpwin_type) + { + static const GTypeInfo tpwin_info = + { + sizeof (VikTrwLayerTpwinClass), + NULL, /* base_init */ + NULL, /* base_finalize */ + NULL, /* class init */ + NULL, /* class_finalize */ + NULL, /* class_data */ + sizeof (VikTrwLayerTpwin), + 0, + NULL /* instance init */ + }; + tpwin_type = g_type_register_static ( GTK_TYPE_DIALOG, "VikTrwLayerTpwin", &tpwin_info, 0 ); + } + + return tpwin_type; +} + +/** + * Just update the display for the time fields + */ +static void tpwin_update_times ( VikTrwLayerTpwin *tpwin, VikTrackpoint *tp ) +{ + if ( tp->has_timestamp ) { + gtk_spin_button_set_value ( tpwin->ts, tp->timestamp ); + gchar *msg = vu_get_time_string ( &(tp->timestamp), "%c", &(tp->coord), NULL ); + gtk_button_set_label ( GTK_BUTTON(tpwin->time), msg ); + g_free ( msg ); + } + else { + gtk_spin_button_set_value ( tpwin->ts, 0 ); + gtk_button_set_label ( GTK_BUTTON(tpwin->time), "" ); + } +} + +static void tpwin_sync_ll_to_tp ( VikTrwLayerTpwin *tpwin ) +{ + if ( tpwin->cur_tp && (!tpwin->sync_to_tp_block) ) + { + struct LatLon ll; + VikCoord coord; + ll.lat = gtk_spin_button_get_value ( tpwin->lat ); + ll.lon = gtk_spin_button_get_value ( tpwin->lon ); + vik_coord_load_from_latlon ( &coord, tpwin->cur_tp->coord.mode, &ll ); + + /* don't redraw unless we really have to */ + if ( vik_coord_diff(&(tpwin->cur_tp->coord), &coord) > 0.05 ) /* may not be exact due to rounding */ + { + tpwin->cur_tp->coord = coord; + gtk_dialog_response ( GTK_DIALOG(tpwin), VIK_TRW_LAYER_TPWIN_DATA_CHANGED ); + } + } +} + +static void tpwin_sync_alt_to_tp ( VikTrwLayerTpwin *tpwin ) +{ + if ( tpwin->cur_tp && (!tpwin->sync_to_tp_block) ) { + // Always store internally in metres + vik_units_height_t height_units = a_vik_get_units_height (); + switch (height_units) { + case VIK_UNITS_HEIGHT_METRES: + tpwin->cur_tp->altitude = gtk_spin_button_get_value ( tpwin->alt ); + break; + case VIK_UNITS_HEIGHT_FEET: + tpwin->cur_tp->altitude = VIK_FEET_TO_METERS(gtk_spin_button_get_value ( tpwin->alt )); + break; + default: + tpwin->cur_tp->altitude = gtk_spin_button_get_value ( tpwin->alt ); + g_critical("Houston, we've had a problem. height=%d", height_units); + } + } +} + +/** + * + */ +static void tpwin_sync_ts_to_tp ( VikTrwLayerTpwin *tpwin ) +{ + if ( tpwin->cur_tp && (!tpwin->sync_to_tp_block) ) { + tpwin->cur_tp->timestamp = gtk_spin_button_get_value_as_int ( tpwin->ts ); + + tpwin_update_times ( tpwin, tpwin->cur_tp ); + } +} + +static time_t last_edit_time = 0; + +/** + * tpwin_sync_time_to_tp: + * + */ +static void tpwin_sync_time_to_tp ( GtkWidget* widget, GdkEventButton *event, VikTrwLayerTpwin *tpwin ) +{ + if ( !tpwin->cur_tp || tpwin->sync_to_tp_block ) + return; + + if ( event->button == 3 ) { + // On right click and when a time is available, allow a method to copy the displayed time as text + if ( !gtk_button_get_image ( GTK_BUTTON(widget) ) ) { + vu_copy_label_menu ( widget, event->button ); + } + return; + } + else if ( event->button == 2 ) { + return; + } + + if ( !tpwin->cur_tp || tpwin->sync_to_tp_block ) + return; + + if ( tpwin->cur_tp->has_timestamp ) + last_edit_time = tpwin->cur_tp->timestamp; + else if ( last_edit_time == 0 ) + time ( &last_edit_time ); + + GTimeZone *gtz = g_time_zone_new_local (); + time_t mytime = vik_datetime_edit_dialog ( GTK_WINDOW(gtk_widget_get_toplevel(GTK_WIDGET(&tpwin->parent))), + _("Date/Time Edit"), + last_edit_time, + gtz ); + g_time_zone_unref ( gtz ); + + // Was the dialog cancelled? + if ( mytime == 0 ) + return; + + // Otherwise use the new value + tpwin->cur_tp->timestamp = mytime; + tpwin->cur_tp->has_timestamp = TRUE; + // TODO: consider warning about unsorted times? + + // Clear the previous 'Add' image as now a time is set + if ( gtk_button_get_image ( GTK_BUTTON(tpwin->time) ) ) + gtk_button_set_image ( GTK_BUTTON(tpwin->time), NULL ); + + tpwin_update_times ( tpwin, tpwin->cur_tp ); +} + +static gboolean tpwin_set_name ( VikTrwLayerTpwin *tpwin ) +{ + if ( tpwin->cur_tp && (!tpwin->sync_to_tp_block) ) { + vik_trackpoint_set_name ( tpwin->cur_tp, gtk_entry_get_text(GTK_ENTRY(tpwin->trkpt_name)) ); + } + return FALSE; +} + +static gboolean configure_event ( GtkWidget *widget, GdkEventConfigure *event, VikTrwLayerTpwin *tpwin ) +{ + if ( !tpwin->configured ) { + tpwin->configured = TRUE; + + // Set defaults + if ( width == 0 ) + width = event->width; + if ( height == 0 ) + height = event->height; + + // Allow sizing back down to the minimum + GdkGeometry geom = { event->width, event->height, 0, 0, 0, 0, 0, 0, 0, 0, GDK_GRAVITY_STATIC }; + gtk_window_set_geometry_hints ( GTK_WINDOW(widget), widget, &geom, GDK_HINT_MIN_SIZE ); + + // Restore previous size (if one was set) + gtk_window_resize ( GTK_WINDOW(widget), width, height ); + } + return FALSE; +} + +VikTrwLayerTpwin *vik_trw_layer_tpwin_new ( GtkWindow *parent ) +{ + static gchar *left_label_texts[] = { N_("Name:"), + N_("Latitude:"), + N_("Longitude:"), + N_("Altitude:"), + N_("Course:"), + N_("Timestamp:"), + N_("Time:") }; + static gchar *right_label_texts[] = { N_("Distance Difference:"), + N_("Time Difference:"), + N_("\"Speed\" Between:"), + N_("Speed:"), + N_("VDOP:"), + N_("HDOP:"), + N_("PDOP:"), + N_("SAT/FIX:") }; + + VikTrwLayerTpwin *tpwin = VIK_TRW_LAYER_TPWIN ( g_object_new ( VIK_TRW_LAYER_TPWIN_TYPE, NULL ) ); + GtkWidget *main_hbox, *left_vbox, *right_vbox; + GtkWidget *diff_left_vbox, *diff_right_vbox; + + gtk_window_set_transient_for ( GTK_WINDOW(tpwin), parent ); + gtk_window_set_title ( GTK_WINDOW(tpwin), _("Trackpoint") ); + + tpwin->button_close = gtk_dialog_add_button ( GTK_DIALOG(tpwin), GTK_STOCK_CLOSE, VIK_TRW_LAYER_TPWIN_CLOSE); + tpwin->button_insert = gtk_dialog_add_button ( GTK_DIALOG(tpwin), _("_Insert After"), VIK_TRW_LAYER_TPWIN_INSERT); + tpwin->button_delete = gtk_dialog_add_button ( GTK_DIALOG(tpwin), GTK_STOCK_DELETE, VIK_TRW_LAYER_TPWIN_DELETE); + tpwin->button_split = gtk_dialog_add_button ( GTK_DIALOG(tpwin), _("Split Here"), VIK_TRW_LAYER_TPWIN_SPLIT); + tpwin->button_back = gtk_dialog_add_button ( GTK_DIALOG(tpwin), GTK_STOCK_GO_BACK, VIK_TRW_LAYER_TPWIN_BACK); + tpwin->button_forward = gtk_dialog_add_button ( GTK_DIALOG(tpwin), GTK_STOCK_GO_FORWARD, VIK_TRW_LAYER_TPWIN_FORWARD); + + /* + gtk_dialog_add_buttons ( GTK_DIALOG(tpwin), + GTK_STOCK_CLOSE, VIK_TRW_LAYER_TPWIN_CLOSE, + _("_Insert After"), VIK_TRW_LAYER_TPWIN_INSERT, + GTK_STOCK_DELETE, VIK_TRW_LAYER_TPWIN_DELETE, + _("Split Here"), VIK_TRW_LAYER_TPWIN_SPLIT, + GTK_STOCK_GO_BACK, VIK_TRW_LAYER_TPWIN_BACK, + GTK_STOCK_GO_FORWARD, VIK_TRW_LAYER_TPWIN_FORWARD, + NULL ); + tpwin->buttons = gtk_container_get_children(GTK_CONTAINER(GTK_DIALOG(tpwin)->action_area)); + */ + + /* main track info */ + left_vbox = a_dialog_create_label_vbox ( left_label_texts, G_N_ELEMENTS(left_label_texts), 1, 3 ); + + tpwin->trkpt_name = ui_entry_new ( NULL, GTK_ENTRY_ICON_SECONDARY ); + g_signal_connect_swapped ( G_OBJECT(tpwin->trkpt_name), "focus-out-event", G_CALLBACK(tpwin_set_name), tpwin ); + + tpwin->course = GTK_LABEL(ui_label_new_selectable(NULL)); + tpwin->time = gtk_button_new(); + gtk_button_set_relief ( GTK_BUTTON(tpwin->time), GTK_RELIEF_NONE ); + g_signal_connect ( G_OBJECT(tpwin->time), "button-release-event", G_CALLBACK(tpwin_sync_time_to_tp), tpwin ); + + tpwin->lat = GTK_SPIN_BUTTON(gtk_spin_button_new( GTK_ADJUSTMENT(gtk_adjustment_new ( + 0, -90, 90, 0.00005, 0.01, 0 )), 0.00005, 6)); + tpwin->lon = GTK_SPIN_BUTTON(gtk_spin_button_new( GTK_ADJUSTMENT(gtk_adjustment_new ( + 0, -180, 180, 0.00005, 0.01, 0 )), 0.00005, 6)); + + g_signal_connect_swapped ( G_OBJECT(tpwin->lat), "value-changed", G_CALLBACK(tpwin_sync_ll_to_tp), tpwin ); + g_signal_connect_swapped ( G_OBJECT(tpwin->lon), "value-changed", G_CALLBACK(tpwin_sync_ll_to_tp), tpwin ); + + tpwin->alt = GTK_SPIN_BUTTON(gtk_spin_button_new( GTK_ADJUSTMENT(gtk_adjustment_new ( + 0, -1000, 25000, 10, 100, 0 )), 10, 2)); + + g_signal_connect_swapped ( G_OBJECT(tpwin->alt), "value-changed", G_CALLBACK(tpwin_sync_alt_to_tp), tpwin ); + + tpwin->ts = GTK_SPIN_BUTTON(gtk_spin_button_new_with_range(0,2147483647,1)); //pow(2,31)-1 limit input to ~2038 for now + g_signal_connect_swapped ( G_OBJECT(tpwin->ts), "value-changed", G_CALLBACK(tpwin_sync_ts_to_tp), tpwin ); + gtk_spin_button_set_digits ( tpwin->ts, 0 ); + + right_vbox = gtk_vbox_new ( TRUE, 1 ); + gtk_box_pack_start ( GTK_BOX(right_vbox), GTK_WIDGET(tpwin->trkpt_name), TRUE, TRUE, 3 ); + gtk_box_pack_start ( GTK_BOX(right_vbox), GTK_WIDGET(tpwin->lat), TRUE, TRUE, 3 ); + gtk_box_pack_start ( GTK_BOX(right_vbox), GTK_WIDGET(tpwin->lon), TRUE, TRUE, 3 ); + gtk_box_pack_start ( GTK_BOX(right_vbox), GTK_WIDGET(tpwin->alt), TRUE, TRUE, 3 ); + gtk_box_pack_start ( GTK_BOX(right_vbox), GTK_WIDGET(tpwin->course), TRUE, TRUE, 3 ); + gtk_box_pack_start ( GTK_BOX(right_vbox), GTK_WIDGET(tpwin->ts), TRUE, TRUE, 3 ); + gtk_box_pack_start ( GTK_BOX(right_vbox), GTK_WIDGET(tpwin->time), TRUE, TRUE, 3 ); + + /* diff info */ + diff_left_vbox = a_dialog_create_label_vbox ( right_label_texts, G_N_ELEMENTS(right_label_texts), 1, 3 ); + + tpwin->diff_dist = GTK_LABEL(ui_label_new_selectable(NULL)); + tpwin->diff_time = GTK_LABEL(ui_label_new_selectable(NULL)); + tpwin->diff_speed = GTK_LABEL(ui_label_new_selectable(NULL)); + tpwin->speed = GTK_LABEL(ui_label_new_selectable(NULL)); + + tpwin->vdop = GTK_LABEL(ui_label_new_selectable(NULL)); + tpwin->hdop = GTK_LABEL(ui_label_new_selectable(NULL)); + tpwin->pdop = GTK_LABEL(ui_label_new_selectable(NULL)); + tpwin->sat = GTK_LABEL(ui_label_new_selectable(NULL)); + + diff_right_vbox = gtk_vbox_new ( TRUE, 1 ); + gtk_box_pack_start ( GTK_BOX(diff_right_vbox), GTK_WIDGET(tpwin->diff_dist), FALSE, FALSE, 3 ); + gtk_box_pack_start ( GTK_BOX(diff_right_vbox), GTK_WIDGET(tpwin->diff_time), FALSE, FALSE, 3 ); + gtk_box_pack_start ( GTK_BOX(diff_right_vbox), GTK_WIDGET(tpwin->diff_speed), FALSE, FALSE, 3 ); + gtk_box_pack_start ( GTK_BOX(diff_right_vbox), GTK_WIDGET(tpwin->speed), FALSE, FALSE, 3 ); + + gtk_box_pack_start ( GTK_BOX(diff_right_vbox), GTK_WIDGET(tpwin->vdop), FALSE, FALSE, 3 ); + gtk_box_pack_start ( GTK_BOX(diff_right_vbox), GTK_WIDGET(tpwin->hdop), FALSE, FALSE, 3 ); + gtk_box_pack_start ( GTK_BOX(diff_right_vbox), GTK_WIDGET(tpwin->pdop), FALSE, FALSE, 3 ); + gtk_box_pack_start ( GTK_BOX(diff_right_vbox), GTK_WIDGET(tpwin->sat), FALSE, FALSE, 3 ); + + main_hbox = gtk_hbox_new( FALSE, 0 ); + gtk_box_pack_start ( GTK_BOX(main_hbox), left_vbox, FALSE, FALSE, 3 ); + gtk_box_pack_start ( GTK_BOX(main_hbox), right_vbox, TRUE, TRUE, 3 ); + gtk_box_pack_start ( GTK_BOX(main_hbox), diff_left_vbox, FALSE, FALSE, 3 ); + gtk_box_pack_start ( GTK_BOX(main_hbox), diff_right_vbox, FALSE, FALSE, 3 ); + + gtk_box_pack_start ( GTK_BOX(gtk_dialog_get_content_area(GTK_DIALOG(tpwin))), main_hbox, FALSE, FALSE, 0 ); + + tpwin->cur_tp = NULL; + + GtkWidget *response_w = NULL; +#if GTK_CHECK_VERSION (2, 20, 0) + response_w = gtk_dialog_get_widget_for_response ( GTK_DIALOG(tpwin), VIK_TRW_LAYER_TPWIN_CLOSE ); +#endif + if ( response_w ) + gtk_widget_grab_focus ( response_w ); + + tpwin->configured = FALSE; + g_signal_connect ( G_OBJECT(tpwin), "configure-event", G_CALLBACK (configure_event), tpwin ); + + return tpwin; +} + +/** + * + */ +void vik_trw_layer_tpwin_destroy ( VikTrwLayerTpwin *tpwin ) +{ + // Save the size before closing the dialog + gtk_window_get_size ( GTK_WINDOW(tpwin), &width, &height ); + gtk_widget_destroy ( GTK_WIDGET(tpwin) ); +} + +void vik_trw_layer_tpwin_set_empty ( VikTrwLayerTpwin *tpwin ) +{ + gtk_editable_delete_text ( GTK_EDITABLE(tpwin->trkpt_name), 0, -1 ); + gtk_widget_set_sensitive ( tpwin->trkpt_name, FALSE ); + + gtk_button_set_label ( GTK_BUTTON(tpwin->time), "" ); + gtk_label_set_text ( tpwin->course, NULL ); + + gtk_widget_set_sensitive ( GTK_WIDGET(tpwin->lat), FALSE ); + gtk_widget_set_sensitive ( GTK_WIDGET(tpwin->lon), FALSE ); + gtk_widget_set_sensitive ( GTK_WIDGET(tpwin->alt), FALSE ); + gtk_widget_set_sensitive ( GTK_WIDGET(tpwin->ts), FALSE ); + gtk_widget_set_sensitive ( GTK_WIDGET(tpwin->time), FALSE ); + + // Only keep close button enabled + gtk_widget_set_sensitive ( tpwin->button_insert, FALSE ); + gtk_widget_set_sensitive ( tpwin->button_split, FALSE ); + gtk_widget_set_sensitive ( tpwin->button_delete, FALSE ); + gtk_widget_set_sensitive ( tpwin->button_back, FALSE ); + gtk_widget_set_sensitive ( tpwin->button_forward, FALSE ); + + gtk_label_set_text ( tpwin->diff_dist, NULL ); + gtk_label_set_text ( tpwin->diff_time, NULL ); + gtk_label_set_text ( tpwin->diff_speed, NULL ); + gtk_label_set_text ( tpwin->speed, NULL ); + gtk_label_set_text ( tpwin->vdop, NULL ); + gtk_label_set_text ( tpwin->hdop, NULL ); + gtk_label_set_text ( tpwin->pdop, NULL ); + gtk_label_set_text ( tpwin->sat, NULL ); + + gtk_window_set_title ( GTK_WINDOW(tpwin), _("Trackpoint") ); +} + +/** + * vik_trw_layer_tpwin_set_tp: + * @tpwin: The Trackpoint Edit Window + * @tpl: The #Glist of trackpoints pointing at the current trackpoint + * @track_name: The name of the track in which the trackpoint belongs + * @is_route: Is the track of the trackpoint actually a route? + * + * Sets the Trackpoint Edit Window to the values of the current trackpoint given in @tpl. + * + */ +void vik_trw_layer_tpwin_set_tp ( VikTrwLayerTpwin *tpwin, GList *tpl, const gchar *track_name, gboolean is_route ) +{ + static char tmp_str[64]; + static struct LatLon ll; + VikTrackpoint *tp = VIK_TRACKPOINT(tpl->data); + + if ( tp->name ) + gtk_entry_set_text ( GTK_ENTRY(tpwin->trkpt_name), tp->name ); + else + gtk_editable_delete_text ( GTK_EDITABLE(tpwin->trkpt_name), 0, -1 ); + gtk_widget_set_sensitive ( tpwin->trkpt_name, TRUE ); + + /* Only can insert if not at the end (otherwise use extend track) */ + gtk_widget_set_sensitive ( tpwin->button_insert, (gboolean) GPOINTER_TO_INT (tpl->next) ); + gtk_widget_set_sensitive ( tpwin->button_delete, TRUE ); + + /* We can only split up a track if it's not an endpoint. Makes sense to me. */ + gtk_widget_set_sensitive ( tpwin->button_split, tpl->next && tpl->prev ); + + gtk_widget_set_sensitive ( tpwin->button_forward, (gboolean) GPOINTER_TO_INT (tpl->next) ); + gtk_widget_set_sensitive ( tpwin->button_back, (gboolean) GPOINTER_TO_INT (tpl->prev) ); + + gtk_widget_set_sensitive ( GTK_WIDGET(tpwin->lat), TRUE ); + gtk_widget_set_sensitive ( GTK_WIDGET(tpwin->lon), TRUE ); + gtk_widget_set_sensitive ( GTK_WIDGET(tpwin->alt), TRUE ); + gtk_widget_set_sensitive ( GTK_WIDGET(tpwin->ts), tp->has_timestamp ); + gtk_widget_set_sensitive ( GTK_WIDGET(tpwin->time), tp->has_timestamp ); + // Enable adding timestamps - but not on routepoints + if ( !tp->has_timestamp && !is_route ) { + gtk_widget_set_sensitive ( GTK_WIDGET(tpwin->time), TRUE ); + GtkWidget *img = gtk_image_new_from_stock ( GTK_STOCK_ADD, GTK_ICON_SIZE_MENU ); + gtk_button_set_image ( GTK_BUTTON(tpwin->time), img ); + } + else + + vik_trw_layer_tpwin_set_track_name ( tpwin, track_name ); + + tpwin->sync_to_tp_block = TRUE; /* don't update while setting data. */ + + vik_coord_to_latlon ( &(tp->coord), &ll ); + gtk_spin_button_set_value ( tpwin->lat, ll.lat ); + gtk_spin_button_set_value ( tpwin->lon, ll.lon ); + vik_units_height_t height_units = a_vik_get_units_height (); + switch (height_units) { + case VIK_UNITS_HEIGHT_METRES: + gtk_spin_button_set_value ( tpwin->alt, tp->altitude ); + break; + case VIK_UNITS_HEIGHT_FEET: + gtk_spin_button_set_value ( tpwin->alt, VIK_METERS_TO_FEET(tp->altitude) ); + break; + default: + gtk_spin_button_set_value ( tpwin->alt, tp->altitude ); + g_critical("Houston, we've had a problem. height=%d", height_units); + } + + tpwin_update_times ( tpwin, tp ); + + tpwin->sync_to_tp_block = FALSE; // don't update while setting data. + + vik_units_speed_t speed_units = a_vik_get_units_speed (); + vik_units_distance_t dist_units = a_vik_get_units_distance (); + if ( tpwin->cur_tp ) + { + switch (dist_units) { + case VIK_UNITS_DISTANCE_KILOMETRES: + g_snprintf ( tmp_str, sizeof(tmp_str), "%.2f m", vik_coord_diff(&(tp->coord), &(tpwin->cur_tp->coord))); + break; + case VIK_UNITS_DISTANCE_MILES: + case VIK_UNITS_DISTANCE_NAUTICAL_MILES: + g_snprintf ( tmp_str, sizeof(tmp_str), "%.2f yards", vik_coord_diff(&(tp->coord), &(tpwin->cur_tp->coord))*1.0936133); + break; + default: + g_critical("Houston, we've had a problem. distance=%d", dist_units); + } + + gtk_label_set_text ( tpwin->diff_dist, tmp_str ); + if ( tp->has_timestamp && tpwin->cur_tp->has_timestamp ) + { + g_snprintf ( tmp_str, sizeof(tmp_str), "%ld s", tp->timestamp - tpwin->cur_tp->timestamp); + gtk_label_set_text ( tpwin->diff_time, tmp_str ); + if ( tp->timestamp == tpwin->cur_tp->timestamp ) + gtk_label_set_text ( tpwin->diff_speed, "--" ); + else + { + switch (speed_units) { + case VIK_UNITS_SPEED_KILOMETRES_PER_HOUR: + g_snprintf ( tmp_str, sizeof(tmp_str), "%.2f km/h", VIK_MPS_TO_KPH(vik_coord_diff(&(tp->coord), &(tpwin->cur_tp->coord)) / (ABS(tp->timestamp - tpwin->cur_tp->timestamp))) ); + break; + case VIK_UNITS_SPEED_MILES_PER_HOUR: + g_snprintf ( tmp_str, sizeof(tmp_str), "%.2f mph", VIK_MPS_TO_MPH(vik_coord_diff(&(tp->coord), &(tpwin->cur_tp->coord)) / (ABS(tp->timestamp - tpwin->cur_tp->timestamp))) ); + break; + case VIK_UNITS_SPEED_METRES_PER_SECOND: + g_snprintf ( tmp_str, sizeof(tmp_str), "%.2f m/s", vik_coord_diff(&(tp->coord), &(tpwin->cur_tp->coord)) / ABS(tp->timestamp - tpwin->cur_tp->timestamp) ); + break; + case VIK_UNITS_SPEED_KNOTS: + g_snprintf ( tmp_str, sizeof(tmp_str), "%.2f knots", VIK_MPS_TO_KNOTS(vik_coord_diff(&(tp->coord), &(tpwin->cur_tp->coord)) / (ABS(tp->timestamp - tpwin->cur_tp->timestamp))) ); + break; + case VIK_UNITS_SPEED_SECONDS_PER_KM: + g_snprintf ( tmp_str, sizeof(tmp_str), "%.2f s/km", VIK_MPS_TO_PACE_SPK(vik_coord_diff(&(tp->coord), &(tpwin->cur_tp->coord)) / (ABS(tp->timestamp - tpwin->cur_tp->timestamp))) ); + break; + case VIK_UNITS_SPEED_MINUTES_PER_KM: + g_snprintf ( tmp_str, sizeof(tmp_str), "%.2f min/km", VIK_MPS_TO_PACE_MPK(vik_coord_diff(&(tp->coord), &(tpwin->cur_tp->coord)) / (ABS(tp->timestamp - tpwin->cur_tp->timestamp))) ); + break; + case VIK_UNITS_SPEED_SECONDS_PER_MILE: + g_snprintf ( tmp_str, sizeof(tmp_str), "%.2f sec/mi", VIK_MPS_TO_PACE_SPM(vik_coord_diff(&(tp->coord), &(tpwin->cur_tp->coord)) / (ABS(tp->timestamp - tpwin->cur_tp->timestamp))) ); + break; + case VIK_UNITS_SPEED_MINUTES_PER_MILE: + g_snprintf ( tmp_str, sizeof(tmp_str), "%.2f min/mi", VIK_MPS_TO_PACE_MPM(vik_coord_diff(&(tp->coord), &(tpwin->cur_tp->coord)) / (ABS(tp->timestamp - tpwin->cur_tp->timestamp))) ); + break; + default: + g_snprintf ( tmp_str, sizeof(tmp_str), "--" ); + g_critical("Houston, we've had a problem. speed=%d", speed_units); + } + gtk_label_set_text ( tpwin->diff_speed, tmp_str ); + } + } + else + { + gtk_label_set_text ( tpwin->diff_time, NULL ); + gtk_label_set_text ( tpwin->diff_speed, NULL ); + } + } + + if ( isnan(tp->course) ) + g_snprintf ( tmp_str, sizeof(tmp_str), "--" ); + else + g_snprintf ( tmp_str, sizeof(tmp_str), "%05.1f\302\260", tp->course ); + gtk_label_set_text ( tpwin->course, tmp_str ); + + if ( isnan(tp->speed) ) + g_snprintf ( tmp_str, sizeof(tmp_str), "--" ); + else { + switch (speed_units) { + case VIK_UNITS_SPEED_MILES_PER_HOUR: + g_snprintf ( tmp_str, sizeof(tmp_str), "%.2f mph", VIK_MPS_TO_MPH(tp->speed) ); + break; + case VIK_UNITS_SPEED_METRES_PER_SECOND: + g_snprintf ( tmp_str, sizeof(tmp_str), "%.2f m/s", tp->speed ); + break; + case VIK_UNITS_SPEED_KNOTS: + g_snprintf ( tmp_str, sizeof(tmp_str), "%.2f knots", VIK_MPS_TO_KNOTS(tp->speed) ); + break; + case VIK_UNITS_SPEED_SECONDS_PER_KM: + g_snprintf ( tmp_str, sizeof(tmp_str), "%.2f s/km", VIK_MPS_TO_PACE_SPK(tp->speed) ); + break; + case VIK_UNITS_SPEED_MINUTES_PER_KM: + g_snprintf ( tmp_str, sizeof(tmp_str), "%.2f min/km", VIK_MPS_TO_PACE_MPK(tp->speed) ); + break; + case VIK_UNITS_SPEED_SECONDS_PER_MILE: + g_snprintf ( tmp_str, sizeof(tmp_str), "%.2f s/mi", VIK_MPS_TO_PACE_SPM(tp->speed) ); + break; + case VIK_UNITS_SPEED_MINUTES_PER_MILE: + g_snprintf ( tmp_str, sizeof(tmp_str), "%.2f min/mi", VIK_MPS_TO_PACE_MPM(tp->speed) ); + break; + default: + // VIK_UNITS_SPEED_KILOMETRES_PER_HOUR: + g_snprintf ( tmp_str, sizeof(tmp_str), "%.2f km/h", VIK_MPS_TO_KPH(tp->speed) ); + break; + } + } + gtk_label_set_text ( tpwin->speed, tmp_str ); + + switch (dist_units) { + case VIK_UNITS_DISTANCE_KILOMETRES: + g_snprintf ( tmp_str, sizeof(tmp_str), "%.5f m", tp->hdop ); + gtk_label_set_text ( tpwin->hdop, tmp_str ); + g_snprintf ( tmp_str, sizeof(tmp_str), "%.5f m", tp->pdop ); + gtk_label_set_text ( tpwin->pdop, tmp_str ); + break; + case VIK_UNITS_DISTANCE_NAUTICAL_MILES: + case VIK_UNITS_DISTANCE_MILES: + g_snprintf ( tmp_str, sizeof(tmp_str), "%.5f yards", tp->hdop*1.0936133 ); + gtk_label_set_text ( tpwin->hdop, tmp_str ); + g_snprintf ( tmp_str, sizeof(tmp_str), "%.5f yards", tp->pdop*1.0936133 ); + gtk_label_set_text ( tpwin->pdop, tmp_str ); + break; + default: + g_critical("Houston, we've had a problem. distance=%d", dist_units); + } + + switch (height_units) { + case VIK_UNITS_HEIGHT_METRES: + g_snprintf ( tmp_str, sizeof(tmp_str), "%.5f m", tp->vdop ); + break; + case VIK_UNITS_HEIGHT_FEET: + g_snprintf ( tmp_str, sizeof(tmp_str), "%.5f feet", VIK_METERS_TO_FEET(tp->vdop) ); + break; + default: + g_snprintf ( tmp_str, sizeof(tmp_str), "--" ); + g_critical("Houston, we've had a problem. height=%d", height_units); + } + gtk_label_set_text ( tpwin->vdop, tmp_str ); + + g_snprintf ( tmp_str, sizeof(tmp_str), "%d / %d", tp->nsats, tp->fix_mode ); + gtk_label_set_text ( tpwin->sat, tmp_str ); + + tpwin->cur_tp = tp; +} + +void vik_trw_layer_tpwin_set_track_name ( VikTrwLayerTpwin *tpwin, const gchar *track_name ) +{ + gchar *tmp_name = g_strdup_printf ( "%s: %s", track_name, _("Trackpoint") ); + gtk_window_set_title ( GTK_WINDOW(tpwin), tmp_name ); + g_free ( tmp_name ); + //gtk_label_set_text ( tpwin->track_name, track_name ); +} diff --git a/src/viktrwlayer_tpwin.h b/src/viktrwlayer_tpwin.h new file mode 100644 index 0000000..d3b4290 --- /dev/null +++ b/src/viktrwlayer_tpwin.h @@ -0,0 +1,66 @@ +/* + * viking -- GPS Data and Topo Analyzer, Explorer, and Manager + * + * Copyright (C) 2003-2005, Evan Battaglia + * + * 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., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA + * + */ + +#ifndef _VIKING_TRWLAYER_TPWIN_H +#define _VIKING_TRWLAYER_TPWIN_H + +#include +#include +#include + +G_BEGIN_DECLS + +/* response codes */ +#define VIK_TRW_LAYER_TPWIN_CLOSE 6 +#define VIK_TRW_LAYER_TPWIN_INSERT 5 +#define VIK_TRW_LAYER_TPWIN_DELETE 4 +#define VIK_TRW_LAYER_TPWIN_SPLIT 3 +#define VIK_TRW_LAYER_TPWIN_BACK 1 +#define VIK_TRW_LAYER_TPWIN_FORWARD 0 + +#define VIK_TRW_LAYER_TPWIN_DATA_CHANGED 100 + +#define VIK_TRW_LAYER_TPWIN_TYPE (vik_trw_layer_tpwin_get_type ()) +#define VIK_TRW_LAYER_TPWIN(obj) (G_TYPE_CHECK_INSTANCE_CAST ((obj), VIK_TRW_LAYER_TPWIN_TYPE, VikTrwLayerTpwin)) +#define VIK_TRW_LAYER_TPWIN_CLASS(klass) (G_TYPE_CHECK_CLASS_CAST ((klass), VIK_TRW_LAYER_TPWIN_TYPE, VikTrwLayerTpwinClass)) +#define IS_VIK_TRW_LAYER_TPWIN(obj) (G_TYPE_CHECK_INSTANCE_TYPE ((obj), VIK_TRW_LAYER_TPWIN_TYPE)) +#define IS_VIK_TRW_LAYER_TPWIN_CLASS(klass) (G_TYPE_CHECK_CLASS_TYPE ((klass), VIK_TRW_LAYER_TPWIN_TYPE)) + +typedef struct _VikTrwLayerTpwin VikTrwLayerTpwin; +typedef struct _VikTrwLayerTpwinClass VikTrwLayerTpwinClass; + +struct _VikTrwLayerTpwinClass +{ + GtkDialogClass vik_trw_layer_class; +}; + +GType vik_trw_layer_tpwin_get_type (); + +VikTrwLayerTpwin *vik_trw_layer_tpwin_new ( GtkWindow *parent ); +void vik_trw_layer_tpwin_set_empty ( VikTrwLayerTpwin *tpwin ); +void vik_trw_layer_tpwin_disable_join ( VikTrwLayerTpwin *tpwin ); +void vik_trw_layer_tpwin_set_tp ( VikTrwLayerTpwin *tpwin, GList *tpl, const gchar *track_name, gboolean is_route ); +void vik_trw_layer_tpwin_set_track_name ( VikTrwLayerTpwin *tpwin, const gchar *track_name ); +void vik_trw_layer_tpwin_destroy ( VikTrwLayerTpwin *tpwin ); + +G_END_DECLS + +#endif diff --git a/src/viktrwlayer_tracklist.c b/src/viktrwlayer_tracklist.c new file mode 100644 index 0000000..3ef7a03 --- /dev/null +++ b/src/viktrwlayer_tracklist.c @@ -0,0 +1,756 @@ +/* -*- Mode: C; indent-tabs-mode: t; c-basic-offset: 4; tab-width: 4 -*- */ +/* + * viking -- GPS Data and Topo Analyzer, Explorer, and Manager + * + * Copyright (C) 2013, Rob Norris + * + * 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., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA + * + */ +#include +#include +#include +#include +#include +#include +#include + +#include "viking.h" +#include "viktrwlayer_tracklist.h" +#include "viktrwlayer_propwin.h" + +// Long formatted date+basic time - listing this way ensures the string comparison sort works - so no local type format %x or %c here! +#define TRACK_LIST_DATE_FORMAT "%Y-%m-%d %H:%M" + +/** + * track_close_cb: + * + */ +static void track_close_cb ( GtkWidget *dialog, gint resp, GList *data ) +{ + g_list_foreach ( data, (GFunc) g_free, NULL ); + g_list_free ( data ); + + gtk_widget_destroy (dialog); +} + +/** + * format_1f_cell_data_func: + * + * General purpose column double formatting + * + */ +static void format_1f_cell_data_func ( GtkTreeViewColumn *col, + GtkCellRenderer *renderer, + GtkTreeModel *model, + GtkTreeIter *iter, + gpointer user_data ) +{ + gdouble value; + gchar buf[20]; + gint column = GPOINTER_TO_INT (user_data); + gtk_tree_model_get ( model, iter, column, &value, -1 ); + g_snprintf ( buf, sizeof(buf), "%.1f", value ); + g_object_set ( renderer, "text", buf, NULL ); +} + +#define TRK_LIST_COLS 11 +#define TRK_COL_NUM TRK_LIST_COLS-1 +#define TRW_COL_NUM TRK_COL_NUM-1 + +/* + * trw_layer_track_tooltip_cb: + * + * Show a tooltip when the mouse is over a track list entry. + * The tooltip contains the comment or description. + */ +static gboolean trw_layer_track_tooltip_cb ( GtkWidget *widget, + gint x, + gint y, + gboolean keyboard_tip, + GtkTooltip *tooltip, + gpointer data ) +{ + GtkTreeIter iter; + GtkTreePath *path = NULL; + GtkTreeView *tree_view = GTK_TREE_VIEW (widget); + GtkTreeModel *model = gtk_tree_view_get_model (tree_view); + + if ( !gtk_tree_view_get_tooltip_context ( tree_view, &x, &y, + keyboard_tip, + &model, &path, &iter ) ) + return FALSE; + + VikTrack *trk; + gtk_tree_model_get ( model, &iter, TRK_COL_NUM, &trk, -1 ); + if ( !trk ) return FALSE; + + gboolean tooltip_set = TRUE; + if ( trk->comment ) + gtk_tooltip_set_text ( tooltip, trk->comment ); + else if ( trk->description ) + gtk_tooltip_set_text ( tooltip, trk->description ); + else + tooltip_set = FALSE; + + if ( tooltip_set ) + gtk_tree_view_set_tooltip_row ( tree_view, tooltip, path ); + + gtk_tree_path_free ( path ); + + return tooltip_set; +} + +/* +static void trw_layer_track_select_cb ( GtkTreeSelection *selection, gpointer data ) +{ + GtkTreeIter iter; + if ( !gtk_tree_selection_get_selected (selection, NULL, &iter) ) + return; + + GtkTreeView *tree_view = GTK_TREE_VIEW ( data ); + GtkTreeModel *model = gtk_tree_view_get_model (tree_view); + + VikTrack *trk; + gtk_tree_model_get ( model, &iter, TRK_COL_NUM, &trk, -1 ); + if ( !trk ) return; + + VikTrwLayer *vtl; + gtk_tree_model_get ( model, &iter, TRW_COL_NUM, &vtl, -1 ); + if ( !IS_VIK_TRW_LAYER(vtl) ) return; + + //vik_treeview_select_iter ( VIK_LAYER(vtl)->vt, g_hash_table_lookup ( vtl->track_iters, uuid ), TRUE ); +} +*/ + +// A slightly better way of defining the menu callback information +// This should be much easier to extend/rework compared to the current trw_layer menus +typedef enum { + MA_VTL = 0, + MA_TRK, + MA_TRK_UUID, + MA_VVP, + MA_TREEVIEW, + MA_TRKS_LIST, + MA_LAST +} menu_array_index; + +typedef gpointer menu_array_values[MA_LAST]; + +// Instead of hooking automatically on treeview item selection +// This is performed on demand via the specific menu request +static void trw_layer_track_select ( menu_array_values values ) +{ + VikTrwLayer *vtl = VIK_TRW_LAYER(values[MA_VTL]); + VikTrack *trk = VIK_TRACK(values[MA_TRK]); + + if ( values[MA_TRK_UUID] ) { + GtkTreeIter *iter = NULL; + if ( trk->is_route ) + iter = g_hash_table_lookup ( vik_trw_layer_get_routes_iters(vtl), values[MA_TRK_UUID] ); + else + iter = g_hash_table_lookup ( vik_trw_layer_get_tracks_iters(vtl), values[MA_TRK_UUID] ); + + if ( iter ) + vik_treeview_select_iter ( VIK_LAYER(vtl)->vt, iter, TRUE ); + } +} + +static void trw_layer_track_stats ( menu_array_values values ) +{ + VikTrwLayer *vtl = VIK_TRW_LAYER(values[MA_VTL]); + VikTrack *trk = VIK_TRACK(values[MA_TRK]); + VikViewport *vvp = VIK_VIEWPORT(values[MA_VVP]); + + if ( trk && trk->name ) { + // Kill off this dialog to allow interaction with properties window + // since the properties also allows track manipulations it won't cause conflicts here. + GtkWidget *gw = gtk_widget_get_toplevel ( values[MA_TREEVIEW] ); + track_close_cb ( gw, 0, values[MA_TRKS_LIST] ); + + vik_trw_layer_propwin_run ( VIK_GTK_WINDOW_FROM_LAYER(vtl), + vtl, + trk, + NULL, // vlp + vvp, + TRUE ); + } +} + +static void trw_layer_track_view ( menu_array_values values ) +{ + VikTrwLayer *vtl = VIK_TRW_LAYER(values[MA_VTL]); + VikTrack *trk = VIK_TRACK(values[MA_TRK]); + VikViewport *vvp = VIK_VIEWPORT(values[MA_VVP]); + + // TODO create common function to convert between LatLon[2] and LatLonBBox or even change LatLonBBox to be 2 LatLons! + struct LatLon maxmin[2]; + maxmin[0].lat = trk->bbox.north; + maxmin[1].lat = trk->bbox.south; + maxmin[0].lon = trk->bbox.east; + maxmin[1].lon = trk->bbox.west; + + trw_layer_zoom_to_show_latlons ( vtl, vvp, maxmin ); + + trw_layer_track_select (values); +} + +typedef struct { + gboolean has_layer_names; + GString *str; +} copy_data_t; + +static void copy_selection (GtkTreeModel *model, + GtkTreePath *path, + GtkTreeIter *iter, + gpointer data) +{ + copy_data_t *cd = (copy_data_t*) data; + + gchar* layername; gtk_tree_model_get ( model, iter, 0, &layername, -1 ); + gchar* name; gtk_tree_model_get ( model, iter, 1, &name, -1 ); + gchar* date; gtk_tree_model_get ( model, iter, 2, &date, -1 ); + gdouble d1; gtk_tree_model_get ( model, iter, 4, &d1, -1 ); + guint d2; gtk_tree_model_get ( model, iter, 5, &d2, -1 ); + gdouble d3; gtk_tree_model_get ( model, iter, 6, &d3, -1 ); + gdouble d4; gtk_tree_model_get ( model, iter, 7, &d4, -1 ); + gint d5; gtk_tree_model_get ( model, iter, 8, &d5, -1 ); + gchar sep = '\t'; // Could make this configurable - but simply always make it a tab character for now + // NB Even if the columns have been reordered - this copies it out only in the original default order + // if col 0 is displayed then also copy the layername + if ( cd->has_layer_names ) + g_string_append_printf ( cd->str, "%s%c%s%c%s%c%.1f%c%d%c%.1f%c%.1f%c%d\n", layername, sep, name, sep, date, sep, d1, sep, d2, sep, d3, sep, d4, sep, d5 ); + else + g_string_append_printf ( cd->str, "%s%c%s%c%.1f%c%d%c%.1f%c%.1f%c%d\n", name, sep, date, sep, d1, sep, d2, sep, d3, sep, d4, sep, d5 ); + g_free ( layername ); + g_free ( name ); + g_free ( date ); +} + +static void trw_layer_copy_selected ( GtkWidget *tree_view ) +{ + GtkTreeSelection *selection = gtk_tree_view_get_selection ( GTK_TREE_VIEW(tree_view) ); + // NB GTK3 has gtk_tree_view_get_n_columns() but we're GTK2 ATM + GList *gl = gtk_tree_view_get_columns ( GTK_TREE_VIEW(tree_view) ); + guint count = g_list_length ( gl ); + g_list_free ( gl ); + copy_data_t cd; + cd.has_layer_names = (count > TRK_LIST_COLS-3); + // Or use gtk_tree_view_column_get_visible()? + cd.str = g_string_new ( NULL ); + gtk_tree_selection_selected_foreach ( selection, copy_selection, &cd ); + + a_clipboard_copy ( VIK_CLIPBOARD_DATA_TEXT, 0, 0, 0, cd.str->str, NULL ); + + g_string_free ( cd.str, TRUE ); +} + +static void add_copy_menu_item ( GtkMenu *menu, GtkWidget *tree_view ) +{ + GtkWidget *item = gtk_image_menu_item_new_with_mnemonic ( _("_Copy Data") ); + gtk_image_menu_item_set_image ( (GtkImageMenuItem*)item, gtk_image_new_from_stock (GTK_STOCK_COPY, GTK_ICON_SIZE_MENU) ); + g_signal_connect_swapped ( G_OBJECT(item), "activate", G_CALLBACK(trw_layer_copy_selected), tree_view ); + gtk_menu_shell_append (GTK_MENU_SHELL (menu), item); + gtk_widget_show ( item ); +} + +static gboolean add_menu_items ( GtkMenu *menu, VikTrwLayer *vtl, VikTrack *trk, gpointer trk_uuid, VikViewport *vvp, GtkWidget *tree_view, gpointer data ) +{ + static menu_array_values values; + GtkWidget *item; + + values[MA_VTL] = vtl; + values[MA_TRK] = trk; + values[MA_TRK_UUID] = trk_uuid; + values[MA_VVP] = vvp; + values[MA_TREEVIEW] = tree_view; + values[MA_TRKS_LIST] = data; + + /* + item = gtk_image_menu_item_new_with_mnemonic ( _("_Select") ); + gtk_image_menu_item_set_image ( (GtkImageMenuItem*)item, gtk_image_new_from_stock (GTK_STOCK_FIND, GTK_ICON_SIZE_MENU) ); + g_signal_connect_swapped ( G_OBJECT(item), "activate", G_CALLBACK(trw_layer_track_select), values ); + gtk_menu_shell_append (GTK_MENU_SHELL (menu), item); + gtk_widget_show ( item ); + */ + + // ATM view auto selects, so don't bother with separate select menu entry + item = gtk_image_menu_item_new_with_mnemonic ( _("_View") ); + gtk_image_menu_item_set_image ( (GtkImageMenuItem*)item, gtk_image_new_from_stock (GTK_STOCK_ZOOM_FIT, GTK_ICON_SIZE_MENU) ); + g_signal_connect_swapped ( G_OBJECT(item), "activate", G_CALLBACK(trw_layer_track_view), values ); + gtk_menu_shell_append (GTK_MENU_SHELL (menu), item); + gtk_widget_show ( item ); + + item = gtk_menu_item_new_with_mnemonic ( _("_Statistics") ); + g_signal_connect_swapped ( G_OBJECT(item), "activate", G_CALLBACK(trw_layer_track_stats), values ); + gtk_menu_shell_append ( GTK_MENU_SHELL(menu), item ); + gtk_widget_show ( item ); + + add_copy_menu_item ( menu, tree_view ); + + return TRUE; +} + +static gboolean trw_layer_track_menu_popup_multi ( GtkWidget *tree_view, + GdkEventButton *event, + gpointer data ) +{ + GtkWidget *menu = gtk_menu_new(); + + add_copy_menu_item ( GTK_MENU(menu), tree_view ); + + gtk_menu_popup ( GTK_MENU(menu), NULL, NULL, NULL, NULL, event->button, gtk_get_current_event_time() ); + + return TRUE; +} + +static gboolean trw_layer_track_menu_popup ( GtkWidget *tree_view, + GdkEventButton *event, + gpointer data ) +{ + static GtkTreeIter iter; + + // Use selected item to get a single iterator ref + // This relies on an row being selected as part of the right click + GtkTreeSelection *selection = gtk_tree_view_get_selection ( GTK_TREE_VIEW(tree_view) ); + if ( gtk_tree_selection_count_selected_rows (selection) != 1 ) + return trw_layer_track_menu_popup_multi ( tree_view, event, data ); + + GtkTreePath *path; + GtkTreeModel *model = gtk_tree_view_get_model ( GTK_TREE_VIEW(tree_view) ); + + // All this just to get the iter + if ( gtk_tree_view_get_path_at_pos ( GTK_TREE_VIEW(tree_view), + (gint) event->x, + (gint) event->y, + &path, NULL, NULL, NULL)) { + gtk_tree_model_get_iter_from_string ( model, &iter, gtk_tree_path_to_string (path) ); + gtk_tree_path_free ( path ); + } + else + return FALSE; + + VikTrack *trk; + gtk_tree_model_get ( model, &iter, TRK_COL_NUM, &trk, -1 ); + if ( !trk ) return FALSE; + + VikTrwLayer *vtl; + gtk_tree_model_get ( model, &iter, TRW_COL_NUM, &vtl, -1 ); + if ( !IS_VIK_TRW_LAYER(vtl) ) return FALSE; + + trku_udata udataU; + udataU.trk = trk; + udataU.uuid = NULL; + + gpointer trkf; + if ( trk->is_route ) + trkf = g_hash_table_find ( vik_trw_layer_get_routes(vtl), (GHRFunc) trw_layer_track_find_uuid, &udataU ); + else + trkf = g_hash_table_find ( vik_trw_layer_get_tracks(vtl), (GHRFunc) trw_layer_track_find_uuid, &udataU ); + + if ( trkf && udataU.uuid ) { + VikViewport *vvp = vik_window_viewport((VikWindow *)(VIK_GTK_WINDOW_FROM_LAYER(vtl))); + + GtkWidget *menu = gtk_menu_new(); + + // Originally started to reuse the trw_layer menu items + // however these offer too many ways to edit the track data + // so without an easy way to distinguish read only operations, + // create a very minimal new set of operations + add_menu_items ( GTK_MENU(menu), + vtl, + trk, + udataU.uuid, + vvp, + tree_view, + data ); + + gtk_menu_popup ( GTK_MENU(menu), NULL, NULL, NULL, NULL, event->button, gtk_get_current_event_time() ); + return TRUE; + } + return FALSE; +} + +static gboolean trw_layer_track_button_pressed ( GtkWidget *tree_view, + GdkEventButton *event, + gpointer data ) +{ + // Only on right clicks... + if ( ! (event->type == GDK_BUTTON_PRESS && event->button == 3) ) + return FALSE; + + // ATM Force a selection... + GtkTreeSelection *selection = gtk_tree_view_get_selection ( GTK_TREE_VIEW(tree_view) ); + if ( gtk_tree_selection_count_selected_rows (selection) <= 1 ) { + GtkTreePath *path; + /* Get tree path for row that was clicked */ + if ( gtk_tree_view_get_path_at_pos ( GTK_TREE_VIEW(tree_view), + (gint) event->x, + (gint) event->y, + &path, NULL, NULL, NULL)) { + gtk_tree_selection_unselect_all ( selection ); + gtk_tree_selection_select_path ( selection, path ); + gtk_tree_path_free ( path ); + } + } + return trw_layer_track_menu_popup ( tree_view, event, data ); +} + +/* + * Foreach entry we copy the various individual track properties into the tree store + * formatting & converting the internal values into something for display + */ +static void trw_layer_track_list_add ( vik_trw_track_list_t *vtdl, + GtkTreeStore *store, + vik_units_distance_t dist_units, + vik_units_speed_t speed_units, + vik_units_height_t height_units, + const gchar* date_format ) +{ + GtkTreeIter t_iter; + VikTrack *trk = vtdl->trk; + VikTrwLayer *vtl = vtdl->vtl; + + gdouble trk_dist = vik_track_get_length ( trk ); + // Store unit converted value + switch ( dist_units ) { + case VIK_UNITS_DISTANCE_MILES: + trk_dist = VIK_METERS_TO_MILES(trk_dist); + break; + case VIK_UNITS_DISTANCE_NAUTICAL_MILES: + trk_dist = VIK_METERS_TO_NAUTICAL_MILES(trk_dist); + break; + default: + trk_dist = trk_dist/1000.0; + break; + } + + // Get start date + gchar time_buf[32]; + time_buf[0] = '\0'; + if ( trk->trackpoints && VIK_TRACKPOINT(trk->trackpoints->data)->has_timestamp ) { + +#if GLIB_CHECK_VERSION(2,26,0) + GDateTime* gdt = g_date_time_new_from_unix_utc ( VIK_TRACKPOINT(trk->trackpoints->data)->timestamp ); + gchar *time = g_date_time_format ( gdt, date_format ); + g_strlcpy ( time_buf, time, sizeof(time_buf) ); + g_free ( time ); + g_date_time_unref ( gdt); +#else + GDate* gdate_start = g_date_new (); + g_date_set_time_t ( gdate_start, VIK_TRACKPOINT(trk->trackpoints->data)->timestamp ); + g_date_strftime ( time_buf, sizeof(time_buf), date_format, gdate_start ); + g_date_free ( gdate_start ); +#endif + } + + // NB: doesn't include aggegrate visibility + gboolean visible = VIK_LAYER(vtl)->visible && trk->visible; + visible = visible && (trk->is_route ? vik_trw_layer_get_routes_visibility(vtl) : vik_trw_layer_get_tracks_visibility(vtl)); + + guint trk_len_time = 0; // In minutes + if ( trk->trackpoints ) { + time_t t1, t2; + t1 = VIK_TRACKPOINT(g_list_first(trk->trackpoints)->data)->timestamp; + t2 = VIK_TRACKPOINT(g_list_last(trk->trackpoints)->data)->timestamp; + trk_len_time = (int)round(labs(t2-t1)/60.0); + } + + gdouble av_speed = 0.0; + gdouble max_speed = 0.0; + gdouble max_alt = 0.0; + + av_speed = vik_track_get_average_speed ( trk ); + switch (speed_units) { + case VIK_UNITS_SPEED_KILOMETRES_PER_HOUR: av_speed = VIK_MPS_TO_KPH(av_speed); break; + case VIK_UNITS_SPEED_MILES_PER_HOUR: av_speed = VIK_MPS_TO_MPH(av_speed); break; + case VIK_UNITS_SPEED_KNOTS: av_speed = VIK_MPS_TO_KNOTS(av_speed); break; + case VIK_UNITS_SPEED_SECONDS_PER_KM: av_speed = VIK_MPS_TO_PACE_SPK(av_speed); break; + case VIK_UNITS_SPEED_MINUTES_PER_KM: av_speed = VIK_MPS_TO_PACE_MPK(av_speed); break; + case VIK_UNITS_SPEED_SECONDS_PER_MILE: av_speed = VIK_MPS_TO_PACE_SPM(av_speed); break; + case VIK_UNITS_SPEED_MINUTES_PER_MILE: av_speed = VIK_MPS_TO_PACE_MPM(av_speed); break; + + default: // VIK_UNITS_SPEED_METRES_PER_SECOND therefore no change + break; + } + + max_speed = vik_track_get_max_speed ( trk ); + switch (speed_units) { + case VIK_UNITS_SPEED_KILOMETRES_PER_HOUR: max_speed = VIK_MPS_TO_KPH(max_speed); break; + case VIK_UNITS_SPEED_MILES_PER_HOUR: max_speed = VIK_MPS_TO_MPH(max_speed); break; + case VIK_UNITS_SPEED_KNOTS: max_speed = VIK_MPS_TO_KNOTS(max_speed); break; + case VIK_UNITS_SPEED_SECONDS_PER_KM: max_speed = VIK_MPS_TO_PACE_SPK(max_speed); break; + case VIK_UNITS_SPEED_MINUTES_PER_KM: max_speed = VIK_MPS_TO_PACE_MPK(max_speed); break; + case VIK_UNITS_SPEED_SECONDS_PER_MILE: max_speed = VIK_MPS_TO_PACE_SPM(max_speed); break; + case VIK_UNITS_SPEED_MINUTES_PER_MILE: max_speed = VIK_MPS_TO_PACE_MPM(max_speed); break; + default: // VIK_UNITS_SPEED_METRES_PER_SECOND therefore no change + break; + } + + // TODO - make this a function to get min / max values? + gdouble *altitudes = NULL; + altitudes = vik_track_make_elevation_map ( trk, 500 ); + if ( altitudes ) { + max_alt = -1000; + guint i; + for ( i=0; i < 500; i++ ) { + if ( altitudes[i] != VIK_DEFAULT_ALTITUDE ) { + if ( altitudes[i] > max_alt ) + max_alt = altitudes[i]; + } + } + } + g_free ( altitudes ); + + switch (height_units) { + case VIK_UNITS_HEIGHT_FEET: max_alt = VIK_METERS_TO_FEET(max_alt); break; + default: + // VIK_UNITS_HEIGHT_METRES: no need to convert + break; + } + + gtk_tree_store_append ( store, &t_iter, NULL ); + gtk_tree_store_set ( store, &t_iter, + 0, VIK_LAYER(vtl)->name, + 1, trk->name, + 2, time_buf, + 3, visible, + 4, trk_dist, + 5, trk_len_time, + 6, av_speed, + 7, max_speed, + 8, (gint)round(max_alt), + TRW_COL_NUM, vtl, + TRK_COL_NUM, trk, + -1 ); +} + +static GtkTreeViewColumn *my_new_column_text ( const gchar *title, GtkCellRenderer *renderer, GtkWidget *view, gint column_runner ) +{ + GtkTreeViewColumn *column = gtk_tree_view_column_new_with_attributes ( title, renderer, "text", column_runner, NULL ); + gtk_tree_view_column_set_sort_column_id ( column, column_runner ); + gtk_tree_view_append_column ( GTK_TREE_VIEW(view), column ); + gtk_tree_view_column_set_reorderable ( column, TRUE ); + gtk_tree_view_column_set_resizable ( column, TRUE ); + return column; +} + +/** + * vik_trw_layer_track_list_internal: + * @dialog: The dialog to create the widgets in + * @tracks_and_layers: The list of tracks (and it's layer) to be shown + * @show_layer_names: Show the layer names that each track belongs to + * + * Create a table of tracks with corresponding track information + * This table does not support being actively updated + */ +static void vik_trw_layer_track_list_internal ( GtkWidget *dialog, + GList *tracks_and_layers, + gboolean show_layer_names ) +{ + if ( !tracks_and_layers ) + return; + + // It's simple storing the gdouble values in the tree store as the sort works automatically + // Then apply specific cell data formatting (rather default double is to 6 decimal places!) + GtkTreeStore *store = gtk_tree_store_new ( TRK_LIST_COLS, + G_TYPE_STRING, // 0: Layer Name + G_TYPE_STRING, // 1: Track Name + G_TYPE_STRING, // 2: Date + G_TYPE_BOOLEAN, // 3: Visible + G_TYPE_DOUBLE, // 4: Distance + G_TYPE_UINT, // 5: Length in time + G_TYPE_DOUBLE, // 6: Av. Speed + G_TYPE_DOUBLE, // 7: Max Speed + G_TYPE_INT, // 8: Max Height + G_TYPE_POINTER, // 9: TrackWaypoint Layer pointer + G_TYPE_POINTER ); // 10: Track pointer + + //gtk_tree_selection_set_select_function ( gtk_tree_view_get_selection (GTK_TREE_VIEW(vt)), vik_treeview_selection_filter, vt, NULL ); + + vik_units_distance_t dist_units = a_vik_get_units_distance (); + vik_units_speed_t speed_units = a_vik_get_units_speed (); + vik_units_height_t height_units = a_vik_get_units_height (); + + //GList *gl = get_tracks_and_layers_cb ( vl, user_data ); + //g_list_foreach ( tracks_and_layers, (GFunc) trw_layer_track_list_add, store ); + gchar *date_format = NULL; + if ( !a_settings_get_string ( VIK_SETTINGS_LIST_DATE_FORMAT, &date_format ) ) + date_format = g_strdup ( TRACK_LIST_DATE_FORMAT ); + + GList *gl = tracks_and_layers; + while ( gl ) { + trw_layer_track_list_add ( (vik_trw_track_list_t*)gl->data, store, dist_units, speed_units, height_units, date_format ); + gl = g_list_next ( gl ); + } + g_free ( date_format ); + + GtkWidget *view = gtk_tree_view_new(); + GtkCellRenderer *renderer = gtk_cell_renderer_text_new(); + g_object_set (G_OBJECT (renderer), + "xalign", 0.0, + "ellipsize", PANGO_ELLIPSIZE_END, + NULL); + + GtkTreeViewColumn *column; + GtkTreeViewColumn *sort_by_column; + + gint column_runner = 0; + if ( show_layer_names ) { + // Insert column for the layer name when viewing multi layers + column = my_new_column_text ( _("Layer"), renderer, view, column_runner++ ); + gtk_tree_view_column_set_expand ( column, TRUE ); + // remember the layer column so we can sort by it later + sort_by_column = column; + } + else + column_runner++; + + column = my_new_column_text ( _("Name"), renderer, view, column_runner++ ); + gtk_tree_view_column_set_expand ( column, TRUE ); + if ( !show_layer_names ) + // remember the name column so we can sort by it later + sort_by_column = column; + + column = my_new_column_text ( _("Date"), renderer, view, column_runner++ ); + gtk_tree_view_column_set_expand ( column, TRUE ); + + GtkCellRenderer *renderer_toggle = gtk_cell_renderer_toggle_new (); + column = gtk_tree_view_column_new_with_attributes ( _("Visible"), renderer_toggle, "active", column_runner, NULL ); + gtk_tree_view_column_set_reorderable ( column, TRUE ); + gtk_tree_view_column_set_sort_column_id ( column, column_runner ); + gtk_tree_view_append_column ( GTK_TREE_VIEW(view), column ); + column_runner++; + + switch ( dist_units ) { + case VIK_UNITS_DISTANCE_MILES: + column = my_new_column_text ( _("Distance\n(miles)"), renderer, view, column_runner++ ); + break; + case VIK_UNITS_DISTANCE_NAUTICAL_MILES: + column = my_new_column_text ( _("Distance\n(NM)"), renderer, view, column_runner++ ); + break; + default: + column = my_new_column_text ( _("Distance\n(km)"), renderer, view, column_runner++ ); + break; + } + // Apply own formatting of the data + gtk_tree_view_column_set_cell_data_func ( column, renderer, format_1f_cell_data_func, GINT_TO_POINTER(column_runner-1), NULL); + + (void)my_new_column_text ( _("Length\n(minutes)"), renderer, view, column_runner++ ); + + gchar *spd_units = NULL; + switch (speed_units) { + case VIK_UNITS_SPEED_KILOMETRES_PER_HOUR: spd_units = g_strdup (_("km/h")); break; + case VIK_UNITS_SPEED_MILES_PER_HOUR: spd_units = g_strdup (_("mph")); break; + case VIK_UNITS_SPEED_KNOTS: spd_units = g_strdup (_("knots")); break; + case VIK_UNITS_SPEED_SECONDS_PER_KM: spd_units = g_strdup (_("s/km")); break; + case VIK_UNITS_SPEED_MINUTES_PER_KM: spd_units = g_strdup (_("min/km")); break; + case VIK_UNITS_SPEED_SECONDS_PER_MILE: spd_units = g_strdup (_("sec/mi")); break; + case VIK_UNITS_SPEED_MINUTES_PER_MILE: spd_units = g_strdup (_("min/mi")); break; + // VIK_UNITS_SPEED_METRES_PER_SECOND: + default: spd_units = g_strdup (_("m/s")); break; + } + + gchar *title = g_strdup_printf ( _("Av. Speed\n(%s)"), spd_units ); + column = my_new_column_text ( title, renderer, view, column_runner++ ); + g_free ( title ); + gtk_tree_view_column_set_cell_data_func ( column, renderer, format_1f_cell_data_func, GINT_TO_POINTER(column_runner-1), NULL); // Apply own formatting of the data + + title = g_strdup_printf ( _("Max Speed\n(%s)"), spd_units ); + column = my_new_column_text ( title, renderer, view, column_runner++ ); + gtk_tree_view_column_set_cell_data_func ( column, renderer, format_1f_cell_data_func, GINT_TO_POINTER(column_runner-1), NULL); // Apply own formatting of the data + + g_free ( title ); + g_free ( spd_units ); + + if ( height_units == VIK_UNITS_HEIGHT_FEET ) + (void)my_new_column_text ( _("Max Height\n(Feet)"), renderer, view, column_runner++ ); + else + (void)my_new_column_text ( _("Max Height\n(Metres)"), renderer, view, column_runner++ ); + + gtk_tree_view_set_model ( GTK_TREE_VIEW(view), GTK_TREE_MODEL(store) ); + gtk_tree_selection_set_mode ( gtk_tree_view_get_selection(GTK_TREE_VIEW(view)), GTK_SELECTION_MULTIPLE ); + gtk_tree_view_set_rules_hint ( GTK_TREE_VIEW(view), TRUE ); + + g_object_unref(store); + + GtkWidget *scrolledwindow = gtk_scrolled_window_new ( NULL, NULL ); + gtk_scrolled_window_set_policy ( GTK_SCROLLED_WINDOW(scrolledwindow), GTK_POLICY_AUTOMATIC, GTK_POLICY_AUTOMATIC ); + gtk_container_add ( GTK_CONTAINER(scrolledwindow), view ); + + g_object_set ( view, "has-tooltip", TRUE, NULL); + + g_signal_connect ( view, "query-tooltip", G_CALLBACK (trw_layer_track_tooltip_cb), NULL ); + //g_signal_connect ( gtk_tree_view_get_selection (GTK_TREE_VIEW(view)), "changed", G_CALLBACK(trw_layer_track_select_cb), view ); + + g_signal_connect ( view, "popup-menu", G_CALLBACK(trw_layer_track_menu_popup), tracks_and_layers ); + g_signal_connect ( view, "button-press-event", G_CALLBACK(trw_layer_track_button_pressed), tracks_and_layers ); + + gtk_box_pack_start (GTK_BOX(GTK_DIALOG(dialog)->vbox), scrolledwindow, TRUE, TRUE, 0); + + // Set ordering of the initial view by one of the name columns + gtk_tree_view_column_clicked ( sort_by_column ); + + // Ensure a reasonable number of items are shown + // TODO: may be save window size, column order, sorted by between invocations. + // Gtk too stupid to work out best size so need to tell it. + gtk_window_set_default_size ( GTK_WINDOW(dialog), show_layer_names ? 900 : 700, 400 ); +} + + +/** + * vik_trw_layer_track_list_show_dialog: + * @title: The title for the dialog + * @vl: The #VikLayer passed on into get_tracks_and_layers_cb() + * @user_data: Data passed on into get_tracks_and_layers_cb() + * @get_tracks_and_layers_cb: The function to call to construct items to be analysed + * @show_layer_names: Normally only set when called from an aggregate level + * + * Common method for showing a list of tracks with extended information + * + */ +void vik_trw_layer_track_list_show_dialog ( gchar *title, + VikLayer *vl, + gpointer user_data, + VikTrwlayerGetTracksAndLayersFunc get_tracks_and_layers_cb, + gboolean show_layer_names ) +{ + GtkWidget *dialog = gtk_dialog_new_with_buttons ( title, + VIK_GTK_WINDOW_FROM_LAYER(vl), + GTK_DIALOG_DESTROY_WITH_PARENT, + GTK_STOCK_CLOSE, + GTK_RESPONSE_CLOSE, + NULL ); + + GList *gl = get_tracks_and_layers_cb ( vl, user_data ); + + vik_trw_layer_track_list_internal ( dialog, gl, show_layer_names ); + + // Use response to close the dialog with tidy up + g_signal_connect ( G_OBJECT(dialog), "response", G_CALLBACK(track_close_cb), gl ); + + gtk_widget_show_all ( dialog ); + // Yes - set the size *AGAIN* - this time widgets are expanded nicely + gtk_window_resize ( GTK_WINDOW(dialog), show_layer_names ? 1000 : 800, 400 ); + + // ATM lock out on dialog run - to prevent list contents being manipulated in other parts of the GUI whilst shown here. + gtk_dialog_run (GTK_DIALOG (dialog)); + // Unfortunately seems subsequently opening the Track Properties we can't interact with it until this dialog is closed + // Thus this dialog is then forcibly closed when opening the properties. + + // Occassionally the 'View' doesn't update the viewport properly + // viewport center + zoom is changed but the viewport isn't updated + // not sure why yet.. +} diff --git a/src/viktrwlayer_tracklist.h b/src/viktrwlayer_tracklist.h new file mode 100644 index 0000000..6cc012d --- /dev/null +++ b/src/viktrwlayer_tracklist.h @@ -0,0 +1,38 @@ +/* -*- Mode: C; indent-tabs-mode: t; c-basic-offset: 4; tab-width: 4 -*- */ +/* + * viking -- GPS Data and Topo Analyzer, Explorer, and Manager + * + * Copyright (C) 2013, Rob Norris + * + * 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., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA + * + */ +#ifndef _VIKING_TRWLAYER_TRACKLIST_H +#define _VIKING_TRWLAYER_TRACKLIST_H + +#include "viktrack.h" +#include "viktrwlayer.h" + +G_BEGIN_DECLS + +void vik_trw_layer_track_list_show_dialog ( gchar *title, + VikLayer *vl, + gpointer user_data, + VikTrwlayerGetTracksAndLayersFunc get_tracks_and_layers_cb, + gboolean is_aggregate ); + +G_END_DECLS + +#endif diff --git a/src/viktrwlayer_waypointlist.c b/src/viktrwlayer_waypointlist.c new file mode 100644 index 0000000..6c8b5a6 --- /dev/null +++ b/src/viktrwlayer_waypointlist.c @@ -0,0 +1,721 @@ +/* -*- Mode: C; indent-tabs-mode: t; c-basic-offset: 4; tab-width: 4 -*- */ +/* + * viking -- GPS Data and Topo Analyzer, Explorer, and Manager + * + * Copyright (C) 2013-2015, Rob Norris + * + * 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., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA + * + */ +#include +#include +#include +#include +#include +#include +#include + +#include "viking.h" +#include "viktrwlayer_waypointlist.h" +#include "viktrwlayer_wpwin.h" + +// Long formatted date+basic time - listing this way ensures the string comparison sort works - so no local type format %x or %c here! +#define WAYPOINT_LIST_DATE_FORMAT "%Y-%m-%d %H:%M" + +/** + * waypoint_close_cb: + * + */ +static void waypoint_close_cb ( GtkWidget *dialog, gint resp, GList *data ) +{ + g_list_foreach ( data, (GFunc) g_free, NULL ); + g_list_free ( data ); + + gtk_widget_destroy (dialog); +} + +/** + * format_1f_cell_data_func: + * + * General purpose column double formatting + * +static void format_1f_cell_data_func ( GtkTreeViewColumn *col, + GtkCellRenderer *renderer, + GtkTreeModel *model, + GtkTreeIter *iter, + gpointer user_data ) +{ + gdouble value; + gchar buf[20]; + gint column = GPOINTER_TO_INT (user_data); + gtk_tree_model_get ( model, iter, column, &value, -1 ); + g_snprintf ( buf, sizeof(buf), "%.1f", value ); + g_object_set ( renderer, "text", buf, NULL ); +} + */ + +#define WPT_LIST_COLS 9 +#define WPT_COL_NUM WPT_LIST_COLS-1 +#define TRW_COL_NUM WPT_COL_NUM-1 + +/* + * trw_layer_waypoint_tooltip_cb: + * + * Show a tooltip when the mouse is over a waypoint list entry. + * The tooltip contains the description. + */ +static gboolean trw_layer_waypoint_tooltip_cb ( GtkWidget *widget, + gint x, + gint y, + gboolean keyboard_tip, + GtkTooltip *tooltip, + gpointer data ) +{ + GtkTreeIter iter; + GtkTreePath *path = NULL; + GtkTreeView *tree_view = GTK_TREE_VIEW (widget); + GtkTreeModel *model = gtk_tree_view_get_model (tree_view); + + if ( !gtk_tree_view_get_tooltip_context ( tree_view, &x, &y, + keyboard_tip, + &model, &path, &iter ) ) + return FALSE; + + VikWaypoint *wpt; + gtk_tree_model_get ( model, &iter, WPT_COL_NUM, &wpt, -1 ); + if ( !wpt ) return FALSE; + + gboolean tooltip_set = TRUE; + if ( wpt->description ) + gtk_tooltip_set_text ( tooltip, wpt->description ); + else + tooltip_set = FALSE; + + if ( tooltip_set ) + gtk_tree_view_set_tooltip_row ( tree_view, tooltip, path ); + + gtk_tree_path_free ( path ); + + return tooltip_set; +} + +/* +static void trw_layer_waypoint_select_cb ( GtkTreeSelection *selection, gpointer data ) +{ + GtkTreeIter iter; + if ( !gtk_tree_selection_get_selected (selection, NULL, &iter) ) + return; + + GtkTreeView *tree_view = GTK_TREE_VIEW ( data ); + GtkTreeModel *model = gtk_tree_view_get_model (tree_view); + + VikWaypoint *wpt; + gtk_tree_model_get ( model, &iter, WPT_COL_NUM, &wpt, -1 ); + if ( !wpt ) return; + + VikTrwLayer *vtl; + gtk_tree_model_get ( model, &iter, TRW_COL_NUM, &vtl, -1 ); + if ( !IS_VIK_TRW_LAYER(vtl) ) return; + + //vik_treeview_select_iter ( VIK_LAYER(vtl)->vt, g_hash_table_lookup ( vtl->waypoint_iters, uuid ), TRUE ); +} +*/ + +// A slightly better way of defining the menu callback information +// This should be much easier to extend/rework compared to the current trw_layer menus +typedef enum { + MA_VTL = 0, + MA_WPT, + MA_WPT_UUID, + MA_VVP, + MA_TREEVIEW, + MA_WPTS_LIST, + MA_LAST +} menu_array_index; + +typedef gpointer menu_array_values[MA_LAST]; + +// Instead of hooking automatically on treeview item selection +// This is performed on demand via the specific menu request +static void trw_layer_waypoint_select ( menu_array_values values ) +{ + VikTrwLayer *vtl = VIK_TRW_LAYER(values[MA_VTL]); + + if ( values[MA_WPT_UUID] ) { + GtkTreeIter *iter = NULL; + iter = g_hash_table_lookup ( vik_trw_layer_get_waypoints_iters(vtl), values[MA_WPT_UUID] ); + + if ( iter ) + vik_treeview_select_iter ( VIK_LAYER(vtl)->vt, iter, TRUE ); + } +} + +static void trw_layer_waypoint_properties ( menu_array_values values ) +{ + VikTrwLayer *vtl = VIK_TRW_LAYER(values[MA_VTL]); + VikWaypoint *wpt = VIK_WAYPOINT(values[MA_WPT]); + + if ( wpt && wpt->name ) { + // Kill off this dialog to allow interaction with properties window + // since the properties also allows waypoint manipulations it won't cause conflicts here. + GtkWidget *gw = gtk_widget_get_toplevel ( values[MA_TREEVIEW] ); + waypoint_close_cb ( gw, 0, values[MA_WPTS_LIST] ); + + gboolean updated = FALSE; + gchar *new_name = a_dialog_waypoint ( VIK_GTK_WINDOW_FROM_LAYER(vtl), wpt->name, vtl, wpt, vik_trw_layer_get_coord_mode(vtl), FALSE, &updated ); + if ( new_name ) + trw_layer_waypoint_rename ( vtl, wpt, new_name ); + + if ( updated ) + trw_layer_waypoint_reset_icon ( vtl, wpt ); + + if ( updated && VIK_LAYER(vtl)->visible ) + vik_layer_emit_update ( VIK_LAYER(vtl) ); + } +} + +static void trw_layer_waypoint_view ( menu_array_values values ) +{ + VikTrwLayer *vtl = VIK_TRW_LAYER(values[MA_VTL]); + VikWaypoint *wpt = VIK_WAYPOINT(values[MA_WPT]); + VikViewport *vvp = VIK_VIEWPORT(values[MA_VVP]); + + vik_viewport_set_center_coord ( vvp, &(wpt->coord), TRUE ); + + trw_layer_waypoint_select (values); + + vik_layer_emit_update ( VIK_LAYER(vtl) ); +} + +static void trw_layer_show_picture ( menu_array_values values ) +{ + VikWaypoint *wpt = VIK_WAYPOINT(values[MA_WPT]); +#ifdef WINDOWS + ShellExecute(NULL, "open", wpt->image, NULL, NULL, SW_SHOWNORMAL); +#else + VikTrwLayer *vtl = VIK_TRW_LAYER(values[MA_VTL]); + GError *err = NULL; + gchar *quoted_file = g_shell_quote ( wpt->image ); + gchar *cmd = g_strdup_printf ( "%s %s", a_vik_get_image_viewer(), quoted_file ); + g_free ( quoted_file ); + if ( ! g_spawn_command_line_async ( cmd, &err ) ) { + a_dialog_error_msg_extra ( VIK_GTK_WINDOW_FROM_LAYER(vtl), _("Could not launch %s to open file."), a_vik_get_image_viewer() ); + g_error_free ( err ); + } + g_free ( cmd ); +#endif +} + + +typedef struct { + gboolean has_layer_names; + gboolean include_positions; + GString *str; +} copy_data_t; + +/** + * At the moment allow copying the data displayed** with or without the positions + * (since the position data is not shown in the list but is useful in copying to external apps) + * + * ** ATM The visibility flag is not copied and neither is a text representation of the waypoint symbol + */ +static void copy_selection (GtkTreeModel *model, + GtkTreePath *path, + GtkTreeIter *iter, + gpointer data) +{ + copy_data_t *cd = (copy_data_t*) data; + + gchar* layername; gtk_tree_model_get ( model, iter, 0, &layername, -1 ); + gchar* name; gtk_tree_model_get ( model, iter, 1, &name, -1 ); + gchar* date; gtk_tree_model_get ( model, iter, 2, &date, -1 ); + gchar* comment; gtk_tree_model_get ( model, iter, 4, &comment, -1 ); + if ( comment == NULL ) + comment = g_strdup ( "" ); + gint hh; gtk_tree_model_get ( model, iter, 5, &hh, -1 ); + + VikWaypoint *wpt; gtk_tree_model_get ( model, iter, WPT_COL_NUM, &wpt, -1 ); + struct LatLon ll; + if ( wpt ) { + vik_coord_to_latlon ( &wpt->coord, &ll ); + } + gchar sep = '\t'; // Could make this configurable - but simply always make it a tab character for now + // NB Even if the columns have been reordered - this copies it out only in the original default order + // if col 0 is displayed then also copy the layername + // Note that the lat/lon data copy is using the users locale + if ( cd->has_layer_names ) { + if ( cd->include_positions ) + g_string_append_printf ( cd->str, "%s%c%s%c%s%c%s%c%d%c%.6f%c%.6f\n", layername, sep, name, sep, date, sep, comment, sep, hh, sep, ll.lat, sep, ll.lon ); + else + g_string_append_printf ( cd->str, "%s%c%s%c%s%c%s%c%d\n", layername, sep, name, sep, date, sep, comment, sep, hh ); + } + else { + if ( cd->include_positions ) + g_string_append_printf ( cd->str, "%s%c%s%c%s%c%d%c%.6f%c%.6f\n", name, sep, date, sep, comment, sep, hh, sep, ll.lat, sep, ll.lon ); + else + g_string_append_printf ( cd->str, "%s%c%s%c%s%c%d\n", name, sep, date, sep, comment, sep, hh ); + } + g_free ( layername ); + g_free ( name ); + g_free ( date ); + g_free ( comment ); +} + +static void trw_layer_copy_selected ( GtkWidget *tree_view, gboolean include_positions ) +{ + GtkTreeSelection *selection = gtk_tree_view_get_selection ( GTK_TREE_VIEW(tree_view) ); + // NB GTK3 has gtk_tree_view_get_n_columns() but we're GTK2 ATM + GList *gl = gtk_tree_view_get_columns ( GTK_TREE_VIEW(tree_view) ); + guint count = g_list_length ( gl ); + g_list_free ( gl ); + copy_data_t cd; + cd.has_layer_names = (count > WPT_LIST_COLS-3); + cd.str = g_string_new ( NULL ); + cd.include_positions = include_positions; + gtk_tree_selection_selected_foreach ( selection, copy_selection, &cd ); + + a_clipboard_copy ( VIK_CLIPBOARD_DATA_TEXT, 0, 0, 0, cd.str->str, NULL ); + + g_string_free ( cd.str, TRUE ); +} + +static void trw_layer_copy_selected_only_visible_columns ( GtkWidget *tree_view ) +{ + trw_layer_copy_selected ( tree_view, FALSE ); +} + +static void trw_layer_copy_selected_with_position ( GtkWidget *tree_view ) +{ + trw_layer_copy_selected ( tree_view, TRUE ); +} + +static void add_copy_menu_items ( GtkMenu *menu, GtkWidget *tree_view ) +{ + GtkWidget *item = gtk_image_menu_item_new_with_mnemonic ( _("_Copy Data") ); + gtk_image_menu_item_set_image ( (GtkImageMenuItem*)item, gtk_image_new_from_stock (GTK_STOCK_COPY, GTK_ICON_SIZE_MENU) ); + g_signal_connect_swapped ( G_OBJECT(item), "activate", G_CALLBACK(trw_layer_copy_selected_only_visible_columns), tree_view ); + gtk_menu_shell_append (GTK_MENU_SHELL (menu), item); + gtk_widget_show ( item ); + + item = gtk_image_menu_item_new_with_mnemonic ( _("Copy Data (with _positions)") ); + gtk_image_menu_item_set_image ( (GtkImageMenuItem*)item, gtk_image_new_from_stock (GTK_STOCK_COPY, GTK_ICON_SIZE_MENU) ); + g_signal_connect_swapped ( G_OBJECT(item), "activate", G_CALLBACK(trw_layer_copy_selected_with_position), tree_view ); + gtk_menu_shell_append (GTK_MENU_SHELL (menu), item); + gtk_widget_show ( item ); +} + +static gboolean add_menu_items ( GtkMenu *menu, VikTrwLayer *vtl, VikWaypoint *wpt, gpointer wpt_uuid, VikViewport *vvp, GtkWidget *tree_view, gpointer data ) +{ + static menu_array_values values; + GtkWidget *item; + + values[MA_VTL] = vtl; + values[MA_WPT] = wpt; + values[MA_WPT_UUID] = wpt_uuid; + values[MA_VVP] = vvp; + values[MA_TREEVIEW] = tree_view; + values[MA_WPTS_LIST] = data; + + /* + item = gtk_image_menu_item_new_with_mnemonic ( _("_Select") ); + gtk_image_menu_item_set_image ( (GtkImageMenuItem*)item, gtk_image_new_from_stock (GTK_STOCK_FIND, GTK_ICON_SIZE_MENU) ); + g_signal_connect_swapped ( G_OBJECT(item), "activate", G_CALLBACK(trw_layer_waypoint_select), values ); + gtk_menu_shell_append (GTK_MENU_SHELL (menu), item); + gtk_widget_show ( item ); + */ + + // AUTO SELECT NOT TRUE YET... + // ATM view auto selects, so don't bother with separate select menu entry + item = gtk_image_menu_item_new_with_mnemonic ( _("_View") ); + gtk_image_menu_item_set_image ( (GtkImageMenuItem*)item, gtk_image_new_from_stock (GTK_STOCK_ZOOM_FIT, GTK_ICON_SIZE_MENU) ); + g_signal_connect_swapped ( G_OBJECT(item), "activate", G_CALLBACK(trw_layer_waypoint_view), values ); + gtk_menu_shell_append (GTK_MENU_SHELL (menu), item); + gtk_widget_show ( item ); + + item = gtk_image_menu_item_new_from_stock ( GTK_STOCK_PROPERTIES, NULL ); + g_signal_connect_swapped ( G_OBJECT(item), "activate", G_CALLBACK(trw_layer_waypoint_properties), values ); + gtk_menu_shell_append ( GTK_MENU_SHELL(menu), item ); + gtk_widget_show ( item ); + + item = gtk_image_menu_item_new_with_mnemonic ( _("_Show Picture...") ); + gtk_image_menu_item_set_image ( (GtkImageMenuItem*)item, gtk_image_new_from_stock ("vik-icon-Show Picture", GTK_ICON_SIZE_MENU) ); // Own icon - see stock_icons in vikwindow.c + g_signal_connect_swapped ( G_OBJECT(item), "activate", G_CALLBACK(trw_layer_show_picture), values ); + gtk_menu_shell_append ( GTK_MENU_SHELL(menu), item ); + gtk_widget_show ( item ); + gtk_widget_set_sensitive ( item, GPOINTER_TO_INT(wpt->image) ); + + add_copy_menu_items ( menu, tree_view ); + + return TRUE; +} + +static gboolean trw_layer_waypoint_menu_popup_multi ( GtkWidget *tree_view, + GdkEventButton *event, + gpointer data ) +{ + GtkWidget *menu = gtk_menu_new(); + + add_copy_menu_items ( GTK_MENU(menu), tree_view ); + + gtk_menu_popup ( GTK_MENU(menu), NULL, NULL, NULL, NULL, event->button, gtk_get_current_event_time() ); + + return TRUE; +} + +static gboolean trw_layer_waypoint_menu_popup ( GtkWidget *tree_view, + GdkEventButton *event, + gpointer data ) +{ + static GtkTreeIter iter; + + // Use selected item to get a single iterator ref + // This relies on an row being selected as part of the right click + GtkTreeSelection *selection = gtk_tree_view_get_selection ( GTK_TREE_VIEW(tree_view) ); + if ( gtk_tree_selection_count_selected_rows (selection) != 1 ) + return trw_layer_waypoint_menu_popup_multi ( tree_view, event, data ); + + GtkTreePath *path; + GtkTreeModel *model = gtk_tree_view_get_model ( GTK_TREE_VIEW(tree_view) ); + + // All this just to get the iter + if ( gtk_tree_view_get_path_at_pos ( GTK_TREE_VIEW(tree_view), + (gint) event->x, + (gint) event->y, + &path, NULL, NULL, NULL)) { + gtk_tree_model_get_iter_from_string ( model, &iter, gtk_tree_path_to_string (path) ); + gtk_tree_path_free ( path ); + } + else + return FALSE; + + VikWaypoint *wpt; + gtk_tree_model_get ( model, &iter, WPT_COL_NUM, &wpt, -1 ); + if ( !wpt ) return FALSE; + + VikTrwLayer *vtl; + gtk_tree_model_get ( model, &iter, TRW_COL_NUM, &vtl, -1 ); + if ( !IS_VIK_TRW_LAYER(vtl) ) return FALSE; + + wpu_udata udataU; + udataU.wp = wpt; + udataU.uuid = NULL; + + gpointer wptf; + wptf = g_hash_table_find ( vik_trw_layer_get_waypoints(vtl), (GHRFunc) trw_layer_waypoint_find_uuid, &udataU ); + + if ( wptf && udataU.uuid ) { + VikViewport *vvp = vik_window_viewport((VikWindow *)(VIK_GTK_WINDOW_FROM_LAYER(vtl))); + + GtkWidget *menu = gtk_menu_new(); + + // Originally started to reuse the trw_layer menu items + // however these offer too many ways to edit the waypoint data + // so without an easy way to distinguish read only operations, + // create a very minimal new set of operations + add_menu_items ( GTK_MENU(menu), + vtl, + wpt, + udataU.uuid, + vvp, + tree_view, + data ); + + gtk_menu_popup ( GTK_MENU(menu), NULL, NULL, NULL, NULL, event->button, gtk_get_current_event_time() ); + return TRUE; + } + return FALSE; +} + +static gboolean trw_layer_waypoint_button_pressed ( GtkWidget *tree_view, + GdkEventButton *event, + gpointer data ) +{ + // Only on right clicks... + if ( ! (event->type == GDK_BUTTON_PRESS && event->button == 3) ) + return FALSE; + + // ATM Force a selection... + GtkTreeSelection *selection = gtk_tree_view_get_selection ( GTK_TREE_VIEW(tree_view) ); + if ( gtk_tree_selection_count_selected_rows (selection) <= 1 ) { + GtkTreePath *path; + /* Get tree path for row that was clicked */ + if ( gtk_tree_view_get_path_at_pos ( GTK_TREE_VIEW(tree_view), + (gint) event->x, + (gint) event->y, + &path, NULL, NULL, NULL)) { + gtk_tree_selection_unselect_all ( selection ); + gtk_tree_selection_select_path ( selection, path ); + gtk_tree_path_free ( path ); + } + } + return trw_layer_waypoint_menu_popup ( tree_view, event, data ); +} + +/* + * Foreach entry we copy the various individual waypoint properties into the tree store + * formatting & converting the internal values into something for display + */ +static void trw_layer_waypoint_list_add ( vik_trw_waypoint_list_t *vtdl, + GtkTreeStore *store, + vik_units_height_t height_units, + const gchar* date_format ) +{ + GtkTreeIter t_iter; + VikWaypoint *wpt = vtdl->wpt; + VikTrwLayer *vtl = vtdl->vtl; + + // Get start date + gchar time_buf[32]; + time_buf[0] = '\0'; + if ( wpt->has_timestamp ) { + +#if GLIB_CHECK_VERSION(2,26,0) + GDateTime* gdt = g_date_time_new_from_unix_utc ( wpt->timestamp ); + gchar *time = g_date_time_format ( gdt, date_format ); + g_strlcpy ( time_buf, time, sizeof(time_buf) ); + g_free ( time ); + g_date_time_unref ( gdt); +#else + GDate* gdate_start = g_date_new (); + g_date_set_time_t ( gdate_start, wpt->timestamp ); + g_date_strftime ( time_buf, sizeof(time_buf), date_format, gdate_start ); + g_date_free ( gdate_start ); +#endif + } + + // NB: doesn't include aggegrate visibility + gboolean visible = VIK_LAYER(vtl)->visible && wpt->visible; + visible = visible && vik_trw_layer_get_waypoints_visibility(vtl); + + gdouble alt = wpt->altitude; + switch (height_units) { + case VIK_UNITS_HEIGHT_FEET: alt = VIK_METERS_TO_FEET(alt); break; + default: + // VIK_UNITS_HEIGHT_METRES: no need to convert + break; + } + + gtk_tree_store_append ( store, &t_iter, NULL ); + gtk_tree_store_set ( store, &t_iter, + 0, VIK_LAYER(vtl)->name, + 1, wpt->name, + 2, time_buf, + 3, visible, + 4, wpt->comment, + 5, (gint)round(alt), + 6, get_wp_sym_small (wpt->symbol), + TRW_COL_NUM, vtl, + WPT_COL_NUM, wpt, + -1 ); +} + +/* + * Instead of comparing the pixbufs, + * look at the waypoint data and compare the symbol (as text). + */ +gint sort_pixbuf_compare_func ( GtkTreeModel *model, + GtkTreeIter *a, + GtkTreeIter *b, + gpointer userdata ) +{ + VikWaypoint *wpt1, *wpt2; + gtk_tree_model_get ( model, a, WPT_COL_NUM, &wpt1, -1 ); + if ( !wpt1 ) return 0; + gtk_tree_model_get ( model, b, WPT_COL_NUM, &wpt2, -1 ); + if ( !wpt2 ) return 0; + + return g_strcmp0 ( wpt1->symbol, wpt2->symbol ); +} + +static GtkTreeViewColumn *my_new_column_text ( const gchar *title, GtkCellRenderer *renderer, GtkWidget *view, gint column_runner ) +{ + GtkTreeViewColumn *column = gtk_tree_view_column_new_with_attributes ( title, renderer, "text", column_runner, NULL ); + gtk_tree_view_column_set_sort_column_id ( column, column_runner ); + gtk_tree_view_append_column ( GTK_TREE_VIEW(view), column ); + gtk_tree_view_column_set_reorderable ( column, TRUE ); + gtk_tree_view_column_set_resizable ( column, TRUE ); + return column; +} + +/** + * vik_trw_layer_waypoint_list_internal: + * @dialog: The dialog to create the widgets in + * @waypoints_and_layers: The list of waypoints (and it's layer) to be shown + * @show_layer_names: Show the layer names that each waypoint belongs to + * + * Create a table of waypoints with corresponding waypoint information + * This table does not support being actively updated + */ +static void vik_trw_layer_waypoint_list_internal ( GtkWidget *dialog, + GList *waypoints_and_layers, + gboolean show_layer_names ) +{ + if ( !waypoints_and_layers ) + return; + + // It's simple storing the gdouble values in the tree store as the sort works automatically + // Then apply specific cell data formatting (rather default double is to 6 decimal places!) + // However not storing any doubles for waypoints ATM + // TODO: Consider adding the waypoint icon into this store for display in the list + GtkTreeStore *store = gtk_tree_store_new ( WPT_LIST_COLS, + G_TYPE_STRING, // 0: Layer Name + G_TYPE_STRING, // 1: Waypoint Name + G_TYPE_STRING, // 2: Date + G_TYPE_BOOLEAN, // 3: Visible + G_TYPE_STRING, // 4: Comment + G_TYPE_INT, // 5: Height + GDK_TYPE_PIXBUF, // 6: Symbol Icon + G_TYPE_POINTER, // 7: TrackWaypoint Layer pointer + G_TYPE_POINTER ); // 8: Waypoint pointer + + //gtk_tree_selection_set_select_function ( gtk_tree_view_get_selection (GTK_TREE_VIEW(vt)), vik_treeview_selection_filter, vt, NULL ); + + vik_units_height_t height_units = a_vik_get_units_height (); + + //GList *gl = get_waypoints_and_layers_cb ( vl, user_data ); + //g_list_foreach ( waypoints_and_layers, (GFunc) trw_layer_waypoint_list_add, store ); + gchar *date_format = NULL; + if ( !a_settings_get_string ( VIK_SETTINGS_LIST_DATE_FORMAT, &date_format ) ) + date_format = g_strdup ( WAYPOINT_LIST_DATE_FORMAT ); + + GList *gl = waypoints_and_layers; + while ( gl ) { + trw_layer_waypoint_list_add ( (vik_trw_waypoint_list_t*)gl->data, store, height_units, date_format ); + gl = g_list_next ( gl ); + } + g_free ( date_format ); + + GtkWidget *view = gtk_tree_view_new(); + GtkCellRenderer *renderer = gtk_cell_renderer_text_new(); + g_object_set (G_OBJECT (renderer), "xalign", 0.0, "ellipsize", PANGO_ELLIPSIZE_END, NULL); + GtkTreeViewColumn *column; + GtkTreeViewColumn *sort_by_column; + + gint column_runner = 0; + if ( show_layer_names ) { + // Insert column for the layer name when viewing multi layers + column = my_new_column_text ( _("Layer"), renderer, view, column_runner++ ); + g_object_set (G_OBJECT (renderer), "xalign", 0.0, "ellipsize", PANGO_ELLIPSIZE_END, NULL); + gtk_tree_view_column_set_expand ( column, TRUE ); + // remember the layer column so we can sort by it later + sort_by_column = column; + } + else + column_runner++; + + column = my_new_column_text ( _("Name"), renderer, view, column_runner++ ); + gtk_tree_view_column_set_expand ( column, TRUE ); + if ( !show_layer_names ) + // remember the name column so we can sort by it later + sort_by_column = column; + + column = my_new_column_text ( _("Date"), renderer, view, column_runner++ ); + gtk_tree_view_column_set_resizable ( column, TRUE ); + + GtkCellRenderer *renderer_toggle = gtk_cell_renderer_toggle_new (); + column = gtk_tree_view_column_new_with_attributes ( _("Visible"), renderer_toggle, "active", column_runner, NULL ); + gtk_tree_view_column_set_sort_column_id ( column, column_runner ); + gtk_tree_view_append_column ( GTK_TREE_VIEW(view), column ); + column_runner++; + + column = my_new_column_text ( _("Comment"), renderer, view, column_runner++ ); + gtk_tree_view_column_set_expand ( column, TRUE ); + + if ( height_units == VIK_UNITS_HEIGHT_FEET ) + (void)my_new_column_text ( _("Max Height\n(Feet)"), renderer, view, column_runner++ ); + else + (void)my_new_column_text ( _("Max Height\n(Metres)"), renderer, view, column_runner++ ); + + GtkCellRenderer *renderer_pixbuf = gtk_cell_renderer_pixbuf_new (); + g_object_set (G_OBJECT (renderer_pixbuf), "xalign", 0.5, NULL); + column = gtk_tree_view_column_new_with_attributes ( _("Symbol"), renderer_pixbuf, "pixbuf", column_runner++, NULL ); + // Special sort required for pixbufs + gtk_tree_sortable_set_sort_func ( GTK_TREE_SORTABLE(store), column_runner, sort_pixbuf_compare_func, NULL, NULL ); + gtk_tree_view_column_set_sort_column_id ( column, column_runner ); + gtk_tree_view_append_column ( GTK_TREE_VIEW(view), column ); + + gtk_tree_view_set_model ( GTK_TREE_VIEW(view), GTK_TREE_MODEL(store) ); + gtk_tree_selection_set_mode ( gtk_tree_view_get_selection(GTK_TREE_VIEW(view)), GTK_SELECTION_MULTIPLE ); + gtk_tree_view_set_rules_hint ( GTK_TREE_VIEW(view), TRUE ); + + g_object_unref(store); + + GtkWidget *scrolledwindow = gtk_scrolled_window_new ( NULL, NULL ); + gtk_scrolled_window_set_policy ( GTK_SCROLLED_WINDOW(scrolledwindow), GTK_POLICY_AUTOMATIC, GTK_POLICY_AUTOMATIC ); + gtk_container_add ( GTK_CONTAINER(scrolledwindow), view ); + + g_object_set ( view, "has-tooltip", TRUE, NULL); + + g_signal_connect ( view, "query-tooltip", G_CALLBACK (trw_layer_waypoint_tooltip_cb), NULL ); + //g_signal_connect ( gtk_tree_view_get_selection (GTK_TREE_VIEW(view)), "changed", G_CALLBACK(trw_layer_waypoint_select_cb), view ); + + g_signal_connect ( view, "popup-menu", G_CALLBACK(trw_layer_waypoint_menu_popup), waypoints_and_layers ); + g_signal_connect ( view, "button-press-event", G_CALLBACK(trw_layer_waypoint_button_pressed), waypoints_and_layers ); + + gtk_box_pack_start (GTK_BOX(GTK_DIALOG(dialog)->vbox), scrolledwindow, TRUE, TRUE, 0); + + // Set ordering of the initial view by one of the name columns + gtk_tree_view_column_clicked ( sort_by_column ); + + // Ensure a reasonable number of items are shown + // TODO: may be save window size, column order, sorted by between invocations. + gtk_window_set_default_size ( GTK_WINDOW(dialog), show_layer_names ? 700 : 500, 400 ); +} + + +/** + * vik_trw_layer_waypoint_list_show_dialog: + * @title: The title for the dialog + * @vl: The #VikLayer passed on into get_waypoints_and_layers_cb() + * @user_data: Data passed on into get_waypoints_and_layers_cb() + * @get_waypoints_and_layers_cb: The function to call to construct items to be analysed + * @show_layer_names: Normally only set when called from an aggregate level + * + * Common method for showing a list of waypoints with extended information + * + */ +void vik_trw_layer_waypoint_list_show_dialog ( gchar *title, + VikLayer *vl, + gpointer user_data, + VikTrwlayerGetWaypointsAndLayersFunc get_waypoints_and_layers_cb, + gboolean show_layer_names ) +{ + GtkWidget *dialog = gtk_dialog_new_with_buttons ( title, + VIK_GTK_WINDOW_FROM_LAYER(vl), + GTK_DIALOG_DESTROY_WITH_PARENT, + GTK_STOCK_CLOSE, + GTK_RESPONSE_CLOSE, + NULL ); + + GList *gl = get_waypoints_and_layers_cb ( vl, user_data ); + + vik_trw_layer_waypoint_list_internal ( dialog, gl, show_layer_names ); + + // Use response to close the dialog with tidy up + g_signal_connect ( G_OBJECT(dialog), "response", G_CALLBACK(waypoint_close_cb), gl ); + + gtk_widget_show_all ( dialog ); + // Yes - set the size *AGAIN* - this time widgets are expanded nicely + gtk_window_resize ( GTK_WINDOW(dialog), show_layer_names ? 800 : 600, 400 ); + + // ATM lock out on dialog run - to prevent list contents being manipulated in other parts of the GUI whilst shown here. + gtk_dialog_run (GTK_DIALOG (dialog)); + // Unfortunately seems subsequently opening the Waypoint Properties we can't interact with it until this dialog is closed + // Thus this dialog is then forcibly closed when opening the properties. + + // Occassionally the 'View' doesn't update the viewport properly + // viewport center + zoom is changed but the viewport isn't updated + // not sure why yet.. +} diff --git a/src/viktrwlayer_waypointlist.h b/src/viktrwlayer_waypointlist.h new file mode 100644 index 0000000..fed1b9c --- /dev/null +++ b/src/viktrwlayer_waypointlist.h @@ -0,0 +1,38 @@ +/* -*- Mode: C; indent-tabs-mode: t; c-basic-offset: 4; tab-width: 4 -*- */ +/* + * viking -- GPS Data and Topo Analyzer, Explorer, and Manager + * + * Copyright (C) 2013, Rob Norris + * + * 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., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA + * + */ +#ifndef _VIKING_TRWLAYER_WAYPOINTLIST_H +#define _VIKING_TRWLAYER_WAYPOINTLIST_H + +#include "vikwaypoint.h" +#include "viktrwlayer.h" + +G_BEGIN_DECLS + +void vik_trw_layer_waypoint_list_show_dialog ( gchar *title, + VikLayer *vl, + gpointer user_data, + VikTrwlayerGetWaypointsAndLayersFunc get_waypoints_and_layers_cb, + gboolean is_aggregate ); + +G_END_DECLS + +#endif diff --git a/src/viktrwlayer_wpwin.c b/src/viktrwlayer_wpwin.c new file mode 100644 index 0000000..eeb93cf --- /dev/null +++ b/src/viktrwlayer_wpwin.c @@ -0,0 +1,458 @@ +/* + * viking -- GPS Data and Topo Analyzer, Explorer, and Manager + * + * Copyright (C) 2003-2005, Evan Battaglia + * Copyright (C) 2010-2018, Rob Norris + * + * 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., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA + * + */ +#include +#include +#include + +#include "viktrwlayer_wpwin.h" +#include "degrees_converters.h" +#include "garminsymbols.h" +#ifdef VIK_CONFIG_GEOTAG +#include "geotag_exif.h" +#endif +#include "thumbnails.h" +#include "viking.h" +#include "vikdatetime_edit_dialog.h" +#include "vikgoto.h" +#include "ui_util.h" + +static void update_time ( GtkWidget *widget, VikWaypoint *wp ) +{ + gchar *msg = vu_get_time_string ( &(wp->timestamp), "%c", &(wp->coord), NULL ); + gtk_button_set_label ( GTK_BUTTON(widget), msg ); + g_free ( msg ); +} + +static VikWaypoint *edit_wp; +static gulong direction_signal_id; + +/** + * time_edit_click: + */ +static void time_edit_click ( GtkWidget* widget, GdkEventButton *event, VikWaypoint *wp ) +{ + if ( event->button == 3 ) { + // On right click and when a time is available, allow a method to copy the displayed time as text + if ( !gtk_button_get_image ( GTK_BUTTON(widget) ) ) { + vu_copy_label_menu ( widget, event->button ); + } + return; + } + else if ( event->button == 2 ) { + return; + } + + GTimeZone *gtz = g_time_zone_new_local (); + time_t mytime = vik_datetime_edit_dialog ( GTK_WINDOW(gtk_widget_get_toplevel(widget)), + _("Date/Time Edit"), + wp->timestamp, + gtz ); + g_time_zone_unref ( gtz ); + + // Was the dialog cancelled? + if ( mytime == 0 ) + return; + + // Otherwise use new value in the edit buffer + edit_wp->timestamp = mytime; + + // Clear the previous 'Add' image as now a time is set + if ( gtk_button_get_image ( GTK_BUTTON(widget) ) ) + gtk_button_set_image ( GTK_BUTTON(widget), NULL ); + + update_time ( widget, edit_wp ); +} + +/** + * direction_edit_click: + */ +static void direction_add_click ( GtkWidget* widget, GdkEventButton *event, GtkWidget *direction ) +{ + // Replace 'Add' with text and stop further callbacks + if ( gtk_button_get_image ( GTK_BUTTON(widget) ) ) + gtk_button_set_image ( GTK_BUTTON(widget), NULL ); + gtk_button_set_label ( GTK_BUTTON(widget), _("True") ); + g_signal_handler_disconnect ( G_OBJECT(widget), direction_signal_id ); + + // Enable direction value + gtk_widget_set_sensitive ( direction, TRUE ); + gtk_spin_button_set_value ( GTK_SPIN_BUTTON(direction), 0.0 ); +} + +static void symbol_entry_changed_cb(GtkWidget *combo, GtkListStore *store) +{ + GtkTreeIter iter; + gchar *sym; + + if (!gtk_combo_box_get_active_iter(GTK_COMBO_BOX(combo), &iter)) + return; + + gtk_tree_model_get(GTK_TREE_MODEL(store), &iter, 0, (void *)&sym, -1 ); + /* Note: symm is NULL when "(none)" is select (first cell is empty) */ + gtk_widget_set_tooltip_text(combo, sym); + g_free(sym); +} + +/* Specify if a new waypoint or not */ +/* If a new waypoint then it uses the default_name for the suggested name allowing the user to change it. + The name to use is returned + */ +/* todo: less on this side, like add track */ +gchar *a_dialog_waypoint ( GtkWindow *parent, gchar *default_name, VikTrwLayer *vtl, VikWaypoint *wp, VikCoordMode coord_mode, gboolean is_new, gboolean *updated ) +{ + GtkWidget *dialog = gtk_dialog_new_with_buttons (_("Waypoint Properties"), + parent, + GTK_DIALOG_MODAL | GTK_DIALOG_DESTROY_WITH_PARENT, + GTK_STOCK_CANCEL, + GTK_RESPONSE_REJECT, + GTK_STOCK_OK, + GTK_RESPONSE_ACCEPT, + NULL); + struct LatLon ll; + GtkWidget *latlabel, *lonlabel, *namelabel, *latentry, *lonentry, *altentry, *altlabel, *nameentry=NULL; + GtkWidget *commentlabel, *commententry, *descriptionlabel, *descriptionentry, *imagelabel, *imageentry, *symbollabel, *symbolentry; + GtkWidget *sourcelabel = NULL, *sourceentry = NULL; + GtkWidget *typelabel = NULL, *typeentry = NULL; + GtkWidget *timelabel = NULL; + GtkWidget *timevaluebutton = NULL; + GtkWidget *hasGeotagCB = NULL; + GtkWidget *consistentGeotagCB = NULL; + GtkWidget *direction_sb = NULL; + GtkWidget *direction_hb = NULL; + GtkListStore *store; + + gchar *lat, *lon, *alt; + + vik_coord_to_latlon ( &(wp->coord), &ll ); + + lat = g_strdup_printf ( "%f", ll.lat ); + lon = g_strdup_printf ( "%f", ll.lon ); + vik_units_height_t height_units = a_vik_get_units_height (); + switch (height_units) { + case VIK_UNITS_HEIGHT_METRES: + alt = g_strdup_printf ( "%f", wp->altitude ); + break; + case VIK_UNITS_HEIGHT_FEET: + alt = g_strdup_printf ( "%f", VIK_METERS_TO_FEET(wp->altitude) ); + break; + default: + alt = g_strdup_printf ( "%f", wp->altitude ); + g_critical("Houston, we've had a problem. height=%d", height_units); + } + + *updated = FALSE; + + namelabel = gtk_label_new (_("Name:")); + gtk_box_pack_start (GTK_BOX(gtk_dialog_get_content_area(GTK_DIALOG(dialog))), namelabel, FALSE, FALSE, 0); + // Name is now always changeable + nameentry = ui_entry_new ( NULL, GTK_ENTRY_ICON_SECONDARY ); + if ( default_name ) + gtk_entry_set_text( GTK_ENTRY(nameentry), default_name ); + g_signal_connect_swapped ( nameentry, "activate", G_CALLBACK(a_dialog_response_accept), GTK_DIALOG(dialog) ); + gtk_box_pack_start (GTK_BOX(gtk_dialog_get_content_area(GTK_DIALOG(dialog))), nameentry, FALSE, FALSE, 0); + + latlabel = gtk_label_new (_("Latitude:")); + latentry = ui_entry_new ( lat, GTK_ENTRY_ICON_SECONDARY ); + g_free ( lat ); + + lonlabel = gtk_label_new (_("Longitude:")); + lonentry = ui_entry_new ( lon, GTK_ENTRY_ICON_SECONDARY ); + g_free ( lon ); + + altlabel = gtk_label_new (_("Altitude:")); + altentry = ui_entry_new ( alt, GTK_ENTRY_ICON_SECONDARY ); + g_free ( alt ); + + if ( wp->comment && !strncmp(wp->comment, "http", 4) ) + commentlabel = gtk_link_button_new_with_label (wp->comment, _("Comment:") ); + else + commentlabel = gtk_label_new (_("Comment:")); + commententry = ui_entry_new ( NULL, GTK_ENTRY_ICON_SECONDARY ); + gchar *cmt = NULL; + // Auto put in some kind of 'name' as a comment if one previously 'goto'ed this exact location + cmt = a_vik_goto_get_search_string_for_this_place(VIK_WINDOW(parent)); + if (cmt) + gtk_entry_set_text(GTK_ENTRY(commententry), cmt); + + if ( wp->description && !strncmp(wp->description, "http", 4) ) + descriptionlabel = gtk_link_button_new_with_label (wp->description, _("Description:") ); + else + descriptionlabel = gtk_label_new (_("Description:")); + descriptionentry = ui_entry_new ( NULL, GTK_ENTRY_ICON_SECONDARY ); + + sourcelabel = gtk_label_new (_("Source:")); + if ( wp->source ) { + sourceentry = ui_entry_new ( wp->source, GTK_ENTRY_ICON_SECONDARY ); + } + + typelabel = gtk_label_new (_("Type:")); + if ( wp->type ) { + typeentry = ui_entry_new ( wp->type, GTK_ENTRY_ICON_SECONDARY ); + } + + imagelabel = gtk_label_new (_("Image:")); + imageentry = vik_file_entry_new (GTK_FILE_CHOOSER_ACTION_OPEN, VF_FILTER_IMAGE, NULL, NULL); + + { + GtkCellRenderer *r; + symbollabel = gtk_label_new (_("Symbol:")); + GtkTreeIter iter; + + store = gtk_list_store_new(3, G_TYPE_STRING, GDK_TYPE_PIXBUF, G_TYPE_STRING); + symbolentry = gtk_combo_box_new_with_model(GTK_TREE_MODEL(store)); + gtk_combo_box_set_wrap_width(GTK_COMBO_BOX(symbolentry), 6); + + g_signal_connect(symbolentry, "changed", G_CALLBACK(symbol_entry_changed_cb), store); + gtk_list_store_append (store, &iter); + gtk_list_store_set (store, &iter, 0, NULL, 1, NULL, 2, _("(none)"), -1); + a_populate_sym_list(store); + + r = gtk_cell_renderer_pixbuf_new (); + gtk_cell_layout_pack_start (GTK_CELL_LAYOUT (symbolentry), r, FALSE); + gtk_cell_layout_set_attributes (GTK_CELL_LAYOUT (symbolentry), r, "pixbuf", 1, NULL); + + r = gtk_cell_renderer_text_new (); + gtk_cell_layout_pack_start (GTK_CELL_LAYOUT (symbolentry), r, FALSE); + gtk_cell_layout_set_attributes (GTK_CELL_LAYOUT (symbolentry), r, "text", 2, NULL); + + if ( !is_new && wp->symbol ) { + gboolean ok; + gchar *sym; + for (ok = gtk_tree_model_get_iter_first ( GTK_TREE_MODEL(store), &iter ); ok; ok = gtk_tree_model_iter_next ( GTK_TREE_MODEL(store), &iter)) { + gtk_tree_model_get ( GTK_TREE_MODEL(store), &iter, 0, (void *)&sym, -1 ); + if (sym && !strcmp(sym, wp->symbol)) { + g_free(sym); + break; + } else { + g_free(sym); + } + } + // Ensure is it a valid symbol in the given symbol set (large vs small) + // Not all symbols are available in both + // The check prevents a Gtk Critical message + if ( iter.stamp ) + gtk_combo_box_set_active_iter(GTK_COMBO_BOX(symbolentry), &iter); + } + } + + if ( !is_new && wp->comment ) + gtk_entry_set_text ( GTK_ENTRY(commententry), wp->comment ); + + if ( !is_new && wp->description ) + gtk_entry_set_text ( GTK_ENTRY(descriptionentry), wp->description ); + + if ( !edit_wp ) + edit_wp = vik_waypoint_new (); + edit_wp = vik_waypoint_copy ( wp ); + + if ( !is_new && wp->image ) { + vik_file_entry_set_filename ( VIK_FILE_ENTRY(imageentry), wp->image ); + +#ifdef VIK_CONFIG_GEOTAG + // Geotag Info [readonly] + hasGeotagCB = gtk_check_button_new_with_label ( _("Has Geotag") ); + gtk_widget_set_sensitive ( hasGeotagCB, FALSE ); + gboolean hasGeotag; + gchar *ignore = a_geotag_get_exif_date_from_file ( wp->image, &hasGeotag ); + g_free ( ignore ); + gtk_toggle_button_set_active ( GTK_TOGGLE_BUTTON(hasGeotagCB), hasGeotag ); + + consistentGeotagCB = gtk_check_button_new_with_label ( _("Consistent Position") ); + gtk_widget_set_sensitive ( consistentGeotagCB, FALSE ); + if ( hasGeotag ) { + struct LatLon ll = a_geotag_get_position ( wp->image ); + VikCoord coord; + vik_coord_load_from_latlon ( &coord, coord_mode, &ll ); + gtk_toggle_button_set_active ( GTK_TOGGLE_BUTTON(consistentGeotagCB), vik_coord_equalish(&coord, &wp->coord) ); + } + + // ATM the direction value box is always shown, even when there is no information. + // It would be nice to be able to hide it until the 'Add' has been performed, + // however I've not been able to achieve this. + // Thus simply sensistizing it instead. + GtkWidget *direction_label = gtk_label_new ( _("Image Direction:") ); + direction_hb = gtk_hbox_new ( FALSE, 0 ); + gtk_box_pack_start (GTK_BOX(direction_hb), direction_label, FALSE, FALSE, 0); + direction_sb = gtk_spin_button_new ( (GtkAdjustment*)gtk_adjustment_new (0, 0.0, 359.9, 5.0, 1, 0 ), 1, 1 ); + + if ( !is_new && !isnan(wp->image_direction) ) { + GtkWidget *direction_ref = gtk_label_new ( NULL ); + if ( wp->image_direction_ref == WP_IMAGE_DIRECTION_REF_MAGNETIC ) + gtk_label_set_label ( GTK_LABEL(direction_ref), _("Magnetic") ); + else + gtk_label_set_label ( GTK_LABEL(direction_ref), _("True") ); + + gtk_box_pack_start (GTK_BOX(direction_hb), direction_ref, TRUE, FALSE, 0); + gtk_spin_button_set_value ( GTK_SPIN_BUTTON(direction_sb), wp->image_direction ); + } + else { + GtkWidget *direction_ref_button = gtk_button_new (); + gtk_button_set_relief ( GTK_BUTTON(direction_ref_button), GTK_RELIEF_NONE ); + GtkWidget *img = gtk_image_new_from_stock ( GTK_STOCK_ADD, GTK_ICON_SIZE_MENU ); + gtk_button_set_image ( GTK_BUTTON(direction_ref_button), img ); + gtk_box_pack_start (GTK_BOX(direction_hb), direction_ref_button, TRUE, FALSE, 0); + gtk_widget_set_sensitive ( direction_sb, FALSE ); + direction_signal_id = g_signal_connect ( G_OBJECT(direction_ref_button), "button-release-event", G_CALLBACK(direction_add_click), direction_sb ); + } + +#endif + } + + timelabel = gtk_label_new ( _("Time:") ); + timevaluebutton = gtk_button_new(); + gtk_button_set_relief ( GTK_BUTTON(timevaluebutton), GTK_RELIEF_NONE ); + + // TODO: Consider if there should be a remove time button... + + if ( !is_new && wp->has_timestamp ) { + update_time ( timevaluebutton, wp ); + } + else { + GtkWidget *img = gtk_image_new_from_stock ( GTK_STOCK_ADD, GTK_ICON_SIZE_MENU ); + gtk_button_set_image ( GTK_BUTTON(timevaluebutton), img ); + // Initially use current time or otherwise whatever the last value used was + if ( edit_wp->timestamp == 0 ) { + time ( &edit_wp->timestamp ); + } + } + g_signal_connect ( G_OBJECT(timevaluebutton), "button-release-event", G_CALLBACK(time_edit_click), edit_wp ); + + gtk_box_pack_start (GTK_BOX(gtk_dialog_get_content_area(GTK_DIALOG(dialog))), latlabel, FALSE, FALSE, 0); + gtk_box_pack_start (GTK_BOX(gtk_dialog_get_content_area(GTK_DIALOG(dialog))), latentry, FALSE, FALSE, 0); + gtk_box_pack_start (GTK_BOX(gtk_dialog_get_content_area(GTK_DIALOG(dialog))), lonlabel, FALSE, FALSE, 0); + gtk_box_pack_start (GTK_BOX(gtk_dialog_get_content_area(GTK_DIALOG(dialog))), lonentry, FALSE, FALSE, 0); + gtk_box_pack_start (GTK_BOX(gtk_dialog_get_content_area(GTK_DIALOG(dialog))), timelabel, FALSE, FALSE, 0); + gtk_box_pack_start (GTK_BOX(gtk_dialog_get_content_area(GTK_DIALOG(dialog))), timevaluebutton, FALSE, FALSE, 0); + gtk_box_pack_start (GTK_BOX(gtk_dialog_get_content_area(GTK_DIALOG(dialog))), altlabel, FALSE, FALSE, 0); + gtk_box_pack_start (GTK_BOX(gtk_dialog_get_content_area(GTK_DIALOG(dialog))), altentry, FALSE, FALSE, 0); + gtk_box_pack_start (GTK_BOX(gtk_dialog_get_content_area(GTK_DIALOG(dialog))), commentlabel, FALSE, FALSE, 0); + gtk_box_pack_start (GTK_BOX(gtk_dialog_get_content_area(GTK_DIALOG(dialog))), commententry, FALSE, FALSE, 0); + gtk_box_pack_start (GTK_BOX(gtk_dialog_get_content_area(GTK_DIALOG(dialog))), descriptionlabel, FALSE, FALSE, 0); + gtk_box_pack_start (GTK_BOX(gtk_dialog_get_content_area(GTK_DIALOG(dialog))), descriptionentry, FALSE, FALSE, 0); + if ( wp->source ) { + gtk_box_pack_start (GTK_BOX(gtk_dialog_get_content_area(GTK_DIALOG(dialog))), sourcelabel, FALSE, FALSE, 0); + gtk_box_pack_start (GTK_BOX(gtk_dialog_get_content_area(GTK_DIALOG(dialog))), sourceentry, FALSE, FALSE, 0); + } + if ( wp->type ) { + gtk_box_pack_start (GTK_BOX(gtk_dialog_get_content_area(GTK_DIALOG(dialog))), typelabel, FALSE, FALSE, 0); + gtk_box_pack_start (GTK_BOX(gtk_dialog_get_content_area(GTK_DIALOG(dialog))), typeentry, FALSE, FALSE, 0); + } + gtk_box_pack_start (GTK_BOX(gtk_dialog_get_content_area(GTK_DIALOG(dialog))), imagelabel, FALSE, FALSE, 0); + gtk_box_pack_start (GTK_BOX(gtk_dialog_get_content_area(GTK_DIALOG(dialog))), imageentry, FALSE, FALSE, 0); + if ( hasGeotagCB ) { + GtkWidget *hbox = gtk_hbox_new ( FALSE, 0 ); + gtk_box_pack_start (GTK_BOX(hbox), hasGeotagCB, FALSE, FALSE, 0); + gtk_box_pack_start (GTK_BOX(hbox), consistentGeotagCB, FALSE, FALSE, 0); + gtk_box_pack_start (GTK_BOX(gtk_dialog_get_content_area(GTK_DIALOG(dialog))), hbox, FALSE, FALSE, 0); + } + if ( direction_hb ) + gtk_box_pack_start (GTK_BOX(gtk_dialog_get_content_area(GTK_DIALOG(dialog))), direction_hb, FALSE, FALSE, 0); + if ( direction_sb ) + gtk_box_pack_start (GTK_BOX(gtk_dialog_get_content_area(GTK_DIALOG(dialog))), direction_sb, FALSE, FALSE, 0); + gtk_box_pack_start (GTK_BOX(gtk_dialog_get_content_area(GTK_DIALOG(dialog))), symbollabel, FALSE, FALSE, 0); + gtk_box_pack_start (GTK_BOX(gtk_dialog_get_content_area(GTK_DIALOG(dialog))), GTK_WIDGET(symbolentry), FALSE, FALSE, 0); + + gtk_dialog_set_default_response ( GTK_DIALOG(dialog), GTK_RESPONSE_ACCEPT ); + + gtk_widget_show_all ( gtk_dialog_get_content_area(GTK_DIALOG(dialog)) ); + + if ( !is_new ) { + // Shift left<->right to try not to obscure the waypoint. + trw_layer_dialog_shift ( vtl, GTK_WINDOW(dialog), &(wp->coord), FALSE ); + } + + while ( gtk_dialog_run ( GTK_DIALOG(dialog) ) == GTK_RESPONSE_ACCEPT ) + { + if ( strlen((gchar*)gtk_entry_get_text ( GTK_ENTRY(nameentry) )) == 0 ) /* TODO: other checks (isalpha or whatever ) */ + a_dialog_info_msg ( parent, _("Please enter a name for the waypoint.") ); + else { + // NB: No check for unique names - this allows generation of same named entries. + gchar *entered_name = g_strdup ( (gchar*)gtk_entry_get_text ( GTK_ENTRY(nameentry) ) ); + + /* Do It */ + ll.lat = convert_dms_to_dec ( gtk_entry_get_text ( GTK_ENTRY(latentry) ) ); + ll.lon = convert_dms_to_dec ( gtk_entry_get_text ( GTK_ENTRY(lonentry) ) ); + vik_coord_load_from_latlon ( &(wp->coord), coord_mode, &ll ); + // Always store in metres + switch (height_units) { + case VIK_UNITS_HEIGHT_METRES: + wp->altitude = atof ( gtk_entry_get_text ( GTK_ENTRY(altentry) ) ); + break; + case VIK_UNITS_HEIGHT_FEET: + wp->altitude = VIK_FEET_TO_METERS(atof ( gtk_entry_get_text ( GTK_ENTRY(altentry) ) )); + break; + default: + wp->altitude = atof ( gtk_entry_get_text ( GTK_ENTRY(altentry) ) ); + g_critical("Houston, we've had a problem. height=%d", height_units); + } + if ( g_strcmp0 ( wp->comment, gtk_entry_get_text ( GTK_ENTRY(commententry) ) ) ) + vik_waypoint_set_comment ( wp, gtk_entry_get_text ( GTK_ENTRY(commententry) ) ); + if ( g_strcmp0 ( wp->description, gtk_entry_get_text ( GTK_ENTRY(descriptionentry) ) ) ) + vik_waypoint_set_description ( wp, gtk_entry_get_text ( GTK_ENTRY(descriptionentry) ) ); + if ( g_strcmp0 ( wp->image, vik_file_entry_get_filename ( VIK_FILE_ENTRY(imageentry) ) ) ) + vik_waypoint_set_image ( wp, vik_file_entry_get_filename ( VIK_FILE_ENTRY(imageentry) ) ); + if ( sourceentry && g_strcmp0 ( wp->source, gtk_entry_get_text ( GTK_ENTRY(sourceentry) ) ) ) + vik_waypoint_set_source ( wp, gtk_entry_get_text ( GTK_ENTRY(sourceentry) ) ); + if ( typeentry && g_strcmp0 ( wp->type, gtk_entry_get_text ( GTK_ENTRY(typeentry) ) ) ) + vik_waypoint_set_type ( wp, gtk_entry_get_text ( GTK_ENTRY(typeentry) ) ); + if ( wp->image && *(wp->image) && (!a_thumbnails_exists(wp->image)) ) + a_thumbnails_create ( wp->image ); + if ( edit_wp->timestamp ) { + wp->timestamp = edit_wp->timestamp; + wp->has_timestamp = TRUE; + } + + if ( direction_sb ) { + if ( gtk_widget_get_sensitive (direction_sb) ) { + wp->image_direction = gtk_spin_button_get_value ( GTK_SPIN_BUTTON(direction_sb) ); + if ( wp->image_direction != edit_wp->image_direction ) + a_geotag_write_exif_gps ( wp->image, wp->coord, wp->altitude, wp->image_direction, wp->image_direction_ref, TRUE ); + } + } + + GtkTreeIter iter, first; + gtk_tree_model_get_iter_first ( GTK_TREE_MODEL(store), &first ); + if ( !gtk_combo_box_get_active_iter ( GTK_COMBO_BOX(symbolentry), &iter ) || !memcmp(&iter, &first, sizeof(GtkTreeIter)) ) { + vik_waypoint_set_symbol ( wp, NULL ); + } else { + gchar *sym; + gtk_tree_model_get ( GTK_TREE_MODEL(store), &iter, 0, (void *)&sym, -1 ); + vik_waypoint_set_symbol ( wp, sym ); + g_free(sym); + } + + gtk_widget_destroy ( dialog ); + if ( is_new ) + return entered_name; + else { + *updated = TRUE; + // See if name has been changed + if ( g_strcmp0 (default_name, entered_name ) ) + return entered_name; + else + return NULL; + } + } + } + gtk_widget_destroy ( dialog ); + return NULL; +} diff --git a/src/viktrwlayer_wpwin.h b/src/viktrwlayer_wpwin.h new file mode 100644 index 0000000..59c5a14 --- /dev/null +++ b/src/viktrwlayer_wpwin.h @@ -0,0 +1,40 @@ +/* -*- Mode: C; indent-tabs-mode: t; c-basic-offset: 4; tab-width: 4 -*- */ +/* + * viking -- GPS Data and Topo Analyzer, Explorer, and Manager + * + * Copyright (c) 2014, Rob Norris + * + * 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., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA + * + */ +#ifndef _VIKING_TRWLAYER_WPWIN_H +#define _VIKING_TRWLAYER_WPWIN_H + +#include +#include +#include "viktrwlayer.h" + +G_BEGIN_DECLS + +/* Specify if a new waypoint or not */ +/* If a new waypoint then it uses the default_name for the suggested name allowing the user to change it. + The name to use is returned + When an existing waypoint the name is shown but is not allowed to be changed and NULL is returned + */ +gchar *a_dialog_waypoint ( GtkWindow *parent, gchar *default_name, VikTrwLayer *vtl, VikWaypoint *wp, VikCoordMode coord_mode, gboolean is_new, gboolean *updated ); + +G_END_DECLS + +#endif diff --git a/src/vikutils.c b/src/vikutils.c new file mode 100644 index 0000000..687d69d --- /dev/null +++ b/src/vikutils.c @@ -0,0 +1,1001 @@ +/* -*- Mode: C; indent-tabs-mode: t; c-basic-offset: 4; tab-width: 4 -*- */ +/* + * viking -- GPS Data and Topo Analyzer, Explorer, and Manager + * + * Copyright (C) 2013-2017, Rob Norris + * + * 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., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA + * + */ +/* + * Dependencies in this file can be on anything. + * For functions with simple system dependencies put it in util.c + */ +#include +#include +#include +#include + +#include "viking.h" +#include "vikutils.h" +#include "globals.h" +#include "download.h" +#include "preferences.h" +#include "vikmapslayer.h" +#include "settings.h" +#include "ui_util.h" +#include "dir.h" +#include "misc/kdtree.h" +#include "misc/gtkhtml-private.h" + +#define FMT_MAX_NUMBER_CODES 9 + +/** + * vu_trackpoint_formatted_message: + * @format_code: String describing the message to generate + * @trkpt: The trackpoint for which the message is generated about + * @trkpt_prev: A trackpoint (presumed previous) for interpolating values with the other trackpoint (such as speed) + * @trk: The track in which the trackpoints reside + * @climb: Vertical speed (Out of band (i.e. not in a trackpoint) value for display currently only for GPSD usage) + * + * TODO: One day replace this cryptic format code with some kind of tokenizer parsing + * thus would make it more user friendly and maybe even GUI controlable. + * However for now at least there is some semblance of user control + */ +gchar* vu_trackpoint_formatted_message ( gchar *format_code, VikTrackpoint *trkpt, VikTrackpoint *trkpt_prev, VikTrack *trk, gdouble climb ) +{ + if ( !trkpt ) + return NULL; + + gint len = 0; + if ( format_code ) + len = strlen ( format_code ); + if ( len > FMT_MAX_NUMBER_CODES ) + len = FMT_MAX_NUMBER_CODES; + + gchar* values[FMT_MAX_NUMBER_CODES]; + int i; + for ( i = 0; i < FMT_MAX_NUMBER_CODES; i++ ) { + values[i] = '\0'; + } + + gchar *speed_units_str = NULL; + vik_units_speed_t speed_units = a_vik_get_units_speed (); + switch (speed_units) { + case VIK_UNITS_SPEED_MILES_PER_HOUR: + speed_units_str = g_strdup ( _("mph") ); + break; + case VIK_UNITS_SPEED_METRES_PER_SECOND: + speed_units_str = g_strdup ( _("m/s") ); + break; + case VIK_UNITS_SPEED_KNOTS: + speed_units_str = g_strdup ( _("knots") ); + break; + case VIK_UNITS_SPEED_SECONDS_PER_KM: + speed_units_str = g_strdup ( _("s/km") ); + break; + case VIK_UNITS_SPEED_MINUTES_PER_KM: + speed_units_str = g_strdup ( _("min/km") ); + break; + case VIK_UNITS_SPEED_SECONDS_PER_MILE: + speed_units_str = g_strdup ( _("sec/mi") ); + break; + case VIK_UNITS_SPEED_MINUTES_PER_MILE: + speed_units_str = g_strdup ( _("min/mi") ); + break; + default: + // VIK_UNITS_SPEED_KILOMETRES_PER_HOUR: + speed_units_str = g_strdup ( _("km/h") ); + break; + } + + gchar *separator = g_strdup ( " | " ); + + for ( i = 0; i < len; i++ ) { + switch ( g_ascii_toupper ( format_code[i] ) ) { + case 'G': values[i] = g_strdup ( _("GPSD") ); break; // GPS Preamble + case 'K': values[i] = g_strdup ( _("Trkpt") ); break; // Trkpt Preamble + + case 'S': { + gdouble speed = 0.0; + gchar *speedtype = NULL; + if ( isnan(trkpt->speed) && trkpt_prev ) { + if ( trkpt->has_timestamp && trkpt_prev->has_timestamp ) { + if ( trkpt->timestamp != trkpt_prev->timestamp ) { + + // Work out from previous trackpoint location and time difference + speed = vik_coord_diff(&(trkpt->coord), &(trkpt_prev->coord)) / ABS(trkpt->timestamp - trkpt_prev->timestamp); + speedtype = g_strdup ( "*" ); // Interpolated + } + else + speedtype = g_strdup ( "**" ); + } + else + speedtype = g_strdup ( "**" ); + } + else { + speed = trkpt->speed; + speedtype = g_strdup ( "" ); + } + switch (speed_units) { + case VIK_UNITS_SPEED_KILOMETRES_PER_HOUR: + speed = VIK_MPS_TO_KPH(speed); + break; + case VIK_UNITS_SPEED_MILES_PER_HOUR: + speed = VIK_MPS_TO_MPH(speed); + break; + case VIK_UNITS_SPEED_KNOTS: + speed = VIK_MPS_TO_KNOTS(speed); + break; + case VIK_UNITS_SPEED_SECONDS_PER_KM: + speed = VIK_MPS_TO_PACE_SPK(speed); + break; + case VIK_UNITS_SPEED_MINUTES_PER_KM: + speed = VIK_MPS_TO_PACE_MPK(speed); + break; + case VIK_UNITS_SPEED_SECONDS_PER_MILE: + speed = VIK_MPS_TO_PACE_SPM(speed); + break; + case VIK_UNITS_SPEED_MINUTES_PER_MILE: + speed = VIK_MPS_TO_PACE_SPK(speed); + break; + default: + // VIK_UNITS_SPEED_METRES_PER_SECOND: + // Already in m/s so nothing to do + break; + } + + values[i] = g_strdup_printf ( _("%sSpeed%s %.1f%s"), separator, speedtype, speed, speed_units_str ); + g_free ( speedtype ); + break; + } + + case 'B': { + gdouble speed = 0.0; + gchar *speedtype = NULL; + if ( isnan(climb) && trkpt_prev ) { + if ( trkpt->has_timestamp && trkpt_prev->has_timestamp ) { + if ( trkpt->timestamp != trkpt_prev->timestamp ) { + // Work out from previous trackpoint altitudes and time difference + // 'speed' can be negative if going downhill + speed = (trkpt->altitude - trkpt_prev->altitude) / ABS(trkpt->timestamp - trkpt_prev->timestamp); + speedtype = g_strdup ( "*" ); // Interpolated + } + else + speedtype = g_strdup ( "**" ); // Unavailable + } + else + speedtype = g_strdup ( "**" ); + } + else { + speed = climb; + speedtype = g_strdup ( "" ); + } + switch (speed_units) { + case VIK_UNITS_SPEED_KILOMETRES_PER_HOUR: + speed = VIK_MPS_TO_KPH(speed); + break; + case VIK_UNITS_SPEED_MILES_PER_HOUR: + speed = VIK_MPS_TO_MPH(speed); + break; + case VIK_UNITS_SPEED_KNOTS: + speed = VIK_MPS_TO_KNOTS(speed); + break; + case VIK_UNITS_SPEED_SECONDS_PER_KM: + speed = VIK_MPS_TO_PACE_SPK(speed); + break; + case VIK_UNITS_SPEED_MINUTES_PER_KM: + speed = VIK_MPS_TO_PACE_MPK(speed); + break; + case VIK_UNITS_SPEED_SECONDS_PER_MILE: + speed = VIK_MPS_TO_PACE_SPM(speed); + break; + case VIK_UNITS_SPEED_MINUTES_PER_MILE: + speed = VIK_MPS_TO_PACE_SPK(speed); + break; + default: + // VIK_UNITS_SPEED_METRES_PER_SECOND: + // Already in m/s so nothing to do + break; + } + // Go for 2dp as expect low values for vertical speeds + values[i] = g_strdup_printf ( _("%sClimb%s %.2f%s"), separator, speedtype, speed, speed_units_str ); + g_free ( speedtype ); + break; + } + + case 'A': { + vik_units_height_t height_units = a_vik_get_units_height (); + switch (height_units) { + case VIK_UNITS_HEIGHT_FEET: + values[i] = g_strdup_printf ( _("%sAlt %dfeet"), separator, (int)round(VIK_METERS_TO_FEET(trkpt->altitude)) ); + break; + default: + //VIK_UNITS_HEIGHT_METRES: + values[i] = g_strdup_printf ( _("%sAlt %dm"), separator, (int)round(trkpt->altitude) ); + break; + } + break; + } + + case 'C': { + gint heading = isnan(trkpt->course) ? 0 : (gint)round(trkpt->course); + values[i] = g_strdup_printf ( _("%sCourse %03d\302\260" ), separator, heading ); + break; + } + + case 'P': { + if ( trkpt_prev ) { + gint diff = (gint) round ( vik_coord_diff ( &(trkpt->coord), &(trkpt_prev->coord) ) ); + + gchar *dist_units_str = NULL; + vik_units_distance_t dist_units = a_vik_get_units_distance (); + // expect the difference between track points to be small hence use metres or yards + switch (dist_units) { + case VIK_UNITS_DISTANCE_MILES: + case VIK_UNITS_DISTANCE_NAUTICAL_MILES: + dist_units_str = g_strdup ( _("yards") ); + break; + default: + // VIK_UNITS_DISTANCE_KILOMETRES: + dist_units_str = g_strdup ( _("m") ); + break; + } + + values[i] = g_strdup_printf ( _("%sDistance diff %d%s"), separator, diff, dist_units_str ); + + g_free ( dist_units_str ); + } + break; + } + + case 'T': { + gchar *msg; + if ( trkpt->has_timestamp ) { + // Compact date time format + msg = vu_get_time_string ( &(trkpt->timestamp), "%x %X", &(trkpt->coord), NULL ); + } + else + msg = g_strdup ("--"); + values[i] = g_strdup_printf ( _("%sTime %s"), separator, msg ); + g_free ( msg ); + break; + } + + case 'M': { + if ( trkpt_prev ) { + if ( trkpt->has_timestamp && trkpt_prev->has_timestamp ) { + time_t t_diff = trkpt->timestamp - trkpt_prev->timestamp; + values[i] = g_strdup_printf ( _("%sTime diff %lds"), separator, t_diff ); + } + } + break; + } + + case 'X': values[i] = g_strdup_printf ( _("%sNo. of Sats %d"), separator, trkpt->nsats ); break; + + case 'F': { + if ( trk ) { + // Distance to the end 'Finish' (along the track) + gdouble distd = vik_track_get_length_to_trackpoint (trk, trkpt); + gdouble diste = vik_track_get_length_including_gaps ( trk ); + gdouble dist = diste - distd; + gchar *dist_units_str = NULL; + vik_units_distance_t dist_units = a_vik_get_units_distance (); + switch (dist_units) { + case VIK_UNITS_DISTANCE_MILES: + dist_units_str = g_strdup ( _("miles") ); + dist = VIK_METERS_TO_MILES(dist); + break; + case VIK_UNITS_DISTANCE_NAUTICAL_MILES: + dist_units_str = g_strdup ( _("NM") ); + dist = VIK_METERS_TO_NAUTICAL_MILES(dist); + break; + default: + // VIK_UNITS_DISTANCE_KILOMETRES: + dist_units_str = g_strdup ( _("km") ); + dist = dist / 1000.0; + break; + } + values[i] = g_strdup_printf ( _("%sTo End %.2f%s"), separator, dist, dist_units_str ); + g_free ( dist_units_str ); + } + break; + } + + case 'D': { + if ( trk ) { + // Distance from start (along the track) + gdouble distd = vik_track_get_length_to_trackpoint (trk, trkpt); + gchar *dist_units_str = NULL; + vik_units_distance_t dist_units = a_vik_get_units_distance (); + switch (dist_units) { + case VIK_UNITS_DISTANCE_MILES: + dist_units_str = g_strdup ( _("miles") ); + distd = VIK_METERS_TO_MILES(distd); + break; + case VIK_UNITS_DISTANCE_NAUTICAL_MILES: + dist_units_str = g_strdup ( _("NM") ); + distd = VIK_METERS_TO_NAUTICAL_MILES(distd); + break; + default: + // VIK_UNITS_DISTANCE_KILOMETRES: + dist_units_str = g_strdup ( _("km") ); + distd = distd / 1000.0; + break; + } + values[i] = g_strdup_printf ( _("%sDistance along %.2f%s"), separator, distd, dist_units_str ); + g_free ( dist_units_str ); + } + break; + } + + case 'L': { + // Location (Lat/Long) + gchar *lat = NULL, *lon = NULL; + struct LatLon ll; + vik_coord_to_latlon (&(trkpt->coord), &ll); + a_coords_latlon_to_string ( &ll, &lat, &lon ); + values[i] = g_strdup_printf ( "%s%s %s", separator, lat, lon ); + g_free ( lat ); + g_free ( lon ); + break; + } + + case 'N': // Name of track + if ( trk ) + values[i] = g_strdup_printf ( _("%sTrack: %s"), separator, trk->name ); + break; + + case 'E': // Name of trackpoint if available + if ( trkpt->name ) + values[i] = g_strdup_printf ( "%s%s", separator, trkpt->name ); + else + values[i] = g_strdup ( "" ); + break; + + default: + break; + } + } + + g_free ( separator ); + g_free ( speed_units_str ); + + gchar *msg = g_strconcat ( values[0], values[1], values[2], values[3], values[4], values[5], values[6], values[7], values[8], NULL ); + + for ( i = 0; i < FMT_MAX_NUMBER_CODES; i++ ) { + g_free ( values[i] ); + } + + return msg; +} + +typedef struct { + GtkWindow *window; // Layer needed for redrawing + gchar *version; // Image list +} new_version_thread_data; + +static gboolean new_version_available_message ( new_version_thread_data *nvtd ) +{ + // Only a simple goto website option is offered + // Trying to do an installation update is platform specific + if ( a_dialog_yes_or_no ( nvtd->window, + _("There is a newer version of Viking available: %s\n\nDo you wish to go to Viking's website now?"), nvtd->version ) ) + // NB 'VIKING_URL' redirects to the Wiki, here we want to go the main site. + open_url ( nvtd->window, "http://sourceforge.net/projects/viking/" ); + + g_free ( nvtd->version ); + g_free ( nvtd ); + return FALSE; +} + +#define VIK_SETTINGS_VERSION_CHECKED_DATE "version_checked_date" + +static void latest_version_thread ( GtkWindow *window ) +{ + // Need to allow a few redirects, as SF file is often served from different server + DownloadFileOptions options = { FALSE, FALSE, NULL, 5, NULL, NULL, NULL }; + gchar *filename = a_download_uri_to_tmp_file ( "http://sourceforge.net/projects/viking/files/VERSION", &options ); + //gchar *filename = g_strdup ( "VERSION" ); + if ( !filename ) { + return; + } + + GMappedFile *mf = g_mapped_file_new ( filename, FALSE, NULL ); + if ( !mf ) + return; + + gchar *text = g_mapped_file_get_contents ( mf ); + + gint latest_version = viking_version_to_number ( text ); + gint my_version = viking_version_to_number ( VIKING_VERSION ); + + g_debug ( "The lastest version is: %s", text ); + + if ( my_version < latest_version ) { + new_version_thread_data *nvtd = g_malloc ( sizeof(new_version_thread_data) ); + nvtd->window = window; + nvtd->version = g_strdup ( text ); + gdk_threads_add_idle ( (GSourceFunc) new_version_available_message, nvtd ); + } + else + g_debug ( "Running the lastest version: %s", VIKING_VERSION ); + + g_mapped_file_unref ( mf ); + if ( filename ) { + g_remove ( filename ); + g_free ( filename ); + } + + // Update last checked time + GTimeVal time; + g_get_current_time ( &time ); + a_settings_set_string ( VIK_SETTINGS_VERSION_CHECKED_DATE, g_time_val_to_iso8601(&time) ); +} + +#define VIK_SETTINGS_VERSION_CHECK_PERIOD "version_check_period_days" + +/** + * vu_check_latest_version: + * @window: Somewhere where we may need use the display to inform the user about the version status + * + * Periodically checks the released latest VERSION file on the website to compare with the running version + * + */ +void vu_check_latest_version ( GtkWindow *window ) +{ + if ( ! a_vik_get_check_version () ) + return; + + gboolean do_check = FALSE; + + gint check_period; + if ( ! a_settings_get_integer ( VIK_SETTINGS_VERSION_CHECK_PERIOD, &check_period ) ) { + check_period = 14; + } + + // Get last checked date... + GDate *gdate_last = g_date_new(); + GDate *gdate_now = g_date_new(); + GTimeVal time_last; + gchar *last_checked_date = NULL; + + // When no previous date available - set to do the version check + if ( a_settings_get_string ( VIK_SETTINGS_VERSION_CHECKED_DATE, &last_checked_date) ) { + if ( g_time_val_from_iso8601 ( last_checked_date, &time_last ) ) { + g_date_set_time_val ( gdate_last, &time_last ); + } + else + do_check = TRUE; + } + else + do_check = TRUE; + g_free ( last_checked_date ); + + GTimeVal time_now; + g_get_current_time ( &time_now ); + g_date_set_time_val ( gdate_now, &time_now ); + + if ( ! do_check ) { + // Dates available so do the comparison + g_date_add_days ( gdate_last, check_period ); + if ( g_date_compare ( gdate_last, gdate_now ) < 0 ) + do_check = TRUE; + } + + g_date_free ( gdate_last ); + g_date_free ( gdate_now ); + + if ( do_check ) { +#if GLIB_CHECK_VERSION (2, 32, 0) + g_thread_try_new ( "latest_version_thread", (GThreadFunc)latest_version_thread, window, NULL ); +#else + g_thread_create ( (GThreadFunc)latest_version_thread, window, FALSE, NULL ); +#endif + } +} + +/** + * vu_set_auto_features_on_first_run: + * + * Ask the user's opinion to set some of Viking's default behaviour + */ +void vu_set_auto_features_on_first_run ( void ) +{ + gboolean auto_features = FALSE; + gboolean set_defaults = FALSE; + + if ( a_vik_very_first_run () ) { + + GtkWidget *win = gtk_window_new ( GTK_WINDOW_TOPLEVEL ); + + if ( a_dialog_yes_or_no ( GTK_WINDOW(win), + _("This appears to be Viking's very first run.\n\nDo you wish to enable automatic internet features?\n\nIndividual settings can be controlled in the Preferences."), NULL ) ) + auto_features = TRUE; + + // Default to more standard cache layout for new users (well new installs at least) + maps_layer_set_cache_default ( VIK_MAPS_CACHE_LAYOUT_OSM ); + set_defaults = TRUE; + } + + if ( auto_features ) { + // Set Maps to autodownload + // Ensure the default is true + maps_layer_set_autodownload_default ( TRUE ); + set_defaults = TRUE; + + // Enable auto add map + + // Enable IP lookup + VikLayerParam *pref_add_map = a_preferences_get_param ( VIKING_PREFERENCES_STARTUP_NAMESPACE "add_default_map_layer" ); + VikLayerParam *pref_startup_method = a_preferences_get_param ( VIKING_PREFERENCES_STARTUP_NAMESPACE "startup_method" );; + if ( !pref_add_map || !pref_startup_method ) { + g_critical ( "%s: preference not found", __FUNCTION__ ); + goto finish; + } + + VikLayerParamData vlp_data; + vlp_data.b = TRUE; + a_preferences_run_setparam ( vlp_data, pref_add_map ); + + vlp_data.u = VIK_STARTUP_METHOD_AUTO_LOCATION; + a_preferences_run_setparam ( vlp_data, pref_startup_method ); + + // Only on Windows make checking for the latest version on by default + // For other systems it's expected a Package manager or similar controls the installation, so leave it off +#ifdef WINDOWS + VikLayerParam *pref_startup_version_check = a_preferences_get_param ( VIKING_PREFERENCES_STARTUP_NAMESPACE "check_version" ); + if ( !pref_startup_version_check ) { + g_critical ( "%s: preference not found", __FUNCTION__ ); + goto finish; + } + + vlp_data.b = TRUE; + a_preferences_run_setparam ( vlp_data, pref_startup_version_check ); +#endif + + // Ensure settings are saved for next time + a_preferences_save_to_file (); + } + + finish: + // Ensure defaults are saved if changed + if ( set_defaults ) + a_layer_defaults_save (); +} + +/** + * vu_get_canonical_filename: + * + * Returns: Canonical absolute filename + * + * Any time a path may contain a relative component, so need to prepend that directory it is relative to + * Then resolve the full path to get the normal canonical filename + */ +gchar *vu_get_canonical_filename ( VikLayer *vl, const gchar *filename ) +{ + gchar *canonical = NULL; + if ( !filename ) + return NULL; + + if ( g_path_is_absolute ( filename ) ) + canonical = g_strdup ( filename ); + else { + const gchar *vw_filename = vik_window_get_filename ( VIK_WINDOW_FROM_WIDGET (vl->vvp) ); + gchar *dirpath = NULL; + if ( vw_filename ) + dirpath = g_path_get_dirname ( vw_filename ); + else + dirpath = g_get_current_dir(); // Fallback - if here then probably can't create the correct path + + gchar *full = NULL; + if ( g_path_is_absolute ( dirpath ) ) + full = g_strconcat ( dirpath, G_DIR_SEPARATOR_S, filename, NULL ); + else + full = g_strconcat ( g_get_current_dir(), G_DIR_SEPARATOR_S, dirpath, G_DIR_SEPARATOR_S, filename, NULL ); + + canonical = file_realpath_dup ( full ); // resolved + g_free ( full ); + g_free ( dirpath ); + } + + return canonical; +} + +static struct kdtree *kd = NULL; + +/** + * load_ll_tz_dir + * @dir: The directory from which to load the latlontz.txt file + * + * Returns: The number of elements within the latlontz.txt loaded + */ +static gint load_ll_tz_dir ( const gchar *dir ) +{ + gint inserted = 0; + gchar *lltz = g_build_filename ( dir, "latlontz.txt", NULL ); + if ( g_access(lltz, R_OK) == 0 ) { + gchar buffer[4096]; + long line_num = 0; + FILE *ff = g_fopen ( lltz, "r" ); + if ( ff ) { + while ( fgets ( buffer, 4096, ff ) ) { + line_num++; + gchar **components = g_strsplit (buffer, " ", 3); + guint nn = g_strv_length ( components ); + if ( nn == 3 ) { + double pt[2] = { g_ascii_strtod (components[0], NULL), g_ascii_strtod (components[1], NULL) }; + gchar *timezone = g_strchomp ( components[2] ); + if ( kd_insert ( kd, pt, timezone ) ) + g_critical ( "Insertion problem of %s for line %ld of latlontz.txt", timezone, line_num ); + else + inserted++; + // NB Don't free timezone as it's part of the kdtree data now + g_free ( components[0] ); + g_free ( components[1] ); + } else { + g_warning ( "Line %ld of latlontz.txt does not have 3 parts", line_num ); + } + g_free ( components ); + } + fclose ( ff ); + } + else { + g_warning ( "%s: Could not open %s", __FUNCTION__, lltz); + } + } + g_free ( lltz ); + + return inserted; +} + +/** + * vu_setup_lat_lon_tz_lookup: + * + * Can be called multiple times but only initializes the lookup once + */ +void vu_setup_lat_lon_tz_lookup () +{ + // Only setup once + if ( kd ) + return; + + kd = kd_create(2); + + // Look in the directories of data path + gchar **data_dirs = a_get_viking_data_path(); + guint loaded = 0; + // Process directories in reverse order for priority + guint n_data_dirs = g_strv_length ( data_dirs ); + for (; n_data_dirs > 0; n_data_dirs--) { + loaded += load_ll_tz_dir(data_dirs[n_data_dirs-1]); + } + g_strfreev ( data_dirs ); + + g_debug ( "%s: Loaded %d elements", __FUNCTION__, loaded ); + if ( loaded == 0 ) + g_critical ( "%s: No lat/lon/timezones loaded", __FUNCTION__ ); +} + +/** + * vu_finalize_lat_lon_tz_lookup: + * + * Clear memory used by the lookup. + * only call on program exit + */ +void vu_finalize_lat_lon_tz_lookup () +{ + if ( kd ) { + kd_data_destructor ( kd, g_free ); + kd_free ( kd ); + } +} + +static double dist_sq( double *a1, double *a2, int dims ) { + double dist_sq = 0, diff; + while( --dims >= 0 ) { + diff = (a1[dims] - a2[dims]); + dist_sq += diff*diff; + } + return dist_sq; +} + +static gchar* time_string_adjusted ( time_t *time, gint offset_s ) +{ + time_t *mytime = time; + *mytime = *mytime + offset_s; + gchar *str = g_malloc ( 64 ); + // Append asterisks to indicate use of simplistic model (i.e. no TZ) + strftime ( str, 64, "%a %X %x **", gmtime(mytime) ); + return str; +} + +static gchar* time_string_tz ( time_t *time, const gchar *format, GTimeZone *tz ) +{ + GDateTime *utc = g_date_time_new_from_unix_utc (*time); + if ( !utc ) { + g_warning ( "%s: result from g_date_time_new_from_unix_utc() is NULL", __FUNCTION__ ); + return NULL; + } + GDateTime *local = g_date_time_to_timezone ( utc, tz ); + if ( !local ) { + g_date_time_unref ( utc ); + g_warning ( "%s: result from g_date_time_to_timezone() is NULL", __FUNCTION__ ); + return NULL; + } + gchar *str = g_date_time_format ( local, format ); + + g_date_time_unref ( local ); + g_date_time_unref ( utc ); + return str; +} + +#define VIK_SETTINGS_NEAREST_TZ_FACTOR "utils_nearest_tz_factor" +/** + * vu_get_tz_at_location: + * + * @vc: Position for which the time zone is desired + * + * Returns: TimeZone string of the nearest known location. String may be NULL. + * + * Use the k-d tree method (http://en.wikipedia.org/wiki/Kd-tree) to quickly retreive + * the nearest location to the given position. + */ +gchar* vu_get_tz_at_location ( const VikCoord* vc ) +{ + gchar *tz = NULL; + if ( !vc || !kd ) + return tz; + + struct LatLon ll; + vik_coord_to_latlon ( vc, &ll ); + double pt[2] = { ll.lat, ll.lon }; + + gdouble nearest; + if ( !a_settings_get_double(VIK_SETTINGS_NEAREST_TZ_FACTOR, &nearest) ) + nearest = 1.0; + + struct kdres *presults = kd_nearest_range ( kd, pt, nearest ); + while( !kd_res_end( presults ) ) { + double pos[2]; + gchar *ans = (gchar*)kd_res_item ( presults, pos ); + // compute the distance of the current result from the pt + double dist = sqrt( dist_sq( pt, pos, 2 ) ); + if ( dist < nearest ) { + //printf( "NEARER node at (%.3f, %.3f, %.3f) is %.3f away is %s\n", pos[0], pos[1], pos[2], dist, ans ); + nearest = dist; + tz = ans; + } + kd_res_next ( presults ); + } + g_debug ( "TZ lookup found %d results - picked %s", kd_res_size(presults), tz ); + kd_res_free ( presults ); + + return tz; +} + +/** + * vu_get_time_string: + * + * @time_t: The time of which the string is wanted + * @format The format of the time string - such as "%c" + * @vc: Position of object for the time output - maybe NULL + * (only applicable for VIK_TIME_REF_WORLD) + * @tz: TimeZone string - maybe NULL. + * (only applicable for VIK_TIME_REF_WORLD) + * Useful to pass in the cached value from vu_get_tz_at_location() to save looking it up again for the same position + * + * Returns: A string of the time according to the time display property + */ +gchar* vu_get_time_string ( time_t *time, const gchar *format, const VikCoord* vc, const gchar *tz ) +{ + if ( !format ) return NULL; + gchar *str = NULL; + switch ( a_vik_get_time_ref_frame() ) { + case VIK_TIME_REF_UTC: + str = g_malloc ( 64 ); + strftime ( str, 64, format, gmtime(time) ); // Always 'GMT' + break; + case VIK_TIME_REF_WORLD: + if ( vc && !tz ) { + // No timezone specified so work it out + gchar *mytz = vu_get_tz_at_location ( vc ); + if ( mytz ) { + GTimeZone *gtz = g_time_zone_new ( mytz ); + str = time_string_tz ( time, format, gtz ); + g_time_zone_unref ( gtz ); + } + else { + // No results (e.g. could be in the middle of a sea) + // Fallback to simplistic method that doesn't take into account Timezones of countries. + struct LatLon ll; + vik_coord_to_latlon ( vc, &ll ); + str = time_string_adjusted ( time, round ( ll.lon / 15.0 ) * 3600 ); + } + } + else { + // Use specified timezone + GTimeZone *gtz = g_time_zone_new ( tz ); + str = time_string_tz ( time, format, gtz ); + g_time_zone_unref ( gtz ); + } + break; + default: // VIK_TIME_REF_LOCALE + str = g_malloc ( 64 ); + strftime ( str, 64, format, localtime(time) ); + break; + } + return str; +} + +/** + * vu_command_line: + * + * Apply any startup values that have been specified from the command line + * Values are defaulted in such a manner not to be applied when they haven't been specified + * + */ +void vu_command_line ( VikWindow *vw, gdouble latitude, gdouble longitude, gint zoom_osm_level, gint map_id ) +{ + if ( !vw ) + return; + + VikViewport *vvp = vik_window_viewport(vw); + + if ( latitude != 0.0 || longitude != 0.0 ) { + struct LatLon ll; + ll.lat = latitude; + ll.lon = longitude; + vik_viewport_set_center_latlon ( vvp, &ll, TRUE ); + } + + if ( zoom_osm_level >= 0 ) { + // Convert OSM zoom level into Viking zoom level + gdouble mpp = exp ( (17-zoom_osm_level) * log(2) ); + if ( mpp > 1.0 ) + mpp = round (mpp); + vik_viewport_set_zoom ( vvp, mpp ); + } + + if ( map_id >= 0 ) { + guint my_map_id = map_id; + if ( my_map_id == 0 ) + my_map_id = vik_maps_layer_get_default_map_type (); + + // Don't add map layer if one already exists + GList *vmls = vik_layers_panel_get_all_layers_of_type(vik_window_layers_panel(vw), VIK_LAYER_MAPS, TRUE); + int num_maps = g_list_length(vmls); + gboolean add_map = TRUE; + + for (int i = 0; i < num_maps; i++) { + VikMapsLayer *vml = (VikMapsLayer*)(vmls->data); + gint id = vik_maps_layer_get_map_type(vml); + if ( my_map_id == id ) { + add_map = FALSE; + break; + } + vmls = vmls->next; + } + + if ( add_map ) { + VikMapsLayer *vml = VIK_MAPS_LAYER ( vik_layer_create(VIK_LAYER_MAPS, vvp, FALSE) ); + vik_maps_layer_set_map_type ( vml, my_map_id ); + vik_layer_rename ( VIK_LAYER(vml), _("Map") ); + vik_aggregate_layer_add_layer ( vik_layers_panel_get_top_layer(vik_window_layers_panel(vw)), VIK_LAYER(vml), TRUE ); + vik_layer_emit_update ( VIK_LAYER(vml) ); + } + } +} + +/** + * Copy the displayed text of a widget (should be a GtkButton ATM) + */ +static void vu_copy_label ( GtkWidget *widget ) +{ + a_clipboard_copy (VIK_CLIPBOARD_DATA_TEXT, 0, 0, 0, gtk_button_get_label(GTK_BUTTON(widget)), NULL ); +} + +/** + * Generate a single entry menu to allow copying the displayed text of a widget (should be a GtkButton ATM) + */ +void vu_copy_label_menu ( GtkWidget *widget, guint button ) +{ + GtkWidget *menu = gtk_menu_new(); + GtkWidget *item = gtk_image_menu_item_new_from_stock ( GTK_STOCK_COPY, NULL ); + g_signal_connect_swapped ( G_OBJECT(item), "activate", G_CALLBACK(vu_copy_label), widget ); + gtk_menu_shell_append ( GTK_MENU_SHELL(menu), item ); + gtk_widget_show ( item ); + gtk_menu_popup ( GTK_MENU(menu), NULL, NULL, NULL, NULL, button, gtk_get_current_event_time() ); +} + +/** + * Work out the best zoom level for the LatLon area and set the viewport to that zoom level + */ +void vu_zoom_to_show_latlons ( VikCoordMode mode, VikViewport *vvp, struct LatLon maxmin[2] ) +{ + /* First set the center [in case previously viewing from elsewhere] */ + /* Then loop through zoom levels until provided positions are in view */ + /* This method is not particularly fast - but should work well enough */ + struct LatLon average = { (maxmin[0].lat+maxmin[1].lat)/2, (maxmin[0].lon+maxmin[1].lon)/2 }; + VikCoord coord; + vik_coord_load_from_latlon ( &coord, mode, &average ); + vik_viewport_set_center_coord ( vvp, &coord, TRUE ); + + /* Convert into definite 'smallest' and 'largest' positions */ + struct LatLon minmin; + if ( maxmin[0].lat < maxmin[1].lat ) + minmin.lat = maxmin[0].lat; + else + minmin.lat = maxmin[1].lat; + + struct LatLon maxmax; + if ( maxmin[0].lon > maxmin[1].lon ) + maxmax.lon = maxmin[0].lon; + else + maxmax.lon = maxmin[1].lon; + + /* Never zoom in too far - generally not that useful, as too close ! */ + /* Always recalculate the 'best' zoom level */ + gdouble zoom = 1.0; + vik_viewport_set_zoom ( vvp, zoom ); + + gdouble min_lat, max_lat, min_lon, max_lon; + /* Should only be a maximum of about 18 iterations from min to max zoom levels */ + while ( zoom <= VIK_VIEWPORT_MAX_ZOOM ) { + vik_viewport_get_min_max_lat_lon ( vvp, &min_lat, &max_lat, &min_lon, &max_lon ); + /* NB I think the logic used in this test to determine if the bounds is within view + fails if track goes across 180 degrees longitude. + Hopefully that situation is not too common... + Mind you viking doesn't really do edge locations to well anyway */ + if ( min_lat < minmin.lat && + max_lat > minmin.lat && + min_lon < maxmax.lon && + max_lon > maxmax.lon ) + /* Found within zoom level */ + break; + + /* Try next */ + zoom = zoom * 2; + vik_viewport_set_zoom ( vvp, zoom ); + } +} + +/** + * Set the waypoint image given a URI + */ +void vu_waypoint_set_image_uri ( VikWaypoint *wp, const gchar *uri, const gchar *dirpath ) +{ + gchar *filename = gtk_html_filename_from_uri ( uri ); + if ( g_path_is_absolute ( filename ) ) { + vik_waypoint_set_image ( wp, filename ); + } + else { + // Try to form full path + gchar *full = g_strconcat ( dirpath, G_DIR_SEPARATOR_S, filename, NULL ); + vik_waypoint_set_image ( wp, full ); + g_free ( full ); + } +} + +/** + * Set a calendar widget to today's date + */ +void vu_calendar_set_to_today (GtkWidget *cal) +{ + GDateTime *now = g_date_time_new_now_local (); + gtk_calendar_select_month ( GTK_CALENDAR(cal), g_date_time_get_month(now)-1, g_date_time_get_year(now) ); + gtk_calendar_select_day ( GTK_CALENDAR(cal), g_date_time_get_day_of_month(now) ); + g_date_time_unref ( now ); +} diff --git a/src/vikutils.h b/src/vikutils.h new file mode 100644 index 0000000..530753f --- /dev/null +++ b/src/vikutils.h @@ -0,0 +1,58 @@ +/* -*- Mode: C; indent-tabs-mode: t; c-basic-offset: 4; tab-width: 4 -*- */ +/* + * viking -- GPS Data and Topo Analyzer, Explorer, and Manager + * + * Copyright (C) 2013, Rob Norris + * + * 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., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA + * + */ +#ifndef __VIKING_UTILS_H +#define __VIKING_UTILS_H + +#include +#include "viktrwlayer.h" + +G_BEGIN_DECLS + +gchar* vu_trackpoint_formatted_message ( gchar *format_code, VikTrackpoint *trkpt, VikTrackpoint *trkpt_prev, VikTrack *trk, gdouble climb ); + +void vu_check_latest_version ( GtkWindow *window ); + +void vu_set_auto_features_on_first_run ( void ); + +gchar *vu_get_canonical_filename ( VikLayer *vl, const gchar *filename ); + +gchar* vu_get_time_string ( time_t *time, const gchar *format, const VikCoord *vc, const gchar *gtz ); + +gchar* vu_get_tz_at_location ( const VikCoord* vc ); + +void vu_setup_lat_lon_tz_lookup (); +void vu_finalize_lat_lon_tz_lookup (); + +void vu_command_line ( VikWindow *vw, gdouble latitude, gdouble longitude, gint zoom_osm_level, gint map_id ); + +void vu_copy_label_menu ( GtkWidget *widget, guint button ); + +void vu_zoom_to_show_latlons ( VikCoordMode mode, VikViewport *vvp, struct LatLon maxmin[2] ); + +void vu_waypoint_set_image_uri ( VikWaypoint *wp, const gchar *uri, const gchar *dirpath ); + +void vu_calendar_set_to_today ( GtkWidget *cal ); + +G_END_DECLS + +#endif + diff --git a/src/vikviewport.c b/src/vikviewport.c new file mode 100644 index 0000000..c26c83c --- /dev/null +++ b/src/vikviewport.c @@ -0,0 +1,1763 @@ +/* + * viking -- GPS Data and Topo Analyzer, Explorer, and Manager + * + * Copyright (C) 2003-2007, Evan Battaglia + * Copyright (C) 2013, Rob Norris + * + * Lat/Lon plotting functions calcxy* are from GPSDrive + * GPSDrive Copyright (C) 2001-2004 Fritz Ganter + * + * Multiple UTM zone patch by Kit Transue + * + * 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., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA + * + */ +#ifdef HAVE_CONFIG_H +#include "config.h" +#endif + +#define DEFAULT_BACKGROUND_COLOR "#CCCCCC" +#define DEFAULT_HIGHLIGHT_COLOR "#EEA500" +/* Default highlight in orange */ + +#include +#ifdef HAVE_MATH_H +#include +#endif +#ifdef HAVE_STRING_H +#include +#endif + +#include "coords.h" +#include "vikcoord.h" +#include "vikwindow.h" +#include "vikviewport.h" +#include "mapcoord.h" + +/* for ALTI_TO_MPP */ +#include "globals.h" +#include "settings.h" +#include "dialog.h" + +static gdouble mercator_factor ( gdouble x, guint scale ) +{ + return (65536.0 / 180 / x) * 256.0 * scale; +} + +static gdouble EASTING_OFFSET = 500000.0; + +static gint PAD = 10; + +static void viewport_finalize ( GObject *gob ); +static void viewport_utm_zone_check ( VikViewport *vvp ); +static void update_centers ( VikViewport *vvp ); +static void free_centers ( VikViewport *vvp, guint start ); + +static gboolean calcxy(double *x, double *y, double lg, double lt, double zero_long, double zero_lat, double pixelfact_x, double pixelfact_y, gint mapSizeX2, gint mapSizeY2 ); +static gboolean calcxy_rev(double *lg, double *lt, gint x, gint y, double zero_long, double zero_lat, double pixelfact_x, double pixelfact_y, gint mapSizeX2, gint mapSizeY2 ); +double calcR (double lat); + +static double Radius[181]; +static void viewport_init_ra(); + +static GObjectClass *parent_class; + +struct _VikViewport { + GtkDrawingArea drawing_area; + GdkPixmap *scr_buffer; + gint width, height; + gint width_2, height_2; // Half of the normal width and height + VikCoord center; + VikCoordMode coord_mode; + gdouble xmpp, ympp; + gdouble xmfactor, ymfactor; + guint scale; // Permanent scale regardless of the zoom level + GList *centers; // The history of requested positions (of VikCoord type) + guint centers_index; // current position within the history list + guint centers_max; // configurable maximum size of the history list + guint centers_radius; // Metres + + gdouble utm_zone_width; + gboolean one_utm_zone; + + GdkGC *background_gc; + GdkColor background_color; + GdkGC *scale_bg_gc; + GdkGC *black_gc; + + GSList *copyrights; + GSList *logos; + + /* Wether or not display OSD info */ + gboolean draw_scale; + gboolean draw_centermark; + gboolean draw_highlight; + GdkGC *highlight_gc; + GdkColor highlight_color; + + /* subset of coord types. lat lon can be plotted in 2 ways, google or exp. */ + VikViewportDrawMode drawmode; + + /* trigger stuff */ + gpointer trigger; + GdkPixmap *snapshot_buffer; + gboolean half_drawn; +}; + +static gdouble +viewport_utm_zone_width ( VikViewport *vvp ) +{ + if ( vvp->coord_mode == VIK_COORD_UTM ) { + struct LatLon ll; + + /* get latitude of screen bottom */ + struct UTM utm = *((struct UTM *)(vik_viewport_get_center ( vvp ))); + utm.northing -= vvp -> height * vvp -> ympp / 2; + a_coords_utm_to_latlon ( &utm, &ll ); + + /* boundary */ + ll.lon = (utm.zone - 1) * 6 - 180 ; + a_coords_latlon_to_utm ( &ll, &utm); + return fabs ( utm.easting - EASTING_OFFSET ) * 2; + } else + return 0.0; +} + +enum { + VW_UPDATED_CENTER_SIGNAL = 0, + VW_LAST_SIGNAL, +}; +static guint viewport_signals[VW_LAST_SIGNAL] = { 0 }; + +G_DEFINE_TYPE (VikViewport, vik_viewport, GTK_TYPE_DRAWING_AREA) + +static void +vik_viewport_class_init ( VikViewportClass *klass ) +{ + /* Destructor */ + GObjectClass *object_class; + + object_class = G_OBJECT_CLASS (klass); + + object_class->finalize = viewport_finalize; + + parent_class = g_type_class_peek_parent (klass); + + viewport_signals[VW_UPDATED_CENTER_SIGNAL] = g_signal_new ( "updated_center", G_TYPE_FROM_CLASS (klass), + G_SIGNAL_RUN_FIRST | G_SIGNAL_ACTION, G_STRUCT_OFFSET (VikViewportClass, updated_center), NULL, NULL, + g_cclosure_marshal_VOID__VOID, G_TYPE_NONE, 0); +} + +VikViewport *vik_viewport_new () +{ + VikViewport *vv = VIK_VIEWPORT ( g_object_new ( VIK_VIEWPORT_TYPE, NULL ) ); + return vv; +} + +#define VIK_SETTINGS_VIEW_LAST_LATITUDE "viewport_last_latitude" +#define VIK_SETTINGS_VIEW_LAST_LONGITUDE "viewport_last_longitude" +#define VIK_SETTINGS_VIEW_LAST_ZOOM_X "viewport_last_zoom_xpp" +#define VIK_SETTINGS_VIEW_LAST_ZOOM_Y "viewport_last_zoom_ypp" +#define VIK_SETTINGS_VIEW_HISTORY_SIZE "viewport_history_size" +#define VIK_SETTINGS_VIEW_HISTORY_DIFF_DIST "viewport_history_diff_dist" +#define VIK_SETTINGS_VIEW_SCALE "viewport_scale" + +// Hacky method to enable to return a scale value +// Mostly for places in code, such as initializers, where they have no knowledge of any vvp in use. +// Even if there were multiple ones - it's unlikely they would have different scales. +static VikViewport* default_vvp = NULL; + +guint vik_viewport_get_scale ( VikViewport *vvp ) +{ + if ( vvp ) + return vvp->scale; + else if ( default_vvp ) + return default_vvp->scale; + else + return 1; +} + +void init_scale ( VikViewport *vvp ) +{ + // The default scale + vvp->scale = 1; + // GTK3+ required + // gtk_widget_get_scale_factor (GTK_WIDGET(x)); + // Further note the scale can change during runtime + // ATM Just initialize only + gint res = gdk_screen_get_resolution ( gdk_screen_get_default() ); + g_debug ( "%s: Screen Resolution is '%d'\n", __FUNCTION__, res ); + if ( res > 50 ) { + vvp->scale = round (res / 96.0); + g_debug ( "%s: Scale set to '%d'\n", __FUNCTION__, vvp->scale ); + } + // Allow override by user + gint tmp = vvp->scale; + if ( a_settings_get_integer ( VIK_SETTINGS_VIEW_SCALE, &tmp ) ) + vvp->scale = (guint)tmp; +} + +static void +vik_viewport_init ( VikViewport *vvp ) +{ + viewport_init_ra(); + + struct UTM utm; + struct LatLon ll; + ll.lat = a_vik_get_default_lat(); + ll.lon = a_vik_get_default_long(); + gdouble zoom_x = 4.0; + gdouble zoom_y = 4.0; + + if ( a_vik_get_startup_method ( ) == VIK_STARTUP_METHOD_LAST_LOCATION ) { + gdouble lat, lon, dzoom; + if ( a_settings_get_double ( VIK_SETTINGS_VIEW_LAST_LATITUDE, &lat ) ) + ll.lat = lat; + if ( a_settings_get_double ( VIK_SETTINGS_VIEW_LAST_LONGITUDE, &lon ) ) + ll.lon = lon; + if ( a_settings_get_double ( VIK_SETTINGS_VIEW_LAST_ZOOM_X, &dzoom ) ) + zoom_x = dzoom; + if ( a_settings_get_double ( VIK_SETTINGS_VIEW_LAST_ZOOM_Y, &dzoom ) ) + zoom_y = dzoom; + } + + a_coords_latlon_to_utm ( &ll, &utm ); + + vvp->xmpp = zoom_x; + vvp->ympp = zoom_y; + init_scale ( vvp ); + vvp->xmfactor = mercator_factor ( vvp->xmpp, vvp->scale ); + vvp->ymfactor = mercator_factor ( vvp->ympp, vvp->scale ); + vvp->coord_mode = VIK_COORD_LATLON; + vvp->drawmode = VIK_VIEWPORT_DRAWMODE_MERCATOR; + vvp->center.mode = VIK_COORD_LATLON; + vvp->center.north_south = ll.lat; + vvp->center.east_west = ll.lon; + vvp->center.utm_zone = (int)utm.zone; + vvp->center.utm_letter = utm.letter; + vvp->scr_buffer = NULL; + vvp->utm_zone_width = 0.0; + vvp->background_gc = NULL; + vvp->highlight_gc = NULL; + vvp->black_gc = NULL; + vvp->scale_bg_gc = NULL; + + vvp->copyrights = NULL; + vvp->centers = NULL; + vvp->centers_index = 0; + vvp->centers_max = 20; + gint tmp = vvp->centers_max; + if ( a_settings_get_integer ( VIK_SETTINGS_VIEW_HISTORY_SIZE, &tmp ) ) + vvp->centers_max = tmp; + vvp->centers_radius = 500; + if ( a_settings_get_integer ( VIK_SETTINGS_VIEW_HISTORY_DIFF_DIST, &tmp ) ) + vvp->centers_radius = tmp; + + vvp->draw_scale = TRUE; + vvp->draw_centermark = TRUE; + vvp->draw_highlight = TRUE; + + vvp->trigger = NULL; + vvp->snapshot_buffer = NULL; + vvp->half_drawn = FALSE; + + // Initiate center history + update_centers ( vvp ); + + g_signal_connect (G_OBJECT(vvp), "configure_event", G_CALLBACK(vik_viewport_configure), NULL); + +#if GTK_CHECK_VERSION (2,18,0) + gtk_widget_set_can_focus ( GTK_WIDGET(vvp), TRUE ); +#else + GTK_WIDGET_SET_FLAGS(vvp, GTK_CAN_FOCUS); /* allow VVP to have focus -- enabling key events, etc */ +#endif + + default_vvp = vvp; +} + +GdkColor *vik_viewport_get_background_gdkcolor ( VikViewport *vvp ) +{ + GdkColor *rv = g_malloc ( sizeof ( GdkColor ) ); + *rv = vvp->background_color; + return rv; +} + +/* returns pointer to internal static storage, changes next time function called, use quickly */ +const gchar *vik_viewport_get_background_color ( VikViewport *vvp ) +{ + static gchar color[8]; + g_snprintf(color, sizeof(color), "#%.2x%.2x%.2x", (int)(vvp->background_color.red/256),(int)(vvp->background_color.green/256),(int)(vvp->background_color.blue/256)); + return color; +} + +void vik_viewport_set_background_color ( VikViewport *vvp, const gchar *colorname ) +{ + g_assert ( vvp && vvp->background_gc ); + if ( gdk_color_parse ( colorname, &(vvp->background_color) ) ) + gdk_gc_set_rgb_fg_color ( vvp->background_gc, &(vvp->background_color) ); + else + g_warning("%s: Failed to parse color '%s'", __FUNCTION__, colorname); +} + +void vik_viewport_set_background_gdkcolor ( VikViewport *vvp, GdkColor *color ) +{ + g_assert ( vvp && vvp->background_gc ); + vvp->background_color = *color; + gdk_gc_set_rgb_fg_color ( vvp->background_gc, color ); +} + +GdkColor *vik_viewport_get_highlight_gdkcolor ( VikViewport *vvp ) +{ + GdkColor *rv = g_malloc ( sizeof ( GdkColor ) ); + *rv = vvp->highlight_color; + return rv; +} + +/* returns pointer to internal static storage, changes next time function called, use quickly */ +const gchar *vik_viewport_get_highlight_color ( VikViewport *vvp ) +{ + static gchar color[8]; + g_snprintf(color, sizeof(color), "#%.2x%.2x%.2x", (int)(vvp->highlight_color.red/256),(int)(vvp->highlight_color.green/256),(int)(vvp->highlight_color.blue/256)); + return color; +} + +void vik_viewport_set_highlight_color ( VikViewport *vvp, const gchar *colorname ) +{ + g_assert ( vvp->highlight_gc ); + gdk_color_parse ( colorname, &(vvp->highlight_color) ); + gdk_gc_set_rgb_fg_color ( vvp->highlight_gc, &(vvp->highlight_color) ); +} + +void vik_viewport_set_highlight_gdkcolor ( VikViewport *vvp, GdkColor *color ) +{ + g_assert ( vvp->highlight_gc ); + vvp->highlight_color = *color; + gdk_gc_set_rgb_fg_color ( vvp->highlight_gc, color ); +} + +GdkGC *vik_viewport_get_gc_highlight ( VikViewport *vvp ) +{ + return vvp->highlight_gc; +} + +void vik_viewport_set_highlight_thickness ( VikViewport *vvp, gint thickness ) +{ + // Otherwise same GDK_* attributes as in vik_viewport_new_gc + gdk_gc_set_line_attributes ( vvp->highlight_gc, thickness, GDK_LINE_SOLID, GDK_CAP_ROUND, GDK_JOIN_ROUND ); +} + +GdkGC *vik_viewport_new_gc ( VikViewport *vvp, const gchar *colorname, gint thickness ) +{ + GdkGC *rv = NULL; + GdkColor color; + + rv = gdk_gc_new ( gtk_widget_get_window(GTK_WIDGET(vvp)) ); + if ( gdk_color_parse ( colorname, &color ) ) + gdk_gc_set_rgb_fg_color ( rv, &color ); + else + g_warning("%s: Failed to parse color '%s'", __FUNCTION__, colorname); + gdk_gc_set_line_attributes ( rv, thickness, GDK_LINE_SOLID, GDK_CAP_ROUND, GDK_JOIN_ROUND ); + return rv; +} + +GdkGC *vik_viewport_new_gc_from_color ( VikViewport *vvp, GdkColor *color, gint thickness ) +{ + GdkGC *rv; + + rv = gdk_gc_new ( gtk_widget_get_window(GTK_WIDGET(vvp)) ); + gdk_gc_set_rgb_fg_color ( rv, color ); + gdk_gc_set_line_attributes ( rv, thickness, GDK_LINE_SOLID, GDK_CAP_ROUND, GDK_JOIN_ROUND ); + return rv; +} + +GdkGC* vik_viewport_get_black_gc ( VikViewport *vvp ) +{ + return vvp->black_gc; +} + +void vik_viewport_configure_manually ( VikViewport *vvp, gint width, guint height ) +{ + vvp->width = width; + vvp->height = height; + + vvp->width_2 = vvp->width/2; + vvp->height_2 = vvp->height/2; + + if ( vvp->scr_buffer ) + g_object_unref ( G_OBJECT ( vvp->scr_buffer ) ); + vvp->scr_buffer = gdk_pixmap_new ( gtk_widget_get_window(GTK_WIDGET(vvp)), vvp->width, vvp->height, -1 ); + + /* TODO trigger: only if this is enabled !!! */ + if ( vvp->snapshot_buffer ) + g_object_unref ( G_OBJECT ( vvp->snapshot_buffer ) ); + vvp->snapshot_buffer = gdk_pixmap_new ( gtk_widget_get_window(GTK_WIDGET(vvp)), vvp->width, vvp->height, -1 ); +} + + +GdkPixmap *vik_viewport_get_pixmap ( VikViewport *vvp ) +{ + return vvp->scr_buffer; +} + +gboolean vik_viewport_configure ( VikViewport *vvp ) +{ + g_return_val_if_fail ( vvp != NULL, TRUE ); + + GtkAllocation allocation; + gtk_widget_get_allocation ( GTK_WIDGET(vvp), &allocation ); + vvp->width = allocation.width; + vvp->height = allocation.height; + + vvp->width_2 = vvp->width/2; + vvp->height_2 = vvp->height/2; + + if ( vvp->scr_buffer ) + g_object_unref ( G_OBJECT ( vvp->scr_buffer ) ); + + vvp->scr_buffer = gdk_pixmap_new ( gtk_widget_get_window(GTK_WIDGET(vvp)), vvp->width, vvp->height, -1 ); + + /* TODO trigger: only if enabled! */ + if ( vvp->snapshot_buffer ) + g_object_unref ( G_OBJECT ( vvp->snapshot_buffer ) ); + + vvp->snapshot_buffer = gdk_pixmap_new ( gtk_widget_get_window(GTK_WIDGET(vvp)), vvp->width, vvp->height, -1 ); + /* TODO trigger */ + + /* this is down here so it can get a GC (necessary?) */ + if ( !vvp->background_gc ) + { + vvp->background_gc = vik_viewport_new_gc ( vvp, DEFAULT_BACKGROUND_COLOR, 1 ); + vik_viewport_set_background_color ( vvp, DEFAULT_BACKGROUND_COLOR ); + } + if ( ! vvp->highlight_gc ) + { + vvp->highlight_gc = vik_viewport_new_gc ( vvp, DEFAULT_HIGHLIGHT_COLOR, 1 ); + vik_viewport_set_highlight_color ( vvp, DEFAULT_HIGHLIGHT_COLOR ); + } + + if ( !vvp->scale_bg_gc) { + vvp->scale_bg_gc = vik_viewport_new_gc(vvp, "grey", 3*vvp->scale); + } + + if ( !vvp->black_gc ) { + vvp->black_gc = vik_viewport_new_gc ( vvp, "black", vvp->scale ); + } + return FALSE; +} + +static void viewport_finalize ( GObject *gob ) +{ + VikViewport *vvp = VIK_VIEWPORT(gob); + + g_return_if_fail ( vvp != NULL ); + + if ( a_vik_get_startup_method ( ) == VIK_STARTUP_METHOD_LAST_LOCATION ) { + struct LatLon ll; + vik_coord_to_latlon ( &(vvp->center), &ll ); + a_settings_set_double ( VIK_SETTINGS_VIEW_LAST_LATITUDE, ll.lat ); + a_settings_set_double ( VIK_SETTINGS_VIEW_LAST_LONGITUDE, ll.lon ); + a_settings_set_double ( VIK_SETTINGS_VIEW_LAST_ZOOM_X, vvp->xmpp ); + a_settings_set_double ( VIK_SETTINGS_VIEW_LAST_ZOOM_Y, vvp->ympp ); + } + + if ( vvp->centers ) + free_centers ( vvp, 0 ); + + if ( vvp->scr_buffer ) + g_object_unref ( G_OBJECT ( vvp->scr_buffer ) ); + + if ( vvp->snapshot_buffer ) + g_object_unref ( G_OBJECT ( vvp->snapshot_buffer ) ); + + if ( vvp->background_gc ) + g_object_unref ( G_OBJECT ( vvp->background_gc ) ); + + if ( vvp->highlight_gc ) + g_object_unref ( G_OBJECT ( vvp->highlight_gc ) ); + + if ( vvp->scale_bg_gc ) { + g_object_unref ( G_OBJECT ( vvp->scale_bg_gc ) ); + vvp->scale_bg_gc = NULL; + } + + if ( vvp->black_gc ) { + g_object_unref ( G_OBJECT ( vvp->black_gc ) ); + vvp->black_gc = NULL; + } + + G_OBJECT_CLASS(parent_class)->finalize(gob); +} + +/** + * vik_viewport_clear: + * @vvp: self object + * + * Clear the whole viewport. + */ +void vik_viewport_clear ( VikViewport *vvp ) +{ + g_return_if_fail ( vvp != NULL ); + gdk_draw_rectangle(GDK_DRAWABLE(vvp->scr_buffer), vvp->background_gc, TRUE, 0, 0, vvp->width, vvp->height); + vik_viewport_reset_copyrights ( vvp ); + vik_viewport_reset_logos ( vvp ); +} + +/** + * vik_viewport_set_draw_scale: + * @vvp: self + * @draw_scale: new value + * + * Enable/Disable display of scale. + */ +void vik_viewport_set_draw_scale ( VikViewport *vvp, gboolean draw_scale ) +{ + vvp->draw_scale = draw_scale; +} + +gboolean vik_viewport_get_draw_scale ( VikViewport *vvp ) +{ + return vvp->draw_scale; +} + +void vik_viewport_draw_scale ( VikViewport *vvp ) +{ + g_return_if_fail ( vvp != NULL ); + + if ( vvp->draw_scale ) { + VikCoord left, right; + gdouble unit, base, diff, old_unit, old_diff, ratio; + gint odd, len, SCSIZE = 5, HEIGHT=10; + PangoLayout *pl; + gchar s[128]; + + vik_viewport_screen_to_coord ( vvp, 0, vvp->height/2, &left ); + vik_viewport_screen_to_coord ( vvp, vvp->width/SCSIZE, vvp->height/2, &right ); + + vik_units_distance_t dist_units = a_vik_get_units_distance (); + switch (dist_units) { + case VIK_UNITS_DISTANCE_KILOMETRES: + base = vik_coord_diff ( &left, &right ); // in meters + break; + case VIK_UNITS_DISTANCE_MILES: + // in 0.1 miles (copes better when zoomed in as 1 mile can be too big) + base = VIK_METERS_TO_MILES(vik_coord_diff ( &left, &right )) * 10.0; + break; + case VIK_UNITS_DISTANCE_NAUTICAL_MILES: + // in 0.1 NM (copes better when zoomed in as 1 NM can be too big) + base = VIK_METERS_TO_NAUTICAL_MILES(vik_coord_diff ( &left, &right )) * 10.0; + break; + default: + base = 1; // Keep the compiler happy + g_critical("Houston, we've had a problem. distance=%d", dist_units); + } + ratio = (vvp->width/SCSIZE)/base; + + unit = 1; + diff = fabs(base-unit); + old_unit = unit; + old_diff = diff; + odd = 1; + while (diff <= old_diff) { + old_unit = unit; + old_diff = diff; + unit = unit * (odd%2 ? 5 : 2); + diff = fabs(base-unit); + odd++; + } + unit = old_unit; + len = unit * ratio; + + /* grey background */ + vik_viewport_draw_line(vvp, vvp->scale_bg_gc, + PAD, vvp->height-PAD, PAD + len, vvp->height-PAD); + vik_viewport_draw_line(vvp, vvp->scale_bg_gc, + PAD, vvp->height-PAD, PAD, vvp->height-PAD-HEIGHT); + vik_viewport_draw_line(vvp, vvp->scale_bg_gc, + PAD + len, vvp->height-PAD, PAD + len, vvp->height-PAD-HEIGHT); + /* black scale */ + vik_viewport_draw_line(vvp, vvp->black_gc, //gtk_widget_get_style(GTK_WIDGET(&vvp->drawing_area))->black_gc, + PAD, vvp->height-PAD, PAD + len, vvp->height-PAD); + vik_viewport_draw_line(vvp, vvp->black_gc, //gtk_widget_get_style(GTK_WIDGET(&vvp->drawing_area))->black_gc, + PAD, vvp->height-PAD, PAD, vvp->height-PAD-HEIGHT); + vik_viewport_draw_line(vvp, vvp->black_gc, //gtk_widget_get_style(GTK_WIDGET(&vvp->drawing_area))->black_gc, + PAD + len, vvp->height-PAD, PAD + len, vvp->height-PAD-HEIGHT); + if (odd%2) { + int i; + for (i=1; i<5; i++) { + vik_viewport_draw_line(vvp, vvp->scale_bg_gc, + PAD+i*len/5, vvp->height-PAD, PAD+i*len/5, vvp->height-PAD-(HEIGHT/2)); + vik_viewport_draw_line(vvp, vvp->black_gc, //gtk_widget_get_style(GTK_WIDGET(&vvp->drawing_area))->black_gc, + PAD+i*len/5, vvp->height-PAD, PAD+i*len/5, vvp->height-PAD-(HEIGHT/2)); + } + } else { + int i; + for (i=1; i<10; i++) { + vik_viewport_draw_line(vvp, vvp->scale_bg_gc, + PAD+i*len/10, vvp->height-PAD, PAD+i*len/10, vvp->height-PAD-((i==5)?(2*HEIGHT/3):(HEIGHT/2))); + vik_viewport_draw_line(vvp, vvp->black_gc, //gtk_widget_get_style(GTK_WIDGET(&vvp->drawing_area))->black_gc, + PAD+i*len/10, vvp->height-PAD, PAD+i*len/10, vvp->height-PAD-((i==5)?(2*HEIGHT/3):(HEIGHT/2))); + } + } + pl = gtk_widget_create_pango_layout (GTK_WIDGET(&vvp->drawing_area), NULL); + pango_layout_set_font_description (pl, gtk_widget_get_style(GTK_WIDGET(&vvp->drawing_area))->font_desc); + + switch (dist_units) { + case VIK_UNITS_DISTANCE_KILOMETRES: + if (unit >= 1000) { + sprintf(s, "%d km", (int)unit/1000); + } else { + sprintf(s, "%d m", (int)unit); + } + break; + case VIK_UNITS_DISTANCE_MILES: + // Handle units in 0.1 miles + if (unit < 10.0) { + sprintf(s, "%0.1f miles", unit/10.0); + } + else if ((int)unit == 10.0) { + sprintf(s, "1 mile"); + } + else { + sprintf(s, "%d miles", (int)(unit/10.0)); + } + break; + case VIK_UNITS_DISTANCE_NAUTICAL_MILES: + // Handle units in 0.1 NM + if (unit < 10.0) { + sprintf(s, "%0.1f NM", unit/10.0); + } + else if ((int)unit == 10.0) { + sprintf(s, "1 NM"); + } + else { + sprintf(s, "%d NMs", (int)(unit/10.0)); + } + break; + default: + g_critical("Houston, we've had a problem. distance=%d", dist_units); + } + pango_layout_set_text(pl, s, -1); + int ww, hh; + pango_layout_get_pixel_size ( pl, &ww, &hh ); + vik_viewport_draw_layout(vvp, vvp->black_gc, + PAD + len + PAD, vvp->height - PAD - HEIGHT/2 - hh/2, pl); + g_object_unref(pl); + pl = NULL; + } +} + +void vik_viewport_draw_copyright ( VikViewport *vvp ) +{ + g_return_if_fail ( vvp != NULL ); + + PangoLayout *pl; + PangoRectangle ink_rect, logical_rect; + gchar s[128] = ""; + + /* compute copyrights string */ + guint len = g_slist_length ( vvp->copyrights ); + + int i; + for (i = 0 ; i < len ; i++) + { + // Stop when buffer is full + int slen = strlen ( s ); + if ( slen >= 127 ) + break; + + gchar *copyright = g_slist_nth_data ( vvp->copyrights, i ); + + // Only use part of this copyright that fits in the available space left + // remembering 1 character is left available for the appended space + int clen = strlen ( copyright ); + if ( slen + clen > 126 ) { + clen = 126 - slen; + } + + strncat ( s, copyright, clen ); + strcat ( s, " " ); + } + + /* create pango layout */ + pl = gtk_widget_create_pango_layout (GTK_WIDGET(&vvp->drawing_area), NULL); + pango_layout_set_font_description (pl, gtk_widget_get_style(GTK_WIDGET(&vvp->drawing_area))->font_desc); + pango_layout_set_alignment ( pl, PANGO_ALIGN_RIGHT ); + + /* Set the text */ + pango_layout_set_text(pl, s, -1); + + /* Use maximum of half the viewport width */ + pango_layout_set_width ( pl, ( vvp->width / 2 ) * PANGO_SCALE ); + pango_layout_get_pixel_extents(pl, &ink_rect, &logical_rect); + vik_viewport_draw_layout(vvp, gtk_widget_get_style(GTK_WIDGET(&vvp->drawing_area))->black_gc, + vvp->width / 2, vvp->height - logical_rect.height, pl); + + /* Free memory */ + g_object_unref(pl); + pl = NULL; +} + +/** + * vik_viewport_set_draw_centermark: + * @vvp: self object + * @draw_centermark: new value + * + * Enable/Disable display of center mark. + */ +void vik_viewport_set_draw_centermark ( VikViewport *vvp, gboolean draw_centermark ) +{ + vvp->draw_centermark = draw_centermark; +} + +gboolean vik_viewport_get_draw_centermark ( VikViewport *vvp ) +{ + return vvp->draw_centermark; +} + +void vik_viewport_draw_centermark ( VikViewport *vvp ) +{ + g_return_if_fail ( vvp != NULL ); + + if ( !vvp->draw_centermark ) + return; + + const int len = 30; + const int gap = 4; + int center_x = vvp->width/2; + int center_y = vvp->height/2; + + // white background + vik_viewport_draw_line(vvp, vvp->scale_bg_gc, center_x - len, center_y, center_x - gap, center_y); + vik_viewport_draw_line(vvp, vvp->scale_bg_gc, center_x + gap, center_y, center_x + len, center_y); + vik_viewport_draw_line(vvp, vvp->scale_bg_gc, center_x, center_y - len, center_x, center_y - gap); + vik_viewport_draw_line(vvp, vvp->scale_bg_gc, center_x, center_y + gap, center_x, center_y + len); + // black foreground + vik_viewport_draw_line(vvp, vvp->black_gc, center_x - len, center_y, center_x - gap, center_y); + vik_viewport_draw_line(vvp, vvp->black_gc, center_x + gap, center_y, center_x + len, center_y); + vik_viewport_draw_line(vvp, vvp->black_gc, center_x, center_y - len, center_x, center_y - gap); + vik_viewport_draw_line(vvp, vvp->black_gc, center_x, center_y + gap, center_x, center_y + len); + +} + +void vik_viewport_draw_logo ( VikViewport *vvp ) +{ + g_return_if_fail ( vvp != NULL ); + + guint len = g_slist_length ( vvp->logos ); + gint x = vvp->width - PAD; + gint y = PAD; + int i; + for (i = 0 ; i < len ; i++) + { + GdkPixbuf *logo = g_slist_nth_data ( vvp->logos, i ); + gint width = gdk_pixbuf_get_width ( logo ); + gint height = gdk_pixbuf_get_height ( logo ); + vik_viewport_draw_pixbuf ( vvp, logo, 0, 0, x - width, y, width, height ); + x = x - width - PAD; + } +} + +void vik_viewport_set_draw_highlight ( VikViewport *vvp, gboolean draw_highlight ) +{ + vvp->draw_highlight = draw_highlight; +} + +gboolean vik_viewport_get_draw_highlight ( VikViewport *vvp ) +{ + return vvp->draw_highlight; +} + +void vik_viewport_sync ( VikViewport *vvp ) +{ + g_return_if_fail ( vvp != NULL ); + gdk_draw_drawable(gtk_widget_get_window(GTK_WIDGET(vvp)), gtk_widget_get_style(GTK_WIDGET(vvp))->bg_gc[0], GDK_DRAWABLE(vvp->scr_buffer), 0, 0, 0, 0, vvp->width, vvp->height); +} + +void vik_viewport_pan_sync ( VikViewport *vvp, gint x_off, gint y_off ) +{ + gint x, y, wid, hei; + + g_return_if_fail ( vvp != NULL ); + gdk_draw_drawable(gtk_widget_get_window(GTK_WIDGET(vvp)), gtk_widget_get_style(GTK_WIDGET(vvp))->bg_gc[0], GDK_DRAWABLE(vvp->scr_buffer), 0, 0, x_off, y_off, vvp->width, vvp->height); + + if (x_off >= 0) { + x = 0; + wid = x_off; + } else { + x = vvp->width+x_off; + wid = -x_off; + } + if (y_off >= 0) { + y = 0; + hei = y_off; + } else { + y = vvp->height+y_off; + hei = -y_off; + } + gtk_widget_queue_draw_area(GTK_WIDGET(vvp), x, 0, wid, vvp->height); + gtk_widget_queue_draw_area(GTK_WIDGET(vvp), 0, y, vvp->width, hei); +} + +void vik_viewport_set_zoom ( VikViewport *vvp, gdouble xympp ) +{ + g_return_if_fail ( vvp != NULL ); + if ( xympp >= VIK_VIEWPORT_MIN_ZOOM && xympp <= VIK_VIEWPORT_MAX_ZOOM ) { + vvp->xmpp = vvp->ympp = xympp; + // Since xmpp & ympp are the same it doesn't matter which one is used here + vvp->xmfactor = vvp->ymfactor = mercator_factor ( vvp->xmpp, vvp->scale ); + } + + if ( vvp->drawmode == VIK_VIEWPORT_DRAWMODE_UTM ) + viewport_utm_zone_check(vvp); +} + +/* or could do factor */ +void vik_viewport_zoom_in ( VikViewport *vvp ) +{ + g_return_if_fail ( vvp != NULL ); + if ( vvp->xmpp >= (VIK_VIEWPORT_MIN_ZOOM*2) && vvp->ympp >= (VIK_VIEWPORT_MIN_ZOOM*2) ) + { + vvp->xmpp /= 2; + vvp->ympp /= 2; + + vvp->xmfactor = mercator_factor ( vvp->xmpp, vvp->scale ); + vvp->ymfactor = mercator_factor ( vvp->ympp, vvp->scale ); + + viewport_utm_zone_check(vvp); + } +} + +void vik_viewport_zoom_out ( VikViewport *vvp ) +{ + g_return_if_fail ( vvp != NULL ); + if ( vvp->xmpp <= (VIK_VIEWPORT_MAX_ZOOM/2) && vvp->ympp <= (VIK_VIEWPORT_MAX_ZOOM/2) ) + { + vvp->xmpp *= 2; + vvp->ympp *= 2; + + vvp->xmfactor = mercator_factor ( vvp->xmpp, vvp->scale ); + vvp->ymfactor = mercator_factor ( vvp->ympp, vvp->scale ); + + viewport_utm_zone_check(vvp); + } +} + +gdouble vik_viewport_get_zoom ( VikViewport *vvp ) +{ + if ( vvp->xmpp == vvp->ympp ) + return vvp->xmpp; + return 0.0; +} + +gdouble vik_viewport_get_xmpp ( VikViewport *vvp ) +{ + return vvp->xmpp; +} + +gdouble vik_viewport_get_ympp ( VikViewport *vvp ) +{ + return vvp->ympp; +} + +void vik_viewport_set_xmpp ( VikViewport *vvp, gdouble xmpp ) +{ + if ( xmpp >= VIK_VIEWPORT_MIN_ZOOM && xmpp <= VIK_VIEWPORT_MAX_ZOOM ) { + vvp->xmpp = xmpp; + vvp->xmfactor = mercator_factor ( vvp->xmpp, vvp->scale ); + if ( vvp->drawmode == VIK_VIEWPORT_DRAWMODE_UTM ) + viewport_utm_zone_check(vvp); + } +} + +void vik_viewport_set_ympp ( VikViewport *vvp, gdouble ympp ) +{ + if ( ympp >= VIK_VIEWPORT_MIN_ZOOM && ympp <= VIK_VIEWPORT_MAX_ZOOM ) { + vvp->ympp = ympp; + vvp->ymfactor = mercator_factor ( vvp->ympp, vvp->scale ); + if ( vvp->drawmode == VIK_VIEWPORT_DRAWMODE_UTM ) + viewport_utm_zone_check(vvp); + } +} + + +const VikCoord *vik_viewport_get_center ( VikViewport *vvp ) +{ + g_return_val_if_fail ( vvp != NULL, NULL ); + return &(vvp->center); +} + +/* called every time we update coordinates/zoom */ +static void viewport_utm_zone_check ( VikViewport *vvp ) +{ + if ( vvp->coord_mode == VIK_COORD_UTM ) + { + struct UTM utm; + struct LatLon ll; + a_coords_utm_to_latlon ( (struct UTM *) &(vvp->center), &ll ); + a_coords_latlon_to_utm ( &ll, &utm ); + if ( utm.zone != vvp->center.utm_zone ) + *((struct UTM *)(&vvp->center)) = utm; + + /* misc. stuff so we don't have to check later */ + vvp->utm_zone_width = viewport_utm_zone_width ( vvp ); + vvp->one_utm_zone = ( vik_viewport_rightmost_zone(vvp) == vik_viewport_leftmost_zone(vvp) ); + } +} + +/** + * Free an individual center position in the history list + */ +static void free_center ( VikViewport *vvp, guint index ) +{ + VikCoord *coord = g_list_nth_data ( vvp->centers, index ); + if ( coord ) + g_free ( coord ); + GList *gl = g_list_nth ( vvp->centers, index ); + if ( gl ) + vvp->centers = g_list_delete_link ( vvp->centers, gl ); +} + +/** + * Free a set of center positions in the history list, + * from the indicated start index to the end of the list + */ +static void free_centers ( VikViewport *vvp, guint start ) +{ + // Have to work backward since we delete items referenced by the '_nth()' values, + // otherwise if processed forward - removing the lower nth index entries would change the subsequent indexing + for ( guint i = g_list_length(vvp->centers)-1; i > start; i-- ) + free_center ( vvp, i ); +} + +/** + * Store the current center position into the history list + * and emit a signal to notify clients the list has been updated + */ +static void update_centers ( VikViewport *vvp ) +{ + VikCoord *new_center = g_malloc(sizeof (VikCoord)); + *new_center = vvp->center; + + if ( vvp->centers_index ) { + + if ( vvp->centers_index == vvp->centers_max-1 ) { + // List is full, so drop the oldest value to make room for the new one + free_center ( vvp, 0 ); + vvp->centers_index--; + } + else { + // Reset the now unused section of the list + // Free from the index to the end + free_centers ( vvp, vvp->centers_index+1 ); + } + + } + + // Store new position + // NB ATM this can be the same location as the last one in the list + vvp->centers = g_list_append ( vvp->centers, new_center ); + + // Reset to the end (NB should be same as centers_index++) + vvp->centers_index = g_list_length ( vvp->centers ) - 1; + + // Inform interested subscribers that this change has occurred + g_signal_emit ( G_OBJECT(vvp), viewport_signals[VW_UPDATED_CENTER_SIGNAL], 0 ); +} + +/** + * Show the list of forward/backward positions + * ATM only for debug usage + */ +void vik_viewport_show_centers ( VikViewport *vvp, GtkWindow *parent ) +{ + GList* node = NULL; + GList* texts = NULL; + gint index = 0; + for (node = vvp->centers; node != NULL; node = g_list_next(node)) { + gchar *lat = NULL, *lon = NULL; + struct LatLon ll; + vik_coord_to_latlon (node->data, &ll); + a_coords_latlon_to_string ( &ll, &lat, &lon ); + gchar *extra = NULL; + if ( index == vvp->centers_index-1 ) + extra = g_strdup ( " [Back]" ); + else if ( index == vvp->centers_index+1 ) + extra = g_strdup ( " [Forward]" ); + else + extra = g_strdup ( "" ); + texts = g_list_prepend ( texts , g_strdup_printf ( "%s %s%s", lat, lon, extra ) ); + g_free ( lat ); + g_free ( lon ); + g_free ( extra ); + index++; + } + + // NB: No i18n as this is just for debug + // Using this function the dialog allows sorting of the list which isn't appropriate here + // but this doesn't matter much for debug purposes of showing stuff... + GList *ans = a_dialog_select_from_list(parent, + texts, + FALSE, + "Back/Forward Locations", + "Back/Forward Locations"); + for (node = ans; node != NULL; node = g_list_next(node)) + g_free(node->data); + g_list_free(ans); + for (node = texts; node != NULL; node = g_list_next(node)) + g_free(node->data); + g_list_free(texts); +} + +/** + * vik_viewport_go_back: + * + * Move back in the position history + * + * Returns: %TRUE one success + */ +gboolean vik_viewport_go_back ( VikViewport *vvp ) +{ + // see if the current position is different from the last saved center position within a certain radius + VikCoord *center = g_list_nth_data ( vvp->centers, vvp->centers_index ); + if ( center ) { + // Consider an exclusion size (should it zoom level dependent, rather than a fixed value?) + // When still near to the last saved position we'll jump over it to the one before + if ( vik_coord_diff ( center, &vvp->center ) > vvp->centers_radius ) { + + if ( vvp->centers_index == g_list_length(vvp->centers)-1 ) { + // Only when we haven't already moved back in the list + // Remember where this request came from + // (alternatively we could insert in the list on every back attempt) + update_centers ( vvp ); + } + + } + // 'Go back' if possible + // NB if we inserted a position above, then this will then move to the last saved position + // otherwise this will skip to the previous saved position, as it's probably somewhere else. + if ( vvp->centers_index > 0 ) + vvp->centers_index--; + } + else { + return FALSE; + } + + VikCoord *new_center = g_list_nth_data ( vvp->centers, vvp->centers_index ); + if ( new_center ) { + vik_viewport_set_center_coord ( vvp, new_center, FALSE ); + return TRUE; + } + return FALSE; +} + +/** + * vik_viewport_go_forward: + * + * Move forward in the position history + * + * Returns: %TRUE one success + */ +gboolean vik_viewport_go_forward ( VikViewport *vvp ) +{ + if ( vvp->centers_index == vvp->centers_max-1 ) + return FALSE; + + vvp->centers_index++; + VikCoord *new_center = g_list_nth_data ( vvp->centers, vvp->centers_index ); + if ( new_center ) { + vik_viewport_set_center_coord ( vvp, new_center, FALSE ); + return TRUE; + } + else + // Set to end of list + vvp->centers_index = g_list_length(vvp->centers) - 1; + + return FALSE; +} + +/** + * vik_viewport_back_available: + * + * Returns: %TRUE when a previous position in the history is available + */ +gboolean vik_viewport_back_available ( const VikViewport *vvp ) +{ + return ( vvp->centers_index > 0 ); +} + +/** + * vik_viewport_forward_available: + * + * Returns: %TRUE when a next position in the history is available + */ +gboolean vik_viewport_forward_available ( const VikViewport *vvp ) +{ + return ( vvp->centers_index < g_list_length(vvp->centers)-1 ); +} + +/** + * vik_viewport_set_center_latlon: + * @vvp: The viewport to reposition. + * @ll: The new center position in Lat/Lon format + * @save_position: Whether this new position should be saved into the history of positions + * Normally only specific user requests should be saved (i.e. to not include Pan and Zoom repositions) + */ +void vik_viewport_set_center_latlon ( VikViewport *vvp, const struct LatLon *ll, gboolean save_position ) +{ + vik_coord_load_from_latlon ( &(vvp->center), vvp->coord_mode, ll ); + if ( save_position ) + update_centers ( vvp ); + if ( vvp->coord_mode == VIK_COORD_UTM ) + viewport_utm_zone_check ( vvp ); +} + +/** + * vik_viewport_set_center_utm: + * @vvp: The viewport to reposition. + * @utm: The new center position in UTM format + * @save_position: Whether this new position should be saved into the history of positions + * Normally only specific user requests should be saved (i.e. to not include Pan and Zoom repositions) + */ +void vik_viewport_set_center_utm ( VikViewport *vvp, const struct UTM *utm, gboolean save_position ) +{ + vik_coord_load_from_utm ( &(vvp->center), vvp->coord_mode, utm ); + if ( save_position ) + update_centers ( vvp ); + if ( vvp->coord_mode == VIK_COORD_UTM ) + viewport_utm_zone_check ( vvp ); +} + +/** + * vik_viewport_set_center_coord: + * @vvp: The viewport to reposition. + * @coord: The new center position in a VikCoord type + * @save_position: Whether this new position should be saved into the history of positions + * Normally only specific user requests should be saved (i.e. to not include Pan and Zoom repositions) + */ +void vik_viewport_set_center_coord ( VikViewport *vvp, const VikCoord *coord, gboolean save_position ) +{ + vvp->center = *coord; + if ( save_position ) + update_centers ( vvp ); + if ( vvp->coord_mode == VIK_COORD_UTM ) + viewport_utm_zone_check ( vvp ); +} + +void vik_viewport_corners_for_zonen ( VikViewport *vvp, int zone, VikCoord *ul, VikCoord *br ) +{ + g_return_if_fail ( vvp->coord_mode == VIK_COORD_UTM ); + + /* get center, then just offset */ + vik_viewport_center_for_zonen ( vvp, VIK_UTM(ul), zone ); + ul->mode = VIK_COORD_UTM; + *br = *ul; + + ul->north_south += (vvp->ympp * vvp->height / 2); + ul->east_west -= (vvp->xmpp * vvp->width / 2); + br->north_south -= (vvp->ympp * vvp->height / 2); + br->east_west += (vvp->xmpp * vvp->width / 2); +} + +void vik_viewport_center_for_zonen ( VikViewport *vvp, struct UTM *center, int zone) +{ + if ( vvp->coord_mode == VIK_COORD_UTM ) { + *center = *((struct UTM *)(vik_viewport_get_center ( vvp ))); + center->easting -= ( zone - center->zone ) * vvp->utm_zone_width; + center->zone = zone; + } +} + +gchar vik_viewport_leftmost_zone ( VikViewport *vvp ) +{ + if ( vvp->coord_mode == VIK_COORD_UTM ) { + VikCoord coord; + g_assert ( vvp != NULL ); + vik_viewport_screen_to_coord ( vvp, 0, 0, &coord ); + return coord.utm_zone; + } + return '\0'; +} + +gchar vik_viewport_rightmost_zone ( VikViewport *vvp ) +{ + if ( vvp->coord_mode == VIK_COORD_UTM ) { + VikCoord coord; + g_assert ( vvp != NULL ); + vik_viewport_screen_to_coord ( vvp, vvp->width, 0, &coord ); + return coord.utm_zone; + } + return '\0'; +} + + +void vik_viewport_set_center_screen ( VikViewport *vvp, int x, int y ) +{ + g_return_if_fail ( vvp != NULL ); + if ( vvp->coord_mode == VIK_COORD_UTM ) { + /* slightly optimized */ + vvp->center.east_west += vvp->xmpp * (x - (vvp->width/2)); + vvp->center.north_south += vvp->ympp * ((vvp->height/2) - y); + viewport_utm_zone_check ( vvp ); + } else { + VikCoord tmp; + vik_viewport_screen_to_coord ( vvp, x, y, &tmp ); + vik_viewport_set_center_coord ( vvp, &tmp, FALSE ); + } +} + +gint vik_viewport_get_width( VikViewport *vvp ) +{ + g_return_val_if_fail ( vvp != NULL, 0 ); + return vvp->width; +} + +gint vik_viewport_get_height( VikViewport *vvp ) +{ + g_return_val_if_fail ( vvp != NULL, 0 ); + return vvp->height; +} + +void vik_viewport_screen_to_coord ( VikViewport *vvp, int x, int y, VikCoord *coord ) +{ + g_return_if_fail ( vvp != NULL ); + + if ( vvp->coord_mode == VIK_COORD_UTM ) { + int zone_delta; + struct UTM *utm = (struct UTM *) coord; + coord->mode = VIK_COORD_UTM; + + utm->zone = vvp->center.utm_zone; + utm->letter = vvp->center.utm_letter; + utm->easting = ( ( x - ( vvp->width_2) ) * vvp->xmpp ) + vvp->center.east_west; + zone_delta = floor( (utm->easting - EASTING_OFFSET ) / vvp->utm_zone_width + 0.5 ); + utm->zone += zone_delta; + utm->easting -= zone_delta * vvp->utm_zone_width; + utm->northing = ( ( ( vvp->height_2) - y ) * vvp->ympp ) + vvp->center.north_south; + } else if ( vvp->coord_mode == VIK_COORD_LATLON ) { + coord->mode = VIK_COORD_LATLON; + if ( vvp->drawmode == VIK_VIEWPORT_DRAWMODE_LATLON ) { + coord->east_west = vvp->center.east_west + (180.0 * vvp->xmpp / 65536 / 256 * (x - vvp->width_2)) / vvp->scale; + coord->north_south = vvp->center.north_south + (180.0 * vvp->ympp / 65536 / 256 * (vvp->height_2 - y) / vvp->scale); + } else if ( vvp->drawmode == VIK_VIEWPORT_DRAWMODE_EXPEDIA ) + calcxy_rev(&(coord->east_west), &(coord->north_south), x, y, vvp->center.east_west, vvp->center.north_south, vvp->xmpp * ALTI_TO_MPP, vvp->ympp * ALTI_TO_MPP, vvp->width_2, vvp->height_2); + else if ( vvp->drawmode == VIK_VIEWPORT_DRAWMODE_MERCATOR ) { + /* This isn't called with a high frequently so less need to optimize */ + coord->east_west = vvp->center.east_west + (180.0 * vvp->xmpp / 65536 / 256 * (x - vvp->width_2) / vvp->scale); + coord->north_south = DEMERCLAT ( MERCLAT(vvp->center.north_south) + (180.0 * vvp->ympp / 65536 / 256 * (vvp->height_2 - y)) / vvp->scale ); + } + } +} + +/* + * Since this function is used for every drawn trackpoint - it can get called alot + * Thus x & y position factors are calculated once on zoom changes, + * avoiding the need to do it here all the time. + * For good measure the half width and height values are also pre calculated too. + */ +void vik_viewport_coord_to_screen ( VikViewport *vvp, const VikCoord *coord, int *x, int *y ) +{ + static VikCoord tmp; + g_return_if_fail ( vvp != NULL ); + + if ( coord->mode != vvp->coord_mode ) + { + g_warning ( "Have to convert in vik_viewport_coord_to_screen! This should never happen!"); + vik_coord_copy_convert ( coord, vvp->coord_mode, &tmp ); + coord = &tmp; + } + + if ( vvp->coord_mode == VIK_COORD_UTM ) { + struct UTM *center = (struct UTM *) &(vvp->center); + struct UTM *utm = (struct UTM *) coord; + if ( center->zone != utm->zone && vvp->one_utm_zone ) + { + *x = *y = VIK_VIEWPORT_UTM_WRONG_ZONE; + return; + } + + *x = ( (utm->easting - center->easting) / vvp->xmpp ) + (vvp->width_2) - + (center->zone - utm->zone ) * vvp->utm_zone_width / vvp->xmpp; + *y = (vvp->height_2) - ( (utm->northing - center->northing) / vvp->ympp ); + } else if ( vvp->coord_mode == VIK_COORD_LATLON ) { + struct LatLon *center = (struct LatLon *) &(vvp->center); + struct LatLon *ll = (struct LatLon *) coord; + double xx,yy; + if ( vvp->drawmode == VIK_VIEWPORT_DRAWMODE_LATLON ) { + *x = vvp->width_2 + ( vvp->xmfactor * (ll->lon - center->lon) ); + *y = vvp->height_2 + ( vvp->ymfactor * (center->lat - ll->lat) ); + } else if ( vvp->drawmode == VIK_VIEWPORT_DRAWMODE_EXPEDIA ) { + calcxy ( &xx, &yy, center->lon, center->lat, ll->lon, ll->lat, vvp->xmpp * ALTI_TO_MPP, vvp->ympp * ALTI_TO_MPP, vvp->width_2, vvp->height_2 ); + *x = xx; *y = yy; + } else if ( vvp->drawmode == VIK_VIEWPORT_DRAWMODE_MERCATOR ) { + *x = vvp->width_2 + ( vvp->xmfactor * (ll->lon - center->lon) ); + *y = vvp->height_2 + ( vvp->ymfactor * ( MERCLAT(center->lat) - MERCLAT(ll->lat) ) ); + } + } +} + +/** + * a_viewport_clip_line: + * @x1: screen coord + * @y1: screen coord + * @x2: screen coord + * @y2: screen coord + * + * Due to the seemingly undocumented behaviour of gdk_draw_line(), we need to restrict the range of values passed in. + * So despite it accepting gints, the effective range seems to be the actually the minimum C int range (2^16). + * This seems to be limitations coming from the X Window System. + * + * See http://www.rahul.net/kenton/40errs.html + * ERROR 7. Boundary conditions. + * "The X coordinate space is not infinite. + * Most drawing functions limit position, width, and height to 16 bit integers (sometimes signed, sometimes unsigned) of accuracy. + * Because most C compilers use 32 bit integers, Xlib will not complain if you exceed the 16 bit limit, but your results will usually not be what you expected. + * You should be especially careful of this if you are implementing higher level scalable graphics packages." + * + * This function should be called before calling gdk_draw_line(). + */ +void a_viewport_clip_line ( gint *x1, gint *y1, gint *x2, gint *y2 ) +{ + gboolean clip_x1, clip_y1, clip_x2, clip_y2; + + /* First check if there is a need to clip */ + clip_x1 = ( *x1 > G_MAXINT16 ) || ( *x1 < G_MININT16 ); + clip_y1 = ( *y1 > G_MAXINT16 ) || ( *y1 < G_MININT16 ); + clip_x2 = ( *x2 > G_MAXINT16 ) || ( *x2 < G_MININT16 ); + clip_y2 = ( *y2 > G_MAXINT16 ) || ( *y2 < G_MININT16 ); + + if ( clip_x1 || clip_y1 || clip_x2 || clip_y2 ) { + /* y = slope * x + offset */ + gdouble slope = (gdouble)(*y1 - *y2) / (gdouble)(*x1 - *x2); + gdouble offset = *y1 - slope * *x1; + + if ( clip_x1 ) { + if ( *x1 > G_MAXINT16 ) { + *x1 = G_MAXINT16; + *y1 = (int)round( slope * G_MAXINT16 + offset ); + } else { + *x1 = G_MININT16; + *y1 = (int)round( slope * G_MININT16 + offset ); + } + clip_y1 = ( *y1 > G_MAXINT16 ) || ( *y1 < G_MININT16 ); + } + if ( clip_y1 ) { + if ( *y1 > G_MAXINT16 ) { + *y1 = G_MAXINT16; + *x1 = (int)round( ( G_MAXINT16 - offset ) / slope ); + } else { + *y1 = G_MININT16; + *x1 = (int)round( ( G_MININT16 - offset ) / slope ); + } + } + if ( clip_x2 ) { + if ( *x2 > G_MAXINT16 ) { + *x2 = G_MAXINT16; + *y2 = (int)round( slope * G_MAXINT16 + offset ); + } else { + *x2 = G_MININT16; + *y2 = (int)round( slope * G_MININT16 + offset ); + } + clip_y2 = ( *y2 > G_MAXINT16 ) || ( *y2 < G_MININT16 ); + } + if ( clip_y2 ) { + if ( *y2 > G_MAXINT16 ) { + *y2 = G_MAXINT16; + *x2 = (int)round( ( G_MAXINT16 - offset ) / slope ); + } else { + *y2 = G_MININT16; + *x2 = (int)round( ( G_MININT16 - offset ) / slope ); + } + } + } +} + +void vik_viewport_draw_line ( VikViewport *vvp, GdkGC *gc, gint x1, gint y1, gint x2, gint y2 ) +{ + if ( ! ( ( x1 < 0 && x2 < 0 ) || ( y1 < 0 && y2 < 0 ) || + ( x1 > vvp->width && x2 > vvp->width ) || ( y1 > vvp->height && y2 > vvp->height ) ) ) { + /*** clipping, yeah! ***/ + a_viewport_clip_line ( &x1, &y1, &x2, &y2 ); + gdk_draw_line ( vvp->scr_buffer, gc, x1, y1, x2, y2); + } +} + +void vik_viewport_draw_rectangle ( VikViewport *vvp, GdkGC *gc, gboolean filled, gint x1, gint y1, gint x2, gint y2 ) +{ + // Using 32 as half the default waypoint image size, so this draws ensures the highlight gets done + if ( x1 > -32 && x1 < vvp->width + 32 && y1 > -32 && y1 < vvp->height + 32 ) + gdk_draw_rectangle ( vvp->scr_buffer, gc, filled, x1, y1, x2, y2); +} + +void vik_viewport_draw_string ( VikViewport *vvp, GdkFont *font, GdkGC *gc, gint x1, gint y1, const gchar *string ) +{ + if ( x1 > -100 && x1 < vvp->width + 100 && y1 > -100 && y1 < vvp->height + 100 ) + gdk_draw_string ( vvp->scr_buffer, font, gc, x1, y1, string ); +} + +void vik_viewport_draw_pixbuf ( VikViewport *vvp, GdkPixbuf *pixbuf, gint src_x, gint src_y, + gint dest_x, gint dest_y, gint w, gint h ) +{ + gdk_draw_pixbuf ( vvp->scr_buffer, + NULL, + pixbuf, + src_x, src_y, dest_x, dest_y, w, h, + GDK_RGB_DITHER_NONE, 0, 0 ); +} + +void vik_viewport_draw_arc ( VikViewport *vvp, GdkGC *gc, gboolean filled, gint x, gint y, gint width, gint height, gint angle1, gint angle2 ) +{ + gdk_draw_arc ( vvp->scr_buffer, gc, filled, x, y, width, height, angle1, angle2 ); +} + + +void vik_viewport_draw_polygon ( VikViewport *vvp, GdkGC *gc, gboolean filled, GdkPoint *points, gint npoints ) +{ + gdk_draw_polygon ( vvp->scr_buffer, gc, filled, points, npoints ); +} + +VikCoordMode vik_viewport_get_coord_mode ( const VikViewport *vvp ) +{ + g_assert ( vvp ); + return vvp->coord_mode; +} + +static void viewport_set_coord_mode ( VikViewport *vvp, VikCoordMode mode ) +{ + g_return_if_fail ( vvp != NULL ); + vvp->coord_mode = mode; + vik_coord_convert ( &(vvp->center), mode ); +} + +/* Thanks GPSDrive */ +static gboolean calcxy_rev(double *lg, double *lt, gint x, gint y, double zero_long, double zero_lat, double pixelfact_x, double pixelfact_y, gint mapSizeX2, gint mapSizeY2 ) +{ + int px, py; + gdouble dif, lat, lon; + double Ra = Radius[90+(gint)zero_lat]; + + px = (mapSizeX2 - x) * pixelfact_x; + py = (-mapSizeY2 + y) * pixelfact_y; + + lat = zero_lat - py / Ra; + lon = + zero_long - + px / (Ra * + cos (DEG2RAD(lat))); + + dif = lat * (1 - (cos (DEG2RAD(fabs (lon - zero_long))))); + lat = lat - dif / 1.5; + lon = + zero_long - + px / (Ra * + cos (DEG2RAD(lat))); + + *lt = lat; + *lg = lon; + return (TRUE); +} + +/* Thanks GPSDrive */ +static gboolean calcxy(double *x, double *y, double lg, double lt, double zero_long, double zero_lat, double pixelfact_x, double pixelfact_y, gint mapSizeX2, gint mapSizeY2 ) +{ + double dif; + double Ra; + gint mapSizeX = 2 * mapSizeX2; + gint mapSizeY = 2 * mapSizeY2; + + g_assert ( lt >= -90.0 && lt <= 90.0 ); +// lg *= rad2deg; // FIXME, optimize equations +// lt *= rad2deg; + Ra = Radius[90+(gint)lt]; + *x = Ra * + cos (DEG2RAD(lt)) * (lg - zero_long); + *y = Ra * (lt - zero_lat); + dif = Ra * RAD2DEG(1 - (cos ((DEG2RAD(lg - zero_long))))); + *y = *y + dif / 1.85; + *x = *x / pixelfact_x; + *y = *y / pixelfact_y; + *x = mapSizeX2 - *x; + *y += mapSizeY2; + if ((*x < 0)||(*x >= mapSizeX)||(*y < 0)||(*y >= mapSizeY)) + return (FALSE); + return (TRUE); +} + +static void viewport_init_ra() +{ + static gboolean done_before = FALSE; + if ( !done_before ) + { + gint i; + for ( i = -90; i <= 90; i++) + Radius[i+90] = calcR ( DEG2RAD((double)i) ); + done_before = TRUE; + } +} + +double calcR (double lat) +{ + double a = 6378.137, r, sc, x, y, z; + double e2 = 0.081082 * 0.081082; + /* + * the radius of curvature of an ellipsoidal Earth in the plane of the + * meridian is given by + * + * R' = a * (1 - e^2) / (1 - e^2 * (sin(lat))^2)^(3/2) + * + * + * where a is the equatorial radius, b is the polar radius, and e is + * the eccentricity of the ellipsoid = sqrt(1 - b^2/a^2) + * + * a = 6378 km (3963 mi) Equatorial radius (surface to center distance) + * b = 6356.752 km (3950 mi) Polar radius (surface to center distance) e + * = 0.081082 Eccentricity + */ + + lat = DEG2RAD(lat); + sc = sin (lat); + x = a * (1.0 - e2); + z = 1.0 - e2 * sc * sc; + y = pow (z, 1.5); + r = x / y; + r = r * 1000.0; + return r; +} + +gboolean vik_viewport_is_one_zone ( VikViewport *vvp ) +{ + return vvp->coord_mode == VIK_COORD_UTM && vvp->one_utm_zone; +} + +void vik_viewport_draw_layout ( VikViewport *vvp, GdkGC *gc, gint x, gint y, PangoLayout *layout ) +{ + if ( x > -100 && x < vvp->width + 100 && y > -100 && y < vvp->height + 100 ) + gdk_draw_layout ( vvp->scr_buffer, gc, x, y, layout ); +} + +void vik_gc_get_fg_color ( GdkGC *gc, GdkColor *dest ) +{ + static GdkGCValues values; + gdk_gc_get_values ( gc, &values ); + gdk_colormap_query_color ( gdk_colormap_get_system(), values.foreground.pixel, dest ); +} + +GdkFunction vik_gc_get_function ( GdkGC *gc ) +{ + static GdkGCValues values; + gdk_gc_get_values ( gc, &values ); + return values.function; +} + +void vik_viewport_set_drawmode ( VikViewport *vvp, VikViewportDrawMode drawmode ) +{ + vvp->drawmode = drawmode; + if ( drawmode == VIK_VIEWPORT_DRAWMODE_UTM ) + viewport_set_coord_mode ( vvp, VIK_COORD_UTM ); + else { + viewport_set_coord_mode ( vvp, VIK_COORD_LATLON ); + } +} + +VikViewportDrawMode vik_viewport_get_drawmode ( VikViewport *vvp ) +{ + return vvp->drawmode; +} + +/******** triggering *******/ +void vik_viewport_set_trigger ( VikViewport *vp, gpointer trigger ) +{ + vp->trigger = trigger; +} + +gpointer vik_viewport_get_trigger ( VikViewport *vp ) +{ + return vp->trigger; +} + +void vik_viewport_snapshot_save ( VikViewport *vp ) +{ + gdk_draw_drawable ( vp->snapshot_buffer, vp->background_gc, vp->scr_buffer, 0, 0, 0, 0, -1, -1 ); +} + +void vik_viewport_snapshot_load ( VikViewport *vp ) +{ + gdk_draw_drawable ( vp->scr_buffer, vp->background_gc, vp->snapshot_buffer, 0, 0, 0, 0, -1, -1 ); +} + +void vik_viewport_set_half_drawn(VikViewport *vp, gboolean half_drawn) +{ + vp->half_drawn = half_drawn; +} + +gboolean vik_viewport_get_half_drawn( VikViewport *vp ) +{ + return vp->half_drawn; +} + + +const gchar *vik_viewport_get_drawmode_name(VikViewport *vv, VikViewportDrawMode mode) + { + const gchar *name = NULL; + VikWindow *vw = NULL; + GtkWidget *mode_button; + GtkWidget *label; + + vw = VIK_WINDOW_FROM_WIDGET(vv); + mode_button = vik_window_get_drawmode_button(vw, mode); + label = gtk_bin_get_child(GTK_BIN(mode_button)); + + name = gtk_label_get_text ( GTK_LABEL(label) ); + + return name; + +} + +void vik_viewport_get_min_max_lat_lon ( VikViewport *vp, gdouble *min_lat, gdouble *max_lat, gdouble *min_lon, gdouble *max_lon ) +{ + VikCoord tleft, tright, bleft, bright; + + vik_viewport_screen_to_coord ( vp, 0, 0, &tleft ); + vik_viewport_screen_to_coord ( vp, vik_viewport_get_width(vp), 0, &tright ); + vik_viewport_screen_to_coord ( vp, 0, vik_viewport_get_height(vp), &bleft ); + vik_viewport_screen_to_coord ( vp, vp->width, vp->height, &bright ); + + vik_coord_convert(&tleft, VIK_COORD_LATLON); + vik_coord_convert(&tright, VIK_COORD_LATLON); + vik_coord_convert(&bleft, VIK_COORD_LATLON); + vik_coord_convert(&bright, VIK_COORD_LATLON); + + *max_lat = MAX(tleft.north_south, tright.north_south); + *min_lat = MIN(bleft.north_south, bright.north_south); + *max_lon = MAX(tright.east_west, bright.east_west); + *min_lon = MIN(tleft.east_west, bleft.east_west); +} + +/** + * vik_viewport_get_bbox: + * @vp: self object + * + * Returns: The viewport area as a #LatLonBBox. + */ +LatLonBBox vik_viewport_get_bbox ( VikViewport *vp ) +{ + VikCoord tleft, tright, bleft, bright; + + vik_viewport_screen_to_coord ( vp, 0, 0, &tleft ); + vik_viewport_screen_to_coord ( vp, vik_viewport_get_width(vp), 0, &tright ); + vik_viewport_screen_to_coord ( vp, 0, vik_viewport_get_height(vp), &bleft ); + vik_viewport_screen_to_coord ( vp, vp->width, vp->height, &bright ); + + vik_coord_convert ( &tleft, VIK_COORD_LATLON ); + vik_coord_convert ( &tright, VIK_COORD_LATLON ); + vik_coord_convert ( &bleft, VIK_COORD_LATLON ); + vik_coord_convert ( &bright, VIK_COORD_LATLON ); + + LatLonBBox bbox; + bbox.south = MIN(bleft.north_south, bright.north_south); + bbox.north = MAX(tleft.north_south, tright.north_south); + bbox.east = MAX(tright.east_west, bright.east_west); + bbox.west = MIN(tleft.east_west, bleft.east_west); + + return bbox; +} + +void vik_viewport_reset_copyrights ( VikViewport *vp ) +{ + g_return_if_fail ( vp != NULL ); + g_slist_foreach ( vp->copyrights, (GFunc)g_free, NULL ); + g_slist_free ( vp->copyrights ); + vp->copyrights = NULL; +} + +/** + * vik_viewport_add_copyright: + * @vp: self object + * @copyright: new copyright to display + * + * Add a copyright to display on viewport. + */ +void vik_viewport_add_copyright ( VikViewport *vp, const gchar *copyright ) +{ + g_return_if_fail ( vp != NULL ); + if ( copyright ) + { + GSList *found = g_slist_find_custom ( vp->copyrights, copyright, (GCompareFunc)strcmp ); + if ( found == NULL ) + { + gchar *duple = g_strdup ( copyright ); + vp->copyrights = g_slist_prepend ( vp->copyrights, duple ); + } + } +} + +void vik_viewport_reset_logos ( VikViewport *vp ) +{ + g_return_if_fail ( vp != NULL ); + /* do not free elem */ + g_slist_free ( vp->logos ); + vp->logos = NULL; +} + +void vik_viewport_add_logo ( VikViewport *vp, const GdkPixbuf *logo ) +{ + g_return_if_fail ( vp != NULL ); + if ( logo ) + { + GdkPixbuf *found = NULL; /* FIXME (GdkPixbuf*)g_slist_find_custom ( vp->logos, logo, (GCompareFunc)== ); */ + if ( found == NULL ) + { + vp->logos = g_slist_prepend ( vp->logos, (gpointer)logo ); + } + } +} + +/** + * vik_viewport_compute_bearing: + * @vp: self object + * @x1: screen coord + * @y1: screen coord + * @x2: screen coord + * @y2: screen coord + * @angle: bearing in Radian (output) + * @baseangle: UTM base angle in Radian (output) + * + * Compute bearing. + */ +void vik_viewport_compute_bearing ( VikViewport *vp, gint x1, gint y1, gint x2, gint y2, gdouble *angle, gdouble *baseangle ) +{ + if ( vik_viewport_get_drawmode ( vp ) == VIK_VIEWPORT_DRAWMODE_UTM) { + VikCoord test; + struct LatLon ll; + struct UTM u; + gint tx, ty; + + vik_viewport_screen_to_coord ( vp, x1, y1, &test ); + vik_coord_to_latlon ( &test, &ll ); + ll.lat += vik_viewport_get_ympp ( vp ) * vik_viewport_get_height ( vp ) / 11000.0; // about 11km per degree latitude + a_coords_latlon_to_utm ( &ll, &u ); + vik_coord_load_from_utm ( &test, VIK_COORD_UTM, &u ); + vik_viewport_coord_to_screen ( vp, &test, &tx, &ty ); + + *baseangle = M_PI - atan2(tx-x1, ty-y1); + *angle -= *baseangle; + } else{ + *angle = atan2((y2-y1), (x2-x1)) + M_PI_2; + } + + if (*angle < 0) + *angle += 2*M_PI; + if (*angle > 2*M_PI) + *angle -= 2*M_PI; +} diff --git a/src/vikviewport.h b/src/vikviewport.h new file mode 100644 index 0000000..f76745e --- /dev/null +++ b/src/vikviewport.h @@ -0,0 +1,192 @@ +/* + * viking -- GPS Data and Topo Analyzer, Explorer, and Manager + * + * Copyright (C) 2003-2005, Evan Battaglia + * + * 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., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA + * + */ + +#ifndef _VIKING_VIEWPORT_H +#define _VIKING_VIEWPORT_H + +#include +#include +#include + +#include "vikcoord.h" +#include "bbox.h" + +G_BEGIN_DECLS + + +#define VIK_VIEWPORT_TYPE (vik_viewport_get_type ()) +#define VIK_VIEWPORT(obj) (G_TYPE_CHECK_INSTANCE_CAST ((obj), VIK_VIEWPORT_TYPE, VikViewport)) +#define VIK_VIEWPORT_CLASS(klass) (G_TYPE_CHECK_CLASS_CAST ((klass), VIK_VIEWPORT_TYPE, VikViewportClass)) +#define VIK_IS_VIEWPORT(obj) (G_TYPE_CHECK_INSTANCE_TYPE ((obj), VIK_VIEWPORT_TYPE)) +#define VIK_IS_VIEWPORT_CLASS(klass) (G_TYPE_CHECK_CLASS_TYPE ((klass), VIK_VIEWPORT_TYPE)) + +#define VIK_VIEWPORT_MAX_ZOOM 32768.0 +#define VIK_VIEWPORT_MIN_ZOOM (1 / 32.0) + +/* used for coord to screen etc, screen to coord */ +#define VIK_VIEWPORT_UTM_WRONG_ZONE -9999999 +#define VIK_VIEWPORT_OFF_SCREEN_DOUBLE -9999999.9 + + +/* Glib type inheritance and initialization */ +typedef struct _VikViewport VikViewport; +typedef struct _VikViewportClass VikViewportClass; + +struct _VikViewportClass +{ + GtkDrawingAreaClass drawing_area_class; + void (*updated_center) (VikViewport *vw); +}; +GType vik_viewport_get_type (); + + +/* Viking initialization */ +VikViewport *vik_viewport_new (); +void vik_viewport_configure_manually ( VikViewport *vvp, gint width, guint height ); /* for off-screen viewports */ +gboolean vik_viewport_configure ( VikViewport *vp ); + + +/* coordinate transformations */ +void vik_viewport_screen_to_coord ( VikViewport *vvp, int x, int y, VikCoord *coord ); +void vik_viewport_coord_to_screen ( VikViewport *vvp, const VikCoord *coord, int *x, int *y ); + + +/* viewport scale */ +void vik_viewport_set_ympp ( VikViewport *vvp, gdouble ympp ); +void vik_viewport_set_xmpp ( VikViewport *vvp, gdouble xmpp ); +gdouble vik_viewport_get_ympp ( VikViewport *vvp ); +gdouble vik_viewport_get_xmpp ( VikViewport *vvp ); +void vik_viewport_set_zoom ( VikViewport *vvp, gdouble mpp ); +gdouble vik_viewport_get_zoom ( VikViewport *vvp ); +void vik_viewport_zoom_in ( VikViewport *vvp ); +void vik_viewport_zoom_out ( VikViewport *vvp ); +guint vik_viewport_get_scale ( VikViewport *vvp ); + + +/* viewport position */ +const VikCoord *vik_viewport_get_center ( VikViewport *vvp ); +void vik_viewport_set_center_coord ( VikViewport *vvp, const VikCoord *coord, gboolean save_position ); +void vik_viewport_set_center_screen ( VikViewport *vvp, int x, int y ); +void vik_viewport_center_for_zonen ( VikViewport *vvp, struct UTM *center, int zone); +gchar vik_viewport_leftmost_zone ( VikViewport *vvp ); +gchar vik_viewport_rightmost_zone ( VikViewport *vvp ); +void vik_viewport_set_center_utm ( VikViewport *vvp, const struct UTM *utm, gboolean save_position ); +void vik_viewport_set_center_latlon ( VikViewport *vvp, const struct LatLon *ll, gboolean save_position ); +void vik_viewport_corners_for_zonen ( VikViewport *vvp, int zone, VikCoord *ul, VikCoord *br ); +void vik_viewport_get_min_max_lat_lon ( VikViewport *vp, gdouble *min_lat, gdouble *max_lat, gdouble *min_lon, gdouble *max_lon ); +LatLonBBox vik_viewport_get_bbox ( VikViewport *vp ); + +gboolean vik_viewport_go_back ( VikViewport *vvp ); +gboolean vik_viewport_go_forward ( VikViewport *vvp ); +gboolean vik_viewport_back_available ( const VikViewport *vvp ); +gboolean vik_viewport_forward_available ( const VikViewport *vvp ); +void vik_viewport_show_centers ( VikViewport *vvp, GtkWindow *parent ); + +/* drawmode management */ +typedef enum { + VIK_VIEWPORT_DRAWMODE_UTM=0, + VIK_VIEWPORT_DRAWMODE_EXPEDIA, + VIK_VIEWPORT_DRAWMODE_MERCATOR, + VIK_VIEWPORT_DRAWMODE_LATLON, + VIK_VIEWPORT_NUM_DRAWMODES /*< skip >*/ +} VikViewportDrawMode; + +VikCoordMode vik_viewport_get_coord_mode ( const VikViewport *vvp ); +gboolean vik_viewport_is_one_zone ( VikViewport *vvp ); +const gchar *vik_viewport_get_drawmode_name(VikViewport *vv, VikViewportDrawMode mode); +void vik_viewport_set_drawmode ( VikViewport *vvp, VikViewportDrawMode drawmode ); +VikViewportDrawMode vik_viewport_get_drawmode ( VikViewport *vvp ); + /* Do not forget to update vik_viewport_get_drawmode_name() if you modify VikViewportDrawMode */ + + +/* Triggers */ +void vik_viewport_set_trigger ( VikViewport *vp, gpointer trigger ); +gpointer vik_viewport_get_trigger ( VikViewport *vp ); +void vik_viewport_snapshot_save ( VikViewport *vp ); +void vik_viewport_snapshot_load ( VikViewport *vp ); +void vik_viewport_set_half_drawn(VikViewport *vp, gboolean half_drawn); +gboolean vik_viewport_get_half_drawn( VikViewport *vp ); + + +/*************************************************************************************************** + * Drawing-related operations + ***************************************************************************************************/ + +/* Viewport buffer management/drawing to screen */ +GdkPixmap *vik_viewport_get_pixmap ( VikViewport *vvp ); /* get pointer to drawing buffer */ +void vik_viewport_sync ( VikViewport *vvp ); /* draw buffer to window */ +void vik_viewport_pan_sync ( VikViewport *vvp, gint x_off, gint y_off ); +void vik_viewport_clear ( VikViewport *vvp ); +void vik_viewport_draw_pixbuf ( VikViewport *vvp, GdkPixbuf *pixbuf, gint src_x, gint src_y, + gint dest_x, gint dest_y, gint w, gint h ); +gint vik_viewport_get_width ( VikViewport *vvp ); +gint vik_viewport_get_height ( VikViewport *vvp ); + +void vik_viewport_reset_copyrights ( VikViewport *vp ); +void vik_viewport_add_copyright ( VikViewport *vp, const gchar *copyright ); + +void vik_viewport_reset_logos ( VikViewport *vp ); +void vik_viewport_add_logo ( VikViewport *vp, const GdkPixbuf *logo ); + +/* Viewport features */ +void vik_viewport_draw_scale ( VikViewport *vvp ); +void vik_viewport_set_draw_scale ( VikViewport *vvp, gboolean draw_scale ); +gboolean vik_viewport_get_draw_scale ( VikViewport *vvp ); +void vik_viewport_draw_copyright ( VikViewport *vvp ); +void vik_viewport_draw_centermark ( VikViewport *vvp ); +void vik_viewport_set_draw_centermark ( VikViewport *vvp, gboolean draw_centermark ); +gboolean vik_viewport_get_draw_centermark ( VikViewport *vvp ); +void vik_viewport_draw_logo ( VikViewport *vvp ); +void vik_viewport_set_draw_highlight ( VikViewport *vvp, gboolean draw_highlight ); +gboolean vik_viewport_get_draw_highlight ( VikViewport *vvp ); + +/* Color/graphics context management */ +void vik_viewport_set_background_color ( VikViewport *vvp, const gchar *color ); +const gchar *vik_viewport_get_background_color ( VikViewport *vvp ); +GdkColor *vik_viewport_get_background_gdkcolor ( VikViewport *vvp ); +void vik_viewport_set_background_gdkcolor ( VikViewport *vvp, GdkColor * ); +void vik_gc_get_fg_color ( GdkGC *gc, GdkColor *dest ); /* warning: could be slow, don't use obsessively */ +GdkGC *vik_viewport_new_gc ( VikViewport *vvp, const gchar *colorname, gint thickness ); +GdkGC *vik_viewport_new_gc_from_color ( VikViewport *vvp, GdkColor *color, gint thickness ); +GdkGC* vik_viewport_get_black_gc ( VikViewport *vvp ); + +void vik_viewport_set_highlight_color ( VikViewport *vvp, const gchar *color ); +const gchar *vik_viewport_get_highlight_color ( VikViewport *vvp ); +GdkColor *vik_viewport_get_highlight_gdkcolor ( VikViewport *vvp ); +void vik_viewport_set_highlight_gdkcolor ( VikViewport *vvp, GdkColor * ); +GdkGC* vik_viewport_get_gc_highlight ( VikViewport *vvp ); +void vik_viewport_set_highlight_thickness ( VikViewport *vvp, gint thickness ); + +/* Drawing primitives */ +void a_viewport_clip_line ( gint *x1, gint *y1, gint *x2, gint *y2 ); /* run this before drawing a line. vik_viewport_draw_line runs it for you */ +void vik_viewport_draw_line ( VikViewport *vvp, GdkGC *gc, gint x1, gint y1, gint x2, gint y2 ); +void vik_viewport_draw_rectangle ( VikViewport *vvp, GdkGC *gc, gboolean filled, gint x1, gint y1, gint x2, gint y2 ); +void vik_viewport_draw_string ( VikViewport *vvp, GdkFont *font, GdkGC *gc, gint x1, gint y1, const gchar *string ); +void vik_viewport_draw_arc ( VikViewport *vvp, GdkGC *gc, gboolean filled, gint x, gint y, gint width, gint height, gint angle1, gint angle2 ); +void vik_viewport_draw_polygon ( VikViewport *vvp, GdkGC *gc, gboolean filled, GdkPoint *points, gint npoints ); +void vik_viewport_draw_layout ( VikViewport *vvp, GdkGC *gc, gint x, gint y, PangoLayout *layout ); + +/* Utilities */ +void vik_viewport_compute_bearing ( VikViewport *vp, gint x1, gint y1, gint x2, gint y2, gdouble *angle, gdouble *baseangle ); + +G_END_DECLS + +#endif diff --git a/src/vikwaypoint.c b/src/vikwaypoint.c new file mode 100644 index 0000000..2834f59 --- /dev/null +++ b/src/vikwaypoint.c @@ -0,0 +1,292 @@ +/* + * viking -- GPS Data and Topo Analyzer, Explorer, and Manager + * + * Copyright (C) 2003-2005, Evan Battaglia + * + * 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., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA + * + */ + +#include +#include +#include +#include "coords.h" +#include "vikcoord.h" +#include "vikwaypoint.h" +#include "globals.h" +#include "garminsymbols.h" +#include "dems.h" +#include + +VikWaypoint *vik_waypoint_new() +{ + VikWaypoint *wp = g_malloc0 ( sizeof ( VikWaypoint ) ); + wp->altitude = VIK_DEFAULT_ALTITUDE; + wp->name = g_strdup(_("Waypoint")); + wp->image_direction = NAN; + return wp; +} + +// Hmmm tempted to put in new constructor +void vik_waypoint_set_name(VikWaypoint *wp, const gchar *name) +{ + if ( wp->name ) + g_free ( wp->name ); + + wp->name = g_strdup(name); +} + +void vik_waypoint_set_comment_no_copy(VikWaypoint *wp, gchar *comment) +{ + if ( wp->comment ) + g_free ( wp->comment ); + wp->comment = comment; +} + +void vik_waypoint_set_comment(VikWaypoint *wp, const gchar *comment) +{ + if ( wp->comment ) + g_free ( wp->comment ); + + if ( comment && comment[0] != '\0' ) + wp->comment = g_strdup(comment); + else + wp->comment = NULL; +} + +void vik_waypoint_set_description(VikWaypoint *wp, const gchar *description) +{ + if ( wp->description ) + g_free ( wp->description ); + + if ( description && description[0] != '\0' ) + wp->description = g_strdup(description); + else + wp->description = NULL; +} + +void vik_waypoint_set_source(VikWaypoint *wp, const gchar *source) +{ + if ( wp->source ) + g_free ( wp->source ); + + if ( source && source[0] != '\0' ) + wp->source = g_strdup(source); + else + wp->source = NULL; +} + +void vik_waypoint_set_type(VikWaypoint *wp, const gchar *type) +{ + if ( wp->type ) + g_free ( wp->type ); + + if ( type && type[0] != '\0' ) + wp->type = g_strdup(type); + else + wp->type = NULL; +} + +void vik_waypoint_set_url(VikWaypoint *wp, const gchar *url) +{ + if ( wp->url ) + g_free ( wp->url ); + + if ( url && url[0] != '\0' ) + wp->url = g_strdup(url); + else + wp->url = NULL; +} + +void vik_waypoint_set_image(VikWaypoint *wp, const gchar *image) +{ + if ( wp->image ) + g_free ( wp->image ); + + if ( image && image[0] != '\0' ) + wp->image = g_strdup(image); + else + wp->image = NULL; + // NOTE - ATM the image (thumbnail) size is calculated on demand when needed to be first drawn +} + +/** + * Set both direction value and reference at the same time + */ +void vik_waypoint_set_image_direction_info(VikWaypoint *wp, gdouble direction, VikWaypointImageDirectionRef direction_ref) +{ + wp->image_direction = direction; + wp->image_direction_ref = direction_ref; +} + +void vik_waypoint_set_symbol(VikWaypoint *wp, const gchar *symname) +{ + const gchar *hashed_symname; + + if ( wp->symbol ) + g_free ( wp->symbol ); + + // NB symbol_pixbuf is just a reference, so no need to free it + + if ( symname && symname[0] != '\0' ) { + hashed_symname = a_get_hashed_sym ( symname ); + if ( hashed_symname ) + symname = hashed_symname; + wp->symbol = g_strdup ( symname ); + wp->symbol_pixbuf = a_get_wp_sym ( wp->symbol ); + } + else { + wp->symbol = NULL; + wp->symbol_pixbuf = NULL; + } +} + +void vik_waypoint_free(VikWaypoint *wp) +{ + if ( wp->name ) + g_free ( wp->name ); + if ( wp->comment ) + g_free ( wp->comment ); + if ( wp->description ) + g_free ( wp->description ); + if ( wp->source ) + g_free ( wp->source ); + if ( wp->type ) + g_free ( wp->type ); + if ( wp->url ) + g_free ( wp->url ); + if ( wp->image ) + g_free ( wp->image ); + if ( wp->symbol ) + g_free ( wp->symbol ); + g_free ( wp ); +} + +VikWaypoint *vik_waypoint_copy(const VikWaypoint *wp) +{ + VikWaypoint *new_wp = vik_waypoint_new(); + new_wp->coord = wp->coord; + new_wp->visible = wp->visible; + new_wp->altitude = wp->altitude; + new_wp->has_timestamp = wp->has_timestamp; + new_wp->timestamp = wp->timestamp; + vik_waypoint_set_name(new_wp,wp->name); + vik_waypoint_set_comment(new_wp,wp->comment); + vik_waypoint_set_description(new_wp,wp->description); + vik_waypoint_set_source(new_wp,wp->source); + vik_waypoint_set_type(new_wp,wp->type); + vik_waypoint_set_url(new_wp,wp->url); + vik_waypoint_set_image(new_wp,wp->image); + vik_waypoint_set_symbol(new_wp,wp->symbol); + new_wp->image_direction = wp->image_direction; + new_wp->image_direction_ref = wp->image_direction_ref; + return new_wp; +} + +/** + * vik_waypoint_apply_dem_data: + * @wp: The Waypoint to operate on + * @skip_existing: When TRUE, don't change the elevation if the waypoint already has a value + * + * Set elevation data for a waypoint using available DEM information + * + * Returns: TRUE if the waypoint was updated + */ +gboolean vik_waypoint_apply_dem_data ( VikWaypoint *wp, gboolean skip_existing ) +{ + gboolean updated = FALSE; + if ( !(skip_existing && wp->altitude != VIK_DEFAULT_ALTITUDE) ) { + gint16 elev = a_dems_get_elev_by_coord ( &(wp->coord), VIK_DEM_INTERPOL_BEST ); + if ( elev != VIK_DEM_INVALID_ELEVATION ) { + wp->altitude = (gdouble)elev; + updated = TRUE; + } + } + return updated; +} + +/* + * Take a Waypoint and convert it into a byte array + */ +void vik_waypoint_marshall ( VikWaypoint *wp, guint8 **data, guint *datalen) +{ + GByteArray *b = g_byte_array_new(); + guint len; + + // This creates space for fixed sized members like gints and whatnot + // and copies that amount of data from the waypoint to byte array + g_byte_array_append(b, (guint8 *)wp, sizeof(*wp)); + + // This allocates space for variant sized strings + // and copies that amount of data from the waypoint to byte array +#define vwm_append(s) \ + len = (s) ? strlen(s)+1 : 0; \ + g_byte_array_append(b, (guint8 *)&len, sizeof(len)); \ + if (s) g_byte_array_append(b, (guint8 *)s, len); + + vwm_append(wp->name); + vwm_append(wp->comment); + vwm_append(wp->description); + vwm_append(wp->source); + vwm_append(wp->type); + vwm_append(wp->url); + vwm_append(wp->image); + vwm_append(wp->symbol); + + *data = b->data; + *datalen = b->len; + g_byte_array_free(b, FALSE); +#undef vwm_append +} + +/* + * Take a byte array and convert it into a Waypoint + */ +VikWaypoint *vik_waypoint_unmarshall (const guint8 *data_in, guint datalen) +{ + guint len; + VikWaypoint *new_wp = vik_waypoint_new(); + guint8 *data = (guint8*)data_in; + // This copies the fixed sized elements (i.e. visibility, altitude, image_width, etc...) + memcpy(new_wp, data, sizeof(*new_wp)); + data += sizeof(*new_wp); + + // Now the variant sized strings... +#define vwu_get(s) \ + len = *(guint *)data; \ + data += sizeof(len); \ + if (len) { \ + (s) = g_strdup((gchar *)data); \ + } else { \ + (s) = NULL; \ + } \ + data += len; + + vwu_get(new_wp->name); + vwu_get(new_wp->comment); + vwu_get(new_wp->description); + vwu_get(new_wp->source); + vwu_get(new_wp->type); + vwu_get(new_wp->url); + vwu_get(new_wp->image); + vwu_get(new_wp->symbol); + // Different Viking instances need their seperate versions + // copying to itself will get the same reference + new_wp->symbol_pixbuf = a_get_wp_sym(new_wp->symbol); + + return new_wp; +#undef vwu_get +} + diff --git a/src/vikwaypoint.h b/src/vikwaypoint.h new file mode 100644 index 0000000..56e748c --- /dev/null +++ b/src/vikwaypoint.h @@ -0,0 +1,85 @@ +/* + * viking -- GPS Data and Topo Analyzer, Explorer, and Manager + * + * Copyright (C) 2003-2005, Evan Battaglia + * + * 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., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA + * + */ + +#ifndef _VIKING_WAYPOINT_H +#define _VIKING_WAYPOINT_H + +#include "vikcoord.h" + +#include + +G_BEGIN_DECLS + +typedef enum { + WP_IMAGE_DIRECTION_REF_TRUE=0, + WP_IMAGE_DIRECTION_REF_MAGNETIC=1, +} VikWaypointImageDirectionRef; + +#define VIK_WAYPOINT(x) ((VikWaypoint *)(x)) + +typedef struct _VikWaypoint VikWaypoint; + +struct _VikWaypoint { + VikCoord coord; + gboolean visible; + gboolean has_timestamp; + time_t timestamp; + gdouble altitude; + gchar *name; + gchar *comment; + gchar *description; + gchar *source; + gchar *type; + gchar *url; + gchar *image; + // NB Only really applicable if geotagging(exif info) is being used + gdouble image_direction; /* NAN if data unavailable */ + VikWaypointImageDirectionRef image_direction_ref; + /* a rather misleading, ugly hack needed for trwlayer's click image. + * these are the height at which the thumbnail is being drawn, not the + * dimensions of the original image. */ + guint8 image_width; + guint8 image_height; + gchar *symbol; + // Only for GUI display + GdkPixbuf *symbol_pixbuf; +}; + +VikWaypoint *vik_waypoint_new(); +void vik_waypoint_set_name(VikWaypoint *wp, const gchar *name); +void vik_waypoint_set_comment(VikWaypoint *wp, const gchar *comment); +void vik_waypoint_set_description(VikWaypoint *wp, const gchar *description); +void vik_waypoint_set_source(VikWaypoint *wp, const gchar *source); +void vik_waypoint_set_type(VikWaypoint *wp, const gchar *type); +void vik_waypoint_set_url(VikWaypoint *wp, const gchar *url); +void vik_waypoint_set_image(VikWaypoint *wp, const gchar *image); +void vik_waypoint_set_image_direction_info(VikWaypoint *wp, gdouble direction, VikWaypointImageDirectionRef direction_ref); +void vik_waypoint_set_symbol(VikWaypoint *wp, const gchar *symname); +void vik_waypoint_free(VikWaypoint * wp); +VikWaypoint *vik_waypoint_copy(const VikWaypoint *wp); +void vik_waypoint_set_comment_no_copy(VikWaypoint *wp, gchar *comment); +gboolean vik_waypoint_apply_dem_data ( VikWaypoint *wp, gboolean skip_existing ); +void vik_waypoint_marshall ( VikWaypoint *wp, guint8 **data, guint *len); +VikWaypoint *vik_waypoint_unmarshall (const guint8 *data_in, guint datalen); + +G_END_DECLS + +#endif diff --git a/src/vikwebtool.c b/src/vikwebtool.c new file mode 100644 index 0000000..8ceff42 --- /dev/null +++ b/src/vikwebtool.c @@ -0,0 +1,104 @@ +/* + * viking -- GPS Data and Topo Analyzer, Explorer, and Manager + * + * Copyright (C) 2008, Guilhem Bonnefille + * + * 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., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA + * + */ + +#ifdef HAVE_CONFIG_H +#include "config.h" +#endif + +#include "vikwebtool.h" + +#include + +#include + +#include "ui_util.h" + +static GObjectClass *parent_class; + +static void webtool_finalize ( GObject *gob ); + +static void webtool_open ( VikExtTool *self, VikWindow *vwindow ); +static void webtool_open_at_position ( VikExtTool *self, VikWindow *vwindow, VikCoord *vc ); + +G_DEFINE_ABSTRACT_TYPE (VikWebtool, vik_webtool, VIK_EXT_TOOL_TYPE) + +static void vik_webtool_class_init ( VikWebtoolClass *klass ) +{ + GObjectClass *object_class; + VikExtToolClass *ext_tool_class; + + object_class = G_OBJECT_CLASS (klass); + + object_class->finalize = webtool_finalize; + + parent_class = g_type_class_peek_parent (klass); + + ext_tool_class = VIK_EXT_TOOL_CLASS ( klass ); + ext_tool_class->open = webtool_open; + ext_tool_class->open_at_position = webtool_open_at_position; +} + +VikWebtool *vik_webtool_new () +{ + return VIK_WEBTOOL ( g_object_new ( VIK_WEBTOOL_TYPE, NULL ) ); +} + +static void vik_webtool_init ( VikWebtool *vlp ) +{ + // NOTHING +} + +static void webtool_finalize ( GObject *gob ) +{ + // VikWebtool *w = VIK_WEBTOOL ( gob ); + G_OBJECT_CLASS(parent_class)->finalize(gob); +} + +static void webtool_open ( VikExtTool *self, VikWindow *vwindow ) +{ + VikWebtool *vwd = VIK_WEBTOOL ( self ); + gchar *url = vik_webtool_get_url ( vwd, vwindow ); + open_url ( GTK_WINDOW(vwindow), url ); + g_free ( url ); +} + +static void webtool_open_at_position ( VikExtTool *self, VikWindow *vwindow, VikCoord *vc ) +{ + VikWebtool *vwd = VIK_WEBTOOL ( self ); + gchar *url = vik_webtool_get_url_at_position ( vwd, vwindow, vc ); + if ( url ) { + open_url ( GTK_WINDOW(vwindow), url ); + g_free ( url ); + } +} + +gchar *vik_webtool_get_url ( VikWebtool *self, VikWindow *vwindow ) +{ + return VIK_WEBTOOL_GET_CLASS( self )->get_url( self, vwindow ); +} + +gchar *vik_webtool_get_url_at_position ( VikWebtool *self, VikWindow *vwindow, VikCoord *vc ) +{ + if ( VIK_WEBTOOL_GET_CLASS( self )->get_url_at_position ) + return VIK_WEBTOOL_GET_CLASS( self )->get_url_at_position( self, vwindow, vc ); + else + return NULL; +} diff --git a/src/vikwebtool.h b/src/vikwebtool.h new file mode 100644 index 0000000..80df7f5 --- /dev/null +++ b/src/vikwebtool.h @@ -0,0 +1,61 @@ +/* + * viking -- GPS Data and Topo Analyzer, Explorer, and Manager + * + * Copyright (C) 2008, Guilhem Bonnefille + * + * 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., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA + * + */ +#ifndef _VIKING_WEBTOOL_H +#define _VIKING_WEBTOOL_H + +#include + +#include "vikwindow.h" + +#include "vikexttool.h" + +G_BEGIN_DECLS + +#define VIK_WEBTOOL_TYPE (vik_webtool_get_type ()) +#define VIK_WEBTOOL(obj) (G_TYPE_CHECK_INSTANCE_CAST ((obj), VIK_WEBTOOL_TYPE, VikWebtool)) +#define VIK_WEBTOOL_CLASS(klass) (G_TYPE_CHECK_CLASS_CAST ((klass), VIK_WEBTOOL_TYPE, VikWebtoolClass)) +#define IS_VIK_WEBTOOL(obj) (G_TYPE_CHECK_INSTANCE_TYPE ((obj), VIK_WEBTOOL_TYPE)) +#define IS_VIK_WEBTOOL_CLASS(klass) (G_TYPE_CHECK_CLASS_TYPE ((klass), VIK_WEBTOOL_TYPE)) +#define VIK_WEBTOOL_GET_CLASS(obj) (G_TYPE_INSTANCE_GET_CLASS ((obj), VIK_WEBTOOL_TYPE, VikWebtoolClass)) + + +typedef struct _VikWebtool VikWebtool; +typedef struct _VikWebtoolClass VikWebtoolClass; + +struct _VikWebtoolClass +{ + VikExtToolClass object_class; + gchar *(* get_url) (VikWebtool *self, VikWindow *vwindow); + gchar *(* get_url_at_position) (VikWebtool *self, VikWindow *vwindow, VikCoord *vc); +}; + +GType vik_webtool_get_type (); + +struct _VikWebtool { + VikExtTool obj; +}; + +gchar *vik_webtool_get_url ( VikWebtool *self, VikWindow *vwindow ); +gchar *vik_webtool_get_url_at_position ( VikWebtool *self, VikWindow *vwindow, VikCoord *vc ); + +G_END_DECLS + +#endif diff --git a/src/vikwebtool_datasource.c b/src/vikwebtool_datasource.c new file mode 100644 index 0000000..34038ef --- /dev/null +++ b/src/vikwebtool_datasource.c @@ -0,0 +1,529 @@ +/* -*- Mode: C; indent-tabs-mode: t; c-basic-offset: 4; tab-width: 4 -*- */ +/* + * viking -- GPS Data and Topo Analyzer, Explorer, and Manager + * + * Copyright (C) 2013-2015, Rob Norris + * + * 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., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA + * + */ + +#ifdef HAVE_CONFIG_H +#include "config.h" +#endif + +#include "vikwebtool_datasource.h" +#include +#include + +#include +#include + +#include "globals.h" +#include "acquire.h" +#include "maputils.h" +#include "dialog.h" +#include "ui_util.h" + +static GObjectClass *parent_class; +static GHashTable *last_user_strings = NULL; + +static void webtool_datasource_finalize ( GObject *gob ); + +static gchar *webtool_datasource_get_url ( VikWebtool *self, VikWindow *vw ); + +static gboolean webtool_needs_user_string ( VikWebtool *self ); + +typedef struct _VikWebtoolDatasourcePrivate VikWebtoolDatasourcePrivate; + +struct _VikWebtoolDatasourcePrivate +{ + gchar *url; + gchar *url_format_code; + gchar *file_type; + gchar *babel_filter_args; + gchar *input_label; + gchar *user_string; +}; + +#define WEBTOOL_DATASOURCE_GET_PRIVATE(o) (G_TYPE_INSTANCE_GET_PRIVATE ((o), \ + VIK_WEBTOOL_DATASOURCE_TYPE, \ + VikWebtoolDatasourcePrivate)) + +G_DEFINE_TYPE (VikWebtoolDatasource, vik_webtool_datasource, VIK_WEBTOOL_TYPE) + +enum +{ + PROP_0, + PROP_URL, + PROP_URL_FORMAT_CODE, + PROP_FILE_TYPE, + PROP_BABEL_FILTER_ARGS, + PROP_INPUT_LABEL +}; + +static void webtool_datasource_set_property (GObject *object, + guint property_id, + const GValue *value, + GParamSpec *pspec) +{ + VikWebtoolDatasource *self = VIK_WEBTOOL_DATASOURCE ( object ); + VikWebtoolDatasourcePrivate *priv = WEBTOOL_DATASOURCE_GET_PRIVATE ( self ); + + switch ( property_id ) { + + case PROP_URL: + g_free ( priv->url ); + priv->url = g_value_dup_string ( value ); + g_debug ( "VikWebtoolDatasource.url: %s", priv->url ); + break; + + case PROP_URL_FORMAT_CODE: + g_free ( priv->url_format_code ); + priv->url_format_code = g_value_dup_string ( value ); + g_debug ( "VikWebtoolDatasource.url_format_code: %s", priv->url_format_code ); + break; + + case PROP_FILE_TYPE: + g_free ( priv->file_type ); + priv->file_type = g_value_dup_string ( value ); + g_debug ( "VikWebtoolDatasource.file_type: %s", priv->file_type ); + break; + + case PROP_BABEL_FILTER_ARGS: + g_free ( priv->babel_filter_args ); + priv->babel_filter_args = g_value_dup_string ( value ); + g_debug ( "VikWebtoolDatasource.babel_filter_args: %s", priv->babel_filter_args ); + break; + + case PROP_INPUT_LABEL: + g_free ( priv->input_label ); + priv->input_label = g_value_dup_string ( value ); + g_debug ( "VikWebtoolDatasource.input_label: %s", priv->input_label ); + break; + + default: + /* We don't have any other property... */ + G_OBJECT_WARN_INVALID_PROPERTY_ID ( object, property_id, pspec ); + break; + } +} + +static void webtool_datasource_get_property (GObject *object, + guint property_id, + GValue *value, + GParamSpec *pspec) +{ + VikWebtoolDatasource *self = VIK_WEBTOOL_DATASOURCE ( object ); + VikWebtoolDatasourcePrivate *priv = WEBTOOL_DATASOURCE_GET_PRIVATE ( self ); + + switch ( property_id ) { + + case PROP_URL: g_value_set_string ( value, priv->url ); break; + case PROP_URL_FORMAT_CODE: g_value_set_string ( value, priv->url_format_code ); break; + case PROP_FILE_TYPE: g_value_set_string ( value, priv->url ); break; + case PROP_BABEL_FILTER_ARGS: g_value_set_string ( value, priv->babel_filter_args ); break; + case PROP_INPUT_LABEL: g_value_set_string ( value, priv->input_label ); break; + + default: + /* We don't have any other property... */ + G_OBJECT_WARN_INVALID_PROPERTY_ID ( object, property_id, pspec ); + break; + } +} + +typedef struct { + VikExtTool *self; + VikWindow *vw; + VikViewport *vvp; + GtkWidget *user_string; +} datasource_t; + + +static void ensure_last_user_strings_hash() { + if ( last_user_strings == NULL ) { + last_user_strings = g_hash_table_new_full ( g_str_hash, + g_str_equal, + g_free, + g_free ); + } +} + + +static gchar *get_last_user_string ( const datasource_t *source ) { + ensure_last_user_strings_hash(); + gchar *label = vik_ext_tool_get_label ( source->self ); + gchar *last_str = g_hash_table_lookup ( last_user_strings, label ); + g_free( label ); + return last_str; +} + + +static void set_last_user_string ( const datasource_t *source, const gchar *s ) { + ensure_last_user_strings_hash(); + g_hash_table_insert ( last_user_strings, + vik_ext_tool_get_label ( source->self ), + g_strdup ( s ) ); +} + +static gpointer datasource_init ( acq_vik_t *avt ) +{ + datasource_t *data = g_malloc(sizeof(*data)); + data->self = avt->userdata; + data->vw = avt->vw; + data->vvp = avt->vvp; + data->user_string = NULL; + return data; +} + +static void datasource_add_setup_widgets ( GtkWidget *dialog, VikViewport *vvp, gpointer user_data ) +{ + datasource_t *widgets = (datasource_t *)user_data; + VikWebtoolDatasourcePrivate *priv = WEBTOOL_DATASOURCE_GET_PRIVATE ( widgets->self ); + GtkWidget *user_string_label; + gchar *label = g_strdup_printf( "%s:", priv->input_label ); + user_string_label = gtk_label_new ( label ); + widgets->user_string = ui_entry_new ( NULL, GTK_ENTRY_ICON_SECONDARY ); + + gchar *last_str = get_last_user_string ( widgets ); + if ( last_str ) + gtk_entry_set_text( GTK_ENTRY( widgets->user_string ), last_str ); + + // 'ok' when press return in the entry + g_signal_connect_swapped (widgets->user_string, "activate", G_CALLBACK(a_dialog_response_accept), dialog); + + /* Packing all widgets */ + GtkBox *box = GTK_BOX(gtk_dialog_get_content_area(GTK_DIALOG(dialog))); + gtk_box_pack_start ( box, user_string_label, FALSE, FALSE, 5 ); + gtk_box_pack_start ( box, widgets->user_string, FALSE, FALSE, 5 ); + gtk_widget_show_all ( dialog ); + gtk_dialog_set_default_response ( GTK_DIALOG(dialog), GTK_RESPONSE_ACCEPT ); + // NB presently the focus is overridden later on by the acquire.c code. + gtk_widget_grab_focus ( widgets->user_string ); + + g_free ( label ); +} + + + +static void datasource_get_process_options ( gpointer user_data, ProcessOptions *po, DownloadFileOptions *options, const gchar *notused1, const gchar *notused2 ) +{ + datasource_t *data = (datasource_t*) user_data; + + VikWebtool *vwd = VIK_WEBTOOL ( data->self ); + VikWebtoolDatasourcePrivate *priv = WEBTOOL_DATASOURCE_GET_PRIVATE ( data->self ); + + if ( webtool_needs_user_string ( vwd ) ) { + priv->user_string = g_strdup ( gtk_entry_get_text ( GTK_ENTRY ( data->user_string ) ) ); + + if ( priv->user_string[0] != '\0' ) { + set_last_user_string ( data, priv->user_string ); + } + } + + gchar *url = vik_webtool_get_url ( vwd, data->vw ); + g_debug ("%s: %s", __FUNCTION__, url ); + + po->url = g_strdup ( url ); + + // Only use first section of the file_type string + // One can't use values like 'kml -x transform,rte=wpt' in order to do fancy things + // since it won't be in the right order for the overall GPSBabel command + // So prevent any potentially dangerous behaviour + gchar **parts = NULL; + if ( priv->file_type ) + parts = g_strsplit ( priv->file_type, " ", 0); + if ( parts ) + po->input_file_type = g_strdup ( parts[0] ); + else + po->input_file_type = NULL; + g_strfreev ( parts ); + + options = NULL; + po->babel_filters = priv->babel_filter_args; +} + +static void cleanup ( gpointer data ) +{ + g_free ( data ); +} + +static void webtool_datasource_open ( VikExtTool *self, VikWindow *vw ) +{ + gboolean search = webtool_needs_user_string ( VIK_WEBTOOL ( self ) ); + + // Use VikDataSourceInterface to give thready goodness controls of downloading stuff (i.e. can cancel the request) + + // Can now create a 'VikDataSourceInterface' on the fly... + VikDataSourceInterface *vik_datasource_interface = g_malloc(sizeof(VikDataSourceInterface)); + + // An 'easy' way of assigning values + VikDataSourceInterface data = { + vik_ext_tool_get_label (self), + vik_ext_tool_get_label (self), + VIK_DATASOURCE_ADDTOLAYER, + VIK_DATASOURCE_INPUTTYPE_NONE, + FALSE, // Maintain current view - rather than setting it to the acquired points + TRUE, + TRUE, + (VikDataSourceInitFunc) datasource_init, + (VikDataSourceCheckExistenceFunc) NULL, + (VikDataSourceAddSetupWidgetsFunc) (search ? datasource_add_setup_widgets : NULL), + (VikDataSourceGetProcessOptionsFunc) datasource_get_process_options, + (VikDataSourceProcessFunc) a_babel_convert_from, + (VikDataSourceProgressFunc) NULL, + (VikDataSourceAddProgressWidgetsFunc) NULL, + (VikDataSourceCleanupFunc) cleanup, + (VikDataSourceOffFunc) NULL, + NULL, + 0, + NULL, + NULL, + 0 + }; + memcpy ( vik_datasource_interface, &data, sizeof(VikDataSourceInterface) ); + + a_acquire ( vw, vik_window_layers_panel(vw), vik_window_viewport (vw), data.mode, vik_datasource_interface, self, cleanup ); +} + +static void vik_webtool_datasource_class_init ( VikWebtoolDatasourceClass *klass ) +{ + GObjectClass *gobject_class; + VikWebtoolClass *base_class; + GParamSpec *pspec; + + gobject_class = G_OBJECT_CLASS (klass); + + gobject_class->finalize = webtool_datasource_finalize; + gobject_class->set_property = webtool_datasource_set_property; + gobject_class->get_property = webtool_datasource_get_property; + + pspec = g_param_spec_string ("url", + "Template URL", + "Set the template URL", + VIKING_URL /* default value */, + G_PARAM_CONSTRUCT_ONLY | G_PARAM_READWRITE); + g_object_class_install_property (gobject_class, + PROP_URL, + pspec); + + pspec = g_param_spec_string ("url_format_code", + "Template URL Format Code", + "Set the template URL format code", + "LRBT", // default value + G_PARAM_CONSTRUCT_ONLY | G_PARAM_READWRITE); + g_object_class_install_property (gobject_class, + PROP_URL_FORMAT_CODE, + pspec); + + pspec = g_param_spec_string ("file_type", + "The file type expected", + "Set the file type", + NULL, // default value ~ equates to internal GPX reading + G_PARAM_CONSTRUCT_ONLY | G_PARAM_READWRITE); + g_object_class_install_property (gobject_class, + PROP_FILE_TYPE, + pspec); + + pspec = g_param_spec_string ("babel_filter_args", + "The command line filter options to pass to gpsbabel", + "Set the command line filter options for gpsbabel", + NULL, // default value + G_PARAM_CONSTRUCT_ONLY | G_PARAM_READWRITE); + g_object_class_install_property (gobject_class, + PROP_BABEL_FILTER_ARGS, + pspec); + + pspec = g_param_spec_string ("input_label", + "The label for the user input box if input is required.", + "Set the label to be shown next to the user input box if an input term is required", + _("Search Term"), + G_PARAM_CONSTRUCT_ONLY | G_PARAM_READWRITE); + g_object_class_install_property (gobject_class, + PROP_INPUT_LABEL, + pspec); + + parent_class = g_type_class_peek_parent (klass); + + base_class = VIK_WEBTOOL_CLASS ( klass ); + base_class->get_url = webtool_datasource_get_url; + + // Override default open function here: + VikExtToolClass *ext_tool_class = VIK_EXT_TOOL_CLASS ( klass ); + ext_tool_class->open = webtool_datasource_open; + + g_type_class_add_private (klass, sizeof (VikWebtoolDatasourcePrivate)); +} + +VikWebtoolDatasource *vik_webtool_datasource_new () +{ + return VIK_WEBTOOL_DATASOURCE ( g_object_new ( VIK_WEBTOOL_DATASOURCE_TYPE, NULL ) ); +} + +VikWebtoolDatasource *vik_webtool_datasource_new_with_members ( const gchar *label, + const gchar *url, + const gchar *url_format_code, + const gchar *file_type, + const gchar *babel_filter_args, + const gchar *input_label ) +{ + VikWebtoolDatasource *result = VIK_WEBTOOL_DATASOURCE ( g_object_new ( VIK_WEBTOOL_DATASOURCE_TYPE, + "label", label, + "url", url, + "url_format_code", url_format_code, + "file_type", file_type, + "babel_filter_args", babel_filter_args, + "input_label", input_label, + NULL ) ); + + return result; +} + +static void vik_webtool_datasource_init ( VikWebtoolDatasource *self ) +{ + VikWebtoolDatasourcePrivate *priv = WEBTOOL_DATASOURCE_GET_PRIVATE (self); + priv->url = NULL; + priv->url_format_code = NULL; + priv->file_type = NULL; + priv->babel_filter_args = NULL; + priv->input_label = NULL; + priv->user_string = NULL; +} + +static void webtool_datasource_finalize ( GObject *gob ) +{ + VikWebtoolDatasourcePrivate *priv = WEBTOOL_DATASOURCE_GET_PRIVATE ( gob ); + g_free ( priv->url ); priv->url = NULL; + g_free ( priv->url_format_code ); priv->url_format_code = NULL; + g_free ( priv->file_type ); priv->file_type = NULL; + g_free ( priv->babel_filter_args ); priv->babel_filter_args = NULL; + g_free ( priv->input_label ); priv->input_label = NULL; + g_free ( priv->user_string); priv->user_string = NULL; + G_OBJECT_CLASS(parent_class)->finalize(gob); +} + +#define MAX_NUMBER_CODES 7 + +/** + * Calculate individual elements (similarly to the VikWebtool Bounds & Center) for *all* potential values + * Then only values specified by the URL format are used in parameterizing the URL + */ +static gchar *webtool_datasource_get_url ( VikWebtool *self, VikWindow *vw ) +{ + VikWebtoolDatasourcePrivate *priv = WEBTOOL_DATASOURCE_GET_PRIVATE ( self ); + VikViewport *viewport = vik_window_viewport ( vw ); + + // Get top left and bottom right lat/lon pairs from the viewport + gdouble min_lat, max_lat, min_lon, max_lon; + gchar sminlon[G_ASCII_DTOSTR_BUF_SIZE]; + gchar smaxlon[G_ASCII_DTOSTR_BUF_SIZE]; + gchar sminlat[G_ASCII_DTOSTR_BUF_SIZE]; + gchar smaxlat[G_ASCII_DTOSTR_BUF_SIZE]; + vik_viewport_get_min_max_lat_lon ( viewport, &min_lat, &max_lat, &min_lon, &max_lon ); + + // Cannot simply use g_strdup_printf and gdouble due to locale. + // As we compute an URL, we have to think in C locale. + g_ascii_dtostr (sminlon, G_ASCII_DTOSTR_BUF_SIZE, min_lon); + g_ascii_dtostr (smaxlon, G_ASCII_DTOSTR_BUF_SIZE, max_lon); + g_ascii_dtostr (sminlat, G_ASCII_DTOSTR_BUF_SIZE, min_lat); + g_ascii_dtostr (smaxlat, G_ASCII_DTOSTR_BUF_SIZE, max_lat); + + // Center values + const VikCoord *coord = vik_viewport_get_center ( viewport ); + struct LatLon ll; + vik_coord_to_latlon ( coord, &ll ); + + gchar scenterlat[G_ASCII_DTOSTR_BUF_SIZE]; + gchar scenterlon[G_ASCII_DTOSTR_BUF_SIZE]; + g_ascii_dtostr (scenterlat, G_ASCII_DTOSTR_BUF_SIZE, ll.lat); + g_ascii_dtostr (scenterlon, G_ASCII_DTOSTR_BUF_SIZE, ll.lon); + + guint8 zoom = 17; // A zoomed in default + // zoom - ideally x & y factors need to be the same otherwise use the default + if ( vik_viewport_get_xmpp ( viewport ) == vik_viewport_get_ympp ( viewport ) ) + zoom = map_utils_mpp_to_zoom_level ( vik_viewport_get_zoom ( viewport ) ); + + gchar szoom[G_ASCII_DTOSTR_BUF_SIZE]; + g_snprintf ( szoom, G_ASCII_DTOSTR_BUF_SIZE, "%d", zoom ); + + gint len = 0; + if ( priv->url_format_code ) + len = strlen ( priv->url_format_code ); + if ( len > MAX_NUMBER_CODES ) + len = MAX_NUMBER_CODES; + + gchar* values[MAX_NUMBER_CODES]; + int i; + for ( i = 0; i < MAX_NUMBER_CODES; i++ ) { + values[i] = '\0'; + } + + for ( i = 0; i < len; i++ ) { + switch ( g_ascii_toupper ( priv->url_format_code[i] ) ) { + case 'L': values[i] = g_strdup ( sminlon ); break; + case 'R': values[i] = g_strdup ( smaxlon ); break; + case 'B': values[i] = g_strdup ( sminlat ); break; + case 'T': values[i] = g_strdup ( smaxlat ); break; + case 'A': values[i] = g_strdup ( scenterlat ); break; + case 'O': values[i] = g_strdup ( scenterlon ); break; + case 'Z': values[i] = g_strdup ( szoom ); break; + case 'S': values[i] = g_strdup ( priv->user_string ); break; + default: break; + } + } + + gchar *url = g_strdup_printf ( priv->url, values[0], values[1], values[2], values[3], values[4], values[5], values[6] ); + + for ( i = 0; i < MAX_NUMBER_CODES; i++ ) { + g_free ( values[i] ); + } + + return url; +} + +// NB Only works for ascii strings +char* strcasestr2(const char *dst, const char *src) +{ + if ( !dst || !src ) + return NULL; + + if(src[0] == '\0') + return (char*)dst; + + int len = strlen(src) - 1; + char sc = tolower(src[0]); + for(char dc = *dst; (dc = *dst); dst++) { + dc = tolower(dc); + if(sc == dc && (len == 0 || !strncasecmp(dst+1, src+1, len))) + return (char*)dst; + } + + return NULL; +} + +/** + * Returns true if the URL format contains 'S' -- that is, a search term entry + * box needs to be displayed + */ +static gboolean webtool_needs_user_string ( VikWebtool *self ) +{ + VikWebtoolDatasourcePrivate *priv = WEBTOOL_DATASOURCE_GET_PRIVATE ( self ); + // For some reason (my) Windows build gets built with -D_GNU_SOURCE +#if (_GNU_SOURCE && !WINDOWS) + return (strcasestr(priv->url_format_code, "S") != NULL); +#else + return (strcasestr2(priv->url_format_code, "S") != NULL); +#endif +} diff --git a/src/vikwebtool_datasource.h b/src/vikwebtool_datasource.h new file mode 100644 index 0000000..fbeb300 --- /dev/null +++ b/src/vikwebtool_datasource.h @@ -0,0 +1,63 @@ +/* -*- Mode: C; indent-tabs-mode: t; c-basic-offset: 4; tab-width: 4 -*- */ +/* + * viking -- GPS Data and Topo Analyzer, Explorer, and Manager + * + * Copyright (C) 2013, Rob Norris + * + * 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., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA + * + */ +#ifndef _VIKING_WEBTOOL_DATASOURCE_H +#define _VIKING_WEBTOOL_DATASOURCE_H + +#include + +#include "vikwebtool.h" + +G_BEGIN_DECLS + +#define VIK_WEBTOOL_DATASOURCE_TYPE (vik_webtool_datasource_get_type ()) +#define VIK_WEBTOOL_DATASOURCE(obj) (G_TYPE_CHECK_INSTANCE_CAST ((obj), VIK_WEBTOOL_DATASOURCE_TYPE, VikWebtoolDatasource)) +#define VIK_WEBTOOL_DATASOURCE_CLASS(klass) (G_TYPE_CHECK_CLASS_CAST ((klass), VIK_WEBTOOL_DATASOURCE_TYPE, VikWebtoolDatasourceClass)) +#define IS_VIK_WEBTOOL_DATASOURCE(obj) (G_TYPE_CHECK_INSTANCE_TYPE ((obj), VIK_WEBTOOL_DATASOURCE_TYPE)) +#define IS_VIK_WEBTOOL_DATASOURCE_CLASS(klass) (G_TYPE_CHECK_CLASS_TYPE ((klass), VIK_WEBTOOL_DATASOURCE_TYPE)) +#define VIK_WEBTOOL_DATASOURCE_GET_CLASS(obj) (G_TYPE_INSTANCE_GET_CLASS ((obj), VIK_WEBTOOL_DATASOURCE_TYPE, VikWebtoolDatasourceClass)) + + +typedef struct _VikWebtoolDatasource VikWebtoolDatasource; +typedef struct _VikWebtoolDatasourceClass VikWebtoolDatasourceClass; + +struct _VikWebtoolDatasourceClass +{ + VikWebtoolClass object_class; +}; + +GType vik_webtool_datasource_get_type (); + +struct _VikWebtoolDatasource { + VikWebtool obj; +}; + +VikWebtoolDatasource *vik_webtool_datasource_new ( ); +VikWebtoolDatasource *vik_webtool_datasource_new_with_members ( const gchar *label, + const gchar *url, + const gchar *url_format_code, + const gchar *file_type, + const gchar *babel_filter_args, + const gchar *input_label); + +G_END_DECLS + +#endif diff --git a/src/vikwebtoolbounds.c b/src/vikwebtoolbounds.c new file mode 100644 index 0000000..c2d733d --- /dev/null +++ b/src/vikwebtoolbounds.c @@ -0,0 +1,199 @@ +/* -*- Mode: C; indent-tabs-mode: t; c-basic-offset: 4; tab-width: 4 -*- */ +/* + * viking -- GPS Data and Topo Analyzer, Explorer, and Manager + * + * Copyright (C) 2011-2015, Rob Norris + * + * 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., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA + * + */ + +#ifdef HAVE_CONFIG_H +#include "config.h" +#endif + +#include "vikwebtoolbounds.h" + +#include + +#include +#include + +#include "globals.h" + +static GObjectClass *parent_class; + +static void webtool_bounds_finalize ( GObject *gob ); +static gchar *webtool_bounds_get_url ( VikWebtool *vw, VikWindow *vwindow ); +static gchar *webtool_bounds_get_url_at_position ( VikWebtool *vw, VikWindow *vwindow, VikCoord *vc ); + +typedef struct _VikWebtoolBoundsPrivate VikWebtoolBoundsPrivate; + +struct _VikWebtoolBoundsPrivate +{ + gchar *url; +}; + +#define WEBTOOL_BOUNDS_GET_PRIVATE(o) (G_TYPE_INSTANCE_GET_PRIVATE ((o), \ + VIK_WEBTOOL_BOUNDS_TYPE, \ + VikWebtoolBoundsPrivate)) + +G_DEFINE_TYPE (VikWebtoolBounds, vik_webtool_bounds, VIK_WEBTOOL_TYPE) + +enum +{ + PROP_0, + + PROP_URL, +}; + +static void +webtool_bounds_set_property (GObject *object, + guint property_id, + const GValue *value, + GParamSpec *pspec) +{ + VikWebtoolBounds *self = VIK_WEBTOOL_BOUNDS (object); + VikWebtoolBoundsPrivate *priv = WEBTOOL_BOUNDS_GET_PRIVATE (self); + + switch (property_id) + { + case PROP_URL: + g_free (priv->url); + priv->url = g_value_dup_string (value); + g_debug ("VikWebtoolBounds.url: %s", priv->url); + break; + + default: + /* We don't have any other property... */ + G_OBJECT_WARN_INVALID_PROPERTY_ID (object, property_id, pspec); + break; + } +} + +static void +webtool_bounds_get_property (GObject *object, + guint property_id, + GValue *value, + GParamSpec *pspec) +{ + VikWebtoolBounds *self = VIK_WEBTOOL_BOUNDS (object); + VikWebtoolBoundsPrivate *priv = WEBTOOL_BOUNDS_GET_PRIVATE (self); + + switch (property_id) + { + case PROP_URL: + g_value_set_string (value, priv->url); + break; + + default: + /* We don't have any other property... */ + G_OBJECT_WARN_INVALID_PROPERTY_ID (object, property_id, pspec); + break; + } +} + +static void +vik_webtool_bounds_class_init ( VikWebtoolBoundsClass *klass ) +{ + GObjectClass *gobject_class; + VikWebtoolClass *base_class; + GParamSpec *pspec; + + gobject_class = G_OBJECT_CLASS (klass); + + gobject_class->finalize = webtool_bounds_finalize; + gobject_class->set_property = webtool_bounds_set_property; + gobject_class->get_property = webtool_bounds_get_property; + + pspec = g_param_spec_string ("url", + "Template Url", + "Set the template url", + VIKING_URL /* default value */, + G_PARAM_CONSTRUCT_ONLY | G_PARAM_READWRITE); + g_object_class_install_property (gobject_class, + PROP_URL, + pspec); + + parent_class = g_type_class_peek_parent (klass); + + base_class = VIK_WEBTOOL_CLASS ( klass ); + base_class->get_url = webtool_bounds_get_url; + base_class->get_url_at_position = webtool_bounds_get_url_at_position; + + g_type_class_add_private (klass, sizeof (VikWebtoolBoundsPrivate)); +} + +VikWebtoolBounds *vik_webtool_bounds_new () +{ + return VIK_WEBTOOL_BOUNDS ( g_object_new ( VIK_WEBTOOL_BOUNDS_TYPE, NULL ) ); +} + +VikWebtoolBounds *vik_webtool_bounds_new_with_members ( const gchar *label, const gchar *url ) +{ + VikWebtoolBounds *result = VIK_WEBTOOL_BOUNDS ( g_object_new ( VIK_WEBTOOL_BOUNDS_TYPE, + "label", label, + "url", url, + NULL ) ); + + return result; +} + +static void +vik_webtool_bounds_init ( VikWebtoolBounds *self ) +{ + VikWebtoolBoundsPrivate *priv = WEBTOOL_BOUNDS_GET_PRIVATE (self); + priv->url = NULL; +} + +static void webtool_bounds_finalize ( GObject *gob ) +{ + VikWebtoolBoundsPrivate *priv = WEBTOOL_BOUNDS_GET_PRIVATE ( gob ); + g_free ( priv->url ); priv->url = NULL; + G_OBJECT_CLASS(parent_class)->finalize(gob); +} + +static gchar *webtool_bounds_get_url ( VikWebtool *self, VikWindow *vwindow ) +{ + VikWebtoolBoundsPrivate *priv = NULL; + VikViewport *viewport = NULL; + + priv = WEBTOOL_BOUNDS_GET_PRIVATE (self); + viewport = vik_window_viewport ( vwindow ); + + // Get top left and bottom right lat/lon pairs from the viewport + gdouble min_lat, max_lat, min_lon, max_lon; + gchar sminlon[G_ASCII_DTOSTR_BUF_SIZE]; + gchar smaxlon[G_ASCII_DTOSTR_BUF_SIZE]; + gchar sminlat[G_ASCII_DTOSTR_BUF_SIZE]; + gchar smaxlat[G_ASCII_DTOSTR_BUF_SIZE]; + vik_viewport_get_min_max_lat_lon ( viewport, &min_lat, &max_lat, &min_lon, &max_lon ); + + // Cannot simply use g_strdup_printf and gdouble due to locale. + // As we compute an URL, we have to think in C locale. + g_ascii_dtostr (sminlon, G_ASCII_DTOSTR_BUF_SIZE, min_lon); + g_ascii_dtostr (smaxlon, G_ASCII_DTOSTR_BUF_SIZE, max_lon); + g_ascii_dtostr (sminlat, G_ASCII_DTOSTR_BUF_SIZE, min_lat); + g_ascii_dtostr (smaxlat, G_ASCII_DTOSTR_BUF_SIZE, max_lat); + + return g_strdup_printf ( priv->url, sminlon, smaxlon, sminlat, smaxlat ); +} + +static gchar *webtool_bounds_get_url_at_position ( VikWebtool *self, VikWindow *vwindow, VikCoord *vc ) +{ + // TODO: could use zoom level to generate an offset from center lat/lon to get the bounds + // For now simply use the existing function to use bounds from the viewport + return webtool_bounds_get_url ( self, vwindow ); +} diff --git a/src/vikwebtoolbounds.h b/src/vikwebtoolbounds.h new file mode 100644 index 0000000..95fbb79 --- /dev/null +++ b/src/vikwebtoolbounds.h @@ -0,0 +1,58 @@ +/* -*- Mode: C; indent-tabs-mode: t; c-basic-offset: 4; tab-width: 4 -*- */ +/* + * viking -- GPS Data and Topo Analyzer, Explorer, and Manager + * + * Copyright (C) 2011, Rob Norris + * + * 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., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA + * + */ +#ifndef _VIKING_WEBTOOL_BOUNDS_H +#define _VIKING_WEBTOOL_BOUNDS_H + +#include + +#include "vikwebtool.h" + +G_BEGIN_DECLS + +#define VIK_WEBTOOL_BOUNDS_TYPE (vik_webtool_bounds_get_type ()) +#define VIK_WEBTOOL_BOUNDS(obj) (G_TYPE_CHECK_INSTANCE_CAST ((obj), VIK_WEBTOOL_BOUNDS_TYPE, VikWebtoolBounds)) +#define VIK_WEBTOOL_BOUNDS_CLASS(klass) (G_TYPE_CHECK_CLASS_CAST ((klass), VIK_WEBTOOL_BOUNDS_TYPE, VikWebtoolBoundsClass)) +#define IS_VIK_WEBTOOL_BOUNDS(obj) (G_TYPE_CHECK_INSTANCE_TYPE ((obj), VIK_WEBTOOL_BOUNDS_TYPE)) +#define IS_VIK_WEBTOOL_BOUNDS_CLASS(klass) (G_TYPE_CHECK_CLASS_TYPE ((klass), VIK_WEBTOOL_BOUNDS_TYPE)) +#define VIK_WEBTOOL_BOUNDS_GET_CLASS(obj) (G_TYPE_INSTANCE_GET_CLASS ((obj), VIK_WEBTOOL_BOUNDS_TYPE, VikWebtoolBoundsClass)) + + +typedef struct _VikWebtoolBounds VikWebtoolBounds; +typedef struct _VikWebtoolBoundsClass VikWebtoolBoundsClass; + +struct _VikWebtoolBoundsClass +{ + VikWebtoolClass object_class; +}; + +GType vik_webtool_bounds_get_type (); + +struct _VikWebtoolBounds { + VikWebtool obj; +}; + +VikWebtoolBounds* vik_webtool_bounds_new ( ); +VikWebtoolBounds* vik_webtool_bounds_new_with_members ( const gchar *label, const gchar *url ); + +G_END_DECLS + +#endif diff --git a/src/vikwebtoolcenter.c b/src/vikwebtoolcenter.c new file mode 100644 index 0000000..3ef83ed --- /dev/null +++ b/src/vikwebtoolcenter.c @@ -0,0 +1,217 @@ +/* + * viking -- GPS Data and Topo Analyzer, Explorer, and Manager + * + * Copyright (C) 2008, Guilhem Bonnefille + * + * 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., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA + * + */ + +#ifdef HAVE_CONFIG_H +#include "config.h" +#endif + +#include "vikwebtoolcenter.h" + +#include + +#include +#include + +#include "util.h" +#include "globals.h" +#include "maputils.h" + +static GObjectClass *parent_class; + +static void webtool_center_finalize ( GObject *gob ); + +static guint8 webtool_center_mpp_to_zoom ( VikWebtool *self, gdouble mpp ); +static gchar *webtool_center_get_url ( VikWebtool *vw, VikWindow *vwindow ); +static gchar *webtool_center_get_url_at_position ( VikWebtool *vw, VikWindow *vwindow, VikCoord *vc ); + +typedef struct _VikWebtoolCenterPrivate VikWebtoolCenterPrivate; + +struct _VikWebtoolCenterPrivate +{ + gchar *url; +}; + +#define WEBTOOL_CENTER_GET_PRIVATE(o) (G_TYPE_INSTANCE_GET_PRIVATE ((o), \ + VIK_WEBTOOL_CENTER_TYPE, \ + VikWebtoolCenterPrivate)) + +G_DEFINE_TYPE (VikWebtoolCenter, vik_webtool_center, VIK_WEBTOOL_TYPE) + +enum +{ + PROP_0, + + PROP_URL, +}; + +static void +webtool_center_set_property (GObject *object, + guint property_id, + const GValue *value, + GParamSpec *pspec) +{ + VikWebtoolCenter *self = VIK_WEBTOOL_CENTER (object); + VikWebtoolCenterPrivate *priv = WEBTOOL_CENTER_GET_PRIVATE (self); + + switch (property_id) + { + case PROP_URL: + g_free (priv->url); + priv->url = g_value_dup_string (value); + g_debug ("VikWebtoolCenter.url: %s", priv->url); + break; + + default: + /* We don't have any other property... */ + G_OBJECT_WARN_INVALID_PROPERTY_ID (object, property_id, pspec); + break; + } +} + +static void +webtool_center_get_property (GObject *object, + guint property_id, + GValue *value, + GParamSpec *pspec) +{ + VikWebtoolCenter *self = VIK_WEBTOOL_CENTER (object); + VikWebtoolCenterPrivate *priv = WEBTOOL_CENTER_GET_PRIVATE (self); + + switch (property_id) + { + case PROP_URL: + g_value_set_string (value, priv->url); + break; + + default: + /* We don't have any other property... */ + G_OBJECT_WARN_INVALID_PROPERTY_ID (object, property_id, pspec); + break; + } +} + +static void +vik_webtool_center_class_init ( VikWebtoolCenterClass *klass ) +{ + GObjectClass *gobject_class; + VikWebtoolClass *base_class; + GParamSpec *pspec; + + gobject_class = G_OBJECT_CLASS (klass); + + gobject_class->finalize = webtool_center_finalize; + gobject_class->set_property = webtool_center_set_property; + gobject_class->get_property = webtool_center_get_property; + + pspec = g_param_spec_string ("url", + "Template Url", + "Set the template url", + VIKING_URL /* default value */, + G_PARAM_CONSTRUCT_ONLY | G_PARAM_READWRITE); + g_object_class_install_property (gobject_class, + PROP_URL, + pspec); + + parent_class = g_type_class_peek_parent (klass); + + base_class = VIK_WEBTOOL_CLASS ( klass ); + base_class->get_url = webtool_center_get_url; + base_class->get_url_at_position = webtool_center_get_url_at_position; + + klass->mpp_to_zoom = webtool_center_mpp_to_zoom; + + g_type_class_add_private (klass, sizeof (VikWebtoolCenterPrivate)); +} + +VikWebtoolCenter *vik_webtool_center_new () +{ + return VIK_WEBTOOL_CENTER ( g_object_new ( VIK_WEBTOOL_CENTER_TYPE, NULL ) ); +} + +VikWebtoolCenter *vik_webtool_center_new_with_members ( const gchar *label, const gchar *url ) +{ + VikWebtoolCenter *result = VIK_WEBTOOL_CENTER ( g_object_new ( VIK_WEBTOOL_CENTER_TYPE, + "label", label, + "url", url, + NULL ) ); + + return result; +} + +static void +vik_webtool_center_init ( VikWebtoolCenter *self ) +{ + VikWebtoolCenterPrivate *priv = WEBTOOL_CENTER_GET_PRIVATE (self); + priv->url = NULL; +} + +static void webtool_center_finalize ( GObject *gob ) +{ + VikWebtoolCenterPrivate *priv = WEBTOOL_CENTER_GET_PRIVATE ( gob ); + g_free ( priv->url ); priv->url = NULL; + G_OBJECT_CLASS(parent_class)->finalize(gob); +} + +static guint8 webtool_center_mpp_to_zoom ( VikWebtool *self, gdouble mpp ) { + return map_utils_mpp_to_zoom_level ( mpp ); +} + +static gchar *webtool_center_get_url_at_position ( VikWebtool *self, VikWindow *vwindow, VikCoord *vc ) +{ + VikWebtoolCenterPrivate *priv = NULL; + VikViewport *viewport = NULL; + guint8 zoom = 17; + struct LatLon ll; + gchar strlat[G_ASCII_DTOSTR_BUF_SIZE], strlon[G_ASCII_DTOSTR_BUF_SIZE]; + + priv = WEBTOOL_CENTER_GET_PRIVATE (self); + viewport = vik_window_viewport ( vwindow ); + // Coords + // Use the provided position otherwise use center of the viewport + if ( vc ) + vik_coord_to_latlon ( vc, &ll ); + else { + const VikCoord *coord = NULL; + coord = vik_viewport_get_center ( viewport ); + vik_coord_to_latlon ( coord, &ll ); + } + + // zoom - ideally x & y factors need to be the same otherwise use the default + if ( vik_viewport_get_xmpp ( viewport ) == vik_viewport_get_ympp ( viewport ) ) + zoom = vik_webtool_center_mpp_to_zoom ( self, vik_viewport_get_zoom ( viewport ) ); + + // Cannot simply use g_strdup_printf and gdouble due to locale. + // As we compute an URL, we have to think in C locale. + g_ascii_dtostr (strlat, G_ASCII_DTOSTR_BUF_SIZE, ll.lat); + g_ascii_dtostr (strlon, G_ASCII_DTOSTR_BUF_SIZE, ll.lon); + + return g_strdup_printf ( priv->url, strlat, strlon, zoom ); +} + +static gchar *webtool_center_get_url ( VikWebtool *self, VikWindow *vwindow ) +{ + return webtool_center_get_url_at_position ( self, vwindow, NULL ); +} + +guint8 vik_webtool_center_mpp_to_zoom (VikWebtool *self, gdouble mpp) +{ + return VIK_WEBTOOL_CENTER_GET_CLASS( self )->mpp_to_zoom( self, mpp ); +} diff --git a/src/vikwebtoolcenter.h b/src/vikwebtoolcenter.h new file mode 100644 index 0000000..034fdb2 --- /dev/null +++ b/src/vikwebtoolcenter.h @@ -0,0 +1,60 @@ +/* + * viking -- GPS Data and Topo Analyzer, Explorer, and Manager + * + * Copyright (C) 2008, Guilhem Bonnefille + * + * 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., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA + * + */ +#ifndef _VIKING_WEBTOOL_CENTER_H +#define _VIKING_WEBTOOL_CENTER_H + +#include + +#include "vikwebtool.h" + +G_BEGIN_DECLS + +#define VIK_WEBTOOL_CENTER_TYPE (vik_webtool_center_get_type ()) +#define VIK_WEBTOOL_CENTER(obj) (G_TYPE_CHECK_INSTANCE_CAST ((obj), VIK_WEBTOOL_CENTER_TYPE, VikWebtoolCenter)) +#define VIK_WEBTOOL_CENTER_CLASS(klass) (G_TYPE_CHECK_CLASS_CAST ((klass), VIK_WEBTOOL_CENTER_TYPE, VikWebtoolCenterClass)) +#define IS_VIK_WEBTOOL_CENTER(obj) (G_TYPE_CHECK_INSTANCE_TYPE ((obj), VIK_WEBTOOL_CENTER_TYPE)) +#define IS_VIK_WEBTOOL_CENTER_CLASS(klass) (G_TYPE_CHECK_CLASS_TYPE ((klass), VIK_WEBTOOL_CENTER_TYPE)) +#define VIK_WEBTOOL_CENTER_GET_CLASS(obj) (G_TYPE_INSTANCE_GET_CLASS ((obj), VIK_WEBTOOL_CENTER_TYPE, VikWebtoolCenterClass)) + + +typedef struct _VikWebtoolCenter VikWebtoolCenter; +typedef struct _VikWebtoolCenterClass VikWebtoolCenterClass; + +struct _VikWebtoolCenterClass +{ + VikWebtoolClass object_class; + guint8 (* mpp_to_zoom) (VikWebtool *self, gdouble mpp); +}; + +GType vik_webtool_center_get_type (); + +struct _VikWebtoolCenter { + VikWebtool obj; +}; + +guint8 vik_webtool_center_mpp_to_zoom (VikWebtool *self, gdouble mpp); + +VikWebtoolCenter* vik_webtool_center_new ( ); +VikWebtoolCenter* vik_webtool_center_new_with_members ( const gchar *label, const gchar *url ); + +G_END_DECLS + +#endif diff --git a/src/vikwebtoolformat.c b/src/vikwebtoolformat.c new file mode 100644 index 0000000..fef6bac --- /dev/null +++ b/src/vikwebtoolformat.c @@ -0,0 +1,300 @@ +/* -*- Mode: C; indent-tabs-mode: t; c-basic-offset: 4; tab-width: 4 -*- */ +/* + * viking -- GPS Data and Topo Analyzer, Explorer, and Manager + * + * Copyright (C) 2014, Rob Norris + * + * 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 Format Public License for more details. + * + * You should have received a copy of the GNU Format Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA + * + */ + +#ifdef HAVE_CONFIG_H +#include "config.h" +#endif + +#include "vikwebtoolformat.h" + +#include +#include + +#include "util.h" +#include "globals.h" +#include "maputils.h" + +static GObjectClass *parent_class; + +static void webtool_format_finalize ( GObject *gob ); + +static guint8 webtool_format_mpp_to_zoom ( VikWebtool *self, gdouble mpp ); +static gchar *webtool_format_get_url ( VikWebtool *vw, VikWindow *vwindow ); +static gchar *webtool_format_get_url_at_position ( VikWebtool *vw, VikWindow *vwindow, VikCoord *vc ); + +typedef struct _VikWebtoolFormatPrivate VikWebtoolFormatPrivate; + +struct _VikWebtoolFormatPrivate +{ + gchar *url; + gchar *url_format_code; +}; + +#define WEBTOOL_FORMAT_GET_PRIVATE(o) (G_TYPE_INSTANCE_GET_PRIVATE ((o), \ + VIK_WEBTOOL_FORMAT_TYPE, \ + VikWebtoolFormatPrivate)) + +G_DEFINE_TYPE (VikWebtoolFormat, vik_webtool_format, VIK_WEBTOOL_TYPE) + +enum +{ + PROP_0, + + PROP_URL, + PROP_URL_FORMAT_CODE, +}; + +static void +webtool_format_set_property (GObject *object, + guint property_id, + const GValue *value, + GParamSpec *pspec) +{ + VikWebtoolFormat *self = VIK_WEBTOOL_FORMAT (object); + VikWebtoolFormatPrivate *priv = WEBTOOL_FORMAT_GET_PRIVATE (self); + + switch (property_id) { + case PROP_URL: + g_free (priv->url); + priv->url = g_value_dup_string (value); + g_debug ("VikWebtoolFormat.url: %s", priv->url); + break; + case PROP_URL_FORMAT_CODE: + g_free ( priv->url_format_code ); + priv->url_format_code = g_value_dup_string ( value ); + g_debug ( "VikWebtoolFormat.url_format_code: %s", priv->url_format_code ); + break; + + default: + /* We don't have any other property... */ + G_OBJECT_WARN_INVALID_PROPERTY_ID (object, property_id, pspec); + break; + } +} + +static void +webtool_format_get_property (GObject *object, + guint property_id, + GValue *value, + GParamSpec *pspec) +{ + VikWebtoolFormat *self = VIK_WEBTOOL_FORMAT (object); + VikWebtoolFormatPrivate *priv = WEBTOOL_FORMAT_GET_PRIVATE (self); + + switch (property_id) { + case PROP_URL: + g_value_set_string (value, priv->url); + break; + + case PROP_URL_FORMAT_CODE: + g_value_set_string ( value, priv->url_format_code ); + break; + + default: + /* We don't have any other property... */ + G_OBJECT_WARN_INVALID_PROPERTY_ID (object, property_id, pspec); + break; + } +} + +static void +vik_webtool_format_class_init ( VikWebtoolFormatClass *klass ) +{ + GObjectClass *gobject_class; + VikWebtoolClass *base_class; + GParamSpec *pspec; + + gobject_class = G_OBJECT_CLASS (klass); + + gobject_class->finalize = webtool_format_finalize; + gobject_class->set_property = webtool_format_set_property; + gobject_class->get_property = webtool_format_get_property; + + pspec = g_param_spec_string ("url", + "Template Url", + "Set the template url", + VIKING_URL /* default value */, + G_PARAM_CONSTRUCT_ONLY | G_PARAM_READWRITE); + g_object_class_install_property (gobject_class, + PROP_URL, + pspec); + + pspec = g_param_spec_string ("url_format_code", + "Template URL Format Code", + "Set the template URL format code", + "AOZ", // default value Lat, Long, Zoom + G_PARAM_CONSTRUCT_ONLY | G_PARAM_READWRITE); + g_object_class_install_property (gobject_class, + PROP_URL_FORMAT_CODE, + pspec); + + parent_class = g_type_class_peek_parent (klass); + + base_class = VIK_WEBTOOL_CLASS ( klass ); + base_class->get_url = webtool_format_get_url; + base_class->get_url_at_position = webtool_format_get_url_at_position; + + klass->mpp_to_zoom = webtool_format_mpp_to_zoom; + + g_type_class_add_private (klass, sizeof (VikWebtoolFormatPrivate)); +} + +VikWebtoolFormat *vik_webtool_format_new () +{ + return VIK_WEBTOOL_FORMAT ( g_object_new ( VIK_WEBTOOL_FORMAT_TYPE, NULL ) ); +} + +VikWebtoolFormat *vik_webtool_format_new_with_members ( const gchar *label, + const gchar *url, + const gchar *url_format_code ) +{ + VikWebtoolFormat *result = VIK_WEBTOOL_FORMAT ( g_object_new ( VIK_WEBTOOL_FORMAT_TYPE, + "label", label, + "url", url, + "url_format_code", url_format_code, + NULL ) ); + + return result; +} + +static void +vik_webtool_format_init ( VikWebtoolFormat *self ) +{ + VikWebtoolFormatPrivate *priv = WEBTOOL_FORMAT_GET_PRIVATE (self); + priv->url = NULL; + priv->url_format_code = NULL; +} + +static void webtool_format_finalize ( GObject *gob ) +{ + VikWebtoolFormatPrivate *priv = WEBTOOL_FORMAT_GET_PRIVATE ( gob ); + g_free ( priv->url ); priv->url = NULL; + g_free ( priv->url_format_code ); priv->url_format_code = NULL; + G_OBJECT_CLASS(parent_class)->finalize(gob); +} + +static guint8 webtool_format_mpp_to_zoom ( VikWebtool *self, gdouble mpp ) { + return map_utils_mpp_to_zoom_level ( mpp ); +} + +#define MAX_NUMBER_CODES 9 + +static gchar *webtool_format_get_url_at_position ( VikWebtool *self, VikWindow *vw, VikCoord *vc ) +{ + VikWebtoolFormatPrivate *priv = NULL; + priv = WEBTOOL_FORMAT_GET_PRIVATE (self); + + VikViewport *viewport = vik_window_viewport ( vw ); + + // Get top left and bottom right lat/lon pairs from the viewport + gdouble min_lat, max_lat, min_lon, max_lon; + gchar sminlon[G_ASCII_DTOSTR_BUF_SIZE]; + gchar smaxlon[G_ASCII_DTOSTR_BUF_SIZE]; + gchar sminlat[G_ASCII_DTOSTR_BUF_SIZE]; + gchar smaxlat[G_ASCII_DTOSTR_BUF_SIZE]; + vik_viewport_get_min_max_lat_lon ( viewport, &min_lat, &max_lat, &min_lon, &max_lon ); + + // Cannot simply use g_strdup_printf and gdouble due to locale. + // As we compute an URL, we have to think in C locale. + g_ascii_dtostr (sminlon, G_ASCII_DTOSTR_BUF_SIZE, min_lon); + g_ascii_dtostr (smaxlon, G_ASCII_DTOSTR_BUF_SIZE, max_lon); + g_ascii_dtostr (sminlat, G_ASCII_DTOSTR_BUF_SIZE, min_lat); + g_ascii_dtostr (smaxlat, G_ASCII_DTOSTR_BUF_SIZE, max_lat); + + // Center values + const VikCoord *coord = vik_viewport_get_center ( viewport ); + struct LatLon ll; + vik_coord_to_latlon ( coord, &ll ); + + gchar scenterlat[G_ASCII_DTOSTR_BUF_SIZE]; + gchar scenterlon[G_ASCII_DTOSTR_BUF_SIZE]; + g_ascii_dtostr (scenterlat, G_ASCII_DTOSTR_BUF_SIZE, ll.lat); + g_ascii_dtostr (scenterlon, G_ASCII_DTOSTR_BUF_SIZE, ll.lon); + + struct LatLon llpt; + llpt.lat = 0.0; + llpt.lon = 0.0; + if ( vc ) + vik_coord_to_latlon ( vc, &llpt ); + else + // No position supplied so might as well use the center + vik_coord_to_latlon ( coord, &llpt ); + + gchar spointlat[G_ASCII_DTOSTR_BUF_SIZE]; + gchar spointlon[G_ASCII_DTOSTR_BUF_SIZE]; + g_ascii_dtostr (spointlat, G_ASCII_DTOSTR_BUF_SIZE, llpt.lat); + g_ascii_dtostr (spointlon, G_ASCII_DTOSTR_BUF_SIZE, llpt.lon); + + guint8 zoom = 17; // A zoomed in default + // zoom - ideally x & y factors need to be the same otherwise use the default + if ( vik_viewport_get_xmpp ( viewport ) == vik_viewport_get_ympp ( viewport ) ) + zoom = map_utils_mpp_to_zoom_level ( vik_viewport_get_zoom ( viewport ) ); + + gchar szoom[G_ASCII_DTOSTR_BUF_SIZE]; + g_snprintf ( szoom, G_ASCII_DTOSTR_BUF_SIZE, "%d", zoom ); + + gint len = 0; + if ( priv->url_format_code ) + len = strlen ( priv->url_format_code ); + if ( len > MAX_NUMBER_CODES ) + len = MAX_NUMBER_CODES; + + gchar* values[MAX_NUMBER_CODES]; + int i; + for ( i = 0; i < MAX_NUMBER_CODES; i++ ) { + values[i] = '\0'; + } + + for ( i = 0; i < len; i++ ) { + switch ( g_ascii_toupper ( priv->url_format_code[i] ) ) { + case 'L': values[i] = g_strdup ( sminlon ); break; + case 'R': values[i] = g_strdup ( smaxlon ); break; + case 'B': values[i] = g_strdup ( sminlat ); break; + case 'T': values[i] = g_strdup ( smaxlat ); break; + case 'A': values[i] = g_strdup ( scenterlat ); break; + case 'O': values[i] = g_strdup ( scenterlon ); break; + case 'Z': values[i] = g_strdup ( szoom ); break; + case 'P': values[i] = g_strdup ( spointlat ); break; + case 'N': values[i] = g_strdup ( spointlon ); break; + default: break; + } + } + + gchar *url = g_strdup_printf ( priv->url, values[0], values[1], values[2], values[3], values[4], values[5], values[6], values[7], values[8] ); + + for ( i = 0; i < MAX_NUMBER_CODES; i++ ) { + g_free ( values[i] ); + } + + g_debug ("%s %s", __FUNCTION__, url); + return url; +} + +static gchar *webtool_format_get_url ( VikWebtool *self, VikWindow *vw ) +{ + return webtool_format_get_url_at_position ( self, vw, NULL ); +} + +guint8 vik_webtool_format_mpp_to_zoom (VikWebtool *self, gdouble mpp) +{ + return VIK_WEBTOOL_FORMAT_GET_CLASS( self )->mpp_to_zoom( self, mpp ); +} diff --git a/src/vikwebtoolformat.h b/src/vikwebtoolformat.h new file mode 100644 index 0000000..c9aaa05 --- /dev/null +++ b/src/vikwebtoolformat.h @@ -0,0 +1,62 @@ +/* -*- Mode: C; indent-tabs-mode: t; c-basic-offset: 4; tab-width: 4 -*- */ +/* + * viking -- GPS Data and Topo Analyzer, Explorer, and Manager + * + * Copyright (C) 2014, Rob Norris + * + * 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 Format Public License for more details. + * + * You should have received a copy of the GNU Format Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA + * + */ +#ifndef _VIKING_WEBTOOL_FORMAT_H +#define _VIKING_WEBTOOL_FORMAT_H + +#include + +#include "vikwebtool.h" + +G_BEGIN_DECLS + +#define VIK_WEBTOOL_FORMAT_TYPE (vik_webtool_format_get_type ()) +#define VIK_WEBTOOL_FORMAT(obj) (G_TYPE_CHECK_INSTANCE_CAST ((obj), VIK_WEBTOOL_FORMAT_TYPE, VikWebtoolFormat)) +#define VIK_WEBTOOL_FORMAT_CLASS(klass) (G_TYPE_CHECK_CLASS_CAST ((klass), VIK_WEBTOOL_FORMAT_TYPE, VikWebtoolFormatClass)) +#define IS_VIK_WEBTOOL_FORMAT(obj) (G_TYPE_CHECK_INSTANCE_TYPE ((obj), VIK_WEBTOOL_FORMAT_TYPE)) +#define IS_VIK_WEBTOOL_FORMAT_CLASS(klass) (G_TYPE_CHECK_CLASS_TYPE ((klass), VIK_WEBTOOL_FORMAT_TYPE)) +#define VIK_WEBTOOL_FORMAT_GET_CLASS(obj) (G_TYPE_INSTANCE_GET_CLASS ((obj), VIK_WEBTOOL_FORMAT_TYPE, VikWebtoolFormatClass)) + +typedef struct _VikWebtoolFormat VikWebtoolFormat; +typedef struct _VikWebtoolFormatClass VikWebtoolFormatClass; + +struct _VikWebtoolFormatClass +{ + VikWebtoolClass object_class; + guint8 (* mpp_to_zoom) (VikWebtool *self, gdouble mpp); +}; + +GType vik_webtool_format_get_type (); + +struct _VikWebtoolFormat { + VikWebtool obj; +}; + +guint8 vik_webtool_format_mpp_to_zoom (VikWebtool *self, gdouble mpp); + +VikWebtoolFormat* vik_webtool_format_new ( ); +VikWebtoolFormat* vik_webtool_format_new_with_members ( const gchar *label, + const gchar *url, + const gchar *url_format_code ); + +G_END_DECLS + +#endif diff --git a/src/vikwindow.c b/src/vikwindow.c new file mode 100644 index 0000000..553c0f0 --- /dev/null +++ b/src/vikwindow.c @@ -0,0 +1,5296 @@ +/* + * viking -- GPS Data and Topo Analyzer, Explorer, and Manager + * + * Copyright (C) 2003-2005, Evan Battaglia + * Copyright (C) 2005-2006, Alex Foobarian + * Copyright (C) 2012-2015, Rob Norris + * + * 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., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA + * + */ + +#ifdef HAVE_CONFIG_H +#include "config.h" +#endif + +#include "viking.h" +#include "background.h" +#include "acquire.h" +#include "datasources.h" +#include "geojson.h" +#include "vikgoto.h" +#include "dems.h" +#include "mapcache.h" +#include "print.h" +#include "preferences.h" +#include "toolbar.h" +#include "viklayer_defaults.h" +#include "icons/icons.h" +#include "vikexttools.h" +#include "vikexttool_datasources.h" +#include "garminsymbols.h" +#include "vikmapslayer.h" +#include "vikrouting.h" +#include "geonamessearch.h" +#include "dir.h" +#include "kmz.h" +#ifdef HAVE_LIBGEOCLUE_2 +#include "libgeoclue.h" +#endif +#include "viktrwlayer.h" + +#ifdef HAVE_STDLIB_H +#include +#endif +#ifdef HAVE_MATH_H +#include +#endif +#ifdef HAVE_STRING_H +#include +#endif +#include +#include +#include +#include +#include +#include +#include + +// This seems rather arbitary, quite large and pointless +// I mean, if you have a thousand windows open; +// why not be allowed to open a thousand more... +#define MAX_WINDOWS 1024 +static guint window_count = 0; +static GSList *window_list = NULL; + +#define VIKING_WINDOW_WIDTH 1000 +#define VIKING_WINDOW_HEIGHT 800 +#define DRAW_IMAGE_DEFAULT_WIDTH 1280 +#define DRAW_IMAGE_DEFAULT_HEIGHT 1024 +#define DRAW_IMAGE_DEFAULT_SAVE_AS_PNG TRUE + +// The last used directories +static gchar *last_folder_files_uri = NULL; +static gchar *last_folder_images_uri = NULL; + +static void window_finalize ( GObject *gob ); +static GObjectClass *parent_class; + +static void window_set_filename ( VikWindow *vw, const gchar *filename ); +static const gchar *window_get_filename ( VikWindow *vw ); + +static VikWindow *window_new (); + +static void draw_update ( VikWindow *vw ); + +static void newwindow_cb ( GtkAction *a, VikWindow *vw ); + +// Signals +static void open_window ( VikWindow *vw, GSList *files ); +static void destroy_window ( GtkWidget *widget, + gpointer data ); + +/* Drawing & stuff */ + +static gboolean delete_event( VikWindow *vw ); + +static gboolean key_press_event( VikWindow *vw, GdkEventKey *event, gpointer data ); +static gboolean key_release_event( VikWindow *vw, GdkEventKey *event, gpointer data ); + +static void center_changed_cb ( VikWindow *vw ); +static void window_configure_event ( VikWindow *vw ); +static void draw_sync ( VikWindow *vw ); +static void draw_redraw ( VikWindow *vw ); +static void draw_scroll ( VikWindow *vw, GdkEventScroll *event ); +static void draw_click ( VikWindow *vw, GdkEventButton *event ); +static void draw_release ( VikWindow *vw, GdkEventButton *event ); +static void draw_mouse_motion ( VikWindow *vw, GdkEventMotion *event ); +static void draw_zoom_cb ( GtkAction *a, VikWindow *vw ); +static void draw_goto_cb ( GtkAction *a, VikWindow *vw ); +static void draw_refresh_cb ( GtkAction *a, VikWindow *vw ); + +static void draw_status ( VikWindow *vw ); + +/* End Drawing Functions */ + +static void toggle_draw_scale ( GtkAction *a, VikWindow *vw ); +static void toggle_draw_centermark ( GtkAction *a, VikWindow *vw ); +static void toggle_draw_highlight ( GtkAction *a, VikWindow *vw ); + +static void menu_addlayer_cb ( GtkAction *a, VikWindow *vw ); +static void menu_properties_cb ( GtkAction *a, VikWindow *vw ); +static void menu_delete_layer_cb ( GtkAction *a, VikWindow *vw ); + +/* tool management */ +typedef struct { + VikToolInterface ti; + gpointer state; + gint layer_type; +} toolbox_tool_t; +#define TOOL_LAYER_TYPE_NONE -1 + +typedef struct { + int active_tool; + int n_tools; + toolbox_tool_t *tools; + VikWindow *vw; +} toolbox_tools_t; + +static void menu_cb ( GtkAction *old, GtkAction *a, VikWindow *vw ); +static void window_change_coord_mode_cb ( GtkAction *old, GtkAction *a, VikWindow *vw ); +static toolbox_tools_t* toolbox_create(VikWindow *vw); +static void toolbox_add_tool(toolbox_tools_t *vt, VikToolInterface *vti, gint layer_type ); +static int toolbox_get_tool(toolbox_tools_t *vt, const gchar *tool_name); +static void toolbox_activate(toolbox_tools_t *vt, const gchar *tool_name); +static const GdkCursor *toolbox_get_cursor(toolbox_tools_t *vt, const gchar *tool_name); +static void toolbox_click (toolbox_tools_t *vt, GdkEventButton *event); +static void toolbox_move (toolbox_tools_t *vt, GdkEventMotion *event); +static void toolbox_release (toolbox_tools_t *vt, GdkEventButton *event); + + +/* ui creation */ +static void window_create_ui( VikWindow *window ); +static void register_vik_icons (GtkIconFactory *icon_factory); + +/* i/o */ +static void load_file ( GtkAction *a, VikWindow *vw ); +static void open_external_layer ( GtkAction *a, VikWindow *vw ); +static gboolean save_file_as ( GtkAction *a, VikWindow *vw ); +static gboolean save_file ( GtkAction *a, VikWindow *vw ); +static gboolean save_file_and_exit ( GtkAction *a, VikWindow *vw ); +static gboolean window_save ( VikWindow *vw ); + +struct _VikWindow { + GtkWindow gtkwindow; + GtkWidget *hpaned; + VikViewport *viking_vvp; + VikLayersPanel *viking_vlp; + VikStatusbar *viking_vs; + VikToolbar *viking_vtb; + + GtkWidget *main_vbox; + GtkWidget *menu_hbox; + + GdkCursor *busy_cursor; + GdkCursor *viewport_cursor; // only a reference + + /* tool management state */ + guint current_tool; + toolbox_tools_t *vt; + guint16 tool_layer_id; + guint16 tool_tool_id; + + GtkActionGroup *action_group; + + // Display controls + // NB scale, centermark and highlight are in viewport. + gboolean show_full_screen; + gboolean show_side_panel; + gboolean show_statusbar; + gboolean show_toolbar; + gboolean show_main_menu; + gboolean show_side_panel_buttons; + gboolean show_side_panel_calendar; + + gboolean select_move; + gboolean pan_move; + gint pan_x, pan_y; + gint delayed_pan_x, delayed_pan_y; // Temporary storage + gboolean single_click_pending; + + guint draw_image_width, draw_image_height; + gboolean draw_image_save_as_png; + + gchar *filename; + gboolean modified; + VikLoadType_t loaded_type; + + gboolean only_updating_coord_mode_ui; /* hack for a bug in GTK */ + GtkUIManager *uim; + + GThread *thread; + /* half-drawn update */ + VikLayer *trigger; + VikCoord trigger_center; + + /* Store at this level for highlighted selection drawing since it applies to the viewport and the layers panel */ + /* Only one of these items can be selected at the same time */ + gpointer selected_vtl; /* notionally VikTrwLayer */ + GHashTable *selected_tracks; + gpointer selected_track; /* notionally VikTrack */ + GHashTable *selected_waypoints; + gpointer selected_waypoint; /* notionally VikWaypoint */ + /* only use for individual track or waypoint */ + /* For track(s) & waypoint(s) it is the layer they are in - this helps refering to the individual item easier */ + gpointer containing_vtl; /* notionally VikTrwLayer */ +}; + +enum { + TOOL_PAN = 0, + TOOL_ZOOM, + TOOL_RULER, + TOOL_SELECT, + TOOL_LAYER, + NUMBER_OF_TOOLS +}; + +enum { + VW_NEWWINDOW_SIGNAL, + VW_OPENWINDOW_SIGNAL, + VW_LAST_SIGNAL +}; + +static guint window_signals[VW_LAST_SIGNAL] = { 0 }; + +// TODO get rid of this as this is unnecessary duplication... +static gchar *tool_names[NUMBER_OF_TOOLS] = { N_("Pan"), N_("Zoom"), N_("Ruler"), N_("Select") }; + +G_DEFINE_TYPE (VikWindow, vik_window, GTK_TYPE_WINDOW) + +VikViewport * vik_window_viewport(VikWindow *vw) +{ + return(vw->viking_vvp); +} + +VikLayersPanel * vik_window_layers_panel(VikWindow *vw) +{ + return(vw->viking_vlp); +} + +/** + * Returns the statusbar for the window + */ +VikStatusbar * vik_window_get_statusbar ( VikWindow *vw ) +{ + return vw->viking_vs; +} + +/** + * Returns the 'project' filename + */ +const gchar *vik_window_get_filename (VikWindow *vw) +{ + return vw->filename; +} + +typedef struct { + VikStatusbar *vs; + vik_statusbar_type_t vs_type; + gchar* message; // Always make a copy of this data +} statusbar_idle_data; + +/** + * For the actual statusbar update! + */ +static gboolean statusbar_idle_update ( statusbar_idle_data *sid ) +{ + vik_statusbar_set_message ( sid->vs, sid->vs_type, sid->message ); + g_free ( sid->message ); + g_free ( sid ); + return FALSE; +} + +/** + * vik_window_statusbar_update: + * @vw: The main window in which the statusbar will be updated. + * @message: The string to be displayed. This is copied. + * @vs_type: The part of the statusbar to be updated. + * + * This updates any part of the statusbar with the new string. + * It handles calling from the main thread or any background thread + * ATM this mostly used from background threads - as from the main thread + * one may use the vik_statusbar_set_message() directly. + */ +void vik_window_statusbar_update ( VikWindow *vw, const gchar* message, vik_statusbar_type_t vs_type ) +{ + GThread *thread = vik_window_get_thread ( vw ); + if ( !thread ) + // Do nothing + return; + + statusbar_idle_data *sid = g_malloc ( sizeof (statusbar_idle_data) ); + sid->vs = vw->viking_vs; + sid->vs_type = vs_type; + sid->message = g_strdup ( message ); + + if ( g_thread_self() == thread ) { + g_idle_add ( (GSourceFunc) statusbar_idle_update, sid ); + } + else { + // From a background thread + gdk_threads_add_idle ( (GSourceFunc) statusbar_idle_update, sid ); + } +} + +// Actual signal handlers +static void destroy_window ( GtkWidget *widget, + gpointer data ) +{ + g_debug ( "%s", __FUNCTION__ ); + if ( ! --window_count ) { + g_free ( last_folder_files_uri ); + g_free ( last_folder_images_uri ); + gtk_main_quit (); + } +} + +#define VIK_SETTINGS_WIN_DEFAULT_TOOL "window_default_tool" + +#define VIK_SETTINGS_WIN_SIDEPANEL "window_sidepanel" +#define VIK_SETTINGS_WIN_STATUSBAR "window_statusbar" +#define VIK_SETTINGS_WIN_TOOLBAR "window_toolbar" +// Menubar setting to off is never auto saved in case it's accidentally turned off +// It's not so obvious so to recover the menu visibility. +// Thus this value is for setting manually via editting the settings file directly +#define VIK_SETTINGS_WIN_MENUBAR "window_menubar" +#define VIK_SETTINGS_WIN_SIDEPANEL_BUTTONS "window_sidepanel_buttons" +#define VIK_SETTINGS_WIN_SIDEPANEL_CALENDAR "window_sidepanel_calendar" + +VikWindow *vik_window_new_window () +{ + if ( window_count < MAX_WINDOWS ) + { + VikWindow *vw = window_new (); + + if ( window_count == 0 ) { + vik_window_statusbar_update ( vw, _("This is Viking "VIKING_VERSION), VIK_STATUSBAR_INFO ); + } + + g_signal_connect (G_OBJECT (vw), "destroy", + G_CALLBACK (destroy_window), NULL); + g_signal_connect (G_OBJECT (vw), "newwindow", + G_CALLBACK (vik_window_new_window), NULL); + g_signal_connect (G_OBJECT (vw), "openwindow", + G_CALLBACK (open_window), NULL); + + gtk_widget_show_all ( GTK_WIDGET(vw) ); + + if ( a_vik_get_restore_window_state() ) { + // These settings are applied after the show all as these options hide widgets + gboolean sidepanel; + if ( a_settings_get_boolean ( VIK_SETTINGS_WIN_SIDEPANEL, &sidepanel ) ) + if ( ! sidepanel ) { + gtk_widget_hide ( GTK_WIDGET(vw->viking_vlp) ); + GtkWidget *check_box = gtk_ui_manager_get_widget ( vw->uim, "/ui/MainMenu/View/SetShow/ViewSidePanel" ); + gtk_check_menu_item_set_active ( GTK_CHECK_MENU_ITEM(check_box), FALSE ); + } + + gboolean statusbar; + if ( a_settings_get_boolean ( VIK_SETTINGS_WIN_STATUSBAR, &statusbar ) ) + if ( ! statusbar ) { + gtk_widget_hide ( GTK_WIDGET(vw->viking_vs) ); + GtkWidget *check_box = gtk_ui_manager_get_widget ( vw->uim, "/ui/MainMenu/View/SetShow/ViewStatusBar" ); + gtk_check_menu_item_set_active ( GTK_CHECK_MENU_ITEM(check_box), FALSE ); + } + + gboolean toolbar; + if ( a_settings_get_boolean ( VIK_SETTINGS_WIN_TOOLBAR, &toolbar ) ) + if ( ! toolbar ) { + gtk_widget_hide ( toolbar_get_widget (vw->viking_vtb) ); + GtkWidget *check_box = gtk_ui_manager_get_widget ( vw->uim, "/ui/MainMenu/View/SetShow/ViewToolBar" ); + gtk_check_menu_item_set_active ( GTK_CHECK_MENU_ITEM(check_box), FALSE ); + } + + gboolean menubar; + if ( a_settings_get_boolean ( VIK_SETTINGS_WIN_MENUBAR, &menubar ) ) + if ( ! menubar ) { + gtk_widget_hide ( gtk_ui_manager_get_widget ( vw->uim, "/ui/MainMenu" ) ); + GtkWidget *check_box = gtk_ui_manager_get_widget ( vw->uim, "/ui/MainMenu/View/SetShow/ViewMainMenu" ); + gtk_check_menu_item_set_active ( GTK_CHECK_MENU_ITEM(check_box), FALSE ); + } + + gboolean sidepanel_buttons; + if ( a_settings_get_boolean ( VIK_SETTINGS_WIN_SIDEPANEL_BUTTONS, &sidepanel_buttons ) ) + if ( ! sidepanel_buttons ) { + vik_layers_panel_show_buttons ( vw->viking_vlp, FALSE ); + GtkWidget *check_box = gtk_ui_manager_get_widget ( vw->uim, "/ui/MainMenu/View/SetShow/ViewSidePanelButtons" ); + gtk_check_menu_item_set_active ( GTK_CHECK_MENU_ITEM(check_box), FALSE ); + } + + gboolean sidepanel_calendar; + if ( a_settings_get_boolean ( VIK_SETTINGS_WIN_SIDEPANEL_CALENDAR, &sidepanel_calendar ) ) + if ( ! sidepanel_calendar ) { + vik_layers_panel_show_calendar ( vw->viking_vlp, FALSE ); + GtkWidget *check_box = gtk_ui_manager_get_widget ( vw->uim, "/ui/MainMenu/View/SetShow/ViewSidePanelCalendar" ); + gtk_check_menu_item_set_active ( GTK_CHECK_MENU_ITEM(check_box), FALSE ); + } + + } + window_count++; + + return vw; + } + return NULL; +} + +/** + * determine_location_thread: + * @vw: The window that will get updated + * @threaddata: Data used by our background thread mechanism + * + * Use the features in vikgoto to determine where we are + * Then set up the viewport: + * 1. To goto the location + * 2. Set an appropriate level zoom for the location type + * 3. Some statusbar message feedback + */ +static int determine_location_thread ( VikWindow *vw, gpointer threaddata ) +{ + struct LatLon ll; + gchar *name = NULL; + gint ans = a_vik_goto_where_am_i ( vw->viking_vvp, &ll, &name ); + + int result = a_background_thread_progress ( threaddata, 1.0 ); + if ( result != 0 ) { + vik_window_statusbar_update ( vw, _("Location lookup aborted"), VIK_STATUSBAR_INFO ); + return -1; /* Abort thread */ + } + + if ( ans ) { + // Zoom out a little + gdouble zoom = 16.0; + + if ( ans == 2 ) { + // Position found with city precision - so zoom out more + zoom = 128.0; + } + else if ( ans == 3 ) { + // Position found via country name search - so zoom wayyyy out + zoom = 2048.0; + } + + vik_viewport_set_zoom ( vw->viking_vvp, zoom ); + vik_viewport_set_center_latlon ( vw->viking_vvp, &ll, FALSE ); + + gchar *message = g_strdup_printf ( _("Location found: %s"), name ); + vik_window_statusbar_update ( vw, message, VIK_STATUSBAR_INFO ); + g_free ( name ); + g_free ( message ); + + // Signal to redraw from the background + vik_layers_panel_emit_update ( vw->viking_vlp ); + } + else + vik_window_statusbar_update ( vw, _("Unable to determine location"), VIK_STATUSBAR_INFO ); + + return 0; +} + +void determine_location_fallback ( VikWindow *vw ) +{ + a_background_thread ( BACKGROUND_POOL_REMOTE, + GTK_WINDOW(vw), + _("Determining location"), + (vik_thr_func) determine_location_thread, + vw, + NULL, + NULL, + 1 ); +} + +#ifdef HAVE_LIBGEOCLUE_2 +void update_from_geoclue ( VikWindow *vw, struct LatLon ll, gdouble accuracy ) +{ + // See if we received sensible answers + gboolean fallback = FALSE; + if ( isnan(ll.lat) ) fallback = TRUE; + if ( isnan(accuracy) || accuracy > 10000000 ) fallback = TRUE; + + if ( fallback ) { + determine_location_fallback ( vw ); + return; + } + + // Guestimate zoom level relative to accuracy + gdouble zoom_vals[] = {2, 4, 8, 16, 32, 64, 128, 256, 512}; + guint zlevel = (guint)log10(accuracy); + if ( zlevel > 8 ) + zlevel = 8; + + vik_viewport_set_zoom ( vw->viking_vvp, zoom_vals[zlevel] ); + vik_viewport_set_center_latlon ( vw->viking_vvp, &ll, FALSE ); + + gchar *message = g_strdup_printf ( _("Location found via geoclue") ); + vik_window_statusbar_update ( vw, message, VIK_STATUSBAR_INFO ); + g_free ( message ); + + // Signal to redraw from the background + vik_layers_panel_emit_update ( vw->viking_vlp ); +} +#endif + +/** + * Steps to be taken once initial loading has completed + */ +void vik_window_new_window_finish ( VikWindow *vw ) +{ + // Don't add a map if we've loaded a Viking file already + if ( vw->filename ) + return; + + // Maybe add a default map layer + if ( a_vik_get_add_default_map_layer () ) { + VikMapsLayer *vml = VIK_MAPS_LAYER ( vik_layer_create(VIK_LAYER_MAPS, vw->viking_vvp, FALSE) ); + vik_layer_rename ( VIK_LAYER(vml), _("Default Map") ); + vik_aggregate_layer_add_layer ( vik_layers_panel_get_top_layer(vw->viking_vlp), VIK_LAYER(vml), TRUE ); + vik_layer_post_read ( VIK_LAYER(vml), vw->viking_vvp, TRUE ); + + draw_update ( vw ); + } + + // If not loaded any file, maybe try the location lookup + if ( vw->loaded_type == LOAD_TYPE_READ_FAILURE ) { + if ( a_vik_get_startup_method ( ) == VIK_STARTUP_METHOD_AUTO_LOCATION ) { + + vik_window_statusbar_update ( vw, _("Trying to determine location..."), VIK_STATUSBAR_INFO ); +#ifdef HAVE_LIBGEOCLUE_2 + libgeoclue_where_am_i ( vw, update_from_geoclue ); +#else + determine_location_fallback ( vw ); +#endif + } + } +} + +static void open_window ( VikWindow *vw, GSList *files ) +{ + if ( !vw ) + return; + guint file_num = 0; + guint num_files = g_slist_length(files); + gboolean change_fn = (num_files == 1); // only change fn if one file + GSList *cur_file = files; + while ( cur_file ) { + // Only open a new window if a viking file + gchar *file_name = cur_file->data; + file_num++; + if (vw->filename && check_file_magic_vik ( file_name ) ) { + VikWindow *newvw = vik_window_new_window (); + if (newvw) + vik_window_open_file ( newvw, file_name, TRUE, TRUE, TRUE, TRUE ); + } + else { + vik_window_open_file ( vw, file_name, change_fn, (file_num==1), (file_num==num_files), TRUE ); + } + g_free (file_name); + cur_file = g_slist_next (cur_file); + } + g_slist_free (files); +} +// End signals + +void vik_window_selected_layer(VikWindow *vw, VikLayer *vl) +{ + int i, j, tool_count; + VikLayerInterface *layer_interface; + + if (!vw->action_group) return; + + for (i=0; itools_count; + + for (j = 0; j < tool_count; j++) { + action = gtk_action_group_get_action(vw->action_group, + layer_interface->tools[j].radioActionEntry.name); + g_object_set(action, "sensitive", i == vl->type, NULL); + toolbar_action_set_sensitive ( vw->viking_vtb, vik_layer_get_interface(i)->tools[j].radioActionEntry.name, i == vl->type ); + } + } +} + +static void window_finalize ( GObject *gob ) +{ + VikWindow *vw = VIK_WINDOW(gob); + g_return_if_fail ( vw != NULL ); + + a_background_remove_window ( vw ); + + window_list = g_slist_remove ( window_list, vw ); + + gdk_cursor_unref ( vw->busy_cursor ); + int tt; + for (tt = 0; tt < vw->vt->n_tools; tt++ ) + if ( vw->vt->tools[tt].ti.destroy ) + vw->vt->tools[tt].ti.destroy ( vw->vt->tools[tt].state ); + g_free ( vw->vt->tools ); + g_free ( vw->vt ); + + vik_toolbar_finalize ( vw->viking_vtb ); + + G_OBJECT_CLASS(parent_class)->finalize(gob); +} + + +static void vik_window_class_init ( VikWindowClass *klass ) +{ + /* destructor */ + GObjectClass *object_class; + + window_signals[VW_NEWWINDOW_SIGNAL] = g_signal_new ( "newwindow", G_TYPE_FROM_CLASS (klass), G_SIGNAL_RUN_FIRST | G_SIGNAL_ACTION, G_STRUCT_OFFSET (VikWindowClass, newwindow), NULL, NULL, g_cclosure_marshal_VOID__VOID, G_TYPE_NONE, 0); + window_signals[VW_OPENWINDOW_SIGNAL] = g_signal_new ( "openwindow", G_TYPE_FROM_CLASS (klass), G_SIGNAL_RUN_FIRST | G_SIGNAL_ACTION, G_STRUCT_OFFSET (VikWindowClass, openwindow), NULL, NULL, g_cclosure_marshal_VOID__POINTER, G_TYPE_NONE, 1, G_TYPE_POINTER); + + object_class = G_OBJECT_CLASS (klass); + + object_class->finalize = window_finalize; + + parent_class = g_type_class_peek_parent (klass); + +} + +static void zoom_changed (GtkMenuShell *menushell, + gpointer user_data) +{ + VikWindow *vw = VIK_WINDOW (user_data); + + GtkWidget *aw = gtk_menu_get_active ( GTK_MENU (menushell) ); + gint active = GPOINTER_TO_INT(g_object_get_data ( G_OBJECT (aw), "position" )); + + gdouble zoom_request = pow (2, active-5 ); + + // But has it really changed? + gdouble current_zoom = vik_viewport_get_zoom ( vw->viking_vvp ); + if ( current_zoom != 0.0 && zoom_request != current_zoom ) { + vik_viewport_set_zoom ( vw->viking_vvp, zoom_request ); + // Force drawing update + draw_update ( vw ); + } +} + +/** + * @mpp: The initial zoom level + */ +static GtkWidget *create_zoom_menu_all_levels ( gdouble mpp ) +{ + GtkWidget *menu = gtk_menu_new (); + char *itemLabels[] = { "0.031", "0.063", "0.125", "0.25", "0.5", "1", "2", "4", "8", "16", "32", "64", "128", "256", "512", "1024", "2048", "4096", "8192", "16384", "32768" }; + + int i; + for (i = 0 ; i < G_N_ELEMENTS(itemLabels) ; i++) + { + GtkWidget *item = gtk_menu_item_new_with_label (itemLabels[i]); + gtk_menu_shell_append (GTK_MENU_SHELL (menu), item); + gtk_widget_show (item); + g_object_set_data (G_OBJECT (item), "position", GINT_TO_POINTER(i)); + } + + gint active = 5 + round ( log (mpp) / log (2) ); + // Ensure value derived from mpp is in bounds of the menu + if ( active >= G_N_ELEMENTS(itemLabels) ) + active = G_N_ELEMENTS(itemLabels) - 1; + if ( active < 0 ) + active = 0; + gtk_menu_set_active ( GTK_MENU(menu), active ); + + return menu; +} + +static GtkWidget *create_zoom_combo_all_levels () +{ + GtkWidget *combo = vik_combo_box_text_new(); + vik_combo_box_text_append ( combo, "0.25"); + vik_combo_box_text_append ( combo, "0.5"); + vik_combo_box_text_append ( combo, "1"); + vik_combo_box_text_append ( combo, "2"); + vik_combo_box_text_append ( combo, "4"); + vik_combo_box_text_append ( combo, "8"); + vik_combo_box_text_append ( combo, "16"); + vik_combo_box_text_append ( combo, "32"); + vik_combo_box_text_append ( combo, "64"); + vik_combo_box_text_append ( combo, "128"); + vik_combo_box_text_append ( combo, "256"); + vik_combo_box_text_append ( combo, "512"); + vik_combo_box_text_append ( combo, "1024"); + vik_combo_box_text_append ( combo, "2048"); + vik_combo_box_text_append ( combo, "4096"); + vik_combo_box_text_append ( combo, "8192"); + vik_combo_box_text_append ( combo, "16384"); + vik_combo_box_text_append ( combo, "32768"); + /* Create tooltip */ + gtk_widget_set_tooltip_text (combo, _("Select zoom level")); + return combo; +} + +static gint zoom_popup_handler (GtkWidget *widget) +{ + GtkMenu *menu; + + g_return_val_if_fail (widget != NULL, FALSE); + g_return_val_if_fail (GTK_IS_MENU (widget), FALSE); + + /* The "widget" is the menu that was supplied when + * g_signal_connect_swapped() was called. + */ + menu = GTK_MENU (widget); + + gtk_menu_popup (menu, NULL, NULL, NULL, NULL, + 1, gtk_get_current_event_time()); + return TRUE; +} + +enum { + TARGET_URIS, +}; + +static void drag_data_received_cb ( GtkWidget *widget, + GdkDragContext *context, + gint x, + gint y, + GtkSelectionData *selection_data, + guint target_type, + guint time, + gpointer data ) +{ + gboolean success = FALSE; + + if ( (selection_data != NULL) && (gtk_selection_data_get_length(selection_data) > 0) ) { + switch (target_type) { + case TARGET_URIS: { + gchar *str = (gchar*)gtk_selection_data_get_data(selection_data); + g_debug ("drag received string:%s \n", str); + + // Convert string into GSList of individual entries for use with our open signal + gchar **entries = g_strsplit(str, "\r\n", 0); + GSList *filenames = NULL; + gint entry_runner = 0; + gchar *entry = entries[entry_runner]; + while (entry) { + if ( g_strcmp0 ( entry, "" ) ) { + // Drag+Drop gives URIs. And so in particular, %20 in place of spaces in filenames + // thus need to convert the text into a plain string + gchar *filename = g_filename_from_uri ( entry, NULL, NULL ); + if ( filename ) + filenames = g_slist_append ( filenames, filename ); + } + entry_runner++; + entry = entries[entry_runner]; + } + + if ( filenames ) + g_signal_emit ( G_OBJECT(VIK_WINDOW_FROM_WIDGET(widget)), window_signals[VW_OPENWINDOW_SIGNAL], 0, filenames ); + // NB: GSList & contents are freed by main.open_window + + success = TRUE; + break; + } + default: break; + } + } + + gtk_drag_finish ( context, success, FALSE, time ); +} + +static void toolbar_tool_cb ( GtkAction *old, GtkAction *current, gpointer gp ) +{ + VikWindow *vw = (VikWindow*)gp; + GtkAction *action = gtk_action_group_get_action ( vw->action_group, gtk_action_get_name(current) ); + if ( action ) + gtk_action_activate ( action ); +} + +static void toolbar_reload_cb ( GtkActionGroup *grp, gpointer gp ) +{ + VikWindow *vw = (VikWindow*)gp; + center_changed_cb ( vw ); +} + +static void default_tool_enable ( VikWindow *vw ) +{ + gchar *tool_str = NULL; + if ( a_settings_get_string ( VIK_SETTINGS_WIN_DEFAULT_TOOL, &tool_str ) ) { + if ( !g_ascii_strcasecmp(tool_str,"Pan") ) + vw->current_tool = TOOL_PAN; + else if ( !g_ascii_strcasecmp(tool_str,"Zoom") ) + vw->current_tool = TOOL_ZOOM; + else if ( !g_ascii_strcasecmp(tool_str,"Ruler") ) + vw->current_tool = TOOL_RULER; + else if ( !g_ascii_strcasecmp(tool_str,"Select") ) + vw->current_tool = TOOL_SELECT; + else { + g_warning ("%s: Couldn't understand '%s' for the default tool", __FUNCTION__, tool_str); + vw->current_tool = TOOL_PAN; + } + } + else + vw->current_tool = TOOL_PAN; + + switch ( vw->current_tool ) { + case TOOL_ZOOM: + gtk_action_activate ( gtk_action_group_get_action ( vw->action_group, "Zoom" ) ); + break; + case TOOL_RULER: + gtk_action_activate ( gtk_action_group_get_action ( vw->action_group, "Ruler" ) ); + break; + case TOOL_SELECT: + gtk_action_activate ( gtk_action_group_get_action ( vw->action_group, "Select" ) ); + break; + default: + gtk_action_activate ( gtk_action_group_get_action ( vw->action_group, "Pan" ) ); + break; + } + g_free ( tool_str ); +} + +#define VIK_SETTINGS_WIN_MAX "window_maximized" +#define VIK_SETTINGS_WIN_FULLSCREEN "window_fullscreen" +#define VIK_SETTINGS_WIN_WIDTH "window_width" +#define VIK_SETTINGS_WIN_HEIGHT "window_height" +#define VIK_SETTINGS_WIN_PANE_POSITION "window_horizontal_pane_position" +#define VIK_SETTINGS_WIN_SAVE_IMAGE_WIDTH "window_save_image_width" +#define VIK_SETTINGS_WIN_SAVE_IMAGE_HEIGHT "window_save_image_height" +#define VIK_SETTINGS_WIN_SAVE_IMAGE_PNG "window_save_image_as_png" +#define VIK_SETTINGS_WIN_COPY_CENTRE_FULL_FORMAT "window_copy_centre_full_format" + +#define VIKING_ACCELERATOR_KEY_FILE "keys.rc" + +static void vik_window_init ( VikWindow *vw ) +{ + vw->action_group = NULL; + + vw->viking_vvp = vik_viewport_new(); + vw->viking_vlp = vik_layers_panel_new(); + vik_layers_panel_set_viewport ( vw->viking_vlp, vw->viking_vvp ); + vw->viking_vs = vik_statusbar_new ( vik_viewport_get_scale(vw->viking_vvp) ); + + vw->vt = toolbox_create(vw); + vw->viking_vtb = vik_toolbar_new (); + window_create_ui(vw); + window_set_filename (vw, NULL); + + vw->busy_cursor = gdk_cursor_new ( GDK_WATCH ); + + vw->filename = NULL; + vw->loaded_type = LOAD_TYPE_READ_FAILURE; //AKA none + vw->modified = FALSE; + vw->only_updating_coord_mode_ui = FALSE; + + vw->select_move = FALSE; + vw->pan_move = FALSE; + vw->pan_x = vw->pan_y = -1; + vw->single_click_pending = FALSE; + + gint draw_image_width; + if ( a_settings_get_integer ( VIK_SETTINGS_WIN_SAVE_IMAGE_WIDTH, &draw_image_width ) ) + vw->draw_image_width = draw_image_width; + else + vw->draw_image_width = DRAW_IMAGE_DEFAULT_WIDTH; + gint draw_image_height; + if ( a_settings_get_integer ( VIK_SETTINGS_WIN_SAVE_IMAGE_HEIGHT, &draw_image_height ) ) + vw->draw_image_height = draw_image_height; + else + vw->draw_image_height = DRAW_IMAGE_DEFAULT_HEIGHT; + gboolean draw_image_save_as_png; + if ( a_settings_get_boolean ( VIK_SETTINGS_WIN_SAVE_IMAGE_PNG, &draw_image_save_as_png ) ) + vw->draw_image_save_as_png = draw_image_save_as_png; + else + vw->draw_image_save_as_png = DRAW_IMAGE_DEFAULT_SAVE_AS_PNG; + + vw->main_vbox = gtk_vbox_new(FALSE, 1); + gtk_container_add (GTK_CONTAINER (vw), vw->main_vbox); + vw->menu_hbox = gtk_hbox_new(FALSE, 1); + GtkWidget *menu_bar = gtk_ui_manager_get_widget (vw->uim, "/MainMenu"); + gtk_box_pack_start (GTK_BOX(vw->menu_hbox), menu_bar, FALSE, TRUE, 0); + gtk_box_pack_start (GTK_BOX(vw->main_vbox), vw->menu_hbox, FALSE, TRUE, 0); + + toolbar_init(vw->viking_vtb, + &vw->gtkwindow, + vw->main_vbox, + vw->menu_hbox, + toolbar_tool_cb, + toolbar_reload_cb, + (gpointer)vw); // This auto packs toolbar into the vbox + // Must be performed post toolbar init + gint i,j; + for (i=0; itools_count; j++ ) { + toolbar_action_set_sensitive ( vw->viking_vtb, vik_layer_get_interface(i)->tools[j].radioActionEntry.name, FALSE ); + } + } + + vik_ext_tool_datasources_add_menu_items ( vw, vw->uim ); + + GtkWidget * zoom_levels = gtk_ui_manager_get_widget (vw->uim, "/MainMenu/View/SetZoom"); + GtkWidget * zoom_levels_menu = create_zoom_menu_all_levels ( vik_viewport_get_zoom(vw->viking_vvp) ); + gtk_menu_item_set_submenu (GTK_MENU_ITEM (zoom_levels), zoom_levels_menu); + g_signal_connect ( G_OBJECT(zoom_levels_menu), "selection-done", G_CALLBACK(zoom_changed), vw); + g_signal_connect_swapped ( G_OBJECT(vw->viking_vs), "clicked", G_CALLBACK(zoom_popup_handler), zoom_levels_menu ); + + g_signal_connect (G_OBJECT (vw), "delete_event", G_CALLBACK (delete_event), NULL); + + // Own signals + g_signal_connect_swapped (G_OBJECT(vw->viking_vvp), "updated_center", G_CALLBACK(center_changed_cb), vw); + // Signals from GTK + g_signal_connect_swapped (G_OBJECT(vw->viking_vvp), "expose_event", G_CALLBACK(draw_sync), vw); + g_signal_connect_swapped (G_OBJECT(vw->viking_vvp), "configure_event", G_CALLBACK(window_configure_event), vw); + gtk_widget_add_events ( GTK_WIDGET(vw->viking_vvp), GDK_POINTER_MOTION_MASK | GDK_POINTER_MOTION_HINT_MASK | GDK_BUTTON_PRESS_MASK | GDK_BUTTON_RELEASE_MASK | GDK_KEY_PRESS_MASK | GDK_KEY_RELEASE_MASK ); + g_signal_connect_swapped (G_OBJECT(vw->viking_vvp), "scroll_event", G_CALLBACK(draw_scroll), vw); + g_signal_connect_swapped (G_OBJECT(vw->viking_vvp), "button_press_event", G_CALLBACK(draw_click), vw); + g_signal_connect_swapped (G_OBJECT(vw->viking_vvp), "button_release_event", G_CALLBACK(draw_release), vw); + g_signal_connect_swapped (G_OBJECT(vw->viking_vvp), "motion_notify_event", G_CALLBACK(draw_mouse_motion), vw); + + g_signal_connect_swapped (G_OBJECT(vw->viking_vlp), "update", G_CALLBACK(draw_update), vw); + g_signal_connect_swapped (G_OBJECT(vw->viking_vlp), "delete_layer", G_CALLBACK(vik_window_clear_highlight), vw); + + // Allow key presses to be processed anywhere + g_signal_connect_swapped (G_OBJECT (vw), "key_press_event", G_CALLBACK (key_press_event), vw); + g_signal_connect_swapped (G_OBJECT (vw), "key_release_event", G_CALLBACK (key_release_event), vw); + + // Set initial button sensitivity + center_changed_cb ( vw ); + + vw->hpaned = gtk_hpaned_new (); + gtk_paned_pack1 ( GTK_PANED(vw->hpaned), GTK_WIDGET (vw->viking_vlp), FALSE, TRUE ); + gtk_paned_pack2 ( GTK_PANED(vw->hpaned), GTK_WIDGET (vw->viking_vvp), TRUE, TRUE ); + + /* This packs the button into the window (a gtk container). */ + gtk_box_pack_start (GTK_BOX(vw->main_vbox), vw->hpaned, TRUE, TRUE, 0); + + gtk_box_pack_end (GTK_BOX(vw->main_vbox), GTK_WIDGET(vw->viking_vs), FALSE, TRUE, 0); + + a_background_add_window ( vw ); + + window_list = g_slist_prepend ( window_list, vw); + + gint height = VIKING_WINDOW_HEIGHT; + gint width = VIKING_WINDOW_WIDTH; + + if ( a_vik_get_restore_window_state() ) { + if ( a_settings_get_integer ( VIK_SETTINGS_WIN_HEIGHT, &height ) ) { + // Enforce a basic minimum size + if ( height < 160 ) + height = 160; + } + else + // No setting - so use default + height = VIKING_WINDOW_HEIGHT; + + if ( a_settings_get_integer ( VIK_SETTINGS_WIN_WIDTH, &width ) ) { + // Enforce a basic minimum size + if ( width < 320 ) + width = 320; + } + else + // No setting - so use default + width = VIKING_WINDOW_WIDTH; + + gboolean maxed; + if ( a_settings_get_boolean ( VIK_SETTINGS_WIN_MAX, &maxed ) ) + if ( maxed ) + gtk_window_maximize ( GTK_WINDOW(vw) ); + + gboolean full; + if ( a_settings_get_boolean ( VIK_SETTINGS_WIN_FULLSCREEN, &full ) ) { + if ( full ) { + vw->show_full_screen = TRUE; + gtk_window_fullscreen ( GTK_WINDOW(vw) ); + GtkWidget *check_box = gtk_ui_manager_get_widget ( vw->uim, "/ui/MainMenu/View/FullScreen" ); + if ( check_box ) + gtk_check_menu_item_set_active ( GTK_CHECK_MENU_ITEM(check_box), TRUE ); + } + } + + gint position = -1; // Let GTK determine default positioning + if ( !a_settings_get_integer ( VIK_SETTINGS_WIN_PANE_POSITION, &position ) ) { + position = -1; + } + gtk_paned_set_position ( GTK_PANED(vw->hpaned), position ); + } + + gtk_window_set_default_size ( GTK_WINDOW(vw), width, height ); + + vw->show_side_panel = TRUE; + vw->show_statusbar = TRUE; + vw->show_toolbar = TRUE; + vw->show_main_menu = TRUE; + vw->show_side_panel_buttons = TRUE; + vw->show_side_panel_calendar = TRUE; + + // Only accept Drag and Drop of files onto the viewport + gtk_drag_dest_set ( GTK_WIDGET(vw->viking_vvp), GTK_DEST_DEFAULT_ALL, NULL, 0, GDK_ACTION_COPY ); + gtk_drag_dest_add_uri_targets ( GTK_WIDGET(vw->viking_vvp) ); + g_signal_connect ( GTK_WIDGET(vw->viking_vvp), "drag-data-received", G_CALLBACK(drag_data_received_cb), NULL ); + + // Store the thread value so comparisons can be made to determine the gdk update method + // Hopefully we are storing the main thread value here :) + // [ATM any window initialization is always be performed by the main thread] + vw->thread = g_thread_self(); + + // Set the default tool + mode + default_tool_enable ( vw ); + gtk_action_activate ( gtk_action_group_get_action ( vw->action_group, "ModeMercator" ) ); + + gchar *accel_file_name = g_build_filename ( a_get_viking_dir(), VIKING_ACCELERATOR_KEY_FILE, NULL ); + gtk_accel_map_load ( accel_file_name ); + g_free ( accel_file_name ); +} + +static VikWindow *window_new () +{ + return VIK_WINDOW ( g_object_new ( VIK_WINDOW_TYPE, NULL ) ); +} + +/** + * Update the displayed map + * Only update the top most visible map layer + * ATM this assumes (as per defaults) the top most map has full alpha setting + * such that other other maps even though they may be active will not be seen + * It's more complicated to work out which maps are actually visible due to alpha settings + * and overkill for this simple refresh method. + */ +static void simple_map_update ( VikWindow *vw, gboolean only_new ) +{ + // Find the most relevent single map layer to operate on + VikLayer *vl = vik_aggregate_layer_get_top_visible_layer_of_type (vik_layers_panel_get_top_layer(vw->viking_vlp), VIK_LAYER_MAPS); + if ( vl ) + vik_maps_layer_download ( VIK_MAPS_LAYER(vl), vw->viking_vvp, only_new ); +} + +/** + * This is the global key press handler + * Global shortcuts are available at any time and hence are not restricted to when a certain tool is enabled + */ +static gboolean key_press_event( VikWindow *vw, GdkEventKey *event, gpointer data ) +{ + // The keys handled here are not in the menuing system for a couple of reasons: + // . Keeps the menu size compact (alebit at expense of discoverably) + // . Allows differing key bindings to perform the same actions + + // First decide if key events are related to the maps layer + gboolean map_download = FALSE; + gboolean map_download_only_new = TRUE; // Only new or reload + + GdkModifierType modifiers = gtk_accelerator_get_default_mod_mask(); + + // Standard 'Refresh' keys: F5 or Ctrl+r + // Note 'F5' is actually handled via draw_refresh_cb() later on + // (not 'R' it's 'r' notice the case difference!!) + if ( event->keyval == GDK_r && (event->state & modifiers) == GDK_CONTROL_MASK ) { + map_download = TRUE; + map_download_only_new = TRUE; + } + // Full cache reload with Ctrl+F5 or Ctrl+Shift+r [This is not in the menu system] + // Note the use of uppercase R here since shift key has been pressed + else if ( (event->keyval == GDK_F5 && (event->state & modifiers) == GDK_CONTROL_MASK ) || + ( event->keyval == GDK_R && (event->state & modifiers) == (GDK_CONTROL_MASK + GDK_SHIFT_MASK) ) ) { + map_download = TRUE; + map_download_only_new = FALSE; + } + // Standard Ctrl+KP+ / Ctrl+KP- to zoom in/out respectively + else if ( event->keyval == GDK_KEY_KP_Add && (event->state & modifiers) == GDK_CONTROL_MASK ) { + vik_viewport_zoom_in ( vw->viking_vvp ); + draw_update(vw); + return TRUE; // handled keypress + } + else if ( event->keyval == GDK_KEY_KP_Subtract && (event->state & modifiers) == GDK_CONTROL_MASK ) { + vik_viewport_zoom_out ( vw->viking_vvp ); + draw_update(vw); + return TRUE; // handled keypress + } + + if ( map_download ) { + simple_map_update ( vw, map_download_only_new ); + return TRUE; // handled keypress + } + + gboolean handled = FALSE; + VikLayer *vl = vik_layers_panel_get_selected ( vw->viking_vlp ); + if (vl && vw->vt->active_tool != -1 && vw->vt->tools[vw->vt->active_tool].ti.key_press ) { + gint ltype = vw->vt->tools[vw->vt->active_tool].layer_type; + if ( vl && ltype == vl->type ) + handled = vw->vt->tools[vw->vt->active_tool].ti.key_press(vl, event, vw->vt->tools[vw->vt->active_tool].state); + if ( handled ) + return TRUE; + } + + + /* Restore Main Menu via Escape key if the user has hidden it */ + /* This key is more likely to be used as they may not remember the function key */ + GtkWidget *check_box = gtk_ui_manager_get_widget ( vw->uim, "/ui/MainMenu/View/SetShow/ViewMainMenu" ); + if ( check_box ) { + gboolean state = gtk_check_menu_item_get_active ( GTK_CHECK_MENU_ITEM(check_box) ); + if ( !state ) { + if ( event->keyval == GDK_Escape ) { + gtk_widget_show ( gtk_ui_manager_get_widget ( vw->uim, "/ui/MainMenu" ) ); + gtk_check_menu_item_set_active ( GTK_CHECK_MENU_ITEM(check_box), TRUE ); + return TRUE; /* handled keypress */ + } + } + } + + // Ensure called only on window tools (i.e. not on any of the Layer tools since the layer is NULL) + if ( vw->current_tool < TOOL_LAYER ) { + // No layer - but enable window tool keypress processing - these should be able to handle a NULL layer + if ( vw->vt->tools[vw->vt->active_tool].ti.key_press ) { + handled = vw->vt->tools[vw->vt->active_tool].ti.key_press ( vl, event, vw->vt->tools[vw->vt->active_tool].state ); + if ( handled ) + return TRUE; + } + } + + // Default Tool + if ( event->keyval == GDK_Escape ) { + default_tool_enable ( vw ); + return TRUE; + } + + return FALSE; /* don't handle the keypress */ +} + +static gboolean key_release_event( VikWindow *vw, GdkEventKey *event, gpointer data ) +{ + gboolean handled = FALSE; + VikLayer *vl = vik_layers_panel_get_selected ( vw->viking_vlp ); + if (vl && vw->vt->active_tool != -1 && vw->vt->tools[vw->vt->active_tool].ti.key_release ) { + gint ltype = vw->vt->tools[vw->vt->active_tool].layer_type; + if ( vl && ltype == vl->type ) + handled = vw->vt->tools[vw->vt->active_tool].ti.key_release(vl, event, vw->vt->tools[vw->vt->active_tool].state); + if ( handled ) + return TRUE; + } + return FALSE; +} + +static gboolean delete_event( VikWindow *vw ) +{ +#ifdef VIKING_PROMPT_IF_MODIFIED + if ( vw->modified ) +#else + if (0) +#endif + { + GtkDialog *dia; + dia = GTK_DIALOG ( gtk_message_dialog_new ( GTK_WINDOW(vw), GTK_DIALOG_DESTROY_WITH_PARENT, GTK_MESSAGE_QUESTION, GTK_BUTTONS_NONE, + _("Do you want to save the changes you made to the document \"%s\"?\n" + "\n" + "Your changes will be lost if you don't save them."), + window_get_filename ( vw ) ) ); + gtk_dialog_add_buttons ( dia, _("Don't Save"), GTK_RESPONSE_NO, GTK_STOCK_CANCEL, GTK_RESPONSE_CANCEL, GTK_STOCK_SAVE, GTK_RESPONSE_YES, NULL ); + switch ( gtk_dialog_run ( dia ) ) + { + case GTK_RESPONSE_NO: gtk_widget_destroy ( GTK_WIDGET(dia) ); return FALSE; + case GTK_RESPONSE_CANCEL: gtk_widget_destroy ( GTK_WIDGET(dia) ); return TRUE; + default: gtk_widget_destroy ( GTK_WIDGET(dia) ); return ! save_file(NULL, vw); + } + } + + if ( window_count == 1 ) { + // On the final window close - save latest state - if it's wanted... + if ( a_vik_get_restore_window_state() ) { + gint state = gdk_window_get_state ( GTK_WIDGET(vw)->window ); + gboolean state_max = state & GDK_WINDOW_STATE_MAXIMIZED; + a_settings_set_boolean ( VIK_SETTINGS_WIN_MAX, state_max ); + + gboolean state_fullscreen = state & GDK_WINDOW_STATE_FULLSCREEN; + a_settings_set_boolean ( VIK_SETTINGS_WIN_FULLSCREEN, state_fullscreen ); + + a_settings_set_boolean ( VIK_SETTINGS_WIN_SIDEPANEL, GTK_WIDGET_VISIBLE (GTK_WIDGET(vw->viking_vlp)) ); + + a_settings_set_boolean ( VIK_SETTINGS_WIN_STATUSBAR, GTK_WIDGET_VISIBLE (GTK_WIDGET(vw->viking_vs)) ); + + a_settings_set_boolean ( VIK_SETTINGS_WIN_TOOLBAR, GTK_WIDGET_VISIBLE (toolbar_get_widget(vw->viking_vtb)) ); + + a_settings_set_boolean ( VIK_SETTINGS_WIN_SIDEPANEL_BUTTONS, vw->show_side_panel_buttons ); + + a_settings_set_boolean ( VIK_SETTINGS_WIN_SIDEPANEL_CALENDAR, vw->show_side_panel_calendar ); + + // If supersized - no need to save the enlarged width+height values + if ( ! (state_fullscreen || state_max) ) { + gint width, height; + gtk_window_get_size ( GTK_WINDOW (vw), &width, &height ); + a_settings_set_integer ( VIK_SETTINGS_WIN_WIDTH, width ); + a_settings_set_integer ( VIK_SETTINGS_WIN_HEIGHT, height ); + } + + a_settings_set_integer ( VIK_SETTINGS_WIN_PANE_POSITION, gtk_paned_get_position (GTK_PANED(vw->hpaned)) ); + } + + a_settings_set_integer ( VIK_SETTINGS_WIN_SAVE_IMAGE_WIDTH, vw->draw_image_width ); + a_settings_set_integer ( VIK_SETTINGS_WIN_SAVE_IMAGE_HEIGHT, vw->draw_image_height ); + a_settings_set_boolean ( VIK_SETTINGS_WIN_SAVE_IMAGE_PNG, vw->draw_image_save_as_png ); + + gchar *accel_file_name = g_build_filename ( a_get_viking_dir(), VIKING_ACCELERATOR_KEY_FILE, NULL ); + gtk_accel_map_save ( accel_file_name ); + g_free ( accel_file_name ); + } + + return FALSE; +} + +/* Drawing stuff */ +static void newwindow_cb ( GtkAction *a, VikWindow *vw ) +{ + g_signal_emit ( G_OBJECT(vw), window_signals[VW_NEWWINDOW_SIGNAL], 0 ); +} + +static void draw_update ( VikWindow *vw ) +{ + draw_redraw (vw); + draw_sync (vw); +} + +static void draw_sync ( VikWindow *vw ) +{ + vik_viewport_sync(vw->viking_vvp); + draw_status ( vw ); +} + +/* + * Split the status update, as sometimes only need to update the tool part + * also on initialization the zoom related stuff is not ready to be used + */ +static void draw_status_tool ( VikWindow *vw ) +{ + if ( vw->current_tool == TOOL_LAYER ) + // Use tooltip rather than the internal name as the tooltip is i8n + vik_statusbar_set_message ( vw->viking_vs, VIK_STATUSBAR_TOOL, vik_layer_get_interface(vw->tool_layer_id)->tools[vw->tool_tool_id].radioActionEntry.tooltip ); + else + vik_statusbar_set_message ( vw->viking_vs, VIK_STATUSBAR_TOOL, _(tool_names[vw->current_tool]) ); +} + +static void draw_status ( VikWindow *vw ) +{ + static gchar zoom_level[22]; + gdouble xmpp = vik_viewport_get_xmpp (vw->viking_vvp); + gdouble ympp = vik_viewport_get_ympp(vw->viking_vvp); + gchar *unit = vik_viewport_get_coord_mode(vw->viking_vvp) == VIK_COORD_UTM ? _("mpp") : _("pixelfact"); + if (xmpp != ympp) + g_snprintf ( zoom_level, 22, "%.3f/%.3f %s", xmpp, ympp, unit ); + else + if ( (int)xmpp - xmpp < 0.0 ) + g_snprintf ( zoom_level, 22, "%.3f %s", xmpp, unit ); + else + /* xmpp should be a whole number so don't show useless .000 bit */ + g_snprintf ( zoom_level, 22, "%d %s", (int)xmpp, unit ); + + vik_statusbar_set_message ( vw->viking_vs, VIK_STATUSBAR_ZOOM, zoom_level ); + + draw_status_tool ( vw ); +} + +void vik_window_set_redraw_trigger(VikLayer *vl) +{ + VikWindow *vw = VIK_WINDOW(VIK_GTK_WINDOW_FROM_LAYER(vl)); + if (NULL != vw) + vw->trigger = vl; +} + +static void window_configure_event ( VikWindow *vw ) +{ + static gboolean first = TRUE; + draw_redraw ( vw ); + if ( first ) { + // This is a hack to initialize the cursor to the corresponding tool + first = FALSE; + switch ( vw->current_tool ) { + case TOOL_ZOOM: + vw->viewport_cursor = (GdkCursor*)toolbox_get_cursor(vw->vt, "Zoom"); + break; + case TOOL_RULER: + vw->viewport_cursor = (GdkCursor*)toolbox_get_cursor(vw->vt, "Ruler"); + break; + case TOOL_SELECT: + vw->viewport_cursor = (GdkCursor*)toolbox_get_cursor(vw->vt, "Select"); + break; + default: + vw->viewport_cursor = (GdkCursor*)toolbox_get_cursor(vw->vt, "Pan"); + break; + } + /* We set cursor, even if it is NULL: it resets to default */ + gdk_window_set_cursor ( gtk_widget_get_window(GTK_WIDGET(vw->viking_vvp)), vw->viewport_cursor ); + } +} + +static void draw_redraw ( VikWindow *vw ) +{ + VikCoord old_center = vw->trigger_center; + vw->trigger_center = *(vik_viewport_get_center(vw->viking_vvp)); + VikLayer *new_trigger = vw->trigger; + vw->trigger = NULL; + VikLayer *old_trigger = VIK_LAYER(vik_viewport_get_trigger(vw->viking_vvp)); + + if ( ! new_trigger ) + ; /* do nothing -- have to redraw everything. */ + else if ( (old_trigger != new_trigger) || !vik_coord_equals(&old_center, &vw->trigger_center) || (new_trigger->type == VIK_LAYER_AGGREGATE) ) + vik_viewport_set_trigger ( vw->viking_vvp, new_trigger ); /* todo: set to half_drawn mode if new trigger is above old */ + else + vik_viewport_set_half_drawn ( vw->viking_vvp, TRUE ); + + /* actually draw */ + vik_viewport_clear ( vw->viking_vvp); + // Main layer drawing + vik_layers_panel_draw_all ( vw->viking_vlp ); + // Draw highlight (possibly again but ensures it is on top - especially for when tracks overlap) + if ( vik_viewport_get_draw_highlight (vw->viking_vvp) ) { + if ( vw->containing_vtl && (vw->selected_tracks || vw->selected_waypoints ) ) { + vik_trw_layer_draw_highlight_items ( vw->containing_vtl, vw->selected_tracks, vw->selected_waypoints, vw->viking_vvp ); + } + else if ( vw->containing_vtl && (vw->selected_track || vw->selected_waypoint) ) { + vik_trw_layer_draw_highlight_item ( vw->containing_vtl, vw->selected_track, vw->selected_waypoint, vw->viking_vvp ); + } + else if ( vw->selected_vtl ) { + vik_trw_layer_draw_highlight ( vw->selected_vtl, vw->viking_vvp ); + } + } + // Other viewport decoration items on top if they are enabled/in use + vik_viewport_draw_scale ( vw->viking_vvp ); + vik_viewport_draw_copyright ( vw->viking_vvp ); + vik_viewport_draw_centermark ( vw->viking_vvp ); + vik_viewport_draw_logo ( vw->viking_vvp ); + + vik_viewport_set_half_drawn ( vw->viking_vvp, FALSE ); /* just in case. */ +} + +gboolean draw_buf_done = TRUE; + +static gboolean draw_buf(gpointer data) +{ + gpointer *pass_along = data; + gdk_draw_drawable (pass_along[0], pass_along[1], + pass_along[2], 0, 0, 0, 0, -1, -1); + draw_buf_done = TRUE; + return FALSE; +} + + +/* Mouse event handlers ************************************************************************/ + +static void vik_window_pan_click (VikWindow *vw, GdkEventButton *event) +{ + /* set panning origin */ + vw->pan_move = FALSE; + vw->pan_x = (gint) event->x; + vw->pan_y = (gint) event->y; +} + +static void draw_click (VikWindow *vw, GdkEventButton *event) +{ + gtk_widget_grab_focus ( GTK_WIDGET(vw->viking_vvp) ); + + /* middle button pressed. we reserve all middle button and scroll events + * for panning and zooming; tools only get left/right/movement + */ + if ( event->button == 2) { + if ( vw->vt->tools[vw->vt->active_tool].ti.pan_handler ) + // Tool still may need to do something (such as disable something) + toolbox_click(vw->vt, event); + vik_window_pan_click ( vw, event ); + } + else { + toolbox_click(vw->vt, event); + } +} + +static void vik_window_pan_move (VikWindow *vw, GdkEventMotion *event) +{ + if ( vw->pan_x != -1 ) { + vik_viewport_set_center_screen ( vw->viking_vvp, vik_viewport_get_width(vw->viking_vvp)/2 - event->x + vw->pan_x, + vik_viewport_get_height(vw->viking_vvp)/2 - event->y + vw->pan_y ); + vw->pan_move = TRUE; + vw->pan_x = event->x; + vw->pan_y = event->y; + draw_update ( vw ); + } +} + +/** + * get_location_strings: + * + * Utility function to get positional strings for the given location + * lat and lon strings will get allocated and so need to be freed after use + */ +static void get_location_strings ( VikWindow *vw, struct UTM utm, gchar **lat, gchar **lon ) +{ + if ( vik_viewport_get_drawmode ( vw->viking_vvp ) == VIK_VIEWPORT_DRAWMODE_UTM ) { + // Reuse lat for the first part (Zone + N or S, and lon for the second part (easting and northing) of a UTM format: + // ZONE[N|S] EASTING NORTHING + *lat = g_malloc(4*sizeof(gchar)); + // NB zone is stored in a char but is an actual number + g_snprintf (*lat, 4, "%d%c", utm.zone, utm.letter); + *lon = g_malloc(16*sizeof(gchar)); + g_snprintf (*lon, 16, "%d %d", (gint)utm.easting, (gint)utm.northing); + } + else { + struct LatLon ll; + a_coords_utm_to_latlon ( &utm, &ll ); + a_coords_latlon_to_string ( &ll, lat, lon ); + } +} + +static void draw_mouse_motion (VikWindow *vw, GdkEventMotion *event) +{ + static VikCoord coord; + static struct UTM utm; + #define BUFFER_SIZE 50 + static char pointer_buf[BUFFER_SIZE]; + gchar *lat = NULL, *lon = NULL; + gint16 alt; + gdouble zoom; + VikDemInterpol interpol_method; + + /* This is a hack, but work far the best, at least for single pointer systems. + * See http://bugzilla.gnome.org/show_bug.cgi?id=587714 for more. */ + gint x, y; + gdk_window_get_pointer (event->window, &x, &y, NULL); + event->x = x; + event->y = y; + + toolbox_move(vw->vt, event); + + vik_viewport_screen_to_coord ( vw->viking_vvp, event->x, event->y, &coord ); + vik_coord_to_utm ( &coord, &utm ); + + get_location_strings ( vw, utm, &lat, &lon ); + + /* Change interpolate method according to scale */ + zoom = vik_viewport_get_zoom(vw->viking_vvp); + if (zoom > 2.0) + interpol_method = VIK_DEM_INTERPOL_NONE; + else if (zoom >= 1.0) + interpol_method = VIK_DEM_INTERPOL_SIMPLE; + else + interpol_method = VIK_DEM_INTERPOL_BEST; + if ((alt = a_dems_get_elev_by_coord(&coord, interpol_method)) != VIK_DEM_INVALID_ELEVATION) { + if ( a_vik_get_units_height () == VIK_UNITS_HEIGHT_METRES ) + g_snprintf ( pointer_buf, BUFFER_SIZE, _("%s %s %dm"), lat, lon, alt ); + else + g_snprintf ( pointer_buf, BUFFER_SIZE, _("%s %s %dft"), lat, lon, (int)VIK_METERS_TO_FEET(alt) ); + } + else + g_snprintf ( pointer_buf, BUFFER_SIZE, _("%s %s"), lat, lon ); + g_free (lat); + lat = NULL; + g_free (lon); + lon = NULL; + vik_statusbar_set_message ( vw->viking_vs, VIK_STATUSBAR_POSITION, pointer_buf ); + + vik_window_pan_move ( vw, event ); + + /* This is recommended by the GTK+ documentation, but does not work properly. + * Use deprecated way until GTK+ gets a solution for correct motion hint handling: + * http://bugzilla.gnome.org/show_bug.cgi?id=587714 + */ + /* gdk_event_request_motions ( event ); */ +} + +/** + * Action the single click after a small timeout + * If a double click has occurred then this will do nothing + */ +static gboolean vik_window_pan_timeout (VikWindow *vw) +{ + if ( ! vw->single_click_pending ) { + // Double click happened, so don't do anything + return FALSE; + } + + /* set panning origin */ + vw->pan_move = FALSE; + vw->single_click_pending = FALSE; + vik_viewport_set_center_screen ( vw->viking_vvp, vw->delayed_pan_x, vw->delayed_pan_y ); + draw_update ( vw ); + + // Really turn off the pan moving!! + vw->pan_x = vw->pan_y = -1; + return FALSE; +} + +static void vik_window_pan_release ( VikWindow *vw, GdkEventButton *event ) +{ + gboolean do_draw = TRUE; + + if ( vw->pan_move == FALSE ) { + vw->single_click_pending = !vw->single_click_pending; + + if ( vw->single_click_pending ) { + // Store offset to use + vw->delayed_pan_x = vw->pan_x; + vw->delayed_pan_y = vw->pan_y; + // Get double click time + GtkSettings *gs = gtk_widget_get_settings ( GTK_WIDGET(vw) ); + GValue dct = { 0 }; // = G_VALUE_INIT; // GLIB 2.30+ only + g_value_init ( &dct, G_TYPE_INT ); + g_object_get_property ( G_OBJECT(gs), "gtk-double-click-time", &dct ); + // Give chance for a double click to occur + gint timer = g_value_get_int ( &dct ) + 50; + g_timeout_add ( timer, (GSourceFunc)vik_window_pan_timeout, vw ); + do_draw = FALSE; + } + else { + vik_viewport_set_center_screen ( vw->viking_vvp, vw->pan_x, vw->pan_y ); + } + } + else { + vik_viewport_set_center_screen ( vw->viking_vvp, vik_viewport_get_width(vw->viking_vvp)/2 - event->x + vw->pan_x, + vik_viewport_get_height(vw->viking_vvp)/2 - event->y + vw->pan_y ); + } + + vw->pan_move = FALSE; + vw->pan_x = vw->pan_y = -1; + if ( do_draw ) + draw_update ( vw ); +} + +static void draw_release ( VikWindow *vw, GdkEventButton *event ) +{ + gtk_widget_grab_focus ( GTK_WIDGET(vw->viking_vvp) ); + + if ( event->button == 2 ) { /* move / pan */ + if ( vw->vt->tools[vw->vt->active_tool].ti.pan_handler ) + // Tool still may need to do something (such as reenable something) + toolbox_release(vw->vt, event); + vik_window_pan_release ( vw, event ); + } + else { + toolbox_release(vw->vt, event); + } +} + +static void draw_scroll (VikWindow *vw, GdkEventScroll *event) +{ + guint modifiers = event->state & (GDK_SHIFT_MASK | GDK_CONTROL_MASK); + if ( modifiers == GDK_CONTROL_MASK ) { + /* control == pan up & down */ + if ( event->direction == GDK_SCROLL_UP ) + vik_viewport_set_center_screen ( vw->viking_vvp, vik_viewport_get_width(vw->viking_vvp)/2, vik_viewport_get_height(vw->viking_vvp)/3 ); + else + vik_viewport_set_center_screen ( vw->viking_vvp, vik_viewport_get_width(vw->viking_vvp)/2, vik_viewport_get_height(vw->viking_vvp)*2/3 ); + } else if ( modifiers == GDK_SHIFT_MASK ) { + /* shift == pan left & right */ + if ( event->direction == GDK_SCROLL_UP ) + vik_viewport_set_center_screen ( vw->viking_vvp, vik_viewport_get_width(vw->viking_vvp)/3, vik_viewport_get_height(vw->viking_vvp)/2 ); + else + vik_viewport_set_center_screen ( vw->viking_vvp, vik_viewport_get_width(vw->viking_vvp)*2/3, vik_viewport_get_height(vw->viking_vvp)/2 ); + } else if ( modifiers == (GDK_CONTROL_MASK | GDK_SHIFT_MASK) ) { + // This zoom is on the center position + if ( event->direction == GDK_SCROLL_UP ) + vik_viewport_zoom_in (vw->viking_vvp); + else + vik_viewport_zoom_out (vw->viking_vvp); + } else { + /* make sure mouse is still over the same point on the map when we zoom */ + VikCoord coord; + gint x, y; + gint center_x = vik_viewport_get_width ( vw->viking_vvp ) / 2; + gint center_y = vik_viewport_get_height ( vw->viking_vvp ) / 2; + vik_viewport_screen_to_coord ( vw->viking_vvp, event->x, event->y, &coord ); + if ( event->direction == GDK_SCROLL_UP ) + vik_viewport_zoom_in (vw->viking_vvp); + else + vik_viewport_zoom_out(vw->viking_vvp); + vik_viewport_coord_to_screen ( vw->viking_vvp, &coord, &x, &y ); + vik_viewport_set_center_screen ( vw->viking_vvp, center_x + (x - event->x), + center_y + (y - event->y) ); + } + + draw_update(vw); +} + + + +/******************************************************************************** + ** Ruler tool code + ********************************************************************************/ +static void draw_ruler(VikViewport *vvp, GdkDrawable *d, GdkGC *gc, gint x1, gint y1, gint x2, gint y2, gdouble distance) +{ + PangoLayout *pl; + gchar str[128]; + GdkGC *labgc = vik_viewport_new_gc ( vvp, "#cccccc", 1); + GdkGC *thickgc = gdk_gc_new(d); + + gdouble len = sqrt((x1-x2)*(x1-x2) + (y1-y2)*(y1-y2)); + gdouble dx = (x2-x1)/len*10; + gdouble dy = (y2-y1)/len*10; + gdouble c = cos(DEG2RAD(15.0)); + gdouble s = sin(DEG2RAD(15.0)); + gdouble angle; + gdouble baseangle = 0; + gint i; + + /* draw line with arrow ends */ + { + gint tmp_x1=x1, tmp_y1=y1, tmp_x2=x2, tmp_y2=y2; + a_viewport_clip_line(&tmp_x1, &tmp_y1, &tmp_x2, &tmp_y2); + gdk_draw_line(d, gc, tmp_x1, tmp_y1, tmp_x2, tmp_y2); + } + + a_viewport_clip_line(&x1, &y1, &x2, &y2); + gdk_draw_line(d, gc, x1, y1, x2, y2); + + gdk_draw_line(d, gc, x1 - dy, y1 + dx, x1 + dy, y1 - dx); + gdk_draw_line(d, gc, x2 - dy, y2 + dx, x2 + dy, y2 - dx); + gdk_draw_line(d, gc, x2, y2, x2 - (dx * c + dy * s), y2 - (dy * c - dx * s)); + gdk_draw_line(d, gc, x2, y2, x2 - (dx * c - dy * s), y2 - (dy * c + dx * s)); + gdk_draw_line(d, gc, x1, y1, x1 + (dx * c + dy * s), y1 + (dy * c - dx * s)); + gdk_draw_line(d, gc, x1, y1, x1 + (dx * c - dy * s), y1 + (dy * c + dx * s)); + + /* draw compass */ +#define CR 80 +#define CW 4 + + vik_viewport_compute_bearing ( vvp, x1, y1, x2, y2, &angle, &baseangle ); + + { + GdkColor color; + gdk_gc_copy(thickgc, gc); + gdk_gc_set_line_attributes(thickgc, CW, GDK_LINE_SOLID, GDK_CAP_BUTT, GDK_JOIN_MITER); + gdk_color_parse("#2255cc", &color); + gdk_gc_set_rgb_fg_color(thickgc, &color); + } + gdk_draw_arc (d, thickgc, FALSE, x1-CR+CW/2, y1-CR+CW/2, 2*CR-CW, 2*CR-CW, (90 - RAD2DEG(baseangle))*64, -RAD2DEG(angle)*64); + + + gdk_gc_copy(thickgc, gc); + gdk_gc_set_line_attributes(thickgc, 2, GDK_LINE_SOLID, GDK_CAP_BUTT, GDK_JOIN_MITER); + for (i=0; i<180; i++) { + c = cos(DEG2RAD(i)*2 + baseangle); + s = sin(DEG2RAD(i)*2 + baseangle); + + if (i%5) { + gdk_draw_line (d, gc, x1 + CR*c, y1 + CR*s, x1 + (CR+CW)*c, y1 + (CR+CW)*s); + } else { + gdouble ticksize = 2*CW; + gdk_draw_line (d, thickgc, x1 + (CR-CW)*c, y1 + (CR-CW)*s, x1 + (CR+ticksize)*c, y1 + (CR+ticksize)*s); + } + } + + gdk_draw_arc (d, gc, FALSE, x1-CR, y1-CR, 2*CR, 2*CR, 0, 64*360); + gdk_draw_arc (d, gc, FALSE, x1-CR-CW, y1-CR-CW, 2*(CR+CW), 2*(CR+CW), 0, 64*360); + gdk_draw_arc (d, gc, FALSE, x1-CR+CW, y1-CR+CW, 2*(CR-CW), 2*(CR-CW), 0, 64*360); + c = (CR+CW*2)*cos(baseangle); + s = (CR+CW*2)*sin(baseangle); + gdk_draw_line (d, gc, x1-c, y1-s, x1+c, y1+s); + gdk_draw_line (d, gc, x1+s, y1-c, x1-s, y1+c); + + /* draw labels */ +#define LABEL(x, y, w, h) { \ + gdk_draw_rectangle(d, labgc, TRUE, (x)-2, (y)-1, (w)+4, (h)+1); \ + gdk_draw_rectangle(d, gc, FALSE, (x)-2, (y)-1, (w)+4, (h)+1); \ + gdk_draw_layout(d, gc, (x), (y), pl); } + { + gint wd, hd, xd, yd; + gint wb, hb, xb, yb; + + pl = gtk_widget_create_pango_layout (GTK_WIDGET(vvp), NULL); + pango_layout_set_font_description (pl, gtk_widget_get_style(GTK_WIDGET(vvp))->font_desc); + pango_layout_set_text(pl, "N", -1); + gdk_draw_layout(d, gc, x1-5, y1-CR-3*CW-8, pl); + + /* draw label with distance */ + vik_units_distance_t dist_units = a_vik_get_units_distance (); + switch (dist_units) { + case VIK_UNITS_DISTANCE_KILOMETRES: + if (distance >= 1000 && distance < 100000) { + g_sprintf(str, "%3.2f km", distance/1000.0); + } else if (distance < 1000) { + g_sprintf(str, "%d m", (int)distance); + } else { + g_sprintf(str, "%d km", (int)distance/1000); + } + break; + case VIK_UNITS_DISTANCE_MILES: + if (distance >= VIK_MILES_TO_METERS(1) && distance < VIK_MILES_TO_METERS(100)) { + g_sprintf(str, "%3.2f miles", VIK_METERS_TO_MILES(distance)); + } else if (distance < VIK_MILES_TO_METERS(1)) { + g_sprintf(str, "%d yards", (int)(distance*1.0936133)); + } else { + g_sprintf(str, "%d miles", (int)VIK_METERS_TO_MILES(distance)); + } + break; + case VIK_UNITS_DISTANCE_NAUTICAL_MILES: + if (distance >= VIK_NAUTICAL_MILES_TO_METERS(1) && distance < VIK_NAUTICAL_MILES_TO_METERS(100)) { + g_sprintf(str, "%3.2f NM", VIK_METERS_TO_NAUTICAL_MILES(distance)); + } else if (distance < VIK_NAUTICAL_MILES_TO_METERS(1)) { + g_sprintf(str, "%d yards", (int)(distance*1.0936133)); + } else { + g_sprintf(str, "%d NM", (int)VIK_METERS_TO_NAUTICAL_MILES(distance)); + } + break; + default: + g_critical("Houston, we've had a problem. distance=%d", dist_units); + } + + pango_layout_set_text(pl, str, -1); + + pango_layout_get_pixel_size ( pl, &wd, &hd ); + if (dy>0) { + xd = (x1+x2)/2 + dy; + yd = (y1+y2)/2 - hd/2 - dx; + } else { + xd = (x1+x2)/2 - dy; + yd = (y1+y2)/2 - hd/2 + dx; + } + + if ( xd < -5 || yd < -5 || xd > vik_viewport_get_width(vvp)+5 || yd > vik_viewport_get_height(vvp)+5 ) { + xd = x2 + 10; + yd = y2 - 5; + } + + LABEL(xd, yd, wd, hd); + + /* draw label with bearing */ + g_sprintf(str, "%3.1f°", RAD2DEG(angle)); + pango_layout_set_text(pl, str, -1); + pango_layout_get_pixel_size ( pl, &wb, &hb ); + xb = x1 + CR*cos(angle-M_PI_2); + yb = y1 + CR*sin(angle-M_PI_2); + + if ( xb < -5 || yb < -5 || xb > vik_viewport_get_width(vvp)+5 || yb > vik_viewport_get_height(vvp)+5 ) { + xb = x2 + 10; + yb = y2 + 10; + } + + { + GdkRectangle r1 = {xd-2, yd-1, wd+4, hd+1}, r2 = {xb-2, yb-1, wb+4, hb+1}; + if (gdk_rectangle_intersect(&r1, &r2, &r2)) { + xb = xd + wd + 5; + } + } + LABEL(xb, yb, wb, hb); + } +#undef LABEL + + g_object_unref ( G_OBJECT ( pl ) ); + g_object_unref ( G_OBJECT ( labgc ) ); + g_object_unref ( G_OBJECT ( thickgc ) ); +} + +typedef struct { + VikWindow *vw; + VikViewport *vvp; + gboolean has_oldcoord; + VikCoord oldcoord; + gboolean displayed; +} ruler_tool_state_t; + +static gpointer ruler_create (VikWindow *vw, VikViewport *vvp) +{ + ruler_tool_state_t *s = g_new0(ruler_tool_state_t, 1); + s->vw = vw; + s->vvp = vvp; + return s; +} + +static void ruler_destroy (ruler_tool_state_t *s) +{ + g_free(s); +} + +static VikLayerToolFuncStatus ruler_click (VikLayer *vl, GdkEventButton *event, ruler_tool_state_t *s) +{ + struct LatLon ll; + VikCoord coord; + gchar *temp; + if ( event->button == 1 ) { + gchar *lat=NULL, *lon=NULL; + s->displayed = TRUE; + vik_viewport_screen_to_coord ( s->vvp, (gint) event->x, (gint) event->y, &coord ); + vik_coord_to_latlon ( &coord, &ll ); + a_coords_latlon_to_string ( &ll, &lat, &lon ); + if ( s->has_oldcoord ) { + vik_units_distance_t dist_units = a_vik_get_units_distance (); + switch (dist_units) { + case VIK_UNITS_DISTANCE_KILOMETRES: + temp = g_strdup_printf ( "%s %s DIFF %f meters", lat, lon, vik_coord_diff( &coord, &(s->oldcoord) ) ); + break; + case VIK_UNITS_DISTANCE_MILES: + temp = g_strdup_printf ( "%s %s DIFF %f miles", lat, lon, VIK_METERS_TO_MILES(vik_coord_diff( &coord, &(s->oldcoord) )) ); + break; + case VIK_UNITS_DISTANCE_NAUTICAL_MILES: + temp = g_strdup_printf ( "%s %s DIFF %f NM", lat, lon, VIK_METERS_TO_NAUTICAL_MILES(vik_coord_diff( &coord, &(s->oldcoord) )) ); + break; + default: + temp = g_strdup_printf ("Just to keep the compiler happy"); + g_critical("Houston, we've had a problem. distance=%d", dist_units); + } + + s->has_oldcoord = FALSE; + } + else { + temp = g_strdup_printf ( "%s %s", lat, lon ); + s->has_oldcoord = TRUE; + } + + vik_statusbar_set_message ( s->vw->viking_vs, VIK_STATUSBAR_INFO, temp ); + g_free ( temp ); + g_free ( lat ); + g_free ( lon ); + + s->oldcoord = coord; + } + else { + vik_viewport_set_center_screen ( s->vvp, (gint) event->x, (gint) event->y ); + draw_update ( s->vw ); + } + return VIK_LAYER_TOOL_ACK; +} + +static VikLayerToolFuncStatus ruler_move (VikLayer *vl, GdkEventMotion *event, ruler_tool_state_t *s) +{ + VikViewport *vvp = s->vvp; + VikWindow *vw = s->vw; + + struct LatLon ll; + VikCoord coord; + gchar *temp; + + if ( s->has_oldcoord ) { + int oldx, oldy, w1, h1, w2, h2; + static GdkPixmap *buf = NULL; + gchar *lat=NULL, *lon=NULL; + w1 = vik_viewport_get_width(vvp); + h1 = vik_viewport_get_height(vvp); + if (!buf) { + buf = gdk_pixmap_new ( gtk_widget_get_window(GTK_WIDGET(vvp)), w1, h1, -1 ); + } + gdk_drawable_get_size(buf, &w2, &h2); + if (w1 != w2 || h1 != h2) { + g_object_unref ( G_OBJECT ( buf ) ); + buf = gdk_pixmap_new ( gtk_widget_get_window(GTK_WIDGET(vvp)), w1, h1, -1 ); + } + + vik_viewport_screen_to_coord ( vvp, (gint) event->x, (gint) event->y, &coord ); + vik_coord_to_latlon ( &coord, &ll ); + vik_viewport_coord_to_screen ( vvp, &s->oldcoord, &oldx, &oldy ); + + gdk_draw_drawable (buf, vik_viewport_get_black_gc(vvp), vik_viewport_get_pixmap(vvp), 0, 0, 0, 0, -1, -1); + draw_ruler(vvp, buf, vik_viewport_get_black_gc(vvp), oldx, oldy, event->x, event->y, vik_coord_diff( &coord, &(s->oldcoord)) ); + if (draw_buf_done) { + static gpointer pass_along[3]; + pass_along[0] = gtk_widget_get_window(GTK_WIDGET(vvp)); + pass_along[1] = vik_viewport_get_black_gc ( vvp ); + pass_along[2] = buf; + g_idle_add_full (G_PRIORITY_HIGH_IDLE + 10, draw_buf, pass_along, NULL); + draw_buf_done = FALSE; + } + a_coords_latlon_to_string(&ll, &lat, &lon); + vik_units_distance_t dist_units = a_vik_get_units_distance (); + switch (dist_units) { + case VIK_UNITS_DISTANCE_KILOMETRES: + temp = g_strdup_printf ( "%s %s DIFF %f meters", lat, lon, vik_coord_diff( &coord, &(s->oldcoord) ) ); + break; + case VIK_UNITS_DISTANCE_MILES: + temp = g_strdup_printf ( "%s %s DIFF %f miles", lat, lon, VIK_METERS_TO_MILES (vik_coord_diff( &coord, &(s->oldcoord) )) ); + break; + case VIK_UNITS_DISTANCE_NAUTICAL_MILES: + temp = g_strdup_printf ( "%s %s DIFF %f NM", lat, lon, VIK_METERS_TO_NAUTICAL_MILES (vik_coord_diff( &coord, &(s->oldcoord) )) ); + break; + default: + temp = g_strdup_printf ("Just to keep the compiler happy"); + g_critical("Houston, we've had a problem. distance=%d", dist_units); + } + vik_statusbar_set_message ( vw->viking_vs, VIK_STATUSBAR_INFO, temp ); + g_free ( temp ); + g_free ( lat ); + g_free ( lon ); + } + return VIK_LAYER_TOOL_ACK; +} + +static VikLayerToolFuncStatus ruler_release (VikLayer *vl, GdkEventButton *event, ruler_tool_state_t *s) +{ + return VIK_LAYER_TOOL_ACK; +} + +static void ruler_deactivate (VikLayer *vl, ruler_tool_state_t *s) +{ + draw_update ( s->vw ); +} + +static gboolean ruler_key_press (VikLayer *vl, GdkEventKey *event, ruler_tool_state_t *s) +{ + if (event->keyval == GDK_Escape) { + if ( s->displayed ) { + s->has_oldcoord = FALSE; + ruler_deactivate ( NULL, s ); + s->displayed = FALSE; + return TRUE; + } + } + // Regardless of whether we used it, return false so other GTK things may use it + return FALSE; +} + +static VikToolInterface ruler_tool = + // NB Ctrl+Shift+R is used for Refresh (deemed more important), so use 'U' instead + { &ruler_18_pixbuf, + { "Ruler", "vik-icon-ruler", N_("_Ruler"), "U", N_("Ruler Tool"), TOOL_RULER }, + (VikToolConstructorFunc) ruler_create, + (VikToolDestructorFunc) ruler_destroy, + (VikToolActivationFunc) NULL, + (VikToolActivationFunc) ruler_deactivate, + (VikToolMouseFunc) ruler_click, + (VikToolMouseMoveFunc) ruler_move, + (VikToolMouseFunc) ruler_release, + (VikToolKeyFunc) ruler_key_press, + (VikToolKeyFunc) NULL, + FALSE, + GDK_CURSOR_IS_PIXMAP, + &cursor_ruler_pixbuf, + NULL }; +/*** end ruler code ********************************************************/ + + + +/******************************************************************************** + ** Zoom tool code + ********************************************************************************/ + +typedef struct { + VikWindow *vw; + GdkPixmap *pixmap; + // Track zoom bounds for zoom tool with shift modifier: + gboolean bounds_active; + gint start_x; + gint start_y; +} zoom_tool_state_t; + +/* + * In case the screen size has changed + */ +static void zoomtool_resize_pixmap (zoom_tool_state_t *zts) +{ + int w1, h1, w2, h2; + + // Allocate a drawing area the size of the viewport + w1 = vik_viewport_get_width ( zts->vw->viking_vvp ); + h1 = vik_viewport_get_height ( zts->vw->viking_vvp ); + + if ( !zts->pixmap ) { + // Totally new + zts->pixmap = gdk_pixmap_new ( gtk_widget_get_window(GTK_WIDGET(zts->vw->viking_vvp)), w1, h1, -1 ); + } + + gdk_drawable_get_size ( zts->pixmap, &w2, &h2 ); + + if ( w1 != w2 || h1 != h2 ) { + // Has changed - delete and recreate with new values + g_object_unref ( G_OBJECT ( zts->pixmap ) ); + zts->pixmap = gdk_pixmap_new ( gtk_widget_get_window(GTK_WIDGET(zts->vw->viking_vvp)), w1, h1, -1 ); + } +} + +static gpointer zoomtool_create (VikWindow *vw, VikViewport *vvp) +{ + zoom_tool_state_t *zts = g_new(zoom_tool_state_t, 1); + zts->vw = vw; + zts->pixmap = NULL; + zts->start_x = 0; + zts->start_y = 0; + zts->bounds_active = FALSE; + return zts; +} + +static void zoomtool_destroy ( zoom_tool_state_t *zts) +{ + if ( zts->pixmap ) + g_object_unref ( G_OBJECT ( zts->pixmap ) ); + g_free(zts); +} + +static VikLayerToolFuncStatus zoomtool_click (VikLayer *vl, GdkEventButton *event, zoom_tool_state_t *zts) +{ + zts->vw->modified = TRUE; + guint modifiers = event->state & (GDK_SHIFT_MASK | GDK_CONTROL_MASK); + + VikCoord coord; + gint x, y; + gint center_x = vik_viewport_get_width ( zts->vw->viking_vvp ) / 2; + gint center_y = vik_viewport_get_height ( zts->vw->viking_vvp ) / 2; + + gboolean skip_update = FALSE; + + zts->bounds_active = FALSE; + + if ( modifiers == (GDK_CONTROL_MASK | GDK_SHIFT_MASK) ) { + // This zoom is on the center position + vik_viewport_set_center_screen ( zts->vw->viking_vvp, center_x, center_y ); + if ( event->button == 1 ) + vik_viewport_zoom_in (zts->vw->viking_vvp); + else if ( event->button == 3 ) + vik_viewport_zoom_out (zts->vw->viking_vvp); + } + else if ( modifiers == GDK_CONTROL_MASK ) { + // This zoom is to recenter on the mouse position + vik_viewport_set_center_screen ( zts->vw->viking_vvp, (gint) event->x, (gint) event->y ); + if ( event->button == 1 ) + vik_viewport_zoom_in (zts->vw->viking_vvp); + else if ( event->button == 3 ) + vik_viewport_zoom_out (zts->vw->viking_vvp); + } + else if ( modifiers == GDK_SHIFT_MASK ) { + // Get start of new zoom bounds + if ( event->button == 1 ) { + zts->bounds_active = TRUE; + zts->start_x = (gint) event->x; + zts->start_y = (gint) event->y; + skip_update = TRUE; + } + } + else { + /* make sure mouse is still over the same point on the map when we zoom */ + vik_viewport_screen_to_coord ( zts->vw->viking_vvp, event->x, event->y, &coord ); + if ( event->button == 1 ) + vik_viewport_zoom_in (zts->vw->viking_vvp); + else if ( event->button == 3 ) + vik_viewport_zoom_out(zts->vw->viking_vvp); + vik_viewport_coord_to_screen ( zts->vw->viking_vvp, &coord, &x, &y ); + vik_viewport_set_center_screen ( zts->vw->viking_vvp, + center_x + (x - event->x), + center_y + (y - event->y) ); + } + + if ( !skip_update ) + draw_update ( zts->vw ); + + return VIK_LAYER_TOOL_ACK; +} + +static VikLayerToolFuncStatus zoomtool_move (VikLayer *vl, GdkEventMotion *event, zoom_tool_state_t *zts) +{ + guint modifiers = event->state & (GDK_SHIFT_MASK | GDK_CONTROL_MASK); + + if ( zts->bounds_active && modifiers == GDK_SHIFT_MASK ) { + zoomtool_resize_pixmap ( zts ); + + // Blank out currently drawn area + gdk_draw_drawable ( zts->pixmap, + vik_viewport_get_black_gc(zts->vw->viking_vvp), + vik_viewport_get_pixmap(zts->vw->viking_vvp), + 0, 0, 0, 0, -1, -1 ); + + // Calculate new box starting point & size in pixels + int xx, yy, width, height; + if ( event->y > zts->start_y ) { + yy = zts->start_y; + height = event->y-zts->start_y; + } + else { + yy = event->y; + height = zts->start_y-event->y; + } + if ( event->x > zts->start_x ) { + xx = zts->start_x; + width = event->x-zts->start_x; + } + else { + xx = event->x; + width = zts->start_x-event->x; + } + + // Draw the box + gdk_draw_rectangle (zts->pixmap, vik_viewport_get_black_gc(zts->vw->viking_vvp), FALSE, xx, yy, width, height); + + // Only actually draw when there's time to do so + if (draw_buf_done) { + static gpointer pass_along[3]; + pass_along[0] = gtk_widget_get_window(GTK_WIDGET(zts->vw->viking_vvp)); + pass_along[1] = vik_viewport_get_black_gc ( zts->vw->viking_vvp ); + pass_along[2] = zts->pixmap; + g_idle_add_full (G_PRIORITY_HIGH_IDLE + 10, draw_buf, pass_along, NULL); + draw_buf_done = FALSE; + } + } + else + zts->bounds_active = FALSE; + + return VIK_LAYER_TOOL_ACK; +} + +static VikLayerToolFuncStatus zoomtool_release (VikLayer *vl, GdkEventButton *event, zoom_tool_state_t *zts) +{ + guint modifiers = event->state & (GDK_SHIFT_MASK | GDK_CONTROL_MASK); + + // Ensure haven't just released on the exact same position + // i.e. probably haven't moved the mouse at all + if ( zts->bounds_active && modifiers == GDK_SHIFT_MASK && + ( event->x < zts->start_x-5 || event->x > zts->start_x+5 ) && + ( event->y < zts->start_y-5 || event->y > zts->start_y+5 ) ) { + + VikCoord coord1, coord2; + vik_viewport_screen_to_coord ( zts->vw->viking_vvp, zts->start_x, zts->start_y, &coord1); + vik_viewport_screen_to_coord ( zts->vw->viking_vvp, event->x, event->y, &coord2); + + // From the extend of the bounds pick the best zoom level + // c.f. trw_layer_zoom_to_show_latlons() + // Maybe refactor... + struct LatLon ll1, ll2; + vik_coord_to_latlon(&coord1, &ll1); + vik_coord_to_latlon(&coord2, &ll2); + struct LatLon average = { (ll1.lat+ll2.lat)/2, + (ll1.lon+ll2.lon)/2 }; + + VikCoord new_center; + vik_coord_load_from_latlon ( &new_center, vik_viewport_get_coord_mode ( zts->vw->viking_vvp ), &average ); + vik_viewport_set_center_coord ( zts->vw->viking_vvp, &new_center, FALSE ); + + /* Convert into definite 'smallest' and 'largest' positions */ + struct LatLon minmin; + if ( ll1.lat < ll2.lat ) + minmin.lat = ll1.lat; + else + minmin.lat = ll2.lat; + + struct LatLon maxmax; + if ( ll1.lon > ll2.lon ) + maxmax.lon = ll1.lon; + else + maxmax.lon = ll2.lon; + + /* Always recalculate the 'best' zoom level */ + gdouble zoom = VIK_VIEWPORT_MIN_ZOOM; + vik_viewport_set_zoom ( zts->vw->viking_vvp, zoom ); + + gdouble min_lat, max_lat, min_lon, max_lon; + /* Should only be a maximum of about 18 iterations from min to max zoom levels */ + while ( zoom <= VIK_VIEWPORT_MAX_ZOOM ) { + vik_viewport_get_min_max_lat_lon ( zts->vw->viking_vvp, &min_lat, &max_lat, &min_lon, &max_lon ); + /* NB I think the logic used in this test to determine if the bounds is within view + fails if track goes across 180 degrees longitude. + Hopefully that situation is not too common... + Mind you viking doesn't really do edge locations to well anyway */ + if ( min_lat < minmin.lat && + max_lat > minmin.lat && + min_lon < maxmax.lon && + max_lon > maxmax.lon ) + /* Found within zoom level */ + break; + + /* Try next */ + zoom = zoom * 2; + vik_viewport_set_zoom ( zts->vw->viking_vvp, zoom ); + } + } + else { + // When pressing shift and clicking for zoom, then jump three levels + if ( modifiers == GDK_SHIFT_MASK ) { + // Zoom in/out by three if possible + vik_viewport_set_center_screen ( zts->vw->viking_vvp, event->x, event->y ); + if ( event->button == 1 ) { + vik_viewport_zoom_in ( zts->vw->viking_vvp ); + vik_viewport_zoom_in ( zts->vw->viking_vvp ); + vik_viewport_zoom_in ( zts->vw->viking_vvp ); + } + else if ( event->button == 3 ) { + vik_viewport_zoom_out ( zts->vw->viking_vvp ); + vik_viewport_zoom_out ( zts->vw->viking_vvp ); + vik_viewport_zoom_out ( zts->vw->viking_vvp ); + } + } + } + + draw_update ( zts->vw ); + + // Reset + zts->bounds_active = FALSE; + + return VIK_LAYER_TOOL_ACK; +} + +static VikToolInterface zoom_tool = + { &zoom_18_pixbuf, + { "Zoom", "vik-icon-zoom", N_("_Zoom"), "Z", N_("Zoom Tool"), TOOL_ZOOM }, + (VikToolConstructorFunc) zoomtool_create, + (VikToolDestructorFunc) zoomtool_destroy, + (VikToolActivationFunc) NULL, + (VikToolActivationFunc) NULL, + (VikToolMouseFunc) zoomtool_click, + (VikToolMouseMoveFunc) zoomtool_move, + (VikToolMouseFunc) zoomtool_release, + NULL, + NULL, + FALSE, + GDK_CURSOR_IS_PIXMAP, + &cursor_zoom_pixbuf, + NULL }; +/*** end zoom code ********************************************************/ + +/******************************************************************************** + ** Pan tool code + ********************************************************************************/ +static gpointer pantool_create (VikWindow *vw, VikViewport *vvp) +{ + return vw; +} + +// NB Double clicking means this gets called THREE times!!! +static VikLayerToolFuncStatus pantool_click (VikLayer *vl, GdkEventButton *event, VikWindow *vw) +{ + vw->modified = TRUE; + + if ( event->type == GDK_2BUTTON_PRESS ) { + // Zoom in / out on double click + // No need to change the center as that has already occurred in the first click of a double click occurrence + if ( event->button == 1 ) { + guint modifier = event->state & GDK_SHIFT_MASK; + if ( modifier ) + vik_viewport_zoom_out ( vw->viking_vvp ); + else + vik_viewport_zoom_in ( vw->viking_vvp ); + } + else if ( event->button == 3 ) + vik_viewport_zoom_out ( vw->viking_vvp ); + + draw_update ( vw ); + } + else + // Standard pan click + if ( event->button == 1 ) + vik_window_pan_click ( vw, event ); + + return VIK_LAYER_TOOL_ACK; +} + +static VikLayerToolFuncStatus pantool_move (VikLayer *vl, GdkEventMotion *event, VikWindow *vw) +{ + vik_window_pan_move ( vw, event ); + return VIK_LAYER_TOOL_ACK; +} + +static VikLayerToolFuncStatus pantool_release (VikLayer *vl, GdkEventButton *event, VikWindow *vw) +{ + if ( event->button == 1 ) + vik_window_pan_release ( vw, event ); + return VIK_LAYER_TOOL_ACK; +} + +static VikToolInterface pan_tool = + { &mover_22_pixbuf, + { "Pan", "vik-icon-pan", N_("_Pan"), "P", N_("Pan Tool"), TOOL_PAN }, + (VikToolConstructorFunc) pantool_create, + (VikToolDestructorFunc) NULL, + (VikToolActivationFunc) NULL, + (VikToolActivationFunc) NULL, + (VikToolMouseFunc) pantool_click, + (VikToolMouseMoveFunc) pantool_move, + (VikToolMouseFunc) pantool_release, + NULL, + NULL, + FALSE, + GDK_FLEUR, + NULL, + NULL }; +/*** end pan code ********************************************************/ + +/******************************************************************************** + ** Select tool code + ********************************************************************************/ +static gpointer selecttool_create (VikWindow *vw, VikViewport *vvp) +{ + tool_ed_t *t = g_new(tool_ed_t, 1); + t->vw = vw; + t->vvp = vvp; + t->vtl = NULL; + t->is_waypoint = FALSE; + return t; +} + +static void selecttool_destroy (tool_ed_t *t) +{ + g_free(t); +} + +typedef struct { + gboolean cont; + VikViewport *vvp; + GdkEventButton *event; + tool_ed_t *tool_edit; +} clicker; + +static void click_layer_selected (VikLayer *vl, clicker *ck) +{ + /* Do nothing when function call returns true; */ + /* i.e. stop on first found item */ + if ( ck->cont ) + if ( vl->visible ) + if ( vik_layer_get_interface(vl->type)->select_click ) + ck->cont = !vik_layer_get_interface(vl->type)->select_click ( vl, ck->event, ck->vvp, ck->tool_edit ); +} + +#ifdef WINDOWS +// Hopefully Alt keys by default +#define VIK_MOVE_MODIFIER GDK_MOD1_MASK +#else +// Alt+mouse on Linux desktops tend to be used by the desktop manager +// Thus use an alternate modifier - you may need to set something into this group +#define VIK_MOVE_MODIFIER GDK_MOD5_MASK +#endif + +static VikLayerToolFuncStatus selecttool_click (VikLayer *vl, GdkEventButton *event, tool_ed_t *t) +{ + t->vw->select_move = FALSE; + /* Only allow selection on primary button */ + if ( event->button == 1 ) { + + if ( event->state & VIK_MOVE_MODIFIER ) + vik_window_pan_click ( t->vw, event ); + else { + /* Enable click to apply callback to potentially all track/waypoint layers */ + /* Useful as we can find things that aren't necessarily in the currently selected layer */ + GList* gl = vik_layers_panel_get_all_layers_of_type ( t->vw->viking_vlp, VIK_LAYER_TRW, FALSE ); // Don't get invisible layers + clicker ck; + ck.cont = TRUE; + ck.vvp = t->vw->viking_vvp; + ck.event = event; + ck.tool_edit = t; + g_list_foreach ( gl, (GFunc) click_layer_selected, &ck ); + g_list_free ( gl ); + + // If nothing found then deselect & redraw screen if necessary to remove the highlight + if ( ck.cont ) { + GtkTreeIter iter; + VikTreeview *vtv = vik_layers_panel_get_treeview ( t->vw->viking_vlp ); + + if ( vik_treeview_get_selected_iter ( vtv, &iter ) ) { + // Only clear if selected thing is a TrackWaypoint layer or a sublayer + gint type = vik_treeview_item_get_type ( vtv, &iter ); + if ( type == VIK_TREEVIEW_TYPE_SUBLAYER || + VIK_LAYER(vik_treeview_item_get_pointer ( vtv, &iter ))->type == VIK_LAYER_TRW ) { + + vik_treeview_item_unselect ( vtv, &iter ); + if ( vik_window_clear_highlight ( t->vw ) ) + draw_update ( t->vw ); + } + } + } + else { + // Something found - so enable movement + t->vw->select_move = TRUE; + } + } + } + else if ( ( event->button == 3 ) && ( vl && ( vl->type == VIK_LAYER_TRW ) ) ) { + if ( vl->visible ) + /* Act on currently selected item to show menu */ + if ( t->vw->selected_track || t->vw->selected_waypoint ) + if ( vik_layer_get_interface(vl->type)->show_viewport_menu ) + (void)vik_layer_get_interface(vl->type)->show_viewport_menu ( vl, event, t->vw->viking_vvp ); + } + + return VIK_LAYER_TOOL_ACK; +} + +static VikLayerToolFuncStatus selecttool_move (VikLayer *vl, GdkEventMotion *event, tool_ed_t *t) +{ + if ( t->vw->select_move ) { + // Don't care about vl here + if ( t->vtl ) + if ( vik_layer_get_interface(VIK_LAYER_TRW)->select_move ) + (void)vik_layer_get_interface(VIK_LAYER_TRW)->select_move ( vl, event, t->vvp, t ); + } + else + // Optional Panning + if ( event->state & VIK_MOVE_MODIFIER ) + vik_window_pan_move ( t->vw, event ); + + return VIK_LAYER_TOOL_ACK; +} + +static VikLayerToolFuncStatus selecttool_release (VikLayer *vl, GdkEventButton *event, tool_ed_t *t) +{ + if ( t->vw->select_move ) { + // Don't care about vl here + if ( t->vtl ) + if ( vik_layer_get_interface(VIK_LAYER_TRW)->select_release ) + (void)vik_layer_get_interface(VIK_LAYER_TRW)->select_release ( (VikLayer*)t->vtl, event, t->vvp, t ); + } + + if ( event->button == 1 && (event->state & VIK_MOVE_MODIFIER) ) + vik_window_pan_release ( t->vw, event ); + + // Force pan off incase it was on + t->vw->pan_move = FALSE; + t->vw->pan_x = t->vw->pan_y = -1; + + // End of this select movement + t->vw->select_move = FALSE; + + return VIK_LAYER_TOOL_ACK; +} + +static VikToolInterface select_tool = + { &select_18_pixbuf, + { "Select", "vik-icon-select", N_("_Select"), "S", N_("Select Tool"), TOOL_SELECT }, + (VikToolConstructorFunc) selecttool_create, + (VikToolDestructorFunc) selecttool_destroy, + (VikToolActivationFunc) NULL, + (VikToolActivationFunc) NULL, + (VikToolMouseFunc) selecttool_click, + (VikToolMouseMoveFunc) selecttool_move, + (VikToolMouseFunc) selecttool_release, + (VikToolKeyFunc) NULL, + (VikToolKeyFunc) NULL, + FALSE, + GDK_LEFT_PTR, + NULL, + NULL }; +/*** end select tool code ********************************************************/ + +static void draw_pan_cb ( GtkAction *a, VikWindow *vw ) +{ + // Since the treeview cell editting intercepts standard keyboard handlers, it means we can receive events here + // Thus if currently editting, ensure we don't move the viewport when Ctrl+ is received + VikLayer *sel = vik_layers_panel_get_selected ( vw->viking_vlp ); + if ( sel && vik_treeview_get_editing ( sel->vt ) ) + return; + + if (!strcmp(gtk_action_get_name(a), "PanNorth")) { + vik_viewport_set_center_screen ( vw->viking_vvp, vik_viewport_get_width(vw->viking_vvp)/2, 0 ); + } else if (!strcmp(gtk_action_get_name(a), "PanEast")) { + vik_viewport_set_center_screen ( vw->viking_vvp, vik_viewport_get_width(vw->viking_vvp), vik_viewport_get_height(vw->viking_vvp)/2 ); + } else if (!strcmp(gtk_action_get_name(a), "PanSouth")) { + vik_viewport_set_center_screen ( vw->viking_vvp, vik_viewport_get_width(vw->viking_vvp)/2, vik_viewport_get_height(vw->viking_vvp) ); + } else if (!strcmp(gtk_action_get_name(a), "PanWest")) { + vik_viewport_set_center_screen ( vw->viking_vvp, 0, vik_viewport_get_height(vw->viking_vvp)/2 ); + } + draw_update ( vw ); +} + +static void draw_zoom_cb ( GtkAction *a, VikWindow *vw ) +{ + guint what = 128; + + if (!strcmp(gtk_action_get_name(a), "ZoomIn")) { + what = -3; + } + else if (!strcmp(gtk_action_get_name(a), "ZoomOut")) { + what = -4; + } + else if (!strcmp(gtk_action_get_name(a), "Zoom0.25")) { + what = -2; + } + else if (!strcmp(gtk_action_get_name(a), "Zoom0.5")) { + what = -1; + } + else { + gchar *s = (gchar *)gtk_action_get_name(a); + what = atoi(s+4); + } + + switch (what) + { + case -3: vik_viewport_zoom_in ( vw->viking_vvp ); break; + case -4: vik_viewport_zoom_out ( vw->viking_vvp ); break; + case -1: vik_viewport_set_zoom ( vw->viking_vvp, 0.5 ); break; + case -2: vik_viewport_set_zoom ( vw->viking_vvp, 0.25 ); break; + default: vik_viewport_set_zoom ( vw->viking_vvp, what ); + } + draw_update ( vw ); +} + +static void draw_goto_cb ( GtkAction *a, VikWindow *vw ) +{ + VikCoord new_center; + + if (!strcmp(gtk_action_get_name(a), "GotoLL")) { + struct LatLon ll, llold; + vik_coord_to_latlon ( vik_viewport_get_center ( vw->viking_vvp ), &llold ); + if ( a_dialog_goto_latlon ( GTK_WINDOW(vw), &ll, &llold ) ) + vik_coord_load_from_latlon ( &new_center, vik_viewport_get_coord_mode(vw->viking_vvp), &ll ); + else + return; + } + else if (!strcmp(gtk_action_get_name(a), "GotoUTM")) { + struct UTM utm, utmold; + vik_coord_to_utm ( vik_viewport_get_center ( vw->viking_vvp ), &utmold ); + if ( a_dialog_goto_utm ( GTK_WINDOW(vw), &utm, &utmold ) ) + vik_coord_load_from_utm ( &new_center, vik_viewport_get_coord_mode(vw->viking_vvp), &utm ); + else + return; + } + else { + g_critical("Houston, we've had a problem."); + return; + } + + vik_viewport_set_center_coord ( vw->viking_vvp, &new_center, TRUE ); + draw_update ( vw ); +} + +/** + * center_changed_cb: + */ +static void center_changed_cb ( VikWindow *vw ) +{ +// ATM Keep back always available, so when we pan - we can jump to the last requested position +/* + GtkAction* action_back = gtk_action_group_get_action ( vw->action_group, "GoBack" ); + if ( action_back ) { + gtk_action_set_sensitive ( action_back, vik_viewport_back_available(vw->viking_vvp) ); + } +*/ + GtkAction* action_forward = gtk_action_group_get_action ( vw->action_group, "GoForward" ); + if ( action_forward ) { + gtk_action_set_sensitive ( action_forward, vik_viewport_forward_available(vw->viking_vvp) ); + } + + toolbar_action_set_sensitive ( vw->viking_vtb, "GoForward", vik_viewport_forward_available(vw->viking_vvp) ); +} + +/** + * draw_goto_back_and_forth: + */ +static void draw_goto_back_and_forth ( GtkAction *a, VikWindow *vw ) +{ + gboolean changed = FALSE; + if (!strcmp(gtk_action_get_name(a), "GoBack")) { + changed = vik_viewport_go_back ( vw->viking_vvp ); + } + else if (!strcmp(gtk_action_get_name(a), "GoForward")) { + changed = vik_viewport_go_forward ( vw->viking_vvp ); + } + else { + return; + } + + // Recheck buttons sensitivities, as the center changed signal is not sent on back/forward changes + // (otherwise we would get stuck in an infinite loop!) + center_changed_cb ( vw ); + + if ( changed ) + draw_update ( vw ); +} + +/** + * Refresh maps displayed + */ +static void draw_refresh_cb ( GtkAction *a, VikWindow *vw ) +{ + // Only get 'new' maps + simple_map_update ( vw, TRUE ); +} + +static void calendar_goto_today ( GtkAction *a, VikWindow *vw ) +{ + vik_layers_panel_calendar_today ( vw->viking_vlp ); +} + +static void menu_addlayer_cb ( GtkAction *a, VikWindow *vw ) +{ + VikLayerTypeEnum type; + for ( type = 0; type < VIK_LAYER_NUM_TYPES; type++ ) { + if (!strcmp(vik_layer_get_interface(type)->fixed_layer_name, gtk_action_get_name(a))) { + if ( vik_layers_panel_new_layer ( vw->viking_vlp, type ) ) { + draw_update ( vw ); + vw->modified = TRUE; + } + } + } +} + +static void menu_copy_layer_cb ( GtkAction *a, VikWindow *vw ) +{ + a_clipboard_copy_selected ( vw->viking_vlp ); +} + +static void menu_cut_layer_cb ( GtkAction *a, VikWindow *vw ) +{ + vik_layers_panel_cut_selected ( vw->viking_vlp ); + vw->modified = TRUE; +} + +static void menu_paste_layer_cb ( GtkAction *a, VikWindow *vw ) +{ + if ( vik_layers_panel_paste_selected ( vw->viking_vlp ) ) + { + vw->modified = TRUE; + } +} + +static void menu_properties_cb ( GtkAction *a, VikWindow *vw ) +{ + if ( ! vik_layers_panel_properties ( vw->viking_vlp ) ) + a_dialog_info_msg ( GTK_WINDOW(vw), _("You must select a layer to show its properties.") ); +} + +static void help_help_cb ( GtkAction *a, VikWindow *vw ) +{ +#ifdef WINDOWS + ShellExecute(NULL, "open", ""PACKAGE".pdf", NULL, NULL, SW_SHOWNORMAL); +#else /* WINDOWS */ + gchar *uri; + uri = g_strdup_printf("ghelp:%s", PACKAGE); + GError *error = NULL; + gboolean show = gtk_show_uri (NULL, uri, GDK_CURRENT_TIME, &error); + if ( !show && !error ) + // No error to show, so unlikely this will get called + a_dialog_error_msg ( GTK_WINDOW(vw), _("The help system is not available.") ); + else if ( error ) { + // Main error path + a_dialog_error_msg_extra ( GTK_WINDOW(vw), _("Help is not available because: %s.\nEnsure a Mime Type ghelp handler program is installed (e.g. yelp)."), error->message ); + g_error_free ( error ); + } + g_free(uri); +#endif /* WINDOWS */ +} + +static void toggle_side_panel ( VikWindow *vw ) +{ + vw->show_side_panel = !vw->show_side_panel; + if ( vw->show_side_panel ) + gtk_widget_show(GTK_WIDGET(vw->viking_vlp)); + else + gtk_widget_hide(GTK_WIDGET(vw->viking_vlp)); +} + +static void toggle_full_screen ( VikWindow *vw ) +{ + vw->show_full_screen = !vw->show_full_screen; + if ( vw->show_full_screen ) + gtk_window_fullscreen ( GTK_WINDOW(vw) ); + else + gtk_window_unfullscreen ( GTK_WINDOW(vw) ); +} + +static void toggle_statusbar ( VikWindow *vw ) +{ + vw->show_statusbar = !vw->show_statusbar; + if ( vw->show_statusbar ) + gtk_widget_show ( GTK_WIDGET(vw->viking_vs) ); + else + gtk_widget_hide ( GTK_WIDGET(vw->viking_vs) ); +} + +static void toggle_toolbar ( VikWindow *vw ) +{ + vw->show_toolbar = !vw->show_toolbar; + if ( vw->show_toolbar ) + gtk_widget_show ( toolbar_get_widget (vw->viking_vtb) ); + else + gtk_widget_hide ( toolbar_get_widget (vw->viking_vtb) ); +} + +static void toggle_main_menu ( VikWindow *vw ) +{ + vw->show_main_menu = !vw->show_main_menu; + if ( vw->show_main_menu ) + gtk_widget_show ( gtk_ui_manager_get_widget ( vw->uim, "/ui/MainMenu" ) ); + else + gtk_widget_hide ( gtk_ui_manager_get_widget ( vw->uim, "/ui/MainMenu" ) ); +} + +static void toggle_side_panel_buttons ( VikWindow *vw ) +{ + vw->show_side_panel_buttons = !vw->show_side_panel_buttons; + vik_layers_panel_show_buttons ( vw->viking_vlp, vw->show_side_panel_buttons ); +} + +static void toggle_side_panel_calendar ( VikWindow *vw ) +{ + vw->show_side_panel_calendar = !vw->show_side_panel_calendar; + vik_layers_panel_show_calendar ( vw->viking_vlp, vw->show_side_panel_calendar ); +} + +// Only for 'view' toggle menu widgets ATM. +GtkWidget *get_show_widget_by_name(VikWindow *vw, const gchar *name) +{ + g_return_val_if_fail(name != NULL, NULL); + + // ATM only FullScreen is *not* in SetShow path + gchar *path; + if ( g_strcmp0 ("FullScreen", name ) ) + path = g_strconcat("/ui/MainMenu/View/SetShow/", name, NULL); + else + path = g_strconcat("/ui/MainMenu/View/", name, NULL); + + GtkWidget *widget = gtk_ui_manager_get_widget(vw->uim, path); + g_free(path); + + return widget; +} + +static void tb_view_side_panel_cb ( GtkAction *a, VikWindow *vw ) +{ + gboolean next_state = !vw->show_side_panel; + GtkWidget *check_box = get_show_widget_by_name ( vw, gtk_action_get_name(a) ); + gboolean menu_state = gtk_check_menu_item_get_active ( GTK_CHECK_MENU_ITEM(check_box) ); + if ( next_state != menu_state ) + gtk_check_menu_item_set_active ( GTK_CHECK_MENU_ITEM(check_box), next_state ); + else + toggle_side_panel ( vw ); +} + +static void tb_full_screen_cb ( GtkAction *a, VikWindow *vw ) +{ + gboolean next_state = !vw->show_full_screen; + GtkWidget *check_box = get_show_widget_by_name ( vw, gtk_action_get_name(a) ); + gboolean menu_state = gtk_check_menu_item_get_active ( GTK_CHECK_MENU_ITEM(check_box) ); + if ( next_state != menu_state ) + gtk_check_menu_item_set_active ( GTK_CHECK_MENU_ITEM(check_box), next_state ); + else + toggle_full_screen ( vw ); +} + +static void tb_view_statusbar_cb ( GtkAction *a, VikWindow *vw ) +{ + gboolean next_state = !vw->show_statusbar; + GtkWidget *check_box = get_show_widget_by_name ( vw, gtk_action_get_name(a) ); + gboolean menu_state = gtk_check_menu_item_get_active ( GTK_CHECK_MENU_ITEM(check_box) ); + if ( next_state != menu_state ) + gtk_check_menu_item_set_active ( GTK_CHECK_MENU_ITEM(check_box), next_state ); + else + toggle_statusbar ( vw ); +} + +static void tb_view_toolbar_cb ( GtkAction *a, VikWindow *vw ) +{ + gboolean next_state = !vw->show_toolbar; + GtkWidget *check_box = get_show_widget_by_name ( vw, gtk_action_get_name(a) ); + gboolean menu_state = gtk_check_menu_item_get_active ( GTK_CHECK_MENU_ITEM(check_box) ); + if ( next_state != menu_state ) + gtk_check_menu_item_set_active ( GTK_CHECK_MENU_ITEM(check_box), next_state ); + else + toggle_toolbar ( vw ); +} + +static void tb_view_main_menu_cb ( GtkAction *a, VikWindow *vw ) +{ + gboolean next_state = !vw->show_main_menu; + GtkWidget *check_box = get_show_widget_by_name ( vw, gtk_action_get_name(a) ); + gboolean menu_state = gtk_check_menu_item_get_active ( GTK_CHECK_MENU_ITEM(check_box) ); + if ( next_state != menu_state ) + gtk_check_menu_item_set_active ( GTK_CHECK_MENU_ITEM(check_box), next_state ); + else + toggle_main_menu ( vw ); +} + +static void tb_view_side_panel_buttons_cb ( GtkAction *a, VikWindow *vw ) +{ + gboolean next_state = !vw->show_side_panel_buttons; + GtkWidget *check_box = get_show_widget_by_name ( vw, gtk_action_get_name(a) ); + gboolean menu_state = gtk_check_menu_item_get_active ( GTK_CHECK_MENU_ITEM(check_box) ); + if ( next_state != menu_state ) + gtk_check_menu_item_set_active ( GTK_CHECK_MENU_ITEM(check_box), next_state ); + else + toggle_side_panel_buttons ( vw ); +} + +static void tb_view_side_panel_calendar_cb ( GtkAction *a, VikWindow *vw ) +{ + gboolean next_state = !vw->show_side_panel_calendar; + GtkWidget *check_box = get_show_widget_by_name ( vw, gtk_action_get_name(a) ); + gboolean menu_state = gtk_check_menu_item_get_active ( GTK_CHECK_MENU_ITEM(check_box) ); + if ( next_state != menu_state ) + gtk_check_menu_item_set_active ( GTK_CHECK_MENU_ITEM(check_box), next_state ); + else + toggle_side_panel_calendar ( vw ); +} + +static void tb_set_draw_scale ( GtkAction *a, VikWindow *vw ) +{ + gboolean next_state = !vik_viewport_get_draw_scale ( vw->viking_vvp ); + GtkWidget *check_box = get_show_widget_by_name ( vw, gtk_action_get_name(a) ); + gboolean menu_state = gtk_check_menu_item_get_active ( GTK_CHECK_MENU_ITEM(check_box) ); + if ( next_state != menu_state ) + gtk_check_menu_item_set_active ( GTK_CHECK_MENU_ITEM(check_box), next_state ); + else { + vik_viewport_set_draw_scale ( vw->viking_vvp, next_state ); + draw_update ( vw ); + } +} + +static void tb_set_draw_centermark ( GtkAction *a, VikWindow *vw ) +{ + gboolean next_state = !vik_viewport_get_draw_centermark ( vw->viking_vvp ); + GtkWidget *check_box = get_show_widget_by_name ( vw, gtk_action_get_name(a) ); + gboolean menu_state = gtk_check_menu_item_get_active ( GTK_CHECK_MENU_ITEM(check_box) ); + if ( next_state != menu_state ) + gtk_check_menu_item_set_active ( GTK_CHECK_MENU_ITEM(check_box), next_state ); + else { + vik_viewport_set_draw_centermark ( vw->viking_vvp, next_state ); + draw_update ( vw ); + } +} + +static void tb_set_draw_highlight ( GtkAction *a, VikWindow *vw ) +{ + gboolean next_state = !vik_viewport_get_draw_highlight ( vw->viking_vvp ); + GtkWidget *check_box = get_show_widget_by_name ( vw, gtk_action_get_name(a) ); + gboolean menu_state = gtk_check_menu_item_get_active ( GTK_CHECK_MENU_ITEM(check_box) ); + if ( next_state != menu_state ) + gtk_check_menu_item_set_active ( GTK_CHECK_MENU_ITEM(check_box), next_state ); + else { + vik_viewport_set_draw_highlight ( vw->viking_vvp, next_state ); + draw_update ( vw ); + } +} + +static void help_about_cb ( GtkAction *a, VikWindow *vw ) +{ + a_dialog_about(GTK_WINDOW(vw)); +} + +static void help_cache_info_cb ( GtkAction *a, VikWindow *vw ) +{ + // NB: No i18n as this is just for debug + gint byte_size = a_mapcache_get_size(); + gchar *msg_sz = NULL; + gchar *msg = NULL; +#if GLIB_CHECK_VERSION(2,30,0) + msg_sz = g_format_size_full ( byte_size, G_FORMAT_SIZE_LONG_FORMAT ); +#else + msg_sz = g_format_size_for_display ( byte_size ); +#endif + msg = g_strdup_printf ( "Map Cache size is %s with %d items", msg_sz, a_mapcache_get_count()); + a_dialog_info_msg_extra ( GTK_WINDOW(vw), "%s", msg ); + g_free ( msg_sz ); + g_free ( msg ); +} + +static void back_forward_info_cb ( GtkAction *a, VikWindow *vw ) +{ + vik_viewport_show_centers ( vw->viking_vvp, GTK_WINDOW(vw) ); +} + +static void menu_delete_layer_cb ( GtkAction *a, VikWindow *vw ) +{ + if ( vik_layers_panel_get_selected ( vw->viking_vlp ) ) + { + vik_layers_panel_delete_selected ( vw->viking_vlp ); + vw->modified = TRUE; + } + else + a_dialog_info_msg ( GTK_WINDOW(vw), _("You must select a layer to delete.") ); +} + +static void full_screen_cb ( GtkAction *a, VikWindow *vw ) +{ + gboolean next_state = !vw->show_full_screen; + GtkToggleToolButton *tbutton = (GtkToggleToolButton *)toolbar_get_widget_by_name ( vw->viking_vtb, gtk_action_get_name(a) ); + if ( tbutton ) { + gboolean tb_state = gtk_toggle_tool_button_get_active ( tbutton ); + if ( next_state != tb_state ) + gtk_toggle_tool_button_set_active ( tbutton, next_state ); + else + toggle_full_screen ( vw ); + } + else + toggle_full_screen ( vw ); +} + +static void view_side_panel_cb ( GtkAction *a, VikWindow *vw ) +{ + gboolean next_state = !vw->show_side_panel; + GtkToggleToolButton *tbutton = (GtkToggleToolButton *)toolbar_get_widget_by_name ( vw->viking_vtb, gtk_action_get_name(a) ); + if ( tbutton ) { + gboolean tb_state = gtk_toggle_tool_button_get_active ( tbutton ); + if ( next_state != tb_state ) + gtk_toggle_tool_button_set_active ( tbutton, next_state ); + else + toggle_side_panel ( vw ); + } + else + toggle_side_panel ( vw ); +} + +static void view_statusbar_cb ( GtkAction *a, VikWindow *vw ) +{ + gboolean next_state = !vw->show_statusbar; + GtkToggleToolButton *tbutton = (GtkToggleToolButton *)toolbar_get_widget_by_name ( vw->viking_vtb, gtk_action_get_name(a) ); + if ( tbutton ) { + gboolean tb_state = gtk_toggle_tool_button_get_active ( tbutton ); + if ( next_state != tb_state ) + gtk_toggle_tool_button_set_active ( tbutton, next_state ); + else + toggle_statusbar ( vw ); + } + else + toggle_statusbar ( vw ); +} + +static void view_toolbar_cb ( GtkAction *a, VikWindow *vw ) +{ + gboolean next_state = !vw->show_toolbar; + GtkToggleToolButton *tbutton = (GtkToggleToolButton *)toolbar_get_widget_by_name ( vw->viking_vtb, gtk_action_get_name(a) ); + if ( tbutton ) { + gboolean tb_state = gtk_toggle_tool_button_get_active ( tbutton ); + if ( next_state != tb_state ) + gtk_toggle_tool_button_set_active ( tbutton, next_state ); + else + toggle_toolbar ( vw ); + } + else + toggle_toolbar ( vw ); +} + +static void view_main_menu_cb ( GtkAction *a, VikWindow *vw ) +{ + gboolean next_state = !vw->show_main_menu; + GtkToggleToolButton *tbutton = (GtkToggleToolButton *)toolbar_get_widget_by_name ( vw->viking_vtb, gtk_action_get_name(a) ); + if ( tbutton ) { + gboolean tb_state = gtk_toggle_tool_button_get_active ( tbutton ); + if ( next_state != tb_state ) + gtk_toggle_tool_button_set_active ( tbutton, next_state ); + else + toggle_main_menu ( vw ); + } + else + toggle_main_menu ( vw ); +} + +static void view_side_panel_buttons_cb ( GtkAction *a, VikWindow *vw ) +{ + gboolean next_state = !vw->show_side_panel_buttons; + GtkToggleToolButton *tbutton = (GtkToggleToolButton *)toolbar_get_widget_by_name ( vw->viking_vtb, gtk_action_get_name(a) ); + if ( tbutton ) { + gboolean tb_state = gtk_toggle_tool_button_get_active ( tbutton ); + if ( next_state != tb_state ) + gtk_toggle_tool_button_set_active ( tbutton, next_state ); + else + toggle_side_panel_buttons ( vw ); + } + else + toggle_side_panel_buttons ( vw ); +} + +static void view_side_panel_calendar_cb ( GtkAction *a, VikWindow *vw ) +{ + gboolean next_state = !vw->show_side_panel_calendar; + GtkToggleToolButton *tbutton = (GtkToggleToolButton *)toolbar_get_widget_by_name ( vw->viking_vtb, gtk_action_get_name(a) ); + if ( tbutton ) { + gboolean tb_state = gtk_toggle_tool_button_get_active ( tbutton ); + if ( next_state != tb_state ) + gtk_toggle_tool_button_set_active ( tbutton, next_state ); + else + toggle_side_panel_calendar ( vw ); + } + else + toggle_side_panel_calendar ( vw ); +} + +/*************************************** + ** tool management routines + ** + ***************************************/ + +static toolbox_tools_t* toolbox_create(VikWindow *vw) +{ + toolbox_tools_t *vt = g_new0(toolbox_tools_t, 1); + vt->active_tool = -1; + vt->vw = vw; + return vt; +} + +static void toolbox_add_tool(toolbox_tools_t *vt, VikToolInterface *vti, gint layer_type ) +{ + vt->tools = g_renew(toolbox_tool_t, vt->tools, vt->n_tools+1); + vt->tools[vt->n_tools].ti = *vti; + vt->tools[vt->n_tools].layer_type = layer_type; + if (vti->create) { + vt->tools[vt->n_tools].state = vti->create(vt->vw, vt->vw->viking_vvp); + } + else { + vt->tools[vt->n_tools].state = NULL; + } + vt->n_tools++; +} + +static int toolbox_get_tool(toolbox_tools_t *vt, const gchar *tool_name) +{ + int i; + for (i=0; in_tools; i++) { + if (!strcmp(tool_name, vt->tools[i].ti.radioActionEntry.name)) { + break; + } + } + return i; +} + +static void toolbox_activate(toolbox_tools_t *vt, const gchar *tool_name) +{ + int tool = toolbox_get_tool(vt, tool_name); + toolbox_tool_t *t = &vt->tools[tool]; + VikLayer *vl = vik_layers_panel_get_selected ( vt->vw->viking_vlp ); + + if (tool == vt->n_tools) { + g_critical("trying to activate a non-existent tool..."); + return; + } + /* is the tool already active? */ + if (vt->active_tool == tool) { + return; + } + + if (vt->active_tool != -1) { + if (vt->tools[vt->active_tool].ti.deactivate) { + vt->tools[vt->active_tool].ti.deactivate(NULL, vt->tools[vt->active_tool].state); + } + } + if (t->ti.activate) { + t->ti.activate(vl, t->state); + } + vt->active_tool = tool; +} + +static const GdkCursor *toolbox_get_cursor(toolbox_tools_t *vt, const gchar *tool_name) +{ + int tool = toolbox_get_tool(vt, tool_name); + toolbox_tool_t *t = &vt->tools[tool]; + if (t->ti.cursor == NULL) { + if (t->ti.cursor_type == GDK_CURSOR_IS_PIXMAP && t->ti.cursor_data != NULL) { + GdkPixbuf *cursor_pixbuf = gdk_pixbuf_from_pixdata (t->ti.cursor_data, FALSE, NULL); + /* TODO: settable offeset */ + t->ti.cursor = gdk_cursor_new_from_pixbuf ( gdk_display_get_default(), cursor_pixbuf, 3, 3 ); + g_object_unref ( G_OBJECT(cursor_pixbuf) ); + } else { + t->ti.cursor = gdk_cursor_new ( t->ti.cursor_type ); + } + } + return t->ti.cursor; +} + +static void toolbox_click (toolbox_tools_t *vt, GdkEventButton *event) +{ + VikLayer *vl = vik_layers_panel_get_selected ( vt->vw->viking_vlp ); + if (vt->active_tool != -1 && vt->tools[vt->active_tool].ti.click) { + gint ltype = vt->tools[vt->active_tool].layer_type; + if ( ltype == TOOL_LAYER_TYPE_NONE || (vl && ltype == vl->type) ) + (void)vt->tools[vt->active_tool].ti.click(vl, event, vt->tools[vt->active_tool].state); + } +} + +static void toolbox_move (toolbox_tools_t *vt, GdkEventMotion *event) +{ + VikLayer *vl = vik_layers_panel_get_selected ( vt->vw->viking_vlp ); + if (vt->active_tool != -1 && vt->tools[vt->active_tool].ti.move) { + gint ltype = vt->tools[vt->active_tool].layer_type; + if ( ltype == TOOL_LAYER_TYPE_NONE || (vl && ltype == vl->type) ) + if ( VIK_LAYER_TOOL_ACK_GRAB_FOCUS == vt->tools[vt->active_tool].ti.move(vl, event, vt->tools[vt->active_tool].state) ) + gtk_widget_grab_focus ( GTK_WIDGET(vt->vw->viking_vvp) ); + } +} + +static void toolbox_release (toolbox_tools_t *vt, GdkEventButton *event) +{ + VikLayer *vl = vik_layers_panel_get_selected ( vt->vw->viking_vlp ); + if (vt->active_tool != -1 && vt->tools[vt->active_tool].ti.release ) { + gint ltype = vt->tools[vt->active_tool].layer_type; + if ( ltype == TOOL_LAYER_TYPE_NONE || (vl && ltype == vl->type) ) + (void)vt->tools[vt->active_tool].ti.release(vl, event, vt->tools[vt->active_tool].state); + } +} +/** End tool management ************************************/ + +void vik_window_enable_layer_tool ( VikWindow *vw, gint layer_id, gint tool_id ) +{ + gtk_action_activate ( gtk_action_group_get_action ( vw->action_group, vik_layer_get_interface(layer_id)->tools[tool_id].radioActionEntry.name ) ); +} + +// Be careful with usage - as it may trigger actions being continually alternately by the menu and toolbar items +// DON'T Use this from menu callback with toggle toolbar items!! +static void toolbar_sync ( VikWindow *vw, const gchar *name, gboolean state ) +{ + GtkToggleToolButton *tbutton = (GtkToggleToolButton *)toolbar_get_widget_by_name ( vw->viking_vtb, name ); + if ( tbutton ) { + // Causes toggle signal action to be raised. + gtk_toggle_tool_button_set_active ( tbutton, state ); + } +} + +/* this function gets called whenever a menu is clicked */ +// Note old is not used +static void menu_cb ( GtkAction *old, GtkAction *a, VikWindow *vw ) +{ + // Ensure Toolbar kept in sync + const gchar *name = gtk_action_get_name(a); + toolbar_sync ( vw, name, TRUE ); + + /* White Magic, my friends ... White Magic... */ + gint tool_id; + toolbox_activate(vw->vt, name); + + vw->viewport_cursor = (GdkCursor *)toolbox_get_cursor(vw->vt, name); + + if ( gtk_widget_get_window(GTK_WIDGET(vw->viking_vvp)) ) + /* We set cursor, even if it is NULL: it resets to default */ + gdk_window_set_cursor ( gtk_widget_get_window(GTK_WIDGET(vw->viking_vvp)), vw->viewport_cursor ); + + if (!g_strcmp0(name, "Pan")) { + vw->current_tool = TOOL_PAN; + } + else if (!g_strcmp0(name, "Zoom")) { + vw->current_tool = TOOL_ZOOM; + } + else if (!g_strcmp0(name, "Ruler")) { + vw->current_tool = TOOL_RULER; + } + else if (!g_strcmp0(name, "Select")) { + vw->current_tool = TOOL_SELECT; + } + else { + VikLayerTypeEnum layer_id; + for (layer_id=0; layer_idtools_count; tool_id++ ) { + if (!g_strcmp0(vik_layer_get_interface(layer_id)->tools[tool_id].radioActionEntry.name, name)) { + vw->current_tool = TOOL_LAYER; + vw->tool_layer_id = layer_id; + vw->tool_tool_id = tool_id; + } + } + } + } + draw_status_tool ( vw ); +} + +static void window_set_filename ( VikWindow *vw, const gchar *filename ) +{ + gchar *title; + const gchar *file; + if ( vw->filename ) + g_free ( vw->filename ); + if ( filename == NULL ) + { + vw->filename = NULL; + } + else + { + vw->filename = g_strdup(filename); + } + + /* Refresh window's title */ + file = window_get_filename ( vw ); + title = g_strdup_printf( "%s - Viking", file ); + gtk_window_set_title ( GTK_WINDOW(vw), title ); + g_free ( title ); +} + +static const gchar *window_get_filename ( VikWindow *vw ) +{ + return vw->filename ? a_file_basename ( vw->filename ) : _("Untitled"); +} + +GtkWidget *vik_window_get_drawmode_button ( VikWindow *vw, VikViewportDrawMode mode ) +{ + GtkWidget *mode_button; + gchar *buttonname; + switch ( mode ) { +#ifdef VIK_CONFIG_EXPEDIA + case VIK_VIEWPORT_DRAWMODE_EXPEDIA: buttonname = "/ui/MainMenu/View/ModeExpedia"; break; +#endif + case VIK_VIEWPORT_DRAWMODE_MERCATOR: buttonname = "/ui/MainMenu/View/ModeMercator"; break; + case VIK_VIEWPORT_DRAWMODE_LATLON: buttonname = "/ui/MainMenu/View/ModeLatLon"; break; + default: buttonname = "/ui/MainMenu/View/ModeUTM"; + } + mode_button = gtk_ui_manager_get_widget ( vw->uim, buttonname ); + g_assert ( mode_button ); + return mode_button; +} + +/** + * vik_window_get_pan_move: + * @vw: some VikWindow + * + * Retrieves @vw's pan_move. + * + * Should be removed as soon as possible. + * + * Returns: @vw's pan_move + * + * Since: 0.9.96 + **/ +gboolean vik_window_get_pan_move ( VikWindow *vw ) +{ + return vw->pan_move; +} + +/** + * Remove the potentially auto added map + */ +static void remove_default_map_layer ( VikWindow *vw ) +{ + if ( a_vik_get_add_default_map_layer () ) { + VikAggregateLayer *top = vik_layers_panel_get_top_layer(vw->viking_vlp); + if ( vik_aggregate_layer_count(top) == 1 ) { + VikLayer *vl = vik_aggregate_layer_get_top_visible_layer_of_type (top, VIK_LAYER_MAPS); + // Could try to compare name vs _("Default Map") but this might have i8n issues if not translated + if ( vl ) + vik_aggregate_layer_delete_layer ( top, vl ); + } + } +} + +static void on_activate_recent_item (GtkRecentChooser *chooser, + VikWindow *self) +{ + gchar *filename; + + filename = gtk_recent_chooser_get_current_uri (chooser); + if (filename != NULL) + { + GFile *file = g_file_new_for_uri ( filename ); + gchar *path = g_file_get_path ( file ); + g_object_unref ( file ); + if ( self->filename ) + { + GSList *filenames = NULL; + filenames = g_slist_append ( filenames, path ); + g_signal_emit ( G_OBJECT(self), window_signals[VW_OPENWINDOW_SIGNAL], 0, filenames ); + // NB: GSList & contents are freed by main.open_window + } + else { + if ( check_file_magic_vik ( path ) ) + remove_default_map_layer ( self ); + vik_window_open_file ( self, path, TRUE, TRUE, TRUE, TRUE ); + g_free ( path ); + } + } + + g_free (filename); +} + +static void setup_recent_files (VikWindow *self) +{ + GtkRecentManager *manager; + GtkRecentFilter *filter; + GtkWidget *menu, *menu_item; + + filter = gtk_recent_filter_new (); + /* gtk_recent_filter_add_application (filter, g_get_application_name()); */ + gtk_recent_filter_add_group(filter, "viking"); + + manager = gtk_recent_manager_get_default (); + menu = gtk_recent_chooser_menu_new_for_manager (manager); + gtk_recent_chooser_set_sort_type (GTK_RECENT_CHOOSER (menu), GTK_RECENT_SORT_MRU); + gtk_recent_chooser_add_filter (GTK_RECENT_CHOOSER (menu), filter); + gtk_recent_chooser_set_limit (GTK_RECENT_CHOOSER (menu), a_vik_get_recent_number_files() ); + + menu_item = gtk_ui_manager_get_widget (self->uim, "/ui/MainMenu/File/OpenRecentFile"); + gtk_menu_item_set_submenu (GTK_MENU_ITEM (menu_item), menu); + + g_signal_connect (G_OBJECT (menu), "item-activated", + G_CALLBACK (on_activate_recent_item), (gpointer) self); +} + +/* + * + */ +static void update_recently_used_document (VikWindow *vw, const gchar *filename) +{ + /* Update Recently Used Document framework */ + GtkRecentManager *manager = gtk_recent_manager_get_default(); + GtkRecentData *recent_data = g_slice_new (GtkRecentData); + gchar *groups[] = {"viking", NULL}; + GFile *file = g_file_new_for_commandline_arg(filename); + gchar *uri = g_file_get_uri(file); + gchar *basename = g_path_get_basename(filename); + g_object_unref(file); + file = NULL; + + recent_data->display_name = basename; + recent_data->description = NULL; + recent_data->mime_type = "text/x-gps-data"; + recent_data->app_name = (gchar *) g_get_application_name (); + recent_data->app_exec = g_strjoin (" ", g_get_prgname (), "%f", NULL); + recent_data->groups = groups; + recent_data->is_private = FALSE; + if (!gtk_recent_manager_add_full (manager, uri, recent_data)) + { + gchar *msg = g_strdup_printf (_("Unable to add '%s' to the list of recently used documents"), uri); + vik_statusbar_set_message ( vw->viking_vs, VIK_STATUSBAR_INFO, msg ); + g_free ( msg ); + } + + g_free (uri); + g_free (basename); + g_free (recent_data->app_exec); + g_slice_free (GtkRecentData, recent_data); +} + +/** + * Call this before doing things that may take a long time and otherwise not show any other feedback + * such as loading and saving files + */ +void vik_window_set_busy_cursor ( VikWindow *vw ) +{ + gdk_window_set_cursor ( gtk_widget_get_window(GTK_WIDGET(vw)), vw->busy_cursor ); + // Viewport has a separate cursor + gdk_window_set_cursor ( gtk_widget_get_window(GTK_WIDGET(vw->viking_vvp)), vw->busy_cursor ); + // Ensure cursor updated before doing stuff + while( gtk_events_pending() ) + gtk_main_iteration(); +} + +void vik_window_clear_busy_cursor ( VikWindow *vw ) +{ + gdk_window_set_cursor ( gtk_widget_get_window(GTK_WIDGET(vw)), NULL ); + // Restore viewport cursor + gdk_window_set_cursor ( gtk_widget_get_window(GTK_WIDGET(vw->viking_vvp)), vw->viewport_cursor ); +} + +void vik_window_set_busy_cursor_widget ( GtkWidget *widget, VikWindow *vw ) +{ + gdk_window_set_cursor ( gtk_widget_get_window ( widget ), vw->busy_cursor ); + vik_window_set_busy_cursor ( vw ); +} + +void vik_window_clear_busy_cursor_widget ( GtkWidget *widget, VikWindow *vw ) +{ + gdk_window_set_cursor ( gtk_widget_get_window( widget ), NULL ); + vik_window_clear_busy_cursor ( vw ); +} + +// ATM Call upon file load +// TODO maybe also hook into (new) signals on new/deleted viklayers (of TRW) +// THen only need for adds to mark additional entries. +// For delete may need to recreate +#if 0 +void calendar_update ( VikWindow *vw ) +{ + // Maybe skip if not shown... + // But then on visibility shown, would need to generate it + // Above method seems better. + + GtkCalendar *calendar = (GtkCalendar*)vik_layers_panel_get_calendar ( vw->viking_vlp ); + gtk_calendar_clear_marks ( calendar ); + + GList *layers = vik_layers_panel_get_all_layers_of_type ( vw->viking_vlp, VIK_LAYER_TRW, TRUE ); + if ( !layers ) + return; + + while ( layers ) { + VikTrwLayer *vtl = VIK_TRW_LAYER(layers->data); + calendar_consider_layer ( calendar, vtl ); + layers = g_list_next ( layers ); + } + g_list_free ( layers ); +} +#endif + +/** + * @first: Indicates the first file in a possible list of files to be loaded + * @last: Indicates the last file in a possible list of files to be loaded + * Hence a draw operation can be performed + */ +void vik_window_open_file ( VikWindow *vw, const gchar *filename, gboolean change_filename, gboolean first, gboolean last, gboolean new_layer ) +{ + if ( first ) + vik_window_set_busy_cursor ( vw ); + + // Enable the *new* filename to be accessible by the Layers codez + gchar *original_filename = g_strdup ( vw->filename ); + g_free ( vw->filename ); + vw->filename = g_strdup ( filename ); + gboolean success = FALSE; + gboolean restore_original_filename = FALSE; + vw->loaded_type = a_file_load ( vik_layers_panel_get_top_layer(vw->viking_vlp), vw->viking_vvp, vw->containing_vtl, filename, new_layer ); + switch ( vw->loaded_type ) + { + case LOAD_TYPE_READ_FAILURE: + a_dialog_error_msg ( GTK_WINDOW(vw), _("The file you requested could not be opened.") ); + break; + case LOAD_TYPE_GPSBABEL_FAILURE: + a_dialog_error_msg ( GTK_WINDOW(vw), _("GPSBabel is required to load files of this type or GPSBabel encountered problems.") ); + break; + case LOAD_TYPE_GPX_FAILURE: + a_dialog_error_msg_extra ( GTK_WINDOW(vw), _("Unable to load malformed GPX file %s"), filename ); + break; + case LOAD_TYPE_UNSUPPORTED_FAILURE: + a_dialog_error_msg_extra ( GTK_WINDOW(vw), _("Unsupported file type for %s"), filename ); + break; + case LOAD_TYPE_VIK_FAILURE_NON_FATAL: + { + // Since we can process .vik files with issues just show a warning in the status bar + // Not that a user can do much about it... or tells them what this issue is yet... + gchar *msg = g_strdup_printf (_("WARNING: issues encountered loading %s"), a_file_basename (filename) ); + vik_statusbar_set_message ( vw->viking_vs, VIK_STATUSBAR_INFO, msg ); + g_free ( msg ); + } + // No break, carry on to show any data + case LOAD_TYPE_VIK_SUCCESS: + { + restore_original_filename = TRUE; // NB Will actually get inverted by the 'success' component below + GtkWidget *mode_button; + /* Update UI */ + if ( change_filename ) + window_set_filename ( vw, filename ); + mode_button = vik_window_get_drawmode_button ( vw, vik_viewport_get_drawmode ( vw->viking_vvp ) ); + vw->only_updating_coord_mode_ui = TRUE; /* if we don't set this, it will change the coord to UTM if we click Lat/Lon. I don't know why. */ + gtk_check_menu_item_set_active ( GTK_CHECK_MENU_ITEM(mode_button), TRUE ); + vw->only_updating_coord_mode_ui = FALSE; + + vik_layers_panel_change_coord_mode ( vw->viking_vlp, vik_viewport_get_coord_mode ( vw->viking_vvp ) ); + + // Slightly long winded methods to align loaded viewport settings with the UI + // Since the rewrite for toolbar + menu actions + // there no longer exists a simple way to directly change the UI to a value for toggle settings + // it only supports toggling the existing setting (otherwise get infinite loops in trying to align tb+menu elements) + // Thus get state, compare them, if different then invert viewport setting and (re)sync the setting (via toggling) + gboolean vp_state_scale = vik_viewport_get_draw_scale ( vw->viking_vvp ); + gboolean ui_state_scale = gtk_check_menu_item_get_active ( GTK_CHECK_MENU_ITEM(get_show_widget_by_name(vw, "ShowScale")) ); + if ( vp_state_scale != ui_state_scale ) { + vik_viewport_set_draw_scale ( vw->viking_vvp, !vp_state_scale ); + toggle_draw_scale ( NULL, vw ); + } + gboolean vp_state_centermark = vik_viewport_get_draw_centermark ( vw->viking_vvp ); + gboolean ui_state_centermark = gtk_check_menu_item_get_active ( GTK_CHECK_MENU_ITEM(get_show_widget_by_name(vw, "ShowCenterMark")) ); + if ( vp_state_centermark != ui_state_centermark ) { + vik_viewport_set_draw_centermark ( vw->viking_vvp, !vp_state_centermark ); + toggle_draw_centermark ( NULL, vw ); + } + gboolean vp_state_highlight = vik_viewport_get_draw_highlight ( vw->viking_vvp ); + gboolean ui_state_highlight = gtk_check_menu_item_get_active ( GTK_CHECK_MENU_ITEM(get_show_widget_by_name(vw, "ShowHighlight")) ); + if ( vp_state_highlight != ui_state_highlight ) { + vik_viewport_set_draw_highlight ( vw->viking_vvp, !vp_state_highlight ); + toggle_draw_highlight ( NULL, vw ); + } + } + // NB No break, carry on to redraw + //case LOAD_TYPE_OTHER_SUCCESS: + default: + success = TRUE; + // When LOAD_TYPE_OTHER_SUCCESS *only*, this will maintain the existing Viking project + restore_original_filename = ! restore_original_filename; + update_recently_used_document (vw, filename); + break; + } + + if ( ! success || restore_original_filename ) + // Load didn't work or want to keep as the existing Viking project, keep using the original name + window_set_filename ( vw, original_filename ); + g_free ( original_filename ); + + if ( last ) { + // Draw even if the last load unsuccessful, as may have successful loads in a list of files + draw_update ( vw ); + vik_layers_panel_calendar_update ( vw->viking_vlp ); + } + // Always clear cursor (e.g. incase first & last loads are on different VikWindows) + vik_window_clear_busy_cursor ( vw ); +} + +static void load_file ( GtkAction *a, VikWindow *vw ) +{ + GSList *files = NULL; + GSList *cur_file = NULL; + gboolean append; + if (!strcmp(gtk_action_get_name(a), "Open")) { + append = FALSE; + } + else if (!strcmp(gtk_action_get_name(a), "Append")) { + append = TRUE; + } + else { + g_critical("Houston, we've had a problem."); + return; + } + + GtkWidget *dialog = gtk_file_chooser_dialog_new (_("Please select a GPS data file to open. "), + GTK_WINDOW(vw), + GTK_FILE_CHOOSER_ACTION_OPEN, + GTK_STOCK_CANCEL, GTK_RESPONSE_CANCEL, + GTK_STOCK_OPEN, GTK_RESPONSE_ACCEPT, + NULL); + if ( last_folder_files_uri ) + gtk_file_chooser_set_current_folder_uri ( GTK_FILE_CHOOSER(dialog), last_folder_files_uri ); + + GtkFileFilter *filter; + // NB file filters are listed this way for alphabetical ordering +#ifdef VIK_CONFIG_GEOCACHES + filter = gtk_file_filter_new (); + gtk_file_filter_set_name( filter, _("Geocaching") ); + gtk_file_filter_add_pattern ( filter, "*.loc" ); // No MIME type available + gtk_file_chooser_add_filter (GTK_FILE_CHOOSER(dialog), filter); +#endif + + filter = gtk_file_filter_new (); + gtk_file_filter_set_name( filter, _("Google Earth") ); + gtk_file_filter_add_mime_type ( filter, "application/vnd.google-earth.kml+xml"); + gtk_file_chooser_add_filter (GTK_FILE_CHOOSER(dialog), filter); + + filter = gtk_file_filter_new (); + gtk_file_filter_set_name( filter, _("GPX") ); + gtk_file_filter_add_pattern ( filter, "*.gpx" ); // No MIME type available + gtk_file_chooser_add_filter (GTK_FILE_CHOOSER(dialog), filter); + + filter = gtk_file_filter_new (); + gtk_file_filter_set_name ( filter, _("JPG") ); + gtk_file_filter_add_mime_type ( filter, "image/jpeg"); + gtk_file_chooser_add_filter (GTK_FILE_CHOOSER(dialog), filter); + + filter = gtk_file_filter_new (); + gtk_file_filter_set_name( filter, _("Viking") ); + gtk_file_filter_add_pattern ( filter, "*.vik" ); + gtk_file_filter_add_pattern ( filter, "*.viking" ); + gtk_file_chooser_add_filter (GTK_FILE_CHOOSER(dialog), filter); + + // NB could have filters for gpspoint (*.gps,*.gpsoint?) + gpsmapper (*.gsm,*.gpsmapper?) + // However assume this are barely used and thus not worthy of inclusion + // as they'll just make the options too many and have no clear file pattern + // one can always use the all option + filter = gtk_file_filter_new (); + gtk_file_filter_set_name( filter, _("All") ); + gtk_file_filter_add_pattern ( filter, "*" ); + gtk_file_chooser_add_filter (GTK_FILE_CHOOSER(dialog), filter); + // Default to any file - same as before open filters were added + gtk_file_chooser_set_filter (GTK_FILE_CHOOSER(dialog), filter); + + gtk_file_chooser_set_select_multiple ( GTK_FILE_CHOOSER(dialog), TRUE ); + gtk_window_set_transient_for ( GTK_WINDOW(dialog), GTK_WINDOW(vw) ); + gtk_window_set_destroy_with_parent ( GTK_WINDOW(dialog), TRUE ); + + if ( gtk_dialog_run ( GTK_DIALOG(dialog) ) == GTK_RESPONSE_ACCEPT ) + { + g_free ( last_folder_files_uri ); + last_folder_files_uri = gtk_file_chooser_get_current_folder_uri ( GTK_FILE_CHOOSER(dialog) ); + +#ifdef VIKING_PROMPT_IF_MODIFIED + if ( (vw->modified || vw->filename) && !append ) +#else + if ( vw->filename && !append ) +#endif + g_signal_emit ( G_OBJECT(vw), window_signals[VW_OPENWINDOW_SIGNAL], 0, gtk_file_chooser_get_filenames (GTK_FILE_CHOOSER(dialog) ) ); + else { + + files = gtk_file_chooser_get_filenames (GTK_FILE_CHOOSER(dialog) ); + guint file_num = 0; + guint num_files = g_slist_length(files); + gboolean change_fn = !append && (num_files==1); // only change fn if one file + gboolean first_vik_file = TRUE; + cur_file = files; + while ( cur_file ) { + gchar *file_name = cur_file->data; + file_num++; + if ( !append && check_file_magic_vik ( file_name ) ) { + // Load first of many .vik files in current window + if ( first_vik_file ) { + remove_default_map_layer ( vw ); + vik_window_open_file ( vw, file_name, TRUE, TRUE, TRUE, TRUE ); + first_vik_file = FALSE; + } + else { + // Load each subsequent .vik file in a separate window + VikWindow *newvw = vik_window_new_window (); + if (newvw) + vik_window_open_file ( newvw, file_name, TRUE, TRUE, TRUE, TRUE ); + } + } + else + // Other file types or appending a .vik file + vik_window_open_file ( vw, file_name, change_fn, (file_num==1), (file_num==num_files), !append ); + + g_free (file_name); + cur_file = g_slist_next (cur_file); + } + g_slist_free (files); + } + } + gtk_widget_destroy ( dialog ); +} + +static void open_external_layer ( GtkAction *a, VikWindow *vw ) +{ + GtkWidget *dialog = gtk_file_chooser_dialog_new (_("Open File"), + GTK_WINDOW(vw), + GTK_FILE_CHOOSER_ACTION_OPEN, + GTK_STOCK_CANCEL, GTK_RESPONSE_CANCEL, + GTK_STOCK_OPEN, GTK_RESPONSE_ACCEPT, + NULL); + + GtkFileFilter *filter; + filter = gtk_file_filter_new (); + gtk_file_filter_set_name ( filter, _("GPX") ); + gtk_file_filter_add_mime_type ( filter, "gpx+xml"); + gtk_file_filter_add_pattern ( filter, "*.gpx" ); + gtk_file_chooser_add_filter ( GTK_FILE_CHOOSER(dialog), filter ); + gtk_file_chooser_set_filter ( GTK_FILE_CHOOSER(dialog), filter ); + + filter = gtk_file_filter_new (); + gtk_file_filter_set_name( filter, _("All") ); + gtk_file_filter_add_pattern ( filter, "*" ); + gtk_file_chooser_add_filter ( GTK_FILE_CHOOSER(dialog), filter ); + + if ( gtk_dialog_run ( GTK_DIALOG(dialog) ) == GTK_RESPONSE_ACCEPT ) { + gchar *fn = gtk_file_chooser_get_filename ( GTK_FILE_CHOOSER(dialog) ); + VikTrwLayer *trw = VIK_TRW_LAYER ( vik_layer_create ( VIK_LAYER_TRW, vw->viking_vvp, FALSE ) ); + vik_layer_rename ( VIK_LAYER ( trw ), _(fn) ); + vik_aggregate_layer_add_layer ( vik_layers_panel_get_top_layer(vw->viking_vlp), VIK_LAYER(trw), TRUE ); + trw_layer_replace_external ( trw, fn ); + draw_update ( vw ); + } + gtk_widget_destroy ( dialog ); +} + +static gboolean save_file_as ( GtkAction *a, VikWindow *vw ) +{ + gboolean rv = FALSE; + const gchar *fn; + + GtkWidget *dialog = gtk_file_chooser_dialog_new (_("Save as Viking File."), + GTK_WINDOW(vw), + GTK_FILE_CHOOSER_ACTION_SAVE, + GTK_STOCK_CANCEL, GTK_RESPONSE_CANCEL, + GTK_STOCK_SAVE, GTK_RESPONSE_ACCEPT, + NULL); + if ( last_folder_files_uri ) + gtk_file_chooser_set_current_folder_uri ( GTK_FILE_CHOOSER(dialog), last_folder_files_uri ); + + GtkFileFilter *filter; + filter = gtk_file_filter_new (); + gtk_file_filter_set_name( filter, _("All") ); + gtk_file_filter_add_pattern ( filter, "*" ); + gtk_file_chooser_add_filter (GTK_FILE_CHOOSER(dialog), filter); + + filter = gtk_file_filter_new (); + gtk_file_filter_set_name( filter, _("Viking") ); + gtk_file_filter_add_pattern ( filter, "*.vik" ); + gtk_file_filter_add_pattern ( filter, "*.viking" ); + gtk_file_chooser_add_filter (GTK_FILE_CHOOSER(dialog), filter); + // Default to a Viking file + gtk_file_chooser_set_filter (GTK_FILE_CHOOSER(dialog), filter); + + gtk_window_set_transient_for ( GTK_WINDOW(dialog), GTK_WINDOW(vw) ); + gtk_window_set_destroy_with_parent ( GTK_WINDOW(dialog), TRUE ); + + // Auto append / replace extension with '.vik' to the suggested file name as it's going to be a Viking File + gchar* auto_save_name = g_strdup ( window_get_filename ( vw ) ); + if ( ! a_file_check_ext ( auto_save_name, ".vik" ) ) + auto_save_name = g_strconcat ( auto_save_name, ".vik", NULL ); + + gtk_file_chooser_set_current_name (GTK_FILE_CHOOSER(dialog), auto_save_name); + + while ( gtk_dialog_run ( GTK_DIALOG(dialog) ) == GTK_RESPONSE_ACCEPT ) + { + fn = gtk_file_chooser_get_filename (GTK_FILE_CHOOSER(dialog) ); + if ( g_file_test ( fn, G_FILE_TEST_EXISTS ) == FALSE || a_dialog_yes_or_no ( GTK_WINDOW(dialog), _("The file \"%s\" exists, do you wish to overwrite it?"), a_file_basename ( fn ) ) ) + { + window_set_filename ( vw, fn ); + rv = window_save ( vw ); + if ( rv ) { + vw->modified = FALSE; + g_free ( last_folder_files_uri ); + last_folder_files_uri = gtk_file_chooser_get_current_folder_uri ( GTK_FILE_CHOOSER(dialog) ); + } + break; + } + } + g_free ( auto_save_name ); + gtk_widget_destroy ( dialog ); + return rv; +} + +static gboolean window_save ( VikWindow *vw ) +{ + vik_window_set_busy_cursor ( vw ); + gboolean success = TRUE; + + if ( a_file_save ( vik_layers_panel_get_top_layer ( vw->viking_vlp ), vw->viking_vvp, vw->filename ) ) + { + update_recently_used_document ( vw, vw->filename ); + } + else + { + a_dialog_error_msg ( GTK_WINDOW(vw), _("The filename you requested could not be opened for writing.") ); + success = FALSE; + } + vik_window_clear_busy_cursor ( vw ); + return success; +} + +static gboolean save_file ( GtkAction *a, VikWindow *vw ) +{ + if ( ! vw->filename ) + return save_file_as ( NULL, vw ); + else + { + vw->modified = FALSE; + return window_save ( vw ); + } +} + +/** + * export_to: + * + * Export all TRW Layers in the list to individual files in the specified directory + * + * Returns: %TRUE on success + */ +static gboolean export_to ( VikWindow *vw, GList *gl, VikFileType_t vft, const gchar *dir, const gchar *extension ) +{ + gboolean success = TRUE; + + gint export_count = 0; + + vik_window_set_busy_cursor ( vw ); + + while ( gl ) { + + gchar *fn = g_strconcat ( dir, G_DIR_SEPARATOR_S, VIK_LAYER(gl->data)->name, extension, NULL ); + + // Some protection in attempting to write too many same named files + // As this will get horribly slow... + gboolean safe = FALSE; + gint ii = 2; + while ( ii < 5000 ) { + if ( g_file_test ( fn, G_FILE_TEST_EXISTS ) ) { + // Try rename + g_free ( fn ); + fn = g_strdup_printf ( "%s%s%s#%03d%s", dir, G_DIR_SEPARATOR_S, VIK_LAYER(gl->data)->name, ii, extension ); + } + else { + safe = TRUE; + break; + } + ii++; + } + if ( ii == 5000 ) + success = FALSE; + + // NB: We allow exporting empty layers + if ( safe ) { + gboolean this_success = a_file_export ( VIK_TRW_LAYER(gl->data), fn, vft, NULL, TRUE ); + + // Show some progress + if ( this_success ) { + export_count++; + gchar *message = g_strdup_printf ( _("Exporting to file: %s"), fn ); + vik_statusbar_set_message ( vw->viking_vs, VIK_STATUSBAR_INFO, message ); + while ( gtk_events_pending() ) + gtk_main_iteration (); + g_free ( message ); + } + + success = success && this_success; + } + + g_free ( fn ); + gl = g_list_next ( gl ); + } + + vik_window_clear_busy_cursor ( vw ); + + // Confirm what happened. + gchar *message = g_strdup_printf ( _("Exported files: %d"), export_count ); + vik_statusbar_set_message ( vw->viking_vs, VIK_STATUSBAR_INFO, message ); + g_free ( message ); + + return success; +} + +static void export_to_common ( VikWindow *vw, VikFileType_t vft, const gchar *extension ) +{ + GList *gl = vik_layers_panel_get_all_layers_of_type ( vw->viking_vlp, VIK_LAYER_TRW, TRUE ); + + if ( !gl ) { + a_dialog_info_msg ( GTK_WINDOW(vw), _("Nothing to Export!") ); + return; + } + + GtkWidget *dialog = gtk_file_chooser_dialog_new ( _("Export to directory"), + GTK_WINDOW(vw), + GTK_FILE_CHOOSER_ACTION_SELECT_FOLDER, + GTK_STOCK_CANCEL, + GTK_RESPONSE_REJECT, + GTK_STOCK_OK, + GTK_RESPONSE_ACCEPT, + NULL ); + gtk_window_set_transient_for ( GTK_WINDOW(dialog), GTK_WINDOW(vw) ); + gtk_window_set_destroy_with_parent ( GTK_WINDOW(dialog), TRUE ); + gtk_window_set_modal ( GTK_WINDOW(dialog), TRUE ); + + gtk_widget_show_all ( dialog ); + + if ( gtk_dialog_run ( GTK_DIALOG(dialog) ) == GTK_RESPONSE_ACCEPT ) { + gchar *dir = gtk_file_chooser_get_filename ( GTK_FILE_CHOOSER(dialog) ); + gtk_widget_destroy ( dialog ); + if ( dir ) { + if ( !export_to ( vw, gl, vft, dir, extension ) ) + a_dialog_error_msg ( GTK_WINDOW(vw),_("Could not convert all files") ); + g_free ( dir ); + } + } + else + gtk_widget_destroy ( dialog ); + + g_list_free ( gl ); +} + +static void export_to_gpx ( GtkAction *a, VikWindow *vw ) +{ + export_to_common ( vw, FILE_TYPE_GPX, ".gpx" ); +} + +static void export_to_kml ( GtkAction *a, VikWindow *vw ) +{ + export_to_common ( vw, FILE_TYPE_KML, ".kml" ); +} + +static void file_properties_cb ( GtkAction *a, VikWindow *vw ) +{ + gchar *message = NULL; + if ( vw->filename ) { + if ( g_file_test ( vw->filename, G_FILE_TEST_EXISTS ) ) { + // Get some timestamp information of the file + GStatBuf stat_buf; + if ( g_stat ( vw->filename, &stat_buf ) == 0 ) { + gchar time_buf[64]; + strftime ( time_buf, sizeof(time_buf), "%c", gmtime((const time_t *)&stat_buf.st_mtime) ); + gchar *size = NULL; + gint byte_size = stat_buf.st_size; +#if GLIB_CHECK_VERSION(2,30,0) + size = g_format_size_full ( byte_size, G_FORMAT_SIZE_DEFAULT ); +#else + size = g_format_size_for_display ( byte_size ); +#endif + message = g_strdup_printf ( "%s\n\n%s\n\n%s", vw->filename, time_buf, size ); + g_free (size); + } + } + else + message = g_strdup ( _("File not accessible") ); + } + else + message = g_strdup ( _("No Viking File") ); + + // Show the info + a_dialog_info_msg ( GTK_WINDOW(vw), message ); + g_free ( message ); +} + +static void my_acquire ( VikWindow *vw, VikDataSourceInterface *datasource ) +{ + vik_datasource_mode_t mode = datasource->mode; + if ( mode == VIK_DATASOURCE_AUTO_LAYER_MANAGEMENT ) + mode = VIK_DATASOURCE_CREATENEWLAYER; + a_acquire ( vw, vw->viking_vlp, vw->viking_vvp, mode, datasource, NULL, NULL ); +} + +static void acquire_from_gps ( GtkAction *a, VikWindow *vw ) +{ + my_acquire ( vw, &vik_datasource_gps_interface ); +} + +static void acquire_from_file ( GtkAction *a, VikWindow *vw ) +{ + my_acquire ( vw, &vik_datasource_file_interface ); +} + +static void acquire_from_geojson ( GtkAction *a, VikWindow *vw ) +{ + my_acquire ( vw, &vik_datasource_geojson_interface ); +} + +static void acquire_from_routing ( GtkAction *a, VikWindow *vw ) +{ + my_acquire ( vw, &vik_datasource_routing_interface ); +} + +#ifdef VIK_CONFIG_OPENSTREETMAP +static void acquire_from_osm ( GtkAction *a, VikWindow *vw ) +{ + my_acquire ( vw, &vik_datasource_osm_interface ); +} + +static void acquire_from_my_osm ( GtkAction *a, VikWindow *vw ) +{ + my_acquire ( vw, &vik_datasource_osm_my_traces_interface ); +} +#endif + +#ifdef VIK_CONFIG_GEOCACHES +static void acquire_from_gc ( GtkAction *a, VikWindow *vw ) +{ + my_acquire ( vw, &vik_datasource_gc_interface ); +} +#endif + +#ifdef VIK_CONFIG_GEOTAG +static void acquire_from_geotag ( GtkAction *a, VikWindow *vw ) +{ + my_acquire ( vw, &vik_datasource_geotag_interface ); +} +#endif + +#ifdef VIK_CONFIG_GEONAMES +static void acquire_from_wikipedia ( GtkAction *a, VikWindow *vw ) +{ + my_acquire ( vw, &vik_datasource_wikipedia_interface ); +} +#endif + +static void acquire_from_url ( GtkAction *a, VikWindow *vw ) +{ + my_acquire ( vw, &vik_datasource_url_interface ); +} + +static void goto_default_location( GtkAction *a, VikWindow *vw) +{ + struct LatLon ll; + ll.lat = a_vik_get_default_lat(); + ll.lon = a_vik_get_default_long(); + vik_viewport_set_center_latlon(vw->viking_vvp, &ll, TRUE); + vik_layers_panel_emit_update(vw->viking_vlp); +} + +static void goto_auto_location( GtkAction *a, VikWindow *vw) +{ + vik_window_statusbar_update ( vw, _("Trying to determine location..."), VIK_STATUSBAR_INFO ); +#ifdef HAVE_LIBGEOCLUE_2 + libgeoclue_where_am_i ( vw, update_from_geoclue ); +#else + determine_location_fallback ( vw ); +#endif +} + + +static void goto_address( GtkAction *a, VikWindow *vw) +{ + a_vik_goto ( vw, vw->viking_vvp ); + vik_layers_panel_emit_update ( vw->viking_vlp ); +} + +static void mapcache_flush_cb ( GtkAction *a, VikWindow *vw ) +{ + a_mapcache_flush(); +} + +static void menu_copy_centre_cb ( GtkAction *a, VikWindow *vw ) +{ + const VikCoord* coord; + struct UTM utm; + gchar *lat = NULL, *lon = NULL; + + coord = vik_viewport_get_center ( vw->viking_vvp ); + vik_coord_to_utm ( coord, &utm ); + + gboolean full_format = FALSE; + (void)a_settings_get_boolean ( VIK_SETTINGS_WIN_COPY_CENTRE_FULL_FORMAT, &full_format ); + + if ( full_format ) + // Bells & Whistles - may include degrees, minutes and second symbols + get_location_strings ( vw, utm, &lat, &lon ); + else { + // Simple x.xx y.yy format + struct LatLon ll; + a_coords_utm_to_latlon ( &utm, &ll ); + lat = g_strdup_printf ( "%.6f", ll.lat ); + lon = g_strdup_printf ( "%.6f", ll.lon ); + } + + gchar *msg = g_strdup_printf ( "%s %s", lat, lon ); + g_free (lat); + g_free (lon); + + a_clipboard_copy ( VIK_CLIPBOARD_DATA_TEXT, 0, 0, 0, msg, NULL ); + + g_free ( msg ); +} + +static void layer_defaults_cb ( GtkAction *a, VikWindow *vw ) +{ + gchar **texts = g_strsplit ( gtk_action_get_name(a), "Layer", 0 ); + + if ( !texts[1] ) + return; // Internally broken :( + + if ( ! a_layer_defaults_show_window ( GTK_WINDOW(vw), texts[1] ) ) + a_dialog_info_msg ( GTK_WINDOW(vw), _("This layer has no configurable properties.") ); + // NB no update needed + + g_strfreev ( texts ); +} + +static void preferences_change_update ( VikWindow *vw, gpointer data ) +{ + // Want to update all TrackWaypoint layers + GList *layers = vik_layers_panel_get_all_layers_of_type ( vw->viking_vlp, VIK_LAYER_TRW, TRUE ); + + if ( !layers ) + return; + + while ( layers ) { + // Reset the individual waypoints themselves due to the preferences change + VikTrwLayer *vtl = VIK_TRW_LAYER(layers->data); + vik_trw_layer_reset_waypoints ( vtl ); + layers = g_list_next ( layers ); + } + + g_list_free ( layers ); + + draw_update ( vw ); +} + +static void preferences_cb ( GtkAction *a, VikWindow *vw ) +{ + gboolean wp_icon_size = a_vik_get_use_large_waypoint_icons(); + + a_preferences_show_window ( GTK_WINDOW(vw) ); + + // Has the waypoint size setting changed? + if (wp_icon_size != a_vik_get_use_large_waypoint_icons()) { + // Delete icon indexing 'cache' and so automatically regenerates with the new setting when changed + clear_garmin_icon_syms (); + + // Update all windows + g_slist_foreach ( window_list, (GFunc) preferences_change_update, NULL ); + } + + // Ensure TZ Lookup initialized + if ( a_vik_get_time_ref_frame() == VIK_TIME_REF_WORLD ) + vu_setup_lat_lon_tz_lookup(); + + toolbar_apply_settings ( vw->viking_vtb, vw->main_vbox, vw->menu_hbox, TRUE ); + + vik_layers_panel_set_preferences ( vw->viking_vlp ); +} + +static void default_location_cb ( GtkAction *a, VikWindow *vw ) +{ + // Get relevant preferences - these should always be available + VikLayerParam *pref_lat = a_preferences_get_param ( VIKING_PREFERENCES_NAMESPACE "default_latitude" ); + VikLayerParam *pref_lon = a_preferences_get_param ( VIKING_PREFERENCES_NAMESPACE "default_longitude" ); + if ( !pref_lat || !pref_lon ) { + g_critical ( "%s: preference not found", __FUNCTION__ ); + return; + } + + /* Get current center */ + struct LatLon ll; + vik_coord_to_latlon ( vik_viewport_get_center ( vw->viking_vvp ), &ll ); + + /* Apply to preferences */ + VikLayerParamData vlp_data; + vlp_data.d = ll.lat; + a_preferences_run_setparam (vlp_data, pref_lat); + vlp_data.d = ll.lon; + a_preferences_run_setparam (vlp_data, pref_lon); + /* Remember to save */ + a_preferences_save_to_file(); +} + +/** + * Delete All + */ +static void clear_cb ( GtkAction *a, VikWindow *vw ) +{ + // Do nothing if empty + VikAggregateLayer *top = vik_layers_panel_get_top_layer(vw->viking_vlp); + if ( ! vik_aggregate_layer_is_empty(top) ) { + if ( a_dialog_yes_or_no ( GTK_WINDOW(vw), _("Are you sure you wish to delete all layers?"), NULL ) ) { + vik_layers_panel_clear ( vw->viking_vlp ); + window_set_filename ( vw, NULL ); + draw_update ( vw ); + } + } +} + +static void window_close ( GtkAction *a, VikWindow *vw ) +{ + if ( ! delete_event ( vw ) ) + gtk_widget_destroy ( GTK_WIDGET(vw) ); +} + +static gboolean save_file_and_exit ( GtkAction *a, VikWindow *vw ) +{ + if (save_file( NULL, vw)) { + window_close( NULL, vw); + return(TRUE); + } + else + return(FALSE); +} + +static void zoom_to_cb ( GtkAction *a, VikWindow *vw ) +{ + gdouble xmpp = vik_viewport_get_xmpp ( vw->viking_vvp ), ympp = vik_viewport_get_ympp ( vw->viking_vvp ); + if ( a_dialog_custom_zoom ( GTK_WINDOW(vw), &xmpp, &ympp ) ) + { + vik_viewport_set_xmpp ( vw->viking_vvp, xmpp ); + vik_viewport_set_ympp ( vw->viking_vvp, ympp ); + draw_update ( vw ); + } +} + +static void save_image_file ( VikWindow *vw, const gchar *fn, guint w, guint h, gdouble zoom, gboolean save_as_png, gboolean save_kmz ) +{ + /* more efficient way: stuff draws directly to pixbuf (fork viewport) */ + GdkPixbuf *pixbuf_to_save; + gdouble old_xmpp, old_ympp; + GError *error = NULL; + + GtkWidget *msgbox = gtk_message_dialog_new ( GTK_WINDOW(vw), + GTK_DIALOG_MODAL | GTK_DIALOG_DESTROY_WITH_PARENT, + GTK_MESSAGE_INFO, + GTK_BUTTONS_NONE, + _("Generating image file...") ); + + g_signal_connect_swapped (msgbox, "response", G_CALLBACK (gtk_widget_destroy), msgbox); + // Ensure dialog shown + gtk_widget_show_all ( msgbox ); + // Try harder... + vik_statusbar_set_message ( vw->viking_vs, VIK_STATUSBAR_INFO, _("Generating image file...") ); + while ( gtk_events_pending() ) + gtk_main_iteration (); + // Despite many efforts & variations, GTK on my Linux system doesn't show the actual msgbox contents :( + // At least the empty box can give a clue something's going on + the statusbar msg... + // Windows version under Wine OK! + + /* backup old zoom & set new */ + old_xmpp = vik_viewport_get_xmpp ( vw->viking_vvp ); + old_ympp = vik_viewport_get_ympp ( vw->viking_vvp ); + vik_viewport_set_zoom ( vw->viking_vvp, zoom ); + + /* reset width and height: */ + vik_viewport_configure_manually ( vw->viking_vvp, w, h ); + + /* draw all layers */ + draw_redraw ( vw ); + + /* save buffer as file. */ + pixbuf_to_save = gdk_pixbuf_get_from_drawable ( NULL, GDK_DRAWABLE(vik_viewport_get_pixmap ( vw->viking_vvp )), NULL, 0, 0, 0, 0, w, h); + if ( !pixbuf_to_save ) { + g_warning("Failed to generate internal pixmap size: %d x %d", w, h); + gtk_message_dialog_set_markup ( GTK_MESSAGE_DIALOG(msgbox), _("Failed to generate internal image.\n\nTry creating a smaller image.") ); + goto cleanup; + } + + int ans = 0; // Default to success + + if ( save_kmz ) { + gdouble north, east, south, west; + vik_viewport_get_min_max_lat_lon ( vw->viking_vvp, &south, &north, &west, &east ); + ans = kmz_save_file ( pixbuf_to_save, fn, north, east, south, west ); + } + else { + gdk_pixbuf_save ( pixbuf_to_save, fn, save_as_png ? "png" : "jpeg", &error, NULL ); + if (error) { + g_warning("Unable to write to file %s: %s", fn, error->message ); + g_error_free (error); + ans = 42; + } + } + + if ( ans == 0 ) + gtk_message_dialog_set_markup ( GTK_MESSAGE_DIALOG(msgbox), _("Image file generated.") ); + else + gtk_message_dialog_set_markup ( GTK_MESSAGE_DIALOG(msgbox), _("Failed to generate image file.") ); + + g_object_unref ( G_OBJECT(pixbuf_to_save) ); + + cleanup: + vik_statusbar_set_message ( vw->viking_vs, VIK_STATUSBAR_INFO, "" ); + gtk_dialog_add_button ( GTK_DIALOG(msgbox), GTK_STOCK_OK, GTK_RESPONSE_OK ); + gtk_dialog_run ( GTK_DIALOG(msgbox) ); // Don't care about the result + + /* pretend like nothing happened ;) */ + vik_viewport_set_xmpp ( vw->viking_vvp, old_xmpp ); + vik_viewport_set_ympp ( vw->viking_vvp, old_ympp ); + vik_viewport_configure ( vw->viking_vvp ); + draw_update ( vw ); +} + +static void save_image_dir ( VikWindow *vw, const gchar *fn, guint w, guint h, gdouble zoom, gboolean save_as_png, guint tiles_w, guint tiles_h ) +{ + gulong size = sizeof(gchar) * (strlen(fn) + 15); + gchar *name_of_file = g_malloc ( size ); + guint x = 1, y = 1; + struct UTM utm_orig, utm; + + /* *** copied from above *** */ + GdkPixbuf *pixbuf_to_save; + gdouble old_xmpp, old_ympp; + GError *error = NULL; + + /* backup old zoom & set new */ + old_xmpp = vik_viewport_get_xmpp ( vw->viking_vvp ); + old_ympp = vik_viewport_get_ympp ( vw->viking_vvp ); + vik_viewport_set_zoom ( vw->viking_vvp, zoom ); + + /* reset width and height: do this only once for all images (same size) */ + vik_viewport_configure_manually ( vw->viking_vvp, w, h ); + /* *** end copy from above *** */ + + g_assert ( vik_viewport_get_coord_mode ( vw->viking_vvp ) == VIK_COORD_UTM ); + + if ( g_mkdir(fn,0777) != 0 ) + g_warning ( "%s: Failed to create directory %s", __FUNCTION__, fn ); + + utm_orig = *((const struct UTM *)vik_viewport_get_center ( vw->viking_vvp )); + + for ( y = 1; y <= tiles_h; y++ ) + { + for ( x = 1; x <= tiles_w; x++ ) + { + g_snprintf ( name_of_file, size, "%s%cy%d-x%d.%s", fn, G_DIR_SEPARATOR, y, x, save_as_png ? "png" : "jpg" ); + utm = utm_orig; + if ( tiles_w & 0x1 ) + utm.easting += ((gdouble)x - ceil(((gdouble)tiles_w)/2)) * (w*zoom); + else + utm.easting += ((gdouble)x - (((gdouble)tiles_w)+1)/2) * (w*zoom); + if ( tiles_h & 0x1 ) /* odd */ + utm.northing -= ((gdouble)y - ceil(((gdouble)tiles_h)/2)) * (h*zoom); + else /* even */ + utm.northing -= ((gdouble)y - (((gdouble)tiles_h)+1)/2) * (h*zoom); + + /* move to correct place. */ + vik_viewport_set_center_utm ( vw->viking_vvp, &utm, FALSE ); + + draw_redraw ( vw ); + + /* save buffer as file. */ + pixbuf_to_save = gdk_pixbuf_get_from_drawable ( NULL, GDK_DRAWABLE(vik_viewport_get_pixmap ( vw->viking_vvp )), NULL, 0, 0, 0, 0, w, h); + gdk_pixbuf_save ( pixbuf_to_save, name_of_file, save_as_png ? "png" : "jpeg", &error, NULL ); + if (error) + { + gchar *msg = g_strdup_printf (_("Unable to write to file %s: %s"), name_of_file, error->message ); + vik_statusbar_set_message ( vw->viking_vs, VIK_STATUSBAR_INFO, msg ); + g_free ( msg ); + g_error_free (error); + } + + g_object_unref ( G_OBJECT(pixbuf_to_save) ); + } + } + + vik_viewport_set_center_utm ( vw->viking_vvp, &utm_orig, FALSE ); + vik_viewport_set_xmpp ( vw->viking_vvp, old_xmpp ); + vik_viewport_set_ympp ( vw->viking_vvp, old_ympp ); + vik_viewport_configure ( vw->viking_vvp ); + draw_update ( vw ); + + g_free ( name_of_file ); +} + +static void draw_to_image_file_current_window_cb(GtkWidget* widget,GdkEventButton *event,gpointer *pass_along) +{ + VikWindow *vw = VIK_WINDOW(pass_along[0]); + GtkSpinButton *width_spin = GTK_SPIN_BUTTON(pass_along[1]), *height_spin = GTK_SPIN_BUTTON(pass_along[2]); + + gint active = gtk_combo_box_get_active ( GTK_COMBO_BOX(pass_along[3]) ); + gdouble zoom = pow (2, active-2 ); + + gdouble width_min, width_max, height_min, height_max; + gint width, height; + + gtk_spin_button_get_range ( width_spin, &width_min, &width_max ); + gtk_spin_button_get_range ( height_spin, &height_min, &height_max ); + + /* TODO: support for xzoom and yzoom values */ + width = vik_viewport_get_width ( vw->viking_vvp ) * vik_viewport_get_xmpp ( vw->viking_vvp ) / zoom; + height = vik_viewport_get_height ( vw->viking_vvp ) * vik_viewport_get_xmpp ( vw->viking_vvp ) / zoom; + + if ( width > width_max || width < width_min || height > height_max || height < height_min ) + a_dialog_info_msg ( GTK_WINDOW(vw), _("Viewable region outside allowable pixel size bounds for image. Clipping width/height values.") ); + + gtk_spin_button_set_value ( width_spin, width ); + gtk_spin_button_set_value ( height_spin, height ); +} + +static void draw_to_image_file_total_area_cb (GtkSpinButton *spinbutton, gpointer *pass_along) +{ + GtkSpinButton *width_spin = GTK_SPIN_BUTTON(pass_along[1]), *height_spin = GTK_SPIN_BUTTON(pass_along[2]); + + gint active = gtk_combo_box_get_active ( GTK_COMBO_BOX(pass_along[3]) ); + gdouble zoom = pow (2, active-2 ); + + gchar *label_text; + gdouble w, h; + w = gtk_spin_button_get_value(width_spin) * zoom; + h = gtk_spin_button_get_value(height_spin) * zoom; + if (pass_along[4]) /* save many images; find TOTAL area covered */ + { + w *= gtk_spin_button_get_value(GTK_SPIN_BUTTON(pass_along[4])); + h *= gtk_spin_button_get_value(GTK_SPIN_BUTTON(pass_along[5])); + } + vik_units_distance_t dist_units = a_vik_get_units_distance (); + switch (dist_units) { + case VIK_UNITS_DISTANCE_KILOMETRES: + label_text = g_strdup_printf ( _("Total area: %ldm x %ldm (%.3f sq. km)"), (glong)w, (glong)h, (w*h/1000000)); + break; + case VIK_UNITS_DISTANCE_MILES: + label_text = g_strdup_printf ( _("Total area: %ldm x %ldm (%.3f sq. miles)"), (glong)w, (glong)h, (w*h/2589988.11)); + break; + case VIK_UNITS_DISTANCE_NAUTICAL_MILES: + label_text = g_strdup_printf ( _("Total area: %ldm x %ldm (%.3f sq. NM)"), (glong)w, (glong)h, (w*h/(1852.0*1852.0))); + break; + default: + label_text = g_strdup_printf ("Just to keep the compiler happy"); + g_critical("Houston, we've had a problem. distance=%d", dist_units); + } + + gtk_label_set_text(GTK_LABEL(pass_along[6]), label_text); + g_free ( label_text ); +} + +typedef enum { + VW_GEN_SINGLE_IMAGE, + VW_GEN_DIRECTORY_OF_IMAGES, + VW_GEN_KMZ_FILE, +} img_generation_t; + +#define VIK_SETTINGS_KMZ_DEFAULT_MAPS_DIR "kmz_default_maps_dir" + +/* + * Get an allocated filename (or directory as specified) + */ +static gchar* draw_image_filename ( VikWindow *vw, img_generation_t img_gen, gdouble zoom ) +{ + gchar *fn = NULL; + if ( img_gen != VW_GEN_DIRECTORY_OF_IMAGES ) + { + // Single file + GtkWidget *dialog = gtk_file_chooser_dialog_new (_("Save Image"), + GTK_WINDOW(vw), + GTK_FILE_CHOOSER_ACTION_SAVE, + GTK_STOCK_CANCEL, GTK_RESPONSE_CANCEL, + GTK_STOCK_SAVE, GTK_RESPONSE_ACCEPT, + NULL); + if ( last_folder_images_uri ) + gtk_file_chooser_set_current_folder_uri ( GTK_FILE_CHOOSER(dialog), last_folder_images_uri ); + + GtkFileChooser *chooser = GTK_FILE_CHOOSER ( dialog ); + /* Add filters */ + GtkFileFilter *filter; + filter = gtk_file_filter_new (); + gtk_file_filter_set_name ( filter, _("All") ); + gtk_file_filter_add_pattern ( filter, "*" ); + gtk_file_chooser_add_filter ( chooser, filter ); + + filter = gtk_file_filter_new (); + gchar *extension = NULL; + + if ( img_gen == VW_GEN_KMZ_FILE ) { + gtk_file_filter_set_name ( filter, _("KMZ") ); + gtk_file_filter_add_mime_type ( filter, "vnd.google-earth.kmz"); + gtk_file_filter_add_pattern ( filter, "*.kmz" ); + gtk_file_chooser_add_filter ( chooser, filter ); + extension = "kmz"; + } + else { + if ( vw->draw_image_save_as_png ) { + gtk_file_filter_set_name ( filter, _("PNG") ); + gtk_file_filter_add_mime_type ( filter, "image/png"); + gtk_file_chooser_add_filter ( chooser, filter ); + extension = "png"; + } else { + gtk_file_filter_set_name ( filter, _("JPG") ); + gtk_file_filter_add_mime_type ( filter, "image/jpeg"); + gtk_file_chooser_add_filter ( chooser, filter ); + extension = "jpg"; + } + } + gtk_file_chooser_set_filter ( chooser, filter ); + + // Autogenerate a name + // Read from settings for the directory + gchar *save_dir = NULL; + (void)a_settings_get_string ( VIK_SETTINGS_KMZ_DEFAULT_MAPS_DIR, &save_dir ); + if ( save_dir ) + (void)gtk_file_chooser_set_current_folder ( chooser, save_dir ); + + const VikCoord *vc = vik_viewport_get_center ( vw->viking_vvp ); + if ( vc->mode == VIK_COORD_LATLON ) { + gchar *fname = g_strdup_printf ( "%.3f_%.3f_%d.%s", vc->north_south, vc->east_west, (gint)zoom, extension ); + gtk_file_chooser_set_current_name ( chooser, fname ); + g_free ( fname ); + } + + gtk_window_set_transient_for ( GTK_WINDOW(dialog), GTK_WINDOW(vw) ); + gtk_window_set_destroy_with_parent ( GTK_WINDOW(dialog), TRUE ); + + if ( gtk_dialog_run ( GTK_DIALOG(dialog) ) == GTK_RESPONSE_ACCEPT ) { + g_free ( last_folder_images_uri ); + last_folder_images_uri = gtk_file_chooser_get_current_folder_uri ( GTK_FILE_CHOOSER(dialog) ); + + fn = gtk_file_chooser_get_filename (GTK_FILE_CHOOSER(dialog) ); + if ( g_file_test ( fn, G_FILE_TEST_EXISTS ) ) + if ( ! a_dialog_yes_or_no ( GTK_WINDOW(dialog), _("The file \"%s\" exists, do you wish to overwrite it?"), a_file_basename ( fn ) ) ) + fn = NULL; + } + gtk_widget_destroy ( dialog ); + } + else { + // A directory + // For some reason this method is only written to work in UTM... + if ( vik_viewport_get_coord_mode(vw->viking_vvp) != VIK_COORD_UTM ) { + a_dialog_error_msg ( GTK_WINDOW(vw), _("You must be in UTM mode to use this feature") ); + return fn; + } + + GtkWidget *dialog = gtk_file_chooser_dialog_new (_("Choose a directory to hold images"), + GTK_WINDOW(vw), + GTK_FILE_CHOOSER_ACTION_SELECT_FOLDER, + GTK_STOCK_CANCEL, GTK_RESPONSE_CANCEL, + GTK_STOCK_OK, GTK_RESPONSE_ACCEPT, + NULL); + gtk_window_set_transient_for ( GTK_WINDOW(dialog), GTK_WINDOW(vw) ); + gtk_window_set_destroy_with_parent ( GTK_WINDOW(dialog), TRUE ); + + if ( gtk_dialog_run ( GTK_DIALOG(dialog) ) == GTK_RESPONSE_ACCEPT ) { + fn = gtk_file_chooser_get_filename (GTK_FILE_CHOOSER(dialog) ); + } + gtk_widget_destroy ( dialog ); + } + return fn; +} + +static void draw_to_image_file ( VikWindow *vw, img_generation_t img_gen ) +{ + /* todo: default for answers inside VikWindow or static (thruout instance) */ + GtkWidget *dialog = gtk_dialog_new_with_buttons ( _("Save to Image File"), GTK_WINDOW(vw), + GTK_DIALOG_MODAL | GTK_DIALOG_DESTROY_WITH_PARENT, + GTK_STOCK_CANCEL, + GTK_RESPONSE_REJECT, + GTK_STOCK_OK, + GTK_RESPONSE_ACCEPT, + NULL ); + GtkWidget *width_label, *width_spin, *height_label, *height_spin; + GtkWidget *current_window_button; + gpointer current_window_pass_along[7]; + GtkWidget *zoom_label, *zoom_combo; + GtkWidget *total_size_label; + + // only used for VW_GEN_DIRECTORY_OF_IMAGES + GtkWidget *tiles_width_spin = NULL, *tiles_height_spin = NULL; + + width_label = gtk_label_new ( _("Width (pixels):") ); + width_spin = gtk_spin_button_new ( GTK_ADJUSTMENT(gtk_adjustment_new ( vw->draw_image_width, 10, 50000, 10, 100, 0 )), 10, 0 ); + height_label = gtk_label_new ( _("Height (pixels):") ); + height_spin = gtk_spin_button_new ( GTK_ADJUSTMENT(gtk_adjustment_new ( vw->draw_image_height, 10, 50000, 10, 100, 0 )), 10, 0 ); +#ifdef WINDOWS + GtkWidget *win_warning_label = gtk_label_new ( _("WARNING: USING LARGE IMAGES OVER 10000x10000\nMAY CRASH THE PROGRAM!") ); +#endif + zoom_label = gtk_label_new ( _("Zoom (meters per pixel):") ); + /* TODO: separate xzoom and yzoom factors */ + zoom_combo = create_zoom_combo_all_levels(); + + gdouble mpp = vik_viewport_get_xmpp(vw->viking_vvp); + gint active = 2 + round ( log (mpp) / log (2) ); + + // Can we not hard code size here? + if ( active > 17 ) + active = 17; + if ( active < 0 ) + active = 0; + gtk_combo_box_set_active ( GTK_COMBO_BOX(zoom_combo), active ); + + total_size_label = gtk_label_new ( NULL ); + + current_window_button = gtk_button_new_with_label ( _("Area in current viewable window") ); + current_window_pass_along [0] = vw; + current_window_pass_along [1] = width_spin; + current_window_pass_along [2] = height_spin; + current_window_pass_along [3] = zoom_combo; + current_window_pass_along [4] = NULL; // Only for directory of tiles: width + current_window_pass_along [5] = NULL; // Only for directory of tiles: height + current_window_pass_along [6] = total_size_label; + g_signal_connect ( G_OBJECT(current_window_button), "button_press_event", G_CALLBACK(draw_to_image_file_current_window_cb), current_window_pass_along ); + + GtkWidget *png_radio = gtk_radio_button_new_with_label ( NULL, _("Save as PNG") ); + GtkWidget *jpeg_radio = gtk_radio_button_new_with_label_from_widget ( GTK_RADIO_BUTTON(png_radio), _("Save as JPEG") ); + + if ( img_gen == VW_GEN_KMZ_FILE ) { + // Don't show image type selection if creating a KMZ (always JPG internally) + // Start with viewable area by default + draw_to_image_file_current_window_cb ( current_window_button, NULL, current_window_pass_along ); + } else { + gtk_box_pack_start (GTK_BOX(gtk_dialog_get_content_area(GTK_DIALOG(dialog))), jpeg_radio, FALSE, FALSE, 0); + gtk_box_pack_start (GTK_BOX(gtk_dialog_get_content_area(GTK_DIALOG(dialog))), png_radio, FALSE, FALSE, 0); + } + + if ( ! vw->draw_image_save_as_png ) + gtk_toggle_button_set_active ( GTK_TOGGLE_BUTTON(jpeg_radio), TRUE ); + + gtk_box_pack_start (GTK_BOX(gtk_dialog_get_content_area(GTK_DIALOG(dialog))), width_label, FALSE, FALSE, 0); + gtk_box_pack_start (GTK_BOX(gtk_dialog_get_content_area(GTK_DIALOG(dialog))), width_spin, FALSE, FALSE, 0); + gtk_box_pack_start (GTK_BOX(gtk_dialog_get_content_area(GTK_DIALOG(dialog))), height_label, FALSE, FALSE, 0); + gtk_box_pack_start (GTK_BOX(gtk_dialog_get_content_area(GTK_DIALOG(dialog))), height_spin, FALSE, FALSE, 0); +#ifdef WINDOWS + gtk_box_pack_start (GTK_BOX(gtk_dialog_get_content_area(GTK_DIALOG(dialog))), win_warning_label, FALSE, FALSE, 0); +#endif + gtk_box_pack_start (GTK_BOX(gtk_dialog_get_content_area(GTK_DIALOG(dialog))), current_window_button, FALSE, FALSE, 0); + gtk_box_pack_start (GTK_BOX(gtk_dialog_get_content_area(GTK_DIALOG(dialog))), zoom_label, FALSE, FALSE, 0); + gtk_box_pack_start (GTK_BOX(gtk_dialog_get_content_area(GTK_DIALOG(dialog))), zoom_combo, FALSE, FALSE, 0); + + if ( img_gen == VW_GEN_DIRECTORY_OF_IMAGES ) + { + GtkWidget *tiles_width_label, *tiles_height_label; + + tiles_width_label = gtk_label_new ( _("East-west image tiles:") ); + tiles_width_spin = gtk_spin_button_new ( GTK_ADJUSTMENT(gtk_adjustment_new ( 5, 1, 10, 1, 100, 0 )), 1, 0 ); + tiles_height_label = gtk_label_new ( _("North-south image tiles:") ); + tiles_height_spin = gtk_spin_button_new ( GTK_ADJUSTMENT(gtk_adjustment_new ( 5, 1, 10, 1, 100, 0 )), 1, 0 ); + gtk_box_pack_start (GTK_BOX(gtk_dialog_get_content_area(GTK_DIALOG(dialog))), tiles_width_label, FALSE, FALSE, 0); + gtk_box_pack_start (GTK_BOX(gtk_dialog_get_content_area(GTK_DIALOG(dialog))), tiles_width_spin, FALSE, FALSE, 0); + gtk_box_pack_start (GTK_BOX(gtk_dialog_get_content_area(GTK_DIALOG(dialog))), tiles_height_label, FALSE, FALSE, 0); + gtk_box_pack_start (GTK_BOX(gtk_dialog_get_content_area(GTK_DIALOG(dialog))), tiles_height_spin, FALSE, FALSE, 0); + + current_window_pass_along [4] = tiles_width_spin; + current_window_pass_along [5] = tiles_height_spin; + g_signal_connect ( G_OBJECT(tiles_width_spin), "value-changed", G_CALLBACK(draw_to_image_file_total_area_cb), current_window_pass_along ); + g_signal_connect ( G_OBJECT(tiles_height_spin), "value-changed", G_CALLBACK(draw_to_image_file_total_area_cb), current_window_pass_along ); + } + gtk_box_pack_start (GTK_BOX(gtk_dialog_get_content_area(GTK_DIALOG(dialog))), total_size_label, FALSE, FALSE, 0); + g_signal_connect ( G_OBJECT(width_spin), "value-changed", G_CALLBACK(draw_to_image_file_total_area_cb), current_window_pass_along ); + g_signal_connect ( G_OBJECT(height_spin), "value-changed", G_CALLBACK(draw_to_image_file_total_area_cb), current_window_pass_along ); + g_signal_connect ( G_OBJECT(zoom_combo), "changed", G_CALLBACK(draw_to_image_file_total_area_cb), current_window_pass_along ); + + draw_to_image_file_total_area_cb ( NULL, current_window_pass_along ); /* set correct size info now */ + + gtk_dialog_set_default_response ( GTK_DIALOG(dialog), GTK_RESPONSE_ACCEPT ); + + gtk_widget_show_all ( gtk_dialog_get_content_area(GTK_DIALOG(dialog)) ); + + if ( gtk_dialog_run ( GTK_DIALOG(dialog) ) == GTK_RESPONSE_ACCEPT ) + { + gtk_widget_hide ( GTK_WIDGET(dialog) ); + + gint active_z = gtk_combo_box_get_active ( GTK_COMBO_BOX(zoom_combo) ); + gdouble zoom = pow (2, active_z-2 ); + + vw->draw_image_save_as_png = gtk_toggle_button_get_active ( GTK_TOGGLE_BUTTON(png_radio) ); + + gchar *fn = draw_image_filename ( vw, img_gen, zoom ); + if ( !fn ) + return; + + if ( img_gen == VW_GEN_SINGLE_IMAGE ) { + save_image_file ( vw, fn, + vw->draw_image_width = gtk_spin_button_get_value_as_int ( GTK_SPIN_BUTTON(width_spin) ), + vw->draw_image_height = gtk_spin_button_get_value_as_int ( GTK_SPIN_BUTTON(height_spin) ), + zoom, + vw->draw_image_save_as_png, + FALSE ); + } else if ( img_gen == VW_GEN_KMZ_FILE ) { + // Remove some viewport overlays as these aren't useful in KMZ file. + gboolean restore_xhair = vik_viewport_get_draw_centermark ( vw->viking_vvp ); + if ( restore_xhair ) + vik_viewport_set_draw_centermark ( vw->viking_vvp, FALSE ); + gboolean restore_scale = vik_viewport_get_draw_scale ( vw->viking_vvp ); + if ( restore_scale ) + vik_viewport_set_draw_scale ( vw->viking_vvp, FALSE ); + + save_image_file ( vw, + fn, + gtk_spin_button_get_value_as_int ( GTK_SPIN_BUTTON(width_spin) ), + gtk_spin_button_get_value_as_int ( GTK_SPIN_BUTTON(height_spin) ), + zoom, + FALSE, // JPG + TRUE ); + + if ( restore_xhair ) + vik_viewport_set_draw_centermark ( vw->viking_vvp, TRUE ); + if ( restore_scale ) + vik_viewport_set_draw_scale ( vw->viking_vvp, TRUE ); + if ( restore_xhair || restore_scale ) + draw_update ( vw ); + } + else { + // NB is in UTM mode ATM + save_image_dir ( vw, fn, + vw->draw_image_width = gtk_spin_button_get_value_as_int ( GTK_SPIN_BUTTON(width_spin) ), + vw->draw_image_height = gtk_spin_button_get_value_as_int ( GTK_SPIN_BUTTON(height_spin) ), + zoom, + vw->draw_image_save_as_png = gtk_toggle_button_get_active ( GTK_TOGGLE_BUTTON(png_radio) ), + gtk_spin_button_get_value ( GTK_SPIN_BUTTON(tiles_width_spin) ), + gtk_spin_button_get_value ( GTK_SPIN_BUTTON(tiles_height_spin) ) ); + } + + g_free ( fn ); + } + gtk_widget_destroy ( GTK_WIDGET(dialog) ); +} + +static void draw_to_image_file_cb ( GtkAction *a, VikWindow *vw ) +{ + draw_to_image_file ( vw, VW_GEN_SINGLE_IMAGE ); +} + +static void draw_to_image_dir_cb ( GtkAction *a, VikWindow *vw ) +{ + draw_to_image_file ( vw, VW_GEN_DIRECTORY_OF_IMAGES ); +} + +#ifdef HAVE_ZIP_H +static void draw_to_kmz_file_cb ( GtkAction *a, VikWindow *vw ) +{ + if ( vik_viewport_get_coord_mode(vw->viking_vvp) == VIK_COORD_UTM ) { + a_dialog_error_msg ( GTK_WINDOW(vw), _("This feature is not available in UTM mode") ); + return; + } + // NB ATM This only generates a KMZ file with the current viewport image - intended mostly for map images [but will include any lines/icons from track & waypoints that are drawn] + // (it does *not* include a full KML dump of every track, waypoint etc...) + draw_to_image_file ( vw, VW_GEN_KMZ_FILE ); +} + +/** + * + */ +static void import_kmz_file_cb ( GtkAction *a, VikWindow *vw ) +{ + GtkWidget *dialog = gtk_file_chooser_dialog_new (_("Open File"), + GTK_WINDOW(vw), + GTK_FILE_CHOOSER_ACTION_OPEN, + GTK_STOCK_CANCEL, GTK_RESPONSE_CANCEL, + GTK_STOCK_OPEN, GTK_RESPONSE_ACCEPT, + NULL); + + GtkFileFilter *filter; + filter = gtk_file_filter_new (); + gtk_file_filter_set_name ( filter, _("KMZ") ); + gtk_file_filter_add_mime_type ( filter, "vnd.google-earth.kmz"); + gtk_file_filter_add_pattern ( filter, "*.kmz" ); + gtk_file_chooser_add_filter ( GTK_FILE_CHOOSER(dialog), filter ); + // Default filter to KMZ type + gtk_file_chooser_set_filter ( GTK_FILE_CHOOSER(dialog), filter ); + + filter = gtk_file_filter_new (); + gtk_file_filter_set_name( filter, _("All") ); + gtk_file_filter_add_pattern ( filter, "*" ); + gtk_file_chooser_add_filter ( GTK_FILE_CHOOSER(dialog), filter ); + + if ( gtk_dialog_run ( GTK_DIALOG(dialog) ) == GTK_RESPONSE_ACCEPT ) { + gchar *fn = gtk_file_chooser_get_filename ( GTK_FILE_CHOOSER(dialog) ); + // TODO convert ans value into readable explaination of failure... + int ans = kmz_open_file ( fn, vw->viking_vvp, vw->viking_vlp ); + if ( ans ) + a_dialog_error_msg_extra ( GTK_WINDOW(vw), _("Unable to import %s."), fn ); + + draw_update ( vw ); + } + gtk_widget_destroy ( dialog ); +} +#endif + +static void print_cb ( GtkAction *a, VikWindow *vw ) +{ + a_print(vw, vw->viking_vvp); +} + +/* really a misnomer: changes coord mode (actual coordinates) AND/OR draw mode (viewport only) */ +static void window_change_coord_mode_cb ( GtkAction *old_a, GtkAction *a, VikWindow *vw ) +{ + const gchar *name = gtk_action_get_name(a); + GtkToggleToolButton *tbutton = (GtkToggleToolButton *)toolbar_get_widget_by_name ( vw->viking_vtb, name ); + if ( tbutton ) + gtk_toggle_tool_button_set_active ( tbutton, TRUE ); + + VikViewportDrawMode drawmode; + if (!g_strcmp0(name, "ModeUTM")) { + drawmode = VIK_VIEWPORT_DRAWMODE_UTM; + } + else if (!g_strcmp0(name, "ModeLatLon")) { + drawmode = VIK_VIEWPORT_DRAWMODE_LATLON; + } + else if (!g_strcmp0(name, "ModeExpedia")) { + drawmode = VIK_VIEWPORT_DRAWMODE_EXPEDIA; + } + else if (!g_strcmp0(name, "ModeMercator")) { + drawmode = VIK_VIEWPORT_DRAWMODE_MERCATOR; + } + else { + g_critical("Houston, we've had a problem."); + return; + } + + if ( !vw->only_updating_coord_mode_ui ) + { + VikViewportDrawMode olddrawmode = vik_viewport_get_drawmode ( vw->viking_vvp ); + if ( olddrawmode != drawmode ) + { + /* this takes care of coord mode too */ + vik_viewport_set_drawmode ( vw->viking_vvp, drawmode ); + if ( drawmode == VIK_VIEWPORT_DRAWMODE_UTM ) { + vik_layers_panel_change_coord_mode ( vw->viking_vlp, VIK_COORD_UTM ); + } else if ( olddrawmode == VIK_VIEWPORT_DRAWMODE_UTM ) { + vik_layers_panel_change_coord_mode ( vw->viking_vlp, VIK_COORD_LATLON ); + } + draw_update ( vw ); + } + } +} + +static void toggle_draw_scale ( GtkAction *a, VikWindow *vw ) +{ + gboolean state = !vik_viewport_get_draw_scale ( vw->viking_vvp ); + GtkWidget *check_box = gtk_ui_manager_get_widget ( vw->uim, "/ui/MainMenu/View/SetShow/ShowScale" ); + if ( !check_box ) + return; + gtk_check_menu_item_set_active ( GTK_CHECK_MENU_ITEM(check_box), state ); + vik_viewport_set_draw_scale ( vw->viking_vvp, state ); + draw_update ( vw ); +} + +static void toggle_draw_centermark ( GtkAction *a, VikWindow *vw ) +{ + gboolean state = !vik_viewport_get_draw_centermark ( vw->viking_vvp ); + GtkWidget *check_box = gtk_ui_manager_get_widget ( vw->uim, "/ui/MainMenu/View/SetShow/ShowCenterMark" ); + if ( !check_box ) + return; + gtk_check_menu_item_set_active ( GTK_CHECK_MENU_ITEM(check_box), state ); + vik_viewport_set_draw_centermark ( vw->viking_vvp, state ); + draw_update ( vw ); +} + +static void toggle_draw_highlight ( GtkAction *a, VikWindow *vw ) +{ + gboolean state = !vik_viewport_get_draw_highlight ( vw->viking_vvp ); + GtkWidget *check_box = gtk_ui_manager_get_widget ( vw->uim, "/ui/MainMenu/View/SetShow/ShowHighlight" ); + if ( !check_box ) + return; + gtk_check_menu_item_set_active ( GTK_CHECK_MENU_ITEM(check_box), state ); + vik_viewport_set_draw_highlight ( vw->viking_vvp, state ); + draw_update ( vw ); +} + +static void set_bg_color ( GtkAction *a, VikWindow *vw ) +{ + GtkWidget *colorsd = gtk_color_selection_dialog_new ( _("Choose a background color") ); + GdkColor *color = vik_viewport_get_background_gdkcolor ( vw->viking_vvp ); + gtk_color_selection_set_previous_color ( GTK_COLOR_SELECTION(gtk_color_selection_dialog_get_color_selection(GTK_COLOR_SELECTION_DIALOG(colorsd))), color ); + gtk_color_selection_set_current_color ( GTK_COLOR_SELECTION(gtk_color_selection_dialog_get_color_selection(GTK_COLOR_SELECTION_DIALOG(colorsd))), color ); + if ( gtk_dialog_run ( GTK_DIALOG(colorsd) ) == GTK_RESPONSE_OK ) + { + gtk_color_selection_get_current_color ( GTK_COLOR_SELECTION(gtk_color_selection_dialog_get_color_selection(GTK_COLOR_SELECTION_DIALOG(colorsd))), color ); + vik_viewport_set_background_gdkcolor ( vw->viking_vvp, color ); + draw_update ( vw ); + } + g_free ( color ); + gtk_widget_destroy ( colorsd ); +} + +static void set_highlight_color ( GtkAction *a, VikWindow *vw ) +{ + GtkWidget *colorsd = gtk_color_selection_dialog_new ( _("Choose a track highlight color") ); + GdkColor *color = vik_viewport_get_highlight_gdkcolor ( vw->viking_vvp ); + gtk_color_selection_set_previous_color ( GTK_COLOR_SELECTION(gtk_color_selection_dialog_get_color_selection(GTK_COLOR_SELECTION_DIALOG(colorsd))), color ); + gtk_color_selection_set_current_color ( GTK_COLOR_SELECTION(gtk_color_selection_dialog_get_color_selection(GTK_COLOR_SELECTION_DIALOG(colorsd))), color ); + if ( gtk_dialog_run ( GTK_DIALOG(colorsd) ) == GTK_RESPONSE_OK ) + { + gtk_color_selection_get_current_color ( GTK_COLOR_SELECTION(gtk_color_selection_dialog_get_color_selection(GTK_COLOR_SELECTION_DIALOG(colorsd))), color ); + vik_viewport_set_highlight_gdkcolor ( vw->viking_vvp, color ); + draw_update ( vw ); + } + g_free ( color ); + gtk_widget_destroy ( colorsd ); +} + +/** + * a_vik_window_get_a_window: + * + * Returns a #VikWindow for cases when the calling code otherwise has no access visibility of what #VikWindow called it. + * This should only be used in special cases e.g. inside a callback that no data can be passed into it. + * Ideally this should also be only used for new dialogs like messages, so the actual #VikWindow is less relevant + * (rather than trying to get a viewport or similar as it won't necessarily be the right one when there is one than one Window). + */ +VikWindow* a_vik_window_get_a_window ( void ) +{ + GSList *item = g_slist_last (window_list); + if ( item ) + return (VikWindow*)item->data; + return NULL; +} + +/*********************************************************************************************** + ** GUI Creation + ***********************************************************************************************/ +typedef struct { + const GdkPixdata *data; + const gchar *name; +} icon_definition_t; + +static void +a_register_icon ( GtkIconFactory *icon_factory, icon_definition_t icon ) +{ + if ( !icon.data ) return; + GtkIconSet *icon_set = gtk_icon_set_new_from_pixbuf (gdk_pixbuf_from_pixdata ( icon.data, FALSE, NULL )); + gtk_icon_factory_add ( icon_factory, icon.name, icon_set ); + gtk_icon_set_unref ( icon_set ); +} + + +static GtkActionEntry entries[] = { + { "File", NULL, N_("_File"), 0, 0, 0 }, + { "Edit", NULL, N_("_Edit"), 0, 0, 0 }, + { "View", NULL, N_("_View"), 0, 0, 0 }, + { "SetShow", NULL, N_("_Show"), 0, 0, 0 }, + { "SetZoom", NULL, N_("_Zoom"), 0, 0, 0 }, + { "SetPan", NULL, N_("_Pan"), 0, 0, 0 }, + { "Layers", NULL, N_("_Layers"), 0, 0, 0 }, + { "Tools", NULL, N_("_Tools"), 0, 0, 0 }, + { "Exttools", NULL, N_("_Webtools"), 0, 0, 0 }, + { "Help", NULL, N_("_Help"), 0, 0, 0 }, + + { "New", GTK_STOCK_NEW, N_("_New"), "N", N_("New file"), (GCallback)newwindow_cb }, + { "Open", GTK_STOCK_OPEN, N_("_Open..."), "O", N_("Open a file"), (GCallback)load_file }, + { "OpenRecentFile", NULL, N_("Open _Recent File"), NULL, NULL, (GCallback)NULL }, + { "Append", GTK_STOCK_ADD, N_("Append _File..."), NULL, N_("Append data from a different file"), (GCallback)load_file }, + { "OpenExtLayer", NULL, N_("Open GPX as External _Layer..."), NULL, N_("Open a GPX file as an external layer"), (GCallback)open_external_layer }, + { "Export", GTK_STOCK_CONVERT, N_("_Export All"), NULL, N_("Export All TrackWaypoint Layers"), (GCallback)NULL }, + { "ExportGPX", NULL, N_("_GPX..."), NULL, N_("Export as GPX"), (GCallback)export_to_gpx }, + { "Acquire", GTK_STOCK_GO_DOWN, N_("A_cquire"), NULL, NULL, (GCallback)NULL }, + { "AcquireRouting", NULL, N_("_Directions..."), NULL, N_("Get driving directions"), (GCallback)acquire_from_routing }, +#ifdef VIK_CONFIG_OPENSTREETMAP + { "AcquireOSM", NULL, N_("_OSM Traces..."), NULL, N_("Get traces from OpenStreetMap"), (GCallback)acquire_from_osm }, + { "AcquireMyOSM", NULL, N_("_My OSM Traces..."), NULL, N_("Get Your Own Traces from OpenStreetMap"), (GCallback)acquire_from_my_osm }, +#endif +#ifdef VIK_CONFIG_GEOCACHES + { "AcquireGC", NULL, N_("Geo_caches..."), NULL, N_("Get Geocaches from geocaching.com"), (GCallback)acquire_from_gc }, +#endif +#ifdef VIK_CONFIG_GEOTAG + { "AcquireGeotag", NULL, N_("From Geotagged _Images..."), NULL, N_("Create waypoints from geotagged images"), (GCallback)acquire_from_geotag }, +#endif + { "AcquireURL", NULL, N_("From _URL..."), NULL, N_("Get a file from a URL"), (GCallback)acquire_from_url }, +#ifdef VIK_CONFIG_GEONAMES + { "AcquireWikipedia", NULL, N_("From _Wikipedia Waypoints"), NULL, N_("Create waypoints from Wikipedia items in the current view"), (GCallback)acquire_from_wikipedia }, +#endif + { "Save", GTK_STOCK_SAVE, N_("_Save"), "S", N_("Save the file"), (GCallback)save_file }, + { "SaveAs", GTK_STOCK_SAVE_AS, N_("Save _As..."), NULL, N_("Save the file under different name"), (GCallback)save_file_as }, + { "FileProperties", NULL, N_("Properties..."), NULL, N_("File Properties"), (GCallback)file_properties_cb }, +#ifdef HAVE_ZIP_H + { "ImportKMZ", GTK_STOCK_CONVERT, N_("Import KMZ _Map File..."), NULL, N_("Import a KMZ file"), (GCallback)import_kmz_file_cb }, + { "GenKMZ", GTK_STOCK_DND, N_("Generate _KMZ Map File..."), NULL, N_("Generate a KMZ file with an overlay of the current view"), (GCallback)draw_to_kmz_file_cb }, +#endif + { "GenImg", GTK_STOCK_FILE, N_("_Generate Image File..."), NULL, N_("Save a snapshot of the workspace into a file"), (GCallback)draw_to_image_file_cb }, + { "GenImgDir", GTK_STOCK_DND_MULTIPLE, N_("Generate _Directory of Images..."), NULL, N_("Generate _Directory of Images"), (GCallback)draw_to_image_dir_cb }, + { "Print", GTK_STOCK_PRINT, N_("_Print..."), NULL, N_("Print maps"), (GCallback)print_cb }, + { "Exit", GTK_STOCK_QUIT, N_("E_xit"), "W", N_("Exit the program"), (GCallback)window_close }, + { "SaveExit", GTK_STOCK_QUIT, N_("Save and Exit"), NULL, N_("Save and Exit the program"), (GCallback)save_file_and_exit }, + + { "GoBack", GTK_STOCK_GO_BACK, N_("Go to the Pre_vious Location"), NULL, N_("Go to the previous location"), (GCallback)draw_goto_back_and_forth }, + { "GoForward", GTK_STOCK_GO_FORWARD, N_("Go to the _Next Location"), NULL, N_("Go to the next location"), (GCallback)draw_goto_back_and_forth }, + { "GotoDefaultLocation", GTK_STOCK_HOME, N_("Go to the _Default Location"), NULL, N_("Go to the default location"), (GCallback)goto_default_location }, + { "GotoAutoLocation", GTK_STOCK_REFRESH, N_("Go to the _Auto Location"), "A", N_("Go to a location via automatic lookup"), (GCallback)goto_auto_location }, + { "GotoSearch", GTK_STOCK_JUMP_TO, N_("Go to _Location..."), "F", N_("Go to address/place using text search"), (GCallback)goto_address }, + { "GotoLL", GTK_STOCK_JUMP_TO, N_("_Go to Lat/Lon..."), NULL, N_("Go to arbitrary lat/lon coordinate"), (GCallback)draw_goto_cb }, + { "GotoUTM", GTK_STOCK_JUMP_TO, N_("Go to UTM..."), NULL, N_("Go to arbitrary UTM coordinate"), (GCallback)draw_goto_cb }, + { "GotoToday", GTK_STOCK_JUMP_TO, N_("Go to Today"), "T", N_("Go to today on the calendar"), (GCallback)calendar_goto_today }, + { "Refresh", GTK_STOCK_REFRESH, N_("_Refresh"), "F5", N_("Refresh any maps displayed"), (GCallback)draw_refresh_cb }, + { "SetHLColor",GTK_STOCK_SELECT_COLOR, N_("Set _Highlight Color..."), NULL, N_("Set Highlight Color"), (GCallback)set_highlight_color }, + { "SetBGColor",GTK_STOCK_SELECT_COLOR, N_("Set Bac_kground Color..."), NULL, N_("Set Background Color"), (GCallback)set_bg_color }, + { "ZoomIn", GTK_STOCK_ZOOM_IN, N_("Zoom _In"), "plus", N_("Zoom In"), (GCallback)draw_zoom_cb }, + { "ZoomOut", GTK_STOCK_ZOOM_OUT, N_("Zoom _Out"), "minus", N_("Zoom Out"), (GCallback)draw_zoom_cb }, + { "ZoomTo", GTK_STOCK_ZOOM_FIT, N_("Zoom _To..."), "Z", N_("Zoom To"), (GCallback)zoom_to_cb }, + { "PanNorth", GTK_STOCK_GO_UP, N_("Pan _North"), "Up", NULL, (GCallback)draw_pan_cb }, + { "PanEast", GTK_STOCK_GO_BACK, N_("Pan _East"), "Right", NULL, (GCallback)draw_pan_cb }, + { "PanSouth", GTK_STOCK_GO_DOWN, N_("Pan _South"), "Down", NULL, (GCallback)draw_pan_cb }, + { "PanWest", GTK_STOCK_GO_FORWARD, N_("Pan _West"), "Left", NULL, (GCallback)draw_pan_cb }, + { "BGJobs", GTK_STOCK_EXECUTE, N_("Background _Jobs"), NULL, N_("Background Jobs"), (GCallback)a_background_show_window }, + + { "Cut", GTK_STOCK_CUT, N_("Cu_t"), NULL, N_("Cut selected layer"), (GCallback)menu_cut_layer_cb }, + { "Copy", GTK_STOCK_COPY, N_("_Copy"), NULL, N_("Copy selected layer"), (GCallback)menu_copy_layer_cb }, + { "Paste", GTK_STOCK_PASTE, N_("_Paste"), NULL, N_("Paste layer into selected container layer or otherwise above selected layer"), (GCallback)menu_paste_layer_cb }, + { "Delete", GTK_STOCK_DELETE, N_("_Delete"), "Delete",N_("Remove selected layer"), (GCallback)menu_delete_layer_cb }, + { "DeleteAll", NULL, N_("Delete All"), NULL, NULL, (GCallback)clear_cb }, + { "CopyCentre",NULL, N_("Copy Centre _Location"), "h", NULL, (GCallback)menu_copy_centre_cb }, + { "MapCacheFlush",NULL, N_("_Flush Map Cache"), NULL, NULL, (GCallback)mapcache_flush_cb }, + { "SetDefaultLocation", GTK_STOCK_GO_FORWARD, N_("_Set the Default Location"), NULL, N_("Set the Default Location to the current position"),(GCallback)default_location_cb }, + { "Preferences",GTK_STOCK_PREFERENCES, N_("_Preferences"), NULL, N_("Program Preferences"), (GCallback)preferences_cb }, + { "LayerDefaults",GTK_STOCK_PROPERTIES, N_("_Layer Defaults"), NULL, NULL, NULL }, + { "Properties",GTK_STOCK_PROPERTIES, N_("_Properties"), NULL, N_("Layer Properties"), (GCallback)menu_properties_cb }, + + { "HelpEntry", GTK_STOCK_HELP, N_("_Help"), "F1", N_("Help"), (GCallback)help_help_cb }, + { "About", GTK_STOCK_ABOUT, N_("_About"), NULL, N_("About"), (GCallback)help_about_cb }, +}; + +static GtkActionEntry debug_entries[] = { + { "MapCacheInfo", NULL, "_Map Cache Info", NULL, NULL, (GCallback)help_cache_info_cb }, + { "BackForwardInfo", NULL, "_Back/Forward Info", NULL, NULL, (GCallback)back_forward_info_cb }, +}; + +static GtkActionEntry entries_gpsbabel[] = { + { "ExportKML", NULL, N_("_KML..."), NULL, N_("Export as KML"), (GCallback)export_to_kml }, + { "AcquireGPS", NULL, N_("From _GPS..."), NULL, N_("Transfer data from a GPS device"), (GCallback)acquire_from_gps }, + { "AcquireGPSBabel", NULL, N_("Import File With GPS_Babel..."), NULL, N_("Import file via GPSBabel converter"), (GCallback)acquire_from_file }, +}; + +static GtkActionEntry entries_geojson[] = { + { "AcquireGeoJSON", NULL, N_("Import Geo_JSON File..."), NULL, N_("Import GeoJSON file"), (GCallback)acquire_from_geojson }, +}; + +/* Radio items */ +static GtkRadioActionEntry mode_entries[] = { + { "ModeUTM", NULL, N_("_UTM Mode"), "u", NULL, VIK_VIEWPORT_DRAWMODE_UTM }, + { "ModeExpedia", NULL, N_("_Expedia Mode"), "e", NULL, VIK_VIEWPORT_DRAWMODE_EXPEDIA }, + { "ModeMercator", NULL, N_("_Mercator Mode"), "m", NULL, VIK_VIEWPORT_DRAWMODE_MERCATOR }, + { "ModeLatLon", NULL, N_("Lat_/Lon Mode"), "l", NULL, VIK_VIEWPORT_DRAWMODE_LATLON }, +}; + +static GtkToggleActionEntry toggle_entries[] = { + { "ShowScale", NULL, N_("Show _Scale"), "F5", N_("Show Scale"), (GCallback)toggle_draw_scale, TRUE }, + { "ShowCenterMark", GTK_STOCK_ADD, N_("Show _Center Mark"), "F6", N_("Show Center Mark"), (GCallback)toggle_draw_centermark, TRUE }, + { "ShowHighlight", GTK_STOCK_UNDERLINE, N_("Show _Highlight"), "F7", N_("Show Highlight"), (GCallback)toggle_draw_highlight, TRUE }, + { "FullScreen", GTK_STOCK_FULLSCREEN, N_("_Full Screen"), "F11", N_("Activate full screen mode"), (GCallback)full_screen_cb, FALSE }, + { "ViewSidePanel", GTK_STOCK_INDEX, N_("Show Side _Panel"), "F9", N_("Show Side Panel"), (GCallback)view_side_panel_cb, TRUE }, + { "ViewStatusBar", NULL, N_("Show Status_bar"), "F12", N_("Show Statusbar"), (GCallback)view_statusbar_cb, TRUE }, + { "ViewToolbar", NULL, N_("Show _Toolbar"), "F3", N_("Show Toolbar"), (GCallback)view_toolbar_cb, TRUE }, + { "ViewMainMenu", NULL, N_("Show _Menu"), "F4", N_("Show Menu"), (GCallback)view_main_menu_cb, TRUE }, + { "ViewSidePanelButtons", NULL, N_("Show Side Panel B_uttons"), "F9", N_("Show Side Panel Buttons"), (GCallback)view_side_panel_buttons_cb, TRUE }, + { "ViewSidePanelCalendar", NULL, N_("Show Side Panel Ca_lendar"), "F8", N_("Show Side Panel Calendar"), (GCallback)view_side_panel_calendar_cb, TRUE }, +}; + +// This must match the toggle entries order above +static gpointer toggle_entries_toolbar_cb[] = { + (GCallback)tb_set_draw_scale, + (GCallback)tb_set_draw_centermark, + (GCallback)tb_set_draw_highlight, + (GCallback)tb_full_screen_cb, + (GCallback)tb_view_side_panel_cb, + (GCallback)tb_view_statusbar_cb, + (GCallback)tb_view_toolbar_cb, + (GCallback)tb_view_main_menu_cb, + (GCallback)tb_view_side_panel_buttons_cb, + (GCallback)tb_view_side_panel_calendar_cb, +}; + +#include "menu.xml.h" +static void window_create_ui( VikWindow *window ) +{ + GtkUIManager *uim; + GtkActionGroup *action_group; + GtkAccelGroup *accel_group; + GError *error; + guint i, j, mid; + GtkIconFactory *icon_factory; + GtkRadioActionEntry *tools = NULL, *radio; + guint ntools; + + uim = gtk_ui_manager_new (); + window->uim = uim; + + toolbox_add_tool(window->vt, &ruler_tool, TOOL_LAYER_TYPE_NONE); + toolbox_add_tool(window->vt, &zoom_tool, TOOL_LAYER_TYPE_NONE); + toolbox_add_tool(window->vt, &pan_tool, TOOL_LAYER_TYPE_NONE); + toolbox_add_tool(window->vt, &select_tool, TOOL_LAYER_TYPE_NONE); + + toolbar_action_tool_entry_register ( window->viking_vtb, &pan_tool.radioActionEntry ); + toolbar_action_tool_entry_register ( window->viking_vtb, &zoom_tool.radioActionEntry ); + toolbar_action_tool_entry_register ( window->viking_vtb, &ruler_tool.radioActionEntry ); + toolbar_action_tool_entry_register ( window->viking_vtb, &select_tool.radioActionEntry ); + + error = NULL; + if (!(mid = gtk_ui_manager_add_ui_from_string (uim, menu_xml, -1, &error))) { + g_error_free (error); + exit (1); + } + + action_group = gtk_action_group_new ("MenuActions"); + gtk_action_group_set_translation_domain(action_group, PACKAGE_NAME); + gtk_action_group_add_actions (action_group, entries, G_N_ELEMENTS (entries), window); + gtk_action_group_add_toggle_actions (action_group, toggle_entries, G_N_ELEMENTS (toggle_entries), window); + gtk_action_group_add_radio_actions (action_group, mode_entries, G_N_ELEMENTS (mode_entries), 4, (GCallback)window_change_coord_mode_cb, window); + if ( vik_debug ) { + if ( gtk_ui_manager_add_ui_from_string ( uim, + "" + "" + "" + "", + -1, NULL ) ) { + gtk_action_group_add_actions (action_group, debug_entries, G_N_ELEMENTS (debug_entries), window); + } + } + + for ( i=0; i < G_N_ELEMENTS (entries); i++ ) { + if ( entries[i].callback ) + toolbar_action_entry_register ( window->viking_vtb, &entries[i] ); + } + + if ( G_N_ELEMENTS (toggle_entries) != G_N_ELEMENTS (toggle_entries_toolbar_cb) ) { + g_print ( "Broken entries definitions\n" ); + exit (1); + } + for ( i=0; i < G_N_ELEMENTS (toggle_entries); i++ ) { + if ( toggle_entries_toolbar_cb[i] ) + toolbar_action_toggle_entry_register ( window->viking_vtb, &toggle_entries[i], toggle_entries_toolbar_cb[i] ); + } + + for ( i=0; i < G_N_ELEMENTS (mode_entries); i++ ) { + toolbar_action_mode_entry_register ( window->viking_vtb, &mode_entries[i] ); + } + + // Use this to see if GPSBabel is available: + if ( a_babel_available () ) { + // If going to add more entries then might be worth creating a menu_gpsbabel.xml.h file + if ( gtk_ui_manager_add_ui_from_string ( uim, + "" \ + "" \ + "" \ + "" \ + "" \ + "" \ + "", + -1, &error ) ) + gtk_action_group_add_actions ( action_group, entries_gpsbabel, G_N_ELEMENTS (entries_gpsbabel), window ); + } + + // GeoJSON import capability + if ( g_find_program_in_path ( a_geojson_program_import() ) ) { + if ( gtk_ui_manager_add_ui_from_string ( uim, + "", + -1, &error ) ) + gtk_action_group_add_actions ( action_group, entries_geojson, G_N_ELEMENTS (entries_geojson), window ); + } + + icon_factory = gtk_icon_factory_new (); + gtk_icon_factory_add_default (icon_factory); + + register_vik_icons(icon_factory); + + // Copy the tool RadioActionEntries out of the main Window structure into an extending array 'tools' + // so that it can be applied to the UI in one action group add function call below + ntools = 0; + for (i=0; ivt->n_tools; i++) { + tools = g_renew(GtkRadioActionEntry, tools, ntools+1); + radio = &tools[ntools]; + ntools++; + *radio = window->vt->tools[i].ti.radioActionEntry; + radio->value = ntools; + } + + for (i=0; ifixed_layer_name, + vik_layer_get_interface(i)->fixed_layer_name, + GTK_UI_MANAGER_MENUITEM, FALSE); + + icon_definition_t icon = { vik_layer_get_interface(i)->icon, + vik_layer_get_interface(i)->fixed_layer_name }; + a_register_icon ( icon_factory, icon ); + + action.name = vik_layer_get_interface(i)->fixed_layer_name; + action.stock_id = vik_layer_get_interface(i)->fixed_layer_name; + action.label = g_strdup_printf( _("New _%s Layer"), _(vik_layer_get_interface(i)->name)); + action.accelerator = vik_layer_get_interface(i)->accelerator; + action.tooltip = NULL; + action.callback = (GCallback)menu_addlayer_cb; + gtk_action_group_add_actions(action_group, &action, 1, window); + + g_free ( (gchar*)action.label ); + + if ( vik_layer_get_interface(i)->tools_count ) { + gtk_ui_manager_add_ui ( uim, mid, "/ui/MainMenu/Tools/", + vik_layer_get_interface(i)->fixed_layer_name, + vik_layer_get_interface(i)->fixed_layer_name, + GTK_UI_MANAGER_SEPARATOR, FALSE ); + } + + // Further tool copying for to apply to the UI, also apply menu UI setup + for ( j = 0; j < vik_layer_get_interface(i)->tools_count; j++ ) { + tools = g_renew(GtkRadioActionEntry, tools, ntools+1); + radio = &tools[ntools]; + ntools++; + + icon_definition_t icon = { vik_layer_get_interface(i)->tools[j].icon, + vik_layer_get_interface(i)->tools[j].radioActionEntry.stock_id }; + a_register_icon ( icon_factory, icon ); + + gtk_ui_manager_add_ui(uim, mid, "/ui/MainMenu/Tools", + vik_layer_get_interface(i)->tools[j].radioActionEntry.label, + vik_layer_get_interface(i)->tools[j].radioActionEntry.name, + GTK_UI_MANAGER_MENUITEM, FALSE); + + toolbox_add_tool(window->vt, &(vik_layer_get_interface(i)->tools[j]), i); + toolbar_action_tool_entry_register ( window->viking_vtb, &(vik_layer_get_interface(i)->tools[j].radioActionEntry) ); + + *radio = vik_layer_get_interface(i)->tools[j].radioActionEntry; + // Overwrite with actual number to use + radio->value = ntools; + } + + GtkActionEntry action_dl; + gchar *layername = g_strdup_printf ( "Layer%s", vik_layer_get_interface(i)->fixed_layer_name ); + gtk_ui_manager_add_ui(uim, mid, "/ui/MainMenu/Edit/LayerDefaults", + vik_layer_get_interface(i)->fixed_layer_name, + layername, + GTK_UI_MANAGER_MENUITEM, FALSE); + g_free (layername); + + // For default layers use action names of the form 'Layer' + // This is to avoid clashing with just the layer name used above for the tool actions + action_dl.name = g_strconcat("Layer", vik_layer_get_interface(i)->fixed_layer_name, NULL); + action_dl.stock_id = vik_layer_get_interface(i)->fixed_layer_name; + action_dl.label = g_strconcat(_(vik_layer_get_interface(i)->name), _("..."), NULL); + action_dl.accelerator = NULL; + action_dl.tooltip = NULL; + action_dl.callback = (GCallback)layer_defaults_cb; + gtk_action_group_add_actions(action_group, &action_dl, 1, window); + g_free ( (gchar*)action_dl.name ); + g_free ( (gchar*)action_dl.label ); + } + g_object_unref (icon_factory); + + gtk_action_group_add_radio_actions(action_group, tools, ntools, 0, (GCallback)menu_cb, window); + g_free(tools); + + gtk_ui_manager_insert_action_group (uim, action_group, 0); + + for (i=0; itools_count; j++ ) { + GtkAction *action = gtk_action_group_get_action(action_group, + vik_layer_get_interface(i)->tools[j].radioActionEntry.name); + g_object_set(action, "sensitive", FALSE, NULL); + } + } + + // This is done last so we don't need to track the value of mid anymore + vik_ext_tools_add_action_items ( window, window->uim, action_group, mid ); + + window->action_group = action_group; + + accel_group = gtk_ui_manager_get_accel_group (uim); + gtk_window_add_accel_group (GTK_WINDOW (window), accel_group); + gtk_ui_manager_ensure_update (uim); + + setup_recent_files(window); + + if ( vik_routing_number_of_engines(VIK_ROUTING_METHOD_DIRECTIONS) == 0 ) { + GtkWidget *widget = gtk_ui_manager_get_widget ( uim, "/ui/MainMenu/File/Acquire/AcquireRouting" ); + if ( widget ) { + g_object_set ( widget, "sensitive", FALSE, NULL ); + } + g_warning ( "No direction routing engines available" ); + } +} + +static icon_definition_t vik_icons[] = { + // Vikwindow specific icons: + { &mover_22_pixbuf, "vik-icon-pan" }, + { &zoom_18_pixbuf, "vik-icon-zoom" }, + { &ruler_18_pixbuf, "vik-icon-ruler" }, + { &select_18_pixbuf, "vik-icon-select" }, + // Generic icons for use anywhere: + { &showpic_18_pixbuf, VIK_ICON_SHOW_PICTURE }, +}; + +static void +register_vik_icons ( GtkIconFactory *icon_factory ) +{ + for (guint i = 0; i < G_N_ELEMENTS(vik_icons); i++) { + a_register_icon ( icon_factory, vik_icons[i] ); + } +} + +gpointer vik_window_get_selected_trw_layer ( VikWindow *vw ) +{ + return vw->selected_vtl; +} + +void vik_window_set_selected_trw_layer ( VikWindow *vw, gpointer vtl ) +{ + vw->selected_vtl = vtl; + vw->containing_vtl = vtl; + /* Clear others */ + vw->selected_track = NULL; + vw->selected_tracks = NULL; + vw->selected_waypoint = NULL; + vw->selected_waypoints = NULL; + // Set highlight thickness + vik_viewport_set_highlight_thickness ( vw->viking_vvp, vik_trw_layer_get_property_tracks_line_thickness (vw->containing_vtl) ); +} + +GHashTable *vik_window_get_selected_tracks ( VikWindow *vw ) +{ + return vw->selected_tracks; +} + +void vik_window_set_selected_tracks ( VikWindow *vw, GHashTable *ght, gpointer vtl ) +{ + vw->selected_tracks = ght; + vw->containing_vtl = vtl; + /* Clear others */ + vw->selected_vtl = NULL; + vw->selected_track = NULL; + vw->selected_waypoint = NULL; + vw->selected_waypoints = NULL; + // Set highlight thickness + vik_viewport_set_highlight_thickness ( vw->viking_vvp, vik_trw_layer_get_property_tracks_line_thickness (vw->containing_vtl) ); +} + +gpointer vik_window_get_selected_track ( VikWindow *vw ) +{ + return vw->selected_track; +} + +void vik_window_set_selected_track ( VikWindow *vw, gpointer *vt, gpointer vtl ) +{ + vw->selected_track = vt; + vw->containing_vtl = vtl; + /* Clear others */ + vw->selected_vtl = NULL; + vw->selected_tracks = NULL; + vw->selected_waypoint = NULL; + vw->selected_waypoints = NULL; + // Set highlight thickness + vik_viewport_set_highlight_thickness ( vw->viking_vvp, vik_trw_layer_get_property_tracks_line_thickness (vw->containing_vtl) ); +} + +GHashTable *vik_window_get_selected_waypoints ( VikWindow *vw ) +{ + return vw->selected_waypoints; +} + +void vik_window_set_selected_waypoints ( VikWindow *vw, GHashTable *ght, gpointer vtl ) +{ + vw->selected_waypoints = ght; + vw->containing_vtl = vtl; + /* Clear others */ + vw->selected_vtl = NULL; + vw->selected_track = NULL; + vw->selected_tracks = NULL; + vw->selected_waypoint = NULL; +} + +gpointer vik_window_get_selected_waypoint ( VikWindow *vw ) +{ + return vw->selected_waypoint; +} + +void vik_window_set_selected_waypoint ( VikWindow *vw, gpointer *vwp, gpointer vtl ) +{ + vw->selected_waypoint = vwp; + vw->containing_vtl = vtl; + /* Clear others */ + vw->selected_vtl = NULL; + vw->selected_track = NULL; + vw->selected_tracks = NULL; + vw->selected_waypoints = NULL; +} + +gboolean vik_window_clear_highlight ( VikWindow *vw ) +{ + gboolean need_redraw = FALSE; + vw->containing_vtl = NULL; + if ( vw->selected_vtl != NULL ) { + vw->selected_vtl = NULL; + need_redraw = TRUE; + } + if ( vw->selected_track != NULL ) { + vw->selected_track = NULL; + need_redraw = TRUE; + } + if ( vw->selected_tracks != NULL ) { + vw->selected_tracks = NULL; + need_redraw = TRUE; + } + if ( vw->selected_waypoint != NULL ) { + vw->selected_waypoint = NULL; + need_redraw = TRUE; + } + if ( vw->selected_waypoints != NULL ) { + vw->selected_waypoints = NULL; + need_redraw = TRUE; + } + return need_redraw; +} + +/** + * May return NULL if the window no longer exists + */ +GThread *vik_window_get_thread ( VikWindow *vw ) +{ + if ( vw ) + return vw->thread; + return NULL; +} diff --git a/src/vikwindow.h b/src/vikwindow.h new file mode 100644 index 0000000..25207e8 --- /dev/null +++ b/src/vikwindow.h @@ -0,0 +1,113 @@ +/* + * viking -- GPS Data and Topo Analyzer, Explorer, and Manager + * + * Copyright (C) 2003-2005, Evan Battaglia + * + * 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., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA + * + */ + +#ifndef _VIKING_VIKWINDOW_H +#define _VIKING_VIKWINDOW_H +/* Requires or glib, and coords.h*/ + +#include +#include +#include + +#include "vikviewport.h" +#include "vikstatus.h" + +G_BEGIN_DECLS + +#define VIK_WINDOW_TYPE (vik_window_get_type ()) +#define VIK_WINDOW(obj) (G_TYPE_CHECK_INSTANCE_CAST ((obj), VIK_WINDOW_TYPE, VikWindow)) +#define VIK_WINDOW_CLASS(klass) (G_TYPE_CHECK_CLASS_CAST ((klass), VIK_WINDOW_TYPE, VikWindowClass)) +#define IS_VIK_WINDOW(obj) (G_TYPE_CHECK_INSTANCE_TYPE ((obj), VIK_WINDOW_TYPE)) +#define IS_VIK_WINDOW_CLASS(klass) (G_TYPE_CHECK_CLASS_TYPE ((klass), VIK_WINDOW_TYPE)) + +typedef struct _VikWindow VikWindow; +typedef struct _VikWindowClass VikWindowClass; + +struct _VikWindowClass +{ + GtkWindowClass window_class; + void (* newwindow) (VikWindow *vw); + void (* openwindow) (VikWindow *vw, GSList *filenames); +}; + +GType vik_window_get_type (); + +// To call from main to start things off: +VikWindow *vik_window_new_window (); + +void vik_window_new_window_finish ( VikWindow *vw ); + +GtkWidget *vik_window_get_drawmode_button ( VikWindow *vw, VikViewportDrawMode mode ); +gboolean vik_window_get_pan_move ( VikWindow *vw ); +void vik_window_open_file ( VikWindow *vw, const gchar *filename, gboolean change_filename, gboolean first, gboolean last, gboolean new_layer ); +struct _VikLayer; +void vik_window_selected_layer(VikWindow *vw, struct _VikLayer *vl); +struct _VikViewport * vik_window_viewport(VikWindow *vw); +struct _VikLayersPanel * vik_window_layers_panel(VikWindow *vw); +struct _VikStatusbar * vik_window_get_statusbar(VikWindow *vw); +const gchar *vik_window_get_filename(VikWindow *vw); + +void vik_window_statusbar_update (VikWindow *vw, const gchar* message, vik_statusbar_type_t vs_type); + +void vik_window_set_redraw_trigger(struct _VikLayer *vl); + +void vik_window_enable_layer_tool ( VikWindow *vw, gint layer_id, gint tool_id ); + +gpointer vik_window_get_selected_trw_layer ( VikWindow *vw ); /* return type VikTrwLayer */ +void vik_window_set_selected_trw_layer ( VikWindow *vw, gpointer vtl ); /* input VikTrwLayer */ +GHashTable *vik_window_get_selected_tracks ( VikWindow *vw ); +void vik_window_set_selected_tracks ( VikWindow *vw, GHashTable *ght, gpointer vtl ); /* gpointer is a VikTrwLayer */ +gpointer vik_window_get_selected_track ( VikWindow *vw ); /* return type VikTrack */ +void vik_window_set_selected_track ( VikWindow *vw, gpointer *vt, gpointer vtl ); /* gpointer is a VikTrwLayer */ +GHashTable *vik_window_get_selected_waypoints ( VikWindow *vw ); +void vik_window_set_selected_waypoints ( VikWindow *vw, GHashTable *ght, gpointer vtl ); /* gpointer is a VikTrwLayer */ +gpointer vik_window_get_selected_waypoint ( VikWindow *vw ); /* return type VikWaypoint */ +void vik_window_set_selected_waypoint ( VikWindow *vw, gpointer *vwp, gpointer vtl ); /* input VikWaypoint, VikTrwLayer */ +/* Return the VikTrwLayer of the selected track(s) or waypoint(s) are in (maybe NULL) */ +gpointer vik_window_get_containing_trw_layer ( VikWindow *vw ); +/* return indicates if a redraw is necessary */ +gboolean vik_window_clear_highlight ( VikWindow *vw ); + +GThread *vik_window_get_thread ( VikWindow *vw ); + +void vik_window_set_busy_cursor ( VikWindow *vw ); +void vik_window_clear_busy_cursor ( VikWindow *vw ); +void vik_window_set_busy_cursor_widget ( GtkWidget *widget, VikWindow *vw ); +void vik_window_clear_busy_cursor_widget ( GtkWidget *widget, VikWindow *vw ); + +typedef struct { + VikWindow *vw; + VikViewport *vvp; + gpointer vtl; // VikTrwlayer + gboolean holding; + gboolean moving; + gboolean is_waypoint; // otherwise a track + GdkGC *gc; + int oldx, oldy; +} tool_ed_t; + +VikWindow *a_vik_window_get_a_window (); + +G_END_DECLS + +#define VIK_WINDOW_FROM_WIDGET(x) VIK_WINDOW(gtk_widget_get_toplevel(GTK_WIDGET(x))) + +#endif diff --git a/src/vikwmscmapsource.c b/src/vikwmscmapsource.c new file mode 100644 index 0000000..e14f01e --- /dev/null +++ b/src/vikwmscmapsource.c @@ -0,0 +1,582 @@ +/* -*- Mode: C; indent-tabs-mode: t; c-basic-offset: 4; tab-width: 4 -*- */ +/* + * viking + * Copyright (C) 2010, Guilhem Bonnefille + * + * viking 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. + * + * viking 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, see . + */ + + /** + * SECTION:vikwmscmapsource + * @short_description: the class for WMS/WMS-C oriented map sources + * + * The #VikWmscMapSource class handles WMS/WMS-C oriented map sources. + * + * http://wiki.osgeo.org/wiki/WMS_Tile_Caching + */ + +#ifdef HAVE_CONFIG_H +#include "config.h" +#endif + +#ifdef HAVE_MATH_H +#include +#endif + +#include "globals.h" +#include "vikwmscmapsource.h" +#include "maputils.h" + +static gboolean _coord_to_mapcoord ( VikMapSource *self, const VikCoord *src, gdouble xzoom, gdouble yzoom, MapCoord *dest ); +static void _mapcoord_to_center_coord ( VikMapSource *self, MapCoord *src, VikCoord *dest ); +static gboolean _supports_download_only_new ( VikMapSource *self ); +static gboolean _is_direct_file_access ( VikMapSource *self ); +static gboolean _is_mbtiles ( VikMapSource *self ); +static gboolean _is_osm_meta_tiles (VikMapSource *self ); +static guint8 _get_zoom_min(VikMapSource *self ); +static guint8 _get_zoom_max(VikMapSource *self ); +static gdouble _get_lat_min(VikMapSource *self ); +static gdouble _get_lat_max(VikMapSource *self ); +static gdouble _get_lon_min(VikMapSource *self ); +static gdouble _get_lon_max(VikMapSource *self ); + +static gchar *_get_uri( VikMapSourceDefault *self, MapCoord *src ); +static gchar *_get_hostname( VikMapSourceDefault *self ); +static DownloadFileOptions *_get_download_options( VikMapSourceDefault *self ); + +typedef struct _VikWmscMapSourcePrivate VikWmscMapSourcePrivate; +struct _VikWmscMapSourcePrivate +{ + gchar *hostname; + gchar *url; + DownloadFileOptions options; + guint zoom_min; // TMS Zoom level: 0 = Whole World // http://wiki.openstreetmap.org/wiki/Slippy_map_tilenames + guint zoom_max; // TMS Zoom level: Often 18 for zoomed in. + gdouble lat_min; // Degrees + gdouble lat_max; // Degrees + gdouble lon_min; // Degrees + gdouble lon_max; // Degrees +}; + +#define VIK_WMSC_MAP_SOURCE_PRIVATE(o) (G_TYPE_INSTANCE_GET_PRIVATE ((o), VIK_TYPE_WMSC_MAP_SOURCE, VikWmscMapSourcePrivate)) + +/* properties */ +enum +{ + PROP_0, + + PROP_HOSTNAME, + PROP_URL, + PROP_REFERER, + PROP_FOLLOW_LOCATION, + PROP_CHECK_FILE_SERVER_TIME, + PROP_ZOOM_MIN, + PROP_ZOOM_MAX, + PROP_LAT_MIN, + PROP_LAT_MAX, + PROP_LON_MIN, + PROP_LON_MAX, +}; + +G_DEFINE_TYPE (VikWmscMapSource, vik_wmsc_map_source, VIK_TYPE_MAP_SOURCE_DEFAULT); + +static void +vik_wmsc_map_source_init (VikWmscMapSource *self) +{ + /* initialize the object here */ + VikWmscMapSourcePrivate *priv = VIK_WMSC_MAP_SOURCE_PRIVATE (self); + + priv->hostname = NULL; + priv->url = NULL; + priv->options.referer = NULL; + priv->options.follow_location = 0; + priv->options.check_file = a_check_map_file; + priv->options.check_file_server_time = FALSE; + priv->zoom_min = 0; + priv->zoom_max = 18; + priv->lat_min = -90.0; + priv->lat_max = 90.0; + priv->lon_min = -180.0; + priv->lon_max = 180.0; + + g_object_set (G_OBJECT (self), + "tilesize-x", 256, + "tilesize-y", 256, + "drawmode", VIK_VIEWPORT_DRAWMODE_LATLON, + NULL); +} + +static void +vik_wmsc_map_source_finalize (GObject *object) +{ + VikWmscMapSource *self = VIK_WMSC_MAP_SOURCE (object); + VikWmscMapSourcePrivate *priv = VIK_WMSC_MAP_SOURCE_PRIVATE (self); + + g_free (priv->hostname); + priv->hostname = NULL; + g_free (priv->url); + priv->url = NULL; + g_free (priv->options.referer); + priv->options.referer = NULL; + + G_OBJECT_CLASS (vik_wmsc_map_source_parent_class)->finalize (object); +} + +static void +vik_wmsc_map_source_set_property (GObject *object, + guint property_id, + const GValue *value, + GParamSpec *pspec) +{ + VikWmscMapSource *self = VIK_WMSC_MAP_SOURCE (object); + VikWmscMapSourcePrivate *priv = VIK_WMSC_MAP_SOURCE_PRIVATE (self); + + switch (property_id) + { + case PROP_HOSTNAME: + g_free (priv->hostname); + priv->hostname = g_value_dup_string (value); + break; + + case PROP_URL: + g_free (priv->url); + priv->url = g_value_dup_string (value); + break; + + case PROP_REFERER: + g_free (priv->options.referer); + priv->options.referer = g_value_dup_string (value); + break; + + case PROP_FOLLOW_LOCATION: + priv->options.follow_location = g_value_get_long (value); + break; + + case PROP_CHECK_FILE_SERVER_TIME: + priv->options.check_file_server_time = g_value_get_boolean (value); + break; + + case PROP_ZOOM_MIN: + priv->zoom_min = g_value_get_uint (value); + break; + + case PROP_ZOOM_MAX: + priv->zoom_max = g_value_get_uint (value); + break; + + case PROP_LAT_MIN: + priv->lat_min = g_value_get_double (value); + break; + + case PROP_LAT_MAX: + priv->lat_max = g_value_get_double (value); + break; + + case PROP_LON_MIN: + priv->lon_min = g_value_get_double (value); + break; + + case PROP_LON_MAX: + priv->lon_max = g_value_get_double (value); + break; + + default: + /* We don't have any other property... */ + G_OBJECT_WARN_INVALID_PROPERTY_ID (object, property_id, pspec); + break; + } +} + +static void +vik_wmsc_map_source_get_property (GObject *object, + guint property_id, + GValue *value, + GParamSpec *pspec) +{ + VikWmscMapSource *self = VIK_WMSC_MAP_SOURCE (object); + VikWmscMapSourcePrivate *priv = VIK_WMSC_MAP_SOURCE_PRIVATE (self); + + switch (property_id) + { + case PROP_HOSTNAME: + g_value_set_string (value, priv->hostname); + break; + + case PROP_URL: + g_value_set_string (value, priv->url); + break; + + case PROP_REFERER: + g_value_set_string (value, priv->options.referer); + break; + + case PROP_FOLLOW_LOCATION: + g_value_set_long (value, priv->options.follow_location); + break; + + case PROP_CHECK_FILE_SERVER_TIME: + g_value_set_boolean (value, priv->options.check_file_server_time); + break; + + case PROP_ZOOM_MIN: + g_value_set_uint (value, priv->zoom_min); + break; + + case PROP_ZOOM_MAX: + g_value_set_uint (value, priv->zoom_max); + break; + + case PROP_LON_MIN: + g_value_set_double (value, priv->lon_min); + break; + + case PROP_LON_MAX: + g_value_set_double (value, priv->lon_max); + break; + + case PROP_LAT_MIN: + g_value_set_double (value, priv->lat_min); + break; + + case PROP_LAT_MAX: + g_value_set_double (value, priv->lat_max); + break; + + default: + /* We don't have any other property... */ + G_OBJECT_WARN_INVALID_PROPERTY_ID (object, property_id, pspec); + break; + } +} + +static void +vik_wmsc_map_source_class_init (VikWmscMapSourceClass *klass) +{ + GObjectClass* object_class = G_OBJECT_CLASS (klass); + VikMapSourceClass* grandparent_class = VIK_MAP_SOURCE_CLASS (klass); + VikMapSourceDefaultClass* parent_class = VIK_MAP_SOURCE_DEFAULT_CLASS (klass); + GParamSpec *pspec = NULL; + + object_class->set_property = vik_wmsc_map_source_set_property; + object_class->get_property = vik_wmsc_map_source_get_property; + + /* Overiding methods */ + grandparent_class->coord_to_mapcoord = _coord_to_mapcoord; + grandparent_class->mapcoord_to_center_coord = _mapcoord_to_center_coord; + grandparent_class->supports_download_only_new = _supports_download_only_new; + grandparent_class->is_direct_file_access = _is_direct_file_access; + grandparent_class->is_mbtiles = _is_mbtiles; + grandparent_class->is_osm_meta_tiles = _is_osm_meta_tiles; + grandparent_class->get_zoom_min = _get_zoom_min; + grandparent_class->get_zoom_max = _get_zoom_max; + grandparent_class->get_lat_min = _get_lat_min; + grandparent_class->get_lat_max = _get_lat_max; + grandparent_class->get_lon_min = _get_lon_min; + grandparent_class->get_lon_max = _get_lon_max; + + parent_class->get_uri = _get_uri; + parent_class->get_hostname = _get_hostname; + parent_class->get_download_options = _get_download_options; + + pspec = g_param_spec_string ("hostname", + "Hostname", + "The hostname of the map server", + "" /* default value */, + G_PARAM_CONSTRUCT_ONLY | G_PARAM_READWRITE); + g_object_class_install_property (object_class, PROP_HOSTNAME, pspec); + + pspec = g_param_spec_string ("url", + "URL", + "The template of the tiles' URL", + "" /* default value */, + G_PARAM_CONSTRUCT_ONLY | G_PARAM_READWRITE); + g_object_class_install_property (object_class, PROP_URL, pspec); + + pspec = g_param_spec_string ("referer", + "Referer", + "The REFERER string to use in HTTP request", + NULL /* default value */, + G_PARAM_CONSTRUCT_ONLY | G_PARAM_READWRITE); + g_object_class_install_property (object_class, PROP_REFERER, pspec); + + pspec = g_param_spec_long ("follow-location", + "Follow location", + "Specifies the number of retries to follow a redirect while downloading a page", + 0 /* minimum value */, + G_MAXLONG /* maximum value */, + 0 /* default value */, + G_PARAM_CONSTRUCT_ONLY | G_PARAM_READWRITE); + g_object_class_install_property (object_class, PROP_FOLLOW_LOCATION, pspec); + + pspec = g_param_spec_boolean ("check-file-server-time", + "Check file server time", + "Age of current cache before redownloading tile", + FALSE /* default value */, + G_PARAM_CONSTRUCT_ONLY | G_PARAM_READWRITE); + g_object_class_install_property (object_class, PROP_CHECK_FILE_SERVER_TIME, pspec); + + pspec = g_param_spec_uint ("zoom-min", + "Minimum zoom", + "Minimum Zoom level supported by the map provider", + 0, // minimum value, + 22, // maximum value + 0, // default value + G_PARAM_CONSTRUCT_ONLY | G_PARAM_READWRITE); + g_object_class_install_property (object_class, PROP_ZOOM_MIN, pspec); + + pspec = g_param_spec_uint ("zoom-max", + "Maximum zoom", + "Maximum Zoom level supported by the map provider", + 0, // minimum value, + 22, // maximum value + 18, // default value + G_PARAM_CONSTRUCT_ONLY | G_PARAM_READWRITE); + g_object_class_install_property (object_class, PROP_ZOOM_MAX, pspec); + + pspec = g_param_spec_double ("lat-min", + "Minimum latitude", + "Minimum latitude in degrees supported by the map provider", + -90.0, // minimum value + 90.0, // maximum value + -90.0, // default value + G_PARAM_CONSTRUCT_ONLY | G_PARAM_READWRITE); + g_object_class_install_property (object_class, PROP_LAT_MIN, pspec); + + pspec = g_param_spec_double ("lat-max", + "Maximum latitude", + "Maximum latitude in degrees supported by the map provider", + -90.0, // minimum value + 90.0, // maximum value + 90.0, // default value + G_PARAM_CONSTRUCT_ONLY | G_PARAM_READWRITE); + g_object_class_install_property (object_class, PROP_LAT_MAX, pspec); + + pspec = g_param_spec_double ("lon-min", + "Minimum longitude", + "Minimum longitude in degrees supported by the map provider", + -180.0, // minimum value + 180.0, // maximum value + -180.0, // default value + G_PARAM_CONSTRUCT_ONLY | G_PARAM_READWRITE); + g_object_class_install_property (object_class, PROP_LON_MIN, pspec); + + pspec = g_param_spec_double ("lon-max", + "Maximum longitude", + "Maximum longitude in degrees supported by the map provider", + -180.0, // minimum value + 180.0, // maximum value + 180.0, // default value + G_PARAM_CONSTRUCT_ONLY | G_PARAM_READWRITE); + g_object_class_install_property (object_class, PROP_LON_MAX, pspec); + + g_type_class_add_private (klass, sizeof (VikWmscMapSourcePrivate)); + + object_class->finalize = vik_wmsc_map_source_finalize; +} + +static gboolean +_supports_download_only_new ( VikMapSource *self ) +{ + g_return_val_if_fail (VIK_IS_WMSC_MAP_SOURCE(self), FALSE); + + VikWmscMapSourcePrivate *priv = VIK_WMSC_MAP_SOURCE_PRIVATE(self); + + return priv->options.check_file_server_time; +} + +static gboolean +_is_direct_file_access ( VikMapSource *self ) +{ + return FALSE; +} + +static gboolean +_is_mbtiles ( VikMapSource *self ) +{ + return FALSE; +} + +static gboolean +_is_osm_meta_tiles ( VikMapSource *self ) +{ + return FALSE; +} + +static gboolean +_coord_to_mapcoord ( VikMapSource *self, const VikCoord *src, gdouble xzoom, gdouble yzoom, MapCoord *dest ) +{ + g_assert ( src->mode == VIK_COORD_LATLON ); + + if ( xzoom != yzoom ) + return FALSE; + + dest->scale = map_utils_mpp_to_scale ( xzoom ); + if ( dest->scale == 255 ) + return FALSE; + + /* Note : VIK_GZ(17) / xzoom / 2 = number of tile on Y axis */ + g_debug("%s: xzoom=%f yzoom=%f -> %f", __FUNCTION__, + xzoom, yzoom, VIK_GZ(17) / xzoom / 2); + dest->x = floor((src->east_west + 180) / 180 * VIK_GZ(17) / xzoom / 2); + /* We should restore logic of viking: + * tile index on Y axis follow a screen logic (top -> down) + */ + dest->y = floor((180 - (src->north_south + 90)) / 180 * VIK_GZ(17) / xzoom / 2); + dest->z = 0; + g_debug("%s: %f,%f -> %d,%d", __FUNCTION__, + src->east_west, src->north_south, dest->x, dest->y); + return TRUE; +} + +static void +_mapcoord_to_center_coord ( VikMapSource *self, MapCoord *src, VikCoord *dest ) +{ + gdouble socalled_mpp; + if (src->scale >= 0) + socalled_mpp = VIK_GZ(src->scale); + else + socalled_mpp = 1.0/VIK_GZ(-src->scale); + dest->mode = VIK_COORD_LATLON; + dest->east_west = (src->x+0.5) * 180 / VIK_GZ(17) * socalled_mpp * 2 - 180; + /* We should restore logic of viking: + * tile index on Y axis follow a screen logic (top -> down) + */ + dest->north_south = -((src->y+0.5) * 180 / VIK_GZ(17) * socalled_mpp * 2 - 90); + g_debug("%s: %d,%d -> %f,%f", __FUNCTION__, + src->x, src->y, dest->east_west, dest->north_south); +} + +static gchar * +_get_uri( VikMapSourceDefault *self, MapCoord *src ) +{ + g_return_val_if_fail (VIK_IS_WMSC_MAP_SOURCE(self), NULL); + + VikWmscMapSourcePrivate *priv = VIK_WMSC_MAP_SOURCE_PRIVATE(self); + gdouble socalled_mpp; + if (src->scale >= 0) + socalled_mpp = VIK_GZ(src->scale); + else + socalled_mpp = 1.0/VIK_GZ(-src->scale); + gdouble minx = (gdouble)src->x * 180 / VIK_GZ(17) * socalled_mpp * 2 - 180; + gdouble maxx = (gdouble)(src->x + 1) * 180 / VIK_GZ(17) * socalled_mpp * 2 - 180; + /* We should restore logic of viking: + * tile index on Y axis follow a screen logic (top -> down) + */ + gdouble miny = -((gdouble)(src->y + 1) * 180 / VIK_GZ(17) * socalled_mpp * 2 - 90); + gdouble maxy = -((gdouble)(src->y) * 180 / VIK_GZ(17) * socalled_mpp * 2 - 90); + + gchar sminx[G_ASCII_DTOSTR_BUF_SIZE]; + gchar smaxx[G_ASCII_DTOSTR_BUF_SIZE]; + gchar sminy[G_ASCII_DTOSTR_BUF_SIZE]; + gchar smaxy[G_ASCII_DTOSTR_BUF_SIZE]; + + g_ascii_dtostr (sminx, G_ASCII_DTOSTR_BUF_SIZE, minx); + g_ascii_dtostr (smaxx, G_ASCII_DTOSTR_BUF_SIZE, maxx); + g_ascii_dtostr (sminy, G_ASCII_DTOSTR_BUF_SIZE, miny); + g_ascii_dtostr (smaxy, G_ASCII_DTOSTR_BUF_SIZE, maxy); + + gchar *uri = g_strdup_printf (priv->url, sminx, sminy, smaxx, smaxy); + + return uri; +} + +static gchar * +_get_hostname( VikMapSourceDefault *self ) +{ + g_return_val_if_fail (VIK_IS_WMSC_MAP_SOURCE(self), NULL); + + VikWmscMapSourcePrivate *priv = VIK_WMSC_MAP_SOURCE_PRIVATE(self); + return g_strdup( priv->hostname ); +} + +static DownloadFileOptions * +_get_download_options( VikMapSourceDefault *self ) +{ + g_return_val_if_fail (VIK_IS_WMSC_MAP_SOURCE(self), NULL); + + VikWmscMapSourcePrivate *priv = VIK_WMSC_MAP_SOURCE_PRIVATE(self); + return &(priv->options); +} +/** + * + */ +static guint8 +_get_zoom_min (VikMapSource *self) +{ + g_return_val_if_fail (VIK_IS_WMSC_MAP_SOURCE(self), FALSE); + VikWmscMapSourcePrivate *priv = VIK_WMSC_MAP_SOURCE_PRIVATE(self); + return priv->zoom_min; +} + +/** + * + */ +static guint8 +_get_zoom_max (VikMapSource *self) +{ + g_return_val_if_fail (VIK_IS_WMSC_MAP_SOURCE(self), FALSE); + VikWmscMapSourcePrivate *priv = VIK_WMSC_MAP_SOURCE_PRIVATE(self); + return priv->zoom_max; +} + +/** + * + */ +static gdouble +_get_lat_min (VikMapSource *self) +{ + g_return_val_if_fail (VIK_IS_WMSC_MAP_SOURCE(self), FALSE); + VikWmscMapSourcePrivate *priv = VIK_WMSC_MAP_SOURCE_PRIVATE(self); + return priv->lat_min; +} + +/** + * + */ +static gdouble +_get_lat_max (VikMapSource *self) +{ + g_return_val_if_fail (VIK_IS_WMSC_MAP_SOURCE(self), FALSE); + VikWmscMapSourcePrivate *priv = VIK_WMSC_MAP_SOURCE_PRIVATE(self); + return priv->lat_max; +} + +/** + * + */ +static gdouble +_get_lon_min (VikMapSource *self) +{ + g_return_val_if_fail (VIK_IS_WMSC_MAP_SOURCE(self), FALSE); + VikWmscMapSourcePrivate *priv = VIK_WMSC_MAP_SOURCE_PRIVATE(self); + return priv->lon_min; +} + +/** + * + */ +static gdouble +_get_lon_max (VikMapSource *self) +{ + g_return_val_if_fail (VIK_IS_WMSC_MAP_SOURCE(self), FALSE); + VikWmscMapSourcePrivate *priv = VIK_WMSC_MAP_SOURCE_PRIVATE(self); + return priv->lon_max; +} + +VikWmscMapSource * +vik_wmsc_map_source_new_with_id (guint16 id, const gchar *label, const gchar *hostname, const gchar *url) +{ + return g_object_new(VIK_TYPE_WMSC_MAP_SOURCE, + "id", id, "label", label, "hostname", hostname, "url", url, NULL); +} diff --git a/src/vikwmscmapsource.h b/src/vikwmscmapsource.h new file mode 100644 index 0000000..cd4de35 --- /dev/null +++ b/src/vikwmscmapsource.h @@ -0,0 +1,55 @@ +/* -*- Mode: C; indent-tabs-mode: t; c-basic-offset: 4; tab-width: 4 -*- */ +/* + * viking + * Copyright (C) 2010, Guilhem Bonnefille + * + * viking 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. + * + * viking 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, see . + */ + +#ifndef _VIK_WMSC_MAP_SOURCE_H +#define _VIK_WMSC_MAP_SOURCE_H + +#include "vikcoord.h" +#include "mapcoord.h" +#include "vikmapsourcedefault.h" + +G_BEGIN_DECLS + +#define VIK_TYPE_WMSC_MAP_SOURCE (vik_wmsc_map_source_get_type ()) +#define VIK_WMSC_MAP_SOURCE(obj) (G_TYPE_CHECK_INSTANCE_CAST ((obj), VIK_TYPE_WMSC_MAP_SOURCE, VikWmscMapSource)) +#define VIK_WMSC_MAP_SOURCE_CLASS(klass) (G_TYPE_CHECK_CLASS_CAST ((klass), VIK_TYPE_WMSC_MAP_SOURCE, VikWmscMapSourceClass)) +#define VIK_IS_WMSC_MAP_SOURCE(obj) (G_TYPE_CHECK_INSTANCE_TYPE ((obj), VIK_TYPE_WMSC_MAP_SOURCE)) +#define VIK_IS_WMSC_MAP_SOURCE_CLASS(klass) (G_TYPE_CHECK_CLASS_TYPE ((klass), VIK_TYPE_WMSC_MAP_SOURCE)) +#define VIK_WMSC_MAP_SOURCE_GET_CLASS(obj) (G_TYPE_INSTANCE_GET_CLASS ((obj), VIK_TYPE_WMSC_MAP_SOURCE, VikWmscMapSourceClass)) + +typedef struct _VikWmscMapSourceClass VikWmscMapSourceClass; +typedef struct _VikWmscMapSource VikWmscMapSource; + +struct _VikWmscMapSourceClass +{ + VikMapSourceDefaultClass parent_class; +}; + +struct _VikWmscMapSource +{ + VikMapSourceDefault parent_instance; +}; + +GType vik_wmsc_map_source_get_type (void) G_GNUC_CONST; + +VikWmscMapSource * vik_wmsc_map_source_new_with_id (guint16 id, const gchar *label, const gchar *hostname, const gchar *url); + +G_END_DECLS + +#endif /* _VIK_WMSC_MAP_SOURCE_H_ */ diff --git a/test-driver b/test-driver new file mode 100755 index 0000000..b8521a4 --- /dev/null +++ b/test-driver @@ -0,0 +1,148 @@ +#! /bin/sh +# test-driver - basic testsuite driver script. + +scriptversion=2018-03-07.03; # UTC + +# Copyright (C) 2011-2018 Free Software Foundation, Inc. +# +# 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, 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, see . + +# As a special exception to the GNU General Public License, if you +# distribute this file as part of a program that contains a +# configuration script generated by Autoconf, you may include it under +# the same distribution terms that you use for the rest of that program. + +# This file is maintained in Automake, please report +# bugs to or send patches to +# . + +# Make unconditional expansion of undefined variables an error. This +# helps a lot in preventing typo-related bugs. +set -u + +usage_error () +{ + echo "$0: $*" >&2 + print_usage >&2 + exit 2 +} + +print_usage () +{ + cat <$log_file 2>&1 +estatus=$? + +if test $enable_hard_errors = no && test $estatus -eq 99; then + tweaked_estatus=1 +else + tweaked_estatus=$estatus +fi + +case $tweaked_estatus:$expect_failure in + 0:yes) col=$red res=XPASS recheck=yes gcopy=yes;; + 0:*) col=$grn res=PASS recheck=no gcopy=no;; + 77:*) col=$blu res=SKIP recheck=no gcopy=yes;; + 99:*) col=$mgn res=ERROR recheck=yes gcopy=yes;; + *:yes) col=$lgn res=XFAIL recheck=no gcopy=yes;; + *:*) col=$red res=FAIL recheck=yes gcopy=yes;; +esac + +# Report the test outcome and exit status in the logs, so that one can +# know whether the test passed or failed simply by looking at the '.log' +# file, without the need of also peaking into the corresponding '.trs' +# file (automake bug#11814). +echo "$res $test_name (exit status: $estatus)" >>$log_file + +# Report outcome to console. +echo "${col}${res}${std}: $test_name" + +# Register the test result, and other relevant metadata. +echo ":test-result: $res" > $trs_file +echo ":global-test-result: $res" >> $trs_file +echo ":recheck: $recheck" >> $trs_file +echo ":copy-in-global-log: $gcopy" >> $trs_file + +# Local Variables: +# mode: shell-script +# sh-indentation: 2 +# eval: (add-hook 'before-save-hook 'time-stamp) +# time-stamp-start: "scriptversion=" +# time-stamp-format: "%:y-%02m-%02d.%02H" +# time-stamp-time-zone: "UTC0" +# time-stamp-end: "; # UTC" +# End: diff --git a/test/Makefile.am b/test/Makefile.am new file mode 100644 index 0000000..2d66bce --- /dev/null +++ b/test/Makefile.am @@ -0,0 +1,114 @@ +AM_CFLAGS = -Wall \ + -I$(top_srcdir)/src \ + $(PACKAGE_CFLAGS) +LDADD = $(PACKAGE_LIBS) @EXPAT_LIBS@ @LIBCURL@ $(top_builddir)/src/icons/libicons.a +if REALTIME_GPS_TRACKING +LDADD += -lgps +endif + +TESTS = check_degrees_conversions.sh \ + check_decimal_output.sh \ + check_babel.sh \ + check_gpx.sh \ + check_metatile.sh +if GEOTAG +TESTS += check_geotag.sh +endif +if MD5_HASH +TESTS += check_md5_hash.sh +endif + +check_PROGRAMS = degrees_converter \ + gpx2gpx \ + test_vikgotoxmltool \ + test_time \ + test_decimal_output \ + test_coord_conversion \ + test_babel \ + test_md5_hash \ + test_metatile + +if GEOTAG +check_PROGRAMS += geotag_read geotag_write +endif + +check_SCRIPTS = check_degrees_conversions.sh \ + check_decimal_output.sh \ + check_gpx.sh \ + check_metatile.sh +if GEOTAG +check_SCRIPTS += check_geotag.sh +endif +if MD5_HASH +check_SCRIPTS += check_md5_hash.sh +endif + +# Scripts and the test data that they use +EXTRA_DIST = check_degrees_conversions.sh \ + check_decimal_output.sh \ + check_babel.sh \ + check_gpx.sh \ + SF\#022.gpx \ + check_md5_hash.sh \ + check_metatile.sh \ + metatile_example/13/0/0/250/220/0.meta \ + check_geotag.sh \ + Stonehenge.jpg \ + ViewFromCribyn-Wales-GPS.jpg + +degrees_converter_SOURCES = degrees_converter.c +degrees_converter_LDADD = \ + $(top_builddir)/src/degrees_converters.o \ + $(LDADD) + +if GEOTAG +geotag_read_SOURCES = geotag_read.c +geotag_read_LDADD = \ + $(top_builddir)/src/libviking.a \ + $(LDADD) + +geotag_write_SOURCES = geotag_write.c +geotag_write_LDADD = \ + $(top_builddir)/src/libviking.a \ + $(LDADD) +endif + +gpx2gpx_SOURCES = gpx2gpx.c +gpx2gpx_LDADD = \ + $(top_builddir)/src/libviking.a \ + $(LDADD) + +test_vikgotoxmltool_SOURCES = test_vikgotoxmltool.c +test_vikgotoxmltool_LDADD = \ + $(top_builddir)/src/libviking.a \ + $(LDADD) + +test_time_SOURCES = test_time.c +test_time_LDADD = \ + $(top_builddir)/src/libviking.a \ + $(LDADD) + +test_decimal_output_SOURCES = test_decimal_output.c +test_decimal_output_LDADD = \ + $(top_builddir)/src/libviking.a \ + $(LDADD) + +test_coord_conversion_SOURCES = test_coord_conversion.c +test_coord_conversion_LDADD = \ + $(top_builddir)/src/libviking.a \ + $(LDADD) + +test_babel_SOURCES = test_babel.c +test_babel_LDADD = \ + $(top_builddir)/src/libviking.a \ + $(LDADD) + +test_md5_hash_SOURCES = test_md5_hash.c +test_md5_hash_LDADD = \ + $(top_builddir)/src/libviking.a \ + $(LDADD) + +test_metatile_SOURCES = test_metatile.c +test_metatile_LDADD = \ + $(top_builddir)/src/libviking.a \ + $(LDADD) diff --git a/test/Makefile.in b/test/Makefile.in new file mode 100644 index 0000000..61a2a63 --- /dev/null +++ b/test/Makefile.in @@ -0,0 +1,1267 @@ +# Makefile.in generated by automake 1.16.1 from Makefile.am. +# @configure_input@ + +# Copyright (C) 1994-2018 Free Software Foundation, Inc. + +# This Makefile.in is free software; the Free Software Foundation +# gives unlimited permission to copy and/or distribute it, +# with or without modifications, as long as this notice is preserved. + +# This program is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY, to the extent permitted by law; without +# even the implied warranty of MERCHANTABILITY or FITNESS FOR A +# PARTICULAR PURPOSE. + +@SET_MAKE@ +VPATH = @srcdir@ +am__is_gnu_make = { \ + if test -z '$(MAKELEVEL)'; then \ + false; \ + elif test -n '$(MAKE_HOST)'; then \ + true; \ + elif test -n '$(MAKE_VERSION)' && test -n '$(CURDIR)'; then \ + true; \ + else \ + false; \ + fi; \ +} +am__make_running_with_option = \ + case $${target_option-} in \ + ?) ;; \ + *) echo "am__make_running_with_option: internal error: invalid" \ + "target option '$${target_option-}' specified" >&2; \ + exit 1;; \ + esac; \ + has_opt=no; \ + sane_makeflags=$$MAKEFLAGS; \ + if $(am__is_gnu_make); then \ + sane_makeflags=$$MFLAGS; \ + else \ + case $$MAKEFLAGS in \ + *\\[\ \ ]*) \ + bs=\\; \ + sane_makeflags=`printf '%s\n' "$$MAKEFLAGS" \ + | sed "s/$$bs$$bs[$$bs $$bs ]*//g"`;; \ + esac; \ + fi; \ + skip_next=no; \ + strip_trailopt () \ + { \ + flg=`printf '%s\n' "$$flg" | sed "s/$$1.*$$//"`; \ + }; \ + for flg in $$sane_makeflags; do \ + test $$skip_next = yes && { skip_next=no; continue; }; \ + case $$flg in \ + *=*|--*) continue;; \ + -*I) strip_trailopt 'I'; skip_next=yes;; \ + -*I?*) strip_trailopt 'I';; \ + -*O) strip_trailopt 'O'; skip_next=yes;; \ + -*O?*) strip_trailopt 'O';; \ + -*l) strip_trailopt 'l'; skip_next=yes;; \ + -*l?*) strip_trailopt 'l';; \ + -[dEDm]) skip_next=yes;; \ + -[JT]) skip_next=yes;; \ + esac; \ + case $$flg in \ + *$$target_option*) has_opt=yes; break;; \ + esac; \ + done; \ + test $$has_opt = yes +am__make_dryrun = (target_option=n; $(am__make_running_with_option)) +am__make_keepgoing = (target_option=k; $(am__make_running_with_option)) +pkgdatadir = $(datadir)/@PACKAGE@ +pkgincludedir = $(includedir)/@PACKAGE@ +pkglibdir = $(libdir)/@PACKAGE@ +pkglibexecdir = $(libexecdir)/@PACKAGE@ +am__cd = CDPATH="$${ZSH_VERSION+.}$(PATH_SEPARATOR)" && cd +install_sh_DATA = $(install_sh) -c -m 644 +install_sh_PROGRAM = $(install_sh) -c +install_sh_SCRIPT = $(install_sh) -c +INSTALL_HEADER = $(INSTALL_DATA) +transform = $(program_transform_name) +NORMAL_INSTALL = : +PRE_INSTALL = : +POST_INSTALL = : +NORMAL_UNINSTALL = : +PRE_UNINSTALL = : +POST_UNINSTALL = : +build_triplet = @build@ +host_triplet = @host@ +target_triplet = @target@ +@REALTIME_GPS_TRACKING_TRUE@am__append_1 = -lgps +@GEOTAG_TRUE@am__append_2 = check_geotag.sh +@MD5_HASH_TRUE@am__append_3 = check_md5_hash.sh +check_PROGRAMS = degrees_converter$(EXEEXT) gpx2gpx$(EXEEXT) \ + test_vikgotoxmltool$(EXEEXT) test_time$(EXEEXT) \ + test_decimal_output$(EXEEXT) test_coord_conversion$(EXEEXT) \ + test_babel$(EXEEXT) test_md5_hash$(EXEEXT) \ + test_metatile$(EXEEXT) $(am__EXEEXT_1) +@GEOTAG_TRUE@am__append_4 = geotag_read geotag_write +@GEOTAG_TRUE@am__append_5 = check_geotag.sh +@MD5_HASH_TRUE@am__append_6 = check_md5_hash.sh +subdir = test +ACLOCAL_M4 = $(top_srcdir)/aclocal.m4 +am__aclocal_m4_deps = $(top_srcdir)/m4/expat.m4 \ + $(top_srcdir)/m4/gettext.m4 $(top_srcdir)/m4/iconv.m4 \ + $(top_srcdir)/m4/intlmacosx.m4 $(top_srcdir)/m4/lib-ld.m4 \ + $(top_srcdir)/m4/lib-link.m4 $(top_srcdir)/m4/lib-prefix.m4 \ + $(top_srcdir)/m4/libcurl.m4 $(top_srcdir)/m4/nls.m4 \ + $(top_srcdir)/m4/po.m4 $(top_srcdir)/m4/progtest.m4 \ + $(top_srcdir)/configure.ac +am__configure_deps = $(am__aclocal_m4_deps) $(CONFIGURE_DEPENDENCIES) \ + $(ACLOCAL_M4) +DIST_COMMON = $(srcdir)/Makefile.am $(am__DIST_COMMON) +mkinstalldirs = $(SHELL) $(top_srcdir)/mkinstalldirs +CONFIG_HEADER = $(top_builddir)/src/config.h +CONFIG_CLEAN_FILES = +CONFIG_CLEAN_VPATH_FILES = +@GEOTAG_TRUE@am__EXEEXT_1 = geotag_read$(EXEEXT) geotag_write$(EXEEXT) +am_degrees_converter_OBJECTS = degrees_converter.$(OBJEXT) +degrees_converter_OBJECTS = $(am_degrees_converter_OBJECTS) +am__DEPENDENCIES_1 = +am__DEPENDENCIES_2 = $(am__DEPENDENCIES_1) \ + $(top_builddir)/src/icons/libicons.a $(am__DEPENDENCIES_1) +degrees_converter_DEPENDENCIES = \ + $(top_builddir)/src/degrees_converters.o $(am__DEPENDENCIES_2) +am__geotag_read_SOURCES_DIST = geotag_read.c +@GEOTAG_TRUE@am_geotag_read_OBJECTS = geotag_read.$(OBJEXT) +geotag_read_OBJECTS = $(am_geotag_read_OBJECTS) +@GEOTAG_TRUE@geotag_read_DEPENDENCIES = \ +@GEOTAG_TRUE@ $(top_builddir)/src/libviking.a \ +@GEOTAG_TRUE@ $(am__DEPENDENCIES_2) +am__geotag_write_SOURCES_DIST = geotag_write.c +@GEOTAG_TRUE@am_geotag_write_OBJECTS = geotag_write.$(OBJEXT) +geotag_write_OBJECTS = $(am_geotag_write_OBJECTS) +@GEOTAG_TRUE@geotag_write_DEPENDENCIES = \ +@GEOTAG_TRUE@ $(top_builddir)/src/libviking.a \ +@GEOTAG_TRUE@ $(am__DEPENDENCIES_2) +am_gpx2gpx_OBJECTS = gpx2gpx.$(OBJEXT) +gpx2gpx_OBJECTS = $(am_gpx2gpx_OBJECTS) +gpx2gpx_DEPENDENCIES = $(top_builddir)/src/libviking.a \ + $(am__DEPENDENCIES_2) +am_test_babel_OBJECTS = test_babel.$(OBJEXT) +test_babel_OBJECTS = $(am_test_babel_OBJECTS) +test_babel_DEPENDENCIES = $(top_builddir)/src/libviking.a \ + $(am__DEPENDENCIES_2) +am_test_coord_conversion_OBJECTS = test_coord_conversion.$(OBJEXT) +test_coord_conversion_OBJECTS = $(am_test_coord_conversion_OBJECTS) +test_coord_conversion_DEPENDENCIES = $(top_builddir)/src/libviking.a \ + $(am__DEPENDENCIES_2) +am_test_decimal_output_OBJECTS = test_decimal_output.$(OBJEXT) +test_decimal_output_OBJECTS = $(am_test_decimal_output_OBJECTS) +test_decimal_output_DEPENDENCIES = $(top_builddir)/src/libviking.a \ + $(am__DEPENDENCIES_2) +am_test_md5_hash_OBJECTS = test_md5_hash.$(OBJEXT) +test_md5_hash_OBJECTS = $(am_test_md5_hash_OBJECTS) +test_md5_hash_DEPENDENCIES = $(top_builddir)/src/libviking.a \ + $(am__DEPENDENCIES_2) +am_test_metatile_OBJECTS = test_metatile.$(OBJEXT) +test_metatile_OBJECTS = $(am_test_metatile_OBJECTS) +test_metatile_DEPENDENCIES = $(top_builddir)/src/libviking.a \ + $(am__DEPENDENCIES_2) +am_test_time_OBJECTS = test_time.$(OBJEXT) +test_time_OBJECTS = $(am_test_time_OBJECTS) +test_time_DEPENDENCIES = $(top_builddir)/src/libviking.a \ + $(am__DEPENDENCIES_2) +am_test_vikgotoxmltool_OBJECTS = test_vikgotoxmltool.$(OBJEXT) +test_vikgotoxmltool_OBJECTS = $(am_test_vikgotoxmltool_OBJECTS) +test_vikgotoxmltool_DEPENDENCIES = $(top_builddir)/src/libviking.a \ + $(am__DEPENDENCIES_2) +AM_V_P = $(am__v_P_@AM_V@) +am__v_P_ = $(am__v_P_@AM_DEFAULT_V@) +am__v_P_0 = false +am__v_P_1 = : +AM_V_GEN = $(am__v_GEN_@AM_V@) +am__v_GEN_ = $(am__v_GEN_@AM_DEFAULT_V@) +am__v_GEN_0 = @echo " GEN " $@; +am__v_GEN_1 = +AM_V_at = $(am__v_at_@AM_V@) +am__v_at_ = $(am__v_at_@AM_DEFAULT_V@) +am__v_at_0 = @ +am__v_at_1 = +DEFAULT_INCLUDES = -I.@am__isrc@ -I$(top_builddir)/src +depcomp = $(SHELL) $(top_srcdir)/depcomp +am__maybe_remake_depfiles = depfiles +am__depfiles_remade = ./$(DEPDIR)/degrees_converter.Po \ + ./$(DEPDIR)/geotag_read.Po ./$(DEPDIR)/geotag_write.Po \ + ./$(DEPDIR)/gpx2gpx.Po ./$(DEPDIR)/test_babel.Po \ + ./$(DEPDIR)/test_coord_conversion.Po \ + ./$(DEPDIR)/test_decimal_output.Po \ + ./$(DEPDIR)/test_md5_hash.Po ./$(DEPDIR)/test_metatile.Po \ + ./$(DEPDIR)/test_time.Po ./$(DEPDIR)/test_vikgotoxmltool.Po +am__mv = mv -f +COMPILE = $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) \ + $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) +AM_V_CC = $(am__v_CC_@AM_V@) +am__v_CC_ = $(am__v_CC_@AM_DEFAULT_V@) +am__v_CC_0 = @echo " CC " $@; +am__v_CC_1 = +CCLD = $(CC) +LINK = $(CCLD) $(AM_CFLAGS) $(CFLAGS) $(AM_LDFLAGS) $(LDFLAGS) -o $@ +AM_V_CCLD = $(am__v_CCLD_@AM_V@) +am__v_CCLD_ = $(am__v_CCLD_@AM_DEFAULT_V@) +am__v_CCLD_0 = @echo " CCLD " $@; +am__v_CCLD_1 = +SOURCES = $(degrees_converter_SOURCES) $(geotag_read_SOURCES) \ + $(geotag_write_SOURCES) $(gpx2gpx_SOURCES) \ + $(test_babel_SOURCES) $(test_coord_conversion_SOURCES) \ + $(test_decimal_output_SOURCES) $(test_md5_hash_SOURCES) \ + $(test_metatile_SOURCES) $(test_time_SOURCES) \ + $(test_vikgotoxmltool_SOURCES) +DIST_SOURCES = $(degrees_converter_SOURCES) \ + $(am__geotag_read_SOURCES_DIST) \ + $(am__geotag_write_SOURCES_DIST) $(gpx2gpx_SOURCES) \ + $(test_babel_SOURCES) $(test_coord_conversion_SOURCES) \ + $(test_decimal_output_SOURCES) $(test_md5_hash_SOURCES) \ + $(test_metatile_SOURCES) $(test_time_SOURCES) \ + $(test_vikgotoxmltool_SOURCES) +am__can_run_installinfo = \ + case $$AM_UPDATE_INFO_DIR in \ + n|no|NO) false;; \ + *) (install-info --version) >/dev/null 2>&1;; \ + esac +am__tagged_files = $(HEADERS) $(SOURCES) $(TAGS_FILES) $(LISP) +# Read a list of newline-separated strings from the standard input, +# and print each of them once, without duplicates. Input order is +# *not* preserved. +am__uniquify_input = $(AWK) '\ + BEGIN { nonempty = 0; } \ + { items[$$0] = 1; nonempty = 1; } \ + END { if (nonempty) { for (i in items) print i; }; } \ +' +# Make sure the list of sources is unique. This is necessary because, +# e.g., the same source file might be shared among _SOURCES variables +# for different programs/libraries. +am__define_uniq_tagged_files = \ + list='$(am__tagged_files)'; \ + unique=`for i in $$list; do \ + if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \ + done | $(am__uniquify_input)` +ETAGS = etags +CTAGS = ctags +am__tty_colors_dummy = \ + mgn= red= grn= lgn= blu= brg= std=; \ + am__color_tests=no +am__tty_colors = { \ + $(am__tty_colors_dummy); \ + if test "X$(AM_COLOR_TESTS)" = Xno; then \ + am__color_tests=no; \ + elif test "X$(AM_COLOR_TESTS)" = Xalways; then \ + am__color_tests=yes; \ + elif test "X$$TERM" != Xdumb && { test -t 1; } 2>/dev/null; then \ + am__color_tests=yes; \ + fi; \ + if test $$am__color_tests = yes; then \ + red=''; \ + grn=''; \ + lgn=''; \ + blu=''; \ + mgn=''; \ + brg=''; \ + std=''; \ + fi; \ +} +am__vpath_adj_setup = srcdirstrip=`echo "$(srcdir)" | sed 's|.|.|g'`; +am__vpath_adj = case $$p in \ + $(srcdir)/*) f=`echo "$$p" | sed "s|^$$srcdirstrip/||"`;; \ + *) f=$$p;; \ + esac; +am__strip_dir = f=`echo $$p | sed -e 's|^.*/||'`; +am__install_max = 40 +am__nobase_strip_setup = \ + srcdirstrip=`echo "$(srcdir)" | sed 's/[].[^$$\\*|]/\\\\&/g'` +am__nobase_strip = \ + for p in $$list; do echo "$$p"; done | sed -e "s|$$srcdirstrip/||" +am__nobase_list = $(am__nobase_strip_setup); \ + for p in $$list; do echo "$$p $$p"; done | \ + sed "s| $$srcdirstrip/| |;"' / .*\//!s/ .*/ ./; s,\( .*\)/[^/]*$$,\1,' | \ + $(AWK) 'BEGIN { files["."] = "" } { files[$$2] = files[$$2] " " $$1; \ + if (++n[$$2] == $(am__install_max)) \ + { print $$2, files[$$2]; n[$$2] = 0; files[$$2] = "" } } \ + END { for (dir in files) print dir, files[dir] }' +am__base_list = \ + sed '$$!N;$$!N;$$!N;$$!N;$$!N;$$!N;$$!N;s/\n/ /g' | \ + sed '$$!N;$$!N;$$!N;$$!N;s/\n/ /g' +am__uninstall_files_from_dir = { \ + test -z "$$files" \ + || { test ! -d "$$dir" && test ! -f "$$dir" && test ! -r "$$dir"; } \ + || { echo " ( cd '$$dir' && rm -f" $$files ")"; \ + $(am__cd) "$$dir" && rm -f $$files; }; \ + } +am__recheck_rx = ^[ ]*:recheck:[ ]* +am__global_test_result_rx = ^[ ]*:global-test-result:[ ]* +am__copy_in_global_log_rx = ^[ ]*:copy-in-global-log:[ ]* +# A command that, given a newline-separated list of test names on the +# standard input, print the name of the tests that are to be re-run +# upon "make recheck". +am__list_recheck_tests = $(AWK) '{ \ + recheck = 1; \ + while ((rc = (getline line < ($$0 ".trs"))) != 0) \ + { \ + if (rc < 0) \ + { \ + if ((getline line2 < ($$0 ".log")) < 0) \ + recheck = 0; \ + break; \ + } \ + else if (line ~ /$(am__recheck_rx)[nN][Oo]/) \ + { \ + recheck = 0; \ + break; \ + } \ + else if (line ~ /$(am__recheck_rx)[yY][eE][sS]/) \ + { \ + break; \ + } \ + }; \ + if (recheck) \ + print $$0; \ + close ($$0 ".trs"); \ + close ($$0 ".log"); \ +}' +# A command that, given a newline-separated list of test names on the +# standard input, create the global log from their .trs and .log files. +am__create_global_log = $(AWK) ' \ +function fatal(msg) \ +{ \ + print "fatal: making $@: " msg | "cat >&2"; \ + exit 1; \ +} \ +function rst_section(header) \ +{ \ + print header; \ + len = length(header); \ + for (i = 1; i <= len; i = i + 1) \ + printf "="; \ + printf "\n\n"; \ +} \ +{ \ + copy_in_global_log = 1; \ + global_test_result = "RUN"; \ + while ((rc = (getline line < ($$0 ".trs"))) != 0) \ + { \ + if (rc < 0) \ + fatal("failed to read from " $$0 ".trs"); \ + if (line ~ /$(am__global_test_result_rx)/) \ + { \ + sub("$(am__global_test_result_rx)", "", line); \ + sub("[ ]*$$", "", line); \ + global_test_result = line; \ + } \ + else if (line ~ /$(am__copy_in_global_log_rx)[nN][oO]/) \ + copy_in_global_log = 0; \ + }; \ + if (copy_in_global_log) \ + { \ + rst_section(global_test_result ": " $$0); \ + while ((rc = (getline line < ($$0 ".log"))) != 0) \ + { \ + if (rc < 0) \ + fatal("failed to read from " $$0 ".log"); \ + print line; \ + }; \ + printf "\n"; \ + }; \ + close ($$0 ".trs"); \ + close ($$0 ".log"); \ +}' +# Restructured Text title. +am__rst_title = { sed 's/.*/ & /;h;s/./=/g;p;x;s/ *$$//;p;g' && echo; } +# Solaris 10 'make', and several other traditional 'make' implementations, +# pass "-e" to $(SHELL), and POSIX 2008 even requires this. Work around it +# by disabling -e (using the XSI extension "set +e") if it's set. +am__sh_e_setup = case $$- in *e*) set +e;; esac +# Default flags passed to test drivers. +am__common_driver_flags = \ + --color-tests "$$am__color_tests" \ + --enable-hard-errors "$$am__enable_hard_errors" \ + --expect-failure "$$am__expect_failure" +# To be inserted before the command running the test. Creates the +# directory for the log if needed. Stores in $dir the directory +# containing $f, in $tst the test, in $log the log. Executes the +# developer- defined test setup AM_TESTS_ENVIRONMENT (if any), and +# passes TESTS_ENVIRONMENT. Set up options for the wrapper that +# will run the test scripts (or their associated LOG_COMPILER, if +# thy have one). +am__check_pre = \ +$(am__sh_e_setup); \ +$(am__vpath_adj_setup) $(am__vpath_adj) \ +$(am__tty_colors); \ +srcdir=$(srcdir); export srcdir; \ +case "$@" in \ + */*) am__odir=`echo "./$@" | sed 's|/[^/]*$$||'`;; \ + *) am__odir=.;; \ +esac; \ +test "x$$am__odir" = x"." || test -d "$$am__odir" \ + || $(MKDIR_P) "$$am__odir" || exit $$?; \ +if test -f "./$$f"; then dir=./; \ +elif test -f "$$f"; then dir=; \ +else dir="$(srcdir)/"; fi; \ +tst=$$dir$$f; log='$@'; \ +if test -n '$(DISABLE_HARD_ERRORS)'; then \ + am__enable_hard_errors=no; \ +else \ + am__enable_hard_errors=yes; \ +fi; \ +case " $(XFAIL_TESTS) " in \ + *[\ \ ]$$f[\ \ ]* | *[\ \ ]$$dir$$f[\ \ ]*) \ + am__expect_failure=yes;; \ + *) \ + am__expect_failure=no;; \ +esac; \ +$(AM_TESTS_ENVIRONMENT) $(TESTS_ENVIRONMENT) +# A shell command to get the names of the tests scripts with any registered +# extension removed (i.e., equivalently, the names of the test logs, with +# the '.log' extension removed). The result is saved in the shell variable +# '$bases'. This honors runtime overriding of TESTS and TEST_LOGS. Sadly, +# we cannot use something simpler, involving e.g., "$(TEST_LOGS:.log=)", +# since that might cause problem with VPATH rewrites for suffix-less tests. +# See also 'test-harness-vpath-rewrite.sh' and 'test-trs-basic.sh'. +am__set_TESTS_bases = \ + bases='$(TEST_LOGS)'; \ + bases=`for i in $$bases; do echo $$i; done | sed 's/\.log$$//'`; \ + bases=`echo $$bases` +RECHECK_LOGS = $(TEST_LOGS) +AM_RECURSIVE_TARGETS = check recheck +TEST_SUITE_LOG = test-suite.log +TEST_EXTENSIONS = @EXEEXT@ .test +LOG_DRIVER = $(SHELL) $(top_srcdir)/test-driver +LOG_COMPILE = $(LOG_COMPILER) $(AM_LOG_FLAGS) $(LOG_FLAGS) +am__set_b = \ + case '$@' in \ + */*) \ + case '$*' in \ + */*) b='$*';; \ + *) b=`echo '$@' | sed 's/\.log$$//'`; \ + esac;; \ + *) \ + b='$*';; \ + esac +am__test_logs1 = $(TESTS:=.log) +am__test_logs2 = $(am__test_logs1:@EXEEXT@.log=.log) +TEST_LOGS = $(am__test_logs2:.test.log=.log) +TEST_LOG_DRIVER = $(SHELL) $(top_srcdir)/test-driver +TEST_LOG_COMPILE = $(TEST_LOG_COMPILER) $(AM_TEST_LOG_FLAGS) \ + $(TEST_LOG_FLAGS) +am__DIST_COMMON = $(srcdir)/Makefile.in $(top_srcdir)/depcomp \ + $(top_srcdir)/mkinstalldirs $(top_srcdir)/test-driver README +DISTFILES = $(DIST_COMMON) $(DIST_SOURCES) $(TEXINFOS) $(EXTRA_DIST) +ACLOCAL = @ACLOCAL@ +ACLOCAL_AMFLAGS = @ACLOCAL_AMFLAGS@ +ALL_LINGUAS = @ALL_LINGUAS@ +AMTAR = @AMTAR@ +AM_DEFAULT_VERBOSITY = @AM_DEFAULT_VERBOSITY@ +AUTOCONF = @AUTOCONF@ +AUTOHEADER = @AUTOHEADER@ +AUTOMAKE = @AUTOMAKE@ +AWK = @AWK@ +CATALOGS = @CATALOGS@ +CATOBJEXT = @CATOBJEXT@ +CC = @CC@ +CCDEPMODE = @CCDEPMODE@ +CFLAGS = @CFLAGS@ +CONFIG_STATUS_DEPENDENCIES = @CONFIG_STATUS_DEPENDENCIES@ +CPP = @CPP@ +CPPFLAGS = @CPPFLAGS@ +CXX = @CXX@ +CXXCPP = @CXXCPP@ +CXXDEPMODE = @CXXDEPMODE@ +CXXFLAGS = @CXXFLAGS@ +CYGPATH_W = @CYGPATH_W@ +DATADIRNAME = @DATADIRNAME@ +DB2MAN_XSL = @DB2MAN_XSL@ +DEFS = @DEFS@ +DEPDIR = @DEPDIR@ +DISTCHECK_CONFIGURE_FLAGS = @DISTCHECK_CONFIGURE_FLAGS@ +DOC_USER_FORMATS = @DOC_USER_FORMATS@ +ECHO_C = @ECHO_C@ +ECHO_N = @ECHO_N@ +ECHO_T = @ECHO_T@ +EGREP = @EGREP@ +EXEEXT = @EXEEXT@ +EXPAT_CFLAGS = @EXPAT_CFLAGS@ +EXPAT_LIBS = @EXPAT_LIBS@ +GDK_PIXBUF_CSOURCE = @GDK_PIXBUF_CSOURCE@ +GETTEXT_MACRO_VERSION = @GETTEXT_MACRO_VERSION@ +GETTEXT_PACKAGE = @GETTEXT_PACKAGE@ +GLIB_MKENUMS = @GLIB_MKENUMS@ +GMOFILES = @GMOFILES@ +GMSGFMT = @GMSGFMT@ +GMSGFMT_015 = @GMSGFMT_015@ +GREP = @GREP@ +GTKDOC_CHECK = @GTKDOC_CHECK@ +GTKDOC_CHECK_PATH = @GTKDOC_CHECK_PATH@ +GTKDOC_DEPS_CFLAGS = @GTKDOC_DEPS_CFLAGS@ +GTKDOC_DEPS_LIBS = @GTKDOC_DEPS_LIBS@ +GTKDOC_MKPDF = @GTKDOC_MKPDF@ +GTKDOC_REBASE = @GTKDOC_REBASE@ +HAVE_SCROLLKEEPER = @HAVE_SCROLLKEEPER@ +HELP_DIR = @HELP_DIR@ +HTML_DIR = @HTML_DIR@ +INSTALL = @INSTALL@ +INSTALL_DATA = @INSTALL_DATA@ +INSTALL_PROGRAM = @INSTALL_PROGRAM@ +INSTALL_SCRIPT = @INSTALL_SCRIPT@ +INSTALL_STRIP_PROGRAM = @INSTALL_STRIP_PROGRAM@ +INSTOBJEXT = @INSTOBJEXT@ +INTLLIBS = @INTLLIBS@ +INTLTOOL_EXTRACT = @INTLTOOL_EXTRACT@ +INTLTOOL_MERGE = @INTLTOOL_MERGE@ +INTLTOOL_PERL = @INTLTOOL_PERL@ +INTLTOOL_UPDATE = @INTLTOOL_UPDATE@ +INTLTOOL_V_MERGE = @INTLTOOL_V_MERGE@ +INTLTOOL_V_MERGE_OPTIONS = @INTLTOOL_V_MERGE_OPTIONS@ +INTLTOOL__v_MERGE_ = @INTLTOOL__v_MERGE_@ +INTLTOOL__v_MERGE_0 = @INTLTOOL__v_MERGE_0@ +INTL_MACOSX_LIBS = @INTL_MACOSX_LIBS@ +ISODATE = @ISODATE@ +LDFLAGS = @LDFLAGS@ +LIBCURL = @LIBCURL@ +LIBCURL_CPPFLAGS = @LIBCURL_CPPFLAGS@ +LIBGEOCLUE_CFLAGS = @LIBGEOCLUE_CFLAGS@ +LIBGEOCLUE_LIBS = @LIBGEOCLUE_LIBS@ +LIBICONV = @LIBICONV@ +LIBINTL = @LIBINTL@ +LIBOBJS = @LIBOBJS@ +LIBS = @LIBS@ +LIBZIP_CFLAGS = @LIBZIP_CFLAGS@ +LIBZIP_LIBS = @LIBZIP_LIBS@ +LN_S = @LN_S@ +LTLIBICONV = @LTLIBICONV@ +LTLIBINTL = @LTLIBINTL@ +LTLIBOBJS = @LTLIBOBJS@ +MAKEINFO = @MAKEINFO@ +MKDIR_P = @MKDIR_P@ +MKINSTALLDIRS = @MKINSTALLDIRS@ +MSGFMT = @MSGFMT@ +MSGFMT_015 = @MSGFMT_015@ +MSGFMT_OPTS = @MSGFMT_OPTS@ +MSGMERGE = @MSGMERGE@ +OBJEXT = @OBJEXT@ +OMF_DIR = @OMF_DIR@ +PACKAGE = @PACKAGE@ +PACKAGE_BUGREPORT = @PACKAGE_BUGREPORT@ +PACKAGE_CFLAGS = @PACKAGE_CFLAGS@ +PACKAGE_LIBS = @PACKAGE_LIBS@ +PACKAGE_NAME = @PACKAGE_NAME@ +PACKAGE_STRING = @PACKAGE_STRING@ +PACKAGE_TARNAME = @PACKAGE_TARNAME@ +PACKAGE_URL = @PACKAGE_URL@ +PACKAGE_VERSION = @PACKAGE_VERSION@ +PATH_SEPARATOR = @PATH_SEPARATOR@ +PKG_CONFIG = @PKG_CONFIG@ +PKG_CONFIG_LIBDIR = @PKG_CONFIG_LIBDIR@ +PKG_CONFIG_PATH = @PKG_CONFIG_PATH@ +POFILES = @POFILES@ +POSUB = @POSUB@ +PO_IN_DATADIR_FALSE = @PO_IN_DATADIR_FALSE@ +PO_IN_DATADIR_TRUE = @PO_IN_DATADIR_TRUE@ +RANLIB = @RANLIB@ +SET_MAKE = @SET_MAKE@ +SHELL = @SHELL@ +STRIP = @STRIP@ +USE_NLS = @USE_NLS@ +VERSION = @VERSION@ +XGETTEXT = @XGETTEXT@ +XGETTEXT_015 = @XGETTEXT_015@ +XGETTEXT_EXTRA_OPTIONS = @XGETTEXT_EXTRA_OPTIONS@ +XP = @XP@ +_libcurl_config = @_libcurl_config@ +abs_builddir = @abs_builddir@ +abs_srcdir = @abs_srcdir@ +abs_top_builddir = @abs_top_builddir@ +abs_top_srcdir = @abs_top_srcdir@ +ac_ct_CC = @ac_ct_CC@ +ac_ct_CXX = @ac_ct_CXX@ +am__include = @am__include@ +am__leading_dot = @am__leading_dot@ +am__quote = @am__quote@ +am__tar = @am__tar@ +am__untar = @am__untar@ +bindir = @bindir@ +build = @build@ +build_alias = @build_alias@ +build_cpu = @build_cpu@ +build_os = @build_os@ +build_vendor = @build_vendor@ +builddir = @builddir@ +datadir = @datadir@ +datarootdir = @datarootdir@ +docdir = @docdir@ +dvidir = @dvidir@ +exec_prefix = @exec_prefix@ +host = @host@ +host_alias = @host_alias@ +host_cpu = @host_cpu@ +host_os = @host_os@ +host_vendor = @host_vendor@ +htmldir = @htmldir@ +includedir = @includedir@ +infodir = @infodir@ +install_sh = @install_sh@ +intltool__v_merge_options_ = @intltool__v_merge_options_@ +intltool__v_merge_options_0 = @intltool__v_merge_options_0@ +libdir = @libdir@ +libexecdir = @libexecdir@ +localedir = @localedir@ +localstatedir = @localstatedir@ +mandir = @mandir@ +mkdir_p = @mkdir_p@ +oldincludedir = @oldincludedir@ +pdfdir = @pdfdir@ +prefix = @prefix@ +program_transform_name = @program_transform_name@ +psdir = @psdir@ +runstatedir = @runstatedir@ +sbindir = @sbindir@ +sharedstatedir = @sharedstatedir@ +srcdir = @srcdir@ +sysconfdir = @sysconfdir@ +target = @target@ +target_alias = @target_alias@ +target_cpu = @target_cpu@ +target_os = @target_os@ +target_vendor = @target_vendor@ +top_build_prefix = @top_build_prefix@ +top_builddir = @top_builddir@ +top_srcdir = @top_srcdir@ +AM_CFLAGS = -Wall \ + -I$(top_srcdir)/src \ + $(PACKAGE_CFLAGS) + +LDADD = $(PACKAGE_LIBS) @EXPAT_LIBS@ @LIBCURL@ \ + $(top_builddir)/src/icons/libicons.a $(am__append_1) +TESTS = check_degrees_conversions.sh check_decimal_output.sh \ + check_babel.sh check_gpx.sh check_metatile.sh $(am__append_2) \ + $(am__append_3) +check_SCRIPTS = check_degrees_conversions.sh check_decimal_output.sh \ + check_gpx.sh check_metatile.sh $(am__append_5) $(am__append_6) + +# Scripts and the test data that they use +EXTRA_DIST = check_degrees_conversions.sh \ + check_decimal_output.sh \ + check_babel.sh \ + check_gpx.sh \ + SF\#022.gpx \ + check_md5_hash.sh \ + check_metatile.sh \ + metatile_example/13/0/0/250/220/0.meta \ + check_geotag.sh \ + Stonehenge.jpg \ + ViewFromCribyn-Wales-GPS.jpg + +degrees_converter_SOURCES = degrees_converter.c +degrees_converter_LDADD = \ + $(top_builddir)/src/degrees_converters.o \ + $(LDADD) + +@GEOTAG_TRUE@geotag_read_SOURCES = geotag_read.c +@GEOTAG_TRUE@geotag_read_LDADD = \ +@GEOTAG_TRUE@ $(top_builddir)/src/libviking.a \ +@GEOTAG_TRUE@ $(LDADD) + +@GEOTAG_TRUE@geotag_write_SOURCES = geotag_write.c +@GEOTAG_TRUE@geotag_write_LDADD = \ +@GEOTAG_TRUE@ $(top_builddir)/src/libviking.a \ +@GEOTAG_TRUE@ $(LDADD) + +gpx2gpx_SOURCES = gpx2gpx.c +gpx2gpx_LDADD = \ + $(top_builddir)/src/libviking.a \ + $(LDADD) + +test_vikgotoxmltool_SOURCES = test_vikgotoxmltool.c +test_vikgotoxmltool_LDADD = \ + $(top_builddir)/src/libviking.a \ + $(LDADD) + +test_time_SOURCES = test_time.c +test_time_LDADD = \ + $(top_builddir)/src/libviking.a \ + $(LDADD) + +test_decimal_output_SOURCES = test_decimal_output.c +test_decimal_output_LDADD = \ + $(top_builddir)/src/libviking.a \ + $(LDADD) + +test_coord_conversion_SOURCES = test_coord_conversion.c +test_coord_conversion_LDADD = \ + $(top_builddir)/src/libviking.a \ + $(LDADD) + +test_babel_SOURCES = test_babel.c +test_babel_LDADD = \ + $(top_builddir)/src/libviking.a \ + $(LDADD) + +test_md5_hash_SOURCES = test_md5_hash.c +test_md5_hash_LDADD = \ + $(top_builddir)/src/libviking.a \ + $(LDADD) + +test_metatile_SOURCES = test_metatile.c +test_metatile_LDADD = \ + $(top_builddir)/src/libviking.a \ + $(LDADD) + +all: all-am + +.SUFFIXES: +.SUFFIXES: .c .log .o .obj .test .test$(EXEEXT) .trs +$(srcdir)/Makefile.in: $(srcdir)/Makefile.am $(am__configure_deps) + @for dep in $?; do \ + case '$(am__configure_deps)' in \ + *$$dep*) \ + ( cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh ) \ + && { if test -f $@; then exit 0; else break; fi; }; \ + exit 1;; \ + esac; \ + done; \ + echo ' cd $(top_srcdir) && $(AUTOMAKE) --gnu test/Makefile'; \ + $(am__cd) $(top_srcdir) && \ + $(AUTOMAKE) --gnu test/Makefile +Makefile: $(srcdir)/Makefile.in $(top_builddir)/config.status + @case '$?' in \ + *config.status*) \ + cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh;; \ + *) \ + echo ' cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__maybe_remake_depfiles)'; \ + cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__maybe_remake_depfiles);; \ + esac; + +$(top_builddir)/config.status: $(top_srcdir)/configure $(CONFIG_STATUS_DEPENDENCIES) + cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh + +$(top_srcdir)/configure: $(am__configure_deps) + cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh +$(ACLOCAL_M4): $(am__aclocal_m4_deps) + cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh +$(am__aclocal_m4_deps): + +clean-checkPROGRAMS: + -test -z "$(check_PROGRAMS)" || rm -f $(check_PROGRAMS) + +degrees_converter$(EXEEXT): $(degrees_converter_OBJECTS) $(degrees_converter_DEPENDENCIES) $(EXTRA_degrees_converter_DEPENDENCIES) + @rm -f degrees_converter$(EXEEXT) + $(AM_V_CCLD)$(LINK) $(degrees_converter_OBJECTS) $(degrees_converter_LDADD) $(LIBS) + +geotag_read$(EXEEXT): $(geotag_read_OBJECTS) $(geotag_read_DEPENDENCIES) $(EXTRA_geotag_read_DEPENDENCIES) + @rm -f geotag_read$(EXEEXT) + $(AM_V_CCLD)$(LINK) $(geotag_read_OBJECTS) $(geotag_read_LDADD) $(LIBS) + +geotag_write$(EXEEXT): $(geotag_write_OBJECTS) $(geotag_write_DEPENDENCIES) $(EXTRA_geotag_write_DEPENDENCIES) + @rm -f geotag_write$(EXEEXT) + $(AM_V_CCLD)$(LINK) $(geotag_write_OBJECTS) $(geotag_write_LDADD) $(LIBS) + +gpx2gpx$(EXEEXT): $(gpx2gpx_OBJECTS) $(gpx2gpx_DEPENDENCIES) $(EXTRA_gpx2gpx_DEPENDENCIES) + @rm -f gpx2gpx$(EXEEXT) + $(AM_V_CCLD)$(LINK) $(gpx2gpx_OBJECTS) $(gpx2gpx_LDADD) $(LIBS) + +test_babel$(EXEEXT): $(test_babel_OBJECTS) $(test_babel_DEPENDENCIES) $(EXTRA_test_babel_DEPENDENCIES) + @rm -f test_babel$(EXEEXT) + $(AM_V_CCLD)$(LINK) $(test_babel_OBJECTS) $(test_babel_LDADD) $(LIBS) + +test_coord_conversion$(EXEEXT): $(test_coord_conversion_OBJECTS) $(test_coord_conversion_DEPENDENCIES) $(EXTRA_test_coord_conversion_DEPENDENCIES) + @rm -f test_coord_conversion$(EXEEXT) + $(AM_V_CCLD)$(LINK) $(test_coord_conversion_OBJECTS) $(test_coord_conversion_LDADD) $(LIBS) + +test_decimal_output$(EXEEXT): $(test_decimal_output_OBJECTS) $(test_decimal_output_DEPENDENCIES) $(EXTRA_test_decimal_output_DEPENDENCIES) + @rm -f test_decimal_output$(EXEEXT) + $(AM_V_CCLD)$(LINK) $(test_decimal_output_OBJECTS) $(test_decimal_output_LDADD) $(LIBS) + +test_md5_hash$(EXEEXT): $(test_md5_hash_OBJECTS) $(test_md5_hash_DEPENDENCIES) $(EXTRA_test_md5_hash_DEPENDENCIES) + @rm -f test_md5_hash$(EXEEXT) + $(AM_V_CCLD)$(LINK) $(test_md5_hash_OBJECTS) $(test_md5_hash_LDADD) $(LIBS) + +test_metatile$(EXEEXT): $(test_metatile_OBJECTS) $(test_metatile_DEPENDENCIES) $(EXTRA_test_metatile_DEPENDENCIES) + @rm -f test_metatile$(EXEEXT) + $(AM_V_CCLD)$(LINK) $(test_metatile_OBJECTS) $(test_metatile_LDADD) $(LIBS) + +test_time$(EXEEXT): $(test_time_OBJECTS) $(test_time_DEPENDENCIES) $(EXTRA_test_time_DEPENDENCIES) + @rm -f test_time$(EXEEXT) + $(AM_V_CCLD)$(LINK) $(test_time_OBJECTS) $(test_time_LDADD) $(LIBS) + +test_vikgotoxmltool$(EXEEXT): $(test_vikgotoxmltool_OBJECTS) $(test_vikgotoxmltool_DEPENDENCIES) $(EXTRA_test_vikgotoxmltool_DEPENDENCIES) + @rm -f test_vikgotoxmltool$(EXEEXT) + $(AM_V_CCLD)$(LINK) $(test_vikgotoxmltool_OBJECTS) $(test_vikgotoxmltool_LDADD) $(LIBS) + +mostlyclean-compile: + -rm -f *.$(OBJEXT) + +distclean-compile: + -rm -f *.tab.c + +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/degrees_converter.Po@am__quote@ # am--include-marker +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/geotag_read.Po@am__quote@ # am--include-marker +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/geotag_write.Po@am__quote@ # am--include-marker +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/gpx2gpx.Po@am__quote@ # am--include-marker +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/test_babel.Po@am__quote@ # am--include-marker +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/test_coord_conversion.Po@am__quote@ # am--include-marker +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/test_decimal_output.Po@am__quote@ # am--include-marker +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/test_md5_hash.Po@am__quote@ # am--include-marker +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/test_metatile.Po@am__quote@ # am--include-marker +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/test_time.Po@am__quote@ # am--include-marker +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/test_vikgotoxmltool.Po@am__quote@ # am--include-marker + +$(am__depfiles_remade): + @$(MKDIR_P) $(@D) + @echo '# dummy' >$@-t && $(am__mv) $@-t $@ + +am--depfiles: $(am__depfiles_remade) + +.c.o: +@am__fastdepCC_TRUE@ $(AM_V_CC)depbase=`echo $@ | sed 's|[^/]*$$|$(DEPDIR)/&|;s|\.o$$||'`;\ +@am__fastdepCC_TRUE@ $(COMPILE) -MT $@ -MD -MP -MF $$depbase.Tpo -c -o $@ $< &&\ +@am__fastdepCC_TRUE@ $(am__mv) $$depbase.Tpo $$depbase.Po +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='$<' object='$@' libtool=no @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(COMPILE) -c -o $@ $< + +.c.obj: +@am__fastdepCC_TRUE@ $(AM_V_CC)depbase=`echo $@ | sed 's|[^/]*$$|$(DEPDIR)/&|;s|\.obj$$||'`;\ +@am__fastdepCC_TRUE@ $(COMPILE) -MT $@ -MD -MP -MF $$depbase.Tpo -c -o $@ `$(CYGPATH_W) '$<'` &&\ +@am__fastdepCC_TRUE@ $(am__mv) $$depbase.Tpo $$depbase.Po +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='$<' object='$@' libtool=no @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(COMPILE) -c -o $@ `$(CYGPATH_W) '$<'` + +ID: $(am__tagged_files) + $(am__define_uniq_tagged_files); mkid -fID $$unique +tags: tags-am +TAGS: tags + +tags-am: $(TAGS_DEPENDENCIES) $(am__tagged_files) + set x; \ + here=`pwd`; \ + $(am__define_uniq_tagged_files); \ + shift; \ + if test -z "$(ETAGS_ARGS)$$*$$unique"; then :; else \ + test -n "$$unique" || unique=$$empty_fix; \ + if test $$# -gt 0; then \ + $(ETAGS) $(ETAGSFLAGS) $(AM_ETAGSFLAGS) $(ETAGS_ARGS) \ + "$$@" $$unique; \ + else \ + $(ETAGS) $(ETAGSFLAGS) $(AM_ETAGSFLAGS) $(ETAGS_ARGS) \ + $$unique; \ + fi; \ + fi +ctags: ctags-am + +CTAGS: ctags +ctags-am: $(TAGS_DEPENDENCIES) $(am__tagged_files) + $(am__define_uniq_tagged_files); \ + test -z "$(CTAGS_ARGS)$$unique" \ + || $(CTAGS) $(CTAGSFLAGS) $(AM_CTAGSFLAGS) $(CTAGS_ARGS) \ + $$unique + +GTAGS: + here=`$(am__cd) $(top_builddir) && pwd` \ + && $(am__cd) $(top_srcdir) \ + && gtags -i $(GTAGS_ARGS) "$$here" +cscopelist: cscopelist-am + +cscopelist-am: $(am__tagged_files) + list='$(am__tagged_files)'; \ + case "$(srcdir)" in \ + [\\/]* | ?:[\\/]*) sdir="$(srcdir)" ;; \ + *) sdir=$(subdir)/$(srcdir) ;; \ + esac; \ + for i in $$list; do \ + if test -f "$$i"; then \ + echo "$(subdir)/$$i"; \ + else \ + echo "$$sdir/$$i"; \ + fi; \ + done >> $(top_builddir)/cscope.files + +distclean-tags: + -rm -f TAGS ID GTAGS GRTAGS GSYMS GPATH tags + +# Recover from deleted '.trs' file; this should ensure that +# "rm -f foo.log; make foo.trs" re-run 'foo.test', and re-create +# both 'foo.log' and 'foo.trs'. Break the recipe in two subshells +# to avoid problems with "make -n". +.log.trs: + rm -f $< $@ + $(MAKE) $(AM_MAKEFLAGS) $< + +# Leading 'am--fnord' is there to ensure the list of targets does not +# expand to empty, as could happen e.g. with make check TESTS=''. +am--fnord $(TEST_LOGS) $(TEST_LOGS:.log=.trs): $(am__force_recheck) +am--force-recheck: + @: + +$(TEST_SUITE_LOG): $(TEST_LOGS) + @$(am__set_TESTS_bases); \ + am__f_ok () { test -f "$$1" && test -r "$$1"; }; \ + redo_bases=`for i in $$bases; do \ + am__f_ok $$i.trs && am__f_ok $$i.log || echo $$i; \ + done`; \ + if test -n "$$redo_bases"; then \ + redo_logs=`for i in $$redo_bases; do echo $$i.log; done`; \ + redo_results=`for i in $$redo_bases; do echo $$i.trs; done`; \ + if $(am__make_dryrun); then :; else \ + rm -f $$redo_logs && rm -f $$redo_results || exit 1; \ + fi; \ + fi; \ + if test -n "$$am__remaking_logs"; then \ + echo "fatal: making $(TEST_SUITE_LOG): possible infinite" \ + "recursion detected" >&2; \ + elif test -n "$$redo_logs"; then \ + am__remaking_logs=yes $(MAKE) $(AM_MAKEFLAGS) $$redo_logs; \ + fi; \ + if $(am__make_dryrun); then :; else \ + st=0; \ + errmsg="fatal: making $(TEST_SUITE_LOG): failed to create"; \ + for i in $$redo_bases; do \ + test -f $$i.trs && test -r $$i.trs \ + || { echo "$$errmsg $$i.trs" >&2; st=1; }; \ + test -f $$i.log && test -r $$i.log \ + || { echo "$$errmsg $$i.log" >&2; st=1; }; \ + done; \ + test $$st -eq 0 || exit 1; \ + fi + @$(am__sh_e_setup); $(am__tty_colors); $(am__set_TESTS_bases); \ + ws='[ ]'; \ + results=`for b in $$bases; do echo $$b.trs; done`; \ + test -n "$$results" || results=/dev/null; \ + all=` grep "^$$ws*:test-result:" $$results | wc -l`; \ + pass=` grep "^$$ws*:test-result:$$ws*PASS" $$results | wc -l`; \ + fail=` grep "^$$ws*:test-result:$$ws*FAIL" $$results | wc -l`; \ + skip=` grep "^$$ws*:test-result:$$ws*SKIP" $$results | wc -l`; \ + xfail=`grep "^$$ws*:test-result:$$ws*XFAIL" $$results | wc -l`; \ + xpass=`grep "^$$ws*:test-result:$$ws*XPASS" $$results | wc -l`; \ + error=`grep "^$$ws*:test-result:$$ws*ERROR" $$results | wc -l`; \ + if test `expr $$fail + $$xpass + $$error` -eq 0; then \ + success=true; \ + else \ + success=false; \ + fi; \ + br='==================='; br=$$br$$br$$br$$br; \ + result_count () \ + { \ + if test x"$$1" = x"--maybe-color"; then \ + maybe_colorize=yes; \ + elif test x"$$1" = x"--no-color"; then \ + maybe_colorize=no; \ + else \ + echo "$@: invalid 'result_count' usage" >&2; exit 4; \ + fi; \ + shift; \ + desc=$$1 count=$$2; \ + if test $$maybe_colorize = yes && test $$count -gt 0; then \ + color_start=$$3 color_end=$$std; \ + else \ + color_start= color_end=; \ + fi; \ + echo "$${color_start}# $$desc $$count$${color_end}"; \ + }; \ + create_testsuite_report () \ + { \ + result_count $$1 "TOTAL:" $$all "$$brg"; \ + result_count $$1 "PASS: " $$pass "$$grn"; \ + result_count $$1 "SKIP: " $$skip "$$blu"; \ + result_count $$1 "XFAIL:" $$xfail "$$lgn"; \ + result_count $$1 "FAIL: " $$fail "$$red"; \ + result_count $$1 "XPASS:" $$xpass "$$red"; \ + result_count $$1 "ERROR:" $$error "$$mgn"; \ + }; \ + { \ + echo "$(PACKAGE_STRING): $(subdir)/$(TEST_SUITE_LOG)" | \ + $(am__rst_title); \ + create_testsuite_report --no-color; \ + echo; \ + echo ".. contents:: :depth: 2"; \ + echo; \ + for b in $$bases; do echo $$b; done \ + | $(am__create_global_log); \ + } >$(TEST_SUITE_LOG).tmp || exit 1; \ + mv $(TEST_SUITE_LOG).tmp $(TEST_SUITE_LOG); \ + if $$success; then \ + col="$$grn"; \ + else \ + col="$$red"; \ + test x"$$VERBOSE" = x || cat $(TEST_SUITE_LOG); \ + fi; \ + echo "$${col}$$br$${std}"; \ + echo "$${col}Testsuite summary for $(PACKAGE_STRING)$${std}"; \ + echo "$${col}$$br$${std}"; \ + create_testsuite_report --maybe-color; \ + echo "$$col$$br$$std"; \ + if $$success; then :; else \ + echo "$${col}See $(subdir)/$(TEST_SUITE_LOG)$${std}"; \ + if test -n "$(PACKAGE_BUGREPORT)"; then \ + echo "$${col}Please report to $(PACKAGE_BUGREPORT)$${std}"; \ + fi; \ + echo "$$col$$br$$std"; \ + fi; \ + $$success || exit 1 + +check-TESTS: $(check_PROGRAMS) $(check_SCRIPTS) + @list='$(RECHECK_LOGS)'; test -z "$$list" || rm -f $$list + @list='$(RECHECK_LOGS:.log=.trs)'; test -z "$$list" || rm -f $$list + @test -z "$(TEST_SUITE_LOG)" || rm -f $(TEST_SUITE_LOG) + @set +e; $(am__set_TESTS_bases); \ + log_list=`for i in $$bases; do echo $$i.log; done`; \ + trs_list=`for i in $$bases; do echo $$i.trs; done`; \ + log_list=`echo $$log_list`; trs_list=`echo $$trs_list`; \ + $(MAKE) $(AM_MAKEFLAGS) $(TEST_SUITE_LOG) TEST_LOGS="$$log_list"; \ + exit $$?; +recheck: all $(check_PROGRAMS) $(check_SCRIPTS) + @test -z "$(TEST_SUITE_LOG)" || rm -f $(TEST_SUITE_LOG) + @set +e; $(am__set_TESTS_bases); \ + bases=`for i in $$bases; do echo $$i; done \ + | $(am__list_recheck_tests)` || exit 1; \ + log_list=`for i in $$bases; do echo $$i.log; done`; \ + log_list=`echo $$log_list`; \ + $(MAKE) $(AM_MAKEFLAGS) $(TEST_SUITE_LOG) \ + am__force_recheck=am--force-recheck \ + TEST_LOGS="$$log_list"; \ + exit $$? +check_degrees_conversions.sh.log: check_degrees_conversions.sh + @p='check_degrees_conversions.sh'; \ + b='check_degrees_conversions.sh'; \ + $(am__check_pre) $(LOG_DRIVER) --test-name "$$f" \ + --log-file $$b.log --trs-file $$b.trs \ + $(am__common_driver_flags) $(AM_LOG_DRIVER_FLAGS) $(LOG_DRIVER_FLAGS) -- $(LOG_COMPILE) \ + "$$tst" $(AM_TESTS_FD_REDIRECT) +check_decimal_output.sh.log: check_decimal_output.sh + @p='check_decimal_output.sh'; \ + b='check_decimal_output.sh'; \ + $(am__check_pre) $(LOG_DRIVER) --test-name "$$f" \ + --log-file $$b.log --trs-file $$b.trs \ + $(am__common_driver_flags) $(AM_LOG_DRIVER_FLAGS) $(LOG_DRIVER_FLAGS) -- $(LOG_COMPILE) \ + "$$tst" $(AM_TESTS_FD_REDIRECT) +check_babel.sh.log: check_babel.sh + @p='check_babel.sh'; \ + b='check_babel.sh'; \ + $(am__check_pre) $(LOG_DRIVER) --test-name "$$f" \ + --log-file $$b.log --trs-file $$b.trs \ + $(am__common_driver_flags) $(AM_LOG_DRIVER_FLAGS) $(LOG_DRIVER_FLAGS) -- $(LOG_COMPILE) \ + "$$tst" $(AM_TESTS_FD_REDIRECT) +check_gpx.sh.log: check_gpx.sh + @p='check_gpx.sh'; \ + b='check_gpx.sh'; \ + $(am__check_pre) $(LOG_DRIVER) --test-name "$$f" \ + --log-file $$b.log --trs-file $$b.trs \ + $(am__common_driver_flags) $(AM_LOG_DRIVER_FLAGS) $(LOG_DRIVER_FLAGS) -- $(LOG_COMPILE) \ + "$$tst" $(AM_TESTS_FD_REDIRECT) +check_metatile.sh.log: check_metatile.sh + @p='check_metatile.sh'; \ + b='check_metatile.sh'; \ + $(am__check_pre) $(LOG_DRIVER) --test-name "$$f" \ + --log-file $$b.log --trs-file $$b.trs \ + $(am__common_driver_flags) $(AM_LOG_DRIVER_FLAGS) $(LOG_DRIVER_FLAGS) -- $(LOG_COMPILE) \ + "$$tst" $(AM_TESTS_FD_REDIRECT) +check_geotag.sh.log: check_geotag.sh + @p='check_geotag.sh'; \ + b='check_geotag.sh'; \ + $(am__check_pre) $(LOG_DRIVER) --test-name "$$f" \ + --log-file $$b.log --trs-file $$b.trs \ + $(am__common_driver_flags) $(AM_LOG_DRIVER_FLAGS) $(LOG_DRIVER_FLAGS) -- $(LOG_COMPILE) \ + "$$tst" $(AM_TESTS_FD_REDIRECT) +check_md5_hash.sh.log: check_md5_hash.sh + @p='check_md5_hash.sh'; \ + b='check_md5_hash.sh'; \ + $(am__check_pre) $(LOG_DRIVER) --test-name "$$f" \ + --log-file $$b.log --trs-file $$b.trs \ + $(am__common_driver_flags) $(AM_LOG_DRIVER_FLAGS) $(LOG_DRIVER_FLAGS) -- $(LOG_COMPILE) \ + "$$tst" $(AM_TESTS_FD_REDIRECT) +.test.log: + @p='$<'; \ + $(am__set_b); \ + $(am__check_pre) $(TEST_LOG_DRIVER) --test-name "$$f" \ + --log-file $$b.log --trs-file $$b.trs \ + $(am__common_driver_flags) $(AM_TEST_LOG_DRIVER_FLAGS) $(TEST_LOG_DRIVER_FLAGS) -- $(TEST_LOG_COMPILE) \ + "$$tst" $(AM_TESTS_FD_REDIRECT) +@am__EXEEXT_TRUE@.test$(EXEEXT).log: +@am__EXEEXT_TRUE@ @p='$<'; \ +@am__EXEEXT_TRUE@ $(am__set_b); \ +@am__EXEEXT_TRUE@ $(am__check_pre) $(TEST_LOG_DRIVER) --test-name "$$f" \ +@am__EXEEXT_TRUE@ --log-file $$b.log --trs-file $$b.trs \ +@am__EXEEXT_TRUE@ $(am__common_driver_flags) $(AM_TEST_LOG_DRIVER_FLAGS) $(TEST_LOG_DRIVER_FLAGS) -- $(TEST_LOG_COMPILE) \ +@am__EXEEXT_TRUE@ "$$tst" $(AM_TESTS_FD_REDIRECT) + +distdir: $(BUILT_SOURCES) + $(MAKE) $(AM_MAKEFLAGS) distdir-am + +distdir-am: $(DISTFILES) + @srcdirstrip=`echo "$(srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \ + topsrcdirstrip=`echo "$(top_srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \ + list='$(DISTFILES)'; \ + dist_files=`for file in $$list; do echo $$file; done | \ + sed -e "s|^$$srcdirstrip/||;t" \ + -e "s|^$$topsrcdirstrip/|$(top_builddir)/|;t"`; \ + case $$dist_files in \ + */*) $(MKDIR_P) `echo "$$dist_files" | \ + sed '/\//!d;s|^|$(distdir)/|;s,/[^/]*$$,,' | \ + sort -u` ;; \ + esac; \ + for file in $$dist_files; do \ + if test -f $$file || test -d $$file; then d=.; else d=$(srcdir); fi; \ + if test -d $$d/$$file; then \ + dir=`echo "/$$file" | sed -e 's,/[^/]*$$,,'`; \ + if test -d "$(distdir)/$$file"; then \ + find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \ + fi; \ + if test -d $(srcdir)/$$file && test $$d != $(srcdir); then \ + cp -fpR $(srcdir)/$$file "$(distdir)$$dir" || exit 1; \ + find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \ + fi; \ + cp -fpR $$d/$$file "$(distdir)$$dir" || exit 1; \ + else \ + test -f "$(distdir)/$$file" \ + || cp -p $$d/$$file "$(distdir)/$$file" \ + || exit 1; \ + fi; \ + done +check-am: all-am + $(MAKE) $(AM_MAKEFLAGS) $(check_PROGRAMS) $(check_SCRIPTS) + $(MAKE) $(AM_MAKEFLAGS) check-TESTS +check: check-am +all-am: Makefile +installdirs: +install: install-am +install-exec: install-exec-am +install-data: install-data-am +uninstall: uninstall-am + +install-am: all-am + @$(MAKE) $(AM_MAKEFLAGS) install-exec-am install-data-am + +installcheck: installcheck-am +install-strip: + if test -z '$(STRIP)'; then \ + $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \ + install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \ + install; \ + else \ + $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \ + install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \ + "INSTALL_PROGRAM_ENV=STRIPPROG='$(STRIP)'" install; \ + fi +mostlyclean-generic: + -test -z "$(TEST_LOGS)" || rm -f $(TEST_LOGS) + -test -z "$(TEST_LOGS:.log=.trs)" || rm -f $(TEST_LOGS:.log=.trs) + -test -z "$(TEST_SUITE_LOG)" || rm -f $(TEST_SUITE_LOG) + +clean-generic: + +distclean-generic: + -test -z "$(CONFIG_CLEAN_FILES)" || rm -f $(CONFIG_CLEAN_FILES) + -test . = "$(srcdir)" || test -z "$(CONFIG_CLEAN_VPATH_FILES)" || rm -f $(CONFIG_CLEAN_VPATH_FILES) + +maintainer-clean-generic: + @echo "This command is intended for maintainers to use" + @echo "it deletes files that may require special tools to rebuild." +clean: clean-am + +clean-am: clean-checkPROGRAMS clean-generic mostlyclean-am + +distclean: distclean-am + -rm -f ./$(DEPDIR)/degrees_converter.Po + -rm -f ./$(DEPDIR)/geotag_read.Po + -rm -f ./$(DEPDIR)/geotag_write.Po + -rm -f ./$(DEPDIR)/gpx2gpx.Po + -rm -f ./$(DEPDIR)/test_babel.Po + -rm -f ./$(DEPDIR)/test_coord_conversion.Po + -rm -f ./$(DEPDIR)/test_decimal_output.Po + -rm -f ./$(DEPDIR)/test_md5_hash.Po + -rm -f ./$(DEPDIR)/test_metatile.Po + -rm -f ./$(DEPDIR)/test_time.Po + -rm -f ./$(DEPDIR)/test_vikgotoxmltool.Po + -rm -f Makefile +distclean-am: clean-am distclean-compile distclean-generic \ + distclean-tags + +dvi: dvi-am + +dvi-am: + +html: html-am + +html-am: + +info: info-am + +info-am: + +install-data-am: + +install-dvi: install-dvi-am + +install-dvi-am: + +install-exec-am: + +install-html: install-html-am + +install-html-am: + +install-info: install-info-am + +install-info-am: + +install-man: + +install-pdf: install-pdf-am + +install-pdf-am: + +install-ps: install-ps-am + +install-ps-am: + +installcheck-am: + +maintainer-clean: maintainer-clean-am + -rm -f ./$(DEPDIR)/degrees_converter.Po + -rm -f ./$(DEPDIR)/geotag_read.Po + -rm -f ./$(DEPDIR)/geotag_write.Po + -rm -f ./$(DEPDIR)/gpx2gpx.Po + -rm -f ./$(DEPDIR)/test_babel.Po + -rm -f ./$(DEPDIR)/test_coord_conversion.Po + -rm -f ./$(DEPDIR)/test_decimal_output.Po + -rm -f ./$(DEPDIR)/test_md5_hash.Po + -rm -f ./$(DEPDIR)/test_metatile.Po + -rm -f ./$(DEPDIR)/test_time.Po + -rm -f ./$(DEPDIR)/test_vikgotoxmltool.Po + -rm -f Makefile +maintainer-clean-am: distclean-am maintainer-clean-generic + +mostlyclean: mostlyclean-am + +mostlyclean-am: mostlyclean-compile mostlyclean-generic + +pdf: pdf-am + +pdf-am: + +ps: ps-am + +ps-am: + +uninstall-am: + +.MAKE: check-am install-am install-strip + +.PHONY: CTAGS GTAGS TAGS all all-am am--depfiles check check-TESTS \ + check-am clean clean-checkPROGRAMS clean-generic cscopelist-am \ + ctags ctags-am distclean distclean-compile distclean-generic \ + distclean-tags distdir dvi dvi-am html html-am info info-am \ + install install-am install-data install-data-am install-dvi \ + install-dvi-am install-exec install-exec-am install-html \ + install-html-am install-info install-info-am install-man \ + install-pdf install-pdf-am install-ps install-ps-am \ + install-strip installcheck installcheck-am installdirs \ + maintainer-clean maintainer-clean-generic mostlyclean \ + mostlyclean-compile mostlyclean-generic pdf pdf-am ps ps-am \ + recheck tags tags-am uninstall uninstall-am + +.PRECIOUS: Makefile + + +# Tell versions [3.59,3.63) of GNU make to not export all variables. +# Otherwise a system limit (for SysV at least) may be exceeded. +.NOEXPORT: diff --git a/test/README b/test/README new file mode 100644 index 0000000..42619d1 --- /dev/null +++ b/test/README @@ -0,0 +1,7 @@ +To create the test programs in this directory: + +make check + +To run memory checks eg: + +valgrind --leak-check=full ./gpx2gpx < file.gpx > /dev/null diff --git a/test/SF#022.gpx b/test/SF#022.gpx new file mode 100644 index 0000000..bee6e3b --- /dev/null +++ b/test/SF#022.gpx @@ -0,0 +1,16 @@ + + + SF#022 + + + 834 + + Gorgocil + 40.97486, -3.20034, 834m + Golf Course + + diff --git a/test/Stonehenge.jpg b/test/Stonehenge.jpg new file mode 100644 index 0000000..1410e19 Binary files /dev/null and b/test/Stonehenge.jpg differ diff --git a/test/ViewFromCribyn-Wales-GPS.jpg b/test/ViewFromCribyn-Wales-GPS.jpg new file mode 100644 index 0000000..176c159 Binary files /dev/null and b/test/ViewFromCribyn-Wales-GPS.jpg differ diff --git a/test/check_babel.sh b/test/check_babel.sh new file mode 100755 index 0000000..1d2ced8 --- /dev/null +++ b/test/check_babel.sh @@ -0,0 +1,5 @@ +#!/bin/sh +# Run the test_babel program +# Don't actually care what the output is (i.e. don't care if gpsbabel is available or not) +# Just confirm that the program runs at all +./test_babel 1 0 1 0 1 0 diff --git a/test/check_decimal_output.sh b/test/check_decimal_output.sh new file mode 100755 index 0000000..d8ab813 --- /dev/null +++ b/test/check_decimal_output.sh @@ -0,0 +1,38 @@ +#!/bin/sh +# Copyright: CC0 + +PROG=./test_decimal_output + +check_success () +{ + value=$1 + expected=$2 + result=`$PROG "$value"` + if [ "$result" != "$expected" ]; then + echo "$result != $expected" + exit 1 + fi +} + +# Output on PC AMD64, but probably the same/similar for other systems +# Viking < 1.7 gave: 0.34000000000000002 +check_success "0.34" "0.34" +# Viking < 1.7 gave: 6.9999999999999994e-05 +check_success "0.00007" "0.00007" +# Unreleased Viking < 1.7 including the SF Bug#22 fix gave: 6e-7 +check_success "0.0000006" "0.0000006" + +# Check various pathological cases... +check_success "100000000" "100000000" +check_success "0.00000000000000000000000000000000123" "0" +check_success "0.000000000000000000000123" "0" +check_success "-1.2345678901234567890234567890" "-1.2345678901234567" +check_success "1.2345678901234567890234567890" "1.2345678901234567" +check_success "-0.000000000000000000012345678" "-0.00000000000000000001" +check_success "0.00000000000012345678" "0.00000000000012345678" +check_success "123456789.01234567" "123456789.01234567" +check_success "000012345" "12345" +# Badly truncates, but doesn't crash - not a sensible number anyway! +check_success "12340000000000000000000000000000000" "12340000000000000000000" + +exit 0 diff --git a/test/check_degrees_conversions.sh b/test/check_degrees_conversions.sh new file mode 100755 index 0000000..a6a0b88 --- /dev/null +++ b/test/check_degrees_conversions.sh @@ -0,0 +1,38 @@ +#!/bin/sh + +check_success () +{ + expected=$1 + shift + for value in "$@" + do + result=`./degrees_converter "$value" | cut -d' ' -f3` + diff=`echo "$result - $expected" | bc -l` + if [ $diff != 0 ] + then + echo "$value -> $result != $expected" + exit 1 + fi + done +} + +check_failure () +{ + expected=$1 + shift + for value in "$@" + do + result=`./degrees_converter "$value" | cut -d' ' -f3` + diff=`echo "$result - $expected" | bc -l` + if [ $diff = 0 ] + then + echo "$value -> $result = $expected" + exit 1 + fi + done +} + +check_success 3.5 3.5 330 "330'0.00" +check_failure 3.5 3.6 340 "330'1.00" + +exit 0 diff --git a/test/check_geotag.sh b/test/check_geotag.sh new file mode 100755 index 0000000..4613100 --- /dev/null +++ b/test/check_geotag.sh @@ -0,0 +1,49 @@ +#!/bin/sh + +check_success_read_lat () +{ + expected=$1 + shift + result=$(./geotag_read "$1" | cut -d' ' -f1) + diff=$(echo "$result - $expected" | bc -l) + if [ $diff != 0 ]; then + echo "Expected=$expected but result is=$result" + exit 1 + fi +} + +check_success_read_lon () +{ + expected=$1 + shift + result=$(./geotag_read "$1" | cut -d' ' -f2) + diff=$(echo "$result - $expected" | bc -l) + if [ $diff != 0 ]; then + echo "Expected=$expected but result is=$result" + exit 1 + fi +} + +# Enable running in test directory or via make distcheck when $srcdir is defined +if [ -z "$srcdir" ]; then + srcdir=. +fi + +# Read test +check_success_read_lat 51.881861 $srcdir/ViewFromCribyn-Wales-GPS.jpg +check_success_read_lon -3.419592 $srcdir/ViewFromCribyn-Wales-GPS.jpg + +# Write and then re-read test +cp $srcdir/Stonehenge.jpg tmp.jpg +chmod +w tmp.jpg + +result=$(./geotag_write tmp.jpg) +if [ $? != 0 ]; then + echo "geotag_write failure - result is=$result" + exit 1 +fi +check_success_read_lat 51.179489 tmp.jpg +check_success_read_lon -1.826217 tmp.jpg +rm tmp.jpg + +exit 0 diff --git a/test/check_gpx.sh b/test/check_gpx.sh new file mode 100755 index 0000000..c632a25 --- /dev/null +++ b/test/check_gpx.sh @@ -0,0 +1,16 @@ +#!/bin/sh + +# Enable running in test directory or via make distcheck when $srcdir is defined +if [ -z "$srcdir" ]; then + srcdir=. +fi + +# Avoid creator line as that now has the potential to be changed +# (either via preference setting or version number change) +grep -v "^creator=" $srcdir/SF#022.gpx > $srcdir/SF#022-creator.gpx +result=$(./gpx2gpx < $srcdir/SF#022.gpx | grep -v "^creator=" | grep -vF "Created by:" | diff $srcdir/SF#022-creator.gpx -) +if [ $? != 0 ]; then + echo "gpx2gpx failure" + exit 1 +fi +rm $srcdir/SF#022-creator.gpx diff --git a/test/check_md5_hash.sh b/test/check_md5_hash.sh new file mode 100755 index 0000000..2396617 --- /dev/null +++ b/test/check_md5_hash.sh @@ -0,0 +1,13 @@ +#!/bin/sh +# Copyright: CC0 +test_string="Test hash of this string" + +expected_result=$(echo -n "$test_string" | md5sum | awk '{print $1}') +my_result=$(./test_md5_hash "$test_string") + +if [ "$my_result" = "$expected_result" ]; then + # Success + exit 0 +else + exit 1 +fi diff --git a/test/check_metatile.sh b/test/check_metatile.sh new file mode 100755 index 0000000..7ef033a --- /dev/null +++ b/test/check_metatile.sh @@ -0,0 +1,13 @@ +#!/bin/sh +# Copyright: CC0 +if [ $(echo -n I | od -to2 | awk '{ print substr($2,6,1); exit}') != 1 ]; then + echo "Skipping metatile test on big endian machine" + echo " sample metatile file is only for little endian machines" + exit 0 +fi + +if [ -n "$srcdir" ]; then + ./test_metatile "$srcdir/metatile_example" && rm tilefrommeta.png +else + ./test_metatile && rm tilefrommeta.png +fi diff --git a/test/degrees_converter.c b/test/degrees_converter.c new file mode 100644 index 0000000..1d976ea --- /dev/null +++ b/test/degrees_converter.c @@ -0,0 +1,26 @@ +#include +#include +#include "degrees_converters.h" + +int main(int argc, char *argv[]) { + int i; + gdouble value; + gchar *latDDD, *lonDDD; + gchar *latDMM, *lonDMM; + gchar *latDMS, *lonDMS; + for (i=1 ; i < argc ; i++) { + value = convert_dms_to_dec(argv[i]); + latDDD = convert_lat_dec_to_ddd(value); + lonDDD = convert_lon_dec_to_ddd(value); + latDMM = convert_lat_dec_to_dmm(value); + lonDMM = convert_lon_dec_to_dmm(value); + latDMS = convert_lat_dec_to_dms(value); + lonDMS = convert_lon_dec_to_dms(value); + printf("'%s' -> %f %s %s %s %s %s %s\n", argv[i], value, + latDDD, lonDDD, latDMM, lonDMM, latDMS, lonDMS); + free(latDMS); free(lonDMS); + free(latDMM); free(lonDMM); + free(latDDD); free(lonDDD); + } + return 0; +} diff --git a/test/geotag_read.c b/test/geotag_read.c new file mode 100644 index 0000000..0ef90cc --- /dev/null +++ b/test/geotag_read.c @@ -0,0 +1,21 @@ +// Copyright: CC0 +#include +#include +#include +#include "geotag_exif.h" +#include "vikcoord.h" + +int main(int argc, char *argv[]) +{ +#if !GLIB_CHECK_VERSION(2,36,0) + g_type_init (); +#endif + + if ( argv[1] ) { + struct LatLon ll = a_geotag_get_position ( argv[1] ); + g_printf ( "%.6f %.6f\n", ll.lat, ll.lon ); + } + + return 0; +} + diff --git a/test/geotag_write.c b/test/geotag_write.c new file mode 100644 index 0000000..1944e9b --- /dev/null +++ b/test/geotag_write.c @@ -0,0 +1,27 @@ +// Copyright: CC0 +#include +#include +#include +#include +#include "geotag_exif.h" +#include "vikcoord.h" + +int main(int argc, char *argv[]) +{ +#if !GLIB_CHECK_VERSION(2,36,0) + g_type_init (); +#endif + + int answer = 0; + if ( argv[1] ) { + struct LatLon ll = { 51.179489, -1.826217 }; + VikCoord vc; + vik_coord_load_from_latlon ( &vc, VIK_COORD_LATLON, &ll ); + // NB sqrt(-1) is delibrate to generate a NaN value + // (so no image direction EXIF tags are generated) + answer = a_geotag_write_exif_gps ( argv[1], vc, 0.0, sqrt(-1), WP_IMAGE_DIRECTION_REF_TRUE, TRUE ); + } + + return answer; +} + diff --git a/test/gpx2gpx.c b/test/gpx2gpx.c new file mode 100644 index 0000000..cd341bc --- /dev/null +++ b/test/gpx2gpx.c @@ -0,0 +1,33 @@ +#include +#include "gpx.h" +#include "viklayer.h" +#include "viklayer_defaults.h" +#include "settings.h" +#include "preferences.h" +#include "globals.h" + +int main(int argc, char *argv[]) +{ +#if !GLIB_CHECK_VERSION (2, 36, 0) + g_type_init(); +#endif + // Some stuff must be initialized as it gets auto used + a_settings_init (); + a_preferences_init (); + a_vik_preferences_init (); + a_layer_defaults_init (); + + VikLayer *vl = vik_layer_create (VIK_LAYER_TRW, NULL, FALSE); + VikTrwLayer *trw = VIK_TRW_LAYER (vl); + + a_gpx_read_file(trw, stdin, NULL); + a_gpx_write_file(trw, stdout, NULL, NULL); + // NB no layer_free functions directly visible anymore + // automatically called by layers_panel_finalize cleanup in full Viking program + + a_layer_defaults_uninit (); + a_preferences_uninit (); + a_settings_uninit (); + + return 0; +} diff --git a/test/metatile_example/13/0/0/250/220/0.meta b/test/metatile_example/13/0/0/250/220/0.meta new file mode 100644 index 0000000..237c2c9 Binary files /dev/null and b/test/metatile_example/13/0/0/250/220/0.meta differ diff --git a/test/test_babel.c b/test/test_babel.c new file mode 100644 index 0000000..76f8849 --- /dev/null +++ b/test/test_babel.c @@ -0,0 +1,36 @@ +// Decide the Babel file types capability you wish to list +// e.g. for read support of waypoints, tracks and routes: +// run like: ./test_babel 1 0 1 0 1 0 +#include +#include "babel.h" +#include "preferences.h" + +static void print_file_format (gpointer data, gpointer user_data) +{ + BabelFile *file = (BabelFile*)data; + printf("%s : %d%d%d%d%d%d\n", + file->label, + file->mode.waypointsRead, file->mode.waypointsWrite, + file->mode.tracksRead, file->mode.tracksWrite, + file->mode.routesRead, file->mode.routesWrite); +} + +int main(int argc, char*argv[]) +{ + // Preferences must be initialized as it gets auto used + a_preferences_init (); + + a_babel_init(); + a_babel_post_init (); + + if (argc != 7) return 1; + BabelMode mode = { atoi(argv[1]),atoi(argv[2]),atoi(argv[3]),atoi(argv[4]),atoi(argv[5]),atoi(argv[6]) }; + a_babel_foreach_file_with_mode(mode, print_file_format, NULL); + + a_babel_uninit(); + + a_preferences_uninit (); + + return 0; +} + diff --git a/test/test_coord_conversion.c b/test/test_coord_conversion.c new file mode 100644 index 0000000..6880c3a --- /dev/null +++ b/test/test_coord_conversion.c @@ -0,0 +1,76 @@ +#include +#include "vikwmscmapsource.h" +#include "vikslippymapsource.h" + +void test_coord_to_mapcoord(VikMapSource *source, gdouble lat, gdouble lon, gdouble zoom) +{ + VikCoord vikCoord; + MapCoord mapCoord; + vikCoord.mode = VIK_COORD_LATLON; + vikCoord.east_west = lon; + vikCoord.north_south = lat; + printf("%s: %f %f %f => ", g_type_name(G_OBJECT_TYPE(source)), vikCoord.east_west, vikCoord.north_south, zoom); + vik_map_source_coord_to_mapcoord (source, &vikCoord, zoom, zoom, &mapCoord); + printf("x=%d y=%d\n", mapCoord.x, mapCoord.y); +} + +void test_mapcoord_to_center_coord (VikMapSource *source, int x, int y, int scale) +{ + VikCoord vikCoord; + MapCoord mapCoord; + mapCoord.x = x; + mapCoord.y = y; + mapCoord.scale = scale; + printf("%s: %d %d %d => ", g_type_name(G_OBJECT_TYPE(source)), mapCoord.x, mapCoord.y, scale); + vik_map_source_mapcoord_to_center_coord (source, &mapCoord, &vikCoord); + printf("lon=%f lat=%f\n", vikCoord.east_west, vikCoord.north_south); +} + +int main(int argc, char *argv[]) +{ +#if ! GLIB_CHECK_VERSION (2, 36, 0) + g_type_init(); +#endif + + VikMapSource *spotmaps4osm_wmsc_type = + VIK_MAP_SOURCE(g_object_new(VIK_TYPE_WMSC_MAP_SOURCE, + "id", 202, + "label", "Spotmaps (WMS-C)", + "hostname", "spotmaps.youmapps.org", + "url", "/spotmaps4osm/?LAYERS=spotmaps4osm&SERVICE=SPOTMAPS4OSM&SRS=EPSG:4326&bbox=%s,%s,%s,%s&width=256&height=256", + NULL)); + + VikMapSource *osmarender_type = + VIK_MAP_SOURCE(g_object_new(VIK_TYPE_SLIPPY_MAP_SOURCE, + "id", 12, + "label", "OpenStreetMap (Osmarender)", + "hostname", "tah.openstreetmap.org", + "url", "/Tiles/tile/%d/%d/%d.png", + "check-file-server-time", TRUE, + NULL)); + + gdouble lats[] = { 0, 90, 45, -45, -90 }; + gdouble lons[] = { 0, 180, 90, 45, -45, -90, -180 }; + int scale; + for (scale = 0 ; scale < 18 ; scale++) + { + int i; + for (i=0 ; i +#include +#include +#include +#include "coords.h" + +void out ( double dd ) +{ + char* str = a_coords_dtostr ( dd ); + printf ( "%s\n", str ); + free ( str ); +} + +int main( int argc, char *argv[] ) +{ +#if ! GLIB_CHECK_VERSION (2, 36, 0) + g_type_init(); +#endif + + if ( !argv[1] ) { + g_printerr ( "No number specified\n" ); + return 1; + } + + double dd = strtod ( argv[1], NULL ); + out ( dd ); + return 0; +} diff --git a/test/test_md5_hash.c b/test/test_md5_hash.c new file mode 100644 index 0000000..8c64d43 --- /dev/null +++ b/test/test_md5_hash.c @@ -0,0 +1,24 @@ +// Copyright: CC0 +// Print md5 hash of the given string +#include +#include +#include "md5_hash.h" + +int main(int argc, char *argv[]) +{ +#if !GLIB_CHECK_VERSION(2,36,0) + g_type_init (); +#endif + + if ( !argv[1] ) { + g_printerr ( "Nothing specified\n" ); + return 1; + } + + gchar *hash = md5_hash ( argv[1] ); + g_printf ( "%s\n", hash ); + g_free ( hash ); + + return 0; +} + diff --git a/test/test_metatile.c b/test/test_metatile.c new file mode 100644 index 0000000..c1ede35 --- /dev/null +++ b/test/test_metatile.c @@ -0,0 +1,88 @@ +/* -*- Mode: C; indent-tabs-mode: t; c-basic-offset: 4; tab-width: 4 -*- */ +/* + * viking -- GPS Data and Topo Analyzer, Explorer, and Manager + * + * Copyright (C) 2014, Rob Norris + * + * 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., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA + * + */ +#include +#include +#include +#include +#include +#include +#include +#include +#include + +#include "metatile.h" + +int main ( int argc, char *argv[] ) +{ + const int tile_max = METATILE_MAX_SIZE; + char err_msg[PATH_MAX]; + char *buf; + int len; + int compressed; + + // Could extend to get values from the command-line. + int x = 4051; + int y = 2753; + int z = 13; + //char dir[] = "/var/lib/mod_tile/default"; + char dir[] = "metatile_example"; + // Example defaults to a metatile that was pre generated using mod_tile (on a Little endian machine) + // Equates to 'metatile_example/13/0/0/250/220/0.meta' + // which is Brownsea Island, Dorset, UK (50.69N, 1.96W) + + buf = malloc(tile_max); + if (!buf) { + return 1; + } + + err_msg[0] = 0; + + if ( argc > 1 ) + len = metatile_read(argv[1], x, y, z, buf, tile_max, &compressed, err_msg); + else + len = metatile_read(dir, x, y, z, buf, tile_max, &compressed, err_msg); + + if (len > 0) { + // Do something with buf + // Just dump to a file + FILE *fp; + if (compressed) + fp = fopen( "tilefrommeta.gz" , "w" ); + else + fp = fopen( "tilefrommeta.png" , "w" ); + + if ( fp ) { + fwrite(buf, 1 , len, fp); + fclose(fp); + } + else + fprintf(stderr, "Failed to open file because: %s\n", strerror(errno)); + + free(buf); + return 0; + } + else + fprintf(stderr, "FAILED: %s\n", err_msg); + + free(buf); + return 3; +} diff --git a/test/test_time.c b/test/test_time.c new file mode 100644 index 0000000..34be300 --- /dev/null +++ b/test/test_time.c @@ -0,0 +1,47 @@ +// Copyright: CC0 +// Compare timegm() with util_timegm() +// NB Need to force util_timegm() to use our fallback version +// Otherwise it will be using timegm() +#include +#include +#include +#include "util.h" + +// run like - 'for now': +// ./test_time $(date +"%Y:%m:%d-%H:%M:%S") +// Or manually substitute interesting dates as appropriate +// e.g. '2400:03:01-10:11:12' +int main(int argc, char *argv[]) +{ +#if !GLIB_CHECK_VERSION(2,36,0) + g_type_init (); +#endif + + if ( !argv[1] ) { + g_printerr ( "Nothing specified\n" ); + return 1; + } + + struct tm Time; + Time.tm_wday = 0; + Time.tm_yday = 0; + Time.tm_isdst = 0; // there is no DST in UTC + + sscanf(argv[1], "%d:%d:%d-%d:%d:%d", + &Time.tm_year, &Time.tm_mon, + &Time.tm_mday, &Time.tm_hour, + &Time.tm_min, &Time.tm_sec); + + Time.tm_year -= 1900; + Time.tm_mon -= 1; + + time_t thetime = util_timegm ( &Time ); + + if ( thetime != timegm ( &Time ) ) { + g_printf ("%s - %lu - %lu\n", argv[1], thetime, timegm(&Time)); + g_printf ("diff = %ld\n", (thetime - timegm(&Time))); + return 1; + } + + return 0; +} diff --git a/test/test_vikgotoxmltool.c b/test/test_vikgotoxmltool.c new file mode 100644 index 0000000..191a8ca --- /dev/null +++ b/test/test_vikgotoxmltool.c @@ -0,0 +1,49 @@ +#include +#include "vikgotoxmltool.h" + +void parse(VikGotoTool *tool, gchar *filename) +{ + struct LatLon ll; + ll.lat = NAN; + ll.lon = NAN; + if (vik_goto_tool_parse_file_for_latlon(tool, filename, &ll)) + printf("Found %g %g in %s\n", ll.lat, ll.lon, filename); + else + printf("Failed to parse file %s\n", filename); +} + +int main(int argc, char *argv[]) +{ +#if !GLIB_CHECK_VERSION (2, 36, 0) + g_type_init(); +#endif + + VikGotoXmlTool *with_element = VIK_GOTO_XML_TOOL ( g_object_new ( VIK_GOTO_XML_TOOL_TYPE, "label", "OSM", + "url-format", "http://ws.geonames.org/search?q=%s&maxRows=1&lang=es&style=short", + "lat-path", "/geonames/geoname/lat", + "lon-path", "/geonames/geoname/lng", + NULL ) ); + + VikGotoXmlTool *with_attr = VIK_GOTO_XML_TOOL ( g_object_new ( VIK_GOTO_XML_TOOL_TYPE, "label", "OSM", + "url-format", "http://ws.geonames.org/search?q=%s&maxRows=1&lang=es&style=short", + "lat-path", "/geonames/geoname", + "lat-attr", "lat", + "lon-path", "/geonames/geoname", + "lon-attr", "lng", + NULL ) ); + + VikGotoXmlTool *with_xpath = VIK_GOTO_XML_TOOL ( g_object_new ( VIK_GOTO_XML_TOOL_TYPE, "label", "OSM", + "url-format", "http://ws.geonames.org/search?q=%s&maxRows=1&lang=es&style=short", + "lat-path", "/geonames/geoname@lat", + "lon-path", "/geonames/geoname@lng", + NULL ) ); + + int i; + for (i = 1; i&2; \ + exit 1;; \ + esac; \ + has_opt=no; \ + sane_makeflags=$$MAKEFLAGS; \ + if $(am__is_gnu_make); then \ + sane_makeflags=$$MFLAGS; \ + else \ + case $$MAKEFLAGS in \ + *\\[\ \ ]*) \ + bs=\\; \ + sane_makeflags=`printf '%s\n' "$$MAKEFLAGS" \ + | sed "s/$$bs$$bs[$$bs $$bs ]*//g"`;; \ + esac; \ + fi; \ + skip_next=no; \ + strip_trailopt () \ + { \ + flg=`printf '%s\n' "$$flg" | sed "s/$$1.*$$//"`; \ + }; \ + for flg in $$sane_makeflags; do \ + test $$skip_next = yes && { skip_next=no; continue; }; \ + case $$flg in \ + *=*|--*) continue;; \ + -*I) strip_trailopt 'I'; skip_next=yes;; \ + -*I?*) strip_trailopt 'I';; \ + -*O) strip_trailopt 'O'; skip_next=yes;; \ + -*O?*) strip_trailopt 'O';; \ + -*l) strip_trailopt 'l'; skip_next=yes;; \ + -*l?*) strip_trailopt 'l';; \ + -[dEDm]) skip_next=yes;; \ + -[JT]) skip_next=yes;; \ + esac; \ + case $$flg in \ + *$$target_option*) has_opt=yes; break;; \ + esac; \ + done; \ + test $$has_opt = yes +am__make_dryrun = (target_option=n; $(am__make_running_with_option)) +am__make_keepgoing = (target_option=k; $(am__make_running_with_option)) +pkgdatadir = $(datadir)/@PACKAGE@ +pkgincludedir = $(includedir)/@PACKAGE@ +pkglibdir = $(libdir)/@PACKAGE@ +pkglibexecdir = $(libexecdir)/@PACKAGE@ +am__cd = CDPATH="$${ZSH_VERSION+.}$(PATH_SEPARATOR)" && cd +install_sh_DATA = $(install_sh) -c -m 644 +install_sh_PROGRAM = $(install_sh) -c +install_sh_SCRIPT = $(install_sh) -c +INSTALL_HEADER = $(INSTALL_DATA) +transform = $(program_transform_name) +NORMAL_INSTALL = : +PRE_INSTALL = : +POST_INSTALL = : +NORMAL_UNINSTALL = : +PRE_UNINSTALL = : +POST_UNINSTALL = : +build_triplet = @build@ +host_triplet = @host@ +target_triplet = @target@ +subdir = tools +ACLOCAL_M4 = $(top_srcdir)/aclocal.m4 +am__aclocal_m4_deps = $(top_srcdir)/m4/expat.m4 \ + $(top_srcdir)/m4/gettext.m4 $(top_srcdir)/m4/iconv.m4 \ + $(top_srcdir)/m4/intlmacosx.m4 $(top_srcdir)/m4/lib-ld.m4 \ + $(top_srcdir)/m4/lib-link.m4 $(top_srcdir)/m4/lib-prefix.m4 \ + $(top_srcdir)/m4/libcurl.m4 $(top_srcdir)/m4/nls.m4 \ + $(top_srcdir)/m4/po.m4 $(top_srcdir)/m4/progtest.m4 \ + $(top_srcdir)/configure.ac +am__configure_deps = $(am__aclocal_m4_deps) $(CONFIGURE_DEPENDENCIES) \ + $(ACLOCAL_M4) +DIST_COMMON = $(srcdir)/Makefile.am $(am__DIST_COMMON) +mkinstalldirs = $(SHELL) $(top_srcdir)/mkinstalldirs +CONFIG_HEADER = $(top_builddir)/src/config.h +CONFIG_CLEAN_FILES = +CONFIG_CLEAN_VPATH_FILES = +AM_V_P = $(am__v_P_@AM_V@) +am__v_P_ = $(am__v_P_@AM_DEFAULT_V@) +am__v_P_0 = false +am__v_P_1 = : +AM_V_GEN = $(am__v_GEN_@AM_V@) +am__v_GEN_ = $(am__v_GEN_@AM_DEFAULT_V@) +am__v_GEN_0 = @echo " GEN " $@; +am__v_GEN_1 = +AM_V_at = $(am__v_at_@AM_V@) +am__v_at_ = $(am__v_at_@AM_DEFAULT_V@) +am__v_at_0 = @ +am__v_at_1 = +SOURCES = +DIST_SOURCES = +am__can_run_installinfo = \ + case $$AM_UPDATE_INFO_DIR in \ + n|no|NO) false;; \ + *) (install-info --version) >/dev/null 2>&1;; \ + esac +am__tagged_files = $(HEADERS) $(SOURCES) $(TAGS_FILES) $(LISP) +am__DIST_COMMON = $(srcdir)/Makefile.in $(top_srcdir)/mkinstalldirs \ + README +DISTFILES = $(DIST_COMMON) $(DIST_SOURCES) $(TEXINFOS) $(EXTRA_DIST) +ACLOCAL = @ACLOCAL@ +ACLOCAL_AMFLAGS = @ACLOCAL_AMFLAGS@ +ALL_LINGUAS = @ALL_LINGUAS@ +AMTAR = @AMTAR@ +AM_DEFAULT_VERBOSITY = @AM_DEFAULT_VERBOSITY@ +AUTOCONF = @AUTOCONF@ +AUTOHEADER = @AUTOHEADER@ +AUTOMAKE = @AUTOMAKE@ +AWK = @AWK@ +CATALOGS = @CATALOGS@ +CATOBJEXT = @CATOBJEXT@ +CC = @CC@ +CCDEPMODE = @CCDEPMODE@ +CFLAGS = @CFLAGS@ +CONFIG_STATUS_DEPENDENCIES = @CONFIG_STATUS_DEPENDENCIES@ +CPP = @CPP@ +CPPFLAGS = @CPPFLAGS@ +CXX = @CXX@ +CXXCPP = @CXXCPP@ +CXXDEPMODE = @CXXDEPMODE@ +CXXFLAGS = @CXXFLAGS@ +CYGPATH_W = @CYGPATH_W@ +DATADIRNAME = @DATADIRNAME@ +DB2MAN_XSL = @DB2MAN_XSL@ +DEFS = @DEFS@ +DEPDIR = @DEPDIR@ +DISTCHECK_CONFIGURE_FLAGS = @DISTCHECK_CONFIGURE_FLAGS@ +DOC_USER_FORMATS = @DOC_USER_FORMATS@ +ECHO_C = @ECHO_C@ +ECHO_N = @ECHO_N@ +ECHO_T = @ECHO_T@ +EGREP = @EGREP@ +EXEEXT = @EXEEXT@ +EXPAT_CFLAGS = @EXPAT_CFLAGS@ +EXPAT_LIBS = @EXPAT_LIBS@ +GDK_PIXBUF_CSOURCE = @GDK_PIXBUF_CSOURCE@ +GETTEXT_MACRO_VERSION = @GETTEXT_MACRO_VERSION@ +GETTEXT_PACKAGE = @GETTEXT_PACKAGE@ +GLIB_MKENUMS = @GLIB_MKENUMS@ +GMOFILES = @GMOFILES@ +GMSGFMT = @GMSGFMT@ +GMSGFMT_015 = @GMSGFMT_015@ +GREP = @GREP@ +GTKDOC_CHECK = @GTKDOC_CHECK@ +GTKDOC_CHECK_PATH = @GTKDOC_CHECK_PATH@ +GTKDOC_DEPS_CFLAGS = @GTKDOC_DEPS_CFLAGS@ +GTKDOC_DEPS_LIBS = @GTKDOC_DEPS_LIBS@ +GTKDOC_MKPDF = @GTKDOC_MKPDF@ +GTKDOC_REBASE = @GTKDOC_REBASE@ +HAVE_SCROLLKEEPER = @HAVE_SCROLLKEEPER@ +HELP_DIR = @HELP_DIR@ +HTML_DIR = @HTML_DIR@ +INSTALL = @INSTALL@ +INSTALL_DATA = @INSTALL_DATA@ +INSTALL_PROGRAM = @INSTALL_PROGRAM@ +INSTALL_SCRIPT = @INSTALL_SCRIPT@ +INSTALL_STRIP_PROGRAM = @INSTALL_STRIP_PROGRAM@ +INSTOBJEXT = @INSTOBJEXT@ +INTLLIBS = @INTLLIBS@ +INTLTOOL_EXTRACT = @INTLTOOL_EXTRACT@ +INTLTOOL_MERGE = @INTLTOOL_MERGE@ +INTLTOOL_PERL = @INTLTOOL_PERL@ +INTLTOOL_UPDATE = @INTLTOOL_UPDATE@ +INTLTOOL_V_MERGE = @INTLTOOL_V_MERGE@ +INTLTOOL_V_MERGE_OPTIONS = @INTLTOOL_V_MERGE_OPTIONS@ +INTLTOOL__v_MERGE_ = @INTLTOOL__v_MERGE_@ +INTLTOOL__v_MERGE_0 = @INTLTOOL__v_MERGE_0@ +INTL_MACOSX_LIBS = @INTL_MACOSX_LIBS@ +ISODATE = @ISODATE@ +LDFLAGS = @LDFLAGS@ +LIBCURL = @LIBCURL@ +LIBCURL_CPPFLAGS = @LIBCURL_CPPFLAGS@ +LIBGEOCLUE_CFLAGS = @LIBGEOCLUE_CFLAGS@ +LIBGEOCLUE_LIBS = @LIBGEOCLUE_LIBS@ +LIBICONV = @LIBICONV@ +LIBINTL = @LIBINTL@ +LIBOBJS = @LIBOBJS@ +LIBS = @LIBS@ +LIBZIP_CFLAGS = @LIBZIP_CFLAGS@ +LIBZIP_LIBS = @LIBZIP_LIBS@ +LN_S = @LN_S@ +LTLIBICONV = @LTLIBICONV@ +LTLIBINTL = @LTLIBINTL@ +LTLIBOBJS = @LTLIBOBJS@ +MAKEINFO = @MAKEINFO@ +MKDIR_P = @MKDIR_P@ +MKINSTALLDIRS = @MKINSTALLDIRS@ +MSGFMT = @MSGFMT@ +MSGFMT_015 = @MSGFMT_015@ +MSGFMT_OPTS = @MSGFMT_OPTS@ +MSGMERGE = @MSGMERGE@ +OBJEXT = @OBJEXT@ +OMF_DIR = @OMF_DIR@ +PACKAGE = @PACKAGE@ +PACKAGE_BUGREPORT = @PACKAGE_BUGREPORT@ +PACKAGE_CFLAGS = @PACKAGE_CFLAGS@ +PACKAGE_LIBS = @PACKAGE_LIBS@ +PACKAGE_NAME = @PACKAGE_NAME@ +PACKAGE_STRING = @PACKAGE_STRING@ +PACKAGE_TARNAME = @PACKAGE_TARNAME@ +PACKAGE_URL = @PACKAGE_URL@ +PACKAGE_VERSION = @PACKAGE_VERSION@ +PATH_SEPARATOR = @PATH_SEPARATOR@ +PKG_CONFIG = @PKG_CONFIG@ +PKG_CONFIG_LIBDIR = @PKG_CONFIG_LIBDIR@ +PKG_CONFIG_PATH = @PKG_CONFIG_PATH@ +POFILES = @POFILES@ +POSUB = @POSUB@ +PO_IN_DATADIR_FALSE = @PO_IN_DATADIR_FALSE@ +PO_IN_DATADIR_TRUE = @PO_IN_DATADIR_TRUE@ +RANLIB = @RANLIB@ +SET_MAKE = @SET_MAKE@ +SHELL = @SHELL@ +STRIP = @STRIP@ +USE_NLS = @USE_NLS@ +VERSION = @VERSION@ +XGETTEXT = @XGETTEXT@ +XGETTEXT_015 = @XGETTEXT_015@ +XGETTEXT_EXTRA_OPTIONS = @XGETTEXT_EXTRA_OPTIONS@ +XP = @XP@ +_libcurl_config = @_libcurl_config@ +abs_builddir = @abs_builddir@ +abs_srcdir = @abs_srcdir@ +abs_top_builddir = @abs_top_builddir@ +abs_top_srcdir = @abs_top_srcdir@ +ac_ct_CC = @ac_ct_CC@ +ac_ct_CXX = @ac_ct_CXX@ +am__include = @am__include@ +am__leading_dot = @am__leading_dot@ +am__quote = @am__quote@ +am__tar = @am__tar@ +am__untar = @am__untar@ +bindir = @bindir@ +build = @build@ +build_alias = @build_alias@ +build_cpu = @build_cpu@ +build_os = @build_os@ +build_vendor = @build_vendor@ +builddir = @builddir@ +datadir = @datadir@ +datarootdir = @datarootdir@ +docdir = @docdir@ +dvidir = @dvidir@ +exec_prefix = @exec_prefix@ +host = @host@ +host_alias = @host_alias@ +host_cpu = @host_cpu@ +host_os = @host_os@ +host_vendor = @host_vendor@ +htmldir = @htmldir@ +includedir = @includedir@ +infodir = @infodir@ +install_sh = @install_sh@ +intltool__v_merge_options_ = @intltool__v_merge_options_@ +intltool__v_merge_options_0 = @intltool__v_merge_options_0@ +libdir = @libdir@ +libexecdir = @libexecdir@ +localedir = @localedir@ +localstatedir = @localstatedir@ +mandir = @mandir@ +mkdir_p = @mkdir_p@ +oldincludedir = @oldincludedir@ +pdfdir = @pdfdir@ +prefix = @prefix@ +program_transform_name = @program_transform_name@ +psdir = @psdir@ +runstatedir = @runstatedir@ +sbindir = @sbindir@ +sharedstatedir = @sharedstatedir@ +srcdir = @srcdir@ +sysconfdir = @sysconfdir@ +target = @target@ +target_alias = @target_alias@ +target_cpu = @target_cpu@ +target_os = @target_os@ +target_vendor = @target_vendor@ +top_build_prefix = @top_build_prefix@ +top_builddir = @top_builddir@ +top_srcdir = @top_srcdir@ + +# License: CC0 +EXTRA_DIST = README \ + geo-html2gpx \ + geo-nearest \ + googledirections \ + images2waypoints.pl \ + viking-cache.py + +all: all-am + +.SUFFIXES: +$(srcdir)/Makefile.in: $(srcdir)/Makefile.am $(am__configure_deps) + @for dep in $?; do \ + case '$(am__configure_deps)' in \ + *$$dep*) \ + ( cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh ) \ + && { if test -f $@; then exit 0; else break; fi; }; \ + exit 1;; \ + esac; \ + done; \ + echo ' cd $(top_srcdir) && $(AUTOMAKE) --gnu tools/Makefile'; \ + $(am__cd) $(top_srcdir) && \ + $(AUTOMAKE) --gnu tools/Makefile +Makefile: $(srcdir)/Makefile.in $(top_builddir)/config.status + @case '$?' in \ + *config.status*) \ + cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh;; \ + *) \ + echo ' cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__maybe_remake_depfiles)'; \ + cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__maybe_remake_depfiles);; \ + esac; + +$(top_builddir)/config.status: $(top_srcdir)/configure $(CONFIG_STATUS_DEPENDENCIES) + cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh + +$(top_srcdir)/configure: $(am__configure_deps) + cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh +$(ACLOCAL_M4): $(am__aclocal_m4_deps) + cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh +$(am__aclocal_m4_deps): +tags TAGS: + +ctags CTAGS: + +cscope cscopelist: + + +distdir: $(BUILT_SOURCES) + $(MAKE) $(AM_MAKEFLAGS) distdir-am + +distdir-am: $(DISTFILES) + @srcdirstrip=`echo "$(srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \ + topsrcdirstrip=`echo "$(top_srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \ + list='$(DISTFILES)'; \ + dist_files=`for file in $$list; do echo $$file; done | \ + sed -e "s|^$$srcdirstrip/||;t" \ + -e "s|^$$topsrcdirstrip/|$(top_builddir)/|;t"`; \ + case $$dist_files in \ + */*) $(MKDIR_P) `echo "$$dist_files" | \ + sed '/\//!d;s|^|$(distdir)/|;s,/[^/]*$$,,' | \ + sort -u` ;; \ + esac; \ + for file in $$dist_files; do \ + if test -f $$file || test -d $$file; then d=.; else d=$(srcdir); fi; \ + if test -d $$d/$$file; then \ + dir=`echo "/$$file" | sed -e 's,/[^/]*$$,,'`; \ + if test -d "$(distdir)/$$file"; then \ + find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \ + fi; \ + if test -d $(srcdir)/$$file && test $$d != $(srcdir); then \ + cp -fpR $(srcdir)/$$file "$(distdir)$$dir" || exit 1; \ + find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \ + fi; \ + cp -fpR $$d/$$file "$(distdir)$$dir" || exit 1; \ + else \ + test -f "$(distdir)/$$file" \ + || cp -p $$d/$$file "$(distdir)/$$file" \ + || exit 1; \ + fi; \ + done +check-am: all-am +check: check-am +all-am: Makefile +installdirs: +install: install-am +install-exec: install-exec-am +install-data: install-data-am +uninstall: uninstall-am + +install-am: all-am + @$(MAKE) $(AM_MAKEFLAGS) install-exec-am install-data-am + +installcheck: installcheck-am +install-strip: + if test -z '$(STRIP)'; then \ + $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \ + install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \ + install; \ + else \ + $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \ + install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \ + "INSTALL_PROGRAM_ENV=STRIPPROG='$(STRIP)'" install; \ + fi +mostlyclean-generic: + +clean-generic: + +distclean-generic: + -test -z "$(CONFIG_CLEAN_FILES)" || rm -f $(CONFIG_CLEAN_FILES) + -test . = "$(srcdir)" || test -z "$(CONFIG_CLEAN_VPATH_FILES)" || rm -f $(CONFIG_CLEAN_VPATH_FILES) + +maintainer-clean-generic: + @echo "This command is intended for maintainers to use" + @echo "it deletes files that may require special tools to rebuild." +clean: clean-am + +clean-am: clean-generic mostlyclean-am + +distclean: distclean-am + -rm -f Makefile +distclean-am: clean-am distclean-generic + +dvi: dvi-am + +dvi-am: + +html: html-am + +html-am: + +info: info-am + +info-am: + +install-data-am: + +install-dvi: install-dvi-am + +install-dvi-am: + +install-exec-am: + +install-html: install-html-am + +install-html-am: + +install-info: install-info-am + +install-info-am: + +install-man: + +install-pdf: install-pdf-am + +install-pdf-am: + +install-ps: install-ps-am + +install-ps-am: + +installcheck-am: + +maintainer-clean: maintainer-clean-am + -rm -f Makefile +maintainer-clean-am: distclean-am maintainer-clean-generic + +mostlyclean: mostlyclean-am + +mostlyclean-am: mostlyclean-generic + +pdf: pdf-am + +pdf-am: + +ps: ps-am + +ps-am: + +uninstall-am: + +.MAKE: install-am install-strip + +.PHONY: all all-am check check-am clean clean-generic cscopelist-am \ + ctags-am distclean distclean-generic distdir dvi dvi-am html \ + html-am info info-am install install-am install-data \ + install-data-am install-dvi install-dvi-am install-exec \ + install-exec-am install-html install-html-am install-info \ + install-info-am install-man install-pdf install-pdf-am \ + install-ps install-ps-am install-strip installcheck \ + installcheck-am installdirs maintainer-clean \ + maintainer-clean-generic mostlyclean mostlyclean-generic pdf \ + pdf-am ps ps-am tags-am uninstall uninstall-am + +.PRECIOUS: Makefile + + +# Tell versions [3.59,3.63) of GNU make to not export all variables. +# Otherwise a system limit (for SysV at least) may be exceeded. +.NOEXPORT: diff --git a/tools/README b/tools/README new file mode 100644 index 0000000..953528a --- /dev/null +++ b/tools/README @@ -0,0 +1,40 @@ + TOOLS + ----- + + +A collection of miscellaneous scripts which may help with Viking usage. + + +- viking-cache-mbtile.py + +A Python2 script to create an MBTiles file from a Viking map cache. + +Running the script (with no parameters) will explain the usage. + + +- googledirections + +A bash script to get a route from Google in GPX format. + + ./googledirections "boston, ma" "new york, ny" | ../src/viking - + +Note: routing via online services is built into Viking so this script is now redundant. + + +- images2waypoints.pl + +A Perl script to auto generate basic Viking .vik files for directories containing images. + +View the script itself for a more detailed description. + +Note: Viking can now image open files and creates waypoints for them with the EXIF information. + So again this script less useful. + + +- geo-* scripts +-- geo-html2gpx +-- geo-nearest + +If Viking is compiled with 'enable-geocaches' (the default without it) then it will enable acquire Geocaches from http://www.geocaching.com via these scripts (which will need to be on your $PATH). +The scripts are Public Domain from http://geo.rkkda.com/ +Note if you don't have a premium Geocaching account, getting public available geocaches is very slow. diff --git a/tools/geo-html2gpx b/tools/geo-html2gpx new file mode 100755 index 0000000..06868f3 --- /dev/null +++ b/tools/geo-html2gpx @@ -0,0 +1,2191 @@ +#!/bin/sh + +PROGNAME="$0" + +usage() { + cat < /dev/null + geo-html2gpx *.html > found.gpx +EOF + + exit 1 +} + +# +# Report an error and exit +# +error() { + echo "`basename $PROGNAME`: $1" >&2 + exit 1 +} + +debug() { + if [ $DEBUG -ge $1 ]; then + echo "`basename $PROGNAME`: $2" >&2 + fi +} + +if [ `uname` = 'Darwin' ]; then + awk=gawk + date=gdate +else + awk=awk + date=date +fi + +# +# Read RC file, if there is one +# +USERNAME= +if [ -f $HOME/.georc ]; then + . $HOME/.georc + # N.B. must switch to read_rc_file if LAT/LON is ever needed here +fi +# + +# Process the options +# +POSTPROC="cat" +DEBUG=0 +INCR=0 +NOWPTS=0 +NOZERO=0 +NOHTML=0 +DECODE=1 +NUMLOGS=1000000 +while getopts "beE:iwzl:no:u:D:h?" opt +do + case $opt in + b) POSTPROC="gpsbabel -igpx -f- -ogpx -F-";; + e) DECODE=0;; + E) eval "$OPTARG";; + i) INCR=1;; + l) NUMLOGS="$OPTARG";; + o) POSTPROC="gpsbabel -igpx -f- -o$OPTARG -F-";; + n) NOHTML=1;; + u) USERNAME="$OPTARG";; + w) NOWPTS=1;; + z) NOZERO=1;; + D) DEBUG="$OPTARG";; + h|\?) usage;; + esac +done +shift `expr $OPTIND - 1` + +# +# Main Program +# +YR=`date +"%Y"` + +case `$awk --version` in +"GNU Awk"*) ;; +*) error "awk is not GNU awk!";; +esac + +cat "$@" \ +| tr -d '\001\002\003\004\005\006\007\015\021\022\023\024\026\030' \ +| sed 's/ 0) + rv = rv * 16 + (k-1) + else + break; + } + + return rv +} + +function prsJSON_EncodeAsUTF8( v, s, p1, p2, p3, p4, cs ) +{ + cs = "\200\201\202\203\204\205\206\207\210\211\212\213\214\215\216\217\220\221\222\223\224\225\226\227\230\231\232\233\234\235\236\237\240\241\242\243\244\245\246\247\250\251\252\253\254\255\256\257\260\261\262\263\264\265\266\267\270\271\272\273\274\275\276\277\300\301\302\303\304\305\306\307\310\311\312\313\314\315\316\317\320\321\322\323\324\325\326\327\330\331\332\333\334\335\336\337\340\341\342\343\344\345\346\347\350\351\352\353\354\355\356\357\360\361\362\363\364\365\366\367\370\371\372\373\374\375\376\377" + + if ( v < 128 ) + s = sprintf("%c", v ) + + else if ( v < 2048 ) # 110xxxxx 10xxxxxx + { + p1 = int(v/64) % 32 + p2 = v % 64 + s = substr(cs, 65+p1, 1) substr(cs, p2+1, 1) + } + + else if ( v < 65536 ) # 1110xxxx 10xxxxxx 10xxxxxx + { + p1 = int(v/4096) % 16 + p2 = int(v/64) % 64 + p3 = v % 64 + s = substr(cs, 97+p1, 1) substr(cs, p2+1, 1) substr(cs, p3+1, 1) + } + + else if ( v < 1114112 ) # 11110xxx 10xxxxxx 10xxxxxx 10xxxxxx + { + p1 = int(v/262144) % 8 + p2 = int(v/4096) % 64 + p3 = int(v/64) % 64 + p4 = v % 64 + s = substr(cs, 113+p1, 1) substr(cs, p2+1, 1) substr(cs, p3+1, 1) substr(cs, p4+1, 1) + } + + else + s = "" + + return s; +} + +function prsJSON_UnescapeString(jsonString, matchedString, matchedValue) +{ + if (jsonString == "\"\"") + return "" + + if (jsonString ~ /^".+"$/) + jsonString = substr(jsonString,2,length(jsonString)-2) + + gsub(/\\\\/, "\\u005C", jsonString) + gsub(/\\"/, "\"", jsonString) + gsub(/\\\//, "/", jsonString) + gsub(/\\b/, "\b", jsonString) + gsub(/\\f/, "\f", jsonString) + gsub(/\\n/, "\n", jsonString) + gsub(/\\r/, "\r", jsonString) + gsub(/\\t/, "\t", jsonString) + + if (match(jsonString, /\\[^u]/)) + return "ParseJSON Error: Invalid String at " jsonString + + # handle encoded UTF-16 surrogates + while (match(jsonString, /\\uD[89AaBb][0123456789AaBbCcDdEeFf][0123456789AaBbCcDdEeFf]\\uD[CcDdEeFf][0123456789AaBbCcDdEeFf][0123456789AaBbCcDdEeFf]/)) + { + matchedValue = (prsJSON_hex2num(substr(jsonString, RSTART+2, 4)) % 1024) * 1024 + prsJSON_hex2num(substr(jsonString, RSTART+8, 4)) % 1024 + 65536 + #print matchedValue, substr(jsonString, RSTART+2, 4), substr(jsonString, RSTART+8, 4) + matchedString = prsJSON_EncodeAsUTF8( matchedValue ) + sub(/\\uD[89AaBb][0123456789AaBbCcDdEeFf][0123456789AaBbCcDdEeFf]\\uD[CcDdEeFf][0123456789AaBbCcDdEeFf][0123456789AaBbCcDdEeFf]/, matchedString, jsonString) + } + + while (match(jsonString, /\\u[0123456789AaBbCcDdEeFf][0123456789AaBbCcDdEeFf][0123456789AaBbCcDdEeFf][0123456789AaBbCcDdEeFf]/)) + { + matchedValue = prsJSON_hex2num(substr(jsonString, RSTART+2, 4)) + matchedString = prsJSON_EncodeAsUTF8( matchedValue ) + sub(/\\u[0123456789AaBbCcDdEeFf][0123456789AaBbCcDdEeFf][0123456789AaBbCcDdEeFf][0123456789AaBbCcDdEeFf]/, matchedString, jsonString) + } + + return jsonString; +} + +function prsJSON_ValidString(jsonString) +{ + return jsonString !~ /^ParseJSON Error: Invalid String at / +} + +function prsJSON_SetDataValue(jsonData, prefix, value) +{ + jsonData[prefix] = value +} + +function prsJSON_Error(jsonStringArr, cnt, idx, jsonData, message) +{ + split("", jsonData) + prsJSON_SetDataValue(jsonData, "1", sprintf("ParseJSON Error: %s at ", message) (idx <= cnt ? jsonStringArr[idx] : "")) + split("", jsonStringArr) + return cnt + 1 +} + +function prsJSON_CopyError(jsonData, tv) +{ + split("", jsonData) + prsJSON_SetDataValue(jsonData, "1", tv[1]) +} + +function prsJSON_ParseNumber(jsonStringArr, cnt, idx, jsonData, prefix) +{ + if (idx <= cnt) + { + if (match(jsonStringArr[idx], /^(\-?)(0|[123456789][0123456789]*)(\.[0123456789]+)?([eE][+-]?[0123456789]+)?/)) + { + prsJSON_SetDataValue(jsonData, prefix, substr(jsonStringArr[idx], 1, RLENGTH)) + jsonStringArr[idx] = length(jsonStringArr[idx]) >= RLENGTH+1 ? substr(jsonStringArr[idx], RLENGTH+1) : "" + } + else + idx = prsJSON_Error(jsonStringArr, cnt, idx, jsonData, "Number not found") # starts like a number, but doesnt match the REGEX + } + + return idx +} + +function prsJSON_ParseString(jsonStringArr, cnt, idx, jsonData, prefix, jsonString, idxn, idxs, idxq, t) +{ + if (idx <= cnt && length(jsonStringArr[idx]) > 0 && substr(jsonStringArr[idx], 1, 1) == "\"") + { + idxn = 2 + jsonString = jsonStringArr[idx] + + do + { + t = length(jsonString) >= idxn ? substr(jsonString, idxn) : "" + idxs = index(t, "\\") + idxq = index(t, "\"") + + # no valid close quote found + if (idxq == 0) + { + if (idx == cnt) + break; + + idx++ + jsonString = jsonString "," jsonStringArr[idx] + } + + # a valid close quote was found - not before a slash + if (idxq != 0 && (idxs == 0 || (idxs != 0 && idxq < idxs))) + break; + + if (idxs != 0 && idxq == idxs + 1) # slash quote + idxn = idxn + idxq + + else + idxn = idxn + idxs + 1 + + } while (1) + + if (idxq > 0) + { + t = substr(jsonString, 1, idxn+idxq-1) + if (match(t, /[\001\002\003\004\005\006\007\010\011\012\013\014\015\016\017\020\021\022\023\024\025\026\027\030\031\032\033\034\035\036\037]/) == 0) + { + t = prsJSON_UnescapeString(t) + if ( prsJSON_ValidString(t) ) + { + prsJSON_SetDataValue(jsonData, prefix, t) + jsonStringArr[idx] = length(jsonString) >= idxn+idxq ? substr(jsonString,idxn+idxq) : "" + } + else + idx = prsJSON_Error(jsonStringArr, cnt, idx, jsonData, "Invalid string") + } + else + idx = prsJSON_Error(jsonStringArr, cnt, idx, jsonData, "Invalid character in string") + } + else + idx = prsJSON_Error(jsonStringArr, cnt, idx, jsonData, "Unterminated string") + } + else + idx = prsJSON_Error(jsonStringArr, cnt, idx, jsonData, "String expected") + + return idx +} + +function prsJSON_ParseObject(jsonStringArr, cnt, idx, jsonData, prefix, tv ) +{ + if (idx <= cnt) + { + sub(/^\{[ \t\r\n\f]*/, "", jsonStringArr[idx]) #skip open { and skipwhite + + while (idx <= cnt && length(jsonStringArr[idx]) > 0 && substr(jsonStringArr[idx], 1, 1) != "}") + { + idx = prsJSON_ParseString(jsonStringArr, cnt, idx, tv, "1") + + if (idx <= cnt && length(tv[1]) == 0) + idx = prsJSON_Error(jsonStringArr, cnt, idx, tv, "Empty string used for property name") + + if (idx <= cnt) + { + sub(/^[ \t\r\n\f]+/, "", jsonStringArr[idx]) #skipwhite + + if ( length(jsonStringArr[idx]) > 0 && substr(jsonStringArr[idx], 1, 1) == ":" ) + { + sub(/^:[ \t\r\n\f]*/, "", jsonStringArr[idx]) #skip colon and skipwhite + + if ( length(jsonStringArr[idx]) > 0 ) + { + idx = prsJSON_ParseJSONInt(jsonStringArr, cnt, idx, jsonData, prefix != "" ? prefix SUBSEP tv[1] : tv[1]) + if (idx <= cnt) + { + sub(/^[ \t\r\n\f]+/, "", jsonStringArr[idx]) #skipwhite + + if (length(jsonStringArr[idx]) == 0 && idx < cnt) + { + idx++ + sub(/^[ \t\r\n\f]+/, "", jsonStringArr[idx]) #skipwhite + if (length(jsonStringArr[idx]) == 0 || substr(jsonStringArr[idx], 1, 1) == "}") + idx = prsJSON_Error(jsonStringArr, cnt, idx, jsonData, "Expected object property") + } + + else if (length(jsonStringArr[idx]) == 0 || substr(jsonStringArr[idx], 1, 1) != "}") + idx = prsJSON_Error(jsonStringArr, cnt, idx, jsonData, "Expected object property or closing brace") + } + } + else + idx = prsJSON_Error(jsonStringArr, cnt, idx, jsonData, "Expected JSON value (1)") + } + else + idx = prsJSON_Error(jsonStringArr, cnt, idx, jsonData, "Expected colon") + } + else + prsJSON_CopyError(jsonData, tv) + } + + if (idx <= cnt && (length(jsonStringArr[idx]) == 0 || substr(jsonStringArr[idx], 1, 1) != "}")) + idx = prsJSON_Error(jsonStringArr, cnt, idx, jsonData, "Expected closing brace") + + if (idx <= cnt && length(jsonStringArr[idx]) > 0 && substr(jsonStringArr[idx], 1, 1) == "}") + sub(/^\}[ \t\r\n\f]*/, "", jsonStringArr[idx]) #skip close } and skipwhite + } + + return idx +} + +function prsJSON_ParseArray(jsonStringArr, cnt, idx, jsonData, prefix, ii) +{ + if (idx <= cnt) + { + sub(/^\[[ \t\r\n\f]*/, "", jsonStringArr[idx]) #skip open bracket and skipwhite + ii = 1 + + while (idx <= cnt && length(jsonStringArr[idx]) > 0 && substr(jsonStringArr[idx], 1, 1) != "]") + { + idx = prsJSON_ParseJSONInt(jsonStringArr, cnt, idx, jsonData, prefix != "" ? prefix SUBSEP ii : ii ) + ii++ + + if (idx <= cnt) + { + sub(/^[ \t\r\n\f]+/, "", jsonStringArr[idx]) #skipwhite + + if (length(jsonStringArr[idx]) == 0 && idx < cnt) + { + idx++; + sub(/^[ \t\r\n\f]+/, "", jsonStringArr[idx]) #skipwhite + if (length(jsonStringArr[idx]) == 0 || substr(jsonStringArr[idx], 1, 1) == "]") + idx = prsJSON_Error(jsonStringArr, cnt, idx, jsonData, "Expected array value") + } + + else if (length(jsonStringArr[idx]) == 0 || substr(jsonStringArr[idx], 1, 1) != "]") + idx = prsJSON_Error(jsonStringArr, cnt, idx, jsonData, "Expected array value or closing bracket") + } + } + + if (idx <= cnt && (length(jsonStringArr[idx]) == 0 || substr(jsonStringArr[idx], 1, 1) != "]")) + idx = prsJSON_Error(jsonStringArr, cnt, idx, jsonData, "Expected closing bracket") + + if (idx <= cnt && length(jsonStringArr[idx]) > 0 && substr(jsonStringArr[idx], 1, 1) == "]") + sub(/^\][ \t\r\n\f]*/, "", jsonStringArr[idx]) #skip close bracket and skipwhite + } + + return idx +} + +function prsJSON_ParseJSONInt(jsonStringArr, cnt, idx, jsonData, prefix, tk) +{ + if (idx <= cnt) + { + sub(/^[ \t\r\n\f]+/, "", jsonStringArr[idx]) #skipwhite + + if (length(jsonStringArr[idx]) > 0) + { + tk = substr(jsonStringArr[idx], 1, 1) + if (tk == "\"" && prefix != "") + idx = prsJSON_ParseString(jsonStringArr, cnt, idx, jsonData, prefix) + else if (tk ~ /^[0123456789-]/ && prefix != "") + idx = prsJSON_ParseNumber(jsonStringArr, cnt, idx, jsonData, prefix) + else if (jsonStringArr[idx] ~ /^true/ && prefix != "") + { + prsJSON_SetDataValue(jsonData, prefix, "<>") + jsonStringArr[idx] = length(jsonStringArr[idx]) <= 4 ? "" : substr(jsonStringArr[idx],5) + } + else if (jsonStringArr[idx] ~ /^false/ && prefix != "") + { + prsJSON_SetDataValue(jsonData, prefix, "<>") + jsonStringArr[idx] = length(jsonStringArr[idx]) <= 5 ? "" : substr(jsonStringArr[idx],6) + } + else if (jsonStringArr[idx] ~ /^null/ && prefix != "") + { + prsJSON_SetDataValue(jsonData, prefix, "<>") + jsonStringArr[idx] = length(jsonStringArr[idx]) <= 4 ? "" : substr(jsonStringArr[idx],5) + } + else if (tk == "{") + idx = prsJSON_ParseObject(jsonStringArr, cnt, idx, jsonData, prefix) + else if (tk == "[") + idx = prsJSON_ParseArray(jsonStringArr, cnt, idx, jsonData, prefix) + else + idx = prsJSON_Error(jsonStringArr, cnt, idx, jsonData, "Expected JSON value (2)") + + if (idx <= cnt) + sub(/^[ \t\r\n\f]+/, "", jsonStringArr[idx]) #skipwhite + } + + if (prefix == "" && idx <= cnt && length(jsonStringArr[idx]) != 0) + idx = prsJSON_Error(jsonStringArr, cnt, idx, jsonData, "Expected end of JSON text") + else if (prefix == "" && idx+1 <= cnt) + { + idx++ + idx = prsJSON_Error(jsonStringArr, cnt, idx, jsonData, "Expected end of JSON text (2)") + } + + } + + return idx +} + +# +# JSON Formatting Routines +# + +function useJSON_ArrayCount( possibleArray, a, min, max, cnt, rv) +{ + cnt = 0 + + for ( a in possibleArray ) + { + if (possibleArray[a] "" !~ /^[0123456789][0123456789]*$/) + return -1 + + if ( cnt == 0 ) + { + min = possibleArray[a] + max = possibleArray[a] + } + else + { + if (min == possibleArray[a] || max == possibleArray[a]) + return -1 + + if (possibleArray[a] < min) + min = possibleArray[a] + + if (max < possibleArray[a]) + max = possibleArray[a] + } + + cnt++ + } + + if (min == 1 && max == cnt) + return cnt + + return -1 +} + +function useJSON_GetObjectMembers(jsonSchema, prefix) +{ + if (prefix == "") prefix = "<>" + return prefix in jsonSchema ? jsonSchema[prefix] : "" +} + +# quick sort array arr +function utlJSON_qsortArray(arr, left, right, i, last, t) +{ + if (left >= right) # do nothing if array has less than 2 elements + return + i = left + int((right-left+1)*rand()) + t = arr[left]; + arr[left] = arr[i]; + arr[i] = t + last = left # arr[left] is now partition element + for (i = left+1; i <= right; i++) + { + if (arr[i] < arr[left]) + { + last++ + t = arr[last]; + arr[last] = arr[i]; + arr[i] = t + } + } + t = arr[left]; + arr[left] = arr[last]; + arr[last] = t + utlJSON_qsortArray(arr, left, last-1) + utlJSON_qsortArray(arr, last+1, right) +} + +function useJSON_GetSchema(jsonData, jsonSchema, a, tidx, tv, sv, idx) +{ + split("", jsonSchema) + for (a in jsonData) + { + while (match(a, SUBSEP "[^" SUBSEP "]+$")) + { + tidx = substr(a,1,RSTART-1) + tv = substr(a,RSTART+1) + sv = (tidx in jsonSchema) ? jsonSchema[tidx] : "" + # if ( sv != tv && sv !~ "^" tv SUBSEP && sv !~ SUBSEP tv "$" && sv !~ SUBSEP tv SUBSEP ) + # Rephrase this using index so object member names with regex characters work + if ( sv != tv && index(sv, tv SUBSEP) != 1 && (length(sv) <= length(tv)+1 || substr(sv, length(sv)-length(tv)) != SUBSEP tv) && index(sv, SUBSEP tv SUBSEP) == 0 ) + jsonSchema[tidx] = sv (sv == "" ? "" : SUBSEP) tv + a = tidx + } + + tidx = "<>" + tv = a + sv = (tidx in jsonSchema) ? jsonSchema[tidx] : "" + if ( sv != tv && sv !~ "^" tv SUBSEP && sv !~ SUBSEP tv "$" && sv !~ SUBSEP tv SUBSEP ) + jsonSchema[tidx] = sv (sv == "" ? "" : SUBSEP) tv + } +} + +function useJSON_EscapeString(s, ii, c, t, t2, t3, t4, cs) +{ + cs = "\200\201\202\203\204\205\206\207\210\211\212\213\214\215\216\217\220\221\222\223\224\225\226\227\230\231\232\233\234\235\236\237\240\241\242\243\244\245\246\247\250\251\252\253\254\255\256\257\260\261\262\263\264\265\266\267\270\271\272\273\274\275\276\277\300\301\302\303\304\305\306\307\310\311\312\313\314\315\316\317\320\321\322\323\324\325\326\327\330\331\332\333\334\335\336\337\340\341\342\343\344\345\346\347\350\351\352\353\354\355\356\357\360\361\362\363\364\365\366\367\370\371\372\373\374\375\376\377" + gsub(/\\/, "\\u005C", s) + gsub(/"/, "\\\"", s) + #gsub(/\//, "\\/", s) # required to decode, but not to encode + gsub(/\b/, "\\b", s) + gsub(/\f/, "\\f", s) + gsub(/\n/, "\\n", s) + gsub(/\r/, "\\r", s) + gsub(/\t/, "\\t", s) + + for ( ii = 1 ; ii <= length(s) ; ii++ ) + { + t = substr(s,ii,1) + + if (t == "\000") # having \000 in list below doesnt work in all awks + { + c = 0 + s = (ii > 1 ? substr(s, 1, ii-1) : "") sprintf("\\u%04X", c) (ii==length(s) ? "" : substr(s, ii+1)) + ii += 5 + } + else + { + c = index("\001\002\003\004\005\006\007\010\011\012\013\014\015\016\017\020\021\022\023\024\025\026\027\030\031\032\033\034\035\036\037", t) + c = c == 0 ? -1 : c + + if ( c >= 0 ) + { + s = (ii > 1 ? substr(s, 1, ii-1) : "") sprintf("\\u%04X", c) (ii==length(s) ? "" : substr(s, ii+1)) + ii += 5 + } + } + + t = index(cs, t) + t2 = ii+1 <= length(s) ? index(cs, substr(s,ii+1,1)) : 0 + t3 = ii+2 <= length(s) ? index(cs, substr(s,ii+2,1)) : 0 + t4 = ii+3 <= length(s) ? index(cs, substr(s,ii+3,1)) : 0 + + if ( c < 0 && t > 64 && t <= 96 && ii+1 <= length(s) && t2 > 0 && t2 <= 64) # two character UTF-8 sequence + { + c = (t - 65)*64 + (t2-1) + s = (ii > 1 ? substr(s, 1, ii-1) : "") sprintf("\\u%04X", c) (ii+1==length(s) ? "" : substr(s, ii+2)) + ii += 5 + } + + else if ( c < 0 && t > 96 && t <= 112 && ii+2 <= length(s) && t2 > 0 && t2 <= 64 && t3 > 0 && t3 <= 64) # three character UTF-8 sequence + { + c = (t - 97)*4096 + (t2-1)*64 + (t3-1) + if ( c < 65536 ) + { + s = (ii > 1 ? substr(s, 1, ii-1) : "") sprintf("\\u%04X", c) (ii+2==length(s) ? "" : substr(s, ii+3)) + ii += 5 + } + else + { + # encode in JSON-style with two \u#### UTF-16 surrogates + # printf("1: %08X\n", c) + s = (ii > 1 ? substr(s, 1, ii-1) : "") sprintf("\\u%04X\\u%04X", (c/1024)%1024 + 55296, c%1024 + 56320) (ii+3==length(s) ? "" : substr(s, ii+4)) + ii += 11 + } + } + + # four character UTF-8 sequence, encode in JSON-style with two \u#### UTF-16 surrogates + else if ( c < 0 && t > 112 && t <= 120 && ii+3 <= length(s) && t2 > 0 && t2 <= 64 && t3 > 0 && t3 <= 64 && t4 > 0 && t4 <= 64) + { + c = (t - 113)*262144 + (t2-1)*4096 + (t3-1)*64 + (t4-1) + # printf("2: %08X, %d, %d, %d, %d\n", c, t, t2, t3, t4) + # printf("\\u%04X\\u%04X\n", (c/1024)%1024 + 55296, c%1024 + 56320) + c -= 65536 + s = (ii > 1 ? substr(s, 1, ii-1) : "") sprintf("\\u%04X\\u%04X", (c/1024)%1024 + 55296, c%1024 + 56320) (ii+3==length(s) ? "" : substr(s, ii+4)) + ii += 11 + } + } + + return "\"" s "\"" +} + +function useJSON_GetDataValue(jsonData, prefix) +{ + return prefix in jsonData ? jsonData[prefix] : "<>" +} + +function useJSON_PrettyFormat(s, pretty) +{ + if (s == "" || pretty <= 0) return s + + # dont sprintf the whole thing, some awks have short buffers for sprintf + return sprintf("%*.*s", (pretty-1)*3, (pretty-1)*3, "") s (s == "}" || s == "]" ? "" : "\n") +} + +function useJSON_FormatInt(jsonData, jsonSchema, prefix, pretty, allLines, member, memberArr, memberList, arrCount, a, ii) +{ + memberList = useJSON_GetObjectMembers(jsonSchema, prefix) + + if ( memberList == "" ) + { + a = useJSON_GetDataValue(jsonData, prefix) + if ( a == "<>" ) return "true" + if ( a == "<>" ) return "false" + if ( a == "<>" ) return "null" + if ( a == "<>" ) return "" # <> is a help for dealing with empty arrays and objects + + # if it looks like a number, encode it as such. Cant tell a string from a number. + if (a "" ~ /^(\-?)(0|[123456789][0123456789]*)(\.[0123456789]+)?([eE][+-]?[0123456789]+)?$/) + return a + + return useJSON_EscapeString(a) + } + + split(memberList, memberArr, SUBSEP) + arrCount = useJSON_ArrayCount( memberArr ) + + if ( arrCount >= 0 ) + { + allLines = "[" (pretty == 0 ? "" : "\n") + + for ( ii = 1 ; ii <= arrCount ; ii++ ) + allLines = allLines useJSON_PrettyFormat(useJSON_FormatInt( jsonData, jsonSchema, prefix (prefix == "" ? "" : SUBSEP) ii, (pretty != 0 ? pretty+1 : 0)) (ii < arrCount ? "," : ""), pretty != 0 ? pretty+1 : 0) + allLines = allLines useJSON_PrettyFormat("]", pretty) + + return allLines + } + + allLines = "{" (pretty == 0 ? "" : "\n") + + ii = 0 + + arrCount = 0 + for (a in memberArr) + arrCount++ + + utlJSON_qsortArray(memberArr, 1, arrCount) + + for ( ii = 1 ; ii <= arrCount ; ii++ ) + allLines = allLines useJSON_PrettyFormat(useJSON_EscapeString(memberArr[ii]) (pretty == 0 ? ":" : " : ") useJSON_FormatInt(jsonData, jsonSchema, prefix (prefix == "" ? "" : SUBSEP) memberArr[ii], (pretty != 0 ? pretty+1 : 0)) (ii < arrCount ? "," : ""), pretty != 0 ? pretty+1 : 0) + + allLines = allLines useJSON_PrettyFormat("}", pretty) + + return allLines +} + +# +# Entry Points +# + +# +# ParseJSON : Parse JSON text into an awk array +# +# jsonString : JSON text +# jsonData : array of parsed JSON data +# +# returns : N/A +# +function ParseJSON(jsonString, jsonData, jsonStringArr, cnt) +{ + # newlines split differently in some awks, replace them with formfeeds (also white space) + # if (split("1\n2\n3", jsonData, ",") == 3) # is this an awk that splits newlines differently? + gsub(/\n/, "\f", jsonString) # always replace literal newlines - allows compatibility when testing + + split("", jsonData) # clear the array jsonData + cnt = split(jsonString, jsonStringArr, ",") + prsJSON_ParseJSONInt(jsonStringArr, cnt, 1, jsonData, "") +} + +# +# FormatJSON : Format parsed JSON data back into JSON text +# +# jsonData : array of parsed JSON data +# pretty : 0 = compact format, non-zero = pretty format +# +# returns : string with JSON text +# +function FormatJSON(jsonData, pretty, jsonSchema) +{ + useJSON_GetSchema(jsonData, jsonSchema) + return useJSON_FormatInt(jsonData, jsonSchema, "", pretty ? 1 : 0) +} + +# +# JSONArrayLength : Find number of members in a JSON array +# +# jsonData : array of parsed JSON data +# prefix : array name +# +# returns : number of entries in the array +# +function JSONArrayLength(jsonData, prefix, a, cnt, tv) +{ + cnt = -1 + + for (a in jsonData) + { + if (prefix == "" || index(a, prefix) == 1) + { + tv = substr(a, prefix == "" ? 1 : (1+length(prefix)+1)) + if ( index(tv, SUBSEP) ) + tv = substr(tv, 1, index(tv, SUBSEP)-1) + tv = tv + 0 + if ( tv > cnt ) + cnt = tv + } + } + + return cnt +} + +# +# JSONUnescapeString : turn a JSON-escaped string into UTF-8 +# +# jsonString : the escaped JSON string to convert +# +# returns : the string in UTF-8 +# +function JSONUnescapeString(jsonString) +{ + return prsJSON_UnescapeString(jsonString) +} + +# +# JSONIsTrue : return non-zero if the value is the true value +# +# jsonValue : the value to test +# +# returns : true or false +# +function JSONIsTrue(jsonValue) +{ + return jsonValue == "<>"; +} + +# +# JSONIsFalse : return non-zero if the value is the false value +# +# jsonValue : the value to test +# +# returns : true or false +# +function JSONIsFalse(jsonValue) +{ + return jsonValue == "<>"; +} + +# +# JSONIsNull : return non-zero if the value is the null value +# +# jsonValue : the value to test +# +# returns : true or false +# +function JSONIsNull(jsonValue) +{ + return jsonValue == "<>"; +} + +# +# JSONObjectMembers : get the set of members of an object +# +# jsonData : array of parsed JSON data +# prefix : object name +# memberArr : [out] an array of the names of the object members, if the target was an object or an array +# +# returns : If the target was actually an array rather than an object, the number of elements in the array +# Else, zero if the target was an object or a value +# +function JSONObjectMembers(jsonData, prefix, memberArr, jsonSchema, memberList, rv, a) +{ + useJSON_GetSchema(jsonData, jsonSchema) + memberList = useJSON_GetObjectMembers(jsonSchema, prefix) + + if ( memberList == "" ) + { + split("", memberArr) + return 0 + } + + split(memberList, memberArr, SUBSEP) + rv = useJSON_ArrayCount( memberArr ) + if ( rv == -1 ) # not an array, sort the object member names + { + rv = 0 + for (a in memberArr) + rv++ + + utlJSON_qsortArray(memberArr, 1, rv) + rv = 0 + } + return rv +} +# End of Copyright (c) 2010 Dan Saar + +function debug(lvl, text) { + if (lvl <= DEBUG) + print text > "/dev/stderr" +} + +function wpt_init() { + available = "True" + archived = "False" + sym = "Geocache" + json_log_bool = 0 + logs = "" + logs_section = 0 + hints = "" + lat = "" + yy = 0 + wplist = "" + nattr_yes = 0 + nattr_no = 0 + gs_type = "" +} + +function dec2utf(dec) { + if (dec <= 0x7f) + return sprintf("%c", dec) + else if (dec <= 0x07ff) + return sprintf("%c%c", 0xC0 + rshift(dec, 6), 0x80 + and(dec, 0x3F) ) +} + +function asc2xml(txt, o, ent, dec) { + o = "" + while (match(txt, "&#x[0123456789abcdefABCDEF]*;")) + { + o = o substr(txt, 1, RSTART-1) + ent = toupper(substr(txt, RSTART+3, RLENGTH-4)) + txt = substr(txt, RSTART+RLENGTH) + dec = hex2dec(ent) + o = o dec2utf(dec) + } + txt = o txt + o = "" + while (match(txt, "&#[0123456789]*;")) + { + o = o substr(txt, 1, RSTART-1) + ent = toupper(substr(txt, RSTART+2, RLENGTH-3)) + txt = substr(txt, RSTART+RLENGTH) + dec = ent + 0 + o = o dec2utf(dec) + } + o = o txt + return o +} + +function umlauts(text) { + text = asc2xml(text) + if(0) + { + # Somewhat minimal translation of HTML entities in titles + gsub("ä", "\xc3\xa4", text) + gsub("ä", "\xc3\xa4", text) + gsub("ö", "\xc3\xb6", text) + gsub("ö", "\xc3\xb6", text) + gsub("ü", "\xc3\xbc", text) + gsub("ü", "\xc3\xbc", text) + gsub("Ä", "\xc3\x84", text) + gsub("Ä", "\xc3\x84", text) + gsub("Ö", "\xc3\x96", text) + gsub("Ö", "\xc3\x96", text) + gsub("Ü", "\xc3\x9c", text) + gsub("Ü", "\xc3\x9c", text) + gsub("ß", "\xc3\x9f", text) + gsub("ß", "\xc3\x9f", text) + gsub("°", "\xc2\xb0", text) + gsub("°", "\xc2\xb0", text) + gsub("´", "\xc2\xb4", text) + gsub("´", "\xc2\xb4", text) + } + gsub("&", "\\&", text) + return text +} + +function htmlclean(text) { + gsub(" ", " ", text) + gsub("]*>", "\n", text) + gsub("<[bB][rR][^>]*>", "\n", text) + gsub("<[^>]*>", "", text) + # compress whitespace + gsub("\n\n\n*", "\n\n", text) + gsub("[ \t][ \t]*", " ", text) + return text +} + +function tableclean(text) { + gsub("\n", "", text) + gsub(" ", " ", text) + # translate/remove HTML tags + gsub("]*>", "\n", text) + gsub("]*>", "", text) + gsub("]*>", "", text) + gsub("]*>", "", text) + gsub("", "", text) + gsub("", "\n", text) + gsub("]*>", " | ", text) + gsub("<[^>]*>", "", text) + # compress whitespace + gsub("[ \t][ \t]*", " ", text) + return text +} + +function remdiv(text, tag) { + if (tag != "") + pat = ".*
]*>[ \t\n]*" + else + pat = ".*]*>[ \t\n]*" + sub(pat, "", text) + while (text !~ "/?div") + { + if (getline more <= 0) + break + text = text "\n" more + } + sub("[ \t\n]*
.*", "", text) + debug(3, "Div:\n" text) + return text +} + +function remspan(text, tag) { + if (tag != "") + pat = ".*]*>[ \t\n]*" + else + pat = ".*]*>[ \t\n]*" + sub(pat, "", text) + while (text !~ "/?span") + { + if (getline more <= 0) + break + text = text "\n" more + } + sub("[ \t\n]*.*", "", text) + debug(3, "Span:\n" text) + return text +} + +function remspanlong(text, tag) { + if (tag != "") + pat = ".*]*>[ \t\n]*" + else + pat = ".*]*>[ \t\n]*" + sub(pat, "", text) + # i = "span level" + i = 1; j = 0 + debug(2, length(text) "\t" i " " j++ " " text) + # input is in text + while (i != 0) + { + # emergency exit + if (length(text) > 500000) + { + debug(0, "Warning: logs exceeded 500,000 bytes!") + break + } + # cleanup: remove , adjust "span level" + while (text ~ "") + { + if (text ~ "") + { + --i; sub("", "", text) + } + if (text ~ "") + { + ++i; sub("]*>", "", text) + } + } + debug(2, "=" length(text) "\t" i " " j++ " " text) + # if "span level" down to zero, closing tag reached + if (i == 0) break + # get more input + if (getline more <= 0) + break + text = text "\n" more + debug(2, "+" length(more) "\t" i " " j++ " " more) + } + debug(1, length(text) "\t" i " " j++) + sub("[ \t\n]*.*", "", text) + gsub(" ", " ", text) + if (tag == "CacheLogs") + gsub("]*>", "", text) + debug(3, "SpanLong:\n" text) + return text +} + +function remwaypoints() { + text = "" + while (text !~ "" && text !~ "No additional waypoints to display") + { + if (getline more <= 0) + break + text = text " " more + } + gsub(" ", " ", text) + gsub("\n[ \t]*", "", text) + debug(3, "Waypoints:\n" text "\nEnd Waypoints") + return text + # will return complete table contents! split by instead of + # +} + +function splitwaypoints(waypoints, + line, fld, prefix, lookup, wpname, x, y, lat, lon) { + text="" + # separate lines + split(waypoints, wps, "") + i = 0 + for (wp in wps) + ++i + wp = 1 # skip header line + while (wp < i) + { + ++wp + # get URL from full table line + url = wps[wp] + gsub(".*href=.", "", url) + gsub("\".*", "", url) + if (url !~ "^http:") + { + url = "" + } + else + { + debug(1, "url: " url) + } + # individual fields without leading/trailing blanks, remove HTML tags + split(wps[wp], line, "") + j = 0 + for (fld in line) + { + ++j + debug(2, "Before Line[" fld "]: " line[fld]) + gsub("[ \t]*<[^>]*>", "", line[fld]) + gsub("^[ \t]*", "", line[fld]) + gsub("[ \t]*$", "", line[fld]) + debug(2, "after Line[" fld "]: " line[fld]) + } + # 8 fields: 1st line old style + # 9 fields: 1st line new style + # 4 fields, [1]~"Note:": 2nd line old style + # 4 fields, [2]~"Note:": 2nd line new style + # else: drop + if (j == 8) + { + # main information line, old style (pre-2010/07) + if (!line[3]) continue + prefix = substr(line[3] "00", 1, 2) + lookup = line[4] + wpname = line[5] + lat = toupper(line[6]) + gsub(" *[EW].*", "", lat) + split(lat, y) + lat = y[2] + y[3]/60.0 + if (y[1] == "S") + lat = -lat + lon = toupper(line[6]) + gsub("[NS] *[0-9]*.. *[0-9.]* ", "", lon) + gsub("[^ 0-9.NESW-]", "", lon) + split(lon, x) + lon = x[2] + x[3]/60.0 + if (x[1] == "W") + lon = -lon + text = text sprintf("\nlat=\"%.6f\" lon=\"%.6f\"|%s|%s|%s|%s", + lat, lon, prefix, lookup, wpname, url) + } + else if (j == 9) + { + # main information line, new style (2010/07) + if (!line[4]) continue + prefix = substr(line[4] "00", 1, 2) + lookup = line[5] + wpname = line[6] + lat = toupper(line[7]) + gsub(" *[EW].*", "", lat) + split(lat, y) + lat = y[2] + y[3]/60.0 + if (y[1] == "S") + lat = -lat + lon = toupper(line[7]) + gsub("[NS] *[0-9]*.. *[0-9.]* ", "", lon) + gsub("[^ 0-9.NESW-]", "", lon) + split(lon, x) + lon = x[2] + x[3]/60.0 + if (x[1] == "W") + lon = -lon + text = text sprintf("\nlat=\"%.6f\" lon=\"%.6f\"|%s|%s|%s|%s", + lat, lon, prefix, lookup, wpname, url) + } + else if (j == 4) + { + if (line[1] ~ "Note:") + { + # continuation line, old style + text = text sprintf("|%s", line[2]) + } + else if (line[2] ~ "Note:") + { + # continuation line, new style + text = text sprintf("|%s", line[3]) + } + } + } + debug(3, "Split WPs\n" text) + return text +} + +function wpclean(waypoints, line, fld, prefix, lookup, wpname, coords) { + # simplify Additional Waypoints table: + # prefixedname - name
coordfield
note + text = "" + split(waypoints, wps, "") + i = 0 + for (wp in wps) + ++i + wp = 1 + while (wp < i) + { + ++wp + split(wps[wp], line, "") + j = 0 + for (fld in line) + { + ++j + gsub("[ \t]*<[^>]*>", "", line[fld]) + gsub("^[ \t]*", "", line[fld]) + gsub("[ \t]*$", "", line[fld]) + } + # 8 fields: 1st line old style + # 9 fields: 1st line new style + # 4 fields, [1]~"Note:": 2nd line old style + # 4 fields, [2]~"Note:": 2nd line new style + # else: drop + if (j == 8) + { + # main information line, old style (pre-2010/07) + if (!line[3]) continue + prefix = substr(line[3] "00", 1, 2) substr(gcid, 3) + lookup = line[4] + wpname = line[5] + gsub(" \\(.*\\).*", "", wpname) + coords = toupper(line[6]) + text = text sprintf("%s - %s
%s
", prefix, wpname, coords) + } + else if (j == 9) + { + # main information line, new style (2010/07) + if (!line[4]) continue + prefix = substr(line[4] "00", 1, 2) substr(gcid, 3) + lookup = line[5] + wpname = line[6] + gsub(" \\(.*\\).*", "", wpname) + coords = toupper(line[7]) + text = text sprintf("%s - %s
%s
", prefix, wpname, coords) + } + else if(j == 4) + { + if (line[1] ~ "Note:") + { + # continuation line, old style + text = text sprintf("%s
", line[2]) + } + else if (line[2] ~ "Note:") + { + # continuation line, new style + text = text sprintf("%s
", line[3]) + } + } + } + debug(3, "Clean WPs\n" text) + return text +} + +function hex2dec(x, val) { + for (val = 0; length(x); x = substr(x, 2)) + val = 16*val + index("0123456789ABCDEF", substr(x, 1, 1)) - 1 + return val +} + +# Convert GC0000 to 58913 +function wp2id(wp, val) { + sub("^GC", "", wp) + debug(5, "wp2id: " wp " ...") + if ((length(wp) <= 4) && (wp < "G000")) + { + # old hex style + val = hex2dec(wp) + debug(5, "wp2id hex: " val " ...") + return val + } + # new style, base-31, can have 4 or more places! + set = "0123456789ABCDEFGHJKMNPQRTVWXYZ" + val = 0 + for (pos = 1; pos <= length(wp); ++pos) + { + val *= 31 + val += index(set, substr(wp, pos, 1)) - 1 + } + val = val - 411120 + debug(5, "wp2id id: " val " ...") + return val +} + +# to decode hints: rot13 http://lorance.freeshell.org/rot13/ +function rot13 (string) { + ROTFROM = "nopqrstuvwxyzabcdefghijklmNOPQRSTUVWXYZABCDEFGHIJKLM" + ROTTO = "abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ" + retstr = "" + for (pos = 0; pos < length(string); pos++) + { + char = substr(string,pos + 1,1) + rotpos = index(ROTFROM,char) + if (rotpos > 0) + char = substr(ROTTO,rotpos,1) + retstr = retstr char + } + return retstr +} + +function tagstart(lvl, tag, parms) { + printf "%*s", lvl*2, "" + if (parms == "") + printf "<%s>\n", tag + else + printf "<%s %s>\n", tag, parms +} + +function tagend(lvl, tag) { + printf "%*s", lvl*2, "" + printf "\n", tag +} + +function ee(text) { + gsub(/&/, "\\&", text) + gsub(//, "\\>", text) + return text +} + +function tagtext(lvl, tag, text) { + text = ee(text) + printf "%*s", lvl*2, "" + printf "<%s>%s\n", tag, text, tag +} + +function tagptext(lvl, tag, parms, text) { + text = ee(text) + printf "%*s", lvl*2, "" + printf "<%s %s>%s\n", tag, parms, text, tag +} + +function attr_begin1(gif, id, text) { + debug(1, "attr_begin1: " gif " " id " \"" text "\"") + attr_id[gif] = id; attr_text[gif] = text + debug(1, "attr_id: " attr_id["slealth"]) + debug(1, "attr_id: " attr_id[gif]) +} +function attr_begin() { + # attr_begin1("slealth", 40, "Stealth required") Dont work!!! + attr_id["dog"] = 1; attr_text["dog"] = "Dogs" + attr_id["dogs"] = 1; attr_text["dogs"] = "Dogs" + attr_id["fee"] = 2; attr_text["fee"] = "Access or parking fee" + attr_id["rappelling"] = 3; attr_text["rappelling"] = "Climbing gear" + attr_id["boat"] = 4; attr_text["boat"] = "Boat" + attr_id["scuba"] = 5; attr_text["scuba"] = "Scuba gear" + attr_id["kids"] = 6; attr_text["kids"] = "Recommended for kids" + attr_id["onehour"] = 7; attr_text["onehour"] = "Takes less than an hour" + attr_id["scenic"] = 8; attr_text["scenic"] = "Scenic view" + attr_id["hiking"] = 9; attr_text["hiking"] = "Significant hike" + + attr_id["climbing"] = 10; attr_text["climbing"] = "Difficult climbing" + attr_id["wading"] = 11; attr_text["wading"] = "May require wading" + attr_id["swimming"] = 12; attr_text["swimming"] = "May require swimming" + attr_id["available"] = 13; attr_text["available"] = "Available at all times" + attr_id["night"] = 14; attr_text["night"] = "Recommended at night" + attr_id["winter"] = 15; attr_text["winter"] = "Available during winter" + attr_id["poisonoak"] = 16; attr_text["poisonoak"] = "Poison plants" + attr_id["dangerousanimals"] = 17; attr_text["dangerousanimals"] = "Dangerous Animals" + attr_id["ticks"] = 18; attr_text["ticks"] = "Ticks" + + attr_id["mines"] = 19; attr_text["mines"] = "Abandoned mines" + attr_id["cliff"] = 20; attr_text["cliff"] = "Cliff / falling rocks" + attr_id["hunting"] = 21; attr_text["hunting"] = "Hunting" + attr_id["danger"] = 22; attr_text["danger"] = "Dangerous area" + attr_id["wheelchair"] = 23; attr_text["wheelchair"] ="Wheelchair accessible" + attr_id["parking"] = 24; attr_text["parking"] = "Parking available" + attr_id["public"] = 25; attr_text["public"] = "Public transportation" + attr_id["water"] = 26; attr_text["water"] = "Drinking water nearby" + attr_id["restrooms"] = 27; attr_text["restrooms"] ="Public restrooms nearby" + attr_id["phone"] = 28; attr_text["phone"] = "Telephone nearby" + + attr_id["picnic"] = 29; attr_text["picnic"] = "Picnic tables nearby" + attr_id["camping"] = 30; attr_text["camping"] = "Camping available" + attr_id["bicycles"] = 31; attr_text["bicycles"] = "Bicycles" + attr_id["motorcycles"] = 32; attr_text["motorcycles"] = "Motorcycles" + attr_id["quads"] = 33; attr_text["quads"] = "Quads" + attr_id["jeeps"] = 34; attr_text["jeeps"] = "Off-road vehicles" + attr_id["snowmobiles"] = 35; attr_text["snowmobiles"] = "Snowmobiles" + attr_id["horses"] = 36; attr_text["horses"] = "Horses" + attr_id["campfires"] = 37; attr_text["campfires"] = "Campfires" + attr_id["thorns"] = 38; attr_text["thorns"] = "Thorns" + + attr_id["stealth"] = 39; attr_text["stealth"] = "Stealth required" + attr_id["stroller"] = 40; attr_text["stroller"] = "Stroller accessible" + attr_id["firstaid"] = 41; attr_text["firstaid"] = "Needs maintenance" + attr_id["cow"] = 42; attr_text["cow"] = "Watch for livestock" + attr_id["flashlight"] = 43; attr_text["flashlight"] = "Flashlight required" + attr_id["landf"] = 44; attr_text["landf"] = "Lost And Found Tour" + attr_id["rv"] = 45; attr_text["rv"] = "Recreational Vehicle" + attr_id["field"] = 46; attr_text["field"] = "Field Puzzle" + attr_id["UV"] = 47; attr_text["UV"] = "UV Light Required" + attr_id["snowshoes"] = 48; attr_text["snowshoes"] = "Snowshoes" + + attr_id["skiis"] = 49; attr_text["skiis"] = "Cross Country Skis" + attr_id["s-tool"] = 50; attr_text["s-tool"] = "Special Tool Required" + attr_id["nightcache"] = 51; attr_text["nightcache"] = "Night Cache" + attr_id["parkngrab"] = 52; attr_text["parkngrab"] = "Park and Grab" + attr_id["AbandonedBuilding"] = 53; attr_text["AbandonedBuilding"] = "Abandoned Structure" + attr_id["hike_short"] = 54; attr_text["hike_short"] = "Short hike (less than 1km)" + attr_id["hike_med"] = 55; attr_text["hike_med"] = "Medium hike (1km-10km)" + attr_id["hike_long"] = 56; attr_text["hike_long"] = "Long hike (+10km)" + attr_id["fuel"] = 57; attr_text["fuel"] = "Fuel Nearby" + attr_id["food"] = 58; attr_text["food"] = "Food Nearby" + + attr_id["wirelessbeacon"] = 59; attr_text["wirelessbeacon"] = "Wireless Beacon" + attr_id["partnership"] = 60; attr_text["partnership"] = "Partnership" + attr_id["seasonal"] = 61; attr_text["seasonal"] = "Seasonal Access" + attr_id["tourist"] = 62; attr_text["tourist"] = "Tourist Friendly" + attr_id["treeclimbing"] = 63; attr_text["treeclimbing"] = "Tree Climbing" + attr_id["frontyard"] = 64; attr_text["frontyard"] = "Front Yard (Private Residence)" + attr_id["teamwork"] = 65; attr_text["teamwork"] = "Teamwork Required" +} + +function tagattr(lvl, kind, yesno) { + kind = kind "" + #debug(1, "kind: \"" kind "\"") + if (attr_id[kind] == 0) + return + printf "%*s", lvl*2, "" + printf "", attr_id[kind], yesno + printf "%s", attr_text[kind] + printf "\n" +} + +/cache_types.aspx/ { # gc 02/01/11 + gs_type = $0 + sub(/.* alt=./, "", gs_type) + sub(/. width=.*/, "", gs_type) + sub(/. title=.*/, "", gs_type) + debug(1, "gs_type: " gs_type) +} +// { + if (gs_type) + { + gs_name = remspan($0, "ctl00_ContentBody_CacheName") + next + } + gs_type = $0 + sub(/.* alt=./, "", gs_type) + sub(/. width=.*/, "", gs_type) + debug(1, "type: " gs_type) +} +// { gs_name = remspan($0, "CacheName") } +// { + gs_name = remspan($0, "ctl00_ContentBody_CacheName") +} +// { gcid = remspan($0) } +/;wp=GC.*" / { + # new way, yech! + gcid = $0; sub(/.*wp=/, "", gcid); sub(/".*/, "", gcid) +} +// { + gs_short_description = remspan($0) +} +// { + gs_long_description = remspanlong($0, "LongDescription") + waypoints = "" +} +// { + gs_long_description = remspanlong($0, "ctl00_ContentBody_LongDescription") + waypoints = "" +} +/
", "\n", hints) + if (DECODE) + hints=rot13(hints) +} +/", "", hints) + sub(".*", "", hints) + gsub("
", "\n", hints) + # debug(1, "Hints: " hints) + if (DECODE) + hints=rot13(hints) +} +/Additional Waypoints/ { + waypoints = remwaypoints() + wplist = splitwaypoints(waypoints) +} +/Additional Waypoints/ { + waypoints = remwaypoints() + wplist = splitwaypoints(waypoints) +} +# 03/01/2011 +/ContentBody_WaypointsInfo/ { + waypoints = remwaypoints() + wplist = splitwaypoints(waypoints) +} +/class="LogsTable Table"/ { # old + logs_section = 1 +} +/class="LogsTable"/ { # new 06/28/11 + logs_section = 1 +} +(logs_section > 0) { + logs = logs $0 +} +(logs_section > 0) && / 0) && /<\/table>/ { + logs_section -= 1 +} + +// { + logs = remspanlong($0, "CacheLogs") + # remove header which does not exist >2010-01-12 + sub(".*td class=.containerHeader.>Cache Logs", "", logs) +} +// { + logs = remspanlong($0, "ctl00_ContentBody_CacheLogs") +} +// { stats = remspan($0) } +// { + numvisits = remspan($0) + debug(1, numvisits) +} + +/lnkPrintFriendly/ { + gid = $0 + if (gid ~ /ID=/) + { + # Printable page has ID number + sub(/^.*ID=/, "", gid) + sub(/&.*/, "", gid) + } + else + { + # Non-printable page has guid number + sub(/^.*guid=/, "", gid) + sub(/&.*/, "", gid) + } +} +# Add optional "A cache ". 08/21/2012 +/^ *(A cache )*by /, "", gs_owner) + sub(/<.*/, "", gs_owner) + debug(1, "owner: " gs_owner) + gs_guid = $0 + sub(/.*guid=/, "", gs_guid) + sub(/&.*/, "", gs_guid) +} +# Fake gs_guid is user 03/01/2011 +/userInfo = {ID:/ { + gs_guid = $0 + sub(/.*: /, "", gs_guid) + sub(/}.*/, "", gs_guid) + debug(1, "guid " gs_guid) +} +/.* alt=.Size/ { + gs_size = $0 + sub(/.*Size: /, "", gs_size); sub(". />.*", "", gs_size) +} +/by /, "", gs_owner); sub(/ [[].*/, "", gs_owner) + debug(1, gs_owner) + sub(/]*>/, "", gs_owner) + sub(/<.a[^>]*>/, "", gs_owner) + sub(/.*
/, "", gs_owner) + sub(/^by /, "", gs_owner) + debug(1, "owner " gs_owner) + gs_size = text; sub(/.*Size: /, "", gs_size); sub(/<.*/, "", gs_size) + gs_guid = text; sub(/.*guid=/, "", gs_guid) + sub(/&.*/, "", gs_guid) + debug(1, "guid " gs_guid) +} +//, "", gs_type) + debug(1, "gs_type: " gs_type) + + gs_owner = text + sub(/.*ds=2.>/, "", gs_owner); sub(/<.*/, "", gs_owner) + debug(1, "gs_owner: " gs_owner) + + gs_size = text; sub(/.*Size: /, "", gs_size); sub(/<.*/, "", gs_size) + gs_guid = text; sub(/.*guid=/, "", gs_guid) + sub(/&.*/, "", gs_guid) + sub(/. title=.*/, "", gs_guid) + debug(1, "guid: " gs_guid) +} +/Hidden/ { # gc 2/1/11 + getline time + getline time + sub(/^ */, "", time) + sub(/<.*/, "", time) + split(time, fld, "/") + time = sprintf("%d-%02d-%02d", fld[3], fld[1], fld[2]) + debug(1, "time: " time) +} +/> / { # gc 6/28/11 + getline time + getline time + getline time + sub(/^ */, "", time) + sub(/<.*/, "", time) + gsub(/-/, "/", time) + rc = split(time, fld, "/") + if (rc == 1) + rc = split(time, fld, "-") + debug(1, "timerc: " rc) + if (DATEFMT == 1) + time = sprintf("%d-%02d-%02d", fld[3], fld[2], fld[1]) + else if (fld[1] >= 1000) + time = sprintf("%d-%02d-%02d", fld[1], fld[2], fld[3]) + else + time = sprintf("%d-%02d-%02d", fld[3], fld[1], fld[2]) + debug(1, "time: " time) +} +// { + getline text + time = remspan($0) + split(time, fld, "/") + time = sprintf("%d-%02d-%02d", fld[3], fld[1], fld[2]) +} +// { + time = remspan($0, "ctl00_ContentBody_DateHidden") + rc = split(time, fld, "/") + if (rc == 3) + { + time = sprintf("%d-%02d-%02d", fld[3], fld[1], fld[2]) + debug(1, "time: " time) + next + } + rc = split(time, fld, ",") + if (rc == 3) + { + yyyy = fld[3]; + split(fld[2], fld, " ") + mm = Month[ fld[1] ] + dd = fld[2] + time = sprintf("%d-%02d-%02d", yyyy, mm, dd) + debug(1, "time: " time) + next + } + time = "" +} +/ctl00_ContentBody_uxLegendScale/ { + text = $0 + sub(/.*alt=./, "", text); sub(/ .*/, "", text) + gs_diff = text + debug(1 , "gs_diff: " gs_diff) +} +/ctl00_ContentBody_Localize/ { + text = $0 + sub(/.*alt=./, "", text); sub(/ .*/, "", text) + gs_terr = text + debug(1 , "gs_terr: " gs_terr) +} +/^ *Difficulty:<.strong>/ { + getline text + sub(/.*alt=./, "", text); sub(/ .*/, "", text) + gs_diff = text + debug(1 , "gs_diff: " gs_diff) +} +/^ *Difficulty:/ { # gc 2/1/11 + getline text + getline text + getline text + sub(/.*alt=./, "", text); sub(/ .*/, "", text) + gs_diff = text + debug(1 , "gs_diff: " gs_diff) +} +// { + text = remspan($0) + sub(/.*alt=./, "", text); sub(/ .*/, "", text) + gs_diff = text +} +// { + text = remspan($0, "ctl00_ContentBody_Difficulty") + sub(/.*alt=./, "", text); sub(/ .*/, "", text) + debug(1, "difficulty " text) + gs_diff = text +} +/^ *Terrain:<.strong>/ { + getline text + sub(/.*alt=./, "", text); sub(/ .*/, "", text) + gs_terr = text + debug(1 , "gs_terr: " gs_terr) +} +/^ *Terrain:/ { # gc 2/1/11 + getline text + getline text + getline text + sub(/.*alt=./, "", text); sub(/ .*/, "", text) + gs_terr = text + debug(1 , "gs_terr: " gs_terr) +} +// { + text = remspan($0) + sub(/.*alt=./, "", text); sub(/ .*/, "", text) + gs_terr = text +} +// { + text = remspan($0, "ctl00_ContentBody_Terrain") + sub(/.*alt=./, "", text); sub(/ .*/, "", text) + debug(1, "terrain " text) + gs_terr = text +} +/title=.What are Attributes?/ { + text = $0 + debug(5, "Attr " text) + gsub("[^/, "", text) + # after 06/03/10 + gsub(/alt="[^"]*" title="[^"]*" width="30" height="30" .>/, "", text) + gsub("

/ { + if ((lat == "") || (lon == "")) + { + debug(0, "Waypoint coordinates not found for " gcid ", no output!") + #next + } + + # too long a block to be indented + if (!INCR && first) + { + print "" + tagstart(0, "gpx") + tagtext(1, "desc", "Geocache file generated by geo-html2gpx") + tagtext(1, "author", "geo-html2gpx") + "date +%Y-%m-%dT%H:%M:%S" | getline date + tagtext(1, "time", date) + first = 0 + } + + gs_name = umlauts(gs_name) + gs_owner = umlauts(gs_owner) + + tagstart(1, "wpt", "lat=\"" lat "\" lon=\"" lon "\"") + if (time != "") + tagtext(2, "time", time "T07:00:00Z") + tagtext(2, "name", gcid) + tagtext(2, "desc", gs_name " by " gs_owner ", " \ + gs_type " (" gs_diff "/" gs_terr ")") + + # alternate URL... tagtext(2, "url", BaseURL "?wp=" gcid) + # alternate URL... tagtext(2, "url", BaseURL "?id=" gid) + tagtext(2, "url", BaseURL "?wp=" gcid) + tagtext(2, "urlname", gs_name) + + # we do this last... tagtext(2, "sym", sym) + + tagtext(2, "type", "Geocache|" gs_type) + + # FIXME? GC-written GPX files contain numeric, non-UUID, + # cache/owner/finder ids + # Oregon needs numeric cache id, or behaves erratically! + gid = wp2id(gcid) + tagstart(2, "groundspeak:cache", + "id=\"" gid "\" available=\"" available \ + "\" archived=\"" archived "\"" \ + " xmlns:groundspeak=\"http://www.groundspeak.com/cache/1/0/1\"") + tagtext(3, "groundspeak:name", gs_name) + tagtext(3, "groundspeak:placed_by", gs_owner) + tagptext(3,"groundspeak:owner", "id=\"" gs_guid "\"", gs_owner) + tagtext(3, "groundspeak:type", gs_type) + tagtext(3, "groundspeak:container", gs_size) + + if (nattr_yes != 0 || nattr_no != 0) + { + tagstart(3, "groundspeak:attributes") + for (i = 1; i <= nattr_yes; ++i) + tagattr(4, attr_yes[i], 1) + for (i = 1; i <= nattr_no; ++i) + tagattr(4, attr_no[i], 0) + tagend(3, "groundspeak:attributes") + } + + tagtext(3, "groundspeak:difficulty", gs_diff) + tagtext(3, "groundspeak:terrain", gs_terr) + tagtext(3, "groundspeak:country", gs_country) + tagtext(3, "groundspeak:state", gs_state) + if (!NOHTML) + { + tagptext(3, "groundspeak:short_description", "html=\"True\"", + gs_short_description) + if (!NOWPTS && waypoints) + { + # reproduce "simplified table" by GC PQ + # prefixed_gcid - wpname
original_style_coord
note
+ waypoints = wpclean(waypoints) + # include "zero" waypoints here! + gs_long_description = gs_long_description \ + "

Additional Waypoints

" waypoints + } + tagptext(3, "groundspeak:long_description", "html=\"True\"", + gs_long_description) + } + else + { + gs_short_description = htmlclean(gs_short_description) + tagptext(3, "groundspeak:short_description", "html=\"False\"", + gs_short_description) + gs_long_description = htmlclean(gs_long_description) + if (waypoints) + gs_long_description = gs_long_description \ + "\n\nAdditional Waypoints\n" tableclean(waypoints) + tagptext(3, "groundspeak:long_description", "html=\"False\"", + gs_long_description) + } + tagtext(3, "groundspeak:encoded_hints", hints) + + if (json_log_bool) + { + nlogs = JSONArrayLength(json_logs, "data") + if (nlogs > NUMLOGS+1) + nlogs = NUMLOGS+1 + debug(1, "New Logs: " nlogs) + if (nlogs > 1) + tagstart(3, "groundspeak:logs") + else + tagstart(3, "groundspeak:logs", "/") + + for (i = 1; i < nlogs; ++i) + { + ltype = json_logs["data" SUBSEP i SUBSEP "LogTypeImage"] + if (ltype ~ /smile/) ltype = "Found it" + else if (ltype ~ /happy/) ltype = "Found it" + else if (ltype ~ /note/) ltype = "Write note" + else if (ltype ~ /sad/) ltype = "Didn'"'"'t Find it" + else if (ltype ~ /attended/) ltype = "Attended" + else if (ltype ~ /rsvp/) ltype = "Will Attend" + else if (ltype ~ /greenlight/) ltype = "Green" + else if (ltype ~ /traffic_cone/) ltype = "Archive" + else if (ltype ~ /disabled/) ltype = "Temporarily Disable Listing" + else if (ltype ~ /coord_update/) ltype = "Update Coordinates" + else ltype = "Unknown" + + ldate = json_logs["data" SUBSEP i SUBSEP "Visited"] + n = split(ldate, fld, "/") + if (n == 3) + { + #new format: 08/18/2011 + if (DATEFMT == 1) + ldate = sprintf("%d-%02d-%02dT20:00:00Z", + fld[3], fld[2], fld[1]) + else + ldate = sprintf("%d-%02d-%02dT20:00:00Z", + fld[3], fld[1], fld[2]) + debug(2, "logdate: " ldate) + } + lfinder = json_logs["data" SUBSEP i SUBSEP "UserName"] + lfinder = umlauts(lfinder) + logid = json_logs["data" SUBSEP i SUBSEP "LogID"] + guid = json_logs["data" SUBSEP i SUBSEP "AccountID"] + ltext = json_logs["data" SUBSEP i SUBSEP "LogText"] + ltext = htmlclean(ltext) + ltext = umlauts(ltext) + + if (lfinder == USERNAME && ltype == "Found it") + sym = "Geocache Found" + if (lfinder == USERNAME && ltype == "Attended") + sym = "Geocache Found" + tagstart(4, "groundspeak:log", "id=\"" logid "\"") + tagtext(5, "groundspeak:date", ldate) + tagtext(5, "groundspeak:type", ltype) + tagptext(5, "groundspeak:finder", "id=\"" guid "\"", lfinder) + tagptext(5, "groundspeak:text", "encoded=\"" "False" "\"", ltext) + tagend(4, "groundspeak:log") + } + + if (nlogs > 1) + tagend(3, "groundspeak:logs") + } + else + { + # nlogs = split(logs, entry, "") + nlogs = split(logs, entry, "
") + if (nlogs > NUMLOGS+1) + nlogs = NUMLOGS+1 + + if (nlogs > 1) + tagstart(3, "groundspeak:logs") + else + tagstart(3, "groundspeak:logs", "/") + + for (i = 1; i < nlogs; ++i) + { + sub("]*>", "", entry[i]) + sub("", "", entry[i]) + if (!entry[i]) continue + # old split location + sub(/.*<[Ss][Tt][Rr][Oo][Nn][Gg]>.*/, "", ltype) # leaves the URL of the smiley + if (ltype ~ /smile/) ltype = "Found it" + else if (ltype ~ /happy/) ltype = "Found it" + else if (ltype ~ /note/) ltype = "Write note" + else if (ltype ~ /sad/) ltype = "Didn'"'"'t Find it" + else if (ltype ~ /attended/) ltype = "Attended" + else if (ltype ~ /rsvp/) ltype = "Will Attend" + else if (ltype ~ /greenlight/) ltype = "Green" + else if (ltype ~ /traffic_cone/) ltype = "Archive" + else if (ltype ~ /disabled/) ltype = "Temporarily Disable Listing" + else if (ltype ~ /coord_update/) ltype = "Update Coordinates" + else ltype = "Unknown" + + ldate = entry[i] + # split off  /blank + sub(/^[^>]*>[^ ;]*[ ;]/, "", ldate) + sub(/ by <.*/, "", ldate) + sub(/ by /, "", ldate) + sub(/.*LogDate.>about /, "", ldate) + sub(/.*LogDate.>/, "", ldate) + sub(/<.*/, "", ldate) + gsub(/-/, "/", ldate) + debug(1, "logdate: " ldate) + if (ldate ~ /ago/) + { + cmd = sprintf("%s -d \"12am %s\" +%%Y-%%m-%%dT07:00:00Z", + DATE, ldate) + cmd | getline ldate; close(cmd) + } + else + { + n = split(ldate, fld, " ") + if (n >= 2) + { + #old format: August 18 + mm = Month[fld[1]] + dd = fld[2] + 0 + if (n >= 3) + yy = fld[3] + if (yy+0 == 0) + yy = YR + ldate = sprintf("%d-%02d-%02dT07:00:00", yy, mm, dd) + } + n = split(ldate, fld, "/") + if (n == 3) + { + #new format: 08/18/2011 + if (DATEFMT == 1) + ldate = sprintf("%d-%02d-%02dT07:00:00", + fld[3], fld[2], fld[1]) + else + ldate = sprintf("%d-%02d-%02dT07:00:00", + fld[3], fld[1], fld[2]) + debug(1, "logdate: " ldate) + } + } + + lfinder = entry[i] + sub(/[^<]*]*>/, "", guid) # Delete all before .*/, "", guid) # Delete all after ]*>/, "", lfinder) # Delete all before ]*>/, "", lfinder) # Delete all before name + sub(/<.*/, "", lfinder) # Delete all after name + lfinder = umlauts(lfinder) + debug(1, "lfinder: " lfinder) + + ltext = entry[i] + sub(/.*found\)
/, "", ltext) + sub(".*", "", ltext) + sub("
]*>[^<]*", "", ltext) + sub("]*>[^<]*", "", ltext) + # remove remaining HTML tags from log text. Seems to be a good + # idea in any case, independent of NOHTML setting! + ltext = htmlclean(ltext) + ltext = umlauts(ltext) + + if (lfinder == USERNAME && ltype == "Found it") + sym = "Geocache Found" + if (lfinder == USERNAME && ltype == "Attended") + sym = "Geocache Found" + tagstart(4, "groundspeak:log", "id=\"" logid "\"") + tagtext(5, "groundspeak:date", ldate) + tagtext(5, "groundspeak:type", ltype) + tagptext(5, "groundspeak:finder", "id=\"" guid "\"", lfinder) + tagptext(5, "groundspeak:text", "encoded=\"" "False" "\"", ltext) + tagend(4, "groundspeak:log") + } + if (nlogs > 1) + tagend(3, "groundspeak:logs") + } + + tagstart(3, "groundspeak:travelbugs", "/") + + tagend(2, "groundspeak:cache") + tagtext(2, "sym", sym) + tagend(1, "wpt") + + # add Additional Waypoints in wpt form + if (!NOWPTS && wplist) + { + split(wplist, wps, "\n") + i = 0 + for (wp in wps) + ++i + wp = 0 + while (wp < i) + { + ++wp + # lat lon|prefix|lookup|wpname|url|note + # i.e.: lat="44.888267" lon="-93.159233"|PC|PARK|http://... + # |GCPMG6-Parking (Parking Area)|.31 miles from cache. + debug(1, "wps: " wps[wp]) + split(wps[wp], line, "|") + if (line[1] && + (!NOZERO || (line[1] !~ "lat=\"0.000000\" lon=\"0.000000\"") ) ) + { + # line format: coords|prefix|lookup|wpname|note + tagstart(1, "wpt", line[1]) + #tagtext(2, "time", "...") + tagtext(2, "name", line[2] substr(gcid,3)) + tagtext(2, "cmt", line[6] ? line[6] : "") + statname = line[4] + gsub(" \\(.*\\).*", "", statname) + + desc = line[4] + sub(" \\(.*", "", desc) + tagtext(2, "desc", desc) + + tagtext(2, "url", line[5]) + + urlname = desc + tagtext(2, "urlname", urlname) + + stattype = line[4] + gsub(".*\\(", "", stattype) + gsub("\\).*", "", stattype) + tagtext(2, "sym", stattype) + tagtext(2, "type", "Waypoint|" stattype) + tagend(1, "wpt") + } + } + } + wpt_init() +} +END { + if (!INCR && !first) + tagend(0, "gpx") +} +' | $POSTPROC diff --git a/tools/geo-nearest b/tools/geo-nearest new file mode 100755 index 0000000..53395c3 --- /dev/null +++ b/tools/geo-nearest @@ -0,0 +1,2406 @@ +#!/bin/bash +# +# +# DO NOT EDIT! This file is generated from geo-nearest.sh +# + +# +# geo-nearest: Fetch list of nearest geocaches. +# +# Requires: curl; gpsbabel; bash or ksh; +# mysql (if using the gpsdrive.sql output option) +# +# Donated to the public domain by Rick Richardson +# +# Use at your own risk. Not suitable for any purpose. Not legal tender. +# +# $Id: geo-nearest.sh,v 1.49 2013/02/18 21:41:06 rick Exp $ +# + +PROGNAME="$0" + +usage() { + cat < + + `basename $PROGNAME` [options] ul= + + `basename $PROGNAME` [options] pq= + + `basename $PROGNAME` [options] tx= + + `basename $PROGNAME` [options] -b bookmark + `basename $PROGNAME` [options] guid= + +DESCRIPTION + Fetch a list of nearest geocaches. + + Requires: + A premium member (\$30/yr) OR a basic member (free) login at: + http://www.geocaching.com + Visit a cache page and click the "Download to EasyGPS" link at least + once so you can read and agree to the license terms. Otherwise, you + will not get any waypoint data. + + curl http://curl.haxx.se/ + gpsbabel http://gpsbabel.sourceforge.net/ + +EOF + gc_usage + cat << EOF + +NOTE + A basic member will get caches very slow (20 cache pages per minute) + because we have to get the actual cache pages. They will be stored in: + ~/.geo/caches/GCXXXX.html. + Of course, after running this command, geo-html2gpx could be run. + +EXAMPLES + Nearest 20 caches, display shortnames: + + geo-nearest -s + + Search nearest 500 caches for virtual caches not yet found: + + geo-nearest -n500 -Ivirtual -Xifound + + Add nearest 50 caches to a GpsDrive SQL database + + geo-nearest -n50 -f -s -S + + Purge the existing SQL database of all geocaches, and fetch + 200 fresh ones... + + geo-nearest -S -P -s -n200 + + 640x480 map of nearest caches using map source 2: + + geo-nearest -omap,"-a2 -W640 -H480" + + Copy two cachers: + + geo-nearest -n200 -Xifound -udyl1231 -pPW | awk '{print \$1}' >1.foo + geo-nearest -n200 -Xifound -urickrich -pPW |awk '{print \$1}' >2.foo + geo-gid -otabsep \$(comm -12 1.foo 2.foo) >both + + Fetch by owner placed: + + geo-nearest u=team-deadhead + + Fetch by owner found: + + geo-nearest ul="AAA+of+MichigAn&sortdir=asc&sort=placed" + + Fetch by tx method: + + # nearby caches of this (puzzle) type, that I haven't found + geo-nearest -n500 -f -otabsep tx=40861821-1835-4e11-b666-8d41064d03fe | + geo-mystery >> Caches/rick.ts + + Also, tx=webcam, tx=earth, tx=multi, tx=event, tx=virtual, tx=letter, + tx=unknown, tx=trad (tx=reg is an alias). + + Fetch by cache-type method: + + # nearby caches of this (puzzle) type, that I haven't found + geo-nearest -n500 -f -otabsep unknown | + geo-mystery >> Caches/rick.ts + + Also, cache-type is webcam, earth, multi, event, virtual, letter, + unknown, trad (reg is an alias). + + Fetch a bookmark list: + + geo-nearest -b acro + or + geo-nearest guid=baae5bf9-4315-4874-b7fb-ac84c9585641 + + Fetch a PQ query: + + geo-nearest -q "Needs Maintenance" + or + geo-nearest pq=08be103b-ffd1-4e27-992f-616e144e24df + +FILES + ~/.georc + ~/.geo/caches/ + +SEE ALSO + geo-newest, geo-found, geo-placed, geo-keyword, geo-code, geo-map, + geo-waypoint, + $WEBHOME +EOF + + exit 1 +} + +############################################################################## +# begin #include "geo-common" +############################################################################## + +# I doubt this stuff will work in other than english +LANG=en_US + +# +# Common global constants +# +UA="Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.1; .NET CLR 1.1.4322)" +WEBHOME="http://geo.rkkda.com/" + +# +# Common global variables +# +DEBUG=0 +CRUFT= +CURL_OPTS= + +# +# Report an error and exit +# +error() { + echo "`basename $PROGNAME`: $1" >&2 + exit 1 +} + +debug() { + if [ $DEBUG -ge $1 ]; then + echo "`basename $PROGNAME`: $2" >&2 + fi +} + +verbose() { + if [ $VERBOSE -ge $1 ]; then + echo "$2" >&2 + fi +} + +dbgcmd() { + if [ $DEBUG -ge $DBGCMD_LVL ]; then + echo "$@" >&2 + fi + "$@" +} +DBGCMD_LVL=2 + +# +# procedure to remove cruft files +# +remove_cruft() { + if [ $DEBUG = 0 -a "$CRUFT" != "" ]; then + for i in $CRUFT + do + [ -f $i ] && rm -f $i + done + fi +} + +trap remove_cruft EXIT + +# +# Convert DegDec, MinDec, or DMS lat/lon to DegDec +# +latlon() { + # Handle NSEW prefixes + arg1=`echo "$1" | sed -e 's/^[nNeE]//' -e 's/^[wW]/-/' -e 's/^[sS]/-/'` + # If negative, print the sign then take the absolute value + case "$arg1" in + -*) echo -n "-"; arg1=`echo "$arg1" | sed 's/^-//'`;; + esac + # Now handle the 3 different formats + case $# in + 1) + case "$arg1" in + *.*.*) echo "$arg1" \ + | sed -e 's/,//' -e 's#\([^.]*\)\.#\1 #' -e 's#$# 6k 60/+p#' \ + | dc + ;; + lat=*) + echo "$arg1" | sed 's/^lat=//' + ;; + lon=*) + echo "$arg1" | sed 's/^lon=//' + ;; + *) echo $arg1 + ;; + esac + ;; + 2) echo "6k $arg1 $2 60/+p" | dc;; + 3) echo "6k $arg1 $2 60/ $3 3600/++p" | dc;; + esac +} + +# +# Convert DegDec to MinDec with optional NS/EW +# +degdec2mindec() { + awk -v v=$1 -v sym=$2 \ + ' + function abs(x) { return (x>=0) ? x : -x } + BEGIN{ + i=int(v) + if (sym == "") + printf "%d.%06.3f\n", i, abs(v-i) * 60 + else + printf "%s%d.%06.3f\n", \ + i >= 0.0 ? substr(sym, 1, 1) : substr(sym, 2, 1), \ + abs(i), abs(v-i) * 60 + }' +} + +# +# Read RC file, if there is one +# +read_rc_file() { + if [ -f $HOME/.georc ]; then + . $HOME/.georc + # Allow LAT/LON in rc file to be in any of the formats that we grok + if [ "" != "$LAT" ]; then + if ! is_latlon $LAT 0; then + error "Latitude '$LAT' is not parsed in .georc!" + fi + LAT=`latlon $LAT` + fi + if [ "" != "$LON" ]; then + if ! is_latlon 0 $LON; then + error "Longitude '$LON' is not parsed in .georc!" + fi + LON=`latlon $LON` + fi + else + cat <<-EOF > $HOME/.georc + # + # These are the default values for the geo-* series of programs + # Please edit this file as needed. Setting values for + # USERNAME, PASSWORD, LAT/LON, and STATE are required. + # + + ################################# + # Login and paid membership status for www.geocaching.com... + #USERNAME=name + #PASSWORD=pasword + #SOC=0 + + ################################# + # Your HOME lat/lon and state... + #LAT=N44.55.666 + #LON=W93.11.222 + #STATE=MN + + ################################# + # Default map scale, font, and source... + #MAPSCALE=10K + #MAPFONT=helvetica + #MAPSRC=2 + + ################################# + # Login for terraserver.com... + #TSCOM_EMAIL=xxx@yyy.com + #TSCOM_PW=password + + ################################# + # Miscellaneous... + #OUTFMT=gpsdrive + #GPSDRIVE_VER=2.09 + #GEOMYSTERY=$HOME/.geo-mystery + #OCMYSTERY=$HOME/.oc-mystery + #DATEFMT=0 + #CURL_OPTS="-4" + #CURL_OPTS="--sslv3" + EOF + error "First time user: please review and edit $HOME/.georc" + fi +} + +if [ `uname` = 'Darwin' ]; then + sed=gsed + date=gdate + touch=gtouch + PATH=$PATH:/usr/local/bin:/opt/local/bin + export PATH +else + sed=sed + date=date + touch=touch +fi + +# +# Get the value from a name= value= pair in a file +# +get_value() { + # = 97 && val <= 122) #0x61-0x7A + encoded = encoded c + else if (val >= 65 && val <= 90) #0x41-0x5A + encoded = encoded c + else if (val >= 48 && val <= 57) #0x30-0x39 + encoded = encoded c + else if (val >= 45 && val <= 46) #0x2D-0x2E + encoded = encoded c + else if (c == " ") + encoded = encoded "+" + else if (val < 128) { + lo = val % 16 + hi = int(val / 16); + encoded = encoded "%" hextab[hi] hextab[lo] + } + else { + byte = 192 + val/64 + lo = byte % 16 + hi = int(byte / 16); + encoded = encoded "%" hextab[hi] hextab[lo] + byte = 128 + val%64 + lo = byte % 16 + hi = int(byte / 16); + encoded = encoded "%" hextab[hi] hextab[lo] + } + } + print encoded + } + ' +} + +# +# return true if current arguments appear to be a lat/lon +# +is_latlon() { + if [ "$#" -lt 2 ]; then + return 1 + fi + case "$1" in + lat=*) ;; # cut/paste from GPX file + [NS]) return 0;; # cut/paste from gc.com + [NSns][0-9]*) ;; + [-][0-9]*) ;; + [0-9]*) ;; + *) return 1;; + esac + case "$2" in + lon=*) return 0;; + [EWew][0-9]*) return 0;; + [-][0-9]*) return 0;; + [0-9]*) return 0;; + *) return 1;; + esac +} + +# +# split lines between two strings +# +# $1 - string 1 +# $2 - string 2 +# $3 - null or 'g' +# +split_lines_between() { + sed "s@$1$2@$1\\ +$2@$3" +} + +############################################################################## +# end #include "geo-common" +############################################################################## +############################################################################## +# begin #include "geo-common-gc" +# +# $Id: geo-common-gc,v 1.313 2013/02/01 14:29:33 rick Exp $ +############################################################################## + +# +# Common global constants +# +UA="Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.1; .NET CLR 1.1.4322)" +UA="Mozilla/5.0 (Macintosh; U; PPC Mac OS X; en) AppleWebKit/XX (KHTML, like Gecko) Version/ZZ Safari/YY" +GEO="http://www.geocaching.com" +GEOS="https://www.geocaching.com" + +# +# Global variables that can be overridden on command line or rc file +# +PASSWORD=dummy +USERNAME=dummy +LAT=44.9472 +LON=-93.4914 +SOC=${SOC:0} +GEOMYSTERY=/dev/null +GEODIR=$HOME/.geo +case `uname` in +CYGWIN*) CURL_OPTS=-k;; +*) CURL_OPTS= +esac + +# +# Global variables +# +COOKIE_FILE=$HOME/.geocookies +NOCOOKIES=0 +FOUND=1 +USERFOUND=1 +BABELFLAGS= +RADIUS= +RADIUS_NUM= +RADIUS_MILES= +OUTFILE= +OUTFMT=gpsdrive +NUM=20 +INCLUDE=* +EXCLUDE='-unavail' +VARTIME=found +GEOSLEEP=${GEOSLEEP:-8} + +# +# Common options handling +# +gc_usage() { + cat < $LOGINPAGE + if [ ! -s $LOGINPAGE ]; then + error "curl: returned /dev/null for '$LOGINPAGE'" + fi + if grep -q "FormErrorWidget" $LOGINPAGE; then + error "Login username/password does not match." + fi + if grep -q "If you are human" $LOGINPAGE; then + error "Have to login this time with a web browser because of Recaptcha" + fi + if grep -q "temporarily down for maintenance." $LOGINPAGE; then + error "Geocaching.com is temporarily down for maintenance." + fi + # Make case insignificant + if ! grep -y -q "ctl00_ContentBody_LoggedInPanel" $LOGINPAGE; then + error "BUG: gc.com changed the login page." + fi +} + +# +# procedure to nag about agreeing to EasyGps download license +# +easy_warning() { + cat <<-EOF + You have not agreed to the waypoint download license at $GEO + + Click one of the waypoint license agreement links at $GEO, + read and agree to the license terms, then try this program again. + EOF +} + +# +# getcids infile cidfile xtrafile archfile number +# +# Wade thru the HTML and produce lists of found, notfound and new CIDs +# +getcids() { + awk \ + -v "CIDFILE=$2" \ + -v "XTRAFILE=$3" \ + -v "ARCHFILE=$4" \ + -v "NUM=$5" \ + -v "USERFOUND=$USERFOUND" \ + -v "VARTIME=$VARTIME" \ + -v "SOC=$SOC" \ + -v "DATE=$date" \ + -v "DATEFMT=$DATEFMT" \ + -v "DEBUG=$DEBUG" \ + < $1 \ + ' + function debug(lvl, text) { + if (lvl <= DEBUG) + print text > "/dev/stderr" + } + function hex2dec(x, val) { + for (val = 0; length(x); x = substr(x, 2)) + val = 16*val + index("0123456789ABCDEF", substr(x, 1, 1)) - 1 + return val + } + # Convert GC0000 to 58913 + function wp2id(wp, val) { + sub("^GC", "", wp) + if (DEBUG > 5) + print "wp2id: " wp " ..." > "/dev/stderr" + if (length(wp) <= 4 && wp < "G000") + { + val = hex2dec(wp) + if (DEBUG > 5) + print "wp2id hex: " val " ..." > "/dev/stderr" + return val + } + set = "0123456789ABCDEFGHJKMNPQRTVWXYZ" + val = 0 + for (pos = 1; pos <= length(wp); ++pos) + { + val *= 31; + val += index(set, substr(wp, pos, 1)) - 1; + } + val = val - 411120 + if (DEBUG > 5) + print "wp2id id: " val " ..." > "/dev/stderr" + return val + } + function id2wp(id, val) { + gid = ""; + if (id < 0) + ; + else if (id < 65536) + gid = sprintf("GC%04X", id) + else + { + GcOffset = 16 * 31 * 31 * 31 - 65536 + GcSet = "0123456789ABCDEFGHJKMNPQRTVWXYZ" + id += GcOffset; + for (i = 1; i <= 4; ++i) + { + gid = substr(GcSet, id%31 + 1, 1) gid + id = int(id / 31) + } + tmp = substr(GcSet, id%31 + 1, 1) + if (tmp != 0) + { + gid = tmp gid + id = int(id / 31) + } + if (id) + gid = "" + else + gid = "GC" gid + } + if (DEBUG >= 5) + print "id = ", id, "wp = ", gid > "/dev/stderr" + return gid + } + + function hash2sdt(text, + day, cmd, i, value, mod, s0, t0, d0) { + if (thiscode == "") + { + code[1] = "PDMTRXBJjZNH9fKW8vetlCgbos24mydknahrcOxYqLwGSE370z65ApVFQ" + code[2] = "6JKt4b70rHoeTLqQB2jANwcYSMW9xPk3aplE5hGvyfsZDgFmndOVRC8zX" + code[3] = "Rl2QaDdTsnK7rOZoywzx0H58NLCAGqgtp43mvYJVkFEejMWB69cXhfSbP" + code[4] = "jShz6gF3OvonKEWkJCbZf4GeDX25VcyPsqwRYpLM8BtATm0x7l9aHQdNr" + code[5] = "aJs2OWpoYfN9zvDHCwZrm83b4SKkFhXcAL0QPgBy7tMdRGlqxjEVn65Te" + code[6] = "g6aXp7rqvkEl5JLnRDhfWGHTeA9OMQYdwS2BcbK0jCyFx4sPo83tmzZVN" + code[7] = "MlocEO5eAgTFfLXzyPDk2qJhjBn98QSdNHR47mGWtY3ZvVxCpr0Ks6abw" + code[8] = "p7SPbvzM4VkQ8f25cJL0gBlWjYmFoKhArXRHZntTGe6CNsyE3a9qOdwDx" + code[9] = "znlBb8GHNdhCKyOpo53ePX9xfkvjD0aTEAVZ72qSQwrmMYct6JgRFWLs4" + code[10] = "KXztRHdrkBwSWEn3AN2Fh8vOL5QMjx6oTgyCD7JYpaGmVcf9Pelb4q0Zs" + code[11] = "M3odkDCgQa7GWK9pYh8tLAl6xFecRwPZNbTz0s42rqfOnSmvEjVyB5JXH" + code[12] = "gweGxNAYCKfLdrb68X93ahjHMDtTWRFJVZvl0po5ySmOQnscPz4Ekq2B7" + code[13] = "p2zelnEox9HqkGF4V5AZ6LbMBsy0dQc8J3fDXvON7jWgrKYCSTaPtRhmw" + code[14] = "cy2gjCAJt3KmMxbr5OzQeYsvHpLF8fRVaoNXdGBW0l7ESZDP9qkw4Th6n" + code[15] = "9KQZlwfBsCqN6oWkYhrSpDAEP48c5m3eJn2jVHLdybMx0gaOGRXzvFTt7" + code[16] = "7j6CJPfqbMygan42HwxFBcrK3RYLstmOXWGeSQZ9kzl0VE8oDTpAhd5Nv" + code[17] = "YScWw7gsx49ebLAqMGotHRX3fnCv6FBOkzVE5jdlmPTarDKQJyp8Z0hN2" + code[18] = "BgwR6oskAcVPqeYdLKr3ONvflXz2nDSbxMQJEhyZC0pWHm759GFa4tT8j" + code[19] = "9QyolrBq37he4nbCTcXEkmGHjYS02RDgMZLfOtavVzKNFxPs58p6JwWAd" + code[20] = "8OwsHykXLJ3tqWZmR2pbVagMcTdnSC9FveN5z0xYjGK6frh7Q4EPDBAlo" + code[21] = "RVBh8qEaN4Aw2Ob5egSytWjQD6oFmKvXfYnCzcx73kJsHrd9TLPZM0Glp" + code[22] = "7MqQGJkKzZvdgmRXBH8CYeAVf3cy29LOW4PNaD0rsnowEpTbF5Sxhtl6j" + code[23] = "8C26QBoWjEPcJ3Sf7TYtexXlMNyqArm0KD9HOLvZakGwnVbFsdp45Rzhg" + code[24] = "6e5fC2S4Bwcm9pVKyqdFE3WlRDroTLJgGtN8ZQsAabMzHYO0Xvj7Pnxhk" + code[25] = "JXHgMGcAVNpDEwWYvyBl025m89dOoTSKPxhstjq6e4QrCk3aZFbzfn7RL" + code[26] = "Yp3ARoesjKXB2cadmkHvFQM7SEJtqf0l9TwzbPLrZDxO8h5C6NnGWyVg4" + code[27] = "9kJaM4HonPWtcQvsYSEK3Vy5pjCRFqNO6lgr0x7mh2b8wdTGDzfLXeABZ" + code[28] = "4n2gSwqzGB7C0MpV3yDY9FTtol8XjkJNcEPr6LxhZQKdRvHOfsA5eWmab" + code[29] = "P6G8jsOxBCqf3k74DnXtAvl2ThabeEHJVgZp5wSzF9NWRcYMyL0dromKQ" + code[30] = "WVwgM93zjmNcLpHvoSK2Q5bCxaATGsryXn6Bhfd0Z8qtERk7PYOJD4Fle" + code[31] = "PZqTVol4HOXz0GWt38Qec59rKMyabfhE2DdsNxpF7RASkBjnYwvCgmJ6L" + cmd = sprintf("%s -u +%%-d", DATE) + cmd | getline day; close(cmd) + thiscode = code[day] + } + + value = 0 + for (i = 1; i <= length(text); ++i) { + value = 57 * value + index(thiscode, substr(text, i, 1)) - 1 + } + #print value + + mod = (value - 131586) % 16777216 + + s0 = int(mod / 131072); + t0 = int((mod % 131072) / 256) + d0 = int((mod % 131072) % 256) + #print s0, t0, d0 + + # cache size + if (s0 == 0) size = "not chosen" + else if (s0 == 1) size = "Micro" + else if (s0 == 2) size = "Regular" + else if (s0 == 3) size = "Large" + else if (s0 == 4) size = "Virtual" + else if (s0 == 5) size = "Unknown" + else if (s0 == 7) size = "Small" + else size = "BUG" + + # terrain rating + if (t0 == 0) terrain = 1.0 + else if (t0 == 1) terrain = 1.5 + else if (t0 == 2) terrain = 2.0 + else if (t0 == 3) terrain = 2.5 + else if (t0 == 4) terrain = 3.0 + else if (t0 == 5) terrain = 3.5 + else if (t0 == 6) terrain = 4.0 + else if (t0 == 7) terrain = 4.5 + else terrain = 5.0 + + # difficulty rating + if (d0 == 0) difficulty = 1.0 + else if (d0 == 1) difficulty = 1.5 + else if (d0 == 2) difficulty = 2.0 + else if (d0 == 3) difficulty = 2.5 + else if (d0 == 4) difficulty = 3.0 + else if (d0 == 5) difficulty = 3.5 + else if (d0 == 6) difficulty = 4.0 + else if (d0 == 7) difficulty = 4.5 + else difficulty = 5.0 + } + + function begin_new_entry() { + # Beginning of a new entry, reset variables to defaults + inrecord = 1 + avail = 1 + archived = 0 + bugs = 0 + ifound = 0 + iplaced = 0 + soc = 0 + unfound = 1 + tdcnt = 0 + gcid = "GC0000" + foundt = 0 + ifoundrec = 0 + ifoundt = 0 + container = "unknown" + sendgps = 0 # Non-subscription members + placer = "" + # Bug Fix: FIXME + #gctype = "Traditional cache" + #type = "regular" + #difficulty = 0 + #terrain = 0 + # End Bug Fix: FIXME + if (DEBUG >= 5) + print "Begin " NUM " ..." > "/dev/stderr" + } + function parse_dates(text, cmd, val) { + sub("[*]$", "", text) + sub("^ *", "", text) # remove leading blanks + debug(5, "parse_dates: text=" text) + if (text ~ /Today/) + { + cmd = sprintf("%s -d \"%s\" +%%s", DATE, "12am today") + cmd | getline val; close(cmd) + } + else if (text ~ /Yesterday/) + { + cmd = sprintf("%s -d \"%s\" +%%s", DATE, "12am yesterday") + cmd | getline val; close(cmd) + } + else if (text ~ /ago/) + { + cmd = sprintf("%s -d \"12am %s\" +%%s", DATE, text) + cmd | getline val; close(cmd) + } + else if (text ~ /[0-9][^<]*[0-9]/ ) + { + # GC Format Example Compatible + # YYYY/MM/DD 2011/07/13 yes + # MM/DD/YYYY 07/13/2011 yes + # DD/MM/YYYY 13/07/2011 yes if DATEFMT = 1 + # DD/Mmm/YYYY 13/Jul/2001 no + # Mmm/DD/YYYY Jul/13/2011 no + nf = split(text, fld, "/") + if (nf == 3 && DATEFMT == 1) + { + # DD before MM + debug(5, "parse_dates: fld=" fld[1] "." fld[2] "." fld[3]) + cmd = sprintf("%s -d \"12am %s\" +%%s", DATE, + fld[2] "/" fld[1] "/" fld[3]) + cmd | getline val; close(cmd) + } + else + { + # Regular way + cmd = sprintf("%s -d \"12am %s\" +%%s", DATE, text) + cmd | getline val; close(cmd) + } + } + else + val = 0 + debug(5, "parse_dates: val=" val) + return val + } + BEGIN { + q = sprintf("%c", 39) + ++NUM + gctype = "Traditional cache" + type = "regular" + } + # Test: geo-nearest -s (18) + # Test: geo-newest -s (20) + # Test: geo-nearest -b multi (8) + # + # For geo-nearest AND geo-nearest -b + /class=".* Data BorderTop"/ { + begin_new_entry() + debug(3, "Data BorderTop") + next + } + / + #OR + # + tdcnt == (10-0) && /[a-zA-Z0-9*>]
/ { + # catch dates DD MMM YY, N days ago, Today, Yesterday + unfound = 0 + date = $0 + sub(".*
= 1 && tdcnt <= 10 { + if (DEBUG >= 5) + print "tdcnt " tdcnt ", text: " $0 > "/dev/stderr" + } + /]*>", "", name) + sub("", "", name) + sub(".*", "", name) + sub(".*", "", name) + + sub(".*]*>", "", name) + sub("*.", "", name) + sub("]*>", "", name) + sub("]*>", "", name) + sub("<[^>]*>", "", name) + sub("<[^>]*>", "", name) + debug(5, "name: " name) + } + # bookmarks by guid=... + /]*>", "", name) + sub("", "", name) + sub(".*", "", gctype) + debug(5, "gctype: " gctype) + } + else + { + begin_new_entry() + gcid = $0 + sub(".*]*>", "", gcid) + sub("<.*", "", gcid) + cid = wp2id(gcid) + debug(5, "gcid: " gcid) + } + } + /"Found It!"/ { + if (USERFOUND) + ifound = 1 + next + } + /Premium Member Only Cache/ { + soc = 1 + } + tdcnt == (9-0) && /[0-9][0-9]*.[0-9][0-9]*/ { + # RER: May 4, 2011 + date = $0 + sub(/^ */, "", date) + sub(/.*small.>/, "", date) + sub(/ *<.*/, "", date) + sub(/\015/, "", date) + debug(5, "placedt text: "date) + placedt = parse_dates(date) + debug(5, "placedt: " placedt) + } + # + # Yesterday*
+ # + # 3 days ago* + #
+ # Yesterday*
+ # + # + #
", "", date) + sub("<.*", "", date) + lastfoundt = parse_dates(date) + foundt = lastfoundt + debug(5, "lastfoundt: " lastfoundt) + } + tdcnt == (10-0) && /[a-zA-Z0-9*>]<.span>/ { + unfound = 0 + date = $0 + sub(".*Success.>", "", date) + sub("<.*", "", date) + ifoundt = parse_dates(date) + debug(5, "ifoundt: " ifoundt) + } + / + avail = 0; archived = 1 + } + /<\/strike><\/font/ { + # i.e. + avail = 0; archived = 1 + } + /[^<]/ { + avail = 0; + } + /class=".*Warning Strike.*">/ { + debug(5, "***archived***") + avail = 0; archived = 1 + } + /class=".*Strike">/ { + avail = 0 + } + tdcnt == 6 && /^ *by / { + placer = $0 + sub("^ *by ", "", placer) + sub("\015", "", placer) + debug(5, "placer: <" placer ">") + } + tdcnt == 6 && /^ *GC/ { + gcid = $0 + sub("^ *", "", gcid) + sub("\015", "", gcid) + debug(5, "GCID: <" gcid ">") + cid = wp2id(gcid) + } + /alt=.Your Geocache/ { + # altmy cache + # A mistake in the HTML! should be alt="my cache" + if (USERFOUND) { + iplaced = 1 + ifound = 1 + } + } + /alt="Earthcache"/ { + type = "earth" + gctype = "Earthcache" + } + /alt="Event Cache"/ { + type = "event" + gctype = "Event cache" + } + /alt="Cache In Trash Out Event"/ { + type = "cito" + gctype = "Cache In Trash Out Event" + } + /alt="Traditional Cache"/ { + type = "regular" + gctype = "Traditional cache" + } + /alt="Letterbox Hybrid"/ { + type = "hybrid" + gctype = "Letterbox Hybrid" + } + /alt="Multi-cache"/ { + type = "multi" + gctype = "Multi-Cache" + } + /alt="Unknown Cache"/ { + type = "unknown" + gctype = "Unknown Cache" + } + /alt="Virtual Cache"/ { + type = "virtual" + gctype = "Virtual cache" + } + /alt="Webcam Cache"/ { + type = "webcam" + gctype = "Webcam Cache" + } + /alt="Wherigo Cache"/ { + type = "wherigo" + gctype = "Wherigo Cache" + } + /alt="Mega-Event Cache"/ { + type = "mega" + gctype = "Mega-Event Cache" + } + /name=.CID. / { + i = match($0, "value=.") + cid = substr($0, i+7, 99) + 0 + } + /name=.BID. / { + i = match($0, "value=.") + bid = substr($0, i+7, 99) + 0 + } + #/ImgGen.seek.CacheInfo.ashx?v=/ { + archived && /[?]v=/ { + text = $0 + debug(5, "sdt text: " text) + sub(".*?v=", "", text) + sub(". .*", "", text) + debug(5, "sdt text: " text) + hash2sdt(text) + debug(5, "size: " size " difficulty: " difficulty " terrain: " terrain) + container = size + } + /Unapproved cache/ && inrecord { + avail = 0; archived = 1 + } + /class=.Checkbox NoBolding./ { + sendgps = 1 # Subscription members + } + /<\/[tT][rR]>/ && inrecord { + # RER mod 11/22/10: if (0 && .. + if (0 && sendgps == 0) + next + inrecord = 0 + debug(5, "End") + + strtype = "Geocache" + + if (soc) strtype = strtype "-soc" + if (unfound) strtype = strtype "-unfound" + else if (ifound) strtype = strtype "-ifound" + if (!avail) strtype = strtype "-unavail" + if (archived) strtype = strtype "-archived" + + strtype = strtype "-" type + + # gpsbabel only allows one time in the DB, figure out what + # time to use for this, but always carry all three times + # in the .xtra file + if (iplaced) ifoundt = placedt + vartime=1234 + if (VARTIME == "placed") vartime = placedt + else if (VARTIME == "ifound") vartime = ifoundt + #else if (foundt > 0) vartime = foundt + else vartime = placedt + + # date -d 1970-01-01 1237093200 sec +%Y%m%d + # 20090315 + cmd = sprintf("%s -d \"1970-01-01 %d sec\" +%%Y%%m%%d", + DATE, lastfoundt) + cmd | getline lastfound; close(cmd) + + # avail=1 is the choice right now (8/19/05) + # archived=0 is the choice right now (11/14/06) + # sendgps=1 Remove non-soc caches from basic member. (12/18/2012) + debug(5, gcid "\tsendgps: " sendgps " archived: " archived \ + " SOC: " SOC " soc: " soc " bid: " bid) + if (!archived && (SOC || !soc) && (sendgps == 1 || bid) ) + { + if (bid != 0) { + printf("-dBID=%d\n", bid) > CIDFILE + gcid = id2wp(bid) + } else if (cid != 0) { + printf("-dCID=%d\n", cid) > CIDFILE + } + # GCID type vartime ifound soc iplaced tPLACED tFOUND tIFOUND + #"%.1f\t%.1f\t%s\t" + #difficulty, terrain, container, + printf "%s\t%s\t%d\t%s\t%s\t%s\t%d\t%d\t%d\t" \ + "%s\t%s\t%s\t%s\n", + gcid, strtype, vartime, + ifound, soc, iplaced, placedt, foundt, ifoundt, + gctype, placer, "hint", lastfound >> XTRAFILE + if (--NUM == 0) + exit + } + else if (archived) + { + if (DEBUG > 5) + print "Archived ", gcid, " " name > "/dev/stderr" + if (name == "") + name = "error-no-name!" + if (placer == "") + placer = "unknown-placer" + # Use "merge" file output, NOT XTRAFILE! + printf "%s\t%s\t0.0\t0.0\t%s%s%s\t" \ + "%.1f\t%.1f\t%s\t" \ + "%s\t%d\t%d\t%d\t%d\t%d\t%d\t%s\t%s\t%s\t%s\t%s\n", + gcid, name, + "http://www.geocaching.com/seek/cache_details.aspx", + "?log=y&wp=", gcid, + difficulty, terrain, container, + strtype, vartime, + ifound, soc, iplaced, placedt, foundt, ifoundt, + gctype, placer, "hint", lastfound >> ARCHFILE + if (--NUM == 0) + exit + } + } + ' +} + +# +# A temporary style we can use for merging the loc data with +# the scraped html data. This is a dual purpose hack. We +# use it as an output format to convert the .loc data to a +# record-per-line format. We use it as an input format to +# read up the merged data. +# +make_scrape_style() { + cat <<-EOF + ENCODING UTF-8 + FIELD_DELIMITER TAB + RECORD_DELIMITER NEWLINE + BADCHARS TAB + IFIELD SHORTNAME, "", "%s" + IFIELD DESCRIPTION, "", "%s" + IFIELD LAT_DECIMAL, "", "%.6f" + IFIELD LON_DECIMAL, "", "%.6f" + IFIELD URL, "", "%s" + IFIELD GEOCACHE_DIFF, "", "%3.1f" #difficulty + IFIELD GEOCACHE_TERR, "", "%3.1f" #terrain + IFIELD GEOCACHE_CONTAINER,"", "%s" #container (not set) + IFIELD ICON_DESCR, "", "%s" #strtype (Geocache-*) + IFIELD TIMET_TIME, "", "%ld" #variable time + IFIELD IGNORE, "", "%s" #ifound + IFIELD IGNORE, "", "%s" #soc + IFIELD IGNORE, "", "%s" #iplaced + IFIELD IGNORE, "", "%s" #placed time + IFIELD IGNORE, "", "%s" #found time + IFIELD IGNORE, "", "%s" #ifound time + IFIELD GEOCACHE_TYPE, "", "%s" #gc.com type + IFIELD GEOCACHE_PLACER, "", "%s" #gc.com placer + IFIELD GEOCACHE_HINT, "", "%s" #gc.com hint + IFIELD GEOCACHE_LAST_FOUND, "","%s" #gc.com last found + OFIELD SHORTNAME, "", "%s" + OFIELD DESCRIPTION, "", "%s" + OFIELD LAT_DECIMAL, "", "%.6f" + OFIELD LON_DECIMAL, "", "%.6f" + OFIELD URL, "", "%s" + OFIELD GEOCACHE_DIFF, "", "%3.1f" #difficulty + OFIELD GEOCACHE_TERR, "", "%3.1f" #terrain + OFIELD GEOCACHE_CONTAINER,"", "%s" #container (not set) + EOF + # OFIELD ICON_DESCR, "", "%s" +} + +# +# csv2csv geo-mystery-file +# +csv2csv() { + if [ ! -e "$1" ]; then + error "Don't have a -M '$1' file" + fi + + awk -v GEOMYSTERY=$1 ' + function latlon ( val ) { + if (val ~ ".[.]..*[.].*") + { + if (val ~ "[-wWsS]") + { + val = substr(val, 2) + neg = 1 + } + else if (val ~ "[nNeE]") + { + val = substr(val, 2) + neg = 0 + } + else + neg = 0 + dd = int(val) + sub("[^.]*[.]", "", val) + dd += (val+0.0) / 60.0 + return neg ? -dd : dd + } + return val + } + BEGIN { + while (getline 0) + { + if ($0 ~ "^#") + continue + if ($0 ~ "^[ ]*$") + continue + gc=$1 + sub(".*/", "", gc) # remove stuff like http://coord.info/ + if ($2 ~ "unk") + { + lat[gc] = 48 + lon[gc] = -88 + } + else + { + lat[gc] = $2 + lon[gc] = $3 + } + } + FS=" " + } + { + if (lat[$1] != 0) + { + deglat = latlon( lat[$1] ) + deglon = latlon( lon[$1] ) + # GC# Desc lat lon URL diff terr size + printf "%s\t", $1 + printf "+%s\t", $2 + printf "%.6f\t%.6f\t", deglat, deglon + for (i = 5; i < NF; ++i) + printf "%s\t", $i + printf "%s\n", $NF + } + else + print + } + ' +} + +# +# Fetch the cache patch +# +gc_fetch_cache_page(){ + _page=$1 #out + _gcid=$2 #in + _url=$3 #in + _extra=$4 #in + + # Fetch the basic cache page + echo "" > $_page + debug 1 "${_extra}curl $_url #cache fetch $_gcid.html" + curl $CURL_OPTS -L -s -b $COOKIE_FILE -A "$UA" \ + $_url \ + | tr -d "\001\007\010\013\017\020\031" \ + | sed -e '/<\/html>/d' \ + >> $_page + + size=$(ls -l $_page | awk '{print $5}') + if [ $size -lt 1000 ]; then + debug 0 "Could not retrieve web page for cache $_gcid" + return 1 + fi + + # JSON for logbooks + JSON_NUM=100 + tkn=`grep "userToken = '" $_page | sed -e "s/userToken = '//" -e "s/'.*//" ` + jsurl="http://www.geocaching.com/seek/geocache.logbook" + jsurl="$jsurl?tkn=$tkn" + jsurl="$jsurl&idx=1&num=$JSON_NUM&sp=false&sf=false&decrypt=false" + debug 1 "curl $jsurl" >&2 + curl $CURL_OPTS -s -A "$UA" -b $COOKIE_FILE \ + "$jsurl" >> $_page + echo "" >> $_page + echo "" >> $_page + return 0 +} + +# +# Query the gc website +# +gc_query() { + if [ $USERFOUND = 0 ]; then + FOUND=1 + fi + if [ $FOUND = 0 ]; then + SEARCH="$SEARCH&f=1" + fi + if [ "$RADIUS_NUM" != "" ]; then + SEARCH="$SEARCH&dist=$RADIUS_MILES" + fi + + if [ $DEBUG -gt 0 ]; then + TMP=/tmp/geo + else + TMP=/tmp/geo$$ + fi + + HTMLPAGE=$TMP.page + CIDFILE=$TMP.cids + LOCFILE=$TMP.loc + LOCTMPFILE=$TMP.tmp + XTRAFILE=$TMP.xtra + CSVFILE=$TMP.csv + CSVFILE2=$TMP.csv2 + JOINFILE=$TMP.join + MERGEFILE=$TMP.merge + ARCHFILE=$TMP.arch + OUTWAY=$TMP.way + STYLE=$TMP.newstyle + + CRUFT="$CRUFT $HTMLPAGE" + CRUFT="$CRUFT $CIDFILE" + CRUFT="$CRUFT $LOCFILE" + CRUFT="$CRUFT $LOCTMPFILE" + CRUFT="$CRUFT $XTRAFILE" + CRUFT="$CRUFT $CSVFILE" + CRUFT="$CRUFT $CSVFILE2" + CRUFT="$CRUFT $JOINFILE" + CRUFT="$CRUFT $MERGEFILE" + CRUFT="$CRUFT $ARCHFILE" + CRUFT="$CRUFT $OUTWAY" + CRUFT="$CRUFT $STYLE" + if [ $NOCOOKIES = 1 ]; then + CRUFT="$CRUFT $COOKIE_FILE" + fi + + # + # Login to gc.com + # + gc_login "$USERNAME" "$PASSWORD" + + # + # Find the bookmark + # + if [ "$BOOKMARK" != "" ]; then + URL="$GEO/bookmarks" + debug 1 "$start: curl $URL #bookmark" + SEARCH=` + curl $CURL_OPTS -L -s -b $COOKIE_FILE -A "$UA" "$URL" \ + | grep -y ">$BOOKMARK<" \ + | $sed \ + -e 's@. title.*@@' \ + -e 's@^.*href=.http://www.geocaching.com/@@' -e 's/.>.*$//' + ` + case "$SEARCH" in + *bookmarks*) ;; + *) error "No bookmark with the name '$BOOKMARK'.";; + esac + fi + + # + # Find the pocket query + # + if [ "$POCKETQUERY" != "" ]; then + URL="$GEO/pocket/default.aspx" + debug 1 "$start: curl $URL #pocket-query" + SEARCH=` + curl $CURL_OPTS -L -s -b $COOKIE_FILE -A "$UA" "$URL" \ + | grep -y "title=\"$POCKETQUERY\"" \ + | $sed \ + -e 's@.*guid=@@' -e 's@".*@@' + ` + case "$SEARCH" in + *-*-*-*-*) SEARCH="?pq=$SEARCH";; + *) error "No PQ with the name '$POCKETQUERY'.";; + esac + fi + + # + # We might combine one or more pages into a single XML, so cobble + # up a header with the ?xml and loc tags. + # + cat <<-EOF > $LOCFILE + + + EOF + + # + # Loop, getting at least "NUM" locations + # + ((NUM=NUM-1)) + if [ $DEBUG -gt 0 ]; then + filter2="tee $TMP.bulk" + else + filter2=cat + fi + + subscriber=1 + > $XTRAFILE + > $ARCHFILE + ((start=0)) + while ((start <= NUM)); do + sleep $GEOSLEEP + + # + # Fetch the page of closest caches and scrape the cache ID's + # + case "$SEARCH" in + *bookmark*) + URL="$GEO/$SEARCH" + ;; + *) + URL="$GEO/seek/nearest.aspx" + URL="$URL$SEARCH" + ;; + esac + debug 1 "$start: curl $URL #list" + if ((start > 0)); then + # "postback"... grab the "next" button + case "$SEARCH" in + *bookmark*) + # __EVENTTARGET="ListInfo\$pgrBMItems\$_ctl08" + # Get the last TGT (== ctl08) + TGT=$($sed -n "s/^.*__doPostBack('.*pgrBMItems\$\(.*\)','.*/\1/p" \ + < $HTMLPAGE) + if [ "$TGT" = "" ]; then + error "TGT is blank!" + fi + __EVENTTARGET="ctl00%24ContentBody%24ListInfo%24pgrBMItems%24$TGT" + ;; + *) + TGT=$($sed -n "s/^.*__doPostBack('.*pgrTop\$\(.*\)','.*/\1/p" \ + < $HTMLPAGE) + if [ "$TGT" = "" ]; then + error "TGT is blank!" + fi + __EVENTTARGET="ctl00%24ContentBody%24pgrTop%24$TGT" + ;; + esac + curl $CURL_OPTS -L -s -b $COOKIE_FILE -A "$UA" \ + -d __EVENTTARGET="$__EVENTTARGET" \ + $viewstate \ + "$URL" \ + | $sed -e "s/'/'/g" -e "s/\r//" > $HTMLPAGE + else + curl $CURL_OPTS -L -s -b $COOKIE_FILE -A "$UA" \ + "$URL" \ + | $sed -e "s/'/'/g" -e "s/\r//" > $HTMLPAGE + if [ "$DEBUG" -ge 1 ]; then + grep "Total Records:.*Top.*" $HTMLPAGE | + sed -e "s/<.b>.*//" -e "s/^.*span>//" -e "s///" 1>&2 + fi + fi + rc=$?; if [ $rc != 0 ]; then + error "curl: fetch $URL" + fi + if grep -s -q "We encountered an error when requesting that page!" \ + $HTMLPAGE; then + error "searching error (1) on $start" + fi + if grep -s -q "has resulted in an error" \ + $HTMLPAGE; then + error "searching error (2) on $start" + fi + if grep -s -q "By State" $HTMLPAGE; then + error "searching gave up on $start" + fi + if grep -s -q ">Advanced Search<" $HTMLPAGE; then + error "need a country AND a state!" + fi + + # + # Grab a few important values from the page + # + gc_getviewstate $HTMLPAGE + # cp $HTMLPAGE /tmp/view$start.html + + # + # Grab the CIDs into two categories: found and notfound + # + > $CIDFILE + debug 3 "getcids $HTMLPAGE $CIDFILE $XTRAFILE $ARCHFILE $((NUM-start))" + getcids $HTMLPAGE $CIDFILE $XTRAFILE $ARCHFILE $((NUM-start)) + + # + # Fetch the waypoints, rip out the ?xml and loc tags, and + # append to the $LOCFILE file. + # + if [ -s "$CIDFILE" ]; then + sleep $GEOSLEEP + case "$SEARCH" in + *bookmark*) + URL="$GEO/$SEARCH" + ;; + *) + URL="$GEO/seek/nearest.aspx" + URL="$URL$SEARCH" + ;; + esac + # + # Fetch the .loc file + # 1) -d "Download=Download+Waypoints"... geo-nearest + # 2) -d "ListInfo:btnDownload= ... old + # 3) -d 'ctl00$ContentBody ... -b acro + # + debug 2 "$start: curl $URL #loc" + curl $CURL_OPTS -s -b $COOKIE_FILE -A "$UA" \ + $viewstate \ + `cat $CIDFILE` \ + -d "Download=Download+Waypoints" \ + -d "ListInfo:btnDownload=Download+to+.Loc" \ + -d 'ctl00$ContentBody$ListInfo$btnDownload=Download+to+.Loc' \ + "$URL" \ + | $filter2 \ + | $sed -e 's/^]*>//' \ + -e 's/>[gG]eocacheGeocache]*>//' \ + -e 's###' \ + > $LOCTMPFILE + rc=$?; if [ $rc != 0 ]; then + error "curl: fetch the waypoints" + fi + if grep -s -q "you are not logged in" $LOCTMPFILE; then + error "you are not logged in on $start" + fi + if grep -s -q "has resulted in an error" $LOCTMPFILE; then + error "searching error (3) on $start" + fi + if grep -s -q "Geocaching > Search for Geocaches" $LOCTMPFILE; then + error "searching error (4) on $start" + fi + if grep -s -q "recaptcha_challenge_field" $LOCTMPFILE; then + # + # Basic members: do it the SLOW way + # + if [ "$GEODIR" != "" -a ! -d "$GEODIR" ]; then + mkdir "$GEODIR" || error "Couldn't mkdir $GEODIR" + fi + if [ "$GEODIR/caches" != "" -a ! -d "$GEODIR/caches" ]; then + mkdir "$GEODIR/caches" \ + || error "Couldn't mkdir $GEODIR/caches" + fi + + if [ $subscriber = 1 ]; then + debug 0 "Basic Member: pay the \$30/yr fee for Premium Member!" + debug 0 "Basic Member: doing it the REAL SLOW way!!!" + timestamp="$GEODIR/caches/.timestamp" + $touch -d "1 day ago" $timestamp + fi + subscriber=0 + + # + # Pull 20 GCIDs... + # + bstart=$start + grep "^ *GC.*" $HTMLPAGE \ + | $sed -e "s/ //g" \ + | while read gcid; do + # + # Get the cache page + # + cachepage="$GEODIR/caches/$gcid.html" + if [ ! -s $cachepage -o $timestamp -nt $cachepage ]; then + # cache page doesn't exist or out of date + sleep 3 #$GEOSLEEP + + urlpage="http://www.geocaching.com" + urlpage="$urlpage/seek/cache_details.aspx" + urlpage="$urlpage?log=y&wp=$gcid" + gc_fetch_cache_page $cachepage $gcid $urlpage \ + "$bstart: " + if [ $? != 0 ]; then + continue + fi + fi + + # 01/07/12: remove soc's! + if grep -q 'alt="Premium Members only"' $cachepage; then + continue + fi + # 12/18/12: remove soc's + if grep -q 'uxPremiumSubmitBottom' $cachepage; then + continue + fi + # 02/04/12: removed archived! + if grep -q '>This cache has been archived' $cachepage; then + continue + fi + + # + # Cobble up the .loc file entry + # + name=` grep -A1 "" $cachepage \ + | tail -1 | tr -d "\r" \ + | $sed -e 's/[ ]*GC[^ ]* //' -e 's/ (.*by/ by/' ` + diff=` grep ctl00_ContentBody_uxLegendScale $cachepage \ + | $sed -e 's/.*alt="//' -e 's/ .*//' ` + terr=` grep ctl00_ContentBody_Localize6 $cachepage \ + | $sed -e 's/.*alt="//' -e 's/ .*//' ` + size=` grep "alt=.Size:" $cachepage \ + | $sed -e 's/.*alt="Size: //' -e 's/" .*//' ` + case $size in + Unknown) cont=1;; + Micro) cont=2;; + Regular) cont=3;; + Large) cont=4;; + Virtual) cont=5;; + Other) cont=6;; + Small) cont=8;; + *) cont=1;; + esac + + echo "<waypoint>" + echo "<name id=\"$gcid\"><![CDATA[$name]]></name>" + grep "lnkConversions" $cachepage \ + | $sed -e 's/.*lat=/<coord lat="/' \ + -e 's/&lon=/" lon="/' -e 's@&.*@"/>@' + echo "<type>Geocache</type>" + echo -n "<link text=\"Cache Details\">" + urlpage="http://www.geocaching.com" + urlpage="$urlpage/seek/cache_details.aspx" + urlpage="$urlpage?wp=$gcid" + echo -n "$urlpage" + echo "</link>" + echo "<difficulty>$diff</difficulty>" + echo "<terrain>$terr</terrain>" + echo "<container>$cont</container>" + echo "</waypoint>" + + debug 3 "bstart: $bstart" + if [ $bstart == $NUM ]; then + break + fi + ((++bstart)) + #break + done >> $LOCFILE + else + cat $LOCTMPFILE >> $LOCFILE + fi + fi + + # + # Check to see if the user hasn't agreed to license terms + # + if grep -s -q "lblAgreementText" $LOCFILE; then + easy_warning >&2 + remove_cruft + exit + fi + + ((start=start+20)) + + # If the Next button is disabled, break this loop + # grep "Records: <b>[1-9].*disabled.><b>Next<" $HTMLPAGE + if grep -s -q "Records: <b>[1-9].*disabled.><b>Next " $HTMLPAGE; then + # echo "$start: dis" + break; + fi + done + + # + # Finish off the .loc file + # + echo "</loc>" >> $LOCFILE + + # + # Convert the .loc data to .csv format and join it with + # the extra data scraped from the HTML page. Filter out + # the data according to the -I and -X options. + # + # http://www.geocaching.com/seek/cache_details.aspx?wp=GCG2H4 + # http://www.geocaching.com/seek/cache_details.aspx?log=y&wp=GCG2H4 + # http://www.geocaching.com/seek/cache_details.aspx?ID=92117&log=y + # + # The joined .csv format looks like this: + # GCH636 Jidana 3 by rickrich 44.94520 -93.47540 \ + # http://www.geocaching.com/seek/cache_details.aspx?log=y&wp=GCH636 \ + # Geocache-ifound-regular 1070285077 1 0 1 \ + # 1067925600 1070285077 0 + # + make_scrape_style > $STYLE + + dbgcmd gpsbabel -i geo$GEONUKE -f $LOCFILE \ + -o xcsv,style=$STYLE -F $CSVFILE2 + if [ $? != 0 ]; then + cp $LOCFILE /tmp/geo.err + error "gpsbabel returned error code [1]" + fi + + # Convert CSV into CSV with puzzles... + csv2csv $GEOMYSTERY < $CSVFILE2 > $CSVFILE + + # 01/07/12: NO --nocheck-order; it is wrong! + join -t ' ' $CSVFILE $XTRAFILE > $JOINFILE + if [ $? != 0 ]; then + cp $CSVFILE /tmp/geo.err.csv + cp $XTRAFILE /tmp/geo.err.xtra + error "joined file error: see join /tmp/geo.err.{csv,xtra}" + fi + egrep -- "$INCLUDE" < $JOINFILE \ + | egrep -v -- "$EXCLUDE" \ + | $sed -e 's/wp=/log=y\&&/' > $MERGEFILE + + if [ $FOUND = 1 ]; then + cat $ARCHFILE \ + | egrep -- "$INCLUDE" | egrep -v -- "$EXCLUDE" \ + | $sed -e 's/wp=/log=y\&&/' >> $MERGEFILE + fi + + if [ $DEBUG -ge 2 ]; then + # First two of these should be the same number of lines! + wc -l $CSVFILE >&2 + wc -l $XTRAFILE >&2 + wc -l $MERGEFILE >&2 + fi + + # + # Convert to the desired format + # + BABELFILT= + if [ "$RADIUS" != "" ]; then + BABELFILT="-x radius,distance=$RADIUS,lat=$LAT,lon=$LON" + fi + + if [ $SQL = 1 ]; then + # + # add it via mysql + # + if [ "$OUTFILE" != "" ]; then + >"$OUTFILE" + fi + + if [ $PURGE = 1 ]; then + gpsdrive_purge | gpsdrive_mysql + PURGE=2 + fi + + dbgcmd gpsbabel $BABELFLAGS \ + -i xcsv,style=$STYLE -f $MERGEFILE \ + $BABELFILT -o "$OUTFMT" -F $OUTWAY + if [ $? != 0 ]; then + error "gpsbabel returned error code [2]" + fi + gpsdrive_add <$OUTWAY $SQLTAG | gpsdrive_mysql + elif [ $MAP = 1 ]; then + dbgcmd gpsbabel $BABELFLAGS \ + -i xcsv,style=$STYLE -f $MERGEFILE \ + $BABELFILT -o "$OUTFMT" -F $OUTWAY + if [ $? != 0 ]; then + error "gpsbabel returned error code [3]" + fi + if [ "$OUTFILE" = "" ]; then + dbgcmd geo-map -s0 $MAPOPTS -t$OUTWAY + else + dbgcmd geo-map -s0 $MAPOPTS -t$OUTWAY -o"$OUTFILE" + fi + else + # + # output to stdout or to a file + # + if [ "$OUTFILE" = "" ]; then + OUTTMP="$TMP.way"; CRUFT="$CRUFT $OUTTMP" + dbgcmd gpsbabel $BABELFLAGS \ + -i xcsv,style=$STYLE -f $MERGEFILE \ + $BABELFILT -o "$OUTFMT" -F $OUTTMP + if [ $? != 0 ]; then + error "gpsbabel returned error code [4]" + fi + cat $OUTTMP + else + dbgcmd gpsbabel $BABELFLAGS \ + -i xcsv,style=$STYLE -f $MERGEFILE \ + $BABELFILT -o "$OUTFMT" -F $OUTFILE + if [ $? != 0 ]; then + error "gpsbabel returned error code [5]" + fi + fi + fi + + # + # Optionally, print the HTML pages + # + if [ "$CMDPIPE" != "" ]; then + OIFS="$IFS" + IFS=" " + while read id desc lat lon url diff terr container strtype \ + vartime ifound soc iplaced placedt foundt ifoundt extra; do + url="$url&decrypt=y" + echo "Print: $url" + HTMLPAGE2=$TMP.html + CRUFT="$CRUFT $HTMLPAGE2" + debug 1 "curl $url" >&2 + dbgcmd curl $CURL_OPTS -s -A "$UA" -b $COOKIE_FILE "$url" > $HTMLPAGE2 + htmldoc --quiet -t ps --nup 2 --fontsize 14 --webpage $HTMLPAGE2 \ + | psselect -q -p1-1 | eval $CMDPIPE + # exit + done < $MERGEFILE + IFS="$OIFS" + fi + + # + # Optionally, fetch printable HTML pages + # + if [ "$HTMLDIR" != "" -o "$LOGDIR" != "" ]; then + if [ "$HTMLDIR" != "" -a ! -d "$HTMLDIR" ]; then + mkdir "$HTMLDIR" || error "Couldn't mkdir $HTMLDIR" + fi + if [ "$LOGDIR" != "" -a ! -d "$LOGDIR" ]; then + mkdir "$LOGDIR" || error "Couldn't mkdir $LOGDIR" + fi + + HTMLPAGE2=$TMP.html + CRUFT="$CRUFT $HTMLPAGE2" + TIMESTAMP=$TMP.time + CRUFT="$CRUFT $TIMESTAMP" + + fetchcnt=0 + fetchmax=1000 + if [ $DEBUG -ge 3 ]; then + fetchmax=3 + fi + OIFS="$IFS" + IFS=" " + while read id desc lat lon url diff terr container strtype \ + vartime ifound soc iplaced placedt foundt ifoundt extra; do + # + # Don't fetch page if we already have a current version + # + #debug 1 "placedt=<$placedt> <$foundt>" + if [ $placedt -gt $foundt ]; then + filetime="$placedt" + else + filetime="$foundt" + fi + $touch -d "1/1/70 $filetime seconds last second" $TIMESTAMP + if [ "$filetime" -gt 0 -a "$HTMLDIR/$id.html" -nt $TIMESTAMP ]; then + continue + fi + + # Basic member... + if [ "$subscriber" == 0 -a "$HTMLDIR" != "" ]; then + debug 2 "cp $GEODIR/caches/$id.html $HTMLDIR/$id.html" + cp "$GEODIR/caches/$id.html" "$HTMLDIR/$id.html" + # debug 2 "f: $filetime" + if [ "$filetime" -gt 0 ]; then + $touch -d "1/1/70 $filetime seconds" "$HTMLDIR/$id.html" + fi + continue + fi + + # Limit to 1000 caches/day + ((fetchcnt=fetchcnt+1)) + if [ $fetchcnt -gt $fetchmax ]; then + error "Fetch count exceeded $fetchmax. Try tomorrow!" + fi + + # Be kind to the server. Do not remove this sleep + sleep $GEOSLEEP + + gc_fetch_cache_page $HTMLPAGE $id $url "" + if [ $? != 0 ]; then + continue + fi + + if [ "$HTMLDIR" != "" ]; then + cp $HTMLPAGE "$HTMLDIR/$id.html" || + error "Couldn't copy $id cache page" + if [ "$filetime" -gt 0 ]; then + $touch -d "1/1/70 $filetime seconds" "$HTMLDIR/$id.html" + fi + fi + + if [ "$LOGDIR" != "" ]; then + $sed -e '1,/Logged Visits/d' \ + -e 's/<strong><img src=/\ +&/g' \ + < $HTMLPAGE | + egrep ">$LOGUSERNAME<|strong> \($LOGUSERNAME\) \(" | + $sed -e 's#<a href="log.aspx?LUID.*##' \ + -e 's#<a href=./profile[^ ]*##' \ + > $HTMLPAGE2 + lynx -dump $HTMLPAGE2 > $LOGDIR/$id.log + if [ "$filetime" -gt 0 ]; then + $touch -d "1/1/70 $filetime seconds" "$LOGDIR/$id.log" + fi + fi + done < $MERGEFILE + IFS="$OIFS" + + if [ "$LOGDIR" != "" ]; then + # This is a hack, and might be inaccurate + echo -n "Finds:" >&2 + MONTHS=" January | February | March | April | May | June " + MONTHS="$MONTHS| July | August | September | October " + MONTHS="$MONTHS| November | December " + egrep "$MONTHS" $LOGDIR/*.log | + egrep "Found it |icon_smile|icon_happy|icon_camera" | wc -l >&2 + fi + + fi +} + +############################################################################## +# end #include "geo-common-gc" +############################################################################## +############################################################################## +# begin #include "geo-common-gpsdrive" +############################################################################## + +# +# default MySQL global options... +# +SQLUSER=gast +SQLPASS=gast +SQLDB=geoinfo +SQLITEDB=$HOME/.gpsdrive/waypoints.db +SQLTAG=Geocache + +# +# procedures for updating gpsdrive database via MySQL +# +# Global Vars: $SQLDB, $SQLTAG $OUTFILE +# +gpsdrive_create_210() { + echo "CREATE TABLE poi (" + echo "poi_id INTEGER PRIMARY KEY AUTOINCREMENT," + echo "name VARCHAR(80) NOT NULL default 'not specified'," + echo "poi_type VARCHAR(160) NOT NULL default 'unknown'," + echo "lat DOUBLE NOT NULL default '0'," + echo "lon DOUBLE NOT NULL default '0'," + echo "alt DOUBLE default '0'," + echo "comment VARCHAR(255) default NULL," + echo "last_modified DATETIME NOT NULL default '0000-00-00'," + echo "source_id INTEGER NOT NULL default '1'," + echo "private CHAR(1) default NULL);" + echo "CREATE TABLE poi_extra (" + echo "poi_id INTEGER NOT NULL default '0'," + echo "field_name VARCHAR(160) NOT NULL default '0'," + echo "entry VARCHAR(8192) default NULL);" +} + +gpsdrive_purge() { + case "$GPSDRIVE_VER" in + ""|"2.09") + delcmd="delete from waypoints" + echo "use $SQLDB;" + echo "$delcmd where type like '$SQLTAG%';" + ;; + "2.10") + if [ ! -s $SQLITEDB ]; then + gpsdrive_create_210 + fi + SQLTAG=`echo $SQLTAG | tr A-Z a-z` + delcmd="delete from poi" + echo "$delcmd where poi_type like '$SQLTAG%';" + ;; + esac +} + +gpsdrive_add_209() { + delcmd="delete from waypoints" + addcmd="replace into waypoints (name,lat,lon,type)" + addcmd="insert into waypoints (name,lat,lon,type)" + sqltag="$1" + echo "use $SQLDB;" + while read name lat lon type extra + do + name=`echo "$name" | tr -d "'"` + # Primary key is autoincrementing id number, so delete + # the old record (if any) by name and type + if [ $PURGE = 0 ]; then + echo "$delcmd where name='$name' and type like '$SQLTAG%';" + fi + + if [ $DELETE = 0 ]; then + # Add the new record + if [ "$sqltag" = "Geocache" ]; then + tag="$type" + else + tag="$sqltag" + fi + echo "$addcmd values ('$name','$lat','$lon','$tag');" + fi + done +} + +gpsdrive_add_210(){ + if [ ! -s $SQLITEDB ]; then + gpsdrive_create_210 + fi + echo "PRAGMA synchronous=OFF;" + delcmd="delete from poi" + addcmd="replace into poi (name,poi_type,lat,lon,alt,comment,last_modified)" + addcmd="insert into poi (name,poi_type,lat,lon,alt,comment,last_modified)" + sqltag="$1" + sqltag=`echo "$sqltag" | tr A-Z a-z` + OIFS="$IFS" + IFS="|" + #while read name lat lon type extra + poi_id=0 + egrep -v 'Geocache Found|-ifound' \ + | tr -d "|" | tr ' ' '|' | tr -d "'" | + while read index shortname description notes url urltext icon lat lon \ + lat32 lon32 latdecdir londecdir latdirdec londirdec latdir londir \ + altfeet altmeters excel timet diff terr container type \ + pathmiles pathkm placer yyyymmmdd hint lastfound extra + do + if [ "$placer" = "$USERNAME" ]; then + continue + fi + if [ "$placer" = "dyl1231" ]; then + continue + fi + + #name=`echo "$description" | tr -d "'"` + #For Performance... + name=${description//\'/} + + # Primary key is autoincrementing id number, so delete + # the old record (if any) by name and type + if [ $PURGE = 0 ]; then + echo "$delcmd where name='$name' and poi_type like '%$sqltag%';" + fi + + ((poi_id=poi_id+1)) + if [ $DELETE = 0 ]; then + # Add the new record + if [ "$sqltag" = "geocache" ]; then + tag="$type" + else + tag="$sqltag" + fi + case "$type" in + "Earthcache") poi_type="geocache.geocache_earth";; + "Event Cache") poi_type="geocache.geocache_event";; + "Mega-Event Cache") poi_type="geocache.geocache_event";; + "Cache In Trash Out Event") poi_type="geocache.geocache_event";; + "found") poi_type="geocache.geocache_found";; + "Multi-cache") poi_type="geocache.geocache_multi";; + "Unknown Cache") poi_type="geocache.geocache_mystery";; + "night") poi_type="geocache.geocache_night";; + "Traditional Cache") poi_type="geocache.geocache_traditional";; + "Virtual Cache") poi_type="geocache.geocache_virtual";; + "Webcam Cache") poi_type="geocache.geocache_webcam";; + *) poi_type="geocache";; + esac + echo -n "$addcmd values ('$name','$poi_type'," + echo -n "'$lat','$lon'," + echo -n "'0.0'," #alt + echo -n "'$type $container $diff/$terr. Last Found: $lastfound. $hint'," + echo "'0');" + fi + done + IFS="$OIFS" +} + +gpsdrive_add() { + case "$GPSDRIVE_VER" in + ""|"2.09") gpsdrive_add_209 "$1";; + "2.10") gpsdrive_add_210 "$1";; + esac +} + +gpsdrive_mysql() { + if [ "$OUTFILE" != "" ]; then + cat >> $OUTFILE + elif [ $DEBUG -gt 0 ]; then + cat + else + mysql -u$SQLUSER -p$SQLPASS + fi +} + +gpsdrive_sqlite3() { + if [ "$OUTFILE" != "" ]; then + cat >> $OUTFILE + elif [ $DEBUG -gt 0 ]; then + cat + else + sqlite3 $HOME/.gpsdrive/waypoints.db + fi +} + +# +# Extended list of gpsbabel output formats +# +gpsbabel_formats() { + gpsbabel -? | sed -e '1,/File Types/d' -e '/Supported data filters/,$d' + echo " gpsdrive.sql " \ + "GpsDrive direct MySQL database insertion" + echo " map[,geo-map-opts] " \ + "Display map of waypoints using geo-map" +} + +############################################################################## +# end #include "geo-common-gpsdrive" +############################################################################## + +# +# Set default options, can be overriden on command line or in rc file +# +UPDATE_URL=$WEBHOME/geo-nearest +UPDATE_FILE=geo-nearest.new + +read_rc_file + +# +# Process the options +# + +gc_getopts "$@" +shift $? + +# +# Main Program +# +case "$#" in +6) + # Cut and paste from geocaching.com cache page + # N 44 58.630 W 093 09.310 + LAT=`echo "$1$2.$3" | tr -d '\260\302' ` + LAT=`latlon $LAT` + LON=`echo "$4$5.$6" | tr -d '\260\302' ` + LON=`latlon $LON` + SEARCH="?origin_lat=$LAT&origin_long=$LON" + ;; +3) + # lat lon cache-type + LAT=`latlon $1` + LON=`latlon $2` + case "$3" in + webcam) cFilter="31d2ae3c-c358-4b5f-8dcd-2185bf472d3d";; + earth*) cFilter="c66f5cf3-9523-4549-b8dd-759cd2f18db8";; + multi*) cFilter="a5f6d0ad-d2f2-4011-8c14-940a9ebf3c74";; + event) cFilter="69eb8534-b718-4b35-ae3c-a856a55b0874";; + virtual) cFilter="294d4360-ac86-4c83-84dd-8113ef678d7e";; + letter*) cFilter="4bdd8fb2-d7bc-453f-a9c5-968563b15d24";; + unknown) cFilter="40861821-1835-4e11-b666-8d41064d03fe";; + trad*) cFilter="32bc9333-5e52-4957-b0f6-5a2c8fc7b257";; + reg*) cFilter="32bc9333-5e52-4957-b0f6-5a2c8fc7b257";; + *) error "Unknown cache-type '$3'";; + esac + SEARCH="?lat=$LAT&lng=$LON&cFilter=$cFilter" + ;; +2) + LAT=`latlon $1` + LON=`latlon $2` + SEARCH="?origin_lat=$LAT&origin_long=$LON" + ;; +1) + case "$1" in + iraq|Iraq) SEARCH="?country_id=97" ;; + u=*) + SEARCH="?$1" + ;; + ul=*) + SEARCH="?$1" + ;; + pq=*) + SEARCH="?$1" + ;; + tx=*\&*) + # tx=NNN&ul=USERNAME + SEARCH="?$1" + ;; + tx=*) + LAT=`latlon $LAT` + LON=`latlon $LON` + case "$1" in + tx=webcam) tx="tx=31d2ae3c-c358-4b5f-8dcd-2185bf472d3d";; + tx=earth*) tx="tx=c66f5cf3-9523-4549-b8dd-759cd2f18db8";; + tx=multi*) tx="tx=a5f6d0ad-d2f2-4011-8c14-940a9ebf3c74";; + tx=event) tx="tx=69eb8534-b718-4b35-ae3c-a856a55b0874";; + tx=virtual) tx="tx=294d4360-ac86-4c83-84dd-8113ef678d7e";; + tx=letter*) tx="tx=4bdd8fb2-d7bc-453f-a9c5-968563b15d24";; + tx=unknown) tx="tx=40861821-1835-4e11-b666-8d41064d03fe";; + tx=trad*) tx="tx=32bc9333-5e52-4957-b0f6-5a2c8fc7b257";; + tx=reg*) tx="tx=32bc9333-5e52-4957-b0f6-5a2c8fc7b257";; + *) tx=$1;; + esac + SEARCH="?$tx&lat=$LAT&lng=$LON" + ;; + guid=*) + SEARCH="bookmarks/view.aspx?$1" + ;; + *[0-9]*) + ZIP=$1 + SEARCH="?zip=$ZIP" + ;; + *) + error "'$1' isn't something I understand how to search for" + ;; + esac + ;; +0) + SEARCH="?origin_lat=$LAT&origin_long=$LON" + ;; +*) + usage + ;; +esac + +gc_query diff --git a/tools/googledirections b/tools/googledirections new file mode 100755 index 0000000..6826311 --- /dev/null +++ b/tools/googledirections @@ -0,0 +1,4 @@ +#!/bin/bash +FROM="$1" +TO="$2" +(wget -O - "http://maps.google.com/maps?q=$FROM to $TO&output=js" 2>/dev/null) | gpsbabel -i google -f - -o gpx -F - diff --git a/tools/images2waypoints.pl b/tools/images2waypoints.pl new file mode 100755 index 0000000..d5fa832 --- /dev/null +++ b/tools/images2waypoints.pl @@ -0,0 +1,376 @@ +#! /usr/bin/perl -w +# Copyright (C) 2010 Rob Norris <rw_norris@hotmail.com> +# +# 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., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA +# + + +=head1 Overview + +A script to auto generate basic Viking .vik files for directories containing images. +Note that from Viking 1.3 onwards it can load geotagged images directly, + although it does not have recursive directory capabilities. + +Simply recursively search down the directory tree (from the current location) for suitable image files + [normally jpg|JPG (probably photographs)] and then extract any location data from the EXIF part. + +For each directory this info is output to a file into either Viking (default) or GPX data file formats. +Output filename is waypoints.vik (or waypoints.gpx in GPX mode) unless the -o option is specified. + + +Options: +-g put into outputting GPX file mode +-o <name> - specify output base filename (overriding 'waypoints') +-r make waypoint image filenames relative (rather than absolute) + +Required programs: +. exiftool - getting location data from EXIF (Debian package libimage-exiftool-perl) + +Various improvements can be: +. Command line options to control things eg: + .which symbol to use for each point + .which Viking Map / other viking defaults + .a non recursive mode + .a mode to generate one massive file instead of one per directory + +. Work out zoom factor to see all points in Viking +. Metadata bounds for gpx + +. Any Speed optimizations - deciding which files to process could be improved +. Maybe better control of which files to analyse - maybe any - not just files named .jpg +. Is even doing this in Perl the best tool for the job [consider python, C, etc...]? + +=cut + +# ************ START OF CODE ******************* + +use strict; +use File::Find; +use Image::ExifTool qw(:Public); + +# Output modes +use constant VIKING => 1; +use constant GPX => 2; + +use constant RELATIVE => 1; +use constant ABSOLUTE => 2; + +################################# +# Some global variables +# Create a new Image::ExifTool object +my $exifTool = new Image::ExifTool; + +my @waypoint = ("","","","","",""); +my @position = ("0.0", "0.0"); # lat / long + +my $out_file; + +# Default mode +my $mode = VIKING; +my $imagefilemode = ABSOLUTE; + +################################# + +# Write header first part of .vik file +sub Header_Viking { + + return <<END; +#VIKING GPS Data file http://viking.sf.net/ + +~Layer Map +name=Map +mode=13 +directory= +alpha=255 +autodownload=f +mapzoom=0 +~EndLayer + + +~Layer TrackWaypoint +name=TrackWaypoint +tracks_visible=f +waypoints_visible=t +routes_visible=f +drawmode=0 +drawlines=t +drawpoints=t +drawelevation=f +elevation_factor=30 +drawstops=f +stop_length=60 +line_thickness=1 +bg_line_thickness=0 +trackbgcolor=#ffffff +drawlabels=t +wpcolor=#000000 +wptextcolor=#ffffff +wpbgcolor=#8383c4 +wpbgand=t +wpsymbol=0 +wpsize=4 +wpsyms=t +drawimages=t +image_size=64 +image_alpha=255 +image_cache_size=300 + + +~LayerData +type="waypointlist" +END +# +# +} + +# Write header first part of .gpx file +sub Header_GPX { + return <<END; +<?xml version="1.0" encoding="UTF-8"?> +<gpx + version="1.1" +creator="$0" +xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" +xmlns="http://www.topografix.com/GPX/1/1" +xsi:schemaLocation="http://www.topografix.com/GPX/1/1 http://www.topografix.com/GPX/1/1/gpx.xsd"> +END +# TODO consider metadata time & bounds info +} + +sub Footer_GPX { + return "</gpx>\n"; +} + +sub My_Process_File { + my ($dir, $file) = @_; + + ## Start + ## + + # Only do files we are interested in + unless ($file =~ m/\.(?:JPG|jpg)$/) { + return; + } + #print "My_Process_File $file\n"; + + @waypoint = ("","","","","",""); + + # Extract meta information from an image + my $info = $exifTool->ImageInfo("$dir/$file"); + + #DateTimeOriginal + #GPSVersionID + #GPSAltitude + #GPSLatitude (1) + #GPSLongitude (1) + + foreach (sort keys %$info) { + #print "$file: $_ => $$info{$_}\n"; + + # If we can make the sort in reverse + + #if (/GPSVersionID/) { + # unless ("$$info{$_}" eq "2.0.0.0") { + # # Only handle version 2 Ids + # return; + # } + #} + + # Assume datum is in WGS-84 + if (/^GPSLatitude\ /) { + $waypoint[0] = $$info{$_}; + next; + } + + if (/^GPSLatitudeRef/) { + $waypoint[1] = $$info{$_}; + next; + } + + if (/^GPSLongitude\ /) { + $waypoint[2] = $$info{$_}; + next; + } + + if (/^GPSLongitudeRef/) { + $waypoint[3] = $$info{$_}; + next; + } + + if (/^GPSAltitude\ /) { + my @row = split / /, $$info{$_}; + $waypoint[4] = $row[0]; #hopefully in metres + next; + } + + if (/^DateTimeOriginal$/) { + $waypoint[5] = $$info{$_}; + next; + } + + } + + # Check for South + if ($waypoint[1] eq "South" && $waypoint[0] ne "") { + $waypoint[0] = '-'."$waypoint[0]"; + } + + # Check for West + if ($waypoint[3] eq "West" && $waypoint[2] ne "") { + $waypoint[2] = '-'."$waypoint[2]"; + } + + # At least lat/long + if ($waypoint[0] ne "" && $waypoint[2] ne "") { + # Update position so can track where to center map + $position[0] = $waypoint[0]; + $position[1] = $waypoint[2]; + my ($name, $path) = File::Basename::fileparse ($file, qr/\.[^.]*/); + my $filename = "$file"; # Relative filename + if ($mode == VIKING) { + # ATM, Viking (0.9.94) wp image loading only works if absolute + # See SF 2998555 + # Create absolute filename + if ($imagefilemode == ABSOLUTE) { + my ($abs_path) = File::Spec->rel2abs("$path", "$dir"); + $filename = "$abs_path/$file"; + } + return "type=\"waypoint\" latitude=\"$waypoint[0]\" longitude=\"$waypoint[2]\" name=\"$name\" altitude=\"$waypoint[4]\" comment=\"$waypoint[5]\" image=\"$filename\" symbol=\"scenic area\"\n"; + } + else { + return "<wpt lat=\"$waypoint[0]\" lon=\"$waypoint[2]\">\n <name>$name</name>\n <ele>$waypoint[4]</ele>\n <desc>$waypoint[5]</desc>\n <sym>scenic area</sym>\n</wpt>"; + } + + } + + return ""; + ## END + ## +} + +sub Footer_Viking { + return <<END; +type="waypointlistend" +~EndLayerData +~EndLayer + +xmpp=32.000000 +ympp=32.000000 +lat=$position[0] +lon=$position[1] +mode=mercator +color=#cccccc +drawscale=t +drawcentermark=t + +END +} + +# +sub My_Process_Dir { + my ($dir) = @_; + my $FTT = 1; # First Time Through flag to mark first pass + my $has_location = 0; + + #print "My_Process_Dir $dir\n"; + opendir(DIR, $dir) or die "$0: can't opendir $dir: $!\n"; + + my $line; + while (defined(my $file = readdir(DIR))) { + next if $file =~ /^\.\.?$/; # skip . and .. + $line = My_Process_File($dir, $file); + # At least one file with location data exists + if (defined ($line)) { + if ($line ne "" && $FTT == 1) { + $FTT = 0; + open (FILE, ">$dir/$out_file") or die "$0: Can not open $!\n"; + + if ($mode == VIKING) { + print FILE Header_Viking(); + } + else { + print FILE Header_GPX(); + } + $has_location = 1; # Remember that we have found something + } + if ($line ne "") { + print FILE $line; + } + } + } + + if ($has_location) { + if ($mode == VIKING) { + print FILE Footer_Viking(); + } + else { + print FILE Footer_GPX(); + } + close (FILE); + } + closedir(DIR); +} + +# +sub Process_File { + my $file = $_; + unless (-d $file) { + return; + } + return if $file =~ /^\.\.$/; # Ensure skip .. + print "$0: Doing directory $file\n"; + My_Process_Dir($file); +} + +############ START ################## + +# Default filename +my $out_file_start = "waypoints"; + +if (@ARGV) { + for (my $arg=0; $arg < $#ARGV+1; $arg++) { + if ("$ARGV[$arg]" eq "-o") { + # Set filename to next arg + if ($arg < $#ARGV) { + $out_file_start = $ARGV[$arg + 1]; + } + } + if ("$ARGV[$arg]" eq "-g") { + $mode = GPX; + } + if ("$ARGV[$arg]" eq "-r") { + $imagefilemode = RELATIVE; + } + } +} +#print "$0: Mode is $mode\n"; + +if ($mode == VIKING) { + $out_file = "$out_file_start".".vik"; +} +else { + $out_file = "$out_file_start".".gpx"; +} +#print "$0: File output is $out_file\n"; + +$exifTool->Options(CoordFormat => q{%.6f}); +$exifTool->Options(FastScan => 1); + +# Only get information in Standard EXIF +$exifTool->Options(Group0 => ['EXIF']); + +find(\&Process_File, "."); + +#end diff --git a/tools/viking-cache.py b/tools/viking-cache.py new file mode 100755 index 0000000..85d02fd --- /dev/null +++ b/tools/viking-cache.py @@ -0,0 +1,482 @@ +#!/usr/bin/env python +# +# Inspired by MBUtils: +# http://github.com/mapbox/mbutil +# +# Licensed under BSD +# +import sqlite3, sys, logging, time, os, re + +from optparse import OptionParser + +logger = logging.getLogger(__name__) + +# +# Functions from mbutil for sqlite DB format and connections +# utils.py: +# +def flip_y(zoom, y): + return (2**zoom-1) - y + +def mbtiles_setup(cur): + cur.execute(""" + create table tiles ( + zoom_level integer, + tile_column integer, + tile_row integer, + tile_data blob); + """) + cur.execute("""create table metadata + (name text, value text);""") + cur.execute("""create unique index name on metadata (name);""") + cur.execute("""create unique index tile_index on tiles + (zoom_level, tile_column, tile_row);""") + +def mbtiles_connect(mbtiles_file): + try: + con = sqlite3.connect(mbtiles_file) + return con + except Exception as e: + logger.error("Could not connect to database") + logger.exception(e) + sys.exit(1) + +def optimize_connection(cur): + cur.execute("""PRAGMA synchronous=0""") + cur.execute("""PRAGMA locking_mode=EXCLUSIVE""") + cur.execute("""PRAGMA journal_mode=DELETE""") + +def write_database(cur): + logger.debug('analyzing db') + cur.execute("""ANALYZE;""") + +def optimize_database(cur): + logger.debug('cleaning db') + cur.execute("""VACUUM;""") + +def getDirs(path): + return [name for name in os.listdir(path) + if os.path.isdir(os.path.join(path, name))] +# +# End functions from mbutils +# + +# +# Reworked from mbutils disk_to_mbtiles() +# +def osm_to_mbtiles(directory_path, mbtiles_file, **kwargs): + logger.debug("%s --> %s" % (directory_path, mbtiles_file)) + con = mbtiles_connect(mbtiles_file) + cur = con.cursor() + optimize_connection(cur) + mbtiles_setup(cur) + image_format = 'png' + count = 0 + start_time = time.time() + msg = "" + onlydigits_re = re.compile ('^\d+$') + + for zoomDir in getDirs(directory_path): + digitsz = onlydigits_re.match(zoomDir); + if digitsz: + z = int(zoomDir) + if z <= kwargs.get('maxzoom') and z >= kwargs.get('minzoom'): + for rowDir in getDirs(os.path.join(directory_path, zoomDir)): + digitsx = onlydigits_re.match(rowDir); + if digitsx: + x = int(rowDir) + for current_file in os.listdir(os.path.join(directory_path, zoomDir, rowDir)): + file_name, ext = current_file.split('.',1) + f = open(os.path.join(directory_path, zoomDir, rowDir, current_file), 'rb') + file_content = f.read() + f.close() + + y = flip_y(int(z), int(file_name)) + + if (ext == image_format): + cur.execute("""insert into tiles (zoom_level, + tile_column, tile_row, tile_data) values + (?, ?, ?, ?);""", + (z, x, y, sqlite3.Binary(file_content))) + count = count + 1 + if (count % 100) == 0: + for c in msg: sys.stdout.write(chr(8)) + msg = "%s tiles inserted (%d tiles/sec)" % (count, count / (time.time() - start_time)) + sys.stdout.write(msg) + + msg = "\nTotal tiles inserted %s \n" %(count) + sys.stdout.write(msg) + if count == 0: + print ("No tiles inserted") + else: + write_database(cur) + if not kwargs.get('nooptimize'): + sys.stdout.write("Optimizing...\n") + optimize_database(con) + return + +# Based on disk_to_mbtiles in mbutil +def vikcache_to_mbtiles(directory_path, mbtiles_file, **kwargs): + logger.debug("%s --> %s" % (directory_path, mbtiles_file)) + con = mbtiles_connect(mbtiles_file) + cur = con.cursor() + optimize_connection(cur) + mbtiles_setup(cur) + image_format = 'png' + count = 0 + start_time = time.time() + msg = "" + onlydigits_re = re.compile ('^\d+$') + + #print ('tileid ' + kwargs.get('tileid')) + # Need to split tDddsDdzD + # note zoom level can be negative hence the '-?' term + p = re.compile ('^t'+kwargs.get('tileid')+'s(-?\d+)z\d+$') + for ff in os.listdir(directory_path): + # Find only dirs related to this tileset + m = p.match(ff); + if m: + s = p.split(ff) + if len(s) > 2: + #print (s[1]) + # For some reason Viking does '17-zoom level' - so need to reverse that + z = 17 - int(s[1]) + #print (z) + for r2, xs, ignore in os.walk(os.path.join(directory_path, ff)): + if z <= kwargs.get('maxzoom') and z >= kwargs.get('minzoom'): + for x in xs: + # Try to ignore any non cache directories + m2 = onlydigits_re.match(x); + if m2: + #print('x:'+directory_path+'/'+ff+'/'+x) + for r3, ignore, ys in os.walk(os.path.join(directory_path, ff, x)): + for y in ys: + # Legacy viking cache file names only made from digits + m3 = onlydigits_re.match(y); + if m3: + #print('tile:'+directory_path+'/'+ff+'/'+x+'/'+y) + f = open(os.path.join(directory_path, ff, x, y), 'rb') + # Viking in xyz so always flip + y = flip_y(int(z), int(y)) + cur.execute("""insert into tiles (zoom_level, + tile_column, tile_row, tile_data) values + (?, ?, ?, ?);""", + (z, x, y, sqlite3.Binary(f.read()))) + f.close() + count = count + 1 + if (count % 100) == 0: + for c in msg: sys.stdout.write(chr(8)) + msg = "%s tiles inserted (%d tiles/sec)" % (count, count / (time.time() - start_time)) + sys.stdout.write(msg) + + msg = "\nTotal tiles inserted %s \n" %(count) + sys.stdout.write(msg) + if count == 0: + print ("No tiles inserted. NB This method only works with the Legacy Viking cache layout") + else: + write_database(cur) + if not kwargs.get('nooptimize'): + sys.stdout.write("Optimizing...\n") + optimize_database(con) + return + +def mbtiles_to_vikcache(mbtiles_file, directory_path, **kwargs): + logger.debug("Exporting MBTiles to disk") + logger.debug("%s --> %s" % (mbtiles_file, directory_path)) + con = mbtiles_connect(mbtiles_file) + count = con.execute('select count(zoom_level) from tiles;').fetchone()[0] + done = 0 + msg = '' + base_path = directory_path + if not os.path.isdir(base_path): + os.makedirs(base_path) + + start_time = time.time() + + tiles = con.execute('select zoom_level, tile_column, tile_row, tile_data from tiles;') + t = tiles.fetchone() + while t: + z = t[0] + x = t[1] + y = t[2] + # Viking in xyz so always flip + y = flip_y(int(z), int(y)) + # For some reason Viking does '17-zoom level' - so need to reverse that + vz = 17 - int(t[0]) + tile_dir = os.path.join(base_path, 't'+ kwargs.get('tileid') + 's' + str(vz) + 'z0', str(x)) + if not os.path.isdir(tile_dir): + os.makedirs(tile_dir) + # NB no extension for VikCache files + tile = os.path.join(tile_dir,'%s' % (y)) + # Only overwrite existing tile if specified + if not os.path.isfile(tile) or kwargs.get('force'): + f = open(tile, 'wb') + f.write(t[3]) + f.close() + done = done + 1 + if (done % 100) == 0: + for c in msg: sys.stdout.write(chr(8)) + msg = "%s / %s tiles imported (%d tiles/sec)" % (done, count, done / (time.time() - start_time)) + sys.stdout.write(msg) + t = tiles.fetchone() + msg = "\nTotal tiles imported %s \n" %(done) + sys.stdout.write(msg) + return + +def cache_converter_to_osm (vc_path, target_path, **kwargs): + msg = '' + count = 0 + onlydigits_re = re.compile ('^\d+$') + etag_re = re.compile ('\.etag$') + path_re = re.compile ('^t'+kwargs.get('tileid')+'s(-?\d+)z\d+$') + + if not os.path.isdir(target_path): + os.makedirs(target_path) + + start_time = time.time() + for ff in os.listdir(vc_path): + # Find only dirs related to this tileset + m = path_re.match(ff); + if m: + s = path_re.split(ff) + if len(s) > 2: + #print (s[1]) + # For some reason Viking does '17-zoom level' - so need to reverse that + z = 17 - int(s[1]) + tile_dirz = os.path.join(target_path, str(z)) + + if not os.path.isdir(tile_dirz): + #print (os.path.join(vc_path, ff) +":"+ tile_dirz) + os.rename(os.path.join(vc_path, ff), tile_dirz) + + for r2, xs, ignore in os.walk(tile_dirz): + for x in xs: + tile_dirx = os.path.join(tile_dirz, str(x)) + + # No need to move X dir + + for r3, ignore, ys in os.walk(tile_dirx): + for y in ys: + m2 = onlydigits_re.match(y); + if m2: + # Move and append extension to everything else + # OSM also in flipped y, so no need to change y + + # Only overwrite existing tile if specified + target_tile = os.path.join(tile_dirx, y + ".png") + if not os.path.isfile(target_tile) or kwargs.get('force'): + os.rename(os.path.join(tile_dirx, y), target_tile) + + count = count + 1 + if (count % 100) == 0: + for c in msg: sys.stdout.write(chr(8)) + msg = "%s tiles moved (%d tiles/sec)" % (count, count / (time.time() - start_time)) + sys.stdout.write(msg) + else: + # Also rename etag files appropriately + m3 = etag_re.search(y); + if m3: + target_etag = y.replace (".etag", ".png.etag") + if not os.path.isfile(os.path.join(tile_dirx,target_etag)) or kwargs.get('force'): + os.rename(os.path.join(tile_dirx, y), os.path.join(tile_dirx, target_etag)) + else: + # Ignore all other files + continue + + msg = "\nTotal tiles moved %s \n" %(count) + sys.stdout.write(msg) + return + +# +# Mainly for testing usage. +# Don't expect many people would want to convert back to the old layout +# +def cache_converter_to_viking (osm_path, target_path, **kwargs): + msg = '' + count = 0 + ispng = re.compile ('\.png$') + + if not os.path.isdir(target_path): + os.makedirs(target_path) + + start_time = time.time() + for r1, zs, ignore in os.walk(osm_path): + for z in zs: + # For some reason Viking does '17-zoom level' - so need to reverse that + vz = 17 - int(z) + tile_dirz = os.path.join(target_path, 't'+ kwargs.get('tileid') + 's' + str(vz) + 'z0') + + if not os.path.isdir(tile_dirz): + os.rename(os.path.join(osm_path, z), tile_dirz) + + for r2, xs, ignore in os.walk(tile_dirz): + for x in xs: + + tile_dirx = os.path.join(tile_dirz, x) + # No need to move X dir + + for r3, ignore, ys in os.walk(tile_dirx): + for y in ys: + m = ispng.search(y); + if m: + # Move and remove extension to everything else + # OSM also in flipped y, so no need to change y + + # Only overwrite existing tile if specified + y_noext = y + y_noext = y_noext.replace (".png", "") + target_tile = os.path.join(tile_dirx, y_noext) + if not os.path.isfile(target_tile) or kwargs.get('force'): + os.rename(os.path.join(tile_dirx, y), target_tile) + + count = count + 1 + if (count % 100) == 0: + for c in msg: sys.stdout.write(chr(8)) + msg = "%s tiles moved (%d tiles/sec)" % (count, count / (time.time() - start_time)) + sys.stdout.write(msg) + + msg = "\nTotal tiles moved %s \n" %(count) + sys.stdout.write(msg) + return + +def get_tile_path (tid): + # Built in Tile Ids + tile_id = int(tid) + if tile_id == 13: + return "OSM-Mapnik" + elif tile_id == 15: + return "BlueMarble" + elif tile_id == 17: + return "OSM-Cyle" + elif tile_id == 19: + return "OSM-MapQuest" + elif tile_id == 21: + return "OSM-Transport" + elif tile_id == 22: + return "OSM-Humanitarian" + elif tile_id == 25: + return "Mapbox-Outdoors" + elif tile_id == 212: + return "Bing-Aerial" + # Default extension Map ids (from data/maps.xml) + elif tile_id == 29: + return "CalTopo" + elif tile_id == 101: + return "pnvkarte" + elif tile_id == 600: + return "OpenSeaMap" + else: + return "unknown" + +## +## Start of code here +## +parser = OptionParser(usage="""usage: %prog -m <mode> [options] input output + +When either the input or output refers to a Viking legacy cache ('vcl'), is it the root directory of the cache, typically ~/.viking-maps + +Examples: + +Export Viking's legacy cache files of a map type to an mbtiles file: +$ ./viking-cache.py -m vlc2mbtiles -t 17 ~/.viking-maps OSM_Cycle.mbtiles + +Note you can use the http://github.com/mapbox/mbutil mbutil script to further handle .mbtiles +such as converting it into an OSM tile layout and then pointing a new Viking Map at that location with the map type of 'On Disk OSM Layout' + +Import from an MB Tiles file into Viking's legacy cache file layout, forcing overwrite of existing tiles: +$ ./viking-cache.py -m mbtiles2vlc -t 321 -f world.mbtiles ~/.viking-maps +NB: You'll need to a have a corresponding ~/.viking/maps.xml definition for the tileset id when it is not a built in id + +Convert from Viking's Legacy cache format to the more standard OSM layout style for a built in map type: +$ ./viking-cache.py -m vlc2osm -t 13 -f ~/.viking-maps ~/.viking-maps +Here the tiles get automatically moved to ~/.viking-maps/OSM-Mapnik + +Correspondingly change the Map layer property to use OSM style cache layout in Viking. + +Convert from Viking's Legacy cache format to the more standard OSM layout style for a extension map type: +$ ./viking-cache.py -m vlc2osm -t 110 -f ~/.viking-maps ~/.viking-maps/StamenWaterColour +Here one must specify the output directory name explicitly and set your maps.xml file with the name=StamenWaterColour for the id=110 entry +""") + +parser.add_option('-t', '--tileid', dest='tileid', + action="store", + help='''Tile id of Viking map cache to use (19 if not specified as this is Viking's default (MaqQuest))''', + type='string', + default='19') + +parser.add_option('-n', '--nooptimize', dest='nooptimize', + action="store_true", + help='''Do not attempt to optimize the mbtiles output file''', + default=False) + +parser.add_option('-f', '--force', dest='force', + action="store_true", + help='''Force overwrite of existing tiles''', + default=False) + +parser.add_option('-m', '--mode', dest='mode', + action="store", + help='''Mode of operation which must be specified. "vlc2mbtiles", "mbtiles2vlc", "vlc2osm", "osm2vlc", "osm2mbtiles"''', + type='string', + default='none') + +# Primary to help in limiting the generated DB size +parser.add_option('', '--max-zoom', dest='maxzoom', + action="store", + help='''Maximum (OSM) zoom level to use in writing to mbtiles''', + type='int', + default=25) + +parser.add_option('', '--min-zoom', dest='minzoom', + action="store", + help='''Minimum (OSM) zoom level to use in writing to mbtiles''', + type='int', + default=1) + +(options, args) = parser.parse_args() + +if options.__dict__.get('mode') == 'none': + sys.stderr.write ("\nError: Mode not specified\n") + parser.print_help() + sys.exit(1) + +if len(args) != 2: + parser.print_help() + sys.exit(1) + +in_fd, out_fd = args + +if options.__dict__.get('mode') == 'vlc2mbtiles': + # to mbtiles + if os.path.isdir(args[0]) and not os.path.isfile(args[0]): + vikcache_to_mbtiles(in_fd, out_fd, **options.__dict__) +elif options.__dict__.get('mode') == 'mbtiles2vlc': + # to VikCache + if os.path.isfile(args[0]): + mbtiles_to_vikcache(in_fd, out_fd, **options.__dict__) +elif options.__dict__.get('mode') == 'vlc2osm': + # Main forward conversion + is_default_re = re.compile ("\.viking-maps\/?$") + out_fd2 = is_default_re.search(out_fd) + if out_fd2: + # Auto append default tile name to the path + tile_path = get_tile_path(options.__dict__.get('tileid')) + if tile_path == "unknown": + sys.stderr.write ("Could not convert tile id to a name") + sys.stderr.write ("Specifically set the output directory to something other than the default") + sys.exit(2) + else: + print ("Using tile name %s" %(tile_path) ) + out_fd2 = os.path.join(out_fd, tile_path) + else: + out_fd2 = out_fd + + if os.path.isdir(args[0]): + cache_converter_to_osm(in_fd, out_fd2, **options.__dict__) +elif options.__dict__.get('mode') == 'osm2vlc': + # Convert back if needs be + if os.path.isdir(args[0]): + cache_converter_to_viking(in_fd, out_fd, **options.__dict__) +elif options.__dict__.get('mode') == 'osm2mbtiles': + if os.path.isdir(args[0]): + osm_to_mbtiles(in_fd, out_fd, **options.__dict__) diff --git a/viking.spec b/viking.spec new file mode 100644 index 0000000..7a87b85 --- /dev/null +++ b/viking.spec @@ -0,0 +1,92 @@ +#%% Fedora style spec file written by Michael A. Peters +#%% It is released under Public Domain +#%% May be redistributed without this notice. + +Name: viking +Version: 1.7 +Release: 1 + +Summary: GPS data editor and analyzer + +Group: Applications/Productivity +License: GPLv2 +URL: http://sourceforge.net/projects/viking/ +Source0: %{name}-%{version}.tar.gz +BuildRoot: %{_tmppath}/%{name}-%{version}-%{release}-root-%(%{__id_u} -n) + +BuildRequires: curl-devel +BuildRequires: expat-devel +BuildRequires: gtk2-devel >= 2.16 +BuildRequires: pkgconfig +BuildRequires: gpsd-devel +BuildRequires: gettext perl(XML::Parser) +BuildRequires: intltool +BuildRequires: libxslt +BuildRequires: libgexiv2-devel +BuildRequires: libbz2-devel +BuildRequires: libmagic-devel +BuildRequires: libsqlite3-devel +BuildRequires: libmapnik-devel +BuildRequires: libzip-devel +BuildRequires: liboauth-devel + +%description +Viking is a free/open source program to manage GPS data. +You can import, plot and create tracks, routes and waypoints, show OSM and other maps, see real-time GPS position, control items, etc. +Other advanced capabilities include Geotagging Images, generate Maps (using Mapnik), Upload and Download tracks from OSM, Routing from OSRM or Google, Name Searches from OSM Nominatim or Google and more. +It is written in mainly in C with some C++ and uses the GTK+2 toolkit. + +%prep +%setup -q + +%build +%configure +make + +%install +rm -rf %{buildroot} +make DESTDIR=%{buildroot} install +%find_lang %{name} +rm -f doc/Makefile* +rm -f doc/dev/Makefile* + +%check +make test + +%clean +rm -rf %{buildroot} + +%find_lang %{name} --with-gnome + +%files -f %{name}.lang +%defattr(-,root,root,-) +%doc AUTHORS ChangeLog COPYING NEWS README.md TODO doc/ +%{_bindir}/viking +%{_datadir}/applications/viking.desktop +%{_datadir}/icons/hicolor/48x48/apps/viking.png +%{_mandir}/man1/* + +%changelog +* Thu Feb 21 2008 Michael A. Peters <mpeters@mac.com> - 0.9.3.20080220-1 +- change License field from GPL to GPLv2 +- BR gpsd-devel +- BR gettext perl(XML::Parser) - needed for intltool +- use find_land macro to package mo files + +* Sun Sep 4 2007 Guilhem Bonnefille <guilhem.bonnefille> - 0.9.2-1 +- Update to upstream version 0.9.2. + +* Sun Sep 2 2007 Guilhem Bonnefille <guilhem.bonnefille> - 0.9.1-1 +- Update to upstream version 0.9.1. + +* Fri Jul 13 2007 Guilhem Bonnefille <guilhem.bonnefille> - 0.9-1 +- Update to upstream version 0.9. + +* Thu May 18 2007 Quy Tonthat <qtonthat@gmail.com> +- Added curl-devel to BuildRequires list. + +* Thu May 15 2007 Guilhem Bonnefille <guilhem.bonnefille> - 0.1.3-1 +- Update to upstream version 0.1.3. + +* Wed Feb 14 2007 Michael A. Peters <mpeters@mac.com> - 0.1.2-1 +- Initial Fedora style spec file. diff --git a/viking.spec.in b/viking.spec.in new file mode 100644 index 0000000..c9b5b8b --- /dev/null +++ b/viking.spec.in @@ -0,0 +1,92 @@ +#%% Fedora style spec file written by Michael A. Peters +#%% It is released under Public Domain +#%% May be redistributed without this notice. + +Name: viking +Version: @VERSION@ +Release: 1 + +Summary: GPS data editor and analyzer + +Group: Applications/Productivity +License: GPLv2 +URL: http://sourceforge.net/projects/viking/ +Source0: %{name}-%{version}.tar.gz +BuildRoot: %{_tmppath}/%{name}-%{version}-%{release}-root-%(%{__id_u} -n) + +BuildRequires: curl-devel +BuildRequires: expat-devel +BuildRequires: gtk2-devel >= 2.16 +BuildRequires: pkgconfig +BuildRequires: gpsd-devel +BuildRequires: gettext perl(XML::Parser) +BuildRequires: intltool +BuildRequires: libxslt +BuildRequires: libgexiv2-devel +BuildRequires: libbz2-devel +BuildRequires: libmagic-devel +BuildRequires: libsqlite3-devel +BuildRequires: libmapnik-devel +BuildRequires: libzip-devel +BuildRequires: liboauth-devel + +%description +Viking is a free/open source program to manage GPS data. +You can import, plot and create tracks, routes and waypoints, show OSM and other maps, see real-time GPS position, control items, etc. +Other advanced capabilities include Geotagging Images, generate Maps (using Mapnik), Upload and Download tracks from OSM, Routing from OSRM or Google, Name Searches from OSM Nominatim or Google and more. +It is written in mainly in C with some C++ and uses the GTK+2 toolkit. + +%prep +%setup -q + +%build +%configure +make + +%install +rm -rf %{buildroot} +make DESTDIR=%{buildroot} install +%find_lang %{name} +rm -f doc/Makefile* +rm -f doc/dev/Makefile* + +%check +make test + +%clean +rm -rf %{buildroot} + +%find_lang %{name} --with-gnome + +%files -f %{name}.lang +%defattr(-,root,root,-) +%doc AUTHORS ChangeLog COPYING NEWS README.md TODO doc/ +%{_bindir}/viking +%{_datadir}/applications/viking.desktop +%{_datadir}/icons/hicolor/48x48/apps/viking.png +%{_mandir}/man1/* + +%changelog +* Thu Feb 21 2008 Michael A. Peters <mpeters@mac.com> - 0.9.3.20080220-1 +- change License field from GPL to GPLv2 +- BR gpsd-devel +- BR gettext perl(XML::Parser) - needed for intltool +- use find_land macro to package mo files + +* Sun Sep 4 2007 Guilhem Bonnefille <guilhem.bonnefille> - 0.9.2-1 +- Update to upstream version 0.9.2. + +* Sun Sep 2 2007 Guilhem Bonnefille <guilhem.bonnefille> - 0.9.1-1 +- Update to upstream version 0.9.1. + +* Fri Jul 13 2007 Guilhem Bonnefille <guilhem.bonnefille> - 0.9-1 +- Update to upstream version 0.9. + +* Thu May 18 2007 Quy Tonthat <qtonthat@gmail.com> +- Added curl-devel to BuildRequires list. + +* Thu May 15 2007 Guilhem Bonnefille <guilhem.bonnefille> - 0.1.3-1 +- Update to upstream version 0.1.3. + +* Wed Feb 14 2007 Michael A. Peters <mpeters@mac.com> - 0.1.2-1 +- Initial Fedora style spec file. diff --git a/windows/Makefile.am b/windows/Makefile.am new file mode 100644 index 0000000..fc0c5b4 --- /dev/null +++ b/windows/Makefile.am @@ -0,0 +1,10 @@ +# License: CC0 +EXTRA_DIST = \ + installer-mingw.sh \ + prepare.bat \ + configure_and_make.bat \ + make.bat \ + installer.bat \ + README.txt + +SUBDIRS = installer diff --git a/windows/Makefile.in b/windows/Makefile.in new file mode 100644 index 0000000..875e955 --- /dev/null +++ b/windows/Makefile.in @@ -0,0 +1,689 @@ +# Makefile.in generated by automake 1.16.1 from Makefile.am. +# @configure_input@ + +# Copyright (C) 1994-2018 Free Software Foundation, Inc. + +# This Makefile.in is free software; the Free Software Foundation +# gives unlimited permission to copy and/or distribute it, +# with or without modifications, as long as this notice is preserved. + +# This program is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY, to the extent permitted by law; without +# even the implied warranty of MERCHANTABILITY or FITNESS FOR A +# PARTICULAR PURPOSE. + +@SET_MAKE@ +VPATH = @srcdir@ +am__is_gnu_make = { \ + if test -z '$(MAKELEVEL)'; then \ + false; \ + elif test -n '$(MAKE_HOST)'; then \ + true; \ + elif test -n '$(MAKE_VERSION)' && test -n '$(CURDIR)'; then \ + true; \ + else \ + false; \ + fi; \ +} +am__make_running_with_option = \ + case $${target_option-} in \ + ?) ;; \ + *) echo "am__make_running_with_option: internal error: invalid" \ + "target option '$${target_option-}' specified" >&2; \ + exit 1;; \ + esac; \ + has_opt=no; \ + sane_makeflags=$$MAKEFLAGS; \ + if $(am__is_gnu_make); then \ + sane_makeflags=$$MFLAGS; \ + else \ + case $$MAKEFLAGS in \ + *\\[\ \ ]*) \ + bs=\\; \ + sane_makeflags=`printf '%s\n' "$$MAKEFLAGS" \ + | sed "s/$$bs$$bs[$$bs $$bs ]*//g"`;; \ + esac; \ + fi; \ + skip_next=no; \ + strip_trailopt () \ + { \ + flg=`printf '%s\n' "$$flg" | sed "s/$$1.*$$//"`; \ + }; \ + for flg in $$sane_makeflags; do \ + test $$skip_next = yes && { skip_next=no; continue; }; \ + case $$flg in \ + *=*|--*) continue;; \ + -*I) strip_trailopt 'I'; skip_next=yes;; \ + -*I?*) strip_trailopt 'I';; \ + -*O) strip_trailopt 'O'; skip_next=yes;; \ + -*O?*) strip_trailopt 'O';; \ + -*l) strip_trailopt 'l'; skip_next=yes;; \ + -*l?*) strip_trailopt 'l';; \ + -[dEDm]) skip_next=yes;; \ + -[JT]) skip_next=yes;; \ + esac; \ + case $$flg in \ + *$$target_option*) has_opt=yes; break;; \ + esac; \ + done; \ + test $$has_opt = yes +am__make_dryrun = (target_option=n; $(am__make_running_with_option)) +am__make_keepgoing = (target_option=k; $(am__make_running_with_option)) +pkgdatadir = $(datadir)/@PACKAGE@ +pkgincludedir = $(includedir)/@PACKAGE@ +pkglibdir = $(libdir)/@PACKAGE@ +pkglibexecdir = $(libexecdir)/@PACKAGE@ +am__cd = CDPATH="$${ZSH_VERSION+.}$(PATH_SEPARATOR)" && cd +install_sh_DATA = $(install_sh) -c -m 644 +install_sh_PROGRAM = $(install_sh) -c +install_sh_SCRIPT = $(install_sh) -c +INSTALL_HEADER = $(INSTALL_DATA) +transform = $(program_transform_name) +NORMAL_INSTALL = : +PRE_INSTALL = : +POST_INSTALL = : +NORMAL_UNINSTALL = : +PRE_UNINSTALL = : +POST_UNINSTALL = : +build_triplet = @build@ +host_triplet = @host@ +target_triplet = @target@ +subdir = windows +ACLOCAL_M4 = $(top_srcdir)/aclocal.m4 +am__aclocal_m4_deps = $(top_srcdir)/m4/expat.m4 \ + $(top_srcdir)/m4/gettext.m4 $(top_srcdir)/m4/iconv.m4 \ + $(top_srcdir)/m4/intlmacosx.m4 $(top_srcdir)/m4/lib-ld.m4 \ + $(top_srcdir)/m4/lib-link.m4 $(top_srcdir)/m4/lib-prefix.m4 \ + $(top_srcdir)/m4/libcurl.m4 $(top_srcdir)/m4/nls.m4 \ + $(top_srcdir)/m4/po.m4 $(top_srcdir)/m4/progtest.m4 \ + $(top_srcdir)/configure.ac +am__configure_deps = $(am__aclocal_m4_deps) $(CONFIGURE_DEPENDENCIES) \ + $(ACLOCAL_M4) +DIST_COMMON = $(srcdir)/Makefile.am $(am__DIST_COMMON) +mkinstalldirs = $(SHELL) $(top_srcdir)/mkinstalldirs +CONFIG_HEADER = $(top_builddir)/src/config.h +CONFIG_CLEAN_FILES = +CONFIG_CLEAN_VPATH_FILES = +AM_V_P = $(am__v_P_@AM_V@) +am__v_P_ = $(am__v_P_@AM_DEFAULT_V@) +am__v_P_0 = false +am__v_P_1 = : +AM_V_GEN = $(am__v_GEN_@AM_V@) +am__v_GEN_ = $(am__v_GEN_@AM_DEFAULT_V@) +am__v_GEN_0 = @echo " GEN " $@; +am__v_GEN_1 = +AM_V_at = $(am__v_at_@AM_V@) +am__v_at_ = $(am__v_at_@AM_DEFAULT_V@) +am__v_at_0 = @ +am__v_at_1 = +SOURCES = +DIST_SOURCES = +RECURSIVE_TARGETS = all-recursive check-recursive cscopelist-recursive \ + ctags-recursive dvi-recursive html-recursive info-recursive \ + install-data-recursive install-dvi-recursive \ + install-exec-recursive install-html-recursive \ + install-info-recursive install-pdf-recursive \ + install-ps-recursive install-recursive installcheck-recursive \ + installdirs-recursive pdf-recursive ps-recursive \ + tags-recursive uninstall-recursive +am__can_run_installinfo = \ + case $$AM_UPDATE_INFO_DIR in \ + n|no|NO) false;; \ + *) (install-info --version) >/dev/null 2>&1;; \ + esac +RECURSIVE_CLEAN_TARGETS = mostlyclean-recursive clean-recursive \ + distclean-recursive maintainer-clean-recursive +am__recursive_targets = \ + $(RECURSIVE_TARGETS) \ + $(RECURSIVE_CLEAN_TARGETS) \ + $(am__extra_recursive_targets) +AM_RECURSIVE_TARGETS = $(am__recursive_targets:-recursive=) TAGS CTAGS \ + distdir distdir-am +am__tagged_files = $(HEADERS) $(SOURCES) $(TAGS_FILES) $(LISP) +# Read a list of newline-separated strings from the standard input, +# and print each of them once, without duplicates. Input order is +# *not* preserved. +am__uniquify_input = $(AWK) '\ + BEGIN { nonempty = 0; } \ + { items[$$0] = 1; nonempty = 1; } \ + END { if (nonempty) { for (i in items) print i; }; } \ +' +# Make sure the list of sources is unique. This is necessary because, +# e.g., the same source file might be shared among _SOURCES variables +# for different programs/libraries. +am__define_uniq_tagged_files = \ + list='$(am__tagged_files)'; \ + unique=`for i in $$list; do \ + if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \ + done | $(am__uniquify_input)` +ETAGS = etags +CTAGS = ctags +DIST_SUBDIRS = $(SUBDIRS) +am__DIST_COMMON = $(srcdir)/Makefile.in $(top_srcdir)/mkinstalldirs +DISTFILES = $(DIST_COMMON) $(DIST_SOURCES) $(TEXINFOS) $(EXTRA_DIST) +am__relativize = \ + dir0=`pwd`; \ + sed_first='s,^\([^/]*\)/.*$$,\1,'; \ + sed_rest='s,^[^/]*/*,,'; \ + sed_last='s,^.*/\([^/]*\)$$,\1,'; \ + sed_butlast='s,/*[^/]*$$,,'; \ + while test -n "$$dir1"; do \ + first=`echo "$$dir1" | sed -e "$$sed_first"`; \ + if test "$$first" != "."; then \ + if test "$$first" = ".."; then \ + dir2=`echo "$$dir0" | sed -e "$$sed_last"`/"$$dir2"; \ + dir0=`echo "$$dir0" | sed -e "$$sed_butlast"`; \ + else \ + first2=`echo "$$dir2" | sed -e "$$sed_first"`; \ + if test "$$first2" = "$$first"; then \ + dir2=`echo "$$dir2" | sed -e "$$sed_rest"`; \ + else \ + dir2="../$$dir2"; \ + fi; \ + dir0="$$dir0"/"$$first"; \ + fi; \ + fi; \ + dir1=`echo "$$dir1" | sed -e "$$sed_rest"`; \ + done; \ + reldir="$$dir2" +ACLOCAL = @ACLOCAL@ +ACLOCAL_AMFLAGS = @ACLOCAL_AMFLAGS@ +ALL_LINGUAS = @ALL_LINGUAS@ +AMTAR = @AMTAR@ +AM_DEFAULT_VERBOSITY = @AM_DEFAULT_VERBOSITY@ +AUTOCONF = @AUTOCONF@ +AUTOHEADER = @AUTOHEADER@ +AUTOMAKE = @AUTOMAKE@ +AWK = @AWK@ +CATALOGS = @CATALOGS@ +CATOBJEXT = @CATOBJEXT@ +CC = @CC@ +CCDEPMODE = @CCDEPMODE@ +CFLAGS = @CFLAGS@ +CONFIG_STATUS_DEPENDENCIES = @CONFIG_STATUS_DEPENDENCIES@ +CPP = @CPP@ +CPPFLAGS = @CPPFLAGS@ +CXX = @CXX@ +CXXCPP = @CXXCPP@ +CXXDEPMODE = @CXXDEPMODE@ +CXXFLAGS = @CXXFLAGS@ +CYGPATH_W = @CYGPATH_W@ +DATADIRNAME = @DATADIRNAME@ +DB2MAN_XSL = @DB2MAN_XSL@ +DEFS = @DEFS@ +DEPDIR = @DEPDIR@ +DISTCHECK_CONFIGURE_FLAGS = @DISTCHECK_CONFIGURE_FLAGS@ +DOC_USER_FORMATS = @DOC_USER_FORMATS@ +ECHO_C = @ECHO_C@ +ECHO_N = @ECHO_N@ +ECHO_T = @ECHO_T@ +EGREP = @EGREP@ +EXEEXT = @EXEEXT@ +EXPAT_CFLAGS = @EXPAT_CFLAGS@ +EXPAT_LIBS = @EXPAT_LIBS@ +GDK_PIXBUF_CSOURCE = @GDK_PIXBUF_CSOURCE@ +GETTEXT_MACRO_VERSION = @GETTEXT_MACRO_VERSION@ +GETTEXT_PACKAGE = @GETTEXT_PACKAGE@ +GLIB_MKENUMS = @GLIB_MKENUMS@ +GMOFILES = @GMOFILES@ +GMSGFMT = @GMSGFMT@ +GMSGFMT_015 = @GMSGFMT_015@ +GREP = @GREP@ +GTKDOC_CHECK = @GTKDOC_CHECK@ +GTKDOC_CHECK_PATH = @GTKDOC_CHECK_PATH@ +GTKDOC_DEPS_CFLAGS = @GTKDOC_DEPS_CFLAGS@ +GTKDOC_DEPS_LIBS = @GTKDOC_DEPS_LIBS@ +GTKDOC_MKPDF = @GTKDOC_MKPDF@ +GTKDOC_REBASE = @GTKDOC_REBASE@ +HAVE_SCROLLKEEPER = @HAVE_SCROLLKEEPER@ +HELP_DIR = @HELP_DIR@ +HTML_DIR = @HTML_DIR@ +INSTALL = @INSTALL@ +INSTALL_DATA = @INSTALL_DATA@ +INSTALL_PROGRAM = @INSTALL_PROGRAM@ +INSTALL_SCRIPT = @INSTALL_SCRIPT@ +INSTALL_STRIP_PROGRAM = @INSTALL_STRIP_PROGRAM@ +INSTOBJEXT = @INSTOBJEXT@ +INTLLIBS = @INTLLIBS@ +INTLTOOL_EXTRACT = @INTLTOOL_EXTRACT@ +INTLTOOL_MERGE = @INTLTOOL_MERGE@ +INTLTOOL_PERL = @INTLTOOL_PERL@ +INTLTOOL_UPDATE = @INTLTOOL_UPDATE@ +INTLTOOL_V_MERGE = @INTLTOOL_V_MERGE@ +INTLTOOL_V_MERGE_OPTIONS = @INTLTOOL_V_MERGE_OPTIONS@ +INTLTOOL__v_MERGE_ = @INTLTOOL__v_MERGE_@ +INTLTOOL__v_MERGE_0 = @INTLTOOL__v_MERGE_0@ +INTL_MACOSX_LIBS = @INTL_MACOSX_LIBS@ +ISODATE = @ISODATE@ +LDFLAGS = @LDFLAGS@ +LIBCURL = @LIBCURL@ +LIBCURL_CPPFLAGS = @LIBCURL_CPPFLAGS@ +LIBGEOCLUE_CFLAGS = @LIBGEOCLUE_CFLAGS@ +LIBGEOCLUE_LIBS = @LIBGEOCLUE_LIBS@ +LIBICONV = @LIBICONV@ +LIBINTL = @LIBINTL@ +LIBOBJS = @LIBOBJS@ +LIBS = @LIBS@ +LIBZIP_CFLAGS = @LIBZIP_CFLAGS@ +LIBZIP_LIBS = @LIBZIP_LIBS@ +LN_S = @LN_S@ +LTLIBICONV = @LTLIBICONV@ +LTLIBINTL = @LTLIBINTL@ +LTLIBOBJS = @LTLIBOBJS@ +MAKEINFO = @MAKEINFO@ +MKDIR_P = @MKDIR_P@ +MKINSTALLDIRS = @MKINSTALLDIRS@ +MSGFMT = @MSGFMT@ +MSGFMT_015 = @MSGFMT_015@ +MSGFMT_OPTS = @MSGFMT_OPTS@ +MSGMERGE = @MSGMERGE@ +OBJEXT = @OBJEXT@ +OMF_DIR = @OMF_DIR@ +PACKAGE = @PACKAGE@ +PACKAGE_BUGREPORT = @PACKAGE_BUGREPORT@ +PACKAGE_CFLAGS = @PACKAGE_CFLAGS@ +PACKAGE_LIBS = @PACKAGE_LIBS@ +PACKAGE_NAME = @PACKAGE_NAME@ +PACKAGE_STRING = @PACKAGE_STRING@ +PACKAGE_TARNAME = @PACKAGE_TARNAME@ +PACKAGE_URL = @PACKAGE_URL@ +PACKAGE_VERSION = @PACKAGE_VERSION@ +PATH_SEPARATOR = @PATH_SEPARATOR@ +PKG_CONFIG = @PKG_CONFIG@ +PKG_CONFIG_LIBDIR = @PKG_CONFIG_LIBDIR@ +PKG_CONFIG_PATH = @PKG_CONFIG_PATH@ +POFILES = @POFILES@ +POSUB = @POSUB@ +PO_IN_DATADIR_FALSE = @PO_IN_DATADIR_FALSE@ +PO_IN_DATADIR_TRUE = @PO_IN_DATADIR_TRUE@ +RANLIB = @RANLIB@ +SET_MAKE = @SET_MAKE@ +SHELL = @SHELL@ +STRIP = @STRIP@ +USE_NLS = @USE_NLS@ +VERSION = @VERSION@ +XGETTEXT = @XGETTEXT@ +XGETTEXT_015 = @XGETTEXT_015@ +XGETTEXT_EXTRA_OPTIONS = @XGETTEXT_EXTRA_OPTIONS@ +XP = @XP@ +_libcurl_config = @_libcurl_config@ +abs_builddir = @abs_builddir@ +abs_srcdir = @abs_srcdir@ +abs_top_builddir = @abs_top_builddir@ +abs_top_srcdir = @abs_top_srcdir@ +ac_ct_CC = @ac_ct_CC@ +ac_ct_CXX = @ac_ct_CXX@ +am__include = @am__include@ +am__leading_dot = @am__leading_dot@ +am__quote = @am__quote@ +am__tar = @am__tar@ +am__untar = @am__untar@ +bindir = @bindir@ +build = @build@ +build_alias = @build_alias@ +build_cpu = @build_cpu@ +build_os = @build_os@ +build_vendor = @build_vendor@ +builddir = @builddir@ +datadir = @datadir@ +datarootdir = @datarootdir@ +docdir = @docdir@ +dvidir = @dvidir@ +exec_prefix = @exec_prefix@ +host = @host@ +host_alias = @host_alias@ +host_cpu = @host_cpu@ +host_os = @host_os@ +host_vendor = @host_vendor@ +htmldir = @htmldir@ +includedir = @includedir@ +infodir = @infodir@ +install_sh = @install_sh@ +intltool__v_merge_options_ = @intltool__v_merge_options_@ +intltool__v_merge_options_0 = @intltool__v_merge_options_0@ +libdir = @libdir@ +libexecdir = @libexecdir@ +localedir = @localedir@ +localstatedir = @localstatedir@ +mandir = @mandir@ +mkdir_p = @mkdir_p@ +oldincludedir = @oldincludedir@ +pdfdir = @pdfdir@ +prefix = @prefix@ +program_transform_name = @program_transform_name@ +psdir = @psdir@ +runstatedir = @runstatedir@ +sbindir = @sbindir@ +sharedstatedir = @sharedstatedir@ +srcdir = @srcdir@ +sysconfdir = @sysconfdir@ +target = @target@ +target_alias = @target_alias@ +target_cpu = @target_cpu@ +target_os = @target_os@ +target_vendor = @target_vendor@ +top_build_prefix = @top_build_prefix@ +top_builddir = @top_builddir@ +top_srcdir = @top_srcdir@ + +# License: CC0 +EXTRA_DIST = \ + installer-mingw.sh \ + prepare.bat \ + configure_and_make.bat \ + make.bat \ + installer.bat \ + README.txt + +SUBDIRS = installer +all: all-recursive + +.SUFFIXES: +$(srcdir)/Makefile.in: $(srcdir)/Makefile.am $(am__configure_deps) + @for dep in $?; do \ + case '$(am__configure_deps)' in \ + *$$dep*) \ + ( cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh ) \ + && { if test -f $@; then exit 0; else break; fi; }; \ + exit 1;; \ + esac; \ + done; \ + echo ' cd $(top_srcdir) && $(AUTOMAKE) --gnu windows/Makefile'; \ + $(am__cd) $(top_srcdir) && \ + $(AUTOMAKE) --gnu windows/Makefile +Makefile: $(srcdir)/Makefile.in $(top_builddir)/config.status + @case '$?' in \ + *config.status*) \ + cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh;; \ + *) \ + echo ' cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__maybe_remake_depfiles)'; \ + cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__maybe_remake_depfiles);; \ + esac; + +$(top_builddir)/config.status: $(top_srcdir)/configure $(CONFIG_STATUS_DEPENDENCIES) + cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh + +$(top_srcdir)/configure: $(am__configure_deps) + cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh +$(ACLOCAL_M4): $(am__aclocal_m4_deps) + cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh +$(am__aclocal_m4_deps): + +# This directory's subdirectories are mostly independent; you can cd +# into them and run 'make' without going through this Makefile. +# To change the values of 'make' variables: instead of editing Makefiles, +# (1) if the variable is set in 'config.status', edit 'config.status' +# (which will cause the Makefiles to be regenerated when you run 'make'); +# (2) otherwise, pass the desired values on the 'make' command line. +$(am__recursive_targets): + @fail=; \ + if $(am__make_keepgoing); then \ + failcom='fail=yes'; \ + else \ + failcom='exit 1'; \ + fi; \ + dot_seen=no; \ + target=`echo $@ | sed s/-recursive//`; \ + case "$@" in \ + distclean-* | maintainer-clean-*) list='$(DIST_SUBDIRS)' ;; \ + *) list='$(SUBDIRS)' ;; \ + esac; \ + for subdir in $$list; do \ + echo "Making $$target in $$subdir"; \ + if test "$$subdir" = "."; then \ + dot_seen=yes; \ + local_target="$$target-am"; \ + else \ + local_target="$$target"; \ + fi; \ + ($(am__cd) $$subdir && $(MAKE) $(AM_MAKEFLAGS) $$local_target) \ + || eval $$failcom; \ + done; \ + if test "$$dot_seen" = "no"; then \ + $(MAKE) $(AM_MAKEFLAGS) "$$target-am" || exit 1; \ + fi; test -z "$$fail" + +ID: $(am__tagged_files) + $(am__define_uniq_tagged_files); mkid -fID $$unique +tags: tags-recursive +TAGS: tags + +tags-am: $(TAGS_DEPENDENCIES) $(am__tagged_files) + set x; \ + here=`pwd`; \ + if ($(ETAGS) --etags-include --version) >/dev/null 2>&1; then \ + include_option=--etags-include; \ + empty_fix=.; \ + else \ + include_option=--include; \ + empty_fix=; \ + fi; \ + list='$(SUBDIRS)'; for subdir in $$list; do \ + if test "$$subdir" = .; then :; else \ + test ! -f $$subdir/TAGS || \ + set "$$@" "$$include_option=$$here/$$subdir/TAGS"; \ + fi; \ + done; \ + $(am__define_uniq_tagged_files); \ + shift; \ + if test -z "$(ETAGS_ARGS)$$*$$unique"; then :; else \ + test -n "$$unique" || unique=$$empty_fix; \ + if test $$# -gt 0; then \ + $(ETAGS) $(ETAGSFLAGS) $(AM_ETAGSFLAGS) $(ETAGS_ARGS) \ + "$$@" $$unique; \ + else \ + $(ETAGS) $(ETAGSFLAGS) $(AM_ETAGSFLAGS) $(ETAGS_ARGS) \ + $$unique; \ + fi; \ + fi +ctags: ctags-recursive + +CTAGS: ctags +ctags-am: $(TAGS_DEPENDENCIES) $(am__tagged_files) + $(am__define_uniq_tagged_files); \ + test -z "$(CTAGS_ARGS)$$unique" \ + || $(CTAGS) $(CTAGSFLAGS) $(AM_CTAGSFLAGS) $(CTAGS_ARGS) \ + $$unique + +GTAGS: + here=`$(am__cd) $(top_builddir) && pwd` \ + && $(am__cd) $(top_srcdir) \ + && gtags -i $(GTAGS_ARGS) "$$here" +cscopelist: cscopelist-recursive + +cscopelist-am: $(am__tagged_files) + list='$(am__tagged_files)'; \ + case "$(srcdir)" in \ + [\\/]* | ?:[\\/]*) sdir="$(srcdir)" ;; \ + *) sdir=$(subdir)/$(srcdir) ;; \ + esac; \ + for i in $$list; do \ + if test -f "$$i"; then \ + echo "$(subdir)/$$i"; \ + else \ + echo "$$sdir/$$i"; \ + fi; \ + done >> $(top_builddir)/cscope.files + +distclean-tags: + -rm -f TAGS ID GTAGS GRTAGS GSYMS GPATH tags + +distdir: $(BUILT_SOURCES) + $(MAKE) $(AM_MAKEFLAGS) distdir-am + +distdir-am: $(DISTFILES) + @srcdirstrip=`echo "$(srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \ + topsrcdirstrip=`echo "$(top_srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \ + list='$(DISTFILES)'; \ + dist_files=`for file in $$list; do echo $$file; done | \ + sed -e "s|^$$srcdirstrip/||;t" \ + -e "s|^$$topsrcdirstrip/|$(top_builddir)/|;t"`; \ + case $$dist_files in \ + */*) $(MKDIR_P) `echo "$$dist_files" | \ + sed '/\//!d;s|^|$(distdir)/|;s,/[^/]*$$,,' | \ + sort -u` ;; \ + esac; \ + for file in $$dist_files; do \ + if test -f $$file || test -d $$file; then d=.; else d=$(srcdir); fi; \ + if test -d $$d/$$file; then \ + dir=`echo "/$$file" | sed -e 's,/[^/]*$$,,'`; \ + if test -d "$(distdir)/$$file"; then \ + find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \ + fi; \ + if test -d $(srcdir)/$$file && test $$d != $(srcdir); then \ + cp -fpR $(srcdir)/$$file "$(distdir)$$dir" || exit 1; \ + find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \ + fi; \ + cp -fpR $$d/$$file "$(distdir)$$dir" || exit 1; \ + else \ + test -f "$(distdir)/$$file" \ + || cp -p $$d/$$file "$(distdir)/$$file" \ + || exit 1; \ + fi; \ + done + @list='$(DIST_SUBDIRS)'; for subdir in $$list; do \ + if test "$$subdir" = .; then :; else \ + $(am__make_dryrun) \ + || test -d "$(distdir)/$$subdir" \ + || $(MKDIR_P) "$(distdir)/$$subdir" \ + || exit 1; \ + dir1=$$subdir; dir2="$(distdir)/$$subdir"; \ + $(am__relativize); \ + new_distdir=$$reldir; \ + dir1=$$subdir; dir2="$(top_distdir)"; \ + $(am__relativize); \ + new_top_distdir=$$reldir; \ + echo " (cd $$subdir && $(MAKE) $(AM_MAKEFLAGS) top_distdir="$$new_top_distdir" distdir="$$new_distdir" \\"; \ + echo " am__remove_distdir=: am__skip_length_check=: am__skip_mode_fix=: distdir)"; \ + ($(am__cd) $$subdir && \ + $(MAKE) $(AM_MAKEFLAGS) \ + top_distdir="$$new_top_distdir" \ + distdir="$$new_distdir" \ + am__remove_distdir=: \ + am__skip_length_check=: \ + am__skip_mode_fix=: \ + distdir) \ + || exit 1; \ + fi; \ + done +check-am: all-am +check: check-recursive +all-am: Makefile +installdirs: installdirs-recursive +installdirs-am: +install: install-recursive +install-exec: install-exec-recursive +install-data: install-data-recursive +uninstall: uninstall-recursive + +install-am: all-am + @$(MAKE) $(AM_MAKEFLAGS) install-exec-am install-data-am + +installcheck: installcheck-recursive +install-strip: + if test -z '$(STRIP)'; then \ + $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \ + install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \ + install; \ + else \ + $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \ + install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \ + "INSTALL_PROGRAM_ENV=STRIPPROG='$(STRIP)'" install; \ + fi +mostlyclean-generic: + +clean-generic: + +distclean-generic: + -test -z "$(CONFIG_CLEAN_FILES)" || rm -f $(CONFIG_CLEAN_FILES) + -test . = "$(srcdir)" || test -z "$(CONFIG_CLEAN_VPATH_FILES)" || rm -f $(CONFIG_CLEAN_VPATH_FILES) + +maintainer-clean-generic: + @echo "This command is intended for maintainers to use" + @echo "it deletes files that may require special tools to rebuild." +clean: clean-recursive + +clean-am: clean-generic mostlyclean-am + +distclean: distclean-recursive + -rm -f Makefile +distclean-am: clean-am distclean-generic distclean-tags + +dvi: dvi-recursive + +dvi-am: + +html: html-recursive + +html-am: + +info: info-recursive + +info-am: + +install-data-am: + +install-dvi: install-dvi-recursive + +install-dvi-am: + +install-exec-am: + +install-html: install-html-recursive + +install-html-am: + +install-info: install-info-recursive + +install-info-am: + +install-man: + +install-pdf: install-pdf-recursive + +install-pdf-am: + +install-ps: install-ps-recursive + +install-ps-am: + +installcheck-am: + +maintainer-clean: maintainer-clean-recursive + -rm -f Makefile +maintainer-clean-am: distclean-am maintainer-clean-generic + +mostlyclean: mostlyclean-recursive + +mostlyclean-am: mostlyclean-generic + +pdf: pdf-recursive + +pdf-am: + +ps: ps-recursive + +ps-am: + +uninstall-am: + +.MAKE: $(am__recursive_targets) install-am install-strip + +.PHONY: $(am__recursive_targets) CTAGS GTAGS TAGS all all-am check \ + check-am clean clean-generic cscopelist-am ctags ctags-am \ + distclean distclean-generic distclean-tags distdir dvi dvi-am \ + html html-am info info-am install install-am install-data \ + install-data-am install-dvi install-dvi-am install-exec \ + install-exec-am install-html install-html-am install-info \ + install-info-am install-man install-pdf install-pdf-am \ + install-ps install-ps-am install-strip installcheck \ + installcheck-am installdirs installdirs-am maintainer-clean \ + maintainer-clean-generic mostlyclean mostlyclean-generic pdf \ + pdf-am ps ps-am tags tags-am uninstall uninstall-am + +.PRECIOUS: Makefile + + +# Tell versions [3.59,3.63) of GNU make to not export all variables. +# Otherwise a system limit (for SysV at least) may be exceeded. +.NOEXPORT: diff --git a/windows/README.txt b/windows/README.txt new file mode 100644 index 0000000..ac96c94 --- /dev/null +++ b/windows/README.txt @@ -0,0 +1,121 @@ +# License: CC0 + +# Cross Build # + +## Using OpenSUSE Tumbleweed in a VM ## + +This is for 32 bit version, but very similar for 64 version. +Just use mingw64-viking.spec file instead, install the appropriate 64bit dependencies and it produce a viking-win64-*.exe file. + +### Host Preparation ### + +On the host need to ensure the viking-1.X.tar.gz file is available: + cd code/viking + make dist + +Generate help PDF + dblatex help/C/viking.xml +This could be done in the VM but installing dblatex requires ~650Mb install (so a waste if already available on the host). + +### Guest Preparation (root) ### + +In the guest ensure availability of build dependent mingw32 / mingw64 packages (not in standard Tumbleweed repo ATM) + # As root + zypper ar -f http://download.opensuse.org/repositories/windows:/mingw:/win32/openSUSE_Tumbleweed windows + zypper ar -f http://download.opensuse.org/repositories/windows:/mingw:/win64/openSUSE_Tumbleweed windows64 + zypper ar -f http://download.opensuse.org/repositories/home:/ecsos/openSUSE_Tumbleweed windows-extra-ecsos + zypper ar -f http://download.opensuse.org/repositories/home:/ecsos:/pipelight/openSUSE_Tumbleweed windows-extra-ecsos2 + # Ensure a standard user account is available for the build e.g: + #useradd -m build + #passwd build + +Install build packages as listed in the .spec file or when running the rpmbuild it will tell you what packages are required + zypper install mingw32-cross-gcc + #etc... + +For the MSI generation you will need + zypper install mingw32-cross-nsis + +And ensure FindProcDLL is available for NSIS +if [ ! -e /usr/share/nsis/Plugins/FindProcDLL.dll ]; + wget http://nsis.sourceforge.net/mediawiki/images/3/3c/FindProc.zip + unzip FindProc.zip FindProcDLL.dll -d /usr/share/nsis/Plugins/ +fi + +Make code accessible via a shared folder +So add a suitable Shared Folder to the virtual machine +Remember the build user will need mount access priviledges - if using VirtualBox then: + #As root + #usermod -a -G vboxsf <builduser> + +### Guest Preparation (builduser) ### + +Go to the code location + cd /media/sf_Code/viking + +Copy source package as generated by make dist on the host to the package build area, or even just link to it e.g.: + ln -s /media/sf_Code/viking/viking-1.6.1.tar.gz /home/build/rpmbuild/SOURCES/viking-1.6.1.tar.gz + +### Build on Guest ### + +Now perform the build (32bit): + rpmbuild -ba mingw-viking.spec +# or for the 64bit build: +# rpmbuild -ba mingw64-viking.spec + +Install locally + sudo rpm -i /home/build/rpmbuild/RPMS/noarch/ming*-viking-*.noarch.rpm + +Generate .msi + cd windows + ./installer-mingw.sh + cd - + +### Install + Run on Host (or guest) ### +Install the appropriate 64bit or 32bit executable: + wine windows/installer/viking-win64-*.exe + +Run viking.exe with wine + cd ~/.wine/drive_c/Program\ Files/Viking/ + wine viking.exe + +######################################################################### + +# Native Build # + +The build under Windows follows the same process as the traditional Linux build: + + cd ../src + sh configure <options> + make + +There is a separate installer method using NSIS to generate the viking-1.X.Y.Z.exe installer file. + +To generate the installer (once the code has been compiled as above) run the installer.bat + +For further details (especially about how to set up the development dependencies) see: +http://sourceforge.net/apps/mediawiki/viking/index.php?title=WindowsBuildInstructions + +These instructions have now been turned turned into a series of scripts to produce the Viking installer: + +1. prepare.bat +2a. configure_and_make.bat +2b. make.bat +3. installer.bat + +The scripts are aimed at a pristine Windows XP installation. +Using *prepare.bat* will attempt to *download* and *install* various Open Source software to aid this process. +An administrator level account is needed to run this which will *modify* your system. + +The other scripts simply make use of these (assumed) available system programs. + +This setup is for dedicated usage to build Viking, primarily under Wine with: + + ./generate_install.sh + +Such that any Windows system (or of course a Virtual Machine) can be simply deleted (e.g. rm -rf /.wine) and recreated fully via the scripts. + +From Viking 1.4 to 1.6.X this was how the Windows viking-W.X.Y.Z.exe installer file was produced. + +Notionally the standard configure + make stages should still work, but the Cross build is now the supported method. +Thus the prepare + installer scripts are no longer maintained and are for reference only. diff --git a/windows/configure_and_make.bat b/windows/configure_and_make.bat new file mode 100644 index 0000000..194883e --- /dev/null +++ b/windows/configure_and_make.bat @@ -0,0 +1,12 @@ +:: License: CC0 +:: Full build +:: +:: Note this assumes the 'configure' script already exists +:: either via part of the source download or via separate generation - e.g. using wine +:: +set PATH=%PATH%;%SystemDrive%\Mingw\bin;%SystemDrive%\msys\1.0\bin +pushd .. +:: ATM Don't have build method for libgexiv2, so use the fallback of libexif +sh configure CFLAGS="-DWINDOWS -DWIN32 -mwindows" LIBCURL=-lcurldll LIBS=-lzdll --with-libexif --disable-realtime-gps-tracking --disable-scrollkeeper --enable-windows --disable-mapnik --disable-geoclue +popd +make.bat %* diff --git a/windows/installer-mingw.sh b/windows/installer-mingw.sh new file mode 100755 index 0000000..0eba3f8 --- /dev/null +++ b/windows/installer-mingw.sh @@ -0,0 +1,160 @@ +#!/bin/bash +# License: CC0 +# +# A version of the installer.bat for mingw build +# Similarily basily copy all dependent files from the host system +# to be available for the NSIS stage +# +# Remember to have installed the generated mingw-viking package first so the +# binaries are available from the default location +# (e.g. as root rpm -i mingw32-viking-1.7-1.noarch.rpm) +# +# 'MINGW' and 'DESTINATION' values can be defined to override inbuilt defaults +# + +if [ -z "$DESTINATION" ]; then + DESTINATION=installer/bin +fi +# General clean out tmp copy location so 32v64 versions can't conflict +if [ -z "$NOCLEAN" ]; then + rm -rf installer/bin +fi +mkdir -p $DESTINATION + +if [ -z "$MINGW" ]; then + if [ "$HOSTTYPE" == "x86_64" ]; then + MINGW=/usr/x86_64-w64-mingw32/sys-root/mingw + else + MINGW=/usr/i686-w64-mingw32/sys-root/mingw + fi +fi +MINGW_BIN=$MINGW/bin +echo MINGW=$MINGW + +echo Make language copies +for x in $(ls ../po/*.gmo); do + mkdir -p $DESTINATION/locale/$(basename -s .gmo $x)/LC_MESSAGES + cp $MINGW/share/locale/$(basename -s .gmo $x)/LC_MESSAGES/viking.mo $DESTINATION/locale/$(basename -s .gmo $x)/LC_MESSAGES/ +done + +echo Copying Viking +cp $MINGW_BIN/*viking.exe $DESTINATION/viking.exe +cp ../COPYING $DESTINATION/COPYING_GPL.txt +cp ../AUTHORS $DESTINATION/AUTHORS.txt +cp ../NEWS $DESTINATION/NEWS.txt +cp ../README $DESTINATION/README.txt +# PDF generation if required +if [ ! -e ../help/C/viking.pdf ]; then + pushd ../help/C + dblatex viking.xml + if [ $? != 0 ]; then + echo "Help PDF generation failed." + exit + fi +fi +cp ../help/C/viking.pdf $DESTINATION +cp ../tools/viking-cache.py $DESTINATION +cp installer/translations/*nsh $DESTINATION +cp installer/pixmaps/viking_icon.ico $DESTINATION + +echo Copying Extension Configuration Data +mkdir $DESTINATION/data +cp ../data/*.xml $DESTINATION/data +cp ../data/latlontz.txt $DESTINATION/data + +echo Copying Helper Apps +# Needed when spawning other programs (e.g. when invoking GPSBabel) +if [ "$HOSTTYPE" == "x86_64" ]; then + cp $MINGW_BIN/gspawn-win64-helper.exe $DESTINATION +else + cp $MINGW_BIN/gspawn-win32-helper.exe $DESTINATION +fi + +echo Copying Libraries +# Core libs +cp $MINGW_BIN/libatk*.dll $DESTINATION +cp $MINGW_BIN/libcairo*.dll $DESTINATION +cp $MINGW_BIN/libgcc*.dll $DESTINATION +cp $MINGW_BIN/libgcrypt*.dll $DESTINATION +cp $MINGW_BIN/libgdk*.dll $DESTINATION +cp $MINGW_BIN/libgettext*.dll $DESTINATION +cp $MINGW_BIN/libgio*.dll $DESTINATION +cp $MINGW_BIN/libglib*.dll $DESTINATION +cp $MINGW_BIN/libgmodule*.dll $DESTINATION +cp $MINGW_BIN/libgnurx*.dll $DESTINATION +cp $MINGW_BIN/libgobject*.dll $DESTINATION +cp $MINGW_BIN/libgpg*.dll $DESTINATION +cp $MINGW_BIN/libgtk*.dll $DESTINATION +cp $MINGW_BIN/libintl*.dll $DESTINATION +cp $MINGW_BIN/libffi*.dll $DESTINATION +cp $MINGW_BIN/libfontconfig*.dll $DESTINATION +cp $MINGW_BIN/libfreetype*.dll $DESTINATION +cp $MINGW_BIN/libharfbuzz*.dll $DESTINATION +cp $MINGW_BIN/libjasper*.dll $DESTINATION +cp $MINGW_BIN/libjpeg*.dll $DESTINATION +cp $MINGW_BIN/liblzma*.dll $DESTINATION +cp $MINGW_BIN/libpng*.dll $DESTINATION +cp $MINGW_BIN/libpango*.dll $DESTINATION +cp $MINGW_BIN/libpixman*.dll $DESTINATION +cp $MINGW_BIN/libtiff*.dll $DESTINATION +cp $MINGW_BIN/libxml2*.dll $DESTINATION +cp $MINGW_BIN/zlib1.dll $DESTINATION +cp $MINGW_BIN/libzip*.dll $DESTINATION + +# Extras +cp $MINGW_BIN/libexpat*.dll $DESTINATION +# Curl 7.17+ has quite a few dependencies for SSL support +cp $MINGW_BIN/libcurl*.dll $DESTINATION +cp $MINGW_BIN/libssh*.dll $DESTINATION +cp $MINGW_BIN/libidn*.dll $DESTINATION +cp $MINGW_BIN/libnspr*.dll $DESTINATION +cp $MINGW_BIN/libplc*.dll $DESTINATION +cp $MINGW_BIN/libplds*.dll $DESTINATION +cp $MINGW_BIN/nss*.dll $DESTINATION +cp $MINGW_BIN/ssl*.dll $DESTINATION +cp $MINGW_BIN/softokn*.dll $DESTINATION +cp $MINGW_BIN/smime*.dll $DESTINATION +cp $MINGW_BIN/freebl*.dll $DESTINATION +if [ "$HOSTTYPE" == "x86_64" ]; then + cp /usr/share/doc/packages/mingw64-libcurl-devel/COPYING $DESTINATION/COPYING_curl.txt +else + cp /usr/share/doc/packages/mingw32-libcurl-devel/COPYING $DESTINATION/COPYING_curl.txt +fi + +cp $MINGW_BIN/libexiv2.dll $DESTINATION +cp $MINGW_BIN/libgexiv2*.dll $DESTINATION +cp $MINGW_BIN/libstdc++*.dll $DESTINATION +cp $MINGW_BIN/libbz*.dll $DESTINATION +cp $MINGW_BIN/libmagic*.dll $DESTINATION +cp $MINGW/share/misc/magic* $DESTINATION +cp $MINGW_BIN/libsqlite3*.dll $DESTINATION +cp $MINGW_BIN/libnettle*.dll $DESTINATION +cp $MINGW_BIN/libgps*.dll $DESTINATION +cp $MINGW_BIN/libwinpthread*.dll $DESTINATION +cp $MINGW_BIN/liboauth*.dll $DESTINATION + +# Extra GTK stuff required for (default) theme to work in Windows +mkdir -p $DESTINATION/lib +cp -a $MINGW/lib/gtk-2.0 $DESTINATION/lib +mkdir -p $DESTINATION/share/themes +cp -a $MINGW/share/themes/MS-Windows $DESTINATION/share/themes + +echo Copying GPSBabel Installer +mkdir $DESTINATION/Optional +# ATM GPSBabel needs to be in 'cache' dir +cp cache/GPSBabel-1.5.4-Setup.exe $DESTINATION/Optional + +pushd installer +if [ -z "$DEBUG" ]; then + makensis -X"SetCompressor lzma" viking-installer.nsi +else + # Speedier install generation when testing + makensis -X"SetCompress off" viking-installer.nsi +fi + +if [ "$HOSTTYPE" == "x86_64" ]; then + rename viking viking-win64 viking-[0-9].[0-9].[0-9].[0-9].exe +else + rename viking viking-win32 viking-[0-9].[0-9].[0-9].[0-9].exe +fi +popd diff --git a/windows/installer.bat b/windows/installer.bat new file mode 100644 index 0000000..ad96ad6 --- /dev/null +++ b/windows/installer.bat @@ -0,0 +1,156 @@ +@echo OFF +:: License: CC0 +:: +:: TODO return an error code when not completed as expected +:: +echo STARTING INSTALLER PROCESS... + +:: For strip +set PATH=%PATH%;%SystemDrive%\MinGW\bin + +echo Remove debugging symbols +pushd ..\src +strip.exe -g viking.exe +popd + +set MYCOPY=copy /y +set DESTINATION=installer\bin +echo Copying locale files into layout required by NSIS +dir ..\po\*.gmo /B > gmolist.txt +:: Create directories like de\LC_MESSAGES +for /f %%i in (gmolist.txt) do mkdir %DESTINATION%\locale\%%~ni\LC_MESSAGES +for /f %%i in (gmolist.txt) do %MYCOPY% ..\po\%%i %DESTINATION%\locale\%%~ni\LC_MESSAGES\viking.mo +del gmolist.txt + +echo Copying Viking +%MYCOPY% ..\src\viking.exe %DESTINATION% +%MYCOPY% installer\pixmaps\viking_icon.ico %DESTINATION% +%MYCOPY% ..\COPYING %DESTINATION%\COPYING_GPL.txt +%MYCOPY% ..\AUTHORS %DESTINATION%\AUTHORS.txt +%MYCOPY% ..\NEWS %DESTINATION%\NEWS.txt +%MYCOPY% ..\README %DESTINATION%\README.txt +:: ATM this relies on being generated by an external system +%MYCOPY% cache\ChangeLog.txt %DESTINATION% +:: ATM this relies on being generated by an external system +%MYCOPY% ..\help\C\viking.pdf %DESTINATION% +:: Python cache converter tool +%MYCOPY% ..\tools\viking-cache.py %DESTINATION% + +echo Copying Extension Configuration Data +mkdir %DESTINATION%\data +%MYCOPY% ..\data\*.xml %DESTINATION%\data +%MYCOPY% ..\data\latlontz.txt %DESTINATION%\data + +echo Copying Libraries +set MINGW=%SystemDrive%\MinGW +if not exist "%MINGW%" ( + echo Required %MINGW% does not exist + goto Tidy +) + +set MINGW_BIN=%MINGW%\Bin + +REM Curl 7.17+ has quite a few dependencies for SSL support +set LIBCURL=%MINGW_BIN%\libcurl.dll +if exist "%LIBCURL%" ( + %MYCOPY% "%LIBCURL%" %DESTINATION% + %MYCOPY% "%MINGW_BIN%\libeay32.dll" %DESTINATION% + %MYCOPY% "%MINGW_BIN%\librtmp.dll" %DESTINATION% + %MYCOPY% "%MINGW_BIN%\libssh2.dll" %DESTINATION% + %MYCOPY% "%MINGW_BIN%\libidn-11.dll" %DESTINATION% + %MYCOPY% "%MINGW_BIN%\ssleay32.dll" %DESTINATION% +:: %MYCOPY% "%MINGW_BIN%\zlib1.dll" %DESTINATION% + %MYCOPY% "%MINGW%\COPYING_curl.txt" %DESTINATION% +) else ( + echo %LIBCURL% does not exist + goto Tidy +) +set LIBEXIF=%MINGW_BIN%\libexif-12.dll +if exist "%LIBEXIF%" ( + %MYCOPY% "%LIBEXIF%" %DESTINATION% +) else ( + echo Required %LIBEXIF% does not exist + goto Tidy +) +set LIBBZ2=%MINGW_BIN%\libbz2-2.dll +if exist "%LIBBZ2%" ( + %MYCOPY% "%LIBBZ2%" %DESTINATION% + %MYCOPY% "%MINGW_BIN%\libgcc_s_dw2-1.dll" %DESTINATION% +) else ( + echo Required %LIBBZ2% does not exist + goto Tidy +) +set LIBMAGIC=%MINGW_BIN%\magic1.dll +if exist "%LIBMAGIC%" ( + %MYCOPY% "%LIBMAGIC%" %DESTINATION% + %MYCOPY% "%MINGW_BIN%\regex2.dll" %DESTINATION% + %MYCOPY% "%MINGW%\share\misc\magic.mgc" %DESTINATION% +) else ( + echo Required %LIBMAGIC% does not exist + goto Tidy +) +set LIBSQL3=%MINGW_BIN%\sqlite3.dll +if exist "%LIBSQL3%" ( + %MYCOPY% "%LIBSQL3%" %DESTINATION% +) else ( + echo Required %LIBSQL3% does not exist + goto Tidy +) +set LIBZIP=%MINGW_BIN%\libzip.dll +if exist "%LIBZIP%" ( + %MYCOPY% "%LIBZIP%" %DESTINATION% +) else ( + echo Required %LIBZIP% does not exist + goto Tidy +) + +:: TODO Maybe embed http://gtk-win.sourceforge.net/home/index.php/Main/EmbeddingGTK directly in NSIS? +:: Best to use the same GTK version as we built against in prepare.bat!! +echo =+=+= +echo Checking gtk runtime +echo =+=+= +set GTK_RUNTIME=gtk2-runtime-2.24.10-2012-10-10-ash.exe +pushd cache +if not exist %GTK_RUNTIME% ( + set PATH=%PATH%;%ProgramFiles%\GnuWin32\bin + wget http://downloads.sourceforge.net/gtk-win/%GTK_RUNTIME% +) +if not exist %GTK_RUNTIME% ( + echo Required GTK Runtime does not exist + goto Tidy +) +:: Install GTK into temporary location so we can repackage it +:: Destination path appears to have to be an absolute kind +popd +cd > tmp.tmp +set /p PWD=<tmp.tmp +del tmp.tmp +cache\%GTK_RUNTIME% /sideeffects=no /setpath=no /dllpath=root /translations=no /compatdlls=yes /S /D=%PWD%\%DESTINATION% + +echo Copying GPSBabel Installer +mkdir %DESTINATION%\Optional +%MYCOPY% cache\GPSBabel-1.5.4-Setup.exe %DESTINATION%\Optional +if ERRORLEVEL 1 goto Error + +:: +echo Copying Translations +%MYCOPY% installer\translations\*nsh %DESTINATION% +if ERRORLEVEL 1 goto Error + +echo Running NSIS (command line version) +pushd installer +if exist "%ProgramFiles%\NSIS" ( + "%ProgramFiles%\NSIS\makensis.exe" /X"SetCompressor /SOLID lzma" viking-installer.nsi +) else ( + echo NSIS Not installed in known location +) +popd + +goto Tidy + +:Error +echo Exitting due to error: %ERRORLEVEL% + +:Tidy +echo Tidy Up +rmdir /S /Q %DESTINATION% diff --git a/windows/installer/FileAssociation.nsh b/windows/installer/FileAssociation.nsh new file mode 100644 index 0000000..223aa70 --- /dev/null +++ b/windows/installer/FileAssociation.nsh @@ -0,0 +1,190 @@ +/* +_____________________________________________________________________________ + + File Association +_____________________________________________________________________________ + + Based on code taken from http://nsis.sourceforge.net/File_Association + + Usage in script: + 1. !include "FileAssociation.nsh" + 2. [Section|Function] + ${FileAssociationFunction} "Param1" "Param2" "..." $var + [SectionEnd|FunctionEnd] + + FileAssociationFunction=[RegisterExtension|UnRegisterExtension] + +_____________________________________________________________________________ + + ${RegisterExtension} "[executable]" "[extension]" "[description]" + +"[executable]" ; executable which opens the file format + ; +"[extension]" ; extension, which represents the file format to open + ; +"[description]" ; description for the extension. This will be display in Windows Explorer. + ; + + + ${UnRegisterExtension} "[extension]" "[description]" + +"[extension]" ; extension, which represents the file format to open + ; +"[description]" ; description for the extension. This will be display in Windows Explorer. + ; + +_____________________________________________________________________________ + + Macros +_____________________________________________________________________________ + + Change log window verbosity (default: 3=no script) + + Example: + !include "FileAssociation.nsh" + !insertmacro RegisterExtension + ${FileAssociation_VERBOSE} 4 # all verbosity + !insertmacro UnRegisterExtension + ${FileAssociation_VERBOSE} 3 # no script +*/ + + +!ifndef FileAssociation_INCLUDED +!define FileAssociation_INCLUDED + +!include Util.nsh + +!verbose push +!verbose 3 +!ifndef _FileAssociation_VERBOSE + !define _FileAssociation_VERBOSE 3 +!endif +!verbose ${_FileAssociation_VERBOSE} +!define FileAssociation_VERBOSE `!insertmacro FileAssociation_VERBOSE` +!verbose pop + +!macro FileAssociation_VERBOSE _VERBOSE + !verbose push + !verbose 3 + !undef _FileAssociation_VERBOSE + !define _FileAssociation_VERBOSE ${_VERBOSE} + !verbose pop +!macroend + + + +!macro RegisterExtensionCall _EXECUTABLE _EXTENSION _DESCRIPTION + !verbose push + !verbose ${_FileAssociation_VERBOSE} + Push `${_DESCRIPTION}` + Push `${_EXTENSION}` + Push `${_EXECUTABLE}` + ${CallArtificialFunction} RegisterExtension_ + !verbose pop +!macroend + +!macro UnRegisterExtensionCall _EXTENSION _DESCRIPTION + !verbose push + !verbose ${_FileAssociation_VERBOSE} + Push `${_EXTENSION}` + Push `${_DESCRIPTION}` + ${CallArtificialFunction} UnRegisterExtension_ + !verbose pop +!macroend + + + +!define RegisterExtension `!insertmacro RegisterExtensionCall` +!define un.RegisterExtension `!insertmacro RegisterExtensionCall` + +!macro RegisterExtension +!macroend + +!macro un.RegisterExtension +!macroend + +!macro RegisterExtension_ + !verbose push + !verbose ${_FileAssociation_VERBOSE} + + Exch $R2 ;exe + Exch + Exch $R1 ;ext + Exch + Exch 2 + Exch $R0 ;desc + Exch 2 + Push $0 + Push $1 + + ReadRegStr $1 HKCR $R1 "" ; read current file association + StrCmp "$1" "" NoBackup ; is it empty + StrCmp "$1" "$R0" NoBackup ; is it our own + WriteRegStr HKCR $R1 "backup_val" "$1" ; backup current value +NoBackup: + WriteRegStr HKCR $R1 "" "$R0" ; set our file association + + ReadRegStr $0 HKCR $R0 "" + StrCmp $0 "" 0 Skip + WriteRegStr HKCR "$R0" "" "$R0" + WriteRegStr HKCR "$R0\shell" "" "open" + WriteRegStr HKCR "$R0\DefaultIcon" "" "$R2,0" +Skip: + WriteRegStr HKCR "$R0\shell\open\command" "" '"$R2" "%1"' + WriteRegStr HKCR "$R0\shell\edit" "" "Edit $R0" + WriteRegStr HKCR "$R0\shell\edit\command" "" '"$R2" "%1"' + + Pop $1 + Pop $0 + Pop $R2 + Pop $R1 + Pop $R0 + + !verbose pop +!macroend + + + +!define UnRegisterExtension `!insertmacro UnRegisterExtensionCall` +!define un.UnRegisterExtension `!insertmacro UnRegisterExtensionCall` + +!macro UnRegisterExtension +!macroend + +!macro un.UnRegisterExtension +!macroend + +!macro UnRegisterExtension_ + !verbose push + !verbose ${_FileAssociation_VERBOSE} + + Exch $R1 ;desc + Exch + Exch $R0 ;ext + Exch + Push $0 + Push $1 + + ReadRegStr $1 HKCR $R0 "" + StrCmp $1 $R1 0 NoOwn ; only do this if we own it + ReadRegStr $1 HKCR $R0 "backup_val" + StrCmp $1 "" 0 Restore ; if backup="" then delete the whole key + DeleteRegKey HKCR $R0 + Goto NoOwn + +Restore: + WriteRegStr HKCR $R0 "" $1 + DeleteRegValue HKCR $R0 "backup_val" + DeleteRegKey HKCR $R1 ;Delete key with association name settings + +NoOwn: + + Pop $1 + Pop $0 + Pop $R1 + Pop $R0 + + !verbose pop +!macroend + +!endif # !FileAssociation_INCLUDED diff --git a/windows/installer/Makefile.am b/windows/installer/Makefile.am new file mode 100644 index 0000000..60f9916 --- /dev/null +++ b/windows/installer/Makefile.am @@ -0,0 +1,7 @@ + +EXTRA_DIST = \ + FileAssociation.nsh \ + viking-installer.nsi \ + langmacros.nsh + +SUBDIRS = pixmaps translations diff --git a/windows/installer/Makefile.in b/windows/installer/Makefile.in new file mode 100644 index 0000000..1866eb3 --- /dev/null +++ b/windows/installer/Makefile.in @@ -0,0 +1,684 @@ +# Makefile.in generated by automake 1.16.1 from Makefile.am. +# @configure_input@ + +# Copyright (C) 1994-2018 Free Software Foundation, Inc. + +# This Makefile.in is free software; the Free Software Foundation +# gives unlimited permission to copy and/or distribute it, +# with or without modifications, as long as this notice is preserved. + +# This program is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY, to the extent permitted by law; without +# even the implied warranty of MERCHANTABILITY or FITNESS FOR A +# PARTICULAR PURPOSE. + +@SET_MAKE@ +VPATH = @srcdir@ +am__is_gnu_make = { \ + if test -z '$(MAKELEVEL)'; then \ + false; \ + elif test -n '$(MAKE_HOST)'; then \ + true; \ + elif test -n '$(MAKE_VERSION)' && test -n '$(CURDIR)'; then \ + true; \ + else \ + false; \ + fi; \ +} +am__make_running_with_option = \ + case $${target_option-} in \ + ?) ;; \ + *) echo "am__make_running_with_option: internal error: invalid" \ + "target option '$${target_option-}' specified" >&2; \ + exit 1;; \ + esac; \ + has_opt=no; \ + sane_makeflags=$$MAKEFLAGS; \ + if $(am__is_gnu_make); then \ + sane_makeflags=$$MFLAGS; \ + else \ + case $$MAKEFLAGS in \ + *\\[\ \ ]*) \ + bs=\\; \ + sane_makeflags=`printf '%s\n' "$$MAKEFLAGS" \ + | sed "s/$$bs$$bs[$$bs $$bs ]*//g"`;; \ + esac; \ + fi; \ + skip_next=no; \ + strip_trailopt () \ + { \ + flg=`printf '%s\n' "$$flg" | sed "s/$$1.*$$//"`; \ + }; \ + for flg in $$sane_makeflags; do \ + test $$skip_next = yes && { skip_next=no; continue; }; \ + case $$flg in \ + *=*|--*) continue;; \ + -*I) strip_trailopt 'I'; skip_next=yes;; \ + -*I?*) strip_trailopt 'I';; \ + -*O) strip_trailopt 'O'; skip_next=yes;; \ + -*O?*) strip_trailopt 'O';; \ + -*l) strip_trailopt 'l'; skip_next=yes;; \ + -*l?*) strip_trailopt 'l';; \ + -[dEDm]) skip_next=yes;; \ + -[JT]) skip_next=yes;; \ + esac; \ + case $$flg in \ + *$$target_option*) has_opt=yes; break;; \ + esac; \ + done; \ + test $$has_opt = yes +am__make_dryrun = (target_option=n; $(am__make_running_with_option)) +am__make_keepgoing = (target_option=k; $(am__make_running_with_option)) +pkgdatadir = $(datadir)/@PACKAGE@ +pkgincludedir = $(includedir)/@PACKAGE@ +pkglibdir = $(libdir)/@PACKAGE@ +pkglibexecdir = $(libexecdir)/@PACKAGE@ +am__cd = CDPATH="$${ZSH_VERSION+.}$(PATH_SEPARATOR)" && cd +install_sh_DATA = $(install_sh) -c -m 644 +install_sh_PROGRAM = $(install_sh) -c +install_sh_SCRIPT = $(install_sh) -c +INSTALL_HEADER = $(INSTALL_DATA) +transform = $(program_transform_name) +NORMAL_INSTALL = : +PRE_INSTALL = : +POST_INSTALL = : +NORMAL_UNINSTALL = : +PRE_UNINSTALL = : +POST_UNINSTALL = : +build_triplet = @build@ +host_triplet = @host@ +target_triplet = @target@ +subdir = windows/installer +ACLOCAL_M4 = $(top_srcdir)/aclocal.m4 +am__aclocal_m4_deps = $(top_srcdir)/m4/expat.m4 \ + $(top_srcdir)/m4/gettext.m4 $(top_srcdir)/m4/iconv.m4 \ + $(top_srcdir)/m4/intlmacosx.m4 $(top_srcdir)/m4/lib-ld.m4 \ + $(top_srcdir)/m4/lib-link.m4 $(top_srcdir)/m4/lib-prefix.m4 \ + $(top_srcdir)/m4/libcurl.m4 $(top_srcdir)/m4/nls.m4 \ + $(top_srcdir)/m4/po.m4 $(top_srcdir)/m4/progtest.m4 \ + $(top_srcdir)/configure.ac +am__configure_deps = $(am__aclocal_m4_deps) $(CONFIGURE_DEPENDENCIES) \ + $(ACLOCAL_M4) +DIST_COMMON = $(srcdir)/Makefile.am $(am__DIST_COMMON) +mkinstalldirs = $(SHELL) $(top_srcdir)/mkinstalldirs +CONFIG_HEADER = $(top_builddir)/src/config.h +CONFIG_CLEAN_FILES = +CONFIG_CLEAN_VPATH_FILES = +AM_V_P = $(am__v_P_@AM_V@) +am__v_P_ = $(am__v_P_@AM_DEFAULT_V@) +am__v_P_0 = false +am__v_P_1 = : +AM_V_GEN = $(am__v_GEN_@AM_V@) +am__v_GEN_ = $(am__v_GEN_@AM_DEFAULT_V@) +am__v_GEN_0 = @echo " GEN " $@; +am__v_GEN_1 = +AM_V_at = $(am__v_at_@AM_V@) +am__v_at_ = $(am__v_at_@AM_DEFAULT_V@) +am__v_at_0 = @ +am__v_at_1 = +SOURCES = +DIST_SOURCES = +RECURSIVE_TARGETS = all-recursive check-recursive cscopelist-recursive \ + ctags-recursive dvi-recursive html-recursive info-recursive \ + install-data-recursive install-dvi-recursive \ + install-exec-recursive install-html-recursive \ + install-info-recursive install-pdf-recursive \ + install-ps-recursive install-recursive installcheck-recursive \ + installdirs-recursive pdf-recursive ps-recursive \ + tags-recursive uninstall-recursive +am__can_run_installinfo = \ + case $$AM_UPDATE_INFO_DIR in \ + n|no|NO) false;; \ + *) (install-info --version) >/dev/null 2>&1;; \ + esac +RECURSIVE_CLEAN_TARGETS = mostlyclean-recursive clean-recursive \ + distclean-recursive maintainer-clean-recursive +am__recursive_targets = \ + $(RECURSIVE_TARGETS) \ + $(RECURSIVE_CLEAN_TARGETS) \ + $(am__extra_recursive_targets) +AM_RECURSIVE_TARGETS = $(am__recursive_targets:-recursive=) TAGS CTAGS \ + distdir distdir-am +am__tagged_files = $(HEADERS) $(SOURCES) $(TAGS_FILES) $(LISP) +# Read a list of newline-separated strings from the standard input, +# and print each of them once, without duplicates. Input order is +# *not* preserved. +am__uniquify_input = $(AWK) '\ + BEGIN { nonempty = 0; } \ + { items[$$0] = 1; nonempty = 1; } \ + END { if (nonempty) { for (i in items) print i; }; } \ +' +# Make sure the list of sources is unique. This is necessary because, +# e.g., the same source file might be shared among _SOURCES variables +# for different programs/libraries. +am__define_uniq_tagged_files = \ + list='$(am__tagged_files)'; \ + unique=`for i in $$list; do \ + if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \ + done | $(am__uniquify_input)` +ETAGS = etags +CTAGS = ctags +DIST_SUBDIRS = $(SUBDIRS) +am__DIST_COMMON = $(srcdir)/Makefile.in $(top_srcdir)/mkinstalldirs +DISTFILES = $(DIST_COMMON) $(DIST_SOURCES) $(TEXINFOS) $(EXTRA_DIST) +am__relativize = \ + dir0=`pwd`; \ + sed_first='s,^\([^/]*\)/.*$$,\1,'; \ + sed_rest='s,^[^/]*/*,,'; \ + sed_last='s,^.*/\([^/]*\)$$,\1,'; \ + sed_butlast='s,/*[^/]*$$,,'; \ + while test -n "$$dir1"; do \ + first=`echo "$$dir1" | sed -e "$$sed_first"`; \ + if test "$$first" != "."; then \ + if test "$$first" = ".."; then \ + dir2=`echo "$$dir0" | sed -e "$$sed_last"`/"$$dir2"; \ + dir0=`echo "$$dir0" | sed -e "$$sed_butlast"`; \ + else \ + first2=`echo "$$dir2" | sed -e "$$sed_first"`; \ + if test "$$first2" = "$$first"; then \ + dir2=`echo "$$dir2" | sed -e "$$sed_rest"`; \ + else \ + dir2="../$$dir2"; \ + fi; \ + dir0="$$dir0"/"$$first"; \ + fi; \ + fi; \ + dir1=`echo "$$dir1" | sed -e "$$sed_rest"`; \ + done; \ + reldir="$$dir2" +ACLOCAL = @ACLOCAL@ +ACLOCAL_AMFLAGS = @ACLOCAL_AMFLAGS@ +ALL_LINGUAS = @ALL_LINGUAS@ +AMTAR = @AMTAR@ +AM_DEFAULT_VERBOSITY = @AM_DEFAULT_VERBOSITY@ +AUTOCONF = @AUTOCONF@ +AUTOHEADER = @AUTOHEADER@ +AUTOMAKE = @AUTOMAKE@ +AWK = @AWK@ +CATALOGS = @CATALOGS@ +CATOBJEXT = @CATOBJEXT@ +CC = @CC@ +CCDEPMODE = @CCDEPMODE@ +CFLAGS = @CFLAGS@ +CONFIG_STATUS_DEPENDENCIES = @CONFIG_STATUS_DEPENDENCIES@ +CPP = @CPP@ +CPPFLAGS = @CPPFLAGS@ +CXX = @CXX@ +CXXCPP = @CXXCPP@ +CXXDEPMODE = @CXXDEPMODE@ +CXXFLAGS = @CXXFLAGS@ +CYGPATH_W = @CYGPATH_W@ +DATADIRNAME = @DATADIRNAME@ +DB2MAN_XSL = @DB2MAN_XSL@ +DEFS = @DEFS@ +DEPDIR = @DEPDIR@ +DISTCHECK_CONFIGURE_FLAGS = @DISTCHECK_CONFIGURE_FLAGS@ +DOC_USER_FORMATS = @DOC_USER_FORMATS@ +ECHO_C = @ECHO_C@ +ECHO_N = @ECHO_N@ +ECHO_T = @ECHO_T@ +EGREP = @EGREP@ +EXEEXT = @EXEEXT@ +EXPAT_CFLAGS = @EXPAT_CFLAGS@ +EXPAT_LIBS = @EXPAT_LIBS@ +GDK_PIXBUF_CSOURCE = @GDK_PIXBUF_CSOURCE@ +GETTEXT_MACRO_VERSION = @GETTEXT_MACRO_VERSION@ +GETTEXT_PACKAGE = @GETTEXT_PACKAGE@ +GLIB_MKENUMS = @GLIB_MKENUMS@ +GMOFILES = @GMOFILES@ +GMSGFMT = @GMSGFMT@ +GMSGFMT_015 = @GMSGFMT_015@ +GREP = @GREP@ +GTKDOC_CHECK = @GTKDOC_CHECK@ +GTKDOC_CHECK_PATH = @GTKDOC_CHECK_PATH@ +GTKDOC_DEPS_CFLAGS = @GTKDOC_DEPS_CFLAGS@ +GTKDOC_DEPS_LIBS = @GTKDOC_DEPS_LIBS@ +GTKDOC_MKPDF = @GTKDOC_MKPDF@ +GTKDOC_REBASE = @GTKDOC_REBASE@ +HAVE_SCROLLKEEPER = @HAVE_SCROLLKEEPER@ +HELP_DIR = @HELP_DIR@ +HTML_DIR = @HTML_DIR@ +INSTALL = @INSTALL@ +INSTALL_DATA = @INSTALL_DATA@ +INSTALL_PROGRAM = @INSTALL_PROGRAM@ +INSTALL_SCRIPT = @INSTALL_SCRIPT@ +INSTALL_STRIP_PROGRAM = @INSTALL_STRIP_PROGRAM@ +INSTOBJEXT = @INSTOBJEXT@ +INTLLIBS = @INTLLIBS@ +INTLTOOL_EXTRACT = @INTLTOOL_EXTRACT@ +INTLTOOL_MERGE = @INTLTOOL_MERGE@ +INTLTOOL_PERL = @INTLTOOL_PERL@ +INTLTOOL_UPDATE = @INTLTOOL_UPDATE@ +INTLTOOL_V_MERGE = @INTLTOOL_V_MERGE@ +INTLTOOL_V_MERGE_OPTIONS = @INTLTOOL_V_MERGE_OPTIONS@ +INTLTOOL__v_MERGE_ = @INTLTOOL__v_MERGE_@ +INTLTOOL__v_MERGE_0 = @INTLTOOL__v_MERGE_0@ +INTL_MACOSX_LIBS = @INTL_MACOSX_LIBS@ +ISODATE = @ISODATE@ +LDFLAGS = @LDFLAGS@ +LIBCURL = @LIBCURL@ +LIBCURL_CPPFLAGS = @LIBCURL_CPPFLAGS@ +LIBGEOCLUE_CFLAGS = @LIBGEOCLUE_CFLAGS@ +LIBGEOCLUE_LIBS = @LIBGEOCLUE_LIBS@ +LIBICONV = @LIBICONV@ +LIBINTL = @LIBINTL@ +LIBOBJS = @LIBOBJS@ +LIBS = @LIBS@ +LIBZIP_CFLAGS = @LIBZIP_CFLAGS@ +LIBZIP_LIBS = @LIBZIP_LIBS@ +LN_S = @LN_S@ +LTLIBICONV = @LTLIBICONV@ +LTLIBINTL = @LTLIBINTL@ +LTLIBOBJS = @LTLIBOBJS@ +MAKEINFO = @MAKEINFO@ +MKDIR_P = @MKDIR_P@ +MKINSTALLDIRS = @MKINSTALLDIRS@ +MSGFMT = @MSGFMT@ +MSGFMT_015 = @MSGFMT_015@ +MSGFMT_OPTS = @MSGFMT_OPTS@ +MSGMERGE = @MSGMERGE@ +OBJEXT = @OBJEXT@ +OMF_DIR = @OMF_DIR@ +PACKAGE = @PACKAGE@ +PACKAGE_BUGREPORT = @PACKAGE_BUGREPORT@ +PACKAGE_CFLAGS = @PACKAGE_CFLAGS@ +PACKAGE_LIBS = @PACKAGE_LIBS@ +PACKAGE_NAME = @PACKAGE_NAME@ +PACKAGE_STRING = @PACKAGE_STRING@ +PACKAGE_TARNAME = @PACKAGE_TARNAME@ +PACKAGE_URL = @PACKAGE_URL@ +PACKAGE_VERSION = @PACKAGE_VERSION@ +PATH_SEPARATOR = @PATH_SEPARATOR@ +PKG_CONFIG = @PKG_CONFIG@ +PKG_CONFIG_LIBDIR = @PKG_CONFIG_LIBDIR@ +PKG_CONFIG_PATH = @PKG_CONFIG_PATH@ +POFILES = @POFILES@ +POSUB = @POSUB@ +PO_IN_DATADIR_FALSE = @PO_IN_DATADIR_FALSE@ +PO_IN_DATADIR_TRUE = @PO_IN_DATADIR_TRUE@ +RANLIB = @RANLIB@ +SET_MAKE = @SET_MAKE@ +SHELL = @SHELL@ +STRIP = @STRIP@ +USE_NLS = @USE_NLS@ +VERSION = @VERSION@ +XGETTEXT = @XGETTEXT@ +XGETTEXT_015 = @XGETTEXT_015@ +XGETTEXT_EXTRA_OPTIONS = @XGETTEXT_EXTRA_OPTIONS@ +XP = @XP@ +_libcurl_config = @_libcurl_config@ +abs_builddir = @abs_builddir@ +abs_srcdir = @abs_srcdir@ +abs_top_builddir = @abs_top_builddir@ +abs_top_srcdir = @abs_top_srcdir@ +ac_ct_CC = @ac_ct_CC@ +ac_ct_CXX = @ac_ct_CXX@ +am__include = @am__include@ +am__leading_dot = @am__leading_dot@ +am__quote = @am__quote@ +am__tar = @am__tar@ +am__untar = @am__untar@ +bindir = @bindir@ +build = @build@ +build_alias = @build_alias@ +build_cpu = @build_cpu@ +build_os = @build_os@ +build_vendor = @build_vendor@ +builddir = @builddir@ +datadir = @datadir@ +datarootdir = @datarootdir@ +docdir = @docdir@ +dvidir = @dvidir@ +exec_prefix = @exec_prefix@ +host = @host@ +host_alias = @host_alias@ +host_cpu = @host_cpu@ +host_os = @host_os@ +host_vendor = @host_vendor@ +htmldir = @htmldir@ +includedir = @includedir@ +infodir = @infodir@ +install_sh = @install_sh@ +intltool__v_merge_options_ = @intltool__v_merge_options_@ +intltool__v_merge_options_0 = @intltool__v_merge_options_0@ +libdir = @libdir@ +libexecdir = @libexecdir@ +localedir = @localedir@ +localstatedir = @localstatedir@ +mandir = @mandir@ +mkdir_p = @mkdir_p@ +oldincludedir = @oldincludedir@ +pdfdir = @pdfdir@ +prefix = @prefix@ +program_transform_name = @program_transform_name@ +psdir = @psdir@ +runstatedir = @runstatedir@ +sbindir = @sbindir@ +sharedstatedir = @sharedstatedir@ +srcdir = @srcdir@ +sysconfdir = @sysconfdir@ +target = @target@ +target_alias = @target_alias@ +target_cpu = @target_cpu@ +target_os = @target_os@ +target_vendor = @target_vendor@ +top_build_prefix = @top_build_prefix@ +top_builddir = @top_builddir@ +top_srcdir = @top_srcdir@ +EXTRA_DIST = \ + FileAssociation.nsh \ + viking-installer.nsi \ + langmacros.nsh + +SUBDIRS = pixmaps translations +all: all-recursive + +.SUFFIXES: +$(srcdir)/Makefile.in: $(srcdir)/Makefile.am $(am__configure_deps) + @for dep in $?; do \ + case '$(am__configure_deps)' in \ + *$$dep*) \ + ( cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh ) \ + && { if test -f $@; then exit 0; else break; fi; }; \ + exit 1;; \ + esac; \ + done; \ + echo ' cd $(top_srcdir) && $(AUTOMAKE) --gnu windows/installer/Makefile'; \ + $(am__cd) $(top_srcdir) && \ + $(AUTOMAKE) --gnu windows/installer/Makefile +Makefile: $(srcdir)/Makefile.in $(top_builddir)/config.status + @case '$?' in \ + *config.status*) \ + cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh;; \ + *) \ + echo ' cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__maybe_remake_depfiles)'; \ + cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__maybe_remake_depfiles);; \ + esac; + +$(top_builddir)/config.status: $(top_srcdir)/configure $(CONFIG_STATUS_DEPENDENCIES) + cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh + +$(top_srcdir)/configure: $(am__configure_deps) + cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh +$(ACLOCAL_M4): $(am__aclocal_m4_deps) + cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh +$(am__aclocal_m4_deps): + +# This directory's subdirectories are mostly independent; you can cd +# into them and run 'make' without going through this Makefile. +# To change the values of 'make' variables: instead of editing Makefiles, +# (1) if the variable is set in 'config.status', edit 'config.status' +# (which will cause the Makefiles to be regenerated when you run 'make'); +# (2) otherwise, pass the desired values on the 'make' command line. +$(am__recursive_targets): + @fail=; \ + if $(am__make_keepgoing); then \ + failcom='fail=yes'; \ + else \ + failcom='exit 1'; \ + fi; \ + dot_seen=no; \ + target=`echo $@ | sed s/-recursive//`; \ + case "$@" in \ + distclean-* | maintainer-clean-*) list='$(DIST_SUBDIRS)' ;; \ + *) list='$(SUBDIRS)' ;; \ + esac; \ + for subdir in $$list; do \ + echo "Making $$target in $$subdir"; \ + if test "$$subdir" = "."; then \ + dot_seen=yes; \ + local_target="$$target-am"; \ + else \ + local_target="$$target"; \ + fi; \ + ($(am__cd) $$subdir && $(MAKE) $(AM_MAKEFLAGS) $$local_target) \ + || eval $$failcom; \ + done; \ + if test "$$dot_seen" = "no"; then \ + $(MAKE) $(AM_MAKEFLAGS) "$$target-am" || exit 1; \ + fi; test -z "$$fail" + +ID: $(am__tagged_files) + $(am__define_uniq_tagged_files); mkid -fID $$unique +tags: tags-recursive +TAGS: tags + +tags-am: $(TAGS_DEPENDENCIES) $(am__tagged_files) + set x; \ + here=`pwd`; \ + if ($(ETAGS) --etags-include --version) >/dev/null 2>&1; then \ + include_option=--etags-include; \ + empty_fix=.; \ + else \ + include_option=--include; \ + empty_fix=; \ + fi; \ + list='$(SUBDIRS)'; for subdir in $$list; do \ + if test "$$subdir" = .; then :; else \ + test ! -f $$subdir/TAGS || \ + set "$$@" "$$include_option=$$here/$$subdir/TAGS"; \ + fi; \ + done; \ + $(am__define_uniq_tagged_files); \ + shift; \ + if test -z "$(ETAGS_ARGS)$$*$$unique"; then :; else \ + test -n "$$unique" || unique=$$empty_fix; \ + if test $$# -gt 0; then \ + $(ETAGS) $(ETAGSFLAGS) $(AM_ETAGSFLAGS) $(ETAGS_ARGS) \ + "$$@" $$unique; \ + else \ + $(ETAGS) $(ETAGSFLAGS) $(AM_ETAGSFLAGS) $(ETAGS_ARGS) \ + $$unique; \ + fi; \ + fi +ctags: ctags-recursive + +CTAGS: ctags +ctags-am: $(TAGS_DEPENDENCIES) $(am__tagged_files) + $(am__define_uniq_tagged_files); \ + test -z "$(CTAGS_ARGS)$$unique" \ + || $(CTAGS) $(CTAGSFLAGS) $(AM_CTAGSFLAGS) $(CTAGS_ARGS) \ + $$unique + +GTAGS: + here=`$(am__cd) $(top_builddir) && pwd` \ + && $(am__cd) $(top_srcdir) \ + && gtags -i $(GTAGS_ARGS) "$$here" +cscopelist: cscopelist-recursive + +cscopelist-am: $(am__tagged_files) + list='$(am__tagged_files)'; \ + case "$(srcdir)" in \ + [\\/]* | ?:[\\/]*) sdir="$(srcdir)" ;; \ + *) sdir=$(subdir)/$(srcdir) ;; \ + esac; \ + for i in $$list; do \ + if test -f "$$i"; then \ + echo "$(subdir)/$$i"; \ + else \ + echo "$$sdir/$$i"; \ + fi; \ + done >> $(top_builddir)/cscope.files + +distclean-tags: + -rm -f TAGS ID GTAGS GRTAGS GSYMS GPATH tags + +distdir: $(BUILT_SOURCES) + $(MAKE) $(AM_MAKEFLAGS) distdir-am + +distdir-am: $(DISTFILES) + @srcdirstrip=`echo "$(srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \ + topsrcdirstrip=`echo "$(top_srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \ + list='$(DISTFILES)'; \ + dist_files=`for file in $$list; do echo $$file; done | \ + sed -e "s|^$$srcdirstrip/||;t" \ + -e "s|^$$topsrcdirstrip/|$(top_builddir)/|;t"`; \ + case $$dist_files in \ + */*) $(MKDIR_P) `echo "$$dist_files" | \ + sed '/\//!d;s|^|$(distdir)/|;s,/[^/]*$$,,' | \ + sort -u` ;; \ + esac; \ + for file in $$dist_files; do \ + if test -f $$file || test -d $$file; then d=.; else d=$(srcdir); fi; \ + if test -d $$d/$$file; then \ + dir=`echo "/$$file" | sed -e 's,/[^/]*$$,,'`; \ + if test -d "$(distdir)/$$file"; then \ + find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \ + fi; \ + if test -d $(srcdir)/$$file && test $$d != $(srcdir); then \ + cp -fpR $(srcdir)/$$file "$(distdir)$$dir" || exit 1; \ + find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \ + fi; \ + cp -fpR $$d/$$file "$(distdir)$$dir" || exit 1; \ + else \ + test -f "$(distdir)/$$file" \ + || cp -p $$d/$$file "$(distdir)/$$file" \ + || exit 1; \ + fi; \ + done + @list='$(DIST_SUBDIRS)'; for subdir in $$list; do \ + if test "$$subdir" = .; then :; else \ + $(am__make_dryrun) \ + || test -d "$(distdir)/$$subdir" \ + || $(MKDIR_P) "$(distdir)/$$subdir" \ + || exit 1; \ + dir1=$$subdir; dir2="$(distdir)/$$subdir"; \ + $(am__relativize); \ + new_distdir=$$reldir; \ + dir1=$$subdir; dir2="$(top_distdir)"; \ + $(am__relativize); \ + new_top_distdir=$$reldir; \ + echo " (cd $$subdir && $(MAKE) $(AM_MAKEFLAGS) top_distdir="$$new_top_distdir" distdir="$$new_distdir" \\"; \ + echo " am__remove_distdir=: am__skip_length_check=: am__skip_mode_fix=: distdir)"; \ + ($(am__cd) $$subdir && \ + $(MAKE) $(AM_MAKEFLAGS) \ + top_distdir="$$new_top_distdir" \ + distdir="$$new_distdir" \ + am__remove_distdir=: \ + am__skip_length_check=: \ + am__skip_mode_fix=: \ + distdir) \ + || exit 1; \ + fi; \ + done +check-am: all-am +check: check-recursive +all-am: Makefile +installdirs: installdirs-recursive +installdirs-am: +install: install-recursive +install-exec: install-exec-recursive +install-data: install-data-recursive +uninstall: uninstall-recursive + +install-am: all-am + @$(MAKE) $(AM_MAKEFLAGS) install-exec-am install-data-am + +installcheck: installcheck-recursive +install-strip: + if test -z '$(STRIP)'; then \ + $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \ + install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \ + install; \ + else \ + $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \ + install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \ + "INSTALL_PROGRAM_ENV=STRIPPROG='$(STRIP)'" install; \ + fi +mostlyclean-generic: + +clean-generic: + +distclean-generic: + -test -z "$(CONFIG_CLEAN_FILES)" || rm -f $(CONFIG_CLEAN_FILES) + -test . = "$(srcdir)" || test -z "$(CONFIG_CLEAN_VPATH_FILES)" || rm -f $(CONFIG_CLEAN_VPATH_FILES) + +maintainer-clean-generic: + @echo "This command is intended for maintainers to use" + @echo "it deletes files that may require special tools to rebuild." +clean: clean-recursive + +clean-am: clean-generic mostlyclean-am + +distclean: distclean-recursive + -rm -f Makefile +distclean-am: clean-am distclean-generic distclean-tags + +dvi: dvi-recursive + +dvi-am: + +html: html-recursive + +html-am: + +info: info-recursive + +info-am: + +install-data-am: + +install-dvi: install-dvi-recursive + +install-dvi-am: + +install-exec-am: + +install-html: install-html-recursive + +install-html-am: + +install-info: install-info-recursive + +install-info-am: + +install-man: + +install-pdf: install-pdf-recursive + +install-pdf-am: + +install-ps: install-ps-recursive + +install-ps-am: + +installcheck-am: + +maintainer-clean: maintainer-clean-recursive + -rm -f Makefile +maintainer-clean-am: distclean-am maintainer-clean-generic + +mostlyclean: mostlyclean-recursive + +mostlyclean-am: mostlyclean-generic + +pdf: pdf-recursive + +pdf-am: + +ps: ps-recursive + +ps-am: + +uninstall-am: + +.MAKE: $(am__recursive_targets) install-am install-strip + +.PHONY: $(am__recursive_targets) CTAGS GTAGS TAGS all all-am check \ + check-am clean clean-generic cscopelist-am ctags ctags-am \ + distclean distclean-generic distclean-tags distdir dvi dvi-am \ + html html-am info info-am install install-am install-data \ + install-data-am install-dvi install-dvi-am install-exec \ + install-exec-am install-html install-html-am install-info \ + install-info-am install-man install-pdf install-pdf-am \ + install-ps install-ps-am install-strip installcheck \ + installcheck-am installdirs installdirs-am maintainer-clean \ + maintainer-clean-generic mostlyclean mostlyclean-generic pdf \ + pdf-am ps ps-am tags tags-am uninstall uninstall-am + +.PRECIOUS: Makefile + + +# Tell versions [3.59,3.63) of GNU make to not export all variables. +# Otherwise a system limit (for SysV at least) may be exceeded. +.NOEXPORT: diff --git a/windows/installer/langmacros.nsh b/windows/installer/langmacros.nsh new file mode 100644 index 0000000..d002900 --- /dev/null +++ b/windows/installer/langmacros.nsh @@ -0,0 +1,72 @@ +;; +;; Windows Viking NSIS installer language macros +;; Based on Win32 Pidgin installer + +!macro VIKING_MACRO_DEFAULT_STRING LABEL VALUE + !ifndef "${LABEL}" + !define "${LABEL}" "${VALUE}" + !ifdef INSERT_DEFAULT + !warning "${LANG} lang file missing ${LABEL}, using default..." + !endif + !endif +!macroend + +!macro VIKING_MACRO_LANGSTRING_INSERT LABEL LANG + LangString "${LABEL}" "${LANG_${LANG}}" "${${LABEL}}" + !undef "${LABEL}" +!macroend + +!macro VIKING_MACRO_LANGUAGEFILE_BEGIN LANG + !define CUR_LANG "${LANG}" +!macroend + +!macro VIKING_MACRO_LANGUAGEFILE_END + !define INSERT_DEFAULT + !include "${VIKING_DEFAULT_LANGFILE}" + !undef INSERT_DEFAULT + + ; Viking Language file Version 3 + ; String labels should match those from the default language file. + + ; Startup checks + !insertmacro VIKING_MACRO_LANGSTRING_INSERT INSTALLER_IS_RUNNING ${CUR_LANG} + !insertmacro VIKING_MACRO_LANGSTRING_INSERT VIKING_IS_RUNNING ${CUR_LANG} + + ; License Page + !insertmacro VIKING_MACRO_LANGSTRING_INSERT VIKING_LICENSE_BUTTON ${CUR_LANG} + !insertmacro VIKING_MACRO_LANGSTRING_INSERT VIKING_LICENSE_BOTTOM_TEXT ${CUR_LANG} + + ; Components Page + !insertmacro VIKING_MACRO_LANGSTRING_INSERT VIKING_SECTION_TITLE ${CUR_LANG} + !insertmacro VIKING_MACRO_LANGSTRING_INSERT VIKING_SHORTCUTS_SECTION_TITLE ${CUR_LANG} + !insertmacro VIKING_MACRO_LANGSTRING_INSERT VIKING_DESKTOP_SHORTCUT_SECTION_TITLE ${CUR_LANG} + !insertmacro VIKING_MACRO_LANGSTRING_INSERT VIKING_STARTMENU_SHORTCUT_SECTION_TITLE ${CUR_LANG} + !insertmacro VIKING_MACRO_LANGSTRING_INSERT VIKING_FILE_ASSOCIATION_SECTION_TITLE ${CUR_LANG} + !insertmacro VIKING_MACRO_LANGSTRING_INSERT VIKING_GPSBABEL_SECTION_TITLE ${CUR_LANG} + !insertmacro VIKING_MACRO_LANGSTRING_INSERT VIKING_SECTION_DESCRIPTION ${CUR_LANG} + !insertmacro VIKING_MACRO_LANGSTRING_INSERT VIKING_SHORTCUTS_SECTION_DESCRIPTION ${CUR_LANG} + !insertmacro VIKING_MACRO_LANGSTRING_INSERT VIKING_DESKTOP_SHORTCUT_DESC ${CUR_LANG} + !insertmacro VIKING_MACRO_LANGSTRING_INSERT VIKING_STARTMENU_SHORTCUT_DESC ${CUR_LANG} + !insertmacro VIKING_MACRO_LANGSTRING_INSERT VIKING_FILE_ASSOCIATION_DESC ${CUR_LANG} + !insertmacro VIKING_MACRO_LANGSTRING_INSERT VIKING_INSTALL_GPSBABEL_DESC ${CUR_LANG} + + ; Installer Finish Page + !insertmacro VIKING_MACRO_LANGSTRING_INSERT VIKING_FINISH_VISIT_WEB_SITE ${CUR_LANG} + + ; Viking Section Prompts and Texts + !insertmacro VIKING_MACRO_LANGSTRING_INSERT VIKING_PROMPT_CONTINUE_WITHOUT_UNINSTALL ${CUR_LANG} + + ; Uninstall Section Prompts + !insertmacro VIKING_MACRO_LANGSTRING_INSERT un.VIKING_UNINSTALL_ERROR_1 ${CUR_LANG} + !insertmacro VIKING_MACRO_LANGSTRING_INSERT un.VIKING_UNINSTALL_ERROR_2 ${CUR_LANG} + + !insertmacro VIKING_MACRO_LANGSTRING_INSERT VIKING_UNINSTALL_COMMENTS ${CUR_LANG} + + !undef CUR_LANG +!macroend + +!macro VIKING_MACRO_INCLUDE_LANGFILE LANG FILE + !insertmacro VIKING_MACRO_LANGUAGEFILE_BEGIN "${LANG}" + !include "${FILE}" + !insertmacro VIKING_MACRO_LANGUAGEFILE_END +!macroend diff --git a/windows/installer/pixmaps/Makefile.am b/windows/installer/pixmaps/Makefile.am new file mode 100644 index 0000000..6fd999e --- /dev/null +++ b/windows/installer/pixmaps/Makefile.am @@ -0,0 +1,4 @@ + +EXTRA_DIST = \ + viking_icon.ico \ + viking_icon.rc diff --git a/windows/installer/pixmaps/Makefile.in b/windows/installer/pixmaps/Makefile.in new file mode 100644 index 0000000..249df8c --- /dev/null +++ b/windows/installer/pixmaps/Makefile.in @@ -0,0 +1,502 @@ +# Makefile.in generated by automake 1.16.1 from Makefile.am. +# @configure_input@ + +# Copyright (C) 1994-2018 Free Software Foundation, Inc. + +# This Makefile.in is free software; the Free Software Foundation +# gives unlimited permission to copy and/or distribute it, +# with or without modifications, as long as this notice is preserved. + +# This program is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY, to the extent permitted by law; without +# even the implied warranty of MERCHANTABILITY or FITNESS FOR A +# PARTICULAR PURPOSE. + +@SET_MAKE@ +VPATH = @srcdir@ +am__is_gnu_make = { \ + if test -z '$(MAKELEVEL)'; then \ + false; \ + elif test -n '$(MAKE_HOST)'; then \ + true; \ + elif test -n '$(MAKE_VERSION)' && test -n '$(CURDIR)'; then \ + true; \ + else \ + false; \ + fi; \ +} +am__make_running_with_option = \ + case $${target_option-} in \ + ?) ;; \ + *) echo "am__make_running_with_option: internal error: invalid" \ + "target option '$${target_option-}' specified" >&2; \ + exit 1;; \ + esac; \ + has_opt=no; \ + sane_makeflags=$$MAKEFLAGS; \ + if $(am__is_gnu_make); then \ + sane_makeflags=$$MFLAGS; \ + else \ + case $$MAKEFLAGS in \ + *\\[\ \ ]*) \ + bs=\\; \ + sane_makeflags=`printf '%s\n' "$$MAKEFLAGS" \ + | sed "s/$$bs$$bs[$$bs $$bs ]*//g"`;; \ + esac; \ + fi; \ + skip_next=no; \ + strip_trailopt () \ + { \ + flg=`printf '%s\n' "$$flg" | sed "s/$$1.*$$//"`; \ + }; \ + for flg in $$sane_makeflags; do \ + test $$skip_next = yes && { skip_next=no; continue; }; \ + case $$flg in \ + *=*|--*) continue;; \ + -*I) strip_trailopt 'I'; skip_next=yes;; \ + -*I?*) strip_trailopt 'I';; \ + -*O) strip_trailopt 'O'; skip_next=yes;; \ + -*O?*) strip_trailopt 'O';; \ + -*l) strip_trailopt 'l'; skip_next=yes;; \ + -*l?*) strip_trailopt 'l';; \ + -[dEDm]) skip_next=yes;; \ + -[JT]) skip_next=yes;; \ + esac; \ + case $$flg in \ + *$$target_option*) has_opt=yes; break;; \ + esac; \ + done; \ + test $$has_opt = yes +am__make_dryrun = (target_option=n; $(am__make_running_with_option)) +am__make_keepgoing = (target_option=k; $(am__make_running_with_option)) +pkgdatadir = $(datadir)/@PACKAGE@ +pkgincludedir = $(includedir)/@PACKAGE@ +pkglibdir = $(libdir)/@PACKAGE@ +pkglibexecdir = $(libexecdir)/@PACKAGE@ +am__cd = CDPATH="$${ZSH_VERSION+.}$(PATH_SEPARATOR)" && cd +install_sh_DATA = $(install_sh) -c -m 644 +install_sh_PROGRAM = $(install_sh) -c +install_sh_SCRIPT = $(install_sh) -c +INSTALL_HEADER = $(INSTALL_DATA) +transform = $(program_transform_name) +NORMAL_INSTALL = : +PRE_INSTALL = : +POST_INSTALL = : +NORMAL_UNINSTALL = : +PRE_UNINSTALL = : +POST_UNINSTALL = : +build_triplet = @build@ +host_triplet = @host@ +target_triplet = @target@ +subdir = windows/installer/pixmaps +ACLOCAL_M4 = $(top_srcdir)/aclocal.m4 +am__aclocal_m4_deps = $(top_srcdir)/m4/expat.m4 \ + $(top_srcdir)/m4/gettext.m4 $(top_srcdir)/m4/iconv.m4 \ + $(top_srcdir)/m4/intlmacosx.m4 $(top_srcdir)/m4/lib-ld.m4 \ + $(top_srcdir)/m4/lib-link.m4 $(top_srcdir)/m4/lib-prefix.m4 \ + $(top_srcdir)/m4/libcurl.m4 $(top_srcdir)/m4/nls.m4 \ + $(top_srcdir)/m4/po.m4 $(top_srcdir)/m4/progtest.m4 \ + $(top_srcdir)/configure.ac +am__configure_deps = $(am__aclocal_m4_deps) $(CONFIGURE_DEPENDENCIES) \ + $(ACLOCAL_M4) +DIST_COMMON = $(srcdir)/Makefile.am $(am__DIST_COMMON) +mkinstalldirs = $(SHELL) $(top_srcdir)/mkinstalldirs +CONFIG_HEADER = $(top_builddir)/src/config.h +CONFIG_CLEAN_FILES = +CONFIG_CLEAN_VPATH_FILES = +AM_V_P = $(am__v_P_@AM_V@) +am__v_P_ = $(am__v_P_@AM_DEFAULT_V@) +am__v_P_0 = false +am__v_P_1 = : +AM_V_GEN = $(am__v_GEN_@AM_V@) +am__v_GEN_ = $(am__v_GEN_@AM_DEFAULT_V@) +am__v_GEN_0 = @echo " GEN " $@; +am__v_GEN_1 = +AM_V_at = $(am__v_at_@AM_V@) +am__v_at_ = $(am__v_at_@AM_DEFAULT_V@) +am__v_at_0 = @ +am__v_at_1 = +SOURCES = +DIST_SOURCES = +am__can_run_installinfo = \ + case $$AM_UPDATE_INFO_DIR in \ + n|no|NO) false;; \ + *) (install-info --version) >/dev/null 2>&1;; \ + esac +am__tagged_files = $(HEADERS) $(SOURCES) $(TAGS_FILES) $(LISP) +am__DIST_COMMON = $(srcdir)/Makefile.in $(top_srcdir)/mkinstalldirs +DISTFILES = $(DIST_COMMON) $(DIST_SOURCES) $(TEXINFOS) $(EXTRA_DIST) +ACLOCAL = @ACLOCAL@ +ACLOCAL_AMFLAGS = @ACLOCAL_AMFLAGS@ +ALL_LINGUAS = @ALL_LINGUAS@ +AMTAR = @AMTAR@ +AM_DEFAULT_VERBOSITY = @AM_DEFAULT_VERBOSITY@ +AUTOCONF = @AUTOCONF@ +AUTOHEADER = @AUTOHEADER@ +AUTOMAKE = @AUTOMAKE@ +AWK = @AWK@ +CATALOGS = @CATALOGS@ +CATOBJEXT = @CATOBJEXT@ +CC = @CC@ +CCDEPMODE = @CCDEPMODE@ +CFLAGS = @CFLAGS@ +CONFIG_STATUS_DEPENDENCIES = @CONFIG_STATUS_DEPENDENCIES@ +CPP = @CPP@ +CPPFLAGS = @CPPFLAGS@ +CXX = @CXX@ +CXXCPP = @CXXCPP@ +CXXDEPMODE = @CXXDEPMODE@ +CXXFLAGS = @CXXFLAGS@ +CYGPATH_W = @CYGPATH_W@ +DATADIRNAME = @DATADIRNAME@ +DB2MAN_XSL = @DB2MAN_XSL@ +DEFS = @DEFS@ +DEPDIR = @DEPDIR@ +DISTCHECK_CONFIGURE_FLAGS = @DISTCHECK_CONFIGURE_FLAGS@ +DOC_USER_FORMATS = @DOC_USER_FORMATS@ +ECHO_C = @ECHO_C@ +ECHO_N = @ECHO_N@ +ECHO_T = @ECHO_T@ +EGREP = @EGREP@ +EXEEXT = @EXEEXT@ +EXPAT_CFLAGS = @EXPAT_CFLAGS@ +EXPAT_LIBS = @EXPAT_LIBS@ +GDK_PIXBUF_CSOURCE = @GDK_PIXBUF_CSOURCE@ +GETTEXT_MACRO_VERSION = @GETTEXT_MACRO_VERSION@ +GETTEXT_PACKAGE = @GETTEXT_PACKAGE@ +GLIB_MKENUMS = @GLIB_MKENUMS@ +GMOFILES = @GMOFILES@ +GMSGFMT = @GMSGFMT@ +GMSGFMT_015 = @GMSGFMT_015@ +GREP = @GREP@ +GTKDOC_CHECK = @GTKDOC_CHECK@ +GTKDOC_CHECK_PATH = @GTKDOC_CHECK_PATH@ +GTKDOC_DEPS_CFLAGS = @GTKDOC_DEPS_CFLAGS@ +GTKDOC_DEPS_LIBS = @GTKDOC_DEPS_LIBS@ +GTKDOC_MKPDF = @GTKDOC_MKPDF@ +GTKDOC_REBASE = @GTKDOC_REBASE@ +HAVE_SCROLLKEEPER = @HAVE_SCROLLKEEPER@ +HELP_DIR = @HELP_DIR@ +HTML_DIR = @HTML_DIR@ +INSTALL = @INSTALL@ +INSTALL_DATA = @INSTALL_DATA@ +INSTALL_PROGRAM = @INSTALL_PROGRAM@ +INSTALL_SCRIPT = @INSTALL_SCRIPT@ +INSTALL_STRIP_PROGRAM = @INSTALL_STRIP_PROGRAM@ +INSTOBJEXT = @INSTOBJEXT@ +INTLLIBS = @INTLLIBS@ +INTLTOOL_EXTRACT = @INTLTOOL_EXTRACT@ +INTLTOOL_MERGE = @INTLTOOL_MERGE@ +INTLTOOL_PERL = @INTLTOOL_PERL@ +INTLTOOL_UPDATE = @INTLTOOL_UPDATE@ +INTLTOOL_V_MERGE = @INTLTOOL_V_MERGE@ +INTLTOOL_V_MERGE_OPTIONS = @INTLTOOL_V_MERGE_OPTIONS@ +INTLTOOL__v_MERGE_ = @INTLTOOL__v_MERGE_@ +INTLTOOL__v_MERGE_0 = @INTLTOOL__v_MERGE_0@ +INTL_MACOSX_LIBS = @INTL_MACOSX_LIBS@ +ISODATE = @ISODATE@ +LDFLAGS = @LDFLAGS@ +LIBCURL = @LIBCURL@ +LIBCURL_CPPFLAGS = @LIBCURL_CPPFLAGS@ +LIBGEOCLUE_CFLAGS = @LIBGEOCLUE_CFLAGS@ +LIBGEOCLUE_LIBS = @LIBGEOCLUE_LIBS@ +LIBICONV = @LIBICONV@ +LIBINTL = @LIBINTL@ +LIBOBJS = @LIBOBJS@ +LIBS = @LIBS@ +LIBZIP_CFLAGS = @LIBZIP_CFLAGS@ +LIBZIP_LIBS = @LIBZIP_LIBS@ +LN_S = @LN_S@ +LTLIBICONV = @LTLIBICONV@ +LTLIBINTL = @LTLIBINTL@ +LTLIBOBJS = @LTLIBOBJS@ +MAKEINFO = @MAKEINFO@ +MKDIR_P = @MKDIR_P@ +MKINSTALLDIRS = @MKINSTALLDIRS@ +MSGFMT = @MSGFMT@ +MSGFMT_015 = @MSGFMT_015@ +MSGFMT_OPTS = @MSGFMT_OPTS@ +MSGMERGE = @MSGMERGE@ +OBJEXT = @OBJEXT@ +OMF_DIR = @OMF_DIR@ +PACKAGE = @PACKAGE@ +PACKAGE_BUGREPORT = @PACKAGE_BUGREPORT@ +PACKAGE_CFLAGS = @PACKAGE_CFLAGS@ +PACKAGE_LIBS = @PACKAGE_LIBS@ +PACKAGE_NAME = @PACKAGE_NAME@ +PACKAGE_STRING = @PACKAGE_STRING@ +PACKAGE_TARNAME = @PACKAGE_TARNAME@ +PACKAGE_URL = @PACKAGE_URL@ +PACKAGE_VERSION = @PACKAGE_VERSION@ +PATH_SEPARATOR = @PATH_SEPARATOR@ +PKG_CONFIG = @PKG_CONFIG@ +PKG_CONFIG_LIBDIR = @PKG_CONFIG_LIBDIR@ +PKG_CONFIG_PATH = @PKG_CONFIG_PATH@ +POFILES = @POFILES@ +POSUB = @POSUB@ +PO_IN_DATADIR_FALSE = @PO_IN_DATADIR_FALSE@ +PO_IN_DATADIR_TRUE = @PO_IN_DATADIR_TRUE@ +RANLIB = @RANLIB@ +SET_MAKE = @SET_MAKE@ +SHELL = @SHELL@ +STRIP = @STRIP@ +USE_NLS = @USE_NLS@ +VERSION = @VERSION@ +XGETTEXT = @XGETTEXT@ +XGETTEXT_015 = @XGETTEXT_015@ +XGETTEXT_EXTRA_OPTIONS = @XGETTEXT_EXTRA_OPTIONS@ +XP = @XP@ +_libcurl_config = @_libcurl_config@ +abs_builddir = @abs_builddir@ +abs_srcdir = @abs_srcdir@ +abs_top_builddir = @abs_top_builddir@ +abs_top_srcdir = @abs_top_srcdir@ +ac_ct_CC = @ac_ct_CC@ +ac_ct_CXX = @ac_ct_CXX@ +am__include = @am__include@ +am__leading_dot = @am__leading_dot@ +am__quote = @am__quote@ +am__tar = @am__tar@ +am__untar = @am__untar@ +bindir = @bindir@ +build = @build@ +build_alias = @build_alias@ +build_cpu = @build_cpu@ +build_os = @build_os@ +build_vendor = @build_vendor@ +builddir = @builddir@ +datadir = @datadir@ +datarootdir = @datarootdir@ +docdir = @docdir@ +dvidir = @dvidir@ +exec_prefix = @exec_prefix@ +host = @host@ +host_alias = @host_alias@ +host_cpu = @host_cpu@ +host_os = @host_os@ +host_vendor = @host_vendor@ +htmldir = @htmldir@ +includedir = @includedir@ +infodir = @infodir@ +install_sh = @install_sh@ +intltool__v_merge_options_ = @intltool__v_merge_options_@ +intltool__v_merge_options_0 = @intltool__v_merge_options_0@ +libdir = @libdir@ +libexecdir = @libexecdir@ +localedir = @localedir@ +localstatedir = @localstatedir@ +mandir = @mandir@ +mkdir_p = @mkdir_p@ +oldincludedir = @oldincludedir@ +pdfdir = @pdfdir@ +prefix = @prefix@ +program_transform_name = @program_transform_name@ +psdir = @psdir@ +runstatedir = @runstatedir@ +sbindir = @sbindir@ +sharedstatedir = @sharedstatedir@ +srcdir = @srcdir@ +sysconfdir = @sysconfdir@ +target = @target@ +target_alias = @target_alias@ +target_cpu = @target_cpu@ +target_os = @target_os@ +target_vendor = @target_vendor@ +top_build_prefix = @top_build_prefix@ +top_builddir = @top_builddir@ +top_srcdir = @top_srcdir@ +EXTRA_DIST = \ + viking_icon.ico \ + viking_icon.rc + +all: all-am + +.SUFFIXES: +$(srcdir)/Makefile.in: $(srcdir)/Makefile.am $(am__configure_deps) + @for dep in $?; do \ + case '$(am__configure_deps)' in \ + *$$dep*) \ + ( cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh ) \ + && { if test -f $@; then exit 0; else break; fi; }; \ + exit 1;; \ + esac; \ + done; \ + echo ' cd $(top_srcdir) && $(AUTOMAKE) --gnu windows/installer/pixmaps/Makefile'; \ + $(am__cd) $(top_srcdir) && \ + $(AUTOMAKE) --gnu windows/installer/pixmaps/Makefile +Makefile: $(srcdir)/Makefile.in $(top_builddir)/config.status + @case '$?' in \ + *config.status*) \ + cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh;; \ + *) \ + echo ' cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__maybe_remake_depfiles)'; \ + cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__maybe_remake_depfiles);; \ + esac; + +$(top_builddir)/config.status: $(top_srcdir)/configure $(CONFIG_STATUS_DEPENDENCIES) + cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh + +$(top_srcdir)/configure: $(am__configure_deps) + cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh +$(ACLOCAL_M4): $(am__aclocal_m4_deps) + cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh +$(am__aclocal_m4_deps): +tags TAGS: + +ctags CTAGS: + +cscope cscopelist: + + +distdir: $(BUILT_SOURCES) + $(MAKE) $(AM_MAKEFLAGS) distdir-am + +distdir-am: $(DISTFILES) + @srcdirstrip=`echo "$(srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \ + topsrcdirstrip=`echo "$(top_srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \ + list='$(DISTFILES)'; \ + dist_files=`for file in $$list; do echo $$file; done | \ + sed -e "s|^$$srcdirstrip/||;t" \ + -e "s|^$$topsrcdirstrip/|$(top_builddir)/|;t"`; \ + case $$dist_files in \ + */*) $(MKDIR_P) `echo "$$dist_files" | \ + sed '/\//!d;s|^|$(distdir)/|;s,/[^/]*$$,,' | \ + sort -u` ;; \ + esac; \ + for file in $$dist_files; do \ + if test -f $$file || test -d $$file; then d=.; else d=$(srcdir); fi; \ + if test -d $$d/$$file; then \ + dir=`echo "/$$file" | sed -e 's,/[^/]*$$,,'`; \ + if test -d "$(distdir)/$$file"; then \ + find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \ + fi; \ + if test -d $(srcdir)/$$file && test $$d != $(srcdir); then \ + cp -fpR $(srcdir)/$$file "$(distdir)$$dir" || exit 1; \ + find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \ + fi; \ + cp -fpR $$d/$$file "$(distdir)$$dir" || exit 1; \ + else \ + test -f "$(distdir)/$$file" \ + || cp -p $$d/$$file "$(distdir)/$$file" \ + || exit 1; \ + fi; \ + done +check-am: all-am +check: check-am +all-am: Makefile +installdirs: +install: install-am +install-exec: install-exec-am +install-data: install-data-am +uninstall: uninstall-am + +install-am: all-am + @$(MAKE) $(AM_MAKEFLAGS) install-exec-am install-data-am + +installcheck: installcheck-am +install-strip: + if test -z '$(STRIP)'; then \ + $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \ + install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \ + install; \ + else \ + $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \ + install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \ + "INSTALL_PROGRAM_ENV=STRIPPROG='$(STRIP)'" install; \ + fi +mostlyclean-generic: + +clean-generic: + +distclean-generic: + -test -z "$(CONFIG_CLEAN_FILES)" || rm -f $(CONFIG_CLEAN_FILES) + -test . = "$(srcdir)" || test -z "$(CONFIG_CLEAN_VPATH_FILES)" || rm -f $(CONFIG_CLEAN_VPATH_FILES) + +maintainer-clean-generic: + @echo "This command is intended for maintainers to use" + @echo "it deletes files that may require special tools to rebuild." +clean: clean-am + +clean-am: clean-generic mostlyclean-am + +distclean: distclean-am + -rm -f Makefile +distclean-am: clean-am distclean-generic + +dvi: dvi-am + +dvi-am: + +html: html-am + +html-am: + +info: info-am + +info-am: + +install-data-am: + +install-dvi: install-dvi-am + +install-dvi-am: + +install-exec-am: + +install-html: install-html-am + +install-html-am: + +install-info: install-info-am + +install-info-am: + +install-man: + +install-pdf: install-pdf-am + +install-pdf-am: + +install-ps: install-ps-am + +install-ps-am: + +installcheck-am: + +maintainer-clean: maintainer-clean-am + -rm -f Makefile +maintainer-clean-am: distclean-am maintainer-clean-generic + +mostlyclean: mostlyclean-am + +mostlyclean-am: mostlyclean-generic + +pdf: pdf-am + +pdf-am: + +ps: ps-am + +ps-am: + +uninstall-am: + +.MAKE: install-am install-strip + +.PHONY: all all-am check check-am clean clean-generic cscopelist-am \ + ctags-am distclean distclean-generic distdir dvi dvi-am html \ + html-am info info-am install install-am install-data \ + install-data-am install-dvi install-dvi-am install-exec \ + install-exec-am install-html install-html-am install-info \ + install-info-am install-man install-pdf install-pdf-am \ + install-ps install-ps-am install-strip installcheck \ + installcheck-am installdirs maintainer-clean \ + maintainer-clean-generic mostlyclean mostlyclean-generic pdf \ + pdf-am ps ps-am tags-am uninstall uninstall-am + +.PRECIOUS: Makefile + + +# Tell versions [3.59,3.63) of GNU make to not export all variables. +# Otherwise a system limit (for SysV at least) may be exceeded. +.NOEXPORT: diff --git a/windows/installer/pixmaps/viking_icon.ico b/windows/installer/pixmaps/viking_icon.ico new file mode 100644 index 0000000..50e8b00 Binary files /dev/null and b/windows/installer/pixmaps/viking_icon.ico differ diff --git a/windows/installer/pixmaps/viking_icon.rc b/windows/installer/pixmaps/viking_icon.rc new file mode 100644 index 0000000..e45f1ea --- /dev/null +++ b/windows/installer/pixmaps/viking_icon.rc @@ -0,0 +1 @@ +100 ICON "viking_icon.ico" diff --git a/windows/installer/translations/Makefile.am b/windows/installer/translations/Makefile.am new file mode 100644 index 0000000..1537dfd --- /dev/null +++ b/windows/installer/translations/Makefile.am @@ -0,0 +1,5 @@ + +EXTRA_DIST = \ + english.nsh \ + french.nsh \ + spanish.nsh diff --git a/windows/installer/translations/Makefile.in b/windows/installer/translations/Makefile.in new file mode 100644 index 0000000..c0a4e72 --- /dev/null +++ b/windows/installer/translations/Makefile.in @@ -0,0 +1,503 @@ +# Makefile.in generated by automake 1.16.1 from Makefile.am. +# @configure_input@ + +# Copyright (C) 1994-2018 Free Software Foundation, Inc. + +# This Makefile.in is free software; the Free Software Foundation +# gives unlimited permission to copy and/or distribute it, +# with or without modifications, as long as this notice is preserved. + +# This program is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY, to the extent permitted by law; without +# even the implied warranty of MERCHANTABILITY or FITNESS FOR A +# PARTICULAR PURPOSE. + +@SET_MAKE@ +VPATH = @srcdir@ +am__is_gnu_make = { \ + if test -z '$(MAKELEVEL)'; then \ + false; \ + elif test -n '$(MAKE_HOST)'; then \ + true; \ + elif test -n '$(MAKE_VERSION)' && test -n '$(CURDIR)'; then \ + true; \ + else \ + false; \ + fi; \ +} +am__make_running_with_option = \ + case $${target_option-} in \ + ?) ;; \ + *) echo "am__make_running_with_option: internal error: invalid" \ + "target option '$${target_option-}' specified" >&2; \ + exit 1;; \ + esac; \ + has_opt=no; \ + sane_makeflags=$$MAKEFLAGS; \ + if $(am__is_gnu_make); then \ + sane_makeflags=$$MFLAGS; \ + else \ + case $$MAKEFLAGS in \ + *\\[\ \ ]*) \ + bs=\\; \ + sane_makeflags=`printf '%s\n' "$$MAKEFLAGS" \ + | sed "s/$$bs$$bs[$$bs $$bs ]*//g"`;; \ + esac; \ + fi; \ + skip_next=no; \ + strip_trailopt () \ + { \ + flg=`printf '%s\n' "$$flg" | sed "s/$$1.*$$//"`; \ + }; \ + for flg in $$sane_makeflags; do \ + test $$skip_next = yes && { skip_next=no; continue; }; \ + case $$flg in \ + *=*|--*) continue;; \ + -*I) strip_trailopt 'I'; skip_next=yes;; \ + -*I?*) strip_trailopt 'I';; \ + -*O) strip_trailopt 'O'; skip_next=yes;; \ + -*O?*) strip_trailopt 'O';; \ + -*l) strip_trailopt 'l'; skip_next=yes;; \ + -*l?*) strip_trailopt 'l';; \ + -[dEDm]) skip_next=yes;; \ + -[JT]) skip_next=yes;; \ + esac; \ + case $$flg in \ + *$$target_option*) has_opt=yes; break;; \ + esac; \ + done; \ + test $$has_opt = yes +am__make_dryrun = (target_option=n; $(am__make_running_with_option)) +am__make_keepgoing = (target_option=k; $(am__make_running_with_option)) +pkgdatadir = $(datadir)/@PACKAGE@ +pkgincludedir = $(includedir)/@PACKAGE@ +pkglibdir = $(libdir)/@PACKAGE@ +pkglibexecdir = $(libexecdir)/@PACKAGE@ +am__cd = CDPATH="$${ZSH_VERSION+.}$(PATH_SEPARATOR)" && cd +install_sh_DATA = $(install_sh) -c -m 644 +install_sh_PROGRAM = $(install_sh) -c +install_sh_SCRIPT = $(install_sh) -c +INSTALL_HEADER = $(INSTALL_DATA) +transform = $(program_transform_name) +NORMAL_INSTALL = : +PRE_INSTALL = : +POST_INSTALL = : +NORMAL_UNINSTALL = : +PRE_UNINSTALL = : +POST_UNINSTALL = : +build_triplet = @build@ +host_triplet = @host@ +target_triplet = @target@ +subdir = windows/installer/translations +ACLOCAL_M4 = $(top_srcdir)/aclocal.m4 +am__aclocal_m4_deps = $(top_srcdir)/m4/expat.m4 \ + $(top_srcdir)/m4/gettext.m4 $(top_srcdir)/m4/iconv.m4 \ + $(top_srcdir)/m4/intlmacosx.m4 $(top_srcdir)/m4/lib-ld.m4 \ + $(top_srcdir)/m4/lib-link.m4 $(top_srcdir)/m4/lib-prefix.m4 \ + $(top_srcdir)/m4/libcurl.m4 $(top_srcdir)/m4/nls.m4 \ + $(top_srcdir)/m4/po.m4 $(top_srcdir)/m4/progtest.m4 \ + $(top_srcdir)/configure.ac +am__configure_deps = $(am__aclocal_m4_deps) $(CONFIGURE_DEPENDENCIES) \ + $(ACLOCAL_M4) +DIST_COMMON = $(srcdir)/Makefile.am $(am__DIST_COMMON) +mkinstalldirs = $(SHELL) $(top_srcdir)/mkinstalldirs +CONFIG_HEADER = $(top_builddir)/src/config.h +CONFIG_CLEAN_FILES = +CONFIG_CLEAN_VPATH_FILES = +AM_V_P = $(am__v_P_@AM_V@) +am__v_P_ = $(am__v_P_@AM_DEFAULT_V@) +am__v_P_0 = false +am__v_P_1 = : +AM_V_GEN = $(am__v_GEN_@AM_V@) +am__v_GEN_ = $(am__v_GEN_@AM_DEFAULT_V@) +am__v_GEN_0 = @echo " GEN " $@; +am__v_GEN_1 = +AM_V_at = $(am__v_at_@AM_V@) +am__v_at_ = $(am__v_at_@AM_DEFAULT_V@) +am__v_at_0 = @ +am__v_at_1 = +SOURCES = +DIST_SOURCES = +am__can_run_installinfo = \ + case $$AM_UPDATE_INFO_DIR in \ + n|no|NO) false;; \ + *) (install-info --version) >/dev/null 2>&1;; \ + esac +am__tagged_files = $(HEADERS) $(SOURCES) $(TAGS_FILES) $(LISP) +am__DIST_COMMON = $(srcdir)/Makefile.in $(top_srcdir)/mkinstalldirs +DISTFILES = $(DIST_COMMON) $(DIST_SOURCES) $(TEXINFOS) $(EXTRA_DIST) +ACLOCAL = @ACLOCAL@ +ACLOCAL_AMFLAGS = @ACLOCAL_AMFLAGS@ +ALL_LINGUAS = @ALL_LINGUAS@ +AMTAR = @AMTAR@ +AM_DEFAULT_VERBOSITY = @AM_DEFAULT_VERBOSITY@ +AUTOCONF = @AUTOCONF@ +AUTOHEADER = @AUTOHEADER@ +AUTOMAKE = @AUTOMAKE@ +AWK = @AWK@ +CATALOGS = @CATALOGS@ +CATOBJEXT = @CATOBJEXT@ +CC = @CC@ +CCDEPMODE = @CCDEPMODE@ +CFLAGS = @CFLAGS@ +CONFIG_STATUS_DEPENDENCIES = @CONFIG_STATUS_DEPENDENCIES@ +CPP = @CPP@ +CPPFLAGS = @CPPFLAGS@ +CXX = @CXX@ +CXXCPP = @CXXCPP@ +CXXDEPMODE = @CXXDEPMODE@ +CXXFLAGS = @CXXFLAGS@ +CYGPATH_W = @CYGPATH_W@ +DATADIRNAME = @DATADIRNAME@ +DB2MAN_XSL = @DB2MAN_XSL@ +DEFS = @DEFS@ +DEPDIR = @DEPDIR@ +DISTCHECK_CONFIGURE_FLAGS = @DISTCHECK_CONFIGURE_FLAGS@ +DOC_USER_FORMATS = @DOC_USER_FORMATS@ +ECHO_C = @ECHO_C@ +ECHO_N = @ECHO_N@ +ECHO_T = @ECHO_T@ +EGREP = @EGREP@ +EXEEXT = @EXEEXT@ +EXPAT_CFLAGS = @EXPAT_CFLAGS@ +EXPAT_LIBS = @EXPAT_LIBS@ +GDK_PIXBUF_CSOURCE = @GDK_PIXBUF_CSOURCE@ +GETTEXT_MACRO_VERSION = @GETTEXT_MACRO_VERSION@ +GETTEXT_PACKAGE = @GETTEXT_PACKAGE@ +GLIB_MKENUMS = @GLIB_MKENUMS@ +GMOFILES = @GMOFILES@ +GMSGFMT = @GMSGFMT@ +GMSGFMT_015 = @GMSGFMT_015@ +GREP = @GREP@ +GTKDOC_CHECK = @GTKDOC_CHECK@ +GTKDOC_CHECK_PATH = @GTKDOC_CHECK_PATH@ +GTKDOC_DEPS_CFLAGS = @GTKDOC_DEPS_CFLAGS@ +GTKDOC_DEPS_LIBS = @GTKDOC_DEPS_LIBS@ +GTKDOC_MKPDF = @GTKDOC_MKPDF@ +GTKDOC_REBASE = @GTKDOC_REBASE@ +HAVE_SCROLLKEEPER = @HAVE_SCROLLKEEPER@ +HELP_DIR = @HELP_DIR@ +HTML_DIR = @HTML_DIR@ +INSTALL = @INSTALL@ +INSTALL_DATA = @INSTALL_DATA@ +INSTALL_PROGRAM = @INSTALL_PROGRAM@ +INSTALL_SCRIPT = @INSTALL_SCRIPT@ +INSTALL_STRIP_PROGRAM = @INSTALL_STRIP_PROGRAM@ +INSTOBJEXT = @INSTOBJEXT@ +INTLLIBS = @INTLLIBS@ +INTLTOOL_EXTRACT = @INTLTOOL_EXTRACT@ +INTLTOOL_MERGE = @INTLTOOL_MERGE@ +INTLTOOL_PERL = @INTLTOOL_PERL@ +INTLTOOL_UPDATE = @INTLTOOL_UPDATE@ +INTLTOOL_V_MERGE = @INTLTOOL_V_MERGE@ +INTLTOOL_V_MERGE_OPTIONS = @INTLTOOL_V_MERGE_OPTIONS@ +INTLTOOL__v_MERGE_ = @INTLTOOL__v_MERGE_@ +INTLTOOL__v_MERGE_0 = @INTLTOOL__v_MERGE_0@ +INTL_MACOSX_LIBS = @INTL_MACOSX_LIBS@ +ISODATE = @ISODATE@ +LDFLAGS = @LDFLAGS@ +LIBCURL = @LIBCURL@ +LIBCURL_CPPFLAGS = @LIBCURL_CPPFLAGS@ +LIBGEOCLUE_CFLAGS = @LIBGEOCLUE_CFLAGS@ +LIBGEOCLUE_LIBS = @LIBGEOCLUE_LIBS@ +LIBICONV = @LIBICONV@ +LIBINTL = @LIBINTL@ +LIBOBJS = @LIBOBJS@ +LIBS = @LIBS@ +LIBZIP_CFLAGS = @LIBZIP_CFLAGS@ +LIBZIP_LIBS = @LIBZIP_LIBS@ +LN_S = @LN_S@ +LTLIBICONV = @LTLIBICONV@ +LTLIBINTL = @LTLIBINTL@ +LTLIBOBJS = @LTLIBOBJS@ +MAKEINFO = @MAKEINFO@ +MKDIR_P = @MKDIR_P@ +MKINSTALLDIRS = @MKINSTALLDIRS@ +MSGFMT = @MSGFMT@ +MSGFMT_015 = @MSGFMT_015@ +MSGFMT_OPTS = @MSGFMT_OPTS@ +MSGMERGE = @MSGMERGE@ +OBJEXT = @OBJEXT@ +OMF_DIR = @OMF_DIR@ +PACKAGE = @PACKAGE@ +PACKAGE_BUGREPORT = @PACKAGE_BUGREPORT@ +PACKAGE_CFLAGS = @PACKAGE_CFLAGS@ +PACKAGE_LIBS = @PACKAGE_LIBS@ +PACKAGE_NAME = @PACKAGE_NAME@ +PACKAGE_STRING = @PACKAGE_STRING@ +PACKAGE_TARNAME = @PACKAGE_TARNAME@ +PACKAGE_URL = @PACKAGE_URL@ +PACKAGE_VERSION = @PACKAGE_VERSION@ +PATH_SEPARATOR = @PATH_SEPARATOR@ +PKG_CONFIG = @PKG_CONFIG@ +PKG_CONFIG_LIBDIR = @PKG_CONFIG_LIBDIR@ +PKG_CONFIG_PATH = @PKG_CONFIG_PATH@ +POFILES = @POFILES@ +POSUB = @POSUB@ +PO_IN_DATADIR_FALSE = @PO_IN_DATADIR_FALSE@ +PO_IN_DATADIR_TRUE = @PO_IN_DATADIR_TRUE@ +RANLIB = @RANLIB@ +SET_MAKE = @SET_MAKE@ +SHELL = @SHELL@ +STRIP = @STRIP@ +USE_NLS = @USE_NLS@ +VERSION = @VERSION@ +XGETTEXT = @XGETTEXT@ +XGETTEXT_015 = @XGETTEXT_015@ +XGETTEXT_EXTRA_OPTIONS = @XGETTEXT_EXTRA_OPTIONS@ +XP = @XP@ +_libcurl_config = @_libcurl_config@ +abs_builddir = @abs_builddir@ +abs_srcdir = @abs_srcdir@ +abs_top_builddir = @abs_top_builddir@ +abs_top_srcdir = @abs_top_srcdir@ +ac_ct_CC = @ac_ct_CC@ +ac_ct_CXX = @ac_ct_CXX@ +am__include = @am__include@ +am__leading_dot = @am__leading_dot@ +am__quote = @am__quote@ +am__tar = @am__tar@ +am__untar = @am__untar@ +bindir = @bindir@ +build = @build@ +build_alias = @build_alias@ +build_cpu = @build_cpu@ +build_os = @build_os@ +build_vendor = @build_vendor@ +builddir = @builddir@ +datadir = @datadir@ +datarootdir = @datarootdir@ +docdir = @docdir@ +dvidir = @dvidir@ +exec_prefix = @exec_prefix@ +host = @host@ +host_alias = @host_alias@ +host_cpu = @host_cpu@ +host_os = @host_os@ +host_vendor = @host_vendor@ +htmldir = @htmldir@ +includedir = @includedir@ +infodir = @infodir@ +install_sh = @install_sh@ +intltool__v_merge_options_ = @intltool__v_merge_options_@ +intltool__v_merge_options_0 = @intltool__v_merge_options_0@ +libdir = @libdir@ +libexecdir = @libexecdir@ +localedir = @localedir@ +localstatedir = @localstatedir@ +mandir = @mandir@ +mkdir_p = @mkdir_p@ +oldincludedir = @oldincludedir@ +pdfdir = @pdfdir@ +prefix = @prefix@ +program_transform_name = @program_transform_name@ +psdir = @psdir@ +runstatedir = @runstatedir@ +sbindir = @sbindir@ +sharedstatedir = @sharedstatedir@ +srcdir = @srcdir@ +sysconfdir = @sysconfdir@ +target = @target@ +target_alias = @target_alias@ +target_cpu = @target_cpu@ +target_os = @target_os@ +target_vendor = @target_vendor@ +top_build_prefix = @top_build_prefix@ +top_builddir = @top_builddir@ +top_srcdir = @top_srcdir@ +EXTRA_DIST = \ + english.nsh \ + french.nsh \ + spanish.nsh + +all: all-am + +.SUFFIXES: +$(srcdir)/Makefile.in: $(srcdir)/Makefile.am $(am__configure_deps) + @for dep in $?; do \ + case '$(am__configure_deps)' in \ + *$$dep*) \ + ( cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh ) \ + && { if test -f $@; then exit 0; else break; fi; }; \ + exit 1;; \ + esac; \ + done; \ + echo ' cd $(top_srcdir) && $(AUTOMAKE) --gnu windows/installer/translations/Makefile'; \ + $(am__cd) $(top_srcdir) && \ + $(AUTOMAKE) --gnu windows/installer/translations/Makefile +Makefile: $(srcdir)/Makefile.in $(top_builddir)/config.status + @case '$?' in \ + *config.status*) \ + cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh;; \ + *) \ + echo ' cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__maybe_remake_depfiles)'; \ + cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__maybe_remake_depfiles);; \ + esac; + +$(top_builddir)/config.status: $(top_srcdir)/configure $(CONFIG_STATUS_DEPENDENCIES) + cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh + +$(top_srcdir)/configure: $(am__configure_deps) + cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh +$(ACLOCAL_M4): $(am__aclocal_m4_deps) + cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh +$(am__aclocal_m4_deps): +tags TAGS: + +ctags CTAGS: + +cscope cscopelist: + + +distdir: $(BUILT_SOURCES) + $(MAKE) $(AM_MAKEFLAGS) distdir-am + +distdir-am: $(DISTFILES) + @srcdirstrip=`echo "$(srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \ + topsrcdirstrip=`echo "$(top_srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \ + list='$(DISTFILES)'; \ + dist_files=`for file in $$list; do echo $$file; done | \ + sed -e "s|^$$srcdirstrip/||;t" \ + -e "s|^$$topsrcdirstrip/|$(top_builddir)/|;t"`; \ + case $$dist_files in \ + */*) $(MKDIR_P) `echo "$$dist_files" | \ + sed '/\//!d;s|^|$(distdir)/|;s,/[^/]*$$,,' | \ + sort -u` ;; \ + esac; \ + for file in $$dist_files; do \ + if test -f $$file || test -d $$file; then d=.; else d=$(srcdir); fi; \ + if test -d $$d/$$file; then \ + dir=`echo "/$$file" | sed -e 's,/[^/]*$$,,'`; \ + if test -d "$(distdir)/$$file"; then \ + find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \ + fi; \ + if test -d $(srcdir)/$$file && test $$d != $(srcdir); then \ + cp -fpR $(srcdir)/$$file "$(distdir)$$dir" || exit 1; \ + find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \ + fi; \ + cp -fpR $$d/$$file "$(distdir)$$dir" || exit 1; \ + else \ + test -f "$(distdir)/$$file" \ + || cp -p $$d/$$file "$(distdir)/$$file" \ + || exit 1; \ + fi; \ + done +check-am: all-am +check: check-am +all-am: Makefile +installdirs: +install: install-am +install-exec: install-exec-am +install-data: install-data-am +uninstall: uninstall-am + +install-am: all-am + @$(MAKE) $(AM_MAKEFLAGS) install-exec-am install-data-am + +installcheck: installcheck-am +install-strip: + if test -z '$(STRIP)'; then \ + $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \ + install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \ + install; \ + else \ + $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \ + install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \ + "INSTALL_PROGRAM_ENV=STRIPPROG='$(STRIP)'" install; \ + fi +mostlyclean-generic: + +clean-generic: + +distclean-generic: + -test -z "$(CONFIG_CLEAN_FILES)" || rm -f $(CONFIG_CLEAN_FILES) + -test . = "$(srcdir)" || test -z "$(CONFIG_CLEAN_VPATH_FILES)" || rm -f $(CONFIG_CLEAN_VPATH_FILES) + +maintainer-clean-generic: + @echo "This command is intended for maintainers to use" + @echo "it deletes files that may require special tools to rebuild." +clean: clean-am + +clean-am: clean-generic mostlyclean-am + +distclean: distclean-am + -rm -f Makefile +distclean-am: clean-am distclean-generic + +dvi: dvi-am + +dvi-am: + +html: html-am + +html-am: + +info: info-am + +info-am: + +install-data-am: + +install-dvi: install-dvi-am + +install-dvi-am: + +install-exec-am: + +install-html: install-html-am + +install-html-am: + +install-info: install-info-am + +install-info-am: + +install-man: + +install-pdf: install-pdf-am + +install-pdf-am: + +install-ps: install-ps-am + +install-ps-am: + +installcheck-am: + +maintainer-clean: maintainer-clean-am + -rm -f Makefile +maintainer-clean-am: distclean-am maintainer-clean-generic + +mostlyclean: mostlyclean-am + +mostlyclean-am: mostlyclean-generic + +pdf: pdf-am + +pdf-am: + +ps: ps-am + +ps-am: + +uninstall-am: + +.MAKE: install-am install-strip + +.PHONY: all all-am check check-am clean clean-generic cscopelist-am \ + ctags-am distclean distclean-generic distdir dvi dvi-am html \ + html-am info info-am install install-am install-data \ + install-data-am install-dvi install-dvi-am install-exec \ + install-exec-am install-html install-html-am install-info \ + install-info-am install-man install-pdf install-pdf-am \ + install-ps install-ps-am install-strip installcheck \ + installcheck-am installdirs maintainer-clean \ + maintainer-clean-generic mostlyclean mostlyclean-generic pdf \ + pdf-am ps ps-am tags-am uninstall uninstall-am + +.PRECIOUS: Makefile + + +# Tell versions [3.59,3.63) of GNU make to not export all variables. +# Otherwise a system limit (for SysV at least) may be exceeded. +.NOEXPORT: diff --git a/windows/installer/translations/english.nsh b/windows/installer/translations/english.nsh new file mode 100644 index 0000000..342ca6a --- /dev/null +++ b/windows/installer/translations/english.nsh @@ -0,0 +1,47 @@ +;; +;; english.nsh +;; +;; Default language strings for the Windows Viking NSIS installer. +;; +;; Version 3 +;; Note: If translating this file, replace '!insertmacro VIKING_MACRO_DEFAULT_STRING' +;; with '!define'. + +; Make sure to update the VIKING_MACRO_LANGUAGEFILE_END macro in +; langmacros.nsh when updating this file + +; Startup Checks +!insertmacro VIKING_MACRO_DEFAULT_STRING INSTALLER_IS_RUNNING "The installer is already running." +!insertmacro VIKING_MACRO_DEFAULT_STRING VIKING_IS_RUNNING "An instance of Viking is currently running. Please exit Viking and try again." + +; License Page +!insertmacro VIKING_MACRO_DEFAULT_STRING VIKING_LICENSE_BUTTON "Next >" +!insertmacro VIKING_MACRO_DEFAULT_STRING VIKING_LICENSE_BOTTOM_TEXT "$(^Name) is released under the GNU General Public License (GPL). The license is provided here for information purposes only. $_CLICK" + +; Components Page +!insertmacro VIKING_MACRO_DEFAULT_STRING VIKING_SECTION_TITLE "Viking GPS data editor and analyzer (required)" +!insertmacro VIKING_MACRO_DEFAULT_STRING VIKING_SHORTCUTS_SECTION_TITLE "Shortcuts" +!insertmacro VIKING_MACRO_DEFAULT_STRING VIKING_DESKTOP_SHORTCUT_SECTION_TITLE "Desktop" +!insertmacro VIKING_MACRO_DEFAULT_STRING VIKING_STARTMENU_SHORTCUT_SECTION_TITLE "Start Menu" +!insertmacro VIKING_MACRO_DEFAULT_STRING VIKING_FILE_ASSOCIATION_SECTION_TITLE "File association" +!insertmacro VIKING_MACRO_DEFAULT_STRING VIKING_GPSBABEL_SECTION_TITLE "GPSBabel 1.5.4" +!insertmacro VIKING_MACRO_DEFAULT_STRING VIKING_SECTION_DESCRIPTION "Core Viking files and dlls" +!insertmacro VIKING_MACRO_DEFAULT_STRING GTK_SECTION_DESCRIPTION "A multi-platform GUI toolkit, used by Viking" + +!insertmacro VIKING_MACRO_DEFAULT_STRING VIKING_SHORTCUTS_SECTION_DESCRIPTION "Shortcuts for starting Viking" +!insertmacro VIKING_MACRO_DEFAULT_STRING VIKING_DESKTOP_SHORTCUT_DESC "Create a shortcut to Viking on the Desktop" +!insertmacro VIKING_MACRO_DEFAULT_STRING VIKING_STARTMENU_SHORTCUT_DESC "Create a Start Menu entry for Viking" +!insertmacro VIKING_MACRO_DEFAULT_STRING VIKING_FILE_ASSOCIATION_DESC "Associate .gpx files with Viking" +!insertmacro VIKING_MACRO_DEFAULT_STRING VIKING_INSTALL_GPSBABEL_DESC "Install GPSBabel Program" + +; Installer Finish Page +!insertmacro VIKING_MACRO_DEFAULT_STRING VIKING_FINISH_VISIT_WEB_SITE "Visit the Viking Web Page" + +; Viking Section Prompts and Texts +!insertmacro VIKING_MACRO_DEFAULT_STRING VIKING_PROMPT_CONTINUE_WITHOUT_UNINSTALL "Unable to uninstall the currently installed version of Viking. The new version will be installed without removing the currently installed version." + +; Uninstall Section Prompts +!insertmacro VIKING_MACRO_DEFAULT_STRING un.VIKING_UNINSTALL_ERROR_1 "The uninstaller could not find registry entries for Viking.$\rIt is likely that another user installed this application." +!insertmacro VIKING_MACRO_DEFAULT_STRING un.VIKING_UNINSTALL_ERROR_2 "You do not have permission to uninstall this application." + +!insertmacro VIKING_MACRO_DEFAULT_STRING VIKING_UNINSTALL_COMMENTS "GPS data editor and analyser" diff --git a/windows/installer/translations/french.nsh b/windows/installer/translations/french.nsh new file mode 100644 index 0000000..9e78b15 --- /dev/null +++ b/windows/installer/translations/french.nsh @@ -0,0 +1,44 @@ +;; French language strings for the Windows Viking NSIS installer. +;; +;; Based on Win32 Pidgin installer french translation file by +;; Author: Eric Boumaour <zongo_fr@users.sourceforge.net>, 2003-2007. +;; +;; Modified for Viking by Mathieu Albinet <mathieu_a@users.sourceforge.net> + +; Make sure to update the VIKING_MACRO_LANGUAGEFILE_END macro in +; langmacros.nsh when updating this file + +; Startup Checks +!define INSTALLER_IS_RUNNING "Le programme d'installation est déjà en cours d'exécution." +!define VIKING_IS_RUNNING "Une instance de Viking est en cours d'exécution. Veuillez quitter Viking et réessayer." + +; License Page +!define VIKING_LICENSE_BUTTON "Suivant >" +!define VIKING_LICENSE_BOTTOM_TEXT "$(^Name) est disponible sous licence GNU General Public License (GPL). Le texte de licence suivant est fourni uniquement à titre informatif. $_CLICK" + +; Components Page +!define VIKING_SECTION_TITLE "Viking, logiciel d'édition et d'analyse de données GPS (obligatoire)" +!define VIKING_SHORTCUTS_SECTION_TITLE "Raccourcis" +!define VIKING_DESKTOP_SHORTCUT_SECTION_TITLE "Bureau" +!define VIKING_STARTMENU_SHORTCUT_SECTION_TITLE "Menu Démarrer" +!define VIKING_FILE_ASSOCIATION_SECTION_TITLE "Extension .gpx" +!define VIKING_SECTION_DESCRIPTION "Fichiers et DLLs de base de Viking" +!define VIKING_GPSBABEL_SECTION_TITLE "GPSBabel 1.5.4" + +!define VIKING_SHORTCUTS_SECTION_DESCRIPTION "Raccourcis pour lancer Viking" +!define VIKING_DESKTOP_SHORTCUT_DESC "Créer un raccourci pour Viking sur le bureau" +!define VIKING_STARTMENU_SHORTCUT_DESC "Créer un raccourci pour Viking dans le menu Démarrer" +!define VIKING_FILE_ASSOCIATION_DESC "Associer Viking avec l'extension .gpx" +!define VIKING_INSTALL_GPSBABEL_DESC "Installer GPSBabel Programme" + +; Installer Finish Page +!define VIKING_FINISH_VISIT_WEB_SITE "Visitez la page web de Viking" + +; Viking Section Prompts and Texts +!define VIKING_PROMPT_CONTINUE_WITHOUT_UNINSTALL "Impossible de désinstaller la version de Viking en place. La nouvelle version sera installée sans supprimer la version en place." + +; Uninstall Section Prompts +!define un.VIKING_UNINSTALL_ERROR_1 "Le programme de désinstallation n'a pas retrouvé les entrées de Viking dans la base de registres.$\rL'application a peut-être été installée par un utilisateur différent." +!define un.VIKING_UNINSTALL_ERROR_2 "Vous n'avez pas les permissions pour supprimer cette application." + +!define VIKING_UNINSTALL_COMMENTS "D'édition et d'analyse de données GPS" diff --git a/windows/installer/translations/spanish.nsh b/windows/installer/translations/spanish.nsh new file mode 100644 index 0000000..66c9e55 --- /dev/null +++ b/windows/installer/translations/spanish.nsh @@ -0,0 +1,43 @@ +;; Spanish language strings for the Windows Viking NSIS installer. +;; +;; Author: Roberto +;; +;; Modified for Viking by Mathieu Albinet <mathieu_a@users.sourceforge.net> + +; Make sure to update the VIKING_MACRO_LANGUAGEFILE_END macro in +; langmacros.nsh when updating this file + +; Startup Checks +!define INSTALLER_IS_RUNNING "El programa de instalación ya se está ejecutando." +!define VIKING_IS_RUNNING "Una instancia de Viking se está ejecutando. Por favor, salga de Viking y vuelva a intentarlo." + +; License Page +!define VIKING_LICENSE_BUTTON "Siguiente >" +!define VIKING_LICENSE_BOTTOM_TEXT "$(^Name) está disponible bajo licencia GNU General Public License (GPL). El siguiente texto de licencia es ofrecido únicamente a titulo informativo. $_CLICK" + +; Components Page +!define VIKING_SECTION_TITLE "Viking, software de edición y de análisis de datos GPS (obligatorio)" +!define VIKING_SHORTCUTS_SECTION_TITLE "Accesos directos" +!define VIKING_DESKTOP_SHORTCUT_SECTION_TITLE "Escritorio" +!define VIKING_STARTMENU_SHORTCUT_SECTION_TITLE "Menú Inicio" +!define VIKING_FILE_ASSOCIATION_SECTION_TITLE "Extensión.gpx" +!define VIKING_SECTION_DESCRIPTION "Ficheros y DLLs de base de Viking" +!define VIKING_GPSBABEL_SECTION_TITLE "GPSBabel 1.5.4" + +!define VIKING_SHORTCUTS_SECTION_DESCRIPTION "Accesos directos para lanzar Viking" +!define VIKING_DESKTOP_SHORTCUT_DESC "Crear un acceso directo a Viking en el escritorio" +!define VIKING_STARTMENU_SHORTCUT_DESC "Crear un acceso directo a Viking en el menú de inicio" +!define VIKING_FILE_ASSOCIATION_DESC "Asociar Viking con la extensión .gpx" +!define VIKING_INSTALL_GPSBABEL_DESC "Instalar GPSBabel Programa" + +; Installer Finish Page +!define VIKING_FINISH_VISIT_WEB_SITE "Visite la página web de Viking" + +; Viking Section Prompts and Texts +!define VIKING_PROMPT_CONTINUE_WITHOUT_UNINSTALL "Desinstalación de la versión actual de Viking imposible. La nueva versión será instalada sin suprimir la versión actual." + +; Uninstall Section Prompts +!define un.VIKING_UNINSTALL_ERROR_1 "El programa de desinstalación no ha encontrado las entradas de Viking en la base de registros.$\rLa aplicación quizá haya sido instalada por un usuario distinto." +!define un.VIKING_UNINSTALL_ERROR_2 "Usted no tiene los permisos necesarios para suprimir esta aplicación." + +!define VIKING_UNINSTALL_COMMENTS "Edición y de análisis de datos GPS" diff --git a/windows/installer/viking-installer.nsi b/windows/installer/viking-installer.nsi new file mode 100644 index 0000000..8ef38b0 --- /dev/null +++ b/windows/installer/viking-installer.nsi @@ -0,0 +1,585 @@ +; Installer script for Windows (32 & 64 bit) Viking +; Based on Win32 Pidgin installer by Herman Bloggs <hermanator12002@yahoo.com> +; and Daniel Atallah <daniel_atallah@yahoo.com> +; Heavily modified for Viking by Mathieu Albinet <mathieu_a@users.sourceforge.net> + +;-------------------------------- +;Global Variables +Var name + +;-------------------------------- +;Configuration +;Needs to be 4 numbers: W.X.Y.Z +!define VIKING_VERSION "1.7.0.0" + +;The name var is set in .onInit +Name $name + +;Allow overiding location of binary components for the install +!ifndef BINARIES + !define BINARIES ".\bin" +!endif + +OutFile "viking-${VIKING_VERSION}.exe" + +;NB Using /SOLID method on a mingw32 setup seems to generate an exe that fails the CRC check +;So now don't set the compressor here - it can be set by the calling command/script if necessary. +;SetCompressor /SOLID bzip2 +ShowInstDetails show +ShowUninstDetails show +SetDateSave on + +; $name and $INSTDIR are set in .onInit function.. + +!include "MUI.nsh" +!include "Sections.nsh" +!include "WinVer.nsh" +!include "LogicLib.nsh" +!include "x64.nsh" +;; http://nsis.sourceforge.net/File_Association +!include "FileAssociation.nsh" + +!include "FileFunc.nsh" +!insertmacro GetParameters +!insertmacro GetOptions +!insertmacro GetParent + +!include "WordFunc.nsh" + +;-------------------------------- +;Defines + +!define VIKING_NSIS_INCLUDE_PATH "." + +; Remove these and the stuff that uses them at some point +!define VIKING_REG_KEY "SOFTWARE\viking" +!define VIKING_UNINSTALL_KEY "SOFTWARE\Microsoft\Windows\CurrentVersion\Uninstall\viking" + +!define HKLM_APP_PATHS_KEY "SOFTWARE\Microsoft\Windows\CurrentVersion\App Paths\viking.exe" +!define VIKING_UNINST_EXE "viking-uninst.exe" + +;-------------------------------- +;Version resource +VIProductVersion "${VIKING_VERSION}" +VIAddVersionKey "ProductName" "Viking" +VIAddVersionKey "FileVersion" "${VIKING_VERSION}" +VIAddVersionKey "ProductVersion" "${VIKING_VERSION}" +VIAddVersionKey "LegalCopyright" "" +VIAddVersionKey "FileDescription" "Viking Installer" + +;-------------------------------- +;Modern UI Configuration + + !define MUI_ICON ".\pixmaps\viking_icon.ico" + !define MUI_UNICON ".\pixmaps\viking_icon.ico" +; !define MUI_WELCOMEFINISHPAGE_BITMAP ".\pixmaps\viking-intro.bmp" +; !define MUI_HEADERIMAGE +; !define MUI_HEADERIMAGE_BITMAP ".\pixmaps\viking-header.bmp" + + ; Alter License section + !define MUI_LICENSEPAGE_BUTTON $(VIKING_LICENSE_BUTTON) + !define MUI_LICENSEPAGE_TEXT_BOTTOM $(VIKING_LICENSE_BOTTOM_TEXT) + + !define MUI_LANGDLL_REGISTRY_ROOT "HKCU" + !define MUI_LANGDLL_REGISTRY_KEY ${VIKING_REG_KEY} + !define MUI_LANGDLL_REGISTRY_VALUENAME "Installer Language" + + !define MUI_COMPONENTSPAGE_SMALLDESC + !define MUI_ABORTWARNING + + ;Finish Page config + !define MUI_FINISHPAGE_NOAUTOCLOSE + !define MUI_FINISHPAGE_RUN "$INSTDIR\viking.exe" + !define MUI_FINISHPAGE_RUN_NOTCHECKED + !define MUI_FINISHPAGE_LINK $(VIKING_FINISH_VISIT_WEB_SITE) + !define MUI_FINISHPAGE_LINK_LOCATION "http://viking.sourceforge.net" + +;-------------------------------- +;Pages + + !insertmacro MUI_PAGE_WELCOME + !insertmacro MUI_PAGE_LICENSE "${BINARIES}\COPYING_GPL.txt" + !insertmacro MUI_PAGE_COMPONENTS + + ; Viking install dir page + !insertmacro MUI_PAGE_DIRECTORY + + !insertmacro MUI_PAGE_INSTFILES + !insertmacro MUI_PAGE_FINISH + + !insertmacro MUI_UNPAGE_WELCOME + !insertmacro MUI_UNPAGE_CONFIRM + !insertmacro MUI_UNPAGE_INSTFILES + !insertmacro MUI_UNPAGE_FINISH + +;-------------------------------- +;Languages + + ;; English goes first because its the default. The rest are + ;; in alphabetical order (at least the strings actually displayed + ;; will be). + + !insertmacro MUI_LANGUAGE "English" + !insertmacro MUI_LANGUAGE "French" + !insertmacro MUI_LANGUAGE "Spanish" + +;-------------------------------- +;Translations + + !define VIKING_DEFAULT_LANGFILE "${VIKING_NSIS_INCLUDE_PATH}\translations\english.nsh" + + !include "${VIKING_NSIS_INCLUDE_PATH}\langmacros.nsh" + + !insertmacro VIKING_MACRO_INCLUDE_LANGFILE "ENGLISH" "${VIKING_NSIS_INCLUDE_PATH}\translations\english.nsh" + !insertmacro VIKING_MACRO_INCLUDE_LANGFILE "FRENCH" "${VIKING_NSIS_INCLUDE_PATH}\translations\french.nsh" + !insertmacro VIKING_MACRO_INCLUDE_LANGFILE "SPANISH" "${VIKING_NSIS_INCLUDE_PATH}\translations\spanish.nsh" + +;-------------------------------- +;Reserve Files + ; Only need this if using bzip2 compression + + !insertmacro MUI_RESERVEFILE_INSTALLOPTIONS + !insertmacro MUI_RESERVEFILE_LANGDLL + ReserveFile "${NSISDIR}\Plugins\x86-unicode\UserInfo.dll" + + +;;;;;;;;;;;;;;;;;;;;;;;;;;;; +;; Start Install Sections ;; +;;;;;;;;;;;;;;;;;;;;;;;;;;;; + +LicenseData "${BINARIES}\COPYING_GPL.txt" +LicenseForceSelection checkbox + +;-------------------------------- +;Uninstall any old version of Viking + +Section -SecUninstallOldViking + ; Check install rights.. + Call CheckUserInstallRights + Pop $R0 + + ;First try to uninstall Viking + StrCpy $R4 ${VIKING_REG_KEY} + StrCpy $R5 ${VIKING_UNINSTALL_KEY} + StrCpy $R6 ${VIKING_UNINST_EXE} + StrCpy $R7 "Viking" + + ;Determine user install rights + StrCmp $R0 "HKLM" compare_hklm + StrCmp $R0 "HKCU" compare_hkcu done + + compare_hkcu: + ReadRegStr $R1 HKCU $R4 "" + ReadRegStr $R2 HKCU $R4 "Version" + ReadRegStr $R3 HKCU "$R5" "UninstallString" + Goto try_uninstall + + compare_hklm: + ReadRegStr $R1 HKLM $R4 "" + ReadRegStr $R2 HKLM $R4 "Version" + ReadRegStr $R3 HKLM "$R5" "UninstallString" + + ; If a previous version exists, remove it + try_uninstall: + StrCmp $R1 "" done + StrCmp $R2 "" uninstall_problem + ; Check if we have uninstall string.. + IfFileExists $R3 0 uninstall_problem + ; Have uninstall string, go ahead and uninstall. + SetOverwrite on + ; Need to copy uninstaller outside of the install dir + ClearErrors + CopyFiles /SILENT $R3 "$TEMP\$R6" + SetOverwrite off + IfErrors uninstall_problem + ; Ready to uninstall.. + ClearErrors + ExecWait '"$TEMP\$R6" /S _?=$R1' + IfErrors exec_error + Delete "$TEMP\$R6" + Goto done + + exec_error: + Delete "$TEMP\$R6" + Goto uninstall_problem + + uninstall_problem: + ; We can't uninstall. Either the user must manually uninstall or we ignore and reinstall over it. + MessageBox MB_OKCANCEL $(VIKING_PROMPT_CONTINUE_WITHOUT_UNINSTALL) /SD IDOK IDOK done + Quit + done: +SectionEnd + + +;-------------------------------- +;Viking Install Section + +Section $(VIKING_SECTION_TITLE) SecViking + SectionIn 1 RO + + ; Check install rights.. + Call CheckUserInstallRights + Pop $R0 + StrCmp $R0 "NONE" viking_none + StrCmp $R0 "HKLM" viking_hklm viking_hkcu + + ;Install rights for Local Machine + viking_hklm: + WriteRegStr HKLM "${HKLM_APP_PATHS_KEY}" "" "$INSTDIR\viking.exe" + WriteRegStr HKLM "${HKLM_APP_PATHS_KEY}" "Path" "$R1\bin" + ; Sets scope of the desktop and Start Menu entries for all users. + SetShellVarContext "all" + Goto viking_install_files + + ;Install rights for Current User only + viking_hkcu: + Goto viking_install_files + + ;No install rights! + viking_none: + + viking_install_files: + SetOutPath "$INSTDIR" + SetOverwrite on + + ; Common settings + WriteRegStr SHCTX ${VIKING_REG_KEY} "" "$INSTDIR" + WriteRegStr SHCTX ${VIKING_REG_KEY} "Version" "${VIKING_VERSION}" + ${If} ${RunningX64} + WriteRegStr SHCTX "${VIKING_UNINSTALL_KEY}" "DisplayName" "Viking (x86)" + ${Else} + WriteRegStr SHCTX "${VIKING_UNINSTALL_KEY}" "DisplayName" "Viking (x64)" + ${EndIf} + WriteRegStr SHCTX "${VIKING_UNINSTALL_KEY}" "DisplayVersion" "${VIKING_VERSION}" + WriteRegStr SHCTX "${VIKING_UNINSTALL_KEY}" "DisplayIcon" "$INSTDIR\viking_icon.ico" + WriteRegStr SHCTX "${VIKING_UNINSTALL_KEY}" "HelpLink" "http://sourceforge.net/p/viking/wikiallura" + WriteRegStr SHCTX "${VIKING_UNINSTALL_KEY}" "URLInfoAbout" "http://sourceforge.net/projects/viking/" + WriteRegStr SHCTX "${VIKING_UNINSTALL_KEY}" "Publisher" "The Viking developer community" + WriteRegStr SHCTX "${VIKING_UNINSTALL_KEY}" "Comments" "$(VIKING_UNINSTALL_COMMENTS)" + WriteRegDWORD SHCTX "${VIKING_UNINSTALL_KEY}" "NoModify" 1 + WriteRegDWORD SHCTX "${VIKING_UNINSTALL_KEY}" "NoRepair" 1 + WriteRegStr SHCTX "${VIKING_UNINSTALL_KEY}" "UninstallString" "$INSTDIR\${VIKING_UNINST_EXE}" + + ; Copy only specific items as now some components (e.g. GPSBabel) are optional. + ; This is mostly to get a more accurate install size value (especially as saved into the registry) + File ${BINARIES}\viking* + File ${BINARIES}\g*.exe + File ${BINARIES}\*.dll + File ${BINARIES}\*.txt + File ${BINARIES}\magic.mgc + File /r ${BINARIES}\data + File /r ${BINARIES}\locale + File /r ${BINARIES}\share + File /r ${BINARIES}\lib + + ; Estimate install size based on files in $INSTDIR + ${GetSize} "$INSTDIR" "/S=0K" $0 $1 $2 + IntFmt $0 "0x%08X" $0 + WriteRegDWORD SHCTX "${VIKING_UNINSTALL_KEY}" "EstimatedSize" "$0" + + ; If we don't have install rights we're done + StrCmp $R0 "NONE" done + SetOverwrite off + + ; write out uninstaller + SetOverwrite on + WriteUninstaller "$INSTDIR\${VIKING_UNINST_EXE}" + SetOverwrite off + + ; Always associate Viking file type + ${registerExtension} "$INSTDIR\viking.exe" ".vik" "Viking File" + done: +SectionEnd ; end of default Viking section + +;-------------------------------- +;Shortcuts + +SectionGroup /e $(VIKING_SHORTCUTS_SECTION_TITLE) SecShortcuts + ;Desktop shortcuts + Section /o $(VIKING_DESKTOP_SHORTCUT_SECTION_TITLE) SecDesktopShortcut + SetOverwrite on + CreateShortCut "$DESKTOP\Viking.lnk" "$INSTDIR\viking.exe" + SetOverwrite off + SectionEnd + ;Start menu shortcuts + Section $(VIKING_STARTMENU_SHORTCUT_SECTION_TITLE) SecStartMenuShortcut + SetOverwrite on + CreateDirectory "$SMPROGRAMS\Viking" + CreateShortCut "$SMPROGRAMS\Viking\Viking.lnk" "$INSTDIR\viking.exe" + CreateShortCut "$SMPROGRAMS\Viking\User Manual.lnk" "$INSTDIR\viking.pdf" + CreateShortCut "$SMPROGRAMS\Viking\Uninstall.lnk" "$INSTDIR\viking-uninst.exe" + SetOverwrite off + SectionEnd +SectionGroupEnd + +;-------------------------------- +;File association + +Section $(VIKING_FILE_ASSOCIATION_SECTION_TITLE) SecFileAssociation + ${registerExtension} "$INSTDIR\viking.exe" ".gpx" "GPX File" +SectionEnd + +;-------------------------------- +; GPSBabel Install Section +; +Section $(VIKING_GPSBABEL_SECTION_TITLE) SecGPSBabel + File "${BINARIES}\Optional\GPSBabel-1.5.4-Setup.exe" + ExecWait '"$INSTDIR\GPSBabel-1.5.4-Setup.exe" /SILENT' + Delete "$INSTDIR\GPSBabel-1.5.4-Setup.exe" +SectionEnd + +;-------------------------------- +;Uninstaller Section + + +Section Uninstall + Call un.CheckUserInstallRights + Pop $R0 + StrCmp $R0 "NONE" no_rights + StrCmp $R0 "HKCU" try_hkcu try_hklm + + try_hkcu: + ReadRegStr $R0 HKCU ${VIKING_REG_KEY} "" + StrCmp $R0 $INSTDIR 0 cant_uninstall + ; HKCU install path matches our INSTDIR so uninstall + DeleteRegKey HKCU ${VIKING_REG_KEY} + DeleteRegKey HKCU "${VIKING_UNINSTALL_KEY}" + Goto cont_uninstall + + try_hklm: + ReadRegStr $R0 HKLM ${VIKING_REG_KEY} "" + StrCmp $R0 $INSTDIR 0 try_hkcu + ; HKLM install path matches our INSTDIR so uninstall + DeleteRegKey HKLM ${VIKING_REG_KEY} + DeleteRegKey HKLM "${VIKING_UNINSTALL_KEY}" + DeleteRegKey HKLM "${HKLM_APP_PATHS_KEY}" + ; Sets start menu and desktop scope to all users.. + SetShellVarContext "all" + + cont_uninstall: + + ; http://nsis.sourceforge.net/Docs/Chapter4.html + ; Don't use: + ;RMDir /r "$INSTDIR" + ; Warning: is not safe. Can delete entire Program Files directory! + + ; TODO try this method instead: + ; http://nsis.sourceforge.net/Uninstall_only_installed_files + + ; Specific remove files + ; Thus alsos leaves any files the user has saved (particularly .vik or .gpx) into the Viking directory + Delete "$INSTDIR\viking-cache.py" + Delete "$INSTDIR\viking.pdf" + Delete "$INSTDIR\viking_icon.ico" + Delete "$INSTDIR\*.exe" + Delete "$INSTDIR\*.dll" + Delete "$INSTDIR\*.txt" + Delete "$INSTDIR\magic.mgc" + Delete "$INSTDIR\data\*txt" + Delete "$INSTDIR\data\*xml" + RMDir "$INSTDIR\data" + RMDir /r "$INSTDIR\locale" + RMDir /r "$INSTDIR\lib" + RMDir /r "$INSTDIR\share" + RMDir "$INSTDIR" + + ; Shortcuts.. + Delete "$DESKTOP\Viking.lnk" + + ; File association + ${unregisterExtension} ".vik" "Viking File" + ${unregisterExtension} ".gpx" "GPX File" + + Goto done + + cant_uninstall: + MessageBox MB_OK $(un.VIKING_UNINSTALL_ERROR_1) /SD IDOK + Quit + + no_rights: + MessageBox MB_OK $(un.VIKING_UNINSTALL_ERROR_2) /SD IDOK + Quit + + done: +SectionEnd ; end of uninstall section + +;-------------------------------- +;Descriptions +!insertmacro MUI_FUNCTION_DESCRIPTION_BEGIN + + !insertmacro MUI_DESCRIPTION_TEXT ${SecViking} \ + $(VIKING_SECTION_DESCRIPTION) + !insertmacro MUI_DESCRIPTION_TEXT ${SecShortcuts} \ + $(VIKING_SHORTCUTS_SECTION_DESCRIPTION) + !insertmacro MUI_DESCRIPTION_TEXT ${SecDesktopShortcut} \ + $(VIKING_DESKTOP_SHORTCUT_DESC) + !insertmacro MUI_DESCRIPTION_TEXT ${SecStartMenuShortcut} \ + $(VIKING_STARTMENU_SHORTCUT_DESC) + !insertmacro MUI_DESCRIPTION_TEXT ${SecFileAssociation} \ + $(VIKING_FILE_ASSOCIATION_DESC) + !insertmacro MUI_DESCRIPTION_TEXT ${SecGPSBabel} \ + $(VIKING_INSTALL_GPSBABEL_DESC) + +!insertmacro MUI_FUNCTION_DESCRIPTION_END + +;-------------------------------- +;Functions + +;Macro to determine user install rights +;Will be used to determine where to install the program, shortcuts, ... +!macro CheckUserInstallRightsMacro UN +Function ${UN}CheckUserInstallRights + Push $0 + Push $1 + ClearErrors + UserInfo::GetName + IfErrors Win9x + Pop $0 + UserInfo::GetAccountType + Pop $1 + + StrCmp $1 "Admin" 0 +3 + StrCpy $1 "HKLM" + Goto done + StrCmp $1 "Power" 0 +3 + StrCpy $1 "HKLM" + Goto done + StrCmp $1 "User" 0 +3 + StrCpy $1 "HKCU" + Goto done + StrCmp $1 "Guest" 0 +3 + StrCpy $1 "NONE" + Goto done + ; Unknown error + StrCpy $1 "NONE" + Goto done + + Win9x: + StrCpy $1 "HKLM" + + done: + Exch $1 + Exch + Pop $0 +FunctionEnd +!macroend +!insertmacro CheckUserInstallRightsMacro "" +!insertmacro CheckUserInstallRightsMacro "un." + +;Macro to determine if Viking is running before installation/unistallation +!macro RunCheckMacro UN +Function ${UN}RunCheck + FindProcDLL::FindProc "viking.exe" + IntCmp $R0 1 0 notRunning + MessageBox MB_OK|MB_ICONEXCLAMATION $(VIKING_IS_RUNNING) /SD IDOK + Abort + notRunning: +FunctionEnd +!macroend + +;!insertmacro RunCheckMacro "" +;!insertmacro RunCheckMacro "un." + +;Installer extra configuration at execution time: language, path, ... +Function .onInit + ;Check if viking installer is already running + Push $R0 + Push $R1 + Push $R2 + + ;Check if viking is running + ;Call RunCheck + StrCpy $name "Viking ${VIKING_VERSION}" + + ClearErrors + ;Make sure that there was a previous installation + ReadRegStr $R0 HKCU "${VIKING_REG_KEY}" "Installer Language" + + ;Preselect the "shortcuts" checkboxes according to the previous installation + !insertmacro SelectSection ${SecDesktopShortcut} + !insertmacro selectSection ${SecStartMenuShortcut} + + ;Read command line parameters + + ;Read language command line parameters + ${GetParameters} $R0 + ClearErrors + ${GetOptions} "$R0" "/L=" $R1 + IfErrors +3 + StrCpy $LANGUAGE $R1 + Goto skip_lang + + ; Select Language + ; Display Language selection dialog + !insertmacro MUI_LANGDLL_DISPLAY + skip_lang: + + ;Read desktop shortcut command line options + ClearErrors + ${GetOptions} "$R0" "/DS=" $R1 + IfErrors +8 + SectionGetFlags ${SecDesktopShortcut} $R2 + StrCmp "1" $R1 0 +2 + IntOp $R2 $R2 | ${SF_SELECTED} + StrCmp "0" $R1 0 +3 + IntOp $R1 ${SF_SELECTED} ~ + IntOp $R2 $R2 & $R1 + SectionSetFlags ${SecDesktopShortcut} $R2 + + ;Read start menu shortcuts command line options + ClearErrors + ${GetOptions} "$R0" "/SMS=" $R1 + IfErrors +8 + SectionGetFlags ${SecStartMenuShortcut} $R2 + StrCmp "1" $R1 0 +2 + IntOp $R2 $R2 | ${SF_SELECTED} + StrCmp "0" $R1 0 +3 + IntOp $R1 ${SF_SELECTED} ~ + IntOp $R2 $R2 & $R1 + SectionSetFlags ${SecStartMenuShortcut} $R2 + + ; If install path was set on the command, use it. + StrCmp $INSTDIR "" 0 instdir_done + + ; If viking is currently installed, we should default to where it is currently installed + ClearErrors + ReadRegStr $INSTDIR HKCU "${VIKING_REG_KEY}" "" + IfErrors +2 + StrCmp $INSTDIR "" 0 instdir_done + ClearErrors + ReadRegStr $INSTDIR HKLM "${VIKING_REG_KEY}" "" + IfErrors +2 + StrCmp $INSTDIR "" 0 instdir_done + + Call CheckUserInstallRights + Pop $R0 + + StrCmp $R0 "HKLM" 0 user_dir + ${If} ${RunningX64} + StrCpy $INSTDIR "$PROGRAMFILES64\Viking" + ${Else} + StrCpy $INSTDIR "$PROGRAMFILES\Viking" ; $PROGRAMFILES32 also works + ${EndIf} + Goto instdir_done + user_dir: + Push $SMPROGRAMS + ${GetParent} $SMPROGRAMS $R2 + ${GetParent} $R2 $R2 + StrCpy $INSTDIR "$R2\Viking" + + instdir_done: +;LogSet on + Pop $R2 + Pop $R1 + Pop $R0 +FunctionEnd + +Function un.onInit + ;Check if viking is running + ;Call un.RunCheck + StrCpy $name "Viking ${VIKING_VERSION}" + + ; Get stored language preference + !insertmacro MUI_UNGETLANGUAGE + +FunctionEnd diff --git a/windows/make.bat b/windows/make.bat new file mode 100644 index 0000000..e908d6e --- /dev/null +++ b/windows/make.bat @@ -0,0 +1,13 @@ +:: License: CC0 +:: Standard build +set PATH=%PATH%;%SystemDrive%\MinGW\bin;%SystemDrive%\msys\1.0\bin + +:: The icon needs creating first as it will get embedded in the generated executable +echo Create Icon +pushd installer\pixmaps +windres.exe viking_icon.rc -o viking_icon.o +popd + +:: Change to root directory and build +cd .. +make %* diff --git a/windows/prepare.bat b/windows/prepare.bat new file mode 100644 index 0000000..34b8ca4 --- /dev/null +++ b/windows/prepare.bat @@ -0,0 +1,618 @@ +@echo OFF +:: License: CC0 +:: +:: Setup wget first - this has to be done manually +:: http://gnuwin32.sourceforge.net/packages/wget.htm +:: http://downloads.sourceforge.net/gnuwin32/wget-1.11.4-1-setup.exe +:: +:: Simple script to check required built environment in default locations +:: Versions downloaded are specified absolutely as otherwise it's tricky to try and work out the latest/stable version +:: In principal the idea is to try and automate the process as much as possible +:: +set PATH=%PATH%;%ProgramFiles%\GnuWin32\bin + +set MINGW=%SystemDrive%\MinGW +set MINGW_BIN=%MinGW%\bin + +set ERRORLEVEL=0 + +if not exist cache mkdir cache +pushd cache + +:: We need a program to be able to extract not only zips, but bz2 and *lzma* +set PATH=%PATH%;%ProgramFiles%\7-Zip +echo =+=+= +echo Checking 7Zip is Available... +echo =+=+= +set ZIP_INST=7z920.exe +if not exist "%ProgramFiles%\7-Zip\7z.exe" ( + call :Download %ZIP_INST% http://downloads.sourceforge.net/sevenzip/%ZIP_INST% + %ZIP_INST% /S + if ERRORLEVEL 1 goto Error +) + +echo =+=+= +echo Checking mingw... +echo =+=+= +set MINGW_BASE_URL=http://sourceforge.net/projects/mingw/files/MinGW/Base +set BIN_UTILS_LZ=binutils-2.23.2-1-mingw32-bin.tar.lzma +set BIN_UTILS_URL=%MINGW_BASE_URL%/binutils/binutils-2.23.2-1/%BIN_UTILS_LZ%/download +::GCC dependencies:: +set MPC_DEV_LZ=mpc-1.0.1-2-mingw32-dev.tar.lzma +set MPC_DEV_URL=%MINGW_BASE_URL%/mpc/mpc-1.0.1-2/%MPC_DEV_LZ%/download +set MPC_DLL_LZ=mpc-1.0.1-2-mingw32-dll.tar.lzma +set MPC_DLL_URL=%MINGW_BASE_URL%/mpc/mpc-1.0.1-2/%MPC_DLL_LZ%/download +set MPFR_DEV_LZ=mpfr-3.1.2-2-mingw32-dev.tar.lzma +set MPFR_DEV_URL=%MINGW_BASE_URL%/mpfr/mpfr-3.1.2-2/%MPFR_DEV_LZ%/download +set MPFR_DLL_LZ=mpfr-3.1.2-2-mingw32-dll.tar.lzma +set MPFR_DLL_URL=%MINGW_BASE_URL%/mpfr/mpfr-3.1.2-2/%MPFR_DLL_LZ%/download +set GMP_DEV_LZ=gmp-5.1.2-1-mingw32-dev.tar.lzma +set GMP_DEV_URL=%MINGW_BASE_URL%/gmp/gmp-5.1.2/%GMP_DEV_LZ%/download +set GMP_DLL_LZ=gmp-5.1.2-1-mingw32-dll.tar.lzma +set GMP_DLL_URL=%MINGW_BASE_URL%/gmp/gmp-5.1.2/%GMP_DLL_LZ%/download +set PTHREADS_DEV_LZ=pthreads-w32-2.9.1-1-mingw32-dev.tar.lzma +set PTHREADS_DEV_URL=%MINGW_BASE_URL%/pthreads-w32/pthreads-w32-2.9.1/%PTHREADS_DEV_LZ%/download +set PTHREADS_DLL_LZ=pthreads-w32-2.9.1-1-mingw32-dll.tar.lzma +set PTHREADS_DLL_URL=%MINGW_BASE_URL%/pthreads-w32/pthreads-w32-2.9.1/%PTHREADS_DLL_LZ%/download +set ICONV_DEV_LZ=libiconv-1.14-3-mingw32-dev.tar.lzma +set ICONV_DEV_URL=%MINGW_BASE_URL%/libiconv/libiconv-1.14-3/%ICONV_DEV_LZ%/download +set ICONV_DLL_LZ=libiconv-1.14-3-mingw32-dll.tar.lzma +set ICONV_DLL_URL=%MINGW_BASE_URL%/libiconv/libiconv-1.14-3/%ICONV_DLL_LZ%/download +set GCC_CORE_BIN_LZ=gcc-core-4.8.1-4-mingw32-bin.tar.lzma +set GCC_CORE_BIN_URL=%MINGW_BASE_URL%/gcc/Version4/gcc-4.8.1-4/%GCC_CORE_BIN_LZ%/download +set GCC_CORE_DEV_LZ=gcc-core-4.8.1-4-mingw32-dev.tar.lzma +set GCC_CORE_DEV_URL=%MINGW_BASE_URL%/gcc/Version4/gcc-4.8.1-4/%GCC_CORE_DEV_LZ%/download +set GCC_CORE_DLL_LZ=gcc-core-4.8.1-4-mingw32-dll.tar.lzma +set GCC_CORE_DLL_URL=%MINGW_BASE_URL%/gcc/Version4/gcc-4.8.1-4/%GCC_CORE_DLL_LZ%/download +set MINGWRTDLL_LZ=mingwrt-4.0.3-1-mingw32-dll.tar.lzma +set MINGWRTDLL_URL=%MINGW_BASE_URL%/mingw-rt/mingwrt-4.0.3/%MINGWRTDLL_LZ%/download +set MINGWRTDEV_LZ=mingwrt-4.0.3-1-mingw32-dev.tar.lzma +set MINGWRTDEV_URL=%MINGW_BASE_URL%/mingw-rt/mingwrt-4.0.3/%MINGWRTDEV_LZ%/download +set W32API_LZ=w32api-4.0.3-1-mingw32-dev.tar.lzma +set W32API_URL=%MINGW_BASE_URL%/w32api/w32api-4.0.3/%W32API_LZ%/download +set ZLIB_LZ=zlib-1.2.8-1-mingw32-dll.tar.lzma +set ZLIB_URL=%MINGW_BASE_URL%/zlib/zlib-1.2.8/%ZLIB_LZ%/download +set GETTEXT_LZ=gettext-0.18.3.1-1-mingw32-dll.tar.lzma +set GETTEXT_URL=%MINGW_BASE_URL%/gettext/gettext-0.18.3.1-1/%GETTEXT_LZ%/download + +set GCC-CPP_BIN_LZ=gcc-c++-4.8.1-4-mingw32-bin.tar.lzma +set GCC-CPP_BIN_URL=%MINGW_BASE_URL%/gcc/Version4/gcc-4.8.1-4/%GCC-CPP_BIN_LZ%/download +set GCC-CPP_DEV_LZ=gcc-c++-4.8.1-4-mingw32-dev.tar.lzma +set GCC-CPP_DEV_URL=%MINGW_BASE_URL%/gcc/Version4/gcc-4.8.1-4/%GCC-CPP_DEV_LZ%/download +set GCC-CPP_DLL_LZ=gcc-c++-4.8.1-4-mingw32-dll.tar.lzma +set GCC-CPP_DLL_URL=%MINGW_BASE_URL%/gcc/Version4/gcc-4.8.1-4/%GCC-CPP_DLL_LZ%/download + +if not exist "%MINGW_BIN%" ( + :: Here we download all default components manually in an attempt to get autoinstall to work... + call :Download "%BIN_UTILS_LZ%" "%BIN_UTILS_URL%" + call :InstallLZMA "%BIN_UTILS_LZ%" + + call :Download "%MPC_DLL_LZ%" "%MPC_DLL_URL%" + call :InstallLZMA "%MPC_DLL_LZ%" + + call :Download "%MPC_DEV_LZ%" "%MPC_DEV_URL%" + call :InstallLZMA "%MPC_DEV_LZ%" + + call :Download "%MPFR_DLL_LZ%" "%MPFR_DLL_URL%" + call :InstallLZMA "%MPFR_DLL_LZ%" + + call :Download "%MPFR_DEV_LZ%" "%MPFR_DEV_URL%" + call :InstallLZMA "%MPFR_DEV_LZ%" + + call :Download "%GMP_DEV_LZ%" "%GMP_DEV_URL%" + call :InstallLZMA "%GMP_DEV_LZ%" + + call :Download "%GMP_DLL_LZ%" "%GMP_DLL_URL%" + call :InstallLZMA "%GMP_DLL_LZ%" + + call :Download "%PTHREADS_DLL_LZ%" "%PTHREADS_DLL_URL%" + call :InstallLZMA "%PTHREADS_DLL_LZ%" + + call :Download "%PTHREADS_DEV_LZ%" "%PTHREADS_DEV_URL%" + call :InstallLZMA "%PTHREADS_DEV_LZ%" + + call :Download "%ICONV_DEV_LZ%" "%ICONV_DEV_URL%" + call :InstallLZMA "%ICONV_DEV_LZ%" + + call :Download "%ICONV_DLL_LZ%" "%ICONV_DLL_URL%" + call :InstallLZMA "%ICONV_DLL_LZ%" + + call :Download "%GCC_CORE_DEV_LZ%" "%GCC_CORE_DEV_URL%" + call :InstallLZMA "%GCC_CORE_DEV_LZ%" + + call :Download "%GCC_CORE_DLL_LZ%" "%GCC_CORE_DLL_URL%" + call :InstallLZMA "%GCC_CORE_DLL_LZ%" + + call :Download "%GCC_CORE_BIN_LZ%" "%GCC_CORE_BIN_URL%" + call :InstallLZMA "%GCC_CORE_BIN_LZ%" + + call :Download "%MINGWRTDEV_LZ%" "%MINGWRTDEV_URL%" + call :InstallLZMA "%MINGWRTDEV_LZ%" + + call :Download "%MINGWRTDLL_LZ%" "%MINGWRTDLL_URL%" + call :InstallLZMA "%MINGWRTDLL_LZ%" + + call :Download "%W32API_LZ%" "%W32API_URL%" + call :InstallLZMA "%W32API_LZ%" + + call :Download "%ZLIB_LZ%" "%ZLIB_URL%" + call :InstallLZMA "%ZLIB_LZ%" + + call :Download "%GETTEXT_LZ%" "%GETTEXT_URL%" + call :InstallLZMA "%GETTEXT_LZ%" + + REM Seems '+' in the filename screws things up for script function calls :( + REM call :Download "%GCC_CPP_DEV_LZ%" "%GCC_CPP_DEV_URL%" + REM call :InstallLZMA "%GCC_CPP_DEV_LZ%" + + REM call :Download "%GCC_CPP_DLL_LZ%" "%GCC_CPP_DLL_URL%" + REM call :InstallLZMA "%GCC_CPP_DLL_LZ%" + + REM call :Download "%GCC_CPP_BIN_LZ%" "%GCC_CPP_BIN_URL%" + REM call :InstallLZMA "%GCC_CPP_BIN_LZ%" + + REM Do it every time... + wget http://sourceforge.net/projects/mingw/files/MinGW/Base/gcc/Version4/gcc-4.8.1-4/gcc-c++-4.8.1-4-mingw32-bin.tar.lzma/download + wget http://sourceforge.net/projects/mingw/files/MinGW/Base/gcc/Version4/gcc-4.8.1-4/gcc-c++-4.8.1-4-mingw32-dev.tar.lzma/download + wget http://sourceforge.net/projects/mingw/files/MinGW/Base/gcc/Version4/gcc-4.8.1-4/gcc-c++-4.8.1-4-mingw32-dll.tar.lzma/download + 7z e gcc-c++-4.8.1-4-mingw32-bin.tar.lzma + 7z e gcc-c++-4.8.1-4-mingw32-dev.tar.lzma + 7z e gcc-c++-4.8.1-4-mingw32-dll.tar.lzma + 7z x gcc-c++-4.8.1-4-mingw32-bin.tar -o"%MinGW%" -y + 7z x gcc-c++-4.8.1-4-mingw32-dev.tar -o"%MinGW%" -y + 7z x gcc-c++-4.8.1-4-mingw32-dll.tar -o"%MinGW%" -y +) + +echo =+=+= +echo Checking MSYS... +echo =+=+= +set MSYS_EXE=MSYS-1.0.11.exe +if not exist "%SystemDrive%\msys" ( + if not exist %MSYS_EXE% ( + wget http://downloads.sourceforge.net/mingw/%MSYS_EXE% + ) + if not [%WINELOADERNOEXEC%]==[] ( + echo Running under WINE - Requires MSYS install fixes: run msys-pi-wine.sh when msys install halts..." + echo Ctrl-C to stop and then rerun the installation if necessary + ) + %MSYS_EXE% /sp- /silent + if ERRORLEVEL 1 goto Error +) + +:: +echo =+=+= +echo Checking gtk+-bundle... +echo =+=+= +set GTK_ZIP=gtk+-bundle_2.24.10-20120208_win32.zip +if not exist "%MINGW_BIN%\gtk-update-icon-cache.exe" ( + call :Download %GTK_ZIP% http://ftp.gnome.org/pub/gnome/binaries/win32/gtk+/2.24/%GTK_ZIP% + 7z x %GTK_ZIP% -o"%MinGW%" -y + if ERRORLEVEL 1 goto Error +) + +set EXPAT_ZIP=expat-dev_2.0.1-1_win32.zip +echo =+=+= +echo Checking expat-dev... +echo =+=+= +if not exist "%MINGW%\include\expat.h" ( + call :Download %EXPAT_ZIP% http://ftp.gnome.org/pub/gnome/binaries/win32/dependencies/%EXPAT_ZIP% + 7z x %EXPAT_ZIP% -o"%MinGW%" + if ERRORLEVEL 1 goto Error +) + +::set GTT_ZIP=gettext-tools-dev_0.18.1.1-2_win32.zip +::echo =+=+= +::echo Checking gettext-tools-dev... +::echo =+=+= +::if not exist "%MINGW_BIN%\libgettextlib-0-18-1.dll" ( +:: if not exist %GTT_ZIP% ( +:: wget http://ftp.gnome.org/pub/gnome/binaries/win32/dependencies/%GTT_ZIP% +:: ) +:: 7z x -y %GTT_ZIP% -o"%MinGW%" +:: if ERRORLEVEL 1 goto Error +::) + +echo =+=+= +echo Checking intltool... +echo =+=+= +set INTLTOOL_ZIP=intltool_0.40.4-1_win32.zip +if not exist "%MINGW_BIN%\intltoolize" ( + call :Download %INTLTOOL_ZIP% http://ftp.acc.umu.se/pub/GNOME/binaries/win32/intltool/0.40/%INTLTOOL_ZIP% + 7z x %INTLTOOL_ZIP% -o"%MinGW%" + if ERRORLEVEL 1 goto Error +) + +echo =+=+= +echo Checking iconv... +echo =+=+= +set ICONV_ZIP=libiconv-1.9.2-1-bin.zip +if not exist "%MINGW_BIN%\iconv.exe" ( + call :Download %ICONV_ZIP% http://sourceforge.net/projects/gnuwin32/files/libiconv/1.9.2-1/%ICONV_ZIP% + 7z x -y %ICONV_ZIP% -o"%MinGW%" + if ERRORLEVEL 1 goto Error +) + +echo =+=+= +echo Checking libintl... +echo =+=+= +:: Needed by iconv +set LIBINTL_ZIP=libintl-0.14.4-bin.zip +if not exist "%MINGW_BIN%\libintl3.dll" ( + call :Download %LIBINTL_ZIP% http://sourceforge.net/projects/gnuwin32/files/libintl/0.14.4/%LIBINTL_ZIP% + 7z x -y %LIBINTL_ZIP% -o"%MinGW%" + if ERRORLEVEL 1 goto Error +) + +echo =+=+= +echo Checking gettext tools... +echo =+=+= +:: Needed by intltool +set GETTEXT_BIN_LZ=gettext-0.18.3.1-1-mingw32-bin.tar.lzma +set GETTEXT_BIN_URL=%MINGW_BASE_URL%/gettext/gettext-0.18.3.1-1/%GETTEXT_BIN_LZ%/download +if not exist "%MINGW_BIN%\xgettext.exe" ( + call :Download %GETTEXT_BIN_LZ% %GETTEXT_BIN_URL% + call :InstallLZMA "%GETTEXT_BIN_LZ%" +) + +echo =+=+= +echo Checking libcurl... +echo =+=+= +REM Win32 - Generic - http://curl.haxx.se/download.html +set CURL=curl-7.34.0-devel-mingw32 +set CURL_ZIP=%CURL%.zip +if not exist "%MINGW_BIN%\libcurl.dll" ( + call :Download %CURL_ZIP% http://curl.haxx.se/gknw.net/7.34.0/dist-w32/%CURL_ZIP% + echo Extracting libcurl... + 7z x -y %CURL_ZIP% -o"libcurl" + if ERRORLEVEL 1 goto Error + @echo ON + xcopy /S /Y libcurl\%CURL%\include\*.* "%MinGW%\include" + xcopy /S /Y libcurl\%CURL%\bin\*.* "%MinGW_BIN%" + xcopy /S /Y libcurl\%CURL%\lib\*.a "%MinGW%\lib" + copy /Y libcurl\%CURL%\COPYING "%MinGW%\COPYING_curl.txt" + rmdir /S /Q libcurl + @echo OFF +) + +echo =+=+= +echo Checking libexif... +echo =+=+= +set EXIF=libexif-0.6.21.1_winxp_mingw +set EXIF_7Z=%EXIF%.7z +if not exist "%MINGW_BIN%\libexif-12.dll" ( + :: Space in URL so function call doesn't work ATM + ::call :Download %EXIF_7Z% "http://sourceforge.net/projects/maille/files/Extern libs/%EXIF_7Z%/download" + if not exist "%EXIF_7Z%" ( + wget "http://sourceforge.net/projects/maille/files/Extern libs/%EXIF_7Z%/download" + if ERRORLEVEL 1 goto Error + ) + + echo Extracting libexif... + 7z x %EXIF_7Z% + if ERRORLEVEL 1 goto Error + + echo Using xcopy to get all subdirs of libexif into place... + @echo ON + xcopy /Y /S %EXIF%\*.* "%MinGW%" + rmdir /S /Q %EXIF% + @echo OFF +) + +echo =+=+= +echo Checking libstdc++... +echo =+=+= +set STDCPP_TAR=gcc-c++-4.8.1-4-mingw32-dll.tar +set STDCPP_LZ=%STDCPP_TAR%.lzma +if not exist "%MINGW_BIN%\libstdc++-6.dll" ( + call :Download "%STDCPP_LZ%" "http://sourceforge.net/projects/mingw/files/MinGW/Base/gcc/Version4/gcc-4.8.1-4/%STDCPP_LZ%/download" + call :InstallLZMA "%STDCPP_LZ%" +) + +echo =+=+= +echo Checking libbz2 header... +echo =+=+= +set BZ2_TAR=bzip2-1.0.6-4-mingw32-dev.tar +set BZ2_LZ=%BZ2_TAR%.lzma +if not exist "%MINGW%\include\bzlib.h" ( + call :Download %BZ2_LZ% "http://sourceforge.net/projects/mingw/files/MinGW/Extension/bzip2/bzip2-1.0.6-4/%BZ2_LZ%" + call :InstallLZMA "%BZ2_LZ%" +) + +echo =+=+= +echo Checking libbz2... +echo =+=+= +set BZ2DLL_TAR=libbz2-1.0.6-4-mingw32-dll-2.tar +set BZ2DLL_LZ=%BZ2DLL_TAR%.lzma +if not exist "%MINGW_BIN%\libbz2-2.dll" ( + call :Download %BZ2DLL_LZ% "http://sourceforge.net/projects/mingw/files/MinGW/Extension/bzip2/bzip2-1.0.6-4/%BZ2DLL_LZ%" + call :InstallLZMA "%BZ2DLL_LZ%" +) + +echo =+=+= +echo Checking magic dev... +echo =+=+= +set MAGIC_ZIP=file-5.03-lib.zip +if not exist "%MINGW%\include\magic.h" ( + call :Download %MAGIC_ZIP% http://downloads.sourceforge.net/gnuwin32/%MAGIC_ZIP% + 7z x %MAGIC_ZIP% -o"%MinGW%" + if ERRORLEVEL 1 goto Error +) + +echo =+=+= +echo Checking magic DLL... +echo =+=+= +set MAGICDLL_ZIP=file-5.03-bin.zip +if not exist "%MINGW_BIN%\magic1.dll" ( + call :Download %MAGICDLL_ZIP% http://downloads.sourceforge.net/gnuwin32/%MAGICDLL_ZIP% + 7z x %MAGICDLL_ZIP% -o"%MinGW%" + if ERRORLEVEL 1 goto Error +) + +echo =+=+= +echo Checking regex DLL (required by magic)... +echo =+=+= +set REGDLL_ZIP=regex-2.7-bin.zip +if not exist "%MINGW_BIN%\regex2.dll" ( + call :Download %REGDLL_ZIP% http://downloads.sourceforge.net/gnuwin32/%REGDLL_ZIP% + 7z x %REGDLL_ZIP% -o"%MinGW%" + if ERRORLEVEL 1 goto Error +) + +echo =+=+= +echo Checking SQLite dev... +echo =+=+= +set SQL_ZIP=sqlite-amalgamation-3080002.zip +if not exist "%MINGW%\include\sqlite3.h" ( + call :Download %SQL_ZIP% http://www.sqlite.org/2013/%SQL_ZIP% + 7z x %SQL_ZIP% + if ERRORLEVEL 1 goto Error + copy /Y sqlite-amalgamation-3080002\s* "%MinGW%\include" + rmdir /S /Q sqlite-amalgamation-3080002 +) + +echo =+=+= +echo Checking SQL DLL... +echo =+=+= +set SQLDLL_ZIP=sqlite-dll-win32-x86-3080002.zip +if not exist "%MINGW_BIN%\sqlite3.dll" ( + call :Download %SQLDLL_ZIP% http://www.sqlite.org/2013/%SQLDLL_ZIP% + 7z x %SQLDLL_ZIP% -o"%MinGW_BIN%" + if ERRORLEVEL 1 goto Error + REM Annoyingly SQL doesn't come with a .lib file so have to generate it ourselves: + REM Possibly need to insert the line 'LIBRARY sqlite3.dll' at the beginning of the def file? + REM but this may not be needed as the --dllname option may suffice + set PATH=%PATH%;%MinGW_BIN% + dlltool.exe -d %MinGW_BIN%\sqlite3.def --dllname %MinGW_BIN%\sqlite3.dll -l %MinGW%\lib\sqlite3.lib + if ERRORLEVEL 1 goto Error +) + + +echo =+=+= +echo Mapnik... +echo =+=+= +set MAPNIK_ZIP=mapnik-win-sdk-v2.2.0.zip +set MAPNIK_URL=http://mapnik.s3.amazonaws.com/dist/v2.2.0/%MAPNIK_ZIP% +if not exist "%MINGW_BIN%\mapnik.dll" ( + call :Download "%MAPNIK_ZIP%" "%MAPNIK_URL%" + 7z x %MAPNIK_ZIP% + if ERRORLEVEL 1 goto Error + copy /Y mapnik-v2.2.0\include\* "%MinGW%\include" + copy /Y mapnik-v2.2.0\lib\*.lib "%MinGW%\lib\" + copy /Y mapnik-v2.2.0\lib\*.dll "%MinGW%\bin" + copy /Y mapnik-v2.2.0\lib\mapnik\input "\" + rmdir /S /Q mapnik-v2.2.0 + REM Mapnik 2.2.0 seems to ship with a unicode copy which is missing ptypes.h + REM Copy headers from a known good version... + REM See fix in calling shell script when using wine +) + +:: +:: Ideally building the code on Windows shouldn't need Doc Utils or the Help processor stuff +:: But ATM it's too hard to avoid. +:: +echo =+=+= +echo Checking Gnome Doc Utils... +echo =+=+= +set GNOME_DOC_ZIP=gnome-doc-utils-0.12.0.zip +if not exist "%MINGW_BIN%\gnome-doc-prepare" ( + call :Download %GNOME_DOC_ZIP% http://ftp.gnome.org/pub/gnome/binaries/win32/gnome-doc-utils/0.12/%GNOME_DOC_ZIP% + echo Extracting Gnome Doc Utils... + 7z x %GNOME_DOC_ZIP% -o"%MinGW%" + if ERRORLEVEL 1 goto Error +) + +echo =+=+= +echo Checking xsltproc... +echo =+=+= +set XLST=libxslt-1.1.26.win32 +set XLST_ZIP=%XLST%.zip +if not exist "%MINGW_BIN%\xsltproc.exe" ( + call :Download %XLST_ZIP% ftp://ftp.zlatkovic.com/libxml/%XLST_ZIP% + echo Extracting XLST... + 7z x %XLST_ZIP% + xcopy /Y /S "%XLST%\bin\*" "%MinGW_BIN%" + if ERRORLEVEL 1 goto Error + rmdir /Q /S %XLST% +) + +echo =+=+= +echo Checking xmllint... +echo =+=+= +set XML2=libxml2-2.7.8.win32 +set XML2_ZIP=%XML2%.zip +if not exist "%MINGW_BIN%\xmllint.exe" ( + call :Download %XML2_ZIP% ftp://ftp.zlatkovic.com/libxml/%XML2_ZIP% + echo Extracting xmllint... + 7z x %XML2_ZIP% + xcopy /Y /S "%XML2%\bin\*" "%MinGW_BIN%" + if ERRORLEVEL 1 goto Error + rmdir /Q /S %XML2% +) + +echo =+=+= +echo Checking iconv... +echo =+=+= +set ICONV=iconv-1.9.2.win32 +set ICONV_ZIP=%ICONV%.zip +if not exist "%MINGW_BIN%\iconv.dll" ( + call :Download %ICONV_ZIP% ftp://ftp.zlatkovic.com/libxml/%ICONV_ZIP% + echo Extracting iconv... + 7z x %ICONV_ZIP% + xcopy /Y /S "%ICONV%\bin\*" "%MinGW_BIN%" + if ERRORLEVEL 1 goto Error + rmdir /Q /S %ICONV% +) + + +echo =+=+= +echo Checking libzip... +echo =+=+= +REM Originally planned to extract from an existing MINGW32 RPM, +REM which worked OK to compile+link but Viking did not run up after install +REM I think the dll is linked to a different gcc runtime +set LIBZIP=mingw32-libzip-1.0.1-3 +set LIBZIP_RPM=mingw32-libzip-1.0.1-3.fc24.noarch.rpm +if not exist "%MINGW_BIN%\libzip.dll" ( + echo MANUALLY NEED TO ACQUIRE AND INSTALL LIBZIP + EXIT +REM Instead build libzip from source +REM http://www.nih.at/libzip/ - download latest source (31d625ae55b5 on 16/11/15) +REM Use CMake (v3.4.0) on Windows +REM wine cmd +REM set CC=gcc +REM set PATH=%PATH%;%SystemDrive%\Mingw\bin +REM cmake -DCMAKE_C_COMPILER:FILEPATH='gcc' -G "MSYS Makefiles" . +REM set PATH=%PATH%;%SystemDrive%\msys\1.0\bin +REM make +REM (needed to fix zipint.h to include limits.h for a successful compile) +REM Copy libzip.dll.a,libzip.dll,zip.h+zipconf.h to appropraite places. +) + +:: Note GPSBabel can not be directly downloaded via wget +:: ATM get it manually from here: +:: http://www.gpsbabel.org/download.html +set GPSBABEL_INST=GPSBabel-1.5.4-Setup.exe +if not exist %GPSBABEL_INST% ( + echo Required %GPSBABEL_INST% not found. Exitting + exit /b +) + +echo =+=+= +echo Checking Perl Installation... +echo =+=+= +set PERL_MSI=ActivePerl-5.18.2.1802-MSWin32-x86-64int-298023.msi +if not exist "%SystemDrive%\Perl" ( + call :Download %PERL_MSI% http://downloads.activestate.com/ActivePerl/releases/5.18.2.1802/%PERL_MSI% + echo Installing Perl takes a little time... + msiexec /qb /i %PERL_MSI% PERL_PATH=Yes PERL_EXT=Yes + if ERRORLEVEL 1 goto Error +) + +echo =+=+= +echo Checking NSIS installed... +echo =+=+= +set NSIS_INST=nsis-2.46-setup.exe +if not exist "%ProgramFiles%\NSIS" ( + call :Download %NSIS_INST% http://prdownloads.sourceforge.net/nsis/nsis-2.46-setup.exe?download + echo Installing NSIS... + %NSIS_INST% /S + if ERRORLEVEL 1 goto Error +) + +echo =+=+= +echo Checking NSIS Plugins installed... +echo =+=+= +set FPDLLZIP=FindProc.zip +if not exist "%ProgramFiles%\NSIS\Plugins\FindProcDLL.dll" ( + call :Download %FPDLLZIP% http://nsis.sourceforge.net/mediawiki/images/3/3c/%FPDLLZIP% + echo Extracting NSIS Plugins... + 7z e %FPDLLZIP% -o"%ProgramFiles%\NSIS\Plugins" + if ERRORLEVEL 1 goto Error +) + +popd + +echo Fixing Perl reference + +set PATH=%PATH%;C:\msys\1.0\bin + +call :FixPerlRef %MINGW_BIN%\glib-mkenums s:/bin/perl:perl: +call :FixPerlRef %MINGW_BIN%\intltool-extract s:/opt/perl/bin/perl:perl: +call :FixPerlRef %MINGW_BIN%\intltool-merge s:/opt/perl/bin/perl:perl: +call :FixPerlRef %MINGW_BIN%\intltool-prepare s:/opt/perl/bin/perl:perl: +call :FixPerlRef %MINGW_BIN%\intltool-update s:/opt/perl/bin/perl:perl: + +goto End + +:FixPerlRef +:: Param %1 = File +:: Param %2 = sed command +:: Sadly '-i' for in place changes doesn't seem available with Windows sed 3.02 +sed -e '%2' %1 > %1.tmp +if ERRORLEVEL 1 goto Error +xcopy /Y %1.tmp %1 +if ERRORLEVEL 1 goto Error +del %1.tmp +:: End function +exit /b + +:: Potentially Clean Up +:: If any parameters given on the command line then remove all downloaded items +:Clean +if not [%1]==[] ( + echo Removing downloaded files + if exist cache rmdir /S /Q cache +) + +goto End + + +::Function to try to download something via wget +:: (obviously needs 7zip to be installed first and available on the path!) +:: Param %1 = File +:: Param %2 = URL (which should retrieve %1) [ URL can't contain a space or %20:( ] +:Download +if not exist "%1" ( + wget "%2" + if ERRORLEVEL 1 goto Error +) +:: End function +exit /b + +::Function to install something via 7zip +:: (obviously needs 7zip to be installed first and available on the path!) +:: Param %1 = LZMA file +:: Param %2 = Internal file (normally the .tar file) +:InstallBy7Zip +echo Extracting "%1" from "%2" +7z e "%1" +if ERRORLEVEL 1 goto Error +7z x "%2" -o"%MinGW%" +if ERRORLEVEL 1 goto Error +del "%2" +if ERRORLEVEL 1 goto Error +:: End function +exit /b + +::Function to install LZMA file containing a tar file (via 7zip) +:: (obviously needs 7zip to be installed first and available on the path!) +:: Param %1 = LZMA file +:InstallLZMA +7z e "%1" +if ERRORLEVEL 1 goto Error +set param=%1 +:: Remove the .lzma extension to get the tar file +set file=%param:.lzma=% +7z x "%file%" -o"%MinGW%" -y +if ERRORLEVEL 1 goto Error +del "%file%" +if ERRORLEVEL 1 goto Error +:: End function +exit /b + +:Error +echo exitting due to error: %ERRORLEVEL% +exit /b + +:End +echo Finished -- cgit v1.2.3 From cb02e7ed1d2005dcccd94056b9c5d0a09e3e9d54 Mon Sep 17 00:00:00 2001 From: Bernd Zeimetz <bzed@debian.org> Date: Tue, 14 Jan 2020 22:48:25 +0100 Subject: Import viking_1.7-2.debian.tar.xz [dgit import tarball viking 1.7-2 viking_1.7-2.debian.tar.xz] --- .gitlab-ci.yml | 6 + README.source | 58 +++ changelog | 435 +++++++++++++++++++++ compat | 1 + control | 61 +++ copyright | 146 +++++++ gbp.conf | 20 + patches/0001-disable-po-check.patch | 25 ++ ...PROG_INTLTOOL-and-AM_GNU_GETTEXT-conflict.patch | 17 + patches/fix_build_on_hurd | 18 + patches/gps_api_9_support | 30 ++ patches/no-doc-dir | 35 ++ patches/series | 4 + rules | 23 ++ source/format | 1 + viking.docs | 2 + viking.examples | 1 + watch | 4 + 18 files changed, 887 insertions(+) create mode 100644 .gitlab-ci.yml create mode 100644 README.source create mode 100644 changelog create mode 100644 compat create mode 100644 control create mode 100644 copyright create mode 100644 gbp.conf create mode 100644 patches/0001-disable-po-check.patch create mode 100644 patches/fix-IT_PROG_INTLTOOL-and-AM_GNU_GETTEXT-conflict.patch create mode 100644 patches/fix_build_on_hurd create mode 100644 patches/gps_api_9_support create mode 100644 patches/no-doc-dir create mode 100644 patches/series create mode 100755 rules create mode 100644 source/format create mode 100644 viking.docs create mode 100644 viking.examples create mode 100644 watch diff --git a/.gitlab-ci.yml b/.gitlab-ci.yml new file mode 100644 index 0000000..5c575a1 --- /dev/null +++ b/.gitlab-ci.yml @@ -0,0 +1,6 @@ +include: + - https://salsa.debian.org/salsa-ci-team/pipeline/raw/master/salsa-ci.yml + - https://salsa.debian.org/salsa-ci-team/pipeline/raw/master/pipeline-jobs.yml + +variables: + RELEASE: 'unstable' diff --git a/README.source b/README.source new file mode 100644 index 0000000..5dde0bf --- /dev/null +++ b/README.source @@ -0,0 +1,58 @@ +This package uses quilt to manage all modifications to the upstream +source. Changes are stored in the source package as diffs in +debian/patches and applied during the build. + +To configure quilt to use debian/patches instead of patches, you want +either to export QUILT_PATCHES=debian/patches in your environment +or use this snippet in your ~/.quiltrc: + + for where in ./ ../ ../../ ../../../ ../../../../ ../../../../../; do + if [ -e ${where}debian/rules -a -d ${where}debian/patches ]; then + export QUILT_PATCHES=debian/patches + break + fi + done + +To get the fully patched source after unpacking the source package, cd to +the root level of the source package and run: + + quilt push -a + +The last patch listed in debian/patches/series will become the current +patch. + +To add a new set of changes, first run quilt push -a, and then run: + + quilt new <patch> + +where <patch> is a descriptive name for the patch, used as the filename in +debian/patches. Then, for every file that will be modified by this patch, +run: + + quilt add <file> + +before editing those files. You must tell quilt with quilt add what files +will be part of the patch before making changes or quilt will not work +properly. After editing the files, run: + + quilt refresh + +to save the results as a patch. + +Alternately, if you already have an external patch and you just want to +add it to the build system, run quilt push -a and then: + + quilt import -P <patch> /path/to/patch + quilt push -a + +(add -p 0 to quilt import if needed). <patch> as above is the filename to +use in debian/patches. The last quilt push -a will apply the patch to +make sure it works properly. + +To remove an existing patch from the list of patches that will be applied, +run: + + quilt delete <patch> + +You may need to run quilt pop -a to unapply patches first before running +this command. diff --git a/changelog b/changelog new file mode 100644 index 0000000..fba933c --- /dev/null +++ b/changelog @@ -0,0 +1,435 @@ +viking (1.7-2) unstable; urgency=medium + + * [809f9c42] updating .gitlab-ci.yml + * [97fdf04c] Support gps.h API 9. + Thanks to Mattia Rizzolo (Closes: #948777) + + -- Bernd Zeimetz <bzed@debian.org> Tue, 14 Jan 2020 22:48:25 +0100 + +viking (1.7-1) unstable; urgency=medium + + * [52e02dc1] New upstream version 1.7 + * [271f7f44] Refreshing patches. + * [72021c78] Add .gitlab-ci.yml + * [65f08de8] snapshot changelog + * [daf9b299] Don't build doc files. + (refreshed version of old patch) + * [8ec9f18e] Add libgeoclue-2-dev as build-dep. + * [9ee585c6] Add liboauth-dev as build-dep + * [573f1f9a] Build-depend on nettle-dev. + + -- Bernd Zeimetz <bzed@debian.org> Sat, 02 Feb 2019 18:33:20 +0100 + +viking (1.6.2-3.2) unstable; urgency=medium + + * Non-maintainer upload + * [a5b7fcb2] Ignore test failures on Big Endian (Closes: #911845) + + -- Jeremy Bicha <jbicha@debian.org> Sat, 27 Oct 2018 21:24:18 -0400 + +viking (1.6.2-3.1) unstable; urgency=medium + + * Non-maintainer upload + * [775f827c] Update Vcs fields for migration to https://salsa.debian.org/ + * [70271eaa] Bump debhelper compat to 11 + * [aa6eb0a0] Drop menu file since viking includes a .desktop file + * [f6890f37] Drop Build-Depends on rarian (Closes: #885608) + * [1fc7f65a] Add build-without-scrollkeeper.patch + * [7b2dfdf7] Don't ignore build test failures + + -- Jeremy Bicha <jbicha@debian.org> Sun, 21 Oct 2018 17:09:03 -0400 + +viking (1.6.2-3) unstable; urgency=medium + + * [ab2b5a08] Fix build on hurd. + * [279040da] Mapnik is missing on alpha, too. + + -- Bernd Zeimetz <bzed@debian.org> Sat, 19 Nov 2016 00:15:50 +0100 + +viking (1.6.2-2) unstable; urgency=medium + + * [da432658] Restrict libmapnic-dev to arches where it is available. + * [be004293] Bump to compat level 10. + + -- Bernd Zeimetz <bzed@debian.org> Thu, 17 Nov 2016 22:16:09 +0100 + +viking (1.6.2-1) unstable; urgency=medium + + * [ecf9c6a2] Imported Upstream version 1.6 + * [2f959064] Imported Upstream version 1.6 + * [52a3e6e3] New upstream version 1.6.2 + Closes: #833578 + * [07801c5d] Disable unused patches. + * [8ea20e90] Refreshing patches. + * [e0914a3d] Snapshot changelog. + * [8e9cf766] refresh no-doc patch + * [ddc24542] add mapnik-dev as build-dep and build with it. + * [fcc01d07] Have an extra intltoolize run. + * [d6aadaf5] Also ensure that make doesn;t want to build doc. + + -- Bernd Zeimetz <bzed@debian.org> Mon, 03 Oct 2016 01:18:31 +0200 + +viking (1.6-1) unstable; urgency=medium + + * [11136d29] Imported Upstream version 1.6 + * [8cca0e43] Add new upstream dependency: libsqlite3-dev + * [f1e62fef] Replace libexif by gexiv2 + * [cb0ad3e5] Update patch no_doc-dir + * [d9a7723c] Remove patch set_subdir-objects as it is applied upstream + * [a8fb82f2] Disable mapnik support + * [73285b0f] Add patch to fix IT_PROG_INTLTOOL and AM_GNU_GETTEXT conflict + * [2d0081c0] Update gbp.conf to new rules + * [af25cd4b] Activate hardening options + + -- Guilhem Bonnefille <guilhem.bonnefille@gmail.com> Sun, 30 Aug 2015 16:52:00 +0200 + +viking (1.5.1-1) unstable; urgency=medium + + * [53625f28] Fixing watch file to handle .bz2 files. + * [c7c0831f] Imported Upstream version 1.5.1 (Closes: #748731) + * [c2888d34] refreshing patches. + * [28b313f6] Add missig build-dependencies. + + -- Bernd Zeimetz <bzed@debian.org> Tue, 20 May 2014 21:01:25 +0200 + +viking (1.4.2-2) unstable; urgency=low + + [ Hideki Yamane ] + * debian/rules + - add autoreconf to dh to fix FTBFS (Closes: #725529) + - not dh --with quilt but use source format 3.0 + * debian/control + - add "Build-Depends: dh-autoreconf" + * set debian/source/format as "3.0 (quilt)" + * debian/patches + - add set_subdir-objects.patch + - add no_doc-dir.patch + + [ Bernd Zeimetz ] + * Applying patch from Hideki Yamane. Thanks a lot! + + -- Bernd Zeimetz <bzed@debian.org> Sat, 23 Nov 2013 14:20:32 +0100 + +viking (1.4.2-1) unstable; urgency=low + + * [953c9042] Imported Upstream version 1.4.2 (Closes: #690981) + * [4a6b0d90] Refreshing patches. + * [7d8b6307] Depend on gpsbabel. + Thanks to Celelibi (Closes: #684061) + * [a078d2bb] Recommend expect-dev for unbuffer. + Thanks to Uwe Storbeck (Closes: #685085) + [e62f66ae] Depend on newer automake versions. + + -- Bernd Zeimetz <bzed@debian.org> Thu, 29 Aug 2013 22:25:07 +0200 + +viking (1.3-1) unstable; urgency=low + + * [a3f95c12] Imported Upstream version 1.3 + * [ab0442aa] Drop GPSD-API-v5 patch, applied upstream. + * [6890fcb6] Add libexif-dev as build dependency. + + -- Bernd Zeimetz <bzed@debian.org> Tue, 24 Apr 2012 21:44:56 +0200 + +viking (1.2.2-1) unstable; urgency=low + + * [cd56f671] Imported Upstream version 1.2.2 (Closes: #655084) + * [3e2c3732] Removing curl-ftbfs-fix.patch, applied upstream. + + -- Bernd Zeimetz <bzed@debian.org> Sun, 08 Jan 2012 14:57:31 +0100 + +viking (1.2.1-3) unstable; urgency=low + + * [adbf9d87] Make viking build with libgps20 / APIv5. + Thanks to Robert Norris (Closes: #648494) + + -- Bernd Zeimetz <bzed@debian.org> Sun, 13 Nov 2011 14:58:00 +0100 + +viking (1.2.1-2) unstable; urgency=low + + * [81581646] Don't include curl/types.h as its deprecated and removed. + Thanks to Lucas Nussbaum (Closes: #639062) + + -- Bernd Zeimetz <bzed@debian.org> Sat, 08 Oct 2011 11:24:21 +0200 + +viking (1.2.1-1) unstable; urgency=low + + * [e81daa57] Imported Upstream version 1.2.1 + * [1afd3ad4] Don't run dh_autoreconf. + Seems to fail due to missing files in the tarball. + + -- Bernd Zeimetz <bzed@debian.org> Sun, 10 Jul 2011 10:50:29 +0200 + +viking (1.1-1) unstable; urgency=low + + * [271c7221] Imported Upstream version 1.1 + * [7aed446e] Refreshing patches. Dropping those which were applied + upstream. + + -- Bernd Zeimetz <bzed@debian.org> Wed, 09 Feb 2011 21:52:13 +0100 + +viking (0.9.94-3) unstable; urgency=low + + * [f5016ac4] Fix spelling error in the long description. (Closes: + #601438) - thanks to Ralf Treinen + * [2adbd71c] Add patch to include a missing -lz in src/Makefile.am + * [e69887c6] Use dh_autoreconf as src/Makefile.am was patched. + + -- Bernd Zeimetz <bzed@debian.org> Wed, 03 Nov 2010 21:17:23 +0100 + +viking (0.9.94-2) unstable; urgency=low + + * [6c407676] Add patch to fix segfault when using gpsbabel. (Closes: + #599048) - thanks to Rob Norris and Alexander Fell. + + -- Bernd Zeimetz <bzed@debian.org> Sat, 16 Oct 2010 18:59:08 +0200 + +viking (0.9.94-1) unstable; urgency=low + + * [96e56c75] Imported Upstream version 0.9.94 + * [477b715c] Add new build-dependency: gnome-doc-utils >= 0.3.2 + * [597b155a] Add rarian-compat | scrollkeeper as build dependency. + * [a0aa7553] Tidy up debian/rules using dh features only. + * [1f144180] Ignore errors in the test suite for now. + * [5069b36f] Order with options for dh properly, remove where not + necessary. + * [02e43ae0] No need to clean config.sub and config.guess anymore. + + -- Bernd Zeimetz <bzed@debian.org> Sun, 25 Jul 2010 13:09:14 +0200 + +viking (0.9.93-1) unstable; urgency=low + + * [f12bb468] Remove Google from the long descriptio. + * [4922d64e] Imported Upstream version 0.9.93 + * [86139278] Add debian/source/format. + * [d03d0138] Add debian/README.source file. + + -- Bernd Zeimetz <bzed@debian.org> Wed, 21 Apr 2010 11:21:48 +0200 + +viking (0.9.92-1) unstable; urgency=low + + * [5d0ca3d7] Imported Upstream version 0.9.92 + * [8b4c8c78] Include example files in the packaging. (Closes: #575034) + + -- Bernd Zeimetz <bzed@debian.org> Mon, 22 Mar 2010 23:44:56 +0100 + +viking (0.9.91-1) unstable; urgency=low + + * [41442055] Imported Upstream version 0.9.91 + * [55d95585] Dropping libgps-2.90-fix patch, applied upstream. + * [95bdb707] Bumping Standards-Version to 3.8.4. No changes needed. + * [73f2c3b1] Drop bashism-fix patch, applied upstream. + + -- Bernd Zeimetz <bzed@debian.org> Thu, 11 Feb 2010 12:07:19 +0100 + +viking (0.9.9-3) unstable; urgency=low + + * [90eee421] Remove the sf.net list, set myself as Maintainer. + * [420be49e] Remove Ralf Meyer from Uploaders. + * [5af131f5] Make Viking compatible with libgps >= 2.90 (Closes: + #560243) - thanks to Cyril Brulebois + * [565d3820] Require libgps-dev 2.90. + * [e29fabb9] Add bc to build-deps - used by + check_degrees_conversions.sh. + * [56d18b6a] Disable make check for the po folder. intltool-update + gets confused by quilt's pc folder and the .c files in there. + + -- Bernd Zeimetz <bzed@debian.org> Thu, 10 Dec 2009 01:43:35 +0100 + +viking (0.9.9-2) unstable; urgency=low + + * [f254a656] Fix bashism in test script. (Closes: #548449) - thanks to + Kurt Roeckx + + -- Bernd Zeimetz <bzed@debian.org> Mon, 28 Sep 2009 21:53:44 +0200 + +viking (0.9.9-1) unstable; urgency=low + + * [0948eaa9] Imported Upstream version 0.9.9 + - Supports OSM API 0.6 (Closes: 526995) + * [edeebbdc] Add default gbp options. + * [1c90c035] Updating Vcs information. + * [12a68a60] Dropping patches, applied upstream. + * [09a546aa] Migrate to debhelper 7 + + -- Bernd Zeimetz <bzed@debian.org> Sun, 13 Sep 2009 19:14:45 +0200 + +viking (0.9.8-2) unstable; urgency=low + + * Work around missing gpsd_units() from the gpsd header + files by including gpsdclient.h from gpsd (Closes: #524084). + * Bumping Standards-Version to 3.8.1, no changes needed. + * Fixing an implcit declaration in src/util.c. + + -- Bernd Zeimetz <bzed@debian.org> Fri, 17 Apr 2009 22:47:27 +0200 + +viking (0.9.8-1) unstable; urgency=low + + [ Guilhem Bonnefille ] + * New upstream version. The following changes were introduced since 0.9.6: + - Update of most translations + - Icon is build and installed by upstream now, the according lines + were removed from debian/rules. + - src/viking.desktop.in: add GenericName and revise Categories + - debian/control: Removing quilt to build dependencies. + - debian/patches: Removing all (no more patches applied). + - debian/rules: Removing quilt.make include. + + [ Bernd Zeimetz ] + * debian/control: + - Bumping standards-version, no changes needed. + + -- Bernd Zeimetz <bzed@debian.org> Sun, 15 Feb 2009 23:57:16 +0100 + +viking (0.9.6-2) unstable; urgency=low + + * Unfortunately the google maps fix in 0.9.6-1 worked only for a few days, + hopefully the now introduced patch is a durable fix (Closes: #491631). + - debian/control: Adding quilt to build dependencies. + - debian/patches: Adding viking_google_fix.diff and series file. + The patch is based on the output of + svn diff -r739:740 \ + https://viking.svn.sourceforge.net/svnroot/viking/trunk + - debian/rules: Adding quilt.make include and dependencies on + patch/unpatch targets. + + -- Bernd Zeimetz <bzed@debian.org> Fri, 08 Aug 2008 12:31:56 +0200 + +viking (0.9.6-1) unstable; urgency=low + + * New upstream version. The following changes were introduced since + 0.9.4.20080717 (which was a pre-release of 0.9.5): + - Manpages are build and installed by upstream now, the according lines + were removed from debian/rules and debian/viking.manpages. + - Update of most translations + - Google map layers stopped working due to changes by Google, this problem + is fixed now (Closes: #491631). As this feature is used by most of our + users, it should be fixed for Lenny. + - The gcget command line needed to be fixed to accommodate negative coords. + This doesn't affect Debian as the geocaching features are not enabled + yet. + - Removing unecessary (and probably ) Makefile.am directive + + -- Bernd Zeimetz <bzed@debian.org> Mon, 04 Aug 2008 02:17:58 +0200 + +viking (0.9.4.20080717-1) unstable; urgency=low + + * New upstream version. + * debian/viking.desktop: + - Dropping file, provided by upstream now. + * debian/viking.install: + - Updating file accordingly - don't install viking.desktop anymore. + * debian/copyright: + - Using a shorter identing to make lintian happy. + * debian/*.xml: + - Removing files, manpages are shipped by upstream now, but unfortunately + not being built and installed automatically yet. + * debian/rules: + - Use doc/%.xml as source for the manpages. + + -- Bernd Zeimetz <bzed@debian.org> Fri, 18 Jul 2008 23:38:50 +0200 + +viking (0.9.4.20080614-1) unstable; urgency=low + + * New upstream version. + + -- Bernd Zeimetz <bzed@debian.org> Mon, 23 Jun 2008 17:20:43 +0200 + +viking (0.9.4-1) unstable; urgency=low + + * New upstream version. + * debian/rules, debian/control, debian/patches: + - Removing all traces of dpatch - no patches needed anymore. + + -- Bernd Zeimetz <bzed@debian.org> Sun, 02 Mar 2008 00:30:45 +0100 + +viking (0.9.3.20080220-1) unstable; urgency=low + + * New upstream release. + * debian/control: + - Moving gpsbabel from Suggests to Recommends. + - Updating my email address. + - Adding intltool to Build-Depends. + - Bumping Standards-Version - no changes needed. + * debian/patches: + - viktrwlayer.c-implicit-decl-fix.dpatch, + use-x-www-browser.dpatch, + dems.c-implicit-decl-fix.dpatch: + Removing patches, integrated upstream + + -- Bernd Zeimetz <bzed@debian.org> Sun, 24 Feb 2008 00:20:35 +0100 + +viking (0.9.3-2) unstable; urgency=low + + * debian/control: + - Renaming XS-Vcs-* fields to Vcs-* as they're supported by dpkg now. + * debian/patches: + - Updating viktrwlayer.c-implicit-decl-fix.dpatch to fix the implicit + declaration completely, thanks to Dann Frazier (Closes: #447662) + + -- Bernd Zeimetz <bernd@bzed.de> Sun, 18 Nov 2007 02:14:59 +0100 + +viking (0.9.3-1) unstable; urgency=low + + * New upstream version + * debian/control: + - Adding libgps-dev as Build-Dep + - Adding realtime-features to the description + * debian/patches: + - Removing patches which were integrated in the new release, only keeping + use-x-www-browser.dpatch to set the browser to a sane default. + - Adding dems.c-implicit-decl-fix and viktrwlayer.c-implicit-decl-fix to + fix two implicit declarations. + + -- Bernd Zeimetz <bernd@bzed.de> Mon, 22 Oct 2007 15:51:29 +0200 + +viking (0.9.2-2) unstable; urgency=low + + * debian/control: + - Adding Homepage field, removing pseudo-field from description + - Adding XS-Vcs-Svn and XS-Vcs-Browser fields + * debian/patches: + - Adding google-download-fix.dpatch which backports commit r436 from svn, + fixing Google maps/sat downloads + - Adding dem-fix.patch to fix a bug which resulted in a segfault while + loading DEM files on 64bit platforms + + -- Bernd Zeimetz <bernd@bzed.de> Tue, 09 Oct 2007 16:01:25 +0200 + +viking (0.9.2-1) unstable; urgency=low + + * New upstream version, including a better handling of views + (Closes: #439193) + * debian/control: + - Adding versioned libglib2.0-dev dep. to Build-Depends to make + backporter's life more easy + * debian/patches: + - Removing bugfix-patches from former versions as they're included in + upstream's release now + - Adding viking-initial-location.dpatch to fix a crash due to an + uninitialized mode of the center location + + -- Bernd Zeimetz <bernd@bzed.de> Mon, 03 Sep 2007 12:56:40 +0200 + +viking (0.9+fix1-2) unstable; urgency=low + + * debian/viking.menu: + - Updating menu entry according to the new menu policy + * debian/patches: + - Adding clipboard-copy-crash-fix.dpatch to fix a segvault which occurred + on 64bit platforms while copying a layer to the clipboard + * debian/viking.dirs: + - Removing not needed entry /usr/share/viking + * debian/control: + - Adding automake1.9, autoconf to Build-Deps to fix several warnings on + build-time + * debian/rules: + - Make sure we can build the package even if configure was not created yet + to support developers who like to build from trunk/svn snapshots + + -- Bernd Zeimetz <bernd@bzed.de> Sun, 19 Aug 2007 21:31:55 +0200 + +viking (0.9+fix1-1) unstable; urgency=low + + * Initial release (Closes: #412436) + + -- Bernd Zeimetz <bernd@bzed.de> Mon, 16 Jul 2007 14:15:00 +0200 diff --git a/compat b/compat new file mode 100644 index 0000000..b4de394 --- /dev/null +++ b/compat @@ -0,0 +1 @@ +11 diff --git a/control b/control new file mode 100644 index 0000000..dd04296 --- /dev/null +++ b/control @@ -0,0 +1,61 @@ +Source: viking +Section: utils +Priority: optional +Maintainer: Bernd Zeimetz <bzed@debian.org> +Uploaders: Guilhem Bonnefille <guilhem.bonnefille@gmail.com> +Build-Depends: debhelper (>= 11), + libcurl4-gnutls-dev, + libexpat1-dev, + libgtk2.0-dev, + libglib2.0-dev (>= 2.12.0), + libgps-dev (>= 2.90), + xsltproc, + docbook-xsl, + docbook-xml, + intltool, + bc, + gnome-doc-utils (>= 0.3.2), + libgexiv2-dev, + libbz2-dev, + libmagic-dev, + gnome-common, + libsqlite3-dev, + libmapnik-dev [!mips !mips64el !mipsel !hurd-i386 !kfreebsd-amd64 !kfreebsd-i386 !powerpcspe !sh4 !x32 !alpha], + libgeoclue-2-dev, + liboauth-dev, + nettle-dev +Standards-Version: 3.8.4 +Homepage: http://viking.sf.net +Vcs-Git: https://salsa.debian.org/debian/viking.git +Vcs-Browser: https://salsa.debian.org/debian/viking + +Package: viking +Architecture: any +Depends: ${shlibs:Depends}, ${misc:Depends}, gpsbabel +Suggests: gpsd +Recommends: expect-dev +Description: GPS data editor, analyzer and viewer + Viking aims to be easy to use, yet powerful in accomplishing a wide + variety of GPS related tasks. It uses a hierarchical layering system + to organize GPS data, maps, and other layer types with spatial data, + such as coordinate lines. + . + Some of the things you can use Viking for are: + . + * Uploading and downloading waypoints, tracks to/from GPS. + * Realtime GPS tracking and track recording. + * Import and export of gpx files. + * Preparing tracks and waypoints for trips using maps from services + such as OpenStreetmap and Terraserver. You only need to upload the data + to your GPS before you leave. The maps together with your tracks + and waypoints can also be printed and used during the trip. + * After trips, tracks and waypoints from GPS can be downloaded, + stored, managed and reused in later trips. + * Analyzing OHV and hiking trips, understanding where you went and + how far you were from something. + * Making waypoints and tracks to follow to easily get someplace + you've never been before or don't have GPS data for but Terraserver + maps exist for it. + * Making maps with coordinate lines. + * Analyzing speed at different places, adding waypoints where you forgot + to mark one but did slow down or stop. diff --git a/copyright b/copyright new file mode 100644 index 0000000..cd79529 --- /dev/null +++ b/copyright @@ -0,0 +1,146 @@ +This package was debianized by +The Debian Vikings <viking-debian@lists.sourceforge.net> +on Mon, 16 Jul 2007 20:56:18 +0200 + +It was downloaded from + +Upstream Authors: + + Evan Battaglia <gtoevan@gmx.net> + +Contributors: + + Alex Foobarian <foobarian@gmail.com> + Guilhem BONNEFILLE <guilhem.bonnefille@gmail.com> + Jocelyn Jaubert <jocelyn.jaubert@gmail.com> + Mark Coulter <i_offroad@yahoo.com> + Quy Tonthat <qtonthat@gmail.com> + + Few other bugfixes/minor patches from various contributors. + See ChangeLog for details. + +Copyright: + + Copyright (C) 2003-2007 Evan Battaglia <gtoevan@gmx.net> + +License: + + This package 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 package 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 package; if not, write to the Free Software + Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA + +On Debian systems, the complete text of the GNU General Public License, +version 2, can be found in `/usr/share/common-licenses/GPL-2'. + + +The Debian packaging is +(C) 2007, The Debian Vikings <viking-debian@lists.sourceforge.net> +and is licensed under the GPL, version 2, see above. + +The Debian Vikings are: + Guilhem BONNEFILLE <guilhem.bonnefille@gmail.com> + Ralf Meyer <ranfyy@gmail.com> + Bernd Zeimetz <bernd@bzed.de> + + +Additional/different Copyrights: + * src/babel.h: + Copyright (C) 2003-2005, Evan Battaglia <gtoevan@gmx.net> + Copyright (C) 2005, Alex Foobarian <foobarian@gmail.com> + + + * src/degrees_converters.c, src/degrees_converters.h + Copyright (C) 2006-2007, Guilhem Bonnefille <guilhem.bonnefille@gmail.com> + + + * src/modules.h, src/modules.c: + Copyright (C) 2006-2007, Guilhem Bonnefille <guilhem.bonnefille@gmail.com> + + + * src/gpx.c: + Copyright (C) 2003-2005, Evan Battaglia <gtoevan@gmx.net> + + Some of the code adapted from GPSBabel 1.2.7 + http://gpsbabel.sf.net/ + Copyright (C) 2002, 2003, 2004, 2005 Robert Lipe, robertlipe@usa.net + + + * src/vikmapslayer.c: + Copyright (C) 2005, Evan Battaglia <viking@greentorch.org> + UTM multi-zone stuff by Kit Transue <notlostyet@didactek.com> + Dynamic map type by Guilhem Bonnefille <guilhem.bonnefille@gmail.com> + + + * src/expedia.c: + Copyright (C) 2005, Evan Battaglia <viking@greentorch.org> + + Some formulas or perhaps even code derived from GPSDrive + GPSDrive Copyright (C) 2001-2004 Fritz Ganter <ganter@ganter.at> + + + * src/gtkcellrendererprogress.h, src/gtkcellrendererprogress.c: + Taken from Gaim 0.77. + + Gaim is the legal property of its developers, whose names are too numerous + to list here. Please refer to the COPYRIGHT file distributed with this + source distribution. + + The COPYRIGHT file distributed with Gaim 0.77 can be found here: + http://pidgin.svn.sourceforge.net/viewvc/pidgin/tags/v0_77/gaim/COPYRIGHT?view=markup + + + * src/vikviewport.c: + Copyright (C) 2003-2005, Evan Battaglia <gtoevan@gmx.net> + + Lat/Lon plotting functions calcxy * are from GPSDrive + GPSDrive Copyright (C) 2001-2004 Fritz Ganter <ganter@ganter.at> + + Multiple UTM zone patch by Kit Transue <notlostyet@didactek.com> + + + +Files under other licenses than GPL Version 2: + + * src/coords.h: + borrowed from: + http://acme.com/software/coords/ + I (Evan Battaglia <viking@greentorch.org> have only made some small + changes such as renaming functions and defining LatLon and UTM structs. + + coords.h - include file for coords routines + + Copyright (C) 2001 by Jef Poskanzer <jef@acme.com>. + 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. + + diff --git a/gbp.conf b/gbp.conf new file mode 100644 index 0000000..92e65dc --- /dev/null +++ b/gbp.conf @@ -0,0 +1,20 @@ +# Configuration file for git-buildpackage and friends + +[DEFAULT] +upstream-branch = upstream +debian-branch = master +upstream-tag = upstream/%(version)s +debian-tag = debian/%(version)s +pristine-tar = True + +# Options only affecting git-buildpackage +[buildpackage] +sign-tags = True + +# Options only affecting git-dch +[dch] +git-log = --no-merges +id-length = 8 +meta = True +meta-closes = Closes|LP + diff --git a/patches/0001-disable-po-check.patch b/patches/0001-disable-po-check.patch new file mode 100644 index 0000000..49f9a37 --- /dev/null +++ b/patches/0001-disable-po-check.patch @@ -0,0 +1,25 @@ +From: Bernd Zeimetz <bzed@debian.org> +Date: Sat, 16 Oct 2010 18:57:01 +0200 +Subject: [PATCH] disable-po-check + +--- + po/Makefile.in.in | 8 ++------ + 1 file changed, 2 insertions(+), 6 deletions(-) + +--- a/po/Makefile.in.in ++++ b/po/Makefile.in.in +@@ -145,12 +145,8 @@ uninstall: + rm -f $(DESTDIR)$(localedir)/$$lang/LC_MESSAGES/$(GETTEXT_PACKAGE).mo.m; \ + done + +-check: all $(GETTEXT_PACKAGE).pot +- rm -f missing notexist +- srcdir=$(srcdir) $(INTLTOOL_UPDATE) -m +- if [ -r missing -o -r notexist ]; then \ +- exit 1; \ +- fi ++check: ++ # do nothing as it messes up with quilt's .pc folder. + + mostlyclean: + rm -f *.pox $(GETTEXT_PACKAGE).pot *.old.po cat-id-tbl.tmp diff --git a/patches/fix-IT_PROG_INTLTOOL-and-AM_GNU_GETTEXT-conflict.patch b/patches/fix-IT_PROG_INTLTOOL-and-AM_GNU_GETTEXT-conflict.patch new file mode 100644 index 0000000..a7d2ecf --- /dev/null +++ b/patches/fix-IT_PROG_INTLTOOL-and-AM_GNU_GETTEXT-conflict.patch @@ -0,0 +1,17 @@ +Description: IT_PROG_INTLTOOL and AM_GNU_GETTEXT conflict + +diff --git a/configure.ac b/configure.ac +index 66fa53b..0e6e762 100644 +--- a/configure.ac ++++ b/configure.ac +@@ -22,9 +22,6 @@ AC_DEFINE_UNQUOTED(GETTEXT_PACKAGE,"$GETTEXT_PACKAGE",[Gettext package name]) + + AM_GLIB_DEFINE_LOCALEDIR(LOCALEDIR) + +-AM_GNU_GETTEXT_VERSION([0.17]) +-AM_GNU_GETTEXT([external]) +- + IT_PROG_INTLTOOL([0.35.0]) + + AC_SUBST([CONFIG_STATUS_DEPENDENCIES],['$(top_srcdir)/po/LINGUAS']) + diff --git a/patches/fix_build_on_hurd b/patches/fix_build_on_hurd new file mode 100644 index 0000000..2fe7911 --- /dev/null +++ b/patches/fix_build_on_hurd @@ -0,0 +1,18 @@ +From: Bernd Zeimetz <bzed@debian.org> +Date: Sat, 19 Nov 2016 00:15:50 +0100 +Subject: fix build on hurd + +--- + src/metatile.h | 4 ++++ + 1 file changed, 4 insertions(+) + +--- a/src/metatile.h ++++ b/src/metatile.h +@@ -26,3 +26,7 @@ + int xyz_to_meta(char *path, size_t len, const char *dir, int x, int y, int z); + + int metatile_read(const char *dir, int x, int y, int z, char *buf, size_t sz, int * compressed, char * log_msg); ++ ++#ifndef PATH_MAX ++#define PATH_MAX 4096 ++#endif diff --git a/patches/gps_api_9_support b/patches/gps_api_9_support new file mode 100644 index 0000000..0ee0ea9 --- /dev/null +++ b/patches/gps_api_9_support @@ -0,0 +1,30 @@ +Index: viking/src/vikgpslayer.c +=================================================================== +--- viking.orig/src/vikgpslayer.c ++++ viking/src/vikgpslayer.c +@@ -1714,8 +1714,13 @@ static VikTrackpoint* create_realtime_tr + + /* Note that fix.time is a double, but it should not affect the precision + for most GPS */ ++#if GPSD_API_MAJOR_VERSION >= 9 ++ time_t cur_timestamp = vgl->realtime_fix.fix.time.tv_sec; ++ time_t last_timestamp = vgl->last_fix.fix.time.tv_sec; ++#else + time_t cur_timestamp = vgl->realtime_fix.fix.time; + time_t last_timestamp = vgl->last_fix.fix.time; ++#endif + + if (cur_timestamp < last_timestamp) { + return NULL; +@@ -1745,7 +1750,11 @@ static VikTrackpoint* create_realtime_tr + VikTrackpoint *tp = vik_trackpoint_new(); + tp->newsegment = FALSE; + tp->has_timestamp = TRUE; ++#if GPSD_API_MAJOR_VERSION >= 9 ++ tp->timestamp = vgl->realtime_fix.fix.time.tv_sec; ++#else + tp->timestamp = vgl->realtime_fix.fix.time; ++#endif + tp->altitude = alt; + /* speed only available for 3D fix. Check for NAN when use this speed */ + tp->speed = vgl->realtime_fix.fix.speed; diff --git a/patches/no-doc-dir b/patches/no-doc-dir new file mode 100644 index 0000000..202db52 --- /dev/null +++ b/patches/no-doc-dir @@ -0,0 +1,35 @@ +--- a/Makefile.am ++++ b/Makefile.am +@@ -1,4 +1,4 @@ +-SUBDIRS = src test data po windows help tools doc ++SUBDIRS = src test data po windows help tools + + INTLTOOL = \ + intltool-extract.in \ +--- a/configure.ac ++++ b/configure.ac +@@ -11,13 +11,6 @@ AM_INIT_AUTOMAKE([dist-bzip2 dist-zip su + dnl AC_CONFIG_SRCDIR([src/main.c]) + AC_CONFIG_HEADERS([src/config.h]) + +-# check for gtk-doc +-m4_ifdef([GTK_DOC_CHECK], [ +-GTK_DOC_CHECK([1.0],[--flavour no-tmpl]) +-],[ +-AM_CONDITIONAL([ENABLE_GTK_DOC], false) +-]) +- + AC_PROG_CC + AC_PROG_CC_STDC + # Checks for programs. +@@ -594,9 +587,7 @@ AC_CONFIG_FILES([ + windows/installer/Makefile + windows/installer/pixmaps/Makefile + windows/installer/translations/Makefile +- doc/Makefile +- doc/reference/Makefile +- doc/examples/Makefile]) ++ ]) + + AC_OUTPUT + diff --git a/patches/series b/patches/series new file mode 100644 index 0000000..251693f --- /dev/null +++ b/patches/series @@ -0,0 +1,4 @@ +0001-disable-po-check.patch +fix_build_on_hurd +no-doc-dir +gps_api_9_support diff --git a/rules b/rules new file mode 100755 index 0000000..05a7179 --- /dev/null +++ b/rules @@ -0,0 +1,23 @@ +#!/usr/bin/make -f +# -*- makefile -*- + +EXTRAFLAGS := $(strip $(shell if ! dpkg -L libmapnik-dev 2>/dev/null | grep -q mapnik/map.hpp; then echo '--disable-mapnik'; fi)) + +%: + dh $@ + +override_dh_autoreconf: + dh_autoreconf + intltoolize --force + +override_dh_auto_configure: + dh_auto_configure -- $(EXTRAFLAGS) + +# Ignore tests on Big Endian since one test doesn't work there +# https://github.com/viking-gps/viking/issues/62 +override_dh_auto_test: +ifeq ($(DEB_HOST_ARCH_ENDIAN),little) + dh_auto_test +else + -dh_auto_test +endif diff --git a/source/format b/source/format new file mode 100644 index 0000000..163aaf8 --- /dev/null +++ b/source/format @@ -0,0 +1 @@ +3.0 (quilt) diff --git a/viking.docs b/viking.docs new file mode 100644 index 0000000..6b9db0a --- /dev/null +++ b/viking.docs @@ -0,0 +1,2 @@ +doc/G* +NEWS diff --git a/viking.examples b/viking.examples new file mode 100644 index 0000000..ffdc5f5 --- /dev/null +++ b/viking.examples @@ -0,0 +1 @@ +doc/examples/*.xml diff --git a/watch b/watch new file mode 100644 index 0000000..a33fce0 --- /dev/null +++ b/watch @@ -0,0 +1,4 @@ +version=3 + +opts="uversionmangle=s/-/+/" \ +http://sf.net/viking/viking-([0-9].*)\.tar\.(?:gz|bz2) -- cgit v1.2.3 From 1d1b6f027df38b2c60f94341ec4d6748304b0c78 Mon Sep 17 00:00:00 2001 From: Bernd Zeimetz <bzed@debian.org> Date: Sat, 16 Oct 2010 18:57:01 +0200 Subject: [PATCH] disable-po-check Gbp-Pq: Name 0001-disable-po-check.patch --- po/Makefile.in.in | 8 ++------ 1 file changed, 2 insertions(+), 6 deletions(-) diff --git a/po/Makefile.in.in b/po/Makefile.in.in index fcd2c3b..9a494ad 100644 --- a/po/Makefile.in.in +++ b/po/Makefile.in.in @@ -145,12 +145,8 @@ uninstall: rm -f $(DESTDIR)$(localedir)/$$lang/LC_MESSAGES/$(GETTEXT_PACKAGE).mo.m; \ done -check: all $(GETTEXT_PACKAGE).pot - rm -f missing notexist - srcdir=$(srcdir) $(INTLTOOL_UPDATE) -m - if [ -r missing -o -r notexist ]; then \ - exit 1; \ - fi +check: + # do nothing as it messes up with quilt's .pc folder. mostlyclean: rm -f *.pox $(GETTEXT_PACKAGE).pot *.old.po cat-id-tbl.tmp -- cgit v1.2.3 From 9a213d1f97b89fbabd7ca316656eb1e580f0113c Mon Sep 17 00:00:00 2001 From: Bernd Zeimetz <bzed@debian.org> Date: Sat, 19 Nov 2016 00:15:50 +0100 Subject: fix build on hurd Gbp-Pq: Name fix_build_on_hurd --- src/metatile.h | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/src/metatile.h b/src/metatile.h index 0206133..50d5b0c 100644 --- a/src/metatile.h +++ b/src/metatile.h @@ -26,3 +26,7 @@ int xyz_to_meta(char *path, size_t len, const char *dir, int x, int y, int z); int metatile_read(const char *dir, int x, int y, int z, char *buf, size_t sz, int * compressed, char * log_msg); + +#ifndef PATH_MAX +#define PATH_MAX 4096 +#endif -- cgit v1.2.3 From 67722800b3c3857d1efaf7863061ca0cbc321bcd Mon Sep 17 00:00:00 2001 From: Bernd Zeimetz <bzed@debian.org> Date: Tue, 14 Jan 2020 22:48:25 +0100 Subject: no-doc-dir Gbp-Pq: Name no-doc-dir --- Makefile.am | 2 +- configure.ac | 11 +---------- 2 files changed, 2 insertions(+), 11 deletions(-) diff --git a/Makefile.am b/Makefile.am index e59a6b3..4d283ec 100644 --- a/Makefile.am +++ b/Makefile.am @@ -1,4 +1,4 @@ -SUBDIRS = src test data po windows help tools doc +SUBDIRS = src test data po windows help tools INTLTOOL = \ intltool-extract.in \ diff --git a/configure.ac b/configure.ac index cb5907f..bf4eb38 100644 --- a/configure.ac +++ b/configure.ac @@ -11,13 +11,6 @@ AM_INIT_AUTOMAKE([dist-bzip2 dist-zip subdir-objects]) dnl AC_CONFIG_SRCDIR([src/main.c]) AC_CONFIG_HEADERS([src/config.h]) -# check for gtk-doc -m4_ifdef([GTK_DOC_CHECK], [ -GTK_DOC_CHECK([1.0],[--flavour no-tmpl]) -],[ -AM_CONDITIONAL([ENABLE_GTK_DOC], false) -]) - AC_PROG_CC AC_PROG_CC_STDC # Checks for programs. @@ -594,9 +587,7 @@ AC_CONFIG_FILES([ windows/installer/Makefile windows/installer/pixmaps/Makefile windows/installer/translations/Makefile - doc/Makefile - doc/reference/Makefile - doc/examples/Makefile]) + ]) AC_OUTPUT -- cgit v1.2.3 From d2b76d52f0b29a79a82d0b4da9c1a704404f03fd Mon Sep 17 00:00:00 2001 From: Bernd Zeimetz <bzed@debian.org> Date: Tue, 14 Jan 2020 22:48:25 +0100 Subject: gps_api_9_support =================================================================== Gbp-Pq: Name gps_api_9_support --- src/vikgpslayer.c | 9 +++++++++ 1 file changed, 9 insertions(+) diff --git a/src/vikgpslayer.c b/src/vikgpslayer.c index e7de267..2889c87 100644 --- a/src/vikgpslayer.c +++ b/src/vikgpslayer.c @@ -1714,8 +1714,13 @@ static VikTrackpoint* create_realtime_trackpoint(VikGpsLayer *vgl, gboolean forc /* Note that fix.time is a double, but it should not affect the precision for most GPS */ +#if GPSD_API_MAJOR_VERSION >= 9 + time_t cur_timestamp = vgl->realtime_fix.fix.time.tv_sec; + time_t last_timestamp = vgl->last_fix.fix.time.tv_sec; +#else time_t cur_timestamp = vgl->realtime_fix.fix.time; time_t last_timestamp = vgl->last_fix.fix.time; +#endif if (cur_timestamp < last_timestamp) { return NULL; @@ -1745,7 +1750,11 @@ static VikTrackpoint* create_realtime_trackpoint(VikGpsLayer *vgl, gboolean forc VikTrackpoint *tp = vik_trackpoint_new(); tp->newsegment = FALSE; tp->has_timestamp = TRUE; +#if GPSD_API_MAJOR_VERSION >= 9 + tp->timestamp = vgl->realtime_fix.fix.time.tv_sec; +#else tp->timestamp = vgl->realtime_fix.fix.time; +#endif tp->altitude = alt; /* speed only available for 3D fix. Check for NAN when use this speed */ tp->speed = vgl->realtime_fix.fix.speed; -- cgit v1.2.3 From 9d547de9b248fad1353cba71de00d95b35e9cd97 Mon Sep 17 00:00:00 2001 From: Bernd Zeimetz <bzed@debian.org> Date: Sat, 16 Oct 2010 18:57:01 +0200 Subject: [PATCH] disable-po-check Gbp-Pq: Name 0001-disable-po-check.patch --- po/Makefile.in.in | 8 ++------ 1 file changed, 2 insertions(+), 6 deletions(-) diff --git a/po/Makefile.in.in b/po/Makefile.in.in index fcd2c3b..9a494ad 100644 --- a/po/Makefile.in.in +++ b/po/Makefile.in.in @@ -145,12 +145,8 @@ uninstall: rm -f $(DESTDIR)$(localedir)/$$lang/LC_MESSAGES/$(GETTEXT_PACKAGE).mo.m; \ done -check: all $(GETTEXT_PACKAGE).pot - rm -f missing notexist - srcdir=$(srcdir) $(INTLTOOL_UPDATE) -m - if [ -r missing -o -r notexist ]; then \ - exit 1; \ - fi +check: + # do nothing as it messes up with quilt's .pc folder. mostlyclean: rm -f *.pox $(GETTEXT_PACKAGE).pot *.old.po cat-id-tbl.tmp -- cgit v1.2.3 From 3d247e369053c08af0bc9719686ac8e7fa4ea4c8 Mon Sep 17 00:00:00 2001 From: Bernd Zeimetz <bzed@debian.org> Date: Sat, 19 Nov 2016 00:15:50 +0100 Subject: fix build on hurd Gbp-Pq: Name fix_build_on_hurd --- src/metatile.h | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/src/metatile.h b/src/metatile.h index 0206133..50d5b0c 100644 --- a/src/metatile.h +++ b/src/metatile.h @@ -26,3 +26,7 @@ int xyz_to_meta(char *path, size_t len, const char *dir, int x, int y, int z); int metatile_read(const char *dir, int x, int y, int z, char *buf, size_t sz, int * compressed, char * log_msg); + +#ifndef PATH_MAX +#define PATH_MAX 4096 +#endif -- cgit v1.2.3 From a15da9a17c34a435d1d6e0258c04cf92386d8ea5 Mon Sep 17 00:00:00 2001 From: Bernd Zeimetz <bzed@debian.org> Date: Thu, 2 Jul 2020 17:30:19 +0200 Subject: no-doc-dir Gbp-Pq: Name no-doc-dir --- Makefile.am | 2 +- configure.ac | 11 +---------- 2 files changed, 2 insertions(+), 11 deletions(-) diff --git a/Makefile.am b/Makefile.am index e59a6b3..4d283ec 100644 --- a/Makefile.am +++ b/Makefile.am @@ -1,4 +1,4 @@ -SUBDIRS = src test data po windows help tools doc +SUBDIRS = src test data po windows help tools INTLTOOL = \ intltool-extract.in \ diff --git a/configure.ac b/configure.ac index 94b7bff..264b5ea 100644 --- a/configure.ac +++ b/configure.ac @@ -11,13 +11,6 @@ AM_INIT_AUTOMAKE([dist-bzip2 dist-zip subdir-objects]) dnl AC_CONFIG_SRCDIR([src/main.c]) AC_CONFIG_HEADERS([src/config.h]) -# check for gtk-doc -m4_ifdef([GTK_DOC_CHECK], [ -GTK_DOC_CHECK([1.0],[--flavour no-tmpl]) -],[ -AM_CONDITIONAL([ENABLE_GTK_DOC], false) -]) - AC_PROG_CC AC_PROG_CC_STDC # Checks for programs. @@ -594,9 +587,7 @@ AC_CONFIG_FILES([ windows/installer/Makefile windows/installer/pixmaps/Makefile windows/installer/translations/Makefile - doc/Makefile - doc/reference/Makefile - doc/examples/Makefile]) + ]) AC_OUTPUT -- cgit v1.2.3 From 6de5bbf4486c488c8aa96bdf4270fc7434d51a05 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Ball=C3=B3=20Gy=C3=B6rgy?= <ballogyor@gmail.com> Date: Wed, 11 Mar 2020 21:57:58 +0100 Subject: [PATCH] Port to yelp-tools This removes the usage of deprecated gnome-doc-utils. Gbp-Pq: Name 18d7c02d5829ec796efaa6b0fba0632f478048ba.patch --- Makefile.am | 7 - README.md | 6 +- configure.ac | 21 +- help/C/index.docbook | 4151 ++++++++++++++++++++++++++++++++++++++++++++++++++ help/C/legal.xml | 2 +- help/C/viking.xml | 4151 -------------------------------------------------- help/Makefile.am | 28 +- help/viking.omf.in | 10 - src/Makefile.am | 12 +- src/vikwindow.c | 2 +- 10 files changed, 4168 insertions(+), 4222 deletions(-) create mode 100644 help/C/index.docbook delete mode 100644 help/C/viking.xml delete mode 100644 help/viking.omf.in diff --git a/Makefile.am b/Makefile.am index 4d283ec..3ba1376 100644 --- a/Makefile.am +++ b/Makefile.am @@ -12,7 +12,6 @@ full: EXTRA_DIST = \ README.md \ HACKING \ - gnome-doc-utils.make \ ChangeLog.0 \ viking.spec \ mingw-viking.spec \ @@ -29,9 +28,6 @@ generate-changelog: dist-hook: viking.spec generate-changelog cp $(top_builddir)/viking.spec $(distdir) -MAINTAINERCLEANFILES = \ - gnome-doc-utils.make - DISTCLEANFILES = \ intltool-extract \ intltool-merge \ @@ -39,8 +35,5 @@ DISTCLEANFILES = \ ACLOCAL_AMFLAGS = -I m4 -DISTCHECK_CONFIGURE_FLAGS = \ - --disable-scrollkeeper - # Ignore gtk theme cache files on distcheck distuninstallcheck_listfiles = find . -type f -print | grep -v 'icon-theme.cache' diff --git a/README.md b/README.md index 7eb70cc..d71f4c1 100644 --- a/README.md +++ b/README.md @@ -27,7 +27,7 @@ Git repository: On Debian Sid, following packages must be installed before building: - # sudo apt install gtk-doc-tools gnome-doc-utils libpng-dev libgtk-3-dev libicu-dev + # sudo apt install gtk-doc-tools docbook-xsl libpng-dev libgtk-3-dev libicu-dev The following packages are needed (they are included by default in Debian Sid, but not in other distributions). They must be installed too: @@ -37,10 +37,6 @@ The following packages are also used, but they can each be disabled with configu $ sudo apt-get install libsqlite3-dev nettle-dev libmapnik-dev libgeoclue-2-dev libgexiv2-dev libgps-dev libmagic-dev libbz2-dev libzip-dev liboauth-dev -Further packages are required if you want to generate man and help page documentation: - - $ sudo apt-get install docbook-xsl rarian-compat - ### Actual Build If you downloaded Viking from Git, you have to: diff --git a/configure.ac b/configure.ac index 264b5ea..9615f53 100644 --- a/configure.ac +++ b/configure.ac @@ -104,7 +104,7 @@ AC_SUBST(PACKAGE_LIBS) dnl ------------- dnl | User Manual |--------------------------------------- dnl ------------- -GNOME_DOC_INIT +YELP_HELP_INIT dnl --------------------------------------------------------------------------- dnl - Use deprecated options (default enabled for devs, disabled in releases) @@ -546,23 +546,7 @@ AC_DEFINE_UNQUOTED(VIK_CONFIG_DEFAULT_TILE_AGE, ${VIK_CONFIG_DEFAULT_TILE_AGE}, AC_DEFINE(HAVE_VIKING, 1, [Enable Viking specifics in otherwise reusable code]) dnl man pages processing -dnl Different distributions have differing locations for the docbook.xsl -dnl Debian like -if test -r /usr/share/xml/docbook/stylesheet/docbook-xsl/manpages/docbook.xsl; then - DB2MAN_XSL=/usr/share/xml/docbook/stylesheet/docbook-xsl/manpages/docbook.xsl -dnl RedHat like -elif test -r /usr/share/sgml/docbook/xsl-stylesheets/manpages/docbook.xsl; then - DB2MAN_XSL=/usr/share/sgml/docbook/xsl-stylesheets/manpages/docbook.xsl -else -dnl Old default - DB2MAN_XSL=/usr/share/sgml/docbook/stylesheet/xsl/nwalsh/manpages/docbook.xsl -fi -AC_SUBST(DB2MAN_XSL) -AC_PATH_PROG(XP,xsltproc) -AM_CONDITIONAL([HAVE_XSLTPROC],[test "x$XP" != "x"]) -AC_CHECK_PROG([HAVE_SCROLLKEEPER],scrollkeeper-config,"yes") -AM_CONDITIONAL([GEN_MANPAGES],[test "x$XP" != "x" && test -r "$DB2MAN_XSL"] && test "${HAVE_SCROLLKEEPER}" = "yes" ) -AM_COND_IF([GEN_MANPAGES], [ac_cv_enable_man=yes], [ac_cv_enable_man=no]) +AC_PATH_PROG(XSLTPROC,xsltproc) ISODATE="$(date --utc --date="@${SOURCE_DATE_EPOCH:-$(date +%s)}" +%Y-%m-%d)" AC_SUBST(ISODATE) @@ -618,7 +602,6 @@ OAuth : $ac_cv_enable_oauth Size of map cache (in memory) : ${VIK_CONFIG_MAPCACHE_SIZE} Age of tiles (in seconds) : ${VIK_CONFIG_DEFAULT_TILE_AGE} GeoNames user : ${VIK_CONFIG_GEONAMES_USERNAME} -Man page generation : $ac_cv_enable_man Documentation (+HTML) : ${enable_gtk_doc} (HTML: ${enable_gtk_doc_html}) ------------------------------------------- diff --git a/help/C/index.docbook b/help/C/index.docbook new file mode 100644 index 0000000..d7e8bd3 --- /dev/null +++ b/help/C/index.docbook @@ -0,0 +1,4151 @@ +<?xml version="1.0"?> +<!DOCTYPE article PUBLIC "-//OASIS//DTD DocBook XML V4.5//EN" +"http://www.oasis-open.org/docbook/xml/4.5/docbookx.dtd" [ + <!ENTITY appname "Viking"> + <!ENTITY app "<application>Viking</application>"> + <!ENTITY appversion "1.8"> + <!ENTITY manrevision "1.8"> + <!ENTITY date "February 2020"> + <!ENTITY extfiles "<filename>maps.xml</filename>, <filename>goto_tools.xml</filename>, <filename>datasources.xml</filename>, <filename>external_tools.xml</filename>, <filename>routing.xml</filename>"> +]> +<!-- + (Do not remove this comment block.) + Maintained by the GNOME Documentation Project + http://live.gnome.org/DocumentationProject + Template version: 3.0 beta + Template last modified 2006-11-21 + +--> +<!-- =============Document Header ============================= --> +<article id="index" lang="en"> + <articleinfo> + <title>&app; Manual + + &app; is a free/open source program to manage GPS data. + + + + 2013 + Guilhem Bonnefille + Rob Norris + + + + + GNOME Documentation Project + + + + + + + + Guilhem + Bonnefille + + + Rob + Norris + + + + username: + Alexxy + + + username: + Vikingis + + + username: + Tallguy + + + username: + EliotB + + + Alex + Foobarian + + + + + + + &appname; Manual V&manrevision; + &date; + + Guilhem Bonnefille guilhem.bonnefille@gmail.com + Rob Norris rw_norris@hotmail.com + GNOME Documentation Project + This document was generated on . + + + + + This manual describes version &appversion; of &appname;. + + + Feedback + To report a bug or make a suggestion regarding the &app; application or + this manual, follow the directions in the + Feedback section of the GNOME User Guide. + + + + + + &app; + + +
+ Introduction + +&appname; aims to be easy to use, yet powerful in accomplishing a wide +variety of tasks. Some of the things you can use &appname; for are: + + + +Uploading and downloading waypoints, tracks and routes to/from GPS. + + + +Preparing tracks, routes and waypoints for trips using maps from services such as OpenStreetMap (OSM). +The data is only needed to be uploaded to your GPS before you leave. +The maps together with your tracks, routes and waypoints can also be printed and used during the trip. + + + + +After trips, tracks and waypoints from GPS can be downloaded, stored, managed and reused in your (or your friends') later trips. + + + + +Analyzing Off Highway Vehicle (OHV) and hiking trips, understanding where you went and how far you were from something. + + + +Making waypoints, tracks and routes to follow to easily get someplace +you've never been before or don't have GPS data for but online +maps exist for it. + + + + +Making maps with using Mapnik. +Not on Windows at the moment. + + + + +Grouping data from multiple trips using a hierarchical data manager. + + + + +Analyzing speed at different places (to some degree), adding waypoints where you forgot to mark one but did slow down or stop. + + + + +Downloading and storing OpenStreetMap and/or other map types on your hard drive and looking at them later. + + + + +Editing routes or tracks and their trackpoints, joining and splitting up tracks and routes. + + + + +Show the live GPS position on the map (for use on a mobile device - e.g. a laptop). Not Windows at the moment. + + + + +Import and export track, route and waypoint files of various types via GPSBabel + + + +Previously on Windows, GPSBabel was distributed with &appname;, but this no longer the case. + + +It can be downloaded from its website . + + + + + +View, create and update Geotagged Images (using EXIF data). + + + + + +&appname; is under continual improvement: see the the Roadmap / Wishlist: + + +
+Screenshot: OSM Cycle Map and Many Tracks + + + +
+ + + The Windows build of Viking does not currently support verification of https connections. + + +
+ +
General Concepts +
Layers + +Layers is concept one may know from powerful graphics editors such as Photoshop or GIMP. +Instead of putting all the data on the same level, it is stacked (i.e. layered) with different data over one another. +This can be useful for analysis and general handling of various sets of data. + + +Unfortunately the downside of this complexity is remembering how differing layers of data can obscure other data. + + +The Map layers have Alpha Compositing, +to create the appearance of partial transparency. +By controlling this value one can see data below it in the layer heirarchy for interesting effects. + +
+
Layers Panel + +The panel on the left is called the layers panel. +It determines which layers and sublayers (such as tracks and waypoints) +are shown, and the order in which they are drawn. Layers on the +top of the layers panel list are drawn last. You can change the order by +drag and drop, or by selecting a layer and using the up and down +buttons at the bottom of the layers panel. + + + The panel also contains a calendar to show when Layers occurred. + Double clicking on the day will select and move the viewport display to that layer. + Right clicking brings up a menu from which you can select to go to the previous or next layer in time. + +
+
Viewport + +The main &appname; area where the layer data is drawn, is called the viewport. + +
+
Track Graphs + +Below the viewport can be shown track (and route) elevation/distance and time/speed (tracks only) graphs of the selected item. +These are the same graphs as shown in . +The graphs will automatically hide itself when nothing or no suitable item is selected. + + +Moving the mouse pointer over the graphs will show a tooltip readout of the nearest trackpoint. +Similarily to the track properties graphs, left clicking will center the viewport on the trackpoint. +A right click menu offers controls of the drawing options, a subset of track operations and access to further information dialogs. + +
+
Statusbar +This provides a readout of various information: + +The currently selected (mouse pointer) tool +The number of items to process in the background - normally this the number in the map tile download queue +The zoom factor +The location of the mouse pointer (and potentially height information if DEM data is available) + +When creating a track/route, the statusbar also displays some information about the track/route. +
+Statusbar + + + +
+This part of the statusbar displays: + +The total distance of the track/route (including currently edited segment). +The bearing of the currently edited segment. +The distance of the currently edited segment. + + +For convenience, a zoom selector can be opened from the status bar. Simply left-click on the zoom factor. +
+ The zoom selector available from status bar + + + +
+
+ +
Toolbar +The toolbar is an area for buttons that perform common actions. +Some actions are modal, so the appropriate layer needs selected before these toolbar buttons are enabled. See more detail. +The display of the toolbar is influenced by the +Right clicking on the toolbar and selecting Customize allows jumping to the directly. +
+ +
Projections + +&appname; supports differents projections: + + +UTM + + +LatLon (also called EPSG:4326) + + +Mercator (also called Spherical Mercator) + + + +
+ +
Map Cache + +&appname; stores downloaded map tiles to disk for a couple of reasons: + + +Enables off line usage +Reduces loading on the map tile provider + + +The &appname; automatic caching strategy is two fold: + + + + + If the age of the tile on disk is less than the specified tile age (see ), + it will not attempt to contact the server to get a new version of the tile. + + + + + When the tile age has expired &appname; will attempt a refresh update, so that it provides the cached tile generation timestamp so the server can determine if a new tile image needs to be returned. Not all map types support this refresh method. + + + + + You can override the caching scheme by using right-click on the Map on the layers panel and selecting Redownload All Onscreen Maps, or Ctrl+F5 for the top most map displayed. This will get the latest version held by the server. + + + + This can be useful if you contribute to OpenStreetMap and wish to see your modifications (of course give time for the server to have processed your changes - see I have made edits but they don't show up on the map) + + + + +The layout of the cache on disk itself can be controlled via a per Map Layer property. + +Viking - Legacy default in a private cache layout scheme +OSM - Newer available default (1.6+) + +This is to increase the compatibility between &appname; and similar applications that cache tiles on disk so that the tiles can be shared. + + + + + +
+ +
Shortcut Keys + +&appname; has several shortcut keys or key combinations for commands as listed in the main window along side the command. + + +By default some function keys follow standard GUI behaviour: + + +F1 Help (view this manual) +F5 or Ctrl+R Refresh the maps on screen +F10 Select the Menubar (in built behaviour) +F11 Full Screen +Ctrl+F5 or Ctrl+Shift+R Redownload the maps on screen + + + +Refresh attempts to get new maps only if the local tile cache time period has expired for any particular map tile. +Redownload gets all on screen maps from the server, ignoring the local tile cache. + + + +Other function keys control turn on/off visibility of various elements: + + +F3 Toggle visibility of the Toolbar +F4 Toggle visibility of the Menubar +Shift+F5 Toggle visibility of the Scale indicator on the viewport +F6 Toggle visibility of the Center Crosshairs on the viewport +F7 Toggle showing selected items (e.g. tracks or waypoints) in the highlight colour in the viewport +Shift+F8 Toggle visibility of the calendar +Shift+F9 Toggle visibility of the Layers Panel buttons +F9 Toggle visibility of the Layers Panel +F12 Toggle visibility of the Statusbar +Shift+F12 Toggle visibility of the Track Graphs + + +Standard shortcuts are provided for normal GUI operations: such as creating new files, opening, saving and exitting. +Then there are shortcuts specific to &appname; to switch projection modes, zoom in/out, create layers,switch the active tool mode and move the map: + +Ctrl+Up Pan the viewport North +Ctrl+Right Pan the viewport East +Ctrl+Down Pan the viewport South +Ctrl+Left Pan the viewport West +Ctrl+Keypad+ Zoom In +Ctrl+Keypad- Zoom Out + +These work irrespective of the mode selected +For other combinations see the menu entry themselves. + +
+ +
+Keyboard Configuration +Keyboard configuration is supported by the standard GTK+ way of changing shortcuts for menu entries. +Hover over the menu option with the mouse pointer and press the keyboard shortcut you want to bind it to. +To delete a keyboard assignment, press Backspace whilst over the menu entry. + + + If the keyboard shortcut is already in use you will not receive any notification that new action replaces the old action. + This is probably why most distributions have this facility disabled by default. + Thus you will need to enable Editable menu accelerators for your system. + Check the Desktop Menu and Toolbar Control or other User Interface preferences for this setting. + + + + + For Windows systems this can be done by adding the line gtk-can-change-accels=1 to %USERPROFILE%\.gtkrc-2.0 (create the file if it does not exist). + + +From &app; 1.6+ the keyboard configuration is automatically loaded and saved between sessions in the +
+ +
Tracks vs Routes + +In theory a route is path you are planning to follow and a track is of where you have actually been. The GPX specification splits these into two separate categories, although tracks contain everything route may have. + + +Q. When planning a route what difference does it make if it's a route or a track? + + +A. One difference is in how a GPS device navigates following the route or track. +The capability, the options and data on a particular device also effect how the navigation is performed. +Often the how a device actually works doesn't seem to be formally documented by the manufacturer (and can be firmware dependent too). +Web searches can reveal people's experiences with specific devices on blogs and various forums. +For some devices it will attempt to navigate between route points, which may then suggest various roads and tracks between the points using an internal routing algorithm with some kind of transport profile. +However this is limited to the quality of data available and how well the profile matches ones actual need. +If the points are close enough then the 'best' route for any form of transport will typically be the straight line between the points. + + +There are often restrictions on the numbers of route (or track) points the GPS Device can handle - may be 250 or as little as 50. +This generally not a problem for shorter routes, but needs managing for longer or detailed routes. +The number of track points is normally alot higher (e.g. 500 or typically with latest devices 10,000 or more) and less of a problem. + + + See for helping to manage this. + +
+ +
+ +
File Types and the Main Window + + +&appname; has it's own file type traditionally marked by the .vik file extension. +This is a plain text file saving all information of the current window including the view location, zoom level, projection type and then all the layer information (aggregates, maps, tracks, waypoints, etc...). + + +Besides it's own file type, &appname; can open (and save to via export methods) GPX and KML file types. + + + +&appname; does not handle GPX 1.1 particularly well - it prefers GPX 1.0 + + + +By default &appname; opens a default blank window centered on the home location. This behaviour can be changed by the . +Each window contains menus, a toolbar, a viewport, layers panel and a statusbar. +Each section (apart from the viewport) can be hidden using the or from the +ViewShow choices. + + +One may consider each &appname; window to be a separate project - each with it's project Viking file. +However generally one window is enough for most purposes! + + +Several operations apply at the window level as follows next. +Also see for the operational modes that generally work in conjunction with a selected layer. + + +
New + +Located on the FileNew menu and on the toolbar New. + + +This creates a new window with the default settings. + +
+ +
Open + +Located on the FileOpen menu and on the toolbar Open. + + +This opens a file chooser dialog to select one (or more) files of the supported GPS data file types: + +Viking +GPX +TCX +KML +JPG + + + +GPX, TCX, KML and JPG files will be loaded into the existing &appname; view. A Viking file will be given a new window if the current window is already assigned. + + + +&appname; handles more file types via the Acquire methods below. + + +
+ +
Open Recent File + +Located on the FileOpen Recent File menu only. + + +The most recently opened files are available for opening again. +The number of files remembered is controlled by a value in the . + + +Note that files imported via the Acquire mechanism are not available in this list. + +
+ +
Save + +Located on the FileSave menu and on the toolbar Save. + + +If the current opened file is Viking file, this save will simply update it. +If it is a new file or the file loaded was an external type (i.e. GPX or KML), then this will ask for a new name to save as a Viking file. + +
+ +
Save As + +Located on the FileSave As menu only. + + +This will ask for a new name to save as a Viking file (even it was already a Viking file). + +
+ +
Append File + +Located on the FileAppend File... menu only. + + +Selecting a Viking file from this method will join the file contents to the current window (instead of creating a new one). + + +GPX and KML files may also be appended, whereby the file contents are added to the currently selected or layer. Otherwise they are loaded in the normal file open method when no layer is selected. + +
+ +
Open GPX as External Layer + +Located on the FileOpen GPX as External Layer... menu only. + + +Selecting a GPX file from this method will create an external Layer that loads from the specified file. +The layer is marked as a "no write" external layer, which means any changes made will not be written back to the GPX file. +To enable changes to be written, you can change the layer to a standard external layer in the layer properties dialog. +This is in contrast to importing the data and storing it in the Viking file. + +
+ +
Properties + +Located on the FileProperties menu only. + + +Displays some simple properties about the loaded Viking project file (if any), such as full filename including the path, the filesize and the date/time of the file. + +
+ +
Export All + +Located on the FileExport All menu only. +Choose either the GPX or KML option. + +This allows converting every layer from the existing project into files of the type choosen. +You will be prompted for a directory into which a new file for each layer will be saved. + + +The KML option uses GPSBabel and so will not be available if GPSBabel can not be detected. + + +Note that some data properties are not supported by the target export file type. Such as item visibility or track colours. + +
+ +
Acquire + + +Available on the FileAcquire menu and from the layer menu. + + +If used from the File menu these methods place the results in a new TrackWaypoint layer. + + +If used from the layer menu these methods place the results in that TrackWaypoint layer. + + +
+From GPS + +FileAcquireFrom GPS +Probably the easiest way of getting information from a GPS Device. + + +Select the GPS Device communication settings and then hit OK. +See the Getting Started section for more info about the settings. + + + +Some GPS devices (such as the Garmin Nuvi 255) support a native file system and write information to a Current.gpx file or similar. You will have to browse the file system on the device and open it directly. + + +
+ +
+Import File With GPSBabel + +FileAcquireImport File With GPSBabel + + +Other formats can be imported that are supported by GPSBabel. + + +You need to select the file and the type of the file that is going to be opened, +since there is no automatic detection of the file kind. + +
+ +
+OSM Traces + +FileAcquireOSM Traces + + +See section for more information. + +
+ +
+My OSM Traces + +FileAcquireMy OSM Traces + + +See section for more information. + +
+ +
+From Geotagged Images + +FileAcquireFrom Geotagged Images +Enables automatic creation of waypoints from geotagged images. + + +This menu opens a dialog to select such image files. +If the image files have geotag information in them, then a layer with named waypoints positioned at the location of each image with a thumbnail of that image is created. + +
+ +
+From Wikipedia Waypoints + +FileAcquireFrom Wikipedia Waypoints + + +This gets interesting points from Wikipedia for the specified view: either within the extent of layer bounds or within the current viewport boundary. + +
+ +
+From Routing + +FileAcquireFrom Directions + + +This gets a route from given directions. + +
+ +
+From URL + +FileAcquireFrom URL + + +This gets a file from the entered URL. +File formats that can be opened are those supported by GPSBabel. + + + +You need to select the type of the file that is going to be returned, since there is no automatic detection of the file kind. + + +
+ +
+Import GeoJSON File + +FileAcquireImport GeoJSON File + + +This uses the program togpx to load .geojson files. +If the program is not detected on your system, then this option will not be available. +See here for the installation method. + + +Versions proir to 1.6.0 of GPSBabel did not support the GeoJSON file format. + +
+ +
+ +
Print + +Located on the FilePrint menu and on the toolbar Print. + + +Print uses what is displayed on the current map view for printing: i.e. what ever map, tracks and waypoints that are in view, including the +cross hairs and the scale. + + +It uses a standard system print dialog using an image the size of the current viewport in pixel terms. +On the Image Settings you can move the image around the page and scale the image up / or down. + +
+ +
Generate Image File + +Located on the FileGenerate Image File menu only. + + +Allows generation of larger (pixel) area images than the standard Print method above. +From the generated image you can use the facilities of the Operating System to print the image +or perform other actions. + + +You should have previously downloaded the tile images for the chosen zoom level, +otherwise the image produced will have missing sections. + + + +Using large areas takes some time to process and due to the method used it may run out of memory to complete the operation. +Unfortunately under Windows systems it can not detect this failure and may crash the program. +So the maximum size is dependent on the capabilities of your system. +For instance the largest successful image generated on my (RN) Debian system is a pixel area of 20,000 x 20,000. + + +
+ +
Generate Directory of Images + +Located on the FileGenerate Directory of Images menu only. + + + +This is only available in UTM mode. + + +
+ +
KMZ Map File Overview + +A KMZ file is a compressed version of a KML file and associated supporting files. + + +A KMZ Map file is a KMZ file with an image overlay often for use as a Custom Map on Garmin GPSr devices. + + +&appname; only supports basic properties in KMZ Map files, primarily intended for use with Garmin GPSr devices although KMZ exports are known to be work with Google Earth. + +
+ +
Import KMZ Map File + +Located on the File menu only. + + +Enables loading of a selected KMZ map file. +This generates a new map layer using the overlay image contained within the KMZ file. + +
+ +
Generate KMZ Map File + +Located on the File menu only. + + +Enables exporting the current viewport as a KMZ map file. +The area and zoom level covered by the KMZ map can be adjusted before saving. + + +Note that Garmin GPSr devices have limits in using images if they are too large (e.g. over 3Mb big) in KMZ files. +&appname; does not enforce any limits on the KMZ files it generates. + +
+ +
+ +
Layers + + +Layers supported by &appname; are: + + + + + + + + + + + + + +For each layer there are a few standard options: + + +Properties - Layer setup / configuration settings +Cut +Copy +Paste +Delete +Visibility - This checkbox on the Layers Panel controls whether the layer is shown in the viewport or not + + +The cut/copy/paste options can be accessed in a variety of ways once the layer has been selected: + + +Standard keys: Ctrl+x|c|v +Main menu Edit +From the right click menu +Buttons at the bottom of the Layers Panel + + +Default values used for each layer's properties can be altered via the EditLayer Defaults menu options. + + +See the individual section for detail about each layer. + +
+ +
TrackWaypoint Layer + +TrackWaypoint layers display GPS data (tracks, routes and waypoints). + +One way to create new waypoints is to copy a +latitude/longitude coordinate pair, such as the one shown on most +geocaches, and paste it into an active TrackWaypoint layer. &appname; can +automatically recognize several variations of the lat/lon format. + + +By right-clicking on tracks, routes or waypoints in the , you can access many commands on them. +You can easily find a specific track, route or waypoint by expanding the appropriate containing Tracks, Routes or Waypoints sublayer in the +layers panel to show all the individual items and then typing the name of the track, route or waypoint. + + + +The containing Tracks, Routes or Waypoints sublayers are only shown when items of that type exist. +To start creating them enter into a create mode via either the Create toolbar commands or the New menu commands. + + + +The new TrackWaypoint layer dialog allows the layer to be specified as external. +In this case the layer is exported as GPX to the file specified instead of stored in the Viking file itself. +It is also possible to specify the layer as "no write". +This means that &appname; does not write the layer to the GPX file specified; instead, &appname; only reads the file. +No-write layers are primarily intended to be used with the option in the File menu. + + + +External layers are loaded only when they are displayed or selected. +Hence, they will not appear in any summary statistics if they have not been loaded. +It is possible to load all external layers contained in an layer by selecting "Load External Layers" from the Aggregate Layer context menu. +Note, &appname; specific options may not be saved if not supported by the GPX export. + + + +The sublayers also offer right click menu options. +These are the same as those available at the TrackWaypoint level, but only those that relate to the sublayer type. + + + +By default routes are coloured red. Tracks are automatically assigned a spread of colours. + + + +Most operations available on tracks are available on routes, except for functionality that relies on having timestamps - since routes by definition have no timing information. Thus for example, uploading a route to OpenStreetMap Traces is not available nor is Geotagging on a route. +It is possible to convert between Tracks and Routes, although converting from a Track to a Route may involve a loss of information (hence you are required to confirm this operation before it happens). + + + +Also see for use in conjunction with this layer. + + +
Layer Operations + +The layer has a context menu with several operations. + + +
View Layer + +Version1.1+: This will automatically move the viewport and select the best zoom level to see the whole layer (i.e. all tracks, routes and waypoints). + +
+ +
View + +
View All Tracks + +Version1.1+: This will automatically move the viewport and select the best zoom level to see the all the tracks in the layer (ignoring positions of any routes or waypoints). + +
+ +
View All Routes + +Version1.4+: This will automatically move the viewport and select the best zoom level to see the all the routes in the layer (ignoring positions of any tracks or waypoints). + +
+ +
View All Waypoints + +Version1.1+: This will automatically move the viewport and select the best zoom level to see the all the waypoints in the layer (ignoring positions of any tracks or routes). + +
+ +
+ +
Goto Center of Layer + +This will automatically move the viewport to see the whole layer (i.e. tracks, routes and waypoints). It does not adjust the zoom level. + +
+ +
Goto Waypoint + +This opens a dialog box to enter a name of waypoint to search for. If it is found the viewport is centred on it. + + + +Note this search is not very clever and only finds exact matches. +You are probably better off expanding the waypoint list and directly start typing, as mentioned above, which finds a match based on each letter typed. + + +
+ +
Export Layer + +The layer (all tracks, routes and waypoints) can be exported to following file formats: + + + + GPX + + + GPSPoint + + + GPSMapper + + + Google's KML + + + Any GPSBabel File Formats + + + GeoJSON. Via the program togeojson + This option will not be available if the program is not detected on your system. + See here for the installation method. + + + +Version1.1+: An individual track can be exported to a GPX file via the track menu. + +
+ +
Finish Track or Route + +Selecting this option ends the creation of that individual track or route. + + + +This is only available when a track or route is being created by the or tools. + + +
+ +
New +
New Waypoint + +This opens a dialog box to create a new waypoint. A default name will be suggested and the default position is the center of the viewport. + +
+
New Track + +This turns on the tool. + +
+
New Route + +This turns on the tool. + +
+
+ +
Geotag Images + +This starts the Geotagging Images dialog against all tracks in the layer. +See Geotagging for further detail. + +
+ +
Acquire + +This offers the same choice from methods as on the File menu. +However when invoked from here, the results will be stored in this layer (instead of creating a new one). + +
+ +
Upload + +
Upload to GPS + +This opens a dialog to select the GPS Device and port to which the layer information will be transferred. + + +The types of GPS information (tracks, routes or waypoints) to be transferred can be selected. + + +Tracks, Routes or Waypoints that are invisible will not be transferred. + +
+ +
Upload To OSM + +This opens a dialog to upload all tracks and waypoints to OpenStreetMap traces. +Useful if you are an OpenStreetMap contributor, access details are stored in &appname; + + + &appname; allows you to edit a track, e.g. remove duplicate points, perhaps remove track points leading to your home and then upload it to OpenStreetMap. + +
+
+ +
Delete +Offers deletion of various parts of a TrackWaypoint layer: +
Delete All Tracks +Deletes all the tracks in this layer. +
+
Delete Tracks from Selection +Opens a dialog with list of all the tracks from this layer to choose the ones to delete. +
+
Delete All Routes +Deletes all the routes in this layer. +
+
Delete Routes from Selection +Opens a dialog with list of all the routes from this layer to choose the ones to delete. +
+
Delete All Waypoints +Deletes all the waypoints in this layer. +
+
Delete Waypoints from Selection +Opens a dialog with list of all the waypoints from this layer to choose the ones to delete. +
+
Delete Duplicate Waypoints + + Deletes duplicate waypoints in this layer. + Waypoints are considered duplicate if they have the same location and symbol. + + If other properties are different such as name, comment, altitude, etc... they will still be considered a duplicate. + + + +
+
+ +
Filter +
Simplify All Tracks + +This opens dialog to request the number of points each track will be simplified using GPSBabel. The result is put into a new layer. The simplification method removes points considered to be in a 'near straight line', thus reducing the number of points and attempting to keep the most important turning points. + +
+
Compress Tracks + +Enables compression of tracks and routes via GPSBabel's Crosstrack simplify method. +It opens a dialog to request the Error factor value which is the maximum allowable error that may be introduced by removing a single point. +It is expressed a distance in units as specified by the distance option. +Thus a higher value will remove more points. +The result is put into a new layer. + +
+
Remove Duplicate Waypoints + +Remove Duplicate Waypoints - fairly self explainatory, with the results created in a new layer. + + + +However it only considers a precise position (waypoints only 1 metre away from each other are considered different) and also doesn't consider if the waypoints have different comments, symbols or images. + + +
+
+ +
Filter With <emphasis>Trackname</emphasis> + +This runs GPSBabel on the layer using information from a previously selected track (select via the track menu "Use With Filter" option) with the following command types: + + +Waypoints Inside This +Waypoints Outside This + + +The result is generated in a new Track/Waypoint layer. + +
+ +
Geotag Images + +This starts the Geotagging Images dialog using the specific track. +See Geotagging for further detail. + +
+ +
List Tracks or Routes + +Opens a new dialog with the list. As described in the Aggregate layer + +
+ +
List Waypoints + +Opens a new dialog with the list. As described in the Aggregate layer + +
+ +
+ +
Track and Route Sublayer Options +Repeats options available at the TrackWaypoint level, but only those for tracks and routes: + + +Finish Track or Route +Same as the layer Finish Track or Route + + +New Track or Route +Same as the layer New Track or New Route + + +View All Tracks or Routes +Same as the layer View All Tracks or View All Routes + + +Delete All Tracks or Routes +Same as the layer Delete All Tracks or Delete All Routes + + +Delete Tracks or Routes from Selection +Same as the layer Delete Tracks from Selection or Delete Routes from Selection + + +List Tracks or Routes +Opens a new dialog with the list. As described in the Aggregate layer + + +Also gives other options for handling multiple items: + + +Sort +Gives the ability to sort the items in the treeview alphabetically or by date. + + +Visibility +Offers options to quickly control the visibility of all items within the sublayer, as per + + +
+ +
Track and Route Properties + +This shows several tabs for properties and useful statistics about a track or a route, including elevation-distance and speed-time graphs (if data is available). +Moving the mouse pointer over the graph displays values related to that point along the track. +You can click on these graphs to jump to the point in the track. +You can reverse it, delete duplicates, split at marked position or split a track from its component segments (discontinuous breaks in a track) into separate tracks. + + +For the elevation related graphs the Show DEM check button is only enabled if a suitable is available that overlaps the track. + + +Graphs either have a Show GPS Speed or Show Speed button. +Each of these overlays relative speed markers along the graph. +The difference between Speed vs GPS Speed is that GPS Speed is taken directly from a field reporting the speed value in the source data. +Typically speeds used in Viking are calculated between the points time and position differences. +This is due to the reporting of speed values in source data is not mandatory and often not present. + +
Track and Route Properties Tab + +
+Properties Tab: Example + + + +
+
+
+
Track and Route Statistics Tab + +
+Statistics Tab: Example + + + +
+
+
+
Track Elevation Graph + +
+Elevation Distance Tab: Example + + + +
+
+ +The following colors are used in the elevation-distance graph: + + + +Main colour - this is dependent on your Desktop theme - often blue by default +elevation data in graph + + +Yellow + +no elevation data + + + +Green + +elevation data from DEM + + + +Red + +speed + + + +
+ +
Track Time Splits + +
+Splits Tab: Example + + + +
+
+ +This tab displays timing splits on tracks with timing information. +A few different values of split lengths are available, each having it's own tab display. + +
+
+ +
Track and Route Operations + +
Finish Track + +Selecting this option ends the creation of the individual track. + + + +This is only available when a track is being created by the tool. + + +
+ +
Goto + +This centers the viewport on the selected position on the track: + + +Startpoint +"Center" - the notional center from the bounds of the track +Endpoint +Version1.1+: Highest Altitude +Version1.1+: Lowest Altitude +Version1.1+: Maximum Speed (Not Available on Routes) +Version1.8+: Previous trackpoint +Version1.8+: Next trackpoint + +
+ +
View + +Version1.1+: This centers the viewport on the track and selects the best zoom level to see it. + +
+ +
Combine +
Merge By Time + +This operation repeatedly tries to merge the right-clicked track +with tracks in the same TrackWaypoint layer. The tracks which are +merged are those which have at least one trackpoint less than some +threshold time away. This way, if you somehow end up with lots of small +segments (say, caused by turning the GPS on and off) you can merge them +easily into one track. + + + +This is not available on routes as they have no timestamps. + + +
+ +
Merge With Other Tracks + + This opens a dialog listing the other tracks in the same TrackWaypoint layer, from which one can select the other tracks to merge with. + Tracks are merged in order of time. + +
+ +
Merge Segments + +Combines track segments. Effectively removing track segment markers to leave one segment for the whole track. + +
+ +
Append Track or Route + +Enable joining of a single track to the end of the current track. +This opens a dialog listing the other tracks in the same TrackWaypoint layer from which one can make the selection. + +
+
+ +
Split +
Split By Time + +This operation will split a single track into segments wherever the +time interval between successive trackpoints is larger than some +threshold. This is useful when processing raw NMEA GPS data, especially +taken over a long time. + + + +This is not available on routes as they have no timestamps. + + +
+ +
Split By Number of Points + +Version1.2+: This operation will split a single track into segments by the number of points specified. +This can be useful with devices which may have limits on the number of points it supports. + +
+ +
Split Segments + +Splits track segments into new tracks. + + + +This is not available on routes as they do not have route segments. + + +
+ +
Split at Trackpoint + +Splits the track at the currently selected trackpoint. + + +The current track will finish at this trackpoint. +A new track will start from a copy of this trackpoint. + + + +This is only enabled when a trackpoint is selected. + + +
+
+ +
Insert Points + + +These options are only enabled when a trackpoint is selected. + + +
Insert Point Before Selected Point + +Inserts a track point halfway between the previous track point and the current track point. +All track point properties are interpolated between the two points. + +
+
Insert Point After Selected Point + +Inserts a track point halfway between the current track point and the next track point. +All track point properties are interpolated between the two points. + +
+
+ +
Delete Points +
Delete Selected Point + +Deletes the currently selected track point. + + + +This is only enabled when a trackpoint is selected. + + +
+
Delete Points With the Same Position + +Deletes subsequent points that have the same position (but have different timestamps). + +
+
Delete Points With the Same Time + +Deletes subsequent points that have the same time stamp (but may have different positions). + + + +This is not available on routes as they have no timestamps. + + +
+ +
+ +
Transform + +These options alter the data of trackpoints of a track but not add or remove trackpoints. +And don't seem to fit any other category :) + +
Apply DEM data + +If any DEM data is loaded, this will apply the DEM data to give the track elevation data. +Two ways of applying DEM data are offered: + +Keep. Retains the existing elevation data of trackpoints and only those missing an elevation value are set. +Overwrite. Elevation data are set on all trackpoints even if they already elevation values. + + +
+
Smooth Missing Elevation data + +In various locations across the world, there are missing DEM values (AKA DEM Holes) from the SRTM data. +This is particularly noticeable in mountainous areas. +Two ways of applying elevation data to trackpoints that do not have elevation values are offered: + +Interpolated. Missing elevation data is interpolated between the previous and next known values. +Flat. Elevation data is filled in from the last previously known value. + + +
+
+Convert to Track or Route + +If this is a Route then it will convert it to a Track. + + +If this is Track then convert it to a Route. + + + +Converting from a Track to a Route may involve a loss of information, in particular timestamp values (hence you are required to confirm this operation before it happens). + + +
+
+Anonymize Times + +Timestamp information of a track can be shifted to be all offset from 1901-01-01. + + +Thus the timestamps themselves will no longer reveal exactly when a track was taken. +However the relative difference between the timestamps is kept thus one is still able to calculate some properties such as speeds along the track. + + + +This is not available for routes, as they have no timestamps. + + +
+
+Interpolate Times + +Trackpoint timestamps between the first and last points are calculated such that track is travelled at equal speed. +This is mostly useful when tracks don't have timestamps and you wish to recreate your trip (e.g. you've forgotten to turn on your GPS or the batteries have run out) +Thus edit the first and last trackpoints to set the approximate times of your trip and then use this to give approximate times along the track. +When used on tracks with timestamps this will overwrite the existing timestamps. + + + +This is not available for routes, as they have no timestamps. + + +
+
+ +
Export Track as GPX + +Version1.1+: This allows exporting the track as a GPX file by opening a file save dialog. + +
+ +
Extend Track End + +Changes the current tool to add trackpoints to the end of the track. + +
+ +
Extend Using Route Finder + +Enables the Route Finder tool. Thus on a subsequent left click in the viewport, a route is calculated from the end of track to that point using the default route service and applied to the track. + +
+ +
Upload + +
Upload to GPS + +Same as the layer Upload to GPS command, but only applies to the track. + +
+ +
Upload to OSM + +Same as the layer Upload to OSM command, but only applies to the track. + +
+ +
+ +
Use With Filter + +This selects the track to be used in the Filter With Trackname feature. + + + +This is not available on routes. + + +
+ +
Edit Trackpoint + +This opens the Trackpoint edit dialog. See . + + + +This is only enabled when a trackpoint is selected. + + +
+ +
Refine Route... + +This function allows to request a Routing Engine in order to refine a given route. +By "refining" we mean computing all real intermediates points between some given major points. +This could be useful to compute a trip giving only the wished important steps. + + + +This is only available on routes. + + +
+ +
View Google Directions + +This option is only available on a track created using the Route Finder tool. + + +Launch a web browser to see the Google directions page which yielded the route. + + + +The record of the Google route is stored in the track's comment, so if the comment is changed (or the route was created by something other than the Route Finder tool) this will not work correctly. + + +
+ +
+ +
Waypoint Sublayer Options +Repeats options available at the TrackWaypoint level, but only those for waypoints: + + +New Waypoint +Same as the layer New Waypoint + + +View All Waypoints +Same as the layer View All Waypoints + + +Goto Waypoint +Same as the layer Goto Waypoint + + +Delete All Waypoints +Same as the layer Delete All Waypoints + + +Delete Waypoints from Selection +Same as the layer Delete Waypoints from Selection + + +Delete Duplicate Waypoints +Same as the layer Delete Duplicate Waypoints + + +List Waypoints +Opens a new dialog with the list. As described in the Aggregate layer + + +Also gives other options for handling multiple items: + + +Sort +Gives the ability to sort the items in the treeview alphabetically or by date. + + +Visibility +Offers options to quickly control the visibility of all items within the sublayer, as per + + +
+ +
Waypoint Properties + + +This shows a dialog with detailed information for the waypoint. Many properties of the waypoint can changed here, such as the comment, the symbol used in drawing or the image (normally a photograph taken at this position) assiocated with it. When a waypoint has an image, a thumbnail of it is drawn in the viewport for the waypoint (in preference to the symbol). + + +If the waypoint has an associated image, then the Geotag information may be updated, either with updating the file's modification timestamp or not. +This can be useful when the waypoint has been moved. + + +
+ +
Waypoint Operations + +
Goto + +This centers the viewport on the selected waypoint. + +
+ +
Geotag Images... + +This opens the Geotag Dialog to allow Geotagging multiple images to the position of this waypoint. +In this circumstance creation of waypoint options are disabled and only the options related to writing the EXIF information are available. + +
+ +
Transform + +Offers a subset of the track utilities. +Currently only setting the altitude from DEM data methods are available. + +
+ +
Visit Webpage + +If the waypoint's comment (or description) starts with http: then this option is available and allows launching a web browser to go to the webpage. + +
+ +
Visit Geocache Webpage + +If the waypoint's name is in Geocache form (GCXXXXX) then this option is available and allows launching a web browser to go to the Geocache page. + +
+ +
New Waypoint + +Same as the layer New Waypoint. + +
+ +
+ +
Version1.3+: Geotag Images + +This dialog allows geotagging images (normally taken with a digital camera) against a specific waypoint or via interpolation against a specific track or all tracks in the TrackWaypoint layer - depending on how it is invoked. + + +When geotagging against tracks, images need to have an EXIF DATE_TIME_ORIGINAL (nearly always set by a camera). This timestamp is then used to find the location when the image(s) was taken by searching through the track(s) to find the nearest time - interpolating between points if necessary to set the location. + + + +Generally it is good policy to synchronize your camera's clock with your GPS clock before taking photographs. However the times can be adjusted afterwards (if necessary) to take into consideration clock differences. + + + +Various options allow control of how the geotagging process is performed: + + +Images - Add the images used for geotagging +Create Waypoints +Overwrite Existing Waypoints +Write EXIF +Overwrite Existing GPS Information +Keep File Modification Timestamp +Automatic Image Direction - Assumes the direction will be in line with the track heading +Interpolate Between Track Segments +Image Time Offset - The number of seconds to ADD to the photos time to make it match the GPS data. Calculate this with (GPS - Photo). Can be negative or positive. Useful to adjust times when a camera's timestamp was incorrect. +Image Time is Local - Are the timestamps in the image local time or otherwise in UTC. +Image Timezone - The timezone adjustment factor. + + +Typically timestamps in images are either in local time or UTC but there is no way of automatically knowing which; so you need to specify which is the case. +Image Time Offset is best used for accounting for camera's clock drift, so normally of the order of a few seconds or minutes. +Whereas Image Timezone is more for adjusting for a camera's timezone difference, or perhaps differences in your current timezone and the timezone the images where taken. + +
+ +
+ +
GPS Layer + +The GPS layer is responsible for uploading and downloading GPS data +from a GPS device. It also is responsible for realtime GPS tracking. +Expand the GPS layer in the layers panel to see the two layers it +uses for uploading and downloading. To upload, download, or use +realtime tracking, right-click the GPS layer and click the appropiate +menu item. + + +
Download + +To download data from the GPS, right-click the GPS layer and click Download from GPS. + +
+ +
Upload + +To upload data to the GPS, first populate the GPS Upload child +layer of the GPS layer (either by creating waypoints/tracks/routes in it, or +copying and pasting or dragging waypoints/tracks/routes from another layer). +Then right-click the GPS layer and click Upload to GPS. + +
+ +
Realtime Tracking + +You must set up gpsd correctly or use a GPSD server and put the +correct information in the GPS layer properties dialog. Then right-click +the layer and select Start Realtime Tracking. + +
+ +
Empty <emphasis>Item</emphasis> + +There are several options to quickly delete a subsection of data: + + +Empty Realtime +Empty Upload +Empty Download +Empty All + +
+ +
+ +
DEM (Digital Elevation Model) Layer + +This layer provides elevation data from the Shuttle Radar Topography Mission (SRTM) + + +Elevation data can be useful in planning trips, as you many wish to avoid/minimise the hills encountered. [OSM Cyclemap is also useful this way too] + + +To download the data use the tool (shown on the toolbar), and then click on a area of the viewport. Once files have been downloaded they can then be loaded from disk via the DEM properties in future application runs. + + +The current data server is: NASA STRM 2.1. + + +ATM &appname; does not auto download DEM data. If you want to get lots of data blocks, you may wish to use some other program get such as curl or wget to download them for an area. + + + +Using many DEMs is CPU/memory intensive. Depending on your computer's capability, &appname; will be less responsive when about 50+ DEM blocks are loaded. It is probably unwise to attempt using 200+ blocks, so trying to use DEMs covering large countries/continents (USA, Australia etc...) is unlikely to work. In these conditions under Linux, &appname; may be automatically stopped by the "OOM Killer" + + + +
+ + +
Maps Layer + +This layer provides a single map resource, you may have multiple map layers but only top one (if enabled) will be visible (subject to the Alpha compositing property). + + +Some maps are continually improving over time (e.g. OpenStreetMap) thus &appname; employs a caching mechanism to avoid redownloading data (see ). +However a forced refresh for the current view can be made via the Reload All Onscreen Maps option or Ctrl+F5. + + + +Also see tool for use in conjunction with this layer. + + +Online Map Tile Providers + +You will need an open internet connection when you are downloading maps these following map types, but once downloaded they are available from the hard disk cache. When map are avaliable from the disk cache it is much faster and can be used offline. +Inbuilt maps include various OpenStreetMap (OSM) ones and more: + + + +Bing Aerial Maps (&appname; Version1.2+) +Mapbox Outdoors - This is the default (&appname; Version1.7+) +OpenStreetMap (Mapnik) +OpenStreetMap (Cycle) +OpenStreetMap (Transport) (&appname; Version1.3+) +OpenStreetMap (Humanitarian) (&appname; Version1.5+) +NASA BlueMarble + + + +&appname; can be configured to handle additional online map resources. See for further detail. + + +Offline Map Tilesets + +Some map types supported are for on disk tile formats: + + + + + On Disk OSM Tile Format + This is equivalent to any map set with OSM Cache Layput. + +MBTiles File + + OSM Metatiles + + This file format is mostly aimed at being rendering cache feature and is Endian dependent. + Thus to successfully view the file cache, the Metatile files and Viking must be of the same endian type (which they probably will be). + + + + +Of course you need to have acquired or generated these tilesets yourself. + + +
Map Layer Properties + +Configurable properties: + + + +Map Type + + The kind of map this layer displays. + Map types are dependent on the current mode. + + + +Maps Directory +Not applicable for MBTiles Map type since it is a single file. + + +Cache Layout +Viking or OSM. See . Only applies to maps from online tile providers. + + +Map File +Ony applicable for MBTiles Map type since it is a single file. + + +Alpha + + Control the Alpha value for transparency effect using a value between 0 and 255 with the default being 255 for a fully solid image. + Zero is fully transparent. A value of around 160 can be useful for blending views of multiple map layers (when applied to the upper most map layer). + + + +Autodownload Maps +This can be useful to turn off when you are not online to avoid pointless download requests or may be keep a map in a 'historical' state. +e.g. perhaps in case a current map rendering is broken. + + +Autodownload Only Gets Missing Maps +Using this option avoids attempting to update already acquired tiles. +This can be useful if you want to restrict the network usage, without having to resort to manual control. Only applies when Autodownload Maps is on. + + +Zoom Level +Determines the method of displaying map tiles for the current zoom level. +Viking Zoom Level uses the best matching level, otherwise setting a fixed value will always use map tiles of the specified value regardless of the actual zoom level. + + +
+ + +
Layer Operations +
Download Missing Onscreen Maps + +This requests map tiles for areas of the viewport that do not currently have one. + +
+ +
Download New Onscreen Maps + +This requests map tiles only if the maps are older than the Tile Age preference. + +
+ +
Reload All Onscreen Maps + +Force a refresh of all visible map tiles. + +
+ +
Download Maps in Zoom Levels + +This opens a dialog to enable requesting the download of maps for the region in the viewport over a specified number of zoom levels. +The download method type can be specified to help limit the number of requests. + + + +There are some inbuilt limits to prevent downloading large amounts of map tiles. + + +Please respect the usage policy of the tile set provider. +Such as OSM Tile Usage Policy. + + + +
+Maps Download Dialog: Example + + + +
+
+
+
+ + +
+ +
Aggregate Layer + +This layer is a container layer to hold other layers. There is always an initial and controlling Top Layer that can not be removed or renamed. + + +This layer type is useful for grouping other layers, especially layers, in whatever categories are relevant to you: such as by activity, location or date. +Here are some suggestions: + +Hiking +Mountain Biking +Road Cycling +Car Trips +Sailing +Holidays +UK Points of Interest +USA Points of Interest +etc... + + + +Thus one can have a list of all your tracks, but groups can be shown or not using the relevant layers visibility checkbox. + + + +Tracks Area Coverage (TAC) is a feature to highlight areas with track coverage. +It is based on OpenStreetMap style tiles - as an approximation to a grid square system. +The size of the area can be changed, which is linked to the OSM Zoom level, +such that a higher Zoom level gives a smaller physical area and so more tiles. +This can be used for general curiousity or perhaps to plan routes to visit areas previously unexplored. + + +The calculations are performed in the background when deemed necessary (e.g. loading in a new file) and can also be manually requested. + + +Note that Viking can be slow in drawing hundreds or more tracks but this analysis is relatively quick and the resulting drawing is much faster. +Thus ATM is it recommended to turn off the visibility of the tracks themselves for this type of usage. + + + +
+Tracks Area Coverage: Example + + + +
+
+ +
Layer Properties: Tracks Area Coverage +Offers basic controls whether it is enabled or not and includes the size of the tile. +
+ +
Layer Properties: TAC Advanced +Controls subsets of TAC drawing are calculated and shown with their colour and opacity. +Note for Max square coverage, ATM it will only draw the first square encountered, although there may be more than one such area. +Note for Cluster coverage, ATM it will only draw the first cluster encountered, although there may be more than one such area. +
+ +
Layer Operations + +The following are available on Aggregate Layers: + + +
New Layer + +Add a new layer of the selected type. + +
+ +
Sort + +The list within the treeview can be sorted. + + +Alphabetical and Date sorts are available. + + + +Generally it is not useful to sort the Top most layer. Sort is mainly intended for Aggregate groups of TrackWaypoint layers. + + +
+ +
Track List + +Selecting this opens a dialog listing all the tracks in a table along side statistics such as track length and maximum speed. +Each column header is clickable and will reorder the list according to that particular column. +You can also rearrange the columns via dragging the column header to the new location. + + +This table may be invoked from a variety of different layer levels and will then list only the relevant tracks (and/or routes). + + +Aggregate Layer +Lists Tracks and Routes and the TrackWaypoint Layer they are in + + +TrackWaypoint Layer +Lists Tracks and Routes + + +TrackWaypoint Track sublayer +Lists Tracks only + + +TrackWaypoint Route sublayer +Lists Routes only + + + + +
+Track List Dialog: Example +
+ +This is showing all tracks and routes (although there are no actual routes here!) in multiple TrackWaypoint layers, that has been sorted by height. +Note that routes will not have timestamps or speeds, but may have elevations and should have some distance! + +
+ + + +
+
+ +Hovering the mouse over an entry will show a tooltip of the comment or description if it is available. + + +Each entry in the track list can be selected and on mouse right click offers these options: + + +View +Move the viewport to the area of the item and highlight it. + + +Statistics +Opens the Properties dialog on the tab. Note this will close the track list dialog. + + +Copy Data +Copy the data fields as text. + + + + +If multiple entries are selected the only right click option is Copy Data. +This copies the individual data fields as plain text separated by tab characters, ideal for pasting into other applications in particular spreadsheet programs. +Note that the order of the fields copied is the default column ordering (irrespective to how they may have been rearranged). + +
+ +
Waypoint List + +Selecting this opens a dialog listing all the waypoints to give a overview of the waypoint information. +Each column header is clickable and will reorder the list according to that particular column. +You can also rearrange the columns via dragging the column header to the new location. + + +This table may be invoked from a variety of different layer levels and will then list only the relevant waypoints. + + +Aggregate Layer +Lists Waypoints and the TrackWaypoint Layer they are in + + +TrackWaypoint Layer +Lists Waypoints + + +TrackWaypoint Waypoint sublayer +Lists Waypoints + + + + +
+Waypoint List Dialog: Example +
+ +This was invoked on a TrackWaypoint layer and shows all waypoints from that single layer. It has been sorted by the symbols. + +
+ + + +
+
+ +Hovering the mouse over an entry will show a tooltip of the description if it is available. + + +Each entry in the list can be selected and on mouse right click offers these options: + + +View +Move the viewport to the area of the item and highlight it. + + +Properties +This will open the properties dialog. Note this will close the waypoint list dialog. + + +Show Picture +If enabled, this will open the associated image in an external Image Viewer program. + + +Copy Data +Copy the data fields as text. + + + + +If multiple entries are selected the only right click option is Copy Data. +This copies the individual data fields as plain text separated by tab characters, ideal for pasting into other applications in particular spreadsheet programs. +Note that the order of the fields copied is the default column ordering (irrespective to how they may have been rearranged). + +
+ +
Visibility Options + +This offers a quick way to set all the visibilities of each item within the containing layer, rather than having to change each one individually. + + +Show All +Ensures all items are set to be visible. + + +Hide All +Ensures all items are set to be invisible. This is useful for then turning on single items afterwards so the display is not cluttered. + + +Toggle +Inverts the visibility status of each item. + + + +
+ +
Search by Date + +This opens calendar dialog to select a date to search by within this Aggregate layer. +The first item that is found on that date will be selected. +Tracks are searched first in preference over waypoints. + +
+ +
Statistics + +This opens a dialog to display various statistics about all tracks contained within this Aggregate layer. + +
+Statistics Dialog: Totals + + + +
+ + + This currently generates a simplified Eddington number. + In that a per track length value is used, rather than trying to work out a length per day. + (i.e. doesn't combine multiple tracks for a single day or split very long tracks into days). + The Eddington number is in the current Unit distance . + + +
+Statistics Dialog: Years + + + +
+
+ +
Append File + +This opens a dialog to select files to load within this Aggregate layer. + +
+ +
Tracks Area Coverage->Calculate + +Start a new Tracks Area Coverage calculation. + +
+ +
Tracks Area Coverage->Remove + +This clears the Tracks Area Coverage information, thus no grid colouring will be displayed. + +
+ +
+
+ + + + + + + +
Coordinate Layer + +This layer is allows drawing of grid lines on the viewport. + +
+ + +
Tools + +&appname;'s mouse actions on the viewport are controlled by which tool is active. Only one tool can be active at a time. The default mode is pan. You can return to the default mode by pressing Escape. + + +You can use the scroll wheel, the middle-click, the middle-click+drag to zoom, center map at position and pan respectively no matter what tool you are using. + + +Scroll: zoom in and out keeping the mouse over same location + + +Ctrl-scroll: pan north-south (also Ctrl-up, Ctrl-down) + + +Shift-scroll: pan east-west (also Ctrl-left, Ctrl-right) + + +Ctrl-shift-scroll: zoom in and out, without changing the center (also Ctrl+, Ctrl- [*not* KeyPad +/-]) + + +Middle-click: make the clicked point on the map the center + + +Middle-click and drag: pan + + +
Pan + +This is the default mode of operation for &appname;. + + +This mode is entered by clicking on the toolbar icon: + + +Pan moves the viewpoint. A single click centers the viewport at that point, whereas click and drag dynamically moves the view around. +This is the default tool. + + +This mode can also be entered by the keyboard shortcut Ctrl+Shift+P + + +Double clicking the left mouse button will zoom the map in. +Shift + double clicking the left mouse button will zoom the map out. +Double clicking the right mouse button will also zoom the map out. + +
+ +
Zoom + +This mode is entered by clicking on the toolbar icon: + + +Zooms in and out on the clicked part of the map or by the selected area. + + +This mode can also be entered by the keyboard shortcut Ctrl+Shift+Z + + +Ctrl + left or right click: Zoom in/out and center the map on the clicked location + + +Shift (and hold) + left mouse button: Draws a bounding box area on which to zoom in. The zoom action is performed when the left mouse button is released. + + +Shift + left click button: Jump Zoom In by up to factor of 3 standard zooms. + + +Shift + right click button: Jump Zoom Out by up to factor of 3 standard zooms. + +
+ +
Ruler + +This mode is entered by clicking on the toolbar icon: + + +The ruler is used to measure either: + + + +The bearing and distance between two points: Click on first point and then move the mouse point around - the values will be continually updated. +A second click will freeze the ruler at that point. + + + +An area: Shift (and hold) + left mouse button: Draws a bounding box area. Area values are shown in the statusbar and on the viewport. +Releasing the mouse button will freeze the area at that point. +The viewport label option is controlled by . + + + + +This mode can also be entered by the keyboard shortcut Ctrl+Shift+U + +
+ +
Version1.1+: Select + +This mode is entered by clicking on the toolbar icon: + + +The select tool allows one to choose any waypoint or track by clicking on it (or reasonably near) in the viewpoint. + + +ATM to select a track one must actually click on a trackpoint, which is also selected. + + +This mode can also be entered by the keyboard shortcut Ctrl+Shift+S + +
+ +
TrackWaypoint Layer Tools + +You must have a Layer selected to use these tools. + +
Create Waypoint + +Enable this tool by clicking on the toolbar icon: + + +Left click will open the new waypoint dialog using the specified position. + +
+ +
Create/Edit Track + +Enable this tool by clicking on the toolbar icon: + + +General track edit/create tool. +The first left-click will create a new track and you will be asked to enter a name for the track. +If Shift is held, a track will be continued from a nearby trackpoint. +Subsequent left-clicks will add new trackpoints. +If Shift is held, the track will be joined to an existing track at the point selected. +If Ctrl is held, it will jump the new trackpoint position to a nearby existing trackpoint. + + +Right click or Backspace: undo one point. + + + + + +Double click or Escape: to finish track creation. +Finishing the track is also available via the right click and track menus. + + +One must finish the current track to be able to create another track. + + +Keypad Add or ]: Insert point after current point. + + +Keypad Minus or [: Insert point before current point. + + +Left: Select the previous point. + + +Right: Select the next point. + +
+ +
Edit Route + +Enable this tool by clicking on the toolbar icon: + + +This operates in exactly the same way as the Edit Track above. + + +One must finish the current route to be able to create another route. + + +One can switch between the Edit Route and Route Finder tools while editing routes. + +
+ +
Create Route Using the Route Finder + +Enable this tool by clicking on the toolbar icon: + + +Requires an internet connection. +Left click to create a new trackpoint. +If it's the initial trackpoint you will be asked to enter a name for the route, otherwise the default routing engine will be queried to find a route to the new trackpoint. +Right click or Backspace: remove the last added route. + + +Escape: to finish route creation. +Finishing the track is also available via the right click and track menus. + + +One must finish the current route to be able to create another route. + + +One can switch between the Edit Route and Route Finder tools while editing routes. + +
+ +
Track Splitter + +Enable this tool by clicking on the toolbar icon: + + +Use this tool to split a track or route. +After enabling the tool, click on the track/route point of the track/route at the position where you want the split to occur. + +
+ +
Edit Waypoint + +Enable this tool by clicking on the toolbar icon: + + +Left Click/drag: select/move a waypoint. +If Ctrl is held at the same time, it will jump the waypoint position to a nearby existing trackpoint. +If Shift is held at the same time, it will jump the waypoint position to a nearby existing waypoint. + +Right-click on waypoint: opens a menu with waypoint actions (the +same menu accessed by right-clicking the waypoint in the layers panel) + +
+ +
Edit Trackpoint + +Enable this tool by clicking on the toolbar icon: + + +Left click near a trackpoint (in screen pixel terms) to bring up the Track Point Edit dialog on that trackpoint. +Whilst the edit dialog is already open, left click again and drag enables moving of the trackpoint. +If Ctrl is held at the same time, it will jump the new trackpoint position to a nearby existing trackpoint. + +
Edit Trackpoint Dialog + +Editing options in the Trackpoint Edit dialog include: + +Edit the trackpoint name +Changing raw lat/long position and altitude +Forward (go to the next trackpoint) +Back (go to the previous trackpoint) +Delete +Insert. Inserts a point halfway to next trackpoint +Split. + + + +Several fields are read only for reference purposes, values are shown if the trackpoint has such information: + +Time. +Speed and course. +'Between' values: Speed, Time Difference and Distance Difference. When moving between trackpoints (via the Back and Forward buttons) these values are calculated. +GPS precision factors. + + + +
+Trackpoint Edit Dialog: Example + + + +
+One must have been going downhill here to get a reasonable speed by bicycle! +
+
+
+ +
Show Picture + +Enable this tool by clicking on the toolbar icon: + + +Opens an image viewer with the picture associated with the waypoint. +By default this uses the default system image viewer. +For Linux you can override this with the setting in the + +
+ +
+ +
Georef Map Layer Tools + +You must have a Map Layer selected to use these tools. + +
Georef zoom + +Enable this tool by clicking on the toolbar icon: + +Changes the zoom level of the georeferenced map and changes the +&appname; zoom level accordingly. Useful if you are trying to match GPS +data to a georeferenced map. + +
+ +
Georef move + +Enable this tool by clicking on the toolbar icon: + + +Drag to move the georeferenced map. + +
+
+ +
Map Download + +You must have a Layer selected to use this. + + +Enable this tool by clicking on the toolbar icon: + + +Click to download a single tile. Drag to download tiles in the dragged rectangle area. + + +Right-click to redownload tiles via the selected method. Right-click and drag to redownload tiles in the dragged rectangle area by the selected method. +The possible methods to redownload one or more tiles are: + + + + +Bad +Only if the tile is corrupt in some way or missing, then this will download a new copy + + +New +Refresh the tile according to the local map cache and if server has a newer version + + +All +Redownload the tile + + + +Map Tile Information + +By right clicking on viewport and selecting Show Tile Information you can see the tile properties of this location for the current map layer and current zoom level. +This includes the remote source URL for the tile and the cached version on the local filesystem with timestamp details. + + + +
+Map Tile Info Dialog: Example + + + +
+This is using MapQuest at &appname; zoom level 128 over the Isle of Wight, UK. +
+
+ +
DEM Download + +You must have a Layer selected to use this. + + +Enable this tool by clicking on the toolbar icon: + + +Click to download and import a DEM file. + +DEM File Information + +By right clicking on viewport and selecting Show DEM File Infomation you can see the file properties of the DEM file for this location. +This includes the remote source URL for the file and the cached version on the local filesystem with timestamp details. + + + +
+DEM File Info Dialog: Example + + + +
+This is for block 51N, 003W - covering Bristol in the UK. +
+
+ +
Webtools + +Many services are available only via a web browser (Google Maps, OpenStreetMap Potlach editor, etc.). + + +Jumping from &app; to such service can become annoying. + + +&appname; allows you to open such service directly at the position currently viewed in &app;. + + +This feature is called Webtools. It is also known as External Tools. + +
+ +
+ + +
Preferences +
General +
Localisation +You can select units displayed by &appname; to best fit your usage. +
+Properties dialog: units part + + + +
+Concerning degrees, you can select the way to display them: + + +DDDdecimal degree + + +DMMpartial sexagesimal display: degrees, minutes and decimal part of minutes + + +DMSsexagesimal display: degrees, minutes and seconds + + + +
+Properties dialog: degree display options + + + +
+
+
Waypoint Icon Size +An option exists to control the icon (symbol) size used for waypoints + +
+
<emphasis>Home</emphasis> Default Location: Latitude and Longitude +You can set the Home location directly by inputting the latitude and longitude in decimal degrees. + +
+
Time Display +This controls the reference timezone that times are shown in. +Locale is the current user's system preference. This was how all times were shown up to version 1.5. +World will attempt to determine the timezone at an object's position. +UTC enforces this standard timezone. +
+
Tile's age +This age is used to decided wether or not a new request to tile server must be done. + +Changing this value, you will increase or decrese the network load. +
+
Default map layer directory +This property sets the default directory of the tiles cache. +This value is used when you create a new map layer. + +You are still able to change this value in each map layer properties. +
+
Map Cache Memory Size +This controls the amount of maps that are stored in memory, rather than having to reread from disk. +Generally if you have a system with lots of memory it's recommended to increase this value. + +
+
+ +
Export/External +
KML Export Units +Allows setting the units used when saved as the KML file type, such as Metric or Statue units +
+
GPX Track Order + + Other software may display tracks in a particular order (often the order saved into the file). + This allows you to control the order they are saved when exporting to a GPX file. + +
+
GPX Waypoint Symbols +Some GPS devices require waypoint symbols to be in a particular case. +E.g. On a Garmin Oregon 450 they must be in Title Case to be recognized. +
+
Image Viewer (Not Windows) +Allows setting the program used to view images associated with Waypoints. +By default this is set to xdg-open which should open the system's default image viewer, however this can be overridden with this setting. +Note: for Windows systems, viewing images associated with Waypoints always uses the system's default image viewer. +
+
External GPX programs +Allows setting the programs invoked via the Layer menu Export LayerOpen With 'program' +Two options are given so that it can be configured for various uses such as: + +An OSM editor (default) +Some other user defined program + +
+
GPSBabel +This allows setting the specific location of GPSBabel. +&appname; will need to be restarted for this setting to take effect. +
+
Auto Read World Files +If this is on, when a new image is selected for the GeoRef layer then the associated world file will be read to find the scale and positional properties. +The associated file is based on filename patterns; e.g. if the image is filename.jpg - then the world file may be filename.jpgw or filename.jgw +
+
Auto Device GPX Simplify +If this is on, GPX files will be simplified (using GPSBabel) if they are saved into a special location (by default a Garmin device location in OS file system). +Extra parameters used in process such as the location and limits applied can be refined by export_device_* values in . +A warning message is displayed when this occurs so one can consider if manually managing the tracks is needed, e.g. see methods. +The main intention for this is to prevent writing GPX files that are only partially useful. +For instance on a GPS Etrex 20 device: if a track with 1000 points is saved to it, the device will only read in the first 500 points, +thus effectively making only 1/2 of the track available. +Hopefully a simplified track will be more useful to follow to your destination when one is out in the wilds, than only a section of it. + +You will need to set the appropriate limits for your device, as this is not currently auto detected. +
+
+ +
Advanced +
Save File Reference Mode + + Files referenced within project files can be saved with either absolute or relative paths. + Using relative paths can be useful when copying the project file and the associated files between different systems. + +
+
Ask for Name before Track Creation +A setting to control whether an automatic name is used when creating a new track or route, or whether you are asked to enter a name. +
+
Show Tooltip during Track Creation +A setting to control whether the tooltip with the cumulative track or route distance is shown when creating tracks and routes. +
+
The number of recent files + + The number of recent files shown in the FileOpen Recent File menu. + A value of -1 means all files. The new value applies to New Windows only (or on application restart). + +
Open files in selected layer +A setting to control whether non Viking format files (i.e. typically GPX or KML files) will open in the selected TrackWaypoint Layer. +When no TrackWaypoint Layer is selected (or the layer is invisibile) then the file will be open in the default manner: at the top level. + +
+
Show calendar day names +A setting to control whether the calendar displays day names (Mon, Tue, etc...) or not. + +
+
Ruler area label position +A setting to control the position of the label drawn on the viewport that shows the area value. Includes a setting to turn off the label. + +
+
Use Scroll to Zoom +A setting to control if scroll events cause the viewport to zoom (rather than moving). Useful with mouse scroll wheels, but less intuitive for touchpads. + +
+
Invert Scroll Direction +A setting to control the direction of scroll events. Especially useful with touchpads and can be used to override the desktop system's setting. + +
+
+
+ +
OpenStreetMap Traces +
OAuth Method + + Using the OAuth method means that your OSM account details are no longer needed to be known by &appname;. + Instead specific tokens are generated for use only by &appname; which are associated with your OSM account. + +Get New OSM Access Tokens + Use this button to generate a new OSM Access Token Key and Secret. + You will be redirected to the OSM website to confirm allowing &appname; to access the GPX Traces features. + The tokens returned by the OSM website will be stored in the Access Token Key + Access Token Secret preferences. + +Access Token Key + Access Token Secret: +These are the values used, however one typically does not need to manually change them. +
+
HTTP Basic Authentication (Discouraged) +OSM Username + Password +Store your OSM details here, so that you don't need to enter it in every time in the procedure. +This is not recommended and one should use the OAuth method using access tokens described above. + + +Your OSM password will be stored in plain text. + + + + +This password is transferred unencrypted in every request sent to the OpenStreetMap server. This is due to the use of OpenStreetMap's basic authentication method. + + + + +When OAuth capability is built into &appname; (the default), use of HTTP Basic Authentication can only be used if the osm_basic_auth is enabled. + + +
+
+ +
Mapnik + +If any changes to these settings are made, you will need to restart &appname; to make them be applied. + + +
Plugins Directory +The location of Mapnik plugins. An attempt is made to automatically determine the initial value, + however if this is wrong or Mapnik is upgraded then the directory can be set here. +
+
Fonts Directory + +The location of fonts for use with Mapnik. Normally it is best to simply use the System's font directory. + +
+
Recurse Fonts Directory +Load fonts in any sub-directories of the main font directory. +
+
Rerender Timeout +The time in hours before any tile is rerendered. +This is useful in case the underlying source data for the tiles changes (e.g. OSM data is continually evovling). + &appname; normally has no way of knowing when the data has changed, so this simple timeout method is provided to maintain consistency of the tile images. +
+
CartoCSS +This allows setting the specific location of the carto executable. +
+
Threads + + The number of threads to use for Mapnik rendering tasks. + By default the value is set to the 1 in case of any multi-threading rendering code chain crashes. + Otherwise trying setting the value to the number of the CPUs of the system minus one (so as not to overload the system), in order to minimise the overall rendering times. + +
+
+ +
Routing +
Routing engine +You can select the routing engine used by default, ie by features that do not propose a live selection, like . +
+
+ +
Startup +Naturally since these preferences effect the startup, the values will not be used until &appname; is restarted. +
Restore Window Setup +When this is enabled, the main window size and layout (such as whether the statusbar or layers panel are shown) is restored to the values from last use. +
+
Default Map Layer +When this is enabled, a map layer is automatically added whenever &appname; is opened and a &appname; file is not to be loaded. +The map layer used is defined by the map layer's default values. +
+
Startup Method +Enables selection of how the startup position should be determined. + + +Home Location (default) +Position as set by the Set the Default Location + + +Last Location +Uses the last position viewed on the viewport + + +Specified File +Load the file as specified below + + +Auto Location + + Uses the GeoClue service if available + or otherwise the web service hostip.info to attempt to determine your location via IP lookup + + + + +
+
Startup File +Loads this specified file when the Startup method is set to Specified File +
+
Check For New Version +Periodically (no more than once every 14 days), check to see if there is a new version of &appname; available. +
+
+ +
Toolbar +
Append to Menu +Allows setting the toolbar on the same vertical space as the menu, thus increasing vertical space for the map. +
+
Icon Size +Allows configuration of the icon size, including overiding the system's default preference to the setting desired just for &appname;. +
+
Icon Style +Allows configuration of the icon style, including overiding the system's default preference to the setting desired just for &appname;. +
+
Customize +Opens the Customize Toolbar dialog. +From this dialog the items in the toolbar can be added, removed and reordered. Reordering of items is performed by drag and drop. +
+Customize Toolbar dialog + + + +
+
+
+ +
+ + +
Howto's +
Getting Started + +&appname; from version 1.5 has several features to ease the start up process. +On the very first run, you will be asked if you want to enable these features which make use of an Internet connection. +If you select no or you have upgraded from an earlier version you can choose to enable any of the startup options via the . + + +Some other general use cases for using &appname;, are as follows: + +
Go to an area of interest + +&appname;'s default location is a Manhatten, New York, USA, so you may need to pick another place that interests you - such as where you live. + + +Method A + + + Use the online location address/place search. + + + Use the Go to Location toolbar button or from the menus + ViewGo to Location. + You can change the search location provider if desired. + Enter the name of place you wish to go to (you may need to specify the country to refine the search). + Also you can enter a post code or a ZIP code instead. + + + You will need an internet connection for this search to work + + + + +Method B + + + If you know the coordinates of where you want to view: + + +Use View and select from either Go to Lat/Lon or Go to UTM and then enter in the specific coordinates. + + + + +Method C + +Use the GPS Layer or FileAcquireFrom GPS +to load data directly from your GPS into &appname;. + +You can specify the types of data to acquire: Tracks, Routes and/or Waypoints. + + +You must have write permission to the port used. For Unix like OS: + + /dev/ttyS0 is the first serial port + /dev/ttyUSB0 is the first USB port + usb: is any USB port + +Depending on your distribution only one of the USB port types may work +For Windows: + + com1: is the first serial port + usb: is any USB port + + + + The GPS devices supported are those supported by GPSBabel. + Garmin and Magellan GPS devices supported by all versions, later versions of GPSBabel support more devices such as DeLorme and Navilink. + + + + +Method D + + +Get data from files in GPX or KML format, which can be opened directly. +Use FileOpen + + +Other formats can be imported that are supported by GPSBabel. +FileAcquireImport File With GPSBabel... + + + +The viewport will be automatically moved and resized to view the contents of the file. + + + + +
+
Add a Map Layer + +Use LayersNew Map Layer, and choose a suitable cache directory +where you would like to store your tracks and click OK. Zoom to a +comfortable level (I suggest 4 mpp) by clicking the left and right +mouse buttons on the gray area where your tracks are. Now from the menu +choose the Tool. Click where you would like to download a +map. Regardless of what tool you are using, the middle mouse button +always pans. + + +You need an open internet connection when you are downloading maps. + + + +If you can no longer see your tracks or waypoints and only the map, +it is because the layer named Map is ABOVE your TrackWaypoint layer that your GPS data is in. +This means that it will be drawn last and on top of the other . +Look at the to the left which shows this order. +Select the Map layer from the list and click the down arrow button beneath the list until the Map layer is below the TrackWaypoint layer. +Your tracks will now be drawn over the map. + +
+ +
Set Your Home Location + + You can save the current center position of the viewport as the default location AKA the Home Location by + EditSet the Default Location. + + + Then at any time you can return to this place by clicking on the Home icon on the toolbar. + + + You can also set the default location via specifing the exact latitude and longitude in the . + +
+ +
+
From 1st startup to GPS track (including offline maps) + +The first you'll see is an empty map, because &appname; in its default configuration will download maps only on demand. +Before fetching unneeded data, one can position to a location of interest, e.g. Stuttgart: ViewGo to Location, enter Stuttgart. + +
Fetching the maps + +Map + + +LayersNew Map Layer +in the layer properties dialogue choose e.g. OpenStreetMap (Mapnik). + +For the moment, we keep the default Maps Directory (the directory in +which the maps will be stored and can be used for offline usage). + + +Check Autodownload maps and keep the zoom level as Use Viking +Zoom Level. + + +however, that these settings will play an important +role in the pre-fetch for offline usage discussed later + + + + +You'll see a map of Stuttgart. Using the mouse wheel, you can +zoom in and out. The maps for the choosen resolution will be downloaded +automatically. + + +DEM Layer (Height Map) + + +Zoom out to 512. +LayersNew DEM Layer +Keep the download source as is (SRTM Global 90m), hit OK. + + +In the layer listing on the left, the layer should reside +above the map layer. If this is not the case, highlight the DEM layer +an shift it one up (using the arrow up button). + + +highlight the DEM layer in the layer listing on the left +in the toolbar, check DEM layer download/import (the last symbol) +a left-click in the map window should then fetch the DEM data + + +This might take some time. + + +Sometimes, a tile does not show up correctly (you might see only a +black frame in the map window) because it got corrupted during +transfer. In order to correct this, you can delete the corresponding +datafile in the cache. right-click the DEM layer properties + + +The DEM Files listing allows you to delete the specific tiles (alternatively do this from the command line). + + +You can also alter the Min. and Max. elevation in this dialogue. + + +
+
GPS Track with Height Profile + +Uncheck the layer (the map is shown again) + + LayersNew TrackWaypoint Layer + Ensure the new track layer is above the map layer. + +Expand the layer, select Tracks +In the tools menu choose Create Track + +Leftclick in the map window, enter a name + + Click several times to generate a track (a right-click removes the last point). + Height data is set automatically since DEM data is available + +Expand tracks in the layer menu, your track should show up, select it +Right click your track, select Properties +Click the tab Elevation-distance - enjoy the plot + + +In order to save this setting for later usage + + +click OK in the Track Properties dialog +FileSave As, choose a name (you can open this view later via fileOpen). + + +
+
Usecase: offline data for holiday + +Suppose you want to have the and data offline for your holiday in Italy near Bologna. + + +Start a new &appname; session. +ViewGo to Location, enter Bologna +LayersNew Map Layer +Choose e.g. OpenStreetMap (mapnik). +adapt the maps directory e.g. to /home/user/.viking-map-holiday/. +This allows you to delete the map stuff after holiday without purging the rest of your maps. + +check autodownload map +keep viking zoom level +zoom out to 1024 +add a layer (as discussed above) +download the DEM data + +In the &app; version discussed here, the DEM data automatically +are stored in /home/user/.viking-maps/. You can move the corresponding +tiles into .viking-map-holiday/ if you like. + + +Download map data for all zoom levels + + +uncheck the DEM layer for the map to show up +navigate the map to be centered at Bologna +choose the zoom such, that all regions of interest are displayed in the map window (e.g. 1024) + +follow this sequence until you have all tiles for all zoom levels you need + +right-click the map layer properties +set the zoomlevel explicitely one below the last (in the first cycle 512), hit OK +right click the map layer Download Missing Onscreen Maps +wait until all tiles for that resolution have been downloaded + + + +This may take some time and some hard disk capacity. + +Do not forget to save your configuration (as discussed above). + + +
+ +
+
OpenStreetMap project + +OpenStreetMap (OSM) is a collaborative project to create a free editable map of the world. +One of the sources of data for this project is GPS tracks. +&appname; supports this project via the GPS Traces methods, both uploading and downloading such data. + + + Authentication/authorization is required to use these services. See . + + +Also see for further detail. + +
Uploading data to OpenStreetMap + +It is possible to upload data directly from &appname; to OpenStreetMap. + + +Upload a layer + +One solution is to upload whole a layer. To do this, +simply select the layer and right click on it. Then, select Upload to +OSM. + + + +Upload a single track +Another solution is to upload an individual track. Simply select the track and right click on it. +Then select Upload to OSM. + + + +Fill in the form + +The filename is the name you want your upload has on the server. This information is displayed by the osm server. +The description is some descriptive information. +The tags field is a white space separated list of tags. + + +
+ +
Downloading Traces from OpenStreetMap + +It is possible to download GPS traces directly from OpenStreetMap into &appname;. +This feature can be really useful for checking existing data before uploading new ones. + + +Download all visible tracks +One solution is to select + +File +Acquire +OSM traces... +. +Each request can get up to 5,000 points. +The dialog box allows setting which group of 5,000 points to get. These groups are known as Page Numbers which start at 0. +Increasing the page number parameter allows one to request the subsequent sets of point groups. + + +
+
Downloading Your Own Traces from OpenStreetMap + +It is possible to download any of your personal GPS traces previously uploaded to OpenStreetMap into &appname;. + + +Initially this will return the list of your OSM Traces, from which you can select which specific traces to retrieve. +This list can be sorted on each column so that it easier to find an individual trace or select a group of traces by similar properties. + +
+ +
+ +
Geotagging + + This assumes you already have a layer enabled for ease of use (if not see above to get one). + +
Manual Positioning + + This is useful for instances when you already know exactly where the image was taken (no need for tracklog). + Or maybe you want to adjust an automatically generated waypoint for the position of the subject of the image rather than the location that the photograph is taken from. + ATM this process only works on an individual image, so it will be tedious for handling lots of images. + + + First create a layer or use an existing one; and select it in the . + NB Make sure this layer is above the map layer in the Layers Panel list. + Create a new waypoint (or move an existing one) to exact location desired: + + Select the tool, then left click on the map at the location desired, choosing an image to associate with it in the new waypoint dialog + Select the tool, then left click on waypoint to be moved. Left click again and drag the waypoint to the location desired + + Then using the Select tool left click on waypoint to select it, then right click to access the Waypoint properties menu, then choose + Update Geotag on ImageUpdate + + + The Update Geotag on Image options are only available when a waypoint has an image associated with it. + +
+ +
Automatic Positioning Against a Tracklog + + First you will need a tracklog with timestamps in it. Either load one from a previously saved file or freshly acquired from a GPS device - + see Getting Started. + It helps if this is the track that was recorded at the time you took some photographs! + + + Select the track either from the layers panel on the left or via the viewport using the tool. + Then right click on it and chose the Geotag Images... leading you to the Dialog. + + + Load some images that where taken around the time the track log was recorded. Confirm the other options in the dialog - normally the defaults should be alright and select OK. + If things are succesful, new waypoints with thumbnail images of the photographs will appear. + You should probably check they are really in the right place as often the timestamp of the camera may not be aligned to the GPS correctly leading to inferring incorrect locations. + +Option: Overwrite Waypoints + + This is particularly useful when one finds an attempt at geotagging gives wrong locations, often due to time offset issues. + Simply try again with a new time offset (often 1 hour adjustments due to Daylight Savings or Summer Time times) and the old waypoints will be updated (instead of creating new ones). + + + + If you have multiple tracks in a TrackWaypoint layer, then invoking the Geotag Images... action on the layer + will search all the tracks to find location matches. + +
+
+ +
GPS Real Time Location + + &appname; relies on gpsd to provide the current location from a real time feed from a GPS device. + + + This assumes you already have a layer enabled for ease of use (if not see above to get one). + + + Turn on the GPS Device, ensure it has figured out it's location and plug it in to your computer. + +
Set Up GPS Layer + + You will need a layer. One can be added via LayersAdd GPS Layer. + + + Adjust the Realtime Tracking Mode settings to interface with gpsd as necessary. Normally the defaults should suffice. + + + Current Linux distributions should run gpsd automatically when a GPS Device is plugged in. Otherwise you may have to run gpsd manually. + + + Then right-click the layer and select Start Realtime Tracking. + Hopefully the viewport should jump to the GPS location. + + + Troubleshooting checklist: + +Confirm gpsd is running. +Confirm on the GPS device it has a location. +Confirm the Realtime Tracking Mode settings. +
+
+ +
What to Do if &appname; Does Not Seem to Work + +In order to get some information about what &appname; is doing, start it in verbose debug mode via the command line: +viking -dV + + +NB For Windows the process is slightly more involved as the output is typically not shown in the command prompt, +so you have to redirect the output to a file, e.g. open the command prompt and then: + +cd "C:\Program Files\Viking" +viking -dV 2>1 > %TMP/viking.log + +Then close &appname; before viewing the output file, such as: +notepad %TMP/viking.log + + +For instance you can check the correct URLs &appname; is using in requesting remote data for DEMs or map tiles in the verbose debug output. +E.g. Something like this for DEMs: + +** (viking:28778): DEBUG: curl_download_uri: uri=http://dds.cr.usgs.gov/srtm/version2_1/SRTM3/Eurasia/N48E008.hgt.zip +* About to connect() to dds.cr.usgs.gov port 80 (#0) +* Trying 152.61.128.95... * connected +* Connected to dds.cr.usgs.gov (152.61.128.95) port 80 (#0) + GET /srtm/version2_1/SRTM3/Eurasia/N48E008.hgt.zip HTTP/1.1 +User-Agent: viking/0.9.8 libcurl/7.18.2 GnuTLS/2.4.2 zlib/1.2.3.3 libidn/1.8 +Host: dds.cr.usgs.gov +Accept: */* + HTTP/1.1 200 OK + Date: Sun, 26 Jul 2009 18:13:38 GMT + Server: Apache + Last-Modified: Tue, 21 Jul 2009 19:57:35 GMT + ETag: eac3f8-1828f5-46f3caa76070a + Accept-Ranges: bytes + Content-Length: 1583349 + Content-Type: application/zip + +* Connection #0 to host dds.cr.usgs.gov left intact +* Closing connection #0 +** (viking:28778): DEBUG: dem_layer_add_file: /home/username/.viking-maps/srtm3-Eurasia/N48E008.hgt.zip + +Or for OSM Mapnik tile server: + +* About to connect() to tile.openstreetmap.org port 80 (#0) +* Trying 193.63.75.28... * connected +* Connected to tile.openstreetmap.org (193.63.75.28) port 80 (#0) + GET /13/4065/2748.png HTTP/1.1 +User-Agent: viking/0.9.96 libcurl/7.20.1 GnuTLS/2.8.6 zlib/1.2.3.4 libidn/1.18 +Host: tile.openstreetmap.org +Accept: */* + +* HTTP 1.0, assume close after body + HTTP/1.0 200 OK + Date: Thu, 14 Oct 2010 22:18:42 GMT + Server: Apache/2.2.8 (Ubuntu) + ETag: "b66ff9d46474bab68262a3483428a232" +** (viking:16704): DEBUG: curl_get_etag_func: ETAG found: "b66ff9d46474bab68262a3483428a232" + Content-Length: 17194 + Cache-Control: max-age=94805 + Expires: Sat, 16 Oct 2010 00:38:47 GMT + Content-Type: image/png + Age: 5153 + X-Cache: HIT from konqi.openstreetmap.org + X-Cache-Lookup: HIT from konqi.openstreetmap.org:3128 + Via: 1.1 konqi.openstreetmap.org:3128 (squid/2.7.STABLE7) + Connection: close + +* Closing connection #0 +* About to connect() to a.andy.sandbox.cloudmade.com port 80 (#0) +* Trying 178.63.75.195... ** (viking:16704): DEBUG: curl_download_uri: uri=http://tile.openstreetmap.org/13/4065/2749.png +* About to connect() to tile.openstreetmap.org port 80 (#0) +* Trying 193.63.75.28... * connected +* Connected to a.andy.sandbox.cloudmade.com (178.63.75.195) port 80 (#0) + GET /tiles/cycle/13/4065/2747.png HTTP/1.1 +User-Agent: viking/0.9.96 libcurl/7.20.1 GnuTLS/2.8.6 zlib/1.2.3.4 libidn/1.18 +Host: a.andy.sandbox.cloudmade.com +Accept: */* + +* connected +* Connected to tile.openstreetmap.org (193.63.75.28) port 80 (#0) + GET /13/4065/2749.png HTTP/1.1 +User-Agent: viking/0.9.96 libcurl/7.20.1 GnuTLS/2.8.6 zlib/1.2.3.4 libidn/1.18 +Host: tile.openstreetmap.org +Accept: */* + +* HTTP 1.0, assume close after body + HTTP/1.0 200 OK + Date: Thu, 14 Oct 2010 23:44:35 GMT + Server: Apache/2.2.8 (Ubuntu) + ETag: "8e520ad47ce9c1b63430554886eb5fab" +** (viking:16704): DEBUG: curl_get_etag_func: ETAG found: "8e520ad47ce9c1b63430554886eb5fab" + Content-Length: 18094 + Cache-Control: max-age=87742 + Expires: Sat, 16 Oct 2010 00:06:57 GMT + Content-Type: image/png + X-Cache: MISS from konqi.openstreetmap.org + X-Cache-Lookup: MISS from konqi.openstreetmap.org:3128 + Via: 1.1 konqi.openstreetmap.org:3128 (squid/2.7.STABLE7) + Connection: close + + +
+ +
+ + +
+ Extending Viking + + Currently, &app; has some extention points based on configuration files. The file format is heavily inspired by the GtkBuilder file format: you specify the class of the GObject to build and set its properties. Technically, it is a XML file containing a "objects" root element. Inside this element, you set a collection of "object". + Here is an example: + + + Property value + Property value + + ... + +]]> + + + You can find more examples in the documentation part of the distribution. + + It is also possible to override the internal defaults e.g. to update any parameters should they change over time, + by adding the values into your configuration file. + When you define object group that already exists (and for Maps this means by a repeated Id key, but you may have to examine the source code to work out what the relevant Id values are) then you need to define all the other keys as well, otherwise they will be reset to the defaults. + +
+ Map Source + It is possible to add new map's sources. The file is ~/.viking/maps.xml for UNIX like systems, C:\Documents and Settings\username\.viking\maps.xml on Windows XP or C:\Users\username\.viking\maps.xml on Windows 7 onwards. + An example of the file is in the distribution doc/examples/maps.xml. Further examples and values are online in the Maps Wiki + + The VikSlippyMapSource allows to declare any map's source working like OpenStreetMap. It supports the following properties: + + + id + this is an integer and should be unique as it used to identify the map source + + + name + a string (should be unique) that is used for the OSM style cache directory name when the Map Cache directory is the default (~/.viking-maps) + + + label + the text displayed in the map's source selection dialog + + + hostname + the server's hostname (eg. "tile.openstreetmap.org") + + + url + + the parametrized address of the tile, in the spirit of C printf format, with 3 "%d" fields for Z, X and Y (in that order) (eg. "/%d/%d/%d.png") + + The full parametrized address can just be put in the URL field and the hostname field doesn't need specifying. + e.g. "https://tile.openstreetmap.org/%d/%d/%d.png" + + + + + zoom-min (optional) + The minimum zoom value supported by the tile server. The Default is 0 if not specified. + + + zoom-max (optional) + + The maximum zoom value supported by the tile server. The Default is 18 if not specified. + See Zoom Levels + + + + lat-min (optional) + The minimum latitude value in degrees supported by the tile server. The Default is -90 degrees if not specified. + + + lat-max (optional) + The maximum latitude value in degrees supported by the tile server. The Default is 90 degrees if not specified. + + + lon-min (optional) + The minimum longitude value in degrees supported by the tile server. The Default is -180 degrees if not specified. + + + lon-max (optional) + The maximum longitude value in degrees supported by the tile server. The Default is 180 degrees if not specified. + + + file-extension (optional) + + The file extension of the files on disk. The default is .png + If the tile source URL ends in something other than .png, then this parameter will need to match it. + This can also be useful in reading a tileset from other software which may name tiles in an alternative form, + e.g. for Mobile Atlas creator it names them .png.tile + The file types actually usable are those supported by GDK Pixbuf Library, which includes at least PNG and JPEG. + Remember to include the beginning '.' when specifying this parameter. + + + + use-direct-file-access (optional) + + Only use files on disk. The default is FALSE + This can also be useful for tilesets already on disk as it will avoid attempting to download any tiles. + Thus with this type the hostname and url parameters are not necessary and are ignored. + + + + switch-xy (optional) + + Swap the X,Y values around in the URL parametrized ordering. + The default is false. + + + + check-file-server-time (optional) + + Sends the timestamp of the tile to the server, so the server can decide whether it should send a new tile or not. + The default is false. + + + + use-etag (optional) + + Use and compare the ETag value in determining whether to download a newer tile. The default is false. + The ETag value is stored in a separate file in the same directory as the tile to enable checking the value across multiple runs of the program. + + + + tilesize-x (optional) + The tile x size. The default is 256 pixels if not specified. + + + tilesize-y (optional) + The tile y size. The default is 256 pixels if not specified. + + + scale (optional) + + The tile scale. The scale is 1 if not specified. + Use a value of 2 to represent high res tiles. + Don't change the tilesize as the internal display size is still based on 256 pixels. + + + + + + The VikTmsMapSource allows to declare any TMS service. It supports the following properties (as per VikSlippyMapSource above): + + + id + + + label + + + hostname + + + url + + + check-file-server-time (optional) + + + zoom-min (optional) + + + zoom-max (optional) + + + lat-min (optional) + + + lat-max (optional) + + + lon-min (optional) + + + lon-max (optional) + + + + The VikWmscMapSource allows to declare any WMS or WMS-C service. It supports the following properties (as per VikSlippyMapSource above): + + + id + + + label + + + hostname + + + url + + + check-file-server-time (optional) + + + zoom-min (optional) + + + zoom-max (optional) + + + lat-min (optional) + + + lat-max (optional) + + + lon-min (optional) + + + lon-max (optional) + + + +
+ +
+ Go-to search engines + It is possible to add new new search engines for the "Go-To" feature. The file is ~/.viking/goto_tools.xml. + An example of the file in the distribution doc/examples/goto_tools.xml. + Currently, there is a single object class available: VikGotoXmlTool. Such feature allows to declare any search engine using a XML format as result. + The related properties are: + + + label + the text displayed in the Go-To dialog + + + url-format + the parametrized address of the query, in the spirit of C printf format, with a single "%s" field (replaced by the query string) + + + lat-path + XML path of the latitude (eg. /root/parent/elem) + + + lat-attr (optional) + name of the attribute (of previous element) containing the latitude + + + lon-path + XML path of the longitude (eg. /root/parent/elem) + + + lon-attr (optional) + name of the attribute (of previous element) containing the longiude + + + + As a facility (or readability) it is possible to set both path and attribute name in a single property, like an XPath expression. To do so, simply set both info in lat-path (or lon-path) in the following format: /root/parent/elem@attribute. +
+ +
+ External tools + It is possible to add new external tools. The file is ~/.viking/external_tools.xml. + An example of the file in the distribution doc/examples/external_tools.xml. + The VikWebtoolCenter allows to declare any Webtool using a logic based on center coordinates and zoom level value. + The related properties are: + + + label + the text displayed in the menu entry + + + url + the parametrized URL to open, in the spirit of C printf format, with 2 "%s" and a "%d" fields for X, Y and Z (zoom level) (eg. "http://hostname/?lat=%s&lon=%s&zoom=%d") + + + + The VikWebtoolBounds allows to declare any Webtool using a logic based on bounds coordinates. + The related properties are: + + + label + the text displayed in the menu entry + + + url + the parametrized address of the tile, in the spirit of C printf format, with 4 "%s" fields for left, right, bottom and top (eg. "http://hostname:8111/load_and_zoom?left=%s&right=%s&bottom=%s&top=%s") + + + +
+ +
+ Routing engine + It is possible to declare new routing engines. The file is ~/.viking/routing.xml. + An example of the file in the distribution doc/examples/routing.xml. + The VikRoutingWebEngine allows to declare a routing engine available via HTTP. + The related properties are: + + + id + a string, should be unique as it used to identify the routing engine + + + label + the text displayed in the menu entry + + + format + + The GPSBabel format code to interpret the service response. By default a GPX response is expected and processed internally. However if the service returns different format then GPSBabel is used to transform the text into something that &appname; can understand. Only formats that GPSBabel supports can be used: e.g. 'gpx', 'kml', 'gtrnctr' (for Garmin Training Center .tcx files), etc... + Use gpsbabel --help on the command line to find out the supported file types and their codes to process them. + + + + url-base + the base URL of the web service (eg. "http://hostname/service?") + + + url-start-ll + the part of the URL setting the starting point location, parametrized in the spirit of C printf format, with 2 "%s" for coordinates (eg. "&start=%s,%s") + + + url-stop-ll + the part of the URL setting the end point location, parametrized in the spirit of C printf format, with 2 "%s" for coordinates (eg. "&stop=%s,%s") + + + url-via-ll (optional) + the part of the URL setting via point location, parametrized in the spirit of C printf format, with 2 "%s" for coordinates (eg. "&via=%s,%s") + + + url-start-dir (optional) + the part of the URL setting the starting point location for direction based routing, parametrized in the spirit of C printf format, with one "%s" for direction (eg. "&start=%s") + + + url-stop-dir (optional) + the part of the URL setting the end point location for direction based routing, parametrized in the spirit of C printf format, with one "%s" for direction (eg. "&start=%s") + + + url-ll-lat-first (optional) + The ordering of the lat/long terms in the Start, Stop and Via URL settings. By default this is TRUE. + For instance using Brouter services, the URL uses a pair of values which is longitude and then latitude. Thus setting this value to FALSE ensures the value substitution is performed in the necessary order. + + + referer (optional) + A URL to serve as referer for the HTTP request (eg. "http://hostname/") + + + follow-location (optional) + the max depth of recursive redirections + + + +
+ +
+ Remote File Datasources + It is possible to add web references expected to return a file which can then be opened directly or converted via GPSBabel. + The file is ~/.viking/datasources.xml. + An example of the file is in the source distribution doc/examples/datasources.xml. + The VikWebtoolDatasource allows to declare any URL using logic based on coordinates. + The related properties are: + + + label + the text displayed in the menu entry + + + url + + the parametrized URL to open in the spirit of C printf format, with up to 9 "%s" values. e.g. http://hostname/getfile?lat=%s&lon=%s + The order and meaning of these parameters is given by the url_format_code below + + + + url_format_code + + A string describing the parametrized URL substitution parameters, each character represents how to translate each term. + B = Bottom of the current view i.e. minimum latitude + L = Left of the current view i.e. minimum longitude + T = Top of the current view i.e. maximum latitude + R = Right of the current view i.e. maximum longitude + A = center lAtitude of the current view + O = center lOngitude of the current view + Z = OSM Zoom value of the current view. See Zoom Levels + P = selected Point's latitude + N = selected poiNt's longitude + S = A user specified input string requested from the user via a dialog box + Thus for the url example above then the format code should be AO + + + + file_type + + This value is passed on for the -i parameter in interfacing with GPSBabel. + If it is not defined then the returned file is interpreted internally as a GPX file. + Possible values such as 'kml', 'mapsource' etc.. can be used. See GPSBabel File Formats for the full list. + + + + babel_filter_args + + This value is passed on for the filter arguments interfacing with GPSBabel. + E.g. "-x nuketypes,routes" can be used to filter all routes from the results. + + + + input_label + + This value is used when requesting input from the user. + It is the label of the text input box. + + + + +
+ +
+ System Extension File Locations + Note that, on UNIX like systems, the extension files (&extfiles;) are also searched in /etc/viking and /usr/share/viking directories (or related in your system). + The XDG_DATA_DIRS environment variable can be used to change these directories. + The XDG_DATA_HOME environment variable is also used (if set) to look for these extension files. +
+ + +
+ Miscellaneous Settings + Various individual values are automatically saved between &app; sessions in the ~/.viking/viking.ini file. + This file is not intended to be manually edited, but since it is a plain text file it can be changed if desired. + Some values in this file are read only, in the sense that there is no way to set it other than by manually entering in the keys and values (the key will not exist in the file otherwise). This allows some fine tuning of &app; behaviours, without resorting to recompiling the code. However is it not expected that these values should need to be changed for a normal user, hence no GUI options for these have been provided. + Here is the list of the read only keys and their default values. + + + curl_cainfo=NULL + See CURLOPT_CAINFO + + + curl_ssl_verifypeer=1 + See CURLOPT_SSL_VERIFYPEER + On Windows this is defaulted to 0 to get HTTPS connections to at least work, + otherwise any attempts at verifying always fail. + [Some incompatibily is suspected in the reliant binary DLLs] + + + geoclue_accuracy_level=4 + Set the integer value for the accuracy level request to the GeoClue service. Values to match the GClueAccuracyLevel: + + 0 = GCLUE_ACCURACY_LEVEL_NONE + 1 = GCLUE_ACCURACY_LEVEL_COUNTRY + 4 = GCLUE_ACCURACY_LEVEL_CITY + 5 = GCLUE_ACCURACY_LEVEL_NEIGHBORHOOD + 6 = GCLUE_ACCURACY_LEVEL_STREET + 8 = GCLUE_ACCURACY_LEVEL_EXACT + + + + gpx_tidy_points=true + ATM Only attempts to remove a suspicious first point of a GPX track + (as opposed to any points within a track). + + + gpx_tidy_points_max_speed=340 + Over this speed (in metres per second) for the first pair of points - the first point is removed. + + + layers_create_trw_auto_default=false + Create new TrackWaypoint layers without showing the layer properties dialog first. + + + layers_panel_calendar_markup_mode=3 + 0=No markups. 1=Day marked. 2=Day marked and tooltips created. 3=Auto (timed tooltip creation, so if too slow it reverts to 1) + + + maps_max_tiles=1000 + + + maps_min_shrinkfactor=0.0312499 + + + maps_max_shrinkfactor=8.0000001 + + + maps_real_min_shrinkfactor=0.0039062499 + + + maps_scale_inc_down=4 + + + maps_scale_inc_up=2 + + + maps_scale_smaller_zoom_first=true + + + srtm_http_base_url=https://dds.cr.usgs.gov/srtm/version2_1/SRTM3 + Allows using an alternative service for acquiring DEM SRTM files. + Note that the layout on the server needs to be split into Continent directories. + + + mapnik_buffer_size=128 (in pixels) + + + osm_basic_auth=false + Set to true to force the use of HTTP Basic Authenication even when OAuth is available + + + background_max_threads=10 + + + background_max_threads_local=Number of CPUs + + + window_default_tool=Pan + Options are: Pan, Zoom, Ruler or Select + + + window_menubar=true + + + window_copy_centre_full_format=false + + + version_check_period_days=14 + + + trackwaypoint_start_end_distance_diff=100.0 + + + gps_statusbar_format=GSA + This string is in the Message Format Code + + + geoclue_statusbar_format=SA + This string is in the Message Format Code + + + trkpt_selected_statusbar_format=KEATDN + This string is in the Message Format Code + + + utils_nearest_tz_factor=1.0 + + + viewport_history_size=20 + + + viewport_history_diff_dist=500 + In metres. + + Go Back or Go Forward requests over this range from the last history location will move back to that position. + If within this range it will skip over this location and move on to the next saved history location. + + + + viewport_scale=1 + + If Viking doesn't automatically detect a high resolution display, you can force the setting here - typically by setting this to 2. + + + + external_diary_program=rednotebook + Or in Windows it uses C:/Progra~1/Rednotebook/rednotebook.exe - This string value must use Unix separators and not have spaces. + + + external_astro_program=stellarium + Or in Windows use C:/Progra~1/Stellarium/stellarium.exe - This string value must use Unix separators and not have spaces. + Needs to be version 0.15.0 or greater (otherwise due to this Bug means this does not actually work). + + + external_text_program=gedit + Or in Windows it uses notepad - This string value must use Unix separators and not have spaces. + + + bfilter_simplify=100 + + + bfilter_compress=0.001 + + + list_date_format=%Y-%m-%d %H:%M + A date format description as passed on to strftime(). + Note that when displayed in tables sorting by this column simply uses the text value, rather than the underlying date/time value. + + + + export_device_path=OS Specific + UNIX = "/media/user/GARMIN/Garmin/GPX" + WINDOWS = ":/Garmin/GPX" + + + export_device_trackpoint_limit=10000 (Typical Garmin Edge limit) + Older Garmins limits are typically much lower - Etrex 20/30 is 500 + + + export_device_routepoint_limit=250 + + + kmz_default_maps_dir=Empty + You may want to use something like: "/media/user/GARMIN/Garmin/CustomMaps" + + + +
+ Message Format Code + Currently for ease of implementation the message format code is a string of characters. + Each character represents what should be inserted in relation to a Trackpoint. + One day it might evolve into something more user friendly with a frontend to control it, perhaps allowing arbitary text too. However for now at least some control is offered :) + + + + Character Code + + G = Some text to display at the start of the message - GPSD + K = Some text to display at the start of the message - Trkpt + A = Altitude of a Trackpoint + S = Speed of a Trackpoint + B = Vertical Speed (Climb) + C = Course of a Trackpoint + L = Location of a Trackpoint + T = Time of a Trackpoint + M = Time diff of a Trackpoint from the previous trackpoint + X = Number of satellites used in the trackpoint fix + D = Distance of the trackpoint from the start of a track (following along the track) + F = Distance of the trackpoint from the finish (end) of a track (following along the track) + P = Distance difference of the trackpoint from the previous trackpoint + N = Name of track to which the trackpoint belongs + E = Name of the trackpoint + + + + Output Notes + + If the output has * after it, then the value has been calculated via interpolation (such as speed when the Trackpoint does not contain a speed value). + If the output has ** after it, then difficulties were encountered in trying to work out the value so probably a default of 0 will be shown. + + + + +
+ +
+ +
+ Keyboard Shortcuts (Accelerator) Settings + This is held in the file ~/.viking/keys.rc + It is in the standard GTK Accelerator map format. Values are automatically read in and saved between &app; sessions. + This file is not intended to be manually edited, but since it is a plain text file it can be changed if desired. +
+ +
+ + + + + + + + + diff --git a/help/C/legal.xml b/help/C/legal.xml index 312c12e..5d73dc0 100644 --- a/help/C/legal.xml +++ b/help/C/legal.xml @@ -6,7 +6,7 @@ by the Free Software Foundation with no Invariant Sections, no Front-Cover Texts, and no Back-Cover Texts. You can find a copy of the GFDL at this link or in the file COPYING-DOCS + url="help:fdl">link or in the file COPYING-DOCS distributed with this manual. This manual is part of a collection of GNOME manuals diff --git a/help/C/viking.xml b/help/C/viking.xml deleted file mode 100644 index 3acc3af..0000000 --- a/help/C/viking.xml +++ /dev/null @@ -1,4151 +0,0 @@ - - - Viking"> - - - - maps.xml, goto_tools.xml, datasources.xml, external_tools.xml, routing.xml"> -]> - - -
- - &app; Manual - - &app; is a free/open source program to manage GPS data. - - - - 2013 - Guilhem Bonnefille - Rob Norris - - - - - GNOME Documentation Project - - - - - - - - Guilhem - Bonnefille - - - Rob - Norris - - - - username: - Alexxy - - - username: - Vikingis - - - username: - Tallguy - - - username: - EliotB - - - Alex - Foobarian - - - - - - - &appname; Manual V&manrevision; - &date; - - Guilhem Bonnefille guilhem.bonnefille@gmail.com - Rob Norris rw_norris@hotmail.com - GNOME Documentation Project - This document was generated on . - - - - - This manual describes version &appversion; of &appname;. - - - Feedback - To report a bug or make a suggestion regarding the &app; application or - this manual, follow the directions in the - Feedback section of the GNOME User Guide. - - - - - - &app; - - -
- Introduction - -&appname; aims to be easy to use, yet powerful in accomplishing a wide -variety of tasks. Some of the things you can use &appname; for are: - - - -Uploading and downloading waypoints, tracks and routes to/from GPS. - - - -Preparing tracks, routes and waypoints for trips using maps from services such as OpenStreetMap (OSM). -The data is only needed to be uploaded to your GPS before you leave. -The maps together with your tracks, routes and waypoints can also be printed and used during the trip. - - - - -After trips, tracks and waypoints from GPS can be downloaded, stored, managed and reused in your (or your friends') later trips. - - - - -Analyzing Off Highway Vehicle (OHV) and hiking trips, understanding where you went and how far you were from something. - - - -Making waypoints, tracks and routes to follow to easily get someplace -you've never been before or don't have GPS data for but online -maps exist for it. - - - - -Making maps with using Mapnik. -Not on Windows at the moment. - - - - -Grouping data from multiple trips using a hierarchical data manager. - - - - -Analyzing speed at different places (to some degree), adding waypoints where you forgot to mark one but did slow down or stop. - - - - -Downloading and storing OpenStreetMap and/or other map types on your hard drive and looking at them later. - - - - -Editing routes or tracks and their trackpoints, joining and splitting up tracks and routes. - - - - -Show the live GPS position on the map (for use on a mobile device - e.g. a laptop). Not Windows at the moment. - - - - -Import and export track, route and waypoint files of various types via GPSBabel - - - -Previously on Windows, GPSBabel was distributed with &appname;, but this no longer the case. - - -It can be downloaded from its website . - - - - - -View, create and update Geotagged Images (using EXIF data). - - - - - -&appname; is under continual improvement: see the the Roadmap / Wishlist: - - -
-Screenshot: OSM Cycle Map and Many Tracks - - - -
- - - The Windows build of Viking does not currently support verification of https connections. - - -
- -
General Concepts -
Layers - -Layers is concept one may know from powerful graphics editors such as Photoshop or GIMP. -Instead of putting all the data on the same level, it is stacked (i.e. layered) with different data over one another. -This can be useful for analysis and general handling of various sets of data. - - -Unfortunately the downside of this complexity is remembering how differing layers of data can obscure other data. - - -The Map layers have Alpha Compositing, -to create the appearance of partial transparency. -By controlling this value one can see data below it in the layer heirarchy for interesting effects. - -
-
Layers Panel - -The panel on the left is called the layers panel. -It determines which layers and sublayers (such as tracks and waypoints) -are shown, and the order in which they are drawn. Layers on the -top of the layers panel list are drawn last. You can change the order by -drag and drop, or by selecting a layer and using the up and down -buttons at the bottom of the layers panel. - - - The panel also contains a calendar to show when Layers occurred. - Double clicking on the day will select and move the viewport display to that layer. - Right clicking brings up a menu from which you can select to go to the previous or next layer in time. - -
-
Viewport - -The main &appname; area where the layer data is drawn, is called the viewport. - -
-
Track Graphs - -Below the viewport can be shown track (and route) elevation/distance and time/speed (tracks only) graphs of the selected item. -These are the same graphs as shown in . -The graphs will automatically hide itself when nothing or no suitable item is selected. - - -Moving the mouse pointer over the graphs will show a tooltip readout of the nearest trackpoint. -Similarily to the track properties graphs, left clicking will center the viewport on the trackpoint. -A right click menu offers controls of the drawing options, a subset of track operations and access to further information dialogs. - -
-
Statusbar -This provides a readout of various information: - -The currently selected (mouse pointer) tool -The number of items to process in the background - normally this the number in the map tile download queue -The zoom factor -The location of the mouse pointer (and potentially height information if DEM data is available) - -When creating a track/route, the statusbar also displays some information about the track/route. -
-Statusbar - - - -
-This part of the statusbar displays: - -The total distance of the track/route (including currently edited segment). -The bearing of the currently edited segment. -The distance of the currently edited segment. - - -For convenience, a zoom selector can be opened from the status bar. Simply left-click on the zoom factor. -
- The zoom selector available from status bar - - - -
-
- -
Toolbar -The toolbar is an area for buttons that perform common actions. -Some actions are modal, so the appropriate layer needs selected before these toolbar buttons are enabled. See more detail. -The display of the toolbar is influenced by the -Right clicking on the toolbar and selecting Customize allows jumping to the directly. -
- -
Projections - -&appname; supports differents projections: - - -UTM - - -LatLon (also called EPSG:4326) - - -Mercator (also called Spherical Mercator) - - - -
- -
Map Cache - -&appname; stores downloaded map tiles to disk for a couple of reasons: - - -Enables off line usage -Reduces loading on the map tile provider - - -The &appname; automatic caching strategy is two fold: - - - - - If the age of the tile on disk is less than the specified tile age (see ), - it will not attempt to contact the server to get a new version of the tile. - - - - - When the tile age has expired &appname; will attempt a refresh update, so that it provides the cached tile generation timestamp so the server can determine if a new tile image needs to be returned. Not all map types support this refresh method. - - - - - You can override the caching scheme by using right-click on the Map on the layers panel and selecting Redownload All Onscreen Maps, or Ctrl+F5 for the top most map displayed. This will get the latest version held by the server. - - - - This can be useful if you contribute to OpenStreetMap and wish to see your modifications (of course give time for the server to have processed your changes - see I have made edits but they don't show up on the map) - - - - -The layout of the cache on disk itself can be controlled via a per Map Layer property. - -Viking - Legacy default in a private cache layout scheme -OSM - Newer available default (1.6+) - -This is to increase the compatibility between &appname; and similar applications that cache tiles on disk so that the tiles can be shared. - - - - - -
- -
Shortcut Keys - -&appname; has several shortcut keys or key combinations for commands as listed in the main window along side the command. - - -By default some function keys follow standard GUI behaviour: - - -F1 Help (view this manual) -F5 or Ctrl+R Refresh the maps on screen -F10 Select the Menubar (in built behaviour) -F11 Full Screen -Ctrl+F5 or Ctrl+Shift+R Redownload the maps on screen - - - -Refresh attempts to get new maps only if the local tile cache time period has expired for any particular map tile. -Redownload gets all on screen maps from the server, ignoring the local tile cache. - - - -Other function keys control turn on/off visibility of various elements: - - -F3 Toggle visibility of the Toolbar -F4 Toggle visibility of the Menubar -Shift+F5 Toggle visibility of the Scale indicator on the viewport -F6 Toggle visibility of the Center Crosshairs on the viewport -F7 Toggle showing selected items (e.g. tracks or waypoints) in the highlight colour in the viewport -Shift+F8 Toggle visibility of the calendar -Shift+F9 Toggle visibility of the Layers Panel buttons -F9 Toggle visibility of the Layers Panel -F12 Toggle visibility of the Statusbar -Shift+F12 Toggle visibility of the Track Graphs - - -Standard shortcuts are provided for normal GUI operations: such as creating new files, opening, saving and exitting. -Then there are shortcuts specific to &appname; to switch projection modes, zoom in/out, create layers,switch the active tool mode and move the map: - -Ctrl+Up Pan the viewport North -Ctrl+Right Pan the viewport East -Ctrl+Down Pan the viewport South -Ctrl+Left Pan the viewport West -Ctrl+Keypad+ Zoom In -Ctrl+Keypad- Zoom Out - -These work irrespective of the mode selected -For other combinations see the menu entry themselves. - -
- -
-Keyboard Configuration -Keyboard configuration is supported by the standard GTK+ way of changing shortcuts for menu entries. -Hover over the menu option with the mouse pointer and press the keyboard shortcut you want to bind it to. -To delete a keyboard assignment, press Backspace whilst over the menu entry. - - - If the keyboard shortcut is already in use you will not receive any notification that new action replaces the old action. - This is probably why most distributions have this facility disabled by default. - Thus you will need to enable Editable menu accelerators for your system. - Check the Desktop Menu and Toolbar Control or other User Interface preferences for this setting. - - - - - For Windows systems this can be done by adding the line gtk-can-change-accels=1 to %USERPROFILE%\.gtkrc-2.0 (create the file if it does not exist). - - -From &app; 1.6+ the keyboard configuration is automatically loaded and saved between sessions in the -
- -
Tracks vs Routes - -In theory a route is path you are planning to follow and a track is of where you have actually been. The GPX specification splits these into two separate categories, although tracks contain everything route may have. - - -Q. When planning a route what difference does it make if it's a route or a track? - - -A. One difference is in how a GPS device navigates following the route or track. -The capability, the options and data on a particular device also effect how the navigation is performed. -Often the how a device actually works doesn't seem to be formally documented by the manufacturer (and can be firmware dependent too). -Web searches can reveal people's experiences with specific devices on blogs and various forums. -For some devices it will attempt to navigate between route points, which may then suggest various roads and tracks between the points using an internal routing algorithm with some kind of transport profile. -However this is limited to the quality of data available and how well the profile matches ones actual need. -If the points are close enough then the 'best' route for any form of transport will typically be the straight line between the points. - - -There are often restrictions on the numbers of route (or track) points the GPS Device can handle - may be 250 or as little as 50. -This generally not a problem for shorter routes, but needs managing for longer or detailed routes. -The number of track points is normally alot higher (e.g. 500 or typically with latest devices 10,000 or more) and less of a problem. - - - See for helping to manage this. - -
- -
- -
File Types and the Main Window - - -&appname; has it's own file type traditionally marked by the .vik file extension. -This is a plain text file saving all information of the current window including the view location, zoom level, projection type and then all the layer information (aggregates, maps, tracks, waypoints, etc...). - - -Besides it's own file type, &appname; can open (and save to via export methods) GPX and KML file types. - - - -&appname; does not handle GPX 1.1 particularly well - it prefers GPX 1.0 - - - -By default &appname; opens a default blank window centered on the home location. This behaviour can be changed by the . -Each window contains menus, a toolbar, a viewport, layers panel and a statusbar. -Each section (apart from the viewport) can be hidden using the or from the -ViewShow choices. - - -One may consider each &appname; window to be a separate project - each with it's project Viking file. -However generally one window is enough for most purposes! - - -Several operations apply at the window level as follows next. -Also see for the operational modes that generally work in conjunction with a selected layer. - - -
New - -Located on the FileNew menu and on the toolbar New. - - -This creates a new window with the default settings. - -
- -
Open - -Located on the FileOpen menu and on the toolbar Open. - - -This opens a file chooser dialog to select one (or more) files of the supported GPS data file types: - -Viking -GPX -TCX -KML -JPG - - - -GPX, TCX, KML and JPG files will be loaded into the existing &appname; view. A Viking file will be given a new window if the current window is already assigned. - - - -&appname; handles more file types via the Acquire methods below. - - -
- -
Open Recent File - -Located on the FileOpen Recent File menu only. - - -The most recently opened files are available for opening again. -The number of files remembered is controlled by a value in the . - - -Note that files imported via the Acquire mechanism are not available in this list. - -
- -
Save - -Located on the FileSave menu and on the toolbar Save. - - -If the current opened file is Viking file, this save will simply update it. -If it is a new file or the file loaded was an external type (i.e. GPX or KML), then this will ask for a new name to save as a Viking file. - -
- -
Save As - -Located on the FileSave As menu only. - - -This will ask for a new name to save as a Viking file (even it was already a Viking file). - -
- -
Append File - -Located on the FileAppend File... menu only. - - -Selecting a Viking file from this method will join the file contents to the current window (instead of creating a new one). - - -GPX and KML files may also be appended, whereby the file contents are added to the currently selected or layer. Otherwise they are loaded in the normal file open method when no layer is selected. - -
- -
Open GPX as External Layer - -Located on the FileOpen GPX as External Layer... menu only. - - -Selecting a GPX file from this method will create an external Layer that loads from the specified file. -The layer is marked as a "no write" external layer, which means any changes made will not be written back to the GPX file. -To enable changes to be written, you can change the layer to a standard external layer in the layer properties dialog. -This is in contrast to importing the data and storing it in the Viking file. - -
- -
Properties - -Located on the FileProperties menu only. - - -Displays some simple properties about the loaded Viking project file (if any), such as full filename including the path, the filesize and the date/time of the file. - -
- -
Export All - -Located on the FileExport All menu only. -Choose either the GPX or KML option. - -This allows converting every layer from the existing project into files of the type choosen. -You will be prompted for a directory into which a new file for each layer will be saved. - - -The KML option uses GPSBabel and so will not be available if GPSBabel can not be detected. - - -Note that some data properties are not supported by the target export file type. Such as item visibility or track colours. - -
- -
Acquire - - -Available on the FileAcquire menu and from the layer menu. - - -If used from the File menu these methods place the results in a new TrackWaypoint layer. - - -If used from the layer menu these methods place the results in that TrackWaypoint layer. - - -
-From GPS - -FileAcquireFrom GPS -Probably the easiest way of getting information from a GPS Device. - - -Select the GPS Device communication settings and then hit OK. -See the Getting Started section for more info about the settings. - - - -Some GPS devices (such as the Garmin Nuvi 255) support a native file system and write information to a Current.gpx file or similar. You will have to browse the file system on the device and open it directly. - - -
- -
-Import File With GPSBabel - -FileAcquireImport File With GPSBabel - - -Other formats can be imported that are supported by GPSBabel. - - -You need to select the file and the type of the file that is going to be opened, -since there is no automatic detection of the file kind. - -
- -
-OSM Traces - -FileAcquireOSM Traces - - -See section for more information. - -
- -
-My OSM Traces - -FileAcquireMy OSM Traces - - -See section for more information. - -
- -
-From Geotagged Images - -FileAcquireFrom Geotagged Images -Enables automatic creation of waypoints from geotagged images. - - -This menu opens a dialog to select such image files. -If the image files have geotag information in them, then a layer with named waypoints positioned at the location of each image with a thumbnail of that image is created. - -
- -
-From Wikipedia Waypoints - -FileAcquireFrom Wikipedia Waypoints - - -This gets interesting points from Wikipedia for the specified view: either within the extent of layer bounds or within the current viewport boundary. - -
- -
-From Routing - -FileAcquireFrom Directions - - -This gets a route from given directions. - -
- -
-From URL - -FileAcquireFrom URL - - -This gets a file from the entered URL. -File formats that can be opened are those supported by GPSBabel. - - - -You need to select the type of the file that is going to be returned, since there is no automatic detection of the file kind. - - -
- -
-Import GeoJSON File - -FileAcquireImport GeoJSON File - - -This uses the program togpx to load .geojson files. -If the program is not detected on your system, then this option will not be available. -See here for the installation method. - - -Versions proir to 1.6.0 of GPSBabel did not support the GeoJSON file format. - -
- -
- -
Print - -Located on the FilePrint menu and on the toolbar Print. - - -Print uses what is displayed on the current map view for printing: i.e. what ever map, tracks and waypoints that are in view, including the -cross hairs and the scale. - - -It uses a standard system print dialog using an image the size of the current viewport in pixel terms. -On the Image Settings you can move the image around the page and scale the image up / or down. - -
- -
Generate Image File - -Located on the FileGenerate Image File menu only. - - -Allows generation of larger (pixel) area images than the standard Print method above. -From the generated image you can use the facilities of the Operating System to print the image -or perform other actions. - - -You should have previously downloaded the tile images for the chosen zoom level, -otherwise the image produced will have missing sections. - - - -Using large areas takes some time to process and due to the method used it may run out of memory to complete the operation. -Unfortunately under Windows systems it can not detect this failure and may crash the program. -So the maximum size is dependent on the capabilities of your system. -For instance the largest successful image generated on my (RN) Debian system is a pixel area of 20,000 x 20,000. - - -
- -
Generate Directory of Images - -Located on the FileGenerate Directory of Images menu only. - - - -This is only available in UTM mode. - - -
- -
KMZ Map File Overview - -A KMZ file is a compressed version of a KML file and associated supporting files. - - -A KMZ Map file is a KMZ file with an image overlay often for use as a Custom Map on Garmin GPSr devices. - - -&appname; only supports basic properties in KMZ Map files, primarily intended for use with Garmin GPSr devices although KMZ exports are known to be work with Google Earth. - -
- -
Import KMZ Map File - -Located on the File menu only. - - -Enables loading of a selected KMZ map file. -This generates a new map layer using the overlay image contained within the KMZ file. - -
- -
Generate KMZ Map File - -Located on the File menu only. - - -Enables exporting the current viewport as a KMZ map file. -The area and zoom level covered by the KMZ map can be adjusted before saving. - - -Note that Garmin GPSr devices have limits in using images if they are too large (e.g. over 3Mb big) in KMZ files. -&appname; does not enforce any limits on the KMZ files it generates. - -
- -
- -
Layers - - -Layers supported by &appname; are: - - - - - - - - - - - - - -For each layer there are a few standard options: - - -Properties - Layer setup / configuration settings -Cut -Copy -Paste -Delete -Visibility - This checkbox on the Layers Panel controls whether the layer is shown in the viewport or not - - -The cut/copy/paste options can be accessed in a variety of ways once the layer has been selected: - - -Standard keys: Ctrl+x|c|v -Main menu Edit -From the right click menu -Buttons at the bottom of the Layers Panel - - -Default values used for each layer's properties can be altered via the EditLayer Defaults menu options. - - -See the individual section for detail about each layer. - -
- -
TrackWaypoint Layer - -TrackWaypoint layers display GPS data (tracks, routes and waypoints). - -One way to create new waypoints is to copy a -latitude/longitude coordinate pair, such as the one shown on most -geocaches, and paste it into an active TrackWaypoint layer. &appname; can -automatically recognize several variations of the lat/lon format. - - -By right-clicking on tracks, routes or waypoints in the , you can access many commands on them. -You can easily find a specific track, route or waypoint by expanding the appropriate containing Tracks, Routes or Waypoints sublayer in the -layers panel to show all the individual items and then typing the name of the track, route or waypoint. - - - -The containing Tracks, Routes or Waypoints sublayers are only shown when items of that type exist. -To start creating them enter into a create mode via either the Create toolbar commands or the New menu commands. - - - -The new TrackWaypoint layer dialog allows the layer to be specified as external. -In this case the layer is exported as GPX to the file specified instead of stored in the Viking file itself. -It is also possible to specify the layer as "no write". -This means that &appname; does not write the layer to the GPX file specified; instead, &appname; only reads the file. -No-write layers are primarily intended to be used with the option in the File menu. - - - -External layers are loaded only when they are displayed or selected. -Hence, they will not appear in any summary statistics if they have not been loaded. -It is possible to load all external layers contained in an layer by selecting "Load External Layers" from the Aggregate Layer context menu. -Note, &appname; specific options may not be saved if not supported by the GPX export. - - - -The sublayers also offer right click menu options. -These are the same as those available at the TrackWaypoint level, but only those that relate to the sublayer type. - - - -By default routes are coloured red. Tracks are automatically assigned a spread of colours. - - - -Most operations available on tracks are available on routes, except for functionality that relies on having timestamps - since routes by definition have no timing information. Thus for example, uploading a route to OpenStreetMap Traces is not available nor is Geotagging on a route. -It is possible to convert between Tracks and Routes, although converting from a Track to a Route may involve a loss of information (hence you are required to confirm this operation before it happens). - - - -Also see for use in conjunction with this layer. - - -
Layer Operations - -The layer has a context menu with several operations. - - -
View Layer - -Version1.1+: This will automatically move the viewport and select the best zoom level to see the whole layer (i.e. all tracks, routes and waypoints). - -
- -
View - -
View All Tracks - -Version1.1+: This will automatically move the viewport and select the best zoom level to see the all the tracks in the layer (ignoring positions of any routes or waypoints). - -
- -
View All Routes - -Version1.4+: This will automatically move the viewport and select the best zoom level to see the all the routes in the layer (ignoring positions of any tracks or waypoints). - -
- -
View All Waypoints - -Version1.1+: This will automatically move the viewport and select the best zoom level to see the all the waypoints in the layer (ignoring positions of any tracks or routes). - -
- -
- -
Goto Center of Layer - -This will automatically move the viewport to see the whole layer (i.e. tracks, routes and waypoints). It does not adjust the zoom level. - -
- -
Goto Waypoint - -This opens a dialog box to enter a name of waypoint to search for. If it is found the viewport is centred on it. - - - -Note this search is not very clever and only finds exact matches. -You are probably better off expanding the waypoint list and directly start typing, as mentioned above, which finds a match based on each letter typed. - - -
- -
Export Layer - -The layer (all tracks, routes and waypoints) can be exported to following file formats: - - - - GPX - - - GPSPoint - - - GPSMapper - - - Google's KML - - - Any GPSBabel File Formats - - - GeoJSON. Via the program togeojson - This option will not be available if the program is not detected on your system. - See here for the installation method. - - - -Version1.1+: An individual track can be exported to a GPX file via the track menu. - -
- -
Finish Track or Route - -Selecting this option ends the creation of that individual track or route. - - - -This is only available when a track or route is being created by the or tools. - - -
- -
New -
New Waypoint - -This opens a dialog box to create a new waypoint. A default name will be suggested and the default position is the center of the viewport. - -
-
New Track - -This turns on the tool. - -
-
New Route - -This turns on the tool. - -
-
- -
Geotag Images - -This starts the Geotagging Images dialog against all tracks in the layer. -See Geotagging for further detail. - -
- -
Acquire - -This offers the same choice from methods as on the File menu. -However when invoked from here, the results will be stored in this layer (instead of creating a new one). - -
- -
Upload - -
Upload to GPS - -This opens a dialog to select the GPS Device and port to which the layer information will be transferred. - - -The types of GPS information (tracks, routes or waypoints) to be transferred can be selected. - - -Tracks, Routes or Waypoints that are invisible will not be transferred. - -
- -
Upload To OSM - -This opens a dialog to upload all tracks and waypoints to OpenStreetMap traces. -Useful if you are an OpenStreetMap contributor, access details are stored in &appname; - - - &appname; allows you to edit a track, e.g. remove duplicate points, perhaps remove track points leading to your home and then upload it to OpenStreetMap. - -
-
- -
Delete -Offers deletion of various parts of a TrackWaypoint layer: -
Delete All Tracks -Deletes all the tracks in this layer. -
-
Delete Tracks from Selection -Opens a dialog with list of all the tracks from this layer to choose the ones to delete. -
-
Delete All Routes -Deletes all the routes in this layer. -
-
Delete Routes from Selection -Opens a dialog with list of all the routes from this layer to choose the ones to delete. -
-
Delete All Waypoints -Deletes all the waypoints in this layer. -
-
Delete Waypoints from Selection -Opens a dialog with list of all the waypoints from this layer to choose the ones to delete. -
-
Delete Duplicate Waypoints - - Deletes duplicate waypoints in this layer. - Waypoints are considered duplicate if they have the same location and symbol. - - If other properties are different such as name, comment, altitude, etc... they will still be considered a duplicate. - - - -
-
- -
Filter -
Simplify All Tracks - -This opens dialog to request the number of points each track will be simplified using GPSBabel. The result is put into a new layer. The simplification method removes points considered to be in a 'near straight line', thus reducing the number of points and attempting to keep the most important turning points. - -
-
Compress Tracks - -Enables compression of tracks and routes via GPSBabel's Crosstrack simplify method. -It opens a dialog to request the Error factor value which is the maximum allowable error that may be introduced by removing a single point. -It is expressed a distance in units as specified by the distance option. -Thus a higher value will remove more points. -The result is put into a new layer. - -
-
Remove Duplicate Waypoints - -Remove Duplicate Waypoints - fairly self explainatory, with the results created in a new layer. - - - -However it only considers a precise position (waypoints only 1 metre away from each other are considered different) and also doesn't consider if the waypoints have different comments, symbols or images. - - -
-
- -
Filter With <emphasis>Trackname</emphasis> - -This runs GPSBabel on the layer using information from a previously selected track (select via the track menu "Use With Filter" option) with the following command types: - - -Waypoints Inside This -Waypoints Outside This - - -The result is generated in a new Track/Waypoint layer. - -
- -
Geotag Images - -This starts the Geotagging Images dialog using the specific track. -See Geotagging for further detail. - -
- -
List Tracks or Routes - -Opens a new dialog with the list. As described in the Aggregate layer - -
- -
List Waypoints - -Opens a new dialog with the list. As described in the Aggregate layer - -
- -
- -
Track and Route Sublayer Options -Repeats options available at the TrackWaypoint level, but only those for tracks and routes: - - -Finish Track or Route -Same as the layer Finish Track or Route - - -New Track or Route -Same as the layer New Track or New Route - - -View All Tracks or Routes -Same as the layer View All Tracks or View All Routes - - -Delete All Tracks or Routes -Same as the layer Delete All Tracks or Delete All Routes - - -Delete Tracks or Routes from Selection -Same as the layer Delete Tracks from Selection or Delete Routes from Selection - - -List Tracks or Routes -Opens a new dialog with the list. As described in the Aggregate layer - - -Also gives other options for handling multiple items: - - -Sort -Gives the ability to sort the items in the treeview alphabetically or by date. - - -Visibility -Offers options to quickly control the visibility of all items within the sublayer, as per - - -
- -
Track and Route Properties - -This shows several tabs for properties and useful statistics about a track or a route, including elevation-distance and speed-time graphs (if data is available). -Moving the mouse pointer over the graph displays values related to that point along the track. -You can click on these graphs to jump to the point in the track. -You can reverse it, delete duplicates, split at marked position or split a track from its component segments (discontinuous breaks in a track) into separate tracks. - - -For the elevation related graphs the Show DEM check button is only enabled if a suitable is available that overlaps the track. - - -Graphs either have a Show GPS Speed or Show Speed button. -Each of these overlays relative speed markers along the graph. -The difference between Speed vs GPS Speed is that GPS Speed is taken directly from a field reporting the speed value in the source data. -Typically speeds used in Viking are calculated between the points time and position differences. -This is due to the reporting of speed values in source data is not mandatory and often not present. - -
Track and Route Properties Tab - -
-Properties Tab: Example - - - -
-
-
-
Track and Route Statistics Tab - -
-Statistics Tab: Example - - - -
-
-
-
Track Elevation Graph - -
-Elevation Distance Tab: Example - - - -
-
- -The following colors are used in the elevation-distance graph: - - - -Main colour - this is dependent on your Desktop theme - often blue by default -elevation data in graph - - -Yellow - -no elevation data - - - -Green - -elevation data from DEM - - - -Red - -speed - - - -
- -
Track Time Splits - -
-Splits Tab: Example - - - -
-
- -This tab displays timing splits on tracks with timing information. -A few different values of split lengths are available, each having it's own tab display. - -
-
- -
Track and Route Operations - -
Finish Track - -Selecting this option ends the creation of the individual track. - - - -This is only available when a track is being created by the tool. - - -
- -
Goto - -This centers the viewport on the selected position on the track: - - -Startpoint -"Center" - the notional center from the bounds of the track -Endpoint -Version1.1+: Highest Altitude -Version1.1+: Lowest Altitude -Version1.1+: Maximum Speed (Not Available on Routes) -Version1.8+: Previous trackpoint -Version1.8+: Next trackpoint - -
- -
View - -Version1.1+: This centers the viewport on the track and selects the best zoom level to see it. - -
- -
Combine -
Merge By Time - -This operation repeatedly tries to merge the right-clicked track -with tracks in the same TrackWaypoint layer. The tracks which are -merged are those which have at least one trackpoint less than some -threshold time away. This way, if you somehow end up with lots of small -segments (say, caused by turning the GPS on and off) you can merge them -easily into one track. - - - -This is not available on routes as they have no timestamps. - - -
- -
Merge With Other Tracks - - This opens a dialog listing the other tracks in the same TrackWaypoint layer, from which one can select the other tracks to merge with. - Tracks are merged in order of time. - -
- -
Merge Segments - -Combines track segments. Effectively removing track segment markers to leave one segment for the whole track. - -
- -
Append Track or Route - -Enable joining of a single track to the end of the current track. -This opens a dialog listing the other tracks in the same TrackWaypoint layer from which one can make the selection. - -
-
- -
Split -
Split By Time - -This operation will split a single track into segments wherever the -time interval between successive trackpoints is larger than some -threshold. This is useful when processing raw NMEA GPS data, especially -taken over a long time. - - - -This is not available on routes as they have no timestamps. - - -
- -
Split By Number of Points - -Version1.2+: This operation will split a single track into segments by the number of points specified. -This can be useful with devices which may have limits on the number of points it supports. - -
- -
Split Segments - -Splits track segments into new tracks. - - - -This is not available on routes as they do not have route segments. - - -
- -
Split at Trackpoint - -Splits the track at the currently selected trackpoint. - - -The current track will finish at this trackpoint. -A new track will start from a copy of this trackpoint. - - - -This is only enabled when a trackpoint is selected. - - -
-
- -
Insert Points - - -These options are only enabled when a trackpoint is selected. - - -
Insert Point Before Selected Point - -Inserts a track point halfway between the previous track point and the current track point. -All track point properties are interpolated between the two points. - -
-
Insert Point After Selected Point - -Inserts a track point halfway between the current track point and the next track point. -All track point properties are interpolated between the two points. - -
-
- -
Delete Points -
Delete Selected Point - -Deletes the currently selected track point. - - - -This is only enabled when a trackpoint is selected. - - -
-
Delete Points With the Same Position - -Deletes subsequent points that have the same position (but have different timestamps). - -
-
Delete Points With the Same Time - -Deletes subsequent points that have the same time stamp (but may have different positions). - - - -This is not available on routes as they have no timestamps. - - -
- -
- -
Transform - -These options alter the data of trackpoints of a track but not add or remove trackpoints. -And don't seem to fit any other category :) - -
Apply DEM data - -If any DEM data is loaded, this will apply the DEM data to give the track elevation data. -Two ways of applying DEM data are offered: - -Keep. Retains the existing elevation data of trackpoints and only those missing an elevation value are set. -Overwrite. Elevation data are set on all trackpoints even if they already elevation values. - - -
-
Smooth Missing Elevation data - -In various locations across the world, there are missing DEM values (AKA DEM Holes) from the SRTM data. -This is particularly noticeable in mountainous areas. -Two ways of applying elevation data to trackpoints that do not have elevation values are offered: - -Interpolated. Missing elevation data is interpolated between the previous and next known values. -Flat. Elevation data is filled in from the last previously known value. - - -
-
-Convert to Track or Route - -If this is a Route then it will convert it to a Track. - - -If this is Track then convert it to a Route. - - - -Converting from a Track to a Route may involve a loss of information, in particular timestamp values (hence you are required to confirm this operation before it happens). - - -
-
-Anonymize Times - -Timestamp information of a track can be shifted to be all offset from 1901-01-01. - - -Thus the timestamps themselves will no longer reveal exactly when a track was taken. -However the relative difference between the timestamps is kept thus one is still able to calculate some properties such as speeds along the track. - - - -This is not available for routes, as they have no timestamps. - - -
-
-Interpolate Times - -Trackpoint timestamps between the first and last points are calculated such that track is travelled at equal speed. -This is mostly useful when tracks don't have timestamps and you wish to recreate your trip (e.g. you've forgotten to turn on your GPS or the batteries have run out) -Thus edit the first and last trackpoints to set the approximate times of your trip and then use this to give approximate times along the track. -When used on tracks with timestamps this will overwrite the existing timestamps. - - - -This is not available for routes, as they have no timestamps. - - -
-
- -
Export Track as GPX - -Version1.1+: This allows exporting the track as a GPX file by opening a file save dialog. - -
- -
Extend Track End - -Changes the current tool to add trackpoints to the end of the track. - -
- -
Extend Using Route Finder - -Enables the Route Finder tool. Thus on a subsequent left click in the viewport, a route is calculated from the end of track to that point using the default route service and applied to the track. - -
- -
Upload - -
Upload to GPS - -Same as the layer Upload to GPS command, but only applies to the track. - -
- -
Upload to OSM - -Same as the layer Upload to OSM command, but only applies to the track. - -
- -
- -
Use With Filter - -This selects the track to be used in the Filter With Trackname feature. - - - -This is not available on routes. - - -
- -
Edit Trackpoint - -This opens the Trackpoint edit dialog. See . - - - -This is only enabled when a trackpoint is selected. - - -
- -
Refine Route... - -This function allows to request a Routing Engine in order to refine a given route. -By "refining" we mean computing all real intermediates points between some given major points. -This could be useful to compute a trip giving only the wished important steps. - - - -This is only available on routes. - - -
- -
View Google Directions - -This option is only available on a track created using the Route Finder tool. - - -Launch a web browser to see the Google directions page which yielded the route. - - - -The record of the Google route is stored in the track's comment, so if the comment is changed (or the route was created by something other than the Route Finder tool) this will not work correctly. - - -
- -
- -
Waypoint Sublayer Options -Repeats options available at the TrackWaypoint level, but only those for waypoints: - - -New Waypoint -Same as the layer New Waypoint - - -View All Waypoints -Same as the layer View All Waypoints - - -Goto Waypoint -Same as the layer Goto Waypoint - - -Delete All Waypoints -Same as the layer Delete All Waypoints - - -Delete Waypoints from Selection -Same as the layer Delete Waypoints from Selection - - -Delete Duplicate Waypoints -Same as the layer Delete Duplicate Waypoints - - -List Waypoints -Opens a new dialog with the list. As described in the Aggregate layer - - -Also gives other options for handling multiple items: - - -Sort -Gives the ability to sort the items in the treeview alphabetically or by date. - - -Visibility -Offers options to quickly control the visibility of all items within the sublayer, as per - - -
- -
Waypoint Properties - - -This shows a dialog with detailed information for the waypoint. Many properties of the waypoint can changed here, such as the comment, the symbol used in drawing or the image (normally a photograph taken at this position) assiocated with it. When a waypoint has an image, a thumbnail of it is drawn in the viewport for the waypoint (in preference to the symbol). - - -If the waypoint has an associated image, then the Geotag information may be updated, either with updating the file's modification timestamp or not. -This can be useful when the waypoint has been moved. - - -
- -
Waypoint Operations - -
Goto - -This centers the viewport on the selected waypoint. - -
- -
Geotag Images... - -This opens the Geotag Dialog to allow Geotagging multiple images to the position of this waypoint. -In this circumstance creation of waypoint options are disabled and only the options related to writing the EXIF information are available. - -
- -
Transform - -Offers a subset of the track utilities. -Currently only setting the altitude from DEM data methods are available. - -
- -
Visit Webpage - -If the waypoint's comment (or description) starts with http: then this option is available and allows launching a web browser to go to the webpage. - -
- -
Visit Geocache Webpage - -If the waypoint's name is in Geocache form (GCXXXXX) then this option is available and allows launching a web browser to go to the Geocache page. - -
- -
New Waypoint - -Same as the layer New Waypoint. - -
- -
- -
Version1.3+: Geotag Images - -This dialog allows geotagging images (normally taken with a digital camera) against a specific waypoint or via interpolation against a specific track or all tracks in the TrackWaypoint layer - depending on how it is invoked. - - -When geotagging against tracks, images need to have an EXIF DATE_TIME_ORIGINAL (nearly always set by a camera). This timestamp is then used to find the location when the image(s) was taken by searching through the track(s) to find the nearest time - interpolating between points if necessary to set the location. - - - -Generally it is good policy to synchronize your camera's clock with your GPS clock before taking photographs. However the times can be adjusted afterwards (if necessary) to take into consideration clock differences. - - - -Various options allow control of how the geotagging process is performed: - - -Images - Add the images used for geotagging -Create Waypoints -Overwrite Existing Waypoints -Write EXIF -Overwrite Existing GPS Information -Keep File Modification Timestamp -Automatic Image Direction - Assumes the direction will be in line with the track heading -Interpolate Between Track Segments -Image Time Offset - The number of seconds to ADD to the photos time to make it match the GPS data. Calculate this with (GPS - Photo). Can be negative or positive. Useful to adjust times when a camera's timestamp was incorrect. -Image Time is Local - Are the timestamps in the image local time or otherwise in UTC. -Image Timezone - The timezone adjustment factor. - - -Typically timestamps in images are either in local time or UTC but there is no way of automatically knowing which; so you need to specify which is the case. -Image Time Offset is best used for accounting for camera's clock drift, so normally of the order of a few seconds or minutes. -Whereas Image Timezone is more for adjusting for a camera's timezone difference, or perhaps differences in your current timezone and the timezone the images where taken. - -
- -
- -
GPS Layer - -The GPS layer is responsible for uploading and downloading GPS data -from a GPS device. It also is responsible for realtime GPS tracking. -Expand the GPS layer in the layers panel to see the two layers it -uses for uploading and downloading. To upload, download, or use -realtime tracking, right-click the GPS layer and click the appropiate -menu item. - - -
Download - -To download data from the GPS, right-click the GPS layer and click Download from GPS. - -
- -
Upload - -To upload data to the GPS, first populate the GPS Upload child -layer of the GPS layer (either by creating waypoints/tracks/routes in it, or -copying and pasting or dragging waypoints/tracks/routes from another layer). -Then right-click the GPS layer and click Upload to GPS. - -
- -
Realtime Tracking - -You must set up gpsd correctly or use a GPSD server and put the -correct information in the GPS layer properties dialog. Then right-click -the layer and select Start Realtime Tracking. - -
- -
Empty <emphasis>Item</emphasis> - -There are several options to quickly delete a subsection of data: - - -Empty Realtime -Empty Upload -Empty Download -Empty All - -
- -
- -
DEM (Digital Elevation Model) Layer - -This layer provides elevation data from the Shuttle Radar Topography Mission (SRTM) - - -Elevation data can be useful in planning trips, as you many wish to avoid/minimise the hills encountered. [OSM Cyclemap is also useful this way too] - - -To download the data use the tool (shown on the toolbar), and then click on a area of the viewport. Once files have been downloaded they can then be loaded from disk via the DEM properties in future application runs. - - -The current data server is: NASA STRM 2.1. - - -ATM &appname; does not auto download DEM data. If you want to get lots of data blocks, you may wish to use some other program get such as curl or wget to download them for an area. - - - -Using many DEMs is CPU/memory intensive. Depending on your computer's capability, &appname; will be less responsive when about 50+ DEM blocks are loaded. It is probably unwise to attempt using 200+ blocks, so trying to use DEMs covering large countries/continents (USA, Australia etc...) is unlikely to work. In these conditions under Linux, &appname; may be automatically stopped by the "OOM Killer" - - - -
- - -
Maps Layer - -This layer provides a single map resource, you may have multiple map layers but only top one (if enabled) will be visible (subject to the Alpha compositing property). - - -Some maps are continually improving over time (e.g. OpenStreetMap) thus &appname; employs a caching mechanism to avoid redownloading data (see ). -However a forced refresh for the current view can be made via the Reload All Onscreen Maps option or Ctrl+F5. - - - -Also see tool for use in conjunction with this layer. - - -Online Map Tile Providers - -You will need an open internet connection when you are downloading maps these following map types, but once downloaded they are available from the hard disk cache. When map are avaliable from the disk cache it is much faster and can be used offline. -Inbuilt maps include various OpenStreetMap (OSM) ones and more: - - - -Bing Aerial Maps (&appname; Version1.2+) -Mapbox Outdoors - This is the default (&appname; Version1.7+) -OpenStreetMap (Mapnik) -OpenStreetMap (Cycle) -OpenStreetMap (Transport) (&appname; Version1.3+) -OpenStreetMap (Humanitarian) (&appname; Version1.5+) -NASA BlueMarble - - - -&appname; can be configured to handle additional online map resources. See for further detail. - - -Offline Map Tilesets - -Some map types supported are for on disk tile formats: - - - - - On Disk OSM Tile Format - This is equivalent to any map set with OSM Cache Layput. - -MBTiles File - - OSM Metatiles - - This file format is mostly aimed at being rendering cache feature and is Endian dependent. - Thus to successfully view the file cache, the Metatile files and Viking must be of the same endian type (which they probably will be). - - - - -Of course you need to have acquired or generated these tilesets yourself. - - -
Map Layer Properties - -Configurable properties: - - - -Map Type - - The kind of map this layer displays. - Map types are dependent on the current mode. - - - -Maps Directory -Not applicable for MBTiles Map type since it is a single file. - - -Cache Layout -Viking or OSM. See . Only applies to maps from online tile providers. - - -Map File -Ony applicable for MBTiles Map type since it is a single file. - - -Alpha - - Control the Alpha value for transparency effect using a value between 0 and 255 with the default being 255 for a fully solid image. - Zero is fully transparent. A value of around 160 can be useful for blending views of multiple map layers (when applied to the upper most map layer). - - - -Autodownload Maps -This can be useful to turn off when you are not online to avoid pointless download requests or may be keep a map in a 'historical' state. -e.g. perhaps in case a current map rendering is broken. - - -Autodownload Only Gets Missing Maps -Using this option avoids attempting to update already acquired tiles. -This can be useful if you want to restrict the network usage, without having to resort to manual control. Only applies when Autodownload Maps is on. - - -Zoom Level -Determines the method of displaying map tiles for the current zoom level. -Viking Zoom Level uses the best matching level, otherwise setting a fixed value will always use map tiles of the specified value regardless of the actual zoom level. - - -
- - -
Layer Operations -
Download Missing Onscreen Maps - -This requests map tiles for areas of the viewport that do not currently have one. - -
- -
Download New Onscreen Maps - -This requests map tiles only if the maps are older than the Tile Age preference. - -
- -
Reload All Onscreen Maps - -Force a refresh of all visible map tiles. - -
- -
Download Maps in Zoom Levels - -This opens a dialog to enable requesting the download of maps for the region in the viewport over a specified number of zoom levels. -The download method type can be specified to help limit the number of requests. - - - -There are some inbuilt limits to prevent downloading large amounts of map tiles. - - -Please respect the usage policy of the tile set provider. -Such as OSM Tile Usage Policy. - - - -
-Maps Download Dialog: Example - - - -
-
-
-
- - -
- -
Aggregate Layer - -This layer is a container layer to hold other layers. There is always an initial and controlling Top Layer that can not be removed or renamed. - - -This layer type is useful for grouping other layers, especially layers, in whatever categories are relevant to you: such as by activity, location or date. -Here are some suggestions: - -Hiking -Mountain Biking -Road Cycling -Car Trips -Sailing -Holidays -UK Points of Interest -USA Points of Interest -etc... - - - -Thus one can have a list of all your tracks, but groups can be shown or not using the relevant layers visibility checkbox. - - - -Tracks Area Coverage (TAC) is a feature to highlight areas with track coverage. -It is based on OpenStreetMap style tiles - as an approximation to a grid square system. -The size of the area can be changed, which is linked to the OSM Zoom level, -such that a higher Zoom level gives a smaller physical area and so more tiles. -This can be used for general curiousity or perhaps to plan routes to visit areas previously unexplored. - - -The calculations are performed in the background when deemed necessary (e.g. loading in a new file) and can also be manually requested. - - -Note that Viking can be slow in drawing hundreds or more tracks but this analysis is relatively quick and the resulting drawing is much faster. -Thus ATM is it recommended to turn off the visibility of the tracks themselves for this type of usage. - - - -
-Tracks Area Coverage: Example - - - -
-
- -
Layer Properties: Tracks Area Coverage -Offers basic controls whether it is enabled or not and includes the size of the tile. -
- -
Layer Properties: TAC Advanced -Controls subsets of TAC drawing are calculated and shown with their colour and opacity. -Note for Max square coverage, ATM it will only draw the first square encountered, although there may be more than one such area. -Note for Cluster coverage, ATM it will only draw the first cluster encountered, although there may be more than one such area. -
- -
Layer Operations - -The following are available on Aggregate Layers: - - -
New Layer - -Add a new layer of the selected type. - -
- -
Sort - -The list within the treeview can be sorted. - - -Alphabetical and Date sorts are available. - - - -Generally it is not useful to sort the Top most layer. Sort is mainly intended for Aggregate groups of TrackWaypoint layers. - - -
- -
Track List - -Selecting this opens a dialog listing all the tracks in a table along side statistics such as track length and maximum speed. -Each column header is clickable and will reorder the list according to that particular column. -You can also rearrange the columns via dragging the column header to the new location. - - -This table may be invoked from a variety of different layer levels and will then list only the relevant tracks (and/or routes). - - -Aggregate Layer -Lists Tracks and Routes and the TrackWaypoint Layer they are in - - -TrackWaypoint Layer -Lists Tracks and Routes - - -TrackWaypoint Track sublayer -Lists Tracks only - - -TrackWaypoint Route sublayer -Lists Routes only - - - - -
-Track List Dialog: Example -
- -This is showing all tracks and routes (although there are no actual routes here!) in multiple TrackWaypoint layers, that has been sorted by height. -Note that routes will not have timestamps or speeds, but may have elevations and should have some distance! - -
- - - -
-
- -Hovering the mouse over an entry will show a tooltip of the comment or description if it is available. - - -Each entry in the track list can be selected and on mouse right click offers these options: - - -View -Move the viewport to the area of the item and highlight it. - - -Statistics -Opens the Properties dialog on the tab. Note this will close the track list dialog. - - -Copy Data -Copy the data fields as text. - - - - -If multiple entries are selected the only right click option is Copy Data. -This copies the individual data fields as plain text separated by tab characters, ideal for pasting into other applications in particular spreadsheet programs. -Note that the order of the fields copied is the default column ordering (irrespective to how they may have been rearranged). - -
- -
Waypoint List - -Selecting this opens a dialog listing all the waypoints to give a overview of the waypoint information. -Each column header is clickable and will reorder the list according to that particular column. -You can also rearrange the columns via dragging the column header to the new location. - - -This table may be invoked from a variety of different layer levels and will then list only the relevant waypoints. - - -Aggregate Layer -Lists Waypoints and the TrackWaypoint Layer they are in - - -TrackWaypoint Layer -Lists Waypoints - - -TrackWaypoint Waypoint sublayer -Lists Waypoints - - - - -
-Waypoint List Dialog: Example -
- -This was invoked on a TrackWaypoint layer and shows all waypoints from that single layer. It has been sorted by the symbols. - -
- - - -
-
- -Hovering the mouse over an entry will show a tooltip of the description if it is available. - - -Each entry in the list can be selected and on mouse right click offers these options: - - -View -Move the viewport to the area of the item and highlight it. - - -Properties -This will open the properties dialog. Note this will close the waypoint list dialog. - - -Show Picture -If enabled, this will open the associated image in an external Image Viewer program. - - -Copy Data -Copy the data fields as text. - - - - -If multiple entries are selected the only right click option is Copy Data. -This copies the individual data fields as plain text separated by tab characters, ideal for pasting into other applications in particular spreadsheet programs. -Note that the order of the fields copied is the default column ordering (irrespective to how they may have been rearranged). - -
- -
Visibility Options - -This offers a quick way to set all the visibilities of each item within the containing layer, rather than having to change each one individually. - - -Show All -Ensures all items are set to be visible. - - -Hide All -Ensures all items are set to be invisible. This is useful for then turning on single items afterwards so the display is not cluttered. - - -Toggle -Inverts the visibility status of each item. - - - -
- -
Search by Date - -This opens calendar dialog to select a date to search by within this Aggregate layer. -The first item that is found on that date will be selected. -Tracks are searched first in preference over waypoints. - -
- -
Statistics - -This opens a dialog to display various statistics about all tracks contained within this Aggregate layer. - -
-Statistics Dialog: Totals - - - -
- - - This currently generates a simplified Eddington number. - In that a per track length value is used, rather than trying to work out a length per day. - (i.e. doesn't combine multiple tracks for a single day or split very long tracks into days). - The Eddington number is in the current Unit distance . - - -
-Statistics Dialog: Years - - - -
-
- -
Append File - -This opens a dialog to select files to load within this Aggregate layer. - -
- -
Tracks Area Coverage->Calculate - -Start a new Tracks Area Coverage calculation. - -
- -
Tracks Area Coverage->Remove - -This clears the Tracks Area Coverage information, thus no grid colouring will be displayed. - -
- -
-
- - - - - - - -
Coordinate Layer - -This layer is allows drawing of grid lines on the viewport. - -
- - -
Tools - -&appname;'s mouse actions on the viewport are controlled by which tool is active. Only one tool can be active at a time. The default mode is pan. You can return to the default mode by pressing Escape. - - -You can use the scroll wheel, the middle-click, the middle-click+drag to zoom, center map at position and pan respectively no matter what tool you are using. - - -Scroll: zoom in and out keeping the mouse over same location - - -Ctrl-scroll: pan north-south (also Ctrl-up, Ctrl-down) - - -Shift-scroll: pan east-west (also Ctrl-left, Ctrl-right) - - -Ctrl-shift-scroll: zoom in and out, without changing the center (also Ctrl+, Ctrl- [*not* KeyPad +/-]) - - -Middle-click: make the clicked point on the map the center - - -Middle-click and drag: pan - - -
Pan - -This is the default mode of operation for &appname;. - - -This mode is entered by clicking on the toolbar icon: - - -Pan moves the viewpoint. A single click centers the viewport at that point, whereas click and drag dynamically moves the view around. -This is the default tool. - - -This mode can also be entered by the keyboard shortcut Ctrl+Shift+P - - -Double clicking the left mouse button will zoom the map in. -Shift + double clicking the left mouse button will zoom the map out. -Double clicking the right mouse button will also zoom the map out. - -
- -
Zoom - -This mode is entered by clicking on the toolbar icon: - - -Zooms in and out on the clicked part of the map or by the selected area. - - -This mode can also be entered by the keyboard shortcut Ctrl+Shift+Z - - -Ctrl + left or right click: Zoom in/out and center the map on the clicked location - - -Shift (and hold) + left mouse button: Draws a bounding box area on which to zoom in. The zoom action is performed when the left mouse button is released. - - -Shift + left click button: Jump Zoom In by up to factor of 3 standard zooms. - - -Shift + right click button: Jump Zoom Out by up to factor of 3 standard zooms. - -
- -
Ruler - -This mode is entered by clicking on the toolbar icon: - - -The ruler is used to measure either: - - - -The bearing and distance between two points: Click on first point and then move the mouse point around - the values will be continually updated. -A second click will freeze the ruler at that point. - - - -An area: Shift (and hold) + left mouse button: Draws a bounding box area. Area values are shown in the statusbar and on the viewport. -Releasing the mouse button will freeze the area at that point. -The viewport label option is controlled by . - - - - -This mode can also be entered by the keyboard shortcut Ctrl+Shift+U - -
- -
Version1.1+: Select - -This mode is entered by clicking on the toolbar icon: - - -The select tool allows one to choose any waypoint or track by clicking on it (or reasonably near) in the viewpoint. - - -ATM to select a track one must actually click on a trackpoint, which is also selected. - - -This mode can also be entered by the keyboard shortcut Ctrl+Shift+S - -
- -
TrackWaypoint Layer Tools - -You must have a Layer selected to use these tools. - -
Create Waypoint - -Enable this tool by clicking on the toolbar icon: - - -Left click will open the new waypoint dialog using the specified position. - -
- -
Create/Edit Track - -Enable this tool by clicking on the toolbar icon: - - -General track edit/create tool. -The first left-click will create a new track and you will be asked to enter a name for the track. -If Shift is held, a track will be continued from a nearby trackpoint. -Subsequent left-clicks will add new trackpoints. -If Shift is held, the track will be joined to an existing track at the point selected. -If Ctrl is held, it will jump the new trackpoint position to a nearby existing trackpoint. - - -Right click or Backspace: undo one point. - - - - - -Double click or Escape: to finish track creation. -Finishing the track is also available via the right click and track menus. - - -One must finish the current track to be able to create another track. - - -Keypad Add or ]: Insert point after current point. - - -Keypad Minus or [: Insert point before current point. - - -Left: Select the previous point. - - -Right: Select the next point. - -
- -
Edit Route - -Enable this tool by clicking on the toolbar icon: - - -This operates in exactly the same way as the Edit Track above. - - -One must finish the current route to be able to create another route. - - -One can switch between the Edit Route and Route Finder tools while editing routes. - -
- -
Create Route Using the Route Finder - -Enable this tool by clicking on the toolbar icon: - - -Requires an internet connection. -Left click to create a new trackpoint. -If it's the initial trackpoint you will be asked to enter a name for the route, otherwise the default routing engine will be queried to find a route to the new trackpoint. -Right click or Backspace: remove the last added route. - - -Escape: to finish route creation. -Finishing the track is also available via the right click and track menus. - - -One must finish the current route to be able to create another route. - - -One can switch between the Edit Route and Route Finder tools while editing routes. - -
- -
Track Splitter - -Enable this tool by clicking on the toolbar icon: - - -Use this tool to split a track or route. -After enabling the tool, click on the track/route point of the track/route at the position where you want the split to occur. - -
- -
Edit Waypoint - -Enable this tool by clicking on the toolbar icon: - - -Left Click/drag: select/move a waypoint. -If Ctrl is held at the same time, it will jump the waypoint position to a nearby existing trackpoint. -If Shift is held at the same time, it will jump the waypoint position to a nearby existing waypoint. - -Right-click on waypoint: opens a menu with waypoint actions (the -same menu accessed by right-clicking the waypoint in the layers panel) - -
- -
Edit Trackpoint - -Enable this tool by clicking on the toolbar icon: - - -Left click near a trackpoint (in screen pixel terms) to bring up the Track Point Edit dialog on that trackpoint. -Whilst the edit dialog is already open, left click again and drag enables moving of the trackpoint. -If Ctrl is held at the same time, it will jump the new trackpoint position to a nearby existing trackpoint. - -
Edit Trackpoint Dialog - -Editing options in the Trackpoint Edit dialog include: - -Edit the trackpoint name -Changing raw lat/long position and altitude -Forward (go to the next trackpoint) -Back (go to the previous trackpoint) -Delete -Insert. Inserts a point halfway to next trackpoint -Split. - - - -Several fields are read only for reference purposes, values are shown if the trackpoint has such information: - -Time. -Speed and course. -'Between' values: Speed, Time Difference and Distance Difference. When moving between trackpoints (via the Back and Forward buttons) these values are calculated. -GPS precision factors. - - - -
-Trackpoint Edit Dialog: Example - - - -
-One must have been going downhill here to get a reasonable speed by bicycle! -
-
-
- -
Show Picture - -Enable this tool by clicking on the toolbar icon: - - -Opens an image viewer with the picture associated with the waypoint. -By default this uses the default system image viewer. -For Linux you can override this with the setting in the - -
- -
- -
Georef Map Layer Tools - -You must have a Map Layer selected to use these tools. - -
Georef zoom - -Enable this tool by clicking on the toolbar icon: - -Changes the zoom level of the georeferenced map and changes the -&appname; zoom level accordingly. Useful if you are trying to match GPS -data to a georeferenced map. - -
- -
Georef move - -Enable this tool by clicking on the toolbar icon: - - -Drag to move the georeferenced map. - -
-
- -
Map Download - -You must have a Layer selected to use this. - - -Enable this tool by clicking on the toolbar icon: - - -Click to download a single tile. Drag to download tiles in the dragged rectangle area. - - -Right-click to redownload tiles via the selected method. Right-click and drag to redownload tiles in the dragged rectangle area by the selected method. -The possible methods to redownload one or more tiles are: - - - - -Bad -Only if the tile is corrupt in some way or missing, then this will download a new copy - - -New -Refresh the tile according to the local map cache and if server has a newer version - - -All -Redownload the tile - - - -Map Tile Information - -By right clicking on viewport and selecting Show Tile Information you can see the tile properties of this location for the current map layer and current zoom level. -This includes the remote source URL for the tile and the cached version on the local filesystem with timestamp details. - - - -
-Map Tile Info Dialog: Example - - - -
-This is using MapQuest at &appname; zoom level 128 over the Isle of Wight, UK. -
-
- -
DEM Download - -You must have a Layer selected to use this. - - -Enable this tool by clicking on the toolbar icon: - - -Click to download and import a DEM file. - -DEM File Information - -By right clicking on viewport and selecting Show DEM File Infomation you can see the file properties of the DEM file for this location. -This includes the remote source URL for the file and the cached version on the local filesystem with timestamp details. - - - -
-DEM File Info Dialog: Example - - - -
-This is for block 51N, 003W - covering Bristol in the UK. -
-
- -
Webtools - -Many services are available only via a web browser (Google Maps, OpenStreetMap Potlach editor, etc.). - - -Jumping from &app; to such service can become annoying. - - -&appname; allows you to open such service directly at the position currently viewed in &app;. - - -This feature is called Webtools. It is also known as External Tools. - -
- -
- - -
Preferences -
General -
Localisation -You can select units displayed by &appname; to best fit your usage. -
-Properties dialog: units part - - - -
-Concerning degrees, you can select the way to display them: - - -DDDdecimal degree - - -DMMpartial sexagesimal display: degrees, minutes and decimal part of minutes - - -DMSsexagesimal display: degrees, minutes and seconds - - - -
-Properties dialog: degree display options - - - -
-
-
Waypoint Icon Size -An option exists to control the icon (symbol) size used for waypoints - -
-
<emphasis>Home</emphasis> Default Location: Latitude and Longitude -You can set the Home location directly by inputting the latitude and longitude in decimal degrees. - -
-
Time Display -This controls the reference timezone that times are shown in. -Locale is the current user's system preference. This was how all times were shown up to version 1.5. -World will attempt to determine the timezone at an object's position. -UTC enforces this standard timezone. -
-
Tile's age -This age is used to decided wether or not a new request to tile server must be done. - -Changing this value, you will increase or decrese the network load. -
-
Default map layer directory -This property sets the default directory of the tiles cache. -This value is used when you create a new map layer. - -You are still able to change this value in each map layer properties. -
-
Map Cache Memory Size -This controls the amount of maps that are stored in memory, rather than having to reread from disk. -Generally if you have a system with lots of memory it's recommended to increase this value. - -
-
- -
Export/External -
KML Export Units -Allows setting the units used when saved as the KML file type, such as Metric or Statue units -
-
GPX Track Order - - Other software may display tracks in a particular order (often the order saved into the file). - This allows you to control the order they are saved when exporting to a GPX file. - -
-
GPX Waypoint Symbols -Some GPS devices require waypoint symbols to be in a particular case. -E.g. On a Garmin Oregon 450 they must be in Title Case to be recognized. -
-
Image Viewer (Not Windows) -Allows setting the program used to view images associated with Waypoints. -By default this is set to xdg-open which should open the system's default image viewer, however this can be overridden with this setting. -Note: for Windows systems, viewing images associated with Waypoints always uses the system's default image viewer. -
-
External GPX programs -Allows setting the programs invoked via the Layer menu Export LayerOpen With 'program' -Two options are given so that it can be configured for various uses such as: - -An OSM editor (default) -Some other user defined program - -
-
GPSBabel -This allows setting the specific location of GPSBabel. -&appname; will need to be restarted for this setting to take effect. -
-
Auto Read World Files -If this is on, when a new image is selected for the GeoRef layer then the associated world file will be read to find the scale and positional properties. -The associated file is based on filename patterns; e.g. if the image is filename.jpg - then the world file may be filename.jpgw or filename.jgw -
-
Auto Device GPX Simplify -If this is on, GPX files will be simplified (using GPSBabel) if they are saved into a special location (by default a Garmin device location in OS file system). -Extra parameters used in process such as the location and limits applied can be refined by export_device_* values in . -A warning message is displayed when this occurs so one can consider if manually managing the tracks is needed, e.g. see methods. -The main intention for this is to prevent writing GPX files that are only partially useful. -For instance on a GPS Etrex 20 device: if a track with 1000 points is saved to it, the device will only read in the first 500 points, -thus effectively making only 1/2 of the track available. -Hopefully a simplified track will be more useful to follow to your destination when one is out in the wilds, than only a section of it. - -You will need to set the appropriate limits for your device, as this is not currently auto detected. -
-
- -
Advanced -
Save File Reference Mode - - Files referenced within project files can be saved with either absolute or relative paths. - Using relative paths can be useful when copying the project file and the associated files between different systems. - -
-
Ask for Name before Track Creation -A setting to control whether an automatic name is used when creating a new track or route, or whether you are asked to enter a name. -
-
Show Tooltip during Track Creation -A setting to control whether the tooltip with the cumulative track or route distance is shown when creating tracks and routes. -
-
The number of recent files - - The number of recent files shown in the FileOpen Recent File menu. - A value of -1 means all files. The new value applies to New Windows only (or on application restart). - -
Open files in selected layer -A setting to control whether non Viking format files (i.e. typically GPX or KML files) will open in the selected TrackWaypoint Layer. -When no TrackWaypoint Layer is selected (or the layer is invisibile) then the file will be open in the default manner: at the top level. - -
-
Show calendar day names -A setting to control whether the calendar displays day names (Mon, Tue, etc...) or not. - -
-
Ruler area label position -A setting to control the position of the label drawn on the viewport that shows the area value. Includes a setting to turn off the label. - -
-
Use Scroll to Zoom -A setting to control if scroll events cause the viewport to zoom (rather than moving). Useful with mouse scroll wheels, but less intuitive for touchpads. - -
-
Invert Scroll Direction -A setting to control the direction of scroll events. Especially useful with touchpads and can be used to override the desktop system's setting. - -
-
-
- -
OpenStreetMap Traces -
OAuth Method - - Using the OAuth method means that your OSM account details are no longer needed to be known by &appname;. - Instead specific tokens are generated for use only by &appname; which are associated with your OSM account. - -Get New OSM Access Tokens - Use this button to generate a new OSM Access Token Key and Secret. - You will be redirected to the OSM website to confirm allowing &appname; to access the GPX Traces features. - The tokens returned by the OSM website will be stored in the Access Token Key + Access Token Secret preferences. - -Access Token Key + Access Token Secret: -These are the values used, however one typically does not need to manually change them. -
-
HTTP Basic Authentication (Discouraged) -OSM Username + Password -Store your OSM details here, so that you don't need to enter it in every time in the procedure. -This is not recommended and one should use the OAuth method using access tokens described above. - - -Your OSM password will be stored in plain text. - - - - -This password is transferred unencrypted in every request sent to the OpenStreetMap server. This is due to the use of OpenStreetMap's basic authentication method. - - - - -When OAuth capability is built into &appname; (the default), use of HTTP Basic Authentication can only be used if the osm_basic_auth is enabled. - - -
-
- -
Mapnik - -If any changes to these settings are made, you will need to restart &appname; to make them be applied. - - -
Plugins Directory -The location of Mapnik plugins. An attempt is made to automatically determine the initial value, - however if this is wrong or Mapnik is upgraded then the directory can be set here. -
-
Fonts Directory - -The location of fonts for use with Mapnik. Normally it is best to simply use the System's font directory. - -
-
Recurse Fonts Directory -Load fonts in any sub-directories of the main font directory. -
-
Rerender Timeout -The time in hours before any tile is rerendered. -This is useful in case the underlying source data for the tiles changes (e.g. OSM data is continually evovling). - &appname; normally has no way of knowing when the data has changed, so this simple timeout method is provided to maintain consistency of the tile images. -
-
CartoCSS -This allows setting the specific location of the carto executable. -
-
Threads - - The number of threads to use for Mapnik rendering tasks. - By default the value is set to the 1 in case of any multi-threading rendering code chain crashes. - Otherwise trying setting the value to the number of the CPUs of the system minus one (so as not to overload the system), in order to minimise the overall rendering times. - -
-
- -
Routing -
Routing engine -You can select the routing engine used by default, ie by features that do not propose a live selection, like . -
-
- -
Startup -Naturally since these preferences effect the startup, the values will not be used until &appname; is restarted. -
Restore Window Setup -When this is enabled, the main window size and layout (such as whether the statusbar or layers panel are shown) is restored to the values from last use. -
-
Default Map Layer -When this is enabled, a map layer is automatically added whenever &appname; is opened and a &appname; file is not to be loaded. -The map layer used is defined by the map layer's default values. -
-
Startup Method -Enables selection of how the startup position should be determined. - - -Home Location (default) -Position as set by the Set the Default Location - - -Last Location -Uses the last position viewed on the viewport - - -Specified File -Load the file as specified below - - -Auto Location - - Uses the GeoClue service if available - or otherwise the web service hostip.info to attempt to determine your location via IP lookup - - - - -
-
Startup File -Loads this specified file when the Startup method is set to Specified File -
-
Check For New Version -Periodically (no more than once every 14 days), check to see if there is a new version of &appname; available. -
-
- -
Toolbar -
Append to Menu -Allows setting the toolbar on the same vertical space as the menu, thus increasing vertical space for the map. -
-
Icon Size -Allows configuration of the icon size, including overiding the system's default preference to the setting desired just for &appname;. -
-
Icon Style -Allows configuration of the icon style, including overiding the system's default preference to the setting desired just for &appname;. -
-
Customize -Opens the Customize Toolbar dialog. -From this dialog the items in the toolbar can be added, removed and reordered. Reordering of items is performed by drag and drop. -
-Customize Toolbar dialog - - - -
-
-
- -
- - -
Howto's -
Getting Started - -&appname; from version 1.5 has several features to ease the start up process. -On the very first run, you will be asked if you want to enable these features which make use of an Internet connection. -If you select no or you have upgraded from an earlier version you can choose to enable any of the startup options via the . - - -Some other general use cases for using &appname;, are as follows: - -
Go to an area of interest - -&appname;'s default location is a Manhatten, New York, USA, so you may need to pick another place that interests you - such as where you live. - - -Method A - - - Use the online location address/place search. - - - Use the Go to Location toolbar button or from the menus - ViewGo to Location. - You can change the search location provider if desired. - Enter the name of place you wish to go to (you may need to specify the country to refine the search). - Also you can enter a post code or a ZIP code instead. - - - You will need an internet connection for this search to work - - - - -Method B - - - If you know the coordinates of where you want to view: - - -Use View and select from either Go to Lat/Lon or Go to UTM and then enter in the specific coordinates. - - - - -Method C - -Use the GPS Layer or FileAcquireFrom GPS -to load data directly from your GPS into &appname;. - -You can specify the types of data to acquire: Tracks, Routes and/or Waypoints. - - -You must have write permission to the port used. For Unix like OS: - - /dev/ttyS0 is the first serial port - /dev/ttyUSB0 is the first USB port - usb: is any USB port - -Depending on your distribution only one of the USB port types may work -For Windows: - - com1: is the first serial port - usb: is any USB port - - - - The GPS devices supported are those supported by GPSBabel. - Garmin and Magellan GPS devices supported by all versions, later versions of GPSBabel support more devices such as DeLorme and Navilink. - - - - -Method D - - -Get data from files in GPX or KML format, which can be opened directly. -Use FileOpen - - -Other formats can be imported that are supported by GPSBabel. -FileAcquireImport File With GPSBabel... - - - -The viewport will be automatically moved and resized to view the contents of the file. - - - - -
-
Add a Map Layer - -Use LayersNew Map Layer, and choose a suitable cache directory -where you would like to store your tracks and click OK. Zoom to a -comfortable level (I suggest 4 mpp) by clicking the left and right -mouse buttons on the gray area where your tracks are. Now from the menu -choose the Tool. Click where you would like to download a -map. Regardless of what tool you are using, the middle mouse button -always pans. - - -You need an open internet connection when you are downloading maps. - - - -If you can no longer see your tracks or waypoints and only the map, -it is because the layer named Map is ABOVE your TrackWaypoint layer that your GPS data is in. -This means that it will be drawn last and on top of the other . -Look at the to the left which shows this order. -Select the Map layer from the list and click the down arrow button beneath the list until the Map layer is below the TrackWaypoint layer. -Your tracks will now be drawn over the map. - -
- -
Set Your Home Location - - You can save the current center position of the viewport as the default location AKA the Home Location by - EditSet the Default Location. - - - Then at any time you can return to this place by clicking on the Home icon on the toolbar. - - - You can also set the default location via specifing the exact latitude and longitude in the . - -
- -
-
From 1st startup to GPS track (including offline maps) - -The first you'll see is an empty map, because &appname; in its default configuration will download maps only on demand. -Before fetching unneeded data, one can position to a location of interest, e.g. Stuttgart: ViewGo to Location, enter Stuttgart. - -
Fetching the maps - -Map - - -LayersNew Map Layer -in the layer properties dialogue choose e.g. OpenStreetMap (Mapnik). - -For the moment, we keep the default Maps Directory (the directory in -which the maps will be stored and can be used for offline usage). - - -Check Autodownload maps and keep the zoom level as Use Viking -Zoom Level. - - -however, that these settings will play an important -role in the pre-fetch for offline usage discussed later - - - - -You'll see a map of Stuttgart. Using the mouse wheel, you can -zoom in and out. The maps for the choosen resolution will be downloaded -automatically. - - -DEM Layer (Height Map) - - -Zoom out to 512. -LayersNew DEM Layer -Keep the download source as is (SRTM Global 90m), hit OK. - - -In the layer listing on the left, the layer should reside -above the map layer. If this is not the case, highlight the DEM layer -an shift it one up (using the arrow up button). - - -highlight the DEM layer in the layer listing on the left -in the toolbar, check DEM layer download/import (the last symbol) -a left-click in the map window should then fetch the DEM data - - -This might take some time. - - -Sometimes, a tile does not show up correctly (you might see only a -black frame in the map window) because it got corrupted during -transfer. In order to correct this, you can delete the corresponding -datafile in the cache. right-click the DEM layer properties - - -The DEM Files listing allows you to delete the specific tiles (alternatively do this from the command line). - - -You can also alter the Min. and Max. elevation in this dialogue. - - -
-
GPS Track with Height Profile - -Uncheck the layer (the map is shown again) - - LayersNew TrackWaypoint Layer - Ensure the new track layer is above the map layer. - -Expand the layer, select Tracks -In the tools menu choose Create Track - -Leftclick in the map window, enter a name - - Click several times to generate a track (a right-click removes the last point). - Height data is set automatically since DEM data is available - -Expand tracks in the layer menu, your track should show up, select it -Right click your track, select Properties -Click the tab Elevation-distance - enjoy the plot - - -In order to save this setting for later usage - - -click OK in the Track Properties dialog -FileSave As, choose a name (you can open this view later via fileOpen). - - -
-
Usecase: offline data for holiday - -Suppose you want to have the and data offline for your holiday in Italy near Bologna. - - -Start a new &appname; session. -ViewGo to Location, enter Bologna -LayersNew Map Layer -Choose e.g. OpenStreetMap (mapnik). -adapt the maps directory e.g. to /home/user/.viking-map-holiday/. -This allows you to delete the map stuff after holiday without purging the rest of your maps. - -check autodownload map -keep viking zoom level -zoom out to 1024 -add a layer (as discussed above) -download the DEM data - -In the &app; version discussed here, the DEM data automatically -are stored in /home/user/.viking-maps/. You can move the corresponding -tiles into .viking-map-holiday/ if you like. - - -Download map data for all zoom levels - - -uncheck the DEM layer for the map to show up -navigate the map to be centered at Bologna -choose the zoom such, that all regions of interest are displayed in the map window (e.g. 1024) - -follow this sequence until you have all tiles for all zoom levels you need - -right-click the map layer properties -set the zoomlevel explicitely one below the last (in the first cycle 512), hit OK -right click the map layer Download Missing Onscreen Maps -wait until all tiles for that resolution have been downloaded - - - -This may take some time and some hard disk capacity. - -Do not forget to save your configuration (as discussed above). - - -
- -
-
OpenStreetMap project - -OpenStreetMap (OSM) is a collaborative project to create a free editable map of the world. -One of the sources of data for this project is GPS tracks. -&appname; supports this project via the GPS Traces methods, both uploading and downloading such data. - - - Authentication/authorization is required to use these services. See . - - -Also see for further detail. - -
Uploading data to OpenStreetMap - -It is possible to upload data directly from &appname; to OpenStreetMap. - - -Upload a layer - -One solution is to upload whole a layer. To do this, -simply select the layer and right click on it. Then, select Upload to -OSM. - - - -Upload a single track -Another solution is to upload an individual track. Simply select the track and right click on it. -Then select Upload to OSM. - - - -Fill in the form - -The filename is the name you want your upload has on the server. This information is displayed by the osm server. -The description is some descriptive information. -The tags field is a white space separated list of tags. - - -
- -
Downloading Traces from OpenStreetMap - -It is possible to download GPS traces directly from OpenStreetMap into &appname;. -This feature can be really useful for checking existing data before uploading new ones. - - -Download all visible tracks -One solution is to select - -File -Acquire -OSM traces... -. -Each request can get up to 5,000 points. -The dialog box allows setting which group of 5,000 points to get. These groups are known as Page Numbers which start at 0. -Increasing the page number parameter allows one to request the subsequent sets of point groups. - - -
-
Downloading Your Own Traces from OpenStreetMap - -It is possible to download any of your personal GPS traces previously uploaded to OpenStreetMap into &appname;. - - -Initially this will return the list of your OSM Traces, from which you can select which specific traces to retrieve. -This list can be sorted on each column so that it easier to find an individual trace or select a group of traces by similar properties. - -
- -
- -
Geotagging - - This assumes you already have a layer enabled for ease of use (if not see above to get one). - -
Manual Positioning - - This is useful for instances when you already know exactly where the image was taken (no need for tracklog). - Or maybe you want to adjust an automatically generated waypoint for the position of the subject of the image rather than the location that the photograph is taken from. - ATM this process only works on an individual image, so it will be tedious for handling lots of images. - - - First create a layer or use an existing one; and select it in the . - NB Make sure this layer is above the map layer in the Layers Panel list. - Create a new waypoint (or move an existing one) to exact location desired: - - Select the tool, then left click on the map at the location desired, choosing an image to associate with it in the new waypoint dialog - Select the tool, then left click on waypoint to be moved. Left click again and drag the waypoint to the location desired - - Then using the Select tool left click on waypoint to select it, then right click to access the Waypoint properties menu, then choose - Update Geotag on ImageUpdate - - - The Update Geotag on Image options are only available when a waypoint has an image associated with it. - -
- -
Automatic Positioning Against a Tracklog - - First you will need a tracklog with timestamps in it. Either load one from a previously saved file or freshly acquired from a GPS device - - see Getting Started. - It helps if this is the track that was recorded at the time you took some photographs! - - - Select the track either from the layers panel on the left or via the viewport using the tool. - Then right click on it and chose the Geotag Images... leading you to the Dialog. - - - Load some images that where taken around the time the track log was recorded. Confirm the other options in the dialog - normally the defaults should be alright and select OK. - If things are succesful, new waypoints with thumbnail images of the photographs will appear. - You should probably check they are really in the right place as often the timestamp of the camera may not be aligned to the GPS correctly leading to inferring incorrect locations. - -Option: Overwrite Waypoints - - This is particularly useful when one finds an attempt at geotagging gives wrong locations, often due to time offset issues. - Simply try again with a new time offset (often 1 hour adjustments due to Daylight Savings or Summer Time times) and the old waypoints will be updated (instead of creating new ones). - - - - If you have multiple tracks in a TrackWaypoint layer, then invoking the Geotag Images... action on the layer - will search all the tracks to find location matches. - -
-
- -
GPS Real Time Location - - &appname; relies on gpsd to provide the current location from a real time feed from a GPS device. - - - This assumes you already have a layer enabled for ease of use (if not see above to get one). - - - Turn on the GPS Device, ensure it has figured out it's location and plug it in to your computer. - -
Set Up GPS Layer - - You will need a layer. One can be added via LayersAdd GPS Layer. - - - Adjust the Realtime Tracking Mode settings to interface with gpsd as necessary. Normally the defaults should suffice. - - - Current Linux distributions should run gpsd automatically when a GPS Device is plugged in. Otherwise you may have to run gpsd manually. - - - Then right-click the layer and select Start Realtime Tracking. - Hopefully the viewport should jump to the GPS location. - - - Troubleshooting checklist: - -Confirm gpsd is running. -Confirm on the GPS device it has a location. -Confirm the Realtime Tracking Mode settings. -
-
- -
What to Do if &appname; Does Not Seem to Work - -In order to get some information about what &appname; is doing, start it in verbose debug mode via the command line: -viking -dV - - -NB For Windows the process is slightly more involved as the output is typically not shown in the command prompt, -so you have to redirect the output to a file, e.g. open the command prompt and then: - -cd "C:\Program Files\Viking" -viking -dV 2>1 > %TMP/viking.log - -Then close &appname; before viewing the output file, such as: -notepad %TMP/viking.log - - -For instance you can check the correct URLs &appname; is using in requesting remote data for DEMs or map tiles in the verbose debug output. -E.g. Something like this for DEMs: - -** (viking:28778): DEBUG: curl_download_uri: uri=http://dds.cr.usgs.gov/srtm/version2_1/SRTM3/Eurasia/N48E008.hgt.zip -* About to connect() to dds.cr.usgs.gov port 80 (#0) -* Trying 152.61.128.95... * connected -* Connected to dds.cr.usgs.gov (152.61.128.95) port 80 (#0) - GET /srtm/version2_1/SRTM3/Eurasia/N48E008.hgt.zip HTTP/1.1 -User-Agent: viking/0.9.8 libcurl/7.18.2 GnuTLS/2.4.2 zlib/1.2.3.3 libidn/1.8 -Host: dds.cr.usgs.gov -Accept: */* - HTTP/1.1 200 OK - Date: Sun, 26 Jul 2009 18:13:38 GMT - Server: Apache - Last-Modified: Tue, 21 Jul 2009 19:57:35 GMT - ETag: eac3f8-1828f5-46f3caa76070a - Accept-Ranges: bytes - Content-Length: 1583349 - Content-Type: application/zip - -* Connection #0 to host dds.cr.usgs.gov left intact -* Closing connection #0 -** (viking:28778): DEBUG: dem_layer_add_file: /home/username/.viking-maps/srtm3-Eurasia/N48E008.hgt.zip - -Or for OSM Mapnik tile server: - -* About to connect() to tile.openstreetmap.org port 80 (#0) -* Trying 193.63.75.28... * connected -* Connected to tile.openstreetmap.org (193.63.75.28) port 80 (#0) - GET /13/4065/2748.png HTTP/1.1 -User-Agent: viking/0.9.96 libcurl/7.20.1 GnuTLS/2.8.6 zlib/1.2.3.4 libidn/1.18 -Host: tile.openstreetmap.org -Accept: */* - -* HTTP 1.0, assume close after body - HTTP/1.0 200 OK - Date: Thu, 14 Oct 2010 22:18:42 GMT - Server: Apache/2.2.8 (Ubuntu) - ETag: "b66ff9d46474bab68262a3483428a232" -** (viking:16704): DEBUG: curl_get_etag_func: ETAG found: "b66ff9d46474bab68262a3483428a232" - Content-Length: 17194 - Cache-Control: max-age=94805 - Expires: Sat, 16 Oct 2010 00:38:47 GMT - Content-Type: image/png - Age: 5153 - X-Cache: HIT from konqi.openstreetmap.org - X-Cache-Lookup: HIT from konqi.openstreetmap.org:3128 - Via: 1.1 konqi.openstreetmap.org:3128 (squid/2.7.STABLE7) - Connection: close - -* Closing connection #0 -* About to connect() to a.andy.sandbox.cloudmade.com port 80 (#0) -* Trying 178.63.75.195... ** (viking:16704): DEBUG: curl_download_uri: uri=http://tile.openstreetmap.org/13/4065/2749.png -* About to connect() to tile.openstreetmap.org port 80 (#0) -* Trying 193.63.75.28... * connected -* Connected to a.andy.sandbox.cloudmade.com (178.63.75.195) port 80 (#0) - GET /tiles/cycle/13/4065/2747.png HTTP/1.1 -User-Agent: viking/0.9.96 libcurl/7.20.1 GnuTLS/2.8.6 zlib/1.2.3.4 libidn/1.18 -Host: a.andy.sandbox.cloudmade.com -Accept: */* - -* connected -* Connected to tile.openstreetmap.org (193.63.75.28) port 80 (#0) - GET /13/4065/2749.png HTTP/1.1 -User-Agent: viking/0.9.96 libcurl/7.20.1 GnuTLS/2.8.6 zlib/1.2.3.4 libidn/1.18 -Host: tile.openstreetmap.org -Accept: */* - -* HTTP 1.0, assume close after body - HTTP/1.0 200 OK - Date: Thu, 14 Oct 2010 23:44:35 GMT - Server: Apache/2.2.8 (Ubuntu) - ETag: "8e520ad47ce9c1b63430554886eb5fab" -** (viking:16704): DEBUG: curl_get_etag_func: ETAG found: "8e520ad47ce9c1b63430554886eb5fab" - Content-Length: 18094 - Cache-Control: max-age=87742 - Expires: Sat, 16 Oct 2010 00:06:57 GMT - Content-Type: image/png - X-Cache: MISS from konqi.openstreetmap.org - X-Cache-Lookup: MISS from konqi.openstreetmap.org:3128 - Via: 1.1 konqi.openstreetmap.org:3128 (squid/2.7.STABLE7) - Connection: close - - -
- -
- - -
- Extending Viking - - Currently, &app; has some extention points based on configuration files. The file format is heavily inspired by the GtkBuilder file format: you specify the class of the GObject to build and set its properties. Technically, it is a XML file containing a "objects" root element. Inside this element, you set a collection of "object". - Here is an example: - - - Property value - Property value - - ... - -]]> - - - You can find more examples in the documentation part of the distribution. - - It is also possible to override the internal defaults e.g. to update any parameters should they change over time, - by adding the values into your configuration file. - When you define object group that already exists (and for Maps this means by a repeated Id key, but you may have to examine the source code to work out what the relevant Id values are) then you need to define all the other keys as well, otherwise they will be reset to the defaults. - -
- Map Source - It is possible to add new map's sources. The file is ~/.viking/maps.xml for UNIX like systems, C:\Documents and Settings\username\.viking\maps.xml on Windows XP or C:\Users\username\.viking\maps.xml on Windows 7 onwards. - An example of the file is in the distribution doc/examples/maps.xml. Further examples and values are online in the Maps Wiki - - The VikSlippyMapSource allows to declare any map's source working like OpenStreetMap. It supports the following properties: - - - id - this is an integer and should be unique as it used to identify the map source - - - name - a string (should be unique) that is used for the OSM style cache directory name when the Map Cache directory is the default (~/.viking-maps) - - - label - the text displayed in the map's source selection dialog - - - hostname - the server's hostname (eg. "tile.openstreetmap.org") - - - url - - the parametrized address of the tile, in the spirit of C printf format, with 3 "%d" fields for Z, X and Y (in that order) (eg. "/%d/%d/%d.png") - - The full parametrized address can just be put in the URL field and the hostname field doesn't need specifying. - e.g. "https://tile.openstreetmap.org/%d/%d/%d.png" - - - - - zoom-min (optional) - The minimum zoom value supported by the tile server. The Default is 0 if not specified. - - - zoom-max (optional) - - The maximum zoom value supported by the tile server. The Default is 18 if not specified. - See Zoom Levels - - - - lat-min (optional) - The minimum latitude value in degrees supported by the tile server. The Default is -90 degrees if not specified. - - - lat-max (optional) - The maximum latitude value in degrees supported by the tile server. The Default is 90 degrees if not specified. - - - lon-min (optional) - The minimum longitude value in degrees supported by the tile server. The Default is -180 degrees if not specified. - - - lon-max (optional) - The maximum longitude value in degrees supported by the tile server. The Default is 180 degrees if not specified. - - - file-extension (optional) - - The file extension of the files on disk. The default is .png - If the tile source URL ends in something other than .png, then this parameter will need to match it. - This can also be useful in reading a tileset from other software which may name tiles in an alternative form, - e.g. for Mobile Atlas creator it names them .png.tile - The file types actually usable are those supported by GDK Pixbuf Library, which includes at least PNG and JPEG. - Remember to include the beginning '.' when specifying this parameter. - - - - use-direct-file-access (optional) - - Only use files on disk. The default is FALSE - This can also be useful for tilesets already on disk as it will avoid attempting to download any tiles. - Thus with this type the hostname and url parameters are not necessary and are ignored. - - - - switch-xy (optional) - - Swap the X,Y values around in the URL parametrized ordering. - The default is false. - - - - check-file-server-time (optional) - - Sends the timestamp of the tile to the server, so the server can decide whether it should send a new tile or not. - The default is false. - - - - use-etag (optional) - - Use and compare the ETag value in determining whether to download a newer tile. The default is false. - The ETag value is stored in a separate file in the same directory as the tile to enable checking the value across multiple runs of the program. - - - - tilesize-x (optional) - The tile x size. The default is 256 pixels if not specified. - - - tilesize-y (optional) - The tile y size. The default is 256 pixels if not specified. - - - scale (optional) - - The tile scale. The scale is 1 if not specified. - Use a value of 2 to represent high res tiles. - Don't change the tilesize as the internal display size is still based on 256 pixels. - - - - - - The VikTmsMapSource allows to declare any TMS service. It supports the following properties (as per VikSlippyMapSource above): - - - id - - - label - - - hostname - - - url - - - check-file-server-time (optional) - - - zoom-min (optional) - - - zoom-max (optional) - - - lat-min (optional) - - - lat-max (optional) - - - lon-min (optional) - - - lon-max (optional) - - - - The VikWmscMapSource allows to declare any WMS or WMS-C service. It supports the following properties (as per VikSlippyMapSource above): - - - id - - - label - - - hostname - - - url - - - check-file-server-time (optional) - - - zoom-min (optional) - - - zoom-max (optional) - - - lat-min (optional) - - - lat-max (optional) - - - lon-min (optional) - - - lon-max (optional) - - - -
- -
- Go-to search engines - It is possible to add new new search engines for the "Go-To" feature. The file is ~/.viking/goto_tools.xml. - An example of the file in the distribution doc/examples/goto_tools.xml. - Currently, there is a single object class available: VikGotoXmlTool. Such feature allows to declare any search engine using a XML format as result. - The related properties are: - - - label - the text displayed in the Go-To dialog - - - url-format - the parametrized address of the query, in the spirit of C printf format, with a single "%s" field (replaced by the query string) - - - lat-path - XML path of the latitude (eg. /root/parent/elem) - - - lat-attr (optional) - name of the attribute (of previous element) containing the latitude - - - lon-path - XML path of the longitude (eg. /root/parent/elem) - - - lon-attr (optional) - name of the attribute (of previous element) containing the longiude - - - - As a facility (or readability) it is possible to set both path and attribute name in a single property, like an XPath expression. To do so, simply set both info in lat-path (or lon-path) in the following format: /root/parent/elem@attribute. -
- -
- External tools - It is possible to add new external tools. The file is ~/.viking/external_tools.xml. - An example of the file in the distribution doc/examples/external_tools.xml. - The VikWebtoolCenter allows to declare any Webtool using a logic based on center coordinates and zoom level value. - The related properties are: - - - label - the text displayed in the menu entry - - - url - the parametrized URL to open, in the spirit of C printf format, with 2 "%s" and a "%d" fields for X, Y and Z (zoom level) (eg. "http://hostname/?lat=%s&lon=%s&zoom=%d") - - - - The VikWebtoolBounds allows to declare any Webtool using a logic based on bounds coordinates. - The related properties are: - - - label - the text displayed in the menu entry - - - url - the parametrized address of the tile, in the spirit of C printf format, with 4 "%s" fields for left, right, bottom and top (eg. "http://hostname:8111/load_and_zoom?left=%s&right=%s&bottom=%s&top=%s") - - - -
- -
- Routing engine - It is possible to declare new routing engines. The file is ~/.viking/routing.xml. - An example of the file in the distribution doc/examples/routing.xml. - The VikRoutingWebEngine allows to declare a routing engine available via HTTP. - The related properties are: - - - id - a string, should be unique as it used to identify the routing engine - - - label - the text displayed in the menu entry - - - format - - The GPSBabel format code to interpret the service response. By default a GPX response is expected and processed internally. However if the service returns different format then GPSBabel is used to transform the text into something that &appname; can understand. Only formats that GPSBabel supports can be used: e.g. 'gpx', 'kml', 'gtrnctr' (for Garmin Training Center .tcx files), etc... - Use gpsbabel --help on the command line to find out the supported file types and their codes to process them. - - - - url-base - the base URL of the web service (eg. "http://hostname/service?") - - - url-start-ll - the part of the URL setting the starting point location, parametrized in the spirit of C printf format, with 2 "%s" for coordinates (eg. "&start=%s,%s") - - - url-stop-ll - the part of the URL setting the end point location, parametrized in the spirit of C printf format, with 2 "%s" for coordinates (eg. "&stop=%s,%s") - - - url-via-ll (optional) - the part of the URL setting via point location, parametrized in the spirit of C printf format, with 2 "%s" for coordinates (eg. "&via=%s,%s") - - - url-start-dir (optional) - the part of the URL setting the starting point location for direction based routing, parametrized in the spirit of C printf format, with one "%s" for direction (eg. "&start=%s") - - - url-stop-dir (optional) - the part of the URL setting the end point location for direction based routing, parametrized in the spirit of C printf format, with one "%s" for direction (eg. "&start=%s") - - - url-ll-lat-first (optional) - The ordering of the lat/long terms in the Start, Stop and Via URL settings. By default this is TRUE. - For instance using Brouter services, the URL uses a pair of values which is longitude and then latitude. Thus setting this value to FALSE ensures the value substitution is performed in the necessary order. - - - referer (optional) - A URL to serve as referer for the HTTP request (eg. "http://hostname/") - - - follow-location (optional) - the max depth of recursive redirections - - - -
- -
- Remote File Datasources - It is possible to add web references expected to return a file which can then be opened directly or converted via GPSBabel. - The file is ~/.viking/datasources.xml. - An example of the file is in the source distribution doc/examples/datasources.xml. - The VikWebtoolDatasource allows to declare any URL using logic based on coordinates. - The related properties are: - - - label - the text displayed in the menu entry - - - url - - the parametrized URL to open in the spirit of C printf format, with up to 9 "%s" values. e.g. http://hostname/getfile?lat=%s&lon=%s - The order and meaning of these parameters is given by the url_format_code below - - - - url_format_code - - A string describing the parametrized URL substitution parameters, each character represents how to translate each term. - B = Bottom of the current view i.e. minimum latitude - L = Left of the current view i.e. minimum longitude - T = Top of the current view i.e. maximum latitude - R = Right of the current view i.e. maximum longitude - A = center lAtitude of the current view - O = center lOngitude of the current view - Z = OSM Zoom value of the current view. See Zoom Levels - P = selected Point's latitude - N = selected poiNt's longitude - S = A user specified input string requested from the user via a dialog box - Thus for the url example above then the format code should be AO - - - - file_type - - This value is passed on for the -i parameter in interfacing with GPSBabel. - If it is not defined then the returned file is interpreted internally as a GPX file. - Possible values such as 'kml', 'mapsource' etc.. can be used. See GPSBabel File Formats for the full list. - - - - babel_filter_args - - This value is passed on for the filter arguments interfacing with GPSBabel. - E.g. "-x nuketypes,routes" can be used to filter all routes from the results. - - - - input_label - - This value is used when requesting input from the user. - It is the label of the text input box. - - - - -
- -
- System Extension File Locations - Note that, on UNIX like systems, the extension files (&extfiles;) are also searched in /etc/viking and /usr/share/viking directories (or related in your system). - The XDG_DATA_DIRS environment variable can be used to change these directories. - The XDG_DATA_HOME environment variable is also used (if set) to look for these extension files. -
- - -
- Miscellaneous Settings - Various individual values are automatically saved between &app; sessions in the ~/.viking/viking.ini file. - This file is not intended to be manually edited, but since it is a plain text file it can be changed if desired. - Some values in this file are read only, in the sense that there is no way to set it other than by manually entering in the keys and values (the key will not exist in the file otherwise). This allows some fine tuning of &app; behaviours, without resorting to recompiling the code. However is it not expected that these values should need to be changed for a normal user, hence no GUI options for these have been provided. - Here is the list of the read only keys and their default values. - - - curl_cainfo=NULL - See CURLOPT_CAINFO - - - curl_ssl_verifypeer=1 - See CURLOPT_SSL_VERIFYPEER - On Windows this is defaulted to 0 to get HTTPS connections to at least work, - otherwise any attempts at verifying always fail. - [Some incompatibily is suspected in the reliant binary DLLs] - - - geoclue_accuracy_level=4 - Set the integer value for the accuracy level request to the GeoClue service. Values to match the GClueAccuracyLevel: - - 0 = GCLUE_ACCURACY_LEVEL_NONE - 1 = GCLUE_ACCURACY_LEVEL_COUNTRY - 4 = GCLUE_ACCURACY_LEVEL_CITY - 5 = GCLUE_ACCURACY_LEVEL_NEIGHBORHOOD - 6 = GCLUE_ACCURACY_LEVEL_STREET - 8 = GCLUE_ACCURACY_LEVEL_EXACT - - - - gpx_tidy_points=true - ATM Only attempts to remove a suspicious first point of a GPX track - (as opposed to any points within a track). - - - gpx_tidy_points_max_speed=340 - Over this speed (in metres per second) for the first pair of points - the first point is removed. - - - layers_create_trw_auto_default=false - Create new TrackWaypoint layers without showing the layer properties dialog first. - - - layers_panel_calendar_markup_mode=3 - 0=No markups. 1=Day marked. 2=Day marked and tooltips created. 3=Auto (timed tooltip creation, so if too slow it reverts to 1) - - - maps_max_tiles=1000 - - - maps_min_shrinkfactor=0.0312499 - - - maps_max_shrinkfactor=8.0000001 - - - maps_real_min_shrinkfactor=0.0039062499 - - - maps_scale_inc_down=4 - - - maps_scale_inc_up=2 - - - maps_scale_smaller_zoom_first=true - - - srtm_http_base_url=https://dds.cr.usgs.gov/srtm/version2_1/SRTM3 - Allows using an alternative service for acquiring DEM SRTM files. - Note that the layout on the server needs to be split into Continent directories. - - - mapnik_buffer_size=128 (in pixels) - - - osm_basic_auth=false - Set to true to force the use of HTTP Basic Authenication even when OAuth is available - - - background_max_threads=10 - - - background_max_threads_local=Number of CPUs - - - window_default_tool=Pan - Options are: Pan, Zoom, Ruler or Select - - - window_menubar=true - - - window_copy_centre_full_format=false - - - version_check_period_days=14 - - - trackwaypoint_start_end_distance_diff=100.0 - - - gps_statusbar_format=GSA - This string is in the Message Format Code - - - geoclue_statusbar_format=SA - This string is in the Message Format Code - - - trkpt_selected_statusbar_format=KEATDN - This string is in the Message Format Code - - - utils_nearest_tz_factor=1.0 - - - viewport_history_size=20 - - - viewport_history_diff_dist=500 - In metres. - - Go Back or Go Forward requests over this range from the last history location will move back to that position. - If within this range it will skip over this location and move on to the next saved history location. - - - - viewport_scale=1 - - If Viking doesn't automatically detect a high resolution display, you can force the setting here - typically by setting this to 2. - - - - external_diary_program=rednotebook - Or in Windows it uses C:/Progra~1/Rednotebook/rednotebook.exe - This string value must use Unix separators and not have spaces. - - - external_astro_program=stellarium - Or in Windows use C:/Progra~1/Stellarium/stellarium.exe - This string value must use Unix separators and not have spaces. - Needs to be version 0.15.0 or greater (otherwise due to this Bug means this does not actually work). - - - external_text_program=gedit - Or in Windows it uses notepad - This string value must use Unix separators and not have spaces. - - - bfilter_simplify=100 - - - bfilter_compress=0.001 - - - list_date_format=%Y-%m-%d %H:%M - A date format description as passed on to strftime(). - Note that when displayed in tables sorting by this column simply uses the text value, rather than the underlying date/time value. - - - - export_device_path=OS Specific - UNIX = "/media/user/GARMIN/Garmin/GPX" - WINDOWS = ":/Garmin/GPX" - - - export_device_trackpoint_limit=10000 (Typical Garmin Edge limit) - Older Garmins limits are typically much lower - Etrex 20/30 is 500 - - - export_device_routepoint_limit=250 - - - kmz_default_maps_dir=Empty - You may want to use something like: "/media/user/GARMIN/Garmin/CustomMaps" - - - -
- Message Format Code - Currently for ease of implementation the message format code is a string of characters. - Each character represents what should be inserted in relation to a Trackpoint. - One day it might evolve into something more user friendly with a frontend to control it, perhaps allowing arbitary text too. However for now at least some control is offered :) - - - - Character Code - - G = Some text to display at the start of the message - GPSD - K = Some text to display at the start of the message - Trkpt - A = Altitude of a Trackpoint - S = Speed of a Trackpoint - B = Vertical Speed (Climb) - C = Course of a Trackpoint - L = Location of a Trackpoint - T = Time of a Trackpoint - M = Time diff of a Trackpoint from the previous trackpoint - X = Number of satellites used in the trackpoint fix - D = Distance of the trackpoint from the start of a track (following along the track) - F = Distance of the trackpoint from the finish (end) of a track (following along the track) - P = Distance difference of the trackpoint from the previous trackpoint - N = Name of track to which the trackpoint belongs - E = Name of the trackpoint - - - - Output Notes - - If the output has * after it, then the value has been calculated via interpolation (such as speed when the Trackpoint does not contain a speed value). - If the output has ** after it, then difficulties were encountered in trying to work out the value so probably a default of 0 will be shown. - - - - -
- -
- -
- Keyboard Shortcuts (Accelerator) Settings - This is held in the file ~/.viking/keys.rc - It is in the standard GTK Accelerator map format. Values are automatically read in and saved between &app; sessions. - This file is not intended to be manually edited, but since it is a plain text file it can be changed if desired. -
- -
- - - - - - - - -
diff --git a/help/Makefile.am b/help/Makefile.am index 9ef4869..f263aeb 100644 --- a/help/Makefile.am +++ b/help/Makefile.am @@ -1,27 +1,22 @@ -if GEN_MANPAGES -include $(top_srcdir)/gnome-doc-utils.make -endif +@YELP_HELP_RULES@ # Annoyingly in the XML, yelp refuses to load relative images fileref, i.e. ../../src/icons/file.png # whereas the PDF generation inserts these references OK # Nevertheless we need to copy the images into figures/ so they are available for the distribution installed help -# Most tool icons are _18, except the pan one which is _22 just to be annoying -get-icons: - -cp -f ../src/icons/*_[12][0-9].png C/figures/ +C/figures/%.png: + -cp -f ../src/icons/$(notdir $@) C/figures/ # '-' ^^^^^ means it doesn't care about the exit status # this copy statement is not critical (especially when run under make distcheck) -dist-hook: get-icons doc-dist-hook - -DOC_MODULE = viking -DOC_ENTITIES = legal.xml \ +HELP_ID = viking +HELP_FILES = index.docbook +HELP_EXTRA = legal.xml \ attribution.xml \ commandline.xml \ georef_layer.xml \ mapnik_rendering_layer.xml \ recommends.xml -DOC_INCLUDES = -DOC_FIGURES = \ +HELP_MEDIA = \ figures/Aggregate_statistics.png \ figures/Aggregate_statistics_years.png \ figures/addtr_18.png \ @@ -57,20 +52,17 @@ DOC_FIGURES = \ figures/Viking-TAC.png \ figures/DEM_file_info_dialog.png \ figures/customize_toolbar_dialog.png -DOC_LINGUAS = +HELP_LINGUAS = EXTRA_DIST = viking.xml.in CLEANFILES= # man pages processing -if GEN_MANPAGES MANPAGES=viking.1 man_MANS = $(MANPAGES) CLEANFILES+=$(MANPAGES) -endif -DB2MAN=@DB2MAN_XSL@ -XP=@XP@ -''-nonet +XSLTPROC=@XSLTPROC@ -''-nonet %.1: %.xml - $(XP) -o $@ $(DB2MAN) $< + $(XSLTPROC) -o $@ http://docbook.sourceforge.net/release/xsl/current/manpages/docbook.xsl $< diff --git a/help/viking.omf.in b/help/viking.omf.in deleted file mode 100644 index 745d1e5..0000000 --- a/help/viking.omf.in +++ /dev/null @@ -1,10 +0,0 @@ - - - - - manual - - - - - diff --git a/src/Makefile.am b/src/Makefile.am index 3752897..78bda6b 100644 --- a/src/Makefile.am +++ b/src/Makefile.am @@ -16,16 +16,8 @@ authors.h: $(top_srcdir)/AUTHORS sed -e "s/ \*\*.*//" -e 's/^/"/' -e 's/$$/",\\/' -e '$$s/\\$$//' $< >> $@ echo "NULL};" >> $@ -if HAVE_XSLTPROC -documenters.h: $(top_srcdir)/help/C/viking.xml - $(XP) $(srcdir)/docbook2documenters.xsl $(top_srcdir)/help/C/viking.xml > $@ -else -documenters.h: - rm -f $@ - echo "/* Generated file. */" >> $@ - echo "const gchar *DOCUMENTERS[] = {\\" >> $@ - echo "NULL};" >> $@ -endif +documenters.h: $(top_srcdir)/help/C/index.docbook + $(XSLTPROC) $(srcdir)/docbook2documenters.xsl $(top_srcdir)/help/C/index.docbook > $@ BUILT_SOURCES = authors.h documenters.h diff --git a/src/vikwindow.c b/src/vikwindow.c index 307dfd9..320df61 100644 --- a/src/vikwindow.c +++ b/src/vikwindow.c @@ -2864,7 +2864,7 @@ static void help_help_cb ( GtkAction *a, VikWindow *vw ) ShellExecute(NULL, "open", ""PACKAGE".pdf", NULL, NULL, SW_SHOWNORMAL); #else /* WINDOWS */ gchar *uri; - uri = g_strdup_printf("ghelp:%s", PACKAGE); + uri = g_strdup_printf("help:%s", PACKAGE); GError *error = NULL; gboolean show = gtk_show_uri (NULL, uri, GDK_CURRENT_TIME, &error); if ( !show && !error ) -- cgit v1.2.3 From d7d0dfc22d9a19c394aaa56f706c28bf51e1ec7f Mon Sep 17 00:00:00 2001 From: Paul Gevers Date: Thu, 2 Jul 2020 17:30:19 +0200 Subject: upstream git contains the geoclue_layer.xml, but the tar ball does not. xmllint trips on this. =================================================================== Gbp-Pq: Name geocluelayer.xml_not_included.patch --- help/C/index.docbook | 2 -- 1 file changed, 2 deletions(-) diff --git a/help/C/index.docbook b/help/C/index.docbook index d7e8bd3..aade818 100644 --- a/help/C/index.docbook +++ b/help/C/index.docbook @@ -2263,8 +2263,6 @@ This clears the Tracks Area Coverage information, thus no grid colouring will be - -
Coordinate Layer -- cgit v1.2.3 From 12c7cac58b8c76cf23ff69223b8b28c94a0acb10 Mon Sep 17 00:00:00 2001 From: Bernd Zeimetz Date: Sat, 16 Oct 2010 18:57:01 +0200 Subject: [PATCH] disable-po-check Gbp-Pq: Name 0001-disable-po-check.patch --- po/Makefile.in.in | 8 ++------ 1 file changed, 2 insertions(+), 6 deletions(-) diff --git a/po/Makefile.in.in b/po/Makefile.in.in index fcd2c3b..9a494ad 100644 --- a/po/Makefile.in.in +++ b/po/Makefile.in.in @@ -145,12 +145,8 @@ uninstall: rm -f $(DESTDIR)$(localedir)/$$lang/LC_MESSAGES/$(GETTEXT_PACKAGE).mo.m; \ done -check: all $(GETTEXT_PACKAGE).pot - rm -f missing notexist - srcdir=$(srcdir) $(INTLTOOL_UPDATE) -m - if [ -r missing -o -r notexist ]; then \ - exit 1; \ - fi +check: + # do nothing as it messes up with quilt's .pc folder. mostlyclean: rm -f *.pox $(GETTEXT_PACKAGE).pot *.old.po cat-id-tbl.tmp -- cgit v1.2.3 From ba34c48a943624acaeafb4f28e48484eaf4c85a0 Mon Sep 17 00:00:00 2001 From: Bernd Zeimetz Date: Sat, 19 Nov 2016 00:15:50 +0100 Subject: fix build on hurd Gbp-Pq: Name fix_build_on_hurd --- src/metatile.h | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/src/metatile.h b/src/metatile.h index 0206133..50d5b0c 100644 --- a/src/metatile.h +++ b/src/metatile.h @@ -26,3 +26,7 @@ int xyz_to_meta(char *path, size_t len, const char *dir, int x, int y, int z); int metatile_read(const char *dir, int x, int y, int z, char *buf, size_t sz, int * compressed, char * log_msg); + +#ifndef PATH_MAX +#define PATH_MAX 4096 +#endif -- cgit v1.2.3 From 2d095a3b82e0458880421f0d36f9f3c9c07eeb20 Mon Sep 17 00:00:00 2001 From: Bernd Zeimetz Date: Sun, 5 Jul 2020 21:39:15 +0200 Subject: no-doc-dir Gbp-Pq: Name no-doc-dir --- Makefile.am | 2 +- configure.ac | 11 +---------- 2 files changed, 2 insertions(+), 11 deletions(-) diff --git a/Makefile.am b/Makefile.am index e59a6b3..4d283ec 100644 --- a/Makefile.am +++ b/Makefile.am @@ -1,4 +1,4 @@ -SUBDIRS = src test data po windows help tools doc +SUBDIRS = src test data po windows help tools INTLTOOL = \ intltool-extract.in \ diff --git a/configure.ac b/configure.ac index 94b7bff..264b5ea 100644 --- a/configure.ac +++ b/configure.ac @@ -11,13 +11,6 @@ AM_INIT_AUTOMAKE([dist-bzip2 dist-zip subdir-objects]) dnl AC_CONFIG_SRCDIR([src/main.c]) AC_CONFIG_HEADERS([src/config.h]) -# check for gtk-doc -m4_ifdef([GTK_DOC_CHECK], [ -GTK_DOC_CHECK([1.0],[--flavour no-tmpl]) -],[ -AM_CONDITIONAL([ENABLE_GTK_DOC], false) -]) - AC_PROG_CC AC_PROG_CC_STDC # Checks for programs. @@ -594,9 +587,7 @@ AC_CONFIG_FILES([ windows/installer/Makefile windows/installer/pixmaps/Makefile windows/installer/translations/Makefile - doc/Makefile - doc/reference/Makefile - doc/examples/Makefile]) + ]) AC_OUTPUT -- cgit v1.2.3 From fd1e6cefec274baf9192a9e0127b458be0820606 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Ball=C3=B3=20Gy=C3=B6rgy?= Date: Wed, 11 Mar 2020 21:57:58 +0100 Subject: [PATCH] Port to yelp-tools This removes the usage of deprecated gnome-doc-utils. Gbp-Pq: Name 18d7c02d5829ec796efaa6b0fba0632f478048ba.patch --- Makefile.am | 7 - README.md | 6 +- configure.ac | 21 +- help/C/index.docbook | 4151 ++++++++++++++++++++++++++++++++++++++++++++++++++ help/C/legal.xml | 2 +- help/C/viking.xml | 4151 -------------------------------------------------- help/Makefile.am | 28 +- help/viking.omf.in | 10 - src/Makefile.am | 12 +- src/vikwindow.c | 2 +- 10 files changed, 4168 insertions(+), 4222 deletions(-) create mode 100644 help/C/index.docbook delete mode 100644 help/C/viking.xml delete mode 100644 help/viking.omf.in diff --git a/Makefile.am b/Makefile.am index 4d283ec..3ba1376 100644 --- a/Makefile.am +++ b/Makefile.am @@ -12,7 +12,6 @@ full: EXTRA_DIST = \ README.md \ HACKING \ - gnome-doc-utils.make \ ChangeLog.0 \ viking.spec \ mingw-viking.spec \ @@ -29,9 +28,6 @@ generate-changelog: dist-hook: viking.spec generate-changelog cp $(top_builddir)/viking.spec $(distdir) -MAINTAINERCLEANFILES = \ - gnome-doc-utils.make - DISTCLEANFILES = \ intltool-extract \ intltool-merge \ @@ -39,8 +35,5 @@ DISTCLEANFILES = \ ACLOCAL_AMFLAGS = -I m4 -DISTCHECK_CONFIGURE_FLAGS = \ - --disable-scrollkeeper - # Ignore gtk theme cache files on distcheck distuninstallcheck_listfiles = find . -type f -print | grep -v 'icon-theme.cache' diff --git a/README.md b/README.md index 7eb70cc..d71f4c1 100644 --- a/README.md +++ b/README.md @@ -27,7 +27,7 @@ Git repository: On Debian Sid, following packages must be installed before building: - # sudo apt install gtk-doc-tools gnome-doc-utils libpng-dev libgtk-3-dev libicu-dev + # sudo apt install gtk-doc-tools docbook-xsl libpng-dev libgtk-3-dev libicu-dev The following packages are needed (they are included by default in Debian Sid, but not in other distributions). They must be installed too: @@ -37,10 +37,6 @@ The following packages are also used, but they can each be disabled with configu $ sudo apt-get install libsqlite3-dev nettle-dev libmapnik-dev libgeoclue-2-dev libgexiv2-dev libgps-dev libmagic-dev libbz2-dev libzip-dev liboauth-dev -Further packages are required if you want to generate man and help page documentation: - - $ sudo apt-get install docbook-xsl rarian-compat - ### Actual Build If you downloaded Viking from Git, you have to: diff --git a/configure.ac b/configure.ac index 264b5ea..9615f53 100644 --- a/configure.ac +++ b/configure.ac @@ -104,7 +104,7 @@ AC_SUBST(PACKAGE_LIBS) dnl ------------- dnl | User Manual |--------------------------------------- dnl ------------- -GNOME_DOC_INIT +YELP_HELP_INIT dnl --------------------------------------------------------------------------- dnl - Use deprecated options (default enabled for devs, disabled in releases) @@ -546,23 +546,7 @@ AC_DEFINE_UNQUOTED(VIK_CONFIG_DEFAULT_TILE_AGE, ${VIK_CONFIG_DEFAULT_TILE_AGE}, AC_DEFINE(HAVE_VIKING, 1, [Enable Viking specifics in otherwise reusable code]) dnl man pages processing -dnl Different distributions have differing locations for the docbook.xsl -dnl Debian like -if test -r /usr/share/xml/docbook/stylesheet/docbook-xsl/manpages/docbook.xsl; then - DB2MAN_XSL=/usr/share/xml/docbook/stylesheet/docbook-xsl/manpages/docbook.xsl -dnl RedHat like -elif test -r /usr/share/sgml/docbook/xsl-stylesheets/manpages/docbook.xsl; then - DB2MAN_XSL=/usr/share/sgml/docbook/xsl-stylesheets/manpages/docbook.xsl -else -dnl Old default - DB2MAN_XSL=/usr/share/sgml/docbook/stylesheet/xsl/nwalsh/manpages/docbook.xsl -fi -AC_SUBST(DB2MAN_XSL) -AC_PATH_PROG(XP,xsltproc) -AM_CONDITIONAL([HAVE_XSLTPROC],[test "x$XP" != "x"]) -AC_CHECK_PROG([HAVE_SCROLLKEEPER],scrollkeeper-config,"yes") -AM_CONDITIONAL([GEN_MANPAGES],[test "x$XP" != "x" && test -r "$DB2MAN_XSL"] && test "${HAVE_SCROLLKEEPER}" = "yes" ) -AM_COND_IF([GEN_MANPAGES], [ac_cv_enable_man=yes], [ac_cv_enable_man=no]) +AC_PATH_PROG(XSLTPROC,xsltproc) ISODATE="$(date --utc --date="@${SOURCE_DATE_EPOCH:-$(date +%s)}" +%Y-%m-%d)" AC_SUBST(ISODATE) @@ -618,7 +602,6 @@ OAuth : $ac_cv_enable_oauth Size of map cache (in memory) : ${VIK_CONFIG_MAPCACHE_SIZE} Age of tiles (in seconds) : ${VIK_CONFIG_DEFAULT_TILE_AGE} GeoNames user : ${VIK_CONFIG_GEONAMES_USERNAME} -Man page generation : $ac_cv_enable_man Documentation (+HTML) : ${enable_gtk_doc} (HTML: ${enable_gtk_doc_html}) ------------------------------------------- diff --git a/help/C/index.docbook b/help/C/index.docbook new file mode 100644 index 0000000..d7e8bd3 --- /dev/null +++ b/help/C/index.docbook @@ -0,0 +1,4151 @@ + + + Viking"> + + + + maps.xml, goto_tools.xml, datasources.xml, external_tools.xml, routing.xml"> +]> + + +
+ + &app; Manual + + &app; is a free/open source program to manage GPS data. + + + + 2013 + Guilhem Bonnefille + Rob Norris + + + + + GNOME Documentation Project + + + + + + + + Guilhem + Bonnefille + + + Rob + Norris + + + + username: + Alexxy + + + username: + Vikingis + + + username: + Tallguy + + + username: + EliotB + + + Alex + Foobarian + + + + + + + &appname; Manual V&manrevision; + &date; + + Guilhem Bonnefille guilhem.bonnefille@gmail.com + Rob Norris rw_norris@hotmail.com + GNOME Documentation Project + This document was generated on . + + + + + This manual describes version &appversion; of &appname;. + + + Feedback + To report a bug or make a suggestion regarding the &app; application or + this manual, follow the directions in the + Feedback section of the GNOME User Guide. + + + + + + &app; + + +
+ Introduction + +&appname; aims to be easy to use, yet powerful in accomplishing a wide +variety of tasks. Some of the things you can use &appname; for are: + + + +Uploading and downloading waypoints, tracks and routes to/from GPS. + + + +Preparing tracks, routes and waypoints for trips using maps from services such as OpenStreetMap (OSM). +The data is only needed to be uploaded to your GPS before you leave. +The maps together with your tracks, routes and waypoints can also be printed and used during the trip. + + + + +After trips, tracks and waypoints from GPS can be downloaded, stored, managed and reused in your (or your friends') later trips. + + + + +Analyzing Off Highway Vehicle (OHV) and hiking trips, understanding where you went and how far you were from something. + + + +Making waypoints, tracks and routes to follow to easily get someplace +you've never been before or don't have GPS data for but online +maps exist for it. + + + + +Making maps with using Mapnik. +Not on Windows at the moment. + + + + +Grouping data from multiple trips using a hierarchical data manager. + + + + +Analyzing speed at different places (to some degree), adding waypoints where you forgot to mark one but did slow down or stop. + + + + +Downloading and storing OpenStreetMap and/or other map types on your hard drive and looking at them later. + + + + +Editing routes or tracks and their trackpoints, joining and splitting up tracks and routes. + + + + +Show the live GPS position on the map (for use on a mobile device - e.g. a laptop). Not Windows at the moment. + + + + +Import and export track, route and waypoint files of various types via GPSBabel + + + +Previously on Windows, GPSBabel was distributed with &appname;, but this no longer the case. + + +It can be downloaded from its website . + + + + + +View, create and update Geotagged Images (using EXIF data). + + + + + +&appname; is under continual improvement: see the the Roadmap / Wishlist: + + +
+Screenshot: OSM Cycle Map and Many Tracks + + + +
+ + + The Windows build of Viking does not currently support verification of https connections. + + +
+ +
General Concepts +
Layers + +Layers is concept one may know from powerful graphics editors such as Photoshop or GIMP. +Instead of putting all the data on the same level, it is stacked (i.e. layered) with different data over one another. +This can be useful for analysis and general handling of various sets of data. + + +Unfortunately the downside of this complexity is remembering how differing layers of data can obscure other data. + + +The Map layers have Alpha Compositing, +to create the appearance of partial transparency. +By controlling this value one can see data below it in the layer heirarchy for interesting effects. + +
+
Layers Panel + +The panel on the left is called the layers panel. +It determines which layers and sublayers (such as tracks and waypoints) +are shown, and the order in which they are drawn. Layers on the +top of the layers panel list are drawn last. You can change the order by +drag and drop, or by selecting a layer and using the up and down +buttons at the bottom of the layers panel. + + + The panel also contains a calendar to show when Layers occurred. + Double clicking on the day will select and move the viewport display to that layer. + Right clicking brings up a menu from which you can select to go to the previous or next layer in time. + +
+
Viewport + +The main &appname; area where the layer data is drawn, is called the viewport. + +
+
Track Graphs + +Below the viewport can be shown track (and route) elevation/distance and time/speed (tracks only) graphs of the selected item. +These are the same graphs as shown in . +The graphs will automatically hide itself when nothing or no suitable item is selected. + + +Moving the mouse pointer over the graphs will show a tooltip readout of the nearest trackpoint. +Similarily to the track properties graphs, left clicking will center the viewport on the trackpoint. +A right click menu offers controls of the drawing options, a subset of track operations and access to further information dialogs. + +
+
Statusbar +This provides a readout of various information: + +The currently selected (mouse pointer) tool +The number of items to process in the background - normally this the number in the map tile download queue +The zoom factor +The location of the mouse pointer (and potentially height information if DEM data is available) + +When creating a track/route, the statusbar also displays some information about the track/route. +
+Statusbar + + + +
+This part of the statusbar displays: + +The total distance of the track/route (including currently edited segment). +The bearing of the currently edited segment. +The distance of the currently edited segment. + + +For convenience, a zoom selector can be opened from the status bar. Simply left-click on the zoom factor. +
+ The zoom selector available from status bar + + + +
+
+ +
Toolbar +The toolbar is an area for buttons that perform common actions. +Some actions are modal, so the appropriate layer needs selected before these toolbar buttons are enabled. See more detail. +The display of the toolbar is influenced by the +Right clicking on the toolbar and selecting Customize allows jumping to the directly. +
+ +
Projections + +&appname; supports differents projections: + + +UTM + + +LatLon (also called EPSG:4326) + + +Mercator (also called Spherical Mercator) + + + +
+ +
Map Cache + +&appname; stores downloaded map tiles to disk for a couple of reasons: + + +Enables off line usage +Reduces loading on the map tile provider + + +The &appname; automatic caching strategy is two fold: + + + + + If the age of the tile on disk is less than the specified tile age (see ), + it will not attempt to contact the server to get a new version of the tile. + + + + + When the tile age has expired &appname; will attempt a refresh update, so that it provides the cached tile generation timestamp so the server can determine if a new tile image needs to be returned. Not all map types support this refresh method. + + + + + You can override the caching scheme by using right-click on the Map on the layers panel and selecting Redownload All Onscreen Maps, or Ctrl+F5 for the top most map displayed. This will get the latest version held by the server. + + + + This can be useful if you contribute to OpenStreetMap and wish to see your modifications (of course give time for the server to have processed your changes - see I have made edits but they don't show up on the map) + + + + +The layout of the cache on disk itself can be controlled via a per Map Layer property. + +Viking - Legacy default in a private cache layout scheme +OSM - Newer available default (1.6+) + +This is to increase the compatibility between &appname; and similar applications that cache tiles on disk so that the tiles can be shared. + + + + + +
+ +
Shortcut Keys + +&appname; has several shortcut keys or key combinations for commands as listed in the main window along side the command. + + +By default some function keys follow standard GUI behaviour: + + +F1 Help (view this manual) +F5 or Ctrl+R Refresh the maps on screen +F10 Select the Menubar (in built behaviour) +F11 Full Screen +Ctrl+F5 or Ctrl+Shift+R Redownload the maps on screen + + + +Refresh attempts to get new maps only if the local tile cache time period has expired for any particular map tile. +Redownload gets all on screen maps from the server, ignoring the local tile cache. + + + +Other function keys control turn on/off visibility of various elements: + + +F3 Toggle visibility of the Toolbar +F4 Toggle visibility of the Menubar +Shift+F5 Toggle visibility of the Scale indicator on the viewport +F6 Toggle visibility of the Center Crosshairs on the viewport +F7 Toggle showing selected items (e.g. tracks or waypoints) in the highlight colour in the viewport +Shift+F8 Toggle visibility of the calendar +Shift+F9 Toggle visibility of the Layers Panel buttons +F9 Toggle visibility of the Layers Panel +F12 Toggle visibility of the Statusbar +Shift+F12 Toggle visibility of the Track Graphs + + +Standard shortcuts are provided for normal GUI operations: such as creating new files, opening, saving and exitting. +Then there are shortcuts specific to &appname; to switch projection modes, zoom in/out, create layers,switch the active tool mode and move the map: + +Ctrl+Up Pan the viewport North +Ctrl+Right Pan the viewport East +Ctrl+Down Pan the viewport South +Ctrl+Left Pan the viewport West +Ctrl+Keypad+ Zoom In +Ctrl+Keypad- Zoom Out + +These work irrespective of the mode selected +For other combinations see the menu entry themselves. + +
+ +
+Keyboard Configuration +Keyboard configuration is supported by the standard GTK+ way of changing shortcuts for menu entries. +Hover over the menu option with the mouse pointer and press the keyboard shortcut you want to bind it to. +To delete a keyboard assignment, press Backspace whilst over the menu entry. + + + If the keyboard shortcut is already in use you will not receive any notification that new action replaces the old action. + This is probably why most distributions have this facility disabled by default. + Thus you will need to enable Editable menu accelerators for your system. + Check the Desktop Menu and Toolbar Control or other User Interface preferences for this setting. + + + + + For Windows systems this can be done by adding the line gtk-can-change-accels=1 to %USERPROFILE%\.gtkrc-2.0 (create the file if it does not exist). + + +From &app; 1.6+ the keyboard configuration is automatically loaded and saved between sessions in the +
+ +
Tracks vs Routes + +In theory a route is path you are planning to follow and a track is of where you have actually been. The GPX specification splits these into two separate categories, although tracks contain everything route may have. + + +Q. When planning a route what difference does it make if it's a route or a track? + + +A. One difference is in how a GPS device navigates following the route or track. +The capability, the options and data on a particular device also effect how the navigation is performed. +Often the how a device actually works doesn't seem to be formally documented by the manufacturer (and can be firmware dependent too). +Web searches can reveal people's experiences with specific devices on blogs and various forums. +For some devices it will attempt to navigate between route points, which may then suggest various roads and tracks between the points using an internal routing algorithm with some kind of transport profile. +However this is limited to the quality of data available and how well the profile matches ones actual need. +If the points are close enough then the 'best' route for any form of transport will typically be the straight line between the points. + + +There are often restrictions on the numbers of route (or track) points the GPS Device can handle - may be 250 or as little as 50. +This generally not a problem for shorter routes, but needs managing for longer or detailed routes. +The number of track points is normally alot higher (e.g. 500 or typically with latest devices 10,000 or more) and less of a problem. + + + See for helping to manage this. + +
+ +
+ +
File Types and the Main Window + + +&appname; has it's own file type traditionally marked by the .vik file extension. +This is a plain text file saving all information of the current window including the view location, zoom level, projection type and then all the layer information (aggregates, maps, tracks, waypoints, etc...). + + +Besides it's own file type, &appname; can open (and save to via export methods) GPX and KML file types. + + + +&appname; does not handle GPX 1.1 particularly well - it prefers GPX 1.0 + + + +By default &appname; opens a default blank window centered on the home location. This behaviour can be changed by the . +Each window contains menus, a toolbar, a viewport, layers panel and a statusbar. +Each section (apart from the viewport) can be hidden using the or from the +ViewShow choices. + + +One may consider each &appname; window to be a separate project - each with it's project Viking file. +However generally one window is enough for most purposes! + + +Several operations apply at the window level as follows next. +Also see for the operational modes that generally work in conjunction with a selected layer. + + +
New + +Located on the FileNew menu and on the toolbar New. + + +This creates a new window with the default settings. + +
+ +
Open + +Located on the FileOpen menu and on the toolbar Open. + + +This opens a file chooser dialog to select one (or more) files of the supported GPS data file types: + +Viking +GPX +TCX +KML +JPG + + + +GPX, TCX, KML and JPG files will be loaded into the existing &appname; view. A Viking file will be given a new window if the current window is already assigned. + + + +&appname; handles more file types via the Acquire methods below. + + +
+ +
Open Recent File + +Located on the FileOpen Recent File menu only. + + +The most recently opened files are available for opening again. +The number of files remembered is controlled by a value in the . + + +Note that files imported via the Acquire mechanism are not available in this list. + +
+ +
Save + +Located on the FileSave menu and on the toolbar Save. + + +If the current opened file is Viking file, this save will simply update it. +If it is a new file or the file loaded was an external type (i.e. GPX or KML), then this will ask for a new name to save as a Viking file. + +
+ +
Save As + +Located on the FileSave As menu only. + + +This will ask for a new name to save as a Viking file (even it was already a Viking file). + +
+ +
Append File + +Located on the FileAppend File... menu only. + + +Selecting a Viking file from this method will join the file contents to the current window (instead of creating a new one). + + +GPX and KML files may also be appended, whereby the file contents are added to the currently selected or layer. Otherwise they are loaded in the normal file open method when no layer is selected. + +
+ +
Open GPX as External Layer + +Located on the FileOpen GPX as External Layer... menu only. + + +Selecting a GPX file from this method will create an external Layer that loads from the specified file. +The layer is marked as a "no write" external layer, which means any changes made will not be written back to the GPX file. +To enable changes to be written, you can change the layer to a standard external layer in the layer properties dialog. +This is in contrast to importing the data and storing it in the Viking file. + +
+ +
Properties + +Located on the FileProperties menu only. + + +Displays some simple properties about the loaded Viking project file (if any), such as full filename including the path, the filesize and the date/time of the file. + +
+ +
Export All + +Located on the FileExport All menu only. +Choose either the GPX or KML option. + +This allows converting every layer from the existing project into files of the type choosen. +You will be prompted for a directory into which a new file for each layer will be saved. + + +The KML option uses GPSBabel and so will not be available if GPSBabel can not be detected. + + +Note that some data properties are not supported by the target export file type. Such as item visibility or track colours. + +
+ +
Acquire + + +Available on the FileAcquire menu and from the layer menu. + + +If used from the File menu these methods place the results in a new TrackWaypoint layer. + + +If used from the layer menu these methods place the results in that TrackWaypoint layer. + + +
+From GPS + +FileAcquireFrom GPS +Probably the easiest way of getting information from a GPS Device. + + +Select the GPS Device communication settings and then hit OK. +See the Getting Started section for more info about the settings. + + + +Some GPS devices (such as the Garmin Nuvi 255) support a native file system and write information to a Current.gpx file or similar. You will have to browse the file system on the device and open it directly. + + +
+ +
+Import File With GPSBabel + +FileAcquireImport File With GPSBabel + + +Other formats can be imported that are supported by GPSBabel. + + +You need to select the file and the type of the file that is going to be opened, +since there is no automatic detection of the file kind. + +
+ +
+OSM Traces + +FileAcquireOSM Traces + + +See section for more information. + +
+ +
+My OSM Traces + +FileAcquireMy OSM Traces + + +See section for more information. + +
+ +
+From Geotagged Images + +FileAcquireFrom Geotagged Images +Enables automatic creation of waypoints from geotagged images. + + +This menu opens a dialog to select such image files. +If the image files have geotag information in them, then a layer with named waypoints positioned at the location of each image with a thumbnail of that image is created. + +
+ +
+From Wikipedia Waypoints + +FileAcquireFrom Wikipedia Waypoints + + +This gets interesting points from Wikipedia for the specified view: either within the extent of layer bounds or within the current viewport boundary. + +
+ +
+From Routing + +FileAcquireFrom Directions + + +This gets a route from given directions. + +
+ +
+From URL + +FileAcquireFrom URL + + +This gets a file from the entered URL. +File formats that can be opened are those supported by GPSBabel. + + + +You need to select the type of the file that is going to be returned, since there is no automatic detection of the file kind. + + +
+ +
+Import GeoJSON File + +FileAcquireImport GeoJSON File + + +This uses the program togpx to load .geojson files. +If the program is not detected on your system, then this option will not be available. +See here for the installation method. + + +Versions proir to 1.6.0 of GPSBabel did not support the GeoJSON file format. + +
+ +
+ +
Print + +Located on the FilePrint menu and on the toolbar Print. + + +Print uses what is displayed on the current map view for printing: i.e. what ever map, tracks and waypoints that are in view, including the +cross hairs and the scale. + + +It uses a standard system print dialog using an image the size of the current viewport in pixel terms. +On the Image Settings you can move the image around the page and scale the image up / or down. + +
+ +
Generate Image File + +Located on the FileGenerate Image File menu only. + + +Allows generation of larger (pixel) area images than the standard Print method above. +From the generated image you can use the facilities of the Operating System to print the image +or perform other actions. + + +You should have previously downloaded the tile images for the chosen zoom level, +otherwise the image produced will have missing sections. + + + +Using large areas takes some time to process and due to the method used it may run out of memory to complete the operation. +Unfortunately under Windows systems it can not detect this failure and may crash the program. +So the maximum size is dependent on the capabilities of your system. +For instance the largest successful image generated on my (RN) Debian system is a pixel area of 20,000 x 20,000. + + +
+ +
Generate Directory of Images + +Located on the FileGenerate Directory of Images menu only. + + + +This is only available in UTM mode. + + +
+ +
KMZ Map File Overview + +A KMZ file is a compressed version of a KML file and associated supporting files. + + +A KMZ Map file is a KMZ file with an image overlay often for use as a Custom Map on Garmin GPSr devices. + + +&appname; only supports basic properties in KMZ Map files, primarily intended for use with Garmin GPSr devices although KMZ exports are known to be work with Google Earth. + +
+ +
Import KMZ Map File + +Located on the File menu only. + + +Enables loading of a selected KMZ map file. +This generates a new map layer using the overlay image contained within the KMZ file. + +
+ +
Generate KMZ Map File + +Located on the File menu only. + + +Enables exporting the current viewport as a KMZ map file. +The area and zoom level covered by the KMZ map can be adjusted before saving. + + +Note that Garmin GPSr devices have limits in using images if they are too large (e.g. over 3Mb big) in KMZ files. +&appname; does not enforce any limits on the KMZ files it generates. + +
+ +
+ +
Layers + + +Layers supported by &appname; are: + + + + + + + + + + + + + +For each layer there are a few standard options: + + +Properties - Layer setup / configuration settings +Cut +Copy +Paste +Delete +Visibility - This checkbox on the Layers Panel controls whether the layer is shown in the viewport or not + + +The cut/copy/paste options can be accessed in a variety of ways once the layer has been selected: + + +Standard keys: Ctrl+x|c|v +Main menu Edit +From the right click menu +Buttons at the bottom of the Layers Panel + + +Default values used for each layer's properties can be altered via the EditLayer Defaults menu options. + + +See the individual section for detail about each layer. + +
+ +
TrackWaypoint Layer + +TrackWaypoint layers display GPS data (tracks, routes and waypoints). + +One way to create new waypoints is to copy a +latitude/longitude coordinate pair, such as the one shown on most +geocaches, and paste it into an active TrackWaypoint layer. &appname; can +automatically recognize several variations of the lat/lon format. + + +By right-clicking on tracks, routes or waypoints in the , you can access many commands on them. +You can easily find a specific track, route or waypoint by expanding the appropriate containing Tracks, Routes or Waypoints sublayer in the +layers panel to show all the individual items and then typing the name of the track, route or waypoint. + + + +The containing Tracks, Routes or Waypoints sublayers are only shown when items of that type exist. +To start creating them enter into a create mode via either the Create toolbar commands or the New menu commands. + + + +The new TrackWaypoint layer dialog allows the layer to be specified as external. +In this case the layer is exported as GPX to the file specified instead of stored in the Viking file itself. +It is also possible to specify the layer as "no write". +This means that &appname; does not write the layer to the GPX file specified; instead, &appname; only reads the file. +No-write layers are primarily intended to be used with the option in the File menu. + + + +External layers are loaded only when they are displayed or selected. +Hence, they will not appear in any summary statistics if they have not been loaded. +It is possible to load all external layers contained in an layer by selecting "Load External Layers" from the Aggregate Layer context menu. +Note, &appname; specific options may not be saved if not supported by the GPX export. + + + +The sublayers also offer right click menu options. +These are the same as those available at the TrackWaypoint level, but only those that relate to the sublayer type. + + + +By default routes are coloured red. Tracks are automatically assigned a spread of colours. + + + +Most operations available on tracks are available on routes, except for functionality that relies on having timestamps - since routes by definition have no timing information. Thus for example, uploading a route to OpenStreetMap Traces is not available nor is Geotagging on a route. +It is possible to convert between Tracks and Routes, although converting from a Track to a Route may involve a loss of information (hence you are required to confirm this operation before it happens). + + + +Also see for use in conjunction with this layer. + + +
Layer Operations + +The layer has a context menu with several operations. + + +
View Layer + +Version1.1+: This will automatically move the viewport and select the best zoom level to see the whole layer (i.e. all tracks, routes and waypoints). + +
+ +
View + +
View All Tracks + +Version1.1+: This will automatically move the viewport and select the best zoom level to see the all the tracks in the layer (ignoring positions of any routes or waypoints). + +
+ +
View All Routes + +Version1.4+: This will automatically move the viewport and select the best zoom level to see the all the routes in the layer (ignoring positions of any tracks or waypoints). + +
+ +
View All Waypoints + +Version1.1+: This will automatically move the viewport and select the best zoom level to see the all the waypoints in the layer (ignoring positions of any tracks or routes). + +
+ +
+ +
Goto Center of Layer + +This will automatically move the viewport to see the whole layer (i.e. tracks, routes and waypoints). It does not adjust the zoom level. + +
+ +
Goto Waypoint + +This opens a dialog box to enter a name of waypoint to search for. If it is found the viewport is centred on it. + + + +Note this search is not very clever and only finds exact matches. +You are probably better off expanding the waypoint list and directly start typing, as mentioned above, which finds a match based on each letter typed. + + +
+ +
Export Layer + +The layer (all tracks, routes and waypoints) can be exported to following file formats: + + + + GPX + + + GPSPoint + + + GPSMapper + + + Google's KML + + + Any GPSBabel File Formats + + + GeoJSON. Via the program togeojson + This option will not be available if the program is not detected on your system. + See here for the installation method. + + + +Version1.1+: An individual track can be exported to a GPX file via the track menu. + +
+ +
Finish Track or Route + +Selecting this option ends the creation of that individual track or route. + + + +This is only available when a track or route is being created by the or tools. + + +
+ +
New +
New Waypoint + +This opens a dialog box to create a new waypoint. A default name will be suggested and the default position is the center of the viewport. + +
+
New Track + +This turns on the tool. + +
+
New Route + +This turns on the tool. + +
+
+ +
Geotag Images + +This starts the Geotagging Images dialog against all tracks in the layer. +See Geotagging for further detail. + +
+ +
Acquire + +This offers the same choice from methods as on the File menu. +However when invoked from here, the results will be stored in this layer (instead of creating a new one). + +
+ +
Upload + +
Upload to GPS + +This opens a dialog to select the GPS Device and port to which the layer information will be transferred. + + +The types of GPS information (tracks, routes or waypoints) to be transferred can be selected. + + +Tracks, Routes or Waypoints that are invisible will not be transferred. + +
+ +
Upload To OSM + +This opens a dialog to upload all tracks and waypoints to OpenStreetMap traces. +Useful if you are an OpenStreetMap contributor, access details are stored in &appname; + + + &appname; allows you to edit a track, e.g. remove duplicate points, perhaps remove track points leading to your home and then upload it to OpenStreetMap. + +
+
+ +
Delete +Offers deletion of various parts of a TrackWaypoint layer: +
Delete All Tracks +Deletes all the tracks in this layer. +
+
Delete Tracks from Selection +Opens a dialog with list of all the tracks from this layer to choose the ones to delete. +
+
Delete All Routes +Deletes all the routes in this layer. +
+
Delete Routes from Selection +Opens a dialog with list of all the routes from this layer to choose the ones to delete. +
+
Delete All Waypoints +Deletes all the waypoints in this layer. +
+
Delete Waypoints from Selection +Opens a dialog with list of all the waypoints from this layer to choose the ones to delete. +
+
Delete Duplicate Waypoints + + Deletes duplicate waypoints in this layer. + Waypoints are considered duplicate if they have the same location and symbol. + + If other properties are different such as name, comment, altitude, etc... they will still be considered a duplicate. + + + +
+
+ +
Filter +
Simplify All Tracks + +This opens dialog to request the number of points each track will be simplified using GPSBabel. The result is put into a new layer. The simplification method removes points considered to be in a 'near straight line', thus reducing the number of points and attempting to keep the most important turning points. + +
+
Compress Tracks + +Enables compression of tracks and routes via GPSBabel's Crosstrack simplify method. +It opens a dialog to request the Error factor value which is the maximum allowable error that may be introduced by removing a single point. +It is expressed a distance in units as specified by the distance option. +Thus a higher value will remove more points. +The result is put into a new layer. + +
+
Remove Duplicate Waypoints + +Remove Duplicate Waypoints - fairly self explainatory, with the results created in a new layer. + + + +However it only considers a precise position (waypoints only 1 metre away from each other are considered different) and also doesn't consider if the waypoints have different comments, symbols or images. + + +
+
+ +
Filter With <emphasis>Trackname</emphasis> + +This runs GPSBabel on the layer using information from a previously selected track (select via the track menu "Use With Filter" option) with the following command types: + + +Waypoints Inside This +Waypoints Outside This + + +The result is generated in a new Track/Waypoint layer. + +
+ +
Geotag Images + +This starts the Geotagging Images dialog using the specific track. +See Geotagging for further detail. + +
+ +
List Tracks or Routes + +Opens a new dialog with the list. As described in the Aggregate layer + +
+ +
List Waypoints + +Opens a new dialog with the list. As described in the Aggregate layer + +
+ +
+ +
Track and Route Sublayer Options +Repeats options available at the TrackWaypoint level, but only those for tracks and routes: + + +Finish Track or Route +Same as the layer Finish Track or Route + + +New Track or Route +Same as the layer New Track or New Route + + +View All Tracks or Routes +Same as the layer View All Tracks or View All Routes + + +Delete All Tracks or Routes +Same as the layer Delete All Tracks or Delete All Routes + + +Delete Tracks or Routes from Selection +Same as the layer Delete Tracks from Selection or Delete Routes from Selection + + +List Tracks or Routes +Opens a new dialog with the list. As described in the Aggregate layer + + +Also gives other options for handling multiple items: + + +Sort +Gives the ability to sort the items in the treeview alphabetically or by date. + + +Visibility +Offers options to quickly control the visibility of all items within the sublayer, as per + + +
+ +
Track and Route Properties + +This shows several tabs for properties and useful statistics about a track or a route, including elevation-distance and speed-time graphs (if data is available). +Moving the mouse pointer over the graph displays values related to that point along the track. +You can click on these graphs to jump to the point in the track. +You can reverse it, delete duplicates, split at marked position or split a track from its component segments (discontinuous breaks in a track) into separate tracks. + + +For the elevation related graphs the Show DEM check button is only enabled if a suitable is available that overlaps the track. + + +Graphs either have a Show GPS Speed or Show Speed button. +Each of these overlays relative speed markers along the graph. +The difference between Speed vs GPS Speed is that GPS Speed is taken directly from a field reporting the speed value in the source data. +Typically speeds used in Viking are calculated between the points time and position differences. +This is due to the reporting of speed values in source data is not mandatory and often not present. + +
Track and Route Properties Tab + +
+Properties Tab: Example + + + +
+
+
+
Track and Route Statistics Tab + +
+Statistics Tab: Example + + + +
+
+
+
Track Elevation Graph + +
+Elevation Distance Tab: Example + + + +
+
+ +The following colors are used in the elevation-distance graph: + + + +Main colour - this is dependent on your Desktop theme - often blue by default +elevation data in graph + + +Yellow + +no elevation data + + + +Green + +elevation data from DEM + + + +Red + +speed + + + +
+ +
Track Time Splits + +
+Splits Tab: Example + + + +
+
+ +This tab displays timing splits on tracks with timing information. +A few different values of split lengths are available, each having it's own tab display. + +
+
+ +
Track and Route Operations + +
Finish Track + +Selecting this option ends the creation of the individual track. + + + +This is only available when a track is being created by the tool. + + +
+ +
Goto + +This centers the viewport on the selected position on the track: + + +Startpoint +"Center" - the notional center from the bounds of the track +Endpoint +Version1.1+: Highest Altitude +Version1.1+: Lowest Altitude +Version1.1+: Maximum Speed (Not Available on Routes) +Version1.8+: Previous trackpoint +Version1.8+: Next trackpoint + +
+ +
View + +Version1.1+: This centers the viewport on the track and selects the best zoom level to see it. + +
+ +
Combine +
Merge By Time + +This operation repeatedly tries to merge the right-clicked track +with tracks in the same TrackWaypoint layer. The tracks which are +merged are those which have at least one trackpoint less than some +threshold time away. This way, if you somehow end up with lots of small +segments (say, caused by turning the GPS on and off) you can merge them +easily into one track. + + + +This is not available on routes as they have no timestamps. + + +
+ +
Merge With Other Tracks + + This opens a dialog listing the other tracks in the same TrackWaypoint layer, from which one can select the other tracks to merge with. + Tracks are merged in order of time. + +
+ +
Merge Segments + +Combines track segments. Effectively removing track segment markers to leave one segment for the whole track. + +
+ +
Append Track or Route + +Enable joining of a single track to the end of the current track. +This opens a dialog listing the other tracks in the same TrackWaypoint layer from which one can make the selection. + +
+
+ +
Split +
Split By Time + +This operation will split a single track into segments wherever the +time interval between successive trackpoints is larger than some +threshold. This is useful when processing raw NMEA GPS data, especially +taken over a long time. + + + +This is not available on routes as they have no timestamps. + + +
+ +
Split By Number of Points + +Version1.2+: This operation will split a single track into segments by the number of points specified. +This can be useful with devices which may have limits on the number of points it supports. + +
+ +
Split Segments + +Splits track segments into new tracks. + + + +This is not available on routes as they do not have route segments. + + +
+ +
Split at Trackpoint + +Splits the track at the currently selected trackpoint. + + +The current track will finish at this trackpoint. +A new track will start from a copy of this trackpoint. + + + +This is only enabled when a trackpoint is selected. + + +
+
+ +
Insert Points + + +These options are only enabled when a trackpoint is selected. + + +
Insert Point Before Selected Point + +Inserts a track point halfway between the previous track point and the current track point. +All track point properties are interpolated between the two points. + +
+
Insert Point After Selected Point + +Inserts a track point halfway between the current track point and the next track point. +All track point properties are interpolated between the two points. + +
+
+ +
Delete Points +
Delete Selected Point + +Deletes the currently selected track point. + + + +This is only enabled when a trackpoint is selected. + + +
+
Delete Points With the Same Position + +Deletes subsequent points that have the same position (but have different timestamps). + +
+
Delete Points With the Same Time + +Deletes subsequent points that have the same time stamp (but may have different positions). + + + +This is not available on routes as they have no timestamps. + + +
+ +
+ +
Transform + +These options alter the data of trackpoints of a track but not add or remove trackpoints. +And don't seem to fit any other category :) + +
Apply DEM data + +If any DEM data is loaded, this will apply the DEM data to give the track elevation data. +Two ways of applying DEM data are offered: + +Keep. Retains the existing elevation data of trackpoints and only those missing an elevation value are set. +Overwrite. Elevation data are set on all trackpoints even if they already elevation values. + + +
+
Smooth Missing Elevation data + +In various locations across the world, there are missing DEM values (AKA DEM Holes) from the SRTM data. +This is particularly noticeable in mountainous areas. +Two ways of applying elevation data to trackpoints that do not have elevation values are offered: + +Interpolated. Missing elevation data is interpolated between the previous and next known values. +Flat. Elevation data is filled in from the last previously known value. + + +
+
+Convert to Track or Route + +If this is a Route then it will convert it to a Track. + + +If this is Track then convert it to a Route. + + + +Converting from a Track to a Route may involve a loss of information, in particular timestamp values (hence you are required to confirm this operation before it happens). + + +
+
+Anonymize Times + +Timestamp information of a track can be shifted to be all offset from 1901-01-01. + + +Thus the timestamps themselves will no longer reveal exactly when a track was taken. +However the relative difference between the timestamps is kept thus one is still able to calculate some properties such as speeds along the track. + + + +This is not available for routes, as they have no timestamps. + + +
+
+Interpolate Times + +Trackpoint timestamps between the first and last points are calculated such that track is travelled at equal speed. +This is mostly useful when tracks don't have timestamps and you wish to recreate your trip (e.g. you've forgotten to turn on your GPS or the batteries have run out) +Thus edit the first and last trackpoints to set the approximate times of your trip and then use this to give approximate times along the track. +When used on tracks with timestamps this will overwrite the existing timestamps. + + + +This is not available for routes, as they have no timestamps. + + +
+
+ +
Export Track as GPX + +Version1.1+: This allows exporting the track as a GPX file by opening a file save dialog. + +
+ +
Extend Track End + +Changes the current tool to add trackpoints to the end of the track. + +
+ +
Extend Using Route Finder + +Enables the Route Finder tool. Thus on a subsequent left click in the viewport, a route is calculated from the end of track to that point using the default route service and applied to the track. + +
+ +
Upload + +
Upload to GPS + +Same as the layer Upload to GPS command, but only applies to the track. + +
+ +
Upload to OSM + +Same as the layer Upload to OSM command, but only applies to the track. + +
+ +
+ +
Use With Filter + +This selects the track to be used in the Filter With Trackname feature. + + + +This is not available on routes. + + +
+ +
Edit Trackpoint + +This opens the Trackpoint edit dialog. See . + + + +This is only enabled when a trackpoint is selected. + + +
+ +
Refine Route... + +This function allows to request a Routing Engine in order to refine a given route. +By "refining" we mean computing all real intermediates points between some given major points. +This could be useful to compute a trip giving only the wished important steps. + + + +This is only available on routes. + + +
+ +
View Google Directions + +This option is only available on a track created using the Route Finder tool. + + +Launch a web browser to see the Google directions page which yielded the route. + + + +The record of the Google route is stored in the track's comment, so if the comment is changed (or the route was created by something other than the Route Finder tool) this will not work correctly. + + +
+ +
+ +
Waypoint Sublayer Options +Repeats options available at the TrackWaypoint level, but only those for waypoints: + + +New Waypoint +Same as the layer New Waypoint + + +View All Waypoints +Same as the layer View All Waypoints + + +Goto Waypoint +Same as the layer Goto Waypoint + + +Delete All Waypoints +Same as the layer Delete All Waypoints + + +Delete Waypoints from Selection +Same as the layer Delete Waypoints from Selection + + +Delete Duplicate Waypoints +Same as the layer Delete Duplicate Waypoints + + +List Waypoints +Opens a new dialog with the list. As described in the Aggregate layer + + +Also gives other options for handling multiple items: + + +Sort +Gives the ability to sort the items in the treeview alphabetically or by date. + + +Visibility +Offers options to quickly control the visibility of all items within the sublayer, as per + + +
+ +
Waypoint Properties + + +This shows a dialog with detailed information for the waypoint. Many properties of the waypoint can changed here, such as the comment, the symbol used in drawing or the image (normally a photograph taken at this position) assiocated with it. When a waypoint has an image, a thumbnail of it is drawn in the viewport for the waypoint (in preference to the symbol). + + +If the waypoint has an associated image, then the Geotag information may be updated, either with updating the file's modification timestamp or not. +This can be useful when the waypoint has been moved. + + +
+ +
Waypoint Operations + +
Goto + +This centers the viewport on the selected waypoint. + +
+ +
Geotag Images... + +This opens the Geotag Dialog to allow Geotagging multiple images to the position of this waypoint. +In this circumstance creation of waypoint options are disabled and only the options related to writing the EXIF information are available. + +
+ +
Transform + +Offers a subset of the track utilities. +Currently only setting the altitude from DEM data methods are available. + +
+ +
Visit Webpage + +If the waypoint's comment (or description) starts with http: then this option is available and allows launching a web browser to go to the webpage. + +
+ +
Visit Geocache Webpage + +If the waypoint's name is in Geocache form (GCXXXXX) then this option is available and allows launching a web browser to go to the Geocache page. + +
+ +
New Waypoint + +Same as the layer New Waypoint. + +
+ +
+ +
Version1.3+: Geotag Images + +This dialog allows geotagging images (normally taken with a digital camera) against a specific waypoint or via interpolation against a specific track or all tracks in the TrackWaypoint layer - depending on how it is invoked. + + +When geotagging against tracks, images need to have an EXIF DATE_TIME_ORIGINAL (nearly always set by a camera). This timestamp is then used to find the location when the image(s) was taken by searching through the track(s) to find the nearest time - interpolating between points if necessary to set the location. + + + +Generally it is good policy to synchronize your camera's clock with your GPS clock before taking photographs. However the times can be adjusted afterwards (if necessary) to take into consideration clock differences. + + + +Various options allow control of how the geotagging process is performed: + + +Images - Add the images used for geotagging +Create Waypoints +Overwrite Existing Waypoints +Write EXIF +Overwrite Existing GPS Information +Keep File Modification Timestamp +Automatic Image Direction - Assumes the direction will be in line with the track heading +Interpolate Between Track Segments +Image Time Offset - The number of seconds to ADD to the photos time to make it match the GPS data. Calculate this with (GPS - Photo). Can be negative or positive. Useful to adjust times when a camera's timestamp was incorrect. +Image Time is Local - Are the timestamps in the image local time or otherwise in UTC. +Image Timezone - The timezone adjustment factor. + + +Typically timestamps in images are either in local time or UTC but there is no way of automatically knowing which; so you need to specify which is the case. +Image Time Offset is best used for accounting for camera's clock drift, so normally of the order of a few seconds or minutes. +Whereas Image Timezone is more for adjusting for a camera's timezone difference, or perhaps differences in your current timezone and the timezone the images where taken. + +
+ +
+ +
GPS Layer + +The GPS layer is responsible for uploading and downloading GPS data +from a GPS device. It also is responsible for realtime GPS tracking. +Expand the GPS layer in the layers panel to see the two layers it +uses for uploading and downloading. To upload, download, or use +realtime tracking, right-click the GPS layer and click the appropiate +menu item. + + +
Download + +To download data from the GPS, right-click the GPS layer and click Download from GPS. + +
+ +
Upload + +To upload data to the GPS, first populate the GPS Upload child +layer of the GPS layer (either by creating waypoints/tracks/routes in it, or +copying and pasting or dragging waypoints/tracks/routes from another layer). +Then right-click the GPS layer and click Upload to GPS. + +
+ +
Realtime Tracking + +You must set up gpsd correctly or use a GPSD server and put the +correct information in the GPS layer properties dialog. Then right-click +the layer and select Start Realtime Tracking. + +
+ +
Empty <emphasis>Item</emphasis> + +There are several options to quickly delete a subsection of data: + + +Empty Realtime +Empty Upload +Empty Download +Empty All + +
+ +
+ +
DEM (Digital Elevation Model) Layer + +This layer provides elevation data from the Shuttle Radar Topography Mission (SRTM) + + +Elevation data can be useful in planning trips, as you many wish to avoid/minimise the hills encountered. [OSM Cyclemap is also useful this way too] + + +To download the data use the tool (shown on the toolbar), and then click on a area of the viewport. Once files have been downloaded they can then be loaded from disk via the DEM properties in future application runs. + + +The current data server is: NASA STRM 2.1. + + +ATM &appname; does not auto download DEM data. If you want to get lots of data blocks, you may wish to use some other program get such as curl or wget to download them for an area. + + + +Using many DEMs is CPU/memory intensive. Depending on your computer's capability, &appname; will be less responsive when about 50+ DEM blocks are loaded. It is probably unwise to attempt using 200+ blocks, so trying to use DEMs covering large countries/continents (USA, Australia etc...) is unlikely to work. In these conditions under Linux, &appname; may be automatically stopped by the "OOM Killer" + + + +
+ + +
Maps Layer + +This layer provides a single map resource, you may have multiple map layers but only top one (if enabled) will be visible (subject to the Alpha compositing property). + + +Some maps are continually improving over time (e.g. OpenStreetMap) thus &appname; employs a caching mechanism to avoid redownloading data (see ). +However a forced refresh for the current view can be made via the Reload All Onscreen Maps option or Ctrl+F5. + + + +Also see tool for use in conjunction with this layer. + + +Online Map Tile Providers + +You will need an open internet connection when you are downloading maps these following map types, but once downloaded they are available from the hard disk cache. When map are avaliable from the disk cache it is much faster and can be used offline. +Inbuilt maps include various OpenStreetMap (OSM) ones and more: + + + +Bing Aerial Maps (&appname; Version1.2+) +Mapbox Outdoors - This is the default (&appname; Version1.7+) +OpenStreetMap (Mapnik) +OpenStreetMap (Cycle) +OpenStreetMap (Transport) (&appname; Version1.3+) +OpenStreetMap (Humanitarian) (&appname; Version1.5+) +NASA BlueMarble + + + +&appname; can be configured to handle additional online map resources. See for further detail. + + +Offline Map Tilesets + +Some map types supported are for on disk tile formats: + + + + + On Disk OSM Tile Format + This is equivalent to any map set with OSM Cache Layput. + +MBTiles File + + OSM Metatiles + + This file format is mostly aimed at being rendering cache feature and is Endian dependent. + Thus to successfully view the file cache, the Metatile files and Viking must be of the same endian type (which they probably will be). + + + + +Of course you need to have acquired or generated these tilesets yourself. + + +
Map Layer Properties + +Configurable properties: + + + +Map Type + + The kind of map this layer displays. + Map types are dependent on the current mode. + + + +Maps Directory +Not applicable for MBTiles Map type since it is a single file. + + +Cache Layout +Viking or OSM. See . Only applies to maps from online tile providers. + + +Map File +Ony applicable for MBTiles Map type since it is a single file. + + +Alpha + + Control the Alpha value for transparency effect using a value between 0 and 255 with the default being 255 for a fully solid image. + Zero is fully transparent. A value of around 160 can be useful for blending views of multiple map layers (when applied to the upper most map layer). + + + +Autodownload Maps +This can be useful to turn off when you are not online to avoid pointless download requests or may be keep a map in a 'historical' state. +e.g. perhaps in case a current map rendering is broken. + + +Autodownload Only Gets Missing Maps +Using this option avoids attempting to update already acquired tiles. +This can be useful if you want to restrict the network usage, without having to resort to manual control. Only applies when Autodownload Maps is on. + + +Zoom Level +Determines the method of displaying map tiles for the current zoom level. +Viking Zoom Level uses the best matching level, otherwise setting a fixed value will always use map tiles of the specified value regardless of the actual zoom level. + + +
+ + +
Layer Operations +
Download Missing Onscreen Maps + +This requests map tiles for areas of the viewport that do not currently have one. + +
+ +
Download New Onscreen Maps + +This requests map tiles only if the maps are older than the Tile Age preference. + +
+ +
Reload All Onscreen Maps + +Force a refresh of all visible map tiles. + +
+ +
Download Maps in Zoom Levels + +This opens a dialog to enable requesting the download of maps for the region in the viewport over a specified number of zoom levels. +The download method type can be specified to help limit the number of requests. + + + +There are some inbuilt limits to prevent downloading large amounts of map tiles. + + +Please respect the usage policy of the tile set provider. +Such as OSM Tile Usage Policy. + + + +
+Maps Download Dialog: Example + + + +
+
+
+
+ + +
+ +
Aggregate Layer + +This layer is a container layer to hold other layers. There is always an initial and controlling Top Layer that can not be removed or renamed. + + +This layer type is useful for grouping other layers, especially layers, in whatever categories are relevant to you: such as by activity, location or date. +Here are some suggestions: + +Hiking +Mountain Biking +Road Cycling +Car Trips +Sailing +Holidays +UK Points of Interest +USA Points of Interest +etc... + + + +Thus one can have a list of all your tracks, but groups can be shown or not using the relevant layers visibility checkbox. + + + +Tracks Area Coverage (TAC) is a feature to highlight areas with track coverage. +It is based on OpenStreetMap style tiles - as an approximation to a grid square system. +The size of the area can be changed, which is linked to the OSM Zoom level, +such that a higher Zoom level gives a smaller physical area and so more tiles. +This can be used for general curiousity or perhaps to plan routes to visit areas previously unexplored. + + +The calculations are performed in the background when deemed necessary (e.g. loading in a new file) and can also be manually requested. + + +Note that Viking can be slow in drawing hundreds or more tracks but this analysis is relatively quick and the resulting drawing is much faster. +Thus ATM is it recommended to turn off the visibility of the tracks themselves for this type of usage. + + + +
+Tracks Area Coverage: Example + + + +
+
+ +
Layer Properties: Tracks Area Coverage +Offers basic controls whether it is enabled or not and includes the size of the tile. +
+ +
Layer Properties: TAC Advanced +Controls subsets of TAC drawing are calculated and shown with their colour and opacity. +Note for Max square coverage, ATM it will only draw the first square encountered, although there may be more than one such area. +Note for Cluster coverage, ATM it will only draw the first cluster encountered, although there may be more than one such area. +
+ +
Layer Operations + +The following are available on Aggregate Layers: + + +
New Layer + +Add a new layer of the selected type. + +
+ +
Sort + +The list within the treeview can be sorted. + + +Alphabetical and Date sorts are available. + + + +Generally it is not useful to sort the Top most layer. Sort is mainly intended for Aggregate groups of TrackWaypoint layers. + + +
+ +
Track List + +Selecting this opens a dialog listing all the tracks in a table along side statistics such as track length and maximum speed. +Each column header is clickable and will reorder the list according to that particular column. +You can also rearrange the columns via dragging the column header to the new location. + + +This table may be invoked from a variety of different layer levels and will then list only the relevant tracks (and/or routes). + + +Aggregate Layer +Lists Tracks and Routes and the TrackWaypoint Layer they are in + + +TrackWaypoint Layer +Lists Tracks and Routes + + +TrackWaypoint Track sublayer +Lists Tracks only + + +TrackWaypoint Route sublayer +Lists Routes only + + + + +
+Track List Dialog: Example +
+ +This is showing all tracks and routes (although there are no actual routes here!) in multiple TrackWaypoint layers, that has been sorted by height. +Note that routes will not have timestamps or speeds, but may have elevations and should have some distance! + +
+ + + +
+
+ +Hovering the mouse over an entry will show a tooltip of the comment or description if it is available. + + +Each entry in the track list can be selected and on mouse right click offers these options: + + +View +Move the viewport to the area of the item and highlight it. + + +Statistics +Opens the Properties dialog on the tab. Note this will close the track list dialog. + + +Copy Data +Copy the data fields as text. + + + + +If multiple entries are selected the only right click option is Copy Data. +This copies the individual data fields as plain text separated by tab characters, ideal for pasting into other applications in particular spreadsheet programs. +Note that the order of the fields copied is the default column ordering (irrespective to how they may have been rearranged). + +
+ +
Waypoint List + +Selecting this opens a dialog listing all the waypoints to give a overview of the waypoint information. +Each column header is clickable and will reorder the list according to that particular column. +You can also rearrange the columns via dragging the column header to the new location. + + +This table may be invoked from a variety of different layer levels and will then list only the relevant waypoints. + + +Aggregate Layer +Lists Waypoints and the TrackWaypoint Layer they are in + + +TrackWaypoint Layer +Lists Waypoints + + +TrackWaypoint Waypoint sublayer +Lists Waypoints + + + + +
+Waypoint List Dialog: Example +
+ +This was invoked on a TrackWaypoint layer and shows all waypoints from that single layer. It has been sorted by the symbols. + +
+ + + +
+
+ +Hovering the mouse over an entry will show a tooltip of the description if it is available. + + +Each entry in the list can be selected and on mouse right click offers these options: + + +View +Move the viewport to the area of the item and highlight it. + + +Properties +This will open the properties dialog. Note this will close the waypoint list dialog. + + +Show Picture +If enabled, this will open the associated image in an external Image Viewer program. + + +Copy Data +Copy the data fields as text. + + + + +If multiple entries are selected the only right click option is Copy Data. +This copies the individual data fields as plain text separated by tab characters, ideal for pasting into other applications in particular spreadsheet programs. +Note that the order of the fields copied is the default column ordering (irrespective to how they may have been rearranged). + +
+ +
Visibility Options + +This offers a quick way to set all the visibilities of each item within the containing layer, rather than having to change each one individually. + + +Show All +Ensures all items are set to be visible. + + +Hide All +Ensures all items are set to be invisible. This is useful for then turning on single items afterwards so the display is not cluttered. + + +Toggle +Inverts the visibility status of each item. + + + +
+ +
Search by Date + +This opens calendar dialog to select a date to search by within this Aggregate layer. +The first item that is found on that date will be selected. +Tracks are searched first in preference over waypoints. + +
+ +
Statistics + +This opens a dialog to display various statistics about all tracks contained within this Aggregate layer. + +
+Statistics Dialog: Totals + + + +
+ + + This currently generates a simplified Eddington number. + In that a per track length value is used, rather than trying to work out a length per day. + (i.e. doesn't combine multiple tracks for a single day or split very long tracks into days). + The Eddington number is in the current Unit distance . + + +
+Statistics Dialog: Years + + + +
+
+ +
Append File + +This opens a dialog to select files to load within this Aggregate layer. + +
+ +
Tracks Area Coverage->Calculate + +Start a new Tracks Area Coverage calculation. + +
+ +
Tracks Area Coverage->Remove + +This clears the Tracks Area Coverage information, thus no grid colouring will be displayed. + +
+ +
+
+ + + + + + + +
Coordinate Layer + +This layer is allows drawing of grid lines on the viewport. + +
+ + +
Tools + +&appname;'s mouse actions on the viewport are controlled by which tool is active. Only one tool can be active at a time. The default mode is pan. You can return to the default mode by pressing Escape. + + +You can use the scroll wheel, the middle-click, the middle-click+drag to zoom, center map at position and pan respectively no matter what tool you are using. + + +Scroll: zoom in and out keeping the mouse over same location + + +Ctrl-scroll: pan north-south (also Ctrl-up, Ctrl-down) + + +Shift-scroll: pan east-west (also Ctrl-left, Ctrl-right) + + +Ctrl-shift-scroll: zoom in and out, without changing the center (also Ctrl+, Ctrl- [*not* KeyPad +/-]) + + +Middle-click: make the clicked point on the map the center + + +Middle-click and drag: pan + + +
Pan + +This is the default mode of operation for &appname;. + + +This mode is entered by clicking on the toolbar icon: + + +Pan moves the viewpoint. A single click centers the viewport at that point, whereas click and drag dynamically moves the view around. +This is the default tool. + + +This mode can also be entered by the keyboard shortcut Ctrl+Shift+P + + +Double clicking the left mouse button will zoom the map in. +Shift + double clicking the left mouse button will zoom the map out. +Double clicking the right mouse button will also zoom the map out. + +
+ +
Zoom + +This mode is entered by clicking on the toolbar icon: + + +Zooms in and out on the clicked part of the map or by the selected area. + + +This mode can also be entered by the keyboard shortcut Ctrl+Shift+Z + + +Ctrl + left or right click: Zoom in/out and center the map on the clicked location + + +Shift (and hold) + left mouse button: Draws a bounding box area on which to zoom in. The zoom action is performed when the left mouse button is released. + + +Shift + left click button: Jump Zoom In by up to factor of 3 standard zooms. + + +Shift + right click button: Jump Zoom Out by up to factor of 3 standard zooms. + +
+ +
Ruler + +This mode is entered by clicking on the toolbar icon: + + +The ruler is used to measure either: + + + +The bearing and distance between two points: Click on first point and then move the mouse point around - the values will be continually updated. +A second click will freeze the ruler at that point. + + + +An area: Shift (and hold) + left mouse button: Draws a bounding box area. Area values are shown in the statusbar and on the viewport. +Releasing the mouse button will freeze the area at that point. +The viewport label option is controlled by . + + + + +This mode can also be entered by the keyboard shortcut Ctrl+Shift+U + +
+ +
Version1.1+: Select + +This mode is entered by clicking on the toolbar icon: + + +The select tool allows one to choose any waypoint or track by clicking on it (or reasonably near) in the viewpoint. + + +ATM to select a track one must actually click on a trackpoint, which is also selected. + + +This mode can also be entered by the keyboard shortcut Ctrl+Shift+S + +
+ +
TrackWaypoint Layer Tools + +You must have a Layer selected to use these tools. + +
Create Waypoint + +Enable this tool by clicking on the toolbar icon: + + +Left click will open the new waypoint dialog using the specified position. + +
+ +
Create/Edit Track + +Enable this tool by clicking on the toolbar icon: + + +General track edit/create tool. +The first left-click will create a new track and you will be asked to enter a name for the track. +If Shift is held, a track will be continued from a nearby trackpoint. +Subsequent left-clicks will add new trackpoints. +If Shift is held, the track will be joined to an existing track at the point selected. +If Ctrl is held, it will jump the new trackpoint position to a nearby existing trackpoint. + + +Right click or Backspace: undo one point. + + + + + +Double click or Escape: to finish track creation. +Finishing the track is also available via the right click and track menus. + + +One must finish the current track to be able to create another track. + + +Keypad Add or ]: Insert point after current point. + + +Keypad Minus or [: Insert point before current point. + + +Left: Select the previous point. + + +Right: Select the next point. + +
+ +
Edit Route + +Enable this tool by clicking on the toolbar icon: + + +This operates in exactly the same way as the Edit Track above. + + +One must finish the current route to be able to create another route. + + +One can switch between the Edit Route and Route Finder tools while editing routes. + +
+ +
Create Route Using the Route Finder + +Enable this tool by clicking on the toolbar icon: + + +Requires an internet connection. +Left click to create a new trackpoint. +If it's the initial trackpoint you will be asked to enter a name for the route, otherwise the default routing engine will be queried to find a route to the new trackpoint. +Right click or Backspace: remove the last added route. + + +Escape: to finish route creation. +Finishing the track is also available via the right click and track menus. + + +One must finish the current route to be able to create another route. + + +One can switch between the Edit Route and Route Finder tools while editing routes. + +
+ +
Track Splitter + +Enable this tool by clicking on the toolbar icon: + + +Use this tool to split a track or route. +After enabling the tool, click on the track/route point of the track/route at the position where you want the split to occur. + +
+ +
Edit Waypoint + +Enable this tool by clicking on the toolbar icon: + + +Left Click/drag: select/move a waypoint. +If Ctrl is held at the same time, it will jump the waypoint position to a nearby existing trackpoint. +If Shift is held at the same time, it will jump the waypoint position to a nearby existing waypoint. + +Right-click on waypoint: opens a menu with waypoint actions (the +same menu accessed by right-clicking the waypoint in the layers panel) + +
+ +
Edit Trackpoint + +Enable this tool by clicking on the toolbar icon: + + +Left click near a trackpoint (in screen pixel terms) to bring up the Track Point Edit dialog on that trackpoint. +Whilst the edit dialog is already open, left click again and drag enables moving of the trackpoint. +If Ctrl is held at the same time, it will jump the new trackpoint position to a nearby existing trackpoint. + +
Edit Trackpoint Dialog + +Editing options in the Trackpoint Edit dialog include: + +Edit the trackpoint name +Changing raw lat/long position and altitude +Forward (go to the next trackpoint) +Back (go to the previous trackpoint) +Delete +Insert. Inserts a point halfway to next trackpoint +Split. + + + +Several fields are read only for reference purposes, values are shown if the trackpoint has such information: + +Time. +Speed and course. +'Between' values: Speed, Time Difference and Distance Difference. When moving between trackpoints (via the Back and Forward buttons) these values are calculated. +GPS precision factors. + + + +
+Trackpoint Edit Dialog: Example + + + +
+One must have been going downhill here to get a reasonable speed by bicycle! +
+
+
+ +
Show Picture + +Enable this tool by clicking on the toolbar icon: + + +Opens an image viewer with the picture associated with the waypoint. +By default this uses the default system image viewer. +For Linux you can override this with the setting in the + +
+ +
+ +
Georef Map Layer Tools + +You must have a Map Layer selected to use these tools. + +
Georef zoom + +Enable this tool by clicking on the toolbar icon: + +Changes the zoom level of the georeferenced map and changes the +&appname; zoom level accordingly. Useful if you are trying to match GPS +data to a georeferenced map. + +
+ +
Georef move + +Enable this tool by clicking on the toolbar icon: + + +Drag to move the georeferenced map. + +
+
+ +
Map Download + +You must have a Layer selected to use this. + + +Enable this tool by clicking on the toolbar icon: + + +Click to download a single tile. Drag to download tiles in the dragged rectangle area. + + +Right-click to redownload tiles via the selected method. Right-click and drag to redownload tiles in the dragged rectangle area by the selected method. +The possible methods to redownload one or more tiles are: + + + + +Bad +Only if the tile is corrupt in some way or missing, then this will download a new copy + + +New +Refresh the tile according to the local map cache and if server has a newer version + + +All +Redownload the tile + + + +Map Tile Information + +By right clicking on viewport and selecting Show Tile Information you can see the tile properties of this location for the current map layer and current zoom level. +This includes the remote source URL for the tile and the cached version on the local filesystem with timestamp details. + + + +
+Map Tile Info Dialog: Example + + + +
+This is using MapQuest at &appname; zoom level 128 over the Isle of Wight, UK. +
+
+ +
DEM Download + +You must have a Layer selected to use this. + + +Enable this tool by clicking on the toolbar icon: + + +Click to download and import a DEM file. + +DEM File Information + +By right clicking on viewport and selecting Show DEM File Infomation you can see the file properties of the DEM file for this location. +This includes the remote source URL for the file and the cached version on the local filesystem with timestamp details. + + + +
+DEM File Info Dialog: Example + + + +
+This is for block 51N, 003W - covering Bristol in the UK. +
+
+ +
Webtools + +Many services are available only via a web browser (Google Maps, OpenStreetMap Potlach editor, etc.). + + +Jumping from &app; to such service can become annoying. + + +&appname; allows you to open such service directly at the position currently viewed in &app;. + + +This feature is called Webtools. It is also known as External Tools. + +
+ +
+ + +
Preferences +
General +
Localisation +You can select units displayed by &appname; to best fit your usage. +
+Properties dialog: units part + + + +
+Concerning degrees, you can select the way to display them: + + +DDDdecimal degree + + +DMMpartial sexagesimal display: degrees, minutes and decimal part of minutes + + +DMSsexagesimal display: degrees, minutes and seconds + + + +
+Properties dialog: degree display options + + + +
+
+
Waypoint Icon Size +An option exists to control the icon (symbol) size used for waypoints + +
+
<emphasis>Home</emphasis> Default Location: Latitude and Longitude +You can set the Home location directly by inputting the latitude and longitude in decimal degrees. + +
+
Time Display +This controls the reference timezone that times are shown in. +Locale is the current user's system preference. This was how all times were shown up to version 1.5. +World will attempt to determine the timezone at an object's position. +UTC enforces this standard timezone. +
+
Tile's age +This age is used to decided wether or not a new request to tile server must be done. + +Changing this value, you will increase or decrese the network load. +
+
Default map layer directory +This property sets the default directory of the tiles cache. +This value is used when you create a new map layer. + +You are still able to change this value in each map layer properties. +
+
Map Cache Memory Size +This controls the amount of maps that are stored in memory, rather than having to reread from disk. +Generally if you have a system with lots of memory it's recommended to increase this value. + +
+
+ +
Export/External +
KML Export Units +Allows setting the units used when saved as the KML file type, such as Metric or Statue units +
+
GPX Track Order + + Other software may display tracks in a particular order (often the order saved into the file). + This allows you to control the order they are saved when exporting to a GPX file. + +
+
GPX Waypoint Symbols +Some GPS devices require waypoint symbols to be in a particular case. +E.g. On a Garmin Oregon 450 they must be in Title Case to be recognized. +
+
Image Viewer (Not Windows) +Allows setting the program used to view images associated with Waypoints. +By default this is set to xdg-open which should open the system's default image viewer, however this can be overridden with this setting. +Note: for Windows systems, viewing images associated with Waypoints always uses the system's default image viewer. +
+
External GPX programs +Allows setting the programs invoked via the Layer menu Export LayerOpen With 'program' +Two options are given so that it can be configured for various uses such as: + +An OSM editor (default) +Some other user defined program + +
+
GPSBabel +This allows setting the specific location of GPSBabel. +&appname; will need to be restarted for this setting to take effect. +
+
Auto Read World Files +If this is on, when a new image is selected for the GeoRef layer then the associated world file will be read to find the scale and positional properties. +The associated file is based on filename patterns; e.g. if the image is filename.jpg - then the world file may be filename.jpgw or filename.jgw +
+
Auto Device GPX Simplify +If this is on, GPX files will be simplified (using GPSBabel) if they are saved into a special location (by default a Garmin device location in OS file system). +Extra parameters used in process such as the location and limits applied can be refined by export_device_* values in . +A warning message is displayed when this occurs so one can consider if manually managing the tracks is needed, e.g. see methods. +The main intention for this is to prevent writing GPX files that are only partially useful. +For instance on a GPS Etrex 20 device: if a track with 1000 points is saved to it, the device will only read in the first 500 points, +thus effectively making only 1/2 of the track available. +Hopefully a simplified track will be more useful to follow to your destination when one is out in the wilds, than only a section of it. + +You will need to set the appropriate limits for your device, as this is not currently auto detected. +
+
+ +
Advanced +
Save File Reference Mode + + Files referenced within project files can be saved with either absolute or relative paths. + Using relative paths can be useful when copying the project file and the associated files between different systems. + +
+
Ask for Name before Track Creation +A setting to control whether an automatic name is used when creating a new track or route, or whether you are asked to enter a name. +
+
Show Tooltip during Track Creation +A setting to control whether the tooltip with the cumulative track or route distance is shown when creating tracks and routes. +
+
The number of recent files + + The number of recent files shown in the FileOpen Recent File menu. + A value of -1 means all files. The new value applies to New Windows only (or on application restart). + +
Open files in selected layer +A setting to control whether non Viking format files (i.e. typically GPX or KML files) will open in the selected TrackWaypoint Layer. +When no TrackWaypoint Layer is selected (or the layer is invisibile) then the file will be open in the default manner: at the top level. + +
+
Show calendar day names +A setting to control whether the calendar displays day names (Mon, Tue, etc...) or not. + +
+
Ruler area label position +A setting to control the position of the label drawn on the viewport that shows the area value. Includes a setting to turn off the label. + +
+
Use Scroll to Zoom +A setting to control if scroll events cause the viewport to zoom (rather than moving). Useful with mouse scroll wheels, but less intuitive for touchpads. + +
+
Invert Scroll Direction +A setting to control the direction of scroll events. Especially useful with touchpads and can be used to override the desktop system's setting. + +
+
+
+ +
OpenStreetMap Traces +
OAuth Method + + Using the OAuth method means that your OSM account details are no longer needed to be known by &appname;. + Instead specific tokens are generated for use only by &appname; which are associated with your OSM account. + +Get New OSM Access Tokens + Use this button to generate a new OSM Access Token Key and Secret. + You will be redirected to the OSM website to confirm allowing &appname; to access the GPX Traces features. + The tokens returned by the OSM website will be stored in the Access Token Key + Access Token Secret preferences. + +Access Token Key + Access Token Secret: +These are the values used, however one typically does not need to manually change them. +
+
HTTP Basic Authentication (Discouraged) +OSM Username + Password +Store your OSM details here, so that you don't need to enter it in every time in the procedure. +This is not recommended and one should use the OAuth method using access tokens described above. + + +Your OSM password will be stored in plain text. + + + + +This password is transferred unencrypted in every request sent to the OpenStreetMap server. This is due to the use of OpenStreetMap's basic authentication method. + + + + +When OAuth capability is built into &appname; (the default), use of HTTP Basic Authentication can only be used if the osm_basic_auth is enabled. + + +
+
+ +
Mapnik + +If any changes to these settings are made, you will need to restart &appname; to make them be applied. + + +
Plugins Directory +The location of Mapnik plugins. An attempt is made to automatically determine the initial value, + however if this is wrong or Mapnik is upgraded then the directory can be set here. +
+
Fonts Directory + +The location of fonts for use with Mapnik. Normally it is best to simply use the System's font directory. + +
+
Recurse Fonts Directory +Load fonts in any sub-directories of the main font directory. +
+
Rerender Timeout +The time in hours before any tile is rerendered. +This is useful in case the underlying source data for the tiles changes (e.g. OSM data is continually evovling). + &appname; normally has no way of knowing when the data has changed, so this simple timeout method is provided to maintain consistency of the tile images. +
+
CartoCSS +This allows setting the specific location of the carto executable. +
+
Threads + + The number of threads to use for Mapnik rendering tasks. + By default the value is set to the 1 in case of any multi-threading rendering code chain crashes. + Otherwise trying setting the value to the number of the CPUs of the system minus one (so as not to overload the system), in order to minimise the overall rendering times. + +
+
+ +
Routing +
Routing engine +You can select the routing engine used by default, ie by features that do not propose a live selection, like . +
+
+ +
Startup +Naturally since these preferences effect the startup, the values will not be used until &appname; is restarted. +
Restore Window Setup +When this is enabled, the main window size and layout (such as whether the statusbar or layers panel are shown) is restored to the values from last use. +
+
Default Map Layer +When this is enabled, a map layer is automatically added whenever &appname; is opened and a &appname; file is not to be loaded. +The map layer used is defined by the map layer's default values. +
+
Startup Method +Enables selection of how the startup position should be determined. + + +Home Location (default) +Position as set by the Set the Default Location + + +Last Location +Uses the last position viewed on the viewport + + +Specified File +Load the file as specified below + + +Auto Location + + Uses the GeoClue service if available + or otherwise the web service hostip.info to attempt to determine your location via IP lookup + + + + +
+
Startup File +Loads this specified file when the Startup method is set to Specified File +
+
Check For New Version +Periodically (no more than once every 14 days), check to see if there is a new version of &appname; available. +
+
+ +
Toolbar +
Append to Menu +Allows setting the toolbar on the same vertical space as the menu, thus increasing vertical space for the map. +
+
Icon Size +Allows configuration of the icon size, including overiding the system's default preference to the setting desired just for &appname;. +
+
Icon Style +Allows configuration of the icon style, including overiding the system's default preference to the setting desired just for &appname;. +
+
Customize +Opens the Customize Toolbar dialog. +From this dialog the items in the toolbar can be added, removed and reordered. Reordering of items is performed by drag and drop. +
+Customize Toolbar dialog + + + +
+
+
+ +
+ + +
Howto's +
Getting Started + +&appname; from version 1.5 has several features to ease the start up process. +On the very first run, you will be asked if you want to enable these features which make use of an Internet connection. +If you select no or you have upgraded from an earlier version you can choose to enable any of the startup options via the . + + +Some other general use cases for using &appname;, are as follows: + +
Go to an area of interest + +&appname;'s default location is a Manhatten, New York, USA, so you may need to pick another place that interests you - such as where you live. + + +Method A + + + Use the online location address/place search. + + + Use the Go to Location toolbar button or from the menus + ViewGo to Location. + You can change the search location provider if desired. + Enter the name of place you wish to go to (you may need to specify the country to refine the search). + Also you can enter a post code or a ZIP code instead. + + + You will need an internet connection for this search to work + + + + +Method B + + + If you know the coordinates of where you want to view: + + +Use View and select from either Go to Lat/Lon or Go to UTM and then enter in the specific coordinates. + + + + +Method C + +Use the GPS Layer or FileAcquireFrom GPS +to load data directly from your GPS into &appname;. + +You can specify the types of data to acquire: Tracks, Routes and/or Waypoints. + + +You must have write permission to the port used. For Unix like OS: + + /dev/ttyS0 is the first serial port + /dev/ttyUSB0 is the first USB port + usb: is any USB port + +Depending on your distribution only one of the USB port types may work +For Windows: + + com1: is the first serial port + usb: is any USB port + + + + The GPS devices supported are those supported by GPSBabel. + Garmin and Magellan GPS devices supported by all versions, later versions of GPSBabel support more devices such as DeLorme and Navilink. + + + + +Method D + + +Get data from files in GPX or KML format, which can be opened directly. +Use FileOpen + + +Other formats can be imported that are supported by GPSBabel. +FileAcquireImport File With GPSBabel... + + + +The viewport will be automatically moved and resized to view the contents of the file. + + + + +
+
Add a Map Layer + +Use LayersNew Map Layer, and choose a suitable cache directory +where you would like to store your tracks and click OK. Zoom to a +comfortable level (I suggest 4 mpp) by clicking the left and right +mouse buttons on the gray area where your tracks are. Now from the menu +choose the Tool. Click where you would like to download a +map. Regardless of what tool you are using, the middle mouse button +always pans. + + +You need an open internet connection when you are downloading maps. + + + +If you can no longer see your tracks or waypoints and only the map, +it is because the layer named Map is ABOVE your TrackWaypoint layer that your GPS data is in. +This means that it will be drawn last and on top of the other . +Look at the to the left which shows this order. +Select the Map layer from the list and click the down arrow button beneath the list until the Map layer is below the TrackWaypoint layer. +Your tracks will now be drawn over the map. + +
+ +
Set Your Home Location + + You can save the current center position of the viewport as the default location AKA the Home Location by + EditSet the Default Location. + + + Then at any time you can return to this place by clicking on the Home icon on the toolbar. + + + You can also set the default location via specifing the exact latitude and longitude in the . + +
+ +
+
From 1st startup to GPS track (including offline maps) + +The first you'll see is an empty map, because &appname; in its default configuration will download maps only on demand. +Before fetching unneeded data, one can position to a location of interest, e.g. Stuttgart: ViewGo to Location, enter Stuttgart. + +
Fetching the maps + +Map + + +LayersNew Map Layer +in the layer properties dialogue choose e.g. OpenStreetMap (Mapnik). + +For the moment, we keep the default Maps Directory (the directory in +which the maps will be stored and can be used for offline usage). + + +Check Autodownload maps and keep the zoom level as Use Viking +Zoom Level. + + +however, that these settings will play an important +role in the pre-fetch for offline usage discussed later + + + + +You'll see a map of Stuttgart. Using the mouse wheel, you can +zoom in and out. The maps for the choosen resolution will be downloaded +automatically. + + +DEM Layer (Height Map) + + +Zoom out to 512. +LayersNew DEM Layer +Keep the download source as is (SRTM Global 90m), hit OK. + + +In the layer listing on the left, the layer should reside +above the map layer. If this is not the case, highlight the DEM layer +an shift it one up (using the arrow up button). + + +highlight the DEM layer in the layer listing on the left +in the toolbar, check DEM layer download/import (the last symbol) +a left-click in the map window should then fetch the DEM data + + +This might take some time. + + +Sometimes, a tile does not show up correctly (you might see only a +black frame in the map window) because it got corrupted during +transfer. In order to correct this, you can delete the corresponding +datafile in the cache. right-click the DEM layer properties + + +The DEM Files listing allows you to delete the specific tiles (alternatively do this from the command line). + + +You can also alter the Min. and Max. elevation in this dialogue. + + +
+
GPS Track with Height Profile + +Uncheck the layer (the map is shown again) + + LayersNew TrackWaypoint Layer + Ensure the new track layer is above the map layer. + +Expand the layer, select Tracks +In the tools menu choose Create Track + +Leftclick in the map window, enter a name + + Click several times to generate a track (a right-click removes the last point). + Height data is set automatically since DEM data is available + +Expand tracks in the layer menu, your track should show up, select it +Right click your track, select Properties +Click the tab Elevation-distance - enjoy the plot + + +In order to save this setting for later usage + + +click OK in the Track Properties dialog +FileSave As, choose a name (you can open this view later via fileOpen). + + +
+
Usecase: offline data for holiday + +Suppose you want to have the and data offline for your holiday in Italy near Bologna. + + +Start a new &appname; session. +ViewGo to Location, enter Bologna +LayersNew Map Layer +Choose e.g. OpenStreetMap (mapnik). +adapt the maps directory e.g. to /home/user/.viking-map-holiday/. +This allows you to delete the map stuff after holiday without purging the rest of your maps. + +check autodownload map +keep viking zoom level +zoom out to 1024 +add a layer (as discussed above) +download the DEM data + +In the &app; version discussed here, the DEM data automatically +are stored in /home/user/.viking-maps/. You can move the corresponding +tiles into .viking-map-holiday/ if you like. + + +Download map data for all zoom levels + + +uncheck the DEM layer for the map to show up +navigate the map to be centered at Bologna +choose the zoom such, that all regions of interest are displayed in the map window (e.g. 1024) + +follow this sequence until you have all tiles for all zoom levels you need + +right-click the map layer properties +set the zoomlevel explicitely one below the last (in the first cycle 512), hit OK +right click the map layer Download Missing Onscreen Maps +wait until all tiles for that resolution have been downloaded + + + +This may take some time and some hard disk capacity. + +Do not forget to save your configuration (as discussed above). + + +
+ +
+
OpenStreetMap project + +OpenStreetMap (OSM) is a collaborative project to create a free editable map of the world. +One of the sources of data for this project is GPS tracks. +&appname; supports this project via the GPS Traces methods, both uploading and downloading such data. + + + Authentication/authorization is required to use these services. See . + + +Also see for further detail. + +
Uploading data to OpenStreetMap + +It is possible to upload data directly from &appname; to OpenStreetMap. + + +Upload a layer + +One solution is to upload whole a layer. To do this, +simply select the layer and right click on it. Then, select Upload to +OSM. + + + +Upload a single track +Another solution is to upload an individual track. Simply select the track and right click on it. +Then select Upload to OSM. + + + +Fill in the form + +The filename is the name you want your upload has on the server. This information is displayed by the osm server. +The description is some descriptive information. +The tags field is a white space separated list of tags. + + +
+ +
Downloading Traces from OpenStreetMap + +It is possible to download GPS traces directly from OpenStreetMap into &appname;. +This feature can be really useful for checking existing data before uploading new ones. + + +Download all visible tracks +One solution is to select + +File +Acquire +OSM traces... +. +Each request can get up to 5,000 points. +The dialog box allows setting which group of 5,000 points to get. These groups are known as Page Numbers which start at 0. +Increasing the page number parameter allows one to request the subsequent sets of point groups. + + +
+
Downloading Your Own Traces from OpenStreetMap + +It is possible to download any of your personal GPS traces previously uploaded to OpenStreetMap into &appname;. + + +Initially this will return the list of your OSM Traces, from which you can select which specific traces to retrieve. +This list can be sorted on each column so that it easier to find an individual trace or select a group of traces by similar properties. + +
+ +
+ +
Geotagging + + This assumes you already have a layer enabled for ease of use (if not see above to get one). + +
Manual Positioning + + This is useful for instances when you already know exactly where the image was taken (no need for tracklog). + Or maybe you want to adjust an automatically generated waypoint for the position of the subject of the image rather than the location that the photograph is taken from. + ATM this process only works on an individual image, so it will be tedious for handling lots of images. + + + First create a layer or use an existing one; and select it in the . + NB Make sure this layer is above the map layer in the Layers Panel list. + Create a new waypoint (or move an existing one) to exact location desired: + + Select the tool, then left click on the map at the location desired, choosing an image to associate with it in the new waypoint dialog + Select the tool, then left click on waypoint to be moved. Left click again and drag the waypoint to the location desired + + Then using the Select tool left click on waypoint to select it, then right click to access the Waypoint properties menu, then choose + Update Geotag on ImageUpdate + + + The Update Geotag on Image options are only available when a waypoint has an image associated with it. + +
+ +
Automatic Positioning Against a Tracklog + + First you will need a tracklog with timestamps in it. Either load one from a previously saved file or freshly acquired from a GPS device - + see Getting Started. + It helps if this is the track that was recorded at the time you took some photographs! + + + Select the track either from the layers panel on the left or via the viewport using the tool. + Then right click on it and chose the Geotag Images... leading you to the Dialog. + + + Load some images that where taken around the time the track log was recorded. Confirm the other options in the dialog - normally the defaults should be alright and select OK. + If things are succesful, new waypoints with thumbnail images of the photographs will appear. + You should probably check they are really in the right place as often the timestamp of the camera may not be aligned to the GPS correctly leading to inferring incorrect locations. + +Option: Overwrite Waypoints + + This is particularly useful when one finds an attempt at geotagging gives wrong locations, often due to time offset issues. + Simply try again with a new time offset (often 1 hour adjustments due to Daylight Savings or Summer Time times) and the old waypoints will be updated (instead of creating new ones). + + + + If you have multiple tracks in a TrackWaypoint layer, then invoking the Geotag Images... action on the layer + will search all the tracks to find location matches. + +
+
+ +
GPS Real Time Location + + &appname; relies on gpsd to provide the current location from a real time feed from a GPS device. + + + This assumes you already have a layer enabled for ease of use (if not see above to get one). + + + Turn on the GPS Device, ensure it has figured out it's location and plug it in to your computer. + +
Set Up GPS Layer + + You will need a layer. One can be added via LayersAdd GPS Layer. + + + Adjust the Realtime Tracking Mode settings to interface with gpsd as necessary. Normally the defaults should suffice. + + + Current Linux distributions should run gpsd automatically when a GPS Device is plugged in. Otherwise you may have to run gpsd manually. + + + Then right-click the layer and select Start Realtime Tracking. + Hopefully the viewport should jump to the GPS location. + + + Troubleshooting checklist: + +Confirm gpsd is running. +Confirm on the GPS device it has a location. +Confirm the Realtime Tracking Mode settings. +
+
+ +
What to Do if &appname; Does Not Seem to Work + +In order to get some information about what &appname; is doing, start it in verbose debug mode via the command line: +viking -dV + + +NB For Windows the process is slightly more involved as the output is typically not shown in the command prompt, +so you have to redirect the output to a file, e.g. open the command prompt and then: + +cd "C:\Program Files\Viking" +viking -dV 2>1 > %TMP/viking.log + +Then close &appname; before viewing the output file, such as: +notepad %TMP/viking.log + + +For instance you can check the correct URLs &appname; is using in requesting remote data for DEMs or map tiles in the verbose debug output. +E.g. Something like this for DEMs: + +** (viking:28778): DEBUG: curl_download_uri: uri=http://dds.cr.usgs.gov/srtm/version2_1/SRTM3/Eurasia/N48E008.hgt.zip +* About to connect() to dds.cr.usgs.gov port 80 (#0) +* Trying 152.61.128.95... * connected +* Connected to dds.cr.usgs.gov (152.61.128.95) port 80 (#0) + GET /srtm/version2_1/SRTM3/Eurasia/N48E008.hgt.zip HTTP/1.1 +User-Agent: viking/0.9.8 libcurl/7.18.2 GnuTLS/2.4.2 zlib/1.2.3.3 libidn/1.8 +Host: dds.cr.usgs.gov +Accept: */* + HTTP/1.1 200 OK + Date: Sun, 26 Jul 2009 18:13:38 GMT + Server: Apache + Last-Modified: Tue, 21 Jul 2009 19:57:35 GMT + ETag: eac3f8-1828f5-46f3caa76070a + Accept-Ranges: bytes + Content-Length: 1583349 + Content-Type: application/zip + +* Connection #0 to host dds.cr.usgs.gov left intact +* Closing connection #0 +** (viking:28778): DEBUG: dem_layer_add_file: /home/username/.viking-maps/srtm3-Eurasia/N48E008.hgt.zip + +Or for OSM Mapnik tile server: + +* About to connect() to tile.openstreetmap.org port 80 (#0) +* Trying 193.63.75.28... * connected +* Connected to tile.openstreetmap.org (193.63.75.28) port 80 (#0) + GET /13/4065/2748.png HTTP/1.1 +User-Agent: viking/0.9.96 libcurl/7.20.1 GnuTLS/2.8.6 zlib/1.2.3.4 libidn/1.18 +Host: tile.openstreetmap.org +Accept: */* + +* HTTP 1.0, assume close after body + HTTP/1.0 200 OK + Date: Thu, 14 Oct 2010 22:18:42 GMT + Server: Apache/2.2.8 (Ubuntu) + ETag: "b66ff9d46474bab68262a3483428a232" +** (viking:16704): DEBUG: curl_get_etag_func: ETAG found: "b66ff9d46474bab68262a3483428a232" + Content-Length: 17194 + Cache-Control: max-age=94805 + Expires: Sat, 16 Oct 2010 00:38:47 GMT + Content-Type: image/png + Age: 5153 + X-Cache: HIT from konqi.openstreetmap.org + X-Cache-Lookup: HIT from konqi.openstreetmap.org:3128 + Via: 1.1 konqi.openstreetmap.org:3128 (squid/2.7.STABLE7) + Connection: close + +* Closing connection #0 +* About to connect() to a.andy.sandbox.cloudmade.com port 80 (#0) +* Trying 178.63.75.195... ** (viking:16704): DEBUG: curl_download_uri: uri=http://tile.openstreetmap.org/13/4065/2749.png +* About to connect() to tile.openstreetmap.org port 80 (#0) +* Trying 193.63.75.28... * connected +* Connected to a.andy.sandbox.cloudmade.com (178.63.75.195) port 80 (#0) + GET /tiles/cycle/13/4065/2747.png HTTP/1.1 +User-Agent: viking/0.9.96 libcurl/7.20.1 GnuTLS/2.8.6 zlib/1.2.3.4 libidn/1.18 +Host: a.andy.sandbox.cloudmade.com +Accept: */* + +* connected +* Connected to tile.openstreetmap.org (193.63.75.28) port 80 (#0) + GET /13/4065/2749.png HTTP/1.1 +User-Agent: viking/0.9.96 libcurl/7.20.1 GnuTLS/2.8.6 zlib/1.2.3.4 libidn/1.18 +Host: tile.openstreetmap.org +Accept: */* + +* HTTP 1.0, assume close after body + HTTP/1.0 200 OK + Date: Thu, 14 Oct 2010 23:44:35 GMT + Server: Apache/2.2.8 (Ubuntu) + ETag: "8e520ad47ce9c1b63430554886eb5fab" +** (viking:16704): DEBUG: curl_get_etag_func: ETAG found: "8e520ad47ce9c1b63430554886eb5fab" + Content-Length: 18094 + Cache-Control: max-age=87742 + Expires: Sat, 16 Oct 2010 00:06:57 GMT + Content-Type: image/png + X-Cache: MISS from konqi.openstreetmap.org + X-Cache-Lookup: MISS from konqi.openstreetmap.org:3128 + Via: 1.1 konqi.openstreetmap.org:3128 (squid/2.7.STABLE7) + Connection: close + + +
+ +
+ + +
+ Extending Viking + + Currently, &app; has some extention points based on configuration files. The file format is heavily inspired by the GtkBuilder file format: you specify the class of the GObject to build and set its properties. Technically, it is a XML file containing a "objects" root element. Inside this element, you set a collection of "object". + Here is an example: + + + Property value + Property value + + ... + +]]> + + + You can find more examples in the documentation part of the distribution. + + It is also possible to override the internal defaults e.g. to update any parameters should they change over time, + by adding the values into your configuration file. + When you define object group that already exists (and for Maps this means by a repeated Id key, but you may have to examine the source code to work out what the relevant Id values are) then you need to define all the other keys as well, otherwise they will be reset to the defaults. + +
+ Map Source + It is possible to add new map's sources. The file is ~/.viking/maps.xml for UNIX like systems, C:\Documents and Settings\username\.viking\maps.xml on Windows XP or C:\Users\username\.viking\maps.xml on Windows 7 onwards. + An example of the file is in the distribution doc/examples/maps.xml. Further examples and values are online in the Maps Wiki + + The VikSlippyMapSource allows to declare any map's source working like OpenStreetMap. It supports the following properties: + + + id + this is an integer and should be unique as it used to identify the map source + + + name + a string (should be unique) that is used for the OSM style cache directory name when the Map Cache directory is the default (~/.viking-maps) + + + label + the text displayed in the map's source selection dialog + + + hostname + the server's hostname (eg. "tile.openstreetmap.org") + + + url + + the parametrized address of the tile, in the spirit of C printf format, with 3 "%d" fields for Z, X and Y (in that order) (eg. "/%d/%d/%d.png") + + The full parametrized address can just be put in the URL field and the hostname field doesn't need specifying. + e.g. "https://tile.openstreetmap.org/%d/%d/%d.png" + + + + + zoom-min (optional) + The minimum zoom value supported by the tile server. The Default is 0 if not specified. + + + zoom-max (optional) + + The maximum zoom value supported by the tile server. The Default is 18 if not specified. + See Zoom Levels + + + + lat-min (optional) + The minimum latitude value in degrees supported by the tile server. The Default is -90 degrees if not specified. + + + lat-max (optional) + The maximum latitude value in degrees supported by the tile server. The Default is 90 degrees if not specified. + + + lon-min (optional) + The minimum longitude value in degrees supported by the tile server. The Default is -180 degrees if not specified. + + + lon-max (optional) + The maximum longitude value in degrees supported by the tile server. The Default is 180 degrees if not specified. + + + file-extension (optional) + + The file extension of the files on disk. The default is .png + If the tile source URL ends in something other than .png, then this parameter will need to match it. + This can also be useful in reading a tileset from other software which may name tiles in an alternative form, + e.g. for Mobile Atlas creator it names them .png.tile + The file types actually usable are those supported by GDK Pixbuf Library, which includes at least PNG and JPEG. + Remember to include the beginning '.' when specifying this parameter. + + + + use-direct-file-access (optional) + + Only use files on disk. The default is FALSE + This can also be useful for tilesets already on disk as it will avoid attempting to download any tiles. + Thus with this type the hostname and url parameters are not necessary and are ignored. + + + + switch-xy (optional) + + Swap the X,Y values around in the URL parametrized ordering. + The default is false. + + + + check-file-server-time (optional) + + Sends the timestamp of the tile to the server, so the server can decide whether it should send a new tile or not. + The default is false. + + + + use-etag (optional) + + Use and compare the ETag value in determining whether to download a newer tile. The default is false. + The ETag value is stored in a separate file in the same directory as the tile to enable checking the value across multiple runs of the program. + + + + tilesize-x (optional) + The tile x size. The default is 256 pixels if not specified. + + + tilesize-y (optional) + The tile y size. The default is 256 pixels if not specified. + + + scale (optional) + + The tile scale. The scale is 1 if not specified. + Use a value of 2 to represent high res tiles. + Don't change the tilesize as the internal display size is still based on 256 pixels. + + + + + + The VikTmsMapSource allows to declare any TMS service. It supports the following properties (as per VikSlippyMapSource above): + + + id + + + label + + + hostname + + + url + + + check-file-server-time (optional) + + + zoom-min (optional) + + + zoom-max (optional) + + + lat-min (optional) + + + lat-max (optional) + + + lon-min (optional) + + + lon-max (optional) + + + + The VikWmscMapSource allows to declare any WMS or WMS-C service. It supports the following properties (as per VikSlippyMapSource above): + + + id + + + label + + + hostname + + + url + + + check-file-server-time (optional) + + + zoom-min (optional) + + + zoom-max (optional) + + + lat-min (optional) + + + lat-max (optional) + + + lon-min (optional) + + + lon-max (optional) + + + +
+ +
+ Go-to search engines + It is possible to add new new search engines for the "Go-To" feature. The file is ~/.viking/goto_tools.xml. + An example of the file in the distribution doc/examples/goto_tools.xml. + Currently, there is a single object class available: VikGotoXmlTool. Such feature allows to declare any search engine using a XML format as result. + The related properties are: + + + label + the text displayed in the Go-To dialog + + + url-format + the parametrized address of the query, in the spirit of C printf format, with a single "%s" field (replaced by the query string) + + + lat-path + XML path of the latitude (eg. /root/parent/elem) + + + lat-attr (optional) + name of the attribute (of previous element) containing the latitude + + + lon-path + XML path of the longitude (eg. /root/parent/elem) + + + lon-attr (optional) + name of the attribute (of previous element) containing the longiude + + + + As a facility (or readability) it is possible to set both path and attribute name in a single property, like an XPath expression. To do so, simply set both info in lat-path (or lon-path) in the following format: /root/parent/elem@attribute. +
+ +
+ External tools + It is possible to add new external tools. The file is ~/.viking/external_tools.xml. + An example of the file in the distribution doc/examples/external_tools.xml. + The VikWebtoolCenter allows to declare any Webtool using a logic based on center coordinates and zoom level value. + The related properties are: + + + label + the text displayed in the menu entry + + + url + the parametrized URL to open, in the spirit of C printf format, with 2 "%s" and a "%d" fields for X, Y and Z (zoom level) (eg. "http://hostname/?lat=%s&lon=%s&zoom=%d") + + + + The VikWebtoolBounds allows to declare any Webtool using a logic based on bounds coordinates. + The related properties are: + + + label + the text displayed in the menu entry + + + url + the parametrized address of the tile, in the spirit of C printf format, with 4 "%s" fields for left, right, bottom and top (eg. "http://hostname:8111/load_and_zoom?left=%s&right=%s&bottom=%s&top=%s") + + + +
+ +
+ Routing engine + It is possible to declare new routing engines. The file is ~/.viking/routing.xml. + An example of the file in the distribution doc/examples/routing.xml. + The VikRoutingWebEngine allows to declare a routing engine available via HTTP. + The related properties are: + + + id + a string, should be unique as it used to identify the routing engine + + + label + the text displayed in the menu entry + + + format + + The GPSBabel format code to interpret the service response. By default a GPX response is expected and processed internally. However if the service returns different format then GPSBabel is used to transform the text into something that &appname; can understand. Only formats that GPSBabel supports can be used: e.g. 'gpx', 'kml', 'gtrnctr' (for Garmin Training Center .tcx files), etc... + Use gpsbabel --help on the command line to find out the supported file types and their codes to process them. + + + + url-base + the base URL of the web service (eg. "http://hostname/service?") + + + url-start-ll + the part of the URL setting the starting point location, parametrized in the spirit of C printf format, with 2 "%s" for coordinates (eg. "&start=%s,%s") + + + url-stop-ll + the part of the URL setting the end point location, parametrized in the spirit of C printf format, with 2 "%s" for coordinates (eg. "&stop=%s,%s") + + + url-via-ll (optional) + the part of the URL setting via point location, parametrized in the spirit of C printf format, with 2 "%s" for coordinates (eg. "&via=%s,%s") + + + url-start-dir (optional) + the part of the URL setting the starting point location for direction based routing, parametrized in the spirit of C printf format, with one "%s" for direction (eg. "&start=%s") + + + url-stop-dir (optional) + the part of the URL setting the end point location for direction based routing, parametrized in the spirit of C printf format, with one "%s" for direction (eg. "&start=%s") + + + url-ll-lat-first (optional) + The ordering of the lat/long terms in the Start, Stop and Via URL settings. By default this is TRUE. + For instance using Brouter services, the URL uses a pair of values which is longitude and then latitude. Thus setting this value to FALSE ensures the value substitution is performed in the necessary order. + + + referer (optional) + A URL to serve as referer for the HTTP request (eg. "http://hostname/") + + + follow-location (optional) + the max depth of recursive redirections + + + +
+ +
+ Remote File Datasources + It is possible to add web references expected to return a file which can then be opened directly or converted via GPSBabel. + The file is ~/.viking/datasources.xml. + An example of the file is in the source distribution doc/examples/datasources.xml. + The VikWebtoolDatasource allows to declare any URL using logic based on coordinates. + The related properties are: + + + label + the text displayed in the menu entry + + + url + + the parametrized URL to open in the spirit of C printf format, with up to 9 "%s" values. e.g. http://hostname/getfile?lat=%s&lon=%s + The order and meaning of these parameters is given by the url_format_code below + + + + url_format_code + + A string describing the parametrized URL substitution parameters, each character represents how to translate each term. + B = Bottom of the current view i.e. minimum latitude + L = Left of the current view i.e. minimum longitude + T = Top of the current view i.e. maximum latitude + R = Right of the current view i.e. maximum longitude + A = center lAtitude of the current view + O = center lOngitude of the current view + Z = OSM Zoom value of the current view. See Zoom Levels + P = selected Point's latitude + N = selected poiNt's longitude + S = A user specified input string requested from the user via a dialog box + Thus for the url example above then the format code should be AO + + + + file_type + + This value is passed on for the -i parameter in interfacing with GPSBabel. + If it is not defined then the returned file is interpreted internally as a GPX file. + Possible values such as 'kml', 'mapsource' etc.. can be used. See GPSBabel File Formats for the full list. + + + + babel_filter_args + + This value is passed on for the filter arguments interfacing with GPSBabel. + E.g. "-x nuketypes,routes" can be used to filter all routes from the results. + + + + input_label + + This value is used when requesting input from the user. + It is the label of the text input box. + + + + +
+ +
+ System Extension File Locations + Note that, on UNIX like systems, the extension files (&extfiles;) are also searched in /etc/viking and /usr/share/viking directories (or related in your system). + The XDG_DATA_DIRS environment variable can be used to change these directories. + The XDG_DATA_HOME environment variable is also used (if set) to look for these extension files. +
+ + +
+ Miscellaneous Settings + Various individual values are automatically saved between &app; sessions in the ~/.viking/viking.ini file. + This file is not intended to be manually edited, but since it is a plain text file it can be changed if desired. + Some values in this file are read only, in the sense that there is no way to set it other than by manually entering in the keys and values (the key will not exist in the file otherwise). This allows some fine tuning of &app; behaviours, without resorting to recompiling the code. However is it not expected that these values should need to be changed for a normal user, hence no GUI options for these have been provided. + Here is the list of the read only keys and their default values. + + + curl_cainfo=NULL + See CURLOPT_CAINFO + + + curl_ssl_verifypeer=1 + See CURLOPT_SSL_VERIFYPEER + On Windows this is defaulted to 0 to get HTTPS connections to at least work, + otherwise any attempts at verifying always fail. + [Some incompatibily is suspected in the reliant binary DLLs] + + + geoclue_accuracy_level=4 + Set the integer value for the accuracy level request to the GeoClue service. Values to match the GClueAccuracyLevel: + + 0 = GCLUE_ACCURACY_LEVEL_NONE + 1 = GCLUE_ACCURACY_LEVEL_COUNTRY + 4 = GCLUE_ACCURACY_LEVEL_CITY + 5 = GCLUE_ACCURACY_LEVEL_NEIGHBORHOOD + 6 = GCLUE_ACCURACY_LEVEL_STREET + 8 = GCLUE_ACCURACY_LEVEL_EXACT + + + + gpx_tidy_points=true + ATM Only attempts to remove a suspicious first point of a GPX track + (as opposed to any points within a track). + + + gpx_tidy_points_max_speed=340 + Over this speed (in metres per second) for the first pair of points - the first point is removed. + + + layers_create_trw_auto_default=false + Create new TrackWaypoint layers without showing the layer properties dialog first. + + + layers_panel_calendar_markup_mode=3 + 0=No markups. 1=Day marked. 2=Day marked and tooltips created. 3=Auto (timed tooltip creation, so if too slow it reverts to 1) + + + maps_max_tiles=1000 + + + maps_min_shrinkfactor=0.0312499 + + + maps_max_shrinkfactor=8.0000001 + + + maps_real_min_shrinkfactor=0.0039062499 + + + maps_scale_inc_down=4 + + + maps_scale_inc_up=2 + + + maps_scale_smaller_zoom_first=true + + + srtm_http_base_url=https://dds.cr.usgs.gov/srtm/version2_1/SRTM3 + Allows using an alternative service for acquiring DEM SRTM files. + Note that the layout on the server needs to be split into Continent directories. + + + mapnik_buffer_size=128 (in pixels) + + + osm_basic_auth=false + Set to true to force the use of HTTP Basic Authenication even when OAuth is available + + + background_max_threads=10 + + + background_max_threads_local=Number of CPUs + + + window_default_tool=Pan + Options are: Pan, Zoom, Ruler or Select + + + window_menubar=true + + + window_copy_centre_full_format=false + + + version_check_period_days=14 + + + trackwaypoint_start_end_distance_diff=100.0 + + + gps_statusbar_format=GSA + This string is in the Message Format Code + + + geoclue_statusbar_format=SA + This string is in the Message Format Code + + + trkpt_selected_statusbar_format=KEATDN + This string is in the Message Format Code + + + utils_nearest_tz_factor=1.0 + + + viewport_history_size=20 + + + viewport_history_diff_dist=500 + In metres. + + Go Back or Go Forward requests over this range from the last history location will move back to that position. + If within this range it will skip over this location and move on to the next saved history location. + + + + viewport_scale=1 + + If Viking doesn't automatically detect a high resolution display, you can force the setting here - typically by setting this to 2. + + + + external_diary_program=rednotebook + Or in Windows it uses C:/Progra~1/Rednotebook/rednotebook.exe - This string value must use Unix separators and not have spaces. + + + external_astro_program=stellarium + Or in Windows use C:/Progra~1/Stellarium/stellarium.exe - This string value must use Unix separators and not have spaces. + Needs to be version 0.15.0 or greater (otherwise due to this Bug means this does not actually work). + + + external_text_program=gedit + Or in Windows it uses notepad - This string value must use Unix separators and not have spaces. + + + bfilter_simplify=100 + + + bfilter_compress=0.001 + + + list_date_format=%Y-%m-%d %H:%M + A date format description as passed on to strftime(). + Note that when displayed in tables sorting by this column simply uses the text value, rather than the underlying date/time value. + + + + export_device_path=OS Specific + UNIX = "/media/user/GARMIN/Garmin/GPX" + WINDOWS = ":/Garmin/GPX" + + + export_device_trackpoint_limit=10000 (Typical Garmin Edge limit) + Older Garmins limits are typically much lower - Etrex 20/30 is 500 + + + export_device_routepoint_limit=250 + + + kmz_default_maps_dir=Empty + You may want to use something like: "/media/user/GARMIN/Garmin/CustomMaps" + + + +
+ Message Format Code + Currently for ease of implementation the message format code is a string of characters. + Each character represents what should be inserted in relation to a Trackpoint. + One day it might evolve into something more user friendly with a frontend to control it, perhaps allowing arbitary text too. However for now at least some control is offered :) + + + + Character Code + + G = Some text to display at the start of the message - GPSD + K = Some text to display at the start of the message - Trkpt + A = Altitude of a Trackpoint + S = Speed of a Trackpoint + B = Vertical Speed (Climb) + C = Course of a Trackpoint + L = Location of a Trackpoint + T = Time of a Trackpoint + M = Time diff of a Trackpoint from the previous trackpoint + X = Number of satellites used in the trackpoint fix + D = Distance of the trackpoint from the start of a track (following along the track) + F = Distance of the trackpoint from the finish (end) of a track (following along the track) + P = Distance difference of the trackpoint from the previous trackpoint + N = Name of track to which the trackpoint belongs + E = Name of the trackpoint + + + + Output Notes + + If the output has * after it, then the value has been calculated via interpolation (such as speed when the Trackpoint does not contain a speed value). + If the output has ** after it, then difficulties were encountered in trying to work out the value so probably a default of 0 will be shown. + + + + +
+ +
+ +
+ Keyboard Shortcuts (Accelerator) Settings + This is held in the file ~/.viking/keys.rc + It is in the standard GTK Accelerator map format. Values are automatically read in and saved between &app; sessions. + This file is not intended to be manually edited, but since it is a plain text file it can be changed if desired. +
+ +
+ + + + + + + + +
diff --git a/help/C/legal.xml b/help/C/legal.xml index 312c12e..5d73dc0 100644 --- a/help/C/legal.xml +++ b/help/C/legal.xml @@ -6,7 +6,7 @@ by the Free Software Foundation with no Invariant Sections, no Front-Cover Texts, and no Back-Cover Texts. You can find a copy of the GFDL at this link or in the file COPYING-DOCS + url="help:fdl">link or in the file COPYING-DOCS distributed with this manual. This manual is part of a collection of GNOME manuals diff --git a/help/C/viking.xml b/help/C/viking.xml deleted file mode 100644 index 3acc3af..0000000 --- a/help/C/viking.xml +++ /dev/null @@ -1,4151 +0,0 @@ - - - Viking"> - - - - maps.xml, goto_tools.xml, datasources.xml, external_tools.xml, routing.xml"> -]> - - -
- - &app; Manual - - &app; is a free/open source program to manage GPS data. - - - - 2013 - Guilhem Bonnefille - Rob Norris - - - - - GNOME Documentation Project - - - - - - - - Guilhem - Bonnefille - - - Rob - Norris - - - - username: - Alexxy - - - username: - Vikingis - - - username: - Tallguy - - - username: - EliotB - - - Alex - Foobarian - - - - - - - &appname; Manual V&manrevision; - &date; - - Guilhem Bonnefille guilhem.bonnefille@gmail.com - Rob Norris rw_norris@hotmail.com - GNOME Documentation Project - This document was generated on . - - - - - This manual describes version &appversion; of &appname;. - - - Feedback - To report a bug or make a suggestion regarding the &app; application or - this manual, follow the directions in the - Feedback section of the GNOME User Guide. - - - - - - &app; - - -
- Introduction - -&appname; aims to be easy to use, yet powerful in accomplishing a wide -variety of tasks. Some of the things you can use &appname; for are: - - - -Uploading and downloading waypoints, tracks and routes to/from GPS. - - - -Preparing tracks, routes and waypoints for trips using maps from services such as OpenStreetMap (OSM). -The data is only needed to be uploaded to your GPS before you leave. -The maps together with your tracks, routes and waypoints can also be printed and used during the trip. - - - - -After trips, tracks and waypoints from GPS can be downloaded, stored, managed and reused in your (or your friends') later trips. - - - - -Analyzing Off Highway Vehicle (OHV) and hiking trips, understanding where you went and how far you were from something. - - - -Making waypoints, tracks and routes to follow to easily get someplace -you've never been before or don't have GPS data for but online -maps exist for it. - - - - -Making maps with using Mapnik. -Not on Windows at the moment. - - - - -Grouping data from multiple trips using a hierarchical data manager. - - - - -Analyzing speed at different places (to some degree), adding waypoints where you forgot to mark one but did slow down or stop. - - - - -Downloading and storing OpenStreetMap and/or other map types on your hard drive and looking at them later. - - - - -Editing routes or tracks and their trackpoints, joining and splitting up tracks and routes. - - - - -Show the live GPS position on the map (for use on a mobile device - e.g. a laptop). Not Windows at the moment. - - - - -Import and export track, route and waypoint files of various types via GPSBabel - - - -Previously on Windows, GPSBabel was distributed with &appname;, but this no longer the case. - - -It can be downloaded from its website . - - - - - -View, create and update Geotagged Images (using EXIF data). - - - - - -&appname; is under continual improvement: see the the Roadmap / Wishlist: - - -
-Screenshot: OSM Cycle Map and Many Tracks - - - -
- - - The Windows build of Viking does not currently support verification of https connections. - - -
- -
General Concepts -
Layers - -Layers is concept one may know from powerful graphics editors such as Photoshop or GIMP. -Instead of putting all the data on the same level, it is stacked (i.e. layered) with different data over one another. -This can be useful for analysis and general handling of various sets of data. - - -Unfortunately the downside of this complexity is remembering how differing layers of data can obscure other data. - - -The Map layers have Alpha Compositing, -to create the appearance of partial transparency. -By controlling this value one can see data below it in the layer heirarchy for interesting effects. - -
-
Layers Panel - -The panel on the left is called the layers panel. -It determines which layers and sublayers (such as tracks and waypoints) -are shown, and the order in which they are drawn. Layers on the -top of the layers panel list are drawn last. You can change the order by -drag and drop, or by selecting a layer and using the up and down -buttons at the bottom of the layers panel. - - - The panel also contains a calendar to show when Layers occurred. - Double clicking on the day will select and move the viewport display to that layer. - Right clicking brings up a menu from which you can select to go to the previous or next layer in time. - -
-
Viewport - -The main &appname; area where the layer data is drawn, is called the viewport. - -
-
Track Graphs - -Below the viewport can be shown track (and route) elevation/distance and time/speed (tracks only) graphs of the selected item. -These are the same graphs as shown in . -The graphs will automatically hide itself when nothing or no suitable item is selected. - - -Moving the mouse pointer over the graphs will show a tooltip readout of the nearest trackpoint. -Similarily to the track properties graphs, left clicking will center the viewport on the trackpoint. -A right click menu offers controls of the drawing options, a subset of track operations and access to further information dialogs. - -
-
Statusbar -This provides a readout of various information: - -The currently selected (mouse pointer) tool -The number of items to process in the background - normally this the number in the map tile download queue -The zoom factor -The location of the mouse pointer (and potentially height information if DEM data is available) - -When creating a track/route, the statusbar also displays some information about the track/route. -
-Statusbar - - - -
-This part of the statusbar displays: - -The total distance of the track/route (including currently edited segment). -The bearing of the currently edited segment. -The distance of the currently edited segment. - - -For convenience, a zoom selector can be opened from the status bar. Simply left-click on the zoom factor. -
- The zoom selector available from status bar - - - -
-
- -
Toolbar -The toolbar is an area for buttons that perform common actions. -Some actions are modal, so the appropriate layer needs selected before these toolbar buttons are enabled. See more detail. -The display of the toolbar is influenced by the -Right clicking on the toolbar and selecting Customize allows jumping to the directly. -
- -
Projections - -&appname; supports differents projections: - - -UTM - - -LatLon (also called EPSG:4326) - - -Mercator (also called Spherical Mercator) - - - -
- -
Map Cache - -&appname; stores downloaded map tiles to disk for a couple of reasons: - - -Enables off line usage -Reduces loading on the map tile provider - - -The &appname; automatic caching strategy is two fold: - - - - - If the age of the tile on disk is less than the specified tile age (see ), - it will not attempt to contact the server to get a new version of the tile. - - - - - When the tile age has expired &appname; will attempt a refresh update, so that it provides the cached tile generation timestamp so the server can determine if a new tile image needs to be returned. Not all map types support this refresh method. - - - - - You can override the caching scheme by using right-click on the Map on the layers panel and selecting Redownload All Onscreen Maps, or Ctrl+F5 for the top most map displayed. This will get the latest version held by the server. - - - - This can be useful if you contribute to OpenStreetMap and wish to see your modifications (of course give time for the server to have processed your changes - see I have made edits but they don't show up on the map) - - - - -The layout of the cache on disk itself can be controlled via a per Map Layer property. - -Viking - Legacy default in a private cache layout scheme -OSM - Newer available default (1.6+) - -This is to increase the compatibility between &appname; and similar applications that cache tiles on disk so that the tiles can be shared. - - - - - -
- -
Shortcut Keys - -&appname; has several shortcut keys or key combinations for commands as listed in the main window along side the command. - - -By default some function keys follow standard GUI behaviour: - - -F1 Help (view this manual) -F5 or Ctrl+R Refresh the maps on screen -F10 Select the Menubar (in built behaviour) -F11 Full Screen -Ctrl+F5 or Ctrl+Shift+R Redownload the maps on screen - - - -Refresh attempts to get new maps only if the local tile cache time period has expired for any particular map tile. -Redownload gets all on screen maps from the server, ignoring the local tile cache. - - - -Other function keys control turn on/off visibility of various elements: - - -F3 Toggle visibility of the Toolbar -F4 Toggle visibility of the Menubar -Shift+F5 Toggle visibility of the Scale indicator on the viewport -F6 Toggle visibility of the Center Crosshairs on the viewport -F7 Toggle showing selected items (e.g. tracks or waypoints) in the highlight colour in the viewport -Shift+F8 Toggle visibility of the calendar -Shift+F9 Toggle visibility of the Layers Panel buttons -F9 Toggle visibility of the Layers Panel -F12 Toggle visibility of the Statusbar -Shift+F12 Toggle visibility of the Track Graphs - - -Standard shortcuts are provided for normal GUI operations: such as creating new files, opening, saving and exitting. -Then there are shortcuts specific to &appname; to switch projection modes, zoom in/out, create layers,switch the active tool mode and move the map: - -Ctrl+Up Pan the viewport North -Ctrl+Right Pan the viewport East -Ctrl+Down Pan the viewport South -Ctrl+Left Pan the viewport West -Ctrl+Keypad+ Zoom In -Ctrl+Keypad- Zoom Out - -These work irrespective of the mode selected -For other combinations see the menu entry themselves. - -
- -
-Keyboard Configuration -Keyboard configuration is supported by the standard GTK+ way of changing shortcuts for menu entries. -Hover over the menu option with the mouse pointer and press the keyboard shortcut you want to bind it to. -To delete a keyboard assignment, press Backspace whilst over the menu entry. - - - If the keyboard shortcut is already in use you will not receive any notification that new action replaces the old action. - This is probably why most distributions have this facility disabled by default. - Thus you will need to enable Editable menu accelerators for your system. - Check the Desktop Menu and Toolbar Control or other User Interface preferences for this setting. - - - - - For Windows systems this can be done by adding the line gtk-can-change-accels=1 to %USERPROFILE%\.gtkrc-2.0 (create the file if it does not exist). - - -From &app; 1.6+ the keyboard configuration is automatically loaded and saved between sessions in the -
- -
Tracks vs Routes - -In theory a route is path you are planning to follow and a track is of where you have actually been. The GPX specification splits these into two separate categories, although tracks contain everything route may have. - - -Q. When planning a route what difference does it make if it's a route or a track? - - -A. One difference is in how a GPS device navigates following the route or track. -The capability, the options and data on a particular device also effect how the navigation is performed. -Often the how a device actually works doesn't seem to be formally documented by the manufacturer (and can be firmware dependent too). -Web searches can reveal people's experiences with specific devices on blogs and various forums. -For some devices it will attempt to navigate between route points, which may then suggest various roads and tracks between the points using an internal routing algorithm with some kind of transport profile. -However this is limited to the quality of data available and how well the profile matches ones actual need. -If the points are close enough then the 'best' route for any form of transport will typically be the straight line between the points. - - -There are often restrictions on the numbers of route (or track) points the GPS Device can handle - may be 250 or as little as 50. -This generally not a problem for shorter routes, but needs managing for longer or detailed routes. -The number of track points is normally alot higher (e.g. 500 or typically with latest devices 10,000 or more) and less of a problem. - - - See for helping to manage this. - -
- -
- -
File Types and the Main Window - - -&appname; has it's own file type traditionally marked by the .vik file extension. -This is a plain text file saving all information of the current window including the view location, zoom level, projection type and then all the layer information (aggregates, maps, tracks, waypoints, etc...). - - -Besides it's own file type, &appname; can open (and save to via export methods) GPX and KML file types. - - - -&appname; does not handle GPX 1.1 particularly well - it prefers GPX 1.0 - - - -By default &appname; opens a default blank window centered on the home location. This behaviour can be changed by the . -Each window contains menus, a toolbar, a viewport, layers panel and a statusbar. -Each section (apart from the viewport) can be hidden using the or from the -ViewShow choices. - - -One may consider each &appname; window to be a separate project - each with it's project Viking file. -However generally one window is enough for most purposes! - - -Several operations apply at the window level as follows next. -Also see for the operational modes that generally work in conjunction with a selected layer. - - -
New - -Located on the FileNew menu and on the toolbar New. - - -This creates a new window with the default settings. - -
- -
Open - -Located on the FileOpen menu and on the toolbar Open. - - -This opens a file chooser dialog to select one (or more) files of the supported GPS data file types: - -Viking -GPX -TCX -KML -JPG - - - -GPX, TCX, KML and JPG files will be loaded into the existing &appname; view. A Viking file will be given a new window if the current window is already assigned. - - - -&appname; handles more file types via the Acquire methods below. - - -
- -
Open Recent File - -Located on the FileOpen Recent File menu only. - - -The most recently opened files are available for opening again. -The number of files remembered is controlled by a value in the . - - -Note that files imported via the Acquire mechanism are not available in this list. - -
- -
Save - -Located on the FileSave menu and on the toolbar Save. - - -If the current opened file is Viking file, this save will simply update it. -If it is a new file or the file loaded was an external type (i.e. GPX or KML), then this will ask for a new name to save as a Viking file. - -
- -
Save As - -Located on the FileSave As menu only. - - -This will ask for a new name to save as a Viking file (even it was already a Viking file). - -
- -
Append File - -Located on the FileAppend File... menu only. - - -Selecting a Viking file from this method will join the file contents to the current window (instead of creating a new one). - - -GPX and KML files may also be appended, whereby the file contents are added to the currently selected or layer. Otherwise they are loaded in the normal file open method when no layer is selected. - -
- -
Open GPX as External Layer - -Located on the FileOpen GPX as External Layer... menu only. - - -Selecting a GPX file from this method will create an external Layer that loads from the specified file. -The layer is marked as a "no write" external layer, which means any changes made will not be written back to the GPX file. -To enable changes to be written, you can change the layer to a standard external layer in the layer properties dialog. -This is in contrast to importing the data and storing it in the Viking file. - -
- -
Properties - -Located on the FileProperties menu only. - - -Displays some simple properties about the loaded Viking project file (if any), such as full filename including the path, the filesize and the date/time of the file. - -
- -
Export All - -Located on the FileExport All menu only. -Choose either the GPX or KML option. - -This allows converting every layer from the existing project into files of the type choosen. -You will be prompted for a directory into which a new file for each layer will be saved. - - -The KML option uses GPSBabel and so will not be available if GPSBabel can not be detected. - - -Note that some data properties are not supported by the target export file type. Such as item visibility or track colours. - -
- -
Acquire - - -Available on the FileAcquire menu and from the layer menu. - - -If used from the File menu these methods place the results in a new TrackWaypoint layer. - - -If used from the layer menu these methods place the results in that TrackWaypoint layer. - - -
-From GPS - -FileAcquireFrom GPS -Probably the easiest way of getting information from a GPS Device. - - -Select the GPS Device communication settings and then hit OK. -See the Getting Started section for more info about the settings. - - - -Some GPS devices (such as the Garmin Nuvi 255) support a native file system and write information to a Current.gpx file or similar. You will have to browse the file system on the device and open it directly. - - -
- -
-Import File With GPSBabel - -FileAcquireImport File With GPSBabel - - -Other formats can be imported that are supported by GPSBabel. - - -You need to select the file and the type of the file that is going to be opened, -since there is no automatic detection of the file kind. - -
- -
-OSM Traces - -FileAcquireOSM Traces - - -See section for more information. - -
- -
-My OSM Traces - -FileAcquireMy OSM Traces - - -See section for more information. - -
- -
-From Geotagged Images - -FileAcquireFrom Geotagged Images -Enables automatic creation of waypoints from geotagged images. - - -This menu opens a dialog to select such image files. -If the image files have geotag information in them, then a layer with named waypoints positioned at the location of each image with a thumbnail of that image is created. - -
- -
-From Wikipedia Waypoints - -FileAcquireFrom Wikipedia Waypoints - - -This gets interesting points from Wikipedia for the specified view: either within the extent of layer bounds or within the current viewport boundary. - -
- -
-From Routing - -FileAcquireFrom Directions - - -This gets a route from given directions. - -
- -
-From URL - -FileAcquireFrom URL - - -This gets a file from the entered URL. -File formats that can be opened are those supported by GPSBabel. - - - -You need to select the type of the file that is going to be returned, since there is no automatic detection of the file kind. - - -
- -
-Import GeoJSON File - -FileAcquireImport GeoJSON File - - -This uses the program togpx to load .geojson files. -If the program is not detected on your system, then this option will not be available. -See here for the installation method. - - -Versions proir to 1.6.0 of GPSBabel did not support the GeoJSON file format. - -
- -
- -
Print - -Located on the FilePrint menu and on the toolbar Print. - - -Print uses what is displayed on the current map view for printing: i.e. what ever map, tracks and waypoints that are in view, including the -cross hairs and the scale. - - -It uses a standard system print dialog using an image the size of the current viewport in pixel terms. -On the Image Settings you can move the image around the page and scale the image up / or down. - -
- -
Generate Image File - -Located on the FileGenerate Image File menu only. - - -Allows generation of larger (pixel) area images than the standard Print method above. -From the generated image you can use the facilities of the Operating System to print the image -or perform other actions. - - -You should have previously downloaded the tile images for the chosen zoom level, -otherwise the image produced will have missing sections. - - - -Using large areas takes some time to process and due to the method used it may run out of memory to complete the operation. -Unfortunately under Windows systems it can not detect this failure and may crash the program. -So the maximum size is dependent on the capabilities of your system. -For instance the largest successful image generated on my (RN) Debian system is a pixel area of 20,000 x 20,000. - - -
- -
Generate Directory of Images - -Located on the FileGenerate Directory of Images menu only. - - - -This is only available in UTM mode. - - -
- -
KMZ Map File Overview - -A KMZ file is a compressed version of a KML file and associated supporting files. - - -A KMZ Map file is a KMZ file with an image overlay often for use as a Custom Map on Garmin GPSr devices. - - -&appname; only supports basic properties in KMZ Map files, primarily intended for use with Garmin GPSr devices although KMZ exports are known to be work with Google Earth. - -
- -
Import KMZ Map File - -Located on the File menu only. - - -Enables loading of a selected KMZ map file. -This generates a new map layer using the overlay image contained within the KMZ file. - -
- -
Generate KMZ Map File - -Located on the File menu only. - - -Enables exporting the current viewport as a KMZ map file. -The area and zoom level covered by the KMZ map can be adjusted before saving. - - -Note that Garmin GPSr devices have limits in using images if they are too large (e.g. over 3Mb big) in KMZ files. -&appname; does not enforce any limits on the KMZ files it generates. - -
- -
- -
Layers - - -Layers supported by &appname; are: - - - - - - - - - - - - - -For each layer there are a few standard options: - - -Properties - Layer setup / configuration settings -Cut -Copy -Paste -Delete -Visibility - This checkbox on the Layers Panel controls whether the layer is shown in the viewport or not - - -The cut/copy/paste options can be accessed in a variety of ways once the layer has been selected: - - -Standard keys: Ctrl+x|c|v -Main menu Edit -From the right click menu -Buttons at the bottom of the Layers Panel - - -Default values used for each layer's properties can be altered via the EditLayer Defaults menu options. - - -See the individual section for detail about each layer. - -
- -
TrackWaypoint Layer - -TrackWaypoint layers display GPS data (tracks, routes and waypoints). - -One way to create new waypoints is to copy a -latitude/longitude coordinate pair, such as the one shown on most -geocaches, and paste it into an active TrackWaypoint layer. &appname; can -automatically recognize several variations of the lat/lon format. - - -By right-clicking on tracks, routes or waypoints in the , you can access many commands on them. -You can easily find a specific track, route or waypoint by expanding the appropriate containing Tracks, Routes or Waypoints sublayer in the -layers panel to show all the individual items and then typing the name of the track, route or waypoint. - - - -The containing Tracks, Routes or Waypoints sublayers are only shown when items of that type exist. -To start creating them enter into a create mode via either the Create toolbar commands or the New menu commands. - - - -The new TrackWaypoint layer dialog allows the layer to be specified as external. -In this case the layer is exported as GPX to the file specified instead of stored in the Viking file itself. -It is also possible to specify the layer as "no write". -This means that &appname; does not write the layer to the GPX file specified; instead, &appname; only reads the file. -No-write layers are primarily intended to be used with the option in the File menu. - - - -External layers are loaded only when they are displayed or selected. -Hence, they will not appear in any summary statistics if they have not been loaded. -It is possible to load all external layers contained in an layer by selecting "Load External Layers" from the Aggregate Layer context menu. -Note, &appname; specific options may not be saved if not supported by the GPX export. - - - -The sublayers also offer right click menu options. -These are the same as those available at the TrackWaypoint level, but only those that relate to the sublayer type. - - - -By default routes are coloured red. Tracks are automatically assigned a spread of colours. - - - -Most operations available on tracks are available on routes, except for functionality that relies on having timestamps - since routes by definition have no timing information. Thus for example, uploading a route to OpenStreetMap Traces is not available nor is Geotagging on a route. -It is possible to convert between Tracks and Routes, although converting from a Track to a Route may involve a loss of information (hence you are required to confirm this operation before it happens). - - - -Also see for use in conjunction with this layer. - - -
Layer Operations - -The layer has a context menu with several operations. - - -
View Layer - -Version1.1+: This will automatically move the viewport and select the best zoom level to see the whole layer (i.e. all tracks, routes and waypoints). - -
- -
View - -
View All Tracks - -Version1.1+: This will automatically move the viewport and select the best zoom level to see the all the tracks in the layer (ignoring positions of any routes or waypoints). - -
- -
View All Routes - -Version1.4+: This will automatically move the viewport and select the best zoom level to see the all the routes in the layer (ignoring positions of any tracks or waypoints). - -
- -
View All Waypoints - -Version1.1+: This will automatically move the viewport and select the best zoom level to see the all the waypoints in the layer (ignoring positions of any tracks or routes). - -
- -
- -
Goto Center of Layer - -This will automatically move the viewport to see the whole layer (i.e. tracks, routes and waypoints). It does not adjust the zoom level. - -
- -
Goto Waypoint - -This opens a dialog box to enter a name of waypoint to search for. If it is found the viewport is centred on it. - - - -Note this search is not very clever and only finds exact matches. -You are probably better off expanding the waypoint list and directly start typing, as mentioned above, which finds a match based on each letter typed. - - -
- -
Export Layer - -The layer (all tracks, routes and waypoints) can be exported to following file formats: - - - - GPX - - - GPSPoint - - - GPSMapper - - - Google's KML - - - Any GPSBabel File Formats - - - GeoJSON. Via the program togeojson - This option will not be available if the program is not detected on your system. - See here for the installation method. - - - -Version1.1+: An individual track can be exported to a GPX file via the track menu. - -
- -
Finish Track or Route - -Selecting this option ends the creation of that individual track or route. - - - -This is only available when a track or route is being created by the or tools. - - -
- -
New -
New Waypoint - -This opens a dialog box to create a new waypoint. A default name will be suggested and the default position is the center of the viewport. - -
-
New Track - -This turns on the tool. - -
-
New Route - -This turns on the tool. - -
-
- -
Geotag Images - -This starts the Geotagging Images dialog against all tracks in the layer. -See Geotagging for further detail. - -
- -
Acquire - -This offers the same choice from methods as on the File menu. -However when invoked from here, the results will be stored in this layer (instead of creating a new one). - -
- -
Upload - -
Upload to GPS - -This opens a dialog to select the GPS Device and port to which the layer information will be transferred. - - -The types of GPS information (tracks, routes or waypoints) to be transferred can be selected. - - -Tracks, Routes or Waypoints that are invisible will not be transferred. - -
- -
Upload To OSM - -This opens a dialog to upload all tracks and waypoints to OpenStreetMap traces. -Useful if you are an OpenStreetMap contributor, access details are stored in &appname; - - - &appname; allows you to edit a track, e.g. remove duplicate points, perhaps remove track points leading to your home and then upload it to OpenStreetMap. - -
-
- -
Delete -Offers deletion of various parts of a TrackWaypoint layer: -
Delete All Tracks -Deletes all the tracks in this layer. -
-
Delete Tracks from Selection -Opens a dialog with list of all the tracks from this layer to choose the ones to delete. -
-
Delete All Routes -Deletes all the routes in this layer. -
-
Delete Routes from Selection -Opens a dialog with list of all the routes from this layer to choose the ones to delete. -
-
Delete All Waypoints -Deletes all the waypoints in this layer. -
-
Delete Waypoints from Selection -Opens a dialog with list of all the waypoints from this layer to choose the ones to delete. -
-
Delete Duplicate Waypoints - - Deletes duplicate waypoints in this layer. - Waypoints are considered duplicate if they have the same location and symbol. - - If other properties are different such as name, comment, altitude, etc... they will still be considered a duplicate. - - - -
-
- -
Filter -
Simplify All Tracks - -This opens dialog to request the number of points each track will be simplified using GPSBabel. The result is put into a new layer. The simplification method removes points considered to be in a 'near straight line', thus reducing the number of points and attempting to keep the most important turning points. - -
-
Compress Tracks - -Enables compression of tracks and routes via GPSBabel's Crosstrack simplify method. -It opens a dialog to request the Error factor value which is the maximum allowable error that may be introduced by removing a single point. -It is expressed a distance in units as specified by the distance option. -Thus a higher value will remove more points. -The result is put into a new layer. - -
-
Remove Duplicate Waypoints - -Remove Duplicate Waypoints - fairly self explainatory, with the results created in a new layer. - - - -However it only considers a precise position (waypoints only 1 metre away from each other are considered different) and also doesn't consider if the waypoints have different comments, symbols or images. - - -
-
- -
Filter With <emphasis>Trackname</emphasis> - -This runs GPSBabel on the layer using information from a previously selected track (select via the track menu "Use With Filter" option) with the following command types: - - -Waypoints Inside This -Waypoints Outside This - - -The result is generated in a new Track/Waypoint layer. - -
- -
Geotag Images - -This starts the Geotagging Images dialog using the specific track. -See Geotagging for further detail. - -
- -
List Tracks or Routes - -Opens a new dialog with the list. As described in the Aggregate layer - -
- -
List Waypoints - -Opens a new dialog with the list. As described in the Aggregate layer - -
- -
- -
Track and Route Sublayer Options -Repeats options available at the TrackWaypoint level, but only those for tracks and routes: - - -Finish Track or Route -Same as the layer Finish Track or Route - - -New Track or Route -Same as the layer New Track or New Route - - -View All Tracks or Routes -Same as the layer View All Tracks or View All Routes - - -Delete All Tracks or Routes -Same as the layer Delete All Tracks or Delete All Routes - - -Delete Tracks or Routes from Selection -Same as the layer Delete Tracks from Selection or Delete Routes from Selection - - -List Tracks or Routes -Opens a new dialog with the list. As described in the Aggregate layer - - -Also gives other options for handling multiple items: - - -Sort -Gives the ability to sort the items in the treeview alphabetically or by date. - - -Visibility -Offers options to quickly control the visibility of all items within the sublayer, as per - - -
- -
Track and Route Properties - -This shows several tabs for properties and useful statistics about a track or a route, including elevation-distance and speed-time graphs (if data is available). -Moving the mouse pointer over the graph displays values related to that point along the track. -You can click on these graphs to jump to the point in the track. -You can reverse it, delete duplicates, split at marked position or split a track from its component segments (discontinuous breaks in a track) into separate tracks. - - -For the elevation related graphs the Show DEM check button is only enabled if a suitable is available that overlaps the track. - - -Graphs either have a Show GPS Speed or Show Speed button. -Each of these overlays relative speed markers along the graph. -The difference between Speed vs GPS Speed is that GPS Speed is taken directly from a field reporting the speed value in the source data. -Typically speeds used in Viking are calculated between the points time and position differences. -This is due to the reporting of speed values in source data is not mandatory and often not present. - -
Track and Route Properties Tab - -
-Properties Tab: Example - - - -
-
-
-
Track and Route Statistics Tab - -
-Statistics Tab: Example - - - -
-
-
-
Track Elevation Graph - -
-Elevation Distance Tab: Example - - - -
-
- -The following colors are used in the elevation-distance graph: - - - -Main colour - this is dependent on your Desktop theme - often blue by default -elevation data in graph - - -Yellow - -no elevation data - - - -Green - -elevation data from DEM - - - -Red - -speed - - - -
- -
Track Time Splits - -
-Splits Tab: Example - - - -
-
- -This tab displays timing splits on tracks with timing information. -A few different values of split lengths are available, each having it's own tab display. - -
-
- -
Track and Route Operations - -
Finish Track - -Selecting this option ends the creation of the individual track. - - - -This is only available when a track is being created by the tool. - - -
- -
Goto - -This centers the viewport on the selected position on the track: - - -Startpoint -"Center" - the notional center from the bounds of the track -Endpoint -Version1.1+: Highest Altitude -Version1.1+: Lowest Altitude -Version1.1+: Maximum Speed (Not Available on Routes) -Version1.8+: Previous trackpoint -Version1.8+: Next trackpoint - -
- -
View - -Version1.1+: This centers the viewport on the track and selects the best zoom level to see it. - -
- -
Combine -
Merge By Time - -This operation repeatedly tries to merge the right-clicked track -with tracks in the same TrackWaypoint layer. The tracks which are -merged are those which have at least one trackpoint less than some -threshold time away. This way, if you somehow end up with lots of small -segments (say, caused by turning the GPS on and off) you can merge them -easily into one track. - - - -This is not available on routes as they have no timestamps. - - -
- -
Merge With Other Tracks - - This opens a dialog listing the other tracks in the same TrackWaypoint layer, from which one can select the other tracks to merge with. - Tracks are merged in order of time. - -
- -
Merge Segments - -Combines track segments. Effectively removing track segment markers to leave one segment for the whole track. - -
- -
Append Track or Route - -Enable joining of a single track to the end of the current track. -This opens a dialog listing the other tracks in the same TrackWaypoint layer from which one can make the selection. - -
-
- -
Split -
Split By Time - -This operation will split a single track into segments wherever the -time interval between successive trackpoints is larger than some -threshold. This is useful when processing raw NMEA GPS data, especially -taken over a long time. - - - -This is not available on routes as they have no timestamps. - - -
- -
Split By Number of Points - -Version1.2+: This operation will split a single track into segments by the number of points specified. -This can be useful with devices which may have limits on the number of points it supports. - -
- -
Split Segments - -Splits track segments into new tracks. - - - -This is not available on routes as they do not have route segments. - - -
- -
Split at Trackpoint - -Splits the track at the currently selected trackpoint. - - -The current track will finish at this trackpoint. -A new track will start from a copy of this trackpoint. - - - -This is only enabled when a trackpoint is selected. - - -
-
- -
Insert Points - - -These options are only enabled when a trackpoint is selected. - - -
Insert Point Before Selected Point - -Inserts a track point halfway between the previous track point and the current track point. -All track point properties are interpolated between the two points. - -
-
Insert Point After Selected Point - -Inserts a track point halfway between the current track point and the next track point. -All track point properties are interpolated between the two points. - -
-
- -
Delete Points -
Delete Selected Point - -Deletes the currently selected track point. - - - -This is only enabled when a trackpoint is selected. - - -
-
Delete Points With the Same Position - -Deletes subsequent points that have the same position (but have different timestamps). - -
-
Delete Points With the Same Time - -Deletes subsequent points that have the same time stamp (but may have different positions). - - - -This is not available on routes as they have no timestamps. - - -
- -
- -
Transform - -These options alter the data of trackpoints of a track but not add or remove trackpoints. -And don't seem to fit any other category :) - -
Apply DEM data - -If any DEM data is loaded, this will apply the DEM data to give the track elevation data. -Two ways of applying DEM data are offered: - -Keep. Retains the existing elevation data of trackpoints and only those missing an elevation value are set. -Overwrite. Elevation data are set on all trackpoints even if they already elevation values. - - -
-
Smooth Missing Elevation data - -In various locations across the world, there are missing DEM values (AKA DEM Holes) from the SRTM data. -This is particularly noticeable in mountainous areas. -Two ways of applying elevation data to trackpoints that do not have elevation values are offered: - -Interpolated. Missing elevation data is interpolated between the previous and next known values. -Flat. Elevation data is filled in from the last previously known value. - - -
-
-Convert to Track or Route - -If this is a Route then it will convert it to a Track. - - -If this is Track then convert it to a Route. - - - -Converting from a Track to a Route may involve a loss of information, in particular timestamp values (hence you are required to confirm this operation before it happens). - - -
-
-Anonymize Times - -Timestamp information of a track can be shifted to be all offset from 1901-01-01. - - -Thus the timestamps themselves will no longer reveal exactly when a track was taken. -However the relative difference between the timestamps is kept thus one is still able to calculate some properties such as speeds along the track. - - - -This is not available for routes, as they have no timestamps. - - -
-
-Interpolate Times - -Trackpoint timestamps between the first and last points are calculated such that track is travelled at equal speed. -This is mostly useful when tracks don't have timestamps and you wish to recreate your trip (e.g. you've forgotten to turn on your GPS or the batteries have run out) -Thus edit the first and last trackpoints to set the approximate times of your trip and then use this to give approximate times along the track. -When used on tracks with timestamps this will overwrite the existing timestamps. - - - -This is not available for routes, as they have no timestamps. - - -
-
- -
Export Track as GPX - -Version1.1+: This allows exporting the track as a GPX file by opening a file save dialog. - -
- -
Extend Track End - -Changes the current tool to add trackpoints to the end of the track. - -
- -
Extend Using Route Finder - -Enables the Route Finder tool. Thus on a subsequent left click in the viewport, a route is calculated from the end of track to that point using the default route service and applied to the track. - -
- -
Upload - -
Upload to GPS - -Same as the layer Upload to GPS command, but only applies to the track. - -
- -
Upload to OSM - -Same as the layer Upload to OSM command, but only applies to the track. - -
- -
- -
Use With Filter - -This selects the track to be used in the Filter With Trackname feature. - - - -This is not available on routes. - - -
- -
Edit Trackpoint - -This opens the Trackpoint edit dialog. See . - - - -This is only enabled when a trackpoint is selected. - - -
- -
Refine Route... - -This function allows to request a Routing Engine in order to refine a given route. -By "refining" we mean computing all real intermediates points between some given major points. -This could be useful to compute a trip giving only the wished important steps. - - - -This is only available on routes. - - -
- -
View Google Directions - -This option is only available on a track created using the Route Finder tool. - - -Launch a web browser to see the Google directions page which yielded the route. - - - -The record of the Google route is stored in the track's comment, so if the comment is changed (or the route was created by something other than the Route Finder tool) this will not work correctly. - - -
- -
- -
Waypoint Sublayer Options -Repeats options available at the TrackWaypoint level, but only those for waypoints: - - -New Waypoint -Same as the layer New Waypoint - - -View All Waypoints -Same as the layer View All Waypoints - - -Goto Waypoint -Same as the layer Goto Waypoint - - -Delete All Waypoints -Same as the layer Delete All Waypoints - - -Delete Waypoints from Selection -Same as the layer Delete Waypoints from Selection - - -Delete Duplicate Waypoints -Same as the layer Delete Duplicate Waypoints - - -List Waypoints -Opens a new dialog with the list. As described in the Aggregate layer - - -Also gives other options for handling multiple items: - - -Sort -Gives the ability to sort the items in the treeview alphabetically or by date. - - -Visibility -Offers options to quickly control the visibility of all items within the sublayer, as per - - -
- -
Waypoint Properties - - -This shows a dialog with detailed information for the waypoint. Many properties of the waypoint can changed here, such as the comment, the symbol used in drawing or the image (normally a photograph taken at this position) assiocated with it. When a waypoint has an image, a thumbnail of it is drawn in the viewport for the waypoint (in preference to the symbol). - - -If the waypoint has an associated image, then the Geotag information may be updated, either with updating the file's modification timestamp or not. -This can be useful when the waypoint has been moved. - - -
- -
Waypoint Operations - -
Goto - -This centers the viewport on the selected waypoint. - -
- -
Geotag Images... - -This opens the Geotag Dialog to allow Geotagging multiple images to the position of this waypoint. -In this circumstance creation of waypoint options are disabled and only the options related to writing the EXIF information are available. - -
- -
Transform - -Offers a subset of the track utilities. -Currently only setting the altitude from DEM data methods are available. - -
- -
Visit Webpage - -If the waypoint's comment (or description) starts with http: then this option is available and allows launching a web browser to go to the webpage. - -
- -
Visit Geocache Webpage - -If the waypoint's name is in Geocache form (GCXXXXX) then this option is available and allows launching a web browser to go to the Geocache page. - -
- -
New Waypoint - -Same as the layer New Waypoint. - -
- -
- -
Version1.3+: Geotag Images - -This dialog allows geotagging images (normally taken with a digital camera) against a specific waypoint or via interpolation against a specific track or all tracks in the TrackWaypoint layer - depending on how it is invoked. - - -When geotagging against tracks, images need to have an EXIF DATE_TIME_ORIGINAL (nearly always set by a camera). This timestamp is then used to find the location when the image(s) was taken by searching through the track(s) to find the nearest time - interpolating between points if necessary to set the location. - - - -Generally it is good policy to synchronize your camera's clock with your GPS clock before taking photographs. However the times can be adjusted afterwards (if necessary) to take into consideration clock differences. - - - -Various options allow control of how the geotagging process is performed: - - -Images - Add the images used for geotagging -Create Waypoints -Overwrite Existing Waypoints -Write EXIF -Overwrite Existing GPS Information -Keep File Modification Timestamp -Automatic Image Direction - Assumes the direction will be in line with the track heading -Interpolate Between Track Segments -Image Time Offset - The number of seconds to ADD to the photos time to make it match the GPS data. Calculate this with (GPS - Photo). Can be negative or positive. Useful to adjust times when a camera's timestamp was incorrect. -Image Time is Local - Are the timestamps in the image local time or otherwise in UTC. -Image Timezone - The timezone adjustment factor. - - -Typically timestamps in images are either in local time or UTC but there is no way of automatically knowing which; so you need to specify which is the case. -Image Time Offset is best used for accounting for camera's clock drift, so normally of the order of a few seconds or minutes. -Whereas Image Timezone is more for adjusting for a camera's timezone difference, or perhaps differences in your current timezone and the timezone the images where taken. - -
- -
- -
GPS Layer - -The GPS layer is responsible for uploading and downloading GPS data -from a GPS device. It also is responsible for realtime GPS tracking. -Expand the GPS layer in the layers panel to see the two layers it -uses for uploading and downloading. To upload, download, or use -realtime tracking, right-click the GPS layer and click the appropiate -menu item. - - -
Download - -To download data from the GPS, right-click the GPS layer and click Download from GPS. - -
- -
Upload - -To upload data to the GPS, first populate the GPS Upload child -layer of the GPS layer (either by creating waypoints/tracks/routes in it, or -copying and pasting or dragging waypoints/tracks/routes from another layer). -Then right-click the GPS layer and click Upload to GPS. - -
- -
Realtime Tracking - -You must set up gpsd correctly or use a GPSD server and put the -correct information in the GPS layer properties dialog. Then right-click -the layer and select Start Realtime Tracking. - -
- -
Empty <emphasis>Item</emphasis> - -There are several options to quickly delete a subsection of data: - - -Empty Realtime -Empty Upload -Empty Download -Empty All - -
- -
- -
DEM (Digital Elevation Model) Layer - -This layer provides elevation data from the Shuttle Radar Topography Mission (SRTM) - - -Elevation data can be useful in planning trips, as you many wish to avoid/minimise the hills encountered. [OSM Cyclemap is also useful this way too] - - -To download the data use the tool (shown on the toolbar), and then click on a area of the viewport. Once files have been downloaded they can then be loaded from disk via the DEM properties in future application runs. - - -The current data server is: NASA STRM 2.1. - - -ATM &appname; does not auto download DEM data. If you want to get lots of data blocks, you may wish to use some other program get such as curl or wget to download them for an area. - - - -Using many DEMs is CPU/memory intensive. Depending on your computer's capability, &appname; will be less responsive when about 50+ DEM blocks are loaded. It is probably unwise to attempt using 200+ blocks, so trying to use DEMs covering large countries/continents (USA, Australia etc...) is unlikely to work. In these conditions under Linux, &appname; may be automatically stopped by the "OOM Killer" - - - -
- - -
Maps Layer - -This layer provides a single map resource, you may have multiple map layers but only top one (if enabled) will be visible (subject to the Alpha compositing property). - - -Some maps are continually improving over time (e.g. OpenStreetMap) thus &appname; employs a caching mechanism to avoid redownloading data (see ). -However a forced refresh for the current view can be made via the Reload All Onscreen Maps option or Ctrl+F5. - - - -Also see tool for use in conjunction with this layer. - - -Online Map Tile Providers - -You will need an open internet connection when you are downloading maps these following map types, but once downloaded they are available from the hard disk cache. When map are avaliable from the disk cache it is much faster and can be used offline. -Inbuilt maps include various OpenStreetMap (OSM) ones and more: - - - -Bing Aerial Maps (&appname; Version1.2+) -Mapbox Outdoors - This is the default (&appname; Version1.7+) -OpenStreetMap (Mapnik) -OpenStreetMap (Cycle) -OpenStreetMap (Transport) (&appname; Version1.3+) -OpenStreetMap (Humanitarian) (&appname; Version1.5+) -NASA BlueMarble - - - -&appname; can be configured to handle additional online map resources. See for further detail. - - -Offline Map Tilesets - -Some map types supported are for on disk tile formats: - - - - - On Disk OSM Tile Format - This is equivalent to any map set with OSM Cache Layput. - -MBTiles File - - OSM Metatiles - - This file format is mostly aimed at being rendering cache feature and is Endian dependent. - Thus to successfully view the file cache, the Metatile files and Viking must be of the same endian type (which they probably will be). - - - - -Of course you need to have acquired or generated these tilesets yourself. - - -
Map Layer Properties - -Configurable properties: - - - -Map Type - - The kind of map this layer displays. - Map types are dependent on the current mode. - - - -Maps Directory -Not applicable for MBTiles Map type since it is a single file. - - -Cache Layout -Viking or OSM. See . Only applies to maps from online tile providers. - - -Map File -Ony applicable for MBTiles Map type since it is a single file. - - -Alpha - - Control the Alpha value for transparency effect using a value between 0 and 255 with the default being 255 for a fully solid image. - Zero is fully transparent. A value of around 160 can be useful for blending views of multiple map layers (when applied to the upper most map layer). - - - -Autodownload Maps -This can be useful to turn off when you are not online to avoid pointless download requests or may be keep a map in a 'historical' state. -e.g. perhaps in case a current map rendering is broken. - - -Autodownload Only Gets Missing Maps -Using this option avoids attempting to update already acquired tiles. -This can be useful if you want to restrict the network usage, without having to resort to manual control. Only applies when Autodownload Maps is on. - - -Zoom Level -Determines the method of displaying map tiles for the current zoom level. -Viking Zoom Level uses the best matching level, otherwise setting a fixed value will always use map tiles of the specified value regardless of the actual zoom level. - - -
- - -
Layer Operations -
Download Missing Onscreen Maps - -This requests map tiles for areas of the viewport that do not currently have one. - -
- -
Download New Onscreen Maps - -This requests map tiles only if the maps are older than the Tile Age preference. - -
- -
Reload All Onscreen Maps - -Force a refresh of all visible map tiles. - -
- -
Download Maps in Zoom Levels - -This opens a dialog to enable requesting the download of maps for the region in the viewport over a specified number of zoom levels. -The download method type can be specified to help limit the number of requests. - - - -There are some inbuilt limits to prevent downloading large amounts of map tiles. - - -Please respect the usage policy of the tile set provider. -Such as OSM Tile Usage Policy. - - - -
-Maps Download Dialog: Example - - - -
-
-
-
- - -
- -
Aggregate Layer - -This layer is a container layer to hold other layers. There is always an initial and controlling Top Layer that can not be removed or renamed. - - -This layer type is useful for grouping other layers, especially layers, in whatever categories are relevant to you: such as by activity, location or date. -Here are some suggestions: - -Hiking -Mountain Biking -Road Cycling -Car Trips -Sailing -Holidays -UK Points of Interest -USA Points of Interest -etc... - - - -Thus one can have a list of all your tracks, but groups can be shown or not using the relevant layers visibility checkbox. - - - -Tracks Area Coverage (TAC) is a feature to highlight areas with track coverage. -It is based on OpenStreetMap style tiles - as an approximation to a grid square system. -The size of the area can be changed, which is linked to the OSM Zoom level, -such that a higher Zoom level gives a smaller physical area and so more tiles. -This can be used for general curiousity or perhaps to plan routes to visit areas previously unexplored. - - -The calculations are performed in the background when deemed necessary (e.g. loading in a new file) and can also be manually requested. - - -Note that Viking can be slow in drawing hundreds or more tracks but this analysis is relatively quick and the resulting drawing is much faster. -Thus ATM is it recommended to turn off the visibility of the tracks themselves for this type of usage. - - - -
-Tracks Area Coverage: Example - - - -
-
- -
Layer Properties: Tracks Area Coverage -Offers basic controls whether it is enabled or not and includes the size of the tile. -
- -
Layer Properties: TAC Advanced -Controls subsets of TAC drawing are calculated and shown with their colour and opacity. -Note for Max square coverage, ATM it will only draw the first square encountered, although there may be more than one such area. -Note for Cluster coverage, ATM it will only draw the first cluster encountered, although there may be more than one such area. -
- -
Layer Operations - -The following are available on Aggregate Layers: - - -
New Layer - -Add a new layer of the selected type. - -
- -
Sort - -The list within the treeview can be sorted. - - -Alphabetical and Date sorts are available. - - - -Generally it is not useful to sort the Top most layer. Sort is mainly intended for Aggregate groups of TrackWaypoint layers. - - -
- -
Track List - -Selecting this opens a dialog listing all the tracks in a table along side statistics such as track length and maximum speed. -Each column header is clickable and will reorder the list according to that particular column. -You can also rearrange the columns via dragging the column header to the new location. - - -This table may be invoked from a variety of different layer levels and will then list only the relevant tracks (and/or routes). - - -Aggregate Layer -Lists Tracks and Routes and the TrackWaypoint Layer they are in - - -TrackWaypoint Layer -Lists Tracks and Routes - - -TrackWaypoint Track sublayer -Lists Tracks only - - -TrackWaypoint Route sublayer -Lists Routes only - - - - -
-Track List Dialog: Example -
- -This is showing all tracks and routes (although there are no actual routes here!) in multiple TrackWaypoint layers, that has been sorted by height. -Note that routes will not have timestamps or speeds, but may have elevations and should have some distance! - -
- - - -
-
- -Hovering the mouse over an entry will show a tooltip of the comment or description if it is available. - - -Each entry in the track list can be selected and on mouse right click offers these options: - - -View -Move the viewport to the area of the item and highlight it. - - -Statistics -Opens the Properties dialog on the tab. Note this will close the track list dialog. - - -Copy Data -Copy the data fields as text. - - - - -If multiple entries are selected the only right click option is Copy Data. -This copies the individual data fields as plain text separated by tab characters, ideal for pasting into other applications in particular spreadsheet programs. -Note that the order of the fields copied is the default column ordering (irrespective to how they may have been rearranged). - -
- -
Waypoint List - -Selecting this opens a dialog listing all the waypoints to give a overview of the waypoint information. -Each column header is clickable and will reorder the list according to that particular column. -You can also rearrange the columns via dragging the column header to the new location. - - -This table may be invoked from a variety of different layer levels and will then list only the relevant waypoints. - - -Aggregate Layer -Lists Waypoints and the TrackWaypoint Layer they are in - - -TrackWaypoint Layer -Lists Waypoints - - -TrackWaypoint Waypoint sublayer -Lists Waypoints - - - - -
-Waypoint List Dialog: Example -
- -This was invoked on a TrackWaypoint layer and shows all waypoints from that single layer. It has been sorted by the symbols. - -
- - - -
-
- -Hovering the mouse over an entry will show a tooltip of the description if it is available. - - -Each entry in the list can be selected and on mouse right click offers these options: - - -View -Move the viewport to the area of the item and highlight it. - - -Properties -This will open the properties dialog. Note this will close the waypoint list dialog. - - -Show Picture -If enabled, this will open the associated image in an external Image Viewer program. - - -Copy Data -Copy the data fields as text. - - - - -If multiple entries are selected the only right click option is Copy Data. -This copies the individual data fields as plain text separated by tab characters, ideal for pasting into other applications in particular spreadsheet programs. -Note that the order of the fields copied is the default column ordering (irrespective to how they may have been rearranged). - -
- -
Visibility Options - -This offers a quick way to set all the visibilities of each item within the containing layer, rather than having to change each one individually. - - -Show All -Ensures all items are set to be visible. - - -Hide All -Ensures all items are set to be invisible. This is useful for then turning on single items afterwards so the display is not cluttered. - - -Toggle -Inverts the visibility status of each item. - - - -
- -
Search by Date - -This opens calendar dialog to select a date to search by within this Aggregate layer. -The first item that is found on that date will be selected. -Tracks are searched first in preference over waypoints. - -
- -
Statistics - -This opens a dialog to display various statistics about all tracks contained within this Aggregate layer. - -
-Statistics Dialog: Totals - - - -
- - - This currently generates a simplified Eddington number. - In that a per track length value is used, rather than trying to work out a length per day. - (i.e. doesn't combine multiple tracks for a single day or split very long tracks into days). - The Eddington number is in the current Unit distance . - - -
-Statistics Dialog: Years - - - -
-
- -
Append File - -This opens a dialog to select files to load within this Aggregate layer. - -
- -
Tracks Area Coverage->Calculate - -Start a new Tracks Area Coverage calculation. - -
- -
Tracks Area Coverage->Remove - -This clears the Tracks Area Coverage information, thus no grid colouring will be displayed. - -
- -
-
- - - - - - - -
Coordinate Layer - -This layer is allows drawing of grid lines on the viewport. - -
- - -
Tools - -&appname;'s mouse actions on the viewport are controlled by which tool is active. Only one tool can be active at a time. The default mode is pan. You can return to the default mode by pressing Escape. - - -You can use the scroll wheel, the middle-click, the middle-click+drag to zoom, center map at position and pan respectively no matter what tool you are using. - - -Scroll: zoom in and out keeping the mouse over same location - - -Ctrl-scroll: pan north-south (also Ctrl-up, Ctrl-down) - - -Shift-scroll: pan east-west (also Ctrl-left, Ctrl-right) - - -Ctrl-shift-scroll: zoom in and out, without changing the center (also Ctrl+, Ctrl- [*not* KeyPad +/-]) - - -Middle-click: make the clicked point on the map the center - - -Middle-click and drag: pan - - -
Pan - -This is the default mode of operation for &appname;. - - -This mode is entered by clicking on the toolbar icon: - - -Pan moves the viewpoint. A single click centers the viewport at that point, whereas click and drag dynamically moves the view around. -This is the default tool. - - -This mode can also be entered by the keyboard shortcut Ctrl+Shift+P - - -Double clicking the left mouse button will zoom the map in. -Shift + double clicking the left mouse button will zoom the map out. -Double clicking the right mouse button will also zoom the map out. - -
- -
Zoom - -This mode is entered by clicking on the toolbar icon: - - -Zooms in and out on the clicked part of the map or by the selected area. - - -This mode can also be entered by the keyboard shortcut Ctrl+Shift+Z - - -Ctrl + left or right click: Zoom in/out and center the map on the clicked location - - -Shift (and hold) + left mouse button: Draws a bounding box area on which to zoom in. The zoom action is performed when the left mouse button is released. - - -Shift + left click button: Jump Zoom In by up to factor of 3 standard zooms. - - -Shift + right click button: Jump Zoom Out by up to factor of 3 standard zooms. - -
- -
Ruler - -This mode is entered by clicking on the toolbar icon: - - -The ruler is used to measure either: - - - -The bearing and distance between two points: Click on first point and then move the mouse point around - the values will be continually updated. -A second click will freeze the ruler at that point. - - - -An area: Shift (and hold) + left mouse button: Draws a bounding box area. Area values are shown in the statusbar and on the viewport. -Releasing the mouse button will freeze the area at that point. -The viewport label option is controlled by . - - - - -This mode can also be entered by the keyboard shortcut Ctrl+Shift+U - -
- -
Version1.1+: Select - -This mode is entered by clicking on the toolbar icon: - - -The select tool allows one to choose any waypoint or track by clicking on it (or reasonably near) in the viewpoint. - - -ATM to select a track one must actually click on a trackpoint, which is also selected. - - -This mode can also be entered by the keyboard shortcut Ctrl+Shift+S - -
- -
TrackWaypoint Layer Tools - -You must have a Layer selected to use these tools. - -
Create Waypoint - -Enable this tool by clicking on the toolbar icon: - - -Left click will open the new waypoint dialog using the specified position. - -
- -
Create/Edit Track - -Enable this tool by clicking on the toolbar icon: - - -General track edit/create tool. -The first left-click will create a new track and you will be asked to enter a name for the track. -If Shift is held, a track will be continued from a nearby trackpoint. -Subsequent left-clicks will add new trackpoints. -If Shift is held, the track will be joined to an existing track at the point selected. -If Ctrl is held, it will jump the new trackpoint position to a nearby existing trackpoint. - - -Right click or Backspace: undo one point. - - - - - -Double click or Escape: to finish track creation. -Finishing the track is also available via the right click and track menus. - - -One must finish the current track to be able to create another track. - - -Keypad Add or ]: Insert point after current point. - - -Keypad Minus or [: Insert point before current point. - - -Left: Select the previous point. - - -Right: Select the next point. - -
- -
Edit Route - -Enable this tool by clicking on the toolbar icon: - - -This operates in exactly the same way as the Edit Track above. - - -One must finish the current route to be able to create another route. - - -One can switch between the Edit Route and Route Finder tools while editing routes. - -
- -
Create Route Using the Route Finder - -Enable this tool by clicking on the toolbar icon: - - -Requires an internet connection. -Left click to create a new trackpoint. -If it's the initial trackpoint you will be asked to enter a name for the route, otherwise the default routing engine will be queried to find a route to the new trackpoint. -Right click or Backspace: remove the last added route. - - -Escape: to finish route creation. -Finishing the track is also available via the right click and track menus. - - -One must finish the current route to be able to create another route. - - -One can switch between the Edit Route and Route Finder tools while editing routes. - -
- -
Track Splitter - -Enable this tool by clicking on the toolbar icon: - - -Use this tool to split a track or route. -After enabling the tool, click on the track/route point of the track/route at the position where you want the split to occur. - -
- -
Edit Waypoint - -Enable this tool by clicking on the toolbar icon: - - -Left Click/drag: select/move a waypoint. -If Ctrl is held at the same time, it will jump the waypoint position to a nearby existing trackpoint. -If Shift is held at the same time, it will jump the waypoint position to a nearby existing waypoint. - -Right-click on waypoint: opens a menu with waypoint actions (the -same menu accessed by right-clicking the waypoint in the layers panel) - -
- -
Edit Trackpoint - -Enable this tool by clicking on the toolbar icon: - - -Left click near a trackpoint (in screen pixel terms) to bring up the Track Point Edit dialog on that trackpoint. -Whilst the edit dialog is already open, left click again and drag enables moving of the trackpoint. -If Ctrl is held at the same time, it will jump the new trackpoint position to a nearby existing trackpoint. - -
Edit Trackpoint Dialog - -Editing options in the Trackpoint Edit dialog include: - -Edit the trackpoint name -Changing raw lat/long position and altitude -Forward (go to the next trackpoint) -Back (go to the previous trackpoint) -Delete -Insert. Inserts a point halfway to next trackpoint -Split. - - - -Several fields are read only for reference purposes, values are shown if the trackpoint has such information: - -Time. -Speed and course. -'Between' values: Speed, Time Difference and Distance Difference. When moving between trackpoints (via the Back and Forward buttons) these values are calculated. -GPS precision factors. - - - -
-Trackpoint Edit Dialog: Example - - - -
-One must have been going downhill here to get a reasonable speed by bicycle! -
-
-
- -
Show Picture - -Enable this tool by clicking on the toolbar icon: - - -Opens an image viewer with the picture associated with the waypoint. -By default this uses the default system image viewer. -For Linux you can override this with the setting in the - -
- -
- -
Georef Map Layer Tools - -You must have a Map Layer selected to use these tools. - -
Georef zoom - -Enable this tool by clicking on the toolbar icon: - -Changes the zoom level of the georeferenced map and changes the -&appname; zoom level accordingly. Useful if you are trying to match GPS -data to a georeferenced map. - -
- -
Georef move - -Enable this tool by clicking on the toolbar icon: - - -Drag to move the georeferenced map. - -
-
- -
Map Download - -You must have a Layer selected to use this. - - -Enable this tool by clicking on the toolbar icon: - - -Click to download a single tile. Drag to download tiles in the dragged rectangle area. - - -Right-click to redownload tiles via the selected method. Right-click and drag to redownload tiles in the dragged rectangle area by the selected method. -The possible methods to redownload one or more tiles are: - - - - -Bad -Only if the tile is corrupt in some way or missing, then this will download a new copy - - -New -Refresh the tile according to the local map cache and if server has a newer version - - -All -Redownload the tile - - - -Map Tile Information - -By right clicking on viewport and selecting Show Tile Information you can see the tile properties of this location for the current map layer and current zoom level. -This includes the remote source URL for the tile and the cached version on the local filesystem with timestamp details. - - - -
-Map Tile Info Dialog: Example - - - -
-This is using MapQuest at &appname; zoom level 128 over the Isle of Wight, UK. -
-
- -
DEM Download - -You must have a Layer selected to use this. - - -Enable this tool by clicking on the toolbar icon: - - -Click to download and import a DEM file. - -DEM File Information - -By right clicking on viewport and selecting Show DEM File Infomation you can see the file properties of the DEM file for this location. -This includes the remote source URL for the file and the cached version on the local filesystem with timestamp details. - - - -
-DEM File Info Dialog: Example - - - -
-This is for block 51N, 003W - covering Bristol in the UK. -
-
- -
Webtools - -Many services are available only via a web browser (Google Maps, OpenStreetMap Potlach editor, etc.). - - -Jumping from &app; to such service can become annoying. - - -&appname; allows you to open such service directly at the position currently viewed in &app;. - - -This feature is called Webtools. It is also known as External Tools. - -
- -
- - -
Preferences -
General -
Localisation -You can select units displayed by &appname; to best fit your usage. -
-Properties dialog: units part - - - -
-Concerning degrees, you can select the way to display them: - - -DDDdecimal degree - - -DMMpartial sexagesimal display: degrees, minutes and decimal part of minutes - - -DMSsexagesimal display: degrees, minutes and seconds - - - -
-Properties dialog: degree display options - - - -
-
-
Waypoint Icon Size -An option exists to control the icon (symbol) size used for waypoints - -
-
<emphasis>Home</emphasis> Default Location: Latitude and Longitude -You can set the Home location directly by inputting the latitude and longitude in decimal degrees. - -
-
Time Display -This controls the reference timezone that times are shown in. -Locale is the current user's system preference. This was how all times were shown up to version 1.5. -World will attempt to determine the timezone at an object's position. -UTC enforces this standard timezone. -
-
Tile's age -This age is used to decided wether or not a new request to tile server must be done. - -Changing this value, you will increase or decrese the network load. -
-
Default map layer directory -This property sets the default directory of the tiles cache. -This value is used when you create a new map layer. - -You are still able to change this value in each map layer properties. -
-
Map Cache Memory Size -This controls the amount of maps that are stored in memory, rather than having to reread from disk. -Generally if you have a system with lots of memory it's recommended to increase this value. - -
-
- -
Export/External -
KML Export Units -Allows setting the units used when saved as the KML file type, such as Metric or Statue units -
-
GPX Track Order - - Other software may display tracks in a particular order (often the order saved into the file). - This allows you to control the order they are saved when exporting to a GPX file. - -
-
GPX Waypoint Symbols -Some GPS devices require waypoint symbols to be in a particular case. -E.g. On a Garmin Oregon 450 they must be in Title Case to be recognized. -
-
Image Viewer (Not Windows) -Allows setting the program used to view images associated with Waypoints. -By default this is set to xdg-open which should open the system's default image viewer, however this can be overridden with this setting. -Note: for Windows systems, viewing images associated with Waypoints always uses the system's default image viewer. -
-
External GPX programs -Allows setting the programs invoked via the Layer menu Export LayerOpen With 'program' -Two options are given so that it can be configured for various uses such as: - -An OSM editor (default) -Some other user defined program - -
-
GPSBabel -This allows setting the specific location of GPSBabel. -&appname; will need to be restarted for this setting to take effect. -
-
Auto Read World Files -If this is on, when a new image is selected for the GeoRef layer then the associated world file will be read to find the scale and positional properties. -The associated file is based on filename patterns; e.g. if the image is filename.jpg - then the world file may be filename.jpgw or filename.jgw -
-
Auto Device GPX Simplify -If this is on, GPX files will be simplified (using GPSBabel) if they are saved into a special location (by default a Garmin device location in OS file system). -Extra parameters used in process such as the location and limits applied can be refined by export_device_* values in . -A warning message is displayed when this occurs so one can consider if manually managing the tracks is needed, e.g. see methods. -The main intention for this is to prevent writing GPX files that are only partially useful. -For instance on a GPS Etrex 20 device: if a track with 1000 points is saved to it, the device will only read in the first 500 points, -thus effectively making only 1/2 of the track available. -Hopefully a simplified track will be more useful to follow to your destination when one is out in the wilds, than only a section of it. - -You will need to set the appropriate limits for your device, as this is not currently auto detected. -
-
- -
Advanced -
Save File Reference Mode - - Files referenced within project files can be saved with either absolute or relative paths. - Using relative paths can be useful when copying the project file and the associated files between different systems. - -
-
Ask for Name before Track Creation -A setting to control whether an automatic name is used when creating a new track or route, or whether you are asked to enter a name. -
-
Show Tooltip during Track Creation -A setting to control whether the tooltip with the cumulative track or route distance is shown when creating tracks and routes. -
-
The number of recent files - - The number of recent files shown in the FileOpen Recent File menu. - A value of -1 means all files. The new value applies to New Windows only (or on application restart). - -
Open files in selected layer -A setting to control whether non Viking format files (i.e. typically GPX or KML files) will open in the selected TrackWaypoint Layer. -When no TrackWaypoint Layer is selected (or the layer is invisibile) then the file will be open in the default manner: at the top level. - -
-
Show calendar day names -A setting to control whether the calendar displays day names (Mon, Tue, etc...) or not. - -
-
Ruler area label position -A setting to control the position of the label drawn on the viewport that shows the area value. Includes a setting to turn off the label. - -
-
Use Scroll to Zoom -A setting to control if scroll events cause the viewport to zoom (rather than moving). Useful with mouse scroll wheels, but less intuitive for touchpads. - -
-
Invert Scroll Direction -A setting to control the direction of scroll events. Especially useful with touchpads and can be used to override the desktop system's setting. - -
-
-
- -
OpenStreetMap Traces -
OAuth Method - - Using the OAuth method means that your OSM account details are no longer needed to be known by &appname;. - Instead specific tokens are generated for use only by &appname; which are associated with your OSM account. - -Get New OSM Access Tokens - Use this button to generate a new OSM Access Token Key and Secret. - You will be redirected to the OSM website to confirm allowing &appname; to access the GPX Traces features. - The tokens returned by the OSM website will be stored in the Access Token Key + Access Token Secret preferences. - -Access Token Key + Access Token Secret: -These are the values used, however one typically does not need to manually change them. -
-
HTTP Basic Authentication (Discouraged) -OSM Username + Password -Store your OSM details here, so that you don't need to enter it in every time in the procedure. -This is not recommended and one should use the OAuth method using access tokens described above. - - -Your OSM password will be stored in plain text. - - - - -This password is transferred unencrypted in every request sent to the OpenStreetMap server. This is due to the use of OpenStreetMap's basic authentication method. - - - - -When OAuth capability is built into &appname; (the default), use of HTTP Basic Authentication can only be used if the osm_basic_auth is enabled. - - -
-
- -
Mapnik - -If any changes to these settings are made, you will need to restart &appname; to make them be applied. - - -
Plugins Directory -The location of Mapnik plugins. An attempt is made to automatically determine the initial value, - however if this is wrong or Mapnik is upgraded then the directory can be set here. -
-
Fonts Directory - -The location of fonts for use with Mapnik. Normally it is best to simply use the System's font directory. - -
-
Recurse Fonts Directory -Load fonts in any sub-directories of the main font directory. -
-
Rerender Timeout -The time in hours before any tile is rerendered. -This is useful in case the underlying source data for the tiles changes (e.g. OSM data is continually evovling). - &appname; normally has no way of knowing when the data has changed, so this simple timeout method is provided to maintain consistency of the tile images. -
-
CartoCSS -This allows setting the specific location of the carto executable. -
-
Threads - - The number of threads to use for Mapnik rendering tasks. - By default the value is set to the 1 in case of any multi-threading rendering code chain crashes. - Otherwise trying setting the value to the number of the CPUs of the system minus one (so as not to overload the system), in order to minimise the overall rendering times. - -
-
- -
Routing -
Routing engine -You can select the routing engine used by default, ie by features that do not propose a live selection, like . -
-
- -
Startup -Naturally since these preferences effect the startup, the values will not be used until &appname; is restarted. -
Restore Window Setup -When this is enabled, the main window size and layout (such as whether the statusbar or layers panel are shown) is restored to the values from last use. -
-
Default Map Layer -When this is enabled, a map layer is automatically added whenever &appname; is opened and a &appname; file is not to be loaded. -The map layer used is defined by the map layer's default values. -
-
Startup Method -Enables selection of how the startup position should be determined. - - -Home Location (default) -Position as set by the Set the Default Location - - -Last Location -Uses the last position viewed on the viewport - - -Specified File -Load the file as specified below - - -Auto Location - - Uses the GeoClue service if available - or otherwise the web service hostip.info to attempt to determine your location via IP lookup - - - - -
-
Startup File -Loads this specified file when the Startup method is set to Specified File -
-
Check For New Version -Periodically (no more than once every 14 days), check to see if there is a new version of &appname; available. -
-
- -
Toolbar -
Append to Menu -Allows setting the toolbar on the same vertical space as the menu, thus increasing vertical space for the map. -
-
Icon Size -Allows configuration of the icon size, including overiding the system's default preference to the setting desired just for &appname;. -
-
Icon Style -Allows configuration of the icon style, including overiding the system's default preference to the setting desired just for &appname;. -
-
Customize -Opens the Customize Toolbar dialog. -From this dialog the items in the toolbar can be added, removed and reordered. Reordering of items is performed by drag and drop. -
-Customize Toolbar dialog - - - -
-
-
- -
- - -
Howto's -
Getting Started - -&appname; from version 1.5 has several features to ease the start up process. -On the very first run, you will be asked if you want to enable these features which make use of an Internet connection. -If you select no or you have upgraded from an earlier version you can choose to enable any of the startup options via the . - - -Some other general use cases for using &appname;, are as follows: - -
Go to an area of interest - -&appname;'s default location is a Manhatten, New York, USA, so you may need to pick another place that interests you - such as where you live. - - -Method A - - - Use the online location address/place search. - - - Use the Go to Location toolbar button or from the menus - ViewGo to Location. - You can change the search location provider if desired. - Enter the name of place you wish to go to (you may need to specify the country to refine the search). - Also you can enter a post code or a ZIP code instead. - - - You will need an internet connection for this search to work - - - - -Method B - - - If you know the coordinates of where you want to view: - - -Use View and select from either Go to Lat/Lon or Go to UTM and then enter in the specific coordinates. - - - - -Method C - -Use the GPS Layer or FileAcquireFrom GPS -to load data directly from your GPS into &appname;. - -You can specify the types of data to acquire: Tracks, Routes and/or Waypoints. - - -You must have write permission to the port used. For Unix like OS: - - /dev/ttyS0 is the first serial port - /dev/ttyUSB0 is the first USB port - usb: is any USB port - -Depending on your distribution only one of the USB port types may work -For Windows: - - com1: is the first serial port - usb: is any USB port - - - - The GPS devices supported are those supported by GPSBabel. - Garmin and Magellan GPS devices supported by all versions, later versions of GPSBabel support more devices such as DeLorme and Navilink. - - - - -Method D - - -Get data from files in GPX or KML format, which can be opened directly. -Use FileOpen - - -Other formats can be imported that are supported by GPSBabel. -FileAcquireImport File With GPSBabel... - - - -The viewport will be automatically moved and resized to view the contents of the file. - - - - -
-
Add a Map Layer - -Use LayersNew Map Layer, and choose a suitable cache directory -where you would like to store your tracks and click OK. Zoom to a -comfortable level (I suggest 4 mpp) by clicking the left and right -mouse buttons on the gray area where your tracks are. Now from the menu -choose the Tool. Click where you would like to download a -map. Regardless of what tool you are using, the middle mouse button -always pans. - - -You need an open internet connection when you are downloading maps. - - - -If you can no longer see your tracks or waypoints and only the map, -it is because the layer named Map is ABOVE your TrackWaypoint layer that your GPS data is in. -This means that it will be drawn last and on top of the other . -Look at the to the left which shows this order. -Select the Map layer from the list and click the down arrow button beneath the list until the Map layer is below the TrackWaypoint layer. -Your tracks will now be drawn over the map. - -
- -
Set Your Home Location - - You can save the current center position of the viewport as the default location AKA the Home Location by - EditSet the Default Location. - - - Then at any time you can return to this place by clicking on the Home icon on the toolbar. - - - You can also set the default location via specifing the exact latitude and longitude in the . - -
- -
-
From 1st startup to GPS track (including offline maps) - -The first you'll see is an empty map, because &appname; in its default configuration will download maps only on demand. -Before fetching unneeded data, one can position to a location of interest, e.g. Stuttgart: ViewGo to Location, enter Stuttgart. - -
Fetching the maps - -Map - - -LayersNew Map Layer -in the layer properties dialogue choose e.g. OpenStreetMap (Mapnik). - -For the moment, we keep the default Maps Directory (the directory in -which the maps will be stored and can be used for offline usage). - - -Check Autodownload maps and keep the zoom level as Use Viking -Zoom Level. - - -however, that these settings will play an important -role in the pre-fetch for offline usage discussed later - - - - -You'll see a map of Stuttgart. Using the mouse wheel, you can -zoom in and out. The maps for the choosen resolution will be downloaded -automatically. - - -DEM Layer (Height Map) - - -Zoom out to 512. -LayersNew DEM Layer -Keep the download source as is (SRTM Global 90m), hit OK. - - -In the layer listing on the left, the layer should reside -above the map layer. If this is not the case, highlight the DEM layer -an shift it one up (using the arrow up button). - - -highlight the DEM layer in the layer listing on the left -in the toolbar, check DEM layer download/import (the last symbol) -a left-click in the map window should then fetch the DEM data - - -This might take some time. - - -Sometimes, a tile does not show up correctly (you might see only a -black frame in the map window) because it got corrupted during -transfer. In order to correct this, you can delete the corresponding -datafile in the cache. right-click the DEM layer properties - - -The DEM Files listing allows you to delete the specific tiles (alternatively do this from the command line). - - -You can also alter the Min. and Max. elevation in this dialogue. - - -
-
GPS Track with Height Profile - -Uncheck the layer (the map is shown again) - - LayersNew TrackWaypoint Layer - Ensure the new track layer is above the map layer. - -Expand the layer, select Tracks -In the tools menu choose Create Track - -Leftclick in the map window, enter a name - - Click several times to generate a track (a right-click removes the last point). - Height data is set automatically since DEM data is available - -Expand tracks in the layer menu, your track should show up, select it -Right click your track, select Properties -Click the tab Elevation-distance - enjoy the plot - - -In order to save this setting for later usage - - -click OK in the Track Properties dialog -FileSave As, choose a name (you can open this view later via fileOpen). - - -
-
Usecase: offline data for holiday - -Suppose you want to have the and data offline for your holiday in Italy near Bologna. - - -Start a new &appname; session. -ViewGo to Location, enter Bologna -LayersNew Map Layer -Choose e.g. OpenStreetMap (mapnik). -adapt the maps directory e.g. to /home/user/.viking-map-holiday/. -This allows you to delete the map stuff after holiday without purging the rest of your maps. - -check autodownload map -keep viking zoom level -zoom out to 1024 -add a layer (as discussed above) -download the DEM data - -In the &app; version discussed here, the DEM data automatically -are stored in /home/user/.viking-maps/. You can move the corresponding -tiles into .viking-map-holiday/ if you like. - - -Download map data for all zoom levels - - -uncheck the DEM layer for the map to show up -navigate the map to be centered at Bologna -choose the zoom such, that all regions of interest are displayed in the map window (e.g. 1024) - -follow this sequence until you have all tiles for all zoom levels you need - -right-click the map layer properties -set the zoomlevel explicitely one below the last (in the first cycle 512), hit OK -right click the map layer Download Missing Onscreen Maps -wait until all tiles for that resolution have been downloaded - - - -This may take some time and some hard disk capacity. - -Do not forget to save your configuration (as discussed above). - - -
- -
-
OpenStreetMap project - -OpenStreetMap (OSM) is a collaborative project to create a free editable map of the world. -One of the sources of data for this project is GPS tracks. -&appname; supports this project via the GPS Traces methods, both uploading and downloading such data. - - - Authentication/authorization is required to use these services. See . - - -Also see for further detail. - -
Uploading data to OpenStreetMap - -It is possible to upload data directly from &appname; to OpenStreetMap. - - -Upload a layer - -One solution is to upload whole a layer. To do this, -simply select the layer and right click on it. Then, select Upload to -OSM. - - - -Upload a single track -Another solution is to upload an individual track. Simply select the track and right click on it. -Then select Upload to OSM. - - - -Fill in the form - -The filename is the name you want your upload has on the server. This information is displayed by the osm server. -The description is some descriptive information. -The tags field is a white space separated list of tags. - - -
- -
Downloading Traces from OpenStreetMap - -It is possible to download GPS traces directly from OpenStreetMap into &appname;. -This feature can be really useful for checking existing data before uploading new ones. - - -Download all visible tracks -One solution is to select - -File -Acquire -OSM traces... -. -Each request can get up to 5,000 points. -The dialog box allows setting which group of 5,000 points to get. These groups are known as Page Numbers which start at 0. -Increasing the page number parameter allows one to request the subsequent sets of point groups. - - -
-
Downloading Your Own Traces from OpenStreetMap - -It is possible to download any of your personal GPS traces previously uploaded to OpenStreetMap into &appname;. - - -Initially this will return the list of your OSM Traces, from which you can select which specific traces to retrieve. -This list can be sorted on each column so that it easier to find an individual trace or select a group of traces by similar properties. - -
- -
- -
Geotagging - - This assumes you already have a layer enabled for ease of use (if not see above to get one). - -
Manual Positioning - - This is useful for instances when you already know exactly where the image was taken (no need for tracklog). - Or maybe you want to adjust an automatically generated waypoint for the position of the subject of the image rather than the location that the photograph is taken from. - ATM this process only works on an individual image, so it will be tedious for handling lots of images. - - - First create a layer or use an existing one; and select it in the . - NB Make sure this layer is above the map layer in the Layers Panel list. - Create a new waypoint (or move an existing one) to exact location desired: - - Select the tool, then left click on the map at the location desired, choosing an image to associate with it in the new waypoint dialog - Select the tool, then left click on waypoint to be moved. Left click again and drag the waypoint to the location desired - - Then using the Select tool left click on waypoint to select it, then right click to access the Waypoint properties menu, then choose - Update Geotag on ImageUpdate - - - The Update Geotag on Image options are only available when a waypoint has an image associated with it. - -
- -
Automatic Positioning Against a Tracklog - - First you will need a tracklog with timestamps in it. Either load one from a previously saved file or freshly acquired from a GPS device - - see Getting Started. - It helps if this is the track that was recorded at the time you took some photographs! - - - Select the track either from the layers panel on the left or via the viewport using the tool. - Then right click on it and chose the Geotag Images... leading you to the Dialog. - - - Load some images that where taken around the time the track log was recorded. Confirm the other options in the dialog - normally the defaults should be alright and select OK. - If things are succesful, new waypoints with thumbnail images of the photographs will appear. - You should probably check they are really in the right place as often the timestamp of the camera may not be aligned to the GPS correctly leading to inferring incorrect locations. - -Option: Overwrite Waypoints - - This is particularly useful when one finds an attempt at geotagging gives wrong locations, often due to time offset issues. - Simply try again with a new time offset (often 1 hour adjustments due to Daylight Savings or Summer Time times) and the old waypoints will be updated (instead of creating new ones). - - - - If you have multiple tracks in a TrackWaypoint layer, then invoking the Geotag Images... action on the layer - will search all the tracks to find location matches. - -
-
- -
GPS Real Time Location - - &appname; relies on gpsd to provide the current location from a real time feed from a GPS device. - - - This assumes you already have a layer enabled for ease of use (if not see above to get one). - - - Turn on the GPS Device, ensure it has figured out it's location and plug it in to your computer. - -
Set Up GPS Layer - - You will need a layer. One can be added via LayersAdd GPS Layer. - - - Adjust the Realtime Tracking Mode settings to interface with gpsd as necessary. Normally the defaults should suffice. - - - Current Linux distributions should run gpsd automatically when a GPS Device is plugged in. Otherwise you may have to run gpsd manually. - - - Then right-click the layer and select Start Realtime Tracking. - Hopefully the viewport should jump to the GPS location. - - - Troubleshooting checklist: - -Confirm gpsd is running. -Confirm on the GPS device it has a location. -Confirm the Realtime Tracking Mode settings. -
-
- -
What to Do if &appname; Does Not Seem to Work - -In order to get some information about what &appname; is doing, start it in verbose debug mode via the command line: -viking -dV - - -NB For Windows the process is slightly more involved as the output is typically not shown in the command prompt, -so you have to redirect the output to a file, e.g. open the command prompt and then: - -cd "C:\Program Files\Viking" -viking -dV 2>1 > %TMP/viking.log - -Then close &appname; before viewing the output file, such as: -notepad %TMP/viking.log - - -For instance you can check the correct URLs &appname; is using in requesting remote data for DEMs or map tiles in the verbose debug output. -E.g. Something like this for DEMs: - -** (viking:28778): DEBUG: curl_download_uri: uri=http://dds.cr.usgs.gov/srtm/version2_1/SRTM3/Eurasia/N48E008.hgt.zip -* About to connect() to dds.cr.usgs.gov port 80 (#0) -* Trying 152.61.128.95... * connected -* Connected to dds.cr.usgs.gov (152.61.128.95) port 80 (#0) - GET /srtm/version2_1/SRTM3/Eurasia/N48E008.hgt.zip HTTP/1.1 -User-Agent: viking/0.9.8 libcurl/7.18.2 GnuTLS/2.4.2 zlib/1.2.3.3 libidn/1.8 -Host: dds.cr.usgs.gov -Accept: */* - HTTP/1.1 200 OK - Date: Sun, 26 Jul 2009 18:13:38 GMT - Server: Apache - Last-Modified: Tue, 21 Jul 2009 19:57:35 GMT - ETag: eac3f8-1828f5-46f3caa76070a - Accept-Ranges: bytes - Content-Length: 1583349 - Content-Type: application/zip - -* Connection #0 to host dds.cr.usgs.gov left intact -* Closing connection #0 -** (viking:28778): DEBUG: dem_layer_add_file: /home/username/.viking-maps/srtm3-Eurasia/N48E008.hgt.zip - -Or for OSM Mapnik tile server: - -* About to connect() to tile.openstreetmap.org port 80 (#0) -* Trying 193.63.75.28... * connected -* Connected to tile.openstreetmap.org (193.63.75.28) port 80 (#0) - GET /13/4065/2748.png HTTP/1.1 -User-Agent: viking/0.9.96 libcurl/7.20.1 GnuTLS/2.8.6 zlib/1.2.3.4 libidn/1.18 -Host: tile.openstreetmap.org -Accept: */* - -* HTTP 1.0, assume close after body - HTTP/1.0 200 OK - Date: Thu, 14 Oct 2010 22:18:42 GMT - Server: Apache/2.2.8 (Ubuntu) - ETag: "b66ff9d46474bab68262a3483428a232" -** (viking:16704): DEBUG: curl_get_etag_func: ETAG found: "b66ff9d46474bab68262a3483428a232" - Content-Length: 17194 - Cache-Control: max-age=94805 - Expires: Sat, 16 Oct 2010 00:38:47 GMT - Content-Type: image/png - Age: 5153 - X-Cache: HIT from konqi.openstreetmap.org - X-Cache-Lookup: HIT from konqi.openstreetmap.org:3128 - Via: 1.1 konqi.openstreetmap.org:3128 (squid/2.7.STABLE7) - Connection: close - -* Closing connection #0 -* About to connect() to a.andy.sandbox.cloudmade.com port 80 (#0) -* Trying 178.63.75.195... ** (viking:16704): DEBUG: curl_download_uri: uri=http://tile.openstreetmap.org/13/4065/2749.png -* About to connect() to tile.openstreetmap.org port 80 (#0) -* Trying 193.63.75.28... * connected -* Connected to a.andy.sandbox.cloudmade.com (178.63.75.195) port 80 (#0) - GET /tiles/cycle/13/4065/2747.png HTTP/1.1 -User-Agent: viking/0.9.96 libcurl/7.20.1 GnuTLS/2.8.6 zlib/1.2.3.4 libidn/1.18 -Host: a.andy.sandbox.cloudmade.com -Accept: */* - -* connected -* Connected to tile.openstreetmap.org (193.63.75.28) port 80 (#0) - GET /13/4065/2749.png HTTP/1.1 -User-Agent: viking/0.9.96 libcurl/7.20.1 GnuTLS/2.8.6 zlib/1.2.3.4 libidn/1.18 -Host: tile.openstreetmap.org -Accept: */* - -* HTTP 1.0, assume close after body - HTTP/1.0 200 OK - Date: Thu, 14 Oct 2010 23:44:35 GMT - Server: Apache/2.2.8 (Ubuntu) - ETag: "8e520ad47ce9c1b63430554886eb5fab" -** (viking:16704): DEBUG: curl_get_etag_func: ETAG found: "8e520ad47ce9c1b63430554886eb5fab" - Content-Length: 18094 - Cache-Control: max-age=87742 - Expires: Sat, 16 Oct 2010 00:06:57 GMT - Content-Type: image/png - X-Cache: MISS from konqi.openstreetmap.org - X-Cache-Lookup: MISS from konqi.openstreetmap.org:3128 - Via: 1.1 konqi.openstreetmap.org:3128 (squid/2.7.STABLE7) - Connection: close - - -
- -
- - -
- Extending Viking - - Currently, &app; has some extention points based on configuration files. The file format is heavily inspired by the GtkBuilder file format: you specify the class of the GObject to build and set its properties. Technically, it is a XML file containing a "objects" root element. Inside this element, you set a collection of "object". - Here is an example: - - - Property value - Property value - - ... - -]]> - - - You can find more examples in the documentation part of the distribution. - - It is also possible to override the internal defaults e.g. to update any parameters should they change over time, - by adding the values into your configuration file. - When you define object group that already exists (and for Maps this means by a repeated Id key, but you may have to examine the source code to work out what the relevant Id values are) then you need to define all the other keys as well, otherwise they will be reset to the defaults. - -
- Map Source - It is possible to add new map's sources. The file is ~/.viking/maps.xml for UNIX like systems, C:\Documents and Settings\username\.viking\maps.xml on Windows XP or C:\Users\username\.viking\maps.xml on Windows 7 onwards. - An example of the file is in the distribution doc/examples/maps.xml. Further examples and values are online in the Maps Wiki - - The VikSlippyMapSource allows to declare any map's source working like OpenStreetMap. It supports the following properties: - - - id - this is an integer and should be unique as it used to identify the map source - - - name - a string (should be unique) that is used for the OSM style cache directory name when the Map Cache directory is the default (~/.viking-maps) - - - label - the text displayed in the map's source selection dialog - - - hostname - the server's hostname (eg. "tile.openstreetmap.org") - - - url - - the parametrized address of the tile, in the spirit of C printf format, with 3 "%d" fields for Z, X and Y (in that order) (eg. "/%d/%d/%d.png") - - The full parametrized address can just be put in the URL field and the hostname field doesn't need specifying. - e.g. "https://tile.openstreetmap.org/%d/%d/%d.png" - - - - - zoom-min (optional) - The minimum zoom value supported by the tile server. The Default is 0 if not specified. - - - zoom-max (optional) - - The maximum zoom value supported by the tile server. The Default is 18 if not specified. - See Zoom Levels - - - - lat-min (optional) - The minimum latitude value in degrees supported by the tile server. The Default is -90 degrees if not specified. - - - lat-max (optional) - The maximum latitude value in degrees supported by the tile server. The Default is 90 degrees if not specified. - - - lon-min (optional) - The minimum longitude value in degrees supported by the tile server. The Default is -180 degrees if not specified. - - - lon-max (optional) - The maximum longitude value in degrees supported by the tile server. The Default is 180 degrees if not specified. - - - file-extension (optional) - - The file extension of the files on disk. The default is .png - If the tile source URL ends in something other than .png, then this parameter will need to match it. - This can also be useful in reading a tileset from other software which may name tiles in an alternative form, - e.g. for Mobile Atlas creator it names them .png.tile - The file types actually usable are those supported by GDK Pixbuf Library, which includes at least PNG and JPEG. - Remember to include the beginning '.' when specifying this parameter. - - - - use-direct-file-access (optional) - - Only use files on disk. The default is FALSE - This can also be useful for tilesets already on disk as it will avoid attempting to download any tiles. - Thus with this type the hostname and url parameters are not necessary and are ignored. - - - - switch-xy (optional) - - Swap the X,Y values around in the URL parametrized ordering. - The default is false. - - - - check-file-server-time (optional) - - Sends the timestamp of the tile to the server, so the server can decide whether it should send a new tile or not. - The default is false. - - - - use-etag (optional) - - Use and compare the ETag value in determining whether to download a newer tile. The default is false. - The ETag value is stored in a separate file in the same directory as the tile to enable checking the value across multiple runs of the program. - - - - tilesize-x (optional) - The tile x size. The default is 256 pixels if not specified. - - - tilesize-y (optional) - The tile y size. The default is 256 pixels if not specified. - - - scale (optional) - - The tile scale. The scale is 1 if not specified. - Use a value of 2 to represent high res tiles. - Don't change the tilesize as the internal display size is still based on 256 pixels. - - - - - - The VikTmsMapSource allows to declare any TMS service. It supports the following properties (as per VikSlippyMapSource above): - - - id - - - label - - - hostname - - - url - - - check-file-server-time (optional) - - - zoom-min (optional) - - - zoom-max (optional) - - - lat-min (optional) - - - lat-max (optional) - - - lon-min (optional) - - - lon-max (optional) - - - - The VikWmscMapSource allows to declare any WMS or WMS-C service. It supports the following properties (as per VikSlippyMapSource above): - - - id - - - label - - - hostname - - - url - - - check-file-server-time (optional) - - - zoom-min (optional) - - - zoom-max (optional) - - - lat-min (optional) - - - lat-max (optional) - - - lon-min (optional) - - - lon-max (optional) - - - -
- -
- Go-to search engines - It is possible to add new new search engines for the "Go-To" feature. The file is ~/.viking/goto_tools.xml. - An example of the file in the distribution doc/examples/goto_tools.xml. - Currently, there is a single object class available: VikGotoXmlTool. Such feature allows to declare any search engine using a XML format as result. - The related properties are: - - - label - the text displayed in the Go-To dialog - - - url-format - the parametrized address of the query, in the spirit of C printf format, with a single "%s" field (replaced by the query string) - - - lat-path - XML path of the latitude (eg. /root/parent/elem) - - - lat-attr (optional) - name of the attribute (of previous element) containing the latitude - - - lon-path - XML path of the longitude (eg. /root/parent/elem) - - - lon-attr (optional) - name of the attribute (of previous element) containing the longiude - - - - As a facility (or readability) it is possible to set both path and attribute name in a single property, like an XPath expression. To do so, simply set both info in lat-path (or lon-path) in the following format: /root/parent/elem@attribute. -
- -
- External tools - It is possible to add new external tools. The file is ~/.viking/external_tools.xml. - An example of the file in the distribution doc/examples/external_tools.xml. - The VikWebtoolCenter allows to declare any Webtool using a logic based on center coordinates and zoom level value. - The related properties are: - - - label - the text displayed in the menu entry - - - url - the parametrized URL to open, in the spirit of C printf format, with 2 "%s" and a "%d" fields for X, Y and Z (zoom level) (eg. "http://hostname/?lat=%s&lon=%s&zoom=%d") - - - - The VikWebtoolBounds allows to declare any Webtool using a logic based on bounds coordinates. - The related properties are: - - - label - the text displayed in the menu entry - - - url - the parametrized address of the tile, in the spirit of C printf format, with 4 "%s" fields for left, right, bottom and top (eg. "http://hostname:8111/load_and_zoom?left=%s&right=%s&bottom=%s&top=%s") - - - -
- -
- Routing engine - It is possible to declare new routing engines. The file is ~/.viking/routing.xml. - An example of the file in the distribution doc/examples/routing.xml. - The VikRoutingWebEngine allows to declare a routing engine available via HTTP. - The related properties are: - - - id - a string, should be unique as it used to identify the routing engine - - - label - the text displayed in the menu entry - - - format - - The GPSBabel format code to interpret the service response. By default a GPX response is expected and processed internally. However if the service returns different format then GPSBabel is used to transform the text into something that &appname; can understand. Only formats that GPSBabel supports can be used: e.g. 'gpx', 'kml', 'gtrnctr' (for Garmin Training Center .tcx files), etc... - Use gpsbabel --help on the command line to find out the supported file types and their codes to process them. - - - - url-base - the base URL of the web service (eg. "http://hostname/service?") - - - url-start-ll - the part of the URL setting the starting point location, parametrized in the spirit of C printf format, with 2 "%s" for coordinates (eg. "&start=%s,%s") - - - url-stop-ll - the part of the URL setting the end point location, parametrized in the spirit of C printf format, with 2 "%s" for coordinates (eg. "&stop=%s,%s") - - - url-via-ll (optional) - the part of the URL setting via point location, parametrized in the spirit of C printf format, with 2 "%s" for coordinates (eg. "&via=%s,%s") - - - url-start-dir (optional) - the part of the URL setting the starting point location for direction based routing, parametrized in the spirit of C printf format, with one "%s" for direction (eg. "&start=%s") - - - url-stop-dir (optional) - the part of the URL setting the end point location for direction based routing, parametrized in the spirit of C printf format, with one "%s" for direction (eg. "&start=%s") - - - url-ll-lat-first (optional) - The ordering of the lat/long terms in the Start, Stop and Via URL settings. By default this is TRUE. - For instance using Brouter services, the URL uses a pair of values which is longitude and then latitude. Thus setting this value to FALSE ensures the value substitution is performed in the necessary order. - - - referer (optional) - A URL to serve as referer for the HTTP request (eg. "http://hostname/") - - - follow-location (optional) - the max depth of recursive redirections - - - -
- -
- Remote File Datasources - It is possible to add web references expected to return a file which can then be opened directly or converted via GPSBabel. - The file is ~/.viking/datasources.xml. - An example of the file is in the source distribution doc/examples/datasources.xml. - The VikWebtoolDatasource allows to declare any URL using logic based on coordinates. - The related properties are: - - - label - the text displayed in the menu entry - - - url - - the parametrized URL to open in the spirit of C printf format, with up to 9 "%s" values. e.g. http://hostname/getfile?lat=%s&lon=%s - The order and meaning of these parameters is given by the url_format_code below - - - - url_format_code - - A string describing the parametrized URL substitution parameters, each character represents how to translate each term. - B = Bottom of the current view i.e. minimum latitude - L = Left of the current view i.e. minimum longitude - T = Top of the current view i.e. maximum latitude - R = Right of the current view i.e. maximum longitude - A = center lAtitude of the current view - O = center lOngitude of the current view - Z = OSM Zoom value of the current view. See Zoom Levels - P = selected Point's latitude - N = selected poiNt's longitude - S = A user specified input string requested from the user via a dialog box - Thus for the url example above then the format code should be AO - - - - file_type - - This value is passed on for the -i parameter in interfacing with GPSBabel. - If it is not defined then the returned file is interpreted internally as a GPX file. - Possible values such as 'kml', 'mapsource' etc.. can be used. See GPSBabel File Formats for the full list. - - - - babel_filter_args - - This value is passed on for the filter arguments interfacing with GPSBabel. - E.g. "-x nuketypes,routes" can be used to filter all routes from the results. - - - - input_label - - This value is used when requesting input from the user. - It is the label of the text input box. - - - - -
- -
- System Extension File Locations - Note that, on UNIX like systems, the extension files (&extfiles;) are also searched in /etc/viking and /usr/share/viking directories (or related in your system). - The XDG_DATA_DIRS environment variable can be used to change these directories. - The XDG_DATA_HOME environment variable is also used (if set) to look for these extension files. -
- - -
- Miscellaneous Settings - Various individual values are automatically saved between &app; sessions in the ~/.viking/viking.ini file. - This file is not intended to be manually edited, but since it is a plain text file it can be changed if desired. - Some values in this file are read only, in the sense that there is no way to set it other than by manually entering in the keys and values (the key will not exist in the file otherwise). This allows some fine tuning of &app; behaviours, without resorting to recompiling the code. However is it not expected that these values should need to be changed for a normal user, hence no GUI options for these have been provided. - Here is the list of the read only keys and their default values. - - - curl_cainfo=NULL - See CURLOPT_CAINFO - - - curl_ssl_verifypeer=1 - See CURLOPT_SSL_VERIFYPEER - On Windows this is defaulted to 0 to get HTTPS connections to at least work, - otherwise any attempts at verifying always fail. - [Some incompatibily is suspected in the reliant binary DLLs] - - - geoclue_accuracy_level=4 - Set the integer value for the accuracy level request to the GeoClue service. Values to match the GClueAccuracyLevel: - - 0 = GCLUE_ACCURACY_LEVEL_NONE - 1 = GCLUE_ACCURACY_LEVEL_COUNTRY - 4 = GCLUE_ACCURACY_LEVEL_CITY - 5 = GCLUE_ACCURACY_LEVEL_NEIGHBORHOOD - 6 = GCLUE_ACCURACY_LEVEL_STREET - 8 = GCLUE_ACCURACY_LEVEL_EXACT - - - - gpx_tidy_points=true - ATM Only attempts to remove a suspicious first point of a GPX track - (as opposed to any points within a track). - - - gpx_tidy_points_max_speed=340 - Over this speed (in metres per second) for the first pair of points - the first point is removed. - - - layers_create_trw_auto_default=false - Create new TrackWaypoint layers without showing the layer properties dialog first. - - - layers_panel_calendar_markup_mode=3 - 0=No markups. 1=Day marked. 2=Day marked and tooltips created. 3=Auto (timed tooltip creation, so if too slow it reverts to 1) - - - maps_max_tiles=1000 - - - maps_min_shrinkfactor=0.0312499 - - - maps_max_shrinkfactor=8.0000001 - - - maps_real_min_shrinkfactor=0.0039062499 - - - maps_scale_inc_down=4 - - - maps_scale_inc_up=2 - - - maps_scale_smaller_zoom_first=true - - - srtm_http_base_url=https://dds.cr.usgs.gov/srtm/version2_1/SRTM3 - Allows using an alternative service for acquiring DEM SRTM files. - Note that the layout on the server needs to be split into Continent directories. - - - mapnik_buffer_size=128 (in pixels) - - - osm_basic_auth=false - Set to true to force the use of HTTP Basic Authenication even when OAuth is available - - - background_max_threads=10 - - - background_max_threads_local=Number of CPUs - - - window_default_tool=Pan - Options are: Pan, Zoom, Ruler or Select - - - window_menubar=true - - - window_copy_centre_full_format=false - - - version_check_period_days=14 - - - trackwaypoint_start_end_distance_diff=100.0 - - - gps_statusbar_format=GSA - This string is in the Message Format Code - - - geoclue_statusbar_format=SA - This string is in the Message Format Code - - - trkpt_selected_statusbar_format=KEATDN - This string is in the Message Format Code - - - utils_nearest_tz_factor=1.0 - - - viewport_history_size=20 - - - viewport_history_diff_dist=500 - In metres. - - Go Back or Go Forward requests over this range from the last history location will move back to that position. - If within this range it will skip over this location and move on to the next saved history location. - - - - viewport_scale=1 - - If Viking doesn't automatically detect a high resolution display, you can force the setting here - typically by setting this to 2. - - - - external_diary_program=rednotebook - Or in Windows it uses C:/Progra~1/Rednotebook/rednotebook.exe - This string value must use Unix separators and not have spaces. - - - external_astro_program=stellarium - Or in Windows use C:/Progra~1/Stellarium/stellarium.exe - This string value must use Unix separators and not have spaces. - Needs to be version 0.15.0 or greater (otherwise due to this Bug means this does not actually work). - - - external_text_program=gedit - Or in Windows it uses notepad - This string value must use Unix separators and not have spaces. - - - bfilter_simplify=100 - - - bfilter_compress=0.001 - - - list_date_format=%Y-%m-%d %H:%M - A date format description as passed on to strftime(). - Note that when displayed in tables sorting by this column simply uses the text value, rather than the underlying date/time value. - - - - export_device_path=OS Specific - UNIX = "/media/user/GARMIN/Garmin/GPX" - WINDOWS = ":/Garmin/GPX" - - - export_device_trackpoint_limit=10000 (Typical Garmin Edge limit) - Older Garmins limits are typically much lower - Etrex 20/30 is 500 - - - export_device_routepoint_limit=250 - - - kmz_default_maps_dir=Empty - You may want to use something like: "/media/user/GARMIN/Garmin/CustomMaps" - - - -
- Message Format Code - Currently for ease of implementation the message format code is a string of characters. - Each character represents what should be inserted in relation to a Trackpoint. - One day it might evolve into something more user friendly with a frontend to control it, perhaps allowing arbitary text too. However for now at least some control is offered :) - - - - Character Code - - G = Some text to display at the start of the message - GPSD - K = Some text to display at the start of the message - Trkpt - A = Altitude of a Trackpoint - S = Speed of a Trackpoint - B = Vertical Speed (Climb) - C = Course of a Trackpoint - L = Location of a Trackpoint - T = Time of a Trackpoint - M = Time diff of a Trackpoint from the previous trackpoint - X = Number of satellites used in the trackpoint fix - D = Distance of the trackpoint from the start of a track (following along the track) - F = Distance of the trackpoint from the finish (end) of a track (following along the track) - P = Distance difference of the trackpoint from the previous trackpoint - N = Name of track to which the trackpoint belongs - E = Name of the trackpoint - - - - Output Notes - - If the output has * after it, then the value has been calculated via interpolation (such as speed when the Trackpoint does not contain a speed value). - If the output has ** after it, then difficulties were encountered in trying to work out the value so probably a default of 0 will be shown. - - - - -
- -
- -
- Keyboard Shortcuts (Accelerator) Settings - This is held in the file ~/.viking/keys.rc - It is in the standard GTK Accelerator map format. Values are automatically read in and saved between &app; sessions. - This file is not intended to be manually edited, but since it is a plain text file it can be changed if desired. -
- -
- - - - - - - - -
diff --git a/help/Makefile.am b/help/Makefile.am index 9ef4869..f263aeb 100644 --- a/help/Makefile.am +++ b/help/Makefile.am @@ -1,27 +1,22 @@ -if GEN_MANPAGES -include $(top_srcdir)/gnome-doc-utils.make -endif +@YELP_HELP_RULES@ # Annoyingly in the XML, yelp refuses to load relative images fileref, i.e. ../../src/icons/file.png # whereas the PDF generation inserts these references OK # Nevertheless we need to copy the images into figures/ so they are available for the distribution installed help -# Most tool icons are _18, except the pan one which is _22 just to be annoying -get-icons: - -cp -f ../src/icons/*_[12][0-9].png C/figures/ +C/figures/%.png: + -cp -f ../src/icons/$(notdir $@) C/figures/ # '-' ^^^^^ means it doesn't care about the exit status # this copy statement is not critical (especially when run under make distcheck) -dist-hook: get-icons doc-dist-hook - -DOC_MODULE = viking -DOC_ENTITIES = legal.xml \ +HELP_ID = viking +HELP_FILES = index.docbook +HELP_EXTRA = legal.xml \ attribution.xml \ commandline.xml \ georef_layer.xml \ mapnik_rendering_layer.xml \ recommends.xml -DOC_INCLUDES = -DOC_FIGURES = \ +HELP_MEDIA = \ figures/Aggregate_statistics.png \ figures/Aggregate_statistics_years.png \ figures/addtr_18.png \ @@ -57,20 +52,17 @@ DOC_FIGURES = \ figures/Viking-TAC.png \ figures/DEM_file_info_dialog.png \ figures/customize_toolbar_dialog.png -DOC_LINGUAS = +HELP_LINGUAS = EXTRA_DIST = viking.xml.in CLEANFILES= # man pages processing -if GEN_MANPAGES MANPAGES=viking.1 man_MANS = $(MANPAGES) CLEANFILES+=$(MANPAGES) -endif -DB2MAN=@DB2MAN_XSL@ -XP=@XP@ -''-nonet +XSLTPROC=@XSLTPROC@ -''-nonet %.1: %.xml - $(XP) -o $@ $(DB2MAN) $< + $(XSLTPROC) -o $@ http://docbook.sourceforge.net/release/xsl/current/manpages/docbook.xsl $< diff --git a/help/viking.omf.in b/help/viking.omf.in deleted file mode 100644 index 745d1e5..0000000 --- a/help/viking.omf.in +++ /dev/null @@ -1,10 +0,0 @@ - - - - - manual - - - - - diff --git a/src/Makefile.am b/src/Makefile.am index 3752897..78bda6b 100644 --- a/src/Makefile.am +++ b/src/Makefile.am @@ -16,16 +16,8 @@ authors.h: $(top_srcdir)/AUTHORS sed -e "s/ \*\*.*//" -e 's/^/"/' -e 's/$$/",\\/' -e '$$s/\\$$//' $< >> $@ echo "NULL};" >> $@ -if HAVE_XSLTPROC -documenters.h: $(top_srcdir)/help/C/viking.xml - $(XP) $(srcdir)/docbook2documenters.xsl $(top_srcdir)/help/C/viking.xml > $@ -else -documenters.h: - rm -f $@ - echo "/* Generated file. */" >> $@ - echo "const gchar *DOCUMENTERS[] = {\\" >> $@ - echo "NULL};" >> $@ -endif +documenters.h: $(top_srcdir)/help/C/index.docbook + $(XSLTPROC) $(srcdir)/docbook2documenters.xsl $(top_srcdir)/help/C/index.docbook > $@ BUILT_SOURCES = authors.h documenters.h diff --git a/src/vikwindow.c b/src/vikwindow.c index 307dfd9..320df61 100644 --- a/src/vikwindow.c +++ b/src/vikwindow.c @@ -2864,7 +2864,7 @@ static void help_help_cb ( GtkAction *a, VikWindow *vw ) ShellExecute(NULL, "open", ""PACKAGE".pdf", NULL, NULL, SW_SHOWNORMAL); #else /* WINDOWS */ gchar *uri; - uri = g_strdup_printf("ghelp:%s", PACKAGE); + uri = g_strdup_printf("help:%s", PACKAGE); GError *error = NULL; gboolean show = gtk_show_uri (NULL, uri, GDK_CURRENT_TIME, &error); if ( !show && !error ) -- cgit v1.2.3 From 235d2c668e88faa9f65abecdc69cb78017b8da17 Mon Sep 17 00:00:00 2001 From: Paul Gevers Date: Sun, 5 Jul 2020 21:39:15 +0200 Subject: upstream git contains the geoclue_layer.xml, but the tar ball does not. xmllint trips on this. =================================================================== Gbp-Pq: Name geocluelayer.xml_not_included.patch --- help/C/index.docbook | 2 -- 1 file changed, 2 deletions(-) diff --git a/help/C/index.docbook b/help/C/index.docbook index d7e8bd3..aade818 100644 --- a/help/C/index.docbook +++ b/help/C/index.docbook @@ -2263,8 +2263,6 @@ This clears the Tracks Area Coverage information, thus no grid colouring will be - -
Coordinate Layer -- cgit v1.2.3 From 13a8bb94a291dd4d6a851335f9d366bfbaca611f Mon Sep 17 00:00:00 2001 From: Nikolay Korotkiy Date: Tue, 4 Feb 2020 21:12:47 +0000 Subject: [PATCH] Fix build without mapnik Signed-off-by: Rob Norris Gbp-Pq: Name fix_build_without_mapnik.patch --- src/viklayer.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/viklayer.c b/src/viklayer.c index dc0ab1f..3070157 100644 --- a/src/viklayer.c +++ b/src/viklayer.c @@ -36,7 +36,7 @@ extern VikLayerInterface vik_dem_layer_interface; #ifdef HAVE_LIBMAPNIK extern VikLayerInterface vik_mapnik_layer_interface; #endif -#ifdef HAVE_LIBMAPNIK +#ifdef HAVE_LIBGEOCLUE_2 extern VikLayerInterface vik_geoclue_layer_interface; #endif -- cgit v1.2.3 From 3104dc66959361db54afdf0e3ab6a34b3b238ace Mon Sep 17 00:00:00 2001 From: Bernd Zeimetz Date: Sat, 16 Oct 2010 18:57:01 +0200 Subject: [PATCH] disable-po-check Gbp-Pq: Name 0001-disable-po-check.patch --- po/Makefile.in.in | 8 ++------ 1 file changed, 2 insertions(+), 6 deletions(-) diff --git a/po/Makefile.in.in b/po/Makefile.in.in index fcd2c3b..9a494ad 100644 --- a/po/Makefile.in.in +++ b/po/Makefile.in.in @@ -145,12 +145,8 @@ uninstall: rm -f $(DESTDIR)$(localedir)/$$lang/LC_MESSAGES/$(GETTEXT_PACKAGE).mo.m; \ done -check: all $(GETTEXT_PACKAGE).pot - rm -f missing notexist - srcdir=$(srcdir) $(INTLTOOL_UPDATE) -m - if [ -r missing -o -r notexist ]; then \ - exit 1; \ - fi +check: + # do nothing as it messes up with quilt's .pc folder. mostlyclean: rm -f *.pox $(GETTEXT_PACKAGE).pot *.old.po cat-id-tbl.tmp -- cgit v1.2.3 From 89b685ff56f44a90ad202dae19aecce546f99595 Mon Sep 17 00:00:00 2001 From: Bernd Zeimetz Date: Sat, 19 Nov 2016 00:15:50 +0100 Subject: fix build on hurd Gbp-Pq: Name fix_build_on_hurd --- src/metatile.h | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/src/metatile.h b/src/metatile.h index 0206133..50d5b0c 100644 --- a/src/metatile.h +++ b/src/metatile.h @@ -26,3 +26,7 @@ int xyz_to_meta(char *path, size_t len, const char *dir, int x, int y, int z); int metatile_read(const char *dir, int x, int y, int z, char *buf, size_t sz, int * compressed, char * log_msg); + +#ifndef PATH_MAX +#define PATH_MAX 4096 +#endif -- cgit v1.2.3 From 2f62517f48c53764af52ff44b6b43445fecd14ec Mon Sep 17 00:00:00 2001 From: Bernd Zeimetz Date: Wed, 29 Jul 2020 07:06:21 +0200 Subject: no-doc-dir Gbp-Pq: Name no-doc-dir --- Makefile.am | 2 +- configure.ac | 11 +---------- 2 files changed, 2 insertions(+), 11 deletions(-) diff --git a/Makefile.am b/Makefile.am index e59a6b3..4d283ec 100644 --- a/Makefile.am +++ b/Makefile.am @@ -1,4 +1,4 @@ -SUBDIRS = src test data po windows help tools doc +SUBDIRS = src test data po windows help tools INTLTOOL = \ intltool-extract.in \ diff --git a/configure.ac b/configure.ac index 94b7bff..264b5ea 100644 --- a/configure.ac +++ b/configure.ac @@ -11,13 +11,6 @@ AM_INIT_AUTOMAKE([dist-bzip2 dist-zip subdir-objects]) dnl AC_CONFIG_SRCDIR([src/main.c]) AC_CONFIG_HEADERS([src/config.h]) -# check for gtk-doc -m4_ifdef([GTK_DOC_CHECK], [ -GTK_DOC_CHECK([1.0],[--flavour no-tmpl]) -],[ -AM_CONDITIONAL([ENABLE_GTK_DOC], false) -]) - AC_PROG_CC AC_PROG_CC_STDC # Checks for programs. @@ -594,9 +587,7 @@ AC_CONFIG_FILES([ windows/installer/Makefile windows/installer/pixmaps/Makefile windows/installer/translations/Makefile - doc/Makefile - doc/reference/Makefile - doc/examples/Makefile]) + ]) AC_OUTPUT -- cgit v1.2.3 From 0e58e83ac7565c671895d711542229078ea72256 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Ball=C3=B3=20Gy=C3=B6rgy?= Date: Wed, 11 Mar 2020 21:57:58 +0100 Subject: [PATCH] Port to yelp-tools This removes the usage of deprecated gnome-doc-utils. Gbp-Pq: Name 18d7c02d5829ec796efaa6b0fba0632f478048ba.patch --- Makefile.am | 7 - README.md | 6 +- configure.ac | 21 +- help/C/index.docbook | 4151 ++++++++++++++++++++++++++++++++++++++++++++++++++ help/C/legal.xml | 2 +- help/C/viking.xml | 4151 -------------------------------------------------- help/Makefile.am | 28 +- help/viking.omf.in | 10 - src/Makefile.am | 12 +- src/vikwindow.c | 2 +- 10 files changed, 4168 insertions(+), 4222 deletions(-) create mode 100644 help/C/index.docbook delete mode 100644 help/C/viking.xml delete mode 100644 help/viking.omf.in diff --git a/Makefile.am b/Makefile.am index 4d283ec..3ba1376 100644 --- a/Makefile.am +++ b/Makefile.am @@ -12,7 +12,6 @@ full: EXTRA_DIST = \ README.md \ HACKING \ - gnome-doc-utils.make \ ChangeLog.0 \ viking.spec \ mingw-viking.spec \ @@ -29,9 +28,6 @@ generate-changelog: dist-hook: viking.spec generate-changelog cp $(top_builddir)/viking.spec $(distdir) -MAINTAINERCLEANFILES = \ - gnome-doc-utils.make - DISTCLEANFILES = \ intltool-extract \ intltool-merge \ @@ -39,8 +35,5 @@ DISTCLEANFILES = \ ACLOCAL_AMFLAGS = -I m4 -DISTCHECK_CONFIGURE_FLAGS = \ - --disable-scrollkeeper - # Ignore gtk theme cache files on distcheck distuninstallcheck_listfiles = find . -type f -print | grep -v 'icon-theme.cache' diff --git a/README.md b/README.md index 7eb70cc..d71f4c1 100644 --- a/README.md +++ b/README.md @@ -27,7 +27,7 @@ Git repository: On Debian Sid, following packages must be installed before building: - # sudo apt install gtk-doc-tools gnome-doc-utils libpng-dev libgtk-3-dev libicu-dev + # sudo apt install gtk-doc-tools docbook-xsl libpng-dev libgtk-3-dev libicu-dev The following packages are needed (they are included by default in Debian Sid, but not in other distributions). They must be installed too: @@ -37,10 +37,6 @@ The following packages are also used, but they can each be disabled with configu $ sudo apt-get install libsqlite3-dev nettle-dev libmapnik-dev libgeoclue-2-dev libgexiv2-dev libgps-dev libmagic-dev libbz2-dev libzip-dev liboauth-dev -Further packages are required if you want to generate man and help page documentation: - - $ sudo apt-get install docbook-xsl rarian-compat - ### Actual Build If you downloaded Viking from Git, you have to: diff --git a/configure.ac b/configure.ac index 264b5ea..9615f53 100644 --- a/configure.ac +++ b/configure.ac @@ -104,7 +104,7 @@ AC_SUBST(PACKAGE_LIBS) dnl ------------- dnl | User Manual |--------------------------------------- dnl ------------- -GNOME_DOC_INIT +YELP_HELP_INIT dnl --------------------------------------------------------------------------- dnl - Use deprecated options (default enabled for devs, disabled in releases) @@ -546,23 +546,7 @@ AC_DEFINE_UNQUOTED(VIK_CONFIG_DEFAULT_TILE_AGE, ${VIK_CONFIG_DEFAULT_TILE_AGE}, AC_DEFINE(HAVE_VIKING, 1, [Enable Viking specifics in otherwise reusable code]) dnl man pages processing -dnl Different distributions have differing locations for the docbook.xsl -dnl Debian like -if test -r /usr/share/xml/docbook/stylesheet/docbook-xsl/manpages/docbook.xsl; then - DB2MAN_XSL=/usr/share/xml/docbook/stylesheet/docbook-xsl/manpages/docbook.xsl -dnl RedHat like -elif test -r /usr/share/sgml/docbook/xsl-stylesheets/manpages/docbook.xsl; then - DB2MAN_XSL=/usr/share/sgml/docbook/xsl-stylesheets/manpages/docbook.xsl -else -dnl Old default - DB2MAN_XSL=/usr/share/sgml/docbook/stylesheet/xsl/nwalsh/manpages/docbook.xsl -fi -AC_SUBST(DB2MAN_XSL) -AC_PATH_PROG(XP,xsltproc) -AM_CONDITIONAL([HAVE_XSLTPROC],[test "x$XP" != "x"]) -AC_CHECK_PROG([HAVE_SCROLLKEEPER],scrollkeeper-config,"yes") -AM_CONDITIONAL([GEN_MANPAGES],[test "x$XP" != "x" && test -r "$DB2MAN_XSL"] && test "${HAVE_SCROLLKEEPER}" = "yes" ) -AM_COND_IF([GEN_MANPAGES], [ac_cv_enable_man=yes], [ac_cv_enable_man=no]) +AC_PATH_PROG(XSLTPROC,xsltproc) ISODATE="$(date --utc --date="@${SOURCE_DATE_EPOCH:-$(date +%s)}" +%Y-%m-%d)" AC_SUBST(ISODATE) @@ -618,7 +602,6 @@ OAuth : $ac_cv_enable_oauth Size of map cache (in memory) : ${VIK_CONFIG_MAPCACHE_SIZE} Age of tiles (in seconds) : ${VIK_CONFIG_DEFAULT_TILE_AGE} GeoNames user : ${VIK_CONFIG_GEONAMES_USERNAME} -Man page generation : $ac_cv_enable_man Documentation (+HTML) : ${enable_gtk_doc} (HTML: ${enable_gtk_doc_html}) ------------------------------------------- diff --git a/help/C/index.docbook b/help/C/index.docbook new file mode 100644 index 0000000..d7e8bd3 --- /dev/null +++ b/help/C/index.docbook @@ -0,0 +1,4151 @@ + + + Viking"> + + + + maps.xml, goto_tools.xml, datasources.xml, external_tools.xml, routing.xml"> +]> + + +
+ + &app; Manual + + &app; is a free/open source program to manage GPS data. + + + + 2013 + Guilhem Bonnefille + Rob Norris + + + + + GNOME Documentation Project + + + + + + + + Guilhem + Bonnefille + + + Rob + Norris + + + + username: + Alexxy + + + username: + Vikingis + + + username: + Tallguy + + + username: + EliotB + + + Alex + Foobarian + + + + + + + &appname; Manual V&manrevision; + &date; + + Guilhem Bonnefille guilhem.bonnefille@gmail.com + Rob Norris rw_norris@hotmail.com + GNOME Documentation Project + This document was generated on . + + + + + This manual describes version &appversion; of &appname;. + + + Feedback + To report a bug or make a suggestion regarding the &app; application or + this manual, follow the directions in the + Feedback section of the GNOME User Guide. + + + + + + &app; + + +
+ Introduction + +&appname; aims to be easy to use, yet powerful in accomplishing a wide +variety of tasks. Some of the things you can use &appname; for are: + + + +Uploading and downloading waypoints, tracks and routes to/from GPS. + + + +Preparing tracks, routes and waypoints for trips using maps from services such as OpenStreetMap (OSM). +The data is only needed to be uploaded to your GPS before you leave. +The maps together with your tracks, routes and waypoints can also be printed and used during the trip. + + + + +After trips, tracks and waypoints from GPS can be downloaded, stored, managed and reused in your (or your friends') later trips. + + + + +Analyzing Off Highway Vehicle (OHV) and hiking trips, understanding where you went and how far you were from something. + + + +Making waypoints, tracks and routes to follow to easily get someplace +you've never been before or don't have GPS data for but online +maps exist for it. + + + + +Making maps with using Mapnik. +Not on Windows at the moment. + + + + +Grouping data from multiple trips using a hierarchical data manager. + + + + +Analyzing speed at different places (to some degree), adding waypoints where you forgot to mark one but did slow down or stop. + + + + +Downloading and storing OpenStreetMap and/or other map types on your hard drive and looking at them later. + + + + +Editing routes or tracks and their trackpoints, joining and splitting up tracks and routes. + + + + +Show the live GPS position on the map (for use on a mobile device - e.g. a laptop). Not Windows at the moment. + + + + +Import and export track, route and waypoint files of various types via GPSBabel + + + +Previously on Windows, GPSBabel was distributed with &appname;, but this no longer the case. + + +It can be downloaded from its website . + + + + + +View, create and update Geotagged Images (using EXIF data). + + + + + +&appname; is under continual improvement: see the the Roadmap / Wishlist: + + +
+Screenshot: OSM Cycle Map and Many Tracks + + + +
+ + + The Windows build of Viking does not currently support verification of https connections. + + +
+ +
General Concepts +
Layers + +Layers is concept one may know from powerful graphics editors such as Photoshop or GIMP. +Instead of putting all the data on the same level, it is stacked (i.e. layered) with different data over one another. +This can be useful for analysis and general handling of various sets of data. + + +Unfortunately the downside of this complexity is remembering how differing layers of data can obscure other data. + + +The Map layers have Alpha Compositing, +to create the appearance of partial transparency. +By controlling this value one can see data below it in the layer heirarchy for interesting effects. + +
+
Layers Panel + +The panel on the left is called the layers panel. +It determines which layers and sublayers (such as tracks and waypoints) +are shown, and the order in which they are drawn. Layers on the +top of the layers panel list are drawn last. You can change the order by +drag and drop, or by selecting a layer and using the up and down +buttons at the bottom of the layers panel. + + + The panel also contains a calendar to show when Layers occurred. + Double clicking on the day will select and move the viewport display to that layer. + Right clicking brings up a menu from which you can select to go to the previous or next layer in time. + +
+
Viewport + +The main &appname; area where the layer data is drawn, is called the viewport. + +
+
Track Graphs + +Below the viewport can be shown track (and route) elevation/distance and time/speed (tracks only) graphs of the selected item. +These are the same graphs as shown in . +The graphs will automatically hide itself when nothing or no suitable item is selected. + + +Moving the mouse pointer over the graphs will show a tooltip readout of the nearest trackpoint. +Similarily to the track properties graphs, left clicking will center the viewport on the trackpoint. +A right click menu offers controls of the drawing options, a subset of track operations and access to further information dialogs. + +
+
Statusbar +This provides a readout of various information: + +The currently selected (mouse pointer) tool +The number of items to process in the background - normally this the number in the map tile download queue +The zoom factor +The location of the mouse pointer (and potentially height information if DEM data is available) + +When creating a track/route, the statusbar also displays some information about the track/route. +
+Statusbar + + + +
+This part of the statusbar displays: + +The total distance of the track/route (including currently edited segment). +The bearing of the currently edited segment. +The distance of the currently edited segment. + + +For convenience, a zoom selector can be opened from the status bar. Simply left-click on the zoom factor. +
+ The zoom selector available from status bar + + + +
+
+ +
Toolbar +The toolbar is an area for buttons that perform common actions. +Some actions are modal, so the appropriate layer needs selected before these toolbar buttons are enabled. See more detail. +The display of the toolbar is influenced by the +Right clicking on the toolbar and selecting Customize allows jumping to the directly. +
+ +
Projections + +&appname; supports differents projections: + + +UTM + + +LatLon (also called EPSG:4326) + + +Mercator (also called Spherical Mercator) + + + +
+ +
Map Cache + +&appname; stores downloaded map tiles to disk for a couple of reasons: + + +Enables off line usage +Reduces loading on the map tile provider + + +The &appname; automatic caching strategy is two fold: + + + + + If the age of the tile on disk is less than the specified tile age (see ), + it will not attempt to contact the server to get a new version of the tile. + + + + + When the tile age has expired &appname; will attempt a refresh update, so that it provides the cached tile generation timestamp so the server can determine if a new tile image needs to be returned. Not all map types support this refresh method. + + + + + You can override the caching scheme by using right-click on the Map on the layers panel and selecting Redownload All Onscreen Maps, or Ctrl+F5 for the top most map displayed. This will get the latest version held by the server. + + + + This can be useful if you contribute to OpenStreetMap and wish to see your modifications (of course give time for the server to have processed your changes - see I have made edits but they don't show up on the map) + + + + +The layout of the cache on disk itself can be controlled via a per Map Layer property. + +Viking - Legacy default in a private cache layout scheme +OSM - Newer available default (1.6+) + +This is to increase the compatibility between &appname; and similar applications that cache tiles on disk so that the tiles can be shared. + + + + + +
+ +
Shortcut Keys + +&appname; has several shortcut keys or key combinations for commands as listed in the main window along side the command. + + +By default some function keys follow standard GUI behaviour: + + +F1 Help (view this manual) +F5 or Ctrl+R Refresh the maps on screen +F10 Select the Menubar (in built behaviour) +F11 Full Screen +Ctrl+F5 or Ctrl+Shift+R Redownload the maps on screen + + + +Refresh attempts to get new maps only if the local tile cache time period has expired for any particular map tile. +Redownload gets all on screen maps from the server, ignoring the local tile cache. + + + +Other function keys control turn on/off visibility of various elements: + + +F3 Toggle visibility of the Toolbar +F4 Toggle visibility of the Menubar +Shift+F5 Toggle visibility of the Scale indicator on the viewport +F6 Toggle visibility of the Center Crosshairs on the viewport +F7 Toggle showing selected items (e.g. tracks or waypoints) in the highlight colour in the viewport +Shift+F8 Toggle visibility of the calendar +Shift+F9 Toggle visibility of the Layers Panel buttons +F9 Toggle visibility of the Layers Panel +F12 Toggle visibility of the Statusbar +Shift+F12 Toggle visibility of the Track Graphs + + +Standard shortcuts are provided for normal GUI operations: such as creating new files, opening, saving and exitting. +Then there are shortcuts specific to &appname; to switch projection modes, zoom in/out, create layers,switch the active tool mode and move the map: + +Ctrl+Up Pan the viewport North +Ctrl+Right Pan the viewport East +Ctrl+Down Pan the viewport South +Ctrl+Left Pan the viewport West +Ctrl+Keypad+ Zoom In +Ctrl+Keypad- Zoom Out + +These work irrespective of the mode selected +For other combinations see the menu entry themselves. + +
+ +
+Keyboard Configuration +Keyboard configuration is supported by the standard GTK+ way of changing shortcuts for menu entries. +Hover over the menu option with the mouse pointer and press the keyboard shortcut you want to bind it to. +To delete a keyboard assignment, press Backspace whilst over the menu entry. + + + If the keyboard shortcut is already in use you will not receive any notification that new action replaces the old action. + This is probably why most distributions have this facility disabled by default. + Thus you will need to enable Editable menu accelerators for your system. + Check the Desktop Menu and Toolbar Control or other User Interface preferences for this setting. + + + + + For Windows systems this can be done by adding the line gtk-can-change-accels=1 to %USERPROFILE%\.gtkrc-2.0 (create the file if it does not exist). + + +From &app; 1.6+ the keyboard configuration is automatically loaded and saved between sessions in the +
+ +
Tracks vs Routes + +In theory a route is path you are planning to follow and a track is of where you have actually been. The GPX specification splits these into two separate categories, although tracks contain everything route may have. + + +Q. When planning a route what difference does it make if it's a route or a track? + + +A. One difference is in how a GPS device navigates following the route or track. +The capability, the options and data on a particular device also effect how the navigation is performed. +Often the how a device actually works doesn't seem to be formally documented by the manufacturer (and can be firmware dependent too). +Web searches can reveal people's experiences with specific devices on blogs and various forums. +For some devices it will attempt to navigate between route points, which may then suggest various roads and tracks between the points using an internal routing algorithm with some kind of transport profile. +However this is limited to the quality of data available and how well the profile matches ones actual need. +If the points are close enough then the 'best' route for any form of transport will typically be the straight line between the points. + + +There are often restrictions on the numbers of route (or track) points the GPS Device can handle - may be 250 or as little as 50. +This generally not a problem for shorter routes, but needs managing for longer or detailed routes. +The number of track points is normally alot higher (e.g. 500 or typically with latest devices 10,000 or more) and less of a problem. + + + See for helping to manage this. + +
+ +
+ +
File Types and the Main Window + + +&appname; has it's own file type traditionally marked by the .vik file extension. +This is a plain text file saving all information of the current window including the view location, zoom level, projection type and then all the layer information (aggregates, maps, tracks, waypoints, etc...). + + +Besides it's own file type, &appname; can open (and save to via export methods) GPX and KML file types. + + + +&appname; does not handle GPX 1.1 particularly well - it prefers GPX 1.0 + + + +By default &appname; opens a default blank window centered on the home location. This behaviour can be changed by the . +Each window contains menus, a toolbar, a viewport, layers panel and a statusbar. +Each section (apart from the viewport) can be hidden using the or from the +ViewShow choices. + + +One may consider each &appname; window to be a separate project - each with it's project Viking file. +However generally one window is enough for most purposes! + + +Several operations apply at the window level as follows next. +Also see for the operational modes that generally work in conjunction with a selected layer. + + +
New + +Located on the FileNew menu and on the toolbar New. + + +This creates a new window with the default settings. + +
+ +
Open + +Located on the FileOpen menu and on the toolbar Open. + + +This opens a file chooser dialog to select one (or more) files of the supported GPS data file types: + +Viking +GPX +TCX +KML +JPG + + + +GPX, TCX, KML and JPG files will be loaded into the existing &appname; view. A Viking file will be given a new window if the current window is already assigned. + + + +&appname; handles more file types via the Acquire methods below. + + +
+ +
Open Recent File + +Located on the FileOpen Recent File menu only. + + +The most recently opened files are available for opening again. +The number of files remembered is controlled by a value in the . + + +Note that files imported via the Acquire mechanism are not available in this list. + +
+ +
Save + +Located on the FileSave menu and on the toolbar Save. + + +If the current opened file is Viking file, this save will simply update it. +If it is a new file or the file loaded was an external type (i.e. GPX or KML), then this will ask for a new name to save as a Viking file. + +
+ +
Save As + +Located on the FileSave As menu only. + + +This will ask for a new name to save as a Viking file (even it was already a Viking file). + +
+ +
Append File + +Located on the FileAppend File... menu only. + + +Selecting a Viking file from this method will join the file contents to the current window (instead of creating a new one). + + +GPX and KML files may also be appended, whereby the file contents are added to the currently selected or layer. Otherwise they are loaded in the normal file open method when no layer is selected. + +
+ +
Open GPX as External Layer + +Located on the FileOpen GPX as External Layer... menu only. + + +Selecting a GPX file from this method will create an external Layer that loads from the specified file. +The layer is marked as a "no write" external layer, which means any changes made will not be written back to the GPX file. +To enable changes to be written, you can change the layer to a standard external layer in the layer properties dialog. +This is in contrast to importing the data and storing it in the Viking file. + +
+ +
Properties + +Located on the FileProperties menu only. + + +Displays some simple properties about the loaded Viking project file (if any), such as full filename including the path, the filesize and the date/time of the file. + +
+ +
Export All + +Located on the FileExport All menu only. +Choose either the GPX or KML option. + +This allows converting every layer from the existing project into files of the type choosen. +You will be prompted for a directory into which a new file for each layer will be saved. + + +The KML option uses GPSBabel and so will not be available if GPSBabel can not be detected. + + +Note that some data properties are not supported by the target export file type. Such as item visibility or track colours. + +
+ +
Acquire + + +Available on the FileAcquire menu and from the layer menu. + + +If used from the File menu these methods place the results in a new TrackWaypoint layer. + + +If used from the layer menu these methods place the results in that TrackWaypoint layer. + + +
+From GPS + +FileAcquireFrom GPS +Probably the easiest way of getting information from a GPS Device. + + +Select the GPS Device communication settings and then hit OK. +See the Getting Started section for more info about the settings. + + + +Some GPS devices (such as the Garmin Nuvi 255) support a native file system and write information to a Current.gpx file or similar. You will have to browse the file system on the device and open it directly. + + +
+ +
+Import File With GPSBabel + +FileAcquireImport File With GPSBabel + + +Other formats can be imported that are supported by GPSBabel. + + +You need to select the file and the type of the file that is going to be opened, +since there is no automatic detection of the file kind. + +
+ +
+OSM Traces + +FileAcquireOSM Traces + + +See section for more information. + +
+ +
+My OSM Traces + +FileAcquireMy OSM Traces + + +See section for more information. + +
+ +
+From Geotagged Images + +FileAcquireFrom Geotagged Images +Enables automatic creation of waypoints from geotagged images. + + +This menu opens a dialog to select such image files. +If the image files have geotag information in them, then a layer with named waypoints positioned at the location of each image with a thumbnail of that image is created. + +
+ +
+From Wikipedia Waypoints + +FileAcquireFrom Wikipedia Waypoints + + +This gets interesting points from Wikipedia for the specified view: either within the extent of layer bounds or within the current viewport boundary. + +
+ +
+From Routing + +FileAcquireFrom Directions + + +This gets a route from given directions. + +
+ +
+From URL + +FileAcquireFrom URL + + +This gets a file from the entered URL. +File formats that can be opened are those supported by GPSBabel. + + + +You need to select the type of the file that is going to be returned, since there is no automatic detection of the file kind. + + +
+ +
+Import GeoJSON File + +FileAcquireImport GeoJSON File + + +This uses the program togpx to load .geojson files. +If the program is not detected on your system, then this option will not be available. +See here for the installation method. + + +Versions proir to 1.6.0 of GPSBabel did not support the GeoJSON file format. + +
+ +
+ +
Print + +Located on the FilePrint menu and on the toolbar Print. + + +Print uses what is displayed on the current map view for printing: i.e. what ever map, tracks and waypoints that are in view, including the +cross hairs and the scale. + + +It uses a standard system print dialog using an image the size of the current viewport in pixel terms. +On the Image Settings you can move the image around the page and scale the image up / or down. + +
+ +
Generate Image File + +Located on the FileGenerate Image File menu only. + + +Allows generation of larger (pixel) area images than the standard Print method above. +From the generated image you can use the facilities of the Operating System to print the image +or perform other actions. + + +You should have previously downloaded the tile images for the chosen zoom level, +otherwise the image produced will have missing sections. + + + +Using large areas takes some time to process and due to the method used it may run out of memory to complete the operation. +Unfortunately under Windows systems it can not detect this failure and may crash the program. +So the maximum size is dependent on the capabilities of your system. +For instance the largest successful image generated on my (RN) Debian system is a pixel area of 20,000 x 20,000. + + +
+ +
Generate Directory of Images + +Located on the FileGenerate Directory of Images menu only. + + + +This is only available in UTM mode. + + +
+ +
KMZ Map File Overview + +A KMZ file is a compressed version of a KML file and associated supporting files. + + +A KMZ Map file is a KMZ file with an image overlay often for use as a Custom Map on Garmin GPSr devices. + + +&appname; only supports basic properties in KMZ Map files, primarily intended for use with Garmin GPSr devices although KMZ exports are known to be work with Google Earth. + +
+ +
Import KMZ Map File + +Located on the File menu only. + + +Enables loading of a selected KMZ map file. +This generates a new map layer using the overlay image contained within the KMZ file. + +
+ +
Generate KMZ Map File + +Located on the File menu only. + + +Enables exporting the current viewport as a KMZ map file. +The area and zoom level covered by the KMZ map can be adjusted before saving. + + +Note that Garmin GPSr devices have limits in using images if they are too large (e.g. over 3Mb big) in KMZ files. +&appname; does not enforce any limits on the KMZ files it generates. + +
+ +
+ +
Layers + + +Layers supported by &appname; are: + + + + + + + + + + + + + +For each layer there are a few standard options: + + +Properties - Layer setup / configuration settings +Cut +Copy +Paste +Delete +Visibility - This checkbox on the Layers Panel controls whether the layer is shown in the viewport or not + + +The cut/copy/paste options can be accessed in a variety of ways once the layer has been selected: + + +Standard keys: Ctrl+x|c|v +Main menu Edit +From the right click menu +Buttons at the bottom of the Layers Panel + + +Default values used for each layer's properties can be altered via the EditLayer Defaults menu options. + + +See the individual section for detail about each layer. + +
+ +
TrackWaypoint Layer + +TrackWaypoint layers display GPS data (tracks, routes and waypoints). + +One way to create new waypoints is to copy a +latitude/longitude coordinate pair, such as the one shown on most +geocaches, and paste it into an active TrackWaypoint layer. &appname; can +automatically recognize several variations of the lat/lon format. + + +By right-clicking on tracks, routes or waypoints in the , you can access many commands on them. +You can easily find a specific track, route or waypoint by expanding the appropriate containing Tracks, Routes or Waypoints sublayer in the +layers panel to show all the individual items and then typing the name of the track, route or waypoint. + + + +The containing Tracks, Routes or Waypoints sublayers are only shown when items of that type exist. +To start creating them enter into a create mode via either the Create toolbar commands or the New menu commands. + + + +The new TrackWaypoint layer dialog allows the layer to be specified as external. +In this case the layer is exported as GPX to the file specified instead of stored in the Viking file itself. +It is also possible to specify the layer as "no write". +This means that &appname; does not write the layer to the GPX file specified; instead, &appname; only reads the file. +No-write layers are primarily intended to be used with the option in the File menu. + + + +External layers are loaded only when they are displayed or selected. +Hence, they will not appear in any summary statistics if they have not been loaded. +It is possible to load all external layers contained in an layer by selecting "Load External Layers" from the Aggregate Layer context menu. +Note, &appname; specific options may not be saved if not supported by the GPX export. + + + +The sublayers also offer right click menu options. +These are the same as those available at the TrackWaypoint level, but only those that relate to the sublayer type. + + + +By default routes are coloured red. Tracks are automatically assigned a spread of colours. + + + +Most operations available on tracks are available on routes, except for functionality that relies on having timestamps - since routes by definition have no timing information. Thus for example, uploading a route to OpenStreetMap Traces is not available nor is Geotagging on a route. +It is possible to convert between Tracks and Routes, although converting from a Track to a Route may involve a loss of information (hence you are required to confirm this operation before it happens). + + + +Also see for use in conjunction with this layer. + + +
Layer Operations + +The layer has a context menu with several operations. + + +
View Layer + +Version1.1+: This will automatically move the viewport and select the best zoom level to see the whole layer (i.e. all tracks, routes and waypoints). + +
+ +
View + +
View All Tracks + +Version1.1+: This will automatically move the viewport and select the best zoom level to see the all the tracks in the layer (ignoring positions of any routes or waypoints). + +
+ +
View All Routes + +Version1.4+: This will automatically move the viewport and select the best zoom level to see the all the routes in the layer (ignoring positions of any tracks or waypoints). + +
+ +
View All Waypoints + +Version1.1+: This will automatically move the viewport and select the best zoom level to see the all the waypoints in the layer (ignoring positions of any tracks or routes). + +
+ +
+ +
Goto Center of Layer + +This will automatically move the viewport to see the whole layer (i.e. tracks, routes and waypoints). It does not adjust the zoom level. + +
+ +
Goto Waypoint + +This opens a dialog box to enter a name of waypoint to search for. If it is found the viewport is centred on it. + + + +Note this search is not very clever and only finds exact matches. +You are probably better off expanding the waypoint list and directly start typing, as mentioned above, which finds a match based on each letter typed. + + +
+ +
Export Layer + +The layer (all tracks, routes and waypoints) can be exported to following file formats: + + + + GPX + + + GPSPoint + + + GPSMapper + + + Google's KML + + + Any GPSBabel File Formats + + + GeoJSON. Via the program togeojson + This option will not be available if the program is not detected on your system. + See here for the installation method. + + + +Version1.1+: An individual track can be exported to a GPX file via the track menu. + +
+ +
Finish Track or Route + +Selecting this option ends the creation of that individual track or route. + + + +This is only available when a track or route is being created by the or tools. + + +
+ +
New +
New Waypoint + +This opens a dialog box to create a new waypoint. A default name will be suggested and the default position is the center of the viewport. + +
+
New Track + +This turns on the tool. + +
+
New Route + +This turns on the tool. + +
+
+ +
Geotag Images + +This starts the Geotagging Images dialog against all tracks in the layer. +See Geotagging for further detail. + +
+ +
Acquire + +This offers the same choice from methods as on the File menu. +However when invoked from here, the results will be stored in this layer (instead of creating a new one). + +
+ +
Upload + +
Upload to GPS + +This opens a dialog to select the GPS Device and port to which the layer information will be transferred. + + +The types of GPS information (tracks, routes or waypoints) to be transferred can be selected. + + +Tracks, Routes or Waypoints that are invisible will not be transferred. + +
+ +
Upload To OSM + +This opens a dialog to upload all tracks and waypoints to OpenStreetMap traces. +Useful if you are an OpenStreetMap contributor, access details are stored in &appname; + + + &appname; allows you to edit a track, e.g. remove duplicate points, perhaps remove track points leading to your home and then upload it to OpenStreetMap. + +
+
+ +
Delete +Offers deletion of various parts of a TrackWaypoint layer: +
Delete All Tracks +Deletes all the tracks in this layer. +
+
Delete Tracks from Selection +Opens a dialog with list of all the tracks from this layer to choose the ones to delete. +
+
Delete All Routes +Deletes all the routes in this layer. +
+
Delete Routes from Selection +Opens a dialog with list of all the routes from this layer to choose the ones to delete. +
+
Delete All Waypoints +Deletes all the waypoints in this layer. +
+
Delete Waypoints from Selection +Opens a dialog with list of all the waypoints from this layer to choose the ones to delete. +
+
Delete Duplicate Waypoints + + Deletes duplicate waypoints in this layer. + Waypoints are considered duplicate if they have the same location and symbol. + + If other properties are different such as name, comment, altitude, etc... they will still be considered a duplicate. + + + +
+
+ +
Filter +
Simplify All Tracks + +This opens dialog to request the number of points each track will be simplified using GPSBabel. The result is put into a new layer. The simplification method removes points considered to be in a 'near straight line', thus reducing the number of points and attempting to keep the most important turning points. + +
+
Compress Tracks + +Enables compression of tracks and routes via GPSBabel's Crosstrack simplify method. +It opens a dialog to request the Error factor value which is the maximum allowable error that may be introduced by removing a single point. +It is expressed a distance in units as specified by the distance option. +Thus a higher value will remove more points. +The result is put into a new layer. + +
+
Remove Duplicate Waypoints + +Remove Duplicate Waypoints - fairly self explainatory, with the results created in a new layer. + + + +However it only considers a precise position (waypoints only 1 metre away from each other are considered different) and also doesn't consider if the waypoints have different comments, symbols or images. + + +
+
+ +
Filter With <emphasis>Trackname</emphasis> + +This runs GPSBabel on the layer using information from a previously selected track (select via the track menu "Use With Filter" option) with the following command types: + + +Waypoints Inside This +Waypoints Outside This + + +The result is generated in a new Track/Waypoint layer. + +
+ +
Geotag Images + +This starts the Geotagging Images dialog using the specific track. +See Geotagging for further detail. + +
+ +
List Tracks or Routes + +Opens a new dialog with the list. As described in the Aggregate layer + +
+ +
List Waypoints + +Opens a new dialog with the list. As described in the Aggregate layer + +
+ +
+ +
Track and Route Sublayer Options +Repeats options available at the TrackWaypoint level, but only those for tracks and routes: + + +Finish Track or Route +Same as the layer Finish Track or Route + + +New Track or Route +Same as the layer New Track or New Route + + +View All Tracks or Routes +Same as the layer View All Tracks or View All Routes + + +Delete All Tracks or Routes +Same as the layer Delete All Tracks or Delete All Routes + + +Delete Tracks or Routes from Selection +Same as the layer Delete Tracks from Selection or Delete Routes from Selection + + +List Tracks or Routes +Opens a new dialog with the list. As described in the Aggregate layer + + +Also gives other options for handling multiple items: + + +Sort +Gives the ability to sort the items in the treeview alphabetically or by date. + + +Visibility +Offers options to quickly control the visibility of all items within the sublayer, as per + + +
+ +
Track and Route Properties + +This shows several tabs for properties and useful statistics about a track or a route, including elevation-distance and speed-time graphs (if data is available). +Moving the mouse pointer over the graph displays values related to that point along the track. +You can click on these graphs to jump to the point in the track. +You can reverse it, delete duplicates, split at marked position or split a track from its component segments (discontinuous breaks in a track) into separate tracks. + + +For the elevation related graphs the Show DEM check button is only enabled if a suitable is available that overlaps the track. + + +Graphs either have a Show GPS Speed or Show Speed button. +Each of these overlays relative speed markers along the graph. +The difference between Speed vs GPS Speed is that GPS Speed is taken directly from a field reporting the speed value in the source data. +Typically speeds used in Viking are calculated between the points time and position differences. +This is due to the reporting of speed values in source data is not mandatory and often not present. + +
Track and Route Properties Tab + +
+Properties Tab: Example + + + +
+
+
+
Track and Route Statistics Tab + +
+Statistics Tab: Example + + + +
+
+
+
Track Elevation Graph + +
+Elevation Distance Tab: Example + + + +
+
+ +The following colors are used in the elevation-distance graph: + + + +Main colour - this is dependent on your Desktop theme - often blue by default +elevation data in graph + + +Yellow + +no elevation data + + + +Green + +elevation data from DEM + + + +Red + +speed + + + +
+ +
Track Time Splits + +
+Splits Tab: Example + + + +
+
+ +This tab displays timing splits on tracks with timing information. +A few different values of split lengths are available, each having it's own tab display. + +
+
+ +
Track and Route Operations + +
Finish Track + +Selecting this option ends the creation of the individual track. + + + +This is only available when a track is being created by the tool. + + +
+ +
Goto + +This centers the viewport on the selected position on the track: + + +Startpoint +"Center" - the notional center from the bounds of the track +Endpoint +Version1.1+: Highest Altitude +Version1.1+: Lowest Altitude +Version1.1+: Maximum Speed (Not Available on Routes) +Version1.8+: Previous trackpoint +Version1.8+: Next trackpoint + +
+ +
View + +Version1.1+: This centers the viewport on the track and selects the best zoom level to see it. + +
+ +
Combine +
Merge By Time + +This operation repeatedly tries to merge the right-clicked track +with tracks in the same TrackWaypoint layer. The tracks which are +merged are those which have at least one trackpoint less than some +threshold time away. This way, if you somehow end up with lots of small +segments (say, caused by turning the GPS on and off) you can merge them +easily into one track. + + + +This is not available on routes as they have no timestamps. + + +
+ +
Merge With Other Tracks + + This opens a dialog listing the other tracks in the same TrackWaypoint layer, from which one can select the other tracks to merge with. + Tracks are merged in order of time. + +
+ +
Merge Segments + +Combines track segments. Effectively removing track segment markers to leave one segment for the whole track. + +
+ +
Append Track or Route + +Enable joining of a single track to the end of the current track. +This opens a dialog listing the other tracks in the same TrackWaypoint layer from which one can make the selection. + +
+
+ +
Split +
Split By Time + +This operation will split a single track into segments wherever the +time interval between successive trackpoints is larger than some +threshold. This is useful when processing raw NMEA GPS data, especially +taken over a long time. + + + +This is not available on routes as they have no timestamps. + + +
+ +
Split By Number of Points + +Version1.2+: This operation will split a single track into segments by the number of points specified. +This can be useful with devices which may have limits on the number of points it supports. + +
+ +
Split Segments + +Splits track segments into new tracks. + + + +This is not available on routes as they do not have route segments. + + +
+ +
Split at Trackpoint + +Splits the track at the currently selected trackpoint. + + +The current track will finish at this trackpoint. +A new track will start from a copy of this trackpoint. + + + +This is only enabled when a trackpoint is selected. + + +
+
+ +
Insert Points + + +These options are only enabled when a trackpoint is selected. + + +
Insert Point Before Selected Point + +Inserts a track point halfway between the previous track point and the current track point. +All track point properties are interpolated between the two points. + +
+
Insert Point After Selected Point + +Inserts a track point halfway between the current track point and the next track point. +All track point properties are interpolated between the two points. + +
+
+ +
Delete Points +
Delete Selected Point + +Deletes the currently selected track point. + + + +This is only enabled when a trackpoint is selected. + + +
+
Delete Points With the Same Position + +Deletes subsequent points that have the same position (but have different timestamps). + +
+
Delete Points With the Same Time + +Deletes subsequent points that have the same time stamp (but may have different positions). + + + +This is not available on routes as they have no timestamps. + + +
+ +
+ +
Transform + +These options alter the data of trackpoints of a track but not add or remove trackpoints. +And don't seem to fit any other category :) + +
Apply DEM data + +If any DEM data is loaded, this will apply the DEM data to give the track elevation data. +Two ways of applying DEM data are offered: + +Keep. Retains the existing elevation data of trackpoints and only those missing an elevation value are set. +Overwrite. Elevation data are set on all trackpoints even if they already elevation values. + + +
+
Smooth Missing Elevation data + +In various locations across the world, there are missing DEM values (AKA DEM Holes) from the SRTM data. +This is particularly noticeable in mountainous areas. +Two ways of applying elevation data to trackpoints that do not have elevation values are offered: + +Interpolated. Missing elevation data is interpolated between the previous and next known values. +Flat. Elevation data is filled in from the last previously known value. + + +
+
+Convert to Track or Route + +If this is a Route then it will convert it to a Track. + + +If this is Track then convert it to a Route. + + + +Converting from a Track to a Route may involve a loss of information, in particular timestamp values (hence you are required to confirm this operation before it happens). + + +
+
+Anonymize Times + +Timestamp information of a track can be shifted to be all offset from 1901-01-01. + + +Thus the timestamps themselves will no longer reveal exactly when a track was taken. +However the relative difference between the timestamps is kept thus one is still able to calculate some properties such as speeds along the track. + + + +This is not available for routes, as they have no timestamps. + + +
+
+Interpolate Times + +Trackpoint timestamps between the first and last points are calculated such that track is travelled at equal speed. +This is mostly useful when tracks don't have timestamps and you wish to recreate your trip (e.g. you've forgotten to turn on your GPS or the batteries have run out) +Thus edit the first and last trackpoints to set the approximate times of your trip and then use this to give approximate times along the track. +When used on tracks with timestamps this will overwrite the existing timestamps. + + + +This is not available for routes, as they have no timestamps. + + +
+
+ +
Export Track as GPX + +Version1.1+: This allows exporting the track as a GPX file by opening a file save dialog. + +
+ +
Extend Track End + +Changes the current tool to add trackpoints to the end of the track. + +
+ +
Extend Using Route Finder + +Enables the Route Finder tool. Thus on a subsequent left click in the viewport, a route is calculated from the end of track to that point using the default route service and applied to the track. + +
+ +
Upload + +
Upload to GPS + +Same as the layer Upload to GPS command, but only applies to the track. + +
+ +
Upload to OSM + +Same as the layer Upload to OSM command, but only applies to the track. + +
+ +
+ +
Use With Filter + +This selects the track to be used in the Filter With Trackname feature. + + + +This is not available on routes. + + +
+ +
Edit Trackpoint + +This opens the Trackpoint edit dialog. See . + + + +This is only enabled when a trackpoint is selected. + + +
+ +
Refine Route... + +This function allows to request a Routing Engine in order to refine a given route. +By "refining" we mean computing all real intermediates points between some given major points. +This could be useful to compute a trip giving only the wished important steps. + + + +This is only available on routes. + + +
+ +
View Google Directions + +This option is only available on a track created using the Route Finder tool. + + +Launch a web browser to see the Google directions page which yielded the route. + + + +The record of the Google route is stored in the track's comment, so if the comment is changed (or the route was created by something other than the Route Finder tool) this will not work correctly. + + +
+ +
+ +
Waypoint Sublayer Options +Repeats options available at the TrackWaypoint level, but only those for waypoints: + + +New Waypoint +Same as the layer New Waypoint + + +View All Waypoints +Same as the layer View All Waypoints + + +Goto Waypoint +Same as the layer Goto Waypoint + + +Delete All Waypoints +Same as the layer Delete All Waypoints + + +Delete Waypoints from Selection +Same as the layer Delete Waypoints from Selection + + +Delete Duplicate Waypoints +Same as the layer Delete Duplicate Waypoints + + +List Waypoints +Opens a new dialog with the list. As described in the Aggregate layer + + +Also gives other options for handling multiple items: + + +Sort +Gives the ability to sort the items in the treeview alphabetically or by date. + + +Visibility +Offers options to quickly control the visibility of all items within the sublayer, as per + + +
+ +
Waypoint Properties + + +This shows a dialog with detailed information for the waypoint. Many properties of the waypoint can changed here, such as the comment, the symbol used in drawing or the image (normally a photograph taken at this position) assiocated with it. When a waypoint has an image, a thumbnail of it is drawn in the viewport for the waypoint (in preference to the symbol). + + +If the waypoint has an associated image, then the Geotag information may be updated, either with updating the file's modification timestamp or not. +This can be useful when the waypoint has been moved. + + +
+ +
Waypoint Operations + +
Goto + +This centers the viewport on the selected waypoint. + +
+ +
Geotag Images... + +This opens the Geotag Dialog to allow Geotagging multiple images to the position of this waypoint. +In this circumstance creation of waypoint options are disabled and only the options related to writing the EXIF information are available. + +
+ +
Transform + +Offers a subset of the track utilities. +Currently only setting the altitude from DEM data methods are available. + +
+ +
Visit Webpage + +If the waypoint's comment (or description) starts with http: then this option is available and allows launching a web browser to go to the webpage. + +
+ +
Visit Geocache Webpage + +If the waypoint's name is in Geocache form (GCXXXXX) then this option is available and allows launching a web browser to go to the Geocache page. + +
+ +
New Waypoint + +Same as the layer New Waypoint. + +
+ +
+ +
Version1.3+: Geotag Images + +This dialog allows geotagging images (normally taken with a digital camera) against a specific waypoint or via interpolation against a specific track or all tracks in the TrackWaypoint layer - depending on how it is invoked. + + +When geotagging against tracks, images need to have an EXIF DATE_TIME_ORIGINAL (nearly always set by a camera). This timestamp is then used to find the location when the image(s) was taken by searching through the track(s) to find the nearest time - interpolating between points if necessary to set the location. + + + +Generally it is good policy to synchronize your camera's clock with your GPS clock before taking photographs. However the times can be adjusted afterwards (if necessary) to take into consideration clock differences. + + + +Various options allow control of how the geotagging process is performed: + + +Images - Add the images used for geotagging +Create Waypoints +Overwrite Existing Waypoints +Write EXIF +Overwrite Existing GPS Information +Keep File Modification Timestamp +Automatic Image Direction - Assumes the direction will be in line with the track heading +Interpolate Between Track Segments +Image Time Offset - The number of seconds to ADD to the photos time to make it match the GPS data. Calculate this with (GPS - Photo). Can be negative or positive. Useful to adjust times when a camera's timestamp was incorrect. +Image Time is Local - Are the timestamps in the image local time or otherwise in UTC. +Image Timezone - The timezone adjustment factor. + + +Typically timestamps in images are either in local time or UTC but there is no way of automatically knowing which; so you need to specify which is the case. +Image Time Offset is best used for accounting for camera's clock drift, so normally of the order of a few seconds or minutes. +Whereas Image Timezone is more for adjusting for a camera's timezone difference, or perhaps differences in your current timezone and the timezone the images where taken. + +
+ +
+ +
GPS Layer + +The GPS layer is responsible for uploading and downloading GPS data +from a GPS device. It also is responsible for realtime GPS tracking. +Expand the GPS layer in the layers panel to see the two layers it +uses for uploading and downloading. To upload, download, or use +realtime tracking, right-click the GPS layer and click the appropiate +menu item. + + +
Download + +To download data from the GPS, right-click the GPS layer and click Download from GPS. + +
+ +
Upload + +To upload data to the GPS, first populate the GPS Upload child +layer of the GPS layer (either by creating waypoints/tracks/routes in it, or +copying and pasting or dragging waypoints/tracks/routes from another layer). +Then right-click the GPS layer and click Upload to GPS. + +
+ +
Realtime Tracking + +You must set up gpsd correctly or use a GPSD server and put the +correct information in the GPS layer properties dialog. Then right-click +the layer and select Start Realtime Tracking. + +
+ +
Empty <emphasis>Item</emphasis> + +There are several options to quickly delete a subsection of data: + + +Empty Realtime +Empty Upload +Empty Download +Empty All + +
+ +
+ +
DEM (Digital Elevation Model) Layer + +This layer provides elevation data from the Shuttle Radar Topography Mission (SRTM) + + +Elevation data can be useful in planning trips, as you many wish to avoid/minimise the hills encountered. [OSM Cyclemap is also useful this way too] + + +To download the data use the tool (shown on the toolbar), and then click on a area of the viewport. Once files have been downloaded they can then be loaded from disk via the DEM properties in future application runs. + + +The current data server is: NASA STRM 2.1. + + +ATM &appname; does not auto download DEM data. If you want to get lots of data blocks, you may wish to use some other program get such as curl or wget to download them for an area. + + + +Using many DEMs is CPU/memory intensive. Depending on your computer's capability, &appname; will be less responsive when about 50+ DEM blocks are loaded. It is probably unwise to attempt using 200+ blocks, so trying to use DEMs covering large countries/continents (USA, Australia etc...) is unlikely to work. In these conditions under Linux, &appname; may be automatically stopped by the "OOM Killer" + + + +
+ + +
Maps Layer + +This layer provides a single map resource, you may have multiple map layers but only top one (if enabled) will be visible (subject to the Alpha compositing property). + + +Some maps are continually improving over time (e.g. OpenStreetMap) thus &appname; employs a caching mechanism to avoid redownloading data (see ). +However a forced refresh for the current view can be made via the Reload All Onscreen Maps option or Ctrl+F5. + + + +Also see tool for use in conjunction with this layer. + + +Online Map Tile Providers + +You will need an open internet connection when you are downloading maps these following map types, but once downloaded they are available from the hard disk cache. When map are avaliable from the disk cache it is much faster and can be used offline. +Inbuilt maps include various OpenStreetMap (OSM) ones and more: + + + +Bing Aerial Maps (&appname; Version1.2+) +Mapbox Outdoors - This is the default (&appname; Version1.7+) +OpenStreetMap (Mapnik) +OpenStreetMap (Cycle) +OpenStreetMap (Transport) (&appname; Version1.3+) +OpenStreetMap (Humanitarian) (&appname; Version1.5+) +NASA BlueMarble + + + +&appname; can be configured to handle additional online map resources. See for further detail. + + +Offline Map Tilesets + +Some map types supported are for on disk tile formats: + + + + + On Disk OSM Tile Format + This is equivalent to any map set with OSM Cache Layput. + +MBTiles File + + OSM Metatiles + + This file format is mostly aimed at being rendering cache feature and is Endian dependent. + Thus to successfully view the file cache, the Metatile files and Viking must be of the same endian type (which they probably will be). + + + + +Of course you need to have acquired or generated these tilesets yourself. + + +
Map Layer Properties + +Configurable properties: + + + +Map Type + + The kind of map this layer displays. + Map types are dependent on the current mode. + + + +Maps Directory +Not applicable for MBTiles Map type since it is a single file. + + +Cache Layout +Viking or OSM. See . Only applies to maps from online tile providers. + + +Map File +Ony applicable for MBTiles Map type since it is a single file. + + +Alpha + + Control the Alpha value for transparency effect using a value between 0 and 255 with the default being 255 for a fully solid image. + Zero is fully transparent. A value of around 160 can be useful for blending views of multiple map layers (when applied to the upper most map layer). + + + +Autodownload Maps +This can be useful to turn off when you are not online to avoid pointless download requests or may be keep a map in a 'historical' state. +e.g. perhaps in case a current map rendering is broken. + + +Autodownload Only Gets Missing Maps +Using this option avoids attempting to update already acquired tiles. +This can be useful if you want to restrict the network usage, without having to resort to manual control. Only applies when Autodownload Maps is on. + + +Zoom Level +Determines the method of displaying map tiles for the current zoom level. +Viking Zoom Level uses the best matching level, otherwise setting a fixed value will always use map tiles of the specified value regardless of the actual zoom level. + + +
+ + +
Layer Operations +
Download Missing Onscreen Maps + +This requests map tiles for areas of the viewport that do not currently have one. + +
+ +
Download New Onscreen Maps + +This requests map tiles only if the maps are older than the Tile Age preference. + +
+ +
Reload All Onscreen Maps + +Force a refresh of all visible map tiles. + +
+ +
Download Maps in Zoom Levels + +This opens a dialog to enable requesting the download of maps for the region in the viewport over a specified number of zoom levels. +The download method type can be specified to help limit the number of requests. + + + +There are some inbuilt limits to prevent downloading large amounts of map tiles. + + +Please respect the usage policy of the tile set provider. +Such as OSM Tile Usage Policy. + + + +
+Maps Download Dialog: Example + + + +
+
+
+
+ + +
+ +
Aggregate Layer + +This layer is a container layer to hold other layers. There is always an initial and controlling Top Layer that can not be removed or renamed. + + +This layer type is useful for grouping other layers, especially layers, in whatever categories are relevant to you: such as by activity, location or date. +Here are some suggestions: + +Hiking +Mountain Biking +Road Cycling +Car Trips +Sailing +Holidays +UK Points of Interest +USA Points of Interest +etc... + + + +Thus one can have a list of all your tracks, but groups can be shown or not using the relevant layers visibility checkbox. + + + +Tracks Area Coverage (TAC) is a feature to highlight areas with track coverage. +It is based on OpenStreetMap style tiles - as an approximation to a grid square system. +The size of the area can be changed, which is linked to the OSM Zoom level, +such that a higher Zoom level gives a smaller physical area and so more tiles. +This can be used for general curiousity or perhaps to plan routes to visit areas previously unexplored. + + +The calculations are performed in the background when deemed necessary (e.g. loading in a new file) and can also be manually requested. + + +Note that Viking can be slow in drawing hundreds or more tracks but this analysis is relatively quick and the resulting drawing is much faster. +Thus ATM is it recommended to turn off the visibility of the tracks themselves for this type of usage. + + + +
+Tracks Area Coverage: Example + + + +
+
+ +
Layer Properties: Tracks Area Coverage +Offers basic controls whether it is enabled or not and includes the size of the tile. +
+ +
Layer Properties: TAC Advanced +Controls subsets of TAC drawing are calculated and shown with their colour and opacity. +Note for Max square coverage, ATM it will only draw the first square encountered, although there may be more than one such area. +Note for Cluster coverage, ATM it will only draw the first cluster encountered, although there may be more than one such area. +
+ +
Layer Operations + +The following are available on Aggregate Layers: + + +
New Layer + +Add a new layer of the selected type. + +
+ +
Sort + +The list within the treeview can be sorted. + + +Alphabetical and Date sorts are available. + + + +Generally it is not useful to sort the Top most layer. Sort is mainly intended for Aggregate groups of TrackWaypoint layers. + + +
+ +
Track List + +Selecting this opens a dialog listing all the tracks in a table along side statistics such as track length and maximum speed. +Each column header is clickable and will reorder the list according to that particular column. +You can also rearrange the columns via dragging the column header to the new location. + + +This table may be invoked from a variety of different layer levels and will then list only the relevant tracks (and/or routes). + + +Aggregate Layer +Lists Tracks and Routes and the TrackWaypoint Layer they are in + + +TrackWaypoint Layer +Lists Tracks and Routes + + +TrackWaypoint Track sublayer +Lists Tracks only + + +TrackWaypoint Route sublayer +Lists Routes only + + + + +
+Track List Dialog: Example +
+ +This is showing all tracks and routes (although there are no actual routes here!) in multiple TrackWaypoint layers, that has been sorted by height. +Note that routes will not have timestamps or speeds, but may have elevations and should have some distance! + +
+ + + +
+
+ +Hovering the mouse over an entry will show a tooltip of the comment or description if it is available. + + +Each entry in the track list can be selected and on mouse right click offers these options: + + +View +Move the viewport to the area of the item and highlight it. + + +Statistics +Opens the Properties dialog on the tab. Note this will close the track list dialog. + + +Copy Data +Copy the data fields as text. + + + + +If multiple entries are selected the only right click option is Copy Data. +This copies the individual data fields as plain text separated by tab characters, ideal for pasting into other applications in particular spreadsheet programs. +Note that the order of the fields copied is the default column ordering (irrespective to how they may have been rearranged). + +
+ +
Waypoint List + +Selecting this opens a dialog listing all the waypoints to give a overview of the waypoint information. +Each column header is clickable and will reorder the list according to that particular column. +You can also rearrange the columns via dragging the column header to the new location. + + +This table may be invoked from a variety of different layer levels and will then list only the relevant waypoints. + + +Aggregate Layer +Lists Waypoints and the TrackWaypoint Layer they are in + + +TrackWaypoint Layer +Lists Waypoints + + +TrackWaypoint Waypoint sublayer +Lists Waypoints + + + + +
+Waypoint List Dialog: Example +
+ +This was invoked on a TrackWaypoint layer and shows all waypoints from that single layer. It has been sorted by the symbols. + +
+ + + +
+
+ +Hovering the mouse over an entry will show a tooltip of the description if it is available. + + +Each entry in the list can be selected and on mouse right click offers these options: + + +View +Move the viewport to the area of the item and highlight it. + + +Properties +This will open the properties dialog. Note this will close the waypoint list dialog. + + +Show Picture +If enabled, this will open the associated image in an external Image Viewer program. + + +Copy Data +Copy the data fields as text. + + + + +If multiple entries are selected the only right click option is Copy Data. +This copies the individual data fields as plain text separated by tab characters, ideal for pasting into other applications in particular spreadsheet programs. +Note that the order of the fields copied is the default column ordering (irrespective to how they may have been rearranged). + +
+ +
Visibility Options + +This offers a quick way to set all the visibilities of each item within the containing layer, rather than having to change each one individually. + + +Show All +Ensures all items are set to be visible. + + +Hide All +Ensures all items are set to be invisible. This is useful for then turning on single items afterwards so the display is not cluttered. + + +Toggle +Inverts the visibility status of each item. + + + +
+ +
Search by Date + +This opens calendar dialog to select a date to search by within this Aggregate layer. +The first item that is found on that date will be selected. +Tracks are searched first in preference over waypoints. + +
+ +
Statistics + +This opens a dialog to display various statistics about all tracks contained within this Aggregate layer. + +
+Statistics Dialog: Totals + + + +
+ + + This currently generates a simplified Eddington number. + In that a per track length value is used, rather than trying to work out a length per day. + (i.e. doesn't combine multiple tracks for a single day or split very long tracks into days). + The Eddington number is in the current Unit distance . + + +
+Statistics Dialog: Years + + + +
+
+ +
Append File + +This opens a dialog to select files to load within this Aggregate layer. + +
+ +
Tracks Area Coverage->Calculate + +Start a new Tracks Area Coverage calculation. + +
+ +
Tracks Area Coverage->Remove + +This clears the Tracks Area Coverage information, thus no grid colouring will be displayed. + +
+ +
+
+ + + + + + + +
Coordinate Layer + +This layer is allows drawing of grid lines on the viewport. + +
+ + +
Tools + +&appname;'s mouse actions on the viewport are controlled by which tool is active. Only one tool can be active at a time. The default mode is pan. You can return to the default mode by pressing Escape. + + +You can use the scroll wheel, the middle-click, the middle-click+drag to zoom, center map at position and pan respectively no matter what tool you are using. + + +Scroll: zoom in and out keeping the mouse over same location + + +Ctrl-scroll: pan north-south (also Ctrl-up, Ctrl-down) + + +Shift-scroll: pan east-west (also Ctrl-left, Ctrl-right) + + +Ctrl-shift-scroll: zoom in and out, without changing the center (also Ctrl+, Ctrl- [*not* KeyPad +/-]) + + +Middle-click: make the clicked point on the map the center + + +Middle-click and drag: pan + + +
Pan + +This is the default mode of operation for &appname;. + + +This mode is entered by clicking on the toolbar icon: + + +Pan moves the viewpoint. A single click centers the viewport at that point, whereas click and drag dynamically moves the view around. +This is the default tool. + + +This mode can also be entered by the keyboard shortcut Ctrl+Shift+P + + +Double clicking the left mouse button will zoom the map in. +Shift + double clicking the left mouse button will zoom the map out. +Double clicking the right mouse button will also zoom the map out. + +
+ +
Zoom + +This mode is entered by clicking on the toolbar icon: + + +Zooms in and out on the clicked part of the map or by the selected area. + + +This mode can also be entered by the keyboard shortcut Ctrl+Shift+Z + + +Ctrl + left or right click: Zoom in/out and center the map on the clicked location + + +Shift (and hold) + left mouse button: Draws a bounding box area on which to zoom in. The zoom action is performed when the left mouse button is released. + + +Shift + left click button: Jump Zoom In by up to factor of 3 standard zooms. + + +Shift + right click button: Jump Zoom Out by up to factor of 3 standard zooms. + +
+ +
Ruler + +This mode is entered by clicking on the toolbar icon: + + +The ruler is used to measure either: + + + +The bearing and distance between two points: Click on first point and then move the mouse point around - the values will be continually updated. +A second click will freeze the ruler at that point. + + + +An area: Shift (and hold) + left mouse button: Draws a bounding box area. Area values are shown in the statusbar and on the viewport. +Releasing the mouse button will freeze the area at that point. +The viewport label option is controlled by . + + + + +This mode can also be entered by the keyboard shortcut Ctrl+Shift+U + +
+ +
Version1.1+: Select + +This mode is entered by clicking on the toolbar icon: + + +The select tool allows one to choose any waypoint or track by clicking on it (or reasonably near) in the viewpoint. + + +ATM to select a track one must actually click on a trackpoint, which is also selected. + + +This mode can also be entered by the keyboard shortcut Ctrl+Shift+S + +
+ +
TrackWaypoint Layer Tools + +You must have a Layer selected to use these tools. + +
Create Waypoint + +Enable this tool by clicking on the toolbar icon: + + +Left click will open the new waypoint dialog using the specified position. + +
+ +
Create/Edit Track + +Enable this tool by clicking on the toolbar icon: + + +General track edit/create tool. +The first left-click will create a new track and you will be asked to enter a name for the track. +If Shift is held, a track will be continued from a nearby trackpoint. +Subsequent left-clicks will add new trackpoints. +If Shift is held, the track will be joined to an existing track at the point selected. +If Ctrl is held, it will jump the new trackpoint position to a nearby existing trackpoint. + + +Right click or Backspace: undo one point. + + + + + +Double click or Escape: to finish track creation. +Finishing the track is also available via the right click and track menus. + + +One must finish the current track to be able to create another track. + + +Keypad Add or ]: Insert point after current point. + + +Keypad Minus or [: Insert point before current point. + + +Left: Select the previous point. + + +Right: Select the next point. + +
+ +
Edit Route + +Enable this tool by clicking on the toolbar icon: + + +This operates in exactly the same way as the Edit Track above. + + +One must finish the current route to be able to create another route. + + +One can switch between the Edit Route and Route Finder tools while editing routes. + +
+ +
Create Route Using the Route Finder + +Enable this tool by clicking on the toolbar icon: + + +Requires an internet connection. +Left click to create a new trackpoint. +If it's the initial trackpoint you will be asked to enter a name for the route, otherwise the default routing engine will be queried to find a route to the new trackpoint. +Right click or Backspace: remove the last added route. + + +Escape: to finish route creation. +Finishing the track is also available via the right click and track menus. + + +One must finish the current route to be able to create another route. + + +One can switch between the Edit Route and Route Finder tools while editing routes. + +
+ +
Track Splitter + +Enable this tool by clicking on the toolbar icon: + + +Use this tool to split a track or route. +After enabling the tool, click on the track/route point of the track/route at the position where you want the split to occur. + +
+ +
Edit Waypoint + +Enable this tool by clicking on the toolbar icon: + + +Left Click/drag: select/move a waypoint. +If Ctrl is held at the same time, it will jump the waypoint position to a nearby existing trackpoint. +If Shift is held at the same time, it will jump the waypoint position to a nearby existing waypoint. + +Right-click on waypoint: opens a menu with waypoint actions (the +same menu accessed by right-clicking the waypoint in the layers panel) + +
+ +
Edit Trackpoint + +Enable this tool by clicking on the toolbar icon: + + +Left click near a trackpoint (in screen pixel terms) to bring up the Track Point Edit dialog on that trackpoint. +Whilst the edit dialog is already open, left click again and drag enables moving of the trackpoint. +If Ctrl is held at the same time, it will jump the new trackpoint position to a nearby existing trackpoint. + +
Edit Trackpoint Dialog + +Editing options in the Trackpoint Edit dialog include: + +Edit the trackpoint name +Changing raw lat/long position and altitude +Forward (go to the next trackpoint) +Back (go to the previous trackpoint) +Delete +Insert. Inserts a point halfway to next trackpoint +Split. + + + +Several fields are read only for reference purposes, values are shown if the trackpoint has such information: + +Time. +Speed and course. +'Between' values: Speed, Time Difference and Distance Difference. When moving between trackpoints (via the Back and Forward buttons) these values are calculated. +GPS precision factors. + + + +
+Trackpoint Edit Dialog: Example + + + +
+One must have been going downhill here to get a reasonable speed by bicycle! +
+
+
+ +
Show Picture + +Enable this tool by clicking on the toolbar icon: + + +Opens an image viewer with the picture associated with the waypoint. +By default this uses the default system image viewer. +For Linux you can override this with the setting in the + +
+ +
+ +
Georef Map Layer Tools + +You must have a Map Layer selected to use these tools. + +
Georef zoom + +Enable this tool by clicking on the toolbar icon: + +Changes the zoom level of the georeferenced map and changes the +&appname; zoom level accordingly. Useful if you are trying to match GPS +data to a georeferenced map. + +
+ +
Georef move + +Enable this tool by clicking on the toolbar icon: + + +Drag to move the georeferenced map. + +
+
+ +
Map Download + +You must have a Layer selected to use this. + + +Enable this tool by clicking on the toolbar icon: + + +Click to download a single tile. Drag to download tiles in the dragged rectangle area. + + +Right-click to redownload tiles via the selected method. Right-click and drag to redownload tiles in the dragged rectangle area by the selected method. +The possible methods to redownload one or more tiles are: + + + + +Bad +Only if the tile is corrupt in some way or missing, then this will download a new copy + + +New +Refresh the tile according to the local map cache and if server has a newer version + + +All +Redownload the tile + + + +Map Tile Information + +By right clicking on viewport and selecting Show Tile Information you can see the tile properties of this location for the current map layer and current zoom level. +This includes the remote source URL for the tile and the cached version on the local filesystem with timestamp details. + + + +
+Map Tile Info Dialog: Example + + + +
+This is using MapQuest at &appname; zoom level 128 over the Isle of Wight, UK. +
+
+ +
DEM Download + +You must have a Layer selected to use this. + + +Enable this tool by clicking on the toolbar icon: + + +Click to download and import a DEM file. + +DEM File Information + +By right clicking on viewport and selecting Show DEM File Infomation you can see the file properties of the DEM file for this location. +This includes the remote source URL for the file and the cached version on the local filesystem with timestamp details. + + + +
+DEM File Info Dialog: Example + + + +
+This is for block 51N, 003W - covering Bristol in the UK. +
+
+ +
Webtools + +Many services are available only via a web browser (Google Maps, OpenStreetMap Potlach editor, etc.). + + +Jumping from &app; to such service can become annoying. + + +&appname; allows you to open such service directly at the position currently viewed in &app;. + + +This feature is called Webtools. It is also known as External Tools. + +
+ +
+ + +
Preferences +
General +
Localisation +You can select units displayed by &appname; to best fit your usage. +
+Properties dialog: units part + + + +
+Concerning degrees, you can select the way to display them: + + +DDDdecimal degree + + +DMMpartial sexagesimal display: degrees, minutes and decimal part of minutes + + +DMSsexagesimal display: degrees, minutes and seconds + + + +
+Properties dialog: degree display options + + + +
+
+
Waypoint Icon Size +An option exists to control the icon (symbol) size used for waypoints + +
+
<emphasis>Home</emphasis> Default Location: Latitude and Longitude +You can set the Home location directly by inputting the latitude and longitude in decimal degrees. + +
+
Time Display +This controls the reference timezone that times are shown in. +Locale is the current user's system preference. This was how all times were shown up to version 1.5. +World will attempt to determine the timezone at an object's position. +UTC enforces this standard timezone. +
+
Tile's age +This age is used to decided wether or not a new request to tile server must be done. + +Changing this value, you will increase or decrese the network load. +
+
Default map layer directory +This property sets the default directory of the tiles cache. +This value is used when you create a new map layer. + +You are still able to change this value in each map layer properties. +
+
Map Cache Memory Size +This controls the amount of maps that are stored in memory, rather than having to reread from disk. +Generally if you have a system with lots of memory it's recommended to increase this value. + +
+
+ +
Export/External +
KML Export Units +Allows setting the units used when saved as the KML file type, such as Metric or Statue units +
+
GPX Track Order + + Other software may display tracks in a particular order (often the order saved into the file). + This allows you to control the order they are saved when exporting to a GPX file. + +
+
GPX Waypoint Symbols +Some GPS devices require waypoint symbols to be in a particular case. +E.g. On a Garmin Oregon 450 they must be in Title Case to be recognized. +
+
Image Viewer (Not Windows) +Allows setting the program used to view images associated with Waypoints. +By default this is set to xdg-open which should open the system's default image viewer, however this can be overridden with this setting. +Note: for Windows systems, viewing images associated with Waypoints always uses the system's default image viewer. +
+
External GPX programs +Allows setting the programs invoked via the Layer menu Export LayerOpen With 'program' +Two options are given so that it can be configured for various uses such as: + +An OSM editor (default) +Some other user defined program + +
+
GPSBabel +This allows setting the specific location of GPSBabel. +&appname; will need to be restarted for this setting to take effect. +
+
Auto Read World Files +If this is on, when a new image is selected for the GeoRef layer then the associated world file will be read to find the scale and positional properties. +The associated file is based on filename patterns; e.g. if the image is filename.jpg - then the world file may be filename.jpgw or filename.jgw +
+
Auto Device GPX Simplify +If this is on, GPX files will be simplified (using GPSBabel) if they are saved into a special location (by default a Garmin device location in OS file system). +Extra parameters used in process such as the location and limits applied can be refined by export_device_* values in . +A warning message is displayed when this occurs so one can consider if manually managing the tracks is needed, e.g. see methods. +The main intention for this is to prevent writing GPX files that are only partially useful. +For instance on a GPS Etrex 20 device: if a track with 1000 points is saved to it, the device will only read in the first 500 points, +thus effectively making only 1/2 of the track available. +Hopefully a simplified track will be more useful to follow to your destination when one is out in the wilds, than only a section of it. + +You will need to set the appropriate limits for your device, as this is not currently auto detected. +
+
+ +
Advanced +
Save File Reference Mode + + Files referenced within project files can be saved with either absolute or relative paths. + Using relative paths can be useful when copying the project file and the associated files between different systems. + +
+
Ask for Name before Track Creation +A setting to control whether an automatic name is used when creating a new track or route, or whether you are asked to enter a name. +
+
Show Tooltip during Track Creation +A setting to control whether the tooltip with the cumulative track or route distance is shown when creating tracks and routes. +
+
The number of recent files + + The number of recent files shown in the FileOpen Recent File menu. + A value of -1 means all files. The new value applies to New Windows only (or on application restart). + +
Open files in selected layer +A setting to control whether non Viking format files (i.e. typically GPX or KML files) will open in the selected TrackWaypoint Layer. +When no TrackWaypoint Layer is selected (or the layer is invisibile) then the file will be open in the default manner: at the top level. + +
+
Show calendar day names +A setting to control whether the calendar displays day names (Mon, Tue, etc...) or not. + +
+
Ruler area label position +A setting to control the position of the label drawn on the viewport that shows the area value. Includes a setting to turn off the label. + +
+
Use Scroll to Zoom +A setting to control if scroll events cause the viewport to zoom (rather than moving). Useful with mouse scroll wheels, but less intuitive for touchpads. + +
+
Invert Scroll Direction +A setting to control the direction of scroll events. Especially useful with touchpads and can be used to override the desktop system's setting. + +
+
+
+ +
OpenStreetMap Traces +
OAuth Method + + Using the OAuth method means that your OSM account details are no longer needed to be known by &appname;. + Instead specific tokens are generated for use only by &appname; which are associated with your OSM account. + +Get New OSM Access Tokens + Use this button to generate a new OSM Access Token Key and Secret. + You will be redirected to the OSM website to confirm allowing &appname; to access the GPX Traces features. + The tokens returned by the OSM website will be stored in the Access Token Key + Access Token Secret preferences. + +Access Token Key + Access Token Secret: +These are the values used, however one typically does not need to manually change them. +
+
HTTP Basic Authentication (Discouraged) +OSM Username + Password +Store your OSM details here, so that you don't need to enter it in every time in the procedure. +This is not recommended and one should use the OAuth method using access tokens described above. + + +Your OSM password will be stored in plain text. + + + + +This password is transferred unencrypted in every request sent to the OpenStreetMap server. This is due to the use of OpenStreetMap's basic authentication method. + + + + +When OAuth capability is built into &appname; (the default), use of HTTP Basic Authentication can only be used if the osm_basic_auth is enabled. + + +
+
+ +
Mapnik + +If any changes to these settings are made, you will need to restart &appname; to make them be applied. + + +
Plugins Directory +The location of Mapnik plugins. An attempt is made to automatically determine the initial value, + however if this is wrong or Mapnik is upgraded then the directory can be set here. +
+
Fonts Directory + +The location of fonts for use with Mapnik. Normally it is best to simply use the System's font directory. + +
+
Recurse Fonts Directory +Load fonts in any sub-directories of the main font directory. +
+
Rerender Timeout +The time in hours before any tile is rerendered. +This is useful in case the underlying source data for the tiles changes (e.g. OSM data is continually evovling). + &appname; normally has no way of knowing when the data has changed, so this simple timeout method is provided to maintain consistency of the tile images. +
+
CartoCSS +This allows setting the specific location of the carto executable. +
+
Threads + + The number of threads to use for Mapnik rendering tasks. + By default the value is set to the 1 in case of any multi-threading rendering code chain crashes. + Otherwise trying setting the value to the number of the CPUs of the system minus one (so as not to overload the system), in order to minimise the overall rendering times. + +
+
+ +
Routing +
Routing engine +You can select the routing engine used by default, ie by features that do not propose a live selection, like . +
+
+ +
Startup +Naturally since these preferences effect the startup, the values will not be used until &appname; is restarted. +
Restore Window Setup +When this is enabled, the main window size and layout (such as whether the statusbar or layers panel are shown) is restored to the values from last use. +
+
Default Map Layer +When this is enabled, a map layer is automatically added whenever &appname; is opened and a &appname; file is not to be loaded. +The map layer used is defined by the map layer's default values. +
+
Startup Method +Enables selection of how the startup position should be determined. + + +Home Location (default) +Position as set by the Set the Default Location + + +Last Location +Uses the last position viewed on the viewport + + +Specified File +Load the file as specified below + + +Auto Location + + Uses the GeoClue service if available + or otherwise the web service hostip.info to attempt to determine your location via IP lookup + + + + +
+
Startup File +Loads this specified file when the Startup method is set to Specified File +
+
Check For New Version +Periodically (no more than once every 14 days), check to see if there is a new version of &appname; available. +
+
+ +
Toolbar +
Append to Menu +Allows setting the toolbar on the same vertical space as the menu, thus increasing vertical space for the map. +
+
Icon Size +Allows configuration of the icon size, including overiding the system's default preference to the setting desired just for &appname;. +
+
Icon Style +Allows configuration of the icon style, including overiding the system's default preference to the setting desired just for &appname;. +
+
Customize +Opens the Customize Toolbar dialog. +From this dialog the items in the toolbar can be added, removed and reordered. Reordering of items is performed by drag and drop. +
+Customize Toolbar dialog + + + +
+
+
+ +
+ + +
Howto's +
Getting Started + +&appname; from version 1.5 has several features to ease the start up process. +On the very first run, you will be asked if you want to enable these features which make use of an Internet connection. +If you select no or you have upgraded from an earlier version you can choose to enable any of the startup options via the . + + +Some other general use cases for using &appname;, are as follows: + +
Go to an area of interest + +&appname;'s default location is a Manhatten, New York, USA, so you may need to pick another place that interests you - such as where you live. + + +Method A + + + Use the online location address/place search. + + + Use the Go to Location toolbar button or from the menus + ViewGo to Location. + You can change the search location provider if desired. + Enter the name of place you wish to go to (you may need to specify the country to refine the search). + Also you can enter a post code or a ZIP code instead. + + + You will need an internet connection for this search to work + + + + +Method B + + + If you know the coordinates of where you want to view: + + +Use View and select from either Go to Lat/Lon or Go to UTM and then enter in the specific coordinates. + + + + +Method C + +Use the GPS Layer or FileAcquireFrom GPS +to load data directly from your GPS into &appname;. + +You can specify the types of data to acquire: Tracks, Routes and/or Waypoints. + + +You must have write permission to the port used. For Unix like OS: + + /dev/ttyS0 is the first serial port + /dev/ttyUSB0 is the first USB port + usb: is any USB port + +Depending on your distribution only one of the USB port types may work +For Windows: + + com1: is the first serial port + usb: is any USB port + + + + The GPS devices supported are those supported by GPSBabel. + Garmin and Magellan GPS devices supported by all versions, later versions of GPSBabel support more devices such as DeLorme and Navilink. + + + + +Method D + + +Get data from files in GPX or KML format, which can be opened directly. +Use FileOpen + + +Other formats can be imported that are supported by GPSBabel. +FileAcquireImport File With GPSBabel... + + + +The viewport will be automatically moved and resized to view the contents of the file. + + + + +
+
Add a Map Layer + +Use LayersNew Map Layer, and choose a suitable cache directory +where you would like to store your tracks and click OK. Zoom to a +comfortable level (I suggest 4 mpp) by clicking the left and right +mouse buttons on the gray area where your tracks are. Now from the menu +choose the Tool. Click where you would like to download a +map. Regardless of what tool you are using, the middle mouse button +always pans. + + +You need an open internet connection when you are downloading maps. + + + +If you can no longer see your tracks or waypoints and only the map, +it is because the layer named Map is ABOVE your TrackWaypoint layer that your GPS data is in. +This means that it will be drawn last and on top of the other . +Look at the to the left which shows this order. +Select the Map layer from the list and click the down arrow button beneath the list until the Map layer is below the TrackWaypoint layer. +Your tracks will now be drawn over the map. + +
+ +
Set Your Home Location + + You can save the current center position of the viewport as the default location AKA the Home Location by + EditSet the Default Location. + + + Then at any time you can return to this place by clicking on the Home icon on the toolbar. + + + You can also set the default location via specifing the exact latitude and longitude in the . + +
+ +
+
From 1st startup to GPS track (including offline maps) + +The first you'll see is an empty map, because &appname; in its default configuration will download maps only on demand. +Before fetching unneeded data, one can position to a location of interest, e.g. Stuttgart: ViewGo to Location, enter Stuttgart. + +
Fetching the maps + +Map + + +LayersNew Map Layer +in the layer properties dialogue choose e.g. OpenStreetMap (Mapnik). + +For the moment, we keep the default Maps Directory (the directory in +which the maps will be stored and can be used for offline usage). + + +Check Autodownload maps and keep the zoom level as Use Viking +Zoom Level. + + +however, that these settings will play an important +role in the pre-fetch for offline usage discussed later + + + + +You'll see a map of Stuttgart. Using the mouse wheel, you can +zoom in and out. The maps for the choosen resolution will be downloaded +automatically. + + +DEM Layer (Height Map) + + +Zoom out to 512. +LayersNew DEM Layer +Keep the download source as is (SRTM Global 90m), hit OK. + + +In the layer listing on the left, the layer should reside +above the map layer. If this is not the case, highlight the DEM layer +an shift it one up (using the arrow up button). + + +highlight the DEM layer in the layer listing on the left +in the toolbar, check DEM layer download/import (the last symbol) +a left-click in the map window should then fetch the DEM data + + +This might take some time. + + +Sometimes, a tile does not show up correctly (you might see only a +black frame in the map window) because it got corrupted during +transfer. In order to correct this, you can delete the corresponding +datafile in the cache. right-click the DEM layer properties + + +The DEM Files listing allows you to delete the specific tiles (alternatively do this from the command line). + + +You can also alter the Min. and Max. elevation in this dialogue. + + +
+
GPS Track with Height Profile + +Uncheck the layer (the map is shown again) + + LayersNew TrackWaypoint Layer + Ensure the new track layer is above the map layer. + +Expand the layer, select Tracks +In the tools menu choose Create Track + +Leftclick in the map window, enter a name + + Click several times to generate a track (a right-click removes the last point). + Height data is set automatically since DEM data is available + +Expand tracks in the layer menu, your track should show up, select it +Right click your track, select Properties +Click the tab Elevation-distance - enjoy the plot + + +In order to save this setting for later usage + + +click OK in the Track Properties dialog +FileSave As, choose a name (you can open this view later via fileOpen). + + +
+
Usecase: offline data for holiday + +Suppose you want to have the and data offline for your holiday in Italy near Bologna. + + +Start a new &appname; session. +ViewGo to Location, enter Bologna +LayersNew Map Layer +Choose e.g. OpenStreetMap (mapnik). +adapt the maps directory e.g. to /home/user/.viking-map-holiday/. +This allows you to delete the map stuff after holiday without purging the rest of your maps. + +check autodownload map +keep viking zoom level +zoom out to 1024 +add a layer (as discussed above) +download the DEM data + +In the &app; version discussed here, the DEM data automatically +are stored in /home/user/.viking-maps/. You can move the corresponding +tiles into .viking-map-holiday/ if you like. + + +Download map data for all zoom levels + + +uncheck the DEM layer for the map to show up +navigate the map to be centered at Bologna +choose the zoom such, that all regions of interest are displayed in the map window (e.g. 1024) + +follow this sequence until you have all tiles for all zoom levels you need + +right-click the map layer properties +set the zoomlevel explicitely one below the last (in the first cycle 512), hit OK +right click the map layer Download Missing Onscreen Maps +wait until all tiles for that resolution have been downloaded + + + +This may take some time and some hard disk capacity. + +Do not forget to save your configuration (as discussed above). + + +
+ +
+
OpenStreetMap project + +OpenStreetMap (OSM) is a collaborative project to create a free editable map of the world. +One of the sources of data for this project is GPS tracks. +&appname; supports this project via the GPS Traces methods, both uploading and downloading such data. + + + Authentication/authorization is required to use these services. See . + + +Also see for further detail. + +
Uploading data to OpenStreetMap + +It is possible to upload data directly from &appname; to OpenStreetMap. + + +Upload a layer + +One solution is to upload whole a layer. To do this, +simply select the layer and right click on it. Then, select Upload to +OSM. + + + +Upload a single track +Another solution is to upload an individual track. Simply select the track and right click on it. +Then select Upload to OSM. + + + +Fill in the form + +The filename is the name you want your upload has on the server. This information is displayed by the osm server. +The description is some descriptive information. +The tags field is a white space separated list of tags. + + +
+ +
Downloading Traces from OpenStreetMap + +It is possible to download GPS traces directly from OpenStreetMap into &appname;. +This feature can be really useful for checking existing data before uploading new ones. + + +Download all visible tracks +One solution is to select + +File +Acquire +OSM traces... +. +Each request can get up to 5,000 points. +The dialog box allows setting which group of 5,000 points to get. These groups are known as Page Numbers which start at 0. +Increasing the page number parameter allows one to request the subsequent sets of point groups. + + +
+
Downloading Your Own Traces from OpenStreetMap + +It is possible to download any of your personal GPS traces previously uploaded to OpenStreetMap into &appname;. + + +Initially this will return the list of your OSM Traces, from which you can select which specific traces to retrieve. +This list can be sorted on each column so that it easier to find an individual trace or select a group of traces by similar properties. + +
+ +
+ +
Geotagging + + This assumes you already have a layer enabled for ease of use (if not see above to get one). + +
Manual Positioning + + This is useful for instances when you already know exactly where the image was taken (no need for tracklog). + Or maybe you want to adjust an automatically generated waypoint for the position of the subject of the image rather than the location that the photograph is taken from. + ATM this process only works on an individual image, so it will be tedious for handling lots of images. + + + First create a layer or use an existing one; and select it in the . + NB Make sure this layer is above the map layer in the Layers Panel list. + Create a new waypoint (or move an existing one) to exact location desired: + + Select the tool, then left click on the map at the location desired, choosing an image to associate with it in the new waypoint dialog + Select the tool, then left click on waypoint to be moved. Left click again and drag the waypoint to the location desired + + Then using the Select tool left click on waypoint to select it, then right click to access the Waypoint properties menu, then choose + Update Geotag on ImageUpdate + + + The Update Geotag on Image options are only available when a waypoint has an image associated with it. + +
+ +
Automatic Positioning Against a Tracklog + + First you will need a tracklog with timestamps in it. Either load one from a previously saved file or freshly acquired from a GPS device - + see Getting Started. + It helps if this is the track that was recorded at the time you took some photographs! + + + Select the track either from the layers panel on the left or via the viewport using the tool. + Then right click on it and chose the Geotag Images... leading you to the Dialog. + + + Load some images that where taken around the time the track log was recorded. Confirm the other options in the dialog - normally the defaults should be alright and select OK. + If things are succesful, new waypoints with thumbnail images of the photographs will appear. + You should probably check they are really in the right place as often the timestamp of the camera may not be aligned to the GPS correctly leading to inferring incorrect locations. + +Option: Overwrite Waypoints + + This is particularly useful when one finds an attempt at geotagging gives wrong locations, often due to time offset issues. + Simply try again with a new time offset (often 1 hour adjustments due to Daylight Savings or Summer Time times) and the old waypoints will be updated (instead of creating new ones). + + + + If you have multiple tracks in a TrackWaypoint layer, then invoking the Geotag Images... action on the layer + will search all the tracks to find location matches. + +
+
+ +
GPS Real Time Location + + &appname; relies on gpsd to provide the current location from a real time feed from a GPS device. + + + This assumes you already have a layer enabled for ease of use (if not see above to get one). + + + Turn on the GPS Device, ensure it has figured out it's location and plug it in to your computer. + +
Set Up GPS Layer + + You will need a layer. One can be added via LayersAdd GPS Layer. + + + Adjust the Realtime Tracking Mode settings to interface with gpsd as necessary. Normally the defaults should suffice. + + + Current Linux distributions should run gpsd automatically when a GPS Device is plugged in. Otherwise you may have to run gpsd manually. + + + Then right-click the layer and select Start Realtime Tracking. + Hopefully the viewport should jump to the GPS location. + + + Troubleshooting checklist: + +Confirm gpsd is running. +Confirm on the GPS device it has a location. +Confirm the Realtime Tracking Mode settings. +
+
+ +
What to Do if &appname; Does Not Seem to Work + +In order to get some information about what &appname; is doing, start it in verbose debug mode via the command line: +viking -dV + + +NB For Windows the process is slightly more involved as the output is typically not shown in the command prompt, +so you have to redirect the output to a file, e.g. open the command prompt and then: + +cd "C:\Program Files\Viking" +viking -dV 2>1 > %TMP/viking.log + +Then close &appname; before viewing the output file, such as: +notepad %TMP/viking.log + + +For instance you can check the correct URLs &appname; is using in requesting remote data for DEMs or map tiles in the verbose debug output. +E.g. Something like this for DEMs: + +** (viking:28778): DEBUG: curl_download_uri: uri=http://dds.cr.usgs.gov/srtm/version2_1/SRTM3/Eurasia/N48E008.hgt.zip +* About to connect() to dds.cr.usgs.gov port 80 (#0) +* Trying 152.61.128.95... * connected +* Connected to dds.cr.usgs.gov (152.61.128.95) port 80 (#0) + GET /srtm/version2_1/SRTM3/Eurasia/N48E008.hgt.zip HTTP/1.1 +User-Agent: viking/0.9.8 libcurl/7.18.2 GnuTLS/2.4.2 zlib/1.2.3.3 libidn/1.8 +Host: dds.cr.usgs.gov +Accept: */* + HTTP/1.1 200 OK + Date: Sun, 26 Jul 2009 18:13:38 GMT + Server: Apache + Last-Modified: Tue, 21 Jul 2009 19:57:35 GMT + ETag: eac3f8-1828f5-46f3caa76070a + Accept-Ranges: bytes + Content-Length: 1583349 + Content-Type: application/zip + +* Connection #0 to host dds.cr.usgs.gov left intact +* Closing connection #0 +** (viking:28778): DEBUG: dem_layer_add_file: /home/username/.viking-maps/srtm3-Eurasia/N48E008.hgt.zip + +Or for OSM Mapnik tile server: + +* About to connect() to tile.openstreetmap.org port 80 (#0) +* Trying 193.63.75.28... * connected +* Connected to tile.openstreetmap.org (193.63.75.28) port 80 (#0) + GET /13/4065/2748.png HTTP/1.1 +User-Agent: viking/0.9.96 libcurl/7.20.1 GnuTLS/2.8.6 zlib/1.2.3.4 libidn/1.18 +Host: tile.openstreetmap.org +Accept: */* + +* HTTP 1.0, assume close after body + HTTP/1.0 200 OK + Date: Thu, 14 Oct 2010 22:18:42 GMT + Server: Apache/2.2.8 (Ubuntu) + ETag: "b66ff9d46474bab68262a3483428a232" +** (viking:16704): DEBUG: curl_get_etag_func: ETAG found: "b66ff9d46474bab68262a3483428a232" + Content-Length: 17194 + Cache-Control: max-age=94805 + Expires: Sat, 16 Oct 2010 00:38:47 GMT + Content-Type: image/png + Age: 5153 + X-Cache: HIT from konqi.openstreetmap.org + X-Cache-Lookup: HIT from konqi.openstreetmap.org:3128 + Via: 1.1 konqi.openstreetmap.org:3128 (squid/2.7.STABLE7) + Connection: close + +* Closing connection #0 +* About to connect() to a.andy.sandbox.cloudmade.com port 80 (#0) +* Trying 178.63.75.195... ** (viking:16704): DEBUG: curl_download_uri: uri=http://tile.openstreetmap.org/13/4065/2749.png +* About to connect() to tile.openstreetmap.org port 80 (#0) +* Trying 193.63.75.28... * connected +* Connected to a.andy.sandbox.cloudmade.com (178.63.75.195) port 80 (#0) + GET /tiles/cycle/13/4065/2747.png HTTP/1.1 +User-Agent: viking/0.9.96 libcurl/7.20.1 GnuTLS/2.8.6 zlib/1.2.3.4 libidn/1.18 +Host: a.andy.sandbox.cloudmade.com +Accept: */* + +* connected +* Connected to tile.openstreetmap.org (193.63.75.28) port 80 (#0) + GET /13/4065/2749.png HTTP/1.1 +User-Agent: viking/0.9.96 libcurl/7.20.1 GnuTLS/2.8.6 zlib/1.2.3.4 libidn/1.18 +Host: tile.openstreetmap.org +Accept: */* + +* HTTP 1.0, assume close after body + HTTP/1.0 200 OK + Date: Thu, 14 Oct 2010 23:44:35 GMT + Server: Apache/2.2.8 (Ubuntu) + ETag: "8e520ad47ce9c1b63430554886eb5fab" +** (viking:16704): DEBUG: curl_get_etag_func: ETAG found: "8e520ad47ce9c1b63430554886eb5fab" + Content-Length: 18094 + Cache-Control: max-age=87742 + Expires: Sat, 16 Oct 2010 00:06:57 GMT + Content-Type: image/png + X-Cache: MISS from konqi.openstreetmap.org + X-Cache-Lookup: MISS from konqi.openstreetmap.org:3128 + Via: 1.1 konqi.openstreetmap.org:3128 (squid/2.7.STABLE7) + Connection: close + + +
+ +
+ + +
+ Extending Viking + + Currently, &app; has some extention points based on configuration files. The file format is heavily inspired by the GtkBuilder file format: you specify the class of the GObject to build and set its properties. Technically, it is a XML file containing a "objects" root element. Inside this element, you set a collection of "object". + Here is an example: + + + Property value + Property value + + ... + +]]> + + + You can find more examples in the documentation part of the distribution. + + It is also possible to override the internal defaults e.g. to update any parameters should they change over time, + by adding the values into your configuration file. + When you define object group that already exists (and for Maps this means by a repeated Id key, but you may have to examine the source code to work out what the relevant Id values are) then you need to define all the other keys as well, otherwise they will be reset to the defaults. + +
+ Map Source + It is possible to add new map's sources. The file is ~/.viking/maps.xml for UNIX like systems, C:\Documents and Settings\username\.viking\maps.xml on Windows XP or C:\Users\username\.viking\maps.xml on Windows 7 onwards. + An example of the file is in the distribution doc/examples/maps.xml. Further examples and values are online in the Maps Wiki + + The VikSlippyMapSource allows to declare any map's source working like OpenStreetMap. It supports the following properties: + + + id + this is an integer and should be unique as it used to identify the map source + + + name + a string (should be unique) that is used for the OSM style cache directory name when the Map Cache directory is the default (~/.viking-maps) + + + label + the text displayed in the map's source selection dialog + + + hostname + the server's hostname (eg. "tile.openstreetmap.org") + + + url + + the parametrized address of the tile, in the spirit of C printf format, with 3 "%d" fields for Z, X and Y (in that order) (eg. "/%d/%d/%d.png") + + The full parametrized address can just be put in the URL field and the hostname field doesn't need specifying. + e.g. "https://tile.openstreetmap.org/%d/%d/%d.png" + + + + + zoom-min (optional) + The minimum zoom value supported by the tile server. The Default is 0 if not specified. + + + zoom-max (optional) + + The maximum zoom value supported by the tile server. The Default is 18 if not specified. + See Zoom Levels + + + + lat-min (optional) + The minimum latitude value in degrees supported by the tile server. The Default is -90 degrees if not specified. + + + lat-max (optional) + The maximum latitude value in degrees supported by the tile server. The Default is 90 degrees if not specified. + + + lon-min (optional) + The minimum longitude value in degrees supported by the tile server. The Default is -180 degrees if not specified. + + + lon-max (optional) + The maximum longitude value in degrees supported by the tile server. The Default is 180 degrees if not specified. + + + file-extension (optional) + + The file extension of the files on disk. The default is .png + If the tile source URL ends in something other than .png, then this parameter will need to match it. + This can also be useful in reading a tileset from other software which may name tiles in an alternative form, + e.g. for Mobile Atlas creator it names them .png.tile + The file types actually usable are those supported by GDK Pixbuf Library, which includes at least PNG and JPEG. + Remember to include the beginning '.' when specifying this parameter. + + + + use-direct-file-access (optional) + + Only use files on disk. The default is FALSE + This can also be useful for tilesets already on disk as it will avoid attempting to download any tiles. + Thus with this type the hostname and url parameters are not necessary and are ignored. + + + + switch-xy (optional) + + Swap the X,Y values around in the URL parametrized ordering. + The default is false. + + + + check-file-server-time (optional) + + Sends the timestamp of the tile to the server, so the server can decide whether it should send a new tile or not. + The default is false. + + + + use-etag (optional) + + Use and compare the ETag value in determining whether to download a newer tile. The default is false. + The ETag value is stored in a separate file in the same directory as the tile to enable checking the value across multiple runs of the program. + + + + tilesize-x (optional) + The tile x size. The default is 256 pixels if not specified. + + + tilesize-y (optional) + The tile y size. The default is 256 pixels if not specified. + + + scale (optional) + + The tile scale. The scale is 1 if not specified. + Use a value of 2 to represent high res tiles. + Don't change the tilesize as the internal display size is still based on 256 pixels. + + + + + + The VikTmsMapSource allows to declare any TMS service. It supports the following properties (as per VikSlippyMapSource above): + + + id + + + label + + + hostname + + + url + + + check-file-server-time (optional) + + + zoom-min (optional) + + + zoom-max (optional) + + + lat-min (optional) + + + lat-max (optional) + + + lon-min (optional) + + + lon-max (optional) + + + + The VikWmscMapSource allows to declare any WMS or WMS-C service. It supports the following properties (as per VikSlippyMapSource above): + + + id + + + label + + + hostname + + + url + + + check-file-server-time (optional) + + + zoom-min (optional) + + + zoom-max (optional) + + + lat-min (optional) + + + lat-max (optional) + + + lon-min (optional) + + + lon-max (optional) + + + +
+ +
+ Go-to search engines + It is possible to add new new search engines for the "Go-To" feature. The file is ~/.viking/goto_tools.xml. + An example of the file in the distribution doc/examples/goto_tools.xml. + Currently, there is a single object class available: VikGotoXmlTool. Such feature allows to declare any search engine using a XML format as result. + The related properties are: + + + label + the text displayed in the Go-To dialog + + + url-format + the parametrized address of the query, in the spirit of C printf format, with a single "%s" field (replaced by the query string) + + + lat-path + XML path of the latitude (eg. /root/parent/elem) + + + lat-attr (optional) + name of the attribute (of previous element) containing the latitude + + + lon-path + XML path of the longitude (eg. /root/parent/elem) + + + lon-attr (optional) + name of the attribute (of previous element) containing the longiude + + + + As a facility (or readability) it is possible to set both path and attribute name in a single property, like an XPath expression. To do so, simply set both info in lat-path (or lon-path) in the following format: /root/parent/elem@attribute. +
+ +
+ External tools + It is possible to add new external tools. The file is ~/.viking/external_tools.xml. + An example of the file in the distribution doc/examples/external_tools.xml. + The VikWebtoolCenter allows to declare any Webtool using a logic based on center coordinates and zoom level value. + The related properties are: + + + label + the text displayed in the menu entry + + + url + the parametrized URL to open, in the spirit of C printf format, with 2 "%s" and a "%d" fields for X, Y and Z (zoom level) (eg. "http://hostname/?lat=%s&lon=%s&zoom=%d") + + + + The VikWebtoolBounds allows to declare any Webtool using a logic based on bounds coordinates. + The related properties are: + + + label + the text displayed in the menu entry + + + url + the parametrized address of the tile, in the spirit of C printf format, with 4 "%s" fields for left, right, bottom and top (eg. "http://hostname:8111/load_and_zoom?left=%s&right=%s&bottom=%s&top=%s") + + + +
+ +
+ Routing engine + It is possible to declare new routing engines. The file is ~/.viking/routing.xml. + An example of the file in the distribution doc/examples/routing.xml. + The VikRoutingWebEngine allows to declare a routing engine available via HTTP. + The related properties are: + + + id + a string, should be unique as it used to identify the routing engine + + + label + the text displayed in the menu entry + + + format + + The GPSBabel format code to interpret the service response. By default a GPX response is expected and processed internally. However if the service returns different format then GPSBabel is used to transform the text into something that &appname; can understand. Only formats that GPSBabel supports can be used: e.g. 'gpx', 'kml', 'gtrnctr' (for Garmin Training Center .tcx files), etc... + Use gpsbabel --help on the command line to find out the supported file types and their codes to process them. + + + + url-base + the base URL of the web service (eg. "http://hostname/service?") + + + url-start-ll + the part of the URL setting the starting point location, parametrized in the spirit of C printf format, with 2 "%s" for coordinates (eg. "&start=%s,%s") + + + url-stop-ll + the part of the URL setting the end point location, parametrized in the spirit of C printf format, with 2 "%s" for coordinates (eg. "&stop=%s,%s") + + + url-via-ll (optional) + the part of the URL setting via point location, parametrized in the spirit of C printf format, with 2 "%s" for coordinates (eg. "&via=%s,%s") + + + url-start-dir (optional) + the part of the URL setting the starting point location for direction based routing, parametrized in the spirit of C printf format, with one "%s" for direction (eg. "&start=%s") + + + url-stop-dir (optional) + the part of the URL setting the end point location for direction based routing, parametrized in the spirit of C printf format, with one "%s" for direction (eg. "&start=%s") + + + url-ll-lat-first (optional) + The ordering of the lat/long terms in the Start, Stop and Via URL settings. By default this is TRUE. + For instance using Brouter services, the URL uses a pair of values which is longitude and then latitude. Thus setting this value to FALSE ensures the value substitution is performed in the necessary order. + + + referer (optional) + A URL to serve as referer for the HTTP request (eg. "http://hostname/") + + + follow-location (optional) + the max depth of recursive redirections + + + +
+ +
+ Remote File Datasources + It is possible to add web references expected to return a file which can then be opened directly or converted via GPSBabel. + The file is ~/.viking/datasources.xml. + An example of the file is in the source distribution doc/examples/datasources.xml. + The VikWebtoolDatasource allows to declare any URL using logic based on coordinates. + The related properties are: + + + label + the text displayed in the menu entry + + + url + + the parametrized URL to open in the spirit of C printf format, with up to 9 "%s" values. e.g. http://hostname/getfile?lat=%s&lon=%s + The order and meaning of these parameters is given by the url_format_code below + + + + url_format_code + + A string describing the parametrized URL substitution parameters, each character represents how to translate each term. + B = Bottom of the current view i.e. minimum latitude + L = Left of the current view i.e. minimum longitude + T = Top of the current view i.e. maximum latitude + R = Right of the current view i.e. maximum longitude + A = center lAtitude of the current view + O = center lOngitude of the current view + Z = OSM Zoom value of the current view. See Zoom Levels + P = selected Point's latitude + N = selected poiNt's longitude + S = A user specified input string requested from the user via a dialog box + Thus for the url example above then the format code should be AO + + + + file_type + + This value is passed on for the -i parameter in interfacing with GPSBabel. + If it is not defined then the returned file is interpreted internally as a GPX file. + Possible values such as 'kml', 'mapsource' etc.. can be used. See GPSBabel File Formats for the full list. + + + + babel_filter_args + + This value is passed on for the filter arguments interfacing with GPSBabel. + E.g. "-x nuketypes,routes" can be used to filter all routes from the results. + + + + input_label + + This value is used when requesting input from the user. + It is the label of the text input box. + + + + +
+ +
+ System Extension File Locations + Note that, on UNIX like systems, the extension files (&extfiles;) are also searched in /etc/viking and /usr/share/viking directories (or related in your system). + The XDG_DATA_DIRS environment variable can be used to change these directories. + The XDG_DATA_HOME environment variable is also used (if set) to look for these extension files. +
+ + +
+ Miscellaneous Settings + Various individual values are automatically saved between &app; sessions in the ~/.viking/viking.ini file. + This file is not intended to be manually edited, but since it is a plain text file it can be changed if desired. + Some values in this file are read only, in the sense that there is no way to set it other than by manually entering in the keys and values (the key will not exist in the file otherwise). This allows some fine tuning of &app; behaviours, without resorting to recompiling the code. However is it not expected that these values should need to be changed for a normal user, hence no GUI options for these have been provided. + Here is the list of the read only keys and their default values. + + + curl_cainfo=NULL + See CURLOPT_CAINFO + + + curl_ssl_verifypeer=1 + See CURLOPT_SSL_VERIFYPEER + On Windows this is defaulted to 0 to get HTTPS connections to at least work, + otherwise any attempts at verifying always fail. + [Some incompatibily is suspected in the reliant binary DLLs] + + + geoclue_accuracy_level=4 + Set the integer value for the accuracy level request to the GeoClue service. Values to match the GClueAccuracyLevel: + + 0 = GCLUE_ACCURACY_LEVEL_NONE + 1 = GCLUE_ACCURACY_LEVEL_COUNTRY + 4 = GCLUE_ACCURACY_LEVEL_CITY + 5 = GCLUE_ACCURACY_LEVEL_NEIGHBORHOOD + 6 = GCLUE_ACCURACY_LEVEL_STREET + 8 = GCLUE_ACCURACY_LEVEL_EXACT + + + + gpx_tidy_points=true + ATM Only attempts to remove a suspicious first point of a GPX track + (as opposed to any points within a track). + + + gpx_tidy_points_max_speed=340 + Over this speed (in metres per second) for the first pair of points - the first point is removed. + + + layers_create_trw_auto_default=false + Create new TrackWaypoint layers without showing the layer properties dialog first. + + + layers_panel_calendar_markup_mode=3 + 0=No markups. 1=Day marked. 2=Day marked and tooltips created. 3=Auto (timed tooltip creation, so if too slow it reverts to 1) + + + maps_max_tiles=1000 + + + maps_min_shrinkfactor=0.0312499 + + + maps_max_shrinkfactor=8.0000001 + + + maps_real_min_shrinkfactor=0.0039062499 + + + maps_scale_inc_down=4 + + + maps_scale_inc_up=2 + + + maps_scale_smaller_zoom_first=true + + + srtm_http_base_url=https://dds.cr.usgs.gov/srtm/version2_1/SRTM3 + Allows using an alternative service for acquiring DEM SRTM files. + Note that the layout on the server needs to be split into Continent directories. + + + mapnik_buffer_size=128 (in pixels) + + + osm_basic_auth=false + Set to true to force the use of HTTP Basic Authenication even when OAuth is available + + + background_max_threads=10 + + + background_max_threads_local=Number of CPUs + + + window_default_tool=Pan + Options are: Pan, Zoom, Ruler or Select + + + window_menubar=true + + + window_copy_centre_full_format=false + + + version_check_period_days=14 + + + trackwaypoint_start_end_distance_diff=100.0 + + + gps_statusbar_format=GSA + This string is in the Message Format Code + + + geoclue_statusbar_format=SA + This string is in the Message Format Code + + + trkpt_selected_statusbar_format=KEATDN + This string is in the Message Format Code + + + utils_nearest_tz_factor=1.0 + + + viewport_history_size=20 + + + viewport_history_diff_dist=500 + In metres. + + Go Back or Go Forward requests over this range from the last history location will move back to that position. + If within this range it will skip over this location and move on to the next saved history location. + + + + viewport_scale=1 + + If Viking doesn't automatically detect a high resolution display, you can force the setting here - typically by setting this to 2. + + + + external_diary_program=rednotebook + Or in Windows it uses C:/Progra~1/Rednotebook/rednotebook.exe - This string value must use Unix separators and not have spaces. + + + external_astro_program=stellarium + Or in Windows use C:/Progra~1/Stellarium/stellarium.exe - This string value must use Unix separators and not have spaces. + Needs to be version 0.15.0 or greater (otherwise due to this Bug means this does not actually work). + + + external_text_program=gedit + Or in Windows it uses notepad - This string value must use Unix separators and not have spaces. + + + bfilter_simplify=100 + + + bfilter_compress=0.001 + + + list_date_format=%Y-%m-%d %H:%M + A date format description as passed on to strftime(). + Note that when displayed in tables sorting by this column simply uses the text value, rather than the underlying date/time value. + + + + export_device_path=OS Specific + UNIX = "/media/user/GARMIN/Garmin/GPX" + WINDOWS = ":/Garmin/GPX" + + + export_device_trackpoint_limit=10000 (Typical Garmin Edge limit) + Older Garmins limits are typically much lower - Etrex 20/30 is 500 + + + export_device_routepoint_limit=250 + + + kmz_default_maps_dir=Empty + You may want to use something like: "/media/user/GARMIN/Garmin/CustomMaps" + + + +
+ Message Format Code + Currently for ease of implementation the message format code is a string of characters. + Each character represents what should be inserted in relation to a Trackpoint. + One day it might evolve into something more user friendly with a frontend to control it, perhaps allowing arbitary text too. However for now at least some control is offered :) + + + + Character Code + + G = Some text to display at the start of the message - GPSD + K = Some text to display at the start of the message - Trkpt + A = Altitude of a Trackpoint + S = Speed of a Trackpoint + B = Vertical Speed (Climb) + C = Course of a Trackpoint + L = Location of a Trackpoint + T = Time of a Trackpoint + M = Time diff of a Trackpoint from the previous trackpoint + X = Number of satellites used in the trackpoint fix + D = Distance of the trackpoint from the start of a track (following along the track) + F = Distance of the trackpoint from the finish (end) of a track (following along the track) + P = Distance difference of the trackpoint from the previous trackpoint + N = Name of track to which the trackpoint belongs + E = Name of the trackpoint + + + + Output Notes + + If the output has * after it, then the value has been calculated via interpolation (such as speed when the Trackpoint does not contain a speed value). + If the output has ** after it, then difficulties were encountered in trying to work out the value so probably a default of 0 will be shown. + + + + +
+ +
+ +
+ Keyboard Shortcuts (Accelerator) Settings + This is held in the file ~/.viking/keys.rc + It is in the standard GTK Accelerator map format. Values are automatically read in and saved between &app; sessions. + This file is not intended to be manually edited, but since it is a plain text file it can be changed if desired. +
+ +
+ + + + + + + + +
diff --git a/help/C/legal.xml b/help/C/legal.xml index 312c12e..5d73dc0 100644 --- a/help/C/legal.xml +++ b/help/C/legal.xml @@ -6,7 +6,7 @@ by the Free Software Foundation with no Invariant Sections, no Front-Cover Texts, and no Back-Cover Texts. You can find a copy of the GFDL at this link or in the file COPYING-DOCS + url="help:fdl">link or in the file COPYING-DOCS distributed with this manual. This manual is part of a collection of GNOME manuals diff --git a/help/C/viking.xml b/help/C/viking.xml deleted file mode 100644 index 3acc3af..0000000 --- a/help/C/viking.xml +++ /dev/null @@ -1,4151 +0,0 @@ - - - Viking"> - - - - maps.xml, goto_tools.xml, datasources.xml, external_tools.xml, routing.xml"> -]> - - -
- - &app; Manual - - &app; is a free/open source program to manage GPS data. - - - - 2013 - Guilhem Bonnefille - Rob Norris - - - - - GNOME Documentation Project - - - - - - - - Guilhem - Bonnefille - - - Rob - Norris - - - - username: - Alexxy - - - username: - Vikingis - - - username: - Tallguy - - - username: - EliotB - - - Alex - Foobarian - - - - - - - &appname; Manual V&manrevision; - &date; - - Guilhem Bonnefille guilhem.bonnefille@gmail.com - Rob Norris rw_norris@hotmail.com - GNOME Documentation Project - This document was generated on . - - - - - This manual describes version &appversion; of &appname;. - - - Feedback - To report a bug or make a suggestion regarding the &app; application or - this manual, follow the directions in the - Feedback section of the GNOME User Guide. - - - - - - &app; - - -
- Introduction - -&appname; aims to be easy to use, yet powerful in accomplishing a wide -variety of tasks. Some of the things you can use &appname; for are: - - - -Uploading and downloading waypoints, tracks and routes to/from GPS. - - - -Preparing tracks, routes and waypoints for trips using maps from services such as OpenStreetMap (OSM). -The data is only needed to be uploaded to your GPS before you leave. -The maps together with your tracks, routes and waypoints can also be printed and used during the trip. - - - - -After trips, tracks and waypoints from GPS can be downloaded, stored, managed and reused in your (or your friends') later trips. - - - - -Analyzing Off Highway Vehicle (OHV) and hiking trips, understanding where you went and how far you were from something. - - - -Making waypoints, tracks and routes to follow to easily get someplace -you've never been before or don't have GPS data for but online -maps exist for it. - - - - -Making maps with using Mapnik. -Not on Windows at the moment. - - - - -Grouping data from multiple trips using a hierarchical data manager. - - - - -Analyzing speed at different places (to some degree), adding waypoints where you forgot to mark one but did slow down or stop. - - - - -Downloading and storing OpenStreetMap and/or other map types on your hard drive and looking at them later. - - - - -Editing routes or tracks and their trackpoints, joining and splitting up tracks and routes. - - - - -Show the live GPS position on the map (for use on a mobile device - e.g. a laptop). Not Windows at the moment. - - - - -Import and export track, route and waypoint files of various types via GPSBabel - - - -Previously on Windows, GPSBabel was distributed with &appname;, but this no longer the case. - - -It can be downloaded from its website . - - - - - -View, create and update Geotagged Images (using EXIF data). - - - - - -&appname; is under continual improvement: see the the Roadmap / Wishlist: - - -
-Screenshot: OSM Cycle Map and Many Tracks - - - -
- - - The Windows build of Viking does not currently support verification of https connections. - - -
- -
General Concepts -
Layers - -Layers is concept one may know from powerful graphics editors such as Photoshop or GIMP. -Instead of putting all the data on the same level, it is stacked (i.e. layered) with different data over one another. -This can be useful for analysis and general handling of various sets of data. - - -Unfortunately the downside of this complexity is remembering how differing layers of data can obscure other data. - - -The Map layers have Alpha Compositing, -to create the appearance of partial transparency. -By controlling this value one can see data below it in the layer heirarchy for interesting effects. - -
-
Layers Panel - -The panel on the left is called the layers panel. -It determines which layers and sublayers (such as tracks and waypoints) -are shown, and the order in which they are drawn. Layers on the -top of the layers panel list are drawn last. You can change the order by -drag and drop, or by selecting a layer and using the up and down -buttons at the bottom of the layers panel. - - - The panel also contains a calendar to show when Layers occurred. - Double clicking on the day will select and move the viewport display to that layer. - Right clicking brings up a menu from which you can select to go to the previous or next layer in time. - -
-
Viewport - -The main &appname; area where the layer data is drawn, is called the viewport. - -
-
Track Graphs - -Below the viewport can be shown track (and route) elevation/distance and time/speed (tracks only) graphs of the selected item. -These are the same graphs as shown in . -The graphs will automatically hide itself when nothing or no suitable item is selected. - - -Moving the mouse pointer over the graphs will show a tooltip readout of the nearest trackpoint. -Similarily to the track properties graphs, left clicking will center the viewport on the trackpoint. -A right click menu offers controls of the drawing options, a subset of track operations and access to further information dialogs. - -
-
Statusbar -This provides a readout of various information: - -The currently selected (mouse pointer) tool -The number of items to process in the background - normally this the number in the map tile download queue -The zoom factor -The location of the mouse pointer (and potentially height information if DEM data is available) - -When creating a track/route, the statusbar also displays some information about the track/route. -
-Statusbar - - - -
-This part of the statusbar displays: - -The total distance of the track/route (including currently edited segment). -The bearing of the currently edited segment. -The distance of the currently edited segment. - - -For convenience, a zoom selector can be opened from the status bar. Simply left-click on the zoom factor. -
- The zoom selector available from status bar - - - -
-
- -
Toolbar -The toolbar is an area for buttons that perform common actions. -Some actions are modal, so the appropriate layer needs selected before these toolbar buttons are enabled. See more detail. -The display of the toolbar is influenced by the -Right clicking on the toolbar and selecting Customize allows jumping to the directly. -
- -
Projections - -&appname; supports differents projections: - - -UTM - - -LatLon (also called EPSG:4326) - - -Mercator (also called Spherical Mercator) - - - -
- -
Map Cache - -&appname; stores downloaded map tiles to disk for a couple of reasons: - - -Enables off line usage -Reduces loading on the map tile provider - - -The &appname; automatic caching strategy is two fold: - - - - - If the age of the tile on disk is less than the specified tile age (see ), - it will not attempt to contact the server to get a new version of the tile. - - - - - When the tile age has expired &appname; will attempt a refresh update, so that it provides the cached tile generation timestamp so the server can determine if a new tile image needs to be returned. Not all map types support this refresh method. - - - - - You can override the caching scheme by using right-click on the Map on the layers panel and selecting Redownload All Onscreen Maps, or Ctrl+F5 for the top most map displayed. This will get the latest version held by the server. - - - - This can be useful if you contribute to OpenStreetMap and wish to see your modifications (of course give time for the server to have processed your changes - see I have made edits but they don't show up on the map) - - - - -The layout of the cache on disk itself can be controlled via a per Map Layer property. - -Viking - Legacy default in a private cache layout scheme -OSM - Newer available default (1.6+) - -This is to increase the compatibility between &appname; and similar applications that cache tiles on disk so that the tiles can be shared. - - - - - -
- -
Shortcut Keys - -&appname; has several shortcut keys or key combinations for commands as listed in the main window along side the command. - - -By default some function keys follow standard GUI behaviour: - - -F1 Help (view this manual) -F5 or Ctrl+R Refresh the maps on screen -F10 Select the Menubar (in built behaviour) -F11 Full Screen -Ctrl+F5 or Ctrl+Shift+R Redownload the maps on screen - - - -Refresh attempts to get new maps only if the local tile cache time period has expired for any particular map tile. -Redownload gets all on screen maps from the server, ignoring the local tile cache. - - - -Other function keys control turn on/off visibility of various elements: - - -F3 Toggle visibility of the Toolbar -F4 Toggle visibility of the Menubar -Shift+F5 Toggle visibility of the Scale indicator on the viewport -F6 Toggle visibility of the Center Crosshairs on the viewport -F7 Toggle showing selected items (e.g. tracks or waypoints) in the highlight colour in the viewport -Shift+F8 Toggle visibility of the calendar -Shift+F9 Toggle visibility of the Layers Panel buttons -F9 Toggle visibility of the Layers Panel -F12 Toggle visibility of the Statusbar -Shift+F12 Toggle visibility of the Track Graphs - - -Standard shortcuts are provided for normal GUI operations: such as creating new files, opening, saving and exitting. -Then there are shortcuts specific to &appname; to switch projection modes, zoom in/out, create layers,switch the active tool mode and move the map: - -Ctrl+Up Pan the viewport North -Ctrl+Right Pan the viewport East -Ctrl+Down Pan the viewport South -Ctrl+Left Pan the viewport West -Ctrl+Keypad+ Zoom In -Ctrl+Keypad- Zoom Out - -These work irrespective of the mode selected -For other combinations see the menu entry themselves. - -
- -
-Keyboard Configuration -Keyboard configuration is supported by the standard GTK+ way of changing shortcuts for menu entries. -Hover over the menu option with the mouse pointer and press the keyboard shortcut you want to bind it to. -To delete a keyboard assignment, press Backspace whilst over the menu entry. - - - If the keyboard shortcut is already in use you will not receive any notification that new action replaces the old action. - This is probably why most distributions have this facility disabled by default. - Thus you will need to enable Editable menu accelerators for your system. - Check the Desktop Menu and Toolbar Control or other User Interface preferences for this setting. - - - - - For Windows systems this can be done by adding the line gtk-can-change-accels=1 to %USERPROFILE%\.gtkrc-2.0 (create the file if it does not exist). - - -From &app; 1.6+ the keyboard configuration is automatically loaded and saved between sessions in the -
- -
Tracks vs Routes - -In theory a route is path you are planning to follow and a track is of where you have actually been. The GPX specification splits these into two separate categories, although tracks contain everything route may have. - - -Q. When planning a route what difference does it make if it's a route or a track? - - -A. One difference is in how a GPS device navigates following the route or track. -The capability, the options and data on a particular device also effect how the navigation is performed. -Often the how a device actually works doesn't seem to be formally documented by the manufacturer (and can be firmware dependent too). -Web searches can reveal people's experiences with specific devices on blogs and various forums. -For some devices it will attempt to navigate between route points, which may then suggest various roads and tracks between the points using an internal routing algorithm with some kind of transport profile. -However this is limited to the quality of data available and how well the profile matches ones actual need. -If the points are close enough then the 'best' route for any form of transport will typically be the straight line between the points. - - -There are often restrictions on the numbers of route (or track) points the GPS Device can handle - may be 250 or as little as 50. -This generally not a problem for shorter routes, but needs managing for longer or detailed routes. -The number of track points is normally alot higher (e.g. 500 or typically with latest devices 10,000 or more) and less of a problem. - - - See for helping to manage this. - -
- -
- -
File Types and the Main Window - - -&appname; has it's own file type traditionally marked by the .vik file extension. -This is a plain text file saving all information of the current window including the view location, zoom level, projection type and then all the layer information (aggregates, maps, tracks, waypoints, etc...). - - -Besides it's own file type, &appname; can open (and save to via export methods) GPX and KML file types. - - - -&appname; does not handle GPX 1.1 particularly well - it prefers GPX 1.0 - - - -By default &appname; opens a default blank window centered on the home location. This behaviour can be changed by the . -Each window contains menus, a toolbar, a viewport, layers panel and a statusbar. -Each section (apart from the viewport) can be hidden using the or from the -ViewShow choices. - - -One may consider each &appname; window to be a separate project - each with it's project Viking file. -However generally one window is enough for most purposes! - - -Several operations apply at the window level as follows next. -Also see for the operational modes that generally work in conjunction with a selected layer. - - -
New - -Located on the FileNew menu and on the toolbar New. - - -This creates a new window with the default settings. - -
- -
Open - -Located on the FileOpen menu and on the toolbar Open. - - -This opens a file chooser dialog to select one (or more) files of the supported GPS data file types: - -Viking -GPX -TCX -KML -JPG - - - -GPX, TCX, KML and JPG files will be loaded into the existing &appname; view. A Viking file will be given a new window if the current window is already assigned. - - - -&appname; handles more file types via the Acquire methods below. - - -
- -
Open Recent File - -Located on the FileOpen Recent File menu only. - - -The most recently opened files are available for opening again. -The number of files remembered is controlled by a value in the . - - -Note that files imported via the Acquire mechanism are not available in this list. - -
- -
Save - -Located on the FileSave menu and on the toolbar Save. - - -If the current opened file is Viking file, this save will simply update it. -If it is a new file or the file loaded was an external type (i.e. GPX or KML), then this will ask for a new name to save as a Viking file. - -
- -
Save As - -Located on the FileSave As menu only. - - -This will ask for a new name to save as a Viking file (even it was already a Viking file). - -
- -
Append File - -Located on the FileAppend File... menu only. - - -Selecting a Viking file from this method will join the file contents to the current window (instead of creating a new one). - - -GPX and KML files may also be appended, whereby the file contents are added to the currently selected or layer. Otherwise they are loaded in the normal file open method when no layer is selected. - -
- -
Open GPX as External Layer - -Located on the FileOpen GPX as External Layer... menu only. - - -Selecting a GPX file from this method will create an external Layer that loads from the specified file. -The layer is marked as a "no write" external layer, which means any changes made will not be written back to the GPX file. -To enable changes to be written, you can change the layer to a standard external layer in the layer properties dialog. -This is in contrast to importing the data and storing it in the Viking file. - -
- -
Properties - -Located on the FileProperties menu only. - - -Displays some simple properties about the loaded Viking project file (if any), such as full filename including the path, the filesize and the date/time of the file. - -
- -
Export All - -Located on the FileExport All menu only. -Choose either the GPX or KML option. - -This allows converting every layer from the existing project into files of the type choosen. -You will be prompted for a directory into which a new file for each layer will be saved. - - -The KML option uses GPSBabel and so will not be available if GPSBabel can not be detected. - - -Note that some data properties are not supported by the target export file type. Such as item visibility or track colours. - -
- -
Acquire - - -Available on the FileAcquire menu and from the layer menu. - - -If used from the File menu these methods place the results in a new TrackWaypoint layer. - - -If used from the layer menu these methods place the results in that TrackWaypoint layer. - - -
-From GPS - -FileAcquireFrom GPS -Probably the easiest way of getting information from a GPS Device. - - -Select the GPS Device communication settings and then hit OK. -See the Getting Started section for more info about the settings. - - - -Some GPS devices (such as the Garmin Nuvi 255) support a native file system and write information to a Current.gpx file or similar. You will have to browse the file system on the device and open it directly. - - -
- -
-Import File With GPSBabel - -FileAcquireImport File With GPSBabel - - -Other formats can be imported that are supported by GPSBabel. - - -You need to select the file and the type of the file that is going to be opened, -since there is no automatic detection of the file kind. - -
- -
-OSM Traces - -FileAcquireOSM Traces - - -See section for more information. - -
- -
-My OSM Traces - -FileAcquireMy OSM Traces - - -See section for more information. - -
- -
-From Geotagged Images - -FileAcquireFrom Geotagged Images -Enables automatic creation of waypoints from geotagged images. - - -This menu opens a dialog to select such image files. -If the image files have geotag information in them, then a layer with named waypoints positioned at the location of each image with a thumbnail of that image is created. - -
- -
-From Wikipedia Waypoints - -FileAcquireFrom Wikipedia Waypoints - - -This gets interesting points from Wikipedia for the specified view: either within the extent of layer bounds or within the current viewport boundary. - -
- -
-From Routing - -FileAcquireFrom Directions - - -This gets a route from given directions. - -
- -
-From URL - -FileAcquireFrom URL - - -This gets a file from the entered URL. -File formats that can be opened are those supported by GPSBabel. - - - -You need to select the type of the file that is going to be returned, since there is no automatic detection of the file kind. - - -
- -
-Import GeoJSON File - -FileAcquireImport GeoJSON File - - -This uses the program togpx to load .geojson files. -If the program is not detected on your system, then this option will not be available. -See here for the installation method. - - -Versions proir to 1.6.0 of GPSBabel did not support the GeoJSON file format. - -
- -
- -
Print - -Located on the FilePrint menu and on the toolbar Print. - - -Print uses what is displayed on the current map view for printing: i.e. what ever map, tracks and waypoints that are in view, including the -cross hairs and the scale. - - -It uses a standard system print dialog using an image the size of the current viewport in pixel terms. -On the Image Settings you can move the image around the page and scale the image up / or down. - -
- -
Generate Image File - -Located on the FileGenerate Image File menu only. - - -Allows generation of larger (pixel) area images than the standard Print method above. -From the generated image you can use the facilities of the Operating System to print the image -or perform other actions. - - -You should have previously downloaded the tile images for the chosen zoom level, -otherwise the image produced will have missing sections. - - - -Using large areas takes some time to process and due to the method used it may run out of memory to complete the operation. -Unfortunately under Windows systems it can not detect this failure and may crash the program. -So the maximum size is dependent on the capabilities of your system. -For instance the largest successful image generated on my (RN) Debian system is a pixel area of 20,000 x 20,000. - - -
- -
Generate Directory of Images - -Located on the FileGenerate Directory of Images menu only. - - - -This is only available in UTM mode. - - -
- -
KMZ Map File Overview - -A KMZ file is a compressed version of a KML file and associated supporting files. - - -A KMZ Map file is a KMZ file with an image overlay often for use as a Custom Map on Garmin GPSr devices. - - -&appname; only supports basic properties in KMZ Map files, primarily intended for use with Garmin GPSr devices although KMZ exports are known to be work with Google Earth. - -
- -
Import KMZ Map File - -Located on the File menu only. - - -Enables loading of a selected KMZ map file. -This generates a new map layer using the overlay image contained within the KMZ file. - -
- -
Generate KMZ Map File - -Located on the File menu only. - - -Enables exporting the current viewport as a KMZ map file. -The area and zoom level covered by the KMZ map can be adjusted before saving. - - -Note that Garmin GPSr devices have limits in using images if they are too large (e.g. over 3Mb big) in KMZ files. -&appname; does not enforce any limits on the KMZ files it generates. - -
- -
- -
Layers - - -Layers supported by &appname; are: - - - - - - - - - - - - - -For each layer there are a few standard options: - - -Properties - Layer setup / configuration settings -Cut -Copy -Paste -Delete -Visibility - This checkbox on the Layers Panel controls whether the layer is shown in the viewport or not - - -The cut/copy/paste options can be accessed in a variety of ways once the layer has been selected: - - -Standard keys: Ctrl+x|c|v -Main menu Edit -From the right click menu -Buttons at the bottom of the Layers Panel - - -Default values used for each layer's properties can be altered via the EditLayer Defaults menu options. - - -See the individual section for detail about each layer. - -
- -
TrackWaypoint Layer - -TrackWaypoint layers display GPS data (tracks, routes and waypoints). - -One way to create new waypoints is to copy a -latitude/longitude coordinate pair, such as the one shown on most -geocaches, and paste it into an active TrackWaypoint layer. &appname; can -automatically recognize several variations of the lat/lon format. - - -By right-clicking on tracks, routes or waypoints in the , you can access many commands on them. -You can easily find a specific track, route or waypoint by expanding the appropriate containing Tracks, Routes or Waypoints sublayer in the -layers panel to show all the individual items and then typing the name of the track, route or waypoint. - - - -The containing Tracks, Routes or Waypoints sublayers are only shown when items of that type exist. -To start creating them enter into a create mode via either the Create toolbar commands or the New menu commands. - - - -The new TrackWaypoint layer dialog allows the layer to be specified as external. -In this case the layer is exported as GPX to the file specified instead of stored in the Viking file itself. -It is also possible to specify the layer as "no write". -This means that &appname; does not write the layer to the GPX file specified; instead, &appname; only reads the file. -No-write layers are primarily intended to be used with the option in the File menu. - - - -External layers are loaded only when they are displayed or selected. -Hence, they will not appear in any summary statistics if they have not been loaded. -It is possible to load all external layers contained in an layer by selecting "Load External Layers" from the Aggregate Layer context menu. -Note, &appname; specific options may not be saved if not supported by the GPX export. - - - -The sublayers also offer right click menu options. -These are the same as those available at the TrackWaypoint level, but only those that relate to the sublayer type. - - - -By default routes are coloured red. Tracks are automatically assigned a spread of colours. - - - -Most operations available on tracks are available on routes, except for functionality that relies on having timestamps - since routes by definition have no timing information. Thus for example, uploading a route to OpenStreetMap Traces is not available nor is Geotagging on a route. -It is possible to convert between Tracks and Routes, although converting from a Track to a Route may involve a loss of information (hence you are required to confirm this operation before it happens). - - - -Also see for use in conjunction with this layer. - - -
Layer Operations - -The layer has a context menu with several operations. - - -
View Layer - -Version1.1+: This will automatically move the viewport and select the best zoom level to see the whole layer (i.e. all tracks, routes and waypoints). - -
- -
View - -
View All Tracks - -Version1.1+: This will automatically move the viewport and select the best zoom level to see the all the tracks in the layer (ignoring positions of any routes or waypoints). - -
- -
View All Routes - -Version1.4+: This will automatically move the viewport and select the best zoom level to see the all the routes in the layer (ignoring positions of any tracks or waypoints). - -
- -
View All Waypoints - -Version1.1+: This will automatically move the viewport and select the best zoom level to see the all the waypoints in the layer (ignoring positions of any tracks or routes). - -
- -
- -
Goto Center of Layer - -This will automatically move the viewport to see the whole layer (i.e. tracks, routes and waypoints). It does not adjust the zoom level. - -
- -
Goto Waypoint - -This opens a dialog box to enter a name of waypoint to search for. If it is found the viewport is centred on it. - - - -Note this search is not very clever and only finds exact matches. -You are probably better off expanding the waypoint list and directly start typing, as mentioned above, which finds a match based on each letter typed. - - -
- -
Export Layer - -The layer (all tracks, routes and waypoints) can be exported to following file formats: - - - - GPX - - - GPSPoint - - - GPSMapper - - - Google's KML - - - Any GPSBabel File Formats - - - GeoJSON. Via the program togeojson - This option will not be available if the program is not detected on your system. - See here for the installation method. - - - -Version1.1+: An individual track can be exported to a GPX file via the track menu. - -
- -
Finish Track or Route - -Selecting this option ends the creation of that individual track or route. - - - -This is only available when a track or route is being created by the or tools. - - -
- -
New -
New Waypoint - -This opens a dialog box to create a new waypoint. A default name will be suggested and the default position is the center of the viewport. - -
-
New Track - -This turns on the tool. - -
-
New Route - -This turns on the tool. - -
-
- -
Geotag Images - -This starts the Geotagging Images dialog against all tracks in the layer. -See Geotagging for further detail. - -
- -
Acquire - -This offers the same choice from methods as on the File menu. -However when invoked from here, the results will be stored in this layer (instead of creating a new one). - -
- -
Upload - -
Upload to GPS - -This opens a dialog to select the GPS Device and port to which the layer information will be transferred. - - -The types of GPS information (tracks, routes or waypoints) to be transferred can be selected. - - -Tracks, Routes or Waypoints that are invisible will not be transferred. - -
- -
Upload To OSM - -This opens a dialog to upload all tracks and waypoints to OpenStreetMap traces. -Useful if you are an OpenStreetMap contributor, access details are stored in &appname; - - - &appname; allows you to edit a track, e.g. remove duplicate points, perhaps remove track points leading to your home and then upload it to OpenStreetMap. - -
-
- -
Delete -Offers deletion of various parts of a TrackWaypoint layer: -
Delete All Tracks -Deletes all the tracks in this layer. -
-
Delete Tracks from Selection -Opens a dialog with list of all the tracks from this layer to choose the ones to delete. -
-
Delete All Routes -Deletes all the routes in this layer. -
-
Delete Routes from Selection -Opens a dialog with list of all the routes from this layer to choose the ones to delete. -
-
Delete All Waypoints -Deletes all the waypoints in this layer. -
-
Delete Waypoints from Selection -Opens a dialog with list of all the waypoints from this layer to choose the ones to delete. -
-
Delete Duplicate Waypoints - - Deletes duplicate waypoints in this layer. - Waypoints are considered duplicate if they have the same location and symbol. - - If other properties are different such as name, comment, altitude, etc... they will still be considered a duplicate. - - - -
-
- -
Filter -
Simplify All Tracks - -This opens dialog to request the number of points each track will be simplified using GPSBabel. The result is put into a new layer. The simplification method removes points considered to be in a 'near straight line', thus reducing the number of points and attempting to keep the most important turning points. - -
-
Compress Tracks - -Enables compression of tracks and routes via GPSBabel's Crosstrack simplify method. -It opens a dialog to request the Error factor value which is the maximum allowable error that may be introduced by removing a single point. -It is expressed a distance in units as specified by the distance option. -Thus a higher value will remove more points. -The result is put into a new layer. - -
-
Remove Duplicate Waypoints - -Remove Duplicate Waypoints - fairly self explainatory, with the results created in a new layer. - - - -However it only considers a precise position (waypoints only 1 metre away from each other are considered different) and also doesn't consider if the waypoints have different comments, symbols or images. - - -
-
- -
Filter With <emphasis>Trackname</emphasis> - -This runs GPSBabel on the layer using information from a previously selected track (select via the track menu "Use With Filter" option) with the following command types: - - -Waypoints Inside This -Waypoints Outside This - - -The result is generated in a new Track/Waypoint layer. - -
- -
Geotag Images - -This starts the Geotagging Images dialog using the specific track. -See Geotagging for further detail. - -
- -
List Tracks or Routes - -Opens a new dialog with the list. As described in the Aggregate layer - -
- -
List Waypoints - -Opens a new dialog with the list. As described in the Aggregate layer - -
- -
- -
Track and Route Sublayer Options -Repeats options available at the TrackWaypoint level, but only those for tracks and routes: - - -Finish Track or Route -Same as the layer Finish Track or Route - - -New Track or Route -Same as the layer New Track or New Route - - -View All Tracks or Routes -Same as the layer View All Tracks or View All Routes - - -Delete All Tracks or Routes -Same as the layer Delete All Tracks or Delete All Routes - - -Delete Tracks or Routes from Selection -Same as the layer Delete Tracks from Selection or Delete Routes from Selection - - -List Tracks or Routes -Opens a new dialog with the list. As described in the Aggregate layer - - -Also gives other options for handling multiple items: - - -Sort -Gives the ability to sort the items in the treeview alphabetically or by date. - - -Visibility -Offers options to quickly control the visibility of all items within the sublayer, as per - - -
- -
Track and Route Properties - -This shows several tabs for properties and useful statistics about a track or a route, including elevation-distance and speed-time graphs (if data is available). -Moving the mouse pointer over the graph displays values related to that point along the track. -You can click on these graphs to jump to the point in the track. -You can reverse it, delete duplicates, split at marked position or split a track from its component segments (discontinuous breaks in a track) into separate tracks. - - -For the elevation related graphs the Show DEM check button is only enabled if a suitable is available that overlaps the track. - - -Graphs either have a Show GPS Speed or Show Speed button. -Each of these overlays relative speed markers along the graph. -The difference between Speed vs GPS Speed is that GPS Speed is taken directly from a field reporting the speed value in the source data. -Typically speeds used in Viking are calculated between the points time and position differences. -This is due to the reporting of speed values in source data is not mandatory and often not present. - -
Track and Route Properties Tab - -
-Properties Tab: Example - - - -
-
-
-
Track and Route Statistics Tab - -
-Statistics Tab: Example - - - -
-
-
-
Track Elevation Graph - -
-Elevation Distance Tab: Example - - - -
-
- -The following colors are used in the elevation-distance graph: - - - -Main colour - this is dependent on your Desktop theme - often blue by default -elevation data in graph - - -Yellow - -no elevation data - - - -Green - -elevation data from DEM - - - -Red - -speed - - - -
- -
Track Time Splits - -
-Splits Tab: Example - - - -
-
- -This tab displays timing splits on tracks with timing information. -A few different values of split lengths are available, each having it's own tab display. - -
-
- -
Track and Route Operations - -
Finish Track - -Selecting this option ends the creation of the individual track. - - - -This is only available when a track is being created by the tool. - - -
- -
Goto - -This centers the viewport on the selected position on the track: - - -Startpoint -"Center" - the notional center from the bounds of the track -Endpoint -Version1.1+: Highest Altitude -Version1.1+: Lowest Altitude -Version1.1+: Maximum Speed (Not Available on Routes) -Version1.8+: Previous trackpoint -Version1.8+: Next trackpoint - -
- -
View - -Version1.1+: This centers the viewport on the track and selects the best zoom level to see it. - -
- -
Combine -
Merge By Time - -This operation repeatedly tries to merge the right-clicked track -with tracks in the same TrackWaypoint layer. The tracks which are -merged are those which have at least one trackpoint less than some -threshold time away. This way, if you somehow end up with lots of small -segments (say, caused by turning the GPS on and off) you can merge them -easily into one track. - - - -This is not available on routes as they have no timestamps. - - -
- -
Merge With Other Tracks - - This opens a dialog listing the other tracks in the same TrackWaypoint layer, from which one can select the other tracks to merge with. - Tracks are merged in order of time. - -
- -
Merge Segments - -Combines track segments. Effectively removing track segment markers to leave one segment for the whole track. - -
- -
Append Track or Route - -Enable joining of a single track to the end of the current track. -This opens a dialog listing the other tracks in the same TrackWaypoint layer from which one can make the selection. - -
-
- -
Split -
Split By Time - -This operation will split a single track into segments wherever the -time interval between successive trackpoints is larger than some -threshold. This is useful when processing raw NMEA GPS data, especially -taken over a long time. - - - -This is not available on routes as they have no timestamps. - - -
- -
Split By Number of Points - -Version1.2+: This operation will split a single track into segments by the number of points specified. -This can be useful with devices which may have limits on the number of points it supports. - -
- -
Split Segments - -Splits track segments into new tracks. - - - -This is not available on routes as they do not have route segments. - - -
- -
Split at Trackpoint - -Splits the track at the currently selected trackpoint. - - -The current track will finish at this trackpoint. -A new track will start from a copy of this trackpoint. - - - -This is only enabled when a trackpoint is selected. - - -
-
- -
Insert Points - - -These options are only enabled when a trackpoint is selected. - - -
Insert Point Before Selected Point - -Inserts a track point halfway between the previous track point and the current track point. -All track point properties are interpolated between the two points. - -
-
Insert Point After Selected Point - -Inserts a track point halfway between the current track point and the next track point. -All track point properties are interpolated between the two points. - -
-
- -
Delete Points -
Delete Selected Point - -Deletes the currently selected track point. - - - -This is only enabled when a trackpoint is selected. - - -
-
Delete Points With the Same Position - -Deletes subsequent points that have the same position (but have different timestamps). - -
-
Delete Points With the Same Time - -Deletes subsequent points that have the same time stamp (but may have different positions). - - - -This is not available on routes as they have no timestamps. - - -
- -
- -
Transform - -These options alter the data of trackpoints of a track but not add or remove trackpoints. -And don't seem to fit any other category :) - -
Apply DEM data - -If any DEM data is loaded, this will apply the DEM data to give the track elevation data. -Two ways of applying DEM data are offered: - -Keep. Retains the existing elevation data of trackpoints and only those missing an elevation value are set. -Overwrite. Elevation data are set on all trackpoints even if they already elevation values. - - -
-
Smooth Missing Elevation data - -In various locations across the world, there are missing DEM values (AKA DEM Holes) from the SRTM data. -This is particularly noticeable in mountainous areas. -Two ways of applying elevation data to trackpoints that do not have elevation values are offered: - -Interpolated. Missing elevation data is interpolated between the previous and next known values. -Flat. Elevation data is filled in from the last previously known value. - - -
-
-Convert to Track or Route - -If this is a Route then it will convert it to a Track. - - -If this is Track then convert it to a Route. - - - -Converting from a Track to a Route may involve a loss of information, in particular timestamp values (hence you are required to confirm this operation before it happens). - - -
-
-Anonymize Times - -Timestamp information of a track can be shifted to be all offset from 1901-01-01. - - -Thus the timestamps themselves will no longer reveal exactly when a track was taken. -However the relative difference between the timestamps is kept thus one is still able to calculate some properties such as speeds along the track. - - - -This is not available for routes, as they have no timestamps. - - -
-
-Interpolate Times - -Trackpoint timestamps between the first and last points are calculated such that track is travelled at equal speed. -This is mostly useful when tracks don't have timestamps and you wish to recreate your trip (e.g. you've forgotten to turn on your GPS or the batteries have run out) -Thus edit the first and last trackpoints to set the approximate times of your trip and then use this to give approximate times along the track. -When used on tracks with timestamps this will overwrite the existing timestamps. - - - -This is not available for routes, as they have no timestamps. - - -
-
- -
Export Track as GPX - -Version1.1+: This allows exporting the track as a GPX file by opening a file save dialog. - -
- -
Extend Track End - -Changes the current tool to add trackpoints to the end of the track. - -
- -
Extend Using Route Finder - -Enables the Route Finder tool. Thus on a subsequent left click in the viewport, a route is calculated from the end of track to that point using the default route service and applied to the track. - -
- -
Upload - -
Upload to GPS - -Same as the layer Upload to GPS command, but only applies to the track. - -
- -
Upload to OSM - -Same as the layer Upload to OSM command, but only applies to the track. - -
- -
- -
Use With Filter - -This selects the track to be used in the Filter With Trackname feature. - - - -This is not available on routes. - - -
- -
Edit Trackpoint - -This opens the Trackpoint edit dialog. See . - - - -This is only enabled when a trackpoint is selected. - - -
- -
Refine Route... - -This function allows to request a Routing Engine in order to refine a given route. -By "refining" we mean computing all real intermediates points between some given major points. -This could be useful to compute a trip giving only the wished important steps. - - - -This is only available on routes. - - -
- -
View Google Directions - -This option is only available on a track created using the Route Finder tool. - - -Launch a web browser to see the Google directions page which yielded the route. - - - -The record of the Google route is stored in the track's comment, so if the comment is changed (or the route was created by something other than the Route Finder tool) this will not work correctly. - - -
- -
- -
Waypoint Sublayer Options -Repeats options available at the TrackWaypoint level, but only those for waypoints: - - -New Waypoint -Same as the layer New Waypoint - - -View All Waypoints -Same as the layer View All Waypoints - - -Goto Waypoint -Same as the layer Goto Waypoint - - -Delete All Waypoints -Same as the layer Delete All Waypoints - - -Delete Waypoints from Selection -Same as the layer Delete Waypoints from Selection - - -Delete Duplicate Waypoints -Same as the layer Delete Duplicate Waypoints - - -List Waypoints -Opens a new dialog with the list. As described in the Aggregate layer - - -Also gives other options for handling multiple items: - - -Sort -Gives the ability to sort the items in the treeview alphabetically or by date. - - -Visibility -Offers options to quickly control the visibility of all items within the sublayer, as per - - -
- -
Waypoint Properties - - -This shows a dialog with detailed information for the waypoint. Many properties of the waypoint can changed here, such as the comment, the symbol used in drawing or the image (normally a photograph taken at this position) assiocated with it. When a waypoint has an image, a thumbnail of it is drawn in the viewport for the waypoint (in preference to the symbol). - - -If the waypoint has an associated image, then the Geotag information may be updated, either with updating the file's modification timestamp or not. -This can be useful when the waypoint has been moved. - - -
- -
Waypoint Operations - -
Goto - -This centers the viewport on the selected waypoint. - -
- -
Geotag Images... - -This opens the Geotag Dialog to allow Geotagging multiple images to the position of this waypoint. -In this circumstance creation of waypoint options are disabled and only the options related to writing the EXIF information are available. - -
- -
Transform - -Offers a subset of the track utilities. -Currently only setting the altitude from DEM data methods are available. - -
- -
Visit Webpage - -If the waypoint's comment (or description) starts with http: then this option is available and allows launching a web browser to go to the webpage. - -
- -
Visit Geocache Webpage - -If the waypoint's name is in Geocache form (GCXXXXX) then this option is available and allows launching a web browser to go to the Geocache page. - -
- -
New Waypoint - -Same as the layer New Waypoint. - -
- -
- -
Version1.3+: Geotag Images - -This dialog allows geotagging images (normally taken with a digital camera) against a specific waypoint or via interpolation against a specific track or all tracks in the TrackWaypoint layer - depending on how it is invoked. - - -When geotagging against tracks, images need to have an EXIF DATE_TIME_ORIGINAL (nearly always set by a camera). This timestamp is then used to find the location when the image(s) was taken by searching through the track(s) to find the nearest time - interpolating between points if necessary to set the location. - - - -Generally it is good policy to synchronize your camera's clock with your GPS clock before taking photographs. However the times can be adjusted afterwards (if necessary) to take into consideration clock differences. - - - -Various options allow control of how the geotagging process is performed: - - -Images - Add the images used for geotagging -Create Waypoints -Overwrite Existing Waypoints -Write EXIF -Overwrite Existing GPS Information -Keep File Modification Timestamp -Automatic Image Direction - Assumes the direction will be in line with the track heading -Interpolate Between Track Segments -Image Time Offset - The number of seconds to ADD to the photos time to make it match the GPS data. Calculate this with (GPS - Photo). Can be negative or positive. Useful to adjust times when a camera's timestamp was incorrect. -Image Time is Local - Are the timestamps in the image local time or otherwise in UTC. -Image Timezone - The timezone adjustment factor. - - -Typically timestamps in images are either in local time or UTC but there is no way of automatically knowing which; so you need to specify which is the case. -Image Time Offset is best used for accounting for camera's clock drift, so normally of the order of a few seconds or minutes. -Whereas Image Timezone is more for adjusting for a camera's timezone difference, or perhaps differences in your current timezone and the timezone the images where taken. - -
- -
- -
GPS Layer - -The GPS layer is responsible for uploading and downloading GPS data -from a GPS device. It also is responsible for realtime GPS tracking. -Expand the GPS layer in the layers panel to see the two layers it -uses for uploading and downloading. To upload, download, or use -realtime tracking, right-click the GPS layer and click the appropiate -menu item. - - -
Download - -To download data from the GPS, right-click the GPS layer and click Download from GPS. - -
- -
Upload - -To upload data to the GPS, first populate the GPS Upload child -layer of the GPS layer (either by creating waypoints/tracks/routes in it, or -copying and pasting or dragging waypoints/tracks/routes from another layer). -Then right-click the GPS layer and click Upload to GPS. - -
- -
Realtime Tracking - -You must set up gpsd correctly or use a GPSD server and put the -correct information in the GPS layer properties dialog. Then right-click -the layer and select Start Realtime Tracking. - -
- -
Empty <emphasis>Item</emphasis> - -There are several options to quickly delete a subsection of data: - - -Empty Realtime -Empty Upload -Empty Download -Empty All - -
- -
- -
DEM (Digital Elevation Model) Layer - -This layer provides elevation data from the Shuttle Radar Topography Mission (SRTM) - - -Elevation data can be useful in planning trips, as you many wish to avoid/minimise the hills encountered. [OSM Cyclemap is also useful this way too] - - -To download the data use the tool (shown on the toolbar), and then click on a area of the viewport. Once files have been downloaded they can then be loaded from disk via the DEM properties in future application runs. - - -The current data server is: NASA STRM 2.1. - - -ATM &appname; does not auto download DEM data. If you want to get lots of data blocks, you may wish to use some other program get such as curl or wget to download them for an area. - - - -Using many DEMs is CPU/memory intensive. Depending on your computer's capability, &appname; will be less responsive when about 50+ DEM blocks are loaded. It is probably unwise to attempt using 200+ blocks, so trying to use DEMs covering large countries/continents (USA, Australia etc...) is unlikely to work. In these conditions under Linux, &appname; may be automatically stopped by the "OOM Killer" - - - -
- - -
Maps Layer - -This layer provides a single map resource, you may have multiple map layers but only top one (if enabled) will be visible (subject to the Alpha compositing property). - - -Some maps are continually improving over time (e.g. OpenStreetMap) thus &appname; employs a caching mechanism to avoid redownloading data (see ). -However a forced refresh for the current view can be made via the Reload All Onscreen Maps option or Ctrl+F5. - - - -Also see tool for use in conjunction with this layer. - - -Online Map Tile Providers - -You will need an open internet connection when you are downloading maps these following map types, but once downloaded they are available from the hard disk cache. When map are avaliable from the disk cache it is much faster and can be used offline. -Inbuilt maps include various OpenStreetMap (OSM) ones and more: - - - -Bing Aerial Maps (&appname; Version1.2+) -Mapbox Outdoors - This is the default (&appname; Version1.7+) -OpenStreetMap (Mapnik) -OpenStreetMap (Cycle) -OpenStreetMap (Transport) (&appname; Version1.3+) -OpenStreetMap (Humanitarian) (&appname; Version1.5+) -NASA BlueMarble - - - -&appname; can be configured to handle additional online map resources. See for further detail. - - -Offline Map Tilesets - -Some map types supported are for on disk tile formats: - - - - - On Disk OSM Tile Format - This is equivalent to any map set with OSM Cache Layput. - -MBTiles File - - OSM Metatiles - - This file format is mostly aimed at being rendering cache feature and is Endian dependent. - Thus to successfully view the file cache, the Metatile files and Viking must be of the same endian type (which they probably will be). - - - - -Of course you need to have acquired or generated these tilesets yourself. - - -
Map Layer Properties - -Configurable properties: - - - -Map Type - - The kind of map this layer displays. - Map types are dependent on the current mode. - - - -Maps Directory -Not applicable for MBTiles Map type since it is a single file. - - -Cache Layout -Viking or OSM. See . Only applies to maps from online tile providers. - - -Map File -Ony applicable for MBTiles Map type since it is a single file. - - -Alpha - - Control the Alpha value for transparency effect using a value between 0 and 255 with the default being 255 for a fully solid image. - Zero is fully transparent. A value of around 160 can be useful for blending views of multiple map layers (when applied to the upper most map layer). - - - -Autodownload Maps -This can be useful to turn off when you are not online to avoid pointless download requests or may be keep a map in a 'historical' state. -e.g. perhaps in case a current map rendering is broken. - - -Autodownload Only Gets Missing Maps -Using this option avoids attempting to update already acquired tiles. -This can be useful if you want to restrict the network usage, without having to resort to manual control. Only applies when Autodownload Maps is on. - - -Zoom Level -Determines the method of displaying map tiles for the current zoom level. -Viking Zoom Level uses the best matching level, otherwise setting a fixed value will always use map tiles of the specified value regardless of the actual zoom level. - - -
- - -
Layer Operations -
Download Missing Onscreen Maps - -This requests map tiles for areas of the viewport that do not currently have one. - -
- -
Download New Onscreen Maps - -This requests map tiles only if the maps are older than the Tile Age preference. - -
- -
Reload All Onscreen Maps - -Force a refresh of all visible map tiles. - -
- -
Download Maps in Zoom Levels - -This opens a dialog to enable requesting the download of maps for the region in the viewport over a specified number of zoom levels. -The download method type can be specified to help limit the number of requests. - - - -There are some inbuilt limits to prevent downloading large amounts of map tiles. - - -Please respect the usage policy of the tile set provider. -Such as OSM Tile Usage Policy. - - - -
-Maps Download Dialog: Example - - - -
-
-
-
- - -
- -
Aggregate Layer - -This layer is a container layer to hold other layers. There is always an initial and controlling Top Layer that can not be removed or renamed. - - -This layer type is useful for grouping other layers, especially layers, in whatever categories are relevant to you: such as by activity, location or date. -Here are some suggestions: - -Hiking -Mountain Biking -Road Cycling -Car Trips -Sailing -Holidays -UK Points of Interest -USA Points of Interest -etc... - - - -Thus one can have a list of all your tracks, but groups can be shown or not using the relevant layers visibility checkbox. - - - -Tracks Area Coverage (TAC) is a feature to highlight areas with track coverage. -It is based on OpenStreetMap style tiles - as an approximation to a grid square system. -The size of the area can be changed, which is linked to the OSM Zoom level, -such that a higher Zoom level gives a smaller physical area and so more tiles. -This can be used for general curiousity or perhaps to plan routes to visit areas previously unexplored. - - -The calculations are performed in the background when deemed necessary (e.g. loading in a new file) and can also be manually requested. - - -Note that Viking can be slow in drawing hundreds or more tracks but this analysis is relatively quick and the resulting drawing is much faster. -Thus ATM is it recommended to turn off the visibility of the tracks themselves for this type of usage. - - - -
-Tracks Area Coverage: Example - - - -
-
- -
Layer Properties: Tracks Area Coverage -Offers basic controls whether it is enabled or not and includes the size of the tile. -
- -
Layer Properties: TAC Advanced -Controls subsets of TAC drawing are calculated and shown with their colour and opacity. -Note for Max square coverage, ATM it will only draw the first square encountered, although there may be more than one such area. -Note for Cluster coverage, ATM it will only draw the first cluster encountered, although there may be more than one such area. -
- -
Layer Operations - -The following are available on Aggregate Layers: - - -
New Layer - -Add a new layer of the selected type. - -
- -
Sort - -The list within the treeview can be sorted. - - -Alphabetical and Date sorts are available. - - - -Generally it is not useful to sort the Top most layer. Sort is mainly intended for Aggregate groups of TrackWaypoint layers. - - -
- -
Track List - -Selecting this opens a dialog listing all the tracks in a table along side statistics such as track length and maximum speed. -Each column header is clickable and will reorder the list according to that particular column. -You can also rearrange the columns via dragging the column header to the new location. - - -This table may be invoked from a variety of different layer levels and will then list only the relevant tracks (and/or routes). - - -Aggregate Layer -Lists Tracks and Routes and the TrackWaypoint Layer they are in - - -TrackWaypoint Layer -Lists Tracks and Routes - - -TrackWaypoint Track sublayer -Lists Tracks only - - -TrackWaypoint Route sublayer -Lists Routes only - - - - -
-Track List Dialog: Example -
- -This is showing all tracks and routes (although there are no actual routes here!) in multiple TrackWaypoint layers, that has been sorted by height. -Note that routes will not have timestamps or speeds, but may have elevations and should have some distance! - -
- - - -
-
- -Hovering the mouse over an entry will show a tooltip of the comment or description if it is available. - - -Each entry in the track list can be selected and on mouse right click offers these options: - - -View -Move the viewport to the area of the item and highlight it. - - -Statistics -Opens the Properties dialog on the tab. Note this will close the track list dialog. - - -Copy Data -Copy the data fields as text. - - - - -If multiple entries are selected the only right click option is Copy Data. -This copies the individual data fields as plain text separated by tab characters, ideal for pasting into other applications in particular spreadsheet programs. -Note that the order of the fields copied is the default column ordering (irrespective to how they may have been rearranged). - -
- -
Waypoint List - -Selecting this opens a dialog listing all the waypoints to give a overview of the waypoint information. -Each column header is clickable and will reorder the list according to that particular column. -You can also rearrange the columns via dragging the column header to the new location. - - -This table may be invoked from a variety of different layer levels and will then list only the relevant waypoints. - - -Aggregate Layer -Lists Waypoints and the TrackWaypoint Layer they are in - - -TrackWaypoint Layer -Lists Waypoints - - -TrackWaypoint Waypoint sublayer -Lists Waypoints - - - - -
-Waypoint List Dialog: Example -
- -This was invoked on a TrackWaypoint layer and shows all waypoints from that single layer. It has been sorted by the symbols. - -
- - - -
-
- -Hovering the mouse over an entry will show a tooltip of the description if it is available. - - -Each entry in the list can be selected and on mouse right click offers these options: - - -View -Move the viewport to the area of the item and highlight it. - - -Properties -This will open the properties dialog. Note this will close the waypoint list dialog. - - -Show Picture -If enabled, this will open the associated image in an external Image Viewer program. - - -Copy Data -Copy the data fields as text. - - - - -If multiple entries are selected the only right click option is Copy Data. -This copies the individual data fields as plain text separated by tab characters, ideal for pasting into other applications in particular spreadsheet programs. -Note that the order of the fields copied is the default column ordering (irrespective to how they may have been rearranged). - -
- -
Visibility Options - -This offers a quick way to set all the visibilities of each item within the containing layer, rather than having to change each one individually. - - -Show All -Ensures all items are set to be visible. - - -Hide All -Ensures all items are set to be invisible. This is useful for then turning on single items afterwards so the display is not cluttered. - - -Toggle -Inverts the visibility status of each item. - - - -
- -
Search by Date - -This opens calendar dialog to select a date to search by within this Aggregate layer. -The first item that is found on that date will be selected. -Tracks are searched first in preference over waypoints. - -
- -
Statistics - -This opens a dialog to display various statistics about all tracks contained within this Aggregate layer. - -
-Statistics Dialog: Totals - - - -
- - - This currently generates a simplified Eddington number. - In that a per track length value is used, rather than trying to work out a length per day. - (i.e. doesn't combine multiple tracks for a single day or split very long tracks into days). - The Eddington number is in the current Unit distance . - - -
-Statistics Dialog: Years - - - -
-
- -
Append File - -This opens a dialog to select files to load within this Aggregate layer. - -
- -
Tracks Area Coverage->Calculate - -Start a new Tracks Area Coverage calculation. - -
- -
Tracks Area Coverage->Remove - -This clears the Tracks Area Coverage information, thus no grid colouring will be displayed. - -
- -
-
- - - - - - - -
Coordinate Layer - -This layer is allows drawing of grid lines on the viewport. - -
- - -
Tools - -&appname;'s mouse actions on the viewport are controlled by which tool is active. Only one tool can be active at a time. The default mode is pan. You can return to the default mode by pressing Escape. - - -You can use the scroll wheel, the middle-click, the middle-click+drag to zoom, center map at position and pan respectively no matter what tool you are using. - - -Scroll: zoom in and out keeping the mouse over same location - - -Ctrl-scroll: pan north-south (also Ctrl-up, Ctrl-down) - - -Shift-scroll: pan east-west (also Ctrl-left, Ctrl-right) - - -Ctrl-shift-scroll: zoom in and out, without changing the center (also Ctrl+, Ctrl- [*not* KeyPad +/-]) - - -Middle-click: make the clicked point on the map the center - - -Middle-click and drag: pan - - -
Pan - -This is the default mode of operation for &appname;. - - -This mode is entered by clicking on the toolbar icon: - - -Pan moves the viewpoint. A single click centers the viewport at that point, whereas click and drag dynamically moves the view around. -This is the default tool. - - -This mode can also be entered by the keyboard shortcut Ctrl+Shift+P - - -Double clicking the left mouse button will zoom the map in. -Shift + double clicking the left mouse button will zoom the map out. -Double clicking the right mouse button will also zoom the map out. - -
- -
Zoom - -This mode is entered by clicking on the toolbar icon: - - -Zooms in and out on the clicked part of the map or by the selected area. - - -This mode can also be entered by the keyboard shortcut Ctrl+Shift+Z - - -Ctrl + left or right click: Zoom in/out and center the map on the clicked location - - -Shift (and hold) + left mouse button: Draws a bounding box area on which to zoom in. The zoom action is performed when the left mouse button is released. - - -Shift + left click button: Jump Zoom In by up to factor of 3 standard zooms. - - -Shift + right click button: Jump Zoom Out by up to factor of 3 standard zooms. - -
- -
Ruler - -This mode is entered by clicking on the toolbar icon: - - -The ruler is used to measure either: - - - -The bearing and distance between two points: Click on first point and then move the mouse point around - the values will be continually updated. -A second click will freeze the ruler at that point. - - - -An area: Shift (and hold) + left mouse button: Draws a bounding box area. Area values are shown in the statusbar and on the viewport. -Releasing the mouse button will freeze the area at that point. -The viewport label option is controlled by . - - - - -This mode can also be entered by the keyboard shortcut Ctrl+Shift+U - -
- -
Version1.1+: Select - -This mode is entered by clicking on the toolbar icon: - - -The select tool allows one to choose any waypoint or track by clicking on it (or reasonably near) in the viewpoint. - - -ATM to select a track one must actually click on a trackpoint, which is also selected. - - -This mode can also be entered by the keyboard shortcut Ctrl+Shift+S - -
- -
TrackWaypoint Layer Tools - -You must have a Layer selected to use these tools. - -
Create Waypoint - -Enable this tool by clicking on the toolbar icon: - - -Left click will open the new waypoint dialog using the specified position. - -
- -
Create/Edit Track - -Enable this tool by clicking on the toolbar icon: - - -General track edit/create tool. -The first left-click will create a new track and you will be asked to enter a name for the track. -If Shift is held, a track will be continued from a nearby trackpoint. -Subsequent left-clicks will add new trackpoints. -If Shift is held, the track will be joined to an existing track at the point selected. -If Ctrl is held, it will jump the new trackpoint position to a nearby existing trackpoint. - - -Right click or Backspace: undo one point. - - - - - -Double click or Escape: to finish track creation. -Finishing the track is also available via the right click and track menus. - - -One must finish the current track to be able to create another track. - - -Keypad Add or ]: Insert point after current point. - - -Keypad Minus or [: Insert point before current point. - - -Left: Select the previous point. - - -Right: Select the next point. - -
- -
Edit Route - -Enable this tool by clicking on the toolbar icon: - - -This operates in exactly the same way as the Edit Track above. - - -One must finish the current route to be able to create another route. - - -One can switch between the Edit Route and Route Finder tools while editing routes. - -
- -
Create Route Using the Route Finder - -Enable this tool by clicking on the toolbar icon: - - -Requires an internet connection. -Left click to create a new trackpoint. -If it's the initial trackpoint you will be asked to enter a name for the route, otherwise the default routing engine will be queried to find a route to the new trackpoint. -Right click or Backspace: remove the last added route. - - -Escape: to finish route creation. -Finishing the track is also available via the right click and track menus. - - -One must finish the current route to be able to create another route. - - -One can switch between the Edit Route and Route Finder tools while editing routes. - -
- -
Track Splitter - -Enable this tool by clicking on the toolbar icon: - - -Use this tool to split a track or route. -After enabling the tool, click on the track/route point of the track/route at the position where you want the split to occur. - -
- -
Edit Waypoint - -Enable this tool by clicking on the toolbar icon: - - -Left Click/drag: select/move a waypoint. -If Ctrl is held at the same time, it will jump the waypoint position to a nearby existing trackpoint. -If Shift is held at the same time, it will jump the waypoint position to a nearby existing waypoint. - -Right-click on waypoint: opens a menu with waypoint actions (the -same menu accessed by right-clicking the waypoint in the layers panel) - -
- -
Edit Trackpoint - -Enable this tool by clicking on the toolbar icon: - - -Left click near a trackpoint (in screen pixel terms) to bring up the Track Point Edit dialog on that trackpoint. -Whilst the edit dialog is already open, left click again and drag enables moving of the trackpoint. -If Ctrl is held at the same time, it will jump the new trackpoint position to a nearby existing trackpoint. - -
Edit Trackpoint Dialog - -Editing options in the Trackpoint Edit dialog include: - -Edit the trackpoint name -Changing raw lat/long position and altitude -Forward (go to the next trackpoint) -Back (go to the previous trackpoint) -Delete -Insert. Inserts a point halfway to next trackpoint -Split. - - - -Several fields are read only for reference purposes, values are shown if the trackpoint has such information: - -Time. -Speed and course. -'Between' values: Speed, Time Difference and Distance Difference. When moving between trackpoints (via the Back and Forward buttons) these values are calculated. -GPS precision factors. - - - -
-Trackpoint Edit Dialog: Example - - - -
-One must have been going downhill here to get a reasonable speed by bicycle! -
-
-
- -
Show Picture - -Enable this tool by clicking on the toolbar icon: - - -Opens an image viewer with the picture associated with the waypoint. -By default this uses the default system image viewer. -For Linux you can override this with the setting in the - -
- -
- -
Georef Map Layer Tools - -You must have a Map Layer selected to use these tools. - -
Georef zoom - -Enable this tool by clicking on the toolbar icon: - -Changes the zoom level of the georeferenced map and changes the -&appname; zoom level accordingly. Useful if you are trying to match GPS -data to a georeferenced map. - -
- -
Georef move - -Enable this tool by clicking on the toolbar icon: - - -Drag to move the georeferenced map. - -
-
- -
Map Download - -You must have a Layer selected to use this. - - -Enable this tool by clicking on the toolbar icon: - - -Click to download a single tile. Drag to download tiles in the dragged rectangle area. - - -Right-click to redownload tiles via the selected method. Right-click and drag to redownload tiles in the dragged rectangle area by the selected method. -The possible methods to redownload one or more tiles are: - - - - -Bad -Only if the tile is corrupt in some way or missing, then this will download a new copy - - -New -Refresh the tile according to the local map cache and if server has a newer version - - -All -Redownload the tile - - - -Map Tile Information - -By right clicking on viewport and selecting Show Tile Information you can see the tile properties of this location for the current map layer and current zoom level. -This includes the remote source URL for the tile and the cached version on the local filesystem with timestamp details. - - - -
-Map Tile Info Dialog: Example - - - -
-This is using MapQuest at &appname; zoom level 128 over the Isle of Wight, UK. -
-
- -
DEM Download - -You must have a Layer selected to use this. - - -Enable this tool by clicking on the toolbar icon: - - -Click to download and import a DEM file. - -DEM File Information - -By right clicking on viewport and selecting Show DEM File Infomation you can see the file properties of the DEM file for this location. -This includes the remote source URL for the file and the cached version on the local filesystem with timestamp details. - - - -
-DEM File Info Dialog: Example - - - -
-This is for block 51N, 003W - covering Bristol in the UK. -
-
- -
Webtools - -Many services are available only via a web browser (Google Maps, OpenStreetMap Potlach editor, etc.). - - -Jumping from &app; to such service can become annoying. - - -&appname; allows you to open such service directly at the position currently viewed in &app;. - - -This feature is called Webtools. It is also known as External Tools. - -
- -
- - -
Preferences -
General -
Localisation -You can select units displayed by &appname; to best fit your usage. -
-Properties dialog: units part - - - -
-Concerning degrees, you can select the way to display them: - - -DDDdecimal degree - - -DMMpartial sexagesimal display: degrees, minutes and decimal part of minutes - - -DMSsexagesimal display: degrees, minutes and seconds - - - -
-Properties dialog: degree display options - - - -
-
-
Waypoint Icon Size -An option exists to control the icon (symbol) size used for waypoints - -
-
<emphasis>Home</emphasis> Default Location: Latitude and Longitude -You can set the Home location directly by inputting the latitude and longitude in decimal degrees. - -
-
Time Display -This controls the reference timezone that times are shown in. -Locale is the current user's system preference. This was how all times were shown up to version 1.5. -World will attempt to determine the timezone at an object's position. -UTC enforces this standard timezone. -
-
Tile's age -This age is used to decided wether or not a new request to tile server must be done. - -Changing this value, you will increase or decrese the network load. -
-
Default map layer directory -This property sets the default directory of the tiles cache. -This value is used when you create a new map layer. - -You are still able to change this value in each map layer properties. -
-
Map Cache Memory Size -This controls the amount of maps that are stored in memory, rather than having to reread from disk. -Generally if you have a system with lots of memory it's recommended to increase this value. - -
-
- -
Export/External -
KML Export Units -Allows setting the units used when saved as the KML file type, such as Metric or Statue units -
-
GPX Track Order - - Other software may display tracks in a particular order (often the order saved into the file). - This allows you to control the order they are saved when exporting to a GPX file. - -
-
GPX Waypoint Symbols -Some GPS devices require waypoint symbols to be in a particular case. -E.g. On a Garmin Oregon 450 they must be in Title Case to be recognized. -
-
Image Viewer (Not Windows) -Allows setting the program used to view images associated with Waypoints. -By default this is set to xdg-open which should open the system's default image viewer, however this can be overridden with this setting. -Note: for Windows systems, viewing images associated with Waypoints always uses the system's default image viewer. -
-
External GPX programs -Allows setting the programs invoked via the Layer menu Export LayerOpen With 'program' -Two options are given so that it can be configured for various uses such as: - -An OSM editor (default) -Some other user defined program - -
-
GPSBabel -This allows setting the specific location of GPSBabel. -&appname; will need to be restarted for this setting to take effect. -
-
Auto Read World Files -If this is on, when a new image is selected for the GeoRef layer then the associated world file will be read to find the scale and positional properties. -The associated file is based on filename patterns; e.g. if the image is filename.jpg - then the world file may be filename.jpgw or filename.jgw -
-
Auto Device GPX Simplify -If this is on, GPX files will be simplified (using GPSBabel) if they are saved into a special location (by default a Garmin device location in OS file system). -Extra parameters used in process such as the location and limits applied can be refined by export_device_* values in . -A warning message is displayed when this occurs so one can consider if manually managing the tracks is needed, e.g. see methods. -The main intention for this is to prevent writing GPX files that are only partially useful. -For instance on a GPS Etrex 20 device: if a track with 1000 points is saved to it, the device will only read in the first 500 points, -thus effectively making only 1/2 of the track available. -Hopefully a simplified track will be more useful to follow to your destination when one is out in the wilds, than only a section of it. - -You will need to set the appropriate limits for your device, as this is not currently auto detected. -
-
- -
Advanced -
Save File Reference Mode - - Files referenced within project files can be saved with either absolute or relative paths. - Using relative paths can be useful when copying the project file and the associated files between different systems. - -
-
Ask for Name before Track Creation -A setting to control whether an automatic name is used when creating a new track or route, or whether you are asked to enter a name. -
-
Show Tooltip during Track Creation -A setting to control whether the tooltip with the cumulative track or route distance is shown when creating tracks and routes. -
-
The number of recent files - - The number of recent files shown in the FileOpen Recent File menu. - A value of -1 means all files. The new value applies to New Windows only (or on application restart). - -
Open files in selected layer -A setting to control whether non Viking format files (i.e. typically GPX or KML files) will open in the selected TrackWaypoint Layer. -When no TrackWaypoint Layer is selected (or the layer is invisibile) then the file will be open in the default manner: at the top level. - -
-
Show calendar day names -A setting to control whether the calendar displays day names (Mon, Tue, etc...) or not. - -
-
Ruler area label position -A setting to control the position of the label drawn on the viewport that shows the area value. Includes a setting to turn off the label. - -
-
Use Scroll to Zoom -A setting to control if scroll events cause the viewport to zoom (rather than moving). Useful with mouse scroll wheels, but less intuitive for touchpads. - -
-
Invert Scroll Direction -A setting to control the direction of scroll events. Especially useful with touchpads and can be used to override the desktop system's setting. - -
-
-
- -
OpenStreetMap Traces -
OAuth Method - - Using the OAuth method means that your OSM account details are no longer needed to be known by &appname;. - Instead specific tokens are generated for use only by &appname; which are associated with your OSM account. - -Get New OSM Access Tokens - Use this button to generate a new OSM Access Token Key and Secret. - You will be redirected to the OSM website to confirm allowing &appname; to access the GPX Traces features. - The tokens returned by the OSM website will be stored in the Access Token Key + Access Token Secret preferences. - -Access Token Key + Access Token Secret: -These are the values used, however one typically does not need to manually change them. -
-
HTTP Basic Authentication (Discouraged) -OSM Username + Password -Store your OSM details here, so that you don't need to enter it in every time in the procedure. -This is not recommended and one should use the OAuth method using access tokens described above. - - -Your OSM password will be stored in plain text. - - - - -This password is transferred unencrypted in every request sent to the OpenStreetMap server. This is due to the use of OpenStreetMap's basic authentication method. - - - - -When OAuth capability is built into &appname; (the default), use of HTTP Basic Authentication can only be used if the osm_basic_auth is enabled. - - -
-
- -
Mapnik - -If any changes to these settings are made, you will need to restart &appname; to make them be applied. - - -
Plugins Directory -The location of Mapnik plugins. An attempt is made to automatically determine the initial value, - however if this is wrong or Mapnik is upgraded then the directory can be set here. -
-
Fonts Directory - -The location of fonts for use with Mapnik. Normally it is best to simply use the System's font directory. - -
-
Recurse Fonts Directory -Load fonts in any sub-directories of the main font directory. -
-
Rerender Timeout -The time in hours before any tile is rerendered. -This is useful in case the underlying source data for the tiles changes (e.g. OSM data is continually evovling). - &appname; normally has no way of knowing when the data has changed, so this simple timeout method is provided to maintain consistency of the tile images. -
-
CartoCSS -This allows setting the specific location of the carto executable. -
-
Threads - - The number of threads to use for Mapnik rendering tasks. - By default the value is set to the 1 in case of any multi-threading rendering code chain crashes. - Otherwise trying setting the value to the number of the CPUs of the system minus one (so as not to overload the system), in order to minimise the overall rendering times. - -
-
- -
Routing -
Routing engine -You can select the routing engine used by default, ie by features that do not propose a live selection, like . -
-
- -
Startup -Naturally since these preferences effect the startup, the values will not be used until &appname; is restarted. -
Restore Window Setup -When this is enabled, the main window size and layout (such as whether the statusbar or layers panel are shown) is restored to the values from last use. -
-
Default Map Layer -When this is enabled, a map layer is automatically added whenever &appname; is opened and a &appname; file is not to be loaded. -The map layer used is defined by the map layer's default values. -
-
Startup Method -Enables selection of how the startup position should be determined. - - -Home Location (default) -Position as set by the Set the Default Location - - -Last Location -Uses the last position viewed on the viewport - - -Specified File -Load the file as specified below - - -Auto Location - - Uses the GeoClue service if available - or otherwise the web service hostip.info to attempt to determine your location via IP lookup - - - - -
-
Startup File -Loads this specified file when the Startup method is set to Specified File -
-
Check For New Version -Periodically (no more than once every 14 days), check to see if there is a new version of &appname; available. -
-
- -
Toolbar -
Append to Menu -Allows setting the toolbar on the same vertical space as the menu, thus increasing vertical space for the map. -
-
Icon Size -Allows configuration of the icon size, including overiding the system's default preference to the setting desired just for &appname;. -
-
Icon Style -Allows configuration of the icon style, including overiding the system's default preference to the setting desired just for &appname;. -
-
Customize -Opens the Customize Toolbar dialog. -From this dialog the items in the toolbar can be added, removed and reordered. Reordering of items is performed by drag and drop. -
-Customize Toolbar dialog - - - -
-
-
- -
- - -
Howto's -
Getting Started - -&appname; from version 1.5 has several features to ease the start up process. -On the very first run, you will be asked if you want to enable these features which make use of an Internet connection. -If you select no or you have upgraded from an earlier version you can choose to enable any of the startup options via the . - - -Some other general use cases for using &appname;, are as follows: - -
Go to an area of interest - -&appname;'s default location is a Manhatten, New York, USA, so you may need to pick another place that interests you - such as where you live. - - -Method A - - - Use the online location address/place search. - - - Use the Go to Location toolbar button or from the menus - ViewGo to Location. - You can change the search location provider if desired. - Enter the name of place you wish to go to (you may need to specify the country to refine the search). - Also you can enter a post code or a ZIP code instead. - - - You will need an internet connection for this search to work - - - - -Method B - - - If you know the coordinates of where you want to view: - - -Use View and select from either Go to Lat/Lon or Go to UTM and then enter in the specific coordinates. - - - - -Method C - -Use the GPS Layer or FileAcquireFrom GPS -to load data directly from your GPS into &appname;. - -You can specify the types of data to acquire: Tracks, Routes and/or Waypoints. - - -You must have write permission to the port used. For Unix like OS: - - /dev/ttyS0 is the first serial port - /dev/ttyUSB0 is the first USB port - usb: is any USB port - -Depending on your distribution only one of the USB port types may work -For Windows: - - com1: is the first serial port - usb: is any USB port - - - - The GPS devices supported are those supported by GPSBabel. - Garmin and Magellan GPS devices supported by all versions, later versions of GPSBabel support more devices such as DeLorme and Navilink. - - - - -Method D - - -Get data from files in GPX or KML format, which can be opened directly. -Use FileOpen - - -Other formats can be imported that are supported by GPSBabel. -FileAcquireImport File With GPSBabel... - - - -The viewport will be automatically moved and resized to view the contents of the file. - - - - -
-
Add a Map Layer - -Use LayersNew Map Layer, and choose a suitable cache directory -where you would like to store your tracks and click OK. Zoom to a -comfortable level (I suggest 4 mpp) by clicking the left and right -mouse buttons on the gray area where your tracks are. Now from the menu -choose the Tool. Click where you would like to download a -map. Regardless of what tool you are using, the middle mouse button -always pans. - - -You need an open internet connection when you are downloading maps. - - - -If you can no longer see your tracks or waypoints and only the map, -it is because the layer named Map is ABOVE your TrackWaypoint layer that your GPS data is in. -This means that it will be drawn last and on top of the other . -Look at the to the left which shows this order. -Select the Map layer from the list and click the down arrow button beneath the list until the Map layer is below the TrackWaypoint layer. -Your tracks will now be drawn over the map. - -
- -
Set Your Home Location - - You can save the current center position of the viewport as the default location AKA the Home Location by - EditSet the Default Location. - - - Then at any time you can return to this place by clicking on the Home icon on the toolbar. - - - You can also set the default location via specifing the exact latitude and longitude in the . - -
- -
-
From 1st startup to GPS track (including offline maps) - -The first you'll see is an empty map, because &appname; in its default configuration will download maps only on demand. -Before fetching unneeded data, one can position to a location of interest, e.g. Stuttgart: ViewGo to Location, enter Stuttgart. - -
Fetching the maps - -Map - - -LayersNew Map Layer -in the layer properties dialogue choose e.g. OpenStreetMap (Mapnik). - -For the moment, we keep the default Maps Directory (the directory in -which the maps will be stored and can be used for offline usage). - - -Check Autodownload maps and keep the zoom level as Use Viking -Zoom Level. - - -however, that these settings will play an important -role in the pre-fetch for offline usage discussed later - - - - -You'll see a map of Stuttgart. Using the mouse wheel, you can -zoom in and out. The maps for the choosen resolution will be downloaded -automatically. - - -DEM Layer (Height Map) - - -Zoom out to 512. -LayersNew DEM Layer -Keep the download source as is (SRTM Global 90m), hit OK. - - -In the layer listing on the left, the layer should reside -above the map layer. If this is not the case, highlight the DEM layer -an shift it one up (using the arrow up button). - - -highlight the DEM layer in the layer listing on the left -in the toolbar, check DEM layer download/import (the last symbol) -a left-click in the map window should then fetch the DEM data - - -This might take some time. - - -Sometimes, a tile does not show up correctly (you might see only a -black frame in the map window) because it got corrupted during -transfer. In order to correct this, you can delete the corresponding -datafile in the cache. right-click the DEM layer properties - - -The DEM Files listing allows you to delete the specific tiles (alternatively do this from the command line). - - -You can also alter the Min. and Max. elevation in this dialogue. - - -
-
GPS Track with Height Profile - -Uncheck the layer (the map is shown again) - - LayersNew TrackWaypoint Layer - Ensure the new track layer is above the map layer. - -Expand the layer, select Tracks -In the tools menu choose Create Track - -Leftclick in the map window, enter a name - - Click several times to generate a track (a right-click removes the last point). - Height data is set automatically since DEM data is available - -Expand tracks in the layer menu, your track should show up, select it -Right click your track, select Properties -Click the tab Elevation-distance - enjoy the plot - - -In order to save this setting for later usage - - -click OK in the Track Properties dialog -FileSave As, choose a name (you can open this view later via fileOpen). - - -
-
Usecase: offline data for holiday - -Suppose you want to have the and data offline for your holiday in Italy near Bologna. - - -Start a new &appname; session. -ViewGo to Location, enter Bologna -LayersNew Map Layer -Choose e.g. OpenStreetMap (mapnik). -adapt the maps directory e.g. to /home/user/.viking-map-holiday/. -This allows you to delete the map stuff after holiday without purging the rest of your maps. - -check autodownload map -keep viking zoom level -zoom out to 1024 -add a layer (as discussed above) -download the DEM data - -In the &app; version discussed here, the DEM data automatically -are stored in /home/user/.viking-maps/. You can move the corresponding -tiles into .viking-map-holiday/ if you like. - - -Download map data for all zoom levels - - -uncheck the DEM layer for the map to show up -navigate the map to be centered at Bologna -choose the zoom such, that all regions of interest are displayed in the map window (e.g. 1024) - -follow this sequence until you have all tiles for all zoom levels you need - -right-click the map layer properties -set the zoomlevel explicitely one below the last (in the first cycle 512), hit OK -right click the map layer Download Missing Onscreen Maps -wait until all tiles for that resolution have been downloaded - - - -This may take some time and some hard disk capacity. - -Do not forget to save your configuration (as discussed above). - - -
- -
-
OpenStreetMap project - -OpenStreetMap (OSM) is a collaborative project to create a free editable map of the world. -One of the sources of data for this project is GPS tracks. -&appname; supports this project via the GPS Traces methods, both uploading and downloading such data. - - - Authentication/authorization is required to use these services. See . - - -Also see for further detail. - -
Uploading data to OpenStreetMap - -It is possible to upload data directly from &appname; to OpenStreetMap. - - -Upload a layer - -One solution is to upload whole a layer. To do this, -simply select the layer and right click on it. Then, select Upload to -OSM. - - - -Upload a single track -Another solution is to upload an individual track. Simply select the track and right click on it. -Then select Upload to OSM. - - - -Fill in the form - -The filename is the name you want your upload has on the server. This information is displayed by the osm server. -The description is some descriptive information. -The tags field is a white space separated list of tags. - - -
- -
Downloading Traces from OpenStreetMap - -It is possible to download GPS traces directly from OpenStreetMap into &appname;. -This feature can be really useful for checking existing data before uploading new ones. - - -Download all visible tracks -One solution is to select - -File -Acquire -OSM traces... -. -Each request can get up to 5,000 points. -The dialog box allows setting which group of 5,000 points to get. These groups are known as Page Numbers which start at 0. -Increasing the page number parameter allows one to request the subsequent sets of point groups. - - -
-
Downloading Your Own Traces from OpenStreetMap - -It is possible to download any of your personal GPS traces previously uploaded to OpenStreetMap into &appname;. - - -Initially this will return the list of your OSM Traces, from which you can select which specific traces to retrieve. -This list can be sorted on each column so that it easier to find an individual trace or select a group of traces by similar properties. - -
- -
- -
Geotagging - - This assumes you already have a layer enabled for ease of use (if not see above to get one). - -
Manual Positioning - - This is useful for instances when you already know exactly where the image was taken (no need for tracklog). - Or maybe you want to adjust an automatically generated waypoint for the position of the subject of the image rather than the location that the photograph is taken from. - ATM this process only works on an individual image, so it will be tedious for handling lots of images. - - - First create a layer or use an existing one; and select it in the . - NB Make sure this layer is above the map layer in the Layers Panel list. - Create a new waypoint (or move an existing one) to exact location desired: - - Select the tool, then left click on the map at the location desired, choosing an image to associate with it in the new waypoint dialog - Select the tool, then left click on waypoint to be moved. Left click again and drag the waypoint to the location desired - - Then using the Select tool left click on waypoint to select it, then right click to access the Waypoint properties menu, then choose - Update Geotag on ImageUpdate - - - The Update Geotag on Image options are only available when a waypoint has an image associated with it. - -
- -
Automatic Positioning Against a Tracklog - - First you will need a tracklog with timestamps in it. Either load one from a previously saved file or freshly acquired from a GPS device - - see Getting Started. - It helps if this is the track that was recorded at the time you took some photographs! - - - Select the track either from the layers panel on the left or via the viewport using the tool. - Then right click on it and chose the Geotag Images... leading you to the Dialog. - - - Load some images that where taken around the time the track log was recorded. Confirm the other options in the dialog - normally the defaults should be alright and select OK. - If things are succesful, new waypoints with thumbnail images of the photographs will appear. - You should probably check they are really in the right place as often the timestamp of the camera may not be aligned to the GPS correctly leading to inferring incorrect locations. - -Option: Overwrite Waypoints - - This is particularly useful when one finds an attempt at geotagging gives wrong locations, often due to time offset issues. - Simply try again with a new time offset (often 1 hour adjustments due to Daylight Savings or Summer Time times) and the old waypoints will be updated (instead of creating new ones). - - - - If you have multiple tracks in a TrackWaypoint layer, then invoking the Geotag Images... action on the layer - will search all the tracks to find location matches. - -
-
- -
GPS Real Time Location - - &appname; relies on gpsd to provide the current location from a real time feed from a GPS device. - - - This assumes you already have a layer enabled for ease of use (if not see above to get one). - - - Turn on the GPS Device, ensure it has figured out it's location and plug it in to your computer. - -
Set Up GPS Layer - - You will need a layer. One can be added via LayersAdd GPS Layer. - - - Adjust the Realtime Tracking Mode settings to interface with gpsd as necessary. Normally the defaults should suffice. - - - Current Linux distributions should run gpsd automatically when a GPS Device is plugged in. Otherwise you may have to run gpsd manually. - - - Then right-click the layer and select Start Realtime Tracking. - Hopefully the viewport should jump to the GPS location. - - - Troubleshooting checklist: - -Confirm gpsd is running. -Confirm on the GPS device it has a location. -Confirm the Realtime Tracking Mode settings. -
-
- -
What to Do if &appname; Does Not Seem to Work - -In order to get some information about what &appname; is doing, start it in verbose debug mode via the command line: -viking -dV - - -NB For Windows the process is slightly more involved as the output is typically not shown in the command prompt, -so you have to redirect the output to a file, e.g. open the command prompt and then: - -cd "C:\Program Files\Viking" -viking -dV 2>1 > %TMP/viking.log - -Then close &appname; before viewing the output file, such as: -notepad %TMP/viking.log - - -For instance you can check the correct URLs &appname; is using in requesting remote data for DEMs or map tiles in the verbose debug output. -E.g. Something like this for DEMs: - -** (viking:28778): DEBUG: curl_download_uri: uri=http://dds.cr.usgs.gov/srtm/version2_1/SRTM3/Eurasia/N48E008.hgt.zip -* About to connect() to dds.cr.usgs.gov port 80 (#0) -* Trying 152.61.128.95... * connected -* Connected to dds.cr.usgs.gov (152.61.128.95) port 80 (#0) - GET /srtm/version2_1/SRTM3/Eurasia/N48E008.hgt.zip HTTP/1.1 -User-Agent: viking/0.9.8 libcurl/7.18.2 GnuTLS/2.4.2 zlib/1.2.3.3 libidn/1.8 -Host: dds.cr.usgs.gov -Accept: */* - HTTP/1.1 200 OK - Date: Sun, 26 Jul 2009 18:13:38 GMT - Server: Apache - Last-Modified: Tue, 21 Jul 2009 19:57:35 GMT - ETag: eac3f8-1828f5-46f3caa76070a - Accept-Ranges: bytes - Content-Length: 1583349 - Content-Type: application/zip - -* Connection #0 to host dds.cr.usgs.gov left intact -* Closing connection #0 -** (viking:28778): DEBUG: dem_layer_add_file: /home/username/.viking-maps/srtm3-Eurasia/N48E008.hgt.zip - -Or for OSM Mapnik tile server: - -* About to connect() to tile.openstreetmap.org port 80 (#0) -* Trying 193.63.75.28... * connected -* Connected to tile.openstreetmap.org (193.63.75.28) port 80 (#0) - GET /13/4065/2748.png HTTP/1.1 -User-Agent: viking/0.9.96 libcurl/7.20.1 GnuTLS/2.8.6 zlib/1.2.3.4 libidn/1.18 -Host: tile.openstreetmap.org -Accept: */* - -* HTTP 1.0, assume close after body - HTTP/1.0 200 OK - Date: Thu, 14 Oct 2010 22:18:42 GMT - Server: Apache/2.2.8 (Ubuntu) - ETag: "b66ff9d46474bab68262a3483428a232" -** (viking:16704): DEBUG: curl_get_etag_func: ETAG found: "b66ff9d46474bab68262a3483428a232" - Content-Length: 17194 - Cache-Control: max-age=94805 - Expires: Sat, 16 Oct 2010 00:38:47 GMT - Content-Type: image/png - Age: 5153 - X-Cache: HIT from konqi.openstreetmap.org - X-Cache-Lookup: HIT from konqi.openstreetmap.org:3128 - Via: 1.1 konqi.openstreetmap.org:3128 (squid/2.7.STABLE7) - Connection: close - -* Closing connection #0 -* About to connect() to a.andy.sandbox.cloudmade.com port 80 (#0) -* Trying 178.63.75.195... ** (viking:16704): DEBUG: curl_download_uri: uri=http://tile.openstreetmap.org/13/4065/2749.png -* About to connect() to tile.openstreetmap.org port 80 (#0) -* Trying 193.63.75.28... * connected -* Connected to a.andy.sandbox.cloudmade.com (178.63.75.195) port 80 (#0) - GET /tiles/cycle/13/4065/2747.png HTTP/1.1 -User-Agent: viking/0.9.96 libcurl/7.20.1 GnuTLS/2.8.6 zlib/1.2.3.4 libidn/1.18 -Host: a.andy.sandbox.cloudmade.com -Accept: */* - -* connected -* Connected to tile.openstreetmap.org (193.63.75.28) port 80 (#0) - GET /13/4065/2749.png HTTP/1.1 -User-Agent: viking/0.9.96 libcurl/7.20.1 GnuTLS/2.8.6 zlib/1.2.3.4 libidn/1.18 -Host: tile.openstreetmap.org -Accept: */* - -* HTTP 1.0, assume close after body - HTTP/1.0 200 OK - Date: Thu, 14 Oct 2010 23:44:35 GMT - Server: Apache/2.2.8 (Ubuntu) - ETag: "8e520ad47ce9c1b63430554886eb5fab" -** (viking:16704): DEBUG: curl_get_etag_func: ETAG found: "8e520ad47ce9c1b63430554886eb5fab" - Content-Length: 18094 - Cache-Control: max-age=87742 - Expires: Sat, 16 Oct 2010 00:06:57 GMT - Content-Type: image/png - X-Cache: MISS from konqi.openstreetmap.org - X-Cache-Lookup: MISS from konqi.openstreetmap.org:3128 - Via: 1.1 konqi.openstreetmap.org:3128 (squid/2.7.STABLE7) - Connection: close - - -
- -
- - -
- Extending Viking - - Currently, &app; has some extention points based on configuration files. The file format is heavily inspired by the GtkBuilder file format: you specify the class of the GObject to build and set its properties. Technically, it is a XML file containing a "objects" root element. Inside this element, you set a collection of "object". - Here is an example: - - - Property value - Property value - - ... - -]]> - - - You can find more examples in the documentation part of the distribution. - - It is also possible to override the internal defaults e.g. to update any parameters should they change over time, - by adding the values into your configuration file. - When you define object group that already exists (and for Maps this means by a repeated Id key, but you may have to examine the source code to work out what the relevant Id values are) then you need to define all the other keys as well, otherwise they will be reset to the defaults. - -
- Map Source - It is possible to add new map's sources. The file is ~/.viking/maps.xml for UNIX like systems, C:\Documents and Settings\username\.viking\maps.xml on Windows XP or C:\Users\username\.viking\maps.xml on Windows 7 onwards. - An example of the file is in the distribution doc/examples/maps.xml. Further examples and values are online in the Maps Wiki - - The VikSlippyMapSource allows to declare any map's source working like OpenStreetMap. It supports the following properties: - - - id - this is an integer and should be unique as it used to identify the map source - - - name - a string (should be unique) that is used for the OSM style cache directory name when the Map Cache directory is the default (~/.viking-maps) - - - label - the text displayed in the map's source selection dialog - - - hostname - the server's hostname (eg. "tile.openstreetmap.org") - - - url - - the parametrized address of the tile, in the spirit of C printf format, with 3 "%d" fields for Z, X and Y (in that order) (eg. "/%d/%d/%d.png") - - The full parametrized address can just be put in the URL field and the hostname field doesn't need specifying. - e.g. "https://tile.openstreetmap.org/%d/%d/%d.png" - - - - - zoom-min (optional) - The minimum zoom value supported by the tile server. The Default is 0 if not specified. - - - zoom-max (optional) - - The maximum zoom value supported by the tile server. The Default is 18 if not specified. - See Zoom Levels - - - - lat-min (optional) - The minimum latitude value in degrees supported by the tile server. The Default is -90 degrees if not specified. - - - lat-max (optional) - The maximum latitude value in degrees supported by the tile server. The Default is 90 degrees if not specified. - - - lon-min (optional) - The minimum longitude value in degrees supported by the tile server. The Default is -180 degrees if not specified. - - - lon-max (optional) - The maximum longitude value in degrees supported by the tile server. The Default is 180 degrees if not specified. - - - file-extension (optional) - - The file extension of the files on disk. The default is .png - If the tile source URL ends in something other than .png, then this parameter will need to match it. - This can also be useful in reading a tileset from other software which may name tiles in an alternative form, - e.g. for Mobile Atlas creator it names them .png.tile - The file types actually usable are those supported by GDK Pixbuf Library, which includes at least PNG and JPEG. - Remember to include the beginning '.' when specifying this parameter. - - - - use-direct-file-access (optional) - - Only use files on disk. The default is FALSE - This can also be useful for tilesets already on disk as it will avoid attempting to download any tiles. - Thus with this type the hostname and url parameters are not necessary and are ignored. - - - - switch-xy (optional) - - Swap the X,Y values around in the URL parametrized ordering. - The default is false. - - - - check-file-server-time (optional) - - Sends the timestamp of the tile to the server, so the server can decide whether it should send a new tile or not. - The default is false. - - - - use-etag (optional) - - Use and compare the ETag value in determining whether to download a newer tile. The default is false. - The ETag value is stored in a separate file in the same directory as the tile to enable checking the value across multiple runs of the program. - - - - tilesize-x (optional) - The tile x size. The default is 256 pixels if not specified. - - - tilesize-y (optional) - The tile y size. The default is 256 pixels if not specified. - - - scale (optional) - - The tile scale. The scale is 1 if not specified. - Use a value of 2 to represent high res tiles. - Don't change the tilesize as the internal display size is still based on 256 pixels. - - - - - - The VikTmsMapSource allows to declare any TMS service. It supports the following properties (as per VikSlippyMapSource above): - - - id - - - label - - - hostname - - - url - - - check-file-server-time (optional) - - - zoom-min (optional) - - - zoom-max (optional) - - - lat-min (optional) - - - lat-max (optional) - - - lon-min (optional) - - - lon-max (optional) - - - - The VikWmscMapSource allows to declare any WMS or WMS-C service. It supports the following properties (as per VikSlippyMapSource above): - - - id - - - label - - - hostname - - - url - - - check-file-server-time (optional) - - - zoom-min (optional) - - - zoom-max (optional) - - - lat-min (optional) - - - lat-max (optional) - - - lon-min (optional) - - - lon-max (optional) - - - -
- -
- Go-to search engines - It is possible to add new new search engines for the "Go-To" feature. The file is ~/.viking/goto_tools.xml. - An example of the file in the distribution doc/examples/goto_tools.xml. - Currently, there is a single object class available: VikGotoXmlTool. Such feature allows to declare any search engine using a XML format as result. - The related properties are: - - - label - the text displayed in the Go-To dialog - - - url-format - the parametrized address of the query, in the spirit of C printf format, with a single "%s" field (replaced by the query string) - - - lat-path - XML path of the latitude (eg. /root/parent/elem) - - - lat-attr (optional) - name of the attribute (of previous element) containing the latitude - - - lon-path - XML path of the longitude (eg. /root/parent/elem) - - - lon-attr (optional) - name of the attribute (of previous element) containing the longiude - - - - As a facility (or readability) it is possible to set both path and attribute name in a single property, like an XPath expression. To do so, simply set both info in lat-path (or lon-path) in the following format: /root/parent/elem@attribute. -
- -
- External tools - It is possible to add new external tools. The file is ~/.viking/external_tools.xml. - An example of the file in the distribution doc/examples/external_tools.xml. - The VikWebtoolCenter allows to declare any Webtool using a logic based on center coordinates and zoom level value. - The related properties are: - - - label - the text displayed in the menu entry - - - url - the parametrized URL to open, in the spirit of C printf format, with 2 "%s" and a "%d" fields for X, Y and Z (zoom level) (eg. "http://hostname/?lat=%s&lon=%s&zoom=%d") - - - - The VikWebtoolBounds allows to declare any Webtool using a logic based on bounds coordinates. - The related properties are: - - - label - the text displayed in the menu entry - - - url - the parametrized address of the tile, in the spirit of C printf format, with 4 "%s" fields for left, right, bottom and top (eg. "http://hostname:8111/load_and_zoom?left=%s&right=%s&bottom=%s&top=%s") - - - -
- -
- Routing engine - It is possible to declare new routing engines. The file is ~/.viking/routing.xml. - An example of the file in the distribution doc/examples/routing.xml. - The VikRoutingWebEngine allows to declare a routing engine available via HTTP. - The related properties are: - - - id - a string, should be unique as it used to identify the routing engine - - - label - the text displayed in the menu entry - - - format - - The GPSBabel format code to interpret the service response. By default a GPX response is expected and processed internally. However if the service returns different format then GPSBabel is used to transform the text into something that &appname; can understand. Only formats that GPSBabel supports can be used: e.g. 'gpx', 'kml', 'gtrnctr' (for Garmin Training Center .tcx files), etc... - Use gpsbabel --help on the command line to find out the supported file types and their codes to process them. - - - - url-base - the base URL of the web service (eg. "http://hostname/service?") - - - url-start-ll - the part of the URL setting the starting point location, parametrized in the spirit of C printf format, with 2 "%s" for coordinates (eg. "&start=%s,%s") - - - url-stop-ll - the part of the URL setting the end point location, parametrized in the spirit of C printf format, with 2 "%s" for coordinates (eg. "&stop=%s,%s") - - - url-via-ll (optional) - the part of the URL setting via point location, parametrized in the spirit of C printf format, with 2 "%s" for coordinates (eg. "&via=%s,%s") - - - url-start-dir (optional) - the part of the URL setting the starting point location for direction based routing, parametrized in the spirit of C printf format, with one "%s" for direction (eg. "&start=%s") - - - url-stop-dir (optional) - the part of the URL setting the end point location for direction based routing, parametrized in the spirit of C printf format, with one "%s" for direction (eg. "&start=%s") - - - url-ll-lat-first (optional) - The ordering of the lat/long terms in the Start, Stop and Via URL settings. By default this is TRUE. - For instance using Brouter services, the URL uses a pair of values which is longitude and then latitude. Thus setting this value to FALSE ensures the value substitution is performed in the necessary order. - - - referer (optional) - A URL to serve as referer for the HTTP request (eg. "http://hostname/") - - - follow-location (optional) - the max depth of recursive redirections - - - -
- -
- Remote File Datasources - It is possible to add web references expected to return a file which can then be opened directly or converted via GPSBabel. - The file is ~/.viking/datasources.xml. - An example of the file is in the source distribution doc/examples/datasources.xml. - The VikWebtoolDatasource allows to declare any URL using logic based on coordinates. - The related properties are: - - - label - the text displayed in the menu entry - - - url - - the parametrized URL to open in the spirit of C printf format, with up to 9 "%s" values. e.g. http://hostname/getfile?lat=%s&lon=%s - The order and meaning of these parameters is given by the url_format_code below - - - - url_format_code - - A string describing the parametrized URL substitution parameters, each character represents how to translate each term. - B = Bottom of the current view i.e. minimum latitude - L = Left of the current view i.e. minimum longitude - T = Top of the current view i.e. maximum latitude - R = Right of the current view i.e. maximum longitude - A = center lAtitude of the current view - O = center lOngitude of the current view - Z = OSM Zoom value of the current view. See Zoom Levels - P = selected Point's latitude - N = selected poiNt's longitude - S = A user specified input string requested from the user via a dialog box - Thus for the url example above then the format code should be AO - - - - file_type - - This value is passed on for the -i parameter in interfacing with GPSBabel. - If it is not defined then the returned file is interpreted internally as a GPX file. - Possible values such as 'kml', 'mapsource' etc.. can be used. See GPSBabel File Formats for the full list. - - - - babel_filter_args - - This value is passed on for the filter arguments interfacing with GPSBabel. - E.g. "-x nuketypes,routes" can be used to filter all routes from the results. - - - - input_label - - This value is used when requesting input from the user. - It is the label of the text input box. - - - - -
- -
- System Extension File Locations - Note that, on UNIX like systems, the extension files (&extfiles;) are also searched in /etc/viking and /usr/share/viking directories (or related in your system). - The XDG_DATA_DIRS environment variable can be used to change these directories. - The XDG_DATA_HOME environment variable is also used (if set) to look for these extension files. -
- - -
- Miscellaneous Settings - Various individual values are automatically saved between &app; sessions in the ~/.viking/viking.ini file. - This file is not intended to be manually edited, but since it is a plain text file it can be changed if desired. - Some values in this file are read only, in the sense that there is no way to set it other than by manually entering in the keys and values (the key will not exist in the file otherwise). This allows some fine tuning of &app; behaviours, without resorting to recompiling the code. However is it not expected that these values should need to be changed for a normal user, hence no GUI options for these have been provided. - Here is the list of the read only keys and their default values. - - - curl_cainfo=NULL - See CURLOPT_CAINFO - - - curl_ssl_verifypeer=1 - See CURLOPT_SSL_VERIFYPEER - On Windows this is defaulted to 0 to get HTTPS connections to at least work, - otherwise any attempts at verifying always fail. - [Some incompatibily is suspected in the reliant binary DLLs] - - - geoclue_accuracy_level=4 - Set the integer value for the accuracy level request to the GeoClue service. Values to match the GClueAccuracyLevel: - - 0 = GCLUE_ACCURACY_LEVEL_NONE - 1 = GCLUE_ACCURACY_LEVEL_COUNTRY - 4 = GCLUE_ACCURACY_LEVEL_CITY - 5 = GCLUE_ACCURACY_LEVEL_NEIGHBORHOOD - 6 = GCLUE_ACCURACY_LEVEL_STREET - 8 = GCLUE_ACCURACY_LEVEL_EXACT - - - - gpx_tidy_points=true - ATM Only attempts to remove a suspicious first point of a GPX track - (as opposed to any points within a track). - - - gpx_tidy_points_max_speed=340 - Over this speed (in metres per second) for the first pair of points - the first point is removed. - - - layers_create_trw_auto_default=false - Create new TrackWaypoint layers without showing the layer properties dialog first. - - - layers_panel_calendar_markup_mode=3 - 0=No markups. 1=Day marked. 2=Day marked and tooltips created. 3=Auto (timed tooltip creation, so if too slow it reverts to 1) - - - maps_max_tiles=1000 - - - maps_min_shrinkfactor=0.0312499 - - - maps_max_shrinkfactor=8.0000001 - - - maps_real_min_shrinkfactor=0.0039062499 - - - maps_scale_inc_down=4 - - - maps_scale_inc_up=2 - - - maps_scale_smaller_zoom_first=true - - - srtm_http_base_url=https://dds.cr.usgs.gov/srtm/version2_1/SRTM3 - Allows using an alternative service for acquiring DEM SRTM files. - Note that the layout on the server needs to be split into Continent directories. - - - mapnik_buffer_size=128 (in pixels) - - - osm_basic_auth=false - Set to true to force the use of HTTP Basic Authenication even when OAuth is available - - - background_max_threads=10 - - - background_max_threads_local=Number of CPUs - - - window_default_tool=Pan - Options are: Pan, Zoom, Ruler or Select - - - window_menubar=true - - - window_copy_centre_full_format=false - - - version_check_period_days=14 - - - trackwaypoint_start_end_distance_diff=100.0 - - - gps_statusbar_format=GSA - This string is in the Message Format Code - - - geoclue_statusbar_format=SA - This string is in the Message Format Code - - - trkpt_selected_statusbar_format=KEATDN - This string is in the Message Format Code - - - utils_nearest_tz_factor=1.0 - - - viewport_history_size=20 - - - viewport_history_diff_dist=500 - In metres. - - Go Back or Go Forward requests over this range from the last history location will move back to that position. - If within this range it will skip over this location and move on to the next saved history location. - - - - viewport_scale=1 - - If Viking doesn't automatically detect a high resolution display, you can force the setting here - typically by setting this to 2. - - - - external_diary_program=rednotebook - Or in Windows it uses C:/Progra~1/Rednotebook/rednotebook.exe - This string value must use Unix separators and not have spaces. - - - external_astro_program=stellarium - Or in Windows use C:/Progra~1/Stellarium/stellarium.exe - This string value must use Unix separators and not have spaces. - Needs to be version 0.15.0 or greater (otherwise due to this Bug means this does not actually work). - - - external_text_program=gedit - Or in Windows it uses notepad - This string value must use Unix separators and not have spaces. - - - bfilter_simplify=100 - - - bfilter_compress=0.001 - - - list_date_format=%Y-%m-%d %H:%M - A date format description as passed on to strftime(). - Note that when displayed in tables sorting by this column simply uses the text value, rather than the underlying date/time value. - - - - export_device_path=OS Specific - UNIX = "/media/user/GARMIN/Garmin/GPX" - WINDOWS = ":/Garmin/GPX" - - - export_device_trackpoint_limit=10000 (Typical Garmin Edge limit) - Older Garmins limits are typically much lower - Etrex 20/30 is 500 - - - export_device_routepoint_limit=250 - - - kmz_default_maps_dir=Empty - You may want to use something like: "/media/user/GARMIN/Garmin/CustomMaps" - - - -
- Message Format Code - Currently for ease of implementation the message format code is a string of characters. - Each character represents what should be inserted in relation to a Trackpoint. - One day it might evolve into something more user friendly with a frontend to control it, perhaps allowing arbitary text too. However for now at least some control is offered :) - - - - Character Code - - G = Some text to display at the start of the message - GPSD - K = Some text to display at the start of the message - Trkpt - A = Altitude of a Trackpoint - S = Speed of a Trackpoint - B = Vertical Speed (Climb) - C = Course of a Trackpoint - L = Location of a Trackpoint - T = Time of a Trackpoint - M = Time diff of a Trackpoint from the previous trackpoint - X = Number of satellites used in the trackpoint fix - D = Distance of the trackpoint from the start of a track (following along the track) - F = Distance of the trackpoint from the finish (end) of a track (following along the track) - P = Distance difference of the trackpoint from the previous trackpoint - N = Name of track to which the trackpoint belongs - E = Name of the trackpoint - - - - Output Notes - - If the output has * after it, then the value has been calculated via interpolation (such as speed when the Trackpoint does not contain a speed value). - If the output has ** after it, then difficulties were encountered in trying to work out the value so probably a default of 0 will be shown. - - - - -
- -
- -
- Keyboard Shortcuts (Accelerator) Settings - This is held in the file ~/.viking/keys.rc - It is in the standard GTK Accelerator map format. Values are automatically read in and saved between &app; sessions. - This file is not intended to be manually edited, but since it is a plain text file it can be changed if desired. -
- -
- - - - - - - - -
diff --git a/help/Makefile.am b/help/Makefile.am index 9ef4869..f263aeb 100644 --- a/help/Makefile.am +++ b/help/Makefile.am @@ -1,27 +1,22 @@ -if GEN_MANPAGES -include $(top_srcdir)/gnome-doc-utils.make -endif +@YELP_HELP_RULES@ # Annoyingly in the XML, yelp refuses to load relative images fileref, i.e. ../../src/icons/file.png # whereas the PDF generation inserts these references OK # Nevertheless we need to copy the images into figures/ so they are available for the distribution installed help -# Most tool icons are _18, except the pan one which is _22 just to be annoying -get-icons: - -cp -f ../src/icons/*_[12][0-9].png C/figures/ +C/figures/%.png: + -cp -f ../src/icons/$(notdir $@) C/figures/ # '-' ^^^^^ means it doesn't care about the exit status # this copy statement is not critical (especially when run under make distcheck) -dist-hook: get-icons doc-dist-hook - -DOC_MODULE = viking -DOC_ENTITIES = legal.xml \ +HELP_ID = viking +HELP_FILES = index.docbook +HELP_EXTRA = legal.xml \ attribution.xml \ commandline.xml \ georef_layer.xml \ mapnik_rendering_layer.xml \ recommends.xml -DOC_INCLUDES = -DOC_FIGURES = \ +HELP_MEDIA = \ figures/Aggregate_statistics.png \ figures/Aggregate_statistics_years.png \ figures/addtr_18.png \ @@ -57,20 +52,17 @@ DOC_FIGURES = \ figures/Viking-TAC.png \ figures/DEM_file_info_dialog.png \ figures/customize_toolbar_dialog.png -DOC_LINGUAS = +HELP_LINGUAS = EXTRA_DIST = viking.xml.in CLEANFILES= # man pages processing -if GEN_MANPAGES MANPAGES=viking.1 man_MANS = $(MANPAGES) CLEANFILES+=$(MANPAGES) -endif -DB2MAN=@DB2MAN_XSL@ -XP=@XP@ -''-nonet +XSLTPROC=@XSLTPROC@ -''-nonet %.1: %.xml - $(XP) -o $@ $(DB2MAN) $< + $(XSLTPROC) -o $@ http://docbook.sourceforge.net/release/xsl/current/manpages/docbook.xsl $< diff --git a/help/viking.omf.in b/help/viking.omf.in deleted file mode 100644 index 745d1e5..0000000 --- a/help/viking.omf.in +++ /dev/null @@ -1,10 +0,0 @@ - - - - - manual - - - - - diff --git a/src/Makefile.am b/src/Makefile.am index 3752897..78bda6b 100644 --- a/src/Makefile.am +++ b/src/Makefile.am @@ -16,16 +16,8 @@ authors.h: $(top_srcdir)/AUTHORS sed -e "s/ \*\*.*//" -e 's/^/"/' -e 's/$$/",\\/' -e '$$s/\\$$//' $< >> $@ echo "NULL};" >> $@ -if HAVE_XSLTPROC -documenters.h: $(top_srcdir)/help/C/viking.xml - $(XP) $(srcdir)/docbook2documenters.xsl $(top_srcdir)/help/C/viking.xml > $@ -else -documenters.h: - rm -f $@ - echo "/* Generated file. */" >> $@ - echo "const gchar *DOCUMENTERS[] = {\\" >> $@ - echo "NULL};" >> $@ -endif +documenters.h: $(top_srcdir)/help/C/index.docbook + $(XSLTPROC) $(srcdir)/docbook2documenters.xsl $(top_srcdir)/help/C/index.docbook > $@ BUILT_SOURCES = authors.h documenters.h diff --git a/src/vikwindow.c b/src/vikwindow.c index 307dfd9..320df61 100644 --- a/src/vikwindow.c +++ b/src/vikwindow.c @@ -2864,7 +2864,7 @@ static void help_help_cb ( GtkAction *a, VikWindow *vw ) ShellExecute(NULL, "open", ""PACKAGE".pdf", NULL, NULL, SW_SHOWNORMAL); #else /* WINDOWS */ gchar *uri; - uri = g_strdup_printf("ghelp:%s", PACKAGE); + uri = g_strdup_printf("help:%s", PACKAGE); GError *error = NULL; gboolean show = gtk_show_uri (NULL, uri, GDK_CURRENT_TIME, &error); if ( !show && !error ) -- cgit v1.2.3 From 8e60e352a15d3234595a81d3720968fb5706e507 Mon Sep 17 00:00:00 2001 From: Paul Gevers Date: Wed, 29 Jul 2020 07:06:21 +0200 Subject: upstream git contains the geoclue_layer.xml, but the tar ball does not. xmllint trips on this. =================================================================== Gbp-Pq: Name geocluelayer.xml_not_included.patch --- help/C/index.docbook | 2 -- 1 file changed, 2 deletions(-) diff --git a/help/C/index.docbook b/help/C/index.docbook index d7e8bd3..aade818 100644 --- a/help/C/index.docbook +++ b/help/C/index.docbook @@ -2263,8 +2263,6 @@ This clears the Tracks Area Coverage information, thus no grid colouring will be - -
Coordinate Layer -- cgit v1.2.3 From 49f96398477f2e5123cd8ba8007e4e3a194be880 Mon Sep 17 00:00:00 2001 From: Nikolay Korotkiy Date: Tue, 4 Feb 2020 21:12:47 +0000 Subject: [PATCH] Fix build without mapnik Signed-off-by: Rob Norris Gbp-Pq: Name fix_build_without_mapnik.patch --- src/viklayer.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/viklayer.c b/src/viklayer.c index dc0ab1f..3070157 100644 --- a/src/viklayer.c +++ b/src/viklayer.c @@ -36,7 +36,7 @@ extern VikLayerInterface vik_dem_layer_interface; #ifdef HAVE_LIBMAPNIK extern VikLayerInterface vik_mapnik_layer_interface; #endif -#ifdef HAVE_LIBMAPNIK +#ifdef HAVE_LIBGEOCLUE_2 extern VikLayerInterface vik_geoclue_layer_interface; #endif -- cgit v1.2.3 From 671d49a3f472e5502b4a0d32e90a676150e10b5b Mon Sep 17 00:00:00 2001 From: Bernd Zeimetz Date: Wed, 29 Jul 2020 07:06:21 +0200 Subject: build-with-gcc-10 Gbp-Pq: Name build-with-gcc-10.patch --- src/babel.h | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/babel.h b/src/babel.h index ae2fa95..e2c18e6 100644 --- a/src/babel.h +++ b/src/babel.h @@ -109,8 +109,8 @@ typedef struct { gchar *label; } BabelFile; -GList *a_babel_file_list; -GList *a_babel_device_list; +extern GList *a_babel_file_list; +extern GList *a_babel_device_list; void a_babel_foreach_file_with_mode (BabelMode mode, GFunc func, gpointer user_data); void a_babel_foreach_file_read_any (GFunc func, gpointer user_data); -- cgit v1.2.3 From 0dd31704c9f89270b81e295981ad28e31bf4a1e5 Mon Sep 17 00:00:00 2001 From: Bernd Zeimetz Date: Sat, 16 Oct 2010 18:57:01 +0200 Subject: [PATCH] disable-po-check Gbp-Pq: Name 0001-disable-po-check.patch --- po/Makefile.in.in | 8 ++------ 1 file changed, 2 insertions(+), 6 deletions(-) diff --git a/po/Makefile.in.in b/po/Makefile.in.in index fcd2c3b..9a494ad 100644 --- a/po/Makefile.in.in +++ b/po/Makefile.in.in @@ -145,12 +145,8 @@ uninstall: rm -f $(DESTDIR)$(localedir)/$$lang/LC_MESSAGES/$(GETTEXT_PACKAGE).mo.m; \ done -check: all $(GETTEXT_PACKAGE).pot - rm -f missing notexist - srcdir=$(srcdir) $(INTLTOOL_UPDATE) -m - if [ -r missing -o -r notexist ]; then \ - exit 1; \ - fi +check: + # do nothing as it messes up with quilt's .pc folder. mostlyclean: rm -f *.pox $(GETTEXT_PACKAGE).pot *.old.po cat-id-tbl.tmp -- cgit v1.2.3 From 0a04df68eabd859390b672f2e1caec128d1aa924 Mon Sep 17 00:00:00 2001 From: Bernd Zeimetz Date: Sat, 19 Nov 2016 00:15:50 +0100 Subject: fix build on hurd Gbp-Pq: Name fix_build_on_hurd --- src/metatile.h | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/src/metatile.h b/src/metatile.h index 0206133..50d5b0c 100644 --- a/src/metatile.h +++ b/src/metatile.h @@ -26,3 +26,7 @@ int xyz_to_meta(char *path, size_t len, const char *dir, int x, int y, int z); int metatile_read(const char *dir, int x, int y, int z, char *buf, size_t sz, int * compressed, char * log_msg); + +#ifndef PATH_MAX +#define PATH_MAX 4096 +#endif -- cgit v1.2.3 From 940cce11f4737982b6d0e99b57e53eca8bcf4e75 Mon Sep 17 00:00:00 2001 From: Paul Gevers Date: Fri, 8 Jan 2021 19:44:10 +0100 Subject: no-doc-dir Gbp-Pq: Name no-doc-dir --- Makefile.am | 2 +- configure.ac | 11 +---------- 2 files changed, 2 insertions(+), 11 deletions(-) diff --git a/Makefile.am b/Makefile.am index e59a6b3..4d283ec 100644 --- a/Makefile.am +++ b/Makefile.am @@ -1,4 +1,4 @@ -SUBDIRS = src test data po windows help tools doc +SUBDIRS = src test data po windows help tools INTLTOOL = \ intltool-extract.in \ diff --git a/configure.ac b/configure.ac index 94b7bff..264b5ea 100644 --- a/configure.ac +++ b/configure.ac @@ -11,13 +11,6 @@ AM_INIT_AUTOMAKE([dist-bzip2 dist-zip subdir-objects]) dnl AC_CONFIG_SRCDIR([src/main.c]) AC_CONFIG_HEADERS([src/config.h]) -# check for gtk-doc -m4_ifdef([GTK_DOC_CHECK], [ -GTK_DOC_CHECK([1.0],[--flavour no-tmpl]) -],[ -AM_CONDITIONAL([ENABLE_GTK_DOC], false) -]) - AC_PROG_CC AC_PROG_CC_STDC # Checks for programs. @@ -594,9 +587,7 @@ AC_CONFIG_FILES([ windows/installer/Makefile windows/installer/pixmaps/Makefile windows/installer/translations/Makefile - doc/Makefile - doc/reference/Makefile - doc/examples/Makefile]) + ]) AC_OUTPUT -- cgit v1.2.3 From 4c226fa34504070cc45e1738b9758d2e662c77d0 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Ball=C3=B3=20Gy=C3=B6rgy?= Date: Wed, 11 Mar 2020 21:57:58 +0100 Subject: [PATCH] Port to yelp-tools This removes the usage of deprecated gnome-doc-utils. Gbp-Pq: Name 18d7c02d5829ec796efaa6b0fba0632f478048ba.patch --- Makefile.am | 7 - README.md | 6 +- configure.ac | 21 +- help/C/index.docbook | 4151 ++++++++++++++++++++++++++++++++++++++++++++++++++ help/C/legal.xml | 2 +- help/C/viking.xml | 4151 -------------------------------------------------- help/Makefile.am | 28 +- help/viking.omf.in | 10 - src/Makefile.am | 12 +- src/vikwindow.c | 2 +- 10 files changed, 4168 insertions(+), 4222 deletions(-) create mode 100644 help/C/index.docbook delete mode 100644 help/C/viking.xml delete mode 100644 help/viking.omf.in diff --git a/Makefile.am b/Makefile.am index 4d283ec..3ba1376 100644 --- a/Makefile.am +++ b/Makefile.am @@ -12,7 +12,6 @@ full: EXTRA_DIST = \ README.md \ HACKING \ - gnome-doc-utils.make \ ChangeLog.0 \ viking.spec \ mingw-viking.spec \ @@ -29,9 +28,6 @@ generate-changelog: dist-hook: viking.spec generate-changelog cp $(top_builddir)/viking.spec $(distdir) -MAINTAINERCLEANFILES = \ - gnome-doc-utils.make - DISTCLEANFILES = \ intltool-extract \ intltool-merge \ @@ -39,8 +35,5 @@ DISTCLEANFILES = \ ACLOCAL_AMFLAGS = -I m4 -DISTCHECK_CONFIGURE_FLAGS = \ - --disable-scrollkeeper - # Ignore gtk theme cache files on distcheck distuninstallcheck_listfiles = find . -type f -print | grep -v 'icon-theme.cache' diff --git a/README.md b/README.md index 7eb70cc..d71f4c1 100644 --- a/README.md +++ b/README.md @@ -27,7 +27,7 @@ Git repository: On Debian Sid, following packages must be installed before building: - # sudo apt install gtk-doc-tools gnome-doc-utils libpng-dev libgtk-3-dev libicu-dev + # sudo apt install gtk-doc-tools docbook-xsl libpng-dev libgtk-3-dev libicu-dev The following packages are needed (they are included by default in Debian Sid, but not in other distributions). They must be installed too: @@ -37,10 +37,6 @@ The following packages are also used, but they can each be disabled with configu $ sudo apt-get install libsqlite3-dev nettle-dev libmapnik-dev libgeoclue-2-dev libgexiv2-dev libgps-dev libmagic-dev libbz2-dev libzip-dev liboauth-dev -Further packages are required if you want to generate man and help page documentation: - - $ sudo apt-get install docbook-xsl rarian-compat - ### Actual Build If you downloaded Viking from Git, you have to: diff --git a/configure.ac b/configure.ac index 264b5ea..9615f53 100644 --- a/configure.ac +++ b/configure.ac @@ -104,7 +104,7 @@ AC_SUBST(PACKAGE_LIBS) dnl ------------- dnl | User Manual |--------------------------------------- dnl ------------- -GNOME_DOC_INIT +YELP_HELP_INIT dnl --------------------------------------------------------------------------- dnl - Use deprecated options (default enabled for devs, disabled in releases) @@ -546,23 +546,7 @@ AC_DEFINE_UNQUOTED(VIK_CONFIG_DEFAULT_TILE_AGE, ${VIK_CONFIG_DEFAULT_TILE_AGE}, AC_DEFINE(HAVE_VIKING, 1, [Enable Viking specifics in otherwise reusable code]) dnl man pages processing -dnl Different distributions have differing locations for the docbook.xsl -dnl Debian like -if test -r /usr/share/xml/docbook/stylesheet/docbook-xsl/manpages/docbook.xsl; then - DB2MAN_XSL=/usr/share/xml/docbook/stylesheet/docbook-xsl/manpages/docbook.xsl -dnl RedHat like -elif test -r /usr/share/sgml/docbook/xsl-stylesheets/manpages/docbook.xsl; then - DB2MAN_XSL=/usr/share/sgml/docbook/xsl-stylesheets/manpages/docbook.xsl -else -dnl Old default - DB2MAN_XSL=/usr/share/sgml/docbook/stylesheet/xsl/nwalsh/manpages/docbook.xsl -fi -AC_SUBST(DB2MAN_XSL) -AC_PATH_PROG(XP,xsltproc) -AM_CONDITIONAL([HAVE_XSLTPROC],[test "x$XP" != "x"]) -AC_CHECK_PROG([HAVE_SCROLLKEEPER],scrollkeeper-config,"yes") -AM_CONDITIONAL([GEN_MANPAGES],[test "x$XP" != "x" && test -r "$DB2MAN_XSL"] && test "${HAVE_SCROLLKEEPER}" = "yes" ) -AM_COND_IF([GEN_MANPAGES], [ac_cv_enable_man=yes], [ac_cv_enable_man=no]) +AC_PATH_PROG(XSLTPROC,xsltproc) ISODATE="$(date --utc --date="@${SOURCE_DATE_EPOCH:-$(date +%s)}" +%Y-%m-%d)" AC_SUBST(ISODATE) @@ -618,7 +602,6 @@ OAuth : $ac_cv_enable_oauth Size of map cache (in memory) : ${VIK_CONFIG_MAPCACHE_SIZE} Age of tiles (in seconds) : ${VIK_CONFIG_DEFAULT_TILE_AGE} GeoNames user : ${VIK_CONFIG_GEONAMES_USERNAME} -Man page generation : $ac_cv_enable_man Documentation (+HTML) : ${enable_gtk_doc} (HTML: ${enable_gtk_doc_html}) ------------------------------------------- diff --git a/help/C/index.docbook b/help/C/index.docbook new file mode 100644 index 0000000..d7e8bd3 --- /dev/null +++ b/help/C/index.docbook @@ -0,0 +1,4151 @@ + + + Viking"> + + + + maps.xml, goto_tools.xml, datasources.xml, external_tools.xml, routing.xml"> +]> + + +
+ + &app; Manual + + &app; is a free/open source program to manage GPS data. + + + + 2013 + Guilhem Bonnefille + Rob Norris + + + + + GNOME Documentation Project + + + + + + + + Guilhem + Bonnefille + + + Rob + Norris + + + + username: + Alexxy + + + username: + Vikingis + + + username: + Tallguy + + + username: + EliotB + + + Alex + Foobarian + + + + + + + &appname; Manual V&manrevision; + &date; + + Guilhem Bonnefille guilhem.bonnefille@gmail.com + Rob Norris rw_norris@hotmail.com + GNOME Documentation Project + This document was generated on . + + + + + This manual describes version &appversion; of &appname;. + + + Feedback + To report a bug or make a suggestion regarding the &app; application or + this manual, follow the directions in the + Feedback section of the GNOME User Guide. + + + + + + &app; + + +
+ Introduction + +&appname; aims to be easy to use, yet powerful in accomplishing a wide +variety of tasks. Some of the things you can use &appname; for are: + + + +Uploading and downloading waypoints, tracks and routes to/from GPS. + + + +Preparing tracks, routes and waypoints for trips using maps from services such as OpenStreetMap (OSM). +The data is only needed to be uploaded to your GPS before you leave. +The maps together with your tracks, routes and waypoints can also be printed and used during the trip. + + + + +After trips, tracks and waypoints from GPS can be downloaded, stored, managed and reused in your (or your friends') later trips. + + + + +Analyzing Off Highway Vehicle (OHV) and hiking trips, understanding where you went and how far you were from something. + + + +Making waypoints, tracks and routes to follow to easily get someplace +you've never been before or don't have GPS data for but online +maps exist for it. + + + + +Making maps with using Mapnik. +Not on Windows at the moment. + + + + +Grouping data from multiple trips using a hierarchical data manager. + + + + +Analyzing speed at different places (to some degree), adding waypoints where you forgot to mark one but did slow down or stop. + + + + +Downloading and storing OpenStreetMap and/or other map types on your hard drive and looking at them later. + + + + +Editing routes or tracks and their trackpoints, joining and splitting up tracks and routes. + + + + +Show the live GPS position on the map (for use on a mobile device - e.g. a laptop). Not Windows at the moment. + + + + +Import and export track, route and waypoint files of various types via GPSBabel + + + +Previously on Windows, GPSBabel was distributed with &appname;, but this no longer the case. + + +It can be downloaded from its website . + + + + + +View, create and update Geotagged Images (using EXIF data). + + + + + +&appname; is under continual improvement: see the the Roadmap / Wishlist: + + +
+Screenshot: OSM Cycle Map and Many Tracks + + + +
+ + + The Windows build of Viking does not currently support verification of https connections. + + +
+ +
General Concepts +
Layers + +Layers is concept one may know from powerful graphics editors such as Photoshop or GIMP. +Instead of putting all the data on the same level, it is stacked (i.e. layered) with different data over one another. +This can be useful for analysis and general handling of various sets of data. + + +Unfortunately the downside of this complexity is remembering how differing layers of data can obscure other data. + + +The Map layers have Alpha Compositing, +to create the appearance of partial transparency. +By controlling this value one can see data below it in the layer heirarchy for interesting effects. + +
+
Layers Panel + +The panel on the left is called the layers panel. +It determines which layers and sublayers (such as tracks and waypoints) +are shown, and the order in which they are drawn. Layers on the +top of the layers panel list are drawn last. You can change the order by +drag and drop, or by selecting a layer and using the up and down +buttons at the bottom of the layers panel. + + + The panel also contains a calendar to show when Layers occurred. + Double clicking on the day will select and move the viewport display to that layer. + Right clicking brings up a menu from which you can select to go to the previous or next layer in time. + +
+
Viewport + +The main &appname; area where the layer data is drawn, is called the viewport. + +
+
Track Graphs + +Below the viewport can be shown track (and route) elevation/distance and time/speed (tracks only) graphs of the selected item. +These are the same graphs as shown in . +The graphs will automatically hide itself when nothing or no suitable item is selected. + + +Moving the mouse pointer over the graphs will show a tooltip readout of the nearest trackpoint. +Similarily to the track properties graphs, left clicking will center the viewport on the trackpoint. +A right click menu offers controls of the drawing options, a subset of track operations and access to further information dialogs. + +
+
Statusbar +This provides a readout of various information: + +The currently selected (mouse pointer) tool +The number of items to process in the background - normally this the number in the map tile download queue +The zoom factor +The location of the mouse pointer (and potentially height information if DEM data is available) + +When creating a track/route, the statusbar also displays some information about the track/route. +
+Statusbar + + + +
+This part of the statusbar displays: + +The total distance of the track/route (including currently edited segment). +The bearing of the currently edited segment. +The distance of the currently edited segment. + + +For convenience, a zoom selector can be opened from the status bar. Simply left-click on the zoom factor. +
+ The zoom selector available from status bar + + + +
+
+ +
Toolbar +The toolbar is an area for buttons that perform common actions. +Some actions are modal, so the appropriate layer needs selected before these toolbar buttons are enabled. See more detail. +The display of the toolbar is influenced by the +Right clicking on the toolbar and selecting Customize allows jumping to the directly. +
+ +
Projections + +&appname; supports differents projections: + + +UTM + + +LatLon (also called EPSG:4326) + + +Mercator (also called Spherical Mercator) + + + +
+ +
Map Cache + +&appname; stores downloaded map tiles to disk for a couple of reasons: + + +Enables off line usage +Reduces loading on the map tile provider + + +The &appname; automatic caching strategy is two fold: + + + + + If the age of the tile on disk is less than the specified tile age (see ), + it will not attempt to contact the server to get a new version of the tile. + + + + + When the tile age has expired &appname; will attempt a refresh update, so that it provides the cached tile generation timestamp so the server can determine if a new tile image needs to be returned. Not all map types support this refresh method. + + + + + You can override the caching scheme by using right-click on the Map on the layers panel and selecting Redownload All Onscreen Maps, or Ctrl+F5 for the top most map displayed. This will get the latest version held by the server. + + + + This can be useful if you contribute to OpenStreetMap and wish to see your modifications (of course give time for the server to have processed your changes - see I have made edits but they don't show up on the map) + + + + +The layout of the cache on disk itself can be controlled via a per Map Layer property. + +Viking - Legacy default in a private cache layout scheme +OSM - Newer available default (1.6+) + +This is to increase the compatibility between &appname; and similar applications that cache tiles on disk so that the tiles can be shared. + + + + + +
+ +
Shortcut Keys + +&appname; has several shortcut keys or key combinations for commands as listed in the main window along side the command. + + +By default some function keys follow standard GUI behaviour: + + +F1 Help (view this manual) +F5 or Ctrl+R Refresh the maps on screen +F10 Select the Menubar (in built behaviour) +F11 Full Screen +Ctrl+F5 or Ctrl+Shift+R Redownload the maps on screen + + + +Refresh attempts to get new maps only if the local tile cache time period has expired for any particular map tile. +Redownload gets all on screen maps from the server, ignoring the local tile cache. + + + +Other function keys control turn on/off visibility of various elements: + + +F3 Toggle visibility of the Toolbar +F4 Toggle visibility of the Menubar +Shift+F5 Toggle visibility of the Scale indicator on the viewport +F6 Toggle visibility of the Center Crosshairs on the viewport +F7 Toggle showing selected items (e.g. tracks or waypoints) in the highlight colour in the viewport +Shift+F8 Toggle visibility of the calendar +Shift+F9 Toggle visibility of the Layers Panel buttons +F9 Toggle visibility of the Layers Panel +F12 Toggle visibility of the Statusbar +Shift+F12 Toggle visibility of the Track Graphs + + +Standard shortcuts are provided for normal GUI operations: such as creating new files, opening, saving and exitting. +Then there are shortcuts specific to &appname; to switch projection modes, zoom in/out, create layers,switch the active tool mode and move the map: + +Ctrl+Up Pan the viewport North +Ctrl+Right Pan the viewport East +Ctrl+Down Pan the viewport South +Ctrl+Left Pan the viewport West +Ctrl+Keypad+ Zoom In +Ctrl+Keypad- Zoom Out + +These work irrespective of the mode selected +For other combinations see the menu entry themselves. + +
+ +
+Keyboard Configuration +Keyboard configuration is supported by the standard GTK+ way of changing shortcuts for menu entries. +Hover over the menu option with the mouse pointer and press the keyboard shortcut you want to bind it to. +To delete a keyboard assignment, press Backspace whilst over the menu entry. + + + If the keyboard shortcut is already in use you will not receive any notification that new action replaces the old action. + This is probably why most distributions have this facility disabled by default. + Thus you will need to enable Editable menu accelerators for your system. + Check the Desktop Menu and Toolbar Control or other User Interface preferences for this setting. + + + + + For Windows systems this can be done by adding the line gtk-can-change-accels=1 to %USERPROFILE%\.gtkrc-2.0 (create the file if it does not exist). + + +From &app; 1.6+ the keyboard configuration is automatically loaded and saved between sessions in the +
+ +
Tracks vs Routes + +In theory a route is path you are planning to follow and a track is of where you have actually been. The GPX specification splits these into two separate categories, although tracks contain everything route may have. + + +Q. When planning a route what difference does it make if it's a route or a track? + + +A. One difference is in how a GPS device navigates following the route or track. +The capability, the options and data on a particular device also effect how the navigation is performed. +Often the how a device actually works doesn't seem to be formally documented by the manufacturer (and can be firmware dependent too). +Web searches can reveal people's experiences with specific devices on blogs and various forums. +For some devices it will attempt to navigate between route points, which may then suggest various roads and tracks between the points using an internal routing algorithm with some kind of transport profile. +However this is limited to the quality of data available and how well the profile matches ones actual need. +If the points are close enough then the 'best' route for any form of transport will typically be the straight line between the points. + + +There are often restrictions on the numbers of route (or track) points the GPS Device can handle - may be 250 or as little as 50. +This generally not a problem for shorter routes, but needs managing for longer or detailed routes. +The number of track points is normally alot higher (e.g. 500 or typically with latest devices 10,000 or more) and less of a problem. + + + See for helping to manage this. + +
+ +
+ +
File Types and the Main Window + + +&appname; has it's own file type traditionally marked by the .vik file extension. +This is a plain text file saving all information of the current window including the view location, zoom level, projection type and then all the layer information (aggregates, maps, tracks, waypoints, etc...). + + +Besides it's own file type, &appname; can open (and save to via export methods) GPX and KML file types. + + + +&appname; does not handle GPX 1.1 particularly well - it prefers GPX 1.0 + + + +By default &appname; opens a default blank window centered on the home location. This behaviour can be changed by the . +Each window contains menus, a toolbar, a viewport, layers panel and a statusbar. +Each section (apart from the viewport) can be hidden using the or from the +ViewShow choices. + + +One may consider each &appname; window to be a separate project - each with it's project Viking file. +However generally one window is enough for most purposes! + + +Several operations apply at the window level as follows next. +Also see for the operational modes that generally work in conjunction with a selected layer. + + +
New + +Located on the FileNew menu and on the toolbar New. + + +This creates a new window with the default settings. + +
+ +
Open + +Located on the FileOpen menu and on the toolbar Open. + + +This opens a file chooser dialog to select one (or more) files of the supported GPS data file types: + +Viking +GPX +TCX +KML +JPG + + + +GPX, TCX, KML and JPG files will be loaded into the existing &appname; view. A Viking file will be given a new window if the current window is already assigned. + + + +&appname; handles more file types via the Acquire methods below. + + +
+ +
Open Recent File + +Located on the FileOpen Recent File menu only. + + +The most recently opened files are available for opening again. +The number of files remembered is controlled by a value in the . + + +Note that files imported via the Acquire mechanism are not available in this list. + +
+ +
Save + +Located on the FileSave menu and on the toolbar Save. + + +If the current opened file is Viking file, this save will simply update it. +If it is a new file or the file loaded was an external type (i.e. GPX or KML), then this will ask for a new name to save as a Viking file. + +
+ +
Save As + +Located on the FileSave As menu only. + + +This will ask for a new name to save as a Viking file (even it was already a Viking file). + +
+ +
Append File + +Located on the FileAppend File... menu only. + + +Selecting a Viking file from this method will join the file contents to the current window (instead of creating a new one). + + +GPX and KML files may also be appended, whereby the file contents are added to the currently selected or layer. Otherwise they are loaded in the normal file open method when no layer is selected. + +
+ +
Open GPX as External Layer + +Located on the FileOpen GPX as External Layer... menu only. + + +Selecting a GPX file from this method will create an external Layer that loads from the specified file. +The layer is marked as a "no write" external layer, which means any changes made will not be written back to the GPX file. +To enable changes to be written, you can change the layer to a standard external layer in the layer properties dialog. +This is in contrast to importing the data and storing it in the Viking file. + +
+ +
Properties + +Located on the FileProperties menu only. + + +Displays some simple properties about the loaded Viking project file (if any), such as full filename including the path, the filesize and the date/time of the file. + +
+ +
Export All + +Located on the FileExport All menu only. +Choose either the GPX or KML option. + +This allows converting every layer from the existing project into files of the type choosen. +You will be prompted for a directory into which a new file for each layer will be saved. + + +The KML option uses GPSBabel and so will not be available if GPSBabel can not be detected. + + +Note that some data properties are not supported by the target export file type. Such as item visibility or track colours. + +
+ +
Acquire + + +Available on the FileAcquire menu and from the layer menu. + + +If used from the File menu these methods place the results in a new TrackWaypoint layer. + + +If used from the layer menu these methods place the results in that TrackWaypoint layer. + + +
+From GPS + +FileAcquireFrom GPS +Probably the easiest way of getting information from a GPS Device. + + +Select the GPS Device communication settings and then hit OK. +See the Getting Started section for more info about the settings. + + + +Some GPS devices (such as the Garmin Nuvi 255) support a native file system and write information to a Current.gpx file or similar. You will have to browse the file system on the device and open it directly. + + +
+ +
+Import File With GPSBabel + +FileAcquireImport File With GPSBabel + + +Other formats can be imported that are supported by GPSBabel. + + +You need to select the file and the type of the file that is going to be opened, +since there is no automatic detection of the file kind. + +
+ +
+OSM Traces + +FileAcquireOSM Traces + + +See section for more information. + +
+ +
+My OSM Traces + +FileAcquireMy OSM Traces + + +See section for more information. + +
+ +
+From Geotagged Images + +FileAcquireFrom Geotagged Images +Enables automatic creation of waypoints from geotagged images. + + +This menu opens a dialog to select such image files. +If the image files have geotag information in them, then a layer with named waypoints positioned at the location of each image with a thumbnail of that image is created. + +
+ +
+From Wikipedia Waypoints + +FileAcquireFrom Wikipedia Waypoints + + +This gets interesting points from Wikipedia for the specified view: either within the extent of layer bounds or within the current viewport boundary. + +
+ +
+From Routing + +FileAcquireFrom Directions + + +This gets a route from given directions. + +
+ +
+From URL + +FileAcquireFrom URL + + +This gets a file from the entered URL. +File formats that can be opened are those supported by GPSBabel. + + + +You need to select the type of the file that is going to be returned, since there is no automatic detection of the file kind. + + +
+ +
+Import GeoJSON File + +FileAcquireImport GeoJSON File + + +This uses the program togpx to load .geojson files. +If the program is not detected on your system, then this option will not be available. +See here for the installation method. + + +Versions proir to 1.6.0 of GPSBabel did not support the GeoJSON file format. + +
+ +
+ +
Print + +Located on the FilePrint menu and on the toolbar Print. + + +Print uses what is displayed on the current map view for printing: i.e. what ever map, tracks and waypoints that are in view, including the +cross hairs and the scale. + + +It uses a standard system print dialog using an image the size of the current viewport in pixel terms. +On the Image Settings you can move the image around the page and scale the image up / or down. + +
+ +
Generate Image File + +Located on the FileGenerate Image File menu only. + + +Allows generation of larger (pixel) area images than the standard Print method above. +From the generated image you can use the facilities of the Operating System to print the image +or perform other actions. + + +You should have previously downloaded the tile images for the chosen zoom level, +otherwise the image produced will have missing sections. + + + +Using large areas takes some time to process and due to the method used it may run out of memory to complete the operation. +Unfortunately under Windows systems it can not detect this failure and may crash the program. +So the maximum size is dependent on the capabilities of your system. +For instance the largest successful image generated on my (RN) Debian system is a pixel area of 20,000 x 20,000. + + +
+ +
Generate Directory of Images + +Located on the FileGenerate Directory of Images menu only. + + + +This is only available in UTM mode. + + +
+ +
KMZ Map File Overview + +A KMZ file is a compressed version of a KML file and associated supporting files. + + +A KMZ Map file is a KMZ file with an image overlay often for use as a Custom Map on Garmin GPSr devices. + + +&appname; only supports basic properties in KMZ Map files, primarily intended for use with Garmin GPSr devices although KMZ exports are known to be work with Google Earth. + +
+ +
Import KMZ Map File + +Located on the File menu only. + + +Enables loading of a selected KMZ map file. +This generates a new map layer using the overlay image contained within the KMZ file. + +
+ +
Generate KMZ Map File + +Located on the File menu only. + + +Enables exporting the current viewport as a KMZ map file. +The area and zoom level covered by the KMZ map can be adjusted before saving. + + +Note that Garmin GPSr devices have limits in using images if they are too large (e.g. over 3Mb big) in KMZ files. +&appname; does not enforce any limits on the KMZ files it generates. + +
+ +
+ +
Layers + + +Layers supported by &appname; are: + + + + + + + + + + + + + +For each layer there are a few standard options: + + +Properties - Layer setup / configuration settings +Cut +Copy +Paste +Delete +Visibility - This checkbox on the Layers Panel controls whether the layer is shown in the viewport or not + + +The cut/copy/paste options can be accessed in a variety of ways once the layer has been selected: + + +Standard keys: Ctrl+x|c|v +Main menu Edit +From the right click menu +Buttons at the bottom of the Layers Panel + + +Default values used for each layer's properties can be altered via the EditLayer Defaults menu options. + + +See the individual section for detail about each layer. + +
+ +
TrackWaypoint Layer + +TrackWaypoint layers display GPS data (tracks, routes and waypoints). + +One way to create new waypoints is to copy a +latitude/longitude coordinate pair, such as the one shown on most +geocaches, and paste it into an active TrackWaypoint layer. &appname; can +automatically recognize several variations of the lat/lon format. + + +By right-clicking on tracks, routes or waypoints in the , you can access many commands on them. +You can easily find a specific track, route or waypoint by expanding the appropriate containing Tracks, Routes or Waypoints sublayer in the +layers panel to show all the individual items and then typing the name of the track, route or waypoint. + + + +The containing Tracks, Routes or Waypoints sublayers are only shown when items of that type exist. +To start creating them enter into a create mode via either the Create toolbar commands or the New menu commands. + + + +The new TrackWaypoint layer dialog allows the layer to be specified as external. +In this case the layer is exported as GPX to the file specified instead of stored in the Viking file itself. +It is also possible to specify the layer as "no write". +This means that &appname; does not write the layer to the GPX file specified; instead, &appname; only reads the file. +No-write layers are primarily intended to be used with the option in the File menu. + + + +External layers are loaded only when they are displayed or selected. +Hence, they will not appear in any summary statistics if they have not been loaded. +It is possible to load all external layers contained in an layer by selecting "Load External Layers" from the Aggregate Layer context menu. +Note, &appname; specific options may not be saved if not supported by the GPX export. + + + +The sublayers also offer right click menu options. +These are the same as those available at the TrackWaypoint level, but only those that relate to the sublayer type. + + + +By default routes are coloured red. Tracks are automatically assigned a spread of colours. + + + +Most operations available on tracks are available on routes, except for functionality that relies on having timestamps - since routes by definition have no timing information. Thus for example, uploading a route to OpenStreetMap Traces is not available nor is Geotagging on a route. +It is possible to convert between Tracks and Routes, although converting from a Track to a Route may involve a loss of information (hence you are required to confirm this operation before it happens). + + + +Also see for use in conjunction with this layer. + + +
Layer Operations + +The layer has a context menu with several operations. + + +
View Layer + +Version1.1+: This will automatically move the viewport and select the best zoom level to see the whole layer (i.e. all tracks, routes and waypoints). + +
+ +
View + +
View All Tracks + +Version1.1+: This will automatically move the viewport and select the best zoom level to see the all the tracks in the layer (ignoring positions of any routes or waypoints). + +
+ +
View All Routes + +Version1.4+: This will automatically move the viewport and select the best zoom level to see the all the routes in the layer (ignoring positions of any tracks or waypoints). + +
+ +
View All Waypoints + +Version1.1+: This will automatically move the viewport and select the best zoom level to see the all the waypoints in the layer (ignoring positions of any tracks or routes). + +
+ +
+ +
Goto Center of Layer + +This will automatically move the viewport to see the whole layer (i.e. tracks, routes and waypoints). It does not adjust the zoom level. + +
+ +
Goto Waypoint + +This opens a dialog box to enter a name of waypoint to search for. If it is found the viewport is centred on it. + + + +Note this search is not very clever and only finds exact matches. +You are probably better off expanding the waypoint list and directly start typing, as mentioned above, which finds a match based on each letter typed. + + +
+ +
Export Layer + +The layer (all tracks, routes and waypoints) can be exported to following file formats: + + + + GPX + + + GPSPoint + + + GPSMapper + + + Google's KML + + + Any GPSBabel File Formats + + + GeoJSON. Via the program togeojson + This option will not be available if the program is not detected on your system. + See here for the installation method. + + + +Version1.1+: An individual track can be exported to a GPX file via the track menu. + +
+ +
Finish Track or Route + +Selecting this option ends the creation of that individual track or route. + + + +This is only available when a track or route is being created by the or tools. + + +
+ +
New +
New Waypoint + +This opens a dialog box to create a new waypoint. A default name will be suggested and the default position is the center of the viewport. + +
+
New Track + +This turns on the tool. + +
+
New Route + +This turns on the tool. + +
+
+ +
Geotag Images + +This starts the Geotagging Images dialog against all tracks in the layer. +See Geotagging for further detail. + +
+ +
Acquire + +This offers the same choice from methods as on the File menu. +However when invoked from here, the results will be stored in this layer (instead of creating a new one). + +
+ +
Upload + +
Upload to GPS + +This opens a dialog to select the GPS Device and port to which the layer information will be transferred. + + +The types of GPS information (tracks, routes or waypoints) to be transferred can be selected. + + +Tracks, Routes or Waypoints that are invisible will not be transferred. + +
+ +
Upload To OSM + +This opens a dialog to upload all tracks and waypoints to OpenStreetMap traces. +Useful if you are an OpenStreetMap contributor, access details are stored in &appname; + + + &appname; allows you to edit a track, e.g. remove duplicate points, perhaps remove track points leading to your home and then upload it to OpenStreetMap. + +
+
+ +
Delete +Offers deletion of various parts of a TrackWaypoint layer: +
Delete All Tracks +Deletes all the tracks in this layer. +
+
Delete Tracks from Selection +Opens a dialog with list of all the tracks from this layer to choose the ones to delete. +
+
Delete All Routes +Deletes all the routes in this layer. +
+
Delete Routes from Selection +Opens a dialog with list of all the routes from this layer to choose the ones to delete. +
+
Delete All Waypoints +Deletes all the waypoints in this layer. +
+
Delete Waypoints from Selection +Opens a dialog with list of all the waypoints from this layer to choose the ones to delete. +
+
Delete Duplicate Waypoints + + Deletes duplicate waypoints in this layer. + Waypoints are considered duplicate if they have the same location and symbol. + + If other properties are different such as name, comment, altitude, etc... they will still be considered a duplicate. + + + +
+
+ +
Filter +
Simplify All Tracks + +This opens dialog to request the number of points each track will be simplified using GPSBabel. The result is put into a new layer. The simplification method removes points considered to be in a 'near straight line', thus reducing the number of points and attempting to keep the most important turning points. + +
+
Compress Tracks + +Enables compression of tracks and routes via GPSBabel's Crosstrack simplify method. +It opens a dialog to request the Error factor value which is the maximum allowable error that may be introduced by removing a single point. +It is expressed a distance in units as specified by the distance option. +Thus a higher value will remove more points. +The result is put into a new layer. + +
+
Remove Duplicate Waypoints + +Remove Duplicate Waypoints - fairly self explainatory, with the results created in a new layer. + + + +However it only considers a precise position (waypoints only 1 metre away from each other are considered different) and also doesn't consider if the waypoints have different comments, symbols or images. + + +
+
+ +
Filter With <emphasis>Trackname</emphasis> + +This runs GPSBabel on the layer using information from a previously selected track (select via the track menu "Use With Filter" option) with the following command types: + + +Waypoints Inside This +Waypoints Outside This + + +The result is generated in a new Track/Waypoint layer. + +
+ +
Geotag Images + +This starts the Geotagging Images dialog using the specific track. +See Geotagging for further detail. + +
+ +
List Tracks or Routes + +Opens a new dialog with the list. As described in the Aggregate layer + +
+ +
List Waypoints + +Opens a new dialog with the list. As described in the Aggregate layer + +
+ +
+ +
Track and Route Sublayer Options +Repeats options available at the TrackWaypoint level, but only those for tracks and routes: + + +Finish Track or Route +Same as the layer Finish Track or Route + + +New Track or Route +Same as the layer New Track or New Route + + +View All Tracks or Routes +Same as the layer View All Tracks or View All Routes + + +Delete All Tracks or Routes +Same as the layer Delete All Tracks or Delete All Routes + + +Delete Tracks or Routes from Selection +Same as the layer Delete Tracks from Selection or Delete Routes from Selection + + +List Tracks or Routes +Opens a new dialog with the list. As described in the Aggregate layer + + +Also gives other options for handling multiple items: + + +Sort +Gives the ability to sort the items in the treeview alphabetically or by date. + + +Visibility +Offers options to quickly control the visibility of all items within the sublayer, as per + + +
+ +
Track and Route Properties + +This shows several tabs for properties and useful statistics about a track or a route, including elevation-distance and speed-time graphs (if data is available). +Moving the mouse pointer over the graph displays values related to that point along the track. +You can click on these graphs to jump to the point in the track. +You can reverse it, delete duplicates, split at marked position or split a track from its component segments (discontinuous breaks in a track) into separate tracks. + + +For the elevation related graphs the Show DEM check button is only enabled if a suitable is available that overlaps the track. + + +Graphs either have a Show GPS Speed or Show Speed button. +Each of these overlays relative speed markers along the graph. +The difference between Speed vs GPS Speed is that GPS Speed is taken directly from a field reporting the speed value in the source data. +Typically speeds used in Viking are calculated between the points time and position differences. +This is due to the reporting of speed values in source data is not mandatory and often not present. + +
Track and Route Properties Tab + +
+Properties Tab: Example + + + +
+
+
+
Track and Route Statistics Tab + +
+Statistics Tab: Example + + + +
+
+
+
Track Elevation Graph + +
+Elevation Distance Tab: Example + + + +
+
+ +The following colors are used in the elevation-distance graph: + + + +Main colour - this is dependent on your Desktop theme - often blue by default +elevation data in graph + + +Yellow + +no elevation data + + + +Green + +elevation data from DEM + + + +Red + +speed + + + +
+ +
Track Time Splits + +
+Splits Tab: Example + + + +
+
+ +This tab displays timing splits on tracks with timing information. +A few different values of split lengths are available, each having it's own tab display. + +
+
+ +
Track and Route Operations + +
Finish Track + +Selecting this option ends the creation of the individual track. + + + +This is only available when a track is being created by the tool. + + +
+ +
Goto + +This centers the viewport on the selected position on the track: + + +Startpoint +"Center" - the notional center from the bounds of the track +Endpoint +Version1.1+: Highest Altitude +Version1.1+: Lowest Altitude +Version1.1+: Maximum Speed (Not Available on Routes) +Version1.8+: Previous trackpoint +Version1.8+: Next trackpoint + +
+ +
View + +Version1.1+: This centers the viewport on the track and selects the best zoom level to see it. + +
+ +
Combine +
Merge By Time + +This operation repeatedly tries to merge the right-clicked track +with tracks in the same TrackWaypoint layer. The tracks which are +merged are those which have at least one trackpoint less than some +threshold time away. This way, if you somehow end up with lots of small +segments (say, caused by turning the GPS on and off) you can merge them +easily into one track. + + + +This is not available on routes as they have no timestamps. + + +
+ +
Merge With Other Tracks + + This opens a dialog listing the other tracks in the same TrackWaypoint layer, from which one can select the other tracks to merge with. + Tracks are merged in order of time. + +
+ +
Merge Segments + +Combines track segments. Effectively removing track segment markers to leave one segment for the whole track. + +
+ +
Append Track or Route + +Enable joining of a single track to the end of the current track. +This opens a dialog listing the other tracks in the same TrackWaypoint layer from which one can make the selection. + +
+
+ +
Split +
Split By Time + +This operation will split a single track into segments wherever the +time interval between successive trackpoints is larger than some +threshold. This is useful when processing raw NMEA GPS data, especially +taken over a long time. + + + +This is not available on routes as they have no timestamps. + + +
+ +
Split By Number of Points + +Version1.2+: This operation will split a single track into segments by the number of points specified. +This can be useful with devices which may have limits on the number of points it supports. + +
+ +
Split Segments + +Splits track segments into new tracks. + + + +This is not available on routes as they do not have route segments. + + +
+ +
Split at Trackpoint + +Splits the track at the currently selected trackpoint. + + +The current track will finish at this trackpoint. +A new track will start from a copy of this trackpoint. + + + +This is only enabled when a trackpoint is selected. + + +
+
+ +
Insert Points + + +These options are only enabled when a trackpoint is selected. + + +
Insert Point Before Selected Point + +Inserts a track point halfway between the previous track point and the current track point. +All track point properties are interpolated between the two points. + +
+
Insert Point After Selected Point + +Inserts a track point halfway between the current track point and the next track point. +All track point properties are interpolated between the two points. + +
+
+ +
Delete Points +
Delete Selected Point + +Deletes the currently selected track point. + + + +This is only enabled when a trackpoint is selected. + + +
+
Delete Points With the Same Position + +Deletes subsequent points that have the same position (but have different timestamps). + +
+
Delete Points With the Same Time + +Deletes subsequent points that have the same time stamp (but may have different positions). + + + +This is not available on routes as they have no timestamps. + + +
+ +
+ +
Transform + +These options alter the data of trackpoints of a track but not add or remove trackpoints. +And don't seem to fit any other category :) + +
Apply DEM data + +If any DEM data is loaded, this will apply the DEM data to give the track elevation data. +Two ways of applying DEM data are offered: + +Keep. Retains the existing elevation data of trackpoints and only those missing an elevation value are set. +Overwrite. Elevation data are set on all trackpoints even if they already elevation values. + + +
+
Smooth Missing Elevation data + +In various locations across the world, there are missing DEM values (AKA DEM Holes) from the SRTM data. +This is particularly noticeable in mountainous areas. +Two ways of applying elevation data to trackpoints that do not have elevation values are offered: + +Interpolated. Missing elevation data is interpolated between the previous and next known values. +Flat. Elevation data is filled in from the last previously known value. + + +
+
+Convert to Track or Route + +If this is a Route then it will convert it to a Track. + + +If this is Track then convert it to a Route. + + + +Converting from a Track to a Route may involve a loss of information, in particular timestamp values (hence you are required to confirm this operation before it happens). + + +
+
+Anonymize Times + +Timestamp information of a track can be shifted to be all offset from 1901-01-01. + + +Thus the timestamps themselves will no longer reveal exactly when a track was taken. +However the relative difference between the timestamps is kept thus one is still able to calculate some properties such as speeds along the track. + + + +This is not available for routes, as they have no timestamps. + + +
+
+Interpolate Times + +Trackpoint timestamps between the first and last points are calculated such that track is travelled at equal speed. +This is mostly useful when tracks don't have timestamps and you wish to recreate your trip (e.g. you've forgotten to turn on your GPS or the batteries have run out) +Thus edit the first and last trackpoints to set the approximate times of your trip and then use this to give approximate times along the track. +When used on tracks with timestamps this will overwrite the existing timestamps. + + + +This is not available for routes, as they have no timestamps. + + +
+
+ +
Export Track as GPX + +Version1.1+: This allows exporting the track as a GPX file by opening a file save dialog. + +
+ +
Extend Track End + +Changes the current tool to add trackpoints to the end of the track. + +
+ +
Extend Using Route Finder + +Enables the Route Finder tool. Thus on a subsequent left click in the viewport, a route is calculated from the end of track to that point using the default route service and applied to the track. + +
+ +
Upload + +
Upload to GPS + +Same as the layer Upload to GPS command, but only applies to the track. + +
+ +
Upload to OSM + +Same as the layer Upload to OSM command, but only applies to the track. + +
+ +
+ +
Use With Filter + +This selects the track to be used in the Filter With Trackname feature. + + + +This is not available on routes. + + +
+ +
Edit Trackpoint + +This opens the Trackpoint edit dialog. See . + + + +This is only enabled when a trackpoint is selected. + + +
+ +
Refine Route... + +This function allows to request a Routing Engine in order to refine a given route. +By "refining" we mean computing all real intermediates points between some given major points. +This could be useful to compute a trip giving only the wished important steps. + + + +This is only available on routes. + + +
+ +
View Google Directions + +This option is only available on a track created using the Route Finder tool. + + +Launch a web browser to see the Google directions page which yielded the route. + + + +The record of the Google route is stored in the track's comment, so if the comment is changed (or the route was created by something other than the Route Finder tool) this will not work correctly. + + +
+ +
+ +
Waypoint Sublayer Options +Repeats options available at the TrackWaypoint level, but only those for waypoints: + + +New Waypoint +Same as the layer New Waypoint + + +View All Waypoints +Same as the layer View All Waypoints + + +Goto Waypoint +Same as the layer Goto Waypoint + + +Delete All Waypoints +Same as the layer Delete All Waypoints + + +Delete Waypoints from Selection +Same as the layer Delete Waypoints from Selection + + +Delete Duplicate Waypoints +Same as the layer Delete Duplicate Waypoints + + +List Waypoints +Opens a new dialog with the list. As described in the Aggregate layer + + +Also gives other options for handling multiple items: + + +Sort +Gives the ability to sort the items in the treeview alphabetically or by date. + + +Visibility +Offers options to quickly control the visibility of all items within the sublayer, as per + + +
+ +
Waypoint Properties + + +This shows a dialog with detailed information for the waypoint. Many properties of the waypoint can changed here, such as the comment, the symbol used in drawing or the image (normally a photograph taken at this position) assiocated with it. When a waypoint has an image, a thumbnail of it is drawn in the viewport for the waypoint (in preference to the symbol). + + +If the waypoint has an associated image, then the Geotag information may be updated, either with updating the file's modification timestamp or not. +This can be useful when the waypoint has been moved. + + +
+ +
Waypoint Operations + +
Goto + +This centers the viewport on the selected waypoint. + +
+ +
Geotag Images... + +This opens the Geotag Dialog to allow Geotagging multiple images to the position of this waypoint. +In this circumstance creation of waypoint options are disabled and only the options related to writing the EXIF information are available. + +
+ +
Transform + +Offers a subset of the track utilities. +Currently only setting the altitude from DEM data methods are available. + +
+ +
Visit Webpage + +If the waypoint's comment (or description) starts with http: then this option is available and allows launching a web browser to go to the webpage. + +
+ +
Visit Geocache Webpage + +If the waypoint's name is in Geocache form (GCXXXXX) then this option is available and allows launching a web browser to go to the Geocache page. + +
+ +
New Waypoint + +Same as the layer New Waypoint. + +
+ +
+ +
Version1.3+: Geotag Images + +This dialog allows geotagging images (normally taken with a digital camera) against a specific waypoint or via interpolation against a specific track or all tracks in the TrackWaypoint layer - depending on how it is invoked. + + +When geotagging against tracks, images need to have an EXIF DATE_TIME_ORIGINAL (nearly always set by a camera). This timestamp is then used to find the location when the image(s) was taken by searching through the track(s) to find the nearest time - interpolating between points if necessary to set the location. + + + +Generally it is good policy to synchronize your camera's clock with your GPS clock before taking photographs. However the times can be adjusted afterwards (if necessary) to take into consideration clock differences. + + + +Various options allow control of how the geotagging process is performed: + + +Images - Add the images used for geotagging +Create Waypoints +Overwrite Existing Waypoints +Write EXIF +Overwrite Existing GPS Information +Keep File Modification Timestamp +Automatic Image Direction - Assumes the direction will be in line with the track heading +Interpolate Between Track Segments +Image Time Offset - The number of seconds to ADD to the photos time to make it match the GPS data. Calculate this with (GPS - Photo). Can be negative or positive. Useful to adjust times when a camera's timestamp was incorrect. +Image Time is Local - Are the timestamps in the image local time or otherwise in UTC. +Image Timezone - The timezone adjustment factor. + + +Typically timestamps in images are either in local time or UTC but there is no way of automatically knowing which; so you need to specify which is the case. +Image Time Offset is best used for accounting for camera's clock drift, so normally of the order of a few seconds or minutes. +Whereas Image Timezone is more for adjusting for a camera's timezone difference, or perhaps differences in your current timezone and the timezone the images where taken. + +
+ +
+ +
GPS Layer + +The GPS layer is responsible for uploading and downloading GPS data +from a GPS device. It also is responsible for realtime GPS tracking. +Expand the GPS layer in the layers panel to see the two layers it +uses for uploading and downloading. To upload, download, or use +realtime tracking, right-click the GPS layer and click the appropiate +menu item. + + +
Download + +To download data from the GPS, right-click the GPS layer and click Download from GPS. + +
+ +
Upload + +To upload data to the GPS, first populate the GPS Upload child +layer of the GPS layer (either by creating waypoints/tracks/routes in it, or +copying and pasting or dragging waypoints/tracks/routes from another layer). +Then right-click the GPS layer and click Upload to GPS. + +
+ +
Realtime Tracking + +You must set up gpsd correctly or use a GPSD server and put the +correct information in the GPS layer properties dialog. Then right-click +the layer and select Start Realtime Tracking. + +
+ +
Empty <emphasis>Item</emphasis> + +There are several options to quickly delete a subsection of data: + + +Empty Realtime +Empty Upload +Empty Download +Empty All + +
+ +
+ +
DEM (Digital Elevation Model) Layer + +This layer provides elevation data from the Shuttle Radar Topography Mission (SRTM) + + +Elevation data can be useful in planning trips, as you many wish to avoid/minimise the hills encountered. [OSM Cyclemap is also useful this way too] + + +To download the data use the tool (shown on the toolbar), and then click on a area of the viewport. Once files have been downloaded they can then be loaded from disk via the DEM properties in future application runs. + + +The current data server is: NASA STRM 2.1. + + +ATM &appname; does not auto download DEM data. If you want to get lots of data blocks, you may wish to use some other program get such as curl or wget to download them for an area. + + + +Using many DEMs is CPU/memory intensive. Depending on your computer's capability, &appname; will be less responsive when about 50+ DEM blocks are loaded. It is probably unwise to attempt using 200+ blocks, so trying to use DEMs covering large countries/continents (USA, Australia etc...) is unlikely to work. In these conditions under Linux, &appname; may be automatically stopped by the "OOM Killer" + + + +
+ + +
Maps Layer + +This layer provides a single map resource, you may have multiple map layers but only top one (if enabled) will be visible (subject to the Alpha compositing property). + + +Some maps are continually improving over time (e.g. OpenStreetMap) thus &appname; employs a caching mechanism to avoid redownloading data (see ). +However a forced refresh for the current view can be made via the Reload All Onscreen Maps option or Ctrl+F5. + + + +Also see tool for use in conjunction with this layer. + + +Online Map Tile Providers + +You will need an open internet connection when you are downloading maps these following map types, but once downloaded they are available from the hard disk cache. When map are avaliable from the disk cache it is much faster and can be used offline. +Inbuilt maps include various OpenStreetMap (OSM) ones and more: + + + +Bing Aerial Maps (&appname; Version1.2+) +Mapbox Outdoors - This is the default (&appname; Version1.7+) +OpenStreetMap (Mapnik) +OpenStreetMap (Cycle) +OpenStreetMap (Transport) (&appname; Version1.3+) +OpenStreetMap (Humanitarian) (&appname; Version1.5+) +NASA BlueMarble + + + +&appname; can be configured to handle additional online map resources. See for further detail. + + +Offline Map Tilesets + +Some map types supported are for on disk tile formats: + + + + + On Disk OSM Tile Format + This is equivalent to any map set with OSM Cache Layput. + +MBTiles File + + OSM Metatiles + + This file format is mostly aimed at being rendering cache feature and is Endian dependent. + Thus to successfully view the file cache, the Metatile files and Viking must be of the same endian type (which they probably will be). + + + + +Of course you need to have acquired or generated these tilesets yourself. + + +
Map Layer Properties + +Configurable properties: + + + +Map Type + + The kind of map this layer displays. + Map types are dependent on the current mode. + + + +Maps Directory +Not applicable for MBTiles Map type since it is a single file. + + +Cache Layout +Viking or OSM. See . Only applies to maps from online tile providers. + + +Map File +Ony applicable for MBTiles Map type since it is a single file. + + +Alpha + + Control the Alpha value for transparency effect using a value between 0 and 255 with the default being 255 for a fully solid image. + Zero is fully transparent. A value of around 160 can be useful for blending views of multiple map layers (when applied to the upper most map layer). + + + +Autodownload Maps +This can be useful to turn off when you are not online to avoid pointless download requests or may be keep a map in a 'historical' state. +e.g. perhaps in case a current map rendering is broken. + + +Autodownload Only Gets Missing Maps +Using this option avoids attempting to update already acquired tiles. +This can be useful if you want to restrict the network usage, without having to resort to manual control. Only applies when Autodownload Maps is on. + + +Zoom Level +Determines the method of displaying map tiles for the current zoom level. +Viking Zoom Level uses the best matching level, otherwise setting a fixed value will always use map tiles of the specified value regardless of the actual zoom level. + + +
+ + +
Layer Operations +
Download Missing Onscreen Maps + +This requests map tiles for areas of the viewport that do not currently have one. + +
+ +
Download New Onscreen Maps + +This requests map tiles only if the maps are older than the Tile Age preference. + +
+ +
Reload All Onscreen Maps + +Force a refresh of all visible map tiles. + +
+ +
Download Maps in Zoom Levels + +This opens a dialog to enable requesting the download of maps for the region in the viewport over a specified number of zoom levels. +The download method type can be specified to help limit the number of requests. + + + +There are some inbuilt limits to prevent downloading large amounts of map tiles. + + +Please respect the usage policy of the tile set provider. +Such as OSM Tile Usage Policy. + + + +
+Maps Download Dialog: Example + + + +
+
+
+
+ + +
+ +
Aggregate Layer + +This layer is a container layer to hold other layers. There is always an initial and controlling Top Layer that can not be removed or renamed. + + +This layer type is useful for grouping other layers, especially layers, in whatever categories are relevant to you: such as by activity, location or date. +Here are some suggestions: + +Hiking +Mountain Biking +Road Cycling +Car Trips +Sailing +Holidays +UK Points of Interest +USA Points of Interest +etc... + + + +Thus one can have a list of all your tracks, but groups can be shown or not using the relevant layers visibility checkbox. + + + +Tracks Area Coverage (TAC) is a feature to highlight areas with track coverage. +It is based on OpenStreetMap style tiles - as an approximation to a grid square system. +The size of the area can be changed, which is linked to the OSM Zoom level, +such that a higher Zoom level gives a smaller physical area and so more tiles. +This can be used for general curiousity or perhaps to plan routes to visit areas previously unexplored. + + +The calculations are performed in the background when deemed necessary (e.g. loading in a new file) and can also be manually requested. + + +Note that Viking can be slow in drawing hundreds or more tracks but this analysis is relatively quick and the resulting drawing is much faster. +Thus ATM is it recommended to turn off the visibility of the tracks themselves for this type of usage. + + + +
+Tracks Area Coverage: Example + + + +
+
+ +
Layer Properties: Tracks Area Coverage +Offers basic controls whether it is enabled or not and includes the size of the tile. +
+ +
Layer Properties: TAC Advanced +Controls subsets of TAC drawing are calculated and shown with their colour and opacity. +Note for Max square coverage, ATM it will only draw the first square encountered, although there may be more than one such area. +Note for Cluster coverage, ATM it will only draw the first cluster encountered, although there may be more than one such area. +
+ +
Layer Operations + +The following are available on Aggregate Layers: + + +
New Layer + +Add a new layer of the selected type. + +
+ +
Sort + +The list within the treeview can be sorted. + + +Alphabetical and Date sorts are available. + + + +Generally it is not useful to sort the Top most layer. Sort is mainly intended for Aggregate groups of TrackWaypoint layers. + + +
+ +
Track List + +Selecting this opens a dialog listing all the tracks in a table along side statistics such as track length and maximum speed. +Each column header is clickable and will reorder the list according to that particular column. +You can also rearrange the columns via dragging the column header to the new location. + + +This table may be invoked from a variety of different layer levels and will then list only the relevant tracks (and/or routes). + + +Aggregate Layer +Lists Tracks and Routes and the TrackWaypoint Layer they are in + + +TrackWaypoint Layer +Lists Tracks and Routes + + +TrackWaypoint Track sublayer +Lists Tracks only + + +TrackWaypoint Route sublayer +Lists Routes only + + + + +
+Track List Dialog: Example +
+ +This is showing all tracks and routes (although there are no actual routes here!) in multiple TrackWaypoint layers, that has been sorted by height. +Note that routes will not have timestamps or speeds, but may have elevations and should have some distance! + +
+ + + +
+
+ +Hovering the mouse over an entry will show a tooltip of the comment or description if it is available. + + +Each entry in the track list can be selected and on mouse right click offers these options: + + +View +Move the viewport to the area of the item and highlight it. + + +Statistics +Opens the Properties dialog on the tab. Note this will close the track list dialog. + + +Copy Data +Copy the data fields as text. + + + + +If multiple entries are selected the only right click option is Copy Data. +This copies the individual data fields as plain text separated by tab characters, ideal for pasting into other applications in particular spreadsheet programs. +Note that the order of the fields copied is the default column ordering (irrespective to how they may have been rearranged). + +
+ +
Waypoint List + +Selecting this opens a dialog listing all the waypoints to give a overview of the waypoint information. +Each column header is clickable and will reorder the list according to that particular column. +You can also rearrange the columns via dragging the column header to the new location. + + +This table may be invoked from a variety of different layer levels and will then list only the relevant waypoints. + + +Aggregate Layer +Lists Waypoints and the TrackWaypoint Layer they are in + + +TrackWaypoint Layer +Lists Waypoints + + +TrackWaypoint Waypoint sublayer +Lists Waypoints + + + + +
+Waypoint List Dialog: Example +
+ +This was invoked on a TrackWaypoint layer and shows all waypoints from that single layer. It has been sorted by the symbols. + +
+ + + +
+
+ +Hovering the mouse over an entry will show a tooltip of the description if it is available. + + +Each entry in the list can be selected and on mouse right click offers these options: + + +View +Move the viewport to the area of the item and highlight it. + + +Properties +This will open the properties dialog. Note this will close the waypoint list dialog. + + +Show Picture +If enabled, this will open the associated image in an external Image Viewer program. + + +Copy Data +Copy the data fields as text. + + + + +If multiple entries are selected the only right click option is Copy Data. +This copies the individual data fields as plain text separated by tab characters, ideal for pasting into other applications in particular spreadsheet programs. +Note that the order of the fields copied is the default column ordering (irrespective to how they may have been rearranged). + +
+ +
Visibility Options + +This offers a quick way to set all the visibilities of each item within the containing layer, rather than having to change each one individually. + + +Show All +Ensures all items are set to be visible. + + +Hide All +Ensures all items are set to be invisible. This is useful for then turning on single items afterwards so the display is not cluttered. + + +Toggle +Inverts the visibility status of each item. + + + +
+ +
Search by Date + +This opens calendar dialog to select a date to search by within this Aggregate layer. +The first item that is found on that date will be selected. +Tracks are searched first in preference over waypoints. + +
+ +
Statistics + +This opens a dialog to display various statistics about all tracks contained within this Aggregate layer. + +
+Statistics Dialog: Totals + + + +
+ + + This currently generates a simplified Eddington number. + In that a per track length value is used, rather than trying to work out a length per day. + (i.e. doesn't combine multiple tracks for a single day or split very long tracks into days). + The Eddington number is in the current Unit distance . + + +
+Statistics Dialog: Years + + + +
+
+ +
Append File + +This opens a dialog to select files to load within this Aggregate layer. + +
+ +
Tracks Area Coverage->Calculate + +Start a new Tracks Area Coverage calculation. + +
+ +
Tracks Area Coverage->Remove + +This clears the Tracks Area Coverage information, thus no grid colouring will be displayed. + +
+ +
+
+ + + + + + + +
Coordinate Layer + +This layer is allows drawing of grid lines on the viewport. + +
+ + +
Tools + +&appname;'s mouse actions on the viewport are controlled by which tool is active. Only one tool can be active at a time. The default mode is pan. You can return to the default mode by pressing Escape. + + +You can use the scroll wheel, the middle-click, the middle-click+drag to zoom, center map at position and pan respectively no matter what tool you are using. + + +Scroll: zoom in and out keeping the mouse over same location + + +Ctrl-scroll: pan north-south (also Ctrl-up, Ctrl-down) + + +Shift-scroll: pan east-west (also Ctrl-left, Ctrl-right) + + +Ctrl-shift-scroll: zoom in and out, without changing the center (also Ctrl+, Ctrl- [*not* KeyPad +/-]) + + +Middle-click: make the clicked point on the map the center + + +Middle-click and drag: pan + + +
Pan + +This is the default mode of operation for &appname;. + + +This mode is entered by clicking on the toolbar icon: + + +Pan moves the viewpoint. A single click centers the viewport at that point, whereas click and drag dynamically moves the view around. +This is the default tool. + + +This mode can also be entered by the keyboard shortcut Ctrl+Shift+P + + +Double clicking the left mouse button will zoom the map in. +Shift + double clicking the left mouse button will zoom the map out. +Double clicking the right mouse button will also zoom the map out. + +
+ +
Zoom + +This mode is entered by clicking on the toolbar icon: + + +Zooms in and out on the clicked part of the map or by the selected area. + + +This mode can also be entered by the keyboard shortcut Ctrl+Shift+Z + + +Ctrl + left or right click: Zoom in/out and center the map on the clicked location + + +Shift (and hold) + left mouse button: Draws a bounding box area on which to zoom in. The zoom action is performed when the left mouse button is released. + + +Shift + left click button: Jump Zoom In by up to factor of 3 standard zooms. + + +Shift + right click button: Jump Zoom Out by up to factor of 3 standard zooms. + +
+ +
Ruler + +This mode is entered by clicking on the toolbar icon: + + +The ruler is used to measure either: + + + +The bearing and distance between two points: Click on first point and then move the mouse point around - the values will be continually updated. +A second click will freeze the ruler at that point. + + + +An area: Shift (and hold) + left mouse button: Draws a bounding box area. Area values are shown in the statusbar and on the viewport. +Releasing the mouse button will freeze the area at that point. +The viewport label option is controlled by . + + + + +This mode can also be entered by the keyboard shortcut Ctrl+Shift+U + +
+ +
Version1.1+: Select + +This mode is entered by clicking on the toolbar icon: + + +The select tool allows one to choose any waypoint or track by clicking on it (or reasonably near) in the viewpoint. + + +ATM to select a track one must actually click on a trackpoint, which is also selected. + + +This mode can also be entered by the keyboard shortcut Ctrl+Shift+S + +
+ +
TrackWaypoint Layer Tools + +You must have a Layer selected to use these tools. + +
Create Waypoint + +Enable this tool by clicking on the toolbar icon: + + +Left click will open the new waypoint dialog using the specified position. + +
+ +
Create/Edit Track + +Enable this tool by clicking on the toolbar icon: + + +General track edit/create tool. +The first left-click will create a new track and you will be asked to enter a name for the track. +If Shift is held, a track will be continued from a nearby trackpoint. +Subsequent left-clicks will add new trackpoints. +If Shift is held, the track will be joined to an existing track at the point selected. +If Ctrl is held, it will jump the new trackpoint position to a nearby existing trackpoint. + + +Right click or Backspace: undo one point. + + + + + +Double click or Escape: to finish track creation. +Finishing the track is also available via the right click and track menus. + + +One must finish the current track to be able to create another track. + + +Keypad Add or ]: Insert point after current point. + + +Keypad Minus or [: Insert point before current point. + + +Left: Select the previous point. + + +Right: Select the next point. + +
+ +
Edit Route + +Enable this tool by clicking on the toolbar icon: + + +This operates in exactly the same way as the Edit Track above. + + +One must finish the current route to be able to create another route. + + +One can switch between the Edit Route and Route Finder tools while editing routes. + +
+ +
Create Route Using the Route Finder + +Enable this tool by clicking on the toolbar icon: + + +Requires an internet connection. +Left click to create a new trackpoint. +If it's the initial trackpoint you will be asked to enter a name for the route, otherwise the default routing engine will be queried to find a route to the new trackpoint. +Right click or Backspace: remove the last added route. + + +Escape: to finish route creation. +Finishing the track is also available via the right click and track menus. + + +One must finish the current route to be able to create another route. + + +One can switch between the Edit Route and Route Finder tools while editing routes. + +
+ +
Track Splitter + +Enable this tool by clicking on the toolbar icon: + + +Use this tool to split a track or route. +After enabling the tool, click on the track/route point of the track/route at the position where you want the split to occur. + +
+ +
Edit Waypoint + +Enable this tool by clicking on the toolbar icon: + + +Left Click/drag: select/move a waypoint. +If Ctrl is held at the same time, it will jump the waypoint position to a nearby existing trackpoint. +If Shift is held at the same time, it will jump the waypoint position to a nearby existing waypoint. + +Right-click on waypoint: opens a menu with waypoint actions (the +same menu accessed by right-clicking the waypoint in the layers panel) + +
+ +
Edit Trackpoint + +Enable this tool by clicking on the toolbar icon: + + +Left click near a trackpoint (in screen pixel terms) to bring up the Track Point Edit dialog on that trackpoint. +Whilst the edit dialog is already open, left click again and drag enables moving of the trackpoint. +If Ctrl is held at the same time, it will jump the new trackpoint position to a nearby existing trackpoint. + +
Edit Trackpoint Dialog + +Editing options in the Trackpoint Edit dialog include: + +Edit the trackpoint name +Changing raw lat/long position and altitude +Forward (go to the next trackpoint) +Back (go to the previous trackpoint) +Delete +Insert. Inserts a point halfway to next trackpoint +Split. + + + +Several fields are read only for reference purposes, values are shown if the trackpoint has such information: + +Time. +Speed and course. +'Between' values: Speed, Time Difference and Distance Difference. When moving between trackpoints (via the Back and Forward buttons) these values are calculated. +GPS precision factors. + + + +
+Trackpoint Edit Dialog: Example + + + +
+One must have been going downhill here to get a reasonable speed by bicycle! +
+
+
+ +
Show Picture + +Enable this tool by clicking on the toolbar icon: + + +Opens an image viewer with the picture associated with the waypoint. +By default this uses the default system image viewer. +For Linux you can override this with the setting in the + +
+ +
+ +
Georef Map Layer Tools + +You must have a Map Layer selected to use these tools. + +
Georef zoom + +Enable this tool by clicking on the toolbar icon: + +Changes the zoom level of the georeferenced map and changes the +&appname; zoom level accordingly. Useful if you are trying to match GPS +data to a georeferenced map. + +
+ +
Georef move + +Enable this tool by clicking on the toolbar icon: + + +Drag to move the georeferenced map. + +
+
+ +
Map Download + +You must have a Layer selected to use this. + + +Enable this tool by clicking on the toolbar icon: + + +Click to download a single tile. Drag to download tiles in the dragged rectangle area. + + +Right-click to redownload tiles via the selected method. Right-click and drag to redownload tiles in the dragged rectangle area by the selected method. +The possible methods to redownload one or more tiles are: + + + + +Bad +Only if the tile is corrupt in some way or missing, then this will download a new copy + + +New +Refresh the tile according to the local map cache and if server has a newer version + + +All +Redownload the tile + + + +Map Tile Information + +By right clicking on viewport and selecting Show Tile Information you can see the tile properties of this location for the current map layer and current zoom level. +This includes the remote source URL for the tile and the cached version on the local filesystem with timestamp details. + + + +
+Map Tile Info Dialog: Example + + + +
+This is using MapQuest at &appname; zoom level 128 over the Isle of Wight, UK. +
+
+ +
DEM Download + +You must have a Layer selected to use this. + + +Enable this tool by clicking on the toolbar icon: + + +Click to download and import a DEM file. + +DEM File Information + +By right clicking on viewport and selecting Show DEM File Infomation you can see the file properties of the DEM file for this location. +This includes the remote source URL for the file and the cached version on the local filesystem with timestamp details. + + + +
+DEM File Info Dialog: Example + + + +
+This is for block 51N, 003W - covering Bristol in the UK. +
+
+ +
Webtools + +Many services are available only via a web browser (Google Maps, OpenStreetMap Potlach editor, etc.). + + +Jumping from &app; to such service can become annoying. + + +&appname; allows you to open such service directly at the position currently viewed in &app;. + + +This feature is called Webtools. It is also known as External Tools. + +
+ +
+ + +
Preferences +
General +
Localisation +You can select units displayed by &appname; to best fit your usage. +
+Properties dialog: units part + + + +
+Concerning degrees, you can select the way to display them: + + +DDDdecimal degree + + +DMMpartial sexagesimal display: degrees, minutes and decimal part of minutes + + +DMSsexagesimal display: degrees, minutes and seconds + + + +
+Properties dialog: degree display options + + + +
+
+
Waypoint Icon Size +An option exists to control the icon (symbol) size used for waypoints + +
+
<emphasis>Home</emphasis> Default Location: Latitude and Longitude +You can set the Home location directly by inputting the latitude and longitude in decimal degrees. + +
+
Time Display +This controls the reference timezone that times are shown in. +Locale is the current user's system preference. This was how all times were shown up to version 1.5. +World will attempt to determine the timezone at an object's position. +UTC enforces this standard timezone. +
+
Tile's age +This age is used to decided wether or not a new request to tile server must be done. + +Changing this value, you will increase or decrese the network load. +
+
Default map layer directory +This property sets the default directory of the tiles cache. +This value is used when you create a new map layer. + +You are still able to change this value in each map layer properties. +
+
Map Cache Memory Size +This controls the amount of maps that are stored in memory, rather than having to reread from disk. +Generally if you have a system with lots of memory it's recommended to increase this value. + +
+
+ +
Export/External +
KML Export Units +Allows setting the units used when saved as the KML file type, such as Metric or Statue units +
+
GPX Track Order + + Other software may display tracks in a particular order (often the order saved into the file). + This allows you to control the order they are saved when exporting to a GPX file. + +
+
GPX Waypoint Symbols +Some GPS devices require waypoint symbols to be in a particular case. +E.g. On a Garmin Oregon 450 they must be in Title Case to be recognized. +
+
Image Viewer (Not Windows) +Allows setting the program used to view images associated with Waypoints. +By default this is set to xdg-open which should open the system's default image viewer, however this can be overridden with this setting. +Note: for Windows systems, viewing images associated with Waypoints always uses the system's default image viewer. +
+
External GPX programs +Allows setting the programs invoked via the Layer menu Export LayerOpen With 'program' +Two options are given so that it can be configured for various uses such as: + +An OSM editor (default) +Some other user defined program + +
+
GPSBabel +This allows setting the specific location of GPSBabel. +&appname; will need to be restarted for this setting to take effect. +
+
Auto Read World Files +If this is on, when a new image is selected for the GeoRef layer then the associated world file will be read to find the scale and positional properties. +The associated file is based on filename patterns; e.g. if the image is filename.jpg - then the world file may be filename.jpgw or filename.jgw +
+
Auto Device GPX Simplify +If this is on, GPX files will be simplified (using GPSBabel) if they are saved into a special location (by default a Garmin device location in OS file system). +Extra parameters used in process such as the location and limits applied can be refined by export_device_* values in . +A warning message is displayed when this occurs so one can consider if manually managing the tracks is needed, e.g. see methods. +The main intention for this is to prevent writing GPX files that are only partially useful. +For instance on a GPS Etrex 20 device: if a track with 1000 points is saved to it, the device will only read in the first 500 points, +thus effectively making only 1/2 of the track available. +Hopefully a simplified track will be more useful to follow to your destination when one is out in the wilds, than only a section of it. + +You will need to set the appropriate limits for your device, as this is not currently auto detected. +
+
+ +
Advanced +
Save File Reference Mode + + Files referenced within project files can be saved with either absolute or relative paths. + Using relative paths can be useful when copying the project file and the associated files between different systems. + +
+
Ask for Name before Track Creation +A setting to control whether an automatic name is used when creating a new track or route, or whether you are asked to enter a name. +
+
Show Tooltip during Track Creation +A setting to control whether the tooltip with the cumulative track or route distance is shown when creating tracks and routes. +
+
The number of recent files + + The number of recent files shown in the FileOpen Recent File menu. + A value of -1 means all files. The new value applies to New Windows only (or on application restart). + +
Open files in selected layer +A setting to control whether non Viking format files (i.e. typically GPX or KML files) will open in the selected TrackWaypoint Layer. +When no TrackWaypoint Layer is selected (or the layer is invisibile) then the file will be open in the default manner: at the top level. + +
+
Show calendar day names +A setting to control whether the calendar displays day names (Mon, Tue, etc...) or not. + +
+
Ruler area label position +A setting to control the position of the label drawn on the viewport that shows the area value. Includes a setting to turn off the label. + +
+
Use Scroll to Zoom +A setting to control if scroll events cause the viewport to zoom (rather than moving). Useful with mouse scroll wheels, but less intuitive for touchpads. + +
+
Invert Scroll Direction +A setting to control the direction of scroll events. Especially useful with touchpads and can be used to override the desktop system's setting. + +
+
+
+ +
OpenStreetMap Traces +
OAuth Method + + Using the OAuth method means that your OSM account details are no longer needed to be known by &appname;. + Instead specific tokens are generated for use only by &appname; which are associated with your OSM account. + +Get New OSM Access Tokens + Use this button to generate a new OSM Access Token Key and Secret. + You will be redirected to the OSM website to confirm allowing &appname; to access the GPX Traces features. + The tokens returned by the OSM website will be stored in the Access Token Key + Access Token Secret preferences. + +Access Token Key + Access Token Secret: +These are the values used, however one typically does not need to manually change them. +
+
HTTP Basic Authentication (Discouraged) +OSM Username + Password +Store your OSM details here, so that you don't need to enter it in every time in the procedure. +This is not recommended and one should use the OAuth method using access tokens described above. + + +Your OSM password will be stored in plain text. + + + + +This password is transferred unencrypted in every request sent to the OpenStreetMap server. This is due to the use of OpenStreetMap's basic authentication method. + + + + +When OAuth capability is built into &appname; (the default), use of HTTP Basic Authentication can only be used if the osm_basic_auth is enabled. + + +
+
+ +
Mapnik + +If any changes to these settings are made, you will need to restart &appname; to make them be applied. + + +
Plugins Directory +The location of Mapnik plugins. An attempt is made to automatically determine the initial value, + however if this is wrong or Mapnik is upgraded then the directory can be set here. +
+
Fonts Directory + +The location of fonts for use with Mapnik. Normally it is best to simply use the System's font directory. + +
+
Recurse Fonts Directory +Load fonts in any sub-directories of the main font directory. +
+
Rerender Timeout +The time in hours before any tile is rerendered. +This is useful in case the underlying source data for the tiles changes (e.g. OSM data is continually evovling). + &appname; normally has no way of knowing when the data has changed, so this simple timeout method is provided to maintain consistency of the tile images. +
+
CartoCSS +This allows setting the specific location of the carto executable. +
+
Threads + + The number of threads to use for Mapnik rendering tasks. + By default the value is set to the 1 in case of any multi-threading rendering code chain crashes. + Otherwise trying setting the value to the number of the CPUs of the system minus one (so as not to overload the system), in order to minimise the overall rendering times. + +
+
+ +
Routing +
Routing engine +You can select the routing engine used by default, ie by features that do not propose a live selection, like . +
+
+ +
Startup +Naturally since these preferences effect the startup, the values will not be used until &appname; is restarted. +
Restore Window Setup +When this is enabled, the main window size and layout (such as whether the statusbar or layers panel are shown) is restored to the values from last use. +
+
Default Map Layer +When this is enabled, a map layer is automatically added whenever &appname; is opened and a &appname; file is not to be loaded. +The map layer used is defined by the map layer's default values. +
+
Startup Method +Enables selection of how the startup position should be determined. + + +Home Location (default) +Position as set by the Set the Default Location + + +Last Location +Uses the last position viewed on the viewport + + +Specified File +Load the file as specified below + + +Auto Location + + Uses the GeoClue service if available + or otherwise the web service hostip.info to attempt to determine your location via IP lookup + + + + +
+
Startup File +Loads this specified file when the Startup method is set to Specified File +
+
Check For New Version +Periodically (no more than once every 14 days), check to see if there is a new version of &appname; available. +
+
+ +
Toolbar +
Append to Menu +Allows setting the toolbar on the same vertical space as the menu, thus increasing vertical space for the map. +
+
Icon Size +Allows configuration of the icon size, including overiding the system's default preference to the setting desired just for &appname;. +
+
Icon Style +Allows configuration of the icon style, including overiding the system's default preference to the setting desired just for &appname;. +
+
Customize +Opens the Customize Toolbar dialog. +From this dialog the items in the toolbar can be added, removed and reordered. Reordering of items is performed by drag and drop. +
+Customize Toolbar dialog + + + +
+
+
+ +
+ + +
Howto's +
Getting Started + +&appname; from version 1.5 has several features to ease the start up process. +On the very first run, you will be asked if you want to enable these features which make use of an Internet connection. +If you select no or you have upgraded from an earlier version you can choose to enable any of the startup options via the . + + +Some other general use cases for using &appname;, are as follows: + +
Go to an area of interest + +&appname;'s default location is a Manhatten, New York, USA, so you may need to pick another place that interests you - such as where you live. + + +Method A + + + Use the online location address/place search. + + + Use the Go to Location toolbar button or from the menus + ViewGo to Location. + You can change the search location provider if desired. + Enter the name of place you wish to go to (you may need to specify the country to refine the search). + Also you can enter a post code or a ZIP code instead. + + + You will need an internet connection for this search to work + + + + +Method B + + + If you know the coordinates of where you want to view: + + +Use View and select from either Go to Lat/Lon or Go to UTM and then enter in the specific coordinates. + + + + +Method C + +Use the GPS Layer or FileAcquireFrom GPS +to load data directly from your GPS into &appname;. + +You can specify the types of data to acquire: Tracks, Routes and/or Waypoints. + + +You must have write permission to the port used. For Unix like OS: + + /dev/ttyS0 is the first serial port + /dev/ttyUSB0 is the first USB port + usb: is any USB port + +Depending on your distribution only one of the USB port types may work +For Windows: + + com1: is the first serial port + usb: is any USB port + + + + The GPS devices supported are those supported by GPSBabel. + Garmin and Magellan GPS devices supported by all versions, later versions of GPSBabel support more devices such as DeLorme and Navilink. + + + + +Method D + + +Get data from files in GPX or KML format, which can be opened directly. +Use FileOpen + + +Other formats can be imported that are supported by GPSBabel. +FileAcquireImport File With GPSBabel... + + + +The viewport will be automatically moved and resized to view the contents of the file. + + + + +
+
Add a Map Layer + +Use LayersNew Map Layer, and choose a suitable cache directory +where you would like to store your tracks and click OK. Zoom to a +comfortable level (I suggest 4 mpp) by clicking the left and right +mouse buttons on the gray area where your tracks are. Now from the menu +choose the Tool. Click where you would like to download a +map. Regardless of what tool you are using, the middle mouse button +always pans. + + +You need an open internet connection when you are downloading maps. + + + +If you can no longer see your tracks or waypoints and only the map, +it is because the layer named Map is ABOVE your TrackWaypoint layer that your GPS data is in. +This means that it will be drawn last and on top of the other . +Look at the to the left which shows this order. +Select the Map layer from the list and click the down arrow button beneath the list until the Map layer is below the TrackWaypoint layer. +Your tracks will now be drawn over the map. + +
+ +
Set Your Home Location + + You can save the current center position of the viewport as the default location AKA the Home Location by + EditSet the Default Location. + + + Then at any time you can return to this place by clicking on the Home icon on the toolbar. + + + You can also set the default location via specifing the exact latitude and longitude in the . + +
+ +
+
From 1st startup to GPS track (including offline maps) + +The first you'll see is an empty map, because &appname; in its default configuration will download maps only on demand. +Before fetching unneeded data, one can position to a location of interest, e.g. Stuttgart: ViewGo to Location, enter Stuttgart. + +
Fetching the maps + +Map + + +LayersNew Map Layer +in the layer properties dialogue choose e.g. OpenStreetMap (Mapnik). + +For the moment, we keep the default Maps Directory (the directory in +which the maps will be stored and can be used for offline usage). + + +Check Autodownload maps and keep the zoom level as Use Viking +Zoom Level. + + +however, that these settings will play an important +role in the pre-fetch for offline usage discussed later + + + + +You'll see a map of Stuttgart. Using the mouse wheel, you can +zoom in and out. The maps for the choosen resolution will be downloaded +automatically. + + +DEM Layer (Height Map) + + +Zoom out to 512. +LayersNew DEM Layer +Keep the download source as is (SRTM Global 90m), hit OK. + + +In the layer listing on the left, the layer should reside +above the map layer. If this is not the case, highlight the DEM layer +an shift it one up (using the arrow up button). + + +highlight the DEM layer in the layer listing on the left +in the toolbar, check DEM layer download/import (the last symbol) +a left-click in the map window should then fetch the DEM data + + +This might take some time. + + +Sometimes, a tile does not show up correctly (you might see only a +black frame in the map window) because it got corrupted during +transfer. In order to correct this, you can delete the corresponding +datafile in the cache. right-click the DEM layer properties + + +The DEM Files listing allows you to delete the specific tiles (alternatively do this from the command line). + + +You can also alter the Min. and Max. elevation in this dialogue. + + +
+
GPS Track with Height Profile + +Uncheck the layer (the map is shown again) + + LayersNew TrackWaypoint Layer + Ensure the new track layer is above the map layer. + +Expand the layer, select Tracks +In the tools menu choose Create Track + +Leftclick in the map window, enter a name + + Click several times to generate a track (a right-click removes the last point). + Height data is set automatically since DEM data is available + +Expand tracks in the layer menu, your track should show up, select it +Right click your track, select Properties +Click the tab Elevation-distance - enjoy the plot + + +In order to save this setting for later usage + + +click OK in the Track Properties dialog +FileSave As, choose a name (you can open this view later via fileOpen). + + +
+
Usecase: offline data for holiday + +Suppose you want to have the and data offline for your holiday in Italy near Bologna. + + +Start a new &appname; session. +ViewGo to Location, enter Bologna +LayersNew Map Layer +Choose e.g. OpenStreetMap (mapnik). +adapt the maps directory e.g. to /home/user/.viking-map-holiday/. +This allows you to delete the map stuff after holiday without purging the rest of your maps. + +check autodownload map +keep viking zoom level +zoom out to 1024 +add a layer (as discussed above) +download the DEM data + +In the &app; version discussed here, the DEM data automatically +are stored in /home/user/.viking-maps/. You can move the corresponding +tiles into .viking-map-holiday/ if you like. + + +Download map data for all zoom levels + + +uncheck the DEM layer for the map to show up +navigate the map to be centered at Bologna +choose the zoom such, that all regions of interest are displayed in the map window (e.g. 1024) + +follow this sequence until you have all tiles for all zoom levels you need + +right-click the map layer properties +set the zoomlevel explicitely one below the last (in the first cycle 512), hit OK +right click the map layer Download Missing Onscreen Maps +wait until all tiles for that resolution have been downloaded + + + +This may take some time and some hard disk capacity. + +Do not forget to save your configuration (as discussed above). + + +
+ +
+
OpenStreetMap project + +OpenStreetMap (OSM) is a collaborative project to create a free editable map of the world. +One of the sources of data for this project is GPS tracks. +&appname; supports this project via the GPS Traces methods, both uploading and downloading such data. + + + Authentication/authorization is required to use these services. See . + + +Also see for further detail. + +
Uploading data to OpenStreetMap + +It is possible to upload data directly from &appname; to OpenStreetMap. + + +Upload a layer + +One solution is to upload whole a layer. To do this, +simply select the layer and right click on it. Then, select Upload to +OSM. + + + +Upload a single track +Another solution is to upload an individual track. Simply select the track and right click on it. +Then select Upload to OSM. + + + +Fill in the form + +The filename is the name you want your upload has on the server. This information is displayed by the osm server. +The description is some descriptive information. +The tags field is a white space separated list of tags. + + +
+ +
Downloading Traces from OpenStreetMap + +It is possible to download GPS traces directly from OpenStreetMap into &appname;. +This feature can be really useful for checking existing data before uploading new ones. + + +Download all visible tracks +One solution is to select + +File +Acquire +OSM traces... +. +Each request can get up to 5,000 points. +The dialog box allows setting which group of 5,000 points to get. These groups are known as Page Numbers which start at 0. +Increasing the page number parameter allows one to request the subsequent sets of point groups. + + +
+
Downloading Your Own Traces from OpenStreetMap + +It is possible to download any of your personal GPS traces previously uploaded to OpenStreetMap into &appname;. + + +Initially this will return the list of your OSM Traces, from which you can select which specific traces to retrieve. +This list can be sorted on each column so that it easier to find an individual trace or select a group of traces by similar properties. + +
+ +
+ +
Geotagging + + This assumes you already have a layer enabled for ease of use (if not see above to get one). + +
Manual Positioning + + This is useful for instances when you already know exactly where the image was taken (no need for tracklog). + Or maybe you want to adjust an automatically generated waypoint for the position of the subject of the image rather than the location that the photograph is taken from. + ATM this process only works on an individual image, so it will be tedious for handling lots of images. + + + First create a layer or use an existing one; and select it in the . + NB Make sure this layer is above the map layer in the Layers Panel list. + Create a new waypoint (or move an existing one) to exact location desired: + + Select the tool, then left click on the map at the location desired, choosing an image to associate with it in the new waypoint dialog + Select the tool, then left click on waypoint to be moved. Left click again and drag the waypoint to the location desired + + Then using the Select tool left click on waypoint to select it, then right click to access the Waypoint properties menu, then choose + Update Geotag on ImageUpdate + + + The Update Geotag on Image options are only available when a waypoint has an image associated with it. + +
+ +
Automatic Positioning Against a Tracklog + + First you will need a tracklog with timestamps in it. Either load one from a previously saved file or freshly acquired from a GPS device - + see Getting Started. + It helps if this is the track that was recorded at the time you took some photographs! + + + Select the track either from the layers panel on the left or via the viewport using the tool. + Then right click on it and chose the Geotag Images... leading you to the Dialog. + + + Load some images that where taken around the time the track log was recorded. Confirm the other options in the dialog - normally the defaults should be alright and select OK. + If things are succesful, new waypoints with thumbnail images of the photographs will appear. + You should probably check they are really in the right place as often the timestamp of the camera may not be aligned to the GPS correctly leading to inferring incorrect locations. + +Option: Overwrite Waypoints + + This is particularly useful when one finds an attempt at geotagging gives wrong locations, often due to time offset issues. + Simply try again with a new time offset (often 1 hour adjustments due to Daylight Savings or Summer Time times) and the old waypoints will be updated (instead of creating new ones). + + + + If you have multiple tracks in a TrackWaypoint layer, then invoking the Geotag Images... action on the layer + will search all the tracks to find location matches. + +
+
+ +
GPS Real Time Location + + &appname; relies on gpsd to provide the current location from a real time feed from a GPS device. + + + This assumes you already have a layer enabled for ease of use (if not see above to get one). + + + Turn on the GPS Device, ensure it has figured out it's location and plug it in to your computer. + +
Set Up GPS Layer + + You will need a layer. One can be added via LayersAdd GPS Layer. + + + Adjust the Realtime Tracking Mode settings to interface with gpsd as necessary. Normally the defaults should suffice. + + + Current Linux distributions should run gpsd automatically when a GPS Device is plugged in. Otherwise you may have to run gpsd manually. + + + Then right-click the layer and select Start Realtime Tracking. + Hopefully the viewport should jump to the GPS location. + + + Troubleshooting checklist: + +Confirm gpsd is running. +Confirm on the GPS device it has a location. +Confirm the Realtime Tracking Mode settings. +
+
+ +
What to Do if &appname; Does Not Seem to Work + +In order to get some information about what &appname; is doing, start it in verbose debug mode via the command line: +viking -dV + + +NB For Windows the process is slightly more involved as the output is typically not shown in the command prompt, +so you have to redirect the output to a file, e.g. open the command prompt and then: + +cd "C:\Program Files\Viking" +viking -dV 2>1 > %TMP/viking.log + +Then close &appname; before viewing the output file, such as: +notepad %TMP/viking.log + + +For instance you can check the correct URLs &appname; is using in requesting remote data for DEMs or map tiles in the verbose debug output. +E.g. Something like this for DEMs: + +** (viking:28778): DEBUG: curl_download_uri: uri=http://dds.cr.usgs.gov/srtm/version2_1/SRTM3/Eurasia/N48E008.hgt.zip +* About to connect() to dds.cr.usgs.gov port 80 (#0) +* Trying 152.61.128.95... * connected +* Connected to dds.cr.usgs.gov (152.61.128.95) port 80 (#0) + GET /srtm/version2_1/SRTM3/Eurasia/N48E008.hgt.zip HTTP/1.1 +User-Agent: viking/0.9.8 libcurl/7.18.2 GnuTLS/2.4.2 zlib/1.2.3.3 libidn/1.8 +Host: dds.cr.usgs.gov +Accept: */* + HTTP/1.1 200 OK + Date: Sun, 26 Jul 2009 18:13:38 GMT + Server: Apache + Last-Modified: Tue, 21 Jul 2009 19:57:35 GMT + ETag: eac3f8-1828f5-46f3caa76070a + Accept-Ranges: bytes + Content-Length: 1583349 + Content-Type: application/zip + +* Connection #0 to host dds.cr.usgs.gov left intact +* Closing connection #0 +** (viking:28778): DEBUG: dem_layer_add_file: /home/username/.viking-maps/srtm3-Eurasia/N48E008.hgt.zip + +Or for OSM Mapnik tile server: + +* About to connect() to tile.openstreetmap.org port 80 (#0) +* Trying 193.63.75.28... * connected +* Connected to tile.openstreetmap.org (193.63.75.28) port 80 (#0) + GET /13/4065/2748.png HTTP/1.1 +User-Agent: viking/0.9.96 libcurl/7.20.1 GnuTLS/2.8.6 zlib/1.2.3.4 libidn/1.18 +Host: tile.openstreetmap.org +Accept: */* + +* HTTP 1.0, assume close after body + HTTP/1.0 200 OK + Date: Thu, 14 Oct 2010 22:18:42 GMT + Server: Apache/2.2.8 (Ubuntu) + ETag: "b66ff9d46474bab68262a3483428a232" +** (viking:16704): DEBUG: curl_get_etag_func: ETAG found: "b66ff9d46474bab68262a3483428a232" + Content-Length: 17194 + Cache-Control: max-age=94805 + Expires: Sat, 16 Oct 2010 00:38:47 GMT + Content-Type: image/png + Age: 5153 + X-Cache: HIT from konqi.openstreetmap.org + X-Cache-Lookup: HIT from konqi.openstreetmap.org:3128 + Via: 1.1 konqi.openstreetmap.org:3128 (squid/2.7.STABLE7) + Connection: close + +* Closing connection #0 +* About to connect() to a.andy.sandbox.cloudmade.com port 80 (#0) +* Trying 178.63.75.195... ** (viking:16704): DEBUG: curl_download_uri: uri=http://tile.openstreetmap.org/13/4065/2749.png +* About to connect() to tile.openstreetmap.org port 80 (#0) +* Trying 193.63.75.28... * connected +* Connected to a.andy.sandbox.cloudmade.com (178.63.75.195) port 80 (#0) + GET /tiles/cycle/13/4065/2747.png HTTP/1.1 +User-Agent: viking/0.9.96 libcurl/7.20.1 GnuTLS/2.8.6 zlib/1.2.3.4 libidn/1.18 +Host: a.andy.sandbox.cloudmade.com +Accept: */* + +* connected +* Connected to tile.openstreetmap.org (193.63.75.28) port 80 (#0) + GET /13/4065/2749.png HTTP/1.1 +User-Agent: viking/0.9.96 libcurl/7.20.1 GnuTLS/2.8.6 zlib/1.2.3.4 libidn/1.18 +Host: tile.openstreetmap.org +Accept: */* + +* HTTP 1.0, assume close after body + HTTP/1.0 200 OK + Date: Thu, 14 Oct 2010 23:44:35 GMT + Server: Apache/2.2.8 (Ubuntu) + ETag: "8e520ad47ce9c1b63430554886eb5fab" +** (viking:16704): DEBUG: curl_get_etag_func: ETAG found: "8e520ad47ce9c1b63430554886eb5fab" + Content-Length: 18094 + Cache-Control: max-age=87742 + Expires: Sat, 16 Oct 2010 00:06:57 GMT + Content-Type: image/png + X-Cache: MISS from konqi.openstreetmap.org + X-Cache-Lookup: MISS from konqi.openstreetmap.org:3128 + Via: 1.1 konqi.openstreetmap.org:3128 (squid/2.7.STABLE7) + Connection: close + + +
+ +
+ + +
+ Extending Viking + + Currently, &app; has some extention points based on configuration files. The file format is heavily inspired by the GtkBuilder file format: you specify the class of the GObject to build and set its properties. Technically, it is a XML file containing a "objects" root element. Inside this element, you set a collection of "object". + Here is an example: + + + Property value + Property value + + ... + +]]> + + + You can find more examples in the documentation part of the distribution. + + It is also possible to override the internal defaults e.g. to update any parameters should they change over time, + by adding the values into your configuration file. + When you define object group that already exists (and for Maps this means by a repeated Id key, but you may have to examine the source code to work out what the relevant Id values are) then you need to define all the other keys as well, otherwise they will be reset to the defaults. + +
+ Map Source + It is possible to add new map's sources. The file is ~/.viking/maps.xml for UNIX like systems, C:\Documents and Settings\username\.viking\maps.xml on Windows XP or C:\Users\username\.viking\maps.xml on Windows 7 onwards. + An example of the file is in the distribution doc/examples/maps.xml. Further examples and values are online in the Maps Wiki + + The VikSlippyMapSource allows to declare any map's source working like OpenStreetMap. It supports the following properties: + + + id + this is an integer and should be unique as it used to identify the map source + + + name + a string (should be unique) that is used for the OSM style cache directory name when the Map Cache directory is the default (~/.viking-maps) + + + label + the text displayed in the map's source selection dialog + + + hostname + the server's hostname (eg. "tile.openstreetmap.org") + + + url + + the parametrized address of the tile, in the spirit of C printf format, with 3 "%d" fields for Z, X and Y (in that order) (eg. "/%d/%d/%d.png") + + The full parametrized address can just be put in the URL field and the hostname field doesn't need specifying. + e.g. "https://tile.openstreetmap.org/%d/%d/%d.png" + + + + + zoom-min (optional) + The minimum zoom value supported by the tile server. The Default is 0 if not specified. + + + zoom-max (optional) + + The maximum zoom value supported by the tile server. The Default is 18 if not specified. + See Zoom Levels + + + + lat-min (optional) + The minimum latitude value in degrees supported by the tile server. The Default is -90 degrees if not specified. + + + lat-max (optional) + The maximum latitude value in degrees supported by the tile server. The Default is 90 degrees if not specified. + + + lon-min (optional) + The minimum longitude value in degrees supported by the tile server. The Default is -180 degrees if not specified. + + + lon-max (optional) + The maximum longitude value in degrees supported by the tile server. The Default is 180 degrees if not specified. + + + file-extension (optional) + + The file extension of the files on disk. The default is .png + If the tile source URL ends in something other than .png, then this parameter will need to match it. + This can also be useful in reading a tileset from other software which may name tiles in an alternative form, + e.g. for Mobile Atlas creator it names them .png.tile + The file types actually usable are those supported by GDK Pixbuf Library, which includes at least PNG and JPEG. + Remember to include the beginning '.' when specifying this parameter. + + + + use-direct-file-access (optional) + + Only use files on disk. The default is FALSE + This can also be useful for tilesets already on disk as it will avoid attempting to download any tiles. + Thus with this type the hostname and url parameters are not necessary and are ignored. + + + + switch-xy (optional) + + Swap the X,Y values around in the URL parametrized ordering. + The default is false. + + + + check-file-server-time (optional) + + Sends the timestamp of the tile to the server, so the server can decide whether it should send a new tile or not. + The default is false. + + + + use-etag (optional) + + Use and compare the ETag value in determining whether to download a newer tile. The default is false. + The ETag value is stored in a separate file in the same directory as the tile to enable checking the value across multiple runs of the program. + + + + tilesize-x (optional) + The tile x size. The default is 256 pixels if not specified. + + + tilesize-y (optional) + The tile y size. The default is 256 pixels if not specified. + + + scale (optional) + + The tile scale. The scale is 1 if not specified. + Use a value of 2 to represent high res tiles. + Don't change the tilesize as the internal display size is still based on 256 pixels. + + + + + + The VikTmsMapSource allows to declare any TMS service. It supports the following properties (as per VikSlippyMapSource above): + + + id + + + label + + + hostname + + + url + + + check-file-server-time (optional) + + + zoom-min (optional) + + + zoom-max (optional) + + + lat-min (optional) + + + lat-max (optional) + + + lon-min (optional) + + + lon-max (optional) + + + + The VikWmscMapSource allows to declare any WMS or WMS-C service. It supports the following properties (as per VikSlippyMapSource above): + + + id + + + label + + + hostname + + + url + + + check-file-server-time (optional) + + + zoom-min (optional) + + + zoom-max (optional) + + + lat-min (optional) + + + lat-max (optional) + + + lon-min (optional) + + + lon-max (optional) + + + +
+ +
+ Go-to search engines + It is possible to add new new search engines for the "Go-To" feature. The file is ~/.viking/goto_tools.xml. + An example of the file in the distribution doc/examples/goto_tools.xml. + Currently, there is a single object class available: VikGotoXmlTool. Such feature allows to declare any search engine using a XML format as result. + The related properties are: + + + label + the text displayed in the Go-To dialog + + + url-format + the parametrized address of the query, in the spirit of C printf format, with a single "%s" field (replaced by the query string) + + + lat-path + XML path of the latitude (eg. /root/parent/elem) + + + lat-attr (optional) + name of the attribute (of previous element) containing the latitude + + + lon-path + XML path of the longitude (eg. /root/parent/elem) + + + lon-attr (optional) + name of the attribute (of previous element) containing the longiude + + + + As a facility (or readability) it is possible to set both path and attribute name in a single property, like an XPath expression. To do so, simply set both info in lat-path (or lon-path) in the following format: /root/parent/elem@attribute. +
+ +
+ External tools + It is possible to add new external tools. The file is ~/.viking/external_tools.xml. + An example of the file in the distribution doc/examples/external_tools.xml. + The VikWebtoolCenter allows to declare any Webtool using a logic based on center coordinates and zoom level value. + The related properties are: + + + label + the text displayed in the menu entry + + + url + the parametrized URL to open, in the spirit of C printf format, with 2 "%s" and a "%d" fields for X, Y and Z (zoom level) (eg. "http://hostname/?lat=%s&lon=%s&zoom=%d") + + + + The VikWebtoolBounds allows to declare any Webtool using a logic based on bounds coordinates. + The related properties are: + + + label + the text displayed in the menu entry + + + url + the parametrized address of the tile, in the spirit of C printf format, with 4 "%s" fields for left, right, bottom and top (eg. "http://hostname:8111/load_and_zoom?left=%s&right=%s&bottom=%s&top=%s") + + + +
+ +
+ Routing engine + It is possible to declare new routing engines. The file is ~/.viking/routing.xml. + An example of the file in the distribution doc/examples/routing.xml. + The VikRoutingWebEngine allows to declare a routing engine available via HTTP. + The related properties are: + + + id + a string, should be unique as it used to identify the routing engine + + + label + the text displayed in the menu entry + + + format + + The GPSBabel format code to interpret the service response. By default a GPX response is expected and processed internally. However if the service returns different format then GPSBabel is used to transform the text into something that &appname; can understand. Only formats that GPSBabel supports can be used: e.g. 'gpx', 'kml', 'gtrnctr' (for Garmin Training Center .tcx files), etc... + Use gpsbabel --help on the command line to find out the supported file types and their codes to process them. + + + + url-base + the base URL of the web service (eg. "http://hostname/service?") + + + url-start-ll + the part of the URL setting the starting point location, parametrized in the spirit of C printf format, with 2 "%s" for coordinates (eg. "&start=%s,%s") + + + url-stop-ll + the part of the URL setting the end point location, parametrized in the spirit of C printf format, with 2 "%s" for coordinates (eg. "&stop=%s,%s") + + + url-via-ll (optional) + the part of the URL setting via point location, parametrized in the spirit of C printf format, with 2 "%s" for coordinates (eg. "&via=%s,%s") + + + url-start-dir (optional) + the part of the URL setting the starting point location for direction based routing, parametrized in the spirit of C printf format, with one "%s" for direction (eg. "&start=%s") + + + url-stop-dir (optional) + the part of the URL setting the end point location for direction based routing, parametrized in the spirit of C printf format, with one "%s" for direction (eg. "&start=%s") + + + url-ll-lat-first (optional) + The ordering of the lat/long terms in the Start, Stop and Via URL settings. By default this is TRUE. + For instance using Brouter services, the URL uses a pair of values which is longitude and then latitude. Thus setting this value to FALSE ensures the value substitution is performed in the necessary order. + + + referer (optional) + A URL to serve as referer for the HTTP request (eg. "http://hostname/") + + + follow-location (optional) + the max depth of recursive redirections + + + +
+ +
+ Remote File Datasources + It is possible to add web references expected to return a file which can then be opened directly or converted via GPSBabel. + The file is ~/.viking/datasources.xml. + An example of the file is in the source distribution doc/examples/datasources.xml. + The VikWebtoolDatasource allows to declare any URL using logic based on coordinates. + The related properties are: + + + label + the text displayed in the menu entry + + + url + + the parametrized URL to open in the spirit of C printf format, with up to 9 "%s" values. e.g. http://hostname/getfile?lat=%s&lon=%s + The order and meaning of these parameters is given by the url_format_code below + + + + url_format_code + + A string describing the parametrized URL substitution parameters, each character represents how to translate each term. + B = Bottom of the current view i.e. minimum latitude + L = Left of the current view i.e. minimum longitude + T = Top of the current view i.e. maximum latitude + R = Right of the current view i.e. maximum longitude + A = center lAtitude of the current view + O = center lOngitude of the current view + Z = OSM Zoom value of the current view. See Zoom Levels + P = selected Point's latitude + N = selected poiNt's longitude + S = A user specified input string requested from the user via a dialog box + Thus for the url example above then the format code should be AO + + + + file_type + + This value is passed on for the -i parameter in interfacing with GPSBabel. + If it is not defined then the returned file is interpreted internally as a GPX file. + Possible values such as 'kml', 'mapsource' etc.. can be used. See GPSBabel File Formats for the full list. + + + + babel_filter_args + + This value is passed on for the filter arguments interfacing with GPSBabel. + E.g. "-x nuketypes,routes" can be used to filter all routes from the results. + + + + input_label + + This value is used when requesting input from the user. + It is the label of the text input box. + + + + +
+ +
+ System Extension File Locations + Note that, on UNIX like systems, the extension files (&extfiles;) are also searched in /etc/viking and /usr/share/viking directories (or related in your system). + The XDG_DATA_DIRS environment variable can be used to change these directories. + The XDG_DATA_HOME environment variable is also used (if set) to look for these extension files. +
+ + +
+ Miscellaneous Settings + Various individual values are automatically saved between &app; sessions in the ~/.viking/viking.ini file. + This file is not intended to be manually edited, but since it is a plain text file it can be changed if desired. + Some values in this file are read only, in the sense that there is no way to set it other than by manually entering in the keys and values (the key will not exist in the file otherwise). This allows some fine tuning of &app; behaviours, without resorting to recompiling the code. However is it not expected that these values should need to be changed for a normal user, hence no GUI options for these have been provided. + Here is the list of the read only keys and their default values. + + + curl_cainfo=NULL + See CURLOPT_CAINFO + + + curl_ssl_verifypeer=1 + See CURLOPT_SSL_VERIFYPEER + On Windows this is defaulted to 0 to get HTTPS connections to at least work, + otherwise any attempts at verifying always fail. + [Some incompatibily is suspected in the reliant binary DLLs] + + + geoclue_accuracy_level=4 + Set the integer value for the accuracy level request to the GeoClue service. Values to match the GClueAccuracyLevel: + + 0 = GCLUE_ACCURACY_LEVEL_NONE + 1 = GCLUE_ACCURACY_LEVEL_COUNTRY + 4 = GCLUE_ACCURACY_LEVEL_CITY + 5 = GCLUE_ACCURACY_LEVEL_NEIGHBORHOOD + 6 = GCLUE_ACCURACY_LEVEL_STREET + 8 = GCLUE_ACCURACY_LEVEL_EXACT + + + + gpx_tidy_points=true + ATM Only attempts to remove a suspicious first point of a GPX track + (as opposed to any points within a track). + + + gpx_tidy_points_max_speed=340 + Over this speed (in metres per second) for the first pair of points - the first point is removed. + + + layers_create_trw_auto_default=false + Create new TrackWaypoint layers without showing the layer properties dialog first. + + + layers_panel_calendar_markup_mode=3 + 0=No markups. 1=Day marked. 2=Day marked and tooltips created. 3=Auto (timed tooltip creation, so if too slow it reverts to 1) + + + maps_max_tiles=1000 + + + maps_min_shrinkfactor=0.0312499 + + + maps_max_shrinkfactor=8.0000001 + + + maps_real_min_shrinkfactor=0.0039062499 + + + maps_scale_inc_down=4 + + + maps_scale_inc_up=2 + + + maps_scale_smaller_zoom_first=true + + + srtm_http_base_url=https://dds.cr.usgs.gov/srtm/version2_1/SRTM3 + Allows using an alternative service for acquiring DEM SRTM files. + Note that the layout on the server needs to be split into Continent directories. + + + mapnik_buffer_size=128 (in pixels) + + + osm_basic_auth=false + Set to true to force the use of HTTP Basic Authenication even when OAuth is available + + + background_max_threads=10 + + + background_max_threads_local=Number of CPUs + + + window_default_tool=Pan + Options are: Pan, Zoom, Ruler or Select + + + window_menubar=true + + + window_copy_centre_full_format=false + + + version_check_period_days=14 + + + trackwaypoint_start_end_distance_diff=100.0 + + + gps_statusbar_format=GSA + This string is in the Message Format Code + + + geoclue_statusbar_format=SA + This string is in the Message Format Code + + + trkpt_selected_statusbar_format=KEATDN + This string is in the Message Format Code + + + utils_nearest_tz_factor=1.0 + + + viewport_history_size=20 + + + viewport_history_diff_dist=500 + In metres. + + Go Back or Go Forward requests over this range from the last history location will move back to that position. + If within this range it will skip over this location and move on to the next saved history location. + + + + viewport_scale=1 + + If Viking doesn't automatically detect a high resolution display, you can force the setting here - typically by setting this to 2. + + + + external_diary_program=rednotebook + Or in Windows it uses C:/Progra~1/Rednotebook/rednotebook.exe - This string value must use Unix separators and not have spaces. + + + external_astro_program=stellarium + Or in Windows use C:/Progra~1/Stellarium/stellarium.exe - This string value must use Unix separators and not have spaces. + Needs to be version 0.15.0 or greater (otherwise due to this Bug means this does not actually work). + + + external_text_program=gedit + Or in Windows it uses notepad - This string value must use Unix separators and not have spaces. + + + bfilter_simplify=100 + + + bfilter_compress=0.001 + + + list_date_format=%Y-%m-%d %H:%M + A date format description as passed on to strftime(). + Note that when displayed in tables sorting by this column simply uses the text value, rather than the underlying date/time value. + + + + export_device_path=OS Specific + UNIX = "/media/user/GARMIN/Garmin/GPX" + WINDOWS = ":/Garmin/GPX" + + + export_device_trackpoint_limit=10000 (Typical Garmin Edge limit) + Older Garmins limits are typically much lower - Etrex 20/30 is 500 + + + export_device_routepoint_limit=250 + + + kmz_default_maps_dir=Empty + You may want to use something like: "/media/user/GARMIN/Garmin/CustomMaps" + + + +
+ Message Format Code + Currently for ease of implementation the message format code is a string of characters. + Each character represents what should be inserted in relation to a Trackpoint. + One day it might evolve into something more user friendly with a frontend to control it, perhaps allowing arbitary text too. However for now at least some control is offered :) + + + + Character Code + + G = Some text to display at the start of the message - GPSD + K = Some text to display at the start of the message - Trkpt + A = Altitude of a Trackpoint + S = Speed of a Trackpoint + B = Vertical Speed (Climb) + C = Course of a Trackpoint + L = Location of a Trackpoint + T = Time of a Trackpoint + M = Time diff of a Trackpoint from the previous trackpoint + X = Number of satellites used in the trackpoint fix + D = Distance of the trackpoint from the start of a track (following along the track) + F = Distance of the trackpoint from the finish (end) of a track (following along the track) + P = Distance difference of the trackpoint from the previous trackpoint + N = Name of track to which the trackpoint belongs + E = Name of the trackpoint + + + + Output Notes + + If the output has * after it, then the value has been calculated via interpolation (such as speed when the Trackpoint does not contain a speed value). + If the output has ** after it, then difficulties were encountered in trying to work out the value so probably a default of 0 will be shown. + + + + +
+ +
+ +
+ Keyboard Shortcuts (Accelerator) Settings + This is held in the file ~/.viking/keys.rc + It is in the standard GTK Accelerator map format. Values are automatically read in and saved between &app; sessions. + This file is not intended to be manually edited, but since it is a plain text file it can be changed if desired. +
+ +
+ + + + + + + + +
diff --git a/help/C/legal.xml b/help/C/legal.xml index 312c12e..5d73dc0 100644 --- a/help/C/legal.xml +++ b/help/C/legal.xml @@ -6,7 +6,7 @@ by the Free Software Foundation with no Invariant Sections, no Front-Cover Texts, and no Back-Cover Texts. You can find a copy of the GFDL at this link or in the file COPYING-DOCS + url="help:fdl">link or in the file COPYING-DOCS distributed with this manual. This manual is part of a collection of GNOME manuals diff --git a/help/C/viking.xml b/help/C/viking.xml deleted file mode 100644 index 3acc3af..0000000 --- a/help/C/viking.xml +++ /dev/null @@ -1,4151 +0,0 @@ - - - Viking"> - - - - maps.xml, goto_tools.xml, datasources.xml, external_tools.xml, routing.xml"> -]> - - -
- - &app; Manual - - &app; is a free/open source program to manage GPS data. - - - - 2013 - Guilhem Bonnefille - Rob Norris - - - - - GNOME Documentation Project - - - - - - - - Guilhem - Bonnefille - - - Rob - Norris - - - - username: - Alexxy - - - username: - Vikingis - - - username: - Tallguy - - - username: - EliotB - - - Alex - Foobarian - - - - - - - &appname; Manual V&manrevision; - &date; - - Guilhem Bonnefille guilhem.bonnefille@gmail.com - Rob Norris rw_norris@hotmail.com - GNOME Documentation Project - This document was generated on . - - - - - This manual describes version &appversion; of &appname;. - - - Feedback - To report a bug or make a suggestion regarding the &app; application or - this manual, follow the directions in the - Feedback section of the GNOME User Guide. - - - - - - &app; - - -
- Introduction - -&appname; aims to be easy to use, yet powerful in accomplishing a wide -variety of tasks. Some of the things you can use &appname; for are: - - - -Uploading and downloading waypoints, tracks and routes to/from GPS. - - - -Preparing tracks, routes and waypoints for trips using maps from services such as OpenStreetMap (OSM). -The data is only needed to be uploaded to your GPS before you leave. -The maps together with your tracks, routes and waypoints can also be printed and used during the trip. - - - - -After trips, tracks and waypoints from GPS can be downloaded, stored, managed and reused in your (or your friends') later trips. - - - - -Analyzing Off Highway Vehicle (OHV) and hiking trips, understanding where you went and how far you were from something. - - - -Making waypoints, tracks and routes to follow to easily get someplace -you've never been before or don't have GPS data for but online -maps exist for it. - - - - -Making maps with using Mapnik. -Not on Windows at the moment. - - - - -Grouping data from multiple trips using a hierarchical data manager. - - - - -Analyzing speed at different places (to some degree), adding waypoints where you forgot to mark one but did slow down or stop. - - - - -Downloading and storing OpenStreetMap and/or other map types on your hard drive and looking at them later. - - - - -Editing routes or tracks and their trackpoints, joining and splitting up tracks and routes. - - - - -Show the live GPS position on the map (for use on a mobile device - e.g. a laptop). Not Windows at the moment. - - - - -Import and export track, route and waypoint files of various types via GPSBabel - - - -Previously on Windows, GPSBabel was distributed with &appname;, but this no longer the case. - - -It can be downloaded from its website . - - - - - -View, create and update Geotagged Images (using EXIF data). - - - - - -&appname; is under continual improvement: see the the Roadmap / Wishlist: - - -
-Screenshot: OSM Cycle Map and Many Tracks - - - -
- - - The Windows build of Viking does not currently support verification of https connections. - - -
- -
General Concepts -
Layers - -Layers is concept one may know from powerful graphics editors such as Photoshop or GIMP. -Instead of putting all the data on the same level, it is stacked (i.e. layered) with different data over one another. -This can be useful for analysis and general handling of various sets of data. - - -Unfortunately the downside of this complexity is remembering how differing layers of data can obscure other data. - - -The Map layers have Alpha Compositing, -to create the appearance of partial transparency. -By controlling this value one can see data below it in the layer heirarchy for interesting effects. - -
-
Layers Panel - -The panel on the left is called the layers panel. -It determines which layers and sublayers (such as tracks and waypoints) -are shown, and the order in which they are drawn. Layers on the -top of the layers panel list are drawn last. You can change the order by -drag and drop, or by selecting a layer and using the up and down -buttons at the bottom of the layers panel. - - - The panel also contains a calendar to show when Layers occurred. - Double clicking on the day will select and move the viewport display to that layer. - Right clicking brings up a menu from which you can select to go to the previous or next layer in time. - -
-
Viewport - -The main &appname; area where the layer data is drawn, is called the viewport. - -
-
Track Graphs - -Below the viewport can be shown track (and route) elevation/distance and time/speed (tracks only) graphs of the selected item. -These are the same graphs as shown in . -The graphs will automatically hide itself when nothing or no suitable item is selected. - - -Moving the mouse pointer over the graphs will show a tooltip readout of the nearest trackpoint. -Similarily to the track properties graphs, left clicking will center the viewport on the trackpoint. -A right click menu offers controls of the drawing options, a subset of track operations and access to further information dialogs. - -
-
Statusbar -This provides a readout of various information: - -The currently selected (mouse pointer) tool -The number of items to process in the background - normally this the number in the map tile download queue -The zoom factor -The location of the mouse pointer (and potentially height information if DEM data is available) - -When creating a track/route, the statusbar also displays some information about the track/route. -
-Statusbar - - - -
-This part of the statusbar displays: - -The total distance of the track/route (including currently edited segment). -The bearing of the currently edited segment. -The distance of the currently edited segment. - - -For convenience, a zoom selector can be opened from the status bar. Simply left-click on the zoom factor. -
- The zoom selector available from status bar - - - -
-
- -
Toolbar -The toolbar is an area for buttons that perform common actions. -Some actions are modal, so the appropriate layer needs selected before these toolbar buttons are enabled. See more detail. -The display of the toolbar is influenced by the -Right clicking on the toolbar and selecting Customize allows jumping to the directly. -
- -
Projections - -&appname; supports differents projections: - - -UTM - - -LatLon (also called EPSG:4326) - - -Mercator (also called Spherical Mercator) - - - -
- -
Map Cache - -&appname; stores downloaded map tiles to disk for a couple of reasons: - - -Enables off line usage -Reduces loading on the map tile provider - - -The &appname; automatic caching strategy is two fold: - - - - - If the age of the tile on disk is less than the specified tile age (see ), - it will not attempt to contact the server to get a new version of the tile. - - - - - When the tile age has expired &appname; will attempt a refresh update, so that it provides the cached tile generation timestamp so the server can determine if a new tile image needs to be returned. Not all map types support this refresh method. - - - - - You can override the caching scheme by using right-click on the Map on the layers panel and selecting Redownload All Onscreen Maps, or Ctrl+F5 for the top most map displayed. This will get the latest version held by the server. - - - - This can be useful if you contribute to OpenStreetMap and wish to see your modifications (of course give time for the server to have processed your changes - see I have made edits but they don't show up on the map) - - - - -The layout of the cache on disk itself can be controlled via a per Map Layer property. - -Viking - Legacy default in a private cache layout scheme -OSM - Newer available default (1.6+) - -This is to increase the compatibility between &appname; and similar applications that cache tiles on disk so that the tiles can be shared. - - - - - -
- -
Shortcut Keys - -&appname; has several shortcut keys or key combinations for commands as listed in the main window along side the command. - - -By default some function keys follow standard GUI behaviour: - - -F1 Help (view this manual) -F5 or Ctrl+R Refresh the maps on screen -F10 Select the Menubar (in built behaviour) -F11 Full Screen -Ctrl+F5 or Ctrl+Shift+R Redownload the maps on screen - - - -Refresh attempts to get new maps only if the local tile cache time period has expired for any particular map tile. -Redownload gets all on screen maps from the server, ignoring the local tile cache. - - - -Other function keys control turn on/off visibility of various elements: - - -F3 Toggle visibility of the Toolbar -F4 Toggle visibility of the Menubar -Shift+F5 Toggle visibility of the Scale indicator on the viewport -F6 Toggle visibility of the Center Crosshairs on the viewport -F7 Toggle showing selected items (e.g. tracks or waypoints) in the highlight colour in the viewport -Shift+F8 Toggle visibility of the calendar -Shift+F9 Toggle visibility of the Layers Panel buttons -F9 Toggle visibility of the Layers Panel -F12 Toggle visibility of the Statusbar -Shift+F12 Toggle visibility of the Track Graphs - - -Standard shortcuts are provided for normal GUI operations: such as creating new files, opening, saving and exitting. -Then there are shortcuts specific to &appname; to switch projection modes, zoom in/out, create layers,switch the active tool mode and move the map: - -Ctrl+Up Pan the viewport North -Ctrl+Right Pan the viewport East -Ctrl+Down Pan the viewport South -Ctrl+Left Pan the viewport West -Ctrl+Keypad+ Zoom In -Ctrl+Keypad- Zoom Out - -These work irrespective of the mode selected -For other combinations see the menu entry themselves. - -
- -
-Keyboard Configuration -Keyboard configuration is supported by the standard GTK+ way of changing shortcuts for menu entries. -Hover over the menu option with the mouse pointer and press the keyboard shortcut you want to bind it to. -To delete a keyboard assignment, press Backspace whilst over the menu entry. - - - If the keyboard shortcut is already in use you will not receive any notification that new action replaces the old action. - This is probably why most distributions have this facility disabled by default. - Thus you will need to enable Editable menu accelerators for your system. - Check the Desktop Menu and Toolbar Control or other User Interface preferences for this setting. - - - - - For Windows systems this can be done by adding the line gtk-can-change-accels=1 to %USERPROFILE%\.gtkrc-2.0 (create the file if it does not exist). - - -From &app; 1.6+ the keyboard configuration is automatically loaded and saved between sessions in the -
- -
Tracks vs Routes - -In theory a route is path you are planning to follow and a track is of where you have actually been. The GPX specification splits these into two separate categories, although tracks contain everything route may have. - - -Q. When planning a route what difference does it make if it's a route or a track? - - -A. One difference is in how a GPS device navigates following the route or track. -The capability, the options and data on a particular device also effect how the navigation is performed. -Often the how a device actually works doesn't seem to be formally documented by the manufacturer (and can be firmware dependent too). -Web searches can reveal people's experiences with specific devices on blogs and various forums. -For some devices it will attempt to navigate between route points, which may then suggest various roads and tracks between the points using an internal routing algorithm with some kind of transport profile. -However this is limited to the quality of data available and how well the profile matches ones actual need. -If the points are close enough then the 'best' route for any form of transport will typically be the straight line between the points. - - -There are often restrictions on the numbers of route (or track) points the GPS Device can handle - may be 250 or as little as 50. -This generally not a problem for shorter routes, but needs managing for longer or detailed routes. -The number of track points is normally alot higher (e.g. 500 or typically with latest devices 10,000 or more) and less of a problem. - - - See for helping to manage this. - -
- -
- -
File Types and the Main Window - - -&appname; has it's own file type traditionally marked by the .vik file extension. -This is a plain text file saving all information of the current window including the view location, zoom level, projection type and then all the layer information (aggregates, maps, tracks, waypoints, etc...). - - -Besides it's own file type, &appname; can open (and save to via export methods) GPX and KML file types. - - - -&appname; does not handle GPX 1.1 particularly well - it prefers GPX 1.0 - - - -By default &appname; opens a default blank window centered on the home location. This behaviour can be changed by the . -Each window contains menus, a toolbar, a viewport, layers panel and a statusbar. -Each section (apart from the viewport) can be hidden using the or from the -ViewShow choices. - - -One may consider each &appname; window to be a separate project - each with it's project Viking file. -However generally one window is enough for most purposes! - - -Several operations apply at the window level as follows next. -Also see for the operational modes that generally work in conjunction with a selected layer. - - -
New - -Located on the FileNew menu and on the toolbar New. - - -This creates a new window with the default settings. - -
- -
Open - -Located on the FileOpen menu and on the toolbar Open. - - -This opens a file chooser dialog to select one (or more) files of the supported GPS data file types: - -Viking -GPX -TCX -KML -JPG - - - -GPX, TCX, KML and JPG files will be loaded into the existing &appname; view. A Viking file will be given a new window if the current window is already assigned. - - - -&appname; handles more file types via the Acquire methods below. - - -
- -
Open Recent File - -Located on the FileOpen Recent File menu only. - - -The most recently opened files are available for opening again. -The number of files remembered is controlled by a value in the . - - -Note that files imported via the Acquire mechanism are not available in this list. - -
- -
Save - -Located on the FileSave menu and on the toolbar Save. - - -If the current opened file is Viking file, this save will simply update it. -If it is a new file or the file loaded was an external type (i.e. GPX or KML), then this will ask for a new name to save as a Viking file. - -
- -
Save As - -Located on the FileSave As menu only. - - -This will ask for a new name to save as a Viking file (even it was already a Viking file). - -
- -
Append File - -Located on the FileAppend File... menu only. - - -Selecting a Viking file from this method will join the file contents to the current window (instead of creating a new one). - - -GPX and KML files may also be appended, whereby the file contents are added to the currently selected or layer. Otherwise they are loaded in the normal file open method when no layer is selected. - -
- -
Open GPX as External Layer - -Located on the FileOpen GPX as External Layer... menu only. - - -Selecting a GPX file from this method will create an external Layer that loads from the specified file. -The layer is marked as a "no write" external layer, which means any changes made will not be written back to the GPX file. -To enable changes to be written, you can change the layer to a standard external layer in the layer properties dialog. -This is in contrast to importing the data and storing it in the Viking file. - -
- -
Properties - -Located on the FileProperties menu only. - - -Displays some simple properties about the loaded Viking project file (if any), such as full filename including the path, the filesize and the date/time of the file. - -
- -
Export All - -Located on the FileExport All menu only. -Choose either the GPX or KML option. - -This allows converting every layer from the existing project into files of the type choosen. -You will be prompted for a directory into which a new file for each layer will be saved. - - -The KML option uses GPSBabel and so will not be available if GPSBabel can not be detected. - - -Note that some data properties are not supported by the target export file type. Such as item visibility or track colours. - -
- -
Acquire - - -Available on the FileAcquire menu and from the layer menu. - - -If used from the File menu these methods place the results in a new TrackWaypoint layer. - - -If used from the layer menu these methods place the results in that TrackWaypoint layer. - - -
-From GPS - -FileAcquireFrom GPS -Probably the easiest way of getting information from a GPS Device. - - -Select the GPS Device communication settings and then hit OK. -See the Getting Started section for more info about the settings. - - - -Some GPS devices (such as the Garmin Nuvi 255) support a native file system and write information to a Current.gpx file or similar. You will have to browse the file system on the device and open it directly. - - -
- -
-Import File With GPSBabel - -FileAcquireImport File With GPSBabel - - -Other formats can be imported that are supported by GPSBabel. - - -You need to select the file and the type of the file that is going to be opened, -since there is no automatic detection of the file kind. - -
- -
-OSM Traces - -FileAcquireOSM Traces - - -See section for more information. - -
- -
-My OSM Traces - -FileAcquireMy OSM Traces - - -See section for more information. - -
- -
-From Geotagged Images - -FileAcquireFrom Geotagged Images -Enables automatic creation of waypoints from geotagged images. - - -This menu opens a dialog to select such image files. -If the image files have geotag information in them, then a layer with named waypoints positioned at the location of each image with a thumbnail of that image is created. - -
- -
-From Wikipedia Waypoints - -FileAcquireFrom Wikipedia Waypoints - - -This gets interesting points from Wikipedia for the specified view: either within the extent of layer bounds or within the current viewport boundary. - -
- -
-From Routing - -FileAcquireFrom Directions - - -This gets a route from given directions. - -
- -
-From URL - -FileAcquireFrom URL - - -This gets a file from the entered URL. -File formats that can be opened are those supported by GPSBabel. - - - -You need to select the type of the file that is going to be returned, since there is no automatic detection of the file kind. - - -
- -
-Import GeoJSON File - -FileAcquireImport GeoJSON File - - -This uses the program togpx to load .geojson files. -If the program is not detected on your system, then this option will not be available. -See here for the installation method. - - -Versions proir to 1.6.0 of GPSBabel did not support the GeoJSON file format. - -
- -
- -
Print - -Located on the FilePrint menu and on the toolbar Print. - - -Print uses what is displayed on the current map view for printing: i.e. what ever map, tracks and waypoints that are in view, including the -cross hairs and the scale. - - -It uses a standard system print dialog using an image the size of the current viewport in pixel terms. -On the Image Settings you can move the image around the page and scale the image up / or down. - -
- -
Generate Image File - -Located on the FileGenerate Image File menu only. - - -Allows generation of larger (pixel) area images than the standard Print method above. -From the generated image you can use the facilities of the Operating System to print the image -or perform other actions. - - -You should have previously downloaded the tile images for the chosen zoom level, -otherwise the image produced will have missing sections. - - - -Using large areas takes some time to process and due to the method used it may run out of memory to complete the operation. -Unfortunately under Windows systems it can not detect this failure and may crash the program. -So the maximum size is dependent on the capabilities of your system. -For instance the largest successful image generated on my (RN) Debian system is a pixel area of 20,000 x 20,000. - - -
- -
Generate Directory of Images - -Located on the FileGenerate Directory of Images menu only. - - - -This is only available in UTM mode. - - -
- -
KMZ Map File Overview - -A KMZ file is a compressed version of a KML file and associated supporting files. - - -A KMZ Map file is a KMZ file with an image overlay often for use as a Custom Map on Garmin GPSr devices. - - -&appname; only supports basic properties in KMZ Map files, primarily intended for use with Garmin GPSr devices although KMZ exports are known to be work with Google Earth. - -
- -
Import KMZ Map File - -Located on the File menu only. - - -Enables loading of a selected KMZ map file. -This generates a new map layer using the overlay image contained within the KMZ file. - -
- -
Generate KMZ Map File - -Located on the File menu only. - - -Enables exporting the current viewport as a KMZ map file. -The area and zoom level covered by the KMZ map can be adjusted before saving. - - -Note that Garmin GPSr devices have limits in using images if they are too large (e.g. over 3Mb big) in KMZ files. -&appname; does not enforce any limits on the KMZ files it generates. - -
- -
- -
Layers - - -Layers supported by &appname; are: - - - - - - - - - - - - - -For each layer there are a few standard options: - - -Properties - Layer setup / configuration settings -Cut -Copy -Paste -Delete -Visibility - This checkbox on the Layers Panel controls whether the layer is shown in the viewport or not - - -The cut/copy/paste options can be accessed in a variety of ways once the layer has been selected: - - -Standard keys: Ctrl+x|c|v -Main menu Edit -From the right click menu -Buttons at the bottom of the Layers Panel - - -Default values used for each layer's properties can be altered via the EditLayer Defaults menu options. - - -See the individual section for detail about each layer. - -
- -
TrackWaypoint Layer - -TrackWaypoint layers display GPS data (tracks, routes and waypoints). - -One way to create new waypoints is to copy a -latitude/longitude coordinate pair, such as the one shown on most -geocaches, and paste it into an active TrackWaypoint layer. &appname; can -automatically recognize several variations of the lat/lon format. - - -By right-clicking on tracks, routes or waypoints in the , you can access many commands on them. -You can easily find a specific track, route or waypoint by expanding the appropriate containing Tracks, Routes or Waypoints sublayer in the -layers panel to show all the individual items and then typing the name of the track, route or waypoint. - - - -The containing Tracks, Routes or Waypoints sublayers are only shown when items of that type exist. -To start creating them enter into a create mode via either the Create toolbar commands or the New menu commands. - - - -The new TrackWaypoint layer dialog allows the layer to be specified as external. -In this case the layer is exported as GPX to the file specified instead of stored in the Viking file itself. -It is also possible to specify the layer as "no write". -This means that &appname; does not write the layer to the GPX file specified; instead, &appname; only reads the file. -No-write layers are primarily intended to be used with the option in the File menu. - - - -External layers are loaded only when they are displayed or selected. -Hence, they will not appear in any summary statistics if they have not been loaded. -It is possible to load all external layers contained in an layer by selecting "Load External Layers" from the Aggregate Layer context menu. -Note, &appname; specific options may not be saved if not supported by the GPX export. - - - -The sublayers also offer right click menu options. -These are the same as those available at the TrackWaypoint level, but only those that relate to the sublayer type. - - - -By default routes are coloured red. Tracks are automatically assigned a spread of colours. - - - -Most operations available on tracks are available on routes, except for functionality that relies on having timestamps - since routes by definition have no timing information. Thus for example, uploading a route to OpenStreetMap Traces is not available nor is Geotagging on a route. -It is possible to convert between Tracks and Routes, although converting from a Track to a Route may involve a loss of information (hence you are required to confirm this operation before it happens). - - - -Also see for use in conjunction with this layer. - - -
Layer Operations - -The layer has a context menu with several operations. - - -
View Layer - -Version1.1+: This will automatically move the viewport and select the best zoom level to see the whole layer (i.e. all tracks, routes and waypoints). - -
- -
View - -
View All Tracks - -Version1.1+: This will automatically move the viewport and select the best zoom level to see the all the tracks in the layer (ignoring positions of any routes or waypoints). - -
- -
View All Routes - -Version1.4+: This will automatically move the viewport and select the best zoom level to see the all the routes in the layer (ignoring positions of any tracks or waypoints). - -
- -
View All Waypoints - -Version1.1+: This will automatically move the viewport and select the best zoom level to see the all the waypoints in the layer (ignoring positions of any tracks or routes). - -
- -
- -
Goto Center of Layer - -This will automatically move the viewport to see the whole layer (i.e. tracks, routes and waypoints). It does not adjust the zoom level. - -
- -
Goto Waypoint - -This opens a dialog box to enter a name of waypoint to search for. If it is found the viewport is centred on it. - - - -Note this search is not very clever and only finds exact matches. -You are probably better off expanding the waypoint list and directly start typing, as mentioned above, which finds a match based on each letter typed. - - -
- -
Export Layer - -The layer (all tracks, routes and waypoints) can be exported to following file formats: - - - - GPX - - - GPSPoint - - - GPSMapper - - - Google's KML - - - Any GPSBabel File Formats - - - GeoJSON. Via the program togeojson - This option will not be available if the program is not detected on your system. - See here for the installation method. - - - -Version1.1+: An individual track can be exported to a GPX file via the track menu. - -
- -
Finish Track or Route - -Selecting this option ends the creation of that individual track or route. - - - -This is only available when a track or route is being created by the or tools. - - -
- -
New -
New Waypoint - -This opens a dialog box to create a new waypoint. A default name will be suggested and the default position is the center of the viewport. - -
-
New Track - -This turns on the tool. - -
-
New Route - -This turns on the tool. - -
-
- -
Geotag Images - -This starts the Geotagging Images dialog against all tracks in the layer. -See Geotagging for further detail. - -
- -
Acquire - -This offers the same choice from methods as on the File menu. -However when invoked from here, the results will be stored in this layer (instead of creating a new one). - -
- -
Upload - -
Upload to GPS - -This opens a dialog to select the GPS Device and port to which the layer information will be transferred. - - -The types of GPS information (tracks, routes or waypoints) to be transferred can be selected. - - -Tracks, Routes or Waypoints that are invisible will not be transferred. - -
- -
Upload To OSM - -This opens a dialog to upload all tracks and waypoints to OpenStreetMap traces. -Useful if you are an OpenStreetMap contributor, access details are stored in &appname; - - - &appname; allows you to edit a track, e.g. remove duplicate points, perhaps remove track points leading to your home and then upload it to OpenStreetMap. - -
-
- -
Delete -Offers deletion of various parts of a TrackWaypoint layer: -
Delete All Tracks -Deletes all the tracks in this layer. -
-
Delete Tracks from Selection -Opens a dialog with list of all the tracks from this layer to choose the ones to delete. -
-
Delete All Routes -Deletes all the routes in this layer. -
-
Delete Routes from Selection -Opens a dialog with list of all the routes from this layer to choose the ones to delete. -
-
Delete All Waypoints -Deletes all the waypoints in this layer. -
-
Delete Waypoints from Selection -Opens a dialog with list of all the waypoints from this layer to choose the ones to delete. -
-
Delete Duplicate Waypoints - - Deletes duplicate waypoints in this layer. - Waypoints are considered duplicate if they have the same location and symbol. - - If other properties are different such as name, comment, altitude, etc... they will still be considered a duplicate. - - - -
-
- -
Filter -
Simplify All Tracks - -This opens dialog to request the number of points each track will be simplified using GPSBabel. The result is put into a new layer. The simplification method removes points considered to be in a 'near straight line', thus reducing the number of points and attempting to keep the most important turning points. - -
-
Compress Tracks - -Enables compression of tracks and routes via GPSBabel's Crosstrack simplify method. -It opens a dialog to request the Error factor value which is the maximum allowable error that may be introduced by removing a single point. -It is expressed a distance in units as specified by the distance option. -Thus a higher value will remove more points. -The result is put into a new layer. - -
-
Remove Duplicate Waypoints - -Remove Duplicate Waypoints - fairly self explainatory, with the results created in a new layer. - - - -However it only considers a precise position (waypoints only 1 metre away from each other are considered different) and also doesn't consider if the waypoints have different comments, symbols or images. - - -
-
- -
Filter With <emphasis>Trackname</emphasis> - -This runs GPSBabel on the layer using information from a previously selected track (select via the track menu "Use With Filter" option) with the following command types: - - -Waypoints Inside This -Waypoints Outside This - - -The result is generated in a new Track/Waypoint layer. - -
- -
Geotag Images - -This starts the Geotagging Images dialog using the specific track. -See Geotagging for further detail. - -
- -
List Tracks or Routes - -Opens a new dialog with the list. As described in the Aggregate layer - -
- -
List Waypoints - -Opens a new dialog with the list. As described in the Aggregate layer - -
- -
- -
Track and Route Sublayer Options -Repeats options available at the TrackWaypoint level, but only those for tracks and routes: - - -Finish Track or Route -Same as the layer Finish Track or Route - - -New Track or Route -Same as the layer New Track or New Route - - -View All Tracks or Routes -Same as the layer View All Tracks or View All Routes - - -Delete All Tracks or Routes -Same as the layer Delete All Tracks or Delete All Routes - - -Delete Tracks or Routes from Selection -Same as the layer Delete Tracks from Selection or Delete Routes from Selection - - -List Tracks or Routes -Opens a new dialog with the list. As described in the Aggregate layer - - -Also gives other options for handling multiple items: - - -Sort -Gives the ability to sort the items in the treeview alphabetically or by date. - - -Visibility -Offers options to quickly control the visibility of all items within the sublayer, as per - - -
- -
Track and Route Properties - -This shows several tabs for properties and useful statistics about a track or a route, including elevation-distance and speed-time graphs (if data is available). -Moving the mouse pointer over the graph displays values related to that point along the track. -You can click on these graphs to jump to the point in the track. -You can reverse it, delete duplicates, split at marked position or split a track from its component segments (discontinuous breaks in a track) into separate tracks. - - -For the elevation related graphs the Show DEM check button is only enabled if a suitable is available that overlaps the track. - - -Graphs either have a Show GPS Speed or Show Speed button. -Each of these overlays relative speed markers along the graph. -The difference between Speed vs GPS Speed is that GPS Speed is taken directly from a field reporting the speed value in the source data. -Typically speeds used in Viking are calculated between the points time and position differences. -This is due to the reporting of speed values in source data is not mandatory and often not present. - -
Track and Route Properties Tab - -
-Properties Tab: Example - - - -
-
-
-
Track and Route Statistics Tab - -
-Statistics Tab: Example - - - -
-
-
-
Track Elevation Graph - -
-Elevation Distance Tab: Example - - - -
-
- -The following colors are used in the elevation-distance graph: - - - -Main colour - this is dependent on your Desktop theme - often blue by default -elevation data in graph - - -Yellow - -no elevation data - - - -Green - -elevation data from DEM - - - -Red - -speed - - - -
- -
Track Time Splits - -
-Splits Tab: Example - - - -
-
- -This tab displays timing splits on tracks with timing information. -A few different values of split lengths are available, each having it's own tab display. - -
-
- -
Track and Route Operations - -
Finish Track - -Selecting this option ends the creation of the individual track. - - - -This is only available when a track is being created by the tool. - - -
- -
Goto - -This centers the viewport on the selected position on the track: - - -Startpoint -"Center" - the notional center from the bounds of the track -Endpoint -Version1.1+: Highest Altitude -Version1.1+: Lowest Altitude -Version1.1+: Maximum Speed (Not Available on Routes) -Version1.8+: Previous trackpoint -Version1.8+: Next trackpoint - -
- -
View - -Version1.1+: This centers the viewport on the track and selects the best zoom level to see it. - -
- -
Combine -
Merge By Time - -This operation repeatedly tries to merge the right-clicked track -with tracks in the same TrackWaypoint layer. The tracks which are -merged are those which have at least one trackpoint less than some -threshold time away. This way, if you somehow end up with lots of small -segments (say, caused by turning the GPS on and off) you can merge them -easily into one track. - - - -This is not available on routes as they have no timestamps. - - -
- -
Merge With Other Tracks - - This opens a dialog listing the other tracks in the same TrackWaypoint layer, from which one can select the other tracks to merge with. - Tracks are merged in order of time. - -
- -
Merge Segments - -Combines track segments. Effectively removing track segment markers to leave one segment for the whole track. - -
- -
Append Track or Route - -Enable joining of a single track to the end of the current track. -This opens a dialog listing the other tracks in the same TrackWaypoint layer from which one can make the selection. - -
-
- -
Split -
Split By Time - -This operation will split a single track into segments wherever the -time interval between successive trackpoints is larger than some -threshold. This is useful when processing raw NMEA GPS data, especially -taken over a long time. - - - -This is not available on routes as they have no timestamps. - - -
- -
Split By Number of Points - -Version1.2+: This operation will split a single track into segments by the number of points specified. -This can be useful with devices which may have limits on the number of points it supports. - -
- -
Split Segments - -Splits track segments into new tracks. - - - -This is not available on routes as they do not have route segments. - - -
- -
Split at Trackpoint - -Splits the track at the currently selected trackpoint. - - -The current track will finish at this trackpoint. -A new track will start from a copy of this trackpoint. - - - -This is only enabled when a trackpoint is selected. - - -
-
- -
Insert Points - - -These options are only enabled when a trackpoint is selected. - - -
Insert Point Before Selected Point - -Inserts a track point halfway between the previous track point and the current track point. -All track point properties are interpolated between the two points. - -
-
Insert Point After Selected Point - -Inserts a track point halfway between the current track point and the next track point. -All track point properties are interpolated between the two points. - -
-
- -
Delete Points -
Delete Selected Point - -Deletes the currently selected track point. - - - -This is only enabled when a trackpoint is selected. - - -
-
Delete Points With the Same Position - -Deletes subsequent points that have the same position (but have different timestamps). - -
-
Delete Points With the Same Time - -Deletes subsequent points that have the same time stamp (but may have different positions). - - - -This is not available on routes as they have no timestamps. - - -
- -
- -
Transform - -These options alter the data of trackpoints of a track but not add or remove trackpoints. -And don't seem to fit any other category :) - -
Apply DEM data - -If any DEM data is loaded, this will apply the DEM data to give the track elevation data. -Two ways of applying DEM data are offered: - -Keep. Retains the existing elevation data of trackpoints and only those missing an elevation value are set. -Overwrite. Elevation data are set on all trackpoints even if they already elevation values. - - -
-
Smooth Missing Elevation data - -In various locations across the world, there are missing DEM values (AKA DEM Holes) from the SRTM data. -This is particularly noticeable in mountainous areas. -Two ways of applying elevation data to trackpoints that do not have elevation values are offered: - -Interpolated. Missing elevation data is interpolated between the previous and next known values. -Flat. Elevation data is filled in from the last previously known value. - - -
-
-Convert to Track or Route - -If this is a Route then it will convert it to a Track. - - -If this is Track then convert it to a Route. - - - -Converting from a Track to a Route may involve a loss of information, in particular timestamp values (hence you are required to confirm this operation before it happens). - - -
-
-Anonymize Times - -Timestamp information of a track can be shifted to be all offset from 1901-01-01. - - -Thus the timestamps themselves will no longer reveal exactly when a track was taken. -However the relative difference between the timestamps is kept thus one is still able to calculate some properties such as speeds along the track. - - - -This is not available for routes, as they have no timestamps. - - -
-
-Interpolate Times - -Trackpoint timestamps between the first and last points are calculated such that track is travelled at equal speed. -This is mostly useful when tracks don't have timestamps and you wish to recreate your trip (e.g. you've forgotten to turn on your GPS or the batteries have run out) -Thus edit the first and last trackpoints to set the approximate times of your trip and then use this to give approximate times along the track. -When used on tracks with timestamps this will overwrite the existing timestamps. - - - -This is not available for routes, as they have no timestamps. - - -
-
- -
Export Track as GPX - -Version1.1+: This allows exporting the track as a GPX file by opening a file save dialog. - -
- -
Extend Track End - -Changes the current tool to add trackpoints to the end of the track. - -
- -
Extend Using Route Finder - -Enables the Route Finder tool. Thus on a subsequent left click in the viewport, a route is calculated from the end of track to that point using the default route service and applied to the track. - -
- -
Upload - -
Upload to GPS - -Same as the layer Upload to GPS command, but only applies to the track. - -
- -
Upload to OSM - -Same as the layer Upload to OSM command, but only applies to the track. - -
- -
- -
Use With Filter - -This selects the track to be used in the Filter With Trackname feature. - - - -This is not available on routes. - - -
- -
Edit Trackpoint - -This opens the Trackpoint edit dialog. See . - - - -This is only enabled when a trackpoint is selected. - - -
- -
Refine Route... - -This function allows to request a Routing Engine in order to refine a given route. -By "refining" we mean computing all real intermediates points between some given major points. -This could be useful to compute a trip giving only the wished important steps. - - - -This is only available on routes. - - -
- -
View Google Directions - -This option is only available on a track created using the Route Finder tool. - - -Launch a web browser to see the Google directions page which yielded the route. - - - -The record of the Google route is stored in the track's comment, so if the comment is changed (or the route was created by something other than the Route Finder tool) this will not work correctly. - - -
- -
- -
Waypoint Sublayer Options -Repeats options available at the TrackWaypoint level, but only those for waypoints: - - -New Waypoint -Same as the layer New Waypoint - - -View All Waypoints -Same as the layer View All Waypoints - - -Goto Waypoint -Same as the layer Goto Waypoint - - -Delete All Waypoints -Same as the layer Delete All Waypoints - - -Delete Waypoints from Selection -Same as the layer Delete Waypoints from Selection - - -Delete Duplicate Waypoints -Same as the layer Delete Duplicate Waypoints - - -List Waypoints -Opens a new dialog with the list. As described in the Aggregate layer - - -Also gives other options for handling multiple items: - - -Sort -Gives the ability to sort the items in the treeview alphabetically or by date. - - -Visibility -Offers options to quickly control the visibility of all items within the sublayer, as per - - -
- -
Waypoint Properties - - -This shows a dialog with detailed information for the waypoint. Many properties of the waypoint can changed here, such as the comment, the symbol used in drawing or the image (normally a photograph taken at this position) assiocated with it. When a waypoint has an image, a thumbnail of it is drawn in the viewport for the waypoint (in preference to the symbol). - - -If the waypoint has an associated image, then the Geotag information may be updated, either with updating the file's modification timestamp or not. -This can be useful when the waypoint has been moved. - - -
- -
Waypoint Operations - -
Goto - -This centers the viewport on the selected waypoint. - -
- -
Geotag Images... - -This opens the Geotag Dialog to allow Geotagging multiple images to the position of this waypoint. -In this circumstance creation of waypoint options are disabled and only the options related to writing the EXIF information are available. - -
- -
Transform - -Offers a subset of the track utilities. -Currently only setting the altitude from DEM data methods are available. - -
- -
Visit Webpage - -If the waypoint's comment (or description) starts with http: then this option is available and allows launching a web browser to go to the webpage. - -
- -
Visit Geocache Webpage - -If the waypoint's name is in Geocache form (GCXXXXX) then this option is available and allows launching a web browser to go to the Geocache page. - -
- -
New Waypoint - -Same as the layer New Waypoint. - -
- -
- -
Version1.3+: Geotag Images - -This dialog allows geotagging images (normally taken with a digital camera) against a specific waypoint or via interpolation against a specific track or all tracks in the TrackWaypoint layer - depending on how it is invoked. - - -When geotagging against tracks, images need to have an EXIF DATE_TIME_ORIGINAL (nearly always set by a camera). This timestamp is then used to find the location when the image(s) was taken by searching through the track(s) to find the nearest time - interpolating between points if necessary to set the location. - - - -Generally it is good policy to synchronize your camera's clock with your GPS clock before taking photographs. However the times can be adjusted afterwards (if necessary) to take into consideration clock differences. - - - -Various options allow control of how the geotagging process is performed: - - -Images - Add the images used for geotagging -Create Waypoints -Overwrite Existing Waypoints -Write EXIF -Overwrite Existing GPS Information -Keep File Modification Timestamp -Automatic Image Direction - Assumes the direction will be in line with the track heading -Interpolate Between Track Segments -Image Time Offset - The number of seconds to ADD to the photos time to make it match the GPS data. Calculate this with (GPS - Photo). Can be negative or positive. Useful to adjust times when a camera's timestamp was incorrect. -Image Time is Local - Are the timestamps in the image local time or otherwise in UTC. -Image Timezone - The timezone adjustment factor. - - -Typically timestamps in images are either in local time or UTC but there is no way of automatically knowing which; so you need to specify which is the case. -Image Time Offset is best used for accounting for camera's clock drift, so normally of the order of a few seconds or minutes. -Whereas Image Timezone is more for adjusting for a camera's timezone difference, or perhaps differences in your current timezone and the timezone the images where taken. - -
- -
- -
GPS Layer - -The GPS layer is responsible for uploading and downloading GPS data -from a GPS device. It also is responsible for realtime GPS tracking. -Expand the GPS layer in the layers panel to see the two layers it -uses for uploading and downloading. To upload, download, or use -realtime tracking, right-click the GPS layer and click the appropiate -menu item. - - -
Download - -To download data from the GPS, right-click the GPS layer and click Download from GPS. - -
- -
Upload - -To upload data to the GPS, first populate the GPS Upload child -layer of the GPS layer (either by creating waypoints/tracks/routes in it, or -copying and pasting or dragging waypoints/tracks/routes from another layer). -Then right-click the GPS layer and click Upload to GPS. - -
- -
Realtime Tracking - -You must set up gpsd correctly or use a GPSD server and put the -correct information in the GPS layer properties dialog. Then right-click -the layer and select Start Realtime Tracking. - -
- -
Empty <emphasis>Item</emphasis> - -There are several options to quickly delete a subsection of data: - - -Empty Realtime -Empty Upload -Empty Download -Empty All - -
- -
- -
DEM (Digital Elevation Model) Layer - -This layer provides elevation data from the Shuttle Radar Topography Mission (SRTM) - - -Elevation data can be useful in planning trips, as you many wish to avoid/minimise the hills encountered. [OSM Cyclemap is also useful this way too] - - -To download the data use the tool (shown on the toolbar), and then click on a area of the viewport. Once files have been downloaded they can then be loaded from disk via the DEM properties in future application runs. - - -The current data server is: NASA STRM 2.1. - - -ATM &appname; does not auto download DEM data. If you want to get lots of data blocks, you may wish to use some other program get such as curl or wget to download them for an area. - - - -Using many DEMs is CPU/memory intensive. Depending on your computer's capability, &appname; will be less responsive when about 50+ DEM blocks are loaded. It is probably unwise to attempt using 200+ blocks, so trying to use DEMs covering large countries/continents (USA, Australia etc...) is unlikely to work. In these conditions under Linux, &appname; may be automatically stopped by the "OOM Killer" - - - -
- - -
Maps Layer - -This layer provides a single map resource, you may have multiple map layers but only top one (if enabled) will be visible (subject to the Alpha compositing property). - - -Some maps are continually improving over time (e.g. OpenStreetMap) thus &appname; employs a caching mechanism to avoid redownloading data (see ). -However a forced refresh for the current view can be made via the Reload All Onscreen Maps option or Ctrl+F5. - - - -Also see tool for use in conjunction with this layer. - - -Online Map Tile Providers - -You will need an open internet connection when you are downloading maps these following map types, but once downloaded they are available from the hard disk cache. When map are avaliable from the disk cache it is much faster and can be used offline. -Inbuilt maps include various OpenStreetMap (OSM) ones and more: - - - -Bing Aerial Maps (&appname; Version1.2+) -Mapbox Outdoors - This is the default (&appname; Version1.7+) -OpenStreetMap (Mapnik) -OpenStreetMap (Cycle) -OpenStreetMap (Transport) (&appname; Version1.3+) -OpenStreetMap (Humanitarian) (&appname; Version1.5+) -NASA BlueMarble - - - -&appname; can be configured to handle additional online map resources. See for further detail. - - -Offline Map Tilesets - -Some map types supported are for on disk tile formats: - - - - - On Disk OSM Tile Format - This is equivalent to any map set with OSM Cache Layput. - -MBTiles File - - OSM Metatiles - - This file format is mostly aimed at being rendering cache feature and is Endian dependent. - Thus to successfully view the file cache, the Metatile files and Viking must be of the same endian type (which they probably will be). - - - - -Of course you need to have acquired or generated these tilesets yourself. - - -
Map Layer Properties - -Configurable properties: - - - -Map Type - - The kind of map this layer displays. - Map types are dependent on the current mode. - - - -Maps Directory -Not applicable for MBTiles Map type since it is a single file. - - -Cache Layout -Viking or OSM. See . Only applies to maps from online tile providers. - - -Map File -Ony applicable for MBTiles Map type since it is a single file. - - -Alpha - - Control the Alpha value for transparency effect using a value between 0 and 255 with the default being 255 for a fully solid image. - Zero is fully transparent. A value of around 160 can be useful for blending views of multiple map layers (when applied to the upper most map layer). - - - -Autodownload Maps -This can be useful to turn off when you are not online to avoid pointless download requests or may be keep a map in a 'historical' state. -e.g. perhaps in case a current map rendering is broken. - - -Autodownload Only Gets Missing Maps -Using this option avoids attempting to update already acquired tiles. -This can be useful if you want to restrict the network usage, without having to resort to manual control. Only applies when Autodownload Maps is on. - - -Zoom Level -Determines the method of displaying map tiles for the current zoom level. -Viking Zoom Level uses the best matching level, otherwise setting a fixed value will always use map tiles of the specified value regardless of the actual zoom level. - - -
- - -
Layer Operations -
Download Missing Onscreen Maps - -This requests map tiles for areas of the viewport that do not currently have one. - -
- -
Download New Onscreen Maps - -This requests map tiles only if the maps are older than the Tile Age preference. - -
- -
Reload All Onscreen Maps - -Force a refresh of all visible map tiles. - -
- -
Download Maps in Zoom Levels - -This opens a dialog to enable requesting the download of maps for the region in the viewport over a specified number of zoom levels. -The download method type can be specified to help limit the number of requests. - - - -There are some inbuilt limits to prevent downloading large amounts of map tiles. - - -Please respect the usage policy of the tile set provider. -Such as OSM Tile Usage Policy. - - - -
-Maps Download Dialog: Example - - - -
-
-
-
- - -
- -
Aggregate Layer - -This layer is a container layer to hold other layers. There is always an initial and controlling Top Layer that can not be removed or renamed. - - -This layer type is useful for grouping other layers, especially layers, in whatever categories are relevant to you: such as by activity, location or date. -Here are some suggestions: - -Hiking -Mountain Biking -Road Cycling -Car Trips -Sailing -Holidays -UK Points of Interest -USA Points of Interest -etc... - - - -Thus one can have a list of all your tracks, but groups can be shown or not using the relevant layers visibility checkbox. - - - -Tracks Area Coverage (TAC) is a feature to highlight areas with track coverage. -It is based on OpenStreetMap style tiles - as an approximation to a grid square system. -The size of the area can be changed, which is linked to the OSM Zoom level, -such that a higher Zoom level gives a smaller physical area and so more tiles. -This can be used for general curiousity or perhaps to plan routes to visit areas previously unexplored. - - -The calculations are performed in the background when deemed necessary (e.g. loading in a new file) and can also be manually requested. - - -Note that Viking can be slow in drawing hundreds or more tracks but this analysis is relatively quick and the resulting drawing is much faster. -Thus ATM is it recommended to turn off the visibility of the tracks themselves for this type of usage. - - - -
-Tracks Area Coverage: Example - - - -
-
- -
Layer Properties: Tracks Area Coverage -Offers basic controls whether it is enabled or not and includes the size of the tile. -
- -
Layer Properties: TAC Advanced -Controls subsets of TAC drawing are calculated and shown with their colour and opacity. -Note for Max square coverage, ATM it will only draw the first square encountered, although there may be more than one such area. -Note for Cluster coverage, ATM it will only draw the first cluster encountered, although there may be more than one such area. -
- -
Layer Operations - -The following are available on Aggregate Layers: - - -
New Layer - -Add a new layer of the selected type. - -
- -
Sort - -The list within the treeview can be sorted. - - -Alphabetical and Date sorts are available. - - - -Generally it is not useful to sort the Top most layer. Sort is mainly intended for Aggregate groups of TrackWaypoint layers. - - -
- -
Track List - -Selecting this opens a dialog listing all the tracks in a table along side statistics such as track length and maximum speed. -Each column header is clickable and will reorder the list according to that particular column. -You can also rearrange the columns via dragging the column header to the new location. - - -This table may be invoked from a variety of different layer levels and will then list only the relevant tracks (and/or routes). - - -Aggregate Layer -Lists Tracks and Routes and the TrackWaypoint Layer they are in - - -TrackWaypoint Layer -Lists Tracks and Routes - - -TrackWaypoint Track sublayer -Lists Tracks only - - -TrackWaypoint Route sublayer -Lists Routes only - - - - -
-Track List Dialog: Example -
- -This is showing all tracks and routes (although there are no actual routes here!) in multiple TrackWaypoint layers, that has been sorted by height. -Note that routes will not have timestamps or speeds, but may have elevations and should have some distance! - -
- - - -
-
- -Hovering the mouse over an entry will show a tooltip of the comment or description if it is available. - - -Each entry in the track list can be selected and on mouse right click offers these options: - - -View -Move the viewport to the area of the item and highlight it. - - -Statistics -Opens the Properties dialog on the tab. Note this will close the track list dialog. - - -Copy Data -Copy the data fields as text. - - - - -If multiple entries are selected the only right click option is Copy Data. -This copies the individual data fields as plain text separated by tab characters, ideal for pasting into other applications in particular spreadsheet programs. -Note that the order of the fields copied is the default column ordering (irrespective to how they may have been rearranged). - -
- -
Waypoint List - -Selecting this opens a dialog listing all the waypoints to give a overview of the waypoint information. -Each column header is clickable and will reorder the list according to that particular column. -You can also rearrange the columns via dragging the column header to the new location. - - -This table may be invoked from a variety of different layer levels and will then list only the relevant waypoints. - - -Aggregate Layer -Lists Waypoints and the TrackWaypoint Layer they are in - - -TrackWaypoint Layer -Lists Waypoints - - -TrackWaypoint Waypoint sublayer -Lists Waypoints - - - - -
-Waypoint List Dialog: Example -
- -This was invoked on a TrackWaypoint layer and shows all waypoints from that single layer. It has been sorted by the symbols. - -
- - - -
-
- -Hovering the mouse over an entry will show a tooltip of the description if it is available. - - -Each entry in the list can be selected and on mouse right click offers these options: - - -View -Move the viewport to the area of the item and highlight it. - - -Properties -This will open the properties dialog. Note this will close the waypoint list dialog. - - -Show Picture -If enabled, this will open the associated image in an external Image Viewer program. - - -Copy Data -Copy the data fields as text. - - - - -If multiple entries are selected the only right click option is Copy Data. -This copies the individual data fields as plain text separated by tab characters, ideal for pasting into other applications in particular spreadsheet programs. -Note that the order of the fields copied is the default column ordering (irrespective to how they may have been rearranged). - -
- -
Visibility Options - -This offers a quick way to set all the visibilities of each item within the containing layer, rather than having to change each one individually. - - -Show All -Ensures all items are set to be visible. - - -Hide All -Ensures all items are set to be invisible. This is useful for then turning on single items afterwards so the display is not cluttered. - - -Toggle -Inverts the visibility status of each item. - - - -
- -
Search by Date - -This opens calendar dialog to select a date to search by within this Aggregate layer. -The first item that is found on that date will be selected. -Tracks are searched first in preference over waypoints. - -
- -
Statistics - -This opens a dialog to display various statistics about all tracks contained within this Aggregate layer. - -
-Statistics Dialog: Totals - - - -
- - - This currently generates a simplified Eddington number. - In that a per track length value is used, rather than trying to work out a length per day. - (i.e. doesn't combine multiple tracks for a single day or split very long tracks into days). - The Eddington number is in the current Unit distance . - - -
-Statistics Dialog: Years - - - -
-
- -
Append File - -This opens a dialog to select files to load within this Aggregate layer. - -
- -
Tracks Area Coverage->Calculate - -Start a new Tracks Area Coverage calculation. - -
- -
Tracks Area Coverage->Remove - -This clears the Tracks Area Coverage information, thus no grid colouring will be displayed. - -
- -
-
- - - - - - - -
Coordinate Layer - -This layer is allows drawing of grid lines on the viewport. - -
- - -
Tools - -&appname;'s mouse actions on the viewport are controlled by which tool is active. Only one tool can be active at a time. The default mode is pan. You can return to the default mode by pressing Escape. - - -You can use the scroll wheel, the middle-click, the middle-click+drag to zoom, center map at position and pan respectively no matter what tool you are using. - - -Scroll: zoom in and out keeping the mouse over same location - - -Ctrl-scroll: pan north-south (also Ctrl-up, Ctrl-down) - - -Shift-scroll: pan east-west (also Ctrl-left, Ctrl-right) - - -Ctrl-shift-scroll: zoom in and out, without changing the center (also Ctrl+, Ctrl- [*not* KeyPad +/-]) - - -Middle-click: make the clicked point on the map the center - - -Middle-click and drag: pan - - -
Pan - -This is the default mode of operation for &appname;. - - -This mode is entered by clicking on the toolbar icon: - - -Pan moves the viewpoint. A single click centers the viewport at that point, whereas click and drag dynamically moves the view around. -This is the default tool. - - -This mode can also be entered by the keyboard shortcut Ctrl+Shift+P - - -Double clicking the left mouse button will zoom the map in. -Shift + double clicking the left mouse button will zoom the map out. -Double clicking the right mouse button will also zoom the map out. - -
- -
Zoom - -This mode is entered by clicking on the toolbar icon: - - -Zooms in and out on the clicked part of the map or by the selected area. - - -This mode can also be entered by the keyboard shortcut Ctrl+Shift+Z - - -Ctrl + left or right click: Zoom in/out and center the map on the clicked location - - -Shift (and hold) + left mouse button: Draws a bounding box area on which to zoom in. The zoom action is performed when the left mouse button is released. - - -Shift + left click button: Jump Zoom In by up to factor of 3 standard zooms. - - -Shift + right click button: Jump Zoom Out by up to factor of 3 standard zooms. - -
- -
Ruler - -This mode is entered by clicking on the toolbar icon: - - -The ruler is used to measure either: - - - -The bearing and distance between two points: Click on first point and then move the mouse point around - the values will be continually updated. -A second click will freeze the ruler at that point. - - - -An area: Shift (and hold) + left mouse button: Draws a bounding box area. Area values are shown in the statusbar and on the viewport. -Releasing the mouse button will freeze the area at that point. -The viewport label option is controlled by . - - - - -This mode can also be entered by the keyboard shortcut Ctrl+Shift+U - -
- -
Version1.1+: Select - -This mode is entered by clicking on the toolbar icon: - - -The select tool allows one to choose any waypoint or track by clicking on it (or reasonably near) in the viewpoint. - - -ATM to select a track one must actually click on a trackpoint, which is also selected. - - -This mode can also be entered by the keyboard shortcut Ctrl+Shift+S - -
- -
TrackWaypoint Layer Tools - -You must have a Layer selected to use these tools. - -
Create Waypoint - -Enable this tool by clicking on the toolbar icon: - - -Left click will open the new waypoint dialog using the specified position. - -
- -
Create/Edit Track - -Enable this tool by clicking on the toolbar icon: - - -General track edit/create tool. -The first left-click will create a new track and you will be asked to enter a name for the track. -If Shift is held, a track will be continued from a nearby trackpoint. -Subsequent left-clicks will add new trackpoints. -If Shift is held, the track will be joined to an existing track at the point selected. -If Ctrl is held, it will jump the new trackpoint position to a nearby existing trackpoint. - - -Right click or Backspace: undo one point. - - - - - -Double click or Escape: to finish track creation. -Finishing the track is also available via the right click and track menus. - - -One must finish the current track to be able to create another track. - - -Keypad Add or ]: Insert point after current point. - - -Keypad Minus or [: Insert point before current point. - - -Left: Select the previous point. - - -Right: Select the next point. - -
- -
Edit Route - -Enable this tool by clicking on the toolbar icon: - - -This operates in exactly the same way as the Edit Track above. - - -One must finish the current route to be able to create another route. - - -One can switch between the Edit Route and Route Finder tools while editing routes. - -
- -
Create Route Using the Route Finder - -Enable this tool by clicking on the toolbar icon: - - -Requires an internet connection. -Left click to create a new trackpoint. -If it's the initial trackpoint you will be asked to enter a name for the route, otherwise the default routing engine will be queried to find a route to the new trackpoint. -Right click or Backspace: remove the last added route. - - -Escape: to finish route creation. -Finishing the track is also available via the right click and track menus. - - -One must finish the current route to be able to create another route. - - -One can switch between the Edit Route and Route Finder tools while editing routes. - -
- -
Track Splitter - -Enable this tool by clicking on the toolbar icon: - - -Use this tool to split a track or route. -After enabling the tool, click on the track/route point of the track/route at the position where you want the split to occur. - -
- -
Edit Waypoint - -Enable this tool by clicking on the toolbar icon: - - -Left Click/drag: select/move a waypoint. -If Ctrl is held at the same time, it will jump the waypoint position to a nearby existing trackpoint. -If Shift is held at the same time, it will jump the waypoint position to a nearby existing waypoint. - -Right-click on waypoint: opens a menu with waypoint actions (the -same menu accessed by right-clicking the waypoint in the layers panel) - -
- -
Edit Trackpoint - -Enable this tool by clicking on the toolbar icon: - - -Left click near a trackpoint (in screen pixel terms) to bring up the Track Point Edit dialog on that trackpoint. -Whilst the edit dialog is already open, left click again and drag enables moving of the trackpoint. -If Ctrl is held at the same time, it will jump the new trackpoint position to a nearby existing trackpoint. - -
Edit Trackpoint Dialog - -Editing options in the Trackpoint Edit dialog include: - -Edit the trackpoint name -Changing raw lat/long position and altitude -Forward (go to the next trackpoint) -Back (go to the previous trackpoint) -Delete -Insert. Inserts a point halfway to next trackpoint -Split. - - - -Several fields are read only for reference purposes, values are shown if the trackpoint has such information: - -Time. -Speed and course. -'Between' values: Speed, Time Difference and Distance Difference. When moving between trackpoints (via the Back and Forward buttons) these values are calculated. -GPS precision factors. - - - -
-Trackpoint Edit Dialog: Example - - - -
-One must have been going downhill here to get a reasonable speed by bicycle! -
-
-
- -
Show Picture - -Enable this tool by clicking on the toolbar icon: - - -Opens an image viewer with the picture associated with the waypoint. -By default this uses the default system image viewer. -For Linux you can override this with the setting in the - -
- -
- -
Georef Map Layer Tools - -You must have a Map Layer selected to use these tools. - -
Georef zoom - -Enable this tool by clicking on the toolbar icon: - -Changes the zoom level of the georeferenced map and changes the -&appname; zoom level accordingly. Useful if you are trying to match GPS -data to a georeferenced map. - -
- -
Georef move - -Enable this tool by clicking on the toolbar icon: - - -Drag to move the georeferenced map. - -
-
- -
Map Download - -You must have a Layer selected to use this. - - -Enable this tool by clicking on the toolbar icon: - - -Click to download a single tile. Drag to download tiles in the dragged rectangle area. - - -Right-click to redownload tiles via the selected method. Right-click and drag to redownload tiles in the dragged rectangle area by the selected method. -The possible methods to redownload one or more tiles are: - - - - -Bad -Only if the tile is corrupt in some way or missing, then this will download a new copy - - -New -Refresh the tile according to the local map cache and if server has a newer version - - -All -Redownload the tile - - - -Map Tile Information - -By right clicking on viewport and selecting Show Tile Information you can see the tile properties of this location for the current map layer and current zoom level. -This includes the remote source URL for the tile and the cached version on the local filesystem with timestamp details. - - - -
-Map Tile Info Dialog: Example - - - -
-This is using MapQuest at &appname; zoom level 128 over the Isle of Wight, UK. -
-
- -
DEM Download - -You must have a Layer selected to use this. - - -Enable this tool by clicking on the toolbar icon: - - -Click to download and import a DEM file. - -DEM File Information - -By right clicking on viewport and selecting Show DEM File Infomation you can see the file properties of the DEM file for this location. -This includes the remote source URL for the file and the cached version on the local filesystem with timestamp details. - - - -
-DEM File Info Dialog: Example - - - -
-This is for block 51N, 003W - covering Bristol in the UK. -
-
- -
Webtools - -Many services are available only via a web browser (Google Maps, OpenStreetMap Potlach editor, etc.). - - -Jumping from &app; to such service can become annoying. - - -&appname; allows you to open such service directly at the position currently viewed in &app;. - - -This feature is called Webtools. It is also known as External Tools. - -
- -
- - -
Preferences -
General -
Localisation -You can select units displayed by &appname; to best fit your usage. -
-Properties dialog: units part - - - -
-Concerning degrees, you can select the way to display them: - - -DDDdecimal degree - - -DMMpartial sexagesimal display: degrees, minutes and decimal part of minutes - - -DMSsexagesimal display: degrees, minutes and seconds - - - -
-Properties dialog: degree display options - - - -
-
-
Waypoint Icon Size -An option exists to control the icon (symbol) size used for waypoints - -
-
<emphasis>Home</emphasis> Default Location: Latitude and Longitude -You can set the Home location directly by inputting the latitude and longitude in decimal degrees. - -
-
Time Display -This controls the reference timezone that times are shown in. -Locale is the current user's system preference. This was how all times were shown up to version 1.5. -World will attempt to determine the timezone at an object's position. -UTC enforces this standard timezone. -
-
Tile's age -This age is used to decided wether or not a new request to tile server must be done. - -Changing this value, you will increase or decrese the network load. -
-
Default map layer directory -This property sets the default directory of the tiles cache. -This value is used when you create a new map layer. - -You are still able to change this value in each map layer properties. -
-
Map Cache Memory Size -This controls the amount of maps that are stored in memory, rather than having to reread from disk. -Generally if you have a system with lots of memory it's recommended to increase this value. - -
-
- -
Export/External -
KML Export Units -Allows setting the units used when saved as the KML file type, such as Metric or Statue units -
-
GPX Track Order - - Other software may display tracks in a particular order (often the order saved into the file). - This allows you to control the order they are saved when exporting to a GPX file. - -
-
GPX Waypoint Symbols -Some GPS devices require waypoint symbols to be in a particular case. -E.g. On a Garmin Oregon 450 they must be in Title Case to be recognized. -
-
Image Viewer (Not Windows) -Allows setting the program used to view images associated with Waypoints. -By default this is set to xdg-open which should open the system's default image viewer, however this can be overridden with this setting. -Note: for Windows systems, viewing images associated with Waypoints always uses the system's default image viewer. -
-
External GPX programs -Allows setting the programs invoked via the Layer menu Export LayerOpen With 'program' -Two options are given so that it can be configured for various uses such as: - -An OSM editor (default) -Some other user defined program - -
-
GPSBabel -This allows setting the specific location of GPSBabel. -&appname; will need to be restarted for this setting to take effect. -
-
Auto Read World Files -If this is on, when a new image is selected for the GeoRef layer then the associated world file will be read to find the scale and positional properties. -The associated file is based on filename patterns; e.g. if the image is filename.jpg - then the world file may be filename.jpgw or filename.jgw -
-
Auto Device GPX Simplify -If this is on, GPX files will be simplified (using GPSBabel) if they are saved into a special location (by default a Garmin device location in OS file system). -Extra parameters used in process such as the location and limits applied can be refined by export_device_* values in . -A warning message is displayed when this occurs so one can consider if manually managing the tracks is needed, e.g. see methods. -The main intention for this is to prevent writing GPX files that are only partially useful. -For instance on a GPS Etrex 20 device: if a track with 1000 points is saved to it, the device will only read in the first 500 points, -thus effectively making only 1/2 of the track available. -Hopefully a simplified track will be more useful to follow to your destination when one is out in the wilds, than only a section of it. - -You will need to set the appropriate limits for your device, as this is not currently auto detected. -
-
- -
Advanced -
Save File Reference Mode - - Files referenced within project files can be saved with either absolute or relative paths. - Using relative paths can be useful when copying the project file and the associated files between different systems. - -
-
Ask for Name before Track Creation -A setting to control whether an automatic name is used when creating a new track or route, or whether you are asked to enter a name. -
-
Show Tooltip during Track Creation -A setting to control whether the tooltip with the cumulative track or route distance is shown when creating tracks and routes. -
-
The number of recent files - - The number of recent files shown in the FileOpen Recent File menu. - A value of -1 means all files. The new value applies to New Windows only (or on application restart). - -
Open files in selected layer -A setting to control whether non Viking format files (i.e. typically GPX or KML files) will open in the selected TrackWaypoint Layer. -When no TrackWaypoint Layer is selected (or the layer is invisibile) then the file will be open in the default manner: at the top level. - -
-
Show calendar day names -A setting to control whether the calendar displays day names (Mon, Tue, etc...) or not. - -
-
Ruler area label position -A setting to control the position of the label drawn on the viewport that shows the area value. Includes a setting to turn off the label. - -
-
Use Scroll to Zoom -A setting to control if scroll events cause the viewport to zoom (rather than moving). Useful with mouse scroll wheels, but less intuitive for touchpads. - -
-
Invert Scroll Direction -A setting to control the direction of scroll events. Especially useful with touchpads and can be used to override the desktop system's setting. - -
-
-
- -
OpenStreetMap Traces -
OAuth Method - - Using the OAuth method means that your OSM account details are no longer needed to be known by &appname;. - Instead specific tokens are generated for use only by &appname; which are associated with your OSM account. - -Get New OSM Access Tokens - Use this button to generate a new OSM Access Token Key and Secret. - You will be redirected to the OSM website to confirm allowing &appname; to access the GPX Traces features. - The tokens returned by the OSM website will be stored in the Access Token Key + Access Token Secret preferences. - -Access Token Key + Access Token Secret: -These are the values used, however one typically does not need to manually change them. -
-
HTTP Basic Authentication (Discouraged) -OSM Username + Password -Store your OSM details here, so that you don't need to enter it in every time in the procedure. -This is not recommended and one should use the OAuth method using access tokens described above. - - -Your OSM password will be stored in plain text. - - - - -This password is transferred unencrypted in every request sent to the OpenStreetMap server. This is due to the use of OpenStreetMap's basic authentication method. - - - - -When OAuth capability is built into &appname; (the default), use of HTTP Basic Authentication can only be used if the osm_basic_auth is enabled. - - -
-
- -
Mapnik - -If any changes to these settings are made, you will need to restart &appname; to make them be applied. - - -
Plugins Directory -The location of Mapnik plugins. An attempt is made to automatically determine the initial value, - however if this is wrong or Mapnik is upgraded then the directory can be set here. -
-
Fonts Directory - -The location of fonts for use with Mapnik. Normally it is best to simply use the System's font directory. - -
-
Recurse Fonts Directory -Load fonts in any sub-directories of the main font directory. -
-
Rerender Timeout -The time in hours before any tile is rerendered. -This is useful in case the underlying source data for the tiles changes (e.g. OSM data is continually evovling). - &appname; normally has no way of knowing when the data has changed, so this simple timeout method is provided to maintain consistency of the tile images. -
-
CartoCSS -This allows setting the specific location of the carto executable. -
-
Threads - - The number of threads to use for Mapnik rendering tasks. - By default the value is set to the 1 in case of any multi-threading rendering code chain crashes. - Otherwise trying setting the value to the number of the CPUs of the system minus one (so as not to overload the system), in order to minimise the overall rendering times. - -
-
- -
Routing -
Routing engine -You can select the routing engine used by default, ie by features that do not propose a live selection, like . -
-
- -
Startup -Naturally since these preferences effect the startup, the values will not be used until &appname; is restarted. -
Restore Window Setup -When this is enabled, the main window size and layout (such as whether the statusbar or layers panel are shown) is restored to the values from last use. -
-
Default Map Layer -When this is enabled, a map layer is automatically added whenever &appname; is opened and a &appname; file is not to be loaded. -The map layer used is defined by the map layer's default values. -
-
Startup Method -Enables selection of how the startup position should be determined. - - -Home Location (default) -Position as set by the Set the Default Location - - -Last Location -Uses the last position viewed on the viewport - - -Specified File -Load the file as specified below - - -Auto Location - - Uses the GeoClue service if available - or otherwise the web service hostip.info to attempt to determine your location via IP lookup - - - - -
-
Startup File -Loads this specified file when the Startup method is set to Specified File -
-
Check For New Version -Periodically (no more than once every 14 days), check to see if there is a new version of &appname; available. -
-
- -
Toolbar -
Append to Menu -Allows setting the toolbar on the same vertical space as the menu, thus increasing vertical space for the map. -
-
Icon Size -Allows configuration of the icon size, including overiding the system's default preference to the setting desired just for &appname;. -
-
Icon Style -Allows configuration of the icon style, including overiding the system's default preference to the setting desired just for &appname;. -
-
Customize -Opens the Customize Toolbar dialog. -From this dialog the items in the toolbar can be added, removed and reordered. Reordering of items is performed by drag and drop. -
-Customize Toolbar dialog - - - -
-
-
- -
- - -
Howto's -
Getting Started - -&appname; from version 1.5 has several features to ease the start up process. -On the very first run, you will be asked if you want to enable these features which make use of an Internet connection. -If you select no or you have upgraded from an earlier version you can choose to enable any of the startup options via the . - - -Some other general use cases for using &appname;, are as follows: - -
Go to an area of interest - -&appname;'s default location is a Manhatten, New York, USA, so you may need to pick another place that interests you - such as where you live. - - -Method A - - - Use the online location address/place search. - - - Use the Go to Location toolbar button or from the menus - ViewGo to Location. - You can change the search location provider if desired. - Enter the name of place you wish to go to (you may need to specify the country to refine the search). - Also you can enter a post code or a ZIP code instead. - - - You will need an internet connection for this search to work - - - - -Method B - - - If you know the coordinates of where you want to view: - - -Use View and select from either Go to Lat/Lon or Go to UTM and then enter in the specific coordinates. - - - - -Method C - -Use the GPS Layer or FileAcquireFrom GPS -to load data directly from your GPS into &appname;. - -You can specify the types of data to acquire: Tracks, Routes and/or Waypoints. - - -You must have write permission to the port used. For Unix like OS: - - /dev/ttyS0 is the first serial port - /dev/ttyUSB0 is the first USB port - usb: is any USB port - -Depending on your distribution only one of the USB port types may work -For Windows: - - com1: is the first serial port - usb: is any USB port - - - - The GPS devices supported are those supported by GPSBabel. - Garmin and Magellan GPS devices supported by all versions, later versions of GPSBabel support more devices such as DeLorme and Navilink. - - - - -Method D - - -Get data from files in GPX or KML format, which can be opened directly. -Use FileOpen - - -Other formats can be imported that are supported by GPSBabel. -FileAcquireImport File With GPSBabel... - - - -The viewport will be automatically moved and resized to view the contents of the file. - - - - -
-
Add a Map Layer - -Use LayersNew Map Layer, and choose a suitable cache directory -where you would like to store your tracks and click OK. Zoom to a -comfortable level (I suggest 4 mpp) by clicking the left and right -mouse buttons on the gray area where your tracks are. Now from the menu -choose the Tool. Click where you would like to download a -map. Regardless of what tool you are using, the middle mouse button -always pans. - - -You need an open internet connection when you are downloading maps. - - - -If you can no longer see your tracks or waypoints and only the map, -it is because the layer named Map is ABOVE your TrackWaypoint layer that your GPS data is in. -This means that it will be drawn last and on top of the other . -Look at the to the left which shows this order. -Select the Map layer from the list and click the down arrow button beneath the list until the Map layer is below the TrackWaypoint layer. -Your tracks will now be drawn over the map. - -
- -
Set Your Home Location - - You can save the current center position of the viewport as the default location AKA the Home Location by - EditSet the Default Location. - - - Then at any time you can return to this place by clicking on the Home icon on the toolbar. - - - You can also set the default location via specifing the exact latitude and longitude in the . - -
- -
-
From 1st startup to GPS track (including offline maps) - -The first you'll see is an empty map, because &appname; in its default configuration will download maps only on demand. -Before fetching unneeded data, one can position to a location of interest, e.g. Stuttgart: ViewGo to Location, enter Stuttgart. - -
Fetching the maps - -Map - - -LayersNew Map Layer -in the layer properties dialogue choose e.g. OpenStreetMap (Mapnik). - -For the moment, we keep the default Maps Directory (the directory in -which the maps will be stored and can be used for offline usage). - - -Check Autodownload maps and keep the zoom level as Use Viking -Zoom Level. - - -however, that these settings will play an important -role in the pre-fetch for offline usage discussed later - - - - -You'll see a map of Stuttgart. Using the mouse wheel, you can -zoom in and out. The maps for the choosen resolution will be downloaded -automatically. - - -DEM Layer (Height Map) - - -Zoom out to 512. -LayersNew DEM Layer -Keep the download source as is (SRTM Global 90m), hit OK. - - -In the layer listing on the left, the layer should reside -above the map layer. If this is not the case, highlight the DEM layer -an shift it one up (using the arrow up button). - - -highlight the DEM layer in the layer listing on the left -in the toolbar, check DEM layer download/import (the last symbol) -a left-click in the map window should then fetch the DEM data - - -This might take some time. - - -Sometimes, a tile does not show up correctly (you might see only a -black frame in the map window) because it got corrupted during -transfer. In order to correct this, you can delete the corresponding -datafile in the cache. right-click the DEM layer properties - - -The DEM Files listing allows you to delete the specific tiles (alternatively do this from the command line). - - -You can also alter the Min. and Max. elevation in this dialogue. - - -
-
GPS Track with Height Profile - -Uncheck the layer (the map is shown again) - - LayersNew TrackWaypoint Layer - Ensure the new track layer is above the map layer. - -Expand the layer, select Tracks -In the tools menu choose Create Track - -Leftclick in the map window, enter a name - - Click several times to generate a track (a right-click removes the last point). - Height data is set automatically since DEM data is available - -Expand tracks in the layer menu, your track should show up, select it -Right click your track, select Properties -Click the tab Elevation-distance - enjoy the plot - - -In order to save this setting for later usage - - -click OK in the Track Properties dialog -FileSave As, choose a name (you can open this view later via fileOpen). - - -
-
Usecase: offline data for holiday - -Suppose you want to have the and data offline for your holiday in Italy near Bologna. - - -Start a new &appname; session. -ViewGo to Location, enter Bologna -LayersNew Map Layer -Choose e.g. OpenStreetMap (mapnik). -adapt the maps directory e.g. to /home/user/.viking-map-holiday/. -This allows you to delete the map stuff after holiday without purging the rest of your maps. - -check autodownload map -keep viking zoom level -zoom out to 1024 -add a layer (as discussed above) -download the DEM data - -In the &app; version discussed here, the DEM data automatically -are stored in /home/user/.viking-maps/. You can move the corresponding -tiles into .viking-map-holiday/ if you like. - - -Download map data for all zoom levels - - -uncheck the DEM layer for the map to show up -navigate the map to be centered at Bologna -choose the zoom such, that all regions of interest are displayed in the map window (e.g. 1024) - -follow this sequence until you have all tiles for all zoom levels you need - -right-click the map layer properties -set the zoomlevel explicitely one below the last (in the first cycle 512), hit OK -right click the map layer Download Missing Onscreen Maps -wait until all tiles for that resolution have been downloaded - - - -This may take some time and some hard disk capacity. - -Do not forget to save your configuration (as discussed above). - - -
- -
-
OpenStreetMap project - -OpenStreetMap (OSM) is a collaborative project to create a free editable map of the world. -One of the sources of data for this project is GPS tracks. -&appname; supports this project via the GPS Traces methods, both uploading and downloading such data. - - - Authentication/authorization is required to use these services. See . - - -Also see for further detail. - -
Uploading data to OpenStreetMap - -It is possible to upload data directly from &appname; to OpenStreetMap. - - -Upload a layer - -One solution is to upload whole a layer. To do this, -simply select the layer and right click on it. Then, select Upload to -OSM. - - - -Upload a single track -Another solution is to upload an individual track. Simply select the track and right click on it. -Then select Upload to OSM. - - - -Fill in the form - -The filename is the name you want your upload has on the server. This information is displayed by the osm server. -The description is some descriptive information. -The tags field is a white space separated list of tags. - - -
- -
Downloading Traces from OpenStreetMap - -It is possible to download GPS traces directly from OpenStreetMap into &appname;. -This feature can be really useful for checking existing data before uploading new ones. - - -Download all visible tracks -One solution is to select - -File -Acquire -OSM traces... -. -Each request can get up to 5,000 points. -The dialog box allows setting which group of 5,000 points to get. These groups are known as Page Numbers which start at 0. -Increasing the page number parameter allows one to request the subsequent sets of point groups. - - -
-
Downloading Your Own Traces from OpenStreetMap - -It is possible to download any of your personal GPS traces previously uploaded to OpenStreetMap into &appname;. - - -Initially this will return the list of your OSM Traces, from which you can select which specific traces to retrieve. -This list can be sorted on each column so that it easier to find an individual trace or select a group of traces by similar properties. - -
- -
- -
Geotagging - - This assumes you already have a layer enabled for ease of use (if not see above to get one). - -
Manual Positioning - - This is useful for instances when you already know exactly where the image was taken (no need for tracklog). - Or maybe you want to adjust an automatically generated waypoint for the position of the subject of the image rather than the location that the photograph is taken from. - ATM this process only works on an individual image, so it will be tedious for handling lots of images. - - - First create a layer or use an existing one; and select it in the . - NB Make sure this layer is above the map layer in the Layers Panel list. - Create a new waypoint (or move an existing one) to exact location desired: - - Select the tool, then left click on the map at the location desired, choosing an image to associate with it in the new waypoint dialog - Select the tool, then left click on waypoint to be moved. Left click again and drag the waypoint to the location desired - - Then using the Select tool left click on waypoint to select it, then right click to access the Waypoint properties menu, then choose - Update Geotag on ImageUpdate - - - The Update Geotag on Image options are only available when a waypoint has an image associated with it. - -
- -
Automatic Positioning Against a Tracklog - - First you will need a tracklog with timestamps in it. Either load one from a previously saved file or freshly acquired from a GPS device - - see Getting Started. - It helps if this is the track that was recorded at the time you took some photographs! - - - Select the track either from the layers panel on the left or via the viewport using the tool. - Then right click on it and chose the Geotag Images... leading you to the Dialog. - - - Load some images that where taken around the time the track log was recorded. Confirm the other options in the dialog - normally the defaults should be alright and select OK. - If things are succesful, new waypoints with thumbnail images of the photographs will appear. - You should probably check they are really in the right place as often the timestamp of the camera may not be aligned to the GPS correctly leading to inferring incorrect locations. - -Option: Overwrite Waypoints - - This is particularly useful when one finds an attempt at geotagging gives wrong locations, often due to time offset issues. - Simply try again with a new time offset (often 1 hour adjustments due to Daylight Savings or Summer Time times) and the old waypoints will be updated (instead of creating new ones). - - - - If you have multiple tracks in a TrackWaypoint layer, then invoking the Geotag Images... action on the layer - will search all the tracks to find location matches. - -
-
- -
GPS Real Time Location - - &appname; relies on gpsd to provide the current location from a real time feed from a GPS device. - - - This assumes you already have a layer enabled for ease of use (if not see above to get one). - - - Turn on the GPS Device, ensure it has figured out it's location and plug it in to your computer. - -
Set Up GPS Layer - - You will need a layer. One can be added via LayersAdd GPS Layer. - - - Adjust the Realtime Tracking Mode settings to interface with gpsd as necessary. Normally the defaults should suffice. - - - Current Linux distributions should run gpsd automatically when a GPS Device is plugged in. Otherwise you may have to run gpsd manually. - - - Then right-click the layer and select Start Realtime Tracking. - Hopefully the viewport should jump to the GPS location. - - - Troubleshooting checklist: - -Confirm gpsd is running. -Confirm on the GPS device it has a location. -Confirm the Realtime Tracking Mode settings. -
-
- -
What to Do if &appname; Does Not Seem to Work - -In order to get some information about what &appname; is doing, start it in verbose debug mode via the command line: -viking -dV - - -NB For Windows the process is slightly more involved as the output is typically not shown in the command prompt, -so you have to redirect the output to a file, e.g. open the command prompt and then: - -cd "C:\Program Files\Viking" -viking -dV 2>1 > %TMP/viking.log - -Then close &appname; before viewing the output file, such as: -notepad %TMP/viking.log - - -For instance you can check the correct URLs &appname; is using in requesting remote data for DEMs or map tiles in the verbose debug output. -E.g. Something like this for DEMs: - -** (viking:28778): DEBUG: curl_download_uri: uri=http://dds.cr.usgs.gov/srtm/version2_1/SRTM3/Eurasia/N48E008.hgt.zip -* About to connect() to dds.cr.usgs.gov port 80 (#0) -* Trying 152.61.128.95... * connected -* Connected to dds.cr.usgs.gov (152.61.128.95) port 80 (#0) - GET /srtm/version2_1/SRTM3/Eurasia/N48E008.hgt.zip HTTP/1.1 -User-Agent: viking/0.9.8 libcurl/7.18.2 GnuTLS/2.4.2 zlib/1.2.3.3 libidn/1.8 -Host: dds.cr.usgs.gov -Accept: */* - HTTP/1.1 200 OK - Date: Sun, 26 Jul 2009 18:13:38 GMT - Server: Apache - Last-Modified: Tue, 21 Jul 2009 19:57:35 GMT - ETag: eac3f8-1828f5-46f3caa76070a - Accept-Ranges: bytes - Content-Length: 1583349 - Content-Type: application/zip - -* Connection #0 to host dds.cr.usgs.gov left intact -* Closing connection #0 -** (viking:28778): DEBUG: dem_layer_add_file: /home/username/.viking-maps/srtm3-Eurasia/N48E008.hgt.zip - -Or for OSM Mapnik tile server: - -* About to connect() to tile.openstreetmap.org port 80 (#0) -* Trying 193.63.75.28... * connected -* Connected to tile.openstreetmap.org (193.63.75.28) port 80 (#0) - GET /13/4065/2748.png HTTP/1.1 -User-Agent: viking/0.9.96 libcurl/7.20.1 GnuTLS/2.8.6 zlib/1.2.3.4 libidn/1.18 -Host: tile.openstreetmap.org -Accept: */* - -* HTTP 1.0, assume close after body - HTTP/1.0 200 OK - Date: Thu, 14 Oct 2010 22:18:42 GMT - Server: Apache/2.2.8 (Ubuntu) - ETag: "b66ff9d46474bab68262a3483428a232" -** (viking:16704): DEBUG: curl_get_etag_func: ETAG found: "b66ff9d46474bab68262a3483428a232" - Content-Length: 17194 - Cache-Control: max-age=94805 - Expires: Sat, 16 Oct 2010 00:38:47 GMT - Content-Type: image/png - Age: 5153 - X-Cache: HIT from konqi.openstreetmap.org - X-Cache-Lookup: HIT from konqi.openstreetmap.org:3128 - Via: 1.1 konqi.openstreetmap.org:3128 (squid/2.7.STABLE7) - Connection: close - -* Closing connection #0 -* About to connect() to a.andy.sandbox.cloudmade.com port 80 (#0) -* Trying 178.63.75.195... ** (viking:16704): DEBUG: curl_download_uri: uri=http://tile.openstreetmap.org/13/4065/2749.png -* About to connect() to tile.openstreetmap.org port 80 (#0) -* Trying 193.63.75.28... * connected -* Connected to a.andy.sandbox.cloudmade.com (178.63.75.195) port 80 (#0) - GET /tiles/cycle/13/4065/2747.png HTTP/1.1 -User-Agent: viking/0.9.96 libcurl/7.20.1 GnuTLS/2.8.6 zlib/1.2.3.4 libidn/1.18 -Host: a.andy.sandbox.cloudmade.com -Accept: */* - -* connected -* Connected to tile.openstreetmap.org (193.63.75.28) port 80 (#0) - GET /13/4065/2749.png HTTP/1.1 -User-Agent: viking/0.9.96 libcurl/7.20.1 GnuTLS/2.8.6 zlib/1.2.3.4 libidn/1.18 -Host: tile.openstreetmap.org -Accept: */* - -* HTTP 1.0, assume close after body - HTTP/1.0 200 OK - Date: Thu, 14 Oct 2010 23:44:35 GMT - Server: Apache/2.2.8 (Ubuntu) - ETag: "8e520ad47ce9c1b63430554886eb5fab" -** (viking:16704): DEBUG: curl_get_etag_func: ETAG found: "8e520ad47ce9c1b63430554886eb5fab" - Content-Length: 18094 - Cache-Control: max-age=87742 - Expires: Sat, 16 Oct 2010 00:06:57 GMT - Content-Type: image/png - X-Cache: MISS from konqi.openstreetmap.org - X-Cache-Lookup: MISS from konqi.openstreetmap.org:3128 - Via: 1.1 konqi.openstreetmap.org:3128 (squid/2.7.STABLE7) - Connection: close - - -
- -
- - -
- Extending Viking - - Currently, &app; has some extention points based on configuration files. The file format is heavily inspired by the GtkBuilder file format: you specify the class of the GObject to build and set its properties. Technically, it is a XML file containing a "objects" root element. Inside this element, you set a collection of "object". - Here is an example: - - - Property value - Property value - - ... - -]]> - - - You can find more examples in the documentation part of the distribution. - - It is also possible to override the internal defaults e.g. to update any parameters should they change over time, - by adding the values into your configuration file. - When you define object group that already exists (and for Maps this means by a repeated Id key, but you may have to examine the source code to work out what the relevant Id values are) then you need to define all the other keys as well, otherwise they will be reset to the defaults. - -
- Map Source - It is possible to add new map's sources. The file is ~/.viking/maps.xml for UNIX like systems, C:\Documents and Settings\username\.viking\maps.xml on Windows XP or C:\Users\username\.viking\maps.xml on Windows 7 onwards. - An example of the file is in the distribution doc/examples/maps.xml. Further examples and values are online in the Maps Wiki - - The VikSlippyMapSource allows to declare any map's source working like OpenStreetMap. It supports the following properties: - - - id - this is an integer and should be unique as it used to identify the map source - - - name - a string (should be unique) that is used for the OSM style cache directory name when the Map Cache directory is the default (~/.viking-maps) - - - label - the text displayed in the map's source selection dialog - - - hostname - the server's hostname (eg. "tile.openstreetmap.org") - - - url - - the parametrized address of the tile, in the spirit of C printf format, with 3 "%d" fields for Z, X and Y (in that order) (eg. "/%d/%d/%d.png") - - The full parametrized address can just be put in the URL field and the hostname field doesn't need specifying. - e.g. "https://tile.openstreetmap.org/%d/%d/%d.png" - - - - - zoom-min (optional) - The minimum zoom value supported by the tile server. The Default is 0 if not specified. - - - zoom-max (optional) - - The maximum zoom value supported by the tile server. The Default is 18 if not specified. - See Zoom Levels - - - - lat-min (optional) - The minimum latitude value in degrees supported by the tile server. The Default is -90 degrees if not specified. - - - lat-max (optional) - The maximum latitude value in degrees supported by the tile server. The Default is 90 degrees if not specified. - - - lon-min (optional) - The minimum longitude value in degrees supported by the tile server. The Default is -180 degrees if not specified. - - - lon-max (optional) - The maximum longitude value in degrees supported by the tile server. The Default is 180 degrees if not specified. - - - file-extension (optional) - - The file extension of the files on disk. The default is .png - If the tile source URL ends in something other than .png, then this parameter will need to match it. - This can also be useful in reading a tileset from other software which may name tiles in an alternative form, - e.g. for Mobile Atlas creator it names them .png.tile - The file types actually usable are those supported by GDK Pixbuf Library, which includes at least PNG and JPEG. - Remember to include the beginning '.' when specifying this parameter. - - - - use-direct-file-access (optional) - - Only use files on disk. The default is FALSE - This can also be useful for tilesets already on disk as it will avoid attempting to download any tiles. - Thus with this type the hostname and url parameters are not necessary and are ignored. - - - - switch-xy (optional) - - Swap the X,Y values around in the URL parametrized ordering. - The default is false. - - - - check-file-server-time (optional) - - Sends the timestamp of the tile to the server, so the server can decide whether it should send a new tile or not. - The default is false. - - - - use-etag (optional) - - Use and compare the ETag value in determining whether to download a newer tile. The default is false. - The ETag value is stored in a separate file in the same directory as the tile to enable checking the value across multiple runs of the program. - - - - tilesize-x (optional) - The tile x size. The default is 256 pixels if not specified. - - - tilesize-y (optional) - The tile y size. The default is 256 pixels if not specified. - - - scale (optional) - - The tile scale. The scale is 1 if not specified. - Use a value of 2 to represent high res tiles. - Don't change the tilesize as the internal display size is still based on 256 pixels. - - - - - - The VikTmsMapSource allows to declare any TMS service. It supports the following properties (as per VikSlippyMapSource above): - - - id - - - label - - - hostname - - - url - - - check-file-server-time (optional) - - - zoom-min (optional) - - - zoom-max (optional) - - - lat-min (optional) - - - lat-max (optional) - - - lon-min (optional) - - - lon-max (optional) - - - - The VikWmscMapSource allows to declare any WMS or WMS-C service. It supports the following properties (as per VikSlippyMapSource above): - - - id - - - label - - - hostname - - - url - - - check-file-server-time (optional) - - - zoom-min (optional) - - - zoom-max (optional) - - - lat-min (optional) - - - lat-max (optional) - - - lon-min (optional) - - - lon-max (optional) - - - -
- -
- Go-to search engines - It is possible to add new new search engines for the "Go-To" feature. The file is ~/.viking/goto_tools.xml. - An example of the file in the distribution doc/examples/goto_tools.xml. - Currently, there is a single object class available: VikGotoXmlTool. Such feature allows to declare any search engine using a XML format as result. - The related properties are: - - - label - the text displayed in the Go-To dialog - - - url-format - the parametrized address of the query, in the spirit of C printf format, with a single "%s" field (replaced by the query string) - - - lat-path - XML path of the latitude (eg. /root/parent/elem) - - - lat-attr (optional) - name of the attribute (of previous element) containing the latitude - - - lon-path - XML path of the longitude (eg. /root/parent/elem) - - - lon-attr (optional) - name of the attribute (of previous element) containing the longiude - - - - As a facility (or readability) it is possible to set both path and attribute name in a single property, like an XPath expression. To do so, simply set both info in lat-path (or lon-path) in the following format: /root/parent/elem@attribute. -
- -
- External tools - It is possible to add new external tools. The file is ~/.viking/external_tools.xml. - An example of the file in the distribution doc/examples/external_tools.xml. - The VikWebtoolCenter allows to declare any Webtool using a logic based on center coordinates and zoom level value. - The related properties are: - - - label - the text displayed in the menu entry - - - url - the parametrized URL to open, in the spirit of C printf format, with 2 "%s" and a "%d" fields for X, Y and Z (zoom level) (eg. "http://hostname/?lat=%s&lon=%s&zoom=%d") - - - - The VikWebtoolBounds allows to declare any Webtool using a logic based on bounds coordinates. - The related properties are: - - - label - the text displayed in the menu entry - - - url - the parametrized address of the tile, in the spirit of C printf format, with 4 "%s" fields for left, right, bottom and top (eg. "http://hostname:8111/load_and_zoom?left=%s&right=%s&bottom=%s&top=%s") - - - -
- -
- Routing engine - It is possible to declare new routing engines. The file is ~/.viking/routing.xml. - An example of the file in the distribution doc/examples/routing.xml. - The VikRoutingWebEngine allows to declare a routing engine available via HTTP. - The related properties are: - - - id - a string, should be unique as it used to identify the routing engine - - - label - the text displayed in the menu entry - - - format - - The GPSBabel format code to interpret the service response. By default a GPX response is expected and processed internally. However if the service returns different format then GPSBabel is used to transform the text into something that &appname; can understand. Only formats that GPSBabel supports can be used: e.g. 'gpx', 'kml', 'gtrnctr' (for Garmin Training Center .tcx files), etc... - Use gpsbabel --help on the command line to find out the supported file types and their codes to process them. - - - - url-base - the base URL of the web service (eg. "http://hostname/service?") - - - url-start-ll - the part of the URL setting the starting point location, parametrized in the spirit of C printf format, with 2 "%s" for coordinates (eg. "&start=%s,%s") - - - url-stop-ll - the part of the URL setting the end point location, parametrized in the spirit of C printf format, with 2 "%s" for coordinates (eg. "&stop=%s,%s") - - - url-via-ll (optional) - the part of the URL setting via point location, parametrized in the spirit of C printf format, with 2 "%s" for coordinates (eg. "&via=%s,%s") - - - url-start-dir (optional) - the part of the URL setting the starting point location for direction based routing, parametrized in the spirit of C printf format, with one "%s" for direction (eg. "&start=%s") - - - url-stop-dir (optional) - the part of the URL setting the end point location for direction based routing, parametrized in the spirit of C printf format, with one "%s" for direction (eg. "&start=%s") - - - url-ll-lat-first (optional) - The ordering of the lat/long terms in the Start, Stop and Via URL settings. By default this is TRUE. - For instance using Brouter services, the URL uses a pair of values which is longitude and then latitude. Thus setting this value to FALSE ensures the value substitution is performed in the necessary order. - - - referer (optional) - A URL to serve as referer for the HTTP request (eg. "http://hostname/") - - - follow-location (optional) - the max depth of recursive redirections - - - -
- -
- Remote File Datasources - It is possible to add web references expected to return a file which can then be opened directly or converted via GPSBabel. - The file is ~/.viking/datasources.xml. - An example of the file is in the source distribution doc/examples/datasources.xml. - The VikWebtoolDatasource allows to declare any URL using logic based on coordinates. - The related properties are: - - - label - the text displayed in the menu entry - - - url - - the parametrized URL to open in the spirit of C printf format, with up to 9 "%s" values. e.g. http://hostname/getfile?lat=%s&lon=%s - The order and meaning of these parameters is given by the url_format_code below - - - - url_format_code - - A string describing the parametrized URL substitution parameters, each character represents how to translate each term. - B = Bottom of the current view i.e. minimum latitude - L = Left of the current view i.e. minimum longitude - T = Top of the current view i.e. maximum latitude - R = Right of the current view i.e. maximum longitude - A = center lAtitude of the current view - O = center lOngitude of the current view - Z = OSM Zoom value of the current view. See Zoom Levels - P = selected Point's latitude - N = selected poiNt's longitude - S = A user specified input string requested from the user via a dialog box - Thus for the url example above then the format code should be AO - - - - file_type - - This value is passed on for the -i parameter in interfacing with GPSBabel. - If it is not defined then the returned file is interpreted internally as a GPX file. - Possible values such as 'kml', 'mapsource' etc.. can be used. See GPSBabel File Formats for the full list. - - - - babel_filter_args - - This value is passed on for the filter arguments interfacing with GPSBabel. - E.g. "-x nuketypes,routes" can be used to filter all routes from the results. - - - - input_label - - This value is used when requesting input from the user. - It is the label of the text input box. - - - - -
- -
- System Extension File Locations - Note that, on UNIX like systems, the extension files (&extfiles;) are also searched in /etc/viking and /usr/share/viking directories (or related in your system). - The XDG_DATA_DIRS environment variable can be used to change these directories. - The XDG_DATA_HOME environment variable is also used (if set) to look for these extension files. -
- - -
- Miscellaneous Settings - Various individual values are automatically saved between &app; sessions in the ~/.viking/viking.ini file. - This file is not intended to be manually edited, but since it is a plain text file it can be changed if desired. - Some values in this file are read only, in the sense that there is no way to set it other than by manually entering in the keys and values (the key will not exist in the file otherwise). This allows some fine tuning of &app; behaviours, without resorting to recompiling the code. However is it not expected that these values should need to be changed for a normal user, hence no GUI options for these have been provided. - Here is the list of the read only keys and their default values. - - - curl_cainfo=NULL - See CURLOPT_CAINFO - - - curl_ssl_verifypeer=1 - See CURLOPT_SSL_VERIFYPEER - On Windows this is defaulted to 0 to get HTTPS connections to at least work, - otherwise any attempts at verifying always fail. - [Some incompatibily is suspected in the reliant binary DLLs] - - - geoclue_accuracy_level=4 - Set the integer value for the accuracy level request to the GeoClue service. Values to match the GClueAccuracyLevel: - - 0 = GCLUE_ACCURACY_LEVEL_NONE - 1 = GCLUE_ACCURACY_LEVEL_COUNTRY - 4 = GCLUE_ACCURACY_LEVEL_CITY - 5 = GCLUE_ACCURACY_LEVEL_NEIGHBORHOOD - 6 = GCLUE_ACCURACY_LEVEL_STREET - 8 = GCLUE_ACCURACY_LEVEL_EXACT - - - - gpx_tidy_points=true - ATM Only attempts to remove a suspicious first point of a GPX track - (as opposed to any points within a track). - - - gpx_tidy_points_max_speed=340 - Over this speed (in metres per second) for the first pair of points - the first point is removed. - - - layers_create_trw_auto_default=false - Create new TrackWaypoint layers without showing the layer properties dialog first. - - - layers_panel_calendar_markup_mode=3 - 0=No markups. 1=Day marked. 2=Day marked and tooltips created. 3=Auto (timed tooltip creation, so if too slow it reverts to 1) - - - maps_max_tiles=1000 - - - maps_min_shrinkfactor=0.0312499 - - - maps_max_shrinkfactor=8.0000001 - - - maps_real_min_shrinkfactor=0.0039062499 - - - maps_scale_inc_down=4 - - - maps_scale_inc_up=2 - - - maps_scale_smaller_zoom_first=true - - - srtm_http_base_url=https://dds.cr.usgs.gov/srtm/version2_1/SRTM3 - Allows using an alternative service for acquiring DEM SRTM files. - Note that the layout on the server needs to be split into Continent directories. - - - mapnik_buffer_size=128 (in pixels) - - - osm_basic_auth=false - Set to true to force the use of HTTP Basic Authenication even when OAuth is available - - - background_max_threads=10 - - - background_max_threads_local=Number of CPUs - - - window_default_tool=Pan - Options are: Pan, Zoom, Ruler or Select - - - window_menubar=true - - - window_copy_centre_full_format=false - - - version_check_period_days=14 - - - trackwaypoint_start_end_distance_diff=100.0 - - - gps_statusbar_format=GSA - This string is in the Message Format Code - - - geoclue_statusbar_format=SA - This string is in the Message Format Code - - - trkpt_selected_statusbar_format=KEATDN - This string is in the Message Format Code - - - utils_nearest_tz_factor=1.0 - - - viewport_history_size=20 - - - viewport_history_diff_dist=500 - In metres. - - Go Back or Go Forward requests over this range from the last history location will move back to that position. - If within this range it will skip over this location and move on to the next saved history location. - - - - viewport_scale=1 - - If Viking doesn't automatically detect a high resolution display, you can force the setting here - typically by setting this to 2. - - - - external_diary_program=rednotebook - Or in Windows it uses C:/Progra~1/Rednotebook/rednotebook.exe - This string value must use Unix separators and not have spaces. - - - external_astro_program=stellarium - Or in Windows use C:/Progra~1/Stellarium/stellarium.exe - This string value must use Unix separators and not have spaces. - Needs to be version 0.15.0 or greater (otherwise due to this Bug means this does not actually work). - - - external_text_program=gedit - Or in Windows it uses notepad - This string value must use Unix separators and not have spaces. - - - bfilter_simplify=100 - - - bfilter_compress=0.001 - - - list_date_format=%Y-%m-%d %H:%M - A date format description as passed on to strftime(). - Note that when displayed in tables sorting by this column simply uses the text value, rather than the underlying date/time value. - - - - export_device_path=OS Specific - UNIX = "/media/user/GARMIN/Garmin/GPX" - WINDOWS = ":/Garmin/GPX" - - - export_device_trackpoint_limit=10000 (Typical Garmin Edge limit) - Older Garmins limits are typically much lower - Etrex 20/30 is 500 - - - export_device_routepoint_limit=250 - - - kmz_default_maps_dir=Empty - You may want to use something like: "/media/user/GARMIN/Garmin/CustomMaps" - - - -
- Message Format Code - Currently for ease of implementation the message format code is a string of characters. - Each character represents what should be inserted in relation to a Trackpoint. - One day it might evolve into something more user friendly with a frontend to control it, perhaps allowing arbitary text too. However for now at least some control is offered :) - - - - Character Code - - G = Some text to display at the start of the message - GPSD - K = Some text to display at the start of the message - Trkpt - A = Altitude of a Trackpoint - S = Speed of a Trackpoint - B = Vertical Speed (Climb) - C = Course of a Trackpoint - L = Location of a Trackpoint - T = Time of a Trackpoint - M = Time diff of a Trackpoint from the previous trackpoint - X = Number of satellites used in the trackpoint fix - D = Distance of the trackpoint from the start of a track (following along the track) - F = Distance of the trackpoint from the finish (end) of a track (following along the track) - P = Distance difference of the trackpoint from the previous trackpoint - N = Name of track to which the trackpoint belongs - E = Name of the trackpoint - - - - Output Notes - - If the output has * after it, then the value has been calculated via interpolation (such as speed when the Trackpoint does not contain a speed value). - If the output has ** after it, then difficulties were encountered in trying to work out the value so probably a default of 0 will be shown. - - - - -
- -
- -
- Keyboard Shortcuts (Accelerator) Settings - This is held in the file ~/.viking/keys.rc - It is in the standard GTK Accelerator map format. Values are automatically read in and saved between &app; sessions. - This file is not intended to be manually edited, but since it is a plain text file it can be changed if desired. -
- -
- - - - - - - - -
diff --git a/help/Makefile.am b/help/Makefile.am index 9ef4869..f263aeb 100644 --- a/help/Makefile.am +++ b/help/Makefile.am @@ -1,27 +1,22 @@ -if GEN_MANPAGES -include $(top_srcdir)/gnome-doc-utils.make -endif +@YELP_HELP_RULES@ # Annoyingly in the XML, yelp refuses to load relative images fileref, i.e. ../../src/icons/file.png # whereas the PDF generation inserts these references OK # Nevertheless we need to copy the images into figures/ so they are available for the distribution installed help -# Most tool icons are _18, except the pan one which is _22 just to be annoying -get-icons: - -cp -f ../src/icons/*_[12][0-9].png C/figures/ +C/figures/%.png: + -cp -f ../src/icons/$(notdir $@) C/figures/ # '-' ^^^^^ means it doesn't care about the exit status # this copy statement is not critical (especially when run under make distcheck) -dist-hook: get-icons doc-dist-hook - -DOC_MODULE = viking -DOC_ENTITIES = legal.xml \ +HELP_ID = viking +HELP_FILES = index.docbook +HELP_EXTRA = legal.xml \ attribution.xml \ commandline.xml \ georef_layer.xml \ mapnik_rendering_layer.xml \ recommends.xml -DOC_INCLUDES = -DOC_FIGURES = \ +HELP_MEDIA = \ figures/Aggregate_statistics.png \ figures/Aggregate_statistics_years.png \ figures/addtr_18.png \ @@ -57,20 +52,17 @@ DOC_FIGURES = \ figures/Viking-TAC.png \ figures/DEM_file_info_dialog.png \ figures/customize_toolbar_dialog.png -DOC_LINGUAS = +HELP_LINGUAS = EXTRA_DIST = viking.xml.in CLEANFILES= # man pages processing -if GEN_MANPAGES MANPAGES=viking.1 man_MANS = $(MANPAGES) CLEANFILES+=$(MANPAGES) -endif -DB2MAN=@DB2MAN_XSL@ -XP=@XP@ -''-nonet +XSLTPROC=@XSLTPROC@ -''-nonet %.1: %.xml - $(XP) -o $@ $(DB2MAN) $< + $(XSLTPROC) -o $@ http://docbook.sourceforge.net/release/xsl/current/manpages/docbook.xsl $< diff --git a/help/viking.omf.in b/help/viking.omf.in deleted file mode 100644 index 745d1e5..0000000 --- a/help/viking.omf.in +++ /dev/null @@ -1,10 +0,0 @@ - - - - - manual - - - - - diff --git a/src/Makefile.am b/src/Makefile.am index 3752897..78bda6b 100644 --- a/src/Makefile.am +++ b/src/Makefile.am @@ -16,16 +16,8 @@ authors.h: $(top_srcdir)/AUTHORS sed -e "s/ \*\*.*//" -e 's/^/"/' -e 's/$$/",\\/' -e '$$s/\\$$//' $< >> $@ echo "NULL};" >> $@ -if HAVE_XSLTPROC -documenters.h: $(top_srcdir)/help/C/viking.xml - $(XP) $(srcdir)/docbook2documenters.xsl $(top_srcdir)/help/C/viking.xml > $@ -else -documenters.h: - rm -f $@ - echo "/* Generated file. */" >> $@ - echo "const gchar *DOCUMENTERS[] = {\\" >> $@ - echo "NULL};" >> $@ -endif +documenters.h: $(top_srcdir)/help/C/index.docbook + $(XSLTPROC) $(srcdir)/docbook2documenters.xsl $(top_srcdir)/help/C/index.docbook > $@ BUILT_SOURCES = authors.h documenters.h diff --git a/src/vikwindow.c b/src/vikwindow.c index 307dfd9..320df61 100644 --- a/src/vikwindow.c +++ b/src/vikwindow.c @@ -2864,7 +2864,7 @@ static void help_help_cb ( GtkAction *a, VikWindow *vw ) ShellExecute(NULL, "open", ""PACKAGE".pdf", NULL, NULL, SW_SHOWNORMAL); #else /* WINDOWS */ gchar *uri; - uri = g_strdup_printf("ghelp:%s", PACKAGE); + uri = g_strdup_printf("help:%s", PACKAGE); GError *error = NULL; gboolean show = gtk_show_uri (NULL, uri, GDK_CURRENT_TIME, &error); if ( !show && !error ) -- cgit v1.2.3 From b347db5dc886676f85d18f6fae5e20324a576afb Mon Sep 17 00:00:00 2001 From: Paul Gevers Date: Fri, 8 Jan 2021 19:44:10 +0100 Subject: upstream git contains the geoclue_layer.xml, but the tar ball does not. xmllint trips on this. =================================================================== Gbp-Pq: Name geocluelayer.xml_not_included.patch --- help/C/index.docbook | 2 -- 1 file changed, 2 deletions(-) diff --git a/help/C/index.docbook b/help/C/index.docbook index d7e8bd3..aade818 100644 --- a/help/C/index.docbook +++ b/help/C/index.docbook @@ -2263,8 +2263,6 @@ This clears the Tracks Area Coverage information, thus no grid colouring will be - -
Coordinate Layer -- cgit v1.2.3 From 97d1495fad41350e5ba8f981f4cba56b5c9303c1 Mon Sep 17 00:00:00 2001 From: Nikolay Korotkiy Date: Tue, 4 Feb 2020 21:12:47 +0000 Subject: [PATCH] Fix build without mapnik Signed-off-by: Rob Norris Gbp-Pq: Name fix_build_without_mapnik.patch --- src/viklayer.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/viklayer.c b/src/viklayer.c index dc0ab1f..3070157 100644 --- a/src/viklayer.c +++ b/src/viklayer.c @@ -36,7 +36,7 @@ extern VikLayerInterface vik_dem_layer_interface; #ifdef HAVE_LIBMAPNIK extern VikLayerInterface vik_mapnik_layer_interface; #endif -#ifdef HAVE_LIBMAPNIK +#ifdef HAVE_LIBGEOCLUE_2 extern VikLayerInterface vik_geoclue_layer_interface; #endif -- cgit v1.2.3 From afa57211cabfbebb2c5b601cfe8f2caf0ae30933 Mon Sep 17 00:00:00 2001 From: Paul Gevers Date: Fri, 8 Jan 2021 19:44:10 +0100 Subject: build-with-gcc-10 Gbp-Pq: Name build-with-gcc-10.patch --- src/babel.h | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/babel.h b/src/babel.h index ae2fa95..e2c18e6 100644 --- a/src/babel.h +++ b/src/babel.h @@ -109,8 +109,8 @@ typedef struct { gchar *label; } BabelFile; -GList *a_babel_file_list; -GList *a_babel_device_list; +extern GList *a_babel_file_list; +extern GList *a_babel_device_list; void a_babel_foreach_file_with_mode (BabelMode mode, GFunc func, gpointer user_data); void a_babel_foreach_file_read_any (GFunc func, gpointer user_data); -- cgit v1.2.3 From 9cc0ad4314586c52b9a9e6de48e6ee0b56612b76 Mon Sep 17 00:00:00 2001 From: Bas Couwenberg Date: Fri, 8 Jan 2021 19:44:10 +0100 Subject: Add support for Mapnik 3.1. Gbp-Pq: Name mapnik-3.1.patch --- src/vikmapniklayer.c | 2 ++ 1 file changed, 2 insertions(+) diff --git a/src/vikmapniklayer.c b/src/vikmapniklayer.c index 83ce142..c709f6a 100644 --- a/src/vikmapniklayer.c +++ b/src/vikmapniklayer.c @@ -219,6 +219,8 @@ static VikLayerParamData plugins_default ( void ) if ( g_file_test ( "/usr/lib/mapnik/input", G_FILE_TEST_EXISTS ) ) data.s = g_strdup ( "/usr/lib/mapnik/input" ); // Current Debian locations + else if ( g_file_test ( "/usr/lib/mapnik/3.1/input", G_FILE_TEST_EXISTS ) ) + data.s = g_strdup ( "/usr/lib/mapnik/3.1/input" ); else if ( g_file_test ( "/usr/lib/mapnik/3.0/input", G_FILE_TEST_EXISTS ) ) data.s = g_strdup ( "/usr/lib/mapnik/3.0/input" ); else if ( g_file_test ( "/usr/lib/mapnik/2.2/input", G_FILE_TEST_EXISTS ) ) -- cgit v1.2.3 From 1b635167944cd779adda31dace52c39d4c1faa24 Mon Sep 17 00:00:00 2001 From: Bernd Zeimetz Date: Sat, 16 Oct 2010 18:57:01 +0200 Subject: [PATCH] disable-po-check Gbp-Pq: Name 0001-disable-po-check.patch --- po/Makefile.in.in | 8 ++------ 1 file changed, 2 insertions(+), 6 deletions(-) diff --git a/po/Makefile.in.in b/po/Makefile.in.in index fcd2c3b..9a494ad 100644 --- a/po/Makefile.in.in +++ b/po/Makefile.in.in @@ -145,12 +145,8 @@ uninstall: rm -f $(DESTDIR)$(localedir)/$$lang/LC_MESSAGES/$(GETTEXT_PACKAGE).mo.m; \ done -check: all $(GETTEXT_PACKAGE).pot - rm -f missing notexist - srcdir=$(srcdir) $(INTLTOOL_UPDATE) -m - if [ -r missing -o -r notexist ]; then \ - exit 1; \ - fi +check: + # do nothing as it messes up with quilt's .pc folder. mostlyclean: rm -f *.pox $(GETTEXT_PACKAGE).pot *.old.po cat-id-tbl.tmp -- cgit v1.2.3 From 49f5a5526525e20c2c22469aafb399e00c7fc29d Mon Sep 17 00:00:00 2001 From: Bernd Zeimetz Date: Sat, 19 Nov 2016 00:15:50 +0100 Subject: fix build on hurd Gbp-Pq: Name fix_build_on_hurd --- src/metatile.h | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/src/metatile.h b/src/metatile.h index 0206133..50d5b0c 100644 --- a/src/metatile.h +++ b/src/metatile.h @@ -26,3 +26,7 @@ int xyz_to_meta(char *path, size_t len, const char *dir, int x, int y, int z); int metatile_read(const char *dir, int x, int y, int z, char *buf, size_t sz, int * compressed, char * log_msg); + +#ifndef PATH_MAX +#define PATH_MAX 4096 +#endif -- cgit v1.2.3 From 17f3ffa9654062b7e71d56db3d127052f316815c Mon Sep 17 00:00:00 2001 From: Paul Gevers Date: Thu, 30 Dec 2021 20:55:58 +0100 Subject: no-doc-dir Gbp-Pq: Name no-doc-dir --- Makefile.am | 2 +- configure.ac | 11 +---------- 2 files changed, 2 insertions(+), 11 deletions(-) diff --git a/Makefile.am b/Makefile.am index e1a9c25..6a6165a 100644 --- a/Makefile.am +++ b/Makefile.am @@ -1,4 +1,4 @@ -SUBDIRS = src test data po windows tools doc +SUBDIRS = src test data po windows tools if !WINDOWS SUBDIRS += help endif diff --git a/configure.ac b/configure.ac index d747cd5..4012179 100644 --- a/configure.ac +++ b/configure.ac @@ -11,13 +11,6 @@ AM_INIT_AUTOMAKE([dist-bzip2 dist-zip subdir-objects]) dnl AC_CONFIG_SRCDIR([src/main.c]) AC_CONFIG_HEADERS([src/config.h]) -# check for gtk-doc -m4_ifdef([GTK_DOC_CHECK], [ -GTK_DOC_CHECK([1.0],[--flavour no-tmpl]) -],[ -AM_CONDITIONAL([ENABLE_GTK_DOC], false) -]) - AC_PROG_CC # Checks for programs. AC_PROG_MAKE_SET @@ -590,9 +583,7 @@ AC_CONFIG_FILES([ windows/installer/Makefile windows/installer/pixmaps/Makefile windows/installer/translations/Makefile - doc/Makefile - doc/reference/Makefile - doc/examples/Makefile]) + ]) AC_OUTPUT -- cgit v1.2.3 From 53936caab33e5258889b902d6a6bd2bd20d69148 Mon Sep 17 00:00:00 2001 From: Bas Couwenberg Date: Thu, 30 Dec 2021 20:55:58 +0100 Subject: Add support for Mapnik 3.1. Gbp-Pq: Name mapnik-3.1.patch --- src/vikmapniklayer.c | 2 ++ 1 file changed, 2 insertions(+) diff --git a/src/vikmapniklayer.c b/src/vikmapniklayer.c index d4a84af..34d4349 100644 --- a/src/vikmapniklayer.c +++ b/src/vikmapniklayer.c @@ -231,6 +231,8 @@ static VikLayerParamData plugins_default ( void ) if ( g_file_test ( "/usr/lib/mapnik/input", G_FILE_TEST_EXISTS ) ) data.s = g_strdup ( "/usr/lib/mapnik/input" ); // Current Debian locations + else if ( g_file_test ( "/usr/lib/mapnik/3.1/input", G_FILE_TEST_EXISTS ) ) + data.s = g_strdup ( "/usr/lib/mapnik/3.1/input" ); else if ( g_file_test ( "/usr/lib/mapnik/3.0/input", G_FILE_TEST_EXISTS ) ) data.s = g_strdup ( "/usr/lib/mapnik/3.0/input" ); else if ( g_file_test ( "/usr/lib/mapnik/2.2/input", G_FILE_TEST_EXISTS ) ) -- cgit v1.2.3 From 55a280d5f60d1ce6c1cc844e1aeedd06cbd2e7a8 Mon Sep 17 00:00:00 2001 From: Bernd Zeimetz Date: Sat, 16 Oct 2010 18:57:01 +0200 Subject: [PATCH] disable-po-check Gbp-Pq: Name 0001-disable-po-check.patch --- po/Makefile.in.in | 8 ++------ 1 file changed, 2 insertions(+), 6 deletions(-) diff --git a/po/Makefile.in.in b/po/Makefile.in.in index fcd2c3b..9a494ad 100644 --- a/po/Makefile.in.in +++ b/po/Makefile.in.in @@ -145,12 +145,8 @@ uninstall: rm -f $(DESTDIR)$(localedir)/$$lang/LC_MESSAGES/$(GETTEXT_PACKAGE).mo.m; \ done -check: all $(GETTEXT_PACKAGE).pot - rm -f missing notexist - srcdir=$(srcdir) $(INTLTOOL_UPDATE) -m - if [ -r missing -o -r notexist ]; then \ - exit 1; \ - fi +check: + # do nothing as it messes up with quilt's .pc folder. mostlyclean: rm -f *.pox $(GETTEXT_PACKAGE).pot *.old.po cat-id-tbl.tmp -- cgit v1.2.3 From 69c1fa11947828374ebaada1234b25356a32edc2 Mon Sep 17 00:00:00 2001 From: Bernd Zeimetz Date: Sat, 19 Nov 2016 00:15:50 +0100 Subject: fix build on hurd Gbp-Pq: Name fix_build_on_hurd --- src/metatile.h | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/src/metatile.h b/src/metatile.h index 0206133..50d5b0c 100644 --- a/src/metatile.h +++ b/src/metatile.h @@ -26,3 +26,7 @@ int xyz_to_meta(char *path, size_t len, const char *dir, int x, int y, int z); int metatile_read(const char *dir, int x, int y, int z, char *buf, size_t sz, int * compressed, char * log_msg); + +#ifndef PATH_MAX +#define PATH_MAX 4096 +#endif -- cgit v1.2.3 From 5d7ec8bd9a081ed85b53da83ed59345f473b4d3a Mon Sep 17 00:00:00 2001 From: Paul Gevers Date: Sun, 2 Jan 2022 08:05:40 +0100 Subject: no-doc-dir Gbp-Pq: Name no-doc-dir --- Makefile.am | 2 +- configure.ac | 11 +---------- 2 files changed, 2 insertions(+), 11 deletions(-) diff --git a/Makefile.am b/Makefile.am index e1a9c25..6a6165a 100644 --- a/Makefile.am +++ b/Makefile.am @@ -1,4 +1,4 @@ -SUBDIRS = src test data po windows tools doc +SUBDIRS = src test data po windows tools if !WINDOWS SUBDIRS += help endif diff --git a/configure.ac b/configure.ac index d747cd5..4012179 100644 --- a/configure.ac +++ b/configure.ac @@ -11,13 +11,6 @@ AM_INIT_AUTOMAKE([dist-bzip2 dist-zip subdir-objects]) dnl AC_CONFIG_SRCDIR([src/main.c]) AC_CONFIG_HEADERS([src/config.h]) -# check for gtk-doc -m4_ifdef([GTK_DOC_CHECK], [ -GTK_DOC_CHECK([1.0],[--flavour no-tmpl]) -],[ -AM_CONDITIONAL([ENABLE_GTK_DOC], false) -]) - AC_PROG_CC # Checks for programs. AC_PROG_MAKE_SET @@ -590,9 +583,7 @@ AC_CONFIG_FILES([ windows/installer/Makefile windows/installer/pixmaps/Makefile windows/installer/translations/Makefile - doc/Makefile - doc/reference/Makefile - doc/examples/Makefile]) + ]) AC_OUTPUT -- cgit v1.2.3 From d81ca997a070195917554c719d422d1ad6cc26f2 Mon Sep 17 00:00:00 2001 From: Bas Couwenberg Date: Sun, 2 Jan 2022 08:05:40 +0100 Subject: Add support for Mapnik 3.1. Gbp-Pq: Name mapnik-3.1.patch --- src/vikmapniklayer.c | 2 ++ 1 file changed, 2 insertions(+) diff --git a/src/vikmapniklayer.c b/src/vikmapniklayer.c index d4a84af..34d4349 100644 --- a/src/vikmapniklayer.c +++ b/src/vikmapniklayer.c @@ -231,6 +231,8 @@ static VikLayerParamData plugins_default ( void ) if ( g_file_test ( "/usr/lib/mapnik/input", G_FILE_TEST_EXISTS ) ) data.s = g_strdup ( "/usr/lib/mapnik/input" ); // Current Debian locations + else if ( g_file_test ( "/usr/lib/mapnik/3.1/input", G_FILE_TEST_EXISTS ) ) + data.s = g_strdup ( "/usr/lib/mapnik/3.1/input" ); else if ( g_file_test ( "/usr/lib/mapnik/3.0/input", G_FILE_TEST_EXISTS ) ) data.s = g_strdup ( "/usr/lib/mapnik/3.0/input" ); else if ( g_file_test ( "/usr/lib/mapnik/2.2/input", G_FILE_TEST_EXISTS ) ) -- cgit v1.2.3 From c843f7f2e1b0b2adb35e10f56563b9c8939ca7a4 Mon Sep 17 00:00:00 2001 From: Paul Gevers Date: Sun, 2 Jan 2022 08:05:40 +0100 Subject: prevent rounding issue on i386 Forwarded: https://sourceforge.net/p/viking/bugs/162/ Gbp-Pq: Name tweak-test-for-i386.patch --- test/check_parse_latlon.sh | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/test/check_parse_latlon.sh b/test/check_parse_latlon.sh index 5ccdc99..736a907 100755 --- a/test/check_parse_latlon.sh +++ b/test/check_parse_latlon.sh @@ -46,7 +46,7 @@ check_success "S34.56 E008.56" "-34.56000 8.56000" # DMM check_success "N 34° 12.3456 W 123° 45.6789" "34.20576 -123.76131" check_success "S 34° 12.3456 E 123° 45.6789" "-34.20576 123.76131" -check_success "S034° 12.3456 W003° 45.6789" "-34.20576 -3.76131" +check_success "S034° 12.3456 W003° 45.6788" "-34.20576 -3.76131" # DMS check_success "S034° 12 34 W003° 45 54" "-34.20944 -3.76500" # Not sure if 'invalid' minute/second values should be accepted -- cgit v1.2.3